Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
web-interface.assets.5455bc3c74e053ffe3a7730e257d56a9.js.map Maven / Gradle / Ivy
{"version":3,"sources":["webpack://graylog-web-interface/5455bc3c74e053ffe3a7730e257d56a9.js"],"sourcesContent":["\"no use strict\";\n!(function(window) {\nif (typeof window.window != \"undefined\" && window.document)\n return;\nif (window.require && window.define)\n return;\n\nif (!window.console) {\n window.console = function() {\n var msgs = Array.prototype.slice.call(arguments, 0);\n postMessage({type: \"log\", data: msgs});\n };\n window.console.error =\n window.console.warn = \n window.console.log =\n window.console.trace = window.console;\n}\nwindow.window = window;\nwindow.ace = window;\n\nwindow.onerror = function(message, file, line, col, err) {\n postMessage({type: \"error\", data: {\n message: message,\n data: err && err.data,\n file: file,\n line: line, \n col: col,\n stack: err && err.stack\n }});\n};\n\nwindow.normalizeModule = function(parentId, moduleName) {\n // normalize plugin requires\n if (moduleName.indexOf(\"!\") !== -1) {\n var chunks = moduleName.split(\"!\");\n return window.normalizeModule(parentId, chunks[0]) + \"!\" + window.normalizeModule(parentId, chunks[1]);\n }\n // normalize relative requires\n if (moduleName.charAt(0) == \".\") {\n var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n moduleName = (base ? base + \"/\" : \"\") + moduleName;\n \n while (moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n var previous = moduleName;\n moduleName = moduleName.replace(/^\\.\\//, \"\").replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n }\n }\n \n return moduleName;\n};\n\nwindow.require = function require(parentId, id) {\n if (!id) {\n id = parentId;\n parentId = null;\n }\n if (!id.charAt)\n throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");\n\n id = window.normalizeModule(parentId, id);\n\n var module = window.require.modules[id];\n if (module) {\n if (!module.initialized) {\n module.initialized = true;\n module.exports = module.factory().exports;\n }\n return module.exports;\n }\n \n if (!window.require.tlns)\n return console.log(\"unable to load \" + id);\n \n var path = resolveModuleId(id, window.require.tlns);\n if (path.slice(-3) != \".js\") path += \".js\";\n \n window.require.id = id;\n window.require.modules[id] = {}; // prevent infinite loop on broken modules\n importScripts(path);\n return window.require(parentId, id);\n};\nfunction resolveModuleId(id, paths) {\n var testPath = id, tail = \"\";\n while (testPath) {\n var alias = paths[testPath];\n if (typeof alias == \"string\") {\n return alias + tail;\n } else if (alias) {\n return alias.location.replace(/\\/*$/, \"/\") + (tail || alias.main || alias.name);\n } else if (alias === false) {\n return \"\";\n }\n var i = testPath.lastIndexOf(\"/\");\n if (i === -1) break;\n tail = testPath.substr(i) + tail;\n testPath = testPath.slice(0, i);\n }\n return id;\n}\nwindow.require.modules = {};\nwindow.require.tlns = {};\n\nwindow.define = function(id, deps, factory) {\n if (arguments.length == 2) {\n factory = deps;\n if (typeof id != \"string\") {\n deps = id;\n id = window.require.id;\n }\n } else if (arguments.length == 1) {\n factory = id;\n deps = [];\n id = window.require.id;\n }\n \n if (typeof factory != \"function\") {\n window.require.modules[id] = {\n exports: factory,\n initialized: true\n };\n return;\n }\n\n if (!deps.length)\n // If there is no dependencies, we inject \"require\", \"exports\" and\n // \"module\" as dependencies, to provide CommonJS compatibility.\n deps = [\"require\", \"exports\", \"module\"];\n\n var req = function(childId) {\n return window.require(id, childId);\n };\n\n window.require.modules[id] = {\n exports: {},\n factory: function() {\n var module = this;\n var returnExports = factory.apply(this, deps.slice(0, factory.length).map(function(dep) {\n switch (dep) {\n // Because \"require\", \"exports\" and \"module\" aren't actual\n // dependencies, we must handle them seperately.\n case \"require\": return req;\n case \"exports\": return module.exports;\n case \"module\": return module;\n // But for all other dependencies, we can just go ahead and\n // require them.\n default: return req(dep);\n }\n }));\n if (returnExports)\n module.exports = returnExports;\n return module;\n }\n };\n};\nwindow.define.amd = {};\nwindow.require.tlns = {};\nwindow.initBaseUrls = function initBaseUrls(topLevelNamespaces) {\n for (var i in topLevelNamespaces)\n this.require.tlns[i] = topLevelNamespaces[i];\n};\n\nwindow.initSender = function initSender() {\n\n var EventEmitter = window.require(\"ace/lib/event_emitter\").EventEmitter;\n var oop = window.require(\"ace/lib/oop\");\n \n var Sender = function() {};\n \n (function() {\n \n oop.implement(this, EventEmitter);\n \n this.callback = function(data, callbackId) {\n postMessage({\n type: \"call\",\n id: callbackId,\n data: data\n });\n };\n \n this.emit = function(name, data) {\n postMessage({\n type: \"event\",\n name: name,\n data: data\n });\n };\n \n }).call(Sender.prototype);\n \n return new Sender();\n};\n\nvar main = window.main = null;\nvar sender = window.sender = null;\n\nwindow.onmessage = function(e) {\n var msg = e.data;\n if (msg.event && sender) {\n sender._signal(msg.event, msg.data);\n }\n else if (msg.command) {\n if (main[msg.command])\n main[msg.command].apply(main, msg.args);\n else if (window[msg.command])\n window[msg.command].apply(window, msg.args);\n else\n throw new Error(\"Unknown command:\" + msg.command);\n }\n else if (msg.init) {\n window.initBaseUrls(msg.tlns);\n sender = window.sender = window.initSender();\n var clazz = this.require(msg.module)[msg.classname];\n main = window.main = new clazz(sender);\n }\n};\n})(this);\n\nace.define(\"ace/lib/oop\",[], function(require, exports, module){\"use strict\";\nexports.inherits = function (ctor, superCtor) {\n ctor.super_ = superCtor;\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n};\nexports.mixin = function (obj, mixin) {\n for (var key in mixin) {\n obj[key] = mixin[key];\n }\n return obj;\n};\nexports.implement = function (proto, mixin) {\n exports.mixin(proto, mixin);\n};\n\n});\n\nace.define(\"ace/lib/deep_copy\",[], function(require, exports, module){exports.deepCopy = function deepCopy(obj) {\n if (typeof obj !== \"object\" || !obj)\n return obj;\n var copy;\n if (Array.isArray(obj)) {\n copy = [];\n for (var key = 0; key < obj.length; key++) {\n copy[key] = deepCopy(obj[key]);\n }\n return copy;\n }\n if (Object.prototype.toString.call(obj) !== \"[object Object]\")\n return obj;\n copy = {};\n for (var key in obj)\n copy[key] = deepCopy(obj[key]);\n return copy;\n};\n\n});\n\nace.define(\"ace/lib/lang\",[], function(require, exports, module){\"use strict\";\nexports.last = function (a) {\n return a[a.length - 1];\n};\nexports.stringReverse = function (string) {\n return string.split(\"\").reverse().join(\"\");\n};\nexports.stringRepeat = function (string, count) {\n var result = '';\n while (count > 0) {\n if (count & 1)\n result += string;\n if (count >>= 1)\n string += string;\n }\n return result;\n};\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\nexports.stringTrimLeft = function (string) {\n return string.replace(trimBeginRegexp, '');\n};\nexports.stringTrimRight = function (string) {\n return string.replace(trimEndRegexp, '');\n};\nexports.copyObject = function (obj) {\n var copy = {};\n for (var key in obj) {\n copy[key] = obj[key];\n }\n return copy;\n};\nexports.copyArray = function (array) {\n var copy = [];\n for (var i = 0, l = array.length; i < l; i++) {\n if (array[i] && typeof array[i] == \"object\")\n copy[i] = this.copyObject(array[i]);\n else\n copy[i] = array[i];\n }\n return copy;\n};\nexports.deepCopy = require(\"./deep_copy\").deepCopy;\nexports.arrayToMap = function (arr) {\n var map = {};\n for (var i = 0; i < arr.length; i++) {\n map[arr[i]] = 1;\n }\n return map;\n};\nexports.createMap = function (props) {\n var map = Object.create(null);\n for (var i in props) {\n map[i] = props[i];\n }\n return map;\n};\nexports.arrayRemove = function (array, value) {\n for (var i = 0; i <= array.length; i++) {\n if (value === array[i]) {\n array.splice(i, 1);\n }\n }\n};\nexports.escapeRegExp = function (str) {\n return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1');\n};\nexports.escapeHTML = function (str) {\n return (\"\" + str).replace(/&/g, \"&\").replace(/\"/g, \""\").replace(/'/g, \"'\").replace(/= 0 && position.row < docLines.length &&\n position.column >= 0 && position.column <= docLines[position.row].length;\n}\nfunction validateDelta(docLines, delta) {\n if (delta.action != \"insert\" && delta.action != \"remove\")\n throwDeltaError(delta, \"delta.action must be 'insert' or 'remove'\");\n if (!(delta.lines instanceof Array))\n throwDeltaError(delta, \"delta.lines must be an Array\");\n if (!delta.start || !delta.end)\n throwDeltaError(delta, \"delta.start/end must be an present\");\n var start = delta.start;\n if (!positionInDocument(docLines, delta.start))\n throwDeltaError(delta, \"delta.start must be contained in document\");\n var end = delta.end;\n if (delta.action == \"remove\" && !positionInDocument(docLines, end))\n throwDeltaError(delta, \"delta.end must contained in document for 'remove' actions\");\n var numRangeRows = end.row - start.row;\n var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0));\n if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars)\n throwDeltaError(delta, \"delta.range must match delta lines\");\n}\nexports.applyDelta = function (docLines, delta, doNotValidate) {\n var row = delta.start.row;\n var startColumn = delta.start.column;\n var line = docLines[row] || \"\";\n switch (delta.action) {\n case \"insert\":\n var lines = delta.lines;\n if (lines.length === 1) {\n docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn);\n }\n else {\n var args = [row, 1].concat(delta.lines);\n docLines.splice.apply(docLines, args);\n docLines[row] = line.substring(0, startColumn) + docLines[row];\n docLines[row + delta.lines.length - 1] += line.substring(startColumn);\n }\n break;\n case \"remove\":\n var endColumn = delta.end.column;\n var endRow = delta.end.row;\n if (row === endRow) {\n docLines[row] = line.substring(0, startColumn) + line.substring(endColumn);\n }\n else {\n docLines.splice(row, endRow - row + 1, line.substring(0, startColumn) + docLines[endRow].substring(endColumn));\n }\n break;\n }\n};\n\n});\n\nace.define(\"ace/lib/event_emitter\",[], function(require, exports, module){\"use strict\";\nvar EventEmitter = {};\nvar stopPropagation = function () { this.propagationStopped = true; };\nvar preventDefault = function () { this.defaultPrevented = true; };\nEventEmitter._emit =\n EventEmitter._dispatchEvent = function (eventName, e) {\n this._eventRegistry || (this._eventRegistry = {});\n this._defaultHandlers || (this._defaultHandlers = {});\n var listeners = this._eventRegistry[eventName] || [];\n var defaultHandler = this._defaultHandlers[eventName];\n if (!listeners.length && !defaultHandler)\n return;\n if (typeof e != \"object\" || !e)\n e = {};\n if (!e.type)\n e.type = eventName;\n if (!e.stopPropagation)\n e.stopPropagation = stopPropagation;\n if (!e.preventDefault)\n e.preventDefault = preventDefault;\n listeners = listeners.slice();\n for (var i = 0; i < listeners.length; i++) {\n listeners[i](e, this);\n if (e.propagationStopped)\n break;\n }\n if (defaultHandler && !e.defaultPrevented)\n return defaultHandler(e, this);\n };\nEventEmitter._signal = function (eventName, e) {\n var listeners = (this._eventRegistry || {})[eventName];\n if (!listeners)\n return;\n listeners = listeners.slice();\n for (var i = 0; i < listeners.length; i++)\n listeners[i](e, this);\n};\nEventEmitter.once = function (eventName, callback) {\n var _self = this;\n this.on(eventName, function newCallback() {\n _self.off(eventName, newCallback);\n callback.apply(null, arguments);\n });\n if (!callback) {\n return new Promise(function (resolve) {\n callback = resolve;\n });\n }\n};\nEventEmitter.setDefaultHandler = function (eventName, callback) {\n var handlers = this._defaultHandlers;\n if (!handlers)\n handlers = this._defaultHandlers = { _disabled_: {} };\n if (handlers[eventName]) {\n var old = handlers[eventName];\n var disabled = handlers._disabled_[eventName];\n if (!disabled)\n handlers._disabled_[eventName] = disabled = [];\n disabled.push(old);\n var i = disabled.indexOf(callback);\n if (i != -1)\n disabled.splice(i, 1);\n }\n handlers[eventName] = callback;\n};\nEventEmitter.removeDefaultHandler = function (eventName, callback) {\n var handlers = this._defaultHandlers;\n if (!handlers)\n return;\n var disabled = handlers._disabled_[eventName];\n if (handlers[eventName] == callback) {\n if (disabled)\n this.setDefaultHandler(eventName, disabled.pop());\n }\n else if (disabled) {\n var i = disabled.indexOf(callback);\n if (i != -1)\n disabled.splice(i, 1);\n }\n};\nEventEmitter.on =\n EventEmitter.addEventListener = function (eventName, callback, capturing) {\n this._eventRegistry = this._eventRegistry || {};\n var listeners = this._eventRegistry[eventName];\n if (!listeners)\n listeners = this._eventRegistry[eventName] = [];\n if (listeners.indexOf(callback) == -1)\n listeners[capturing ? \"unshift\" : \"push\"](callback);\n return callback;\n };\nEventEmitter.off =\n EventEmitter.removeListener =\n EventEmitter.removeEventListener = function (eventName, callback) {\n this._eventRegistry = this._eventRegistry || {};\n var listeners = this._eventRegistry[eventName];\n if (!listeners)\n return;\n var index = listeners.indexOf(callback);\n if (index !== -1)\n listeners.splice(index, 1);\n };\nEventEmitter.removeAllListeners = function (eventName) {\n if (!eventName)\n this._eventRegistry = this._defaultHandlers = undefined;\n if (this._eventRegistry)\n this._eventRegistry[eventName] = undefined;\n if (this._defaultHandlers)\n this._defaultHandlers[eventName] = undefined;\n};\nexports.EventEmitter = EventEmitter;\n\n});\n\nace.define(\"ace/range\",[], function(require, exports, module){\"use strict\";\nvar comparePoints = function (p1, p2) {\n return p1.row - p2.row || p1.column - p2.column;\n};\nvar Range = /** @class */ (function () {\n function Range(startRow, startColumn, endRow, endColumn) {\n this.start = {\n row: startRow,\n column: startColumn\n };\n this.end = {\n row: endRow,\n column: endColumn\n };\n }\n Range.prototype.isEqual = function (range) {\n return this.start.row === range.start.row &&\n this.end.row === range.end.row &&\n this.start.column === range.start.column &&\n this.end.column === range.end.column;\n };\n Range.prototype.toString = function () {\n return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n };\n Range.prototype.contains = function (row, column) {\n return this.compare(row, column) == 0;\n };\n Range.prototype.compareRange = function (range) {\n var cmp, end = range.end, start = range.start;\n cmp = this.compare(end.row, end.column);\n if (cmp == 1) {\n cmp = this.compare(start.row, start.column);\n if (cmp == 1) {\n return 2;\n }\n else if (cmp == 0) {\n return 1;\n }\n else {\n return 0;\n }\n }\n else if (cmp == -1) {\n return -2;\n }\n else {\n cmp = this.compare(start.row, start.column);\n if (cmp == -1) {\n return -1;\n }\n else if (cmp == 1) {\n return 42;\n }\n else {\n return 0;\n }\n }\n };\n Range.prototype.comparePoint = function (p) {\n return this.compare(p.row, p.column);\n };\n Range.prototype.containsRange = function (range) {\n return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n };\n Range.prototype.intersects = function (range) {\n var cmp = this.compareRange(range);\n return (cmp == -1 || cmp == 0 || cmp == 1);\n };\n Range.prototype.isEnd = function (row, column) {\n return this.end.row == row && this.end.column == column;\n };\n Range.prototype.isStart = function (row, column) {\n return this.start.row == row && this.start.column == column;\n };\n Range.prototype.setStart = function (row, column) {\n if (typeof row == \"object\") {\n this.start.column = row.column;\n this.start.row = row.row;\n }\n else {\n this.start.row = row;\n this.start.column = column;\n }\n };\n Range.prototype.setEnd = function (row, column) {\n if (typeof row == \"object\") {\n this.end.column = row.column;\n this.end.row = row.row;\n }\n else {\n this.end.row = row;\n this.end.column = column;\n }\n };\n Range.prototype.inside = function (row, column) {\n if (this.compare(row, column) == 0) {\n if (this.isEnd(row, column) || this.isStart(row, column)) {\n return false;\n }\n else {\n return true;\n }\n }\n return false;\n };\n Range.prototype.insideStart = function (row, column) {\n if (this.compare(row, column) == 0) {\n if (this.isEnd(row, column)) {\n return false;\n }\n else {\n return true;\n }\n }\n return false;\n };\n Range.prototype.insideEnd = function (row, column) {\n if (this.compare(row, column) == 0) {\n if (this.isStart(row, column)) {\n return false;\n }\n else {\n return true;\n }\n }\n return false;\n };\n Range.prototype.compare = function (row, column) {\n if (!this.isMultiLine()) {\n if (row === this.start.row) {\n return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n }\n }\n if (row < this.start.row)\n return -1;\n if (row > this.end.row)\n return 1;\n if (this.start.row === row)\n return column >= this.start.column ? 0 : -1;\n if (this.end.row === row)\n return column <= this.end.column ? 0 : 1;\n return 0;\n };\n Range.prototype.compareStart = function (row, column) {\n if (this.start.row == row && this.start.column == column) {\n return -1;\n }\n else {\n return this.compare(row, column);\n }\n };\n Range.prototype.compareEnd = function (row, column) {\n if (this.end.row == row && this.end.column == column) {\n return 1;\n }\n else {\n return this.compare(row, column);\n }\n };\n Range.prototype.compareInside = function (row, column) {\n if (this.end.row == row && this.end.column == column) {\n return 1;\n }\n else if (this.start.row == row && this.start.column == column) {\n return -1;\n }\n else {\n return this.compare(row, column);\n }\n };\n Range.prototype.clipRows = function (firstRow, lastRow) {\n if (this.end.row > lastRow)\n var end = { row: lastRow + 1, column: 0 };\n else if (this.end.row < firstRow)\n var end = { row: firstRow, column: 0 };\n if (this.start.row > lastRow)\n var start = { row: lastRow + 1, column: 0 };\n else if (this.start.row < firstRow)\n var start = { row: firstRow, column: 0 };\n return Range.fromPoints(start || this.start, end || this.end);\n };\n Range.prototype.extend = function (row, column) {\n var cmp = this.compare(row, column);\n if (cmp == 0)\n return this;\n else if (cmp == -1)\n var start = { row: row, column: column };\n else\n var end = { row: row, column: column };\n return Range.fromPoints(start || this.start, end || this.end);\n };\n Range.prototype.isEmpty = function () {\n return (this.start.row === this.end.row && this.start.column === this.end.column);\n };\n Range.prototype.isMultiLine = function () {\n return (this.start.row !== this.end.row);\n };\n Range.prototype.clone = function () {\n return Range.fromPoints(this.start, this.end);\n };\n Range.prototype.collapseRows = function () {\n if (this.end.column == 0)\n return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row - 1), 0);\n else\n return new Range(this.start.row, 0, this.end.row, 0);\n };\n Range.prototype.toScreenRange = function (session) {\n var screenPosStart = session.documentToScreenPosition(this.start);\n var screenPosEnd = session.documentToScreenPosition(this.end);\n return new Range(screenPosStart.row, screenPosStart.column, screenPosEnd.row, screenPosEnd.column);\n };\n Range.prototype.moveBy = function (row, column) {\n this.start.row += row;\n this.start.column += column;\n this.end.row += row;\n this.end.column += column;\n };\n return Range;\n}());\nRange.fromPoints = function (start, end) {\n return new Range(start.row, start.column, end.row, end.column);\n};\nRange.comparePoints = comparePoints;\nRange.comparePoints = function (p1, p2) {\n return p1.row - p2.row || p1.column - p2.column;\n};\nexports.Range = Range;\n\n});\n\nace.define(\"ace/anchor\",[], function(require, exports, module){\"use strict\";\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Anchor = /** @class */ (function () {\n function Anchor(doc, row, column) {\n this.$onChange = this.onChange.bind(this);\n this.attach(doc);\n if (typeof column == \"undefined\")\n this.setPosition(row.row, row.column);\n else\n this.setPosition(row, column);\n }\n Anchor.prototype.getPosition = function () {\n return this.$clipPositionToDocument(this.row, this.column);\n };\n Anchor.prototype.getDocument = function () {\n return this.document;\n };\n Anchor.prototype.onChange = function (delta) {\n if (delta.start.row == delta.end.row && delta.start.row != this.row)\n return;\n if (delta.start.row > this.row)\n return;\n var point = $getTransformedPoint(delta, { row: this.row, column: this.column }, this.$insertRight);\n this.setPosition(point.row, point.column, true);\n };\n Anchor.prototype.setPosition = function (row, column, noClip) {\n var pos;\n if (noClip) {\n pos = {\n row: row,\n column: column\n };\n }\n else {\n pos = this.$clipPositionToDocument(row, column);\n }\n if (this.row == pos.row && this.column == pos.column)\n return;\n var old = {\n row: this.row,\n column: this.column\n };\n this.row = pos.row;\n this.column = pos.column;\n this._signal(\"change\", {\n old: old,\n value: pos\n });\n };\n Anchor.prototype.detach = function () {\n this.document.off(\"change\", this.$onChange);\n };\n Anchor.prototype.attach = function (doc) {\n this.document = doc || this.document;\n this.document.on(\"change\", this.$onChange);\n };\n Anchor.prototype.$clipPositionToDocument = function (row, column) {\n var pos = {};\n if (row >= this.document.getLength()) {\n pos.row = Math.max(0, this.document.getLength() - 1);\n pos.column = this.document.getLine(pos.row).length;\n }\n else if (row < 0) {\n pos.row = 0;\n pos.column = 0;\n }\n else {\n pos.row = row;\n pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n }\n if (column < 0)\n pos.column = 0;\n return pos;\n };\n return Anchor;\n}());\nAnchor.prototype.$insertRight = false;\noop.implement(Anchor.prototype, EventEmitter);\nfunction $pointsInOrder(point1, point2, equalPointsInOrder) {\n var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column;\n return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter);\n}\nfunction $getTransformedPoint(delta, point, moveIfEqual) {\n var deltaIsInsert = delta.action == \"insert\";\n var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row);\n var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column);\n var deltaStart = delta.start;\n var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range.\n if ($pointsInOrder(point, deltaStart, moveIfEqual)) {\n return {\n row: point.row,\n column: point.column\n };\n }\n if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) {\n return {\n row: point.row + deltaRowShift,\n column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0)\n };\n }\n return {\n row: deltaStart.row,\n column: deltaStart.column\n };\n}\nexports.Anchor = Anchor;\n\n});\n\nace.define(\"ace/document\",[], function(require, exports, module){\"use strict\";\nvar oop = require(\"./lib/oop\");\nvar applyDelta = require(\"./apply_delta\").applyDelta;\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\nvar Document = /** @class */ (function () {\n function Document(textOrLines) {\n this.$lines = [\"\"];\n if (textOrLines.length === 0) {\n this.$lines = [\"\"];\n }\n else if (Array.isArray(textOrLines)) {\n this.insertMergedLines({ row: 0, column: 0 }, textOrLines);\n }\n else {\n this.insert({ row: 0, column: 0 }, textOrLines);\n }\n }\n Document.prototype.setValue = function (text) {\n var len = this.getLength() - 1;\n this.remove(new Range(0, 0, len, this.getLine(len).length));\n this.insert({ row: 0, column: 0 }, text || \"\");\n };\n Document.prototype.getValue = function () {\n return this.getAllLines().join(this.getNewLineCharacter());\n };\n Document.prototype.createAnchor = function (row, column) {\n return new Anchor(this, row, column);\n };\n Document.prototype.$detectNewLine = function (text) {\n var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n this.$autoNewLine = match ? match[1] : \"\\n\";\n this._signal(\"changeNewLineMode\");\n };\n Document.prototype.getNewLineCharacter = function () {\n switch (this.$newLineMode) {\n case \"windows\":\n return \"\\r\\n\";\n case \"unix\":\n return \"\\n\";\n default:\n return this.$autoNewLine || \"\\n\";\n }\n };\n Document.prototype.setNewLineMode = function (newLineMode) {\n if (this.$newLineMode === newLineMode)\n return;\n this.$newLineMode = newLineMode;\n this._signal(\"changeNewLineMode\");\n };\n Document.prototype.getNewLineMode = function () {\n return this.$newLineMode;\n };\n Document.prototype.isNewLine = function (text) {\n return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n };\n Document.prototype.getLine = function (row) {\n return this.$lines[row] || \"\";\n };\n Document.prototype.getLines = function (firstRow, lastRow) {\n return this.$lines.slice(firstRow, lastRow + 1);\n };\n Document.prototype.getAllLines = function () {\n return this.getLines(0, this.getLength());\n };\n Document.prototype.getLength = function () {\n return this.$lines.length;\n };\n Document.prototype.getTextRange = function (range) {\n return this.getLinesForRange(range).join(this.getNewLineCharacter());\n };\n Document.prototype.getLinesForRange = function (range) {\n var lines;\n if (range.start.row === range.end.row) {\n lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)];\n }\n else {\n lines = this.getLines(range.start.row, range.end.row);\n lines[0] = (lines[0] || \"\").substring(range.start.column);\n var l = lines.length - 1;\n if (range.end.row - range.start.row == l)\n lines[l] = lines[l].substring(0, range.end.column);\n }\n return lines;\n };\n Document.prototype.insertLines = function (row, lines) {\n console.warn(\"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\");\n return this.insertFullLines(row, lines);\n };\n Document.prototype.removeLines = function (firstRow, lastRow) {\n console.warn(\"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\");\n return this.removeFullLines(firstRow, lastRow);\n };\n Document.prototype.insertNewLine = function (position) {\n console.warn(\"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.\");\n return this.insertMergedLines(position, [\"\", \"\"]);\n };\n Document.prototype.insert = function (position, text) {\n if (this.getLength() <= 1)\n this.$detectNewLine(text);\n return this.insertMergedLines(position, this.$split(text));\n };\n Document.prototype.insertInLine = function (position, text) {\n var start = this.clippedPos(position.row, position.column);\n var end = this.pos(position.row, position.column + text.length);\n this.applyDelta({\n start: start,\n end: end,\n action: \"insert\",\n lines: [text]\n }, true);\n return this.clonePos(end);\n };\n Document.prototype.clippedPos = function (row, column) {\n var length = this.getLength();\n if (row === undefined) {\n row = length;\n }\n else if (row < 0) {\n row = 0;\n }\n else if (row >= length) {\n row = length - 1;\n column = undefined;\n }\n var line = this.getLine(row);\n if (column == undefined)\n column = line.length;\n column = Math.min(Math.max(column, 0), line.length);\n return { row: row, column: column };\n };\n Document.prototype.clonePos = function (pos) {\n return { row: pos.row, column: pos.column };\n };\n Document.prototype.pos = function (row, column) {\n return { row: row, column: column };\n };\n Document.prototype.$clipPosition = function (position) {\n var length = this.getLength();\n if (position.row >= length) {\n position.row = Math.max(0, length - 1);\n position.column = this.getLine(length - 1).length;\n }\n else {\n position.row = Math.max(0, position.row);\n position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length);\n }\n return position;\n };\n Document.prototype.insertFullLines = function (row, lines) {\n row = Math.min(Math.max(row, 0), this.getLength());\n var column = 0;\n if (row < this.getLength()) {\n lines = lines.concat([\"\"]);\n column = 0;\n }\n else {\n lines = [\"\"].concat(lines);\n row--;\n column = this.$lines[row].length;\n }\n this.insertMergedLines({ row: row, column: column }, lines);\n };\n Document.prototype.insertMergedLines = function (position, lines) {\n var start = this.clippedPos(position.row, position.column);\n var end = {\n row: start.row + lines.length - 1,\n column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length\n };\n this.applyDelta({\n start: start,\n end: end,\n action: \"insert\",\n lines: lines\n });\n return this.clonePos(end);\n };\n Document.prototype.remove = function (range) {\n var start = this.clippedPos(range.start.row, range.start.column);\n var end = this.clippedPos(range.end.row, range.end.column);\n this.applyDelta({\n start: start,\n end: end,\n action: \"remove\",\n lines: this.getLinesForRange({ start: start, end: end })\n });\n return this.clonePos(start);\n };\n Document.prototype.removeInLine = function (row, startColumn, endColumn) {\n var start = this.clippedPos(row, startColumn);\n var end = this.clippedPos(row, endColumn);\n this.applyDelta({\n start: start,\n end: end,\n action: \"remove\",\n lines: this.getLinesForRange({ start: start, end: end })\n }, true);\n return this.clonePos(start);\n };\n Document.prototype.removeFullLines = function (firstRow, lastRow) {\n firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1);\n lastRow = Math.min(Math.max(0, lastRow), this.getLength() - 1);\n var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0;\n var deleteLastNewLine = lastRow < this.getLength() - 1;\n var startRow = (deleteFirstNewLine ? firstRow - 1 : firstRow);\n var startCol = (deleteFirstNewLine ? this.getLine(startRow).length : 0);\n var endRow = (deleteLastNewLine ? lastRow + 1 : lastRow);\n var endCol = (deleteLastNewLine ? 0 : this.getLine(endRow).length);\n var range = new Range(startRow, startCol, endRow, endCol);\n var deletedLines = this.$lines.slice(firstRow, lastRow + 1);\n this.applyDelta({\n start: range.start,\n end: range.end,\n action: \"remove\",\n lines: this.getLinesForRange(range)\n });\n return deletedLines;\n };\n Document.prototype.removeNewLine = function (row) {\n if (row < this.getLength() - 1 && row >= 0) {\n this.applyDelta({\n start: this.pos(row, this.getLine(row).length),\n end: this.pos(row + 1, 0),\n action: \"remove\",\n lines: [\"\", \"\"]\n });\n }\n };\n Document.prototype.replace = function (range, text) {\n if (!(range instanceof Range))\n range = Range.fromPoints(range.start, range.end);\n if (text.length === 0 && range.isEmpty())\n return range.start;\n if (text == this.getTextRange(range))\n return range.end;\n this.remove(range);\n var end;\n if (text) {\n end = this.insert(range.start, text);\n }\n else {\n end = range.start;\n }\n return end;\n };\n Document.prototype.applyDeltas = function (deltas) {\n for (var i = 0; i < deltas.length; i++) {\n this.applyDelta(deltas[i]);\n }\n };\n Document.prototype.revertDeltas = function (deltas) {\n for (var i = deltas.length - 1; i >= 0; i--) {\n this.revertDelta(deltas[i]);\n }\n };\n Document.prototype.applyDelta = function (delta, doNotValidate) {\n var isInsert = delta.action == \"insert\";\n if (isInsert ? delta.lines.length <= 1 && !delta.lines[0]\n : !Range.comparePoints(delta.start, delta.end)) {\n return;\n }\n if (isInsert && delta.lines.length > 20000) {\n this.$splitAndapplyLargeDelta(delta, 20000);\n }\n else {\n applyDelta(this.$lines, delta, doNotValidate);\n this._signal(\"change\", delta);\n }\n };\n Document.prototype.$safeApplyDelta = function (delta) {\n var docLength = this.$lines.length;\n if (delta.action == \"remove\" && delta.start.row < docLength && delta.end.row < docLength\n || delta.action == \"insert\" && delta.start.row <= docLength) {\n this.applyDelta(delta);\n }\n };\n Document.prototype.$splitAndapplyLargeDelta = function (delta, MAX) {\n var lines = delta.lines;\n var l = lines.length - MAX + 1;\n var row = delta.start.row;\n var column = delta.start.column;\n for (var from = 0, to = 0; from < l; from = to) {\n to += MAX - 1;\n var chunk = lines.slice(from, to);\n chunk.push(\"\");\n this.applyDelta({\n start: this.pos(row + from, column),\n end: this.pos(row + to, column = 0),\n action: delta.action,\n lines: chunk\n }, true);\n }\n delta.lines = lines.slice(from);\n delta.start.row = row + from;\n delta.start.column = column;\n this.applyDelta(delta, true);\n };\n Document.prototype.revertDelta = function (delta) {\n this.$safeApplyDelta({\n start: this.clonePos(delta.start),\n end: this.clonePos(delta.end),\n action: (delta.action == \"insert\" ? \"remove\" : \"insert\"),\n lines: delta.lines.slice()\n });\n };\n Document.prototype.indexToPosition = function (index, startRow) {\n var lines = this.$lines || this.getAllLines();\n var newlineLength = this.getNewLineCharacter().length;\n for (var i = startRow || 0, l = lines.length; i < l; i++) {\n index -= lines[i].length + newlineLength;\n if (index < 0)\n return { row: i, column: index + lines[i].length + newlineLength };\n }\n return { row: l - 1, column: index + lines[l - 1].length + newlineLength };\n };\n Document.prototype.positionToIndex = function (pos, startRow) {\n var lines = this.$lines || this.getAllLines();\n var newlineLength = this.getNewLineCharacter().length;\n var index = 0;\n var row = Math.min(pos.row, lines.length);\n for (var i = startRow || 0; i < row; ++i)\n index += lines[i].length + newlineLength;\n return index + pos.column;\n };\n Document.prototype.$split = function (text) {\n return text.split(/\\r\\n|\\r|\\n/);\n };\n return Document;\n}());\nDocument.prototype.$autoNewLine = \"\";\nDocument.prototype.$newLineMode = \"auto\";\noop.implement(Document.prototype, EventEmitter);\nexports.Document = Document;\n\n});\n\nace.define(\"ace/worker/mirror\",[], function(require, exports, module) {\n\"use strict\";\n\nvar Document = require(\"../document\").Document;\nvar lang = require(\"../lib/lang\");\n \nvar Mirror = exports.Mirror = function(sender) {\n this.sender = sender;\n var doc = this.doc = new Document(\"\");\n \n var deferredUpdate = this.deferredUpdate = lang.delayedCall(this.onUpdate.bind(this));\n \n var _self = this;\n sender.on(\"change\", function(e) {\n var data = e.data;\n if (data[0].start) {\n doc.applyDeltas(data);\n } else {\n for (var i = 0; i < data.length; i += 2) {\n var d, err; \n if (Array.isArray(data[i+1])) {\n d = {action: \"insert\", start: data[i], lines: data[i+1]};\n } else {\n d = {action: \"remove\", start: data[i], end: data[i+1]};\n }\n \n if ((d.action == \"insert\" ? d.start : d.end).row >= doc.$lines.length) {\n err = new Error(\"Invalid delta\");\n err.data = {\n path: _self.$path,\n linesLength: doc.$lines.length,\n start: d.start,\n end: d.end\n };\n throw err;\n }\n\n doc.applyDelta(d, true);\n }\n }\n if (_self.$timeout)\n return deferredUpdate.schedule(_self.$timeout);\n _self.onUpdate();\n });\n};\n\n(function() {\n \n this.$timeout = 500;\n \n this.setTimeout = function(timeout) {\n this.$timeout = timeout;\n };\n \n this.setValue = function(value) {\n this.doc.setValue(value);\n this.deferredUpdate.schedule(this.$timeout);\n };\n \n this.getValue = function(callbackId) {\n this.sender.callback(this.doc.getValue(), callbackId);\n };\n \n this.onUpdate = function() {\n };\n \n this.isPending = function() {\n return this.deferredUpdate.isPending();\n };\n \n}).call(Mirror.prototype);\n\n});\n\nace.define(\"ace/mode/css/csslint\",[], function(require, exports, module) {\n\nvar CSSLint = (function(){\n var module = module || {},\n exports = exports || {};\nvar parserlib = (function () {\nvar require;\nrequire=(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i\") {\n this.type = \"child\";\n } else if (text === \"+\") {\n this.type = \"adjacent-sibling\";\n } else if (text === \"~\") {\n this.type = \"sibling\";\n }\n\n}\n\nCombinator.prototype = new SyntaxUnit();\nCombinator.prototype.constructor = Combinator;\n\n\n},{\"../util/SyntaxUnit\":26,\"./Parser\":6}],3:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = Matcher;\n\nvar StringReader = require(\"../util/StringReader\");\nvar SyntaxError = require(\"../util/SyntaxError\");\nfunction Matcher(matchFunc, toString) {\n this.match = function(expression) {\n var result;\n expression.mark();\n result = matchFunc(expression);\n if (result) {\n expression.drop();\n } else {\n expression.restore();\n }\n return result;\n };\n this.toString = typeof toString === \"function\" ? toString : function() {\n return toString;\n };\n}\nMatcher.prec = {\n MOD: 5,\n SEQ: 4,\n ANDAND: 3,\n OROR: 2,\n ALT: 1\n};\nMatcher.parse = function(str) {\n var reader, eat, expr, oror, andand, seq, mod, term, result;\n reader = new StringReader(str);\n eat = function(matcher) {\n var result = reader.readMatch(matcher);\n if (result === null) {\n throw new SyntaxError(\n \"Expected \" + matcher, reader.getLine(), reader.getCol());\n }\n return result;\n };\n expr = function() {\n var m = [ oror() ];\n while (reader.readMatch(\" | \") !== null) {\n m.push(oror());\n }\n return m.length === 1 ? m[0] : Matcher.alt.apply(Matcher, m);\n };\n oror = function() {\n var m = [ andand() ];\n while (reader.readMatch(\" || \") !== null) {\n m.push(andand());\n }\n return m.length === 1 ? m[0] : Matcher.oror.apply(Matcher, m);\n };\n andand = function() {\n var m = [ seq() ];\n while (reader.readMatch(\" && \") !== null) {\n m.push(seq());\n }\n return m.length === 1 ? m[0] : Matcher.andand.apply(Matcher, m);\n };\n seq = function() {\n var m = [ mod() ];\n while (reader.readMatch(/^ (?![&|\\]])/) !== null) {\n m.push(mod());\n }\n return m.length === 1 ? m[0] : Matcher.seq.apply(Matcher, m);\n };\n mod = function() {\n var m = term();\n if (reader.readMatch(\"?\") !== null) {\n return m.question();\n } else if (reader.readMatch(\"*\") !== null) {\n return m.star();\n } else if (reader.readMatch(\"+\") !== null) {\n return m.plus();\n } else if (reader.readMatch(\"#\") !== null) {\n return m.hash();\n } else if (reader.readMatch(/^\\{\\s*/) !== null) {\n var min = eat(/^\\d+/);\n eat(/^\\s*,\\s*/);\n var max = eat(/^\\d+/);\n eat(/^\\s*\\}/);\n return m.braces(Number(min), Number(max));\n }\n return m;\n };\n term = function() {\n if (reader.readMatch(\"[ \") !== null) {\n var m = expr();\n eat(\" ]\");\n return m;\n }\n return Matcher.fromType(eat(/^[^ ?*+#{]+/));\n };\n result = expr();\n if (!reader.eof()) {\n throw new SyntaxError(\n \"Expected end of string\", reader.getLine(), reader.getCol());\n }\n return result;\n};\nMatcher.cast = function(m) {\n if (m instanceof Matcher) {\n return m;\n }\n return Matcher.parse(m);\n};\nMatcher.fromType = function(type) {\n var ValidationTypes = require(\"./ValidationTypes\");\n return new Matcher(function(expression) {\n return expression.hasNext() && ValidationTypes.isType(expression, type);\n }, type);\n};\nMatcher.seq = function() {\n var ms = Array.prototype.slice.call(arguments).map(Matcher.cast);\n if (ms.length === 1) {\n return ms[0];\n }\n return new Matcher(function(expression) {\n var i, result = true;\n for (i = 0; result && i < ms.length; i++) {\n result = ms[i].match(expression);\n }\n return result;\n }, function(prec) {\n var p = Matcher.prec.SEQ;\n var s = ms.map(function(m) {\n return m.toString(p);\n }).join(\" \");\n if (prec > p) {\n s = \"[ \" + s + \" ]\";\n }\n return s;\n });\n};\nMatcher.alt = function() {\n var ms = Array.prototype.slice.call(arguments).map(Matcher.cast);\n if (ms.length === 1) {\n return ms[0];\n }\n return new Matcher(function(expression) {\n var i, result = false;\n for (i = 0; !result && i < ms.length; i++) {\n result = ms[i].match(expression);\n }\n return result;\n }, function(prec) {\n var p = Matcher.prec.ALT;\n var s = ms.map(function(m) {\n return m.toString(p);\n }).join(\" | \");\n if (prec > p) {\n s = \"[ \" + s + \" ]\";\n }\n return s;\n });\n};\nMatcher.many = function(required) {\n var ms = Array.prototype.slice.call(arguments, 1).reduce(function(acc, v) {\n if (v.expand) {\n var ValidationTypes = require(\"./ValidationTypes\");\n acc.push.apply(acc, ValidationTypes.complex[v.expand].options);\n } else {\n acc.push(Matcher.cast(v));\n }\n return acc;\n }, []);\n\n if (required === true) {\n required = ms.map(function() {\n return true;\n });\n }\n\n var result = new Matcher(function(expression) {\n var seen = [], max = 0, pass = 0;\n var success = function(matchCount) {\n if (pass === 0) {\n max = Math.max(matchCount, max);\n return matchCount === ms.length;\n } else {\n return matchCount === max;\n }\n };\n var tryMatch = function(matchCount) {\n for (var i = 0; i < ms.length; i++) {\n if (seen[i]) {\n continue;\n }\n expression.mark();\n if (ms[i].match(expression)) {\n seen[i] = true;\n if (tryMatch(matchCount + (required === false || required[i] ? 1 : 0))) {\n expression.drop();\n return true;\n }\n expression.restore();\n seen[i] = false;\n } else {\n expression.drop();\n }\n }\n return success(matchCount);\n };\n if (!tryMatch(0)) {\n pass++;\n tryMatch(0);\n }\n\n if (required === false) {\n return max > 0;\n }\n for (var i = 0; i < ms.length; i++) {\n if (required[i] && !seen[i]) {\n return false;\n }\n }\n return true;\n }, function(prec) {\n var p = required === false ? Matcher.prec.OROR : Matcher.prec.ANDAND;\n var s = ms.map(function(m, i) {\n if (required !== false && !required[i]) {\n return m.toString(Matcher.prec.MOD) + \"?\";\n }\n return m.toString(p);\n }).join(required === false ? \" || \" : \" && \");\n if (prec > p) {\n s = \"[ \" + s + \" ]\";\n }\n return s;\n });\n result.options = ms;\n return result;\n};\nMatcher.andand = function() {\n var args = Array.prototype.slice.call(arguments);\n args.unshift(true);\n return Matcher.many.apply(Matcher, args);\n};\nMatcher.oror = function() {\n var args = Array.prototype.slice.call(arguments);\n args.unshift(false);\n return Matcher.many.apply(Matcher, args);\n};\nMatcher.prototype = {\n constructor: Matcher,\n match: function() {\n throw new Error(\"unimplemented\");\n },\n toString: function() {\n throw new Error(\"unimplemented\");\n },\n func: function() {\n return this.match.bind(this);\n },\n then: function(m) {\n return Matcher.seq(this, m);\n },\n or: function(m) {\n return Matcher.alt(this, m);\n },\n andand: function(m) {\n return Matcher.many(true, this, m);\n },\n oror: function(m) {\n return Matcher.many(false, this, m);\n },\n star: function() {\n return this.braces(0, Infinity, \"*\");\n },\n plus: function() {\n return this.braces(1, Infinity, \"+\");\n },\n question: function() {\n return this.braces(0, 1, \"?\");\n },\n hash: function() {\n return this.braces(1, Infinity, \"#\", Matcher.cast(\",\"));\n },\n braces: function(min, max, marker, optSep) {\n var m1 = this, m2 = optSep ? optSep.then(this) : this;\n if (!marker) {\n marker = \"{\" + min + \",\" + max + \"}\";\n }\n return new Matcher(function(expression) {\n var result = true, i;\n for (i = 0; i < max; i++) {\n if (i > 0 && optSep) {\n result = m2.match(expression);\n } else {\n result = m1.match(expression);\n }\n if (!result) {\n break;\n }\n }\n return i >= min;\n }, function() {\n return m1.toString(Matcher.prec.MOD) + marker;\n });\n }\n};\n\n},{\"../util/StringReader\":24,\"../util/SyntaxError\":25,\"./ValidationTypes\":21}],4:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = MediaFeature;\n\nvar SyntaxUnit = require(\"../util/SyntaxUnit\");\n\nvar Parser = require(\"./Parser\");\nfunction MediaFeature(name, value) {\n\n SyntaxUnit.call(this, \"(\" + name + (value !== null ? \":\" + value : \"\") + \")\", name.startLine, name.startCol, Parser.MEDIA_FEATURE_TYPE);\n this.name = name;\n this.value = value;\n}\n\nMediaFeature.prototype = new SyntaxUnit();\nMediaFeature.prototype.constructor = MediaFeature;\n\n\n},{\"../util/SyntaxUnit\":26,\"./Parser\":6}],5:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = MediaQuery;\n\nvar SyntaxUnit = require(\"../util/SyntaxUnit\");\n\nvar Parser = require(\"./Parser\");\nfunction MediaQuery(modifier, mediaType, features, line, col) {\n\n SyntaxUnit.call(this, (modifier ? modifier + \" \" : \"\") + (mediaType ? mediaType : \"\") + (mediaType && features.length > 0 ? \" and \" : \"\") + features.join(\" and \"), line, col, Parser.MEDIA_QUERY_TYPE);\n this.modifier = modifier;\n this.mediaType = mediaType;\n this.features = features;\n\n}\n\nMediaQuery.prototype = new SyntaxUnit();\nMediaQuery.prototype.constructor = MediaQuery;\n\n\n},{\"../util/SyntaxUnit\":26,\"./Parser\":6}],6:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = Parser;\n\nvar EventTarget = require(\"../util/EventTarget\");\nvar SyntaxError = require(\"../util/SyntaxError\");\nvar SyntaxUnit = require(\"../util/SyntaxUnit\");\n\nvar Combinator = require(\"./Combinator\");\nvar MediaFeature = require(\"./MediaFeature\");\nvar MediaQuery = require(\"./MediaQuery\");\nvar PropertyName = require(\"./PropertyName\");\nvar PropertyValue = require(\"./PropertyValue\");\nvar PropertyValuePart = require(\"./PropertyValuePart\");\nvar Selector = require(\"./Selector\");\nvar SelectorPart = require(\"./SelectorPart\");\nvar SelectorSubPart = require(\"./SelectorSubPart\");\nvar TokenStream = require(\"./TokenStream\");\nvar Tokens = require(\"./Tokens\");\nvar Validation = require(\"./Validation\");\nfunction Parser(options) {\n EventTarget.call(this);\n\n\n this.options = options || {};\n\n this._tokenStream = null;\n}\nParser.DEFAULT_TYPE = 0;\nParser.COMBINATOR_TYPE = 1;\nParser.MEDIA_FEATURE_TYPE = 2;\nParser.MEDIA_QUERY_TYPE = 3;\nParser.PROPERTY_NAME_TYPE = 4;\nParser.PROPERTY_VALUE_TYPE = 5;\nParser.PROPERTY_VALUE_PART_TYPE = 6;\nParser.SELECTOR_TYPE = 7;\nParser.SELECTOR_PART_TYPE = 8;\nParser.SELECTOR_SUB_PART_TYPE = 9;\n\nParser.prototype = function() {\n\n var proto = new EventTarget(), // new prototype\n prop,\n additions = {\n __proto__: null,\n constructor: Parser,\n DEFAULT_TYPE : 0,\n COMBINATOR_TYPE : 1,\n MEDIA_FEATURE_TYPE : 2,\n MEDIA_QUERY_TYPE : 3,\n PROPERTY_NAME_TYPE : 4,\n PROPERTY_VALUE_TYPE : 5,\n PROPERTY_VALUE_PART_TYPE : 6,\n SELECTOR_TYPE : 7,\n SELECTOR_PART_TYPE : 8,\n SELECTOR_SUB_PART_TYPE : 9,\n\n _stylesheet: function() {\n\n var tokenStream = this._tokenStream,\n count,\n token,\n tt;\n\n this.fire(\"startstylesheet\");\n this._charset();\n\n this._skipCruft();\n while (tokenStream.peek() === Tokens.IMPORT_SYM) {\n this._import();\n this._skipCruft();\n }\n while (tokenStream.peek() === Tokens.NAMESPACE_SYM) {\n this._namespace();\n this._skipCruft();\n }\n tt = tokenStream.peek();\n while (tt > Tokens.EOF) {\n\n try {\n\n switch (tt) {\n case Tokens.MEDIA_SYM:\n this._media();\n this._skipCruft();\n break;\n case Tokens.PAGE_SYM:\n this._page();\n this._skipCruft();\n break;\n case Tokens.FONT_FACE_SYM:\n this._font_face();\n this._skipCruft();\n break;\n case Tokens.KEYFRAMES_SYM:\n this._keyframes();\n this._skipCruft();\n break;\n case Tokens.VIEWPORT_SYM:\n this._viewport();\n this._skipCruft();\n break;\n case Tokens.DOCUMENT_SYM:\n this._document();\n this._skipCruft();\n break;\n case Tokens.SUPPORTS_SYM:\n this._supports();\n this._skipCruft();\n break;\n case Tokens.UNKNOWN_SYM: // unknown @ rule\n tokenStream.get();\n if (!this.options.strict) {\n this.fire({\n type: \"error\",\n error: null,\n message: \"Unknown @ rule: \" + tokenStream.LT(0).value + \".\",\n line: tokenStream.LT(0).startLine,\n col: tokenStream.LT(0).startCol\n });\n count = 0;\n while (tokenStream.advance([Tokens.LBRACE, Tokens.RBRACE]) === Tokens.LBRACE) {\n count++; // keep track of nesting depth\n }\n\n while (count) {\n tokenStream.advance([Tokens.RBRACE]);\n count--;\n }\n\n } else {\n throw new SyntaxError(\"Unknown @ rule.\", tokenStream.LT(0).startLine, tokenStream.LT(0).startCol);\n }\n break;\n case Tokens.S:\n this._readWhitespace();\n break;\n default:\n if (!this._ruleset()) {\n switch (tt) {\n case Tokens.CHARSET_SYM:\n token = tokenStream.LT(1);\n this._charset(false);\n throw new SyntaxError(\"@charset not allowed here.\", token.startLine, token.startCol);\n case Tokens.IMPORT_SYM:\n token = tokenStream.LT(1);\n this._import(false);\n throw new SyntaxError(\"@import not allowed here.\", token.startLine, token.startCol);\n case Tokens.NAMESPACE_SYM:\n token = tokenStream.LT(1);\n this._namespace(false);\n throw new SyntaxError(\"@namespace not allowed here.\", token.startLine, token.startCol);\n default:\n tokenStream.get(); // get the last token\n this._unexpectedToken(tokenStream.token());\n }\n\n }\n }\n } catch (ex) {\n if (ex instanceof SyntaxError && !this.options.strict) {\n this.fire({\n type: \"error\",\n error: ex,\n message: ex.message,\n line: ex.line,\n col: ex.col\n });\n } else {\n throw ex;\n }\n }\n\n tt = tokenStream.peek();\n }\n\n if (tt !== Tokens.EOF) {\n this._unexpectedToken(tokenStream.token());\n }\n\n this.fire(\"endstylesheet\");\n },\n\n _charset: function(emit) {\n var tokenStream = this._tokenStream,\n charset,\n token,\n line,\n col;\n\n if (tokenStream.match(Tokens.CHARSET_SYM)) {\n line = tokenStream.token().startLine;\n col = tokenStream.token().startCol;\n\n this._readWhitespace();\n tokenStream.mustMatch(Tokens.STRING);\n\n token = tokenStream.token();\n charset = token.value;\n\n this._readWhitespace();\n tokenStream.mustMatch(Tokens.SEMICOLON);\n\n if (emit !== false) {\n this.fire({\n type: \"charset\",\n charset:charset,\n line: line,\n col: col\n });\n }\n }\n },\n\n _import: function(emit) {\n\n var tokenStream = this._tokenStream,\n uri,\n importToken,\n mediaList = [];\n tokenStream.mustMatch(Tokens.IMPORT_SYM);\n importToken = tokenStream.token();\n this._readWhitespace();\n\n tokenStream.mustMatch([Tokens.STRING, Tokens.URI]);\n uri = tokenStream.token().value.replace(/^(?:url\\()?[\"']?([^\"']+?)[\"']?\\)?$/, \"$1\");\n\n this._readWhitespace();\n\n mediaList = this._media_query_list();\n tokenStream.mustMatch(Tokens.SEMICOLON);\n this._readWhitespace();\n\n if (emit !== false) {\n this.fire({\n type: \"import\",\n uri: uri,\n media: mediaList,\n line: importToken.startLine,\n col: importToken.startCol\n });\n }\n\n },\n\n _namespace: function(emit) {\n\n var tokenStream = this._tokenStream,\n line,\n col,\n prefix,\n uri;\n tokenStream.mustMatch(Tokens.NAMESPACE_SYM);\n line = tokenStream.token().startLine;\n col = tokenStream.token().startCol;\n this._readWhitespace();\n if (tokenStream.match(Tokens.IDENT)) {\n prefix = tokenStream.token().value;\n this._readWhitespace();\n }\n\n tokenStream.mustMatch([Tokens.STRING, Tokens.URI]);\n uri = tokenStream.token().value.replace(/(?:url\\()?[\"']([^\"']+)[\"']\\)?/, \"$1\");\n\n this._readWhitespace();\n tokenStream.mustMatch(Tokens.SEMICOLON);\n this._readWhitespace();\n\n if (emit !== false) {\n this.fire({\n type: \"namespace\",\n prefix: prefix,\n uri: uri,\n line: line,\n col: col\n });\n }\n\n },\n\n _supports: function(emit) {\n var tokenStream = this._tokenStream,\n line,\n col;\n\n if (tokenStream.match(Tokens.SUPPORTS_SYM)) {\n line = tokenStream.token().startLine;\n col = tokenStream.token().startCol;\n\n this._readWhitespace();\n this._supports_condition();\n this._readWhitespace();\n\n tokenStream.mustMatch(Tokens.LBRACE);\n this._readWhitespace();\n\n if (emit !== false) {\n this.fire({\n type: \"startsupports\",\n line: line,\n col: col\n });\n }\n\n while (true) {\n if (!this._ruleset()) {\n break;\n }\n }\n\n tokenStream.mustMatch(Tokens.RBRACE);\n this._readWhitespace();\n\n this.fire({\n type: \"endsupports\",\n line: line,\n col: col\n });\n }\n },\n\n _supports_condition: function() {\n var tokenStream = this._tokenStream,\n ident;\n\n if (tokenStream.match(Tokens.IDENT)) {\n ident = tokenStream.token().value.toLowerCase();\n\n if (ident === \"not\") {\n tokenStream.mustMatch(Tokens.S);\n this._supports_condition_in_parens();\n } else {\n tokenStream.unget();\n }\n } else {\n this._supports_condition_in_parens();\n this._readWhitespace();\n\n while (tokenStream.peek() === Tokens.IDENT) {\n ident = tokenStream.LT(1).value.toLowerCase();\n if (ident === \"and\" || ident === \"or\") {\n tokenStream.mustMatch(Tokens.IDENT);\n this._readWhitespace();\n this._supports_condition_in_parens();\n this._readWhitespace();\n }\n }\n }\n },\n\n _supports_condition_in_parens: function() {\n var tokenStream = this._tokenStream,\n ident;\n\n if (tokenStream.match(Tokens.LPAREN)) {\n this._readWhitespace();\n if (tokenStream.match(Tokens.IDENT)) {\n ident = tokenStream.token().value.toLowerCase();\n if (ident === \"not\") {\n this._readWhitespace();\n this._supports_condition();\n this._readWhitespace();\n tokenStream.mustMatch(Tokens.RPAREN);\n } else {\n tokenStream.unget();\n this._supports_declaration_condition(false);\n }\n } else {\n this._supports_condition();\n this._readWhitespace();\n tokenStream.mustMatch(Tokens.RPAREN);\n }\n } else {\n this._supports_declaration_condition();\n }\n },\n\n _supports_declaration_condition: function(requireStartParen) {\n var tokenStream = this._tokenStream;\n\n if (requireStartParen !== false) {\n tokenStream.mustMatch(Tokens.LPAREN);\n }\n this._readWhitespace();\n this._declaration();\n tokenStream.mustMatch(Tokens.RPAREN);\n },\n\n _media: function() {\n var tokenStream = this._tokenStream,\n line,\n col,\n mediaList; // = [];\n tokenStream.mustMatch(Tokens.MEDIA_SYM);\n line = tokenStream.token().startLine;\n col = tokenStream.token().startCol;\n\n this._readWhitespace();\n\n mediaList = this._media_query_list();\n\n tokenStream.mustMatch(Tokens.LBRACE);\n this._readWhitespace();\n\n this.fire({\n type: \"startmedia\",\n media: mediaList,\n line: line,\n col: col\n });\n\n while (true) {\n if (tokenStream.peek() === Tokens.PAGE_SYM) {\n this._page();\n } else if (tokenStream.peek() === Tokens.FONT_FACE_SYM) {\n this._font_face();\n } else if (tokenStream.peek() === Tokens.VIEWPORT_SYM) {\n this._viewport();\n } else if (tokenStream.peek() === Tokens.DOCUMENT_SYM) {\n this._document();\n } else if (tokenStream.peek() === Tokens.SUPPORTS_SYM) {\n this._supports();\n } else if (tokenStream.peek() === Tokens.MEDIA_SYM) {\n this._media();\n } else if (!this._ruleset()) {\n break;\n }\n }\n\n tokenStream.mustMatch(Tokens.RBRACE);\n this._readWhitespace();\n\n this.fire({\n type: \"endmedia\",\n media: mediaList,\n line: line,\n col: col\n });\n },\n _media_query_list: function() {\n var tokenStream = this._tokenStream,\n mediaList = [];\n\n\n this._readWhitespace();\n\n if (tokenStream.peek() === Tokens.IDENT || tokenStream.peek() === Tokens.LPAREN) {\n mediaList.push(this._media_query());\n }\n\n while (tokenStream.match(Tokens.COMMA)) {\n this._readWhitespace();\n mediaList.push(this._media_query());\n }\n\n return mediaList;\n },\n _media_query: function() {\n var tokenStream = this._tokenStream,\n type = null,\n ident = null,\n token = null,\n expressions = [];\n\n if (tokenStream.match(Tokens.IDENT)) {\n ident = tokenStream.token().value.toLowerCase();\n if (ident !== \"only\" && ident !== \"not\") {\n tokenStream.unget();\n ident = null;\n } else {\n token = tokenStream.token();\n }\n }\n\n this._readWhitespace();\n\n if (tokenStream.peek() === Tokens.IDENT) {\n type = this._media_type();\n if (token === null) {\n token = tokenStream.token();\n }\n } else if (tokenStream.peek() === Tokens.LPAREN) {\n if (token === null) {\n token = tokenStream.LT(1);\n }\n expressions.push(this._media_expression());\n }\n\n if (type === null && expressions.length === 0) {\n return null;\n } else {\n this._readWhitespace();\n while (tokenStream.match(Tokens.IDENT)) {\n if (tokenStream.token().value.toLowerCase() !== \"and\") {\n this._unexpectedToken(tokenStream.token());\n }\n\n this._readWhitespace();\n expressions.push(this._media_expression());\n }\n }\n\n return new MediaQuery(ident, type, expressions, token.startLine, token.startCol);\n },\n _media_type: function() {\n return this._media_feature();\n },\n _media_expression: function() {\n var tokenStream = this._tokenStream,\n feature = null,\n token,\n expression = null;\n\n tokenStream.mustMatch(Tokens.LPAREN);\n this._readWhitespace();\n\n feature = this._media_feature();\n this._readWhitespace();\n\n if (tokenStream.match(Tokens.COLON)) {\n this._readWhitespace();\n token = tokenStream.LT(1);\n expression = this._expression();\n }\n\n tokenStream.mustMatch(Tokens.RPAREN);\n this._readWhitespace();\n\n return new MediaFeature(feature, expression ? new SyntaxUnit(expression, token.startLine, token.startCol) : null);\n },\n _media_feature: function() {\n var tokenStream = this._tokenStream;\n\n this._readWhitespace();\n\n tokenStream.mustMatch(Tokens.IDENT);\n\n return SyntaxUnit.fromToken(tokenStream.token());\n },\n _page: function() {\n var tokenStream = this._tokenStream,\n line,\n col,\n identifier = null,\n pseudoPage = null;\n tokenStream.mustMatch(Tokens.PAGE_SYM);\n line = tokenStream.token().startLine;\n col = tokenStream.token().startCol;\n\n this._readWhitespace();\n\n if (tokenStream.match(Tokens.IDENT)) {\n identifier = tokenStream.token().value;\n if (identifier.toLowerCase() === \"auto\") {\n this._unexpectedToken(tokenStream.token());\n }\n }\n if (tokenStream.peek() === Tokens.COLON) {\n pseudoPage = this._pseudo_page();\n }\n\n this._readWhitespace();\n\n this.fire({\n type: \"startpage\",\n id: identifier,\n pseudo: pseudoPage,\n line: line,\n col: col\n });\n\n this._readDeclarations(true, true);\n\n this.fire({\n type: \"endpage\",\n id: identifier,\n pseudo: pseudoPage,\n line: line,\n col: col\n });\n\n },\n _margin: function() {\n var tokenStream = this._tokenStream,\n line,\n col,\n marginSym = this._margin_sym();\n\n if (marginSym) {\n line = tokenStream.token().startLine;\n col = tokenStream.token().startCol;\n\n this.fire({\n type: \"startpagemargin\",\n margin: marginSym,\n line: line,\n col: col\n });\n\n this._readDeclarations(true);\n\n this.fire({\n type: \"endpagemargin\",\n margin: marginSym,\n line: line,\n col: col\n });\n return true;\n } else {\n return false;\n }\n },\n _margin_sym: function() {\n\n var tokenStream = this._tokenStream;\n\n if (tokenStream.match([Tokens.TOPLEFTCORNER_SYM, Tokens.TOPLEFT_SYM,\n Tokens.TOPCENTER_SYM, Tokens.TOPRIGHT_SYM, Tokens.TOPRIGHTCORNER_SYM,\n Tokens.BOTTOMLEFTCORNER_SYM, Tokens.BOTTOMLEFT_SYM,\n Tokens.BOTTOMCENTER_SYM, Tokens.BOTTOMRIGHT_SYM,\n Tokens.BOTTOMRIGHTCORNER_SYM, Tokens.LEFTTOP_SYM,\n Tokens.LEFTMIDDLE_SYM, Tokens.LEFTBOTTOM_SYM, Tokens.RIGHTTOP_SYM,\n Tokens.RIGHTMIDDLE_SYM, Tokens.RIGHTBOTTOM_SYM])) {\n return SyntaxUnit.fromToken(tokenStream.token());\n } else {\n return null;\n }\n\n },\n\n _pseudo_page: function() {\n\n var tokenStream = this._tokenStream;\n\n tokenStream.mustMatch(Tokens.COLON);\n tokenStream.mustMatch(Tokens.IDENT);\n\n return tokenStream.token().value;\n },\n\n _font_face: function() {\n var tokenStream = this._tokenStream,\n line,\n col;\n tokenStream.mustMatch(Tokens.FONT_FACE_SYM);\n line = tokenStream.token().startLine;\n col = tokenStream.token().startCol;\n\n this._readWhitespace();\n\n this.fire({\n type: \"startfontface\",\n line: line,\n col: col\n });\n\n this._readDeclarations(true);\n\n this.fire({\n type: \"endfontface\",\n line: line,\n col: col\n });\n },\n\n _viewport: function() {\n var tokenStream = this._tokenStream,\n line,\n col;\n\n tokenStream.mustMatch(Tokens.VIEWPORT_SYM);\n line = tokenStream.token().startLine;\n col = tokenStream.token().startCol;\n\n this._readWhitespace();\n\n this.fire({\n type: \"startviewport\",\n line: line,\n col: col\n });\n\n this._readDeclarations(true);\n\n this.fire({\n type: \"endviewport\",\n line: line,\n col: col\n });\n\n },\n\n _document: function() {\n\n var tokenStream = this._tokenStream,\n token,\n functions = [],\n prefix = \"\";\n\n tokenStream.mustMatch(Tokens.DOCUMENT_SYM);\n token = tokenStream.token();\n if (/^@-([^-]+)-/.test(token.value)) {\n prefix = RegExp.$1;\n }\n\n this._readWhitespace();\n functions.push(this._document_function());\n\n while (tokenStream.match(Tokens.COMMA)) {\n this._readWhitespace();\n functions.push(this._document_function());\n }\n\n tokenStream.mustMatch(Tokens.LBRACE);\n this._readWhitespace();\n\n this.fire({\n type: \"startdocument\",\n functions: functions,\n prefix: prefix,\n line: token.startLine,\n col: token.startCol\n });\n\n var ok = true;\n while (ok) {\n switch (tokenStream.peek()) {\n case Tokens.PAGE_SYM:\n this._page();\n break;\n case Tokens.FONT_FACE_SYM:\n this._font_face();\n break;\n case Tokens.VIEWPORT_SYM:\n this._viewport();\n break;\n case Tokens.MEDIA_SYM:\n this._media();\n break;\n case Tokens.KEYFRAMES_SYM:\n this._keyframes();\n break;\n case Tokens.DOCUMENT_SYM:\n this._document();\n break;\n default:\n ok = Boolean(this._ruleset());\n }\n }\n\n tokenStream.mustMatch(Tokens.RBRACE);\n token = tokenStream.token();\n this._readWhitespace();\n\n this.fire({\n type: \"enddocument\",\n functions: functions,\n prefix: prefix,\n line: token.startLine,\n col: token.startCol\n });\n },\n\n _document_function: function() {\n\n var tokenStream = this._tokenStream,\n value;\n\n if (tokenStream.match(Tokens.URI)) {\n value = tokenStream.token().value;\n this._readWhitespace();\n } else {\n value = this._function();\n }\n\n return value;\n },\n\n _operator: function(inFunction) {\n\n var tokenStream = this._tokenStream,\n token = null;\n\n if (tokenStream.match([Tokens.SLASH, Tokens.COMMA]) ||\n inFunction && tokenStream.match([Tokens.PLUS, Tokens.STAR, Tokens.MINUS])) {\n token = tokenStream.token();\n this._readWhitespace();\n }\n return token ? PropertyValuePart.fromToken(token) : null;\n\n },\n\n _combinator: function() {\n\n var tokenStream = this._tokenStream,\n value = null,\n token;\n\n if (tokenStream.match([Tokens.PLUS, Tokens.GREATER, Tokens.TILDE])) {\n token = tokenStream.token();\n value = new Combinator(token.value, token.startLine, token.startCol);\n this._readWhitespace();\n }\n\n return value;\n },\n\n _unary_operator: function() {\n\n var tokenStream = this._tokenStream;\n\n if (tokenStream.match([Tokens.MINUS, Tokens.PLUS])) {\n return tokenStream.token().value;\n } else {\n return null;\n }\n },\n\n _property: function() {\n\n var tokenStream = this._tokenStream,\n value = null,\n hack = null,\n propertyName = \"\",\n token,\n line,\n col;\n if (tokenStream.peek() === Tokens.STAR && this.options.starHack) {\n tokenStream.get();\n token = tokenStream.token();\n hack = token.value;\n line = token.startLine;\n col = token.startCol;\n }\n if (tokenStream.peek() === Tokens.MINUS) {\n tokenStream.get();\n token = tokenStream.token();\n propertyName = token.value;\n line = token.startLine;\n col = token.startCol;\n }\n\n if (tokenStream.match(Tokens.IDENT)) {\n token = tokenStream.token();\n propertyName += token.value;\n if (propertyName.charAt(0) === \"_\" && this.options.underscoreHack) {\n hack = \"_\";\n propertyName = propertyName.substring(1);\n }\n\n value = new PropertyName(propertyName, hack, line || token.startLine, col || token.startCol);\n this._readWhitespace();\n } else {\n var tt = tokenStream.peek();\n if (tt !== Tokens.EOF && tt !== Tokens.RBRACE) {\n this._unexpectedToken(tokenStream.LT(1));\n }\n }\n\n return value;\n },\n _ruleset: function() {\n\n var tokenStream = this._tokenStream,\n tt,\n selectors;\n try {\n selectors = this._selectors_group();\n } catch (ex) {\n if (ex instanceof SyntaxError && !this.options.strict) {\n this.fire({\n type: \"error\",\n error: ex,\n message: ex.message,\n line: ex.line,\n col: ex.col\n });\n tt = tokenStream.advance([Tokens.RBRACE]);\n if (tt === Tokens.RBRACE) {\n } else {\n throw ex;\n }\n\n } else {\n throw ex;\n }\n return true;\n }\n if (selectors) {\n\n this.fire({\n type: \"startrule\",\n selectors: selectors,\n line: selectors[0].line,\n col: selectors[0].col\n });\n\n this._readDeclarations(true);\n\n this.fire({\n type: \"endrule\",\n selectors: selectors,\n line: selectors[0].line,\n col: selectors[0].col\n });\n\n }\n\n return selectors;\n\n },\n _selectors_group: function() {\n var tokenStream = this._tokenStream,\n selectors = [],\n selector;\n\n selector = this._selector();\n if (selector !== null) {\n\n selectors.push(selector);\n while (tokenStream.match(Tokens.COMMA)) {\n this._readWhitespace();\n selector = this._selector();\n if (selector !== null) {\n selectors.push(selector);\n } else {\n this._unexpectedToken(tokenStream.LT(1));\n }\n }\n }\n\n return selectors.length ? selectors : null;\n },\n _selector: function() {\n\n var tokenStream = this._tokenStream,\n selector = [],\n nextSelector = null,\n combinator = null,\n ws = null;\n nextSelector = this._simple_selector_sequence();\n if (nextSelector === null) {\n return null;\n }\n\n selector.push(nextSelector);\n\n do {\n combinator = this._combinator();\n\n if (combinator !== null) {\n selector.push(combinator);\n nextSelector = this._simple_selector_sequence();\n if (nextSelector === null) {\n this._unexpectedToken(tokenStream.LT(1));\n } else {\n selector.push(nextSelector);\n }\n } else {\n if (this._readWhitespace()) {\n ws = new Combinator(tokenStream.token().value, tokenStream.token().startLine, tokenStream.token().startCol);\n combinator = this._combinator();\n nextSelector = this._simple_selector_sequence();\n if (nextSelector === null) {\n if (combinator !== null) {\n this._unexpectedToken(tokenStream.LT(1));\n }\n } else {\n\n if (combinator !== null) {\n selector.push(combinator);\n } else {\n selector.push(ws);\n }\n\n selector.push(nextSelector);\n }\n } else {\n break;\n }\n\n }\n } while (true);\n\n return new Selector(selector, selector[0].line, selector[0].col);\n },\n _simple_selector_sequence: function() {\n\n var tokenStream = this._tokenStream,\n elementName = null,\n modifiers = [],\n selectorText = \"\",\n components = [\n function() {\n return tokenStream.match(Tokens.HASH) ?\n new SelectorSubPart(tokenStream.token().value, \"id\", tokenStream.token().startLine, tokenStream.token().startCol) :\n null;\n },\n this._class,\n this._attrib,\n this._pseudo,\n this._negation\n ],\n i = 0,\n len = components.length,\n component = null,\n line,\n col;\n line = tokenStream.LT(1).startLine;\n col = tokenStream.LT(1).startCol;\n\n elementName = this._type_selector();\n if (!elementName) {\n elementName = this._universal();\n }\n\n if (elementName !== null) {\n selectorText += elementName;\n }\n\n while (true) {\n if (tokenStream.peek() === Tokens.S) {\n break;\n }\n while (i < len && component === null) {\n component = components[i++].call(this);\n }\n\n if (component === null) {\n if (selectorText === \"\") {\n return null;\n } else {\n break;\n }\n } else {\n i = 0;\n modifiers.push(component);\n selectorText += component.toString();\n component = null;\n }\n }\n\n\n return selectorText !== \"\" ?\n new SelectorPart(elementName, modifiers, selectorText, line, col) :\n null;\n },\n _type_selector: function() {\n\n var tokenStream = this._tokenStream,\n ns = this._namespace_prefix(),\n elementName = this._element_name();\n\n if (!elementName) {\n if (ns) {\n tokenStream.unget();\n if (ns.length > 1) {\n tokenStream.unget();\n }\n }\n\n return null;\n } else {\n if (ns) {\n elementName.text = ns + elementName.text;\n elementName.col -= ns.length;\n }\n return elementName;\n }\n },\n _class: function() {\n\n var tokenStream = this._tokenStream,\n token;\n\n if (tokenStream.match(Tokens.DOT)) {\n tokenStream.mustMatch(Tokens.IDENT);\n token = tokenStream.token();\n return new SelectorSubPart(\".\" + token.value, \"class\", token.startLine, token.startCol - 1);\n } else {\n return null;\n }\n\n },\n _element_name: function() {\n\n var tokenStream = this._tokenStream,\n token;\n\n if (tokenStream.match(Tokens.IDENT)) {\n token = tokenStream.token();\n return new SelectorSubPart(token.value, \"elementName\", token.startLine, token.startCol);\n\n } else {\n return null;\n }\n },\n _namespace_prefix: function() {\n var tokenStream = this._tokenStream,\n value = \"\";\n if (tokenStream.LA(1) === Tokens.PIPE || tokenStream.LA(2) === Tokens.PIPE) {\n\n if (tokenStream.match([Tokens.IDENT, Tokens.STAR])) {\n value += tokenStream.token().value;\n }\n\n tokenStream.mustMatch(Tokens.PIPE);\n value += \"|\";\n\n }\n\n return value.length ? value : null;\n },\n _universal: function() {\n var tokenStream = this._tokenStream,\n value = \"\",\n ns;\n\n ns = this._namespace_prefix();\n if (ns) {\n value += ns;\n }\n\n if (tokenStream.match(Tokens.STAR)) {\n value += \"*\";\n }\n\n return value.length ? value : null;\n\n },\n _attrib: function() {\n\n var tokenStream = this._tokenStream,\n value = null,\n ns,\n token;\n\n if (tokenStream.match(Tokens.LBRACKET)) {\n token = tokenStream.token();\n value = token.value;\n value += this._readWhitespace();\n\n ns = this._namespace_prefix();\n\n if (ns) {\n value += ns;\n }\n\n tokenStream.mustMatch(Tokens.IDENT);\n value += tokenStream.token().value;\n value += this._readWhitespace();\n\n if (tokenStream.match([Tokens.PREFIXMATCH, Tokens.SUFFIXMATCH, Tokens.SUBSTRINGMATCH,\n Tokens.EQUALS, Tokens.INCLUDES, Tokens.DASHMATCH])) {\n\n value += tokenStream.token().value;\n value += this._readWhitespace();\n\n tokenStream.mustMatch([Tokens.IDENT, Tokens.STRING]);\n value += tokenStream.token().value;\n value += this._readWhitespace();\n }\n\n tokenStream.mustMatch(Tokens.RBRACKET);\n\n return new SelectorSubPart(value + \"]\", \"attribute\", token.startLine, token.startCol);\n } else {\n return null;\n }\n },\n _pseudo: function() {\n\n var tokenStream = this._tokenStream,\n pseudo = null,\n colons = \":\",\n line,\n col;\n\n if (tokenStream.match(Tokens.COLON)) {\n\n if (tokenStream.match(Tokens.COLON)) {\n colons += \":\";\n }\n\n if (tokenStream.match(Tokens.IDENT)) {\n pseudo = tokenStream.token().value;\n line = tokenStream.token().startLine;\n col = tokenStream.token().startCol - colons.length;\n } else if (tokenStream.peek() === Tokens.FUNCTION) {\n line = tokenStream.LT(1).startLine;\n col = tokenStream.LT(1).startCol - colons.length;\n pseudo = this._functional_pseudo();\n }\n\n if (pseudo) {\n pseudo = new SelectorSubPart(colons + pseudo, \"pseudo\", line, col);\n } else {\n var startLine = tokenStream.LT(1).startLine,\n startCol = tokenStream.LT(0).startCol;\n throw new SyntaxError(\"Expected a `FUNCTION` or `IDENT` after colon at line \" + startLine + \", col \" + startCol + \".\", startLine, startCol);\n }\n }\n\n return pseudo;\n },\n _functional_pseudo: function() {\n\n var tokenStream = this._tokenStream,\n value = null;\n\n if (tokenStream.match(Tokens.FUNCTION)) {\n value = tokenStream.token().value;\n value += this._readWhitespace();\n value += this._expression();\n tokenStream.mustMatch(Tokens.RPAREN);\n value += \")\";\n }\n\n return value;\n },\n _expression: function() {\n\n var tokenStream = this._tokenStream,\n value = \"\";\n\n while (tokenStream.match([Tokens.PLUS, Tokens.MINUS, Tokens.DIMENSION,\n Tokens.NUMBER, Tokens.STRING, Tokens.IDENT, Tokens.LENGTH,\n Tokens.FREQ, Tokens.ANGLE, Tokens.TIME,\n Tokens.RESOLUTION, Tokens.SLASH])) {\n\n value += tokenStream.token().value;\n value += this._readWhitespace();\n }\n\n return value.length ? value : null;\n\n },\n _negation: function() {\n\n var tokenStream = this._tokenStream,\n line,\n col,\n value = \"\",\n arg,\n subpart = null;\n\n if (tokenStream.match(Tokens.NOT)) {\n value = tokenStream.token().value;\n line = tokenStream.token().startLine;\n col = tokenStream.token().startCol;\n value += this._readWhitespace();\n arg = this._negation_arg();\n value += arg;\n value += this._readWhitespace();\n tokenStream.match(Tokens.RPAREN);\n value += tokenStream.token().value;\n\n subpart = new SelectorSubPart(value, \"not\", line, col);\n subpart.args.push(arg);\n }\n\n return subpart;\n },\n _negation_arg: function() {\n\n var tokenStream = this._tokenStream,\n args = [\n this._type_selector,\n this._universal,\n function() {\n return tokenStream.match(Tokens.HASH) ?\n new SelectorSubPart(tokenStream.token().value, \"id\", tokenStream.token().startLine, tokenStream.token().startCol) :\n null;\n },\n this._class,\n this._attrib,\n this._pseudo\n ],\n arg = null,\n i = 0,\n len = args.length,\n line,\n col,\n part;\n\n line = tokenStream.LT(1).startLine;\n col = tokenStream.LT(1).startCol;\n\n while (i < len && arg === null) {\n\n arg = args[i].call(this);\n i++;\n }\n if (arg === null) {\n this._unexpectedToken(tokenStream.LT(1));\n }\n if (arg.type === \"elementName\") {\n part = new SelectorPart(arg, [], arg.toString(), line, col);\n } else {\n part = new SelectorPart(null, [arg], arg.toString(), line, col);\n }\n\n return part;\n },\n\n _declaration: function() {\n\n var tokenStream = this._tokenStream,\n property = null,\n expr = null,\n prio = null,\n invalid = null,\n propertyName = \"\";\n\n property = this._property();\n if (property !== null) {\n\n tokenStream.mustMatch(Tokens.COLON);\n this._readWhitespace();\n\n expr = this._expr();\n if (!expr || expr.length === 0) {\n this._unexpectedToken(tokenStream.LT(1));\n }\n\n prio = this._prio();\n propertyName = property.toString();\n if (this.options.starHack && property.hack === \"*\" ||\n this.options.underscoreHack && property.hack === \"_\") {\n\n propertyName = property.text;\n }\n\n try {\n this._validateProperty(propertyName, expr);\n } catch (ex) {\n invalid = ex;\n }\n\n this.fire({\n type: \"property\",\n property: property,\n value: expr,\n important: prio,\n line: property.line,\n col: property.col,\n invalid: invalid\n });\n\n return true;\n } else {\n return false;\n }\n },\n\n _prio: function() {\n\n var tokenStream = this._tokenStream,\n result = tokenStream.match(Tokens.IMPORTANT_SYM);\n\n this._readWhitespace();\n return result;\n },\n\n _expr: function(inFunction) {\n\n var values = [],\n value = null,\n operator = null;\n\n value = this._term(inFunction);\n if (value !== null) {\n\n values.push(value);\n\n do {\n operator = this._operator(inFunction);\n if (operator) {\n values.push(operator);\n } /*else {\n values.push(new PropertyValue(valueParts, valueParts[0].line, valueParts[0].col));\n valueParts = [];\n }*/\n\n value = this._term(inFunction);\n\n if (value === null) {\n break;\n } else {\n values.push(value);\n }\n } while (true);\n }\n\n return values.length > 0 ? new PropertyValue(values, values[0].line, values[0].col) : null;\n },\n\n _term: function(inFunction) {\n\n var tokenStream = this._tokenStream,\n unary = null,\n value = null,\n endChar = null,\n part = null,\n token,\n line,\n col;\n unary = this._unary_operator();\n if (unary !== null) {\n line = tokenStream.token().startLine;\n col = tokenStream.token().startCol;\n }\n if (tokenStream.peek() === Tokens.IE_FUNCTION && this.options.ieFilters) {\n\n value = this._ie_function();\n if (unary === null) {\n line = tokenStream.token().startLine;\n col = tokenStream.token().startCol;\n }\n } else if (inFunction && tokenStream.match([Tokens.LPAREN, Tokens.LBRACE, Tokens.LBRACKET])) {\n\n token = tokenStream.token();\n endChar = token.endChar;\n value = token.value + this._expr(inFunction).text;\n if (unary === null) {\n line = tokenStream.token().startLine;\n col = tokenStream.token().startCol;\n }\n tokenStream.mustMatch(Tokens.type(endChar));\n value += endChar;\n this._readWhitespace();\n } else if (tokenStream.match([Tokens.NUMBER, Tokens.PERCENTAGE, Tokens.LENGTH,\n Tokens.ANGLE, Tokens.TIME,\n Tokens.FREQ, Tokens.STRING, Tokens.IDENT, Tokens.URI, Tokens.UNICODE_RANGE])) {\n\n value = tokenStream.token().value;\n if (unary === null) {\n line = tokenStream.token().startLine;\n col = tokenStream.token().startCol;\n part = PropertyValuePart.fromToken(tokenStream.token());\n }\n this._readWhitespace();\n } else {\n token = this._hexcolor();\n if (token === null) {\n if (unary === null) {\n line = tokenStream.LT(1).startLine;\n col = tokenStream.LT(1).startCol;\n }\n if (value === null) {\n if (tokenStream.LA(3) === Tokens.EQUALS && this.options.ieFilters) {\n value = this._ie_function();\n } else {\n value = this._function();\n }\n }\n\n } else {\n value = token.value;\n if (unary === null) {\n line = token.startLine;\n col = token.startCol;\n }\n }\n\n }\n\n return part !== null ? part : value !== null ?\n new PropertyValuePart(unary !== null ? unary + value : value, line, col) :\n null;\n\n },\n\n _function: function() {\n\n var tokenStream = this._tokenStream,\n functionText = null,\n expr = null,\n lt;\n\n if (tokenStream.match(Tokens.FUNCTION)) {\n functionText = tokenStream.token().value;\n this._readWhitespace();\n expr = this._expr(true);\n functionText += expr;\n if (this.options.ieFilters && tokenStream.peek() === Tokens.EQUALS) {\n do {\n\n if (this._readWhitespace()) {\n functionText += tokenStream.token().value;\n }\n if (tokenStream.LA(0) === Tokens.COMMA) {\n functionText += tokenStream.token().value;\n }\n\n tokenStream.match(Tokens.IDENT);\n functionText += tokenStream.token().value;\n\n tokenStream.match(Tokens.EQUALS);\n functionText += tokenStream.token().value;\n lt = tokenStream.peek();\n while (lt !== Tokens.COMMA && lt !== Tokens.S && lt !== Tokens.RPAREN) {\n tokenStream.get();\n functionText += tokenStream.token().value;\n lt = tokenStream.peek();\n }\n } while (tokenStream.match([Tokens.COMMA, Tokens.S]));\n }\n\n tokenStream.match(Tokens.RPAREN);\n functionText += \")\";\n this._readWhitespace();\n }\n\n return functionText;\n },\n\n _ie_function: function() {\n\n var tokenStream = this._tokenStream,\n functionText = null,\n lt;\n if (tokenStream.match([Tokens.IE_FUNCTION, Tokens.FUNCTION])) {\n functionText = tokenStream.token().value;\n\n do {\n\n if (this._readWhitespace()) {\n functionText += tokenStream.token().value;\n }\n if (tokenStream.LA(0) === Tokens.COMMA) {\n functionText += tokenStream.token().value;\n }\n\n tokenStream.match(Tokens.IDENT);\n functionText += tokenStream.token().value;\n\n tokenStream.match(Tokens.EQUALS);\n functionText += tokenStream.token().value;\n lt = tokenStream.peek();\n while (lt !== Tokens.COMMA && lt !== Tokens.S && lt !== Tokens.RPAREN) {\n tokenStream.get();\n functionText += tokenStream.token().value;\n lt = tokenStream.peek();\n }\n } while (tokenStream.match([Tokens.COMMA, Tokens.S]));\n\n tokenStream.match(Tokens.RPAREN);\n functionText += \")\";\n this._readWhitespace();\n }\n\n return functionText;\n },\n\n _hexcolor: function() {\n\n var tokenStream = this._tokenStream,\n token = null,\n color;\n\n if (tokenStream.match(Tokens.HASH)) {\n\n token = tokenStream.token();\n color = token.value;\n if (!/#[a-f0-9]{3,6}/i.test(color)) {\n throw new SyntaxError(\"Expected a hex color but found '\" + color + \"' at line \" + token.startLine + \", col \" + token.startCol + \".\", token.startLine, token.startCol);\n }\n this._readWhitespace();\n }\n\n return token;\n },\n\n _keyframes: function() {\n var tokenStream = this._tokenStream,\n token,\n tt,\n name,\n prefix = \"\";\n\n tokenStream.mustMatch(Tokens.KEYFRAMES_SYM);\n token = tokenStream.token();\n if (/^@-([^-]+)-/.test(token.value)) {\n prefix = RegExp.$1;\n }\n\n this._readWhitespace();\n name = this._keyframe_name();\n\n this._readWhitespace();\n tokenStream.mustMatch(Tokens.LBRACE);\n\n this.fire({\n type: \"startkeyframes\",\n name: name,\n prefix: prefix,\n line: token.startLine,\n col: token.startCol\n });\n\n this._readWhitespace();\n tt = tokenStream.peek();\n while (tt === Tokens.IDENT || tt === Tokens.PERCENTAGE) {\n this._keyframe_rule();\n this._readWhitespace();\n tt = tokenStream.peek();\n }\n\n this.fire({\n type: \"endkeyframes\",\n name: name,\n prefix: prefix,\n line: token.startLine,\n col: token.startCol\n });\n\n this._readWhitespace();\n tokenStream.mustMatch(Tokens.RBRACE);\n this._readWhitespace();\n\n },\n\n _keyframe_name: function() {\n var tokenStream = this._tokenStream;\n\n tokenStream.mustMatch([Tokens.IDENT, Tokens.STRING]);\n return SyntaxUnit.fromToken(tokenStream.token());\n },\n\n _keyframe_rule: function() {\n var keyList = this._key_list();\n\n this.fire({\n type: \"startkeyframerule\",\n keys: keyList,\n line: keyList[0].line,\n col: keyList[0].col\n });\n\n this._readDeclarations(true);\n\n this.fire({\n type: \"endkeyframerule\",\n keys: keyList,\n line: keyList[0].line,\n col: keyList[0].col\n });\n\n },\n\n _key_list: function() {\n var tokenStream = this._tokenStream,\n keyList = [];\n keyList.push(this._key());\n\n this._readWhitespace();\n\n while (tokenStream.match(Tokens.COMMA)) {\n this._readWhitespace();\n keyList.push(this._key());\n this._readWhitespace();\n }\n\n return keyList;\n },\n\n _key: function() {\n\n var tokenStream = this._tokenStream,\n token;\n\n if (tokenStream.match(Tokens.PERCENTAGE)) {\n return SyntaxUnit.fromToken(tokenStream.token());\n } else if (tokenStream.match(Tokens.IDENT)) {\n token = tokenStream.token();\n\n if (/from|to/i.test(token.value)) {\n return SyntaxUnit.fromToken(token);\n }\n\n tokenStream.unget();\n }\n this._unexpectedToken(tokenStream.LT(1));\n },\n _skipCruft: function() {\n while (this._tokenStream.match([Tokens.S, Tokens.CDO, Tokens.CDC])) {\n }\n },\n _readDeclarations: function(checkStart, readMargins) {\n var tokenStream = this._tokenStream,\n tt;\n\n\n this._readWhitespace();\n\n if (checkStart) {\n tokenStream.mustMatch(Tokens.LBRACE);\n }\n\n this._readWhitespace();\n\n try {\n\n while (true) {\n\n if (tokenStream.match(Tokens.SEMICOLON) || (readMargins && this._margin())) {\n } else if (this._declaration()) {\n if (!tokenStream.match(Tokens.SEMICOLON)) {\n break;\n }\n } else {\n break;\n }\n this._readWhitespace();\n }\n\n tokenStream.mustMatch(Tokens.RBRACE);\n this._readWhitespace();\n\n } catch (ex) {\n if (ex instanceof SyntaxError && !this.options.strict) {\n this.fire({\n type: \"error\",\n error: ex,\n message: ex.message,\n line: ex.line,\n col: ex.col\n });\n tt = tokenStream.advance([Tokens.SEMICOLON, Tokens.RBRACE]);\n if (tt === Tokens.SEMICOLON) {\n this._readDeclarations(false, readMargins);\n } else if (tt !== Tokens.EOF && tt !== Tokens.RBRACE) {\n throw ex;\n }\n\n } else {\n throw ex;\n }\n }\n\n },\n _readWhitespace: function() {\n\n var tokenStream = this._tokenStream,\n ws = \"\";\n\n while (tokenStream.match(Tokens.S)) {\n ws += tokenStream.token().value;\n }\n\n return ws;\n },\n _unexpectedToken: function(token) {\n throw new SyntaxError(\"Unexpected token '\" + token.value + \"' at line \" + token.startLine + \", col \" + token.startCol + \".\", token.startLine, token.startCol);\n },\n _verifyEnd: function() {\n if (this._tokenStream.LA(1) !== Tokens.EOF) {\n this._unexpectedToken(this._tokenStream.LT(1));\n }\n },\n _validateProperty: function(property, value) {\n Validation.validate(property, value);\n },\n\n parse: function(input) {\n this._tokenStream = new TokenStream(input, Tokens);\n this._stylesheet();\n },\n\n parseStyleSheet: function(input) {\n return this.parse(input);\n },\n\n parseMediaQuery: function(input) {\n this._tokenStream = new TokenStream(input, Tokens);\n var result = this._media_query();\n this._verifyEnd();\n return result;\n },\n parsePropertyValue: function(input) {\n\n this._tokenStream = new TokenStream(input, Tokens);\n this._readWhitespace();\n\n var result = this._expr();\n this._readWhitespace();\n this._verifyEnd();\n return result;\n },\n parseRule: function(input) {\n this._tokenStream = new TokenStream(input, Tokens);\n this._readWhitespace();\n\n var result = this._ruleset();\n this._readWhitespace();\n this._verifyEnd();\n return result;\n },\n parseSelector: function(input) {\n\n this._tokenStream = new TokenStream(input, Tokens);\n this._readWhitespace();\n\n var result = this._selector();\n this._readWhitespace();\n this._verifyEnd();\n return result;\n },\n parseStyleAttribute: function(input) {\n input += \"}\"; // for error recovery in _readDeclarations()\n this._tokenStream = new TokenStream(input, Tokens);\n this._readDeclarations();\n }\n };\n for (prop in additions) {\n if (Object.prototype.hasOwnProperty.call(additions, prop)) {\n proto[prop] = additions[prop];\n }\n }\n\n return proto;\n}();\n\n},{\"../util/EventTarget\":23,\"../util/SyntaxError\":25,\"../util/SyntaxUnit\":26,\"./Combinator\":2,\"./MediaFeature\":4,\"./MediaQuery\":5,\"./PropertyName\":8,\"./PropertyValue\":9,\"./PropertyValuePart\":11,\"./Selector\":13,\"./SelectorPart\":14,\"./SelectorSubPart\":15,\"./TokenStream\":17,\"./Tokens\":18,\"./Validation\":19}],7:[function(require,module,exports){\n\n\"use strict\";\n\nvar Properties = module.exports = {\n __proto__: null,\n \"align-items\" : \"flex-start | flex-end | center | baseline | stretch\",\n \"align-content\" : \"flex-start | flex-end | center | space-between | space-around | stretch\",\n \"align-self\" : \"auto | flex-start | flex-end | center | baseline | stretch\",\n \"all\" : \"initial | inherit | unset\",\n \"-webkit-align-items\" : \"flex-start | flex-end | center | baseline | stretch\",\n \"-webkit-align-content\" : \"flex-start | flex-end | center | space-between | space-around | stretch\",\n \"-webkit-align-self\" : \"auto | flex-start | flex-end | center | baseline | stretch\",\n \"alignment-adjust\" : \"auto | baseline | before-edge | text-before-edge | middle | central | after-edge | text-after-edge | ideographic | alphabetic | hanging | mathematical | | \",\n \"alignment-baseline\" : \"auto | baseline | use-script | before-edge | text-before-edge | after-edge | text-after-edge | central | middle | ideographic | alphabetic | hanging | mathematical\",\n \"animation\" : 1,\n \"animation-delay\" : \"#\",\n \"animation-direction\" : \"#\",\n \"animation-duration\" : \"#\",\n \"animation-fill-mode\" : \"[ none | forwards | backwards | both ]#\",\n \"animation-iteration-count\" : \"[ | infinite ]#\",\n \"animation-name\" : \"[ none | ]#\",\n \"animation-play-state\" : \"[ running | paused ]#\",\n \"animation-timing-function\" : 1,\n \"-moz-animation-delay\" : \"#\",\n \"-moz-animation-direction\" : \"[ normal | alternate ]#\",\n \"-moz-animation-duration\" : \"#\",\n \"-moz-animation-iteration-count\" : \"[ | infinite ]#\",\n \"-moz-animation-name\" : \"[ none | ]#\",\n \"-moz-animation-play-state\" : \"[ running | paused ]#\",\n\n \"-ms-animation-delay\" : \"#\",\n \"-ms-animation-direction\" : \"[ normal | alternate ]#\",\n \"-ms-animation-duration\" : \"#\",\n \"-ms-animation-iteration-count\" : \"[ | infinite ]#\",\n \"-ms-animation-name\" : \"[ none | ]#\",\n \"-ms-animation-play-state\" : \"[ running | paused ]#\",\n\n \"-webkit-animation-delay\" : \"#\",\n \"-webkit-animation-direction\" : \"[ normal | alternate ]#\",\n \"-webkit-animation-duration\" : \"#\",\n \"-webkit-animation-fill-mode\" : \"[ none | forwards | backwards | both ]#\",\n \"-webkit-animation-iteration-count\" : \"[ | infinite ]#\",\n \"-webkit-animation-name\" : \"[ none | ]#\",\n \"-webkit-animation-play-state\" : \"[ running | paused ]#\",\n\n \"-o-animation-delay\" : \"#\",\n \"-o-animation-direction\" : \"[ normal | alternate ]#\",\n \"-o-animation-duration\" : \"#\",\n \"-o-animation-iteration-count\" : \"[ | infinite ]#\",\n \"-o-animation-name\" : \"[ none | ]#\",\n \"-o-animation-play-state\" : \"[ running | paused ]#\",\n\n \"appearance\" : \"none | auto\",\n \"-moz-appearance\" : \"none | button | button-arrow-down | button-arrow-next | button-arrow-previous | button-arrow-up | button-bevel | button-focus | caret | checkbox | checkbox-container | checkbox-label | checkmenuitem | dualbutton | groupbox | listbox | listitem | menuarrow | menubar | menucheckbox | menuimage | menuitem | menuitemtext | menulist | menulist-button | menulist-text | menulist-textfield | menupopup | menuradio | menuseparator | meterbar | meterchunk | progressbar | progressbar-vertical | progresschunk | progresschunk-vertical | radio | radio-container | radio-label | radiomenuitem | range | range-thumb | resizer | resizerpanel | scale-horizontal | scalethumbend | scalethumb-horizontal | scalethumbstart | scalethumbtick | scalethumb-vertical | scale-vertical | scrollbarbutton-down | scrollbarbutton-left | scrollbarbutton-right | scrollbarbutton-up | scrollbarthumb-horizontal | scrollbarthumb-vertical | scrollbartrack-horizontal | scrollbartrack-vertical | searchfield | separator | sheet | spinner | spinner-downbutton | spinner-textfield | spinner-upbutton | splitter | statusbar | statusbarpanel | tab | tabpanel | tabpanels | tab-scroll-arrow-back | tab-scroll-arrow-forward | textfield | textfield-multiline | toolbar | toolbarbutton | toolbarbutton-dropdown | toolbargripper | toolbox | tooltip | treeheader | treeheadercell | treeheadersortarrow | treeitem | treeline | treetwisty | treetwistyopen | treeview | -moz-mac-unified-toolbar | -moz-win-borderless-glass | -moz-win-browsertabbar-toolbox | -moz-win-communicationstext | -moz-win-communications-toolbox | -moz-win-exclude-glass | -moz-win-glass | -moz-win-mediatext | -moz-win-media-toolbox | -moz-window-button-box | -moz-window-button-box-maximized | -moz-window-button-close | -moz-window-button-maximize | -moz-window-button-minimize | -moz-window-button-restore | -moz-window-frame-bottom | -moz-window-frame-left | -moz-window-frame-right | -moz-window-titlebar | -moz-window-titlebar-maximized\",\n \"-ms-appearance\" : \"none | icon | window | desktop | workspace | document | tooltip | dialog | button | push-button | hyperlink | radio | radio-button | checkbox | menu-item | tab | menu | menubar | pull-down-menu | pop-up-menu | list-menu | radio-group | checkbox-group | outline-tree | range | field | combo-box | signature | password | normal\",\n \"-webkit-appearance\" : \"none | button | button-bevel | caps-lock-indicator | caret | checkbox | default-button | listbox | listitem | media-fullscreen-button | media-mute-button | media-play-button | media-seek-back-button | media-seek-forward-button | media-slider | media-sliderthumb | menulist | menulist-button | menulist-text | menulist-textfield | push-button | radio | searchfield | searchfield-cancel-button | searchfield-decoration | searchfield-results-button | searchfield-results-decoration | slider-horizontal | slider-vertical | sliderthumb-horizontal | sliderthumb-vertical | square-button | textarea | textfield | scrollbarbutton-down | scrollbarbutton-left | scrollbarbutton-right | scrollbarbutton-up | scrollbargripper-horizontal | scrollbargripper-vertical | scrollbarthumb-horizontal | scrollbarthumb-vertical | scrollbartrack-horizontal | scrollbartrack-vertical\",\n \"-o-appearance\" : \"none | window | desktop | workspace | document | tooltip | dialog | button | push-button | hyperlink | radio | radio-button | checkbox | menu-item | tab | menu | menubar | pull-down-menu | pop-up-menu | list-menu | radio-group | checkbox-group | outline-tree | range | field | combo-box | signature | password | normal\",\n\n \"azimuth\" : \"\",\n \"backface-visibility\" : \"visible | hidden\",\n \"background\" : 1,\n \"background-attachment\" : \"#\",\n \"background-clip\" : \"#\",\n \"background-color\" : \"\",\n \"background-image\" : \"#\",\n \"background-origin\" : \"#\",\n \"background-position\" : \"\",\n \"background-repeat\" : \"#\",\n \"background-size\" : \"#\",\n \"baseline-shift\" : \"baseline | sub | super | | \",\n \"behavior\" : 1,\n \"binding\" : 1,\n \"bleed\" : \"\",\n \"bookmark-label\" : \" | | \",\n \"bookmark-level\" : \"none | \",\n \"bookmark-state\" : \"open | closed\",\n \"bookmark-target\" : \"none | | \",\n \"border\" : \" || || \",\n \"border-bottom\" : \" || || \",\n \"border-bottom-color\" : \"\",\n \"border-bottom-left-radius\" : \"\",\n \"border-bottom-right-radius\" : \"\",\n \"border-bottom-style\" : \"\",\n \"border-bottom-width\" : \"\",\n \"border-collapse\" : \"collapse | separate\",\n \"border-color\" : \"{1,4}\",\n \"border-image\" : 1,\n \"border-image-outset\" : \"[ | ]{1,4}\",\n \"border-image-repeat\" : \"[ stretch | repeat | round | space ]{1,2}\",\n \"border-image-slice\" : \"\",\n \"border-image-source\" : \" | none\",\n \"border-image-width\" : \"[ | | | auto ]{1,4}\",\n \"border-left\" : \" || || \",\n \"border-left-color\" : \"\",\n \"border-left-style\" : \"\",\n \"border-left-width\" : \"\",\n \"border-radius\" : \"\",\n \"border-right\" : \" || || \",\n \"border-right-color\" : \"\",\n \"border-right-style\" : \"\",\n \"border-right-width\" : \"\",\n \"border-spacing\" : \"{1,2}\",\n \"border-style\" : \"{1,4}\",\n \"border-top\" : \" || || \",\n \"border-top-color\" : \"\",\n \"border-top-left-radius\" : \"\",\n \"border-top-right-radius\" : \"\",\n \"border-top-style\" : \"\",\n \"border-top-width\" : \"\",\n \"border-width\" : \"{1,4}\",\n \"bottom\" : \"\",\n \"-moz-box-align\" : \"start | end | center | baseline | stretch\",\n \"-moz-box-decoration-break\" : \"slice | clone\",\n \"-moz-box-direction\" : \"normal | reverse\",\n \"-moz-box-flex\" : \"\",\n \"-moz-box-flex-group\" : \"\",\n \"-moz-box-lines\" : \"single | multiple\",\n \"-moz-box-ordinal-group\" : \"\",\n \"-moz-box-orient\" : \"horizontal | vertical | inline-axis | block-axis\",\n \"-moz-box-pack\" : \"start | end | center | justify\",\n \"-o-box-decoration-break\" : \"slice | clone\",\n \"-webkit-box-align\" : \"start | end | center | baseline | stretch\",\n \"-webkit-box-decoration-break\" : \"slice | clone\",\n \"-webkit-box-direction\" : \"normal | reverse\",\n \"-webkit-box-flex\" : \"\",\n \"-webkit-box-flex-group\" : \"\",\n \"-webkit-box-lines\" : \"single | multiple\",\n \"-webkit-box-ordinal-group\" : \"\",\n \"-webkit-box-orient\" : \"horizontal | vertical | inline-axis | block-axis\",\n \"-webkit-box-pack\" : \"start | end | center | justify\",\n \"box-decoration-break\" : \"slice | clone\",\n \"box-shadow\" : \"\",\n \"box-sizing\" : \"content-box | border-box\",\n \"break-after\" : \"auto | always | avoid | left | right | page | column | avoid-page | avoid-column\",\n \"break-before\" : \"auto | always | avoid | left | right | page | column | avoid-page | avoid-column\",\n \"break-inside\" : \"auto | avoid | avoid-page | avoid-column\",\n \"caption-side\" : \"top | bottom\",\n \"clear\" : \"none | right | left | both\",\n \"clip\" : \" | auto\",\n \"-webkit-clip-path\" : \" | | none\",\n \"clip-path\" : \" | | none\",\n \"clip-rule\" : \"nonzero | evenodd\",\n \"color\" : \"\",\n \"color-interpolation\" : \"auto | sRGB | linearRGB\",\n \"color-interpolation-filters\" : \"auto | sRGB | linearRGB\",\n \"color-profile\" : 1,\n \"color-rendering\" : \"auto | optimizeSpeed | optimizeQuality\",\n \"column-count\" : \" | auto\", // https ://www.w3.org/TR/css3-multicol/\n \"column-fill\" : \"auto | balance\",\n \"column-gap\" : \" | normal\",\n \"column-rule\" : \" || || \",\n \"column-rule-color\" : \"\",\n \"column-rule-style\" : \"\",\n \"column-rule-width\" : \"\",\n \"column-span\" : \"none | all\",\n \"column-width\" : \" | auto\",\n \"columns\" : 1,\n \"content\" : 1,\n \"counter-increment\" : 1,\n \"counter-reset\" : 1,\n \"crop\" : \" | auto\",\n \"cue\" : \"cue-after | cue-before\",\n \"cue-after\" : 1,\n \"cue-before\" : 1,\n \"cursor\" : 1,\n \"direction\" : \"ltr | rtl\",\n \"display\" : \"inline | block | list-item | inline-block | table | inline-table | table-row-group | table-header-group | table-footer-group | table-row | table-column-group | table-column | table-cell | table-caption | grid | inline-grid | run-in | ruby | ruby-base | ruby-text | ruby-base-container | ruby-text-container | contents | none | -moz-box | -moz-inline-block | -moz-inline-box | -moz-inline-grid | -moz-inline-stack | -moz-inline-table | -moz-grid | -moz-grid-group | -moz-grid-line | -moz-groupbox | -moz-deck | -moz-popup | -moz-stack | -moz-marker | -webkit-box | -webkit-inline-box | -ms-flexbox | -ms-inline-flexbox | flex | -webkit-flex | inline-flex | -webkit-inline-flex\",\n \"dominant-baseline\" : \"auto | use-script | no-change | reset-size | ideographic | alphabetic | hanging | mathematical | central | middle | text-after-edge | text-before-edge\",\n \"drop-initial-after-adjust\" : \"central | middle | after-edge | text-after-edge | ideographic | alphabetic | mathematical | | \",\n \"drop-initial-after-align\" : \"baseline | use-script | before-edge | text-before-edge | after-edge | text-after-edge | central | middle | ideographic | alphabetic | hanging | mathematical\",\n \"drop-initial-before-adjust\" : \"before-edge | text-before-edge | central | middle | hanging | mathematical | | \",\n \"drop-initial-before-align\" : \"caps-height | baseline | use-script | before-edge | text-before-edge | after-edge | text-after-edge | central | middle | ideographic | alphabetic | hanging | mathematical\",\n \"drop-initial-size\" : \"auto | line | | \",\n \"drop-initial-value\" : \"\",\n \"elevation\" : \" | below | level | above | higher | lower\",\n \"empty-cells\" : \"show | hide\",\n \"enable-background\" : 1,\n \"fill\" : \"\",\n \"fill-opacity\" : \"\",\n \"fill-rule\" : \"nonzero | evenodd\",\n \"filter\" : \" | none\",\n \"fit\" : \"fill | hidden | meet | slice\",\n \"fit-position\" : 1,\n \"flex\" : \"\",\n \"flex-basis\" : \"\",\n \"flex-direction\" : \"row | row-reverse | column | column-reverse\",\n \"flex-flow\" : \" || \",\n \"flex-grow\" : \"\",\n \"flex-shrink\" : \"\",\n \"flex-wrap\" : \"nowrap | wrap | wrap-reverse\",\n \"-webkit-flex\" : \"\",\n \"-webkit-flex-basis\" : \"\",\n \"-webkit-flex-direction\" : \"row | row-reverse | column | column-reverse\",\n \"-webkit-flex-flow\" : \" || \",\n \"-webkit-flex-grow\" : \"\",\n \"-webkit-flex-shrink\" : \"\",\n \"-webkit-flex-wrap\" : \"nowrap | wrap | wrap-reverse\",\n \"-ms-flex\" : \"\",\n \"-ms-flex-align\" : \"start | end | center | stretch | baseline\",\n \"-ms-flex-direction\" : \"row | row-reverse | column | column-reverse\",\n \"-ms-flex-order\" : \"\",\n \"-ms-flex-pack\" : \"start | end | center | justify | distribute\",\n \"-ms-flex-wrap\" : \"nowrap | wrap | wrap-reverse\",\n \"float\" : \"left | right | none\",\n \"float-offset\" : 1,\n \"flood-color\" : 1,\n \"flood-opacity\" : \"\",\n \"font\" : \" | caption | icon | menu | message-box | small-caption | status-bar\",\n \"font-family\" : \"\",\n \"font-feature-settings\" : \" | normal\",\n \"font-kerning\" : \"auto | normal | none\",\n \"font-size\" : \"\",\n \"font-size-adjust\" : \" | none\",\n \"font-stretch\" : \"\",\n \"font-style\" : \"\",\n \"font-variant\" : \" | normal | none\",\n \"font-variant-alternates\" : \" | normal\",\n \"font-variant-caps\" : \" | normal\",\n \"font-variant-east-asian\" : \" | normal\",\n \"font-variant-ligatures\" : \" | normal | none\",\n \"font-variant-numeric\" : \" | normal\",\n \"font-variant-position\" : \"normal | sub | super\",\n \"font-weight\" : \"\",\n \"gap\" : \"[ | ]{1,2}\",\n \"glyph-orientation-horizontal\" : \"\",\n \"glyph-orientation-vertical\" : \"auto | \",\n \"grid\" : 1,\n \"grid-area\" : 1,\n \"grid-auto-columns\" : 1,\n \"grid-auto-flow\" : 1,\n \"grid-auto-position\" : 1,\n \"grid-auto-rows\" : 1,\n \"grid-cell-stacking\" : \"columns | rows | layer\",\n \"grid-column\" : 1,\n \"grid-columns\" : 1,\n \"grid-column-align\" : \"start | end | center | stretch\",\n \"grid-column-sizing\" : 1,\n \"grid-column-start\" : 1,\n \"grid-column-end\" : 1,\n \"grid-column-span\" : \"\",\n \"grid-flow\" : \"none | rows | columns\",\n \"grid-gap\" : \"[ | ]{1,2}\",\n \"grid-layer\" : \"\",\n \"grid-row\" : 1,\n \"grid-rows\" : 1,\n \"grid-row-align\" : \"start | end | center | stretch\",\n \"grid-row-gap\" : 1,\n \"grid-row-start\" : 1,\n \"grid-row-end\" : 1,\n \"grid-row-span\" : \"\",\n \"grid-row-sizing\" : 1,\n \"grid-template\" : 1,\n \"grid-template-areas\" : 1,\n \"grid-template-columns\" : 1,\n \"grid-template-rows\" : 1,\n \"hanging-punctuation\" : 1,\n \"height\" : \" | \",\n \"hyphenate-after\" : \" | auto\",\n \"hyphenate-before\" : \" | auto\",\n \"hyphenate-character\" : \" | auto\",\n \"hyphenate-lines\" : \"no-limit | \",\n \"hyphenate-resource\" : 1,\n \"hyphens\" : \"none | manual | auto\",\n \"icon\" : 1,\n \"image-orientation\" : \"angle | auto\",\n \"image-rendering\" : \"auto | optimizeSpeed | optimizeQuality\",\n \"image-resolution\" : 1,\n \"ime-mode\" : \"auto | normal | active | inactive | disabled\",\n \"inline-box-align\" : \"last | \",\n \"justify-content\" : \"flex-start | flex-end | center | space-between | space-around | space-evenly | stretch\",\n \"-webkit-justify-content\" : \"flex-start | flex-end | center | space-between | space-around | space-evenly | stretch\",\n \"kerning\" : \"auto | \",\n \"left\" : \"\",\n \"letter-spacing\" : \" | normal\",\n \"line-height\" : \"\",\n \"line-break\" : \"auto | loose | normal | strict\",\n \"line-stacking\" : 1,\n \"line-stacking-ruby\" : \"exclude-ruby | include-ruby\",\n \"line-stacking-shift\" : \"consider-shifts | disregard-shifts\",\n \"line-stacking-strategy\" : \"inline-line-height | block-line-height | max-height | grid-height\",\n \"list-style\" : 1,\n \"list-style-image\" : \" | none\",\n \"list-style-position\" : \"inside | outside\",\n \"list-style-type\" : \"disc | circle | square | decimal | decimal-leading-zero | lower-roman | upper-roman | lower-greek | lower-latin | upper-latin | armenian | georgian | lower-alpha | upper-alpha | none\",\n \"margin\" : \"{1,4}\",\n \"margin-bottom\" : \"\",\n \"margin-left\" : \"\",\n \"margin-right\" : \"\",\n \"margin-top\" : \"\",\n \"mark\" : 1,\n \"mark-after\" : 1,\n \"mark-before\" : 1,\n \"marker\" : 1,\n \"marker-end\" : 1,\n \"marker-mid\" : 1,\n \"marker-start\" : 1,\n \"marks\" : 1,\n \"marquee-direction\" : 1,\n \"marquee-play-count\" : 1,\n \"marquee-speed\" : 1,\n \"marquee-style\" : 1,\n \"mask\" : 1,\n \"max-height\" : \" | | | none\",\n \"max-width\" : \" | | | none\",\n \"min-height\" : \" | | | contain-floats | -moz-contain-floats | -webkit-contain-floats\",\n \"min-width\" : \" | | | contain-floats | -moz-contain-floats | -webkit-contain-floats\",\n \"mix-blend-mode\" : \"\",\n \"move-to\" : 1,\n \"nav-down\" : 1,\n \"nav-index\" : 1,\n \"nav-left\" : 1,\n \"nav-right\" : 1,\n \"nav-up\" : 1,\n \"object-fit\" : \"fill | contain | cover | none | scale-down\",\n \"object-position\" : \"\",\n \"opacity\" : \"\",\n \"order\" : \"\",\n \"-webkit-order\" : \"\",\n \"orphans\" : \"\",\n \"outline\" : 1,\n \"outline-color\" : \" | invert\",\n \"outline-offset\" : 1,\n \"outline-style\" : \"\",\n \"outline-width\" : \"\",\n \"overflow\" : \"visible | hidden | scroll | auto\",\n \"overflow-style\" : 1,\n \"overflow-wrap\" : \"normal | break-word\",\n \"overflow-x\" : 1,\n \"overflow-y\" : 1,\n \"padding\" : \"{1,4}\",\n \"padding-bottom\" : \"\",\n \"padding-left\" : \"\",\n \"padding-right\" : \"\",\n \"padding-top\" : \"\",\n \"page\" : 1,\n \"page-break-after\" : \"auto | always | avoid | left | right\",\n \"page-break-before\" : \"auto | always | avoid | left | right\",\n \"page-break-inside\" : \"auto | avoid\",\n \"page-policy\" : 1,\n \"pause\" : 1,\n \"pause-after\" : 1,\n \"pause-before\" : 1,\n \"perspective\" : 1,\n \"perspective-origin\" : 1,\n \"phonemes\" : 1,\n \"pitch\" : 1,\n \"pitch-range\" : 1,\n \"play-during\" : 1,\n \"pointer-events\" : \"auto | none | visiblePainted | visibleFill | visibleStroke | visible | painted | fill | stroke | all\",\n \"position\" : \"static | relative | absolute | fixed | sticky | -webkit-sticky\",\n \"presentation-level\" : 1,\n \"punctuation-trim\" : 1,\n \"quotes\" : 1,\n \"rendering-intent\" : 1,\n \"resize\" : 1,\n \"rest\" : 1,\n \"rest-after\" : 1,\n \"rest-before\" : 1,\n \"richness\" : 1,\n \"right\" : \"\",\n \"rotation\" : 1,\n \"rotation-point\" : 1,\n \"ruby-align\" : 1,\n \"ruby-overhang\" : 1,\n \"ruby-position\" : 1,\n \"ruby-span\" : 1,\n \"shape-rendering\" : \"auto | optimizeSpeed | crispEdges | geometricPrecision\",\n \"size\" : 1,\n \"speak\" : \"normal | none | spell-out\",\n \"speak-header\" : \"once | always\",\n \"speak-numeral\" : \"digits | continuous\",\n \"speak-punctuation\" : \"code | none\",\n \"speech-rate\" : 1,\n \"src\" : 1,\n \"stop-color\" : 1,\n \"stop-opacity\" : \"\",\n \"stress\" : 1,\n \"string-set\" : 1,\n \"stroke\" : \"\",\n \"stroke-dasharray\" : \"none | \",\n \"stroke-dashoffset\" : \" | \",\n \"stroke-linecap\" : \"butt | round | square\",\n \"stroke-linejoin\" : \"miter | round | bevel\",\n \"stroke-miterlimit\" : \"\",\n \"stroke-opacity\" : \"\",\n \"stroke-width\" : \" | \",\n\n \"table-layout\" : \"auto | fixed\",\n \"tab-size\" : \" | \",\n \"target\" : 1,\n \"target-name\" : 1,\n \"target-new\" : 1,\n \"target-position\" : 1,\n \"text-align\" : \"left | right | center | justify | match-parent | start | end\",\n \"text-align-last\" : 1,\n \"text-anchor\" : \"start | middle | end\",\n \"text-decoration\" : \" || || \",\n \"text-decoration-color\" : \"\",\n \"text-decoration-line\" : \"\",\n \"text-decoration-style\" : \"\",\n \"text-decoration-skip\" : \"none | [ objects || spaces || ink || edges || box-decoration ]\",\n \"-webkit-text-decoration-skip\" : \"none | [ objects || spaces || ink || edges || box-decoration ]\",\n \"text-underline-position\" : \"auto | [ under || [ left | right ] ]\",\n \"text-emphasis\" : 1,\n \"text-height\" : 1,\n \"text-indent\" : \" | \",\n \"text-justify\" : \"auto | none | inter-word | inter-ideograph | inter-cluster | distribute | kashida\",\n \"text-outline\" : 1,\n \"text-overflow\" : 1,\n \"text-rendering\" : \"auto | optimizeSpeed | optimizeLegibility | geometricPrecision\",\n \"text-shadow\" : 1,\n \"text-transform\" : \"capitalize | uppercase | lowercase | none\",\n \"text-wrap\" : \"normal | none | avoid\",\n \"top\" : \"\",\n \"-ms-touch-action\" : \"auto | none | pan-x | pan-y | pan-left | pan-right | pan-up | pan-down | manipulation\",\n \"touch-action\" : \"auto | none | pan-x | pan-y | pan-left | pan-right | pan-up | pan-down | manipulation\",\n \"transform\" : 1,\n \"transform-origin\" : 1,\n \"transform-style\" : 1,\n \"transition\" : 1,\n \"transition-delay\" : 1,\n \"transition-duration\" : 1,\n \"transition-property\" : 1,\n \"transition-timing-function\" : 1,\n \"unicode-bidi\" : \"normal | embed | isolate | bidi-override | isolate-override | plaintext\",\n \"user-modify\" : \"read-only | read-write | write-only\",\n \"user-select\" : \"auto | text | none | contain | all\",\n \"vertical-align\" : \"auto | use-script | baseline | sub | super | top | text-top | central | middle | bottom | text-bottom | | \",\n \"visibility\" : \"visible | hidden | collapse\",\n \"voice-balance\" : 1,\n \"voice-duration\" : 1,\n \"voice-family\" : 1,\n \"voice-pitch\" : 1,\n \"voice-pitch-range\" : 1,\n \"voice-rate\" : 1,\n \"voice-stress\" : 1,\n \"voice-volume\" : 1,\n \"volume\" : 1,\n \"white-space\" : \"normal | pre | nowrap | pre-wrap | pre-line | -pre-wrap | -o-pre-wrap | -moz-pre-wrap | -hp-pre-wrap\", // https ://perishablepress.com/wrapping-content/\n \"white-space-collapse\" : 1,\n \"widows\" : \"\",\n \"width\" : \" | | | auto\",\n \"will-change\" : \"\",\n \"word-break\" : \"normal | keep-all | break-all | break-word\",\n \"word-spacing\" : \" | normal\",\n \"word-wrap\" : \"normal | break-word\",\n \"writing-mode\" : \"horizontal-tb | vertical-rl | vertical-lr | lr-tb | rl-tb | tb-rl | bt-rl | tb-lr | bt-lr | lr-bt | rl-bt | lr | rl | tb\",\n \"z-index\" : \" | auto\",\n \"zoom\" : \" | | normal\"\n};\n\n},{}],8:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = PropertyName;\n\nvar SyntaxUnit = require(\"../util/SyntaxUnit\");\n\nvar Parser = require(\"./Parser\");\nfunction PropertyName(text, hack, line, col) {\n\n SyntaxUnit.call(this, text, line, col, Parser.PROPERTY_NAME_TYPE);\n this.hack = hack;\n\n}\n\nPropertyName.prototype = new SyntaxUnit();\nPropertyName.prototype.constructor = PropertyName;\nPropertyName.prototype.toString = function() {\n return (this.hack ? this.hack : \"\") + this.text;\n};\n\n},{\"../util/SyntaxUnit\":26,\"./Parser\":6}],9:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = PropertyValue;\n\nvar SyntaxUnit = require(\"../util/SyntaxUnit\");\n\nvar Parser = require(\"./Parser\");\nfunction PropertyValue(parts, line, col) {\n\n SyntaxUnit.call(this, parts.join(\" \"), line, col, Parser.PROPERTY_VALUE_TYPE);\n this.parts = parts;\n\n}\n\nPropertyValue.prototype = new SyntaxUnit();\nPropertyValue.prototype.constructor = PropertyValue;\n\n\n},{\"../util/SyntaxUnit\":26,\"./Parser\":6}],10:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = PropertyValueIterator;\nfunction PropertyValueIterator(value) {\n this._i = 0;\n this._parts = value.parts;\n this._marks = [];\n this.value = value;\n\n}\nPropertyValueIterator.prototype.count = function() {\n return this._parts.length;\n};\nPropertyValueIterator.prototype.isFirst = function() {\n return this._i === 0;\n};\nPropertyValueIterator.prototype.hasNext = function() {\n return this._i < this._parts.length;\n};\nPropertyValueIterator.prototype.mark = function() {\n this._marks.push(this._i);\n};\nPropertyValueIterator.prototype.peek = function(count) {\n return this.hasNext() ? this._parts[this._i + (count || 0)] : null;\n};\nPropertyValueIterator.prototype.next = function() {\n return this.hasNext() ? this._parts[this._i++] : null;\n};\nPropertyValueIterator.prototype.previous = function() {\n return this._i > 0 ? this._parts[--this._i] : null;\n};\nPropertyValueIterator.prototype.restore = function() {\n if (this._marks.length) {\n this._i = this._marks.pop();\n }\n};\nPropertyValueIterator.prototype.drop = function() {\n this._marks.pop();\n};\n\n},{}],11:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = PropertyValuePart;\n\nvar SyntaxUnit = require(\"../util/SyntaxUnit\");\n\nvar Colors = require(\"./Colors\");\nvar Parser = require(\"./Parser\");\nvar Tokens = require(\"./Tokens\");\nfunction PropertyValuePart(text, line, col, optionalHint) {\n var hint = optionalHint || {};\n\n SyntaxUnit.call(this, text, line, col, Parser.PROPERTY_VALUE_PART_TYPE);\n this.type = \"unknown\";\n\n var temp;\n if (/^([+-]?[\\d.]+)([a-z]+)$/i.test(text)) { // dimension\n this.type = \"dimension\";\n this.value = Number(RegExp.$1);\n this.units = RegExp.$2;\n switch (this.units.toLowerCase()) {\n\n case \"em\":\n case \"rem\":\n case \"ex\":\n case \"px\":\n case \"cm\":\n case \"mm\":\n case \"in\":\n case \"pt\":\n case \"pc\":\n case \"ch\":\n case \"vh\":\n case \"vw\":\n case \"vmax\":\n case \"vmin\":\n this.type = \"length\";\n break;\n\n case \"fr\":\n this.type = \"grid\";\n break;\n\n case \"deg\":\n case \"rad\":\n case \"grad\":\n case \"turn\":\n this.type = \"angle\";\n break;\n\n case \"ms\":\n case \"s\":\n this.type = \"time\";\n break;\n\n case \"hz\":\n case \"khz\":\n this.type = \"frequency\";\n break;\n\n case \"dpi\":\n case \"dpcm\":\n this.type = \"resolution\";\n break;\n\n }\n\n } else if (/^([+-]?[\\d.]+)%$/i.test(text)) { // percentage\n this.type = \"percentage\";\n this.value = Number(RegExp.$1);\n } else if (/^([+-]?\\d+)$/i.test(text)) { // integer\n this.type = \"integer\";\n this.value = Number(RegExp.$1);\n } else if (/^([+-]?[\\d.]+)$/i.test(text)) { // number\n this.type = \"number\";\n this.value = Number(RegExp.$1);\n\n } else if (/^#([a-f0-9]{3,6})/i.test(text)) { // hexcolor\n this.type = \"color\";\n temp = RegExp.$1;\n if (temp.length === 3) {\n this.red = parseInt(temp.charAt(0) + temp.charAt(0), 16);\n this.green = parseInt(temp.charAt(1) + temp.charAt(1), 16);\n this.blue = parseInt(temp.charAt(2) + temp.charAt(2), 16);\n } else {\n this.red = parseInt(temp.substring(0, 2), 16);\n this.green = parseInt(temp.substring(2, 4), 16);\n this.blue = parseInt(temp.substring(4, 6), 16);\n }\n } else if (/^rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/i.test(text)) { // rgb() color with absolute numbers\n this.type = \"color\";\n this.red = Number(RegExp.$1);\n this.green = Number(RegExp.$2);\n this.blue = Number(RegExp.$3);\n } else if (/^rgb\\(\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*\\)/i.test(text)) { // rgb() color with percentages\n this.type = \"color\";\n this.red = Number(RegExp.$1) * 255 / 100;\n this.green = Number(RegExp.$2) * 255 / 100;\n this.blue = Number(RegExp.$3) * 255 / 100;\n } else if (/^rgba\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*([\\d.]+)\\s*\\)/i.test(text)) { // rgba() color with absolute numbers\n this.type = \"color\";\n this.red = Number(RegExp.$1);\n this.green = Number(RegExp.$2);\n this.blue = Number(RegExp.$3);\n this.alpha = Number(RegExp.$4);\n } else if (/^rgba\\(\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*,\\s*([\\d.]+)\\s*\\)/i.test(text)) { // rgba() color with percentages\n this.type = \"color\";\n this.red = Number(RegExp.$1) * 255 / 100;\n this.green = Number(RegExp.$2) * 255 / 100;\n this.blue = Number(RegExp.$3) * 255 / 100;\n this.alpha = Number(RegExp.$4);\n } else if (/^hsl\\(\\s*(\\d+)\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*\\)/i.test(text)) { // hsl()\n this.type = \"color\";\n this.hue = Number(RegExp.$1);\n this.saturation = Number(RegExp.$2) / 100;\n this.lightness = Number(RegExp.$3) / 100;\n } else if (/^hsla\\(\\s*(\\d+)\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*,\\s*([\\d.]+)\\s*\\)/i.test(text)) { // hsla() color with percentages\n this.type = \"color\";\n this.hue = Number(RegExp.$1);\n this.saturation = Number(RegExp.$2) / 100;\n this.lightness = Number(RegExp.$3) / 100;\n this.alpha = Number(RegExp.$4);\n } else if (/^url\\((\"([^\\\\\"]|\\.)*\")\\)/i.test(text)) { // URI\n this.type = \"uri\";\n this.uri = PropertyValuePart.parseString(RegExp.$1);\n } else if (/^([^(]+)\\(/i.test(text)) {\n this.type = \"function\";\n this.name = RegExp.$1;\n this.value = text;\n } else if (/^\"([^\\n\\r\\f\\\\\"]|\\\\\\r\\n|\\\\[^\\r0-9a-f]|\\\\[0-9a-f]{1,6}(\\r\\n|[ \\n\\r\\t\\f])?)*\"/i.test(text)) { // double-quoted string\n this.type = \"string\";\n this.value = PropertyValuePart.parseString(text);\n } else if (/^'([^\\n\\r\\f\\\\']|\\\\\\r\\n|\\\\[^\\r0-9a-f]|\\\\[0-9a-f]{1,6}(\\r\\n|[ \\n\\r\\t\\f])?)*'/i.test(text)) { // single-quoted string\n this.type = \"string\";\n this.value = PropertyValuePart.parseString(text);\n } else if (Colors[text.toLowerCase()]) { // named color\n this.type = \"color\";\n temp = Colors[text.toLowerCase()].substring(1);\n this.red = parseInt(temp.substring(0, 2), 16);\n this.green = parseInt(temp.substring(2, 4), 16);\n this.blue = parseInt(temp.substring(4, 6), 16);\n } else if (/^[,/]$/.test(text)) {\n this.type = \"operator\";\n this.value = text;\n } else if (/^-?[a-z_\\u00A0-\\uFFFF][a-z0-9\\-_\\u00A0-\\uFFFF]*$/i.test(text)) {\n this.type = \"identifier\";\n this.value = text;\n }\n this.wasIdent = Boolean(hint.ident);\n\n}\n\nPropertyValuePart.prototype = new SyntaxUnit();\nPropertyValuePart.prototype.constructor = PropertyValuePart;\nPropertyValuePart.parseString = function(str) {\n str = str.slice(1, -1); // Strip surrounding single/double quotes\n var replacer = function(match, esc) {\n if (/^(\\n|\\r\\n|\\r|\\f)$/.test(esc)) {\n return \"\";\n }\n var m = /^[0-9a-f]{1,6}/i.exec(esc);\n if (m) {\n var codePoint = parseInt(m[0], 16);\n if (String.fromCodePoint) {\n return String.fromCodePoint(codePoint);\n } else {\n return String.fromCharCode(codePoint);\n }\n }\n return esc;\n };\n return str.replace(/\\\\(\\r\\n|[^\\r0-9a-f]|[0-9a-f]{1,6}(\\r\\n|[ \\n\\r\\t\\f])?)/ig,\n replacer);\n};\nPropertyValuePart.serializeString = function(value) {\n var replacer = function(match, c) {\n if (c === \"\\\"\") {\n return \"\\\\\" + c;\n }\n var cp = String.codePointAt ? String.codePointAt(0) :\n String.charCodeAt(0);\n return \"\\\\\" + cp.toString(16) + \" \";\n };\n return \"\\\"\" + value.replace(/[\"\\r\\n\\f]/g, replacer) + \"\\\"\";\n};\nPropertyValuePart.fromToken = function(token) {\n var part = new PropertyValuePart(token.value, token.startLine, token.startCol, {\n ident: token.type === Tokens.IDENT\n });\n return part;\n};\n\n},{\"../util/SyntaxUnit\":26,\"./Colors\":1,\"./Parser\":6,\"./Tokens\":18}],12:[function(require,module,exports){\n\"use strict\";\n\nvar Pseudos = module.exports = {\n __proto__: null,\n \":first-letter\": 1,\n \":first-line\": 1,\n \":before\": 1,\n \":after\": 1\n};\n\nPseudos.ELEMENT = 1;\nPseudos.CLASS = 2;\n\nPseudos.isElement = function(pseudo) {\n return pseudo.indexOf(\"::\") === 0 || Pseudos[pseudo.toLowerCase()] === Pseudos.ELEMENT;\n};\n\n},{}],13:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = Selector;\n\nvar SyntaxUnit = require(\"../util/SyntaxUnit\");\n\nvar Parser = require(\"./Parser\");\nvar Specificity = require(\"./Specificity\");\nfunction Selector(parts, line, col) {\n\n SyntaxUnit.call(this, parts.join(\" \"), line, col, Parser.SELECTOR_TYPE);\n this.parts = parts;\n this.specificity = Specificity.calculate(this);\n\n}\n\nSelector.prototype = new SyntaxUnit();\nSelector.prototype.constructor = Selector;\n\n\n},{\"../util/SyntaxUnit\":26,\"./Parser\":6,\"./Specificity\":16}],14:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = SelectorPart;\n\nvar SyntaxUnit = require(\"../util/SyntaxUnit\");\n\nvar Parser = require(\"./Parser\");\nfunction SelectorPart(elementName, modifiers, text, line, col) {\n\n SyntaxUnit.call(this, text, line, col, Parser.SELECTOR_PART_TYPE);\n this.elementName = elementName;\n this.modifiers = modifiers;\n\n}\n\nSelectorPart.prototype = new SyntaxUnit();\nSelectorPart.prototype.constructor = SelectorPart;\n\n\n},{\"../util/SyntaxUnit\":26,\"./Parser\":6}],15:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = SelectorSubPart;\n\nvar SyntaxUnit = require(\"../util/SyntaxUnit\");\n\nvar Parser = require(\"./Parser\");\nfunction SelectorSubPart(text, type, line, col) {\n\n SyntaxUnit.call(this, text, line, col, Parser.SELECTOR_SUB_PART_TYPE);\n this.type = type;\n this.args = [];\n\n}\n\nSelectorSubPart.prototype = new SyntaxUnit();\nSelectorSubPart.prototype.constructor = SelectorSubPart;\n\n\n},{\"../util/SyntaxUnit\":26,\"./Parser\":6}],16:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = Specificity;\n\nvar Pseudos = require(\"./Pseudos\");\nvar SelectorPart = require(\"./SelectorPart\");\nfunction Specificity(a, b, c, d) {\n this.a = a;\n this.b = b;\n this.c = c;\n this.d = d;\n}\n\nSpecificity.prototype = {\n constructor: Specificity,\n compare: function(other) {\n var comps = [\"a\", \"b\", \"c\", \"d\"],\n i, len;\n\n for (i = 0, len = comps.length; i < len; i++) {\n if (this[comps[i]] < other[comps[i]]) {\n return -1;\n } else if (this[comps[i]] > other[comps[i]]) {\n return 1;\n }\n }\n\n return 0;\n },\n valueOf: function() {\n return (this.a * 1000) + (this.b * 100) + (this.c * 10) + this.d;\n },\n toString: function() {\n return this.a + \",\" + this.b + \",\" + this.c + \",\" + this.d;\n }\n\n};\nSpecificity.calculate = function(selector) {\n\n var i,\n len,\n part,\n b = 0,\n c = 0,\n d = 0;\n\n function updateValues(part) {\n\n var i, j, len, num,\n elementName = part.elementName ? part.elementName.text : \"\",\n modifier;\n\n if (elementName && elementName.charAt(elementName.length - 1) !== \"*\") {\n d++;\n }\n\n for (i = 0, len = part.modifiers.length; i < len; i++) {\n modifier = part.modifiers[i];\n switch (modifier.type) {\n case \"class\":\n case \"attribute\":\n c++;\n break;\n\n case \"id\":\n b++;\n break;\n\n case \"pseudo\":\n if (Pseudos.isElement(modifier.text)) {\n d++;\n } else {\n c++;\n }\n break;\n\n case \"not\":\n for (j = 0, num = modifier.args.length; j < num; j++) {\n updateValues(modifier.args[j]);\n }\n }\n }\n }\n\n for (i = 0, len = selector.parts.length; i < len; i++) {\n part = selector.parts[i];\n\n if (part instanceof SelectorPart) {\n updateValues(part);\n }\n }\n\n return new Specificity(0, b, c, d);\n};\n\n},{\"./Pseudos\":12,\"./SelectorPart\":14}],17:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = TokenStream;\n\nvar TokenStreamBase = require(\"../util/TokenStreamBase\");\n\nvar PropertyValuePart = require(\"./PropertyValuePart\");\nvar Tokens = require(\"./Tokens\");\n\nvar h = /^[0-9a-fA-F]$/,\n nonascii = /^[\\u00A0-\\uFFFF]$/,\n nl = /\\n|\\r\\n|\\r|\\f/,\n whitespace = /\\u0009|\\u000a|\\u000c|\\u000d|\\u0020/;\n\n\nfunction isHexDigit(c) {\n return c != null && h.test(c);\n}\n\nfunction isDigit(c) {\n return c != null && /\\d/.test(c);\n}\n\nfunction isWhitespace(c) {\n return c != null && whitespace.test(c);\n}\n\nfunction isNewLine(c) {\n return c != null && nl.test(c);\n}\n\nfunction isNameStart(c) {\n return c != null && /[a-z_\\u00A0-\\uFFFF\\\\]/i.test(c);\n}\n\nfunction isNameChar(c) {\n return c != null && (isNameStart(c) || /[0-9\\-\\\\]/.test(c));\n}\n\nfunction isIdentStart(c) {\n return c != null && (isNameStart(c) || /-\\\\/.test(c));\n}\n\nfunction mix(receiver, supplier) {\n for (var prop in supplier) {\n if (Object.prototype.hasOwnProperty.call(supplier, prop)) {\n receiver[prop] = supplier[prop];\n }\n }\n return receiver;\n}\n\nfunction wouldStartIdent(twoCodePoints) {\n return typeof twoCodePoints === \"string\" &&\n (twoCodePoints[0] === \"-\" && isNameStart(twoCodePoints[1]) || isNameStart(twoCodePoints[0]));\n}\n\nfunction wouldStartUnsignedNumber(twoCodePoints) {\n return typeof twoCodePoints === \"string\" &&\n (isDigit(twoCodePoints[0]) || (twoCodePoints[0] === \".\" && isDigit(twoCodePoints[1])));\n}\nfunction TokenStream(input) {\n TokenStreamBase.call(this, input, Tokens);\n}\n\nTokenStream.prototype = mix(new TokenStreamBase(), {\n _getToken: function() {\n\n var c,\n reader = this._reader,\n token = null,\n startLine = reader.getLine(),\n startCol = reader.getCol();\n\n c = reader.read();\n\n while (c) {\n switch (c) {\n case \"/\":\n\n if (reader.peek() === \"*\") {\n token = this.commentToken(c, startLine, startCol);\n } else {\n token = this.charToken(c, startLine, startCol);\n }\n break;\n case \"|\":\n case \"~\":\n case \"^\":\n case \"$\":\n case \"*\":\n if (reader.peek() === \"=\") {\n token = this.comparisonToken(c, startLine, startCol);\n } else {\n token = this.charToken(c, startLine, startCol);\n }\n break;\n case \"\\\"\":\n case \"'\":\n token = this.stringToken(c, startLine, startCol);\n break;\n case \"#\":\n if (isNameChar(reader.peek())) {\n token = this.hashToken(c, startLine, startCol);\n } else {\n token = this.charToken(c, startLine, startCol);\n }\n break;\n case \".\":\n if (isDigit(reader.peek())) {\n token = this.numberToken(c, startLine, startCol);\n } else {\n token = this.charToken(c, startLine, startCol);\n }\n break;\n case \"-\":\n if (wouldStartUnsignedNumber(reader.peekCount(2))) {\n token = this.numberToken(c, startLine, startCol);\n break;\n } else if (reader.peekCount(2) === \"->\") {\n token = this.htmlCommentEndToken(c, startLine, startCol);\n } else {\n token = this._getDefaultToken(c, startLine, startCol);\n }\n break;\n case \"+\":\n if (wouldStartUnsignedNumber(reader.peekCount(2))) {\n token = this.numberToken(c, startLine, startCol);\n } else {\n token = this.charToken(c, startLine, startCol);\n }\n break;\n case \"!\":\n token = this.importantToken(c, startLine, startCol);\n break;\n case \"@\":\n token = this.atRuleToken(c, startLine, startCol);\n break;\n case \":\":\n token = this.notToken(c, startLine, startCol);\n break;\n case \"<\":\n token = this.htmlCommentStartToken(c, startLine, startCol);\n break;\n case \"\\\\\":\n if (/[^\\r\\n\\f]/.test(reader.peek())) {\n token = this.identOrFunctionToken(this.readEscape(c, true), startLine, startCol);\n } else {\n token = this.charToken(c, startLine, startCol);\n }\n break;\n case \"U\":\n case \"u\":\n if (reader.peek() === \"+\") {\n token = this.unicodeRangeToken(c, startLine, startCol);\n } else {\n token = this._getDefaultToken(c, startLine, startCol);\n }\n break;\n\n default:\n token = this._getDefaultToken(c, startLine, startCol);\n\n }\n break;\n }\n\n if (!token && c === null) {\n token = this.createToken(Tokens.EOF, null, startLine, startCol);\n }\n\n return token;\n },\n _getDefaultToken: function(c, startLine, startCol) {\n var reader = this._reader,\n token = null;\n\n if (isDigit(c)) {\n token = this.numberToken(c, startLine, startCol);\n } else\n if (isWhitespace(c)) {\n token = this.whitespaceToken(c, startLine, startCol);\n } else\n if (wouldStartIdent(c + reader.peekCount(1))) {\n token = this.identOrFunctionToken(c, startLine, startCol);\n } else {\n token = this.charToken(c, startLine, startCol);\n }\n\n return token;\n },\n createToken: function(tt, value, startLine, startCol, options) {\n var reader = this._reader;\n options = options || {};\n\n return {\n value: value,\n type: tt,\n channel: options.channel,\n endChar: options.endChar,\n hide: options.hide || false,\n startLine: startLine,\n startCol: startCol,\n endLine: reader.getLine(),\n endCol: reader.getCol()\n };\n },\n atRuleToken: function(first, startLine, startCol) {\n var rule = first,\n reader = this._reader,\n tt = Tokens.CHAR,\n ident;\n reader.mark();\n ident = this.readName();\n rule = first + ident;\n tt = Tokens.type(rule.toLowerCase());\n if (tt === Tokens.CHAR || tt === Tokens.UNKNOWN) {\n if (rule.length > 1) {\n tt = Tokens.UNKNOWN_SYM;\n } else {\n tt = Tokens.CHAR;\n rule = first;\n reader.reset();\n }\n }\n\n return this.createToken(tt, rule, startLine, startCol);\n },\n charToken: function(c, startLine, startCol) {\n var tt = Tokens.type(c);\n var opts = {};\n\n if (tt === -1) {\n tt = Tokens.CHAR;\n } else {\n opts.endChar = Tokens[tt].endChar;\n }\n\n return this.createToken(tt, c, startLine, startCol, opts);\n },\n commentToken: function(first, startLine, startCol) {\n var comment = this.readComment(first);\n\n return this.createToken(Tokens.COMMENT, comment, startLine, startCol);\n },\n comparisonToken: function(c, startLine, startCol) {\n var reader = this._reader,\n comparison = c + reader.read(),\n tt = Tokens.type(comparison) || Tokens.CHAR;\n\n return this.createToken(tt, comparison, startLine, startCol);\n },\n hashToken: function(first, startLine, startCol) {\n var name = this.readName(first);\n\n return this.createToken(Tokens.HASH, name, startLine, startCol);\n },\n htmlCommentStartToken: function(first, startLine, startCol) {\n var reader = this._reader,\n text = first;\n\n reader.mark();\n text += reader.readCount(3);\n\n if (text === \"\") {\n return this.createToken(Tokens.CDC, text, startLine, startCol);\n } else {\n reader.reset();\n return this.charToken(first, startLine, startCol);\n }\n },\n identOrFunctionToken: function(first, startLine, startCol) {\n var reader = this._reader,\n ident = this.readName(first),\n tt = Tokens.IDENT,\n uriFns = [\"url(\", \"url-prefix(\", \"domain(\"],\n uri;\n if (reader.peek() === \"(\") {\n ident += reader.read();\n if (uriFns.indexOf(ident.toLowerCase()) > -1) {\n reader.mark();\n uri = this.readURI(ident);\n if (uri === null) {\n reader.reset();\n tt = Tokens.FUNCTION;\n } else {\n tt = Tokens.URI;\n ident = uri;\n }\n } else {\n tt = Tokens.FUNCTION;\n }\n } else if (reader.peek() === \":\") { // might be an IE function\n if (ident.toLowerCase() === \"progid\") {\n ident += reader.readTo(\"(\");\n tt = Tokens.IE_FUNCTION;\n }\n }\n\n return this.createToken(tt, ident, startLine, startCol);\n },\n importantToken: function(first, startLine, startCol) {\n var reader = this._reader,\n important = first,\n tt = Tokens.CHAR,\n temp,\n c;\n\n reader.mark();\n c = reader.read();\n\n while (c) {\n if (c === \"/\") {\n if (reader.peek() !== \"*\") {\n break;\n } else {\n temp = this.readComment(c);\n if (temp === \"\") { // broken!\n break;\n }\n }\n } else if (isWhitespace(c)) {\n important += c + this.readWhitespace();\n } else if (/i/i.test(c)) {\n temp = reader.readCount(8);\n if (/mportant/i.test(temp)) {\n important += c + temp;\n tt = Tokens.IMPORTANT_SYM;\n\n }\n break; // we're done\n } else {\n break;\n }\n\n c = reader.read();\n }\n\n if (tt === Tokens.CHAR) {\n reader.reset();\n return this.charToken(first, startLine, startCol);\n } else {\n return this.createToken(tt, important, startLine, startCol);\n }\n\n\n },\n notToken: function(first, startLine, startCol) {\n var reader = this._reader,\n text = first;\n\n reader.mark();\n text += reader.readCount(4);\n\n if (text.toLowerCase() === \":not(\") {\n return this.createToken(Tokens.NOT, text, startLine, startCol);\n } else {\n reader.reset();\n return this.charToken(first, startLine, startCol);\n }\n },\n numberToken: function(first, startLine, startCol) {\n var reader = this._reader,\n value = this.readNumber(first),\n ident,\n tt = Tokens.NUMBER,\n c = reader.peek();\n\n if (isIdentStart(c)) {\n ident = this.readName(reader.read());\n value += ident;\n\n if (/^em$|^ex$|^px$|^gd$|^rem$|^vw$|^vh$|^fr$|^vmax$|^vmin$|^ch$|^cm$|^mm$|^in$|^pt$|^pc$/i.test(ident)) {\n tt = Tokens.LENGTH;\n } else if (/^deg|^rad$|^grad$|^turn$/i.test(ident)) {\n tt = Tokens.ANGLE;\n } else if (/^ms$|^s$/i.test(ident)) {\n tt = Tokens.TIME;\n } else if (/^hz$|^khz$/i.test(ident)) {\n tt = Tokens.FREQ;\n } else if (/^dpi$|^dpcm$/i.test(ident)) {\n tt = Tokens.RESOLUTION;\n } else {\n tt = Tokens.DIMENSION;\n }\n\n } else if (c === \"%\") {\n value += reader.read();\n tt = Tokens.PERCENTAGE;\n }\n\n return this.createToken(tt, value, startLine, startCol);\n },\n stringToken: function(first, startLine, startCol) {\n var delim = first,\n string = first,\n reader = this._reader,\n tt = Tokens.STRING,\n c = reader.read(),\n i;\n\n while (c) {\n string += c;\n\n if (c === \"\\\\\") {\n c = reader.read();\n if (c === null) {\n break; // premature EOF after backslash\n } else if (/[^\\r\\n\\f0-9a-f]/i.test(c)) {\n string += c;\n } else {\n for (i = 0; isHexDigit(c) && i < 6; i++) {\n string += c;\n c = reader.read();\n }\n if (c === \"\\r\" && reader.peek() === \"\\n\") {\n string += c;\n c = reader.read();\n }\n if (isWhitespace(c)) {\n string += c;\n } else {\n continue;\n }\n }\n } else if (c === delim) {\n break; // delimiter found.\n } else if (isNewLine(reader.peek())) {\n tt = Tokens.INVALID;\n break;\n }\n c = reader.read();\n }\n if (c === null) {\n tt = Tokens.INVALID;\n }\n\n return this.createToken(tt, string, startLine, startCol);\n },\n\n unicodeRangeToken: function(first, startLine, startCol) {\n var reader = this._reader,\n value = first,\n temp,\n tt = Tokens.CHAR;\n if (reader.peek() === \"+\") {\n reader.mark();\n value += reader.read();\n value += this.readUnicodeRangePart(true);\n if (value.length === 2) {\n reader.reset();\n } else {\n\n tt = Tokens.UNICODE_RANGE;\n if (value.indexOf(\"?\") === -1) {\n\n if (reader.peek() === \"-\") {\n reader.mark();\n temp = reader.read();\n temp += this.readUnicodeRangePart(false);\n if (temp.length === 1) {\n reader.reset();\n } else {\n value += temp;\n }\n }\n\n }\n }\n }\n\n return this.createToken(tt, value, startLine, startCol);\n },\n whitespaceToken: function(first, startLine, startCol) {\n var value = first + this.readWhitespace();\n return this.createToken(Tokens.S, value, startLine, startCol);\n },\n\n readUnicodeRangePart: function(allowQuestionMark) {\n var reader = this._reader,\n part = \"\",\n c = reader.peek();\n while (isHexDigit(c) && part.length < 6) {\n reader.read();\n part += c;\n c = reader.peek();\n }\n if (allowQuestionMark) {\n while (c === \"?\" && part.length < 6) {\n reader.read();\n part += c;\n c = reader.peek();\n }\n }\n\n return part;\n },\n\n readWhitespace: function() {\n var reader = this._reader,\n whitespace = \"\",\n c = reader.peek();\n\n while (isWhitespace(c)) {\n reader.read();\n whitespace += c;\n c = reader.peek();\n }\n\n return whitespace;\n },\n readNumber: function(first) {\n var reader = this._reader,\n number = first,\n hasDot = first === \".\",\n c = reader.peek();\n\n\n while (c) {\n if (isDigit(c)) {\n number += reader.read();\n } else if (c === \".\") {\n if (hasDot) {\n break;\n } else {\n hasDot = true;\n number += reader.read();\n }\n } else {\n break;\n }\n\n c = reader.peek();\n }\n\n return number;\n },\n readString: function() {\n var token = this.stringToken(this._reader.read(), 0, 0);\n return token.type === Tokens.INVALID ? null : token.value;\n },\n readURI: function(first) {\n var reader = this._reader,\n uri = first,\n inner = \"\",\n c = reader.peek();\n while (c && isWhitespace(c)) {\n reader.read();\n c = reader.peek();\n }\n if (c === \"'\" || c === \"\\\"\") {\n inner = this.readString();\n if (inner !== null) {\n inner = PropertyValuePart.parseString(inner);\n }\n } else {\n inner = this.readUnquotedURL();\n }\n\n c = reader.peek();\n while (c && isWhitespace(c)) {\n reader.read();\n c = reader.peek();\n }\n if (inner === null || c !== \")\") {\n uri = null;\n } else {\n uri += PropertyValuePart.serializeString(inner) + reader.read();\n }\n\n return uri;\n },\n readUnquotedURL: function(first) {\n var reader = this._reader,\n url = first || \"\",\n c;\n\n for (c = reader.peek(); c; c = reader.peek()) {\n if (nonascii.test(c) || /^[-!#$%&*-[\\]-~]$/.test(c)) {\n url += c;\n reader.read();\n } else if (c === \"\\\\\") {\n if (/^[^\\r\\n\\f]$/.test(reader.peek(2))) {\n url += this.readEscape(reader.read(), true);\n } else {\n break; // bad escape sequence.\n }\n } else {\n break; // bad character\n }\n }\n\n return url;\n },\n\n readName: function(first) {\n var reader = this._reader,\n ident = first || \"\",\n c;\n\n for (c = reader.peek(); c; c = reader.peek()) {\n if (c === \"\\\\\") {\n if (/^[^\\r\\n\\f]$/.test(reader.peek(2))) {\n ident += this.readEscape(reader.read(), true);\n } else {\n break;\n }\n } else if (isNameChar(c)) {\n ident += reader.read();\n } else {\n break;\n }\n }\n\n return ident;\n },\n\n readEscape: function(first, unescape) {\n var reader = this._reader,\n cssEscape = first || \"\",\n i = 0,\n c = reader.peek();\n\n if (isHexDigit(c)) {\n do {\n cssEscape += reader.read();\n c = reader.peek();\n } while (c && isHexDigit(c) && ++i < 6);\n }\n\n if (cssEscape.length === 1) {\n if (/^[^\\r\\n\\f0-9a-f]$/.test(c)) {\n reader.read();\n if (unescape) {\n return c;\n }\n } else {\n throw new Error(\"Bad escape sequence.\");\n }\n } else if (c === \"\\r\") {\n reader.read();\n if (reader.peek() === \"\\n\") {\n c += reader.read();\n }\n } else if (/^[ \\t\\n\\f]$/.test(c)) {\n reader.read();\n } else {\n c = \"\";\n }\n\n if (unescape) {\n var cp = parseInt(cssEscape.slice(first.length), 16);\n return String.fromCodePoint ? String.fromCodePoint(cp) :\n String.fromCharCode(cp);\n }\n return cssEscape + c;\n },\n\n readComment: function(first) {\n var reader = this._reader,\n comment = first || \"\",\n c = reader.read();\n\n if (c === \"*\") {\n while (c) {\n comment += c;\n if (comment.length > 2 && c === \"*\" && reader.peek() === \"/\") {\n comment += reader.read();\n break;\n }\n\n c = reader.read();\n }\n\n return comment;\n } else {\n return \"\";\n }\n\n }\n});\n\n},{\"../util/TokenStreamBase\":27,\"./PropertyValuePart\":11,\"./Tokens\":18}],18:[function(require,module,exports){\n\"use strict\";\n\nvar Tokens = module.exports = [\n { name: \"CDO\" },\n { name: \"CDC\" },\n { name: \"S\", whitespace: true/*, channel: \"ws\"*/ },\n { name: \"COMMENT\", comment: true, hide: true, channel: \"comment\" },\n { name: \"INCLUDES\", text: \"~=\" },\n { name: \"DASHMATCH\", text: \"|=\" },\n { name: \"PREFIXMATCH\", text: \"^=\" },\n { name: \"SUFFIXMATCH\", text: \"$=\" },\n { name: \"SUBSTRINGMATCH\", text: \"*=\" },\n { name: \"STRING\" },\n { name: \"IDENT\" },\n { name: \"HASH\" },\n { name: \"IMPORT_SYM\", text: \"@import\" },\n { name: \"PAGE_SYM\", text: \"@page\" },\n { name: \"MEDIA_SYM\", text: \"@media\" },\n { name: \"FONT_FACE_SYM\", text: \"@font-face\" },\n { name: \"CHARSET_SYM\", text: \"@charset\" },\n { name: \"NAMESPACE_SYM\", text: \"@namespace\" },\n { name: \"SUPPORTS_SYM\", text: \"@supports\" },\n { name: \"VIEWPORT_SYM\", text: [\"@viewport\", \"@-ms-viewport\", \"@-o-viewport\"] },\n { name: \"DOCUMENT_SYM\", text: [\"@document\", \"@-moz-document\"] },\n { name: \"UNKNOWN_SYM\" },\n { name: \"KEYFRAMES_SYM\", text: [ \"@keyframes\", \"@-webkit-keyframes\", \"@-moz-keyframes\", \"@-o-keyframes\" ] },\n { name: \"IMPORTANT_SYM\" },\n { name: \"LENGTH\" },\n { name: \"ANGLE\" },\n { name: \"TIME\" },\n { name: \"FREQ\" },\n { name: \"DIMENSION\" },\n { name: \"PERCENTAGE\" },\n { name: \"NUMBER\" },\n { name: \"URI\" },\n { name: \"FUNCTION\" },\n { name: \"UNICODE_RANGE\" },\n { name: \"INVALID\" },\n { name: \"PLUS\", text: \"+\" },\n { name: \"GREATER\", text: \">\" },\n { name: \"COMMA\", text: \",\" },\n { name: \"TILDE\", text: \"~\" },\n { name: \"NOT\" },\n { name: \"TOPLEFTCORNER_SYM\", text: \"@top-left-corner\" },\n { name: \"TOPLEFT_SYM\", text: \"@top-left\" },\n { name: \"TOPCENTER_SYM\", text: \"@top-center\" },\n { name: \"TOPRIGHT_SYM\", text: \"@top-right\" },\n { name: \"TOPRIGHTCORNER_SYM\", text: \"@top-right-corner\" },\n { name: \"BOTTOMLEFTCORNER_SYM\", text: \"@bottom-left-corner\" },\n { name: \"BOTTOMLEFT_SYM\", text: \"@bottom-left\" },\n { name: \"BOTTOMCENTER_SYM\", text: \"@bottom-center\" },\n { name: \"BOTTOMRIGHT_SYM\", text: \"@bottom-right\" },\n { name: \"BOTTOMRIGHTCORNER_SYM\", text: \"@bottom-right-corner\" },\n { name: \"LEFTTOP_SYM\", text: \"@left-top\" },\n { name: \"LEFTMIDDLE_SYM\", text: \"@left-middle\" },\n { name: \"LEFTBOTTOM_SYM\", text: \"@left-bottom\" },\n { name: \"RIGHTTOP_SYM\", text: \"@right-top\" },\n { name: \"RIGHTMIDDLE_SYM\", text: \"@right-middle\" },\n { name: \"RIGHTBOTTOM_SYM\", text: \"@right-bottom\" },\n { name: \"RESOLUTION\", state: \"media\" },\n { name: \"IE_FUNCTION\" },\n { name: \"CHAR\" },\n {\n name: \"PIPE\",\n text: \"|\"\n },\n {\n name: \"SLASH\",\n text: \"/\"\n },\n {\n name: \"MINUS\",\n text: \"-\"\n },\n {\n name: \"STAR\",\n text: \"*\"\n },\n\n {\n name: \"LBRACE\",\n endChar: \"}\",\n text: \"{\"\n },\n {\n name: \"RBRACE\",\n text: \"}\"\n },\n {\n name: \"LBRACKET\",\n endChar: \"]\",\n text: \"[\"\n },\n {\n name: \"RBRACKET\",\n text: \"]\"\n },\n {\n name: \"EQUALS\",\n text: \"=\"\n },\n {\n name: \"COLON\",\n text: \":\"\n },\n {\n name: \"SEMICOLON\",\n text: \";\"\n },\n {\n name: \"LPAREN\",\n endChar: \")\",\n text: \"(\"\n },\n {\n name: \"RPAREN\",\n text: \")\"\n },\n {\n name: \"DOT\",\n text: \".\"\n }\n];\n\n(function() {\n var nameMap = [],\n typeMap = Object.create(null);\n\n Tokens.UNKNOWN = -1;\n Tokens.unshift({ name:\"EOF\" });\n for (var i = 0, len = Tokens.length; i < len; i++) {\n nameMap.push(Tokens[i].name);\n Tokens[Tokens[i].name] = i;\n if (Tokens[i].text) {\n if (Tokens[i].text instanceof Array) {\n for (var j = 0; j < Tokens[i].text.length; j++) {\n typeMap[Tokens[i].text[j]] = i;\n }\n } else {\n typeMap[Tokens[i].text] = i;\n }\n }\n }\n\n Tokens.name = function(tt) {\n return nameMap[tt];\n };\n\n Tokens.type = function(c) {\n return typeMap[c] || -1;\n };\n})();\n\n},{}],19:[function(require,module,exports){\n\n\"use strict\";\n\nvar Matcher = require(\"./Matcher\");\nvar Properties = require(\"./Properties\");\nvar ValidationTypes = require(\"./ValidationTypes\");\nvar ValidationError = require(\"./ValidationError\");\nvar PropertyValueIterator = require(\"./PropertyValueIterator\");\n\nvar Validation = module.exports = {\n\n validate: function(property, value) {\n var name = property.toString().toLowerCase(),\n expression = new PropertyValueIterator(value),\n spec = Properties[name],\n part;\n\n if (!spec) {\n if (name.indexOf(\"-\") !== 0) { // vendor prefixed are ok\n throw new ValidationError(\"Unknown property '\" + property + \"'.\", property.line, property.col);\n }\n } else if (typeof spec !== \"number\") {\n if (ValidationTypes.isAny(expression, \"inherit | initial | unset\")) {\n if (expression.hasNext()) {\n part = expression.next();\n throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n }\n return;\n }\n this.singleProperty(spec, expression);\n\n }\n\n },\n\n singleProperty: function(types, expression) {\n\n var result = false,\n value = expression.value,\n part;\n\n result = Matcher.parse(types).match(expression);\n\n if (!result) {\n if (expression.hasNext() && !expression.isFirst()) {\n part = expression.peek();\n throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n } else {\n throw new ValidationError(\"Expected (\" + ValidationTypes.describe(types) + \") but found '\" + value + \"'.\", value.line, value.col);\n }\n } else if (expression.hasNext()) {\n part = expression.next();\n throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n }\n\n }\n\n};\n\n},{\"./Matcher\":3,\"./Properties\":7,\"./PropertyValueIterator\":10,\"./ValidationError\":20,\"./ValidationTypes\":21}],20:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = ValidationError;\nfunction ValidationError(message, line, col) {\n this.col = col;\n this.line = line;\n this.message = message;\n\n}\nValidationError.prototype = new Error();\n\n},{}],21:[function(require,module,exports){\n\"use strict\";\n\nvar ValidationTypes = module.exports;\n\nvar Matcher = require(\"./Matcher\");\n\nfunction copy(to, from) {\n Object.keys(from).forEach(function(prop) {\n to[prop] = from[prop];\n });\n}\ncopy(ValidationTypes, {\n\n isLiteral: function (part, literals) {\n var text = part.text.toString().toLowerCase(),\n args = literals.split(\" | \"),\n i,\n len,\n found = false;\n\n for (i = 0, len = args.length; i < len && !found; i++) {\n if (args[i].charAt(0) === \"<\") {\n found = this.simple[args[i]](part);\n } else if (args[i].slice(-2) === \"()\") {\n found = (part.type === \"function\" &&\n part.name === args[i].slice(0, -2));\n } else if (text === args[i].toLowerCase()) {\n found = true;\n }\n }\n\n return found;\n },\n\n isSimple: function(type) {\n return Boolean(this.simple[type]);\n },\n\n isComplex: function(type) {\n return Boolean(this.complex[type]);\n },\n\n describe: function(type) {\n if (this.complex[type] instanceof Matcher) {\n return this.complex[type].toString(0);\n }\n return type;\n },\n isAny: function (expression, types) {\n var args = types.split(\" | \"),\n i,\n len,\n found = false;\n\n for (i = 0, len = args.length; i < len && !found && expression.hasNext(); i++) {\n found = this.isType(expression, args[i]);\n }\n\n return found;\n },\n isAnyOfGroup: function(expression, types) {\n var args = types.split(\" || \"),\n i,\n len,\n found = false;\n\n for (i = 0, len = args.length; i < len && !found; i++) {\n found = this.isType(expression, args[i]);\n }\n\n return found ? args[i - 1] : false;\n },\n isType: function (expression, type) {\n var part = expression.peek(),\n result = false;\n\n if (type.charAt(0) !== \"<\") {\n result = this.isLiteral(part, type);\n if (result) {\n expression.next();\n }\n } else if (this.simple[type]) {\n result = this.simple[type](part);\n if (result) {\n expression.next();\n }\n } else if (this.complex[type] instanceof Matcher) {\n result = this.complex[type].match(expression);\n } else {\n result = this.complex[type](expression);\n }\n\n return result;\n },\n\n\n simple: {\n __proto__: null,\n\n \"\":\n \"xx-small | x-small | small | medium | large | x-large | xx-large\",\n\n \"\":\n \"scroll-position | contents | \",\n\n \"\": function(part) {\n return this[\"\"](part) &&\n !/^(unset|initial|inherit|will-change|auto|scroll-position|contents)$/i.test(part);\n },\n\n \"\": function(part) {\n return part.type === \"angle\";\n },\n\n \"\": \"scroll | fixed | local\",\n\n \"\": \"attr()\",\n \"\": \"inset() | circle() | ellipse() | polygon()\",\n\n \"\": \" | | none\",\n\n \"\":\n \"none | hidden | dotted | dashed | solid | double | groove | \" +\n \"ridge | inset | outset\",\n\n \"\": \" | thin | medium | thick\",\n\n \"\": \"padding-box | border-box | content-box\",\n\n \"\": \"