"Fossies" - the Fresh Open Source Software Archive  

Source code changes of the file "packages/less/dist/less.min.js.map" between
less.js-4.1.2.tar.gz and less.js-4.1.3.tar.gz

About: Less.js (Leaner CSS) is a CSS preprocessor (extension language) adding features that allow variables, mixins, functions and many other techniques that allow you to make CSS that is more maintainable, themable and extendable.

less.min.js.map  (less.js-4.1.2):less.min.js.map  (less.js-4.1.3)
{"version":3,"file":"less.min.js","sources":["../src/less-browser/utils.js","../ src/less-browser/browser.js","../src/less/logger.js","../src/less/environment/en vironment.js","../src/less/data/colors.js","../src/less/data/unit-conversions.js ","../src/less/data/index.js","../src/less/tree/node.js","../src/less/tree/color .js","../src/less/tree/paren.js","../src/less/tree/combinator.js","../src/less/t ree/element.js","../src/less/constants.js","../node_modules/is-what/dist/index.e sm.js","../node_modules/copy-anything/dist/index.esm.js","../src/less/utils.js", "../src/less/less-error.js","../src/less/tree/selector.js","../src/less/tree/val ue.js","../src/less/tree/keyword.js","../src/less/tree/anonymous.js","../src/les s/tree/declaration.js","../src/less/tree/debug-info.js","../src/less/tree/commen t.js","../src/less/contexts.js","../src/less/functions/function-registry.js",".. /src/less/functions/default.js","../src/less/tree/ruleset.js","../src/less/tree/ atrule.js","../src/less/tree/detached-ruleset.js","../src/less/tree/unit.js",".. /src/less/tree/dimension.js","../src/less/tree/operation.js","../src/less/tree/e xpression.js","../src/less/functions/function-caller.js","../node_modules/tslib/ tslib.es6.js","../src/less/tree/call.js","../src/less/tree/variable.js","../src/ less/tree/property.js","../src/less/tree/attribute.js","../src/less/tree/quoted. js","../src/less/tree/url.js","../src/less/tree/media.js","../src/less/tree/impo rt.js","../src/less/tree/js-eval-node.js","../src/less/tree/javascript.js","../s rc/less/tree/assignment.js","../src/less/tree/condition.js","../src/less/tree/un icode-descriptor.js","../src/less/tree/negative.js","../src/less/tree/extend.js" ,"../src/less/tree/variable-call.js","../src/less/tree/namespace-value.js","../s rc/less/tree/mixin-definition.js","../src/less/tree/mixin-call.js","../src/less/ tree/index.js","../src/less/environment/abstract-file-manager.js","../src/less/e nvironment/abstract-plugin-loader.js","../src/less/visitors/visitor.js","../src/ less/visitors/import-sequencer.js","../src/less/visitors/import-visitor.js","../ src/less/visitors/set-tree-visibility-visitor.js","../src/less/visitors/extend-v isitor.js","../src/less/visitors/join-selector-visitor.js","../src/less/visitors /to-css-visitor.js","../src/less/visitors/index.js","../src/less/parser/parser-i nput.js","../src/less/parser/chunker.js","../src/less/parser/parser.js","../src/ less/functions/boolean.js","../src/less/functions/color.js","../src/less/functio ns/color-blending.js","../src/less/functions/list.js","../src/less/functions/mat h-helper.js","../src/less/functions/math.js","../src/less/functions/number.js"," ../src/less/functions/string.js","../src/less/functions/types.js","../src/less/f unctions/index.js","../src/less/functions/data-uri.js","../src/less/functions/sv g.js","../src/less/transform-tree.js","../src/less/plugin-manager.js","../node_m odules/parse-node-version/index.js","../src/less-browser/file-manager.js","../sr c/less/index.js","../src/less/parse-tree.js","../src/less/source-map-builder.js" ,"../src/less/source-map-output.js","../src/less/import-manager.js","../src/less /render.js","../src/less/parse.js","../src/less-browser/plugin-loader.js","../sr c/less-browser/error-reporting.js","../src/less-browser/bootstrap.js","../src/le ss/default-options.js","../src/less-browser/add-default-options.js","../src/less -browser/index.js","../src/less-browser/log-listener.js","../src/less-browser/ca che.js","../src/less-browser/image-size.js"],"sourcesContent":["\nexport functio n extractId(href) {\n return href.replace(/^[a-z-]+:\\/+?[^\\/]+/, '') // Re move protocol & domain\n .replace(/[\\?\\&]livereload=\\w+/, '') / / Remove LiveReload cachebuster\n .replace(/^\\//, '') // Remove root /\n .replace(/\\.[a-zA-Z]+$/, '') // Remove simple extension\n .replace(/[^\\.\\w-]+/g, '-') / / Replace illegal characters\n .replace(/\\./g, ':'); // Replace dots with colons(for valid id)\n}\n\nexport function addDataAttr(o ptions, tag) {\n for (const opt in tag.dataset) {\n if (tag.dataset.ha sOwnProperty(opt)) {\n if (opt === 'env' || opt === 'dumpLineNumbers' || opt === 'rootpath' || opt === 'errorReporting') {\n options[o pt] = tag.dataset[opt];\n } else {\n try {\n options[opt] = JSON.parse(tag.dataset[opt]);\n }\n catch (_) {}\n }\n }\n }\n}\n","import * as util s from './utils';\n\nexport default {\n createCSS: function (document, styles , sheet) {\n // Strip the query-string\n const href = sheet.href | | '';\n\n // If there is no title set, use the filename, minus the extens ion\n const id = `less:${sheet.title || utils.extractId(href)}`;\n\n // If this has already been inserted into the DOM, we may need to replace it\ n const oldStyleNode = document.getElementById(id);\n let keepOldS tyleNode = false;\n\n // Create a new stylesheet node for insertion or (i f necessary) replacement\n const styleNode = document.createElement('styl e');\n styleNode.setAttribute('type', 'text/css');\n if (sheet.med ia) {\n styleNode.setAttribute('media', sheet.media);\n }\n styleNode.id = id;\n\n if (!styleNode.styleSheet) {\n sty leNode.appendChild(document.createTextNode(styles));\n\n // If new co ntents match contents of oldStyleNode, don't replace oldStyleNode\n k eepOldStyleNode = (oldStyleNode !== null && oldStyleNode.childNodes.length > 0 & & styleNode.childNodes.length > 0 &&\n oldStyleNode.firstChild.no deValue === styleNode.firstChild.nodeValue);\n }\n\n const head = document.getElementsByTagName('head')[0];\n\n // If there is no oldStyleN ode, just append; otherwise, only append if we need\n // to replace oldSt yleNode with an updated stylesheet\n if (oldStyleNode === null || keepOld StyleNode === false) {\n const nextEl = sheet && sheet.nextSibling || null;\n if (nextEl) {\n nextEl.parentNode.insertBefor e(styleNode, nextEl);\n } else {\n head.appendChild(st yleNode);\n }\n }\n if (oldStyleNode && keepOldStyleNod e === false) {\n oldStyleNode.parentNode.removeChild(oldStyleNode);\n }\n\n // For IE.\n // This needs to happen *after* the sty le element is added to the DOM, otherwise IE 7 and 8 may crash.\n // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed 32/internet-explorer-crashes-appending-style-element-to-head\n if (styleN ode.styleSheet) {\n try {\n styleNode.styleSheet.cssTe xt = styles;\n } catch (e) {\n throw new Error('Couldn \\'t reassign styleSheet.cssText.');\n }\n }\n },\n curr entScript: function(window) {\n const document = window.document;\n return document.currentScript || (() => {\n const scripts = documen t.getElementsByTagName('script');\n return scripts[scripts.length - 1 ];\n })();\n }\n};\n","export default {\n error: function(msg) {\n this._fireEvent('error', msg);\n },\n warn: function(msg) {\n this._fireEvent('warn', msg);\n },\n info: function(msg) {\n this ._fireEvent('info', msg);\n },\n debug: function(msg) {\n this._fir eEvent('debug', msg);\n },\n addListener: function(listener) {\n th is._listeners.push(listener);\n },\n removeListener: function(listener) {\ n for (let i = 0; i < this._listeners.length; i++) {\n if (thi s._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n },\n _fireEvent: funct ion(type, msg) {\n for (let i = 0; i < this._listeners.length; i++) {\n const logFunction = this._listeners[i][type];\n if (logFunc tion) {\n logFunction(msg);\n }\n }\n },\n _listeners: []\n};\n","/**\n * @todo Document why this abstraction exists, and the relationship between\n * environment, file managers, and plugin manag er\n */\n\nimport logger from '../logger';\n\nclass Environment {\n construct or(externalEnvironment, fileManagers) {\n this.fileManagers = fileManager s || [];\n externalEnvironment = externalEnvironment || {};\n\n co nst optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSour ceMapGenerator'];\n const requiredFunctions = [];\n const function s = requiredFunctions.concat(optionalFunctions);\n\n for (let i = 0; i < functions.length; i++) {\n const propName = functions[i];\n const environmentFunc = externalEnvironment[propName];\n if (enviro nmentFunc) {\n this[propName] = environmentFunc.bind(externalEnvi ronment);\n } else if (i < requiredFunctions.length) {\n this.warn(`missing required function in environment - ${propName}`);\n }\n }\n }\n\n getFileManager(filename, currentDirectory, optio ns, environment, isSync) {\n\n if (!filename) {\n logger.warn( 'getFileManager called with no filename.. Please report this issue. continuing.' );\n }\n if (currentDirectory == null) {\n logger.warn( 'getFileManager called with null directory.. Please report this issue. continuin g.');\n }\n\n let fileManagers = this.fileManagers;\n if (o ptions.pluginManager) {\n fileManagers = [].concat(fileManagers).conc at(options.pluginManager.getFileManagers());\n }\n for (let i = fi leManagers.length - 1; i >= 0 ; i--) {\n const fileManager = fileMana gers[i];\n if (fileManager[isSync ? 'supportsSync' : 'supports'](file name, currentDirectory, options, environment)) {\n return fileMan ager;\n }\n }\n return null;\n }\n\n addFileManag er(fileManager) {\n this.fileManagers.push(fileManager);\n }\n\n cl earFileManagers() {\n this.fileManagers = [];\n }\n}\n\nexport default Environment;\n","export default {\n 'aliceblue':'#f0f8ff',\n 'antiquewhit e':'#faebd7',\n 'aqua':'#00ffff',\n 'aquamarine':'#7fffd4',\n 'azure':' #f0ffff',\n 'beige':'#f5f5dc',\n 'bisque':'#ffe4c4',\n 'black':'#000000 ',\n 'blanchedalmond':'#ffebcd',\n 'blue':'#0000ff',\n 'blueviolet':'#8 a2be2',\n 'brown':'#a52a2a',\n 'burlywood':'#deb887',\n 'cadetblue':'#5 f9ea0',\n 'chartreuse':'#7fff00',\n 'chocolate':'#d2691e',\n 'coral':'# ff7f50',\n 'cornflowerblue':'#6495ed',\n 'cornsilk':'#fff8dc',\n 'crims on':'#dc143c',\n 'cyan':'#00ffff',\n 'darkblue':'#00008b',\n 'darkcyan' :'#008b8b',\n 'darkgoldenrod':'#b8860b',\n 'darkgray':'#a9a9a9',\n 'dar kgrey':'#a9a9a9',\n 'darkgreen':'#006400',\n 'darkkhaki':'#bdb76b',\n ' darkmagenta':'#8b008b',\n 'darkolivegreen':'#556b2f',\n 'darkorange':'#ff8 c00',\n 'darkorchid':'#9932cc',\n 'darkred':'#8b0000',\n 'darksalmon':' #e9967a',\n 'darkseagreen':'#8fbc8f',\n 'darkslateblue':'#483d8b',\n 'd arkslategray':'#2f4f4f',\n 'darkslategrey':'#2f4f4f',\n 'darkturquoise':'# 00ced1',\n 'darkviolet':'#9400d3',\n 'deeppink':'#ff1493',\n 'deepskybl ue':'#00bfff',\n 'dimgray':'#696969',\n 'dimgrey':'#696969',\n 'dodgerb lue':'#1e90ff',\n 'firebrick':'#b22222',\n 'floralwhite':'#fffaf0',\n ' forestgreen':'#228b22',\n 'fuchsia':'#ff00ff',\n 'gainsboro':'#dcdcdc',\n 'ghostwhite':'#f8f8ff',\n 'gold':'#ffd700',\n 'goldenrod':'#daa520',\n 'gray':'#808080',\n 'grey':'#808080',\n 'green':'#008000',\n 'greeny ellow':'#adff2f',\n 'honeydew':'#f0fff0',\n 'hotpink':'#ff69b4',\n 'ind ianred':'#cd5c5c',\n 'indigo':'#4b0082',\n 'ivory':'#fffff0',\n 'khaki' :'#f0e68c',\n 'lavender':'#e6e6fa',\n 'lavenderblush':'#fff0f5',\n 'law ngreen':'#7cfc00',\n 'lemonchiffon':'#fffacd',\n 'lightblue':'#add8e6',\n 'lightcoral':'#f08080',\n 'lightcyan':'#e0ffff',\n 'lightgoldenrodyello w':'#fafad2',\n 'lightgray':'#d3d3d3',\n 'lightgrey':'#d3d3d3',\n 'ligh tgreen':'#90ee90',\n 'lightpink':'#ffb6c1',\n 'lightsalmon':'#ffa07a',\n 'lightseagreen':'#20b2aa',\n 'lightskyblue':'#87cefa',\n 'lightslategray ':'#778899',\n 'lightslategrey':'#778899',\n 'lightsteelblue':'#b0c4de',\n 'lightyellow':'#ffffe0',\n 'lime':'#00ff00',\n 'limegreen':'#32cd32',\ n 'linen':'#faf0e6',\n 'magenta':'#ff00ff',\n 'maroon':'#800000',\n 'mediumaquamarine':'#66cdaa',\n 'mediumblue':'#0000cd',\n 'mediumorchid':' #ba55d3',\n 'mediumpurple':'#9370d8',\n 'mediumseagreen':'#3cb371',\n ' mediumslateblue':'#7b68ee',\n 'mediumspringgreen':'#00fa9a',\n 'mediumturq uoise':'#48d1cc',\n 'mediumvioletred':'#c71585',\n 'midnightblue':'#191970 ',\n 'mintcream':'#f5fffa',\n 'mistyrose':'#ffe4e1',\n 'moccasin':'#ffe 4b5',\n 'navajowhite':'#ffdead',\n 'navy':'#000080',\n 'oldlace':'#fdf5 e6',\n 'olive':'#808000',\n 'olivedrab':'#6b8e23',\n 'orange':'#ffa500' ,\n 'orangered':'#ff4500',\n 'orchid':'#da70d6',\n 'palegoldenrod':'#ee e8aa',\n 'palegreen':'#98fb98',\n 'paleturquoise':'#afeeee',\n 'palevio letred':'#d87093',\n 'papayawhip':'#ffefd5',\n 'peachpuff':'#ffdab9',\n 'peru':'#cd853f',\n 'pink':'#ffc0cb',\n 'plum':'#dda0dd',\n 'powderblu e':'#b0e0e6',\n 'purple':'#800080',\n 'rebeccapurple':'#663399',\n 'red ':'#ff0000',\n 'rosybrown':'#bc8f8f',\n 'royalblue':'#4169e1',\n 'saddl ebrown':'#8b4513',\n 'salmon':'#fa8072',\n 'sandybrown':'#f4a460',\n 's eagreen':'#2e8b57',\n 'seashell':'#fff5ee',\n 'sienna':'#a0522d',\n 'si lver':'#c0c0c0',\n 'skyblue':'#87ceeb',\n 'slateblue':'#6a5acd',\n 'sla tegray':'#708090',\n 'slategrey':'#708090',\n 'snow':'#fffafa',\n 'spri nggreen':'#00ff7f',\n 'steelblue':'#4682b4',\n 'tan':'#d2b48c',\n 'teal ':'#008080',\n 'thistle':'#d8bfd8',\n 'tomato':'#ff6347',\n 'turquoise' :'#40e0d0',\n 'violet':'#ee82ee',\n 'wheat':'#f5deb3',\n 'white':'#ffff ff',\n 'whitesmoke':'#f5f5f5',\n 'yellow':'#ffff00',\n 'yellowgreen':'# 9acd32'\n};","export default {\n length: {\n 'm': 1,\n 'cm': 0. 01,\n 'mm': 0.001,\n 'in': 0.0254,\n 'px': 0.0254 / 96,\n 'pt': 0.0254 / 72,\n 'pc': 0.0254 / 72 * 12\n },\n duration: {\n 's': 1,\n 'ms': 0.001\n },\n angle: {\n 'rad': 1 / (2 * Math.PI),\n 'deg': 1 / 360,\n 'grad': 1 / 400,\n 'tu rn': 1\n }\n};","import colors from './colors';\nimport unitConversions from './unit-conversions';\n\nexport default { colors, unitConversions };\n","/**\n * The reason why Node is a class and other nodes simply do not extend\n * from No de (since we're transpiling) is due to this issue:\n * \n * https://github.com/l ess/less.js/issues/3434\n */\nclass Node {\n constructor() {\n this.pa rent = null;\n this.visibilityBlocks = undefined;\n this.nodeVisib le = undefined;\n this.rootNode = null;\n this.parsed = null;\n }\n\n get currentFileInfo() {\n return this.fileInfo();\n }\n\n get index() {\n return this.getIndex();\n }\n\n setParent(nodes, p arent) {\n function set(node) {\n if (node && node instanceof Node) {\n node.parent = parent;\n }\n }\n if (Array.isArray(nodes)) {\n nodes.forEach(set);\n }\n else {\n set(nodes);\n }\n }\n\n getIndex() {\n return this._index || (this.parent && this.parent.getIndex()) || 0;\n }\n\n fileInfo() {\n return this._fileInfo || (this.parent && this.parent.f ileInfo()) || {};\n }\n\n isRulesetLike() { return false; }\n\n toCSS(c ontext) {\n const strs = [];\n this.genCSS(context, {\n add: function(chunk, fileInfo, index) {\n strs.push(chunk);\n },\n isEmpty: function () {\n return strs.len gth === 0;\n }\n });\n return strs.join('');\n }\n\n genCSS(context, output) {\n output.add(this.value);\n }\n\n acc ept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n ev al() { return this; }\n\n _operate(context, op, a, b) {\n switch (op) {\n case '+': return a + b;\n case '-': return a - b;\n case '*': return a * b;\n case '/': return a / b;\n } \n }\n\n fround(context, value) {\n const precision = context && co ntext.numPrecision;\n // add \"epsilon\" to ensure numbers like 1.0000000 05 (represented as 1.000000004999...) are properly rounded:\n return (pre cision) ? Number((value + 2e-16).toFixed(precision)) : value;\n }\n\n stat ic compare(a, b) {\n /* returns:\n -1: a < b\n 0: a = b\n 1: a > b\n and *any* other value for a != b (e.g. undefined, Na N, -2 etc.) */\n\n if ((a.compare) &&\n // for \"symmetric res ults\" force toCSS-based comparison\n // of Quoted or Anonymous if ei ther value is one of those\n !(b.type === 'Quoted' || b.type === 'Ano nymous')) {\n return a.compare(b);\n } else if (b.compare) {\n return -b.compare(a);\n } else if (a.type !== b.type) {\n return undefined;\n }\n\n a = a.value;\n b = b.valu e;\n if (!Array.isArray(a)) {\n return a === b ? 0 : undefined ;\n }\n if (a.length !== b.length) {\n return undefined ;\n }\n for (let i = 0; i < a.length; i++) {\n if (Node .compare(a[i], b[i]) !== 0) {\n return undefined;\n }\ n }\n return 0;\n }\n\n static numericCompare(a, b) {\n return a < b ? -1\n : a === b ? 0\n : a > b ? 1 : undefined;\n }\n\n // Returns true if this node represents root of as t imported by reference\n blocksVisibility() {\n if (this.visibilityBl ocks == null) {\n this.visibilityBlocks = 0;\n }\n retu rn this.visibilityBlocks !== 0;\n }\n\n addVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks + 1;\n }\n\n removeVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this .visibilityBlocks - 1;\n }\n\n // Turns on node visibility - if called nod e will be shown in output regardless\n // of whether it comes from import by reference or not\n ensureVisibility() {\n this.nodeVisible = true;\n }\n\n // Turns off node visibility - if called node will NOT be shown in ou tput regardless\n // of whether it comes from import by reference or not\n ensureInvisibility() {\n this.nodeVisible = false;\n }\n\n // retu rn values:\n // false - the node must not be visible\n // true - the node must be visible\n // undefined or null - the node has the same visibility as its parent\n isVisible() {\n return this.nodeVisible;\n }\n\n vi sibilityInfo() {\n return {\n visibilityBlocks: this.visibilit yBlocks,\n nodeVisible: this.nodeVisible\n };\n }\n\n co pyVisibilityInfo(info) {\n if (!info) {\n return;\n }\n this.visibilityBlocks = info.visibilityBlocks;\n this.nodeVisible = info.nodeVisible;\n }\n}\n\nexport default Node;\n","import Node from './n ode';\nimport colors from '../data/colors';\n\n//\n// RGB Colors - #ff0014, #eee \n//\nconst Color = function(rgb, a, originalForm) {\n const self = this;\n //\n // The end goal here, is to parse the arguments\n // into an intege r triplet, such as `128, 255, 0`\n //\n // This facilitates operations and conversions.\n //\n if (Array.isArray(rgb)) {\n this.rgb = rgb;\n } else if (rgb.length >= 6) {\n this.rgb = [];\n rgb.match(/.{2 }/g).map(function (c, i) {\n if (i < 3) {\n self.rgb.p ush(parseInt(c, 16));\n } else {\n self.alpha = (parse Int(c, 16)) / 255;\n }\n });\n } else {\n this.rgb = [];\n rgb.split('').map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c + c, 16));\n } else {\n self.alpha = (parseInt(c + c, 16)) / 255;\n }\n });\n }\n this.alpha = this.alpha || (typeof a === 'number' ? a : 1);\n if (t ypeof originalForm !== 'undefined') {\n this.value = originalForm;\n } \n}\n\nColor.prototype = Object.assign(new Node(), {\n type: 'Color',\n\n luma() {\n let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb [2] / 255;\n\n r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1 .055), 2.4);\n g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1 .055), 2.4);\n b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1 .055), 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n },\ n\n toCSS(context, doNotCompress) {\n const compress = context && cont ext.compress && !doNotCompress;\n let color;\n let alpha;\n let colorFunction;\n let args = [];\n\n // `value` is set if this color was originally\n // converted from a named color string so we need \n // to respect this and try to output named color too.\n alpha = this.fround(context, this.alpha);\n\n if (this.value) {\n if (this.value.indexOf('rgb') === 0) {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n } else if (th is.value.indexOf('hsl') === 0) {\n if (alpha < 1) {\n colorFunction = 'hsla';\n } else {\n c olorFunction = 'hsl';\n }\n } else {\n return this.value;\n }\n } else {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n }\n\n switch (colorFunction) {\n case 'rgba':\n args = this. rgb.map(function (c) {\n return clamp(Math.round(c), 255);\n }).concat(clamp(alpha, 1));\n break;\n case 'hsla':\n args.push(clamp(alpha, 1));\n case 'hsl ':\n color = this.toHSL();\n args = [\n this.fround(context, color.h),\n `${this.fround(cont ext, color.s * 100)}%`,\n `${this.fround(context, color.l * 1 00)}%`\n ].concat(args);\n }\n\n if (colorFunction) {\n // Values are capped between `0` and `255`, rounded and zero-pad ded.\n return `${colorFunction}(${args.join(`,${compress ? '' : ' '}` )})`;\n }\n\n color = this.toRGB();\n\n if (compress) {\n const splitcolor = color.split('');\n\n // Convert color to short format\n if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {\n color = `#${splitcolor[1]}${splitcolor[3]}${splitcolor[5]}`;\n }\n }\ n\n return color;\n },\n\n //\n // Operations have to be done pe r-channel, if not,\n // channels will spill onto each other. Once we have\n // our result, in the form of an integer triplet,\n // we create a new Colo r node to hold the result.\n //\n operate(context, op, other) {\n c onst rgb = new Array(3);\n const alpha = this.alpha * (1 - other.alpha) + other.alpha;\n for (let c = 0; c < 3; c++) {\n rgb[c] = this. _operate(context, op, this.rgb[c], other.rgb[c]);\n }\n return new Color(rgb, alpha);\n },\n\n toRGB() {\n return toHex(this.rgb);\n },\n\n toHSL() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 2 55, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const l = (max + min) / 2;\n const d = max - min;\n\n if (max === min) {\n h = s = 0;\n } else {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, l, a };\n },\n\n // Adapted from http://mjijackson.com/20 08/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\ n toHSV() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const v = max;\n\ n const d = max - min;\n if (max === 0) {\n s = 0;\n } else {\n s = d / max;\n }\n\n if (max === min) { \n h = 0;\n } else {\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\ n }\n h /= 6;\n }\n return { h: h * 360, s, v, a };\n },\n\n toARGB() {\n return toHex([this.alpha * 255].conca t(this.rgb));\n },\n\n compare(x) {\n return (x.rgb &&\n x.rgb[0] === this.rgb[0] &&\n x.rgb[1] === this.rgb[1] &&\n x.rgb[2] === this.rgb[2] &&\n x.alpha === this.alpha) ? 0 : undef ined;\n }\n});\n\nColor.fromKeyword = function(keyword) {\n let c;\n co nst key = keyword.toLowerCase();\n if (colors.hasOwnProperty(key)) {\n c = new Color(colors[key].slice(1));\n }\n else if (key === 'transparent' ) {\n c = new Color([0, 0, 0], 0);\n }\n\n if (c) {\n c.valu e = keyword;\n return c;\n }\n};\n\nfunction clamp(v, max) {\n retu rn Math.min(Math.max(v, 0), max);\n}\n\nfunction toHex(v) {\n return `#${v.ma p(function (c) {\n c = clamp(Math.round(c), 255);\n return (c < 16 ? '0' : '') + c.toString(16);\n }).join('')}`;\n}\n\nexport default Color;\n ","import Node from './node';\n\nconst Paren = function(node) {\n this.value = node;\n};\n\nParen.prototype = Object.assign(new Node(), {\n type: 'Paren', \n\n genCSS(context, output) {\n output.add('(');\n this.value. genCSS(context, output);\n output.add(')');\n },\n\n eval(context) {\n return new Paren(this.value.eval(context));\n }\n});\n\nexport def ault Paren;\n","import Node from './node';\nconst _noSpaceCombinators = {\n ' ': true,\n ' ': true,\n '|': true\n};\n\nconst Combinator = function(value ) {\n if (value === ' ') {\n this.value = ' ';\n this.emptyOrWh itespace = true;\n } else {\n this.value = value ? value.trim() : '';\ n this.emptyOrWhitespace = this.value === '';\n }\n}\n\nCombinator.pro totype = Object.assign(new Node(), {\n type: 'Combinator',\n\n genCSS(cont ext, output) {\n const spaceOrEmpty = (context.compress || _noSpaceCombin ators[this.value]) ? '' : ' ';\n output.add(spaceOrEmpty + this.value + s paceOrEmpty);\n }\n});\n\nexport default Combinator;\n","import Node from './ node';\nimport Paren from './paren';\nimport Combinator from './combinator';\n\n const Element = function(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {\n this.combinator = combinator instanceof Combinator ?\n combinator : new Combinator(combinator);\n\n if (typeof value === 'strin g') {\n this.value = value.trim();\n } else if (value) {\n this .value = value;\n } else {\n this.value = '';\n }\n this.isVaria ble = isVariable;\n this._index = index;\n this._fileInfo = currentFileInf o;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.combin ator, this);\n}\n\nElement.prototype = Object.assign(new Node(), {\n type: 'E lement',\n\n accept(visitor) {\n const value = this.value;\n th is.combinator = visitor.visit(this.combinator);\n if (typeof value === 'o bject') {\n this.value = visitor.visit(value);\n }\n },\n\n eval(context) {\n return new Element(this.combinator,\n th is.value.eval ? this.value.eval(context) : this.value,\n this.isVaria ble,\n this.getIndex(),\n this.fileInfo(), this.visibility Info());\n },\n\n clone() {\n return new Element(this.combinator,\n this.value,\n this.isVariable,\n this.getIndex (),\n this.fileInfo(), this.visibilityInfo());\n },\n\n genCSS( context, output) {\n output.add(this.toCSS(context), this.fileInfo(), thi s.getIndex());\n },\n\n toCSS(context) {\n context = context || {}; \n let value = this.value;\n const firstSelector = context.firstSe lector;\n if (value instanceof Paren) {\n // selector in paren s should not be affected by outer selector\n // flags (breaks only in terpolated selectors - see #1973)\n context.firstSelector = true;\n }\n value = value.toCSS ? value.toCSS(context) : value;\n co ntext.firstSelector = firstSelector;\n if (value === '' && this.combinato r.value.charAt(0) === '&') {\n return '';\n } else {\n return this.combinator.toCSS(context) + value;\n }\n }\n});\n\nexp ort default Element;\n","\nexport const Math = {\n ALWAYS: 0,\n PARENS_DIV ISION: 1,\n PARENS: 2\n // removed - STRICT_LEGACY: 3\n};\n\nexport const RewriteUrls = {\n OFF: 0,\n LOCAL: 1,\n ALL: 2\n};","/**\r\n * Returns the object type of the given payload\r\n *\r\n * @param {*} payload\r\n * @retur ns {string}\r\n */\r\nfunction getType(payload) {\r\n return Object.prototype .toString.call(payload).slice(8, -1);\r\n}\r\n/**\r\n * Returns whether the payl oad is undefined\r\n *\r\n * @param {*} payload\r\n * @returns {payload is undef ined}\r\n */\r\nfunction isUndefined(payload) {\r\n return getType(payload) = == 'Undefined';\r\n}\r\n/**\r\n * Returns whether the payload is null\r\n *\r\n * @param {*} payload\r\n * @returns {payload is null}\r\n */\r\nfunction isNull( payload) {\r\n return getType(payload) === 'Null';\r\n}\r\n/**\r\n * Returns whether the payload is a plain JavaScript object (excluding special classes or o bjects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {pay load is Record<string, any>}\r\n */\r\nfunction isPlainObject(payload) {\r\n if (getType(payload) !== 'Object')\r\n return false;\r\n return payloa d.constructor === Object && Object.getPrototypeOf(payload) === Object.prototype; \r\n}\r\n/**\r\n * Returns whether the payload is a plain JavaScript object (exc luding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Record<string, any>}\r\n */\r\nfunction isObj ect(payload) {\r\n return isPlainObject(payload);\r\n}\r\n/**\r\n * Returns w hether the payload is a an empty object (excluding special classes or objects wi th other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is { [K in any]: never }}\r\n */\r\nfunction isEmptyObject(payload) {\r\n return isPlainObject(payload) && Object.keys(payload).length === 0;\r\n}\r\n/**\r\n * R eturns whether the payload is an any kind of object (including special classes o r objects with different prototypes)\r\n *\r\n * @param {*} payload\r\n * @retur ns {payload is Record<string, any>}\r\n */\r\nfunction isAnyObject(payload) {\r\ n return getType(payload) === 'Object';\r\n}\r\n/**\r\n * Returns whether the payload is an object like a type passed in < >\r\n *\r\n * Usage: isObjectLike< {id: any}>(payload) // will make sure it's an object and has an `id` prop.\r\n * \r\n * @template T this must be passed in < >\r\n * @param {*} payload\r\n * @re turns {payload is T}\r\n */\r\nfunction isObjectLike(payload) {\r\n return is AnyObject(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a function (regular or async)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Any Function}\r\n */\r\nfunction isFunction(payload) {\r\n return typeof payload === \"function\";\r\n}\r\n/**\r\n * Returns whether the payload is an array\r\n *\r\n * @param {any} payload\r\n * @returns {payload is any[]}\r\n */\r\nfunctio n isArray(payload) {\r\n return getType(payload) === 'Array';\r\n}\r\n/**\r\n * Returns whether the payload is a an array with at least 1 item\r\n *\r\n * @p aram {*} payload\r\n * @returns {payload is any[]}\r\n */\r\nfunction isFullArra y(payload) {\r\n return isArray(payload) && payload.length > 0;\r\n}\r\n/**\r \n * Returns whether the payload is a an empty array\r\n *\r\n * @param {*} payl oad\r\n * @returns {payload is []}\r\n */\r\nfunction isEmptyArray(payload) {\r\ n return isArray(payload) && payload.length === 0;\r\n}\r\n/**\r\n * Returns whether the payload is a string\r\n *\r\n * @param {*} payload\r\n * @returns {p ayload is string}\r\n */\r\nfunction isString(payload) {\r\n return getType(p ayload) === 'String';\r\n}\r\n/**\r\n * Returns whether the payload is a string, BUT returns false for ''\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isFullString(payload) {\r\n return isString(pa yload) && payload !== '';\r\n}\r\n/**\r\n * Returns whether the payload is ''\r\ n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfuncti on isEmptyString(payload) {\r\n return payload === '';\r\n}\r\n/**\r\n * Retu rns whether the payload is a number (but not NaN)\r\n *\r\n * This will return ` false` for `NaN`!!\r\n *\r\n * @param {*} payload\r\n * @returns {payload is num ber}\r\n */\r\nfunction isNumber(payload) {\r\n return getType(payload) === ' Number' && !isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a b oolean\r\n *\r\n * @param {*} payload\r\n * @returns {payload is boolean}\r\n */ \r\nfunction isBoolean(payload) {\r\n return getType(payload) === 'Boolean';\ r\n}\r\n/**\r\n * Returns whether the payload is a regular expression (RegExp)\r \n *\r\n * @param {*} payload\r\n * @returns {payload is RegExp}\r\n */\r\nfunct ion isRegExp(payload) {\r\n return getType(payload) === 'RegExp';\r\n}\r\n/** \r\n * Returns whether the payload is a Map\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Map<any, any>}\r\n */\r\nfunction isMap(payload) {\r\n return getType(payload) === 'Map';\r\n}\r\n/**\r\n * Returns whether the payload is a WeakMap\r\n *\r\n * @param {*} payload\r\n * @returns {payload is WeakMap< any, any>}\r\n */\r\nfunction isWeakMap(payload) {\r\n return getType(payload ) === 'WeakMap';\r\n}\r\n/**\r\n * Returns whether the payload is a Set\r\n *\r\ n * @param {*} payload\r\n * @returns {payload is Set<any>}\r\n */\r\nfunction i sSet(payload) {\r\n return getType(payload) === 'Set';\r\n}\r\n/**\r\n * Retu rns whether the payload is a WeakSet\r\n *\r\n * @param {*} payload\r\n * @retur ns {payload is WeakSet<any>}\r\n */\r\nfunction isWeakSet(payload) {\r\n retu rn getType(payload) === 'WeakSet';\r\n}\r\n/**\r\n * Returns whether the payload is a Symbol\r\n *\r\n * @param {*} payload\r\n * @returns {payload is symbol}\r \n */\r\nfunction isSymbol(payload) {\r\n return getType(payload) === 'Symbol ';\r\n}\r\n/**\r\n * Returns whether the payload is a Date, and that the date is valid\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Date}\r\n */\r\ nfunction isDate(payload) {\r\n return getType(payload) === 'Date' && !isNaN( payload);\r\n}\r\n/**\r\n * Returns whether the payload is a Blob\r\n *\r\n * @p aram {*} payload\r\n * @returns {payload is Blob}\r\n */\r\nfunction isBlob(payl oad) {\r\n return getType(payload) === 'Blob';\r\n}\r\n/**\r\n * Returns whet her the payload is a File\r\n *\r\n * @param {*} payload\r\n * @returns {payload is File}\r\n */\r\nfunction isFile(payload) {\r\n return getType(payload) == = 'File';\r\n}\r\n/**\r\n * Returns whether the payload is a Promise\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Promise<any>}\r\n */\r\nfunction isPromise(payload) {\r\n return getType(payload) === 'Promise';\r\n}\r\n/**\r \n * Returns whether the payload is an Error\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Error}\r\n */\r\nfunction isError(payload) {\r\n retur n getType(payload) === 'Error';\r\n}\r\n/**\r\n * Returns whether the payload is literally the value `NaN` (it's `NaN` and also a `number`)\r\n *\r\n * @param { *} payload\r\n * @returns {payload is typeof NaN}\r\n */\r\nfunction isNaNValue( payload) {\r\n return getType(payload) === 'Number' && isNaN(payload);\r\n}\r \n/**\r\n * Returns whether the payload is a primitive type (eg. Boolean | Null | Undefined | Number | String | Symbol)\r\n *\r\n * @param {*} payload\r\n * @re turns {(payload is boolean | null | undefined | number | string | symbol)}\r\n * /\r\nfunction isPrimitive(payload) {\r\n return (isBoolean(payload) ||\r\n isNull(payload) ||\r\n isUndefined(payload) ||\r\n isNumber(p ayload) ||\r\n isString(payload) ||\r\n isSymbol(payload));\r\n}\r \n/**\r\n * Returns true whether the payload is null or undefined\r\n *\r\n * @p aram {*} payload\r\n * @returns {(payload is null | undefined)}\r\n */\r\nfuncti on isNullOrUndefined(payload) {\r\n return isNull(payload) || isUndefined(pay load);\r\n}\r\n/**\r\n * Does a generic check to check that the given payload is of a given type.\r\n * In cases like Number, it will return true for NaN as NaN is a Number (thanks javascript!);\r\n * It will, however, differentiate between object and null\r\n *\r\n * @template T\r\n * @param {*} payload\r\n * @param { T} type\r\n * @throws {TypeError} Will throw type error if type is an invalid ty pe\r\n * @returns {payload is T}\r\n */\r\nfunction isType(payload, type) {\r\n if (!(type instanceof Function)) {\r\n throw new TypeError('Type must be a function');\r\n }\r\n if (!Object.prototype.hasOwnProperty.call(type, 'prototype')) {\r\n throw new TypeError('Type is not a class');\r\n } \r\n // Classes usually have names (as functions usually have names)\r\n v ar name = type.name;\r\n return getType(payload) === name || Boolean(payload && payload.constructor === type);\r\n}\n\nexport { getType, isAnyObject, isArray , isBlob, isBoolean, isDate, isEmptyArray, isEmptyObject, isEmptyString, isError , isFile, isFullArray, isFullString, isFunction, isMap, isNaNValue, isNull, isNu llOrUndefined, isNumber, isObject, isObjectLike, isPlainObject, isPrimitive, isP romise, isRegExp, isSet, isString, isSymbol, isType, isUndefined, isWeakMap, isW eakSet };\n","import { isArray, isPlainObject } from 'is-what';\n\n/*! ********* ********************************************************************\r\nCopyrigh t (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache L icense, Version 2.0 (the \"License\"); you may not use\r\nthis file except in co mpliance with the License. You may obtain a copy of the\r\nLicense at http://www .apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASI S, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, I NCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FI TNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSe e the Apache Version 2.0 License for specific language governing permissions\r\n and limitations under the License.\r\n****************************************** *********************************** */\r\n\r\nfunction __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].le ngth;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (v ar a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\n\nfunction assignProp(carry, key, newVal, origin alObject, includeNonenumerable) {\r\n var propType = {}.propertyIsEnumerable. call(originalObject, key)\r\n ? 'enumerable'\r\n : 'nonenumerable' ;\r\n if (propType === 'enumerable')\r\n carry[key] = newVal;\r\n i f (includeNonenumerable && propType === 'nonenumerable') {\r\n Object.def ineProperty(carry, key, {\r\n value: newVal,\r\n enumerabl e: false,\r\n writable: true,\r\n configurable: true,\r\n });\r\n }\r\n}\r\n/**\r\n * Copy (clone) an object and all its props r ecursively to get rid of any prop referenced of the original object. Arrays are also cloned, however objects inside arrays are still linked.\r\n *\r\n * @export \r\n * @template T\r\n * @param {T} target Target can be anything\r\n * @param { Options} [options={}] Options can be `props` or `nonenumerable`\r\n * @returns { T} the target with replaced values\r\n * @export\r\n */\r\nfunction copy(target, options) {\r\n if (options === void 0) { options = {}; }\r\n if (isArray( target))\r\n return target.map(function (i) { return copy(i, options); }) ;\r\n if (!isPlainObject(target))\r\n return target;\r\n var props = Object.getOwnPropertyNames(target);\r\n var symbols = Object.getOwnProperty Symbols(target);\r\n return __spreadArrays(props, symbols).reduce(function (c arry, key) {\r\n if (isArray(options.props) && !options.props.includes(ke y)) {\r\n return carry;\r\n }\r\n var val = target[key] ;\r\n var newVal = copy(val, options);\r\n assignProp(carry, key, newVal, target, options.nonenumerable);\r\n return carry;\r\n }, {});\ r\n}\n\nexport { copy };\n","/* jshint proto: true */\nimport * as Constants fro m './constants';\nimport { copy } from 'copy-anything';\n\nexport function getLo cation(index, inputStream) {\n let n = index + 1;\n let line = null;\n let column = -1;\n\n while (--n >= 0 && inputStream.charAt(n) !== '\\n') {\n column++;\n }\n\n if (typeof index === 'number') {\n line = (inputStream.slice(0, index).match(/\\n/g) || '').length;\n }\n\n return { \n line,\n column\n };\n}\n\nexport function copyArray(arr) {\n let i;\n const length = arr.length;\n const copy = new Array(length);\ n\n for (i = 0; i < length; i++) {\n copy[i] = arr[i];\n }\n ret urn copy;\n}\n\nexport function clone(obj) {\n const cloned = {};\n for (c onst prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned [prop] = obj[prop];\n }\n }\n return cloned;\n}\n\nexport function defaults(obj1, obj2) {\n let newObj = obj2 || {};\n if (!obj2._defaults) { \n newObj = {};\n const defaults = copy(obj1);\n newObj._de faults = defaults;\n const cloned = obj2 ? copy(obj2) : {};\n Obje ct.assign(newObj, defaults, cloned);\n }\n return newObj;\n}\n\nexport fun ction copyOptions(obj1, obj2) {\n if (obj2 && obj2._defaults) {\n retu rn obj2;\n }\n const opts = defaults(obj1, obj2);\n if (opts.strictMath ) {\n opts.math = Constants.Math.PARENS;\n }\n // Back compat with changed relativeUrls option\n if (opts.relativeUrls) {\n opts.rewriteU rls = Constants.RewriteUrls.ALL;\n }\n if (typeof opts.math === 'string') {\n switch (opts.math.toLowerCase()) {\n case 'always':\n opts.math = Constants.Math.ALWAYS;\n break;\n case 'parens-division':\n opts.math = Constants.Math.PARENS_DI VISION;\n break;\n case 'strict':\n case 'p arens':\n opts.math = Constants.Math.PARENS;\n bre ak;\n default:\n opts.math = Constants.Math.PARENS;\n }\n }\n if (typeof opts.rewriteUrls === 'string') {\n switch (opts.rewriteUrls.toLowerCase()) {\n case 'off':\n op ts.rewriteUrls = Constants.RewriteUrls.OFF;\n break;\n case 'local':\n opts.rewriteUrls = Constants.RewriteUrls.LOCAL;\ n break;\n case 'all':\n opts.rewriteUr ls = Constants.RewriteUrls.ALL;\n break;\n }\n }\n r eturn opts;\n}\n\nexport function merge(obj1, obj2) {\n for (const prop in ob j2) {\n if (obj2.hasOwnProperty(prop)) {\n obj1[prop] = obj2[p rop];\n }\n }\n return obj1;\n}\n\nexport function flattenArray(arr , result = []) {\n for (let i = 0, length = arr.length; i < length; i++) {\n const value = arr[i];\n if (Array.isArray(value)) {\n f lattenArray(value, result);\n } else {\n if (value !== undefin ed) {\n result.push(value);\n }\n }\n }\n return result;\n}","import * as utils from './utils';\n\nconst anonymousFunc = /(<anonymous>|Function):(\\d+):(\\d+)/;\n\n/**\n * This is a centralized class o f any error that could be thrown internally (mostly by the parser).\n * Besides standard .message it keeps some additional data like a path to the file where th e error\n * occurred along with line and column numbers.\n *\n * @class\n * @ext ends Error\n * @type {module.LessError}\n *\n * @prop {string} type\n * @prop {s tring} filename\n * @prop {number} index\n * @prop {number} line\n * @prop {numb er} column\n * @prop {number} callLine\n * @prop {number} callExtract\n * @prop {string[]} extract\n *\n * @param {Object} e - An error object to w rap around or just a descriptive object\n * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - mo ve to fileManager?\n * @param {string} [currentFilename]\n */\nconst LessError = function(e, fileContentMap, currentFilename) {\n Error.call(this);\n\n co nst filename = e.filename || currentFilename;\n\n this.message = e.message;\n this.stack = e.stack;\n\n if (fileContentMap && filename) {\n cons t input = fileContentMap.contents[filename];\n const loc = utils.getLocat ion(e.index, input);\n var line = loc.line;\n const col = loc.col umn;\n const callLine = e.call && utils.getLocation(e.call, input).line;\ n const lines = input ? input.split('\\n') : '';\n\n this.type = e .type || 'Syntax';\n this.filename = filename;\n this.index = e.in dex;\n this.line = typeof line === 'number' ? line + 1 : null;\n t his.column = col;\n\n if (!this.line && this.stack) {\n const found = this.stack.match(anonymousFunc);\n\n /**\n * We h ave to figure out how this environment stringifies anonymous functions\n * so we can correctly map plugin errors.\n * \n * N ote, in Node 8, the output of anonymous funcs varied based on parameters\n * being present or not, so we inject dummy params.\n */\n const func = new Function('a', 'throw new Error()');\n let li neAdjust = 0;\n try {\n func();\n } catch ( e) {\n const match = e.stack.match(anonymousFunc);\n var line = parseInt(match[2]);\n lineAdjust = 1 - line;\n }\n\n if (found) {\n if (found[2]) {\n this.line = parseInt(found[2]) + lineAdjust;\n }\n if (found[3]) {\n this.column = parseInt(found[3] );\n }\n }\n }\n\n this.callLine = callL ine + 1;\n this.callExtract = lines[callLine];\n\n this.extract = [\n lines[this.line - 2],\n lines[this.line - 1],\n lines[this.line]\n ];\n }\n\n};\n\nif (typeof Object.create === ' undefined') {\n const F = function () {};\n F.prototype = Error.prototype; \n LessError.prototype = new F();\n} else {\n LessError.prototype = Object .create(Error.prototype);\n}\n\nLessError.prototype.constructor = LessError;\n\n /**\n * An overridden version of the default Object.prototype.toString\n * which uses additional information to create a helpful message.\n *\n * @param {Object } options\n * @returns {string}\n */\nLessError.prototype.toString = function(op tions) {\n options = options || {};\n\n let message = '';\n const extra ct = this.extract || [];\n let error = [];\n let stylize = function (str) { return str; };\n if (options.stylize) {\n const type = typeof option s.stylize;\n if (type !== 'function') {\n throw Error(`options .stylize should be a function, got a ${type}!`);\n }\n stylize = o ptions.stylize;\n }\n\n if (this.line !== null) {\n if (typeof extr act[0] === 'string') {\n error.push(stylize(`${this.line - 1} ${extra ct[0]}`, 'grey'));\n }\n\n if (typeof extract[1] === 'string') {\n let errorTxt = `${this.line} `;\n if (extract[1]) {\n errorTxt += extract[1].slice(0, this.column) +\n stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') +\n extract[1].slice(this.column + 1), 'red'), 'inverse');\n }\n error.push(errorTxt);\n }\n\n if (typeof extract[ 2] === 'string') {\n error.push(stylize(`${this.line + 1} ${extract[2 ]}`, 'grey'));\n }\n error = `${error.join('\\n') + stylize('', 'r eset')}\\n`;\n }\n\n message += stylize(`${this.type}Error: ${this.message }`, 'red');\n if (this.filename) {\n message += stylize(' in ', 'red') + this.filename;\n }\n if (this.line) {\n message += stylize(` on line ${this.line}, column ${this.column + 1}:`, 'grey');\n }\n\n message + = `\\n${error}`;\n\n if (this.callLine) {\n message += `${stylize('fro m ', 'red') + (this.filename || '')}/n`;\n message += `${stylize(this.cal lLine, 'grey')} ${this.callExtract}/n`;\n }\n\n return message;\n};\n\nexp ort default LessError;","import Node from './node';\nimport Element from './elem ent';\nimport LessError from '../less-error';\n\nconst Selector = function(eleme nts, extendList, condition, index, currentFileInfo, visibilityInfo) {\n this. extendList = extendList;\n this.condition = condition;\n this.evaldConditi on = !condition;\n this._index = index;\n this._fileInfo = currentFileInfo ;\n this.elements = this.getElements(elements);\n this.mixinElements_ = un defined;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this. elements, this);\n};\n\nSelector.prototype = Object.assign(new Node(), {\n ty pe: 'Selector',\n\n accept(visitor) {\n if (this.elements) {\n this.elements = visitor.visitArray(this.elements);\n }\n if (t his.extendList) {\n this.extendList = visitor.visitArray(this.extendL ist);\n }\n if (this.condition) {\n this.condition = vi sitor.visit(this.condition);\n }\n },\n\n createDerived(elements, e xtendList, evaldCondition) {\n elements = this.getElements(elements);\n const newSelector = new Selector(elements, extendList || this.extendList,\ n null, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : t his.evaldCondition;\n newSelector.mediaEmpty = this.mediaEmpty;\n return newSelector;\n },\n\n getElements(els) {\n if (!els) {\n return [new Element('', '&', false, this._index, this._fileInfo)];\n }\n if (typeof els === 'string') {\n this.parse.parseNode( \n els, \n ['selector'],\n this._in dex, \n this._fileInfo, \n function(err, result) { \n if (err) {\n throw new LessError({\ n index: err.index,\n mess age: err.message\n }, this.parse.imports, this._fileInfo. filename);\n }\n els = result[0].elements; \n });\n }\n return els;\n },\n\n createEmpty Selectors() {\n const el = new Element('', '&', false, this._index, this. _fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)] ;\n sels[0].mediaEmpty = true;\n return sels;\n },\n\n match (other) {\n const elements = this.elements;\n const len = elements .length;\n let olen;\n let i;\n\n other = other.mixinElemen ts();\n olen = other.length;\n if (olen === 0 || len < olen) {\n return 0;\n } else {\n for (i = 0; i < olen; i++) {\ n if (elements[i].value !== other[i]) {\n retu rn 0;\n }\n }\n }\n\n return olen; // re turn number of matched elements\n },\n\n mixinElements() {\n if (th is.mixinElements_) {\n return this.mixinElements_;\n }\n\n let elements = this.elements.map( function(v) {\n return v.combin ator.value + (v.value.value || v.value);\n }).join('').match(/[,&#\\*\\.\ \w-]([\\w-]|(\\\\.))*/g);\n\n if (elements) {\n if (elements[0 ] === '&') {\n elements.shift();\n }\n } else { \n elements = [];\n }\n\n return (this.mixinElements_ = elements);\n },\n\n isJustParentSelector() {\n return !this.mediaE mpty &&\n this.elements.length === 1 &&\n this.elements[0] .value === '&' &&\n (this.elements[0].combinator.value === ' ' || thi s.elements[0].combinator.value === '');\n },\n\n eval(context) {\n const evaldCondition = this.condition && this.condition.eval(context);\n let elements = this.elements;\n let extendList = this.extendList;\n\n elements = elements && elements.map(function (e) { return e.eval(context); } );\n extendList = extendList && extendList.map(function(extend) { return extend.eval(context); });\n\n return this.createDerived(elements, extendL ist, evaldCondition);\n },\n\n genCSS(context, output) {\n let i, e lement;\n if ((!context || !context.firstSelector) && this.elements[0].co mbinator.value === '') {\n output.add(' ', this.fileInfo(), this.getI ndex());\n }\n for (i = 0; i < this.elements.length; i++) {\n element = this.elements[i];\n element.genCSS(context, output); \n }\n },\n\n getIsOutput() {\n return this.evaldCondition;\ n }\n});\n\nexport default Selector;\n","import Node from './node';\n\nconst Value = function(value) {\n if (!value) {\n throw new Error('Value req uires an array argument');\n }\n if (!Array.isArray(value)) {\n thi s.value = [ value ];\n }\n else {\n this.value = value;\n }\n};\ n\nValue.prototype = Object.assign(new Node(), {\n type: 'Value',\n\n acce pt(visitor) {\n if (this.value) {\n this.value = visitor.visit Array(this.value);\n }\n },\n\n eval(context) {\n if (this.v alue.length === 1) {\n return this.value[0].eval(context);\n } else {\n return new Value(this.value.map(function (v) {\n return v.eval(context);\n }));\n }\n },\n\n genCSS( context, output) {\n let i;\n for (i = 0; i < this.value.length; i ++) {\n this.value[i].genCSS(context, output);\n if (i + 1 < this.value.length) {\n output.add((context && context.compress ) ? ',' : ', ');\n }\n }\n }\n});\n\nexport default Value;\ n","import Node from './node';\n\nconst Keyword = function(value) {\n this.va lue = value;\n};\n\nKeyword.prototype = Object.assign(new Node(), {\n type: ' Keyword',\n\n genCSS(context, output) {\n if (this.value === '%') { th row { type: 'Syntax', message: 'Invalid % without number' }; }\n output.a dd(this.value);\n }\n});\n\nKeyword.True = new Keyword('true');\nKeyword.Fals e = new Keyword('false');\n\nexport default Keyword;\n","import Node from './nod e';\n\nconst Anonymous = function(value, index, currentFileInfo, mapLines, rules etLike, visibilityInfo) {\n this.value = value;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.mapLines = mapLines;\n this.rul esetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;\n this .allowRoot = true;\n this.copyVisibilityInfo(visibilityInfo);\n}\n\nAnonymous .prototype = Object.assign(new Node(), {\n type: 'Anonymous',\n eval() {\n return new Anonymous(this.value, this._index, this._fileInfo, this.mapLi nes, this.rulesetLike, this.visibilityInfo());\n },\n compare(other) {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n },\n isRulesetLike() {\n return this.rulesetLike;\n },\n genCSS (context, output) {\n this.nodeVisible = Boolean(this.value);\n if (this.nodeVisible) {\n output.add(this.value, this._fileInfo, this._ index, this.mapLines);\n }\n }\n})\n\nexport default Anonymous;\n","im port Node from './node';\nimport Value from './value';\nimport Keyword from './k eyword';\nimport Anonymous from './anonymous';\nimport * as Constants from '../c onstants';\nconst MATH = Constants.Math;\n\nfunction evalName(context, name) {\n let value = '';\n let i;\n const n = name.length;\n const output = {add: function (s) {value += s;}};\n for (i = 0; i < n; i++) {\n name[ i].eval(context).genCSS(context, output);\n }\n return value;\n}\n\nconst Declaration = function(name, value, important, merge, index, currentFileInfo, in line, variable) {\n this.name = name;\n this.value = (value instanceof Nod e) ? value : new Value([value ? new Anonymous(value) : null]);\n this.importa nt = important ? ` ${important.trim()}` : '';\n this.merge = merge;\n this ._index = index;\n this._fileInfo = currentFileInfo;\n this.inline = inlin e || false;\n this.variable = (variable !== undefined) ? variable\n : (name.charAt && (name.charAt(0) === '@'));\n this.allowRoot = true;\n this .setParent(this.value, this);\n};\n\nDeclaration.prototype = Object.assign(new N ode(), {\n type: 'Declaration',\n\n genCSS(context, output) {\n out put.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIn dex());\n try {\n this.value.genCSS(context, output);\n }\n catch (e) {\n e.index = this._index;\n e.filen ame = this._fileInfo.filename;\n throw e;\n }\n output. add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index);\n },\n\n eval(context) {\n let mathBypass = false, prevMath, name = this.name, evaldValue, variable = this .variable;\n if (typeof name !== 'string') {\n // expand 'prim itive' name directly to get\n // things faster (~10% for benchmark.le ss):\n name = (name.length === 1) && (name[0] instanceof Keyword) ?\n name[0].value : evalName(context, name);\n variable = false; // never treat expanded interpolation as new variable name\n }\n\ n // @todo remove when parens-division is default\n if (name === ' font' && context.math === MATH.ALWAYS) {\n mathBypass = true;\n prevMath = context.math;\n context.math = MATH.PARENS_DIVISION; \n }\n try {\n context.importantScope.push({});\n evaldValue = this.value.eval(context);\n\n if (!this.variable & & evaldValue.type === 'DetachedRuleset') {\n throw { message: 'Ru lesets cannot be evaluated on a property.',\n index: this.get Index(), filename: this.fileInfo().filename };\n }\n let i mportant = this.important;\n const importantResult = context.importan tScope.pop();\n if (!important && importantResult.important) {\n important = importantResult.important;\n }\n\n return new Declaration(name,\n evaldValue,\n impor tant,\n this.merge,\n this.getIndex(), this.fileIn fo(), this.inline,\n variable);\n }\n catch (e) {\n if (typeof e.index !== 'number') {\n e.index = this.g etIndex();\n e.filename = this.fileInfo().filename;\n }\n throw e;\n }\n finally {\n if (mathBypas s) {\n context.math = prevMath;\n }\n }\n }, \n\n makeImportant() {\n return new Declaration(this.name,\n this.value,\n '!important',\n this.merge,\n t his.getIndex(), this.fileInfo(), this.inline);\n }\n});\n\nexport default Dec laration;","class debugInfo {\n constructor(context, ctx, lineSeparator) {\n let result = '';\n if (context.dumpLineNumbers && !context.compres s) {\n switch (context.dumpLineNumbers) {\n case 'comm ents':\n result = debugInfo.asComment(ctx);\n break;\n case 'mediaquery':\n result = deb ugInfo.asMediaQuery(ctx);\n break;\n case 'all ':\n result = debugInfo.asComment(ctx) + (lineSeparator || '' ) + debugInfo.asMediaQuery(ctx);\n break;\n }\n }\n return result;\n }\n\n static asComment(ctx) {\n re turn `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\\n`;\n }\n\n static asMediaQuery(ctx) {\n let filenameWithProtocol = ctx.de bugInfo.fileName;\n if (!/^[a-z]+:\\/\\//i.test(filenameWithProtocol)) {\ n filenameWithProtocol = `file://${filenameWithProtocol}`;\n } \n return `@media -sass-debug-info{filename{font-family:${filenameWithPro tocol.replace(/([.:\\/\\\\])/g, function (a) {\n if (a == '\\\\') {\n a = '\\/';\n }\n return `\\\\${a}`;\n })}}line{font-family:\\\\00003${ctx.debugInfo.lineNumber}}}\\n`;\n }\n}\n\ nexport default debugInfo;\n","import Node from './node';\nimport getDebugInfo f rom './debug-info';\n\nconst Comment = function(value, isLineComment, index, cur rentFileInfo) {\n this.value = value;\n this.isLineComment = isLineComment ;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.all owRoot = true;\n}\n\nComment.prototype = Object.assign(new Node(), {\n type: 'Comment',\n\n genCSS(context, output) {\n if (this.debugInfo) {\n output.add(getDebugInfo(context, this), this.fileInfo(), this.getIndex() );\n }\n output.add(this.value);\n },\n\n isSilent(context) {\n const isCompressed = context.compress && this.value[2] !== '!';\n return this.isLineComment || isCompressed;\n }\n});\n\nexport default Com ment;\n","const contexts = {};\nexport default contexts;\nimport * as Constants from './constants';\n\nconst copyFromOriginal = function copyFromOriginal(origin al, destination, propertiesToCopy) {\n if (!original) { return; }\n\n for (let i = 0; i < propertiesToCopy.length; i++) {\n if (original.hasOwnProp erty(propertiesToCopy[i])) {\n destination[propertiesToCopy[i]] = ori ginal[propertiesToCopy[i]];\n }\n }\n};\n\n/*\n parse is used whilst p arsing\n */\nconst parseCopyProperties = [\n // options\n 'paths', // option - unmodified - paths to search for imports on\n 'rewriteUrls', // option - whether to adjust URL's to be relative\n 'rootpath', // option - rootpath to append to URL's\n 'strictImports', // option -\n 'insecure', // option - whether to allow imports from insecure ssl ho sts\n 'dumpLineNumbers', // option - whether to dump line numbers\n 'comp ress', // option - whether to compress\n 'syncImport', // optio n - whether to import synchronously\n 'chunkInput', // option - whether to chunk input. more performant but causes parse issues.\n 'mime', // browser only - mime type for sheet import\n 'useFileCache', // brow ser only - whether to use the per file session cache\n // context\n 'proce ssImports', // option & context - whether to process imports. if false then im ports will not be imported.\n // Used by the import manager to stop multiple import visitors being created.\n 'pluginManager' // Used as the plugin ma nager for the session\n];\n\ncontexts.Parse = function(options) {\n copyFromO riginal(options, this, parseCopyProperties);\n\n if (typeof this.paths === 's tring') { this.paths = [this.paths]; }\n};\n\nconst evalCopyProperties = [\n 'paths', // additional include paths\n 'compress', // wh ether to compress\n 'math', // whether math has to be within par enthesis\n 'strictUnits', // whether units need to evaluate correctly\n 'sourceMap', // whether to output a source map\n 'importMultiple' , // whether we are currently importing multiple copies\n 'urlArgs', // whether to add args into url tokens\n 'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false\n 'pl uginManager', // Used as the plugin manager for the session\n 'importantS cope', // used to bubble up !important statements\n 'rewriteUrls' / / option - whether to adjust URL's to be relative\n];\n\ncontexts.Eval = functio n(options, frames) {\n copyFromOriginal(options, this, evalCopyProperties);\n \n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n\n this.frames = frames || [];\n this.importantScope = this.importantScope || [] ;\n};\n\ncontexts.Eval.prototype.enterCalc = function () {\n if (!this.calcSt ack) {\n this.calcStack = [];\n }\n this.calcStack.push(true);\n this.inCalc = true;\n};\n\ncontexts.Eval.prototype.exitCalc = function () {\n this.calcStack.pop();\n if (!this.calcStack.length) {\n this.inCalc = false;\n }\n};\n\ncontexts.Eval.prototype.inParenthesis = function () {\n if (!this.parensStack) {\n this.parensStack = [];\n }\n this.pare nsStack.push(true);\n};\n\ncontexts.Eval.prototype.outOfParenthesis = function ( ) {\n this.parensStack.pop();\n};\n\ncontexts.Eval.prototype.inCalc = false;\ ncontexts.Eval.prototype.mathOn = true;\ncontexts.Eval.prototype.isMathOn = func tion (op) {\n if (!this.mathOn) {\n return false;\n }\n if (op = == '/' && this.math !== Constants.Math.ALWAYS && (!this.parensStack || !this.par ensStack.length)) {\n return false;\n }\n if (this.math > Constants .Math.PARENS_DIVISION) {\n return this.parensStack && this.parensStack.le ngth;\n }\n return true;\n};\n\ncontexts.Eval.prototype.pathRequiresRewrit e = function (path) {\n const isRelative = this.rewriteUrls === Constants.Rew riteUrls.LOCAL ? isPathLocalRelative : isPathRelative;\n\n return isRelative( path);\n};\n\ncontexts.Eval.prototype.rewritePath = function (path, rootpath) {\ n let newPath;\n\n rootpath = rootpath || '';\n newPath = this.normaliz ePath(rootpath + path);\n\n // If a path was explicit relative and the rootpa th was not an absolute path\n // we must ensure that the new path is also exp licit relative.\n if (isPathLocalRelative(path) &&\n isPathRelative(ro otpath) &&\n isPathLocalRelative(newPath) === false) {\n newPath = `./${newPath}`;\n }\n\n return newPath;\n};\n\ncontexts.Eval.prototype.no rmalizePath = function (path) {\n const segments = path.split('/').reverse(); \n let segment;\n\n path = [];\n while (segments.length !== 0) {\n segment = segments.pop();\n switch ( segment ) {\n case '.' :\n break;\n case '..':\n if ((path.len gth === 0) || (path[path.length - 1] === '..')) {\n path.push ( segment );\n } else {\n path.pop();\n }\n break;\n default:\n path.p ush(segment);\n break;\n }\n }\n\n return path.join( '/');\n};\n\nfunction isPathRelative(path) {\n return !/^(?:[a-z-]+:|\\/|#)/i .test(path);\n}\n\nfunction isPathLocalRelative(path) {\n return path.charAt( 0) === '.';\n}\n\n// todo - do the same for the toCSS ?\n","function makeRegistr y( base ) {\n return {\n _data: {},\n add: function(name, func) {\n // precautionary case conversion, as later querying of\n // the registry by function-caller uses lower case as well.\n nam e = name.toLowerCase();\n\n if (this._data.hasOwnProperty(name)) {\n // TODO warn\n }\n this._data[name] = func; \n },\n addMultiple: function(functions) {\n Object.key s(functions).forEach(\n name => {\n this.add(n ame, functions[name]);\n });\n },\n get: function(n ame) {\n return this._data[name] || ( base && base.get( name ));\n },\n getLocalFunctions: function() {\n return this._data; \n },\n inherit: function() {\n return makeRegistry( th is );\n },\n create: function(base) {\n return makeRegi stry(base);\n }\n };\n}\n\nexport default makeRegistry( null );","impo rt Keyword from '../tree/keyword';\n\nconst defaultFunc = {\n eval: function () {\n const v = this.value_;\n const e = this.error_;\n if (e) {\n throw e;\n }\n if (v != null) {\n r eturn v ? Keyword.True : Keyword.False;\n }\n },\n value: function (v) {\n this.value_ = v;\n },\n error: function (e) {\n this .error_ = e;\n },\n reset: function () {\n this.value_ = this.error _ = null;\n }\n};\n\nexport default defaultFunc;\n","import Node from './node ';\nimport Declaration from './declaration';\nimport Keyword from './keyword';\n import Comment from './comment';\nimport Paren from './paren';\nimport Selector from './selector';\nimport Element from './element';\nimport Anonymous from './a nonymous';\nimport contexts from '../contexts';\nimport globalFunctionRegistry f rom '../functions/function-registry';\nimport defaultFunc from '../functions/def ault';\nimport getDebugInfo from './debug-info';\nimport * as utils from '../uti ls';\n\nconst Ruleset = function(selectors, rules, strictImports, visibilityInfo ) {\n this.selectors = selectors;\n this.rules = rules;\n this._lookups = {};\n this._variables = null;\n this._properties = null;\n this.stri ctImports = strictImports;\n this.copyVisibilityInfo(visibilityInfo);\n th is.allowRoot = true;\n\n this.setParent(this.selectors, this);\n this.setP arent(this.rules, this);\n}\n\nRuleset.prototype = Object.assign(new Node(), {\n type: 'Ruleset',\n isRuleset: true,\n\n isRulesetLike() { return true; },\n\n accept(visitor) {\n if (this.paths) {\n this.paths = visitor.visitArray(this.paths, true);\n } else if (this.selectors) {\n this.selectors = visitor.visitArray(this.selectors);\n }\n if (this.rules && this.rules.length) {\n this.rules = visitor.vis itArray(this.rules);\n }\n },\n\n eval(context) {\n const th at = this;\n let selectors;\n let selCnt;\n let selector;\n let i;\n let hasVariable;\n let hasOnePassingSelector = fa lse;\n\n if (this.selectors && (selCnt = this.selectors.length)) {\n selectors = new Array(selCnt);\n defaultFunc.error({\n type: 'Syntax',\n message: 'it is currently only allowed in parametric mixin guards,'\n });\n\n for (i = 0; i < sel Cnt; i++) {\n selector = this.selectors[i].eval(context);\n for (var j = 0; j < selector.elements.length; j++) {\n if (selector.elements[j].isVariable) {\n hasVariable = true;\n break;\n }\n }\n selectors[i] = selector;\n if (selector.evaldC ondition) {\n hasOnePassingSelector = true;\n }\n }\n\n if (hasVariable) {\n const toPars eSelectors = new Array(selCnt);\n for (i = 0; i < selCnt; i++) {\ n selector = selectors[i];\n toParseSelect ors[i] = selector.toCSS(context);\n }\n this.parse .parseNode(\n toParseSelectors.join(','),\n [\"selectors\"], \n selectors[0].getIndex(), \n selectors[0].fileInfo(), \n function(err, result) {\n if (result) {\n selectors = u tils.flattenArray(result);\n }\n });\n }\n\n defaultFunc.reset();\n } else {\n hasOnePassingSelector = true;\n }\n\n let rules = this.rules ? ut ils.copyArray(this.rules) : null;\n const ruleset = new Ruleset(selectors , rules, this.strictImports, this.visibilityInfo());\n let rule;\n let subRule;\n\n ruleset.originalRuleset = this;\n ruleset.root = this.root;\n ruleset.firstRoot = this.firstRoot;\n ruleset.allowI mports = this.allowImports;\n\n if (this.debugInfo) {\n rulese t.debugInfo = this.debugInfo;\n }\n\n if (!hasOnePassingSelector) {\n rules.length = 0;\n }\n\n // inherit a function reg istry from the frames stack when possible;\n // otherwise from the global registry\n ruleset.functionRegistry = (function (frames) {\n let i = 0;\n const n = frames.length;\n let found;\n for ( ; i !== n ; ++i ) {\n found = frames[ i ].functionReg istry;\n if ( found ) { return found; }\n }\n return globalFunctionRegistry;\n }(context.frames)).inherit();\n\n // push the current ruleset to the frames stack\n const ctxFrames = c ontext.frames;\n ctxFrames.unshift(ruleset);\n\n // currrent selec tors\n let ctxSelectors = context.selectors;\n if (!ctxSelectors) {\n context.selectors = ctxSelectors = [];\n }\n ctxSel ectors.unshift(this.selectors);\n\n // Evaluate imports\n if (rule set.root || ruleset.allowImports || !ruleset.strictImports) {\n rules et.evalImports(context);\n }\n\n // Store the frames around mixin definitions,\n // so they can be evaluated like closures when the time co mes.\n const rsRules = ruleset.rules;\n for (i = 0; (rule = rsRule s[i]); i++) {\n if (rule.evalFirst) {\n rsRules[i] = r ule.eval(context);\n }\n }\n\n const mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;\n\n // Evaluate mixin calls.\n for (i = 0; (rule = rsRules[i]); i++) {\n if ( rule.type === 'MixinCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).filter(function(r) {\n i f ((r instanceof Declaration) && r.variable) {\n // do no t pollute the scope if the variable is\n // already there . consider returning false here\n // but we need a way to \"return\" variable from mixins\n return !(ruleset.varia ble(r.name));\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules)) ;\n i += rules.length - 1;\n ruleset.resetCache(); \n } else if (rule.type === 'VariableCall') {\n /* js hint loopfunc:true */\n rules = rule.eval(context).rules.filter(f unction(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope at all\n return false;\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat( rules));\n i += rules.length - 1;\n ruleset.resetC ache();\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n if (!rule.evalFirst) {\n rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n // for rulesets, check if it is a css g uard and can be removed\n if (rule instanceof Ruleset && rule.selecto rs && rule.selectors.length === 1) {\n // check if it can be fold ed in (e.g. & where)\n if (rule.selectors[0] && rule.selectors[0] .isJustParentSelector()) {\n rsRules.splice(i--, 1);\n\n for (var j = 0; (subRule = rule.rules[j]); j++) {\n if (subRule instanceof Node) {\n subRule.co pyVisibilityInfo(rule.visibilityInfo());\n if (!(subR ule instanceof Declaration) || !subRule.variable) {\n rsRules.splice(++i, 0, subRule);\n }\n }\n }\n }\n }\n }\n\n // Pop the stack\n ctxFrames.shift();\n ctxSelector s.shift();\n\n if (context.mediaBlocks) {\n for (i = mediaBloc kCount; i < context.mediaBlocks.length; i++) {\n context.mediaBlo cks[i].bubbleSelectors(selectors);\n }\n }\n\n return r uleset;\n },\n\n evalImports(context) {\n const rules = this.rules; \n let i;\n let importRules;\n if (!rules) { return; }\n\n for (i = 0; i < rules.length; i++) {\n if (rules[i].type === ' Import') {\n importRules = rules[i].eval(context);\n if (importRules && (importRules.length || importRules.length === 0)) {\n rules.splice.apply(rules, [i, 1].concat(importRules));\n i += importRules.length - 1;\n } else {\n rules.splice(i, 1, importRules);\n }\n this .resetCache();\n }\n }\n },\n\n makeImportant() {\n const result = new Ruleset(this.selectors, this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant();\n } else {\n return r;\n }\n }), this.str ictImports, this.visibilityInfo());\n\n return result;\n },\n\n mat chArgs(args) {\n return !args || args.length === 0;\n },\n\n // let s you call a css selector with a guard\n matchCondition(args, context) {\n const lastSelector = this.selectors[this.selectors.length - 1];\n if (!lastSelector.evaldCondition) {\n return false;\n }\n if (lastSelector.condition &&\n !lastSelector.condition.eval(\n new contexts.Eval(context,\n context.frames))) {\n return false;\n }\n return true;\n },\n\n resetC ache() {\n this._rulesets = null;\n this._variables = null;\n this._properties = null;\n this._lookups = {};\n },\n\n variable s() {\n if (!this._variables) {\n this._variables = !this.rule s ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceo f Declaration && r.variable === true) {\n hash[r.name] = r;\n }\n // when evaluating variables in an import sta tement, imports have not been eval'd\n // so we need to go inside import statements.\n // guard against root being a string (in th e case of inlined less)\n if (r.type === 'Import' && r.root && r. root.variables) {\n const vars = r.root.variables();\n for (const name in vars) {\n if (vars.hasOwn Property(name)) {\n hash[name] = r.root.variable(name );\n }\n }\n }\n return hash;\n }, {});\n }\n return this._vari ables;\n },\n\n properties() {\n if (!this._properties) {\n this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) { \n if (r instanceof Declaration && r.variable !== true) {\n const name = (r.name.length === 1) && (r.name[0] instanceof Keywor d) ?\n r.name[0].value : r.name;\n // Properties don't overwrite as they can merge\n if (!hash[`$${ name}`]) {\n hash[`$${name}`] = [ r ];\n }\n else {\n hash[`$${name}`].push( r);\n }\n }\n return hash;\n }, {});\n }\n return this._properties;\n },\n\n var iable(name) {\n const decl = this.variables()[name];\n if (decl) { \n return this.parseValue(decl);\n }\n },\n\n property(n ame) {\n const decl = this.properties()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n },\n\n lastDeclaration( ) {\n for (let i = this.rules.length; i > 0; i--) {\n const de cl = this.rules[i - 1];\n if (decl instanceof Declaration) {\n return this.parseValue(decl);\n }\n }\n },\n\n parseValue(toParse) {\n const self = this;\n function transformDec laration(decl) {\n if (decl.value instanceof Anonymous && !decl.parse d) {\n if (typeof decl.value.value === 'string') {\n this.parse.parseNode(\n decl.value.value,\n ['value', 'important'], \n decl.value.ge tIndex(), \n decl.fileInfo(), \n f unction(err, result) {\n if (err) {\n decl.parsed = true;\n }\n if (result) {\n decl.value = resu lt[0];\n decl.important = result[1] || '';\n decl.parsed = true;\n }\n });\n } else {\n decl.p arsed = true;\n }\n\n return decl;\n }\ n else {\n return decl;\n }\n }\n if (!Array.isArray(toParse)) {\n return transformDeclaration.cal l(self, toParse);\n }\n else {\n const nodes = [];\n toParse.forEach(function(n) {\n nodes.push(transformDecl aration.call(self, n));\n });\n return nodes;\n }\n },\n\n rulesets() {\n if (!this.rules) { return []; }\n\n c onst filtRules = [];\n const rules = this.rules;\n let i;\n let rule;\n\n for (i = 0; (rule = rules[i]); i++) {\n if (rul e.isRuleset) {\n filtRules.push(rule);\n }\n }\ n\n return filtRules;\n },\n\n prependRule(rule) {\n const r ules = this.rules;\n if (rules) {\n rules.unshift(rule);\n } else {\n this.rules = [ rule ];\n }\n this.setPar ent(rule, this);\n },\n\n find(selector, self, filter) {\n self = s elf || this;\n const rules = [];\n let match;\n let foundMi xins;\n const key = selector.toCSS();\n\n if (key in this._lookups ) { return this._lookups[key]; }\n\n this.rulesets().forEach(function (ru le) {\n if (rule !== self) {\n for (let j = 0; j < rul e.selectors.length; j++) {\n match = selector.match(rule.sele ctors[j]);\n if (match) {\n if (select or.elements.length > match) {\n if (!filter || filter (rule)) {\n foundMixins = rule.find(new Selector( selector.elements.slice(match)), self, filter);\n for (let i = 0; i < foundMixins.length; ++i) {\n foundMixins[i].path.push(rule);\n }\n Array.prototype.push.apply(rules, foundMixins);\n }\n } else {\n rules.push({ rule, path: []});\n }\n break;\n }\n }\n }\n });\n this._lookups[key] = rules;\n return rules;\n },\n\n genCSS(context, output) {\n let i;\n let j;\n const chars etRuleNodes = [];\n let ruleNodes = [];\n\n let // Line number deb ugging\n debugInfo;\n\n let rule;\n let path;\n\n context.tabLevel = (context.tabLevel || 0);\n\n if (!this.root) {\n context.tabLevel++;\n }\n\n const tabRuleStr = context.com press ? '' : Array(context.tabLevel + 1).join(' ');\n const tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');\n let sep;\n\ n let charsetNodeIndex = 0;\n let importNodeIndex = 0;\n fo r (i = 0; (rule = this.rules[i]); i++) {\n if (rule instanceof Commen t) {\n if (importNodeIndex === i) {\n importNo deIndex++;\n }\n ruleNodes.push(rule);\n } else if (rule.isCharset && rule.isCharset()) {\n ruleNodes.sp lice(charsetNodeIndex, 0, rule);\n charsetNodeIndex++;\n importNodeIndex++;\n } else if (rule.type === 'Import') {\n ruleNodes.splice(importNodeIndex, 0, rule);\n import NodeIndex++;\n } else {\n ruleNodes.push(rule);\n }\n }\n ruleNodes = charsetRuleNodes.concat(ruleNodes);\n\n // If this is the root node, we don't render\n // a selector, or {}.\n if (!this.root) {\n debugInfo = getDebugInfo(context, th is, tabSetStr);\n\n if (debugInfo) {\n output.add(debu gInfo);\n output.add(tabSetStr);\n }\n\n co nst paths = this.paths;\n const pathCnt = paths.length;\n let pathSubCnt;\n\n sep = context.compress ? ',' : (`,\\n${tabSetStr} `);\n\n for (i = 0; i < pathCnt; i++) {\n path = paths [i];\n if (!(pathSubCnt = path.length)) { continue; }\n if (i > 0) { output.add(sep); }\n\n context.firstSelector = true;\n path[0].genCSS(context, output);\n\n cont ext.firstSelector = false;\n for (j = 1; j < pathSubCnt; j++) {\n path[j].genCSS(context, output);\n }\n }\n\n output.add((context.compress ? '{' : ' {\\n') + tabRuleStr );\n }\n\n // Compile rules and rulesets\n for (i = 0; (rul e = ruleNodes[i]); i++) {\n\n if (i + 1 === ruleNodes.length) {\n context.lastRule = true;\n }\n\n const current LastRule = context.lastRule;\n if (rule.isRulesetLike(rule)) {\n context.lastRule = false;\n }\n\n if (rule.genC SS) {\n rule.genCSS(context, output);\n } else if (rul e.value) {\n output.add(rule.value.toString());\n }\n\ n context.lastRule = currentLastRule;\n\n if (!context.las tRule && rule.isVisible()) {\n output.add(context.compress ? '' : (`\\n${tabRuleStr}`));\n } else {\n context.lastRule = false;\n }\n }\n\n if (!this.root) {\n out put.add((context.compress ? '}' : `\\n${tabSetStr}}`));\n context.tab Level--;\n }\n\n if (!output.isEmpty() && !context.compress && thi s.firstRoot) {\n output.add('\\n');\n }\n },\n\n joinSel ectors(paths, context, selectors) {\n for (let s = 0; s < selectors.lengt h; s++) {\n this.joinSelector(paths, context, selectors[s]);\n }\n },\n\n joinSelector(paths, context, selector) {\n\n function c reateParenthesis(elementsToPak, originalElement) {\n let replacementP aren, j;\n if (elementsToPak.length === 0) {\n replace mentParen = new Paren(elementsToPak[0]);\n } else {\n const insideParent = new Array(elementsToPak.length);\n for (j = 0; j < elementsToPak.length; j++) {\n insideParent[j] = new E lement(\n null,\n elementsToPak[j] ,\n originalElement.isVariable,\n originalElement._index,\n originalElement._fileInfo\n );\n }\n replacementParen = new Pa ren(new Selector(insideParent));\n }\n return replacementP aren;\n }\n\n function createSelector(containedElement, originalEl ement) {\n let element, selector;\n element = new Element( null, containedElement, originalElement.isVariable, originalElement._index, orig inalElement._fileInfo);\n selector = new Selector([element]);\n return selector;\n }\n\n // joins selector path from `beginn ingPath` with selector path in `addPath`\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns concatenated pat h\n function addReplacementIntoPath(beginningPath, addPath, replacedEleme nt, originalSelector) {\n let newSelectorPath, lastSelector, newJoine dSelector;\n // our new selector path\n newSelectorPath = [];\n\n // construct the joined selector - if & is the first thing th is will be empty,\n // if not newJoinedSelector will be the last set of elements in the selector\n if (beginningPath.length > 0) {\n newSelectorPath = utils.copyArray(beginningPath);\n las tSelector = newSelectorPath.pop();\n newJoinedSelector = original Selector.createDerived(utils.copyArray(lastSelector.elements));\n }\n else {\n newJoinedSelector = originalSelector.createD erived([]);\n }\n\n if (addPath.length > 0) {\n // /deep/ is a CSS4 selector - (removed, so should deprecate)\n // that is valid without anything in front of it\n // so if t he & does not have a combinator that is \"\" or \" \" then\n // a nd there is a combinator on the parent, then grab that.\n // this also allows + a { & .b { .a & { ... though not sure why you would want to do th at\n let combinator = replacedElement.combinator;\n\n const parentEl = addPath[0].elements[0];\n if (combinator.emp tyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {\n combinator = parentEl.combinator;\n }\n // join t he elements so far with the first part of the parent\n newJoinedS elector.elements.push(new Element(\n combinator,\n parentEl.value,\n replacedElement.isVariable,\n replacedElement._index,\n replacedElement._fil eInfo\n ));\n newJoinedSelector.elements = newJoin edSelector.elements.concat(addPath[0].elements.slice(1));\n }\n\n // now add the joined selector - but only if it is not empty\n if (newJoinedSelector.elements.length !== 0) {\n newSelectorPat h.push(newJoinedSelector);\n }\n\n // put together the par ent selectors after the join (e.g. the rest of the parent)\n if (addP ath.length > 1) {\n let restOfPath = addPath.slice(1);\n restOfPath = restOfPath.map(function (selector) {\n re turn selector.createDerived(selector.elements, []);\n });\n newSelectorPath = newSelectorPath.concat(restOfPath);\n }\n return newSelectorPath;\n }\n\n // joins selector path from `beginningPath` with every selector path in `addPaths` array\n // ` replacedElement` contains element that is being replaced by `addPath`\n / / returns array with all concatenated paths\n function addAllReplacements IntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) {\ n let j;\n for (j = 0; j < beginningPath.length; j++) {\n const newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);\n result.push(newSe lectorPath);\n }\n return result;\n }\n\n fu nction mergeElementsOnToSelectors(elements, selectors) {\n let i, sel ;\n\n if (elements.length === 0) {\n return ;\n }\n if (selectors.length === 0) {\n selectors.pus h([ new Selector(elements) ]);\n return;\n }\n\n for (i = 0; (sel = selectors[i]); i++) {\n // if the previo us thing in sel is a parent this needs to join on to it\n if (sel .length > 0) {\n sel[sel.length - 1] = sel[sel.length - 1].cr eateDerived(sel[sel.length - 1].elements.concat(elements));\n }\n else {\n sel.push(new Selector(elements));\n }\n }\n }\n\n // replace all parent sele ctors inside `inSelector` by content of `context` array\n // resulting se lectors are returned inside `paths` array\n // returns true if `inSelecto r` contained at least one parent selector\n function replaceParentSelecto r(paths, context, inSelector) {\n // The paths are [[Selector]]\n // The first list is a list of comma separated selectors\n // The inner list is a list of inheritance separated selectors\n // e.g .\n // .a, .b {\n // .c {\n // }\n // }\n // == [[.a] [.c]] [[.b] [.c]]\n //\n let i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadPar entSelector = false, length, lastSelector;\n function findNestedSelec tor(element) {\n let maybeSelector;\n if (!(elemen t.value instanceof Paren)) {\n return null;\n }\n\n maybeSelector = element.value.value;\n if (! (maybeSelector instanceof Selector)) {\n return null;\n }\n\n return maybeSelector;\n }\n\n // the elements from the current selector so far\n currentElements = [];\n // the current list of new selectors to add to the path.\n // We will build it up. We initiate it with one empty selector as we \ "multiply\" the new selectors\n // by the parents\n newSel ectors = [\n []\n ];\n\n for (i = 0; (el = inSelector.elements[i]); i++) {\n // non parent reference element s just get added\n if (el.value !== '&') {\n c onst nestedSelector = findNestedSelector(el);\n if (nestedSel ector != null) {\n // merge the current list of non paren t selector elements\n // on to the current list of select ors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n const nestedPaths = [];\n let replaced;\n const replacedNewSelectors = [ ];\n replaced = replaceParentSelector(nestedPaths, contex t, nestedSelector);\n hadParentSelector = hadParentSelect or || replaced;\n // the nestedPaths array should have on ly one member - replaceParentSelector does not multiply selectors\n for (k = 0; k < nestedPaths.length; k++) {\n const replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);\n addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);\n }\n newSelectors = replacedNewSelectors;\n currentElements = [];\n } else {\n currentElements.push(el);\n }\n\n } else {\n hadParentSelector = true;\n // the new list of selectors to add\n selectorsMultiplied = []; \n\n // merge the current list of non parent selector element s\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n // loop through our current selectors\n for (j = 0; j < newSelectors.length; j++) {\n sel = newSelectors[j ];\n // if we don't have any parent paths, the & might be in a mixin so that it can be used\n // whether there are parents or not\n if (context.length === 0) {\n // the combinator used on el should now be applied to the next element instead so that\n // it is not lost\n if (sel.length > 0) {\n sel[ 0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fi leInfo));\n }\n selectorsM ultiplied.push(sel);\n }\n else {\ n // and the parent selectors\n for (k = 0; k < context.length; k++) {\n // We need to put the current selectors\n // then j oin the last selector's elements on to the parents selectors\n const newSelectorPath = addReplacementIntoPath(sel, context[k], el , inSelector);\n // add that to our new set of se lectors\n selectorsMultiplied.push(newSelectorPat h);\n }\n }\n }\n\n // our new selectors has been multiplied, so reset t he state\n newSelectors = selectorsMultiplied;\n currentElements = [];\n }\n }\n\n // if we have any elements left over (e.g. .a& .b == .b)\n // add them on to all the current selectors\n mergeElementsOnToSelectors(currentE lements, newSelectors);\n\n for (i = 0; i < newSelectors.length; i++) {\n length = newSelectors[i].length;\n if (length > 0) {\n paths.push(newSelectors[i]);\n l astSelector = newSelectors[i][length - 1];\n newSelectors[i][ length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.exten dList);\n }\n }\n\n return hadParentSelecto r;\n }\n\n function deriveSelector(visibilityInfo, deriveFrom) {\n const newSelector = deriveFrom.createDerived(deriveFrom.elements, de riveFrom.extendList, deriveFrom.evaldCondition);\n newSelector.copyVi sibilityInfo(visibilityInfo);\n return newSelector;\n }\n\n // joinSelector code follows\n let i, newPaths, hadParentSelector;\n \n newPaths = [];\n hadParentSelector = replaceParentSelector(newP aths, context, selector);\n\n if (!hadParentSelector) {\n if ( context.length > 0) {\n newPaths = [];\n for (i = 0; i < context.length; i++) {\n\n const concatenated = contex t[i].map(deriveSelector.bind(this, selector.visibilityInfo()));\n\n concatenated.push(selector);\n newPaths.push(concatena ted);\n }\n }\n else {\n new Paths = [[selector]];\n }\n }\n\n for (i = 0; i < newPa ths.length; i++) {\n paths.push(newPaths[i]);\n }\n\n }\n}) ;\n\nexport default Ruleset;\n","import Node from './node';\nimport Selector fro m './selector';\nimport Ruleset from './ruleset';\nimport Anonymous from './anon ymous';\n\nconst AtRule = function(\n name,\n value,\n rules,\n inde x,\n currentFileInfo,\n debugInfo,\n isRooted,\n visibilityInfo\n) { \n let i;\n\n this.name = name;\n this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value);\n if (rules) {\n if (Array.isArray(rules)) {\n this.rules = rules;\n } else {\n this.rules = [rules];\n this.rules[0].selectors = (new Sele ctor([], null, null, index, currentFileInfo)).createEmptySelectors();\n } \n for (i = 0; i < this.rules.length; i++) {\n this.rules[i].a llowImports = true;\n }\n this.setParent(this.rules, this);\n } \n this._index = index;\n this._fileInfo = currentFileInfo;\n this.debu gInfo = debugInfo;\n this.isRooted = isRooted || false;\n this.copyVisibil ityInfo(visibilityInfo);\n this.allowRoot = true;\n}\n\nAtRule.prototype = Ob ject.assign(new Node(), {\n type: 'AtRule',\n accept(visitor) {\n c onst value = this.value, rules = this.rules;\n if (rules) {\n this.rules = visitor.visitArray(rules);\n }\n if (value) {\n this.value = visitor.visit(value);\n }\n },\n\n isRulesetLike () {\n return this.rules || !this.isCharset();\n },\n\n isCharset() {\n return '@charset' === this.name;\n },\n\n genCSS(context, outp ut) {\n const value = this.value, rules = this.rules;\n output.add (this.name, this.fileInfo(), this.getIndex());\n if (value) {\n output.add(' ');\n value.genCSS(context, output);\n }\n if (rules) {\n this.outputRuleset(context, output, rules);\n } else {\n output.add(';');\n }\n },\n\n eval(context) {\n let mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules;\n\n // media stored inside other atrule should not bubble ove r it\n // backpup media bubbling information\n mediaPathBackup = c ontext.mediaPath;\n mediaBlocksBackup = context.mediaBlocks;\n // deleted media bubbling information\n context.mediaPath = [];\n con text.mediaBlocks = [];\n\n if (value) {\n value = value.eval(c ontext);\n }\n if (rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n rules = [rules[0].eval(context)];\n rules[0].root = true;\n }\n // restore media bubbling information\n context.mediaPath = m ediaPathBackup;\n context.mediaBlocks = mediaBlocksBackup;\n\n ret urn new AtRule(this.name, value, rules,\n this.getIndex(), this.fileI nfo(), this.debugInfo, this.isRooted, this.visibilityInfo());\n },\n\n var iable(name) {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.variable.call(this.rules[0], name);\n }\n } ,\n\n find() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.find.apply(this.rules[0], arguments);\n }\ n },\n\n rulesets() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the ru le\n return Ruleset.prototype.rulesets.apply(this.rules[0]);\n }\n },\n\n outputRuleset(context, output, rules) {\n const ruleCnt = rules.length;\n let i;\n context.tabLevel = (context.tabLevel | 0) + 1;\n\n // Compressed\n if (context.compress) {\n output.add('{');\n for (i = 0; i < ruleCnt; i++) {\n r ules[i].genCSS(context, output);\n }\n output.add('}');\n context.tabLevel--;\n return;\n }\n\n // Non -compressed\n const tabSetStr = `\\n${Array(context.tabLevel).join(' ')} `, tabRuleStr = `${tabSetStr} `;\n if (!ruleCnt) {\n output.a dd(` {${tabSetStr}}`);\n } else {\n output.add(` {${tabRuleStr }`);\n rules[0].genCSS(context, output);\n for (i = 1; i < ruleCnt; i++) {\n output.add(tabRuleStr);\n rules [i].genCSS(context, output);\n }\n output.add(`${tabSetStr }}`);\n }\n\n context.tabLevel--;\n }\n});\n\nexport default At Rule;\n","import Node from './node';\nimport contexts from '../contexts';\nimpor t * as utils from '../utils';\n\nconst DetachedRuleset = function(ruleset, frame s) {\n this.ruleset = ruleset;\n this.frames = frames;\n this.setParent (this.ruleset, this);\n};\n\nDetachedRuleset.prototype = Object.assign(new Node( ), {\n type: 'DetachedRuleset',\n evalFirst: true,\n\n accept(visitor) {\n this.ruleset = visitor.visit(this.ruleset);\n },\n\n eval(conte xt) {\n const frames = this.frames || utils.copyArray(context.frames);\n return new DetachedRuleset(this.ruleset, frames);\n },\n\n callEval (context) {\n return this.ruleset.eval(this.frames ? new contexts.Eval(co ntext, this.frames.concat(context.frames)) : context);\n }\n});\n\nexport def ault DetachedRuleset;\n","import Node from './node';\nimport unitConversions fro m '../data/unit-conversions';\nimport * as utils from '../utils';\n\nconst Unit = function(numerator, denominator, backupUnit) {\n this.numerator = numerator ? utils.copyArray(numerator).sort() : [];\n this.denominator = denominator ? utils.copyArray(denominator).sort() : [];\n if (backupUnit) {\n this. backupUnit = backupUnit;\n } else if (numerator && numerator.length) {\n this.backupUnit = numerator[0];\n }\n};\n\nUnit.prototype = Object.assign( new Node(), {\n type: 'Unit',\n\n clone() {\n return new Unit(utils .copyArray(this.numerator), utils.copyArray(this.denominator), this.backupUnit); \n },\n\n genCSS(context, output) {\n // Dimension checks the unit is singular and throws an error if in strict math mode.\n const strictUni ts = context && context.strictUnits;\n if (this.numerator.length === 1) { \n output.add(this.numerator[0]); // the ideal situation\n } e lse if (!strictUnits && this.backupUnit) {\n output.add(this.backupUn it);\n } else if (!strictUnits && this.denominator.length) {\n output.add(this.denominator[0]);\n }\n },\n\n toString() {\n let i, returnStr = this.numerator.join('*');\n for (i = 0; i < this.den ominator.length; i++) {\n returnStr += `/${this.denominator[i]}`;\n }\n return returnStr;\n },\n\n compare(other) {\n retu rn this.is(other.toString()) ? 0 : undefined;\n },\n\n is(unitString) {\n return this.toString().toUpperCase() === unitString.toUpperCase();\n } ,\n\n isLength() {\n return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|e x|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS());\n },\n\n isEmpty() {\n return this.numerator.length === 0 && this.denominator.length === 0;\n }, \n\n isSingular() {\n return this.numerator.length <= 1 && this.denomi nator.length === 0;\n },\n\n map(callback) {\n let i;\n\n fo r (i = 0; i < this.numerator.length; i++) {\n this.numerator[i] = cal lback(this.numerator[i], false);\n }\n\n for (i = 0; i < this.deno minator.length; i++) {\n this.denominator[i] = callback(this.denomina tor[i], true);\n }\n },\n\n usedUnits() {\n let group;\n const result = {};\n let mapUnit;\n let groupName;\n\n mapUnit = function (atomicUnit) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {\n result[groupName] = atomicUnit;\n }\n\n return atomi cUnit;\n };\n\n for (groupName in unitConversions) {\n if (unitConversions.hasOwnProperty(groupName)) {\n group = unitCo nversions[groupName];\n\n this.map(mapUnit);\n }\n }\n\n return result;\n },\n\n cancel() {\n const counter = {};\n let atomicUnit;\n let i;\n\n for (i = 0; i < this. numerator.length; i++) {\n atomicUnit = this.numerator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;\n }\n\n f or (i = 0; i < this.denominator.length; i++) {\n atomicUnit = this.de nominator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) - 1; \n }\n\n this.numerator = [];\n this.denominator = [];\n\n for (atomicUnit in counter) {\n if (counter.hasOwnProperty(ato micUnit)) {\n const count = counter[atomicUnit];\n\n if (count > 0) {\n for (i = 0; i < count; i++) {\n this.numerator.push(atomicUnit);\n }\n } else if (count < 0) {\n for (i = 0; i < -count; i+ +) {\n this.denominator.push(atomicUnit);\n }\n }\n }\n }\n\n this.numerator.s ort();\n this.denominator.sort();\n }\n});\n\nexport default Unit;\n", "import Node from './node';\nimport unitConversions from '../data/unit-conversio ns';\nimport Unit from './unit';\nimport Color from './color';\n\n//\n// A numbe r with a unit\n//\nconst Dimension = function(value, unit) {\n this.value = p arseFloat(value);\n if (isNaN(this.value)) {\n throw new Error('Dimens ion is not a number.');\n }\n this.unit = (unit && unit instanceof Unit) ? unit :\n new Unit(unit ? [unit] : undefined);\n this.setParent(this.u nit, this);\n};\n\nDimension.prototype = Object.assign(new Node(), {\n type: 'Dimension',\n\n accept(visitor) {\n this.unit = visitor.visit(this.un it);\n },\n\n eval(context) {\n return this;\n },\n\n toColor () {\n return new Color([this.value, this.value, this.value]);\n },\n\ n genCSS(context, output) {\n if ((context && context.strictUnits) && !this.unit.isSingular()) {\n throw new Error(`Multiple units in dimen sion. Correct the units or use the unit function. Bad unit: ${this.unit.toString ()}`);\n }\n\n const value = this.fround(context, this.value);\n let strValue = String(value);\n\n if (value !== 0 && value < 0.0000 01 && value > -0.000001) {\n // would be output 1e-6 etc.\n strValue = value.toFixed(20).replace(/0+$/, '');\n }\n\n if (con text && context.compress) {\n // Zero values doesn't need a unit\n if (value === 0 && this.unit.isLength()) {\n output.add( strValue);\n return;\n }\n\n // Float value s doesn't need a leading zero\n if (value > 0 && value < 1) {\n strValue = (strValue).substr(1);\n }\n }\n\n output.add(strValue);\n this.unit.genCSS(context, output);\n },\n\n // In an operation between two Dimensions,\n // we default to the first Dime nsion's unit,\n // so `1px + 2` will yield `3px`.\n operate(context, op, o ther) {\n /* jshint noempty:false */\n let value = this._operate(c ontext, op, this.value, other.value);\n let unit = this.unit.clone();\n\n if (op === '+' || op === '-') {\n if (unit.numerator.length = == 0 && unit.denominator.length === 0) {\n unit = other.unit.clon e();\n if (this.unit.backupUnit) {\n unit.back upUnit = this.unit.backupUnit;\n }\n } else if (other. unit.numerator.length === 0 && unit.denominator.length === 0) {\n // do nothing\n } else {\n other = other.convertTo(th is.unit.usedUnits());\n\n if (context.strictUnits && other.unit.t oString() !== unit.toString()) {\n throw new Error(`Incompati ble units. Change the units or use the unit function. `\n + `Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`);\n }\n\n value = this._operate(context, op, this.value, othe r.value);\n }\n } else if (op === '*') {\n unit.num erator = unit.numerator.concat(other.unit.numerator).sort();\n unit.d enominator = unit.denominator.concat(other.unit.denominator).sort();\n unit.cancel();\n } else if (op === '/') {\n unit.numerator = unit.numerator.concat(other.unit.denominator).sort();\n unit.denomin ator = unit.denominator.concat(other.unit.numerator).sort();\n unit.c ancel();\n }\n return new Dimension(value, unit);\n },\n\n c ompare(other) {\n let a, b;\n\n if (!(other instanceof Dimension)) {\n return undefined;\n }\n\n if (this.unit.isEmpty() || other.unit.isEmpty()) {\n a = this;\n b = other;\n } else {\n a = this.unify();\n b = other.unify();\n if (a.unit.compare(b.unit) !== 0) {\n return undefined;\n }\n }\n\n return Node.numericCompare(a.value, b.value) ;\n },\n\n unify() {\n return this.convertTo({ length: 'px', durati on: 's', angle: 'rad' });\n },\n\n convertTo(conversions) {\n let v alue = this.value;\n const unit = this.unit.clone();\n let i;\n let groupName;\n let group;\n let targetUnit;\n let de rivedConversions = {};\n let applyUnit;\n\n if (typeof conversions === 'string') {\n for (i in unitConversions) {\n if ( unitConversions[i].hasOwnProperty(conversions)) {\n derivedCo nversions = {};\n derivedConversions[i] = conversions;\n }\n }\n conversions = derivedConversions;\n }\n applyUnit = function (atomicUnit, denominator) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit)) {\n if (denominator) {\n value = value / (group[ato micUnit] / group[targetUnit]);\n } else {\n va lue = value * (group[atomicUnit] / group[targetUnit]);\n }\n\n return targetUnit;\n }\n\n return atomicUnit; \n };\n\n for (groupName in conversions) {\n if (conver sions.hasOwnProperty(groupName)) {\n targetUnit = conversions[gro upName];\n group = unitConversions[groupName];\n\n unit.map(applyUnit);\n }\n }\n\n unit.cancel();\n\n return new Dimension(value, unit);\n }\n});\n\nexport default Dimension; \n","import Node from './node';\nimport Color from './color';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Co nstants.Math;\n\n\nconst Operation = function(op, operands, isSpaced) {\n thi s.op = op.trim();\n this.operands = operands;\n this.isSpaced = isSpaced;\ n};\n\nOperation.prototype = Object.assign(new Node(), {\n type: 'Operation', \n\n accept(visitor) {\n this.operands = visitor.visitArray(this.opera nds);\n },\n\n eval(context) {\n let a = this.operands[0].eval(cont ext), b = this.operands[1].eval(context), op;\n\n if (context.isMathOn(th is.op)) {\n op = this.op === './' ? '/' : this.op;\n if (a instanceof Dimension && b instanceof Color) {\n a = a.toColor(); \n }\n if (b instanceof Dimension && a instanceof Color) { \n b = b.toColor();\n }\n if (!a.operate || !b.operate) {\n if (\n (a instanceof Operatio n || b instanceof Operation)\n && a.op === '/' && context.mat h === MATH.PARENS_DIVISION\n ) {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n t hrow { type: 'Operation',\n message: 'Operation on an invalid type' };\n }\n\n return a.operate(context, op, b);\n } else {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n },\n\n genCSS(context, output) {\n this.operands[0].gen CSS(context, output);\n if (this.isSpaced) {\n output.add(' ') ;\n }\n output.add(this.op);\n if (this.isSpaced) {\n output.add(' ');\n }\n this.operands[1].genCSS(context, outp ut);\n }\n});\n\nexport default Operation;\n","import Node from './node';\nim port Paren from './paren';\nimport Comment from './comment';\nimport Dimension f rom './dimension';\nimport * as Constants from '../constants';\nconst MATH = Con stants.Math;\n\nconst Expression = function(value, noSpacing) {\n this.value = value;\n this.noSpacing = noSpacing;\n if (!value) {\n throw new Error('Expression requires an array parameter');\n }\n};\n\nExpression.protot ype = Object.assign(new Node(), {\n type: 'Expression',\n\n accept(visitor ) {\n this.value = visitor.visitArray(this.value);\n },\n\n eval(co ntext) {\n let returnValue;\n const mathOn = context.isMathOn();\n const inParenthesis = this.parens;\n\n let doubleParen = false;\n if (inParenthesis) {\n context.inParenthesis();\n }\n if (this.value.length > 1) {\n returnValue = new Expression(th is.value.map(function (e) {\n if (!e.eval) {\n return e;\n }\n return e.eval(context);\n }), this.noSpacing);\n } else if (this.value.length === 1) {\n if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) { \n doubleParen = true;\n }\n returnValue = this.value[0].eval(context);\n } else {\n returnValue = this;\ n }\n if (inParenthesis) {\n context.outOfParenthesis() ;\n }\n if (this.parens && this.parensInOp && !mathOn && !doublePa ren \n && (!(returnValue instanceof Dimension))) {\n retur nValue = new Paren(returnValue);\n }\n return returnValue;\n }, \n\n genCSS(context, output) {\n for (let i = 0; i < this.value.length ; i++) {\n this.value[i].genCSS(context, output);\n if (!t his.noSpacing && i + 1 < this.value.length) {\n output.add(' ');\ n }\n }\n },\n\n throwAwayComments() {\n this.val ue = this.value.filter(function(v) {\n return !(v instanceof Comment) ;\n });\n }\n});\n\nexport default Expression;\n","import Expression f rom '../tree/expression';\n\nclass functionCaller {\n constructor(name, conte xt, index, currentFileInfo) {\n this.name = name.toLowerCase();\n this.index = index;\n this.context = context;\n this.currentFileIn fo = currentFileInfo;\n\n this.func = context.frames[0].functionRegistry. get(this.name);\n }\n\n isValid() {\n return Boolean(this.func);\n }\n\n call(args) {\n if (!(Array.isArray(args))) {\n arg s = [args];\n }\n const evalArgs = this.func.evalArgs;\n if (evalArgs !== false) {\n args = args.map(a => a.eval(this.context)); \n }\n const commentFilter = item => !(item.type === 'Comment');\n \n // This code is terrible and should be replaced as per this issue...\n // https://github.com/less/less.js/issues/2477\n args = args\n .filter(commentFilter)\n .map(item => {\n if (item.type === 'Expression') {\n const subNodes = item.value. filter(commentFilter);\n if (subNodes.length === 1) {\n // https://github.com/less/less.js/issues/3616\n if (item.parens && subNodes[0].op === '/') {\n return item;\n }\n return subN odes[0];\n } else {\n return new Expre ssion(subNodes);\n }\n }\n retu rn item;\n });\n\n if (evalArgs === false) {\n retu rn this.func(this.context, ...args);\n }\n\n return this.func(...a rgs);\n }\n}\n\nexport default functionCaller;\n","/*! ********************** *******************************************************\r\nCopyright (c) Microso ft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this s oftware for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOF TWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGA RD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND F ITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIR ECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS O F USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n********************************************************** ******************* */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ( { __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r \n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty .call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexp ort function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== nul l)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is n ot a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__ .prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function( ) {\r\n __assign = Object.assign || function __assign(t) {\r\n for (va r s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i]; \r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign. apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object. getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.ge tOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t [p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __de corate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key ) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n e lse for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport funct ion __param(paramIndex, decorator) {\r\n return function (target, key) { deco rator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadat aKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflec t.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue) ;\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function ( resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator .next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.va lue).then(fulfilled, rejected); }\r\n step((generator = generator.apply(t hisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __gen erator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n f unction verb(n) { return function (v) { return step([n, v]); }; }\r\n functio n step(op) {\r\n if (f) throw new TypeError(\"Generator is already execut ing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0 ) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); con tinue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; conti nue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _ .label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t & & _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { o p = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1 ]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nex port var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k 2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function _ _exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.pro totype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport f unction __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.it erator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && ty peof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i ++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport fu nction __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol. iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) a r.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"] )) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n } \r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar. concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r \nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = argument s.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.le ngth; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\ nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.le ngth === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from , 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to. concat(ar || from);\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport fun ction __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyn cIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = f unction (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || r esume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catc h (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __a wait ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\ r\n function fulfill(value) { resume(\"next\", value); }\r\n function reje ct(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __ asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb( \"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = fu nction () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? functi on (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defin ed.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && fun ction (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle( resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reje ct, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }) ; }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\ r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { val ue: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.definePrope rty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\ n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod ! = null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnPrope rty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(res ult, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod ) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\n export function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (ki nd === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : ki nd === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\ nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r \n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defin ed without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private m ember to an object whose class did not declare it\");\r\n return (kind === \" a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value) ), value;\r\n}\r\n","import Node from './node';\nimport Anonymous from './anonym ous';\nimport FunctionCaller from '../functions/function-caller';\n\n//\n// A fu nction call node.\n//\nconst Call = function(name, args, index, currentFileInfo) {\n this.name = name;\n this.args = args;\n this.calc = name === 'calc ';\n this._index = index;\n this._fileInfo = currentFileInfo;\n}\n\nCall.p rototype = Object.assign(new Node(), {\n type: 'Call',\n\n accept(visitor) {\n if (this.args) {\n this.args = visitor.visitArray(this.ar gs);\n }\n },\n\n //\n // When evaluating a function call,\n // we either find the function in the functionRegistry,\n // in which case we call it, passing the evaluated arguments,\n // if this returns null or we c annot find the function, we\n // simply print it out as it appeared originall y [2].\n //\n // The reason why we evaluate the arguments, is in the case where\n // we try to pass a variable to a function, like: `saturate(@color)`. \n // The function should receive the value, not the variable.\n //\n e val(context) {\n /**\n * Turn off math for calc(), and switch bac k on for evaluating nested functions\n */\n const currentMathCont ext = context.mathOn;\n context.mathOn = !this.calc;\n if (this.ca lc || context.inCalc) {\n context.enterCalc();\n }\n\n const exitCalc = () => {\n if (this.calc || context.inCalc) {\n context.exitCalc();\n }\n context.mathOn = curre ntMathContext;\n };\n\n let result;\n const funcCaller = ne w FunctionCaller(this.name, context, this.getIndex(), this.fileInfo());\n\n if (funcCaller.isValid()) {\n try {\n result = func Caller.call(this.args);\n exitCalc();\n } catch (e) {\ n if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) {\n throw e;\n }\n throw { \n type: e.type || 'Runtime',\n message: `Error e valuating function \\`${this.name}\\`${e.message ? `: ${e.message}` : ''}`,\n index: this.getIndex(), \n filename: this.fi leInfo().filename,\n line: e.lineNumber,\n column: e.columnNumber\n };\n }\n }\n\n if (result !== null && result !== undefined) {\n // Results that tha t are not nodes are cast as Anonymous nodes\n // Falsy values or bool eans are returned as empty nodes\n if (!(result instanceof Node)) {\n if (!result || result === true) {\n result = new Anonymous(null); \n }\n else {\n result = new Anonymous(result.toString()); \n }\n \n }\n result._index = this._index;\n res ult._fileInfo = this._fileInfo;\n return result;\n }\n\n const args = this.args.map(a => a.eval(context));\n exitCalc();\n\n return new Call(this.name, args, this.getIndex(), this.fileInfo());\n },\ n\n genCSS(context, output) {\n output.add(`${this.name}(`, this.fileI nfo(), this.getIndex());\n\n for (let i = 0; i < this.args.length; i++) { \n this.args[i].genCSS(context, output);\n if (i + 1 < thi s.args.length) {\n output.add(', ');\n }\n }\n\ n output.add(')');\n }\n});\n\nexport default Call;\n","import Node fr om './node';\nimport Call from './call';\n\nconst Variable = function(name, inde x, currentFileInfo) {\n this.name = name;\n this._index = index;\n this ._fileInfo = currentFileInfo;\n};\n\nVariable.prototype = Object.assign(new Node (), {\n type: 'Variable',\n\n eval(context) {\n let variable, name = this.name;\n\n if (name.indexOf('@@') === 0) {\n name = `@${ new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).valu e}`;\n }\n\n if (this.evaluating) {\n throw { type: 'Na me',\n message: `Recursive variable definition for ${name}`,\n filename: this.fileInfo().filename,\n index: this.ge tIndex() };\n }\n\n this.evaluating = true;\n\n variable = this.find(context.frames, function (frame) {\n const v = frame.variab le(name);\n if (v) {\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.le ngth - 1];\n importantScope.important = v.important;\n }\n // If in calc, wrap vars in a function call to casca de evaluate args first\n if (context.inCalc) {\n return (new Call('_SELF', [v.value])).eval(context);\n }\n else {\n return v.value.eval(context);\n }\n }\n });\n if (variable) {\n this. evaluating = false;\n return variable;\n } else {\n throw { type: 'Name',\n message: `variable ${name} is undefined` ,\n filename: this.fileInfo().filename,\n index: t his.getIndex() };\n }\n },\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n});\n\nexport default Variable;\n","import Node from './node';\nimport Declaration from './de claration';\n\nconst Property = function(name, index, currentFileInfo) {\n th is.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo; \n};\n\nProperty.prototype = Object.assign(new Node(), {\n type: 'Property',\ n\n eval(context) {\n let property;\n const name = this.name;\n // TODO: shorten this reference\n const mergeRules = context.plug inManager.less.visitors.ToCSSVisitor.prototype._mergeRules;\n\n if (this. evaluating) {\n throw { type: 'Name',\n message: `Recu rsive property reference for ${name}`,\n filename: this.fileInfo( ).filename,\n index: this.getIndex() };\n }\n\n thi s.evaluating = true;\n\n property = this.find(context.frames, function (f rame) {\n let v;\n const vArr = frame.property(name);\n if (vArr) {\n for (let i = 0; i < vArr.length; i++) {\n v = vArr[i];\n\n vArr[i] = new Declaration (v.name,\n v.value,\n v.important, \n v.merge,\n v.index,\n v.currentFileInfo,\n v.inline,\n v.variable\n );\n }\n mergeRules(vArr);\n\n v = vArr[vArr.length - 1];\n if (v.important) {\n const importantScope = context.impo rtantScope[context.importantScope.length - 1];\n importantSco pe.important = v.important;\n }\n v = v.value.eval (context);\n return v;\n }\n });\n if (p roperty) {\n this.evaluating = false;\n return property;\n } else {\n throw { type: 'Name',\n message: `P roperty '${name}' is undefined`,\n filename: this.currentFileInfo .filename,\n index: this.index };\n }\n },\n\n find( obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n ret urn null;\n }\n});\n\nexport default Property;\n","import Node from './node'; \n\nconst Attribute = function(key, op, value) {\n this.key = key;\n this. op = op;\n this.value = value;\n}\n\nAttribute.prototype = Object.assign(new Node(), {\n type: 'Attribute',\n\n eval(context) {\n return new Att ribute(this.key.eval ? this.key.eval(context) : this.key,\n this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value);\n } ,\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n },\n\n toCSS(context) {\n let value = this.key.toCSS ? this.key.toCS S(context) : this.key;\n\n if (this.op) {\n value += this.op;\ n value += (this.value.toCSS ? this.value.toCSS(context) : this.value );\n }\n\n return `[${value}]`;\n }\n});\n\nexport default Attr ibute;\n","import Node from './node';\nimport Variable from './variable';\nimpor t Property from './property';\n\n\nconst Quoted = function(str, content, escaped , index, currentFileInfo) {\n this.escaped = (escaped == null) ? true : escap ed;\n this.value = content || '';\n this.quote = str.charAt(0);\n this. _index = index;\n this._fileInfo = currentFileInfo;\n this.variableRegex = /@\\{([\\w-]+)\\}/g;\n this.propRegex = /\\$\\{([\\w-]+)\\}/g;\n this.all owRoot = escaped;\n};\n\nQuoted.prototype = Object.assign(new Node(), {\n typ e: 'Quoted',\n\n genCSS(context, output) {\n if (!this.escaped) {\n output.add(this.quote, this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n if (!this.escaped) {\n output .add(this.quote);\n }\n },\n\n containsVariables() {\n retur n this.value.match(this.variableRegex);\n },\n\n eval(context) {\n const that = this;\n let value = this.value;\n const variableRepla cement = function (_, name) {\n const v = new Variable(`@${name}`, th at.getIndex(), that.fileInfo()).eval(context, true);\n return (v inst anceof Quoted) ? v.value : v.toCSS();\n };\n const propertyReplace ment = function (_, name) {\n const v = new Property(`$${name}`, that .getIndex(), that.fileInfo()).eval(context, true);\n return (v instan ceof Quoted) ? v.value : v.toCSS();\n };\n function iterativeRepla ce(value, regexp, replacementFnc) {\n let evaluatedValue = value;\n do {\n value = evaluatedValue.toString();\n evaluatedValue = value.replace(regexp, replacementFnc);\n } while (value !== evaluatedValue);\n return evaluatedValue;\n }\n value = iterativeReplace(value, this.variableRegex, variableReplacement);\n value = iterativeReplace(value, this.propRegex, propertyReplacement);\n return new Quoted(this.quote + value + this.quote, value, this.escaped, t his.getIndex(), this.fileInfo());\n },\n\n compare(other) {\n // wh en comparing quoted strings allow the quote to differ\n if (other.type == = 'Quoted' && !this.escaped && !other.escaped) {\n return Node.numeri cCompare(this.value, other.value);\n } else {\n return other.t oCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n }\n});\n \nexport default Quoted;\n","import Node from './node';\n\nfunction escapePath(p ath) {\n return path.replace(/[\\(\\)'\"\\s]/g, function(match) { return `\\\ \${match}`; });\n}\n\nconst URL = function(val, index, currentFileInfo, isEvald) {\n this.value = val;\n this._index = index;\n this._fileInfo = curren tFileInfo;\n this.isEvald = isEvald;\n};\n\nURL.prototype = Object.assign(new Node(), {\n type: 'Url',\n\n accept(visitor) {\n this.value = visi tor.visit(this.value);\n },\n\n genCSS(context, output) {\n output. add('url(');\n this.value.genCSS(context, output);\n output.add(') ');\n },\n\n eval(context) {\n const val = this.value.eval(context) ;\n let rootpath;\n\n if (!this.isEvald) {\n // Add the rootpath if the URL requires a rewrite\n rootpath = this.fileInfo() && this.fileInfo().rootpath;\n if (typeof rootpath === 'string' &&\n typeof val.value === 'string' &&\n context.pathReq uiresRewrite(val.value)) {\n if (!val.quote) {\n rootpath = escapePath(rootpath);\n }\n val.valu e = context.rewritePath(val.value, rootpath);\n } else {\n val.value = context.normalizePath(val.value);\n }\n\n // Add url args if enabled\n if (context.urlArgs) {\n if (!val.value.match(/^\\s*data:/)) {\n const delimiter = va l.value.indexOf('?') === -1 ? '?' : '&';\n const urlArgs = de limiter + context.urlArgs;\n if (val.value.indexOf('#') !== - 1) {\n val.value = val.value.replace('#', `${urlArgs}#`); \n } else {\n val.value += urlArgs;\n }\n }\n }\n }\n\n ret urn new URL(val, this.getIndex(), this.fileInfo(), true);\n }\n});\n\nexport default URL;\n","import Ruleset from './ruleset';\nimport Value from './value';\ nimport Selector from './selector';\nimport Anonymous from './anonymous';\nimpor t Expression from './expression';\nimport AtRule from './atrule';\nimport * as u tils from '../utils';\n\nconst Media = function(value, features, index, currentF ileInfo, visibilityInfo) {\n this._index = index;\n this._fileInfo = curre ntFileInfo;\n\n const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.features = new Value(featur es);\n this.rules = [new Ruleset(selectors, value)];\n this.rules[0].allow Imports = true;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoo t = true;\n this.setParent(selectors, this);\n this.setParent(this.feature s, this);\n this.setParent(this.rules, this);\n};\n\nMedia.prototype = Object .assign(new AtRule(), {\n type: 'Media',\n\n isRulesetLike() {\n re turn true;\n },\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n if (thi s.rules) {\n this.rules = visitor.visitArray(this.rules);\n }\ n },\n\n genCSS(context, output) {\n output.add('@media ', this._fi leInfo, this._index);\n this.features.genCSS(context, output);\n t his.outputRuleset(context, output, this.rules);\n },\n\n eval(context) {\n if (!context.mediaBlocks) {\n context.mediaBlocks = [];\n context.mediaPath = [];\n }\n\n const media = new Media(nu ll, [], this._index, this._fileInfo, this.visibilityInfo());\n if (this.d ebugInfo) {\n this.rules[0].debugInfo = this.debugInfo;\n media.debugInfo = this.debugInfo;\n }\n \n media.features = this.features.eval(context);\n\n context.mediaPath.push(media);\n context.mediaBlocks.push(media);\n\n this.rules[0].functionRegistry = co ntext.frames[0].functionRegistry.inherit();\n context.frames.unshift(this .rules[0]);\n media.rules = [this.rules[0].eval(context)];\n conte xt.frames.shift();\n\n context.mediaPath.pop();\n\n return context .mediaPath.length === 0 ? media.evalTop(context) :\n media.evalNested (context);\n },\n\n evalTop(context) {\n let result = this;\n\n // Render all dependent Media blocks.\n if (context.mediaBlocks.lengt h > 1) {\n const selectors = (new Selector([], null, null, this.getIn dex(), this.fileInfo())).createEmptySelectors();\n result = new Rules et(selectors, context.mediaBlocks);\n result.multiMedia = true;\n result.copyVisibilityInfo(this.visibilityInfo());\n this.setP arent(result, this);\n }\n\n delete context.mediaBlocks;\n delete context.mediaPath;\n\n return result;\n },\n\n evalNested(co ntext) {\n let i;\n let value;\n const path = context.media Path.concat([this]);\n\n // Extract the media-query conditions separated with `,` (OR).\n for (i = 0; i < path.length; i++) {\n value = path[i].features instanceof Value ?\n path[i].features.value : p ath[i].features;\n path[i] = Array.isArray(value) ? value : [value];\ n }\n\n // Trace all permutations to generate the resulting media- query.\n //\n // (a, b and c) with nested (d, e) ->\n // a and d\n // a and e\n // b and c and d\n // b an d c and e\n this.features = new Value(this.permute(path).map(path => {\n path = path.map(fragment => fragment.toCSS ? fragment : new Anonymous (fragment));\n\n for (i = path.length - 1; i > 0; i--) {\n path.splice(i, 0, new Anonymous('and'));\n }\n\n retu rn new Expression(path);\n }));\n this.setParent(this.features, th is);\n\n // Fake a tree-node that doesn't output anything.\n retur n new Ruleset([], []);\n },\n\n permute(arr) {\n if (arr.length === 0) {\n return [];\n } else if (arr.length === 1) {\n return arr[0];\n } else {\n const result = [];\n const rest = this.permute(arr.slice(1));\n for (let i = 0; i < rest. length; i++) {\n for (let j = 0; j < arr[0].length; j++) {\n result.push([arr[0][j]].concat(rest[i]));\n }\n }\n return result;\n }\n },\n\n bubbleSelectors (selectors) {\n if (!selectors) {\n return;\n }\n this.rules = [new Ruleset(utils.copyArray(selectors), [this.rules[0]])];\n this.setParent(this.rules, this);\n }\n});\n\nexport default Media;\n","i mport Node from './node';\nimport Media from './media';\nimport URL from './url' ;\nimport Quoted from './quoted';\nimport Ruleset from './ruleset';\nimport Anon ymous from './anonymous';\nimport * as utils from '../utils';\nimport LessError from '../less-error';\n\n//\n// CSS @import node\n//\n// The general strategy he re is that we don't want to wait\n// for the parsing to be completed, before we start importing\n// the file. That's because in the context of a browser,\n// mo st of the time will be spent waiting for the server to respond.\n//\n// On creat ion, we push the import path to our import queue, though\n// `import,push`, we a lso pass it a callback, which it'll call once\n// the file has been fetched, and parsed.\n//\nconst Import = function(path, features, options, index, currentFil eInfo, visibilityInfo) {\n this.options = options;\n this._index = index;\ n this._fileInfo = currentFileInfo;\n this.path = path;\n this.features = features;\n this.allowRoot = true;\n\n if (this.options.less !== undefi ned || this.options.inline) {\n this.css = !this.options.less || this.opt ions.inline;\n } else {\n const pathValue = this.getPath();\n i f (pathValue && /[#\\.\\&\\?]css([\\?;].*)?$/.test(pathValue)) {\n th is.css = true;\n }\n }\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.features, this);\n this.setParent(this.path, this);\n };\n\nImport.prototype = Object.assign(new Node(), {\n type: 'Import',\n\n accept(visitor) {\n if (this.features) {\n this.features = vi sitor.visit(this.features);\n }\n this.path = visitor.visit(this.p ath);\n if (!this.options.isPlugin && !this.options.inline && this.root) {\n this.root = visitor.visit(this.root);\n }\n },\n\n g enCSS(context, output) {\n if (this.css && this.path._fileInfo.reference === undefined) {\n output.add('@import ', this._fileInfo, this._index );\n this.path.genCSS(context, output);\n if (this.feature s) {\n output.add(' ');\n this.features.genCSS(con text, output);\n }\n output.add(';');\n }\n },\n \n getPath() {\n return (this.path instanceof URL) ?\n this .path.value.value : this.path.value;\n },\n\n isVariableImport() {\n let path = this.path;\n if (path instanceof URL) {\n path = path.value;\n }\n if (path instanceof Quoted) {\n retur n path.containsVariables();\n }\n\n return true;\n },\n\n ev alForImport(context) {\n let path = this.path;\n\n if (path instan ceof URL) {\n path = path.value;\n }\n\n return new Imp ort(path.eval(context), this.features, this.options, this._index, this._fileInfo , this.visibilityInfo());\n },\n\n evalPath(context) {\n const path = this.path.eval(context);\n const fileInfo = this._fileInfo;\n\n if (!(path instanceof URL)) {\n // Add the rootpath if the URL requi res a rewrite\n const pathValue = path.value;\n if (fileIn fo &&\n pathValue &&\n context.pathRequiresRewrite (pathValue)) {\n path.value = context.rewritePath(pathValue, file Info.rootpath);\n } else {\n path.value = context.norm alizePath(path.value);\n }\n }\n\n return path;\n }, \n\n eval(context) {\n const result = this.doEval(context);\n i f (this.options.reference || this.blocksVisibility()) {\n if (result. length || result.length === 0) {\n result.forEach(function (node) {\n node.addVisibilityBlock();\n }\n );\n } else {\n result.addVisibilityBlock();\n }\n }\n return result;\n },\n\n doEval(context) { \n let ruleset;\n let registry;\n const features = this.fea tures && this.features.eval(context);\n\n if (this.options.isPlugin) {\n if (this.root && this.root.eval) {\n try {\n this.root.eval(context);\n }\n catch (e) {\n e.message = 'Plugin error during evaluation';\n throw new LessError(e, this.root.imports, this.root.filename);\n }\n }\n registry = context.frames[0] && context .frames[0].functionRegistry;\n if ( registry && this.root && this.roo t.functions ) {\n registry.addMultiple( this.root.functions );\n }\n\n return [];\n }\n\n if (this.skip) {\n if (typeof this.skip === 'function') {\n this.skip = t his.skip();\n }\n if (this.skip) {\n return [];\n }\n }\n if (this.options.inline) {\n const contents = new Anonymous(this.root, 0,\n {\n filename: this.importedFilename,\n reference: this.path. _fileInfo && this.path._fileInfo.reference\n }, true, true);\n\n return this.features ? new Media([contents], this.features.value) : [ contents];\n } else if (this.css) {\n const newImport = new Im port(this.evalPath(context), features, this.options, this._index);\n if (!newImport.css && this.error) {\n throw this.error;\n }\n return newImport;\n } else if (this.root) {\n ruleset = new Ruleset(null, utils.copyArray(this.root.rules));\n r uleset.evalImports(context);\n\n return this.features ? new Media(rul eset.rules, this.features.value) : ruleset.rules;\n } else {\n return [];\n }\n }\n});\n\nexport default Import;\n","import Node fro m './node';\nimport Variable from './variable';\n\nconst JsEvalNode = function() {};\n\nJsEvalNode.prototype = Object.assign(new Node(), {\n evaluateJavaScri pt(expression, context) {\n let result;\n const that = this;\n const evalContext = {};\n\n if (!context.javascriptEnabled) {\n throw { message: 'Inline JavaScript is not enabled. Is it set in your opti ons?',\n filename: this.fileInfo().filename,\n ind ex: this.getIndex() };\n }\n\n expression = expression.replace(/@\ \{([\\w-]+)\\}/g, function (_, name) {\n return that.jsify(new Variab le(`@${name}`, that.getIndex(), that.fileInfo()).eval(context));\n });\n\ n try {\n expression = new Function(`return (${expression})`); \n } catch (e) {\n throw { message: `JavaScript evaluation err or: ${e.message} from \\`${expression}\\`` ,\n filename: this.fil eInfo().filename,\n index: this.getIndex() };\n }\n\n const variables = context.frames[0].variables();\n for (const k in var iables) {\n if (variables.hasOwnProperty(k)) {\n /* js hint loopfunc:true */\n evalContext[k.slice(1)] = {\n value: variables[k].value,\n toJS: function () {\n return this.value.eval(context).toCSS();\n }\n };\n }\n }\n\n try {\n result = expression.call(evalContext);\n } catch (e) {\n thro w { message: `JavaScript evaluation error: '${e.name}: ${e.message.replace(/[\"] /g, '\\'')}'` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n return result;\n },\n\n jsify(obj) {\n if (Array.isArray(obj.value) && (obj.value.length > 1)) {\n return `[${obj.value.map(function (v) { return v.toCSS(); }).join (', ')}]`;\n } else {\n return obj.toCSS();\n }\n }\ n});\n\nexport default JsEvalNode;\n","import JsEvalNode from './js-eval-node';\ nimport Dimension from './dimension';\nimport Quoted from './quoted';\nimport An onymous from './anonymous';\n\nconst JavaScript = function(string, escaped, inde x, currentFileInfo) {\n this.escaped = escaped;\n this.expression = string ;\n this._index = index;\n this._fileInfo = currentFileInfo;\n}\n\nJavaScr ipt.prototype = Object.assign(new JsEvalNode(), {\n type: 'JavaScript',\n\n eval(context) {\n const result = this.evaluateJavaScript(this.expressio n, context);\n const type = typeof result;\n\n if (type === 'numbe r' && !isNaN(result)) {\n return new Dimension(result);\n } el se if (type === 'string') {\n return new Quoted(`\"${result}\"`, resu lt, this.escaped, this._index);\n } else if (Array.isArray(result)) {\n return new Anonymous(result.join(', '));\n } else {\n return new Anonymous(result);\n }\n }\n});\n\nexport default JavaScr ipt;\n","import Node from './node';\n\nconst Assignment = function(key, val) {\n this.key = key;\n this.value = val;\n}\n\nAssignment.prototype = Object.a ssign(new Node(), {\n type: 'Assignment',\n\n accept(visitor) {\n t his.value = visitor.visit(this.value);\n },\n\n eval(context) {\n i f (this.value.eval) {\n return new Assignment(this.key, this.value.ev al(context));\n }\n return this;\n },\n\n genCSS(context, ou tput) {\n output.add(`${this.key}=`);\n if (this.value.genCSS) {\n this.value.genCSS(context, output);\n } else {\n o utput.add(this.value);\n }\n }\n});\n\nexport default Assignment;\n"," import Node from './node';\n\nconst Condition = function(op, l, r, i, negate) {\ n this.op = op.trim();\n this.lvalue = l;\n this.rvalue = r;\n this. _index = i;\n this.negate = negate;\n};\n\nCondition.prototype = Object.assig n(new Node(), {\n type: 'Condition',\n\n accept(visitor) {\n this.l value = visitor.visit(this.lvalue);\n this.rvalue = visitor.visit(this.rv alue);\n },\n\n eval(context) {\n const result = (function (op, a, b) {\n switch (op) {\n case 'and': return a && b;\n case 'or': return a || b;\n default:\n switch (Node.compare(a, b)) {\n case -1:\n return op === '<' || op === '=<' || op === '<=';\n case 0:\n return op === '=' || op === ' >=' || op === '=<' || op === '<=';\n case 1:\n return op === '>' || op === '>=';\n defa ult:\n return false;\n }\n }\n })(this.op, this.lvalue.eval(context), this.rvalue.eval(context)) ;\n\n return this.negate ? !result : result;\n }\n});\n\nexport defaul t Condition;\n","import Node from './node';\n\nconst UnicodeDescriptor = functio n(value) {\n this.value = value;\n}\n\nUnicodeDescriptor.prototype = Object.a ssign(new Node(), {\n type: 'UnicodeDescriptor'\n})\n\nexport default Unicode Descriptor;\n","import Node from './node';\nimport Operation from './operation'; \nimport Dimension from './dimension';\n\nconst Negative = function(node) {\n this.value = node;\n};\n\nNegative.prototype = Object.assign(new Node(), {\n type: 'Negative',\n\n genCSS(context, output) {\n output.add('-');\n this.value.genCSS(context, output);\n },\n\n eval(context) {\n if (context.isMathOn()) {\n return (new Operation('*', [new Dimens ion(-1), this.value])).eval(context);\n }\n return new Negative(th is.value.eval(context));\n }\n});\n\nexport default Negative;\n","import Node from './node';\nimport Selector from './selector';\n\nconst Extend = function(s elector, option, index, currentFileInfo, visibilityInfo) {\n this.selector = selector;\n this.option = option;\n this.object_id = Extend.next_id++;\n this.parent_ids = [this.object_id];\n this._index = index;\n this._fileI nfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.a llowRoot = true;\n\n switch (option) {\n case 'all':\n this .allowBefore = true;\n this.allowAfter = true;\n break;\n default:\n this.allowBefore = false;\n this.allowAf ter = false;\n break;\n }\n this.setParent(this.selector, this) ;\n};\n\nExtend.prototype = Object.assign(new Node(), {\n type: 'Extend',\n\n accept(visitor) {\n this.selector = visitor.visit(this.selector);\n },\n\n eval(context) {\n return new Extend(this.selector.eval(contex t), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n },\n\n clone(context) {\n return new Extend(this.selector, this.option , this.getIndex(), this.fileInfo(), this.visibilityInfo());\n },\n\n // it concatenates (joins) all selectors in selector array\n findSelfSelectors(sel ectors) {\n let selfElements = [], i, selectorElements;\n\n for (i = 0; i < selectors.length; i++) {\n selectorElements = selectors[i]. elements;\n // duplicate the logic in genCSS function inside the sele ctor node.\n // future TODO - move both logics into the selector join er visitor\n if (i > 0 && selectorElements.length && selectorElements [0].combinator.value === '') {\n selectorElements[0].combinator.v alue = ' ';\n }\n selfElements = selfElements.concat(selec tors[i].elements);\n }\n\n this.selfSelectors = [new Selector(self Elements)];\n this.selfSelectors[0].copyVisibilityInfo(this.visibilityInf o());\n }\n});\n\nExtend.next_id = 0;\nexport default Extend;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './rule set';\nimport DetachedRuleset from './detached-ruleset';\nimport LessError from '../less-error';\n\nconst VariableCall = function(variable, index, currentFileIn fo) {\n this.variable = variable;\n this._index = index;\n this._fileIn fo = currentFileInfo;\n this.allowRoot = true;\n};\n\nVariableCall.prototype = Object.assign(new Node(), {\n type: 'VariableCall',\n\n eval(context) {\ n let rules;\n let detachedRuleset = new Variable(this.variable, t his.getIndex(), this.fileInfo()).eval(context);\n const error = new LessE rror({message: `Could not evaluate variable call ${this.variable}`});\n\n if (!detachedRuleset.ruleset) {\n if (detachedRuleset.rules) {\n rules = detachedRuleset;\n }\n else if (Array. isArray(detachedRuleset)) {\n rules = new Ruleset('', detachedRul eset);\n }\n else if (Array.isArray(detachedRuleset.value) ) {\n rules = new Ruleset('', detachedRuleset.value);\n }\n else {\n throw error;\n }\n detachedRuleset = new DetachedRuleset(rules);\n }\n\n if (detach edRuleset.ruleset) {\n return detachedRuleset.callEval(context);\n }\n throw error;\n }\n});\n\nexport default VariableCall;\n","imp ort Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport Selector from './selector';\n\nconst NamespaceValue = func tion(ruleCall, lookups, index, fileInfo) {\n this.value = ruleCall;\n this .lookups = lookups;\n this._index = index;\n this._fileInfo = fileInfo;\n} ;\n\nNamespaceValue.prototype = Object.assign(new Node(), {\n type: 'Namespac eValue',\n\n eval(context) {\n let i, j, name, rules = this.value.eval (context);\n \n for (i = 0; i < this.lookups.length; i++) {\n name = this.lookups[i];\n\n /**\n * Eval'd DRs ret urn rulesets.\n * Eval'd mixins return rules, so let's make a rulese t if we need it.\n * We need to do this because of late parsing of v alues\n */\n if (Array.isArray(rules)) {\n rules = new Ruleset([new Selector()], rules);\n }\n\n if (name === '') {\n rules = rules.lastDeclaration();\n } \n else if (name.charAt(0) === '@') {\n if (name.charA t(1) === '@') {\n name = `@${new Variable(name.substr(1)).eva l(context).value}`;\n }\n if (rules.variables) {\n rules = rules.variable(name);\n }\n \n if (!rules) {\n throw { type: 'Name', \n message: `variable ${name} not found`,\n filename: this.fileInfo().filename,\n index: th is.getIndex() };\n }\n }\n else {\n if (name.substring(0, 2) === '$@') {\n name = `$${new Variable(name.substr(1)).eval(context).value}`;\n }\n else {\n name = name.charAt(0) === '$' ? name : `$${name }`;\n }\n if (rules.properties) {\n rules = rules.property(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `property \"${name.substr(1)}\" not found`,\n filename: this.fileInfo().filename,\n index: this.ge tIndex() };\n }\n // Properties are an array of va lues, since a ruleset can have multiple props.\n // We pick the l ast one (the \"cascaded\" value)\n rules = rules[rules.length - 1 ];\n }\n\n if (rules.value) {\n rules = rul es.eval(context).value;\n }\n if (rules.ruleset) {\n rules = rules.ruleset.eval(context);\n }\n }\n return rules;\n }\n});\n\nexport default NamespaceValue;\n","import Selecto r from './selector';\nimport Element from './element';\nimport Ruleset from './r uleset';\nimport Declaration from './declaration';\nimport DetachedRuleset from './detached-ruleset';\nimport Expression from './expression';\nimport contexts f rom '../contexts';\nimport * as utils from '../utils';\n\nconst Definition = fun ction(name, params, rules, condition, variadic, frames, visibilityInfo) {\n t his.name = name || 'anonymous mixin';\n this.selectors = [new Selector([new E lement(null, name, false, this._index, this._fileInfo)])];\n this.params = pa rams;\n this.condition = condition;\n this.variadic = variadic;\n this. arity = params.length;\n this.rules = rules;\n this._lookups = {};\n co nst optionalParameters = [];\n this.required = params.reduce(function (count, p) {\n if (!p.name || (p.name && !p.value)) {\n return count + 1;\n }\n else {\n optionalParameters.push(p.name);\n return count;\n }\n }, 0);\n this.optionalParameters = o ptionalParameters;\n this.frames = frames;\n this.copyVisibilityInfo(visib ilityInfo);\n this.allowRoot = true;\n}\n\nDefinition.prototype = Object.assi gn(new Ruleset(), {\n type: 'MixinDefinition',\n evalFirst: true,\n\n a ccept(visitor) {\n if (this.params && this.params.length) {\n this.params = visitor.visitArray(this.params);\n }\n this.rules = visitor.visitArray(this.rules);\n if (this.condition) {\n this .condition = visitor.visit(this.condition);\n }\n },\n\n evalParams (context, mixinEnv, args, evaldArguments) {\n /* jshint boss:true */\n const frame = new Ruleset(null, null);\n\n let varargs;\n let arg;\n const params = utils.copyArray(this.params);\n let i;\n let j;\n let val;\n let name;\n let isNamedFound;\n let argIndex;\n let argsLength = 0;\n\n if (mixinEnv.frames & & mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) {\n fram e.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit();\n }\n mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames)); \n\n if (args) {\n args = utils.copyArray(args);\n argsLength = args.length;\n\n for (i = 0; i < argsLength; i++) {\n arg = args[i];\n if (name = (arg && arg.name)) {\n isNamedFound = false;\n for (j = 0; j < par ams.length; j++) {\n if (!evaldArguments[j] && name === p arams[j].name) {\n evaldArguments[j] = arg.value.eval (context);\n frame.prependRule(new Declaration(name, arg.value.eval(context)));\n isNamedFound = true;\n break;\n }\n }\n if (isNamedFound) {\n args.splice (i, 1);\n i--;\n continue;\n } else {\n throw { type: 'Runtime', message : `Named argument for ${this.name} ${args[i].name} not found` };\n }\n }\n }\n }\n argIndex = 0;\n for (i = 0; i < params.length; i++) {\n if (evaldArguments[i]) { continue; }\n\n arg = args && args[argIndex];\n\n if (nam e = params[i].name) {\n if (params[i].variadic) {\n varargs = [];\n for (j = argIndex; j < argsLength; j++) {\n varargs.push(args[j].value.eval(context));\n }\n frame.prependRule(new Declaration(name, new E xpression(varargs).eval(context)));\n } else {\n val = arg && arg.value;\n if (val) {\n // This was a mixin call, pass in a detached ruleset of it's eval'd rules\n if (Array.isArray(val)) {\n va l = new DetachedRuleset(new Ruleset('', val));\n }\n else {\n val = val.eval(context);\ n }\n } else if (params[i].value) {\n val = params[i].value.eval(mixinEnv);\n frame.resetCache();\n } else {\n throw { type: 'Runtime', message: `wrong number of arguments for ${this.name} ( ${argsLength} for ${this.arity})` };\n }\n\n frame.prependRule(new Declaration(name, val));\n evaldArgu ments[i] = val;\n }\n }\n\n if (params[i].v ariadic && args) {\n for (j = argIndex; j < argsLength; j++) {\n evaldArguments[j] = args[j].value.eval(context);\n }\n }\n argIndex++;\n }\n\n return fram e;\n },\n\n makeImportant() {\n const rules = !this.rules ? this.ru les : this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant(true);\n } else {\n re turn r;\n }\n });\n const result = new Definition(this. name, this.params, rules, this.condition, this.variadic, this.frames);\n return result;\n },\n\n eval(context) {\n return new Definition(thi s.name, this.params, this.rules, this.condition, this.variadic, this.frames || u tils.copyArray(context.frames));\n },\n\n evalCall(context, args, importan t) {\n const _arguments = [];\n const mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;\n const frame = this .evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments); \n let rules;\n let ruleset;\n\n frame.prependRule(new Decl aration('@arguments', new Expression(_arguments).eval(context)));\n\n rul es = utils.copyArray(this.rules);\n\n ruleset = new Ruleset(null, rules); \n ruleset.originalRuleset = this;\n ruleset = ruleset.eval(new co ntexts.Eval(context, [this, frame].concat(mixinFrames)));\n if (important ) {\n ruleset = ruleset.makeImportant();\n }\n return r uleset;\n },\n\n matchCondition(args, context) {\n if (this.conditi on && !this.condition.eval(\n new contexts.Eval(context,\n [this.evalParams(context, /* the parameter variables */\n new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]\n .concat(this.frames || []) // t he parent namespace/mixin frames\n .concat(context.frames)))) { // the current environment frames\n return false;\n }\n return true;\n },\n\n matchArgs(args, context) {\n const allArg sCnt = (args && args.length) || 0;\n let len;\n const optionalPara meters = this.optionalParameters;\n const requiredArgsCnt = !args ? 0 : a rgs.reduce(function (count, p) {\n if (optionalParameters.indexOf(p.n ame) < 0) {\n return count + 1;\n } else {\n return count;\n }\n }, 0);\n\n if (!this.variadic ) {\n if (requiredArgsCnt < this.required) {\n return false;\n }\n if (allArgsCnt > this.params.length) {\n return false;\n }\n } else {\n if (requi redArgsCnt < (this.required - 1)) {\n return false;\n }\n }\n\n // check patterns\n len = Math.min(requiredArgsCn t, this.arity);\n\n for (let i = 0; i < len; i++) {\n if (!thi s.params[i].name && !this.params[i].variadic) {\n if (args[i].val ue.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) {\n return false;\n }\n }\n }\n return true;\n }\n});\n\nexport default Definition;\n","import Node from ' ./node';\nimport Selector from './selector';\nimport MixinDefinition from './mix in-definition';\nimport defaultFunc from '../functions/default';\n\nconst MixinC all = function(elements, args, index, currentFileInfo, important) {\n this.se lector = new Selector(elements);\n this.arguments = args || [];\n this._in dex = index;\n this._fileInfo = currentFileInfo;\n this.important = import ant;\n this.allowRoot = true;\n this.setParent(this.selector, this);\n};\n \nMixinCall.prototype = Object.assign(new Node(), {\n type: 'MixinCall',\n\n accept(visitor) {\n if (this.selector) {\n this.selector = visitor.visit(this.selector);\n }\n if (this.arguments.length) {\n this.arguments = visitor.visitArray(this.arguments);\n }\n },\n\n eval(context) {\n let mixins;\n let mixin;\n let mixinPath;\n const args = [];\n let arg;\n let argValue;\n const rules = [];\n let match = false;\n let i;\n l et m;\n let f;\n let isRecursive;\n let isOneFound;\n const candidates = [];\n let candidate;\n const conditionResult = [];\n let defaultResult;\n const defFalseEitherCase = -1;\n const defNone = 0;\n const defTrue = 1;\n const defFalse = 2;\n let count;\n let originalRuleset;\n let noArgumentsFilter; \n\n this.selector = this.selector.eval(context);\n\n function cal cDefGroup(mixin, mixinPath) {\n let f, p, namespace;\n\n f or (f = 0; f < 2; f++) {\n conditionResult[f] = true;\n defaultFunc.value(f);\n for (p = 0; p < mixinPath.length && conditionResult[f]; p++) {\n namespace = mixinPath[p];\n if (namespace.matchCondition) {\n conditi onResult[f] = conditionResult[f] && namespace.matchCondition(null, context);\n }\n }\n if (mixin.matchCondition ) {\n conditionResult[f] = conditionResult[f] && mixin.matchC ondition(args, context);\n }\n }\n if (cond itionResult[0] || conditionResult[1]) {\n if (conditionResult[0] != conditionResult[1]) {\n return conditionResult[1] ?\n defTrue : defFalse;\n }\n\n ret urn defNone;\n }\n return defFalseEitherCase;\n }\n \n for (i = 0; i < this.arguments.length; i++) {\n arg = this. arguments[i];\n argValue = arg.value.eval(context);\n if ( arg.expand && Array.isArray(argValue.value)) {\n argValue = argVa lue.value;\n for (m = 0; m < argValue.length; m++) {\n args.push({value: argValue[m]});\n }\n } else {\n args.push({name: arg.name, value: argValue});\n } \n }\n\n noArgumentsFilter = function(rule) {return rule.matchArgs (null, context);};\n\n for (i = 0; i < context.frames.length; i++) {\n if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFi lter)).length > 0) {\n isOneFound = true;\n\n // T o make `default()` function independent of definition order we have two \"subpas ses\" here.\n // At first we evaluate each guard *twice* (with `d efault() == true` and `default() == false`),\n // and build candi date list with corresponding flags. Then, when we know all possible matches,\n // we make a final decision.\n\n for (m = 0; m < mi xins.length; m++) {\n mixin = mixins[m].rule;\n mixinPath = mixins[m].path;\n isRecursive = false;\n for (f = 0; f < context.frames.length; f++) {\n if ((!(mixin instanceof MixinDefinition)) && mixin === (context.frames[f ].originalRuleset || context.frames[f])) {\n isRecurs ive = true;\n break;\n }\n }\n if (isRecursive) {\n continue;\n }\n\n if (mixin.matchArgs(a rgs, context)) {\n candidate = {mixin, group: calcDefGrou p(mixin, mixinPath)};\n\n if (candidate.group !== defFals eEitherCase) {\n candidates.push(candidate);\n }\n\n match = true;\n }\n }\n\n defaultFunc.reset();\n\n count = [0, 0, 0];\n for (m = 0; m < candidates.length; m++) {\n count[candidates[m].group]++;\n }\n\n if (count[defNone] > 0) {\n defaultResult = defFalse; \n } else {\n defaultResult = defTrue;\n if ((count[defTrue] + count[defFalse]) > 1) {\n throw { type: 'Runtime',\n message: `Ambiguous u se of \\`default()\\` found when matching for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filena me };\n }\n }\n\n for (m = 0; m < candidates.length; m++) {\n candidate = candidates[m].grou p;\n if ((candidate === defNone) || (candidate === defaultRes ult)) {\n try {\n mixin = cand idates[m].mixin;\n if (!(mixin instanceof MixinDefini tion)) {\n originalRuleset = mixin.originalRulese t || mixin;\n mixin = new MixinDefinition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo());\n mixin.originalRuleset = originalRuleset;\n }\n const newRules = mixin.evalCall(contex t, args, this.important).rules;\n this._setVisibility ToReplacement(newRules);\n Array.prototype.push.apply (rules, newRules);\n } catch (e) {\n throw { message: e.message, index: this.getIndex(), filename: this.fileIn fo().filename, stack: e.stack };\n }\n }\n }\n\n if (match) {\n retur n rules;\n }\n }\n }\n if (isOneFound) { \n throw { type: 'Runtime',\n message: `No matching definition was found for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n } else {\n throw { type: 'Name',\n message: `${this.selector.toCSS ().trim()} is undefined`,\n index: this.getIndex(), filename: t his.fileInfo().filename };\n }\n },\n\n _setVisibilityToReplacement (replacement) {\n let i, rule;\n if (this.blocksVisibility()) {\n for (i = 0; i < replacement.length; i++) {\n rule = re placement[i];\n rule.addVisibilityBlock();\n }\n }\n },\n\n format(args) {\n return `${this.selector.toCSS().trim( )}(${args ? args.map(function (a) {\n let argValue = '';\n if (a.name) {\n argValue += `${a.name}:`;\n }\n if (a.value.toCSS) {\n argValue += a.value.toCSS();\n } else {\n argValue += '???';\n }\n r eturn argValue;\n }).join(', ') : ''})`;\n }\n});\n\nexport default Mi xinCall;\n","import Node from './node';\nimport Color from './color';\nimport At Rule from './atrule';\nimport DetachedRuleset from './detached-ruleset';\nimport Operation from './operation';\nimport Dimension from './dimension';\nimport Uni t from './unit';\nimport Keyword from './keyword';\nimport Variable from './vari able';\nimport Property from './property';\nimport Ruleset from './ruleset';\nim port Element from './element';\nimport Attribute from './attribute';\nimport Com binator from './combinator';\nimport Selector from './selector';\nimport Quoted from './quoted';\nimport Expression from './expression';\nimport Declaration fro m './declaration';\nimport Call from './call';\nimport URL from './url';\nimport Import from './import';\nimport Comment from './comment';\nimport Anonymous fro m './anonymous';\nimport Value from './value';\nimport JavaScript from './javasc ript';\nimport Assignment from './assignment';\nimport Condition from './conditi on';\nimport Paren from './paren';\nimport Media from './media';\nimport Unicode Descriptor from './unicode-descriptor';\nimport Negative from './negative';\nimp ort Extend from './extend';\nimport VariableCall from './variable-call';\nimport NamespaceValue from './namespace-value';\n\n// mixins\nimport MixinCall from '. /mixin-call';\nimport MixinDefinition from './mixin-definition';\n\nexport defau lt {\n Node, Color, AtRule, DetachedRuleset, Operation,\n Dimension, Unit, Keyword, Variable, Property,\n Ruleset, Element, Attribute, Combinator, Sele ctor,\n Quoted, Expression, Declaration, Call, URL, Import,\n Comment, Ano nymous, Value, JavaScript, Assignment,\n Condition, Paren, Media, UnicodeDesc riptor, Negative,\n Extend, VariableCall, NamespaceValue,\n mixin: {\n Call: MixinCall,\n Definition: MixinDefinition\n }\n};","class Abs tractFileManager {\n getPath(filename) {\n let j = filename.lastIndexO f('?');\n if (j > 0) {\n filename = filename.slice(0, j);\n }\n j = filename.lastIndexOf('/');\n if (j < 0) {\n j = filename.lastIndexOf('\\\\');\n }\n if (j < 0) {\n return '';\n }\n return filename.slice(0, j + 1);\n }\n\n tryAppendExtension(path, ext) {\n return /(\\.[a-z]*$)|([\\?;].*)$/.test( path) ? path : path + ext;\n }\n\n tryAppendLessExtension(path) {\n return this.tryAppendExtension(path, '.less');\n }\n\n supportsSync() {\n return false;\n }\n\n alwaysMakePathsAbsolute() {\n return false;\n }\n\n isPathAbsolute(filename) {\n return (/^(?:[a-z-]+:|\ \/|\\\\|#)/i).test(filename);\n }\n\n // TODO: pull out / replace?\n jo in(basePath, laterPath) {\n if (!basePath) {\n return laterPat h;\n }\n return basePath + laterPath;\n }\n\n pathDiff(url, baseUrl) {\n // diff between two paths to create a relative path\n\n const urlParts = this.extractUrlParts(url);\n\n const baseUrlParts = t his.extractUrlParts(baseUrl);\n let i;\n let max;\n let url Directories;\n let baseUrlDirectories;\n let diff = '';\n i f (urlParts.hostPart !== baseUrlParts.hostPart) {\n return '';\n }\n max = Math.max(baseUrlParts.directories.length, urlParts.directori es.length);\n for (i = 0; i < max; i++) {\n if (baseUrlParts.d irectories[i] !== urlParts.directories[i]) { break; }\n }\n baseUr lDirectories = baseUrlParts.directories.slice(i);\n urlDirectories = urlP arts.directories.slice(i);\n for (i = 0; i < baseUrlDirectories.length - 1; i++) {\n diff += '../';\n }\n for (i = 0; i < urlDir ectories.length - 1; i++) {\n diff += `${urlDirectories[i]}/`;\n }\n return diff;\n }\n\n // helper function, not part of API\n extractUrlParts(url, baseUrl) {\n // urlParts[1] = protocol://hostname/ OR /\n // urlParts[2] = / if path relative to host base\n // urlP arts[3] = directories\n // urlParts[4] = filename\n // urlParts[5] = parameters\n\n const urlPartsRegex = /^((?:[a-z-]+:)?\\/{2}(?:[^\\/\\? #]*\\/)|([\\/\\\\]))?((?:[^\\/\\\\\\?#]*[\\/\\\\])*)([^\\/\\\\\\?#]*)([#\\?].*)? $/i;\n\n const urlParts = url.match(urlPartsRegex);\n const return er = {};\n let rawDirectories = [];\n const directories = [];\n let i;\n let baseUrlParts;\n\n if (!urlParts) {\n throw new Error(`Could not parse sheet href - '${url}'`);\n }\n\n // Stylesheets in IE don't always return the full path\n if (baseUrl && ( !urlParts[1] || urlParts[2])) {\n baseUrlParts = baseUrl.match(urlPar tsRegex);\n if (!baseUrlParts) {\n throw new Error(`Co uld not parse page url - '${baseUrl}'`);\n }\n urlParts[1] = urlParts[1] || baseUrlParts[1] || '';\n if (!urlParts[2]) {\n urlParts[3] = baseUrlParts[3] + urlParts[3];\n }\n }\n\n if (urlParts[3]) {\n rawDirectories = urlParts[3].replac e(/\\\\/g, '/').split('/');\n\n // collapse '..' and skip '.'\n for (i = 0; i < rawDirectories.length; i++) {\n\n if (rawDi rectories[i] === '..') {\n directories.pop();\n }\n else if (rawDirectories[i] !== '.') {\n directories.push(rawDirectories[i]);\n }\n \n }\n }\n\n returner.hostPart = urlParts[1];\n returner.di rectories = directories;\n returner.rawPath = (urlParts[1] || '') + rawDi rectories.join('/');\n returner.path = (urlParts[1] || '') + directories. join('/');\n returner.filename = urlParts[4];\n returner.fileUrl = returner.path + (urlParts[4] || '');\n returner.url = returner.fileUrl + (urlParts[5] || '');\n return returner;\n }\n}\n\nexport default Abst ractFileManager;\n","import functionRegistry from '../functions/function-registr y';\nimport LessError from '../less-error';\n\nclass AbstractPluginLoader {\n constructor() {\n // Implemented by Node.js plugin loader\n this. require = function() {\n return null;\n }\n }\n\n evalPl ugin(contents, context, imports, pluginOptions, fileInfo) {\n\n let loade r, registry, pluginObj, localModule, pluginManager, filename, result;\n\n pluginManager = context.pluginManager;\n\n if (fileInfo) {\n if (typeof fileInfo === 'string') {\n filename = fileInfo;\n }\n else {\n filename = fileInfo.filename;\n }\n }\n const shortname = (new this.less.FileManager()).e xtractUrlParts(filename).filename;\n\n if (filename) {\n plugi nObj = pluginManager.get(filename);\n\n if (pluginObj) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions); \n if (result) {\n return result;\n }\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.mess age = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n return plug inObj;\n }\n }\n localModule = {\n exports: {},\n pluginManager,\n fileInfo\n };\n regis try = functionRegistry.create();\n\n const registerPlugin = function(obj) {\n pluginObj = obj;\n };\n\n try {\n loade r = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'le ss', 'fileInfo', contents);\n loader(localModule, this.require(filena me), registerPlugin, registry, this.less.tree, this.less, fileInfo);\n }\ n catch (e) {\n return new LessError(e, imports, filename);\n }\n\n if (!pluginObj) {\n pluginObj = localModule.expor ts;\n }\n pluginObj = this.validatePlugin(pluginObj, filename, sho rtname);\n\n if (pluginObj instanceof LessError) {\n return pl uginObj;\n }\n\n if (pluginObj) {\n pluginObj.imports = imports;\n pluginObj.filename = filename;\n\n // For < 3. x (or unspecified minVersion) - setOptions() before install()\n if (! pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {\n result = this.trySetOptions(pluginObj, filename, shortname, p luginOptions);\n\n if (result) {\n return resu lt;\n }\n }\n\n // Run on first load\n pluginManager.addPlugin(pluginObj, fileInfo.filename, registry);\n pluginObj.functions = registry.getLocalFunctions();\n\n // Need to call setOptions again because the pluginObj might have functions\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n\n // Run every @plugin call\n try {\n if (pluginOb j.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessErr or(e, imports, filename);\n }\n\n }\n else {\n return new LessError({ message: 'Not a valid plugin' }, imports, filename);\n }\n\n return pluginObj;\n\n }\n\n trySetOptions(plugin, fil ename, name, options) {\n if (options && !plugin.setOptions) {\n return new LessError({\n message: `Options have been provided but the plugin ${name} does not support any options.`\n });\n }\n try {\n plugin.setOptions && plugin.setOptions(options);\n }\n catch (e) {\n return new LessError(e);\n }\ n }\n\n validatePlugin(plugin, filename, name) {\n if (plugin) {\n // support plugins being a function\n // so that the plugi n can be more usable programmatically\n if (typeof plugin === 'functi on') {\n plugin = new plugin();\n }\n\n if (plugin.minVersion) {\n if (this.compareVersion(plugin.minVersion , this.less.version) < 0) {\n return new LessError({\n message: `Plugin ${name} requires version ${this.versionToStrin g(plugin.minVersion)}`\n });\n }\n }\n return plugin;\n }\n return null;\n }\n\n com pareVersion(aVersion, bVersion) {\n if (typeof aVersion === 'string') {\n aVersion = aVersion.match(/^(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n aVersion.shift();\n }\n for (let i = 0; i < aVersion.length; i++) {\n if (aVersion[i] !== bVersion[i]) {\n return p arseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1;\n }\n } \n return 0;\n }\n\n versionToString(version) {\n let versio nString = '';\n for (let i = 0; i < version.length; i++) {\n v ersionString += (versionString ? '.' : '') + version[i];\n }\n ret urn versionString;\n }\n\n printUsage(plugins) {\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n if (plugin.printUsage) {\n plugin.printUsage();\n }\n }\n }\n}\n\nexport default AbstractPluginLoader;\n\n","import tree fro m '../tree';\n\nconst _visitArgs = { visitDeeper: true };\nlet _hasIndexed = fal se;\n\nfunction _noop(node) {\n return node;\n}\n\nfunction indexNodeTypes(pa rent, ticker) {\n // add .typeIndex to tree node types for lookup table\n let key, child;\n for (key in parent) { \n /* eslint guard-for-in: 0 * /\n child = parent[key];\n switch (typeof child) {\n ca se 'function':\n // ignore bound functions directly on tree which do not have a prototype\n // or aren't nodes\n if (child.prototype && child.prototype.type) {\n child.prototyp e.typeIndex = ticker++;\n }\n break;\n case 'object':\n ticker = indexNodeTypes(child, ticker);\n break;\n \n }\n }\n return ticker;\n}\n\nclass Visi tor {\n constructor(implementation) {\n this._implementation = impleme ntation;\n this._visitInCache = {};\n this._visitOutCache = {};\n\ n if (!_hasIndexed) {\n indexNodeTypes(tree, 1);\n _hasIndexed = true;\n }\n }\n\n visit(node) {\n if (!node) { \n return node;\n }\n\n const nodeTypeIndex = node.type Index;\n if (!nodeTypeIndex) {\n // MixinCall args aren't a no de type?\n if (node.value && node.value.typeIndex) {\n this.visit(node.value);\n }\n return node;\n }\n\n const impl = this._implementation;\n let func = this._visitInCach e[nodeTypeIndex];\n let funcOut = this._visitOutCache[nodeTypeIndex];\n const visitArgs = _visitArgs;\n let fnName;\n\n visitArgs.vi sitDeeper = true;\n\n if (!func) {\n fnName = `visit${node.typ e}`;\n func = impl[fnName] || _noop;\n funcOut = impl[`${f nName}Out`] || _noop;\n this._visitInCache[nodeTypeIndex] = func;\n this._visitOutCache[nodeTypeIndex] = funcOut;\n }\n\n if (func !== _noop) {\n const newNode = func.call(impl, node, visitArgs );\n if (node && impl.isReplacing) {\n node = newNode; \n }\n }\n\n if (visitArgs.visitDeeper && node) {\n if (node.length) {\n for (let i = 0, cnt = node.length; i < cnt; i++) {\n if (node[i].accept) {\n node[i].accept(this);\n }\n }\n } else if (node.accept) {\n node.accept(this);\n }\n }\n\n if (funcOut != _noop) {\n funcOut.call(impl, node) ;\n }\n\n return node;\n }\n\n visitArray(nodes, nonReplacin g) {\n if (!nodes) {\n return nodes;\n }\n\n con st cnt = nodes.length;\n let i;\n\n // Non-replacing\n if ( nonReplacing || !this._implementation.isReplacing) {\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n // Replacing\n const out = [];\n for (i = 0; i < cnt; i++) {\n const evald = this.visit(nodes[i]); \n if (evald === undefined) { continue; }\n if (!evald.spl ice) {\n out.push(evald);\n } else if (evald.length) { \n this.flatten(evald, out);\n }\n }\n r eturn out;\n }\n\n flatten(arr, out) {\n if (!out) {\n o ut = [];\n }\n\n let cnt, i, item, nestedCnt, j, nestedItem;\n\n for (i = 0, cnt = arr.length; i < cnt; i++) {\n item = arr[i];\ n if (item === undefined) {\n continue;\n } \n if (!item.splice) {\n out.push(item);\n continue;\n }\n\n for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {\n nestedItem = item[j];\n i f (nestedItem === undefined) {\n continue;\n } \n if (!nestedItem.splice) {\n out.push(nested Item);\n } else if (nestedItem.length) {\n thi s.flatten(nestedItem, out);\n }\n }\n }\n\n return out;\n }\n}\n\nexport default Visitor;\n","class ImportSequencer { \n constructor(onSequencerEmpty) {\n this.imports = [];\n this. variableImports = [];\n this._onSequencerEmpty = onSequencerEmpty;\n this._currentDepth = 0;\n }\n\n addImport(callback) {\n const im portSequencer = this,\n importItem = {\n callback,\n args: null,\n isReady: false\n };\n this.imports.push(importItem);\n return function() {\n impo rtItem.args = Array.prototype.slice.call(arguments, 0);\n importItem. isReady = true;\n importSequencer.tryRun();\n };\n }\n\n addVariableImport(callback) {\n this.variableImports.push(callback);\n }\n\n tryRun() {\n this._currentDepth++;\n try {\n while (true) {\n while (this.imports.length > 0) {\n const importItem = this.imports[0];\n if (!importItem .isReady) {\n return;\n }\n this.imports = this.imports.slice(1);\n importItem.c allback.apply(null, importItem.args);\n }\n if (th is.variableImports.length === 0) {\n break;\n }\n const variableImport = this.variableImports[0];\n this.variableImports = this.variableImports.slice(1);\n varia bleImport();\n }\n } finally {\n this._currentDepth --;\n }\n if (this._currentDepth === 0 && this._onSequencerEmpty) {\n this._onSequencerEmpty();\n }\n }\n}\n\nexport default ImportSequencer;\n","import contexts from '../contexts';\nimport Visitor from '. /visitor';\nimport ImportSequencer from './import-sequencer';\nimport * as utils from '../utils';\n\nconst ImportVisitor = function(importer, finish) {\n\n t his._visitor = new Visitor(this);\n this._importer = importer;\n this._fin ish = finish;\n this.context = new contexts.Eval();\n this.importCount = 0 ;\n this.onceFileDetectionMap = {};\n this.recursionDetector = {};\n th is._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));\n};\n\nI mportVisitor.prototype = {\n isReplacing: false,\n run: function (root) {\ n try {\n // process the contents\n this._visitor.v isit(root);\n }\n catch (e) {\n this.error = e;\n }\n\n this.isFinished = true;\n this._sequencer.tryRun();\n } ,\n _onSequencerEmpty: function() {\n if (!this.isFinished) {\n return;\n }\n this._finish(this.error);\n },\n visitImp ort: function (importNode, visitArgs) {\n const inlineCSS = importNode.op tions.inline;\n\n if (!importNode.css || inlineCSS) {\n\n cons t context = new contexts.Eval(this.context, utils.copyArray(this.context.frames) );\n const importParent = context.frames[0];\n\n this.impo rtCount++;\n if (importNode.isVariableImport()) {\n th is._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, co ntext, importParent));\n } else {\n this.processImport Node(importNode, context, importParent);\n }\n }\n visi tArgs.visitDeeper = false;\n },\n processImportNode: function(importNode, context, importParent) {\n let evaldImportNode;\n const inlineCSS = importNode.options.inline;\n\n try {\n evaldImportNode = imp ortNode.evalForImport(context);\n } catch (e) {\n if (!e.filen ame) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filen ame; }\n // attempt to eval properly and treat as css\n im portNode.css = true;\n // if that fails, this error will be thrown\n importNode.error = e;\n }\n\n if (evaldImportNode && (! evaldImportNode.css || inlineCSS)) {\n\n if (evaldImportNode.options. multiple) {\n context.importMultiple = true;\n }\n\n // try appending if we haven't determined if it is css or not\n const tryAppendLessExtension = evaldImportNode.css === undefined;\n\n for (let i = 0; i < importParent.rules.length; i++) {\n if (importParent.rules[i] === importNode) {\n importParent.rules [i] = evaldImportNode;\n break;\n }\n }\n\n const onImported = this.onImported.bind(this, evaldImportNod e, context), sequencedOnImported = this._sequencer.addImport(onImported);\n\n this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(),\n evaldImportNode.options, sequencedO nImported);\n } else {\n this.importCount--;\n if ( this.isFinished) {\n this._sequencer.tryRun();\n }\n }\n },\n onImported: function (importNode, context, e, root, importe dAtRoot, fullPath) {\n if (e) {\n if (!e.filename) {\n e.index = importNode.getIndex(); e.filename = importNode.fileInfo().file name;\n }\n this.error = e;\n }\n\n const im portVisitor = this,\n inlineCSS = importNode.options.inline,\n isPlugin = importNode.options.isPlugin,\n isOptional = importNod e.options.optional,\n duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;\n\n if (!context.importMultiple) {\n if (duplicateImport) {\n importNode.skip = true;\n } else {\n importNode.skip = function() {\n if (fullPath in importVisitor.onceFileDetectionMap) {\n return true;\n }\n importVisitor.onceFi leDetectionMap[fullPath] = true;\n return false;\n };\n }\n }\n\n if (!fullPath && isOptional) {\n importNode.skip = true;\n }\n\n if (root) {\n importNode.root = root;\n importNode.importedFilename = fullPath;\n\n if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicate Import)) {\n importVisitor.recursionDetector[fullPath] = true;\n\ n const oldContext = this.context;\n this.context = context;\n try {\n this._visitor.visit(root) ;\n } catch (e) {\n this.error = e;\n }\n this.context = oldContext;\n }\n }\n \n importVisitor.importCount--;\n\n if (importVisitor.isFinished) {\n importVisitor._sequencer.tryRun();\n }\n },\n visitD eclaration: function (declNode, visitArgs) {\n if (declNode.value.type == = 'DetachedRuleset') {\n this.context.frames.unshift(declNode);\n } else {\n visitArgs.visitDeeper = false;\n }\n },\n visitDeclarationOut: function(declNode) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.shift();\n }\n } ,\n visitAtRule: function (atRuleNode, visitArgs) {\n this.context.fra mes.unshift(atRuleNode);\n },\n visitAtRuleOut: function (atRuleNode) {\n this.context.frames.shift();\n },\n visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {\n this.context.frames.unshift(mixinDef initionNode);\n },\n visitMixinDefinitionOut: function (mixinDefinitionNod e) {\n this.context.frames.shift();\n },\n visitRuleset: function ( rulesetNode, visitArgs) {\n this.context.frames.unshift(rulesetNode);\n },\n visitRulesetOut: function (rulesetNode) {\n this.context.frames .shift();\n },\n visitMedia: function (mediaNode, visitArgs) {\n th is.context.frames.unshift(mediaNode.rules[0]);\n },\n visitMediaOut: funct ion (mediaNode) {\n this.context.frames.shift();\n }\n};\nexport defau lt ImportVisitor;\n","class SetTreeVisibilityVisitor {\n constructor(visible) {\n this.visible = visible;\n }\n\n run(root) {\n this.visi t(root);\n }\n\n visitArray(nodes) {\n if (!nodes) {\n r eturn nodes;\n }\n\n const cnt = nodes.length;\n let i;\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\ n return nodes;\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n if (node.constructor === Array) {\n return this.visitArray(node);\n }\n\n if (!node.blocksVisibi lity || node.blocksVisibility()) {\n return node;\n }\n if (this.visible) {\n node.ensureVisibility();\n } else {\n node.ensureInvisibility();\n }\n\n node.accept(this);\n return node;\n }\n}\n\nexport default SetTreeVisibilityVisitor;","impo rt tree from '../tree';\nimport Visitor from './visitor';\nimport logger from '. ./logger';\nimport * as utils from '../utils';\n\n/* jshint loopfunc:true */\n\n class ExtendFinderVisitor {\n constructor() {\n this._visitor = new Vi sitor(this);\n this.contexts = [];\n this.allExtendsStack = [[]];\ n }\n\n run(root) {\n root = this._visitor.visit(root);\n ro ot.allExtends = this.allExtendsStack[0];\n return root;\n }\n\n vis itDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visit Args.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n\n let i ;\n let j;\n let extend;\n const allSelectorsExtendList = [ ];\n let extendList;\n\n // get &:extend(.a); rules which apply to all selectors in this ruleset\n const rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0;\n for (i = 0; i < ruleCnt; i++) {\n if (rulesetNode.rules[i] instanceof tree.Extend) {\n allSelect orsExtendList.push(rules[i]);\n rulesetNode.extendOnEveryPath = t rue;\n }\n }\n\n // now find every selector and apply t he extends that apply to all extends\n // and the ones which apply to an individual extend\n const paths = rulesetNode.paths;\n for (i = 0; i < paths.length; i++) {\n const selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList;\n\n extendList = selExtendList ? utils.copyArray(selExtendList).concat(a llSelectorsExtendList)\n : allSelectorsExtendList;\n\n if (extendList) {\n extendList = extendList.map(function(allSele ctorsExtend) {\n return allSelectorsExtend.clone();\n });\n }\n\n for (j = 0; j < extendList.length; j++ ) {\n this.foundExtends = true;\n extend = extendL ist[j];\n extend.findSelfSelectors(selectorPath);\n extend.ruleset = rulesetNode;\n if (j === 0) { extend.firstExte ndOnThisSelectorPath = true; }\n this.allExtendsStack[this.allExt endsStack.length - 1].push(extend);\n }\n }\n\n this.co ntexts.push(rulesetNode.selectors);\n }\n\n visitRulesetOut(rulesetNode) { \n if (!rulesetNode.root) {\n this.contexts.length = this.cont exts.length - 1;\n }\n }\n\n visitMedia(mediaNode, visitArgs) {\n mediaNode.allExtends = [];\n this.allExtendsStack.push(mediaNode.al lExtends);\n }\n\n visitMediaOut(mediaNode) {\n this.allExtendsStac k.length = this.allExtendsStack.length - 1;\n }\n\n visitAtRule(atRuleNode , visitArgs) {\n atRuleNode.allExtends = [];\n this.allExtendsStac k.push(atRuleNode.allExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n}\n\nc lass ProcessExtendsVisitor {\n constructor() {\n this._visitor = new V isitor(this);\n }\n\n run(root) {\n const extendFinder = new Extend FinderVisitor();\n this.extendIndices = {};\n extendFinder.run(roo t);\n if (!extendFinder.foundExtends) { return root; }\n root.allE xtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allE xtends));\n this.allExtendsStack = [root.allExtends];\n const newR oot = this._visitor.visit(root);\n this.checkExtendsForNonMatched(root.al lExtends);\n return newRoot;\n }\n\n checkExtendsForNonMatched(exte ndList) {\n const indices = this.extendIndices;\n extendList.filte r(function(extend) {\n return !extend.hasFoundMatches && extend.paren t_ids.length == 1;\n }).forEach(function(extend) {\n let selec tor = '_unknown_';\n try {\n selector = extend.selecto r.toCSS({});\n }\n catch (_) {}\n\n if (!indice s[`${extend.index} ${selector}`]) {\n indices[`${extend.index} ${ selector}`] = true;\n logger.warn(`extend '${selector}' has no ma tches`);\n }\n });\n }\n\n doExtendChaining(extendsList, extendsListTarget, iterationCount) {\n //\n // chaining is differ ent from normal extension.. if we extend an extend then we are not just copying, altering\n // and pasting the selector we would do normally, but we are also adding an extend with the same target selector\n // this means this new extend can then go and alter other extends\n //\n // this meth od deals with all the chaining work - without it, extend is flat and doesn't wor k on other extend selectors\n // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already\n // processed if we look at each selector at a time, as is done in visitRulese t\n\n let extendIndex;\n\n let targetExtendIndex;\n let mat ches;\n const extendsToAdd = [];\n let newSelector;\n const extendVisitor = this;\n let selectorPath;\n let extend;\n let targetExtend;\n let newExtend;\n\n iterationCount = iterationC ount || 0;\n\n // loop through comparing every extend with every target e xtend.\n // a target extend is the one on the ruleset we are looking at c opy/edit/pasting in place\n // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one\n // and the second is th e target.\n // the separation into two lists allows us to process a subse t of chains with a bigger set, as is the\n // case when processing media queries\n for (extendIndex = 0; extendIndex < extendsList.length; extendI ndex++) {\n for (targetExtendIndex = 0; targetExtendIndex < extendsLi stTarget.length; targetExtendIndex++) {\n\n extend = extendsList[ extendIndex];\n targetExtend = extendsListTarget[targetExtendInde x];\n\n // look for circular references\n if ( ext end.parent_ids.indexOf( targetExtend.object_id ) >= 0 ) { continue; }\n\n // find a match in the target extends self selector (the bit before :ex tend)\n selectorPath = [targetExtend.selfSelectors[0]];\n matches = extendVisitor.findMatch(extend, selectorPath);\n\n if (matches.length) {\n extend.hasFoundMatches = true;\n\ n // we found a match, so for each self selector..\n extend.selfSelectors.forEach(function(selfSelector) {\n const info = targetExtend.visibilityInfo();\n\n // process the extend as usual\n newSelector = extendVis itor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible());\n\ n // but now we create a new extend from it\n newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.opt ion, 0, targetExtend.fileInfo(), info);\n newExtend.selfS electors = newSelector;\n\n // add the extend onto the li st of extends for that selector\n newSelector[newSelector .length - 1].extendList = [newExtend];\n\n // record that we need to add it.\n extendsToAdd.push(newExtend);\n newExtend.ruleset = targetExtend.ruleset;\n\n // remember its parents for circular references\n newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, ex tend.parent_ids);\n\n // only process the selector once.. if we have :extend(.a,.b) then multiple\n // extends wil l look at the same selector path, so when extending\n // we know that any others will be duplicates in terms of what is added to the css\ n if (targetExtend.firstExtendOnThisSelectorPath) {\n newExtend.firstExtendOnThisSelectorPath = true;\n targetExtend.ruleset.paths.push(newSelector);\n }\n });\n }\n }\n }\n\n if (extendsToAdd.length) {\n // try to detect circular references to stop a stack overflow.\n // may no longer be needed.\n this.extendChainCount++;\n if (iterationCount > 100) {\n let selectorOne = '{unable to calculate}';\n let s electorTwo = '{unable to calculate}';\n try {\n selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();\n s electorTwo = extendsToAdd[0].selector.toCSS();\n }\n catch (e) {}\n throw { message: `extend circular reference det ected. One of the circular extends is currently:${selectorOne}:extend(${selector Two})`};\n }\n\n // now process the new extends on the exi sting rules so that we can handle a extending b extending c extending\n // d extending e...\n return extendsToAdd.concat(extendVisitor.doE xtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1));\n } else {\n return extendsToAdd;\n }\n }\n\n visitDeclarati on(ruleNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitD eeper = false;\n }\n\n visitSelector(selectorNode, visitArgs) {\n v isitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n let matches;\n let pathIndex;\n let extendIndex;\n const allEx tends = this.allExtendsStack[this.allExtendsStack.length - 1];\n const se lectorsToAdd = [];\n const extendVisitor = this;\n let selectorPat h;\n\n // look at each selector path in the ruleset, find any extend matc hes and then copy, find and replace\n\n for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {\n for (pathIndex = 0; pathInde x < rulesetNode.paths.length; pathIndex++) {\n selectorPath = rul esetNode.paths[pathIndex];\n\n // extending extends happens initi ally, before the main pass\n if (rulesetNode.extendOnEveryPath) { continue; }\n const extendList = selectorPath[selectorPath.lengt h - 1].extendList;\n if (extendList && extendList.length) { conti nue; }\n\n matches = this.findMatch(allExtends[extendIndex], sele ctorPath);\n\n if (matches.length) {\n allExte nds[extendIndex].hasFoundMatches = true;\n\n allExtends[exten dIndex].selfSelectors.forEach(function(selfSelector) {\n let extendedSelectors;\n extendedSelectors = extendVisito r.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].is Visible());\n selectorsToAdd.push(extendedSelectors);\n });\n }\n }\n }\n rule setNode.paths = rulesetNode.paths.concat(selectorsToAdd);\n }\n\n findMatc h(extend, haystackSelectorPath) {\n //\n // look through the hayst ack selector path to try and find the needle - extend.selector\n // retur ns an array of selector matches that can then be replaced\n //\n l et haystackSelectorIndex;\n\n let hackstackSelector;\n let hacksta ckElementIndex;\n let haystackElement;\n let targetCombinator;\n let i;\n const extendVisitor = this;\n const needleElements = extend.selector.elements;\n const potentialMatches = [];\n let p otentialMatch;\n const matches = [];\n\n // loop through the hayst ack elements\n for (haystackSelectorIndex = 0; haystackSelectorIndex < ha ystackSelectorPath.length; haystackSelectorIndex++) {\n hackstackSele ctor = haystackSelectorPath[haystackSelectorIndex];\n\n for (hackstac kElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; ha ckstackElementIndex++) {\n\n haystackElement = hackstackSelector. elements[hackstackElementIndex];\n\n // if we allow elements befo re our match we can add a potential match every time. otherwise only at the firs t element.\n if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) {\n potentialMatches.push ({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,\n initialCombinator: haystackElement.combinator});\n }\n\n for (i = 0; i < potentialMatches.length; i++) {\n potentialMatch = potentialMatches[i];\n\n // selectors add \" \" onto the first element. When we use & it joins the select ors together, but if we don't\n // then each selector in hays tackSelectorPath has a space before it added in the toCSS phase. so we need to\n // work out what the resulting combinator will be\n targetCombinator = haystackElement.combinator.value;\n if (targetCombinator === '' && hackstackElementIndex === 0) {\n targetCombinator = ' ';\n }\n\n // if we don't match, null our match to indicate failure\n if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].v alue, haystackElement.value) ||\n (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombin ator)) {\n potentialMatch = null;\n } else {\n potentialMatch.matched++;\n } \n\n // if we are still valid and have finished, test whether we have elements after and whether these are allowed\n if (p otentialMatch) {\n potentialMatch.finished = potentialMat ch.matched === needleElements.length;\n if (potentialMatc h.finished &&\n (!extend.allowAfter &&\n (hackstackElementIndex + 1 < hackstackSelector.elements.lengt h || haystackSelectorIndex + 1 < haystackSelectorPath.length))) {\n potentialMatch = null;\n }\n }\n // if null we remove, if not, we are still valid, s o either push as a valid match or continue\n if (potentialMat ch) {\n if (potentialMatch.finished) {\n potentialMatch.length = needleElements.length;\n potentialMatch.endPathIndex = haystackSelectorIndex;\n potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // inde x after end of match\n potentialMatches.length = 0; / / we don't allow matches to overlap, so start matching again\n matches.push(potentialMatch);\n }\n } else {\n potentialMatches.splice(i, 1);\n i--;\n }\n }\n }\ n }\n return matches;\n }\n\n isElementValuesEqual(elementVa lue1, elementValue2) {\n if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') {\n return elementValue1 === elementValue 2;\n }\n if (elementValue1 instanceof tree.Attribute) {\n if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementVal ue2.key) {\n return false;\n }\n if (!eleme ntValue1.value || !elementValue2.value) {\n if (elementValue1.val ue || elementValue2.value) {\n return false;\n }\n return true;\n }\n elementValue1 = ele mentValue1.value.value || elementValue1.value;\n elementValue2 = elem entValue2.value.value || elementValue2.value;\n return elementValue1 === elementValue2;\n }\n elementValue1 = elementValue1.value;\n elementValue2 = elementValue2.value;\n if (elementValue1 instanceof tree.Selector) {\n if (!(elementValue2 instanceof tree.Selector) || e lementValue1.elements.length !== elementValue2.elements.length) {\n return false;\n }\n for (let i = 0; i < elementValue1. elements.length; i++) {\n if (elementValue1.elements[i].combinato r.value !== elementValue2.elements[i].combinator.value) {\n i f (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementVa lue2.elements[i].combinator.value || ' ')) {\n return fal se;\n }\n }\n if (!this.isEleme ntValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) {\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n extendSelector (matches, selectorPath, replacementSelector, isVisible) {\n\n // for a se t of matches, replace each match with the replacement selector\n\n let cu rrentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matc hIndex, selector, firstElement, match, newElements;\n\n for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {\n match = matches[ma tchIndex];\n selector = selectorPath[match.pathIndex];\n f irstElement = new tree.Element(\n match.initialCombinator,\n replacementSelector.elements[0].value,\n replacementSe lector.elements[0].isVariable,\n replacementSelector.elements[0]. getIndex(),\n replacementSelector.elements[0].fileInfo()\n );\n\n if (match.pathIndex > currentSelectorPathIndex && current SelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[curre ntSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathElementIndex = 0;\n currentSelectorPat hIndex++;\n }\n\n newElements = selector.elements\n .slice(currentSelectorPathElementIndex, match.index)\n . concat([firstElement])\n .concat(replacementSelector.elements.sli ce(1));\n\n if (currentSelectorPathIndex === match.pathIndex && match Index > 0) {\n path[path.length - 1].elements =\n path[path.length - 1].elements.concat(newElements);\n } else {\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, m atch.pathIndex));\n\n path.push(new tree.Selector(\n newElements\n ));\n }\n currentSelec torPathIndex = match.endPathIndex;\n currentSelectorPathElementIndex = match.endPathElementIndex;\n if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) {\n curr entSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n }\n\n if (currentSelectorPathIndex < selectorPath.l ength && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPa th[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathIndex++;\n }\n\n path = path.concat (selectorPath.slice(currentSelectorPathIndex, selectorPath.length));\n pa th = path.map(function (currentValue) {\n // we can re-use elements h ere, because the visibility property matters only for selectors\n con st derived = currentValue.createDerived(currentValue.elements);\n if (isVisible) {\n derived.ensureVisibility();\n } else { \n derived.ensureInvisibility();\n }\n retu rn derived;\n });\n return path;\n }\n\n visitMedia(mediaNod e, visitArgs) {\n let newAllExtends = mediaNode.allExtends.concat(this.al lExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAll Extends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitMediaOut(media Node) {\n const lastIndex = this.allExtendsStack.length - 1;\n thi s.allExtendsStack.length = lastIndex;\n }\n\n visitAtRule(atRuleNode, visi tArgs) {\n let newAllExtends = atRuleNode.allExtends.concat(this.allExten dsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtend s.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitAtRuleOut(atRuleNod e) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.a llExtendsStack.length = lastIndex;\n }\n}\n\nexport default ProcessExtendsVis itor;\n","import Visitor from './visitor';\n\nclass JoinSelectorVisitor {\n c onstructor() {\n this.contexts = [[]];\n this._visitor = new Visit or(this);\n }\n\n run(root) {\n return this._visitor.visit(root);\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDee per = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode , visitArgs) {\n const context = this.contexts[this.contexts.length - 1]; \n const paths = [];\n let selectors;\n\n this.contexts.pus h(paths);\n\n if (!rulesetNode.root) {\n selectors = rulesetNo de.selectors;\n if (selectors) {\n selectors = selecto rs.filter(function(selector) { return selector.getIsOutput(); });\n rulesetNode.selectors = selectors.length ? selectors : (selectors = null);\n if (selectors) { rulesetNode.joinSelectors(paths, context, select ors); }\n }\n if (!selectors) { rulesetNode.rules = null; }\n rulesetNode.paths = paths;\n }\n }\n\n visitRulesetO ut(rulesetNode) {\n this.contexts.length = this.contexts.length - 1;\n }\n\n visitMedia(mediaNode, visitArgs) {\n const context = this.conte xts[this.contexts.length - 1];\n mediaNode.rules[0].root = (context.lengt h === 0 || context[0].multiMedia);\n }\n\n visitAtRule(atRuleNode, visitAr gs) {\n const context = this.contexts[this.contexts.length - 1];\n if (atRuleNode.rules && atRuleNode.rules.length) {\n atRuleNode.rule s[0].root = (atRuleNode.isRooted || context.length === 0 || null);\n }\n }\n}\n\nexport default JoinSelectorVisitor;\n","import tree from '../tree';\n import Visitor from './visitor';\n\nclass CSSVisitorUtils {\n constructor(con text) {\n this._visitor = new Visitor(this);\n this._context = con text;\n }\n\n containsSilentNonBlockedChild(bodyRules) {\n let rule ;\n if (!bodyRules) {\n return false;\n }\n for (let r = 0; r < bodyRules.length; r++) {\n rule = bodyRules[r];\n if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibil ity()) {\n // the atrule contains something that was referenced ( likely by extend)\n // therefore it needs to be shown in output t oo\n return true;\n }\n }\n return false ;\n }\n\n keepOnlyVisibleChilds(owner) {\n if (owner && owner.rules ) {\n owner.rules = owner.rules.filter(thing => thing.isVisible());\n }\n }\n\n isEmpty(owner) {\n return (owner && owner.rules) \n ? (owner.rules.length === 0) : true;\n }\n\n hasVisibleSelec tor(rulesetNode) {\n return (rulesetNode && rulesetNode.paths)\n ? (rulesetNode.paths.length > 0) : false;\n }\n\n resolveVisibility(nod e, originalRules) {\n if (!node.blocksVisibility()) {\n if (th is.isEmpty(node) && !this.containsSilentNonBlockedChild(originalRules)) {\n return ;\n }\n\n return node;\n }\n\n const compiledRulesBody = node.rules[0];\n this.keepOnlyVisibleChild s(compiledRulesBody);\n\n if (this.isEmpty(compiledRulesBody)) {\n return ;\n }\n\n node.ensureVisibility();\n node.remov eVisibilityBlock();\n\n return node;\n }\n\n isVisibleRuleset(rules etNode) {\n if (rulesetNode.firstRoot) {\n return true;\n }\n\n if (this.isEmpty(rulesetNode)) {\n return false;\n }\n\n if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode) ) {\n return false;\n }\n\n return true;\n }\n}\n\nc onst ToCSSVisitor = function(context) {\n this._visitor = new Visitor(this);\ n this._context = context;\n this.utils = new CSSVisitorUtils(context);\n} ;\n\nToCSSVisitor.prototype = {\n isReplacing: true,\n run: function (root ) {\n return this._visitor.visit(root);\n },\n\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.blocksVisibility() || dec lNode.variable) {\n return;\n }\n return declNode;\n },\n\n visitMixinDefinition: function (mixinNode, visitArgs) {\n // m ixin definitions do not get eval'd - this means they keep state\n // so w e have to clear that state here so it isn't used if toCSS is called twice\n mixinNode.frames = [];\n },\n\n visitExtend: function (extendNode, visi tArgs) {\n },\n\n visitComment: function (commentNode, visitArgs) {\n if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {\ n return;\n }\n return commentNode;\n },\n\n visi tMedia: function(mediaNode, visitArgs) {\n const originalRules = mediaNod e.rules[0].rules;\n mediaNode.accept(this._visitor);\n visitArgs.v isitDeeper = false;\n\n return this.utils.resolveVisibility(mediaNode, or iginalRules);\n },\n\n visitImport: function (importNode, visitArgs) {\n if (importNode.blocksVisibility()) {\n return ;\n }\n return importNode;\n },\n\n visitAtRule: function(atRuleNode, visitAr gs) {\n if (atRuleNode.rules && atRuleNode.rules.length) {\n r eturn this.visitAtRuleWithBody(atRuleNode, visitArgs);\n } else {\n return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);\n }\n },\n\n visitAnonymous: function(anonymousNode, visitArgs) {\n if (!an onymousNode.blocksVisibility()) {\n anonymousNode.accept(this._visito r);\n return anonymousNode;\n }\n },\n\n visitAtRuleWith Body: function(atRuleNode, visitArgs) {\n // if there is only one nested ruleset and that one has no path, then it is\n // just fake ruleset\n function hasFakeRuleset(atRuleNode) {\n const bodyRules = atRuleN ode.rules;\n return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);\n }\n function getBodyRules(atR uleNode) {\n const nodeRules = atRuleNode.rules;\n if (has FakeRuleset(atRuleNode)) {\n return nodeRules[0].rules;\n }\n\n return nodeRules;\n }\n // it is still true t hat it is only one ruleset in array\n // this is last such moment\n // process childs\n const originalRules = getBodyRules(atRuleNode);\n atRuleNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\ n\n if (!this.utils.isEmpty(atRuleNode)) {\n this._mergeRules( atRuleNode.rules[0].rules);\n }\n\n return this.utils.resolveVisib ility(atRuleNode, originalRules);\n },\n\n visitAtRuleWithoutBody: functio n(atRuleNode, visitArgs) {\n if (atRuleNode.blocksVisibility()) {\n return;\n }\n\n if (atRuleNode.name === '@charset') {\n // Only output the debug info together with subsequent @charset definitio ns\n // a comment (or @media statement) before the actual @charset at rule would\n // be considered illegal css as it has to be on the firs t line\n if (this.charset) {\n if (atRuleNode.debugInf o) {\n const comment = new tree.Comment(`/* ${atRuleNode.toCS S(this._context).replace(/\\n/g, '')} */\\n`);\n comment.debu gInfo = atRuleNode.debugInfo;\n return this._visitor.visit(co mment);\n }\n return;\n }\n this.charset = true;\n }\n\n return atRuleNode;\n },\n\n che ckValidNodes: function(rules, isRoot) {\n if (!rules) {\n retu rn;\n }\n\n for (let i = 0; i < rules.length; i++) {\n const ruleNode = rules[i];\n if (isRoot && ruleNode instanceof tree.D eclaration && !ruleNode.variable) {\n throw { message: 'Propertie s must be inside selector blocks. They cannot be in the root',\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileIn fo().filename};\n }\n if (ruleNode instanceof tree.Call) { \n throw { message: `Function '${ruleNode.name}' did not return a root node`,\n index: ruleNode.getIndex(), filename: ruleNode .fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ru leNode.type && !ruleNode.allowRoot) {\n throw { message: `${ruleN ode.type} node returned by a function is not valid here`,\n i ndex: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo(). filename};\n }\n }\n },\n\n visitRuleset: function (rule setNode, visitArgs) {\n // at this point rulesets are nested into each ot her\n let rule;\n\n const rulesets = [];\n\n this.checkVali dNodes(rulesetNode.rules, rulesetNode.firstRoot);\n\n if (!rulesetNode.ro ot) {\n // remove invisible paths\n this._compileRulesetPa ths(rulesetNode);\n\n // remove rulesets from this ruleset body and c ompile them separately\n const nodeRules = rulesetNode.rules;\n\n let nodeRuleCnt = nodeRules ? nodeRules.length : 0;\n for (le t i = 0; i < nodeRuleCnt; ) {\n rule = nodeRules[i];\n if (rule && rule.rules) {\n // visit because we are movi ng them out from being a child\n rulesets.push(this._visitor. visit(rule));\n nodeRules.splice(i, 1);\n nodeRuleCnt--;\n continue;\n }\n i++;\n }\n // accept the visitor to remove rules and ref actor itself\n // then we can decide nogw whether we want it or not\n // compile body\n if (nodeRuleCnt > 0) {\n rulesetNode.accept(this._visitor);\n } else {\n rules etNode.rules = null;\n }\n visitArgs.visitDeeper = false;\ n } else { // if (! rulesetNode.root) {\n rulesetNode.accept(t his._visitor);\n visitArgs.visitDeeper = false;\n }\n\n if (rulesetNode.rules) {\n this._mergeRules(rulesetNode.rules);\n this._removeDuplicateRules(rulesetNode.rules);\n }\n\n // now decide whether we keep the ruleset\n if (this.utils.isVisibleRuleset (rulesetNode)) {\n rulesetNode.ensureVisibility();\n rules ets.splice(0, 0, rulesetNode);\n }\n\n if (rulesets.length === 1) {\n return rulesets[0];\n }\n return rulesets;\n },\ n\n _compileRulesetPaths: function(rulesetNode) {\n if (rulesetNode.pa ths) {\n rulesetNode.paths = rulesetNode.paths\n .filt er(p => {\n let i;\n if (p[0].elements[0]. combinator.value === ' ') {\n p[0].elements[0].combinator = new(tree.Combinator)('');\n }\n for (i = 0; i < p.length; i++) {\n if (p[i].isVisible() && p[i]. getIsOutput()) {\n return true;\n }\n }\n return false;\n });\n }\n },\n\n _removeDuplicateRules: function(rules) {\n if (!rules) { return; }\n\n // remove duplicates\n const ruleCach e = {};\n\n let ruleList;\n let rule;\n let i;\n\n f or (i = rules.length - 1; i >= 0 ; i--) {\n rule = rules[i];\n if (rule instanceof tree.Declaration) {\n if (!ruleCache[rul e.name]) {\n ruleCache[rule.name] = rule;\n } else {\n ruleList = ruleCache[rule.name];\n if (ruleList instanceof tree.Declaration) {\n ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)];\n }\n const ruleCSS = rule.toCSS(this._context);\n if (ruleList.indexOf(ruleCSS) !== -1) {\n rules.splice(i, 1);\n } else {\n ru leList.push(ruleCSS);\n }\n }\n }\n }\n },\n\n _mergeRules: function(rules) {\n if (!rules) {\n return; \n }\n\n const groups = {};\n const groupsArr = [];\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n if (rule.merge) {\n const ke y = rule.name;\n groups[key] ? rules.splice(i--, 1) : \n groupsArr.push(groups[key] = []);\n groups[key].push(r ule);\n }\n }\n\n groupsArr.forEach(group => {\n if (group.length > 0) {\n const result = group[0];\n let space = [];\n const comma = [new tree.Expression(sp ace)];\n group.forEach(rule => {\n if ((rule.m erge === '+') && (space.length > 0)) {\n comma.push(new t ree.Expression(space = []));\n }\n space.p ush(rule.value);\n result.important = result.important || rul e.important;\n });\n result.value = new tree.Value (comma);\n }\n });\n }\n};\n\nexport default ToCSSVisitor;\ n","import Visitor from './visitor';\nimport ImportVisitor from './import-visito r';\nimport MarkVisibleSelectorsVisitor from './set-tree-visibility-visitor';\ni mport ExtendVisitor from './extend-visitor';\nimport JoinSelectorVisitor from '. /join-selector-visitor';\nimport ToCSSVisitor from './to-css-visitor';\n\nexport default {\n Visitor,\n ImportVisitor,\n MarkVisibleSelectorsVisitor,\n ExtendVisitor,\n JoinSelectorVisitor,\n ToCSSVisitor\n};\n","import ch unker from './chunker';\n\nexport default () => {\n let // Less input string\ n input;\n\n let // current chunk\n j;\n\n const // holds st ate for backtracking\n saveStack = [];\n\n let // furthest index the p arser has gone to\n furthest;\n\n let // if this is furthest we got to , this is the probably cause\n furthestPossibleErrorMessage;\n\n let / / chunkified input\n chunks;\n\n let // current chunk\n current ;\n\n let // index of current chunk, in `input`\n currentPos;\n\n c onst parserInput = {};\n const CHARCODE_SPACE = 32;\n const CHARCODE_TAB = 9;\n const CHARCODE_LF = 10;\n const CHARCODE_CR = 13;\n const CHARCOD E_PLUS = 43;\n const CHARCODE_COMMA = 44;\n const CHARCODE_FORWARD_SLASH = 47;\n const CHARCODE_9 = 57;\n\n function skipWhitespace(length) {\n const oldi = parserInput.i;\n const oldj = j;\n const curr = pa rserInput.i - currentPos;\n const endIndex = parserInput.i + current.leng th - curr;\n const mem = (parserInput.i += length);\n const inp = input;\n let c;\n let nextChar;\n let comment;\n\n f or (; parserInput.i < endIndex; parserInput.i++) {\n c = inp.charCode At(parserInput.i);\n\n if (parserInput.autoCommentAbsorb && c === CHA RCODE_FORWARD_SLASH) {\n nextChar = inp.charAt(parserInput.i + 1) ;\n if (nextChar === '/') {\n comment = {index : parserInput.i, isLineComment: true};\n let nextNewLine = in p.indexOf('\\n', parserInput.i + 2);\n if (nextNewLine < 0) { \n nextNewLine = endIndex;\n }\n parserInput.i = nextNewLine;\n comment.text = i np.substr(comment.index, parserInput.i - comment.index);\n pa rserInput.commentStore.push(comment);\n continue;\n } else if (nextChar === '*') {\n const nextStarSlash = inp.indexOf('*/', parserInput.i + 2);\n if (nextStarSlash >= 0) {\n comment = {\n index: pa rserInput.i,\n text: inp.substr(parserInput.i, nextSt arSlash + 2 - parserInput.i),\n isLineComment: false\ n };\n parserInput.i += comment.te xt.length - 1;\n parserInput.commentStore.push(comment);\ n continue;\n }\n }\n break;\n }\n\n if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {\n break;\n }\n }\n\n current = current.slice(leng th + parserInput.i - mem + curr);\n currentPos = parserInput.i;\n\n if (!current.length) {\n if (j < chunks.length - 1) {\n current = chunks[++j];\n skipWhitespace(0); // skip space at the beginning of a chunk\n return true; // things changed\n }\n parserInput.finished = true;\n }\n\n return o ldi !== parserInput.i || oldj !== j;\n }\n\n parserInput.save = () => {\n currentPos = parserInput.i;\n saveStack.push( { current, i: parser Input.i, j });\n };\n parserInput.restore = possibleErrorMessage => {\n\n if (parserInput.i > furthest || (parserInput.i === furthest && possibleEr rorMessage && !furthestPossibleErrorMessage)) {\n furthest = parserIn put.i;\n furthestPossibleErrorMessage = possibleErrorMessage;\n }\n const state = saveStack.pop();\n current = state.current;\n currentPos = parserInput.i = state.i;\n j = state.j;\n };\n parserInput.forget = () => {\n saveStack.pop();\n };\n parserInput. isWhitespace = offset => {\n const pos = parserInput.i + (offset || 0);\n const code = input.charCodeAt(pos);\n return (code === CHARCODE_S PACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);\ n };\n\n // Specialization of $(tok)\n parserInput.$re = tok => {\n if (parserInput.i > currentPos) {\n current = current.slice(parse rInput.i - currentPos);\n currentPos = parserInput.i;\n }\n\n const m = tok.exec(current);\n if (!m) {\n return null; \n }\n\n skipWhitespace(m[0].length);\n if (typeof m === 's tring') {\n return m;\n }\n\n return m.length === 1 ? m [0] : m;\n };\n\n parserInput.$char = tok => {\n if (input.charAt(p arserInput.i) !== tok) {\n return null;\n }\n skipWhite space(1);\n return tok;\n };\n\n parserInput.$str = tok => {\n const tokLength = tok.length;\n\n // https://jsperf.com/string-startsw ith/21\n for (let i = 0; i < tokLength; i++) {\n if (input.cha rAt(parserInput.i + i) !== tok.charAt(i)) {\n return null;\n }\n }\n\n skipWhitespace(tokLength);\n return tok;\n };\n\n parserInput.$quoted = loc => {\n const pos = loc || parserI nput.i;\n const startChar = input.charAt(pos);\n\n if (startChar ! == '\\'' && startChar !== '\"') {\n return;\n }\n const length = input.length;\n const currentPosition = pos;\n\n for (le t i = 1; i + currentPosition < length; i++) {\n const nextChar = inpu t.charAt(i + currentPosition);\n switch (nextChar) {\n case '\\\\':\n i++;\n continue;\n case '\\r':\n case '\\n':\n break;\n case startChar:\n const str = input.substr(curr entPosition, i + 1);\n if (!loc && loc !== 0) {\n skipWhitespace(i + 1);\n return str\n }\n return [startChar, str];\n def ault:\n }\n }\n return null;\n };\n\n /**\n * Permissive parsing. Ignores everything except matching {} [] () and quotes\n * until matching token (outside of blocks)\n */\n parserInput.$parseUnt il = tok => {\n let quote = '';\n let returnVal = null;\n l et inComment = false;\n let blockDepth = 0;\n const blockStack = [ ];\n const parseGroups = [];\n const length = input.length;\n const startPos = parserInput.i;\n let lastPos = parserInput.i;\n let i = parserInput.i;\n let loop = true;\n let testChar;\n\n if (typeof tok === 'string') {\n testChar = char => char === tok \n } else {\n testChar = char => tok.test(char)\n }\n\n do {\n let prevChar;\n let nextChar = input.charAt (i);\n if (blockDepth === 0 && testChar(nextChar)) {\n returnVal = input.substr(lastPos, i - lastPos);\n if (returnVal) {\n parseGroups.push(returnVal);\n }\n else {\n parseGroups.push(' ');\n }\n returnVal = parseGroups;\n skipWhitespace(i - sta rtPos);\n loop = false\n } else {\n if (inComment) {\n if (nextChar === '*' && \n input.charAt(i + 1) === '/') {\n i++;\n blockDepth--;\n inComment = false;\n }\n i++;\n continue;\n }\n switch (nextChar) {\n case '\\\\':\n i++;\n nextChar = input.charAt(i) ;\n parseGroups.push(input.substr(lastPos, i - lastPos + 1));\n lastPos = i + 1;\n break;\n case '/':\n if (input.charAt(i + 1) = == '*') {\n i++;\n inComme nt = true;\n blockDepth++;\n } \n break;\n case '\\'':\n case '\"':\n quote = parserInput.$quoted(i);\n if (quote) {\n parseGroups.push(i nput.substr(lastPos, i - lastPos), quote);\n i += quo te[1].length - 1;\n lastPos = i + 1;\n }\n else {\n skipWhit espace(i - startPos);\n returnVal = nextChar;\n loop = false;\n }\n break;\n case '{':\n blockStac k.push('}');\n blockDepth++;\n bre ak;\n case '(':\n blockStack.push(')') ;\n blockDepth++;\n break;\n case '[':\n blockStack.push(']');\n blockDepth++;\n break;\n case '}':\n case ')':\n case ']':\n const expected = blockStack.pop();\n if (nextChar === expected) {\n blockDepth--;\n } else {\n // move the parser to the error and return expected\n skipWhitespace(i - start Pos);\n returnVal = expected;\n loop = false;\n }\n }\n i++;\n if (i > length) {\n loop = false;\n }\n }\n prevChar = nextChar;\n } whi le (loop);\n\n return returnVal ? returnVal : null;\n }\n\n parserI nput.autoCommentAbsorb = true;\n parserInput.commentStore = [];\n parserIn put.finished = false;\n\n // Same as $(), but don't change the state of the p arser,\n // just return the match.\n parserInput.peek = tok => {\n if (typeof tok === 'string') {\n // https://jsperf.com/string-startsw ith/21\n for (let i = 0; i < tok.length; i++) {\n if ( input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return false;\n }\n }\n return true;\n } e lse {\n return tok.test(current);\n }\n };\n\n // Specia lization of peek()\n // TODO remove or change some currentChar calls to peekC har\n parserInput.peekChar = tok => input.charAt(parserInput.i) === tok;\n\n parserInput.currentChar = () => input.charAt(parserInput.i);\n\n parserInp ut.prevChar = () => input.charAt(parserInput.i - 1);\n\n parserInput.getInput = () => input;\n\n parserInput.peekNotNumeric = () => {\n const c = i nput.charCodeAt(parserInput.i);\n // Is the first char of the dimension 0 -9, '.', '+' or '-'\n return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c = == CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA;\n };\n\n parserInput.st art = (str, chunkInput, failFunction) => {\n input = str;\n parser Input.i = j = currentPos = furthest = 0;\n\n // chunking apparently makes things quicker (but my tests indicate\n // it might actually make things slower in node at least)\n // and it is a non-perfect parse - it can't r ecognise\n // unquoted urls, meaning it can't distinguish comments\n // meaning comments with quotes or {}() in them get 'counted'\n // and then lead to parse errors.\n // In addition if the chunking chunks in th e wrong place we might\n // not be able to parse a parser statement in on e go\n // this is officially deprecated but can be switched on via an opt ion\n // in the case it causes too much performance issues.\n if ( chunkInput) {\n chunks = chunker(str, failFunction);\n } else {\n chunks = [str];\n }\n\n current = chunks[0];\n\n skipWhitespace(0);\n };\n\n parserInput.end = () => {\n let me ssage;\n const isFinished = parserInput.i >= input.length;\n\n if (parserInput.i < furthest) {\n message = furthestPossibleErrorMessage ;\n parserInput.i = furthest;\n }\n return {\n isFinished,\n furthest: parserInput.i,\n furthestPossib leErrorMessage: message,\n furthestReachedEnd: parserInput.i >= input .length - 1,\n furthestChar: input[parserInput.i]\n };\n }; \n\n return parserInput;\n};\n","// Split the input into chunks.\nexport defa ult function (input, fail) {\n const len = input.length;\n let level = 0;\ n let parenLevel = 0;\n let lastOpening;\n let lastOpeningParen;\n l et lastMultiComment;\n let lastMultiCommentEndBrace;\n const chunks = [];\ n let emitFrom = 0;\n let chunkerCurrentIndex;\n let currentChunkStartI ndex;\n let cc;\n let cc2;\n let matched;\n\n function emitChunk(for ce) {\n const len = chunkerCurrentIndex - emitFrom;\n if (((len < 512) && !force) || !len) {\n return;\n }\n chunks.push( input.slice(emitFrom, chunkerCurrentIndex + 1));\n emitFrom = chunkerCurr entIndex + 1;\n }\n\n for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc = input.charCodeAt(chunkerCurrentIndex );\n if (((cc >= 97) && (cc <= 122)) || (cc < 34)) {\n // a-z or whitespace\n continue;\n }\n\n switch (cc) {\n case 40: // (\n parenLevel++;\n lastOpeningParen = chunkerCurrentIndex;\n continue;\n case 41: // )\n if (--parenLeve l < 0) {\n return fail('missing opening `(`', chunkerCurrentI ndex);\n }\n continue;\n case 59: // ;\n if (!parenLevel) { emitChunk(); }\n continue;\n case 123: // {\n level++;\n lastOpening = chunkerCurrentIndex;\n continue;\n case 125: // }\n if (--level < 0) {\n return fail('missing opening `{`', ch unkerCurrentIndex);\n }\n if (!level && !parenLeve l) { emitChunk(); }\n continue;\n case 92: // \\\n if (chunkerCurrentIndex < len - 1) { chunkerC urrentIndex++; continue; }\n return fail('unescaped `\\\\`', chun kerCurrentIndex);\n case 34:\n case 39:\n case 96: // \", ' and `\n matched = 0;\n currentChunkStartIndex = chunkerCurrentIndex;\n for (chu nkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCu rrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex) ;\n if (cc2 > 96) { continue; }\n if (cc2 == cc) { matched = 1; break; }\n if (cc2 == 92) { // \ \\n if (chunkerCurrentIndex == len - 1) {\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n }\n chunkerCurrentIndex++;\n }\n }\n if (matched) { continue; }\n return fail(`unmatched \\`${String.fromCharCode(cc)}\\``, currentChunkStar tIndex);\n case 47: // /, check for comment\n if (parenLevel || (chunkerCurrentIndex == len - 1)) { continue; } \n cc2 = input.charCodeAt(chunkerCurrentIndex + 1);\n if (cc2 == 47) {\n // //, find lnfeed\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunke rCurrentIndex);\n if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { break; }\n }\n } else if (cc2 == 4 2) {\n // /*, find */\n lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex;\n for (chunker CurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCu rrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIn dex);\n if (cc2 == 125) { lastMultiCommentEndBrace = chun kerCurrentIndex; }\n if (cc2 != 42) { continue; }\n if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { break; }\n }\n if (chunkerCurrentIndex == len - 1 ) {\n return fail('missing closing `*/`', currentChunkSta rtIndex);\n }\n chunkerCurrentIndex++;\n }\n continue;\n case 42: // *, check for unmatched */\n if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) {\n return fail('unmatched `/*`', chunkerCurrentIndex);\n }\n continue;\n }\n }\n\n if (level !== 0) {\n if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiCommen t)) {\n return fail('missing closing `}` or `*/`', lastOpening);\n } else {\n return fail('missing closing `}`', lastOpening);\n }\n } else if (parenLevel !== 0) {\n return fail('missing closing `)`', lastOpeningParen);\n }\n\n emitChunk(true);\n return chunks;\n}; \n","import LessError from '../less-error';\nimport tree from '../tree';\nimport visitors from '../visitors';\nimport getParserInput from './parser-input';\nimp ort * as utils from '../utils';\nimport functionRegistry from '../functions/func tion-registry';\n\n//\n// less.js - parser\n//\n// A relatively straight-forw ard predictive parser.\n// There is no tokenization/lexing stage, the input i s parsed\n// in one sweep.\n//\n// To make the parser fast enough to run i n the browser, several\n// optimization had to be made:\n//\n// - Matching and slicing on a huge input is often cause of slowdowns.\n// The solution is to chunkify the input into smaller strings.\n// The chunks are stored in the `chunks` var,\n// `j` holds the current chunk index, and `currentPos` holds\n// the index of the current chunk in relation to `input`.\n// T his gives us an almost 4x speed-up.\n//\n// - In many cases, we don't need to match individual tokens;\n// for example, if a value doesn't hold any vari ables, operations\n// or dynamic references, the parser can effectively 'sk ip' it,\n// treating it as a literal.\n// An example would be '1px sol id #000' - which evaluates to itself,\n// we don't need to know what the in dividual components are.\n// The drawback, of course is that you don't get the benefits of\n// syntax-checking on the CSS. This gives us a 50% speed-u p in the parser,\n// and a smaller speed-up in the code-gen.\n//\n//\n// Token matching is done with the `$` function, which either takes\n// a termi nal string or regexp, or a non-terminal function to call.\n// It also takes c are of moving all the indices forwards.\n//\n\nconst Parser = function Parser(co ntext, imports, fileInfo) {\n let parsers;\n const parserInput = getParser Input();\n\n function error(msg, type) {\n throw new LessError(\n {\n index: parserInput.i,\n filename: fileI nfo.filename,\n type: type || 'Syntax',\n message: msg\n },\n imports\n );\n }\n\n function exp ect(arg, msg) {\n // some older browsers return typeof 'function' for Reg Exp\n const result = (arg instanceof Function) ? arg.call(parsers) : pars erInput.$re(arg);\n if (result) {\n return result;\n }\ n \n error(msg || (typeof arg === 'string'\n ? `expecte d '${arg}' got '${parserInput.currentChar()}'`\n : 'unexpected token' ));\n }\n\n // Specialization of expect()\n function expectChar(arg, ms g) {\n if (parserInput.$char(arg)) {\n return arg;\n }\ n error(msg || `expected '${arg}' got '${parserInput.currentChar()}'`);\n }\n\n function getDebugInfo(index) {\n const filename = fileInfo.f ilename;\n\n return {\n lineNumber: utils.getLocation(index, p arserInput.getInput()).line + 1,\n fileName: filename\n };\n }\n\n /**\n * Used after initial parsing to create nodes on the fly\n * \n * @param {String} str - string to parse \n * @param {Array} parseList - array of parsers to run input through e.g. [\"value\", \ "important\"]\n * @param {Number} currentIndex - start number to begin inde xing\n * @param {Object} fileInfo - fileInfo to attach to created nodes \n */\n function parseNode(str, parseList, currentIndex, fileInfo, callba ck) {\n let result;\n const returnNodes = [];\n const parse r = parserInput;\n\n try {\n parser.start(str, false, function fail(msg, index) {\n callback({\n message: ms g,\n index: index + currentIndex\n });\n });\n for (let x = 0, p, i; (p = parseList[x]); x++) {\n i = parser.i;\n result = parsers[p]();\n if (result) {\n try {\n result._index = i + currentIndex;\n result._fileInfo = fileInfo;\n } catch (e) {}\n returnNodes.push(result);\n }\n else {\n returnNodes.push(nu ll);\n }\n }\n\n const endInfo = parser.end ();\n if (endInfo.isFinished) {\n callback(null, retur nNodes);\n }\n else {\n callback(true, null );\n }\n } catch (e) {\n throw new LessError({\n index: e.index + currentIndex,\n message: e.message\ n }, imports, fileInfo.filename);\n }\n }\n\n //\n // The Parser\n //\n return {\n parserInput,\n imports,\n fileInfo,\n parseNode,\n //\n // Parse an input string i nto an abstract syntax tree,\n // @param str A string containing 'less' m arkup\n // @param callback call `callback` when done.\n // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply\n //\n parse: function (str, callback, additio nalData) {\n let root;\n let error = null;\n le t globalVars;\n let modifyVars;\n let ignored;\n let preText = '';\n\n globalVars = (additionalData && additionalDat a.globalVars) ? `${Parser.serializeVars(additionalData.globalVars)}\\n` : '';\n modifyVars = (additionalData && additionalData.modifyVars) ? `\\n${Pa rser.serializeVars(additionalData.modifyVars)}` : '';\n\n if (context .pluginManager) {\n const preProcessors = context.pluginManager.g etPreProcessors();\n for (let i = 0; i < preProcessors.length; i+ +) {\n str = preProcessors[i].process(str, { context, imports , fileInfo });\n }\n }\n\n if (globalVars | | (additionalData && additionalData.banner)) {\n preText = ((addi tionalData && additionalData.banner) ? additionalData.banner : '') + globalVars; \n ignored = imports.contentsIgnoredChars;\n ignor ed[fileInfo.filename] = ignored[fileInfo.filename] || 0;\n ignore d[fileInfo.filename] += preText.length;\n }\n\n str = str. replace(/\\r\\n?/g, '\\n');\n // Remove potential UTF Byte Order Mark \n str = preText + str.replace(/^\\uFEFF/, '') + modifyVars;\n imports.contents[fileInfo.filename] = str;\n\n // Start with the primary rule.\n // The whole syntax tree is held under a Ruleset nod e,\n // with the `root` property set to true, so no `{}` are\n // output. The callback is called when the input is parsed.\n tr y {\n parserInput.start(str, context.chunkInput, function fail(ms g, index) {\n throw new LessError({\n index,\n type: 'Parse',\n message: msg,\n filename: fileInfo.filename\n }, imports);\n });\n\n tree.Node.prototype.parse = this;\n root = new tree.Ruleset(null, this.parsers.primary());\n tree.Node.prototype.rootNode = root;\n root.root = true;\n root.firstRoot = true;\n root.functionRe gistry = functionRegistry.inherit();\n \n } catch (e) {\n return callback(new LessError(e, imports, fileInfo.filename)) ;\n }\n\n // If `i` is smaller than the `input.length - 1` ,\n // it means the parser wasn't able to parse the whole\n // string, so we've got a parsing error.\n //\n // We tr y to extract a \\n delimited string,\n // showing the line where the parse error occurred.\n // We split it up into two parts (the part wh ich parsed,\n // and the part which didn't), so we can color them dif ferently.\n const endInfo = parserInput.end();\n if (!endI nfo.isFinished) {\n\n let message = endInfo.furthestPossibleError Message;\n\n if (!message) {\n message = 'Unre cognised input';\n if (endInfo.furthestChar === '}') {\n message += '. Possibly missing opening \\'{\\'';\n } else if (endInfo.furthestChar === ')') {\n mes sage += '. Possibly missing opening \\'(\\'';\n } else if (en dInfo.furthestReachedEnd) {\n message += '. Possibly miss ing something';\n }\n }\n\n err or = new LessError({\n type: 'Parse',\n me ssage,\n index: endInfo.furthest,\n filena me: fileInfo.filename\n }, imports);\n }\n\n const finish = e => {\n e = error || e || imports.error;\n\n if (e) {\n if (!(e instanceof LessError)) {\n e = new LessError(e, imports, fileInfo.filename);\n }\n\n return callback(e);\n }\n else {\n return callback(null, root);\n }\n };\n\n if (context.processImports !== false) {\ n new visitors.ImportVisitor(imports, finish)\n .run(root);\n } else {\n return finish();\n }\n },\n\n //\n // Here in, the parsing rules/functions\ n //\n // The basic structure of the syntax tree generated is as f ollows:\n //\n // Ruleset -> Declaration -> Value -> Expression -> Entity\n //\n // Here's some Less code:\n //\n / / .class {\n // color: #fff;\n // border: 1px solid # 000;\n // width: @w + 4px;\n // > .child {...}\n // }\n //\n // And here's what the parse tree might look like:\ n //\n // Ruleset (Selector '.class', [\n // De claration (\"color\", Value ([Expression [Color #fff]]))\n // De claration (\"border\", Value ([Expression [Dimension 1px][Keyword \"solid\"][Col or #000]]))\n // Declaration (\"width\", Value ([Expression [Ope ration \" + \" [Variable \"@w\"][Dimension 4px]]]))\n // Ruleset (Selector [Element '>', '.child'], [...])\n // ])\n //\n // In general, most rules will try to parse a token with the `$re()` function , and if the return\n // value is truly, will return a new node, of the relevant type. Sometimes, we need to check\n // first, before parsing, t hat's when we use `peek()`.\n //\n parsers: parsers = {\n //\n // The `primary` rule is the *entry* and *exit* point of the parser.\n // The rules here can appear at any level of the parse tree .\n //\n // The recursive nature of the grammar is an inte rplay between the `block`\n // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,\n // as represented by this simplified grammar:\n //\n // primary → (ruleset | d eclaration)+\n // ruleset → selector+ block\n // block → '{' primary '}'\n //\n // Only at one point i s the primary rule not called from the\n // block rule: at the root l evel.\n //\n primary: function () {\n const mixin = this.mixin;\n let root = [];\n let node;\ n\n while (true) {\n while (true) {\n node = this.comment();\n if (!node) { brea k; }\n root.push(node);\n }\n // always process comments before deciding if finished\n if (parserInput.finished) {\n break;\n }\n if (parserInput.peek('}')) {\n break;\n }\n\n node = this.extendRule ();\n if (node) {\n root = root.concat (node);\n continue;\n }\n\n node = mixin.definition() || this.declaration() || mixin.call(false, fa lse) || \n this.ruleset() || this.variableCall() || this. entities.call() || this.atrule();\n if (node) {\n root.push(node);\n } else {\n let foundSemiColon = false;\n while (parserInput.$cha r(';')) {\n foundSemiColon = true;\n }\n if (!foundSemiColon) {\n break;\n }\n }\n }\n\n return root;\n },\n\n // comments are collected by the main parsing mechanism and then assigned to nodes\n // where the current structure allows it\n comment: function () {\n if (parserInput.commentStore.length) {\n const comment = parserInput.commentStore.shift();\n return new(tre e.Comment)(comment.text, comment.isLineComment, comment.index, fileInfo);\n }\n },\n\n //\n // Entities are toke ns which can be found inside an Expression\n //\n entities : {\n mixinLookup: function() {\n return parse rs.mixin.call(true, true);\n },\n //\n // A string, which supports escaping \" and '\n //\n // \"milky way\" 'he\\'s the one!'\n //\n quoted: function (forceEscaped) {\n let str;\n const index = parserInput.i;\n let isEscaped = false; \n\n parserInput.save();\n if (parserInput .$char('~')) {\n isEscaped = true;\n } else if (forceEscaped) {\n parserInput.restore();\n return;\n }\n\n str = p arserInput.$quoted();\n if (!str) {\n parserInput.restore();\n return;\n }\n parserInput.forget();\n\n return new(tree .Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index, fileInf o);\n },\n\n //\n // A catch-all wo rd, such as:\n //\n // black border-collapse\n //\n keyword: function () {\n const k = parserInput.$char('%') || parserInput.$re(/^\\[?(?:[\\w-]|\\\\(?:[A-Fa -f0-9]{1,6} ?|[^A-Fa-f0-9]))+\\]?/);\n if (k) {\n return tree.Color.fromKeyword(k) || new(tree.Keyword)(k);\n }\n },\n\n //\n // A fun ction call\n //\n // rgb(255, 0, 255)\n //\n // The arguments are parsed with the `entities.argu ments` parser.\n //\n call: function () {\n let name;\n let args;\n let f unc;\n const index = parserInput.i;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (parserInput.peek(/^url\\(/i)) {\n return;\ n }\n\n parserInput.save();\n\n name = parserInput.$re(/^([\\w-]+|%|~|progid:[\\w\\.]+)\\(/);\n if (!name) {\n parserInput.forget(); \n return;\n }\n\n name = n ame[1];\n func = this.customFuncCall(name);\n if (func) {\n args = func.parse();\n if (args && func.stop) {\n parserInput.forget( );\n return args;\n }\n }\n\n args = this.arguments(args);\n\n if (!parserInput.$char(')')) {\n parserInput.re store('Could not parse call arguments or missing \\')\\'');\n return;\n }\n\n parserInput.forget(); \n\n return new(tree.Call)(name, args, index, fileInfo);\n },\n \n //\n // Parsin g rules for functions with non-standard args, e.g.:\n //\n // boolean(not(2 > 1))\n //\n // This is a quick prototype, to be modified/improved when\n // more custom-parsed funcs come (e.g. `selector(...)`)\n //\n\n customFuncCall: function (name) {\n /* Ideally th e table is to be moved out of here for faster perf.,\n but it's quite tricky since it relies on all these `parsers`\n and `expect` available only here */\n return {\n alpha: f(parsers.ieAlpha, true),\n boolean : f(condition),\n 'if': f(condition)\n }[name.toLowerCase()];\n\n function f(parse, stop) {\n return {\n parse, // parsing fun ction\n stop // when true - stop after parse() and return its result, \n // otherwise continue for plain args\n };\n }\n \n function condition() {\n return [expect(p arsers.condition, 'expected condition')];\n }\n },\n\n arguments: function (prevArgs) {\n le t argsComma = prevArgs || [];\n const argsSemiColon = [];\n let isSemiColonSeparated;\n let value;\n\n parserInput.save();\n\n while (true) {\n if (prevArgs) {\n prevArgs = fa lse;\n } else {\n value = pars ers.detachedRuleset() || this.assignment() || parsers.expression();\n if (!value) {\n break;\n }\n\n if (value.value && value.va lue.length == 1) {\n value = value.value[0];\n }\n\n argsComma.push(value); \n }\n\n if (parserInput.$char(',' )) {\n continue;\n }\n\n if (parserInput.$char(';') || isSemiColonSeparated) {\n isSemiColonSeparated = true;\n v alue = (argsComma.length < 1) ? argsComma[0]\n : new tree.Value(argsComma);\n argsSemiColon.push(value );\n argsComma = [];\n }\n }\n\n parserInput.forget();\n return isSemiColonSeparated ? argsSemiColon : argsComma;\n }, \n literal: function () {\n return this.dimens ion() ||\n this.color() ||\n this.quoted() ||\n this.unicodeDescriptor();\n },\n\n // Assignments are argument entities for calls.\n // They are present in ie filter properties as shown below.\n //\n // filter: progid:DXImageTransform.Microsof t.Alpha( *opacity=50* )\n //\n\n assignment: funct ion () {\n let key;\n let value;\n parserInput.save();\n key = parserInput.$re(/^\\w +(?=\\s?=)/i);\n if (!key) {\n parserI nput.restore();\n return;\n }\n if (!parserInput.$char('=')) {\n parserInput .restore();\n return;\n }\n value = parsers.entity();\n if (value) {\n parserInput.forget();\n return new(tree.Ass ignment)(key, value);\n } else {\n par serInput.restore();\n }\n },\n\n //\n // Parse url() tokens\n //\n // We use a specific rule for urls, because they don't really behave like\n // standard function calls. The difference is that the argument does n't have\n // to be enclosed within a string, so it can't be pars ed as an Expression.\n //\n url: function () {\n let value;\n const index = parserInput.i;\n \n parserInput.autoCommentAbsorb = false;\n\n if (!parserInput.$str('url(')) {\n parserInput.autoCo mmentAbsorb = true;\n return;\n }\n\n value = this.quoted() || this.variable() || this.property() | |\n parserInput.$re(/^(?:(?:\\\\[\\(\\)'\"])|[^\\(\\) '\"])+/) || '';\n\n parserInput.autoCommentAbsorb = true;\n\n expectChar(')');\n\n return new(tree.URL) ((value.value != null || \n value instanceof tree.Variabl e || \n value instanceof tree.Property) ?\n value : new(tree.Anonymous)(value, index), index, fileInfo);\n },\n\n //\n // A Variable entity, such as `@fink`, in\n //\n // width: @fink + 2px\n //\n // We use a different parser for variable defini tions,\n // see `parsers.variable`.\n //\n variable: function () {\n let ch;\n let name;\n const index = parserInput.i;\n\n parserInput.save();\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\\w-]+/))) {\n ch = parserInput.currentChar();\n if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\\s/)) {\n // thi s may be a VariableCall lookup\n const result = parse rs.variableCall(name);\n if (result) {\n parserInput.forget();\n return result;\n }\n }\n parserInput.forget();\n return new(tree.Varia ble)(name, index, fileInfo);\n }\n parserI nput.restore();\n },\n\n // A variable entity usin g the protective {} e.g. @{var}\n variableCurly: function () {\n let curly;\n const index = parserInput.i;\ n\n if (parserInput.currentChar() === '@' && (curly = parserI nput.$re(/^@\\{([\\w-]+)\\}/))) {\n return new(tree.Varia ble)(`@${curly[1]}`, index, fileInfo);\n }\n } ,\n //\n // A Property accessor, such as `$color`, in\n //\n // background-color: $color\n //\n property: function () {\n let n ame;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\\$[\\w-]+/))) {\n return new(tree.Property)(name, index, fileInfo);\n }\n },\n\n // A property entity useing the protective {} e.g. ${prop}\n propertyCurly: function ( ) {\n let curly;\n const index = parserInp ut.i;\n\n if (parserInput.currentChar() === '$' && (curly = p arserInput.$re(/^\\$\\{([\\w-]+)\\}/))) {\n return new(tr ee.Property)(`$${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Hexadecimal color\n //\n // #4F3C2F\n //\n / / `rgb` and `hsl` colors are parsed through the `entities.call` parser.\n //\n color: function () {\n let rgb;\ n parserInput.save();\n\n if (parserInput. currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6 }|[A-Fa-f0-9]{3,4})([\\w.#\\[])?/))) {\n if (!rgb[2]) {\n parserInput.forget();\n r eturn new(tree.Color)(rgb[1], undefined, rgb[0]);\n } \n }\n parserInput.restore();\n },\n\n colorKeyword: function () {\n parserI nput.save();\n const autoCommentAbsorb = parserInput.autoComm entAbsorb;\n parserInput.autoCommentAbsorb = false;\n const k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);\n parserInput.autoCommentAbsorb = autoCommentAbsorb;\n if (!k) {\n parserInput.forget();\n return;\n }\n parserInput.restore();\n const color = tree.Color.fromKeyword(k);\n if (color) {\n parserInput.$str(k);\n return color;\n }\n },\n\n //\n // A Dimension, that is, a number and a unit\n //\n // 0.5em 95%\n //\n dim ension: function () {\n if (parserInput.peekNotNumeric()) {\n return;\n }\n\n co nst value = parserInput.$re(/^([+-]?\\d*\\.?\\d+)(%|[a-z_]+)?/i);\n if (value) {\n return new(tree.Dimension)(value[1] , value[2]);\n }\n },\n\n //\n // A unicode descriptor, as is used in unicode-range\n //\n // U+0?? or U+00A1-00A9\n //\n unicodeDescriptor: function () {\n let ud;\n\n ud = parserInput.$re(/^U\\+[0-9a-fA-F?]+(\\-[0-9a-fA-F?]+)?/);\n if (ud) {\n return new(tree.UnicodeDescri ptor)(ud[0]);\n }\n },\n\n //\n // JavaScript code to be evaluated\n //\n // `window.location.href`\n //\n javas cript: function () {\n let js;\n const ind ex = parserInput.i;\n\n parserInput.save();\n\n const escape = parserInput.$char('~');\n const jsQuote = parserInput.$char('`');\n\n if (!jsQuote) {\n parserInput.restore();\n return;\n }\n\n js = parserInput.$re(/^[^`]*`/);\n if (js) {\n parserInput.forget();\n return new(tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape) , index, fileInfo);\n }\n parserInput.rest ore('invalid javascript definition');\n }\n },\n\n //\n // The variable part of a variable definition. Used in t he `rule` parser\n //\n // @fink:\n //\n variable: function () {\n let name;\n\n i f (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\\w-]+)\\s* :/))) { return name[1]; }\n },\n\n //\n // Call a variable value to retrieve a detached ruleset\n // or a value from a detached ruleset's rules.\n //\n // @fink();\n // @fink;\n // color: @fink[@color];\n //\n variableCall: function (parsedName) {\n let lookups;\ n const i = parserInput.i;\n const inValue = !!par sedName;\n let name = parsedName;\n\n parserInput. save();\n\n if (name || (parserInput.currentChar() === '@'\n && (name = parserInput.$re(/^(@[\\w-]+)(\\(\\s*\\))?/)))) {\n\n lookups = this.mixin.ruleLookups();\n\n if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()') )) {\n parserInput.restore('Missing \\'[...]\\' lookup in variable call');\n return;\n }\n\n if (!inValue) {\n name = name[1];\n }\n\n const call = new tree.VariableCall(name, i, fileInfo);\n if (!inValue && parsers.end()) {\n parserInput.forget();\n return call;\n }\n else {\n parserInpu t.forget();\n return new tree.NamespaceValue(call, lookup s, i, fileInfo);\n }\n }\n\n pa rserInput.restore();\n },\n\n //\n // extend sy ntax - used to extend selectors\n //\n extend: function(is Rule) {\n let elements;\n let e;\n const index = parserInput.i;\n let option;\n let e xtendList;\n let extend;\n\n if (!parserInput.$str (isRule ? '&:extend(' : ':extend(')) {\n return;\n }\n\n do {\n option = null;\n elements = null;\n while (!(option = parserInput.$re( /^(all)(?=\\s*(\\)|,))/))) {\n e = this.element();\n if (!e) {\n break;\n }\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n }\n\n option = option && option[1];\n if (!elements) {\n error('Missing target selector for :extend().');\n }\n extend = new(tree.Extend)(new(tree.Selec tor)(elements), option, index, fileInfo);\n if (extendList) { \n extendList.push(extend);\n } else { \n extendList = [ extend ];\n }\n } while (parserInput.$char(','));\n\n expect(/^\\)/);\ n\n if (isRule) {\n expect(/^;/);\n }\n\n return extendList;\n },\n\n //\n // extendRule - used in a rule to extend all the parent selectors\n //\n extendRule: function() {\n return this .extend(true);\n },\n\n //\n // Mixins\n //\n mixin: {\n //\n // A Mixin ca ll, with an optional argument list\n //\n // # mixins > .square(#fff);\n // #mixins.square(#fff);\n // .rounded(4px, black);\n // .button;\n //\n // We can lookup / return a value using the lookup syn tax:\n //\n // color: #mixin.square(#fff)[@col or];\n //\n // The `while` loop is there because m ixins can be\n // namespaced, but we only support the child and d escendant\n // selector for now.\n //\n call: function (inValue, getLookup) {\n const s = parser Input.currentChar();\n let important = false;\n let lookups;\n const index = parserInput.i;\n let elements;\n let args;\n let hasParens;\n\n if (s !== '.' && s !== '#') { return; }\n\n parserInput.save(); // stop us absorbing part of an invalid sel ector\n\n elements = this.elements();\n\n if (elements) {\n if (parserInput.$char('(')) {\n args = this.args(true).args;\n ex pectChar(')');\n hasParens = true;\n }\n\n if (getLookup !== false) {\n lookups = this.ruleLookups();\n }\n if (getLookup === true && !lookups) {\n parserInput.restore();\n return;\n }\n\n if (inValue && !lookups && !hasParens) {\n // This isn't a valid in-value mixin call\n parserInput.restore();\n return;\n }\n\n if (!inValue && parsers.import ant()) {\n important = true;\n }\n\n if (inValue || parsers.end()) {\n parserInput.forget();\n const mixin = new( tree.mixin.Call)(elements, args, index, fileInfo, !lookups && important);\n if (lookups) {\n return ne w tree.NamespaceValue(mixin, lookups);\n }\n else {\n return mixin;\n }\n }\n }\n\n parserInput.restore();\n },\n /** \n * Matching elements for mixins\n * (Start wit h . or # and can have > )\n */\n elements: functi on() {\n let elements;\n let e;\n let c;\n let elem;\n let elemIn dex;\n const re = /^[#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[ ^A-Fa-f0-9]))+/;\n while (true) {\n el emIndex = parserInput.i;\n e = parserInput.$re(re);\n \n if (!e) {\n break;\n }\n elem = new(tree. Element)(c, e, false, elemIndex, fileInfo);\n if (element s) {\n elements.push(elem);\n } else {\n elements = [ elem ];\n }\n c = parserInput.$char('>');\n }\n return elements;\n },\n arg s: function (isCall) {\n const entities = parsers.entities;\n const returner = { args:null, variadic: false };\n let expressions = [];\n const argsSemiColon = [];\n const argsComma = [];\n let isSemiColonSe parated;\n let expressionContainsNamed;\n let name;\n let nameLoop;\n let value;\n let arg;\n let expand;\n let hasSep = true;\n\n parserInput.save();\n\n while (true) {\n if (isCall) {\n arg = parsers.detachedRuleset() || parsers.expression();\n } else {\n parserInput.commentStore.length = 0;\n if (parserInput.$str('...')) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ variadic: true });\n break;\n }\n arg = entities.variable() || entities.property() || entities.literal() || enti ties.keyword() || this.call(true);\n }\n\n if (!arg || !hasSep) {\n break;\n }\n\n nameLoop = null;\n if (arg.throwAwayComments) {\n arg.throwAwayComme nts();\n }\n value = arg;\n let val = null;\n\n if (isCall) {\n // Variable\n if (arg.value && arg.value.length == 1) {\n val = arg.value[0];\n }\n } else {\n val = arg;\n }\n\n if (val && (val instanceof tree.Variable || val instanceof tree.Property)) {\n if (parserInput.$char(':')) {\n if (expressions.length > 0) {\n if (is SemiColonSeparated) {\n error('Cannot mix ; and , as delimiter types');\n }\n expressionContainsNamed = true;\n }\n\n value = parsers.detachedRuleset () || parsers.expression();\n\n if (!value) {\n if (isCall) {\n error('could not understand value for named argument');\n } else {\n parserIn put.restore();\n returner.args = [];\n return returner;\n }\n }\n nameLoop = (name = val.name);\n } else if (parserInp ut.$str('...')) {\n if (!isCall) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiC olon : argsComma)\n .push({ name: arg.nam e, variadic: true });\n break;\n } else {\n expand = true;\ n }\n } else if (!isCa ll) {\n name = nameLoop = val.name;\n value = null;\n }\n }\n\n if (value) {\n expressions.push(value);\n }\n\n argsComma.push({ name:nameLoop, value, expand });\n\n if (parserInput.$char(',')) {\n hasSep = true;\n continue;\n }\n hasSep = parserInput.$char(';') === ';';\n\n if (hasSep || isSemiColonSeparated) {\n\n if (expressionContain sNamed) {\n error('Cannot mix ; and , as delimite r types');\n }\n\n isSemiC olonSeparated = true;\n\n if (expressions.length > 1) {\n value = new(tree.Value)(expressions);\n }\n argsSemiColon.push({ name, value, expand });\n\n name = null;\n expressions = [];\n expressionContainsNam ed = false;\n }\n }\n\n parserInput.forget();\n returner.args = isSemiColonSepar ated ? argsSemiColon : argsComma;\n return returner;\n },\n //\n // A Mixin definition, with a l ist of parameters\n //\n // .rounded (@radius: 2px, @color) {\n // ...\n // }\n //\n // Until we have a finer grained state-machine, we have to\n // do a look-ahead, to make sure we don't have a mixin call.\n // See the `rule` function for more information.\n //\n // We start by matching `.rounded (`, and then pro ceed on to\n // the argument list, which has optional default val ues.\n // We store the parameters in `params`, with a `value` key ,\n // if there is a value, such as in the case of `@radius`.\n //\n // Once we've got our params list, and a closi ng `)`, we parse\n // the `{...}` block.\n //\n definition: function () {\n let name;\n let params = [];\n let match;\n let ruleset;\n let cond;\n let variadic = false;\n if ((parserInput.currentChar() !== '.' && parserInp ut.currentChar() !== '#') ||\n parserInput.peek(/^[^{]*\\ }/)) {\n return;\n }\n\n parserInput.save();\n\n match = parserInput.$re(/^([#.] (?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\\s*\\(/);\n if (match) {\n name = match[1];\n\n const argInfo = this.args(false);\n params = argInf o.args;\n variadic = argInfo.variadic;\n\n // .mixincall(\"@{a}\");\n // looks a bit like a mixin definition..\n // also\n // .mixincall(@a: {rule: set;});\n // so we have to be nice and restore\n if (!parserInput.$char(')')) {\n parserInput.restore('Missing closing \\')\\'');\n return;\n }\n\n par serInput.commentStore.length = 0;\n\n if (parserInput.$st r('when')) { // Guard\n cond = expect(parsers.conditi ons, 'expected condition');\n }\n\n ruleset = parsers.block();\n\n if (ruleset) {\n parserInput.forget();\n return ne w(tree.mixin.Definition)(name, params, ruleset, cond, variadic);\n } else {\n parserInput.restore();\n }\n } else {\n parserI nput.restore();\n }\n },\n \n ruleLookups: function() {\n let rule;\n let args;\n const lookups = [];\n\n if (parserInput.currentChar() !== '[') { \n return;\n }\n\n while (true) {\n parserInput.save();\n args = null;\n rule = this.lookupValue();\n if (!rule && rule !== '') {\n parserInput.restore();\n break;\n }\n lookups.push(r ule);\n parserInput.forget();\n }\n if (lookups.length > 0) {\n return looku ps;\n }\n },\n \n lookupValu e: function() {\n parserInput.save();\n \n if (!parserInput.$char('[')) { \n parserInput.restore ();\n return;\n }\n \n const name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);\n \n if (!parserInput.$char(']')) {\n parserIn put.restore();\n return;\n } \n\n if (name || name === '') {\n parserInput.f orget();\n return name;\n }\n \n parserInput.restore();\n }\n },\n //\n // Entities are the smallest recognized token,\n // and can be found inside a rule's value.\n //\n enti ty: function () {\n const entities = this.entities;\n\n return this.comment() || entities.literal() || entities.variable() || enti ties.url() ||\n entities.property() || entities.call() || ent ities.keyword() || this.mixin.call(true) ||\n entities.javasc ript();\n },\n\n //\n // A Declaration terminat or. Note that we use `peek()` to check for '}',\n // because the `blo ck` rule will be expecting it, but we still need to make sure\n // it 's there, if ';' was omitted.\n //\n end: function () {\n return parserInput.$char(';') || parserInput.peek('}');\n },\n\n //\n // IE's alpha function\n //\n // alpha(opacity=88)\n //\n ieAlpha: functio n () {\n let value;\n\n // http://jsperf.com/case- insensitive-regex-vs-strtolower-then-regex/18\n if (!parserInput. $re(/^opacity=/i)) { return; }\n value = parserInput.$re(/^\\d+/) ;\n if (!value) {\n value = expect(parsers.ent ities.variable, 'Could not parse alpha');\n value = `@{${valu e.name.slice(1)}}`;\n }\n expectChar(')');\n return new tree.Quoted('', `alpha(opacity=${value})`);\n }, \n\n //\n // A Selector Element\n //\n // div\n // + h1\n // #socks\n / / input[type=\"text\"]\n //\n // Elements are the buil ding blocks for Selectors,\n // they are made out of a `Combinator` ( see combinator rule),\n // and an element name, such as a tag a class , or `*`.\n //\n element: function () {\n l et e;\n let c;\n let v;\n const ind ex = parserInput.i;\n\n c = this.combinator();\n\n e = parserInput.$re(/^(?:\\d+\\.\\d+|\\d+)%/) ||\n parserInp ut.$re(/^(?:[.#]?|:*)(?:[\\w-]|[^\\x00-\\x9f]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f 0-9]))+/) ||\n parserInput.$char('*') || parserInput.$char('& ') || this.attribute() ||\n parserInput.$re(/^\\([^&()@]+\\)/ ) || parserInput.$re(/^[\\.#:](?=@)/) ||\n this.entities.var iableCurly();\n\n if (!e) {\n parserInput.save ();\n if (parserInput.$char('(')) {\n if ((v = this.selector(false)) && parserInput.$char(')')) {\n e = new(tree.Paren)(v);\n parserInput.forget ();\n } else {\n parserInput.r estore('Missing closing \\')\\'');\n }\n } else {\n parserInput.forget();\n }\n }\n\n if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index, fileInfo); }\n },\n\n / /\n // Combinators combine elements together, in a Selector.\n //\n // Because our parser isn't white-space sensitive, special care\n // has to be taken, when parsing the descendant combinator, ` `,\n // as it's an empty space. We have to check the previous charact er\n // in the input, to see if it's a ` ` character. More info on ho w\n // we deal with this in *combinator.js*.\n //\n combinator: function () {\n let c = parserInput.currentChar( );\n\n if (c === '/') {\n parserInput.save();\ n const slashedCombinator = parserInput.$re(/^\\/[a-z]+\\//i) ;\n if (slashedCombinator) {\n parserI nput.forget();\n return new(tree.Combinator)(slashedCombi nator);\n }\n parserInput.restore();\n }\n\n if (c === '>' || c === '+' || c === '~' || c == = '|' || c === '^') {\n parserInput.i++;\n if (c === '^' && parserInput.currentChar() === '^') {\n c = '^^';\n parserInput.i++;\n }\n while (parserInput.isWhitespace()) { parserInput.i++; }\n return new(tree.Combinator)(c);\n } else if (parserI nput.isWhitespace(-1)) {\n return new(tree.Combinator)(' ');\ n } else {\n return new(tree.Combinator)(null) ;\n }\n },\n //\n // A CSS Selec tor\n // with less extensions e.g. the ability to extend and guard\n //\n // .class > div + h1\n // li a:hov er\n //\n // Selectors are made out of one or more Element s, see above.\n //\n selector: function (isLess) {\n const index = parserInput.i;\n let elements;\n let extendList;\n let c;\n let e;\n let allExtends;\n let when;\n let conditio n;\n isLess = isLess !== false;\n while ((isLess & & (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) {\n if (when) {\n condition = expect(this.conditions, 'expected condition');\n } else if (condition) {\n error('CSS guard can only be used at the end of selector');\n } else if (extendList) { \n if (allExtends) {\n allExte nds = allExtends.concat(extendList);\n } else {\n allExtends = extendList;\n }\n } else {\n if (allExtends) { error('Extend c an only be used at the end of selector'); }\n c = parserI nput.currentChar();\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n e = null;\n }\n if (c === '{' || c === '} ' || c === ';' || c === ',' || c === ')') {\n break;\n }\n }\n\n if (elements) { return new(tree.Selector)(elements, allExtends, condition, index, fileInfo); }\n if (allExtends) { error('Extend must be used to extend a selector, it c annot be used on its own'); }\n },\n selectors: function ( ) {\n let s;\n let selectors;\n whi le (true) {\n s = this.selector();\n if (! s) {\n break;\n }\n if (selectors) {\n selectors.push(s);\n } else {\n selectors = [ s ];\n }\n parserInput.commentStore.length = 0;\n if (s.condition && selectors.length > 1) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n if (!parserInput.$char(',')) { break; }\n i f (s.condition) {\n error(\"Guards are only currently all owed on a single selector.\");\n }\n parse rInput.commentStore.length = 0;\n }\n return selec tors;\n },\n attribute: function () {\n if (!parserInput.$char('[')) { return; }\n\n const entities = this.e ntities;\n let key;\n let val;\n le t op;\n\n if (!(key = entities.variableCurly())) {\n key = expect(/^(?:[_A-Za-z0-9-\\*]*\\|)?(?:[_A-Za-z0-9-]|\\\\.)+/);\n }\n\n op = parserInput.$re(/^[|~*$^]?=/);\n if (op) {\n val = entities.quoted() || parserInput.$re( /^[0-9]+%/) || parserInput.$re(/^[\\w-]+/) || entities.variableCurly();\n }\n\n expectChar(']');\n\n return new(tre e.Attribute)(key, op, val);\n },\n\n //\n // Th e `block` rule is used by `ruleset` and `mixin.definition`.\n // It's a wrapper around the `primary` rule, with added `{}`.\n //\n block: function () {\n let content;\n if (pars erInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {\n return content;\n }\n },\n\n blockRuleset: function() {\n let block = this.block();\n\n if (block) {\n block = new tree.Ruleset(null, b lock);\n }\n return block;\n },\n\n detachedRuleset: function() {\n let argInfo;\n let params;\n let variadic;\n\n parserInput.s ave();\n if (parserInput.$re(/^[.#]\\(/)) {\n /**\n * DR args currently only implemented for each() functi on, and not \n * yet settable as `@dr: #(@arg) {}`\n * This should be done when DRs are merged with mixins.\n * See: https://github.com/less/less-meta/issues/16\n */\n argInfo = this.mixin.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n if (!parserInput.$char(')')) {\n parserIn put.restore();\n return;\n }\n }\n const blockRuleset = this.blockRuleset();\n if (blockRuleset) {\n parserInput.forget();\n if (params) {\n return new tree.mixin.Definitio n(null, params, blockRuleset, null, variadic);\n }\n return new tree.DetachedRuleset(blockRuleset);\n }\n parserInput.restore();\n },\n\n //\n // div, .class, body > p {...}\n //\n ruleset: functio n () {\n let selectors;\n let rules;\n let debugInfo;\n\n parserInput.save();\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(parser Input.i);\n }\n\n selectors = this.selectors();\n\ n if (selectors && (rules = this.block())) {\n parserInput.forget();\n const ruleset = new(tree.Ruleset)(se lectors, rules, context.strictImports);\n if (context.dumpLin eNumbers) {\n ruleset.debugInfo = debugInfo;\n }\n return ruleset;\n } else {\n parserInput.restore();\n }\n },\n declaration: function () {\n let name;\n let value;\n const index = parserInput.i;\n let hasDR ;\n const c = parserInput.currentChar();\n let imp ortant;\n let merge;\n let isVariable;\n\n if (c === '.' || c === '#' || c === '&' || c === ':') { return; }\n\n parserInput.save();\n\n name = this.variable() || th is.ruleProperty();\n if (name) {\n isVariable = typeof name === 'string';\n\n if (isVariable) {\n value = this.detachedRuleset();\n if (value ) {\n hasDR = true;\n }\n }\n\n parserInput.commentStore.length = 0;\n if (!value) {\n // a name returned by t his.ruleProperty() is always an array of the form:\n // [ string-1, ..., string-n, \"\"] or [string-1, ..., string-n, \"+\"]\n // where each item is a tree.Keyword or tree.Variable\n merge = !isVariable && name.length > 1 && name.pop().value;\n\n // Custom property values get permissive parsing\n if (name[0].value && name[0].value.slice(0, 2) === '--') {\n value = this.permissiveValue();\n }\n // Try to store values as anonymous\n // If we need the value later we'll re-parse it in ruleset.parseValue\n else {\n value = this.anonymousVa lue();\n }\n if (value) {\n parserInput.forget();\n // anony mous values absorb the end ';' which is required for them to work\n return new(tree.Declaration)(name, value, false, merge, index, fi leInfo);\n }\n\n if (!value) {\n value = this.value();\n }\n\n if (value) {\n important = this .important();\n } else if (isVariable) {\n // As a last resort, try permissiveValue\n value = this.permissiveValue();\n }\n }\n\n if (value && (this.end() || hasDR)) {\n parserInput.forget();\n return new(tree.Declar ation)(name, value, important, merge, index, fileInfo);\n }\n else {\n parserInput.restore();\n }\n } else {\n parserInput.res tore();\n }\n },\n anonymousValue: function () {\n const index = parserInput.i;\n const match = parserInput.$re(/^([^.#@\\$+\\/'\"*`(;{}-]*);/);\n if (match) {\n return new(tree.Anonymous)(match[1], index);\n }\n },\n /**\n * Used for custom properti es, at-rules, and variables (as fallback)\n * Parses almost anything inside of {} [] () \"\" blocks\n * until it reaches outer-most toke ns.\n * \n * First, it will try to parse comments and en tities to reach\n * the end. This is mostly like the Expression pars er except no\n * math is allowed.\n */\n perm issiveValue: function (untilTokens) {\n let i;\n l et e;\n let done;\n let value;\n co nst tok = untilTokens || ';';\n const index = parserInput.i;\n const result = [];\n\n function testCurrentChar() {\ n const char = parserInput.currentChar();\n if (typeof tok === 'string') {\n return char === tok;\n } else {\n return tok.test(char);\n }\n }\n if (testCurrentChar()) { \n return;\n }\n value = [];\n do {\n e = this.comment();\n if (e) {\n value.push(e);\n cont inue;\n }\n e = this.entity();\n if (e) {\n value.push(e);\n }\n } while (e);\n\n done = testCurrentChar();\n\n if (value.length > 0) {\n value = new(tree.Ex pression)(value);\n if (done) {\n retu rn value;\n }\n else {\n result.push(value);\n }\n // Preserv e space before $parseUntil as it will not\n if (parserInput.p revChar() === ' ') {\n result.push(new tree.Anonymous(' ' , index));\n }\n }\n parserInpu t.save();\n\n value = parserInput.$parseUntil(tok);\n\n if (value) {\n if (typeof value === 'string') {\n error(`Expected '${value}'`, 'Parse');\n }\ n if (value.length === 1 && value[0] === ' ') {\n parserInput.forget();\n return new tree.Anony mous('', index);\n }\n let item;\n for (i = 0; i < value.length; i++) {\n item = value[i];\n if (Array.isArray(item)) {\n // Treat actual quotes as normal quoted values\n result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo));\n }\n else {\n if (i === value.length - 1) {\n item = ite m.trim();\n }\n // Treat l ike quoted values, but replace vars like unquoted expressions\n const quote = new tree.Quoted('\\'', item, true, index, fileInfo);\n quote.variableRegex = /@([\\w-]+)/g;\n quote.propRegex = /\\$([\\w-]+)/g;\n res ult.push(quote);\n }\n }\n parserInput.forget();\n return new tree.Expression(re sult, true);\n }\n parserInput.restore();\n },\n\n //\n // An @import atrule\n //\n // @import \"lib\";\n //\n // Depending on ou r environment, importing is done differently:\n // In the browser, it 's an XHR request, in Node, it would be a\n // file-system operation. The function used for importing is\n // stored in `import`, which we pass to the Import constructor.\n //\n 'import': function () {\n let path;\n let features;\n const index = parserInput.i;\n\n const dir = parserInput.$re(/^@ import?\\s+/);\n\n if (dir) {\n const options = (dir ? this.importOptions() : null) || {};\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n featu res = this.mediaFeatures();\n\n if (!parserInput.$char('; ')) {\n parserInput.i = index;\n error('missing semi-colon or unrecognised media features on import');\n }\n features = features && new(tree .Value)(features);\n return new(tree.Import)(path, featur es, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error ('malformed import statement');\n }\n }\n },\n\n importOptions: function() {\n let o;\n const options = {};\n let optionName;\n let value;\n\n // list of options, surrounded by parens\n if (!parserInput.$char('(')) { return null; }\n do {\ n o = this.importOption();\n if (o) {\n optionName = o;\n value = true;\n switch (optionName) {\n case 'cs s':\n optionName = 'less';\n value = false;\n break;\n case 'once':\n optionName = 'multi ple';\n value = false;\n break;\n }\n options[option Name] = value;\n if (!parserInput.$char(',')) { break; }\ n }\n } while (o);\n expectChar (')');\n return options;\n },\n\n importOpt ion: function() {\n const opt = parserInput.$re(/^(less|css|multi ple|once|inline|reference|optional)/);\n if (opt) {\n return opt[1];\n }\n },\n\n mediaFe ature: function () {\n const entities = this.entities;\n const nodes = [];\n let e;\n let p;\n parserInput.save();\n do {\n e = ent ities.keyword() || entities.variable() || entities.mixinLookup();\n if (e) {\n nodes.push(e);\n } e lse if (parserInput.$char('(')) {\n p = this.property();\ n e = this.value();\n if (parserIn put.$char(')')) {\n if (p && e) {\n nodes.push(new(tree.Paren)(new(tree.Declaration)(p, e, null, null, parserInput.i, fileInfo, true)));\n } else if (e) {\ n nodes.push(new(tree.Paren)(e));\n } else {\n error('badly formed medi a feature definition');\n }\n } else {\n error('Missing closing \\')\\'', 'Parse'); \n }\n }\n } while (e); \n\n parserInput.forget();\n if (nodes.length > 0) {\n return new(tree.Expression)(nodes);\n }\n },\n\n mediaFeatures: function () {\n cons t entities = this.entities;\n const features = [];\n let e;\n do {\n e = this.mediaFeature();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n } e lse {\n e = entities.variable() || entities.mixinLookup() ;\n if (e) {\n features.push(e );\n if (!parserInput.$char(',')) { break; }\n }\n }\n } while (e);\n\n return features.length > 0 ? features : null;\n },\n\n media: function () {\n let features;\n let rules;\n let media;\n let debugInfo;\n const index = parserInput.i;\n\n if (context.dumpLineNumbers ) {\n debugInfo = getDebugInfo(index);\n }\n\n parserInput.save();\n\n if (parserInput.$str('@me dia')) {\n features = this.mediaFeatures();\n\n rules = this.block();\n\n if (!rules) {\n error('media definitions require block statements after any features') ;\n }\n\n parserInput.forget();\n\n media = new(tree.Media)(rules, features, index, fileInfo);\n if (context.dumpLineNumbers) {\n media.debug Info = debugInfo;\n }\n\n return media;\n }\n\n parserInput.restore();\n },\n\n //\n\n // A @plugin directive, used to import plugins dynam ically.\n //\n // @plugin (args) \"lib\";\n //\n plugin: function () {\n let path;\n let args;\n let options;\n const index = parser Input.i;\n const dir = parserInput.$re(/^@plugin?\\s+/);\n\n if (dir) {\n args = this.pluginArgs();\n\n if (args) {\n options = {\n pluginArgs: args,\n isPlugin: true\n };\n }\n else {\n options = { isPlugin: true };\n }\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon on @plugin');\n }\n return new(tr ee.Import)(path, null, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed @plugin statement');\n }\n }\n },\n\n pluginArgs: function() {\n // list of options, surrounded by parens\n parserInput.sav e();\n if (!parserInput.$char('(')) {\n parser Input.restore();\n return null;\n }\n const args = parserInput.$re(/^\\s*([^\\);]+)\\)\\s*/);\n if (args[1]) {\n parserInput.forget();\n r eturn args[1].trim();\n }\n else { \n parserInput.restore();\n return null;\n }\n },\n\n //\n // A CSS AtRule\n / /\n // @charset \"utf-8\";\n //\n atrule: f unction () {\n const index = parserInput.i;\n let name;\n let value;\n let rules;\n l et nonVendorSpecificName;\n let hasIdentifier;\n l et hasExpression;\n let hasUnknown;\n let hasBlock = true;\n let isRooted = true;\n\n if (parserInpu t.currentChar() !== '@') { return; }\n\n value = this['import']() || this.plugin() || this.media();\n if (value) {\n return value;\n }\n\n parserInput.save();\n\ n name = parserInput.$re(/^@[a-z-]+/);\n\n if (!na me) { return; }\n\n nonVendorSpecificName = name;\n if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) {\n nonVendorSpecificName = `@${name.slice(name.indexOf('-', 2) + 1)}`;\n }\n\n switch (nonVendorSpecificName) {\n case '@charset':\n hasIdentifier = true;\n hasBlock = false;\n break;\n case '@namespace':\n hasExpression = true;\n hasBlock = false;\n break;\n case '@keyframes':\n case '@counter-style':\n hasIdentifier = true;\n break;\n case '@document':\n case '@supports':\n hasUnknown = true;\n isRooted = false;\n break;\n default:\n hasU nknown = true;\n break;\n }\n\n parserInput.commentStore.length = 0;\n\n if (hasIdentifier) {\n value = this.entity();\n if (!value) { \n error(`expected ${name} identifier`);\n }\n } else if (hasExpression) {\n value = this.expression();\n if (!value) {\n error(`expected ${name} expression`);\n }\n } else if (hasUnknown) {\n value = this.permissiveValue(/^[{;]/ );\n hasBlock = (parserInput.currentChar() === '{');\n if (!value) {\n if (!hasBlock && parserInput .currentChar() !== ';') {\n error(`${name} rule is mi ssing block or ending semi-colon`);\n }\n }\n else if (!value.value) {\n val ue = null;\n }\n }\n\n if (hasB lock) {\n rules = this.blockRuleset();\n }\n\n if (rules || (!hasBlock && value && parserInput.$char(';'))) {\n parserInput.forget();\n return new(tree.A tRule)(name, value, rules, index, fileInfo,\n context.dum pLineNumbers ? getDebugInfo(index) : null,\n isRooted\n );\n }\n\n parserInput.restore(' at-rule options not recognised');\n },\n\n //\n // A Value is a comma-delimited list of Expressions\n //\n // font-family: Baskerville, Georgia, serif;\n //\n // In a Rule, a Value represents everything after the `:`,\n // and b efore the `;`.\n //\n value: function () {\n let e;\n const expressions = [];\n const index = parserInput.i;\n\n do {\n e = this.expression ();\n if (e) {\n expressions.push(e);\ n if (!parserInput.$char(',')) { break; }\n }\n } while (e);\n\n if (expressions.length > 0) {\n return new(tree.Value)(expressions, index);\n }\n },\n important: function () {\n if (parserInput.currentChar() === '!') {\n return parserInp ut.$re(/^! *important/);\n }\n },\n sub: fu nction () {\n let a;\n let e;\n\n p arserInput.save();\n if (parserInput.$char('(')) {\n a = this.addition();\n if (a && parserInput.$char(')') ) {\n parserInput.forget();\n e = new(tree.Expression)([a]);\n e.parens = true;\n return e;\n }\n parserInput. restore('Expected \\')\\'');\n return;\n }\n parserInput.restore();\n },\n multiplication : function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.operand();\n if (m) {\n isSp aced = parserInput.isWhitespace(-1);\n while (true) {\n if (parserInput.peek(/^\\/[*\\/]/)) {\n break;\n }\n\n parserInput.sa ve();\n\n op = parserInput.$char('/') || parserInput.$cha r('*') || parserInput.$str('./');\n\n if (!op) { parserIn put.forget(); break; }\n\n a = this.operand();\n\n if (!a) { parserInput.restore(); break; }\n parserInput.forget();\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new (tree.Operation)(op, [operation || m, a], isSpaced);\n is Spaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n additi on: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.multiplication();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n op = parserInput.$re(/^[-+]\\s+/) || (!isSpaced && (p arserInput.$char('+') || parserInput.$char('-')));\n if ( !op) {\n break;\n }\n a = this.multiplication();\n if (!a) {\n break;\n }\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSp aced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n conditions: function () {\n let a;\n let b;\n const index = parserInput.i;\n let condition;\n\n a = this.condition(true);\n if (a) {\n while (true) {\n if (!par serInput.peek(/^,\\s*(not\\s*)?\\(/) || !parserInput.$char(',')) {\n break;\n }\n b = t his.condition(true);\n if (!b) {\n break;\n }\n condition = new( tree.Condition)('or', condition || a, b, index);\n }\n return condition || a;\n }\n },\n condition: function (needsParens) {\n let result;\n let logical;\n let next;\n function or() {\n return parserInput.$str('or');\n }\n\n result = this.conditionAnd(needsParens);\n if (!result) {\n return ;\n }\n logical = or ();\n if (logical) {\n next = this.condition(n eedsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n conditionAnd: function (needs Parens) {\n let result;\n let logical;\n let next;\n const self = this;\n function in sideCondition() {\n const cond = self.negatedCondition(needsP arens) || self.parenthesisCondition(needsParens);\n if (!cond && !needsParens) {\n return self.atomicCondition(needsPa rens);\n }\n return cond;\n }\n function and() {\n return parserInput.$st r('and');\n }\n\n result = insideCondition();\n if (!result) {\n return ;\n }\n logical = and();\n if (logical) {\n next = this.conditionAnd(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n } \n }\n return result;\n },\n negatedCondition: function (needsParens) {\n if (parserInput.$st r('not')) {\n const result = this.parenthesisCondition(needsP arens);\n if (result) {\n result.negat e = !result.negate;\n }\n return result;\n }\n },\n parenthesisCondition: function (n eedsParens) {\n function tryConditionFollowedByParenthesis(me) {\ n let body;\n parserInput.save();\n body = me.condition(needsParens);\n if (!body) { \n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return ;\ n }\n parserInput.forget();\n return body;\n }\n\n let body;\n parserInput.save();\n if (!parserInput.$str('(')) {\n parserInput.restore();\n return ;\n }\n body = tryConditionFollowedByParenthesis(this);\n if (body) {\n parserInput.forget();\n return body;\n }\n\n body = this.atomicConditio n(needsParens);\n if (!body) {\n parserInput.r estore();\n return ;\n }\n if ( !parserInput.$char(')')) {\n parserInput.restore(`expected ') ' got '${parserInput.currentChar()}'`);\n return ;\n }\n parserInput.forget();\n return body;\n },\n atomicCondition: function (needsParens) {\n const entities = this.entities;\n const index = parserInput .i;\n let a;\n let b;\n let c;\n let op;\n\n function cond() {\n r eturn this.addition() || entities.keyword() || entities.quoted() || entities.mix inLookup();\n }\n cond = cond.bind(this);\n\n a = cond();\n if (a) {\n if (parser Input.$char('>')) {\n if (parserInput.$char('=')) {\n op = '>=';\n } else {\n op = '>';\n }\n } el se\n if (parserInput.$char('<')) {\n i f (parserInput.$char('=')) {\n op = '<=';\n } else {\n op = '<';\n }\n } else\n if (parserInput.$char( '=')) {\n if (parserInput.$char('>')) {\n op = '=>';\n } else if (parserInput.$char('<' )) {\n op = '=<';\n } else {\n op = '=';\n }\n }\n if (op) {\n b = cond();\n if (b) {\n c = new(tree.Conditio n)(op, a, b, index, false);\n } else {\n error('expected expression');\n }\n } else {\n c = new(tree.Condition)('=', a, new(t ree.Keyword)('true'), index, false);\n }\n return c;\n }\n },\n\n //\n // An operand is anything that can be part of an operation,\n // such as a Color, or a Variable\n //\n operand: function () {\n const entities = this.entities;\n let negate;\n\n if (parserInput.peek(/^-[@\\$\\(]/)) {\n negate = parserInput.$char('-');\n }\n\n let o = this.sub () || entities.dimension() ||\n entities.color() || entit ies.variable() ||\n entities.property() || entities.call( ) ||\n entities.quoted(true) || entities.colorKeyword() | |\n entities.mixinLookup();\n\n if (negate ) {\n o.parensInOp = true;\n o = new(tree. Negative)(o);\n }\n\n return o;\n },\n\ n //\n // Expressions either represent mathematical operat ions,\n // or white-space delimited Entities.\n //\n // 1px solid black\n // @var * 2\n //\n expression: function () {\n const entities = [];\n let e;\n let delim;\n const index = parser Input.i;\n\n do {\n e = this.comment();\n if (e) {\n entities.push(e);\n continue;\n }\n e = this.addit ion() || this.entity();\n\n if (e instanceof tree.Comment) {\ n e = null;\n }\n\n if (e) {\n entities.push(e);\n // operations do not allow keyword \"/\" dimension (e.g. small/20px) so we support that here\n if (!parserInput.peek(/^\\/[\\/*]/)) {\n delim = parserInput.$char('/');\n if (delim) {\n entities.push(new(tree.Anonym ous)(delim, index));\n }\n }\n }\n } while (e);\n if (entitie s.length > 0) {\n return new(tree.Expression)(entities);\n }\n },\n property: function () {\n const name = parserInput.$re(/^(\\*?-?[_a-zA-Z0-9-]+)\\s*:/);\n if (name) {\n return name[1];\n }\n },\n ruleProperty: function () {\n let name = []; \n const index = [];\n let s;\n let k;\n\n parserInput.save();\n\n const simpleProper ty = parserInput.$re(/^([_a-zA-Z0-9-]+)\\s*:/);\n if (simplePrope rty) {\n name = [new(tree.Keyword)(simpleProperty[1])];\n parserInput.forget();\n return name;\n }\n\n function match(re) {\n const i = parserInput.i;\n const chunk = parserInput.$re(re);\n if (chunk) {\n index.push(i);\n return name.push(chunk[1]);\n }\n }\n\n match(/^(\\*?)/);\n while (true) {\n if (!match(/^((?:[\\w-]+)|(?:[@\\$]\\{[\\w-]+\\}))/)) {\n break;\n }\n }\n\n if ((name.length > 1) && match(/^((?:\\+_|\\+)?)\\s*:/)) {\n parserInput.forget();\n\n // at last, we have the complete m atch now. move forward,\n // convert name particles to tree o bjects and return:\n if (name[0] === '') {\n name.shift();\n index.shift();\n }\n for (k = 0; k < name.length; k++) {\n s = name[k];\n name[k] = (s.charAt(0) !== '@' && s. charAt(0) !== '$') ?\n new(tree.Keyword)(s) :\n (s.charAt(0) === '@' ?\n ne w(tree.Variable)(`@${s.slice(2, -1)}`, index[k], fileInfo) :\n new(tree.Property)(`$${s.slice(2, -1)}`, index[k], fileInfo));\n }\n return name;\n }\n parserInput.restore();\n }\n }\n };\n};\nParser.s erializeVars = vars => {\n let s = '';\n\n for (const name in vars) {\n if (Object.hasOwnProperty.call(vars, name)) {\n const value = va rs[name];\n s += `${((name[0] === '@') ? '' : '@') + name}: ${value}$ {(String(value).slice(-1) === ';') ? '' : ';'}`;\n }\n }\n\n return s;\n};\n\nexport default Parser;\n","import Anonymous from '../tree/anonymous'; \nimport Keyword from '../tree/keyword';\n\nfunction boolean(condition) {\n r eturn condition ? Keyword.True : Keyword.False;\n}\n\n/**\n * Functions with eva lArgs set to false are sent context\n * as the first argument.\n */\nfunction If (context, condition, trueValue, falseValue) {\n return condition.eval(context ) ? trueValue.eval(context)\n : (falseValue ? falseValue.eval(context) : new Anonymous);\n}\nIf.evalArgs = false;\n\nfunction isdefined(context, variable ) {\n try {\n variable.eval(context);\n return Keyword.True;\n } catch (e) {\n return Keyword.False;\n }\n}\n\nisdefined.evalArgs = false;\n\nexport default { isdefined, boolean, 'if': If };\n","import Dimensio n from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted f rom '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport Expres sion from '../tree/expression';\nimport Operation from '../tree/operation';\nlet colorFunctions;\n\nfunction clamp(val) {\n return Math.min(1, Math.max(0, va l));\n}\nfunction hsla(origColor, hsl) {\n const color = colorFunctions.hsla( hsl.h, hsl.s, hsl.l, hsl.a);\n if (color) {\n if (origColor.value && \ n /^(rgb|hsl)/.test(origColor.value)) {\n color.value = or igColor.value;\n } else {\n color.value = 'rgb';\n }\n return color;\n }\n}\nfunction toHSL(color) {\n if (color.toHSL) {\ n return color.toHSL();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction toHSV(color) {\n if ( color.toHSV) {\n return color.toHSV();\n } else {\n throw new E rror('Argument cannot be evaluated to a color');\n }\n}\n\nfunction number(n) {\n if (n instanceof Dimension) {\n return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);\n } else if (typeof n === 'number') {\n re turn n;\n } else {\n throw {\n type: 'Argument',\n message: 'color functions take numbers as parameters'\n };\n }\n}\n function scaled(n, size) {\n if (n instanceof Dimension && n.unit.is('%')) {\ n return parseFloat(n.value * size / 100);\n } else {\n return number(n);\n }\n}\ncolorFunctions = {\n rgb: function (r, g, b) {\n let a = 1\n /**\n * Comma-less syntax\n * e.g. rgb(0 1 28 255 / 50%)\n */\n if (r instanceof Expression) {\n const val = r.value\n r = val[0]\n g = val[1]\n b = val[2]\n /** \n * @todo - should this be normalized in\n * function caller? Or parsed differently?\n */\n if (b instanceof Operation) {\n const op = b\n b = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.rgba(r, g, b, a);\n if (co lor) {\n color.value = 'rgb';\n return color;\n }\n },\n rgba: function (r, g, b, a) {\n try {\n if (r inst anceof Color) {\n if (g) {\n a = number(g);\n } else {\n a = r.alpha;\n }\n return new Color(r.rgb, a, 'rgba');\n }\n co nst rgb = [r, g, b].map(c => scaled(c, 255));\n a = number(a);\n return new Color(rgb, a, 'rgba');\n }\n catch (e) {}\n } ,\n hsl: function (h, s, l) {\n let a = 1\n if (h instanceof Ex pression) {\n const val = h.value\n h = val[0]\n s = val[1]\n l = val[2]\n\n if (l instanceof Operation) {\n const op = l\n l = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFu nctions.hsla(h, s, l, a);\n if (color) {\n color.value = 'hsl' ;\n return color;\n }\n },\n hsla: function (h, s, l, a) {\n try {\n if (h instanceof Color) {\n if (s) {\n a = number(s);\n } else {\n a = h.alpha;\n }\n return new Color(h.rgb, a , 'hsla');\n }\n\n let m1;\n let m2;\n\n function hue(h) {\n h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); \n if (h * 6 < 1) {\n return m1 + (m2 - m1) * h * 6;\n }\n else if (h * 2 < 1) {\n return m2;\n }\n else if (h * 3 < 2) {\n return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n }\n else {\n return m1;\n }\n }\n\n h = (number(h) % 360) / 360;\n s = clamp(number( s));l = clamp(number(l));a = clamp(number(a));\n\n m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n m1 = l * 2 - m2;\n\n const rg b = [\n hue(h + 1 / 3) * 255,\n hue(h) * 255 ,\n hue(h - 1 / 3) * 255\n ];\n a = number( a);\n return new Color(rgb, a, 'hsla');\n }\n catch (e) {}\n },\n\n hsv: function(h, s, v) {\n return colorFunctions.hsva( h, s, v, 1.0);\n },\n\n hsva: function(h, s, v, a) {\n h = ((number (h) % 360) / 360) * 360;\n s = number(s);v = number(v);a = number(a);\n\n let i;\n let f;\n i = Math.floor((h / 60) % 6);\n f = (h / 60) - i;\n\n const vs = [v,\n v * (1 - s),\n v * (1 - f * s),\n v * (1 - (1 - f) * s)];\n const perm = [[ 0, 3, 1],\n [2, 0, 1],\n [1, 0, 3],\n [1, 2, 0] ,\n [3, 1, 0],\n [0, 1, 2]];\n\n return colorFuncti ons.rgba(vs[perm[i][0]] * 255,\n vs[perm[i][1]] * 255,\n v s[perm[i][2]] * 255,\n a);\n },\n\n hue: function (color) {\n return new Dimension(toHSL(color).h);\n },\n saturation: function (c olor) {\n return new Dimension(toHSL(color).s * 100, '%');\n },\n l ightness: function (color) {\n return new Dimension(toHSL(color).l * 100, '%');\n },\n hsvhue: function(color) {\n return new Dimension(toHS V(color).h);\n },\n hsvsaturation: function (color) {\n return new Dimension(toHSV(color).s * 100, '%');\n },\n hsvvalue: function (color) {\ n return new Dimension(toHSV(color).v * 100, '%');\n },\n red: func tion (color) {\n return new Dimension(color.rgb[0]);\n },\n green: function (color) {\n return new Dimension(color.rgb[1]);\n },\n blu e: function (color) {\n return new Dimension(color.rgb[2]);\n },\n alpha: function (color) {\n return new Dimension(toHSL(color).a);\n }, \n luma: function (color) {\n return new Dimension(color.luma() * colo r.alpha * 100, '%');\n },\n luminance: function (color) {\n const l uminance =\n (0.2126 * color.rgb[0] / 255) +\n (0.7152 * color.rgb[1] / 255) +\n (0.0722 * color.rgb[2] / 255);\n\n return new Dimension(luminance * color.alpha * 100, '%');\n },\n satur ate: function (color, amount, method) {\n // filter: saturate(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n h sl.s += hsl.s * amount.value / 100;\n }\n else {\n hsl .s += amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n ret urn hsla(color, hsl);\n },\n desaturate: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined ' && method.value === 'relative') {\n hsl.s -= hsl.s * amount.value / 100;\n }\n else {\n hsl.s -= amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\ n lighten: function (color, amount, method) {\n const hsl = toHSL(colo r);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l += hsl.l * amount.value / 100;\n }\n else { \n hsl.l += amount.value / 100;\n }\n hsl.l = clamp(hsl .l);\n return hsla(color, hsl);\n },\n darken: function (color, amo unt, method) {\n const hsl = toHSL(color);\n\n if (typeof method ! == 'undefined' && method.value === 'relative') {\n hsl.l -= hsl.l * amount.value / 100;\n }\n else {\n hsl.l -= amount.valu e / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, h sl);\n },\n fadein: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a += hsl.a * amount.value / 100;\n }\n else {\n hsl.a += amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fadeout: functio n (color, amount, method) {\n const hsl = toHSL(color);\n\n if (ty peof method !== 'undefined' && method.value === 'relative') {\n hsl.a -= hsl.a * amount.value / 100;\n }\n else {\n hsl.a - = amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fade: function (color, amount) {\n const h sl = toHSL(color);\n\n hsl.a = amount.value / 100;\n hsl.a = clamp (hsl.a);\n return hsla(color, hsl);\n },\n spin: function (color, a mount) {\n const hsl = toHSL(color);\n const hue = (hsl.h + amount .value) % 360;\n\n hsl.h = hue < 0 ? 360 + hue : hue;\n\n return h sla(color, hsl);\n },\n //\n // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein\n // http://sass-lang.com\n //\n mix: function (color1, color2, weight) {\n if (!weight) {\n weight = new Dimension(50);\n }\n const p = weight.value / 100.0;\ n const w = p * 2 - 1;\n const a = toHSL(color1).a - toHSL(color2) .a;\n\n const w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2. 0;\n const w2 = 1 - w1;\n\n const rgb = [color1.rgb[0] * w1 + colo r2.rgb[0] * w2,\n color1.rgb[1] * w1 + color2.rgb[1] * w2,\n color1.rgb[2] * w1 + color2.rgb[2] * w2];\n\n const alpha = color1.alp ha * p + color2.alpha * (1 - p);\n\n return new Color(rgb, alpha);\n } ,\n greyscale: function (color) {\n return colorFunctions.desaturate(c olor, new Dimension(100));\n },\n contrast: function (color, dark, light, threshold) {\n // filter: contrast(3.2);\n // should be kept as is , so check for color\n if (!color.rgb) {\n return null;\n }\n if (typeof light === 'undefined') {\n light = colorFunc tions.rgba(255, 255, 255, 1.0);\n }\n if (typeof dark === 'undefin ed') {\n dark = colorFunctions.rgba(0, 0, 0, 1.0);\n }\n // Figure out which is actually light and dark:\n if (dark.luma() > lig ht.luma()) {\n const t = light;\n light = dark;\n dark = t;\n }\n if (typeof threshold === 'undefined') {\n threshold = 0.43;\n } else {\n threshold = number(thresh old);\n }\n if (color.luma() < threshold) {\n return li ght;\n } else {\n return dark;\n }\n },\n // Chan ges made in 2.7.0 - Reverted in 3.0.0\n // contrast: function (color, color1, color2, threshold) {\n // // Return which of `color1` and `color2` has t he greatest contrast with `color`\n // // according to the standard WCAG contrast ratio calculation.\n // // http://www.w3.org/TR/WCAG20/#contrast -ratiodef\n // // The threshold param is no longer used, in line with SAS S.\n // // filter: contrast(3.2);\n // // should be kept as is, so check for color\n // if (!color.rgb) {\n // return null;\n // }\n // if (typeof color1 === 'undefined') {\n // color 1 = colorFunctions.rgba(0, 0, 0, 1.0);\n // }\n // if (typeof colo r2 === 'undefined') {\n // color2 = colorFunctions.rgba(255, 255, 255 , 1.0);\n // }\n // var contrast1, contrast2;\n // var luma = color.luma();\n // var luma1 = color1.luma();\n // var luma2 = color2.luma();\n // // Calculate contrast ratios for each color\n // if (luma > luma1) {\n // contrast1 = (luma + 0.05) / (luma1 + 0.05 );\n // } else {\n // contrast1 = (luma1 + 0.05) / (luma + 0.0 5);\n // }\n // if (luma > luma2) {\n // contrast2 = (l uma + 0.05) / (luma2 + 0.05);\n // } else {\n // contrast2 = ( luma2 + 0.05) / (luma + 0.05);\n // }\n // if (contrast1 > contras t2) {\n // return color1;\n // } else {\n // return color2;\n // }\n // },\n argb: function (color) {\n return new Anonymous(color.toARGB());\n },\n color: function(c) {\n if ((c instanceof Quoted) &&\n (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0- 9]{3,4})$/i.test(c.value))) {\n const val = c.value.slice(1);\n return new Color(val, undefined, `#${val}`);\n }\n if ((c in stanceof Color) || (c = Color.fromKeyword(c.value))) {\n c.value = un defined;\n return c;\n }\n throw {\n type: 'Argument',\n message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF'\n };\n },\n tint: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amou nt);\n },\n shade: function(color, amount) {\n return colorFunction s.mix(colorFunctions.rgb(0, 0, 0), color, amount);\n }\n};\n\nexport default colorFunctions;\n","import Color from '../tree/color';\n\n// Color Blending\n// ref: http://www.w3.org/TR/compositing-1\n\nfunction colorBlend(mode, color1, col or2) {\n const ab = color1.alpha; // result\n\n let // backdrop\n cb;\n\n const as = color2.alpha;\n\n let // source\n cs;\n\n let ar;\n let cr;\n const r = [];\n\n ar = as + ab * (1 - as);\n for (let i = 0; i < 3; i++) {\n cb = color1.rgb[i] / 255;\n cs = c olor2.rgb[i] / 255;\n cr = mode(cb, cs);\n if (ar) {\n cr = (as * cs + ab * (cb -\n as * (cb + cs - cr))) / ar;\n }\n r[i] = cr * 255;\n }\n\n return new Color(r, ar);\n}\n\ncons t colorBlendModeFunctions = {\n multiply: function(cb, cs) {\n return cb * cs;\n },\n screen: function(cb, cs) {\n return cb + cs - cb * cs;\n },\n overlay: function(cb, cs) {\n cb *= 2;\n return ( cb <= 1) ?\n colorBlendModeFunctions.multiply(cb, cs) :\n colorBlendModeFunctions.screen(cb - 1, cs);\n },\n softlight: function(cb, cs) {\n let d = 1;\n let e = cb;\n if (cs > 0.5) {\n e = 1;\n d = (cb > 0.25) ? Math.sqrt(cb)\n : ((1 6 * cb - 12) * cb + 4) * cb;\n }\n return cb - (1 - 2 * cs) * e * (d - cb);\n },\n hardlight: function(cb, cs) {\n return colorBlendM odeFunctions.overlay(cs, cb);\n },\n difference: function(cb, cs) {\n return Math.abs(cb - cs);\n },\n exclusion: function(cb, cs) {\n return cb + cs - 2 * cb * cs;\n },\n\n // non-w3c functions:\n average : function(cb, cs) {\n return (cb + cs) / 2;\n },\n negation: funct ion(cb, cs) {\n return 1 - Math.abs(cb + cs - 1);\n }\n};\n\nfor (cons t f in colorBlendModeFunctions) {\n if (colorBlendModeFunctions.hasOwnPropert y(f)) {\n colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f ]);\n }\n}\n\nexport default colorBlend;\n","import Comment from '../tree/com ment';\nimport Node from '../tree/node';\nimport Dimension from '../tree/dimensi on';\nimport Declaration from '../tree/declaration';\nimport Expression from '.. /tree/expression';\nimport Ruleset from '../tree/ruleset';\nimport Selector from '../tree/selector';\nimport Element from '../tree/element';\nimport Quote from '../tree/quoted';\nimport Value from '../tree/value';\n\nconst getItemsFromNode = node => {\n // handle non-array values as an array of length 1\n // retu rn 'undefined' if index is invalid\n const items = Array.isArray(node.value) ?\n node.value : Array(node);\n\n return items;\n};\n\nexport default {\n _SELF: function(n) {\n return n;\n },\n '~': function(...exp r) {\n if (expr.length === 1) {\n return expr[0];\n }\n return new Value(expr);\n },\n extract: function(values, index) {\ n // (1-based index)\n index = index.value - 1;\n\n return getItemsFromNode(values)[index];\n },\n length: function(values) {\n return new Dimension(getItemsFromNode(values).length);\n },\n /**\n * Creates a Less list of incremental values.\n * Modeled after Lodash's rang e function, also exists natively in PHP\n * \n * @param {Dimension} [sta rt=1]\n * @param {Dimension} end - e.g. 10 or 10px - unit is added to outpu t\n * @param {Dimension} [step=1] \n */\n range: function(start, end, step) {\n let from;\n let to;\n let stepValue = 1;\n const list = [];\n if (end) {\n to = end;\n from = start.value;\n if (step) {\n stepValue = step.value; \n }\n }\n else {\n from = 1;\n t o = start;\n }\n\n for (let i = from; i <= to.value; i += stepValu e) {\n list.push(new Dimension(i, to.unit));\n }\n\n re turn new Expression(list);\n },\n each: function(list, rs) {\n cons t rules = [];\n let newRules;\n let iterator;\n\n const try Eval = val => {\n if (val instanceof Node) {\n return val.eval(this.context);\n }\n return val;\n };\n\n if (list.value && !(list instanceof Quote)) {\n if (Array.isAr ray(list.value)) {\n iterator = list.value.map(tryEval);\n } else {\n iterator = [tryEval(list.value)];\n }\ n } else if (list.ruleset) {\n iterator = tryEval(list.ruleset ).rules;\n } else if (list.rules) {\n iterator = list.rules.ma p(tryEval);\n } else if (Array.isArray(list)) {\n iterator = l ist.map(tryEval);\n } else {\n iterator = [tryEval(list)];\n }\n\n let valueName = '@value';\n let keyName = '@key';\n let indexName = '@index';\n\n if (rs.params) {\n valueNam e = rs.params[0] && rs.params[0].name;\n keyName = rs.params[1] && rs .params[1].name;\n indexName = rs.params[2] && rs.params[2].name;\n rs = rs.rules;\n } else {\n rs = rs.ruleset;\n }\n\n for (let i = 0; i < iterator.length; i++) {\n let key; \n let value;\n const item = iterator[i];\n if (item instanceof Declaration) {\n key = typeof item.name === 'str ing' ? item.name : item.name[0].value;\n value = item.value;\n } else {\n key = new Dimension(i + 1);\n value = item;\n }\n\n if (item instanceof Comment) {\n continue;\n }\n\n newRules = rs.rules.slice(0) ;\n if (valueName) {\n newRules.push(new Declaration(v alueName,\n value,\n false, false, this.in dex, this.currentFileInfo));\n }\n if (indexName) {\n newRules.push(new Declaration(indexName,\n new Dim ension(i + 1),\n false, false, this.index, this.currentFileIn fo));\n }\n if (keyName) {\n newRules.push( new Declaration(keyName,\n key,\n false, f alse, this.index, this.currentFileInfo));\n }\n\n rules.pu sh(new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n n ewRules,\n rs.strictImports,\n rs.visibilityInfo() \n ));\n }\n\n return new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n rules,\n rs.strictImports,\n rs.visibilityInfo()\n ).eval(this.context);\n }\n};\n","impo rt Dimension from '../tree/dimension';\n\nconst MathHelper = (fn, unit, n) => {\ n if (!(n instanceof Dimension)) {\n throw { type: 'Argument', message : 'argument must be a number' };\n }\n if (unit == null) {\n unit = n.unit;\n } else {\n n = n.unify();\n }\n return new Dimension( fn(parseFloat(n.value)), unit);\n};\n\nexport default MathHelper;","import mathH elper from './math-helper.js';\n\nconst mathFunctions = {\n // name, unit\n ceil: null,\n floor: null,\n sqrt: null,\n abs: null,\n tan: '',\n sin: '',\n cos: '',\n atan: 'rad',\n asin: 'rad',\n acos: 'rad'\n};\n\nfor (const f in mathFunctions) {\n if (mathFunctions.has OwnProperty(f)) {\n mathFunctions[f] = mathHelper.bind(null, Math[f], mat hFunctions[f]);\n }\n}\n\nmathFunctions.round = (n, f) => {\n const fracti on = typeof f === 'undefined' ? 0 : f.value;\n return mathHelper(num => num.t oFixed(fraction), null, n);\n};\n\nexport default mathFunctions;\n","import Dime nsion from '../tree/dimension';\nimport Anonymous from '../tree/anonymous';\nimp ort mathHelper from './math-helper.js';\n\nconst minMax = function (isMin, args) {\n args = Array.prototype.slice.call(args);\n switch (args.length) {\n case 0: throw { type: 'Argument', message: 'one or more arguments required ' };\n }\n let i; // key is the unit.toString() for unified Dimension valu es,\n let j;\n let current;\n let currentUnified;\n let referenceUni fied;\n let unit;\n let unitStatic;\n let unitClone;\n\n const // el ems only contains original argument values.\n order = [];\n\n const v alues = {};\n // value is the index into the order array.\n for (i = 0; i < args.length; i++) {\n current = args[i];\n if (!(current instanc eof Dimension)) {\n if (Array.isArray(args[i].value)) {\n Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value)); \n }\n continue;\n }\n currentUnified = curr ent.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.va lue, unitClone).unify() : current.unify();\n unit = currentUnified.unit.t oString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit. toString();\n unitStatic = unit !== '' && unitStatic === undefined || uni t !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic;\n unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone;\n j = values[''] !== undefined && unit !== '' && unit === uni tStatic ? values[''] : values[unit];\n if (j === undefined) {\n if (unitStatic !== undefined && unit !== unitStatic) {\n throw { type: 'Argument', message: 'incompatible types' };\n }\n values[unit] = order.length;\n order.push(current);\n con tinue;\n }\n referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : or der[j].unify();\n if ( isMin && currentUnified.value < referenceUnified.v alue ||\n !isMin && currentUnified.value > referenceUnified.value) {\ n order[j] = current;\n }\n }\n if (order.length == 1) { \n return order[0];\n }\n args = order.map(function (a) { return a. toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n return ne w Anonymous(`${isMin ? 'min' : 'max'}(${args})`);\n};\n\nexport default {\n m in: function(...args) {\n try {\n return minMax(true, args);\n } catch (e) {}\n },\n max: function(...args) {\n try {\n return minMax(false, args);\n } catch (e) {}\n },\n conver t: function (val, unit) {\n return val.convertTo(unit.value);\n },\n pi: function () {\n return new Dimension(Math.PI);\n },\n mod: fu nction(a, b) {\n return new Dimension(a.value % b.value, a.unit);\n }, \n pow: function(x, y) {\n if (typeof x === 'number' && typeof y === ' number') {\n x = new Dimension(x);\n y = new Dimension(y); \n } else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {\n throw { type: 'Argument', message: 'arguments must be numbers' };\n }\n\n return new Dimension(Math.pow(x.value, y.value), x.unit);\n },\n percentage: function (n) {\n const result = mathHelper(num => num * 100, '%', n);\n\n return result;\n }\n};\n","import Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport JavaScript from '../tree/javascript';\n\nexport default {\n e: function (str) {\n return new Quoted('\"', str instanceof JavaScript ? str.evaluated : str.value, true);\n },\n escape: function (str) {\n return new Anonymous(\n encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace (/#/g, '%23').replace(/;/g, '%3B')\n .replace(/\\(/g, '%28').repl ace(/\\)/g, '%29'));\n },\n replace: function (string, pattern, replacemen t, flags) {\n let result = string.value;\n replacement = (replacem ent.type === 'Quoted') ?\n replacement.value : replacement.toCSS();\n result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);\n return new Quoted(string.quote || '', result, string .escaped);\n },\n '%': function (string /* arg, arg, ... */) {\n co nst args = Array.prototype.slice.call(arguments, 1);\n let result = strin g.value;\n\n for (let i = 0; i < args.length; i++) {\n /* jshi nt loopfunc:true */\n result = result.replace(/%[sda]/i, token => {\n const value = ((args[i].type === 'Quoted') &&\n token.match(/s/i)) ? args[i].value : args[i].toCSS();\n return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;\n });\n }\n result = result.replace(/%%/g, '%');\n return new Quoted (string.quote || '', result, string.escaped);\n }\n};\n","import Keyword from '../tree/keyword';\nimport DetachedRuleset from '../tree/detached-ruleset';\nim port Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nim port Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\n import URL from '../tree/url';\nimport Operation from '../tree/operation';\n\nco nst isa = (n, Type) => (n instanceof Type) ? Keyword.True : Keyword.False;\ncons t isunit = (n, unit) => {\n if (unit === undefined) {\n throw { type: 'Argument', message: 'missing the required second argument to isunit.' };\n } \n unit = typeof unit.value === 'string' ? unit.value : unit;\n if (typeof unit !== 'string') {\n throw { type: 'Argument', message: 'Second argume nt to isunit should be a unit or a string.' };\n }\n return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;\n};\n\nexport defa ult {\n isruleset: function (n) {\n return isa(n, DetachedRuleset);\n },\n iscolor: function (n) {\n return isa(n, Color);\n },\n i snumber: function (n) {\n return isa(n, Dimension);\n },\n isstring : function (n) {\n return isa(n, Quoted);\n },\n iskeyword: functio n (n) {\n return isa(n, Keyword);\n },\n isurl: function (n) {\n return isa(n, URL);\n },\n ispixel: function (n) {\n return is unit(n, 'px');\n },\n ispercentage: function (n) {\n return isunit( n, '%');\n },\n isem: function (n) {\n return isunit(n, 'em');\n },\n isunit,\n unit: function (val, unit) {\n if (!(val instanceof Dimension)) {\n throw { type: 'Argument',\n message: `the first argument to unit must be a number${val instanceof Operation ? '. Have you forgotten parenthesis?' : ''}` };\n }\n if (unit) {\n if (unit instanceof Keyword) {\n unit = unit.value;\n } else {\n unit = unit.toCSS();\n }\n } els e {\n unit = '';\n }\n return new Dimension(val.value, unit);\n },\n 'get-unit': function (n) {\n return new Anonymous(n.u nit);\n }\n};\n","import functionRegistry from './function-registry';\nimport functionCaller from './function-caller';\n\nimport boolean from './boolean';\ni mport defaultFunc from './default';\nimport color from './color';\nimport colorB lending from './color-blending';\nimport dataUri from './data-uri';\nimport list from './list';\nimport math from './math';\nimport number from './number';\nimp ort string from './string';\nimport svg from './svg';\nimport types from './type s';\n\nexport default environment => {\n const functions = { functionRegistry , functionCaller };\n\n // register functions\n functionRegistry.addMultip le(boolean);\n functionRegistry.add('default', defaultFunc.eval.bind(defaultF unc));\n functionRegistry.addMultiple(color);\n functionRegistry.addMultip le(colorBlending);\n functionRegistry.addMultiple(dataUri(environment));\n functionRegistry.addMultiple(list);\n functionRegistry.addMultiple(math);\n functionRegistry.addMultiple(number);\n functionRegistry.addMultiple(strin g);\n functionRegistry.addMultiple(svg(environment));\n functionRegistry.a ddMultiple(types);\n\n return functions;\n};\n","import Quoted from '../tree/ quoted';\nimport URL from '../tree/url';\nimport * as utils from '../utils';\nim port logger from '../logger';\n\nexport default environment => {\n \n cons t fallback = (functionThis, node) => new URL(node, functionThis.index, functionT his.currentFileInfo).eval(functionThis.context); \n\n return { 'data-uri': function(mimetypeNode, filePathNode) {\n\n if (!filePathNode) {\n filePathNode = mimetypeNode;\n mimetypeNode = null;\n }\n \n let mimetype = mimetypeNode && mimetypeNode.value;\n let filePa th = filePathNode.value;\n const currentFileInfo = this.currentFileInfo;\ n const currentDirectory = currentFileInfo.rewriteUrls ?\n cur rentFileInfo.currentDirectory : currentFileInfo.entryPath;\n\n const frag mentStart = filePath.indexOf('#');\n let fragment = '';\n if (frag mentStart !== -1) {\n fragment = filePath.slice(fragmentStart);\n filePath = filePath.slice(0, fragmentStart);\n }\n const c ontext = utils.clone(this.context);\n context.rawBuffer = true;\n\n const fileManager = environment.getFileManager(filePath, currentDirectory, con text, environment, true);\n\n if (!fileManager) {\n return fal lback(this, filePathNode);\n }\n\n let useBase64 = false;\n\n // detect the mimetype if not given\n if (!mimetypeNode) {\n\n mimetype = environment.mimeLookup(filePath);\n\n if (mimetype === 'image/svg+xml') {\n useBase64 = false;\n } else {\n // use base 64 unless it's an ASCII or UTF-8 format\n const charset = environment.charsetLookup(mimetype);\n useBas e64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;\n }\n if (useBase64) { mimetype += ';base64'; }\n }\n else {\n useBase64 = /;base64$/.test(mimetype);\n }\n\n const fileSync = fi leManager.loadFileSync(filePath, currentDirectory, context, environment);\n if (!fileSync.contents) {\n logger.warn(`Skipped data-uri embeddin g of ${filePath} because file not found`);\n return fallback(this, fi lePathNode || mimetypeNode);\n }\n let buf = fileSync.contents;\n if (useBase64 && !environment.encodeBase64) {\n return fallbac k(this, filePathNode);\n }\n\n buf = useBase64 ? environment.encod eBase64(buf) : encodeURIComponent(buf);\n\n const uri = `data:${mimetype} ,${buf}${fragment}`;\n\n return new URL(new Quoted(`\"${uri}\"`, uri, fal se, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n } };\n};\n","import Dimension from '../tree/dimension';\nimport Color from '../tre e/color';\nimport Expression from '../tree/expression';\nimport Quoted from '../ tree/quoted';\nimport URL from '../tree/url';\n\nexport default environment => { \n return { 'svg-gradient': function(direction) {\n let stops;\n let gradientDirectionSvg;\n let gradientType = 'linear';\n let r ectangleDimension = 'x=\"0\" y=\"0\" width=\"1\" height=\"1\"';\n const r enderEnv = {compress: false};\n let returner;\n const directionVal ue = direction.toCSS(renderEnv);\n let i;\n let color;\n le t position;\n let positionValue;\n let alpha;\n\n function throwArgumentDescriptor() {\n throw { type: 'Argument',\n message: 'svg-gradient expects direction, start_color [start_position], [col or position,]...,' +\n ' end_color [end_position] or direction, color list' };\n }\n\n if (arguments.length == 2) {\n if (arguments[1].value.length < 2) {\n throwArgumentDes criptor();\n }\n stops = arguments[1].value;\n } el se if (arguments.length < 3) {\n throwArgumentDescriptor();\n } else {\n stops = Array.prototype.slice.call(arguments, 1);\n }\n\n switch (directionValue) {\n case 'to bottom':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"';\n break;\n case 'to right':\n gradientDirec tionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'to bottom right':\n gradientDirectionSvg = 'x1= \"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"';\n break;\n case 'to top right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"100 %\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'ellipse': \n case 'ellipse at center':\n gradientType = 'radial' ;\n gradientDirectionSvg = 'cx=\"50%\" cy=\"50%\" r=\"75%\"';\n rectangleDimension = 'x=\"-50\" y=\"-50\" width=\"101\" height=\"1 01\"';\n break;\n default:\n throw { ty pe: 'Argument', message: 'svg-gradient direction must be \\'to bottom\\', \\'to right\\',' +\n ' \\'to bottom right\\', \\'to top right\\' or \\'ellipse at center\\'' };\n }\n returner = `<svg xmlns=\"http:/ /www.w3.org/2000/svg\" viewBox=\"0 0 1 1\"><${gradientType}Gradient id=\"g\" ${g radientDirectionSvg}>`;\n\n for (i = 0; i < stops.length; i += 1) {\n if (stops[i] instanceof Expression) {\n color = stops[i]. value[0];\n position = stops[i].value[1];\n } else {\n color = stops[i];\n position = undefined;\n }\n\n if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) {\n throwArgumentDescriptor();\n }\n positi onValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%';\n alpha = color.alpha;\n returner += `<stop offset=\"${positionV alue}\" stop-color=\"${color.toRGB()}\"${alpha < 1 ? ` stop-opacity=\"${alpha}\" ` : ''}/>`;\n }\n returner += `</${gradientType}Gradient><rect ${r ectangleDimension} fill=\"url(#g)\" /></svg>`;\n\n returner = encodeURICo mponent(returner);\n\n returner = `data:image/svg+xml,${returner}`;\n return new URL(new Quoted(`'${returner}'`, returner, false, this.index, this .currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import co ntexts from './contexts';\nimport visitor from './visitors';\nimport tree from ' ./tree';\n\nexport default function(root, options) {\n options = options || { };\n let evaldRoot;\n let variables = options.variables;\n const evalEn v = new contexts.Eval(options);\n\n //\n // Allows setting variables with a hash, so:\n //\n // `{ color: new tree.Color('#f01') }` will become:\n //\n // new tree.Declaration('@color',\n // new tree.Value([\n // new tree.Expression([\n // new tree.Color('#f01')\n // ])\n // ])\n // )\n //\n if (typeof variables === 'objec t' && !Array.isArray(variables)) {\n variables = Object.keys(variables).m ap(function (k) {\n let value = variables[k];\n\n if (!(va lue instanceof tree.Value)) {\n if (!(value instanceof tree.Expre ssion)) {\n value = new tree.Expression([value]);\n }\n value = new tree.Value([value]);\n }\n return new tree.Declaration(`@${k}`, value, false, null, 0);\n });\ n evalEnv.frames = [new tree.Ruleset(null, variables)];\n }\n\n con st visitors = [\n new visitor.JoinSelectorVisitor(),\n new visitor .MarkVisibleSelectorsVisitor(true),\n new visitor.ExtendVisitor(),\n new visitor.ToCSSVisitor({compress: Boolean(options.compress)})\n ];\n\n const preEvalVisitors = [];\n let v;\n let visitorIterator;\n\n /**\n * first() / get() allows visitors to be added while visiting\n * \n * @todo Add scoping for visitors just like functions for @plugin; right now the y're global\n */\n if (options.pluginManager) {\n visitorIterator = options.pluginManager.visitor();\n for (var i = 0; i < 2; i++) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (v.isPreEvalVisitor) {\n if (i === 0 | | preEvalVisitors.indexOf(v) === -1) {\n preEvalVisitors. push(v);\n v.run(root);\n }\n }\n else {\n if (i === 0 || visitors.in dexOf(v) === -1) {\n if (v.isPreVisitor) {\n visitors.unshift(v);\n }\n else {\n visitors.push(v);\n }\n }\n }\n }\n }\n }\n\n evaldRoot = root.eval(evalEnv);\n\n for (var i = 0; i < visitors.l ength; i++) {\n visitors[i].run(evaldRoot);\n }\n\n // Run any rema ining visitors added after eval pass\n if (options.pluginManager) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (visitors.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) {\n v.run(evaldRoot);\n }\n }\n }\n\n return ev aldRoot;\n};\n","/**\n * Plugin Manager\n */\nclass PluginManager {\n constru ctor(less) {\n this.less = less;\n this.visitors = [];\n th is.preProcessors = [];\n this.postProcessors = [];\n this.installe dPlugins = [];\n this.fileManagers = [];\n this.iterator = -1;\n this.pluginCache = {};\n this.Loader = new less.PluginLoader(less); \n }\n\n /**\n * Adds all the plugins in the array\n * @param {Arr ay} plugins\n */\n addPlugins(plugins) {\n if (plugins) {\n for (let i = 0; i < plugins.length; i++) {\n this.addPlugin( plugins[i]);\n }\n }\n }\n\n /**\n *\n * @param plugin\n * @param {String} filename\n */\n addPlugin(plugin, filename , functionRegistry) {\n this.installedPlugins.push(plugin);\n if ( filename) {\n this.pluginCache[filename] = plugin;\n }\n if (plugin.install) {\n plugin.install(this.less, this, functionReg istry || this.less.functions.functionRegistry);\n }\n }\n\n /**\n *\n * @param filename\n */\n get(filename) {\n return this. pluginCache[filename];\n }\n\n /**\n * Adds a visitor. The visitor obj ect has options on itself to determine\n * when it should run.\n * @para m visitor\n */\n addVisitor(visitor) {\n this.visitors.push(visito r);\n }\n\n /**\n * Adds a pre processor object\n * @param {object } preProcessor\n * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import\n */\n addPreProcessor(preProcessor, p riority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; inde xToInsertAt < this.preProcessors.length; indexToInsertAt++) {\n if (t his.preProcessors[indexToInsertAt].priority >= priority) {\n brea k;\n }\n }\n this.preProcessors.splice(indexToInsertAt, 0, {preProcessor, priority});\n }\n\n /**\n * Adds a post processor o bject\n * @param {object} postProcessor\n * @param {number} priority - g uidelines 1 = before compression, 1000 = compression, 2000 = after compression\n */\n addPostProcessor(postProcessor, priority) {\n let indexToIns ertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors. length; indexToInsertAt++) {\n if (this.postProcessors[indexToInsertA t].priority >= priority) {\n break;\n }\n }\n this.postProcessors.splice(indexToInsertAt, 0, {postProcessor, priority}); \n }\n\n /**\n *\n * @param manager\n */\n addFileManager(m anager) {\n this.fileManagers.push(manager);\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPreProcessors() {\n const preProcessors = [];\n for (let i = 0; i < this.preProcessors.le ngth; i++) {\n preProcessors.push(this.preProcessors[i].preProcessor) ;\n }\n return preProcessors;\n }\n\n /**\n *\n * @r eturns {Array}\n * @private\n */\n getPostProcessors() {\n con st postProcessors = [];\n for (let i = 0; i < this.postProcessors.length; i++) {\n postProcessors.push(this.postProcessors[i].postProcessor);\ n }\n return postProcessors;\n }\n\n /**\n *\n * @re turns {Array}\n * @private\n */\n getVisitors() {\n return thi s.visitors;\n }\n\n visitor() {\n const self = this;\n retur n {\n first: function() {\n self.iterator = -1;\n return self.visitors[self.iterator];\n },\n get : function() {\n self.iterator += 1;\n return self .visitors[self.iterator];\n }\n };\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getFileManagers() {\n return this.fileManagers;\n }\n}\n\nlet pm;\n\nconst PluginManagerFactory = function(less, newFactory) {\n if (newFactory || !pm) {\n pm = new PluginManager(less);\n }\n return pm;\n};\n\n//\nexport default PluginMana gerFactory;\n","'use strict';\n\nfunction parseNodeVersion(version) {\n var mat ch = version.match(/^v(\\d{1,2})\\.(\\d{1,2})\\.(\\d{1,2})(?:-([0-9A-Za-z-.]+))? (?:\\+([0-9A-Za-z-.]+))?$/); // eslint-disable-line max-len\n if (!match) {\n throw new Error('Unable to parse: ' + version);\n }\n\n var res = {\n maj or: parseInt(match[1], 10),\n minor: parseInt(match[2], 10),\n patch: pars eInt(match[3], 10),\n pre: match[4] || '',\n build: match[5] || '',\n };\ n\n return res;\n}\n\nmodule.exports = parseNodeVersion;\n","/* global window, XMLHttpRequest */\n\nimport AbstractFileManager from '../less/environment/abstra ct-file-manager.js';\n\nlet options;\nlet logger;\nlet fileCache = {};\n\n// TOD OS - move log somewhere. pathDiff and doing something similar in node. use pathD iff in the other browser file for the initial load\nconst FileManager = function () {}\nFileManager.prototype = Object.assign(new AbstractFileManager(), {\n a lwaysMakePathsAbsolute() {\n return true;\n },\n\n join(basePath, l aterPath) {\n if (!basePath) {\n return laterPath;\n }\ n return this.extractUrlParts(laterPath, basePath).path;\n },\n\n d oXHR(url, type, callback, errback) {\n const xhr = new XMLHttpRequest();\ n const async = options.isFileProtocol ? options.fileAsync : true;\n\n if (typeof xhr.overrideMimeType === 'function') {\n xhr.override MimeType('text/css');\n }\n logger.debug(`XHR: Getting '${url}'`); \n xhr.open('GET', url, async);\n xhr.setRequestHeader('Accept', t ype || 'text/x-less, text/css; q=0.9, */*; q=0.5');\n xhr.send(null);\n\n function handleResponse(xhr, callback, errback) {\n if (xhr.s tatus >= 200 && xhr.status < 300) {\n callback(xhr.responseText,\ n xhr.getResponseHeader('Last-Modified'));\n } els e if (typeof errback === 'function') {\n errback(xhr.status, url) ;\n }\n }\n\n if (options.isFileProtocol && !options.fi leAsync) {\n if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {\n callback(xhr.responseText);\n } else {\n errback(xhr.status, url);\n }\n } else if (asyn c) {\n xhr.onreadystatechange = () => {\n if (xhr.read yState == 4) {\n handleResponse(xhr, callback, errback);\n }\n };\n } else {\n handleResponse(xhr , callback, errback);\n }\n },\n\n supports() {\n return tru e;\n },\n\n clearFileCache() {\n fileCache = {};\n },\n\n loa dFile(filename, currentDirectory, options, environment) {\n // TODO: Add prefix support like less-node?\n // What about multiple paths?\n\n if (currentDirectory && !this.isPathAbsolute(filename)) {\n filename = currentDirectory + filename;\n }\n\n filename = options.ext ? t his.tryAppendExtension(filename, options.ext) : filename;\n\n options = o ptions || {};\n\n // sheet may be set to the stylesheet for the initial l oad or a collection of properties including\n // some context variables f or imports\n const hrefParts = this.extractUrlParts(filename, window.loca tion.href);\n const href = hrefParts.url;\n const self = this;\n \n return new Promise((resolve, reject) => {\n if (options.useFileCache && fileCache[href]) {\n try {\n const lessText = fileCache[href];\n return resolv e({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }}); \n } catch (e) {\n return reject({ filename: h ref, message: `Error loading file ${href} error was ${e.message}` });\n }\n }\n\n self.doXHR(href, options.mime, function d oXHRCallback(data, lastModified) {\n // per file cache\n fileCache[href] = data;\n\n // Use remote copy (re-parse)\ n resolve({ contents: data, filename: href, webInfo: { lastModifi ed }});\n }, function doXHRError(status, url) {\n reje ct({ type: 'File', message: `'${url}' wasn't found (${status})`, href });\n });\n });\n }\n});\n\nexport default (opts, log) => {\n opti ons = opts;\n logger = log;\n return FileManager;\n}\n","import Environmen t from './environment/environment';\nimport data from './data';\nimport tree fro m './tree';\nimport AbstractFileManager from './environment/abstract-file-manage r';\nimport AbstractPluginLoader from './environment/abstract-plugin-loader';\ni mport visitors from './visitors';\nimport Parser from './parser/parser';\nimport functions from './functions';\nimport contexts from './contexts';\nimport LessE rror from './less-error';\nimport transformTree from './transform-tree';\nimport * as utils from './utils';\nimport PluginManager from './plugin-manager';\nimpo rt logger from './logger';\nimport SourceMapOutput from './source-map-output';\n import SourceMapBuilder from './source-map-builder';\nimport ParseTree from './p arse-tree';\nimport ImportManager from './import-manager';\nimport Parse from '. /parse';\nimport Render from './render';\nimport { version } from '../../package .json';\nimport parseVersion from 'parse-node-version';\n\nexport default functi on(environment, fileManagers) {\n let sourceMapOutput, sourceMapBuilder, pars eTree, importManager;\n\n environment = new Environment(environment, fileMana gers);\n sourceMapOutput = SourceMapOutput(environment);\n sourceMapBuilde r = SourceMapBuilder(sourceMapOutput, environment);\n parseTree = ParseTree(s ourceMapBuilder);\n importManager = ImportManager(environment);\n\n const render = Render(environment, parseTree, importManager);\n const parse = Parse (environment, parseTree, importManager);\n\n const v = parseVersion(`v${versi on}`);\n const initial = {\n version: [v.major, v.minor, v.patch],\n data,\n tree,\n Environment,\n AbstractFileManager,\n AbstractPluginLoader,\n environment,\n visitors,\n Parser,\n functions: functions(environment),\n contexts,\n SourceMapOutput: sourceMapOutput,\n SourceMapBuilder: sourceMapBuilder,\n ParseTree: parseTree,\n ImportManager: importManager,\n re nder,\n parse,\n LessError,\n transformTree,\n utils ,\n PluginManager,\n logger\n };\n\n // Create a public API\ n\n const ctor = function(t) {\n return function() {\n cons t obj = Object.create(t.prototype);\n t.apply(obj, Array.prototype.sl ice.call(arguments, 0));\n return obj;\n };\n };\n let t ;\n const api = Object.create(initial);\n for (const n in initial.tree) {\ n /* eslint guard-for-in: 0 */\n t = initial.tree[n];\n if (typeof t === 'function') {\n api[n.toLowerCase()] = ctor(t);\n }\n else {\n api[n] = Object.create(null);\n for (const o in t) {\n /* eslint guard-for-in: 0 */\n api[n][o.toLowerCase()] = ctor(t[o]);\n }\n }\n }\n\n /* *\n * Some of the functions assume a `this` context of the API object,\n * which causes it to fail when wrapped for ES6 imports.\n * \n * An ass umed `this` should be removed in the future.\n */\n initial.parse = initi al.parse.bind(api);\n initial.render = initial.render.bind(api);\n\n retur n api;\n};\n","import LessError from './less-error';\nimport transformTree from './transform-tree';\nimport logger from './logger';\n\nexport default function(S ourceMapBuilder) {\n class ParseTree {\n constructor(root, imports) {\ n this.root = root;\n this.imports = imports;\n }\n \n toCSS(options) {\n let evaldRoot;\n const result = {};\n let sourceMapBuilder;\n try {\n ev aldRoot = transformTree(this.root, options);\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n try {\n const compress = Boolean(options.compress);\n if (compress) {\n logger.warn('The compress option has been deprecated. ' + \n 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.');\n }\n\n const toCSSOptions = {\n compress,\n dumpLineNumbers: options.dumpLineNumbers,\n strictUnits : Boolean(options.strictUnits),\n numPrecision: 8};\n\n if (options.sourceMap) {\n sourceMapBuilder = new S ourceMapBuilder(options.sourceMap);\n result.css = sourceMapB uilder.toCSS(evaldRoot, toCSSOptions, this.imports);\n } else {\n result.css = evaldRoot.toCSS(toCSSOptions);\n }\n } catch (e) {\n throw new LessError(e, this.impor ts);\n }\n\n if (options.pluginManager) {\n const postProcessors = options.pluginManager.getPostProcessors();\n for (let i = 0; i < postProcessors.length; i++) {\n resul t.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, opt ions, imports: this.imports });\n }\n }\n i f (options.sourceMap) {\n result.map = sourceMapBuilder.getExtern alSourceMap();\n }\n\n result.imports = [];\n f or (const file in this.imports.files) {\n if (this.imports.files. hasOwnProperty(file) && file !== this.imports.rootFilename) {\n result.imports.push(file);\n }\n }\n ret urn result;\n }\n }\n\n return ParseTree;\n};\n","export default fu nction (SourceMapOutput, environment) {\n class SourceMapBuilder {\n c onstructor(options) {\n this.options = options;\n }\n\n toCSS(rootNode, options, imports) {\n const sourceMapOutput = new So urceMapOutput(\n {\n contentsIgnoredCharsMap: imports.contentsIgnoredChars,\n rootNode,\n contentsMap: imports.contents,\n sourceMapFilename: this.op tions.sourceMapFilename,\n sourceMapURL: this.options.sourceM apURL,\n outputFilename: this.options.sourceMapOutputFilename ,\n sourceMapBasepath: this.options.sourceMapBasepath,\n sourceMapRootpath: this.options.sourceMapRootpath,\n outputSourceFiles: this.options.outputSourceFiles,\n s ourceMapGenerator: this.options.sourceMapGenerator,\n sourceM apFileInline: this.options.sourceMapFileInline, \n disable SourcemapAnnotation: this.options.disableSourcemapAnnotation\n }) ;\n\n const css = sourceMapOutput.toCSS(options);\n this.s ourceMap = sourceMapOutput.sourceMap;\n this.sourceMapURL = sourceMap Output.sourceMapURL;\n if (this.options.sourceMapInputFilename) {\n this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(th is.options.sourceMapInputFilename);\n }\n if (this.options .sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) {\n this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL);\n }\n return css + this.getCSSAppendage();\n }\n\n getCSSAppendage() {\n\n let sourceMapURL = this.sourceMapURL;\n if (this.options.sourceMapFileInline) {\n if (this.so urceMap === undefined) {\n return '';\n }\n sourceMapURL = `data:application/json;base64,${environment.encodeBa se64(this.sourceMap)}`;\n }\n\n if (this.options.disableSo urcemapAnnotation) {\n return '';\n }\n\n i f (sourceMapURL) {\n return `/*# sourceMappingURL=${sourceMapURL} */`;\n }\n return '';\n }\n\n getExternalSo urceMap() {\n return this.sourceMap;\n }\n\n setExterna lSourceMap(sourceMap) {\n this.sourceMap = sourceMap;\n }\n\n isInline() {\n return this.options.sourceMapFileInline;\n }\n\n getSourceMapURL() {\n return this.sourceMapURL;\n }\n\n getOutputFilename() {\n return this.options.sourceMa pOutputFilename;\n }\n\n getInputFilename() {\n return this.sourceMapInputFilename;\n }\n }\n\n return SourceMapBuilder;\n };\n","export default function (environment) {\n class SourceMapOutput {\n constructor(options) {\n this._css = [];\n this._root Node = options.rootNode;\n this._contentsMap = options.contentsMap;\n this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap;\n if (options.sourceMapFilename) {\n this._sourceMapFilen ame = options.sourceMapFilename.replace(/\\\\/g, '/');\n }\n this._outputFilename = options.outputFilename;\n this.sourceMapURL = options.sourceMapURL;\n if (options.sourceMapBasepath) {\n this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\\\/g, '/' );\n }\n if (options.sourceMapRootpath) {\n this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\\\/g, '/');\n if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {\n this._sourceMapRootpath += '/';\n }\n } else {\n this._sourceMapRootpath = '';\n }\n this._outputSourceFiles = options.outputSourceFiles;\n this._sourceMapGeneratorConstructor = environment.getSourceMapGenerato r();\n\n this._lineNumber = 0;\n this._column = 0;\n }\n\n removeBasepath(path) {\n if (this._sourceMapBasepath & & path.indexOf(this._sourceMapBasepath) === 0) {\n path = path.su bstring(this._sourceMapBasepath.length);\n if (path.charAt(0) === '\\\\' || path.charAt(0) === '/') {\n path = path.substring( 1);\n }\n }\n\n return path;\n }\n\n normalizeFilename(filename) {\n filename = filename.replace(/ \\\\/g, '/');\n filename = this.removeBasepath(filename);\n return (this._sourceMapRootpath || '') + filename;\n }\n\n add(c hunk, fileInfo, index, mapLines) {\n\n // ignore adding empty strings \n if (!chunk) {\n return;\n }\n\n let lines, sourceLines, columns, sourceColumns, i;\n\n if (fileInf o && fileInfo.filename) {\n let inputSource = this._contentsMap[f ileInfo.filename];\n\n // remove vars/banner added to the top of the file\n if (this._contentsIgnoredCharsMap[fileInfo.filename]) {\n // adjust the index\n index -= this._c ontentsIgnoredCharsMap[fileInfo.filename];\n if (index < 0) { index = 0; }\n // adjust the source\n inp utSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]);\ n }\n\n /** \n * ignore empty cont ent, or failsafe\n * if contents map is incorrect\n */\n if (inputSource === undefined) {\n th is._css.push(chunk);\n return;\n }\n\n inputSource = inputSource.substring(0, index);\n sourceLi nes = inputSource.split('\\n');\n sourceColumns = sourceLines[sou rceLines.length - 1];\n }\n\n lines = chunk.split('\\n');\ n columns = lines[lines.length - 1];\n\n if (fileInfo && f ileInfo.filename) {\n if (!mapLines) {\n this. _sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column : this._column},\n original: { line: sourceLines.length, column: sourceColumns.length},\n source: this.normalizeFi lename(fileInfo.filename)});\n } else {\n for (i = 0; i < lines.length; i++) {\n this._sourceMapGenerat or.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? t his._column : 0},\n original: { line: sourceLines.len gth + i, column: i === 0 ? sourceColumns.length : 0},\n source: this.normalizeFilename(fileInfo.filename)});\n }\n }\n }\n\n if (lines.length === 1) {\n this._column += columns.length;\n } else {\n this._lineNumber += lines.length - 1;\n this._column = columns. length;\n }\n\n this._css.push(chunk);\n }\n\n isEmpty() {\n return this._css.length === 0;\n }\n\n toCSS(context) {\n this._sourceMapGenerator = new this._sourceMapGen eratorConstructor({ file: this._outputFilename, sourceRoot: null });\n\n if (this._outputSourceFiles) {\n for (const filename in this. _contentsMap) {\n if (this._contentsMap.hasOwnProperty(filena me)) {\n let source = this._contentsMap[filename];\n if (this._contentsIgnoredCharsMap[filename]) {\n source = source.slice(this._contentsIgnoredCharsMap[filename]);\n }\n this._sourceMapGenerator.setS ourceContent(this.normalizeFilename(filename), source);\n }\n }\n }\n\n this._rootNode.genCSS(context, t his);\n\n if (this._css.length > 0) {\n let sourceMapU RL;\n const sourceMapContent = JSON.stringify(this._sourceMapGene rator.toJSON());\n\n if (this.sourceMapURL) {\n sourceMapURL = this.sourceMapURL;\n } else if (this._sourceMapF ilename) {\n sourceMapURL = this._sourceMapFilename;\n }\n this.sourceMapURL = sourceMapURL;\n\n this.sourceMap = sourceMapContent;\n }\n\n return this._c ss.join('');\n }\n }\n\n return SourceMapOutput;\n};\n","import con texts from './contexts';\nimport Parser from './parser/parser';\nimport LessErro r from './less-error';\nimport * as utils from './utils';\nimport logger from '. /logger';\n\nexport default function(environment) {\n // FileInfo = {\n // 'rewriteUrls' - option - whether to adjust URL's to be relative\n // 'file name' - full resolved filename of current file\n // 'rootpath' - path to app end to normal URLs for this node\n // 'currentDirectory' - path to the curre nt file, absolute\n // 'rootFilename' - filename of the base file\n // ' entryPath' - absolute path to the entry file\n // 'reference' - whether the file should not be output and only output parts that are referenced\n\n class ImportManager {\n constructor(less, context, rootFileInfo) {\n this.less = less;\n this.rootFilename = rootFileInfo.filename;\n this.paths = context.paths || []; // Search paths, when importing\n this.contents = {}; // map - filename to contents of all th e files\n this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore\n this.mime = context.mime;\n this.error = null;\n this.context = context;\n // Deprecated? Unused outside of here, could be useful.\n this.queue = []; // Files which haven't been imported yet\n this.files = {}; // Holds the imported parse trees.\n }\n\n /**\n * Add an import to be imported\n * @param path - the raw path\n * @param tryAppendExtension - whether to try appending a file extension (.les s or .js if the path has no extension)\n * @param currentFileInfo - the current file info (used for instance to work out relative paths)\n * @pa ram importOptions - import options\n * @param callback - callback for wh en it is imported\n */\n push(path, tryAppendExtension, currentFi leInfo, importOptions, callback) {\n const importManager = this, plug inLoader = this.context.pluginManager.Loader;\n\n this.queue.push(pat h);\n\n const fileParsedFunc = function (e, root, fullPath) {\n importManager.queue.splice(importManager.queue.indexOf(path), 1); // R emove the path from the queue\n\n const importedEqualsRoot = full Path === importManager.rootFilename;\n if (importOptions.optional && e) {\n callback(null, {rules:[]}, false, null);\n logger.info(`The file ${fullPath} was skipped because it was not fou nd and the import was marked optional.`);\n }\n el se {\n // Inline imports aren't cached here.\n // If we start to cache them, please make sure they won't conflict with non -inline imports of the\n // same name as they used to do befo re this comment and the condition below have been added.\n if (!importManager.files[fullPath] && !importOptions.inline) {\n importManager.files[fullPath] = { root, options: importOptions };\n }\n if (e && !importManager.error) { importManag er.error = e; }\n callback(e, root, importedEqualsRoot, fullP ath);\n }\n };\n\n const newFileInfo = {\n rewriteUrls: this.context.rewriteUrls,\n entryPath : currentFileInfo.entryPath,\n rootpath: currentFileInfo.rootpath ,\n rootFilename: currentFileInfo.rootFilename\n };\n\ n const fileManager = environment.getFileManager(path, currentFileInf o.currentDirectory, this.context, environment);\n\n if (!fileManager) {\n fileParsedFunc({ message: `Could not find a file-manager for ${path}` });\n return;\n }\n\n const loadF ileCallback = function(loadedFile) {\n let plugin;\n const resolvedFilename = loadedFile.filename;\n const contents = loadedFile.contents.replace(/^\\uFEFF/, '');\n\n // Pass on an updated rootpath if path of imported file is relative and file\n // is in a (sub|sup) directory\n //\n // Examples :\n // - If path of imported file is 'module/nav/nav.less' and ro otpath is 'less/',\n // then rootpath should become 'less/modul e/nav/'\n // - If path of imported file is '../mixins.less' and r ootpath is 'less/',\n // then rootpath should become 'less/../' \n newFileInfo.currentDirectory = fileManager.getPath(resolvedFil ename);\n if (newFileInfo.rewriteUrls) {\n new FileInfo.rootpath = fileManager.join(\n (importManager.co ntext.rootpath || ''),\n fileManager.pathDiff(newFileInfo .currentDirectory, newFileInfo.entryPath));\n\n if (!fileMana ger.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute( )) {\n newFileInfo.rootpath = fileManager.join(newFileInf o.entryPath, newFileInfo.rootpath);\n }\n }\n newFileInfo.filename = resolvedFilename;\n\n const newEnv = new contexts.Parse(importManager.context);\n\n newEnv.p rocessImports = false;\n importManager.contents[resolvedFilename] = contents;\n\n if (currentFileInfo.reference || importOptions.r eference) {\n newFileInfo.reference = true;\n }\n\n if (importOptions.isPlugin) {\n plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginAr gs, newFileInfo);\n if (plugin instanceof LessError) {\n fileParsedFunc(plugin, null, resolvedFilename);\n }\n else {\n fileParsedFunc(nu ll, plugin, resolvedFilename);\n }\n } else if (importOptions.inline) {\n fileParsedFunc(null, contents, re solvedFilename);\n } else {\n // import (multi ple) parse trees apparently get altered and can't be cached.\n // TODO: investigate why this is\n if (importManager.files[ resolvedFilename]\n && !importManager.files[resolvedFilen ame].options.multiple\n && !importOptions.multiple) {\n\n fileParsedFunc(null, importManager.files[resolvedFilenam e].root, resolvedFilename);\n }\n else {\n new Parser(newEnv, importManager, newFileInfo).parse(con tents, function (e, root) {\n fileParsedFunc(e, root, resolvedFilename);\n });\n }\n }\n };\n let loadedFile;\n let promise ;\n const context = utils.clone(this.context);\n\n if (try AppendExtension) {\n context.ext = importOptions.isPlugin ? '.js' : '.less';\n }\n\n if (importOptions.isPlugin) {\n context.mime = 'application/javascript';\n\n if (context .syncImport) {\n loadedFile = pluginLoader.loadPluginSync(pat h, currentFileInfo.currentDirectory, context, environment, fileManager);\n } else {\n promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n }\n }\n else {\n if (context.syncImp ort) {\n loadedFile = fileManager.loadFileSync(path, currentF ileInfo.currentDirectory, context, environment);\n } else {\n promise = fileManager.loadFile(path, currentFileInfo.currentDire ctory, context, environment,\n (err, loadedFile) => {\n if (err) {\n fileParsed Func(err);\n } else {\n loadFileCallback(loadedFile);\n }\n });\n }\n }\n if (loadedFile) {\n if (!loadedFile.filename) {\n fileParsedFunc(lo adedFile);\n } else {\n loadFileCallback(loade dFile);\n }\n } else if (promise) {\n p romise.then(loadFileCallback, fileParsedFunc);\n }\n }\n }\ n\n return ImportManager;\n};\n","import * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const render = f unction (input, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(thi s.options, {});\n }\n else {\n options = utils.copyOpti ons(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reje ct) {\n render.call(self, input, options, function(err, output) { \n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n this. parse(input, options, function(err, root, imports, options) {\n i f (err) { return callback(err); }\n\n let result;\n try {\n const parseTree = new ParseTree(root, imports);\n result = parseTree.toCSS(options);\n }\n catch (err) { return callback(err); }\n\n callback(null, result);\n });\n }\n };\n\n return render;\n};\n","impo rt contexts from './contexts';\nimport Parser from './parser/parser';\nimport Pl uginManager from './plugin-manager';\nimport LessError from './less-error';\nimp ort * as utils from './utils';\n\nexport default function(environment, ParseTree , ImportManager) {\n const parse = function (input, options, callback) {\n\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n els e {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n r eturn new Promise(function (resolve, reject) {\n parse.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n let context;\n let rootFileInfo;\n const pluginManager = new PluginManager(this, !options.reUsePluginMa nager);\n\n options.pluginManager = pluginManager;\n\n con text = new contexts.Parse(options);\n\n if (options.rootFileInfo) {\n rootFileInfo = options.rootFileInfo;\n } else {\n const filename = options.filename || 'input';\n const entryPath = filename.replace(/[^\\/\\\\]*$/, '');\n rootFileInfo = {\n filename,\n rewriteUrls: context.re writeUrls,\n rootpath: context.rootpath || '',\n currentDirectory: entryPath,\n entryPath,\n rootFilename: filename\n };\n // add in a missing trailing slash\n if (rootFileInfo.rootpath && rootFileIn fo.rootpath.slice(-1) !== '/') {\n rootFileInfo.rootpath += ' /';\n }\n }\n\n const imports = new ImportM anager(this, context, rootFileInfo);\n this.importManager = imports;\ n\n // TODO: allow the plugins to be just a list of paths or names\n // Do an async plugin queue like lessc\n\n if (options.plu gins) {\n options.plugins.forEach(function(plugin) {\n let evalResult, contents;\n if (plugin.fileContent) {\n contents = plugin.fileContent.replace(/^\\uFEFF/, '') ;\n evalResult = pluginManager.Loader.evalPlugin(contents , context, imports, plugin.options, plugin.filename);\n i f (evalResult instanceof LessError) {\n return callba ck(evalResult);\n }\n }\n else {\n pluginManager.addPlugin(plugin);\n }\n });\n }\n\n new Parser(con text, imports, rootFileInfo)\n .parse(input, function (e, root) { \n if (e) { return callback(e); }\n callba ck(null, root, imports, options);\n }, options);\n }\n };\n return parse;\n};\n","// TODO: Add tests for browser @plugin\n/* global window */\n\nimport AbstractPluginLoader from '../less/environment/abstract-plug in-loader.js';\n\n/**\n * Browser Plugin Loader\n */\nconst PluginLoader = funct ion(less) {\n this.less = less;\n // Should we shim this.require for brows er? Probably not?\n};\n\nPluginLoader.prototype = Object.assign(new AbstractPlug inLoader(), {\n loadPlugin(filename, basePath, context, environment, fileMana ger) {\n return new Promise((fulfill, reject) => {\n fileManag er.loadFile(filename, basePath, context, environment)\n .then(ful fill).catch(reject);\n });\n }\n});\n\nexport default PluginLoader;\n\ n","import * as utils from './utils';\nimport browser from './browser';\n\nexpor t default (window, less, options) => {\n\n function errorHTML(e, rootHref) {\ n const id = `less-error-message:${utils.extractId(rootHref || '')}`;\n const template = '<li><label>{line}</label><pre class=\"{class}\">{content }</pre></li>';\n const elem = window.document.createElement('div');\n let timer;\n let content;\n const errors = [];\n const filename = e.filename || rootHref;\n const filenameNoPath = filename.matc h(/([^\\/]+(\\?.*)?)$/)[1];\n\n elem.id = id;\n elem.classN ame = 'less-error-message';\n\n content = `<h3>${e.type || 'Syntax'}Error : ${e.message || 'There is an error in your .less file'}` + \n `</h3> <p>in <a href=\"${filename}\">${filenameNoPath}</a> `;\n\n const errorlin e = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0 ) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n \n if (e.line) {\n errorline(e, 0, '');\n errorline (e, 1, 'line');\n errorline(e, 2, '');\n content += `on li ne ${e.line}, column ${e.column + 1}:</p><ul>${errors.join('')}</ul>`;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n c ontent += `<br/>Stack Trace</br />${e.stack.split('\\n').slice(1).join('<br/>')} `;\n }\n elem.innerHTML = content;\n\n // CSS for error mes sages\n browser.createCSS(window.document, [\n '.less-error-me ssage ul, .less-error-message li {',\n 'list-style-type: none;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'ma rgin: 0;',\n '}',\n '.less-error-message label {',\n 'font-size: 12px;',\n 'margin-right: 15px;',\n 'padd ing: 4px 0;',\n 'color: #cc7777;',\n '}',\n '.l ess-error-message pre {',\n 'color: #dd6666;',\n 'padding: 4px 0;',\n 'margin: 0;',\n 'display: inline-block;',\n '}',\n '.less-error-message pre.line {',\n 'color : #ff0000;',\n '}',\n '.less-error-message h3 {',\n 'font-size: 20px;',\n 'font-weight: bold;',\n 'paddin g: 15px 0 5px 0;',\n 'margin: 0;',\n '}',\n '.l ess-error-message a {',\n 'color: #10a',\n '}',\n '.less-error-message .error {',\n 'color: red;',\n 'fon t-weight: bold;',\n 'padding-bottom: 2px;',\n 'border-bott om: 1px dashed red;',\n '}'\n ].join('\\n'), { title: 'error-m essage' });\n\n elem.style.cssText = [\n 'font-family: Arial, sans-serif',\n 'border: 1px solid #e00',\n 'background-col or: #eee',\n 'border-radius: 5px',\n '-webkit-border-radiu s: 5px',\n '-moz-border-radius: 5px',\n 'color: #e00',\n 'padding: 15px',\n 'margin-bottom: 15px'\n ].join('; ');\n\n if (options.env === 'development') {\n timer = setInte rval(() => {\n const document = window.document;\n const body = document.body;\n if (body) {\n i f (document.getElementById(id)) {\n body.replaceChild(ele m, document.getElementById(id));\n } else {\n body.insertBefore(elem, body.firstChild);\n }\n clearInterval(timer);\n }\n }, 10);\n }\n }\n\n function removeErrorHTML(path) {\n const node = wind ow.document.getElementById(`less-error-message:${utils.extractId(path)}`);\n if (node) {\n node.parentNode.removeChild(node);\n }\n }\n\n function removeErrorConsole(path) {\n // no action\n }\n\n function removeError(path) {\n if (!options.errorReporting || options.er rorReporting === 'html') {\n removeErrorHTML(path);\n } else i f (options.errorReporting === 'console') {\n removeErrorConsole(path) ;\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('remove', path);\n }\n }\n\n function err orConsole(e, rootHref) {\n const template = '{line} {content}';\n const filename = e.filename || rootHref;\n const errors = [];\n le t content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in yo ur .less file'} in ${filename}`;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push (template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\ {content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += ` on line ${e.line}, column ${e.column + 1}:\\n${errors.join('\\n')}`;\n }\n if (e.stack && (e .extract || options.logLevel >= 4)) {\n content += `\\nStack Trace\\n ${e.stack}`;\n }\n less.logger.error(content);\n }\n\n funct ion error(e, rootHref) {\n if (!options.errorReporting || options.errorRe porting === 'html') {\n errorHTML(e, rootHref);\n } else if (o ptions.errorReporting === 'console') {\n errorConsole(e, rootHref);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('add', e, rootHref);\n }\n }\n\n return {\n add: error,\n remove: removeError\n };\n};\n","/**\n * Kicks of f less and compiles any stylesheets\n * used in the browser distributed version of less\n * to kick-start less using the browser api\n */\n/* global window, doc ument */\n\nimport defaultOptions from '../less/default-options';\nimport addDef aultOptions from './add-default-options';\nimport root from './index';\n\nconst options = defaultOptions();\n\nif (window.less) {\n for (const key in window. less) {\n if (window.less.hasOwnProperty(key)) {\n options[key ] = window.less[key];\n }\n }\n}\naddDefaultOptions(window, options);\ n\noptions.plugins = options.plugins || [];\n\nif (window.LESS_PLUGINS) {\n o ptions.plugins = options.plugins.concat(window.LESS_PLUGINS);\n}\n\nconst less = root(window, options);\nexport default less;\n\nwindow.less = less;\n\nlet css; \nlet head;\nlet style;\n\n// Always restore page visibility\nfunction resolveOr Reject(data) {\n if (data.filename) {\n console.warn(data);\n }\n if (!options.async) {\n head.removeChild(style);\n }\n}\n\nif (optio ns.onReady) {\n if (/!watch/.test(window.location.hash)) {\n less.watc h();\n }\n // Simulate synchronous stylesheet loading by hiding page rende ring\n if (!options.async) {\n css = 'body { display: none !important }';\n head = document.head || document.getElementsByTagName('head')[0];\n style = document.createElement('style');\n\n style.type = 'text/c ss';\n if (style.styleSheet) {\n style.styleSheet.cssText = cs s;\n } else {\n style.appendChild(document.createTextNode(css) );\n }\n\n head.appendChild(style);\n }\n less.registerStyle sheetsImmediately();\n less.pageLoadFinished = less.refresh(less.env === 'dev elopment').then(resolveOrReject, resolveOrReject);\n}\n","// Export a new defaul t each time\nexport default function() {\n return {\n /* Inline Javasc ript - @plugin still allowed */\n javascriptEnabled: false,\n\n /* Outputs a makefile import dependency list to stdout. */\n depends: false ,\n\n /* (DEPRECATED) Compress using less built-in compression. \n * This does an okay job but does not utilise all the tricks of \n * de dicated css compression. */\n compress: false,\n\n /* Runs the les s parser and just reports errors without any output. */\n lint: false,\n\ n /* Sets available include paths.\n * If the file in an @import rule does not exist at that exact location, \n * less will look for it a t the location(s) passed to this option. \n * You might use this for ins tance to specify a path to a library which \n * you want to be reference d simply and relatively in the less files. */\n paths: [],\n\n /* color output in the terminal */\n color: true,\n\n /* The strictIm ports controls whether the compiler will allow an @import inside of either \n * @media blocks or (a later addition) other selector blocks.\n * S ee: https://github.com/less/less.js/issues/656 */\n strictImports: false, \n\n /* Allow Imports from Insecure HTTPS Hosts */\n insecure: fal se,\n\n /* Allows you to add a path to every generated import and url in your css. \n * This does not affect less import statements that are proc essed, just ones \n * that are left in the output css. */\n rootp ath: '',\n\n /* By default URLs are kept as-is, so if you import a file i n a sub-directory \n * that references an image, exactly the same URL wi ll be output in the css. \n * This option allows you to re-write URL's i n imported files so that the \n * URL is always relative to the base imp orted file */\n rewriteUrls: false,\n\n /* How to process math \n * 0 always - eagerly try to solve all operations\n * 1 parens-division - require parens for division \"/\"\n * 2 parens | strict - require parens for all operations\n * 3 strict-legacy - legacy strict behavior (super-strict)\n */\n math: 1,\n\n /* Without this option, less attempts to guess at the output unit when it does maths. */\n strictUnits: false,\n\n /* Effectively the declaratio n is put at the top of your base Less file, \n * meaning it can be used but it also can be overridden if this variable \n * is defined in the fi le. */\n globalVars: null,\n\n /* As opposed to the global variabl e option, this puts the declaration at the\n * end of your base file, me aning it will override anything defined in your Less file. */\n modifyVar s: null,\n\n /* This option allows you to specify a argument to go on to every URL. */\n urlArgs: ''\n }\n};","import {addDataAttr} from './ut ils';\nimport browser from './browser';\n\nexport default (window, options) => { \n\n // use options from the current script tag data attribues\n addDataAt tr(options, browser.currentScript(window));\n\n if (options.isFileProtocol == = undefined) {\n options.isFileProtocol = /^(file|(chrome|safari)(-extens ion)?|resource|qrc|app):/.test(window.location.protocol);\n }\n\n // Load styles asynchronously (default: false)\n //\n // This is set to `false` by default, so that the body\n // doesn't start loading before the stylesheets are parsed.\n // Setting this to `true` can result in flickering.\n //\n options.async = options.async || false;\n options.fileAsync = options.fileA sync || false;\n\n // Interval between watch polls\n options.poll = option s.poll || (options.isFileProtocol ? 1000 : 1500);\n\n options.env = options.e nv || (window.location.hostname == '127.0.0.1' ||\n window.location.hostn ame == '0.0.0.0' ||\n window.location.hostname == 'localhost' ||\n (window.location.port &&\n window.location.port.length > 0) | |\n options.isFileProtocol ? 'development'\n : ' production');\n\n const dumpLineNumbers = /!dumpLineNumbers:(comments|mediaqu ery|all)/.exec(window.location.hash);\n if (dumpLineNumbers) {\n optio ns.dumpLineNumbers = dumpLineNumbers[1];\n }\n\n if (options.useFileCache === undefined) {\n options.useFileCache = true;\n }\n\n if (options .onReady === undefined) {\n options.onReady = true;\n }\n\n if (opt ions.relativeUrls) {\n options.rewriteUrls = 'all';\n }\n};\n","//\n// index.js\n// Should expose the additional browser functions on to the less obje ct\n//\nimport {addDataAttr} from './utils';\nimport lessRoot from '../less';\ni mport browser from './browser';\nimport FM from './file-manager';\nimport Plugin Loader from './plugin-loader';\nimport LogListener from './log-listener';\nimpor t ErrorReporting from './error-reporting';\nimport Cache from './cache';\nimport ImageSize from './image-size';\n\nexport default (window, options) => {\n co nst document = window.document;\n const less = lessRoot();\n\n less.option s = options;\n const environment = less.environment;\n const FileManager = FM(options, less.logger);\n const fileManager = new FileManager();\n envi ronment.addFileManager(fileManager);\n less.FileManager = FileManager;\n l ess.PluginLoader = PluginLoader;\n\n LogListener(less, options);\n const e rrors = ErrorReporting(window, less, options);\n const cache = less.cache = o ptions.cache || Cache(window, options, less.logger);\n ImageSize(less.environ ment);\n\n // Setup user functions - Deprecate?\n if (options.functions) { \n less.functions.functionRegistry.addMultiple(options.functions);\n } \n\n const typePattern = /^text\\/(x-)?less$/;\n\n function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (o bj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n }\n\n // only really needed for phantom\n function bind(func, thisArg) {\n const curryArgs = Array.pro totype.slice.call(arguments, 2);\n return function() {\n const args = curryArgs.concat(Array.prototype.slice.call(arguments, 0));\n return func.apply(thisArg, args);\n };\n }\n\n function loadStyles (modifyVars) {\n const styles = document.getElementsByTagName('style');\n let style;\n\n for (let i = 0; i < styles.length; i++) {\n style = styles[i];\n if (style.type.match(typePattern)) {\n const instanceOptions = clone(options);\n instanceOpti ons.modifyVars = modifyVars;\n const lessText = style.innerHTML | | '';\n instanceOptions.filename = document.location.href.replace (/#.*$/, '');\n\n /* jshint loopfunc:true */\n // use closure to store current style\n less.render(lessText, instan ceOptions,\n bind((style, e, result) => {\n if (e) {\n errors.add(e, 'inline');\n } else {\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = result.css;\n } else {\ n style.innerHTML = result.css;\n }\n }\n }, null, style));\ n }\n }\n }\n\n function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) {\n\n const instanceOptions = clone(optio ns);\n addDataAttr(instanceOptions, sheet);\n instanceOptions.mime = sheet.type;\n\n if (modifyVars) {\n instanceOptions.modifyV ars = modifyVars;\n }\n\n function loadInitialFileCallback(loadedF ile) {\n const data = loadedFile.contents;\n const path = loadedFile.filename;\n const webInfo = loadedFile.webInfo;\n\n const newFileInfo = {\n currentDirectory: fileManager.getPat h(path),\n filename: path,\n rootFilename: path,\n rewriteUrls: instanceOptions.rewriteUrls\n };\n\n newFileInfo.entryPath = newFileInfo.currentDirectory;\n newFi leInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory;\n\n if (webInfo) {\n webInfo.remaining = remaining;\n\n const css = cache.getCSS(path, webInfo, instanceOptions.modifyVars) ;\n if (!reload && css) {\n webInfo.local = tr ue;\n callback(null, css, data, sheet, webInfo, path);\n return;\n }\n\n }\n\n // TOD O add tests around how this behaves when reloading\n errors.remove(pa th);\n\n instanceOptions.rootFileInfo = newFileInfo;\n les s.render(data, instanceOptions, (e, result) => {\n if (e) {\n e.href = path;\n callback(e);\n } else {\n cache.setCSS(sheet.href, webInfo.lastModified, i nstanceOptions.modifyVars, result.css);\n callback(null, resu lt.css, data, sheet, webInfo, path);\n }\n });\n }\n\n fileManager.loadFile(sheet.href, null, instanceOptions, environme nt)\n .then(loadedFile => {\n loadInitialFileCallback( loadedFile);\n }).catch(err => {\n console.log(err);\n callback(err);\n });\n\n }\n\n function loadSty leSheets(callback, reload, modifyVars) {\n for (let i = 0; i < less.sheet s.length; i++) {\n loadStyleSheet(less.sheets[i], callback, reload, l ess.sheets.length - (i + 1), modifyVars);\n }\n }\n\n function init RunningMode() {\n if (less.env === 'development') {\n less.wat chTimer = setInterval(() => {\n if (less.watchMode) {\n fileManager.clearFileCache();\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n } els e if (css) {\n browser.createCSS(window.document, css , sheet);\n }\n });\n } \n }, options.poll);\n }\n }\n\n //\n // Watch mode\n //\n less.watch = function () {\n if (!less.watchMode ) {\n less.env = 'development';\n initRunningMode();\n }\n this.watchMode = true;\n return true;\n };\n\n less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return fals e; };\n\n //\n // Synchronously get all <link> tags with the 'rel' attribu te set to\n // \"stylesheet/less\".\n //\n less.registerStylesheetsImme diately = () => {\n const links = document.getElementsByTagName('link');\ n less.sheets = [];\n\n for (let i = 0; i < links.length; i++) {\n if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/style sheet/) &&\n (links[i].type.match(typePattern)))) {\n less.sheets.push(links[i]);\n }\n }\n };\n\n //\n // Asynchronously get all <link> tags with the 'rel' attribute set to\n // \ "stylesheet/less\", returning a Promise.\n //\n less.registerStylesheets = () => new Promise((resolve, reject) => {\n less.registerStylesheetsImmed iately();\n resolve();\n });\n\n //\n // With this function, it' s possible to alter variables and re-render\n // CSS without reloading less-f iles\n //\n less.modifyVars = record => less.refresh(true, record, false); \n\n less.refresh = (reload, modifyVars, clearFileCache) => {\n if ((r eload || clearFileCache) && clearFileCache !== false) {\n fileManager .clearFileCache();\n }\n return new Promise((resolve, reject) => { \n let startTime;\n let endTime;\n let totalMil liseconds;\n let remainingSheets;\n startTime = endTime = new Date();\n\n // Set counter for remaining unprocessed sheets\n remainingSheets = less.sheets.length;\n\n if (remainingSheets === 0) {\n\n endTime = new Date();\n totalMillise conds = endTime - startTime;\n less.logger.info('Less has finishe d and no sheets were loaded.');\n resolve({\n startTime,\n endTime,\n totalMilliseconds, \n sheets: less.sheets.length\n });\n\n } else {\n // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array\n load StyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n reject(e);\n return;\n }\n if (webInfo.local) {\n less.logger.info(`Loadin g ${sheet.href} from cache.`);\n } else {\n less.logger.info(`Rendered ${sheet.href} successfully.`);\n }\n browser.createCSS(window.document, css, sheet);\n less.logger.info(`CSS for ${sheet.href} generated in ${new Date () - endTime}ms`);\n\n // Count completed sheet\n remainingSheets--;\n\n // Check if the last remaining sheet was processed and then call the promise\n if (remainin gSheets === 0) {\n totalMilliseconds = new Date() - start Time;\n less.logger.info(`Less has finished. CSS generate d in ${totalMilliseconds}ms`);\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets .length\n });\n }\n endTime = new Date();\n }, reload, modifyVars);\n }\n \n loadStyles(modifyVars);\n });\n };\n\n less.refreshSt yles = loadStyles;\n return less;\n};\n","export default (less, options) => { \n const logLevel_debug = 4;\n const logLevel_info = 3;\n const logLeve l_warn = 2;\n const logLevel_error = 1;\n\n // The amount of logging in th e javascript console.\n // 3 - Debug, information and errors\n // 2 - Info rmation and errors\n // 1 - Errors\n // 0 - None\n // Defaults to 2\n options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error);\n\n if ( !options.loggers) {\n options.loggers = [{\n debug: function(m sg) {\n if (options.logLevel >= logLevel_debug) {\n console.log(msg);\n }\n },\n info: fu nction(msg) {\n if (options.logLevel >= logLevel_info) {\n console.log(msg);\n }\n },\n w arn: function(msg) {\n if (options.logLevel >= logLevel_warn) {\n console.warn(msg);\n }\n },\n error: function(msg) {\n if (options.logLevel >= logLevel_ error) {\n console.error(msg);\n }\n }\n }];\n }\n for (let i = 0; i < options.loggers.length; i++) {\ n less.logger.addListener(options.loggers[i]);\n }\n};\n","// Cache sy stem is a bit outdated and could do with work\n\nexport default (window, options , logger) => {\n let cache = null;\n if (options.env !== 'development') {\ n try {\n cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage;\n } catch (_) {}\n }\n return {\n setCSS: function(path, lastModified, modifyVars, styles) {\n if (cache) {\n logger.info(`saving ${path} to cache.`);\n try {\n cache.setItem(path, styles);\n cache.setItem(`${path}:timestamp`, lastModified);\n if (mod ifyVars) {\n cache.setItem(`${path}:vars`, JSON.stringify (modifyVars));\n }\n } catch (e) {\n // TODO - could do with adding more robust error handling\n logger.error(`failed to save \"${path}\" to local storage for caching.` );\n }\n }\n },\n getCSS: function(path, webInfo, modifyVars) {\n const css = cache && cache.getItem(pa th);\n const timestamp = cache && cache.getItem(`${path}:timestamp`); \n let vars = cache && cache.getItem(`${path}:vars`);\n\n modifyVars = modifyVars || {};\n vars = vars || \"{}\"; // if no t set, treat as the JSON representation of an empty object\n\n if (ti mestamp && webInfo.lastModified &&\n (new Date(webInfo.lastModifi ed).valueOf() ===\n new Date(timestamp).valueOf()) &&\n JSON.stringify(modifyVars) === vars) {\n // Use local c opy\n return css;\n }\n }\n };\n};\n","\nimp ort functionRegistry from './../less/functions/function-registry';\n\nexport def ault () => {\n function imageSize() {\n throw {\n type: 'Ru ntime',\n message: 'Image size functions are not supported in browser version of less'\n };\n }\n\n const imageFunctions = {\n 'i mage-size': function(filePathNode) {\n imageSize(this, filePathNode); \n return -1;\n },\n 'image-width': function(filePathNo de) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-height': function(filePathNode) {\n imageSize(t his, filePathNode);\n return -1;\n }\n };\n\n functionRe gistry.addMultiple(imageFunctions);\n};\n"],"names":["extractId","href","replace ","addDataAttr","options","tag","opt","dataset","hasOwnProperty","JSON","parse", "_","document","styles","sheet","id","title","utils.extractId","oldStyleNode","g etElementById","keepOldStyleNode","styleNode","createElement","setAttribute","me dia","styleSheet","appendChild","createTextNode","childNodes","length","firstChi ld","nodeValue","head","getElementsByTagName","nextEl","nextSibling","parentNode ","insertBefore","removeChild","cssText","e","Error","window","scripts","current Script","error","msg","this","_fireEvent","warn","info","debug","addListener","l istener","_listeners","push","removeListener","i","splice","type","logFunction", "externalEnvironment","fileManagers","requiredFunctions","functions","concat","p ropName","environmentFunc","bind","Environment","filename","currentDirectory","e nvironment","isSync","logger","pluginManager","getFileManagers","fileManager","a liceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","b lanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse", "chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","dar kcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagent a","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagre en","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet" ,"deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwh ite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray", "grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory"," khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightc oral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","l ightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsl ategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","ma roon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagr een","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred"," midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace", "olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","p aleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","pow derblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","s almon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue ","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle ","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgre en","m","cm","mm","in","px","pt","pc","duration","s","ms","angle","rad","Math"," PI","deg","grad","turn","colors","unitConversions","parent","visibilityBlocks"," undefined","nodeVisible","rootNode","parsed","Object","Node","fileInfo","getInde x","nodes","set","node","Array","isArray","forEach","_index","_fileInfo","contex t","strs","genCSS","add","chunk","index","isEmpty","join","output","value","visi tor","visit","op","a","b","precision","numPrecision","Number","toFixed","compare ","Color","rgb","originalForm","self","match","map","c","parseInt","alpha","spli t","clamp","v","max","min","toHex","round","toString","prototype","assign","luma ","r","g","pow","toCSS","doNotCompress","color","colorFunction","compress","args ","fround","indexOf","toHSL","h","l","toRGB","splitcolor","operate","other","_op erate","d","toHSV","toARGB","x","fromKeyword","keyword","key","toLowerCase","sli ce","Paren","eval","_noSpaceCombinators"," ","|","Combinator","emptyOrWhitespace ","trim","spaceOrEmpty","Element","combinator","isVariable","currentFileInfo","v isibilityInfo","copyVisibilityInfo","setParent","accept","clone","firstSelector" ,"charAt","ALWAYS","PARENS_DIVISION","PARENS","RewriteUrls","getType","payload", "call","copy","target","constructor","getPrototypeOf","il","arguments","k","j"," jl","__spreadArrays","getOwnPropertyNames","getOwnPropertySymbols","reduce","car ry","props","includes","newVal","originalObject","includeNonenumerable","propTyp e","propertyIsEnumerable","defineProperty","enumerable","writable","configurable ","assignProp","nonenumerable","getLocation","inputStream","n","line","column"," copyArray","arr","obj","cloned","prop","defaults","obj1","obj2","newObj","_defau lts","defaults_1","copyOptions","opts","strictMath","math","Constants.Math","rel ativeUrls","rewriteUrls","Constants.RewriteUrls","flattenArray","result","length _1","anonymousFunc","LessError","fileContentMap","currentFilename","message","st ack","input","contents","loc","utils.getLocation","col","callLine","lines","foun d","func","Function","lineAdjust","callExtract","extract","create","F","stylize" ,"str","errorTxt","substr","Selector","elements","extendList","condition","evald Condition","getElements","mixinElements_","visitArray","createDerived","newSelec tor","mediaEmpty","els","parseNode","err","imports","createEmptySelectors","el", "sels","olen","len","mixinElements","shift","isJustParentSelector","extend","get IsOutput","Value","Keyword","True","False","Anonymous","mapLines","rulesetLike", "allowRoot","isRulesetLike","Boolean","MATH","Declaration","name","important","m erge","inline","variable","lastRule","prevMath","evaldValue","mathBypass","evalN ame","importantScope","importantResult","pop","makeImportant","ctx","lineSeparat or","dumpLineNumbers","debugInfo","asComment","asMediaQuery","lineNumber","fileN ame","filenameWithProtocol","test","Comment","isLineComment","getDebugInfo","isS ilent","isCompressed","contexts","copyFromOriginal","original","destination","pr opertiesToCopy","parseCopyProperties","Parse","paths","evalCopyProperties","isPa thRelative","path","isPathLocalRelative","Eval","frames","enterCalc","calcStack" ,"inCalc","exitCalc","inParenthesis","parensStack","outOfParenthesis","mathOn"," isMathOn","pathRequiresRewrite","rewritePath","rootpath","newPath","normalizePat h","segment","segments","reverse","makeRegistry","base","_data","addMultiple","k eys","_this","get","getLocalFunctions","inherit","defaultFunc","value_","error_" ,"reset","Ruleset","selectors","rules","strictImports","_lookups","_variables"," _properties","isRuleset","selCnt","selector","hasVariable","hasOnePassingSelecto r","toParseSelectors","utils.flattenArray","rule","subRule","utils.copyArray","r uleset","originalRuleset","root","firstRoot","allowImports","functionRegistry"," globalFunctionRegistry","ctxFrames","unshift","ctxSelectors","evalImports","rsRu les","evalFirst","mediaBlockCount","mediaBlocks","filter","apply","resetCache"," bubbleSelectors","importRules","matchArgs","matchCondition","lastSelector","_rul esets","variables","hash","vars","name_1","properties","name_2","decl","parseVal ue","property","lastDeclaration","toParse","transformDeclaration","nodes_1","rul esets","filtRules","prependRule","find","foundMixins","ruleNodes","tabLevel","se p","tabRuleStr","tabSetStr","charsetNodeIndex","importNodeIndex","isCharset","pa thCnt","pathSubCnt","currentLastRule","isVisible","joinSelectors","joinSelector" ,"createParenthesis","elementsToPak","originalElement","replacementParen","insid eParent","createSelector","containedElement","element","addReplacementIntoPath", "beginningPath","addPath","replacedElement","originalSelector","newSelectorPath" ,"newJoinedSelector","parentEl","restOfPath","addAllReplacementsIntoPath","addPa ths","mergeElementsOnToSelectors","sel","deriveSelector","deriveFrom","newPaths" ,"replaceParentSelector","inSelector","currentElements","newSelectors","selector sMultiplied","maybeSelector","hadParentSelector","nestedSelector","replaced","ne stedPaths","replacedNewSelectors","concatenated","AtRule","isRooted","outputRule set","mediaPathBackup","mediaBlocksBackup","mediaPath","ruleCnt","DetachedRulese t","callEval","Unit","numerator","denominator","backupUnit","sort","strictUnits" ,"returnStr","is","unitString","toUpperCase","isLength","RegExp","isSingular","c allback","usedUnits","group","mapUnit","groupName","atomicUnit","cancel","counte r","count","Dimension","unit","parseFloat","isNaN","toColor","strValue","String" ,"convertTo","unify","numericCompare","conversions","targetUnit","applyUnit","de rivedConversions","Operation","operands","isSpaced","Expression","noSpacing","re turnValue","parens","doubleParen","parensInOp","throwAwayComments","functionCall er","evalArgs","commentFilter","item","subNodes","to","from","pack","ar","Call", "calc","currentMathContext","funcCaller","FunctionCaller","isValid","columnNumbe r","Variable","evaluating","frame","fun","Property","mergeRules","less","visitor s","ToCSSVisitor","_mergeRules","vArr","Attribute","Quoted","content","escaped", "quote","variableRegex","propRegex","containsVariables","that","iterativeReplace ","regexp","replacementFnc","evaluatedValue","URL","val","isEvald","urlArgs","Me dia","features","evalTop","evalNested","multiMedia","permute","fragment","rest", "Import","css","pathValue","getPath","isPlugin","reference","isVariableImport"," evalForImport","evalPath","doEval","blocksVisibility","addVisibilityBlock","regi stry","skip","importedFilename","newImport","JsEvalNode","evaluateJavaScript","e xpression","evalContext","javascriptEnabled","jsify","toJS","JavaScript","string ","Assignment","Condition","negate","lvalue","rvalue","UnicodeDescriptor","Negat ive","Extend","option","object_id","next_id","parent_ids","allowBefore","allowAf ter","findSelfSelectors","selectorElements","selfElements","selfSelectors","Vari ableCall","detachedRuleset","NamespaceValue","ruleCall","lookups","substring","D efinition","params","variadic","arity","optionalParameters","required","p","eval Params","mixinEnv","evaldArguments","varargs","arg","isNamedFound","argIndex","a rgsLength","evalCall","_arguments","mixinFrames","allArgsCnt","requiredArgsCnt", "MixinCall","mixins","mixin","mixinPath","argValue","f","isRecursive","isOneFoun d","candidate","defaultResult","noArgumentsFilter","candidates","conditionResult ","calcDefGroup","namespace","expand","MixinDefinition","format","newRules","_se tVisibilityToReplacement","replacement","AbstractFileManager","lastIndexOf","ext ","tryAppendExtension","basePath","laterPath","url","baseUrl","urlDirectories"," baseUrlDirectories","urlParts","extractUrlParts","baseUrlParts","diff","hostPart ","directories","urlPartsRegex","returner","rawDirectories","rawPath","fileUrl", "require","AbstractPluginLoader","pluginOptions","pluginObj","localModule","shor tname","FileManager","trySetOptions","use","exports","loader","tree","validatePl ugin","minVersion","compareVersion","addPlugin","plugin","setOptions","version", "versionToString","aVersion","bVersion","versionString","plugins","printUsage"," _visitArgs","visitDeeper","_hasIndexed","_noop","implementation","_implementatio n","_visitInCache","_visitOutCache","indexNodeTypes","ticker","child","typeIndex ","Visitor","nodeTypeIndex","fnName","impl","funcOut","visitArgs","newNode","isR eplacing","cnt","nonReplacing","out","evald","flatten","nestedCnt","nestedItem", "onSequencerEmpty","variableImports","_onSequencerEmpty","_currentDepth","Import Sequencer","importSequencer","importItem","isReady","tryRun","variableImport","I mportVisitor","importer","finish","_visitor","_importer","_finish","importCount" ,"onceFileDetectionMap","recursionDetector","_sequencer","run","isFinished","vis itImport","importNode","inlineCSS","importParent","addVariableImport","processIm portNode","evaldImportNode","multiple","importMultiple","tryAppendLessExtension" ,"onImported","sequencedOnImported","addImport","importedAtRoot","fullPath","imp ortVisitor","isOptional","optional","duplicateImport","oldContext","visitDeclara tion","declNode","visitDeclarationOut","visitAtRule","atRuleNode","visitAtRuleOu t","visitMixinDefinition","mixinDefinitionNode","visitMixinDefinitionOut","visit Ruleset","rulesetNode","visitRulesetOut","visitMedia","mediaNode","visitMediaOut ","visible","SetTreeVisibilityVisitor","ensureVisibility","ensureInvisibility"," allExtendsStack","ExtendFinderVisitor","allExtends","allSelectorsExtendList","ex tendOnEveryPath","selectorPath","selExtendList","allSelectorsExtend","foundExten ds","firstExtendOnThisSelectorPath","ProcessExtendsVisitor","extendFinder","exte ndIndices","doExtendChaining","newRoot","checkExtendsForNonMatched","indices","h asFoundMatches","extendsList","extendsListTarget","iterationCount","extendIndex" ,"targetExtendIndex","matches","targetExtend","newExtend","extendsToAdd","extend Visitor","findMatch","selfSelector","extendSelector","extendChainCount","selecto rOne","selectorTwo","ruleNode","selectorNode","pathIndex","selectorsToAdd","exte ndedSelectors","haystackSelectorPath","haystackSelectorIndex","hackstackSelector ","hackstackElementIndex","haystackElement","targetCombinator","potentialMatch", "needleElements","potentialMatches","matched","initialCombinator","isElementValu esEqual","finished","endPathIndex","endPathElementIndex","elementValue1","elemen tValue2","replacementSelector","matchIndex","firstElement","newElements","curren tSelectorPathIndex","currentSelectorPathElementIndex","currentValue","derived"," newAllExtends","lastIndex","JoinSelectorVisitor","_context","CSSVisitorUtils","b odyRules","owner","thing","originalRules","containsSilentNonBlockedChild","compi ledRulesBody","keepOnlyVisibleChilds","removeVisibilityBlock","hasVisibleSelecto r","utils","mixinNode","visitExtend","extendNode","visitComment","commentNode"," resolveVisibility","visitAtRuleWithBody","visitAtRuleWithoutBody","visitAnonymou s","anonymousNode","nodeRules","hasFakeRuleset","getBodyRules","charset","commen t","checkValidNodes","isRoot","_compileRulesetPaths","nodeRuleCnt","_removeDupli cateRules","isVisibleRuleset","ruleList","ruleCache","ruleCSS","groups","groupsA rr","result_1","space_1","comma_1","MarkVisibleSelectorsVisitor","ExtendVisitor" ,"furthest","furthestPossibleErrorMessage","chunks","current","currentPos","save Stack","parserInput","skipWhitespace","nextChar","oldi","oldj","curr","endIndex" ,"mem","inp","charCodeAt","autoCommentAbsorb","nextNewLine","text","commentStore ","nextStarSlash","save","restore","possibleErrorMessage","state","forget","isWh itespace","offset","pos","code","$re","tok","exec","$char","$str","tokLength","$ quoted","startChar","currentPosition","$parseUntil","testChar","returnVal","inCo mment","blockDepth","blockStack","parseGroups","startPos","lastPos","loop","char ","expected","peek","peekChar","currentChar","prevChar","getInput","peekNotNumer ic","start","chunkInput","failFunction","fail","lastOpening","lastOpeningParen", "lastMultiComment","lastMultiCommentEndBrace","chunkerCurrentIndex","currentChun kStartIndex","cc","cc2","level","parenLevel","emitFrom","emitChunk","force","fro mCharCode","chunker","end","furthestReachedEnd","furthestChar","Parser","parsers ","getParserInput","expect","expectChar","parseList","currentIndex","returnNodes ","parser","additionalData","globalVars","modifyVars","ignored","preText","seria lizeVars","preProcessors","getPreProcessors","process","banner","contentsIgnored Chars","primary","endInfo","processImports","extendRule","definition","declarati on","variableCall","entities","atrule","foundSemiColon","mixinLookup","quoted"," forceEscaped","isEscaped","customFuncCall","stop","ieAlpha","boolean","if","prev Args","isSemiColonSeparated","argsComma","argsSemiColon","assignment","literal", "dimension","unicodeDescriptor","entity","ch","variableCurly","curly","propertyC urly","colorKeyword","ud","javascript","js","escape","parsedName","inValue","rul eLookups","isRule","getLookup","hasParens","elem","elemIndex","re","isCall","exp ressionContainsNamed","nameLoop","expressions","hasSep","cond","argInfo","condit ions","block","lookupValue","attribute","slashedCombinator","isLess","when","blo ckRuleset","hasDR","ruleProperty","permissiveValue","anonymousValue","untilToken s","done","testCurrentChar","import","dir","importOptions","mediaFeatures","o"," optionName","importOption","mediaFeature","pluginArgs","nonVendorSpecificName"," hasIdentifier","hasExpression","hasUnknown","hasBlock","sub","addition","multipl ication","operation","operand","needsParens","logical","next","conditionAnd","ne gatedCondition","parenthesisCondition","atomicCondition","body","me","tryConditi onFollowedByParenthesis","delim","simpleProperty","If","trueValue","falseValue", "isdefined","colorFunctions","hsla","origColor","hsl","number","rgba","size","m1 _1","m2_1","hue","hsv","hsva","vs","floor","perm","saturation","lightness","hsvh ue","hsvsaturation","hsvvalue","luminance","saturate","amount","method","desatur ate","lighten","darken","fadein","fadeout","fade","spin","mix","color1","color2" ,"weight","w","w1","w2","greyscale","contrast","dark","light","threshold","t","a rgb","tint","shade","colorBlend","mode","cb","cs","cr","ab","as","colorBlendMode Functions","multiply","screen","overlay","softlight","sqrt","hardlight","differe nce","abs","exclusion","average","negation","getItemsFromNode","_SELF","~","_i", "expr","values","range","step","stepValue","list","each","rs","iterator","tryEva l","Quote","valueName","keyName","indexName","MathHelper","fn","mathFunctions"," ceil","sin","cos","atan","asin","acos","mathHelper","fraction","num","minMax","i sMin","currentUnified","referenceUnified","unitStatic","unitClone","order","conv ert","pi","mod","y","percentage","evaluated","encodeURI","pattern","flags","%"," token","encodeURIComponent","isa","Type","isunit","isruleset","iscolor","isnumbe r","isstring","iskeyword","isurl","ispixel","ispercentage","isem","get-unit","co lorBlending","fallback","functionThis","data-uri","mimetypeNode","filePathNode", "mimetype","filePath","entryPath","fragmentStart","utils.clone","rawBuffer","get FileManager","useBase64","mimeLookup","charsetLookup","fileSync","loadFileSync", "buf","encodeBase64","uri","dataUri","svg-gradient","direction","stops","gradien tDirectionSvg","position","positionValue","gradientType","rectangleDimension","r enderEnv","directionValue","throwArgumentDescriptor","types","evaldRoot","evalEn v","visitorIterator","preEvalVisitors","first","isPreEvalVisitor","isPreVisitor" ,"pm","postProcessors","installedPlugins","pluginCache","Loader","PluginLoader", "PluginManager","install","preProcessor","priority","indexToInsertAt","postProce ssor","manager","PluginManagerFactory","newFactory","major","minor","patch","pre ","build","sourceMapOutput","sourceMapBuilder","parseTree","importManager","Sour ceMapBuilder","ParseTree","transformTree","toCSSOptions","sourceMap","getPostPro cessors","file","getExternalSourceMap","files","rootFilename","SourceMapOutput", "contentsIgnoredCharsMap","contentsMap","sourceMapFilename","sourceMapURL","outp utFilename","sourceMapOutputFilename","sourceMapBasepath","sourceMapRootpath","o utputSourceFiles","sourceMapGenerator","sourceMapFileInline","disableSourcemapAn notation","sourceMapInputFilename","normalizeFilename","removeBasepath","getCSSA ppendage","_css","_rootNode","_contentsMap","_contentsIgnoredCharsMap","_sourceM apFilename","_outputFilename","_sourceMapBasepath","_sourceMapRootpath","_output SourceFiles","_sourceMapGeneratorConstructor","getSourceMapGenerator","_lineNumb er","_column","sourceLines","columns","sourceColumns","inputSource","_sourceMapG enerator","addMapping","generated","source","sourceRoot","setSourceContent","sou rceMapContent","stringify","toJSON","rootFileInfo","mime","queue","ImportManager ","pluginLoader","fileParsedFunc","importedEqualsRoot","newFileInfo","loadedFile ","promise","loadFileCallback","resolvedFilename","pathDiff","isPathAbsolute","a lwaysMakePathsAbsolute","newEnv","evalPlugin","syncImport","loadPluginSync","loa dPlugin","loadFile","then","render","utils.copyOptions","self_1","Promise","reso lve","reject","Render","context_1","pluginManager_1","reUsePluginManager","impor ts_1","evalResult","fileContent","parseVersion","initial","data","ctor","api","f ileCache","doXHR","errback","xhr","XMLHttpRequest","async","isFileProtocol","fil eAsync","handleResponse","status","responseText","getResponseHeader","overrideMi meType","open","setRequestHeader","send","onreadystatechange","readyState","supp orts","clearFileCache","location","useFileCache","lessText","webInfo","lastModif ied","Date","log","fulfill","catch","rootHref","errorReporting","errors","errorl ine","classname","logLevel","errorConsole","timer","filenameNoPath","className", "innerHTML","browser","style","env","setInterval","replaceChild","clearInterval" ,"errorHTML","remove","removeErrorHTML","depends","lint","insecure","protocol"," poll","hostname","port","onReady","addDefaultOptions","LESS_PLUGINS","lessRoot", "FM","addFileManager","loggers","console","LogListener","ErrorReporting","cache" ,"localStorage","setCSS","setItem","getCSS","getItem","timestamp","valueOf","Cac he","imageSize","imageFunctions","image-size","image-width","image-height","Imag eSize","typePattern","thisArg","curryArgs","loadStyles","instanceOptions","loadS tyleSheet","reload","remaining","local","loadInitialFileCallback","loadStyleShee ts","sheets","watch","watchMode","watchTimer","unwatch","registerStylesheetsImme diately","links","rel","registerStylesheets","record","refresh","startTime","end Time","totalMilliseconds","remainingSheets","refreshStyles","resolveOrReject","p ageLoadFinished"],"mappings":"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 AAW,SAAU1P,GACzC,QAAKpO,KAAK6d,YAGC,MAAPzP,GAAcpO,KAAKqW,OAASC,EAAetD,QAAYhT,KAA K2d,aAAgB3d,KAAK2d,YAAY7e,YAG7FkB,KAAKqW,KAAOC,EAAerD,kBACpBjT,KAAK2d,aAAe3d,KAA K2d,YAAY7e,UAKpD0d,EAASY,KAAKvN,UAAUkO,oBAAsB,SAAUb,GAGpD,OAFmBld,KAAKwW,cAAgBC, EAA8B0G,EAAsBF,GAE1EC,IAGtBV,EAASY,KAAKvN,UAAUmO,YAAc,SAAUd,EAAMe,GAClD,IAAIC,EA aJ,OAXAD,EAAWA,GAAY,GACvBC,EAAUle,KAAKme,cAAcF,EAAWf,GAIpCC,EAAoBD,IACpBD,EAAegB ,KACkB,IAAjCd,EAAoBe,KACpBA,EAAU,KAAKA,GAGZA,GAGX1B,EAASY,KAAKvN,UAAUsO,cAAgB,SA AUjB,GAC9C,IACIkB,EADEC,EAAWnB,EAAK7N,MAAM,KAAKiP,UAIjC,IADApB,EAAO,GACoB,IAApBm B,EAASvf,QAEZ,OADAsf,EAAUC,EAAS9C,OAEf,IAAK,IACD,MACJ,IAAK,KACoB,IAAhB2B,EAAKpe, QAA4C,OAA1Boe,EAAKA,EAAKpe,OAAS,GAC3Coe,EAAK1c,KAAM4d,GAEXlB,EAAK3B,MAET,MACJ,QA CI2B,EAAK1c,KAAK4d,GAKtB,OAAOlB,EAAKnP,KAAK,YCxJrB,SAASwQ,EAAcC,GACnB,MAAO,CACHC ,MAAO,GACP9Q,IAAK,SAASgN,EAAMhD,GAGhBgD,EAAOA,EAAKjJ,cAER1R,KAAKye,MAAMhhB,eAAek d,GAG9B3a,KAAKye,MAAM9D,GAAQhD,GAEvB+G,YAAa,SAASzd,GAAT,WACT2L,OAAO+R,KAAK1d,GAA WoM,SACnB,SAAAsN,GACIiE,EAAKjR,IAAIgN,EAAM1Z,EAAU0Z,QAGrCkE,IAAK,SAASlE,GACV,OAA O3a,KAAKye,MAAM9D,IAAW6D,GAAQA,EAAKK,IAAKlE,IAEnDmE,kBAAmB,WACf,OAAO9e,KAAKye,OA EhBM,QAAS,WACL,OAAOR,EAAcve,OAEzBgY,OAAQ,SAASwG,GACb,OAAOD,EAAaC,KAKjBD,CAAc,MCh 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 X,cAAKrE,GACD,IAA4EY,EAAxEC,EAAIrO,KAAK+oB,SAAS,GAAGlX,KAAKrE,GAAUc,EAAItO,KAAK+ oB,SAAS,GAAGlX,KAAKrE,GAElE,GAAIA,EAAQsQ,SAAS9d,KAAKoO,IAAK,CAQ3B,GAPAA,EAAiB,OA AZpO,KAAKoO,GAAc,IAAMpO,KAAKoO,GAC/BC,aAAa2Z,IAAa1Z,aAAaM,IACvCP,EAAIA,EAAE+Z,WA EN9Z,aAAa0Z,IAAa3Z,aAAaO,IACvCN,EAAIA,EAAE8Z,YAEL/Z,EAAE2C,UAAY1C,EAAE0C,QAAS,CA C1B,IACK3C,aAAaya,IAAaxa,aAAawa,KAC5B,MAATza,EAAED,IAAcZ,EAAQ6I,OAASoE,GAAKxH,gB AEzC,OAAO,IAAI6V,GAAU9oB,KAAKoO,GAAI,CAACC,EAAGC,GAAItO,KAAKgpB,UAE/C,KAAM,CAAEp oB,KAAM,YACVqW,QAAS,gCAGjB,OAAO5I,EAAE2C,QAAQxD,EAASY,EAAIE,GAE9B,OAAO,IAAIwa,GA AU9oB,KAAKoO,GAAI,CAACC,EAAGC,GAAItO,KAAKgpB,WAInDtb,gBAAOF,EAASQ,GACZhO,KAAK+oB ,SAAS,GAAGrb,OAAOF,EAASQ,GAC7BhO,KAAKgpB,UACLhb,EAAOL,IAAI,KAEfK,EAAOL,IAAI3N,KA AKoO,IACZpO,KAAKgpB,UACLhb,EAAOL,IAAI,KAEf3N,KAAK+oB,SAAS,GAAGrb,OAAOF,EAASQ,MCl DzC,IAAMib,GAAa,SAAShb,EAAOib,GAG/B,GAFAlpB,KAAKiO,MAAQA,EACbjO,KAAKkpB,UAAYA,GA CZjb,EACD,MAAM,IAAIvO,MAAM,2CAIxBupB,GAAWpZ,UAAYjD,OAAOkD,OAAO,IAAIjD,EAAQ,CAC7C jM,KAAM,aAENgS,gBAAO1E,GACHlO,KAAKiO,MAAQC,EAAQ2K,WAAW7Y,KAAKiO,QAGzC4D,cAAKrE,G ACD,IAAI2b,EACEtL,EAASrQ,EAAQsQ,WACjBJ,EAAgB1d,KAAKopB,OAEvBC,GAAc,EA0BlB,OAzBI3 L,GACAlQ,EAAQkQ,gBAER1d,KAAKiO,MAAMnP,OAAS,EACpBqqB,EAAc,IAAIF,GAAWjpB,KAAKiO,MA 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 EAAQ6P,OAAO,IAAM7P,EAAQ6P,OAAO,GAAGqD,mBACjC1gB,KAAKugB,MAAQvgB,KAAKugB,KAAKtf,W ACpCusB,EAAS9O,YAAa1e,KAAKugB,KAAKtf,WAG7B,GAGX,GAAIjB,KAAKytB,OACoB,mBAAdztB,KA AKytB,OACZztB,KAAKytB,KAAOztB,KAAKytB,QAEjBztB,KAAKytB,MACL,MAAO,GAGf,GAAIztB,KA AK3C,QAAQyd,OAAQ,CACrB,IAAM1D,EAAW,IAAI+C,EAAUna,KAAKugB,KAAM,EACtC,CACIhf,SAAUv B,KAAK0tB,iBACfT,UAAWjtB,KAAKkd,KAAK3P,WAAavN,KAAKkd,KAAK3P,UAAU0f,YACvD,GAAM,GA Eb,OAAOjtB,KAAKqsB,SAAW,IAAID,GAAM,CAAChV,GAAWpX,KAAKqsB,SAASpe,OAAS,CAACmJ,GACl E,GAAIpX,KAAK6sB,IAAK,CACjB,IAAMc,EAAY,IAAIf,GAAO5sB,KAAKotB,SAAS5f,GAAU6e,EAAUr sB,KAAK3C,QAAS2C,KAAKsN,QAClF,IAAKqgB,EAAUd,KAAO7sB,KAAKF,MACvB,MAAME,KAAKF,MAEf ,OAAO6tB,EACJ,OAAI3tB,KAAKugB,OACZF,EAAU,IAAIjB,EAAQ,KAAMgB,EAAgBpgB,KAAKugB,KAA KjB,SAC9CyB,YAAYvT,GAEbxN,KAAKqsB,SAAW,IAAID,GAAM/L,EAAQf,MAAOtf,KAAKqsB,SAASpe, OAASoS,EAAQf,OAExE,MChLnB,IAAMsO,GAAa,aAEnBA,GAAW/d,UAAYjD,OAAOkD,OAAO,IAAIjD,EA AQ,CAC7CghB,4BAAmBC,EAAYtgB,GAC3B,IAAImJ,EACEgV,EAAO3rB,KACP+tB,EAAc,GAEpB,IAAKv gB,EAAQwgB,kBACT,KAAM,CAAE/W,QAAS,+DACb1V,SAAUvB,KAAK8M,WAAWvL,SAC1BsM,MAAO7N,KA AK+M,YAGpB+gB,EAAaA,EAAW3wB,QAAQ,kBAAkB,SAAUS,EAAG+c,GAC3D,OAAOgR,EAAKsC,MAAM,IA AIzD,GAAS,IAAI7P,EAAQgR,EAAK5e,WAAY4e,EAAK7e,YAAY+E,KAAKrE,OAGtF,IACIsgB,EAAa,IA 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 gB,KAAKwN,QAAQ6P,SACvEmb,EAAehrB,EAAQ6P,OAAO,GAEpCrd,KAAK+3B,cACDO,EAAWpL,mBACXl tB,KAAKk4B,WAAWO,kBAAkBz4B,KAAK04B,kBAAkBr3B,KAAKrB,KAAMs4B,EAAY9qB,EAASgrB,IAEz Fx4B,KAAK04B,kBAAkBJ,EAAY9qB,EAASgrB,GAGpDnC,EAAUhB,aAAc,GAE5BqD,kBAAmB,SAASJ,EA AY9qB,EAASgrB,GAC7C,IAAIG,EACEJ,EAAYD,EAAWj7B,QAAQyd,OAErC,IACI6d,EAAkBL,EAAWnL, cAAc3f,GAC7C,MAAO/N,GACAA,EAAE8B,WAAY9B,EAAEoO,MAAQyqB,EAAWvrB,WAAYtN,EAAE8B,SAA W+2B,EAAWxrB,WAAWvL,UAEvF+2B,EAAWzL,KAAM,EAEjByL,EAAWx4B,MAAQL,EAGvB,IAAIk5B,GAA qBA,EAAgB9L,MAAO0L,EAqB5Cv4B,KAAK+3B,cACD/3B,KAAKo4B,YACLp4B,KAAKk4B,WAAWX,aAvBo C,CAEpDoB,EAAgBt7B,QAAQu7B,WACxBprB,EAAQqrB,gBAAiB,GAM7B,IAFA,IAAMC,OAAiDtsB,IAA xBmsB,EAAgB9L,IAEtCnsB,EAAI,EAAGA,EAAI83B,EAAalZ,MAAMxgB,OAAQ4B,IAC3C,GAAI83B,EA AalZ,MAAM5e,KAAO43B,EAAY,CACtCE,EAAalZ,MAAM5e,GAAKi4B,EACxB,MAIR,IAAMI,EAAa/4B,K AAK+4B,WAAW13B,KAAKrB,KAAM24B,EAAiBnrB,GAAUwrB,EAAsBh5B,KAAKk4B,WAAWe,UAAUF,GAEz H/4B,KAAK63B,UAAUr3B,KAAKm4B,EAAgB5L,UAAW+L,EAAwBH,EAAgB7rB,WACnF6rB,EAAgBt7B,QA AS27B,KAQrCD,WAAY,SAAUT,EAAY9qB,EAAS/N,EAAG8gB,EAAM2Y,EAAgBC,GAC5D15B,IACKA,EAAE 8B,WACH9B,EAAEoO,MAAQyqB,EAAWvrB,WAAYtN,EAAE8B,SAAW+2B,EAAWxrB,WAAWvL,UAExEvB,KA AKF,MAAQL,GAGjB,IAAM25B,EAAgBp5B,KAClBu4B,EAAYD,EAAWj7B,QAAQyd,OAC/BkS,EAAWsL,EA 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 HujB,EAAYJ,EAAGnjB,OAAO,IAAMmjB,EAAGnjB,OAAO,GAAGnV,KACzC24B,EAAUL,EAAGnjB,OAAO, IAAMmjB,EAAGnjB,OAAO,GAAGnV,KACvC44B,EAAYN,EAAGnjB,OAAO,IAAMmjB,EAAGnjB,OAAO,GAA GnV,KACzCs4B,EAAKA,EAAG3zB,OAER2zB,EAAKA,EAAG5yB,QAGZ,IAAK,IAAI3f,EAAI,EAAGA,EAA IwyC,EAASp0C,OAAQ4B,IAAK,CACtC,IAAI+Q,SACAxD,SACE0b,EAAOupB,EAASxyC,GAClBipB,aAA gBjP,GAChBjJ,EAA2B,iBAAdkY,EAAKhP,KAAoBgP,EAAKhP,KAAOgP,EAAKhP,KAAK,GAAG1M,MAC/D A,EAAQ0b,EAAK1b,QAEbwD,EAAM,IAAIuW,GAAUtnB,EAAI,GACxBuN,EAAQ0b,GAGRA,aAAgBxN,IAI pBgW,EAAW8gB,EAAG3zB,MAAM3N,MAAM,GACtB0hC,GACAlhB,EAAS3xB,KAAK,IAAIka,EAAY24B,EA C1BplC,GACA,GAAO,EAAOjO,KAAK6N,MAAO7N,KAAKwS,kBAEnC+gC,GACAphB,EAAS3xB,KAAK,IAAI ka,EAAY64B,EAC1B,IAAIvrB,GAAUtnB,EAAI,IAClB,GAAO,EAAOV,KAAK6N,MAAO7N,KAAKwS,kBAE nC8gC,GACAnhB,EAAS3xB,KAAK,IAAIka,EAAY44B,EAC1B7hC,GACA,GAAO,EAAOzR,KAAK6N,MAAO7 N,KAAKwS,kBAGvC8M,EAAM9e,KAAK,IAAI4e,EAAQ,CAAE,MAAc,CAAE,IAAI/M,EAAQ,GAAI,QACrD8 f,EACA8gB,EAAG1zB,cACH0zB,EAAGxgC,oBAIX,OAAO,IAAI2M,EAAQ,CAAE,MAAc,CAAE,IAAI/M,E AAQ,GAAI,QACjDiN,EACA2zB,EAAG1zB,cACH0zB,EAAGxgC,kBACLZ,KAAK7R,KAAKwN,WCzJdgmC,G AAa,SAACC,EAAIxrB,EAAM7S,GAC1B,KAAMA,aAAa4S,IACf,KAAM,CAAEpnB,KAAM,WAAYqW,QAAS,6 BAOvC,OALY,MAARgR,EACAA,EAAO7S,EAAE6S,KAET7S,EAAIA,EAAEoT,QAEH,IAAIR,GAAUyrB,EAA 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 pjD,EAAQojD,YAAa,EAGzCpjD,EAAQkmD,KAAOlmD,EAAQkmD,OAASlmD,EAAQmjD,eAAiB,IAAO,MAE hEnjD,EAAQulD,IAAMvlD,EAAQulD,MAAoC,aAA5BjjD,EAAO2hD,SAASkC,UACd,WAA5B7jD,EAAO2h D,SAASkC,UACY,aAA5B7jD,EAAO2hD,SAASkC,UACf7jD,EAAO2hD,SAASmC,MACb9jD,EAAO2hD,SAA SmC,KAAK3kD,OAAS,GAClCzB,EAAQmjD,eAAmC,cACzC,cAEN,IAAM7kC,EAAkB,6CAA6C+nB,KAAK/j C,EAAO2hD,SAASx/B,MACtFnG,IACAte,EAAQse,gBAAkBA,EAAgB,SAGjBnP,IAAzBnP,EAAQkkD,eA CRlkD,EAAQkkD,cAAe,QAGH/0C,IAApBnP,EAAQqmD,UACRrmD,EAAQqmD,SAAU,GAGlBrmD,EAAQkZ, eACRlZ,EAAQmZ,YAAc,OF1B9BmtC,CAAkBhkD,OAAQtC,IAE1BA,GAAQ63B,QAAU73B,GAAQ63B,SAAW ,GAEjCv1B,OAAOikD,eACPvmD,GAAQ63B,QAAU73B,GAAQ63B,QAAQh0B,OAAOvB,OAAOikD,mBAQhD/ 2B,GACA5tB,GACA0jD,GAPE73B,YGdUnrB,EAAQtC,GACpB,IAAMQ,EAAW8B,EAAO9B,SAClBitB,EAA O+4B,KAEb/4B,EAAKztB,QAAUA,EACf,IAAMoE,EAAcqpB,EAAKrpB,YACnBwyB,EAAc6vB,GAAGzmD, EAASytB,EAAKnpB,QAC/BG,EAAc,IAAImyB,EACxBxyB,EAAYsiD,eAAejiD,GAC3BgpB,EAAKmJ,YAA cA,EACnBnJ,EAAKouB,aAAeA,YCxBRpuB,EAAMztB,GAYlBA,EAAQ+kD,cAAuC,IAArB/kD,EAAQ+kD, SAA2B/kD,EAAQ+kD,SAA4B,gBAAhB/kD,EAAQulD,IAVnE,EAEC,EAUlBvlD,EAAQ2mD,UACT3mD,EAA Q2mD,QAAU,CAAC,CACf5jD,MAAO,SAASL,GACR1C,EAAQ+kD,UAhBD,GAiBP6B,QAAQrC,IAAI7hD,IA GpBI,KAAM,SAASJ,GACP1C,EAAQ+kD,UApBF,GAqBN6B,QAAQrC,IAAI7hD,IAGpBG,KAAM,SAASH,GA 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 AAK+H,GAAiBA"} {"version":3,"file":"less.min.js","sources":["../src/less-browser/utils.js","../ src/less-browser/browser.js","../src/less/logger.js","../src/less/environment/en vironment.js","../src/less/data/colors.js","../src/less/data/unit-conversions.js ","../src/less/data/index.js","../src/less/tree/node.js","../src/less/tree/color .js","../src/less/tree/paren.js","../src/less/tree/combinator.js","../src/less/t ree/element.js","../src/less/constants.js","../node_modules/is-what/dist/index.e sm.js","../node_modules/copy-anything/dist/index.esm.js","../src/less/utils.js", "../src/less/less-error.js","../src/less/tree/selector.js","../src/less/tree/val ue.js","../src/less/tree/keyword.js","../src/less/tree/anonymous.js","../src/les s/tree/declaration.js","../src/less/tree/debug-info.js","../src/less/tree/commen t.js","../src/less/contexts.js","../src/less/functions/function-registry.js",".. /src/less/functions/default.js","../src/less/tree/ruleset.js","../src/less/tree/ atrule.js","../src/less/tree/detached-ruleset.js","../src/less/tree/unit.js",".. /src/less/tree/dimension.js","../src/less/tree/operation.js","../src/less/tree/e xpression.js","../src/less/functions/function-caller.js","../node_modules/tslib/ tslib.es6.js","../src/less/tree/call.js","../src/less/tree/variable.js","../src/ less/tree/property.js","../src/less/tree/attribute.js","../src/less/tree/quoted. js","../src/less/tree/url.js","../src/less/tree/media.js","../src/less/tree/impo rt.js","../src/less/tree/js-eval-node.js","../src/less/tree/javascript.js","../s rc/less/tree/assignment.js","../src/less/tree/condition.js","../src/less/tree/un icode-descriptor.js","../src/less/tree/negative.js","../src/less/tree/extend.js" ,"../src/less/tree/variable-call.js","../src/less/tree/namespace-value.js","../s rc/less/tree/mixin-definition.js","../src/less/tree/mixin-call.js","../src/less/ tree/index.js","../src/less/environment/abstract-file-manager.js","../src/less/e nvironment/abstract-plugin-loader.js","../src/less/visitors/visitor.js","../src/ less/visitors/import-sequencer.js","../src/less/visitors/import-visitor.js","../ src/less/visitors/set-tree-visibility-visitor.js","../src/less/visitors/extend-v isitor.js","../src/less/visitors/join-selector-visitor.js","../src/less/visitors /to-css-visitor.js","../src/less/visitors/index.js","../src/less/parser/parser-i nput.js","../src/less/parser/chunker.js","../src/less/parser/parser.js","../src/ less/functions/boolean.js","../src/less/functions/color.js","../src/less/functio ns/color-blending.js","../src/less/functions/list.js","../src/less/functions/mat h-helper.js","../src/less/functions/math.js","../src/less/functions/number.js"," ../src/less/functions/string.js","../src/less/functions/types.js","../src/less/f unctions/index.js","../src/less/functions/data-uri.js","../src/less/functions/sv g.js","../src/less/transform-tree.js","../src/less/plugin-manager.js","../node_m odules/parse-node-version/index.js","../src/less-browser/file-manager.js","../sr c/less/index.js","../src/less/parse-tree.js","../src/less/source-map-builder.js" ,"../src/less/source-map-output.js","../src/less/import-manager.js","../src/less /render.js","../src/less/parse.js","../src/less-browser/plugin-loader.js","../sr c/less-browser/error-reporting.js","../src/less-browser/bootstrap.js","../src/le ss/default-options.js","../src/less-browser/add-default-options.js","../src/less -browser/index.js","../src/less-browser/log-listener.js","../src/less-browser/ca che.js","../src/less-browser/image-size.js"],"sourcesContent":["\nexport functio n extractId(href) {\n return href.replace(/^[a-z-]+:\\/+?[^\\/]+/, '') // Re move protocol & domain\n .replace(/[\\?\\&]livereload=\\w+/, '') / / Remove LiveReload cachebuster\n .replace(/^\\//, '') // Remove root /\n .replace(/\\.[a-zA-Z]+$/, '') // Remove simple extension\n .replace(/[^\\.\\w-]+/g, '-') / / Replace illegal characters\n .replace(/\\./g, ':'); // Replace dots with colons(for valid id)\n}\n\nexport function addDataAttr(o ptions, tag) {\n if (!tag) {return;} // in case of tag is null or undefined\n for (const opt in tag.dataset) {\n if (tag.dataset.hasOwnProperty(opt )) {\n if (opt === 'env' || opt === 'dumpLineNumbers' || opt === 'roo tpath' || opt === 'errorReporting') {\n options[opt] = tag.datase t[opt];\n } else {\n try {\n option s[opt] = JSON.parse(tag.dataset[opt]);\n }\n catch (_) {}\n }\n }\n }\n}\n","import * as utils from './utils' ;\n\nexport default {\n createCSS: function (document, styles, sheet) {\n // Strip the query-string\n const href = sheet.href || '';\n\n // If there is no title set, use the filename, minus the extension\n con st id = `less:${sheet.title || utils.extractId(href)}`;\n\n // If this ha s already been inserted into the DOM, we may need to replace it\n const o ldStyleNode = document.getElementById(id);\n let keepOldStyleNode = false ;\n\n // Create a new stylesheet node for insertion or (if necessary) rep lacement\n const styleNode = document.createElement('style');\n st yleNode.setAttribute('type', 'text/css');\n if (sheet.media) {\n styleNode.setAttribute('media', sheet.media);\n }\n styleNode.i d = id;\n\n if (!styleNode.styleSheet) {\n styleNode.appendChi ld(document.createTextNode(styles));\n\n // If new contents match con tents of oldStyleNode, don't replace oldStyleNode\n keepOldStyleNode = (oldStyleNode !== null && oldStyleNode.childNodes.length > 0 && styleNode.chil dNodes.length > 0 &&\n oldStyleNode.firstChild.nodeValue === styl eNode.firstChild.nodeValue);\n }\n\n const head = document.getElem entsByTagName('head')[0];\n\n // If there is no oldStyleNode, just append ; otherwise, only append if we need\n // to replace oldStyleNode with an updated stylesheet\n if (oldStyleNode === null || keepOldStyleNode === fa lse) {\n const nextEl = sheet && sheet.nextSibling || null;\n if (nextEl) {\n nextEl.parentNode.insertBefore(styleNode, nex tEl);\n } else {\n head.appendChild(styleNode);\n }\n }\n if (oldStyleNode && keepOldStyleNode === false) {\n oldStyleNode.parentNode.removeChild(oldStyleNode);\n }\n\n // For IE.\n // This needs to happen *after* the style element is ad ded to the DOM, otherwise IE 7 and 8 may crash.\n // See http://social.ms dn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-expl orer-crashes-appending-style-element-to-head\n if (styleNode.styleSheet) {\n try {\n styleNode.styleSheet.cssText = styles;\n } catch (e) {\n throw new Error('Couldn\\'t reassign st yleSheet.cssText.');\n }\n }\n },\n currentScript: funct ion(window) {\n const document = window.document;\n return documen t.currentScript || (() => {\n const scripts = document.getElementsByT agName('script');\n return scripts[scripts.length - 1];\n })() ;\n }\n};\n","export default {\n error: function(msg) {\n this._fir eEvent('error', msg);\n },\n warn: function(msg) {\n this._fireEven t('warn', msg);\n },\n info: function(msg) {\n this._fireEvent('inf o', msg);\n },\n debug: function(msg) {\n this._fireEvent('debug', msg);\n },\n addListener: function(listener) {\n this._listeners.pu sh(listener);\n },\n removeListener: function(listener) {\n for (le t i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n },\n _fireEvent: function(type, msg) { \n for (let i = 0; i < this._listeners.length; i++) {\n const logFunction = this._listeners[i][type];\n if (logFunction) {\n logFunction(msg);\n }\n }\n },\n _listeners: [] \n};\n","/**\n * @todo Document why this abstraction exists, and the relationshi p between\n * environment, file managers, and plugin manager\n */\n\nimpor t logger from '../logger';\n\nclass Environment {\n constructor(externalEnvir onment, fileManagers) {\n this.fileManagers = fileManagers || [];\n externalEnvironment = externalEnvironment || {};\n\n const optionalFunc tions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'] ;\n const requiredFunctions = [];\n const functions = requiredFunc tions.concat(optionalFunctions);\n\n for (let i = 0; i < functions.length ; i++) {\n const propName = functions[i];\n const environm entFunc = externalEnvironment[propName];\n if (environmentFunc) {\n this[propName] = environmentFunc.bind(externalEnvironment);\n } else if (i < requiredFunctions.length) {\n this.warn(`mi ssing required function in environment - ${propName}`);\n }\n }\n }\n\n getFileManager(filename, currentDirectory, options, environment, isSync) {\n\n if (!filename) {\n logger.warn('getFileManager called with no filename.. Please report this issue. continuing.');\n }\n if (currentDirectory == null) {\n logger.warn('getFileManager called with null directory.. Please report this issue. continuing.');\n } \n\n let fileManagers = this.fileManagers;\n if (options.pluginMan ager) {\n fileManagers = [].concat(fileManagers).concat(options.plugi nManager.getFileManagers());\n }\n for (let i = fileManagers.lengt h - 1; i >= 0 ; i--) {\n const fileManager = fileManagers[i];\n if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDir ectory, options, environment)) {\n return fileManager;\n }\n }\n return null;\n }\n\n addFileManager(fileManager) {\n this.fileManagers.push(fileManager);\n }\n\n clearFileManagers( ) {\n this.fileManagers = [];\n }\n}\n\nexport default Environment;\n" ,"export default {\n 'aliceblue':'#f0f8ff',\n 'antiquewhite':'#faebd7',\n 'aqua':'#00ffff',\n 'aquamarine':'#7fffd4',\n 'azure':'#f0ffff',\n ' beige':'#f5f5dc',\n 'bisque':'#ffe4c4',\n 'black':'#000000',\n 'blanche dalmond':'#ffebcd',\n 'blue':'#0000ff',\n 'blueviolet':'#8a2be2',\n 'br own':'#a52a2a',\n 'burlywood':'#deb887',\n 'cadetblue':'#5f9ea0',\n 'ch artreuse':'#7fff00',\n 'chocolate':'#d2691e',\n 'coral':'#ff7f50',\n 'c ornflowerblue':'#6495ed',\n 'cornsilk':'#fff8dc',\n 'crimson':'#dc143c',\n 'cyan':'#00ffff',\n 'darkblue':'#00008b',\n 'darkcyan':'#008b8b',\n 'darkgoldenrod':'#b8860b',\n 'darkgray':'#a9a9a9',\n 'darkgrey':'#a9a9a9' ,\n 'darkgreen':'#006400',\n 'darkkhaki':'#bdb76b',\n 'darkmagenta':'#8 b008b',\n 'darkolivegreen':'#556b2f',\n 'darkorange':'#ff8c00',\n 'dark orchid':'#9932cc',\n 'darkred':'#8b0000',\n 'darksalmon':'#e9967a',\n ' darkseagreen':'#8fbc8f',\n 'darkslateblue':'#483d8b',\n 'darkslategray':'# 2f4f4f',\n 'darkslategrey':'#2f4f4f',\n 'darkturquoise':'#00ced1',\n 'd arkviolet':'#9400d3',\n 'deeppink':'#ff1493',\n 'deepskyblue':'#00bfff',\n 'dimgray':'#696969',\n 'dimgrey':'#696969',\n 'dodgerblue':'#1e90ff',\ n 'firebrick':'#b22222',\n 'floralwhite':'#fffaf0',\n 'forestgreen':'#2 28b22',\n 'fuchsia':'#ff00ff',\n 'gainsboro':'#dcdcdc',\n 'ghostwhite': '#f8f8ff',\n 'gold':'#ffd700',\n 'goldenrod':'#daa520',\n 'gray':'#8080 80',\n 'grey':'#808080',\n 'green':'#008000',\n 'greenyellow':'#adff2f' ,\n 'honeydew':'#f0fff0',\n 'hotpink':'#ff69b4',\n 'indianred':'#cd5c5c ',\n 'indigo':'#4b0082',\n 'ivory':'#fffff0',\n 'khaki':'#f0e68c',\n 'lavender':'#e6e6fa',\n 'lavenderblush':'#fff0f5',\n 'lawngreen':'#7cfc00 ',\n 'lemonchiffon':'#fffacd',\n 'lightblue':'#add8e6',\n 'lightcoral': '#f08080',\n 'lightcyan':'#e0ffff',\n 'lightgoldenrodyellow':'#fafad2',\n 'lightgray':'#d3d3d3',\n 'lightgrey':'#d3d3d3',\n 'lightgreen':'#90ee90 ',\n 'lightpink':'#ffb6c1',\n 'lightsalmon':'#ffa07a',\n 'lightseagreen ':'#20b2aa',\n 'lightskyblue':'#87cefa',\n 'lightslategray':'#778899',\n 'lightslategrey':'#778899',\n 'lightsteelblue':'#b0c4de',\n 'lightyellow ':'#ffffe0',\n 'lime':'#00ff00',\n 'limegreen':'#32cd32',\n 'linen':'#f af0e6',\n 'magenta':'#ff00ff',\n 'maroon':'#800000',\n 'mediumaquamarin e':'#66cdaa',\n 'mediumblue':'#0000cd',\n 'mediumorchid':'#ba55d3',\n ' mediumpurple':'#9370d8',\n 'mediumseagreen':'#3cb371',\n 'mediumslateblue' :'#7b68ee',\n 'mediumspringgreen':'#00fa9a',\n 'mediumturquoise':'#48d1cc' ,\n 'mediumvioletred':'#c71585',\n 'midnightblue':'#191970',\n 'mintcre am':'#f5fffa',\n 'mistyrose':'#ffe4e1',\n 'moccasin':'#ffe4b5',\n 'nava jowhite':'#ffdead',\n 'navy':'#000080',\n 'oldlace':'#fdf5e6',\n 'olive ':'#808000',\n 'olivedrab':'#6b8e23',\n 'orange':'#ffa500',\n 'orangere d':'#ff4500',\n 'orchid':'#da70d6',\n 'palegoldenrod':'#eee8aa',\n 'pal egreen':'#98fb98',\n 'paleturquoise':'#afeeee',\n 'palevioletred':'#d87093 ',\n 'papayawhip':'#ffefd5',\n 'peachpuff':'#ffdab9',\n 'peru':'#cd853f ',\n 'pink':'#ffc0cb',\n 'plum':'#dda0dd',\n 'powderblue':'#b0e0e6',\n 'purple':'#800080',\n 'rebeccapurple':'#663399',\n 'red':'#ff0000',\n 'rosybrown':'#bc8f8f',\n 'royalblue':'#4169e1',\n 'saddlebrown':'#8b4513 ',\n 'salmon':'#fa8072',\n 'sandybrown':'#f4a460',\n 'seagreen':'#2e8b5 7',\n 'seashell':'#fff5ee',\n 'sienna':'#a0522d',\n 'silver':'#c0c0c0', \n 'skyblue':'#87ceeb',\n 'slateblue':'#6a5acd',\n 'slategray':'#708090 ',\n 'slategrey':'#708090',\n 'snow':'#fffafa',\n 'springgreen':'#00ff7 f',\n 'steelblue':'#4682b4',\n 'tan':'#d2b48c',\n 'teal':'#008080',\n 'thistle':'#d8bfd8',\n 'tomato':'#ff6347',\n 'turquoise':'#40e0d0',\n 'violet':'#ee82ee',\n 'wheat':'#f5deb3',\n 'white':'#ffffff',\n 'white smoke':'#f5f5f5',\n 'yellow':'#ffff00',\n 'yellowgreen':'#9acd32'\n};","ex port default {\n length: {\n 'm': 1,\n 'cm': 0.01,\n 'mm ': 0.001,\n 'in': 0.0254,\n 'px': 0.0254 / 96,\n 'pt': 0.02 54 / 72,\n 'pc': 0.0254 / 72 * 12\n },\n duration: {\n 's': 1,\n 'ms': 0.001\n },\n angle: {\n 'rad': 1 / (2 * Math.PI), \n 'deg': 1 / 360,\n 'grad': 1 / 400,\n 'turn': 1\n }\n} ;","import colors from './colors';\nimport unitConversions from './unit-conversi ons';\n\nexport default { colors, unitConversions };\n","/**\n * The reason why Node is a class and other nodes simply do not extend\n * from Node (since we're transpiling) is due to this issue:\n * \n * https://github.com/less/less.js/issu es/3434\n */\nclass Node {\n constructor() {\n this.parent = null;\n this.visibilityBlocks = undefined;\n this.nodeVisible = undefined;\ n this.rootNode = null;\n this.parsed = null;\n }\n\n get cu rrentFileInfo() {\n return this.fileInfo();\n }\n\n get index() {\n return this.getIndex();\n }\n\n setParent(nodes, parent) {\n function set(node) {\n if (node && node instanceof Node) {\n node.parent = parent;\n }\n }\n if (Array.isAr ray(nodes)) {\n nodes.forEach(set);\n }\n else {\n set(nodes);\n }\n }\n\n getIndex() {\n return this._i ndex || (this.parent && this.parent.getIndex()) || 0;\n }\n\n fileInfo() { \n return this._fileInfo || (this.parent && this.parent.fileInfo()) || {} ;\n }\n\n isRulesetLike() { return false; }\n\n toCSS(context) {\n const strs = [];\n this.genCSS(context, {\n add: function(c hunk, fileInfo, index) {\n strs.push(chunk);\n },\n isEmpty: function () {\n return strs.length === 0;\n }\n });\n return strs.join('');\n }\n\n genCSS(conte xt, output) {\n output.add(this.value);\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval() { return th is; }\n\n _operate(context, op, a, b) {\n switch (op) {\n c ase '+': return a + b;\n case '-': return a - b;\n case '* ': return a * b;\n case '/': return a / b;\n }\n }\n\n f round(context, value) {\n const precision = context && context.numPrecisi on;\n // add \"epsilon\" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:\n return (precision) ? Number ((value + 2e-16).toFixed(precision)) : value;\n }\n\n static compare(a, b) {\n /* returns:\n -1: a < b\n 0: a = b\n 1: a > b\n and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */\n \n if ((a.compare) &&\n // for \"symmetric results\" force toC SS-based comparison\n // of Quoted or Anonymous if either value is on e of those\n !(b.type === 'Quoted' || b.type === 'Anonymous')) {\n return a.compare(b);\n } else if (b.compare) {\n retu rn -b.compare(a);\n } else if (a.type !== b.type) {\n return u ndefined;\n }\n\n a = a.value;\n b = b.value;\n if ( !Array.isArray(a)) {\n return a === b ? 0 : undefined;\n }\n if (a.length !== b.length) {\n return undefined;\n }\n for (let i = 0; i < a.length; i++) {\n if (Node.compare(a[i], b [i]) !== 0) {\n return undefined;\n }\n }\n return 0;\n }\n\n static numericCompare(a, b) {\n return a < b ? -1\n : a === b ? 0\n : a > b ? 1 : undefined;\ n }\n\n // Returns true if this node represents root of ast imported by re ference\n blocksVisibility() {\n if (this.visibilityBlocks == null) {\ n this.visibilityBlocks = 0;\n }\n return this.visibili tyBlocks !== 0;\n }\n\n addVisibilityBlock() {\n if (this.visibilit yBlocks == null) {\n this.visibilityBlocks = 0;\n }\n t his.visibilityBlocks = this.visibilityBlocks + 1;\n }\n\n removeVisibility Block() {\n if (this.visibilityBlocks == null) {\n this.visibi lityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlock s - 1;\n }\n\n // Turns on node visibility - if called node will be shown in output regardless\n // of whether it comes from import by reference or not \n ensureVisibility() {\n this.nodeVisible = true;\n }\n\n // Tu rns off node visibility - if called node will NOT be shown in output regardless\ n // of whether it comes from import by reference or not\n ensureInvisibil ity() {\n this.nodeVisible = false;\n }\n\n // return values:\n // false - the node must not be visible\n // true - the node must be visible\ n // undefined or null - the node has the same visibility as its parent\n isVisible() {\n return this.nodeVisible;\n }\n\n visibilityInfo() { \n return {\n visibilityBlocks: this.visibilityBlocks,\n nodeVisible: this.nodeVisible\n };\n }\n\n copyVisibilityInfo (info) {\n if (!info) {\n return;\n }\n this.vis ibilityBlocks = info.visibilityBlocks;\n this.nodeVisible = info.nodeVisi ble;\n }\n}\n\nexport default Node;\n","import Node from './node';\nimport co lors from '../data/colors';\n\n//\n// RGB Colors - #ff0014, #eee\n//\nconst Colo r = function(rgb, a, originalForm) {\n const self = this;\n //\n // The end goal here, is to parse the arguments\n // into an integer triplet, such as `128, 255, 0`\n //\n // This facilitates operations and conversions.\n //\n if (Array.isArray(rgb)) {\n this.rgb = rgb;\n } else if (rg b.length >= 6) {\n this.rgb = [];\n rgb.match(/.{2}/g).map(functio n (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c, 16));\n } else {\n self.alpha = (parseInt(c, 16)) / 25 5;\n }\n });\n } else {\n this.rgb = [];\n rg b.split('').map(function (c, i) {\n if (i < 3) {\n sel f.rgb.push(parseInt(c + c, 16));\n } else {\n self.alp ha = (parseInt(c + c, 16)) / 255;\n }\n });\n }\n this.a lpha = this.alpha || (typeof a === 'number' ? a : 1);\n if (typeof originalFo rm !== 'undefined') {\n this.value = originalForm;\n }\n}\n\nColor.pro totype = Object.assign(new Node(), {\n type: 'Color',\n\n luma() {\n let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255;\n\n r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);\n g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);\n b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n },\n\n genCSS(conte xt, output) {\n output.add(this.toCSS(context));\n },\n\n toCSS(con text, doNotCompress) {\n const compress = context && context.compress && !doNotCompress;\n let color;\n let alpha;\n let colorFuncti on;\n let args = [];\n\n // `value` is set if this color was origi nally\n // converted from a named color string so we need\n // to respect this and try to output named color too.\n alpha = this.fround(con text, this.alpha);\n\n if (this.value) {\n if (this.value.inde xOf('rgb') === 0) {\n if (alpha < 1) {\n color Function = 'rgba';\n }\n } else if (this.value.indexOf ('hsl') === 0) {\n if (alpha < 1) {\n colorFun ction = 'hsla';\n } else {\n colorFunction = ' hsl';\n }\n } else {\n return this.valu e;\n }\n } else {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n }\n\n switch (colorFun ction) {\n case 'rgba':\n args = this.rgb.map(function (c) {\n return clamp(Math.round(c), 255);\n } ).concat(clamp(alpha, 1));\n break;\n case 'hsla':\n args.push(clamp(alpha, 1));\n case 'hsl':\n color = this.toHSL();\n args = [\n this.fr ound(context, color.h),\n `${this.fround(context, color.s * 1 00)}%`,\n `${this.fround(context, color.l * 100)}%`\n ].concat(args);\n }\n\n if (colorFunction) {\n // Values are capped between `0` and `255`, rounded and zero-padded.\n return `${colorFunction}(${args.join(`,${compress ? '' : ' '}`)})`;\n } \n\n color = this.toRGB();\n\n if (compress) {\n const splitcolor = color.split('');\n\n // Convert color to short format\n if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4 ] && splitcolor[5] === splitcolor[6]) {\n color = `#${splitcolor[ 1]}${splitcolor[3]}${splitcolor[5]}`;\n }\n }\n\n retur n color;\n },\n\n //\n // Operations have to be done per-channel, if no t,\n // channels will spill onto each other. Once we have\n // our result, in the form of an integer triplet,\n // we create a new Color node to hold t he result.\n //\n operate(context, op, other) {\n const rgb = new A rray(3);\n const alpha = this.alpha * (1 - other.alpha) + other.alpha;\n for (let c = 0; c < 3; c++) {\n rgb[c] = this._operate(context , op, this.rgb[c], other.rgb[c]);\n }\n return new Color(rgb, alph a);\n },\n\n toRGB() {\n return toHex(this.rgb);\n },\n\n toH SL() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb [2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math. min(r, g, b);\n let h;\n let s;\n const l = (max + min) / 2 ;\n const d = max - min;\n\n if (max === min) {\n h = s = 0;\n } else {\n s = l > 0.5 ? d / (2 - max - min) : d / (ma x + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break; \n }\n h /= 6;\n }\n return { h: h * 360, s, l, a };\n },\n\n // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl -and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n toHSV() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 25 5, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g , b);\n let h;\n let s;\n const v = max;\n\n const d = max - min;\n if (max === 0) {\n s = 0;\n } else {\n s = d / max;\n }\n\n if (max === min) {\n h = 0;\n } else {\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, v, a };\n },\ n\n toARGB() {\n return toHex([this.alpha * 255].concat(this.rgb));\n },\n\n compare(x) {\n return (x.rgb &&\n x.rgb[0] === th is.rgb[0] &&\n x.rgb[1] === this.rgb[1] &&\n x.rgb[2] === this.rgb[2] &&\n x.alpha === this.alpha) ? 0 : undefined;\n }\n}) ;\n\nColor.fromKeyword = function(keyword) {\n let c;\n const key = keywor d.toLowerCase();\n if (colors.hasOwnProperty(key)) {\n c = new Color(c olors[key].slice(1));\n }\n else if (key === 'transparent') {\n c = new Color([0, 0, 0], 0);\n }\n\n if (c) {\n c.value = keyword;\n return c;\n }\n};\n\nfunction clamp(v, max) {\n return Math.min(Math .max(v, 0), max);\n}\n\nfunction toHex(v) {\n return `#${v.map(function (c) { \n c = clamp(Math.round(c), 255);\n return (c < 16 ? '0' : '') + c .toString(16);\n }).join('')}`;\n}\n\nexport default Color;\n","import Node f rom './node';\n\nconst Paren = function(node) {\n this.value = node;\n};\n\nP aren.prototype = Object.assign(new Node(), {\n type: 'Paren',\n\n genCSS(c ontext, output) {\n output.add('(');\n this.value.genCSS(context, output);\n output.add(')');\n },\n\n eval(context) {\n retur n new Paren(this.value.eval(context));\n }\n});\n\nexport default Paren;\n"," import Node from './node';\nconst _noSpaceCombinators = {\n '': true,\n ' ': true,\n '|': true\n};\n\nconst Combinator = function(value) {\n if (val ue === ' ') {\n this.value = ' ';\n this.emptyOrWhitespace = true; \n } else {\n this.value = value ? value.trim() : '';\n this.em ptyOrWhitespace = this.value === '';\n }\n}\n\nCombinator.prototype = Object. assign(new Node(), {\n type: 'Combinator',\n\n genCSS(context, output) {\n const spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value ]) ? '' : ' ';\n output.add(spaceOrEmpty + this.value + spaceOrEmpty);\n }\n});\n\nexport default Combinator;\n","import Node from './node';\nimport P aren from './paren';\nimport Combinator from './combinator';\n\nconst Element = function(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {\n this.combinator = combinator instanceof Combinator ?\n combinator : new Combinator(combinator);\n\n if (typeof value === 'string') {\n t his.value = value.trim();\n } else if (value) {\n this.value = value;\ n } else {\n this.value = '';\n }\n this.isVariable = isVariable ;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.cop yVisibilityInfo(visibilityInfo);\n this.setParent(this.combinator, this);\n}\ n\nElement.prototype = Object.assign(new Node(), {\n type: 'Element',\n\n accept(visitor) {\n const value = this.value;\n this.combinator = visitor.visit(this.combinator);\n if (typeof value === 'object') {\n this.value = visitor.visit(value);\n }\n },\n\n eval(context ) {\n return new Element(this.combinator,\n this.value.eval ? this.value.eval(context) : this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n }, \n\n clone() {\n return new Element(this.combinator,\n this .value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context), this.fileInfo(), this.getIndex());\n },\n\n toCSS(context) {\n context = context || {};\n let va lue = this.value;\n const firstSelector = context.firstSelector;\n if (value instanceof Paren) {\n // selector in parens should not be affected by outer selector\n // flags (breaks only interpolated selec tors - see #1973)\n context.firstSelector = true;\n }\n value = value.toCSS ? value.toCSS(context) : value;\n context.firstSelec tor = firstSelector;\n if (value === '' && this.combinator.value.charAt(0 ) === '&') {\n return '';\n } else {\n return this. combinator.toCSS(context) + value;\n }\n }\n});\n\nexport default Elem ent;\n","\nexport const Math = {\n ALWAYS: 0,\n PARENS_DIVISION: 1,\n P ARENS: 2\n // removed - STRICT_LEGACY: 3\n};\n\nexport const RewriteUrls = {\ n OFF: 0,\n LOCAL: 1,\n ALL: 2\n};","/**\r\n * Returns the object type of the given payload\r\n *\r\n * @param {*} payload\r\n * @returns {string}\r\n */\r\nfunction getType(payload) {\r\n return Object.prototype.toString.call(p ayload).slice(8, -1);\r\n}\r\n/**\r\n * Returns whether the payload is undefined \r\n *\r\n * @param {*} payload\r\n * @returns {payload is undefined}\r\n */\r\n function isUndefined(payload) {\r\n return getType(payload) === 'Undefined';\ r\n}\r\n/**\r\n * Returns whether the payload is null\r\n *\r\n * @param {*} pay load\r\n * @returns {payload is null}\r\n */\r\nfunction isNull(payload) {\r\n return getType(payload) === 'Null';\r\n}\r\n/**\r\n * Returns whether the payl oad is a plain JavaScript object (excluding special classes or objects with othe r prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Record<s tring, any>}\r\n */\r\nfunction isPlainObject(payload) {\r\n if (getType(payl oad) !== 'Object')\r\n return false;\r\n return payload.constructor == = Object && Object.getPrototypeOf(payload) === Object.prototype;\r\n}\r\n/**\r\n * Returns whether the payload is a plain JavaScript object (excluding special c lasses or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @r eturns {payload is Record<string, any>}\r\n */\r\nfunction isObject(payload) {\r \n return isPlainObject(payload);\r\n}\r\n/**\r\n * Returns whether the paylo ad is a an empty object (excluding special classes or objects with other prototy pes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is { [K in any]: nev er }}\r\n */\r\nfunction isEmptyObject(payload) {\r\n return isPlainObject(pa yload) && Object.keys(payload).length === 0;\r\n}\r\n/**\r\n * Returns whether t he payload is an any kind of object (including special classes or objects with d ifferent prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is R ecord<string, any>}\r\n */\r\nfunction isAnyObject(payload) {\r\n return getT ype(payload) === 'Object';\r\n}\r\n/**\r\n * Returns whether the payload is an o bject like a type passed in < >\r\n *\r\n * Usage: isObjectLike<{id: any}>(paylo ad) // will make sure it's an object and has an `id` prop.\r\n *\r\n * @template T this must be passed in < >\r\n * @param {*} payload\r\n * @returns {payload i s T}\r\n */\r\nfunction isObjectLike(payload) {\r\n return isAnyObject(payloa d);\r\n}\r\n/**\r\n * Returns whether the payload is a function (regular or asyn c)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is AnyFunction}\r\n */ \r\nfunction isFunction(payload) {\r\n return typeof payload === \"function\" ;\r\n}\r\n/**\r\n * Returns whether the payload is an array\r\n *\r\n * @param { any} payload\r\n * @returns {payload is any[]}\r\n */\r\nfunction isArray(payloa d) {\r\n return getType(payload) === 'Array';\r\n}\r\n/**\r\n * Returns wheth er the payload is a an array with at least 1 item\r\n *\r\n * @param {*} payload \r\n * @returns {payload is any[]}\r\n */\r\nfunction isFullArray(payload) {\r\n return isArray(payload) && payload.length > 0;\r\n}\r\n/**\r\n * Returns whe ther the payload is a an empty array\r\n *\r\n * @param {*} payload\r\n * @retur ns {payload is []}\r\n */\r\nfunction isEmptyArray(payload) {\r\n return isAr ray(payload) && payload.length === 0;\r\n}\r\n/**\r\n * Returns whether the payl oad is a string\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string }\r\n */\r\nfunction isString(payload) {\r\n return getType(payload) === 'Str ing';\r\n}\r\n/**\r\n * Returns whether the payload is a string, BUT returns fal se for ''\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isFullString(payload) {\r\n return isString(payload) && payloa d !== '';\r\n}\r\n/**\r\n * Returns whether the payload is ''\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isEmptyString (payload) {\r\n return payload === '';\r\n}\r\n/**\r\n * Returns whether the payload is a number (but not NaN)\r\n *\r\n * This will return `false` for `NaN` !!\r\n *\r\n * @param {*} payload\r\n * @returns {payload is number}\r\n */\r\nf unction isNumber(payload) {\r\n return getType(payload) === 'Number' && !isNa N(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a boolean\r\n *\r\n * @param {*} payload\r\n * @returns {payload is boolean}\r\n */\r\nfunction isB oolean(payload) {\r\n return getType(payload) === 'Boolean';\r\n}\r\n/**\r\n * Returns whether the payload is a regular expression (RegExp)\r\n *\r\n * @para m {*} payload\r\n * @returns {payload is RegExp}\r\n */\r\nfunction isRegExp(pay load) {\r\n return getType(payload) === 'RegExp';\r\n}\r\n/**\r\n * Returns w hether the payload is a Map\r\n *\r\n * @param {*} payload\r\n * @returns {paylo ad is Map<any, any>}\r\n */\r\nfunction isMap(payload) {\r\n return getType(p ayload) === 'Map';\r\n}\r\n/**\r\n * Returns whether the payload is a WeakMap\r\ n *\r\n * @param {*} payload\r\n * @returns {payload is WeakMap<any, any>}\r\n * /\r\nfunction isWeakMap(payload) {\r\n return getType(payload) === 'WeakMap'; \r\n}\r\n/**\r\n * Returns whether the payload is a Set\r\n *\r\n * @param {*} p ayload\r\n * @returns {payload is Set<any>}\r\n */\r\nfunction isSet(payload) {\ r\n return getType(payload) === 'Set';\r\n}\r\n/**\r\n * Returns whether the payload is a WeakSet\r\n *\r\n * @param {*} payload\r\n * @returns {payload is W eakSet<any>}\r\n */\r\nfunction isWeakSet(payload) {\r\n return getType(paylo ad) === 'WeakSet';\r\n}\r\n/**\r\n * Returns whether the payload is a Symbol\r\n *\r\n * @param {*} payload\r\n * @returns {payload is symbol}\r\n */\r\nfunctio n isSymbol(payload) {\r\n return getType(payload) === 'Symbol';\r\n}\r\n/**\r \n * Returns whether the payload is a Date, and that the date is valid\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Date}\r\n */\r\nfunction isDate (payload) {\r\n return getType(payload) === 'Date' && !isNaN(payload);\r\n}\r \n/**\r\n * Returns whether the payload is a Blob\r\n *\r\n * @param {*} payload \r\n * @returns {payload is Blob}\r\n */\r\nfunction isBlob(payload) {\r\n re turn getType(payload) === 'Blob';\r\n}\r\n/**\r\n * Returns whether the payload is a File\r\n *\r\n * @param {*} payload\r\n * @returns {payload is File}\r\n */ \r\nfunction isFile(payload) {\r\n return getType(payload) === 'File';\r\n}\r \n/**\r\n * Returns whether the payload is a Promise\r\n *\r\n * @param {*} payl oad\r\n * @returns {payload is Promise<any>}\r\n */\r\nfunction isPromise(payloa d) {\r\n return getType(payload) === 'Promise';\r\n}\r\n/**\r\n * Returns whe ther the payload is an Error\r\n *\r\n * @param {*} payload\r\n * @returns {payl oad is Error}\r\n */\r\nfunction isError(payload) {\r\n return getType(payloa d) === 'Error';\r\n}\r\n/**\r\n * Returns whether the payload is literally the v alue `NaN` (it's `NaN` and also a `number`)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is typeof NaN}\r\n */\r\nfunction isNaNValue(payload) {\r\n return getType(payload) === 'Number' && isNaN(payload);\r\n}\r\n/**\r\n * Retu rns whether the payload is a primitive type (eg. Boolean | Null | Undefined | Nu mber | String | Symbol)\r\n *\r\n * @param {*} payload\r\n * @returns {(payload is boolean | null | undefined | number | string | symbol)}\r\n */\r\nfunction is Primitive(payload) {\r\n return (isBoolean(payload) ||\r\n isNull(payl oad) ||\r\n isUndefined(payload) ||\r\n isNumber(payload) ||\r\n isString(payload) ||\r\n isSymbol(payload));\r\n}\r\n/**\r\n * Retu rns true whether the payload is null or undefined\r\n *\r\n * @param {*} payload \r\n * @returns {(payload is null | undefined)}\r\n */\r\nfunction isNullOrUndef ined(payload) {\r\n return isNull(payload) || isUndefined(payload);\r\n}\r\n/ **\r\n * Does a generic check to check that the given payload is of a given type .\r\n * In cases like Number, it will return true for NaN as NaN is a Number (th anks javascript!);\r\n * It will, however, differentiate between object and null \r\n *\r\n * @template T\r\n * @param {*} payload\r\n * @param {T} type\r\n * @t hrows {TypeError} Will throw type error if type is an invalid type\r\n * @return s {payload is T}\r\n */\r\nfunction isType(payload, type) {\r\n if (!(type in stanceof Function)) {\r\n throw new TypeError('Type must be a function'); \r\n }\r\n if (!Object.prototype.hasOwnProperty.call(type, 'prototype')) { \r\n throw new TypeError('Type is not a class');\r\n }\r\n // Class es usually have names (as functions usually have names)\r\n var name = type.n ame;\r\n return getType(payload) === name || Boolean(payload && payload.const ructor === type);\r\n}\n\nexport { getType, isAnyObject, isArray, isBlob, isBool ean, isDate, isEmptyArray, isEmptyObject, isEmptyString, isError, isFile, isFull Array, isFullString, isFunction, isMap, isNaNValue, isNull, isNullOrUndefined, i sNumber, isObject, isObjectLike, isPlainObject, isPrimitive, isPromise, isRegExp , isSet, isString, isSymbol, isType, isUndefined, isWeakMap, isWeakSet };\n","im port { isArray, isPlainObject } from 'is-what';\n\n/*! ************************* ****************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with th e License. You may obtain a copy of the\r\nLicense at http://www.apache.org/lice nses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRA NTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PART ICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Ver sion 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n********************************************************** ******************* */\r\n\r\nfunction __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments [i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\n\nfunction assignProp(carry, key, newVal, originalObject, includ eNonenumerable) {\r\n var propType = {}.propertyIsEnumerable.call(originalObj ect, key)\r\n ? 'enumerable'\r\n : 'nonenumerable';\r\n if (pro pType === 'enumerable')\r\n carry[key] = newVal;\r\n if (includeNonenu merable && propType === 'nonenumerable') {\r\n Object.defineProperty(carr y, key, {\r\n value: newVal,\r\n enumerable: false,\r\n writable: true,\r\n configurable: true,\r\n });\r\n }\r\n}\r\n/**\r\n * Copy (clone) an object and all its props recursively to ge t rid of any prop referenced of the original object. Arrays are also cloned, how ever objects inside arrays are still linked.\r\n *\r\n * @export\r\n * @template T\r\n * @param {T} target Target can be anything\r\n * @param {Options} [option s={}] Options can be `props` or `nonenumerable`\r\n * @returns {T} the target wi th replaced values\r\n * @export\r\n */\r\nfunction copy(target, options) {\r\n if (options === void 0) { options = {}; }\r\n if (isArray(target))\r\n return target.map(function (i) { return copy(i, options); });\r\n if (!is PlainObject(target))\r\n return target;\r\n var props = Object.getOwnP ropertyNames(target);\r\n var symbols = Object.getOwnPropertySymbols(target); \r\n return __spreadArrays(props, symbols).reduce(function (carry, key) {\r\n if (isArray(options.props) && !options.props.includes(key)) {\r\n return carry;\r\n }\r\n var val = target[key];\r\n var newVal = copy(val, options);\r\n assignProp(carry, key, newVal, target, options.nonenumerable);\r\n return carry;\r\n }, {});\r\n}\n\nexport { copy };\n","/* jshint proto: true */\nimport * as Constants from './constants'; \nimport { copy } from 'copy-anything';\n\nexport function getLocation(index, in putStream) {\n let n = index + 1;\n let line = null;\n let column = -1; \n\n while (--n >= 0 && inputStream.charAt(n) !== '\\n') {\n column++; \n }\n\n if (typeof index === 'number') {\n line = (inputStream.sli ce(0, index).match(/\\n/g) || '').length;\n }\n\n return {\n line,\ n column\n };\n}\n\nexport function copyArray(arr) {\n let i;\n const length = arr.length;\n const copy = new Array(length);\n\n for (i = 0; i < length; i++) {\n copy[i] = arr[i];\n }\n return copy;\n}\n\n export function clone(obj) {\n const cloned = {};\n for (const prop in obj ) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[pro p];\n }\n }\n return cloned;\n}\n\nexport function defaults(obj1, o bj2) {\n let newObj = obj2 || {};\n if (!obj2._defaults) {\n newObj = {};\n const defaults = copy(obj1);\n newObj._defaults = default s;\n const cloned = obj2 ? copy(obj2) : {};\n Object.assign(newObj , defaults, cloned);\n }\n return newObj;\n}\n\nexport function copyOption s(obj1, obj2) {\n if (obj2 && obj2._defaults) {\n return obj2;\n }\ n const opts = defaults(obj1, obj2);\n if (opts.strictMath) {\n opt s.math = Constants.Math.PARENS;\n }\n // Back compat with changed relative Urls option\n if (opts.relativeUrls) {\n opts.rewriteUrls = Constants. RewriteUrls.ALL;\n }\n if (typeof opts.math === 'string') {\n switc h (opts.math.toLowerCase()) {\n case 'always':\n opts. math = Constants.Math.ALWAYS;\n break;\n case 'parens- division':\n opts.math = Constants.Math.PARENS_DIVISION;\n break;\n case 'strict':\n case 'parens':\n opts.math = Constants.Math.PARENS;\n break;\n default:\n opts.math = Constants.Math.PARENS;\n }\n }\ n if (typeof opts.rewriteUrls === 'string') {\n switch (opts.rewriteUr ls.toLowerCase()) {\n case 'off':\n opts.rewriteUrls = Constants.RewriteUrls.OFF;\n break;\n case 'local':\n opts.rewriteUrls = Constants.RewriteUrls.LOCAL;\n break;\n case 'all':\n opts.rewriteUrls = Constants.R ewriteUrls.ALL;\n break;\n }\n }\n return opts;\n}\n \nexport function merge(obj1, obj2) {\n for (const prop in obj2) {\n i f (obj2.hasOwnProperty(prop)) {\n obj1[prop] = obj2[prop];\n } \n }\n return obj1;\n}\n\nexport function flattenArray(arr, result = []) { \n for (let i = 0, length = arr.length; i < length; i++) {\n const val ue = arr[i];\n if (Array.isArray(value)) {\n flattenArray(valu e, result);\n } else {\n if (value !== undefined) {\n result.push(value);\n }\n }\n }\n return result;\ n}","import * as utils from './utils';\n\nconst anonymousFunc = /(<anonymous>|Fu nction):(\\d+):(\\d+)/;\n\n/**\n * This is a centralized class of any error that could be thrown internally (mostly by the parser).\n * Besides standard .messag e it keeps some additional data like a path to the file where the error\n * occu rred along with line and column numbers.\n *\n * @class\n * @extends Error\n * @ type {module.LessError}\n *\n * @prop {string} type\n * @prop {string} filename\ n * @prop {number} index\n * @prop {number} line\n * @prop {number} column\n * @ prop {number} callLine\n * @prop {number} callExtract\n * @prop {string[]} extra ct\n *\n * @param {Object} e - An error object to wrap around or ju st a descriptive object\n * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManage r?\n * @param {string} [currentFilename]\n */\nconst LessError = function(e, fil eContentMap, currentFilename) {\n Error.call(this);\n\n const filename = e .filename || currentFilename;\n\n this.message = e.message;\n this.stack = e.stack;\n\n if (fileContentMap && filename) {\n const input = fileCo ntentMap.contents[filename];\n const loc = utils.getLocation(e.index, inp ut);\n var line = loc.line;\n const col = loc.column;\n co nst callLine = e.call && utils.getLocation(e.call, input).line;\n const l ines = input ? input.split('\\n') : '';\n\n this.type = e.type || 'Syntax ';\n this.filename = filename;\n this.index = e.index;\n th is.line = typeof line === 'number' ? line + 1 : null;\n this.column = col ;\n\n if (!this.line && this.stack) {\n const found = this.sta ck.match(anonymousFunc);\n\n /**\n * We have to figure ou t how this environment stringifies anonymous functions\n * so we can correctly map plugin errors.\n * \n * Note, in Node 8, the output of anonymous funcs varied based on parameters\n * being p resent or not, so we inject dummy params.\n */\n const fu nc = new Function('a', 'throw new Error()');\n let lineAdjust = 0;\n try {\n func();\n } catch (e) {\n const match = e.stack.match(anonymousFunc);\n var line = pa rseInt(match[2]);\n lineAdjust = 1 - line;\n }\n\n if (found) {\n if (found[2]) {\n this. line = parseInt(found[2]) + lineAdjust;\n }\n if ( found[3]) {\n this.column = parseInt(found[3]);\n }\n }\n }\n\n this.callLine = callLine + 1;\n this.callExtract = lines[callLine];\n\n this.extract = [\n l ines[this.line - 2],\n lines[this.line - 1],\n lines[this. line]\n ];\n }\n\n};\n\nif (typeof Object.create === 'undefined') {\n const F = function () {};\n F.prototype = Error.prototype;\n LessError. prototype = new F();\n} else {\n LessError.prototype = Object.create(Error.pr ototype);\n}\n\nLessError.prototype.constructor = LessError;\n\n/**\n * An overr idden version of the default Object.prototype.toString\n * which uses additional information to create a helpful message.\n *\n * @param {Object} options\n * @r eturns {string}\n */\nLessError.prototype.toString = function(options) {\n op tions = options || {};\n\n let message = '';\n const extract = this.extrac t || [];\n let error = [];\n let stylize = function (str) { return str; }; \n if (options.stylize) {\n const type = typeof options.stylize;\n if (type !== 'function') {\n throw Error(`options.stylize should be a function, got a ${type}!`);\n }\n stylize = options.stylize;\ n }\n\n if (this.line !== null) {\n if (typeof extract[0] === 'stri ng') {\n error.push(stylize(`${this.line - 1} ${extract[0]}`, 'grey') );\n }\n\n if (typeof extract[1] === 'string') {\n let errorTxt = `${this.line} `;\n if (extract[1]) {\n erro rTxt += extract[1].slice(0, this.column) +\n stylize(stylize( stylize(extract[1].substr(this.column, 1), 'bold') +\n ex tract[1].slice(this.column + 1), 'red'), 'inverse');\n }\n error.push(errorTxt);\n }\n\n if (typeof extract[2] === 'string') {\n error.push(stylize(`${this.line + 1} ${extract[2]}`, 'grey'));\n }\n error = `${error.join('\\n') + stylize('', 'reset')}\\n`;\n }\n\n message += stylize(`${this.type}Error: ${this.message}`, 'red');\n if (this.filename) {\n message += stylize(' in ', 'red') + this.filename ;\n }\n if (this.line) {\n message += stylize(` on line ${this.line }, column ${this.column + 1}:`, 'grey');\n }\n\n message += `\\n${error}`; \n\n if (this.callLine) {\n message += `${stylize('from ', 'red') + (t his.filename || '')}/n`;\n message += `${stylize(this.callLine, 'grey')} ${this.callExtract}/n`;\n }\n\n return message;\n};\n\nexport default Less Error;","import Node from './node';\nimport Element from './element';\nimport Le ssError from '../less-error';\n\nconst Selector = function(elements, extendList, condition, index, currentFileInfo, visibilityInfo) {\n this.extendList = ext endList;\n this.condition = condition;\n this.evaldCondition = !condition; \n this._index = index;\n this._fileInfo = currentFileInfo;\n this.elem ents = this.getElements(elements);\n this.mixinElements_ = undefined;\n th is.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.elements, this); \n};\n\nSelector.prototype = Object.assign(new Node(), {\n type: 'Selector',\ n\n accept(visitor) {\n if (this.elements) {\n this.element s = visitor.visitArray(this.elements);\n }\n if (this.extendList) {\n this.extendList = visitor.visitArray(this.extendList);\n } \n if (this.condition) {\n this.condition = visitor.visit(this .condition);\n }\n },\n\n createDerived(elements, extendList, evald Condition) {\n elements = this.getElements(elements);\n const newS elector = new Selector(elements, extendList || this.extendList,\n nul l, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n newSelecto r.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldConditi on;\n newSelector.mediaEmpty = this.mediaEmpty;\n return newSelect or;\n },\n\n getElements(els) {\n if (!els) {\n return [ new Element('', '&', false, this._index, this._fileInfo)];\n }\n i f (typeof els === 'string') {\n this.parse.parseNode(\n els, \n ['selector'],\n this._index, \n this._fileInfo, \n function(err, result) {\n if (err) {\n throw new LessError({\n index: err.index,\n message: err.message \n }, this.parse.imports, this._fileInfo.filename);\n }\n els = result[0].elements;\n });\n }\n return els;\n },\n\n createEmptySelectors() {\n const el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)];\n sels[ 0].mediaEmpty = true;\n return sels;\n },\n\n match(other) {\n const elements = this.elements;\n const len = elements.length;\n let olen;\n let i;\n\n other = other.mixinElements();\n o len = other.length;\n if (olen === 0 || len < olen) {\n return 0;\n } else {\n for (i = 0; i < olen; i++) {\n if (elements[i].value !== other[i]) {\n return 0;\n }\n }\n }\n\n return olen; // return number of m atched elements\n },\n\n mixinElements() {\n if (this.mixinElements _) {\n return this.mixinElements_;\n }\n\n let elements = this.elements.map( function(v) {\n return v.combinator.value + (v. value.value || v.value);\n }).join('').match(/[,&#\\*\\.\\w-]([\\w-]|(\\\ \.))*/g);\n\n if (elements) {\n if (elements[0] === '&') {\n elements.shift();\n }\n } else {\n el ements = [];\n }\n\n return (this.mixinElements_ = elements);\n },\n\n isJustParentSelector() {\n return !this.mediaEmpty &&\n this.elements.length === 1 &&\n this.elements[0].value === '&' & &\n (this.elements[0].combinator.value === ' ' || this.elements[0].co mbinator.value === '');\n },\n\n eval(context) {\n const evaldCondi tion = this.condition && this.condition.eval(context);\n let elements = t his.elements;\n let extendList = this.extendList;\n\n elements = e lements && elements.map(function (e) { return e.eval(context); });\n exte ndList = extendList && extendList.map(function(extend) { return extend.eval(cont ext); });\n\n return this.createDerived(elements, extendList, evaldCondit ion);\n },\n\n genCSS(context, output) {\n let i, element;\n if ((!context || !context.firstSelector) && this.elements[0].combinator.value = == '') {\n output.add(' ', this.fileInfo(), this.getIndex());\n }\n for (i = 0; i < this.elements.length; i++) {\n element = this.elements[i];\n element.genCSS(context, output);\n }\n },\n\n getIsOutput() {\n return this.evaldCondition;\n }\n});\n\ne xport default Selector;\n","import Node from './node';\n\nconst Value = function (value) {\n if (!value) {\n throw new Error('Value requires an array a rgument');\n }\n if (!Array.isArray(value)) {\n this.value = [ valu e ];\n }\n else {\n this.value = value;\n }\n};\n\nValue.prototy pe = Object.assign(new Node(), {\n type: 'Value',\n\n accept(visitor) {\n if (this.value) {\n this.value = visitor.visitArray(this.value );\n }\n },\n\n eval(context) {\n if (this.value.length === 1) {\n return this.value[0].eval(context);\n } else {\n return new Value(this.value.map(function (v) {\n return v.ev al(context);\n }));\n }\n },\n\n genCSS(context, output) {\n let i;\n for (i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (i + 1 < this.value.le ngth) {\n output.add((context && context.compress) ? ',' : ', '); \n }\n }\n }\n});\n\nexport default Value;\n","import Node from './node';\n\nconst Keyword = function(value) {\n this.value = value;\n}; \n\nKeyword.prototype = Object.assign(new Node(), {\n type: 'Keyword',\n\n genCSS(context, output) {\n if (this.value === '%') { throw { type: 'Syn tax', message: 'Invalid % without number' }; }\n output.add(this.value);\ n }\n});\n\nKeyword.True = new Keyword('true');\nKeyword.False = new Keyword( 'false');\n\nexport default Keyword;\n","import Node from './node';\n\nconst Ano nymous = function(value, index, currentFileInfo, mapLines, rulesetLike, visibili tyInfo) {\n this.value = value;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.mapLines = mapLines;\n this.rulesetLike = (type of rulesetLike === 'undefined') ? false : rulesetLike;\n this.allowRoot = tru e;\n this.copyVisibilityInfo(visibilityInfo);\n}\n\nAnonymous.prototype = Obj ect.assign(new Node(), {\n type: 'Anonymous',\n eval() {\n return n ew Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulese tLike, this.visibilityInfo());\n },\n compare(other) {\n return oth er.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n },\n isRules etLike() {\n return this.rulesetLike;\n },\n genCSS(context, output ) {\n this.nodeVisible = Boolean(this.value);\n if (this.nodeVisib le) {\n output.add(this.value, this._fileInfo, this._index, this.mapL ines);\n }\n }\n})\n\nexport default Anonymous;\n","import Node from ' ./node';\nimport Value from './value';\nimport Keyword from './keyword';\nimport Anonymous from './anonymous';\nimport * as Constants from '../constants';\ncons t MATH = Constants.Math;\n\nfunction evalName(context, name) {\n let value = '';\n let i;\n const n = name.length;\n const output = {add: function ( s) {value += s;}};\n for (i = 0; i < n; i++) {\n name[i].eval(context) .genCSS(context, output);\n }\n return value;\n}\n\nconst Declaration = fu nction(name, value, important, merge, index, currentFileInfo, inline, variable) {\n this.name = name;\n this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]);\n this.important = important ? ` ${important.trim()}` : '';\n this.merge = merge;\n this._index = index; \n this._fileInfo = currentFileInfo;\n this.inline = inline || false;\n this.variable = (variable !== undefined) ? variable\n : (name.charAt && (name.charAt(0) === '@'));\n this.allowRoot = true;\n this.setParent(this. value, this);\n};\n\nDeclaration.prototype = Object.assign(new Node(), {\n ty pe: 'Declaration',\n\n genCSS(context, output) {\n output.add(this.nam e + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex());\n try {\n this.value.genCSS(context, output);\n }\n catc h (e) {\n e.index = this._index;\n e.filename = this._file Info.filename;\n throw e;\n }\n output.add(this.importa nt + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this. _fileInfo, this._index);\n },\n\n eval(context) {\n let mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable;\n if (typeof name !== 'string') {\n // expand 'primitive' name dire ctly to get\n // things faster (~10% for benchmark.less):\n name = (name.length === 1) && (name[0] instanceof Keyword) ?\n name[0].value : evalName(context, name);\n variable = false; // never treat expanded interpolation as new variable name\n }\n\n // @tod o remove when parens-division is default\n if (name === 'font' && context .math === MATH.ALWAYS) {\n mathBypass = true;\n prevMath = context.math;\n context.math = MATH.PARENS_DIVISION;\n }\n try {\n context.importantScope.push({});\n evaldValue = this.value.eval(context);\n\n if (!this.variable && evaldValue.typ e === 'DetachedRuleset') {\n throw { message: 'Rulesets cannot be evaluated on a property.',\n index: this.getIndex(), filenam e: this.fileInfo().filename };\n }\n let important = this. important;\n const importantResult = context.importantScope.pop();\n if (!important && importantResult.important) {\n impor tant = importantResult.important;\n }\n\n return new Decla ration(name,\n evaldValue,\n important,\n this.merge,\n this.getIndex(), this.fileInfo(), this.inlin e,\n variable);\n }\n catch (e) {\n if ( typeof e.index !== 'number') {\n e.index = this.getIndex();\n e.filename = this.fileInfo().filename;\n }\n t hrow e;\n }\n finally {\n if (mathBypass) {\n context.math = prevMath;\n }\n }\n },\n\n makeImpo rtant() {\n return new Declaration(this.name,\n this.value,\n '!important',\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline);\n }\n});\n\nexport default Declaration;","func tion asComment(ctx) {\n return `/* line ${ctx.debugInfo.lineNumber}, ${ctx.de bugInfo.fileName} */\\n`;\n}\n\nfunction asMediaQuery(ctx) {\n let filenameWi thProtocol = ctx.debugInfo.fileName;\n if (!/^[a-z]+:\\/\\//i.test(filenameWi thProtocol)) {\n filenameWithProtocol = `file://${filenameWithProtocol}`; \n }\n return `@media -sass-debug-info{filename{font-family:${filenameWith Protocol.replace(/([.:\\/\\\\])/g, function (a) {\n if (a == '\\\\') {\n a = '\\/';\n }\n return `\\\\${a}`;\n })}}line{font- family:\\\\00003${ctx.debugInfo.lineNumber}}}\\n`;\n}\n\nfunction debugInfo(cont ext, ctx, lineSeparator) {\n let result = '';\n if (context.dumpLineNumber s && !context.compress) {\n switch (context.dumpLineNumbers) {\n case 'comments':\n result = asComment(ctx);\n b reak;\n case 'mediaquery':\n result = asMediaQuery(ctx );\n break;\n case 'all':\n result = as Comment(ctx) + (lineSeparator || '') + asMediaQuery(ctx);\n break ;\n }\n }\n return result;\n}\n\nexport default debugInfo;\n\n","im port Node from './node';\nimport getDebugInfo from './debug-info';\n\nconst Comm ent = function(value, isLineComment, index, currentFileInfo) {\n this.value = value;\n this.isLineComment = isLineComment;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n}\n\nComment.prot otype = Object.assign(new Node(), {\n type: 'Comment',\n\n genCSS(context, output) {\n if (this.debugInfo) {\n output.add(getDebugInfo(c ontext, this), this.fileInfo(), this.getIndex());\n }\n output.add (this.value);\n },\n\n isSilent(context) {\n const isCompressed = c ontext.compress && this.value[2] !== '!';\n return this.isLineComment || isCompressed;\n }\n});\n\nexport default Comment;\n","const contexts = {};\ne xport default contexts;\nimport * as Constants from './constants';\n\nconst copy FromOriginal = function copyFromOriginal(original, destination, propertiesToCopy ) {\n if (!original) { return; }\n\n for (let i = 0; i < propertiesToCopy. length; i++) {\n if (original.hasOwnProperty(propertiesToCopy[i])) {\n destination[propertiesToCopy[i]] = original[propertiesToCopy[i]];\n }\n }\n};\n\n/*\n parse is used whilst parsing\n */\nconst parseCopyPrope rties = [\n // options\n 'paths', // option - unmodified - path s to search for imports on\n 'rewriteUrls', // option - whether to adjus t URL's to be relative\n 'rootpath', // option - rootpath to append t o URL's\n 'strictImports', // option -\n 'insecure', // option - whether to allow imports from insecure ssl hosts\n 'dumpLineNumbers', // o ption - whether to dump line numbers\n 'compress', // option - whethe r to compress\n 'syncImport', // option - whether to import synchronous ly\n 'chunkInput', // option - whether to chunk input. more performant but causes parse issues.\n 'mime', // browser only - mime type fo r sheet import\n 'useFileCache', // browser only - whether to use the per file session cache\n // context\n 'processImports', // option & context - whether to process imports. if false then imports will not be imported.\n // Used by the import manager to stop multiple import visitors being created.\n 'pluginManager' // Used as the plugin manager for the session\n];\n\ncont exts.Parse = function(options) {\n copyFromOriginal(options, this, parseCopyP roperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.path s]; }\n};\n\nconst evalCopyProperties = [\n 'paths', // additiona l include paths\n 'compress', // whether to compress\n 'math', // whether math has to be within parenthesis\n 'strictUnits', // whether units need to evaluate correctly\n 'sourceMap', // wheth er to output a source map\n 'importMultiple', // whether we are currently importing multiple copies\n 'urlArgs', // whether to add args into url tokens\n 'javascriptEnabled', // option - whether Inline JavaScript is en abled. if undefined, defaults to false\n 'pluginManager', // Used as the plugin manager for the session\n 'importantScope', // used to bubble up !i mportant statements\n 'rewriteUrls' // option - whether to adjust URL' s to be relative\n];\n\ncontexts.Eval = function(options, frames) {\n copyFro mOriginal(options, this, evalCopyProperties);\n\n if (typeof this.paths === ' string') { this.paths = [this.paths]; }\n\n this.frames = frames || [];\n this.importantScope = this.importantScope || [];\n};\n\ncontexts.Eval.prototype. enterCalc = function () {\n if (!this.calcStack) {\n this.calcStack = [];\n }\n this.calcStack.push(true);\n this.inCalc = true;\n};\n\nconte xts.Eval.prototype.exitCalc = function () {\n this.calcStack.pop();\n if ( !this.calcStack.length) {\n this.inCalc = false;\n }\n};\n\ncontexts.E val.prototype.inParenthesis = function () {\n if (!this.parensStack) {\n this.parensStack = [];\n }\n this.parensStack.push(true);\n};\n\ncontex ts.Eval.prototype.outOfParenthesis = function () {\n this.parensStack.pop();\ n};\n\ncontexts.Eval.prototype.inCalc = false;\ncontexts.Eval.prototype.mathOn = true;\ncontexts.Eval.prototype.isMathOn = function (op) {\n if (!this.mathOn ) {\n return false;\n }\n if (op === '/' && this.math !== Constants .Math.ALWAYS && (!this.parensStack || !this.parensStack.length)) {\n retu rn false;\n }\n if (this.math > Constants.Math.PARENS_DIVISION) {\n return this.parensStack && this.parensStack.length;\n }\n return true;\n} ;\n\ncontexts.Eval.prototype.pathRequiresRewrite = function (path) {\n const isRelative = this.rewriteUrls === Constants.RewriteUrls.LOCAL ? isPathLocalRelat ive : isPathRelative;\n\n return isRelative(path);\n};\n\ncontexts.Eval.proto type.rewritePath = function (path, rootpath) {\n let newPath;\n\n rootpath = rootpath || '';\n newPath = this.normalizePath(rootpath + path);\n\n // If a path was explicit relative and the rootpath was not an absolute path\n // we must ensure that the new path is also explicit relative.\n if (isPathLo calRelative(path) &&\n isPathRelative(rootpath) &&\n isPathLocalRe lative(newPath) === false) {\n newPath = `./${newPath}`;\n }\n\n re turn newPath;\n};\n\ncontexts.Eval.prototype.normalizePath = function (path) {\n const segments = path.split('/').reverse();\n let segment;\n\n path = [];\n while (segments.length !== 0) {\n segment = segments.pop();\n switch ( segment ) {\n case '.':\n break;\n case '..':\n if ((path.length === 0) || (path[path.length - 1] === '..')) {\n path.push( segment );\n } e lse {\n path.pop();\n }\n break ;\n default:\n path.push(segment);\n br eak;\n }\n }\n\n return path.join('/');\n};\n\nfunction isPathRelat ive(path) {\n return !/^(?:[a-z-]+:|\\/|#)/i.test(path);\n}\n\nfunction isPat hLocalRelative(path) {\n return path.charAt(0) === '.';\n}\n\n// todo - do th e same for the toCSS ?\n","function makeRegistry( base ) {\n return {\n _data: {},\n add: function(name, func) {\n // precautionary case conversion, as later querying of\n // the registry by function-c aller uses lower case as well.\n name = name.toLowerCase();\n\n if (this._data.hasOwnProperty(name)) {\n // TODO warn\n }\n this._data[name] = func;\n },\n addMultiple : function(functions) {\n Object.keys(functions).forEach(\n name => {\n this.add(name, functions[name]);\n });\n },\n get: function(name) {\n return this._ data[name] || ( base && base.get( name ));\n },\n getLocalFunction s: function() {\n return this._data;\n },\n inherit: fu nction() {\n return makeRegistry( this );\n },\n create : function(base) {\n return makeRegistry(base);\n }\n };\n} \n\nexport default makeRegistry( null );","import Keyword from '../tree/keyword' ;\n\nconst defaultFunc = {\n eval: function () {\n const v = this.valu e_;\n const e = this.error_;\n if (e) {\n throw e;\n }\n if (v != null) {\n return v ? Keyword.True : Keyword. False;\n }\n },\n value: function (v) {\n this.value_ = v;\n },\n error: function (e) {\n this.error_ = e;\n },\n reset: function () {\n this.value_ = this.error_ = null;\n }\n};\n\nexport de fault defaultFunc;\n","import Node from './node';\nimport Declaration from './de claration';\nimport Keyword from './keyword';\nimport Comment from './comment';\ nimport Paren from './paren';\nimport Selector from './selector';\nimport Elemen t from './element';\nimport Anonymous from './anonymous';\nimport contexts from '../contexts';\nimport globalFunctionRegistry from '../functions/function-regist ry';\nimport defaultFunc from '../functions/default';\nimport getDebugInfo from './debug-info';\nimport * as utils from '../utils';\n\nconst Ruleset = function( selectors, rules, strictImports, visibilityInfo) {\n this.selectors = selecto rs;\n this.rules = rules;\n this._lookups = {};\n this._variables = nul l;\n this._properties = null;\n this.strictImports = strictImports;\n t his.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n this. setParent(this.selectors, this);\n this.setParent(this.rules, this);\n}\n\nRu leset.prototype = Object.assign(new Node(), {\n type: 'Ruleset',\n isRules et: true,\n\n isRulesetLike() { return true; },\n\n accept(visitor) {\n if (this.paths) {\n this.paths = visitor.visitArray(this.paths, true);\n } else if (this.selectors) {\n this.selectors = visit or.visitArray(this.selectors);\n }\n if (this.rules && this.rules. length) {\n this.rules = visitor.visitArray(this.rules);\n }\n },\n\n eval(context) {\n const that = this;\n let selectors ;\n let selCnt;\n let selector;\n let i;\n let hasVa riable;\n let hasOnePassingSelector = false;\n\n if (this.selector s && (selCnt = this.selectors.length)) {\n selectors = new Array(selC nt);\n defaultFunc.error({\n type: 'Syntax',\n message: 'it is currently only allowed in parametric mixin guards,'\n });\n\n for (i = 0; i < selCnt; i++) {\n sele ctor = this.selectors[i].eval(context);\n for (var j = 0; j < sel ector.elements.length; j++) {\n if (selector.elements[j].isVa riable) {\n hasVariable = true;\n break;\n }\n }\n selectors[i] = selector;\n if (selector.evaldCondition) {\n hasOnePassingSelector = true;\n }\n }\n\n i f (hasVariable) {\n const toParseSelectors = new Array(selCnt);\n for (i = 0; i < selCnt; i++) {\n selector = s electors[i];\n toParseSelectors[i] = selector.toCSS(context); \n }\n this.parse.parseNode(\n toParseSelectors.join(','),\n [\"selectors\"], \n selectors[0].getIndex(), \n selectors[0].fileInfo(), \n function(err, result) {\n if (resul t) {\n selectors = utils.flattenArray(result);\n }\n });\n }\n\n defa ultFunc.reset();\n } else {\n hasOnePassingSelector = true;\n }\n\n let rules = this.rules ? utils.copyArray(this.rules) : null; \n const ruleset = new Ruleset(selectors, rules, this.strictImports, this .visibilityInfo());\n let rule;\n let subRule;\n\n ruleset. originalRuleset = this;\n ruleset.root = this.root;\n ruleset.firs tRoot = this.firstRoot;\n ruleset.allowImports = this.allowImports;\n\n if (this.debugInfo) {\n ruleset.debugInfo = this.debugInfo;\n }\n\n if (!hasOnePassingSelector) {\n rules.length = 0;\ n }\n\n // inherit a function registry from the frames stack when possible;\n // otherwise from the global registry\n ruleset.functi onRegistry = (function (frames) {\n let i = 0;\n const n = frames.length;\n let found;\n for ( ; i !== n ; ++i ) {\n found = frames[ i ].functionRegistry;\n if ( foun d ) { return found; }\n }\n return globalFunctionRegistry; \n }(context.frames)).inherit();\n\n // push the current ruleset t o the frames stack\n const ctxFrames = context.frames;\n ctxFrames .unshift(ruleset);\n\n // currrent selectors\n let ctxSelectors = context.selectors;\n if (!ctxSelectors) {\n context.selectors = ctxSelectors = [];\n }\n ctxSelectors.unshift(this.selectors);\n \n // Evaluate imports\n if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {\n ruleset.evalImports(context);\n }\n\n // Store the frames around mixin definitions,\n // so they can be evaluated like closures when the time comes.\n const rsRules = rul eset.rules;\n for (i = 0; (rule = rsRules[i]); i++) {\n if (ru le.evalFirst) {\n rsRules[i] = rule.eval(context);\n } \n }\n\n const mediaBlockCount = (context.mediaBlocks && context.m ediaBlocks.length) || 0;\n\n // Evaluate mixin calls.\n for (i = 0 ; (rule = rsRules[i]); i++) {\n if (rule.type === 'MixinCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(conte xt).filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope if the variab le is\n // already there. consider returning false here\n // but we need a way to \"return\" variable from mixins\ n return !(ruleset.variable(r.name));\n }\n return true;\n });\n rsRu les.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.len gth - 1;\n ruleset.resetCache();\n } else if (rule.typ e === 'VariableCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).rules.filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope at all\n return false;\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += ru les.length - 1;\n ruleset.resetCache();\n }\n } \n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]) ; i++) {\n if (!rule.evalFirst) {\n rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n // for rulesets, check if it is a css guard and can be removed\n if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1 ) {\n // check if it can be folded in (e.g. & where)\n if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {\n rsRules.splice(i--, 1);\n\n for (var j = 0; (s ubRule = rule.rules[j]); j++) {\n if (subRule instanceof Node) {\n subRule.copyVisibilityInfo(rule.visibilityI nfo());\n if (!(subRule instanceof Declaration) || !s ubRule.variable) {\n rsRules.splice(++i, 0, subRu le);\n }\n }\n }\n }\n }\n }\n\n // Pop the stack\n ctxFrames.shift();\n ctxSelectors.shift();\n\n if (context .mediaBlocks) {\n for (i = mediaBlockCount; i < context.mediaBlocks.l ength; i++) {\n context.mediaBlocks[i].bubbleSelectors(selectors) ;\n }\n }\n\n return ruleset;\n },\n\n evalImport s(context) {\n const rules = this.rules;\n let i;\n let imp ortRules;\n if (!rules) { return; }\n\n for (i = 0; i < rules.leng th; i++) {\n if (rules[i].type === 'Import') {\n impor tRules = rules[i].eval(context);\n if (importRules && (importRule s.length || importRules.length === 0)) {\n rules.splice.apply (rules, [i, 1].concat(importRules));\n i += importRules.lengt h - 1;\n } else {\n rules.splice(i, 1, importR ules);\n }\n this.resetCache();\n }\n }\n },\n\n makeImportant() {\n const result = new Ruleset(thi s.selectors, this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant();\n } else {\n return r;\n }\n }), this.strictImports, this.visibilityInfo() );\n\n return result;\n },\n\n matchArgs(args) {\n return !a rgs || args.length === 0;\n },\n\n // lets you call a css selector with a guard\n matchCondition(args, context) {\n const lastSelector = this.se lectors[this.selectors.length - 1];\n if (!lastSelector.evaldCondition) { \n return false;\n }\n if (lastSelector.condition &&\n !lastSelector.condition.eval(\n new contexts.Eval(cont ext,\n context.frames))) {\n return false;\n }\n return true;\n },\n\n resetCache() {\n this._rulesets = null;\n this._variables = null;\n this._properties = null;\n this._lookups = {};\n },\n\n variables() {\n if (!this._variabl es) {\n this._variables = !this.rules ? {} : this.rules.reduce(functi on (hash, r) {\n if (r instanceof Declaration && r.variable === t rue) {\n hash[r.name] = r;\n }\n // when evaluating variables in an import statement, imports have not been eva l'd\n // so we need to go inside import statements.\n // guard against root being a string (in the case of inlined less)\n if (r.type === 'Import' && r.root && r.root.variables) {\n const vars = r.root.variables();\n for (const name in v ars) {\n if (vars.hasOwnProperty(name)) {\n hash[name] = r.root.variable(name);\n }\n }\n }\n return hash;\n }, {});\n }\n return this._variables;\n },\n\n properties( ) {\n if (!this._properties) {\n this._properties = !this.rule s ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceo f Declaration && r.variable !== true) {\n const name = (r.nam e.length === 1) && (r.name[0] instanceof Keyword) ?\n r.n ame[0].value : r.name;\n // Properties don't overwrite as the y can merge\n if (!hash[`$${name}`]) {\n hash[`$${name}`] = [ r ];\n }\n else {\ n hash[`$${name}`].push(r);\n }\n }\n return hash;\n }, {});\n }\n return this._properties;\n },\n\n variable(name) {\n const decl = this.variables()[name];\n if (decl) {\n return this.parseVa lue(decl);\n }\n },\n\n property(name) {\n const decl = this .properties()[name];\n if (decl) {\n return this.parseValue(de cl);\n }\n },\n\n lastDeclaration() {\n for (let i = this.ru les.length; i > 0; i--) {\n const decl = this.rules[i - 1];\n if (decl instanceof Declaration) {\n return this.parseValue(d ecl);\n }\n }\n },\n\n parseValue(toParse) {\n co nst self = this;\n function transformDeclaration(decl) {\n if (decl.value instanceof Anonymous && !decl.parsed) {\n if (typeof decl.value.value === 'string') {\n this.parse.parseNode(\n decl.value.value,\n ['value', 'impor tant'], \n decl.value.getIndex(), \n decl.fileInfo(), \n function(err, result) {\n if (err) {\n decl.parsed = tru e;\n }\n if (result) {\n decl.value = result[0];\n decl.important = result[1] || '';\n decl.p arsed = true;\n }\n });\n } else {\n decl.parsed = true;\n }\ n\n return decl;\n }\n else {\n return decl;\n }\n }\n if (!Array.isArray(toParse)) {\n return transformDeclaration.call(self, toParse);\n }\n else {\n const nodes = [];\n toParse.forEach(function (n) {\n nodes.push(transformDeclaration.call(self, n));\n });\n return nodes;\n }\n },\n\n rulesets() {\n if (!this.rules) { return []; }\n\n const filtRules = [];\n con st rules = this.rules;\n let i;\n let rule;\n\n for (i = 0; (rule = rules[i]); i++) {\n if (rule.isRuleset) {\n f iltRules.push(rule);\n }\n }\n\n return filtRules;\n },\n\n prependRule(rule) {\n const rules = this.rules;\n if (r ules) {\n rules.unshift(rule);\n } else {\n this.ru les = [ rule ];\n }\n this.setParent(rule, this);\n },\n\n f ind(selector, self, filter) {\n self = self || this;\n const rules = [];\n let match;\n let foundMixins;\n const key = select or.toCSS();\n\n if (key in this._lookups) { return this._lookups[key]; }\ n\n this.rulesets().forEach(function (rule) {\n if (rule !== s elf) {\n for (let j = 0; j < rule.selectors.length; j++) {\n match = selector.match(rule.selectors[j]);\n i f (match) {\n if (selector.elements.length > match) {\n if (!filter || filter(rule)) {\n foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter);\n for (let i = 0; i < foundMixins. length; ++i) {\n foundMixins[i].path.push(rul e);\n }\n Array.pr ototype.push.apply(rules, foundMixins);\n }\n } else {\n rules.push({ rule, path: [ ]});\n }\n break;\n }\n }\n }\n });\n this._lookups[key ] = rules;\n return rules;\n },\n\n genCSS(context, output) {\n let i;\n let j;\n const charsetRuleNodes = [];\n let ru leNodes = [];\n\n let // Line number debugging\n debugInfo;\n\ n let rule;\n let path;\n\n context.tabLevel = (context.tab Level || 0);\n\n if (!this.root) {\n context.tabLevel++;\n }\n\n const tabRuleStr = context.compress ? '' : Array(context.tabLev el + 1).join(' ');\n const tabSetStr = context.compress ? '' : Array(con text.tabLevel).join(' ');\n let sep;\n\n let charsetNodeIndex = 0 ;\n let importNodeIndex = 0;\n for (i = 0; (rule = this.rules[i]); i++) {\n if (rule instanceof Comment) {\n if (importN odeIndex === i) {\n importNodeIndex++;\n }\n ruleNodes.push(rule);\n } else if (rule.isCharset && ru le.isCharset()) {\n ruleNodes.splice(charsetNodeIndex, 0, rule);\ n charsetNodeIndex++;\n importNodeIndex++;\n } else if (rule.type === 'Import') {\n ruleNodes.splice(imp ortNodeIndex, 0, rule);\n importNodeIndex++;\n } else {\n ruleNodes.push(rule);\n }\n }\n rule Nodes = charsetRuleNodes.concat(ruleNodes);\n\n // If this is the root no de, we don't render\n // a selector, or {}.\n if (!this.root) {\n debugInfo = getDebugInfo(context, this, tabSetStr);\n\n if (debugInfo) {\n output.add(debugInfo);\n output.a dd(tabSetStr);\n }\n\n const paths = this.paths;\n const pathCnt = paths.length;\n let pathSubCnt;\n\n se p = context.compress ? ',' : (`,\\n${tabSetStr}`);\n\n for (i = 0; i < pathCnt; i++) {\n path = paths[i];\n if (!(pathS ubCnt = path.length)) { continue; }\n if (i > 0) { output.add(sep ); }\n\n context.firstSelector = true;\n path[0].g enCSS(context, output);\n\n context.firstSelector = false;\n for (j = 1; j < pathSubCnt; j++) {\n path[j].genCS S(context, output);\n }\n }\n\n output.add( (context.compress ? '{' : ' {\\n') + tabRuleStr);\n }\n\n // Compi le rules and rulesets\n for (i = 0; (rule = ruleNodes[i]); i++) {\n\n if (i + 1 === ruleNodes.length) {\n context.lastRule = tr ue;\n }\n\n const currentLastRule = context.lastRule;\n if (rule.isRulesetLike(rule)) {\n context.lastRule = fal se;\n }\n\n if (rule.genCSS) {\n rule.genCS S(context, output);\n } else if (rule.value) {\n outpu t.add(rule.value.toString());\n }\n\n context.lastRule = c urrentLastRule;\n\n if (!context.lastRule && rule.isVisible()) {\n output.add(context.compress ? '' : (`\\n${tabRuleStr}`));\n } else {\n context.lastRule = false;\n }\n }\n\n if (!this.root) {\n output.add((context.compress ? '}' : `\\n${tabSetStr}}`));\n context.tabLevel--;\n }\n\n if (!output.isEmpty() && !context.compress && this.firstRoot) {\n outpu t.add('\\n');\n }\n },\n\n joinSelectors(paths, context, selectors) {\n for (let s = 0; s < selectors.length; s++) {\n this.joinS elector(paths, context, selectors[s]);\n }\n },\n\n joinSelector(pa ths, context, selector) {\n\n function createParenthesis(elementsToPak, o riginalElement) {\n let replacementParen, j;\n if (element sToPak.length === 0) {\n replacementParen = new Paren(elementsToP ak[0]);\n } else {\n const insideParent = new Array(el ementsToPak.length);\n for (j = 0; j < elementsToPak.length; j++) {\n insideParent[j] = new Element(\n null,\n elementsToPak[j],\n origin alElement.isVariable,\n originalElement._index,\n originalElement._fileInfo\n );\n }\n replacementParen = new Paren(new Selector(insideParent));\ n }\n return replacementParen;\n }\n\n funct ion createSelector(containedElement, originalElement) {\n let element , selector;\n element = new Element(null, containedElement, originalE lement.isVariable, originalElement._index, originalElement._fileInfo);\n selector = new Selector([element]);\n return selector;\n } \n\n // joins selector path from `beginningPath` with selector path in `a ddPath`\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns concatenated path\n function addReplacemen tIntoPath(beginningPath, addPath, replacedElement, originalSelector) {\n let newSelectorPath, lastSelector, newJoinedSelector;\n // our ne w selector path\n newSelectorPath = [];\n\n // construct t he joined selector - if & is the first thing this will be empty,\n // if not newJoinedSelector will be the last set of elements in the selector\n if (beginningPath.length > 0) {\n newSelectorPath = utils .copyArray(beginningPath);\n lastSelector = newSelectorPath.pop() ;\n newJoinedSelector = originalSelector.createDerived(utils.copy Array(lastSelector.elements));\n }\n else {\n newJoinedSelector = originalSelector.createDerived([]);\n }\n\n if (addPath.length > 0) {\n // /deep/ is a CSS4 selector - (removed, so should deprecate)\n // that is valid without anyt hing in front of it\n // so if the & does not have a combinator t hat is \"\" or \" \" then\n // and there is a combinator on the p arent, then grab that.\n // this also allows + a { & .b { .a & { ... though not sure why you would want to do that\n let combinato r = replacedElement.combinator;\n\n const parentEl = addPath[0].e lements[0];\n if (combinator.emptyOrWhitespace && !parentEl.combi nator.emptyOrWhitespace) {\n combinator = parentEl.combinator ;\n }\n // join the elements so far with the first part of the parent\n newJoinedSelector.elements.push(new Element (\n combinator,\n parentEl.value,\n replacedElement.isVariable,\n replacedElement._i ndex,\n replacedElement._fileInfo\n ));\n newJoinedSelector.elements = newJoinedSelector.elements.concat(addPat h[0].elements.slice(1));\n }\n\n // now add the joined sel ector - but only if it is not empty\n if (newJoinedSelector.elements. length !== 0) {\n newSelectorPath.push(newJoinedSelector);\n }\n\n // put together the parent selectors after the join (e.g . the rest of the parent)\n if (addPath.length > 1) {\n let restOfPath = addPath.slice(1);\n restOfPath = restOfPath.ma p(function (selector) {\n return selector.createDerived(selec tor.elements, []);\n });\n newSelectorPath = newSe lectorPath.concat(restOfPath);\n }\n return newSelectorPat h;\n }\n\n // joins selector path from `beginningPath` with every selector path in `addPaths` array\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns array with all concaten ated paths\n function addAllReplacementsIntoPath( beginningPath, addPaths , replacedElement, originalSelector, result) {\n let j;\n for (j = 0; j < beginningPath.length; j++) {\n const newSelectorP ath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, origin alSelector);\n result.push(newSelectorPath);\n }\n return result;\n }\n\n function mergeElementsOnToSelectors (elements, selectors) {\n let i, sel;\n\n if (elements.len gth === 0) {\n return ;\n }\n if (selectors .length === 0) {\n selectors.push([ new Selector(elements) ]);\n return;\n }\n\n for (i = 0; (sel = selector s[i]); i++) {\n // if the previous thing in sel is a parent this needs to join on to it\n if (sel.length > 0) {\n sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].e lements.concat(elements));\n }\n else {\n sel.push(new Selector(elements));\n }\n }\n }\n\n // replace all parent selectors inside `inSelector` by cont ent of `context` array\n // resulting selectors are returned inside `path s` array\n // returns true if `inSelector` contained at least one parent selector\n function replaceParentSelector(paths, context, inSelector) {\n // The paths are [[Selector]]\n // The first list is a li st of comma separated selectors\n // The inner list is a list of inhe ritance separated selectors\n // e.g.\n // .a, .b {\n // .c {\n // }\n // }\n // == [[.a] [.c]] [[.b] [.c]]\n //\n let i, j, k, currentElements, new Selectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, last Selector;\n function findNestedSelector(element) {\n l et maybeSelector;\n if (!(element.value instanceof Paren)) {\n return null;\n }\n\n maybeSelecto r = element.value.value;\n if (!(maybeSelector instanceof Selecto r)) {\n return null;\n }\n\n re turn maybeSelector;\n }\n\n // the elements from the curre nt selector so far\n currentElements = [];\n // the curren t list of new selectors to add to the path.\n // We will build it up. We initiate it with one empty selector as we \"multiply\" the new selectors\n // by the parents\n newSelectors = [\n []\n ];\n\n for (i = 0; (el = inSelector.elements[i]); i++) {\n // non parent reference elements just get added\n if (el.value !== '&') {\n const nestedSelector = findNestedS elector(el);\n if (nestedSelector != null) {\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n const nestedPaths = [];\n let replaced;\n const replacedNewSelectors = [];\n repla ced = replaceParentSelector(nestedPaths, context, nestedSelector);\n hadParentSelector = hadParentSelector || replaced;\n // the nestedPaths array should have only one member - replaceParentSele ctor does not multiply selectors\n for (k = 0; k < nested Paths.length; k++) {\n const replacementSelector = cr eateSelector(createParenthesis(nestedPaths[k], el), el);\n addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSele ctor, replacedNewSelectors);\n }\n newSelectors = replacedNewSelectors;\n currentElements = [];\n } else {\n currentElements.push (el);\n }\n\n } else {\n ha dParentSelector = true;\n // the new list of selectors to add \n selectorsMultiplied = [];\n\n // merge the current list of non parent selector elements\n // on to t he current list of selectors to add\n mergeElementsOnToSelect ors(currentElements, newSelectors);\n\n // loop through our c urrent selectors\n for (j = 0; j < newSelectors.length; j++) {\n sel = newSelectors[j];\n // if we don't have any parent paths, the & might be in a mixin so that it can be use d\n // whether there are parents or not\n if (context.length === 0) {\n // the combinat or used on el should now be applied to the next element instead so that\n // it is not lost\n if (sel.leng th > 0) {\n sel[0].elements.push(new Element(el.c ombinator, '', el.isVariable, el._index, el._fileInfo));\n }\n selectorsMultiplied.push(sel);\n }\n else {\n // a nd the parent selectors\n for (k = 0; k < context.len gth; k++) {\n // We need to put the current selec tors\n // then join the last selector's elements on to the parents selectors\n const newSelectorPa th = addReplacementIntoPath(sel, context[k], el, inSelector);\n // add that to our new set of selectors\n selectorsMultiplied.push(newSelectorPath);\n }\n }\n }\n\n // ou r new selectors has been multiplied, so reset the state\n new Selectors = selectorsMultiplied;\n currentElements = [];\n }\n }\n\n // if we have any elements left ove r (e.g. .a& .b == .b)\n // add them on to all the current selectors\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n for (i = 0; i < newSelectors.length; i++) {\n length = newS electors[i].length;\n if (length > 0) {\n path s.push(newSelectors[i]);\n lastSelector = newSelectors[i][len gth - 1];\n newSelectors[i][length - 1] = lastSelector.create Derived(lastSelector.elements, inSelector.extendList);\n }\n }\n\n return hadParentSelector;\n }\n\n function deriveSelector(visibilityInfo, deriveFrom) {\n const newSelector = d eriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.e valdCondition);\n newSelector.copyVisibilityInfo(visibilityInfo);\n return newSelector;\n }\n\n // joinSelector code follows \n let i, newPaths, hadParentSelector;\n\n newPaths = [];\n hadParentSelector = replaceParentSelector(newPaths, context, selector);\n\n if (!hadParentSelector) {\n if (context.length > 0) {\n newPaths = [];\n for (i = 0; i < context.length; i++) {\n\n const concatenated = context[i].map(deriveSelector.bind(this , selector.visibilityInfo()));\n\n concatenated.push(selector );\n newPaths.push(concatenated);\n }\n }\n else {\n newPaths = [[selector]];\n }\n }\n\n for (i = 0; i < newPaths.length; i++) {\n p aths.push(newPaths[i]);\n }\n\n }\n});\n\nexport default Ruleset;\n"," import Node from './node';\nimport Selector from './selector';\nimport Ruleset f rom './ruleset';\nimport Anonymous from './anonymous';\n\nconst AtRule = functio n(\n name,\n value,\n rules,\n index,\n currentFileInfo,\n deb ugInfo,\n isRooted,\n visibilityInfo\n) {\n let i;\n\n this.name = name;\n this.value = (value instanceof Node) ? value : (value ? new Anonymous (value) : value);\n if (rules) {\n if (Array.isArray(rules)) {\n this.rules = rules;\n } else {\n this.rules = [rules];\n this.rules[0].selectors = (new Selector([], null, null, index, curre ntFileInfo)).createEmptySelectors();\n }\n for (i = 0; i < this.ru les.length; i++) {\n this.rules[i].allowImports = true;\n }\n this.setParent(this.rules, this);\n }\n this._index = index;\n t his._fileInfo = currentFileInfo;\n this.debugInfo = debugInfo;\n this.isRo oted = isRooted || false;\n this.copyVisibilityInfo(visibilityInfo);\n thi s.allowRoot = true;\n}\n\nAtRule.prototype = Object.assign(new Node(), {\n ty pe: 'AtRule',\n accept(visitor) {\n const value = this.value, rules = this.rules;\n if (rules) {\n this.rules = visitor.visitArray(r ules);\n }\n if (value) {\n this.value = visitor.visit( value);\n }\n },\n\n isRulesetLike() {\n return this.rules | | !this.isCharset();\n },\n\n isCharset() {\n return '@charset' === this.name;\n },\n\n genCSS(context, output) {\n const value = this .value, rules = this.rules;\n output.add(this.name, this.fileInfo(), this .getIndex());\n if (value) {\n output.add(' ');\n v alue.genCSS(context, output);\n }\n if (rules) {\n this .outputRuleset(context, output, rules);\n } else {\n output.ad d(';');\n }\n },\n\n eval(context) {\n let mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules;\n\n // media s tored inside other atrule should not bubble over it\n // backpup media bu bbling information\n mediaPathBackup = context.mediaPath;\n mediaB locksBackup = context.mediaBlocks;\n // deleted media bubbling informatio n\n context.mediaPath = [];\n context.mediaBlocks = [];\n\n if (value) {\n value = value.eval(context);\n }\n if ( rules) {\n // assuming that there is only one rule at this point - th at is how parser constructs the rule\n rules = [rules[0].eval(context )];\n rules[0].root = true;\n }\n // restore media bubb ling information\n context.mediaPath = mediaPathBackup;\n context. mediaBlocks = mediaBlocksBackup;\n\n return new AtRule(this.name, value, rules,\n this.getIndex(), this.fileInfo(), this.debugInfo, this.isRoo ted, this.visibilityInfo());\n },\n\n variable(name) {\n if (this.r ules) {\n // assuming that there is only one rule at this point - tha t is how parser constructs the rule\n return Ruleset.prototype.variab le.call(this.rules[0], name);\n }\n },\n\n find() {\n if (th is.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.fi nd.apply(this.rules[0], arguments);\n }\n },\n\n rulesets() {\n if (this.rules) {\n // assuming that there is only one rule at th is point - that is how parser constructs the rule\n return Ruleset.pr ototype.rulesets.apply(this.rules[0]);\n }\n },\n\n outputRuleset(c ontext, output, rules) {\n const ruleCnt = rules.length;\n let i;\ n context.tabLevel = (context.tabLevel | 0) + 1;\n\n // Compressed \n if (context.compress) {\n output.add('{');\n for (i = 0; i < ruleCnt; i++) {\n rules[i].genCSS(context, output);\ n }\n output.add('}');\n context.tabLevel--;\n return;\n }\n\n // Non-compressed\n const tabSet Str = `\\n${Array(context.tabLevel).join(' ')}`, tabRuleStr = `${tabSetStr} `; \n if (!ruleCnt) {\n output.add(` {${tabSetStr}}`);\n } else {\n output.add(` {${tabRuleStr}`);\n rules[0].genCSS (context, output);\n for (i = 1; i < ruleCnt; i++) {\n output.add(tabRuleStr);\n rules[i].genCSS(context, output);\n }\n output.add(`${tabSetStr}}`);\n }\n\n conte xt.tabLevel--;\n }\n});\n\nexport default AtRule;\n","import Node from './nod e';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\n const DetachedRuleset = function(ruleset, frames) {\n this.ruleset = ruleset; \n this.frames = frames;\n this.setParent(this.ruleset, this);\n};\n\nDeta chedRuleset.prototype = Object.assign(new Node(), {\n type: 'DetachedRuleset' ,\n evalFirst: true,\n\n accept(visitor) {\n this.ruleset = visitor .visit(this.ruleset);\n },\n\n eval(context) {\n const frames = thi s.frames || utils.copyArray(context.frames);\n return new DetachedRuleset (this.ruleset, frames);\n },\n\n callEval(context) {\n return this. ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context .frames)) : context);\n }\n});\n\nexport default DetachedRuleset;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nim port * as utils from '../utils';\n\nconst Unit = function(numerator, denominator , backupUnit) {\n this.numerator = numerator ? utils.copyArray(numerator).sor t() : [];\n this.denominator = denominator ? utils.copyArray(denominator).sor t() : [];\n if (backupUnit) {\n this.backupUnit = backupUnit;\n } e lse if (numerator && numerator.length) {\n this.backupUnit = numerator[0] ;\n }\n};\n\nUnit.prototype = Object.assign(new Node(), {\n type: 'Unit',\ n\n clone() {\n return new Unit(utils.copyArray(this.numerator), utils .copyArray(this.denominator), this.backupUnit);\n },\n\n genCSS(context, o utput) {\n // Dimension checks the unit is singular and throws an error i f in strict math mode.\n const strictUnits = context && context.strictUni ts;\n if (this.numerator.length === 1) {\n output.add(this.num erator[0]); // the ideal situation\n } else if (!strictUnits && this.back upUnit) {\n output.add(this.backupUnit);\n } else if (!strictU nits && this.denominator.length) {\n output.add(this.denominator[0]); \n }\n },\n\n toString() {\n let i, returnStr = this.numerat or.join('*');\n for (i = 0; i < this.denominator.length; i++) {\n returnStr += `/${this.denominator[i]}`;\n }\n return returnStr ;\n },\n\n compare(other) {\n return this.is(other.toString()) ? 0 : undefined;\n },\n\n is(unitString) {\n return this.toString().toU pperCase() === unitString.toUpperCase();\n },\n\n isLength() {\n re turn RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test( this.toCSS());\n },\n\n isEmpty() {\n return this.numerator.length === 0 && this.denominator.length === 0;\n },\n\n isSingular() {\n r eturn this.numerator.length <= 1 && this.denominator.length === 0;\n },\n\n map(callback) {\n let i;\n\n for (i = 0; i < this.numerator.leng th; i++) {\n this.numerator[i] = callback(this.numerator[i], false);\ n }\n\n for (i = 0; i < this.denominator.length; i++) {\n this.denominator[i] = callback(this.denominator[i], true);\n }\n }, \n\n usedUnits() {\n let group;\n const result = {};\n l et mapUnit;\n let groupName;\n\n mapUnit = function (atomicUnit) { \n /* jshint loopfunc:true */\n if (group.hasOwnProperty(a tomicUnit) && !result[groupName]) {\n result[groupName] = atomicU nit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in unitConversions) {\n if (unitConversions.hasOwnPropert y(groupName)) {\n group = unitConversions[groupName];\n\n this.map(mapUnit);\n }\n }\n\n return result;\n },\n\n cancel() {\n const counter = {};\n let atomicUnit;\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n atomicUnit = this.numerator[i];\n counter[atomicUnit] = (counter [atomicUnit] || 0) + 1;\n }\n\n for (i = 0; i < this.denominator.l ength; i++) {\n atomicUnit = this.denominator[i];\n counte r[atomicUnit] = (counter[atomicUnit] || 0) - 1;\n }\n\n this.numer ator = [];\n this.denominator = [];\n\n for (atomicUnit in counter ) {\n if (counter.hasOwnProperty(atomicUnit)) {\n cons t count = counter[atomicUnit];\n\n if (count > 0) {\n for (i = 0; i < count; i++) {\n this.numerator.pu sh(atomicUnit);\n }\n } else if (count < 0) {\ n for (i = 0; i < -count; i++) {\n thi s.denominator.push(atomicUnit);\n }\n }\n }\n }\n\n this.numerator.sort();\n this.denominator. sort();\n }\n});\n\nexport default Unit;\n","import Node from './node';\nimpo rt unitConversions from '../data/unit-conversions';\nimport Unit from './unit';\ nimport Color from './color';\n\n//\n// A number with a unit\n//\nconst Dimensio n = function(value, unit) {\n this.value = parseFloat(value);\n if (isNaN( this.value)) {\n throw new Error('Dimension is not a number.');\n }\n this.unit = (unit && unit instanceof Unit) ? unit :\n new Unit(unit ? [unit] : undefined);\n this.setParent(this.unit, this);\n};\n\nDimension.prot otype = Object.assign(new Node(), {\n type: 'Dimension',\n\n accept(visito r) {\n this.unit = visitor.visit(this.unit);\n },\n\n eval(context) {\n return this;\n },\n\n toColor() {\n return new Color([t his.value, this.value, this.value]);\n },\n\n genCSS(context, output) {\n if ((context && context.strictUnits) && !this.unit.isSingular()) {\n throw new Error(`Multiple units in dimension. Correct the units or use th e unit function. Bad unit: ${this.unit.toString()}`);\n }\n\n cons t value = this.fround(context, this.value);\n let strValue = String(value );\n\n if (value !== 0 && value < 0.000001 && value > -0.000001) {\n // would be output 1e-6 etc.\n strValue = value.toFixed(20).re place(/0+$/, '');\n }\n\n if (context && context.compress) {\n // Zero values doesn't need a unit\n if (value === 0 && this. unit.isLength()) {\n output.add(strValue);\n retur n;\n }\n\n // Float values doesn't need a leading zero\n if (value > 0 && value < 1) {\n strValue = (strValue).s ubstr(1);\n }\n }\n\n output.add(strValue);\n th is.unit.genCSS(context, output);\n },\n\n // In an operation between two D imensions,\n // we default to the first Dimension's unit,\n // so `1px + 2 ` will yield `3px`.\n operate(context, op, other) {\n /* jshint noempt y:false */\n let value = this._operate(context, op, this.value, other.val ue);\n let unit = this.unit.clone();\n\n if (op === '+' || op === '-') {\n if (unit.numerator.length === 0 && unit.denominator.length = == 0) {\n unit = other.unit.clone();\n if (this.un it.backupUnit) {\n unit.backupUnit = this.unit.backupUnit;\n }\n } else if (other.unit.numerator.length === 0 && un it.denominator.length === 0) {\n // do nothing\n } els e {\n other = other.convertTo(this.unit.usedUnits());\n\n if (context.strictUnits && other.unit.toString() !== unit.toString()) {\ n throw new Error(`Incompatible units. Change the units or us e the unit function. `\n + `Bad units: '${unit.toString() }' and '${other.unit.toString()}'.`);\n }\n\n valu e = this._operate(context, op, this.value, other.value);\n }\n } else if (op === '*') {\n unit.numerator = unit.numerator.concat(ot her.unit.numerator).sort();\n unit.denominator = unit.denominator.con cat(other.unit.denominator).sort();\n unit.cancel();\n } else if (op === '/') {\n unit.numerator = unit.numerator.concat(other.unit .denominator).sort();\n unit.denominator = unit.denominator.concat(ot her.unit.numerator).sort();\n unit.cancel();\n }\n retu rn new Dimension(value, unit);\n },\n\n compare(other) {\n let a, b ;\n\n if (!(other instanceof Dimension)) {\n return undefined; \n }\n\n if (this.unit.isEmpty() || other.unit.isEmpty()) {\n a = this;\n b = other;\n } else {\n a = this .unify();\n b = other.unify();\n if (a.unit.compare(b.unit ) !== 0) {\n return undefined;\n }\n }\n\n return Node.numericCompare(a.value, b.value);\n },\n\n unify() {\n return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });\n }, \n\n convertTo(conversions) {\n let value = this.value;\n const unit = this.unit.clone();\n let i;\n let groupName;\n let group;\n let targetUnit;\n let derivedConversions = {};\n l et applyUnit;\n\n if (typeof conversions === 'string') {\n for (i in unitConversions) {\n if (unitConversions[i].hasOwnProperty (conversions)) {\n derivedConversions = {};\n derivedConversions[i] = conversions;\n }\n }\n conversions = derivedConversions;\n }\n applyUnit = functi on (atomicUnit, denominator) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit)) {\n if (denominator) {\ n value = value / (group[atomicUnit] / group[targetUnit]);\n } else {\n value = value * (group[atomicUnit] / group[targetUnit]);\n }\n\n return targetUnit;\n }\n\n return atomicUnit;\n };\n\n for (grou pName in conversions) {\n if (conversions.hasOwnProperty(groupName)) {\n targetUnit = conversions[groupName];\n group = unitConversions[groupName];\n\n unit.map(applyUnit);\n }\n }\n\n unit.cancel();\n\n return new Dimension(value, unit);\n }\n});\n\nexport default Dimension;\n","import Node from './node';\n import Color from './color';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\n\nconst Operatio n = function(op, operands, isSpaced) {\n this.op = op.trim();\n this.opera nds = operands;\n this.isSpaced = isSpaced;\n};\n\nOperation.prototype = Obje ct.assign(new Node(), {\n type: 'Operation',\n\n accept(visitor) {\n this.operands = visitor.visitArray(this.operands);\n },\n\n eval(context ) {\n let a = this.operands[0].eval(context), b = this.operands[1].eval(c ontext), op;\n\n if (context.isMathOn(this.op)) {\n op = this. op === './' ? '/' : this.op;\n if (a instanceof Dimension && b instan ceof Color) {\n a = a.toColor();\n }\n if ( b instanceof Dimension && a instanceof Color) {\n b = b.toColor() ;\n }\n if (!a.operate || !b.operate) {\n i f (\n (a instanceof Operation || b instanceof Operation)\n && a.op === '/' && context.math === MATH.PARENS_DIVISION\n ) {\n return new Operation(this.op, [a, b], this.i sSpaced);\n }\n throw { type: 'Operation',\n message: 'Operation on an invalid type' };\n }\n\n return a.operate(context, op, b);\n } else {\n return n ew Operation(this.op, [a, b], this.isSpaced);\n }\n },\n\n genCSS(c ontext, output) {\n this.operands[0].genCSS(context, output);\n if (this.isSpaced) {\n output.add(' ');\n }\n output.add( this.op);\n if (this.isSpaced) {\n output.add(' ');\n } \n this.operands[1].genCSS(context, output);\n }\n});\n\nexport defaul t Operation;\n","import Node from './node';\nimport Paren from './paren';\nimpor t Comment from './comment';\nimport Dimension from './dimension';\n\nconst Expre ssion = function(value, noSpacing) {\n this.value = value;\n this.noSpacin g = noSpacing;\n if (!value) {\n throw new Error('Expression requires an array parameter');\n }\n};\n\nExpression.prototype = Object.assign(new Nod e(), {\n type: 'Expression',\n\n accept(visitor) {\n this.value = v isitor.visitArray(this.value);\n },\n\n eval(context) {\n let retur nValue;\n const mathOn = context.isMathOn();\n const inParenthesis = this.parens;\n\n let doubleParen = false;\n if (inParenthesis) {\n context.inParenthesis();\n }\n if (this.value.lengt h > 1) {\n returnValue = new Expression(this.value.map(function (e) { \n if (!e.eval) {\n return e;\n }\n return e.eval(context);\n }), this.noSpacing);\n } else if (this.value.length === 1) {\n if (this.value[0].pare ns && !this.value[0].parensInOp && !context.inCalc) {\n doublePar en = true;\n }\n returnValue = this.value[0].eval(context) ;\n } else {\n returnValue = this;\n }\n if (inP arenthesis) {\n context.outOfParenthesis();\n }\n if (t his.parens && this.parensInOp && !mathOn && !doubleParen \n && (!(ret urnValue instanceof Dimension))) {\n returnValue = new Paren(returnVa lue);\n }\n return returnValue;\n },\n\n genCSS(context, out put) {\n for (let i = 0; i < this.value.length; i++) {\n this. value[i].genCSS(context, output);\n if (!this.noSpacing && i + 1 < th is.value.length) {\n output.add(' ');\n }\n }\n },\n\n throwAwayComments() {\n this.value = this.value.filter(func tion(v) {\n return !(v instanceof Comment);\n });\n }\n});\ n\nexport default Expression;\n","import Expression from '../tree/expression';\n \nclass functionCaller {\n constructor(name, context, index, currentFileInfo) {\n this.name = name.toLowerCase();\n this.index = index;\n this.context = context;\n this.currentFileInfo = currentFileInfo;\n\n this.func = context.frames[0].functionRegistry.get(this.name);\n }\n\n isValid() {\n return Boolean(this.func);\n }\n\n call(args) {\n if (!(Array.isArray(args))) {\n args = [args];\n }\n const evalArgs = this.func.evalArgs;\n if (evalArgs !== false) {\n args = args.map(a => a.eval(this.context));\n }\n const commentFilter = item => !(item.type === 'Comment');\n\n // This code is t errible and should be replaced as per this issue...\n // https://github.c om/less/less.js/issues/2477\n args = args\n .filter(commentFil ter)\n .map(item => {\n if (item.type === 'Expression' ) {\n const subNodes = item.value.filter(commentFilter);\n if (subNodes.length === 1) {\n // https: //github.com/less/less.js/issues/3616\n if (item.parens & & subNodes[0].op === '/') {\n return item;\n }\n return subNodes[0];\n } else {\n return new Expression(subNodes);\n }\n }\n return item;\n });\n \n if (evalArgs === false) {\n return this.func(this.context, ...args);\n }\n\n return this.func(...args);\n }\n}\n\nexport d efault functionCaller;\n","/*! ************************************************* ****************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPerm ission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDI NG ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL T HE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAG ES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHE THER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING O UT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***** ************************************************************************ */\r\n/ * global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceo f Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; } ;\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b ) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new Typ eError(\"Class extends value \" + String(b) + \" is not a constructor or null\") ;\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, n ew __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Objec t.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.l ength; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\ r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n }\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \ "function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.pro pertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typ eof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Refl ect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators .length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(t arget, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.define Property(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, dec orator) {\r\n return function (target, key) { decorator(target, key, paramInd ex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\" ) return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport functi on __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"th row\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, reject ed); }\r\n step((generator = generator.apply(thisArg, _arguments || [])). next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1] ; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw \": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol. iterator] = function() { return this; }), g;\r\n function verb(n) { return fu nction (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while ( _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call (y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.valu e];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; b reak;\r\n case 4: _.label++; return { value: op[1], done: false } ;\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n d efault:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\ r\n _.trys.pop(); continue;\r\n }\r\n o p = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finall y { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\ n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m [k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k; \r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call( o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\ ") return {\r\n next: function () {\r\n if (o && i >= o.length ) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symb ol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) r eturn o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r \n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\ r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\ r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n \r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]) );\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadA rrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r \n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadAr ray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[ i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || from);\r\n}\r\ n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this. v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(this Arg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeEr ror(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(th isArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb( \"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return thi s; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Pr omise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.va lue.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(val ue) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\ ", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resum e(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { t hrow e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n }\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) th row new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Sy mbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \ "function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\ "throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this ; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Prom ise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v. value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve (v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\ nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.definePro perty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked .raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object .create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enume rable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\ n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createB inding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return re sult;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && m od.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPriv ateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw n ew TypeError(\"Private accessor was defined without a getter\");\r\n if (type of state === \"function\" ? receiver !== state || !f : !state.has(receiver)) thr ow new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(recei ver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPri vateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(re ceiver)) throw new TypeError(\"Cannot write private member to an object whose cl ass did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, valu e) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","import Node from './node';\nimport Anonymous from './anonymous';\nimport FunctionCalle r from '../functions/function-caller';\n\n//\n// A function call node.\n//\ncons t Call = function(name, args, index, currentFileInfo) {\n this.name = name;\n this.args = args;\n this.calc = name === 'calc';\n this._index = index ;\n this._fileInfo = currentFileInfo;\n}\n\nCall.prototype = Object.assign(ne w Node(), {\n type: 'Call',\n\n accept(visitor) {\n if (this.args) {\n this.args = visitor.visitArray(this.args);\n }\n },\n\n //\n // When evaluating a function call,\n // we either find the funct ion in the functionRegistry,\n // in which case we call it, passing the eval uated arguments,\n // if this returns null or we cannot find the function, we \n // simply print it out as it appeared originally [2].\n //\n // The reason why we evaluate the arguments, is in the case where\n // we try to pas s a variable to a function, like: `saturate(@color)`.\n // The function shoul d receive the value, not the variable.\n //\n eval(context) {\n /** \n * Turn off math for calc(), and switch back on for evaluating nested functions\n */\n const currentMathContext = context.mathOn;\n context.mathOn = !this.calc;\n if (this.calc || context.inCalc) {\n context.enterCalc();\n }\n\n const exitCalc = () => {\n if (this.calc || context.inCalc) {\n context.exitCalc( );\n }\n context.mathOn = currentMathContext;\n };\ n\n let result;\n const funcCaller = new FunctionCaller(this.name, context, this.getIndex(), this.fileInfo());\n\n if (funcCaller.isValid() ) {\n try {\n result = funcCaller.call(this.args);\n exitCalc();\n } catch (e) {\n if (e.hasO wnProperty('line') && e.hasOwnProperty('column')) {\n throw e ;\n }\n throw { \n type: e.type || 'Runtime',\n message: `Error evaluating function \\`${thi s.name}\\`${e.message ? `: ${e.message}` : ''}`,\n index: thi s.getIndex(), \n filename: this.fileInfo().filename,\n line: e.lineNumber,\n column: e.columnNumber\n };\n }\n }\n\n if (result !== null && res ult !== undefined) {\n // Results that that are not nodes are cast as Anonymous nodes\n // Falsy values or booleans are returned as empty nodes\n if (!(result instanceof Node)) {\n if (!result || result === true) {\n result = new Anonymous(null); \n }\n else {\n result = new Anonymou s(result.toString()); \n }\n \n }\n result._index = this._index;\n result._fileInfo = this._fileI nfo;\n return result;\n }\n\n const args = this.args.ma p(a => a.eval(context));\n exitCalc();\n\n return new Call(this.na me, args, this.getIndex(), this.fileInfo());\n },\n\n genCSS(context, outp ut) {\n output.add(`${this.name}(`, this.fileInfo(), this.getIndex());\n\ n for (let i = 0; i < this.args.length; i++) {\n this.args[i]. genCSS(context, output);\n if (i + 1 < this.args.length) {\n output.add(', ');\n }\n }\n\n output.add(')');\n }\n});\n\nexport default Call;\n","import Node from './node';\nimport Call f rom './call';\n\nconst Variable = function(name, index, currentFileInfo) {\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInf o;\n};\n\nVariable.prototype = Object.assign(new Node(), {\n type: 'Variable' ,\n\n eval(context) {\n let variable, name = this.name;\n\n if (name.indexOf('@@') === 0) {\n name = `@${new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value}`;\n }\n\n if (this.evaluating) {\n throw { type: 'Name',\n messa ge: `Recursive variable definition for ${name}`,\n filename: this .fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n variable = this.find(context.frames, f unction (frame) {\n const v = frame.variable(name);\n if ( v) {\n if (v.important) {\n const importantSco pe = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n // If in calc, wrap vars in a function call to cascade evaluate args first\n if (context.inCalc) {\n return (new Call('_SELF' , [v.value])).eval(context);\n }\n else {\n return v.value.eval(context);\n }\n }\n });\n if (variable) {\n this.evaluating = false;\n return variable;\n } else {\n throw { type: 'Name',\n message: `variable ${name} is undefined`,\n filename : this.fileInfo().filename,\n index: this.getIndex() };\n }\n },\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i+ +) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n});\n\nexport default Variable;\n","impo rt Node from './node';\nimport Declaration from './declaration';\n\nconst Proper ty = function(name, index, currentFileInfo) {\n this.name = name;\n this._ index = index;\n this._fileInfo = currentFileInfo;\n};\n\nProperty.prototype = Object.assign(new Node(), {\n type: 'Property',\n\n eval(context) {\n let property;\n const name = this.name;\n // TODO: shorten th is reference\n const mergeRules = context.pluginManager.less.visitors.ToC SSVisitor.prototype._mergeRules;\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive property reference fo r ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n property = this.find(context.frames, function (frame) {\n let v; \n const vArr = frame.property(name);\n if (vArr) {\n for (let i = 0; i < vArr.length; i++) {\n v = vArr [i];\n\n vArr[i] = new Declaration(v.name,\n v.value,\n v.important,\n v .merge,\n v.index,\n v.currentFile Info,\n v.inline,\n v.variable\n );\n }\n mergeRules(vArr);\n\n v = vArr[vArr.length - 1];\n if (v.important) {\n const importantScope = context.importantScope[context.importan tScope.length - 1];\n importantScope.important = v.important; \n }\n v = v.value.eval(context);\n return v;\n }\n });\n if (property) {\n thi s.evaluating = false;\n return property;\n } else {\n throw { type: 'Name',\n message: `Property '${name}' is undefi ned`,\n filename: this.currentFileInfo.filename,\n index: this.index };\n }\n },\n\n find(obj, fun) {\n for (l et i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n});\n\nex port default Property;\n","import Node from './node';\n\nconst Attribute = funct ion(key, op, value, cif) {\n this.key = key;\n this.op = op;\n this.val ue = value;\n this.cif = cif;\n}\n\nAttribute.prototype = Object.assign(new N ode(), {\n type: 'Attribute',\n\n eval(context) {\n return new Attr ibute(\n this.key.eval ? this.key.eval(context) : this.key,\n this.op,\n (this.value && this.value.eval) ? this.value.eval(cont ext) : this.value,\n this.cif\n );\n },\n\n genCSS(conte xt, output) {\n output.add(this.toCSS(context));\n },\n\n toCSS(con text) {\n let value = this.key.toCSS ? this.key.toCSS(context) : this.key ;\n\n if (this.op) {\n value += this.op;\n value += (this.value.toCSS ? this.value.toCSS(context) : this.value);\n }\n\n if (this.cif) {\n value = value + \" \" + this.cif;\n }\n\ n return `[${value}]`;\n }\n});\n\nexport default Attribute;\n","impor t Node from './node';\nimport Variable from './variable';\nimport Property from './property';\n\n\nconst Quoted = function(str, content, escaped, index, current FileInfo) {\n this.escaped = (escaped == null) ? true : escaped;\n this.va lue = content || '';\n this.quote = str.charAt(0);\n this._index = index;\ n this._fileInfo = currentFileInfo;\n this.variableRegex = /@\\{([\\w-]+)\ \}/g;\n this.propRegex = /\\$\\{([\\w-]+)\\}/g;\n this.allowRoot = escaped ;\n};\n\nQuoted.prototype = Object.assign(new Node(), {\n type: 'Quoted',\n\n genCSS(context, output) {\n if (!this.escaped) {\n output. add(this.quote, this.fileInfo(), this.getIndex());\n }\n output.ad d(this.value);\n if (!this.escaped) {\n output.add(this.quote) ;\n }\n },\n\n containsVariables() {\n return this.value.mat ch(this.variableRegex);\n },\n\n eval(context) {\n const that = thi s;\n let value = this.value;\n const variableReplacement = functio n (_, name) {\n const v = new Variable(`@${name}`, that.getIndex(), t hat.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n const propertyReplacement = function (_, name) {\n const v = new Property(`$${name}`, that.getIndex(), tha t.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v .value : v.toCSS();\n };\n function iterativeReplace(value, regexp , replacementFnc) {\n let evaluatedValue = value;\n do {\n value = evaluatedValue.toString();\n evaluatedVal ue = value.replace(regexp, replacementFnc);\n } while (value !== eval uatedValue);\n return evaluatedValue;\n }\n value = ite rativeReplace(value, this.variableRegex, variableReplacement);\n value = iterativeReplace(value, this.propRegex, propertyReplacement);\n return ne w Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo());\n },\n\n compare(other) {\n // when comparing quo ted strings allow the quote to differ\n if (other.type === 'Quoted' && !t his.escaped && !other.escaped) {\n return Node.numericCompare(this.va lue, other.value);\n } else {\n return other.toCSS && this.toC SS() === other.toCSS() ? 0 : undefined;\n }\n }\n});\n\nexport default Quoted;\n","import Node from './node';\n\nfunction escapePath(path) {\n retu rn path.replace(/[\\(\\)'\"\\s]/g, function(match) { return `\\\\${match}`; });\ n}\n\nconst URL = function(val, index, currentFileInfo, isEvald) {\n this.val ue = val;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.isEvald = isEvald;\n};\n\nURL.prototype = Object.assign(new Node(), {\n type: 'Url',\n\n accept(visitor) {\n this.value = visitor.visit(this.v alue);\n },\n\n genCSS(context, output) {\n output.add('url(');\n this.value.genCSS(context, output);\n output.add(')');\n },\n\n eval(context) {\n const val = this.value.eval(context);\n let r ootpath;\n\n if (!this.isEvald) {\n // Add the rootpath if the URL requires a rewrite\n rootpath = this.fileInfo() && this.fileInfo ().rootpath;\n if (typeof rootpath === 'string' &&\n t ypeof val.value === 'string' &&\n context.pathRequiresRewrite(val .value)) {\n if (!val.quote) {\n rootpath = es capePath(rootpath);\n }\n val.value = context.rewr itePath(val.value, rootpath);\n } else {\n val.value = context.normalizePath(val.value);\n }\n\n // Add url args if enabled\n if (context.urlArgs) {\n if (!val.value. match(/^\\s*data:/)) {\n const delimiter = val.value.indexOf( '?') === -1 ? '?' : '&';\n const urlArgs = delimiter + contex t.urlArgs;\n if (val.value.indexOf('#') !== -1) {\n val.value = val.value.replace('#', `${urlArgs}#`);\n } else {\n val.value += urlArgs;\n }\n }\n }\n }\n\n return new URL(val, this.getIndex(), this.fileInfo(), true);\n }\n});\n\nexport default URL;\n", "import Ruleset from './ruleset';\nimport Value from './value';\nimport Selector from './selector';\nimport Anonymous from './anonymous';\nimport Expression fro m './expression';\nimport AtRule from './atrule';\nimport * as utils from '../ut ils';\n\nconst Media = function(value, features, index, currentFileInfo, visibil ityInfo) {\n this._index = index;\n this._fileInfo = currentFileInfo;\n\n const selectors = (new Selector([], null, null, this._index, this._fileInfo)) .createEmptySelectors();\n\n this.features = new Value(features);\n this.r ules = [new Ruleset(selectors, value)];\n this.rules[0].allowImports = true;\ n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n t his.setParent(selectors, this);\n this.setParent(this.features, this);\n t his.setParent(this.rules, this);\n};\n\nMedia.prototype = Object.assign(new AtRu le(), {\n type: 'Media',\n\n isRulesetLike() {\n return true;\n },\n\n accept(visitor) {\n if (this.features) {\n this.feat ures = visitor.visit(this.features);\n }\n if (this.rules) {\n this.rules = visitor.visitArray(this.rules);\n }\n },\n\n g enCSS(context, output) {\n output.add('@media ', this._fileInfo, this._in dex);\n this.features.genCSS(context, output);\n this.outputRulese t(context, output, this.rules);\n },\n\n eval(context) {\n if (!con text.mediaBlocks) {\n context.mediaBlocks = [];\n context. mediaPath = [];\n }\n\n const media = new Media(null, [], this._in dex, this._fileInfo, this.visibilityInfo());\n if (this.debugInfo) {\n this.rules[0].debugInfo = this.debugInfo;\n media.debugInfo = this.debugInfo;\n }\n \n media.features = this.features.e val(context);\n\n context.mediaPath.push(media);\n context.mediaBl ocks.push(media);\n\n this.rules[0].functionRegistry = context.frames[0]. functionRegistry.inherit();\n context.frames.unshift(this.rules[0]);\n media.rules = [this.rules[0].eval(context)];\n context.frames.shift( );\n\n context.mediaPath.pop();\n\n return context.mediaPath.lengt h === 0 ? media.evalTop(context) :\n media.evalNested(context);\n },\n\n evalTop(context) {\n let result = this;\n\n // Render al l dependent Media blocks.\n if (context.mediaBlocks.length > 1) {\n const selectors = (new Selector([], null, null, this.getIndex(), this.file Info())).createEmptySelectors();\n result = new Ruleset(selectors, co ntext.mediaBlocks);\n result.multiMedia = true;\n result.c opyVisibilityInfo(this.visibilityInfo());\n this.setParent(result, th is);\n }\n\n delete context.mediaBlocks;\n delete context.m ediaPath;\n\n return result;\n },\n\n evalNested(context) {\n let i;\n let value;\n const path = context.mediaPath.concat([thi s]);\n\n // Extract the media-query conditions separated with `,` (OR).\n for (i = 0; i < path.length; i++) {\n value = path[i].feature s instanceof Value ?\n path[i].features.value : path[i].features; \n path[i] = Array.isArray(value) ? value : [value];\n }\n\n // Trace all permutations to generate the resulting media-query.\n //\n // (a, b and c) with nested (d, e) ->\n // a and d\n // a and e\n // b and c and d\n // b and c and e\n this.features = new Value(this.permute(path).map(path => {\n path = path.map(fragment => fragment.toCSS ? fragment : new Anonymous(fragment));\n\n for (i = path.length - 1; i > 0; i--) {\n path.splice (i, 0, new Anonymous('and'));\n }\n\n return new Expressio n(path);\n }));\n this.setParent(this.features, this);\n\n // Fake a tree-node that doesn't output anything.\n return new Ruleset([] , []);\n },\n\n permute(arr) {\n if (arr.length === 0) {\n return [];\n } else if (arr.length === 1) {\n return arr[0] ;\n } else {\n const result = [];\n const rest = th is.permute(arr.slice(1));\n for (let i = 0; i < rest.length; i++) {\n for (let j = 0; j < arr[0].length; j++) {\n r esult.push([arr[0][j]].concat(rest[i]));\n }\n }\n return result;\n }\n },\n\n bubbleSelectors(selectors) {\n if (!selectors) {\n return;\n }\n this.rules = [ new Ruleset(utils.copyArray(selectors), [this.rules[0]])];\n this.setPare nt(this.rules, this);\n }\n});\n\nexport default Media;\n","import Node from './node';\nimport Media from './media';\nimport URL from './url';\nimport Quoted from './quoted';\nimport Ruleset from './ruleset';\nimport Anonymous from './an onymous';\nimport * as utils from '../utils';\nimport LessError from '../less-er ror';\n\n//\n// CSS @import node\n//\n// The general strategy here is that we do n't want to wait\n// for the parsing to be completed, before we start importing\ n// the file. That's because in the context of a browser,\n// most of the time w ill be spent waiting for the server to respond.\n//\n// On creation, we push the import path to our import queue, though\n// `import,push`, we also pass it a ca llback, which it'll call once\n// the file has been fetched, and parsed.\n//\nco nst Import = function(path, features, options, index, currentFileInfo, visibilit yInfo) {\n this.options = options;\n this._index = index;\n this._fileI nfo = currentFileInfo;\n this.path = path;\n this.features = features;\n this.allowRoot = true;\n\n if (this.options.less !== undefined || this.opti ons.inline) {\n this.css = !this.options.less || this.options.inline;\n } else {\n const pathValue = this.getPath();\n if (pathValue && /[#\\.\\&\\?]css([\\?;].*)?$/.test(pathValue)) {\n this.css = true;\n }\n }\n this.copyVisibilityInfo(visibilityInfo);\n this.setPare nt(this.features, this);\n this.setParent(this.path, this);\n};\n\nImport.pro totype = Object.assign(new Node(), {\n type: 'Import',\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this .features);\n }\n this.path = visitor.visit(this.path);\n i f (!this.options.isPlugin && !this.options.inline && this.root) {\n t his.root = visitor.visit(this.root);\n }\n },\n\n genCSS(context, o utput) {\n if (this.css && this.path._fileInfo.reference === undefined) { \n output.add('@import ', this._fileInfo, this._index);\n this.path.genCSS(context, output);\n if (this.features) {\n output.add(' ');\n this.features.genCSS(context, output);\n }\n output.add(';');\n }\n },\n\n getPath() {\n return (this.path instanceof URL) ?\n this.path.value.valu e : this.path.value;\n },\n\n isVariableImport() {\n let path = thi s.path;\n if (path instanceof URL) {\n path = path.value;\n }\n if (path instanceof Quoted) {\n return path.containsV ariables();\n }\n\n return true;\n },\n\n evalForImport(cont ext) {\n let path = this.path;\n\n if (path instanceof URL) {\n path = path.value;\n }\n\n return new Import(path.eval(co ntext), this.features, this.options, this._index, this._fileInfo, this.visibilit yInfo());\n },\n\n evalPath(context) {\n const path = this.path.eva l(context);\n const fileInfo = this._fileInfo;\n\n if (!(path inst anceof URL)) {\n // Add the rootpath if the URL requires a rewrite\n const pathValue = path.value;\n if (fileInfo &&\n pathValue &&\n context.pathRequiresRewrite(pathValue)) {\n path.value = context.rewritePath(pathValue, fileInfo.rootpath);\ n } else {\n path.value = context.normalizePath(path.v alue);\n }\n }\n\n return path;\n },\n\n eval(con text) {\n const result = this.doEval(context);\n if (this.options. reference || this.blocksVisibility()) {\n if (result.length || result .length === 0) {\n result.forEach(function (node) {\n node.addVisibilityBlock();\n }\n );\n } else {\n result.addVisibilityBlock();\n }\n }\n return result;\n },\n\n doEval(context) {\n let ru leset;\n let registry;\n const features = this.features && this.fe atures.eval(context);\n\n if (this.options.isPlugin) {\n if (t his.root && this.root.eval) {\n try {\n this.r oot.eval(context);\n }\n catch (e) {\n e.message = 'Plugin error during evaluation';\n throw new LessError(e, this.root.imports, this.root.filename);\n }\n }\n registry = context.frames[0] && context.frames[0].funct ionRegistry;\n if ( registry && this.root && this.root.functions ) {\ n registry.addMultiple( this.root.functions );\n }\n\n return [];\n }\n\n if (this.skip) {\n if (t ypeof this.skip === 'function') {\n this.skip = this.skip();\n }\n if (this.skip) {\n return [];\n }\n }\n if (this.options.inline) {\n const contents = new Anonymous(this.root, 0,\n {\n filename: t his.importedFilename,\n reference: this.path._fileInfo && thi s.path._fileInfo.reference\n }, true, true);\n\n retur n this.features ? new Media([contents], this.features.value) : [contents];\n } else if (this.css) {\n const newImport = new Import(this.evalPa th(context), features, this.options, this._index);\n if (!newImport.c ss && this.error) {\n throw this.error;\n }\n return newImport;\n } else if (this.root) {\n ruleset = new Ruleset(null, utils.copyArray(this.root.rules));\n ruleset.evalImpor ts(context);\n\n return this.features ? new Media(ruleset.rules, this .features.value) : ruleset.rules;\n } else {\n return [];\n }\n }\n});\n\nexport default Import;\n","import Node from './node';\nimp ort Variable from './variable';\n\nconst JsEvalNode = function() {};\n\nJsEvalNo de.prototype = Object.assign(new Node(), {\n evaluateJavaScript(expression, c ontext) {\n let result;\n const that = this;\n const evalCo ntext = {};\n\n if (!context.javascriptEnabled) {\n throw { me ssage: 'Inline JavaScript is not enabled. Is it set in your options?',\n filename: this.fileInfo().filename,\n index: this.getInde x() };\n }\n\n expression = expression.replace(/@\\{([\\w-]+)\\}/g , function (_, name) {\n return that.jsify(new Variable(`@${name}`, t hat.getIndex(), that.fileInfo()).eval(context));\n });\n\n try {\n expression = new Function(`return (${expression})`);\n } catc h (e) {\n throw { message: `JavaScript evaluation error: ${e.message} from \\`${expression}\\`` ,\n filename: this.fileInfo().filename ,\n index: this.getIndex() };\n }\n\n const variabl es = context.frames[0].variables();\n for (const k in variables) {\n if (variables.hasOwnProperty(k)) {\n /* jshint loopfunc:tr ue */\n evalContext[k.slice(1)] = {\n value: v ariables[k].value,\n toJS: function () {\n return this.value.eval(context).toCSS();\n }\n };\n }\n }\n\n try {\n result = expres sion.call(evalContext);\n } catch (e) {\n throw { message: `Ja vaScript evaluation error: '${e.name}: ${e.message.replace(/[\"]/g, '\\'')}'` ,\ n filename: this.fileInfo().filename,\n index: thi s.getIndex() };\n }\n return result;\n },\n\n jsify(obj) {\n if (Array.isArray(obj.value) && (obj.value.length > 1)) {\n r eturn `[${obj.value.map(function (v) { return v.toCSS(); }).join(', ')}]`;\n } else {\n return obj.toCSS();\n }\n }\n});\n\nexport d efault JsEvalNode;\n","import JsEvalNode from './js-eval-node';\nimport Dimensio n from './dimension';\nimport Quoted from './quoted';\nimport Anonymous from './ anonymous';\n\nconst JavaScript = function(string, escaped, index, currentFileIn fo) {\n this.escaped = escaped;\n this.expression = string;\n this._ind ex = index;\n this._fileInfo = currentFileInfo;\n}\n\nJavaScript.prototype = Object.assign(new JsEvalNode(), {\n type: 'JavaScript',\n\n eval(context) {\n const result = this.evaluateJavaScript(this.expression, context);\n const type = typeof result;\n\n if (type === 'number' && !isNaN(res ult)) {\n return new Dimension(result);\n } else if (type === 'string') {\n return new Quoted(`\"${result}\"`, result, this.escaped , this._index);\n } else if (Array.isArray(result)) {\n return new Anonymous(result.join(', '));\n } else {\n return new Ano nymous(result);\n }\n }\n});\n\nexport default JavaScript;\n","import Node from './node';\n\nconst Assignment = function(key, val) {\n this.key = k ey;\n this.value = val;\n}\n\nAssignment.prototype = Object.assign(new Node() , {\n type: 'Assignment',\n\n accept(visitor) {\n this.value = visi tor.visit(this.value);\n },\n\n eval(context) {\n if (this.value.ev al) {\n return new Assignment(this.key, this.value.eval(context));\n }\n return this;\n },\n\n genCSS(context, output) {\n output.add(`${this.key}=`);\n if (this.value.genCSS) {\n this .value.genCSS(context, output);\n } else {\n output.add(this.v alue);\n }\n }\n});\n\nexport default Assignment;\n","import Node from './node';\n\nconst Condition = function(op, l, r, i, negate) {\n this.op = o p.trim();\n this.lvalue = l;\n this.rvalue = r;\n this._index = i;\n this.negate = negate;\n};\n\nCondition.prototype = Object.assign(new Node(), {\ n type: 'Condition',\n\n accept(visitor) {\n this.lvalue = visitor. visit(this.lvalue);\n this.rvalue = visitor.visit(this.rvalue);\n },\n \n eval(context) {\n const result = (function (op, a, b) {\n switch (op) {\n case 'and': return a && b;\n cas e 'or': return a || b;\n default:\n switch (N ode.compare(a, b)) {\n case -1:\n return op === '<' || op === '=<' || op === '<=';\n ca se 0:\n return op === '=' || op === '>=' || op === '= <' || op === '<=';\n case 1:\n return op === '>' || op === '>=';\n default:\n return false;\n }\n }\n } )(this.op, this.lvalue.eval(context), this.rvalue.eval(context));\n\n ret urn this.negate ? !result : result;\n }\n});\n\nexport default Condition;\n", "import Node from './node';\n\nconst UnicodeDescriptor = function(value) {\n this.value = value;\n}\n\nUnicodeDescriptor.prototype = Object.assign(new Node() , {\n type: 'UnicodeDescriptor'\n})\n\nexport default UnicodeDescriptor;\n"," import Node from './node';\nimport Operation from './operation';\nimport Dimensi on from './dimension';\n\nconst Negative = function(node) {\n this.value = no de;\n};\n\nNegative.prototype = Object.assign(new Node(), {\n type: 'Negative ',\n\n genCSS(context, output) {\n output.add('-');\n this.valu e.genCSS(context, output);\n },\n\n eval(context) {\n if (context.i sMathOn()) {\n return (new Operation('*', [new Dimension(-1), this.va lue])).eval(context);\n }\n return new Negative(this.value.eval(co ntext));\n }\n});\n\nexport default Negative;\n","import Node from './node';\ nimport Selector from './selector';\n\nconst Extend = function(selector, option, index, currentFileInfo, visibilityInfo) {\n this.selector = selector;\n t his.option = option;\n this.object_id = Extend.next_id++;\n this.parent_id s = [this.object_id];\n this._index = index;\n this._fileInfo = currentFil eInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true; \n\n switch (option) {\n case 'all':\n this.allowBefore = t rue;\n this.allowAfter = true;\n break;\n default:\ n this.allowBefore = false;\n this.allowAfter = false;\n break;\n }\n this.setParent(this.selector, this);\n};\n\nExtend. prototype = Object.assign(new Node(), {\n type: 'Extend',\n\n accept(visit or) {\n this.selector = visitor.visit(this.selector);\n },\n\n eval (context) {\n return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n },\n\n clone( context) {\n return new Extend(this.selector, this.option, this.getIndex( ), this.fileInfo(), this.visibilityInfo());\n },\n\n // it concatenates (j oins) all selectors in selector array\n findSelfSelectors(selectors) {\n let selfElements = [], i, selectorElements;\n\n for (i = 0; i < select ors.length; i++) {\n selectorElements = selectors[i].elements;\n // duplicate the logic in genCSS function inside the selector node.\n // future TODO - move both logics into the selector joiner visitor\n if (i > 0 && selectorElements.length && selectorElements[0].combinator.v alue === '') {\n selectorElements[0].combinator.value = ' ';\n }\n selfElements = selfElements.concat(selectors[i].elements );\n }\n\n this.selfSelectors = [new Selector(selfElements)];\n this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo());\n }\n}) ;\n\nExtend.next_id = 0;\nexport default Extend;\n","import Node from './node';\ nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport De tachedRuleset from './detached-ruleset';\nimport LessError from '../less-error'; \n\nconst VariableCall = function(variable, index, currentFileInfo) {\n this. variable = variable;\n this._index = index;\n this._fileInfo = currentFile Info;\n this.allowRoot = true;\n};\n\nVariableCall.prototype = Object.assign( new Node(), {\n type: 'VariableCall',\n\n eval(context) {\n let rul es;\n let detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);\n const error = new LessError({message: ` Could not evaluate variable call ${this.variable}`});\n\n if (!detachedRu leset.ruleset) {\n if (detachedRuleset.rules) {\n rule s = detachedRuleset;\n }\n else if (Array.isArray(detached Ruleset)) {\n rules = new Ruleset('', detachedRuleset);\n }\n else if (Array.isArray(detachedRuleset.value)) {\n rules = new Ruleset('', detachedRuleset.value);\n }\n else {\n throw error;\n }\n detachedRulese t = new DetachedRuleset(rules);\n }\n\n if (detachedRuleset.rulese t) {\n return detachedRuleset.callEval(context);\n }\n throw error;\n }\n});\n\nexport default VariableCall;\n","import Node from '. /node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\ni mport Selector from './selector';\n\nconst NamespaceValue = function(ruleCall, l ookups, index, fileInfo) {\n this.value = ruleCall;\n this.lookups = looku ps;\n this._index = index;\n this._fileInfo = fileInfo;\n};\n\nNamespaceVa lue.prototype = Object.assign(new Node(), {\n type: 'NamespaceValue',\n\n eval(context) {\n let i, j, name, rules = this.value.eval(context);\n \n for (i = 0; i < this.lookups.length; i++) {\n name = th is.lookups[i];\n\n /**\n * Eval'd DRs return rulesets.\n * Eval'd mixins return rules, so let's make a ruleset if we need it. \n * We need to do this because of late parsing of values\n */\n if (Array.isArray(rules)) {\n rules = new Rul eset([new Selector()], rules);\n }\n\n if (name === '') {\ n rules = rules.lastDeclaration();\n }\n el se if (name.charAt(0) === '@') {\n if (name.charAt(1) === '@') {\ n name = `@${new Variable(name.substr(1)).eval(context).value }`;\n }\n if (rules.variables) {\n rules = rules.variable(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `variable ${name} not found`,\n filena me: this.fileInfo().filename,\n index: this.getIndex() }; \n }\n }\n else {\n if (name .substring(0, 2) === '$@') {\n name = `$${new Variable(name.s ubstr(1)).eval(context).value}`;\n }\n else {\n name = name.charAt(0) === '$' ? name : `$${name}`;\n }\n if (rules.properties) {\n rules = rul es.property(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `property \"${name.substr(1)}\" not found`,\n filename: t his.fileInfo().filename,\n index: this.getIndex() };\n }\n // Properties are an array of values, since a ru leset can have multiple props.\n // We pick the last one (the \"c ascaded\" value)\n rules = rules[rules.length - 1];\n }\n\n if (rules.value) {\n rules = rules.eval(context) .value;\n }\n if (rules.ruleset) {\n rules = rules.ruleset.eval(context);\n }\n }\n return rules;\ n }\n});\n\nexport default NamespaceValue;\n","import Selector from './select or';\nimport Element from './element';\nimport Ruleset from './ruleset';\nimport Declaration from './declaration';\nimport DetachedRuleset from './detached-rule set';\nimport Expression from './expression';\nimport contexts from '../contexts ';\nimport * as utils from '../utils';\n\nconst Definition = function(name, para ms, rules, condition, variadic, frames, visibilityInfo) {\n this.name = name || 'anonymous mixin';\n this.selectors = [new Selector([new Element(null, nam e, false, this._index, this._fileInfo)])];\n this.params = params;\n this. condition = condition;\n this.variadic = variadic;\n this.arity = params.l ength;\n this.rules = rules;\n this._lookups = {};\n const optionalPara meters = [];\n this.required = params.reduce(function (count, p) {\n i f (!p.name || (p.name && !p.value)) {\n return count + 1;\n }\ n else {\n optionalParameters.push(p.name);\n retur n count;\n }\n }, 0);\n this.optionalParameters = optionalParameter s;\n this.frames = frames;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n}\n\nDefinition.prototype = Object.assign(new Ruleset() , {\n type: 'MixinDefinition',\n evalFirst: true,\n\n accept(visitor) { \n if (this.params && this.params.length) {\n this.params = vi sitor.visitArray(this.params);\n }\n this.rules = visitor.visitArr ay(this.rules);\n if (this.condition) {\n this.condition = vis itor.visit(this.condition);\n }\n },\n\n evalParams(context, mixinE nv, args, evaldArguments) {\n /* jshint boss:true */\n const frame = new Ruleset(null, null);\n\n let varargs;\n let arg;\n c onst params = utils.copyArray(this.params);\n let i;\n let j;\n let val;\n let name;\n let isNamedFound;\n let argInde x;\n let argsLength = 0;\n\n if (mixinEnv.frames && mixinEnv.frame s[0] && mixinEnv.frames[0].functionRegistry) {\n frame.functionRegist ry = mixinEnv.frames[0].functionRegistry.inherit();\n }\n mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames));\n\n if ( args) {\n args = utils.copyArray(args);\n argsLength = arg s.length;\n\n for (i = 0; i < argsLength; i++) {\n arg = args[i];\n if (name = (arg && arg.name)) {\n isNamedFound = false;\n for (j = 0; j < params.length; j++) {\n if (!evaldArguments[j] && name === params[j].name) { \n evaldArguments[j] = arg.value.eval(context);\n frame.prependRule(new Declaration(name, arg.value.eval(c ontext)));\n isNamedFound = true;\n break;\n }\n }\n if (isNamedFound) {\n args.splice(i, 1);\n i--;\n continue;\n } else {\n throw { type: 'Runtime', message: `Named argumen t for ${this.name} ${args[i].name} not found` };\n }\n }\n }\n }\n argIndex = 0;\n for (i = 0; i < params.length; i++) {\n if (evaldArguments[i]) { continue; }\n\n arg = args && args[argIndex];\n\n if (name = params[i].na me) {\n if (params[i].variadic) {\n varargs = [];\n for (j = argIndex; j < argsLength; j++) {\n varargs.push(args[j].value.eval(context));\n }\n frame.prependRule(new Declaration(name, new Expression(vararg s).eval(context)));\n } else {\n val = arg && arg.value;\n if (val) {\n // This was a mixin call, pass in a detached ruleset of it's eval'd rules\n if (Array.isArray(val)) {\n val = new Detached Ruleset(new Ruleset('', val));\n }\n else {\n val = val.eval(context);\n }\n } else if (params[i].value) {\n val = params[i].value.eval(mixinEnv);\n frame.rese tCache();\n } else {\n throw { type: ' Runtime', message: `wrong number of arguments for ${this.name} (${argsLength} fo r ${this.arity})` };\n }\n\n frame.prepend Rule(new Declaration(name, val));\n evaldArguments[i] = val;\ n }\n }\n\n if (params[i].variadic && args) {\n for (j = argIndex; j < argsLength; j++) {\n evaldArguments[j] = args[j].value.eval(context);\n }\n }\n argIndex++;\n }\n\n return frame;\n },\n\n makeImportant() {\n const rules = !this.rules ? this.rules : this.rules .map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant(true);\n } else {\n return r;\n }\n });\n const result = new Definition(this.name, this.param s, rules, this.condition, this.variadic, this.frames);\n return result;\n },\n\n eval(context) {\n return new Definition(this.name, this.par ams, this.rules, this.condition, this.variadic, this.frames || utils.copyArray(c ontext.frames));\n },\n\n evalCall(context, args, important) {\n co nst _arguments = [];\n const mixinFrames = this.frames ? this.frames.conc at(context.frames) : context.frames;\n const frame = this.evalParams(cont ext, new contexts.Eval(context, mixinFrames), args, _arguments);\n let ru les;\n let ruleset;\n\n frame.prependRule(new Declaration('@argume nts', new Expression(_arguments).eval(context)));\n\n rules = utils.copyA rray(this.rules);\n\n ruleset = new Ruleset(null, rules);\n rulese t.originalRuleset = this;\n ruleset = ruleset.eval(new contexts.Eval(cont ext, [this, frame].concat(mixinFrames)));\n if (important) {\n ruleset = ruleset.makeImportant();\n }\n return ruleset;\n },\ n\n matchCondition(args, context) {\n if (this.condition && !this.cond ition.eval(\n new contexts.Eval(context,\n [this.evalP arams(context, /* the parameter variables */\n new contexts.E val(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]\n .concat(this.frames || []) // the parent namesp ace/mixin frames\n .concat(context.frames)))) { // the curren t environment frames\n return false;\n }\n return true; \n },\n\n matchArgs(args, context) {\n const allArgsCnt = (args && args.length) || 0;\n let len;\n const optionalParameters = this.op tionalParameters;\n const requiredArgsCnt = !args ? 0 : args.reduce(funct ion (count, p) {\n if (optionalParameters.indexOf(p.name) < 0) {\n return count + 1;\n } else {\n return cou nt;\n }\n }, 0);\n\n if (!this.variadic) {\n if (requiredArgsCnt < this.required) {\n return false;\n }\n if (allArgsCnt > this.params.length) {\n retur n false;\n }\n } else {\n if (requiredArgsCnt < (th is.required - 1)) {\n return false;\n }\n }\n\n // check patterns\n len = Math.min(requiredArgsCnt, this.arity);\ n\n for (let i = 0; i < len; i++) {\n if (!this.params[i].name && !this.params[i].variadic) {\n if (args[i].value.eval(context) .toCSS() != this.params[i].value.eval(context).toCSS()) {\n r eturn false;\n }\n }\n }\n return true;\ n }\n});\n\nexport default Definition;\n","import Node from './node';\nimport Selector from './selector';\nimport MixinDefinition from './mixin-definition';\ nimport defaultFunc from '../functions/default';\n\nconst MixinCall = function(e lements, args, index, currentFileInfo, important) {\n this.selector = new Sel ector(elements);\n this.arguments = args || [];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.important = important;\n this.a llowRoot = true;\n this.setParent(this.selector, this);\n};\n\nMixinCall.prot otype = Object.assign(new Node(), {\n type: 'MixinCall',\n\n accept(visito r) {\n if (this.selector) {\n this.selector = visitor.visit(th is.selector);\n }\n if (this.arguments.length) {\n this .arguments = visitor.visitArray(this.arguments);\n }\n },\n\n eval( context) {\n let mixins;\n let mixin;\n let mixinPath;\n const args = [];\n let arg;\n let argValue;\n const ru les = [];\n let match = false;\n let i;\n let m;\n l et f;\n let isRecursive;\n let isOneFound;\n const candidat es = [];\n let candidate;\n const conditionResult = [];\n l et defaultResult;\n const defFalseEitherCase = -1;\n const defNone = 0;\n const defTrue = 1;\n const defFalse = 2;\n let coun t;\n let originalRuleset;\n let noArgumentsFilter;\n\n this .selector = this.selector.eval(context);\n\n function calcDefGroup(mixin, mixinPath) {\n let f, p, namespace;\n\n for (f = 0; f < 2 ; f++) {\n conditionResult[f] = true;\n defaultFun c.value(f);\n for (p = 0; p < mixinPath.length && conditionResult [f]; p++) {\n namespace = mixinPath[p];\n if (namespace.matchCondition) {\n conditionResult[f] = co nditionResult[f] && namespace.matchCondition(null, context);\n }\n }\n if (mixin.matchCondition) {\n conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, c ontext);\n }\n }\n if (conditionResult[0] | | conditionResult[1]) {\n if (conditionResult[0] != conditionResu lt[1]) {\n return conditionResult[1] ?\n defTrue : defFalse;\n }\n\n return defNone;\n }\n return defFalseEitherCase;\n }\n\n for (i = 0; i < this.arguments.length; i++) {\n arg = this.arguments[i];\n argValue = arg.value.eval(context);\n if (arg.expand && Ar ray.isArray(argValue.value)) {\n argValue = argValue.value;\n for (m = 0; m < argValue.length; m++) {\n args.pu sh({value: argValue[m]});\n }\n } else {\n args.push({name: arg.name, value: argValue});\n }\n }\n\n noArgumentsFilter = function(rule) {return rule.matchArgs(null, context); };\n\n for (i = 0; i < context.frames.length; i++) {\n if ((mi xins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) {\n isOneFound = true;\n\n // To make `default( )` function independent of definition order we have two \"subpasses\" here.\n // At first we evaluate each guard *twice* (with `default() == true ` and `default() == false`),\n // and build candidate list with c orresponding flags. Then, when we know all possible matches,\n // we make a final decision.\n\n for (m = 0; m < mixins.length; m++ ) {\n mixin = mixins[m].rule;\n mixinPath = mixins[m].path;\n isRecursive = false;\n for (f = 0; f < context.frames.length; f++) {\n if ((!(m ixin instanceof MixinDefinition)) && mixin === (context.frames[f].originalRulese t || context.frames[f])) {\n isRecursive = true;\n break;\n }\n }\n if (isRecursive) {\n continue;\n }\n\n if (mixin.matchArgs(args, context)) { \n candidate = {mixin, group: calcDefGroup(mixin, mixinPa th)};\n\n if (candidate.group !== defFalseEitherCase) {\n candidates.push(candidate);\n }\n\n match = true;\n }\n }\n\n defaultFunc.reset();\n\n count = [0, 0, 0];\n for (m = 0; m < candidates.length; m++) {\n count[candidates[m].group]++;\n }\n\n if (coun t[defNone] > 0) {\n defaultResult = defFalse;\n } else {\n defaultResult = defTrue;\n if ((count[defTrue] + count[defFalse]) > 1) {\n throw { typ e: 'Runtime',\n message: `Ambiguous use of \\`default ()\\` found when matching for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n for (m = 0; m < candidates.le ngth; m++) {\n candidate = candidates[m].group;\n if ((candidate === defNone) || (candidate === defaultResult)) {\n try {\n mixin = candidates[m].mixin; \n if (!(mixin instanceof MixinDefinition)) {\n originalRuleset = mixin.originalRuleset || mixin;\n mixin = new MixinDefinition('', [], mixin.rules, nu ll, false, null, originalRuleset.visibilityInfo());\n mixin.originalRuleset = originalRuleset;\n }\n const newRules = mixin.evalCall(context, args, this.im portant).rules;\n this._setVisibilityToReplacement(ne wRules);\n Array.prototype.push.apply(rules, newRules );\n } catch (e) {\n throw { m essage: e.message, index: this.getIndex(), filename: this.fileInfo().filename, s tack: e.stack };\n }\n }\n }\n\n if (match) {\n return rules;\n }\n }\n }\n if (isOneFound) {\n th row { type: 'Runtime',\n message: `No matching definition was found for \\`${this.format(args)}\\``,\n index: this.getIndex() , filename: this.fileInfo().filename };\n } else {\n throw { t ype: 'Name',\n message: `${this.selector.toCSS().trim()} is un defined`,\n index: this.getIndex(), filename: this.fileInfo().f ilename };\n }\n },\n\n _setVisibilityToReplacement(replacement) {\ n let i, rule;\n if (this.blocksVisibility()) {\n for ( i = 0; i < replacement.length; i++) {\n rule = replacement[i];\n rule.addVisibilityBlock();\n }\n }\n },\n\n format(args) {\n return `${this.selector.toCSS().trim()}(${args ? args .map(function (a) {\n let argValue = '';\n if (a.name) {\n argValue += `${a.name}:`;\n }\n if (a.valu e.toCSS) {\n argValue += a.value.toCSS();\n } else {\n argValue += '???';\n }\n return argValue;\ n }).join(', ') : ''})`;\n }\n});\n\nexport default MixinCall;\n","imp ort Node from './node';\nimport Color from './color';\nimport AtRule from './atr ule';\nimport DetachedRuleset from './detached-ruleset';\nimport Operation from './operation';\nimport Dimension from './dimension';\nimport Unit from './unit'; \nimport Keyword from './keyword';\nimport Variable from './variable';\nimport P roperty from './property';\nimport Ruleset from './ruleset';\nimport Element fro m './element';\nimport Attribute from './attribute';\nimport Combinator from './ combinator';\nimport Selector from './selector';\nimport Quoted from './quoted'; \nimport Expression from './expression';\nimport Declaration from './declaration ';\nimport Call from './call';\nimport URL from './url';\nimport Import from './ import';\nimport Comment from './comment';\nimport Anonymous from './anonymous'; \nimport Value from './value';\nimport JavaScript from './javascript';\nimport A ssignment from './assignment';\nimport Condition from './condition';\nimport Par en from './paren';\nimport Media from './media';\nimport UnicodeDescriptor from './unicode-descriptor';\nimport Negative from './negative';\nimport Extend from './extend';\nimport VariableCall from './variable-call';\nimport NamespaceValue from './namespace-value';\n\n// mixins\nimport MixinCall from './mixin-call';\ni mport MixinDefinition from './mixin-definition';\n\nexport default {\n Node, Color, AtRule, DetachedRuleset, Operation,\n Dimension, Unit, Keyword, Variab le, Property,\n Ruleset, Element, Attribute, Combinator, Selector,\n Quote d, Expression, Declaration, Call, URL, Import,\n Comment, Anonymous, Value, J avaScript, Assignment,\n Condition, Paren, Media, UnicodeDescriptor, Negative ,\n Extend, VariableCall, NamespaceValue,\n mixin: {\n Call: MixinC all,\n Definition: MixinDefinition\n }\n};","class AbstractFileManager {\n getPath(filename) {\n let j = filename.lastIndexOf('?');\n if (j > 0) {\n filename = filename.slice(0, j);\n }\n j = filename.lastIndexOf('/');\n if (j < 0) {\n j = filename.l astIndexOf('\\\\');\n }\n if (j < 0) {\n return '';\n }\n return filename.slice(0, j + 1);\n }\n\n tryAppendExtensi on(path, ext) {\n return /(\\.[a-z]*$)|([\\?;].*)$/.test(path) ? path : p ath + ext;\n }\n\n tryAppendLessExtension(path) {\n return this.try AppendExtension(path, '.less');\n }\n\n supportsSync() {\n return f alse;\n }\n\n alwaysMakePathsAbsolute() {\n return false;\n }\n\ n isPathAbsolute(filename) {\n return (/^(?:[a-z-]+:|\\/|\\\\|#)/i).te st(filename);\n }\n\n // TODO: pull out / replace?\n join(basePath, lat erPath) {\n if (!basePath) {\n return laterPath;\n }\n return basePath + laterPath;\n }\n\n pathDiff(url, baseUrl) {\n // diff between two paths to create a relative path\n\n const urlPart s = this.extractUrlParts(url);\n\n const baseUrlParts = this.extractUrlPa rts(baseUrl);\n let i;\n let max;\n let urlDirectories;\n let baseUrlDirectories;\n let diff = '';\n if (urlParts.host Part !== baseUrlParts.hostPart) {\n return '';\n }\n ma x = Math.max(baseUrlParts.directories.length, urlParts.directories.length);\n for (i = 0; i < max; i++) {\n if (baseUrlParts.directories[i] != = urlParts.directories[i]) { break; }\n }\n baseUrlDirectories = b aseUrlParts.directories.slice(i);\n urlDirectories = urlParts.directories .slice(i);\n for (i = 0; i < baseUrlDirectories.length - 1; i++) {\n diff += '../';\n }\n for (i = 0; i < urlDirectories.length - 1; i++) {\n diff += `${urlDirectories[i]}/`;\n }\n re turn diff;\n }\n\n // helper function, not part of API\n extractUrlPart s(url, baseUrl) {\n // urlParts[1] = protocol://hostname/ OR /\n / / urlParts[2] = / if path relative to host base\n // urlParts[3] = direct ories\n // urlParts[4] = filename\n // urlParts[5] = parameters\n\ n const urlPartsRegex = /^((?:[a-z-]+:)?\\/{2}(?:[^\\/\\?#]*\\/)|([\\/\\\ \]))?((?:[^\\/\\\\\\?#]*[\\/\\\\])*)([^\\/\\\\\\?#]*)([#\\?].*)?$/i;\n\n const urlParts = url.match(urlPartsRegex);\n const returner = {};\n let rawDirectories = [];\n const directories = [];\n let i;\n let baseUrlParts;\n\n if (!urlParts) {\n throw new Error( `Could not parse sheet href - '${url}'`);\n }\n\n // Stylesheets i n IE don't always return the full path\n if (baseUrl && (!urlParts[1] || urlParts[2])) {\n baseUrlParts = baseUrl.match(urlPartsRegex);\n if (!baseUrlParts) {\n throw new Error(`Could not parse pa ge url - '${baseUrl}'`);\n }\n urlParts[1] = urlParts[1] | | baseUrlParts[1] || '';\n if (!urlParts[2]) {\n urlPa rts[3] = baseUrlParts[3] + urlParts[3];\n }\n }\n\n if (urlParts[3]) {\n rawDirectories = urlParts[3].replace(/\\\\/g, '/'). split('/');\n\n // collapse '..' and skip '.'\n for (i = 0 ; i < rawDirectories.length; i++) {\n\n if (rawDirectories[i] === '..') {\n directories.pop();\n }\n else if (rawDirectories[i] !== '.') {\n directories.push (rawDirectories[i]);\n }\n \n }\n }\ n\n returner.hostPart = urlParts[1];\n returner.directories = dire ctories;\n returner.rawPath = (urlParts[1] || '') + rawDirectories.join(' /');\n returner.path = (urlParts[1] || '') + directories.join('/');\n returner.filename = urlParts[4];\n returner.fileUrl = returner.path + (urlParts[4] || '');\n returner.url = returner.fileUrl + (urlParts[5] || '');\n return returner;\n }\n}\n\nexport default AbstractFileManager; \n","import functionRegistry from '../functions/function-registry';\nimport Less Error from '../less-error';\n\nclass AbstractPluginLoader {\n constructor() { \n // Implemented by Node.js plugin loader\n this.require = functi on() {\n return null;\n }\n }\n\n evalPlugin(contents, c ontext, imports, pluginOptions, fileInfo) {\n\n let loader, registry, plu ginObj, localModule, pluginManager, filename, result;\n\n pluginManager = context.pluginManager;\n\n if (fileInfo) {\n if (typeof fileI nfo === 'string') {\n filename = fileInfo;\n }\n else {\n filename = fileInfo.filename;\n }\n }\n const shortname = (new this.less.FileManager()).extractUrlParts(f ilename).filename;\n\n if (filename) {\n pluginObj = pluginMan ager.get(filename);\n\n if (pluginObj) {\n result = th is.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imp orts, filename);\n }\n return pluginObj;\n }\n }\n localModule = {\n exports: {},\n pluginManager,\n fileInfo\n };\n registry = functionRe gistry.create();\n\n const registerPlugin = function(obj) {\n pluginObj = obj;\n };\n\n try {\n loader = new Function ('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents);\n loader(localModule, this.require(filename), registerPlu gin, registry, this.less.tree, this.less, fileInfo);\n }\n catch ( e) {\n return new LessError(e, imports, filename);\n }\n\n if (!pluginObj) {\n pluginObj = localModule.exports;\n }\n pluginObj = this.validatePlugin(pluginObj, filename, shortname);\n\n if (pluginObj instanceof LessError) {\n return pluginObj;\n }\n\n if (pluginObj) {\n pluginObj.imports = imports;\n pluginObj.filename = filename;\n\n // For < 3.x (or unspecifie d minVersion) - setOptions() before install()\n if (!pluginObj.minVer sion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n \n if (result) {\n return result;\n }\n }\n\n // Run on first load\n pluginMan ager.addPlugin(pluginObj, fileInfo.filename, registry);\n pluginObj.f unctions = registry.getLocalFunctions();\n\n // Need to call setOptio ns again because the pluginObj might have functions\n result = this.t rySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (re sult) {\n return result;\n }\n\n // Run eve ry @plugin call\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, f ilename);\n }\n\n }\n else {\n return new Le ssError({ message: 'Not a valid plugin' }, imports, filename);\n }\n\n return pluginObj;\n\n }\n\n trySetOptions(plugin, filename, name, opt ions) {\n if (options && !plugin.setOptions) {\n return new Le ssError({\n message: `Options have been provided but the plugin $ {name} does not support any options.`\n });\n }\n try { \n plugin.setOptions && plugin.setOptions(options);\n }\n catch (e) {\n return new LessError(e);\n }\n }\n\n va lidatePlugin(plugin, filename, name) {\n if (plugin) {\n // su pport plugins being a function\n // so that the plugin can be more us able programmatically\n if (typeof plugin === 'function') {\n plugin = new plugin();\n }\n\n if (plugin.minVersi on) {\n if (this.compareVersion(plugin.minVersion, this.less.vers ion) < 0) {\n return new LessError({\n message: `Plugin ${name} requires version ${this.versionToString(plugin.minVers ion)}`\n });\n }\n }\n r eturn plugin;\n }\n return null;\n }\n\n compareVersion(aVer sion, bVersion) {\n if (typeof aVersion === 'string') {\n aVer sion = aVersion.match(/^(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n aVersion.sh ift();\n }\n for (let i = 0; i < aVersion.length; i++) {\n if (aVersion[i] !== bVersion[i]) {\n return parseInt(aVersion [i]) > parseInt(bVersion[i]) ? -1 : 1;\n }\n }\n return 0;\n }\n\n versionToString(version) {\n let versionString = '';\n for (let i = 0; i < version.length; i++) {\n versionString += (versionString ? '.' : '') + version[i];\n }\n return versionStrin g;\n }\n\n printUsage(plugins) {\n for (let i = 0; i < plugins.leng th; i++) {\n const plugin = plugins[i];\n if (plugin.print Usage) {\n plugin.printUsage();\n }\n }\n }\ n}\n\nexport default AbstractPluginLoader;\n\n","import tree from '../tree';\n\n const _visitArgs = { visitDeeper: true };\nlet _hasIndexed = false;\n\nfunction _noop(node) {\n return node;\n}\n\nfunction indexNodeTypes(parent, ticker) {\ n // add .typeIndex to tree node types for lookup table\n let key, child;\ n for (key in parent) { \n /* eslint guard-for-in: 0 */\n child = parent[key];\n switch (typeof child) {\n case 'function':\n // ignore bound functions directly on tree which do not have a p rototype\n // or aren't nodes\n if (child.prototyp e && child.prototype.type) {\n child.prototype.typeIndex = ti cker++;\n }\n break;\n case 'object':\n ticker = indexNodeTypes(child, ticker);\n break;\ n \n }\n }\n return ticker;\n}\n\nclass Visitor {\n const ructor(implementation) {\n this._implementation = implementation;\n this._visitInCache = {};\n this._visitOutCache = {};\n\n if (!_h asIndexed) {\n indexNodeTypes(tree, 1);\n _hasIndexed = tr ue;\n }\n }\n\n visit(node) {\n if (!node) {\n re turn node;\n }\n\n const nodeTypeIndex = node.typeIndex;\n if (!nodeTypeIndex) {\n // MixinCall args aren't a node type?\n if (node.value && node.value.typeIndex) {\n this.visit(node .value);\n }\n return node;\n }\n\n const im pl = this._implementation;\n let func = this._visitInCache[nodeTypeIndex] ;\n let funcOut = this._visitOutCache[nodeTypeIndex];\n const visi tArgs = _visitArgs;\n let fnName;\n\n visitArgs.visitDeeper = true ;\n\n if (!func) {\n fnName = `visit${node.type}`;\n func = impl[fnName] || _noop;\n funcOut = impl[`${fnName}Out`] || _ noop;\n this._visitInCache[nodeTypeIndex] = func;\n this._ visitOutCache[nodeTypeIndex] = funcOut;\n }\n\n if (func !== _noop ) {\n const newNode = func.call(impl, node, visitArgs);\n if (node && impl.isReplacing) {\n node = newNode;\n }\ n }\n\n if (visitArgs.visitDeeper && node) {\n if (node .length) {\n for (let i = 0, cnt = node.length; i < cnt; i++) {\n if (node[i].accept) {\n node[i].accep t(this);\n }\n }\n } else if (node. accept) {\n node.accept(this);\n }\n }\n\n if (funcOut != _noop) {\n funcOut.call(impl, node);\n }\n\n return node;\n }\n\n visitArray(nodes, nonReplacing) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.l ength;\n let i;\n\n // Non-replacing\n if (nonReplacing || !this._implementation.isReplacing) {\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n // Replacing\n const out = [];\n for (i = 0; i < cnt; i++) {\n const evald = this.visit(nodes[i]);\n if (evald === undefined) { continue; }\n if (!evald.splice) {\n out.push(evald);\n } else if (evald.length) {\n this.flatten(evald, out);\n }\n }\n return out;\n }\n\n flatten(arr, out) {\n if (!out) {\n out = [];\n }\n\n let cnt, i, item, nestedCnt, j, nestedItem;\n\n for (i = 0 , cnt = arr.length; i < cnt; i++) {\n item = arr[i];\n if (item === undefined) {\n continue;\n }\n if (!item.splice) {\n out.push(item);\n continue;\n }\n\n for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {\n nestedItem = item[j];\n if (nestedItem == = undefined) {\n continue;\n }\n if (!nestedItem.splice) {\n out.push(nestedItem);\n } else if (nestedItem.length) {\n this.flatten(nested Item, out);\n }\n }\n }\n\n return out;\ n }\n}\n\nexport default Visitor;\n","class ImportSequencer {\n constructo r(onSequencerEmpty) {\n this.imports = [];\n this.variableImports = [];\n this._onSequencerEmpty = onSequencerEmpty;\n this._current Depth = 0;\n }\n\n addImport(callback) {\n const importSequencer = this,\n importItem = {\n callback,\n ar gs: null,\n isReady: false\n };\n this.imports. push(importItem);\n return function() {\n importItem.args = Ar ray.prototype.slice.call(arguments, 0);\n importItem.isReady = true;\ n importSequencer.tryRun();\n };\n }\n\n addVariableImpo rt(callback) {\n this.variableImports.push(callback);\n }\n\n tryRu n() {\n this._currentDepth++;\n try {\n while (true) {\ n while (this.imports.length > 0) {\n const im portItem = this.imports[0];\n if (!importItem.isReady) {\n return;\n }\n this.im ports = this.imports.slice(1);\n importItem.callback.apply(nu ll, importItem.args);\n }\n if (this.variableImpor ts.length === 0) {\n break;\n }\n const variableImport = this.variableImports[0];\n this.variabl eImports = this.variableImports.slice(1);\n variableImport();\n }\n } finally {\n this._currentDepth--;\n }\n if (this._currentDepth === 0 && this._onSequencerEmpty) {\n t his._onSequencerEmpty();\n }\n }\n}\n\nexport default ImportSequencer; \n","import contexts from '../contexts';\nimport Visitor from './visitor';\nimpo rt ImportSequencer from './import-sequencer';\nimport * as utils from '../utils' ;\n\nconst ImportVisitor = function(importer, finish) {\n\n this._visitor = n ew Visitor(this);\n this._importer = importer;\n this._finish = finish;\n this.context = new contexts.Eval();\n this.importCount = 0;\n this.once FileDetectionMap = {};\n this.recursionDetector = {};\n this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));\n};\n\nImportVisitor.pro totype = {\n isReplacing: false,\n run: function (root) {\n try {\n // process the contents\n this._visitor.visit(root);\n }\n catch (e) {\n this.error = e;\n }\n\n t his.isFinished = true;\n this._sequencer.tryRun();\n },\n _onSequen cerEmpty: function() {\n if (!this.isFinished) {\n return;\n }\n this._finish(this.error);\n },\n visitImport: function (i mportNode, visitArgs) {\n const inlineCSS = importNode.options.inline;\n\ n if (!importNode.css || inlineCSS) {\n\n const context = new contexts.Eval(this.context, utils.copyArray(this.context.frames));\n const importParent = context.frames[0];\n\n this.importCount++;\n if (importNode.isVariableImport()) {\n this._sequencer.ad dVariableImport(this.processImportNode.bind(this, importNode, context, importPar ent));\n } else {\n this.processImportNode(importNode, context, importParent);\n }\n }\n visitArgs.visitDeepe r = false;\n },\n processImportNode: function(importNode, context, importP arent) {\n let evaldImportNode;\n const inlineCSS = importNode.opt ions.inline;\n\n try {\n evaldImportNode = importNode.evalForI mport(context);\n } catch (e) {\n if (!e.filename) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; }\n // attempt to eval properly and treat as css\n importNode.css = t rue;\n // if that fails, this error will be thrown\n impor tNode.error = e;\n }\n\n if (evaldImportNode && (!evaldImportNode. css || inlineCSS)) {\n\n if (evaldImportNode.options.multiple) {\n context.importMultiple = true;\n }\n\n // try appending if we haven't determined if it is css or not\n const tryAp pendLessExtension = evaldImportNode.css === undefined;\n\n for (let i = 0; i < importParent.rules.length; i++) {\n if (importParent.ru les[i] === importNode) {\n importParent.rules[i] = evaldImpor tNode;\n break;\n }\n }\n\n const onImported = this.onImported.bind(this, evaldImportNode, context), seq uencedOnImported = this._sequencer.addImport(onImported);\n\n this._i mporter.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode. fileInfo(),\n evaldImportNode.options, sequencedOnImported);\n } else {\n this.importCount--;\n if (this.isFinished) {\n this._sequencer.tryRun();\n }\n }\n },\ n onImported: function (importNode, context, e, root, importedAtRoot, fullPat h) {\n if (e) {\n if (!e.filename) {\n e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename;\n }\n this.error = e;\n }\n\n const importVisitor = th is,\n inlineCSS = importNode.options.inline,\n isPlugin = importNode.options.isPlugin,\n isOptional = importNode.options.option al,\n duplicateImport = importedAtRoot || fullPath in importVisitor.r ecursionDetector;\n\n if (!context.importMultiple) {\n if (dup licateImport) {\n importNode.skip = true;\n } else {\n importNode.skip = function() {\n if (fullPath in importVisitor.onceFileDetectionMap) {\n return true;\ n }\n importVisitor.onceFileDetectionMap[f ullPath] = true;\n return false;\n };\n }\n }\n\n if (!fullPath && isOptional) {\n importN ode.skip = true;\n }\n\n if (root) {\n importNode.root = root;\n importNode.importedFilename = fullPath;\n\n if ( !inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) {\n importVisitor.recursionDetector[fullPath] = true;\n\n const oldContext = this.context;\n this.context = context;\n try {\n this._visitor.visit(root);\n } catch (e) {\n this.error = e;\n }\n this.context = oldContext;\n }\n }\n\n import Visitor.importCount--;\n\n if (importVisitor.isFinished) {\n i mportVisitor._sequencer.tryRun();\n }\n },\n visitDeclaration: func tion (declNode, visitArgs) {\n if (declNode.value.type === 'DetachedRules et') {\n this.context.frames.unshift(declNode);\n } else {\n visitArgs.visitDeeper = false;\n }\n },\n visitDeclaratio nOut: function(declNode) {\n if (declNode.value.type === 'DetachedRuleset ') {\n this.context.frames.shift();\n }\n },\n visitAtRu le: function (atRuleNode, visitArgs) {\n this.context.frames.unshift(atRu leNode);\n },\n visitAtRuleOut: function (atRuleNode) {\n this.cont ext.frames.shift();\n },\n visitMixinDefinition: function (mixinDefinition Node, visitArgs) {\n this.context.frames.unshift(mixinDefinitionNode);\n },\n visitMixinDefinitionOut: function (mixinDefinitionNode) {\n th is.context.frames.shift();\n },\n visitRuleset: function (rulesetNode, vis itArgs) {\n this.context.frames.unshift(rulesetNode);\n },\n visitR ulesetOut: function (rulesetNode) {\n this.context.frames.shift();\n } ,\n visitMedia: function (mediaNode, visitArgs) {\n this.context.frame s.unshift(mediaNode.rules[0]);\n },\n visitMediaOut: function (mediaNode) {\n this.context.frames.shift();\n }\n};\nexport default ImportVisitor ;\n","class SetTreeVisibilityVisitor {\n constructor(visible) {\n this .visible = visible;\n }\n\n run(root) {\n this.visit(root);\n }\ n\n visitArray(nodes) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n for (i = 0 ; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n visit(node) {\n if (!node) {\n return nod e;\n }\n if (node.constructor === Array) {\n return thi s.visitArray(node);\n }\n\n if (!node.blocksVisibility || node.blo cksVisibility()) {\n return node;\n }\n if (this.visibl e) {\n node.ensureVisibility();\n } else {\n node.e nsureInvisibility();\n }\n\n node.accept(this);\n return no de;\n }\n}\n\nexport default SetTreeVisibilityVisitor;","import tree from '.. /tree';\nimport Visitor from './visitor';\nimport logger from '../logger';\nimpo rt * as utils from '../utils';\n\n/* jshint loopfunc:true */\n\nclass ExtendFind erVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n this.contexts = [];\n this.allExtendsStack = [[]];\n }\n\n ru n(root) {\n root = this._visitor.visit(root);\n root.allExtends = this.allExtendsStack[0];\n return root;\n }\n\n visitDeclaration(de clNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visit MixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rule setNode.root) {\n return;\n }\n\n let i;\n let j ;\n let extend;\n const allSelectorsExtendList = [];\n let extendList;\n\n // get &:extend(.a); rules which apply to all selectors i n this ruleset\n const rules = rulesetNode.rules, ruleCnt = rules ? rules .length : 0;\n for (i = 0; i < ruleCnt; i++) {\n if (rulesetNo de.rules[i] instanceof tree.Extend) {\n allSelectorsExtendList.pu sh(rules[i]);\n rulesetNode.extendOnEveryPath = true;\n }\n }\n\n // now find every selector and apply the extends that apply to all extends\n // and the ones which apply to an individual exten d\n const paths = rulesetNode.paths;\n for (i = 0; i < paths.lengt h; i++) {\n const selectorPath = paths[i], selector = selectorPath[se lectorPath.length - 1], selExtendList = selector.extendList;\n\n exte ndList = selExtendList ? utils.copyArray(selExtendList).concat(allSelectorsExten dList)\n : allSelectorsExtendList;\n\n if (extendList) {\n extendList = extendList.map(function(allSelectorsExtend) {\n return allSelectorsExtend.clone();\n });\n }\n\n for (j = 0; j < extendList.length; j++) {\n this.foundExtends = true;\n extend = extendList[j];\n extend.findSelfSelectors(selectorPath);\n extend.ruleset = rulesetNode;\n if (j === 0) { extend.firstExtendOnThisSelector Path = true; }\n this.allExtendsStack[this.allExtendsStack.length - 1].push(extend);\n }\n }\n\n this.contexts.push(rule setNode.selectors);\n }\n\n visitRulesetOut(rulesetNode) {\n if (!r ulesetNode.root) {\n this.contexts.length = this.contexts.length - 1; \n }\n }\n\n visitMedia(mediaNode, visitArgs) {\n mediaNode. allExtends = [];\n this.allExtendsStack.push(mediaNode.allExtends);\n }\n\n visitMediaOut(mediaNode) {\n this.allExtendsStack.length = this. allExtendsStack.length - 1;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n atRuleNode.allExtends = [];\n this.allExtendsStack.push(atRuleNod e.allExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n this.allExten dsStack.length = this.allExtendsStack.length - 1;\n }\n}\n\nclass ProcessExte ndsVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n const extendFinder = new ExtendFinderVisitor(); \n this.extendIndices = {};\n extendFinder.run(root);\n if (!extendFinder.foundExtends) { return root; }\n root.allExtends = root.al lExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends));\n this.allExtendsStack = [root.allExtends];\n const newRoot = this._visi tor.visit(root);\n this.checkExtendsForNonMatched(root.allExtends);\n return newRoot;\n }\n\n checkExtendsForNonMatched(extendList) {\n const indices = this.extendIndices;\n extendList.filter(function(exten d) {\n return !extend.hasFoundMatches && extend.parent_ids.length == 1;\n }).forEach(function(extend) {\n let selector = '_unknown_ ';\n try {\n selector = extend.selector.toCSS({});\n }\n catch (_) {}\n\n if (!indices[`${extend.inde x} ${selector}`]) {\n indices[`${extend.index} ${selector}`] = tr ue;\n logger.warn(`extend '${selector}' has no matches`);\n }\n });\n }\n\n doExtendChaining(extendsList, extendsListTarg et, iterationCount) {\n //\n // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering\n // and pasting the selector we would do normally, but we are also adding an e xtend with the same target selector\n // this means this new extend can t hen go and alter other extends\n //\n // this method deals with al l the chaining work - without it, extend is flat and doesn't work on other exten d selectors\n // this is also the most expensive.. and a match on one sel ector can cause an extension of a selector we had already\n // processed if we look at each selector at a time, as is done in visitRuleset\n\n let extendIndex;\n\n let targetExtendIndex;\n let matches;\n c onst extendsToAdd = [];\n let newSelector;\n const extendVisitor = this;\n let selectorPath;\n let extend;\n let targetExtend ;\n let newExtend;\n\n iterationCount = iterationCount || 0;\n\n // loop through comparing every extend with every target extend.\n // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place\n // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the firs t extend extends the second one\n // and the second is the target.\n // the separation into two lists allows us to process a subset of chains with a bigger set, as is the\n // case when processing media queries\n for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) {\n for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) {\n\n extend = extendsList[extendIndex];\n targetExtend = extendsListTarget[targetExtendIndex];\n\n // look for circular references\n if ( extend.parent_ids.i ndexOf( targetExtend.object_id ) >= 0 ) { continue; }\n\n // find a match in the target extends self selector (the bit before :extend)\n selectorPath = [targetExtend.selfSelectors[0]];\n matches = extendVisitor.findMatch(extend, selectorPath);\n\n if (matches. length) {\n extend.hasFoundMatches = true;\n\n // we found a match, so for each self selector..\n exten d.selfSelectors.forEach(function(selfSelector) {\n const info = targetExtend.visibilityInfo();\n\n // process the extend as usual\n newSelector = extendVisitor.extendSelec tor(matches, selectorPath, selfSelector, extend.isVisible());\n\n // but now we create a new extend from it\n newE xtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetEx tend.fileInfo(), info);\n newExtend.selfSelectors = newSe lector;\n\n // add the extend onto the list of extends fo r that selector\n newSelector[newSelector.length - 1].ext endList = [newExtend];\n\n // record that we need to add it.\n extendsToAdd.push(newExtend);\n newExtend.ruleset = targetExtend.ruleset;\n\n // reme mber its parents for circular references\n newExtend.pare nt_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids) ;\n\n // only process the selector once.. if we have :ext end(.a,.b) then multiple\n // extends will look at the sa me selector path, so when extending\n // we know that any others will be duplicates in terms of what is added to the css\n if (targetExtend.firstExtendOnThisSelectorPath) {\n newExtend.firstExtendOnThisSelectorPath = true;\n targetExtend.ruleset.paths.push(newSelector);\n }\n });\n }\n }\n }\n\n i f (extendsToAdd.length) {\n // try to detect circular references to s top a stack overflow.\n // may no longer be needed.\n this .extendChainCount++;\n if (iterationCount > 100) {\n l et selectorOne = '{unable to calculate}';\n let selectorTwo = '{u nable to calculate}';\n try {\n selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();\n selectorTwo = ext endsToAdd[0].selector.toCSS();\n }\n catch (e) {}\ n throw { message: `extend circular reference detected. One of th e circular extends is currently:${selectorOne}:extend(${selectorTwo})`};\n }\n\n // now process the new extends on the existing rules so t hat we can handle a extending b extending c extending\n // d extendin g e...\n return extendsToAdd.concat(extendVisitor.doExtendChaining(ex tendsToAdd, extendsListTarget, iterationCount + 1));\n } else {\n return extendsToAdd;\n }\n }\n\n visitDeclaration(ruleNode, vis itArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefini tion(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitSelector(selectorNode, visitArgs) {\n visitArgs.visitDe eper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if ( rulesetNode.root) {\n return;\n }\n let matches;\n let pathIndex;\n let extendIndex;\n const allExtends = this.all ExtendsStack[this.allExtendsStack.length - 1];\n const selectorsToAdd = [ ];\n const extendVisitor = this;\n let selectorPath;\n\n // look at each selector path in the ruleset, find any extend matches and then cop y, find and replace\n\n for (extendIndex = 0; extendIndex < allExtends.le ngth; extendIndex++) {\n for (pathIndex = 0; pathIndex < rulesetNode. paths.length; pathIndex++) {\n selectorPath = rulesetNode.paths[p athIndex];\n\n // extending extends happens initially, before the main pass\n if (rulesetNode.extendOnEveryPath) { continue; }\n const extendList = selectorPath[selectorPath.length - 1].extendLis t;\n if (extendList && extendList.length) { continue; }\n\n matches = this.findMatch(allExtends[extendIndex], selectorPath);\n\n if (matches.length) {\n allExtends[extendIndex] .hasFoundMatches = true;\n\n allExtends[extendIndex].selfSele ctors.forEach(function(selfSelector) {\n let extendedSele ctors;\n extendedSelectors = extendVisitor.extendSelector (matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible());\n selectorsToAdd.push(extendedSelectors);\n });\n }\n }\n }\n rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd);\n }\n\n findMatch(extend, haysta ckSelectorPath) {\n //\n // look through the haystack selector pat h to try and find the needle - extend.selector\n // returns an array of s elector matches that can then be replaced\n //\n let haystackSelec torIndex;\n\n let hackstackSelector;\n let hackstackElementIndex;\ n let haystackElement;\n let targetCombinator;\n let i;\n const extendVisitor = this;\n const needleElements = extend.selecto r.elements;\n const potentialMatches = [];\n let potentialMatch;\n const matches = [];\n\n // loop through the haystack elements\n for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPa th.length; haystackSelectorIndex++) {\n hackstackSelector = haystackS electorPath[haystackSelectorIndex];\n\n for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIn dex++) {\n\n haystackElement = hackstackSelector.elements[hacksta ckElementIndex];\n\n // if we allow elements before our match we can add a potential match every time. otherwise only at the first element.\n if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackE lementIndex === 0)) {\n potentialMatches.push({pathIndex: hay stackSelectorIndex, index: hackstackElementIndex, matched: 0,\n initialCombinator: haystackElement.combinator});\n }\n\n for (i = 0; i < potentialMatches.length; i++) {\n potentialMatch = potentialMatches[i];\n\n // selectors add \" \" onto the first element. When we use & it joins the selectors together, bu t if we don't\n // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to\n // work out what the resulting combinator will be\n targe tCombinator = haystackElement.combinator.value;\n if (targetC ombinator === '' && hackstackElementIndex === 0) {\n targ etCombinator = ' ';\n }\n\n // if we don't match, null our match to indicate failure\n if (!extendVisit or.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackEl ement.value) ||\n (potentialMatch.matched > 0 && needleEl ements[potentialMatch.matched].combinator.value !== targetCombinator)) {\n potentialMatch = null;\n } else {\n potentialMatch.matched++;\n }\n\n // if we are still valid and have finished, test whether we have element s after and whether these are allowed\n if (potentialMatch) { \n potentialMatch.finished = potentialMatch.matched === n eedleElements.length;\n if (potentialMatch.finished &&\n (!extend.allowAfter &&\n (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSel ectorIndex + 1 < haystackSelectorPath.length))) {\n p otentialMatch = null;\n }\n }\n // if null we remove, if not, we are still valid, so either push as a valid match or continue\n if (potentialMatch) {\n if (potentialMatch.finished) {\n poten tialMatch.length = needleElements.length;\n potential Match.endPathIndex = haystackSelectorIndex;\n potenti alMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of m atch\n potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again\n matche s.push(potentialMatch);\n }\n } else { \n potentialMatches.splice(i, 1);\n i--;\n }\n }\n }\n }\n return matches;\n }\n\n isElementValuesEqual(elementValue1, elementVal ue2) {\n if (typeof elementValue1 === 'string' || typeof elementValue2 == = 'string') {\n return elementValue1 === elementValue2;\n }\n if (elementValue1 instanceof tree.Attribute) {\n if (elementVa lue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {\n return false;\n }\n if (!elementValue1.value | | !elementValue2.value) {\n if (elementValue1.value || elementVal ue2.value) {\n return false;\n }\n return true;\n }\n elementValue1 = elementValue1.value .value || elementValue1.value;\n elementValue2 = elementValue2.value. value || elementValue2.value;\n return elementValue1 === elementValue 2;\n }\n elementValue1 = elementValue1.value;\n elementValu e2 = elementValue2.value;\n if (elementValue1 instanceof tree.Selector) { \n if (!(elementValue2 instanceof tree.Selector) || elementValue1.ele ments.length !== elementValue2.elements.length) {\n return false; \n }\n for (let i = 0; i < elementValue1.elements.length; i++) {\n if (elementValue1.elements[i].combinator.value !== elem entValue2.elements[i].combinator.value) {\n if (i !== 0 || (e lementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i] .combinator.value || ' ')) {\n return false;\n }\n }\n if (!this.isElementValuesEqual(el ementValue1.elements[i].value, elementValue2.elements[i].value)) {\n return false;\n }\n }\n return true ;\n }\n return false;\n }\n\n extendSelector(matches, select orPath, replacementSelector, isVisible) {\n\n // for a set of matches, re place each match with the replacement selector\n\n let currentSelectorPat hIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector , firstElement, match, newElements;\n\n for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {\n match = matches[matchIndex];\n selector = selectorPath[match.pathIndex];\n firstElement = ne w tree.Element(\n match.initialCombinator,\n repla cementSelector.elements[0].value,\n replacementSelector.elements[ 0].isVariable,\n replacementSelector.elements[0].getIndex(),\n replacementSelector.elements[0].fileInfo()\n );\n\n if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElem entIndex > 0) {\n path[path.length - 1].elements = path[path.leng th - 1]\n .elements.concat(selectorPath[currentSelectorPathIn dex].elements.slice(currentSelectorPathElementIndex));\n currentS electorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n\n newElements = selector.elements\n .slice( currentSelectorPathElementIndex, match.index)\n .concat([firstEle ment])\n .concat(replacementSelector.elements.slice(1));\n\n if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) {\n path[path.length - 1].elements =\n path[path.le ngth - 1].elements.concat(newElements);\n } else {\n p ath = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex)) ;\n\n path.push(new tree.Selector(\n newElemen ts\n ));\n }\n currentSelectorPathIndex = m atch.endPathIndex;\n currentSelectorPathElementIndex = match.endPathE lementIndex;\n if (currentSelectorPathElementIndex >= selectorPath[cu rrentSelectorPathIndex].elements.length) {\n currentSelectorPathE lementIndex = 0;\n currentSelectorPathIndex++;\n }\n }\n\n if (currentSelectorPathIndex < selectorPath.length && current SelectorPathElementIndex > 0) {\n path[path.length - 1].elements = pa th[path.length - 1]\n .elements.concat(selectorPath[currentSelect orPathIndex].elements.slice(currentSelectorPathElementIndex));\n curr entSelectorPathIndex++;\n }\n\n path = path.concat(selectorPath.sl ice(currentSelectorPathIndex, selectorPath.length));\n path = path.map(fu nction (currentValue) {\n // we can re-use elements here, because the visibility property matters only for selectors\n const derived = cur rentValue.createDerived(currentValue.elements);\n if (isVisible) {\n derived.ensureVisibility();\n } else {\n derived.ensureInvisibility();\n }\n return derived;\n });\n return path;\n }\n\n visitMedia(mediaNode, visitArgs) {\ n let newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[th is.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(t his.doExtendChaining(newAllExtends, mediaNode.allExtends));\n this.allExt endsStack.push(newAllExtends);\n }\n\n visitMediaOut(mediaNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStac k.length = lastIndex;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n let newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.all ExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.do ExtendChaining(newAllExtends, atRuleNode.allExtends));\n this.allExtendsS tack.push(newAllExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n co nst lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.l ength = lastIndex;\n }\n}\n\nexport default ProcessExtendsVisitor;\n","import Visitor from './visitor';\n\nclass JoinSelectorVisitor {\n constructor() {\n this.contexts = [[]];\n this._visitor = new Visitor(this);\n } \n\n run(root) {\n return this._visitor.visit(root);\n }\n\n vis itDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visit Args.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n const paths = [];\n let selectors;\n\n this.contexts.push(paths);\n\n if (!rulesetNode.root) {\n selectors = rulesetNode.selectors;\n if (selectors) {\n selectors = selectors.filter(functi on(selector) { return selector.getIsOutput(); });\n rulesetNode.s electors = selectors.length ? selectors : (selectors = null);\n i f (selectors) { rulesetNode.joinSelectors(paths, context, selectors); }\n }\n if (!selectors) { rulesetNode.rules = null; }\n r ulesetNode.paths = paths;\n }\n }\n\n visitRulesetOut(rulesetNode) {\n this.contexts.length = this.contexts.length - 1;\n }\n\n visitM edia(mediaNode, visitArgs) {\n const context = this.contexts[this.context s.length - 1];\n mediaNode.rules[0].root = (context.length === 0 || conte xt[0].multiMedia);\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n c onst context = this.contexts[this.contexts.length - 1];\n if (atRuleNode. rules && atRuleNode.rules.length) {\n atRuleNode.rules[0].root = (atR uleNode.isRooted || context.length === 0 || null);\n }\n }\n}\n\nexpor t default JoinSelectorVisitor;\n","import tree from '../tree';\nimport Visitor f rom './visitor';\n\nclass CSSVisitorUtils {\n constructor(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n }\n\n containsSilentNonBlockedChild(bodyRules) {\n let rule;\n if (! bodyRules) {\n return false;\n }\n for (let r = 0; r < bodyRules.length; r++) {\n rule = bodyRules[r];\n if (rule .isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {\n // the atrule contains something that was referenced (likely by extend )\n // therefore it needs to be shown in output too\n return true;\n }\n }\n return false;\n }\n\n keepOnlyVisibleChilds(owner) {\n if (owner && owner.rules) {\n owner.rules = owner.rules.filter(thing => thing.isVisible());\n }\n } \n\n isEmpty(owner) {\n return (owner && owner.rules) \n ? (owner.rules.length === 0) : true;\n }\n\n hasVisibleSelector(rulesetNode) {\n return (rulesetNode && rulesetNode.paths)\n ? (rulesetNod e.paths.length > 0) : false;\n }\n\n resolveVisibility(node, originalRules ) {\n if (!node.blocksVisibility()) {\n if (this.isEmpty(node) && !this.containsSilentNonBlockedChild(originalRules)) {\n retur n ;\n }\n\n return node;\n }\n\n const compi ledRulesBody = node.rules[0];\n this.keepOnlyVisibleChilds(compiledRulesB ody);\n\n if (this.isEmpty(compiledRulesBody)) {\n return ;\n }\n\n node.ensureVisibility();\n node.removeVisibilityBlock ();\n\n return node;\n }\n\n isVisibleRuleset(rulesetNode) {\n if (rulesetNode.firstRoot) {\n return true;\n }\n\n if (this.isEmpty(rulesetNode)) {\n return false;\n }\n\n if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {\n return false;\n }\n\n return true;\n }\n}\n\nconst ToCSSVisito r = function(context) {\n this._visitor = new Visitor(this);\n this._conte xt = context;\n this.utils = new CSSVisitorUtils(context);\n};\n\nToCSSVisito r.prototype = {\n isReplacing: true,\n run: function (root) {\n ret urn this._visitor.visit(root);\n },\n\n visitDeclaration: function (declNo de, visitArgs) {\n if (declNode.blocksVisibility() || declNode.variable) {\n return;\n }\n return declNode;\n },\n\n visit MixinDefinition: function (mixinNode, visitArgs) {\n // mixin definitions do not get eval'd - this means they keep state\n // so we have to clear that state here so it isn't used if toCSS is called twice\n mixinNode.fra mes = [];\n },\n\n visitExtend: function (extendNode, visitArgs) {\n }, \n\n visitComment: function (commentNode, visitArgs) {\n if (commentNo de.blocksVisibility() || commentNode.isSilent(this._context)) {\n ret urn;\n }\n return commentNode;\n },\n\n visitMedia: function (mediaNode, visitArgs) {\n const originalRules = mediaNode.rules[0].rules ;\n mediaNode.accept(this._visitor);\n visitArgs.visitDeeper = fal se;\n\n return this.utils.resolveVisibility(mediaNode, originalRules);\n },\n\n visitImport: function (importNode, visitArgs) {\n if (import Node.blocksVisibility()) {\n return ;\n }\n return impo rtNode;\n },\n\n visitAtRule: function(atRuleNode, visitArgs) {\n i f (atRuleNode.rules && atRuleNode.rules.length) {\n return this.visit AtRuleWithBody(atRuleNode, visitArgs);\n } else {\n return thi s.visitAtRuleWithoutBody(atRuleNode, visitArgs);\n }\n },\n\n visit Anonymous: function(anonymousNode, visitArgs) {\n if (!anonymousNode.bloc ksVisibility()) {\n anonymousNode.accept(this._visitor);\n return anonymousNode;\n }\n },\n\n visitAtRuleWithBody: function(a tRuleNode, visitArgs) {\n // if there is only one nested ruleset and that one has no path, then it is\n // just fake ruleset\n function has FakeRuleset(atRuleNode) {\n const bodyRules = atRuleNode.rules;\n return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].pa ths.length === 0);\n }\n function getBodyRules(atRuleNode) {\n const nodeRules = atRuleNode.rules;\n if (hasFakeRuleset(atRu leNode)) {\n return nodeRules[0].rules;\n }\n\n return nodeRules;\n }\n // it is still true that it is only o ne ruleset in array\n // this is last such moment\n // process chi lds\n const originalRules = getBodyRules(atRuleNode);\n atRuleNode .accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n if (! this.utils.isEmpty(atRuleNode)) {\n this._mergeRules(atRuleNode.rules [0].rules);\n }\n\n return this.utils.resolveVisibility(atRuleNode , originalRules);\n },\n\n visitAtRuleWithoutBody: function(atRuleNode, vi sitArgs) {\n if (atRuleNode.blocksVisibility()) {\n return;\n }\n\n if (atRuleNode.name === '@charset') {\n // Only o utput the debug info together with subsequent @charset definitions\n // a comment (or @media statement) before the actual @charset atrule would\n // be considered illegal css as it has to be on the first line\n if (this.charset) {\n if (atRuleNode.debugInfo) {\n const comment = new tree.Comment(`/* ${atRuleNode.toCSS(this._context) .replace(/\\n/g, '')} */\\n`);\n comment.debugInfo = atRuleNo de.debugInfo;\n return this._visitor.visit(comment);\n }\n return;\n }\n this.charset = t rue;\n }\n\n return atRuleNode;\n },\n\n checkValidNodes: fu nction(rules, isRoot) {\n if (!rules) {\n return;\n }\n \n for (let i = 0; i < rules.length; i++) {\n const ruleNode = rules[i];\n if (isRoot && ruleNode instanceof tree.Declaration && !r uleNode.variable) {\n throw { message: 'Properties must be inside selector blocks. They cannot be in the root',\n index: ruleN ode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\ n }\n if (ruleNode instanceof tree.Call) {\n throw { message: `Function '${ruleNode.name}' did not return a root node`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && r uleNode.fileInfo().filename};\n }\n if (ruleNode.type && ! ruleNode.allowRoot) {\n throw { message: `${ruleNode.type} node r eturned by a function is not valid here`,\n index: ruleNode.g etIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n }\n },\n\n visitRuleset: function (rulesetNode, visitAr gs) {\n // at this point rulesets are nested into each other\n let rule;\n\n const rulesets = [];\n\n this.checkValidNodes(rulesetNo de.rules, rulesetNode.firstRoot);\n\n if (!rulesetNode.root) {\n // remove invisible paths\n this._compileRulesetPaths(rulesetNode) ;\n\n // remove rulesets from this ruleset body and compile them sepa rately\n const nodeRules = rulesetNode.rules;\n\n let node RuleCnt = nodeRules ? nodeRules.length : 0;\n for (let i = 0; i < nod eRuleCnt; ) {\n rule = nodeRules[i];\n if (rule && rule.rules) {\n // visit because we are moving them out from being a child\n rulesets.push(this._visitor.visit(rule));\n nodeRules.splice(i, 1);\n nodeRuleCnt--;\n continue;\n }\n i++;\n }\n // accept the visitor to remove rules and refactor itself\n // then we can decide nogw whether we want it or not\n // c ompile body\n if (nodeRuleCnt > 0) {\n rulesetNode.acc ept(this._visitor);\n } else {\n rulesetNode.rules = n ull;\n }\n visitArgs.visitDeeper = false;\n } else { // if (! rulesetNode.root) {\n rulesetNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n }\n\n if (rulesetNode .rules) {\n this._mergeRules(rulesetNode.rules);\n this._r emoveDuplicateRules(rulesetNode.rules);\n }\n\n // now decide whet her we keep the ruleset\n if (this.utils.isVisibleRuleset(rulesetNode)) { \n rulesetNode.ensureVisibility();\n rulesets.splice(0, 0, rulesetNode);\n }\n\n if (rulesets.length === 1) {\n r eturn rulesets[0];\n }\n return rulesets;\n },\n\n _compileR ulesetPaths: function(rulesetNode) {\n if (rulesetNode.paths) {\n rulesetNode.paths = rulesetNode.paths\n .filter(p => {\n let i;\n if (p[0].elements[0].combinator.value === ' ') {\n p[0].elements[0].combinator = new(tree.Comb inator)('');\n }\n for (i = 0; i < p.lengt h; i++) {\n if (p[i].isVisible() && p[i].getIsOutput()) { \n return true;\n }\n }\n return false;\n });\n }\ n },\n\n _removeDuplicateRules: function(rules) {\n if (!rules) { r eturn; }\n\n // remove duplicates\n const ruleCache = {};\n\n let ruleList;\n let rule;\n let i;\n\n for (i = rules.le ngth - 1; i >= 0 ; i--) {\n rule = rules[i];\n if (rule in stanceof tree.Declaration) {\n if (!ruleCache[rule.name]) {\n ruleCache[rule.name] = rule;\n } else {\n ruleList = ruleCache[rule.name];\n if (ruleList i nstanceof tree.Declaration) {\n ruleList = ruleCache[rule .name] = [ruleCache[rule.name].toCSS(this._context)];\n }\n const ruleCSS = rule.toCSS(this._context);\n if (ruleList.indexOf(ruleCSS) !== -1) {\n rules.splice( i, 1);\n } else {\n ruleList.push(rule CSS);\n }\n }\n }\n }\n } ,\n\n _mergeRules: function(rules) {\n if (!rules) {\n retu rn; \n }\n\n const groups = {};\n const groupsArr = [];\ n\n for (let i = 0; i < rules.length; i++) {\n const rule = ru les[i];\n if (rule.merge) {\n const key = rule.name;\n groups[key] ? rules.splice(i--, 1) : \n group sArr.push(groups[key] = []);\n groups[key].push(rule);\n }\n }\n\n groupsArr.forEach(group => {\n if (group.l ength > 0) {\n const result = group[0];\n let spac e = [];\n const comma = [new tree.Expression(space)];\n group.forEach(rule => {\n if ((rule.merge === '+') && (space.length > 0)) {\n comma.push(new tree.Expression(s pace = []));\n }\n space.push(rule.value); \n result.important = result.important || rule.important;\n });\n result.value = new tree.Value(comma);\n }\n });\n }\n};\n\nexport default ToCSSVisitor;\n","import Visit or from './visitor';\nimport ImportVisitor from './import-visitor';\nimport Mark VisibleSelectorsVisitor from './set-tree-visibility-visitor';\nimport ExtendVisi tor from './extend-visitor';\nimport JoinSelectorVisitor from './join-selector-v isitor';\nimport ToCSSVisitor from './to-css-visitor';\n\nexport default {\n Visitor,\n ImportVisitor,\n MarkVisibleSelectorsVisitor,\n ExtendVisito r,\n JoinSelectorVisitor,\n ToCSSVisitor\n};\n","import chunker from './ch unker';\n\nexport default () => {\n let // Less input string\n input;\ n\n let // current chunk\n j;\n\n const // holds state for backtrac king\n saveStack = [];\n\n let // furthest index the parser has gone t o\n furthest;\n\n let // if this is furthest we got to, this is the pr obably cause\n furthestPossibleErrorMessage;\n\n let // chunkified inp ut\n chunks;\n\n let // current chunk\n current;\n\n let // index of current chunk, in `input`\n currentPos;\n\n const parserInput = {};\n const CHARCODE_SPACE = 32;\n const CHARCODE_TAB = 9;\n const C HARCODE_LF = 10;\n const CHARCODE_CR = 13;\n const CHARCODE_PLUS = 43;\n const CHARCODE_COMMA = 44;\n const CHARCODE_FORWARD_SLASH = 47;\n const CHARCODE_9 = 57;\n\n function skipWhitespace(length) {\n const oldi = parserInput.i;\n const oldj = j;\n const curr = parserInput.i - cu rrentPos;\n const endIndex = parserInput.i + current.length - curr;\n const mem = (parserInput.i += length);\n const inp = input;\n let c;\n let nextChar;\n let comment;\n\n for (; parserInpu t.i < endIndex; parserInput.i++) {\n c = inp.charCodeAt(parserInput.i );\n\n if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SL ASH) {\n nextChar = inp.charAt(parserInput.i + 1);\n if (nextChar === '/') {\n comment = {index: parserInput.i, isLineComment: true};\n let nextNewLine = inp.indexOf('\\n', parserInput.i + 2);\n if (nextNewLine < 0) {\n nextNewLine = endIndex;\n }\n pa rserInput.i = nextNewLine;\n comment.text = inp.substr(commen t.index, parserInput.i - comment.index);\n parserInput.commen tStore.push(comment);\n continue;\n } else if (nextChar === '*') {\n const nextStarSlash = inp.indexOf('*/' , parserInput.i + 2);\n if (nextStarSlash >= 0) {\n comment = {\n index: parserInput.i,\n text: inp.substr(parserInput.i, nextStarSlash + 2 - pa rserInput.i),\n isLineComment: false\n };\n parserInput.i += comment.text.length - 1;\n parserInput.commentStore.push(comment);\n continue;\n }\n }\n br eak;\n }\n\n if ((c !== CHARCODE_SPACE) && (c !== CHARCODE _LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {\n break;\n }\n }\n\n current = current.slice(length + parserInput .i - mem + curr);\n currentPos = parserInput.i;\n\n if (!current.l ength) {\n if (j < chunks.length - 1) {\n current = ch unks[++j];\n skipWhitespace(0); // skip space at the beginning of a chunk\n return true; // things changed\n }\n parserInput.finished = true;\n }\n\n return oldi !== parserIn put.i || oldj !== j;\n }\n\n parserInput.save = () => {\n currentPo s = parserInput.i;\n saveStack.push( { current, i: parserInput.i, j });\n };\n parserInput.restore = possibleErrorMessage => {\n\n if (parse rInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !f urthestPossibleErrorMessage)) {\n furthest = parserInput.i;\n furthestPossibleErrorMessage = possibleErrorMessage;\n }\n con st state = saveStack.pop();\n current = state.current;\n currentPo s = parserInput.i = state.i;\n j = state.j;\n };\n parserInput.forg et = () => {\n saveStack.pop();\n };\n parserInput.isWhitespace = o ffset => {\n const pos = parserInput.i + (offset || 0);\n const co de = input.charCodeAt(pos);\n return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);\n };\n\n / / Specialization of $(tok)\n parserInput.$re = tok => {\n if (parserIn put.i > currentPos) {\n current = current.slice(parserInput.i - curre ntPos);\n currentPos = parserInput.i;\n }\n\n const m = tok.exec(current);\n if (!m) {\n return null;\n }\n\n skipWhitespace(m[0].length);\n if (typeof m === 'string') {\n return m;\n }\n\n return m.length === 1 ? m[0] : m;\n }; \n\n parserInput.$char = tok => {\n if (input.charAt(parserInput.i) != = tok) {\n return null;\n }\n skipWhitespace(1);\n return tok;\n };\n\n parserInput.$str = tok => {\n const tokLeng th = tok.length;\n\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tokLength; i++) {\n if (input.charAt(parserInput. i + i) !== tok.charAt(i)) {\n return null;\n }\n }\n\n skipWhitespace(tokLength);\n return tok;\n };\n\n pa rserInput.$quoted = loc => {\n const pos = loc || parserInput.i;\n const startChar = input.charAt(pos);\n\n if (startChar !== '\\'' && star tChar !== '\"') {\n return;\n }\n const length = input. length;\n const currentPosition = pos;\n\n for (let i = 1; i + cur rentPosition < length; i++) {\n const nextChar = input.charAt(i + cur rentPosition);\n switch (nextChar) {\n case '\\\\':\n i++;\n continue;\n case '\\ r':\n case '\\n':\n break;\n ca se startChar:\n const str = input.substr(currentPosition, i + 1);\n if (!loc && loc !== 0) {\n skip Whitespace(i + 1);\n return str\n }\n return [startChar, str];\n default:\n }\n }\n return null;\n };\n\n /**\n * Permissive pars ing. Ignores everything except matching {} [] () and quotes\n * until matchi ng token (outside of blocks)\n */\n parserInput.$parseUntil = tok => {\n let quote = '';\n let returnVal = null;\n let inComment = f alse;\n let blockDepth = 0;\n const blockStack = [];\n cons t parseGroups = [];\n const length = input.length;\n const startPo s = parserInput.i;\n let lastPos = parserInput.i;\n let i = parser Input.i;\n let loop = true;\n let testChar;\n\n if (typeof tok === 'string') {\n testChar = char => char === tok\n } else {\n testChar = char => tok.test(char)\n }\n\n do {\n let prevChar;\n let nextChar = input.charAt(i);\n if (blockDepth === 0 && testChar(nextChar)) {\n returnVal = inp ut.substr(lastPos, i - lastPos);\n if (returnVal) {\n parseGroups.push(returnVal);\n }\n else {\ n parseGroups.push(' ');\n }\n returnVal = parseGroups;\n skipWhitespace(i - startPos);\n loop = false\n } else {\n if (inComment) {\n if (nextChar === '*' && \n input.charA t(i + 1) === '/') {\n i++;\n block Depth--;\n inComment = false;\n }\n i++;\n continue;\n }\n switch (nextChar) {\n case '\\\\':\n i++;\n nextChar = input.charAt(i);\n parseGroups.push(input.substr(lastPos, i - lastPos + 1));\n lastPos = i + 1;\n break;\n case '/':\n if (input.charAt(i + 1) === '*') {\n i++;\n inComment = true;\n blockDepth++;\n }\n break;\n case '\\'':\n case '\"' :\n quote = parserInput.$quoted(i);\n if (quote) {\n parseGroups.push(input.substr(last Pos, i - lastPos), quote);\n i += quote[1].length - 1 ;\n lastPos = i + 1;\n }\n else {\n skipWhitespace(i - start Pos);\n returnVal = nextChar;\n loop = false;\n }\n break;\n case '{':\n blockStack.push('}');\n blockDepth++;\n break;\n case '(':\n blockStack.push(')');\n blockDepth++;\n break;\n ca se '[':\n blockStack.push(']');\n blockDepth++;\n break;\n case '}':\n case ')':\n case ']':\n const expected = blockStack.pop();\n if (nextChar === expected) {\n blockDepth--;\n } else {\n // move the parser to the error and retur n expected\n skipWhitespace(i - startPos);\n returnVal = expected;\n loop = fal se;\n }\n }\n i++;\n if (i > length) {\n loop = false;\n } \n }\n prevChar = nextChar;\n } while (loop);\n\n return returnVal ? returnVal : null;\n }\n\n parserInput.autoComment Absorb = true;\n parserInput.commentStore = [];\n parserInput.finished = f alse;\n\n // Same as $(), but don't change the state of the parser,\n // j ust return the match.\n parserInput.peek = tok => {\n if (typeof tok = == 'string') {\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tok.length; i++) {\n if (input.charAt(par serInput.i + i) !== tok.charAt(i)) {\n return false;\n }\n }\n return true;\n } else {\n return tok.test(current);\n }\n };\n\n // Specialization of peek ()\n // TODO remove or change some currentChar calls to peekChar\n parserI nput.peekChar = tok => input.charAt(parserInput.i) === tok;\n\n parserInput.c urrentChar = () => input.charAt(parserInput.i);\n\n parserInput.prevChar = () => input.charAt(parserInput.i - 1);\n\n parserInput.getInput = () => input;\ n\n parserInput.peekNotNumeric = () => {\n const c = input.charCodeAt( parserInput.i);\n // Is the first char of the dimension 0-9, '.', '+' or '-'\n return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORW ARD_SLASH || c === CHARCODE_COMMA;\n };\n\n parserInput.start = (str, chun kInput, failFunction) => {\n input = str;\n parserInput.i = j = cu rrentPos = furthest = 0;\n\n // chunking apparently makes things quicker (but my tests indicate\n // it might actually make things slower in node at least)\n // and it is a non-perfect parse - it can't recognise\n // unquoted urls, meaning it can't distinguish comments\n // meaning co mments with quotes or {}() in them get 'counted'\n // and then lead to pa rse errors.\n // In addition if the chunking chunks in the wrong place we might\n // not be able to parse a parser statement in one go\n // this is officially deprecated but can be switched on via an option\n // in the case it causes too much performance issues.\n if (chunkInput) {\n chunks = chunker(str, failFunction);\n } else {\n c hunks = [str];\n }\n\n current = chunks[0];\n\n skipWhitesp ace(0);\n };\n\n parserInput.end = () => {\n let message;\n const isFinished = parserInput.i >= input.length;\n\n if (parserInput.i < furthest) {\n message = furthestPossibleErrorMessage;\n p arserInput.i = furthest;\n }\n return {\n isFinished,\n furthest: parserInput.i,\n furthestPossibleErrorMessage: message,\n furthestReachedEnd: parserInput.i >= input.length - 1,\n furthestChar: input[parserInput.i]\n };\n };\n\n return p arserInput;\n};\n","// Split the input into chunks.\nexport default function (in put, fail) {\n const len = input.length;\n let level = 0;\n let parenLe vel = 0;\n let lastOpening;\n let lastOpeningParen;\n let lastMultiComm ent;\n let lastMultiCommentEndBrace;\n const chunks = [];\n let emitFro m = 0;\n let chunkerCurrentIndex;\n let currentChunkStartIndex;\n let c c;\n let cc2;\n let matched;\n\n function emitChunk(force) {\n c onst len = chunkerCurrentIndex - emitFrom;\n if (((len < 512) && !force) || !len) {\n return;\n }\n chunks.push(input.slice(emit From, chunkerCurrentIndex + 1));\n emitFrom = chunkerCurrentIndex + 1;\n }\n\n for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurr entIndex++) {\n cc = input.charCodeAt(chunkerCurrentIndex);\n if ( ((cc >= 97) && (cc <= 122)) || (cc < 34)) {\n // a-z or whitespace\n continue;\n }\n\n switch (cc) {\n case 40: // (\n parenLevel++;\n lastO peningParen = chunkerCurrentIndex;\n continue;\n case 41: // )\n if (--parenLevel < 0) {\n return fail('missing opening `(`', chunkerCurrentIndex);\n }\n continue;\n case 59: // ;\n if (!parenLevel) { emitChunk(); }\n conti nue;\n case 123: // {\n level++; \n lastOpening = chunkerCurrentIndex;\n continue;\ n case 125: // }\n if (--level < 0) {\n return fail('missing opening `{`', chunkerCurrentInde x);\n }\n if (!level && !parenLevel) { emitChunk() ; }\n continue;\n case 92: // \ \\n if (chunkerCurrentIndex < len - 1) { chunkerCurrentIndex++; c ontinue; }\n return fail('unescaped `\\\\`', chunkerCurrentIndex) ;\n case 34:\n case 39:\n case 96: // \", ' and `\n matched = 0;\n current ChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\ n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 > 96) { continue; }\n if (cc2 == cc) { matched = 1; break; }\n if (cc2 == 92) { // \\\n if (chunkerCurrentIndex == len - 1) {\n re turn fail('unescaped `\\\\`', chunkerCurrentIndex);\n }\n chunkerCurrentIndex++;\n }\n }\n if (matched) { continue; }\n return fai l(`unmatched \\`${String.fromCharCode(cc)}\\``, currentChunkStartIndex);\n case 47: // /, check for comment\n i f (parenLevel || (chunkerCurrentIndex == len - 1)) { continue; }\n cc2 = input.charCodeAt(chunkerCurrentIndex + 1);\n if (cc2 == 4 7) {\n // //, find lnfeed\n for (chunkerCu rrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentI ndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\ n if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { brea k; }\n }\n } else if (cc2 == 42) {\n // /*, find */\n lastMultiComment = currentChunkSta rtIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = c hunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) {\ n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 == 125) { lastMultiCommentEndBrace = chunkerCurrentIndex; }\n if (cc2 != 42) { continue; }\n if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { break; }\n }\n if (chunkerCurrentIndex == len - 1) {\n return fail('missing closing `*/`', currentChunkStartIndex);\n }\n chunkerCurrentIndex++;\n }\ n continue;\n case 42: // *, che ck for unmatched */\n if ((chunkerCurrentIndex < len - 1) && (inp ut.charCodeAt(chunkerCurrentIndex + 1) == 47)) {\n return fai l('unmatched `/*`', chunkerCurrentIndex);\n }\n co ntinue;\n }\n }\n\n if (level !== 0) {\n if ((lastMultiComme nt > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) {\n return fail('missing closing `}` or `*/`', lastOpening);\n } else {\n return fail('missing closing `}`', lastOpening);\n }\n } el se if (parenLevel !== 0) {\n return fail('missing closing `)`', lastOpeni ngParen);\n }\n\n emitChunk(true);\n return chunks;\n};\n","import Less Error from '../less-error';\nimport tree from '../tree';\nimport visitors from ' ../visitors';\nimport getParserInput from './parser-input';\nimport * as utils f rom '../utils';\nimport functionRegistry from '../functions/function-registry';\ n\n//\n// less.js - parser\n//\n// A relatively straight-forward predictive p arser.\n// There is no tokenization/lexing stage, the input is parsed\n// in one sweep.\n//\n// To make the parser fast enough to run in the browser, s everal\n// optimization had to be made:\n//\n// - Matching and slicing on a huge input is often cause of slowdowns.\n// The solution is to chunkify t he input into smaller strings.\n// The chunks are stored in the `chunks` va r,\n// `j` holds the current chunk index, and `currentPos` holds\n// t he index of the current chunk in relation to `input`.\n// This gives us an almost 4x speed-up.\n//\n// - In many cases, we don't need to match individua l tokens;\n// for example, if a value doesn't hold any variables, operation s\n// or dynamic references, the parser can effectively 'skip' it,\n// treating it as a literal.\n// An example would be '1px solid #000' - which evaluates to itself,\n// we don't need to know what the individual compone nts are.\n// The drawback, of course is that you don't get the benefits of\ n// syntax-checking on the CSS. This gives us a 50% speed-up in the parser, \n// and a smaller speed-up in the code-gen.\n//\n//\n// Token matching is done with the `$` function, which either takes\n// a terminal string or re gexp, or a non-terminal function to call.\n// It also takes care of moving al l the indices forwards.\n//\n\nconst Parser = function Parser(context, imports, fileInfo) {\n let parsers;\n const parserInput = getParserInput();\n\n function error(msg, type) {\n throw new LessError(\n {\n index: parserInput.i,\n filename: fileInfo.filename,\n type: type || 'Syntax',\n message: msg\n },\n imports\n );\n }\n\n function expect(arg, msg) {\ n // some older browsers return typeof 'function' for RegExp\n con st result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg) ;\n if (result) {\n return result;\n }\n \n error(msg || (typeof arg === 'string'\n ? `expected '${arg}' got ' ${parserInput.currentChar()}'`\n : 'unexpected token'));\n }\n\n // Specialization of expect()\n function expectChar(arg, msg) {\n if (parserInput.$char(arg)) {\n return arg;\n }\n error(m sg || `expected '${arg}' got '${parserInput.currentChar()}'`);\n }\n\n fun ction getDebugInfo(index) {\n const filename = fileInfo.filename;\n\n return {\n lineNumber: utils.getLocation(index, parserInput.getIn put()).line + 1,\n fileName: filename\n };\n }\n\n /**\n * Used after initial parsing to create nodes on the fly\n * \n * @param {String} str - string to parse \n * @param {Array} parseLi st - array of parsers to run input through e.g. [\"value\", \"important\"]\n * @param {Number} currentIndex - start number to begin indexing\n * @p aram {Object} fileInfo - fileInfo to attach to created nodes\n */\n f unction parseNode(str, parseList, currentIndex, fileInfo, callback) {\n l et result;\n const returnNodes = [];\n const parser = parserInput; \n\n try {\n parser.start(str, false, function fail(msg, index ) {\n callback({\n message: msg,\n index: index + currentIndex\n });\n });\n for (let x = 0, p, i; (p = parseList[x]); x++) {\n i = par ser.i;\n result = parsers[p]();\n if (result) {\n try {\n result._index = i + currentInd ex;\n result._fileInfo = fileInfo;\n } catch (e) {}\n returnNodes.push(result);\n }\ n else {\n returnNodes.push(null);\n }\n }\n\n const endInfo = parser.end();\n if (endInfo.isFinished) {\n callback(null, returnNodes);\n }\n else {\n callback(true, null);\n }\n } catch (e) {\n throw new LessError({\n ind ex: e.index + currentIndex,\n message: e.message\n }, imports, fileInfo.filename);\n }\n }\n\n //\n // The Parser\n //\n return {\n parserInput,\n imports,\n fileInfo,\n parseNode,\n //\n // Parse an input string into an abstract syntax tree,\n // @param str A string containing 'less' markup\n / / @param callback call `callback` when done.\n // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to ap ply\n //\n parse: function (str, callback, additionalData) {\n let root;\n let err = null;\n let globalVars;\n let modifyVars;\n let ignored;\n let preText = '' ;\n\n // Optionally disable @plugin parsing\n if (addition alData && additionalData.disablePluginRule) {\n parsers.plugin = function() {\n var dir = parserInput.$re(/^@plugin?\\s+/);\n if (dir) {\n error('@plugin statements are not allowed when disablePluginRule is set to true');\n } \n }\n };\n\n globalVars = (additionalData && additionalData.globalVars) ? `${Parser.serializeVars(additionalData.globalVar s)}\\n` : '';\n modifyVars = (additionalData && additionalData.modify Vars) ? `\\n${Parser.serializeVars(additionalData.modifyVars)}` : '';\n\n if (context.pluginManager) {\n const preProcessors = context .pluginManager.getPreProcessors();\n for (let i = 0; i < preProce ssors.length; i++) {\n str = preProcessors[i].process(str, { context, imports, fileInfo });\n }\n }\n\n if (globalVars || (additionalData && additionalData.banner)) {\n preText = ((additionalData && additionalData.banner) ? additionalData.banner : ' ') + globalVars;\n ignored = imports.contentsIgnoredChars;\n ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;\n ignored[fileInfo.filename] += preText.length;\n }\n\n str = str.replace(/\\r\\n?/g, '\\n');\n // Remove potential UTF Byte Order Mark\n str = preText + str.replace(/^\\uFEFF/, '') + modi fyVars;\n imports.contents[fileInfo.filename] = str;\n\n / / Start with the primary rule.\n // The whole syntax tree is held und er a Ruleset node,\n // with the `root` property set to true, so no ` {}` are\n // output. The callback is called when the input is parsed. \n try {\n parserInput.start(str, context.chunkInput, function fail(msg, index) {\n throw new LessError({\n index,\n type: 'Parse',\n message: msg,\n filename: fileInfo.filename\n }, imports);\n });\n\n tree.Node.p rototype.parse = this;\n root = new tree.Ruleset(null, this.parse rs.primary());\n tree.Node.prototype.rootNode = root;\n root.root = true;\n root.firstRoot = true;\n root.functionRegistry = functionRegistry.inherit();\n \n } catch (e) {\n return callback(new LessError(e, imports, fil eInfo.filename));\n }\n\n // If `i` is smaller than the `i nput.length - 1`,\n // it means the parser wasn't able to parse the w hole\n // string, so we've got a parsing error.\n //\n // We try to extract a \\n delimited string,\n // showing the line where the parse error occurred.\n // We split it up into two pa rts (the part which parsed,\n // and the part which didn't), so we ca n color them differently.\n const endInfo = parserInput.end();\n if (!endInfo.isFinished) {\n\n let message = endInfo.furth estPossibleErrorMessage;\n\n if (!message) {\n message = 'Unrecognised input';\n if (endInfo.furthestChar = == '}') {\n message += '. Possibly missing opening \\'{\\ '';\n } else if (endInfo.furthestChar === ')') {\n message += '. Possibly missing opening \\'(\\'';\n } else if (endInfo.furthestReachedEnd) {\n message += '. Possibly missing something';\n }\n }\n\n err = new LessError({\n type: 'Parse',\n message,\n index: endInfo.furthest,\n filename: fileInfo.filename\n }, imports);\n } \n\n const finish = e => {\n e = err || e || imports.e rror;\n\n if (e) {\n if (!(e instanceof LessEr ror)) {\n e = new LessError(e, imports, fileInfo.filename );\n }\n\n return callback(e);\n }\n else {\n return callback(null, root) ;\n }\n };\n\n if (context.processImports ! == false) {\n new visitors.ImportVisitor(imports, finish)\n .run(root);\n } else {\n return finish() ;\n }\n },\n\n //\n // Here in, the parsing rule s/functions\n //\n // The basic structure of the syntax tree gener ated is as follows:\n //\n // Ruleset -> Declaration -> Value - > Expression -> Entity\n //\n // Here's some Less code:\n / /\n // .class {\n // color: #fff;\n // border: 1px solid #000;\n // width: @w + 4px;\n // > .child {.. .}\n // }\n //\n // And here's what the parse tree might look like:\n //\n // Ruleset (Selector '.class', [\n / / Declaration (\"color\", Value ([Expression [Color #fff]]))\n / / Declaration (\"border\", Value ([Expression [Dimension 1px][Keyword \" solid\"][Color #000]]))\n // Declaration (\"width\", Value ([Exp ression [Operation \" + \" [Variable \"@w\"][Dimension 4px]]]))\n // Ruleset (Selector [Element '>', '.child'], [...])\n // ])\n //\n // In general, most rules will try to parse a token with the `$re ()` function, and if the return\n // value is truly, will return a new n ode, of the relevant type. Sometimes, we need to check\n // first, befor e parsing, that's when we use `peek()`.\n //\n parsers: parsers = {\n //\n // The `primary` rule is the *entry* and *exit* p oint of the parser.\n // The rules here can appear at any level of th e parse tree.\n //\n // The recursive nature of the gramma r is an interplay between the `block`\n // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,\n // as represen ted by this simplified grammar:\n //\n // primary → (ruleset | declaration)+\n // ruleset → selector+ block\n // block → '{' primary '}'\n //\n // Only at one point is the primary rule not called from the\n // block rule: a t the root level.\n //\n primary: function () {\n const mixin = this.mixin;\n let root = [];\n let node;\n\n while (true) {\n while (true) {\n node = this.comment();\n if (! node) { break; }\n root.push(node);\n }\n // always process comments before deciding if finished\n if (parserInput.finished) {\n break;\n }\n if (parserInput.peek('}')) {\n break;\n }\n\n node = thi s.extendRule();\n if (node) {\n root = root.concat(node);\n continue;\n }\n\ n node = mixin.definition() || this.declaration() || mixin.ca ll(false, false) || \n this.ruleset() || this.variableCal l() || this.entities.call() || this.atrule();\n if (node) {\n root.push(node);\n } else {\n let foundSemiColon = false;\n while (pars erInput.$char(';')) {\n foundSemiColon = true;\n }\n if (!foundSemiColon) {\n break;\n }\n }\n }\n\n return root;\n },\n\n // comments are collected by the main parsing mechanism and then assigned to nodes\ n // where the current structure allows it\n comment: func tion () {\n if (parserInput.commentStore.length) {\n const comment = parserInput.commentStore.shift();\n re turn new(tree.Comment)(comment.text, comment.isLineComment, comment.index, fileI nfo);\n }\n },\n\n //\n // Entit ies are tokens which can be found inside an Expression\n //\n entities: {\n mixinLookup: function() {\n return parsers.mixin.call(true, true);\n },\n //\n // A string, which supports escaping \" and '\n / /\n // \"milky way\" 'he\\'s the one!'\n //\n quoted: function (forceEscaped) {\n let str;\n const index = parserInput.i;\n let isEsca ped = false;\n\n parserInput.save();\n if (parserInput.$char('~')) {\n isEscaped = true;\n } else if (forceEscaped) {\n parserInput.resto re();\n return;\n }\n\n str = parserInput.$quoted();\n if (!str) {\n parserInput.restore();\n return;\n }\n parserInput.forget();\n\n ret urn new(tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, in dex, fileInfo);\n },\n\n //\n // A catch-all word, such as:\n //\n // black borde r-collapse\n //\n keyword: function () {\n const k = parserInput.$char('%') || parserInput.$re(/^\\[?(?:[\\w-]| \\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\\]?/);\n if (k) {\n return tree.Color.fromKeyword(k) || new(tree.Keyword)(k) ;\n }\n },\n\n //\n // A function call\n //\n // rgb(255, 0, 2 55)\n //\n // The arguments are parsed with the `e ntities.arguments` parser.\n //\n call: function ( ) {\n let name;\n let args;\n let func;\n const index = parserInput.i;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/1 8\n if (parserInput.peek(/^url\\(/i)) {\n return;\n }\n\n parserInput.save();\n\ n name = parserInput.$re(/^([\\w-]+|%|~|progid:[\\w\\.]+)\\(/ );\n if (!name) {\n parserInput.forget (); \n return;\n }\n\n name = name[1];\n func = this.customFuncCall(name);\n if (func) {\n args = func.parse();\n if (args && func.stop) {\n parserI nput.forget();\n return args;\n }\n }\n\n args = this.arguments(args);\n \n if (!parserInput.$char(')')) {\n pa rserInput.restore('Could not parse call arguments or missing \\')\\'');\n return;\n }\n\n parserInp ut.forget();\n\n return new(tree.Call)(name, args, index, fil eInfo);\n },\n \n //\n // Parsing rules for functions with non-standard args, e.g.:\n //\n // boolean(not(2 > 1))\n //\n // This is a quick prototype, to be modified/improved when\n // more custom-parsed funcs come (e.g. `selector(...)`)\n //\n\n customFuncCall: function (name) {\n / * Ideally the table is to be moved out of here for faster perf.,\n but it's quite tricky since it relies on all these `parsers`\n and `expect` available only here */\n return {\ n alpha: f(parsers.ieAlpha, true),\n boolean: f(condition),\n 'if': f(condition)\n }[name.toLowerCase()];\n\n function f(parse, stop) {\n return {\n parse, // parsing function\n stop // when true - stop after parse() and return its result, \n // otherwise contin ue for plain args\n };\n }\n \n function condition() {\n retu rn [expect(parsers.condition, 'expected condition')];\n }\n },\n\n arguments: function (prevArgs) {\n let argsComma = prevArgs || [];\n const argsSemiCol on = [];\n let isSemiColonSeparated;\n let value;\n\n parserInput.save();\n\n while (true) {\n if (prevArgs) {\n p revArgs = false;\n } else {\n value = parsers.detachedRuleset() || this.assignment() || parsers.expression();\ n if (!value) {\n brea k;\n }\n\n if (value.value && value.value.length == 1) {\n value = value.va lue[0];\n }\n\n argsComma. push(value);\n }\n\n if (parserInp ut.$char(',')) {\n continue;\n }\n\n if (parserInput.$char(';') || isSemiColonSeparated ) {\n isSemiColonSeparated = true;\n value = (argsComma.length < 1) ? argsComma[0]\n : new tree.Value(argsComma);\n argsSemiColo n.push(value);\n argsComma = [];\n }\n }\n\n parserInput.forget();\n return isSemiColonSeparated ? argsSemiColon : argsComma;\n },\n literal: function () {\n return this.dimension() ||\n this.color() ||\n this.quoted() ||\n this.unicodeDescriptor ();\n },\n\n // Assignments are argument entities for calls.\n // They are present in ie filter properties as shown below.\n //\n // filter: progid:DXImageTransf orm.Microsoft.Alpha( *opacity=50* )\n //\n\n assig nment: function () {\n let key;\n let valu e;\n parserInput.save();\n key = parserInp ut.$re(/^\\w+(?=\\s?=)/i);\n if (!key) {\n parserInput.restore();\n return;\n }\n if (!parserInput.$char('=')) {\n parserInput.restore();\n return;\n }\ n value = parsers.entity();\n if (value) { \n parserInput.forget();\n return new(tree.Assignment)(key, value);\n } else {\n parserInput.restore();\n }\n },\n\n //\n // Parse url() tokens\n //\n // We use a specific rule for urls, because they don't really behav e like\n // standard function calls. The difference is that the a rgument doesn't have\n // to be enclosed within a string, so it c an't be parsed as an Expression.\n //\n url: funct ion () {\n let value;\n const index = pars erInput.i;\n\n parserInput.autoCommentAbsorb = false;\n\n if (!parserInput.$str('url(')) {\n parser Input.autoCommentAbsorb = true;\n return;\n }\n\n value = this.quoted() || this.variable() || this. property() ||\n parserInput.$re(/^(?:(?:\\\\[\\(\\)'\ "])|[^\\(\\)'\"])+/) || '';\n\n parserInput.autoCommentAbsorb = true;\n\n expectChar(')');\n\n return n ew(tree.URL)((value.value != null || \n value instanceof tree.Variable || \n value instanceof tree.Property) ?\n value : new(tree.Anonymous)(value, index), index, fileInfo );\n },\n\n //\n // A Variable enti ty, such as `@fink`, in\n //\n // width: @fink + 2px\n //\n // We use a different parser for var iable definitions,\n // see `parsers.variable`.\n //\n variable: function () {\n let ch;\n let name;\n const index = parserInput.i;\n\n parserInput.save();\n if (parserInput.curren tChar() === '@' && (name = parserInput.$re(/^@@?[\\w-]+/))) {\n ch = parserInput.currentChar();\n if (ch === '(' | | ch === '[' && !parserInput.prevChar().match(/^\\s/)) {\n // this may be a VariableCall lookup\n const re sult = parsers.variableCall(name);\n if (result) {\n parserInput.forget();\n return result;\n }\n }\n parserInput.forget();\n return ne w(tree.Variable)(name, index, fileInfo);\n }\n parserInput.restore();\n },\n\n // A variable entity using the protective {} e.g. @{var}\n variableCurly: func tion () {\n let curly;\n const index = par serInput.i;\n\n if (parserInput.currentChar() === '@' && (cur ly = parserInput.$re(/^@\\{([\\w-]+)\\}/))) {\n return ne w(tree.Variable)(`@${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Property accessor, such as `$color`, in\n //\n // background-color: $c olor\n //\n property: function () {\n let name;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\\$ [\\w-]+/))) {\n return new(tree.Property)(name, index, fi leInfo);\n }\n },\n\n // A prop erty entity useing the protective {} e.g. ${prop}\n propertyCurly : function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' & & (curly = parserInput.$re(/^\\$\\{([\\w-]+)\\}/))) {\n r eturn new(tree.Property)(`$${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Hexadecimal colo r\n //\n // #4F3C2F\n //\n // `rgb` and `hsl` colors are parsed through the `entities.call` pars er.\n //\n color: function () {\n let rgb;\n parserInput.save();\n\n if ( parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[ A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\\w.#\\[])?/))) {\n if ( !rgb[2]) {\n parserInput.forget();\n return new(tree.Color)(rgb[1], undefined, rgb[0]);\n } \n }\n parserInput.restore();\n },\n\n colorKeyword: function () {\n parserInput.save();\n const autoCommentAbsorb = parserIn put.autoCommentAbsorb;\n parserInput.autoCommentAbsorb = fals e;\n const k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);\ n parserInput.autoCommentAbsorb = autoCommentAbsorb;\n if (!k) {\n parserInput.forget();\n return;\n }\n parserInput.r estore();\n const color = tree.Color.fromKeyword(k);\n if (color) {\n parserInput.$str(k);\n return color;\n }\n },\n\n //\n // A Dimension, that is, a number and a unit\n //\n // 0.5em 95%\n //\n dimension: function () {\n if (parserInput.peekNotNu meric()) {\n return;\n }\n\n const value = parserInput.$re(/^([+-]?\\d*\\.?\\d+)(%|[a-z_]+)?/i);\n if (value) {\n return new(tree.Dimensi on)(value[1], value[2]);\n }\n },\n\n //\n // A unicode descriptor, as is used in unicode-range\ n //\n // U+0?? or U+00A1-00A9\n / /\n unicodeDescriptor: function () {\n let ud; \n\n ud = parserInput.$re(/^U\\+[0-9a-fA-F?]+(\\-[0-9a-fA-F?] +)?/);\n if (ud) {\n return new(tree.U nicodeDescriptor)(ud[0]);\n }\n },\n\n //\n // JavaScript code to be evaluated\n //\n // `window.location.href`\n //\n javascript: function () {\n let js;\n const index = parserInput.i;\n\n parserInput.save();\n\n const escape = parserInput.$char('~');\n co nst jsQuote = parserInput.$char('`');\n\n if (!jsQuote) {\n parserInput.restore();\n return;\n }\n\n js = parserInput.$re(/^[^`]*`/);\n if (js) {\n parserInput.forget();\n return new(tree.JavaScript)(js.substr(0, js.length - 1), Boo lean(escape), index, fileInfo);\n }\n pars erInput.restore('invalid javascript definition');\n }\n },\n\n //\n // The variable part of a variable definitio n. Used in the `rule` parser\n //\n // @fink:\n //\n variable: function () {\n let name;\n\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@ [\\w-]+)\\s*:/))) { return name[1]; }\n },\n\n //\n // Call a variable value to retrieve a detached ruleset\n // or a value from a detached ruleset's rules.\n //\n // @fi nk();\n // @fink;\n // color: @fink[@color];\n //\n variableCall: function (parsedName) {\n l et lookups;\n const i = parserInput.i;\n const inV alue = !!parsedName;\n let name = parsedName;\n\n parserInput.save();\n\n if (name || (parserInput.currentChar() == = '@'\n && (name = parserInput.$re(/^(@[\\w-]+)(\\(\\s*\\))?/ )))) {\n\n lookups = this.mixin.ruleLookups();\n\n if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[ 2] !== '()'))) {\n parserInput.restore('Missing \\'[...]\ \' lookup in variable call');\n return;\n }\n\n if (!inValue) {\n name = nam e[1];\n }\n\n const call = new tree.Variab leCall(name, i, fileInfo);\n if (!inValue && parsers.end()) { \n parserInput.forget();\n return call;\n }\n else {\n parserInput.forget();\n return new tree.NamespaceValue( call, lookups, i, fileInfo);\n }\n }\n\n parserInput.restore();\n },\n\n //\n // extend syntax - used to extend selectors\n //\n extend: function(isRule) {\n let elements;\n let e;\n const index = parserInput.i;\n let option;\n let extendList;\n let extend;\n\n if (!pars erInput.$str(isRule ? '&:extend(' : ':extend(')) {\n return;\ n }\n\n do {\n option = null;\n elements = null;\n while (!(option = pars erInput.$re(/^(all)(?=\\s*(\\)|,))/))) {\n e = this.eleme nt();\n if (!e) {\n break;\n }\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n }\n\n option = option && option[1];\n if (!elements) {\n error('Missing target selector for :exten d().');\n }\n extend = new(tree.Extend)(ne w(tree.Selector)(elements), option, index, fileInfo);\n if (e xtendList) {\n extendList.push(extend);\n } else {\n extendList = [ extend ];\n }\n } while (parserInput.$char(','));\n\n expe ct(/^\\)/);\n\n if (isRule) {\n expect(/^;/);\ n }\n\n return extendList;\n },\n\n //\n // extendRule - used in a rule to extend all the parent selectors\n //\n extendRule: function() {\n return this.extend(true);\n },\n\n //\n // Mix ins\n //\n mixin: {\n //\n / / A Mixin call, with an optional argument list\n //\n // #mixins > .square(#fff);\n // #mixins.square(#fff) ;\n // .rounded(4px, black);\n // .button; \n //\n // We can lookup / return a value using th e lookup syntax:\n //\n // color: #mixin.squar e(#fff)[@color];\n //\n // The `while` loop is the re because mixins can be\n // namespaced, but we only support the child and descendant\n // selector for now.\n //\ n call: function (inValue, getLookup) {\n cons t s = parserInput.currentChar();\n let important = false;\n let lookups;\n const index = parserInput.i; \n let elements;\n let args;\n let hasParens;\n\n if (s !== '.' && s !== '#') { retu rn; }\n\n parserInput.save(); // stop us absorbing part of an invalid selector\n\n elements = this.elements();\n\n if (elements) {\n if (parserInput.$char('(')) {\n args = this.args(true).args;\n expectChar(')');\n hasParens = true;\n }\n\n if (getLookup !== false) {\n lookups = this.ruleLookups();\n } \n if (getLookup === true && !lookups) {\n parserInput.restore();\n return;\n }\n\n if (inValue && !lookups && !hasPa rens) {\n // This isn't a valid in-value mixin call\n parserInput.restore();\n return;\n }\n\n if (!inValue && pa rsers.important()) {\n important = true;\n }\n\n if (inValue || parsers.end()) {\n parserInput.forget();\n const mixin = new(tree.mixin.Call)(elements, args, index, fileInfo, !lookups && import ant);\n if (lookups) {\n return new tree.NamespaceValue(mixin, lookups);\n }\n else {\n return mi xin;\n }\n }\n }\n\n parserInput.restore();\n },\n /**\n * Matching elements for mixins\n * (Start with . or # and can have > )\n */\n elem ents: function() {\n let elements;\n let e ;\n let c;\n let elem;\n let elemIndex;\n const re = /^[#.](?:[\\w-]|\\\\(?:[A-Fa-f0 -9]{1,6} ?|[^A-Fa-f0-9]))+/;\n while (true) {\n elemIndex = parserInput.i;\n e = parserInput.$r e(re);\n \n if (!e) {\n break;\n }\n elem = new(tree.Element)(c, e, false, elemIndex, fileInfo);\n if (elements) {\n elements.push(elem);\n } else {\n elements = [ elem ];\n }\n c = parserInput.$char('>');\n }\n return elements;\n },\n args: function (isCall) {\n const entities = parsers .entities;\n const returner = { args:null, variadic: false }; \n let expressions = [];\n const argsSemiC olon = [];\n const argsComma = [];\n let i sSemiColonSeparated;\n let expressionContainsNamed;\n let name;\n let nameLoop;\n le t value;\n let arg;\n let expand;\n let hasSep = true;\n\n parserInput.save();\n\n while (true) {\n if (isCall) {\n arg = parsers.detachedRuleset() || parsers.expression();\n } else {\n parserInput.comment Store.length = 0;\n if (parserInput.$str('...')) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : a rgsComma)\n .push({ variadic: true });\n break;\n }\n arg = entities.variable() || entities.property() || entities.liter al() || entities.keyword() || this.call(true);\n }\n\n if (!arg || !hasSep) {\n break;\ n }\n\n nameLoop = null;\n if (arg.throwAwayComments) {\n arg.th rowAwayComments();\n }\n value = a rg;\n let val = null;\n\n if (isCa ll) {\n // Variable\n if ( arg.value && arg.value.length == 1) {\n val = arg .value[0];\n }\n } else {\n val = arg;\n }\n\n if (val && (val instanceof tree.Variable || val instanceof tree.Proper ty)) {\n if (parserInput.$char(':')) {\n if (expressions.length > 0) {\n if (isSemiColonSeparated) {\n error ('Cannot mix ; and , as delimiter types');\n }\n expressionContainsNamed = true;\n }\n\n value = parsers.det achedRuleset() || parsers.expression();\n\n if (! value) {\n if (isCall) {\n error('could not understand value for named argument');\n } else {\n parserInput.restore();\n returner.arg s = [];\n return returner;\n }\n }\n nameLoop = (name = val.name);\n } else i f (parserInput.$str('...')) {\n if (!isCall) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ n ame: arg.name, variadic: true });\n break;\n } else {\n exp and = true;\n }\n } el se if (!isCall) {\n name = nameLoop = val.name;\n value = null;\n }\n }\n\n if (value) {\n expressions.push(value);\n }\n\n argsComma.push({ name:nameLoop, value, expand });\n\n if (parserInput.$char(',')) {\n hasSep = tru e;\n continue;\n }\n hasSep = parserInput.$char(';') === ';';\n\n if (hasSep || isSemiColonSeparated) {\n\n if (expre ssionContainsNamed) {\n error('Cannot mix ; and , as delimiter types');\n }\n\n isSemiColonSeparated = true;\n\n if (expressions .length > 1) {\n value = new(tree.Value)(expressi ons);\n }\n argsSemiColon. push({ name, value, expand });\n\n name = null;\n expressions = [];\n expressio nContainsNamed = false;\n }\n }\n\n parserInput.forget();\n returner.args = isSe miColonSeparated ? argsSemiColon : argsComma;\n return return er;\n },\n //\n // A Mixin definiti on, with a list of parameters\n //\n // .round ed (@radius: 2px, @color) {\n // ...\n // }\n //\n // Until we have a finer grained state -machine, we have to\n // do a look-ahead, to make sure we don't have a mixin call.\n // See the `rule` function for more informat ion.\n //\n // We start by matching `.rounded (`, and then proceed on to\n // the argument list, which has optional default values.\n // We store the parameters in `params`, with a `value` key,\n // if there is a value, such as in the case of `@ radius`.\n //\n // Once we've got our params list, and a closing `)`, we parse\n // the `{...}` block.\n //\n definition: function () {\n let name ;\n let params = [];\n let match;\n let ruleset;\n let cond;\n le t variadic = false;\n if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||\n parserInput.pe ek(/^[^{]*\\}/)) {\n return;\n }\n\n parserInput.save();\n\n match = parserInput .$re(/^([#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\\s*\\(/);\n if (match) {\n name = match[1];\n\n const argInfo = this.args(false);\n par ams = argInfo.args;\n variadic = argInfo.variadic;\n\n // .mixincall(\"@{a}\");\n // looks a bit like a mixin definition..\n // also\n // .mixincall(@a: {rule: set;});\n // so we hav e to be nice and restore\n if (!parserInput.$char(')')) { \n parserInput.restore('Missing closing \\')\\'');\n return;\n }\n\n parserInput.commentStore.length = 0;\n\n if (par serInput.$str('when')) { // Guard\n cond = expect(par sers.conditions, 'expected condition');\n }\n\n ruleset = parsers.block();\n\n if (ruleset) {\n parserInput.forget();\n return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);\n } else {\n parserInput.restore( );\n }\n } else {\n parserInput.restore();\n }\n },\n \n ruleLookups: function() {\n let rule;\n let args;\n const lookups = [];\n\n if (parserInput.currentChar() !== '[') { \n return;\n }\n\n while (true) {\n parserInput.save();\n args = null;\n rule = this.lookupValue();\n if (!rule && rule !== '') {\n parserInput.restore();\n break;\n }\n lo okups.push(rule);\n parserInput.forget();\n }\n if (lookups.length > 0) {\n return lookups;\n }\n },\n \n lookupValue: function() {\n parserInput.save();\n \n if (!parserInput.$char('[')) { \n parserI nput.restore();\n return;\n }\n \n const name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/); \n \n if (!parserInput.$char(']')) {\n parserInput.restore();\n return;\n } \n\n if (name || name === '') {\n p arserInput.forget();\n return name;\n }\n \n parserInput.restore();\n }\n },\n //\n // Entities are the smallest recognized toke n,\n // and can be found inside a rule's value.\n //\n entity: function () {\n const entities = this.entities;\n \n return this.comment() || entities.literal() || entities.variab le() || entities.url() ||\n entities.property() || entities.c all() || entities.keyword() || this.mixin.call(true) ||\n ent ities.javascript();\n },\n\n //\n // A Declarat ion terminator. Note that we use `peek()` to check for '}',\n // beca use the `block` rule will be expecting it, but we still need to make sure\n // it's there, if ';' was omitted.\n //\n end: func tion () {\n return parserInput.$char(';') || parserInput.peek('}' );\n },\n\n //\n // IE's alpha function\n //\n // alpha(opacity=88)\n //\n ieAl pha: function () {\n let value;\n\n // http://jspe rf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (! parserInput.$re(/^opacity=/i)) { return; }\n value = parserInput. $re(/^\\d+/);\n if (!value) {\n value = expect (parsers.entities.variable, 'Could not parse alpha');\n value = `@{${value.name.slice(1)}}`;\n }\n expectChar(' )');\n return new tree.Quoted('', `alpha(opacity=${value})`);\n },\n\n //\n // A Selector Element\n / /\n // div\n // + h1\n // #socks\n // input[type=\"text\"]\n //\n // Elements are the building blocks for Selectors,\n // they are made out of a `C ombinator` (see combinator rule),\n // and an element name, such as a tag a class, or `*`.\n //\n element: function () {\n let e;\n let c;\n let v;\n const index = parserInput.i;\n\n c = this.combinator();\n\n e = parserInput.$re(/^(?:\\d+\\.\\d+|\\d+)%/) ||\n parserInput.$re(/^(?:[.#]?|:*)(?:[\\w-]|[^\\x00-\\x9f]|\\\\(?:[A-Fa-f0-9]{1,6 } ?|[^A-Fa-f0-9]))+/) ||\n parserInput.$char('*') || parserIn put.$char('&') || this.attribute() ||\n parserInput.$re(/^\\( [^&()@]+\\)/) || parserInput.$re(/^[\\.#:](?=@)/) ||\n this. entities.variableCurly();\n\n if (!e) {\n pars erInput.save();\n if (parserInput.$char('(')) {\n if ((v = this.selector(false)) && parserInput.$char(')')) {\n e = new(tree.Paren)(v);\n parser Input.forget();\n } else {\n p arserInput.restore('Missing closing \\')\\'');\n }\n } else {\n parserInput.forget();\n }\n }\n\n if (e) { return new(tree.Ele ment)(c, e, e instanceof tree.Variable, index, fileInfo); }\n },\n\n //\n // Combinators combine elements together, in a Select or.\n //\n // Because our parser isn't white-space sensiti ve, special care\n // has to be taken, when parsing the descendant co mbinator, ` `,\n // as it's an empty space. We have to check the prev ious character\n // in the input, to see if it's a ` ` character. Mor e info on how\n // we deal with this in *combinator.js*.\n //\n combinator: function () {\n let c = parserInput. currentChar();\n\n if (c === '/') {\n parserIn put.save();\n const slashedCombinator = parserInput.$re(/^\\/ [a-z]+\\//i);\n if (slashedCombinator) {\n parserInput.forget();\n return new(tree.Combinator)( slashedCombinator);\n }\n parserInput.rest ore();\n }\n\n if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') {\n parserInput.i++;\n if (c === '^' && parserInput.currentChar() === '^') {\n c = '^^';\n parserInput.i++;\n }\n while (parserInput.isWhitespace()) { parserInput.i++ ; }\n return new(tree.Combinator)(c);\n } else if (parserInput.isWhitespace(-1)) {\n return new(tree.Combin ator)(' ');\n } else {\n return new(tree.Combi nator)(null);\n }\n },\n //\n // A CSS Selector\n // with less extensions e.g. the ability to extend and guard\n //\n // .class > div + h1\n // li a:hover\n //\n // Selectors are made out of one or more Elements, see above.\n //\n selector: function (isLes s) {\n const index = parserInput.i;\n let elements ;\n let extendList;\n let c;\n let e;\n let allExtends;\n let when;\n let condition;\n isLess = isLess !== false;\n whil e ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$s tr('when'))) || (e = this.element())) {\n if (when) {\n condition = expect(this.conditions, 'expected condition');\n } else if (condition) {\n error('CSS gu ard can only be used at the end of selector');\n } else if (e xtendList) {\n if (allExtends) {\n allExtends = allExtends.concat(extendList);\n } else {\n allExtends = extendList;\n }\n } else {\n if (allExtends) { err or('Extend can only be used at the end of selector'); }\n c = parserInput.currentChar();\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n e = null;\n }\n if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') {\n break;\n }\n }\n\n if (element s) { return new(tree.Selector)(elements, allExtends, condition, index, fileInfo) ; }\n if (allExtends) { error('Extend must be used to extend a se lector, it cannot be used on its own'); }\n },\n selectors : function () {\n let s;\n let selectors;\n while (true) {\n s = this.selector();\n if (!s) {\n break;\n }\n if (selectors) {\n selectors.push(s);\n } else {\n selectors = [ s ];\n }\n parserInput.commentStore.length = 0;\n if (s.condition && selectors.length > 1) {\n er ror(\"Guards are only currently allowed on a single selector.\");\n }\n if (!parserInput.$char(',')) { break; }\n if (s.condition) {\n error(\"Guards are only c urrently allowed on a single selector.\");\n }\n parserInput.commentStore.length = 0;\n }\n return selectors;\n },\n attribute: function () {\n if (!parserInput.$char('[')) { return; }\n\n const entit ies = this.entities;\n let key;\n let val;\n let op;\n //\n // case-insensitive flag\ n // e.g. [attr operator value i]\n //\n let cif;\n\n if (!(key = entities.variableCurly())) {\n key = expect(/^(?:[_A-Za-z0-9-\\*]*\\|)?(?:[_A-Za-z0-9-]|\\\\.)+ /);\n }\n\n op = parserInput.$re(/^[|~*$^]?=/);\n if (op) {\n val = entities.quoted() || parserI nput.$re(/^[0-9]+%/) || parserInput.$re(/^[\\w-]+/) || entities.variableCurly(); \n if (val) {\n cif = parserInput.$re( /^[iIsS]/);\n }\n }\n\n expectC har(']');\n\n return new(tree.Attribute)(key, op, val, cif);\n },\n\n //\n // The `block` rule is used by `rules et` and `mixin.definition`.\n // It's a wrapper around the `primary` rule, with added `{}`.\n //\n block: function () {\n let content;\n if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {\n return conten t;\n }\n },\n\n blockRuleset: function() {\ n let block = this.block();\n\n if (block) {\n block = new tree.Ruleset(null, block);\n }\n return block;\n },\n\n detachedRuleset: functio n() {\n let argInfo;\n let params;\n let variadic;\n\n parserInput.save();\n if (pars erInput.$re(/^[.#]\\(/)) {\n /**\n * DR a rgs currently only implemented for each() function, and not \n * yet settable as `@dr: #(@arg) {}`\n * This should be do ne when DRs are merged with mixins.\n * See: https://github. com/less/less-meta/issues/16\n */\n argIn fo = this.mixin.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n if (!parserInput .$char(')')) {\n parserInput.restore();\n return;\n }\n }\n const blockRuleset = this.blockRuleset();\n if (blockRuleset) {\n parserInput.forget();\n if (params) {\n return new tree.mixin.Definition(null, params, blockRuleset, nu ll, variadic);\n }\n return new tree.Detac hedRuleset(blockRuleset);\n }\n parserInput.restor e();\n },\n\n //\n // div, .class, body > p {.. .}\n //\n ruleset: function () {\n let sele ctors;\n let rules;\n let debugInfo;\n\n parserInput.save();\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(parserInput.i);\n }\n\n selectors = this.selectors();\n\n if (selectors & & (rules = this.block())) {\n parserInput.forget();\n const ruleset = new(tree.Ruleset)(selectors, rules, context.strictIm ports);\n if (context.dumpLineNumbers) {\n ruleset.debugInfo = debugInfo;\n }\n return ruleset;\n } else {\n parserInput.resto re();\n }\n },\n declaration: function () { \n let name;\n let value;\n const i ndex = parserInput.i;\n let hasDR;\n const c = par serInput.currentChar();\n let important;\n let mer ge;\n let isVariable;\n\n if (c === '.' || c === ' #' || c === '&' || c === ':') { return; }\n\n parserInput.save(); \n\n name = this.variable() || this.ruleProperty();\n if (name) {\n isVariable = typeof name === 'string';\n\n if (isVariable) {\n value = this.detac hedRuleset();\n if (value) {\n hasDR = true;\n }\n }\n\n parserInput.commentStore.length = 0;\n if (!value) {\ n // a name returned by this.ruleProperty() is always an array of the form:\n // [string-1, ..., string-n, \"\"] o r [string-1, ..., string-n, \"+\"]\n // where each item i s a tree.Keyword or tree.Variable\n merge = !isVariable & & name.length > 1 && name.pop().value;\n\n // Custom prop erty values get permissive parsing\n if (name[0].value && name[0].value.slice(0, 2) === '--') {\n value = this .permissiveValue();\n }\n // Try t o store values as anonymous\n // If we need the value lat er we'll re-parse it in ruleset.parseValue\n else {\n value = this.anonymousValue();\n }\n if (value) {\n parserInput .forget();\n // anonymous values absorb the end ';' w hich is required for them to work\n return new(tree.D eclaration)(name, value, false, merge, index, fileInfo);\n }\n\n if (!value) {\n value = this.value();\n }\n\n if (value) {\n important = this.important();\n } else if (isVariable) {\n // As a last resort , try permissiveValue\n value = this.permissiveValue( );\n }\n }\n\n if ( value && (this.end() || hasDR)) {\n parserInput.forget(); \n return new(tree.Declaration)(name, value, important, m erge, index, fileInfo);\n }\n else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n anonymousValue: function () {\n const ind ex = parserInput.i;\n const match = parserInput.$re(/^([^.#@\\$+\ \/'\"*`(;{}-]*);/);\n if (match) {\n return ne w(tree.Anonymous)(match[1], index);\n }\n },\n /**\n * Used for custom properties, at-rules, and variables (as fallback)\n * Parses almost anything inside of {} [] () \"\" blocks\ n * until it reaches outer-most tokens.\n * \n * First, it will try to parse comments and entities to reach\n * the end. This is mostly like the Expression parser except no\n * mat h is allowed.\n */\n permissiveValue: function (untilToke ns) {\n let i;\n let e;\n let done; \n let value;\n const tok = untilTokens || ';';\n const index = parserInput.i;\n const result = [];\ n\n function testCurrentChar() {\n const char = parserInput.currentChar();\n if (typeof tok === 'string') { \n return char === tok;\n } else {\n return tok.test(char);\n }\n }\n if (testCurrentChar()) {\n return;\n }\n value = [];\n do {\n e = this.comment();\n if (e) {\n value.push(e);\n continue;\n }\n e = this.entity();\n if (e) {\n value.push(e);\n }\n } while (e);\ n\n done = testCurrentChar();\n\n if (value.length > 0) {\n value = new(tree.Expression)(value);\n if (done) {\n return value;\n } \n else {\n result.push(value);\n }\n // Preserve space before $parseUntil as it will not\n if (parserInput.prevChar() === ' ') {\n result.push(new tree.Anonymous(' ', index));\n }\n }\n parserInput.save();\n\n val ue = parserInput.$parseUntil(tok);\n\n if (value) {\n if (typeof value === 'string') {\n error(`Expecte d '${value}'`, 'Parse');\n }\n if (value.l ength === 1 && value[0] === ' ') {\n parserInput.forget() ;\n return new tree.Anonymous('', index);\n }\n let item;\n for (i = 0; i < valu e.length; i++) {\n item = value[i];\n if (Array.isArray(item)) {\n // Treat actual quot es as normal quoted values\n result.push(new tree.Quo ted(item[0], item[1], true, index, fileInfo));\n }\n else {\n if (i === value.length - 1) {\n item = item.trim();\n }\n // Treat like quoted values, but replace v ars like unquoted expressions\n const quote = new tre e.Quoted('\\'', item, true, index, fileInfo);\n quote .variableRegex = /@([\\w-]+)/g;\n quote.propRegex = / \\$([\\w-]+)/g;\n result.push(quote);\n }\n }\n parserInput.forget();\n return new tree.Expression(result, true);\n }\ n parserInput.restore();\n },\n\n //\n // An @import atrule\n //\n // @import \"lib\"; \n //\n // Depending on our environment, importing is done differently:\n // In the browser, it's an XHR request, in Node, it w ould be a\n // file-system operation. The function used for importing is\n // stored in `import`, which we pass to the Import constructor. \n //\n 'import': function () {\n let path; \n let features;\n const index = parserInput.i;\n\ n const dir = parserInput.$re(/^@import\\s+/);\n\n if (dir) {\n const options = (dir ? this.importOptions() : n ull) || {};\n\n if ((path = this.entities.quoted() || this.en tities.url())) {\n features = this.mediaFeatures();\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon or unrecognised media features on import');\n }\n features = features && new(tree.Value)(features);\n return new(tree.Import)(path, features, options, index, fileInfo);\n }\n else {\n parser Input.i = index;\n error('malformed import statement');\n }\n }\n },\n\n importOp tions: function() {\n let o;\n const options = {}; \n let optionName;\n let value;\n\n // list of options, surrounded by parens\n if (!parserInput.$cha r('(')) { return null; }\n do {\n o = this.imp ortOption();\n if (o) {\n optionName = o;\n value = true;\n switch (opti onName) {\n case 'css':\n optionName = 'less';\n value = false;\n break;\n case 'once':\n optionName = 'multiple';\n value = false;\n break;\n }\n options[optionName] = value;\n if (!parserInput.$char(',')) { break; }\n }\n } while (o);\n expectChar(')');\n return op tions;\n },\n\n importOption: function() {\n const opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optiona l)/);\n if (opt) {\n return opt[1];\n }\n },\n\n mediaFeature: function () {\n const entities = this.entities;\n const nodes = [];\n let e;\n let p;\n parserInput.save();\n do {\n e = entities.keyword() || entities.varia ble() || entities.mixinLookup();\n if (e) {\n nodes.push(e);\n } else if (parserInput.$char('(')) { \n p = this.property();\n e = this .value();\n if (parserInput.$char(')')) {\n if (p && e) {\n nodes.push(new(tree .Paren)(new(tree.Declaration)(p, e, null, null, parserInput.i, fileInfo, true))) ;\n } else if (e) {\n nodes.push(new(tree.Paren)(e));\n } else {\n error('badly formed media feature definition');\n }\n } else {\n error('Missing closing \\')\\'', 'Parse');\n }\n }\n } while (e);\n\n parserInput.f orget();\n if (nodes.length > 0) {\n return ne w(tree.Expression)(nodes);\n }\n },\n\n med iaFeatures: function () {\n const entities = this.entities;\n const features = [];\n let e;\n do {\n e = this.mediaFeature();\n if (e) {\n features.push(e);\n if (!parserInput. $char(',')) { break; }\n } else {\n e = entities.variable() || entities.mixinLookup();\n if (e) {\n features.push(e);\n i f (!parserInput.$char(',')) { break; }\n }\n }\n } while (e);\n\n return features.length > 0 ? features : null;\n },\n\n media: function () {\n let features;\n let rules;\n let medi a;\n let debugInfo;\n const index = parserInput.i; \n\n if (context.dumpLineNumbers) {\n debugInf o = getDebugInfo(index);\n }\n\n parserInput.save( );\n\n if (parserInput.$str('@media')) {\n fea tures = this.mediaFeatures();\n\n rules = this.block();\n\n if (!rules) {\n error('media definition s require block statements after any features');\n }\n\n parserInput.forget();\n\n media = new(tree.Med ia)(rules, features, index, fileInfo);\n if (context.dumpLine Numbers) {\n media.debugInfo = debugInfo;\n }\n\n return media;\n }\n\n parserInput.restore();\n },\n\n //\n\n // A @plugin directive, used to import plugins dynamically.\n //\n // @plugin (args) \"lib\";\n //\n plugin: function () {\n let path;\n let args;\n let options;\n const index = parserInput.i;\n const d ir = parserInput.$re(/^@plugin\\s+/);\n\n if (dir) {\n args = this.pluginArgs();\n\n if (args) {\n options = {\n pluginArgs: args,\n isPlugin: true\n };\n }\n else {\n options = { isPl ugin: true };\n }\n\n if ((path = this.ent ities.quoted() || this.entities.url())) {\n\n if (!parser Input.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon on @plugin');\n }\n return new(tree.Import)(path, null, options, in dex, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed @pl ugin statement');\n }\n }\n },\n\n pluginArgs: function() {\n // list of options, surroun ded by parens\n parserInput.save();\n if (!parserI nput.$char('(')) {\n parserInput.restore();\n return null;\n }\n const args = parserInput.$r e(/^\\s*([^\\);]+)\\)\\s*/);\n if (args[1]) {\n parserInput.forget();\n return args[1].trim();\n }\n else { \n parserInput.restore();\n return null;\n }\n },\n\n //\n // A CSS AtRule\n //\n // @charset \"u tf-8\";\n //\n atrule: function () {\n cons t index = parserInput.i;\n let name;\n let value;\ n let rules;\n let nonVendorSpecificName;\n let hasIdentifier;\n let hasExpression;\n let hasUnknown;\n let hasBlock = true;\n let isRo oted = true;\n\n if (parserInput.currentChar() !== '@') { return; }\n\n value = this['import']() || this.plugin() || this.media(); \n if (value) {\n return value;\n }\n\n parserInput.save();\n\n name = parserInpu t.$re(/^@[a-z-]+/);\n\n if (!name) { return; }\n\n nonVendorSpecificName = name;\n if (name.charAt(1) == '-' && nam e.indexOf('-', 2) > 0) {\n nonVendorSpecificName = `@${name.s lice(name.indexOf('-', 2) + 1)}`;\n }\n\n switch ( nonVendorSpecificName) {\n case '@charset':\n hasIdentifier = true;\n hasBlock = false;\n break;\n case '@namespace':\n hasExpression = true;\n hasBlock = false;\n break;\n case '@keyframes':\n case '@counter-style':\n hasIdentifier = true;\n break;\n case '@document':\n case '@supports':\n hasUnknown = true;\n isRooted = false;\n break;\n default:\n hasUnknown = true;\n break;\n }\n\n parserInput.commentStore.leng th = 0;\n\n if (hasIdentifier) {\n value = thi s.entity();\n if (!value) {\n error(`e xpected ${name} identifier`);\n }\n } else if (hasExpression) {\n value = this.expression();\n if (!value) {\n error(`expected ${name} expression `);\n }\n } else if (hasUnknown) {\n value = this.permissiveValue(/^[{;]/);\n hasBlock = (parserInput.currentChar() === '{');\n if (!value) {\n if (!hasBlock && parserInput.currentChar() !== ';') {\n error(`${name} rule is missing block or ending semi-colon`) ;\n }\n }\n else if (!value.value) {\n value = null;\n }\ n }\n\n if (hasBlock) {\n rules = this.blockRuleset();\n }\n\n if (rules || (!has Block && value && parserInput.$char(';'))) {\n parserInput.fo rget();\n return new(tree.AtRule)(name, value, rules, index, fileInfo,\n context.dumpLineNumbers ? getDebugInfo(index) : null,\n isRooted\n );\n }\n\n parserInput.restore('at-rule options not recognised');\ n },\n\n //\n // A Value is a comma-delimited l ist of Expressions\n //\n // font-family: Baskerville, Georgia, serif;\n //\n // In a Rule, a Value represents e verything after the `:`,\n // and before the `;`.\n //\n value: function () {\n let e;\n const ex pressions = [];\n const index = parserInput.i;\n\n do {\n e = this.expression();\n if (e) {\ n expressions.push(e);\n if (!pars erInput.$char(',')) { break; }\n }\n } while ( e);\n\n if (expressions.length > 0) {\n return new(tree.Value)(expressions, index);\n }\n },\n important: function () {\n if (parserInput.currentChar() == = '!') {\n return parserInput.$re(/^! *important/);\n }\n },\n sub: function () {\n let a ;\n let e;\n\n parserInput.save();\n if (parserInput.$char('(')) {\n a = this.addition();\n if (a && parserInput.$char(')')) {\n parse rInput.forget();\n e = new(tree.Expression)([a]);\n e.parens = true;\n return e;\n }\n parserInput.restore('Expected \\')\\'');\n return;\n }\n parserInput.restore( );\n },\n multiplication: function () {\n l et m;\n let a;\n let op;\n let oper ation;\n let isSpaced;\n m = this.operand();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1 );\n while (true) {\n if (parserInput. peek(/^\\/[*\\/]/)) {\n break;\n }\n\n parserInput.save();\n\n o p = parserInput.$char('/') || parserInput.$char('*') || parserInput.$str('./');\ n\n if (!op) { parserInput.forget(); break; }\n\n a = this.operand();\n\n if (!a) { parserI nput.restore(); break; }\n parserInput.forget();\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace( -1);\n }\n return operation || m;\n }\n },\n addition: function () {\n let m;\n let a;\n let op;\n let op eration;\n let isSpaced;\n m = this.multiplication ();\n if (m) {\n isSpaced = parserInput.isWhit espace(-1);\n while (true) {\n op = pa rserInput.$re(/^[-+]\\s+/) || (!isSpaced && (parserInput.$char('+') || parserInp ut.$char('-')));\n if (!op) {\n break;\n }\n a = this.multiplica tion();\n if (!a) {