{"version":3,"sources":["jsdelivr-header.js","/npm/svg-slim@2.0.5/dist/index.js"],"names":[],"mappings":"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","file":"/npm/svg-slim@2.0.5/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/svg-slim@2.0.5/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('svg-vdom'), require('css'), require('ramda')) :\n\ttypeof define === 'function' && define.amd ? define(['svg-vdom', 'css', 'ramda'], factory) :\n\t(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.svgSlimming = factory(global.svgVdom, global.css, global.ramda));\n}(this, (function (svgVdom, css, ramda) { 'use strict';\n\n\tconst createRuleConfig = (finalConfig, key) => {\r\n\t    const config = {\r\n\t        params: { ...finalConfig.params },\r\n\t        browsers: { ...finalConfig.browsers },\r\n\t        option: {},\r\n\t    };\r\n\t    if (key) {\r\n\t        config.option = finalConfig.rules[key][1];\r\n\t    }\r\n\t    return config;\r\n\t};\n\n\tconst hasProp = (obj, key) => Object.prototype.hasOwnProperty.call(obj, key);\n\n\tconst isObj = (obj) => obj && typeof obj === 'object';\n\n\tconst FF = 255;\r\n\tconst Hundred = 100;\r\n\tconst Hex = 16;\r\n\tconst CIRC = 360;\r\n\tconst HALF_CIRC = 180;\r\n\tconst GRAD = 400;\r\n\tconst RAD = Math.PI * 2;\r\n\tconst matrixEPos = 4;\r\n\tconst HALF = 0.5;\r\n\tconst APOS_RX = 0;\r\n\tconst APOS_RY = 1;\r\n\tconst APOS_ROTATION = 2;\r\n\tconst APOS_LARGE = 3;\r\n\tconst APOS_SWEEP = 4;\r\n\tconst APOS_X = 5;\r\n\tconst APOS_Y = 6;\r\n\tconst APOS_LEN = 7;\r\n\tconst OPACITY_DIGIT = 3; // 浏览器对于颜色的 alpha 值只处理到小数点后第 3 位\r\n\tconst DEFAULT_SIZE_DIGIT = 2;\r\n\tconst DEFAULT_ACCURATE_DIGIT = 2;\r\n\tconst DEFAULT_MATRIX_DIGIT = 3;\r\n\t// path 直线指令\r\n\tconst LineTypes = 'LlHhVv';\n\n\tconst paramsConfig = {\r\n\t    angelDigit: DEFAULT_ACCURATE_DIGIT,\r\n\t    sizeDigit: DEFAULT_SIZE_DIGIT,\r\n\t    trifuncDigit: DEFAULT_MATRIX_DIGIT,\r\n\t    opacityDigit: OPACITY_DIGIT,\r\n\t    thinning: 0,\r\n\t    straighten: 0,\r\n\t    mergePoint: 0,\r\n\t    rmAttrEqDefault: true,\r\n\t    ignoreKnownCSS: false,\r\n\t};\r\n\tconst rulesConfig = {\r\n\t    // 应用样式到元素\r\n\t    'apply-style': [true],\r\n\t    // 合并 g 标签\r\n\t    'collapse-g': [true],\r\n\t    // 塌陷无意义的文本节点\r\n\t    'collapse-textwrap': [true],\r\n\t    // 合并 path 标签\r\n\t    'combine-path': [true, {\r\n\t            disregardFill: false,\r\n\t            disregardOpacity: false,\r\n\t        }],\r\n\t    // 分析并合并 transform 属性\r\n\t    'combine-transform': [true],\r\n\t    // 计算 path 的 d 属性，使之变得更短\r\n\t    'compute-path': [true],\r\n\t    // 移除非规范的属性\r\n\t    'rm-attribute': [true, {\r\n\t            keepAria: false,\r\n\t            keepEvent: false,\r\n\t        }],\r\n\t    // 移除注释\r\n\t    'rm-comments': [true],\r\n\t    // 移除 DOCTYPE 声明\r\n\t    'rm-doctype': [true],\r\n\t    // 移除隐藏对象\r\n\t    'rm-hidden': [true],\r\n\t    // 移除不必要的 !important\r\n\t    'rm-important': [true],\r\n\t    // 移除不合法的 style 属性\r\n\t    'rm-illegal-style': [true],\r\n\t    // 移除不规范嵌套的标签\r\n\t    'rm-irregular-nesting': [true, {\r\n\t            ignore: [],\r\n\t        }],\r\n\t    // 移除非规范的标签\r\n\t    // 配置不移除的非规范标签\r\n\t    'rm-irregular-tag': [true, {\r\n\t            ignore: [],\r\n\t        }],\r\n\t    // 移除 px 单位\r\n\t    'rm-px': [true],\r\n\t    // 移除不必要的标签\r\n\t    // 配置需要移除的标签列表\r\n\t    'rm-unnecessary': [true, {\r\n\t            tags: ['desc', 'discard', 'foreignObject', 'video', 'audio', 'iframe', 'canvas', 'metadata', 'script', 'title', 'unknown', 'image'],\r\n\t        }],\r\n\t    // 移除 svg 标签的 version 属性\r\n\t    'rm-version': [true],\r\n\t    // 是否强制移除 viewBox 属性\r\n\t    'rm-viewbox': [true],\r\n\t    // 移除 xml 声明\r\n\t    'rm-xml-decl': [true],\r\n\t    // 如有必要，移除 xml 命名空间\r\n\t    'rm-xmlns': [true],\r\n\t    // 缩短动画元素\r\n\t    'shorten-animate': [true, {\r\n\t            remove: false,\r\n\t        }],\r\n\t    // 缩短 className ，并移除不被引用的 className\r\n\t    'shorten-class': [true],\r\n\t    // 缩短颜色\r\n\t    'shorten-color': [true, {\r\n\t            rrggbbaa: false,\r\n\t        }],\r\n\t    // 缩短小数点后位数\r\n\t    'shorten-decimal-digits': [true],\r\n\t    // 合并所有的 defs ，移除无效的 defs 定义\r\n\t    'shorten-defs': [true],\r\n\t    // 移除无效的滤镜元素，移除不必要的滤镜元素属性\r\n\t    'shorten-filter': [true],\r\n\t    // 缩短 ID ，并移除不被引用的 ID\r\n\t    'shorten-id': [true],\r\n\t    // 缩短 shape 类型的节点\r\n\t    'shorten-shape': [true],\r\n\t    // 根据情况进行 style 和属性的互转\r\n\t    'shorten-style-attr': [true],\r\n\t    // 深度分析，移除无效选择器、合并相同的选择器、合并相同规则\r\n\t    'shorten-style-tag': [true],\r\n\t    // 多个元素具有相同的 style 属性，则改为创建公共的 class\r\n\t    'style-to-class': [true],\r\n\t};\n\n\t// eslint-disable-next-line @typescript-eslint/no-var-requires\r\n\tconst browserslist = require('browserslist');\r\n\tconst browserConfig = (query) => {\r\n\t    const browsers = browserslist(query);\r\n\t    const res = {};\r\n\t    browsers.forEach(val => {\r\n\t        const num = /\\s\\d/.exec(val);\r\n\t        if (num) {\r\n\t            const key = val.slice(0, num.index);\r\n\t            // 此处必须用 parseFloat 因为可能存在 14.0-14.5 这种版本号\r\n\t            const ver = parseFloat(val.slice(num.index));\r\n\t            if (!hasProp(res, key)) {\r\n\t                res[key] = ver;\r\n\t            }\r\n\t            else {\r\n\t                if (ver < res[key]) {\r\n\t                    res[key] = ver;\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t    });\r\n\t    return res;\r\n\t};\r\n\tconst mergeUserVal = (v, _v) => {\r\n\t    if (Array.isArray(v)) {\r\n\t        // 数组只要字符串项\r\n\t        if (Array.isArray(_v)) {\r\n\t            return _v.filter(s => typeof s === 'string');\r\n\t        }\r\n\t    }\r\n\t    else if (typeof v === typeof _v) {\r\n\t        if (typeof _v === 'number') {\r\n\t            // 数值项要忽略 NaN、Infinity 和负数，并下取整\r\n\t            if (_v >= 0 && _v !== Infinity) {\r\n\t                return Math.floor(_v);\r\n\t            }\r\n\t        }\r\n\t        else {\r\n\t            return _v;\r\n\t        }\r\n\t    }\r\n\t    return v;\r\n\t};\r\n\tconst checkRules = (userConfig, finalRules) => {\r\n\t    for (const [key, val] of Object.entries(userConfig)) {\r\n\t        // 只合并存在的值\r\n\t        if (hasProp(finalRules, key)) {\r\n\t            const conf = finalRules[key];\r\n\t            // 布尔值直接设置开关位置\r\n\t            if (typeof val === 'boolean') {\r\n\t                conf[0] = val;\r\n\t            }\r\n\t            else if (Array.isArray(val) && typeof val[0] === 'boolean') {\r\n\t                // 如果开关位置不是布尔值，后续直接抛弃处理\r\n\t                conf[0] = val[0];\r\n\t                // 默认配置如果没有 option 则不必再验证，如果没有打开配置项，后续也不必再验证\r\n\t                if (conf[0] && conf[1]) {\r\n\t                    const option = conf[1];\r\n\t                    // 仅验证拿到 IRulesConfigOption 的情况\r\n\t                    const userOption = val[1];\r\n\t                    if (isObj(userOption)) {\r\n\t                        for (const [k, v] of Object.entries(userOption)) {\r\n\t                            if (hasProp(option, k)) {\r\n\t                                option[k] = mergeUserVal(option[k], v);\r\n\t                            }\r\n\t                        }\r\n\t                    }\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t};\r\n\tconst mergeConfig = (userConfig) => {\r\n\t    const finalConfig = {\r\n\t        rules: {},\r\n\t        params: { ...paramsConfig },\r\n\t        browsers: browserConfig(),\r\n\t    };\r\n\t    // 首先把默认规则深拷贝合并过来\r\n\t    for (const [key, [_switch, _option]] of Object.entries(rulesConfig)) {\r\n\t        finalConfig.rules[key] = [_switch];\r\n\t        if (_option) {\r\n\t            const option = {};\r\n\t            for (const [k, v] of Object.entries(_option)) {\r\n\t                option[k] = Array.isArray(v) ? v.slice() : v;\r\n\t            }\r\n\t            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n\t            finalConfig.rules[key].push(option);\r\n\t        }\r\n\t    }\r\n\t    if (isObj(userConfig)) {\r\n\t        const uConfig = userConfig;\r\n\t        checkRules(uConfig, finalConfig.rules);\r\n\t        if (hasProp(uConfig, 'rules') && isObj(uConfig.rules)) {\r\n\t            checkRules(uConfig.rules, finalConfig.rules);\r\n\t        }\r\n\t        const uParams = uConfig.params;\r\n\t        if (hasProp(uConfig, 'params') && isObj(uParams)) {\r\n\t            (Object.keys(paramsConfig)).forEach(k => {\r\n\t                if (hasProp(uParams, k)) {\r\n\t                    const uk = uParams[k];\r\n\t                    finalConfig.params[k] = mergeUserVal(paramsConfig[k], uk);\r\n\t                }\r\n\t            });\r\n\t        }\r\n\t        if (hasProp(uConfig, 'browsers') && (typeof uConfig.browsers === 'string' || Array.isArray(uConfig.browsers))) {\r\n\t            finalConfig.browsers = browserConfig(uConfig.browsers);\r\n\t        }\r\n\t    }\r\n\t    return finalConfig;\r\n\t};\n\n\t// elements group\r\n\tconst animationElements = ['animate', 'animateMotion', 'animateTransform', 'discard', 'set'];\r\n\tconst animationAttrElements = ['animate', 'animateTransform', 'set'];\r\n\tconst descriptiveElements = ['desc', 'metadata', 'title'];\r\n\tconst gradientElements = ['linearGradient', 'radialGradient'];\r\n\tconst filterPrimitiveElements = ['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDropShadow', 'feFlood', 'feGaussianBlur', 'feImage', 'feMerge', 'feMorphology', 'feOffset', 'feSpecularLighting', 'feTile', 'feTurbulence'];\r\n\tconst transferFunctionElements = ['feFuncR', 'feFuncG', 'feFuncB', 'feFuncA'];\r\n\tconst lightSourceElements = ['feDistantLight', 'fePointLight', 'feSpotLight'];\r\n\tconst paintServerElements = ['solidcolor', 'linearGradient', 'radialGradient', 'meshgradient', 'pattern', 'hatch'];\r\n\tconst shapeElements = ['circle', 'ellipse', 'line', 'path', 'polygon', 'polyline', 'rect'];\r\n\tconst structuralElements = ['defs', 'g', 'svg', 'symbol', 'use'];\r\n\tconst textContentChildElements = ['tspan', 'textPath'];\r\n\tconst textContentElements = ['text'].concat(textContentChildElements);\r\n\tconst graphicsElements = ['audio', 'canvas', 'circle', 'ellipse', 'foreignObject', 'iframe', 'image', 'line', 'mesh', 'path', 'polygon', 'polyline', 'rect', 'text', 'textPath', 'tspan', 'video'];\r\n\tconst containerElements = ['a', 'clipPath', 'defs', 'g', 'marker', 'mask', 'pattern', 'svg', 'switch', 'symbol', 'unknown'];\r\n\tconst newViewportsElements = ['svg', 'symbol', 'foreignObject', 'video', 'audio', 'canvas', 'image', 'iframe'];\r\n\tconst unnecessaryElements = ['desc', 'discard', 'foreignObject', 'video', 'audio', 'iframe', 'canvas', 'metadata', 'script', 'style', 'title', 'unknown', 'image'];\r\n\tconst geometryElements = ['circle', 'ellipse', 'rect', 'image', 'foreignObject', 'svg'];\r\n\t// attributes group\r\n\t// https://www.w3.org/TR/SVG2/interact.html#EventAttributes\r\n\tconst eventAttributes = ['onabort', 'onafterprint', 'onbeforeprint', 'onbegin', 'oncancel', 'oncanplay', 'oncanplaythrough', 'onchange', 'onclick', 'onclose', 'oncuechange', 'ondblclick', 'ondrag', 'ondragend', 'ondragenter', 'ondragexit', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'ondurationchange', 'onemptied', 'onend', 'onended', 'onerror', 'onerror', 'onfocus', 'onfocusin', 'onfocusout', 'onhashchange', 'oninput', 'oninvalid', 'onkeydown', 'onkeypress', 'onkeyup', 'onload', 'onloadeddata', 'onloadedmetadata', 'onloadstart', 'onmessage', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onoffline', 'ononline', 'onpagehide', 'onpageshow', 'onpause', 'onplay', 'onplaying', 'onpopstate', 'onprogress', 'onratechange', 'onrepeat', 'onreset', 'onresize', 'onresize', 'onscroll', 'onscroll', 'onseeked', 'onseeking', 'onselect', 'onshow', 'onstalled', 'onstorage', 'onsubmit', 'onsuspend', 'ontimeupdate', 'ontoggle', 'onunload', 'onunload', 'onvolumechange', 'onwaiting'];\r\n\t// https://www.w3.org/TR/wai-aria-1.1/#aria-activedescendant\r\n\tconst ariaAttributes = ['aria-activedescendant', 'aria-atomic', 'aria-busy', 'aria-checked', 'aria-colcount', 'aria-colindex', 'aria-colspan', 'aria-controls', 'aria-current', 'aria-describedby', 'aria-details', 'aria-disabled', 'aria-dropeffect', 'aria-errormessage', 'aria-expanded', 'aria-flowto', 'aria-grabbed', 'aria-haspopup', 'aria-hidden', 'aria-invalid', 'aria-keyshortcuts', 'aria-label', 'aria-labelledby', 'aria-level', 'aria-live', 'aria-modal', 'aria-multiline', 'aria-multiselectable', 'aria-orientation', 'aria-owns', 'aria-placeholder', 'aria-posinset', 'aria-pressed', 'aria-readonly', 'aria-relevant', 'aria-required', 'aria-roledescription', 'aria-rowcount', 'aria-rowindex', 'aria-rowspan', 'aria-selected', 'aria-setsize', 'aria-sort', 'aria-valuemax', 'aria-valuemin', 'aria-valuenow', 'aria-valuetext', 'role'];\r\n\tconst animationAttributes = ['from', 'to', 'by', 'values'];\r\n\tconst transformAttributes = ['gradientTransform', 'patternTransform', 'transform'];\r\n\tconst cantCollapseAttributes = ['id', 'class', 'mask', 'style'];\r\n\tconst conditionalProcessingAttributes = ['requiredExtensions', 'systemLanguage'];\r\n\tconst coreAttributes = ['id', 'tabindex', 'lang', 'xml:space', 'class', 'style', 'transform'];\r\n\tconst deprecatedXlinkAttributes = ['xlink:href', 'xlink:title'];\r\n\tconst animationAdditionAttributes = ['additive', 'accumulate'];\r\n\tconst animationTimingAttributes = ['begin', 'dur', 'end', 'min', 'max', 'restart', 'repeatCount', 'repeatDur', 'fill'];\r\n\tconst animationValueAttributes = ['calcMode', 'values', 'keyTimes', 'keySplines', 'from', 'to', 'by'];\r\n\tconst rectAttributes = ['x', 'y', 'width', 'height'];\r\n\tconst transferFunctionElementAttributes = ['type', 'tableValues', 'slope', 'intercept', 'amplitude', 'exponent', 'offset'];\r\n\tconst geometryProperties = rectAttributes.concat(['cx', 'cy', 'r', 'rx', 'ry']);\r\n\t// 部分 key，在作为属性时可以省略 px 单位，在 css 中不能省略\r\n\tconst needUnitInStyle = ['font-size', 'letter-spacing', 'word-spacing'];\r\n\t// 这些伪类和伪元素只是在某些状态下生效，在解析样式树时要标出来\r\n\tconst statusPseudoClass = ['target', 'link', 'visited', 'hover', 'active', 'focus'];\r\n\tconst statusPseudoElement = ['first-letter', 'first-line', 'selection'];\n\n\tconst baseChildren = ['script'].concat(descriptiveElements);\r\n\tconst shapeChildren = ['clipPath', 'marker', 'mask', 'style'].concat(animationElements, baseChildren, paintServerElements);\r\n\tconst globalChildren = ['a', 'audio', 'canvas', 'clipPath', 'cursor', 'filter', 'foreignObject', 'iframe', 'image', 'marker', 'mask', 'style', 'switch', 'text', 'video', 'view'].concat(animationElements, baseChildren, paintServerElements, shapeElements, structuralElements);\r\n\tconst gradientChildren = ['animate', 'animateTransform', 'set', 'stop', 'style'].concat(baseChildren);\r\n\tconst feChildren = ['animate', 'set'].concat(baseChildren);\r\n\tconst conditionAndCore = conditionalProcessingAttributes.concat(coreAttributes);\r\n\tconst shapeAttributes = ['pathLength'].concat(conditionAndCore);\r\n\tconst animateAttributes = conditionAndCore.concat(animationAdditionAttributes, animationTimingAttributes, animationValueAttributes);\r\n\tconst feAttributes = ['result'].concat(coreAttributes, rectAttributes);\r\n\tconst feFuncAttributes = transferFunctionElementAttributes.concat(coreAttributes);\r\n\t// tag define\r\n\tconst _regularTag = {\r\n\t    'a': {\r\n\t        containTextNode: true,\r\n\t        legalChildElements: { transparent: true, noself: true, childElements: [] },\r\n\t        ownAttributes: ['href', 'target', 'download', 'rel', 'hreflang', 'type'].concat(conditionAndCore, deprecatedXlinkAttributes),\r\n\t    },\r\n\t    'animate': {\r\n\t        legalChildElements: { childElements: baseChildren },\r\n\t        ownAttributes: ['attributeName'].concat(animateAttributes),\r\n\t        onlyAttr: ['fill'],\r\n\t    },\r\n\t    'animateMotion': {\r\n\t        legalChildElements: { childElements: ['mpath'].concat(baseChildren) },\r\n\t        ownAttributes: ['path', 'keyPoints', 'rotate', 'origin'].concat(animateAttributes),\r\n\t        onlyAttr: ['fill'],\r\n\t    },\r\n\t    'animateTransform': {\r\n\t        legalChildElements: { childElements: baseChildren },\r\n\t        ownAttributes: ['attributeName', 'type'].concat(animateAttributes),\r\n\t        onlyAttr: ['fill'],\r\n\t    },\r\n\t    'audio': {\r\n\t        legalChildElements: { childElements: [] },\r\n\t        ownAttributes: [],\r\n\t    },\r\n\t    'canvas': {\r\n\t        legalChildElements: { childElements: [] },\r\n\t        ownAttributes: [],\r\n\t    },\r\n\t    'circle': {\r\n\t        legalChildElements: { childElements: shapeChildren },\r\n\t        ownAttributes: ['cx', 'cy', 'r'].concat(shapeAttributes),\r\n\t    },\r\n\t    'clipPath': {\r\n\t        legalChildElements: { childElements: ['text', 'use'].concat(baseChildren, animationElements, shapeElements) },\r\n\t        ownAttributes: ['externalResourcesRequired', 'transform', 'clipPathUnits'].concat(conditionAndCore),\r\n\t    },\r\n\t    'defs': {\r\n\t        legalChildElements: { childElements: globalChildren },\r\n\t        ownAttributes: coreAttributes,\r\n\t    },\r\n\t    'desc': {\r\n\t        containTextNode: true,\r\n\t        legalChildElements: { any: true, childElements: [] },\r\n\t        ownAttributes: coreAttributes,\r\n\t    },\r\n\t    'discard': {\r\n\t        legalChildElements: { childElements: baseChildren },\r\n\t        ownAttributes: ['begin', 'href'].concat(conditionAndCore),\r\n\t    },\r\n\t    'ellipse': {\r\n\t        legalChildElements: { childElements: shapeChildren },\r\n\t        ownAttributes: ['cx', 'cy', 'rx', 'ry'].concat(shapeAttributes),\r\n\t    },\r\n\t    'feBlend': {\r\n\t        legalChildElements: { childElements: feChildren },\r\n\t        ownAttributes: ['in', 'in2', 'mode'].concat(feAttributes),\r\n\t    },\r\n\t    'feColorMatrix': {\r\n\t        legalChildElements: { childElements: feChildren },\r\n\t        ownAttributes: ['in', 'type', 'values'].concat(feAttributes),\r\n\t    },\r\n\t    'feComponentTransfer': {\r\n\t        legalChildElements: { childElements: transferFunctionElements.concat(baseChildren) },\r\n\t        ownAttributes: ['in'].concat(feAttributes),\r\n\t    },\r\n\t    'feComposite': {\r\n\t        legalChildElements: { childElements: feChildren },\r\n\t        ownAttributes: ['in', 'in2', 'operator', 'k1', 'k2', 'k3', 'k4'].concat(feAttributes),\r\n\t    },\r\n\t    'feConvolveMatrix': {\r\n\t        legalChildElements: { childElements: feChildren },\r\n\t        ownAttributes: ['in', 'order', 'kernelMatrix', 'divisor', 'bias', 'targetX', 'targetY', 'edgeMode', 'kernelUnitLength', 'preserveAlpha'].concat(feAttributes),\r\n\t    },\r\n\t    'feDiffuseLighting': {\r\n\t        legalChildElements: { childElements: baseChildren.concat(lightSourceElements) },\r\n\t        ownAttributes: ['in', 'surfaceScale', 'diffuseConstant', 'kernelUnitLength'].concat(feAttributes),\r\n\t    },\r\n\t    'feDisplacementMap': {\r\n\t        legalChildElements: { childElements: feChildren },\r\n\t        ownAttributes: ['in', 'in2', 'scale', 'xChannelSelector', 'yChannelSelector'].concat(feAttributes),\r\n\t    },\r\n\t    'feDistantLight': {\r\n\t        legalChildElements: { childElements: feChildren },\r\n\t        ownAttributes: ['azimuth', 'elevation'].concat(coreAttributes),\r\n\t    },\r\n\t    'feFlood': {\r\n\t        legalChildElements: { childElements: feChildren },\r\n\t        ownAttributes: feAttributes,\r\n\t    },\r\n\t    'feFuncA': {\r\n\t        legalChildElements: { childElements: feChildren },\r\n\t        ownAttributes: feFuncAttributes,\r\n\t    },\r\n\t    'feFuncB': {\r\n\t        legalChildElements: { childElements: feChildren },\r\n\t        ownAttributes: feFuncAttributes,\r\n\t    },\r\n\t    'feFuncG': {\r\n\t        legalChildElements: { childElements: feChildren },\r\n\t        ownAttributes: feFuncAttributes,\r\n\t    },\r\n\t    'feFuncR': {\r\n\t        legalChildElements: { childElements: feChildren },\r\n\t        ownAttributes: feFuncAttributes,\r\n\t    },\r\n\t    'feGaussianBlur': {\r\n\t        legalChildElements: { childElements: feChildren },\r\n\t        ownAttributes: ['in', 'stdDeviation', 'edgeMode'].concat(feAttributes),\r\n\t    },\r\n\t    'feImage': {\r\n\t        legalChildElements: { childElements: ['animate', 'animateTransform', 'set'].concat(baseChildren) },\r\n\t        ownAttributes: ['externalResourcesRequired', 'preserveAspectRatio', 'xlink:href', 'href', 'crossorigin'].concat(feAttributes),\r\n\t    },\r\n\t    'feMerge': {\r\n\t        legalChildElements: { childElements: ['feMergeNode'].concat(baseChildren) },\r\n\t        ownAttributes: feAttributes,\r\n\t    },\r\n\t    'feMergeNode': {\r\n\t        legalChildElements: { childElements: feChildren },\r\n\t        ownAttributes: ['in'].concat(coreAttributes),\r\n\t    },\r\n\t    'feMorphology': {\r\n\t        legalChildElements: { childElements: feChildren },\r\n\t        ownAttributes: ['in', 'operator', 'radius'].concat(feAttributes),\r\n\t    },\r\n\t    'feOffset': {\r\n\t        legalChildElements: { childElements: feChildren },\r\n\t        ownAttributes: ['in', 'dx', 'dy'].concat(feAttributes),\r\n\t    },\r\n\t    'fePointLight': {\r\n\t        legalChildElements: { childElements: feChildren },\r\n\t        ownAttributes: ['x', 'y', 'z'].concat(coreAttributes),\r\n\t    },\r\n\t    'feSpecularLighting': {\r\n\t        legalChildElements: { childElements: baseChildren.concat(lightSourceElements) },\r\n\t        ownAttributes: ['in', 'surfaceScale', 'specularConstant', 'specularExponent', 'kernelUnitLength'].concat(feAttributes),\r\n\t    },\r\n\t    'feSpotLight': {\r\n\t        legalChildElements: { childElements: feChildren },\r\n\t        ownAttributes: ['x', 'y', 'z'].concat(coreAttributes),\r\n\t    },\r\n\t    'feTile': {\r\n\t        legalChildElements: { childElements: feChildren },\r\n\t        ownAttributes: ['in'].concat(feAttributes),\r\n\t    },\r\n\t    'feTurbulence': {\r\n\t        legalChildElements: { childElements: feChildren },\r\n\t        ownAttributes: ['baseFrequency', 'numOctaves', 'seed', 'stitchTiles', 'type'].concat(feAttributes),\r\n\t    },\r\n\t    'filter': {\r\n\t        legalChildElements: { childElements: feChildren.concat(filterPrimitiveElements) },\r\n\t        ownAttributes: ['externalResourcesRequired', 'filterUnits', 'primitiveUnits'].concat(coreAttributes, rectAttributes),\r\n\t    },\r\n\t    'foreignObject': {\r\n\t        legalChildElements: { any: true, childElements: [] },\r\n\t        ownAttributes: rectAttributes.concat(conditionAndCore),\r\n\t    },\r\n\t    'g': {\r\n\t        legalChildElements: { childElements: globalChildren },\r\n\t        ownAttributes: conditionAndCore,\r\n\t    },\r\n\t    'iframe': {\r\n\t        legalChildElements: { childElements: [] },\r\n\t        ownAttributes: [],\r\n\t    },\r\n\t    'image': {\r\n\t        legalChildElements: { childElements: ['clipPath', 'mask', 'style'].concat(animationElements, baseChildren) },\r\n\t        ownAttributes: ['preserveAspectRatio', 'href', 'crossorigin'].concat(conditionAndCore, deprecatedXlinkAttributes, rectAttributes),\r\n\t    },\r\n\t    'line': {\r\n\t        legalChildElements: { childElements: shapeChildren },\r\n\t        ownAttributes: ['x1', 'y1', 'x2', 'y2'].concat(shapeAttributes),\r\n\t    },\r\n\t    'linearGradient': {\r\n\t        legalChildElements: { childElements: gradientChildren },\r\n\t        ownAttributes: ['x1', 'y1', 'x2', 'y2', 'gradientUnits', 'gradientTransform', 'spreadMethod', 'href'].concat(coreAttributes, deprecatedXlinkAttributes),\r\n\t    },\r\n\t    'marker': {\r\n\t        legalChildElements: { childElements: globalChildren },\r\n\t        ownAttributes: ['viewBox', 'preserveAspectRatio', 'refX', 'refY', 'markerUnits', 'markerWidth', 'markerHeight', 'orient'].concat(coreAttributes),\r\n\t    },\r\n\t    'mask': {\r\n\t        legalChildElements: { childElements: ['a', 'clipPath', 'cursor', 'filter', 'foreignObject', 'image', 'marker', 'mask', 'pattern', 'style', 'switch', 'view', 'text'].concat(animationElements, baseChildren, shapeElements, structuralElements, gradientElements) },\r\n\t        ownAttributes: ['maskUnits', 'maskContentUnits'].concat(rectAttributes, conditionAndCore),\r\n\t    },\r\n\t    'metadata': {\r\n\t        containTextNode: true,\r\n\t        legalChildElements: { any: true, childElements: [] },\r\n\t        ownAttributes: coreAttributes,\r\n\t    },\r\n\t    'mpath': {\r\n\t        legalChildElements: { childElements: baseChildren },\r\n\t        ownAttributes: ['href'].concat(coreAttributes),\r\n\t    },\r\n\t    'path': {\r\n\t        legalChildElements: { childElements: shapeChildren },\r\n\t        ownAttributes: ['d'].concat(shapeAttributes),\r\n\t    },\r\n\t    'pattern': {\r\n\t        legalChildElements: { childElements: globalChildren },\r\n\t        ownAttributes: ['viewBox', 'preserveAspectRatio', 'patternUnits', 'patternContentUnits', 'patternTransform', 'href'].concat(coreAttributes, deprecatedXlinkAttributes, rectAttributes),\r\n\t    },\r\n\t    'polygon': {\r\n\t        legalChildElements: { childElements: shapeChildren },\r\n\t        ownAttributes: ['points'].concat(shapeAttributes),\r\n\t    },\r\n\t    'polyline': {\r\n\t        legalChildElements: { childElements: shapeChildren },\r\n\t        ownAttributes: ['points'].concat(shapeAttributes),\r\n\t    },\r\n\t    'radialGradient': {\r\n\t        legalChildElements: { childElements: gradientChildren },\r\n\t        ownAttributes: ['cx', 'cy', 'r', 'fx', 'fy', 'fr', 'gradientUnits', 'gradientTransform', 'spreadMethod', 'href'].concat(coreAttributes, deprecatedXlinkAttributes),\r\n\t    },\r\n\t    'rect': {\r\n\t        legalChildElements: { childElements: shapeChildren },\r\n\t        ownAttributes: ['rx', 'ry'].concat(rectAttributes, shapeAttributes),\r\n\t    },\r\n\t    'script': {\r\n\t        containTextNode: true,\r\n\t        legalChildElements: { childElements: [] },\r\n\t        ownAttributes: ['type', 'href', 'crossorigin'].concat(coreAttributes, deprecatedXlinkAttributes),\r\n\t    },\r\n\t    'set': {\r\n\t        legalChildElements: { childElements: baseChildren },\r\n\t        ownAttributes: ['to', 'attributeName'].concat(conditionAndCore, animationTimingAttributes),\r\n\t        onlyAttr: ['fill'],\r\n\t    },\r\n\t    'stop': {\r\n\t        legalChildElements: { childElements: ['animate', 'script', 'set', 'style'] },\r\n\t        ownAttributes: ['path', 'offset'].concat(coreAttributes),\r\n\t    },\r\n\t    'style': {\r\n\t        containTextNode: true,\r\n\t        legalChildElements: { childElements: [] },\r\n\t        ownAttributes: ['type', 'media', 'title'].concat(coreAttributes),\r\n\t    },\r\n\t    'svg': {\r\n\t        legalChildElements: { childElements: globalChildren },\r\n\t        ownAttributes: ['viewBox', 'preserveAspectRatio', 'zoomAndPan', 'transform'].concat(conditionAndCore, rectAttributes),\r\n\t        onlyAttr: ['width', 'height'],\r\n\t    },\r\n\t    'switch': {\r\n\t        legalChildElements: { childElements: ['a', 'audio', 'canvas', 'foreignObject', 'g', 'iframe', 'image', 'svg', 'switch', 'text', 'use', 'video'].concat(animationElements, shapeElements) },\r\n\t        ownAttributes: conditionAndCore,\r\n\t    },\r\n\t    'symbol': {\r\n\t        legalChildElements: { childElements: globalChildren },\r\n\t        ownAttributes: ['preserveAspectRatio', 'viewBox', 'refX', 'refY'].concat(coreAttributes, rectAttributes),\r\n\t    },\r\n\t    'text': {\r\n\t        containTextNode: true,\r\n\t        legalChildElements: { childElements: ['a', 'clipPath', 'marker', 'mask', 'style'].concat(animationElements, baseChildren, paintServerElements, textContentChildElements) },\r\n\t        ownAttributes: ['lengthAdjust', 'x', 'y', 'dx', 'dy', 'rotate', 'textLength'].concat(conditionAndCore),\r\n\t    },\r\n\t    'textPath': {\r\n\t        containTextNode: true,\r\n\t        legalChildElements: { childElements: ['a', 'animate', 'clipPath', 'marker', 'mask', 'set', 'style', 'tspan'].concat(baseChildren, paintServerElements) },\r\n\t        ownAttributes: ['lengthAdjust', 'textLength', 'path', 'href', 'startOffset', 'method', 'spacing', 'side'].concat(conditionAndCore, deprecatedXlinkAttributes),\r\n\t    },\r\n\t    'title': {\r\n\t        containTextNode: true,\r\n\t        legalChildElements: { any: true, childElements: ['a', 'animate', 'set', 'style', 'tspan'].concat(baseChildren, paintServerElements) },\r\n\t        ownAttributes: coreAttributes,\r\n\t    },\r\n\t    'tspan': {\r\n\t        containTextNode: true,\r\n\t        legalChildElements: { childElements: ['tspan'] },\r\n\t        ownAttributes: ['lengthAdjust', 'x', 'y', 'dx', 'dy', 'rotate', 'textLength'].concat(conditionAndCore),\r\n\t    },\r\n\t    'unknown': {\r\n\t        legalChildElements: { any: true, childElements: [] },\r\n\t        ownAttributes: conditionAndCore,\r\n\t    },\r\n\t    'use': {\r\n\t        legalChildElements: { childElements: ['clipPath', 'mask', 'style'].concat(animationElements, baseChildren) },\r\n\t        ownAttributes: ['href'].concat(rectAttributes, conditionAndCore, deprecatedXlinkAttributes),\r\n\t    },\r\n\t    'video': {\r\n\t        legalChildElements: { childElements: [] },\r\n\t        ownAttributes: [],\r\n\t    },\r\n\t    'view': {\r\n\t        legalChildElements: { childElements: ['style'].concat(animationElements, baseChildren) },\r\n\t        ownAttributes: ['viewBox', 'preserveAspectRatio', 'zoomAndPan'].concat(coreAttributes),\r\n\t    },\r\n\t};\r\n\tconst undefTag = {\r\n\t    isUndef: true,\r\n\t    legalChildElements: {},\r\n\t    ownAttributes: [],\r\n\t};\r\n\tconst regularTag = new Proxy(_regularTag, {\r\n\t    get(obj, prop) {\r\n\t        return prop in obj ? obj[prop] : undefTag;\r\n\t    },\r\n\t});\n\n\tconst mixWhiteSpace = (str) => str.replace(/\\s+/g, ' ');\n\n\tconst clearTextNode = async (dom) => new Promise(resolve => {\r\n\t    const textNodes = dom.querySelectorAll(node => node.nodeType === svgVdom.NodeType.Text || node.nodeType === svgVdom.NodeType.CDATA);\r\n\t    // 移除所有可移除（父节点不支持文本内容）的文本节点，并对文本节点进行冗余空格清理\r\n\t    textNodes.forEach(node => {\r\n\t        const parentName = node.parentNode && node.parentNode.nodeName;\r\n\t        if (parentName && !regularTag[parentName].containTextNode) {\r\n\t            node.remove();\r\n\t        }\r\n\t        else {\r\n\t            node.textContent = mixWhiteSpace(node.textContent);\r\n\t        }\r\n\t    });\r\n\t    resolve();\r\n\t});\n\n\tconst combineText = (node, isScript = false) => {\r\n\t    let lastChild;\r\n\t    for (let i = node.childNodes.length; i--;) {\r\n\t        const cNode = node.childNodes[i];\r\n\t        if (cNode.nodeType !== svgVdom.NodeType.Text && cNode.nodeType !== svgVdom.NodeType.CDATA) {\r\n\t            cNode.remove();\r\n\t        }\r\n\t        else {\r\n\t            let text = mixWhiteSpace(cNode.textContent.trim());\r\n\t            if (cNode.nodeType === svgVdom.NodeType.Text) {\r\n\t                cNode.nodeType = svgVdom.NodeType.CDATA;\r\n\t            }\r\n\t            if (!lastChild) {\r\n\t                lastChild = cNode;\r\n\t            }\r\n\t            else {\r\n\t                if (isScript && text.slice(-1) !== ';') {\r\n\t                    text += ';';\r\n\t                }\r\n\t                lastChild.textContent = `${text}${lastChild.textContent}`.trim();\r\n\t                cNode.remove();\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t};\n\n\t// 合并多个 script 标签，并将内容合并为一个子节点\r\n\tconst combineScript = async (dom) => new Promise(resolve => {\r\n\t    let firstScript;\r\n\t    const scripts = dom.querySelectorAll('script');\r\n\t    scripts.forEach(node => {\r\n\t        const type = node.getAttribute('type');\r\n\t        if (type && !/^(?:application|text)\\/(?:javascript|ecmascript)$/.test(type)) {\r\n\t            node.remove();\r\n\t            return;\r\n\t        }\r\n\t        if (firstScript) {\r\n\t            firstScript.appendChild(node.childNodes);\r\n\t            node.remove();\r\n\t        }\r\n\t        else {\r\n\t            firstScript = node;\r\n\t        }\r\n\t    });\r\n\t    if (firstScript) {\r\n\t        combineText(firstScript, true);\r\n\t        const childNodes = firstScript.childNodes;\r\n\t        if (childNodes.length !== 1 || !childNodes[0].textContent) {\r\n\t            // 如果内容为空，则移除 script 节点\r\n\t            firstScript.remove();\r\n\t        }\r\n\t        else {\r\n\t            const textContent = childNodes[0].textContent;\r\n\t            if (!textContent.includes('<')) {\r\n\t                // 如果没有危险代码，则由 CDATA 转为普通文本类型\r\n\t                childNodes[0].nodeType = svgVdom.NodeType.Text;\r\n\t            }\r\n\t            if (textContent.slice(-1) === ';') {\r\n\t                // 移除尾分号\r\n\t                childNodes[0].textContent = childNodes[0].textContent.slice(0, -1);\r\n\t            }\r\n\t            // 把 script 标签插入到最后\r\n\t            dom.querySelector('svg').appendChild(firstScript);\r\n\t        }\r\n\t    }\r\n\t    resolve();\r\n\t});\n\n\t// 用于属性合法性验证的枚举类型（此处存储方便直接转换为正则的字符串形式）\r\n\tconst calcMode = 'discrete|linear|paced|spline';\r\n\tconst units = 'userSpaceOnUse|objectBoundingBox';\r\n\tconst crossOrigin = 'anonymous|use-credentials';\r\n\tconst dur = 'media|indefinite';\r\n\tconst edgeMode = 'duplicate|wrap|none';\r\n\tconst inVal = 'SourceGraphic|SourceAlpha|BackgroundImage|BackgroundAlpha|FillPaint|StrokePaint';\r\n\tconst lengthAdjust = 'spacing|spacingAndGlyphs';\r\n\tconst markerUnit = 'strokeWidth|userSpaceOnUse';\r\n\tconst method = 'align|stretch';\r\n\tconst blendMode = 'normal|multiply|screen|overlay|darken|lighten|color-dodge|color-burn|hard-light|soft-light|difference|exclusion|hue|saturation|color|luminosity';\r\n\tconst operater = 'over|in|out|atop|xor|lighter|arithmetic';\r\n\tconst operater1 = 'erode|dilate';\r\n\tconst orient = 'auto|auto-start-reverse';\r\n\tconst alignX = 'left|center|right';\r\n\tconst alignY = 'top|center|bottom';\r\n\tconst referrer = 'no-referrer|no-referrer-when-downgrade|same-origin|origin|strict-origin|origin-when-cross-origin|strict-origin-when-cross-origin|unsafe-url';\r\n\tconst restart = 'always|whenNotActive|never';\r\n\tconst spreadMethod = 'pad|reflect|repeat';\r\n\tconst target = '_self|_parent|_top|_blank';\r\n\tconst animateTransformType = 'translate|scale|rotate|skewX|skewY';\r\n\tconst feColorMatrixType = 'matrix|saturate|hueRotate|luminanceToAlpha';\r\n\tconst feFuncType = 'identity|table|discrete|linear|gamma';\r\n\tconst feTurbulenceType = 'fractalNoise|turbulence';\r\n\tconst channel = 'R|G|B|A';\r\n\tconst isolationMode = 'auto|isolate';\r\n\tconst animateFill = 'freeze|remove';\r\n\t// 下面是 properties\r\n\tconst CSSDefault = 'initial|inherit|unset|revert';\r\n\tconst alignmentBaseline = 'auto|baseline|before-edge|text-before-edge|middle|central|after-edge|text-after-edge|ideographic|alphabetic|hanging|mathematical';\r\n\tconst baselineShift = 'baseline|sub|super';\r\n\tconst clipPath = 'border-box|padding-box|content-box|margin-box|fill-box|stroke-box|view-box';\r\n\tconst nonzeroEvenodd = 'nonzero|evenodd';\r\n\tconst colorKeyWords = 'currentColor|transparent';\r\n\tconst x11Colors = 'aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen';\r\n\tconst systemColor = 'ActiveBorder|ActiveCaption|AppWorkspace|Background|ButtonFace|ButtonHighlight|ButtonShadow|ButtonText|CaptionText|GrayText|Highlight|HighlightText|InactiveBorder|InactiveCaption|InactiveCaptionText|InfoBackground|InfoText|Menu|MenuText|Scrollbar|ThreeDDarkShadow|ThreeDFace|ThreeDHighlight|ThreeDLightShadow|ThreeDShadow|Window|WindowFrame|WindowText';\r\n\tconst colorInterpolation = 'auto|sRGB|linearRGB';\r\n\tconst colorRendering = 'auto|optimizeSpeed|optimizeQuality';\r\n\tconst direction = 'ltr|rtl';\r\n\tconst display = 'inline|block|list-item|run-in|compact|marker|table|inline-table|table-row-group|table-header-group|table-footer-group|table-row|table-column-group|table-column|table-cell|table-caption|none';\r\n\tconst dominantBaseline = 'auto|use-script|no-change|reset-size|ideographic|alphabetic|hanging|mathematical|central|middle|text-after-edge|text-before-edge';\r\n\tconst paintKeywords = 'context-fill|context-stroke';\r\n\tconst absoluteSize = 'xx-small|x-small|small|medium|large|x-large|xx-large';\r\n\tconst relativeSize = 'larger|smaller';\r\n\tconst fontStretch = 'normal|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded';\r\n\tconst fontStyle = 'normal|italic|oblique';\r\n\t// font variant\r\n\tconst commonLigValues = 'common-ligatures|no-common-ligatures';\r\n\tconst discretionaryLigValues = 'discretionary-ligatures|no-discretionary-ligatures';\r\n\tconst historicalLigValues = 'historical-ligatures|no-historical-ligatures';\r\n\tconst contextualAltValues = 'contextual|no-contextual';\r\n\tconst capsValues = 'small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps';\r\n\tconst numericFigureValues = 'lining-nums|oldstyle-nums';\r\n\tconst numericSpacingValues = 'proportional-nums|tabular-nums';\r\n\tconst numericFractionValues = 'diagonal-fractions|stacked-fractions';\r\n\tconst eastAsianVariantValues = 'jis78|jis83|jis90|jis04|simplified|traditional';\r\n\tconst eastAsianWidthValues = 'full-width|proportional-width';\r\n\tconst fontWeight = 'normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900';\r\n\tconst overflow = 'visible|hidden|scroll|auto';\r\n\tconst pointerEvents = 'bounding-box|visiblePainted|visibleFill|visibleStroke|visible|painted|fill|stroke|all|none';\r\n\tconst shapeRendering = 'auto|optimizeSpeed|crispEdges|geometricPrecision';\r\n\tconst strokeLinecap = 'butt|round|square';\r\n\tconst strokeLinejoin = 'miter|miter-clip|round|bevel|arcs';\r\n\tconst textAnchor = 'start|middle|end';\r\n\tconst textRendering = 'auto|optimizeSpeed|optimizeLegibility|geometricPrecision';\r\n\tconst unicodeBidi = 'normal|embed|isolate|bidi-override|isolate-override|plaintext';\r\n\tconst visibility = 'visible|hidden|collapse';\r\n\tconst writingMode = 'lr|lr-tb|rl|rl-tb|tb|tb-rl';\r\n\tconst writingModeCSS3 = 'horizontal-tb|vertical-rl|vertical-lr';\n\n\t// 符合官方定义的 token\r\n\t// https://drafts.csswg.org/css-syntax-3\r\n\t// 是否支持 unicode\r\n\tlet supportUnicode = true;\r\n\ttry {\r\n\t    supportUnicode = /\\u{20BB7}/u.test('𠮷');\r\n\t}\r\n\tcatch {\r\n\t    supportUnicode = false;\r\n\t}\r\n\tconst uModifier = supportUnicode ? 'u' : '';\r\n\t// definition\r\n\tconst commaWsp = '(?:\\\\s*,\\\\s*|\\\\s*)';\r\n\tconst semi = '\\\\s*;\\\\s*';\r\n\tconst paren = '\\\\s*\\\\(\\\\s*';\r\n\tconst rParen = '\\\\s*\\\\)';\r\n\t// name token\r\n\t// https://www.w3.org/TR/xml/#NT-Name\r\n\tconst NameStartChar = `:A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD${supportUnicode ? '\\\\u{10000}-\\\\u{EFFFF}' : ''}`;\r\n\tconst NameChar = `${NameStartChar}\\\\-\\\\.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040`;\r\n\tconst Name = `[${NameStartChar}][${NameChar}]*`;\r\n\t// css syntax\r\n\t// https://drafts.csswg.org/css-syntax-3/#non-ascii-code-point\r\n\tconst cssNameStartChar = `A-Za-z_\\\\u0080-\\\\uFFFF${supportUnicode ? '\\\\u{10000}-\\\\u{EFFFF}' : ''}`;\r\n\tconst cssNameChar = `${cssNameStartChar}\\\\-0-9`;\r\n\tconst cssName = `[${cssNameStartChar}][${cssNameChar}]*`;\r\n\tconst nameFullMatch = new RegExp(`^${Name}$`, uModifier);\r\n\tconst cssNameFullMatch = new RegExp(`^${cssName}$`, uModifier);\r\n\tconst cssNameSpaceSeparatedFullMatch = new RegExp(`^${cssName}(?:\\\\s+${cssName})*$`, uModifier);\r\n\t// number token\r\n\t// https://www.w3.org/TR/css3-values/#length-value\r\n\t// https://www.w3.org/TR/css-syntax-3/#number-token-diagram\r\n\t// https://www.w3.org/TR/css-syntax-3/#percentage-token-diagram\r\n\tconst numberBase = '(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?';\r\n\tconst numberPattern = `[+-]?${numberBase}`;\r\n\tconst zero = '[+-]?(?:0+\\\\.)?0+(?:[eE][+-]?\\\\d+)?';\r\n\tconst nonNegativeFullMatch = new RegExp(`^\\\\+?${numberBase}$`);\r\n\tconst numberSequence = `${numberPattern}(?:${commaWsp}${numberPattern})*`;\r\n\tconst numberFullMatch = new RegExp(`^${numberPattern}$`);\r\n\tconst numberGlobal = new RegExp(numberPattern, 'g');\r\n\tconst numberOptionalFullMatch = new RegExp(`^${numberPattern}(?:\\\\s*${numberPattern})?$`);\r\n\tconst numberListFullMatch = new RegExp(`^${numberSequence}$`);\r\n\tconst numberSemiSepatatedFullMatch = new RegExp(`^${numberPattern}(?:${semi}${numberPattern})*(?:${semi})?$`);\r\n\tconst integerFullMatch = /^[+-]?(?:\\d+|(?:\\d*\\.)?\\d+[eE][+-]?\\d+)$/;\r\n\tconst pureNumOrWithPx = new RegExp(`^${numberPattern}(?:px)?$`);\r\n\tconst pureNumOrWithPxList = new RegExp(`^${numberPattern}(?:px)?(?:${commaWsp}${numberPattern}(?:px)?)*$`);\r\n\t// https://www.w3.org/TR/css-values-3/#angle-value\r\n\tconst angel = 'deg|grad|rad|turn';\r\n\tconst angelFullMatch = new RegExp(`^${numberPattern}(?:${angel})?$`);\r\n\tconst controlPoint = `${numberPattern}${commaWsp}${numberPattern}${commaWsp}${numberPattern}${commaWsp}${numberPattern}`;\r\n\tconst controlPointsFullMatch = new RegExp(`^${controlPoint}(?:${semi}${controlPoint})*(?:${semi})?$`);\r\n\tconst Units = '(?:em|ex|ch|rem|vx|vw|vmin|vmax|cm|mm|Q|in|pt|pc|px)';\r\n\tconst percentageFullMatch = new RegExp(`^${numberPattern}%$`);\r\n\tconst length = `${numberPattern}${Units}?`;\r\n\tconst lengthPercentage = `(?:${length}|${numberPattern}%)`;\r\n\tconst lengthPair = `${length}${commaWsp}${length}`;\r\n\tconst lengthFullMatch = new RegExp(`^${length}$`);\r\n\tconst lengthPairFullMatch = new RegExp(`^${lengthPair}$`);\r\n\tconst lengthPairListFullMatch = new RegExp(`^${lengthPair}(?:${semi}${lengthPair})*$`);\r\n\tconst lengthPercentageFullMatch = new RegExp(`^${lengthPercentage}$`);\r\n\tconst lengthPercentageListFullMatch = new RegExp(`^${lengthPercentage}(?:${commaWsp}${lengthPercentage})*$`);\r\n\tconst viewBoxFullMatch = new RegExp(`^${controlPoint}$`);\r\n\t// time token\r\n\t// https://svgwg.org/specs/animations/#BeginValueListSyntax\r\n\tconst timeCountValue = '\\\\d+(?:\\\\.\\\\d+)?(?:h|min|s|ms)?';\r\n\tconst timeValue = '(?:\\\\d+:)?[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?';\r\n\tconst clockValue = `(?:${timeCountValue}|${timeValue})`;\r\n\tconst offsetValue = `(?:\\\\s*[+-]\\\\s*)?${clockValue}`;\r\n\tconst syncbaseValue = `${Name}\\\\.(?:begin|end)(?:${offsetValue})?`;\r\n\tconst eventValue = `(?:${Name}\\\\.)?(?:${eventAttributes.join('|')})(?:${offsetValue})?`;\r\n\tconst repeatValue = `(?:${Name}\\\\.)?repeat\\\\(\\\\d+\\\\)(?:${offsetValue})?`;\r\n\tconst accessKeyValue = `accessKey\\\\(.\\\\)(?:${offsetValue})?`;\r\n\tconst wallclockSyncValue = 'wallclock\\\\(\\\\d+\\\\)';\r\n\tconst timePattern = `(?:${offsetValue}|${syncbaseValue}|${eventValue}|${repeatValue}|${accessKeyValue}|${wallclockSyncValue}|indefinite)`;\r\n\tconst clockFullMatch = new RegExp(`^${clockValue}$`);\r\n\tconst timeListFullMatch = new RegExp(`^${timePattern}(\\\\s*;\\\\s*${timePattern})*$`, uModifier);\r\n\t// transform token\r\n\t// https://drafts.csswg.org/css-transforms/#svg-comma\r\n\tconst translate = `translate${paren}${numberPattern}(?:${commaWsp}?${numberPattern})?${rParen}`;\r\n\tconst scale = `scale${paren}${numberPattern}(?:${commaWsp}?${numberPattern})?${rParen}`;\r\n\tconst rotate = `rotate${paren}${numberPattern}(?:${commaWsp}?${numberPattern}${commaWsp}?${numberPattern})?${rParen}`;\r\n\tconst skewX = `skewX${paren}${numberPattern}${rParen}`;\r\n\tconst skewY = `skewY${paren}${numberPattern}${rParen}`;\r\n\tconst matrix = `matrix${paren}${numberPattern}(?:${commaWsp}?${numberPattern}){5}${rParen}`;\r\n\tconst transformListFullMatch = new RegExp(`^(?:\\\\s*(?:${translate}|${scale}|${rotate}|${skewX}|${skewY}|${matrix})\\\\s*)*$`);\r\n\t// uri token\r\n\t// http://www.ietf.org/rfc/rfc3986.txt\r\n\tconst URIFullMatch = /^(?:[^:/?#]+:)?(?:\\/\\/[^/?#]*)?(?:[^?#]*)(?:\\?[^#]*)?(?:#.*)?$/;\r\n\t// https://tools.ietf.org/html/bcp47#section-2.1\r\n\tconst langFullMatch = /^[a-zA-Z]{2,}(?:-[a-zA-Z0-9%]+)*$/;\r\n\t// https://drafts.csswg.org/css-syntax-3/#typedef-ident-token\r\n\tconst hexDigit = '0-9a-fA-F';\r\n\tconst newLine = '\\\\r\\\\n';\r\n\tconst escape = `\\\\\\\\(?:[^${hexDigit}${newLine}]|[${hexDigit}]{1,6}\\\\s?)`;\r\n\tconst indentToken = `(?:--|-?(?:[${cssNameStartChar}]|${escape}))(?:[${cssNameChar}]|${escape})*`;\r\n\tconst indentFullMatch = new RegExp(`^${indentToken}$`, uModifier);\r\n\t// https://svgwg.org/svg2-draft/paths.html#PathDataBNF\r\n\tconst pathZ = '[zZ]';\r\n\tconst pathMTo = `[mM]\\\\s*${numberSequence}`;\r\n\tconst pathTo = `[lLhHvVcCsSqQtTaA]\\\\s*${numberSequence}`;\r\n\tconst pathPattern = `(?:${pathMTo}|${pathZ}|${pathTo})`;\r\n\tconst pathFullMatch = new RegExp(`^${pathMTo}(?:${commaWsp}${pathPattern})*$`);\r\n\tconst preservAspectRatioFullMatch = /^(?:none|xMinYMin|xMidYMin|xMaxYMin|xMinYMid|xMidYMid|xMaxYMid|xMinYMax|xMidYMax|xMaxYMax)(?:\\s+(?:meet|slice))?$/;\r\n\t// IRI\r\n\tconst funcIRIToID = /^url\\(([\"']?)#(.+)\\1\\)$/;\r\n\tconst url = 'url\\\\([^\\\\)]+\\\\)';\r\n\tconst funcIRIFullMatch = new RegExp(`^${url}$`);\r\n\tconst IRIFullMatch = /^#(.+)$/;\r\n\tconst mediaTypeFullMatch = /^(?:image|audio|video|application|text|multipart|message)\\/[^/]+$/;\r\n\t// properties 相关\r\n\tconst lengthOrAuto = `(?:${length}|auto)`;\r\n\tconst clipPathRect = new RegExp(`^rect\\\\(\\\\s*${lengthOrAuto}${commaWsp}${lengthOrAuto}${commaWsp}${lengthOrAuto}${commaWsp}${lengthOrAuto}\\\\s*\\\\)$`);\r\n\t// TODO 这个正则不够严谨，未来考虑 use-func\r\n\tconst basicShapeFullMatch = /^(?:inset|circle|ellipse|polygon)\\([^()]+\\)$/;\r\n\t// color\r\n\tconst rgb = `rgba?${paren}(?:${numberPattern}(%?)${commaWsp}${numberPattern}\\\\1${commaWsp}${numberPattern}\\\\1(?:${commaWsp}${numberPattern}%?)?)${rParen}`;\r\n\tconst hsl = `hsla?${paren}${numberPattern}${commaWsp}${numberPattern}%${commaWsp}${numberPattern}%(?:${commaWsp}${numberPattern}%?)?${rParen}`;\r\n\tconst hexColor = '#(?:[0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})';\r\n\tconst colorFullMatch = new RegExp(`^(?:${rgb}|${hsl}|${hexColor})$`);\r\n\tconst iccColor = `icc-color${paren}${Name}(?:${commaWsp}${numberPattern})+${rParen}`;\r\n\tconst stopColorFullMatch = new RegExp(`^(?:${rgb}|${hsl}|${hexColor}|${colorKeyWords}|${systemColor}|${x11Colors})(?:${iccColor})?$`, uModifier);\r\n\tconst cursorStr = 'auto|default|none|context-menu|help|pointer|progress|wait|cell|crosshair|text|vertical-text|alias|copy|move|no-drop|not-allowed|grab|grabbing|e-resize|n-resize|ne-resize|nw-resize|s-resize|se-resize|sw-resize|w-resize|ew-resize|ns-resize|nesw-resize|nwse-resize|col-resize|row-resize|all-scroll|zoom-in|zoom-out';\r\n\tconst cursorFullMatch = new RegExp(`^(?:${url}\\\\s*(?:${numberPattern}\\\\s*${numberPattern})?${commaWsp})*(?:${cursorStr})$`);\r\n\t// filter\r\n\tconst blur = `blur${paren}(?:${length})?${rParen}`;\r\n\tconst filterFuncNumberPercentage = `(?:brightness|contrast|grayscale|invert|opacity|saturate|sepia)${paren}(?:${numberPattern}%?)?${rParen}`;\r\n\tconst dropShadow = `drop-shadow${paren}(?:(?:${rgb}|${hsl}|${hexColor}|${colorKeyWords}|${systemColor}|${x11Colors})?${commaWsp}(?:${length}|${numberPattern}%){2,3})?${rParen}`;\r\n\tconst hueRotate = `hue-rotate${paren}(?:${angel}|${zero})?${rParen}`;\r\n\tconst filterFunc = `(?:${blur}|${filterFuncNumberPercentage}|${dropShadow}|${hueRotate})`;\r\n\tconst filterListFullMatch = new RegExp(`(?:(?:${filterFunc}|${url})${commaWsp})+`);\r\n\tconst strokeDasharrayFullMatch = new RegExp(`^${lengthPercentage}(?:${commaWsp}${lengthPercentage})+$`);\r\n\tconst vectorEffectFullMatch = /^(?:non-scaling-stroke|non-scaling-size|non-rotation|fixed-position)+(?:viewport|screen)?$/;\n\n\tconst shapeAndText = shapeElements.concat(textContentElements);\r\n\tconst viewport = ['pattern', 'marker'].concat(newViewportsElements);\r\n\tconst useContainerGraphics = ['use'].concat(containerElements, graphicsElements);\r\n\tconst colorApply = ['animate'].concat(useContainerGraphics, gradientElements);\r\n\tconst colorValue = [{\r\n\t        type: 'reg',\r\n\t        value: colorFullMatch,\r\n\t    }, {\r\n\t        type: 'enum',\r\n\t        value: systemColor,\r\n\t    }, {\r\n\t        type: 'enum',\r\n\t        value: x11Colors,\r\n\t    }, {\r\n\t        type: 'enum',\r\n\t        value: colorKeyWords,\r\n\t    }];\r\n\tconst paintValue = colorValue.concat([{\r\n\t        type: 'string',\r\n\t        value: 'none',\r\n\t    }, {\r\n\t        type: 'enum',\r\n\t        value: paintKeywords,\r\n\t    }, {\r\n\t        type: 'reg',\r\n\t        value: funcIRIFullMatch,\r\n\t    }]);\r\n\tconst opacityValue = [{\r\n\t        type: 'reg',\r\n\t        value: percentageFullMatch,\r\n\t    }, {\r\n\t        type: 'reg',\r\n\t        value: numberFullMatch,\r\n\t    }];\r\n\tconst markerValue = [{\r\n\t        type: 'string',\r\n\t        value: 'none',\r\n\t    }, {\r\n\t        type: 'reg',\r\n\t        value: funcIRIFullMatch,\r\n\t    }];\r\n\tconst _regularAttr = {\r\n\t    'accumulate': {\r\n\t        name: 'accumulate',\r\n\t        legalValues: [{\r\n\t                type: 'string',\r\n\t                value: 'none',\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'sum',\r\n\t            }],\r\n\t        initValue: 'none',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'additive': {\r\n\t        name: 'additive',\r\n\t        legalValues: [{\r\n\t                type: 'string',\r\n\t                value: 'replace',\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'sum',\r\n\t            }],\r\n\t        initValue: 'replace',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'amplitude': {\r\n\t        name: 'amplitude',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: '1',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'attributeName': {\r\n\t        name: 'attributeName',\r\n\t        legalValues: [{\r\n\t                type: 'attr',\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'azimuth': {\r\n\t        name: 'azimuth',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: '0',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'baseFrequency': {\r\n\t        name: 'baseFrequency',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberOptionalFullMatch,\r\n\t            }],\r\n\t        initValue: '0',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'begin': {\r\n\t        name: 'begin',\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: timeListFullMatch,\r\n\t            }],\r\n\t        initValue: '0s',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'bias': {\r\n\t        name: 'bias',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: '0',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'by': {\r\n\t        name: 'by',\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPairFullMatch,\r\n\t                tag: ['animateMotion'],\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'calcMode': {\r\n\t        name: 'calcMode',\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: calcMode,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'class': {\r\n\t        name: 'class',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: cssNameSpaceSeparatedFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'clipPathUnits': {\r\n\t        name: 'clipPathUnits',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: units,\r\n\t            }],\r\n\t        initValue: 'userSpaceOnUse',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'crossorigin': {\r\n\t        name: 'crossorigin',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: crossOrigin,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'cx': {\r\n\t        name: 'cx',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }],\r\n\t        initValue: [{\r\n\t                val: '50%',\r\n\t                tag: ['radialGradient'],\r\n\t            }, {\r\n\t                val: '0',\r\n\t                tag: ['circle', 'ellipse'],\r\n\t            }],\r\n\t        applyTo: ['circle', 'ellipse'],\r\n\t    },\r\n\t    'cy': {\r\n\t        name: 'cy',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }],\r\n\t        initValue: [{\r\n\t                val: '50%',\r\n\t                tag: ['radialGradient'],\r\n\t            }, {\r\n\t                val: '0',\r\n\t                tag: ['circle', 'ellipse'],\r\n\t            }],\r\n\t        applyTo: ['circle', 'ellipse'],\r\n\t    },\r\n\t    'd': {\r\n\t        name: 'd',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: pathFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'diffuseConstant': {\r\n\t        name: 'diffuseConstant',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: '1',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'divisor': {\r\n\t        name: 'divisor',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'download': {\r\n\t        name: 'download',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: nameFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'dur': {\r\n\t        name: 'dur',\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: clockFullMatch,\r\n\t            }, {\r\n\t                type: 'enum',\r\n\t                value: dur,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'dx': {\r\n\t        name: 'dx',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t                tag: ['feOffset', 'feDropShadow'],\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageListFullMatch,\r\n\t                tag: ['text', 'tspan'],\r\n\t            }],\r\n\t        initValue: [{\r\n\t                val: '2',\r\n\t                tag: ['feOffset', 'feDropShadow'],\r\n\t            }, {\r\n\t                val: '',\r\n\t                tag: ['tspan', 'text'],\r\n\t            }],\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'dy': {\r\n\t        name: 'dy',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t                tag: ['feOffset', 'feDropShadow'],\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageListFullMatch,\r\n\t                tag: ['text', 'tspan'],\r\n\t            }],\r\n\t        initValue: [{\r\n\t                val: '2',\r\n\t                tag: ['feOffset', 'feDropShadow'],\r\n\t            }, {\r\n\t                val: '',\r\n\t                tag: ['tspan', 'text'],\r\n\t            }],\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'edgeMode': {\r\n\t        name: 'edgeMode',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: edgeMode,\r\n\t            }],\r\n\t        initValue: [{\r\n\t                val: 'duplicate',\r\n\t                tag: ['feConvolveMatrix'],\r\n\t            }, {\r\n\t                val: 'none',\r\n\t                tag: ['feGaussianBlur'],\r\n\t            }],\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'elevation': {\r\n\t        name: 'elevation',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: '0',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'end': {\r\n\t        name: 'end',\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: timeListFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'exponent': {\r\n\t        name: 'exponent',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: '1',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'filterUnits': {\r\n\t        name: 'filterUnits',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: units,\r\n\t            }],\r\n\t        initValue: 'objectBoundingBox',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'fr': {\r\n\t        name: 'fr',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }],\r\n\t        initValue: '0%',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'from': {\r\n\t        name: 'from',\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPairFullMatch,\r\n\t                tag: ['animateMotion'],\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'fx': {\r\n\t        name: 'fx',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'fy': {\r\n\t        name: 'fy',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'gradientTransform': {\r\n\t        name: 'gradientTransform',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: transformListFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'gradientUnits': {\r\n\t        name: 'gradientUnits',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: units,\r\n\t            }],\r\n\t        initValue: 'objectBoundingBox',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'height': {\r\n\t        name: 'height',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'auto',\r\n\t            }],\r\n\t        initValue: [{\r\n\t                val: '100%',\r\n\t                tag: filterPrimitiveElements.concat(['svg']),\r\n\t            }, {\r\n\t                val: '120%',\r\n\t                tag: ['filter', 'mask'],\r\n\t            }, {\r\n\t                val: '0',\r\n\t                tag: ['pattern', 'rect', 'foreignObject'],\r\n\t            }, {\r\n\t                val: 'auto',\r\n\t                tag: ['svg', 'image', 'rect', 'foreignObject'],\r\n\t            }],\r\n\t        applyTo: filterPrimitiveElements.concat(['filter', 'mask', 'pattern', 'svg', 'image', 'rect', 'foreignObject']),\r\n\t    },\r\n\t    'href': {\r\n\t        name: 'href',\r\n\t        animatable: true,\r\n\t        maybeIRI: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: URIFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'hreflang': {\r\n\t        name: 'hreflang',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: langFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'id': {\r\n\t        name: 'id',\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: nameFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'in': {\r\n\t        name: 'in',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: inVal,\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: indentFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'in2': {\r\n\t        name: 'in2',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: inVal,\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: indentFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'intercept': {\r\n\t        name: 'intercept',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: '0',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'isolation': {\r\n\t        name: 'isolation',\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: isolationMode,\r\n\t            }],\r\n\t        initValue: 'auto',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'k1': {\r\n\t        name: 'k1',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: '0',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'k2': {\r\n\t        name: 'k2',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: '0',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'k3': {\r\n\t        name: 'k3',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: '0',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'k4': {\r\n\t        name: 'k4',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: '0',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'kernelMatrix': {\r\n\t        name: 'kernelMatrix',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberListFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'kernelUnitLength': {\r\n\t        name: 'kernelUnitLength',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberOptionalFullMatch,\r\n\t            }],\r\n\t        initValue: '2 2',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'keyPoints': {\r\n\t        name: 'keyPoints',\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberSemiSepatatedFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'keySplines': {\r\n\t        name: 'keySplines',\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: controlPointsFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'keyTimes': {\r\n\t        name: 'keyTimes',\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberSemiSepatatedFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'lang': {\r\n\t        name: 'lang',\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: langFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'lengthAdjust': {\r\n\t        name: 'lengthAdjust',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: lengthAdjust,\r\n\t            }],\r\n\t        initValue: 'spacing',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'limitingConeAngle': {\r\n\t        name: 'limitingConeAngle',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'markerHeight': {\r\n\t        name: 'markerHeight',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }],\r\n\t        initValue: '3',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'markerUnits': {\r\n\t        name: 'markerUnits',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: markerUnit,\r\n\t            }],\r\n\t        initValue: 'strokeWidth',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'markerWidth': {\r\n\t        name: 'markerWidth',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }],\r\n\t        initValue: '3',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'maskContentUnits': {\r\n\t        name: 'maskContentUnits',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: units,\r\n\t            }],\r\n\t        initValue: 'userSpaceOnUse',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'maskUnits': {\r\n\t        name: 'maskUnits',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: units,\r\n\t            }],\r\n\t        initValue: 'objectBoundingBox',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'max': {\r\n\t        name: 'max',\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: clockFullMatch,\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'media',\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'media': {\r\n\t        name: 'media',\r\n\t        legalValues: [],\r\n\t        initValue: [{\r\n\t                val: 'all',\r\n\t                tag: ['css'],\r\n\t            }],\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'method': {\r\n\t        name: 'method',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: method,\r\n\t            }],\r\n\t        initValue: 'align',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'min': {\r\n\t        name: 'min',\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: clockFullMatch,\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'media',\r\n\t            }],\r\n\t        initValue: '0',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'mode': {\r\n\t        name: 'mode',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: blendMode,\r\n\t            }],\r\n\t        initValue: 'normal',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'numOctaves': {\r\n\t        name: 'numOctaves',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: integerFullMatch,\r\n\t            }],\r\n\t        initValue: '1',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'offset': {\r\n\t        name: 'offset',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: percentageFullMatch,\r\n\t                tag: ['stop'],\r\n\t            }],\r\n\t        initValue: '0',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'operator': {\r\n\t        name: 'operator',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: operater,\r\n\t                tag: ['feComposite'],\r\n\t            }, {\r\n\t                type: 'enum',\r\n\t                value: operater1,\r\n\t                tag: ['feMorphology'],\r\n\t            }],\r\n\t        initValue: [{\r\n\t                val: 'over',\r\n\t                tag: ['feComposite'],\r\n\t            }, {\r\n\t                val: 'erode',\r\n\t                tag: ['feMorphology'],\r\n\t            }],\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'order': {\r\n\t        name: 'order',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberOptionalFullMatch,\r\n\t            }],\r\n\t        initValue: '3',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'orient': {\r\n\t        name: 'orient',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: angelFullMatch,\r\n\t            }, {\r\n\t                type: 'enum',\r\n\t                value: orient,\r\n\t            }],\r\n\t        initValue: '0',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'path': {\r\n\t        name: 'path',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: pathFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'pathLength': {\r\n\t        name: 'pathLength',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'patternContentUnits': {\r\n\t        name: 'patternContentUnits',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: units,\r\n\t            }],\r\n\t        initValue: 'userSpaceOnUse',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'patternTransform': {\r\n\t        name: 'patternTransform',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: transformListFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'patternUnits': {\r\n\t        name: 'patternUnits',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: units,\r\n\t            }],\r\n\t        initValue: 'objectBoundingBox',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'ping': {\r\n\t        name: 'ping',\r\n\t        legalValues: [],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'playbackorder': {\r\n\t        name: 'playbackorder',\r\n\t        legalValues: [{\r\n\t                type: 'string',\r\n\t                value: 'forwardonly',\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'all',\r\n\t            }],\r\n\t        initValue: 'all',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'points': {\r\n\t        name: 'points',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberListFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'pointsAtX': {\r\n\t        name: 'pointsAtX',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: '0',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'pointsAtY': {\r\n\t        name: 'pointsAtY',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: '0',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'pointsAtZ': {\r\n\t        name: 'pointsAtZ',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: '0',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'preserveAlpha': {\r\n\t        name: 'preserveAlpha',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'string',\r\n\t                value: 'false',\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'true',\r\n\t            }],\r\n\t        initValue: 'false',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'preserveAspectRatio': {\r\n\t        name: 'preserveAspectRatio',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: preservAspectRatioFullMatch,\r\n\t            }],\r\n\t        initValue: [{\r\n\t                val: 'xMidYMid',\r\n\t                tag: ['canvas', 'feImage', 'image', 'marker', 'pattern', 'svg', 'symbol', 'view'],\r\n\t            }, {\r\n\t                val: 'xMidYMid meet',\r\n\t                tag: ['canvas', 'feImage', 'image', 'marker', 'pattern', 'svg', 'symbol', 'view'],\r\n\t            }],\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'primitiveUnits': {\r\n\t        name: 'primitiveUnits',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: units,\r\n\t            }],\r\n\t        initValue: 'userSpaceOnUse.',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'r': {\r\n\t        name: 'r',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }],\r\n\t        initValue: [{\r\n\t                val: '50%',\r\n\t                tag: ['radialGradient'],\r\n\t            }, {\r\n\t                val: '0',\r\n\t                tag: ['circle'],\r\n\t            }],\r\n\t        applyTo: ['circle'],\r\n\t    },\r\n\t    'radius': {\r\n\t        name: 'radius',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberOptionalFullMatch,\r\n\t            }],\r\n\t        initValue: '0',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'refX': {\r\n\t        name: 'refX',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }, {\r\n\t                type: 'enum',\r\n\t                value: alignX,\r\n\t            }],\r\n\t        initValue: [{\r\n\t                val: '0',\r\n\t                tag: ['marker'],\r\n\t            }],\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'refY': {\r\n\t        name: 'refY',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }, {\r\n\t                type: 'enum',\r\n\t                value: alignY,\r\n\t            }],\r\n\t        initValue: [{\r\n\t                val: '0',\r\n\t                tag: ['marker'],\r\n\t            }],\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'referrerpolicy': {\r\n\t        name: 'referrerpolicy',\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: referrer,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'rel': {\r\n\t        name: 'rel',\r\n\t        animatable: true,\r\n\t        legalValues: [],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'repeatCount': {\r\n\t        name: 'repeatCount',\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'indefinite',\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'repeatDur': {\r\n\t        name: 'repeatDur',\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: clockFullMatch,\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'indefinite',\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'requiredExtensions': {\r\n\t        name: 'requiredExtensions',\r\n\t        legalValues: [],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'restart': {\r\n\t        name: 'restart',\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: restart,\r\n\t            }],\r\n\t        initValue: 'always',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'result': {\r\n\t        name: 'result',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: cssNameFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'rotate': {\r\n\t        name: 'rotate',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberListFullMatch,\r\n\t                tag: ['text', 'tspan'],\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t                tag: ['animateMotion'],\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'auto',\r\n\t                tag: ['animateMotion'],\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'auto-reverse',\r\n\t                tag: ['animateMotion'],\r\n\t            }],\r\n\t        initValue: '0',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'rx': {\r\n\t        name: 'rx',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'auto',\r\n\t            }],\r\n\t        initValue: 'auto',\r\n\t        applyTo: ['ellipse', 'rect'],\r\n\t    },\r\n\t    'ry': {\r\n\t        name: 'ry',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'auto',\r\n\t            }],\r\n\t        initValue: 'auto',\r\n\t        applyTo: ['ellipse', 'rect'],\r\n\t    },\r\n\t    'scale': {\r\n\t        name: 'scale',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: '0',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'seed': {\r\n\t        name: 'seed',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: '0',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'side': {\r\n\t        name: 'side',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'string',\r\n\t                value: 'left',\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'right',\r\n\t            }],\r\n\t        initValue: 'left',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'slope': {\r\n\t        name: 'slope',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: '1',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'spacing': {\r\n\t        name: 'spacing',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'string',\r\n\t                value: 'auto',\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'exact',\r\n\t            }],\r\n\t        initValue: 'exact',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'specularConstant': {\r\n\t        name: 'specularConstant',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: '1',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'specularExponent': {\r\n\t        name: 'specularExponent',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: '1',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'spreadMethod': {\r\n\t        name: 'spreadMethod',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: spreadMethod,\r\n\t            }],\r\n\t        initValue: 'pad',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'startOffset': {\r\n\t        name: 'startOffset',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }],\r\n\t        initValue: '0',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'stdDeviation': {\r\n\t        name: 'stdDeviation',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberOptionalFullMatch,\r\n\t            }],\r\n\t        initValue: [{\r\n\t                val: '2',\r\n\t                tag: ['feDropShadow'],\r\n\t            }, {\r\n\t                val: '0',\r\n\t                tag: ['feGaussianBlur'],\r\n\t            }],\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'stitchTiles': {\r\n\t        name: 'stitchTiles',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'string',\r\n\t                value: 'stitch',\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'noStitch',\r\n\t            }],\r\n\t        initValue: 'noStitch',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'style': {\r\n\t        name: 'style',\r\n\t        legalValues: [],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'surfaceScale': {\r\n\t        name: 'surfaceScale',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: '1',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'systemLanguage': {\r\n\t        name: 'systemLanguage',\r\n\t        legalValues: [],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'tabindex': {\r\n\t        name: 'tabindex',\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: integerFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'tableValues': {\r\n\t        name: 'tableValues',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberListFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'target': {\r\n\t        name: 'target',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: nameFullMatch,\r\n\t            }, {\r\n\t                type: 'enum',\r\n\t                value: target,\r\n\t            }],\r\n\t        initValue: '_self',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'targetX': {\r\n\t        name: 'targetX',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: integerFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'targetY': {\r\n\t        name: 'targetY',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: integerFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'textLength': {\r\n\t        name: 'textLength',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'timelinebegin': {\r\n\t        name: 'timelinebegin',\r\n\t        legalValues: [{\r\n\t                type: 'string',\r\n\t                value: 'loadend',\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'loadbegin',\r\n\t            }],\r\n\t        initValue: 'loadend',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'title': {\r\n\t        name: 'title',\r\n\t        legalValues: [],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'to': {\r\n\t        name: 'to',\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPairFullMatch,\r\n\t                tag: ['animateMotion'],\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'transform': {\r\n\t        name: 'transform',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: transformListFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: useContainerGraphics,\r\n\t    },\r\n\t    'type': {\r\n\t        name: 'type',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: animateTransformType,\r\n\t                tag: ['animateTransform'],\r\n\t            }, {\r\n\t                type: 'enum',\r\n\t                value: feColorMatrixType,\r\n\t                tag: ['feColorMatrix'],\r\n\t            }, {\r\n\t                type: 'enum',\r\n\t                value: feFuncType,\r\n\t                tag: ['feFuncA', 'feFuncB', 'feFuncG', 'feFuncR'],\r\n\t            }, {\r\n\t                type: 'enum',\r\n\t                value: feTurbulenceType,\r\n\t                tag: ['feTurbulence'],\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: mediaTypeFullMatch,\r\n\t                tag: ['script'],\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: mediaTypeFullMatch,\r\n\t                tag: ['style'],\r\n\t            }],\r\n\t        initValue: [{\r\n\t                val: 'translate',\r\n\t                tag: ['animateTransform'],\r\n\t            }, {\r\n\t                val: 'matrix',\r\n\t                tag: ['feColorMatrix'],\r\n\t            }, {\r\n\t                val: 'identity',\r\n\t                tag: ['feFuncA', 'feFuncB', 'feFuncG', 'feFuncR'],\r\n\t            }, {\r\n\t                val: 'turbulence',\r\n\t                tag: ['feTurbulence'],\r\n\t            }, {\r\n\t                val: 'application/ecmascript',\r\n\t                tag: ['script'],\r\n\t            }, {\r\n\t                val: 'text/css',\r\n\t                tag: ['style'],\r\n\t            }],\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'values': {\r\n\t        name: 'values',\r\n\t        animatable: true,\r\n\t        maybeAccurateNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberListFullMatch,\r\n\t                tag: ['feColorMatrix'],\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: lengthPairListFullMatch,\r\n\t                tag: ['animateMotion'],\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'viewBox': {\r\n\t        name: 'viewBox',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: viewBoxFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'width': {\r\n\t        name: 'width',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'auto',\r\n\t            }],\r\n\t        initValue: [{\r\n\t                val: '100%',\r\n\t                tag: filterPrimitiveElements.concat(['svg']),\r\n\t            }, {\r\n\t                val: '120%',\r\n\t                tag: ['filter', 'mask'],\r\n\t            }, {\r\n\t                val: '0',\r\n\t                tag: ['pattern', 'rect', 'foreignObject'],\r\n\t            }, {\r\n\t                val: 'auto',\r\n\t                tag: ['svg', 'image', 'rect', 'foreignObject'],\r\n\t            }],\r\n\t        applyTo: filterPrimitiveElements.concat(['filter', 'mask', 'pattern', 'svg', 'image', 'rect', 'foreignObject']),\r\n\t    },\r\n\t    'x': {\r\n\t        name: 'x',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t                tag: filterPrimitiveElements.concat(['filter', 'mask', 'pattern', 'svg', 'rect', 'image', 'foreignObject', 'use']),\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t                tag: ['fePointLight', 'feSpotLight'],\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageListFullMatch,\r\n\t                tag: ['text', 'tspan'],\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'auto',\r\n\t            }],\r\n\t        initValue: [{\r\n\t                val: '0%',\r\n\t                tag: filterPrimitiveElements,\r\n\t            }, {\r\n\t                val: '0',\r\n\t                tag: ['fePointLight', 'feSpotLight', 'pattern', 'svg', 'rect', 'image', 'foreignObject', 'text'],\r\n\t            }, {\r\n\t                val: '-10%',\r\n\t                tag: ['filter', 'mask'],\r\n\t            }, {\r\n\t                val: '',\r\n\t                tag: ['tspan'],\r\n\t            }],\r\n\t        applyTo: filterPrimitiveElements.concat(['fePointLight', 'feSpotLight', 'filter', 'mask', 'pattern', 'svg', 'rect', 'image', 'foreignObject', 'text']),\r\n\t    },\r\n\t    'x1': {\r\n\t        name: 'x1',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'auto',\r\n\t            }],\r\n\t        initValue: [{\r\n\t                val: '0',\r\n\t                tag: ['line'],\r\n\t            }, {\r\n\t                val: '0%',\r\n\t                tag: ['linearGradient'],\r\n\t            }],\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'x2': {\r\n\t        name: 'x2',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'auto',\r\n\t            }],\r\n\t        initValue: [{\r\n\t                val: '0',\r\n\t                tag: ['line'],\r\n\t            }, {\r\n\t                val: '100%',\r\n\t                tag: ['linearGradient'],\r\n\t            }],\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'xChannelSelector': {\r\n\t        name: 'xChannelSelector',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: channel,\r\n\t            }],\r\n\t        initValue: 'A',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'xlink:href': {\r\n\t        name: 'xlink:href',\r\n\t        animatable: true,\r\n\t        maybeIRI: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: URIFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'xlink:title': {\r\n\t        name: 'xlink:title',\r\n\t        legalValues: [],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'xml:space': {\r\n\t        name: 'xml:space',\r\n\t        legalValues: [{\r\n\t                type: 'string',\r\n\t                value: 'default',\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'preserve',\r\n\t            }],\r\n\t        initValue: 'default',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'xmlns': {\r\n\t        name: 'xmlns',\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: URIFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'xmlns:xlink': {\r\n\t        name: 'xmlns:xlink',\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: URIFullMatch,\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'y': {\r\n\t        name: 'y',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t                tag: filterPrimitiveElements.concat(['filter', 'mask', 'pattern', 'svg', 'rect', 'image', 'foreignObject', 'use']),\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageListFullMatch,\r\n\t                tag: ['text', 'tspan'],\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t                tag: ['fePointLight', 'feSpotLight'],\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'auto',\r\n\t            }],\r\n\t        initValue: [{\r\n\t                val: '0%',\r\n\t                tag: filterPrimitiveElements,\r\n\t            }, {\r\n\t                val: '0',\r\n\t                tag: ['fePointLight', 'feSpotLight', 'pattern', 'svg', 'rect', 'image', 'foreignObject', 'text'],\r\n\t            }, {\r\n\t                val: '-10%',\r\n\t                tag: ['filter', 'mask'],\r\n\t            }, {\r\n\t                val: '',\r\n\t                tag: ['tspan'],\r\n\t            }],\r\n\t        applyTo: filterPrimitiveElements.concat(['fePointLight', 'feSpotLight', 'filter', 'mask', 'pattern', 'svg', 'rect', 'image', 'foreignObject', 'text']),\r\n\t    },\r\n\t    'y1': {\r\n\t        name: 'y1',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'auto',\r\n\t            }],\r\n\t        initValue: [{\r\n\t                val: '0',\r\n\t                tag: ['line'],\r\n\t            }, {\r\n\t                val: '0%',\r\n\t                tag: ['linearGradient'],\r\n\t            }],\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'y2': {\r\n\t        name: 'y2',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'auto',\r\n\t            }],\r\n\t        initValue: [{\r\n\t                val: '0',\r\n\t                tag: ['line'],\r\n\t            }, {\r\n\t                val: '0%',\r\n\t                tag: ['linearGradient'],\r\n\t            }],\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'yChannelSelector': {\r\n\t        name: 'yChannelSelector',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: channel,\r\n\t            }],\r\n\t        initValue: 'A',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'z': {\r\n\t        name: 'z',\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: '0',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    'zoomAndPan': {\r\n\t        name: 'zoomAndPan',\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'string',\r\n\t                value: 'disable',\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'magnify',\r\n\t            }],\r\n\t        initValue: 'disable',\r\n\t        applyTo: [],\r\n\t    },\r\n\t    // 下面是 property\r\n\t    'alignment-baseline': {\r\n\t        name: 'alignment-baseline',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: alignmentBaseline,\r\n\t            }],\r\n\t        initValue: 'baseline',\r\n\t        applyTo: ['tspan', 'textPath'],\r\n\t    },\r\n\t    'baseline-shift': {\r\n\t        name: 'baseline-shift',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: baselineShift,\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }],\r\n\t        initValue: '0',\r\n\t        applyTo: ['tspan', 'textPath'],\r\n\t    },\r\n\t    'clip': {\r\n\t        name: 'clip',\r\n\t        couldBeStyle: true,\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'string',\r\n\t                value: 'auto',\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: clipPathRect,\r\n\t            }],\r\n\t        initValue: 'auto',\r\n\t        applyTo: viewport,\r\n\t    },\r\n\t    'clip-path': {\r\n\t        name: 'clip-path',\r\n\t        couldBeStyle: true,\r\n\t        animatable: true,\r\n\t        maybeFuncIRI: true,\r\n\t        legalValues: [{\r\n\t                type: 'string',\r\n\t                value: 'none',\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: funcIRIFullMatch,\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: basicShapeFullMatch,\r\n\t            }, {\r\n\t                type: 'enum',\r\n\t                value: clipPath,\r\n\t            }],\r\n\t        initValue: 'none',\r\n\t        applyTo: useContainerGraphics,\r\n\t    },\r\n\t    'clip-rule': {\r\n\t        name: 'clip-rule',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: nonzeroEvenodd,\r\n\t            }],\r\n\t        initValue: 'nonzero',\r\n\t        applyTo: ['use'].concat(graphicsElements),\r\n\t    },\r\n\t    'color': {\r\n\t        name: 'color',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        maybeColor: true,\r\n\t        legalValues: colorValue,\r\n\t        initValue: '',\r\n\t        applyTo: ['feFlood', 'feDiffuseLighting', 'feSpecularLighting', 'stop'].concat(shapeAndText),\r\n\t    },\r\n\t    'color-interpolation': {\r\n\t        name: 'color-interpolation',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: colorInterpolation,\r\n\t            }],\r\n\t        initValue: 'sRGB',\r\n\t        applyTo: colorApply,\r\n\t    },\r\n\t    'color-interpolation-filters': {\r\n\t        name: 'color-interpolation-filters',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: colorInterpolation,\r\n\t            }],\r\n\t        initValue: 'auto',\r\n\t        applyTo: ['feSpotLight'].concat(filterPrimitiveElements),\r\n\t    },\r\n\t    'color-rendering': {\r\n\t        name: 'color-rendering',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: colorRendering,\r\n\t            }],\r\n\t        initValue: 'auto',\r\n\t        applyTo: colorApply,\r\n\t    },\r\n\t    'cursor': {\r\n\t        name: 'cursor',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        maybeFuncIRI: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: cursorFullMatch,\r\n\t            }],\r\n\t        initValue: 'auto',\r\n\t        applyTo: useContainerGraphics,\r\n\t    },\r\n\t    'direction': {\r\n\t        name: 'direction',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: direction,\r\n\t            }],\r\n\t        initValue: 'ltr',\r\n\t        applyTo: textContentElements,\r\n\t    },\r\n\t    'display': {\r\n\t        name: 'display',\r\n\t        couldBeStyle: true,\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: display,\r\n\t            }],\r\n\t        initValue: 'inline',\r\n\t        applyTo: ['svg', 'g', 'switch', 'a', 'foreignObject', 'use'].concat(graphicsElements),\r\n\t    },\r\n\t    'dominant-baseline': {\r\n\t        name: 'dominant-baseline',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: dominantBaseline,\r\n\t            }],\r\n\t        initValue: 'auto',\r\n\t        applyTo: textContentElements,\r\n\t    },\r\n\t    'fill': {\r\n\t        name: 'fill',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        maybeColor: true,\r\n\t        maybeFuncIRI: true,\r\n\t        legalValues: paintValue.concat([{\r\n\t                type: 'enum',\r\n\t                value: animateFill,\r\n\t                tag: ['animate', 'animateMotion', 'animateTransform', 'set'],\r\n\t            }]),\r\n\t        initValue: [{\r\n\t                val: 'black',\r\n\t                tag: useContainerGraphics,\r\n\t            }, {\r\n\t                val: 'remove',\r\n\t                tag: ['animate', 'animateMotion', 'animateTransform', 'set'],\r\n\t            }],\r\n\t        applyTo: ['animate', 'animateMotion', 'animateTransform', 'set'].concat(shapeAndText),\r\n\t    },\r\n\t    'fill-opacity': {\r\n\t        name: 'fill-opacity',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        maybeAlpha: true,\r\n\t        legalValues: opacityValue,\r\n\t        initValue: '1',\r\n\t        applyTo: shapeAndText,\r\n\t    },\r\n\t    'fill-rule': {\r\n\t        name: 'fill-rule',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: nonzeroEvenodd,\r\n\t            }],\r\n\t        initValue: 'nonzero',\r\n\t        applyTo: ['path', 'polygon', 'polyline'].concat(textContentElements),\r\n\t    },\r\n\t    'filter': {\r\n\t        name: 'filter',\r\n\t        couldBeStyle: true,\r\n\t        animatable: true,\r\n\t        maybeFuncIRI: true,\r\n\t        legalValues: [{\r\n\t                type: 'string',\r\n\t                value: 'none',\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: filterListFullMatch,\r\n\t            }],\r\n\t        initValue: 'none',\r\n\t        applyTo: useContainerGraphics,\r\n\t    },\r\n\t    'flood-color': {\r\n\t        name: 'flood-color',\r\n\t        couldBeStyle: true,\r\n\t        animatable: true,\r\n\t        maybeColor: true,\r\n\t        legalValues: colorValue,\r\n\t        initValue: 'black',\r\n\t        applyTo: ['feFlood'],\r\n\t    },\r\n\t    'flood-opacity': {\r\n\t        name: 'flood-opacity',\r\n\t        couldBeStyle: true,\r\n\t        maybeAlpha: true,\r\n\t        legalValues: opacityValue,\r\n\t        initValue: '1',\r\n\t        applyTo: ['feFlood'],\r\n\t    },\r\n\t    'font-family': {\r\n\t        name: 'font-family',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        legalValues: [],\r\n\t        initValue: '',\r\n\t        applyTo: textContentElements,\r\n\t    },\r\n\t    'font-size': {\r\n\t        name: 'font-size',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }, {\r\n\t                type: 'enum',\r\n\t                value: absoluteSize,\r\n\t            }, {\r\n\t                type: 'enum',\r\n\t                value: relativeSize,\r\n\t            }],\r\n\t        initValue: 'medium',\r\n\t        applyTo: textContentElements,\r\n\t    },\r\n\t    'font-size-adjust': {\r\n\t        name: 'font-size-adjust',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'string',\r\n\t                value: 'none',\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: numberFullMatch,\r\n\t            }],\r\n\t        initValue: 'none',\r\n\t        applyTo: textContentElements,\r\n\t    },\r\n\t    'font-stretch': {\r\n\t        name: 'font-stretch',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: fontStretch,\r\n\t            }],\r\n\t        initValue: 'normal',\r\n\t        applyTo: textContentElements,\r\n\t    },\r\n\t    'font-style': {\r\n\t        name: 'font-style',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: fontStyle,\r\n\t            }],\r\n\t        initValue: 'normal',\r\n\t        applyTo: textContentElements,\r\n\t    },\r\n\t    'font-variant': {\r\n\t        name: 'font-variant',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'string',\r\n\t                value: 'normal',\r\n\t            }, {\r\n\t                type: 'string',\r\n\t                value: 'none',\r\n\t            }, {\r\n\t                type: 'mix',\r\n\t                value: {\r\n\t                    type: '|',\r\n\t                    unit: [commonLigValues, discretionaryLigValues, historicalLigValues, contextualAltValues, capsValues, numericFigureValues, numericSpacingValues, numericFractionValues, 'ordinal', 'slashed-zero', eastAsianVariantValues, eastAsianWidthValues, 'ruby', 'sub|super'],\r\n\t                },\r\n\t            }],\r\n\t        initValue: 'normal',\r\n\t        applyTo: textContentElements,\r\n\t    },\r\n\t    'font-weight': {\r\n\t        name: 'font-weight',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: fontWeight,\r\n\t            }],\r\n\t        initValue: 'normal',\r\n\t        applyTo: textContentElements,\r\n\t    },\r\n\t    'image-rendering': {\r\n\t        name: 'image-rendering',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: colorRendering,\r\n\t            }],\r\n\t        initValue: 'auto',\r\n\t        applyTo: ['image'],\r\n\t    },\r\n\t    'letter-spacing': {\r\n\t        name: 'letter-spacing',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'string',\r\n\t                value: 'normal'\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: lengthFullMatch,\r\n\t            }],\r\n\t        initValue: 'normal',\r\n\t        applyTo: textContentElements,\r\n\t    },\r\n\t    'lighting-color': {\r\n\t        name: 'lighting-color',\r\n\t        couldBeStyle: true,\r\n\t        animatable: true,\r\n\t        maybeColor: true,\r\n\t        legalValues: colorValue,\r\n\t        initValue: 'white',\r\n\t        applyTo: ['feDiffuseLighting', 'feSpecularLighting'],\r\n\t    },\r\n\t    'line-height': {\r\n\t        name: 'line-height',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        maybeColor: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'string',\r\n\t                value: 'normal',\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }],\r\n\t        initValue: 'normal',\r\n\t        applyTo: ['text'],\r\n\t    },\r\n\t    'marker': {\r\n\t        name: 'marker',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        maybeFuncIRI: true,\r\n\t        legalValues: markerValue,\r\n\t        initValue: 'none',\r\n\t        applyTo: shapeElements,\r\n\t    },\r\n\t    'marker-end': {\r\n\t        name: 'marker-end',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        maybeFuncIRI: true,\r\n\t        legalValues: markerValue,\r\n\t        initValue: 'none',\r\n\t        applyTo: shapeElements,\r\n\t    },\r\n\t    'marker-mid': {\r\n\t        name: 'marker-mid',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        maybeFuncIRI: true,\r\n\t        legalValues: markerValue,\r\n\t        initValue: 'none',\r\n\t        applyTo: shapeElements,\r\n\t    },\r\n\t    'marker-start': {\r\n\t        name: 'marker-start',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        maybeFuncIRI: true,\r\n\t        legalValues: markerValue,\r\n\t        initValue: 'none',\r\n\t        applyTo: shapeElements,\r\n\t    },\r\n\t    'mask': {\r\n\t        name: 'mask',\r\n\t        couldBeStyle: true,\r\n\t        animatable: true,\r\n\t        maybeFuncIRI: true,\r\n\t        legalValues: [],\r\n\t        initValue: 'none',\r\n\t        applyTo: useContainerGraphics,\r\n\t    },\r\n\t    'opacity': {\r\n\t        name: 'opacity',\r\n\t        couldBeStyle: true,\r\n\t        animatable: true,\r\n\t        maybeAlpha: true,\r\n\t        legalValues: opacityValue,\r\n\t        initValue: '1',\r\n\t        applyTo: ['svg', 'g', 'symbol', 'marker', 'a', 'switch', 'use', 'unknown'].concat(graphicsElements),\r\n\t    },\r\n\t    'overflow': {\r\n\t        name: 'overflow',\r\n\t        couldBeStyle: true,\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: overflow,\r\n\t            }],\r\n\t        initValue: 'visible',\r\n\t        applyTo: viewport,\r\n\t    },\r\n\t    'paint-order': {\r\n\t        name: 'paint-order',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'string',\r\n\t                value: 'normal',\r\n\t            }, {\r\n\t                type: 'mix',\r\n\t                value: {\r\n\t                    type: '|',\r\n\t                    unit: ['fill', 'stroke', 'markers'],\r\n\t                }\r\n\t            }],\r\n\t        initValue: 'normal',\r\n\t        applyTo: shapeAndText,\r\n\t    },\r\n\t    'pointer-events': {\r\n\t        name: 'pointer-events',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: pointerEvents,\r\n\t            }],\r\n\t        initValue: 'visiblePainted',\r\n\t        applyTo: useContainerGraphics,\r\n\t    },\r\n\t    'shape-rendering': {\r\n\t        name: 'shape-rendering',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: shapeRendering,\r\n\t            }],\r\n\t        initValue: 'auto',\r\n\t        applyTo: shapeElements,\r\n\t    },\r\n\t    'stop-color': {\r\n\t        name: 'stop-color',\r\n\t        couldBeStyle: true,\r\n\t        animatable: true,\r\n\t        maybeColor: true,\r\n\t        legalValues: [{\r\n\t                type: 'string',\r\n\t                value: 'currentColor',\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: stopColorFullMatch,\r\n\t            }],\r\n\t        initValue: 'black',\r\n\t        applyTo: ['stop'],\r\n\t    },\r\n\t    'stop-opacity': {\r\n\t        name: 'stop-opacity',\r\n\t        couldBeStyle: true,\r\n\t        animatable: true,\r\n\t        maybeAlpha: true,\r\n\t        legalValues: opacityValue,\r\n\t        initValue: '1',\r\n\t        applyTo: ['stop'],\r\n\t    },\r\n\t    'stroke': {\r\n\t        name: 'stroke',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        maybeColor: true,\r\n\t        maybeFuncIRI: true,\r\n\t        legalValues: paintValue,\r\n\t        initValue: 'none',\r\n\t        applyTo: shapeAndText,\r\n\t    },\r\n\t    'stroke-dasharray': {\r\n\t        name: 'stroke-dasharray',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'string',\r\n\t                value: 'none',\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: strokeDasharrayFullMatch,\r\n\t            }],\r\n\t        initValue: 'none',\r\n\t        applyTo: shapeAndText,\r\n\t    },\r\n\t    'stroke-dashoffset': {\r\n\t        name: 'stroke-dashoffset',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }],\r\n\t        initValue: '0',\r\n\t        applyTo: shapeAndText,\r\n\t    },\r\n\t    'stroke-linecap': {\r\n\t        name: 'stroke-linecap',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: strokeLinecap,\r\n\t            }],\r\n\t        initValue: 'butt',\r\n\t        applyTo: shapeAndText,\r\n\t    },\r\n\t    'stroke-linejoin': {\r\n\t        name: 'stroke-linejoin',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: strokeLinejoin,\r\n\t            }],\r\n\t        initValue: 'miter',\r\n\t        applyTo: shapeAndText,\r\n\t    },\r\n\t    'stroke-miterlimit': {\r\n\t        name: 'stroke-miterlimit',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: nonNegativeFullMatch,\r\n\t            }],\r\n\t        initValue: '4',\r\n\t        applyTo: shapeAndText,\r\n\t    },\r\n\t    'stroke-opacity': {\r\n\t        name: 'stroke-opacity',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        maybeAlpha: true,\r\n\t        legalValues: opacityValue,\r\n\t        initValue: '1',\r\n\t        applyTo: shapeAndText,\r\n\t    },\r\n\t    'stroke-width': {\r\n\t        name: 'stroke-width',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'reg',\r\n\t                value: lengthPercentageFullMatch,\r\n\t            }],\r\n\t        initValue: '1',\r\n\t        applyTo: shapeAndText,\r\n\t    },\r\n\t    'text-anchor': {\r\n\t        name: 'text-anchor',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: textAnchor,\r\n\t            }],\r\n\t        initValue: 'start',\r\n\t        applyTo: textContentElements,\r\n\t    },\r\n\t    'text-decoration': {\r\n\t        name: 'text-decoration',\r\n\t        couldBeStyle: true,\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'string',\r\n\t                value: 'none',\r\n\t            }, {\r\n\t                type: 'mix',\r\n\t                value: {\r\n\t                    type: '|',\r\n\t                    unit: ['underline', 'overline', 'line-through', 'blink '],\r\n\t                },\r\n\t            }],\r\n\t        initValue: '',\r\n\t        applyTo: textContentElements,\r\n\t    },\r\n\t    'text-rendering': {\r\n\t        name: 'text-rendering',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: textRendering,\r\n\t            }],\r\n\t        initValue: 'auto',\r\n\t        applyTo: ['text'],\r\n\t    },\r\n\t    'unicode-bidi': {\r\n\t        name: 'unicode-bidi',\r\n\t        couldBeStyle: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: unicodeBidi,\r\n\t            }],\r\n\t        initValue: 'normal',\r\n\t        applyTo: textContentElements,\r\n\t    },\r\n\t    'vector-effect': {\r\n\t        name: 'vector-effect',\r\n\t        couldBeStyle: true,\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'string',\r\n\t                value: 'none',\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: vectorEffectFullMatch,\r\n\t            }],\r\n\t        initValue: 'none',\r\n\t        applyTo: ['use'].concat(graphicsElements),\r\n\t    },\r\n\t    'visibility': {\r\n\t        name: 'visibility',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: visibility,\r\n\t            }],\r\n\t        initValue: 'visible',\r\n\t        applyTo: ['use', 'a'].concat(graphicsElements),\r\n\t    },\r\n\t    // 'white-space': { // 经验证，chrome 85 下此规则在属性中无效\r\n\t    // \tname: 'white-space',\r\n\t    // \tcouldBeStyle: true,\r\n\t    // \tinherited: true,\r\n\t    // \tanimatable: true,\r\n\t    // \tlegalValues: [{\r\n\t    // \t\ttype: 'enum',\r\n\t    // \t\tvalue: whiteSpace,\r\n\t    // \t}],\r\n\t    // \tinitValue: 'normal',\r\n\t    // \tapplyTo: textContentElements,\r\n\t    // },\r\n\t    'word-spacing': {\r\n\t        name: 'word-spacing',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        animatable: true,\r\n\t        maybeSizeNumber: true,\r\n\t        legalValues: [{\r\n\t                type: 'string',\r\n\t                value: 'normal',\r\n\t            }, {\r\n\t                type: 'reg',\r\n\t                value: lengthFullMatch,\r\n\t            }],\r\n\t        initValue: 'normal',\r\n\t        applyTo: textContentElements,\r\n\t    },\r\n\t    'writing-mode': {\r\n\t        name: 'writing-mode',\r\n\t        couldBeStyle: true,\r\n\t        inherited: true,\r\n\t        legalValues: [{\r\n\t                type: 'enum',\r\n\t                value: writingModeCSS3,\r\n\t            }, {\r\n\t                type: 'enum',\r\n\t                value: writingMode,\r\n\t            }],\r\n\t        initValue: [{\r\n\t                val: 'lr-tb',\r\n\t                tag: ['text'],\r\n\t            }, {\r\n\t                val: 'horizontal-tb',\r\n\t                tag: ['text'],\r\n\t            }],\r\n\t        applyTo: ['text'],\r\n\t    },\r\n\t};\r\n\tconst undefAttr = {\r\n\t    name: '',\r\n\t    isUndef: true,\r\n\t    legalValues: [],\r\n\t    initValue: '',\r\n\t    applyTo: [],\r\n\t};\r\n\tconst regularAttr = new Proxy(_regularAttr, {\r\n\t    get(obj, prop) {\r\n\t        return hasProp(obj, prop) ? obj[prop] : undefAttr;\r\n\t    },\r\n\t});\n\n\t/*\r\n\t * 深度遍历所有的 Object 属性\r\n\t * @param { function } 条件\r\n\t * @param { function } 回调\r\n\t * @param { object } 目标对象\r\n\t * @param { object[] } 避免对象调用自身造成死循环\r\n\t * @param { boolean } 是否深度优先，是的话会先遍历子元素\r\n\t */\r\n\tconst traversal = (condition, cb, obj, path, visited, deep) => {\r\n\t    if (visited.has(obj)) {\r\n\t        return;\r\n\t    }\r\n\t    visited.add(obj);\r\n\t    if (!deep) {\r\n\t        if (condition(obj)) {\r\n\t            cb(obj, path);\r\n\t            return;\r\n\t        }\r\n\t    }\r\n\t    path.push(obj);\r\n\t    if (Array.isArray(obj)) {\r\n\t        for (let i = 0; i < obj.length;) {\r\n\t            const item = obj[i];\r\n\t            traversal(condition, cb, item, path, visited, deep);\r\n\t            if (item === obj[i]) {\r\n\t                i++;\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    else {\r\n\t        for (const key in obj) {\r\n\t            const objK = obj[key];\r\n\t            if (isObj(objK)) {\r\n\t                traversal(condition, cb, objK, path, visited, deep);\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    path.pop();\r\n\t    if (deep) {\r\n\t        if (condition(obj)) {\r\n\t            cb(obj, path);\r\n\t        }\r\n\t    }\r\n\t};\r\n\tconst traversalObj = (condition, cb, obj, deep = false) => {\r\n\t    traversal(condition, cb, obj, [], new Set(), deep);\r\n\t};\n\n\t// eslint-disable-next-line @typescript-eslint/no-var-requires\r\n\tconst properties = require('known-css-properties').all;\r\n\tconst knownCSS = (propName) => properties.includes(propName);\n\n\t// 用于验证的正则表达式\r\n\t// style 属性中是否包含 important\r\n\tconst importantReg = /\\s*!important$/;\r\n\tconst createFullMatch = (s) => new RegExp(`^(?:${s})$`);\r\n\tconst createUnitMatch = (s) => new RegExp(`(?:^|\\\\s)(?:${s})(?:\\\\s|$)`);\n\n\tconst useEnum = (e, val) => createFullMatch(e).test(val);\n\n\tconst useReg = (reg, val) => reg.test(val.trim());\n\n\tconst funcReg = createFullMatch('([^(]+)\\\\((.+)\\\\)');\r\n\tconst checkArg = (argDef, val) => {\r\n\t    if (argDef.type === 'enum') {\r\n\t        return useEnum(argDef.value, val);\r\n\t    }\r\n\t    else if (argDef.type === 'reg') {\r\n\t        return useReg(argDef.value, val);\r\n\t    }\r\n\t    else {\r\n\t        return argDef.value === val;\r\n\t    }\r\n\t};\r\n\tconst useFunc = (fnDef, val) => {\r\n\t    const fn = funcReg.exec(val);\r\n\t    // 不是函数\r\n\t    if (!fn)\r\n\t        return false;\r\n\t    // 函数名对不上\r\n\t    if (fn[1] !== fnDef.name)\r\n\t        return false;\r\n\t    const values = fn[2].split(',').map(s => s.trim());\r\n\t    // 函数参数超出上限\r\n\t    if (values.length > fnDef.args.length) {\r\n\t        return false;\r\n\t    }\r\n\t    for (let i = 0; i < values.length; i++) {\r\n\t        // 获取值的定义\r\n\t        const argDef = fnDef.args[i];\r\n\t        if (Array.isArray(argDef.def)) {\r\n\t            if (!argDef.def.some(adef => checkArg(adef, values[i]))) {\r\n\t                return false;\r\n\t            }\r\n\t        }\r\n\t        else {\r\n\t            if (!checkArg(argDef.def, values[i])) {\r\n\t                return false;\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    if (values.length < fnDef.args.length) {\r\n\t        const argDef = fnDef.args[values.length];\r\n\t        return !!argDef.optional;\r\n\t    }\r\n\t    return true;\r\n\t};\n\n\t// mix 主要应对以下这种取值规则，TODO：暂未支持 mix 嵌套\r\n\t// https://www.w3.org/TR/css-values-4/#component-combinators\r\n\tconst useMix = (rule, val) => {\r\n\t    if (rule.type === '&') {\r\n\t        const vals = val.split(/\\s+/);\r\n\t        for (let i = 0; i < vals.length; i++) {\r\n\t            const v = rule.unit[i];\r\n\t            if (!createFullMatch(v).test(vals[i])) {\r\n\t                return false;\r\n\t            }\r\n\t        }\r\n\t        return true;\r\n\t    }\r\n\t    else {\r\n\t        let _val = val;\r\n\t        for (let i = rule.unit.length; i--;) {\r\n\t            const reg = createUnitMatch(rule.unit[i]);\r\n\t            _val = _val.replace(reg, ' ');\r\n\t        }\r\n\t        return !_val.trim();\r\n\t    }\r\n\t};\n\n\tconst checkLegal = (legalRule, value) => {\r\n\t    switch (legalRule.type) {\r\n\t        // 用正则判断\r\n\t        case 'reg':\r\n\t            if (useReg(legalRule.value, value)) {\r\n\t                return true;\r\n\t            }\r\n\t            break;\r\n\t        // 用枚举判断\r\n\t        case 'enum':\r\n\t            if (useEnum(legalRule.value, value)) {\r\n\t                return true;\r\n\t            }\r\n\t            break;\r\n\t        // 值应该是一个函数\r\n\t        case 'mix':\r\n\t            if (useMix(legalRule.value, value)) {\r\n\t                return true;\r\n\t            }\r\n\t            break;\r\n\t        // 值应该是一个函数\r\n\t        case 'func':\r\n\t            if (useFunc(legalRule.value, value)) {\r\n\t                return true;\r\n\t            }\r\n\t            break;\r\n\t        // 值应该是一个特定字符串\r\n\t        default:\r\n\t            if (legalRule.value === value) {\r\n\t                return true;\r\n\t            }\r\n\t            break;\r\n\t    }\r\n\t    return false;\r\n\t};\r\n\tconst legalValue = (attrDefine, attr, nodeName = '') => {\r\n\t    if (attrDefine.legalValues.length) {\r\n\t        // 只要有一个规则命中就返回 true\r\n\t        let noMatchRule = true; // 重要！要判断是否有可以用于验证的规则，如果所有规则不适用于验证当前属性，则不应该 return false，而应该 return true\r\n\t        for (const legalRule of attrDefine.legalValues) {\r\n\t            // 当前验证规则可能只适用于某些 tag，legalTag 表示当前规则适用于所有 tag 或当前验证的 tag 在规则匹配列表中\r\n\t            const legalTag = !legalRule.tag || !nodeName || legalRule.tag.includes(nodeName);\r\n\t            if (legalTag) {\r\n\t                noMatchRule = false;\r\n\t                // 值应该是一个属性名，而且不允许循环引用\r\n\t                if (legalRule.type === 'attr') {\r\n\t                    if (!regularAttr[attr.value].isUndef && attr.fullname !== attr.value) {\r\n\t                        return true;\r\n\t                    }\r\n\t                }\r\n\t                else if (checkLegal(legalRule, attr.value)) {\r\n\t                    return true;\r\n\t                }\r\n\t                // 如果是 CSS 类的值，还要判断是否匹配 CSS Default keywords\r\n\t                if (attrDefine.couldBeStyle && useEnum(CSSDefault, attr.value)) {\r\n\t                    return true;\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t        return noMatchRule;\r\n\t    }\r\n\t    // 合法属性，或浏览器可识别的 css 属性\r\n\t    return !attrDefine.isUndef;\r\n\t};\n\n\tconst rmCSSNode = (cssNode, plist) => {\r\n\t    const index = plist.indexOf(cssNode);\r\n\t    if (index !== -1) {\r\n\t        plist.splice(index, 1);\r\n\t    }\r\n\t};\r\n\t// 合并多个 style 标签，并将文本节点合并到一个子节点\r\n\tconst combineStyle = async (dom) => new Promise(resolve => {\r\n\t    let firstStyle;\r\n\t    const styles = dom.querySelectorAll('style');\r\n\t    styles.forEach(node => {\r\n\t        const type = node.getAttribute('type');\r\n\t        if (type && type !== 'text/css') {\r\n\t            node.remove();\r\n\t            return;\r\n\t        }\r\n\t        if (firstStyle) {\r\n\t            firstStyle.appendChild(node.childNodes);\r\n\t            node.remove();\r\n\t        }\r\n\t        else {\r\n\t            firstStyle = node;\r\n\t        }\r\n\t    });\r\n\t    const ruleParents = [];\r\n\t    if (firstStyle) {\r\n\t        combineText(firstStyle);\r\n\t        const childNodes = firstStyle.childNodes;\r\n\t        if (childNodes.length !== 1 || !childNodes[0].textContent) { // 如果内容为空，则移除style节点\r\n\t            firstStyle.remove();\r\n\t        }\r\n\t        else {\r\n\t            if (!childNodes[0].textContent.includes('<')) { // 如果没有危险代码，则由 CDATA 转为普通文本类型\r\n\t                childNodes[0].nodeType = svgVdom.NodeType.Text;\r\n\t            }\r\n\t            // 解析 stylesheet 并缓存\r\n\t            try {\r\n\t                const parsedCss = css.parse(childNodes[0].textContent);\r\n\t                if (parsedCss.stylesheet) {\r\n\t                    dom.stylesheet = parsedCss;\r\n\t                    dom.styletag = firstStyle;\r\n\t                    // style 标签强制移到 svg 标签下\r\n\t                    const svg = dom.querySelector('svg');\r\n\t                    svg.insertBefore(firstStyle, svg.childNodes[0]);\r\n\t                    traversalObj(ramda.has('type'), (cssNode, parents) => {\r\n\t                        switch (cssNode.type) {\r\n\t                            case 'rule':\r\n\t                            case 'keyframe':\r\n\t                            case 'font-face':\r\n\t                            case 'page': {\r\n\t                                const cssRule = cssNode;\r\n\t                                if (!cssRule.declarations) {\r\n\t                                    rmCSSNode(cssRule, parents[parents.length - 1]);\r\n\t                                    return;\r\n\t                                }\r\n\t                                const declared = new Set();\r\n\t                                for (let i = cssRule.declarations.length; i--;) {\r\n\t                                    const ruleItem = cssRule.declarations[i];\r\n\t                                    // 1、移除不存在属性名或属性值的项\r\n\t                                    // 2、排重\r\n\t                                    if (!ruleItem.property || !ruleItem.value || declared.has(ruleItem.property)) {\r\n\t                                        cssRule.declarations.splice(i, 1);\r\n\t                                    }\r\n\t                                    else {\r\n\t                                        declared.add(ruleItem.property);\r\n\t                                    }\r\n\t                                }\r\n\t                                if (!cssRule.declarations.length) {\r\n\t                                    rmCSSNode(cssRule, parents[parents.length - 1]);\r\n\t                                }\r\n\t                                else {\r\n\t                                    ruleParents.push([cssRule, parents[parents.length - 1]]);\r\n\t                                }\r\n\t                                break;\r\n\t                            }\r\n\t                            case 'keyframes': {\r\n\t                                const keyframes = cssNode;\r\n\t                                if (!keyframes.keyframes || !keyframes.keyframes.length) {\r\n\t                                    rmCSSNode(cssNode, parents[parents.length - 1]);\r\n\t                                }\r\n\t                                break;\r\n\t                            }\r\n\t                            case 'media':\r\n\t                            case 'host':\r\n\t                            case 'supports':\r\n\t                            case 'document': {\r\n\t                                const ruleParent = cssNode;\r\n\t                                if (!ruleParent.rules || !ruleParent.rules.length) {\r\n\t                                    rmCSSNode(cssNode, parents[parents.length - 1]);\r\n\t                                }\r\n\t                                break;\r\n\t                            }\r\n\t                            case 'comment':\r\n\t                                rmCSSNode(cssNode, parents[parents.length - 1]);\r\n\t                                break;\r\n\t                            default:\r\n\t                                break;\r\n\t                        }\r\n\t                    }, parsedCss.stylesheet.rules, true);\r\n\t                }\r\n\t                else {\r\n\t                    firstStyle.remove();\r\n\t                }\r\n\t            }\r\n\t            catch {\r\n\t                firstStyle.remove();\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    if (ruleParents.length) {\r\n\t        for (const [rule, parent] of ruleParents) {\r\n\t            // 只做基本验证\r\n\t            rule.declarations.forEach(styleItem => {\r\n\t                const styleDefine = regularAttr[styleItem.property];\r\n\t                if (!legalValue(styleDefine, {\r\n\t                    fullname: styleItem.property,\r\n\t                    value: styleItem.value,\r\n\t                    name: '',\r\n\t                })\r\n\t                    &&\r\n\t                        !knownCSS(styleItem.property)) {\r\n\t                    styleItem.value = '';\r\n\t                }\r\n\t            });\r\n\t            rule.declarations = rule.declarations.filter(item => !!item.value);\r\n\t            if (!rule.declarations.length) {\r\n\t                rmCSSNode(rule, parent);\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    resolve();\r\n\t});\n\n\tconst combineTextNode = async (dom) => new Promise(resolve => {\r\n\t    const textNodes = dom.querySelectorAll(node => node.nodeType === svgVdom.NodeType.Text || node.nodeType === svgVdom.NodeType.CDATA);\r\n\t    // 合并相邻的同类型文本节点\r\n\t    for (let i = textNodes.length; i--;) {\r\n\t        const childNode = textNodes[i];\r\n\t        const parent = childNode.parentNode;\r\n\t        const index = parent.childNodes.indexOf(childNode);\r\n\t        if (index > 0) {\r\n\t            const lastNode = parent.childNodes[index - 1];\r\n\t            if (lastNode.nodeType === childNode.nodeType) {\r\n\t                lastNode.textContent = mixWhiteSpace(`${lastNode.textContent}${childNode.textContent}`);\r\n\t                childNode.remove();\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    resolve();\r\n\t});\n\n\t// eslint-disable-next-line @typescript-eslint/no-var-requires\r\n\tconst { decode } = require('he');\r\n\tconst cssReg = /([^:;]+):((?:[^;'\"]*?(?:(?:'[^']*?'|\"[^\"]*?\"|\\/\\*.*?\\*\\/))*[^;'\"]*?)*)(?=;|$)/gim;\r\n\tconst parseStyle = (styleStr) => {\r\n\t    // 此处使用数组，因为不能在解析器中排重，排重的工作要交给优化工具\r\n\t    const style = [];\r\n\t    const str = decode(styleStr, {\r\n\t        isAttributeValue: true,\r\n\t    });\r\n\t    // 重置正则\r\n\t    cssReg.lastIndex = 0;\r\n\t    let match = cssReg.exec(str);\r\n\t    while (match !== null) {\r\n\t        // 去除前导注释和空格\r\n\t        const name = match[1].replace(/^(?:\\s*\\/\\*.+?\\*\\/\\s*)*/g, '').trim().replace(/\\s/g, '');\r\n\t        // 去除两端注释和冗余空格\r\n\t        let value = match[2].replace(/^(?:\\s*\\/\\*.+?\\*\\/\\s*)*|(?:\\s*\\/\\*.+?\\*\\/\\s*)*$/g, '').trim().replace(/\\s+/, ' ');\r\n\t        let important = false;\r\n\t        // 验证 !important\r\n\t        if (importantReg.test(value)) {\r\n\t            value = value.replace(importantReg, '');\r\n\t            important = true;\r\n\t        }\r\n\t        // 只保留非空\r\n\t        if (name && value) {\r\n\t            style.push({\r\n\t                fullname: name,\r\n\t                name,\r\n\t                value,\r\n\t                important,\r\n\t            });\r\n\t        }\r\n\t        match = cssReg.exec(str);\r\n\t    }\r\n\t    return style;\r\n\t};\n\n\tconst stringifyStyle = (style) => style.map(attr => `${attr.name}:${attr.value}${attr.important ? '!important' : ''}`).join(';');\n\n\tconst getShorter = (a, b) => a.length <= b.length ? a : b;\n\n\t// 移除纯小数的前导 0\r\n\tconst shortenPureDecimal = (s) => s.replace(/^(-?)0\\./, '$1.');\n\n\tconst isExp = (s) => s.toLowerCase().includes('e');\n\n\tconst isFloat = (s) => s.includes('.');\n\n\t// 对纯小数进行按位四舍五入\r\n\tconst floatFixed = (_dgt, sourceNum, sourceStr) => {\r\n\t    // dgt 为负数的当作 0 来处理\r\n\t    const dgt = Math.max(_dgt, 0);\r\n\t    // dgt 为 0 表示四舍五入取整\r\n\t    if (dgt === 0) {\r\n\t        return Math.round(sourceNum);\r\n\t    }\r\n\t    const dotIndex = sourceStr.indexOf('.');\r\n\t    const digitN = sourceStr.length - (dotIndex + 1);\r\n\t    if (digitN <= dgt) {\r\n\t        return sourceNum;\r\n\t    }\r\n\t    // 最后一位四舍五入\r\n\t    const fixedSub = sourceStr.slice(0, dotIndex + dgt + 1);\r\n\t    if (+sourceStr[dotIndex + dgt + 1] > 4) {\r\n\t        if (/\\.9+$/.test(fixedSub)) {\r\n\t            // 需要进位整数的情况\r\n\t            return sourceNum < 0 ? Math.floor(sourceNum) : Math.ceil(sourceNum);\r\n\t        }\r\n\t        else {\r\n\t            return +fixedSub.replace(/([0-8])9*$/, (_mantissa, lastN) => `${+lastN + 1}`);\r\n\t        }\r\n\t    }\r\n\t    else {\r\n\t        return +fixedSub;\r\n\t    }\r\n\t};\r\n\tconst toFixed = ramda.curry((digit, n) => {\r\n\t    // NaN 和 Infinity 直接返回\r\n\t    if (!isFinite(n)) {\r\n\t        return n;\r\n\t    }\r\n\t    const s = n.toString();\r\n\t    // 科学计数法\r\n\t    if (isExp(s)) {\r\n\t        const eIndex = s.indexOf('e');\r\n\t        if (s[eIndex + 1] === '-') {\r\n\t            const exp = +s.slice(eIndex + 2);\r\n\t            // 精度要求低于 (科学计数法精度 - 1)，直接返回 0\r\n\t            if (digit < exp - 1) {\r\n\t                return 0;\r\n\t            }\r\n\t            // 如果精度等于 (科学计数法精度 - 1)，对整数位进行四舍五入\r\n\t            if (digit === exp - 1) {\r\n\t                return +`${+s[0] > 4 ? 1 : 0}e-${exp - 1}`;\r\n\t            }\r\n\t            // 1.00001e-7 的精度是 12\r\n\t            if (isFloat(s)) {\r\n\t                // 精度大于等于数值精度，返回原数值\r\n\t                if (digit >= eIndex - (s.indexOf('.') + 1) + exp) {\r\n\t                    return n;\r\n\t                }\r\n\t                const dotS = s.slice(0, eIndex);\r\n\t                const dotFix = floatFixed(digit - exp, +dotS, dotS);\r\n\t                return +`${dotFix}e-${exp}`;\r\n\t            }\r\n\t            // 精度大于等于数值精度，返回原数值\r\n\t            return n;\r\n\t        }\r\n\t        else {\r\n\t            return n;\r\n\t        }\r\n\t    }\r\n\t    // 小数的情况\r\n\t    if (isFloat(s)) {\r\n\t        return floatFixed(digit, n, s);\r\n\t    }\r\n\t    // 整数的情况\r\n\t    return n;\r\n\t});\n\n\t// 浮点数转百分比\r\n\tconst toPercent = (digit, n) => `${toFixed(Math.max(digit - 2, 0), n * Hundred)}%`;\n\n\t// 此工具函数用于优化同时可以用小数和百分比表示，并且二者可以互转的值，例如颜色的 alpha 值\r\n\tconst shortenAlpha = (digit, s) => {\r\n\t    const perc = shortenPureDecimal(toPercent(digit, s));\r\n\t    const num = shortenPureDecimal(`${toFixed(digit, s)}`);\r\n\t    return getShorter(num, perc);\r\n\t};\n\n\t// 转换百分比格式字符串为数值\r\n\tconst validPercent = (max, n) => Math.round(Math.max(Math.min(Hundred, n), 0) * max / Hundred);\r\n\t// 转换非百分比格式字符串为数值\r\n\tconst validNum = (max, n) => Math.max(Math.min(max, Math.round(n)), 0);\r\n\t// 转换字符串为数值\r\n\tconst valid = (isPercent, max, n) => isPercent ? validPercent(max, +n) : validNum(max, +n);\r\n\t// 转换透明度数值\r\n\tconst validOpacity = (p, n) => Math.max(Math.min(1, p ? +n / Hundred : +n), 0);\n\n\t// 缩短函数类字符串，移除其中的空白\r\n\tconst shortenFunc = (s) => s.replace(/\\s*([,()])\\s*/g, '$1');\n\n\tconst CIRC6 = CIRC / 6;\r\n\tconst hsl2rgb = (h, s, l) => {\r\n\t    let _R;\r\n\t    let G;\r\n\t    let B;\r\n\t    let _h = (h % CIRC) / CIRC6;\r\n\t    const C = s * 2 * (l < HALF ? l : 1 - l);\r\n\t    const X = C * (1 - Math.abs(_h % 2 - 1));\r\n\t    _R = G = B = l - C / 2;\r\n\t    _h = ~~_h;\r\n\t    _R += [C, X, 0, 0, X, C][_h];\r\n\t    G += [X, C, C, X, 0, 0][_h];\r\n\t    B += [0, 0, X, C, C, X][_h];\r\n\t    return [validNum(FF, _R * FF), validNum(FF, G * FF), validNum(FF, B * FF)];\r\n\t};\n\n\tconst keywords = {\r\n\t    'aliceblue': '#f0f8ff',\r\n\t    'antiquewhite': '#faebd7',\r\n\t    'aqua': '#00ffff',\r\n\t    'aquamarine': '#7fffd4',\r\n\t    'azure': '#f0ffff',\r\n\t    'beige': '#f5f5dc',\r\n\t    'bisque': '#ffe4c4',\r\n\t    'black': '#000000',\r\n\t    'blanchedalmond': '#ffebcd',\r\n\t    'blue': '#0000ff',\r\n\t    'blueviolet': '#8a2be2',\r\n\t    'brown': '#a52a2a',\r\n\t    'burlywood': '#deb887',\r\n\t    'cadetblue': '#5f9ea0',\r\n\t    'chartreuse': '#7fff00',\r\n\t    'chocolate': '#d2691e',\r\n\t    'coral': '#ff7f50',\r\n\t    'cornflowerblue': '#6495ed',\r\n\t    'cornsilk': '#fff8dc',\r\n\t    'crimson': '#dc143c',\r\n\t    'cyan': '#00ffff',\r\n\t    'darkblue': '#00008b',\r\n\t    'darkcyan': '#008b8b',\r\n\t    'darkgoldenrod': '#b8860b',\r\n\t    'darkgray': '#a9a9a9',\r\n\t    'darkgreen': '#006400',\r\n\t    'darkgrey': '#a9a9a9',\r\n\t    'darkkhaki': '#bdb76b',\r\n\t    'darkmagenta': '#8b008b',\r\n\t    'darkolivegreen': '#556b2f',\r\n\t    'darkorange': '#ff8c00',\r\n\t    'darkorchid': '#9932cc',\r\n\t    'darkred': '#8b0000',\r\n\t    'darksalmon': '#e9967a',\r\n\t    'darkseagreen': '#8fbc8f',\r\n\t    'darkslateblue': '#483d8b',\r\n\t    'darkslategray': '#2f4f4f',\r\n\t    'darkslategrey': '#2f4f4f',\r\n\t    'darkturquoise': '#00ced1',\r\n\t    'darkviolet': '#9400d3',\r\n\t    'deeppink': '#ff1493',\r\n\t    'deepskyblue': '#00bfff',\r\n\t    'dimgray': '#696969',\r\n\t    'dimgrey': '#696969',\r\n\t    'dodgerblue': '#1e90ff',\r\n\t    'firebrick': '#b22222',\r\n\t    'floralwhite': '#fffaf0',\r\n\t    'forestgreen': '#228b22',\r\n\t    'fuchsia': '#ff00ff',\r\n\t    'gainsboro': '#dcdcdc',\r\n\t    'ghostwhite': '#f8f8ff',\r\n\t    'gold': '#ffd700',\r\n\t    'goldenrod': '#daa520',\r\n\t    'gray': '#808080',\r\n\t    'green': '#008000',\r\n\t    'greenyellow': '#adff2f',\r\n\t    'grey': '#808080',\r\n\t    'honeydew': '#f0fff0',\r\n\t    'hotpink': '#ff69b4',\r\n\t    'indianred': '#cd5c5c',\r\n\t    'indigo': '#4b0082',\r\n\t    'ivory': '#fffff0',\r\n\t    'khaki': '#f0e68c',\r\n\t    'lavender': '#e6e6fa',\r\n\t    'lavenderblush': '#fff0f5',\r\n\t    'lawngreen': '#7cfc00',\r\n\t    'lemonchiffon': '#fffacd',\r\n\t    'lightblue': '#add8e6',\r\n\t    'lightcoral': '#f08080',\r\n\t    'lightcyan': '#e0ffff',\r\n\t    'lightgoldenrodyellow': '#fafad2',\r\n\t    'lightgray': '#d3d3d3',\r\n\t    'lightgreen': '#90ee90',\r\n\t    'lightgrey': '#d3d3d3',\r\n\t    'lightpink': '#ffb6c1',\r\n\t    'lightsalmon': '#ffa07a',\r\n\t    'lightseagreen': '#20b2aa',\r\n\t    'lightskyblue': '#87cefa',\r\n\t    'lightslategray': '#778899',\r\n\t    'lightslategrey': '#778899',\r\n\t    'lightsteelblue': '#b0c4de',\r\n\t    'lightyellow': '#ffffe0',\r\n\t    'lime': '#00ff00',\r\n\t    'limegreen': '#32cd32',\r\n\t    'linen': '#faf0e6',\r\n\t    'magenta': '#ff00ff',\r\n\t    'maroon': '#800000',\r\n\t    'mediumaquamarine': '#66cdaa',\r\n\t    'mediumblue': '#0000cd',\r\n\t    'mediumorchid': '#ba55d3',\r\n\t    'mediumpurple': '#9370db',\r\n\t    'mediumseagreen': '#3cb371',\r\n\t    'mediumslateblue': '#7b68ee',\r\n\t    'mediumspringgreen': '#00fa9a',\r\n\t    'mediumturquoise': '#48d1cc',\r\n\t    'mediumvioletred': '#c71585',\r\n\t    'midnightblue': '#191970',\r\n\t    'mintcream': '#f5fffa',\r\n\t    'mistyrose': '#ffe4e1',\r\n\t    'moccasin': '#ffe4b5',\r\n\t    'navajowhite': '#ffdead',\r\n\t    'navy': '#000080',\r\n\t    'oldlace': '#fdf5e6',\r\n\t    'olive': '#808000',\r\n\t    'olivedrab': '#6b8e23',\r\n\t    'orange': '#ffa500',\r\n\t    'orangered': '#ff4500',\r\n\t    'orchid': '#da70d6',\r\n\t    'palegoldenrod': '#eee8aa',\r\n\t    'palegreen': '#98fb98',\r\n\t    'paleturquoise': '#afeeee',\r\n\t    'palevioletred': '#db7093',\r\n\t    'papayawhip': '#ffefd5',\r\n\t    'peachpuff': '#ffdab9',\r\n\t    'peru': '#cd853f',\r\n\t    'pink': '#ffc0cb',\r\n\t    'plum': '#dda0dd',\r\n\t    'powderblue': '#b0e0e6',\r\n\t    'purple': '#800080',\r\n\t    'rebeccapurple': '#663399',\r\n\t    'red': '#ff0000',\r\n\t    'rosybrown': '#bc8f8f',\r\n\t    'royalblue': '#4169e1',\r\n\t    'saddlebrown': '#8b4513',\r\n\t    'salmon': '#fa8072',\r\n\t    'sandybrown': '#f4a460',\r\n\t    'seagreen': '#2e8b57',\r\n\t    'seashell': '#fff5ee',\r\n\t    'sienna': '#a0522d',\r\n\t    'silver': '#c0c0c0',\r\n\t    'skyblue': '#87ceeb',\r\n\t    'slateblue': '#6a5acd',\r\n\t    'slategray': '#708090',\r\n\t    'slategrey': '#708090',\r\n\t    'snow': '#fffafa',\r\n\t    'springgreen': '#00ff7f',\r\n\t    'steelblue': '#4682b4',\r\n\t    'tan': '#d2b48c',\r\n\t    'teal': '#008080',\r\n\t    'thistle': '#d8bfd8',\r\n\t    'tomato': '#ff6347',\r\n\t    'turquoise': '#40e0d0',\r\n\t    'violet': '#ee82ee',\r\n\t    'wheat': '#f5deb3',\r\n\t    'white': '#ffffff',\r\n\t    'whitesmoke': '#f5f5f5',\r\n\t    'yellow': '#ffff00',\r\n\t    'yellowgreen': '#9acd32',\r\n\t};\n\n\tconst rgbReg = new RegExp(`^rgba?\\\\((${numberPattern})(%?),(${numberPattern})\\\\2,(${numberPattern})\\\\2(?:,(${numberPattern})(%?))?\\\\)$`, 'gi');\r\n\tconst hslReg = new RegExp(`^hsla?\\\\((${numberPattern})((?:${angel})?),(${numberPattern})%,(${numberPattern})%(?:,(${numberPattern})(%?))?\\\\)$`, 'gi');\r\n\tconst hexReg = /^#([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\r\n\tconst alphaMap = {\r\n\t    '255': 100,\r\n\t    '252': 99,\r\n\t    '250': 98,\r\n\t    '247': 97,\r\n\t    '245': 96,\r\n\t    '242': 95,\r\n\t    '240': 94,\r\n\t    '237': 93,\r\n\t    '235': 92,\r\n\t    '232': 91,\r\n\t    '230': 90,\r\n\t    '227': 89,\r\n\t    '224': 88,\r\n\t    '222': 87,\r\n\t    '219': 86,\r\n\t    '217': 85,\r\n\t    '214': 84,\r\n\t    '212': 83,\r\n\t    '209': 82,\r\n\t    '207': 81,\r\n\t    '204': 80,\r\n\t    '201': 79,\r\n\t    '199': 78,\r\n\t    '196': 77,\r\n\t    '194': 76,\r\n\t    '191': 75,\r\n\t    '189': 74,\r\n\t    '186': 73,\r\n\t    '184': 72,\r\n\t    '181': 71,\r\n\t    '179': 70,\r\n\t    '176': 69,\r\n\t    '173': 68,\r\n\t    '171': 67,\r\n\t    '168': 66,\r\n\t    '166': 65,\r\n\t    '163': 64,\r\n\t    '161': 63,\r\n\t    '158': 62,\r\n\t    '156': 61,\r\n\t    '153': 60,\r\n\t    '150': 59,\r\n\t    '148': 58,\r\n\t    '145': 57,\r\n\t    '143': 56,\r\n\t    '140': 55,\r\n\t    '138': 54,\r\n\t    '135': 53,\r\n\t    '133': 52,\r\n\t    '130': 51,\r\n\t    '128': 50,\r\n\t    '125': 49,\r\n\t    '122': 48,\r\n\t    '120': 47,\r\n\t    '117': 46,\r\n\t    '115': 45,\r\n\t    '112': 44,\r\n\t    '110': 43,\r\n\t    '107': 42,\r\n\t    '105': 41,\r\n\t    '102': 40,\r\n\t    '99': 39,\r\n\t    '97': 38,\r\n\t    '94': 37,\r\n\t    '92': 36,\r\n\t    '89': 35,\r\n\t    '87': 34,\r\n\t    '84': 33,\r\n\t    '82': 32,\r\n\t    '79': 31,\r\n\t    '77': 30,\r\n\t    '74': 29,\r\n\t    '71': 28,\r\n\t    '69': 27,\r\n\t    '66': 26,\r\n\t    '64': 25,\r\n\t    '61': 24,\r\n\t    '59': 23,\r\n\t    '56': 22,\r\n\t    '54': 21,\r\n\t    '51': 20,\r\n\t    '48': 19,\r\n\t    '46': 18,\r\n\t    '43': 17,\r\n\t    '41': 16,\r\n\t    '38': 15,\r\n\t    '36': 14,\r\n\t    '33': 13,\r\n\t    '31': 12,\r\n\t    '28': 11,\r\n\t    '26': 10,\r\n\t    '23': 9,\r\n\t    '20': 8,\r\n\t    '18': 7,\r\n\t    '15': 6,\r\n\t    '13': 5,\r\n\t    '10': 4,\r\n\t    '8': 3,\r\n\t    '5': 2,\r\n\t    '3': 1,\r\n\t    '0': 0,\r\n\t};\r\n\tconst parseColor = (color, digit = OPACITY_DIGIT) => {\r\n\t    // 首先对原始字符串进行基本的格式处理和类型转换\r\n\t    let _color = color.trim();\r\n\t    if (hasProp(keywords, _color)) {\r\n\t        // 关键字转为 16 位色\r\n\t        _color = keywords[_color];\r\n\t    }\r\n\t    else if (/^(?:rgb|hsl)a?\\s*\\(/.test(_color)) {\r\n\t        // 缩短函数类\r\n\t        _color = shortenFunc(_color);\r\n\t    }\r\n\t    const result = {\r\n\t        r: 0,\r\n\t        g: 0,\r\n\t        b: 0,\r\n\t        a: 1,\r\n\t        origin: _color,\r\n\t        valid: true,\r\n\t    };\r\n\t    // 16 位色直接解析\r\n\t    const hexMatch = _color.match(hexReg);\r\n\t    if (hexMatch) {\r\n\t        const hex = hexMatch[1];\r\n\t        switch (hex.length) {\r\n\t            case 3:\r\n\t                result.r = parseInt(`0x${hex[0]}${hex[0]}`, Hex);\r\n\t                result.g = parseInt(`0x${hex[1]}${hex[1]}`, Hex);\r\n\t                result.b = parseInt(`0x${hex[2]}${hex[2]}`, Hex);\r\n\t                break;\r\n\t            case 4: {\r\n\t                result.r = parseInt(`0x${hex[0]}${hex[0]}`, Hex);\r\n\t                result.g = parseInt(`0x${hex[1]}${hex[1]}`, Hex);\r\n\t                result.b = parseInt(`0x${hex[2]}${hex[2]}`, Hex);\r\n\t                const alpha4 = parseInt(`0x${hex[3]}${hex[3]}`, Hex);\r\n\t                result.a = ramda.has(`${alpha4}`, alphaMap) ? alphaMap[`${alpha4}`] / Hundred : alpha4 / FF;\r\n\t                break;\r\n\t            }\r\n\t            case 8: {\r\n\t                result.r = parseInt(`0x${hex[0]}${hex[1]}`, Hex);\r\n\t                result.g = parseInt(`0x${hex[2]}${hex[3]}`, Hex);\r\n\t                result.b = parseInt(`0x${hex[4]}${hex[5]}`, Hex);\r\n\t                const alpha8 = parseInt(`0x${hex[6]}${hex[7]}`, Hex);\r\n\t                result.a = ramda.has(`${alpha8}`, alphaMap) ? alphaMap[`${alpha8}`] / Hundred : alpha8 / FF;\r\n\t                break;\r\n\t            }\r\n\t            default:\r\n\t                result.r = parseInt(`0x${hex[0]}${hex[1]}`, Hex);\r\n\t                result.g = parseInt(`0x${hex[2]}${hex[3]}`, Hex);\r\n\t                result.b = parseInt(`0x${hex[4]}${hex[5]}`, Hex);\r\n\t                break;\r\n\t        }\r\n\t        return result;\r\n\t    }\r\n\t    // rgb/rgba/hsl/hsla 解析\r\n\t    rgbReg.lastIndex = 0; // 重置正则表达式匹配位置\r\n\t    const rgbMatch = rgbReg.exec(_color);\r\n\t    if (rgbMatch) {\r\n\t        result.r = valid(rgbMatch[2], FF, rgbMatch[1]);\r\n\t        result.g = valid(rgbMatch[2], FF, rgbMatch[3]);\r\n\t        result.b = valid(rgbMatch[2], FF, rgbMatch[4]);\r\n\t        if (rgbMatch[5]) {\r\n\t            result.a = validOpacity(rgbMatch[6], rgbMatch[5]);\r\n\t        }\r\n\t        return result;\r\n\t    }\r\n\t    hslReg.lastIndex = 0;\r\n\t    const hslMatch = hslReg.exec(_color);\r\n\t    if (hslMatch) {\r\n\t        let hue;\r\n\t        switch (hslMatch[2].toLowerCase()) {\r\n\t            case 'grad':\r\n\t                hue = +hslMatch[1] * CIRC / GRAD;\r\n\t                break;\r\n\t            case 'rad':\r\n\t                hue = +hslMatch[1] * CIRC / RAD;\r\n\t                break;\r\n\t            case 'turn':\r\n\t                hue = +hslMatch[1] * CIRC;\r\n\t                break;\r\n\t            default: // deg 和纯数值都按照 360 解析\r\n\t                hue = +hslMatch[1];\r\n\t                break;\r\n\t        }\r\n\t        [result.r, result.g, result.b] = hsl2rgb(hue, +hslMatch[3] / Hundred, +hslMatch[4] / Hundred);\r\n\t        if (hslMatch[5]) {\r\n\t            // 考虑到转来转去可能和原始字符串不同，保留一份缩短后的 hsl 原始字符串\r\n\t            result.a = validOpacity(hslMatch[6], hslMatch[5]);\r\n\t            result.origin = `hsl(${validNum(CIRC, hue)},${validNum(Hundred, +hslMatch[3])}%,${validNum(Hundred, +hslMatch[4])}%,${shortenAlpha(digit, result.a)})`;\r\n\t        }\r\n\t        return result;\r\n\t    }\r\n\t    if (_color === 'transparent') {\r\n\t        result.a = 0;\r\n\t        return result;\r\n\t    }\r\n\t    result.valid = false;\r\n\t    return result;\r\n\t};\n\n\tconst alphaReg = createFullMatch(`(${numberPattern})(%?)`);\r\n\t// 解析 opacity 类型的值，成功解析返回 0~1 之间的数值，无法解析则返回原始字符串\r\n\tconst parseAlpha = (s) => {\r\n\t    const alpha = alphaReg.exec(s);\r\n\t    if (alpha) {\r\n\t        return validOpacity(alpha[2], alpha[1]);\r\n\t    }\r\n\t    return s;\r\n\t};\n\n\tconst parseNumberList = (s) => {\r\n\t    const result = [];\r\n\t    // 首先全字匹配字符串，不符合的直接退出\r\n\t    if (numberListFullMatch.test(s)) {\r\n\t        // 重要！含有 g 修饰符的正则表达式 exec 时要先重置！\r\n\t        numberGlobal.lastIndex = 0;\r\n\t        let matches = numberGlobal.exec(s);\r\n\t        while (matches) {\r\n\t            result.push(+matches[0]);\r\n\t            matches = numberGlobal.exec(s);\r\n\t        }\r\n\t    }\r\n\t    return result;\r\n\t};\n\n\tconst valueIsEqual = (attrDefine, value1, value2) => {\r\n\t    if (value1 === value2) {\r\n\t        return true;\r\n\t    }\r\n\t    // 对某些特殊类型的值，先尝试进行解析再判断\r\n\t    // 颜色类型（例如 red、#f00、#ff0000、rgb(255,0,0) 都是等价的）\r\n\t    if (attrDefine.maybeColor) {\r\n\t        const color1 = parseColor(value1);\r\n\t        const color2 = parseColor(value2);\r\n\t        // 如果有一个颜色无法解析，则返回 false（否则会出现将 none 等价于 currentColor 的 bug）\r\n\t        if (!color1.valid || !color2.valid)\r\n\t            return false;\r\n\t        color1.origin = '';\r\n\t        color2.origin = '';\r\n\t        if (ramda.equals(color1, color2)) {\r\n\t            return true;\r\n\t        }\r\n\t    }\r\n\t    // 数值类型（例如 0.01、.01、1e-2 都是等价的）\r\n\t    if (attrDefine.maybeSizeNumber || attrDefine.maybeAccurateNumber) {\r\n\t        const nums2 = parseNumberList(value2);\r\n\t        if (nums2.length > 0 && ramda.equals(parseNumberList(value1), nums2)) {\r\n\t            return true;\r\n\t        }\r\n\t        // 特殊的，带单位的 0 和 0 是等价的\r\n\t        if (/^0[a-z]*$/i.test(value1) && /^0[a-z]*$/i.test(value2)) {\r\n\t            return true;\r\n\t        }\r\n\t    }\r\n\t    // 不透明度类型（例如 50%、0.5、.5 都是等价的）\r\n\t    if (attrDefine.maybeAlpha) {\r\n\t        if (parseAlpha(value1) === parseAlpha(value2)) {\r\n\t            return true;\r\n\t        }\r\n\t    }\r\n\t    return false;\r\n\t};\r\n\tconst attrIsEqual = (attrDefine, value, nodeName) => {\r\n\t    if (typeof attrDefine.initValue === 'string') {\r\n\t        return valueIsEqual(attrDefine, value, attrDefine.initValue);\r\n\t    }\r\n\t    else {\r\n\t        const initValue = attrDefine.initValue;\r\n\t        for (let ii = 0, il = initValue.length; ii < il; ii++) {\r\n\t            if (initValue[ii].tag.includes(nodeName) && valueIsEqual(attrDefine, value, initValue[ii].val)) {\r\n\t                return true;\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    return false;\r\n\t};\n\n\t// 检查\r\n\tconst checkStatusPseudo = (selectors) => selectors.some(selector => selector.pseudo.some(p => {\r\n\t    if (statusPseudoElement.includes(p.func)) {\r\n\t        return true;\r\n\t    }\r\n\t    if (p.isClass && statusPseudoClass.includes(p.func)) {\r\n\t        return true;\r\n\t    }\r\n\t    if (p.func === 'not' && p.value) {\r\n\t        const notSelectorGroups = svgVdom.parseSelector(p.value);\r\n\t        if (notSelectorGroups.some(notSelectors => notSelectors.some(notSelector => notSelector.pseudo.some(notP => statusPseudoElement.includes(notP.func) || (notP.isClass && statusPseudoClass.includes(notP.func)))))) {\r\n\t            return true;\r\n\t        }\r\n\t    }\r\n\t    return false;\r\n\t}));\n\n\tconst getSelectorPriority = (seletors) => {\r\n\t    const priority = {\r\n\t        id: 0,\r\n\t        class: 0,\r\n\t        tag: 0,\r\n\t    };\r\n\t    seletors.forEach(seletor => {\r\n\t        priority.id += seletor.id.length;\r\n\t        priority.class += seletor.class.length + seletor.pseudo.length + seletor.attr.length;\r\n\t        priority.tag += seletor.type ? 1 : 0;\r\n\t    });\r\n\t    return priority;\r\n\t};\r\n\tconst overrideAble = (priority1, priority2) => {\r\n\t    if (priority1.id !== priority2.id) {\r\n\t        return priority1.id > priority2.id;\r\n\t    }\r\n\t    else if (priority1.class !== priority2.class) {\r\n\t        return priority1.class > priority2.class;\r\n\t    }\r\n\t    else if (priority1.tag !== priority2.tag) {\r\n\t        return priority1.tag > priority2.tag;\r\n\t    }\r\n\t    return true;\r\n\t};\n\n\tconst check = (dom, styleItems) => {\r\n\t    const tagNodes = dom.querySelectorAll(svgVdom.NodeType.Tag);\r\n\t    tagNodes.forEach(node => {\r\n\t        let nodeStyle = {};\r\n\t        if (node.styles) {\r\n\t            nodeStyle = node.styles;\r\n\t        }\r\n\t        else {\r\n\t            node.styles = nodeStyle;\r\n\t        }\r\n\t        // 可能有 xlink 引用，css 样式会影响到 xlink 引用的节点\r\n\t        let xlinkObj;\r\n\t        node.attributes.forEach(attr => {\r\n\t            if (attr.fullname === 'style') {\r\n\t                // 行内样式优先级最高\r\n\t                const styleList = parseStyle(attr.value);\r\n\t                styleList.forEach(style => {\r\n\t                    nodeStyle[style.name] = {\r\n\t                        value: style.value,\r\n\t                        from: 'inline',\r\n\t                        important: style.important,\r\n\t                        overrideList: [],\r\n\t                    };\r\n\t                });\r\n\t            }\r\n\t            else if (attr.name === 'href') {\r\n\t                // 获取 xlink 引用\r\n\t                xlinkObj = dom.querySelector(node.getAttribute(attr.fullname));\r\n\t            }\r\n\t            else if (regularAttr[attr.fullname].couldBeStyle) {\r\n\t                // 属性优先级最低，但可以覆盖继承\r\n\t                const styleDefine = nodeStyle[attr.fullname];\r\n\t                if (!styleDefine || styleDefine.from === 'inherit') {\r\n\t                    nodeStyle[attr.fullname] = {\r\n\t                        value: attr.value,\r\n\t                        from: 'attr',\r\n\t                        overrideList: [],\r\n\t                    };\r\n\t                }\r\n\t            }\r\n\t        });\r\n\t        // 判断 style 标签内的样式，优先级高于 attr 和 inehrit\r\n\t        styleItems.forEach(styleItem => {\r\n\t            if (styleItem.nodes.includes(node)) {\r\n\t                if (styleItem.statusPseudo) {\r\n\t                    styleItem.styles.forEach(style => {\r\n\t                        if (nodeStyle[style.name]) {\r\n\t                            nodeStyle[style.name].statusPseudo = true;\r\n\t                        }\r\n\t                        else {\r\n\t                            nodeStyle[style.name] = {\r\n\t                                statusPseudo: true,\r\n\t                                from: 'inherit',\r\n\t                                value: '',\r\n\t                                overrideList: [],\r\n\t                            };\r\n\t                        }\r\n\t                    });\r\n\t                    return;\r\n\t                }\r\n\t                styleItem.styles.forEach(style => {\r\n\t                    const styleDefine = nodeStyle[style.name];\r\n\t                    if (!styleDefine || styleDefine.from === 'attr' || styleDefine.from === 'inherit'\r\n\t                        ||\r\n\t                            (styleDefine.from === 'styletag'\r\n\t                                &&\r\n\t                                    ((styleDefine.selectorPriority && overrideAble(styleItem.selectorPriority, styleDefine.selectorPriority) && styleDefine.important === style.important)\r\n\t                                        ||\r\n\t                                            (!styleDefine.important && style.important)))\r\n\t                        ||\r\n\t                            (styleDefine.from === 'inline' && !styleDefine.important && style.important)) {\r\n\t                        const overrideList = [];\r\n\t                        let statusPseudo;\r\n\t                        if (styleDefine) {\r\n\t                            overrideList.push(...styleDefine.overrideList);\r\n\t                            statusPseudo = styleDefine.statusPseudo;\r\n\t                            if (styleDefine.from === 'styletag'\r\n\t                                &&\r\n\t                                    ((styleDefine.selectorPriority && overrideAble(styleItem.selectorPriority, styleDefine.selectorPriority) && styleDefine.important === style.important)\r\n\t                                        ||\r\n\t                                            (!styleDefine.important && style.important))) {\r\n\t                                overrideList.push({\r\n\t                                    from: 'styletag',\r\n\t                                    selector: styleDefine.selector,\r\n\t                                    selectorPriority: styleDefine.selectorPriority,\r\n\t                                    important: styleDefine.important,\r\n\t                                    value: styleDefine.value,\r\n\t                                });\r\n\t                            }\r\n\t                            else if (styleDefine.from === 'inline' && !styleDefine.important && style.important) {\r\n\t                                overrideList.push({\r\n\t                                    from: 'inline',\r\n\t                                    value: styleDefine.value,\r\n\t                                });\r\n\t                            }\r\n\t                        }\r\n\t                        nodeStyle[style.name] = {\r\n\t                            value: style.value,\r\n\t                            from: 'styletag',\r\n\t                            selector: styleItem.selector,\r\n\t                            selectorPriority: styleItem.selectorPriority,\r\n\t                            important: style.important,\r\n\t                            overrideList,\r\n\t                            statusPseudo,\r\n\t                        };\r\n\t                    }\r\n\t                    else {\r\n\t                        if (styleDefine && styleDefine.from === 'inline') {\r\n\t                            // 标记覆盖了 styletag 中的属性\r\n\t                            styleDefine.override = true;\r\n\t                        }\r\n\t                        styleDefine.overrideList.push({\r\n\t                            from: 'styletag',\r\n\t                            selector: styleItem.selector,\r\n\t                            important: style.important,\r\n\t                            selectorPriority: styleItem.selectorPriority,\r\n\t                            value: style.value,\r\n\t                        });\r\n\t                    }\r\n\t                });\r\n\t            }\r\n\t        });\r\n\t        const parentNode = node.parentNode;\r\n\t        if (parentNode && parentNode.styles) {\r\n\t            // 可能从父元素继承的样式\r\n\t            Object.keys(parentNode.styles).forEach(key => {\r\n\t                if (!hasProp(nodeStyle, key) && regularAttr[key].inherited) {\r\n\t                    nodeStyle[key] = {\r\n\t                        value: parentNode.styles[key].value,\r\n\t                        from: 'inherit',\r\n\t                        overrideList: [],\r\n\t                    };\r\n\t                }\r\n\t            });\r\n\t        }\r\n\t        if (xlinkObj) {\r\n\t            let styleObj = {};\r\n\t            if (xlinkObj.styles) {\r\n\t                styleObj = xlinkObj.styles;\r\n\t            }\r\n\t            else {\r\n\t                xlinkObj.styles = styleObj;\r\n\t            }\r\n\t            Object.keys(nodeStyle).forEach(key => {\r\n\t                if (!hasProp(styleObj, key)) {\r\n\t                    styleObj[key] = {\r\n\t                        value: nodeStyle[key].value,\r\n\t                        from: 'inherit',\r\n\t                        overrideList: [],\r\n\t                    };\r\n\t                }\r\n\t            });\r\n\t        }\r\n\t    });\r\n\t};\r\n\t// 解析样式树，为每个节点增加 styles 属性，标记当前节点生效的样式信息\r\n\tconst parseStyleTree = (dom) => {\r\n\t    // 首先清理掉曾经被解析过的样式树\r\n\t    dom.querySelectorAll(svgVdom.NodeType.Tag).forEach(node => {\r\n\t        if (node.styles) {\r\n\t            delete node.styles;\r\n\t        }\r\n\t    });\r\n\t    const styleItems = [];\r\n\t    // 记录 stylesheet 选择器权重和影响到的节点\r\n\t    if (dom.stylesheet) {\r\n\t        dom.stylesheet.stylesheet.rules.forEach((styleRule) => {\r\n\t            // 只针对规则类\r\n\t            if (styleRule.type === 'rule' && styleRule.declarations && styleRule.selectors) {\r\n\t                const styles = [];\r\n\t                styleRule.declarations.forEach((ruleItem) => {\r\n\t                    if (ruleItem.property && ruleItem.value) {\r\n\t                        styles.push({\r\n\t                            name: ruleItem.property,\r\n\t                            fullname: ruleItem.property,\r\n\t                            value: ruleItem.value.replace(importantReg, ''),\r\n\t                            important: importantReg.test(ruleItem.value),\r\n\t                        });\r\n\t                    }\r\n\t                });\r\n\t                for (let si = styleRule.selectors.length; si--;) {\r\n\t                    const selector = svgVdom.parseSelector(styleRule.selectors[si])[0];\r\n\t                    const selectorPriority = getSelectorPriority(selector);\r\n\t                    const nodes = dom.querySelectorAll(selector);\r\n\t                    if (nodes.length) {\r\n\t                        styleItems.push({\r\n\t                            styles,\r\n\t                            selector,\r\n\t                            selectorPriority,\r\n\t                            statusPseudo: checkStatusPseudo(selector),\r\n\t                            nodes,\r\n\t                        });\r\n\t                    }\r\n\t                }\r\n\t            }\r\n\t        });\r\n\t    }\r\n\t    check(dom, styleItems);\r\n\t};\n\n\tconst applyStyle = async (dom) => new Promise(resolve => {\r\n\t    if (dom.stylesheet) {\r\n\t        parseStyleTree(dom);\r\n\t        const cssRules = dom.stylesheet.stylesheet;\r\n\t        for (let i = cssRules.rules.length; i--;) {\r\n\t            const styleRule = cssRules.rules[i];\r\n\t            if (styleRule.type === 'rule') {\r\n\t                const declarations = styleRule.declarations;\r\n\t                const matchNodes = dom.querySelectorAll(svgVdom.parseSelector(styleRule.selectors.join(',')));\r\n\t                // 一条 CSS 规则只命中一个元素，才执行本优化\r\n\t                if (matchNodes.length === 1) {\r\n\t                    const node = matchNodes[0];\r\n\t                    const nodeStyles = node.styles;\r\n\t                    const nodeStyleAttr = parseStyle(node.getAttribute('style') || '');\r\n\t                    for (let mi = 0; mi < declarations.length; mi++) {\r\n\t                        const ruleItem = declarations[mi];\r\n\t                        const name = ruleItem.property;\r\n\t                        const isImportant = importantReg.test(ruleItem.value);\r\n\t                        const value = ruleItem.value.replace(importantReg, '');\r\n\t                        const styleItem = nodeStyles[name];\r\n\t                        // 明确解析后来自 styletag 的样式才放到 style 属性中\r\n\t                        if (styleItem && styleItem.from === 'styletag' && valueIsEqual(regularAttr[name], styleItem.value, value)) {\r\n\t                            nodeStyleAttr.push({\r\n\t                                fullname: name,\r\n\t                                name,\r\n\t                                value,\r\n\t                                important: isImportant,\r\n\t                            });\r\n\t                        }\r\n\t                    }\r\n\t                    node.setAttribute('style', stringifyStyle(nodeStyleAttr));\r\n\t                    cssRules.rules.splice(i, 1);\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    resolve();\r\n\t});\n\n\t// TODO：目前只验证了 href 和 xlink:href，其它 IRI 或 funcIRI 属性是否也需要验证？\r\n\t// 遇到引用属性，还需要递归验证被引用对象是否可应用样式\r\n\tconst getXlink = (dom, idStr) => dom.querySelector(idStr);\r\n\t// 定义一个特殊的遍历方法，只接收一个 condition 方法，只有该方法返回 true 才继续遍历子元素\r\n\tconst traversal$1 = (condition, node) => {\r\n\t    // 此处不能用 forEach ，for 循环可以避免当前节点被移除导致下一个节点不会被遍历到的问题\r\n\t    for (const childNode of node.children) {\r\n\t        if (condition(childNode)) {\r\n\t            traversal$1(condition, childNode);\r\n\t        }\r\n\t    }\r\n\t};\r\n\tconst check$1 = (styleDefine, node, dom, unique, fromStyleTag, isImportant) => {\r\n\t    var _a;\r\n\t    if (!node)\r\n\t        return false;\r\n\t    // 如果是检测 style 标签的样式，则只要遇到同名的 style 属性就返回 false\r\n\t    if (fromStyleTag) {\r\n\t        const childStyleList = parseStyle((_a = node.getAttribute('style')) !== null && _a !== void 0 ? _a : '');\r\n\t        if (childStyleList.some(style => {\r\n\t            return style.fullname === styleDefine.name && (!isImportant || style.important);\r\n\t        })) {\r\n\t            return false;\r\n\t        }\r\n\t    }\r\n\t    if (styleDefine.applyTo.includes(node.nodeName))\r\n\t        return true;\r\n\t    // 因为递归可能存在循环引用，所以需要排重\r\n\t    if (unique.has(node)) {\r\n\t        return false;\r\n\t    }\r\n\t    unique.add(node);\r\n\t    let result = false;\r\n\t    if (node.hasAttribute('href')) {\r\n\t        result = check$1(styleDefine, getXlink(dom, node.getAttribute('href')), dom, unique, fromStyleTag, false);\r\n\t    }\r\n\t    else if (node.hasAttribute('xlink:href')) {\r\n\t        result = check$1(styleDefine, getXlink(dom, node.getAttribute('xlink:href')), dom, unique, fromStyleTag, false);\r\n\t    }\r\n\t    // 已经命中就不需要再继续了\r\n\t    if (result)\r\n\t        return true;\r\n\t    // 逻辑在判断函数里做，不在回调函数里做\r\n\t    traversal$1((childNode) => {\r\n\t        // 已经命中就不再继续\r\n\t        if (result)\r\n\t            return false;\r\n\t        // 因为递归可能存在循环引用，所以需要排重\r\n\t        if (unique.has(childNode))\r\n\t            return false;\r\n\t        unique.add(childNode);\r\n\t        // 检查属性看是否被覆盖，是就不再继续\r\n\t        for (let i = childNode.attributes.length; i--;) {\r\n\t            const attr = childNode.attributes[i];\r\n\t            if (attr.fullname === 'style') {\r\n\t                const childStyleList = parseStyle(attr.value);\r\n\t                if (childStyleList.some(style => style.fullname === styleDefine.name)) {\r\n\t                    return false;\r\n\t                }\r\n\t            }\r\n\t            else if (attr.fullname === styleDefine.name) {\r\n\t                return false;\r\n\t            }\r\n\t        }\r\n\t        // 通过前面的验证，并符合样式应用条件，就找到了命中的结果\r\n\t        if (styleDefine.applyTo.includes(childNode.nodeName)) {\r\n\t            result = true;\r\n\t            return false; // 已经有命中的结果就不必再遍历了\r\n\t        }\r\n\t        else { // 否则继续遍历子元素\r\n\t            // 没有命中，但具有 IRI 引用，则继续\r\n\t            if (childNode.hasAttribute('href')) {\r\n\t                if (check$1(styleDefine, getXlink(dom, childNode.getAttribute('href')), dom, unique, fromStyleTag, false)) {\r\n\t                    result = true;\r\n\t                    return false;\r\n\t                }\r\n\t            }\r\n\t            else if (childNode.hasAttribute('xlink:href')) {\r\n\t                if (check$1(styleDefine, getXlink(dom, childNode.getAttribute('xlink:href')), dom, unique, fromStyleTag, false)) {\r\n\t                    result = true;\r\n\t                    return false;\r\n\t                }\r\n\t            }\r\n\t            return true;\r\n\t        }\r\n\t    }, node);\r\n\t    return result;\r\n\t};\r\n\t// 深度分析，判断样式继承链上是否存在可应用对象\r\n\tconst checkApply = (styleDefine, node, dom, fromStyleTag = false, // 标记是否为检测 style 标签的样式\r\n\tisImportant = false) => check$1(styleDefine, node, dom, new Set(), fromStyleTag, isImportant);\n\n\tconst shortenStyle = (s) => mixWhiteSpace(s.trim()).replace(/\\s*([@='\"#.*+>~[\\](){}:,;])\\s*/g, '$1').replace(/;$/, '');\n\n\tconst styleToValue = ramda.pipe(stringifyStyle, shortenStyle);\n\n\tconst collapseAttributes = (node1, node2) => {\r\n\t    const attrObj = {};\r\n\t    node1.attributes.forEach(attr => {\r\n\t        attrObj[attr.fullname] = attr;\r\n\t    });\r\n\t    node2.attributes.forEach(attr => {\r\n\t        if (hasProp(attrObj, attr.fullname)) {\r\n\t            if (transformAttributes.includes(attr.fullname)) {\r\n\t                attrObj[attr.fullname].value = `${attr.value} ${attrObj[attr.fullname].value}`;\r\n\t            }\r\n\t        }\r\n\t        else {\r\n\t            node1.setAttribute(attr.name, attr.value, attr.namespace);\r\n\t            attrObj[attr.fullname] = attr;\r\n\t        }\r\n\t    });\r\n\t};\r\n\tconst checkStyleTrans = (dom, node) => {\r\n\t    var _a;\r\n\t    parseStyleTree(dom);\r\n\t    const styleAttr = node.getAttribute('style');\r\n\t    if (styleAttr) {\r\n\t        const styleList = parseStyle(styleAttr);\r\n\t        const transStyleList = new Map();\r\n\t        for (let si = styleList.length; si--;) {\r\n\t            const styleItem = styleList[si];\r\n\t            const styleDefine = regularAttr[styleItem.fullname];\r\n\t            // 只要有一个样式可应用，就中断验证\r\n\t            if (styleDefine.applyTo.includes('g')) {\r\n\t                return;\r\n\t            }\r\n\t            // 获取样式可生效的子元素列表（判断依据是可被应用，并且样式来自于继承）\r\n\t            const affectChildren = node.children.filter((child) => { var _a, _b; return checkApply(styleDefine, child, dom) && ((_b = (_a = child.styles) === null || _a === void 0 ? void 0 : _a[styleItem.fullname]) === null || _b === void 0 ? void 0 : _b.from) === 'inherit'; });\r\n\t            // 无可应用的子元素，跳过\r\n\t            if (affectChildren.length === 0)\r\n\t                continue;\r\n\t            // 只有一个子元素可应用，标记迁移\r\n\t            if (affectChildren.length === 1) {\r\n\t                transStyleList.set(affectChildren[0], styleItem);\r\n\t                continue;\r\n\t            }\r\n\t            // 只要有一个样式对多个子元素生效，就中断验证\r\n\t            return;\r\n\t        }\r\n\t        for (const [childNode, styleItem] of transStyleList) {\r\n\t            const childStyle = parseStyle((_a = childNode.getAttribute('style')) !== null && _a !== void 0 ? _a : '');\r\n\t            // 因为是继承的，所以移除 important\r\n\t            styleItem.important = false;\r\n\t            childStyle.push(styleItem);\r\n\t            childNode.setAttribute('style', styleToValue(childStyle));\r\n\t        }\r\n\t        node.removeAttribute('style');\r\n\t    }\r\n\t};\r\n\t// 包含某些特定属性，不允许进行塌陷\r\n\tconst cantCollapse = (node) => node.attributes.filter(attr => cantCollapseAttributes.includes(attr.fullname)).length;\r\n\tconst collapseG = async (dom) => new Promise(resolve => {\r\n\t    const gTags = dom.querySelectorAll('g');\r\n\t    for (let i = gTags.length; i--;) {\r\n\t        const node = gTags[i];\r\n\t        const children = node.children;\r\n\t        if (!children.length) {\r\n\t            node.remove();\r\n\t            continue;\r\n\t        }\r\n\t        checkStyleTrans(dom, node);\r\n\t        if (!cantCollapse(node)) {\r\n\t            if (children.length === 1) { // 只有一个子节点\r\n\t                const childNode = children[0];\r\n\t                collapseAttributes(childNode, node);\r\n\t                node.parentNode.replaceChild(childNode, node);\r\n\t            }\r\n\t            else if (!node.attributes.length) { // 没有属性\r\n\t                node.parentNode.replaceChild(children, node);\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    resolve();\r\n\t});\n\n\tconst mergeTspan = (node, parent) => {\r\n\t    var _a;\r\n\t    const nodeStyle = parseStyle((_a = node.getAttribute('style')) !== null && _a !== void 0 ? _a : '');\r\n\t    for (let i = parent.attributes.length; i--;) {\r\n\t        const attr = parent.attributes[i];\r\n\t        if (attr.fullname === 'style') {\r\n\t            const parentStyle = parseStyle(attr.value);\r\n\t            for (let pi = parentStyle.length; pi--;) {\r\n\t                const styleItem = parentStyle[pi];\r\n\t                const styleDefine = regularAttr[styleItem.fullname];\r\n\t                // 继承的优先级最低，所以不管子元素具有重名的属性还是 style，都要移除父元素的对应属性\r\n\t                if (!styleDefine.isUndef && node.hasAttribute(styleItem.fullname)) {\r\n\t                    continue;\r\n\t                }\r\n\t                if (nodeStyle.some(({ fullname }) => fullname === styleItem.fullname)) {\r\n\t                    continue;\r\n\t                }\r\n\t                nodeStyle.unshift({ ...styleItem });\r\n\t            }\r\n\t            node.setAttribute('style', styleToValue(nodeStyle));\r\n\t        }\r\n\t        else {\r\n\t            const attrDefine = regularAttr[attr.fullname];\r\n\t            if (!node.hasAttribute(attr.fullname) && !attrDefine.isUndef) {\r\n\t                node.setAttribute(attr.fullname, attr.value);\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    const index = parent.childNodes.indexOf(node);\r\n\t    node.appendChild(parent.childNodes.slice(index + 1));\r\n\t    node.insertBefore(parent.childNodes.slice(0, index), node.childNodes[0]);\r\n\t    parent.parentNode.replaceChild(node, parent);\r\n\t};\r\n\tconst collapseTextwrap = async (dom) => new Promise(resolve => {\r\n\t    const textWraps = dom.querySelectorAll('tspan');\r\n\t    textWraps.forEach(node => {\r\n\t        if (node.attributes.every(({ value }) => !value)) {\r\n\t            // 没有属性，或所有属性为空，可以进行塌陷\r\n\t            node.parentNode.replaceChild(node.childNodes, node);\r\n\t        }\r\n\t        else {\r\n\t            // tspan 嵌套需要把文本节点拿出来放到父元素内\r\n\t            if (\r\n\t            // 暂时只处理单一子元素的情况，多子元素可能因为复制属性和样式导致“反优化”\r\n\t            node.querySelectorAll('>tspan').length === 1\r\n\t                &&\r\n\t                    // 注意如果存在非空文本节点，不能进行塌陷\r\n\t                    node.childNodes.filter(childNode => \r\n\t                    // text 或 cdata 类型\r\n\t                    (childNode.nodeType === svgVdom.NodeType.Text || childNode.nodeType === svgVdom.NodeType.CDATA)\r\n\t                        &&\r\n\t                            // 内容非空\r\n\t                            childNode.textContent).length === 0) {\r\n\t                mergeTspan(node.querySelector('>tspan'), node);\r\n\t            }\r\n\t        }\r\n\t    });\r\n\t    resolve();\r\n\t});\n\n\tconst keysToKey = (obj) => Object.keys(obj).sort().join('|');\n\n\t// 获取属性（根据 SVG 覆盖规则，css 优先）\r\n\tconst getAttr = (node, key, defaultVal) => {\r\n\t    let val = defaultVal;\r\n\t    if (node.hasAttribute(key)) {\r\n\t        val = node.getAttribute(key);\r\n\t    }\r\n\t    const styles = node.styles;\r\n\t    if (hasProp(styles, key)) {\r\n\t        val = styles[key].value;\r\n\t    }\r\n\t    return val;\r\n\t};\n\n\t// // TODO 验证路径是否相交\r\n\t// const checkPath = (str: string) => {\r\n\t// \tconst paths: number[][] = [];\r\n\t// \tconst pathItems = doCompute(parsePath(str));\r\n\t// \tlet verify = true;\r\n\t// \tlet currentPath: number[] = [];\r\n\t// \tpathItems.every(item => {\r\n\t// \t\tswitch (item.type) {\r\n\t// \t\t\t// 平移 - 绝对\r\n\t// \t\t\tcase 'M':\r\n\t// \t\t\t\tcurrentPath = [item.val[0], item.val[1]];\r\n\t// \t\t\t\tpaths.push(currentPath);\r\n\t// \t\t\t\treturn true;\r\n\t// \t\t\tcase 'm':\r\n\t// \t\t\t\tcurrentPath = [plus(item.from[0], item.val[0]), plus(item.from[1], item.val[1])];\r\n\t// \t\t\t\tpaths.push(currentPath);\r\n\t// \t\t\t\treturn true;\r\n\t// \t\t\tcase 'Z':\r\n\t// \t\t\tcase 'z':\r\n\t// \t\t\t\tcurrentPath.push(currentPath[0], currentPath[1]);\r\n\t// \t\t\t\treturn true;\r\n\t// \t\t\t// 水平直线 - 绝对\r\n\t// \t\t\tcase 'H':\r\n\t// \t\t\t\titem.val.forEach(val => {\r\n\t// \t\t\t\t\tcurrentPath.push(val, item.from[1]);\r\n\t// \t\t\t\t});\r\n\t// \t\t\t\treturn true;\r\n\t// \t\t\t// 水平直线 - 相对\r\n\t// \t\t\tcase 'h':\r\n\t// \t\t\t\titem.val.reduce((accumulator, val) => {\r\n\t// \t\t\t\t\tcurrentPath.push(plus(val, accumulator), item.from[1]);\r\n\t// \t\t\t\t\treturn plus(val, accumulator);\r\n\t// \t\t\t\t}, item.from[0]);\r\n\t// \t\t\t\treturn true;\r\n\t// \t\t\t// 垂直直线 - 绝对\r\n\t// \t\t\tcase 'V':\r\n\t// \t\t\t\titem.val.forEach(val => {\r\n\t// \t\t\t\t\tcurrentPath.push(item.from[0], val);\r\n\t// \t\t\t\t});\r\n\t// \t\t\t\treturn true;\r\n\t// \t\t\t// 垂直直线 - 相对\r\n\t// \t\t\tcase 'v':\r\n\t// \t\t\t\titem.val.reduce((accumulator, val) => {\r\n\t// \t\t\t\t\tcurrentPath.push(item.from[0], plus(val, accumulator));\r\n\t// \t\t\t\t\treturn plus(val, accumulator);\r\n\t// \t\t\t\t}, item.from[1]);\r\n\t// \t\t\t\treturn true;\r\n\t// \t\t\t// 直线 - 绝对\r\n\t// \t\t\tcase 'L':\r\n\t// \t\t\t\tcurrentPath.push(...item.val);\r\n\t// \t\t\t\treturn true;\r\n\t// \t\t\t// 直线 - 相对\r\n\t// \t\t\tcase 'l':\r\n\t// \t\t\t\tcurrentPath.reduce((accumulator, val, index) => {\r\n\t// \t\t\t\t\tcurrentPath.push(plus(accumulator[index % 2], val));\r\n\t// \t\t\t\t\treturn [plus(accumulator[0], val * (1 - (index % 2))), plus(accumulator[1], val * (index % 2))];\r\n\t// \t\t\t\t}, item.from);\r\n\t// \t\t\t\treturn true;\r\n\t// \t\t\tdefault:\r\n\t// \t\t\t\tverify = false;\r\n\t// \t\t\t\treturn false;\r\n\t// \t\t}\r\n\t// \t});\r\n\t// \treturn {\r\n\t// \t\tverify,\r\n\t// \t\tpaths\r\n\t// \t};\r\n\t// }\r\n\t// const noJoin = (attr1: string, attr2: string): boolean => {\r\n\t// \tconst checkResult1 = checkPath(attr1);\r\n\t// \tconst checkResult2 = checkPath(attr2);\r\n\t// \tif (checkResult1.verify && checkResult2.verify) {\r\n\t// \t\t// TODO： 验证碰撞\r\n\t// \t}\r\n\t// \treturn true;\r\n\t// }\r\n\t// TODO：应该验证样式表命中的情况，且遇到了 :nth-child 的坑\r\n\tconst canbeCombine = (node1, node2, combineFill, combineOpacity) => {\r\n\t    // 允许路径合并的条件：\r\n\t    // 1、所有属性和样式（包括继承样式）相同\r\n\t    // 2、相邻\r\n\t    // 3、没有 fill 或 stroke\r\n\t    // 4、所有可见透明度 ≥ 1\r\n\t    // 5、不能存在任何子节点\r\n\t    // 6、不能存在 marker\r\n\t    // TODO 路径没有相交或包含\r\n\t    // 不能存在任何子节点\r\n\t    if (node1.children.length || node2.children.length) {\r\n\t        return false;\r\n\t    }\r\n\t    // 有 marker 引用不能进行合并\r\n\t    const hasMarker = getAttr(node1, 'marker-start', 'none') !== 'none' || getAttr(node1, 'marker-mid', 'none') !== 'none' || getAttr(node1, 'marker-end', 'none') !== 'none';\r\n\t    if (hasMarker) {\r\n\t        return false;\r\n\t    }\r\n\t    // 属性必须相同\r\n\t    if (!attrDiff(node1, node2)) {\r\n\t        return false;\r\n\t    }\r\n\t    const styles1 = node1.styles;\r\n\t    const styles2 = node2.styles;\r\n\t    // 计算后的样式必须相同\r\n\t    if (!styleDiff(styles1, styles2)) {\r\n\t        return false;\r\n\t    }\r\n\t    const noOpacity = !hasProp(styles1, 'opacity') || parseAlpha(styles1.opacity.value) === 1;\r\n\t    const noStrokeOpacity = parseColor(hasProp(styles1, 'stroke') ? styles1.stroke.value : '').a === 1 && (!hasProp(styles1, 'stroke-opacity') || parseAlpha(styles1['stroke-opacity'].value) === 1);\r\n\t    const noFillOpacity = parseColor(hasProp(styles1, 'fill') ? styles1.fill.value : '').a === 1 && (!hasProp(styles1, 'fill-opacity') || parseAlpha(styles1['fill-opacity'].value) === 1);\r\n\t    // fill 为空或允许合并\r\n\t    const noFill = (hasProp(styles1, 'fill') && styles1.fill.value === 'none') || combineFill;\r\n\t    // 填充规则不能是 evenodd 必须是 nonzero\r\n\t    const noEvenOdd = !hasProp(styles1, 'fill-rule') || styles1['fill-rule'].value !== 'evenodd';\r\n\t    // stroke 为空\r\n\t    const noStroke = (!hasProp(styles1, 'stroke') || styles1.stroke.value === 'none');\r\n\t    // opacity 大于等于 1 或允许合并\r\n\t    const withoutOpacity = combineOpacity || (noOpacity && noFillOpacity && noStrokeOpacity);\r\n\t    return withoutOpacity && (noFill || noStroke) && noEvenOdd /* || noJoin(node1.getAttribute('d'), node2.getAttribute('d'))*/;\r\n\t};\r\n\tconst attrDiff = (node1, node2) => {\r\n\t    const obj1 = {};\r\n\t    const obj2 = {};\r\n\t    let same = true;\r\n\t    node1.attributes.forEach(({ value, fullname }) => {\r\n\t        if (fullname !== 'd' && fullname !== 'style') {\r\n\t            obj1[fullname] = value;\r\n\t        }\r\n\t    });\r\n\t    node2.attributes.forEach(({ value, fullname }) => {\r\n\t        if (fullname !== 'd' && fullname !== 'style') {\r\n\t            obj2[fullname] = value;\r\n\t            const attrDefine = regularAttr[fullname];\r\n\t            if (!hasProp(obj1, fullname) || !valueIsEqual(attrDefine, value, obj1[fullname])) {\r\n\t                same = false;\r\n\t            }\r\n\t        }\r\n\t    });\r\n\t    return same && keysToKey(obj1) === keysToKey(obj2);\r\n\t};\r\n\tconst styleDiff = (styles1, styles2) => {\r\n\t    let same = true;\r\n\t    Object.keys(styles1).forEach(key => {\r\n\t        const attrDefine = regularAttr[key];\r\n\t        if (!hasProp(styles2, key) || !valueIsEqual(attrDefine, styles1[key].value, styles2[key].value)) {\r\n\t            same = false;\r\n\t        }\r\n\t    });\r\n\t    return same && keysToKey(styles1) === keysToKey(styles2);\r\n\t};\r\n\tconst combinePath = async (dom, { option: { disregardFill, disregardOpacity, } }) => new Promise(resolve => {\r\n\t    parseStyleTree(dom);\r\n\t    const pathTags = dom.querySelectorAll('path');\r\n\t    for (let i = pathTags.length - 1; i > 0; i--) {\r\n\t        const pathItem = pathTags[i];\r\n\t        const prevItem = pathTags[i - 1];\r\n\t        const parent = pathItem.parentNode;\r\n\t        // 两个 path 节点的父节点必须相同\r\n\t        if (prevItem.parentNode === parent) {\r\n\t            const siblings = parent.children;\r\n\t            const index = siblings.indexOf(pathItem);\r\n\t            const pIndex = siblings.indexOf(prevItem);\r\n\t            // 两个 path 节点必须相邻，否则跳过\r\n\t            if (pIndex !== index - 1) {\r\n\t                break;\r\n\t            }\r\n\t            if (canbeCombine(pathItem, prevItem, disregardFill, disregardOpacity)) {\r\n\t                const prevD = prevItem.getAttribute('d') || '';\r\n\t                const pathD = pathItem.getAttribute('d') || '';\r\n\t                // 路径拼合时，第一个 m 要转为绝对，否则会有 bug\r\n\t                prevItem.setAttribute('d', `${prevD}${pathD.replace(/^m/, 'M')}`);\r\n\t                pathItem.remove();\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    resolve();\r\n\t});\n\n\t/*\r\n\t * 获取一个数字的精度\r\n\t */\r\n\tconst digit = (n) => {\r\n\t    // 忽略 NaN 和 Infinity\r\n\t    if (!isFinite(n)) {\r\n\t        return 0;\r\n\t    }\r\n\t    const s = n.toString();\r\n\t    // 科学计数法的情况\r\n\t    if (isExp(s)) {\r\n\t        const eIndex = s.indexOf('e');\r\n\t        if (s[eIndex + 1] === '-') {\r\n\t            const exp = +s.slice(eIndex + 2);\r\n\t            // 1.00001e-7 的精度是 12\r\n\t            if (isFloat(s)) {\r\n\t                return eIndex - (s.indexOf('.') + 1) + exp;\r\n\t            }\r\n\t            return exp;\r\n\t        }\r\n\t        else {\r\n\t            return 0;\r\n\t        }\r\n\t    }\r\n\t    // 小数的情况\r\n\t    if (isFloat(s)) {\r\n\t        return s.length - (s.indexOf('.') + 1);\r\n\t    }\r\n\t    // 整数的情况\r\n\t    return 0;\r\n\t};\n\n\t/*\r\n\t * 保证精度的乘法\r\n\t * 用于解决 双精度浮点数 导致精度变化的问题\r\n\t */\r\n\tconst multiply = ramda.curry((a, b) => {\r\n\t    const dgt = digit(a) + digit(b);\r\n\t    return toFixed(dgt, a * b);\r\n\t});\n\n\t/*\r\n\t * 保证精度的加法\r\n\t * 用于解决 双精度浮点数 导致精度变化的问题\r\n\t */\r\n\tconst plus = ramda.curry((a, b) => {\r\n\t    const dgt = Math.max(digit(a), digit(b));\r\n\t    return toFixed(dgt, a + b);\r\n\t});\n\n\tconst HALF_CIRC$1 = 180;\r\n\tclass Matrix {\r\n\t    constructor(a = 1, b = 0, c = 0, d = 1, e = 0, f = 0) {\r\n\t        this.a = a;\r\n\t        this.b = b;\r\n\t        this.c = c;\r\n\t        this.d = d;\r\n\t        this.e = e;\r\n\t        this.f = f;\r\n\t    }\r\n\t    translate(x, y) {\r\n\t        return this.multiply(new Matrix(1, 0, 0, 1, x, y));\r\n\t    }\r\n\t    rotate(corner) {\r\n\t        const arg = corner * Math.PI / HALF_CIRC$1;\r\n\t        return this.multiply(new Matrix(Math.cos(arg), Math.sin(arg), -Math.sin(arg), Math.cos(arg), 0, 0));\r\n\t    }\r\n\t    scale(xscale, yscale = null) {\r\n\t        return this.multiply(new Matrix(xscale, 0, 0, yscale === null ? xscale : yscale, 0, 0));\r\n\t    }\r\n\t    skewX(corner) {\r\n\t        const skew = corner * Math.PI / HALF_CIRC$1;\r\n\t        return this.multiply(new Matrix(1, 0, Math.tan(skew), 1, 0, 0));\r\n\t    }\r\n\t    skewY(corner) {\r\n\t        const skew = corner * Math.PI / HALF_CIRC$1;\r\n\t        return this.multiply(new Matrix(1, Math.tan(skew), 0, 1, 0, 0));\r\n\t    }\r\n\t    multiply(m) {\r\n\t        const a = this.a * m.a + this.c * m.b;\r\n\t        const b = this.b * m.a + this.d * m.b;\r\n\t        const c = this.a * m.c + this.c * m.d;\r\n\t        const d = this.b * m.c + this.d * m.d;\r\n\t        const e = this.a * m.e + this.c * m.f + this.e;\r\n\t        const f = this.b * m.e + this.d * m.f + this.f;\r\n\t        this.a = a;\r\n\t        this.b = b;\r\n\t        this.c = c;\r\n\t        this.d = d;\r\n\t        this.e = e;\r\n\t        this.f = f;\r\n\t        return this;\r\n\t    }\r\n\t}\n\n\tconst aPos = 0;\r\n\tconst bPos = 1;\r\n\tconst cPos = 2;\r\n\tconst dPos = 3;\r\n\tconst ePos = 4;\r\n\tconst fPos = 5;\r\n\t// 把 matrix 函数反转为简单函数\r\n\tconst simplify = (matrix, digit1, digit2) => {\r\n\t    const mVal = matrix.val.map((v, i) => toFixed((i < matrixEPos) ? digit1 : digit2, v)).join(',');\r\n\t    const fixed1 = toFixed(digit1);\r\n\t    const fixed2 = toFixed(digit2);\r\n\t    if (/^1,0,0,1/.test(mVal)) {\r\n\t        return {\r\n\t            type: 'translate',\r\n\t            val: fixed2(matrix.val[fPos]) === 0 ? [matrix.val[ePos]] : [matrix.val[ePos], matrix.val[fPos]],\r\n\t        };\r\n\t    }\r\n\t    if (/^[^,]+,0,0,[^,]+,0,0/.test(mVal)) {\r\n\t        return {\r\n\t            type: 'scale',\r\n\t            val: fixed1(matrix.val[aPos]) === fixed1(matrix.val[dPos]) ? [matrix.val[aPos]] : [matrix.val[aPos], matrix.val[dPos]],\r\n\t        };\r\n\t    }\r\n\t    if (/^1,0,[^,]+,1,0,0/.test(mVal)) {\r\n\t        let corner = (Math.atan(matrix.val[cPos]) * HALF_CIRC / Math.PI + CIRC) % CIRC;\r\n\t        if (corner > CIRC - 10) {\r\n\t            corner -= CIRC;\r\n\t        }\r\n\t        return {\r\n\t            type: 'skewX',\r\n\t            val: [corner],\r\n\t        };\r\n\t    }\r\n\t    if (/^1,[^,]+,0,1,0,0/.test(mVal)) {\r\n\t        let corner = (Math.atan(matrix.val[bPos]) * HALF_CIRC / Math.PI + CIRC) % CIRC;\r\n\t        if (corner > CIRC - 10) {\r\n\t            corner -= CIRC;\r\n\t        }\r\n\t        return {\r\n\t            type: 'skewY',\r\n\t            val: [corner],\r\n\t        };\r\n\t    }\r\n\t    if (fixed1(matrix.val[aPos]) === fixed1(matrix.val[dPos])\r\n\t        &&\r\n\t            fixed1(matrix.val[bPos]) === -fixed1(matrix.val[cPos])\r\n\t        &&\r\n\t            fixed1(Math.pow(matrix.val[aPos], 2) + Math.pow(matrix.val[bPos], 2)) === 1) {\r\n\t        let arc;\r\n\t        if (matrix.val[aPos] >= 0) {\r\n\t            arc = Math.asin(matrix.val[bPos]);\r\n\t        }\r\n\t        else {\r\n\t            if (matrix.val[bPos] >= 0) {\r\n\t                arc = Math.acos(matrix.val[aPos]);\r\n\t            }\r\n\t            else {\r\n\t                arc = -Math.acos(matrix.val[aPos]);\r\n\t            }\r\n\t        }\r\n\t        let corner = (arc * HALF_CIRC / Math.PI + CIRC) % CIRC;\r\n\t        if (corner > CIRC - 10) {\r\n\t            corner -= CIRC;\r\n\t        }\r\n\t        // [1,0,0,1,x,y].[a,b,c,d,0,0].[1,0,0,1,-x,-y] = [a,b,c,d,e,f]，根据该公式反解\r\n\t        const cx = (matrix.val[ePos] * (1 - matrix.val[aPos]) - matrix.val[bPos] * matrix.val[fPos]) / (2 - matrix.val[aPos] * 2);\r\n\t        const cy = (cx * matrix.val[bPos] + matrix.val[fPos]) / (1 - matrix.val[dPos]);\r\n\t        return {\r\n\t            type: 'rotate',\r\n\t            val: [corner, cx, cy],\r\n\t        };\r\n\t    }\r\n\t    return matrix;\r\n\t};\n\n\t// 降低 transform 函数的参数精度，移除冗余参数，并对无效函数打上标记\r\n\tconst shorten = (m, digit1 = DEFAULT_MATRIX_DIGIT, digit2 = DEFAULT_SIZE_DIGIT, digit3 = DEFAULT_ACCURATE_DIGIT) => {\r\n\t    const res = {\r\n\t        type: m.type,\r\n\t        val: [],\r\n\t    };\r\n\t    switch (m.type) {\r\n\t        case 'translate':\r\n\t            m.val.forEach((v, i) => {\r\n\t                res.val[i] = toFixed(digit2, v);\r\n\t            });\r\n\t            if (res.val[1] === 0) {\r\n\t                res.val.length = 1;\r\n\t            }\r\n\t            if (res.val[0] === 0) {\r\n\t                res.val[0] = 0;\r\n\t                if (res.val.length === 1) {\r\n\t                    res.noEffect = true;\r\n\t                }\r\n\t            }\r\n\t            break;\r\n\t        case 'scale':\r\n\t            m.val.forEach((v, i) => {\r\n\t                res.val[i] = toFixed(digit1, v);\r\n\t            });\r\n\t            if (res.val[0] === res.val[1]) {\r\n\t                res.val.length = 1;\r\n\t            }\r\n\t            if (res.val[0] === 1 && res.val.length === 1) {\r\n\t                res.noEffect = true;\r\n\t            }\r\n\t            break;\r\n\t        case 'rotate':\r\n\t            res.val[0] = toFixed(digit3, m.val[0]);\r\n\t            if (res.val[0] === 0) {\r\n\t                res.val[0] = 0;\r\n\t                res.noEffect = true;\r\n\t            }\r\n\t            if (m.val.length === 3) {\r\n\t                res.val[1] = toFixed(digit2, m.val[1]);\r\n\t                res.val[2] = toFixed(digit2, m.val[2]);\r\n\t                if (res.val[1] === 0 && res.val[2] === 0) {\r\n\t                    res.val.length = 1;\r\n\t                }\r\n\t            }\r\n\t            break;\r\n\t        case 'skewX':\r\n\t        case 'skewY':\r\n\t            res.val[0] = toFixed(digit3, m.val[0]);\r\n\t            if (res.val[0] === 0) {\r\n\t                res.val[0] = 0;\r\n\t                res.noEffect = true;\r\n\t            }\r\n\t            break;\r\n\t        default: {\r\n\t            const _res = simplify(m, digit1, digit2);\r\n\t            if (_res.type === 'matrix') {\r\n\t                _res.val.forEach((v, i) => {\r\n\t                    res.val[i] = toFixed((i < matrixEPos) ? digit1 : digit2, v);\r\n\t                });\r\n\t                break;\r\n\t            }\r\n\t            else {\r\n\t                return shorten(_res, digit1, digit2, digit3);\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    return res;\r\n\t};\n\n\tconst combineMatrix = (operate, digit1 = DEFAULT_MATRIX_DIGIT, digit2 = DEFAULT_SIZE_DIGIT, digit3 = DEFAULT_ACCURATE_DIGIT) => {\r\n\t    let matrix = new Matrix();\r\n\t    for (const item of operate) {\r\n\t        switch (item.type) {\r\n\t            case 'translate':\r\n\t                matrix = matrix.translate(item.val[0], item.val[1]);\r\n\t                break;\r\n\t            case 'rotate':\r\n\t                if (item.val.length === 3) {\r\n\t                    matrix = matrix.translate(item.val[1], item.val[2]);\r\n\t                    matrix = matrix.rotate(item.val[0]);\r\n\t                    matrix = matrix.translate(-item.val[1], -item.val[2]);\r\n\t                }\r\n\t                else {\r\n\t                    matrix = matrix.rotate(item.val[0]);\r\n\t                }\r\n\t                break;\r\n\t            case 'scale':\r\n\t                matrix = matrix.scale(item.val[0], ...item.val.slice(1));\r\n\t                break;\r\n\t            case 'skewX':\r\n\t                matrix = matrix.skewX(item.val[0]);\r\n\t                break;\r\n\t            case 'skewY':\r\n\t                matrix = matrix.skewY(item.val[0]);\r\n\t                break;\r\n\t            default:\r\n\t                matrix = matrix.multiply(new Matrix(...item.val));\r\n\t                break;\r\n\t        }\r\n\t    }\r\n\t    return shorten({\r\n\t        type: 'matrix',\r\n\t        val: [matrix.a, matrix.b, matrix.c, matrix.d, matrix.e, matrix.f],\r\n\t    }, digit1, digit2, digit3);\r\n\t};\n\n\tconst merge = (func1, func2, digit1 = DEFAULT_MATRIX_DIGIT, digit2 = DEFAULT_SIZE_DIGIT, digit3 = DEFAULT_ACCURATE_DIGIT) => {\r\n\t    let resFunc = {\r\n\t        type: func1.type,\r\n\t        val: [],\r\n\t    };\r\n\t    switch (func1.type) {\r\n\t        case 'translate':\r\n\t            if (func1.val.length === 1) {\r\n\t                func1.val[1] = 0;\r\n\t            }\r\n\t            if (func2.val.length === 1) {\r\n\t                func2.val[1] = 0;\r\n\t            }\r\n\t            resFunc.val = [func1.val[0] + func2.val[0], func1.val[1] + func2.val[1]];\r\n\t            break;\r\n\t        case 'scale':\r\n\t            if (func1.val.length === 1) {\r\n\t                func1.val[1] = func1.val[0];\r\n\t            }\r\n\t            if (func2.val.length === 1) {\r\n\t                func2.val[1] = func2.val[0];\r\n\t            }\r\n\t            resFunc.val = [func1.val[0] * func2.val[0], func1.val[1] * func2.val[1]];\r\n\t            break;\r\n\t        case 'rotate':\r\n\t            if (func1.val.length === 1 && func2.val.length === 1) {\r\n\t                resFunc.val[0] = func1.val[0] + func2.val[0];\r\n\t            }\r\n\t            else if (func1.val[1] === func2.val[1] && func1.val[2] === func2.val[2]) {\r\n\t                resFunc.val = [func1.val[0] + func2.val[0], func1.val[1], func1.val[2]];\r\n\t            }\r\n\t            else {\r\n\t                resFunc = combineMatrix([func1, func2], digit1, digit2, digit3);\r\n\t            }\r\n\t            break;\r\n\t        case 'skewX':\r\n\t        case 'skewY':\r\n\t            resFunc = combineMatrix([func1, func2], digit1, digit2, digit3);\r\n\t            break;\r\n\t        default:\r\n\t            return combineMatrix([func1, func2], digit1, digit2, digit3);\r\n\t    }\r\n\t    return shorten(resFunc, digit1, digit2, digit3);\r\n\t};\n\n\tconst matrixSingle = `(translate|scale|rotate|skewX|skewY|matrix)\\\\s*\\\\(\\\\s*(${numberPattern}(?:${commaWsp}${numberPattern})*)\\\\s*\\\\)`;\r\n\tconst matrixReg = new RegExp(matrixSingle, 'gm');\r\n\tconst matrixFullReg = new RegExp(`^${matrixSingle}(?:${commaWsp}${matrixSingle})*$`, 'm');\r\n\tconst matrixValLen = 6;\r\n\tconst parseMatrix = (str) => {\r\n\t    const result = [];\r\n\t    // 首先全字匹配完整的字符串，不匹配的直接退出\r\n\t    if (matrixFullReg.test(str.trim())) {\r\n\t        // 重置正则匹配位置\r\n\t        matrixReg.lastIndex = 0;\r\n\t        let match = matrixReg.exec(str);\r\n\t        while (match !== null) {\r\n\t            const val = parseNumberList(match[2]);\r\n\t            // 验证参数的个数是否合法，不合法的直接退出\r\n\t            if (match[1] === 'translate' || match[1] === 'scale') {\r\n\t                if (val.length > 2) {\r\n\t                    return [];\r\n\t                }\r\n\t            }\r\n\t            else if (match[1] === 'matrix') {\r\n\t                if (val.length !== matrixValLen) {\r\n\t                    return [];\r\n\t                }\r\n\t            }\r\n\t            else if (match[1] === 'rotate') {\r\n\t                if (val.length !== 1 && val.length !== 3) {\r\n\t                    return [];\r\n\t                }\r\n\t            }\r\n\t            else {\r\n\t                if (val.length !== 1) {\r\n\t                    return [];\r\n\t                }\r\n\t            }\r\n\t            result.push({\r\n\t                type: match[1],\r\n\t                val,\r\n\t            });\r\n\t            match = matrixReg.exec(str);\r\n\t        }\r\n\t    }\r\n\t    return result;\r\n\t};\n\n\tconst toScientific = (s) => {\r\n\t    const sStr = s.toString();\r\n\t    let _s = sStr;\r\n\t    let e = 0;\r\n\t    while (_s.slice(-1) === '0') {\r\n\t        _s = _s.slice(0, -1);\r\n\t        e++;\r\n\t    }\r\n\t    _s = `${_s}e${e}`;\r\n\t    return getShorter(_s, sStr);\r\n\t};\n\n\tconst shortenNumber = ramda.pipe(toScientific, shortenPureDecimal);\n\n\tconst shortenNumberList = (s) => s.trim().replace(/\\s*,\\s*|\\s+/g, ',').replace(/,(?=[+-]\\.?\\d+)/g, '').replace(/([.eE]\\d+),(?=\\.\\d+)/g, '$1');\n\n\t// 将函数类参数转为字符串，并优化（转科学计数法，移除掉正、负号前面的逗号，移除掉0.前面的0，移除掉.1,.1或e1,.1这种case中间的逗号）\r\n\tconst stringifyFuncVal = (s) => shortenNumberList(s.map(shortenNumber).join(','));\n\n\tconst stringify = (m, digit1 = DEFAULT_MATRIX_DIGIT, digit2 = DEFAULT_SIZE_DIGIT, digit3 = DEFAULT_ACCURATE_DIGIT) => {\r\n\t    let result = '';\r\n\t    m.forEach(v => {\r\n\t        const _v = shorten(v, digit1, digit2, digit3);\r\n\t        if (!_v.noEffect) {\r\n\t            result += `${_v.type}(${stringifyFuncVal(_v.val)})`;\r\n\t        }\r\n\t    });\r\n\t    return result;\r\n\t};\n\n\t/*\r\n\t * 保证精度的减法\r\n\t * 用于解决 双精度浮点数 导致精度变化的问题\r\n\t */\r\n\tconst minus = ramda.curry((a, b) => {\r\n\t    const dgt = Math.max(digit(a), digit(b));\r\n\t    return toFixed(dgt, a - b);\r\n\t});\n\n\tconst numberLength = (num) => shortenNumberList(num.map(shortenNumber).join(',')).length;\n\n\tconst computeH = (absolute, relative, pathResult, pos) => {\r\n\t    const relLen = numberLength([relative]);\r\n\t    const absLen = numberLength([absolute]);\r\n\t    if (relLen === absLen) { // 如果相等则参照前一个指令\r\n\t        if (pathResult[pathResult.length - 1].type === 'H') {\r\n\t            pathResult.push({\r\n\t                type: 'H',\r\n\t                from: pos.slice(),\r\n\t                val: [absolute],\r\n\t            });\r\n\t        }\r\n\t        else {\r\n\t            pathResult.push({\r\n\t                type: 'h',\r\n\t                from: pos.slice(),\r\n\t                val: [relative],\r\n\t            });\r\n\t        }\r\n\t    }\r\n\t    else if (relLen < absLen) {\r\n\t        pathResult.push({\r\n\t            type: 'h',\r\n\t            from: pos.slice(),\r\n\t            val: [relative],\r\n\t        });\r\n\t    }\r\n\t    else {\r\n\t        pathResult.push({\r\n\t            type: 'H',\r\n\t            from: pos.slice(),\r\n\t            val: [absolute],\r\n\t        });\r\n\t    }\r\n\t    return [absolute, pos[1]];\r\n\t};\n\n\tconst computeV = (absolute, relative, pathResult, pos) => {\r\n\t    const relLen = numberLength([relative]);\r\n\t    const absLen = numberLength([absolute]);\r\n\t    if (relLen === absLen) { // 如果相等则参照前一个指令\r\n\t        if (pathResult[pathResult.length - 1].type === 'V') {\r\n\t            pathResult.push({\r\n\t                type: 'V',\r\n\t                from: pos.slice(),\r\n\t                val: [absolute],\r\n\t            });\r\n\t        }\r\n\t        else {\r\n\t            pathResult.push({\r\n\t                type: 'v',\r\n\t                from: pos.slice(),\r\n\t                val: [relative],\r\n\t            });\r\n\t        }\r\n\t    }\r\n\t    else if (relLen < absLen) {\r\n\t        pathResult.push({\r\n\t            type: 'v',\r\n\t            from: pos.slice(),\r\n\t            val: [relative],\r\n\t        });\r\n\t    }\r\n\t    else {\r\n\t        pathResult.push({\r\n\t            type: 'V',\r\n\t            from: pos.slice(),\r\n\t            val: [absolute],\r\n\t        });\r\n\t    }\r\n\t    return [pos[0], absolute];\r\n\t};\n\n\tconst computeL = (absolute, relative, pathResult, pos) => {\r\n\t    // 需要转为水平或垂直的情况\r\n\t    // 注意，0 长度的线段不能省略，它可能也是有意义的 @by wangfeng-pd @v1.5.0\r\n\t    // https://www.w3.org/TR/SVG/paths.html#ZeroLengthSegments\r\n\t    if (relative[1] === 0) {\r\n\t        return computeH(absolute[0], relative[0], pathResult, pos);\r\n\t    }\r\n\t    else if (relative[0] === 0) {\r\n\t        return computeV(absolute[1], relative[1], pathResult, pos);\r\n\t    }\r\n\t    // 普通情况\r\n\t    const relLen = numberLength(relative);\r\n\t    const absLen = numberLength(absolute);\r\n\t    if (relLen === absLen) { // 如果相等则参照前一个指令\r\n\t        if (pathResult[pathResult.length - 1].type === 'L') {\r\n\t            pathResult.push({\r\n\t                type: 'L',\r\n\t                from: pos.slice(),\r\n\t                val: absolute.slice(),\r\n\t            });\r\n\t        }\r\n\t        else {\r\n\t            pathResult.push({\r\n\t                type: 'l',\r\n\t                from: pos.slice(),\r\n\t                val: relative.slice(),\r\n\t            });\r\n\t        }\r\n\t    }\r\n\t    else if (relLen < absLen) {\r\n\t        pathResult.push({\r\n\t            type: 'l',\r\n\t            from: pos.slice(),\r\n\t            val: relative.slice(),\r\n\t        });\r\n\t    }\r\n\t    else {\r\n\t        pathResult.push({\r\n\t            type: 'L',\r\n\t            from: pos.slice(),\r\n\t            val: absolute.slice(),\r\n\t        });\r\n\t    }\r\n\t    return absolute.slice();\r\n\t};\n\n\tconst computeA = (absolute, relative, pathResult, pos) => {\r\n\t    // https://www.w3.org/TR/SVG/paths.html#ArcOutOfRangeParameters\r\n\t    // 起始点和目标点重合，或者有一个半径为 0，可以转直线指令\r\n\t    if ((absolute[APOS_X] === pos[0] && absolute[APOS_Y] === pos[1]) || absolute[APOS_RX] === 0 || absolute[APOS_RY] === 0) {\r\n\t        return computeL([absolute[APOS_X], absolute[APOS_Y]], [relative[APOS_X], relative[APOS_Y]], pathResult, pos);\r\n\t    }\r\n\t    // 负数半径取绝对值\r\n\t    if (absolute[APOS_RX] < 0) {\r\n\t        absolute[APOS_RX] = Math.abs(absolute[APOS_RX]);\r\n\t    }\r\n\t    if (absolute[APOS_RY] < 0) {\r\n\t        absolute[APOS_RY] = Math.abs(absolute[APOS_RY]);\r\n\t    }\r\n\t    const rLen = pathResult.length;\r\n\t    const relLen = numberLength(relative);\r\n\t    const absLen = numberLength(absolute);\r\n\t    if (relLen === absLen) { // 如果相等则参照前一个指令\r\n\t        if (pathResult[rLen - 1].type === 'A') {\r\n\t            pathResult.push({\r\n\t                type: 'A',\r\n\t                from: pos.slice(),\r\n\t                val: absolute,\r\n\t            });\r\n\t        }\r\n\t        else {\r\n\t            pathResult.push({\r\n\t                type: 'a',\r\n\t                from: pos.slice(),\r\n\t                val: relative,\r\n\t            });\r\n\t        }\r\n\t    }\r\n\t    else if (relLen < absLen) {\r\n\t        pathResult.push({\r\n\t            type: 'a',\r\n\t            from: pos.slice(),\r\n\t            val: relative,\r\n\t        });\r\n\t    }\r\n\t    else {\r\n\t        pathResult.push({\r\n\t            type: 'A',\r\n\t            from: pos.slice(),\r\n\t            val: absolute,\r\n\t        });\r\n\t    }\r\n\t    return [absolute[APOS_X], absolute[APOS_Y]];\r\n\t};\n\n\tconst SPOS_X = 2;\r\n\tconst SPOS_Y = 3;\r\n\tconst computeS = (absolute, relative, pathResult, pos) => {\r\n\t    const relLen = numberLength(relative);\r\n\t    const absLen = numberLength(absolute);\r\n\t    if (relLen === absLen) { // 如果相等则参照前一个指令\r\n\t        if (pathResult[pathResult.length - 1].type === 'S') {\r\n\t            pathResult.push({\r\n\t                type: 'S',\r\n\t                from: pos.slice(),\r\n\t                val: absolute.slice(),\r\n\t            });\r\n\t        }\r\n\t        else {\r\n\t            pathResult.push({\r\n\t                type: 's',\r\n\t                from: pos.slice(),\r\n\t                val: relative.slice(),\r\n\t            });\r\n\t        }\r\n\t    }\r\n\t    else if (relLen < absLen) {\r\n\t        pathResult.push({\r\n\t            type: 's',\r\n\t            from: pos.slice(),\r\n\t            val: relative.slice(),\r\n\t        });\r\n\t    }\r\n\t    else {\r\n\t        pathResult.push({\r\n\t            type: 'S',\r\n\t            from: pos.slice(),\r\n\t            val: absolute.slice(),\r\n\t        });\r\n\t    }\r\n\t    return [absolute[SPOS_X], absolute[SPOS_Y]];\r\n\t};\n\n\t// 获取 a 相对于 b 的对称值\r\n\tconst symmetry = ramda.curry((a, b) => plus(b, minus(b, a)));\n\n\t// 匹配贝塞尔曲线的控制点\r\n\tconst matchControl = (ctrl1X, ctrl1Y, centerX, centerY, ctrl2X, ctrl2Y) => symmetry(ctrl1X, centerX) === ctrl2X && symmetry(ctrl1Y, centerY) === ctrl2Y;\n\n\tconst canTransformS = (pathResult, ctrlX, ctrlY, from) => {\r\n\t    const lastItem = pathResult[pathResult.length - 1];\r\n\t    const type = lastItem.type;\r\n\t    switch (type) {\r\n\t        case 'C':\r\n\t            return matchControl(lastItem.val[2], lastItem.val[3], from[0], from[1], ctrlX, ctrlY);\r\n\t        case 'c':\r\n\t            return matchControl(plus(lastItem.val[2], lastItem.from[0]), plus(lastItem.val[3], lastItem.from[1]), from[0], from[1], ctrlX, ctrlY);\r\n\t        case 'S':\r\n\t            return matchControl(lastItem.val[0], lastItem.val[1], from[0], from[1], ctrlX, ctrlY);\r\n\t        case 's':\r\n\t            return matchControl(plus(lastItem.val[0], lastItem.from[0]), plus(lastItem.val[1], lastItem.from[1]), from[0], from[1], ctrlX, ctrlY);\r\n\t        default:\r\n\t            // 前置不是 c/s 指令，则可以根据控制点和 from 是否重合来决定是否可以转为 s\r\n\t            return ctrlX === from[0] && ctrlY === from[1];\r\n\t    }\r\n\t};\r\n\tconst computeC = (absolute, relative, pathResult, pos) => {\r\n\t    if (canTransformS(pathResult, absolute[0], absolute[1], pos)) {\r\n\t        return computeS(absolute.slice(2), relative.slice(2), pathResult, pos);\r\n\t    }\r\n\t    else {\r\n\t        // 普通情况\r\n\t        const relLen = numberLength(relative);\r\n\t        const absLen = numberLength(absolute);\r\n\t        if (relLen === absLen) { // 如果相等则参照前一个指令\r\n\t            if (pathResult[pathResult.length - 1].type === 'C') {\r\n\t                pathResult.push({\r\n\t                    type: 'C',\r\n\t                    from: pos.slice(),\r\n\t                    val: absolute.slice(),\r\n\t                });\r\n\t            }\r\n\t            else {\r\n\t                pathResult.push({\r\n\t                    type: 'c',\r\n\t                    from: pos.slice(),\r\n\t                    val: relative.slice(),\r\n\t                });\r\n\t            }\r\n\t        }\r\n\t        else if (relLen < absLen) {\r\n\t            pathResult.push({\r\n\t                type: 'c',\r\n\t                from: pos.slice(),\r\n\t                val: relative.slice(),\r\n\t            });\r\n\t        }\r\n\t        else {\r\n\t            pathResult.push({\r\n\t                type: 'C',\r\n\t                from: pos.slice(),\r\n\t                val: absolute.slice(),\r\n\t            });\r\n\t        }\r\n\t        return [absolute[4], absolute[5]];\r\n\t    }\r\n\t};\n\n\tconst computeM = (absolute, relative, pathResult, pos) => {\r\n\t    if (ramda.lt(numberLength(absolute), numberLength(relative))) {\r\n\t        pathResult.push({\r\n\t            type: 'M',\r\n\t            from: pos.slice(),\r\n\t            val: absolute.slice(),\r\n\t        });\r\n\t    }\r\n\t    else {\r\n\t        pathResult.push({\r\n\t            type: 'm',\r\n\t            from: pos.slice(),\r\n\t            val: relative.slice(),\r\n\t        });\r\n\t    }\r\n\t    return absolute.slice();\r\n\t};\n\n\tconst computeT = (absolute, relative, pathResult, pos) => {\r\n\t    // t 类型的 from 会存储 4 个值，前 2 个为前一个指令的 absolute，后 2 个存储本指令未记录的控制点的绝对坐标\r\n\t    const from = pos.slice();\r\n\t    const lastItem = pathResult[pathResult.length - 1];\r\n\t    switch (lastItem.type) {\r\n\t        case 'T':\r\n\t        case 't':\r\n\t            from.push(symmetry(lastItem.from[2], from[0]), symmetry(lastItem.from[3], from[1]));\r\n\t            break;\r\n\t        case 'Q':\r\n\t            from.push(symmetry(lastItem.val[0], from[0]), symmetry(lastItem.val[1], from[1]));\r\n\t            break;\r\n\t        case 'q':\r\n\t            from.push(symmetry(plus(lastItem.val[0], lastItem.from[0]), from[0]), symmetry(plus(lastItem.val[1], lastItem.from[1]), from[1]));\r\n\t            break;\r\n\t        default:\r\n\t            // 前置不是 q/t 指令，则控制点与 from 相同\r\n\t            from.push(from[0], from[1]);\r\n\t            break;\r\n\t    }\r\n\t    const relLen = numberLength(relative);\r\n\t    const absLen = numberLength(absolute);\r\n\t    if (relLen === absLen) { // 如果相等则参照前一个指令\r\n\t        if (pathResult[pathResult.length - 1].type === 'T') {\r\n\t            pathResult.push({\r\n\t                type: 'T',\r\n\t                from,\r\n\t                val: absolute.slice(),\r\n\t            });\r\n\t        }\r\n\t        else {\r\n\t            pathResult.push({\r\n\t                type: 't',\r\n\t                from,\r\n\t                val: relative.slice(),\r\n\t            });\r\n\t        }\r\n\t    }\r\n\t    else if (relLen < absLen) {\r\n\t        pathResult.push({\r\n\t            type: 't',\r\n\t            from,\r\n\t            val: relative.slice(),\r\n\t        });\r\n\t    }\r\n\t    else {\r\n\t        pathResult.push({\r\n\t            type: 'T',\r\n\t            from,\r\n\t            val: absolute.slice(),\r\n\t        });\r\n\t    }\r\n\t    return absolute.slice();\r\n\t};\n\n\tconst canTransformT = (pathResult, ctrlX, ctrlY, from) => {\r\n\t    const lastItem = pathResult[pathResult.length - 1];\r\n\t    const type = lastItem.type;\r\n\t    switch (type) {\r\n\t        case 'Q':\r\n\t            return matchControl(lastItem.val[0], lastItem.val[1], from[0], from[1], ctrlX, ctrlY);\r\n\t        case 'q':\r\n\t            return matchControl(plus(lastItem.val[0], lastItem.from[0]), plus(lastItem.val[1], lastItem.from[1]), from[0], from[1], ctrlX, ctrlY);\r\n\t        case 'T':\r\n\t        case 't':\r\n\t            return matchControl(lastItem.from[2], lastItem.from[3], from[0], from[1], ctrlX, ctrlY);\r\n\t        default:\r\n\t            // 前置不是 q/t 指令，则可以根据控制点和 from 是否重合来决定是否可以转为 t\r\n\t            return ramda.equals([ctrlX, ctrlY], from);\r\n\t    }\r\n\t};\r\n\tconst computeQ = (absolute, relative, pathResult, pos) => {\r\n\t    if (canTransformT(pathResult, absolute[0], absolute[1], pos)) {\r\n\t        return computeT(absolute.slice(2), relative.slice(2), pathResult, pos);\r\n\t    }\r\n\t    else {\r\n\t        // 普通情况\r\n\t        const relLen = numberLength(relative);\r\n\t        const absLen = numberLength(absolute);\r\n\t        if (relLen === absLen) { // 如果相等则参照前一个指令\r\n\t            if (pathResult[pathResult.length - 1].type === 'Q') {\r\n\t                pathResult.push({\r\n\t                    type: 'Q',\r\n\t                    from: pos.slice(),\r\n\t                    val: absolute.slice(),\r\n\t                });\r\n\t            }\r\n\t            else {\r\n\t                pathResult.push({\r\n\t                    type: 'q',\r\n\t                    from: pos.slice(),\r\n\t                    val: relative.slice(),\r\n\t                });\r\n\t            }\r\n\t        }\r\n\t        else if (relLen < absLen) {\r\n\t            pathResult.push({\r\n\t                type: 'q',\r\n\t                from: pos.slice(),\r\n\t                val: relative.slice(),\r\n\t            });\r\n\t        }\r\n\t        else {\r\n\t            pathResult.push({\r\n\t                type: 'Q',\r\n\t                from: pos.slice(),\r\n\t                val: absolute.slice(),\r\n\t            });\r\n\t        }\r\n\t        return [absolute[2], absolute[3]];\r\n\t    }\r\n\t};\n\n\tconst computeZ = (pathResult, pos) => {\r\n\t    const rLen = pathResult.length;\r\n\t    const lastItem = pathResult[rLen - 1];\r\n\t    // 如果 z 指令紧跟着 z 指令，直接抛弃\r\n\t    if (lastItem.type.toLowerCase() === 'z') {\r\n\t        return pos;\r\n\t    }\r\n\t    const zpos = (pathResult[0].type === 'm') ? [plus(pathResult[0].val[0], pathResult[0].from[0]), plus(pathResult[0].val[1], pathResult[0].from[1])] : [pathResult[0].val[0], pathResult[0].val[1]];\r\n\t    pathResult.push({\r\n\t        type: 'z',\r\n\t        from: pos.slice(),\r\n\t        val: [],\r\n\t    });\r\n\t    return zpos;\r\n\t};\n\n\tconst rel2abs = (val, pos) => val.map((s, index) => plus(s, pos[index % 2]));\r\n\tconst abs2rel = (val, pos) => val.map((s, index) => minus(s, pos[index % 2]));\r\n\tconst getRelHV = (pathItem) => {\r\n\t    const isRel = pathItem.type === pathItem.type.toLowerCase();\r\n\t    if (isRel)\r\n\t        return pathItem.val[0];\r\n\t    const isH = pathItem.type.toLowerCase() === 'h';\r\n\t    return minus(pathItem.val[0], pathItem.from[isH ? 0 : 1]);\r\n\t};\r\n\tconst getAbsHV = (pathItem) => {\r\n\t    const isAbs = pathItem.type === pathItem.type.toUpperCase();\r\n\t    if (isAbs)\r\n\t        return pathItem.val[0];\r\n\t    const isH = pathItem.type.toLowerCase() === 'h';\r\n\t    return plus(pathItem.val[0], pathItem.from[isH ? 0 : 1]);\r\n\t};\r\n\tconst getRel = (pathItem) => pathItem.type === pathItem.type.toLowerCase() ? pathItem.val.slice() : abs2rel(pathItem.val, pathItem.from);\r\n\tconst getAbs = (pathItem) => pathItem.type === pathItem.type.toUpperCase() ? pathItem.val.slice() : rel2abs(pathItem.val, pathItem.from);\n\n\tconst cArgLen = 6;\r\n\tconst sArgLen = 4;\r\n\tconst qArgLen = 4;\r\n\tconst doCompute = (pathArr) => {\r\n\t    const result = [];\r\n\t    let pos = [0, 0];\r\n\t    for (const subPath of pathArr) {\r\n\t        const pathResult = [];\r\n\t        for (const pathItem of subPath) {\r\n\t            switch (pathItem.type) {\r\n\t                // 平移 - 绝对\r\n\t                case 'M':\r\n\t                    // 当移动指令超过 2 个时，后续指令按平移处理 - fixed@v1.4.2\r\n\t                    for (let i = 0, l = pathItem.val.length; i < l; i += 2) {\r\n\t                        const handler = (i === 0) ? computeM : computeL;\r\n\t                        pos = handler([pathItem.val[i], pathItem.val[i + 1]], abs2rel([pathItem.val[i], pathItem.val[i + 1]], pos), pathResult, pos);\r\n\t                    }\r\n\t                    break;\r\n\t                // 平移 - 相对\r\n\t                case 'm':\r\n\t                    // 当移动指令超过 2 个时，后续指令按平移处理 - fixed@v1.4.2\r\n\t                    for (let i = 0, l = pathItem.val.length; i < l; i += 2) {\r\n\t                        const handler = (i === 0) ? computeM : computeL;\r\n\t                        pos = handler(rel2abs([pathItem.val[i], pathItem.val[i + 1]], pos), [pathItem.val[i], pathItem.val[i + 1]], pathResult, pos);\r\n\t                    }\r\n\t                    break;\r\n\t                // 水平直线 - 绝对\r\n\t                case 'H':\r\n\t                    for (let i = 0, l = pathItem.val.length; i < l; i++) {\r\n\t                        pos = computeH(pathItem.val[i], minus(pathItem.val[i], pos[0]), pathResult, pos);\r\n\t                    }\r\n\t                    break;\r\n\t                // 水平直线 - 相对\r\n\t                case 'h':\r\n\t                    for (let i = 0, l = pathItem.val.length; i < l; i++) {\r\n\t                        pos = computeH(plus(pathItem.val[i], pos[0]), pathItem.val[i], pathResult, pos);\r\n\t                    }\r\n\t                    break;\r\n\t                // 垂直直线 - 绝对\r\n\t                case 'V':\r\n\t                    for (let i = 0, l = pathItem.val.length; i < l; i++) {\r\n\t                        pos = computeV(pathItem.val[i], minus(pathItem.val[i], pos[1]), pathResult, pos);\r\n\t                    }\r\n\t                    break;\r\n\t                // 垂直直线 - 相对\r\n\t                case 'v':\r\n\t                    for (let i = 0, l = pathItem.val.length; i < l; i++) {\r\n\t                        pos = computeV(plus(pathItem.val[i], pos[1]), pathItem.val[i], pathResult, pos);\r\n\t                    }\r\n\t                    break;\r\n\t                // 直线 - 绝对\r\n\t                case 'L':\r\n\t                    for (let i = 0, l = pathItem.val.length; i < l; i += 2) {\r\n\t                        pos = computeL([pathItem.val[i], pathItem.val[i + 1]], abs2rel([pathItem.val[i], pathItem.val[i + 1]], pos), pathResult, pos);\r\n\t                    }\r\n\t                    break;\r\n\t                // 直线 - 相对\r\n\t                case 'l':\r\n\t                    for (let i = 0, l = pathItem.val.length; i < l; i += 2) {\r\n\t                        pos = computeL(rel2abs([pathItem.val[i], pathItem.val[i + 1]], pos), [pathItem.val[i], pathItem.val[i + 1]], pathResult, pos);\r\n\t                    }\r\n\t                    break;\r\n\t                // 三次贝塞尔曲线 - 绝对\r\n\t                case 'C':\r\n\t                    for (let i = 0, l = pathItem.val.length; i < l; i += cArgLen) {\r\n\t                        const CArgs = pathItem.val.slice(i, i + cArgLen);\r\n\t                        pos = computeC(CArgs, abs2rel(CArgs, pos), pathResult, pos);\r\n\t                    }\r\n\t                    break;\r\n\t                // 三次贝塞尔曲线 - 相对\r\n\t                case 'c':\r\n\t                    for (let i = 0, l = pathItem.val.length; i < l; i += cArgLen) {\r\n\t                        const cArgs = pathItem.val.slice(i, i + cArgLen);\r\n\t                        pos = computeC(rel2abs(cArgs, pos), cArgs, pathResult, pos);\r\n\t                    }\r\n\t                    break;\r\n\t                // 三次连续贝塞尔曲线 - 绝对\r\n\t                case 'S':\r\n\t                    for (let i = 0, l = pathItem.val.length; i < l; i += sArgLen) {\r\n\t                        const SArgs = pathItem.val.slice(i, i + sArgLen);\r\n\t                        pos = computeS(SArgs, abs2rel(SArgs, pos), pathResult, pos);\r\n\t                    }\r\n\t                    break;\r\n\t                // 三次连续贝塞尔曲线 - 相对\r\n\t                case 's':\r\n\t                    for (let i = 0, l = pathItem.val.length; i < l; i += sArgLen) {\r\n\t                        const sArgs = pathItem.val.slice(i, i + sArgLen);\r\n\t                        pos = computeS(rel2abs(sArgs, pos), sArgs, pathResult, pos);\r\n\t                    }\r\n\t                    break;\r\n\t                // 二次贝塞尔曲线 - 绝对\r\n\t                case 'Q':\r\n\t                    for (let i = 0, l = pathItem.val.length; i < l; i += qArgLen) {\r\n\t                        const QArgs = pathItem.val.slice(i, i + qArgLen);\r\n\t                        pos = computeQ(QArgs, abs2rel(QArgs, pos), pathResult, pos);\r\n\t                    }\r\n\t                    break;\r\n\t                // 二次贝塞尔曲线 - 相对\r\n\t                case 'q':\r\n\t                    for (let i = 0, l = pathItem.val.length; i < l; i += qArgLen) {\r\n\t                        const qArgs = pathItem.val.slice(i, i + qArgLen);\r\n\t                        pos = computeQ(rel2abs(qArgs, pos), qArgs, pathResult, pos);\r\n\t                    }\r\n\t                    break;\r\n\t                // 二次连续贝塞尔曲线 - 绝对\r\n\t                case 'T':\r\n\t                    for (let i = 0, l = pathItem.val.length; i < l; i += 2) {\r\n\t                        const TArgs = pathItem.val.slice(i, i + 2);\r\n\t                        pos = computeT(TArgs, abs2rel(TArgs, pos), pathResult, pos);\r\n\t                    }\r\n\t                    break;\r\n\t                // 二次连续贝塞尔曲线 - 相对\r\n\t                case 't':\r\n\t                    for (let i = 0, l = pathItem.val.length; i < l; i += 2) {\r\n\t                        const tArgs = pathItem.val.slice(i, i + 2);\r\n\t                        pos = computeT(rel2abs(tArgs, pos), tArgs, pathResult, pos);\r\n\t                    }\r\n\t                    break;\r\n\t                // 圆弧 - 绝对\r\n\t                case 'A':\r\n\t                    for (let i = 0, l = pathItem.val.length; i < l; i += APOS_LEN) {\r\n\t                        const AArgs = pathItem.val.slice(i, i + APOS_LEN);\r\n\t                        pos = computeA(AArgs, AArgs.slice(0, APOS_X).concat(abs2rel(AArgs.slice(APOS_X), pos)), pathResult, pos);\r\n\t                    }\r\n\t                    break;\r\n\t                // 圆弧 - 相对\r\n\t                case 'a':\r\n\t                    for (let i = 0, l = pathItem.val.length; i < l; i += APOS_LEN) {\r\n\t                        const aArgs = pathItem.val.slice(i, i + APOS_LEN);\r\n\t                        pos = computeA(aArgs.slice(0, APOS_X).concat(rel2abs(aArgs.slice(APOS_X), pos)), aArgs, pathResult, pos);\r\n\t                    }\r\n\t                    break;\r\n\t                default:\r\n\t                    pos = computeZ(pathResult, pos);\r\n\t                    break;\r\n\t            }\r\n\t        }\r\n\t        if (pathResult.length) {\r\n\t            result.push(pathResult);\r\n\t        }\r\n\t    }\r\n\t    return result;\r\n\t};\n\n\tconst FLAG_POS1 = 3;\r\n\tconst FLAG_POS2 = 4;\r\n\tconst LOOP_LEN = 7;\r\n\tconst parseArc = (s) => {\r\n\t    const result = [];\r\n\t    // 重要！含有 g 修饰符的正则表达式 exec 时要先重置！\r\n\t    numberGlobal.lastIndex = 0;\r\n\t    let matches = numberGlobal.exec(s);\r\n\t    let pos = 0;\r\n\t    while (matches) {\r\n\t        if (pos % LOOP_LEN === FLAG_POS1 || pos % LOOP_LEN === FLAG_POS2) {\r\n\t            if (matches[0][0] === '0' || matches[0][0] === '1') {\r\n\t                result.push(+matches[0][0]);\r\n\t                matches[0] = matches[0].slice(1);\r\n\t                if (matches[0].length) {\r\n\t                    pos++;\r\n\t                    continue;\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t        else {\r\n\t            result.push(+matches[0]);\r\n\t        }\r\n\t        pos++;\r\n\t        matches = numberGlobal.exec(s);\r\n\t    }\r\n\t    return result;\r\n\t};\n\n\tconst pathReg = new RegExp(`([mzlhvcsqta])\\\\s*((?:${numberSequence})?)(.*?)(?=[mzlhvcsqta]|$)`, 'gim');\r\n\tconst parsePath = (str) => {\r\n\t    const result = [];\r\n\t    let temp = [];\r\n\t    // 重置正则匹配位置\r\n\t    pathReg.lastIndex = 0;\r\n\t    let match = pathReg.exec(str);\r\n\t    outer: while (match !== null) {\r\n\t        // 所有路径必须从 mM 开始\r\n\t        const type = match[1].toLowerCase();\r\n\t        if (!temp.length && type !== 'm') {\r\n\t            return result;\r\n\t        }\r\n\t        let val = [];\r\n\t        if (match[2]) {\r\n\t            val = type === 'a' ? parseArc(match[2]) : parseNumberList(match[2]);\r\n\t        }\r\n\t        switch (type) {\r\n\t            // 平移的参数必须为偶数\r\n\t            case 'm':\r\n\t                if (temp.length) {\r\n\t                    result.push(temp);\r\n\t                    temp = [];\r\n\t                }\r\n\t                if (val.length % 2 !== 0) {\r\n\t                    if (val.length > 2) {\r\n\t                        temp.push({\r\n\t                            type: match[1],\r\n\t                            val: val.slice(0, val.length - 1),\r\n\t                        });\r\n\t                    }\r\n\t                    break outer;\r\n\t                }\r\n\t                break;\r\n\t            case 'l':\r\n\t            case 't':\r\n\t                // l 和 t 的参数必须为偶数\r\n\t                if (val.length % 2 !== 0) {\r\n\t                    if (val.length > 2) {\r\n\t                        temp.push({\r\n\t                            type: match[1],\r\n\t                            val: val.slice(0, val.length - 1),\r\n\t                        });\r\n\t                    }\r\n\t                    break outer;\r\n\t                }\r\n\t                break;\r\n\t            case 'z':\r\n\t                // z 不允许有参数\r\n\t                if (val.length) {\r\n\t                    temp.push({\r\n\t                        type: match[1],\r\n\t                        val: [],\r\n\t                    });\r\n\t                    break outer;\r\n\t                }\r\n\t                break;\r\n\t            case 's':\r\n\t            case 'q':\r\n\t                // s 和 q 的参数必须是 4 的整倍数\r\n\t                if (val.length % 4 !== 0) {\r\n\t                    if (val.length > 4) {\r\n\t                        temp.push({\r\n\t                            type: match[1],\r\n\t                            val: val.slice(0, val.length - val.length % 4),\r\n\t                        });\r\n\t                    }\r\n\t                    break outer;\r\n\t                }\r\n\t                break;\r\n\t            case 'c':\r\n\t                // c 的参数必须是 6 的整倍数\r\n\t                if (val.length % 6 !== 0) {\r\n\t                    if (val.length > 6) {\r\n\t                        temp.push({\r\n\t                            type: match[1],\r\n\t                            val: val.slice(0, val.length - val.length % 6),\r\n\t                        });\r\n\t                    }\r\n\t                    break outer;\r\n\t                }\r\n\t                break;\r\n\t            case 'a': {\r\n\t                // a 的参数第 3、4 位必须是 0 或 1\r\n\t                const _val = [];\r\n\t                val.every((v, i) => {\r\n\t                    if ((i % APOS_LEN === APOS_LARGE || i % APOS_LEN === APOS_SWEEP) && v !== 0 && v !== 1) {\r\n\t                        return false;\r\n\t                    }\r\n\t                    _val.push(v);\r\n\t                    return true;\r\n\t                });\r\n\t                // a 的参数必须是 7 的整倍数\r\n\t                if (_val.length % APOS_LEN !== 0) {\r\n\t                    if (_val.length > APOS_LEN) {\r\n\t                        temp.push({\r\n\t                            type: match[1],\r\n\t                            val: _val.slice(0, _val.length - _val.length % APOS_LEN),\r\n\t                        });\r\n\t                    }\r\n\t                    break outer;\r\n\t                }\r\n\t                break;\r\n\t            }\r\n\t        }\r\n\t        // 只有 z 指令不能没有参数\r\n\t        if (type !== 'z' && !val.length) {\r\n\t            break outer;\r\n\t        }\r\n\t        temp.push({\r\n\t            type: match[1],\r\n\t            val,\r\n\t        });\r\n\t        if (match[3] && !/^\\s*,?\\s*$/.test(match[3])) {\r\n\t            break;\r\n\t        }\r\n\t        match = pathReg.exec(str);\r\n\t    }\r\n\t    result.push(temp);\r\n\t    return result;\r\n\t};\n\n\tconst shortenDigit = (pathItem, digit1, digit2) => {\r\n\t    if (pathItem.type.toLowerCase() === 'a') {\r\n\t        return pathItem.val.map((val, index) => {\r\n\t            const i = index % APOS_LEN;\r\n\t            switch (i) {\r\n\t                case APOS_RX:\r\n\t                case APOS_RY:\r\n\t                case APOS_X:\r\n\t                case APOS_Y:\r\n\t                    return toFixed(digit1, val);\r\n\t                case APOS_ROTATION:\r\n\t                    return toFixed(digit2, val);\r\n\t                default:\r\n\t                    return val;\r\n\t            }\r\n\t        });\r\n\t    }\r\n\t    else {\r\n\t        return pathItem.val.map(val => toFixed(digit1, val));\r\n\t    }\r\n\t};\n\n\tconst FLAG_POS1$1 = 3;\r\n\tconst FLAG_POS2$1 = 4;\r\n\tconst LOOP_LEN$1 = 7;\r\n\t// 将函数类参数转为字符串，并优化（转科学计数法，移除掉正、负号前面的逗号，移除掉0.前面的0，移除掉.1,.1或e1,.1这种case中间的逗号）\r\n\t// 特殊，针对 arc 类 path 指令，flag 位后面不需要跟逗号\r\n\tconst stringifyArc = (s) => shortenNumberList(s.reduce((prev, curr, index) => {\r\n\t    if (index % LOOP_LEN$1 === FLAG_POS1$1 || index % LOOP_LEN$1 === FLAG_POS2$1 || index === s.length - 1) {\r\n\t        return `${prev}${shortenNumber(curr)}`;\r\n\t    }\r\n\t    else {\r\n\t        return `${prev}${shortenNumber(curr)},`;\r\n\t    }\r\n\t}, ''));\n\n\t// 路径字符串化\r\n\tconst stringifyPath = (pathResult, digit1 = DEFAULT_SIZE_DIGIT, digit2 = DEFAULT_ACCURATE_DIGIT) => {\r\n\t    let d = '';\r\n\t    let lastType = '';\r\n\t    for (const subPath of pathResult) {\r\n\t        for (const pathItem of subPath) {\r\n\t            const stringifyFunc = pathItem.type === 'a' || pathItem.type === 'A' ? stringifyArc : stringifyFuncVal;\r\n\t            if (\r\n\t            // 注意：连续的 m 指令不能进行合并\r\n\t            (pathItem.type === lastType && lastType.toLowerCase() !== 'm')\r\n\t                ||\r\n\t                    // 字符串化的时候，紧跟 m 指令的 l 指令，且大小写一致，可以直接向前合并\r\n\t                    (pathItem.type === 'l' && lastType === 'm')\r\n\t                ||\r\n\t                    (pathItem.type === 'L' && lastType === 'M')) {\r\n\t                d = shortenNumberList(`${d},${stringifyFunc(shortenDigit(pathItem, digit1, digit2))}`);\r\n\t            }\r\n\t            else {\r\n\t                lastType = pathItem.type;\r\n\t                d += `${pathItem.type}${stringifyFunc(shortenDigit(pathItem, digit1, digit2))}`;\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    return d;\r\n\t};\n\n\t// 检查是否被标签选择器命中\r\n\tconst checkTypeSelector = (node) => Object.values(node.styles).some(val => {\r\n\t    if (val.from === 'styletag') {\r\n\t        const selector = val.selector;\r\n\t        // 注意：只检查最后一项！\r\n\t        if (selector[selector.length - 1].type === node.nodeName) {\r\n\t            return true;\r\n\t        }\r\n\t    }\r\n\t    return false;\r\n\t});\n\n\t// 如果子对象包含动画元素，获取这些动画元素影响了哪些属性\r\n\tconst getAnimateAttr = (node) => {\r\n\t    const result = [];\r\n\t    node.children.forEach(childNode => {\r\n\t        if (animationAttrElements.includes(childNode.nodeName)) {\r\n\t            const attributeName = childNode.getAttribute('attributeName');\r\n\t            if (attributeName) {\r\n\t                if (childNode.nodeName !== 'animateTransform' || attributeName === 'tranform' || attributeName === 'patternTransform') {\r\n\t                    const value = [];\r\n\t                    const from = childNode.getAttribute('from');\r\n\t                    const to = childNode.getAttribute('to');\r\n\t                    const by = childNode.getAttribute('by');\r\n\t                    const values = childNode.getAttribute('values');\r\n\t                    const key = [];\r\n\t                    if (from) {\r\n\t                        value.push(from);\r\n\t                        key.push('from');\r\n\t                    }\r\n\t                    if (to) {\r\n\t                        value.push(to);\r\n\t                        key.push('to');\r\n\t                    }\r\n\t                    if (by) {\r\n\t                        value.push(by);\r\n\t                        key.push('by');\r\n\t                    }\r\n\t                    if (values) {\r\n\t                        value.push(...values.split(';').map(val => val.trim()).filter(val => !!val));\r\n\t                        key.push('values');\r\n\t                    }\r\n\t                    result.push({\r\n\t                        node: childNode,\r\n\t                        attributeName,\r\n\t                        keys: key,\r\n\t                        values: value,\r\n\t                    });\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t    });\r\n\t    return result;\r\n\t};\r\n\tconst checkAnimateAttr = (animateAttrs, name, condition = () => true) => animateAttrs.some(item => item.attributeName === name && item.values.some(condition));\r\n\tconst findAnimateAttr = (animateAttrs, name) => animateAttrs.filter(item => item.attributeName === name);\n\n\tconst rmAttrs = (node, attrs) => {\r\n\t    let styleList = parseStyle(node.getAttribute('style') || '');\r\n\t    for (const key of attrs) {\r\n\t        node.removeAttribute(key);\r\n\t        styleList = styleList.filter(attr => attr.fullname !== key);\r\n\t    }\r\n\t    if (styleList.length) {\r\n\t        node.setAttribute('style', stringifyStyle(styleList));\r\n\t    }\r\n\t    else {\r\n\t        node.removeAttribute('style');\r\n\t    }\r\n\t};\n\n\tconst SAFE_ROTATE_CORNER = 90;\r\n\tconst fixedMVal = toFixed(DEFAULT_MATRIX_DIGIT);\r\n\tconst applyNumber = (fn, s, ex) => shortenNumber(fn(parseFloat(s), ex));\r\n\tconst applyNumberList = (fn, numlist, ex) => {\r\n\t    numlist.forEach((val, index) => {\r\n\t        numlist[index] = fn(val, ex);\r\n\t    });\r\n\t    return shortenNumberList(numlist.map(shortenNumber).join(','));\r\n\t};\r\n\tconst applyNumberPairs = (fn, numlist) => {\r\n\t    for (let i = 0; i < numlist.length; i += 2) {\r\n\t        [numlist[i], numlist[i + 1]] = fn(numlist[i], numlist[i + 1]);\r\n\t    }\r\n\t    return shortenNumberList(numlist.map(shortenNumber).join(','));\r\n\t};\r\n\t// 检查一个属性是否合理\r\n\tconst checkAttr = (node, attrname, val) => {\r\n\t    if (val === '0') {\r\n\t        // 属性为 0 可以直接移除\r\n\t        rmAttrs(node, [attrname]);\r\n\t    }\r\n\t    else {\r\n\t        if (geometryProperties.includes(attrname) && node.hasAttribute('style')) {\r\n\t            const styleList = parseStyle(node.getAttribute('style'));\r\n\t            const hasStyle = styleList.some(sAttr => {\r\n\t                if (sAttr.fullname === attrname) {\r\n\t                    sAttr.value = val;\r\n\t                    return true;\r\n\t                }\r\n\t                return false;\r\n\t            });\r\n\t            if (hasStyle) {\r\n\t                node.setAttribute('style', stringifyStyle(styleList));\r\n\t                return;\r\n\t            }\r\n\t        }\r\n\t        node.setAttribute(attrname, val);\r\n\t    }\r\n\t};\r\n\t// 应用\r\n\tconst applyTextTransform = (node, matrix, animateAttrs) => {\r\n\t    // todo 暂不支持 animate\r\n\t    // text 需要用到 x 和 y，tspan 用到 dx 和 dy\r\n\t    const attrPrefix = node.nodeName === 'tspan' ? 'd' : '';\r\n\t    if (matrix.type !== 'translate' || checkAnimateAttr(animateAttrs, `${attrPrefix}x`) || checkAnimateAttr(animateAttrs, `${attrPrefix}y`)) {\r\n\t        return false;\r\n\t    }\r\n\t    // text 具有 tspan 子元素，并且至少一个具有 x 或 y 属性，不执行 transform\r\n\t    if (node.nodeName === 'text' && node.querySelectorAll('tspan[x],tspan[y]').length) {\r\n\t        return false;\r\n\t    }\r\n\t    const dx = node.getAttribute(`${attrPrefix}x`) || '0';\r\n\t    const dy = node.getAttribute(`${attrPrefix}y`) || '0';\r\n\t    // 必须是纯数值列表\r\n\t    if (pureNumOrWithPxList.test(dx) && pureNumOrWithPxList.test(dy)) {\r\n\t        const dxs = parseNumberList(dx);\r\n\t        checkAttr(node, `${attrPrefix}x`, applyNumberList(plus, dxs, matrix.val[0]));\r\n\t        if (matrix.val[1]) {\r\n\t            const dys = parseNumberList(dy);\r\n\t            checkAttr(node, `${attrPrefix}y`, applyNumberList(plus, dys, matrix.val[1]));\r\n\t        }\r\n\t        node.removeAttribute('transform');\r\n\t        return true;\r\n\t    }\r\n\t    return false;\r\n\t};\r\n\tconst applyRectTransform = (node, matrix, animateAttrs, hasStroke, hasMarker) => {\r\n\t    const x = getAttr(node, 'x', '0');\r\n\t    const y = getAttr(node, 'y', '0');\r\n\t    const width = getAttr(node, 'width', '0');\r\n\t    const height = getAttr(node, 'height', '0');\r\n\t    let rx = getAttr(node, 'rx', 'auto');\r\n\t    let ry = getAttr(node, 'ry', 'auto');\r\n\t    if (rx === 'auto') {\r\n\t        rx = ry;\r\n\t    }\r\n\t    else if (ry === 'auto') {\r\n\t        ry = rx;\r\n\t    }\r\n\t    if (rx === 'auto') {\r\n\t        rx = '0';\r\n\t        ry = '0';\r\n\t    }\r\n\t    if (!pureNumOrWithPx.test(x) || !pureNumOrWithPx.test(y) || checkAnimateAttr(animateAttrs, 'x') || checkAnimateAttr(animateAttrs, 'y')) {\r\n\t        return false;\r\n\t    }\r\n\t    if (matrix.type !== 'translate') {\r\n\t        if (hasMarker) {\r\n\t            return false;\r\n\t        }\r\n\t        if (matrix.type !== 'rotate' && hasStroke) {\r\n\t            return false;\r\n\t        }\r\n\t        if (checkAnimateAttr(animateAttrs, 'width') || checkAnimateAttr(animateAttrs, 'height') || checkAnimateAttr(animateAttrs, 'rx') || checkAnimateAttr(animateAttrs, 'ry')) {\r\n\t            return false;\r\n\t        }\r\n\t        if (!pureNumOrWithPx.test(width) || !pureNumOrWithPx.test(height) || !pureNumOrWithPx.test(rx) || !pureNumOrWithPx.test(ry)) {\r\n\t            return false;\r\n\t        }\r\n\t    }\r\n\t    switch (matrix.type) {\r\n\t        case 'translate':\r\n\t            checkAttr(node, 'x', applyNumber(plus, x, matrix.val[0]));\r\n\t            checkAttr(node, 'y', applyNumber(plus, y, matrix.val[1] || 0));\r\n\t            node.removeAttribute('transform');\r\n\t            return true;\r\n\t        case 'rotate':\r\n\t            // 1、没有 marker\r\n\t            // 2、仅限直角旋转\r\n\t            if (matrix.val[0] % SAFE_ROTATE_CORNER === 0) {\r\n\t                let mx = new Matrix();\r\n\t                if (matrix.val.length === 3) {\r\n\t                    mx = mx.translate(matrix.val[1], matrix.val[2]);\r\n\t                    mx = mx.rotate(matrix.val[0]);\r\n\t                    mx = mx.translate(-matrix.val[1], -matrix.val[2]);\r\n\t                }\r\n\t                else {\r\n\t                    mx = mx.rotate(matrix.val[0]);\r\n\t                }\r\n\t                // 获取两个对角坐标\r\n\t                let _x1 = parseFloat(x);\r\n\t                let _y1 = parseFloat(y);\r\n\t                let _x2 = plus(_x1, parseFloat(width));\r\n\t                let _y2 = plus(_y1, parseFloat(height));\r\n\t                // 运算\r\n\t                [_x1, _y1] = [mx.a * _x1 + mx.c * _y1 + mx.e, mx.b * _x1 + mx.d * _y1 + mx.f];\r\n\t                [_x2, _y2] = [mx.a * _x2 + mx.c * _y2 + mx.e, mx.b * _x2 + mx.d * _y2 + mx.f];\r\n\t                // 重新生成 x 和 y\r\n\t                checkAttr(node, 'x', `${fixedMVal(Math.min(_x1, _x2))}`);\r\n\t                checkAttr(node, 'y', `${fixedMVal(Math.min(_y1, _y2))}`);\r\n\t                if (Math.abs(matrix.val[0] % (SAFE_ROTATE_CORNER * 2)) === SAFE_ROTATE_CORNER) {\r\n\t                    checkAttr(node, 'width', height);\r\n\t                    checkAttr(node, 'height', width);\r\n\t                    checkAttr(node, 'rx', ry);\r\n\t                    if (rx === ry) {\r\n\t                        rmAttrs(node, ['ry']);\r\n\t                    }\r\n\t                    else {\r\n\t                        checkAttr(node, 'ry', rx);\r\n\t                    }\r\n\t                }\r\n\t                node.removeAttribute('transform');\r\n\t                return true;\r\n\t            }\r\n\t            return false;\r\n\t        case 'scale': {\r\n\t            // 1. 没有描边\r\n\t            // 2. 属性不存在，或者没有百分比的值\r\n\t            const sx = matrix.val[0];\r\n\t            const sy = matrix.val.length === 2 ? matrix.val[1] : matrix.val[0];\r\n\t            checkAttr(node, 'x', applyNumber(multiply, x, sx));\r\n\t            checkAttr(node, 'y', applyNumber(multiply, y, sy));\r\n\t            checkAttr(node, 'width', applyNumber(multiply, width, sx));\r\n\t            checkAttr(node, 'height', applyNumber(multiply, height, sy));\r\n\t            rx = applyNumber(multiply, rx, sx);\r\n\t            ry = applyNumber(multiply, ry, sy);\r\n\t            checkAttr(node, 'rx', rx);\r\n\t            if (rx === ry) {\r\n\t                rmAttrs(node, ['ry']);\r\n\t            }\r\n\t            else {\r\n\t                checkAttr(node, 'ry', ry);\r\n\t            }\r\n\t            node.removeAttribute('transform');\r\n\t            return true;\r\n\t        }\r\n\t        case 'matrix':\r\n\t            if (matrix.val[1] === 0 && matrix.val[2] === 0) {\r\n\t                // 仅验证缩放 + 平移的情况\r\n\t                const msx = matrix.val[0];\r\n\t                const msy = matrix.val[3];\r\n\t                checkAttr(node, 'x', applyNumber(plus, applyNumber(multiply, x, msx), matrix.val[4]));\r\n\t                checkAttr(node, 'y', applyNumber(plus, applyNumber(multiply, y, msy), matrix.val[5]));\r\n\t                checkAttr(node, 'width', applyNumber(multiply, width, msx));\r\n\t                checkAttr(node, 'height', applyNumber(multiply, height, msy));\r\n\t                rx = applyNumber(multiply, rx, msx);\r\n\t                ry = applyNumber(multiply, ry, msy);\r\n\t                checkAttr(node, 'rx', rx);\r\n\t                if (rx === ry) {\r\n\t                    rmAttrs(node, ['ry']);\r\n\t                }\r\n\t                else {\r\n\t                    checkAttr(node, 'ry', ry);\r\n\t                }\r\n\t                node.removeAttribute('transform');\r\n\t                return true;\r\n\t            }\r\n\t            return false;\r\n\t        default:\r\n\t            return false;\r\n\t    }\r\n\t};\r\n\tconst applyLineTransform = (node, matrix, animateAttrs, hasMarker) => {\r\n\t    if (checkAnimateAttr(animateAttrs, 'x1') || checkAnimateAttr(animateAttrs, 'y1') || checkAnimateAttr(animateAttrs, 'x2') || checkAnimateAttr(animateAttrs, 'y2')) {\r\n\t        return false;\r\n\t    }\r\n\t    const x1 = node.getAttribute('x1') || '0';\r\n\t    const y1 = node.getAttribute('y1') || '0';\r\n\t    const x2 = node.getAttribute('x2') || '0';\r\n\t    const y2 = node.getAttribute('y2') || '0';\r\n\t    if (!pureNumOrWithPx.test(x1) || !pureNumOrWithPx.test(y1) || !pureNumOrWithPx.test(x2) || !pureNumOrWithPx.test(y2)) {\r\n\t        return false;\r\n\t    }\r\n\t    switch (matrix.type) {\r\n\t        case 'translate': {\r\n\t            const tx = matrix.val[0];\r\n\t            const ty = matrix.val[1] || 0;\r\n\t            checkAttr(node, 'x1', applyNumber(plus, x1, tx));\r\n\t            checkAttr(node, 'y1', applyNumber(plus, y1, ty));\r\n\t            checkAttr(node, 'x2', applyNumber(plus, x2, tx));\r\n\t            checkAttr(node, 'y2', applyNumber(plus, y2, ty));\r\n\t            node.removeAttribute('transform');\r\n\t            return true;\r\n\t        }\r\n\t        case 'rotate': {\r\n\t            if (hasMarker) {\r\n\t                return false;\r\n\t            }\r\n\t            let mx = new Matrix();\r\n\t            if (matrix.val.length === 3) {\r\n\t                mx = mx.translate(matrix.val[1], matrix.val[2]);\r\n\t                mx = mx.rotate(matrix.val[0]);\r\n\t                mx = mx.translate(-matrix.val[1], -matrix.val[2]);\r\n\t            }\r\n\t            else {\r\n\t                mx = mx.rotate(matrix.val[0]);\r\n\t            }\r\n\t            const _x1 = parseFloat(x1);\r\n\t            const _y1 = parseFloat(y1);\r\n\t            const _x2 = parseFloat(x2);\r\n\t            const _y2 = parseFloat(y2);\r\n\t            checkAttr(node, 'x1', `${fixedMVal(mx.a * _x1 + mx.c * _y1 + mx.e)}`);\r\n\t            checkAttr(node, 'y1', `${fixedMVal(mx.b * _x1 + mx.d * _y1 + mx.f)}`);\r\n\t            checkAttr(node, 'x2', `${fixedMVal(mx.a * _x2 + mx.c * _y2 + mx.e)}`);\r\n\t            checkAttr(node, 'y2', `${fixedMVal(mx.b * _x2 + mx.d * _y2 + mx.f)}`);\r\n\t            node.removeAttribute('transform');\r\n\t            return true;\r\n\t        }\r\n\t        default:\r\n\t            return false;\r\n\t    }\r\n\t};\r\n\tconst applyCircleTransform = (node, matrix, animateAttrs, hasStroke, hasMarker) => {\r\n\t    if (checkAnimateAttr(animateAttrs, 'cx') || checkAnimateAttr(animateAttrs, 'cy')) {\r\n\t        return false;\r\n\t    }\r\n\t    const cx = getAttr(node, 'cx', '0');\r\n\t    const cy = getAttr(node, 'cy', '0');\r\n\t    const r = getAttr(node, 'r', '0');\r\n\t    if (!pureNumOrWithPx.test(cx) || !pureNumOrWithPx.test(cy)) {\r\n\t        return false;\r\n\t    }\r\n\t    if (matrix.type !== 'translate' && hasMarker) {\r\n\t        return false;\r\n\t    }\r\n\t    switch (matrix.type) {\r\n\t        case 'translate': {\r\n\t            const tx = matrix.val[0];\r\n\t            const ty = matrix.val[1] || 0;\r\n\t            checkAttr(node, 'cx', applyNumber(plus, cx, tx));\r\n\t            checkAttr(node, 'cy', applyNumber(plus, cy, ty));\r\n\t            node.removeAttribute('transform');\r\n\t            return true;\r\n\t        }\r\n\t        case 'rotate': {\r\n\t            let mx = new Matrix();\r\n\t            if (matrix.val.length === 3) {\r\n\t                mx = mx.translate(matrix.val[1], matrix.val[2]);\r\n\t                mx = mx.rotate(matrix.val[0]);\r\n\t                mx = mx.translate(-matrix.val[1], -matrix.val[2]);\r\n\t            }\r\n\t            else {\r\n\t                mx = mx.rotate(matrix.val[0]);\r\n\t            }\r\n\t            const _cx = parseFloat(cx);\r\n\t            const _cy = parseFloat(cy);\r\n\t            checkAttr(node, 'cx', `${fixedMVal(mx.a * _cx + mx.c * _cy + mx.e)}`);\r\n\t            checkAttr(node, 'cy', `${fixedMVal(mx.b * _cx + mx.d * _cy + mx.f)}`);\r\n\t            node.removeAttribute('transform');\r\n\t            return true;\r\n\t        }\r\n\t        case 'scale': {\r\n\t            if (hasStroke || !pureNumOrWithPx.test(r) || checkAnimateAttr(animateAttrs, 'r')) {\r\n\t                return false;\r\n\t            }\r\n\t            const sx = matrix.val[0];\r\n\t            const sy = matrix.val.length === 2 ? matrix.val[1] : matrix.val[0];\r\n\t            if (sx === sy) {\r\n\t                // 不需要转椭圆的情况不影响\r\n\t                checkAttr(node, 'cx', applyNumber(multiply, cx, sx));\r\n\t                checkAttr(node, 'cy', applyNumber(multiply, cy, sy));\r\n\t                checkAttr(node, 'r', applyNumber(multiply, r, sx));\r\n\t            }\r\n\t            else if (checkTypeSelector(node)) {\r\n\t                return false;\r\n\t            }\r\n\t            else {\r\n\t                // 只有未被标签选择器命中才能转成椭圆\r\n\t                node.nodeName = 'ellipse';\r\n\t                checkAttr(node, 'cx', applyNumber(multiply, cx, sx));\r\n\t                checkAttr(node, 'cy', applyNumber(multiply, cy, sy));\r\n\t                checkAttr(node, 'rx', applyNumber(multiply, r, sx));\r\n\t                checkAttr(node, 'ry', applyNumber(multiply, r, sy));\r\n\t                rmAttrs(node, ['r']);\r\n\t            }\r\n\t            node.removeAttribute('transform');\r\n\t            return true;\r\n\t        }\r\n\t        case 'matrix':\r\n\t            if (matrix.val[1] === 0 && matrix.val[2] === 0) {\r\n\t                if (hasStroke || !pureNumOrWithPx.test(r) || checkAnimateAttr(animateAttrs, 'r')) {\r\n\t                    return false;\r\n\t                }\r\n\t                // 仅验证缩放 + 平移的情况\r\n\t                const msx = matrix.val[0];\r\n\t                const msy = matrix.val[3];\r\n\t                if (msx === msy) {\r\n\t                    // 不需要转椭圆的情况不影响\r\n\t                    checkAttr(node, 'cx', applyNumber(plus, applyNumber(multiply, cx, msx), matrix.val[4]));\r\n\t                    checkAttr(node, 'cy', applyNumber(plus, applyNumber(multiply, cy, msy), matrix.val[5]));\r\n\t                    checkAttr(node, 'r', applyNumber(multiply, r, msx));\r\n\t                }\r\n\t                else if (checkTypeSelector(node)) {\r\n\t                    return false;\r\n\t                }\r\n\t                else {\r\n\t                    // 只有未被标签选择器命中才能转成椭圆\r\n\t                    node.nodeName = 'ellipse';\r\n\t                    checkAttr(node, 'cx', applyNumber(plus, applyNumber(multiply, cx, msx), matrix.val[4]));\r\n\t                    checkAttr(node, 'cy', applyNumber(plus, applyNumber(multiply, cy, msy), matrix.val[5]));\r\n\t                    checkAttr(node, 'rx', applyNumber(multiply, r, msx));\r\n\t                    checkAttr(node, 'ry', applyNumber(multiply, r, msy));\r\n\t                    rmAttrs(node, ['r']);\r\n\t                }\r\n\t                node.removeAttribute('transform');\r\n\t                return true;\r\n\t            }\r\n\t            return false;\r\n\t        default:\r\n\t            return false;\r\n\t    }\r\n\t};\r\n\tconst applyEllipseTransform = (node, matrix, animateAttrs, hasStroke, hasMarker) => {\r\n\t    const cx = getAttr(node, 'cx', '0');\r\n\t    const cy = getAttr(node, 'cy', '0');\r\n\t    let rx = getAttr(node, 'rx', 'auto');\r\n\t    let ry = getAttr(node, 'ry', 'auto');\r\n\t    if (rx === 'auto') {\r\n\t        rx = ry;\r\n\t    }\r\n\t    else if (ry === 'auto') {\r\n\t        ry = rx;\r\n\t    }\r\n\t    if (rx === 'auto') {\r\n\t        rx = '0';\r\n\t        ry = '0';\r\n\t    }\r\n\t    if (!pureNumOrWithPx.test(cx) || !pureNumOrWithPx.test(cy) || checkAnimateAttr(animateAttrs, 'cx') || checkAnimateAttr(animateAttrs, 'cy')) {\r\n\t        return false;\r\n\t    }\r\n\t    if (matrix.type !== 'translate' && hasMarker) {\r\n\t        return false;\r\n\t    }\r\n\t    // 未被标签选择命中才能转圆形\r\n\t    if (rx === ry && !checkAnimateAttr(animateAttrs, 'rx') && !checkAnimateAttr(animateAttrs, 'ry') && !checkTypeSelector(node)) {\r\n\t        node.nodeName = 'circle';\r\n\t        rmAttrs(node, ['rx', 'ry']);\r\n\t        checkAttr(node, 'r', rx);\r\n\t        return applyCircleTransform(node, matrix, animateAttrs, hasStroke, hasMarker);\r\n\t    }\r\n\t    switch (matrix.type) {\r\n\t        case 'translate': {\r\n\t            const tx = matrix.val[0];\r\n\t            const ty = matrix.val[1] || 0;\r\n\t            checkAttr(node, 'cx', applyNumber(plus, cx, tx));\r\n\t            checkAttr(node, 'cy', applyNumber(plus, cy, ty));\r\n\t            node.removeAttribute('transform');\r\n\t            return true;\r\n\t        }\r\n\t        case 'rotate': {\r\n\t            // 仅限直角旋转\r\n\t            if (matrix.val[0] % SAFE_ROTATE_CORNER !== 0) {\r\n\t                return false;\r\n\t            }\r\n\t            let mx = new Matrix();\r\n\t            if (matrix.val.length === 3) {\r\n\t                mx = mx.translate(matrix.val[1], matrix.val[2]);\r\n\t                mx = mx.rotate(matrix.val[0]);\r\n\t                mx = mx.translate(-matrix.val[1], -matrix.val[2]);\r\n\t            }\r\n\t            else {\r\n\t                mx = mx.rotate(matrix.val[0]);\r\n\t            }\r\n\t            const _cx = parseFloat(cx);\r\n\t            const _cy = parseFloat(cy);\r\n\t            // 垂直的情况要交换 rx 和 ry\r\n\t            if (Math.abs(matrix.val[0] % (SAFE_ROTATE_CORNER * 2)) === SAFE_ROTATE_CORNER) {\r\n\t                // 如果存在百分比的尺寸，不能交换 rx 和 ry\r\n\t                // TODO：如果存在动画，暂时不做处理\r\n\t                if (rx.includes('%') || ry.includes('%') || checkAnimateAttr(animateAttrs, 'rx') || checkAnimateAttr(animateAttrs, 'ry')) {\r\n\t                    return false;\r\n\t                }\r\n\t                checkAttr(node, 'rx', ry);\r\n\t                checkAttr(node, 'ry', rx);\r\n\t            }\r\n\t            checkAttr(node, 'cx', `${fixedMVal(mx.a * _cx + mx.c * _cy + mx.e)}`);\r\n\t            checkAttr(node, 'cy', `${fixedMVal(mx.b * _cx + mx.d * _cy + mx.f)}`);\r\n\t            node.removeAttribute('transform');\r\n\t            return true;\r\n\t        }\r\n\t        case 'scale': {\r\n\t            if (hasStroke || !pureNumOrWithPx.test(rx) || !pureNumOrWithPx.test(ry) || checkAnimateAttr(animateAttrs, 'rx') || checkAnimateAttr(animateAttrs, 'ry')) {\r\n\t                return false;\r\n\t            }\r\n\t            const sx = matrix.val[0];\r\n\t            const sy = matrix.val.length === 2 ? matrix.val[1] : matrix.val[0];\r\n\t            rx = applyNumber(multiply, rx, sx);\r\n\t            ry = applyNumber(multiply, ry, sy);\r\n\t            checkAttr(node, 'cx', applyNumber(multiply, cx, sx));\r\n\t            checkAttr(node, 'cy', applyNumber(multiply, cy, sy));\r\n\t            if (rx === ry && !checkTypeSelector(node)) {\r\n\t                // 转成正圆\r\n\t                node.nodeName = 'circle';\r\n\t                rmAttrs(node, ['rx', 'ry']);\r\n\t                checkAttr(node, 'r', rx);\r\n\t            }\r\n\t            else {\r\n\t                checkAttr(node, 'rx', rx);\r\n\t                checkAttr(node, 'ry', ry);\r\n\t            }\r\n\t            node.removeAttribute('transform');\r\n\t            return true;\r\n\t        }\r\n\t        case 'matrix':\r\n\t            if (matrix.val[1] === 0 && matrix.val[2] === 0) {\r\n\t                if (hasStroke || !pureNumOrWithPx.test(rx) || !pureNumOrWithPx.test(ry) || checkAnimateAttr(animateAttrs, 'rx') || checkAnimateAttr(animateAttrs, 'ry')) {\r\n\t                    return false;\r\n\t                }\r\n\t                // 仅验证缩放 + 平移的情况\r\n\t                const msx = matrix.val[0];\r\n\t                const msy = matrix.val[3];\r\n\t                rx = applyNumber(multiply, rx, msx);\r\n\t                ry = applyNumber(multiply, ry, msy);\r\n\t                checkAttr(node, 'cx', applyNumber(plus, applyNumber(multiply, cx, msx), matrix.val[4]));\r\n\t                checkAttr(node, 'cy', applyNumber(plus, applyNumber(multiply, cy, msy), matrix.val[5]));\r\n\t                if (rx === ry && !checkTypeSelector(node)) {\r\n\t                    // 转成正圆\r\n\t                    node.nodeName = 'circle';\r\n\t                    rmAttrs(node, ['rx', 'ry']);\r\n\t                    checkAttr(node, 'r', rx);\r\n\t                }\r\n\t                else {\r\n\t                    checkAttr(node, 'rx', rx);\r\n\t                    checkAttr(node, 'ry', ry);\r\n\t                }\r\n\t                node.removeAttribute('transform');\r\n\t                return true;\r\n\t            }\r\n\t            return false;\r\n\t        default:\r\n\t            return false;\r\n\t    }\r\n\t};\r\n\tconst applyPolyTransform = (node, matrix, animateAttrs, hasStroke, hasMarker, minStr) => {\r\n\t    if (checkAnimateAttr(animateAttrs, 'points')) {\r\n\t        return false;\r\n\t    }\r\n\t    let pointVal = node.getAttribute('points') || '';\r\n\t    const points = parseNumberList(pointVal);\r\n\t    // points 数量必须是偶数\r\n\t    if (points.length % 2 === 1) {\r\n\t        points.pop();\r\n\t        pointVal = shortenNumberList(points.map(shortenNumber).join(','));\r\n\t        node.setAttribute('points', pointVal);\r\n\t    }\r\n\t    if (matrix.type === 'translate') {\r\n\t        const tx = matrix.val[0];\r\n\t        const ty = matrix.val[1] || 0;\r\n\t        const _points = applyNumberPairs((x, y) => [plus(x, tx), plus(y, ty)], points);\r\n\t        if (_points.length < pointVal.length + minStr.length) {\r\n\t            node.setAttribute('points', _points);\r\n\t            node.removeAttribute('transform');\r\n\t            return true;\r\n\t        }\r\n\t        else {\r\n\t            return false;\r\n\t        }\r\n\t    }\r\n\t    if (hasMarker || (matrix.type !== 'rotate' && hasStroke)) {\r\n\t        return false;\r\n\t    }\r\n\t    let mx = new Matrix();\r\n\t    switch (matrix.type) {\r\n\t        case 'rotate':\r\n\t            if (matrix.val.length === 3) {\r\n\t                mx = mx.translate(matrix.val[1], matrix.val[2]);\r\n\t                mx = mx.rotate(matrix.val[0]);\r\n\t                mx = mx.translate(-matrix.val[1], -matrix.val[2]);\r\n\t            }\r\n\t            else {\r\n\t                mx = mx.rotate(matrix.val[0]);\r\n\t            }\r\n\t            break;\r\n\t        case 'scale':\r\n\t        case 'skewX':\r\n\t        case 'skewY':\r\n\t            mx = mx[matrix.type](...matrix.val);\r\n\t            break;\r\n\t        default:\r\n\t            mx = new Matrix(...matrix.val);\r\n\t            break;\r\n\t    }\r\n\t    const newPoints = applyNumberPairs((n1, n2) => [\r\n\t        fixedMVal(mx.a * n1 + mx.c * n2 + mx.e),\r\n\t        fixedMVal(mx.b * n1 + mx.d * n2 + mx.f),\r\n\t    ], points);\r\n\t    if (newPoints.length < pointVal.length + minStr.length) {\r\n\t        node.setAttribute('points', newPoints);\r\n\t        node.removeAttribute('transform');\r\n\t        return true;\r\n\t    }\r\n\t    else {\r\n\t        return false;\r\n\t    }\r\n\t};\r\n\tconst applyPathTransform = (node, matrix, animateAttrs, hasStroke, hasMarker, minStr) => {\r\n\t    if (checkAnimateAttr(animateAttrs, 'd')) {\r\n\t        return false;\r\n\t    }\r\n\t    const d = node.getAttribute('d') || '';\r\n\t    const pathResult = doCompute(parsePath(d));\r\n\t    if (matrix.type === 'translate') {\r\n\t        const tx = matrix.val[0];\r\n\t        const ty = matrix.val[1] || 0;\r\n\t        pathResult.forEach((subPath, index) => {\r\n\t            subPath.forEach(pathItem => {\r\n\t                switch (pathItem.type) {\r\n\t                    case 'm':\r\n\t                        // 第一个移动指令也要执行平移变换\r\n\t                        if (index === 0) {\r\n\t                            pathItem.val[0] = plus(pathItem.val[0], tx);\r\n\t                            pathItem.val[1] = plus(pathItem.val[1], ty);\r\n\t                        }\r\n\t                        break;\r\n\t                    case 'M':\r\n\t                    case 'L':\r\n\t                    case 'C':\r\n\t                    case 'S':\r\n\t                    case 'Q':\r\n\t                    case 'T':\r\n\t                        for (let i = 0; i < pathItem.val.length; i += 2) {\r\n\t                            pathItem.val[i] = plus(pathItem.val[i], tx);\r\n\t                            pathItem.val[i + 1] = plus(pathItem.val[i + 1], ty);\r\n\t                        }\r\n\t                        break;\r\n\t                    case 'H':\r\n\t                        for (let i = 0; i < pathItem.val.length; i++) {\r\n\t                            pathItem.val[i] = plus(pathItem.val[i], tx);\r\n\t                        }\r\n\t                        break;\r\n\t                    case 'V':\r\n\t                        for (let i = 0; i < pathItem.val.length; i++) {\r\n\t                            pathItem.val[i] = plus(pathItem.val[i], ty);\r\n\t                        }\r\n\t                        break;\r\n\t                    case 'A':\r\n\t                        for (let i = 0; i < pathItem.val.length; i += APOS_LEN) {\r\n\t                            pathItem.val[i + APOS_X] = plus(pathItem.val[i + APOS_X], tx);\r\n\t                            pathItem.val[i + APOS_Y] = plus(pathItem.val[i + APOS_Y], ty);\r\n\t                        }\r\n\t                        break;\r\n\t                }\r\n\t            });\r\n\t        });\r\n\t        const _d = stringifyPath(doCompute(pathResult));\r\n\t        if (_d.length < d.length + minStr.length) {\r\n\t            node.setAttribute('d', _d);\r\n\t            node.removeAttribute('transform');\r\n\t            return true;\r\n\t        }\r\n\t        else {\r\n\t            return false;\r\n\t        }\r\n\t    }\r\n\t    // 不能有 marker\r\n\t    if (hasMarker) {\r\n\t        return false;\r\n\t    }\r\n\t    else if (matrix.type !== 'rotate') {\r\n\t        // rotate 之外不能有 stroke\r\n\t        // rotate 和 scale 之外遇到 a 指令会有问题\r\n\t        if (hasStroke || (matrix.type !== 'scale' && d.toLowerCase().includes('a'))) {\r\n\t            return false;\r\n\t        }\r\n\t    }\r\n\t    if (matrix.type === 'scale') {\r\n\t        const sx = matrix.val[0];\r\n\t        const sy = matrix.val.length === 2 ? matrix.val[1] : matrix.val[0];\r\n\t        pathResult.forEach(subPath => {\r\n\t            subPath.forEach(pathItem => {\r\n\t                switch (pathItem.type.toLowerCase()) {\r\n\t                    case 'm':\r\n\t                    case 'l':\r\n\t                    case 'c':\r\n\t                    case 's':\r\n\t                    case 'q':\r\n\t                    case 't':\r\n\t                        for (let i = 0; i < pathItem.val.length; i += 2) {\r\n\t                            pathItem.val[i] = multiply(pathItem.val[i], sx);\r\n\t                            pathItem.val[i + 1] = multiply(pathItem.val[i + 1], sy);\r\n\t                        }\r\n\t                        break;\r\n\t                    case 'h':\r\n\t                        for (let i = 0; i < pathItem.val.length; i++) {\r\n\t                            pathItem.val[i] = multiply(pathItem.val[i], sx);\r\n\t                        }\r\n\t                        break;\r\n\t                    case 'v':\r\n\t                        for (let i = 0; i < pathItem.val.length; i++) {\r\n\t                            pathItem.val[i] = multiply(pathItem.val[i], sy);\r\n\t                        }\r\n\t                        break;\r\n\t                    case 'a':\r\n\t                        for (let i = 0; i < pathItem.val.length; i += APOS_LEN) {\r\n\t                            pathItem.val[i + APOS_RX] = multiply(pathItem.val[i + APOS_RX], sx);\r\n\t                            pathItem.val[i + APOS_RY] = multiply(pathItem.val[i + APOS_RY], sy);\r\n\t                            pathItem.val[i + APOS_X] = multiply(pathItem.val[i + APOS_X], sx);\r\n\t                            pathItem.val[i + APOS_Y] = multiply(pathItem.val[i + APOS_Y], sy);\r\n\t                        }\r\n\t                        break;\r\n\t                }\r\n\t            });\r\n\t        });\r\n\t        const _d = stringifyPath(doCompute(pathResult));\r\n\t        if (_d.length < d.length + minStr.length) {\r\n\t            node.setAttribute('d', _d);\r\n\t            node.removeAttribute('transform');\r\n\t            return true;\r\n\t        }\r\n\t        else {\r\n\t            return false;\r\n\t        }\r\n\t    }\r\n\t    let mx = new Matrix();\r\n\t    switch (matrix.type) {\r\n\t        case 'rotate':\r\n\t            if (matrix.val.length === 3) {\r\n\t                mx = mx.translate(matrix.val[1], matrix.val[2]);\r\n\t                mx = mx.rotate(matrix.val[0]);\r\n\t                mx = mx.translate(-matrix.val[1], -matrix.val[2]);\r\n\t            }\r\n\t            else {\r\n\t                mx = mx.rotate(matrix.val[0]);\r\n\t            }\r\n\t            break;\r\n\t        case 'skewX':\r\n\t        case 'skewY':\r\n\t            mx = mx[matrix.type](matrix.val[0]);\r\n\t            break;\r\n\t        default:\r\n\t            mx = new Matrix(...matrix.val);\r\n\t            break;\r\n\t    }\r\n\t    pathResult.forEach((subPath, index) => {\r\n\t        subPath.forEach(pathItem => {\r\n\t            switch (pathItem.type) {\r\n\t                case 'M':\r\n\t                case 'L':\r\n\t                case 'C':\r\n\t                case 'S':\r\n\t                case 'Q':\r\n\t                case 'T':\r\n\t                    for (let i = 0; i < pathItem.val.length; i += 2) {\r\n\t                        [pathItem.val[i], pathItem.val[i + 1]] = [\r\n\t                            fixedMVal(mx.a * pathItem.val[i] + mx.c * pathItem.val[i + 1] + mx.e),\r\n\t                            fixedMVal(mx.b * pathItem.val[i] + mx.d * pathItem.val[i + 1] + mx.f),\r\n\t                        ];\r\n\t                    }\r\n\t                    break;\r\n\t                case 'm':\r\n\t                case 'l':\r\n\t                case 'c':\r\n\t                case 's':\r\n\t                case 'q':\r\n\t                case 't':\r\n\t                    for (let i = 0; i < pathItem.val.length; i += 2) {\r\n\t                        [pathItem.val[i], pathItem.val[i + 1]] = [\r\n\t                            fixedMVal(mx.a * pathItem.val[i] + mx.c * pathItem.val[i + 1]),\r\n\t                            fixedMVal(mx.b * pathItem.val[i] + mx.d * pathItem.val[i + 1]),\r\n\t                        ];\r\n\t                    }\r\n\t                    // 第一个移动指令也要执行平移变换\r\n\t                    if (pathItem.type === 'm' && index === 0) {\r\n\t                        pathItem.val[0] = fixedMVal(pathItem.val[0] + mx.e);\r\n\t                        pathItem.val[1] = fixedMVal(pathItem.val[1] + mx.f);\r\n\t                    }\r\n\t                    break;\r\n\t                case 'H': {\r\n\t                    pathItem.type = 'L';\r\n\t                    const HVal = pathItem.val.slice();\r\n\t                    const Hy = pathItem.from[1];\r\n\t                    for (let i = 0; i < HVal.length; i++) {\r\n\t                        pathItem.val[i * 2] = fixedMVal(mx.a * HVal[i] + mx.c * Hy + mx.e);\r\n\t                        pathItem.val[i * 2 + 1] = fixedMVal(mx.b * HVal[i] + mx.d * Hy + mx.f);\r\n\t                    }\r\n\t                    break;\r\n\t                }\r\n\t                case 'h': {\r\n\t                    pathItem.type = 'l';\r\n\t                    const hVal = pathItem.val.slice();\r\n\t                    const hy = 0;\r\n\t                    for (let i = 0; i < hVal.length; i++) {\r\n\t                        pathItem.val[i * 2] = fixedMVal(mx.a * hVal[i] + mx.c * hy);\r\n\t                        pathItem.val[i * 2 + 1] = fixedMVal(mx.b * hVal[i] + mx.d * hy);\r\n\t                    }\r\n\t                    break;\r\n\t                }\r\n\t                case 'V': {\r\n\t                    pathItem.type = 'L';\r\n\t                    const VVal = pathItem.val.slice();\r\n\t                    const Vx = pathItem.from[0];\r\n\t                    for (let i = 0; i < VVal.length; i++) {\r\n\t                        pathItem.val[i * 2] = fixedMVal(mx.a * Vx + mx.c * VVal[i] + mx.e);\r\n\t                        pathItem.val[i * 2 + 1] = fixedMVal(mx.b * Vx + mx.d * VVal[i] + mx.f);\r\n\t                    }\r\n\t                    break;\r\n\t                }\r\n\t                case 'v': {\r\n\t                    pathItem.type = 'l';\r\n\t                    const vVal = pathItem.val.slice();\r\n\t                    const vx = 0;\r\n\t                    for (let i = 0; i < vVal.length; i++) {\r\n\t                        pathItem.val[i * 2] = fixedMVal(mx.a * vx + mx.c * vVal[i]);\r\n\t                        pathItem.val[i * 2 + 1] = fixedMVal(mx.b * vx + mx.d * vVal[i]);\r\n\t                    }\r\n\t                    break;\r\n\t                }\r\n\t            }\r\n\t        });\r\n\t    });\r\n\t    const newD = stringifyPath(doCompute(pathResult));\r\n\t    if (newD.length < d.length + minStr.length) {\r\n\t        node.setAttribute('d', newD);\r\n\t        node.removeAttribute('transform');\r\n\t        return true;\r\n\t    }\r\n\t    else {\r\n\t        return false;\r\n\t    }\r\n\t};\r\n\tconst applyTransform = (node, matrix, minStr) => {\r\n\t    const animateAttrs = getAnimateAttr(node);\r\n\t    // 平移可以直接应用，旋转要判断节点类型，其它变形函数只能在没有描边的时候应用\r\n\t    const hasStroke = (getAttr(node, 'stroke', 'none') !== 'none' || checkAnimateAttr(animateAttrs, 'stroke', val => val !== 'none')) && (getAttr(node, 'stroke-width', '1') !== '0' || checkAnimateAttr(animateAttrs, 'stroke-width', val => val !== '0'));\r\n\t    // 存在 marker 引用的对象只能进行平移变换\r\n\t    const hasMarker = getAttr(node, 'marker-start', 'none') !== 'none'\r\n\t        || getAttr(node, 'marker-mid', 'none') !== 'none'\r\n\t        || getAttr(node, 'marker-end', 'none') !== 'none'\r\n\t        || checkAnimateAttr(animateAttrs, 'marker-start', val => val !== 'none')\r\n\t        || checkAnimateAttr(animateAttrs, 'marker-mid', val => val !== 'none')\r\n\t        || checkAnimateAttr(animateAttrs, 'marker-end', val => val !== 'none');\r\n\t    switch (node.nodeName) {\r\n\t        case 'text':\r\n\t        case 'tspan':\r\n\t            return applyTextTransform(node, matrix, animateAttrs);\r\n\t        case 'rect':\r\n\t            return applyRectTransform(node, matrix, animateAttrs, hasStroke, hasMarker);\r\n\t        case 'line':\r\n\t            return applyLineTransform(node, matrix, animateAttrs, hasMarker);\r\n\t        case 'circle':\r\n\t            return applyCircleTransform(node, matrix, animateAttrs, hasStroke, hasMarker);\r\n\t        case 'ellipse':\r\n\t            return applyEllipseTransform(node, matrix, animateAttrs, hasStroke, hasMarker);\r\n\t        case 'polyline':\r\n\t        case 'polygon':\r\n\t            return applyPolyTransform(node, matrix, animateAttrs, hasStroke, hasMarker, minStr);\r\n\t        case 'path':\r\n\t            return applyPathTransform(node, matrix, animateAttrs, hasStroke, hasMarker, minStr);\r\n\t        default:\r\n\t            return false;\r\n\t    }\r\n\t};\r\n\tconst combineTransform = async (dom, { params: { trifuncDigit, sizeDigit, angelDigit, } }) => new Promise(resolve => {\r\n\t    parseStyleTree(dom);\r\n\t    const tagNodes = dom.querySelectorAll(svgVdom.NodeType.Tag);\r\n\t    tagNodes.forEach(node => {\r\n\t        for (let i = node.attributes.length; i--;) {\r\n\t            const attr = node.attributes[i];\r\n\t            if (transformAttributes.includes(attr.name)) {\r\n\t                const transform = [];\r\n\t                parseMatrix(attr.value.trim()).forEach(mFunc => {\r\n\t                    const lastFunc = transform[transform.length - 1];\r\n\t                    if (transform.length && lastFunc.type === mFunc.type) {\r\n\t                        const mergeFunc = merge(lastFunc, mFunc, trifuncDigit, sizeDigit, angelDigit);\r\n\t                        // 如果合并后为无效变化，则出栈，否则更新合并后的函数\r\n\t                        if (mergeFunc.noEffect) {\r\n\t                            transform.pop();\r\n\t                        }\r\n\t                        else {\r\n\t                            transform[transform.length - 1] = mergeFunc;\r\n\t                        }\r\n\t                    }\r\n\t                    else {\r\n\t                        transform.push(mFunc);\r\n\t                    }\r\n\t                });\r\n\t                if (transform.length) {\r\n\t                    const matrix = combineMatrix(transform, trifuncDigit, sizeDigit, angelDigit);\r\n\t                    const transformStr = stringify(transform, trifuncDigit, sizeDigit, angelDigit);\r\n\t                    const matrixStr = stringify([matrix], trifuncDigit, sizeDigit, angelDigit);\r\n\t                    const minStr = getShorter(transformStr, matrixStr);\r\n\t                    if (matrix.noEffect) {\r\n\t                        node.removeAttribute(attr.fullname);\r\n\t                        return;\r\n\t                    }\r\n\t                    if (attr.fullname === 'transform') {\r\n\t                        // TODO：进一步分析子元素\r\n\t                        // TODO：暂时只应用 transform 属性\r\n\t                        if (applyTransform(node, matrix, ` ${attr.fullname}=\"${minStr}\"`)) {\r\n\t                            return;\r\n\t                        }\r\n\t                    }\r\n\t                    attr.value = minStr;\r\n\t                }\r\n\t                else {\r\n\t                    node.removeAttribute(attr.fullname);\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t    });\r\n\t    resolve();\r\n\t});\n\n\t// 2d 向量\r\n\tconst HALF_CIRC$2 = 180;\r\n\tconst ACCURACY = 1e6;\r\n\tclass Vector {\r\n\t    constructor(x = 0, y = 0) {\r\n\t        this.x = x;\r\n\t        this.y = y;\r\n\t    }\r\n\t    // 获取未修正的向量长度\r\n\t    get _modulo() {\r\n\t        return Math.sqrt(this.x * this.x + this.y * this.y);\r\n\t    }\r\n\t    // 获取向量长度\r\n\t    get modulo() {\r\n\t        return Vector.Rounding(Math.sqrt(this.x * this.x + this.y * this.y));\r\n\t    }\r\n\t    set modulo(m) {\r\n\t        this.normalize();\r\n\t        this.x *= m;\r\n\t        this.y *= m;\r\n\t    }\r\n\t    rotate(arc) {\r\n\t        const _x = this.x;\r\n\t        const _y = this.y;\r\n\t        this.x = _x * Math.cos(arc) - _y * Math.sin(arc);\r\n\t        this.y = _x * Math.sin(arc) + _y * Math.cos(arc);\r\n\t        return this;\r\n\t    }\r\n\t    // value 直接返回长度\r\n\t    valueOf() {\r\n\t        return this.modulo;\r\n\t    }\r\n\t    // 返回字符串形式\r\n\t    toString() {\r\n\t        return `[${this.x},${this.y}]`;\r\n\t    }\r\n\t    // 转为单位向量\r\n\t    normalize() {\r\n\t        const modulo = this._modulo;\r\n\t        if (modulo !== 0) {\r\n\t            this.x /= modulo;\r\n\t            this.y /= modulo;\r\n\t        }\r\n\t        else {\r\n\t            throw new Error('零向量无法标准化！');\r\n\t        }\r\n\t        return this;\r\n\t    }\r\n\t    // 转为零向量\r\n\t    zero() {\r\n\t        this.x = 0;\r\n\t        this.y = 0;\r\n\t        return this;\r\n\t    }\r\n\t    // 与另一个向量相加\r\n\t    add(v) {\r\n\t        this.x += v.x;\r\n\t        this.y += v.y;\r\n\t        return this;\r\n\t    }\r\n\t    // 与另一个向量相减\r\n\t    substract(v) {\r\n\t        this.x -= v.x;\r\n\t        this.y -= v.y;\r\n\t        return this;\r\n\t    }\r\n\t    multiplied(n) {\r\n\t        if (typeof n === 'number') {\r\n\t            this.x *= n;\r\n\t            this.y *= n;\r\n\t            return this;\r\n\t        }\r\n\t        else {\r\n\t            return this.x * n.x + this.y * n.y;\r\n\t        }\r\n\t    }\r\n\t    // 计算两个向量的夹角 - 弧度\r\n\t    radian(v) {\r\n\t        return Vector.radian(this, v);\r\n\t    }\r\n\t    // 计算两个向量的夹角 - 角度\r\n\t    angel(v) {\r\n\t        return Vector.angel(this, v);\r\n\t    }\r\n\t    // 自己是不是零向量\r\n\t    get isZero() {\r\n\t        return this.x === 0 && this.y === 0;\r\n\t    }\r\n\t    // 自己是不是单位向量\r\n\t    get isNormalize() {\r\n\t        return this.modulo === 1;\r\n\t    }\r\n\t    // 两个向量相加\r\n\t    static add(v1, v2) {\r\n\t        return new Vector(v1.x + v2.x, v1.y + v2.y);\r\n\t    }\r\n\t    // 两个向量相减\r\n\t    static substract(v1, v2) {\r\n\t        return new Vector(v1.x - v2.x, v1.y - v2.y);\r\n\t    }\r\n\t    // 两个向量相乘\r\n\t    static multiplied(v1, n) {\r\n\t        if (typeof n === 'number') {\r\n\t            return new Vector(v1.x * n, v1.y * n);\r\n\t        }\r\n\t        else {\r\n\t            return v1.x * n.x + v1.y * n.y;\r\n\t        }\r\n\t    }\r\n\t    // 两个向量的夹角 - 弧度\r\n\t    static radian(v1, v2) {\r\n\t        if (v1.isZero || v2.isZero) {\r\n\t            return NaN;\r\n\t        }\r\n\t        return Math.acos(Vector.multiplied(v1, v2) / v1._modulo / v2._modulo);\r\n\t    }\r\n\t    // 两个向量的夹角 - 角度\r\n\t    static angel(v1, v2) {\r\n\t        if (v1.isZero || v2.isZero) {\r\n\t            return NaN;\r\n\t        }\r\n\t        return Vector.Rounding(HALF_CIRC$2 * Vector.radian(v1, v2) / Math.PI);\r\n\t    }\r\n\t    // v1 到 v2 的投影分量\r\n\t    static projected(v1, v2) {\r\n\t        if (v1.isZero || v2.isZero) {\r\n\t            return new Vector(0, 0);\r\n\t        }\r\n\t        return Vector.multiplied(v2, Vector.multiplied(v1, v2) / Math.pow(v2._modulo, 2));\r\n\t    }\r\n\t    // v1 到 v2 的垂直分量\r\n\t    static plumb(v1, v2) {\r\n\t        if (v1.isZero) {\r\n\t            return new Vector(0, 0);\r\n\t        }\r\n\t        if (v2.isZero) {\r\n\t            return new Vector(v1.x, v1.y);\r\n\t        }\r\n\t        return Vector.substract(v1, Vector.projected(v1, v2));\r\n\t    }\r\n\t    // 取模，对小数点后6位进行取整，修正双精度浮点数导致无法正常标准化的\r\n\t    static Rounding(n) {\r\n\t        return Math.round(n * ACCURACY) / ACCURACY;\r\n\t    }\r\n\t    // 求距离\r\n\t    static distance(v1, v2) {\r\n\t        return Vector.substract(v1, v2).modulo;\r\n\t    }\r\n\t}\n\n\tconst check$2 = (threshold, startI, endI, paths) => {\r\n\t    let max = 0;\r\n\t    let maxI = 0;\r\n\t    // 拿到基础向量\r\n\t    const baseVector = new Vector(minus(paths[endI], paths[startI]), minus(paths[endI + 1], paths[startI + 1]));\r\n\t    for (let i = startI + 2; i < endI; i += 2) {\r\n\t        // 获取每个点基于起始和结束位置的向量\r\n\t        const vectorToStart = new Vector(minus(paths[i], paths[startI]), minus(paths[i + 1], paths[startI + 1]));\r\n\t        const vectorToEnd = new Vector(minus(paths[i], paths[endI]), minus(paths[i + 1], paths[endI + 1]));\r\n\t        let distance = 0;\r\n\t        // 与起始或结束点重合的点直接跳过\r\n\t        if (!vectorToStart.isZero && !vectorToEnd.isZero) {\r\n\t            // 边界情况：投影分量的模大于基础向量，说明途径点在起始点或结束点之外，不能单纯靠垂直分量来抽稀\r\n\t            const prjToStart = Vector.projected(vectorToStart, baseVector);\r\n\t            const prjToEnd = Vector.projected(vectorToEnd, baseVector);\r\n\t            if (prjToStart.modulo > baseVector.modulo) {\r\n\t                distance = prjToStart.modulo;\r\n\t            }\r\n\t            else if (prjToEnd.modulo > baseVector.modulo) {\r\n\t                distance = prjToEnd.modulo;\r\n\t            }\r\n\t            else {\r\n\t                distance = Vector.plumb(vectorToStart, baseVector).modulo;\r\n\t            }\r\n\t            if (distance > max) {\r\n\t                max = distance;\r\n\t                maxI = i;\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    if (max <= threshold) {\r\n\t        paths.splice(startI + 2, endI - startI - 2);\r\n\t    }\r\n\t    else {\r\n\t        if (maxI < endI - 2) {\r\n\t            check$2(threshold, maxI, endI, paths);\r\n\t        }\r\n\t        if (maxI > startI + 2) {\r\n\t            check$2(threshold, startI, maxI, paths);\r\n\t        }\r\n\t    }\r\n\t};\r\n\tconst douglasPeucker = (threshold, pathArr) => {\r\n\t    const pathCopy = pathArr.slice();\r\n\t    check$2(threshold, 0, pathCopy.length - 2, pathCopy);\r\n\t    return pathCopy;\r\n\t};\n\n\tconst combineHV = (subPath, pathItem, index) => {\r\n\t    const relVal = getRelHV(pathItem);\r\n\t    // 如果前一个函数也是水平/垂直移动，判断是否可以合并\r\n\t    // 判断的依据是：相对值的积为正数（即同向移动）\r\n\t    if (subPath[index - 1].type.toLowerCase() === pathItem.type.toLowerCase()) {\r\n\t        const lastItem = subPath[index - 1];\r\n\t        if (getRelHV(lastItem) * relVal >= 0) {\r\n\t            // 合并时直接转绝对坐标\r\n\t            lastItem.val[0] = getAbsHV(pathItem);\r\n\t            lastItem.type = lastItem.type.toUpperCase();\r\n\t            subPath.splice(index, 1);\r\n\t        }\r\n\t    }\r\n\t};\r\n\t// 同方向的直线直接合并\r\n\tconst combineL = (subPath, pathItem, index, digit) => {\r\n\t    const fixed = toFixed(digit);\r\n\t    if (subPath[index - 1].type.toLowerCase() === 'l') {\r\n\t        const lastItem = subPath[index - 1];\r\n\t        const relVal = getRel(pathItem);\r\n\t        const lastRelVal = getRel(lastItem);\r\n\t        if (fixed(Math.atan2(lastRelVal[0], lastRelVal[1])) === fixed(Math.atan2(relVal[0], relVal[1]))) {\r\n\t            lastItem.val = [plus(lastItem.val[0], relVal[0]), plus(lastItem.val[1], relVal[1])];\r\n\t            lastItem.type = 'l';\r\n\t            subPath.splice(index, 1);\r\n\t        }\r\n\t    }\r\n\t};\r\n\tconst getCenter = (pathItem, digit) => {\r\n\t    const rotation = pathItem.val[APOS_ROTATION];\r\n\t    const rx = pathItem.val[APOS_RX];\r\n\t    const ry = pathItem.val[APOS_RY];\r\n\t    const ccw = pathItem.val[APOS_LARGE] === pathItem.val[APOS_SWEEP];\r\n\t    const abs = getAbs({\r\n\t        type: pathItem.type,\r\n\t        val: pathItem.val.slice(APOS_X),\r\n\t        from: pathItem.from,\r\n\t    });\r\n\t    const v1 = new Vector(pathItem.from[0], pathItem.from[1]);\r\n\t    const v2 = new Vector(abs[0], abs[1]);\r\n\t    // 先旋转一下\r\n\t    if (rotation) {\r\n\t        v1.rotate(-rotation * Math.PI * 2 / CIRC);\r\n\t        v2.rotate(-rotation * Math.PI * 2 / CIRC);\r\n\t    }\r\n\t    // 从椭圆变成正圆\r\n\t    if (rx !== ry) {\r\n\t        v1.y *= rx / ry;\r\n\t        v2.y *= rx / ry;\r\n\t    }\r\n\t    // 获取起点到终点的向量\r\n\t    const v = new Vector(v2.x - v1.x, v2.y - v1.y);\r\n\t    // r 不一定是够长，需要扩大到指定的大小 https://www.w3.org/TR/SVG/paths.html#ArcOutOfRangeParameters\r\n\t    let r = rx;\r\n\t    if (r < v.modulo / 2) {\r\n\t        r = v.modulo / 2;\r\n\t    }\r\n\t    // 向量长度为另一条直角边\r\n\t    v.modulo = Math.sqrt(r * r - Math.pow(v.modulo / 2, 2));\r\n\t    // 根据方向选择 90 度\r\n\t    const arc = ccw ? -Math.PI / 2 : Math.PI / 2;\r\n\t    v.rotate(arc);\r\n\t    // 把起始点挪到线段中心\r\n\t    v.x += (v1.x + v2.x) / 2;\r\n\t    v.y += (v1.y + v2.y) / 2;\r\n\t    if (rx !== ry) {\r\n\t        v.y *= ry / rx;\r\n\t    }\r\n\t    if (rotation) {\r\n\t        v.rotate(rotation * Math.PI * 2 / CIRC);\r\n\t    }\r\n\t    return [toFixed(digit, v.x), toFixed(digit, v.y)];\r\n\t};\r\n\tconst combineA = (subPath, pathItem, index, digit) => {\r\n\t    const lastItem = subPath[index - 1];\r\n\t    if (lastItem.type.toLowerCase() === 'a') {\r\n\t        // rx ry 转角 旋转方向相等，并且圆心重合，才能进行合并\r\n\t        const _eqProps = (prop) => ramda.eqProps(`${prop}`, lastItem.val, pathItem.val);\r\n\t        if (ramda.all(_eqProps, [APOS_RX, APOS_RY, APOS_ROTATION, APOS_SWEEP])) {\r\n\t            const center = getCenter(pathItem, digit);\r\n\t            const lastCenter = getCenter(lastItem, digit);\r\n\t            // equals 存在 0 !== -0 的问题\r\n\t            if (center[0] === lastCenter[0] && center[1] === lastCenter[1]) {\r\n\t                // 前一个指令的起始弧线\r\n\t                const vbase = new Vector(lastItem.from[0] - center[0], lastItem.from[1] - center[1]);\r\n\t                const lastAbs = getAbs({\r\n\t                    type: lastItem.type,\r\n\t                    val: lastItem.val.slice(APOS_X),\r\n\t                    from: lastItem.from,\r\n\t                });\r\n\t                const v1 = new Vector(lastAbs[0] - center[0], lastAbs[1] - center[1]);\r\n\t                const abs = getAbs({\r\n\t                    type: pathItem.type,\r\n\t                    val: pathItem.val.slice(APOS_X),\r\n\t                    from: pathItem.from,\r\n\t                });\r\n\t                const v2 = new Vector(abs[0] - center[0], abs[1] - center[1]);\r\n\t                let radian1 = Vector.radian(vbase, v1);\r\n\t                if (lastItem.val[APOS_LARGE] === 1) {\r\n\t                    radian1 = Math.PI * 2 - radian1;\r\n\t                }\r\n\t                let radian2 = Vector.radian(v1, v2);\r\n\t                if (pathItem.val[APOS_LARGE] === 1) {\r\n\t                    radian2 = Math.PI * 2 - radian2;\r\n\t                }\r\n\t                // 大于等于 360 度不能合并，等于 360 度会造成 a 指令被忽略\r\n\t                if (radian1 + radian2 >= Math.PI * 2) {\r\n\t                    return;\r\n\t                }\r\n\t                // 下面是进行合并的算法\r\n\t                // 首先判断是否要改为大转角\r\n\t                if (radian1 + radian2 > Math.PI && lastItem.val[APOS_LARGE] === 0) {\r\n\t                    lastItem.val[APOS_LARGE] = 1;\r\n\t                }\r\n\t                // 直接强制改为绝对坐标\r\n\t                lastItem.type = 'A';\r\n\t                lastItem.val[APOS_X] = abs[0];\r\n\t                lastItem.val[APOS_Y] = abs[1];\r\n\t                // 移除当前节点\r\n\t                subPath.splice(index, 1);\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    return;\r\n\t};\n\n\t// 把简单路径指令转回复杂指令\r\n\tconst complex = (item, lastItem) => {\r\n\t    const complexItem = {\r\n\t        type: item.type,\r\n\t        from: item.from.slice(),\r\n\t        val: item.val.slice(),\r\n\t    };\r\n\t    if (item.type.toLowerCase() === 's') {\r\n\t        let [x, y] = item.from;\r\n\t        if (lastItem.type === 'C') {\r\n\t            x = symmetry(lastItem.val[2], item.from[0]);\r\n\t            y = symmetry(lastItem.val[3], item.from[1]);\r\n\t        }\r\n\t        else if (lastItem.type === 'c') {\r\n\t            x = symmetry(plus(lastItem.val[2], lastItem.from[0]), item.from[0]);\r\n\t            y = symmetry(plus(lastItem.val[3], lastItem.from[1]), item.from[1]);\r\n\t        }\r\n\t        if (item.type === 'S') {\r\n\t            complexItem.type = 'C';\r\n\t            complexItem.val.unshift(x, y);\r\n\t        }\r\n\t        else {\r\n\t            complexItem.type = 'c';\r\n\t            complexItem.val.unshift(minus(x, item.from[0]), minus(y, item.from[1]));\r\n\t        }\r\n\t    }\r\n\t    else if (item.type.toLowerCase() === 't') {\r\n\t        let [x, y] = item.from;\r\n\t        if (lastItem.type === 'Q') {\r\n\t            x = symmetry(lastItem.val[0], item.from[0]);\r\n\t            y = symmetry(lastItem.val[1], item.from[1]);\r\n\t        }\r\n\t        else if (lastItem.type === 'q') {\r\n\t            x = symmetry(plus(lastItem.val[0], lastItem.from[0]), item.from[0]);\r\n\t            y = symmetry(plus(lastItem.val[1], lastItem.from[1]), item.from[1]);\r\n\t        }\r\n\t        if (item.type === 'T') {\r\n\t            complexItem.type = 'Q';\r\n\t            complexItem.val.unshift(x, y);\r\n\t        }\r\n\t        else {\r\n\t            complexItem.type = 'q';\r\n\t            complexItem.val.unshift(minus(x, item.from[0]), minus(y, item.from[1]));\r\n\t        }\r\n\t    }\r\n\t    return complexItem;\r\n\t};\n\n\t/* eslint-disable @typescript-eslint/no-var-requires */\r\n\tconst contours = require('svg-path-contours');\r\n\tconst triangle = require('triangulate-contours');\r\n\t// 当前子路径中除了起始点和自己之外，还有其它任意指令\r\n\tconst hasBrother = (subPath, index) => {\r\n\t    return index > 1 || index < subPath.length - 1;\r\n\t};\r\n\t// 移除 0 长度的平移指令，规则是没有 stroke-cap 或具有兄弟，反之可以转为 z 指令\r\n\tconst checkHV = (subPath, index, hasStrokeCap) => {\r\n\t    if (!hasStrokeCap || hasBrother(subPath, index)) {\r\n\t        subPath.splice(index, 1);\r\n\t    }\r\n\t    else {\r\n\t        subPath[index].type = 'z';\r\n\t    }\r\n\t};\r\n\t// 如果控制点位于起始点和终点的连线中间位置，则 q 指令可以转 l 指令\r\n\tconst checkQ = (pathItem, subPath, index, hasStrokeCap) => {\r\n\t    // 简单指令转复杂指令\r\n\t    const prevItem = subPath[index - 1];\r\n\t    const complexItem = complex(pathItem, prevItem);\r\n\t    const relVal = getRel(complexItem);\r\n\t    let sameLine = true;\r\n\t    if (relVal[1] !== 0 && relVal[0] !== 0) {\r\n\t        sameLine = Math.atan2(relVal[1], relVal[0]) === Math.atan2(relVal[3], relVal[2]);\r\n\t    }\r\n\t    const pointsIsSort = ((relVal[0] >= 0 === relVal[2] >= 0 || relVal[0] <= 0 === relVal[2] <= 0) && (relVal[1] >= 0 === relVal[3] >= 0 || relVal[1] <= 0 === relVal[3] <= 0) // 都在起始点的同一侧\r\n\t        &&\r\n\t            Math.abs(relVal[2]) >= Math.abs(relVal[0]) && Math.abs(relVal[3]) >= Math.abs(relVal[1]) // 起始点、控制点、结束点是顺序排列的\r\n\t    );\r\n\t    if (sameLine && pointsIsSort) {\r\n\t        if (relVal.every(s => s === 0)) {\r\n\t            // 控制点及指令的相对值全部为 0 ，可以视情况移除或转 z 指令\r\n\t            if (!hasStrokeCap || hasBrother(subPath, index)) {\r\n\t                subPath.splice(index, 1);\r\n\t            }\r\n\t            else {\r\n\t                pathItem.type = 'z';\r\n\t            }\r\n\t            return;\r\n\t        }\r\n\t        // 如果前后都不是 q/t 节点，则可以转直线指令\r\n\t        if (!'qt'.includes(prevItem.type.toLowerCase()) && (index === subPath.length - 1 || subPath[index + 1].type.toLowerCase() !== 't')) {\r\n\t            pathItem.type = complexItem.type === 'q' ? 'l' : 'L';\r\n\t            pathItem.val = complexItem.val.slice(2);\r\n\t        }\r\n\t    }\r\n\t};\r\n\t// 如果控制点位于起始点和终点的连线中间位置，则 c 指令可以转 l 指令\r\n\tconst checkC = (pathItem, subPath, index, hasStrokeCap) => {\r\n\t    const prevItem = subPath[index - 1];\r\n\t    const complexItem = complex(pathItem, prevItem);\r\n\t    const relVal = getRel(complexItem);\r\n\t    let sameLine = true; // 都在同一条直线上\r\n\t    let arc = NaN;\r\n\t    for (let i = 0; i < 6; i += 2) {\r\n\t        if (relVal[i] === 0 && relVal[i + 1] === 0) {\r\n\t            continue;\r\n\t        }\r\n\t        if (isNaN(arc)) {\r\n\t            arc = Math.atan2(relVal[i + 1], relVal[i]);\r\n\t        }\r\n\t        else if (arc !== Math.atan2(relVal[i + 1], relVal[i])) {\r\n\t            sameLine = false;\r\n\t            break;\r\n\t        }\r\n\t    }\r\n\t    const pointsIsSort = ((relVal[0] >= 0 === relVal[2] >= 0 || relVal[0] <= 0 === relVal[2] <= 0) && (relVal[1] >= 0 === relVal[3] >= 0 || relVal[1] <= 0 === relVal[3] <= 0) && (relVal[2] >= 0 === relVal[4] >= 0 || relVal[2] <= 0 === relVal[4] <= 0) && (relVal[3] >= 0 === relVal[5] >= 0 || relVal[3] <= 0 === relVal[5] <= 0) // 都在起始点的同一侧\r\n\t        &&\r\n\t            Math.abs(relVal[2]) >= Math.abs(relVal[0]) && Math.abs(relVal[3]) >= Math.abs(relVal[1]) && Math.abs(relVal[4]) >= Math.abs(relVal[2]) && Math.abs(relVal[5]) >= Math.abs(relVal[3]) // 起始点、控制点1、控制点2、结束点是顺序排列的\r\n\t    );\r\n\t    if (sameLine && pointsIsSort) {\r\n\t        if (relVal.every(s => s === 0)) {\r\n\t            // 控制点及指令的相对值全部为 0 ，可以视情况移除或转 z 指令\r\n\t            if (!hasStrokeCap || hasBrother(subPath, index)) {\r\n\t                subPath.splice(index, 1);\r\n\t            }\r\n\t            else {\r\n\t                pathItem.type = 'z';\r\n\t            }\r\n\t            return;\r\n\t        }\r\n\t        // 如果前后都不是 q/t 节点，则可以转直线指令\r\n\t        if (!'cs'.includes(prevItem.type.toLowerCase()) && (index === subPath.length - 1 || subPath[index + 1].type.toLowerCase() !== 's')) {\r\n\t            pathItem.type = complexItem.type === 'c' ? 'l' : 'L';\r\n\t            pathItem.val = complexItem.val.slice(4);\r\n\t        }\r\n\t    }\r\n\t};\r\n\tconst checkSubPath = (pathResult, hasStroke, hasStrokeCap, sizeDigit, angelDigit) => {\r\n\t    const result = [];\r\n\t    // 首先过一遍子路径，移除所有的空节点\r\n\t    pathResult.forEach(subPath => {\r\n\t        for (let j = subPath.length; j--;) {\r\n\t            const pathItem = subPath[j];\r\n\t            switch (pathItem.type) {\r\n\t                case 'm':\r\n\t                    // 所有子路径起始位置改为绝对坐标\r\n\t                    pathItem.type = 'M';\r\n\t                    pathItem.val[0] += subPath[0].from[0];\r\n\t                    pathItem.val[1] += subPath[0].from[1];\r\n\t                    break;\r\n\t                case 'z':\r\n\t                    // 没有 cap，可以移除紧跟 m 指令的 z 指令\r\n\t                    if (!hasStrokeCap && subPath[j - 1].type.toLowerCase() === 'm') {\r\n\t                        subPath.splice(j, 1);\r\n\t                    }\r\n\t                    break;\r\n\t                // 移除长度为 0 的直线指令\r\n\t                case 'h':\r\n\t                case 'v':\r\n\t                    if (pathItem.val[0] === 0) {\r\n\t                        checkHV(subPath, j, hasStrokeCap);\r\n\t                    }\r\n\t                    break;\r\n\t                case 't':\r\n\t                case 'T':\r\n\t                    // 移除 0 长度指令，曲线转直线\r\n\t                    checkQ(pathItem, subPath, j, hasStrokeCap);\r\n\t                    break;\r\n\t                case 'q':\r\n\t                case 'Q':\r\n\t                    // 移除 0 长度指令，曲线转直线\r\n\t                    checkQ(pathItem, subPath, j, hasStrokeCap);\r\n\t                    break;\r\n\t                case 's':\r\n\t                case 'S':\r\n\t                    // 移除 0 长度指令，曲线转直线\r\n\t                    checkC(pathItem, subPath, j, hasStrokeCap);\r\n\t                    break;\r\n\t                case 'c':\r\n\t                case 'C':\r\n\t                    // 移除 0 长度指令，曲线转直线\r\n\t                    checkC(pathItem, subPath, j, hasStrokeCap);\r\n\t                    break;\r\n\t            }\r\n\t        }\r\n\t    });\r\n\t    for (let i = pathResult.length; i--;) {\r\n\t        const subPath = pathResult[i];\r\n\t        // 没有 stroke 直接移除空的子路径\r\n\t        if (!hasStroke) {\r\n\t            // triangle 存在 badcase，可能导致崩溃，所以必须 try\r\n\t            try {\r\n\t                const shapes = triangle(contours(subPath.map(item => [item.type, ...item.val])));\r\n\t                if (!shapes.cells.length) {\r\n\t                    continue;\r\n\t                }\r\n\t            }\r\n\t            catch {\r\n\t                // empty\r\n\t            }\r\n\t        }\r\n\t        // 同向路径合并\r\n\t        for (let j = subPath.length; j--;) {\r\n\t            const pathItem = subPath[j];\r\n\t            switch (pathItem.type.toLowerCase()) {\r\n\t                case 'h':\r\n\t                case 'v':\r\n\t                    combineHV(subPath, pathItem, j);\r\n\t                    break;\r\n\t                case 'l':\r\n\t                    combineL(subPath, pathItem, j, angelDigit);\r\n\t                    break;\r\n\t                case 'a':\r\n\t                    combineA(subPath, pathItem, j, angelDigit);\r\n\t                    break;\r\n\t            }\r\n\t        }\r\n\t        // 如果没有 marker，则空的 m 指令没有意义 https://www.w3.org/TR/SVG/paths.html#ZeroLengthSegments\r\n\t        // 直接移除子路径即可，因为所有子路径起始点已经改为绝对地址，所以不会有副作用\r\n\t        if (subPath.length > 1) {\r\n\t            result.unshift(subPath);\r\n\t        }\r\n\t    }\r\n\t    return result;\r\n\t};\n\n\tconst lineNormalize = (pathItem) => {\r\n\t    switch (pathItem.type) {\r\n\t        case 'l':\r\n\t            pathItem.val[0] = plus(pathItem.val[0], pathItem.from[0]);\r\n\t            pathItem.val[1] = plus(pathItem.val[1], pathItem.from[1]);\r\n\t            break;\r\n\t        case 'H':\r\n\t            pathItem.val.push(pathItem.from[1]);\r\n\t            break;\r\n\t        case 'h':\r\n\t            pathItem.val[0] = plus(pathItem.val[0], pathItem.from[0]);\r\n\t            pathItem.val.push(pathItem.from[1]);\r\n\t            break;\r\n\t        case 'V':\r\n\t            pathItem.val.unshift(pathItem.from[0]);\r\n\t            break;\r\n\t        case 'v':\r\n\t            pathItem.val.unshift(pathItem.from[0]);\r\n\t            pathItem.val[1] = plus(pathItem.val[1], pathItem.from[1]);\r\n\t            break;\r\n\t    }\r\n\t    pathItem.type = 'L';\r\n\t    return pathItem;\r\n\t};\n\n\tconst itemMerge = (lastItem, pathItem) => {\r\n\t    lastItem.val = lastItem.val.concat(lineNormalize(pathItem).val);\r\n\t};\n\n\tconst doMerge = (threshold, vals) => {\r\n\t    const result = [];\r\n\t    const prev = [vals[0], vals[1]];\r\n\t    for (let i = 2; i < vals.length; i += 2) {\r\n\t        const x = vals[i] - prev[0];\r\n\t        const y = vals[i + 1] - prev[1];\r\n\t        if (x * x + y * y < threshold * threshold) {\r\n\t            prev[0] = plus(vals[i], prev[0]) / 2;\r\n\t            prev[1] = plus(vals[i + 1], prev[1]) / 2;\r\n\t        }\r\n\t        else {\r\n\t            result.push(prev[0], prev[1]);\r\n\t            prev[0] = vals[i];\r\n\t            prev[1] = vals[i + 1];\r\n\t        }\r\n\t    }\r\n\t    result.push(...prev);\r\n\t    return result;\r\n\t};\r\n\tconst mergePoints = (threshold, pathArr) => {\r\n\t    const pathResult = [];\r\n\t    let len = 0;\r\n\t    for (const pathItem of pathArr) {\r\n\t        if (LineTypes.includes(pathItem.type)) {\r\n\t            const lastItem = pathResult[len - 1];\r\n\t            if (lastItem.type === 'L') {\r\n\t                itemMerge(lastItem, pathItem);\r\n\t            }\r\n\t            else {\r\n\t                pathResult.push(lineNormalize(pathItem));\r\n\t                len++;\r\n\t            }\r\n\t        }\r\n\t        else {\r\n\t            const lastItem = pathResult[len - 1];\r\n\t            if (len > 0 && lastItem.type === 'L') {\r\n\t                lastItem.val = doMerge(threshold, lastItem.from.concat(lastItem.val));\r\n\t            }\r\n\t            pathResult.push(pathItem);\r\n\t            len++;\r\n\t        }\r\n\t    }\r\n\t    if (pathResult[len - 1].type === 'L') {\r\n\t        const lastItem = pathResult[len - 1];\r\n\t        lastItem.val = doMerge(threshold, lastItem.from.concat(lastItem.val));\r\n\t    }\r\n\t    return pathResult;\r\n\t};\n\n\t// 曲线指令转直线指令\r\n\tconst straighten = (threshold, pathArr) => {\r\n\t    // 必须逆序执行\r\n\t    outer: for (let pi = pathArr.length; pi--;) {\r\n\t        const pathItem = pathArr[pi];\r\n\t        if (pathItem.type.toLowerCase() === 'a') {\r\n\t            let [x, y] = [pathItem.val[5], pathItem.val[6]];\r\n\t            if (pathItem.type === 'A') {\r\n\t                x = minus(x, pathItem.from[0]);\r\n\t                y = minus(y, pathItem.from[1]);\r\n\t            }\r\n\t            const v = new Vector(x, y);\r\n\t            if (pathItem.val[0] * 2 < threshold && pathItem.val[1] * 2 < threshold && v.modulo < threshold) {\r\n\t                pathItem.type = 'l';\r\n\t                pathItem.val = [x, y];\r\n\t            }\r\n\t        }\r\n\t        else if (\r\n\t        // c/s 指令可以直接直线化\r\n\t        pathItem.type.toLowerCase() === 'c' || pathItem.type.toLowerCase() === 's'\r\n\t            ||\r\n\t                // q 指令必须保证后续指令不是 t 指令\r\n\t                (pathItem.type.toLowerCase() === 'q' && (pi === pathArr.length - 1 || pathArr[pi + 1].type.toLowerCase() !== 't'))) {\r\n\t            const complexItem = complex(pathItem, pathArr[pi - 1]);\r\n\t            if (complexItem.type.toLowerCase() === complexItem.type) {\r\n\t                for (let i = 0; i < complexItem.val.length; i += 2) {\r\n\t                    const v = new Vector(complexItem.val[i], complexItem.val[i + 1]);\r\n\t                    if (v.modulo >= threshold) {\r\n\t                        continue outer;\r\n\t                    }\r\n\t                }\r\n\t                pathItem.type = 'l';\r\n\t                // 忽略所有的控制点，直接移动到目标点\r\n\t                pathItem.val = pathItem.val.slice(pathItem.val.length - 2);\r\n\t            }\r\n\t            else {\r\n\t                for (let i = 0; i < complexItem.val.length; i += 2) {\r\n\t                    const v = new Vector(minus(complexItem.val[i], complexItem.from[0]), minus(complexItem.val[i + 1], complexItem.from[1]));\r\n\t                    if (v.modulo >= threshold) {\r\n\t                        continue outer;\r\n\t                    }\r\n\t                }\r\n\t                pathItem.type = 'L';\r\n\t                // 忽略所有的控制点，直接移动到目标点\r\n\t                pathItem.val = pathItem.val.slice(pathItem.val.length - 2);\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    return pathArr;\r\n\t};\n\n\tconst DPInit = (threshold, pathArr) => {\r\n\t    const pathResult = [];\r\n\t    let len = 0;\r\n\t    for (const pathItem of pathArr) {\r\n\t        if (LineTypes.includes(pathItem.type)) {\r\n\t            const lastItem = pathResult[len - 1];\r\n\t            if (lastItem.type === 'L') {\r\n\t                itemMerge(lastItem, pathItem);\r\n\t            }\r\n\t            else {\r\n\t                pathResult.push(lineNormalize(pathItem));\r\n\t                len++;\r\n\t            }\r\n\t        }\r\n\t        else {\r\n\t            const lastItem = pathResult[len - 1];\r\n\t            if (len > 0 && lastItem.type === 'L') {\r\n\t                lastItem.val = douglasPeucker(threshold, lastItem.from.concat(lastItem.val)).slice(2);\r\n\t            }\r\n\t            pathResult.push(pathItem);\r\n\t            len++;\r\n\t        }\r\n\t    }\r\n\t    if (pathResult[len - 1].type === 'L') {\r\n\t        const lastItem = pathResult[len - 1];\r\n\t        lastItem.val = douglasPeucker(threshold, lastItem.from.concat(lastItem.val)).slice(2);\r\n\t    }\r\n\t    return pathResult;\r\n\t};\r\n\tconst processPath = (dVal, hasMarker, hasStroke, hasStrokeCap, { thinning, sizeDigit, angelDigit, straighten: straighten$1, mergePoint, }) => {\r\n\t    // 先运算一次 doCompute，拿到每条指令的 from 坐标\r\n\t    let pathResult = doCompute(parsePath(dVal));\r\n\t    // 如果存在 marker 引用，多余的优化都不能做\r\n\t    if (!hasMarker) {\r\n\t        // 存在小尺寸曲线转直线的规则\r\n\t        if (straighten$1) {\r\n\t            // doCompute 必须执行\r\n\t            pathResult = doCompute(pathResult.map(p => straighten(straighten$1, p)));\r\n\t        }\r\n\t        // 存在路径抽稀规则\r\n\t        if (thinning) {\r\n\t            // doCompute 必须执行\r\n\t            pathResult = doCompute(pathResult.map(p => DPInit(thinning, p)));\r\n\t        }\r\n\t        // 存在合并相邻节点规则\r\n\t        if (mergePoint) {\r\n\t            // doCompute 必须执行\r\n\t            pathResult = doCompute(pathResult.map(p => mergePoints(mergePoint, p)));\r\n\t        }\r\n\t        // 进行合并、指令转换等运算\r\n\t        pathResult = doCompute(checkSubPath(pathResult, hasStroke, hasStrokeCap, sizeDigit, angelDigit));\r\n\t    }\r\n\t    if (pathResult.length) {\r\n\t        return stringifyPath(pathResult, sizeDigit, angelDigit);\r\n\t    }\r\n\t    else {\r\n\t        return '';\r\n\t    }\r\n\t};\r\n\tconst computePath = async (dom, { params }) => new Promise(resolve => {\r\n\t    parseStyleTree(dom);\r\n\t    const pathNodes = dom.querySelectorAll('path,animateMotion,textPath');\r\n\t    pathNodes.forEach(node => {\r\n\t        const attrName = node.nodeName === 'path' ? 'd' : 'path';\r\n\t        const attrD = node.getAttribute(attrName);\r\n\t        const animateAttrs = getAnimateAttr(node);\r\n\t        // 是否存在 marker 引用，没有 marker 可以移除所有空移动指令\r\n\t        const hasMarker = getAttr(node, 'marker-start', 'none') !== 'none' || getAttr(node, 'marker-mid', 'none') !== 'none' || getAttr(node, 'marker-end', 'none') !== 'none';\r\n\t        // 是否存在 stroke，没有 stroke 可以移除面积为 0 的子路径\r\n\t        const hasStroke = getAttr(node, 'stroke', 'none') !== 'none' && getAttr(node, 'stroke-width', '1') !== '0';\r\n\t        // 是否存在 stroke-linecap，没有 stroke-linecap 可以移除长度为 0 的指令\r\n\t        const hasStrokeCap = getAttr(node, 'stroke-linecap', 'butt') !== 'butt';\r\n\t        let noAttrD = true;\r\n\t        let noAnimateD = true;\r\n\t        if (attrD) {\r\n\t            const pathResult = processPath(attrD, hasMarker, hasStroke, hasStrokeCap, params);\r\n\t            if (!pathResult) {\r\n\t                node.removeAttribute(attrName);\r\n\t            }\r\n\t            else {\r\n\t                noAttrD = false;\r\n\t                node.setAttribute(attrName, pathResult);\r\n\t            }\r\n\t        }\r\n\t        // animateMotion 的 path 属性不能再次被动画元素修改\r\n\t        if (node.nodeName !== 'animateMotion' && checkAnimateAttr(animateAttrs, attrName)) {\r\n\t            const animateD = findAnimateAttr(animateAttrs, attrName);\r\n\t            animateD.forEach(item => {\r\n\t                const value = item.values.map(val => processPath(val, hasMarker, hasStroke, hasStrokeCap, params));\r\n\t                item.keys.forEach((key, index) => {\r\n\t                    if (key === 'values') {\r\n\t                        const values = value.slice(index).filter(v => !!v).join(';');\r\n\t                        if (values) {\r\n\t                            item.node.setAttribute(key, values);\r\n\t                        }\r\n\t                        else {\r\n\t                            item.node.removeAttribute(key);\r\n\t                        }\r\n\t                    }\r\n\t                    else {\r\n\t                        if (value[index]) {\r\n\t                            item.node.setAttribute(key, value[index]);\r\n\t                        }\r\n\t                        else {\r\n\t                            item.node.removeAttribute(key);\r\n\t                        }\r\n\t                    }\r\n\t                });\r\n\t            });\r\n\t            // 再次更新动画属性再进行判断\r\n\t            if (node.nodeName === 'path' && checkAnimateAttr(getAnimateAttr(node), attrName)) {\r\n\t                noAnimateD = false;\r\n\t            }\r\n\t        }\r\n\t        // 既没有 d 属性也没有动画 d 属性的 path 元素可以移除\r\n\t        // textPath 不适用，还需要判断 href 和 xlink:href 且 href 指向了正确的目标\r\n\t        // animateMotion 不适用，还需要判断是否有 mpath 子元素，且 mpath 指向了正确的目标\r\n\t        if (noAttrD && noAnimateD && node.nodeName === 'path') {\r\n\t            node.remove();\r\n\t        }\r\n\t    });\r\n\t    resolve();\r\n\t});\n\n\t// rm-attirbute 不再验证 css 类的属性，只关注该 css 属性是否是 svg 所支持的\r\n\tconst rmAttribute = async (dom, { option: { keepEvent, keepAria, }, params: { rmAttrEqDefault, }, }) => new Promise(resolve => {\r\n\t    const tags = dom.querySelectorAll(svgVdom.NodeType.Tag);\r\n\t    tags.forEach(node => {\r\n\t        const tagDefine = regularTag[node.nodeName];\r\n\t        // href 和 xlink:href 不能并存，如果并存，应该移除后者\r\n\t        if (node.hasAttribute('href') && node.hasAttribute('xlink:href')) {\r\n\t            node.removeAttribute('xlink:href');\r\n\t        }\r\n\t        for (let i = node.attributes.length; i--;) {\r\n\t            const attr = node.attributes[i];\r\n\t            const attrDefine = regularAttr[attr.fullname];\r\n\t            const value = attr.value;\r\n\t            if (attrDefine.isUndef) { // 非标准属性\r\n\t                let isUndef = true;\r\n\t                if ((keepEvent && eventAttributes.includes(attr.fullname)) // 事件属性是否保留\r\n\t                    ||\r\n\t                        (keepAria && ariaAttributes.includes(attr.fullname)) // aria 属性是否保留\r\n\t                ) {\r\n\t                    isUndef = false;\r\n\t                }\r\n\t                if (isUndef) {\r\n\t                    node.removeAttribute(attr.fullname);\r\n\t                    continue;\r\n\t                }\r\n\t            }\r\n\t            else {\r\n\t                if (!value // 空属性\r\n\t                    ||\r\n\t                        (!attrDefine.couldBeStyle && !attr.fullname.includes('xmlns') && !tagDefine.ownAttributes.includes(attr.fullname)) // 属性和元素不匹配\r\n\t                    ||\r\n\t                        !legalValue(attrDefine, attr, node.nodeName) // 不合法的值\r\n\t                ) {\r\n\t                    node.removeAttribute(attr.fullname);\r\n\t                    continue;\r\n\t                }\r\n\t            }\r\n\t            if (rmAttrEqDefault) {\r\n\t                // 需要判断 parentNode.styles，而 parentNode.styles 可能在之前被修改过，因此必须在每个 tag 被遍历到的时候重新解析，虽然这有点影响性能…… TODO 设法优化一下？\r\n\t                parseStyleTree(dom);\r\n\t                if (attrDefine.couldBeStyle && (!tagDefine.onlyAttr || !tagDefine.onlyAttr.includes(attr.fullname))) {\r\n\t                    // 作为样式类的属性\r\n\t                    const parentStyle = node.parentNode.styles;\r\n\t                    // 如果父元素上有同名的样式类属性，则不能移除和默认值相同的属性\r\n\t                    if (!attrDefine.inherited || !parentStyle || !hasProp(parentStyle, attr.fullname)) {\r\n\t                        if (attrIsEqual(attrDefine, attr.value, node.nodeName)) {\r\n\t                            node.removeAttribute(attr.fullname);\r\n\t                            continue;\r\n\t                        }\r\n\t                    }\r\n\t                }\r\n\t                else {\r\n\t                    if (attrIsEqual(attrDefine, attr.value, node.nodeName)) {\r\n\t                        node.removeAttribute(attr.fullname);\r\n\t                        continue;\r\n\t                    }\r\n\t                }\r\n\t            }\r\n\t            // use 元素的宽高不能为负\r\n\t            if (node.nodeName === 'use') {\r\n\t                if (attr.fullname === 'width' || attr.fullname === 'height') {\r\n\t                    if (+value < 0) {\r\n\t                        node.removeAttribute(attr.fullname);\r\n\t                    }\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t    });\r\n\t    resolve();\r\n\t});\n\n\tconst rmComments = async (dom) => new Promise(resolve => {\r\n\t    dom.querySelectorAll(svgVdom.NodeType.Comments).forEach(node => {\r\n\t        node.remove();\r\n\t    });\r\n\t    resolve();\r\n\t});\n\n\tconst rmDocType = async (dom) => new Promise(resolve => {\r\n\t    dom.querySelectorAll(svgVdom.NodeType.DocType).forEach(node => {\r\n\t        node.remove();\r\n\t    });\r\n\t    resolve();\r\n\t});\n\n\tconst isTag = ramda.propEq('nodeType', svgVdom.NodeType.Tag);\n\n\t// 检测数值类属性\r\n\tconst checkNumberAttr = (node, key, allowEmpty, allowAuto, allowZero, animateAttrs) => {\r\n\t    const val = getAttr(node, key, '');\r\n\t    // 是否允许为空\r\n\t    if (!val)\r\n\t        return allowEmpty;\r\n\t    // 是否允许 auto\r\n\t    if (val === 'auto')\r\n\t        return allowAuto;\r\n\t    // 是否必须大于 0\r\n\t    const compare = allowZero ? ramda.gte : ramda.gt;\r\n\t    if (compare(parseFloat(val), 0) || checkAnimateAttr(animateAttrs, key, () => compare(parseFloat(val), 0))) {\r\n\t        return true;\r\n\t    }\r\n\t    return false;\r\n\t};\r\n\tconst checkUse = (node, dom) => {\r\n\t    if (!node.hasAttribute('href') && !node.hasAttribute('xlink:href')) {\r\n\t        node.remove();\r\n\t    }\r\n\t    else {\r\n\t        const value = (node.getAttribute('href') || node.getAttribute('xlink:href'));\r\n\t        if (IRIFullMatch.test(value)) {\r\n\t            const idStr = value.slice(1);\r\n\t            // 不允许引用自身或祖先元素\r\n\t            if (node.closest(n => n.nodeType === svgVdom.NodeType.Tag && n.getAttribute('id') === idStr)) {\r\n\t                node.remove();\r\n\t                return;\r\n\t            }\r\n\t            // 引用了不存在的元素\r\n\t            if (!dom.querySelector(n => n.nodeType === svgVdom.NodeType.Tag && n.getAttribute('id') === idStr)) {\r\n\t                node.remove();\r\n\t            }\r\n\t        }\r\n\t        else {\r\n\t            node.remove();\r\n\t        }\r\n\t    }\r\n\t};\r\n\tconst numberMap = {\r\n\t    pattern: {\r\n\t        attrs: ['width', 'height'],\r\n\t        allowEmpty: false,\r\n\t        allowAuto: false,\r\n\t        allowZero: false,\r\n\t    },\r\n\t    mask: {\r\n\t        attrs: ['width', 'height'],\r\n\t        allowEmpty: true,\r\n\t        allowAuto: true,\r\n\t        allowZero: false,\r\n\t    },\r\n\t    marker: {\r\n\t        attrs: ['markerWidth', 'markerHeight'],\r\n\t        allowEmpty: true,\r\n\t        allowAuto: true,\r\n\t        allowZero: false,\r\n\t    },\r\n\t    image: {\r\n\t        attrs: ['width', 'height'],\r\n\t        allowEmpty: true,\r\n\t        allowAuto: true,\r\n\t        allowZero: false,\r\n\t    },\r\n\t};\r\n\tconst rmHidden = async (dom) => new Promise(resolve => {\r\n\t    parseStyleTree(dom);\r\n\t    const tags = dom.querySelectorAll(svgVdom.NodeType.Tag);\r\n\t    tags.forEach(node => {\r\n\t        // 未包含子节点的文本容器视为隐藏节点\r\n\t        if (!node.childNodes.length && regularTag[node.nodeName].containTextNode) {\r\n\t            node.remove();\r\n\t            return;\r\n\t        }\r\n\t        // textPath 如果没有 path 属性，则 href 和 xlink:href 必须指向 path 或 shape 元素\r\n\t        if (node.nodeName === 'textPath') {\r\n\t            if (!node.hasAttribute('path')) {\r\n\t                const id = node.getAttribute('href') || node.getAttribute('xlink:href');\r\n\t                if (!id) {\r\n\t                    node.remove();\r\n\t                    return;\r\n\t                }\r\n\t                const target = dom.querySelector(id);\r\n\t                if (!target) {\r\n\t                    node.remove();\r\n\t                    return;\r\n\t                }\r\n\t                if (!shapeElements.includes(target.nodeName)) {\r\n\t                    node.remove();\r\n\t                    return;\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t        const styles = node.styles;\r\n\t        const animateAttrs = getAnimateAttr(node);\r\n\t        const notNone = ramda.complement(ramda.equals('none'));\r\n\t        if (hasProp(styles, 'display')\r\n\t            &&\r\n\t                styles.display.value === 'none'\r\n\t            &&\r\n\t                !['script', 'style', 'mpath'].concat(filterPrimitiveElements, animationElements).includes(node.nodeName)\r\n\t            &&\r\n\t                // 增加对动画的验证，对那些 display 为 none，但是动画会修改 display 的元素也不会进行移除\r\n\t                !checkAnimateAttr(animateAttrs, 'display', notNone)) {\r\n\t            node.remove();\r\n\t            return;\r\n\t        }\r\n\t        // 没有填充和描边的形状，不一定可以被移除，要再判断一下自身或父元素是否有 id\r\n\t        if (shapeElements.includes(node.nodeName)) {\r\n\t            const noFill = hasProp(styles, 'fill') && styles.fill.value === 'none' && !checkAnimateAttr(animateAttrs, 'fill', notNone);\r\n\t            const noStroke = (!hasProp(styles, 'stroke') || styles.stroke.value === 'none') && !checkAnimateAttr(animateAttrs, 'stroke', notNone);\r\n\t            if (noFill && noStroke && !node.closest(n => isTag(n) && n.hasAttribute('id'))) {\r\n\t                node.remove();\r\n\t                return;\r\n\t            }\r\n\t        }\r\n\t        if (hasProp(numberMap, node.nodeName)) {\r\n\t            const nubmerItem = numberMap[node.nodeName];\r\n\t            for (let i = nubmerItem.attrs.length; i--;) {\r\n\t                if (!checkNumberAttr(node, nubmerItem.attrs[i], nubmerItem.allowEmpty, nubmerItem.allowAuto, nubmerItem.allowZero, animateAttrs)) {\r\n\t                    node.remove();\r\n\t                    return;\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t        if (node.nodeName === 'use') {\r\n\t            checkUse(node, dom);\r\n\t        }\r\n\t    });\r\n\t    resolve();\r\n\t});\n\n\tconst rmImportant = async (dom) => new Promise(resolve => {\r\n\t    parseStyleTree(dom);\r\n\t    // 1、不存在 override，或 override 的目标不具备 !important 的时候，所有 style 属性中的 !important 可以移除\r\n\t    // 2、styletag 中的样式，如果没有成功应用到任何目标元素，可以移除 !important，或应用成功，但是并非依赖 !important\r\n\t    if (dom.stylesheet) {\r\n\t        // 遍历 style 解析对象，取得包含 css 定义的值\r\n\t        dom.stylesheet.stylesheet.rules.forEach((styleRule) => {\r\n\t            // 只针对规则类\r\n\t            if (styleRule.type === 'rule' && styleRule.declarations && styleRule.selectors) {\r\n\t                // 缓存所有的 !important\r\n\t                const importantMap = new Map();\r\n\t                styleRule.declarations.forEach((ruleItem) => {\r\n\t                    if (ruleItem.property && ruleItem.value) {\r\n\t                        if (importantReg.test(ruleItem.value)) {\r\n\t                            importantMap.set(ruleItem.property, ruleItem);\r\n\t                        }\r\n\t                    }\r\n\t                });\r\n\t                if (importantMap.size) {\r\n\t                    for (let si = styleRule.selectors.length; si--;) {\r\n\t                        const selector = svgVdom.parseSelector(styleRule.selectors[si])[0];\r\n\t                        const selectorPriority = getSelectorPriority(selector);\r\n\t                        const nodes = dom.querySelectorAll(selector);\r\n\t                        if (nodes.length) {\r\n\t                            nodes.forEach(node => {\r\n\t                                const nodeStyles = node.styles;\r\n\t                                for (const [key, decl] of importantMap) {\r\n\t                                    // 当前样式被成功应用\r\n\t                                    if (nodeStyles[key].from === 'styletag' && valueIsEqual(regularAttr[key], nodeStyles[key].value, decl.value.replace(importantReg, ''))) {\r\n\t                                        if (nodeStyles[key].overrideList.some(// 列举一些 !important 不能被移除的情况\r\n\t                                        // 列举一些 !important 不能被移除的情况\r\n\t                                        ovr => ovr.from === 'inline' // 覆盖的目标是行内样式\r\n\t                                            ||\r\n\t                                                ((ovr.important // 覆盖的目标具有 !important\r\n\t                                                    ||\r\n\t                                                        overrideAble(ovr.selectorPriority, selectorPriority) // 覆盖目标的选择器优先级高于当前选择器\r\n\t                                                )\r\n\t                                                    &&\r\n\t                                                        !valueIsEqual(regularAttr[key], ovr.value, decl.value) // 且 value 不相等\r\n\t                                                ))) {\r\n\t                                            // 如果当前样式的优先级依赖了 !important，则不能移除，需要从缓存中移除\r\n\t                                            importantMap.delete(key);\r\n\t                                        }\r\n\t                                    }\r\n\t                                }\r\n\t                            });\r\n\t                        }\r\n\t                    }\r\n\t                    for (const decl of importantMap.values()) {\r\n\t                        decl.value = decl.value.replace(importantReg, '');\r\n\t                    }\r\n\t                }\r\n\t            }\r\n\t        });\r\n\t    }\r\n\t    // styletag 优化后需要再次解析样式树\r\n\t    parseStyleTree(dom);\r\n\t    const tags = dom.querySelectorAll(svgVdom.NodeType.Tag);\r\n\t    tags.forEach(node => {\r\n\t        if (node.hasAttribute('style')) {\r\n\t            const nodeStyles = node.styles;\r\n\t            const styleList = parseStyle(node.getAttribute('style'));\r\n\t            styleList.forEach(style => {\r\n\t                if (style.important) {\r\n\t                    if (nodeStyles[style.fullname].overrideList.every(ovr => !ovr.important || valueIsEqual(regularAttr[style.fullname], ovr.value, style.value))) {\r\n\t                        style.important = false;\r\n\t                    }\r\n\t                }\r\n\t            });\r\n\t            node.setAttribute('style', styleToValue(styleList));\r\n\t        }\r\n\t    });\r\n\t    resolve();\r\n\t});\n\n\t// 一些元素的某些属性不能被转为 style\r\n\tconst cantTrans = (define, attrName) => define.onlyAttr && define.onlyAttr.includes(attrName);\n\n\t// 验证 geometry 属性在当前环境是否支持放置在 CSS 中\r\n\tconst checkGeometry = (nodeName, attrName, browsers) => {\r\n\t    if (geometryElements.includes(nodeName) && geometryProperties.includes(attrName)) {\r\n\t        if (browsers.ie // ie 不支持\r\n\t            ||\r\n\t                browsers.firefox // 火狐不支持\r\n\t            ||\r\n\t                browsers.and_ff // 火狐不支持\r\n\t            ||\r\n\t                (browsers.chrome && browsers.chrome < 81) // 推测 chrome 从 81 开始支持，未验证\r\n\t            ||\r\n\t                (browsers.and_chr && browsers.and_chr < 81) // 推测 chrome android 从 81 开始支持，未验证\r\n\t            ||\r\n\t                (browsers.edge && browsers.edge < 81) // 推测 edge 从 81 开始支持，未验证\r\n\t            ||\r\n\t                (browsers.android && browsers.android < 81) // 推测 android 从 81 开始支持，未验证\r\n\t        ) {\r\n\t            return false;\r\n\t        }\r\n\t        return true;\r\n\t    }\r\n\t    return false;\r\n\t};\n\n\tconst rmCSSNode$1 = (cssNode, plist) => {\r\n\t    const index = plist.indexOf(cssNode);\r\n\t    if (index !== -1) {\r\n\t        plist.splice(index, 1);\r\n\t    }\r\n\t};\r\n\t// 需要 px 单位但拿到了非 0 的纯数值\r\n\tconst checkUnit = (name, value) => needUnitInStyle.includes(name) && numberFullMatch.test(value) && +value !== 0;\r\n\tconst checkAttr$1 = (node, dom, rmAttrEqDefault, ignoreKnownCSS, browsers) => {\r\n\t    parseStyleTree(dom);\r\n\t    const attrObj = {}; // 存储所有样式和可以转为样式的属性\r\n\t    const tagDefine = regularTag[node.nodeName];\r\n\t    const nodeStyle = node.styles;\r\n\t    // 标记覆盖了 styletag 中的属性\r\n\t    // 逆序循环，并从后向前移除属性\r\n\t    for (let i = node.attributes.length; i--;) {\r\n\t        const attr = node.attributes[i];\r\n\t        const attrDefine = regularAttr[attr.fullname];\r\n\t        if (attr.fullname === 'style') {\r\n\t            const styleList = parseStyle(attr.value);\r\n\t            const styleUnique = new Set();\r\n\t            // 逆序循环，因为 CSS 的优先级是从后往前覆盖的\r\n\t            for (let si = styleList.length; si--;) {\r\n\t                const styleItem = styleList[si];\r\n\t                const styleDefine = regularAttr[styleItem.fullname];\r\n\t                // 首先排重\r\n\t                if (styleUnique.has(styleItem.fullname)) {\r\n\t                    styleList.splice(si, 1);\r\n\t                    continue;\r\n\t                }\r\n\t                // 移除掉不能识别的 CSS 属性\r\n\t                if (!styleDefine.couldBeStyle) {\r\n\t                    if (!knownCSS(styleItem.fullname) || ignoreKnownCSS) {\r\n\t                        styleList.splice(si, 1);\r\n\t                    }\r\n\t                    else {\r\n\t                        styleUnique.add(styleItem.fullname);\r\n\t                        // 不在 SVG attributes 列表里的标准 CSS 属性不再验证合法性，但仍然需要排重\r\n\t                    }\r\n\t                    continue;\r\n\t                }\r\n\t                // 非法值\r\n\t                if (!legalValue(styleDefine, styleItem)) {\r\n\t                    styleList.splice(si, 1);\r\n\t                    continue;\r\n\t                }\r\n\t                // 需要 px 单位，但是没有加 px\r\n\t                if (checkUnit(styleItem.fullname, styleItem.value)) {\r\n\t                    styleList.splice(si, 1);\r\n\t                    continue;\r\n\t                }\r\n\t                // 样式无法应用\r\n\t                if (!checkApply(styleDefine, node, dom)) {\r\n\t                    styleList.splice(si, 1);\r\n\t                    continue;\r\n\t                }\r\n\t                if (rmAttrEqDefault) {\r\n\t                    // 如果父元素上有同名的样式类属性，则不能移除和默认值相同的属性\r\n\t                    const parentStyle = node.parentNode.styles;\r\n\t                    const nodeStyle = node.styles;\r\n\t                    // 当前样式不是覆盖的 styletag， 才可以移除\r\n\t                    if (!styleDefine.inherited || !parentStyle || !hasProp(parentStyle, styleItem.fullname)) {\r\n\t                        if ((!nodeStyle || !nodeStyle[styleItem.fullname] || !nodeStyle[styleItem.fullname].override) && attrIsEqual(styleDefine, styleItem.value, node.nodeName)) {\r\n\t                            styleList.splice(si, 1);\r\n\t                            continue;\r\n\t                        }\r\n\t                    }\r\n\t                }\r\n\t                styleUnique.add(styleItem.fullname);\r\n\t                // 标记一下是否存在不能和属性互转的样式\r\n\t                const onlyCss = (nodeStyle && nodeStyle[styleItem.fullname] && nodeStyle[styleItem.fullname].override) // 属性覆盖了 styletag\r\n\t                    ||\r\n\t                        (!styleDefine.couldBeStyle // 标记在常规属性列表中\r\n\t                            &&\r\n\t                                !checkGeometry(node.nodeName, styleItem.fullname, browsers) // 并且当前环境不支持 geo 属性转换\r\n\t                        )\r\n\t                    ||\r\n\t                        cantTrans(tagDefine, styleItem.fullname); // 某些特定元素属性不能放在 style 中\r\n\t                // 如果存在同名属性，要把被覆盖的属性移除掉\r\n\t                // 之所以要判断 attrObj 是否存在 key，是为了保证只移除已遍历过的属性（此处不考虑同名属性，同名属性无法通过 svg-vdom 的解析规则）\r\n\t                if (!onlyCss && ramda.has(styleItem.fullname, attrObj)) {\r\n\t                    node.removeAttribute(styleItem.fullname);\r\n\t                }\r\n\t                attrObj[styleItem.fullname] = {\r\n\t                    value: styleItem.value,\r\n\t                    fromStyle: true,\r\n\t                };\r\n\t            }\r\n\t            if (styleList.length) {\r\n\t                node.setAttribute('style', styleToValue(styleList));\r\n\t            }\r\n\t            else {\r\n\t                node.removeAttribute('style');\r\n\t            }\r\n\t        }\r\n\t        else if (attrDefine.couldBeStyle || checkGeometry(node.nodeName, attr.fullname, browsers)) {\r\n\t            if (cantTrans(tagDefine, attr.fullname)) { // 有一些元素的某些属性不能被转为 style，此类属性也不宜再按照 css 属性来验证\r\n\t                continue;\r\n\t            }\r\n\t            if (hasProp(attrObj, attr.fullname) // 已被 style 属性覆盖\r\n\t                ||\r\n\t                    !checkApply(attrDefine, node, dom) // 样式继承链上不存在可应用对象\r\n\t            ) {\r\n\t                node.removeAttribute(attr.fullname);\r\n\t            }\r\n\t            else {\r\n\t                attrObj[attr.fullname] = {\r\n\t                    value: attr.value,\r\n\t                };\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t};\r\n\tconst rmIllegalStyle = async (dom, { params: { rmAttrEqDefault, ignoreKnownCSS, }, browsers, }) => new Promise(resolve => {\r\n\t    if (dom.stylesheet) {\r\n\t        const cssRules = dom.stylesheet.stylesheet;\r\n\t        // 遍历 style 解析对象，取得包含 css 定义的值\r\n\t        traversalObj(ramda.propEq('type', 'declaration'), (cssNode, parents) => {\r\n\t            const attrDefine = regularAttr[cssNode.property];\r\n\t            if (!attrDefine.couldBeStyle && (!knownCSS(cssNode.property) || ignoreKnownCSS) || checkUnit(cssNode.property, cssNode.value)) {\r\n\t                rmCSSNode$1(cssNode, parents[parents.length - 1]);\r\n\t            }\r\n\t            else if (rmAttrEqDefault) {\r\n\t                // 仅验证只有一种默认值的情况\r\n\t                if (typeof attrDefine.initValue === 'string' && valueIsEqual(attrDefine, cssNode.value, attrDefine.initValue)) {\r\n\t                    rmCSSNode$1(cssNode, parents[parents.length - 1]);\r\n\t                }\r\n\t            }\r\n\t        }, cssRules.rules, true);\r\n\t    }\r\n\t    parseStyleTree(dom);\r\n\t    const tags = dom.querySelectorAll(svgVdom.NodeType.Tag);\r\n\t    tags.forEach(node => {\r\n\t        checkAttr$1(node, dom, rmAttrEqDefault, ignoreKnownCSS, browsers);\r\n\t    });\r\n\t    resolve();\r\n\t});\n\n\tconst rmIrregularNesting = async (dom, { option: { ignore } }) => new Promise(resolve => {\r\n\t    const notIgnore = (node) => ramda.not(ramda.any(ramda.equals(ramda.prop('nodeName', node)), ignore));\r\n\t    const tags = dom.querySelectorAll(ramda.both(isTag, notIgnore));\r\n\t    for (let i = tags.length; i--;) {\r\n\t        const node = tags[i];\r\n\t        const parent = node.parentNode;\r\n\t        if (!parent) {\r\n\t            continue;\r\n\t        }\r\n\t        let legalRule = regularTag[parent.nodeName];\r\n\t        if (legalRule.isUndef) {\r\n\t            continue;\r\n\t        }\r\n\t        // noself 表示不允许嵌套自身\r\n\t        if (legalRule.legalChildElements.noself && node.nodeName === parent.nodeName) {\r\n\t            node.remove();\r\n\t            continue;\r\n\t        }\r\n\t        // transparent 表示参照最近的非 switch 上级元素的规则\r\n\t        if (legalRule.legalChildElements.transparent) {\r\n\t            const ancestor = parent.parentNode.closest(n => n.nodeName !== 'switch');\r\n\t            if (!ancestor || !isTag(ancestor)) {\r\n\t                continue;\r\n\t            }\r\n\t            legalRule = regularTag[ancestor.nodeName];\r\n\t            if (legalRule.isUndef) {\r\n\t                continue;\r\n\t            }\r\n\t        }\r\n\t        // any 表示可以任意嵌套\r\n\t        if (legalRule.legalChildElements.any) {\r\n\t            continue;\r\n\t        }\r\n\t        else if (legalRule.legalChildElements.childElements && !legalRule.legalChildElements.childElements.includes(node.nodeName)) { // 不在嵌套列表中的情况\r\n\t            node.remove();\r\n\t        }\r\n\t    }\r\n\t    resolve();\r\n\t});\n\n\tconst rmIrregularTag = async (dom, { option: { ignore } }) => new Promise(resolve => {\r\n\t    const notIgnore = (node) => ramda.not(ramda.any(ramda.equals(ramda.prop('nodeName', node)), ignore));\r\n\t    const tags = dom.querySelectorAll(ramda.both(isTag, notIgnore));\r\n\t    tags.forEach(node => {\r\n\t        if (regularTag[node.nodeName].isUndef) {\r\n\t            node.remove();\r\n\t        }\r\n\t    });\r\n\t    resolve();\r\n\t});\n\n\tconst pxReg = new RegExp(`(?<=^|\\\\(|\\\\s|,|{|;|:)(${numberPattern})px(?=$|\\\\)|\\\\s|,|;|})`, 'gi');\r\n\tconst rmPx = async (dom) => new Promise(resolve => {\r\n\t    const tags = dom.querySelectorAll(svgVdom.NodeType.Tag);\r\n\t    tags.forEach(node => {\r\n\t        node.attributes.forEach(attr => {\r\n\t            if (attr.fullname === 'style') {\r\n\t                const styleList = parseStyle(attr.value);\r\n\t                styleList.forEach(s => {\r\n\t                    if (regularAttr[s.fullname].maybeSizeNumber || regularAttr[s.fullname].maybeAccurateNumber) {\r\n\t                        // 移除 px ，同时移除 0 值的单位\r\n\t                        pxReg.lastIndex = 0;\r\n\t                        // 特殊：部分 key 如果在 style 属性中，px 单位不能被移除\r\n\t                        // https://github.com/benboba/svg-slim/issues/31\r\n\t                        if (!needUnitInStyle.includes(s.fullname)) {\r\n\t                            s.value = s.value.replace(pxReg, '$1');\r\n\t                        }\r\n\t                        s.value = s.value.replace(/(?<=^|\\D)0[a-z]+?(?=$|\\)|\\s|,|;|})/gi, '0');\r\n\t                    }\r\n\t                });\r\n\t                attr.value = stringifyStyle(styleList);\r\n\t            }\r\n\t            else {\r\n\t                if (regularAttr[attr.fullname].maybeSizeNumber || regularAttr[attr.fullname].maybeAccurateNumber) {\r\n\t                    pxReg.lastIndex = 0;\r\n\t                    // 移除 px ，同时移除 0 值的单位\r\n\t                    attr.value = attr.value.replace(pxReg, '$1').replace(/(?<=^|\\D)0[a-z]+?(?=$|\\)|\\s|,|;|})/gi, '0');\r\n\t                }\r\n\t            }\r\n\t        });\r\n\t    });\r\n\t    if (dom.stylesheet) {\r\n\t        // 缩短 style 标签内的数值\r\n\t        const parsedCss = dom.stylesheet.stylesheet;\r\n\t        traversalObj(ramda.both(ramda.has('property'), ramda.has('value')), (cssRule) => {\r\n\t            if (!needUnitInStyle.includes(cssRule.property)) {\r\n\t                cssRule.value = cssRule.value.replace(pxReg, '$1');\r\n\t            }\r\n\t            cssRule.value = cssRule.value.replace(/(?<=^|\\D)0[a-z]+?(?=$|\\)|\\s|,|;|})/gi, '0');\r\n\t        }, parsedCss.rules);\r\n\t    }\r\n\t    resolve();\r\n\t});\n\n\tconst rmUnnecessary = async (dom, { option }) => new Promise(resolve => {\r\n\t    const { tags } = option;\r\n\t    if (tags.length) {\r\n\t        dom.querySelectorAll(node => tags.includes(node.nodeName) && unnecessaryElements.includes(node.nodeName)).forEach(node => {\r\n\t            node.remove();\r\n\t        });\r\n\t    }\r\n\t    resolve();\r\n\t});\n\n\tconst rmVersion = async (dom) => new Promise(resolve => {\r\n\t    dom.querySelectorAll('svg').forEach(node => {\r\n\t        node.removeAttribute('version');\r\n\t    });\r\n\t    resolve();\r\n\t});\n\n\tconst rmViewBox = async (dom) => new Promise(resolve => {\r\n\t    const viewboxNodes = dom.querySelectorAll('[viewBox]');\r\n\t    viewboxNodes.forEach(node => {\r\n\t        const size = ['0', '0', '0', '0'];\r\n\t        const viewBox = parseNumberList(node.getAttribute('viewBox'));\r\n\t        // viewBox 属性的长度必须为 4，且 width 和 height 不能为负\r\n\t        if (viewBox.length !== 4 || viewBox[2] < 0 || viewBox[3] < 0) {\r\n\t            node.removeAttribute('viewBox');\r\n\t            return;\r\n\t        }\r\n\t        node.attributes.forEach(attr => {\r\n\t            if (node.nodeName === 'marker') {\r\n\t                if (attr.fullname === 'markerWidth') {\r\n\t                    size[2] = attr.value.replace(/px$/, '');\r\n\t                }\r\n\t                else if (attr.fullname === 'markerHeight') {\r\n\t                    size[3] = attr.value.replace(/px$/, '');\r\n\t                }\r\n\t            }\r\n\t            else {\r\n\t                switch (attr.fullname) {\r\n\t                    case 'x':\r\n\t                        size[0] = attr.value.replace(/px$/, '');\r\n\t                        break;\r\n\t                    case 'y':\r\n\t                        size[1] = attr.value.replace(/px$/, '');\r\n\t                        break;\r\n\t                    case 'width':\r\n\t                        size[2] = attr.value.replace(/px$/, '');\r\n\t                        break;\r\n\t                    case 'height':\r\n\t                        size[3] = attr.value.replace(/px$/, '');\r\n\t                        break;\r\n\t                }\r\n\t            }\r\n\t        });\r\n\t        // x、y、width、height 可以是不同的单位，只有当单位是 px 且和 viewBox 各个位置相等时，才可以移除 viewBox\r\n\t        if (ramda.equals(size, viewBox.map(s => `${s}`))) {\r\n\t            node.removeAttribute('viewBox');\r\n\t        }\r\n\t    });\r\n\t    resolve();\r\n\t});\n\n\tconst rmXMLDecl = async (dom) => new Promise(resolve => {\r\n\t    dom.querySelectorAll(svgVdom.NodeType.XMLDecl).forEach(node => {\r\n\t        node.remove();\r\n\t    });\r\n\t    resolve();\r\n\t});\n\n\tconst rmXMLNS = async (dom) => new Promise(resolve => {\r\n\t    const traversalNode = (node, nsStack) => {\r\n\t        const xmlnsObj = {};\r\n\t        Object.assign(xmlnsObj, nsStack[nsStack.length - 1]);\r\n\t        // 首先判断节点是否存在命名空间\r\n\t        if (node.namespace) {\r\n\t            if (hasProp(xmlnsObj, node.namespace)) {\r\n\t                xmlnsObj[node.namespace].count++;\r\n\t            }\r\n\t            else {\r\n\t                node.remove();\r\n\t                return;\r\n\t            }\r\n\t        }\r\n\t        // 遍历节点属性的命名空间\r\n\t        for (let i = node.attributes.length; i--;) {\r\n\t            const attr = node.attributes[i];\r\n\t            if (attr.namespace === 'xmlns') {\r\n\t                xmlnsObj[attr.name] = {\r\n\t                    target: node,\r\n\t                    count: 0,\r\n\t                };\r\n\t            }\r\n\t            else if (attr.namespace) {\r\n\t                if (hasProp(xmlnsObj, attr.namespace)) {\r\n\t                    xmlnsObj[attr.namespace].count++;\r\n\t                }\r\n\t                else if (attr.fullname !== 'xml:space') { // 避免 xml:space 被意外移除\r\n\t                    node.removeAttribute(attr.fullname);\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t        // 压栈，并遍历子节点\r\n\t        nsStack.push(xmlnsObj);\r\n\t        node.children.forEach(childNode => {\r\n\t            traversalNode(childNode, nsStack);\r\n\t        });\r\n\t        Object.keys(xmlnsObj).forEach(ns => {\r\n\t            if (xmlnsObj[ns].count === 0 && xmlnsObj[ns].target === node) {\r\n\t                node.removeAttribute(`xmlns:${ns}`);\r\n\t            }\r\n\t        });\r\n\t        nsStack.pop();\r\n\t    };\r\n\t    dom.children.forEach(node => {\r\n\t        traversalNode(node, [{}]);\r\n\t    });\r\n\t    resolve();\r\n\t});\n\n\t// 验证 animateMotion 的合法性\r\n\tconst checkAnimateMotion = (node, dom) => {\r\n\t    if (node.hasAttribute('path')) {\r\n\t        return true;\r\n\t    }\r\n\t    const mpath = node.querySelectorAll('mpath');\r\n\t    return mpath.some(subNode => {\r\n\t        const id = subNode.getAttribute('href') || subNode.getAttribute('xlink:href');\r\n\t        if (!id) {\r\n\t            return false;\r\n\t        }\r\n\t        const target = dom.querySelector(id);\r\n\t        if (!target) {\r\n\t            return false;\r\n\t        }\r\n\t        return shapeElements.includes(target.nodeName);\r\n\t    });\r\n\t};\n\n\tconst shortenAnimate = async (dom, { option: { remove } }) => new Promise(resolve => {\r\n\t    const animateNodes = dom.querySelectorAll(animationElements.join(','));\r\n\t    animateNodes.forEach(node => {\r\n\t        if (remove) {\r\n\t            node.remove();\r\n\t            return;\r\n\t        }\r\n\t        // 不管 href 能不能找到目标，都移除该属性，改为设置成 target 的子元素\r\n\t        const href = node.hasAttribute('href') ? node.getAttribute('href') : node.getAttribute('xlink:href');\r\n\t        if (href) {\r\n\t            const target = dom.querySelector(href);\r\n\t            if (target) {\r\n\t                target.appendChild(node);\r\n\t            }\r\n\t        }\r\n\t        node.removeAttribute('href');\r\n\t        node.removeAttribute('xlink:href');\r\n\t        // 处理 attributeName 属性\r\n\t        if (animationAttrElements.includes(node.nodeName)) {\r\n\t            // 先取出来 attributeName 属性\r\n\t            const attributeName = node.getAttribute('attributeName') || '';\r\n\t            const animateDefine = regularAttr[attributeName];\r\n\t            if (!attributeName || !animateDefine.animatable) {\r\n\t                // attributeName 指定了不能实现动画的属性，视为无效\r\n\t                node.remove();\r\n\t                return;\r\n\t            }\r\n\t            // attributeName 和父元素不匹配\r\n\t            const parentName = node.parentNode.nodeName;\r\n\t            if (!animateDefine.applyTo.includes(parentName) && !regularTag[parentName].ownAttributes.includes(attributeName)) {\r\n\t                node.remove();\r\n\t                return;\r\n\t            }\r\n\t            // animateTransform 只能修改 tranform 类型的属性\r\n\t            // https://svgwg.org/specs/animations/#SVGExtensionsToSMILAnimation\r\n\t            if (node.nodeName === 'animateTransform' && attributeName !== 'transform' && attributeName !== 'patternTransform') {\r\n\t                node.remove();\r\n\t                return;\r\n\t            }\r\n\t            for (const attr of node.attributes) {\r\n\t                // 对动画属性 from、to、by、values 的值进行合法性验证\r\n\t                if (animationAttributes.includes(attr.fullname)) {\r\n\t                    // 动画属性不合法\r\n\t                    if ((attr.fullname !== 'values' && !legalValue(animateDefine, attr))) {\r\n\t                        node.removeAttribute(attr.fullname);\r\n\t                        continue;\r\n\t                    }\r\n\t                    // values 是以分号分隔的，需要分隔后对每一项进行合法性验证\r\n\t                    const values = attr.value.split(';');\r\n\t                    if (values.every(val => !legalValue(animateDefine, {\r\n\t                        name: 'values',\r\n\t                        fullname: 'values',\r\n\t                        namespace: '',\r\n\t                        value: val.trim(),\r\n\t                    }))) {\r\n\t                        node.removeAttribute(attr.fullname);\r\n\t                    }\r\n\t                }\r\n\t            }\r\n\t            if (node.nodeName === 'set' && !node.hasAttribute('to')) {\r\n\t                node.remove();\r\n\t                return;\r\n\t            }\r\n\t            if (!animationAttributes.some(key => node.hasAttribute(key))) {\r\n\t                node.remove();\r\n\t                return;\r\n\t            }\r\n\t        }\r\n\t        // animateMotion 如果没有 path 属性，则必须包含有效的 mpath ，规则是 href 或 xlink:href 指向 path 或 shape 元素\r\n\t        if (node.nodeName === 'animateMotion') {\r\n\t            if (!checkAnimateMotion(node, dom)) {\r\n\t                node.remove();\r\n\t                return;\r\n\t            }\r\n\t        }\r\n\t    });\r\n\t    resolve();\r\n\t});\n\n\tconst letterList = 'abcdefghijklmnopqrstuvwxyz';\r\n\tconst numberList = '0123456789';\r\n\tconst startChar = `${letterList}${letterList.toUpperCase()}_`;\r\n\tconst nameChar = `${startChar}${numberList}-`;\r\n\tconst startLen = startChar.length;\r\n\tconst nameLen = nameChar.length;\r\n\tconst sList = startChar.split('');\r\n\tlet slen = startLen;\r\n\tlet pi = 0;\r\n\tconst createShortenID = (si) => {\r\n\t    while (si >= slen) {\r\n\t        sList.push(...nameChar.split('').map(s => sList[pi] + s));\r\n\t        slen += nameLen;\r\n\t        pi++;\r\n\t    }\r\n\t    return sList[si];\r\n\t};\n\n\tconst classSelectorReg = /\\.([^,*#>+~:{\\s[.]+)/gi;\r\n\tconst shortenClass = async (dom) => new Promise(resolve => {\r\n\t    const parsedCss = dom.stylesheet;\r\n\t    if (parsedCss) {\r\n\t        let si = 0;\r\n\t        const classList = {};\r\n\t        const shorten = (key) => {\r\n\t            if (hasProp(classList, key)) {\r\n\t                return classList[key][0];\r\n\t            }\r\n\t            const sid = createShortenID(si++);\r\n\t            classList[key] = [sid, false];\r\n\t            return sid;\r\n\t        };\r\n\t        // 取出所有被引用的 class ，并缩短\r\n\t        const cssRules = parsedCss.stylesheet;\r\n\t        traversalObj(ramda.has('selectors'), (ruleItem) => {\r\n\t            const selectors = ruleItem.selectors;\r\n\t            if (selectors) {\r\n\t                selectors.forEach((selector, selectorIndex) => {\r\n\t                    selectors[selectorIndex] = selector.replace(classSelectorReg, (m, p) => `.${shorten(p)}`);\r\n\t                });\r\n\t            }\r\n\t        }, cssRules.rules);\r\n\t        // 查找 dom 树，找到被引用的 class ，替换为缩短后的值\r\n\t        dom.querySelectorAll(svgVdom.NodeType.Tag).forEach(node => {\r\n\t            const classAttr = node.getAttribute('class');\r\n\t            if (classAttr !== null) {\r\n\t                const className = mixWhiteSpace(classAttr.trim()).split(/\\s+/);\r\n\t                for (let ci = className.length; ci--;) {\r\n\t                    if (hasProp(classList, className[ci])) {\r\n\t                        const cName = classList[className[ci]][0];\r\n\t                        classList[className[ci]][1] = true;\r\n\t                        className[ci] = cName;\r\n\t                    }\r\n\t                    else {\r\n\t                        className.splice(ci, 1);\r\n\t                    }\r\n\t                }\r\n\t                if (className.length) {\r\n\t                    node.setAttribute('class', className.join(' '));\r\n\t                }\r\n\t                else {\r\n\t                    node.removeAttribute('class');\r\n\t                }\r\n\t            }\r\n\t        });\r\n\t        // 最后移除不存在的 class 引用\r\n\t        Object.values(classList).forEach(item => {\r\n\t            if (item[1]) {\r\n\t                return;\r\n\t            }\r\n\t            const reg = new RegExp(`\\\\.${item[0]}(?=[,\\\\*#>+~:{\\\\s\\\\[\\\\.]|$)`);\r\n\t            traversalObj(ramda.has('selectors'), (ruleItem, path) => {\r\n\t                const selectors = ruleItem.selectors;\r\n\t                if (selectors) {\r\n\t                    for (let i = selectors.length; i--;) {\r\n\t                        if (reg.test(selectors[i])) {\r\n\t                            selectors.splice(i, 1);\r\n\t                        }\r\n\t                    }\r\n\t                    if (!selectors.length) {\r\n\t                        const parent = path[path.length - 1];\r\n\t                        parent.splice(parent.indexOf(ruleItem), 1);\r\n\t                    }\r\n\t                }\r\n\t            }, cssRules.rules);\r\n\t        });\r\n\t    }\r\n\t    else {\r\n\t        // 如果不存在样式表，则直接移除所有的 class 属性\r\n\t        dom.querySelectorAll(svgVdom.NodeType.Tag).forEach(node => {\r\n\t            node.removeAttribute('class');\r\n\t        });\r\n\t    }\r\n\t    resolve();\r\n\t});\n\n\tconst rgb2hsl = (rgb) => {\r\n\t    const r = rgb.r / FF;\r\n\t    const g = rgb.g / FF;\r\n\t    const b = rgb.b / FF;\r\n\t    const max = Math.max(r, g, b);\r\n\t    const min = Math.min(r, g, b);\r\n\t    const diff = max - min;\r\n\t    const l = (max + min) / 2;\r\n\t    const h = diff === 0 ?\r\n\t        0 :\r\n\t        max === r ?\r\n\t            (g - b) / diff :\r\n\t            max === g ?\r\n\t                (b - r) / diff + 2 :\r\n\t                (r - g) / diff + 4;\r\n\t    const s = diff === 0 ?\r\n\t        0 :\r\n\t        l < HALF ?\r\n\t            diff / (l * 2) :\r\n\t            diff / (2 - l * 2);\r\n\t    return { h: validNum(CIRC, (h + CIRC) % 6 * (CIRC / 6)), s: validNum(Hundred, s * Hundred), l: validNum(Hundred, l * Hundred) };\r\n\t};\n\n\tconst fillIn = ramda.curry((digit, s) => s.length >= digit ? s : fillIn(digit, `0${s}`));\n\n\tconst HEX = 16;\r\n\tconst TEN = 10;\r\n\tconst toHex = (s) => parseInt(`${s}`, TEN).toString(HEX);\n\n\tconst operateHex = ramda.pipe(toHex, ramda.toLower, fillIn(2));\r\n\tconst alphaMap$1 = {\r\n\t    '100': 255,\r\n\t    '99': 252,\r\n\t    '98': 250,\r\n\t    '97': 247,\r\n\t    '96': 245,\r\n\t    '95': 242,\r\n\t    '94': 240,\r\n\t    '93': 237,\r\n\t    '92': 235,\r\n\t    '91': 232,\r\n\t    '90': 230,\r\n\t    '89': 227,\r\n\t    '88': 224,\r\n\t    '87': 222,\r\n\t    '86': 219,\r\n\t    '85': 217,\r\n\t    '84': 214,\r\n\t    '83': 212,\r\n\t    '82': 209,\r\n\t    '81': 207,\r\n\t    '80': 204,\r\n\t    '79': 201,\r\n\t    '78': 199,\r\n\t    '77': 196,\r\n\t    '76': 194,\r\n\t    '75': 191,\r\n\t    '74': 189,\r\n\t    '73': 186,\r\n\t    '72': 184,\r\n\t    '71': 181,\r\n\t    '70': 179,\r\n\t    '69': 176,\r\n\t    '68': 173,\r\n\t    '67': 171,\r\n\t    '66': 168,\r\n\t    '65': 166,\r\n\t    '64': 163,\r\n\t    '63': 161,\r\n\t    '62': 158,\r\n\t    '61': 156,\r\n\t    '60': 153,\r\n\t    '59': 150,\r\n\t    '58': 148,\r\n\t    '57': 145,\r\n\t    '56': 143,\r\n\t    '55': 140,\r\n\t    '54': 138,\r\n\t    '53': 135,\r\n\t    '52': 133,\r\n\t    '51': 130,\r\n\t    '50': 128,\r\n\t    '49': 125,\r\n\t    '48': 122,\r\n\t    '47': 120,\r\n\t    '46': 117,\r\n\t    '45': 115,\r\n\t    '44': 112,\r\n\t    '43': 110,\r\n\t    '42': 107,\r\n\t    '41': 105,\r\n\t    '40': 102,\r\n\t    '39': 99,\r\n\t    '38': 97,\r\n\t    '37': 94,\r\n\t    '36': 92,\r\n\t    '35': 89,\r\n\t    '34': 87,\r\n\t    '33': 84,\r\n\t    '32': 82,\r\n\t    '31': 79,\r\n\t    '30': 77,\r\n\t    '29': 74,\r\n\t    '28': 71,\r\n\t    '27': 69,\r\n\t    '26': 66,\r\n\t    '25': 64,\r\n\t    '24': 61,\r\n\t    '23': 59,\r\n\t    '22': 56,\r\n\t    '21': 54,\r\n\t    '20': 51,\r\n\t    '19': 48,\r\n\t    '18': 46,\r\n\t    '17': 43,\r\n\t    '16': 41,\r\n\t    '15': 38,\r\n\t    '14': 36,\r\n\t    '13': 33,\r\n\t    '12': 31,\r\n\t    '11': 28,\r\n\t    '10': 26,\r\n\t    '9': 23,\r\n\t    '8': 20,\r\n\t    '7': 18,\r\n\t    '6': 15,\r\n\t    '5': 13,\r\n\t    '4': 10,\r\n\t    '3': 8,\r\n\t    '2': 5,\r\n\t    '1': 3,\r\n\t    '0': 0,\r\n\t};\r\n\tconst shortenMap = {\r\n\t    '#f0ffff': 'azure',\r\n\t    '#f5f5dc': 'beige',\r\n\t    '#ffe4c4': 'bisque',\r\n\t    '#a52a2a': 'brown',\r\n\t    '#ff7f50': 'coral',\r\n\t    '#ffd700': 'gold',\r\n\t    '#808080': 'gray',\r\n\t    '#008000': 'green',\r\n\t    '#4b0082': 'indigo',\r\n\t    '#fffff0': 'ivory',\r\n\t    '#f0e68c': 'khaki',\r\n\t    '#faf0e6': 'linen',\r\n\t    '#800000': 'maroon',\r\n\t    '#000080': 'navy',\r\n\t    '#808000': 'olive',\r\n\t    '#ffa500': 'orange',\r\n\t    '#da70d6': 'orchid',\r\n\t    '#cd853f': 'peru',\r\n\t    '#ffc0cb': 'pink',\r\n\t    '#dda0dd': 'plum',\r\n\t    '#800080': 'purple',\r\n\t    '#f00': 'red',\r\n\t    '#fa8072': 'salmon',\r\n\t    '#a0522d': 'sienna',\r\n\t    '#c0c0c0': 'silver',\r\n\t    '#fffafa': 'snow',\r\n\t    '#d2b48c': 'tan',\r\n\t    '#008080': 'teal',\r\n\t    '#ff6347': 'tomato',\r\n\t    '#ee82ee': 'violet',\r\n\t    '#f5deb3': 'wheat',\r\n\t};\r\n\tconst shortenReg = new RegExp(`(?:${Object.keys(shortenMap).join('|')})(?=[^0-9a-f]|$)`, 'gi');\r\n\tconst formatColor = (rgba, str, digit) => {\r\n\t    const color = parseColor(str, digit);\r\n\t    let s = color.origin;\r\n\t    if (color.valid) {\r\n\t        if (color.a < 1) {\r\n\t            if (rgba) {\r\n\t                s = `#${operateHex(color.r)}${operateHex(color.g)}${operateHex(color.b)}${ramda.has(`${color.a * Hundred}`, alphaMap$1) ? operateHex(alphaMap$1[`${color.a * Hundred}`]) : operateHex(Math.round(color.a * FF))}`;\r\n\t            }\r\n\t            else {\r\n\t                if (color.r === 0 && color.g === 0 && color.b === 0 && color.a === 0) {\r\n\t                    s = 'transparent';\r\n\t                }\r\n\t                else {\r\n\t                    const hslColor = rgb2hsl(color);\r\n\t                    const alpha = shortenAlpha(digit, color.a);\r\n\t                    const rgb = `rgb(${color.r},${color.g},${color.b},${alpha})`;\r\n\t                    const hsl = `hsl(${hslColor.h},${hslColor.s}%,${hslColor.l}%,${alpha})`;\r\n\t                    s = getShorter(rgb, hsl);\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t        else {\r\n\t            s = `#${operateHex(color.r)}${operateHex(color.g)}${operateHex(color.b)}`;\r\n\t        }\r\n\t        s = s.replace(/#([0-9a-f])\\1([0-9a-f])\\2([0-9a-f])\\3(?=[^0-9a-f]|$)/gi, '#$1$2$3');\r\n\t        s = s.replace(shortenReg, ($0) => `${shortenMap[$0]}`);\r\n\t        if (rgba) {\r\n\t            s = s.replace(/#([0-9a-f])\\1([0-9a-f])\\2([0-9a-f])\\3([0-9a-f])\\4(?=[^0-9a-f]|$)/gi, '#$1$2$3$4');\r\n\t            s = s.replace(/^transparent$/i, '#0000');\r\n\t        }\r\n\t    }\r\n\t    // 如果处理后结果不理想，还返回原始字符串\r\n\t    if (s.length > color.origin.length) {\r\n\t        return color.origin;\r\n\t    }\r\n\t    return s;\r\n\t};\r\n\tconst shortenColor = async (dom, { option: { rrggbbaa, }, params: { opacityDigit, }, }) => new Promise(resolve => {\r\n\t    const digit = Math.min(opacityDigit, OPACITY_DIGIT);\r\n\t    dom.querySelectorAll(svgVdom.NodeType.Tag).forEach(node => {\r\n\t        node.attributes.forEach(attr => {\r\n\t            if (regularAttr[attr.fullname].maybeColor) {\r\n\t                attr.value = formatColor(rrggbbaa, attr.value, digit);\r\n\t            }\r\n\t            else if (attr.fullname === 'style') {\r\n\t                const styleList = parseStyle(attr.value);\r\n\t                styleList.forEach(s => {\r\n\t                    if (regularAttr[s.fullname].maybeColor) {\r\n\t                        s.value = formatColor(rrggbbaa, s.value, digit);\r\n\t                    }\r\n\t                });\r\n\t                attr.value = stringifyStyle(styleList);\r\n\t            }\r\n\t        });\r\n\t    });\r\n\t    if (dom.stylesheet) {\r\n\t        // 缩短 style 标签内的颜色\r\n\t        const parsedCss = dom.stylesheet.stylesheet;\r\n\t        traversalObj(ramda.both(ramda.has('property'), ramda.has('value')), (cssRule) => {\r\n\t            if (regularAttr[cssRule.property].maybeColor) { // 可能为颜色的属性\r\n\t                cssRule.value = formatColor(rrggbbaa, cssRule.value, digit);\r\n\t            }\r\n\t        }, parsedCss.rules);\r\n\t    }\r\n\t    resolve();\r\n\t});\n\n\t// 移除掉正、负号前面的逗号，移除掉0.前面的0，移除掉.1,.1或e1,.1这种case中间的逗号\r\n\tconst doShorten = ramda.curry((digit, val) => shortenNumberList(val.replace(numberGlobal, s => `${shortenNumber(toFixed(digit, parseFloat(s)))}`)));\r\n\tconst shortenDecimalDigits = async (dom, { params: { sizeDigit, angelDigit, opacityDigit, } }) => new Promise(resolve => {\r\n\t    const fuzzyDigit = doShorten(sizeDigit);\r\n\t    const accurateDigit = doShorten(angelDigit);\r\n\t    const shortenValue = (key, value) => {\r\n\t        const define = regularAttr[key];\r\n\t        if (define.maybeAlpha) { // alpha 值采用特殊处理逻辑\r\n\t            const alpha = parseAlpha(value);\r\n\t            if (typeof alpha === 'number') {\r\n\t                return shortenAlpha(opacityDigit, alpha);\r\n\t            }\r\n\t        }\r\n\t        else if (define.maybeSizeNumber) { // 可以模糊处理的数字\r\n\t            return fuzzyDigit(value);\r\n\t        }\r\n\t        else if (define.maybeAccurateNumber) { // 需要较精确的数字\r\n\t            return accurateDigit(value);\r\n\t        }\r\n\t        return value;\r\n\t    };\r\n\t    if (dom.stylesheet) {\r\n\t        // 缩短 style 标签内的数值\r\n\t        const parsedCss = dom.stylesheet.stylesheet;\r\n\t        traversalObj(ramda.both(ramda.has('property'), ramda.has('value')), (cssRule) => {\r\n\t            cssRule.value = shortenValue(cssRule.property, cssRule.value);\r\n\t        }, parsedCss.rules);\r\n\t    }\r\n\t    dom.querySelectorAll(svgVdom.NodeType.Tag).forEach(node => {\r\n\t        // 先取出来 attributeName 属性\r\n\t        const attributeName = node.getAttribute('attributeName');\r\n\t        // 缩短节点属性的数值\r\n\t        node.attributes.forEach(attr => {\r\n\t            numberGlobal.lastIndex = 0;\r\n\t            if (animationAttributes.includes(attr.fullname) && animationAttrElements.includes(node.nodeName)) { // 动画处理的属性，需要根据 attributeName 属性判断\r\n\t                if (attributeName) {\r\n\t                    attr.value = shortenValue(attributeName, attr.value);\r\n\t                }\r\n\t            }\r\n\t            else if (attr.fullname === 'style') { // css 样式处理，和属性类似\r\n\t                const styleList = parseStyle(attr.value);\r\n\t                styleList.forEach(s => {\r\n\t                    numberGlobal.lastIndex = 0;\r\n\t                    s.value = shortenValue(s.fullname, s.value);\r\n\t                });\r\n\t                attr.value = stringifyStyle(styleList);\r\n\t            }\r\n\t            else {\r\n\t                attr.value = shortenValue(attr.fullname, attr.value);\r\n\t            }\r\n\t        });\r\n\t    });\r\n\t    resolve();\r\n\t});\n\n\tconst checkSub = (node, IDList, isDefs = false) => {\r\n\t    let hasId = false;\r\n\t    if (!isDefs) {\r\n\t        const id = node.getAttribute('id');\r\n\t        if (id) {\r\n\t            if (IDList[id]) {\r\n\t                hasId = true;\r\n\t                IDList[id].tag = node;\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    if (!hasId) {\r\n\t        for (let ci = node.childNodes.length; ci--;) {\r\n\t            const childNode = node.childNodes[ci];\r\n\t            if (isTag(childNode)) {\r\n\t                checkSub(childNode, IDList);\r\n\t            }\r\n\t            else {\r\n\t                childNode.remove();\r\n\t            }\r\n\t        }\r\n\t        if (!node.childNodes.length) {\r\n\t            node.remove();\r\n\t        }\r\n\t        else if (!isDefs) {\r\n\t            node.parentNode.replaceChild(node.childNodes, node);\r\n\t        }\r\n\t    }\r\n\t};\r\n\tconst checkDefsApply = (item, dom) => {\r\n\t    const [node, attrName] = item.iri[0];\r\n\t    // 只有 href 和 xlink:href 才能应用\r\n\t    if (attrName !== 'href' && attrName !== 'xlink:href') {\r\n\t        return;\r\n\t    }\r\n\t    switch (node.nodeName) {\r\n\t        case 'use': {\r\n\t            // TODO 有 x 和 y 的暂不做应用（实际效果应该相当于 translate，待验证）\r\n\t            if (node.hasAttribute('x') || node.hasAttribute('y')) {\r\n\t                return;\r\n\t            }\r\n\t            // 具有 viewport ，且 use 定义了宽高，不进行应用\r\n\t            if (['svg', 'symbol'].includes(item.tag.nodeName) && (node.hasAttribute('width') || node.hasAttribute('height'))) {\r\n\t                return;\r\n\t            }\r\n\t            const originStyle = {};\r\n\t            const originAttr = {};\r\n\t            for (const [key, val] of Object.entries(node.styles)) {\r\n\t                // 如果 use 元素被 style 命中，不能进行应用\r\n\t                if (val.from === 'styletag') {\r\n\t                    return;\r\n\t                }\r\n\t                if (val.from === 'attr') {\r\n\t                    originAttr[key] = val.value;\r\n\t                }\r\n\t                if (val.from === 'inline') {\r\n\t                    originStyle[key] = val.value;\r\n\t                }\r\n\t            }\r\n\t            const useTag = item.tag;\r\n\t            node.parentNode.replaceChild(useTag, node);\r\n\t            const styleList = useTag.hasAttribute('style') ? parseStyle(useTag.getAttribute('style')) : [];\r\n\t            for (const [key, val] of Object.entries(originAttr)) {\r\n\t                if (!useTag.hasAttribute(key) && !styleList.some(sItem => sItem.fullname === key)) {\r\n\t                    useTag.setAttribute(key, val);\r\n\t                }\r\n\t            }\r\n\t            for (const [key, val] of Object.entries(originStyle)) {\r\n\t                if (!useTag.hasAttribute(key) && !styleList.some(sItem => sItem.fullname === key)) {\r\n\t                    styleList.push({\r\n\t                        name: key,\r\n\t                        fullname: key,\r\n\t                        value: val,\r\n\t                    });\r\n\t                }\r\n\t            }\r\n\t            if (styleList.length) {\r\n\t                useTag.setAttribute('style', stringifyStyle(styleList));\r\n\t            }\r\n\t            return;\r\n\t        }\r\n\t        case 'mpath': {\r\n\t            const pathTag = item.tag;\r\n\t            const mpathParent = node.parentNode;\r\n\t            if (!shapeElements.includes(pathTag.nodeName)) {\r\n\t                node.remove();\r\n\t                pathTag.remove();\r\n\t                if (!checkAnimateMotion(mpathParent, dom)) {\r\n\t                    mpathParent.remove();\r\n\t                }\r\n\t                return;\r\n\t            }\r\n\t            // 只针对路径元素进行应用\r\n\t            if (pathTag.nodeName === 'path') {\r\n\t                const d = pathTag.getAttribute('d');\r\n\t                if (d) {\r\n\t                    mpathParent.setAttribute('path', d);\r\n\t                    node.remove();\r\n\t                    pathTag.remove();\r\n\t                }\r\n\t            }\r\n\t            return;\r\n\t        }\r\n\t    }\r\n\t};\r\n\tconst shortenDefs = async (dom) => new Promise(resolve => {\r\n\t    let firstDefs;\r\n\t    // 首先合并 defs 标签\r\n\t    dom.querySelectorAll('defs').forEach(node => {\r\n\t        if (firstDefs) {\r\n\t            firstDefs.appendChild(node.childNodes.filter(isTag));\r\n\t            node.remove();\r\n\t        }\r\n\t        else {\r\n\t            firstDefs = node;\r\n\t            for (let ci = node.childNodes.length; ci--;) {\r\n\t                const childNode = node.childNodes[ci];\r\n\t                // 只保留标签类的子元素\r\n\t                if (!isTag(childNode)) {\r\n\t                    childNode.remove();\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t    });\r\n\t    if (firstDefs) {\r\n\t        // 取出所有被引用的 ID\r\n\t        const IDList = {};\r\n\t        dom.querySelectorAll(isTag).forEach(node => {\r\n\t            node.attributes.forEach(attr => {\r\n\t                if (regularAttr[attr.fullname].maybeFuncIRI) {\r\n\t                    const firi = funcIRIToID.exec(attr.value);\r\n\t                    if (firi) {\r\n\t                        if (!IDList[firi[2]]) {\r\n\t                            IDList[firi[2]] = {\r\n\t                                iri: [],\r\n\t                            };\r\n\t                        }\r\n\t                        IDList[firi[2]].iri.push([node, attr.fullname]);\r\n\t                    }\r\n\t                }\r\n\t                else if (regularAttr[attr.fullname].maybeIRI) {\r\n\t                    const iri = IRIFullMatch.exec(attr.value);\r\n\t                    if (iri) {\r\n\t                        if (!IDList[iri[1]]) {\r\n\t                            IDList[iri[1]] = {\r\n\t                                iri: [],\r\n\t                            };\r\n\t                        }\r\n\t                        IDList[iri[1]].iri.push([node, attr.fullname]);\r\n\t                    }\r\n\t                }\r\n\t            });\r\n\t        });\r\n\t        checkSub(firstDefs, IDList, true);\r\n\t        parseStyleTree(dom);\r\n\t        Object.values(IDList).forEach(item => {\r\n\t            if (item.tag) {\r\n\t                // 有可能引用对象存在于 defs 内部，并且已被移除\r\n\t                for (let i = item.iri.length; i--;) {\r\n\t                    const [tag] = item.iri[i];\r\n\t                    // 判断是否已从文档中移除\r\n\t                    if (!tag.closest(svgVdom.NodeType.Document)) {\r\n\t                        item.iri.splice(i, 1);\r\n\t                    }\r\n\t                }\r\n\t                if (!item.iri.length) {\r\n\t                    item.tag.remove();\r\n\t                }\r\n\t                if (item.iri.length === 1) {\r\n\t                    checkDefsApply(item, dom);\r\n\t                }\r\n\t            }\r\n\t        });\r\n\t        // 当 defs 没有子元素后，进行移除\r\n\t        if (!firstDefs.childNodes.length) {\r\n\t            firstDefs.remove();\r\n\t        }\r\n\t    }\r\n\t    resolve();\r\n\t});\n\n\tconst feFuncAttr = ['tableValues', 'slope', 'intercept', 'amplitude', 'exponent', 'offset'];\r\n\tconst feTypeNeed = {\r\n\t    identity: [],\r\n\t    table: ['tableValues'],\r\n\t    discrete: ['tableValues'],\r\n\t    linear: ['slope', 'intercept'],\r\n\t    gamma: ['amplitude', 'exponent', 'offset'],\r\n\t};\r\n\tconst checkFeAttrs = (type, rmAttrs) => {\r\n\t    if (hasProp(feTypeNeed, type)) {\r\n\t        feTypeNeed[type].forEach(val => {\r\n\t            const index = rmAttrs.indexOf(val);\r\n\t            if (index !== -1) {\r\n\t                rmAttrs.splice(index, 1);\r\n\t            }\r\n\t        });\r\n\t    }\r\n\t};\r\n\tconst shortenFilter = async (dom) => new Promise(resolve => {\r\n\t    const filterTags = dom.querySelectorAll(['filter'].concat(filterPrimitiveElements, transferFunctionElements).join(','));\r\n\t    filterTags.forEach(node => {\r\n\t        if (filterPrimitiveElements.includes(node.nodeName) || node.nodeName === 'filter') {\r\n\t            const width = node.getAttribute('width');\r\n\t            const height = node.getAttribute('height');\r\n\t            // 滤镜元素的 region 尺寸必须合法\r\n\t            if ((width && parseFloat(width) <= 0) || (height && parseFloat(height) <= 0)) {\r\n\t                node.remove();\r\n\t                return;\r\n\t            }\r\n\t        }\r\n\t        // filter 没有子元素没有意义\r\n\t        if (node.nodeName === 'filter') {\r\n\t            let hasFilterSub = false;\r\n\t            node.childNodes.forEach(subNode => {\r\n\t                if (filterPrimitiveElements.includes(subNode.nodeName)) {\r\n\t                    hasFilterSub = true;\r\n\t                }\r\n\t            });\r\n\t            if (!hasFilterSub) {\r\n\t                node.remove();\r\n\t                return;\r\n\t            }\r\n\t        }\r\n\t        // feComponentTransfer 的同一个类型的 transferFunctionElement 子元素不允许多次出现\r\n\t        if (node.nodeName === 'feComponentTransfer') {\r\n\t            const funcUnique = new Set();\r\n\t            for (let i = node.childNodes.length; i--;) {\r\n\t                const childNode = node.childNodes[i];\r\n\t                if (funcUnique.has(childNode.nodeName)) {\r\n\t                    childNode.remove();\r\n\t                    continue;\r\n\t                }\r\n\t                if (transferFunctionElements.includes(childNode.nodeName)) {\r\n\t                    funcUnique.add(childNode.nodeName);\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t        // transferFunctionElement 不同的 type 所需的属性不一样，其它不必要的属性都可以删掉\r\n\t        // https://drafts.fxtf.org/filter-effects/#element-attrdef-fecomponenttransfer-type\r\n\t        if (transferFunctionElements.includes(node.nodeName)) {\r\n\t            const type = node.getAttribute('type') || '';\r\n\t            const animateAttrs = getAnimateAttr(node).filter(item => item.attributeName === 'type');\r\n\t            if (!type && !animateAttrs.length) {\r\n\t                node.remove();\r\n\t                return;\r\n\t            }\r\n\t            const rmAttrs = feFuncAttr.slice();\r\n\t            // 保留当前 type 必备的属性\r\n\t            checkFeAttrs(type, rmAttrs);\r\n\t            // 遍历并保留每一个 animate type 的必备属性\r\n\t            animateAttrs.forEach(item => {\r\n\t                item.values.forEach(val => {\r\n\t                    checkFeAttrs(val, rmAttrs);\r\n\t                });\r\n\t            });\r\n\t            // 最后移除掉不必要的属性\r\n\t            rmAttrs.forEach(attr => {\r\n\t                node.removeAttribute(attr);\r\n\t            });\r\n\t        }\r\n\t    });\r\n\t    resolve();\r\n\t});\n\n\tconst idSelectorReg = /#([^,*#>+~:{\\s[.]+)/gi;\r\n\tconst style2value = ramda.pipe(stringifyStyle, shortenStyle);\r\n\tconst shortenID = async (dom) => new Promise(resolve => {\r\n\t    let si = 0;\r\n\t    const IDList = {};\r\n\t    const shorten = (node, attrname, key) => {\r\n\t        if (hasProp(IDList, key)) {\r\n\t            IDList[key][1].push([node, attrname]);\r\n\t            return IDList[key][0];\r\n\t        }\r\n\t        const sid = createShortenID(si++);\r\n\t        IDList[key] = [sid, [[node, attrname]]];\r\n\t        return sid;\r\n\t    };\r\n\t    let cssRules;\r\n\t    // 取出 ID 选择器，并缩短\r\n\t    if (dom.stylesheet) {\r\n\t        cssRules = dom.stylesheet.stylesheet;\r\n\t        traversalObj(ramda.has('selectors'), (ruleItem) => {\r\n\t            const selectors = ruleItem.selectors;\r\n\t            if (selectors) {\r\n\t                selectors.forEach((selector, selectorIndex) => {\r\n\t                    selectors[selectorIndex] = selector.replace(idSelectorReg, (m, p) => `#${shorten(dom.styletag, null, p)}`);\r\n\t                });\r\n\t            }\r\n\t        }, cssRules.rules);\r\n\t    }\r\n\t    const tags = dom.querySelectorAll(svgVdom.NodeType.Tag);\r\n\t    // 第一次遍历取出所有被属性引用的 ID ，并缩短\r\n\t    tags.forEach(node => {\r\n\t        node.attributes.forEach(attr => {\r\n\t            if (regularAttr[attr.fullname].maybeFuncIRI) {\r\n\t                const firi = funcIRIToID.exec(attr.value);\r\n\t                if (firi) {\r\n\t                    attr.value = `url(#${shorten(node, attr.fullname, firi[2])})`;\r\n\t                }\r\n\t            }\r\n\t            else if (regularAttr[attr.fullname].maybeIRI) {\r\n\t                const iri = IRIFullMatch.exec(attr.value);\r\n\t                if (iri) {\r\n\t                    attr.value = `#${shorten(node, attr.fullname, iri[1])}`;\r\n\t                }\r\n\t            }\r\n\t            else if (attr.fullname === 'style') {\r\n\t                const styleList = parseStyle(attr.value);\r\n\t                styleList.forEach(styleItem => {\r\n\t                    if (regularAttr[styleItem.fullname].maybeFuncIRI) {\r\n\t                        const firi = funcIRIToID.exec(styleItem.value);\r\n\t                        if (firi) {\r\n\t                            styleItem.value = `url(#${shorten(node, `style|${styleItem.fullname}`, firi[2])})`;\r\n\t                        }\r\n\t                    }\r\n\t                });\r\n\t                attr.value = style2value(styleList);\r\n\t            }\r\n\t        });\r\n\t    });\r\n\t    // 第二次遍历，找到被引用的 ID ，替换为缩短后的值\r\n\t    tags.forEach(node => {\r\n\t        const ID = node.getAttribute('id');\r\n\t        if (ID !== null) {\r\n\t            if (hasProp(IDList, ID)) {\r\n\t                const id = IDList[ID][0];\r\n\t                delete IDList[ID];\r\n\t                node.setAttribute('id', id);\r\n\t            }\r\n\t            else {\r\n\t                node.removeAttribute('id');\r\n\t            }\r\n\t        }\r\n\t    }, dom);\r\n\t    // 最后移除不存在的 ID 引用\r\n\t    Object.values(IDList).forEach(item => {\r\n\t        for (const [node, attrName] of item[1]) {\r\n\t            if (typeof attrName === 'string') {\r\n\t                if (attrName.startsWith('style|')) {\r\n\t                    const styleList = parseStyle(node.getAttribute('style')).filter(styleItem => styleItem.fullname !== attrName.slice(6));\r\n\t                    if (styleList.length) {\r\n\t                        node.setAttribute('style', style2value(styleList));\r\n\t                    }\r\n\t                    else {\r\n\t                        node.removeAttribute('style');\r\n\t                    }\r\n\t                }\r\n\t                else {\r\n\t                    node.removeAttribute(attrName);\r\n\t                }\r\n\t            }\r\n\t            else {\r\n\t                const reg = new RegExp(`#${item[0]}(?=[,\\\\*#>+~:{\\\\s\\\\[\\\\.]|$)`);\r\n\t                traversalObj(ramda.has('selectors'), (ruleItem, path) => {\r\n\t                    const selectors = ruleItem.selectors;\r\n\t                    if (selectors) {\r\n\t                        for (let i = selectors.length; i--;) {\r\n\t                            if (reg.test(selectors[i])) {\r\n\t                                selectors.splice(i, 1);\r\n\t                            }\r\n\t                        }\r\n\t                        if (!selectors.length) {\r\n\t                            const parent = path[path.length - 1];\r\n\t                            parent.splice(parent.indexOf(ruleItem), 1);\r\n\t                        }\r\n\t                    }\r\n\t                }, cssRules.rules);\r\n\t            }\r\n\t        }\r\n\t    });\r\n\t    resolve();\r\n\t});\n\n\tconst startWithNumber = new RegExp(`^(${numberPattern})`);\r\n\tconst notNone = ramda.complement(ramda.equals('none'));\r\n\tconst formatRect = (node) => {\r\n\t    let width = getAttr(node, 'width', '0');\r\n\t    let height = getAttr(node, 'height', '0');\r\n\t    const widthExec = startWithNumber.exec(width);\r\n\t    const heightExec = startWithNumber.exec(height);\r\n\t    // 如果 width 或 height 不合规范，直接移除\r\n\t    if (!widthExec || !heightExec || +widthExec[1] <= 0 || +heightExec[1] <= 0) {\r\n\t        node.nodeName = 'remove';\r\n\t        return;\r\n\t    }\r\n\t    // 如果 rx 或 ry 存在，不能转换为 path\r\n\t    const rx = getAttr(node, 'rx', 'auto');\r\n\t    const ry = getAttr(node, 'ry', 'auto');\r\n\t    // rx 和 ry 相同，移除 ry\r\n\t    if (rx === ry || ry === 'auto') {\r\n\t        rmAttrs(node, ['ry']);\r\n\t    }\r\n\t    if (rx === 'auto') {\r\n\t        rmAttrs(node, ['rx']);\r\n\t    }\r\n\t    const rxExec = startWithNumber.exec(rx);\r\n\t    const ryExec = startWithNumber.exec(ry);\r\n\t    if (rxExec && +rxExec[1] > 0 && (!ryExec || +ryExec[1] !== 0)) {\r\n\t        return;\r\n\t    }\r\n\t    if (ryExec && +ryExec[1] > 0 && (!rxExec || +rxExec[1] !== 0)) {\r\n\t        return;\r\n\t    }\r\n\t    let x = getAttr(node, 'x', '0');\r\n\t    let y = getAttr(node, 'y', '0');\r\n\t    // 如果不是 px 单位，不能转换为 path\r\n\t    if (!pureNumOrWithPx.test(width) || !pureNumOrWithPx.test(height) || !pureNumOrWithPx.test(x) || !pureNumOrWithPx.test(y)) {\r\n\t        return;\r\n\t    }\r\n\t    // 如果被依赖了标签选择器的样式命中，不能进行转化\r\n\t    if (checkTypeSelector(node)) {\r\n\t        return;\r\n\t    }\r\n\t    rmAttrs(node, ['x', 'y', 'width', 'height', 'rx', 'ry']);\r\n\t    width = shortenNumber(+widthExec[1]);\r\n\t    height = shortenNumber(+heightExec[1]);\r\n\t    x = shortenNumber(+x.replace('px', ''));\r\n\t    y = shortenNumber(+y.replace('px', ''));\r\n\t    node.nodeName = 'path';\r\n\t    // 此处考虑到宽和高的字节数差异，应该取较小的那种\r\n\t    const hvh = shortenNumberList(`M${x},${y}h${width}v${height}h-${width}z`);\r\n\t    const vhv = shortenNumberList(`M${x},${y}v${height}h${width}v-${height}z`);\r\n\t    node.setAttribute('d', getShorter(hvh, vhv));\r\n\t};\r\n\tconst formatLine = (node) => {\r\n\t    const strokeWidth = getAttr(node, 'stroke-width', '1');\r\n\t    const swExec = startWithNumber.exec(strokeWidth);\r\n\t    const animateAttrs = getAnimateAttr(node);\r\n\t    // 是否存在 marker 引用\r\n\t    const hasMarker = getAttr(node, 'marker-start', 'none') !== 'none'\r\n\t        || getAttr(node, 'marker-mid', 'none') !== 'none'\r\n\t        || getAttr(node, 'marker-end', 'none') !== 'none'\r\n\t        || checkAnimateAttr(animateAttrs, 'marker-start', notNone)\r\n\t        || checkAnimateAttr(animateAttrs, 'marker-mid', notNone)\r\n\t        || checkAnimateAttr(animateAttrs, 'marker-end', notNone);\r\n\t    // 是否存在 stroke\r\n\t    const hasStroke = (getAttr(node, 'stroke', 'none') !== 'none' || checkAnimateAttr(animateAttrs, 'stroke', notNone)) && (strokeWidth !== '0' || checkAnimateAttr(animateAttrs, 'stroke-width', ramda.complement(ramda.equals('0'))));\r\n\t    // 如果 stroke 或 stroke-width 不合规范，直接移除\r\n\t    if (!hasMarker && (!hasStroke || !swExec || +swExec[1] <= 0)) {\r\n\t        node.nodeName = 'remove';\r\n\t        return;\r\n\t    }\r\n\t    const shapeAttr = {\r\n\t        x1: '0',\r\n\t        y1: '0',\r\n\t        x2: '0',\r\n\t        y2: '0',\r\n\t    };\r\n\t    Object.keys(shapeAttr).forEach(key => {\r\n\t        const value = node.getAttribute(key);\r\n\t        if (value && startWithNumber.test(value)) {\r\n\t            shapeAttr[key] = value;\r\n\t        }\r\n\t    });\r\n\t    // 是否存在 stroke-linecap\r\n\t    const hasStrokeCap = getAttr(node, 'stroke-linecap', 'butt') !== 'butt' || checkAnimateAttr(animateAttrs, 'stroke-linecap', ramda.complement(ramda.equals('butt')));\r\n\t    // 如果没有发生移动，直接移除\r\n\t    if (shapeAttr.x1 === shapeAttr.x2 && shapeAttr.y1 === shapeAttr.y2 && !hasMarker && (!hasStroke || !hasStrokeCap)) {\r\n\t        node.nodeName = 'remove';\r\n\t        return;\r\n\t    }\r\n\t    // 如果被依赖了标签选择器的样式命中，不能进行转化\r\n\t    if (checkTypeSelector(node)) {\r\n\t        return;\r\n\t    }\r\n\t    // 如果不是 px 单位，不能转换为 path\r\n\t    if (pureNumOrWithPx.test(shapeAttr.x1) && pureNumOrWithPx.test(shapeAttr.y1) && pureNumOrWithPx.test(shapeAttr.x2) && pureNumOrWithPx.test(shapeAttr.y2)) {\r\n\t        node.nodeName = 'path';\r\n\t        rmAttrs(node, ['x1', 'y1', 'x2', 'y2']);\r\n\t        node.setAttribute('d', shortenNumberList(`M${+shapeAttr.x1},${+shapeAttr.y1},${+shapeAttr.x2},${+shapeAttr.y2}`));\r\n\t    }\r\n\t};\r\n\tconst formatPoly = (thinning, mergePoint, node, addZ) => {\r\n\t    let d = '';\r\n\t    if (node.hasAttribute('points')) {\r\n\t        let points = parseNumberList(node.getAttribute('points'));\r\n\t        const animateAttrs = getAnimateAttr(node);\r\n\t        // 是否存在 marker 引用\r\n\t        const hasMarker = getAttr(node, 'marker-start', 'none') !== 'none'\r\n\t            || getAttr(node, 'marker-mid', 'none') !== 'none'\r\n\t            || getAttr(node, 'marker-end', 'none') !== 'none'\r\n\t            || checkAnimateAttr(animateAttrs, 'marker-start', notNone)\r\n\t            || checkAnimateAttr(animateAttrs, 'marker-mid', notNone)\r\n\t            || checkAnimateAttr(animateAttrs, 'marker-end', notNone);\r\n\t        // 是否存在 stroke\r\n\t        const hasStroke = (getAttr(node, 'stroke', 'none') !== 'none' || checkAnimateAttr(animateAttrs, 'stroke', notNone)) && (getAttr(node, 'stroke-width', '1') !== '0' || checkAnimateAttr(animateAttrs, 'stroke-width', ramda.complement(ramda.equals('0'))));\r\n\t        // 是否存在 stroke-linecap\r\n\t        const hasStrokeCap = getAttr(node, 'stroke-linecap', 'butt') !== 'butt' || checkAnimateAttr(animateAttrs, 'stroke-linecap', ramda.complement(ramda.equals('butt')));\r\n\t        if (points.length % 2 === 1) {\r\n\t            points.pop();\r\n\t        }\r\n\t        if (thinning) {\r\n\t            points = douglasPeucker(thinning, points);\r\n\t        }\r\n\t        // 存在合并相邻节点规则\r\n\t        if (mergePoint) {\r\n\t            // doCompute 必须执行\r\n\t            points = doMerge(mergePoint, points);\r\n\t        }\r\n\t        // 如果被依赖了标签选择器的样式命中，不能进行转化\r\n\t        if (checkTypeSelector(node)) {\r\n\t            node.setAttribute('points', shortenNumberList(`${points.map(shortenNumber).join(',')}`));\r\n\t            return;\r\n\t        }\r\n\t        else {\r\n\t            // 有两个以上节点，或者具有 marker 或者是具有 stroke-linecap 的 polygon\r\n\t            if (points.length > 2 || hasMarker || (hasStroke && hasStrokeCap && addZ)) {\r\n\t                d = shortenNumberList(`M${points.map(shortenNumber).join(',')}`);\r\n\t                if (addZ) {\r\n\t                    d += 'z';\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    if (d) {\r\n\t        node.nodeName = 'path';\r\n\t        node.removeAttribute('points');\r\n\t        node.setAttribute('d', d);\r\n\t    }\r\n\t    else {\r\n\t        // 没有节点或者没有 points 属性，直接移除当前 node\r\n\t        node.nodeName = 'remove';\r\n\t    }\r\n\t};\r\n\tconst ellipseToCircle = (node, r) => {\r\n\t    node.nodeName = 'circle';\r\n\t    node.setAttribute('r', r.replace(numberGlobal, s => shortenNumber(+s)));\r\n\t    rmAttrs(node, ['rx', 'ry']);\r\n\t};\r\n\tconst formatEllipse = (node) => {\r\n\t    let rx = getAttr(node, 'rx', 'auto');\r\n\t    let ry = getAttr(node, 'ry', 'auto');\r\n\t    if (rx === 'auto') {\r\n\t        rx = ry;\r\n\t    }\r\n\t    if (ry === 'auto') {\r\n\t        ry = rx;\r\n\t    }\r\n\t    const rxExec = startWithNumber.exec(rx);\r\n\t    const ryExec = startWithNumber.exec(ry);\r\n\t    // 如果 rx 或 ry 不合规范，直接移除\r\n\t    if (!rxExec || !ryExec || +rxExec[1] <= 0 || +ryExec[1] <= 0) {\r\n\t        node.nodeName = 'remove';\r\n\t        return;\r\n\t    }\r\n\t    // 如果被依赖了标签选择器的样式命中，不能进行转化\r\n\t    if (rx === ry && !checkTypeSelector(node)) {\r\n\t        ellipseToCircle(node, rx);\r\n\t    }\r\n\t};\r\n\tconst formatCircle = (node) => {\r\n\t    const r = getAttr(node, 'r', '');\r\n\t    const rExec = startWithNumber.exec(r);\r\n\t    if (!rExec || +rExec[1] <= 0) {\r\n\t        node.nodeName = 'remove';\r\n\t    }\r\n\t};\r\n\tconst shortenShape = async (dom, { params: { thinning, mergePoint, } }) => new Promise(resolve => {\r\n\t    parseStyleTree(dom);\r\n\t    const shapes = dom.querySelectorAll(shapeElements.join(','));\r\n\t    shapes.forEach(node => {\r\n\t        const cloneNode = node.cloneNode();\r\n\t        cloneNode.styles = node.styles;\r\n\t        switch (node.nodeName) {\r\n\t            case 'rect':\r\n\t                formatRect(cloneNode);\r\n\t                break;\r\n\t            case 'line':\r\n\t                formatLine(cloneNode);\r\n\t                break;\r\n\t            case 'polyline':\r\n\t                formatPoly(thinning, mergePoint, cloneNode, false);\r\n\t                break;\r\n\t            case 'polygon':\r\n\t                formatPoly(thinning, mergePoint, cloneNode, true);\r\n\t                break;\r\n\t            case 'ellipse':\r\n\t                formatEllipse(cloneNode);\r\n\t                break;\r\n\t            case 'circle':\r\n\t                formatCircle(cloneNode);\r\n\t                break;\r\n\t            default:\r\n\t                // 路径只要判断 d 属性是否存在即可\r\n\t                cloneNode.nodeName = node.getAttribute('d') ? 'notneed' : 'remove';\r\n\t                break;\r\n\t        }\r\n\t        if (cloneNode.nodeName === 'remove') {\r\n\t            node.remove();\r\n\t        }\r\n\t        else if (cloneNode.toString().length <= node.toString().length) {\r\n\t            Object.assign(node, cloneNode);\r\n\t        }\r\n\t    }, dom);\r\n\t    resolve();\r\n\t});\n\n\t// 属性转 style 的临界值\r\n\tconst STYLE_LEN = 8;\r\n\tconst checkTrans = (attrObj) => {\r\n\t    let stylelen = STYLE_LEN;\r\n\t    Object.entries(attrObj).forEach(([key, val]) => {\r\n\t        // 如果不是需要追加 px 的情况，则长度可以缩短 2\r\n\t        if (!needUnitInStyle.includes(key) || !numberFullMatch.test(val.value) || +val.value === 0) {\r\n\t            stylelen -= 2;\r\n\t        }\r\n\t    });\r\n\t    return stylelen;\r\n\t};\r\n\tconst checkAttr$2 = (node, dom, browsers) => {\r\n\t    parseStyleTree(dom);\r\n\t    const attrObj = {}; // 存储所有样式和可以转为样式的属性\r\n\t    const tagDefine = regularTag[node.nodeName];\r\n\t    const nodeStyle = node.styles;\r\n\t    // 标记覆盖了 styletag 中的属性\r\n\t    // 逆序循环，并从后向前移除属性\r\n\t    for (let i = node.attributes.length; i--;) {\r\n\t        const attr = node.attributes[i];\r\n\t        const attrDefine = regularAttr[attr.fullname];\r\n\t        if (attr.fullname === 'style') {\r\n\t            const styleList = parseStyle(attr.value);\r\n\t            // 逆序循环，因为 CSS 的优先级是从后往前覆盖的\r\n\t            for (let si = styleList.length; si--;) {\r\n\t                const styleItem = styleList[si];\r\n\t                const styleDefine = regularAttr[styleItem.fullname];\r\n\t                // 标记一下是否存在不能和属性互转的样式\r\n\t                const onlyCss = (nodeStyle && nodeStyle[styleItem.fullname] && nodeStyle[styleItem.fullname].override) // 属性覆盖了 styletag\r\n\t                    ||\r\n\t                        (!styleDefine.couldBeStyle // 标记在常规属性列表中\r\n\t                            &&\r\n\t                                !checkGeometry(node.nodeName, styleItem.fullname, browsers) // 并且当前环境不支持 geo 属性转换\r\n\t                        )\r\n\t                    ||\r\n\t                        cantTrans(tagDefine, styleItem.fullname); // 某些特定元素属性不能放在 style 中\r\n\t                attrObj[styleItem.fullname] = {\r\n\t                    value: styleItem.value,\r\n\t                    fromStyle: true,\r\n\t                    onlyCss,\r\n\t                };\r\n\t            }\r\n\t        }\r\n\t        else if (attrDefine.couldBeStyle || checkGeometry(node.nodeName, attr.fullname, browsers)) {\r\n\t            if (cantTrans(tagDefine, attr.fullname)) { // 有一些元素的某些属性不能被转为 style，此类属性也不宜再按照 css 属性来验证\r\n\t                continue;\r\n\t            }\r\n\t            // 虽然这里没有移除逻辑了，但是此处不应出现覆盖 style 导致 bug 的问题\r\n\t            if (!hasProp(attrObj, attr.fullname)) {\r\n\t                attrObj[attr.fullname] = {\r\n\t                    value: attr.value,\r\n\t                };\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    return attrObj;\r\n\t};\r\n\tconst shortenStyleAttr = async (dom, { browsers, }) => new Promise(resolve => {\r\n\t    const tags = dom.querySelectorAll(svgVdom.NodeType.Tag);\r\n\t    tags.forEach(node => {\r\n\t        const attrObj = checkAttr$2(node, dom, browsers);\r\n\t        // [warning] svg 的样式覆盖规则是 style 属性 > style 标签 > 属性，所以以下代码可能导致不正确的样式覆盖！\r\n\t        // 如果存在只能放在 css 中的属性，则强制属性转 style @v1.5.0+\r\n\t        const transLen = checkTrans(attrObj);\r\n\t        if (Object.values(attrObj).some(val => val.onlyCss) || transLen < 0) {\r\n\t            // 属性转 style\r\n\t            Object.entries(attrObj).forEach(([key, val]) => {\r\n\t                if (!val.onlyCss) {\r\n\t                    node.removeAttribute(key);\r\n\t                }\r\n\t            });\r\n\t            // 执行一次 reverse 把顺序反转过来\r\n\t            node.setAttribute('style', styleToValue(Object.keys(attrObj).reverse().map(key => {\r\n\t                let value = attrObj[key].value;\r\n\t                // 特殊情况，转后需要追加 px 单位\r\n\t                if (needUnitInStyle.includes(key) && numberFullMatch.test(value) && +value !== 0) {\r\n\t                    value += 'px';\r\n\t                }\r\n\t                return {\r\n\t                    name: key,\r\n\t                    fullname: key,\r\n\t                    value,\r\n\t                };\r\n\t            })));\r\n\t        }\r\n\t        else {\r\n\t            // style 转属性\r\n\t            node.removeAttribute('style');\r\n\t            // 执行一次 reverse 把顺序反转过来\r\n\t            Object.keys(attrObj).reverse().forEach(name => {\r\n\t                let value = attrObj[name].value;\r\n\t                // 反转后可以移除 px 单位\r\n\t                if (needUnitInStyle.includes(name) && !numberFullMatch.test(value)) {\r\n\t                    value = value.replace(/(?<=\\d)px$/, '');\r\n\t                }\r\n\t                node.setAttribute(name, value);\r\n\t            });\r\n\t        }\r\n\t    });\r\n\t    resolve();\r\n\t});\n\n\tconst shortenStyleTag = async (dom, { params: { ignoreKnownCSS, }, }) => new Promise(resolve => {\r\n\t    if (dom.stylesheet) {\r\n\t        const cssRules = dom.stylesheet.stylesheet;\r\n\t        const selectorUnique = {};\r\n\t        const declareUnique = {};\r\n\t        for (let i = 0, l = cssRules.rules.length; i < l; i++) {\r\n\t            const styleRule = cssRules.rules[i];\r\n\t            // TODO 目前只针对顶层的规则类，其实还可以进一步优化\r\n\t            if (styleRule.type === 'rule') {\r\n\t                const theSelectors = styleRule.selectors;\r\n\t                const declarations = styleRule.declarations;\r\n\t                // 记录命中对象但存在无效属性的情况\r\n\t                const usedRule = new Set();\r\n\t                // 移除无效的选择器\r\n\t                for (let si = theSelectors.length; si--;) {\r\n\t                    const matchNodes = dom.querySelectorAll(svgVdom.parseSelector(theSelectors[si]));\r\n\t                    if (!matchNodes.length) {\r\n\t                        theSelectors.splice(si, 1);\r\n\t                    }\r\n\t                    else {\r\n\t                        let anyMatch = false;\r\n\t                        for (let mi = declarations.length; mi--;) {\r\n\t                            const ruleItem = declarations[mi];\r\n\t                            const property = ruleItem.property;\r\n\t                            const isImportant = importantReg.test(ruleItem.value);\r\n\t                            // 判断每一条属性与每一个命中元素的匹配情况\r\n\t                            if ((regularAttr[property].isUndef && knownCSS(property) && !ignoreKnownCSS)\r\n\t                                ||\r\n\t                                    matchNodes.some(matchNode => checkApply(regularAttr[property], matchNode, dom, true, isImportant))) {\r\n\t                                // 只要有一条匹配存在，就证明该选择器有效\r\n\t                                anyMatch = true;\r\n\t                                // 同时标记该属性有效\r\n\t                                usedRule.add(property);\r\n\t                            }\r\n\t                        }\r\n\t                        if (!anyMatch) {\r\n\t                            theSelectors.splice(si, 1);\r\n\t                        }\r\n\t                    }\r\n\t                }\r\n\t                // 验证属性的有效性，移除无效的属性\r\n\t                for (let ci = declarations.length; ci--;) {\r\n\t                    if (!usedRule.has(declarations[ci].property)) {\r\n\t                        declarations.splice(ci, 1);\r\n\t                    }\r\n\t                }\r\n\t                // 如果选择器列表经过筛选后为空，则移除该条规则\r\n\t                if (!theSelectors.length) {\r\n\t                    cssRules.rules.splice(i, 1);\r\n\t                    i--;\r\n\t                    l--;\r\n\t                    continue;\r\n\t                }\r\n\t                // 合并相同选择器\r\n\t                theSelectors.sort((a, b) => a < b ? -1 : 1);\r\n\t                styleRule.selectors = theSelectors.map(s => mixWhiteSpace(s.trim()));\r\n\t                const selectorKey = styleRule.selectors.join(',');\r\n\t                if (hasProp(selectorUnique, selectorKey)) {\r\n\t                    const uDeclarations = selectorUnique[selectorKey].declarations.concat(styleRule.declarations);\r\n\t                    // 合并之后依然要排重\r\n\t                    const declared = new Set();\r\n\t                    for (let j = uDeclarations.length; j--;) {\r\n\t                        const prop = uDeclarations[j].property;\r\n\t                        if (declared.has(prop)) {\r\n\t                            uDeclarations.splice(j, 1);\r\n\t                        }\r\n\t                        else {\r\n\t                            declared.add(prop);\r\n\t                        }\r\n\t                    }\r\n\t                    selectorUnique[selectorKey].declarations = uDeclarations;\r\n\t                    cssRules.rules.splice(i, 1);\r\n\t                    i--;\r\n\t                    l--;\r\n\t                    continue;\r\n\t                }\r\n\t                else {\r\n\t                    selectorUnique[selectorKey] = styleRule;\r\n\t                }\r\n\t                // 合并相同规则\r\n\t                styleRule.declarations.sort((a, b) => a.property < b.property ? -1 : 1);\r\n\t                const declareKey = styleRule.declarations.map((d) => `${d.property}:${d.value}`).join(';');\r\n\t                if (hasProp(declareUnique, declareKey)) {\r\n\t                    const selectors = declareUnique[declareKey].selectors.concat(styleRule.selectors);\r\n\t                    const selected = new Set();\r\n\t                    for (let j = selectors.length; j--;) {\r\n\t                        if (selected.has(selectors[j])) {\r\n\t                            selectors.splice(j, 1);\r\n\t                        }\r\n\t                        else {\r\n\t                            selected.add(selectors[j]);\r\n\t                        }\r\n\t                    }\r\n\t                    declareUnique[declareKey].selectors = selectors;\r\n\t                    cssRules.rules.splice(i, 1);\r\n\t                    i--;\r\n\t                    l--;\r\n\t                    continue;\r\n\t                }\r\n\t                else {\r\n\t                    declareUnique[declareKey] = styleRule;\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    resolve();\r\n\t});\n\n\t// eslint-disable-next-line @typescript-eslint/no-var-requires\r\n\tconst STYLE_THRESHOLD = 3;\r\n\tconst TRANSLATE_THRESHOLD = 10;\r\n\tconst createKey = (name, value, important) => {\r\n\t    let val = value;\r\n\t    if (needUnitInStyle.includes(name) && numberFullMatch.test(val) && +val !== 0) {\r\n\t        val += 'px';\r\n\t    }\r\n\t    return `${name}:${val}${important ? '!important' : ''}`;\r\n\t};\r\n\t// TODO：目前采用的是全字匹配的方案，是否可以考虑判断公共子序列（算法太复杂！）\r\n\tconst styleToClass = async (dom) => new Promise(resolve => {\r\n\t    parseStyleTree(dom);\r\n\t    let index = 0;\r\n\t    const tags = dom.querySelectorAll(svgVdom.NodeType.Tag);\r\n\t    const keyCache = {};\r\n\t    for (const tag of tags) {\r\n\t        const keys = [];\r\n\t        const tagStyle = tag.styles;\r\n\t        Object.keys(tagStyle).sort().forEach(k => {\r\n\t            if (tagStyle[k].from === 'inline' && !tagStyle[k].override) {\r\n\t                keys.push(createKey(k, tagStyle[k].value, tagStyle[k].important));\r\n\t            }\r\n\t        });\r\n\t        // 过短的样式没有必要抽取\r\n\t        if (keys.length >= STYLE_THRESHOLD) {\r\n\t            const key = keys.join(';');\r\n\t            if (!keyCache[key]) {\r\n\t                keyCache[key] = {\r\n\t                    className: `c${(+new Date + index).toString(36)}`,\r\n\t                    tags: [tag],\r\n\t                    keys,\r\n\t                };\r\n\t                index++;\r\n\t            }\r\n\t            else {\r\n\t                keyCache[key].tags.push(tag);\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    // 条件是 tags 和 keys 的乘积要大于 10\r\n\t    const caches = Object.entries(keyCache).filter(([, cache]) => cache.tags.length * cache.keys.length >= TRANSLATE_THRESHOLD);\r\n\t    if (caches.length) {\r\n\t        // 如果没有 style 标签，需要创建一个\r\n\t        let styleContent = '';\r\n\t        if (dom.stylesheet) {\r\n\t            styleContent = css.stringify(dom.stylesheet);\r\n\t        }\r\n\t        else {\r\n\t            const styleTag = new svgVdom.TagNode({\r\n\t                nodeName: 'style',\r\n\t                nodeType: svgVdom.NodeType.Tag,\r\n\t            });\r\n\t            const styleText = new svgVdom.TextNode({\r\n\t                nodeName: '#text',\r\n\t                nodeType: svgVdom.NodeType.CDATA,\r\n\t                textContent: '',\r\n\t            });\r\n\t            styleTag.appendChild(styleText);\r\n\t            const rootSVG = dom.querySelector('svg');\r\n\t            rootSVG.insertBefore(styleTag, rootSVG.childNodes[0]);\r\n\t            dom.styletag = styleTag;\r\n\t        }\r\n\t        for (const [key, val] of caches) {\r\n\t            // 创建样式\r\n\t            styleContent += `.${val.className}{${key}}`;\r\n\t            // 移除 style 属性中的对应样式\r\n\t            val.tags.forEach(tag => {\r\n\t                const styleAttr = tag.getAttribute('style');\r\n\t                const styleList = parseStyle(styleAttr);\r\n\t                for (let i = styleList.length; i--;) {\r\n\t                    if (val.keys.includes(createKey(styleList[i].fullname, styleList[i].value, styleList[i].important))) {\r\n\t                        styleList.splice(i, 1);\r\n\t                    }\r\n\t                }\r\n\t                if (styleList.length) {\r\n\t                    tag.setAttribute('style', stringifyStyle(styleList));\r\n\t                }\r\n\t                else {\r\n\t                    tag.removeAttribute('style');\r\n\t                }\r\n\t                // 设置 className\r\n\t                if (tag.hasAttribute('class')) {\r\n\t                    tag.setAttribute('class', `${tag.getAttribute('class')} ${val.className}`);\r\n\t                }\r\n\t                else {\r\n\t                    tag.setAttribute('class', val.className);\r\n\t                }\r\n\t            });\r\n\t        }\r\n\t        try {\r\n\t            dom.stylesheet = css.parse(styleContent);\r\n\t        }\r\n\t        catch {\r\n\t            console.log(`${styleContent} convert failed!`);\r\n\t        }\r\n\t    }\r\n\t    resolve();\r\n\t});\n\n\t// default rules\r\n\tconst rules = [\r\n\t    [true, combineStyle],\r\n\t    [true, combineScript],\r\n\t    [true, clearTextNode],\r\n\t    [false, rmXMLDecl, 'rm-xml-decl'],\r\n\t    [false, rmVersion, 'rm-version'],\r\n\t    [false, rmDocType, 'rm-doctype'],\r\n\t    [false, rmComments, 'rm-comments'],\r\n\t    [false, rmIrregularTag, 'rm-irregular-tag'],\r\n\t    [false, rmIrregularNesting, 'rm-irregular-nesting'],\r\n\t    [false, rmUnnecessary, 'rm-unnecessary'],\r\n\t    [false, rmViewBox, 'rm-viewbox'],\r\n\t    [false, shortenAnimate, 'shorten-animate'],\r\n\t    [false, shortenFilter, 'shorten-filter'],\r\n\t    [false, applyStyle, 'apply-style'],\r\n\t    [false, collapseTextwrap, 'collapse-textwrap'],\r\n\t    [false, rmIllegalStyle, 'rm-illegal-style'],\r\n\t    [false, rmPx, 'rm-px'],\r\n\t    [false, rmAttribute, 'rm-attribute'],\r\n\t    [false, shortenDefs, 'shorten-defs'],\r\n\t    [false, shortenID, 'shorten-id'],\r\n\t    [false, shortenShape, 'shorten-shape'],\r\n\t    [false, combinePath, 'combine-path'],\r\n\t    [false, computePath, 'compute-path'],\r\n\t    [false, rmHidden, 'rm-hidden'],\r\n\t    [false, collapseG, 'collapse-g'],\r\n\t    [false, shortenStyleTag, 'shorten-style-tag'],\r\n\t    [false, applyStyle, 'apply-style'],\r\n\t    [false, rmImportant, 'rm-important'],\r\n\t    [false, combineTransform, 'combine-transform'],\r\n\t    [false, shortenDecimalDigits, 'shorten-decimal-digits'],\r\n\t    [false, shortenColor, 'shorten-color'],\r\n\t    [false, styleToClass, 'style-to-class'],\r\n\t    [false, shortenClass, 'shorten-class'],\r\n\t    [true, combineTextNode],\r\n\t    [false, rmXMLNS, 'rm-xmlns'],\r\n\t    [false, shortenStyleAttr, 'shorten-style-attr'],\r\n\t    // 部分规则执行两次，以获得更好的优化效果\r\n\t    [false, rmIllegalStyle, 'rm-illegal-style'],\r\n\t    [false, rmAttribute, 'rm-attribute'],\r\n\t    [false, computePath, 'compute-path'],\r\n\t];\n\n\t// 去除 style 标签最后的分号\r\n\tconst shortenTag = (s) => s.replace(/;}/g, '}');\n\n\t// eslint-disable-next-line @typescript-eslint/no-var-requires\r\n\tconst { stringify: stringify$1 } = require('css');\r\n\tconst createXML = (dom) => {\r\n\t    if (!dom) {\r\n\t        return '';\r\n\t    }\r\n\t    if (dom.stylesheet) {\r\n\t        const cssText = shortenTag(stringify$1(dom.stylesheet, { compress: true }));\r\n\t        const styleTag = dom.styletag;\r\n\t        if (cssText) {\r\n\t            styleTag.childNodes[0].textContent = cssText;\r\n\t        }\r\n\t        else {\r\n\t            styleTag.remove();\r\n\t        }\r\n\t    }\r\n\t    return dom.toString();\r\n\t};\n\n\tvar index = async (data, userConfig = null) => new Promise((resolve, reject) => {\r\n\t    const finalConfig = mergeConfig(userConfig);\r\n\t    svgVdom.parse(data).then(async (dom) => {\r\n\t        for (const item of rules) {\r\n\t            const ruleConfig = createRuleConfig(finalConfig, item[2]);\r\n\t            if (item[0]) {\r\n\t                await item[1](dom, ruleConfig);\r\n\t            }\r\n\t            else {\r\n\t                if (finalConfig.rules[item[2]][0]) {\r\n\t                    await item[1](dom, ruleConfig);\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t        resolve(createXML(dom));\r\n\t    }, reject);\r\n\t});\n\n\treturn index;\n\n})));\n"]}