diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2a1ecc66..5d312f38 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,12 @@
Note: If you find missing information about particular minor version, that version must have been changed without any functional change in this library.
+
+**5.3.5 / 2026-02-08**
+- fix: Escape regex char in entity name
+- update strnum to 2.1.2
+- add missing exports in CJS typings
+
+
**5.3.4 / 2026-01-30**
- fix: handle HTML numeric and hex entities when out of range
diff --git a/lib/fxp.cjs b/lib/fxp.cjs
index cb0f79eb..964c1929 100644
--- a/lib/fxp.cjs
+++ b/lib/fxp.cjs
@@ -1 +1 @@
-(()=>{"use strict";var t={d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{XMLBuilder:()=>ut,XMLParser:()=>et,XMLValidator:()=>ft});const i=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",n=new RegExp("^["+i+"]["+i+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$");function s(t,e){const i=[];let n=e.exec(t);for(;n;){const s=[];s.startIndex=e.lastIndex-n[0].length;const r=n.length;for(let t=0;t"!==t[o]&&" "!==t[o]&&"\t"!==t[o]&&"\n"!==t[o]&&"\r"!==t[o];o++)p+=t[o];if(p=p.trim(),"/"===p[p.length-1]&&(p=p.substring(0,p.length-1),o--),!r(p)){let e;return e=0===p.trim().length?"Invalid space after '<'.":"Tag '"+p+"' is an invalid name.",x("InvalidTag",e,b(t,o))}const c=f(t,o);if(!1===c)return x("InvalidAttr","Attributes for '"+p+"' have open quote.",b(t,o));let N=c.value;if(o=c.index,"/"===N[N.length-1]){const i=o-N.length;N=N.substring(0,N.length-1);const s=g(N,e);if(!0!==s)return x(s.err.code,s.err.msg,b(t,i+s.err.line));n=!0}else if(d){if(!c.tagClosed)return x("InvalidTag","Closing tag '"+p+"' doesn't have proper closing.",b(t,o));if(N.trim().length>0)return x("InvalidTag","Closing tag '"+p+"' can't have attributes or invalid starting.",b(t,a));if(0===i.length)return x("InvalidTag","Closing tag '"+p+"' has not been opened.",b(t,a));{const e=i.pop();if(p!==e.tagName){let i=b(t,e.tagStartPos);return x("InvalidTag","Expected closing tag '"+e.tagName+"' (opened in line "+i.line+", col "+i.col+") instead of closing tag '"+p+"'.",b(t,a))}0==i.length&&(s=!0)}}else{const r=g(N,e);if(!0!==r)return x(r.err.code,r.err.msg,b(t,o-N.length+r.err.line));if(!0===s)return x("InvalidXml","Multiple possible root nodes found.",b(t,o));-1!==e.unpairedTags.indexOf(p)||i.push({tagName:p,tagStartPos:a}),n=!0}for(o++;o0)||x("InvalidXml","Invalid '"+JSON.stringify(i.map((t=>t.tagName)),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1}):x("InvalidXml","Start tag expected.",1)}function l(t){return" "===t||"\t"===t||"\n"===t||"\r"===t}function u(t,e){const i=e;for(;e5&&"xml"===n)return x("InvalidXml","XML declaration allowed only at the start of the document.",b(t,e));if("?"==t[e]&&">"==t[e+1]){e++;break}}return e}function h(t,e){if(t.length>e+5&&"-"===t[e+1]&&"-"===t[e+2]){for(e+=3;e"===t[e+2]){e+=2;break}}else if(t.length>e+8&&"D"===t[e+1]&&"O"===t[e+2]&&"C"===t[e+3]&&"T"===t[e+4]&&"Y"===t[e+5]&&"P"===t[e+6]&&"E"===t[e+7]){let i=1;for(e+=8;e"===t[e]&&(i--,0===i))break}else if(t.length>e+9&&"["===t[e+1]&&"C"===t[e+2]&&"D"===t[e+3]&&"A"===t[e+4]&&"T"===t[e+5]&&"A"===t[e+6]&&"["===t[e+7])for(e+=8;e"===t[e+2]){e+=2;break}return e}const d='"',p="'";function f(t,e){let i="",n="",s=!1;for(;e"===t[e]&&""===n){s=!0;break}i+=t[e]}return""===n&&{value:i,index:e,tagClosed:s}}const c=new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");function g(t,e){const i=s(t,c),n={};for(let t=0;t!1,commentPropName:!1,unpairedTags:[],processEntities:!0,htmlEntities:!1,ignoreDeclaration:!1,ignorePiTags:!1,transformTagName:!1,transformAttributeName:!1,updateTag:function(t,e,i){return t},captureMetaData:!1};let T;T="function"!=typeof Symbol?"@@xmlMetadata":Symbol("XML Node Metadata");class y{constructor(t){this.tagname=t,this.child=[],this[":@"]={}}add(t,e){"__proto__"===t&&(t="#__proto__"),this.child.push({[t]:e})}addChild(t,e){"__proto__"===t.tagname&&(t.tagname="#__proto__"),t[":@"]&&Object.keys(t[":@"]).length>0?this.child.push({[t.tagname]:t.child,":@":t[":@"]}):this.child.push({[t.tagname]:t.child}),void 0!==e&&(this.child[this.child.length-1][T]={startIndex:e})}static getMetaDataSymbol(){return T}}class w{constructor(t){this.suppressValidationErr=!t}readDocType(t,e){const i={};if("O"!==t[e+3]||"C"!==t[e+4]||"T"!==t[e+5]||"Y"!==t[e+6]||"P"!==t[e+7]||"E"!==t[e+8])throw new Error("Invalid Tag instead of DOCTYPE");{e+=9;let n=1,s=!1,r=!1,o="";for(;e"===t[e]){if(r?"-"===t[e-1]&&"-"===t[e-2]&&(r=!1,n--):n--,0===n)break}else"["===t[e]?s=!0:o+=t[e];else{if(s&&P(t,"!ENTITY",e)){let n,s;e+=7,[n,s,e]=this.readEntityExp(t,e+1,this.suppressValidationErr),-1===s.indexOf("&")&&(i[n]={regx:RegExp(`&${n};`,"g"),val:s})}else if(s&&P(t,"!ELEMENT",e)){e+=8;const{index:i}=this.readElementExp(t,e+1);e=i}else if(s&&P(t,"!ATTLIST",e))e+=8;else if(s&&P(t,"!NOTATION",e)){e+=9;const{index:i}=this.readNotationExp(t,e+1,this.suppressValidationErr);e=i}else{if(!P(t,"!--",e))throw new Error("Invalid DOCTYPE");r=!0}n++,o=""}if(0!==n)throw new Error("Unclosed DOCTYPE")}return{entities:i,i:e}}readEntityExp(t,e){e=I(t,e);let i="";for(;e{for(;e{for(const i of t){if("string"==typeof i&&e===i)return!0;if(i instanceof RegExp&&i.test(e))return!0}}:()=>!1}class D{constructor(t){if(this.options=t,this.currentNode=null,this.tagsNodeStack=[],this.docTypeEntities={},this.lastEntities={apos:{regex:/&(apos|#39|#x27);/g,val:"'"},gt:{regex:/&(gt|#62|#x3E);/g,val:">"},lt:{regex:/&(lt|#60|#x3C);/g,val:"<"},quot:{regex:/&(quot|#34|#x22);/g,val:'"'}},this.ampEntity={regex:/&(amp|#38|#x26);/g,val:"&"},this.htmlEntities={space:{regex:/&(nbsp|#160);/g,val:" "},cent:{regex:/&(cent|#162);/g,val:"¢"},pound:{regex:/&(pound|#163);/g,val:"£"},yen:{regex:/&(yen|#165);/g,val:"¥"},euro:{regex:/&(euro|#8364);/g,val:"€"},copyright:{regex:/&(copy|#169);/g,val:"©"},reg:{regex:/&(reg|#174);/g,val:"®"},inr:{regex:/&(inr|#8377);/g,val:"₹"},num_dec:{regex:/([0-9]{1,7});/g,val:(t,e)=>Z(e,10,"")},num_hex:{regex:/([0-9a-fA-F]{1,6});/g,val:(t,e)=>Z(e,16,"")}},this.addExternalEntities=j,this.parseXml=L,this.parseTextData=M,this.resolveNameSpace=F,this.buildAttributesMap=k,this.isItStopNode=Y,this.replaceEntitiesValue=B,this.readStopNodeData=W,this.saveTextToParentTag=R,this.addChild=U,this.ignoreAttributesFn=$(this.options.ignoreAttributes),this.options.stopNodes&&this.options.stopNodes.length>0){this.stopNodesExact=new Set,this.stopNodesWildcard=new Set;for(let t=0;t0)){o||(t=this.replaceEntitiesValue(t));const n=this.options.tagValueProcessor(e,t,i,s,r);return null==n?t:typeof n!=typeof t||n!==t?n:this.options.trimValues||t.trim()===t?q(t,this.options.parseTagValue,this.options.numberParseOptions):t}}function F(t){if(this.options.removeNSPrefix){const e=t.split(":"),i="/"===t.charAt(0)?"/":"";if("xmlns"===e[0])return"";2===e.length&&(t=i+e[1])}return t}const _=new RegExp("([^\\s=]+)\\s*(=\\s*(['\"])([\\s\\S]*?)\\3)?","gm");function k(t,e){if(!0!==this.options.ignoreAttributes&&"string"==typeof t){const i=s(t,_),n=i.length,r={};for(let t=0;t",o,"Closing Tag is not closed.");let r=t.substring(o+2,e).trim();if(this.options.removeNSPrefix){const t=r.indexOf(":");-1!==t&&(r=r.substr(t+1))}this.options.transformTagName&&(r=this.options.transformTagName(r)),i&&(n=this.saveTextToParentTag(n,i,s));const a=s.substring(s.lastIndexOf(".")+1);if(r&&-1!==this.options.unpairedTags.indexOf(r))throw new Error(`Unpaired tag can not be used as closing tag: ${r}>`);let l=0;a&&-1!==this.options.unpairedTags.indexOf(a)?(l=s.lastIndexOf(".",s.lastIndexOf(".")-1),this.tagsNodeStack.pop()):l=s.lastIndexOf("."),s=s.substring(0,l),i=this.tagsNodeStack.pop(),n="",o=e}else if("?"===t[o+1]){let e=X(t,o,!1,"?>");if(!e)throw new Error("Pi Tag is not closed.");if(n=this.saveTextToParentTag(n,i,s),this.options.ignoreDeclaration&&"?xml"===e.tagName||this.options.ignorePiTags);else{const t=new y(e.tagName);t.add(this.options.textNodeName,""),e.tagName!==e.tagExp&&e.attrExpPresent&&(t[":@"]=this.buildAttributesMap(e.tagExp,s)),this.addChild(i,t,s,o)}o=e.closeIndex+1}else if("!--"===t.substr(o+1,3)){const e=G(t,"--\x3e",o+4,"Comment is not closed.");if(this.options.commentPropName){const r=t.substring(o+4,e-2);n=this.saveTextToParentTag(n,i,s),i.add(this.options.commentPropName,[{[this.options.textNodeName]:r}])}o=e}else if("!D"===t.substr(o+1,2)){const e=r.readDocType(t,o);this.docTypeEntities=e.entities,o=e.i}else if("!["===t.substr(o+1,2)){const e=G(t,"]]>",o,"CDATA is not closed.")-2,r=t.substring(o+9,e);n=this.saveTextToParentTag(n,i,s);let a=this.parseTextData(r,i.tagname,s,!0,!1,!0,!0);null==a&&(a=""),this.options.cdataPropName?i.add(this.options.cdataPropName,[{[this.options.textNodeName]:r}]):i.add(this.options.textNodeName,a),o=e+2}else{let r=X(t,o,this.options.removeNSPrefix),a=r.tagName;const l=r.rawTagName;let u=r.tagExp,h=r.attrExpPresent,d=r.closeIndex;if(this.options.transformTagName){const t=this.options.transformTagName(a);u===a&&(u=t),a=t}i&&n&&"!xml"!==i.tagname&&(n=this.saveTextToParentTag(n,i,s,!1));const p=i;p&&-1!==this.options.unpairedTags.indexOf(p.tagname)&&(i=this.tagsNodeStack.pop(),s=s.substring(0,s.lastIndexOf("."))),a!==e.tagname&&(s+=s?"."+a:a);const f=o;if(this.isItStopNode(this.stopNodesExact,this.stopNodesWildcard,s,a)){let e="";if(u.length>0&&u.lastIndexOf("/")===u.length-1)"/"===a[a.length-1]?(a=a.substr(0,a.length-1),s=s.substr(0,s.length-1),u=a):u=u.substr(0,u.length-1),o=r.closeIndex;else if(-1!==this.options.unpairedTags.indexOf(a))o=r.closeIndex;else{const i=this.readStopNodeData(t,l,d+1);if(!i)throw new Error(`Unexpected end of ${l}`);o=i.i,e=i.tagContent}const n=new y(a);a!==u&&h&&(n[":@"]=this.buildAttributesMap(u,s)),e&&(e=this.parseTextData(e,a,s,!0,h,!0,!0)),s=s.substr(0,s.lastIndexOf(".")),n.add(this.options.textNodeName,e),this.addChild(i,n,s,f)}else{if(u.length>0&&u.lastIndexOf("/")===u.length-1){if("/"===a[a.length-1]?(a=a.substr(0,a.length-1),s=s.substr(0,s.length-1),u=a):u=u.substr(0,u.length-1),this.options.transformTagName){const t=this.options.transformTagName(a);u===a&&(u=t),a=t}const t=new y(a);a!==u&&h&&(t[":@"]=this.buildAttributesMap(u,s)),this.addChild(i,t,s,f),s=s.substr(0,s.lastIndexOf("."))}else{const t=new y(a);this.tagsNodeStack.push(i),a!==u&&h&&(t[":@"]=this.buildAttributesMap(u,s)),this.addChild(i,t,s,f),i=t}n="",o=d}}else n+=t[o];return e.child};function U(t,e,i,n){this.options.captureMetaData||(n=void 0);const s=this.options.updateTag(e.tagname,i,e[":@"]);!1===s||("string"==typeof s?(e.tagname=s,t.addChild(e,n)):t.addChild(e,n))}const B=function(t){if(this.options.processEntities){for(let e in this.docTypeEntities){const i=this.docTypeEntities[e];t=t.replace(i.regx,i.val)}for(let e in this.lastEntities){const i=this.lastEntities[e];t=t.replace(i.regex,i.val)}if(this.options.htmlEntities)for(let e in this.htmlEntities){const i=this.htmlEntities[e];t=t.replace(i.regex,i.val)}t=t.replace(this.ampEntity.regex,this.ampEntity.val)}return t};function R(t,e,i,n){return t&&(void 0===n&&(n=0===e.child.length),void 0!==(t=this.parseTextData(t,e.tagname,i,!1,!!e[":@"]&&0!==Object.keys(e[":@"]).length,n))&&""!==t&&e.add(this.options.textNodeName,t),t=""),t}function Y(t,e,i,n){return!(!e||!e.has(n))||!(!t||!t.has(i))}function G(t,e,i,n){const s=t.indexOf(e,i);if(-1===s)throw new Error(n);return s+e.length-1}function X(t,e,i,n=">"){const s=function(t,e,i=">"){let n,s="";for(let r=e;r",i,`${e} is not closed`);if(t.substring(i+2,r).trim()===e&&(s--,0===s))return{tagContent:t.substring(n,i),i:r};i=r}else if("?"===t[i+1])i=G(t,"?>",i+1,"StopNode is not closed.");else if("!--"===t.substr(i+1,3))i=G(t,"--\x3e",i+3,"StopNode is not closed.");else if("!["===t.substr(i+1,2))i=G(t,"]]>",i,"StopNode is not closed.")-2;else{const n=X(t,i,">");n&&((n&&n.tagName)===e&&"/"!==n.tagExp[n.tagExp.length-1]&&s++,i=n.closeIndex)}}function q(t,e,i){if(e&&"string"==typeof t){const e=t.trim();return"true"===e||"false"!==e&&function(t,e={}){if(e=Object.assign({},C,e),!t||"string"!=typeof t)return t;let i=t.trim();if(void 0!==e.skipLike&&e.skipLike.test(i))return t;if("0"===t)return 0;if(e.hex&&A.test(i))return function(t){if(parseInt)return parseInt(t,16);if(Number.parseInt)return Number.parseInt(t,16);if(window&&window.parseInt)return window.parseInt(t,16);throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}(i);if(-1!==i.search(/.+[eE].+/))return function(t,e,i){if(!i.eNotation)return t;const n=e.match(V);if(n){let s=n[1]||"";const r=-1===n[3].indexOf("e")?"E":"e",o=n[2],a=s?t[o.length+1]===r:t[o.length]===r;return o.length>1&&a?t:1!==o.length||!n[3].startsWith(`.${r}`)&&n[3][0]!==r?i.leadingZeros&&!a?(e=(n[1]||"")+n[3],Number(e)):t:Number(e)}return t}(t,i,e);{const s=S.exec(i);if(s){const r=s[1]||"",o=s[2];let a=(n=s[3])&&-1!==n.indexOf(".")?("."===(n=n.replace(/0+$/,""))?n="0":"."===n[0]?n="0"+n:"."===n[n.length-1]&&(n=n.substring(0,n.length-1)),n):n;const l=r?"."===t[o.length+1]:"."===t[o.length];if(!e.leadingZeros&&(o.length>1||1===o.length&&!l))return t;{const n=Number(i),s=String(n);if(0===n||-0===n)return n;if(-1!==s.search(/[eE]/))return e.eNotation?n:t;if(-1!==i.indexOf("."))return"0"===s||s===a||s===`${r}${a}`?n:t;let l=o?a:i;return o?l===s||r+l===s?n:t:l===s||l===r+s?n:t}}return t}var n}(t,i)}return void 0!==t?t:""}function Z(t,e,i){const n=Number.parseInt(t,e);return n>=0&&n<=1114111?String.fromCodePoint(n):i+t+";"}const K=y.getMetaDataSymbol();function Q(t,e){return z(t,e)}function z(t,e,i){let n;const s={};for(let r=0;r0&&(s[e.textNodeName]=n):void 0!==n&&(s[e.textNodeName]=n),s}function J(t){const e=Object.keys(t);for(let t=0;t0&&(i="\n"),nt(t,e,"",i)}function nt(t,e,i,n){let s="",r=!1;for(let o=0;o`,r=!1;continue}if(l===e.commentPropName){s+=n+`\x3c!--${a[l][0][e.textNodeName]}--\x3e`,r=!0;continue}if("?"===l[0]){const t=rt(a[":@"],e),i="?xml"===l?"":n;let o=a[l][0][e.textNodeName];o=0!==o.length?" "+o:"",s+=i+`<${l}${o}${t}?>`,r=!0;continue}let h=n;""!==h&&(h+=e.indentBy);const d=n+`<${l}${rt(a[":@"],e)}`,p=nt(a[l],e,u,h);-1!==e.unpairedTags.indexOf(l)?e.suppressUnpairedNode?s+=d+">":s+=d+"/>":p&&0!==p.length||!e.suppressEmptyNode?p&&p.endsWith(">")?s+=d+`>${p}${n}${l}>`:(s+=d+">",p&&""!==n&&(p.includes("/>")||p.includes(""))?s+=n+e.indentBy+p+n:s+=p,s+=`${l}>`):s+=d+"/>",r=!0}return s}function st(t){const e=Object.keys(t);for(let i=0;i0&&e.processEntities)for(let i=0;i","g"),val:">"},{regex:new RegExp("<","g"),val:"<"},{regex:new RegExp("'","g"),val:"'"},{regex:new RegExp('"',"g"),val:"""}],processEntities:!0,stopNodes:[],oneListGroup:!1};function ut(t){this.options=Object.assign({},lt,t),!0===this.options.ignoreAttributes||this.options.attributesGroupName?this.isAttribute=function(){return!1}:(this.ignoreAttributesFn=$(this.options.ignoreAttributes),this.attrPrefixLen=this.options.attributeNamePrefix.length,this.isAttribute=pt),this.processTextOrObjNode=ht,this.options.format?(this.indentate=dt,this.tagEndChar=">\n",this.newLine="\n"):(this.indentate=function(){return""},this.tagEndChar=">",this.newLine="")}function ht(t,e,i,n){const s=this.j2x(t,i+1,n.concat(e));return void 0!==t[this.options.textNodeName]&&1===Object.keys(t).length?this.buildTextValNode(t[this.options.textNodeName],e,s.attrStr,i):this.buildObjectNode(s.val,e,s.attrStr,i)}function dt(t){return this.options.indentBy.repeat(t)}function pt(t){return!(!t.startsWith(this.options.attributeNamePrefix)||t===this.options.textNodeName)&&t.substr(this.attrPrefixLen)}ut.prototype.build=function(t){return this.options.preserveOrder?it(t,this.options):(Array.isArray(t)&&this.options.arrayNodeName&&this.options.arrayNodeName.length>1&&(t={[this.options.arrayNodeName]:t}),this.j2x(t,0,[]).val)},ut.prototype.j2x=function(t,e,i){let n="",s="";const r=i.join(".");for(let o in t)if(Object.prototype.hasOwnProperty.call(t,o))if(void 0===t[o])this.isAttribute(o)&&(s+="");else if(null===t[o])this.isAttribute(o)||o===this.options.cdataPropName?s+="":"?"===o[0]?s+=this.indentate(e)+"<"+o+"?"+this.tagEndChar:s+=this.indentate(e)+"<"+o+"/"+this.tagEndChar;else if(t[o]instanceof Date)s+=this.buildTextValNode(t[o],o,"",e);else if("object"!=typeof t[o]){const i=this.isAttribute(o);if(i&&!this.ignoreAttributesFn(i,r))n+=this.buildAttrPairStr(i,""+t[o]);else if(!i)if(o===this.options.textNodeName){let e=this.options.tagValueProcessor(o,""+t[o]);s+=this.replaceEntitiesValue(e)}else s+=this.buildTextValNode(t[o],o,"",e)}else if(Array.isArray(t[o])){const n=t[o].length;let r="",a="";for(let l=0;l"+t+s}},ut.prototype.closeTag=function(t){let e="";return-1!==this.options.unpairedTags.indexOf(t)?this.options.suppressUnpairedNode||(e="/"):e=this.options.suppressEmptyNode?"/":`>${t}`,e},ut.prototype.buildTextValNode=function(t,e,i,n){if(!1!==this.options.cdataPropName&&e===this.options.cdataPropName)return this.indentate(n)+``+this.newLine;if(!1!==this.options.commentPropName&&e===this.options.commentPropName)return this.indentate(n)+`\x3c!--${t}--\x3e`+this.newLine;if("?"===e[0])return this.indentate(n)+"<"+e+i+"?"+this.tagEndChar;{let s=this.options.tagValueProcessor(e,t);return s=this.replaceEntitiesValue(s),""===s?this.indentate(n)+"<"+e+i+this.closeTag(e)+this.tagEndChar:this.indentate(n)+"<"+e+i+">"+s+""+e+this.tagEndChar}},ut.prototype.replaceEntitiesValue=function(t){if(t&&t.length>0&&this.options.processEntities)for(let e=0;e{"use strict";var t={d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{XMLBuilder:()=>ut,XMLParser:()=>et,XMLValidator:()=>ft});const i=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",n=new RegExp("^["+i+"]["+i+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$");function s(t,e){const i=[];let n=e.exec(t);for(;n;){const s=[];s.startIndex=e.lastIndex-n[0].length;const r=n.length;for(let t=0;t"!==t[o]&&" "!==t[o]&&"\t"!==t[o]&&"\n"!==t[o]&&"\r"!==t[o];o++)p+=t[o];if(p=p.trim(),"/"===p[p.length-1]&&(p=p.substring(0,p.length-1),o--),!r(p)){let e;return e=0===p.trim().length?"Invalid space after '<'.":"Tag '"+p+"' is an invalid name.",x("InvalidTag",e,b(t,o))}const c=f(t,o);if(!1===c)return x("InvalidAttr","Attributes for '"+p+"' have open quote.",b(t,o));let N=c.value;if(o=c.index,"/"===N[N.length-1]){const i=o-N.length;N=N.substring(0,N.length-1);const s=g(N,e);if(!0!==s)return x(s.err.code,s.err.msg,b(t,i+s.err.line));n=!0}else if(d){if(!c.tagClosed)return x("InvalidTag","Closing tag '"+p+"' doesn't have proper closing.",b(t,o));if(N.trim().length>0)return x("InvalidTag","Closing tag '"+p+"' can't have attributes or invalid starting.",b(t,a));if(0===i.length)return x("InvalidTag","Closing tag '"+p+"' has not been opened.",b(t,a));{const e=i.pop();if(p!==e.tagName){let i=b(t,e.tagStartPos);return x("InvalidTag","Expected closing tag '"+e.tagName+"' (opened in line "+i.line+", col "+i.col+") instead of closing tag '"+p+"'.",b(t,a))}0==i.length&&(s=!0)}}else{const r=g(N,e);if(!0!==r)return x(r.err.code,r.err.msg,b(t,o-N.length+r.err.line));if(!0===s)return x("InvalidXml","Multiple possible root nodes found.",b(t,o));-1!==e.unpairedTags.indexOf(p)||i.push({tagName:p,tagStartPos:a}),n=!0}for(o++;o0)||x("InvalidXml","Invalid '"+JSON.stringify(i.map((t=>t.tagName)),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1}):x("InvalidXml","Start tag expected.",1)}function l(t){return" "===t||"\t"===t||"\n"===t||"\r"===t}function u(t,e){const i=e;for(;e5&&"xml"===n)return x("InvalidXml","XML declaration allowed only at the start of the document.",b(t,e));if("?"==t[e]&&">"==t[e+1]){e++;break}}return e}function h(t,e){if(t.length>e+5&&"-"===t[e+1]&&"-"===t[e+2]){for(e+=3;e"===t[e+2]){e+=2;break}}else if(t.length>e+8&&"D"===t[e+1]&&"O"===t[e+2]&&"C"===t[e+3]&&"T"===t[e+4]&&"Y"===t[e+5]&&"P"===t[e+6]&&"E"===t[e+7]){let i=1;for(e+=8;e"===t[e]&&(i--,0===i))break}else if(t.length>e+9&&"["===t[e+1]&&"C"===t[e+2]&&"D"===t[e+3]&&"A"===t[e+4]&&"T"===t[e+5]&&"A"===t[e+6]&&"["===t[e+7])for(e+=8;e"===t[e+2]){e+=2;break}return e}const d='"',p="'";function f(t,e){let i="",n="",s=!1;for(;e"===t[e]&&""===n){s=!0;break}i+=t[e]}return""===n&&{value:i,index:e,tagClosed:s}}const c=new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");function g(t,e){const i=s(t,c),n={};for(let t=0;t!1,commentPropName:!1,unpairedTags:[],processEntities:!0,htmlEntities:!1,ignoreDeclaration:!1,ignorePiTags:!1,transformTagName:!1,transformAttributeName:!1,updateTag:function(t,e,i){return t},captureMetaData:!1};let T;T="function"!=typeof Symbol?"@@xmlMetadata":Symbol("XML Node Metadata");class y{constructor(t){this.tagname=t,this.child=[],this[":@"]={}}add(t,e){"__proto__"===t&&(t="#__proto__"),this.child.push({[t]:e})}addChild(t,e){"__proto__"===t.tagname&&(t.tagname="#__proto__"),t[":@"]&&Object.keys(t[":@"]).length>0?this.child.push({[t.tagname]:t.child,":@":t[":@"]}):this.child.push({[t.tagname]:t.child}),void 0!==e&&(this.child[this.child.length-1][T]={startIndex:e})}static getMetaDataSymbol(){return T}}class w{constructor(t){this.suppressValidationErr=!t}readDocType(t,e){const i={};if("O"!==t[e+3]||"C"!==t[e+4]||"T"!==t[e+5]||"Y"!==t[e+6]||"P"!==t[e+7]||"E"!==t[e+8])throw new Error("Invalid Tag instead of DOCTYPE");{e+=9;let n=1,s=!1,r=!1,o="";for(;e"===t[e]){if(r?"-"===t[e-1]&&"-"===t[e-2]&&(r=!1,n--):n--,0===n)break}else"["===t[e]?s=!0:o+=t[e];else{if(s&&P(t,"!ENTITY",e)){let n,s;if(e+=7,[n,s,e]=this.readEntityExp(t,e+1,this.suppressValidationErr),-1===s.indexOf("&")){const t=n.replace(/[.\-+*:]/g,"\\.");i[n]={regx:RegExp(`&${t};`,"g"),val:s}}}else if(s&&P(t,"!ELEMENT",e)){e+=8;const{index:i}=this.readElementExp(t,e+1);e=i}else if(s&&P(t,"!ATTLIST",e))e+=8;else if(s&&P(t,"!NOTATION",e)){e+=9;const{index:i}=this.readNotationExp(t,e+1,this.suppressValidationErr);e=i}else{if(!P(t,"!--",e))throw new Error("Invalid DOCTYPE");r=!0}n++,o=""}if(0!==n)throw new Error("Unclosed DOCTYPE")}return{entities:i,i:e}}readEntityExp(t,e){e=I(t,e);let i="";for(;e{for(;e{for(const i of t){if("string"==typeof i&&e===i)return!0;if(i instanceof RegExp&&i.test(e))return!0}}:()=>!1}class D{constructor(t){if(this.options=t,this.currentNode=null,this.tagsNodeStack=[],this.docTypeEntities={},this.lastEntities={apos:{regex:/&(apos|#39|#x27);/g,val:"'"},gt:{regex:/&(gt|#62|#x3E);/g,val:">"},lt:{regex:/&(lt|#60|#x3C);/g,val:"<"},quot:{regex:/&(quot|#34|#x22);/g,val:'"'}},this.ampEntity={regex:/&(amp|#38|#x26);/g,val:"&"},this.htmlEntities={space:{regex:/&(nbsp|#160);/g,val:" "},cent:{regex:/&(cent|#162);/g,val:"¢"},pound:{regex:/&(pound|#163);/g,val:"£"},yen:{regex:/&(yen|#165);/g,val:"¥"},euro:{regex:/&(euro|#8364);/g,val:"€"},copyright:{regex:/&(copy|#169);/g,val:"©"},reg:{regex:/&(reg|#174);/g,val:"®"},inr:{regex:/&(inr|#8377);/g,val:"₹"},num_dec:{regex:/([0-9]{1,7});/g,val:(t,e)=>Z(e,10,"")},num_hex:{regex:/([0-9a-fA-F]{1,6});/g,val:(t,e)=>Z(e,16,"")}},this.addExternalEntities=j,this.parseXml=L,this.parseTextData=M,this.resolveNameSpace=F,this.buildAttributesMap=k,this.isItStopNode=Y,this.replaceEntitiesValue=B,this.readStopNodeData=W,this.saveTextToParentTag=R,this.addChild=U,this.ignoreAttributesFn=$(this.options.ignoreAttributes),this.options.stopNodes&&this.options.stopNodes.length>0){this.stopNodesExact=new Set,this.stopNodesWildcard=new Set;for(let t=0;t0)){o||(t=this.replaceEntitiesValue(t));const n=this.options.tagValueProcessor(e,t,i,s,r);return null==n?t:typeof n!=typeof t||n!==t?n:this.options.trimValues||t.trim()===t?q(t,this.options.parseTagValue,this.options.numberParseOptions):t}}function F(t){if(this.options.removeNSPrefix){const e=t.split(":"),i="/"===t.charAt(0)?"/":"";if("xmlns"===e[0])return"";2===e.length&&(t=i+e[1])}return t}const _=new RegExp("([^\\s=]+)\\s*(=\\s*(['\"])([\\s\\S]*?)\\3)?","gm");function k(t,e){if(!0!==this.options.ignoreAttributes&&"string"==typeof t){const i=s(t,_),n=i.length,r={};for(let t=0;t",o,"Closing Tag is not closed.");let r=t.substring(o+2,e).trim();if(this.options.removeNSPrefix){const t=r.indexOf(":");-1!==t&&(r=r.substr(t+1))}this.options.transformTagName&&(r=this.options.transformTagName(r)),i&&(n=this.saveTextToParentTag(n,i,s));const a=s.substring(s.lastIndexOf(".")+1);if(r&&-1!==this.options.unpairedTags.indexOf(r))throw new Error(`Unpaired tag can not be used as closing tag: ${r}>`);let l=0;a&&-1!==this.options.unpairedTags.indexOf(a)?(l=s.lastIndexOf(".",s.lastIndexOf(".")-1),this.tagsNodeStack.pop()):l=s.lastIndexOf("."),s=s.substring(0,l),i=this.tagsNodeStack.pop(),n="",o=e}else if("?"===t[o+1]){let e=X(t,o,!1,"?>");if(!e)throw new Error("Pi Tag is not closed.");if(n=this.saveTextToParentTag(n,i,s),this.options.ignoreDeclaration&&"?xml"===e.tagName||this.options.ignorePiTags);else{const t=new y(e.tagName);t.add(this.options.textNodeName,""),e.tagName!==e.tagExp&&e.attrExpPresent&&(t[":@"]=this.buildAttributesMap(e.tagExp,s)),this.addChild(i,t,s,o)}o=e.closeIndex+1}else if("!--"===t.substr(o+1,3)){const e=G(t,"--\x3e",o+4,"Comment is not closed.");if(this.options.commentPropName){const r=t.substring(o+4,e-2);n=this.saveTextToParentTag(n,i,s),i.add(this.options.commentPropName,[{[this.options.textNodeName]:r}])}o=e}else if("!D"===t.substr(o+1,2)){const e=r.readDocType(t,o);this.docTypeEntities=e.entities,o=e.i}else if("!["===t.substr(o+1,2)){const e=G(t,"]]>",o,"CDATA is not closed.")-2,r=t.substring(o+9,e);n=this.saveTextToParentTag(n,i,s);let a=this.parseTextData(r,i.tagname,s,!0,!1,!0,!0);null==a&&(a=""),this.options.cdataPropName?i.add(this.options.cdataPropName,[{[this.options.textNodeName]:r}]):i.add(this.options.textNodeName,a),o=e+2}else{let r=X(t,o,this.options.removeNSPrefix),a=r.tagName;const l=r.rawTagName;let u=r.tagExp,h=r.attrExpPresent,d=r.closeIndex;if(this.options.transformTagName){const t=this.options.transformTagName(a);u===a&&(u=t),a=t}i&&n&&"!xml"!==i.tagname&&(n=this.saveTextToParentTag(n,i,s,!1));const p=i;p&&-1!==this.options.unpairedTags.indexOf(p.tagname)&&(i=this.tagsNodeStack.pop(),s=s.substring(0,s.lastIndexOf("."))),a!==e.tagname&&(s+=s?"."+a:a);const f=o;if(this.isItStopNode(this.stopNodesExact,this.stopNodesWildcard,s,a)){let e="";if(u.length>0&&u.lastIndexOf("/")===u.length-1)"/"===a[a.length-1]?(a=a.substr(0,a.length-1),s=s.substr(0,s.length-1),u=a):u=u.substr(0,u.length-1),o=r.closeIndex;else if(-1!==this.options.unpairedTags.indexOf(a))o=r.closeIndex;else{const i=this.readStopNodeData(t,l,d+1);if(!i)throw new Error(`Unexpected end of ${l}`);o=i.i,e=i.tagContent}const n=new y(a);a!==u&&h&&(n[":@"]=this.buildAttributesMap(u,s)),e&&(e=this.parseTextData(e,a,s,!0,h,!0,!0)),s=s.substr(0,s.lastIndexOf(".")),n.add(this.options.textNodeName,e),this.addChild(i,n,s,f)}else{if(u.length>0&&u.lastIndexOf("/")===u.length-1){if("/"===a[a.length-1]?(a=a.substr(0,a.length-1),s=s.substr(0,s.length-1),u=a):u=u.substr(0,u.length-1),this.options.transformTagName){const t=this.options.transformTagName(a);u===a&&(u=t),a=t}const t=new y(a);a!==u&&h&&(t[":@"]=this.buildAttributesMap(u,s)),this.addChild(i,t,s,f),s=s.substr(0,s.lastIndexOf("."))}else{const t=new y(a);this.tagsNodeStack.push(i),a!==u&&h&&(t[":@"]=this.buildAttributesMap(u,s)),this.addChild(i,t,s,f),i=t}n="",o=d}}else n+=t[o];return e.child};function U(t,e,i,n){this.options.captureMetaData||(n=void 0);const s=this.options.updateTag(e.tagname,i,e[":@"]);!1===s||("string"==typeof s?(e.tagname=s,t.addChild(e,n)):t.addChild(e,n))}const B=function(t){if(this.options.processEntities){for(let e in this.docTypeEntities){const i=this.docTypeEntities[e];t=t.replace(i.regx,i.val)}for(let e in this.lastEntities){const i=this.lastEntities[e];t=t.replace(i.regex,i.val)}if(this.options.htmlEntities)for(let e in this.htmlEntities){const i=this.htmlEntities[e];t=t.replace(i.regex,i.val)}t=t.replace(this.ampEntity.regex,this.ampEntity.val)}return t};function R(t,e,i,n){return t&&(void 0===n&&(n=0===e.child.length),void 0!==(t=this.parseTextData(t,e.tagname,i,!1,!!e[":@"]&&0!==Object.keys(e[":@"]).length,n))&&""!==t&&e.add(this.options.textNodeName,t),t=""),t}function Y(t,e,i,n){return!(!e||!e.has(n))||!(!t||!t.has(i))}function G(t,e,i,n){const s=t.indexOf(e,i);if(-1===s)throw new Error(n);return s+e.length-1}function X(t,e,i,n=">"){const s=function(t,e,i=">"){let n,s="";for(let r=e;r",i,`${e} is not closed`);if(t.substring(i+2,r).trim()===e&&(s--,0===s))return{tagContent:t.substring(n,i),i:r};i=r}else if("?"===t[i+1])i=G(t,"?>",i+1,"StopNode is not closed.");else if("!--"===t.substr(i+1,3))i=G(t,"--\x3e",i+3,"StopNode is not closed.");else if("!["===t.substr(i+1,2))i=G(t,"]]>",i,"StopNode is not closed.")-2;else{const n=X(t,i,">");n&&((n&&n.tagName)===e&&"/"!==n.tagExp[n.tagExp.length-1]&&s++,i=n.closeIndex)}}function q(t,e,i){if(e&&"string"==typeof t){const e=t.trim();return"true"===e||"false"!==e&&function(t,e={}){if(e=Object.assign({},C,e),!t||"string"!=typeof t)return t;let i=t.trim();if(void 0!==e.skipLike&&e.skipLike.test(i))return t;if("0"===t)return 0;if(e.hex&&A.test(i))return function(t){if(parseInt)return parseInt(t,16);if(Number.parseInt)return Number.parseInt(t,16);if(window&&window.parseInt)return window.parseInt(t,16);throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}(i);if(-1!==i.search(/.+[eE].+/))return function(t,e,i){if(!i.eNotation)return t;const n=e.match(V);if(n){let s=n[1]||"";const r=-1===n[3].indexOf("e")?"E":"e",o=n[2],a=s?t[o.length+1]===r:t[o.length]===r;return o.length>1&&a?t:1!==o.length||!n[3].startsWith(`.${r}`)&&n[3][0]!==r?i.leadingZeros&&!a?(e=(n[1]||"")+n[3],Number(e)):t:Number(e)}return t}(t,i,e);{const s=S.exec(i);if(s){const r=s[1]||"",o=s[2];let a=(n=s[3])&&-1!==n.indexOf(".")?("."===(n=n.replace(/0+$/,""))?n="0":"."===n[0]?n="0"+n:"."===n[n.length-1]&&(n=n.substring(0,n.length-1)),n):n;const l=r?"."===t[o.length+1]:"."===t[o.length];if(!e.leadingZeros&&(o.length>1||1===o.length&&!l))return t;{const n=Number(i),s=String(n);if(0===n||-0===n)return n;if(-1!==s.search(/[eE]/))return e.eNotation?n:t;if(-1!==i.indexOf("."))return"0"===s||s===a||s===`${r}${a}`?n:t;let l=o?a:i;return o?l===s||r+l===s?n:t:l===s||l===r+s?n:t}}return t}var n}(t,i)}return void 0!==t?t:""}function Z(t,e,i){const n=Number.parseInt(t,e);return n>=0&&n<=1114111?String.fromCodePoint(n):i+t+";"}const K=y.getMetaDataSymbol();function Q(t,e){return z(t,e)}function z(t,e,i){let n;const s={};for(let r=0;r0&&(s[e.textNodeName]=n):void 0!==n&&(s[e.textNodeName]=n),s}function J(t){const e=Object.keys(t);for(let t=0;t0&&(i="\n"),nt(t,e,"",i)}function nt(t,e,i,n){let s="",r=!1;for(let o=0;o`,r=!1;continue}if(l===e.commentPropName){s+=n+`\x3c!--${a[l][0][e.textNodeName]}--\x3e`,r=!0;continue}if("?"===l[0]){const t=rt(a[":@"],e),i="?xml"===l?"":n;let o=a[l][0][e.textNodeName];o=0!==o.length?" "+o:"",s+=i+`<${l}${o}${t}?>`,r=!0;continue}let h=n;""!==h&&(h+=e.indentBy);const d=n+`<${l}${rt(a[":@"],e)}`,p=nt(a[l],e,u,h);-1!==e.unpairedTags.indexOf(l)?e.suppressUnpairedNode?s+=d+">":s+=d+"/>":p&&0!==p.length||!e.suppressEmptyNode?p&&p.endsWith(">")?s+=d+`>${p}${n}${l}>`:(s+=d+">",p&&""!==n&&(p.includes("/>")||p.includes(""))?s+=n+e.indentBy+p+n:s+=p,s+=`${l}>`):s+=d+"/>",r=!0}return s}function st(t){const e=Object.keys(t);for(let i=0;i0&&e.processEntities)for(let i=0;i","g"),val:">"},{regex:new RegExp("<","g"),val:"<"},{regex:new RegExp("'","g"),val:"'"},{regex:new RegExp('"',"g"),val:"""}],processEntities:!0,stopNodes:[],oneListGroup:!1};function ut(t){this.options=Object.assign({},lt,t),!0===this.options.ignoreAttributes||this.options.attributesGroupName?this.isAttribute=function(){return!1}:(this.ignoreAttributesFn=$(this.options.ignoreAttributes),this.attrPrefixLen=this.options.attributeNamePrefix.length,this.isAttribute=pt),this.processTextOrObjNode=ht,this.options.format?(this.indentate=dt,this.tagEndChar=">\n",this.newLine="\n"):(this.indentate=function(){return""},this.tagEndChar=">",this.newLine="")}function ht(t,e,i,n){const s=this.j2x(t,i+1,n.concat(e));return void 0!==t[this.options.textNodeName]&&1===Object.keys(t).length?this.buildTextValNode(t[this.options.textNodeName],e,s.attrStr,i):this.buildObjectNode(s.val,e,s.attrStr,i)}function dt(t){return this.options.indentBy.repeat(t)}function pt(t){return!(!t.startsWith(this.options.attributeNamePrefix)||t===this.options.textNodeName)&&t.substr(this.attrPrefixLen)}ut.prototype.build=function(t){return this.options.preserveOrder?it(t,this.options):(Array.isArray(t)&&this.options.arrayNodeName&&this.options.arrayNodeName.length>1&&(t={[this.options.arrayNodeName]:t}),this.j2x(t,0,[]).val)},ut.prototype.j2x=function(t,e,i){let n="",s="";const r=i.join(".");for(let o in t)if(Object.prototype.hasOwnProperty.call(t,o))if(void 0===t[o])this.isAttribute(o)&&(s+="");else if(null===t[o])this.isAttribute(o)||o===this.options.cdataPropName?s+="":"?"===o[0]?s+=this.indentate(e)+"<"+o+"?"+this.tagEndChar:s+=this.indentate(e)+"<"+o+"/"+this.tagEndChar;else if(t[o]instanceof Date)s+=this.buildTextValNode(t[o],o,"",e);else if("object"!=typeof t[o]){const i=this.isAttribute(o);if(i&&!this.ignoreAttributesFn(i,r))n+=this.buildAttrPairStr(i,""+t[o]);else if(!i)if(o===this.options.textNodeName){let e=this.options.tagValueProcessor(o,""+t[o]);s+=this.replaceEntitiesValue(e)}else s+=this.buildTextValNode(t[o],o,"",e)}else if(Array.isArray(t[o])){const n=t[o].length;let r="",a="";for(let l=0;l"+t+s}},ut.prototype.closeTag=function(t){let e="";return-1!==this.options.unpairedTags.indexOf(t)?this.options.suppressUnpairedNode||(e="/"):e=this.options.suppressEmptyNode?"/":`>${t}`,e},ut.prototype.buildTextValNode=function(t,e,i,n){if(!1!==this.options.cdataPropName&&e===this.options.cdataPropName)return this.indentate(n)+``+this.newLine;if(!1!==this.options.commentPropName&&e===this.options.commentPropName)return this.indentate(n)+`\x3c!--${t}--\x3e`+this.newLine;if("?"===e[0])return this.indentate(n)+"<"+e+i+"?"+this.tagEndChar;{let s=this.options.tagValueProcessor(e,t);return s=this.replaceEntitiesValue(s),""===s?this.indentate(n)+"<"+e+i+this.closeTag(e)+this.tagEndChar:this.indentate(n)+"<"+e+i+">"+s+""+e+this.tagEndChar}},ut.prototype.replaceEntitiesValue=function(t){if(t&&t.length>0&&this.options.processEntities)for(let e=0;e(()=>{"use strict";var t={d:(e,r)=>{for(var i in r)t.o(r,i)&&!t.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:r[i]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{XMLBuilder:()=>dt,XMLParser:()=>rt,XMLValidator:()=>gt});var r=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",i=new RegExp("^["+r+"]["+r+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$");function n(t,e){for(var r=[],i=e.exec(t);i;){var n=[];n.startIndex=e.lastIndex-i[0].length;for(var s=i.length,a=0;a"!==t[o]&&" "!==t[o]&&"\t"!==t[o]&&"\n"!==t[o]&&"\r"!==t[o];o++)g+=t[o];if("/"===(g=g.trim())[g.length-1]&&(g=g.substring(0,g.length-1),o--),!s(g))return m("InvalidTag",0===g.trim().length?"Invalid space after '<'.":"Tag '"+g+"' is an invalid name.",b(t,o));var x=p(t,o);if(!1===x)return m("InvalidAttr","Attributes for '"+g+"' have open quote.",b(t,o));var N=x.value;if(o=x.index,"/"===N[N.length-1]){var E=o-N.length,y=c(N=N.substring(0,N.length-1),e);if(!0!==y)return m(y.err.code,y.err.msg,b(t,E+y.err.line));i=!0}else if(f){if(!x.tagClosed)return m("InvalidTag","Closing tag '"+g+"' doesn't have proper closing.",b(t,o));if(N.trim().length>0)return m("InvalidTag","Closing tag '"+g+"' can't have attributes or invalid starting.",b(t,h));if(0===r.length)return m("InvalidTag","Closing tag '"+g+"' has not been opened.",b(t,h));var T=r.pop();if(g!==T.tagName){var w=b(t,T.tagStartPos);return m("InvalidTag","Expected closing tag '"+T.tagName+"' (opened in line "+w.line+", col "+w.col+") instead of closing tag '"+g+"'.",b(t,h))}0==r.length&&(n=!0)}else{var I=c(N,e);if(!0!==I)return m(I.err.code,I.err.msg,b(t,o-N.length+I.err.line));if(!0===n)return m("InvalidXml","Multiple possible root nodes found.",b(t,o));-1!==e.unpairedTags.indexOf(g)||r.push({tagName:g,tagStartPos:h}),i=!0}for(o++;o0)||m("InvalidXml","Invalid '"+JSON.stringify(r.map((function(t){return t.tagName})),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1}):m("InvalidXml","Start tag expected.",1)}function l(t){return" "===t||"\t"===t||"\n"===t||"\r"===t}function u(t,e){for(var r=e;e5&&"xml"===i)return m("InvalidXml","XML declaration allowed only at the start of the document.",b(t,e));if("?"==t[e]&&">"==t[e+1]){e++;break}}return e}function d(t,e){if(t.length>e+5&&"-"===t[e+1]&&"-"===t[e+2]){for(e+=3;e"===t[e+2]){e+=2;break}}else if(t.length>e+8&&"D"===t[e+1]&&"O"===t[e+2]&&"C"===t[e+3]&&"T"===t[e+4]&&"Y"===t[e+5]&&"P"===t[e+6]&&"E"===t[e+7]){var r=1;for(e+=8;e"===t[e]&&0==--r)break}else if(t.length>e+9&&"["===t[e+1]&&"C"===t[e+2]&&"D"===t[e+3]&&"A"===t[e+4]&&"T"===t[e+5]&&"A"===t[e+6]&&"["===t[e+7])for(e+=8;e"===t[e+2]){e+=2;break}return e}var h='"',f="'";function p(t,e){for(var r="",i="",n=!1;e"===t[e]&&""===i){n=!0;break}r+=t[e]}return""===i&&{value:r,index:e,tagClosed:n}}var g=new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");function c(t,e){for(var r=n(t,g),i={},s=0;s0?this.child.push(((r={})[t.tagname]=t.child,r[":@"]=t[":@"],r)):this.child.push(((i={})[t.tagname]=t.child,i)),void 0!==e&&(this.child[this.child.length-1][E]={startIndex:e})},t.getMetaDataSymbol=function(){return E},t}(),w=function(){function t(t){this.suppressValidationErr=!t}var e=t.prototype;return e.readDocType=function(t,e){var r={};if("O"!==t[e+3]||"C"!==t[e+4]||"T"!==t[e+5]||"Y"!==t[e+6]||"P"!==t[e+7]||"E"!==t[e+8])throw new Error("Invalid Tag instead of DOCTYPE");e+=9;for(var i=1,n=!1,s=!1;e"===t[e]){if(s?"-"===t[e-1]&&"-"===t[e-2]&&(s=!1,i--):i--,0===i)break}else"["===t[e]?n=!0:t[e];else{if(n&&A(t,"!ENTITY",e)){e+=7;var a,o=void 0,l=this.readEntityExp(t,e+1,this.suppressValidationErr);a=l[0],o=l[1],e=l[2],-1===o.indexOf("&")&&(r[a]={regx:RegExp("&"+a+";","g"),val:o})}else if(n&&A(t,"!ELEMENT",e))e+=8,e=this.readElementExp(t,e+1).index;else if(n&&A(t,"!ATTLIST",e))e+=8;else if(n&&A(t,"!NOTATION",e))e+=9,e=this.readNotationExp(t,e+1,this.suppressValidationErr).index;else{if(!A(t,"!--",e))throw new Error("Invalid DOCTYPE");s=!0}i++}if(0!==i)throw new Error("Unclosed DOCTYPE");return{entities:r,i:e}},e.readEntityExp=function(t,e){e=I(t,e);for(var r="";et.length)&&(e=t.length);for(var r=0,i=Array(e);r=t.length?{done:!0}:{done:!1,value:t[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(t);!(r=i()).done;){var n=r.value;if("string"==typeof n&&e===n)return!0;if(n instanceof RegExp&&n.test(e))return!0}}:function(){return!1}}var M=function(t){if(this.options=t,this.currentNode=null,this.tagsNodeStack=[],this.docTypeEntities={},this.lastEntities={apos:{regex:/&(apos|#39|#x27);/g,val:"'"},gt:{regex:/&(gt|#62|#x3E);/g,val:">"},lt:{regex:/&(lt|#60|#x3C);/g,val:"<"},quot:{regex:/&(quot|#34|#x22);/g,val:'"'}},this.ampEntity={regex:/&(amp|#38|#x26);/g,val:"&"},this.htmlEntities={space:{regex:/&(nbsp|#160);/g,val:" "},cent:{regex:/&(cent|#162);/g,val:"¢"},pound:{regex:/&(pound|#163);/g,val:"£"},yen:{regex:/&(yen|#165);/g,val:"¥"},euro:{regex:/&(euro|#8364);/g,val:"€"},copyright:{regex:/&(copy|#169);/g,val:"©"},reg:{regex:/&(reg|#174);/g,val:"®"},inr:{regex:/&(inr|#8377);/g,val:"₹"},num_dec:{regex:/([0-9]{1,7});/g,val:function(t,e){return K(e,10,"")}},num_hex:{regex:/([0-9a-fA-F]{1,6});/g,val:function(t,e){return K(e,16,"")}}},this.addExternalEntities=F,this.parseXml=B,this.parseTextData=_,this.resolveNameSpace=k,this.buildAttributesMap=U,this.isItStopNode=X,this.replaceEntitiesValue=Y,this.readStopNodeData=q,this.saveTextToParentTag=G,this.addChild=R,this.ignoreAttributesFn=j(this.options.ignoreAttributes),this.options.stopNodes&&this.options.stopNodes.length>0){this.stopNodesExact=new Set,this.stopNodesWildcard=new Set;for(var e=0;e0)){a||(t=this.replaceEntitiesValue(t));var o=this.options.tagValueProcessor(e,t,r,n,s);return null==o?t:typeof o!=typeof t||o!==t?o:this.options.trimValues||t.trim()===t?Z(t,this.options.parseTagValue,this.options.numberParseOptions):t}}function k(t){if(this.options.removeNSPrefix){var e=t.split(":"),r="/"===t.charAt(0)?"/":"";if("xmlns"===e[0])return"";2===e.length&&(t=r+e[1])}return t}var L=new RegExp("([^\\s=]+)\\s*(=\\s*(['\"])([\\s\\S]*?)\\3)?","gm");function U(t,e){if(!0!==this.options.ignoreAttributes&&"string"==typeof t){for(var r=n(t,L),i=r.length,s={},a=0;a",a,"Closing Tag is not closed."),l=t.substring(a+2,o).trim();if(this.options.removeNSPrefix){var u=l.indexOf(":");-1!==u&&(l=l.substr(u+1))}this.options.transformTagName&&(l=this.options.transformTagName(l)),r&&(i=this.saveTextToParentTag(i,r,n));var d=n.substring(n.lastIndexOf(".")+1);if(l&&-1!==this.options.unpairedTags.indexOf(l))throw new Error("Unpaired tag can not be used as closing tag: "+l+">");var h=0;d&&-1!==this.options.unpairedTags.indexOf(d)?(h=n.lastIndexOf(".",n.lastIndexOf(".")-1),this.tagsNodeStack.pop()):h=n.lastIndexOf("."),n=n.substring(0,h),r=this.tagsNodeStack.pop(),i="",a=o}else if("?"===t[a+1]){var f=W(t,a,!1,"?>");if(!f)throw new Error("Pi Tag is not closed.");if(i=this.saveTextToParentTag(i,r,n),this.options.ignoreDeclaration&&"?xml"===f.tagName||this.options.ignorePiTags);else{var p=new T(f.tagName);p.add(this.options.textNodeName,""),f.tagName!==f.tagExp&&f.attrExpPresent&&(p[":@"]=this.buildAttributesMap(f.tagExp,n)),this.addChild(r,p,n,a)}a=f.closeIndex+1}else if("!--"===t.substr(a+1,3)){var g=$(t,"--\x3e",a+4,"Comment is not closed.");if(this.options.commentPropName){var c,v=t.substring(a+4,g-2);i=this.saveTextToParentTag(i,r,n),r.add(this.options.commentPropName,[(c={},c[this.options.textNodeName]=v,c)])}a=g}else if("!D"===t.substr(a+1,2)){var m=s.readDocType(t,a);this.docTypeEntities=m.entities,a=m.i}else if("!["===t.substr(a+1,2)){var x=$(t,"]]>",a,"CDATA is not closed.")-2,b=t.substring(a+9,x);i=this.saveTextToParentTag(i,r,n);var N,E=this.parseTextData(b,r.tagname,n,!0,!1,!0,!0);null==E&&(E=""),this.options.cdataPropName?r.add(this.options.cdataPropName,[(N={},N[this.options.textNodeName]=b,N)]):r.add(this.options.textNodeName,E),a=x+2}else{var y=W(t,a,this.options.removeNSPrefix),I=y.tagName,A=y.rawTagName,P=y.tagExp,O=y.attrExpPresent,S=y.closeIndex;if(this.options.transformTagName){var C=this.options.transformTagName(I);P===I&&(P=C),I=C}r&&i&&"!xml"!==r.tagname&&(i=this.saveTextToParentTag(i,r,n,!1));var V=r;V&&-1!==this.options.unpairedTags.indexOf(V.tagname)&&(r=this.tagsNodeStack.pop(),n=n.substring(0,n.lastIndexOf("."))),I!==e.tagname&&(n+=n?"."+I:I);var D=a;if(this.isItStopNode(this.stopNodesExact,this.stopNodesWildcard,n,I)){var j="";if(P.length>0&&P.lastIndexOf("/")===P.length-1)"/"===I[I.length-1]?(I=I.substr(0,I.length-1),n=n.substr(0,n.length-1),P=I):P=P.substr(0,P.length-1),a=y.closeIndex;else if(-1!==this.options.unpairedTags.indexOf(I))a=y.closeIndex;else{var M=this.readStopNodeData(t,A,S+1);if(!M)throw new Error("Unexpected end of "+A);a=M.i,j=M.tagContent}var F=new T(I);I!==P&&O&&(F[":@"]=this.buildAttributesMap(P,n)),j&&(j=this.parseTextData(j,I,n,!0,O,!0,!0)),n=n.substr(0,n.lastIndexOf(".")),F.add(this.options.textNodeName,j),this.addChild(r,F,n,D)}else{if(P.length>0&&P.lastIndexOf("/")===P.length-1){if("/"===I[I.length-1]?(I=I.substr(0,I.length-1),n=n.substr(0,n.length-1),P=I):P=P.substr(0,P.length-1),this.options.transformTagName){var _=this.options.transformTagName(I);P===I&&(P=_),I=_}var k=new T(I);I!==P&&O&&(k[":@"]=this.buildAttributesMap(P,n)),this.addChild(r,k,n,D),n=n.substr(0,n.lastIndexOf("."))}else{var L=new T(I);this.tagsNodeStack.push(r),I!==P&&O&&(L[":@"]=this.buildAttributesMap(P,n)),this.addChild(r,L,n,D),r=L}i="",a=S}}else i+=t[a];return e.child};function R(t,e,r,i){this.options.captureMetaData||(i=void 0);var n=this.options.updateTag(e.tagname,r,e[":@"]);!1===n||("string"==typeof n?(e.tagname=n,t.addChild(e,i)):t.addChild(e,i))}var Y=function(t){if(this.options.processEntities){for(var e in this.docTypeEntities){var r=this.docTypeEntities[e];t=t.replace(r.regx,r.val)}for(var i in this.lastEntities){var n=this.lastEntities[i];t=t.replace(n.regex,n.val)}if(this.options.htmlEntities)for(var s in this.htmlEntities){var a=this.htmlEntities[s];t=t.replace(a.regex,a.val)}t=t.replace(this.ampEntity.regex,this.ampEntity.val)}return t};function G(t,e,r,i){return t&&(void 0===i&&(i=0===e.child.length),void 0!==(t=this.parseTextData(t,e.tagname,r,!1,!!e[":@"]&&0!==Object.keys(e[":@"]).length,i))&&""!==t&&e.add(this.options.textNodeName,t),t=""),t}function X(t,e,r,i){return!(!e||!e.has(i))||!(!t||!t.has(r))}function $(t,e,r,i){var n=t.indexOf(e,r);if(-1===n)throw new Error(i);return n+e.length-1}function W(t,e,r,i){void 0===i&&(i=">");var n=function(t,e,r){var i;void 0===r&&(r=">");for(var n="",s=e;s",r,e+" is not closed");if(t.substring(r+2,s).trim()===e&&0==--n)return{tagContent:t.substring(i,r),i:s};r=s}else if("?"===t[r+1])r=$(t,"?>",r+1,"StopNode is not closed.");else if("!--"===t.substr(r+1,3))r=$(t,"--\x3e",r+3,"StopNode is not closed.");else if("!["===t.substr(r+1,2))r=$(t,"]]>",r,"StopNode is not closed.")-2;else{var a=W(t,r,">");a&&((a&&a.tagName)===e&&"/"!==a.tagExp[a.tagExp.length-1]&&n++,r=a.closeIndex)}}function Z(t,e,r){if(e&&"string"==typeof t){var i=t.trim();return"true"===i||"false"!==i&&function(t,e={}){if(e=Object.assign({},C,e),!t||"string"!=typeof t)return t;let r=t.trim();if(void 0!==e.skipLike&&e.skipLike.test(r))return t;if("0"===t)return 0;if(e.hex&&O.test(r))return function(t){if(parseInt)return parseInt(t,16);if(Number.parseInt)return Number.parseInt(t,16);if(window&&window.parseInt)return window.parseInt(t,16);throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}(r);if(-1!==r.search(/.+[eE].+/))return function(t,e,r){if(!r.eNotation)return t;const i=e.match(V);if(i){let n=i[1]||"";const s=-1===i[3].indexOf("e")?"E":"e",a=i[2],o=n?t[a.length+1]===s:t[a.length]===s;return a.length>1&&o?t:1!==a.length||!i[3].startsWith(`.${s}`)&&i[3][0]!==s?r.leadingZeros&&!o?(e=(i[1]||"")+i[3],Number(e)):t:Number(e)}return t}(t,r,e);{const n=S.exec(r);if(n){const s=n[1]||"",a=n[2];let o=(i=n[3])&&-1!==i.indexOf(".")?("."===(i=i.replace(/0+$/,""))?i="0":"."===i[0]?i="0"+i:"."===i[i.length-1]&&(i=i.substring(0,i.length-1)),i):i;const l=s?"."===t[a.length+1]:"."===t[a.length];if(!e.leadingZeros&&(a.length>1||1===a.length&&!l))return t;{const i=Number(r),n=String(i);if(0===i||-0===i)return i;if(-1!==n.search(/[eE]/))return e.eNotation?i:t;if(-1!==r.indexOf("."))return"0"===n||n===o||n===`${s}${o}`?i:t;let l=a?o:r;return a?l===n||s+l===n?i:t:l===n||l===s+n?i:t}}return t}var i}(t,r)}return void 0!==t?t:""}function K(t,e,r){var i=Number.parseInt(t,e);return i>=0&&i<=1114111?String.fromCodePoint(i):r+t+";"}var Q=T.getMetaDataSymbol();function z(t,e){return J(t,e)}function J(t,e,r){for(var i,n={},s=0;s0&&(n[e.textNodeName]=i):void 0!==i&&(n[e.textNodeName]=i),n}function H(t){for(var e=Object.keys(t),r=0;r0&&(r="\n"),nt(t,e,"",r)}function nt(t,e,r,i){for(var n="",s=!1,a=0;a":n+=h+"/>":f&&0!==f.length||!e.suppressEmptyNode?f&&f.endsWith(">")?n+=h+">"+f+i+""+l+">":(n+=h+">",f&&""!==i&&(f.includes("/>")||f.includes(""))?n+=i+e.indentBy+f+i:n+=f,n+=""+l+">"):n+=h+"/>",s=!0}else{var p=at(o[":@"],e),g="?xml"===l?"":i,c=o[l][0][e.textNodeName];n+=g+"<"+l+(c=0!==c.length?" "+c:"")+p+"?>",s=!0}else n+=i+"\x3c!--"+o[l][0][e.textNodeName]+"--\x3e",s=!0;else s&&(n+=i),n+="",s=!1;else{var v=o[l];ot(u,e)||(v=lt(v=e.tagValueProcessor(l,v),e)),s&&(n+=i),n+=v,s=!1}}}return n}function st(t){for(var e=Object.keys(t),r=0;r0&&e.processEntities)for(var r=0;r","g"),val:">"},{regex:new RegExp("<","g"),val:"<"},{regex:new RegExp("'","g"),val:"'"},{regex:new RegExp('"',"g"),val:"""}],processEntities:!0,stopNodes:[],oneListGroup:!1};function dt(t){this.options=Object.assign({},ut,t),!0===this.options.ignoreAttributes||this.options.attributesGroupName?this.isAttribute=function(){return!1}:(this.ignoreAttributesFn=j(this.options.ignoreAttributes),this.attrPrefixLen=this.options.attributeNamePrefix.length,this.isAttribute=pt),this.processTextOrObjNode=ht,this.options.format?(this.indentate=ft,this.tagEndChar=">\n",this.newLine="\n"):(this.indentate=function(){return""},this.tagEndChar=">",this.newLine="")}function ht(t,e,r,i){var n=this.j2x(t,r+1,i.concat(e));return void 0!==t[this.options.textNodeName]&&1===Object.keys(t).length?this.buildTextValNode(t[this.options.textNodeName],e,n.attrStr,r):this.buildObjectNode(n.val,e,n.attrStr,r)}function ft(t){return this.options.indentBy.repeat(t)}function pt(t){return!(!t.startsWith(this.options.attributeNamePrefix)||t===this.options.textNodeName)&&t.substr(this.attrPrefixLen)}dt.prototype.build=function(t){return this.options.preserveOrder?it(t,this.options):(Array.isArray(t)&&this.options.arrayNodeName&&this.options.arrayNodeName.length>1&&((e={})[this.options.arrayNodeName]=t,t=e),this.j2x(t,0,[]).val);var e},dt.prototype.j2x=function(t,e,r){var i="",n="",s=r.join(".");for(var a in t)if(Object.prototype.hasOwnProperty.call(t,a))if(void 0===t[a])this.isAttribute(a)&&(n+="");else if(null===t[a])this.isAttribute(a)||a===this.options.cdataPropName?n+="":"?"===a[0]?n+=this.indentate(e)+"<"+a+"?"+this.tagEndChar:n+=this.indentate(e)+"<"+a+"/"+this.tagEndChar;else if(t[a]instanceof Date)n+=this.buildTextValNode(t[a],a,"",e);else if("object"!=typeof t[a]){var o=this.isAttribute(a);if(o&&!this.ignoreAttributesFn(o,s))i+=this.buildAttrPairStr(o,""+t[a]);else if(!o)if(a===this.options.textNodeName){var l=this.options.tagValueProcessor(a,""+t[a]);n+=this.replaceEntitiesValue(l)}else n+=this.buildTextValNode(t[a],a,"",e)}else if(Array.isArray(t[a])){for(var u=t[a].length,d="",h="",f=0;f"+t+n},dt.prototype.closeTag=function(t){var e="";return-1!==this.options.unpairedTags.indexOf(t)?this.options.suppressUnpairedNode||(e="/"):e=this.options.suppressEmptyNode?"/":">"+t,e},dt.prototype.buildTextValNode=function(t,e,r,i){if(!1!==this.options.cdataPropName&&e===this.options.cdataPropName)return this.indentate(i)+""+this.newLine;if(!1!==this.options.commentPropName&&e===this.options.commentPropName)return this.indentate(i)+"\x3c!--"+t+"--\x3e"+this.newLine;if("?"===e[0])return this.indentate(i)+"<"+e+r+"?"+this.tagEndChar;var n=this.options.tagValueProcessor(e,t);return""===(n=this.replaceEntitiesValue(n))?this.indentate(i)+"<"+e+r+this.closeTag(e)+this.tagEndChar:this.indentate(i)+"<"+e+r+">"+n+""+e+this.tagEndChar},dt.prototype.replaceEntitiesValue=function(t){if(t&&t.length>0&&this.options.processEntities)for(var e=0;e(()=>{"use strict";var t={d:(e,r)=>{for(var i in r)t.o(r,i)&&!t.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:r[i]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{XMLBuilder:()=>dt,XMLParser:()=>rt,XMLValidator:()=>gt});var r=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",i=new RegExp("^["+r+"]["+r+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$");function n(t,e){for(var r=[],i=e.exec(t);i;){var n=[];n.startIndex=e.lastIndex-i[0].length;for(var s=i.length,a=0;a"!==t[o]&&" "!==t[o]&&"\t"!==t[o]&&"\n"!==t[o]&&"\r"!==t[o];o++)g+=t[o];if("/"===(g=g.trim())[g.length-1]&&(g=g.substring(0,g.length-1),o--),!s(g))return m("InvalidTag",0===g.trim().length?"Invalid space after '<'.":"Tag '"+g+"' is an invalid name.",b(t,o));var x=p(t,o);if(!1===x)return m("InvalidAttr","Attributes for '"+g+"' have open quote.",b(t,o));var N=x.value;if(o=x.index,"/"===N[N.length-1]){var E=o-N.length,y=c(N=N.substring(0,N.length-1),e);if(!0!==y)return m(y.err.code,y.err.msg,b(t,E+y.err.line));i=!0}else if(f){if(!x.tagClosed)return m("InvalidTag","Closing tag '"+g+"' doesn't have proper closing.",b(t,o));if(N.trim().length>0)return m("InvalidTag","Closing tag '"+g+"' can't have attributes or invalid starting.",b(t,h));if(0===r.length)return m("InvalidTag","Closing tag '"+g+"' has not been opened.",b(t,h));var T=r.pop();if(g!==T.tagName){var w=b(t,T.tagStartPos);return m("InvalidTag","Expected closing tag '"+T.tagName+"' (opened in line "+w.line+", col "+w.col+") instead of closing tag '"+g+"'.",b(t,h))}0==r.length&&(n=!0)}else{var I=c(N,e);if(!0!==I)return m(I.err.code,I.err.msg,b(t,o-N.length+I.err.line));if(!0===n)return m("InvalidXml","Multiple possible root nodes found.",b(t,o));-1!==e.unpairedTags.indexOf(g)||r.push({tagName:g,tagStartPos:h}),i=!0}for(o++;o0)||m("InvalidXml","Invalid '"+JSON.stringify(r.map((function(t){return t.tagName})),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1}):m("InvalidXml","Start tag expected.",1)}function l(t){return" "===t||"\t"===t||"\n"===t||"\r"===t}function u(t,e){for(var r=e;e5&&"xml"===i)return m("InvalidXml","XML declaration allowed only at the start of the document.",b(t,e));if("?"==t[e]&&">"==t[e+1]){e++;break}}return e}function d(t,e){if(t.length>e+5&&"-"===t[e+1]&&"-"===t[e+2]){for(e+=3;e"===t[e+2]){e+=2;break}}else if(t.length>e+8&&"D"===t[e+1]&&"O"===t[e+2]&&"C"===t[e+3]&&"T"===t[e+4]&&"Y"===t[e+5]&&"P"===t[e+6]&&"E"===t[e+7]){var r=1;for(e+=8;e"===t[e]&&0==--r)break}else if(t.length>e+9&&"["===t[e+1]&&"C"===t[e+2]&&"D"===t[e+3]&&"A"===t[e+4]&&"T"===t[e+5]&&"A"===t[e+6]&&"["===t[e+7])for(e+=8;e"===t[e+2]){e+=2;break}return e}var h='"',f="'";function p(t,e){for(var r="",i="",n=!1;e"===t[e]&&""===i){n=!0;break}r+=t[e]}return""===i&&{value:r,index:e,tagClosed:n}}var g=new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");function c(t,e){for(var r=n(t,g),i={},s=0;s0?this.child.push(((r={})[t.tagname]=t.child,r[":@"]=t[":@"],r)):this.child.push(((i={})[t.tagname]=t.child,i)),void 0!==e&&(this.child[this.child.length-1][E]={startIndex:e})},t.getMetaDataSymbol=function(){return E},t}(),w=function(){function t(t){this.suppressValidationErr=!t}var e=t.prototype;return e.readDocType=function(t,e){var r={};if("O"!==t[e+3]||"C"!==t[e+4]||"T"!==t[e+5]||"Y"!==t[e+6]||"P"!==t[e+7]||"E"!==t[e+8])throw new Error("Invalid Tag instead of DOCTYPE");e+=9;for(var i=1,n=!1,s=!1;e"===t[e]){if(s?"-"===t[e-1]&&"-"===t[e-2]&&(s=!1,i--):i--,0===i)break}else"["===t[e]?n=!0:t[e];else{if(n&&A(t,"!ENTITY",e)){e+=7;var a=void 0,o=void 0,l=this.readEntityExp(t,e+1,this.suppressValidationErr);if(a=l[0],o=l[1],e=l[2],-1===o.indexOf("&")){var u=a.replace(/[.\-+*:]/g,"\\.");r[a]={regx:RegExp("&"+u+";","g"),val:o}}}else if(n&&A(t,"!ELEMENT",e))e+=8,e=this.readElementExp(t,e+1).index;else if(n&&A(t,"!ATTLIST",e))e+=8;else if(n&&A(t,"!NOTATION",e))e+=9,e=this.readNotationExp(t,e+1,this.suppressValidationErr).index;else{if(!A(t,"!--",e))throw new Error("Invalid DOCTYPE");s=!0}i++}if(0!==i)throw new Error("Unclosed DOCTYPE");return{entities:r,i:e}},e.readEntityExp=function(t,e){e=I(t,e);for(var r="";et.length)&&(e=t.length);for(var r=0,i=Array(e);r=t.length?{done:!0}:{done:!1,value:t[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(t);!(r=i()).done;){var n=r.value;if("string"==typeof n&&e===n)return!0;if(n instanceof RegExp&&n.test(e))return!0}}:function(){return!1}}var M=function(t){if(this.options=t,this.currentNode=null,this.tagsNodeStack=[],this.docTypeEntities={},this.lastEntities={apos:{regex:/&(apos|#39|#x27);/g,val:"'"},gt:{regex:/&(gt|#62|#x3E);/g,val:">"},lt:{regex:/&(lt|#60|#x3C);/g,val:"<"},quot:{regex:/&(quot|#34|#x22);/g,val:'"'}},this.ampEntity={regex:/&(amp|#38|#x26);/g,val:"&"},this.htmlEntities={space:{regex:/&(nbsp|#160);/g,val:" "},cent:{regex:/&(cent|#162);/g,val:"¢"},pound:{regex:/&(pound|#163);/g,val:"£"},yen:{regex:/&(yen|#165);/g,val:"¥"},euro:{regex:/&(euro|#8364);/g,val:"€"},copyright:{regex:/&(copy|#169);/g,val:"©"},reg:{regex:/&(reg|#174);/g,val:"®"},inr:{regex:/&(inr|#8377);/g,val:"₹"},num_dec:{regex:/([0-9]{1,7});/g,val:function(t,e){return K(e,10,"")}},num_hex:{regex:/([0-9a-fA-F]{1,6});/g,val:function(t,e){return K(e,16,"")}}},this.addExternalEntities=F,this.parseXml=B,this.parseTextData=_,this.resolveNameSpace=k,this.buildAttributesMap=U,this.isItStopNode=X,this.replaceEntitiesValue=Y,this.readStopNodeData=q,this.saveTextToParentTag=G,this.addChild=R,this.ignoreAttributesFn=j(this.options.ignoreAttributes),this.options.stopNodes&&this.options.stopNodes.length>0){this.stopNodesExact=new Set,this.stopNodesWildcard=new Set;for(var e=0;e0)){a||(t=this.replaceEntitiesValue(t));var o=this.options.tagValueProcessor(e,t,r,n,s);return null==o?t:typeof o!=typeof t||o!==t?o:this.options.trimValues||t.trim()===t?Z(t,this.options.parseTagValue,this.options.numberParseOptions):t}}function k(t){if(this.options.removeNSPrefix){var e=t.split(":"),r="/"===t.charAt(0)?"/":"";if("xmlns"===e[0])return"";2===e.length&&(t=r+e[1])}return t}var L=new RegExp("([^\\s=]+)\\s*(=\\s*(['\"])([\\s\\S]*?)\\3)?","gm");function U(t,e){if(!0!==this.options.ignoreAttributes&&"string"==typeof t){for(var r=n(t,L),i=r.length,s={},a=0;a",a,"Closing Tag is not closed."),l=t.substring(a+2,o).trim();if(this.options.removeNSPrefix){var u=l.indexOf(":");-1!==u&&(l=l.substr(u+1))}this.options.transformTagName&&(l=this.options.transformTagName(l)),r&&(i=this.saveTextToParentTag(i,r,n));var d=n.substring(n.lastIndexOf(".")+1);if(l&&-1!==this.options.unpairedTags.indexOf(l))throw new Error("Unpaired tag can not be used as closing tag: "+l+">");var h=0;d&&-1!==this.options.unpairedTags.indexOf(d)?(h=n.lastIndexOf(".",n.lastIndexOf(".")-1),this.tagsNodeStack.pop()):h=n.lastIndexOf("."),n=n.substring(0,h),r=this.tagsNodeStack.pop(),i="",a=o}else if("?"===t[a+1]){var f=W(t,a,!1,"?>");if(!f)throw new Error("Pi Tag is not closed.");if(i=this.saveTextToParentTag(i,r,n),this.options.ignoreDeclaration&&"?xml"===f.tagName||this.options.ignorePiTags);else{var p=new T(f.tagName);p.add(this.options.textNodeName,""),f.tagName!==f.tagExp&&f.attrExpPresent&&(p[":@"]=this.buildAttributesMap(f.tagExp,n)),this.addChild(r,p,n,a)}a=f.closeIndex+1}else if("!--"===t.substr(a+1,3)){var g=$(t,"--\x3e",a+4,"Comment is not closed.");if(this.options.commentPropName){var c,v=t.substring(a+4,g-2);i=this.saveTextToParentTag(i,r,n),r.add(this.options.commentPropName,[(c={},c[this.options.textNodeName]=v,c)])}a=g}else if("!D"===t.substr(a+1,2)){var m=s.readDocType(t,a);this.docTypeEntities=m.entities,a=m.i}else if("!["===t.substr(a+1,2)){var x=$(t,"]]>",a,"CDATA is not closed.")-2,b=t.substring(a+9,x);i=this.saveTextToParentTag(i,r,n);var N,E=this.parseTextData(b,r.tagname,n,!0,!1,!0,!0);null==E&&(E=""),this.options.cdataPropName?r.add(this.options.cdataPropName,[(N={},N[this.options.textNodeName]=b,N)]):r.add(this.options.textNodeName,E),a=x+2}else{var y=W(t,a,this.options.removeNSPrefix),I=y.tagName,A=y.rawTagName,P=y.tagExp,O=y.attrExpPresent,S=y.closeIndex;if(this.options.transformTagName){var C=this.options.transformTagName(I);P===I&&(P=C),I=C}r&&i&&"!xml"!==r.tagname&&(i=this.saveTextToParentTag(i,r,n,!1));var V=r;V&&-1!==this.options.unpairedTags.indexOf(V.tagname)&&(r=this.tagsNodeStack.pop(),n=n.substring(0,n.lastIndexOf("."))),I!==e.tagname&&(n+=n?"."+I:I);var D=a;if(this.isItStopNode(this.stopNodesExact,this.stopNodesWildcard,n,I)){var j="";if(P.length>0&&P.lastIndexOf("/")===P.length-1)"/"===I[I.length-1]?(I=I.substr(0,I.length-1),n=n.substr(0,n.length-1),P=I):P=P.substr(0,P.length-1),a=y.closeIndex;else if(-1!==this.options.unpairedTags.indexOf(I))a=y.closeIndex;else{var M=this.readStopNodeData(t,A,S+1);if(!M)throw new Error("Unexpected end of "+A);a=M.i,j=M.tagContent}var F=new T(I);I!==P&&O&&(F[":@"]=this.buildAttributesMap(P,n)),j&&(j=this.parseTextData(j,I,n,!0,O,!0,!0)),n=n.substr(0,n.lastIndexOf(".")),F.add(this.options.textNodeName,j),this.addChild(r,F,n,D)}else{if(P.length>0&&P.lastIndexOf("/")===P.length-1){if("/"===I[I.length-1]?(I=I.substr(0,I.length-1),n=n.substr(0,n.length-1),P=I):P=P.substr(0,P.length-1),this.options.transformTagName){var _=this.options.transformTagName(I);P===I&&(P=_),I=_}var k=new T(I);I!==P&&O&&(k[":@"]=this.buildAttributesMap(P,n)),this.addChild(r,k,n,D),n=n.substr(0,n.lastIndexOf("."))}else{var L=new T(I);this.tagsNodeStack.push(r),I!==P&&O&&(L[":@"]=this.buildAttributesMap(P,n)),this.addChild(r,L,n,D),r=L}i="",a=S}}else i+=t[a];return e.child};function R(t,e,r,i){this.options.captureMetaData||(i=void 0);var n=this.options.updateTag(e.tagname,r,e[":@"]);!1===n||("string"==typeof n?(e.tagname=n,t.addChild(e,i)):t.addChild(e,i))}var Y=function(t){if(this.options.processEntities){for(var e in this.docTypeEntities){var r=this.docTypeEntities[e];t=t.replace(r.regx,r.val)}for(var i in this.lastEntities){var n=this.lastEntities[i];t=t.replace(n.regex,n.val)}if(this.options.htmlEntities)for(var s in this.htmlEntities){var a=this.htmlEntities[s];t=t.replace(a.regex,a.val)}t=t.replace(this.ampEntity.regex,this.ampEntity.val)}return t};function G(t,e,r,i){return t&&(void 0===i&&(i=0===e.child.length),void 0!==(t=this.parseTextData(t,e.tagname,r,!1,!!e[":@"]&&0!==Object.keys(e[":@"]).length,i))&&""!==t&&e.add(this.options.textNodeName,t),t=""),t}function X(t,e,r,i){return!(!e||!e.has(i))||!(!t||!t.has(r))}function $(t,e,r,i){var n=t.indexOf(e,r);if(-1===n)throw new Error(i);return n+e.length-1}function W(t,e,r,i){void 0===i&&(i=">");var n=function(t,e,r){var i;void 0===r&&(r=">");for(var n="",s=e;s",r,e+" is not closed");if(t.substring(r+2,s).trim()===e&&0==--n)return{tagContent:t.substring(i,r),i:s};r=s}else if("?"===t[r+1])r=$(t,"?>",r+1,"StopNode is not closed.");else if("!--"===t.substr(r+1,3))r=$(t,"--\x3e",r+3,"StopNode is not closed.");else if("!["===t.substr(r+1,2))r=$(t,"]]>",r,"StopNode is not closed.")-2;else{var a=W(t,r,">");a&&((a&&a.tagName)===e&&"/"!==a.tagExp[a.tagExp.length-1]&&n++,r=a.closeIndex)}}function Z(t,e,r){if(e&&"string"==typeof t){var i=t.trim();return"true"===i||"false"!==i&&function(t,e={}){if(e=Object.assign({},C,e),!t||"string"!=typeof t)return t;let r=t.trim();if(void 0!==e.skipLike&&e.skipLike.test(r))return t;if("0"===t)return 0;if(e.hex&&O.test(r))return function(t){if(parseInt)return parseInt(t,16);if(Number.parseInt)return Number.parseInt(t,16);if(window&&window.parseInt)return window.parseInt(t,16);throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}(r);if(-1!==r.search(/.+[eE].+/))return function(t,e,r){if(!r.eNotation)return t;const i=e.match(V);if(i){let n=i[1]||"";const s=-1===i[3].indexOf("e")?"E":"e",a=i[2],o=n?t[a.length+1]===s:t[a.length]===s;return a.length>1&&o?t:1!==a.length||!i[3].startsWith(`.${s}`)&&i[3][0]!==s?r.leadingZeros&&!o?(e=(i[1]||"")+i[3],Number(e)):t:Number(e)}return t}(t,r,e);{const n=S.exec(r);if(n){const s=n[1]||"",a=n[2];let o=(i=n[3])&&-1!==i.indexOf(".")?("."===(i=i.replace(/0+$/,""))?i="0":"."===i[0]?i="0"+i:"."===i[i.length-1]&&(i=i.substring(0,i.length-1)),i):i;const l=s?"."===t[a.length+1]:"."===t[a.length];if(!e.leadingZeros&&(a.length>1||1===a.length&&!l))return t;{const i=Number(r),n=String(i);if(0===i||-0===i)return i;if(-1!==n.search(/[eE]/))return e.eNotation?i:t;if(-1!==r.indexOf("."))return"0"===n||n===o||n===`${s}${o}`?i:t;let l=a?o:r;return a?l===n||s+l===n?i:t:l===n||l===s+n?i:t}}return t}var i}(t,r)}return void 0!==t?t:""}function K(t,e,r){var i=Number.parseInt(t,e);return i>=0&&i<=1114111?String.fromCodePoint(i):r+t+";"}var Q=T.getMetaDataSymbol();function z(t,e){return J(t,e)}function J(t,e,r){for(var i,n={},s=0;s0&&(n[e.textNodeName]=i):void 0!==i&&(n[e.textNodeName]=i),n}function H(t){for(var e=Object.keys(t),r=0;r0&&(r="\n"),nt(t,e,"",r)}function nt(t,e,r,i){for(var n="",s=!1,a=0;a":n+=h+"/>":f&&0!==f.length||!e.suppressEmptyNode?f&&f.endsWith(">")?n+=h+">"+f+i+""+l+">":(n+=h+">",f&&""!==i&&(f.includes("/>")||f.includes(""))?n+=i+e.indentBy+f+i:n+=f,n+=""+l+">"):n+=h+"/>",s=!0}else{var p=at(o[":@"],e),g="?xml"===l?"":i,c=o[l][0][e.textNodeName];n+=g+"<"+l+(c=0!==c.length?" "+c:"")+p+"?>",s=!0}else n+=i+"\x3c!--"+o[l][0][e.textNodeName]+"--\x3e",s=!0;else s&&(n+=i),n+="",s=!1;else{var v=o[l];ot(u,e)||(v=lt(v=e.tagValueProcessor(l,v),e)),s&&(n+=i),n+=v,s=!1}}}return n}function st(t){for(var e=Object.keys(t),r=0;r0&&e.processEntities)for(var r=0;r","g"),val:">"},{regex:new RegExp("<","g"),val:"<"},{regex:new RegExp("'","g"),val:"'"},{regex:new RegExp('"',"g"),val:"""}],processEntities:!0,stopNodes:[],oneListGroup:!1};function dt(t){this.options=Object.assign({},ut,t),!0===this.options.ignoreAttributes||this.options.attributesGroupName?this.isAttribute=function(){return!1}:(this.ignoreAttributesFn=j(this.options.ignoreAttributes),this.attrPrefixLen=this.options.attributeNamePrefix.length,this.isAttribute=pt),this.processTextOrObjNode=ht,this.options.format?(this.indentate=ft,this.tagEndChar=">\n",this.newLine="\n"):(this.indentate=function(){return""},this.tagEndChar=">",this.newLine="")}function ht(t,e,r,i){var n=this.j2x(t,r+1,i.concat(e));return void 0!==t[this.options.textNodeName]&&1===Object.keys(t).length?this.buildTextValNode(t[this.options.textNodeName],e,n.attrStr,r):this.buildObjectNode(n.val,e,n.attrStr,r)}function ft(t){return this.options.indentBy.repeat(t)}function pt(t){return!(!t.startsWith(this.options.attributeNamePrefix)||t===this.options.textNodeName)&&t.substr(this.attrPrefixLen)}dt.prototype.build=function(t){return this.options.preserveOrder?it(t,this.options):(Array.isArray(t)&&this.options.arrayNodeName&&this.options.arrayNodeName.length>1&&((e={})[this.options.arrayNodeName]=t,t=e),this.j2x(t,0,[]).val);var e},dt.prototype.j2x=function(t,e,r){var i="",n="",s=r.join(".");for(var a in t)if(Object.prototype.hasOwnProperty.call(t,a))if(void 0===t[a])this.isAttribute(a)&&(n+="");else if(null===t[a])this.isAttribute(a)||a===this.options.cdataPropName?n+="":"?"===a[0]?n+=this.indentate(e)+"<"+a+"?"+this.tagEndChar:n+=this.indentate(e)+"<"+a+"/"+this.tagEndChar;else if(t[a]instanceof Date)n+=this.buildTextValNode(t[a],a,"",e);else if("object"!=typeof t[a]){var o=this.isAttribute(a);if(o&&!this.ignoreAttributesFn(o,s))i+=this.buildAttrPairStr(o,""+t[a]);else if(!o)if(a===this.options.textNodeName){var l=this.options.tagValueProcessor(a,""+t[a]);n+=this.replaceEntitiesValue(l)}else n+=this.buildTextValNode(t[a],a,"",e)}else if(Array.isArray(t[a])){for(var u=t[a].length,d="",h="",f=0;f"+t+n},dt.prototype.closeTag=function(t){var e="";return-1!==this.options.unpairedTags.indexOf(t)?this.options.suppressUnpairedNode||(e="/"):e=this.options.suppressEmptyNode?"/":">"+t,e},dt.prototype.buildTextValNode=function(t,e,r,i){if(!1!==this.options.cdataPropName&&e===this.options.cdataPropName)return this.indentate(i)+""+this.newLine;if(!1!==this.options.commentPropName&&e===this.options.commentPropName)return this.indentate(i)+"\x3c!--"+t+"--\x3e"+this.newLine;if("?"===e[0])return this.indentate(i)+"<"+e+r+"?"+this.tagEndChar;var n=this.options.tagValueProcessor(e,t);return""===(n=this.replaceEntitiesValue(n))?this.indentate(i)+"<"+e+r+this.closeTag(e)+this.tagEndChar:this.indentate(i)+"<"+e+r+">"+n+""+e+this.tagEndChar},dt.prototype.replaceEntitiesValue=function(t){if(t&&t.length>0&&this.options.processEntities)for(var e=0;e {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","'use strict';\n\nconst nameStartChar = ':A-Za-z_\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD';\nconst nameChar = nameStartChar + '\\\\-.\\\\d\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040';\nexport const nameRegexp = '[' + nameStartChar + '][' + nameChar + ']*';\nconst regexName = new RegExp('^' + nameRegexp + '$');\n\nexport function getAllMatches(string, regex) {\n const matches = [];\n let match = regex.exec(string);\n while (match) {\n const allmatches = [];\n allmatches.startIndex = regex.lastIndex - match[0].length;\n const len = match.length;\n for (let index = 0; index < len; index++) {\n allmatches.push(match[index]);\n }\n matches.push(allmatches);\n match = regex.exec(string);\n }\n return matches;\n}\n\nexport const isName = function(string) {\n const match = regexName.exec(string);\n return !(match === null || typeof match === 'undefined');\n}\n\nexport function isExist(v) {\n return typeof v !== 'undefined';\n}\n\nexport function isEmptyObject(obj) {\n return Object.keys(obj).length === 0;\n}\n\n/**\n * Copy all the properties of a into b.\n * @param {*} target\n * @param {*} a\n */\nexport function merge(target, a, arrayMode) {\n if (a) {\n const keys = Object.keys(a); // will return an array of own properties\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n if (arrayMode === 'strict') {\n target[keys[i]] = [ a[keys[i]] ];\n } else {\n target[keys[i]] = a[keys[i]];\n }\n }\n }\n}\n/* exports.merge =function (b,a){\n return Object.assign(b,a);\n} */\n\nexport function getValue(v) {\n if (exports.isExist(v)) {\n return v;\n } else {\n return '';\n }\n}\n\n// const fakeCall = function(a) {return a;};\n// const fakeCallNoReturn = function() {};","'use strict';\n\nimport {getAllMatches, isName} from './util.js';\n\nconst defaultOptions = {\n allowBooleanAttributes: false, //A tag can have attributes without any value\n unpairedTags: []\n};\n\n//const tagsPattern = new RegExp(\"<\\\\/?([\\\\w:\\\\-_\\.]+)\\\\s*\\/?>\",\"g\");\nexport function validate(xmlData, options) {\n options = Object.assign({}, defaultOptions, options);\n\n //xmlData = xmlData.replace(/(\\r\\n|\\n|\\r)/gm,\"\");//make it single line\n //xmlData = xmlData.replace(/(^\\s*<\\?xml.*?\\?>)/g,\"\");//Remove XML starting tag\n //xmlData = xmlData.replace(/()/g,\"\");//Remove DOCTYPE\n const tags = [];\n let tagFound = false;\n\n //indicates that the root tag has been closed (aka. depth 0 has been reached)\n let reachedRoot = false;\n\n if (xmlData[0] === '\\ufeff') {\n // check for byte order mark (BOM)\n xmlData = xmlData.substr(1);\n }\n \n for (let i = 0; i < xmlData.length; i++) {\n\n if (xmlData[i] === '<' && xmlData[i+1] === '?') {\n i+=2;\n i = readPI(xmlData,i);\n if (i.err) return i;\n }else if (xmlData[i] === '<') {\n //starting of tag\n //read until you reach to '>' avoiding any '>' in attribute value\n let tagStartPos = i;\n i++;\n \n if (xmlData[i] === '!') {\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else {\n let closingTag = false;\n if (xmlData[i] === '/') {\n //closing tag\n closingTag = true;\n i++;\n }\n //read tagname\n let tagName = '';\n for (; i < xmlData.length &&\n xmlData[i] !== '>' &&\n xmlData[i] !== ' ' &&\n xmlData[i] !== '\\t' &&\n xmlData[i] !== '\\n' &&\n xmlData[i] !== '\\r'; i++\n ) {\n tagName += xmlData[i];\n }\n tagName = tagName.trim();\n //console.log(tagName);\n\n if (tagName[tagName.length - 1] === '/') {\n //self closing tag without attributes\n tagName = tagName.substring(0, tagName.length - 1);\n //continue;\n i--;\n }\n if (!validateTagName(tagName)) {\n let msg;\n if (tagName.trim().length === 0) {\n msg = \"Invalid space after '<'.\";\n } else {\n msg = \"Tag '\"+tagName+\"' is an invalid name.\";\n }\n return getErrorObject('InvalidTag', msg, getLineNumberForPosition(xmlData, i));\n }\n\n const result = readAttributeStr(xmlData, i);\n if (result === false) {\n return getErrorObject('InvalidAttr', \"Attributes for '\"+tagName+\"' have open quote.\", getLineNumberForPosition(xmlData, i));\n }\n let attrStr = result.value;\n i = result.index;\n\n if (attrStr[attrStr.length - 1] === '/') {\n //self closing tag\n const attrStrStart = i - attrStr.length;\n attrStr = attrStr.substring(0, attrStr.length - 1);\n const isValid = validateAttributeString(attrStr, options);\n if (isValid === true) {\n tagFound = true;\n //continue; //text may presents after self closing tag\n } else {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, attrStrStart + isValid.err.line));\n }\n } else if (closingTag) {\n if (!result.tagClosed) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' doesn't have proper closing.\", getLineNumberForPosition(xmlData, i));\n } else if (attrStr.trim().length > 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' can't have attributes or invalid starting.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else if (tags.length === 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' has not been opened.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else {\n const otg = tags.pop();\n if (tagName !== otg.tagName) {\n let openPos = getLineNumberForPosition(xmlData, otg.tagStartPos);\n return getErrorObject('InvalidTag',\n \"Expected closing tag '\"+otg.tagName+\"' (opened in line \"+openPos.line+\", col \"+openPos.col+\") instead of closing tag '\"+tagName+\"'.\",\n getLineNumberForPosition(xmlData, tagStartPos));\n }\n\n //when there are no more tags, we reached the root level.\n if (tags.length == 0) {\n reachedRoot = true;\n }\n }\n } else {\n const isValid = validateAttributeString(attrStr, options);\n if (isValid !== true) {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, i - attrStr.length + isValid.err.line));\n }\n\n //if the root level has been reached before ...\n if (reachedRoot === true) {\n return getErrorObject('InvalidXml', 'Multiple possible root nodes found.', getLineNumberForPosition(xmlData, i));\n } else if(options.unpairedTags.indexOf(tagName) !== -1){\n //don't push into stack\n } else {\n tags.push({tagName, tagStartPos});\n }\n tagFound = true;\n }\n\n //skip tag text value\n //It may include comments and CDATA value\n for (i++; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n if (xmlData[i + 1] === '!') {\n //comment or CADATA\n i++;\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else if (xmlData[i+1] === '?') {\n i = readPI(xmlData, ++i);\n if (i.err) return i;\n } else{\n break;\n }\n } else if (xmlData[i] === '&') {\n const afterAmp = validateAmpersand(xmlData, i);\n if (afterAmp == -1)\n return getErrorObject('InvalidChar', \"char '&' is not expected.\", getLineNumberForPosition(xmlData, i));\n i = afterAmp;\n }else{\n if (reachedRoot === true && !isWhiteSpace(xmlData[i])) {\n return getErrorObject('InvalidXml', \"Extra text at the end\", getLineNumberForPosition(xmlData, i));\n }\n }\n } //end of reading tag text value\n if (xmlData[i] === '<') {\n i--;\n }\n }\n } else {\n if ( isWhiteSpace(xmlData[i])) {\n continue;\n }\n return getErrorObject('InvalidChar', \"char '\"+xmlData[i]+\"' is not expected.\", getLineNumberForPosition(xmlData, i));\n }\n }\n\n if (!tagFound) {\n return getErrorObject('InvalidXml', 'Start tag expected.', 1);\n }else if (tags.length == 1) {\n return getErrorObject('InvalidTag', \"Unclosed tag '\"+tags[0].tagName+\"'.\", getLineNumberForPosition(xmlData, tags[0].tagStartPos));\n }else if (tags.length > 0) {\n return getErrorObject('InvalidXml', \"Invalid '\"+\n JSON.stringify(tags.map(t => t.tagName), null, 4).replace(/\\r?\\n/g, '')+\n \"' found.\", {line: 1, col: 1});\n }\n\n return true;\n};\n\nfunction isWhiteSpace(char){\n return char === ' ' || char === '\\t' || char === '\\n' || char === '\\r';\n}\n/**\n * Read Processing insstructions and skip\n * @param {*} xmlData\n * @param {*} i\n */\nfunction readPI(xmlData, i) {\n const start = i;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] == '?' || xmlData[i] == ' ') {\n //tagname\n const tagname = xmlData.substr(start, i - start);\n if (i > 5 && tagname === 'xml') {\n return getErrorObject('InvalidXml', 'XML declaration allowed only at the start of the document.', getLineNumberForPosition(xmlData, i));\n } else if (xmlData[i] == '?' && xmlData[i + 1] == '>') {\n //check if valid attribut string\n i++;\n break;\n } else {\n continue;\n }\n }\n }\n return i;\n}\n\nfunction readCommentAndCDATA(xmlData, i) {\n if (xmlData.length > i + 5 && xmlData[i + 1] === '-' && xmlData[i + 2] === '-') {\n //comment\n for (i += 3; i < xmlData.length; i++) {\n if (xmlData[i] === '-' && xmlData[i + 1] === '-' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n } else if (\n xmlData.length > i + 8 &&\n xmlData[i + 1] === 'D' &&\n xmlData[i + 2] === 'O' &&\n xmlData[i + 3] === 'C' &&\n xmlData[i + 4] === 'T' &&\n xmlData[i + 5] === 'Y' &&\n xmlData[i + 6] === 'P' &&\n xmlData[i + 7] === 'E'\n ) {\n let angleBracketsCount = 1;\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n angleBracketsCount++;\n } else if (xmlData[i] === '>') {\n angleBracketsCount--;\n if (angleBracketsCount === 0) {\n break;\n }\n }\n }\n } else if (\n xmlData.length > i + 9 &&\n xmlData[i + 1] === '[' &&\n xmlData[i + 2] === 'C' &&\n xmlData[i + 3] === 'D' &&\n xmlData[i + 4] === 'A' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'A' &&\n xmlData[i + 7] === '['\n ) {\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === ']' && xmlData[i + 1] === ']' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n }\n\n return i;\n}\n\nconst doubleQuote = '\"';\nconst singleQuote = \"'\";\n\n/**\n * Keep reading xmlData until '<' is found outside the attribute value.\n * @param {string} xmlData\n * @param {number} i\n */\nfunction readAttributeStr(xmlData, i) {\n let attrStr = '';\n let startChar = '';\n let tagClosed = false;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === doubleQuote || xmlData[i] === singleQuote) {\n if (startChar === '') {\n startChar = xmlData[i];\n } else if (startChar !== xmlData[i]) {\n //if vaue is enclosed with double quote then single quotes are allowed inside the value and vice versa\n } else {\n startChar = '';\n }\n } else if (xmlData[i] === '>') {\n if (startChar === '') {\n tagClosed = true;\n break;\n }\n }\n attrStr += xmlData[i];\n }\n if (startChar !== '') {\n return false;\n }\n\n return {\n value: attrStr,\n index: i,\n tagClosed: tagClosed\n };\n}\n\n/**\n * Select all the attributes whether valid or invalid.\n */\nconst validAttrStrRegxp = new RegExp('(\\\\s*)([^\\\\s=]+)(\\\\s*=)?(\\\\s*([\\'\"])(([\\\\s\\\\S])*?)\\\\5)?', 'g');\n\n//attr, =\"sd\", a=\"amit's\", a=\"sd\"b=\"saf\", ab cd=\"\"\n\nfunction validateAttributeString(attrStr, options) {\n //console.log(\"start:\"+attrStr+\":end\");\n\n //if(attrStr.trim().length === 0) return true; //empty string\n\n const matches = getAllMatches(attrStr, validAttrStrRegxp);\n const attrNames = {};\n\n for (let i = 0; i < matches.length; i++) {\n if (matches[i][1].length === 0) {\n //nospace before attribute name: a=\"sd\"b=\"saf\"\n return getErrorObject('InvalidAttr', \"Attribute '\"+matches[i][2]+\"' has no space in starting.\", getPositionFromMatch(matches[i]))\n } else if (matches[i][3] !== undefined && matches[i][4] === undefined) {\n return getErrorObject('InvalidAttr', \"Attribute '\"+matches[i][2]+\"' is without value.\", getPositionFromMatch(matches[i]));\n } else if (matches[i][3] === undefined && !options.allowBooleanAttributes) {\n //independent attribute: ab\n return getErrorObject('InvalidAttr', \"boolean attribute '\"+matches[i][2]+\"' is not allowed.\", getPositionFromMatch(matches[i]));\n }\n /* else if(matches[i][6] === undefined){//attribute without value: ab=\n return { err: { code:\"InvalidAttr\",msg:\"attribute \" + matches[i][2] + \" has no value assigned.\"}};\n } */\n const attrName = matches[i][2];\n if (!validateAttrName(attrName)) {\n return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is an invalid name.\", getPositionFromMatch(matches[i]));\n }\n if (!attrNames.hasOwnProperty(attrName)) {\n //check for duplicate attribute.\n attrNames[attrName] = 1;\n } else {\n return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is repeated.\", getPositionFromMatch(matches[i]));\n }\n }\n\n return true;\n}\n\nfunction validateNumberAmpersand(xmlData, i) {\n let re = /\\d/;\n if (xmlData[i] === 'x') {\n i++;\n re = /[\\da-fA-F]/;\n }\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === ';')\n return i;\n if (!xmlData[i].match(re))\n break;\n }\n return -1;\n}\n\nfunction validateAmpersand(xmlData, i) {\n // https://www.w3.org/TR/xml/#dt-charref\n i++;\n if (xmlData[i] === ';')\n return -1;\n if (xmlData[i] === '#') {\n i++;\n return validateNumberAmpersand(xmlData, i);\n }\n let count = 0;\n for (; i < xmlData.length; i++, count++) {\n if (xmlData[i].match(/\\w/) && count < 20)\n continue;\n if (xmlData[i] === ';')\n break;\n return -1;\n }\n return i;\n}\n\nfunction getErrorObject(code, message, lineNumber) {\n return {\n err: {\n code: code,\n msg: message,\n line: lineNumber.line || lineNumber,\n col: lineNumber.col,\n },\n };\n}\n\nfunction validateAttrName(attrName) {\n return isName(attrName);\n}\n\n// const startsWithXML = /^xml/i;\n\nfunction validateTagName(tagname) {\n return isName(tagname) /* && !tagname.match(startsWithXML) */;\n}\n\n//this function returns the line number for the character at the given index\nfunction getLineNumberForPosition(xmlData, index) {\n const lines = xmlData.substring(0, index).split(/\\r?\\n/);\n return {\n line: lines.length,\n\n // column number is last line's length + 1, because column numbering starts at 1:\n col: lines[lines.length - 1].length + 1\n };\n}\n\n//this function returns the position of the first character of match within attrStr\nfunction getPositionFromMatch(match) {\n return match.startIndex + match[1].length;\n}\n","\nexport const defaultOptions = {\n preserveOrder: false,\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n removeNSPrefix: false, // remove NS from tag name or attribute name if true\n allowBooleanAttributes: false, //a tag can have attributes without any value\n //ignoreRootElement : false,\n parseTagValue: true,\n parseAttributeValue: false,\n trimValues: true, //Trim string values of tag and attributes\n cdataPropName: false,\n numberParseOptions: {\n hex: true,\n leadingZeros: true,\n eNotation: true\n },\n tagValueProcessor: function(tagName, val) {\n return val;\n },\n attributeValueProcessor: function(attrName, val) {\n return val;\n },\n stopNodes: [], //nested tags will not be parsed even for errors\n alwaysCreateTextNode: false,\n isArray: () => false,\n commentPropName: false,\n unpairedTags: [],\n processEntities: true,\n htmlEntities: false,\n ignoreDeclaration: false,\n ignorePiTags: false,\n transformTagName: false,\n transformAttributeName: false,\n updateTag: function(tagName, jPath, attrs){\n return tagName\n },\n // skipEmptyListItem: false\n captureMetaData: false,\n};\n \nexport const buildOptions = function(options) {\n return Object.assign({}, defaultOptions, options);\n};\n","'use strict';\n\nlet METADATA_SYMBOL;\n\nif (typeof Symbol !== \"function\") {\n METADATA_SYMBOL = \"@@xmlMetadata\";\n} else {\n METADATA_SYMBOL = Symbol(\"XML Node Metadata\");\n}\n\nexport default class XmlNode{\n constructor(tagname) {\n this.tagname = tagname;\n this.child = []; //nested tags, text, cdata, comments in order\n this[\":@\"] = {}; //attributes map\n }\n add(key,val){\n // this.child.push( {name : key, val: val, isCdata: isCdata });\n if(key === \"__proto__\") key = \"#__proto__\";\n this.child.push( {[key]: val });\n }\n addChild(node, startIndex) {\n if(node.tagname === \"__proto__\") node.tagname = \"#__proto__\";\n if(node[\":@\"] && Object.keys(node[\":@\"]).length > 0){\n this.child.push( { [node.tagname]: node.child, [\":@\"]: node[\":@\"] });\n }else{\n this.child.push( { [node.tagname]: node.child });\n }\n // if requested, add the startIndex\n if (startIndex !== undefined) {\n // Note: for now we just overwrite the metadata. If we had more complex metadata,\n // we might need to do an object append here: metadata = { ...metadata, startIndex }\n this.child[this.child.length - 1][METADATA_SYMBOL] = { startIndex };\n }\n }\n /** symbol used for metadata */\n static getMetaDataSymbol() {\n return METADATA_SYMBOL;\n }\n}\n","import {isName} from '../util.js';\n\nexport default class DocTypeReader{\n constructor(processEntities){\n this.suppressValidationErr = !processEntities;\n }\n \n readDocType(xmlData, i){\n \n const entities = {};\n if( xmlData[i + 3] === 'O' &&\n xmlData[i + 4] === 'C' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'Y' &&\n xmlData[i + 7] === 'P' &&\n xmlData[i + 8] === 'E')\n { \n i = i+9;\n let angleBracketsCount = 1;\n let hasBody = false, comment = false;\n let exp = \"\";\n for(;i') { //Read tag content\n if(comment){\n if( xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\"){\n comment = false;\n angleBracketsCount--;\n }\n }else{\n angleBracketsCount--;\n }\n if (angleBracketsCount === 0) {\n break;\n }\n }else if( xmlData[i] === '['){\n hasBody = true;\n }else{\n exp += xmlData[i];\n }\n }\n if(angleBracketsCount !== 0){\n throw new Error(`Unclosed DOCTYPE`);\n }\n }else{\n throw new Error(`Invalid Tag instead of DOCTYPE`);\n }\n return {entities, i};\n }\n readEntityExp(xmlData, i) { \n //External entities are not supported\n // \n\n //Parameter entities are not supported\n // \n\n //Internal entities are supported\n // \n\n // Skip leading whitespace after \n // \n // \n // \n // \n \n // Skip leading whitespace after {\n while (index < data.length && /\\s/.test(data[index])) {\n index++;\n }\n return index;\n};\n\n\n\nfunction hasSeq(data, seq,i){\n for(let j=0;j [ , '+', '00', '.123', ..\n if(match){\n const sign = match[1] || \"\";\n const leadingZeros = match[2];\n let numTrimmedByZeros = trimZeros(match[3]); //complete num without leading zeros\n const decimalAdjacentToLeadingZeros = sign ? // 0., -00., 000.\n str[leadingZeros.length+1] === \".\" \n : str[leadingZeros.length] === \".\";\n\n //trim ending zeros for floating number\n if(!options.leadingZeros //leading zeros are not allowed\n && (leadingZeros.length > 1 \n || (leadingZeros.length === 1 && !decimalAdjacentToLeadingZeros))){\n // 00, 00.3, +03.24, 03, 03.24\n return str;\n }\n else{//no leading zeros or leading zeros are allowed\n const num = Number(trimmedStr);\n const parsedStr = String(num);\n\n if( num === 0 || num === -0) return num;\n if(parsedStr.search(/[eE]/) !== -1){ //given number is long and parsed to eNotation\n if(options.eNotation) return num;\n else return str;\n }else if(trimmedStr.indexOf(\".\") !== -1){ //floating number\n if(parsedStr === \"0\") return num; //0.0\n else if(parsedStr === numTrimmedByZeros) return num; //0.456. 0.79000\n else if( parsedStr === `${sign}${numTrimmedByZeros}`) return num;\n else return str;\n }\n \n let n = leadingZeros? numTrimmedByZeros : trimmedStr;\n if(leadingZeros){\n // -009 => -9\n return (n === parsedStr) || (sign+n === parsedStr) ? num : str\n }else {\n // +9\n return (n === parsedStr) || (n === sign+parsedStr) ? num : str\n }\n }\n }else{ //non-numeric string\n return str;\n }\n }\n}\n\nconst eNotationRegx = /^([-+])?(0*)(\\d*(\\.\\d*)?[eE][-\\+]?\\d+)$/;\nfunction resolveEnotation(str,trimmedStr,options){\n if(!options.eNotation) return str;\n const notation = trimmedStr.match(eNotationRegx); \n if(notation){\n let sign = notation[1] || \"\";\n const eChar = notation[3].indexOf(\"e\") === -1 ? \"E\" : \"e\";\n const leadingZeros = notation[2];\n const eAdjacentToLeadingZeros = sign ? // 0E.\n str[leadingZeros.length+1] === eChar \n : str[leadingZeros.length] === eChar;\n\n if(leadingZeros.length > 1 && eAdjacentToLeadingZeros) return str;\n else if(leadingZeros.length === 1 \n && (notation[3].startsWith(`.${eChar}`) || notation[3][0] === eChar)){\n return Number(trimmedStr);\n }else if(options.leadingZeros && !eAdjacentToLeadingZeros){ //accept with leading zeros\n //remove leading 0s\n trimmedStr = (notation[1] || \"\") + notation[3];\n return Number(trimmedStr);\n }else return str;\n }else{\n return str;\n }\n}\n\n/**\n * \n * @param {string} numStr without leading zeros\n * @returns \n */\nfunction trimZeros(numStr){\n if(numStr && numStr.indexOf(\".\") !== -1){//float\n numStr = numStr.replace(/0+$/, \"\"); //remove ending zeros\n if(numStr === \".\") numStr = \"0\";\n else if(numStr[0] === \".\") numStr = \"0\"+numStr;\n else if(numStr[numStr.length-1] === \".\") numStr = numStr.substring(0,numStr.length-1);\n return numStr;\n }\n return numStr;\n}\n\nfunction parse_int(numStr, base){\n //polyfill\n if(parseInt) return parseInt(numStr, base);\n else if(Number.parseInt) return Number.parseInt(numStr, base);\n else if(window && window.parseInt) return window.parseInt(numStr, base);\n else throw new Error(\"parseInt, Number.parseInt, window.parseInt are not supported\")\n}","export default function getIgnoreAttributesFn(ignoreAttributes) {\n if (typeof ignoreAttributes === 'function') {\n return ignoreAttributes\n }\n if (Array.isArray(ignoreAttributes)) {\n return (attrName) => {\n for (const pattern of ignoreAttributes) {\n if (typeof pattern === 'string' && attrName === pattern) {\n return true\n }\n if (pattern instanceof RegExp && pattern.test(attrName)) {\n return true\n }\n }\n }\n }\n return () => false\n}","'use strict';\n///@ts-check\n\nimport {getAllMatches, isExist} from '../util.js';\nimport xmlNode from './xmlNode.js';\nimport DocTypeReader from './DocTypeReader.js';\nimport toNumber from \"strnum\";\nimport getIgnoreAttributesFn from \"../ignoreAttributes.js\";\n\n// const regx =\n// '<((!\\\\[CDATA\\\\[([\\\\s\\\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\\\/)(NAME)\\\\s*>))([^<]*)'\n// .replace(/NAME/g, util.nameRegexp);\n\n//const tagsRegx = new RegExp(\"<(\\\\/?[\\\\w:\\\\-\\._]+)([^>]*)>(\\\\s*\"+cdataRegx+\")*([^<]+)?\",\"g\");\n//const tagsRegx = new RegExp(\"<(\\\\/?)((\\\\w*:)?([\\\\w:\\\\-\\._]+))([^>]*)>([^<]*)(\"+cdataRegx+\"([^<]*))*([^<]+)?\",\"g\");\n\nexport default class OrderedObjParser{\n constructor(options){\n this.options = options;\n this.currentNode = null;\n this.tagsNodeStack = [];\n this.docTypeEntities = {};\n this.lastEntities = {\n \"apos\" : { regex: /&(apos|#39|#x27);/g, val : \"'\"},\n \"gt\" : { regex: /&(gt|#62|#x3E);/g, val : \">\"},\n \"lt\" : { regex: /&(lt|#60|#x3C);/g, val : \"<\"},\n \"quot\" : { regex: /&(quot|#34|#x22);/g, val : \"\\\"\"},\n };\n this.ampEntity = { regex: /&(amp|#38|#x26);/g, val : \"&\"};\n this.htmlEntities = {\n \"space\": { regex: /&(nbsp|#160);/g, val: \" \" },\n // \"lt\" : { regex: /&(lt|#60);/g, val: \"<\" },\n // \"gt\" : { regex: /&(gt|#62);/g, val: \">\" },\n // \"amp\" : { regex: /&(amp|#38);/g, val: \"&\" },\n // \"quot\" : { regex: /&(quot|#34);/g, val: \"\\\"\" },\n // \"apos\" : { regex: /&(apos|#39);/g, val: \"'\" },\n \"cent\" : { regex: /&(cent|#162);/g, val: \"¢\" },\n \"pound\" : { regex: /&(pound|#163);/g, val: \"£\" },\n \"yen\" : { regex: /&(yen|#165);/g, val: \"¥\" },\n \"euro\" : { regex: /&(euro|#8364);/g, val: \"€\" },\n \"copyright\" : { regex: /&(copy|#169);/g, val: \"©\" },\n \"reg\" : { regex: /&(reg|#174);/g, val: \"®\" },\n \"inr\" : { regex: /&(inr|#8377);/g, val: \"₹\" },\n \"num_dec\": { regex: /([0-9]{1,7});/g, val : (_, str) => fromCodePoint(str, 10, \"\") },\n \"num_hex\": { regex: /([0-9a-fA-F]{1,6});/g, val : (_, str) => fromCodePoint(str, 16, \"\") },\n };\n this.addExternalEntities = addExternalEntities;\n this.parseXml = parseXml;\n this.parseTextData = parseTextData;\n this.resolveNameSpace = resolveNameSpace;\n this.buildAttributesMap = buildAttributesMap;\n this.isItStopNode = isItStopNode;\n this.replaceEntitiesValue = replaceEntitiesValue;\n this.readStopNodeData = readStopNodeData;\n this.saveTextToParentTag = saveTextToParentTag;\n this.addChild = addChild;\n this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)\n\n if(this.options.stopNodes && this.options.stopNodes.length > 0){\n this.stopNodesExact = new Set();\n this.stopNodesWildcard = new Set();\n for(let i = 0; i < this.options.stopNodes.length; i++){\n const stopNodeExp = this.options.stopNodes[i];\n if(typeof stopNodeExp !== 'string') continue;\n if(stopNodeExp.startsWith(\"*.\")){\n this.stopNodesWildcard.add(stopNodeExp.substring(2));\n }else{\n this.stopNodesExact.add(stopNodeExp);\n }\n }\n }\n }\n\n}\n\nfunction addExternalEntities(externalEntities){\n const entKeys = Object.keys(externalEntities);\n for (let i = 0; i < entKeys.length; i++) {\n const ent = entKeys[i];\n this.lastEntities[ent] = {\n regex: new RegExp(\"&\"+ent+\";\",\"g\"),\n val : externalEntities[ent]\n }\n }\n}\n\n/**\n * @param {string} val\n * @param {string} tagName\n * @param {string} jPath\n * @param {boolean} dontTrim\n * @param {boolean} hasAttributes\n * @param {boolean} isLeafNode\n * @param {boolean} escapeEntities\n */\nfunction parseTextData(val, tagName, jPath, dontTrim, hasAttributes, isLeafNode, escapeEntities) {\n if (val !== undefined) {\n if (this.options.trimValues && !dontTrim) {\n val = val.trim();\n }\n if(val.length > 0){\n if(!escapeEntities) val = this.replaceEntitiesValue(val);\n \n const newval = this.options.tagValueProcessor(tagName, val, jPath, hasAttributes, isLeafNode);\n if(newval === null || newval === undefined){\n //don't parse\n return val;\n }else if(typeof newval !== typeof val || newval !== val){\n //overwrite\n return newval;\n }else if(this.options.trimValues){\n return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n }else{\n const trimmedVal = val.trim();\n if(trimmedVal === val){\n return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n }else{\n return val;\n }\n }\n }\n }\n}\n\nfunction resolveNameSpace(tagname) {\n if (this.options.removeNSPrefix) {\n const tags = tagname.split(':');\n const prefix = tagname.charAt(0) === '/' ? '/' : '';\n if (tags[0] === 'xmlns') {\n return '';\n }\n if (tags.length === 2) {\n tagname = prefix + tags[1];\n }\n }\n return tagname;\n}\n\n//TODO: change regex to capture NS\n//const attrsRegx = new RegExp(\"([\\\\w\\\\-\\\\.\\\\:]+)\\\\s*=\\\\s*(['\\\"])((.|\\n)*?)\\\\2\",\"gm\");\nconst attrsRegx = new RegExp('([^\\\\s=]+)\\\\s*(=\\\\s*([\\'\"])([\\\\s\\\\S]*?)\\\\3)?', 'gm');\n\nfunction buildAttributesMap(attrStr, jPath) {\n if (this.options.ignoreAttributes !== true && typeof attrStr === 'string') {\n // attrStr = attrStr.replace(/\\r?\\n/g, ' ');\n //attrStr = attrStr || attrStr.trim();\n\n const matches = getAllMatches(attrStr, attrsRegx);\n const len = matches.length; //don't make it inline\n const attrs = {};\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n if (this.ignoreAttributesFn(attrName, jPath)) {\n continue\n }\n let oldVal = matches[i][4];\n let aName = this.options.attributeNamePrefix + attrName;\n if (attrName.length) {\n if (this.options.transformAttributeName) {\n aName = this.options.transformAttributeName(aName);\n }\n if(aName === \"__proto__\") aName = \"#__proto__\";\n if (oldVal !== undefined) {\n if (this.options.trimValues) {\n oldVal = oldVal.trim();\n }\n oldVal = this.replaceEntitiesValue(oldVal);\n const newVal = this.options.attributeValueProcessor(attrName, oldVal, jPath);\n if(newVal === null || newVal === undefined){\n //don't parse\n attrs[aName] = oldVal;\n }else if(typeof newVal !== typeof oldVal || newVal !== oldVal){\n //overwrite\n attrs[aName] = newVal;\n }else{\n //parse\n attrs[aName] = parseValue(\n oldVal,\n this.options.parseAttributeValue,\n this.options.numberParseOptions\n );\n }\n } else if (this.options.allowBooleanAttributes) {\n attrs[aName] = true;\n }\n }\n }\n if (!Object.keys(attrs).length) {\n return;\n }\n if (this.options.attributesGroupName) {\n const attrCollection = {};\n attrCollection[this.options.attributesGroupName] = attrs;\n return attrCollection;\n }\n return attrs\n }\n}\n\nconst parseXml = function(xmlData) {\n xmlData = xmlData.replace(/\\r\\n?/g, \"\\n\"); //TODO: remove this line\n const xmlObj = new xmlNode('!xml');\n let currentNode = xmlObj;\n let textData = \"\";\n let jPath = \"\";\n const docTypeReader = new DocTypeReader(this.options.processEntities);\n for(let i=0; i< xmlData.length; i++){//for each char in XML data\n const ch = xmlData[i];\n if(ch === '<'){\n // const nextIndex = i+1;\n // const _2ndChar = xmlData[nextIndex];\n if( xmlData[i+1] === '/') {//Closing Tag\n const closeIndex = findClosingIndex(xmlData, \">\", i, \"Closing Tag is not closed.\")\n let tagName = xmlData.substring(i+2,closeIndex).trim();\n\n if(this.options.removeNSPrefix){\n const colonIndex = tagName.indexOf(\":\");\n if(colonIndex !== -1){\n tagName = tagName.substr(colonIndex+1);\n }\n }\n\n if(this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n\n if(currentNode){\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n }\n\n //check if last tag of nested tag was unpaired tag\n const lastTagName = jPath.substring(jPath.lastIndexOf(\".\")+1);\n if(tagName && this.options.unpairedTags.indexOf(tagName) !== -1 ){\n throw new Error(`Unpaired tag can not be used as closing tag: ${tagName}>`);\n }\n let propIndex = 0\n if(lastTagName && this.options.unpairedTags.indexOf(lastTagName) !== -1 ){\n propIndex = jPath.lastIndexOf('.', jPath.lastIndexOf('.')-1)\n this.tagsNodeStack.pop();\n }else{\n propIndex = jPath.lastIndexOf(\".\");\n }\n jPath = jPath.substring(0, propIndex);\n\n currentNode = this.tagsNodeStack.pop();//avoid recursion, set the parent tag scope\n textData = \"\";\n i = closeIndex;\n } else if( xmlData[i+1] === '?') {\n\n let tagData = readTagExp(xmlData,i, false, \"?>\");\n if(!tagData) throw new Error(\"Pi Tag is not closed.\");\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n if( (this.options.ignoreDeclaration && tagData.tagName === \"?xml\") || this.options.ignorePiTags){\n //do nothing\n }else{\n \n const childNode = new xmlNode(tagData.tagName);\n childNode.add(this.options.textNodeName, \"\");\n \n if(tagData.tagName !== tagData.tagExp && tagData.attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagData.tagExp, jPath);\n }\n this.addChild(currentNode, childNode, jPath, i);\n }\n\n\n i = tagData.closeIndex + 1;\n } else if(xmlData.substr(i + 1, 3) === '!--') {\n const endIndex = findClosingIndex(xmlData, \"-->\", i+4, \"Comment is not closed.\")\n if(this.options.commentPropName){\n const comment = xmlData.substring(i + 4, endIndex - 2);\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n currentNode.add(this.options.commentPropName, [ { [this.options.textNodeName] : comment } ]);\n }\n i = endIndex;\n } else if( xmlData.substr(i + 1, 2) === '!D') {\n const result = docTypeReader.readDocType(xmlData, i);\n this.docTypeEntities = result.entities;\n i = result.i;\n }else if(xmlData.substr(i + 1, 2) === '![') {\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"CDATA is not closed.\") - 2;\n const tagExp = xmlData.substring(i + 9,closeIndex);\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n let val = this.parseTextData(tagExp, currentNode.tagname, jPath, true, false, true, true);\n if(val == undefined) val = \"\";\n\n //cdata should be set even if it is 0 length string\n if(this.options.cdataPropName){\n currentNode.add(this.options.cdataPropName, [ { [this.options.textNodeName] : tagExp } ]);\n }else{\n currentNode.add(this.options.textNodeName, val);\n }\n \n i = closeIndex + 2;\n }else {//Opening tag\n let result = readTagExp(xmlData,i, this.options.removeNSPrefix);\n let tagName= result.tagName;\n const rawTagName = result.rawTagName;\n let tagExp = result.tagExp;\n let attrExpPresent = result.attrExpPresent;\n let closeIndex = result.closeIndex;\n\n if (this.options.transformTagName) {\n //console.log(tagExp, tagName)\n const newTagName = this.options.transformTagName(tagName);\n if(tagExp === tagName) {\n tagExp = newTagName\n }\n tagName = newTagName;\n }\n \n //save text as child node\n if (currentNode && textData) {\n if(currentNode.tagname !== '!xml'){\n //when nested tag is found\n textData = this.saveTextToParentTag(textData, currentNode, jPath, false);\n }\n }\n\n //check if last tag was unpaired tag\n const lastTag = currentNode;\n if(lastTag && this.options.unpairedTags.indexOf(lastTag.tagname) !== -1 ){\n currentNode = this.tagsNodeStack.pop();\n jPath = jPath.substring(0, jPath.lastIndexOf(\".\"));\n }\n if(tagName !== xmlObj.tagname){\n jPath += jPath ? \".\" + tagName : tagName;\n }\n const startIndex = i;\n if (this.isItStopNode(this.stopNodesExact, this.stopNodesWildcard, jPath, tagName)) {\n let tagContent = \"\";\n //self-closing tag\n if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){\n if(tagName[tagName.length - 1] === \"/\"){ //remove trailing '/'\n tagName = tagName.substr(0, tagName.length - 1);\n jPath = jPath.substr(0, jPath.length - 1);\n tagExp = tagName;\n }else{\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n i = result.closeIndex;\n }\n //unpaired tag\n else if(this.options.unpairedTags.indexOf(tagName) !== -1){\n \n i = result.closeIndex;\n }\n //normal tag\n else{\n //read until closing tag is found\n const result = this.readStopNodeData(xmlData, rawTagName, closeIndex + 1);\n if(!result) throw new Error(`Unexpected end of ${rawTagName}`);\n i = result.i;\n tagContent = result.tagContent;\n }\n\n const childNode = new xmlNode(tagName);\n\n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath\n );\n }\n if(tagContent) {\n tagContent = this.parseTextData(tagContent, tagName, jPath, true, attrExpPresent, true, true);\n }\n \n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n childNode.add(this.options.textNodeName, tagContent);\n \n this.addChild(currentNode, childNode, jPath, startIndex);\n }else{\n //selfClosing tag\n if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){\n if(tagName[tagName.length - 1] === \"/\"){ //remove trailing '/'\n tagName = tagName.substr(0, tagName.length - 1);\n jPath = jPath.substr(0, jPath.length - 1);\n tagExp = tagName;\n }else{\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n \n if(this.options.transformTagName) {\n const newTagName = this.options.transformTagName(tagName);\n if(tagExp === tagName) {\n tagExp = newTagName\n }\n tagName = newTagName;\n }\n\n const childNode = new xmlNode(tagName);\n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath);\n }\n this.addChild(currentNode, childNode, jPath, startIndex);\n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n }\n //opening tag\n else{\n const childNode = new xmlNode( tagName);\n this.tagsNodeStack.push(currentNode);\n \n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath);\n }\n this.addChild(currentNode, childNode, jPath, startIndex);\n currentNode = childNode;\n }\n textData = \"\";\n i = closeIndex;\n }\n }\n }else{\n textData += xmlData[i];\n }\n }\n return xmlObj.child;\n}\n\nfunction addChild(currentNode, childNode, jPath, startIndex){\n // unset startIndex if not requested\n if (!this.options.captureMetaData) startIndex = undefined;\n const result = this.options.updateTag(childNode.tagname, jPath, childNode[\":@\"])\n if(result === false){\n //do nothing\n } else if(typeof result === \"string\"){\n childNode.tagname = result\n currentNode.addChild(childNode, startIndex);\n }else{\n currentNode.addChild(childNode, startIndex);\n }\n}\n\nconst replaceEntitiesValue = function(val){\n\n if(this.options.processEntities){\n for(let entityName in this.docTypeEntities){\n const entity = this.docTypeEntities[entityName];\n val = val.replace( entity.regx, entity.val);\n }\n for(let entityName in this.lastEntities){\n const entity = this.lastEntities[entityName];\n val = val.replace( entity.regex, entity.val);\n }\n if(this.options.htmlEntities){\n for(let entityName in this.htmlEntities){\n const entity = this.htmlEntities[entityName];\n val = val.replace( entity.regex, entity.val);\n }\n }\n val = val.replace( this.ampEntity.regex, this.ampEntity.val);\n }\n return val;\n}\nfunction saveTextToParentTag(textData, currentNode, jPath, isLeafNode) {\n if (textData) { //store previously collected data as textNode\n if(isLeafNode === undefined) isLeafNode = currentNode.child.length === 0\n \n textData = this.parseTextData(textData,\n currentNode.tagname,\n jPath,\n false,\n currentNode[\":@\"] ? Object.keys(currentNode[\":@\"]).length !== 0 : false,\n isLeafNode);\n\n if (textData !== undefined && textData !== \"\")\n currentNode.add(this.options.textNodeName, textData);\n textData = \"\";\n }\n return textData;\n}\n\n//TODO: use jPath to simplify the logic\n/**\n * @param {Set} stopNodesExact\n * @param {Set} stopNodesWildcard\n * @param {string} jPath\n * @param {string} currentTagName\n */\nfunction isItStopNode(stopNodesExact, stopNodesWildcard, jPath, currentTagName){\n if(stopNodesWildcard && stopNodesWildcard.has(currentTagName)) return true;\n if(stopNodesExact && stopNodesExact.has(jPath)) return true;\n return false;\n}\n\n/**\n * Returns the tag Expression and where it is ending handling single-double quotes situation\n * @param {string} xmlData \n * @param {number} i starting index\n * @returns \n */\nfunction tagExpWithClosingIndex(xmlData, i, closingChar = \">\"){\n let attrBoundary;\n let tagExp = \"\";\n for (let index = i; index < xmlData.length; index++) {\n let ch = xmlData[index];\n if (attrBoundary) {\n if (ch === attrBoundary) attrBoundary = \"\";//reset\n } else if (ch === '\"' || ch === \"'\") {\n attrBoundary = ch;\n } else if (ch === closingChar[0]) {\n if(closingChar[1]){\n if(xmlData[index + 1] === closingChar[1]){\n return {\n data: tagExp,\n index: index\n }\n }\n }else{\n return {\n data: tagExp,\n index: index\n }\n }\n } else if (ch === '\\t') {\n ch = \" \"\n }\n tagExp += ch;\n }\n}\n\nfunction findClosingIndex(xmlData, str, i, errMsg){\n const closingIndex = xmlData.indexOf(str, i);\n if(closingIndex === -1){\n throw new Error(errMsg)\n }else{\n return closingIndex + str.length - 1;\n }\n}\n\nfunction readTagExp(xmlData,i, removeNSPrefix, closingChar = \">\"){\n const result = tagExpWithClosingIndex(xmlData, i+1, closingChar);\n if(!result) return;\n let tagExp = result.data;\n const closeIndex = result.index;\n const separatorIndex = tagExp.search(/\\s/);\n let tagName = tagExp;\n let attrExpPresent = true;\n if(separatorIndex !== -1){//separate tag name and attributes expression\n tagName = tagExp.substring(0, separatorIndex);\n tagExp = tagExp.substring(separatorIndex + 1).trimStart();\n }\n\n const rawTagName = tagName;\n if(removeNSPrefix){\n const colonIndex = tagName.indexOf(\":\");\n if(colonIndex !== -1){\n tagName = tagName.substr(colonIndex+1);\n attrExpPresent = tagName !== result.data.substr(colonIndex + 1);\n }\n }\n\n return {\n tagName: tagName,\n tagExp: tagExp,\n closeIndex: closeIndex,\n attrExpPresent: attrExpPresent,\n rawTagName: rawTagName,\n }\n}\n/**\n * find paired tag for a stop node\n * @param {string} xmlData \n * @param {string} tagName \n * @param {number} i \n */\nfunction readStopNodeData(xmlData, tagName, i){\n const startIndex = i;\n // Starting at 1 since we already have an open tag\n let openTagCount = 1;\n\n for (; i < xmlData.length; i++) {\n if( xmlData[i] === \"<\"){ \n if (xmlData[i+1] === \"/\") {//close tag\n const closeIndex = findClosingIndex(xmlData, \">\", i, `${tagName} is not closed`);\n let closeTagName = xmlData.substring(i+2,closeIndex).trim();\n if(closeTagName === tagName){\n openTagCount--;\n if (openTagCount === 0) {\n return {\n tagContent: xmlData.substring(startIndex, i),\n i : closeIndex\n }\n }\n }\n i=closeIndex;\n } else if(xmlData[i+1] === '?') { \n const closeIndex = findClosingIndex(xmlData, \"?>\", i+1, \"StopNode is not closed.\")\n i=closeIndex;\n } else if(xmlData.substr(i + 1, 3) === '!--') { \n const closeIndex = findClosingIndex(xmlData, \"-->\", i+3, \"StopNode is not closed.\")\n i=closeIndex;\n } else if(xmlData.substr(i + 1, 2) === '![') { \n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"StopNode is not closed.\") - 2;\n i=closeIndex;\n } else {\n const tagData = readTagExp(xmlData, i, '>')\n\n if (tagData) {\n const openTagName = tagData && tagData.tagName;\n if (openTagName === tagName && tagData.tagExp[tagData.tagExp.length-1] !== \"/\") {\n openTagCount++;\n }\n i=tagData.closeIndex;\n }\n }\n }\n }//end for loop\n}\n\nfunction parseValue(val, shouldParse, options) {\n if (shouldParse && typeof val === 'string') {\n //console.log(options)\n const newval = val.trim();\n if(newval === 'true' ) return true;\n else if(newval === 'false' ) return false;\n else return toNumber(val, options);\n } else {\n if (isExist(val)) {\n return val;\n } else {\n return '';\n }\n }\n}\n\nfunction fromCodePoint(str, base, prefix){\n const codePoint = Number.parseInt(str, base);\n\n if (codePoint >= 0 && codePoint <= 0x10FFFF) {\n return String.fromCodePoint(codePoint);\n } else {\n return prefix +str + \";\";\n }\n}","'use strict';\n\nimport XmlNode from './xmlNode.js';\n\nconst METADATA_SYMBOL = XmlNode.getMetaDataSymbol();\n\n/**\n * \n * @param {array} node \n * @param {any} options \n * @returns \n */\nexport default function prettify(node, options){\n return compress( node, options);\n}\n\n/**\n * \n * @param {array} arr \n * @param {object} options \n * @param {string} jPath \n * @returns object\n */\nfunction compress(arr, options, jPath){\n let text;\n const compressedObj = {};\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const property = propName(tagObj);\n let newJpath = \"\";\n if(jPath === undefined) newJpath = property;\n else newJpath = jPath + \".\" + property;\n\n if(property === options.textNodeName){\n if(text === undefined) text = tagObj[property];\n else text += \"\" + tagObj[property];\n }else if(property === undefined){\n continue;\n }else if(tagObj[property]){\n \n let val = compress(tagObj[property], options, newJpath);\n const isLeaf = isLeafTag(val, options);\n if (tagObj[METADATA_SYMBOL] !== undefined) {\n val[METADATA_SYMBOL] = tagObj[METADATA_SYMBOL]; // copy over metadata\n }\n\n if(tagObj[\":@\"]){\n assignAttributes( val, tagObj[\":@\"], newJpath, options);\n }else if(Object.keys(val).length === 1 && val[options.textNodeName] !== undefined && !options.alwaysCreateTextNode){\n val = val[options.textNodeName];\n }else if(Object.keys(val).length === 0){\n if(options.alwaysCreateTextNode) val[options.textNodeName] = \"\";\n else val = \"\";\n }\n\n if(compressedObj[property] !== undefined && compressedObj.hasOwnProperty(property)) {\n if(!Array.isArray(compressedObj[property])) {\n compressedObj[property] = [ compressedObj[property] ];\n }\n compressedObj[property].push(val);\n }else{\n //TODO: if a node is not an array, then check if it should be an array\n //also determine if it is a leaf node\n if (options.isArray(property, newJpath, isLeaf )) {\n compressedObj[property] = [val];\n }else{\n compressedObj[property] = val;\n }\n }\n }\n \n }\n // if(text && text.length > 0) compressedObj[options.textNodeName] = text;\n if(typeof text === \"string\"){\n if(text.length > 0) compressedObj[options.textNodeName] = text;\n }else if(text !== undefined) compressedObj[options.textNodeName] = text;\n return compressedObj;\n}\n\nfunction propName(obj){\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if(key !== \":@\") return key;\n }\n}\n\nfunction assignAttributes(obj, attrMap, jpath, options){\n if (attrMap) {\n const keys = Object.keys(attrMap);\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n const atrrName = keys[i];\n if (options.isArray(atrrName, jpath + \".\" + atrrName, true, true)) {\n obj[atrrName] = [ attrMap[atrrName] ];\n } else {\n obj[atrrName] = attrMap[atrrName];\n }\n }\n }\n}\n\nfunction isLeafTag(obj, options){\n const { textNodeName } = options;\n const propCount = Object.keys(obj).length;\n \n if (propCount === 0) {\n return true;\n }\n\n if (\n propCount === 1 &&\n (obj[textNodeName] || typeof obj[textNodeName] === \"boolean\" || obj[textNodeName] === 0)\n ) {\n return true;\n }\n\n return false;\n}\n","import { buildOptions} from './OptionsBuilder.js';\nimport OrderedObjParser from './OrderedObjParser.js';\nimport prettify from './node2json.js';\nimport {validate} from \"../validator.js\";\nimport XmlNode from './xmlNode.js';\n\nexport default class XMLParser{\n \n constructor(options){\n this.externalEntities = {};\n this.options = buildOptions(options);\n \n }\n /**\n * Parse XML dats to JS object \n * @param {string|Uint8Array} xmlData \n * @param {boolean|Object} validationOption \n */\n parse(xmlData,validationOption){\n if(typeof xmlData !== \"string\" && xmlData.toString){\n xmlData = xmlData.toString();\n }else if(typeof xmlData !== \"string\"){\n throw new Error(\"XML data is accepted in String or Bytes[] form.\")\n }\n \n if( validationOption){\n if(validationOption === true) validationOption = {}; //validate with default options\n \n const result = validate(xmlData, validationOption);\n if (result !== true) {\n throw Error( `${result.err.msg}:${result.err.line}:${result.err.col}` )\n }\n }\n const orderedObjParser = new OrderedObjParser(this.options);\n orderedObjParser.addExternalEntities(this.externalEntities);\n const orderedResult = orderedObjParser.parseXml(xmlData);\n if(this.options.preserveOrder || orderedResult === undefined) return orderedResult;\n else return prettify(orderedResult, this.options);\n }\n\n /**\n * Add Entity which is not by default supported by this library\n * @param {string} key \n * @param {string} value \n */\n addEntity(key, value){\n if(value.indexOf(\"&\") !== -1){\n throw new Error(\"Entity value can't have '&'\")\n }else if(key.indexOf(\"&\") !== -1 || key.indexOf(\";\") !== -1){\n throw new Error(\"An entity must be set without '&' and ';'. Eg. use '#xD' for '
'\")\n }else if(value === \"&\"){\n throw new Error(\"An entity with value '&' is not permitted\");\n }else{\n this.externalEntities[key] = value;\n }\n }\n\n /**\n * Returns a Symbol that can be used to access the metadata\n * property on a node.\n * \n * If Symbol is not available in the environment, an ordinary property is used\n * and the name of the property is here returned.\n * \n * The XMLMetaData property is only present when `captureMetaData`\n * is true in the options.\n */\n static getMetaDataSymbol() {\n return XmlNode.getMetaDataSymbol();\n }\n}\n","const EOL = \"\\n\";\n\n/**\n * \n * @param {array} jArray \n * @param {any} options \n * @returns \n */\nexport default function toXml(jArray, options) {\n let indentation = \"\";\n if (options.format && options.indentBy.length > 0) {\n indentation = EOL;\n }\n return arrToStr(jArray, options, \"\", indentation);\n}\n\nfunction arrToStr(arr, options, jPath, indentation) {\n let xmlStr = \"\";\n let isPreviousElementTag = false;\n\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const tagName = propName(tagObj);\n if(tagName === undefined) continue;\n\n let newJPath = \"\";\n if (jPath.length === 0) newJPath = tagName\n else newJPath = `${jPath}.${tagName}`;\n\n if (tagName === options.textNodeName) {\n let tagText = tagObj[tagName];\n if (!isStopNode(newJPath, options)) {\n tagText = options.tagValueProcessor(tagName, tagText);\n tagText = replaceEntitiesValue(tagText, options);\n }\n if (isPreviousElementTag) {\n xmlStr += indentation;\n }\n xmlStr += tagText;\n isPreviousElementTag = false;\n continue;\n } else if (tagName === options.cdataPropName) {\n if (isPreviousElementTag) {\n xmlStr += indentation;\n }\n xmlStr += ``;\n isPreviousElementTag = false;\n continue;\n } else if (tagName === options.commentPropName) {\n xmlStr += indentation + ``;\n isPreviousElementTag = true;\n continue;\n } else if (tagName[0] === \"?\") {\n const attStr = attr_to_str(tagObj[\":@\"], options);\n const tempInd = tagName === \"?xml\" ? \"\" : indentation;\n let piTextNodeName = tagObj[tagName][0][options.textNodeName];\n piTextNodeName = piTextNodeName.length !== 0 ? \" \" + piTextNodeName : \"\"; //remove extra spacing\n xmlStr += tempInd + `<${tagName}${piTextNodeName}${attStr}?>`;\n isPreviousElementTag = true;\n continue;\n }\n let newIdentation = indentation;\n if (newIdentation !== \"\") {\n newIdentation += options.indentBy;\n }\n const attStr = attr_to_str(tagObj[\":@\"], options);\n const tagStart = indentation + `<${tagName}${attStr}`;\n const tagValue = arrToStr(tagObj[tagName], options, newJPath, newIdentation);\n if (options.unpairedTags.indexOf(tagName) !== -1) {\n if (options.suppressUnpairedNode) xmlStr += tagStart + \">\";\n else xmlStr += tagStart + \"/>\";\n } else if ((!tagValue || tagValue.length === 0) && options.suppressEmptyNode) {\n xmlStr += tagStart + \"/>\";\n } else if (tagValue && tagValue.endsWith(\">\")) {\n xmlStr += tagStart + `>${tagValue}${indentation}${tagName}>`;\n } else {\n xmlStr += tagStart + \">\";\n if (tagValue && indentation !== \"\" && (tagValue.includes(\"/>\") || tagValue.includes(\"\"))) {\n xmlStr += indentation + options.indentBy + tagValue + indentation;\n } else {\n xmlStr += tagValue;\n }\n xmlStr += `${tagName}>`;\n }\n isPreviousElementTag = true;\n }\n\n return xmlStr;\n}\n\nfunction propName(obj) {\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if(!obj.hasOwnProperty(key)) continue;\n if (key !== \":@\") return key;\n }\n}\n\nfunction attr_to_str(attrMap, options) {\n let attrStr = \"\";\n if (attrMap && !options.ignoreAttributes) {\n for (let attr in attrMap) {\n if(!attrMap.hasOwnProperty(attr)) continue;\n let attrVal = options.attributeValueProcessor(attr, attrMap[attr]);\n attrVal = replaceEntitiesValue(attrVal, options);\n if (attrVal === true && options.suppressBooleanAttributes) {\n attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}`;\n } else {\n attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}=\"${attrVal}\"`;\n }\n }\n }\n return attrStr;\n}\n\nfunction isStopNode(jPath, options) {\n jPath = jPath.substr(0, jPath.length - options.textNodeName.length - 1);\n let tagName = jPath.substr(jPath.lastIndexOf(\".\") + 1);\n for (let index in options.stopNodes) {\n if (options.stopNodes[index] === jPath || options.stopNodes[index] === \"*.\" + tagName) return true;\n }\n return false;\n}\n\nfunction replaceEntitiesValue(textValue, options) {\n if (textValue && textValue.length > 0 && options.processEntities) {\n for (let i = 0; i < options.entities.length; i++) {\n const entity = options.entities[i];\n textValue = textValue.replace(entity.regex, entity.val);\n }\n }\n return textValue;\n}\n","'use strict';\n//parse Empty Node as self closing node\nimport buildFromOrderedJs from './orderedJs2Xml.js';\nimport getIgnoreAttributesFn from \"../ignoreAttributes.js\";\n\nconst defaultOptions = {\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n cdataPropName: false,\n format: false,\n indentBy: ' ',\n suppressEmptyNode: false,\n suppressUnpairedNode: true,\n suppressBooleanAttributes: true,\n tagValueProcessor: function(key, a) {\n return a;\n },\n attributeValueProcessor: function(attrName, a) {\n return a;\n },\n preserveOrder: false,\n commentPropName: false,\n unpairedTags: [],\n entities: [\n { regex: new RegExp(\"&\", \"g\"), val: \"&\" },//it must be on top\n { regex: new RegExp(\">\", \"g\"), val: \">\" },\n { regex: new RegExp(\"<\", \"g\"), val: \"<\" },\n { regex: new RegExp(\"\\'\", \"g\"), val: \"'\" },\n { regex: new RegExp(\"\\\"\", \"g\"), val: \""\" }\n ],\n processEntities: true,\n stopNodes: [],\n // transformTagName: false,\n // transformAttributeName: false,\n oneListGroup: false\n};\n\nexport default function Builder(options) {\n this.options = Object.assign({}, defaultOptions, options);\n if (this.options.ignoreAttributes === true || this.options.attributesGroupName) {\n this.isAttribute = function(/*a*/) {\n return false;\n };\n } else {\n this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)\n this.attrPrefixLen = this.options.attributeNamePrefix.length;\n this.isAttribute = isAttribute;\n }\n\n this.processTextOrObjNode = processTextOrObjNode\n\n if (this.options.format) {\n this.indentate = indentate;\n this.tagEndChar = '>\\n';\n this.newLine = '\\n';\n } else {\n this.indentate = function() {\n return '';\n };\n this.tagEndChar = '>';\n this.newLine = '';\n }\n}\n\nBuilder.prototype.build = function(jObj) {\n if(this.options.preserveOrder){\n return buildFromOrderedJs(jObj, this.options);\n }else {\n if(Array.isArray(jObj) && this.options.arrayNodeName && this.options.arrayNodeName.length > 1){\n jObj = {\n [this.options.arrayNodeName] : jObj\n }\n }\n return this.j2x(jObj, 0, []).val;\n }\n};\n\nBuilder.prototype.j2x = function(jObj, level, ajPath) {\n let attrStr = '';\n let val = '';\n const jPath = ajPath.join('.')\n for (let key in jObj) {\n if(!Object.prototype.hasOwnProperty.call(jObj, key)) continue;\n if (typeof jObj[key] === 'undefined') {\n // supress undefined node only if it is not an attribute\n if (this.isAttribute(key)) {\n val += '';\n }\n } else if (jObj[key] === null) {\n // null attribute should be ignored by the attribute list, but should not cause the tag closing\n if (this.isAttribute(key)) {\n val += '';\n } else if (key === this.options.cdataPropName) {\n val += '';\n } else if (key[0] === '?') {\n val += this.indentate(level) + '<' + key + '?' + this.tagEndChar;\n } else {\n val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n }\n // val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n } else if (jObj[key] instanceof Date) {\n val += this.buildTextValNode(jObj[key], key, '', level);\n } else if (typeof jObj[key] !== 'object') {\n //premitive type\n const attr = this.isAttribute(key);\n if (attr && !this.ignoreAttributesFn(attr, jPath)) {\n attrStr += this.buildAttrPairStr(attr, '' + jObj[key]);\n } else if (!attr) {\n //tag value\n if (key === this.options.textNodeName) {\n let newval = this.options.tagValueProcessor(key, '' + jObj[key]);\n val += this.replaceEntitiesValue(newval);\n } else {\n val += this.buildTextValNode(jObj[key], key, '', level);\n }\n }\n } else if (Array.isArray(jObj[key])) {\n //repeated nodes\n const arrLen = jObj[key].length;\n let listTagVal = \"\";\n let listTagAttr = \"\";\n for (let j = 0; j < arrLen; j++) {\n const item = jObj[key][j];\n if (typeof item === 'undefined') {\n // supress undefined node\n } else if (item === null) {\n if(key[0] === \"?\") val += this.indentate(level) + '<' + key + '?' + this.tagEndChar;\n else val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n // val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n } else if (typeof item === 'object') {\n if(this.options.oneListGroup){\n const result = this.j2x(item, level + 1, ajPath.concat(key));\n listTagVal += result.val;\n if (this.options.attributesGroupName && item.hasOwnProperty(this.options.attributesGroupName)) {\n listTagAttr += result.attrStr\n }\n }else{\n listTagVal += this.processTextOrObjNode(item, key, level, ajPath)\n }\n } else {\n if (this.options.oneListGroup) {\n let textValue = this.options.tagValueProcessor(key, item);\n textValue = this.replaceEntitiesValue(textValue);\n listTagVal += textValue;\n } else {\n listTagVal += this.buildTextValNode(item, key, '', level);\n }\n }\n }\n if(this.options.oneListGroup){\n listTagVal = this.buildObjectNode(listTagVal, key, listTagAttr, level);\n }\n val += listTagVal;\n } else {\n //nested node\n if (this.options.attributesGroupName && key === this.options.attributesGroupName) {\n const Ks = Object.keys(jObj[key]);\n const L = Ks.length;\n for (let j = 0; j < L; j++) {\n attrStr += this.buildAttrPairStr(Ks[j], '' + jObj[key][Ks[j]]);\n }\n } else {\n val += this.processTextOrObjNode(jObj[key], key, level, ajPath)\n }\n }\n }\n return {attrStr: attrStr, val: val};\n};\n\nBuilder.prototype.buildAttrPairStr = function(attrName, val){\n val = this.options.attributeValueProcessor(attrName, '' + val);\n val = this.replaceEntitiesValue(val);\n if (this.options.suppressBooleanAttributes && val === \"true\") {\n return ' ' + attrName;\n } else return ' ' + attrName + '=\"' + val + '\"';\n}\n\nfunction processTextOrObjNode (object, key, level, ajPath) {\n const result = this.j2x(object, level + 1, ajPath.concat(key));\n if (object[this.options.textNodeName] !== undefined && Object.keys(object).length === 1) {\n return this.buildTextValNode(object[this.options.textNodeName], key, result.attrStr, level);\n } else {\n return this.buildObjectNode(result.val, key, result.attrStr, level);\n }\n}\n\nBuilder.prototype.buildObjectNode = function(val, key, attrStr, level) {\n if(val === \"\"){\n if(key[0] === \"?\") return this.indentate(level) + '<' + key + attrStr+ '?' + this.tagEndChar;\n else {\n return this.indentate(level) + '<' + key + attrStr + this.closeTag(key) + this.tagEndChar;\n }\n }else{\n\n let tagEndExp = '' + key + this.tagEndChar;\n let piClosingChar = \"\";\n \n if(key[0] === \"?\") {\n piClosingChar = \"?\";\n tagEndExp = \"\";\n }\n \n // attrStr is an empty string in case the attribute came as undefined or null\n if ((attrStr || attrStr === '') && val.indexOf('<') === -1) {\n return ( this.indentate(level) + '<' + key + attrStr + piClosingChar + '>' + val + tagEndExp );\n } else if (this.options.commentPropName !== false && key === this.options.commentPropName && piClosingChar.length === 0) {\n return this.indentate(level) + `` + this.newLine;\n }else {\n return (\n this.indentate(level) + '<' + key + attrStr + piClosingChar + this.tagEndChar +\n val +\n this.indentate(level) + tagEndExp );\n }\n }\n}\n\nBuilder.prototype.closeTag = function(key){\n let closeTag = \"\";\n if(this.options.unpairedTags.indexOf(key) !== -1){ //unpaired\n if(!this.options.suppressUnpairedNode) closeTag = \"/\"\n }else if(this.options.suppressEmptyNode){ //empty\n closeTag = \"/\";\n }else{\n closeTag = `>${key}`\n }\n return closeTag;\n}\n\nfunction buildEmptyObjNode(val, key, attrStr, level) {\n if (val !== '') {\n return this.buildObjectNode(val, key, attrStr, level);\n } else {\n if(key[0] === \"?\") return this.indentate(level) + '<' + key + attrStr+ '?' + this.tagEndChar;\n else {\n return this.indentate(level) + '<' + key + attrStr + '/' + this.tagEndChar;\n // return this.buildTagStr(level,key, attrStr);\n }\n }\n}\n\nBuilder.prototype.buildTextValNode = function(val, key, attrStr, level) {\n if (this.options.cdataPropName !== false && key === this.options.cdataPropName) {\n return this.indentate(level) + `` + this.newLine;\n }else if (this.options.commentPropName !== false && key === this.options.commentPropName) {\n return this.indentate(level) + `` + this.newLine;\n }else if(key[0] === \"?\") {//PI tag\n return this.indentate(level) + '<' + key + attrStr+ '?' + this.tagEndChar; \n }else{\n let textValue = this.options.tagValueProcessor(key, val);\n textValue = this.replaceEntitiesValue(textValue);\n \n if( textValue === ''){\n return this.indentate(level) + '<' + key + attrStr + this.closeTag(key) + this.tagEndChar;\n }else{\n return this.indentate(level) + '<' + key + attrStr + '>' +\n textValue +\n '' + key + this.tagEndChar;\n }\n }\n}\n\nBuilder.prototype.replaceEntitiesValue = function(textValue){\n if(textValue && textValue.length > 0 && this.options.processEntities){\n for (let i=0; i {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","'use strict';\n\nconst nameStartChar = ':A-Za-z_\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD';\nconst nameChar = nameStartChar + '\\\\-.\\\\d\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040';\nexport const nameRegexp = '[' + nameStartChar + '][' + nameChar + ']*';\nconst regexName = new RegExp('^' + nameRegexp + '$');\n\nexport function getAllMatches(string, regex) {\n const matches = [];\n let match = regex.exec(string);\n while (match) {\n const allmatches = [];\n allmatches.startIndex = regex.lastIndex - match[0].length;\n const len = match.length;\n for (let index = 0; index < len; index++) {\n allmatches.push(match[index]);\n }\n matches.push(allmatches);\n match = regex.exec(string);\n }\n return matches;\n}\n\nexport const isName = function(string) {\n const match = regexName.exec(string);\n return !(match === null || typeof match === 'undefined');\n}\n\nexport function isExist(v) {\n return typeof v !== 'undefined';\n}\n\nexport function isEmptyObject(obj) {\n return Object.keys(obj).length === 0;\n}\n\n/**\n * Copy all the properties of a into b.\n * @param {*} target\n * @param {*} a\n */\nexport function merge(target, a, arrayMode) {\n if (a) {\n const keys = Object.keys(a); // will return an array of own properties\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n if (arrayMode === 'strict') {\n target[keys[i]] = [ a[keys[i]] ];\n } else {\n target[keys[i]] = a[keys[i]];\n }\n }\n }\n}\n/* exports.merge =function (b,a){\n return Object.assign(b,a);\n} */\n\nexport function getValue(v) {\n if (exports.isExist(v)) {\n return v;\n } else {\n return '';\n }\n}\n\n// const fakeCall = function(a) {return a;};\n// const fakeCallNoReturn = function() {};","'use strict';\n\nimport {getAllMatches, isName} from './util.js';\n\nconst defaultOptions = {\n allowBooleanAttributes: false, //A tag can have attributes without any value\n unpairedTags: []\n};\n\n//const tagsPattern = new RegExp(\"<\\\\/?([\\\\w:\\\\-_\\.]+)\\\\s*\\/?>\",\"g\");\nexport function validate(xmlData, options) {\n options = Object.assign({}, defaultOptions, options);\n\n //xmlData = xmlData.replace(/(\\r\\n|\\n|\\r)/gm,\"\");//make it single line\n //xmlData = xmlData.replace(/(^\\s*<\\?xml.*?\\?>)/g,\"\");//Remove XML starting tag\n //xmlData = xmlData.replace(/()/g,\"\");//Remove DOCTYPE\n const tags = [];\n let tagFound = false;\n\n //indicates that the root tag has been closed (aka. depth 0 has been reached)\n let reachedRoot = false;\n\n if (xmlData[0] === '\\ufeff') {\n // check for byte order mark (BOM)\n xmlData = xmlData.substr(1);\n }\n \n for (let i = 0; i < xmlData.length; i++) {\n\n if (xmlData[i] === '<' && xmlData[i+1] === '?') {\n i+=2;\n i = readPI(xmlData,i);\n if (i.err) return i;\n }else if (xmlData[i] === '<') {\n //starting of tag\n //read until you reach to '>' avoiding any '>' in attribute value\n let tagStartPos = i;\n i++;\n \n if (xmlData[i] === '!') {\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else {\n let closingTag = false;\n if (xmlData[i] === '/') {\n //closing tag\n closingTag = true;\n i++;\n }\n //read tagname\n let tagName = '';\n for (; i < xmlData.length &&\n xmlData[i] !== '>' &&\n xmlData[i] !== ' ' &&\n xmlData[i] !== '\\t' &&\n xmlData[i] !== '\\n' &&\n xmlData[i] !== '\\r'; i++\n ) {\n tagName += xmlData[i];\n }\n tagName = tagName.trim();\n //console.log(tagName);\n\n if (tagName[tagName.length - 1] === '/') {\n //self closing tag without attributes\n tagName = tagName.substring(0, tagName.length - 1);\n //continue;\n i--;\n }\n if (!validateTagName(tagName)) {\n let msg;\n if (tagName.trim().length === 0) {\n msg = \"Invalid space after '<'.\";\n } else {\n msg = \"Tag '\"+tagName+\"' is an invalid name.\";\n }\n return getErrorObject('InvalidTag', msg, getLineNumberForPosition(xmlData, i));\n }\n\n const result = readAttributeStr(xmlData, i);\n if (result === false) {\n return getErrorObject('InvalidAttr', \"Attributes for '\"+tagName+\"' have open quote.\", getLineNumberForPosition(xmlData, i));\n }\n let attrStr = result.value;\n i = result.index;\n\n if (attrStr[attrStr.length - 1] === '/') {\n //self closing tag\n const attrStrStart = i - attrStr.length;\n attrStr = attrStr.substring(0, attrStr.length - 1);\n const isValid = validateAttributeString(attrStr, options);\n if (isValid === true) {\n tagFound = true;\n //continue; //text may presents after self closing tag\n } else {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, attrStrStart + isValid.err.line));\n }\n } else if (closingTag) {\n if (!result.tagClosed) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' doesn't have proper closing.\", getLineNumberForPosition(xmlData, i));\n } else if (attrStr.trim().length > 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' can't have attributes or invalid starting.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else if (tags.length === 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' has not been opened.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else {\n const otg = tags.pop();\n if (tagName !== otg.tagName) {\n let openPos = getLineNumberForPosition(xmlData, otg.tagStartPos);\n return getErrorObject('InvalidTag',\n \"Expected closing tag '\"+otg.tagName+\"' (opened in line \"+openPos.line+\", col \"+openPos.col+\") instead of closing tag '\"+tagName+\"'.\",\n getLineNumberForPosition(xmlData, tagStartPos));\n }\n\n //when there are no more tags, we reached the root level.\n if (tags.length == 0) {\n reachedRoot = true;\n }\n }\n } else {\n const isValid = validateAttributeString(attrStr, options);\n if (isValid !== true) {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, i - attrStr.length + isValid.err.line));\n }\n\n //if the root level has been reached before ...\n if (reachedRoot === true) {\n return getErrorObject('InvalidXml', 'Multiple possible root nodes found.', getLineNumberForPosition(xmlData, i));\n } else if(options.unpairedTags.indexOf(tagName) !== -1){\n //don't push into stack\n } else {\n tags.push({tagName, tagStartPos});\n }\n tagFound = true;\n }\n\n //skip tag text value\n //It may include comments and CDATA value\n for (i++; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n if (xmlData[i + 1] === '!') {\n //comment or CADATA\n i++;\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else if (xmlData[i+1] === '?') {\n i = readPI(xmlData, ++i);\n if (i.err) return i;\n } else{\n break;\n }\n } else if (xmlData[i] === '&') {\n const afterAmp = validateAmpersand(xmlData, i);\n if (afterAmp == -1)\n return getErrorObject('InvalidChar', \"char '&' is not expected.\", getLineNumberForPosition(xmlData, i));\n i = afterAmp;\n }else{\n if (reachedRoot === true && !isWhiteSpace(xmlData[i])) {\n return getErrorObject('InvalidXml', \"Extra text at the end\", getLineNumberForPosition(xmlData, i));\n }\n }\n } //end of reading tag text value\n if (xmlData[i] === '<') {\n i--;\n }\n }\n } else {\n if ( isWhiteSpace(xmlData[i])) {\n continue;\n }\n return getErrorObject('InvalidChar', \"char '\"+xmlData[i]+\"' is not expected.\", getLineNumberForPosition(xmlData, i));\n }\n }\n\n if (!tagFound) {\n return getErrorObject('InvalidXml', 'Start tag expected.', 1);\n }else if (tags.length == 1) {\n return getErrorObject('InvalidTag', \"Unclosed tag '\"+tags[0].tagName+\"'.\", getLineNumberForPosition(xmlData, tags[0].tagStartPos));\n }else if (tags.length > 0) {\n return getErrorObject('InvalidXml', \"Invalid '\"+\n JSON.stringify(tags.map(t => t.tagName), null, 4).replace(/\\r?\\n/g, '')+\n \"' found.\", {line: 1, col: 1});\n }\n\n return true;\n};\n\nfunction isWhiteSpace(char){\n return char === ' ' || char === '\\t' || char === '\\n' || char === '\\r';\n}\n/**\n * Read Processing insstructions and skip\n * @param {*} xmlData\n * @param {*} i\n */\nfunction readPI(xmlData, i) {\n const start = i;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] == '?' || xmlData[i] == ' ') {\n //tagname\n const tagname = xmlData.substr(start, i - start);\n if (i > 5 && tagname === 'xml') {\n return getErrorObject('InvalidXml', 'XML declaration allowed only at the start of the document.', getLineNumberForPosition(xmlData, i));\n } else if (xmlData[i] == '?' && xmlData[i + 1] == '>') {\n //check if valid attribut string\n i++;\n break;\n } else {\n continue;\n }\n }\n }\n return i;\n}\n\nfunction readCommentAndCDATA(xmlData, i) {\n if (xmlData.length > i + 5 && xmlData[i + 1] === '-' && xmlData[i + 2] === '-') {\n //comment\n for (i += 3; i < xmlData.length; i++) {\n if (xmlData[i] === '-' && xmlData[i + 1] === '-' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n } else if (\n xmlData.length > i + 8 &&\n xmlData[i + 1] === 'D' &&\n xmlData[i + 2] === 'O' &&\n xmlData[i + 3] === 'C' &&\n xmlData[i + 4] === 'T' &&\n xmlData[i + 5] === 'Y' &&\n xmlData[i + 6] === 'P' &&\n xmlData[i + 7] === 'E'\n ) {\n let angleBracketsCount = 1;\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n angleBracketsCount++;\n } else if (xmlData[i] === '>') {\n angleBracketsCount--;\n if (angleBracketsCount === 0) {\n break;\n }\n }\n }\n } else if (\n xmlData.length > i + 9 &&\n xmlData[i + 1] === '[' &&\n xmlData[i + 2] === 'C' &&\n xmlData[i + 3] === 'D' &&\n xmlData[i + 4] === 'A' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'A' &&\n xmlData[i + 7] === '['\n ) {\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === ']' && xmlData[i + 1] === ']' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n }\n\n return i;\n}\n\nconst doubleQuote = '\"';\nconst singleQuote = \"'\";\n\n/**\n * Keep reading xmlData until '<' is found outside the attribute value.\n * @param {string} xmlData\n * @param {number} i\n */\nfunction readAttributeStr(xmlData, i) {\n let attrStr = '';\n let startChar = '';\n let tagClosed = false;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === doubleQuote || xmlData[i] === singleQuote) {\n if (startChar === '') {\n startChar = xmlData[i];\n } else if (startChar !== xmlData[i]) {\n //if vaue is enclosed with double quote then single quotes are allowed inside the value and vice versa\n } else {\n startChar = '';\n }\n } else if (xmlData[i] === '>') {\n if (startChar === '') {\n tagClosed = true;\n break;\n }\n }\n attrStr += xmlData[i];\n }\n if (startChar !== '') {\n return false;\n }\n\n return {\n value: attrStr,\n index: i,\n tagClosed: tagClosed\n };\n}\n\n/**\n * Select all the attributes whether valid or invalid.\n */\nconst validAttrStrRegxp = new RegExp('(\\\\s*)([^\\\\s=]+)(\\\\s*=)?(\\\\s*([\\'\"])(([\\\\s\\\\S])*?)\\\\5)?', 'g');\n\n//attr, =\"sd\", a=\"amit's\", a=\"sd\"b=\"saf\", ab cd=\"\"\n\nfunction validateAttributeString(attrStr, options) {\n //console.log(\"start:\"+attrStr+\":end\");\n\n //if(attrStr.trim().length === 0) return true; //empty string\n\n const matches = getAllMatches(attrStr, validAttrStrRegxp);\n const attrNames = {};\n\n for (let i = 0; i < matches.length; i++) {\n if (matches[i][1].length === 0) {\n //nospace before attribute name: a=\"sd\"b=\"saf\"\n return getErrorObject('InvalidAttr', \"Attribute '\"+matches[i][2]+\"' has no space in starting.\", getPositionFromMatch(matches[i]))\n } else if (matches[i][3] !== undefined && matches[i][4] === undefined) {\n return getErrorObject('InvalidAttr', \"Attribute '\"+matches[i][2]+\"' is without value.\", getPositionFromMatch(matches[i]));\n } else if (matches[i][3] === undefined && !options.allowBooleanAttributes) {\n //independent attribute: ab\n return getErrorObject('InvalidAttr', \"boolean attribute '\"+matches[i][2]+\"' is not allowed.\", getPositionFromMatch(matches[i]));\n }\n /* else if(matches[i][6] === undefined){//attribute without value: ab=\n return { err: { code:\"InvalidAttr\",msg:\"attribute \" + matches[i][2] + \" has no value assigned.\"}};\n } */\n const attrName = matches[i][2];\n if (!validateAttrName(attrName)) {\n return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is an invalid name.\", getPositionFromMatch(matches[i]));\n }\n if (!attrNames.hasOwnProperty(attrName)) {\n //check for duplicate attribute.\n attrNames[attrName] = 1;\n } else {\n return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is repeated.\", getPositionFromMatch(matches[i]));\n }\n }\n\n return true;\n}\n\nfunction validateNumberAmpersand(xmlData, i) {\n let re = /\\d/;\n if (xmlData[i] === 'x') {\n i++;\n re = /[\\da-fA-F]/;\n }\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === ';')\n return i;\n if (!xmlData[i].match(re))\n break;\n }\n return -1;\n}\n\nfunction validateAmpersand(xmlData, i) {\n // https://www.w3.org/TR/xml/#dt-charref\n i++;\n if (xmlData[i] === ';')\n return -1;\n if (xmlData[i] === '#') {\n i++;\n return validateNumberAmpersand(xmlData, i);\n }\n let count = 0;\n for (; i < xmlData.length; i++, count++) {\n if (xmlData[i].match(/\\w/) && count < 20)\n continue;\n if (xmlData[i] === ';')\n break;\n return -1;\n }\n return i;\n}\n\nfunction getErrorObject(code, message, lineNumber) {\n return {\n err: {\n code: code,\n msg: message,\n line: lineNumber.line || lineNumber,\n col: lineNumber.col,\n },\n };\n}\n\nfunction validateAttrName(attrName) {\n return isName(attrName);\n}\n\n// const startsWithXML = /^xml/i;\n\nfunction validateTagName(tagname) {\n return isName(tagname) /* && !tagname.match(startsWithXML) */;\n}\n\n//this function returns the line number for the character at the given index\nfunction getLineNumberForPosition(xmlData, index) {\n const lines = xmlData.substring(0, index).split(/\\r?\\n/);\n return {\n line: lines.length,\n\n // column number is last line's length + 1, because column numbering starts at 1:\n col: lines[lines.length - 1].length + 1\n };\n}\n\n//this function returns the position of the first character of match within attrStr\nfunction getPositionFromMatch(match) {\n return match.startIndex + match[1].length;\n}\n","\nexport const defaultOptions = {\n preserveOrder: false,\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n removeNSPrefix: false, // remove NS from tag name or attribute name if true\n allowBooleanAttributes: false, //a tag can have attributes without any value\n //ignoreRootElement : false,\n parseTagValue: true,\n parseAttributeValue: false,\n trimValues: true, //Trim string values of tag and attributes\n cdataPropName: false,\n numberParseOptions: {\n hex: true,\n leadingZeros: true,\n eNotation: true\n },\n tagValueProcessor: function(tagName, val) {\n return val;\n },\n attributeValueProcessor: function(attrName, val) {\n return val;\n },\n stopNodes: [], //nested tags will not be parsed even for errors\n alwaysCreateTextNode: false,\n isArray: () => false,\n commentPropName: false,\n unpairedTags: [],\n processEntities: true,\n htmlEntities: false,\n ignoreDeclaration: false,\n ignorePiTags: false,\n transformTagName: false,\n transformAttributeName: false,\n updateTag: function(tagName, jPath, attrs){\n return tagName\n },\n // skipEmptyListItem: false\n captureMetaData: false,\n};\n \nexport const buildOptions = function(options) {\n return Object.assign({}, defaultOptions, options);\n};\n","'use strict';\n\nlet METADATA_SYMBOL;\n\nif (typeof Symbol !== \"function\") {\n METADATA_SYMBOL = \"@@xmlMetadata\";\n} else {\n METADATA_SYMBOL = Symbol(\"XML Node Metadata\");\n}\n\nexport default class XmlNode{\n constructor(tagname) {\n this.tagname = tagname;\n this.child = []; //nested tags, text, cdata, comments in order\n this[\":@\"] = {}; //attributes map\n }\n add(key,val){\n // this.child.push( {name : key, val: val, isCdata: isCdata });\n if(key === \"__proto__\") key = \"#__proto__\";\n this.child.push( {[key]: val });\n }\n addChild(node, startIndex) {\n if(node.tagname === \"__proto__\") node.tagname = \"#__proto__\";\n if(node[\":@\"] && Object.keys(node[\":@\"]).length > 0){\n this.child.push( { [node.tagname]: node.child, [\":@\"]: node[\":@\"] });\n }else{\n this.child.push( { [node.tagname]: node.child });\n }\n // if requested, add the startIndex\n if (startIndex !== undefined) {\n // Note: for now we just overwrite the metadata. If we had more complex metadata,\n // we might need to do an object append here: metadata = { ...metadata, startIndex }\n this.child[this.child.length - 1][METADATA_SYMBOL] = { startIndex };\n }\n }\n /** symbol used for metadata */\n static getMetaDataSymbol() {\n return METADATA_SYMBOL;\n }\n}\n","import {isName} from '../util.js';\n\nexport default class DocTypeReader{\n constructor(processEntities){\n this.suppressValidationErr = !processEntities;\n }\n \n readDocType(xmlData, i){\n \n const entities = {};\n if( xmlData[i + 3] === 'O' &&\n xmlData[i + 4] === 'C' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'Y' &&\n xmlData[i + 7] === 'P' &&\n xmlData[i + 8] === 'E')\n { \n i = i+9;\n let angleBracketsCount = 1;\n let hasBody = false, comment = false;\n let exp = \"\";\n for(;i') { //Read tag content\n if(comment){\n if( xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\"){\n comment = false;\n angleBracketsCount--;\n }\n }else{\n angleBracketsCount--;\n }\n if (angleBracketsCount === 0) {\n break;\n }\n }else if( xmlData[i] === '['){\n hasBody = true;\n }else{\n exp += xmlData[i];\n }\n }\n if(angleBracketsCount !== 0){\n throw new Error(`Unclosed DOCTYPE`);\n }\n }else{\n throw new Error(`Invalid Tag instead of DOCTYPE`);\n }\n return {entities, i};\n }\n readEntityExp(xmlData, i) { \n //External entities are not supported\n // \n\n //Parameter entities are not supported\n // \n\n //Internal entities are supported\n // \n\n // Skip leading whitespace after \n // \n // \n // \n // \n \n // Skip leading whitespace after {\n while (index < data.length && /\\s/.test(data[index])) {\n index++;\n }\n return index;\n};\n\n\n\nfunction hasSeq(data, seq,i){\n for(let j=0;j [ , '+', '00', '.123', ..\n if(match){\n const sign = match[1] || \"\";\n const leadingZeros = match[2];\n let numTrimmedByZeros = trimZeros(match[3]); //complete num without leading zeros\n const decimalAdjacentToLeadingZeros = sign ? // 0., -00., 000.\n str[leadingZeros.length+1] === \".\" \n : str[leadingZeros.length] === \".\";\n\n //trim ending zeros for floating number\n if(!options.leadingZeros //leading zeros are not allowed\n && (leadingZeros.length > 1 \n || (leadingZeros.length === 1 && !decimalAdjacentToLeadingZeros))){\n // 00, 00.3, +03.24, 03, 03.24\n return str;\n }\n else{//no leading zeros or leading zeros are allowed\n const num = Number(trimmedStr);\n const parsedStr = String(num);\n\n if( num === 0 || num === -0) return num;\n if(parsedStr.search(/[eE]/) !== -1){ //given number is long and parsed to eNotation\n if(options.eNotation) return num;\n else return str;\n }else if(trimmedStr.indexOf(\".\") !== -1){ //floating number\n if(parsedStr === \"0\") return num; //0.0\n else if(parsedStr === numTrimmedByZeros) return num; //0.456. 0.79000\n else if( parsedStr === `${sign}${numTrimmedByZeros}`) return num;\n else return str;\n }\n \n let n = leadingZeros? numTrimmedByZeros : trimmedStr;\n if(leadingZeros){\n // -009 => -9\n return (n === parsedStr) || (sign+n === parsedStr) ? num : str\n }else {\n // +9\n return (n === parsedStr) || (n === sign+parsedStr) ? num : str\n }\n }\n }else{ //non-numeric string\n return str;\n }\n }\n}\n\nconst eNotationRegx = /^([-+])?(0*)(\\d*(\\.\\d*)?[eE][-\\+]?\\d+)$/;\nfunction resolveEnotation(str,trimmedStr,options){\n if(!options.eNotation) return str;\n const notation = trimmedStr.match(eNotationRegx); \n if(notation){\n let sign = notation[1] || \"\";\n const eChar = notation[3].indexOf(\"e\") === -1 ? \"E\" : \"e\";\n const leadingZeros = notation[2];\n const eAdjacentToLeadingZeros = sign ? // 0E.\n str[leadingZeros.length+1] === eChar \n : str[leadingZeros.length] === eChar;\n\n if(leadingZeros.length > 1 && eAdjacentToLeadingZeros) return str;\n else if(leadingZeros.length === 1 \n && (notation[3].startsWith(`.${eChar}`) || notation[3][0] === eChar)){\n return Number(trimmedStr);\n }else if(options.leadingZeros && !eAdjacentToLeadingZeros){ //accept with leading zeros\n //remove leading 0s\n trimmedStr = (notation[1] || \"\") + notation[3];\n return Number(trimmedStr);\n }else return str;\n }else{\n return str;\n }\n}\n\n/**\n * \n * @param {string} numStr without leading zeros\n * @returns \n */\nfunction trimZeros(numStr){\n if(numStr && numStr.indexOf(\".\") !== -1){//float\n numStr = numStr.replace(/0+$/, \"\"); //remove ending zeros\n if(numStr === \".\") numStr = \"0\";\n else if(numStr[0] === \".\") numStr = \"0\"+numStr;\n else if(numStr[numStr.length-1] === \".\") numStr = numStr.substring(0,numStr.length-1);\n return numStr;\n }\n return numStr;\n}\n\nfunction parse_int(numStr, base){\n //polyfill\n if(parseInt) return parseInt(numStr, base);\n else if(Number.parseInt) return Number.parseInt(numStr, base);\n else if(window && window.parseInt) return window.parseInt(numStr, base);\n else throw new Error(\"parseInt, Number.parseInt, window.parseInt are not supported\")\n}","export default function getIgnoreAttributesFn(ignoreAttributes) {\n if (typeof ignoreAttributes === 'function') {\n return ignoreAttributes\n }\n if (Array.isArray(ignoreAttributes)) {\n return (attrName) => {\n for (const pattern of ignoreAttributes) {\n if (typeof pattern === 'string' && attrName === pattern) {\n return true\n }\n if (pattern instanceof RegExp && pattern.test(attrName)) {\n return true\n }\n }\n }\n }\n return () => false\n}","'use strict';\n///@ts-check\n\nimport {getAllMatches, isExist} from '../util.js';\nimport xmlNode from './xmlNode.js';\nimport DocTypeReader from './DocTypeReader.js';\nimport toNumber from \"strnum\";\nimport getIgnoreAttributesFn from \"../ignoreAttributes.js\";\n\n// const regx =\n// '<((!\\\\[CDATA\\\\[([\\\\s\\\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\\\/)(NAME)\\\\s*>))([^<]*)'\n// .replace(/NAME/g, util.nameRegexp);\n\n//const tagsRegx = new RegExp(\"<(\\\\/?[\\\\w:\\\\-\\._]+)([^>]*)>(\\\\s*\"+cdataRegx+\")*([^<]+)?\",\"g\");\n//const tagsRegx = new RegExp(\"<(\\\\/?)((\\\\w*:)?([\\\\w:\\\\-\\._]+))([^>]*)>([^<]*)(\"+cdataRegx+\"([^<]*))*([^<]+)?\",\"g\");\n\nexport default class OrderedObjParser{\n constructor(options){\n this.options = options;\n this.currentNode = null;\n this.tagsNodeStack = [];\n this.docTypeEntities = {};\n this.lastEntities = {\n \"apos\" : { regex: /&(apos|#39|#x27);/g, val : \"'\"},\n \"gt\" : { regex: /&(gt|#62|#x3E);/g, val : \">\"},\n \"lt\" : { regex: /&(lt|#60|#x3C);/g, val : \"<\"},\n \"quot\" : { regex: /&(quot|#34|#x22);/g, val : \"\\\"\"},\n };\n this.ampEntity = { regex: /&(amp|#38|#x26);/g, val : \"&\"};\n this.htmlEntities = {\n \"space\": { regex: /&(nbsp|#160);/g, val: \" \" },\n // \"lt\" : { regex: /&(lt|#60);/g, val: \"<\" },\n // \"gt\" : { regex: /&(gt|#62);/g, val: \">\" },\n // \"amp\" : { regex: /&(amp|#38);/g, val: \"&\" },\n // \"quot\" : { regex: /&(quot|#34);/g, val: \"\\\"\" },\n // \"apos\" : { regex: /&(apos|#39);/g, val: \"'\" },\n \"cent\" : { regex: /&(cent|#162);/g, val: \"¢\" },\n \"pound\" : { regex: /&(pound|#163);/g, val: \"£\" },\n \"yen\" : { regex: /&(yen|#165);/g, val: \"¥\" },\n \"euro\" : { regex: /&(euro|#8364);/g, val: \"€\" },\n \"copyright\" : { regex: /&(copy|#169);/g, val: \"©\" },\n \"reg\" : { regex: /&(reg|#174);/g, val: \"®\" },\n \"inr\" : { regex: /&(inr|#8377);/g, val: \"₹\" },\n \"num_dec\": { regex: /([0-9]{1,7});/g, val : (_, str) => fromCodePoint(str, 10, \"\") },\n \"num_hex\": { regex: /([0-9a-fA-F]{1,6});/g, val : (_, str) => fromCodePoint(str, 16, \"\") },\n };\n this.addExternalEntities = addExternalEntities;\n this.parseXml = parseXml;\n this.parseTextData = parseTextData;\n this.resolveNameSpace = resolveNameSpace;\n this.buildAttributesMap = buildAttributesMap;\n this.isItStopNode = isItStopNode;\n this.replaceEntitiesValue = replaceEntitiesValue;\n this.readStopNodeData = readStopNodeData;\n this.saveTextToParentTag = saveTextToParentTag;\n this.addChild = addChild;\n this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)\n\n if(this.options.stopNodes && this.options.stopNodes.length > 0){\n this.stopNodesExact = new Set();\n this.stopNodesWildcard = new Set();\n for(let i = 0; i < this.options.stopNodes.length; i++){\n const stopNodeExp = this.options.stopNodes[i];\n if(typeof stopNodeExp !== 'string') continue;\n if(stopNodeExp.startsWith(\"*.\")){\n this.stopNodesWildcard.add(stopNodeExp.substring(2));\n }else{\n this.stopNodesExact.add(stopNodeExp);\n }\n }\n }\n }\n\n}\n\nfunction addExternalEntities(externalEntities){\n const entKeys = Object.keys(externalEntities);\n for (let i = 0; i < entKeys.length; i++) {\n const ent = entKeys[i];\n const escaped = ent.replace(/[.\\-+*:]/g, '\\\\.');\n this.lastEntities[ent] = {\n regex: new RegExp(\"&\"+escaped+\";\",\"g\"),\n val : externalEntities[ent]\n }\n }\n}\n\n/**\n * @param {string} val\n * @param {string} tagName\n * @param {string} jPath\n * @param {boolean} dontTrim\n * @param {boolean} hasAttributes\n * @param {boolean} isLeafNode\n * @param {boolean} escapeEntities\n */\nfunction parseTextData(val, tagName, jPath, dontTrim, hasAttributes, isLeafNode, escapeEntities) {\n if (val !== undefined) {\n if (this.options.trimValues && !dontTrim) {\n val = val.trim();\n }\n if(val.length > 0){\n if(!escapeEntities) val = this.replaceEntitiesValue(val);\n \n const newval = this.options.tagValueProcessor(tagName, val, jPath, hasAttributes, isLeafNode);\n if(newval === null || newval === undefined){\n //don't parse\n return val;\n }else if(typeof newval !== typeof val || newval !== val){\n //overwrite\n return newval;\n }else if(this.options.trimValues){\n return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n }else{\n const trimmedVal = val.trim();\n if(trimmedVal === val){\n return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n }else{\n return val;\n }\n }\n }\n }\n}\n\nfunction resolveNameSpace(tagname) {\n if (this.options.removeNSPrefix) {\n const tags = tagname.split(':');\n const prefix = tagname.charAt(0) === '/' ? '/' : '';\n if (tags[0] === 'xmlns') {\n return '';\n }\n if (tags.length === 2) {\n tagname = prefix + tags[1];\n }\n }\n return tagname;\n}\n\n//TODO: change regex to capture NS\n//const attrsRegx = new RegExp(\"([\\\\w\\\\-\\\\.\\\\:]+)\\\\s*=\\\\s*(['\\\"])((.|\\n)*?)\\\\2\",\"gm\");\nconst attrsRegx = new RegExp('([^\\\\s=]+)\\\\s*(=\\\\s*([\\'\"])([\\\\s\\\\S]*?)\\\\3)?', 'gm');\n\nfunction buildAttributesMap(attrStr, jPath) {\n if (this.options.ignoreAttributes !== true && typeof attrStr === 'string') {\n // attrStr = attrStr.replace(/\\r?\\n/g, ' ');\n //attrStr = attrStr || attrStr.trim();\n\n const matches = getAllMatches(attrStr, attrsRegx);\n const len = matches.length; //don't make it inline\n const attrs = {};\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n if (this.ignoreAttributesFn(attrName, jPath)) {\n continue\n }\n let oldVal = matches[i][4];\n let aName = this.options.attributeNamePrefix + attrName;\n if (attrName.length) {\n if (this.options.transformAttributeName) {\n aName = this.options.transformAttributeName(aName);\n }\n if(aName === \"__proto__\") aName = \"#__proto__\";\n if (oldVal !== undefined) {\n if (this.options.trimValues) {\n oldVal = oldVal.trim();\n }\n oldVal = this.replaceEntitiesValue(oldVal);\n const newVal = this.options.attributeValueProcessor(attrName, oldVal, jPath);\n if(newVal === null || newVal === undefined){\n //don't parse\n attrs[aName] = oldVal;\n }else if(typeof newVal !== typeof oldVal || newVal !== oldVal){\n //overwrite\n attrs[aName] = newVal;\n }else{\n //parse\n attrs[aName] = parseValue(\n oldVal,\n this.options.parseAttributeValue,\n this.options.numberParseOptions\n );\n }\n } else if (this.options.allowBooleanAttributes) {\n attrs[aName] = true;\n }\n }\n }\n if (!Object.keys(attrs).length) {\n return;\n }\n if (this.options.attributesGroupName) {\n const attrCollection = {};\n attrCollection[this.options.attributesGroupName] = attrs;\n return attrCollection;\n }\n return attrs\n }\n}\n\nconst parseXml = function(xmlData) {\n xmlData = xmlData.replace(/\\r\\n?/g, \"\\n\"); //TODO: remove this line\n const xmlObj = new xmlNode('!xml');\n let currentNode = xmlObj;\n let textData = \"\";\n let jPath = \"\";\n const docTypeReader = new DocTypeReader(this.options.processEntities);\n for(let i=0; i< xmlData.length; i++){//for each char in XML data\n const ch = xmlData[i];\n if(ch === '<'){\n // const nextIndex = i+1;\n // const _2ndChar = xmlData[nextIndex];\n if( xmlData[i+1] === '/') {//Closing Tag\n const closeIndex = findClosingIndex(xmlData, \">\", i, \"Closing Tag is not closed.\")\n let tagName = xmlData.substring(i+2,closeIndex).trim();\n\n if(this.options.removeNSPrefix){\n const colonIndex = tagName.indexOf(\":\");\n if(colonIndex !== -1){\n tagName = tagName.substr(colonIndex+1);\n }\n }\n\n if(this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n\n if(currentNode){\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n }\n\n //check if last tag of nested tag was unpaired tag\n const lastTagName = jPath.substring(jPath.lastIndexOf(\".\")+1);\n if(tagName && this.options.unpairedTags.indexOf(tagName) !== -1 ){\n throw new Error(`Unpaired tag can not be used as closing tag: ${tagName}>`);\n }\n let propIndex = 0\n if(lastTagName && this.options.unpairedTags.indexOf(lastTagName) !== -1 ){\n propIndex = jPath.lastIndexOf('.', jPath.lastIndexOf('.')-1)\n this.tagsNodeStack.pop();\n }else{\n propIndex = jPath.lastIndexOf(\".\");\n }\n jPath = jPath.substring(0, propIndex);\n\n currentNode = this.tagsNodeStack.pop();//avoid recursion, set the parent tag scope\n textData = \"\";\n i = closeIndex;\n } else if( xmlData[i+1] === '?') {\n\n let tagData = readTagExp(xmlData,i, false, \"?>\");\n if(!tagData) throw new Error(\"Pi Tag is not closed.\");\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n if( (this.options.ignoreDeclaration && tagData.tagName === \"?xml\") || this.options.ignorePiTags){\n //do nothing\n }else{\n \n const childNode = new xmlNode(tagData.tagName);\n childNode.add(this.options.textNodeName, \"\");\n \n if(tagData.tagName !== tagData.tagExp && tagData.attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagData.tagExp, jPath);\n }\n this.addChild(currentNode, childNode, jPath, i);\n }\n\n\n i = tagData.closeIndex + 1;\n } else if(xmlData.substr(i + 1, 3) === '!--') {\n const endIndex = findClosingIndex(xmlData, \"-->\", i+4, \"Comment is not closed.\")\n if(this.options.commentPropName){\n const comment = xmlData.substring(i + 4, endIndex - 2);\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n currentNode.add(this.options.commentPropName, [ { [this.options.textNodeName] : comment } ]);\n }\n i = endIndex;\n } else if( xmlData.substr(i + 1, 2) === '!D') {\n const result = docTypeReader.readDocType(xmlData, i);\n this.docTypeEntities = result.entities;\n i = result.i;\n }else if(xmlData.substr(i + 1, 2) === '![') {\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"CDATA is not closed.\") - 2;\n const tagExp = xmlData.substring(i + 9,closeIndex);\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n let val = this.parseTextData(tagExp, currentNode.tagname, jPath, true, false, true, true);\n if(val == undefined) val = \"\";\n\n //cdata should be set even if it is 0 length string\n if(this.options.cdataPropName){\n currentNode.add(this.options.cdataPropName, [ { [this.options.textNodeName] : tagExp } ]);\n }else{\n currentNode.add(this.options.textNodeName, val);\n }\n \n i = closeIndex + 2;\n }else {//Opening tag\n let result = readTagExp(xmlData,i, this.options.removeNSPrefix);\n let tagName= result.tagName;\n const rawTagName = result.rawTagName;\n let tagExp = result.tagExp;\n let attrExpPresent = result.attrExpPresent;\n let closeIndex = result.closeIndex;\n\n if (this.options.transformTagName) {\n //console.log(tagExp, tagName)\n const newTagName = this.options.transformTagName(tagName);\n if(tagExp === tagName) {\n tagExp = newTagName\n }\n tagName = newTagName;\n }\n \n //save text as child node\n if (currentNode && textData) {\n if(currentNode.tagname !== '!xml'){\n //when nested tag is found\n textData = this.saveTextToParentTag(textData, currentNode, jPath, false);\n }\n }\n\n //check if last tag was unpaired tag\n const lastTag = currentNode;\n if(lastTag && this.options.unpairedTags.indexOf(lastTag.tagname) !== -1 ){\n currentNode = this.tagsNodeStack.pop();\n jPath = jPath.substring(0, jPath.lastIndexOf(\".\"));\n }\n if(tagName !== xmlObj.tagname){\n jPath += jPath ? \".\" + tagName : tagName;\n }\n const startIndex = i;\n if (this.isItStopNode(this.stopNodesExact, this.stopNodesWildcard, jPath, tagName)) {\n let tagContent = \"\";\n //self-closing tag\n if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){\n if(tagName[tagName.length - 1] === \"/\"){ //remove trailing '/'\n tagName = tagName.substr(0, tagName.length - 1);\n jPath = jPath.substr(0, jPath.length - 1);\n tagExp = tagName;\n }else{\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n i = result.closeIndex;\n }\n //unpaired tag\n else if(this.options.unpairedTags.indexOf(tagName) !== -1){\n \n i = result.closeIndex;\n }\n //normal tag\n else{\n //read until closing tag is found\n const result = this.readStopNodeData(xmlData, rawTagName, closeIndex + 1);\n if(!result) throw new Error(`Unexpected end of ${rawTagName}`);\n i = result.i;\n tagContent = result.tagContent;\n }\n\n const childNode = new xmlNode(tagName);\n\n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath\n );\n }\n if(tagContent) {\n tagContent = this.parseTextData(tagContent, tagName, jPath, true, attrExpPresent, true, true);\n }\n \n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n childNode.add(this.options.textNodeName, tagContent);\n \n this.addChild(currentNode, childNode, jPath, startIndex);\n }else{\n //selfClosing tag\n if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){\n if(tagName[tagName.length - 1] === \"/\"){ //remove trailing '/'\n tagName = tagName.substr(0, tagName.length - 1);\n jPath = jPath.substr(0, jPath.length - 1);\n tagExp = tagName;\n }else{\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n \n if(this.options.transformTagName) {\n const newTagName = this.options.transformTagName(tagName);\n if(tagExp === tagName) {\n tagExp = newTagName\n }\n tagName = newTagName;\n }\n\n const childNode = new xmlNode(tagName);\n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath);\n }\n this.addChild(currentNode, childNode, jPath, startIndex);\n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n }\n //opening tag\n else{\n const childNode = new xmlNode( tagName);\n this.tagsNodeStack.push(currentNode);\n \n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath);\n }\n this.addChild(currentNode, childNode, jPath, startIndex);\n currentNode = childNode;\n }\n textData = \"\";\n i = closeIndex;\n }\n }\n }else{\n textData += xmlData[i];\n }\n }\n return xmlObj.child;\n}\n\nfunction addChild(currentNode, childNode, jPath, startIndex){\n // unset startIndex if not requested\n if (!this.options.captureMetaData) startIndex = undefined;\n const result = this.options.updateTag(childNode.tagname, jPath, childNode[\":@\"])\n if(result === false){\n //do nothing\n } else if(typeof result === \"string\"){\n childNode.tagname = result\n currentNode.addChild(childNode, startIndex);\n }else{\n currentNode.addChild(childNode, startIndex);\n }\n}\n\nconst replaceEntitiesValue = function(val){\n\n if(this.options.processEntities){\n for(let entityName in this.docTypeEntities){\n const entity = this.docTypeEntities[entityName];\n val = val.replace( entity.regx, entity.val);\n }\n for(let entityName in this.lastEntities){\n const entity = this.lastEntities[entityName];\n val = val.replace( entity.regex, entity.val);\n }\n if(this.options.htmlEntities){\n for(let entityName in this.htmlEntities){\n const entity = this.htmlEntities[entityName];\n val = val.replace( entity.regex, entity.val);\n }\n }\n val = val.replace( this.ampEntity.regex, this.ampEntity.val);\n }\n return val;\n}\nfunction saveTextToParentTag(textData, currentNode, jPath, isLeafNode) {\n if (textData) { //store previously collected data as textNode\n if(isLeafNode === undefined) isLeafNode = currentNode.child.length === 0\n \n textData = this.parseTextData(textData,\n currentNode.tagname,\n jPath,\n false,\n currentNode[\":@\"] ? Object.keys(currentNode[\":@\"]).length !== 0 : false,\n isLeafNode);\n\n if (textData !== undefined && textData !== \"\")\n currentNode.add(this.options.textNodeName, textData);\n textData = \"\";\n }\n return textData;\n}\n\n//TODO: use jPath to simplify the logic\n/**\n * @param {Set} stopNodesExact\n * @param {Set} stopNodesWildcard\n * @param {string} jPath\n * @param {string} currentTagName\n */\nfunction isItStopNode(stopNodesExact, stopNodesWildcard, jPath, currentTagName){\n if(stopNodesWildcard && stopNodesWildcard.has(currentTagName)) return true;\n if(stopNodesExact && stopNodesExact.has(jPath)) return true;\n return false;\n}\n\n/**\n * Returns the tag Expression and where it is ending handling single-double quotes situation\n * @param {string} xmlData \n * @param {number} i starting index\n * @returns \n */\nfunction tagExpWithClosingIndex(xmlData, i, closingChar = \">\"){\n let attrBoundary;\n let tagExp = \"\";\n for (let index = i; index < xmlData.length; index++) {\n let ch = xmlData[index];\n if (attrBoundary) {\n if (ch === attrBoundary) attrBoundary = \"\";//reset\n } else if (ch === '\"' || ch === \"'\") {\n attrBoundary = ch;\n } else if (ch === closingChar[0]) {\n if(closingChar[1]){\n if(xmlData[index + 1] === closingChar[1]){\n return {\n data: tagExp,\n index: index\n }\n }\n }else{\n return {\n data: tagExp,\n index: index\n }\n }\n } else if (ch === '\\t') {\n ch = \" \"\n }\n tagExp += ch;\n }\n}\n\nfunction findClosingIndex(xmlData, str, i, errMsg){\n const closingIndex = xmlData.indexOf(str, i);\n if(closingIndex === -1){\n throw new Error(errMsg)\n }else{\n return closingIndex + str.length - 1;\n }\n}\n\nfunction readTagExp(xmlData,i, removeNSPrefix, closingChar = \">\"){\n const result = tagExpWithClosingIndex(xmlData, i+1, closingChar);\n if(!result) return;\n let tagExp = result.data;\n const closeIndex = result.index;\n const separatorIndex = tagExp.search(/\\s/);\n let tagName = tagExp;\n let attrExpPresent = true;\n if(separatorIndex !== -1){//separate tag name and attributes expression\n tagName = tagExp.substring(0, separatorIndex);\n tagExp = tagExp.substring(separatorIndex + 1).trimStart();\n }\n\n const rawTagName = tagName;\n if(removeNSPrefix){\n const colonIndex = tagName.indexOf(\":\");\n if(colonIndex !== -1){\n tagName = tagName.substr(colonIndex+1);\n attrExpPresent = tagName !== result.data.substr(colonIndex + 1);\n }\n }\n\n return {\n tagName: tagName,\n tagExp: tagExp,\n closeIndex: closeIndex,\n attrExpPresent: attrExpPresent,\n rawTagName: rawTagName,\n }\n}\n/**\n * find paired tag for a stop node\n * @param {string} xmlData \n * @param {string} tagName \n * @param {number} i \n */\nfunction readStopNodeData(xmlData, tagName, i){\n const startIndex = i;\n // Starting at 1 since we already have an open tag\n let openTagCount = 1;\n\n for (; i < xmlData.length; i++) {\n if( xmlData[i] === \"<\"){ \n if (xmlData[i+1] === \"/\") {//close tag\n const closeIndex = findClosingIndex(xmlData, \">\", i, `${tagName} is not closed`);\n let closeTagName = xmlData.substring(i+2,closeIndex).trim();\n if(closeTagName === tagName){\n openTagCount--;\n if (openTagCount === 0) {\n return {\n tagContent: xmlData.substring(startIndex, i),\n i : closeIndex\n }\n }\n }\n i=closeIndex;\n } else if(xmlData[i+1] === '?') { \n const closeIndex = findClosingIndex(xmlData, \"?>\", i+1, \"StopNode is not closed.\")\n i=closeIndex;\n } else if(xmlData.substr(i + 1, 3) === '!--') { \n const closeIndex = findClosingIndex(xmlData, \"-->\", i+3, \"StopNode is not closed.\")\n i=closeIndex;\n } else if(xmlData.substr(i + 1, 2) === '![') { \n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"StopNode is not closed.\") - 2;\n i=closeIndex;\n } else {\n const tagData = readTagExp(xmlData, i, '>')\n\n if (tagData) {\n const openTagName = tagData && tagData.tagName;\n if (openTagName === tagName && tagData.tagExp[tagData.tagExp.length-1] !== \"/\") {\n openTagCount++;\n }\n i=tagData.closeIndex;\n }\n }\n }\n }//end for loop\n}\n\nfunction parseValue(val, shouldParse, options) {\n if (shouldParse && typeof val === 'string') {\n //console.log(options)\n const newval = val.trim();\n if(newval === 'true' ) return true;\n else if(newval === 'false' ) return false;\n else return toNumber(val, options);\n } else {\n if (isExist(val)) {\n return val;\n } else {\n return '';\n }\n }\n}\n\nfunction fromCodePoint(str, base, prefix){\n const codePoint = Number.parseInt(str, base);\n\n if (codePoint >= 0 && codePoint <= 0x10FFFF) {\n return String.fromCodePoint(codePoint);\n } else {\n return prefix +str + \";\";\n }\n}","'use strict';\n\nimport XmlNode from './xmlNode.js';\n\nconst METADATA_SYMBOL = XmlNode.getMetaDataSymbol();\n\n/**\n * \n * @param {array} node \n * @param {any} options \n * @returns \n */\nexport default function prettify(node, options){\n return compress( node, options);\n}\n\n/**\n * \n * @param {array} arr \n * @param {object} options \n * @param {string} jPath \n * @returns object\n */\nfunction compress(arr, options, jPath){\n let text;\n const compressedObj = {};\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const property = propName(tagObj);\n let newJpath = \"\";\n if(jPath === undefined) newJpath = property;\n else newJpath = jPath + \".\" + property;\n\n if(property === options.textNodeName){\n if(text === undefined) text = tagObj[property];\n else text += \"\" + tagObj[property];\n }else if(property === undefined){\n continue;\n }else if(tagObj[property]){\n \n let val = compress(tagObj[property], options, newJpath);\n const isLeaf = isLeafTag(val, options);\n if (tagObj[METADATA_SYMBOL] !== undefined) {\n val[METADATA_SYMBOL] = tagObj[METADATA_SYMBOL]; // copy over metadata\n }\n\n if(tagObj[\":@\"]){\n assignAttributes( val, tagObj[\":@\"], newJpath, options);\n }else if(Object.keys(val).length === 1 && val[options.textNodeName] !== undefined && !options.alwaysCreateTextNode){\n val = val[options.textNodeName];\n }else if(Object.keys(val).length === 0){\n if(options.alwaysCreateTextNode) val[options.textNodeName] = \"\";\n else val = \"\";\n }\n\n if(compressedObj[property] !== undefined && compressedObj.hasOwnProperty(property)) {\n if(!Array.isArray(compressedObj[property])) {\n compressedObj[property] = [ compressedObj[property] ];\n }\n compressedObj[property].push(val);\n }else{\n //TODO: if a node is not an array, then check if it should be an array\n //also determine if it is a leaf node\n if (options.isArray(property, newJpath, isLeaf )) {\n compressedObj[property] = [val];\n }else{\n compressedObj[property] = val;\n }\n }\n }\n \n }\n // if(text && text.length > 0) compressedObj[options.textNodeName] = text;\n if(typeof text === \"string\"){\n if(text.length > 0) compressedObj[options.textNodeName] = text;\n }else if(text !== undefined) compressedObj[options.textNodeName] = text;\n return compressedObj;\n}\n\nfunction propName(obj){\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if(key !== \":@\") return key;\n }\n}\n\nfunction assignAttributes(obj, attrMap, jpath, options){\n if (attrMap) {\n const keys = Object.keys(attrMap);\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n const atrrName = keys[i];\n if (options.isArray(atrrName, jpath + \".\" + atrrName, true, true)) {\n obj[atrrName] = [ attrMap[atrrName] ];\n } else {\n obj[atrrName] = attrMap[atrrName];\n }\n }\n }\n}\n\nfunction isLeafTag(obj, options){\n const { textNodeName } = options;\n const propCount = Object.keys(obj).length;\n \n if (propCount === 0) {\n return true;\n }\n\n if (\n propCount === 1 &&\n (obj[textNodeName] || typeof obj[textNodeName] === \"boolean\" || obj[textNodeName] === 0)\n ) {\n return true;\n }\n\n return false;\n}\n","import { buildOptions} from './OptionsBuilder.js';\nimport OrderedObjParser from './OrderedObjParser.js';\nimport prettify from './node2json.js';\nimport {validate} from \"../validator.js\";\nimport XmlNode from './xmlNode.js';\n\nexport default class XMLParser{\n \n constructor(options){\n this.externalEntities = {};\n this.options = buildOptions(options);\n \n }\n /**\n * Parse XML dats to JS object \n * @param {string|Uint8Array} xmlData \n * @param {boolean|Object} validationOption \n */\n parse(xmlData,validationOption){\n if(typeof xmlData !== \"string\" && xmlData.toString){\n xmlData = xmlData.toString();\n }else if(typeof xmlData !== \"string\"){\n throw new Error(\"XML data is accepted in String or Bytes[] form.\")\n }\n \n if( validationOption){\n if(validationOption === true) validationOption = {}; //validate with default options\n \n const result = validate(xmlData, validationOption);\n if (result !== true) {\n throw Error( `${result.err.msg}:${result.err.line}:${result.err.col}` )\n }\n }\n const orderedObjParser = new OrderedObjParser(this.options);\n orderedObjParser.addExternalEntities(this.externalEntities);\n const orderedResult = orderedObjParser.parseXml(xmlData);\n if(this.options.preserveOrder || orderedResult === undefined) return orderedResult;\n else return prettify(orderedResult, this.options);\n }\n\n /**\n * Add Entity which is not by default supported by this library\n * @param {string} key \n * @param {string} value \n */\n addEntity(key, value){\n if(value.indexOf(\"&\") !== -1){\n throw new Error(\"Entity value can't have '&'\")\n }else if(key.indexOf(\"&\") !== -1 || key.indexOf(\";\") !== -1){\n throw new Error(\"An entity must be set without '&' and ';'. Eg. use '#xD' for '
'\")\n }else if(value === \"&\"){\n throw new Error(\"An entity with value '&' is not permitted\");\n }else{\n this.externalEntities[key] = value;\n }\n }\n\n /**\n * Returns a Symbol that can be used to access the metadata\n * property on a node.\n * \n * If Symbol is not available in the environment, an ordinary property is used\n * and the name of the property is here returned.\n * \n * The XMLMetaData property is only present when `captureMetaData`\n * is true in the options.\n */\n static getMetaDataSymbol() {\n return XmlNode.getMetaDataSymbol();\n }\n}\n","const EOL = \"\\n\";\n\n/**\n * \n * @param {array} jArray \n * @param {any} options \n * @returns \n */\nexport default function toXml(jArray, options) {\n let indentation = \"\";\n if (options.format && options.indentBy.length > 0) {\n indentation = EOL;\n }\n return arrToStr(jArray, options, \"\", indentation);\n}\n\nfunction arrToStr(arr, options, jPath, indentation) {\n let xmlStr = \"\";\n let isPreviousElementTag = false;\n\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const tagName = propName(tagObj);\n if(tagName === undefined) continue;\n\n let newJPath = \"\";\n if (jPath.length === 0) newJPath = tagName\n else newJPath = `${jPath}.${tagName}`;\n\n if (tagName === options.textNodeName) {\n let tagText = tagObj[tagName];\n if (!isStopNode(newJPath, options)) {\n tagText = options.tagValueProcessor(tagName, tagText);\n tagText = replaceEntitiesValue(tagText, options);\n }\n if (isPreviousElementTag) {\n xmlStr += indentation;\n }\n xmlStr += tagText;\n isPreviousElementTag = false;\n continue;\n } else if (tagName === options.cdataPropName) {\n if (isPreviousElementTag) {\n xmlStr += indentation;\n }\n xmlStr += ``;\n isPreviousElementTag = false;\n continue;\n } else if (tagName === options.commentPropName) {\n xmlStr += indentation + ``;\n isPreviousElementTag = true;\n continue;\n } else if (tagName[0] === \"?\") {\n const attStr = attr_to_str(tagObj[\":@\"], options);\n const tempInd = tagName === \"?xml\" ? \"\" : indentation;\n let piTextNodeName = tagObj[tagName][0][options.textNodeName];\n piTextNodeName = piTextNodeName.length !== 0 ? \" \" + piTextNodeName : \"\"; //remove extra spacing\n xmlStr += tempInd + `<${tagName}${piTextNodeName}${attStr}?>`;\n isPreviousElementTag = true;\n continue;\n }\n let newIdentation = indentation;\n if (newIdentation !== \"\") {\n newIdentation += options.indentBy;\n }\n const attStr = attr_to_str(tagObj[\":@\"], options);\n const tagStart = indentation + `<${tagName}${attStr}`;\n const tagValue = arrToStr(tagObj[tagName], options, newJPath, newIdentation);\n if (options.unpairedTags.indexOf(tagName) !== -1) {\n if (options.suppressUnpairedNode) xmlStr += tagStart + \">\";\n else xmlStr += tagStart + \"/>\";\n } else if ((!tagValue || tagValue.length === 0) && options.suppressEmptyNode) {\n xmlStr += tagStart + \"/>\";\n } else if (tagValue && tagValue.endsWith(\">\")) {\n xmlStr += tagStart + `>${tagValue}${indentation}${tagName}>`;\n } else {\n xmlStr += tagStart + \">\";\n if (tagValue && indentation !== \"\" && (tagValue.includes(\"/>\") || tagValue.includes(\"\"))) {\n xmlStr += indentation + options.indentBy + tagValue + indentation;\n } else {\n xmlStr += tagValue;\n }\n xmlStr += `${tagName}>`;\n }\n isPreviousElementTag = true;\n }\n\n return xmlStr;\n}\n\nfunction propName(obj) {\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if(!obj.hasOwnProperty(key)) continue;\n if (key !== \":@\") return key;\n }\n}\n\nfunction attr_to_str(attrMap, options) {\n let attrStr = \"\";\n if (attrMap && !options.ignoreAttributes) {\n for (let attr in attrMap) {\n if(!attrMap.hasOwnProperty(attr)) continue;\n let attrVal = options.attributeValueProcessor(attr, attrMap[attr]);\n attrVal = replaceEntitiesValue(attrVal, options);\n if (attrVal === true && options.suppressBooleanAttributes) {\n attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}`;\n } else {\n attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}=\"${attrVal}\"`;\n }\n }\n }\n return attrStr;\n}\n\nfunction isStopNode(jPath, options) {\n jPath = jPath.substr(0, jPath.length - options.textNodeName.length - 1);\n let tagName = jPath.substr(jPath.lastIndexOf(\".\") + 1);\n for (let index in options.stopNodes) {\n if (options.stopNodes[index] === jPath || options.stopNodes[index] === \"*.\" + tagName) return true;\n }\n return false;\n}\n\nfunction replaceEntitiesValue(textValue, options) {\n if (textValue && textValue.length > 0 && options.processEntities) {\n for (let i = 0; i < options.entities.length; i++) {\n const entity = options.entities[i];\n textValue = textValue.replace(entity.regex, entity.val);\n }\n }\n return textValue;\n}\n","'use strict';\n//parse Empty Node as self closing node\nimport buildFromOrderedJs from './orderedJs2Xml.js';\nimport getIgnoreAttributesFn from \"../ignoreAttributes.js\";\n\nconst defaultOptions = {\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n cdataPropName: false,\n format: false,\n indentBy: ' ',\n suppressEmptyNode: false,\n suppressUnpairedNode: true,\n suppressBooleanAttributes: true,\n tagValueProcessor: function(key, a) {\n return a;\n },\n attributeValueProcessor: function(attrName, a) {\n return a;\n },\n preserveOrder: false,\n commentPropName: false,\n unpairedTags: [],\n entities: [\n { regex: new RegExp(\"&\", \"g\"), val: \"&\" },//it must be on top\n { regex: new RegExp(\">\", \"g\"), val: \">\" },\n { regex: new RegExp(\"<\", \"g\"), val: \"<\" },\n { regex: new RegExp(\"\\'\", \"g\"), val: \"'\" },\n { regex: new RegExp(\"\\\"\", \"g\"), val: \""\" }\n ],\n processEntities: true,\n stopNodes: [],\n // transformTagName: false,\n // transformAttributeName: false,\n oneListGroup: false\n};\n\nexport default function Builder(options) {\n this.options = Object.assign({}, defaultOptions, options);\n if (this.options.ignoreAttributes === true || this.options.attributesGroupName) {\n this.isAttribute = function(/*a*/) {\n return false;\n };\n } else {\n this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)\n this.attrPrefixLen = this.options.attributeNamePrefix.length;\n this.isAttribute = isAttribute;\n }\n\n this.processTextOrObjNode = processTextOrObjNode\n\n if (this.options.format) {\n this.indentate = indentate;\n this.tagEndChar = '>\\n';\n this.newLine = '\\n';\n } else {\n this.indentate = function() {\n return '';\n };\n this.tagEndChar = '>';\n this.newLine = '';\n }\n}\n\nBuilder.prototype.build = function(jObj) {\n if(this.options.preserveOrder){\n return buildFromOrderedJs(jObj, this.options);\n }else {\n if(Array.isArray(jObj) && this.options.arrayNodeName && this.options.arrayNodeName.length > 1){\n jObj = {\n [this.options.arrayNodeName] : jObj\n }\n }\n return this.j2x(jObj, 0, []).val;\n }\n};\n\nBuilder.prototype.j2x = function(jObj, level, ajPath) {\n let attrStr = '';\n let val = '';\n const jPath = ajPath.join('.')\n for (let key in jObj) {\n if(!Object.prototype.hasOwnProperty.call(jObj, key)) continue;\n if (typeof jObj[key] === 'undefined') {\n // supress undefined node only if it is not an attribute\n if (this.isAttribute(key)) {\n val += '';\n }\n } else if (jObj[key] === null) {\n // null attribute should be ignored by the attribute list, but should not cause the tag closing\n if (this.isAttribute(key)) {\n val += '';\n } else if (key === this.options.cdataPropName) {\n val += '';\n } else if (key[0] === '?') {\n val += this.indentate(level) + '<' + key + '?' + this.tagEndChar;\n } else {\n val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n }\n // val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n } else if (jObj[key] instanceof Date) {\n val += this.buildTextValNode(jObj[key], key, '', level);\n } else if (typeof jObj[key] !== 'object') {\n //premitive type\n const attr = this.isAttribute(key);\n if (attr && !this.ignoreAttributesFn(attr, jPath)) {\n attrStr += this.buildAttrPairStr(attr, '' + jObj[key]);\n } else if (!attr) {\n //tag value\n if (key === this.options.textNodeName) {\n let newval = this.options.tagValueProcessor(key, '' + jObj[key]);\n val += this.replaceEntitiesValue(newval);\n } else {\n val += this.buildTextValNode(jObj[key], key, '', level);\n }\n }\n } else if (Array.isArray(jObj[key])) {\n //repeated nodes\n const arrLen = jObj[key].length;\n let listTagVal = \"\";\n let listTagAttr = \"\";\n for (let j = 0; j < arrLen; j++) {\n const item = jObj[key][j];\n if (typeof item === 'undefined') {\n // supress undefined node\n } else if (item === null) {\n if(key[0] === \"?\") val += this.indentate(level) + '<' + key + '?' + this.tagEndChar;\n else val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n // val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n } else if (typeof item === 'object') {\n if(this.options.oneListGroup){\n const result = this.j2x(item, level + 1, ajPath.concat(key));\n listTagVal += result.val;\n if (this.options.attributesGroupName && item.hasOwnProperty(this.options.attributesGroupName)) {\n listTagAttr += result.attrStr\n }\n }else{\n listTagVal += this.processTextOrObjNode(item, key, level, ajPath)\n }\n } else {\n if (this.options.oneListGroup) {\n let textValue = this.options.tagValueProcessor(key, item);\n textValue = this.replaceEntitiesValue(textValue);\n listTagVal += textValue;\n } else {\n listTagVal += this.buildTextValNode(item, key, '', level);\n }\n }\n }\n if(this.options.oneListGroup){\n listTagVal = this.buildObjectNode(listTagVal, key, listTagAttr, level);\n }\n val += listTagVal;\n } else {\n //nested node\n if (this.options.attributesGroupName && key === this.options.attributesGroupName) {\n const Ks = Object.keys(jObj[key]);\n const L = Ks.length;\n for (let j = 0; j < L; j++) {\n attrStr += this.buildAttrPairStr(Ks[j], '' + jObj[key][Ks[j]]);\n }\n } else {\n val += this.processTextOrObjNode(jObj[key], key, level, ajPath)\n }\n }\n }\n return {attrStr: attrStr, val: val};\n};\n\nBuilder.prototype.buildAttrPairStr = function(attrName, val){\n val = this.options.attributeValueProcessor(attrName, '' + val);\n val = this.replaceEntitiesValue(val);\n if (this.options.suppressBooleanAttributes && val === \"true\") {\n return ' ' + attrName;\n } else return ' ' + attrName + '=\"' + val + '\"';\n}\n\nfunction processTextOrObjNode (object, key, level, ajPath) {\n const result = this.j2x(object, level + 1, ajPath.concat(key));\n if (object[this.options.textNodeName] !== undefined && Object.keys(object).length === 1) {\n return this.buildTextValNode(object[this.options.textNodeName], key, result.attrStr, level);\n } else {\n return this.buildObjectNode(result.val, key, result.attrStr, level);\n }\n}\n\nBuilder.prototype.buildObjectNode = function(val, key, attrStr, level) {\n if(val === \"\"){\n if(key[0] === \"?\") return this.indentate(level) + '<' + key + attrStr+ '?' + this.tagEndChar;\n else {\n return this.indentate(level) + '<' + key + attrStr + this.closeTag(key) + this.tagEndChar;\n }\n }else{\n\n let tagEndExp = '' + key + this.tagEndChar;\n let piClosingChar = \"\";\n \n if(key[0] === \"?\") {\n piClosingChar = \"?\";\n tagEndExp = \"\";\n }\n \n // attrStr is an empty string in case the attribute came as undefined or null\n if ((attrStr || attrStr === '') && val.indexOf('<') === -1) {\n return ( this.indentate(level) + '<' + key + attrStr + piClosingChar + '>' + val + tagEndExp );\n } else if (this.options.commentPropName !== false && key === this.options.commentPropName && piClosingChar.length === 0) {\n return this.indentate(level) + `` + this.newLine;\n }else {\n return (\n this.indentate(level) + '<' + key + attrStr + piClosingChar + this.tagEndChar +\n val +\n this.indentate(level) + tagEndExp );\n }\n }\n}\n\nBuilder.prototype.closeTag = function(key){\n let closeTag = \"\";\n if(this.options.unpairedTags.indexOf(key) !== -1){ //unpaired\n if(!this.options.suppressUnpairedNode) closeTag = \"/\"\n }else if(this.options.suppressEmptyNode){ //empty\n closeTag = \"/\";\n }else{\n closeTag = `>${key}`\n }\n return closeTag;\n}\n\nfunction buildEmptyObjNode(val, key, attrStr, level) {\n if (val !== '') {\n return this.buildObjectNode(val, key, attrStr, level);\n } else {\n if(key[0] === \"?\") return this.indentate(level) + '<' + key + attrStr+ '?' + this.tagEndChar;\n else {\n return this.indentate(level) + '<' + key + attrStr + '/' + this.tagEndChar;\n // return this.buildTagStr(level,key, attrStr);\n }\n }\n}\n\nBuilder.prototype.buildTextValNode = function(val, key, attrStr, level) {\n if (this.options.cdataPropName !== false && key === this.options.cdataPropName) {\n return this.indentate(level) + `` + this.newLine;\n }else if (this.options.commentPropName !== false && key === this.options.commentPropName) {\n return this.indentate(level) + `` + this.newLine;\n }else if(key[0] === \"?\") {//PI tag\n return this.indentate(level) + '<' + key + attrStr+ '?' + this.tagEndChar; \n }else{\n let textValue = this.options.tagValueProcessor(key, val);\n textValue = this.replaceEntitiesValue(textValue);\n \n if( textValue === ''){\n return this.indentate(level) + '<' + key + attrStr + this.closeTag(key) + this.tagEndChar;\n }else{\n return this.indentate(level) + '<' + key + attrStr + '>' +\n textValue +\n '' + key + this.tagEndChar;\n }\n }\n}\n\nBuilder.prototype.replaceEntitiesValue = function(textValue){\n if(textValue && textValue.length > 0 && this.options.processEntities){\n for (let i=0; i(()=>{"use strict";var t={d:(e,r)=>{for(var n in r)t.o(r,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:r[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{default:()=>J});var r={preserveOrder:!1,attributeNamePrefix:"@_",attributesGroupName:!1,textNodeName:"#text",ignoreAttributes:!0,removeNSPrefix:!1,allowBooleanAttributes:!1,parseTagValue:!0,parseAttributeValue:!1,trimValues:!0,cdataPropName:!1,numberParseOptions:{hex:!0,leadingZeros:!0,eNotation:!0},tagValueProcessor:function(t,e){return e},attributeValueProcessor:function(t,e){return e},stopNodes:[],alwaysCreateTextNode:!1,isArray:function(){return!1},commentPropName:!1,unpairedTags:[],processEntities:!0,htmlEntities:!1,ignoreDeclaration:!1,ignorePiTags:!1,transformTagName:!1,transformAttributeName:!1,updateTag:function(t,e,r){return t},captureMetaData:!1},n=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",i=new RegExp("^["+n+"]["+n+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$");function a(t,e){for(var r=[],n=e.exec(t);n;){var i=[];i.startIndex=e.lastIndex-n[0].length;for(var a=n.length,s=0;s0?this.child.push(((r={})[t.tagname]=t.child,r[":@"]=t[":@"],r)):this.child.push(((n={})[t.tagname]=t.child,n)),void 0!==e&&(this.child[this.child.length-1][s]={startIndex:e})},t.getMetaDataSymbol=function(){return s},t}(),u=function(){function t(t){this.suppressValidationErr=!t}var e=t.prototype;return e.readDocType=function(t,e){var r={};if("O"!==t[e+3]||"C"!==t[e+4]||"T"!==t[e+5]||"Y"!==t[e+6]||"P"!==t[e+7]||"E"!==t[e+8])throw new Error("Invalid Tag instead of DOCTYPE");e+=9;for(var n=1,i=!1,a=!1;e"===t[e]){if(a?"-"===t[e-1]&&"-"===t[e-2]&&(a=!1,n--):n--,0===n)break}else"["===t[e]?i=!0:t[e];else{if(i&&d(t,"!ENTITY",e)){e+=7;var s,o=void 0,l=this.readEntityExp(t,e+1,this.suppressValidationErr);s=l[0],o=l[1],e=l[2],-1===o.indexOf("&")&&(r[s]={regx:RegExp("&"+s+";","g"),val:o})}else if(i&&d(t,"!ELEMENT",e))e+=8,e=this.readElementExp(t,e+1).index;else if(i&&d(t,"!ATTLIST",e))e+=8;else if(i&&d(t,"!NOTATION",e))e+=9,e=this.readNotationExp(t,e+1,this.suppressValidationErr).index;else{if(!d(t,"!--",e))throw new Error("Invalid DOCTYPE");a=!0}n++}if(0!==n)throw new Error("Unclosed DOCTYPE");return{entities:r,i:e}},e.readEntityExp=function(t,e){e=f(t,e);for(var r="";et.length)&&(e=t.length);for(var r=0,n=Array(e);r"},lt:{regex:/&(lt|#60|#x3C);/g,val:"<"},quot:{regex:/&(quot|#34|#x22);/g,val:'"'}},this.ampEntity={regex:/&(amp|#38|#x26);/g,val:"&"},this.htmlEntities={space:{regex:/&(nbsp|#160);/g,val:" "},cent:{regex:/&(cent|#162);/g,val:"¢"},pound:{regex:/&(pound|#163);/g,val:"£"},yen:{regex:/&(yen|#165);/g,val:"¥"},euro:{regex:/&(euro|#8364);/g,val:"€"},copyright:{regex:/&(copy|#169);/g,val:"©"},reg:{regex:/&(reg|#174);/g,val:"®"},inr:{regex:/&(inr|#8377);/g,val:"₹"},num_dec:{regex:/([0-9]{1,7});/g,val:function(t,e){return V(e,10,"")}},num_hex:{regex:/([0-9a-fA-F]{1,6});/g,val:function(t,e){return V(e,16,"")}}},this.addExternalEntities=b,this.parseXml=w,this.parseTextData=E,this.resolveNameSpace=N,this.buildAttributesMap=T,this.isItStopNode=O,this.replaceEntitiesValue=S,this.readStopNodeData=D,this.saveTextToParentTag=A,this.addChild=I,this.ignoreAttributesFn="function"==typeof(e=this.options.ignoreAttributes)?e:Array.isArray(e)?function(t){for(var r,n=function(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(r)return(r=r.call(t)).next.bind(r);if(Array.isArray(t)||(r=function(t,e){if(t){if("string"==typeof t)return m(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?m(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0;return function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(e);!(r=n()).done;){var i=r.value;if("string"==typeof i&&t===i)return!0;if(i instanceof RegExp&&i.test(t))return!0}}:function(){return!1},this.options.stopNodes&&this.options.stopNodes.length>0){this.stopNodesExact=new Set,this.stopNodesWildcard=new Set;for(var r=0;r0)){s||(t=this.replaceEntitiesValue(t));var o=this.options.tagValueProcessor(e,t,r,i,a);return null==o?t:typeof o!=typeof t||o!==t?o:this.options.trimValues||t.trim()===t?M(t,this.options.parseTagValue,this.options.numberParseOptions):t}}function N(t){if(this.options.removeNSPrefix){var e=t.split(":"),r="/"===t.charAt(0)?"/":"";if("xmlns"===e[0])return"";2===e.length&&(t=r+e[1])}return t}var y=new RegExp("([^\\s=]+)\\s*(=\\s*(['\"])([\\s\\S]*?)\\3)?","gm");function T(t,e){if(!0!==this.options.ignoreAttributes&&"string"==typeof t){for(var r=a(t,y),n=r.length,i={},s=0;s",s,"Closing Tag is not closed."),f=t.substring(s+2,o).trim();if(this.options.removeNSPrefix){var d=f.indexOf(":");-1!==d&&(f=f.substr(d+1))}this.options.transformTagName&&(f=this.options.transformTagName(f)),r&&(n=this.saveTextToParentTag(n,r,i));var h=i.substring(i.lastIndexOf(".")+1);if(f&&-1!==this.options.unpairedTags.indexOf(f))throw new Error("Unpaired tag can not be used as closing tag: "+f+">");var g=0;h&&-1!==this.options.unpairedTags.indexOf(h)?(g=i.lastIndexOf(".",i.lastIndexOf(".")-1),this.tagsNodeStack.pop()):g=i.lastIndexOf("."),i=i.substring(0,g),r=this.tagsNodeStack.pop(),n="",s=o}else if("?"===t[s+1]){var p=C(t,s,!1,"?>");if(!p)throw new Error("Pi Tag is not closed.");if(n=this.saveTextToParentTag(n,r,i),this.options.ignoreDeclaration&&"?xml"===p.tagName||this.options.ignorePiTags);else{var c=new l(p.tagName);c.add(this.options.textNodeName,""),p.tagName!==p.tagExp&&p.attrExpPresent&&(c[":@"]=this.buildAttributesMap(p.tagExp,i)),this.addChild(r,c,i,s)}s=p.closeIndex+1}else if("!--"===t.substr(s+1,3)){var v=P(t,"--\x3e",s+4,"Comment is not closed.");if(this.options.commentPropName){var m,x=t.substring(s+4,v-2);n=this.saveTextToParentTag(n,r,i),r.add(this.options.commentPropName,[(m={},m[this.options.textNodeName]=x,m)])}s=v}else if("!D"===t.substr(s+1,2)){var b=a.readDocType(t,s);this.docTypeEntities=b.entities,s=b.i}else if("!["===t.substr(s+1,2)){var E=P(t,"]]>",s,"CDATA is not closed.")-2,N=t.substring(s+9,E);n=this.saveTextToParentTag(n,r,i);var y,T=this.parseTextData(N,r.tagname,i,!0,!1,!0,!0);null==T&&(T=""),this.options.cdataPropName?r.add(this.options.cdataPropName,[(y={},y[this.options.textNodeName]=N,y)]):r.add(this.options.textNodeName,T),s=E+2}else{var w=C(t,s,this.options.removeNSPrefix),I=w.tagName,S=w.rawTagName,A=w.tagExp,O=w.attrExpPresent,D=w.closeIndex;if(this.options.transformTagName){var M=this.options.transformTagName(I);A===I&&(A=M),I=M}r&&n&&"!xml"!==r.tagname&&(n=this.saveTextToParentTag(n,r,i,!1));var V=r;V&&-1!==this.options.unpairedTags.indexOf(V.tagname)&&(r=this.tagsNodeStack.pop(),i=i.substring(0,i.lastIndexOf("."))),I!==e.tagname&&(i+=i?"."+I:I);var F=s;if(this.isItStopNode(this.stopNodesExact,this.stopNodesWildcard,i,I)){var _="";if(A.length>0&&A.lastIndexOf("/")===A.length-1)"/"===I[I.length-1]?(I=I.substr(0,I.length-1),i=i.substr(0,i.length-1),A=I):A=A.substr(0,A.length-1),s=w.closeIndex;else if(-1!==this.options.unpairedTags.indexOf(I))s=w.closeIndex;else{var k=this.readStopNodeData(t,S,D+1);if(!k)throw new Error("Unexpected end of "+S);s=k.i,_=k.tagContent}var j=new l(I);I!==A&&O&&(j[":@"]=this.buildAttributesMap(A,i)),_&&(_=this.parseTextData(_,I,i,!0,O,!0,!0)),i=i.substr(0,i.lastIndexOf(".")),j.add(this.options.textNodeName,_),this.addChild(r,j,i,F)}else{if(A.length>0&&A.lastIndexOf("/")===A.length-1){if("/"===I[I.length-1]?(I=I.substr(0,I.length-1),i=i.substr(0,i.length-1),A=I):A=A.substr(0,A.length-1),this.options.transformTagName){var U=this.options.transformTagName(I);A===I&&(A=U),I=U}var L=new l(I);I!==A&&O&&(L[":@"]=this.buildAttributesMap(A,i)),this.addChild(r,L,i,F),i=i.substr(0,i.lastIndexOf("."))}else{var Y=new l(I);this.tagsNodeStack.push(r),I!==A&&O&&(Y[":@"]=this.buildAttributesMap(A,i)),this.addChild(r,Y,i,F),r=Y}n="",s=D}}else n+=t[s];return e.child};function I(t,e,r,n){this.options.captureMetaData||(n=void 0);var i=this.options.updateTag(e.tagname,r,e[":@"]);!1===i||("string"==typeof i?(e.tagname=i,t.addChild(e,n)):t.addChild(e,n))}var S=function(t){if(this.options.processEntities){for(var e in this.docTypeEntities){var r=this.docTypeEntities[e];t=t.replace(r.regx,r.val)}for(var n in this.lastEntities){var i=this.lastEntities[n];t=t.replace(i.regex,i.val)}if(this.options.htmlEntities)for(var a in this.htmlEntities){var s=this.htmlEntities[a];t=t.replace(s.regex,s.val)}t=t.replace(this.ampEntity.regex,this.ampEntity.val)}return t};function A(t,e,r,n){return t&&(void 0===n&&(n=0===e.child.length),void 0!==(t=this.parseTextData(t,e.tagname,r,!1,!!e[":@"]&&0!==Object.keys(e[":@"]).length,n))&&""!==t&&e.add(this.options.textNodeName,t),t=""),t}function O(t,e,r,n){return!(!e||!e.has(n))||!(!t||!t.has(r))}function P(t,e,r,n){var i=t.indexOf(e,r);if(-1===i)throw new Error(n);return i+e.length-1}function C(t,e,r,n){void 0===n&&(n=">");var i=function(t,e,r){var n;void 0===r&&(r=">");for(var i="",a=e;a",r,e+" is not closed");if(t.substring(r+2,a).trim()===e&&0==--i)return{tagContent:t.substring(n,r),i:a};r=a}else if("?"===t[r+1])r=P(t,"?>",r+1,"StopNode is not closed.");else if("!--"===t.substr(r+1,3))r=P(t,"--\x3e",r+3,"StopNode is not closed.");else if("!["===t.substr(r+1,2))r=P(t,"]]>",r,"StopNode is not closed.")-2;else{var s=C(t,r,">");s&&((s&&s.tagName)===e&&"/"!==s.tagExp[s.tagExp.length-1]&&i++,r=s.closeIndex)}}function M(t,e,r){if(e&&"string"==typeof t){var n=t.trim();return"true"===n||"false"!==n&&function(t,e={}){if(e=Object.assign({},c,e),!t||"string"!=typeof t)return t;let r=t.trim();if(void 0!==e.skipLike&&e.skipLike.test(r))return t;if("0"===t)return 0;if(e.hex&&g.test(r))return function(t){if(parseInt)return parseInt(t,16);if(Number.parseInt)return Number.parseInt(t,16);if(window&&window.parseInt)return window.parseInt(t,16);throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}(r);if(-1!==r.search(/.+[eE].+/))return function(t,e,r){if(!r.eNotation)return t;const n=e.match(v);if(n){let i=n[1]||"";const a=-1===n[3].indexOf("e")?"E":"e",s=n[2],o=i?t[s.length+1]===a:t[s.length]===a;return s.length>1&&o?t:1!==s.length||!n[3].startsWith(`.${a}`)&&n[3][0]!==a?r.leadingZeros&&!o?(e=(n[1]||"")+n[3],Number(e)):t:Number(e)}return t}(t,r,e);{const i=p.exec(r);if(i){const a=i[1]||"",s=i[2];let o=(n=i[3])&&-1!==n.indexOf(".")?("."===(n=n.replace(/0+$/,""))?n="0":"."===n[0]?n="0"+n:"."===n[n.length-1]&&(n=n.substring(0,n.length-1)),n):n;const l=a?"."===t[s.length+1]:"."===t[s.length];if(!e.leadingZeros&&(s.length>1||1===s.length&&!l))return t;{const n=Number(r),i=String(n);if(0===n||-0===n)return n;if(-1!==i.search(/[eE]/))return e.eNotation?n:t;if(-1!==r.indexOf("."))return"0"===i||i===o||i===`${a}${o}`?n:t;let l=s?o:r;return s?l===i||a+l===i?n:t:l===i||l===a+i?n:t}}return t}var n}(t,r)}return void 0!==t?t:""}function V(t,e,r){var n=Number.parseInt(t,e);return n>=0&&n<=1114111?String.fromCodePoint(n):r+t+";"}var F=l.getMetaDataSymbol();function _(t,e){return k(t,e)}function k(t,e,r){for(var n,i={},a=0;a0&&(i[e.textNodeName]=n):void 0!==n&&(i[e.textNodeName]=n),i}function j(t){for(var e=Object.keys(t),r=0;r5&&"xml"===n)return G("InvalidXml","XML declaration allowed only at the start of the document.",Q(t,e));if("?"==t[e]&&">"==t[e+1]){e++;break}}return e}function B(t,e){if(t.length>e+5&&"-"===t[e+1]&&"-"===t[e+2]){for(e+=3;e"===t[e+2]){e+=2;break}}else if(t.length>e+8&&"D"===t[e+1]&&"O"===t[e+2]&&"C"===t[e+3]&&"T"===t[e+4]&&"Y"===t[e+5]&&"P"===t[e+6]&&"E"===t[e+7]){var r=1;for(e+=8;e"===t[e]&&0==--r)break}else if(t.length>e+9&&"["===t[e+1]&&"C"===t[e+2]&&"D"===t[e+3]&&"A"===t[e+4]&&"T"===t[e+5]&&"A"===t[e+6]&&"["===t[e+7])for(e+=8;e"===t[e+2]){e+=2;break}return e}function $(t,e){for(var r="",n="",i=!1;e"===t[e]&&""===n){i=!0;break}r+=t[e]}return""===n&&{value:r,index:e,tagClosed:i}}var W=new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");function Z(t,e){for(var r=a(t,W),n={},i=0;i"!==t[a]&&" "!==t[a]&&"\t"!==t[a]&&"\n"!==t[a]&&"\r"!==t[a];a++)u+=t[a];if("/"===(u=u.trim())[u.length-1]&&(u=u.substring(0,u.length-1),a--),!o(u))return G("InvalidTag",0===u.trim().length?"Invalid space after '<'.":"Tag '"+u+"' is an invalid name.",Q(t,a));var f=$(t,a);if(!1===f)return G("InvalidAttr","Attributes for '"+u+"' have open quote.",Q(t,a));var d=f.value;if(a=f.index,"/"===d[d.length-1]){var h=a-d.length,g=Z(d=d.substring(0,d.length-1),e);if(!0!==g)return G(g.err.code,g.err.msg,Q(t,h+g.err.line));n=!0}else if(l){if(!f.tagClosed)return G("InvalidTag","Closing tag '"+u+"' doesn't have proper closing.",Q(t,a));if(d.trim().length>0)return G("InvalidTag","Closing tag '"+u+"' can't have attributes or invalid starting.",Q(t,s));if(0===r.length)return G("InvalidTag","Closing tag '"+u+"' has not been opened.",Q(t,s));var p=r.pop();if(u!==p.tagName){var c=Q(t,p.tagStartPos);return G("InvalidTag","Expected closing tag '"+p.tagName+"' (opened in line "+c.line+", col "+c.col+") instead of closing tag '"+u+"'.",Q(t,s))}0==r.length&&(i=!0)}else{var v=Z(d,e);if(!0!==v)return G(v.err.code,v.err.msg,Q(t,a-d.length+v.err.line));if(!0===i)return G("InvalidXml","Multiple possible root nodes found.",Q(t,a));-1!==e.unpairedTags.indexOf(u)||r.push({tagName:u,tagStartPos:s}),n=!0}for(a++;a0)||G("InvalidXml","Invalid '"+JSON.stringify(r.map((function(t){return t.tagName})),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1}):G("InvalidXml","Start tag expected.",1)}(t,e);if(!0!==r)throw Error(r.err.msg+":"+r.err.line+":"+r.err.col)}var n=new x(this.options);n.addExternalEntities(this.externalEntities);var i=n.parseXml(t);return this.options.preserveOrder||void 0===i?i:_(i,this.options)},e.addEntity=function(t,e){if(-1!==e.indexOf("&"))throw new Error("Entity value can't have '&'");if(-1!==t.indexOf("&")||-1!==t.indexOf(";"))throw new Error("An entity must be set without '&' and ';'. Eg. use '#xD' for '
'");if("&"===e)throw new Error("An entity with value '&' is not permitted");this.externalEntities[t]=e},t.getMetaDataSymbol=function(){return l.getMetaDataSymbol()},t}();return e})()));
+!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.XMLParser=e():t.XMLParser=e()}(this,(()=>(()=>{"use strict";var t={d:(e,r)=>{for(var n in r)t.o(r,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:r[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{default:()=>J});var r={preserveOrder:!1,attributeNamePrefix:"@_",attributesGroupName:!1,textNodeName:"#text",ignoreAttributes:!0,removeNSPrefix:!1,allowBooleanAttributes:!1,parseTagValue:!0,parseAttributeValue:!1,trimValues:!0,cdataPropName:!1,numberParseOptions:{hex:!0,leadingZeros:!0,eNotation:!0},tagValueProcessor:function(t,e){return e},attributeValueProcessor:function(t,e){return e},stopNodes:[],alwaysCreateTextNode:!1,isArray:function(){return!1},commentPropName:!1,unpairedTags:[],processEntities:!0,htmlEntities:!1,ignoreDeclaration:!1,ignorePiTags:!1,transformTagName:!1,transformAttributeName:!1,updateTag:function(t,e,r){return t},captureMetaData:!1},n=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",i=new RegExp("^["+n+"]["+n+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$");function a(t,e){for(var r=[],n=e.exec(t);n;){var i=[];i.startIndex=e.lastIndex-n[0].length;for(var a=n.length,s=0;s0?this.child.push(((r={})[t.tagname]=t.child,r[":@"]=t[":@"],r)):this.child.push(((n={})[t.tagname]=t.child,n)),void 0!==e&&(this.child[this.child.length-1][s]={startIndex:e})},t.getMetaDataSymbol=function(){return s},t}(),u=function(){function t(t){this.suppressValidationErr=!t}var e=t.prototype;return e.readDocType=function(t,e){var r={};if("O"!==t[e+3]||"C"!==t[e+4]||"T"!==t[e+5]||"Y"!==t[e+6]||"P"!==t[e+7]||"E"!==t[e+8])throw new Error("Invalid Tag instead of DOCTYPE");e+=9;for(var n=1,i=!1,a=!1;e"===t[e]){if(a?"-"===t[e-1]&&"-"===t[e-2]&&(a=!1,n--):n--,0===n)break}else"["===t[e]?i=!0:t[e];else{if(i&&d(t,"!ENTITY",e)){e+=7;var s=void 0,o=void 0,l=this.readEntityExp(t,e+1,this.suppressValidationErr);if(s=l[0],o=l[1],e=l[2],-1===o.indexOf("&")){var u=s.replace(/[.\-+*:]/g,"\\.");r[s]={regx:RegExp("&"+u+";","g"),val:o}}}else if(i&&d(t,"!ELEMENT",e))e+=8,e=this.readElementExp(t,e+1).index;else if(i&&d(t,"!ATTLIST",e))e+=8;else if(i&&d(t,"!NOTATION",e))e+=9,e=this.readNotationExp(t,e+1,this.suppressValidationErr).index;else{if(!d(t,"!--",e))throw new Error("Invalid DOCTYPE");a=!0}n++}if(0!==n)throw new Error("Unclosed DOCTYPE");return{entities:r,i:e}},e.readEntityExp=function(t,e){e=f(t,e);for(var r="";et.length)&&(e=t.length);for(var r=0,n=Array(e);r"},lt:{regex:/&(lt|#60|#x3C);/g,val:"<"},quot:{regex:/&(quot|#34|#x22);/g,val:'"'}},this.ampEntity={regex:/&(amp|#38|#x26);/g,val:"&"},this.htmlEntities={space:{regex:/&(nbsp|#160);/g,val:" "},cent:{regex:/&(cent|#162);/g,val:"¢"},pound:{regex:/&(pound|#163);/g,val:"£"},yen:{regex:/&(yen|#165);/g,val:"¥"},euro:{regex:/&(euro|#8364);/g,val:"€"},copyright:{regex:/&(copy|#169);/g,val:"©"},reg:{regex:/&(reg|#174);/g,val:"®"},inr:{regex:/&(inr|#8377);/g,val:"₹"},num_dec:{regex:/([0-9]{1,7});/g,val:function(t,e){return V(e,10,"")}},num_hex:{regex:/([0-9a-fA-F]{1,6});/g,val:function(t,e){return V(e,16,"")}}},this.addExternalEntities=b,this.parseXml=w,this.parseTextData=E,this.resolveNameSpace=N,this.buildAttributesMap=T,this.isItStopNode=O,this.replaceEntitiesValue=S,this.readStopNodeData=D,this.saveTextToParentTag=A,this.addChild=I,this.ignoreAttributesFn="function"==typeof(e=this.options.ignoreAttributes)?e:Array.isArray(e)?function(t){for(var r,n=function(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(r)return(r=r.call(t)).next.bind(r);if(Array.isArray(t)||(r=function(t,e){if(t){if("string"==typeof t)return m(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?m(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0;return function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(e);!(r=n()).done;){var i=r.value;if("string"==typeof i&&t===i)return!0;if(i instanceof RegExp&&i.test(t))return!0}}:function(){return!1},this.options.stopNodes&&this.options.stopNodes.length>0){this.stopNodesExact=new Set,this.stopNodesWildcard=new Set;for(var r=0;r0)){s||(t=this.replaceEntitiesValue(t));var o=this.options.tagValueProcessor(e,t,r,i,a);return null==o?t:typeof o!=typeof t||o!==t?o:this.options.trimValues||t.trim()===t?M(t,this.options.parseTagValue,this.options.numberParseOptions):t}}function N(t){if(this.options.removeNSPrefix){var e=t.split(":"),r="/"===t.charAt(0)?"/":"";if("xmlns"===e[0])return"";2===e.length&&(t=r+e[1])}return t}var y=new RegExp("([^\\s=]+)\\s*(=\\s*(['\"])([\\s\\S]*?)\\3)?","gm");function T(t,e){if(!0!==this.options.ignoreAttributes&&"string"==typeof t){for(var r=a(t,y),n=r.length,i={},s=0;s",s,"Closing Tag is not closed."),f=t.substring(s+2,o).trim();if(this.options.removeNSPrefix){var d=f.indexOf(":");-1!==d&&(f=f.substr(d+1))}this.options.transformTagName&&(f=this.options.transformTagName(f)),r&&(n=this.saveTextToParentTag(n,r,i));var h=i.substring(i.lastIndexOf(".")+1);if(f&&-1!==this.options.unpairedTags.indexOf(f))throw new Error("Unpaired tag can not be used as closing tag: "+f+">");var g=0;h&&-1!==this.options.unpairedTags.indexOf(h)?(g=i.lastIndexOf(".",i.lastIndexOf(".")-1),this.tagsNodeStack.pop()):g=i.lastIndexOf("."),i=i.substring(0,g),r=this.tagsNodeStack.pop(),n="",s=o}else if("?"===t[s+1]){var p=C(t,s,!1,"?>");if(!p)throw new Error("Pi Tag is not closed.");if(n=this.saveTextToParentTag(n,r,i),this.options.ignoreDeclaration&&"?xml"===p.tagName||this.options.ignorePiTags);else{var c=new l(p.tagName);c.add(this.options.textNodeName,""),p.tagName!==p.tagExp&&p.attrExpPresent&&(c[":@"]=this.buildAttributesMap(p.tagExp,i)),this.addChild(r,c,i,s)}s=p.closeIndex+1}else if("!--"===t.substr(s+1,3)){var v=P(t,"--\x3e",s+4,"Comment is not closed.");if(this.options.commentPropName){var m,x=t.substring(s+4,v-2);n=this.saveTextToParentTag(n,r,i),r.add(this.options.commentPropName,[(m={},m[this.options.textNodeName]=x,m)])}s=v}else if("!D"===t.substr(s+1,2)){var b=a.readDocType(t,s);this.docTypeEntities=b.entities,s=b.i}else if("!["===t.substr(s+1,2)){var E=P(t,"]]>",s,"CDATA is not closed.")-2,N=t.substring(s+9,E);n=this.saveTextToParentTag(n,r,i);var y,T=this.parseTextData(N,r.tagname,i,!0,!1,!0,!0);null==T&&(T=""),this.options.cdataPropName?r.add(this.options.cdataPropName,[(y={},y[this.options.textNodeName]=N,y)]):r.add(this.options.textNodeName,T),s=E+2}else{var w=C(t,s,this.options.removeNSPrefix),I=w.tagName,S=w.rawTagName,A=w.tagExp,O=w.attrExpPresent,D=w.closeIndex;if(this.options.transformTagName){var M=this.options.transformTagName(I);A===I&&(A=M),I=M}r&&n&&"!xml"!==r.tagname&&(n=this.saveTextToParentTag(n,r,i,!1));var V=r;V&&-1!==this.options.unpairedTags.indexOf(V.tagname)&&(r=this.tagsNodeStack.pop(),i=i.substring(0,i.lastIndexOf("."))),I!==e.tagname&&(i+=i?"."+I:I);var F=s;if(this.isItStopNode(this.stopNodesExact,this.stopNodesWildcard,i,I)){var _="";if(A.length>0&&A.lastIndexOf("/")===A.length-1)"/"===I[I.length-1]?(I=I.substr(0,I.length-1),i=i.substr(0,i.length-1),A=I):A=A.substr(0,A.length-1),s=w.closeIndex;else if(-1!==this.options.unpairedTags.indexOf(I))s=w.closeIndex;else{var k=this.readStopNodeData(t,S,D+1);if(!k)throw new Error("Unexpected end of "+S);s=k.i,_=k.tagContent}var j=new l(I);I!==A&&O&&(j[":@"]=this.buildAttributesMap(A,i)),_&&(_=this.parseTextData(_,I,i,!0,O,!0,!0)),i=i.substr(0,i.lastIndexOf(".")),j.add(this.options.textNodeName,_),this.addChild(r,j,i,F)}else{if(A.length>0&&A.lastIndexOf("/")===A.length-1){if("/"===I[I.length-1]?(I=I.substr(0,I.length-1),i=i.substr(0,i.length-1),A=I):A=A.substr(0,A.length-1),this.options.transformTagName){var U=this.options.transformTagName(I);A===I&&(A=U),I=U}var L=new l(I);I!==A&&O&&(L[":@"]=this.buildAttributesMap(A,i)),this.addChild(r,L,i,F),i=i.substr(0,i.lastIndexOf("."))}else{var Y=new l(I);this.tagsNodeStack.push(r),I!==A&&O&&(Y[":@"]=this.buildAttributesMap(A,i)),this.addChild(r,Y,i,F),r=Y}n="",s=D}}else n+=t[s];return e.child};function I(t,e,r,n){this.options.captureMetaData||(n=void 0);var i=this.options.updateTag(e.tagname,r,e[":@"]);!1===i||("string"==typeof i?(e.tagname=i,t.addChild(e,n)):t.addChild(e,n))}var S=function(t){if(this.options.processEntities){for(var e in this.docTypeEntities){var r=this.docTypeEntities[e];t=t.replace(r.regx,r.val)}for(var n in this.lastEntities){var i=this.lastEntities[n];t=t.replace(i.regex,i.val)}if(this.options.htmlEntities)for(var a in this.htmlEntities){var s=this.htmlEntities[a];t=t.replace(s.regex,s.val)}t=t.replace(this.ampEntity.regex,this.ampEntity.val)}return t};function A(t,e,r,n){return t&&(void 0===n&&(n=0===e.child.length),void 0!==(t=this.parseTextData(t,e.tagname,r,!1,!!e[":@"]&&0!==Object.keys(e[":@"]).length,n))&&""!==t&&e.add(this.options.textNodeName,t),t=""),t}function O(t,e,r,n){return!(!e||!e.has(n))||!(!t||!t.has(r))}function P(t,e,r,n){var i=t.indexOf(e,r);if(-1===i)throw new Error(n);return i+e.length-1}function C(t,e,r,n){void 0===n&&(n=">");var i=function(t,e,r){var n;void 0===r&&(r=">");for(var i="",a=e;a",r,e+" is not closed");if(t.substring(r+2,a).trim()===e&&0==--i)return{tagContent:t.substring(n,r),i:a};r=a}else if("?"===t[r+1])r=P(t,"?>",r+1,"StopNode is not closed.");else if("!--"===t.substr(r+1,3))r=P(t,"--\x3e",r+3,"StopNode is not closed.");else if("!["===t.substr(r+1,2))r=P(t,"]]>",r,"StopNode is not closed.")-2;else{var s=C(t,r,">");s&&((s&&s.tagName)===e&&"/"!==s.tagExp[s.tagExp.length-1]&&i++,r=s.closeIndex)}}function M(t,e,r){if(e&&"string"==typeof t){var n=t.trim();return"true"===n||"false"!==n&&function(t,e={}){if(e=Object.assign({},c,e),!t||"string"!=typeof t)return t;let r=t.trim();if(void 0!==e.skipLike&&e.skipLike.test(r))return t;if("0"===t)return 0;if(e.hex&&g.test(r))return function(t){if(parseInt)return parseInt(t,16);if(Number.parseInt)return Number.parseInt(t,16);if(window&&window.parseInt)return window.parseInt(t,16);throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}(r);if(-1!==r.search(/.+[eE].+/))return function(t,e,r){if(!r.eNotation)return t;const n=e.match(v);if(n){let i=n[1]||"";const a=-1===n[3].indexOf("e")?"E":"e",s=n[2],o=i?t[s.length+1]===a:t[s.length]===a;return s.length>1&&o?t:1!==s.length||!n[3].startsWith(`.${a}`)&&n[3][0]!==a?r.leadingZeros&&!o?(e=(n[1]||"")+n[3],Number(e)):t:Number(e)}return t}(t,r,e);{const i=p.exec(r);if(i){const a=i[1]||"",s=i[2];let o=(n=i[3])&&-1!==n.indexOf(".")?("."===(n=n.replace(/0+$/,""))?n="0":"."===n[0]?n="0"+n:"."===n[n.length-1]&&(n=n.substring(0,n.length-1)),n):n;const l=a?"."===t[s.length+1]:"."===t[s.length];if(!e.leadingZeros&&(s.length>1||1===s.length&&!l))return t;{const n=Number(r),i=String(n);if(0===n||-0===n)return n;if(-1!==i.search(/[eE]/))return e.eNotation?n:t;if(-1!==r.indexOf("."))return"0"===i||i===o||i===`${a}${o}`?n:t;let l=s?o:r;return s?l===i||a+l===i?n:t:l===i||l===a+i?n:t}}return t}var n}(t,r)}return void 0!==t?t:""}function V(t,e,r){var n=Number.parseInt(t,e);return n>=0&&n<=1114111?String.fromCodePoint(n):r+t+";"}var F=l.getMetaDataSymbol();function _(t,e){return k(t,e)}function k(t,e,r){for(var n,i={},a=0;a0&&(i[e.textNodeName]=n):void 0!==n&&(i[e.textNodeName]=n),i}function j(t){for(var e=Object.keys(t),r=0;r5&&"xml"===n)return G("InvalidXml","XML declaration allowed only at the start of the document.",Q(t,e));if("?"==t[e]&&">"==t[e+1]){e++;break}}return e}function B(t,e){if(t.length>e+5&&"-"===t[e+1]&&"-"===t[e+2]){for(e+=3;e"===t[e+2]){e+=2;break}}else if(t.length>e+8&&"D"===t[e+1]&&"O"===t[e+2]&&"C"===t[e+3]&&"T"===t[e+4]&&"Y"===t[e+5]&&"P"===t[e+6]&&"E"===t[e+7]){var r=1;for(e+=8;e"===t[e]&&0==--r)break}else if(t.length>e+9&&"["===t[e+1]&&"C"===t[e+2]&&"D"===t[e+3]&&"A"===t[e+4]&&"T"===t[e+5]&&"A"===t[e+6]&&"["===t[e+7])for(e+=8;e"===t[e+2]){e+=2;break}return e}function $(t,e){for(var r="",n="",i=!1;e"===t[e]&&""===n){i=!0;break}r+=t[e]}return""===n&&{value:r,index:e,tagClosed:i}}var W=new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");function Z(t,e){for(var r=a(t,W),n={},i=0;i"!==t[a]&&" "!==t[a]&&"\t"!==t[a]&&"\n"!==t[a]&&"\r"!==t[a];a++)u+=t[a];if("/"===(u=u.trim())[u.length-1]&&(u=u.substring(0,u.length-1),a--),!o(u))return G("InvalidTag",0===u.trim().length?"Invalid space after '<'.":"Tag '"+u+"' is an invalid name.",Q(t,a));var f=$(t,a);if(!1===f)return G("InvalidAttr","Attributes for '"+u+"' have open quote.",Q(t,a));var d=f.value;if(a=f.index,"/"===d[d.length-1]){var h=a-d.length,g=Z(d=d.substring(0,d.length-1),e);if(!0!==g)return G(g.err.code,g.err.msg,Q(t,h+g.err.line));n=!0}else if(l){if(!f.tagClosed)return G("InvalidTag","Closing tag '"+u+"' doesn't have proper closing.",Q(t,a));if(d.trim().length>0)return G("InvalidTag","Closing tag '"+u+"' can't have attributes or invalid starting.",Q(t,s));if(0===r.length)return G("InvalidTag","Closing tag '"+u+"' has not been opened.",Q(t,s));var p=r.pop();if(u!==p.tagName){var c=Q(t,p.tagStartPos);return G("InvalidTag","Expected closing tag '"+p.tagName+"' (opened in line "+c.line+", col "+c.col+") instead of closing tag '"+u+"'.",Q(t,s))}0==r.length&&(i=!0)}else{var v=Z(d,e);if(!0!==v)return G(v.err.code,v.err.msg,Q(t,a-d.length+v.err.line));if(!0===i)return G("InvalidXml","Multiple possible root nodes found.",Q(t,a));-1!==e.unpairedTags.indexOf(u)||r.push({tagName:u,tagStartPos:s}),n=!0}for(a++;a0)||G("InvalidXml","Invalid '"+JSON.stringify(r.map((function(t){return t.tagName})),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1}):G("InvalidXml","Start tag expected.",1)}(t,e);if(!0!==r)throw Error(r.err.msg+":"+r.err.line+":"+r.err.col)}var n=new x(this.options);n.addExternalEntities(this.externalEntities);var i=n.parseXml(t);return this.options.preserveOrder||void 0===i?i:_(i,this.options)},e.addEntity=function(t,e){if(-1!==e.indexOf("&"))throw new Error("Entity value can't have '&'");if(-1!==t.indexOf("&")||-1!==t.indexOf(";"))throw new Error("An entity must be set without '&' and ';'. Eg. use '#xD' for '
'");if("&"===e)throw new Error("An entity with value '&' is not permitted");this.externalEntities[t]=e},t.getMetaDataSymbol=function(){return l.getMetaDataSymbol()},t}();return e})()));
//# sourceMappingURL=fxparser.min.js.map
\ No newline at end of file
diff --git a/lib/fxparser.min.js.map b/lib/fxparser.min.js.map
index 1328329c..e5d931c4 100644
--- a/lib/fxparser.min.js.map
+++ b/lib/fxparser.min.js.map
@@ -1 +1 @@
-{"version":3,"file":"./lib/fxparser.min.js","mappings":"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","sources":["webpack://XMLParser/webpack/universalModuleDefinition","webpack://XMLParser/webpack/bootstrap","webpack://XMLParser/webpack/runtime/define property getters","webpack://XMLParser/webpack/runtime/hasOwnProperty shorthand","webpack://XMLParser/webpack/runtime/make namespace object","webpack://XMLParser/./src/xmlparser/OptionsBuilder.js","webpack://XMLParser/./src/util.js","webpack://XMLParser/./src/xmlparser/xmlNode.js","webpack://XMLParser/./src/xmlparser/DocTypeReader.js","webpack://XMLParser/./node_modules/strnum/strnum.js","webpack://XMLParser/./src/xmlparser/OrderedObjParser.js","webpack://XMLParser/./src/ignoreAttributes.js","webpack://XMLParser/./src/xmlparser/node2json.js","webpack://XMLParser/./src/validator.js","webpack://XMLParser/./src/xmlparser/XMLParser.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"XMLParser\"] = factory();\n\telse\n\t\troot[\"XMLParser\"] = factory();\n})(this, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","\nexport const defaultOptions = {\n preserveOrder: false,\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n removeNSPrefix: false, // remove NS from tag name or attribute name if true\n allowBooleanAttributes: false, //a tag can have attributes without any value\n //ignoreRootElement : false,\n parseTagValue: true,\n parseAttributeValue: false,\n trimValues: true, //Trim string values of tag and attributes\n cdataPropName: false,\n numberParseOptions: {\n hex: true,\n leadingZeros: true,\n eNotation: true\n },\n tagValueProcessor: function(tagName, val) {\n return val;\n },\n attributeValueProcessor: function(attrName, val) {\n return val;\n },\n stopNodes: [], //nested tags will not be parsed even for errors\n alwaysCreateTextNode: false,\n isArray: () => false,\n commentPropName: false,\n unpairedTags: [],\n processEntities: true,\n htmlEntities: false,\n ignoreDeclaration: false,\n ignorePiTags: false,\n transformTagName: false,\n transformAttributeName: false,\n updateTag: function(tagName, jPath, attrs){\n return tagName\n },\n // skipEmptyListItem: false\n captureMetaData: false,\n};\n \nexport const buildOptions = function(options) {\n return Object.assign({}, defaultOptions, options);\n};\n","'use strict';\n\nconst nameStartChar = ':A-Za-z_\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD';\nconst nameChar = nameStartChar + '\\\\-.\\\\d\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040';\nexport const nameRegexp = '[' + nameStartChar + '][' + nameChar + ']*';\nconst regexName = new RegExp('^' + nameRegexp + '$');\n\nexport function getAllMatches(string, regex) {\n const matches = [];\n let match = regex.exec(string);\n while (match) {\n const allmatches = [];\n allmatches.startIndex = regex.lastIndex - match[0].length;\n const len = match.length;\n for (let index = 0; index < len; index++) {\n allmatches.push(match[index]);\n }\n matches.push(allmatches);\n match = regex.exec(string);\n }\n return matches;\n}\n\nexport const isName = function(string) {\n const match = regexName.exec(string);\n return !(match === null || typeof match === 'undefined');\n}\n\nexport function isExist(v) {\n return typeof v !== 'undefined';\n}\n\nexport function isEmptyObject(obj) {\n return Object.keys(obj).length === 0;\n}\n\n/**\n * Copy all the properties of a into b.\n * @param {*} target\n * @param {*} a\n */\nexport function merge(target, a, arrayMode) {\n if (a) {\n const keys = Object.keys(a); // will return an array of own properties\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n if (arrayMode === 'strict') {\n target[keys[i]] = [ a[keys[i]] ];\n } else {\n target[keys[i]] = a[keys[i]];\n }\n }\n }\n}\n/* exports.merge =function (b,a){\n return Object.assign(b,a);\n} */\n\nexport function getValue(v) {\n if (exports.isExist(v)) {\n return v;\n } else {\n return '';\n }\n}\n\n// const fakeCall = function(a) {return a;};\n// const fakeCallNoReturn = function() {};","'use strict';\n\nlet METADATA_SYMBOL;\n\nif (typeof Symbol !== \"function\") {\n METADATA_SYMBOL = \"@@xmlMetadata\";\n} else {\n METADATA_SYMBOL = Symbol(\"XML Node Metadata\");\n}\n\nexport default class XmlNode{\n constructor(tagname) {\n this.tagname = tagname;\n this.child = []; //nested tags, text, cdata, comments in order\n this[\":@\"] = {}; //attributes map\n }\n add(key,val){\n // this.child.push( {name : key, val: val, isCdata: isCdata });\n if(key === \"__proto__\") key = \"#__proto__\";\n this.child.push( {[key]: val });\n }\n addChild(node, startIndex) {\n if(node.tagname === \"__proto__\") node.tagname = \"#__proto__\";\n if(node[\":@\"] && Object.keys(node[\":@\"]).length > 0){\n this.child.push( { [node.tagname]: node.child, [\":@\"]: node[\":@\"] });\n }else{\n this.child.push( { [node.tagname]: node.child });\n }\n // if requested, add the startIndex\n if (startIndex !== undefined) {\n // Note: for now we just overwrite the metadata. If we had more complex metadata,\n // we might need to do an object append here: metadata = { ...metadata, startIndex }\n this.child[this.child.length - 1][METADATA_SYMBOL] = { startIndex };\n }\n }\n /** symbol used for metadata */\n static getMetaDataSymbol() {\n return METADATA_SYMBOL;\n }\n}\n","import {isName} from '../util.js';\n\nexport default class DocTypeReader{\n constructor(processEntities){\n this.suppressValidationErr = !processEntities;\n }\n \n readDocType(xmlData, i){\n \n const entities = {};\n if( xmlData[i + 3] === 'O' &&\n xmlData[i + 4] === 'C' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'Y' &&\n xmlData[i + 7] === 'P' &&\n xmlData[i + 8] === 'E')\n { \n i = i+9;\n let angleBracketsCount = 1;\n let hasBody = false, comment = false;\n let exp = \"\";\n for(;i') { //Read tag content\n if(comment){\n if( xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\"){\n comment = false;\n angleBracketsCount--;\n }\n }else{\n angleBracketsCount--;\n }\n if (angleBracketsCount === 0) {\n break;\n }\n }else if( xmlData[i] === '['){\n hasBody = true;\n }else{\n exp += xmlData[i];\n }\n }\n if(angleBracketsCount !== 0){\n throw new Error(`Unclosed DOCTYPE`);\n }\n }else{\n throw new Error(`Invalid Tag instead of DOCTYPE`);\n }\n return {entities, i};\n }\n readEntityExp(xmlData, i) { \n //External entities are not supported\n // \n\n //Parameter entities are not supported\n // \n\n //Internal entities are supported\n // \n\n // Skip leading whitespace after \n // \n // \n // \n // \n \n // Skip leading whitespace after {\n while (index < data.length && /\\s/.test(data[index])) {\n index++;\n }\n return index;\n};\n\n\n\nfunction hasSeq(data, seq,i){\n for(let j=0;j [ , '+', '00', '.123', ..\n if(match){\n const sign = match[1] || \"\";\n const leadingZeros = match[2];\n let numTrimmedByZeros = trimZeros(match[3]); //complete num without leading zeros\n const decimalAdjacentToLeadingZeros = sign ? // 0., -00., 000.\n str[leadingZeros.length+1] === \".\" \n : str[leadingZeros.length] === \".\";\n\n //trim ending zeros for floating number\n if(!options.leadingZeros //leading zeros are not allowed\n && (leadingZeros.length > 1 \n || (leadingZeros.length === 1 && !decimalAdjacentToLeadingZeros))){\n // 00, 00.3, +03.24, 03, 03.24\n return str;\n }\n else{//no leading zeros or leading zeros are allowed\n const num = Number(trimmedStr);\n const parsedStr = String(num);\n\n if( num === 0 || num === -0) return num;\n if(parsedStr.search(/[eE]/) !== -1){ //given number is long and parsed to eNotation\n if(options.eNotation) return num;\n else return str;\n }else if(trimmedStr.indexOf(\".\") !== -1){ //floating number\n if(parsedStr === \"0\") return num; //0.0\n else if(parsedStr === numTrimmedByZeros) return num; //0.456. 0.79000\n else if( parsedStr === `${sign}${numTrimmedByZeros}`) return num;\n else return str;\n }\n \n let n = leadingZeros? numTrimmedByZeros : trimmedStr;\n if(leadingZeros){\n // -009 => -9\n return (n === parsedStr) || (sign+n === parsedStr) ? num : str\n }else {\n // +9\n return (n === parsedStr) || (n === sign+parsedStr) ? num : str\n }\n }\n }else{ //non-numeric string\n return str;\n }\n }\n}\n\nconst eNotationRegx = /^([-+])?(0*)(\\d*(\\.\\d*)?[eE][-\\+]?\\d+)$/;\nfunction resolveEnotation(str,trimmedStr,options){\n if(!options.eNotation) return str;\n const notation = trimmedStr.match(eNotationRegx); \n if(notation){\n let sign = notation[1] || \"\";\n const eChar = notation[3].indexOf(\"e\") === -1 ? \"E\" : \"e\";\n const leadingZeros = notation[2];\n const eAdjacentToLeadingZeros = sign ? // 0E.\n str[leadingZeros.length+1] === eChar \n : str[leadingZeros.length] === eChar;\n\n if(leadingZeros.length > 1 && eAdjacentToLeadingZeros) return str;\n else if(leadingZeros.length === 1 \n && (notation[3].startsWith(`.${eChar}`) || notation[3][0] === eChar)){\n return Number(trimmedStr);\n }else if(options.leadingZeros && !eAdjacentToLeadingZeros){ //accept with leading zeros\n //remove leading 0s\n trimmedStr = (notation[1] || \"\") + notation[3];\n return Number(trimmedStr);\n }else return str;\n }else{\n return str;\n }\n}\n\n/**\n * \n * @param {string} numStr without leading zeros\n * @returns \n */\nfunction trimZeros(numStr){\n if(numStr && numStr.indexOf(\".\") !== -1){//float\n numStr = numStr.replace(/0+$/, \"\"); //remove ending zeros\n if(numStr === \".\") numStr = \"0\";\n else if(numStr[0] === \".\") numStr = \"0\"+numStr;\n else if(numStr[numStr.length-1] === \".\") numStr = numStr.substring(0,numStr.length-1);\n return numStr;\n }\n return numStr;\n}\n\nfunction parse_int(numStr, base){\n //polyfill\n if(parseInt) return parseInt(numStr, base);\n else if(Number.parseInt) return Number.parseInt(numStr, base);\n else if(window && window.parseInt) return window.parseInt(numStr, base);\n else throw new Error(\"parseInt, Number.parseInt, window.parseInt are not supported\")\n}","'use strict';\n///@ts-check\n\nimport {getAllMatches, isExist} from '../util.js';\nimport xmlNode from './xmlNode.js';\nimport DocTypeReader from './DocTypeReader.js';\nimport toNumber from \"strnum\";\nimport getIgnoreAttributesFn from \"../ignoreAttributes.js\";\n\n// const regx =\n// '<((!\\\\[CDATA\\\\[([\\\\s\\\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\\\/)(NAME)\\\\s*>))([^<]*)'\n// .replace(/NAME/g, util.nameRegexp);\n\n//const tagsRegx = new RegExp(\"<(\\\\/?[\\\\w:\\\\-\\._]+)([^>]*)>(\\\\s*\"+cdataRegx+\")*([^<]+)?\",\"g\");\n//const tagsRegx = new RegExp(\"<(\\\\/?)((\\\\w*:)?([\\\\w:\\\\-\\._]+))([^>]*)>([^<]*)(\"+cdataRegx+\"([^<]*))*([^<]+)?\",\"g\");\n\nexport default class OrderedObjParser{\n constructor(options){\n this.options = options;\n this.currentNode = null;\n this.tagsNodeStack = [];\n this.docTypeEntities = {};\n this.lastEntities = {\n \"apos\" : { regex: /&(apos|#39|#x27);/g, val : \"'\"},\n \"gt\" : { regex: /&(gt|#62|#x3E);/g, val : \">\"},\n \"lt\" : { regex: /&(lt|#60|#x3C);/g, val : \"<\"},\n \"quot\" : { regex: /&(quot|#34|#x22);/g, val : \"\\\"\"},\n };\n this.ampEntity = { regex: /&(amp|#38|#x26);/g, val : \"&\"};\n this.htmlEntities = {\n \"space\": { regex: /&(nbsp|#160);/g, val: \" \" },\n // \"lt\" : { regex: /&(lt|#60);/g, val: \"<\" },\n // \"gt\" : { regex: /&(gt|#62);/g, val: \">\" },\n // \"amp\" : { regex: /&(amp|#38);/g, val: \"&\" },\n // \"quot\" : { regex: /&(quot|#34);/g, val: \"\\\"\" },\n // \"apos\" : { regex: /&(apos|#39);/g, val: \"'\" },\n \"cent\" : { regex: /&(cent|#162);/g, val: \"¢\" },\n \"pound\" : { regex: /&(pound|#163);/g, val: \"£\" },\n \"yen\" : { regex: /&(yen|#165);/g, val: \"¥\" },\n \"euro\" : { regex: /&(euro|#8364);/g, val: \"€\" },\n \"copyright\" : { regex: /&(copy|#169);/g, val: \"©\" },\n \"reg\" : { regex: /&(reg|#174);/g, val: \"®\" },\n \"inr\" : { regex: /&(inr|#8377);/g, val: \"₹\" },\n \"num_dec\": { regex: /([0-9]{1,7});/g, val : (_, str) => fromCodePoint(str, 10, \"\") },\n \"num_hex\": { regex: /([0-9a-fA-F]{1,6});/g, val : (_, str) => fromCodePoint(str, 16, \"\") },\n };\n this.addExternalEntities = addExternalEntities;\n this.parseXml = parseXml;\n this.parseTextData = parseTextData;\n this.resolveNameSpace = resolveNameSpace;\n this.buildAttributesMap = buildAttributesMap;\n this.isItStopNode = isItStopNode;\n this.replaceEntitiesValue = replaceEntitiesValue;\n this.readStopNodeData = readStopNodeData;\n this.saveTextToParentTag = saveTextToParentTag;\n this.addChild = addChild;\n this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)\n\n if(this.options.stopNodes && this.options.stopNodes.length > 0){\n this.stopNodesExact = new Set();\n this.stopNodesWildcard = new Set();\n for(let i = 0; i < this.options.stopNodes.length; i++){\n const stopNodeExp = this.options.stopNodes[i];\n if(typeof stopNodeExp !== 'string') continue;\n if(stopNodeExp.startsWith(\"*.\")){\n this.stopNodesWildcard.add(stopNodeExp.substring(2));\n }else{\n this.stopNodesExact.add(stopNodeExp);\n }\n }\n }\n }\n\n}\n\nfunction addExternalEntities(externalEntities){\n const entKeys = Object.keys(externalEntities);\n for (let i = 0; i < entKeys.length; i++) {\n const ent = entKeys[i];\n this.lastEntities[ent] = {\n regex: new RegExp(\"&\"+ent+\";\",\"g\"),\n val : externalEntities[ent]\n }\n }\n}\n\n/**\n * @param {string} val\n * @param {string} tagName\n * @param {string} jPath\n * @param {boolean} dontTrim\n * @param {boolean} hasAttributes\n * @param {boolean} isLeafNode\n * @param {boolean} escapeEntities\n */\nfunction parseTextData(val, tagName, jPath, dontTrim, hasAttributes, isLeafNode, escapeEntities) {\n if (val !== undefined) {\n if (this.options.trimValues && !dontTrim) {\n val = val.trim();\n }\n if(val.length > 0){\n if(!escapeEntities) val = this.replaceEntitiesValue(val);\n \n const newval = this.options.tagValueProcessor(tagName, val, jPath, hasAttributes, isLeafNode);\n if(newval === null || newval === undefined){\n //don't parse\n return val;\n }else if(typeof newval !== typeof val || newval !== val){\n //overwrite\n return newval;\n }else if(this.options.trimValues){\n return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n }else{\n const trimmedVal = val.trim();\n if(trimmedVal === val){\n return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n }else{\n return val;\n }\n }\n }\n }\n}\n\nfunction resolveNameSpace(tagname) {\n if (this.options.removeNSPrefix) {\n const tags = tagname.split(':');\n const prefix = tagname.charAt(0) === '/' ? '/' : '';\n if (tags[0] === 'xmlns') {\n return '';\n }\n if (tags.length === 2) {\n tagname = prefix + tags[1];\n }\n }\n return tagname;\n}\n\n//TODO: change regex to capture NS\n//const attrsRegx = new RegExp(\"([\\\\w\\\\-\\\\.\\\\:]+)\\\\s*=\\\\s*(['\\\"])((.|\\n)*?)\\\\2\",\"gm\");\nconst attrsRegx = new RegExp('([^\\\\s=]+)\\\\s*(=\\\\s*([\\'\"])([\\\\s\\\\S]*?)\\\\3)?', 'gm');\n\nfunction buildAttributesMap(attrStr, jPath) {\n if (this.options.ignoreAttributes !== true && typeof attrStr === 'string') {\n // attrStr = attrStr.replace(/\\r?\\n/g, ' ');\n //attrStr = attrStr || attrStr.trim();\n\n const matches = getAllMatches(attrStr, attrsRegx);\n const len = matches.length; //don't make it inline\n const attrs = {};\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n if (this.ignoreAttributesFn(attrName, jPath)) {\n continue\n }\n let oldVal = matches[i][4];\n let aName = this.options.attributeNamePrefix + attrName;\n if (attrName.length) {\n if (this.options.transformAttributeName) {\n aName = this.options.transformAttributeName(aName);\n }\n if(aName === \"__proto__\") aName = \"#__proto__\";\n if (oldVal !== undefined) {\n if (this.options.trimValues) {\n oldVal = oldVal.trim();\n }\n oldVal = this.replaceEntitiesValue(oldVal);\n const newVal = this.options.attributeValueProcessor(attrName, oldVal, jPath);\n if(newVal === null || newVal === undefined){\n //don't parse\n attrs[aName] = oldVal;\n }else if(typeof newVal !== typeof oldVal || newVal !== oldVal){\n //overwrite\n attrs[aName] = newVal;\n }else{\n //parse\n attrs[aName] = parseValue(\n oldVal,\n this.options.parseAttributeValue,\n this.options.numberParseOptions\n );\n }\n } else if (this.options.allowBooleanAttributes) {\n attrs[aName] = true;\n }\n }\n }\n if (!Object.keys(attrs).length) {\n return;\n }\n if (this.options.attributesGroupName) {\n const attrCollection = {};\n attrCollection[this.options.attributesGroupName] = attrs;\n return attrCollection;\n }\n return attrs\n }\n}\n\nconst parseXml = function(xmlData) {\n xmlData = xmlData.replace(/\\r\\n?/g, \"\\n\"); //TODO: remove this line\n const xmlObj = new xmlNode('!xml');\n let currentNode = xmlObj;\n let textData = \"\";\n let jPath = \"\";\n const docTypeReader = new DocTypeReader(this.options.processEntities);\n for(let i=0; i< xmlData.length; i++){//for each char in XML data\n const ch = xmlData[i];\n if(ch === '<'){\n // const nextIndex = i+1;\n // const _2ndChar = xmlData[nextIndex];\n if( xmlData[i+1] === '/') {//Closing Tag\n const closeIndex = findClosingIndex(xmlData, \">\", i, \"Closing Tag is not closed.\")\n let tagName = xmlData.substring(i+2,closeIndex).trim();\n\n if(this.options.removeNSPrefix){\n const colonIndex = tagName.indexOf(\":\");\n if(colonIndex !== -1){\n tagName = tagName.substr(colonIndex+1);\n }\n }\n\n if(this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n\n if(currentNode){\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n }\n\n //check if last tag of nested tag was unpaired tag\n const lastTagName = jPath.substring(jPath.lastIndexOf(\".\")+1);\n if(tagName && this.options.unpairedTags.indexOf(tagName) !== -1 ){\n throw new Error(`Unpaired tag can not be used as closing tag: ${tagName}>`);\n }\n let propIndex = 0\n if(lastTagName && this.options.unpairedTags.indexOf(lastTagName) !== -1 ){\n propIndex = jPath.lastIndexOf('.', jPath.lastIndexOf('.')-1)\n this.tagsNodeStack.pop();\n }else{\n propIndex = jPath.lastIndexOf(\".\");\n }\n jPath = jPath.substring(0, propIndex);\n\n currentNode = this.tagsNodeStack.pop();//avoid recursion, set the parent tag scope\n textData = \"\";\n i = closeIndex;\n } else if( xmlData[i+1] === '?') {\n\n let tagData = readTagExp(xmlData,i, false, \"?>\");\n if(!tagData) throw new Error(\"Pi Tag is not closed.\");\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n if( (this.options.ignoreDeclaration && tagData.tagName === \"?xml\") || this.options.ignorePiTags){\n //do nothing\n }else{\n \n const childNode = new xmlNode(tagData.tagName);\n childNode.add(this.options.textNodeName, \"\");\n \n if(tagData.tagName !== tagData.tagExp && tagData.attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagData.tagExp, jPath);\n }\n this.addChild(currentNode, childNode, jPath, i);\n }\n\n\n i = tagData.closeIndex + 1;\n } else if(xmlData.substr(i + 1, 3) === '!--') {\n const endIndex = findClosingIndex(xmlData, \"-->\", i+4, \"Comment is not closed.\")\n if(this.options.commentPropName){\n const comment = xmlData.substring(i + 4, endIndex - 2);\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n currentNode.add(this.options.commentPropName, [ { [this.options.textNodeName] : comment } ]);\n }\n i = endIndex;\n } else if( xmlData.substr(i + 1, 2) === '!D') {\n const result = docTypeReader.readDocType(xmlData, i);\n this.docTypeEntities = result.entities;\n i = result.i;\n }else if(xmlData.substr(i + 1, 2) === '![') {\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"CDATA is not closed.\") - 2;\n const tagExp = xmlData.substring(i + 9,closeIndex);\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n let val = this.parseTextData(tagExp, currentNode.tagname, jPath, true, false, true, true);\n if(val == undefined) val = \"\";\n\n //cdata should be set even if it is 0 length string\n if(this.options.cdataPropName){\n currentNode.add(this.options.cdataPropName, [ { [this.options.textNodeName] : tagExp } ]);\n }else{\n currentNode.add(this.options.textNodeName, val);\n }\n \n i = closeIndex + 2;\n }else {//Opening tag\n let result = readTagExp(xmlData,i, this.options.removeNSPrefix);\n let tagName= result.tagName;\n const rawTagName = result.rawTagName;\n let tagExp = result.tagExp;\n let attrExpPresent = result.attrExpPresent;\n let closeIndex = result.closeIndex;\n\n if (this.options.transformTagName) {\n //console.log(tagExp, tagName)\n const newTagName = this.options.transformTagName(tagName);\n if(tagExp === tagName) {\n tagExp = newTagName\n }\n tagName = newTagName;\n }\n \n //save text as child node\n if (currentNode && textData) {\n if(currentNode.tagname !== '!xml'){\n //when nested tag is found\n textData = this.saveTextToParentTag(textData, currentNode, jPath, false);\n }\n }\n\n //check if last tag was unpaired tag\n const lastTag = currentNode;\n if(lastTag && this.options.unpairedTags.indexOf(lastTag.tagname) !== -1 ){\n currentNode = this.tagsNodeStack.pop();\n jPath = jPath.substring(0, jPath.lastIndexOf(\".\"));\n }\n if(tagName !== xmlObj.tagname){\n jPath += jPath ? \".\" + tagName : tagName;\n }\n const startIndex = i;\n if (this.isItStopNode(this.stopNodesExact, this.stopNodesWildcard, jPath, tagName)) {\n let tagContent = \"\";\n //self-closing tag\n if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){\n if(tagName[tagName.length - 1] === \"/\"){ //remove trailing '/'\n tagName = tagName.substr(0, tagName.length - 1);\n jPath = jPath.substr(0, jPath.length - 1);\n tagExp = tagName;\n }else{\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n i = result.closeIndex;\n }\n //unpaired tag\n else if(this.options.unpairedTags.indexOf(tagName) !== -1){\n \n i = result.closeIndex;\n }\n //normal tag\n else{\n //read until closing tag is found\n const result = this.readStopNodeData(xmlData, rawTagName, closeIndex + 1);\n if(!result) throw new Error(`Unexpected end of ${rawTagName}`);\n i = result.i;\n tagContent = result.tagContent;\n }\n\n const childNode = new xmlNode(tagName);\n\n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath\n );\n }\n if(tagContent) {\n tagContent = this.parseTextData(tagContent, tagName, jPath, true, attrExpPresent, true, true);\n }\n \n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n childNode.add(this.options.textNodeName, tagContent);\n \n this.addChild(currentNode, childNode, jPath, startIndex);\n }else{\n //selfClosing tag\n if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){\n if(tagName[tagName.length - 1] === \"/\"){ //remove trailing '/'\n tagName = tagName.substr(0, tagName.length - 1);\n jPath = jPath.substr(0, jPath.length - 1);\n tagExp = tagName;\n }else{\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n \n if(this.options.transformTagName) {\n const newTagName = this.options.transformTagName(tagName);\n if(tagExp === tagName) {\n tagExp = newTagName\n }\n tagName = newTagName;\n }\n\n const childNode = new xmlNode(tagName);\n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath);\n }\n this.addChild(currentNode, childNode, jPath, startIndex);\n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n }\n //opening tag\n else{\n const childNode = new xmlNode( tagName);\n this.tagsNodeStack.push(currentNode);\n \n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath);\n }\n this.addChild(currentNode, childNode, jPath, startIndex);\n currentNode = childNode;\n }\n textData = \"\";\n i = closeIndex;\n }\n }\n }else{\n textData += xmlData[i];\n }\n }\n return xmlObj.child;\n}\n\nfunction addChild(currentNode, childNode, jPath, startIndex){\n // unset startIndex if not requested\n if (!this.options.captureMetaData) startIndex = undefined;\n const result = this.options.updateTag(childNode.tagname, jPath, childNode[\":@\"])\n if(result === false){\n //do nothing\n } else if(typeof result === \"string\"){\n childNode.tagname = result\n currentNode.addChild(childNode, startIndex);\n }else{\n currentNode.addChild(childNode, startIndex);\n }\n}\n\nconst replaceEntitiesValue = function(val){\n\n if(this.options.processEntities){\n for(let entityName in this.docTypeEntities){\n const entity = this.docTypeEntities[entityName];\n val = val.replace( entity.regx, entity.val);\n }\n for(let entityName in this.lastEntities){\n const entity = this.lastEntities[entityName];\n val = val.replace( entity.regex, entity.val);\n }\n if(this.options.htmlEntities){\n for(let entityName in this.htmlEntities){\n const entity = this.htmlEntities[entityName];\n val = val.replace( entity.regex, entity.val);\n }\n }\n val = val.replace( this.ampEntity.regex, this.ampEntity.val);\n }\n return val;\n}\nfunction saveTextToParentTag(textData, currentNode, jPath, isLeafNode) {\n if (textData) { //store previously collected data as textNode\n if(isLeafNode === undefined) isLeafNode = currentNode.child.length === 0\n \n textData = this.parseTextData(textData,\n currentNode.tagname,\n jPath,\n false,\n currentNode[\":@\"] ? Object.keys(currentNode[\":@\"]).length !== 0 : false,\n isLeafNode);\n\n if (textData !== undefined && textData !== \"\")\n currentNode.add(this.options.textNodeName, textData);\n textData = \"\";\n }\n return textData;\n}\n\n//TODO: use jPath to simplify the logic\n/**\n * @param {Set} stopNodesExact\n * @param {Set} stopNodesWildcard\n * @param {string} jPath\n * @param {string} currentTagName\n */\nfunction isItStopNode(stopNodesExact, stopNodesWildcard, jPath, currentTagName){\n if(stopNodesWildcard && stopNodesWildcard.has(currentTagName)) return true;\n if(stopNodesExact && stopNodesExact.has(jPath)) return true;\n return false;\n}\n\n/**\n * Returns the tag Expression and where it is ending handling single-double quotes situation\n * @param {string} xmlData \n * @param {number} i starting index\n * @returns \n */\nfunction tagExpWithClosingIndex(xmlData, i, closingChar = \">\"){\n let attrBoundary;\n let tagExp = \"\";\n for (let index = i; index < xmlData.length; index++) {\n let ch = xmlData[index];\n if (attrBoundary) {\n if (ch === attrBoundary) attrBoundary = \"\";//reset\n } else if (ch === '\"' || ch === \"'\") {\n attrBoundary = ch;\n } else if (ch === closingChar[0]) {\n if(closingChar[1]){\n if(xmlData[index + 1] === closingChar[1]){\n return {\n data: tagExp,\n index: index\n }\n }\n }else{\n return {\n data: tagExp,\n index: index\n }\n }\n } else if (ch === '\\t') {\n ch = \" \"\n }\n tagExp += ch;\n }\n}\n\nfunction findClosingIndex(xmlData, str, i, errMsg){\n const closingIndex = xmlData.indexOf(str, i);\n if(closingIndex === -1){\n throw new Error(errMsg)\n }else{\n return closingIndex + str.length - 1;\n }\n}\n\nfunction readTagExp(xmlData,i, removeNSPrefix, closingChar = \">\"){\n const result = tagExpWithClosingIndex(xmlData, i+1, closingChar);\n if(!result) return;\n let tagExp = result.data;\n const closeIndex = result.index;\n const separatorIndex = tagExp.search(/\\s/);\n let tagName = tagExp;\n let attrExpPresent = true;\n if(separatorIndex !== -1){//separate tag name and attributes expression\n tagName = tagExp.substring(0, separatorIndex);\n tagExp = tagExp.substring(separatorIndex + 1).trimStart();\n }\n\n const rawTagName = tagName;\n if(removeNSPrefix){\n const colonIndex = tagName.indexOf(\":\");\n if(colonIndex !== -1){\n tagName = tagName.substr(colonIndex+1);\n attrExpPresent = tagName !== result.data.substr(colonIndex + 1);\n }\n }\n\n return {\n tagName: tagName,\n tagExp: tagExp,\n closeIndex: closeIndex,\n attrExpPresent: attrExpPresent,\n rawTagName: rawTagName,\n }\n}\n/**\n * find paired tag for a stop node\n * @param {string} xmlData \n * @param {string} tagName \n * @param {number} i \n */\nfunction readStopNodeData(xmlData, tagName, i){\n const startIndex = i;\n // Starting at 1 since we already have an open tag\n let openTagCount = 1;\n\n for (; i < xmlData.length; i++) {\n if( xmlData[i] === \"<\"){ \n if (xmlData[i+1] === \"/\") {//close tag\n const closeIndex = findClosingIndex(xmlData, \">\", i, `${tagName} is not closed`);\n let closeTagName = xmlData.substring(i+2,closeIndex).trim();\n if(closeTagName === tagName){\n openTagCount--;\n if (openTagCount === 0) {\n return {\n tagContent: xmlData.substring(startIndex, i),\n i : closeIndex\n }\n }\n }\n i=closeIndex;\n } else if(xmlData[i+1] === '?') { \n const closeIndex = findClosingIndex(xmlData, \"?>\", i+1, \"StopNode is not closed.\")\n i=closeIndex;\n } else if(xmlData.substr(i + 1, 3) === '!--') { \n const closeIndex = findClosingIndex(xmlData, \"-->\", i+3, \"StopNode is not closed.\")\n i=closeIndex;\n } else if(xmlData.substr(i + 1, 2) === '![') { \n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"StopNode is not closed.\") - 2;\n i=closeIndex;\n } else {\n const tagData = readTagExp(xmlData, i, '>')\n\n if (tagData) {\n const openTagName = tagData && tagData.tagName;\n if (openTagName === tagName && tagData.tagExp[tagData.tagExp.length-1] !== \"/\") {\n openTagCount++;\n }\n i=tagData.closeIndex;\n }\n }\n }\n }//end for loop\n}\n\nfunction parseValue(val, shouldParse, options) {\n if (shouldParse && typeof val === 'string') {\n //console.log(options)\n const newval = val.trim();\n if(newval === 'true' ) return true;\n else if(newval === 'false' ) return false;\n else return toNumber(val, options);\n } else {\n if (isExist(val)) {\n return val;\n } else {\n return '';\n }\n }\n}\n\nfunction fromCodePoint(str, base, prefix){\n const codePoint = Number.parseInt(str, base);\n\n if (codePoint >= 0 && codePoint <= 0x10FFFF) {\n return String.fromCodePoint(codePoint);\n } else {\n return prefix +str + \";\";\n }\n}","export default function getIgnoreAttributesFn(ignoreAttributes) {\n if (typeof ignoreAttributes === 'function') {\n return ignoreAttributes\n }\n if (Array.isArray(ignoreAttributes)) {\n return (attrName) => {\n for (const pattern of ignoreAttributes) {\n if (typeof pattern === 'string' && attrName === pattern) {\n return true\n }\n if (pattern instanceof RegExp && pattern.test(attrName)) {\n return true\n }\n }\n }\n }\n return () => false\n}","'use strict';\n\nimport XmlNode from './xmlNode.js';\n\nconst METADATA_SYMBOL = XmlNode.getMetaDataSymbol();\n\n/**\n * \n * @param {array} node \n * @param {any} options \n * @returns \n */\nexport default function prettify(node, options){\n return compress( node, options);\n}\n\n/**\n * \n * @param {array} arr \n * @param {object} options \n * @param {string} jPath \n * @returns object\n */\nfunction compress(arr, options, jPath){\n let text;\n const compressedObj = {};\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const property = propName(tagObj);\n let newJpath = \"\";\n if(jPath === undefined) newJpath = property;\n else newJpath = jPath + \".\" + property;\n\n if(property === options.textNodeName){\n if(text === undefined) text = tagObj[property];\n else text += \"\" + tagObj[property];\n }else if(property === undefined){\n continue;\n }else if(tagObj[property]){\n \n let val = compress(tagObj[property], options, newJpath);\n const isLeaf = isLeafTag(val, options);\n if (tagObj[METADATA_SYMBOL] !== undefined) {\n val[METADATA_SYMBOL] = tagObj[METADATA_SYMBOL]; // copy over metadata\n }\n\n if(tagObj[\":@\"]){\n assignAttributes( val, tagObj[\":@\"], newJpath, options);\n }else if(Object.keys(val).length === 1 && val[options.textNodeName] !== undefined && !options.alwaysCreateTextNode){\n val = val[options.textNodeName];\n }else if(Object.keys(val).length === 0){\n if(options.alwaysCreateTextNode) val[options.textNodeName] = \"\";\n else val = \"\";\n }\n\n if(compressedObj[property] !== undefined && compressedObj.hasOwnProperty(property)) {\n if(!Array.isArray(compressedObj[property])) {\n compressedObj[property] = [ compressedObj[property] ];\n }\n compressedObj[property].push(val);\n }else{\n //TODO: if a node is not an array, then check if it should be an array\n //also determine if it is a leaf node\n if (options.isArray(property, newJpath, isLeaf )) {\n compressedObj[property] = [val];\n }else{\n compressedObj[property] = val;\n }\n }\n }\n \n }\n // if(text && text.length > 0) compressedObj[options.textNodeName] = text;\n if(typeof text === \"string\"){\n if(text.length > 0) compressedObj[options.textNodeName] = text;\n }else if(text !== undefined) compressedObj[options.textNodeName] = text;\n return compressedObj;\n}\n\nfunction propName(obj){\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if(key !== \":@\") return key;\n }\n}\n\nfunction assignAttributes(obj, attrMap, jpath, options){\n if (attrMap) {\n const keys = Object.keys(attrMap);\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n const atrrName = keys[i];\n if (options.isArray(atrrName, jpath + \".\" + atrrName, true, true)) {\n obj[atrrName] = [ attrMap[atrrName] ];\n } else {\n obj[atrrName] = attrMap[atrrName];\n }\n }\n }\n}\n\nfunction isLeafTag(obj, options){\n const { textNodeName } = options;\n const propCount = Object.keys(obj).length;\n \n if (propCount === 0) {\n return true;\n }\n\n if (\n propCount === 1 &&\n (obj[textNodeName] || typeof obj[textNodeName] === \"boolean\" || obj[textNodeName] === 0)\n ) {\n return true;\n }\n\n return false;\n}\n","'use strict';\n\nimport {getAllMatches, isName} from './util.js';\n\nconst defaultOptions = {\n allowBooleanAttributes: false, //A tag can have attributes without any value\n unpairedTags: []\n};\n\n//const tagsPattern = new RegExp(\"<\\\\/?([\\\\w:\\\\-_\\.]+)\\\\s*\\/?>\",\"g\");\nexport function validate(xmlData, options) {\n options = Object.assign({}, defaultOptions, options);\n\n //xmlData = xmlData.replace(/(\\r\\n|\\n|\\r)/gm,\"\");//make it single line\n //xmlData = xmlData.replace(/(^\\s*<\\?xml.*?\\?>)/g,\"\");//Remove XML starting tag\n //xmlData = xmlData.replace(/()/g,\"\");//Remove DOCTYPE\n const tags = [];\n let tagFound = false;\n\n //indicates that the root tag has been closed (aka. depth 0 has been reached)\n let reachedRoot = false;\n\n if (xmlData[0] === '\\ufeff') {\n // check for byte order mark (BOM)\n xmlData = xmlData.substr(1);\n }\n \n for (let i = 0; i < xmlData.length; i++) {\n\n if (xmlData[i] === '<' && xmlData[i+1] === '?') {\n i+=2;\n i = readPI(xmlData,i);\n if (i.err) return i;\n }else if (xmlData[i] === '<') {\n //starting of tag\n //read until you reach to '>' avoiding any '>' in attribute value\n let tagStartPos = i;\n i++;\n \n if (xmlData[i] === '!') {\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else {\n let closingTag = false;\n if (xmlData[i] === '/') {\n //closing tag\n closingTag = true;\n i++;\n }\n //read tagname\n let tagName = '';\n for (; i < xmlData.length &&\n xmlData[i] !== '>' &&\n xmlData[i] !== ' ' &&\n xmlData[i] !== '\\t' &&\n xmlData[i] !== '\\n' &&\n xmlData[i] !== '\\r'; i++\n ) {\n tagName += xmlData[i];\n }\n tagName = tagName.trim();\n //console.log(tagName);\n\n if (tagName[tagName.length - 1] === '/') {\n //self closing tag without attributes\n tagName = tagName.substring(0, tagName.length - 1);\n //continue;\n i--;\n }\n if (!validateTagName(tagName)) {\n let msg;\n if (tagName.trim().length === 0) {\n msg = \"Invalid space after '<'.\";\n } else {\n msg = \"Tag '\"+tagName+\"' is an invalid name.\";\n }\n return getErrorObject('InvalidTag', msg, getLineNumberForPosition(xmlData, i));\n }\n\n const result = readAttributeStr(xmlData, i);\n if (result === false) {\n return getErrorObject('InvalidAttr', \"Attributes for '\"+tagName+\"' have open quote.\", getLineNumberForPosition(xmlData, i));\n }\n let attrStr = result.value;\n i = result.index;\n\n if (attrStr[attrStr.length - 1] === '/') {\n //self closing tag\n const attrStrStart = i - attrStr.length;\n attrStr = attrStr.substring(0, attrStr.length - 1);\n const isValid = validateAttributeString(attrStr, options);\n if (isValid === true) {\n tagFound = true;\n //continue; //text may presents after self closing tag\n } else {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, attrStrStart + isValid.err.line));\n }\n } else if (closingTag) {\n if (!result.tagClosed) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' doesn't have proper closing.\", getLineNumberForPosition(xmlData, i));\n } else if (attrStr.trim().length > 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' can't have attributes or invalid starting.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else if (tags.length === 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' has not been opened.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else {\n const otg = tags.pop();\n if (tagName !== otg.tagName) {\n let openPos = getLineNumberForPosition(xmlData, otg.tagStartPos);\n return getErrorObject('InvalidTag',\n \"Expected closing tag '\"+otg.tagName+\"' (opened in line \"+openPos.line+\", col \"+openPos.col+\") instead of closing tag '\"+tagName+\"'.\",\n getLineNumberForPosition(xmlData, tagStartPos));\n }\n\n //when there are no more tags, we reached the root level.\n if (tags.length == 0) {\n reachedRoot = true;\n }\n }\n } else {\n const isValid = validateAttributeString(attrStr, options);\n if (isValid !== true) {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, i - attrStr.length + isValid.err.line));\n }\n\n //if the root level has been reached before ...\n if (reachedRoot === true) {\n return getErrorObject('InvalidXml', 'Multiple possible root nodes found.', getLineNumberForPosition(xmlData, i));\n } else if(options.unpairedTags.indexOf(tagName) !== -1){\n //don't push into stack\n } else {\n tags.push({tagName, tagStartPos});\n }\n tagFound = true;\n }\n\n //skip tag text value\n //It may include comments and CDATA value\n for (i++; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n if (xmlData[i + 1] === '!') {\n //comment or CADATA\n i++;\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else if (xmlData[i+1] === '?') {\n i = readPI(xmlData, ++i);\n if (i.err) return i;\n } else{\n break;\n }\n } else if (xmlData[i] === '&') {\n const afterAmp = validateAmpersand(xmlData, i);\n if (afterAmp == -1)\n return getErrorObject('InvalidChar', \"char '&' is not expected.\", getLineNumberForPosition(xmlData, i));\n i = afterAmp;\n }else{\n if (reachedRoot === true && !isWhiteSpace(xmlData[i])) {\n return getErrorObject('InvalidXml', \"Extra text at the end\", getLineNumberForPosition(xmlData, i));\n }\n }\n } //end of reading tag text value\n if (xmlData[i] === '<') {\n i--;\n }\n }\n } else {\n if ( isWhiteSpace(xmlData[i])) {\n continue;\n }\n return getErrorObject('InvalidChar', \"char '\"+xmlData[i]+\"' is not expected.\", getLineNumberForPosition(xmlData, i));\n }\n }\n\n if (!tagFound) {\n return getErrorObject('InvalidXml', 'Start tag expected.', 1);\n }else if (tags.length == 1) {\n return getErrorObject('InvalidTag', \"Unclosed tag '\"+tags[0].tagName+\"'.\", getLineNumberForPosition(xmlData, tags[0].tagStartPos));\n }else if (tags.length > 0) {\n return getErrorObject('InvalidXml', \"Invalid '\"+\n JSON.stringify(tags.map(t => t.tagName), null, 4).replace(/\\r?\\n/g, '')+\n \"' found.\", {line: 1, col: 1});\n }\n\n return true;\n};\n\nfunction isWhiteSpace(char){\n return char === ' ' || char === '\\t' || char === '\\n' || char === '\\r';\n}\n/**\n * Read Processing insstructions and skip\n * @param {*} xmlData\n * @param {*} i\n */\nfunction readPI(xmlData, i) {\n const start = i;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] == '?' || xmlData[i] == ' ') {\n //tagname\n const tagname = xmlData.substr(start, i - start);\n if (i > 5 && tagname === 'xml') {\n return getErrorObject('InvalidXml', 'XML declaration allowed only at the start of the document.', getLineNumberForPosition(xmlData, i));\n } else if (xmlData[i] == '?' && xmlData[i + 1] == '>') {\n //check if valid attribut string\n i++;\n break;\n } else {\n continue;\n }\n }\n }\n return i;\n}\n\nfunction readCommentAndCDATA(xmlData, i) {\n if (xmlData.length > i + 5 && xmlData[i + 1] === '-' && xmlData[i + 2] === '-') {\n //comment\n for (i += 3; i < xmlData.length; i++) {\n if (xmlData[i] === '-' && xmlData[i + 1] === '-' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n } else if (\n xmlData.length > i + 8 &&\n xmlData[i + 1] === 'D' &&\n xmlData[i + 2] === 'O' &&\n xmlData[i + 3] === 'C' &&\n xmlData[i + 4] === 'T' &&\n xmlData[i + 5] === 'Y' &&\n xmlData[i + 6] === 'P' &&\n xmlData[i + 7] === 'E'\n ) {\n let angleBracketsCount = 1;\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n angleBracketsCount++;\n } else if (xmlData[i] === '>') {\n angleBracketsCount--;\n if (angleBracketsCount === 0) {\n break;\n }\n }\n }\n } else if (\n xmlData.length > i + 9 &&\n xmlData[i + 1] === '[' &&\n xmlData[i + 2] === 'C' &&\n xmlData[i + 3] === 'D' &&\n xmlData[i + 4] === 'A' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'A' &&\n xmlData[i + 7] === '['\n ) {\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === ']' && xmlData[i + 1] === ']' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n }\n\n return i;\n}\n\nconst doubleQuote = '\"';\nconst singleQuote = \"'\";\n\n/**\n * Keep reading xmlData until '<' is found outside the attribute value.\n * @param {string} xmlData\n * @param {number} i\n */\nfunction readAttributeStr(xmlData, i) {\n let attrStr = '';\n let startChar = '';\n let tagClosed = false;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === doubleQuote || xmlData[i] === singleQuote) {\n if (startChar === '') {\n startChar = xmlData[i];\n } else if (startChar !== xmlData[i]) {\n //if vaue is enclosed with double quote then single quotes are allowed inside the value and vice versa\n } else {\n startChar = '';\n }\n } else if (xmlData[i] === '>') {\n if (startChar === '') {\n tagClosed = true;\n break;\n }\n }\n attrStr += xmlData[i];\n }\n if (startChar !== '') {\n return false;\n }\n\n return {\n value: attrStr,\n index: i,\n tagClosed: tagClosed\n };\n}\n\n/**\n * Select all the attributes whether valid or invalid.\n */\nconst validAttrStrRegxp = new RegExp('(\\\\s*)([^\\\\s=]+)(\\\\s*=)?(\\\\s*([\\'\"])(([\\\\s\\\\S])*?)\\\\5)?', 'g');\n\n//attr, =\"sd\", a=\"amit's\", a=\"sd\"b=\"saf\", ab cd=\"\"\n\nfunction validateAttributeString(attrStr, options) {\n //console.log(\"start:\"+attrStr+\":end\");\n\n //if(attrStr.trim().length === 0) return true; //empty string\n\n const matches = getAllMatches(attrStr, validAttrStrRegxp);\n const attrNames = {};\n\n for (let i = 0; i < matches.length; i++) {\n if (matches[i][1].length === 0) {\n //nospace before attribute name: a=\"sd\"b=\"saf\"\n return getErrorObject('InvalidAttr', \"Attribute '\"+matches[i][2]+\"' has no space in starting.\", getPositionFromMatch(matches[i]))\n } else if (matches[i][3] !== undefined && matches[i][4] === undefined) {\n return getErrorObject('InvalidAttr', \"Attribute '\"+matches[i][2]+\"' is without value.\", getPositionFromMatch(matches[i]));\n } else if (matches[i][3] === undefined && !options.allowBooleanAttributes) {\n //independent attribute: ab\n return getErrorObject('InvalidAttr', \"boolean attribute '\"+matches[i][2]+\"' is not allowed.\", getPositionFromMatch(matches[i]));\n }\n /* else if(matches[i][6] === undefined){//attribute without value: ab=\n return { err: { code:\"InvalidAttr\",msg:\"attribute \" + matches[i][2] + \" has no value assigned.\"}};\n } */\n const attrName = matches[i][2];\n if (!validateAttrName(attrName)) {\n return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is an invalid name.\", getPositionFromMatch(matches[i]));\n }\n if (!attrNames.hasOwnProperty(attrName)) {\n //check for duplicate attribute.\n attrNames[attrName] = 1;\n } else {\n return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is repeated.\", getPositionFromMatch(matches[i]));\n }\n }\n\n return true;\n}\n\nfunction validateNumberAmpersand(xmlData, i) {\n let re = /\\d/;\n if (xmlData[i] === 'x') {\n i++;\n re = /[\\da-fA-F]/;\n }\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === ';')\n return i;\n if (!xmlData[i].match(re))\n break;\n }\n return -1;\n}\n\nfunction validateAmpersand(xmlData, i) {\n // https://www.w3.org/TR/xml/#dt-charref\n i++;\n if (xmlData[i] === ';')\n return -1;\n if (xmlData[i] === '#') {\n i++;\n return validateNumberAmpersand(xmlData, i);\n }\n let count = 0;\n for (; i < xmlData.length; i++, count++) {\n if (xmlData[i].match(/\\w/) && count < 20)\n continue;\n if (xmlData[i] === ';')\n break;\n return -1;\n }\n return i;\n}\n\nfunction getErrorObject(code, message, lineNumber) {\n return {\n err: {\n code: code,\n msg: message,\n line: lineNumber.line || lineNumber,\n col: lineNumber.col,\n },\n };\n}\n\nfunction validateAttrName(attrName) {\n return isName(attrName);\n}\n\n// const startsWithXML = /^xml/i;\n\nfunction validateTagName(tagname) {\n return isName(tagname) /* && !tagname.match(startsWithXML) */;\n}\n\n//this function returns the line number for the character at the given index\nfunction getLineNumberForPosition(xmlData, index) {\n const lines = xmlData.substring(0, index).split(/\\r?\\n/);\n return {\n line: lines.length,\n\n // column number is last line's length + 1, because column numbering starts at 1:\n col: lines[lines.length - 1].length + 1\n };\n}\n\n//this function returns the position of the first character of match within attrStr\nfunction getPositionFromMatch(match) {\n return match.startIndex + match[1].length;\n}\n","import { buildOptions} from './OptionsBuilder.js';\nimport OrderedObjParser from './OrderedObjParser.js';\nimport prettify from './node2json.js';\nimport {validate} from \"../validator.js\";\nimport XmlNode from './xmlNode.js';\n\nexport default class XMLParser{\n \n constructor(options){\n this.externalEntities = {};\n this.options = buildOptions(options);\n \n }\n /**\n * Parse XML dats to JS object \n * @param {string|Uint8Array} xmlData \n * @param {boolean|Object} validationOption \n */\n parse(xmlData,validationOption){\n if(typeof xmlData !== \"string\" && xmlData.toString){\n xmlData = xmlData.toString();\n }else if(typeof xmlData !== \"string\"){\n throw new Error(\"XML data is accepted in String or Bytes[] form.\")\n }\n \n if( validationOption){\n if(validationOption === true) validationOption = {}; //validate with default options\n \n const result = validate(xmlData, validationOption);\n if (result !== true) {\n throw Error( `${result.err.msg}:${result.err.line}:${result.err.col}` )\n }\n }\n const orderedObjParser = new OrderedObjParser(this.options);\n orderedObjParser.addExternalEntities(this.externalEntities);\n const orderedResult = orderedObjParser.parseXml(xmlData);\n if(this.options.preserveOrder || orderedResult === undefined) return orderedResult;\n else return prettify(orderedResult, this.options);\n }\n\n /**\n * Add Entity which is not by default supported by this library\n * @param {string} key \n * @param {string} value \n */\n addEntity(key, value){\n if(value.indexOf(\"&\") !== -1){\n throw new Error(\"Entity value can't have '&'\")\n }else if(key.indexOf(\"&\") !== -1 || key.indexOf(\";\") !== -1){\n throw new Error(\"An entity must be set without '&' and ';'. Eg. use '#xD' for '
'\")\n }else if(value === \"&\"){\n throw new Error(\"An entity with value '&' is not permitted\");\n }else{\n this.externalEntities[key] = value;\n }\n }\n\n /**\n * Returns a Symbol that can be used to access the metadata\n * property on a node.\n * \n * If Symbol is not available in the environment, an ordinary property is used\n * and the name of the property is here returned.\n * \n * The XMLMetaData property is only present when `captureMetaData`\n * is true in the options.\n */\n static getMetaDataSymbol() {\n return XmlNode.getMetaDataSymbol();\n }\n}\n"],"names":["root","factory","exports","module","define","amd","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","defaultOptions","preserveOrder","attributeNamePrefix","attributesGroupName","textNodeName","ignoreAttributes","removeNSPrefix","allowBooleanAttributes","parseTagValue","parseAttributeValue","trimValues","cdataPropName","numberParseOptions","hex","leadingZeros","eNotation","tagValueProcessor","tagName","val","attributeValueProcessor","attrName","stopNodes","alwaysCreateTextNode","isArray","commentPropName","unpairedTags","processEntities","htmlEntities","ignoreDeclaration","ignorePiTags","transformTagName","transformAttributeName","updateTag","jPath","attrs","captureMetaData","nameStartChar","regexName","RegExp","getAllMatches","string","regex","matches","match","exec","allmatches","startIndex","lastIndex","length","len","index","push","METADATA_SYMBOL","isName","XmlNode","tagname","child","_proto","add","_this$child$push","addChild","node","_this$child$push2","_this$child$push3","keys","undefined","getMetaDataSymbol","DocTypeReader","suppressValidationErr","readDocType","xmlData","i","entities","Error","angleBracketsCount","hasBody","comment","hasSeq","entityName","_this$readEntityExp","readEntityExp","indexOf","regx","readElementExp","readNotationExp","skipWhitespace","test","validateEntityName","substring","toUpperCase","_this$readIdentifierV","readIdentifierVal","notationName","identifierType","publicIdentifier","systemIdentifier","_this$readIdentifierV2","_this$readIdentifierV3","_this$readIdentifierV4","type","identifierVal","startChar","elementName","contentModel","trim","readAttlistExp","attributeName","attributeType","allowedNotations","notation","join","includes","defaultValue","_this$readIdentifierV5","data","seq","j","name","hexRegex","numRegex","consider","decimalPoint","eNotationRegx","OrderedObjParser","options","currentNode","tagsNodeStack","docTypeEntities","lastEntities","ampEntity","_","str","fromCodePoint","addExternalEntities","parseXml","parseTextData","resolveNameSpace","buildAttributesMap","isItStopNode","replaceEntitiesValue","readStopNodeData","saveTextToParentTag","ignoreAttributesFn","Array","_step","_iterator","_createForOfIteratorHelperLoose","done","pattern","stopNodesExact","Set","stopNodesWildcard","stopNodeExp","startsWith","externalEntities","entKeys","ent","dontTrim","hasAttributes","isLeafNode","escapeEntities","newval","parseValue","tags","split","prefix","charAt","attrsRegx","attrStr","oldVal","aName","newVal","attrCollection","replace","xmlObj","xmlNode","textData","docTypeReader","closeIndex","findClosingIndex","colonIndex","substr","lastTagName","lastIndexOf","propIndex","pop","tagData","readTagExp","childNode","tagExp","attrExpPresent","endIndex","_ref","result","_ref2","rawTagName","newTagName","lastTag","tagContent","entity","currentTagName","has","errMsg","closingIndex","closingChar","attrBoundary","ch","tagExpWithClosingIndex","separatorIndex","search","trimStart","openTagCount","shouldParse","assign","trimmedStr","skipLike","numStr","parseInt","Number","window","parse_int","sign","eChar","eAdjacentToLeadingZeros","resolveEnotation","numTrimmedByZeros","decimalAdjacentToLeadingZeros","num","parsedStr","String","n","toNumber","base","codePoint","prettify","compress","arr","text","compressedObj","newJpath","tagObj","property","propName","isLeaf","isLeafTag","assignAttributes","attrMap","jpath","atrrName","propCount","isWhiteSpace","char","readPI","start","getErrorObject","getLineNumberForPosition","readCommentAndCDATA","readAttributeStr","tagClosed","validAttrStrRegxp","validateAttributeString","attrNames","getPositionFromMatch","validateAttrName","validateAmpersand","re","validateNumberAmpersand","count","code","message","lineNumber","err","msg","line","col","lines","XMLParser","buildOptions","parse","validationOption","toString","tagFound","reachedRoot","tagStartPos","closingTag","attrStrStart","isValid","otg","openPos","afterAmp","JSON","stringify","map","t","validate","orderedObjParser","orderedResult","addEntity"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"./lib/fxparser.min.js","mappings":"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","sources":["webpack://XMLParser/webpack/universalModuleDefinition","webpack://XMLParser/webpack/bootstrap","webpack://XMLParser/webpack/runtime/define property getters","webpack://XMLParser/webpack/runtime/hasOwnProperty shorthand","webpack://XMLParser/webpack/runtime/make namespace object","webpack://XMLParser/./src/xmlparser/OptionsBuilder.js","webpack://XMLParser/./src/util.js","webpack://XMLParser/./src/xmlparser/xmlNode.js","webpack://XMLParser/./src/xmlparser/DocTypeReader.js","webpack://XMLParser/./node_modules/strnum/strnum.js","webpack://XMLParser/./src/xmlparser/OrderedObjParser.js","webpack://XMLParser/./src/ignoreAttributes.js","webpack://XMLParser/./src/xmlparser/node2json.js","webpack://XMLParser/./src/validator.js","webpack://XMLParser/./src/xmlparser/XMLParser.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"XMLParser\"] = factory();\n\telse\n\t\troot[\"XMLParser\"] = factory();\n})(this, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","\nexport const defaultOptions = {\n preserveOrder: false,\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n removeNSPrefix: false, // remove NS from tag name or attribute name if true\n allowBooleanAttributes: false, //a tag can have attributes without any value\n //ignoreRootElement : false,\n parseTagValue: true,\n parseAttributeValue: false,\n trimValues: true, //Trim string values of tag and attributes\n cdataPropName: false,\n numberParseOptions: {\n hex: true,\n leadingZeros: true,\n eNotation: true\n },\n tagValueProcessor: function(tagName, val) {\n return val;\n },\n attributeValueProcessor: function(attrName, val) {\n return val;\n },\n stopNodes: [], //nested tags will not be parsed even for errors\n alwaysCreateTextNode: false,\n isArray: () => false,\n commentPropName: false,\n unpairedTags: [],\n processEntities: true,\n htmlEntities: false,\n ignoreDeclaration: false,\n ignorePiTags: false,\n transformTagName: false,\n transformAttributeName: false,\n updateTag: function(tagName, jPath, attrs){\n return tagName\n },\n // skipEmptyListItem: false\n captureMetaData: false,\n};\n \nexport const buildOptions = function(options) {\n return Object.assign({}, defaultOptions, options);\n};\n","'use strict';\n\nconst nameStartChar = ':A-Za-z_\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD';\nconst nameChar = nameStartChar + '\\\\-.\\\\d\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040';\nexport const nameRegexp = '[' + nameStartChar + '][' + nameChar + ']*';\nconst regexName = new RegExp('^' + nameRegexp + '$');\n\nexport function getAllMatches(string, regex) {\n const matches = [];\n let match = regex.exec(string);\n while (match) {\n const allmatches = [];\n allmatches.startIndex = regex.lastIndex - match[0].length;\n const len = match.length;\n for (let index = 0; index < len; index++) {\n allmatches.push(match[index]);\n }\n matches.push(allmatches);\n match = regex.exec(string);\n }\n return matches;\n}\n\nexport const isName = function(string) {\n const match = regexName.exec(string);\n return !(match === null || typeof match === 'undefined');\n}\n\nexport function isExist(v) {\n return typeof v !== 'undefined';\n}\n\nexport function isEmptyObject(obj) {\n return Object.keys(obj).length === 0;\n}\n\n/**\n * Copy all the properties of a into b.\n * @param {*} target\n * @param {*} a\n */\nexport function merge(target, a, arrayMode) {\n if (a) {\n const keys = Object.keys(a); // will return an array of own properties\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n if (arrayMode === 'strict') {\n target[keys[i]] = [ a[keys[i]] ];\n } else {\n target[keys[i]] = a[keys[i]];\n }\n }\n }\n}\n/* exports.merge =function (b,a){\n return Object.assign(b,a);\n} */\n\nexport function getValue(v) {\n if (exports.isExist(v)) {\n return v;\n } else {\n return '';\n }\n}\n\n// const fakeCall = function(a) {return a;};\n// const fakeCallNoReturn = function() {};","'use strict';\n\nlet METADATA_SYMBOL;\n\nif (typeof Symbol !== \"function\") {\n METADATA_SYMBOL = \"@@xmlMetadata\";\n} else {\n METADATA_SYMBOL = Symbol(\"XML Node Metadata\");\n}\n\nexport default class XmlNode{\n constructor(tagname) {\n this.tagname = tagname;\n this.child = []; //nested tags, text, cdata, comments in order\n this[\":@\"] = {}; //attributes map\n }\n add(key,val){\n // this.child.push( {name : key, val: val, isCdata: isCdata });\n if(key === \"__proto__\") key = \"#__proto__\";\n this.child.push( {[key]: val });\n }\n addChild(node, startIndex) {\n if(node.tagname === \"__proto__\") node.tagname = \"#__proto__\";\n if(node[\":@\"] && Object.keys(node[\":@\"]).length > 0){\n this.child.push( { [node.tagname]: node.child, [\":@\"]: node[\":@\"] });\n }else{\n this.child.push( { [node.tagname]: node.child });\n }\n // if requested, add the startIndex\n if (startIndex !== undefined) {\n // Note: for now we just overwrite the metadata. If we had more complex metadata,\n // we might need to do an object append here: metadata = { ...metadata, startIndex }\n this.child[this.child.length - 1][METADATA_SYMBOL] = { startIndex };\n }\n }\n /** symbol used for metadata */\n static getMetaDataSymbol() {\n return METADATA_SYMBOL;\n }\n}\n","import {isName} from '../util.js';\n\nexport default class DocTypeReader{\n constructor(processEntities){\n this.suppressValidationErr = !processEntities;\n }\n \n readDocType(xmlData, i){\n \n const entities = {};\n if( xmlData[i + 3] === 'O' &&\n xmlData[i + 4] === 'C' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'Y' &&\n xmlData[i + 7] === 'P' &&\n xmlData[i + 8] === 'E')\n { \n i = i+9;\n let angleBracketsCount = 1;\n let hasBody = false, comment = false;\n let exp = \"\";\n for(;i') { //Read tag content\n if(comment){\n if( xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\"){\n comment = false;\n angleBracketsCount--;\n }\n }else{\n angleBracketsCount--;\n }\n if (angleBracketsCount === 0) {\n break;\n }\n }else if( xmlData[i] === '['){\n hasBody = true;\n }else{\n exp += xmlData[i];\n }\n }\n if(angleBracketsCount !== 0){\n throw new Error(`Unclosed DOCTYPE`);\n }\n }else{\n throw new Error(`Invalid Tag instead of DOCTYPE`);\n }\n return {entities, i};\n }\n readEntityExp(xmlData, i) { \n //External entities are not supported\n // \n\n //Parameter entities are not supported\n // \n\n //Internal entities are supported\n // \n\n // Skip leading whitespace after \n // \n // \n // \n // \n \n // Skip leading whitespace after {\n while (index < data.length && /\\s/.test(data[index])) {\n index++;\n }\n return index;\n};\n\n\n\nfunction hasSeq(data, seq,i){\n for(let j=0;j [ , '+', '00', '.123', ..\n if(match){\n const sign = match[1] || \"\";\n const leadingZeros = match[2];\n let numTrimmedByZeros = trimZeros(match[3]); //complete num without leading zeros\n const decimalAdjacentToLeadingZeros = sign ? // 0., -00., 000.\n str[leadingZeros.length+1] === \".\" \n : str[leadingZeros.length] === \".\";\n\n //trim ending zeros for floating number\n if(!options.leadingZeros //leading zeros are not allowed\n && (leadingZeros.length > 1 \n || (leadingZeros.length === 1 && !decimalAdjacentToLeadingZeros))){\n // 00, 00.3, +03.24, 03, 03.24\n return str;\n }\n else{//no leading zeros or leading zeros are allowed\n const num = Number(trimmedStr);\n const parsedStr = String(num);\n\n if( num === 0 || num === -0) return num;\n if(parsedStr.search(/[eE]/) !== -1){ //given number is long and parsed to eNotation\n if(options.eNotation) return num;\n else return str;\n }else if(trimmedStr.indexOf(\".\") !== -1){ //floating number\n if(parsedStr === \"0\") return num; //0.0\n else if(parsedStr === numTrimmedByZeros) return num; //0.456. 0.79000\n else if( parsedStr === `${sign}${numTrimmedByZeros}`) return num;\n else return str;\n }\n \n let n = leadingZeros? numTrimmedByZeros : trimmedStr;\n if(leadingZeros){\n // -009 => -9\n return (n === parsedStr) || (sign+n === parsedStr) ? num : str\n }else {\n // +9\n return (n === parsedStr) || (n === sign+parsedStr) ? num : str\n }\n }\n }else{ //non-numeric string\n return str;\n }\n }\n}\n\nconst eNotationRegx = /^([-+])?(0*)(\\d*(\\.\\d*)?[eE][-\\+]?\\d+)$/;\nfunction resolveEnotation(str,trimmedStr,options){\n if(!options.eNotation) return str;\n const notation = trimmedStr.match(eNotationRegx); \n if(notation){\n let sign = notation[1] || \"\";\n const eChar = notation[3].indexOf(\"e\") === -1 ? \"E\" : \"e\";\n const leadingZeros = notation[2];\n const eAdjacentToLeadingZeros = sign ? // 0E.\n str[leadingZeros.length+1] === eChar \n : str[leadingZeros.length] === eChar;\n\n if(leadingZeros.length > 1 && eAdjacentToLeadingZeros) return str;\n else if(leadingZeros.length === 1 \n && (notation[3].startsWith(`.${eChar}`) || notation[3][0] === eChar)){\n return Number(trimmedStr);\n }else if(options.leadingZeros && !eAdjacentToLeadingZeros){ //accept with leading zeros\n //remove leading 0s\n trimmedStr = (notation[1] || \"\") + notation[3];\n return Number(trimmedStr);\n }else return str;\n }else{\n return str;\n }\n}\n\n/**\n * \n * @param {string} numStr without leading zeros\n * @returns \n */\nfunction trimZeros(numStr){\n if(numStr && numStr.indexOf(\".\") !== -1){//float\n numStr = numStr.replace(/0+$/, \"\"); //remove ending zeros\n if(numStr === \".\") numStr = \"0\";\n else if(numStr[0] === \".\") numStr = \"0\"+numStr;\n else if(numStr[numStr.length-1] === \".\") numStr = numStr.substring(0,numStr.length-1);\n return numStr;\n }\n return numStr;\n}\n\nfunction parse_int(numStr, base){\n //polyfill\n if(parseInt) return parseInt(numStr, base);\n else if(Number.parseInt) return Number.parseInt(numStr, base);\n else if(window && window.parseInt) return window.parseInt(numStr, base);\n else throw new Error(\"parseInt, Number.parseInt, window.parseInt are not supported\")\n}","'use strict';\n///@ts-check\n\nimport {getAllMatches, isExist} from '../util.js';\nimport xmlNode from './xmlNode.js';\nimport DocTypeReader from './DocTypeReader.js';\nimport toNumber from \"strnum\";\nimport getIgnoreAttributesFn from \"../ignoreAttributes.js\";\n\n// const regx =\n// '<((!\\\\[CDATA\\\\[([\\\\s\\\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\\\/)(NAME)\\\\s*>))([^<]*)'\n// .replace(/NAME/g, util.nameRegexp);\n\n//const tagsRegx = new RegExp(\"<(\\\\/?[\\\\w:\\\\-\\._]+)([^>]*)>(\\\\s*\"+cdataRegx+\")*([^<]+)?\",\"g\");\n//const tagsRegx = new RegExp(\"<(\\\\/?)((\\\\w*:)?([\\\\w:\\\\-\\._]+))([^>]*)>([^<]*)(\"+cdataRegx+\"([^<]*))*([^<]+)?\",\"g\");\n\nexport default class OrderedObjParser{\n constructor(options){\n this.options = options;\n this.currentNode = null;\n this.tagsNodeStack = [];\n this.docTypeEntities = {};\n this.lastEntities = {\n \"apos\" : { regex: /&(apos|#39|#x27);/g, val : \"'\"},\n \"gt\" : { regex: /&(gt|#62|#x3E);/g, val : \">\"},\n \"lt\" : { regex: /&(lt|#60|#x3C);/g, val : \"<\"},\n \"quot\" : { regex: /&(quot|#34|#x22);/g, val : \"\\\"\"},\n };\n this.ampEntity = { regex: /&(amp|#38|#x26);/g, val : \"&\"};\n this.htmlEntities = {\n \"space\": { regex: /&(nbsp|#160);/g, val: \" \" },\n // \"lt\" : { regex: /&(lt|#60);/g, val: \"<\" },\n // \"gt\" : { regex: /&(gt|#62);/g, val: \">\" },\n // \"amp\" : { regex: /&(amp|#38);/g, val: \"&\" },\n // \"quot\" : { regex: /&(quot|#34);/g, val: \"\\\"\" },\n // \"apos\" : { regex: /&(apos|#39);/g, val: \"'\" },\n \"cent\" : { regex: /&(cent|#162);/g, val: \"¢\" },\n \"pound\" : { regex: /&(pound|#163);/g, val: \"£\" },\n \"yen\" : { regex: /&(yen|#165);/g, val: \"¥\" },\n \"euro\" : { regex: /&(euro|#8364);/g, val: \"€\" },\n \"copyright\" : { regex: /&(copy|#169);/g, val: \"©\" },\n \"reg\" : { regex: /&(reg|#174);/g, val: \"®\" },\n \"inr\" : { regex: /&(inr|#8377);/g, val: \"₹\" },\n \"num_dec\": { regex: /([0-9]{1,7});/g, val : (_, str) => fromCodePoint(str, 10, \"\") },\n \"num_hex\": { regex: /([0-9a-fA-F]{1,6});/g, val : (_, str) => fromCodePoint(str, 16, \"\") },\n };\n this.addExternalEntities = addExternalEntities;\n this.parseXml = parseXml;\n this.parseTextData = parseTextData;\n this.resolveNameSpace = resolveNameSpace;\n this.buildAttributesMap = buildAttributesMap;\n this.isItStopNode = isItStopNode;\n this.replaceEntitiesValue = replaceEntitiesValue;\n this.readStopNodeData = readStopNodeData;\n this.saveTextToParentTag = saveTextToParentTag;\n this.addChild = addChild;\n this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)\n\n if(this.options.stopNodes && this.options.stopNodes.length > 0){\n this.stopNodesExact = new Set();\n this.stopNodesWildcard = new Set();\n for(let i = 0; i < this.options.stopNodes.length; i++){\n const stopNodeExp = this.options.stopNodes[i];\n if(typeof stopNodeExp !== 'string') continue;\n if(stopNodeExp.startsWith(\"*.\")){\n this.stopNodesWildcard.add(stopNodeExp.substring(2));\n }else{\n this.stopNodesExact.add(stopNodeExp);\n }\n }\n }\n }\n\n}\n\nfunction addExternalEntities(externalEntities){\n const entKeys = Object.keys(externalEntities);\n for (let i = 0; i < entKeys.length; i++) {\n const ent = entKeys[i];\n const escaped = ent.replace(/[.\\-+*:]/g, '\\\\.');\n this.lastEntities[ent] = {\n regex: new RegExp(\"&\"+escaped+\";\",\"g\"),\n val : externalEntities[ent]\n }\n }\n}\n\n/**\n * @param {string} val\n * @param {string} tagName\n * @param {string} jPath\n * @param {boolean} dontTrim\n * @param {boolean} hasAttributes\n * @param {boolean} isLeafNode\n * @param {boolean} escapeEntities\n */\nfunction parseTextData(val, tagName, jPath, dontTrim, hasAttributes, isLeafNode, escapeEntities) {\n if (val !== undefined) {\n if (this.options.trimValues && !dontTrim) {\n val = val.trim();\n }\n if(val.length > 0){\n if(!escapeEntities) val = this.replaceEntitiesValue(val);\n \n const newval = this.options.tagValueProcessor(tagName, val, jPath, hasAttributes, isLeafNode);\n if(newval === null || newval === undefined){\n //don't parse\n return val;\n }else if(typeof newval !== typeof val || newval !== val){\n //overwrite\n return newval;\n }else if(this.options.trimValues){\n return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n }else{\n const trimmedVal = val.trim();\n if(trimmedVal === val){\n return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n }else{\n return val;\n }\n }\n }\n }\n}\n\nfunction resolveNameSpace(tagname) {\n if (this.options.removeNSPrefix) {\n const tags = tagname.split(':');\n const prefix = tagname.charAt(0) === '/' ? '/' : '';\n if (tags[0] === 'xmlns') {\n return '';\n }\n if (tags.length === 2) {\n tagname = prefix + tags[1];\n }\n }\n return tagname;\n}\n\n//TODO: change regex to capture NS\n//const attrsRegx = new RegExp(\"([\\\\w\\\\-\\\\.\\\\:]+)\\\\s*=\\\\s*(['\\\"])((.|\\n)*?)\\\\2\",\"gm\");\nconst attrsRegx = new RegExp('([^\\\\s=]+)\\\\s*(=\\\\s*([\\'\"])([\\\\s\\\\S]*?)\\\\3)?', 'gm');\n\nfunction buildAttributesMap(attrStr, jPath) {\n if (this.options.ignoreAttributes !== true && typeof attrStr === 'string') {\n // attrStr = attrStr.replace(/\\r?\\n/g, ' ');\n //attrStr = attrStr || attrStr.trim();\n\n const matches = getAllMatches(attrStr, attrsRegx);\n const len = matches.length; //don't make it inline\n const attrs = {};\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n if (this.ignoreAttributesFn(attrName, jPath)) {\n continue\n }\n let oldVal = matches[i][4];\n let aName = this.options.attributeNamePrefix + attrName;\n if (attrName.length) {\n if (this.options.transformAttributeName) {\n aName = this.options.transformAttributeName(aName);\n }\n if(aName === \"__proto__\") aName = \"#__proto__\";\n if (oldVal !== undefined) {\n if (this.options.trimValues) {\n oldVal = oldVal.trim();\n }\n oldVal = this.replaceEntitiesValue(oldVal);\n const newVal = this.options.attributeValueProcessor(attrName, oldVal, jPath);\n if(newVal === null || newVal === undefined){\n //don't parse\n attrs[aName] = oldVal;\n }else if(typeof newVal !== typeof oldVal || newVal !== oldVal){\n //overwrite\n attrs[aName] = newVal;\n }else{\n //parse\n attrs[aName] = parseValue(\n oldVal,\n this.options.parseAttributeValue,\n this.options.numberParseOptions\n );\n }\n } else if (this.options.allowBooleanAttributes) {\n attrs[aName] = true;\n }\n }\n }\n if (!Object.keys(attrs).length) {\n return;\n }\n if (this.options.attributesGroupName) {\n const attrCollection = {};\n attrCollection[this.options.attributesGroupName] = attrs;\n return attrCollection;\n }\n return attrs\n }\n}\n\nconst parseXml = function(xmlData) {\n xmlData = xmlData.replace(/\\r\\n?/g, \"\\n\"); //TODO: remove this line\n const xmlObj = new xmlNode('!xml');\n let currentNode = xmlObj;\n let textData = \"\";\n let jPath = \"\";\n const docTypeReader = new DocTypeReader(this.options.processEntities);\n for(let i=0; i< xmlData.length; i++){//for each char in XML data\n const ch = xmlData[i];\n if(ch === '<'){\n // const nextIndex = i+1;\n // const _2ndChar = xmlData[nextIndex];\n if( xmlData[i+1] === '/') {//Closing Tag\n const closeIndex = findClosingIndex(xmlData, \">\", i, \"Closing Tag is not closed.\")\n let tagName = xmlData.substring(i+2,closeIndex).trim();\n\n if(this.options.removeNSPrefix){\n const colonIndex = tagName.indexOf(\":\");\n if(colonIndex !== -1){\n tagName = tagName.substr(colonIndex+1);\n }\n }\n\n if(this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n\n if(currentNode){\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n }\n\n //check if last tag of nested tag was unpaired tag\n const lastTagName = jPath.substring(jPath.lastIndexOf(\".\")+1);\n if(tagName && this.options.unpairedTags.indexOf(tagName) !== -1 ){\n throw new Error(`Unpaired tag can not be used as closing tag: ${tagName}>`);\n }\n let propIndex = 0\n if(lastTagName && this.options.unpairedTags.indexOf(lastTagName) !== -1 ){\n propIndex = jPath.lastIndexOf('.', jPath.lastIndexOf('.')-1)\n this.tagsNodeStack.pop();\n }else{\n propIndex = jPath.lastIndexOf(\".\");\n }\n jPath = jPath.substring(0, propIndex);\n\n currentNode = this.tagsNodeStack.pop();//avoid recursion, set the parent tag scope\n textData = \"\";\n i = closeIndex;\n } else if( xmlData[i+1] === '?') {\n\n let tagData = readTagExp(xmlData,i, false, \"?>\");\n if(!tagData) throw new Error(\"Pi Tag is not closed.\");\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n if( (this.options.ignoreDeclaration && tagData.tagName === \"?xml\") || this.options.ignorePiTags){\n //do nothing\n }else{\n \n const childNode = new xmlNode(tagData.tagName);\n childNode.add(this.options.textNodeName, \"\");\n \n if(tagData.tagName !== tagData.tagExp && tagData.attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagData.tagExp, jPath);\n }\n this.addChild(currentNode, childNode, jPath, i);\n }\n\n\n i = tagData.closeIndex + 1;\n } else if(xmlData.substr(i + 1, 3) === '!--') {\n const endIndex = findClosingIndex(xmlData, \"-->\", i+4, \"Comment is not closed.\")\n if(this.options.commentPropName){\n const comment = xmlData.substring(i + 4, endIndex - 2);\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n currentNode.add(this.options.commentPropName, [ { [this.options.textNodeName] : comment } ]);\n }\n i = endIndex;\n } else if( xmlData.substr(i + 1, 2) === '!D') {\n const result = docTypeReader.readDocType(xmlData, i);\n this.docTypeEntities = result.entities;\n i = result.i;\n }else if(xmlData.substr(i + 1, 2) === '![') {\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"CDATA is not closed.\") - 2;\n const tagExp = xmlData.substring(i + 9,closeIndex);\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n let val = this.parseTextData(tagExp, currentNode.tagname, jPath, true, false, true, true);\n if(val == undefined) val = \"\";\n\n //cdata should be set even if it is 0 length string\n if(this.options.cdataPropName){\n currentNode.add(this.options.cdataPropName, [ { [this.options.textNodeName] : tagExp } ]);\n }else{\n currentNode.add(this.options.textNodeName, val);\n }\n \n i = closeIndex + 2;\n }else {//Opening tag\n let result = readTagExp(xmlData,i, this.options.removeNSPrefix);\n let tagName= result.tagName;\n const rawTagName = result.rawTagName;\n let tagExp = result.tagExp;\n let attrExpPresent = result.attrExpPresent;\n let closeIndex = result.closeIndex;\n\n if (this.options.transformTagName) {\n //console.log(tagExp, tagName)\n const newTagName = this.options.transformTagName(tagName);\n if(tagExp === tagName) {\n tagExp = newTagName\n }\n tagName = newTagName;\n }\n \n //save text as child node\n if (currentNode && textData) {\n if(currentNode.tagname !== '!xml'){\n //when nested tag is found\n textData = this.saveTextToParentTag(textData, currentNode, jPath, false);\n }\n }\n\n //check if last tag was unpaired tag\n const lastTag = currentNode;\n if(lastTag && this.options.unpairedTags.indexOf(lastTag.tagname) !== -1 ){\n currentNode = this.tagsNodeStack.pop();\n jPath = jPath.substring(0, jPath.lastIndexOf(\".\"));\n }\n if(tagName !== xmlObj.tagname){\n jPath += jPath ? \".\" + tagName : tagName;\n }\n const startIndex = i;\n if (this.isItStopNode(this.stopNodesExact, this.stopNodesWildcard, jPath, tagName)) {\n let tagContent = \"\";\n //self-closing tag\n if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){\n if(tagName[tagName.length - 1] === \"/\"){ //remove trailing '/'\n tagName = tagName.substr(0, tagName.length - 1);\n jPath = jPath.substr(0, jPath.length - 1);\n tagExp = tagName;\n }else{\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n i = result.closeIndex;\n }\n //unpaired tag\n else if(this.options.unpairedTags.indexOf(tagName) !== -1){\n \n i = result.closeIndex;\n }\n //normal tag\n else{\n //read until closing tag is found\n const result = this.readStopNodeData(xmlData, rawTagName, closeIndex + 1);\n if(!result) throw new Error(`Unexpected end of ${rawTagName}`);\n i = result.i;\n tagContent = result.tagContent;\n }\n\n const childNode = new xmlNode(tagName);\n\n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath\n );\n }\n if(tagContent) {\n tagContent = this.parseTextData(tagContent, tagName, jPath, true, attrExpPresent, true, true);\n }\n \n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n childNode.add(this.options.textNodeName, tagContent);\n \n this.addChild(currentNode, childNode, jPath, startIndex);\n }else{\n //selfClosing tag\n if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){\n if(tagName[tagName.length - 1] === \"/\"){ //remove trailing '/'\n tagName = tagName.substr(0, tagName.length - 1);\n jPath = jPath.substr(0, jPath.length - 1);\n tagExp = tagName;\n }else{\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n \n if(this.options.transformTagName) {\n const newTagName = this.options.transformTagName(tagName);\n if(tagExp === tagName) {\n tagExp = newTagName\n }\n tagName = newTagName;\n }\n\n const childNode = new xmlNode(tagName);\n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath);\n }\n this.addChild(currentNode, childNode, jPath, startIndex);\n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n }\n //opening tag\n else{\n const childNode = new xmlNode( tagName);\n this.tagsNodeStack.push(currentNode);\n \n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath);\n }\n this.addChild(currentNode, childNode, jPath, startIndex);\n currentNode = childNode;\n }\n textData = \"\";\n i = closeIndex;\n }\n }\n }else{\n textData += xmlData[i];\n }\n }\n return xmlObj.child;\n}\n\nfunction addChild(currentNode, childNode, jPath, startIndex){\n // unset startIndex if not requested\n if (!this.options.captureMetaData) startIndex = undefined;\n const result = this.options.updateTag(childNode.tagname, jPath, childNode[\":@\"])\n if(result === false){\n //do nothing\n } else if(typeof result === \"string\"){\n childNode.tagname = result\n currentNode.addChild(childNode, startIndex);\n }else{\n currentNode.addChild(childNode, startIndex);\n }\n}\n\nconst replaceEntitiesValue = function(val){\n\n if(this.options.processEntities){\n for(let entityName in this.docTypeEntities){\n const entity = this.docTypeEntities[entityName];\n val = val.replace( entity.regx, entity.val);\n }\n for(let entityName in this.lastEntities){\n const entity = this.lastEntities[entityName];\n val = val.replace( entity.regex, entity.val);\n }\n if(this.options.htmlEntities){\n for(let entityName in this.htmlEntities){\n const entity = this.htmlEntities[entityName];\n val = val.replace( entity.regex, entity.val);\n }\n }\n val = val.replace( this.ampEntity.regex, this.ampEntity.val);\n }\n return val;\n}\nfunction saveTextToParentTag(textData, currentNode, jPath, isLeafNode) {\n if (textData) { //store previously collected data as textNode\n if(isLeafNode === undefined) isLeafNode = currentNode.child.length === 0\n \n textData = this.parseTextData(textData,\n currentNode.tagname,\n jPath,\n false,\n currentNode[\":@\"] ? Object.keys(currentNode[\":@\"]).length !== 0 : false,\n isLeafNode);\n\n if (textData !== undefined && textData !== \"\")\n currentNode.add(this.options.textNodeName, textData);\n textData = \"\";\n }\n return textData;\n}\n\n//TODO: use jPath to simplify the logic\n/**\n * @param {Set} stopNodesExact\n * @param {Set} stopNodesWildcard\n * @param {string} jPath\n * @param {string} currentTagName\n */\nfunction isItStopNode(stopNodesExact, stopNodesWildcard, jPath, currentTagName){\n if(stopNodesWildcard && stopNodesWildcard.has(currentTagName)) return true;\n if(stopNodesExact && stopNodesExact.has(jPath)) return true;\n return false;\n}\n\n/**\n * Returns the tag Expression and where it is ending handling single-double quotes situation\n * @param {string} xmlData \n * @param {number} i starting index\n * @returns \n */\nfunction tagExpWithClosingIndex(xmlData, i, closingChar = \">\"){\n let attrBoundary;\n let tagExp = \"\";\n for (let index = i; index < xmlData.length; index++) {\n let ch = xmlData[index];\n if (attrBoundary) {\n if (ch === attrBoundary) attrBoundary = \"\";//reset\n } else if (ch === '\"' || ch === \"'\") {\n attrBoundary = ch;\n } else if (ch === closingChar[0]) {\n if(closingChar[1]){\n if(xmlData[index + 1] === closingChar[1]){\n return {\n data: tagExp,\n index: index\n }\n }\n }else{\n return {\n data: tagExp,\n index: index\n }\n }\n } else if (ch === '\\t') {\n ch = \" \"\n }\n tagExp += ch;\n }\n}\n\nfunction findClosingIndex(xmlData, str, i, errMsg){\n const closingIndex = xmlData.indexOf(str, i);\n if(closingIndex === -1){\n throw new Error(errMsg)\n }else{\n return closingIndex + str.length - 1;\n }\n}\n\nfunction readTagExp(xmlData,i, removeNSPrefix, closingChar = \">\"){\n const result = tagExpWithClosingIndex(xmlData, i+1, closingChar);\n if(!result) return;\n let tagExp = result.data;\n const closeIndex = result.index;\n const separatorIndex = tagExp.search(/\\s/);\n let tagName = tagExp;\n let attrExpPresent = true;\n if(separatorIndex !== -1){//separate tag name and attributes expression\n tagName = tagExp.substring(0, separatorIndex);\n tagExp = tagExp.substring(separatorIndex + 1).trimStart();\n }\n\n const rawTagName = tagName;\n if(removeNSPrefix){\n const colonIndex = tagName.indexOf(\":\");\n if(colonIndex !== -1){\n tagName = tagName.substr(colonIndex+1);\n attrExpPresent = tagName !== result.data.substr(colonIndex + 1);\n }\n }\n\n return {\n tagName: tagName,\n tagExp: tagExp,\n closeIndex: closeIndex,\n attrExpPresent: attrExpPresent,\n rawTagName: rawTagName,\n }\n}\n/**\n * find paired tag for a stop node\n * @param {string} xmlData \n * @param {string} tagName \n * @param {number} i \n */\nfunction readStopNodeData(xmlData, tagName, i){\n const startIndex = i;\n // Starting at 1 since we already have an open tag\n let openTagCount = 1;\n\n for (; i < xmlData.length; i++) {\n if( xmlData[i] === \"<\"){ \n if (xmlData[i+1] === \"/\") {//close tag\n const closeIndex = findClosingIndex(xmlData, \">\", i, `${tagName} is not closed`);\n let closeTagName = xmlData.substring(i+2,closeIndex).trim();\n if(closeTagName === tagName){\n openTagCount--;\n if (openTagCount === 0) {\n return {\n tagContent: xmlData.substring(startIndex, i),\n i : closeIndex\n }\n }\n }\n i=closeIndex;\n } else if(xmlData[i+1] === '?') { \n const closeIndex = findClosingIndex(xmlData, \"?>\", i+1, \"StopNode is not closed.\")\n i=closeIndex;\n } else if(xmlData.substr(i + 1, 3) === '!--') { \n const closeIndex = findClosingIndex(xmlData, \"-->\", i+3, \"StopNode is not closed.\")\n i=closeIndex;\n } else if(xmlData.substr(i + 1, 2) === '![') { \n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"StopNode is not closed.\") - 2;\n i=closeIndex;\n } else {\n const tagData = readTagExp(xmlData, i, '>')\n\n if (tagData) {\n const openTagName = tagData && tagData.tagName;\n if (openTagName === tagName && tagData.tagExp[tagData.tagExp.length-1] !== \"/\") {\n openTagCount++;\n }\n i=tagData.closeIndex;\n }\n }\n }\n }//end for loop\n}\n\nfunction parseValue(val, shouldParse, options) {\n if (shouldParse && typeof val === 'string') {\n //console.log(options)\n const newval = val.trim();\n if(newval === 'true' ) return true;\n else if(newval === 'false' ) return false;\n else return toNumber(val, options);\n } else {\n if (isExist(val)) {\n return val;\n } else {\n return '';\n }\n }\n}\n\nfunction fromCodePoint(str, base, prefix){\n const codePoint = Number.parseInt(str, base);\n\n if (codePoint >= 0 && codePoint <= 0x10FFFF) {\n return String.fromCodePoint(codePoint);\n } else {\n return prefix +str + \";\";\n }\n}","export default function getIgnoreAttributesFn(ignoreAttributes) {\n if (typeof ignoreAttributes === 'function') {\n return ignoreAttributes\n }\n if (Array.isArray(ignoreAttributes)) {\n return (attrName) => {\n for (const pattern of ignoreAttributes) {\n if (typeof pattern === 'string' && attrName === pattern) {\n return true\n }\n if (pattern instanceof RegExp && pattern.test(attrName)) {\n return true\n }\n }\n }\n }\n return () => false\n}","'use strict';\n\nimport XmlNode from './xmlNode.js';\n\nconst METADATA_SYMBOL = XmlNode.getMetaDataSymbol();\n\n/**\n * \n * @param {array} node \n * @param {any} options \n * @returns \n */\nexport default function prettify(node, options){\n return compress( node, options);\n}\n\n/**\n * \n * @param {array} arr \n * @param {object} options \n * @param {string} jPath \n * @returns object\n */\nfunction compress(arr, options, jPath){\n let text;\n const compressedObj = {};\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const property = propName(tagObj);\n let newJpath = \"\";\n if(jPath === undefined) newJpath = property;\n else newJpath = jPath + \".\" + property;\n\n if(property === options.textNodeName){\n if(text === undefined) text = tagObj[property];\n else text += \"\" + tagObj[property];\n }else if(property === undefined){\n continue;\n }else if(tagObj[property]){\n \n let val = compress(tagObj[property], options, newJpath);\n const isLeaf = isLeafTag(val, options);\n if (tagObj[METADATA_SYMBOL] !== undefined) {\n val[METADATA_SYMBOL] = tagObj[METADATA_SYMBOL]; // copy over metadata\n }\n\n if(tagObj[\":@\"]){\n assignAttributes( val, tagObj[\":@\"], newJpath, options);\n }else if(Object.keys(val).length === 1 && val[options.textNodeName] !== undefined && !options.alwaysCreateTextNode){\n val = val[options.textNodeName];\n }else if(Object.keys(val).length === 0){\n if(options.alwaysCreateTextNode) val[options.textNodeName] = \"\";\n else val = \"\";\n }\n\n if(compressedObj[property] !== undefined && compressedObj.hasOwnProperty(property)) {\n if(!Array.isArray(compressedObj[property])) {\n compressedObj[property] = [ compressedObj[property] ];\n }\n compressedObj[property].push(val);\n }else{\n //TODO: if a node is not an array, then check if it should be an array\n //also determine if it is a leaf node\n if (options.isArray(property, newJpath, isLeaf )) {\n compressedObj[property] = [val];\n }else{\n compressedObj[property] = val;\n }\n }\n }\n \n }\n // if(text && text.length > 0) compressedObj[options.textNodeName] = text;\n if(typeof text === \"string\"){\n if(text.length > 0) compressedObj[options.textNodeName] = text;\n }else if(text !== undefined) compressedObj[options.textNodeName] = text;\n return compressedObj;\n}\n\nfunction propName(obj){\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if(key !== \":@\") return key;\n }\n}\n\nfunction assignAttributes(obj, attrMap, jpath, options){\n if (attrMap) {\n const keys = Object.keys(attrMap);\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n const atrrName = keys[i];\n if (options.isArray(atrrName, jpath + \".\" + atrrName, true, true)) {\n obj[atrrName] = [ attrMap[atrrName] ];\n } else {\n obj[atrrName] = attrMap[atrrName];\n }\n }\n }\n}\n\nfunction isLeafTag(obj, options){\n const { textNodeName } = options;\n const propCount = Object.keys(obj).length;\n \n if (propCount === 0) {\n return true;\n }\n\n if (\n propCount === 1 &&\n (obj[textNodeName] || typeof obj[textNodeName] === \"boolean\" || obj[textNodeName] === 0)\n ) {\n return true;\n }\n\n return false;\n}\n","'use strict';\n\nimport {getAllMatches, isName} from './util.js';\n\nconst defaultOptions = {\n allowBooleanAttributes: false, //A tag can have attributes without any value\n unpairedTags: []\n};\n\n//const tagsPattern = new RegExp(\"<\\\\/?([\\\\w:\\\\-_\\.]+)\\\\s*\\/?>\",\"g\");\nexport function validate(xmlData, options) {\n options = Object.assign({}, defaultOptions, options);\n\n //xmlData = xmlData.replace(/(\\r\\n|\\n|\\r)/gm,\"\");//make it single line\n //xmlData = xmlData.replace(/(^\\s*<\\?xml.*?\\?>)/g,\"\");//Remove XML starting tag\n //xmlData = xmlData.replace(/()/g,\"\");//Remove DOCTYPE\n const tags = [];\n let tagFound = false;\n\n //indicates that the root tag has been closed (aka. depth 0 has been reached)\n let reachedRoot = false;\n\n if (xmlData[0] === '\\ufeff') {\n // check for byte order mark (BOM)\n xmlData = xmlData.substr(1);\n }\n \n for (let i = 0; i < xmlData.length; i++) {\n\n if (xmlData[i] === '<' && xmlData[i+1] === '?') {\n i+=2;\n i = readPI(xmlData,i);\n if (i.err) return i;\n }else if (xmlData[i] === '<') {\n //starting of tag\n //read until you reach to '>' avoiding any '>' in attribute value\n let tagStartPos = i;\n i++;\n \n if (xmlData[i] === '!') {\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else {\n let closingTag = false;\n if (xmlData[i] === '/') {\n //closing tag\n closingTag = true;\n i++;\n }\n //read tagname\n let tagName = '';\n for (; i < xmlData.length &&\n xmlData[i] !== '>' &&\n xmlData[i] !== ' ' &&\n xmlData[i] !== '\\t' &&\n xmlData[i] !== '\\n' &&\n xmlData[i] !== '\\r'; i++\n ) {\n tagName += xmlData[i];\n }\n tagName = tagName.trim();\n //console.log(tagName);\n\n if (tagName[tagName.length - 1] === '/') {\n //self closing tag without attributes\n tagName = tagName.substring(0, tagName.length - 1);\n //continue;\n i--;\n }\n if (!validateTagName(tagName)) {\n let msg;\n if (tagName.trim().length === 0) {\n msg = \"Invalid space after '<'.\";\n } else {\n msg = \"Tag '\"+tagName+\"' is an invalid name.\";\n }\n return getErrorObject('InvalidTag', msg, getLineNumberForPosition(xmlData, i));\n }\n\n const result = readAttributeStr(xmlData, i);\n if (result === false) {\n return getErrorObject('InvalidAttr', \"Attributes for '\"+tagName+\"' have open quote.\", getLineNumberForPosition(xmlData, i));\n }\n let attrStr = result.value;\n i = result.index;\n\n if (attrStr[attrStr.length - 1] === '/') {\n //self closing tag\n const attrStrStart = i - attrStr.length;\n attrStr = attrStr.substring(0, attrStr.length - 1);\n const isValid = validateAttributeString(attrStr, options);\n if (isValid === true) {\n tagFound = true;\n //continue; //text may presents after self closing tag\n } else {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, attrStrStart + isValid.err.line));\n }\n } else if (closingTag) {\n if (!result.tagClosed) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' doesn't have proper closing.\", getLineNumberForPosition(xmlData, i));\n } else if (attrStr.trim().length > 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' can't have attributes or invalid starting.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else if (tags.length === 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' has not been opened.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else {\n const otg = tags.pop();\n if (tagName !== otg.tagName) {\n let openPos = getLineNumberForPosition(xmlData, otg.tagStartPos);\n return getErrorObject('InvalidTag',\n \"Expected closing tag '\"+otg.tagName+\"' (opened in line \"+openPos.line+\", col \"+openPos.col+\") instead of closing tag '\"+tagName+\"'.\",\n getLineNumberForPosition(xmlData, tagStartPos));\n }\n\n //when there are no more tags, we reached the root level.\n if (tags.length == 0) {\n reachedRoot = true;\n }\n }\n } else {\n const isValid = validateAttributeString(attrStr, options);\n if (isValid !== true) {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, i - attrStr.length + isValid.err.line));\n }\n\n //if the root level has been reached before ...\n if (reachedRoot === true) {\n return getErrorObject('InvalidXml', 'Multiple possible root nodes found.', getLineNumberForPosition(xmlData, i));\n } else if(options.unpairedTags.indexOf(tagName) !== -1){\n //don't push into stack\n } else {\n tags.push({tagName, tagStartPos});\n }\n tagFound = true;\n }\n\n //skip tag text value\n //It may include comments and CDATA value\n for (i++; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n if (xmlData[i + 1] === '!') {\n //comment or CADATA\n i++;\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else if (xmlData[i+1] === '?') {\n i = readPI(xmlData, ++i);\n if (i.err) return i;\n } else{\n break;\n }\n } else if (xmlData[i] === '&') {\n const afterAmp = validateAmpersand(xmlData, i);\n if (afterAmp == -1)\n return getErrorObject('InvalidChar', \"char '&' is not expected.\", getLineNumberForPosition(xmlData, i));\n i = afterAmp;\n }else{\n if (reachedRoot === true && !isWhiteSpace(xmlData[i])) {\n return getErrorObject('InvalidXml', \"Extra text at the end\", getLineNumberForPosition(xmlData, i));\n }\n }\n } //end of reading tag text value\n if (xmlData[i] === '<') {\n i--;\n }\n }\n } else {\n if ( isWhiteSpace(xmlData[i])) {\n continue;\n }\n return getErrorObject('InvalidChar', \"char '\"+xmlData[i]+\"' is not expected.\", getLineNumberForPosition(xmlData, i));\n }\n }\n\n if (!tagFound) {\n return getErrorObject('InvalidXml', 'Start tag expected.', 1);\n }else if (tags.length == 1) {\n return getErrorObject('InvalidTag', \"Unclosed tag '\"+tags[0].tagName+\"'.\", getLineNumberForPosition(xmlData, tags[0].tagStartPos));\n }else if (tags.length > 0) {\n return getErrorObject('InvalidXml', \"Invalid '\"+\n JSON.stringify(tags.map(t => t.tagName), null, 4).replace(/\\r?\\n/g, '')+\n \"' found.\", {line: 1, col: 1});\n }\n\n return true;\n};\n\nfunction isWhiteSpace(char){\n return char === ' ' || char === '\\t' || char === '\\n' || char === '\\r';\n}\n/**\n * Read Processing insstructions and skip\n * @param {*} xmlData\n * @param {*} i\n */\nfunction readPI(xmlData, i) {\n const start = i;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] == '?' || xmlData[i] == ' ') {\n //tagname\n const tagname = xmlData.substr(start, i - start);\n if (i > 5 && tagname === 'xml') {\n return getErrorObject('InvalidXml', 'XML declaration allowed only at the start of the document.', getLineNumberForPosition(xmlData, i));\n } else if (xmlData[i] == '?' && xmlData[i + 1] == '>') {\n //check if valid attribut string\n i++;\n break;\n } else {\n continue;\n }\n }\n }\n return i;\n}\n\nfunction readCommentAndCDATA(xmlData, i) {\n if (xmlData.length > i + 5 && xmlData[i + 1] === '-' && xmlData[i + 2] === '-') {\n //comment\n for (i += 3; i < xmlData.length; i++) {\n if (xmlData[i] === '-' && xmlData[i + 1] === '-' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n } else if (\n xmlData.length > i + 8 &&\n xmlData[i + 1] === 'D' &&\n xmlData[i + 2] === 'O' &&\n xmlData[i + 3] === 'C' &&\n xmlData[i + 4] === 'T' &&\n xmlData[i + 5] === 'Y' &&\n xmlData[i + 6] === 'P' &&\n xmlData[i + 7] === 'E'\n ) {\n let angleBracketsCount = 1;\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n angleBracketsCount++;\n } else if (xmlData[i] === '>') {\n angleBracketsCount--;\n if (angleBracketsCount === 0) {\n break;\n }\n }\n }\n } else if (\n xmlData.length > i + 9 &&\n xmlData[i + 1] === '[' &&\n xmlData[i + 2] === 'C' &&\n xmlData[i + 3] === 'D' &&\n xmlData[i + 4] === 'A' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'A' &&\n xmlData[i + 7] === '['\n ) {\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === ']' && xmlData[i + 1] === ']' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n }\n\n return i;\n}\n\nconst doubleQuote = '\"';\nconst singleQuote = \"'\";\n\n/**\n * Keep reading xmlData until '<' is found outside the attribute value.\n * @param {string} xmlData\n * @param {number} i\n */\nfunction readAttributeStr(xmlData, i) {\n let attrStr = '';\n let startChar = '';\n let tagClosed = false;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === doubleQuote || xmlData[i] === singleQuote) {\n if (startChar === '') {\n startChar = xmlData[i];\n } else if (startChar !== xmlData[i]) {\n //if vaue is enclosed with double quote then single quotes are allowed inside the value and vice versa\n } else {\n startChar = '';\n }\n } else if (xmlData[i] === '>') {\n if (startChar === '') {\n tagClosed = true;\n break;\n }\n }\n attrStr += xmlData[i];\n }\n if (startChar !== '') {\n return false;\n }\n\n return {\n value: attrStr,\n index: i,\n tagClosed: tagClosed\n };\n}\n\n/**\n * Select all the attributes whether valid or invalid.\n */\nconst validAttrStrRegxp = new RegExp('(\\\\s*)([^\\\\s=]+)(\\\\s*=)?(\\\\s*([\\'\"])(([\\\\s\\\\S])*?)\\\\5)?', 'g');\n\n//attr, =\"sd\", a=\"amit's\", a=\"sd\"b=\"saf\", ab cd=\"\"\n\nfunction validateAttributeString(attrStr, options) {\n //console.log(\"start:\"+attrStr+\":end\");\n\n //if(attrStr.trim().length === 0) return true; //empty string\n\n const matches = getAllMatches(attrStr, validAttrStrRegxp);\n const attrNames = {};\n\n for (let i = 0; i < matches.length; i++) {\n if (matches[i][1].length === 0) {\n //nospace before attribute name: a=\"sd\"b=\"saf\"\n return getErrorObject('InvalidAttr', \"Attribute '\"+matches[i][2]+\"' has no space in starting.\", getPositionFromMatch(matches[i]))\n } else if (matches[i][3] !== undefined && matches[i][4] === undefined) {\n return getErrorObject('InvalidAttr', \"Attribute '\"+matches[i][2]+\"' is without value.\", getPositionFromMatch(matches[i]));\n } else if (matches[i][3] === undefined && !options.allowBooleanAttributes) {\n //independent attribute: ab\n return getErrorObject('InvalidAttr', \"boolean attribute '\"+matches[i][2]+\"' is not allowed.\", getPositionFromMatch(matches[i]));\n }\n /* else if(matches[i][6] === undefined){//attribute without value: ab=\n return { err: { code:\"InvalidAttr\",msg:\"attribute \" + matches[i][2] + \" has no value assigned.\"}};\n } */\n const attrName = matches[i][2];\n if (!validateAttrName(attrName)) {\n return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is an invalid name.\", getPositionFromMatch(matches[i]));\n }\n if (!attrNames.hasOwnProperty(attrName)) {\n //check for duplicate attribute.\n attrNames[attrName] = 1;\n } else {\n return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is repeated.\", getPositionFromMatch(matches[i]));\n }\n }\n\n return true;\n}\n\nfunction validateNumberAmpersand(xmlData, i) {\n let re = /\\d/;\n if (xmlData[i] === 'x') {\n i++;\n re = /[\\da-fA-F]/;\n }\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === ';')\n return i;\n if (!xmlData[i].match(re))\n break;\n }\n return -1;\n}\n\nfunction validateAmpersand(xmlData, i) {\n // https://www.w3.org/TR/xml/#dt-charref\n i++;\n if (xmlData[i] === ';')\n return -1;\n if (xmlData[i] === '#') {\n i++;\n return validateNumberAmpersand(xmlData, i);\n }\n let count = 0;\n for (; i < xmlData.length; i++, count++) {\n if (xmlData[i].match(/\\w/) && count < 20)\n continue;\n if (xmlData[i] === ';')\n break;\n return -1;\n }\n return i;\n}\n\nfunction getErrorObject(code, message, lineNumber) {\n return {\n err: {\n code: code,\n msg: message,\n line: lineNumber.line || lineNumber,\n col: lineNumber.col,\n },\n };\n}\n\nfunction validateAttrName(attrName) {\n return isName(attrName);\n}\n\n// const startsWithXML = /^xml/i;\n\nfunction validateTagName(tagname) {\n return isName(tagname) /* && !tagname.match(startsWithXML) */;\n}\n\n//this function returns the line number for the character at the given index\nfunction getLineNumberForPosition(xmlData, index) {\n const lines = xmlData.substring(0, index).split(/\\r?\\n/);\n return {\n line: lines.length,\n\n // column number is last line's length + 1, because column numbering starts at 1:\n col: lines[lines.length - 1].length + 1\n };\n}\n\n//this function returns the position of the first character of match within attrStr\nfunction getPositionFromMatch(match) {\n return match.startIndex + match[1].length;\n}\n","import { buildOptions} from './OptionsBuilder.js';\nimport OrderedObjParser from './OrderedObjParser.js';\nimport prettify from './node2json.js';\nimport {validate} from \"../validator.js\";\nimport XmlNode from './xmlNode.js';\n\nexport default class XMLParser{\n \n constructor(options){\n this.externalEntities = {};\n this.options = buildOptions(options);\n \n }\n /**\n * Parse XML dats to JS object \n * @param {string|Uint8Array} xmlData \n * @param {boolean|Object} validationOption \n */\n parse(xmlData,validationOption){\n if(typeof xmlData !== \"string\" && xmlData.toString){\n xmlData = xmlData.toString();\n }else if(typeof xmlData !== \"string\"){\n throw new Error(\"XML data is accepted in String or Bytes[] form.\")\n }\n \n if( validationOption){\n if(validationOption === true) validationOption = {}; //validate with default options\n \n const result = validate(xmlData, validationOption);\n if (result !== true) {\n throw Error( `${result.err.msg}:${result.err.line}:${result.err.col}` )\n }\n }\n const orderedObjParser = new OrderedObjParser(this.options);\n orderedObjParser.addExternalEntities(this.externalEntities);\n const orderedResult = orderedObjParser.parseXml(xmlData);\n if(this.options.preserveOrder || orderedResult === undefined) return orderedResult;\n else return prettify(orderedResult, this.options);\n }\n\n /**\n * Add Entity which is not by default supported by this library\n * @param {string} key \n * @param {string} value \n */\n addEntity(key, value){\n if(value.indexOf(\"&\") !== -1){\n throw new Error(\"Entity value can't have '&'\")\n }else if(key.indexOf(\"&\") !== -1 || key.indexOf(\";\") !== -1){\n throw new Error(\"An entity must be set without '&' and ';'. Eg. use '#xD' for '
'\")\n }else if(value === \"&\"){\n throw new Error(\"An entity with value '&' is not permitted\");\n }else{\n this.externalEntities[key] = value;\n }\n }\n\n /**\n * Returns a Symbol that can be used to access the metadata\n * property on a node.\n * \n * If Symbol is not available in the environment, an ordinary property is used\n * and the name of the property is here returned.\n * \n * The XMLMetaData property is only present when `captureMetaData`\n * is true in the options.\n */\n static getMetaDataSymbol() {\n return XmlNode.getMetaDataSymbol();\n }\n}\n"],"names":["root","factory","exports","module","define","amd","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","defaultOptions","preserveOrder","attributeNamePrefix","attributesGroupName","textNodeName","ignoreAttributes","removeNSPrefix","allowBooleanAttributes","parseTagValue","parseAttributeValue","trimValues","cdataPropName","numberParseOptions","hex","leadingZeros","eNotation","tagValueProcessor","tagName","val","attributeValueProcessor","attrName","stopNodes","alwaysCreateTextNode","isArray","commentPropName","unpairedTags","processEntities","htmlEntities","ignoreDeclaration","ignorePiTags","transformTagName","transformAttributeName","updateTag","jPath","attrs","captureMetaData","nameStartChar","regexName","RegExp","getAllMatches","string","regex","matches","match","exec","allmatches","startIndex","lastIndex","length","len","index","push","METADATA_SYMBOL","isName","XmlNode","tagname","child","_proto","add","_this$child$push","addChild","node","_this$child$push2","_this$child$push3","keys","undefined","getMetaDataSymbol","DocTypeReader","suppressValidationErr","readDocType","xmlData","i","entities","Error","angleBracketsCount","hasBody","comment","hasSeq","entityName","_this$readEntityExp","readEntityExp","indexOf","escaped","replace","regx","readElementExp","readNotationExp","skipWhitespace","test","validateEntityName","substring","toUpperCase","_this$readIdentifierV","readIdentifierVal","notationName","identifierType","publicIdentifier","systemIdentifier","_this$readIdentifierV2","_this$readIdentifierV3","_this$readIdentifierV4","type","identifierVal","startChar","elementName","contentModel","trim","readAttlistExp","attributeName","attributeType","allowedNotations","notation","join","includes","defaultValue","_this$readIdentifierV5","data","seq","j","name","hexRegex","numRegex","consider","decimalPoint","eNotationRegx","OrderedObjParser","options","currentNode","tagsNodeStack","docTypeEntities","lastEntities","ampEntity","_","str","fromCodePoint","addExternalEntities","parseXml","parseTextData","resolveNameSpace","buildAttributesMap","isItStopNode","replaceEntitiesValue","readStopNodeData","saveTextToParentTag","ignoreAttributesFn","Array","_step","_iterator","_createForOfIteratorHelperLoose","done","pattern","stopNodesExact","Set","stopNodesWildcard","stopNodeExp","startsWith","externalEntities","entKeys","ent","dontTrim","hasAttributes","isLeafNode","escapeEntities","newval","parseValue","tags","split","prefix","charAt","attrsRegx","attrStr","oldVal","aName","newVal","attrCollection","xmlObj","xmlNode","textData","docTypeReader","closeIndex","findClosingIndex","colonIndex","substr","lastTagName","lastIndexOf","propIndex","pop","tagData","readTagExp","childNode","tagExp","attrExpPresent","endIndex","_ref","result","_ref2","rawTagName","newTagName","lastTag","tagContent","entity","currentTagName","has","errMsg","closingIndex","closingChar","attrBoundary","ch","tagExpWithClosingIndex","separatorIndex","search","trimStart","openTagCount","shouldParse","assign","trimmedStr","skipLike","numStr","parseInt","Number","window","parse_int","sign","eChar","eAdjacentToLeadingZeros","resolveEnotation","numTrimmedByZeros","decimalAdjacentToLeadingZeros","num","parsedStr","String","n","toNumber","base","codePoint","prettify","compress","arr","text","compressedObj","newJpath","tagObj","property","propName","isLeaf","isLeafTag","assignAttributes","attrMap","jpath","atrrName","propCount","isWhiteSpace","char","readPI","start","getErrorObject","getLineNumberForPosition","readCommentAndCDATA","readAttributeStr","tagClosed","validAttrStrRegxp","validateAttributeString","attrNames","getPositionFromMatch","validateAttrName","validateAmpersand","re","validateNumberAmpersand","count","code","message","lineNumber","err","msg","line","col","lines","XMLParser","buildOptions","parse","validationOption","toString","tagFound","reachedRoot","tagStartPos","closingTag","attrStrStart","isValid","otg","openPos","afterAmp","JSON","stringify","map","t","validate","orderedObjParser","orderedResult","addEntity"],"sourceRoot":""}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 11e5f7a1..0b9fbc54 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "fast-xml-parser",
- "version": "5.3.4",
+ "version": "5.3.5",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "fast-xml-parser",
- "version": "5.3.4",
+ "version": "5.3.5",
"funding": [
{
"type": "github",
@@ -15,7 +15,7 @@
],
"license": "MIT",
"dependencies": {
- "strnum": "^2.1.0"
+ "strnum": "^2.1.2"
},
"bin": {
"fxparser": "src/cli/cli.js"
diff --git a/package.json b/package.json
index 0e3901a2..1d7c280f 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "fast-xml-parser",
- "version": "5.3.4",
+ "version": "5.3.5",
"description": "Validate XML, Parse XML, Build XML without C/C++ based libraries",
"main": "./lib/fxp.cjs",
"type": "module",
@@ -87,6 +87,6 @@
}
],
"dependencies": {
- "strnum": "^2.1.0"
+ "strnum": "^2.1.2"
}
}
diff --git a/spec/entities_spec.js b/spec/entities_spec.js
index 048cb44b..332b8d32 100644
--- a/spec/entities_spec.js
+++ b/spec/entities_spec.js
@@ -154,6 +154,31 @@ describe("XMLParser Entities", function() {
expect(result).toEqual(expected);
});
+ it("should escape regex char from entity name", function() {
+ const xmlData = `
+">
+]>
+
+ Hello <b>World</b>
+`;
+
+ const expected = {
+ "?xml": "",
+ "root": {
+ "text": "Hello World"
+ }
+ };
+
+ const options = {
+
+ };
+ const parser = new XMLParser(options);
+ let result = parser.parse(xmlData);
+ //console.log(JSON.stringify(result,null,4));
+ expect(result).toEqual(expected);
+ });
+
it("should parse attributes having '>' in value", function() {
const xmlData = `
diff --git a/spec/v6/xmlParser_spec.js b/spec/v6/xmlParser_spec.js
new file mode 100644
index 00000000..1b61daa4
--- /dev/null
+++ b/spec/v6/xmlParser_spec.js
@@ -0,0 +1,284 @@
+
+import XMLParser from "../../src/v6/XMLParser.js";
+import JsObjOutputBuilder from "../../src/v6/OutputBuilders/JsObjBuilder.js";
+import numberParser from "../../src/v6/valueParsers/number.js";
+
+describe("XMLParser v6", function () {
+
+ it("should parse all values as string, int, boolean, float, hexadecimal", function () {
+ const xmlData = `
+ value
+ true
+ 045
+ 65.34
+ 0x15
+ `;
+ const expected = {
+ "rootNode": {
+ "tag": "value",
+ "boolean": true,
+ "intTag": 45,
+ "floatTag": 65.34,
+ "hexadecimal": 21
+ }
+ };
+
+ const parser = new XMLParser();
+ let result = parser.parse(xmlData);
+ expect(result).toEqual(expected);
+ });
+
+ it("should parse only true numbers", function () {
+ const xmlData = `
+ value
+ true
+ 045
+ 65.340
+ 420926189200190257681175017717
+ `;
+ const expected = {
+ "rootNode": {
+ "tag": "value",
+ "boolean": true,
+ "intTag": "045",
+ "floatTag": 65.34,
+ "long": 4.209261892001902e+29
+ }
+ };
+
+ const options = {
+ tags: {
+ valueParsers: [
+ "boolean",
+ new numberParser({
+ hex: true,
+ leadingZeros: false,
+ eNotation: true
+ })
+ ]
+ }
+ };
+ const parser = new XMLParser(options);
+ let result = parser.parse(xmlData);
+ expect(result).toEqual(expected);
+ });
+
+ it("should parse number ending in .0 for parseTrueNumberOnly:false", function () {
+ const xmlData = `
+ 0.0
+ 1.0
+ 2.0000
+
+ `;
+ const expected = {
+ "rootNode": {
+ "floatTag0": 0,
+ "floatTag1": 1,
+ "floatTag2": 2,
+ "floatTag3": {
+ "@_float": 3
+ }
+ }
+ };
+
+ const options = {
+ attributes: {
+ ignore: false,
+ valueParsers: ["number"] // parse attributes as numbers
+ },
+ tags: {
+ valueParsers: [
+ new numberParser({
+ leadingZeros: false
+ })
+ ]
+ }
+ };
+ const parser = new XMLParser(options);
+ let result = parser.parse(xmlData);
+ expect(result).toEqual(expected);
+ });
+
+ it("should not parse values to primitive type", function () {
+ const xmlData = `valuetrue04565.34`;
+ const expected = {
+ "rootNode": {
+ "tag": "value",
+ "boolean": "true",
+ "intTag": "045",
+ "floatTag": "65.34"
+ }
+ };
+
+ const options = {
+ tags: {
+ valueParsers: [] // No value parsers
+ }
+ };
+ const parser = new XMLParser(options);
+ let result = parser.parse(xmlData);
+ expect(result).toEqual(expected);
+ });
+
+ it("should parse number values of attributes as number", function () {
+ const xmlData = `value`;
+ const expected = {
+ "rootNode": {
+ "tag": {
+ "#text": "value",
+ "@_int": 45,
+ "@_intNegative": -45,
+ "@_float": 65.34,
+ "@_floatNegative": -65.34
+ }
+ }
+ };
+
+ const options = {
+ attributes: {
+ ignore: false,
+ valueParsers: ["number"]
+ }
+ };
+ const parser = new XMLParser(options);
+ let result = parser.parse(xmlData);
+ expect(result).toEqual(expected);
+ });
+
+ it("should skip tag arguments", function () {
+ const xmlData = `value4565.34`;
+ const expected = {
+ "rootNode": {
+ "tag": "value",
+ "intTag": 45,
+ "floatTag": 65.34
+ }
+ };
+
+ const options = {
+ attributes: {
+ ignore: true // skip attributes
+ }
+ };
+ const parser = new XMLParser(options);
+ let result = parser.parse(xmlData);
+ expect(result).toEqual(expected);
+ });
+
+ it("should ignore namespace and text node attributes", function () {
+ const xmlData = `\
+
+ value
+ 45
+ 65.34
+
+
+`;
+
+ const expected = {
+ "node": {
+ "tag": {
+ "@_arg": "value",
+ "#text": "value"
+ },
+ "intTag": {
+ "@_arg": "value",
+ "@_arg2": "value2",
+ "#text": 45
+ },
+ "floatTag": 65.34,
+ "nsTag": {
+ "@_attr": "tns"
+ //"#text": ""
+ },
+ "nsTagNoAttr": ""
+ }
+ };
+
+ const options = {
+ removeNSPrefix: true,
+ attributes: {
+ ignore: false
+ }
+ };
+ const parser = new XMLParser(options);
+ let result = parser.parse(xmlData);
+
+ expect(result).toEqual(expected);
+ });
+
+ it("should parse empty text Node", function () {
+ const xmlData = ``;
+ const expected = {
+ "rootNode": {
+ "tag": ""
+ }
+ };
+
+ const parser = new XMLParser();
+ let result = parser.parse(xmlData);
+ expect(result).toEqual(expected);
+ });
+
+ it("should parse self closing tags", function () {
+ const xmlData = "";
+ const expected = {
+ "rootNode": {
+ "tag": {
+ "@_ns:arg": "value"
+ }
+ }
+ };
+
+ const options = {
+ attributes: {
+ ignore: false
+ }
+ };
+ const parser = new XMLParser(options);
+ let result = parser.parse(xmlData);
+
+ expect(result).toEqual(expected);
+ });
+
+ it("should parse repeated nodes in array", function () {
+ const xmlData = `\
+
+ value
+ 45
+ 65.34
+`;
+ const expected = {
+ "rootNode": {
+ "tag": ["value", 45, 65.34]
+ }
+ };
+
+ const parser = new XMLParser();
+ let result = parser.parse(xmlData);
+ expect(result).toEqual(expected);
+ });
+
+ it("should parse nested nodes in nested properties", function () {
+ const xmlData = `\
+
+
+ value
+ 45
+ 65.34
+
+`;
+ const expected = {
+ "rootNode": {
+ "parenttag": {
+ "tag": ["value", 45, 65.34]
+ }
+ }
+ };
+
+ const parser = new XMLParser();
+ let result = parser.parse(xmlData);
+ expect(result).toEqual(expected);
+ });
+
+});
diff --git a/src/v6/EntitiesParser.js b/src/v6/EntitiesParser.js
index 6a31ef8a..1ff21e5b 100644
--- a/src/v6/EntitiesParser.js
+++ b/src/v6/EntitiesParser.js
@@ -37,12 +37,13 @@ export default class EntitiesParser{
}
addExternalEntity(key,val){
validateEntityName(key);
+ const escaped = key.replace(/[.\-+*:]/g, '\\.');
if(val.indexOf("&") !== -1) {
reportWarning(`Entity ${key} is not added as '&' is found in value;`)
return;
}else{
- this.lastEntities[ent] = {
- regex: new RegExp("&"+key+";","g"),
+ this.lastEntities[key] = {
+ regex: new RegExp("&"+escaped+";","g"),
val : val
}
}
@@ -52,8 +53,9 @@ export default class EntitiesParser{
const entKeys = Object.keys(entities);
for (let i = 0; i < entKeys.length; i++) {
const ent = entKeys[i];
+ const escaped = ent.replace(/[.\-+*:]/g, '\\.');
this.docTypeEntities[ent] = {
- regex: new RegExp("&"+ent+";","g"),
+ regex: new RegExp("&"+escaped+";","g"),
val : entities[ent]
}
}
@@ -89,11 +91,11 @@ export default class EntitiesParser{
}
return val;
}
-};
+}
//an entity name should not contains special characters that may be used in regex
//Eg !?\\\/[]$%{}^&*()<>
-const specialChar = "!?\\\/[]$%{}^&*()<>|+";
+const specialChar = "!?\\/[]$%{}^&*()<>|+";
function validateEntityName(name){
for (let i = 0; i < specialChar.length; i++) {
diff --git a/src/xmlparser/DocTypeReader.js b/src/xmlparser/DocTypeReader.js
index b5223cb0..4fc0a024 100644
--- a/src/xmlparser/DocTypeReader.js
+++ b/src/xmlparser/DocTypeReader.js
@@ -25,11 +25,13 @@ export default class DocTypeReader{
i += 7;
let entityName, val;
[entityName, val,i] = this.readEntityExp(xmlData,i+1,this.suppressValidationErr);
- if(val.indexOf("&") === -1) //Parameter entities are not supported
+ if(val.indexOf("&") === -1){ //Parameter entities are not supported
+ const escaped = entityName.replace(/[.\-+*:]/g, '\\.');
entities[ entityName ] = {
- regx : RegExp( `&${entityName};`,"g"),
+ regx : RegExp( `&${escaped};`,"g"),
val: val
};
+ }
}
else if( hasBody && hasSeq(xmlData, "!ELEMENT",i)) {
i += 8;//Not supported
diff --git a/src/xmlparser/OrderedObjParser.js b/src/xmlparser/OrderedObjParser.js
index 78d3dfac..ecb2b85c 100644
--- a/src/xmlparser/OrderedObjParser.js
+++ b/src/xmlparser/OrderedObjParser.js
@@ -77,8 +77,9 @@ function addExternalEntities(externalEntities){
const entKeys = Object.keys(externalEntities);
for (let i = 0; i < entKeys.length; i++) {
const ent = entKeys[i];
+ const escaped = ent.replace(/[.\-+*:]/g, '\\.');
this.lastEntities[ent] = {
- regex: new RegExp("&"+ent+";","g"),
+ regex: new RegExp("&"+escaped+";","g"),
val : externalEntities[ent]
}
}