{"ScriptPreparationCode":"function _typeof(obj) { \u0022@babel/helpers - typeof\u0022; if (typeof Symbol === \u0022function\u0022 \u0026\u0026 typeof Symbol.iterator === \u0022symbol\u0022) { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj \u0026\u0026 typeof Symbol === \u0022function\u0022 \u0026\u0026 obj.constructor === Symbol \u0026\u0026 obj !== Symbol.prototype ? \u0022symbol\u0022 : typeof obj; }; } return _typeof(obj); }\r\n\r\nvar NodeType;\r\n\r\n(function (NodeType) {\r\n NodeType[NodeType[\u0022Document\u0022] = 0] = \u0022Document\u0022;\r\n NodeType[NodeType[\u0022DocumentType\u0022] = 1] = \u0022DocumentType\u0022;\r\n NodeType[NodeType[\u0022Element\u0022] = 2] = \u0022Element\u0022;\r\n NodeType[NodeType[\u0022Text\u0022] = 3] = \u0022Text\u0022;\r\n NodeType[NodeType[\u0022CDATA\u0022] = 4] = \u0022CDATA\u0022;\r\n NodeType[NodeType[\u0022Comment\u0022] = 5] = \u0022Comment\u0022;\r\n})(NodeType || (NodeType = {}));\r\n\r\nvar _id = 1;\r\nvar tagNameRegex = RegExp(\u0027[^a-z1-6-_]\u0027);\r\nvar IGNORED_NODE = -2;\r\n\r\nfunction genId() {\r\n return _id\u002B\u002B;\r\n}\r\n\r\nfunction getValidTagName(element) {\r\n if (element instanceof HTMLFormElement) {\r\n return \u0027form\u0027;\r\n }\r\n\r\n var processedTagName = element.tagName.toLowerCase().trim();\r\n\r\n if (tagNameRegex.test(processedTagName)) {\r\n return \u0027div\u0027;\r\n }\r\n\r\n return processedTagName;\r\n}\r\n\r\nfunction getCssRulesString(s) {\r\n try {\r\n var rules = s.rules || s.cssRules;\r\n return rules ? Array.from(rules).map(getCssRuleString).join(\u0027\u0027) : null;\r\n } catch (error) {\r\n return null;\r\n }\r\n}\r\n\r\nfunction getCssRuleString(rule) {\r\n return isCSSImportRule(rule) ? getCssRulesString(rule.styleSheet) || \u0027\u0027 : rule.cssText;\r\n}\r\n\r\nfunction isCSSImportRule(rule) {\r\n return \u0027styleSheet\u0027 in rule;\r\n}\r\n\r\nfunction extractOrigin(url) {\r\n var origin;\r\n\r\n if (url.indexOf(\u0027//\u0027) \u003E -1) {\r\n origin = url.split(\u0027/\u0027).slice(0, 3).join(\u0027/\u0027);\r\n } else {\r\n origin = url.split(\u0027/\u0027)[0];\r\n }\r\n\r\n origin = origin.split(\u0027?\u0027)[0];\r\n return origin;\r\n}\r\n\r\nvar URL_IN_CSS_REF = /url\\((?:(\u0027)([^\u0027]*)\u0027|(\u0022)([^\u0022]*)\u0022|([^)]*))\\)/gm;\r\nvar RELATIVE_PATH = /^(?!www\\.|(?:http|ftp)s?:\\/\\/|[A-Za-z]:\\\\|\\/\\/|#).*/;\r\nvar DATA_URI = /^(data:)([^,]*),(.*)/i;\r\n\r\nfunction absoluteToStylesheet(cssText, href) {\r\n return (cssText || \u0027\u0027).replace(URL_IN_CSS_REF, function (origin, quote1, path1, quote2, path2, path3) {\r\n var filePath = path1 || path2 || path3;\r\n var maybeQuote = quote1 || quote2 || \u0027\u0027;\r\n\r\n if (!filePath) {\r\n return origin;\r\n }\r\n\r\n if (!RELATIVE_PATH.test(filePath)) {\r\n return \u0022url(\u0022 \u002B maybeQuote \u002B filePath \u002B maybeQuote \u002B \u0022)\u0022;\r\n }\r\n\r\n if (DATA_URI.test(filePath)) {\r\n return \u0022url(\u0022 \u002B maybeQuote \u002B filePath \u002B maybeQuote \u002B \u0022)\u0022;\r\n }\r\n\r\n if (filePath[0] === \u0027/\u0027) {\r\n return \u0022url(\u0022 \u002B maybeQuote \u002B (extractOrigin(href) \u002B filePath) \u002B maybeQuote \u002B \u0022)\u0022;\r\n }\r\n\r\n var stack = href.split(\u0027/\u0027);\r\n var parts = filePath.split(\u0027/\u0027);\r\n stack.pop();\r\n\r\n for (var _i = 0, parts_1 = parts; _i \u003C parts_1.length; _i\u002B\u002B) {\r\n var part = parts_1[_i];\r\n\r\n if (part === \u0027.\u0027) {\r\n continue;\r\n } else if (part === \u0027..\u0027) {\r\n stack.pop();\r\n } else {\r\n stack.push(part);\r\n }\r\n }\r\n\r\n return \u0022url(\u0022 \u002B maybeQuote \u002B stack.join(\u0027/\u0027) \u002B maybeQuote \u002B \u0022)\u0022;\r\n });\r\n}\r\n\r\nfunction getAbsoluteSrcsetString(doc, attributeValue) {\r\n if (attributeValue.trim() === \u0027\u0027) {\r\n return attributeValue;\r\n }\r\n\r\n var srcsetValues = attributeValue.split(\u0027,\u0027);\r\n var resultingSrcsetString = srcsetValues.map(function (srcItem) {\r\n var trimmedSrcItem = srcItem.trimLeft().trimRight();\r\n var urlAndSize = trimmedSrcItem.split(\u0027 \u0027);\r\n\r\n if (urlAndSize.length === 2) {\r\n var absUrl = absoluteToDoc(doc, urlAndSize[0]);\r\n return absUrl \u002B \u0022 \u0022 \u002B urlAndSize[1];\r\n } else if (urlAndSize.length === 1) {\r\n var absUrl = absoluteToDoc(doc, urlAndSize[0]);\r\n return \u0022\u0022 \u002B absUrl;\r\n }\r\n\r\n return \u0027\u0027;\r\n }).join(\u0027, \u0027);\r\n return resultingSrcsetString;\r\n}\r\n\r\nfunction absoluteToDoc(doc, attributeValue) {\r\n if (!attributeValue || attributeValue.trim() === \u0027\u0027) {\r\n return attributeValue;\r\n }\r\n\r\n var a = doc.createElement(\u0027a\u0027);\r\n a.href = attributeValue;\r\n return a.href;\r\n}\r\n\r\nfunction isSVGElement(el) {\r\n return el.tagName === \u0027svg\u0027 || el instanceof SVGElement;\r\n}\r\n\r\nfunction transformAttribute(doc, name, value) {\r\n if (name === \u0027src\u0027 || (name === \u0027href\u0027 || name === \u0027xlink:href\u0027) \u0026\u0026 value) {\r\n return absoluteToDoc(doc, value);\r\n } else if (name === \u0027srcset\u0027 \u0026\u0026 value) {\r\n return getAbsoluteSrcsetString(doc, value);\r\n } else if (name === \u0027style\u0027 \u0026\u0026 value) {\r\n return absoluteToStylesheet(value, location.href);\r\n } else {\r\n return value;\r\n }\r\n}\r\n\r\nfunction _isBlockedElement(element, blockClass, blockSelector) {\r\n if (typeof blockClass === \u0027string\u0027) {\r\n if (element.classList.contains(blockClass)) {\r\n return true;\r\n }\r\n } else {\r\n element.classList.forEach(function (className) {\r\n if (blockClass.test(className)) {\r\n return true;\r\n }\r\n });\r\n }\r\n\r\n if (blockSelector) {\r\n return element.matches(blockSelector);\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction serializeNode(n, options) {\r\n var doc = options.doc,\r\n blockClass = options.blockClass,\r\n blockSelector = options.blockSelector,\r\n inlineStylesheet = options.inlineStylesheet,\r\n _a = options.maskInputOptions,\r\n maskInputOptions = _a === void 0 ? {} : _a,\r\n recordCanvas = options.recordCanvas;\r\n\r\n switch (n.nodeType) {\r\n case n.DOCUMENT_NODE:\r\n return {\r\n type: NodeType.Document,\r\n childNodes: []\r\n };\r\n\r\n case n.DOCUMENT_TYPE_NODE:\r\n return {\r\n type: NodeType.DocumentType,\r\n name: n.name,\r\n publicId: n.publicId,\r\n systemId: n.systemId\r\n };\r\n\r\n case n.ELEMENT_NODE:\r\n var needBlock = _isBlockedElement(n, blockClass, blockSelector);\r\n\r\n var tagName = getValidTagName(n);\r\n var attributes_1 = {};\r\n\r\n for (var _i = 0, _b = Array.from(n.attributes); _i \u003C _b.length; _i\u002B\u002B) {\r\n var _c = _b[_i],\r\n name = _c.name,\r\n value = _c.value;\r\n attributes_1[name] = transformAttribute(doc, name, value);\r\n }\r\n\r\n if (tagName === \u0027link\u0027 \u0026\u0026 inlineStylesheet) {\r\n var stylesheet = Array.from(doc.styleSheets).find(function (s) {\r\n return s.href === n.href;\r\n });\r\n var cssText = getCssRulesString(stylesheet);\r\n\r\n if (cssText) {\r\n delete attributes_1.rel;\r\n delete attributes_1.href;\r\n attributes_1._cssText = absoluteToStylesheet(cssText, stylesheet.href);\r\n }\r\n }\r\n\r\n if (tagName === \u0027style\u0027 \u0026\u0026 n.sheet \u0026\u0026 !(n.innerText || n.textContent || \u0027\u0027).trim().length) {\r\n var cssText = getCssRulesString(n.sheet);\r\n\r\n if (cssText) {\r\n attributes_1._cssText = absoluteToStylesheet(cssText, location.href);\r\n }\r\n }\r\n\r\n if (tagName === \u0027input\u0027 || tagName === \u0027textarea\u0027 || tagName === \u0027select\u0027) {\r\n var value = n.value;\r\n\r\n if (attributes_1.type !== \u0027radio\u0027 \u0026\u0026 attributes_1.type !== \u0027checkbox\u0027 \u0026\u0026 attributes_1.type !== \u0027submit\u0027 \u0026\u0026 attributes_1.type !== \u0027button\u0027 \u0026\u0026 value) {\r\n attributes_1.value = maskInputOptions[attributes_1.type] || maskInputOptions[tagName] ? \u0027*\u0027.repeat(value.length) : value;\r\n } else if (n.checked) {\r\n attributes_1.checked = n.checked;\r\n }\r\n }\r\n\r\n if (tagName === \u0027option\u0027) {\r\n var selectValue = n.parentElement;\r\n\r\n if (attributes_1.value === selectValue.value) {\r\n attributes_1.selected = n.selected;\r\n }\r\n }\r\n\r\n if (tagName === \u0027canvas\u0027 \u0026\u0026 recordCanvas) {\r\n attributes_1.rr_dataURL = n.toDataURL();\r\n }\r\n\r\n if (tagName === \u0027audio\u0027 || tagName === \u0027video\u0027) {\r\n attributes_1.rr_mediaState = n.paused ? \u0027paused\u0027 : \u0027played\u0027;\r\n }\r\n\r\n if (n.scrollLeft) {\r\n attributes_1.rr_scrollLeft = n.scrollLeft;\r\n }\r\n\r\n if (n.scrollTop) {\r\n attributes_1.rr_scrollTop = n.scrollTop;\r\n }\r\n\r\n if (needBlock) {\r\n var _d = n.getBoundingClientRect(),\r\n width = _d.width,\r\n height = _d.height;\r\n\r\n attributes_1 = {\r\n class: attributes_1.class,\r\n rr_width: width \u002B \u0022px\u0022,\r\n rr_height: height \u002B \u0022px\u0022\r\n };\r\n }\r\n\r\n return {\r\n type: NodeType.Element,\r\n tagName: tagName,\r\n attributes: attributes_1,\r\n childNodes: [],\r\n isSVG: isSVGElement(n) || undefined,\r\n needBlock: needBlock\r\n };\r\n\r\n case n.TEXT_NODE:\r\n var parentTagName = n.parentNode \u0026\u0026 n.parentNode.tagName;\r\n var textContent = n.textContent;\r\n var isStyle = parentTagName === \u0027STYLE\u0027 ? true : undefined;\r\n\r\n if (isStyle \u0026\u0026 textContent) {\r\n textContent = absoluteToStylesheet(textContent, location.href);\r\n }\r\n\r\n if (parentTagName === \u0027SCRIPT\u0027) {\r\n textContent = \u0027SCRIPT_PLACEHOLDER\u0027;\r\n }\r\n\r\n return {\r\n type: NodeType.Text,\r\n textContent: textContent || \u0027\u0027,\r\n isStyle: isStyle\r\n };\r\n\r\n case n.CDATA_SECTION_NODE:\r\n return {\r\n type: NodeType.CDATA,\r\n textContent: \u0027\u0027\r\n };\r\n\r\n case n.COMMENT_NODE:\r\n return {\r\n type: NodeType.Comment,\r\n textContent: n.textContent || \u0027\u0027\r\n };\r\n\r\n default:\r\n return false;\r\n }\r\n}\r\n\r\nfunction lowerIfExists(maybeAttr) {\r\n if (maybeAttr === undefined) {\r\n return \u0027\u0027;\r\n } else {\r\n return maybeAttr.toLowerCase();\r\n }\r\n}\r\n\r\nfunction slimDOMExcluded(sn, slimDOMOptions) {\r\n if (slimDOMOptions.comment \u0026\u0026 sn.type === NodeType.Comment) {\r\n return true;\r\n } else if (sn.type === NodeType.Element) {\r\n if (slimDOMOptions.script \u0026\u0026 (sn.tagName === \u0027script\u0027 || sn.tagName === \u0027link\u0027 \u0026\u0026 sn.attributes.rel === \u0027preload\u0027 \u0026\u0026 sn.attributes.as === \u0027script\u0027)) {\r\n return true;\r\n } else if (slimDOMOptions.headFavicon \u0026\u0026 (sn.tagName === \u0027link\u0027 \u0026\u0026 sn.attributes.rel === \u0027shortcut icon\u0027 || sn.tagName === \u0027meta\u0027 \u0026\u0026 (lowerIfExists(sn.attributes.name).match(/^msapplication-tile(image|color)$/) || lowerIfExists(sn.attributes.name) === \u0027application-name\u0027 || lowerIfExists(sn.attributes.rel) === \u0027icon\u0027 || lowerIfExists(sn.attributes.rel) === \u0027apple-touch-icon\u0027 || lowerIfExists(sn.attributes.rel) === \u0027shortcut icon\u0027))) {\r\n return true;\r\n } else if (sn.tagName === \u0027meta\u0027) {\r\n if (slimDOMOptions.headMetaDescKeywords \u0026\u0026 lowerIfExists(sn.attributes.name).match(/^description|keywords$/)) {\r\n return true;\r\n } else if (slimDOMOptions.headMetaSocial \u0026\u0026 (lowerIfExists(sn.attributes.property).match(/^(og|twitter|fb):/) || lowerIfExists(sn.attributes.name).match(/^(og|twitter):/) || lowerIfExists(sn.attributes.name) === \u0027pinterest\u0027)) {\r\n return true;\r\n } else if (slimDOMOptions.headMetaRobots \u0026\u0026 (lowerIfExists(sn.attributes.name) === \u0027robots\u0027 || lowerIfExists(sn.attributes.name) === \u0027googlebot\u0027 || lowerIfExists(sn.attributes.name) === \u0027bingbot\u0027)) {\r\n return true;\r\n } else if (slimDOMOptions.headMetaHttpEquiv \u0026\u0026 sn.attributes[\u0027http-equiv\u0027] !== undefined) {\r\n return true;\r\n } else if (slimDOMOptions.headMetaAuthorship \u0026\u0026 (lowerIfExists(sn.attributes.name) === \u0027author\u0027 || lowerIfExists(sn.attributes.name) === \u0027generator\u0027 || lowerIfExists(sn.attributes.name) === \u0027framework\u0027 || lowerIfExists(sn.attributes.name) === \u0027publisher\u0027 || lowerIfExists(sn.attributes.name) === \u0027progid\u0027 || lowerIfExists(sn.attributes.property).match(/^article:/) || lowerIfExists(sn.attributes.property).match(/^product:/))) {\r\n return true;\r\n } else if (slimDOMOptions.headMetaVerification \u0026\u0026 (lowerIfExists(sn.attributes.name) === \u0027google-site-verification\u0027 || lowerIfExists(sn.attributes.name) === \u0027yandex-verification\u0027 || lowerIfExists(sn.attributes.name) === \u0027csrf-token\u0027 || lowerIfExists(sn.attributes.name) === \u0027p:domain_verify\u0027 || lowerIfExists(sn.attributes.name) === \u0027verify-v1\u0027 || lowerIfExists(sn.attributes.name) === \u0027verification\u0027 || lowerIfExists(sn.attributes.name) === \u0027shopify-checkout-api-token\u0027)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction serializeNodeWithId(n, options) {\r\n var doc = options.doc,\r\n map = options.map,\r\n blockClass = options.blockClass,\r\n blockSelector = options.blockSelector,\r\n _a = options.skipChild,\r\n skipChild = _a === void 0 ? false : _a,\r\n _b = options.inlineStylesheet,\r\n inlineStylesheet = _b === void 0 ? true : _b,\r\n _c = options.maskInputOptions,\r\n maskInputOptions = _c === void 0 ? {} : _c,\r\n slimDOMOptions = options.slimDOMOptions,\r\n _d = options.recordCanvas,\r\n recordCanvas = _d === void 0 ? false : _d;\r\n var _e = options.preserveWhiteSpace,\r\n preserveWhiteSpace = _e === void 0 ? true : _e;\r\n\r\n var _serializedNode = serializeNode(n, {\r\n doc: doc,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n recordCanvas: recordCanvas\r\n });\r\n\r\n if (!_serializedNode) {\r\n console.warn(n, \u0027not serialized\u0027);\r\n return null;\r\n }\r\n\r\n var id;\r\n\r\n if (\u0027__sn\u0027 in n) {\r\n id = n.__sn.id;\r\n } else if (slimDOMExcluded(_serializedNode, slimDOMOptions) || !preserveWhiteSpace \u0026\u0026 _serializedNode.type === NodeType.Text \u0026\u0026 !_serializedNode.isStyle \u0026\u0026 !_serializedNode.textContent.replace(/^\\s\u002B|\\s\u002B$/gm, \u0027\u0027).length) {\r\n id = IGNORED_NODE;\r\n } else {\r\n id = genId();\r\n }\r\n\r\n var serializedNode = Object.assign(_serializedNode, {\r\n id: id\r\n });\r\n n.__sn = serializedNode;\r\n\r\n if (id === IGNORED_NODE) {\r\n return null;\r\n }\r\n\r\n map[id] = n;\r\n var recordChild = !skipChild;\r\n\r\n if (serializedNode.type === NodeType.Element) {\r\n recordChild = recordChild \u0026\u0026 !serializedNode.needBlock;\r\n delete serializedNode.needBlock;\r\n }\r\n\r\n if ((serializedNode.type === NodeType.Document || serializedNode.type === NodeType.Element) \u0026\u0026 recordChild) {\r\n if (slimDOMOptions.headWhitespace \u0026\u0026 _serializedNode.type === NodeType.Element \u0026\u0026 _serializedNode.tagName === \u0027head\u0027) {\r\n preserveWhiteSpace = false;\r\n }\r\n\r\n for (var _i = 0, _f = Array.from(n.childNodes); _i \u003C _f.length; _i\u002B\u002B) {\r\n var childN = _f[_i];\r\n var serializedChildNode = serializeNodeWithId(childN, {\r\n doc: doc,\r\n map: map,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n skipChild: skipChild,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n slimDOMOptions: slimDOMOptions,\r\n recordCanvas: recordCanvas,\r\n preserveWhiteSpace: preserveWhiteSpace\r\n });\r\n\r\n if (serializedChildNode) {\r\n serializedNode.childNodes.push(serializedChildNode);\r\n }\r\n }\r\n }\r\n\r\n return serializedNode;\r\n}\r\n\r\nfunction snapshot(n, options) {\r\n var _a = options || {},\r\n _b = _a.blockClass,\r\n blockClass = _b === void 0 ? \u0027rr-block\u0027 : _b,\r\n _c = _a.inlineStylesheet,\r\n inlineStylesheet = _c === void 0 ? true : _c,\r\n _d = _a.recordCanvas,\r\n recordCanvas = _d === void 0 ? false : _d,\r\n _e = _a.blockSelector,\r\n blockSelector = _e === void 0 ? null : _e,\r\n _f = _a.maskAllInputs,\r\n maskAllInputs = _f === void 0 ? false : _f,\r\n _g = _a.slimDOM,\r\n slimDOM = _g === void 0 ? false : _g;\r\n\r\n var idNodeMap = {};\r\n var maskInputOptions = maskAllInputs === true ? {\r\n color: true,\r\n date: true,\r\n \u0027datetime-local\u0027: true,\r\n email: true,\r\n month: true,\r\n number: true,\r\n range: true,\r\n search: true,\r\n tel: true,\r\n text: true,\r\n time: true,\r\n url: true,\r\n week: true,\r\n textarea: true,\r\n select: true\r\n } : maskAllInputs === false ? {} : maskAllInputs;\r\n var slimDOMOptions = slimDOM === true || slimDOM === \u0027all\u0027 ? {\r\n script: true,\r\n comment: true,\r\n headFavicon: true,\r\n headWhitespace: true,\r\n headMetaDescKeywords: slimDOM === \u0027all\u0027,\r\n headMetaSocial: true,\r\n headMetaRobots: true,\r\n headMetaHttpEquiv: true,\r\n headMetaAuthorship: true,\r\n headMetaVerification: true\r\n } : slimDOM === false ? {} : slimDOM;\r\n return [serializeNodeWithId(n, {\r\n doc: n,\r\n map: idNodeMap,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n skipChild: false,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n slimDOMOptions: slimDOMOptions,\r\n recordCanvas: recordCanvas\r\n }), idNodeMap];\r\n}\r\n\r\nvar commentre = /\\/\\*[^*]*\\*\u002B([^/*][^*]*\\*\u002B)*\\//g;\r\n\r\nfunction parse(css, options) {\r\n if (options === void 0) {\r\n options = {};\r\n }\r\n\r\n var lineno = 1;\r\n var column = 1;\r\n\r\n function updatePosition(str) {\r\n var lines = str.match(/\\n/g);\r\n\r\n if (lines) {\r\n lineno \u002B= lines.length;\r\n }\r\n\r\n var i = str.lastIndexOf(\u0027\\n\u0027);\r\n column = i === -1 ? column \u002B str.length : str.length - i;\r\n }\r\n\r\n function position() {\r\n var start = {\r\n line: lineno,\r\n column: column\r\n };\r\n return function (node) {\r\n node.position = new Position(start);\r\n whitespace();\r\n return node;\r\n };\r\n }\r\n\r\n var Position = function () {\r\n function Position(start) {\r\n this.start = start;\r\n this.end = {\r\n line: lineno,\r\n column: column\r\n };\r\n this.source = options.source;\r\n }\r\n\r\n return Position;\r\n }();\r\n\r\n Position.prototype.content = css;\r\n var errorsList = [];\r\n\r\n function error(msg) {\r\n var err = new Error(options.source \u002B \u0027:\u0027 \u002B lineno \u002B \u0027:\u0027 \u002B column \u002B \u0027: \u0027 \u002B msg);\r\n err.reason = msg;\r\n err.filename = options.source;\r\n err.line = lineno;\r\n err.column = column;\r\n err.source = css;\r\n\r\n if (options.silent) {\r\n errorsList.push(err);\r\n } else {\r\n throw err;\r\n }\r\n }\r\n\r\n function stylesheet() {\r\n var rulesList = rules();\r\n return {\r\n type: \u0027stylesheet\u0027,\r\n stylesheet: {\r\n source: options.source,\r\n rules: rulesList,\r\n parsingErrors: errorsList\r\n }\r\n };\r\n }\r\n\r\n function open() {\r\n return match(/^{\\s*/);\r\n }\r\n\r\n function close() {\r\n return match(/^}/);\r\n }\r\n\r\n function rules() {\r\n var node;\r\n var rules = [];\r\n whitespace();\r\n comments(rules);\r\n\r\n while (css.length \u0026\u0026 css.charAt(0) !== \u0027}\u0027 \u0026\u0026 (node = atrule() || rule())) {\r\n if (node !== false) {\r\n rules.push(node);\r\n comments(rules);\r\n }\r\n }\r\n\r\n return rules;\r\n }\r\n\r\n function match(re) {\r\n var m = re.exec(css);\r\n\r\n if (!m) {\r\n return;\r\n }\r\n\r\n var str = m[0];\r\n updatePosition(str);\r\n css = css.slice(str.length);\r\n return m;\r\n }\r\n\r\n function whitespace() {\r\n match(/^\\s*/);\r\n }\r\n\r\n function comments(rules) {\r\n if (rules === void 0) {\r\n rules = [];\r\n }\r\n\r\n var c;\r\n\r\n while (c = comment()) {\r\n if (c !== false) {\r\n rules.push(c);\r\n }\r\n\r\n c = comment();\r\n }\r\n\r\n return rules;\r\n }\r\n\r\n function comment() {\r\n var pos = position();\r\n\r\n if (\u0027/\u0027 !== css.charAt(0) || \u0027*\u0027 !== css.charAt(1)) {\r\n return;\r\n }\r\n\r\n var i = 2;\r\n\r\n while (\u0027\u0027 !== css.charAt(i) \u0026\u0026 (\u0027*\u0027 !== css.charAt(i) || \u0027/\u0027 !== css.charAt(i \u002B 1))) {\r\n \u002B\u002Bi;\r\n }\r\n\r\n i \u002B= 2;\r\n\r\n if (\u0027\u0027 === css.charAt(i - 1)) {\r\n return error(\u0027End of comment missing\u0027);\r\n }\r\n\r\n var str = css.slice(2, i - 2);\r\n column \u002B= 2;\r\n updatePosition(str);\r\n css = css.slice(i);\r\n column \u002B= 2;\r\n return pos({\r\n type: \u0027comment\u0027,\r\n comment: str\r\n });\r\n }\r\n\r\n function selector() {\r\n var m = match(/^([^{]\u002B)/);\r\n\r\n if (!m) {\r\n return;\r\n }\r\n\r\n return trim(m[0]).replace(/\\/\\*([^*]|[\\r\\n]|(\\*\u002B([^*/]|[\\r\\n])))*\\*\\/\u002B/g, \u0027\u0027).replace(/\u0022(?:\\\\\u0022|[^\u0022])*\u0022|\u0027(?:\\\\\u0027|[^\u0027])*\u0027/g, function (m) {\r\n return m.replace(/,/g, \u0022\\u200C\u0022);\r\n }).split(/\\s*(?![^(]*\\)),\\s*/).map(function (s) {\r\n return s.replace(/\\u200C/g, \u0027,\u0027);\r\n });\r\n }\r\n\r\n function declaration() {\r\n var pos = position();\r\n var propMatch = match(/^(\\*?[-#\\/\\*\\\\\\w]\u002B(\\[[0-9a-z_-]\u002B\\])?)\\s*/);\r\n\r\n if (!propMatch) {\r\n return;\r\n }\r\n\r\n var prop = trim(propMatch[0]);\r\n\r\n if (!match(/^:\\s*/)) {\r\n return error(\u0022property missing \u0027:\u0027\u0022);\r\n }\r\n\r\n var val = match(/^((?:\u0027(?:\\\\\u0027|.)*?\u0027|\u0022(?:\\\\\u0022|.)*?\u0022|\\([^\\)]*?\\)|[^};])\u002B)/);\r\n var ret = pos({\r\n type: \u0027declaration\u0027,\r\n property: prop.replace(commentre, \u0027\u0027),\r\n value: val ? trim(val[0]).replace(commentre, \u0027\u0027) : \u0027\u0027\r\n });\r\n match(/^[;\\s]*/);\r\n return ret;\r\n }\r\n\r\n function declarations() {\r\n var decls = [];\r\n\r\n if (!open()) {\r\n return error(\u0022missing \u0027{\u0027\u0022);\r\n }\r\n\r\n comments(decls);\r\n var decl;\r\n\r\n while (decl = declaration()) {\r\n if (decl !== false) {\r\n decls.push(decl);\r\n comments(decls);\r\n }\r\n\r\n decl = declaration();\r\n }\r\n\r\n if (!close()) {\r\n return error(\u0022missing \u0027}\u0027\u0022);\r\n }\r\n\r\n return decls;\r\n }\r\n\r\n function keyframe() {\r\n var m;\r\n var vals = [];\r\n var pos = position();\r\n\r\n while (m = match(/^((\\d\u002B\\.\\d\u002B|\\.\\d\u002B|\\d\u002B)%?|[a-z]\u002B)\\s*/)) {\r\n vals.push(m[1]);\r\n match(/^,\\s*/);\r\n }\r\n\r\n if (!vals.length) {\r\n return;\r\n }\r\n\r\n return pos({\r\n type: \u0027keyframe\u0027,\r\n values: vals,\r\n declarations: declarations()\r\n });\r\n }\r\n\r\n function atkeyframes() {\r\n var pos = position();\r\n var m = match(/^@([-\\w]\u002B)?keyframes\\s*/);\r\n\r\n if (!m) {\r\n return;\r\n }\r\n\r\n var vendor = m[1];\r\n m = match(/^([-\\w]\u002B)\\s*/);\r\n\r\n if (!m) {\r\n return error(\u0027@keyframes missing name\u0027);\r\n }\r\n\r\n var name = m[1];\r\n\r\n if (!open()) {\r\n return error(\u0022@keyframes missing \u0027{\u0027\u0022);\r\n }\r\n\r\n var frame;\r\n var frames = comments();\r\n\r\n while (frame = keyframe()) {\r\n frames.push(frame);\r\n frames = frames.concat(comments());\r\n }\r\n\r\n if (!close()) {\r\n return error(\u0022@keyframes missing \u0027}\u0027\u0022);\r\n }\r\n\r\n return pos({\r\n type: \u0027keyframes\u0027,\r\n name: name,\r\n vendor: vendor,\r\n keyframes: frames\r\n });\r\n }\r\n\r\n function atsupports() {\r\n var pos = position();\r\n var m = match(/^@supports *([^{]\u002B)/);\r\n\r\n if (!m) {\r\n return;\r\n }\r\n\r\n var supports = trim(m[1]);\r\n\r\n if (!open()) {\r\n return error(\u0022@supports missing \u0027{\u0027\u0022);\r\n }\r\n\r\n var style = comments().concat(rules());\r\n\r\n if (!close()) {\r\n return error(\u0022@supports missing \u0027}\u0027\u0022);\r\n }\r\n\r\n return pos({\r\n type: \u0027supports\u0027,\r\n supports: supports,\r\n rules: style\r\n });\r\n }\r\n\r\n function athost() {\r\n var pos = position();\r\n var m = match(/^@host\\s*/);\r\n\r\n if (!m) {\r\n return;\r\n }\r\n\r\n if (!open()) {\r\n return error(\u0022@host missing \u0027{\u0027\u0022);\r\n }\r\n\r\n var style = comments().concat(rules());\r\n\r\n if (!close()) {\r\n return error(\u0022@host missing \u0027}\u0027\u0022);\r\n }\r\n\r\n return pos({\r\n type: \u0027host\u0027,\r\n rules: style\r\n });\r\n }\r\n\r\n function atmedia() {\r\n var pos = position();\r\n var m = match(/^@media *([^{]\u002B)/);\r\n\r\n if (!m) {\r\n return;\r\n }\r\n\r\n var media = trim(m[1]);\r\n\r\n if (!open()) {\r\n return error(\u0022@media missing \u0027{\u0027\u0022);\r\n }\r\n\r\n var style = comments().concat(rules());\r\n\r\n if (!close()) {\r\n return error(\u0022@media missing \u0027}\u0027\u0022);\r\n }\r\n\r\n return pos({\r\n type: \u0027media\u0027,\r\n media: media,\r\n rules: style\r\n });\r\n }\r\n\r\n function atcustommedia() {\r\n var pos = position();\r\n var m = match(/^@custom-media\\s\u002B(--[^\\s]\u002B)\\s*([^{;]\u002B);/);\r\n\r\n if (!m) {\r\n return;\r\n }\r\n\r\n return pos({\r\n type: \u0027custom-media\u0027,\r\n name: trim(m[1]),\r\n media: trim(m[2])\r\n });\r\n }\r\n\r\n function atpage() {\r\n var pos = position();\r\n var m = match(/^@page */);\r\n\r\n if (!m) {\r\n return;\r\n }\r\n\r\n var sel = selector() || [];\r\n\r\n if (!open()) {\r\n return error(\u0022@page missing \u0027{\u0027\u0022);\r\n }\r\n\r\n var decls = comments();\r\n var decl;\r\n\r\n while (decl = declaration()) {\r\n decls.push(decl);\r\n decls = decls.concat(comments());\r\n }\r\n\r\n if (!close()) {\r\n return error(\u0022@page missing \u0027}\u0027\u0022);\r\n }\r\n\r\n return pos({\r\n type: \u0027page\u0027,\r\n selectors: sel,\r\n declarations: decls\r\n });\r\n }\r\n\r\n function atdocument() {\r\n var pos = position();\r\n var m = match(/^@([-\\w]\u002B)?document *([^{]\u002B)/);\r\n\r\n if (!m) {\r\n return;\r\n }\r\n\r\n var vendor = trim(m[1]);\r\n var doc = trim(m[2]);\r\n\r\n if (!open()) {\r\n return error(\u0022@document missing \u0027{\u0027\u0022);\r\n }\r\n\r\n var style = comments().concat(rules());\r\n\r\n if (!close()) {\r\n return error(\u0022@document missing \u0027}\u0027\u0022);\r\n }\r\n\r\n return pos({\r\n type: \u0027document\u0027,\r\n document: doc,\r\n vendor: vendor,\r\n rules: style\r\n });\r\n }\r\n\r\n function atfontface() {\r\n var pos = position();\r\n var m = match(/^@font-face\\s*/);\r\n\r\n if (!m) {\r\n return;\r\n }\r\n\r\n if (!open()) {\r\n return error(\u0022@font-face missing \u0027{\u0027\u0022);\r\n }\r\n\r\n var decls = comments();\r\n var decl;\r\n\r\n while (decl = declaration()) {\r\n decls.push(decl);\r\n decls = decls.concat(comments());\r\n }\r\n\r\n if (!close()) {\r\n return error(\u0022@font-face missing \u0027}\u0027\u0022);\r\n }\r\n\r\n return pos({\r\n type: \u0027font-face\u0027,\r\n declarations: decls\r\n });\r\n }\r\n\r\n var atimport = _compileAtrule(\u0027import\u0027);\r\n\r\n var atcharset = _compileAtrule(\u0027charset\u0027);\r\n\r\n var atnamespace = _compileAtrule(\u0027namespace\u0027);\r\n\r\n function _compileAtrule(name) {\r\n var re = new RegExp(\u0027^@\u0027 \u002B name \u002B \u0027\\\\s*([^;]\u002B);\u0027);\r\n return function () {\r\n var pos = position();\r\n var m = match(re);\r\n\r\n if (!m) {\r\n return;\r\n }\r\n\r\n var ret = {\r\n type: name\r\n };\r\n ret[name] = m[1].trim();\r\n return pos(ret);\r\n };\r\n }\r\n\r\n function atrule() {\r\n if (css[0] !== \u0027@\u0027) {\r\n return;\r\n }\r\n\r\n return atkeyframes() || atmedia() || atcustommedia() || atsupports() || atimport() || atcharset() || atnamespace() || atdocument() || atpage() || athost() || atfontface();\r\n }\r\n\r\n function rule() {\r\n var pos = position();\r\n var sel = selector();\r\n\r\n if (!sel) {\r\n return error(\u0027selector missing\u0027);\r\n }\r\n\r\n comments();\r\n return pos({\r\n type: \u0027rule\u0027,\r\n selectors: sel,\r\n declarations: declarations()\r\n });\r\n }\r\n\r\n return addParent(stylesheet());\r\n}\r\n\r\nfunction trim(str) {\r\n return str ? str.replace(/^\\s\u002B|\\s\u002B$/g, \u0027\u0027) : \u0027\u0027;\r\n}\r\n\r\nfunction addParent(obj, parent) {\r\n var isNode = obj \u0026\u0026 typeof obj.type === \u0027string\u0027;\r\n var childParent = isNode ? obj : parent;\r\n\r\n for (var _i = 0, _a = Object.keys(obj); _i \u003C _a.length; _i\u002B\u002B) {\r\n var k = _a[_i];\r\n var value = obj[k];\r\n\r\n if (Array.isArray(value)) {\r\n value.forEach(function (v) {\r\n addParent(v, childParent);\r\n });\r\n } else if (value \u0026\u0026 _typeof(value) === \u0027object\u0027) {\r\n addParent(value, childParent);\r\n }\r\n }\r\n\r\n if (isNode) {\r\n Object.defineProperty(obj, \u0027parent\u0027, {\r\n configurable: true,\r\n writable: true,\r\n enumerable: false,\r\n value: parent || null\r\n });\r\n }\r\n\r\n return obj;\r\n}\r\nvar HOVER_SELECTOR = /([^\\\\]):hover/g;\r\n//css = \u0027.max:hover{color:pink;}.sam:hover .vla{color: orange;}.x:not(:hover) div{color: pink} .max:hover{border:1px solid pink;}\u0027\r\ncss = \u0027.max:hover{color:pink;}.sam:hover .vla{color: orange;}.x:not(:hover) div{color: pink}\u0027\r\n","TestCases":[{"Name":"default","Code":"function addHoverClass(cssText) {\r\n var ast = parse(cssText, {\r\n silent: true\r\n });\r\n\r\n if (!ast.stylesheet) {\r\n return cssText;\r\n }\r\n\r\n ast.stylesheet.rules.forEach(function (rule) {\r\n if (\u0027selectors\u0027 in rule) {\r\n (rule.selectors || []).forEach(function (selector) {\r\n if (HOVER_SELECTOR.test(selector)) {\r\n var newSelector = selector.replace(HOVER_SELECTOR, \u0027$1.\\\\:hover\u0027);\r\n cssText = cssText.replace(selector, selector \u002B \u0022, \u0022 \u002B newSelector);\r\n }\r\n });\r\n }\r\n });\r\n return cssText;\r\n}\r\n\r\naddHoverClass(css)","IsDeferred":false},{"Name":"replaceAll","Code":"function addHoverClass(cssText) {\r\n var ast = parse(cssText, {\r\n silent: true\r\n });\r\n\r\n if (!ast.stylesheet) {\r\n return cssText;\r\n }\r\n \r\n const modifications = {};\r\n\r\n ast.stylesheet.rules.forEach(function (rule) {\r\n if (\u0027selectors\u0027 in rule) {\r\n (rule.selectors || []).forEach(function (selector) {\r\n if (HOVER_SELECTOR.test(selector)) {\r\n var newSelector = selector.replace(HOVER_SELECTOR, \u0027$1.\\\\:hover\u0027);\r\n modifications[selector] = selector \u002B \u0022, \u0022 \u002B newSelector\r\n }\r\n });\r\n }\r\n });\r\n \r\n \r\n Object.keys(modifications).forEach((selector)=\u003E{\r\n \tcssText = cssText.replaceAll(selector, modifications[selector])\r\n })\r\n\r\n return cssText;\r\n}\r\n\r\naddHoverClass(css)","IsDeferred":false}]}