@borgar/fx 1.1.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/dist/fx.js +2 -2
- package/lib/addMeta-test.js +46 -46
- package/lib/addMeta.js +4 -2
- package/lib/constants.js +2 -2
- package/lib/lexer-test.js +281 -3
- package/lib/lexer.js +39 -5
- package/lib/parseRef.js +4 -1
- package/package.json +15 -13
- package/rollup.config.js +2 -2
package/README.md
CHANGED
|
@@ -22,6 +22,7 @@ The library is also provided as an ES6 module in an NPM package:
|
|
|
22
22
|
|- | - | -
|
|
23
23
|
| `emitRanges` | `false` | Adds offset ranges on the tokens: `{ range: [ start, end ] }`
|
|
24
24
|
| `mergeRanges` | `true` | Should ranges be returned as whole references (`Sheet1!A1:B2`) or as separate tokens for each part: (`Sheet1`,`!`,`A1`,`:`,`B2`).
|
|
25
|
+
| `negativeNumbers` | `false` | Merges all unary minuses with their immediately following number tokens (`-`,`1`) => `-1`
|
|
25
26
|
| `r1c1` | `false` | Ranges are expected to be in the R1C1 style format rather than the more popular A1 style.
|
|
26
27
|
|
|
27
28
|
The returned output will be an array of objects representing the tokens:
|
|
@@ -106,13 +107,13 @@ The returned output will be the same array of tokens but the following propertie
|
|
|
106
107
|
|
|
107
108
|
Matching parens will be tagged with `.groupId` string identifier as well as a `.depth` number value (indicating the level of nesting).
|
|
108
109
|
|
|
109
|
-
|
|
110
|
+
Closing parens without a counterpart will be tagged with `.error` (boolean true).
|
|
110
111
|
|
|
111
112
|
#### Curly brackets { }
|
|
112
113
|
|
|
113
114
|
Matching curly brackets will be tagged with `.groupId` string identifier. These may not be nested in Excel.
|
|
114
115
|
|
|
115
|
-
|
|
116
|
+
Closing curly brackets without a counterpart will be tagged with `.error` (boolean `true`).
|
|
116
117
|
|
|
117
118
|
#### Ranges (`RANGE` or `RANGE_BEAM` type tokens)
|
|
118
119
|
|
package/dist/fx.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";function quickVerifyRangeA1(e){return e.split(/(\d+|[a-zA-Z]+)/).every(e=>{var t=parseInt(e,36);return!!isNaN(t)||(isFinite(e)?t<=2183880786:t<=43321)})}Object.defineProperty(exports,"__esModule",{value:!0});const bounds={R:1048577,"R[":1048576,C:16385,"C[":16384};function quickVerifyRangeRC(e){const t=/([RC]\[?)(-?\d+)/gi;for(;null!==(o=t.exec(e));){var r=bounds[o[1]],o=parseInt(o[2],10);if(r<=o||o<=-r)return!1}return!0}const OPERATOR="operator",BOOLEAN="bool",ERROR="error",NUMBER="number",FUNCTION="function",NEWLINE="newline",WHITESPACE="whitespace",STRING="string",PATH_QUOTE="path-quote",PATH_BRACE="path-brace",PATH_PREFIX="path-prefix",RANGE="range",RANGE_BEAM="range-beam",RANGE_NAMED="range-named",FX_PREFIX="fx-prefix",UNKNOWN="unknown",MAX_COLS=16383,MAX_ROWS=1048575,re_ERROR=/^#(NAME\?|FIELD!|CALC!|VALUE!|REF!|DIV\/0!|NULL!|NUM!|N\/A|GETTING_DATA\b|SPILL!|UNKNOWN!|FIELD\b|CALC\b|SYNTAX\?|ERROR!)/i,re_OPERATOR=/^(<=|>=|<>|[-+/*^%&<>=]|[{},;]|[()]|@|:|!|#)/,re_BOOLEAN=/^(TRUE|FALSE)\b/i,re_FUNCTION=/^[A-Z]+(?=\s*\()/i,re_NEWLINE=/^\n+/,re_WHITESPACE=/^\s+/,re_STRING=/^"(?:""|[^"])*("|$)/,re_PATH_QUOTE=/^'(?:''|[^'])*('|$)/,re_PATH_BRACE=/^\[(?:[^\]])+(\]|$)/,re_PATH_PREFIX=/^([^ \t\n$!"`'#%&(){}<>,;:^@|~=*+-]+)(?=!)/,re_A1COL=/^\$?[A-Z]{1,3}:\$?[A-Z]{1,3}/i,re_A1ROW=/^\$?[1-9][0-9]{0,6}:\$?[1-9][0-9]{0,6}/i,re_A1RANGE=/^\$?[A-Z]{1,3}\$?[1-9][0-9]{0,6}/i,rPart="(?:R(?:\\[[+-]?\\d+\\]|[1-9][0-9]{0,6})?)",cPart="(?:C(?:\\[[+-]?\\d+\\]|[1-9][0-9]{0,4})?)",re_RCCOL=new RegExp("^".concat(cPart,"(:").concat(cPart,")?(?=\\W|$)"),"i"),re_RCROW=new RegExp("^".concat(rPart,"(:").concat(rPart,")?(?=\\W|$)"),"i"),re_RCRANGE=new RegExp("^(?:(?=[RC])".concat(rPart).concat(cPart,")"),"i"),re_NUMBER=/^(?:\d+(\.\d+)?(?:[eE][+-]?\d+)?|\d+)/,re_NAMED=/^[A-Z\d\\_.?]+/i,tokenHandlersA1=[[ERROR,re_ERROR],[OPERATOR,re_OPERATOR],[BOOLEAN,re_BOOLEAN],[FUNCTION,re_FUNCTION],[NEWLINE,re_NEWLINE],[WHITESPACE,re_WHITESPACE],[STRING,re_STRING],[PATH_QUOTE,re_PATH_QUOTE],[PATH_BRACE,re_PATH_BRACE],[PATH_PREFIX,re_PATH_PREFIX],[RANGE,re_A1RANGE,quickVerifyRangeA1],[RANGE_BEAM,re_A1COL,quickVerifyRangeA1],[RANGE_BEAM,re_A1ROW,quickVerifyRangeA1],[NUMBER,re_NUMBER],[RANGE_NAMED,re_NAMED]],tokenHandlersRC=[[ERROR,re_ERROR],[OPERATOR,re_OPERATOR],[BOOLEAN,re_BOOLEAN],[FUNCTION,re_FUNCTION],[NEWLINE,re_NEWLINE],[WHITESPACE,re_WHITESPACE],[STRING,re_STRING],[PATH_QUOTE,re_PATH_QUOTE],[PATH_BRACE,re_PATH_BRACE],[PATH_PREFIX,re_PATH_PREFIX],[RANGE,re_RCRANGE,quickVerifyRangeRC],[RANGE_BEAM,re_RCROW,quickVerifyRangeRC],[RANGE_BEAM,re_RCCOL,quickVerifyRangeRC],[NUMBER,re_NUMBER],[RANGE_NAMED,re_NAMED]],tokenHandlersRefsA1=[[OPERATOR,/^[!:]/],[PATH_QUOTE,re_PATH_QUOTE],[PATH_BRACE,re_PATH_BRACE],[PATH_PREFIX,re_PATH_PREFIX],[RANGE,re_A1RANGE,quickVerifyRangeA1],[RANGE_BEAM,re_A1COL,quickVerifyRangeA1],[RANGE_BEAM,re_A1ROW,quickVerifyRangeA1],[RANGE_NAMED,re_NAMED]],tokenHandlersRefsRC=[[OPERATOR,/^!/],[PATH_QUOTE,re_PATH_QUOTE],[PATH_BRACE,re_PATH_BRACE],[PATH_PREFIX,re_PATH_PREFIX],[RANGE,re_RCRANGE,quickVerifyRangeRC],[RANGE_BEAM,re_RCROW,quickVerifyRangeRC],[RANGE_BEAM,re_RCCOL,quickVerifyRangeRC],[RANGE_NAMED,re_NAMED]],isType=(e,t)=>e&&e.type===t,isRangeOp=e=>e&&":"===e.value,isBangOp=e=>e&&"!"===e.value;function getTokens(o){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:[],R=2<arguments.length&&void 0!==arguments[2]&&arguments[2],a=3<arguments.length&&void 0!==arguments[3]&&arguments[3];const A=[];let E=0;var e,i=e=>A[A.length-e];for(/^=/.test(o)&&(e={type:FX_PREFIX,value:"=",...R?{range:[0,1]}:{}},E++,A.push(e));E<o.length;){var l=E,p=o.slice(E);let t="",r="";for(let e=0;e<n.length;e++){const[N,_,f]=n[e];var u=_.exec(p);if(u&&(!f||f(u[0]))){t=N,r=u[0],E+=u[0].length;break}}t||(t=UNKNOWN,r=o[E],E++);let e={type:t,value:r,...R?{range:[l,E]}:{}};if(a&&(t===RANGE||t===RANGE_NAMED||t===RANGE_BEAM)){const c=[];isRangeOp(i(1))&&isType(i(2),RANGE)&&t===RANGE&&c.unshift(...A.splice(-2,2)),isBangOp(i(1))&&(isType(i(2),PATH_QUOTE)||isType(i(2),PATH_BRACE)?c.unshift(...A.splice(-2,2)):isType(i(2),PATH_PREFIX)&&(l=isType(i(3),PATH_BRACE)?3:2,c.unshift(...A.splice(-l,l)))),c.length&&(e={type:t,value:c.map(e=>e.value).join("")+r,...R?{range:[c[0].range[0],E]}:{}})}A.push(e)}return A}function tokenize(e){var{emitRanges:t=!1,mergeRanges:r=!0,r1c1:o=!1}=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};return getTokens(e,o?tokenHandlersRC:tokenHandlersA1,t,r)}const unquote=e=>e.slice(1,-1).replace(/''/g,"'"),pRangeOp=e=>e&&":"===e.value&&{},pRange=e=>e&&e.type===RANGE&&{r0:e.value},pRange2=e=>e&&e.type===RANGE&&{r1:e.value},pBang=e=>e&&"!"===e.value&&{},pBeam=e=>e&&e.type===RANGE_BEAM&&{r0:e.value},pSheet=e=>e&&e.type===PATH_PREFIX&&/^[^:\\/?*[\]]{0,31}$/.test(e.value)&&{sheetName:e.value},pFile=e=>e&&e.type===PATH_BRACE&&{workbookName:e.value.slice(1,-1)},pFile2=e=>e&&e.type===PATH_PREFIX&&{workbookName:e.value},pNamed=e=>e&&e.type===RANGE_NAMED&&{name:e.value},pQuoted=e=>{if(e&&e.type===PATH_QUOTE){var t=/(?:\[(.+?)\])?([^[\]]+?)$/.exec(unquote(e.value));if(t){var[,e,t]=t;if(!t||/^[^:\\/?*[\]]{0,31}$/.test(t))return{workbookName:e||"",sheetName:t||""}}}},pQuoted2=e=>e&&e.type===PATH_QUOTE&&{workbookName:unquote(e.value)},validRuns=[[pRange],[pRange,pRangeOp,pRange2],[pBeam],[pQuoted,pBang,pRange],[pQuoted,pBang,pRange,pRangeOp,pRange2],[pQuoted,pBang,pBeam],[pSheet,pBang,pRange],[pSheet,pBang,pRange,pRangeOp,pRange2],[pSheet,pBang,pBeam],[pFile,pSheet,pBang,pRange],[pFile,pSheet,pBang,pRange,pRangeOp,pRange2],[pFile,pSheet,pBang,pBeam]],validRunsNamed=validRuns.concat([[pNamed],[pFile2,pBang,pNamed],[pQuoted2,pBang,pNamed]]);function parseRef(e){var t=!(1<arguments.length&&void 0!==arguments[1])||arguments[1];const r=getTokens(e,2<arguments.length&&void 0!==arguments[2]?arguments[2]:[],!1,!1);var o={sheetName:"",workbookName:"",r0:"",r1:"",name:""};r.length&&r[0].type===FX_PREFIX&&r.shift();const n=t?validRunsNamed:validRuns;for(let e=0;e<n.length;e++){const R={...o};if(n[e].length===r.length)if(n[e].every((e,t)=>{t=e(r[t]);return Object.assign(R,t),t}))return R}return null}function fromCol(e){const t=(e||"").toUpperCase();let r=0,o=0;for(;o!==t.length;++o){var n=t.charCodeAt(o);65<=n&&n<=90&&(r=26*r+n-64)}return r-1}function toCol(e){let t=e,r="";for(;0<=t;)r=String.fromCharCode(t%26+65)+r,t=Math.floor(t/26)-1;return r}function fromRow(e){return+e-1}function toRow(e){return String(e+1)}function toRelative(e){var{top:t,left:r,bottom:o,right:e}=e;return{top:t,left:r,bottom:o,right:e,$left:!1,$right:!1,$top:!1,$bottom:!1}}function toAbsolute(e){var{top:t,left:r,bottom:o,right:e}=e;return{top:t,left:r,bottom:o,right:e,$left:!0,$right:!0,$top:!0,$bottom:!0}}function toA1(e){var t=e=>e?"$":"",{top:r,left:o,bottom:n,right:R,$left:a,$right:A,$top:E,$bottom:e}=e;return 0===r&&n===MAX_ROWS?t(a)+toCol(o)+":"+t(A)+toCol(R):0===o&&R===MAX_COLS?t(E)+toRow(r)+":"+t(e)+toRow(n):null==R||null==n||R===o&&n===r?t(a)+toCol(o)+t(E)+toRow(r):t(a)+toCol(o)+t(E)+toRow(r)+":"+t(A)+toCol(R)+t(e)+toRow(n)}function fromA1(e){let t,r=0,o=0,n=MAX_ROWS,R=MAX_COLS,a=!1,A=!1,E=!1,i=!1;if(t=/^(\$?)([A-Z]{1,3}):(\$?)([A-Z]{1,3})$/.exec(e)){var l=fromCol(t[2]),p=fromCol(t[4]);return o=Math.min(l,p),R=Math.max(l,p),A=!!t[l<=p?1:3],i=!!t[l<=p?3:1],a=!0,E=!0,{top:r,left:o,bottom:n,right:R,$top:a,$left:A,$bottom:E,$right:i}}if(t=/^(\$?)([1-9]\d{0,6}):(\$?)([1-9]\d{0,6})$/.exec(e)){var p=fromRow(t[2]),u=fromRow(t[4]);return r=Math.min(p,u),n=Math.max(p,u),a=!!t[p<=u?1:3],E=!!t[p<=u?3:1],A=!0,i=!0,{top:r,left:o,bottom:n,right:R,$top:a,$left:A,$bottom:E,$right:i}}var[u,e]=e.split(":");return(t=/^(\$?)([A-Z]{1,3})(\$?)([1-9]\d{0,6})$/i.exec(u))?(o=fromCol(t[2]),r=fromRow(t[4]),A=!!t[1],a=!!t[3],e&&(t=/^(\$?)([A-Z]{1,3})(\$?)([1-9]\d{0,6})$/i.exec(e))?(R=fromCol(t[2]),n=fromRow(t[4]),i=!!t[1],E=!!t[3],n<r&&([r,n,a,E]=[n,r,E,a]),R<o&&([o,R,A,i]=[R,o,i,A])):(n=r,R=o,E=a,i=A),{top:r,left:o,bottom:n,right:R,$top:a,$left:A,$bottom:E,$right:i}):null}function parseA1Ref(e){const t=parseRef(e,!(1<arguments.length&&void 0!==arguments[1])||arguments[1],tokenHandlersRefsA1);if(t&&(t.r0||t.name)){let e=null;return t.r0&&(e=t.r1?fromA1(t.r0+":"+t.r1):fromA1(t.r0)),t.name||e?(t.range=e,delete t.r0,delete t.r1,t):null}return null}var a1={fromCol:fromCol,toCol:toCol,toRelative:toRelative,toAbsolute:toAbsolute,to:toA1,from:fromA1,parse:parseA1Ref};function getIDer(){let e=1;return()=>"fxg"+e++}function addMeta(e){let{sheetName:n="",workbookName:R=""}=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};const a=[];let A=null;const E={},i=getIDer();return e.forEach(e=>{if("("===e.value)e.depth=a.length,a.push(e);else if(")"===e.value){const o=a.pop();var t;o?(t=i(),e.groupId=t,e.depth=o.depth,o.groupId=t):e.error=!0}else{var r;"{"===e.value?A?e.error=!0:A=e:"}"===e.value?(A?(r=i(),e.groupId=r,A.groupId=r):e.error=!0,A=null):e.type===RANGE||e.type===RANGE_BEAM?(r=(r=parseA1Ref(e.value,!1))&&"[".concat(r.workbookName||R,"]").concat(r.sheetName||n,"!").concat(r.range?toA1(toRelative(r.range)):r.name).toLowerCase())&&(r in E?e.groupId=E[r]:(e.groupId=i(),E[r]=e.groupId)):e.type===UNKNOWN&&(e.error=!0)}}),e}function toCoord(e,t){return t?String(e+1):e?"["+e+"]":""}function toRC(e){var{r0:t,c0:r,r1:o,c1:n,$c0:R,$c1:a,$r0:A,$r1:e}=e;if(0===t&&o===MAX_ROWS){var E=toCoord(r,R),i=toCoord(n,a);return"C"+(E===i?E:E+":C"+i)}if(0===r&&n===MAX_COLS){E=toCoord(t,A),i=toCoord(o,e);return"R"+(E===i?E:E+":R"+i)}A=toCoord(t,A),e=toCoord(o,e),R=toCoord(r,R),a=toCoord(n,a);return A!==e||R!==a?"R"+A+"C"+R+":R"+e+"C"+a:"R"+A+"C"+R}function parseRCPart(e){let t=0,r=0,o=MAX_ROWS,n=MAX_COLS,R=!1,a=!1,A=!1,E=!1;var i=/^R(?:\[([+-]?\d+)\]|(\d+))?/.exec(e);i?(i[1]?t=parseInt(i[1],10):i[2]&&(t=parseInt(i[2],10)-1,R=!0),o=t,A=R,e=e.slice(i[0].length)):(R=!0,A=!0);var l=/^C(?:\[([+-]?\d+)\]|(\d+))?/.exec(e);return l?(l[1]?r=parseInt(l[1],10):l[2]&&(r=parseInt(l[2],10)-1,a=!0),n=r,E=a,e=e.slice(l[0].length)):(a=!0,E=!0),!i&&!l||e.length?null:{r0:t,c0:r,r1:o,c1:n,$r0:R,$c0:a,$r1:A,$c1:E}}function fromRC(e){var[t,e]=e.split(":",2);const r=parseRCPart(t);if(!r)return null;if(r&&e){e=parseRCPart(e);if(!e)return null;r.r1=e.r1,r.c1=e.c1,r.$r1=e.$r1,r.$c1=e.$c1}return r}function parseRCRef(e){const t=parseRef(e,!(1<arguments.length&&void 0!==arguments[1])||arguments[1],tokenHandlersRefsRC);if(t&&(t.r0||t.name)){e=t.r1?fromRC(t.r0+":"+t.r1):fromRC(t.r0);return t.name||e?(t.range=e,delete t.r0,delete t.r1,t):null}return null}var rc={to:toRC,from:fromRC,parse:parseRCRef};function translateToRC(e,t){const{top:n,left:R}=fromA1(t);t="string"==typeof e;const r=t?tokenize(e,{emitRanges:!1,mergeRanges:!1,r1c2:!1}):e;return r.forEach(e=>{if(e.type===RANGE){const r={};var t=fromA1(e.value);r.r0=t.$top?t.top:t.top-n,r.$r0=t.$top,r.r1=t.$bottom?t.bottom:t.bottom-n,r.$r1=t.$bottom,r.c0=t.$left?t.left:t.left-R,r.$c0=t.$left,r.c1=t.$right?t.right:t.right-R,r.$c1=t.$right,e.value=toRC(r)}else if(e.type===RANGE_BEAM){const o={};t=fromA1(e.value);o.r0=t.$top?t.top:t.top-n,o.$r0=t.$top,o.r1=t.$bottom?t.bottom:t.bottom-n,o.$r1=t.$bottom,o.c0=t.$left?t.left:t.left-R,o.$c0=t.$left,o.c1=t.$right?t.right:t.right-R,o.$c1=t.$right,e.value=toRC(o)}}),t?r.map(e=>e.value).join(""):r}function toFixed(e,t,r,o){let n=e;return t||(n=r+e,n<0&&(n=o+n+1),n>o&&(n-=o+1)),n}function translateToA1(e,t){const R=fromA1(t);t="string"==typeof e;const r=t?tokenize(e,{emitRanges:!1,mergeRanges:!1,r1c1:!0}):e;return r.forEach(e=>{if(e.type===RANGE||e.type===RANGE_BEAM){const n={};var t=fromRC(e.value),r=toFixed(t.r0,t.$r0,R.top,MAX_ROWS),o=toFixed(t.r1,t.$r1,R.top,MAX_ROWS);o<r?(n.top=o,n.$top=t.$r1,n.bottom=r,n.$bottom=t.$r0):(n.top=r,n.$top=t.$r0,n.bottom=o,n.$bottom=t.$r1);r=toFixed(t.c0,t.$c0,R.left,MAX_COLS),o=toFixed(t.c1,t.$c1,R.left,MAX_COLS);o<r?(n.left=o,n.$left=t.$c1,n.right=r,n.$right=t.$c0):(n.left=r,n.$left=t.$c0,n.right=o,n.$right=t.$c1),e.value=toA1(n)}}),t?r.map(e=>e.value).join(""):r}const tokenTypes={OPERATOR:OPERATOR,BOOLEAN:BOOLEAN,ERROR:ERROR,NUMBER:NUMBER,FUNCTION:FUNCTION,NEWLINE:NEWLINE,WHITESPACE:WHITESPACE,STRING:STRING,PATH_QUOTE:PATH_QUOTE,PATH_BRACE:PATH_BRACE,PATH_PREFIX:PATH_PREFIX,RANGE:RANGE,RANGE_BEAM:RANGE_BEAM,RANGE_NAMED:RANGE_NAMED,FX_PREFIX:FX_PREFIX,UNKNOWN:UNKNOWN};exports.MAX_COLS=MAX_COLS,exports.MAX_ROWS=MAX_ROWS,exports.a1=a1,exports.addMeta=addMeta,exports.rc=rc,exports.tokenTypes=tokenTypes,exports.tokenize=tokenize,exports.translateToA1=translateToA1,exports.translateToRC=translateToRC;
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnguanMiLCJzb3VyY2VzIjpbIi4uL2xpYi9xdWlja1ZlcmlmeS5qcyIsIi4uL2xpYi9jb25zdGFudHMuanMiLCIuLi9saWIvbGV4ZXIuanMiLCIuLi9saWIvcGFyc2VSZWYuanMiLCIuLi9saWIvYTEuanMiLCIuLi9saWIvYWRkTWV0YS5qcyIsIi4uL2xpYi9yYy5qcyIsIi4uL2xpYi90cmFuc2xhdGUuanMiLCIuLi9saWIvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIHF1aWNrVmVyaWZ5UmFuZ2VBMSAodG9rZW5WYWx1ZSkge1xuICAvLyBRdWlja2x5IGRldGVybWluZSBpZiByYW5nZSB2YWx1cyBhcmUgb3V0IG9mIGJvdW5kczogU3BsaXQgdGhlIHN0cmluZyBpbnRvXG4gIC8vIG51bWVyaWMsIGFscGhhYmV0aWNhbCwgYW5kIFwib3RoZXJcIiBjaHVua3MgYW5kIHBhcnNlIHRoZW0gYXMgYmFzZSAzNiBudW1iZXJzLlxuICAvLyBCb3RoIHJvd3MgYW5kIGNvbHMgY2FuIGJlIHJlcHJlc2VudGVkIGluIGJhc2UgMzYgYW5kIHdlIGNhbiBkZWNpZGUgd2hpY2ggd2VcbiAgLy8gaG9sZCBieSBjaGVja2luZyBpZiB0aGUgY2h1bmsgd2FzIGFscmVhZHkgYSBmaW5pdGUgbnVtYmVyLiBTbyB3ZSBjYW4gc2ltcGx5XG4gIC8vIGNvbXBhcmUgYWdhaW5zdCB0aGUgYmFzZSAzNiBwYXJzZWQgdmVyc2lvbnMgb2YgWEZEIGFuZCAxMDQ4NTc2LlxuICByZXR1cm4gdG9rZW5WYWx1ZS5zcGxpdCgvKFxcZCt8W2EtekEtWl0rKS8pLmV2ZXJ5KGQgPT4ge1xuICAgIGNvbnN0IG4gPSBwYXJzZUludChkLCAzNik7XG4gICAgaWYgKCFpc05hTihuKSkge1xuICAgICAgcmV0dXJuIGlzRmluaXRlKGQpXG4gICAgICAgID8gbiA8PSAyMTgzODgwNzg2IC8vIG1heCByb3dzXG4gICAgICAgIDogbiA8PSA0MzMyMTsgICAgIC8vIG1heCBjb2xzXG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuY29uc3QgYm91bmRzID0ge1xuICAnUic6IDEwNDg1NzcsXG4gICdSWyc6IDEwNDg1NzYsXG4gICdDJzogMTYzODUsXG4gICdDWyc6IDE2Mzg0XG59O1xuZXhwb3J0IGZ1bmN0aW9uIHF1aWNrVmVyaWZ5UmFuZ2VSQyAodG9rZW5WYWx1ZSkge1xuICBjb25zdCByZU51bXMgPSAvKFtSQ11cXFs/KSgtP1xcZCspL2dpO1xuICBsZXQgbTtcbiAgd2hpbGUgKChtID0gcmVOdW1zLmV4ZWModG9rZW5WYWx1ZSkpICE9PSBudWxsKSB7XG4gICAgY29uc3QgeCA9IGJvdW5kc1ttWzFdXTtcbiAgICBjb25zdCB2YWwgPSBwYXJzZUludChtWzJdLCAxMCk7XG4gICAgaWYgKHZhbCA+PSB4IHx8IHZhbCA8PSAteCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsImltcG9ydCB7IHF1aWNrVmVyaWZ5UmFuZ2VBMSwgcXVpY2tWZXJpZnlSYW5nZVJDIH0gZnJvbSAnLi9xdWlja1ZlcmlmeS5qcyc7XG5cbmV4cG9ydCBjb25zdCBPUEVSQVRPUiA9ICdvcGVyYXRvcic7XG5leHBvcnQgY29uc3QgQk9PTEVBTiA9ICdib29sJztcbmV4cG9ydCBjb25zdCBFUlJPUiA9ICdlcnJvcic7XG5leHBvcnQgY29uc3QgTlVNQkVSID0gJ251bWJlcic7XG5leHBvcnQgY29uc3QgRlVOQ1RJT04gPSAnZnVuY3Rpb24nO1xuZXhwb3J0IGNvbnN0IE5FV0xJTkUgPSAnbmV3bGluZSc7XG5leHBvcnQgY29uc3QgV0hJVEVTUEFDRSA9ICd3aGl0ZXNwYWNlJztcbmV4cG9ydCBjb25zdCBTVFJJTkcgPSAnc3RyaW5nJztcbmV4cG9ydCBjb25zdCBQQVRIX1FVT1RFID0gJ3BhdGgtcXVvdGUnO1xuZXhwb3J0IGNvbnN0IFBBVEhfQlJBQ0UgPSAncGF0aC1icmFjZSc7XG5leHBvcnQgY29uc3QgUEFUSF9QUkVGSVggPSAncGF0aC1wcmVmaXgnO1xuZXhwb3J0IGNvbnN0IFJBTkdFID0gJ3JhbmdlJztcbmV4cG9ydCBjb25zdCBSQU5HRV9CRUFNID0gJ3JhbmdlLWJlYW0nO1xuZXhwb3J0IGNvbnN0IFJBTkdFX05BTUVEID0gJ3JhbmdlLW5hbWVkJztcbmV4cG9ydCBjb25zdCBGWF9QUkVGSVggPSAnZngtcHJlZml4JztcbmV4cG9ydCBjb25zdCBVTktOT1dOID0gJ3Vua25vd24nO1xuXG5leHBvcnQgY29uc3QgTUFYX0NPTFMgPSAyICoqIDE0IC0gMTsgLy8gMTYzODNcbmV4cG9ydCBjb25zdCBNQVhfUk9XUyA9IDIgKiogMjAgLSAxOyAvLyAxMDQ4NTc1XG5cbmNvbnN0IHJlX0VSUk9SID0gL14jKE5BTUVcXD98RklFTEQhfENBTEMhfFZBTFVFIXxSRUYhfERJVlxcLzAhfE5VTEwhfE5VTSF8TlxcL0F8R0VUVElOR19EQVRBXFxifFNQSUxMIXxVTktOT1dOIXxGSUVMRFxcYnxDQUxDXFxifFNZTlRBWFxcP3xFUlJPUiEpL2k7XG5jb25zdCByZV9PUEVSQVRPUiA9IC9eKDw9fD49fDw+fFstKy8qXiUmPD49XXxbe30sO118WygpXXxAfDp8IXwjKS87XG5jb25zdCByZV9CT09MRUFOID0gL14oVFJVRXxGQUxTRSlcXGIvaTtcbmNvbnN0IHJlX0ZVTkNUSU9OID0gL15bQS1aXSsoPz1cXHMqXFwoKS9pO1xuY29uc3QgcmVfTkVXTElORSA9IC9eXFxuKy87XG5jb25zdCByZV9XSElURVNQQUNFID0gL15cXHMrLztcbmNvbnN0IHJlX1NUUklORyA9IC9eXCIoPzpcIlwifFteXCJdKSooXCJ8JCkvO1xuY29uc3QgcmVfUEFUSF9RVU9URSA9IC9eJyg/OicnfFteJ10pKignfCQpLztcbmNvbnN0IHJlX1BBVEhfQlJBQ0UgPSAvXlxcWyg/OlteXFxdXSkrKFxcXXwkKS87XG5jb25zdCByZV9QQVRIX1BSRUZJWCA9IC9eKFteIFxcdFxcbiQhXCJgJyMlJigpe308Piw7Ol5AfH49KistXSspKD89ISkvOyAvLyBTaGVldHM6IFteOlxcXFwvPypbXFxdXXswLDMxfSAoYnV0IFdCIG5hbWVzPylcbmNvbnN0IHJlX0ExQ09MID0gL15cXCQ/W0EtWl17MSwzfTpcXCQ/W0EtWl17MSwzfS9pO1xuY29uc3QgcmVfQTFST1cgPSAvXlxcJD9bMS05XVswLTldezAsNn06XFwkP1sxLTldWzAtOV17MCw2fS9pO1xuY29uc3QgcmVfQTFSQU5HRSA9IC9eXFwkP1tBLVpdezEsM31cXCQ/WzEtOV1bMC05XXswLDZ9L2k7XG5jb25zdCByUGFydCA9ICcoPzpSKD86XFxcXFtbKy1dP1xcXFxkK1xcXFxdfFsxLTldWzAtOV17MCw2fSk/KSc7XG5jb25zdCBjUGFydCA9ICcoPzpDKD86XFxcXFtbKy1dP1xcXFxkK1xcXFxdfFsxLTldWzAtOV17MCw0fSk/KSc7XG5jb25zdCByZV9SQ0NPTCA9IG5ldyBSZWdFeHAoYF4ke2NQYXJ0fSg6JHtjUGFydH0pPyg/PVxcXFxXfCQpYCwgJ2knKTtcbmNvbnN0IHJlX1JDUk9XID0gbmV3IFJlZ0V4cChgXiR7clBhcnR9KDoke3JQYXJ0fSk/KD89XFxcXFd8JClgLCAnaScpO1xuY29uc3QgcmVfUkNSQU5HRSA9IG5ldyBSZWdFeHAoYF4oPzooPz1bUkNdKSR7clBhcnR9JHtjUGFydH0pYCwgJ2knKTtcbmNvbnN0IHJlX05VTUJFUiA9IC9eKD86XFxkKyhcXC5cXGQrKT8oPzpbZUVdWystXT9cXGQrKT98XFxkKykvO1xuY29uc3QgcmVfTkFNRUQgPSAvXltBLVpcXGRcXFxcXy4/XSsvaTsgLy8gRklYTUUgdGhlcmUgYXJlIHN0cmljdGVyIHJ1bGVzIGZvciB0aGlzIVxuLy8gY29uc3QgcmVfTkFNRUQgPSAvXig/IVtSQ10kKVtBLVrDgC3Is19cXFxcXVtcXFxcP1xcd8OALcizLl17MCwyNTV9JC9pO1xuXG5leHBvcnQgY29uc3QgdG9rZW5IYW5kbGVyc0ExID0gW1xuICBbIEVSUk9SLCAgICAgICByZV9FUlJPUiBdLFxuICBbIE9QRVJBVE9SLCAgICByZV9PUEVSQVRPUiBdLFxuICBbIEJPT0xFQU4sICAgICByZV9CT09MRUFOIF0sXG4gIFsgRlVOQ1RJT04sICAgIHJlX0ZVTkNUSU9OIF0sXG4gIFsgTkVXTElORSwgICAgIHJlX05FV0xJTkUgXSxcbiAgWyBXSElURVNQQUNFLCAgcmVfV0hJVEVTUEFDRSBdLFxuICBbIFNUUklORywgICAgICByZV9TVFJJTkcgXSxcbiAgWyBQQVRIX1FVT1RFLCAgcmVfUEFUSF9RVU9URSBdLFxuICBbIFBBVEhfQlJBQ0UsICByZV9QQVRIX0JSQUNFIF0sXG4gIFsgUEFUSF9QUkVGSVgsIHJlX1BBVEhfUFJFRklYIF0sXG4gIFsgUkFOR0UsICAgICAgIHJlX0ExUkFOR0UsIHF1aWNrVmVyaWZ5UmFuZ2VBMSBdLFxuICBbIFJBTkdFX0JFQU0sICByZV9BMUNPTCwgcXVpY2tWZXJpZnlSYW5nZUExIF0sXG4gIFsgUkFOR0VfQkVBTSwgIHJlX0ExUk9XLCBxdWlja1ZlcmlmeVJhbmdlQTEgXSxcbiAgWyBOVU1CRVIsICAgICAgcmVfTlVNQkVSIF0sXG4gIFsgUkFOR0VfTkFNRUQsIHJlX05BTUVEIF1cbl07XG5cbmV4cG9ydCBjb25zdCB0b2tlbkhhbmRsZXJzUkMgPSBbXG4gIFsgRVJST1IsICAgICAgIHJlX0VSUk9SIF0sXG4gIFsgT1BFUkFUT1IsICAgIHJlX09QRVJBVE9SIF0sXG4gIFsgQk9PTEVBTiwgICAgIHJlX0JPT0xFQU4gXSxcbiAgWyBGVU5DVElPTiwgICAgcmVfRlVOQ1RJT04gXSxcbiAgWyBORVdMSU5FLCAgICAgcmVfTkVXTElORSBdLFxuICBbIFdISVRFU1BBQ0UsICByZV9XSElURVNQQUNFIF0sXG4gIFsgU1RSSU5HLCAgICAgIHJlX1NUUklORyBdLFxuICBbIFBBVEhfUVVPVEUsICByZV9QQVRIX1FVT1RFIF0sXG4gIFsgUEFUSF9CUkFDRSwgIHJlX1BBVEhfQlJBQ0UgXSxcbiAgWyBQQVRIX1BSRUZJWCwgcmVfUEFUSF9QUkVGSVggXSxcbiAgWyBSQU5HRSwgICAgICAgcmVfUkNSQU5HRSwgcXVpY2tWZXJpZnlSYW5nZVJDIF0sXG4gIFsgUkFOR0VfQkVBTSwgIHJlX1JDUk9XLCBxdWlja1ZlcmlmeVJhbmdlUkMgXSxcbiAgWyBSQU5HRV9CRUFNLCAgcmVfUkNDT0wsIHF1aWNrVmVyaWZ5UmFuZ2VSQyBdLFxuICBbIE5VTUJFUiwgICAgICByZV9OVU1CRVIgXSxcbiAgWyBSQU5HRV9OQU1FRCwgcmVfTkFNRUQgXVxuXTtcblxuZXhwb3J0IGNvbnN0IHRva2VuSGFuZGxlcnNSZWZzQTEgPSBbXG4gIFsgT1BFUkFUT1IsICAgIC9eWyE6XS8gXSxcbiAgWyBQQVRIX1FVT1RFLCAgcmVfUEFUSF9RVU9URSBdLFxuICBbIFBBVEhfQlJBQ0UsICByZV9QQVRIX0JSQUNFIF0sXG4gIFsgUEFUSF9QUkVGSVgsIHJlX1BBVEhfUFJFRklYIF0sXG4gIFsgUkFOR0UsICAgICAgIHJlX0ExUkFOR0UsIHF1aWNrVmVyaWZ5UmFuZ2VBMSBdLFxuICBbIFJBTkdFX0JFQU0sICByZV9BMUNPTCwgcXVpY2tWZXJpZnlSYW5nZUExIF0sXG4gIFsgUkFOR0VfQkVBTSwgIHJlX0ExUk9XLCBxdWlja1ZlcmlmeVJhbmdlQTEgXSxcbiAgWyBSQU5HRV9OQU1FRCwgcmVfTkFNRUQgXVxuXTtcblxuZXhwb3J0IGNvbnN0IHRva2VuSGFuZGxlcnNSZWZzUkMgPSBbXG4gIFsgT1BFUkFUT1IsICAgIC9eIS8gXSxcbiAgWyBQQVRIX1FVT1RFLCAgcmVfUEFUSF9RVU9URSBdLFxuICBbIFBBVEhfQlJBQ0UsICByZV9QQVRIX0JSQUNFIF0sXG4gIFsgUEFUSF9QUkVGSVgsIHJlX1BBVEhfUFJFRklYIF0sXG4gIFsgUkFOR0UsICAgICAgIHJlX1JDUkFOR0UsIHF1aWNrVmVyaWZ5UmFuZ2VSQyBdLFxuICBbIFJBTkdFX0JFQU0sICByZV9SQ1JPVywgcXVpY2tWZXJpZnlSYW5nZVJDIF0sXG4gIFsgUkFOR0VfQkVBTSwgIHJlX1JDQ09MLCBxdWlja1ZlcmlmeVJhbmdlUkMgXSxcbiAgWyBSQU5HRV9OQU1FRCwgcmVfTkFNRUQgXVxuXTtcbiIsImltcG9ydCB7XG4gIEZYX1BSRUZJWCxcbiAgUEFUSF9CUkFDRSxcbiAgUEFUSF9QUkVGSVgsXG4gIFBBVEhfUVVPVEUsXG4gIFJBTkdFLFxuICBSQU5HRV9OQU1FRCxcbiAgUkFOR0VfQkVBTSxcbiAgVU5LTk9XTixcbiAgdG9rZW5IYW5kbGVyc0ExLFxuICB0b2tlbkhhbmRsZXJzUkNcbn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG5jb25zdCBpc1R5cGUgPSAodCwgdHlwZSkgPT4gdCAmJiB0LnR5cGUgPT09IHR5cGU7XG5jb25zdCBpc1JhbmdlT3AgPSB0ID0+IHQgJiYgdC52YWx1ZSA9PT0gJzonO1xuY29uc3QgaXNCYW5nT3AgPSB0ID0+IHQgJiYgdC52YWx1ZSA9PT0gJyEnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VG9rZW5zIChmeCwgdG9rZW5IYW5kbGVycyA9IFtdLCBlbWl0UmFuZ2VzID0gZmFsc2UsIG1lcmdlUmFuZ2VzID0gZmFsc2UpIHtcbiAgY29uc3QgdG9rZW5zID0gW107XG4gIGxldCBwb3MgPSAwO1xuICBjb25zdCBsb29rQmVoaW5kID0gbiA9PiB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIG5dO1xuXG4gIGlmICgvXj0vLnRlc3QoZngpKSB7XG4gICAgY29uc3QgdG9rZW4gPSB7XG4gICAgICB0eXBlOiBGWF9QUkVGSVgsXG4gICAgICB2YWx1ZTogJz0nLFxuICAgICAgLi4uKGVtaXRSYW5nZXMgPyB7IHJhbmdlOiBbIDAsIDEgXSB9IDoge30pXG4gICAgfTtcbiAgICBwb3MrKztcbiAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gIH1cblxuICB3aGlsZSAocG9zIDwgZngubGVuZ3RoKSB7XG4gICAgY29uc3Qgc3RhcnRQb3MgPSBwb3M7XG4gICAgY29uc3QgcyA9IGZ4LnNsaWNlKHBvcyk7XG4gICAgbGV0IHRva2VuVHlwZSA9ICcnO1xuICAgIGxldCB0b2tlblZhbHVlID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbkhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBbIHR5cGUsIHJlVGVzdCwgZm5UZXN0IF0gPSB0b2tlbkhhbmRsZXJzW2ldO1xuICAgICAgY29uc3QgbSA9IHJlVGVzdC5leGVjKHMpO1xuICAgICAgaWYgKG0gJiYgKCFmblRlc3QgfHwgZm5UZXN0KG1bMF0pKSkge1xuICAgICAgICB0b2tlblR5cGUgPSB0eXBlO1xuICAgICAgICB0b2tlblZhbHVlID0gbVswXTtcbiAgICAgICAgcG9zICs9IG1bMF0ubGVuZ3RoO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRva2VuVHlwZSkge1xuICAgICAgdG9rZW5UeXBlID0gVU5LTk9XTjtcbiAgICAgIHRva2VuVmFsdWUgPSBmeFtwb3NdO1xuICAgICAgcG9zKys7XG4gICAgfVxuXG4gICAgbGV0IHRva2VuID0ge1xuICAgICAgdHlwZTogdG9rZW5UeXBlLFxuICAgICAgdmFsdWU6IHRva2VuVmFsdWUsXG4gICAgICAuLi4oZW1pdFJhbmdlcyA/IHsgcmFuZ2U6IFsgc3RhcnRQb3MsIHBvcyBdIH0gOiB7fSlcbiAgICB9O1xuXG4gICAgaWYgKG1lcmdlUmFuZ2VzKSB7XG4gICAgICBpZiAodG9rZW5UeXBlID09PSBSQU5HRSB8fCB0b2tlblR5cGUgPT09IFJBTkdFX05BTUVEIHx8IHRva2VuVHlwZSA9PT0gUkFOR0VfQkVBTSkge1xuICAgICAgICBjb25zdCBtZXJnZSA9IFtdO1xuICAgICAgICAvLyBqb2luIEExOkExIG9yIFJDOlJDLVxuICAgICAgICBpZiAoaXNSYW5nZU9wKGxvb2tCZWhpbmQoMSkpICYmIGlzVHlwZShsb29rQmVoaW5kKDIpLCBSQU5HRSkgJiYgdG9rZW5UeXBlID09PSBSQU5HRSkge1xuICAgICAgICAgIC8vIHNob3VsZCBub3QgYmUgZG9uZSB0aGlzIGlmIGN1cnJlbnQgb3IgbGFzdCByYW5nZXMgYXJlIEE6QSBvciAxOjEsIG9yIFIgb3IgQylcbiAgICAgICAgICBtZXJnZS51bnNoaWZ0KC4uLnRva2Vucy5zcGxpY2UoLTIsIDIpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBqb2luIHByZWZpeGVzXG4gICAgICAgIGlmIChpc0JhbmdPcChsb29rQmVoaW5kKDEpKSkge1xuICAgICAgICAgIGlmIChpc1R5cGUobG9va0JlaGluZCgyKSwgUEFUSF9RVU9URSkgfHwgaXNUeXBlKGxvb2tCZWhpbmQoMiksIFBBVEhfQlJBQ0UpKSB7XG4gICAgICAgICAgICBtZXJnZS51bnNoaWZ0KC4uLnRva2Vucy5zcGxpY2UoLTIsIDIpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXNUeXBlKGxvb2tCZWhpbmQoMiksIFBBVEhfUFJFRklYKSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IGlzVHlwZShsb29rQmVoaW5kKDMpLCBQQVRIX0JSQUNFKSA/IDMgOiAyO1xuICAgICAgICAgICAgbWVyZ2UudW5zaGlmdCguLi50b2tlbnMuc3BsaWNlKC1uLCBuKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHdhbnQgdG8gbWVyZ2U/XG4gICAgICAgIGlmIChtZXJnZS5sZW5ndGgpIHtcbiAgICAgICAgICB0b2tlbiA9IHtcbiAgICAgICAgICAgIHR5cGU6IHRva2VuVHlwZSxcbiAgICAgICAgICAgIHZhbHVlOiBtZXJnZS5tYXAoZCA9PiBkLnZhbHVlKS5qb2luKCcnKSArIHRva2VuVmFsdWUsXG4gICAgICAgICAgICAuLi4oZW1pdFJhbmdlcyA/IHsgcmFuZ2U6IFsgbWVyZ2VbMF0ucmFuZ2VbMF0sIHBvcyBdIH0gOiB7fSlcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgfVxuXG4gIHJldHVybiB0b2tlbnM7XG59XG5cbi8vIEZvcm11bGFzIGNhbiBlaXRoZXIgaGF2ZSBSQyBvciBBMSBzdHlsZSByZWZzLCBub3QgYm90aDogYmVjYXVzZSBDMSBhbmQgUjEgYXJlIGJvdGghXG4vLyBSZWZtb2RlOiBBMSB8IFJDIHwgQW5vc3RpYyBlbWl0IHJhbmdlcyB3aXRoIFJBTkdFXG5leHBvcnQgZnVuY3Rpb24gdG9rZW5pemUgKGZ4LCB7IGVtaXRSYW5nZXMgPSBmYWxzZSwgbWVyZ2VSYW5nZXMgPSB0cnVlLCByMWMxID0gZmFsc2UgfSA9IHt9KSB7XG4gIGNvbnN0IHRva2VuSGFuZGxlcnMgPSByMWMxID8gdG9rZW5IYW5kbGVyc1JDIDogdG9rZW5IYW5kbGVyc0ExO1xuICByZXR1cm4gZ2V0VG9rZW5zKGZ4LCB0b2tlbkhhbmRsZXJzLCBlbWl0UmFuZ2VzLCBtZXJnZVJhbmdlcyk7XG59XG4iLCJpbXBvcnQgeyBGWF9QUkVGSVgsIFBBVEhfQlJBQ0UsIFBBVEhfUFJFRklYLCBQQVRIX1FVT1RFLCBSQU5HRSwgUkFOR0VfTkFNRUQsIFJBTkdFX0JFQU0gfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBnZXRUb2tlbnMgfSBmcm9tICcuL2xleGVyLmpzJztcblxuY29uc3QgdW5xdW90ZSA9IGQgPT4gZC5zbGljZSgxLCAtMSkucmVwbGFjZSgvJycvZywgXCInXCIpO1xuXG5jb25zdCBwUmFuZ2VPcCA9IHQgPT4gdCAmJiB0LnZhbHVlID09PSAnOicgJiYge307XG5jb25zdCBwUmFuZ2UgPSB0ID0+IHQgJiYgdC50eXBlID09PSBSQU5HRSAmJiB7IHIwOiB0LnZhbHVlIH07XG5jb25zdCBwUmFuZ2UyID0gdCA9PiB0ICYmIHQudHlwZSA9PT0gUkFOR0UgJiYgeyByMTogdC52YWx1ZSB9O1xuY29uc3QgcEJhbmcgPSB0ID0+IHQgJiYgdC52YWx1ZSA9PT0gJyEnICYmIHt9O1xuY29uc3QgcEJlYW0gPSB0ID0+IHQgJiYgdC50eXBlID09PSBSQU5HRV9CRUFNICYmIHsgcjA6IHQudmFsdWUgfTtcbmNvbnN0IHBTaGVldCA9IHQgPT4gdCAmJiB0LnR5cGUgPT09IFBBVEhfUFJFRklYICYmIC9eW146XFxcXC8/KltcXF1dezAsMzF9JC8udGVzdCh0LnZhbHVlKSAmJiB7IHNoZWV0TmFtZTogdC52YWx1ZSB9O1xuY29uc3QgcEZpbGUgPSB0ID0+IHQgJiYgdC50eXBlID09PSBQQVRIX0JSQUNFICYmIHsgd29ya2Jvb2tOYW1lOiB0LnZhbHVlLnNsaWNlKDEsIC0xKSB9O1xuY29uc3QgcEZpbGUyID0gdCA9PiB0ICYmIHQudHlwZSA9PT0gUEFUSF9QUkVGSVggJiYgeyB3b3JrYm9va05hbWU6IHQudmFsdWUgfTtcbmNvbnN0IHBOYW1lZCA9IHQgPT4gdCAmJiB0LnR5cGUgPT09IFJBTkdFX05BTUVEICYmIHsgbmFtZTogdC52YWx1ZSB9O1xuXG5jb25zdCBwUXVvdGVkID0gdCA9PiB7XG4gIGlmICh0ICYmIHQudHlwZSA9PT0gUEFUSF9RVU9URSkge1xuICAgIGNvbnN0IG0gPSAvKD86XFxbKC4rPylcXF0pPyhbXltcXF1dKz8pJC8uZXhlYyh1bnF1b3RlKHQudmFsdWUpKTtcbiAgICBpZiAobSkge1xuICAgICAgY29uc3QgWyAsIGZpbGUsIHNoZWV0IF0gPSBtO1xuICAgICAgaWYgKCFzaGVldCB8fCAvXlteOlxcXFwvPypbXFxdXXswLDMxfSQvLnRlc3Qoc2hlZXQpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgd29ya2Jvb2tOYW1lOiBmaWxlIHx8ICcnLFxuICAgICAgICAgIHNoZWV0TmFtZTogc2hlZXQgfHwgJydcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5jb25zdCBwUXVvdGVkMiA9IHQgPT4gdCAmJiB0LnR5cGUgPT09IFBBVEhfUVVPVEUgJiYgeyB3b3JrYm9va05hbWU6IHVucXVvdGUodC52YWx1ZSkgfTtcblxuY29uc3QgdmFsaWRSdW5zID0gW1xuICBbIHBSYW5nZSBdLFxuICBbIHBSYW5nZSwgcFJhbmdlT3AsIHBSYW5nZTIgXSxcbiAgWyBwQmVhbSBdLFxuICBbIHBRdW90ZWQsIHBCYW5nLCBwUmFuZ2UgXSxcbiAgWyBwUXVvdGVkLCBwQmFuZywgcFJhbmdlLCBwUmFuZ2VPcCwgcFJhbmdlMiBdLFxuICBbIHBRdW90ZWQsIHBCYW5nLCBwQmVhbSBdLFxuICBbIHBTaGVldCwgcEJhbmcsIHBSYW5nZSBdLFxuICBbIHBTaGVldCwgcEJhbmcsIHBSYW5nZSwgcFJhbmdlT3AsIHBSYW5nZTIgXSxcbiAgWyBwU2hlZXQsIHBCYW5nLCBwQmVhbSBdLFxuICBbIHBGaWxlLCBwU2hlZXQsIHBCYW5nLCBwUmFuZ2UgXSxcbiAgWyBwRmlsZSwgcFNoZWV0LCBwQmFuZywgcFJhbmdlLCBwUmFuZ2VPcCwgcFJhbmdlMiBdLFxuICBbIHBGaWxlLCBwU2hlZXQsIHBCYW5nLCBwQmVhbSBdXG5dO1xuXG5jb25zdCB2YWxpZFJ1bnNOYW1lZCA9IHZhbGlkUnVucy5jb25jYXQoW1xuICBbIHBOYW1lZCBdLFxuICBbIHBGaWxlMiwgcEJhbmcsIHBOYW1lZCBdLFxuICBbIHBRdW90ZWQyLCBwQmFuZywgcE5hbWVkIF1cbl0pO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSZWYgKHJlZiwgYWxsb3dfbmFtZWQgPSB0cnVlLCB0b2tlbkhhbmRsZXJzID0gW10pIHtcbiAgY29uc3QgdG9rZW5zID0gZ2V0VG9rZW5zKHJlZiwgdG9rZW5IYW5kbGVycywgZmFsc2UsIGZhbHNlKTtcbiAgY29uc3QgcmVmRGF0YSA9IHtcbiAgICBzaGVldE5hbWU6ICcnLFxuICAgIHdvcmtib29rTmFtZTogJycsXG4gICAgcjA6ICcnLFxuICAgIHIxOiAnJyxcbiAgICBuYW1lOiAnJ1xuICB9O1xuICAvLyBkaXNjYXJkIHRoZSBcIj1cIi1wcmVmaXggaWYgaXQgaXMgdGhlcmVcbiAgaWYgKHRva2Vucy5sZW5ndGggJiYgdG9rZW5zWzBdLnR5cGUgPT09IEZYX1BSRUZJWCkge1xuICAgIHRva2Vucy5zaGlmdCgpO1xuICB9XG4gIGNvbnN0IHJ1bnMgPSBhbGxvd19uYW1lZCA/IHZhbGlkUnVuc05hbWVkIDogdmFsaWRSdW5zO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJ1bnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkYXRhID0geyAuLi5yZWZEYXRhIH07XG4gICAgaWYgKHJ1bnNbaV0ubGVuZ3RoID09PSB0b2tlbnMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB2YWxpZCA9IHJ1bnNbaV0uZXZlcnkoKHBhcnNlLCBqKSA9PiB7XG4gICAgICAgIGNvbnN0IGQgPSBwYXJzZSh0b2tlbnNbal0pO1xuICAgICAgICBPYmplY3QuYXNzaWduKGRhdGEsIGQpO1xuICAgICAgICByZXR1cm4gZDtcbiAgICAgIH0pO1xuICAgICAgaWYgKHZhbGlkKSB7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbiIsImltcG9ydCB7IE1BWF9ST1dTLCBNQVhfQ09MUywgdG9rZW5IYW5kbGVyc1JlZnNBMSB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IHBhcnNlUmVmIH0gZnJvbSAnLi9wYXJzZVJlZi5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tQ29sIChjb2xTdHIpIHtcbiAgY29uc3QgYyA9IChjb2xTdHIgfHwgJycpLnRvVXBwZXJDYXNlKCk7XG4gIGxldCBkID0gMDtcbiAgbGV0IGkgPSAwO1xuICBmb3IgKDsgaSAhPT0gYy5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGNociA9IGMuY2hhckNvZGVBdChpKTtcbiAgICBpZiAoY2hyID49IDY1ICYmIGNociA8PSA5MCkgeyAvLyBvbWl0cyBhbnkgbm9uIEEtWiBjaGFyYWN0ZXJcbiAgICAgIGQgPSAyNiAqIGQgKyBjaHIgLSA2NDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGQgLSAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9Db2wgKGxlZnQpIHtcbiAgbGV0IG4gPSBsZWZ0O1xuICBsZXQgYyA9ICcnO1xuICB3aGlsZSAobiA+PSAwKSB7XG4gICAgYyA9IFN0cmluZy5mcm9tQ2hhckNvZGUobiAlIDI2ICsgNjUpICsgYztcbiAgICBuID0gTWF0aC5mbG9vcihuIC8gMjYpIC0gMTtcbiAgfVxuICByZXR1cm4gYztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3cgKHJvd1N0cikge1xuICByZXR1cm4gK3Jvd1N0ciAtIDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1JvdyAodG9wKSB7XG4gIHJldHVybiBTdHJpbmcodG9wICsgMSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1JlbGF0aXZlIChyYW5nZSkge1xuICBjb25zdCB7IHRvcCwgbGVmdCwgYm90dG9tLCByaWdodCB9ID0gcmFuZ2U7XG4gIHJldHVybiB7IHRvcCwgbGVmdCwgYm90dG9tLCByaWdodCwgJGxlZnQ6IGZhbHNlLCAkcmlnaHQ6IGZhbHNlLCAkdG9wOiBmYWxzZSwgJGJvdHRvbTogZmFsc2UgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvQWJzb2x1dGUgKHJhbmdlKSB7XG4gIGNvbnN0IHsgdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0IH0gPSByYW5nZTtcbiAgcmV0dXJuIHsgdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0LCAkbGVmdDogdHJ1ZSwgJHJpZ2h0OiB0cnVlLCAkdG9wOiB0cnVlLCAkYm90dG9tOiB0cnVlIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0ExIChyYW5nZSkge1xuICBjb25zdCB0b0FicyA9IGQgPT4gKGQgPyAnJCcgOiAnJyk7XG4gIGNvbnN0IHsgdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0LCAkbGVmdCwgJHJpZ2h0LCAkdG9wLCAkYm90dG9tIH0gPSByYW5nZTtcbiAgLy8gQTpBXG4gIGlmICh0b3AgPT09IDAgJiYgYm90dG9tID09PSBNQVhfUk9XUykge1xuICAgIHJldHVybiB0b0FicygkbGVmdCkgKyB0b0NvbChsZWZ0KSArICc6JyArIHRvQWJzKCRyaWdodCkgKyB0b0NvbChyaWdodCk7XG4gIH1cbiAgLy8gMToxXG4gIGlmIChsZWZ0ID09PSAwICYmIHJpZ2h0ID09PSBNQVhfQ09MUykge1xuICAgIHJldHVybiB0b0FicygkdG9wKSArIHRvUm93KHRvcCkgKyAnOicgKyB0b0FicygkYm90dG9tKSArIHRvUm93KGJvdHRvbSk7XG4gIH1cbiAgLy8gQTE6QTFcbiAgaWYgKHJpZ2h0ICE9IG51bGwgJiYgYm90dG9tICE9IG51bGwgJiYgKHJpZ2h0ICE9PSBsZWZ0IHx8IGJvdHRvbSAhPT0gdG9wKSkge1xuICAgIHJldHVybiB0b0FicygkbGVmdCkgKyB0b0NvbChsZWZ0KSArIHRvQWJzKCR0b3ApICsgdG9Sb3codG9wKSArICc6JyArIHRvQWJzKCRyaWdodCkgKyB0b0NvbChyaWdodCkgKyB0b0FicygkYm90dG9tKSArIHRvUm93KGJvdHRvbSk7XG4gIH1cbiAgLy8gQTFcbiAgcmV0dXJuIHRvQWJzKCRsZWZ0KSArIHRvQ29sKGxlZnQpICsgdG9BYnMoJHRvcCkgKyB0b1Jvdyh0b3ApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZnJvbUExIChyYW5nZVN0cikge1xuICBsZXQgbTtcbiAgbGV0IHRvcCA9IDA7XG4gIGxldCBsZWZ0ID0gMDtcbiAgbGV0IGJvdHRvbSA9IE1BWF9ST1dTO1xuICBsZXQgcmlnaHQgPSBNQVhfQ09MUztcbiAgbGV0ICR0b3AgPSBmYWxzZTtcbiAgbGV0ICRsZWZ0ID0gZmFsc2U7XG4gIGxldCAkYm90dG9tID0gZmFsc2U7XG4gIGxldCAkcmlnaHQgPSBmYWxzZTtcbiAgLy8gQTpBXG4gIGlmICgobSA9IC9eKFxcJD8pKFtBLVpdezEsM30pOihcXCQ/KShbQS1aXXsxLDN9KSQvLmV4ZWMocmFuZ2VTdHIpKSkge1xuICAgIGNvbnN0IGEgPSBmcm9tQ29sKG1bMl0pO1xuICAgIGNvbnN0IGIgPSBmcm9tQ29sKG1bNF0pO1xuICAgIGxlZnQgPSBNYXRoLm1pbihhLCBiKTtcbiAgICByaWdodCA9IE1hdGgubWF4KGEsIGIpO1xuICAgICRsZWZ0ID0gISFtW2EgPD0gYiA/IDEgOiAzXTtcbiAgICAkcmlnaHQgPSAhIW1bYSA8PSBiID8gMyA6IDFdO1xuICAgICR0b3AgPSB0cnVlO1xuICAgICRib3R0b20gPSB0cnVlO1xuICAgIHJldHVybiB7IHRvcCwgbGVmdCwgYm90dG9tLCByaWdodCwgJHRvcCwgJGxlZnQsICRib3R0b20sICRyaWdodCB9O1xuICB9XG4gIC8vIDE6MVxuICBlbHNlIGlmICgobSA9IC9eKFxcJD8pKFsxLTldXFxkezAsNn0pOihcXCQ/KShbMS05XVxcZHswLDZ9KSQvLmV4ZWMocmFuZ2VTdHIpKSkge1xuICAgIGNvbnN0IGEgPSBmcm9tUm93KG1bMl0pO1xuICAgIGNvbnN0IGIgPSBmcm9tUm93KG1bNF0pO1xuICAgIHRvcCA9IE1hdGgubWluKGEsIGIpO1xuICAgIGJvdHRvbSA9IE1hdGgubWF4KGEsIGIpO1xuICAgICR0b3AgPSAhIW1bYSA8PSBiID8gMSA6IDNdO1xuICAgICRib3R0b20gPSAhIW1bYSA8PSBiID8gMyA6IDFdO1xuICAgICRsZWZ0ID0gdHJ1ZTtcbiAgICAkcmlnaHQgPSB0cnVlO1xuICAgIHJldHVybiB7IHRvcCwgbGVmdCwgYm90dG9tLCByaWdodCwgJHRvcCwgJGxlZnQsICRib3R0b20sICRyaWdodCB9O1xuICB9XG4gIC8vIEExIHwgQTE6QjJcbiAgZWxzZSB7XG4gICAgY29uc3QgWyBwYXJ0MSwgcGFydDIgXSA9IHJhbmdlU3RyLnNwbGl0KCc6Jyk7XG4gICAgaWYgKChtID0gL14oXFwkPykoW0EtWl17MSwzfSkoXFwkPykoWzEtOV1cXGR7MCw2fSkkL2kuZXhlYyhwYXJ0MSkpKSB7XG4gICAgICBsZWZ0ID0gZnJvbUNvbChtWzJdKTtcbiAgICAgIHRvcCA9IGZyb21Sb3cobVs0XSk7XG4gICAgICAkbGVmdCA9ICEhbVsxXTtcbiAgICAgICR0b3AgPSAhIW1bM107XG4gICAgICBpZiAocGFydDIgJiYgKG0gPSAvXihcXCQ/KShbQS1aXXsxLDN9KShcXCQ/KShbMS05XVxcZHswLDZ9KSQvaS5leGVjKHBhcnQyKSkpIHtcbiAgICAgICAgcmlnaHQgPSBmcm9tQ29sKG1bMl0pO1xuICAgICAgICBib3R0b20gPSBmcm9tUm93KG1bNF0pO1xuICAgICAgICAkcmlnaHQgPSAhIW1bMV07XG4gICAgICAgICRib3R0b20gPSAhIW1bM107XG4gICAgICAgIC8vIG5lZWQgdG8gZmxpcD9cbiAgICAgICAgaWYgKGJvdHRvbSA8IHRvcCkge1xuICAgICAgICAgIFsgdG9wLCBib3R0b20sICR0b3AsICRib3R0b20gXSA9IFsgYm90dG9tLCB0b3AsICRib3R0b20sICR0b3AgXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmlnaHQgPCBsZWZ0KSB7XG4gICAgICAgICAgWyBsZWZ0LCByaWdodCwgJGxlZnQsICRyaWdodCBdID0gWyByaWdodCwgbGVmdCwgJHJpZ2h0LCAkbGVmdCBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgYm90dG9tID0gdG9wO1xuICAgICAgICByaWdodCA9IGxlZnQ7XG4gICAgICAgICRib3R0b20gPSAkdG9wO1xuICAgICAgICAkcmlnaHQgPSAkbGVmdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHRvcCwgbGVmdCwgYm90dG9tLCByaWdodCwgJHRvcCwgJGxlZnQsICRib3R0b20sICRyaWdodCB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQTFSZWYgKHJlZiwgYWxsb3dfbmFtZWQgPSB0cnVlKSB7XG4gIGNvbnN0IGQgPSBwYXJzZVJlZihyZWYsIGFsbG93X25hbWVkLCB0b2tlbkhhbmRsZXJzUmVmc0ExKTtcbiAgaWYgKGQgJiYgKGQucjAgfHwgZC5uYW1lKSkge1xuICAgIGxldCByYW5nZSA9IG51bGw7XG4gICAgaWYgKGQucjApIHtcbiAgICAgIHJhbmdlID0gZC5yMSA/IGZyb21BMShkLnIwICsgJzonICsgZC5yMSkgOiBmcm9tQTEoZC5yMCk7XG4gICAgfVxuICAgIGlmIChkLm5hbWUgfHwgcmFuZ2UpIHtcbiAgICAgIGQucmFuZ2UgPSByYW5nZTtcbiAgICAgIGRlbGV0ZSBkLnIwO1xuICAgICAgZGVsZXRlIGQucjE7XG4gICAgICByZXR1cm4gZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZnJvbUNvbCxcbiAgdG9Db2wsXG4gIHRvUmVsYXRpdmUsXG4gIHRvQWJzb2x1dGUsXG4gIHRvOiB0b0ExLFxuICBmcm9tOiBmcm9tQTEsXG4gIHBhcnNlOiBwYXJzZUExUmVmXG59O1xuIiwiaW1wb3J0IHsgUkFOR0UsIFJBTkdFX0JFQU0sIFVOS05PV04gfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBwYXJzZUExUmVmLCB0b1JlbGF0aXZlLCB0b0ExIH0gZnJvbSAnLi9hMS5qcyc7XG5cbmZ1bmN0aW9uIGdldElEZXIgKCkge1xuICBsZXQgaSA9IDE7XG4gIHJldHVybiAoKSA9PiAnZnhnJyArIChpKyspO1xufVxuXG4vLyB3aGVuIGNvbnRleHQgaXMgU2hlZXQxLCB3ZSBzaG91bGQgY29uc2lkZXIgU2hlZXQhQTEgPT0gQTFcbmV4cG9ydCBmdW5jdGlvbiBhZGRNZXRhICh0b2tlbnMsIHsgc2hlZXROYW1lID0gJycsIHdvcmtib29rTmFtZSA9ICcnIH0gPSB7fSkge1xuICBjb25zdCBwYXJlblN0YWNrID0gW107XG4gIGxldCBhcnJheVN0YXJ0ID0gbnVsbDtcbiAgY29uc3QgYTFNYXAgPSB7fTtcbiAgY29uc3QgdWlkID0gZ2V0SURlcigpO1xuXG4gIHRva2Vucy5mb3JFYWNoKHRva2VuID0+IHtcbiAgICBpZiAodG9rZW4udmFsdWUgPT09ICcoJykge1xuICAgICAgdG9rZW4uZGVwdGggPSBwYXJlblN0YWNrLmxlbmd0aDtcbiAgICAgIHBhcmVuU3RhY2sucHVzaCh0b2tlbik7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRva2VuLnZhbHVlID09PSAnKScpIHtcbiAgICAgIGNvbnN0IGNvdW50ZXIgPSBwYXJlblN0YWNrLnBvcCgpO1xuICAgICAgaWYgKGNvdW50ZXIpIHtcbiAgICAgICAgY29uc3QgcGFpcklkID0gdWlkKCk7XG4gICAgICAgIHRva2VuLmdyb3VwSWQgPSBwYWlySWQ7XG4gICAgICAgIHRva2VuLmRlcHRoID0gY291bnRlci5kZXB0aDtcbiAgICAgICAgY291bnRlci5ncm91cElkID0gcGFpcklkO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRva2VuLmVycm9yID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodG9rZW4udmFsdWUgPT09ICd7Jykge1xuICAgICAgaWYgKCFhcnJheVN0YXJ0KSB7XG4gICAgICAgIGFycmF5U3RhcnQgPSB0b2tlbjtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0b2tlbi5lcnJvciA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKHRva2VuLnZhbHVlID09PSAnfScpIHtcbiAgICAgIGlmIChhcnJheVN0YXJ0KSB7XG4gICAgICAgIGNvbnN0IHBhaXJJZCA9IHVpZCgpO1xuICAgICAgICB0b2tlbi5ncm91cElkID0gcGFpcklkO1xuICAgICAgICBhcnJheVN0YXJ0Lmdyb3VwSWQgPSBwYWlySWQ7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdG9rZW4uZXJyb3IgPSB0cnVlO1xuICAgICAgfVxuICAgICAgYXJyYXlTdGFydCA9IG51bGw7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT09IFJBTkdFIHx8IHRva2VuLnR5cGUgPT09IFJBTkdFX0JFQU0pIHtcbiAgICAgIGNvbnN0IHJlZiA9IHBhcnNlQTFSZWYodG9rZW4udmFsdWUsIGZhbHNlKTtcbiAgICAgIGNvbnN0IGExID0gcmVmICYmIChgWyR7cmVmLndvcmtib29rTmFtZSB8fCB3b3JrYm9va05hbWV9XSR7cmVmLnNoZWV0TmFtZSB8fCBzaGVldE5hbWV9ISR7cmVmLnJhbmdlID8gdG9BMSh0b1JlbGF0aXZlKHJlZi5yYW5nZSkpIDogcmVmLm5hbWV9YCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChhMSkge1xuICAgICAgICBpZiAoYTEgaW4gYTFNYXApIHtcbiAgICAgICAgICB0b2tlbi5ncm91cElkID0gYTFNYXBbYTFdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRva2VuLmdyb3VwSWQgPSB1aWQoKTtcbiAgICAgICAgICBhMU1hcFthMV0gPSB0b2tlbi5ncm91cElkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT09IFVOS05PV04pIHtcbiAgICAgIHRva2VuLmVycm9yID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdG9rZW5zO1xufVxuIiwiLypcbiAgUkMgbm90YXRpb24gd29ya3MgZGlmZmVyZW50bHkgZnJvbSBBMSBpbiB0aGF0IHdlIGNhbid0IG1lcmdlIHN0YXRpYyByZWZlcmVuY2VzIGpvaW5lZCBieSBgOmAuXG4gIE1lcmdpbmcgY2FuIG9ubHkgd29yayBiZXR3ZWVuIHJlZmVyZW5jZXMgdGhhdCBhcmUgcmVsYXRpdmUvYWJzb2x1dGUgb24gdGhlIHNhbWUgYXhlcywgc286XG4gIFIxQzE6UjJDMiB3aWxsIHdvcmssIFJbMV1DMTpSWzJdQzIgd2lsbCBhbHNvIHdvcmssIGJ1dCBSWzFdQ1sxXTpSMkMyIGNhbm5vdCBiZSByZXByZXNlbnRlZFxuICBzaW1wbHkgYnkgYSByZWN0YW5nbGUgYXMgd2l0aG91dCBrbm93aW5nIHRoZSBjZWxsIGNvbnRleHQuXG4qL1xuXG5pbXBvcnQgeyBNQVhfUk9XUywgTUFYX0NPTFMsIHRva2VuSGFuZGxlcnNSZWZzUkMgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBwYXJzZVJlZiB9IGZyb20gJy4vcGFyc2VSZWYuanMnO1xuXG5mdW5jdGlvbiB0b0Nvb3JkICh2YWx1ZSwgaXNBYnMpIHtcbiAgaWYgKGlzQWJzKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSArIDEpO1xuICB9XG4gIHJldHVybiB2YWx1ZSA/ICdbJyArIHZhbHVlICsgJ10nIDogJyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1JDIChyYW5nZSkge1xuICBjb25zdCB7IHIwLCBjMCwgcjEsIGMxLCAkYzAsICRjMSwgJHIwLCAkcjEgfSA9IHJhbmdlO1xuICAvLyBDOkNcbiAgaWYgKHIwID09PSAwICYmIHIxID09PSBNQVhfUk9XUykge1xuICAgIGNvbnN0IGEgPSB0b0Nvb3JkKGMwLCAkYzApO1xuICAgIGNvbnN0IGIgPSB0b0Nvb3JkKGMxLCAkYzEpO1xuICAgIHJldHVybiAnQycgKyAoYSA9PT0gYiA/IGEgOiBhICsgJzpDJyArIGIpO1xuICB9XG4gIC8vIFI6UlxuICBpZiAoYzAgPT09IDAgJiYgYzEgPT09IE1BWF9DT0xTKSB7XG4gICAgY29uc3QgYSA9IHRvQ29vcmQocjAsICRyMCk7XG4gICAgY29uc3QgYiA9IHRvQ29vcmQocjEsICRyMSk7XG4gICAgcmV0dXJuICdSJyArIChhID09PSBiID8gYSA6IGEgKyAnOlInICsgYik7XG4gIH1cbiAgLy8gUkM6UkNcbiAgY29uc3Qgc19yMCA9IHRvQ29vcmQocjAsICRyMCk7XG4gIGNvbnN0IHNfcjEgPSB0b0Nvb3JkKHIxLCAkcjEpO1xuICBjb25zdCBzX2MwID0gdG9Db29yZChjMCwgJGMwKTtcbiAgY29uc3Qgc19jMSA9IHRvQ29vcmQoYzEsICRjMSk7XG4gIGlmIChzX3IwICE9PSBzX3IxIHx8IHNfYzAgIT09IHNfYzEpIHtcbiAgICByZXR1cm4gJ1InICsgc19yMCArICdDJyArIHNfYzAgKyAnOlInICsgc19yMSArICdDJyArIHNfYzE7XG4gIH1cbiAgLy8gUkNcbiAgcmV0dXJuICdSJyArIHNfcjAgKyAnQycgKyBzX2MwO1xufVxuXG5mdW5jdGlvbiBwYXJzZVJDUGFydCAocmVmKSB7XG4gIGxldCByMCA9IDA7XG4gIGxldCBjMCA9IDA7XG4gIGxldCByMSA9IE1BWF9ST1dTO1xuICBsZXQgYzEgPSBNQVhfQ09MUztcbiAgbGV0ICRyMCA9IGZhbHNlO1xuICBsZXQgJGMwID0gZmFsc2U7XG4gIGxldCAkcjEgPSBmYWxzZTtcbiAgbGV0ICRjMSA9IGZhbHNlO1xuICAvLyBSIHBhcnRcbiAgY29uc3Qgcm0gPSAvXlIoPzpcXFsoWystXT9cXGQrKVxcXXwoXFxkKykpPy8uZXhlYyhyZWYpO1xuICBpZiAocm0pIHtcbiAgICBpZiAocm1bMV0pIHtcbiAgICAgIHIwID0gcGFyc2VJbnQocm1bMV0sIDEwKTtcbiAgICB9XG4gICAgZWxzZSBpZiAocm1bMl0pIHtcbiAgICAgIHIwID0gcGFyc2VJbnQocm1bMl0sIDEwKSAtIDE7XG4gICAgICAkcjAgPSB0cnVlO1xuICAgIH1cbiAgICByMSA9IHIwO1xuICAgICRyMSA9ICRyMDtcbiAgICByZWYgPSByZWYuc2xpY2Uocm1bMF0ubGVuZ3RoKTtcbiAgfVxuICBlbHNlIHtcbiAgICAvLyByMCA9IDAsIHIxID0gTUFYX1JPV1NcbiAgICAkcjAgPSB0cnVlO1xuICAgICRyMSA9IHRydWU7XG4gIH1cbiAgLy8gQyBwYXJ0XG4gIGNvbnN0IGNtID0gL15DKD86XFxbKFsrLV0/XFxkKylcXF18KFxcZCspKT8vLmV4ZWMocmVmKTtcbiAgaWYgKGNtKSB7XG4gICAgaWYgKGNtWzFdKSB7XG4gICAgICBjMCA9IHBhcnNlSW50KGNtWzFdLCAxMCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNtWzJdKSB7XG4gICAgICBjMCA9IHBhcnNlSW50KGNtWzJdLCAxMCkgLSAxO1xuICAgICAgJGMwID0gdHJ1ZTtcbiAgICB9XG4gICAgYzEgPSBjMDtcbiAgICAkYzEgPSAkYzA7XG4gICAgcmVmID0gcmVmLnNsaWNlKGNtWzBdLmxlbmd0aCk7XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gYzAgPSAwLCBjMSA9IE1BWF9DT0xTXG4gICAgJGMwID0gdHJ1ZTtcbiAgICAkYzEgPSB0cnVlO1xuICB9XG4gIC8vIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcGFydCAoYW5kIG5vdGhpbmcgbW9yZSlcbiAgaWYgKCghcm0gJiYgIWNtKSB8fCByZWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHsgcjAsIGMwLCByMSwgYzEsICRyMCwgJGMwLCAkcjEsICRjMSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJDIChyZWYpIHtcbiAgY29uc3QgWyBwYXJ0MSwgcGFydDIgXSA9IHJlZi5zcGxpdCgnOicsIDIpO1xuICBjb25zdCByYW5nZSA9IHBhcnNlUkNQYXJ0KHBhcnQxKTtcbiAgaWYgKCFyYW5nZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChyYW5nZSAmJiBwYXJ0Mikge1xuICAgIGNvbnN0IGV4dGVuZFRvID0gcGFyc2VSQ1BhcnQocGFydDIpO1xuICAgIGlmIChleHRlbmRUbykge1xuICAgICAgLy8gTm90ZTogUlstMV1DWy0xXTpSMUMxIGlzIG9ubHkgbWVhbmluZ2Z1bCBvbmNlIHdlIGhhdmUgYW4gYW5jaG9yXG4gICAgICByYW5nZS5yMSA9IGV4dGVuZFRvLnIxO1xuICAgICAgcmFuZ2UuYzEgPSBleHRlbmRUby5jMTtcbiAgICAgIHJhbmdlLiRyMSA9IGV4dGVuZFRvLiRyMTtcbiAgICAgIHJhbmdlLiRjMSA9IGV4dGVuZFRvLiRjMTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJhbmdlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSQ1JlZiAocmVmLCBhbGxvd19uYW1lZCA9IHRydWUpIHtcbiAgY29uc3QgZCA9IHBhcnNlUmVmKHJlZiwgYWxsb3dfbmFtZWQsIHRva2VuSGFuZGxlcnNSZWZzUkMpO1xuICBpZiAoZCAmJiAoZC5yMCB8fCBkLm5hbWUpKSB7XG4gICAgY29uc3QgcmFuZ2UgPSBkLnIxID8gZnJvbVJDKGQucjAgKyAnOicgKyBkLnIxKSA6IGZyb21SQyhkLnIwKTtcbiAgICBpZiAoZC5uYW1lIHx8IHJhbmdlKSB7XG4gICAgICBkLnJhbmdlID0gcmFuZ2U7XG4gICAgICBkZWxldGUgZC5yMDtcbiAgICAgIGRlbGV0ZSBkLnIxO1xuICAgICAgcmV0dXJuIGQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHRvOiB0b1JDLFxuICBmcm9tOiBmcm9tUkMsXG4gIHBhcnNlOiBwYXJzZVJDUmVmXG59O1xuIiwiaW1wb3J0IHsgUkFOR0UsIFJBTkdFX0JFQU0sIE1BWF9ST1dTLCBNQVhfQ09MUyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGZyb21BMSwgdG9BMSB9IGZyb20gJy4vYTEuanMnO1xuaW1wb3J0IHsgZnJvbVJDLCB0b1JDIH0gZnJvbSAnLi9yYy5qcyc7XG5pbXBvcnQgeyB0b2tlbml6ZSB9IGZyb20gJy4vbGV4ZXIuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlVG9SQyAoZngsIGFuY2hvckNlbGwpIHtcbiAgY29uc3QgeyB0b3AsIGxlZnQgfSA9IGZyb21BMShhbmNob3JDZWxsKTtcbiAgY29uc3QgaXNTdHJpbmcgPSB0eXBlb2YgZnggPT09ICdzdHJpbmcnO1xuXG4gIGNvbnN0IHRva2VucyA9IGlzU3RyaW5nXG4gICAgPyB0b2tlbml6ZShmeCwgeyBlbWl0UmFuZ2VzOiBmYWxzZSwgbWVyZ2VSYW5nZXM6IGZhbHNlLCByMWMyOiBmYWxzZSB9KVxuICAgIDogZng7XG5cbiAgdG9rZW5zLmZvckVhY2godG9rZW4gPT4ge1xuICAgIGlmICh0b2tlbi50eXBlID09PSBSQU5HRSkge1xuICAgICAgY29uc3QgcmFuZ2UgPSB7fTtcbiAgICAgIGNvbnN0IGQgPSBmcm9tQTEodG9rZW4udmFsdWUpO1xuXG4gICAgICByYW5nZS5yMCA9IGQuJHRvcCA/IGQudG9wIDogZC50b3AgLSB0b3A7XG4gICAgICByYW5nZS4kcjAgPSBkLiR0b3A7XG4gICAgICByYW5nZS5yMSA9IGQuJGJvdHRvbSA/IGQuYm90dG9tIDogZC5ib3R0b20gLSB0b3A7XG4gICAgICByYW5nZS4kcjEgPSBkLiRib3R0b207XG5cbiAgICAgIHJhbmdlLmMwID0gZC4kbGVmdCA/IGQubGVmdCA6IGQubGVmdCAtIGxlZnQ7XG4gICAgICByYW5nZS4kYzAgPSBkLiRsZWZ0O1xuICAgICAgcmFuZ2UuYzEgPSBkLiRyaWdodCA/IGQucmlnaHQgOiBkLnJpZ2h0IC0gbGVmdDtcbiAgICAgIHJhbmdlLiRjMSA9IGQuJHJpZ2h0O1xuXG4gICAgICAvLyBjb25zb2xlLmVycm9yKHRva2VuLnZhbHVlLCBkLCByYW5nZSwgWyB0b3AsIGxlZnQgXSk7XG4gICAgICB0b2tlbi52YWx1ZSA9IHRvUkMocmFuZ2UpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0b2tlbi50eXBlID09PSBSQU5HRV9CRUFNKSB7XG4gICAgICBjb25zdCByYW5nZSA9IHt9O1xuICAgICAgY29uc3QgZCA9IGZyb21BMSh0b2tlbi52YWx1ZSk7XG5cbiAgICAgIHJhbmdlLnIwID0gZC4kdG9wID8gZC50b3AgOiBkLnRvcCAtIHRvcDtcbiAgICAgIHJhbmdlLiRyMCA9IGQuJHRvcDtcbiAgICAgIHJhbmdlLnIxID0gZC4kYm90dG9tID8gZC5ib3R0b20gOiBkLmJvdHRvbSAtIHRvcDtcbiAgICAgIHJhbmdlLiRyMSA9IGQuJGJvdHRvbTtcblxuICAgICAgcmFuZ2UuYzAgPSBkLiRsZWZ0ID8gZC5sZWZ0IDogZC5sZWZ0IC0gbGVmdDtcbiAgICAgIHJhbmdlLiRjMCA9IGQuJGxlZnQ7XG4gICAgICByYW5nZS5jMSA9IGQuJHJpZ2h0ID8gZC5yaWdodCA6IGQucmlnaHQgLSBsZWZ0O1xuICAgICAgcmFuZ2UuJGMxID0gZC4kcmlnaHQ7XG5cbiAgICAgIHRva2VuLnZhbHVlID0gdG9SQyhyYW5nZSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gaXNTdHJpbmdcbiAgICA/IHRva2Vucy5tYXAoZCA9PiBkLnZhbHVlKS5qb2luKCcnKVxuICAgIDogdG9rZW5zO1xufVxuXG5mdW5jdGlvbiB0b0ZpeGVkICh2YWwsIGFicywgYmFzZSwgbWF4KSB7XG4gIGxldCB2ID0gdmFsO1xuICBpZiAoIWFicykge1xuICAgIHYgPSBiYXNlICsgdmFsO1xuICAgIC8vIEV4Y2VsIFwid3JhcHMgYXJvdW5kXCIgd2hlbiB2YWx1ZSBnb2VzIG91dCBvZiBsb3dlciBib3VuZHMuXG4gICAgLy8gSXQncyBhIGJpdCBxdWlya3kgb24gZW50cnkgYXMgRXhjZWwgd2FudHMgdG8gcmUtcmV3aXRlIHRoZVxuICAgIC8vIHJlZmVyZW5jZXMgYnV0IGJlaGF2aW91ciBpcyBjb25zaXN0ZW50IHdpdGggSU5ESVJFQ1Q6XG4gICAgLy8gLi4uIEluIEExOiBSQ1stMV0gPT4gUjFDWzE2MzgzXS5cbiAgICBpZiAodiA8IDApIHtcbiAgICAgIHYgPSBtYXggKyB2ICsgMTtcbiAgICB9XG4gICAgLy8gLi4uIEluIEIxOiA9UkNbMTYzODNdID0+ID1SQ1stMV1cbiAgICBpZiAodiA+IG1heCkge1xuICAgICAgdiAtPSBtYXggKyAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZVRvQTEgKGZ4LCBhbmNob3JDZWxsKSB7XG4gIGNvbnN0IGFuY2hvciA9IGZyb21BMShhbmNob3JDZWxsKTtcbiAgY29uc3QgaXNTdHJpbmcgPSB0eXBlb2YgZnggPT09ICdzdHJpbmcnO1xuXG4gIGNvbnN0IHRva2VucyA9IGlzU3RyaW5nXG4gICAgPyB0b2tlbml6ZShmeCwgeyBlbWl0UmFuZ2VzOiBmYWxzZSwgbWVyZ2VSYW5nZXM6IGZhbHNlLCByMWMxOiB0cnVlIH0pXG4gICAgOiBmeDtcblxuICB0b2tlbnMuZm9yRWFjaCh0b2tlbiA9PiB7XG4gICAgaWYgKHRva2VuLnR5cGUgPT09IFJBTkdFIHx8IHRva2VuLnR5cGUgPT09IFJBTkdFX0JFQU0pIHtcbiAgICAgIGNvbnN0IHJhbmdlID0ge307XG4gICAgICBjb25zdCBkID0gZnJvbVJDKHRva2VuLnZhbHVlKTtcbiAgICAgIGNvbnN0IHIwID0gdG9GaXhlZChkLnIwLCBkLiRyMCwgYW5jaG9yLnRvcCwgTUFYX1JPV1MpO1xuICAgICAgY29uc3QgcjEgPSB0b0ZpeGVkKGQucjEsIGQuJHIxLCBhbmNob3IudG9wLCBNQVhfUk9XUyk7XG4gICAgICBpZiAocjAgPiByMSkge1xuICAgICAgICByYW5nZS50b3AgPSByMTtcbiAgICAgICAgcmFuZ2UuJHRvcCA9IGQuJHIxO1xuICAgICAgICByYW5nZS5ib3R0b20gPSByMDtcbiAgICAgICAgcmFuZ2UuJGJvdHRvbSA9IGQuJHIwO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJhbmdlLnRvcCA9IHIwO1xuICAgICAgICByYW5nZS4kdG9wID0gZC4kcjA7XG4gICAgICAgIHJhbmdlLmJvdHRvbSA9IHIxO1xuICAgICAgICByYW5nZS4kYm90dG9tID0gZC4kcjE7XG4gICAgICB9XG4gICAgICBjb25zdCBjMCA9IHRvRml4ZWQoZC5jMCwgZC4kYzAsIGFuY2hvci5sZWZ0LCBNQVhfQ09MUyk7XG4gICAgICBjb25zdCBjMSA9IHRvRml4ZWQoZC5jMSwgZC4kYzEsIGFuY2hvci5sZWZ0LCBNQVhfQ09MUyk7XG4gICAgICBpZiAoYzAgPiBjMSkge1xuICAgICAgICByYW5nZS5sZWZ0ID0gYzE7XG4gICAgICAgIHJhbmdlLiRsZWZ0ID0gZC4kYzE7XG4gICAgICAgIHJhbmdlLnJpZ2h0ID0gYzA7XG4gICAgICAgIHJhbmdlLiRyaWdodCA9IGQuJGMwO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJhbmdlLmxlZnQgPSBjMDtcbiAgICAgICAgcmFuZ2UuJGxlZnQgPSBkLiRjMDtcbiAgICAgICAgcmFuZ2UucmlnaHQgPSBjMTtcbiAgICAgICAgcmFuZ2UuJHJpZ2h0ID0gZC4kYzE7XG4gICAgICB9XG4gICAgICB0b2tlbi52YWx1ZSA9IHRvQTEocmFuZ2UpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGlzU3RyaW5nXG4gICAgPyB0b2tlbnMubWFwKGQgPT4gZC52YWx1ZSkuam9pbignJylcbiAgICA6IHRva2Vucztcbn1cbiIsImV4cG9ydCB7IHRva2VuaXplIH0gZnJvbSAnLi9sZXhlci5qcyc7XG5leHBvcnQgeyBhZGRNZXRhIH0gZnJvbSAnLi9hZGRNZXRhLmpzJztcbmV4cG9ydCB7IHRyYW5zbGF0ZVRvUkMsIHRyYW5zbGF0ZVRvQTEgfSBmcm9tICcuL3RyYW5zbGF0ZS5qcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGExIH0gZnJvbSAnLi9hMS5qcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHJjIH0gZnJvbSAnLi9yYy5qcyc7XG5leHBvcnQgeyBNQVhfQ09MUywgTUFYX1JPV1MgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5cbmltcG9ydCB7XG4gIE9QRVJBVE9SLFxuICBCT09MRUFOLFxuICBFUlJPUixcbiAgTlVNQkVSLFxuICBGVU5DVElPTixcbiAgTkVXTElORSxcbiAgV0hJVEVTUEFDRSxcbiAgU1RSSU5HLFxuICBQQVRIX1FVT1RFLFxuICBQQVRIX0JSQUNFLFxuICBQQVRIX1BSRUZJWCxcbiAgUkFOR0UsXG4gIFJBTkdFX0JFQU0sXG4gIFJBTkdFX05BTUVELFxuICBGWF9QUkVGSVgsXG4gIFVOS05PV05cbn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG5leHBvcnQgY29uc3QgdG9rZW5UeXBlcyA9IHtcbiAgT1BFUkFUT1IsXG4gIEJPT0xFQU4sXG4gIEVSUk9SLFxuICBOVU1CRVIsXG4gIEZVTkNUSU9OLFxuICBORVdMSU5FLFxuICBXSElURVNQQUNFLFxuICBTVFJJTkcsXG4gIFBBVEhfUVVPVEUsXG4gIFBBVEhfQlJBQ0UsXG4gIFBBVEhfUFJFRklYLFxuICBSQU5HRSxcbiAgUkFOR0VfQkVBTSxcbiAgUkFOR0VfTkFNRUQsXG4gIEZYX1BSRUZJWCxcbiAgVU5LTk9XTlxufTtcbiJdLCJuYW1lcyI6WyJxdWlja1ZlcmlmeVJhbmdlQTEiLCJ0b2tlblZhbHVlIiwic3BsaXQiLCJldmVyeSIsImQiLCJuIiwicGFyc2VJbnQiLCJpc05hTiIsImlzRmluaXRlIiwiYm91bmRzIiwicXVpY2tWZXJpZnlSYW5nZVJDIiwicmVOdW1zIiwibSIsImV4ZWMiLCJ4IiwidmFsIiwiT1BFUkFUT1IiLCJCT09MRUFOIiwiRVJST1IiLCJOVU1CRVIiLCJGVU5DVElPTiIsIk5FV0xJTkUiLCJXSElURVNQQUNFIiwiU1RSSU5HIiwiUEFUSF9RVU9URSIsIlBBVEhfQlJBQ0UiLCJQQVRIX1BSRUZJWCIsIlJBTkdFIiwiUkFOR0VfQkVBTSIsIlJBTkdFX05BTUVEIiwiRlhfUFJFRklYIiwiVU5LTk9XTiIsIk1BWF9DT0xTIiwiTUFYX1JPV1MiLCJyZV9FUlJPUiIsInJlX09QRVJBVE9SIiwicmVfQk9PTEVBTiIsInJlX0ZVTkNUSU9OIiwicmVfTkVXTElORSIsInJlX1dISVRFU1BBQ0UiLCJyZV9TVFJJTkciLCJyZV9QQVRIX1FVT1RFIiwicmVfUEFUSF9CUkFDRSIsInJlX1BBVEhfUFJFRklYIiwicmVfQTFDT0wiLCJyZV9BMVJPVyIsInJlX0ExUkFOR0UiLCJyUGFydCIsImNQYXJ0IiwicmVfUkNDT0wiLCJSZWdFeHAiLCJyZV9SQ1JPVyIsInJlX1JDUkFOR0UiLCJyZV9OVU1CRVIiLCJyZV9OQU1FRCIsInRva2VuSGFuZGxlcnNBMSIsInRva2VuSGFuZGxlcnNSQyIsInRva2VuSGFuZGxlcnNSZWZzQTEiLCJ0b2tlbkhhbmRsZXJzUmVmc1JDIiwiaXNUeXBlIiwidCIsInR5cGUiLCJpc1JhbmdlT3AiLCJ2YWx1ZSIsImlzQmFuZ09wIiwiZ2V0VG9rZW5zIiwiZngiLCJ0b2tlbkhhbmRsZXJzIiwiZW1pdFJhbmdlcyIsIm1lcmdlUmFuZ2VzIiwidG9rZW5zIiwicG9zIiwidG9rZW4iLCJsb29rQmVoaW5kIiwibGVuZ3RoIiwidGVzdCIsInJhbmdlIiwicHVzaCIsInN0YXJ0UG9zIiwicyIsInNsaWNlIiwidG9rZW5UeXBlIiwibGV0IiwiaSIsInJlVGVzdCIsImZuVGVzdCIsIm1lcmdlIiwidW5zaGlmdCIsInNwbGljZSIsIm1hcCIsImpvaW4iLCJ0b2tlbml6ZSIsInIxYzEiLCJ1bnF1b3RlIiwicmVwbGFjZSIsInBSYW5nZU9wIiwicFJhbmdlIiwicjAiLCJwUmFuZ2UyIiwicjEiLCJwQmFuZyIsInBCZWFtIiwicFNoZWV0Iiwic2hlZXROYW1lIiwicEZpbGUiLCJ3b3JrYm9va05hbWUiLCJwRmlsZTIiLCJwTmFtZWQiLCJuYW1lIiwicFF1b3RlZCIsImZpbGUiLCJzaGVldCIsInBRdW90ZWQyIiwidmFsaWRSdW5zIiwidmFsaWRSdW5zTmFtZWQiLCJjb25jYXQiLCJwYXJzZVJlZiIsInJlZiIsImFsbG93X25hbWVkIiwicmVmRGF0YSIsInNoaWZ0IiwicnVucyIsImRhdGEiLCJwYXJzZSIsImoiLCJPYmplY3QiLCJhc3NpZ24iLCJmcm9tQ29sIiwiY29sU3RyIiwiYyIsInRvVXBwZXJDYXNlIiwiY2hyIiwiY2hhckNvZGVBdCIsInRvQ29sIiwibGVmdCIsIlN0cmluZyIsImZyb21DaGFyQ29kZSIsIk1hdGgiLCJmbG9vciIsImZyb21Sb3ciLCJyb3dTdHIiLCJ0b1JvdyIsInRvcCIsInRvUmVsYXRpdmUiLCJib3R0b20iLCJyaWdodCIsIiRsZWZ0IiwiJHJpZ2h0IiwiJHRvcCIsIiRib3R0b20iLCJ0b0Fic29sdXRlIiwidG9BMSIsInRvQWJzIiwiZnJvbUExIiwicmFuZ2VTdHIiLCJhIiwiYiIsIm1pbiIsIm1heCIsInBhcnQxIiwicGFydDIiLCJwYXJzZUExUmVmIiwidG8iLCJmcm9tIiwiZ2V0SURlciIsImFkZE1ldGEiLCJwYXJlblN0YWNrIiwiYXJyYXlTdGFydCIsImExTWFwIiwidWlkIiwiZm9yRWFjaCIsImRlcHRoIiwiY291bnRlciIsInBvcCIsInBhaXJJZCIsImdyb3VwSWQiLCJlcnJvciIsImExIiwidG9Mb3dlckNhc2UiLCJ0b0Nvb3JkIiwiaXNBYnMiLCJ0b1JDIiwiYzAiLCJjMSIsIiRjMCIsIiRjMSIsIiRyMCIsIiRyMSIsInNfcjAiLCJzX3IxIiwic19jMCIsInNfYzEiLCJwYXJzZVJDUGFydCIsInJtIiwiY20iLCJmcm9tUkMiLCJleHRlbmRUbyIsInBhcnNlUkNSZWYiLCJ0cmFuc2xhdGVUb1JDIiwiYW5jaG9yQ2VsbCIsImlzU3RyaW5nIiwicjFjMiIsInRvRml4ZWQiLCJhYnMiLCJiYXNlIiwidiIsInRyYW5zbGF0ZVRvQTEiLCJhbmNob3IiLCJ0b2tlblR5cGVzIl0sIm1hcHBpbmdzIjoiYUFBTyxTQUFTQSxtQkFBb0JDLFVBTTNCQSxFQUFXQyxNQUFNLG1CQUFt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
|
|
1
|
+
"use strict";function t(t){return t.split(/(\d+|[a-zA-Z]+)/).every((t=>{const e=parseInt(t,36);return!!isNaN(e)||(isFinite(t)?e<=2183880786:e<=43321)}))}Object.defineProperty(exports,"__esModule",{value:!0});const e={R:1048577,"R[":1048576,C:16385,"C[":16384};function r(t){const r=/([RC]\[?)(-?\d+)/gi;let n;for(;null!==(n=r.exec(t));){const t=e[n[1]],r=parseInt(n[2],10);if(r>=t||r<=-t)return!1}return!0}const n="range",o="range-beam",a=/^#(NAME\?|FIELD!|CALC!|VALUE!|REF!|DIV\/0!|NULL!|NUM!|N\/A|GETTING_DATA\b|SPILL!|UNKNOWN!|FIELD\b|CALC\b|SYNTAX\?|ERROR!)/i,i=/^(<=|>=|<>|[-+/*^%&<>=]|[{},;]|[()]|@|:|!|#)/,l=/^(TRUE|FALSE)\b/i,c=/^[A-Z_]+[A-Z\d_.]+(?=\s*\()/i,u=/^\n+/,p=/^[ \f\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]+/,s=/^"(?:""|[^"])*("|$)/,f=/^'(?:''|[^'])*('|$)/,$=/^\[(?:[^\]])+(\]|$)/,g=/^([^ \t\n$!"`'#%&(){}<>,;:^@|~=*+-]+)(?=!)/,h=/^\$?[A-Z]{1,3}:\$?[A-Z]{1,3}/i,m=/^\$?[1-9][0-9]{0,6}:\$?[1-9][0-9]{0,6}/i,b=/^\$?[A-Z]{1,3}\$?[1-9][0-9]{0,6}/i,d="(?:R(?:\\[[+-]?\\d+\\]|[1-9][0-9]{0,6})?)",v="(?:C(?:\\[[+-]?\\d+\\]|[1-9][0-9]{0,4})?)",R=new RegExp("^".concat(v,"(:").concat(v,")?(?=\\W|$)"),"i"),x=new RegExp("^".concat(d,"(:").concat(d,")?(?=\\W|$)"),"i"),N=new RegExp("^(?:(?=[RC])".concat(d).concat(v,")"),"i"),A=/^(?:\d+(\.\d+)?(?:[eE][+-]?\d+)?|\d+)/,E=/^[A-Z\d\\_.?]+/i,y=[["error",a],["operator",i],["bool",l],["function",c],["newline",u],["whitespace",p],["string",s],["path-quote",f],["path-brace",$],["path-prefix",g],[n,b,t],[o,h,t],[o,m,t],["number",A],["range-named",E]],C=[["error",a],["operator",i],["bool",l],["function",c],["newline",u],["whitespace",p],["string",s],["path-quote",f],["path-brace",$],["path-prefix",g],[n,N,r],[o,x,r],[o,R,r],["number",A],["range-named",E]],I=[["operator",/^[!:]/],["path-quote",f],["path-brace",$],["path-prefix",g],[n,b,t],[o,h,t],[o,m,t],["range-named",E]],w=[["operator",/^!/],["path-quote",f],["path-brace",$],["path-prefix",g],[n,N,r],[o,x,r],[o,R,r],["range-named",E]],k=(t,e)=>t&&t.type===e,T=t=>t&&":"===t.value,O=t=>t&&"!"===t.value,L={emitRanges:!1,mergeRanges:!0,negativeNumbers:!1,r1c1:!1};function M(t,e){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const{emitRanges:a,mergeRanges:i,negativeNumbers:l}=Object.assign({},L,r),c=[];let u=0;const p=t=>c[c.length-t],s=t=>{const e=c.filter((t=>!k(t,"whitespace")&&!k(t,"newline")));return e[e.length-t]};if(/^=/.test(t)){const t={type:"fx-prefix",value:"=",...a?{range:[0,1]}:{}};u++,c.push(t)}for(;u<t.length;){const r=u,f=t.slice(u);let $="",g="";for(let t=0;t<e.length;t++){const[r,n,o]=e[t],a=n.exec(f);if(a&&(!o||o(a[0]))){$=r,g=a[0],u+=a[0].length;break}}$||($="unknown",g=t[u],u++);let h={type:$,value:g,...a?{range:[r,u]}:{}};if("string"!==$||g.endsWith('"')||(h.unterminated=!0),l&&"number"===$){const t=p(1);if(t&&k(t,"operator")&&"-"===t.value){const t=s(2);(!t||k(t,"fx-prefix")||k(t,"operator")&&!["%","}",")","#"].includes(t.value))&&(c.pop(),h.value="-"+g)}}if(i&&($===n||"range-named"===$||$===o)){const t=[];if(T(p(1))&&k(p(2),n)&&$===n&&t.unshift(...c.splice(-2,2)),O(p(1)))if(k(p(2),"path-quote")||k(p(2),"path-brace"))t.unshift(...c.splice(-2,2));else if(k(p(2),"path-prefix")){const e=k(p(3),"path-brace")?3:2;t.unshift(...c.splice(-e,e))}t.length&&(h={type:$,value:t.map((t=>t.value)).join("")+g,...a?{range:[t[0].range[0],u]}:{}})}c.push(h)}return c}function _(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const r=e.r1c1?C:y;return M(t,r,e)}const Z=t=>t.slice(1,-1).replace(/''/g,"'"),S=t=>t&&":"===t.value&&{},U=t=>t&&t.type===n&&{r0:t.value},F=t=>t&&t.type===n&&{r1:t.value},P=t=>t&&"!"===t.value&&{},q=t=>t&&t.type===o&&{r0:t.value},W=t=>t&&"path-prefix"===t.type&&/^[^:\\/?*[\]]{0,31}$/.test(t.value)&&{sheetName:t.value},j=t=>t&&"path-brace"===t.type&&{workbookName:t.value.slice(1,-1)},G=t=>t&&"range-named"===t.type&&{name:t.value},X=t=>{if(t&&"path-quote"===t.type){const e=/(?:\[(.+?)\])?([^[\]]+?)$/.exec(Z(t.value));if(e){const[,t,r]=e;if(!r||/^[^:\\/?*[\]]{0,31}$/.test(r))return{workbookName:t||"",sheetName:r||""}}}},D=[[U],[U,S,F],[q],[X,P,U],[X,P,U,S,F],[X,P,q],[W,P,U],[W,P,U,S,F],[W,P,q],[j,W,P,U],[j,W,P,U,S,F],[j,W,P,q]],B=D.concat([[G],[t=>t&&"path-prefix"===t.type&&{workbookName:t.value},P,G],[t=>t&&"path-quote"===t.type&&{workbookName:Z(t.value)},P,G]]);function H(t){let e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];const n=M(t,r,{emitRanges:!1,mergeRanges:!1}),o={sheetName:"",workbookName:"",r0:"",r1:"",name:""};n.length&&"fx-prefix"===n[0].type&&n.shift();const a=e?B:D;for(let t=0;t<a.length;t++){const e={...o};if(a[t].length===n.length){if(a[t].every(((t,r)=>{const o=t(n[r]);return Object.assign(e,o),o})))return e}}return null}function z(t){const e=(t||"").toUpperCase();let r=0,n=0;for(;n!==e.length;++n){const t=e.charCodeAt(n);t>=65&&t<=90&&(r=26*r+t-64)}return r-1}function K(t){let e=t,r="";for(;e>=0;)r=String.fromCharCode(e%26+65)+r,e=Math.floor(e/26)-1;return r}function V(t){return+t-1}function Q(t){return String(t+1)}function Y(t){const{top:e,left:r,bottom:n,right:o}=t;return{top:e,left:r,bottom:n,right:o,$left:!1,$right:!1,$top:!1,$bottom:!1}}function J(t){const e=t=>t?"$":"",{top:r,left:n,bottom:o,right:a,$left:i,$right:l,$top:c,$bottom:u}=t;return 0===r&&1048575===o?e(i)+K(n)+":"+e(l)+K(a):0===n&&16383===a?e(c)+Q(r)+":"+e(u)+Q(o):null==a||null==o||a===n&&o===r?e(i)+K(n)+e(c)+Q(r):e(i)+K(n)+e(c)+Q(r)+":"+e(l)+K(a)+e(u)+Q(o)}function tt(t){let e,r=0,n=0,o=1048575,a=16383,i=!1,l=!1,c=!1,u=!1;if(e=/^(\$?)([A-Z]{1,3}):(\$?)([A-Z]{1,3})$/.exec(t)){const t=z(e[2]),p=z(e[4]);return n=Math.min(t,p),a=Math.max(t,p),l=!!e[t<=p?1:3],u=!!e[t<=p?3:1],i=!0,c=!0,{top:r,left:n,bottom:o,right:a,$top:i,$left:l,$bottom:c,$right:u}}if(e=/^(\$?)([1-9]\d{0,6}):(\$?)([1-9]\d{0,6})$/.exec(t)){const t=V(e[2]),p=V(e[4]);return r=Math.min(t,p),o=Math.max(t,p),i=!!e[t<=p?1:3],c=!!e[t<=p?3:1],l=!0,u=!0,{top:r,left:n,bottom:o,right:a,$top:i,$left:l,$bottom:c,$right:u}}{const[p,s]=t.split(":");if(e=/^(\$?)([A-Z]{1,3})(\$?)([1-9]\d{0,6})$/i.exec(p))return n=z(e[2]),r=V(e[4]),l=!!e[1],i=!!e[3],s&&(e=/^(\$?)([A-Z]{1,3})(\$?)([1-9]\d{0,6})$/i.exec(s))?(a=z(e[2]),o=V(e[4]),u=!!e[1],c=!!e[3],o<r&&([r,o,i,c]=[o,r,c,i]),a<n&&([n,a,l,u]=[a,n,u,l])):(o=r,a=n,c=i,u=l),{top:r,left:n,bottom:o,right:a,$top:i,$left:l,$bottom:c,$right:u}}return null}function et(t){let e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];const r=H(t,e,I);if(r&&(r.r0||r.name)){let t=null;return r.r0&&(t=r.r1?tt(r.r0+":"+r.r1):tt(r.r0)),r.name||t?(r.range=t,delete r.r0,delete r.r1,r):null}return null}var rt={fromCol:z,toCol:K,toRelative:Y,toAbsolute:function(t){const{top:e,left:r,bottom:n,right:o}=t;return{top:e,left:r,bottom:n,right:o,$left:!0,$right:!0,$top:!0,$bottom:!0}},to:J,from:tt,parse:et};function nt(){let t=1;return()=>"fxg"+t++}function ot(t,e){return e?String(t+1):t?"["+t+"]":""}function at(t){const{r0:e,c0:r,r1:n,c1:o,$c0:a,$c1:i,$r0:l,$r1:c}=t;if(0===e&&1048575===n){const t=ot(r,a),e=ot(o,i);return"C"+(t===e?t:t+":C"+e)}if(0===r&&16383===o){const t=ot(e,l),r=ot(n,c);return"R"+(t===r?t:t+":R"+r)}const u=ot(e,l),p=ot(n,c),s=ot(r,a),f=ot(o,i);return u!==p||s!==f?"R"+u+"C"+s+":R"+p+"C"+f:"R"+u+"C"+s}function it(t){let e=0,r=0,n=1048575,o=16383,a=!1,i=!1,l=!1,c=!1;const u=/^R(?:\[([+-]?\d+)\]|(\d+))?/.exec(t);u?(u[1]?e=parseInt(u[1],10):u[2]&&(e=parseInt(u[2],10)-1,a=!0),n=e,l=a,t=t.slice(u[0].length)):(a=!0,l=!0);const p=/^C(?:\[([+-]?\d+)\]|(\d+))?/.exec(t);return p?(p[1]?r=parseInt(p[1],10):p[2]&&(r=parseInt(p[2],10)-1,i=!0),o=r,c=i,t=t.slice(p[0].length)):(i=!0,c=!0),!u&&!p||t.length?null:{r0:e,c0:r,r1:n,c1:o,$r0:a,$c0:i,$r1:l,$c1:c}}function lt(t){const[e,r]=t.split(":",2),n=it(e);if(!n)return null;if(n&&r){const t=it(r);if(!t)return null;n.r1=t.r1,n.c1=t.c1,n.$r1=t.$r1,n.$c1=t.$c1}return n}var ct={to:at,from:lt,parse:function(t){let e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];const r=H(t,e,w);if(r&&(r.r0||r.name)){const t=r.r1?lt(r.r0+":"+r.r1):lt(r.r0);return r.name||t?(r.range=t,delete r.r0,delete r.r1,r):null}return null}};function ut(t,e,r,n){let o=t;return e||(o=r+t,o<0&&(o=n+o+1),o>n&&(o-=n+1)),o}const pt={OPERATOR:"operator",BOOLEAN:"bool",ERROR:"error",NUMBER:"number",FUNCTION:"function",NEWLINE:"newline",WHITESPACE:"whitespace",STRING:"string",PATH_QUOTE:"path-quote",PATH_BRACE:"path-brace",PATH_PREFIX:"path-prefix",RANGE:n,RANGE_BEAM:o,RANGE_NAMED:"range-named",FX_PREFIX:"fx-prefix",UNKNOWN:"unknown"};exports.MAX_COLS=16383,exports.MAX_ROWS=1048575,exports.a1=rt,exports.addMeta=function(t){let{sheetName:e="",workbookName:r=""}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const a=[];let i=null;const l={},c=nt();return t.forEach(((t,u)=>{if(t.index=u,t.depth=a.length,"("===t.value)t.depth=a.length+1,a.push(t);else if(")"===t.value){const e=a.pop();if(e){const r=c();t.groupId=r,t.depth=e.depth,e.groupId=r}else t.error=!0}else if("{"===t.value)i?t.error=!0:i=t;else if("}"===t.value){if(i){const e=c();t.groupId=e,i.groupId=e}else t.error=!0;i=null}else if(t.type===n||t.type===o){const n=et(t.value,!1),o=n&&"[".concat(n.workbookName||r,"]").concat(n.sheetName||e,"!").concat(n.range?J(Y(n.range)):n.name).toLowerCase();o&&(o in l?t.groupId=l[o]:(t.groupId=c(),l[o]=t.groupId))}else"unknown"===t.type&&(t.error=!0)})),t},exports.rc=ct,exports.tokenTypes=pt,exports.tokenize=_,exports.translateToA1=function(t,e){const r=tt(e),a="string"==typeof t,i=a?_(t,{emitRanges:!1,mergeRanges:!1,r1c1:!0}):t;return i.forEach((t=>{if(t.type===n||t.type===o){const e={},n=lt(t.value),o=ut(n.r0,n.$r0,r.top,1048575),a=ut(n.r1,n.$r1,r.top,1048575);o>a?(e.top=a,e.$top=n.$r1,e.bottom=o,e.$bottom=n.$r0):(e.top=o,e.$top=n.$r0,e.bottom=a,e.$bottom=n.$r1);const i=ut(n.c0,n.$c0,r.left,16383),l=ut(n.c1,n.$c1,r.left,16383);i>l?(e.left=l,e.$left=n.$c1,e.right=i,e.$right=n.$c0):(e.left=i,e.$left=n.$c0,e.right=l,e.$right=n.$c1),t.value=J(e)}})),a?i.map((t=>t.value)).join(""):i},exports.translateToRC=function(t,e){const{top:r,left:a}=tt(e),i="string"==typeof t,l=i?_(t,{emitRanges:!1,mergeRanges:!1,r1c2:!1}):t;return l.forEach((t=>{if(t.type===n){const e={},n=tt(t.value);e.r0=n.$top?n.top:n.top-r,e.$r0=n.$top,e.r1=n.$bottom?n.bottom:n.bottom-r,e.$r1=n.$bottom,e.c0=n.$left?n.left:n.left-a,e.$c0=n.$left,e.c1=n.$right?n.right:n.right-a,e.$c1=n.$right,t.value=at(e)}else if(t.type===o){const e={},n=tt(t.value);e.r0=n.$top?n.top:n.top-r,e.$r0=n.$top,e.r1=n.$bottom?n.bottom:n.bottom-r,e.$r1=n.$bottom,e.c0=n.$left?n.left:n.left-a,e.$c0=n.$left,e.c1=n.$right?n.right:n.right-a,e.$c1=n.$right,t.value=at(e)}})),i?l.map((t=>t.value)).join(""):l};
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnguanMiLCJzb3VyY2VzIjpbIi4uL2xpYi9xdWlja1ZlcmlmeS5qcyIsIi4uL2xpYi9jb25zdGFudHMuanMiLCIuLi9saWIvbGV4ZXIuanMiLCIuLi9saWIvcGFyc2VSZWYuanMiLCIuLi9saWIvYTEuanMiLCIuLi9saWIvYWRkTWV0YS5qcyIsIi4uL2xpYi9yYy5qcyIsIi4uL2xpYi90cmFuc2xhdGUuanMiLCIuLi9saWIvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIHF1aWNrVmVyaWZ5UmFuZ2VBMSAodG9rZW5WYWx1ZSkge1xuICAvLyBRdWlja2x5IGRldGVybWluZSBpZiByYW5nZSB2YWx1cyBhcmUgb3V0IG9mIGJvdW5kczogU3BsaXQgdGhlIHN0cmluZyBpbnRvXG4gIC8vIG51bWVyaWMsIGFscGhhYmV0aWNhbCwgYW5kIFwib3RoZXJcIiBjaHVua3MgYW5kIHBhcnNlIHRoZW0gYXMgYmFzZSAzNiBudW1iZXJzLlxuICAvLyBCb3RoIHJvd3MgYW5kIGNvbHMgY2FuIGJlIHJlcHJlc2VudGVkIGluIGJhc2UgMzYgYW5kIHdlIGNhbiBkZWNpZGUgd2hpY2ggd2VcbiAgLy8gaG9sZCBieSBjaGVja2luZyBpZiB0aGUgY2h1bmsgd2FzIGFscmVhZHkgYSBmaW5pdGUgbnVtYmVyLiBTbyB3ZSBjYW4gc2ltcGx5XG4gIC8vIGNvbXBhcmUgYWdhaW5zdCB0aGUgYmFzZSAzNiBwYXJzZWQgdmVyc2lvbnMgb2YgWEZEIGFuZCAxMDQ4NTc2LlxuICByZXR1cm4gdG9rZW5WYWx1ZS5zcGxpdCgvKFxcZCt8W2EtekEtWl0rKS8pLmV2ZXJ5KGQgPT4ge1xuICAgIGNvbnN0IG4gPSBwYXJzZUludChkLCAzNik7XG4gICAgaWYgKCFpc05hTihuKSkge1xuICAgICAgcmV0dXJuIGlzRmluaXRlKGQpXG4gICAgICAgID8gbiA8PSAyMTgzODgwNzg2IC8vIG1heCByb3dzXG4gICAgICAgIDogbiA8PSA0MzMyMTsgICAgIC8vIG1heCBjb2xzXG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuY29uc3QgYm91bmRzID0ge1xuICAnUic6IDEwNDg1NzcsXG4gICdSWyc6IDEwNDg1NzYsXG4gICdDJzogMTYzODUsXG4gICdDWyc6IDE2Mzg0XG59O1xuZXhwb3J0IGZ1bmN0aW9uIHF1aWNrVmVyaWZ5UmFuZ2VSQyAodG9rZW5WYWx1ZSkge1xuICBjb25zdCByZU51bXMgPSAvKFtSQ11cXFs/KSgtP1xcZCspL2dpO1xuICBsZXQgbTtcbiAgd2hpbGUgKChtID0gcmVOdW1zLmV4ZWModG9rZW5WYWx1ZSkpICE9PSBudWxsKSB7XG4gICAgY29uc3QgeCA9IGJvdW5kc1ttWzFdXTtcbiAgICBjb25zdCB2YWwgPSBwYXJzZUludChtWzJdLCAxMCk7XG4gICAgaWYgKHZhbCA+PSB4IHx8IHZhbCA8PSAteCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsImltcG9ydCB7IHF1aWNrVmVyaWZ5UmFuZ2VBMSwgcXVpY2tWZXJpZnlSYW5nZVJDIH0gZnJvbSAnLi9xdWlja1ZlcmlmeS5qcyc7XG5cbmV4cG9ydCBjb25zdCBPUEVSQVRPUiA9ICdvcGVyYXRvcic7XG5leHBvcnQgY29uc3QgQk9PTEVBTiA9ICdib29sJztcbmV4cG9ydCBjb25zdCBFUlJPUiA9ICdlcnJvcic7XG5leHBvcnQgY29uc3QgTlVNQkVSID0gJ251bWJlcic7XG5leHBvcnQgY29uc3QgRlVOQ1RJT04gPSAnZnVuY3Rpb24nO1xuZXhwb3J0IGNvbnN0IE5FV0xJTkUgPSAnbmV3bGluZSc7XG5leHBvcnQgY29uc3QgV0hJVEVTUEFDRSA9ICd3aGl0ZXNwYWNlJztcbmV4cG9ydCBjb25zdCBTVFJJTkcgPSAnc3RyaW5nJztcbmV4cG9ydCBjb25zdCBQQVRIX1FVT1RFID0gJ3BhdGgtcXVvdGUnO1xuZXhwb3J0IGNvbnN0IFBBVEhfQlJBQ0UgPSAncGF0aC1icmFjZSc7XG5leHBvcnQgY29uc3QgUEFUSF9QUkVGSVggPSAncGF0aC1wcmVmaXgnO1xuZXhwb3J0IGNvbnN0IFJBTkdFID0gJ3JhbmdlJztcbmV4cG9ydCBjb25zdCBSQU5HRV9CRUFNID0gJ3JhbmdlLWJlYW0nO1xuZXhwb3J0IGNvbnN0IFJBTkdFX05BTUVEID0gJ3JhbmdlLW5hbWVkJztcbmV4cG9ydCBjb25zdCBGWF9QUkVGSVggPSAnZngtcHJlZml4JztcbmV4cG9ydCBjb25zdCBVTktOT1dOID0gJ3Vua25vd24nO1xuXG5leHBvcnQgY29uc3QgTUFYX0NPTFMgPSAyICoqIDE0IC0gMTsgLy8gMTYzODNcbmV4cG9ydCBjb25zdCBNQVhfUk9XUyA9IDIgKiogMjAgLSAxOyAvLyAxMDQ4NTc1XG5cbmNvbnN0IHJlX0VSUk9SID0gL14jKE5BTUVcXD98RklFTEQhfENBTEMhfFZBTFVFIXxSRUYhfERJVlxcLzAhfE5VTEwhfE5VTSF8TlxcL0F8R0VUVElOR19EQVRBXFxifFNQSUxMIXxVTktOT1dOIXxGSUVMRFxcYnxDQUxDXFxifFNZTlRBWFxcP3xFUlJPUiEpL2k7XG5jb25zdCByZV9PUEVSQVRPUiA9IC9eKDw9fD49fDw+fFstKy8qXiUmPD49XXxbe30sO118WygpXXxAfDp8IXwjKS87XG5jb25zdCByZV9CT09MRUFOID0gL14oVFJVRXxGQUxTRSlcXGIvaTtcbmNvbnN0IHJlX0ZVTkNUSU9OID0gL15bQS1aX10rW0EtWlxcZF8uXSsoPz1cXHMqXFwoKS9pO1xuY29uc3QgcmVfTkVXTElORSA9IC9eXFxuKy87XG5jb25zdCByZV9XSElURVNQQUNFID0gL15bIFxcZlxcclxcdFxcdlxcdTAwYTBcXHUxNjgwXFx1MjAwMC1cXHUyMDBhXFx1MjAyOFxcdTIwMjlcXHUyMDJmXFx1MjA1ZlxcdTMwMDBcXHVmZWZmXSsvO1xuY29uc3QgcmVfU1RSSU5HID0gL15cIig/OlwiXCJ8W15cIl0pKihcInwkKS87XG5jb25zdCByZV9QQVRIX1FVT1RFID0gL14nKD86Jyd8W14nXSkqKCd8JCkvO1xuY29uc3QgcmVfUEFUSF9CUkFDRSA9IC9eXFxbKD86W15cXF1dKSsoXFxdfCQpLztcbmNvbnN0IHJlX1BBVEhfUFJFRklYID0gL14oW14gXFx0XFxuJCFcImAnIyUmKCl7fTw+LDs6XkB8fj0qKy1dKykoPz0hKS87IC8vIFNoZWV0czogW146XFxcXC8/KltcXF1dezAsMzF9IChidXQgV0IgbmFtZXM/KVxuY29uc3QgcmVfQTFDT0wgPSAvXlxcJD9bQS1aXXsxLDN9OlxcJD9bQS1aXXsxLDN9L2k7XG5jb25zdCByZV9BMVJPVyA9IC9eXFwkP1sxLTldWzAtOV17MCw2fTpcXCQ/WzEtOV1bMC05XXswLDZ9L2k7XG5jb25zdCByZV9BMVJBTkdFID0gL15cXCQ/W0EtWl17MSwzfVxcJD9bMS05XVswLTldezAsNn0vaTtcbmNvbnN0IHJQYXJ0ID0gJyg/OlIoPzpcXFxcW1srLV0/XFxcXGQrXFxcXF18WzEtOV1bMC05XXswLDZ9KT8pJztcbmNvbnN0IGNQYXJ0ID0gJyg/OkMoPzpcXFxcW1srLV0/XFxcXGQrXFxcXF18WzEtOV1bMC05XXswLDR9KT8pJztcbmNvbnN0IHJlX1JDQ09MID0gbmV3IFJlZ0V4cChgXiR7Y1BhcnR9KDoke2NQYXJ0fSk/KD89XFxcXFd8JClgLCAnaScpO1xuY29uc3QgcmVfUkNST1cgPSBuZXcgUmVnRXhwKGBeJHtyUGFydH0oOiR7clBhcnR9KT8oPz1cXFxcV3wkKWAsICdpJyk7XG5jb25zdCByZV9SQ1JBTkdFID0gbmV3IFJlZ0V4cChgXig/Oig/PVtSQ10pJHtyUGFydH0ke2NQYXJ0fSlgLCAnaScpO1xuY29uc3QgcmVfTlVNQkVSID0gL14oPzpcXGQrKFxcLlxcZCspPyg/OltlRV1bKy1dP1xcZCspP3xcXGQrKS87XG5jb25zdCByZV9OQU1FRCA9IC9eW0EtWlxcZFxcXFxfLj9dKy9pOyAvLyBGSVhNRSB0aGVyZSBhcmUgc3RyaWN0ZXIgcnVsZXMgZm9yIHRoaXMhXG4vLyBjb25zdCByZV9OQU1FRCA9IC9eKD8hW1JDXSQpW0EtWsOALcizX1xcXFxdW1xcXFw/XFx3w4AtyLMuXXswLDI1NX0kL2k7XG5cbmV4cG9ydCBjb25zdCB0b2tlbkhhbmRsZXJzQTEgPSBbXG4gIFsgRVJST1IsICAgICAgIHJlX0VSUk9SIF0sXG4gIFsgT1BFUkFUT1IsICAgIHJlX09QRVJBVE9SIF0sXG4gIFsgQk9PTEVBTiwgICAgIHJlX0JPT0xFQU4gXSxcbiAgWyBGVU5DVElPTiwgICAgcmVfRlVOQ1RJT04gXSxcbiAgWyBORVdMSU5FLCAgICAgcmVfTkVXTElORSBdLFxuICBbIFdISVRFU1BBQ0UsICByZV9XSElURVNQQUNFIF0sXG4gIFsgU1RSSU5HLCAgICAgIHJlX1NUUklORyBdLFxuICBbIFBBVEhfUVVPVEUsICByZV9QQVRIX1FVT1RFIF0sXG4gIFsgUEFUSF9CUkFDRSwgIHJlX1BBVEhfQlJBQ0UgXSxcbiAgWyBQQVRIX1BSRUZJWCwgcmVfUEFUSF9QUkVGSVggXSxcbiAgWyBSQU5HRSwgICAgICAgcmVfQTFSQU5HRSwgcXVpY2tWZXJpZnlSYW5nZUExIF0sXG4gIFsgUkFOR0VfQkVBTSwgIHJlX0ExQ09MLCBxdWlja1ZlcmlmeVJhbmdlQTEgXSxcbiAgWyBSQU5HRV9CRUFNLCAgcmVfQTFST1csIHF1aWNrVmVyaWZ5UmFuZ2VBMSBdLFxuICBbIE5VTUJFUiwgICAgICByZV9OVU1CRVIgXSxcbiAgWyBSQU5HRV9OQU1FRCwgcmVfTkFNRUQgXVxuXTtcblxuZXhwb3J0IGNvbnN0IHRva2VuSGFuZGxlcnNSQyA9IFtcbiAgWyBFUlJPUiwgICAgICAgcmVfRVJST1IgXSxcbiAgWyBPUEVSQVRPUiwgICAgcmVfT1BFUkFUT1IgXSxcbiAgWyBCT09MRUFOLCAgICAgcmVfQk9PTEVBTiBdLFxuICBbIEZVTkNUSU9OLCAgICByZV9GVU5DVElPTiBdLFxuICBbIE5FV0xJTkUsICAgICByZV9ORVdMSU5FIF0sXG4gIFsgV0hJVEVTUEFDRSwgIHJlX1dISVRFU1BBQ0UgXSxcbiAgWyBTVFJJTkcsICAgICAgcmVfU1RSSU5HIF0sXG4gIFsgUEFUSF9RVU9URSwgIHJlX1BBVEhfUVVPVEUgXSxcbiAgWyBQQVRIX0JSQUNFLCAgcmVfUEFUSF9CUkFDRSBdLFxuICBbIFBBVEhfUFJFRklYLCByZV9QQVRIX1BSRUZJWCBdLFxuICBbIFJBTkdFLCAgICAgICByZV9SQ1JBTkdFLCBxdWlja1ZlcmlmeVJhbmdlUkMgXSxcbiAgWyBSQU5HRV9CRUFNLCAgcmVfUkNST1csIHF1aWNrVmVyaWZ5UmFuZ2VSQyBdLFxuICBbIFJBTkdFX0JFQU0sICByZV9SQ0NPTCwgcXVpY2tWZXJpZnlSYW5nZVJDIF0sXG4gIFsgTlVNQkVSLCAgICAgIHJlX05VTUJFUiBdLFxuICBbIFJBTkdFX05BTUVELCByZV9OQU1FRCBdXG5dO1xuXG5leHBvcnQgY29uc3QgdG9rZW5IYW5kbGVyc1JlZnNBMSA9IFtcbiAgWyBPUEVSQVRPUiwgICAgL15bITpdLyBdLFxuICBbIFBBVEhfUVVPVEUsICByZV9QQVRIX1FVT1RFIF0sXG4gIFsgUEFUSF9CUkFDRSwgIHJlX1BBVEhfQlJBQ0UgXSxcbiAgWyBQQVRIX1BSRUZJWCwgcmVfUEFUSF9QUkVGSVggXSxcbiAgWyBSQU5HRSwgICAgICAgcmVfQTFSQU5HRSwgcXVpY2tWZXJpZnlSYW5nZUExIF0sXG4gIFsgUkFOR0VfQkVBTSwgIHJlX0ExQ09MLCBxdWlja1ZlcmlmeVJhbmdlQTEgXSxcbiAgWyBSQU5HRV9CRUFNLCAgcmVfQTFST1csIHF1aWNrVmVyaWZ5UmFuZ2VBMSBdLFxuICBbIFJBTkdFX05BTUVELCByZV9OQU1FRCBdXG5dO1xuXG5leHBvcnQgY29uc3QgdG9rZW5IYW5kbGVyc1JlZnNSQyA9IFtcbiAgWyBPUEVSQVRPUiwgICAgL14hLyBdLFxuICBbIFBBVEhfUVVPVEUsICByZV9QQVRIX1FVT1RFIF0sXG4gIFsgUEFUSF9CUkFDRSwgIHJlX1BBVEhfQlJBQ0UgXSxcbiAgWyBQQVRIX1BSRUZJWCwgcmVfUEFUSF9QUkVGSVggXSxcbiAgWyBSQU5HRSwgICAgICAgcmVfUkNSQU5HRSwgcXVpY2tWZXJpZnlSYW5nZVJDIF0sXG4gIFsgUkFOR0VfQkVBTSwgIHJlX1JDUk9XLCBxdWlja1ZlcmlmeVJhbmdlUkMgXSxcbiAgWyBSQU5HRV9CRUFNLCAgcmVfUkNDT0wsIHF1aWNrVmVyaWZ5UmFuZ2VSQyBdLFxuICBbIFJBTkdFX05BTUVELCByZV9OQU1FRCBdXG5dO1xuIiwiaW1wb3J0IHtcbiAgRlhfUFJFRklYLFxuICBORVdMSU5FLFxuICBOVU1CRVIsXG4gIE9QRVJBVE9SLFxuICBQQVRIX0JSQUNFLFxuICBQQVRIX1BSRUZJWCxcbiAgUEFUSF9RVU9URSxcbiAgUkFOR0UsXG4gIFJBTkdFX0JFQU0sXG4gIFJBTkdFX05BTUVELFxuICBTVFJJTkcsXG4gIFVOS05PV04sXG4gIFdISVRFU1BBQ0UsXG4gIHRva2VuSGFuZGxlcnNBMSxcbiAgdG9rZW5IYW5kbGVyc1JDXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJztcblxuY29uc3QgaXNUeXBlID0gKHQsIHR5cGUpID0+IHQgJiYgdC50eXBlID09PSB0eXBlO1xuY29uc3QgaXNSYW5nZU9wID0gdCA9PiB0ICYmIHQudmFsdWUgPT09ICc6JztcbmNvbnN0IGlzQmFuZ09wID0gdCA9PiB0ICYmIHQudmFsdWUgPT09ICchJztcblxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gIGVtaXRSYW5nZXM6IGZhbHNlLFxuICBtZXJnZVJhbmdlczogdHJ1ZSxcbiAgbmVnYXRpdmVOdW1iZXJzOiBmYWxzZSxcbiAgcjFjMTogZmFsc2Vcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb2tlbnMgKGZ4LCB0b2tlbkhhbmRsZXJzLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgeyBlbWl0UmFuZ2VzLCBtZXJnZVJhbmdlcywgbmVnYXRpdmVOdW1iZXJzIH0gPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XG4gIGNvbnN0IHRva2VucyA9IFtdO1xuICBsZXQgcG9zID0gMDtcbiAgY29uc3QgbG9va0JlaGluZCA9IG4gPT4gdG9rZW5zW3Rva2Vucy5sZW5ndGggLSBuXTtcbiAgY29uc3QgbG9va0JlaGluZElnbm9yZVdTID0gbiA9PiB7XG4gICAgY29uc3Qgbm9XcyA9IHRva2Vucy5maWx0ZXIodCA9PiAhaXNUeXBlKHQsIFdISVRFU1BBQ0UpICYmICFpc1R5cGUodCwgTkVXTElORSkpO1xuICAgIHJldHVybiBub1dzW25vV3MubGVuZ3RoIC0gbl07XG4gIH07XG5cbiAgaWYgKC9ePS8udGVzdChmeCkpIHtcbiAgICBjb25zdCB0b2tlbiA9IHtcbiAgICAgIHR5cGU6IEZYX1BSRUZJWCxcbiAgICAgIHZhbHVlOiAnPScsXG4gICAgICAuLi4oZW1pdFJhbmdlcyA/IHsgcmFuZ2U6IFsgMCwgMSBdIH0gOiB7fSlcbiAgICB9O1xuICAgIHBvcysrO1xuICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgfVxuXG4gIHdoaWxlIChwb3MgPCBmeC5sZW5ndGgpIHtcbiAgICBjb25zdCBzdGFydFBvcyA9IHBvcztcbiAgICBjb25zdCBzID0gZnguc2xpY2UocG9zKTtcbiAgICBsZXQgdG9rZW5UeXBlID0gJyc7XG4gICAgbGV0IHRva2VuVmFsdWUgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2VuSGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IFsgdHlwZSwgcmVUZXN0LCBmblRlc3QgXSA9IHRva2VuSGFuZGxlcnNbaV07XG4gICAgICBjb25zdCBtID0gcmVUZXN0LmV4ZWMocyk7XG4gICAgICBpZiAobSAmJiAoIWZuVGVzdCB8fCBmblRlc3QobVswXSkpKSB7XG4gICAgICAgIHRva2VuVHlwZSA9IHR5cGU7XG4gICAgICAgIHRva2VuVmFsdWUgPSBtWzBdO1xuICAgICAgICBwb3MgKz0gbVswXS5sZW5ndGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdG9rZW5UeXBlKSB7XG4gICAgICB0b2tlblR5cGUgPSBVTktOT1dOO1xuICAgICAgdG9rZW5WYWx1ZSA9IGZ4W3Bvc107XG4gICAgICBwb3MrKztcbiAgICB9XG5cbiAgICBsZXQgdG9rZW4gPSB7XG4gICAgICB0eXBlOiB0b2tlblR5cGUsXG4gICAgICB2YWx1ZTogdG9rZW5WYWx1ZSxcbiAgICAgIC4uLihlbWl0UmFuZ2VzID8geyByYW5nZTogWyBzdGFydFBvcywgcG9zIF0gfSA6IHt9KVxuICAgIH07XG5cbiAgICBpZiAodG9rZW5UeXBlID09PSBTVFJJTkcgJiYgIXRva2VuVmFsdWUuZW5kc1dpdGgoJ1wiJykpIHtcbiAgICAgIHRva2VuLnVudGVybWluYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG5lZ2F0aXZlTnVtYmVycyAmJiB0b2tlblR5cGUgPT09IE5VTUJFUikge1xuICAgICAgY29uc3QgbGFzdDEgPSBsb29rQmVoaW5kKDEpO1xuICAgICAgaWYgKGxhc3QxICYmIGlzVHlwZShsYXN0MSwgT1BFUkFUT1IpICYmIGxhc3QxLnZhbHVlID09PSAnLScpIHtcbiAgICAgICAgLy8gd2UgaGF2ZSBhIG51bWJlciBwcmVjZWRlZCBieSBhIG1pbnVzXG4gICAgICAgIGNvbnN0IGxhc3QyID0gbG9va0JlaGluZElnbm9yZVdTKDIpO1xuICAgICAgICAvLyBtaXNzaW5nIGxhc3QyIG1lYW5zIHdlIGFyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHN0cmVhbVxuICAgICAgICBpZiAoIWxhc3QyIHx8IGlzVHlwZShsYXN0MiwgRlhfUFJFRklYKSB8fCAoaXNUeXBlKGxhc3QyLCBPUEVSQVRPUikgJiYgIVsgJyUnLCAnfScsICcpJywgJyMnIF0uaW5jbHVkZXMobGFzdDIudmFsdWUpKSkge1xuICAgICAgICAgIHRva2Vucy5wb3AoKTtcbiAgICAgICAgICB0b2tlbi52YWx1ZSA9ICctJyArIHRva2VuVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWVyZ2VSYW5nZXMpIHtcbiAgICAgIGlmICh0b2tlblR5cGUgPT09IFJBTkdFIHx8IHRva2VuVHlwZSA9PT0gUkFOR0VfTkFNRUQgfHwgdG9rZW5UeXBlID09PSBSQU5HRV9CRUFNKSB7XG4gICAgICAgIGNvbnN0IG1lcmdlID0gW107XG4gICAgICAgIC8vIGpvaW4gQTE6QTEgb3IgUkM6UkMtXG4gICAgICAgIGlmIChpc1JhbmdlT3AobG9va0JlaGluZCgxKSkgJiYgaXNUeXBlKGxvb2tCZWhpbmQoMiksIFJBTkdFKSAmJiB0b2tlblR5cGUgPT09IFJBTkdFKSB7XG4gICAgICAgICAgLy8gc2hvdWxkIG5vdCBiZSBkb25lIHRoaXMgaWYgY3VycmVudCBvciBsYXN0IHJhbmdlcyBhcmUgQTpBIG9yIDE6MSwgb3IgUiBvciBDKVxuICAgICAgICAgIG1lcmdlLnVuc2hpZnQoLi4udG9rZW5zLnNwbGljZSgtMiwgMikpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGpvaW4gcHJlZml4ZXNcbiAgICAgICAgaWYgKGlzQmFuZ09wKGxvb2tCZWhpbmQoMSkpKSB7XG4gICAgICAgICAgaWYgKGlzVHlwZShsb29rQmVoaW5kKDIpLCBQQVRIX1FVT1RFKSB8fCBpc1R5cGUobG9va0JlaGluZCgyKSwgUEFUSF9CUkFDRSkpIHtcbiAgICAgICAgICAgIG1lcmdlLnVuc2hpZnQoLi4udG9rZW5zLnNwbGljZSgtMiwgMikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChpc1R5cGUobG9va0JlaGluZCgyKSwgUEFUSF9QUkVGSVgpKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gaXNUeXBlKGxvb2tCZWhpbmQoMyksIFBBVEhfQlJBQ0UpID8gMyA6IDI7XG4gICAgICAgICAgICBtZXJnZS51bnNoaWZ0KC4uLnRva2Vucy5zcGxpY2UoLW4sIG4pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gd2FudCB0byBtZXJnZT9cbiAgICAgICAgaWYgKG1lcmdlLmxlbmd0aCkge1xuICAgICAgICAgIHRva2VuID0ge1xuICAgICAgICAgICAgdHlwZTogdG9rZW5UeXBlLFxuICAgICAgICAgICAgdmFsdWU6IG1lcmdlLm1hcChkID0+IGQudmFsdWUpLmpvaW4oJycpICsgdG9rZW5WYWx1ZSxcbiAgICAgICAgICAgIC4uLihlbWl0UmFuZ2VzID8geyByYW5nZTogWyBtZXJnZVswXS5yYW5nZVswXSwgcG9zIF0gfSA6IHt9KVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICB9XG5cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuLy8gRm9ybXVsYXMgY2FuIGVpdGhlciBoYXZlIFJDIG9yIEExIHN0eWxlIHJlZnMsIG5vdCBib3RoOiBiZWNhdXNlIEMxIGFuZCBSMSBhcmUgYm90aCFcbi8vIFJlZm1vZGU6IEExIHwgUkMgfCBBbm9zdGljIGVtaXQgcmFuZ2VzIHdpdGggUkFOR0VcbmV4cG9ydCBmdW5jdGlvbiB0b2tlbml6ZSAoZngsIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB0b2tlbkhhbmRsZXJzID0gb3B0aW9ucy5yMWMxID8gdG9rZW5IYW5kbGVyc1JDIDogdG9rZW5IYW5kbGVyc0ExO1xuICByZXR1cm4gZ2V0VG9rZW5zKGZ4LCB0b2tlbkhhbmRsZXJzLCBvcHRpb25zKTtcbn1cbiIsImltcG9ydCB7IEZYX1BSRUZJWCwgUEFUSF9CUkFDRSwgUEFUSF9QUkVGSVgsIFBBVEhfUVVPVEUsIFJBTkdFLCBSQU5HRV9OQU1FRCwgUkFOR0VfQkVBTSB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGdldFRva2VucyB9IGZyb20gJy4vbGV4ZXIuanMnO1xuXG5jb25zdCB1bnF1b3RlID0gZCA9PiBkLnNsaWNlKDEsIC0xKS5yZXBsYWNlKC8nJy9nLCBcIidcIik7XG5cbmNvbnN0IHBSYW5nZU9wID0gdCA9PiB0ICYmIHQudmFsdWUgPT09ICc6JyAmJiB7fTtcbmNvbnN0IHBSYW5nZSA9IHQgPT4gdCAmJiB0LnR5cGUgPT09IFJBTkdFICYmIHsgcjA6IHQudmFsdWUgfTtcbmNvbnN0IHBSYW5nZTIgPSB0ID0+IHQgJiYgdC50eXBlID09PSBSQU5HRSAmJiB7IHIxOiB0LnZhbHVlIH07XG5jb25zdCBwQmFuZyA9IHQgPT4gdCAmJiB0LnZhbHVlID09PSAnIScgJiYge307XG5jb25zdCBwQmVhbSA9IHQgPT4gdCAmJiB0LnR5cGUgPT09IFJBTkdFX0JFQU0gJiYgeyByMDogdC52YWx1ZSB9O1xuY29uc3QgcFNoZWV0ID0gdCA9PiB0ICYmIHQudHlwZSA9PT0gUEFUSF9QUkVGSVggJiYgL15bXjpcXFxcLz8qW1xcXV17MCwzMX0kLy50ZXN0KHQudmFsdWUpICYmIHsgc2hlZXROYW1lOiB0LnZhbHVlIH07XG5jb25zdCBwRmlsZSA9IHQgPT4gdCAmJiB0LnR5cGUgPT09IFBBVEhfQlJBQ0UgJiYgeyB3b3JrYm9va05hbWU6IHQudmFsdWUuc2xpY2UoMSwgLTEpIH07XG5jb25zdCBwRmlsZTIgPSB0ID0+IHQgJiYgdC50eXBlID09PSBQQVRIX1BSRUZJWCAmJiB7IHdvcmtib29rTmFtZTogdC52YWx1ZSB9O1xuY29uc3QgcE5hbWVkID0gdCA9PiB0ICYmIHQudHlwZSA9PT0gUkFOR0VfTkFNRUQgJiYgeyBuYW1lOiB0LnZhbHVlIH07XG5cbmNvbnN0IHBRdW90ZWQgPSB0ID0+IHtcbiAgaWYgKHQgJiYgdC50eXBlID09PSBQQVRIX1FVT1RFKSB7XG4gICAgY29uc3QgbSA9IC8oPzpcXFsoLis/KVxcXSk/KFteW1xcXV0rPykkLy5leGVjKHVucXVvdGUodC52YWx1ZSkpO1xuICAgIGlmIChtKSB7XG4gICAgICBjb25zdCBbICwgZmlsZSwgc2hlZXQgXSA9IG07XG4gICAgICBpZiAoIXNoZWV0IHx8IC9eW146XFxcXC8/KltcXF1dezAsMzF9JC8udGVzdChzaGVldCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB3b3JrYm9va05hbWU6IGZpbGUgfHwgJycsXG4gICAgICAgICAgc2hlZXROYW1lOiBzaGVldCB8fCAnJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbmNvbnN0IHBRdW90ZWQyID0gdCA9PiB0ICYmIHQudHlwZSA9PT0gUEFUSF9RVU9URSAmJiB7IHdvcmtib29rTmFtZTogdW5xdW90ZSh0LnZhbHVlKSB9O1xuXG5jb25zdCB2YWxpZFJ1bnMgPSBbXG4gIFsgcFJhbmdlIF0sXG4gIFsgcFJhbmdlLCBwUmFuZ2VPcCwgcFJhbmdlMiBdLFxuICBbIHBCZWFtIF0sXG4gIFsgcFF1b3RlZCwgcEJhbmcsIHBSYW5nZSBdLFxuICBbIHBRdW90ZWQsIHBCYW5nLCBwUmFuZ2UsIHBSYW5nZU9wLCBwUmFuZ2UyIF0sXG4gIFsgcFF1b3RlZCwgcEJhbmcsIHBCZWFtIF0sXG4gIFsgcFNoZWV0LCBwQmFuZywgcFJhbmdlIF0sXG4gIFsgcFNoZWV0LCBwQmFuZywgcFJhbmdlLCBwUmFuZ2VPcCwgcFJhbmdlMiBdLFxuICBbIHBTaGVldCwgcEJhbmcsIHBCZWFtIF0sXG4gIFsgcEZpbGUsIHBTaGVldCwgcEJhbmcsIHBSYW5nZSBdLFxuICBbIHBGaWxlLCBwU2hlZXQsIHBCYW5nLCBwUmFuZ2UsIHBSYW5nZU9wLCBwUmFuZ2UyIF0sXG4gIFsgcEZpbGUsIHBTaGVldCwgcEJhbmcsIHBCZWFtIF1cbl07XG5cbmNvbnN0IHZhbGlkUnVuc05hbWVkID0gdmFsaWRSdW5zLmNvbmNhdChbXG4gIFsgcE5hbWVkIF0sXG4gIFsgcEZpbGUyLCBwQmFuZywgcE5hbWVkIF0sXG4gIFsgcFF1b3RlZDIsIHBCYW5nLCBwTmFtZWQgXVxuXSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlZiAocmVmLCBhbGxvd19uYW1lZCA9IHRydWUsIHRva2VuSGFuZGxlcnMgPSBbXSkge1xuICBjb25zdCB0b2tlbnMgPSBnZXRUb2tlbnMocmVmLCB0b2tlbkhhbmRsZXJzLCB7XG4gICAgZW1pdFJhbmdlczogZmFsc2UsXG4gICAgbWVyZ2VSYW5nZXM6IGZhbHNlXG4gIH0pO1xuICBjb25zdCByZWZEYXRhID0ge1xuICAgIHNoZWV0TmFtZTogJycsXG4gICAgd29ya2Jvb2tOYW1lOiAnJyxcbiAgICByMDogJycsXG4gICAgcjE6ICcnLFxuICAgIG5hbWU6ICcnXG4gIH07XG4gIC8vIGRpc2NhcmQgdGhlIFwiPVwiLXByZWZpeCBpZiBpdCBpcyB0aGVyZVxuICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbMF0udHlwZSA9PT0gRlhfUFJFRklYKSB7XG4gICAgdG9rZW5zLnNoaWZ0KCk7XG4gIH1cbiAgY29uc3QgcnVucyA9IGFsbG93X25hbWVkID8gdmFsaWRSdW5zTmFtZWQgOiB2YWxpZFJ1bnM7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcnVucy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGRhdGEgPSB7IC4uLnJlZkRhdGEgfTtcbiAgICBpZiAocnVuc1tpXS5sZW5ndGggPT09IHRva2Vucy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHZhbGlkID0gcnVuc1tpXS5ldmVyeSgocGFyc2UsIGopID0+IHtcbiAgICAgICAgY29uc3QgZCA9IHBhcnNlKHRva2Vuc1tqXSk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZGF0YSwgZCk7XG4gICAgICAgIHJldHVybiBkO1xuICAgICAgfSk7XG4gICAgICBpZiAodmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuIiwiaW1wb3J0IHsgTUFYX1JPV1MsIE1BWF9DT0xTLCB0b2tlbkhhbmRsZXJzUmVmc0ExIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgcGFyc2VSZWYgfSBmcm9tICcuL3BhcnNlUmVmLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Db2wgKGNvbFN0cikge1xuICBjb25zdCBjID0gKGNvbFN0ciB8fCAnJykudG9VcHBlckNhc2UoKTtcbiAgbGV0IGQgPSAwO1xuICBsZXQgaSA9IDA7XG4gIGZvciAoOyBpICE9PSBjLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgY2hyID0gYy5jaGFyQ29kZUF0KGkpO1xuICAgIGlmIChjaHIgPj0gNjUgJiYgY2hyIDw9IDkwKSB7IC8vIG9taXRzIGFueSBub24gQS1aIGNoYXJhY3RlclxuICAgICAgZCA9IDI2ICogZCArIGNociAtIDY0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gZCAtIDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0NvbCAobGVmdCkge1xuICBsZXQgbiA9IGxlZnQ7XG4gIGxldCBjID0gJyc7XG4gIHdoaWxlIChuID49IDApIHtcbiAgICBjID0gU3RyaW5nLmZyb21DaGFyQ29kZShuICUgMjYgKyA2NSkgKyBjO1xuICAgIG4gPSBNYXRoLmZsb29yKG4gLyAyNikgLSAxO1xuICB9XG4gIHJldHVybiBjO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdyAocm93U3RyKSB7XG4gIHJldHVybiArcm93U3RyIC0gMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvUm93ICh0b3ApIHtcbiAgcmV0dXJuIFN0cmluZyh0b3AgKyAxKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvUmVsYXRpdmUgKHJhbmdlKSB7XG4gIGNvbnN0IHsgdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0IH0gPSByYW5nZTtcbiAgcmV0dXJuIHsgdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0LCAkbGVmdDogZmFsc2UsICRyaWdodDogZmFsc2UsICR0b3A6IGZhbHNlLCAkYm90dG9tOiBmYWxzZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9BYnNvbHV0ZSAocmFuZ2UpIHtcbiAgY29uc3QgeyB0b3AsIGxlZnQsIGJvdHRvbSwgcmlnaHQgfSA9IHJhbmdlO1xuICByZXR1cm4geyB0b3AsIGxlZnQsIGJvdHRvbSwgcmlnaHQsICRsZWZ0OiB0cnVlLCAkcmlnaHQ6IHRydWUsICR0b3A6IHRydWUsICRib3R0b206IHRydWUgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvQTEgKHJhbmdlKSB7XG4gIGNvbnN0IHRvQWJzID0gZCA9PiAoZCA/ICckJyA6ICcnKTtcbiAgY29uc3QgeyB0b3AsIGxlZnQsIGJvdHRvbSwgcmlnaHQsICRsZWZ0LCAkcmlnaHQsICR0b3AsICRib3R0b20gfSA9IHJhbmdlO1xuICAvLyBBOkFcbiAgaWYgKHRvcCA9PT0gMCAmJiBib3R0b20gPT09IE1BWF9ST1dTKSB7XG4gICAgcmV0dXJuIHRvQWJzKCRsZWZ0KSArIHRvQ29sKGxlZnQpICsgJzonICsgdG9BYnMoJHJpZ2h0KSArIHRvQ29sKHJpZ2h0KTtcbiAgfVxuICAvLyAxOjFcbiAgaWYgKGxlZnQgPT09IDAgJiYgcmlnaHQgPT09IE1BWF9DT0xTKSB7XG4gICAgcmV0dXJuIHRvQWJzKCR0b3ApICsgdG9Sb3codG9wKSArICc6JyArIHRvQWJzKCRib3R0b20pICsgdG9Sb3coYm90dG9tKTtcbiAgfVxuICAvLyBBMTpBMVxuICBpZiAocmlnaHQgIT0gbnVsbCAmJiBib3R0b20gIT0gbnVsbCAmJiAocmlnaHQgIT09IGxlZnQgfHwgYm90dG9tICE9PSB0b3ApKSB7XG4gICAgcmV0dXJuIHRvQWJzKCRsZWZ0KSArIHRvQ29sKGxlZnQpICsgdG9BYnMoJHRvcCkgKyB0b1Jvdyh0b3ApICsgJzonICsgdG9BYnMoJHJpZ2h0KSArIHRvQ29sKHJpZ2h0KSArIHRvQWJzKCRib3R0b20pICsgdG9Sb3coYm90dG9tKTtcbiAgfVxuICAvLyBBMVxuICByZXR1cm4gdG9BYnMoJGxlZnQpICsgdG9Db2wobGVmdCkgKyB0b0FicygkdG9wKSArIHRvUm93KHRvcCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tQTEgKHJhbmdlU3RyKSB7XG4gIGxldCBtO1xuICBsZXQgdG9wID0gMDtcbiAgbGV0IGxlZnQgPSAwO1xuICBsZXQgYm90dG9tID0gTUFYX1JPV1M7XG4gIGxldCByaWdodCA9IE1BWF9DT0xTO1xuICBsZXQgJHRvcCA9IGZhbHNlO1xuICBsZXQgJGxlZnQgPSBmYWxzZTtcbiAgbGV0ICRib3R0b20gPSBmYWxzZTtcbiAgbGV0ICRyaWdodCA9IGZhbHNlO1xuICAvLyBBOkFcbiAgaWYgKChtID0gL14oXFwkPykoW0EtWl17MSwzfSk6KFxcJD8pKFtBLVpdezEsM30pJC8uZXhlYyhyYW5nZVN0cikpKSB7XG4gICAgY29uc3QgYSA9IGZyb21Db2wobVsyXSk7XG4gICAgY29uc3QgYiA9IGZyb21Db2wobVs0XSk7XG4gICAgbGVmdCA9IE1hdGgubWluKGEsIGIpO1xuICAgIHJpZ2h0ID0gTWF0aC5tYXgoYSwgYik7XG4gICAgJGxlZnQgPSAhIW1bYSA8PSBiID8gMSA6IDNdO1xuICAgICRyaWdodCA9ICEhbVthIDw9IGIgPyAzIDogMV07XG4gICAgJHRvcCA9IHRydWU7XG4gICAgJGJvdHRvbSA9IHRydWU7XG4gICAgcmV0dXJuIHsgdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0LCAkdG9wLCAkbGVmdCwgJGJvdHRvbSwgJHJpZ2h0IH07XG4gIH1cbiAgLy8gMToxXG4gIGVsc2UgaWYgKChtID0gL14oXFwkPykoWzEtOV1cXGR7MCw2fSk6KFxcJD8pKFsxLTldXFxkezAsNn0pJC8uZXhlYyhyYW5nZVN0cikpKSB7XG4gICAgY29uc3QgYSA9IGZyb21Sb3cobVsyXSk7XG4gICAgY29uc3QgYiA9IGZyb21Sb3cobVs0XSk7XG4gICAgdG9wID0gTWF0aC5taW4oYSwgYik7XG4gICAgYm90dG9tID0gTWF0aC5tYXgoYSwgYik7XG4gICAgJHRvcCA9ICEhbVthIDw9IGIgPyAxIDogM107XG4gICAgJGJvdHRvbSA9ICEhbVthIDw9IGIgPyAzIDogMV07XG4gICAgJGxlZnQgPSB0cnVlO1xuICAgICRyaWdodCA9IHRydWU7XG4gICAgcmV0dXJuIHsgdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0LCAkdG9wLCAkbGVmdCwgJGJvdHRvbSwgJHJpZ2h0IH07XG4gIH1cbiAgLy8gQTEgfCBBMTpCMlxuICBlbHNlIHtcbiAgICBjb25zdCBbIHBhcnQxLCBwYXJ0MiBdID0gcmFuZ2VTdHIuc3BsaXQoJzonKTtcbiAgICBpZiAoKG0gPSAvXihcXCQ/KShbQS1aXXsxLDN9KShcXCQ/KShbMS05XVxcZHswLDZ9KSQvaS5leGVjKHBhcnQxKSkpIHtcbiAgICAgIGxlZnQgPSBmcm9tQ29sKG1bMl0pO1xuICAgICAgdG9wID0gZnJvbVJvdyhtWzRdKTtcbiAgICAgICRsZWZ0ID0gISFtWzFdO1xuICAgICAgJHRvcCA9ICEhbVszXTtcbiAgICAgIGlmIChwYXJ0MiAmJiAobSA9IC9eKFxcJD8pKFtBLVpdezEsM30pKFxcJD8pKFsxLTldXFxkezAsNn0pJC9pLmV4ZWMocGFydDIpKSkge1xuICAgICAgICByaWdodCA9IGZyb21Db2wobVsyXSk7XG4gICAgICAgIGJvdHRvbSA9IGZyb21Sb3cobVs0XSk7XG4gICAgICAgICRyaWdodCA9ICEhbVsxXTtcbiAgICAgICAgJGJvdHRvbSA9ICEhbVszXTtcbiAgICAgICAgLy8gbmVlZCB0byBmbGlwP1xuICAgICAgICBpZiAoYm90dG9tIDwgdG9wKSB7XG4gICAgICAgICAgWyB0b3AsIGJvdHRvbSwgJHRvcCwgJGJvdHRvbSBdID0gWyBib3R0b20sIHRvcCwgJGJvdHRvbSwgJHRvcCBdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyaWdodCA8IGxlZnQpIHtcbiAgICAgICAgICBbIGxlZnQsIHJpZ2h0LCAkbGVmdCwgJHJpZ2h0IF0gPSBbIHJpZ2h0LCBsZWZ0LCAkcmlnaHQsICRsZWZ0IF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBib3R0b20gPSB0b3A7XG4gICAgICAgIHJpZ2h0ID0gbGVmdDtcbiAgICAgICAgJGJvdHRvbSA9ICR0b3A7XG4gICAgICAgICRyaWdodCA9ICRsZWZ0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0LCAkdG9wLCAkbGVmdCwgJGJvdHRvbSwgJHJpZ2h0IH07XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VBMVJlZiAocmVmLCBhbGxvd19uYW1lZCA9IHRydWUpIHtcbiAgY29uc3QgZCA9IHBhcnNlUmVmKHJlZiwgYWxsb3dfbmFtZWQsIHRva2VuSGFuZGxlcnNSZWZzQTEpO1xuICBpZiAoZCAmJiAoZC5yMCB8fCBkLm5hbWUpKSB7XG4gICAgbGV0IHJhbmdlID0gbnVsbDtcbiAgICBpZiAoZC5yMCkge1xuICAgICAgcmFuZ2UgPSBkLnIxID8gZnJvbUExKGQucjAgKyAnOicgKyBkLnIxKSA6IGZyb21BMShkLnIwKTtcbiAgICB9XG4gICAgaWYgKGQubmFtZSB8fCByYW5nZSkge1xuICAgICAgZC5yYW5nZSA9IHJhbmdlO1xuICAgICAgZGVsZXRlIGQucjA7XG4gICAgICBkZWxldGUgZC5yMTtcbiAgICAgIHJldHVybiBkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBmcm9tQ29sLFxuICB0b0NvbCxcbiAgdG9SZWxhdGl2ZSxcbiAgdG9BYnNvbHV0ZSxcbiAgdG86IHRvQTEsXG4gIGZyb206IGZyb21BMSxcbiAgcGFyc2U6IHBhcnNlQTFSZWZcbn07XG4iLCJpbXBvcnQgeyBSQU5HRSwgUkFOR0VfQkVBTSwgVU5LTk9XTiB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IHBhcnNlQTFSZWYsIHRvUmVsYXRpdmUsIHRvQTEgfSBmcm9tICcuL2ExLmpzJztcblxuZnVuY3Rpb24gZ2V0SURlciAoKSB7XG4gIGxldCBpID0gMTtcbiAgcmV0dXJuICgpID0+ICdmeGcnICsgKGkrKyk7XG59XG5cbi8vIHdoZW4gY29udGV4dCBpcyBTaGVldDEsIHdlIHNob3VsZCBjb25zaWRlciBTaGVldCFBMSA9PSBBMVxuZXhwb3J0IGZ1bmN0aW9uIGFkZE1ldGEgKHRva2VucywgeyBzaGVldE5hbWUgPSAnJywgd29ya2Jvb2tOYW1lID0gJycgfSA9IHt9KSB7XG4gIGNvbnN0IHBhcmVuU3RhY2sgPSBbXTtcbiAgbGV0IGFycmF5U3RhcnQgPSBudWxsO1xuICBjb25zdCBhMU1hcCA9IHt9O1xuICBjb25zdCB1aWQgPSBnZXRJRGVyKCk7XG5cbiAgdG9rZW5zLmZvckVhY2goKHRva2VuLCBpKSA9PiB7XG4gICAgdG9rZW4uaW5kZXggPSBpO1xuICAgIHRva2VuLmRlcHRoID0gcGFyZW5TdGFjay5sZW5ndGg7XG4gICAgaWYgKHRva2VuLnZhbHVlID09PSAnKCcpIHtcbiAgICAgIHRva2VuLmRlcHRoID0gcGFyZW5TdGFjay5sZW5ndGggKyAxO1xuICAgICAgcGFyZW5TdGFjay5wdXNoKHRva2VuKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodG9rZW4udmFsdWUgPT09ICcpJykge1xuICAgICAgY29uc3QgY291bnRlciA9IHBhcmVuU3RhY2sucG9wKCk7XG4gICAgICBpZiAoY291bnRlcikge1xuICAgICAgICBjb25zdCBwYWlySWQgPSB1aWQoKTtcbiAgICAgICAgdG9rZW4uZ3JvdXBJZCA9IHBhaXJJZDtcbiAgICAgICAgdG9rZW4uZGVwdGggPSBjb3VudGVyLmRlcHRoO1xuICAgICAgICBjb3VudGVyLmdyb3VwSWQgPSBwYWlySWQ7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdG9rZW4uZXJyb3IgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICh0b2tlbi52YWx1ZSA9PT0gJ3snKSB7XG4gICAgICBpZiAoIWFycmF5U3RhcnQpIHtcbiAgICAgICAgYXJyYXlTdGFydCA9IHRva2VuO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRva2VuLmVycm9yID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodG9rZW4udmFsdWUgPT09ICd9Jykge1xuICAgICAgaWYgKGFycmF5U3RhcnQpIHtcbiAgICAgICAgY29uc3QgcGFpcklkID0gdWlkKCk7XG4gICAgICAgIHRva2VuLmdyb3VwSWQgPSBwYWlySWQ7XG4gICAgICAgIGFycmF5U3RhcnQuZ3JvdXBJZCA9IHBhaXJJZDtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0b2tlbi5lcnJvciA9IHRydWU7XG4gICAgICB9XG4gICAgICBhcnJheVN0YXJ0ID0gbnVsbDtcbiAgICB9XG4gICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gUkFOR0UgfHwgdG9rZW4udHlwZSA9PT0gUkFOR0VfQkVBTSkge1xuICAgICAgY29uc3QgcmVmID0gcGFyc2VBMVJlZih0b2tlbi52YWx1ZSwgZmFsc2UpO1xuICAgICAgY29uc3QgYTEgPSByZWYgJiYgKGBbJHtyZWYud29ya2Jvb2tOYW1lIHx8IHdvcmtib29rTmFtZX1dJHtyZWYuc2hlZXROYW1lIHx8IHNoZWV0TmFtZX0hJHtyZWYucmFuZ2UgPyB0b0ExKHRvUmVsYXRpdmUocmVmLnJhbmdlKSkgOiByZWYubmFtZX1gKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGExKSB7XG4gICAgICAgIGlmIChhMSBpbiBhMU1hcCkge1xuICAgICAgICAgIHRva2VuLmdyb3VwSWQgPSBhMU1hcFthMV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdG9rZW4uZ3JvdXBJZCA9IHVpZCgpO1xuICAgICAgICAgIGExTWFwW2ExXSA9IHRva2VuLmdyb3VwSWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gVU5LTk9XTikge1xuICAgICAgdG9rZW4uZXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB0b2tlbnM7XG59XG4iLCIvKlxuICBSQyBub3RhdGlvbiB3b3JrcyBkaWZmZXJlbnRseSBmcm9tIEExIGluIHRoYXQgd2UgY2FuJ3QgbWVyZ2Ugc3RhdGljIHJlZmVyZW5jZXMgam9pbmVkIGJ5IGA6YC5cbiAgTWVyZ2luZyBjYW4gb25seSB3b3JrIGJldHdlZW4gcmVmZXJlbmNlcyB0aGF0IGFyZSByZWxhdGl2ZS9hYnNvbHV0ZSBvbiB0aGUgc2FtZSBheGVzLCBzbzpcbiAgUjFDMTpSMkMyIHdpbGwgd29yaywgUlsxXUMxOlJbMl1DMiB3aWxsIGFsc28gd29yaywgYnV0IFJbMV1DWzFdOlIyQzIgY2Fubm90IGJlIHJlcHJlc2VudGVkXG4gIHNpbXBseSBieSBhIHJlY3RhbmdsZSBhcyB3aXRob3V0IGtub3dpbmcgdGhlIGNlbGwgY29udGV4dC5cbiovXG5cbmltcG9ydCB7IE1BWF9ST1dTLCBNQVhfQ09MUywgdG9rZW5IYW5kbGVyc1JlZnNSQyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IHBhcnNlUmVmIH0gZnJvbSAnLi9wYXJzZVJlZi5qcyc7XG5cbmZ1bmN0aW9uIHRvQ29vcmQgKHZhbHVlLCBpc0Ficykge1xuICBpZiAoaXNBYnMpIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlICsgMSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlID8gJ1snICsgdmFsdWUgKyAnXScgOiAnJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvUkMgKHJhbmdlKSB7XG4gIGNvbnN0IHsgcjAsIGMwLCByMSwgYzEsICRjMCwgJGMxLCAkcjAsICRyMSB9ID0gcmFuZ2U7XG4gIC8vIEM6Q1xuICBpZiAocjAgPT09IDAgJiYgcjEgPT09IE1BWF9ST1dTKSB7XG4gICAgY29uc3QgYSA9IHRvQ29vcmQoYzAsICRjMCk7XG4gICAgY29uc3QgYiA9IHRvQ29vcmQoYzEsICRjMSk7XG4gICAgcmV0dXJuICdDJyArIChhID09PSBiID8gYSA6IGEgKyAnOkMnICsgYik7XG4gIH1cbiAgLy8gUjpSXG4gIGlmIChjMCA9PT0gMCAmJiBjMSA9PT0gTUFYX0NPTFMpIHtcbiAgICBjb25zdCBhID0gdG9Db29yZChyMCwgJHIwKTtcbiAgICBjb25zdCBiID0gdG9Db29yZChyMSwgJHIxKTtcbiAgICByZXR1cm4gJ1InICsgKGEgPT09IGIgPyBhIDogYSArICc6UicgKyBiKTtcbiAgfVxuICAvLyBSQzpSQ1xuICBjb25zdCBzX3IwID0gdG9Db29yZChyMCwgJHIwKTtcbiAgY29uc3Qgc19yMSA9IHRvQ29vcmQocjEsICRyMSk7XG4gIGNvbnN0IHNfYzAgPSB0b0Nvb3JkKGMwLCAkYzApO1xuICBjb25zdCBzX2MxID0gdG9Db29yZChjMSwgJGMxKTtcbiAgaWYgKHNfcjAgIT09IHNfcjEgfHwgc19jMCAhPT0gc19jMSkge1xuICAgIHJldHVybiAnUicgKyBzX3IwICsgJ0MnICsgc19jMCArICc6UicgKyBzX3IxICsgJ0MnICsgc19jMTtcbiAgfVxuICAvLyBSQ1xuICByZXR1cm4gJ1InICsgc19yMCArICdDJyArIHNfYzA7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUkNQYXJ0IChyZWYpIHtcbiAgbGV0IHIwID0gMDtcbiAgbGV0IGMwID0gMDtcbiAgbGV0IHIxID0gTUFYX1JPV1M7XG4gIGxldCBjMSA9IE1BWF9DT0xTO1xuICBsZXQgJHIwID0gZmFsc2U7XG4gIGxldCAkYzAgPSBmYWxzZTtcbiAgbGV0ICRyMSA9IGZhbHNlO1xuICBsZXQgJGMxID0gZmFsc2U7XG4gIC8vIFIgcGFydFxuICBjb25zdCBybSA9IC9eUig/OlxcWyhbKy1dP1xcZCspXFxdfChcXGQrKSk/Ly5leGVjKHJlZik7XG4gIGlmIChybSkge1xuICAgIGlmIChybVsxXSkge1xuICAgICAgcjAgPSBwYXJzZUludChybVsxXSwgMTApO1xuICAgIH1cbiAgICBlbHNlIGlmIChybVsyXSkge1xuICAgICAgcjAgPSBwYXJzZUludChybVsyXSwgMTApIC0gMTtcbiAgICAgICRyMCA9IHRydWU7XG4gICAgfVxuICAgIHIxID0gcjA7XG4gICAgJHIxID0gJHIwO1xuICAgIHJlZiA9IHJlZi5zbGljZShybVswXS5sZW5ndGgpO1xuICB9XG4gIGVsc2Uge1xuICAgIC8vIHIwID0gMCwgcjEgPSBNQVhfUk9XU1xuICAgICRyMCA9IHRydWU7XG4gICAgJHIxID0gdHJ1ZTtcbiAgfVxuICAvLyBDIHBhcnRcbiAgY29uc3QgY20gPSAvXkMoPzpcXFsoWystXT9cXGQrKVxcXXwoXFxkKykpPy8uZXhlYyhyZWYpO1xuICBpZiAoY20pIHtcbiAgICBpZiAoY21bMV0pIHtcbiAgICAgIGMwID0gcGFyc2VJbnQoY21bMV0sIDEwKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY21bMl0pIHtcbiAgICAgIGMwID0gcGFyc2VJbnQoY21bMl0sIDEwKSAtIDE7XG4gICAgICAkYzAgPSB0cnVlO1xuICAgIH1cbiAgICBjMSA9IGMwO1xuICAgICRjMSA9ICRjMDtcbiAgICByZWYgPSByZWYuc2xpY2UoY21bMF0ubGVuZ3RoKTtcbiAgfVxuICBlbHNlIHtcbiAgICAvLyBjMCA9IDAsIGMxID0gTUFYX0NPTFNcbiAgICAkYzAgPSB0cnVlO1xuICAgICRjMSA9IHRydWU7XG4gIH1cbiAgLy8gbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBwYXJ0IChhbmQgbm90aGluZyBtb3JlKVxuICBpZiAoKCFybSAmJiAhY20pIHx8IHJlZi5sZW5ndGgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4geyByMCwgYzAsIHIxLCBjMSwgJHIwLCAkYzAsICRyMSwgJGMxIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUkMgKHJlZikge1xuICBjb25zdCBbIHBhcnQxLCBwYXJ0MiBdID0gcmVmLnNwbGl0KCc6JywgMik7XG4gIGNvbnN0IHJhbmdlID0gcGFyc2VSQ1BhcnQocGFydDEpO1xuICBpZiAoIXJhbmdlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKHJhbmdlICYmIHBhcnQyKSB7XG4gICAgY29uc3QgZXh0ZW5kVG8gPSBwYXJzZVJDUGFydChwYXJ0Mik7XG4gICAgaWYgKGV4dGVuZFRvKSB7XG4gICAgICAvLyBOb3RlOiBSWy0xXUNbLTFdOlIxQzEgaXMgb25seSBtZWFuaW5nZnVsIG9uY2Ugd2UgaGF2ZSBhbiBhbmNob3JcbiAgICAgIHJhbmdlLnIxID0gZXh0ZW5kVG8ucjE7XG4gICAgICByYW5nZS5jMSA9IGV4dGVuZFRvLmMxO1xuICAgICAgcmFuZ2UuJHIxID0gZXh0ZW5kVG8uJHIxO1xuICAgICAgcmFuZ2UuJGMxID0gZXh0ZW5kVG8uJGMxO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmFuZ2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJDUmVmIChyZWYsIGFsbG93X25hbWVkID0gdHJ1ZSkge1xuICBjb25zdCBkID0gcGFyc2VSZWYocmVmLCBhbGxvd19uYW1lZCwgdG9rZW5IYW5kbGVyc1JlZnNSQyk7XG4gIGlmIChkICYmIChkLnIwIHx8IGQubmFtZSkpIHtcbiAgICBjb25zdCByYW5nZSA9IGQucjEgPyBmcm9tUkMoZC5yMCArICc6JyArIGQucjEpIDogZnJvbVJDKGQucjApO1xuICAgIGlmIChkLm5hbWUgfHwgcmFuZ2UpIHtcbiAgICAgIGQucmFuZ2UgPSByYW5nZTtcbiAgICAgIGRlbGV0ZSBkLnIwO1xuICAgICAgZGVsZXRlIGQucjE7XG4gICAgICByZXR1cm4gZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgdG86IHRvUkMsXG4gIGZyb206IGZyb21SQyxcbiAgcGFyc2U6IHBhcnNlUkNSZWZcbn07XG4iLCJpbXBvcnQgeyBSQU5HRSwgUkFOR0VfQkVBTSwgTUFYX1JPV1MsIE1BWF9DT0xTIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgZnJvbUExLCB0b0ExIH0gZnJvbSAnLi9hMS5qcyc7XG5pbXBvcnQgeyBmcm9tUkMsIHRvUkMgfSBmcm9tICcuL3JjLmpzJztcbmltcG9ydCB7IHRva2VuaXplIH0gZnJvbSAnLi9sZXhlci5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGVUb1JDIChmeCwgYW5jaG9yQ2VsbCkge1xuICBjb25zdCB7IHRvcCwgbGVmdCB9ID0gZnJvbUExKGFuY2hvckNlbGwpO1xuICBjb25zdCBpc1N0cmluZyA9IHR5cGVvZiBmeCA9PT0gJ3N0cmluZyc7XG5cbiAgY29uc3QgdG9rZW5zID0gaXNTdHJpbmdcbiAgICA/IHRva2VuaXplKGZ4LCB7IGVtaXRSYW5nZXM6IGZhbHNlLCBtZXJnZVJhbmdlczogZmFsc2UsIHIxYzI6IGZhbHNlIH0pXG4gICAgOiBmeDtcblxuICB0b2tlbnMuZm9yRWFjaCh0b2tlbiA9PiB7XG4gICAgaWYgKHRva2VuLnR5cGUgPT09IFJBTkdFKSB7XG4gICAgICBjb25zdCByYW5nZSA9IHt9O1xuICAgICAgY29uc3QgZCA9IGZyb21BMSh0b2tlbi52YWx1ZSk7XG5cbiAgICAgIHJhbmdlLnIwID0gZC4kdG9wID8gZC50b3AgOiBkLnRvcCAtIHRvcDtcbiAgICAgIHJhbmdlLiRyMCA9IGQuJHRvcDtcbiAgICAgIHJhbmdlLnIxID0gZC4kYm90dG9tID8gZC5ib3R0b20gOiBkLmJvdHRvbSAtIHRvcDtcbiAgICAgIHJhbmdlLiRyMSA9IGQuJGJvdHRvbTtcblxuICAgICAgcmFuZ2UuYzAgPSBkLiRsZWZ0ID8gZC5sZWZ0IDogZC5sZWZ0IC0gbGVmdDtcbiAgICAgIHJhbmdlLiRjMCA9IGQuJGxlZnQ7XG4gICAgICByYW5nZS5jMSA9IGQuJHJpZ2h0ID8gZC5yaWdodCA6IGQucmlnaHQgLSBsZWZ0O1xuICAgICAgcmFuZ2UuJGMxID0gZC4kcmlnaHQ7XG5cbiAgICAgIC8vIGNvbnNvbGUuZXJyb3IodG9rZW4udmFsdWUsIGQsIHJhbmdlLCBbIHRvcCwgbGVmdCBdKTtcbiAgICAgIHRva2VuLnZhbHVlID0gdG9SQyhyYW5nZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT09IFJBTkdFX0JFQU0pIHtcbiAgICAgIGNvbnN0IHJhbmdlID0ge307XG4gICAgICBjb25zdCBkID0gZnJvbUExKHRva2VuLnZhbHVlKTtcblxuICAgICAgcmFuZ2UucjAgPSBkLiR0b3AgPyBkLnRvcCA6IGQudG9wIC0gdG9wO1xuICAgICAgcmFuZ2UuJHIwID0gZC4kdG9wO1xuICAgICAgcmFuZ2UucjEgPSBkLiRib3R0b20gPyBkLmJvdHRvbSA6IGQuYm90dG9tIC0gdG9wO1xuICAgICAgcmFuZ2UuJHIxID0gZC4kYm90dG9tO1xuXG4gICAgICByYW5nZS5jMCA9IGQuJGxlZnQgPyBkLmxlZnQgOiBkLmxlZnQgLSBsZWZ0O1xuICAgICAgcmFuZ2UuJGMwID0gZC4kbGVmdDtcbiAgICAgIHJhbmdlLmMxID0gZC4kcmlnaHQgPyBkLnJpZ2h0IDogZC5yaWdodCAtIGxlZnQ7XG4gICAgICByYW5nZS4kYzEgPSBkLiRyaWdodDtcblxuICAgICAgdG9rZW4udmFsdWUgPSB0b1JDKHJhbmdlKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBpc1N0cmluZ1xuICAgID8gdG9rZW5zLm1hcChkID0+IGQudmFsdWUpLmpvaW4oJycpXG4gICAgOiB0b2tlbnM7XG59XG5cbmZ1bmN0aW9uIHRvRml4ZWQgKHZhbCwgYWJzLCBiYXNlLCBtYXgpIHtcbiAgbGV0IHYgPSB2YWw7XG4gIGlmICghYWJzKSB7XG4gICAgdiA9IGJhc2UgKyB2YWw7XG4gICAgLy8gRXhjZWwgXCJ3cmFwcyBhcm91bmRcIiB3aGVuIHZhbHVlIGdvZXMgb3V0IG9mIGxvd2VyIGJvdW5kcy5cbiAgICAvLyBJdCdzIGEgYml0IHF1aXJreSBvbiBlbnRyeSBhcyBFeGNlbCB3YW50cyB0byByZS1yZXdpdGUgdGhlXG4gICAgLy8gcmVmZXJlbmNlcyBidXQgYmVoYXZpb3VyIGlzIGNvbnNpc3RlbnQgd2l0aCBJTkRJUkVDVDpcbiAgICAvLyAuLi4gSW4gQTE6IFJDWy0xXSA9PiBSMUNbMTYzODNdLlxuICAgIGlmICh2IDwgMCkge1xuICAgICAgdiA9IG1heCArIHYgKyAxO1xuICAgIH1cbiAgICAvLyAuLi4gSW4gQjE6ID1SQ1sxNjM4M10gPT4gPVJDWy0xXVxuICAgIGlmICh2ID4gbWF4KSB7XG4gICAgICB2IC09IG1heCArIDE7XG4gICAgfVxuICB9XG4gIHJldHVybiB2O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlVG9BMSAoZngsIGFuY2hvckNlbGwpIHtcbiAgY29uc3QgYW5jaG9yID0gZnJvbUExKGFuY2hvckNlbGwpO1xuICBjb25zdCBpc1N0cmluZyA9IHR5cGVvZiBmeCA9PT0gJ3N0cmluZyc7XG5cbiAgY29uc3QgdG9rZW5zID0gaXNTdHJpbmdcbiAgICA/IHRva2VuaXplKGZ4LCB7IGVtaXRSYW5nZXM6IGZhbHNlLCBtZXJnZVJhbmdlczogZmFsc2UsIHIxYzE6IHRydWUgfSlcbiAgICA6IGZ4O1xuXG4gIHRva2Vucy5mb3JFYWNoKHRva2VuID0+IHtcbiAgICBpZiAodG9rZW4udHlwZSA9PT0gUkFOR0UgfHwgdG9rZW4udHlwZSA9PT0gUkFOR0VfQkVBTSkge1xuICAgICAgY29uc3QgcmFuZ2UgPSB7fTtcbiAgICAgIGNvbnN0IGQgPSBmcm9tUkModG9rZW4udmFsdWUpO1xuICAgICAgY29uc3QgcjAgPSB0b0ZpeGVkKGQucjAsIGQuJHIwLCBhbmNob3IudG9wLCBNQVhfUk9XUyk7XG4gICAgICBjb25zdCByMSA9IHRvRml4ZWQoZC5yMSwgZC4kcjEsIGFuY2hvci50b3AsIE1BWF9ST1dTKTtcbiAgICAgIGlmIChyMCA+IHIxKSB7XG4gICAgICAgIHJhbmdlLnRvcCA9IHIxO1xuICAgICAgICByYW5nZS4kdG9wID0gZC4kcjE7XG4gICAgICAgIHJhbmdlLmJvdHRvbSA9IHIwO1xuICAgICAgICByYW5nZS4kYm90dG9tID0gZC4kcjA7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmFuZ2UudG9wID0gcjA7XG4gICAgICAgIHJhbmdlLiR0b3AgPSBkLiRyMDtcbiAgICAgICAgcmFuZ2UuYm90dG9tID0gcjE7XG4gICAgICAgIHJhbmdlLiRib3R0b20gPSBkLiRyMTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGMwID0gdG9GaXhlZChkLmMwLCBkLiRjMCwgYW5jaG9yLmxlZnQsIE1BWF9DT0xTKTtcbiAgICAgIGNvbnN0IGMxID0gdG9GaXhlZChkLmMxLCBkLiRjMSwgYW5jaG9yLmxlZnQsIE1BWF9DT0xTKTtcbiAgICAgIGlmIChjMCA+IGMxKSB7XG4gICAgICAgIHJhbmdlLmxlZnQgPSBjMTtcbiAgICAgICAgcmFuZ2UuJGxlZnQgPSBkLiRjMTtcbiAgICAgICAgcmFuZ2UucmlnaHQgPSBjMDtcbiAgICAgICAgcmFuZ2UuJHJpZ2h0ID0gZC4kYzA7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmFuZ2UubGVmdCA9IGMwO1xuICAgICAgICByYW5nZS4kbGVmdCA9IGQuJGMwO1xuICAgICAgICByYW5nZS5yaWdodCA9IGMxO1xuICAgICAgICByYW5nZS4kcmlnaHQgPSBkLiRjMTtcbiAgICAgIH1cbiAgICAgIHRva2VuLnZhbHVlID0gdG9BMShyYW5nZSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gaXNTdHJpbmdcbiAgICA/IHRva2Vucy5tYXAoZCA9PiBkLnZhbHVlKS5qb2luKCcnKVxuICAgIDogdG9rZW5zO1xufVxuIiwiZXhwb3J0IHsgdG9rZW5pemUgfSBmcm9tICcuL2xleGVyLmpzJztcbmV4cG9ydCB7IGFkZE1ldGEgfSBmcm9tICcuL2FkZE1ldGEuanMnO1xuZXhwb3J0IHsgdHJhbnNsYXRlVG9SQywgdHJhbnNsYXRlVG9BMSB9IGZyb20gJy4vdHJhbnNsYXRlLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYTEgfSBmcm9tICcuL2ExLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcmMgfSBmcm9tICcuL3JjLmpzJztcbmV4cG9ydCB7IE1BWF9DT0xTLCBNQVhfUk9XUyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcblxuaW1wb3J0IHtcbiAgT1BFUkFUT1IsXG4gIEJPT0xFQU4sXG4gIEVSUk9SLFxuICBOVU1CRVIsXG4gIEZVTkNUSU9OLFxuICBORVdMSU5FLFxuICBXSElURVNQQUNFLFxuICBTVFJJTkcsXG4gIFBBVEhfUVVPVEUsXG4gIFBBVEhfQlJBQ0UsXG4gIFBBVEhfUFJFRklYLFxuICBSQU5HRSxcbiAgUkFOR0VfQkVBTSxcbiAgUkFOR0VfTkFNRUQsXG4gIEZYX1BSRUZJWCxcbiAgVU5LTk9XTlxufSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5cbmV4cG9ydCBjb25zdCB0b2tlblR5cGVzID0ge1xuICBPUEVSQVRPUixcbiAgQk9PTEVBTixcbiAgRVJST1IsXG4gIE5VTUJFUixcbiAgRlVOQ1RJT04sXG4gIE5FV0xJTkUsXG4gIFdISVRFU1BBQ0UsXG4gIFNUUklORyxcbiAgUEFUSF9RVU9URSxcbiAgUEFUSF9CUkFDRSxcbiAgUEFUSF9QUkVGSVgsXG4gIFJBTkdFLFxuICBSQU5HRV9CRUFNLFxuICBSQU5HRV9OQU1FRCxcbiAgRlhfUFJFRklYLFxuICBVTktOT1dOXG59O1xuIl0sIm5hbWVzIjpbInF1aWNrVmVyaWZ5UmFuZ2VBMSIsInRva2VuVmFsdWUiLCJzcGxpdCIsImV2ZXJ5IiwiZCIsIm4iLCJwYXJzZUludCIsImlzTmFOIiwiaXNGaW5pdGUiLCJib3VuZHMiLCJSIiwiQyIsInF1aWNrVmVyaWZ5UmFuZ2VSQyIsInJlTnVtcyIsIm0iLCJleGVjIiwieCIsInZhbCIsIlJBTkdFIiwiUkFOR0VfQkVBTSIsInJlX0VSUk9SIiwicmVfT1BFUkFUT1IiLCJyZV9CT09MRUFOIiwicmVfRlVOQ1RJT04iLCJyZV9ORVdMSU5FIiwicmVfV0hJVEVTUEFDRSIsInJlX1NUUklORyIsInJlX1BBVEhfUVVPVEUiLCJyZV9QQVRIX0JSQUNFIiwicmVfUEFUSF9QUkVGSVgiLCJyZV9BMUNPTCIsInJlX0ExUk9XIiwicmVfQTFSQU5HRSIsInJQYXJ0IiwiY1BhcnQiLCJyZV9SQ0NPTCIsIlJlZ0V4cCIsImNvbmNhdCIsInJlX1JDUk9XIiwicmVfUkNSQU5HRSIsInJlX05VTUJFUiIsInJlX05BTUVEIiwidG9rZW5IYW5kbGVyc0ExIiwidG9rZW5IYW5kbGVyc1JDIiwidG9rZW5IYW5kbGVyc1JlZnNBMSIsInRva2VuSGFuZGxlcnNSZWZzUkMiLCJpc1R5cGUiLCJ0IiwidHlwZSIsImlzUmFuZ2VPcCIsInZhbHVlIiwiaXNCYW5nT3AiLCJkZWZhdWx0T3B0aW9ucyIsImVtaXRSYW5nZXMiLCJtZXJnZVJhbmdlcyIsIm5lZ2F0aXZlTnVtYmVycyIsInIxYzEiLCJnZXRUb2tlbnMiLCJmeCIsInRva2VuSGFuZGxlcnMiLCJvcHRpb25zIiwiT2JqZWN0IiwiYXNzaWduIiwidG9rZW5zIiwicG9zIiwibG9va0JlaGluZCIsImxlbmd0aCIsImxvb2tCZWhpbmRJZ25vcmVXUyIsIm5vV3MiLCJmaWx0ZXIiLCJ0ZXN0IiwidG9rZW4iLCJyYW5nZSIsInB1c2giLCJzdGFydFBvcyIsInMiLCJzbGljZSIsInRva2VuVHlwZSIsImkiLCJyZVRlc3QiLCJmblRlc3QiLCJlbmRzV2l0aCIsInVudGVybWluYXRlZCIsImxhc3QxIiwibGFzdDIiLCJpbmNsdWRlcyIsInBvcCIsIm1lcmdlIiwidW5zaGlmdCIsInNwbGljZSIsIm1hcCIsImpvaW4iLCJ0b2tlbml6ZSIsInVucXVvdGUiLCJyZXBsYWNlIiwicFJhbmdlT3AiLCJwUmFuZ2UiLCJyMCIsInBSYW5nZTIiLCJyMSIsInBCYW5nIiwicEJlYW0iLCJwU2hlZXQiLCJzaGVldE5hbWUiLCJwRmlsZSIsIndvcmtib29rTmFtZSIsInBOYW1lZCIsIm5hbWUiLCJwUXVvdGVkIiwiZmlsZSIsInNoZWV0IiwidmFsaWRSdW5zIiwidmFsaWRSdW5zTmFtZWQiLCJwYXJzZVJlZiIsInJlZiIsImFsbG93X25hbWVkIiwicmVmRGF0YSIsInNoaWZ0IiwicnVucyIsImRhdGEiLCJwYXJzZSIsImoiLCJmcm9tQ29sIiwiY29sU3RyIiwiYyIsInRvVXBwZXJDYXNlIiwiY2hyIiwiY2hhckNvZGVBdCIsInRvQ29sIiwibGVmdCIsIlN0cmluZyIsImZyb21DaGFyQ29kZSIsIk1hdGgiLCJmbG9vciIsImZyb21Sb3ciLCJyb3dTdHIiLCJ0b1JvdyIsInRvcCIsInRvUmVsYXRpdmUiLCJib3R0b20iLCJyaWdodCIsIiRsZWZ0IiwiJHJpZ2h0IiwiJHRvcCIsIiRib3R0b20iLCJ0b0ExIiwidG9BYnMiLCJmcm9tQTEiLCJyYW5nZVN0ciIsImEiLCJiIiwibWluIiwibWF4IiwicGFydDEiLCJwYXJ0MiIsInBhcnNlQTFSZWYiLCJhMSIsInRvQWJzb2x1dGUiLCJ0byIsImZyb20iLCJnZXRJRGVyIiwidG9Db29yZCIsImlzQWJzIiwidG9SQyIsImMwIiwiYzEiLCIkYzAiLCIkYzEiLCIkcjAiLCIkcjEiLCJzX3IwIiwic19yMSIsInNfYzAiLCJzX2MxIiwicGFyc2VSQ1BhcnQiLCJybSIsImNtIiwiZnJvbVJDIiwiZXh0ZW5kVG8iLCJyYyIsInRvRml4ZWQiLCJhYnMiLCJiYXNlIiwidiIsInRva2VuVHlwZXMiLCJPUEVSQVRPUiIsIkJPT0xFQU4iLCJFUlJPUiIsIk5VTUJFUiIsIkZVTkNUSU9OIiwiTkVXTElORSIsIldISVRFU1BBQ0UiLCJTVFJJTkciLCJQQVRIX1FVT1RFIiwiUEFUSF9CUkFDRSIsIlBBVEhfUFJFRklYIiwiUkFOR0VfTkFNRUQiLCJGWF9QUkVGSVgiLCJVTktOT1dOIiwicGFyZW5TdGFjayIsImFycmF5U3RhcnQiLCJhMU1hcCIsInVpZCIsImZvckVhY2giLCJpbmRleCIsImRlcHRoIiwiY291bnRlciIsInBhaXJJZCIsImdyb3VwSWQiLCJlcnJvciIsInRvTG93ZXJDYXNlIiwiYW5jaG9yQ2VsbCIsImFuY2hvciIsImlzU3RyaW5nIiwicjFjMiJdLCJtYXBwaW5ncyI6ImFBQU8sU0FBU0EsRUFBb0JDLEdBTWxDLE9BQU9BLEVBQVdDLE1BQU0sbUJBQW1CQyxPQUFNQyxJQUMvQyxNQUFNQyxFQUFJQyxTQUFTRixFQUFHLElBQ3RCLFFBQUtHLE1BQU1GLEtBQ0ZHLFNBQVNKLEdBQ1pDLEdBQUssV0FDTEEsR0FBSyxNQUVYLEdBRUgsd0RBRUQsTUFBTUksRUFBUyxDQUNiQyxFQUFLLFFBQ0wsS0FBTSxRQUNOQyxFQUFLLE1BQ0wsS0FBTSxPQUVELFNBQVNDLEVBQW9CWCxHQUNsQyxNQUFNWSxFQUFTLHFCQUNmLElBQUlDLEVBQ0osS0FBeUMsUUFBakNBLEVBQUlELEVBQU9FLEtBQUtkLEtBQXVCLENBQzdDLE1BQU1lLEVBQUlQLEVBQU9LLEVBQUUsSUFDYkcsRUFBTVgsU0FBU1EsRUFBRSxHQUFJLElBQzNCLEdBQUlHLEdBQU9ELEdBQUtDLElBQVFELEVBQ3RCLE9BQU8sQ0FFVixDQUNELE9BQU8sQ0FDUixDQ2hDTSxNQVdNRSxFQUFRLFFBQ1JDLEVBQWEsYUFRcEJDLEVBQVcsNkhBQ1hDLEVBQWMsK0NBQ2RDLEVBQWEsbUJBQ2JDLEVBQWMsK0JBQ2RDLEVBQWEsT0FDYkMsRUFBZ0IsNkVBQ2hCQyxFQUFZLHNCQUNaQyxFQUFnQixzQkFDaEJDLEVBQWdCLHNCQUNoQkMsRUFBaUIsNkNBQ2pCQyxFQUFX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
|
package/lib/addMeta-test.js
CHANGED
|
@@ -10,67 +10,67 @@ Test.prototype.isMetaTokens = function isTokens (expr, result, opts) {
|
|
|
10
10
|
test('add extra meta to operators', t => {
|
|
11
11
|
// parens should be grouped and tagged with depth
|
|
12
12
|
t.isMetaTokens('=((1)+(1))', [
|
|
13
|
-
{ type: FX_PREFIX, value: '=' },
|
|
14
|
-
{ type: OPERATOR, value: '(',
|
|
15
|
-
{ type: OPERATOR, value: '(',
|
|
16
|
-
{ type: NUMBER, value: '1' },
|
|
17
|
-
{ type: OPERATOR, value: ')',
|
|
18
|
-
{ type: OPERATOR, value: '+' },
|
|
19
|
-
{ type: OPERATOR, value: '(',
|
|
20
|
-
{ type: NUMBER, value: '1' },
|
|
21
|
-
{ type: OPERATOR, value: ')',
|
|
22
|
-
{ type: OPERATOR, value: ')',
|
|
13
|
+
{ index: 0, depth: 0, type: FX_PREFIX, value: '=' },
|
|
14
|
+
{ index: 1, depth: 1, type: OPERATOR, value: '(', groupId: 'fxg3' },
|
|
15
|
+
{ index: 2, depth: 2, type: OPERATOR, value: '(', groupId: 'fxg1' },
|
|
16
|
+
{ index: 3, depth: 2, type: NUMBER, value: '1' },
|
|
17
|
+
{ index: 4, depth: 2, type: OPERATOR, value: ')', groupId: 'fxg1' },
|
|
18
|
+
{ index: 5, depth: 1, type: OPERATOR, value: '+' },
|
|
19
|
+
{ index: 6, depth: 2, type: OPERATOR, value: '(', groupId: 'fxg2' },
|
|
20
|
+
{ index: 7, depth: 2, type: NUMBER, value: '1' },
|
|
21
|
+
{ index: 8, depth: 2, type: OPERATOR, value: ')', groupId: 'fxg2' },
|
|
22
|
+
{ index: 9, depth: 1, type: OPERATOR, value: ')', groupId: 'fxg3' }
|
|
23
23
|
]);
|
|
24
24
|
|
|
25
25
|
// don't be fooled by imbalanced parens
|
|
26
26
|
t.isMetaTokens('=)())', [
|
|
27
|
-
{ type: FX_PREFIX, value: '=' },
|
|
28
|
-
{ type: OPERATOR, value: ')', error: true },
|
|
29
|
-
{ type: OPERATOR, value: '(',
|
|
30
|
-
{ type: OPERATOR, value: ')',
|
|
31
|
-
{ type: OPERATOR, value: ')', error: true }
|
|
27
|
+
{ index: 0, depth: 0, type: FX_PREFIX, value: '=' },
|
|
28
|
+
{ index: 1, depth: 0, type: OPERATOR, value: ')', error: true },
|
|
29
|
+
{ index: 2, depth: 1, type: OPERATOR, value: '(', groupId: 'fxg1' },
|
|
30
|
+
{ index: 3, depth: 1, type: OPERATOR, value: ')', groupId: 'fxg1' },
|
|
31
|
+
{ index: 4, depth: 0, type: OPERATOR, value: ')', error: true }
|
|
32
32
|
]);
|
|
33
33
|
|
|
34
34
|
// don't be fooled by nested curlys
|
|
35
35
|
t.isMetaTokens('={{}}', [
|
|
36
|
-
{ type: FX_PREFIX, value: '=' },
|
|
37
|
-
{ type: OPERATOR, value: '{', groupId: 'fxg1' },
|
|
38
|
-
{ type: OPERATOR, value: '{', error: true },
|
|
39
|
-
{ type: OPERATOR, value: '}', groupId: 'fxg1' },
|
|
40
|
-
{ type: OPERATOR, value: '}', error: true }
|
|
36
|
+
{ index: 0, depth: 0, type: FX_PREFIX, value: '=' },
|
|
37
|
+
{ index: 1, depth: 0, type: OPERATOR, value: '{', groupId: 'fxg1' },
|
|
38
|
+
{ index: 2, depth: 0, type: OPERATOR, value: '{', error: true },
|
|
39
|
+
{ index: 3, depth: 0, type: OPERATOR, value: '}', groupId: 'fxg1' },
|
|
40
|
+
{ index: 4, depth: 0, type: OPERATOR, value: '}', error: true }
|
|
41
41
|
]);
|
|
42
42
|
|
|
43
43
|
// group ranges if they are equivalent
|
|
44
44
|
t.isMetaTokens("=B11,B11:B12,'Sheet11'!B11,SHEET1!$B11,sheet1!$b$11,A1:B11,[foo]Sheet1!B11,'[foo]Sheet1'!B11", [
|
|
45
|
-
{ type: FX_PREFIX, value: '=' },
|
|
46
|
-
{ type: RANGE, value: 'B11', groupId: 'fxg1' },
|
|
47
|
-
{ type: OPERATOR, value: ',' },
|
|
48
|
-
{ type: RANGE, value: 'B11:B12', groupId: 'fxg2' },
|
|
49
|
-
{ type: OPERATOR, value: ',' },
|
|
50
|
-
{ type: RANGE, value: "'Sheet11'!B11", groupId: 'fxg3' },
|
|
51
|
-
{ type: OPERATOR, value: ',' },
|
|
52
|
-
{ type: RANGE, value: 'SHEET1!$B11', groupId: 'fxg1' },
|
|
53
|
-
{ type: OPERATOR, value: ',' },
|
|
54
|
-
{ type: RANGE, value: 'sheet1!$b$11', groupId: 'fxg1' },
|
|
55
|
-
{ type: OPERATOR, value: ',' },
|
|
56
|
-
{ type: RANGE, value: 'A1:B11', groupId: 'fxg4' },
|
|
57
|
-
{ type: OPERATOR, value: ',' },
|
|
58
|
-
{ type: RANGE, value: '[foo]Sheet1!B11', groupId: 'fxg1' },
|
|
59
|
-
{ type: OPERATOR, value: ',' },
|
|
60
|
-
{ type: RANGE, value: "'[foo]Sheet1'!B11", groupId: 'fxg1' }
|
|
45
|
+
{ index: 0, depth: 0, type: FX_PREFIX, value: '=' },
|
|
46
|
+
{ index: 1, depth: 0, type: RANGE, value: 'B11', groupId: 'fxg1' },
|
|
47
|
+
{ index: 2, depth: 0, type: OPERATOR, value: ',' },
|
|
48
|
+
{ index: 3, depth: 0, type: RANGE, value: 'B11:B12', groupId: 'fxg2' },
|
|
49
|
+
{ index: 4, depth: 0, type: OPERATOR, value: ',' },
|
|
50
|
+
{ index: 5, depth: 0, type: RANGE, value: "'Sheet11'!B11", groupId: 'fxg3' },
|
|
51
|
+
{ index: 6, depth: 0, type: OPERATOR, value: ',' },
|
|
52
|
+
{ index: 7, depth: 0, type: RANGE, value: 'SHEET1!$B11', groupId: 'fxg1' },
|
|
53
|
+
{ index: 8, depth: 0, type: OPERATOR, value: ',' },
|
|
54
|
+
{ index: 9, depth: 0, type: RANGE, value: 'sheet1!$b$11', groupId: 'fxg1' },
|
|
55
|
+
{ index: 10, depth: 0, type: OPERATOR, value: ',' },
|
|
56
|
+
{ index: 11, depth: 0, type: RANGE, value: 'A1:B11', groupId: 'fxg4' },
|
|
57
|
+
{ index: 12, depth: 0, type: OPERATOR, value: ',' },
|
|
58
|
+
{ index: 13, depth: 0, type: RANGE, value: '[foo]Sheet1!B11', groupId: 'fxg1' },
|
|
59
|
+
{ index: 14, depth: 0, type: OPERATOR, value: ',' },
|
|
60
|
+
{ index: 15, depth: 0, type: RANGE, value: "'[foo]Sheet1'!B11", groupId: 'fxg1' }
|
|
61
61
|
], { sheetName: 'Sheet1', workbookName: 'foo' });
|
|
62
62
|
|
|
63
63
|
t.isMetaTokens('=A:A,1:1,Sheet1!A:A:1:1,[foo]Sheet1!1:1', [
|
|
64
|
-
{ type: FX_PREFIX, value: '=' },
|
|
65
|
-
{ type: RANGE_BEAM, value: 'A:A', groupId: 'fxg1' },
|
|
66
|
-
{ type: OPERATOR, value: ',' },
|
|
67
|
-
{ type: RANGE_BEAM, value: '1:1', groupId: 'fxg2' },
|
|
68
|
-
{ type: OPERATOR, value: ',' },
|
|
69
|
-
{ type: RANGE_BEAM, value: 'Sheet1!A:A', groupId: 'fxg1' },
|
|
70
|
-
{ type: OPERATOR, value: ':' },
|
|
71
|
-
{ type: RANGE_BEAM, value: '1:1', groupId: 'fxg2' },
|
|
72
|
-
{ type: OPERATOR, value: ',' },
|
|
73
|
-
{ type: RANGE_BEAM, value: '[foo]Sheet1!1:1', groupId: 'fxg2' }
|
|
64
|
+
{ index: 0, depth: 0, type: FX_PREFIX, value: '=' },
|
|
65
|
+
{ index: 1, depth: 0, type: RANGE_BEAM, value: 'A:A', groupId: 'fxg1' },
|
|
66
|
+
{ index: 2, depth: 0, type: OPERATOR, value: ',' },
|
|
67
|
+
{ index: 3, depth: 0, type: RANGE_BEAM, value: '1:1', groupId: 'fxg2' },
|
|
68
|
+
{ index: 4, depth: 0, type: OPERATOR, value: ',' },
|
|
69
|
+
{ index: 5, depth: 0, type: RANGE_BEAM, value: 'Sheet1!A:A', groupId: 'fxg1' },
|
|
70
|
+
{ index: 6, depth: 0, type: OPERATOR, value: ':' },
|
|
71
|
+
{ index: 7, depth: 0, type: RANGE_BEAM, value: '1:1', groupId: 'fxg2' },
|
|
72
|
+
{ index: 8, depth: 0, type: OPERATOR, value: ',' },
|
|
73
|
+
{ index: 9, depth: 0, type: RANGE_BEAM, value: '[foo]Sheet1!1:1', groupId: 'fxg2' }
|
|
74
74
|
], { sheetName: 'Sheet1', workbookName: 'foo' });
|
|
75
75
|
|
|
76
76
|
t.end();
|
package/lib/addMeta.js
CHANGED
|
@@ -13,9 +13,11 @@ export function addMeta (tokens, { sheetName = '', workbookName = '' } = {}) {
|
|
|
13
13
|
const a1Map = {};
|
|
14
14
|
const uid = getIDer();
|
|
15
15
|
|
|
16
|
-
tokens.forEach(token => {
|
|
16
|
+
tokens.forEach((token, i) => {
|
|
17
|
+
token.index = i;
|
|
18
|
+
token.depth = parenStack.length;
|
|
17
19
|
if (token.value === '(') {
|
|
18
|
-
token.depth = parenStack.length;
|
|
20
|
+
token.depth = parenStack.length + 1;
|
|
19
21
|
parenStack.push(token);
|
|
20
22
|
}
|
|
21
23
|
else if (token.value === ')') {
|
package/lib/constants.js
CHANGED
|
@@ -23,9 +23,9 @@ export const MAX_ROWS = 2 ** 20 - 1; // 1048575
|
|
|
23
23
|
const re_ERROR = /^#(NAME\?|FIELD!|CALC!|VALUE!|REF!|DIV\/0!|NULL!|NUM!|N\/A|GETTING_DATA\b|SPILL!|UNKNOWN!|FIELD\b|CALC\b|SYNTAX\?|ERROR!)/i;
|
|
24
24
|
const re_OPERATOR = /^(<=|>=|<>|[-+/*^%&<>=]|[{},;]|[()]|@|:|!|#)/;
|
|
25
25
|
const re_BOOLEAN = /^(TRUE|FALSE)\b/i;
|
|
26
|
-
const re_FUNCTION = /^[A-Z]+(?=\s*\()/i;
|
|
26
|
+
const re_FUNCTION = /^[A-Z_]+[A-Z\d_.]+(?=\s*\()/i;
|
|
27
27
|
const re_NEWLINE = /^\n+/;
|
|
28
|
-
const re_WHITESPACE =
|
|
28
|
+
const re_WHITESPACE = /^[ \f\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]+/;
|
|
29
29
|
const re_STRING = /^"(?:""|[^"])*("|$)/;
|
|
30
30
|
const re_PATH_QUOTE = /^'(?:''|[^'])*('|$)/;
|
|
31
31
|
const re_PATH_BRACE = /^\[(?:[^\]])+(\]|$)/;
|
package/lib/lexer-test.js
CHANGED
|
@@ -5,6 +5,9 @@ import { tokenize } from './lexer.js';
|
|
|
5
5
|
Test.prototype.isTokens = function isTokens (expr, result, opts) {
|
|
6
6
|
this.deepEqual(tokenize(expr, (opts || {})), result, expr);
|
|
7
7
|
};
|
|
8
|
+
Test.prototype.isTokensNeg = function isTokensNeg (expr, result, opts) {
|
|
9
|
+
this.deepEqual(tokenize(expr, { ...opts, negativeNumbers: true }), result, expr);
|
|
10
|
+
};
|
|
8
11
|
|
|
9
12
|
test('tokenize operators', t => {
|
|
10
13
|
t.isTokens('=1>1', [
|
|
@@ -269,6 +272,56 @@ test('tokenize functions', t => {
|
|
|
269
272
|
{ type: BOOLEAN, value: 'TRUE' },
|
|
270
273
|
{ type: OPERATOR, value: ')' }
|
|
271
274
|
]);
|
|
275
|
+
t.isTokens('=BINOM.DIST.RANGE(1)', [
|
|
276
|
+
{ type: FX_PREFIX, value: '=' },
|
|
277
|
+
{ type: FUNCTION, value: 'BINOM.DIST.RANGE' },
|
|
278
|
+
{ type: OPERATOR, value: '(' },
|
|
279
|
+
{ type: NUMBER, value: '1' },
|
|
280
|
+
{ type: OPERATOR, value: ')' }
|
|
281
|
+
]);
|
|
282
|
+
t.isTokens('=OCT2BIN(1)', [
|
|
283
|
+
{ type: FX_PREFIX, value: '=' },
|
|
284
|
+
{ type: FUNCTION, value: 'OCT2BIN' },
|
|
285
|
+
{ type: OPERATOR, value: '(' },
|
|
286
|
+
{ type: NUMBER, value: '1' },
|
|
287
|
+
{ type: OPERATOR, value: ')' }
|
|
288
|
+
]);
|
|
289
|
+
t.isTokens('=TEST_FUNC(1)', [
|
|
290
|
+
{ type: FX_PREFIX, value: '=' },
|
|
291
|
+
{ type: FUNCTION, value: 'TEST_FUNC' },
|
|
292
|
+
{ type: OPERATOR, value: '(' },
|
|
293
|
+
{ type: NUMBER, value: '1' },
|
|
294
|
+
{ type: OPERATOR, value: ')' }
|
|
295
|
+
]);
|
|
296
|
+
t.isTokens('=_xlfn.FOO(1)', [
|
|
297
|
+
{ type: FX_PREFIX, value: '=' },
|
|
298
|
+
{ type: FUNCTION, value: '_xlfn.FOO' },
|
|
299
|
+
{ type: OPERATOR, value: '(' },
|
|
300
|
+
{ type: NUMBER, value: '1' },
|
|
301
|
+
{ type: OPERATOR, value: ')' }
|
|
302
|
+
]);
|
|
303
|
+
t.isTokens('=_FOO(1)', [
|
|
304
|
+
{ type: FX_PREFIX, value: '=' },
|
|
305
|
+
{ type: FUNCTION, value: '_FOO' },
|
|
306
|
+
{ type: OPERATOR, value: '(' },
|
|
307
|
+
{ type: NUMBER, value: '1' },
|
|
308
|
+
{ type: OPERATOR, value: ')' }
|
|
309
|
+
]);
|
|
310
|
+
t.isTokens('=.FOO(1)', [
|
|
311
|
+
{ type: FX_PREFIX, value: '=' },
|
|
312
|
+
{ type: RANGE_NAMED, value: '.FOO' },
|
|
313
|
+
{ type: OPERATOR, value: '(' },
|
|
314
|
+
{ type: NUMBER, value: '1' },
|
|
315
|
+
{ type: OPERATOR, value: ')' }
|
|
316
|
+
]);
|
|
317
|
+
t.isTokens('=9FOO(1)', [
|
|
318
|
+
{ type: FX_PREFIX, value: '=' },
|
|
319
|
+
{ type: NUMBER, value: '9' },
|
|
320
|
+
{ type: FUNCTION, value: 'FOO' },
|
|
321
|
+
{ type: OPERATOR, value: '(' },
|
|
322
|
+
{ type: NUMBER, value: '1' },
|
|
323
|
+
{ type: OPERATOR, value: ')' }
|
|
324
|
+
]);
|
|
272
325
|
t.end();
|
|
273
326
|
});
|
|
274
327
|
|
|
@@ -277,9 +330,9 @@ test('tokenize numbers', t => {
|
|
|
277
330
|
{ type: FX_PREFIX, value: '=' },
|
|
278
331
|
{ type: NUMBER, value: '0' }
|
|
279
332
|
]);
|
|
280
|
-
t.isTokens('
|
|
333
|
+
t.isTokens('=+0', [
|
|
281
334
|
{ type: FX_PREFIX, value: '=' },
|
|
282
|
-
{ type: OPERATOR, value: '
|
|
335
|
+
{ type: OPERATOR, value: '+' },
|
|
283
336
|
{ type: NUMBER, value: '0' }
|
|
284
337
|
]);
|
|
285
338
|
t.isTokens('=+1', [
|
|
@@ -338,6 +391,231 @@ test('tokenize numbers', t => {
|
|
|
338
391
|
t.end();
|
|
339
392
|
});
|
|
340
393
|
|
|
394
|
+
test('tokenize negative numbers', t => {
|
|
395
|
+
t.isTokensNeg('=-0', [
|
|
396
|
+
{ type: FX_PREFIX, value: '=' },
|
|
397
|
+
{ type: NUMBER, value: '-0' }
|
|
398
|
+
]);
|
|
399
|
+
t.isTokensNeg('=-1123', [
|
|
400
|
+
{ type: FX_PREFIX, value: '=' },
|
|
401
|
+
{ type: NUMBER, value: '-1123' }
|
|
402
|
+
]);
|
|
403
|
+
t.isTokensNeg('=-1.5', [
|
|
404
|
+
{ type: FX_PREFIX, value: '=' },
|
|
405
|
+
{ type: NUMBER, value: '-1.5' }
|
|
406
|
+
]);
|
|
407
|
+
t.isTokensNeg('=-1234.5678', [
|
|
408
|
+
{ type: FX_PREFIX, value: '=' },
|
|
409
|
+
{ type: NUMBER, value: '-1234.5678' }
|
|
410
|
+
]);
|
|
411
|
+
t.isTokensNeg('=1E-1', [
|
|
412
|
+
{ type: FX_PREFIX, value: '=' },
|
|
413
|
+
{ type: NUMBER, value: '1E-1' }
|
|
414
|
+
]);
|
|
415
|
+
t.isTokensNeg('=-1E-1', [
|
|
416
|
+
{ type: FX_PREFIX, value: '=' },
|
|
417
|
+
{ type: NUMBER, value: '-1E-1' }
|
|
418
|
+
]);
|
|
419
|
+
t.isTokensNeg('=1.5E-10', [
|
|
420
|
+
{ type: FX_PREFIX, value: '=' },
|
|
421
|
+
{ type: NUMBER, value: '1.5E-10' }
|
|
422
|
+
]);
|
|
423
|
+
t.isTokensNeg('=-1.5E-10', [
|
|
424
|
+
{ type: FX_PREFIX, value: '=' },
|
|
425
|
+
{ type: NUMBER, value: '-1.5E-10' }
|
|
426
|
+
]);
|
|
427
|
+
t.isTokensNeg('-1', [
|
|
428
|
+
{ type: 'number', value: '-1' }
|
|
429
|
+
]);
|
|
430
|
+
|
|
431
|
+
//
|
|
432
|
+
t.isTokensNeg('=1-1', [
|
|
433
|
+
{ type: FX_PREFIX, value: '=' },
|
|
434
|
+
{ type: NUMBER, value: '1' },
|
|
435
|
+
{ type: OPERATOR, value: '-' },
|
|
436
|
+
{ type: NUMBER, value: '1' }
|
|
437
|
+
]);
|
|
438
|
+
t.isTokensNeg('1--1', [
|
|
439
|
+
{ type: 'number', value: '1' },
|
|
440
|
+
{ type: 'operator', value: '-' },
|
|
441
|
+
{ type: 'number', value: '-1' }
|
|
442
|
+
]);
|
|
443
|
+
t.isTokensNeg('1 - -1', [
|
|
444
|
+
{ type: 'number', value: '1' },
|
|
445
|
+
{ type: 'whitespace', value: ' ' },
|
|
446
|
+
{ type: 'operator', value: '-' },
|
|
447
|
+
{ type: 'whitespace', value: ' ' },
|
|
448
|
+
{ type: 'number', value: '-1' }
|
|
449
|
+
]);
|
|
450
|
+
t.isTokensNeg('1 - - 1', [
|
|
451
|
+
{ type: 'number', value: '1' },
|
|
452
|
+
{ type: 'whitespace', value: ' ' },
|
|
453
|
+
{ type: 'operator', value: '-' },
|
|
454
|
+
{ type: 'whitespace', value: ' ' },
|
|
455
|
+
{ type: 'operator', value: '-' },
|
|
456
|
+
{ type: 'whitespace', value: ' ' },
|
|
457
|
+
{ type: 'number', value: '1' }
|
|
458
|
+
]);
|
|
459
|
+
t.isTokensNeg('1 \n - \n -1', [
|
|
460
|
+
{ type: 'number', value: '1' },
|
|
461
|
+
{ type: 'whitespace', value: ' ' },
|
|
462
|
+
{ type: 'newline', value: '\n' },
|
|
463
|
+
{ type: 'whitespace', value: ' ' },
|
|
464
|
+
{ type: 'operator', value: '-' },
|
|
465
|
+
{ type: 'whitespace', value: ' ' },
|
|
466
|
+
{ type: 'newline', value: '\n' },
|
|
467
|
+
{ type: 'whitespace', value: ' ' },
|
|
468
|
+
{ type: 'number', value: '-1' }
|
|
469
|
+
]);
|
|
470
|
+
t.isTokensNeg('-(-1)', [
|
|
471
|
+
{ type: 'operator', value: '-' },
|
|
472
|
+
{ type: 'operator', value: '(' },
|
|
473
|
+
{ type: 'number', value: '-1' },
|
|
474
|
+
{ type: 'operator', value: ')' }
|
|
475
|
+
]);
|
|
476
|
+
t.isTokensNeg('-( -1 )', [
|
|
477
|
+
{ type: 'operator', value: '-' },
|
|
478
|
+
{ type: 'operator', value: '(' },
|
|
479
|
+
{ type: 'whitespace', value: ' ' },
|
|
480
|
+
{ type: 'number', value: '-1' },
|
|
481
|
+
{ type: 'whitespace', value: ' ' },
|
|
482
|
+
{ type: 'operator', value: ')' }
|
|
483
|
+
]);
|
|
484
|
+
|
|
485
|
+
t.isTokensNeg('=true-1', [
|
|
486
|
+
{ type: 'fx-prefix', value: '=' },
|
|
487
|
+
{ type: 'bool', value: 'true' },
|
|
488
|
+
{ type: 'operator', value: '-' },
|
|
489
|
+
{ type: 'number', value: '1' }
|
|
490
|
+
]);
|
|
491
|
+
t.isTokensNeg('=true -1', [
|
|
492
|
+
{ type: 'fx-prefix', value: '=' },
|
|
493
|
+
{ type: 'bool', value: 'true' },
|
|
494
|
+
{ type: 'whitespace', value: ' ' },
|
|
495
|
+
{ type: 'operator', value: '-' },
|
|
496
|
+
{ type: 'number', value: '1' }
|
|
497
|
+
]);
|
|
498
|
+
t.isTokensNeg('=true - 1', [
|
|
499
|
+
{ type: 'fx-prefix', value: '=' },
|
|
500
|
+
{ type: 'bool', value: 'true' },
|
|
501
|
+
{ type: 'whitespace', value: ' ' },
|
|
502
|
+
{ type: 'operator', value: '-' },
|
|
503
|
+
{ type: 'whitespace', value: ' ' },
|
|
504
|
+
{ type: 'number', value: '1' }
|
|
505
|
+
]);
|
|
506
|
+
t.isTokensNeg('=#VALUE!-1', [
|
|
507
|
+
{ type: 'fx-prefix', value: '=' },
|
|
508
|
+
{ type: 'error', value: '#VALUE!' },
|
|
509
|
+
{ type: 'operator', value: '-' },
|
|
510
|
+
{ type: 'number', value: '1' }
|
|
511
|
+
]);
|
|
512
|
+
t.isTokensNeg('=#VALUE! -1', [
|
|
513
|
+
{ type: 'fx-prefix', value: '=' },
|
|
514
|
+
{ type: 'error', value: '#VALUE!' },
|
|
515
|
+
{ type: 'whitespace', value: ' ' },
|
|
516
|
+
{ type: 'operator', value: '-' },
|
|
517
|
+
{ type: 'number', value: '1' }
|
|
518
|
+
]);
|
|
519
|
+
t.isTokensNeg('=SUM(-1) -1', [
|
|
520
|
+
{ type: 'fx-prefix', value: '=' },
|
|
521
|
+
{ type: 'function', value: 'SUM' },
|
|
522
|
+
{ type: 'operator', value: '(' },
|
|
523
|
+
{ type: 'number', value: '-1' },
|
|
524
|
+
{ type: 'operator', value: ')' },
|
|
525
|
+
{ type: 'whitespace', value: ' ' },
|
|
526
|
+
{ type: 'operator', value: '-' },
|
|
527
|
+
{ type: 'number', value: '1' }
|
|
528
|
+
]);
|
|
529
|
+
t.isTokensNeg('=SUM( -1)-1', [
|
|
530
|
+
{ type: 'fx-prefix', value: '=' },
|
|
531
|
+
{ type: 'function', value: 'SUM' },
|
|
532
|
+
{ type: 'operator', value: '(' },
|
|
533
|
+
{ type: 'whitespace', value: ' ' },
|
|
534
|
+
{ type: 'number', value: '-1' },
|
|
535
|
+
{ type: 'operator', value: ')' },
|
|
536
|
+
{ type: 'operator', value: '-' },
|
|
537
|
+
{ type: 'number', value: '1' }
|
|
538
|
+
]);
|
|
539
|
+
t.isTokensNeg('=A1-1', [
|
|
540
|
+
{ type: 'fx-prefix', value: '=' },
|
|
541
|
+
{ type: 'range', value: 'A1' },
|
|
542
|
+
{ type: 'operator', value: '-' },
|
|
543
|
+
{ type: 'number', value: '1' }
|
|
544
|
+
]);
|
|
545
|
+
t.isTokensNeg('=A1 -1', [
|
|
546
|
+
{ type: 'fx-prefix', value: '=' },
|
|
547
|
+
{ type: 'range', value: 'A1' },
|
|
548
|
+
{ type: 'whitespace', value: ' ' },
|
|
549
|
+
{ type: 'operator', value: '-' },
|
|
550
|
+
{ type: 'number', value: '1' }
|
|
551
|
+
]);
|
|
552
|
+
t.isTokensNeg('=foo-1', [
|
|
553
|
+
{ type: 'fx-prefix', value: '=' },
|
|
554
|
+
{ type: 'range-named', value: 'foo' },
|
|
555
|
+
{ type: 'operator', value: '-' },
|
|
556
|
+
{ type: 'number', value: '1' }
|
|
557
|
+
]);
|
|
558
|
+
t.isTokensNeg('=foo -1', [
|
|
559
|
+
{ type: 'fx-prefix', value: '=' },
|
|
560
|
+
{ type: 'range-named', value: 'foo' },
|
|
561
|
+
{ type: 'whitespace', value: ' ' },
|
|
562
|
+
{ type: 'operator', value: '-' },
|
|
563
|
+
{ type: 'number', value: '1' }
|
|
564
|
+
]);
|
|
565
|
+
t.isTokensNeg('="true"-1', [
|
|
566
|
+
{ type: 'fx-prefix', value: '=' },
|
|
567
|
+
{ type: 'string', value: '"true"' },
|
|
568
|
+
{ type: 'operator', value: '-' },
|
|
569
|
+
{ type: 'number', value: '1' }
|
|
570
|
+
]);
|
|
571
|
+
t.isTokensNeg('="true" -1', [
|
|
572
|
+
{ type: 'fx-prefix', value: '=' },
|
|
573
|
+
{ type: 'string', value: '"true"' },
|
|
574
|
+
{ type: 'whitespace', value: ' ' },
|
|
575
|
+
{ type: 'operator', value: '-' },
|
|
576
|
+
{ type: 'number', value: '1' }
|
|
577
|
+
]);
|
|
578
|
+
|
|
579
|
+
t.isTokensNeg('=SUM(1)-1', [
|
|
580
|
+
{ type: FX_PREFIX, value: '=' },
|
|
581
|
+
{ type: FUNCTION, value: 'SUM' },
|
|
582
|
+
{ type: OPERATOR, value: '(' },
|
|
583
|
+
{ type: NUMBER, value: '1' },
|
|
584
|
+
{ type: OPERATOR, value: ')' },
|
|
585
|
+
{ type: OPERATOR, value: '-' },
|
|
586
|
+
{ type: NUMBER, value: '1' }
|
|
587
|
+
]);
|
|
588
|
+
t.isTokensNeg('={1, 2, 3}-4', [
|
|
589
|
+
{ type: FX_PREFIX, value: '=' },
|
|
590
|
+
{ type: OPERATOR, value: '{' },
|
|
591
|
+
{ type: NUMBER, value: '1' },
|
|
592
|
+
{ type: OPERATOR, value: ',' },
|
|
593
|
+
{ type: WHITESPACE, value: ' ' },
|
|
594
|
+
{ type: NUMBER, value: '2' },
|
|
595
|
+
{ type: OPERATOR, value: ',' },
|
|
596
|
+
{ type: WHITESPACE, value: ' ' },
|
|
597
|
+
{ type: NUMBER, value: '3' },
|
|
598
|
+
{ type: OPERATOR, value: '}' },
|
|
599
|
+
{ type: OPERATOR, value: '-' },
|
|
600
|
+
{ type: NUMBER, value: '4' }
|
|
601
|
+
]);
|
|
602
|
+
t.isTokensNeg('=10%-1', [
|
|
603
|
+
{ type: FX_PREFIX, value: '=' },
|
|
604
|
+
{ type: NUMBER, value: '10' },
|
|
605
|
+
{ type: OPERATOR, value: '%' },
|
|
606
|
+
{ type: OPERATOR, value: '-' },
|
|
607
|
+
{ type: NUMBER, value: '1' }
|
|
608
|
+
]);
|
|
609
|
+
t.isTokensNeg('=A1#-1', [
|
|
610
|
+
{ type: FX_PREFIX, value: '=' },
|
|
611
|
+
{ type: RANGE, value: 'A1' },
|
|
612
|
+
{ type: OPERATOR, value: '#' },
|
|
613
|
+
{ type: OPERATOR, value: '-' },
|
|
614
|
+
{ type: NUMBER, value: '1' }
|
|
615
|
+
]);
|
|
616
|
+
t.end();
|
|
617
|
+
});
|
|
618
|
+
|
|
341
619
|
test('tokenize simple equations', t => {
|
|
342
620
|
t.isTokens('=1 + 2', [
|
|
343
621
|
{ type: FX_PREFIX, value: '=' },
|
|
@@ -1061,7 +1339,7 @@ test('tokenize strings', t => {
|
|
|
1061
1339
|
// so open ended strings at the end of output are tagged.
|
|
1062
1340
|
t.isTokens('="incomple', [
|
|
1063
1341
|
{ type: FX_PREFIX, value: '=' },
|
|
1064
|
-
{ type: STRING, value: '"incomple' }
|
|
1342
|
+
{ type: STRING, value: '"incomple', unterminated: true }
|
|
1065
1343
|
]);
|
|
1066
1344
|
|
|
1067
1345
|
t.end();
|
package/lib/lexer.js
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import {
|
|
2
2
|
FX_PREFIX,
|
|
3
|
+
NEWLINE,
|
|
4
|
+
NUMBER,
|
|
5
|
+
OPERATOR,
|
|
3
6
|
PATH_BRACE,
|
|
4
7
|
PATH_PREFIX,
|
|
5
8
|
PATH_QUOTE,
|
|
6
9
|
RANGE,
|
|
7
|
-
RANGE_NAMED,
|
|
8
10
|
RANGE_BEAM,
|
|
11
|
+
RANGE_NAMED,
|
|
12
|
+
STRING,
|
|
9
13
|
UNKNOWN,
|
|
14
|
+
WHITESPACE,
|
|
10
15
|
tokenHandlersA1,
|
|
11
16
|
tokenHandlersRC
|
|
12
17
|
} from './constants.js';
|
|
@@ -15,10 +20,22 @@ const isType = (t, type) => t && t.type === type;
|
|
|
15
20
|
const isRangeOp = t => t && t.value === ':';
|
|
16
21
|
const isBangOp = t => t && t.value === '!';
|
|
17
22
|
|
|
18
|
-
|
|
23
|
+
const defaultOptions = {
|
|
24
|
+
emitRanges: false,
|
|
25
|
+
mergeRanges: true,
|
|
26
|
+
negativeNumbers: false,
|
|
27
|
+
r1c1: false
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export function getTokens (fx, tokenHandlers, options = {}) {
|
|
31
|
+
const { emitRanges, mergeRanges, negativeNumbers } = Object.assign({}, defaultOptions, options);
|
|
19
32
|
const tokens = [];
|
|
20
33
|
let pos = 0;
|
|
21
34
|
const lookBehind = n => tokens[tokens.length - n];
|
|
35
|
+
const lookBehindIgnoreWS = n => {
|
|
36
|
+
const noWs = tokens.filter(t => !isType(t, WHITESPACE) && !isType(t, NEWLINE));
|
|
37
|
+
return noWs[noWs.length - n];
|
|
38
|
+
};
|
|
22
39
|
|
|
23
40
|
if (/^=/.test(fx)) {
|
|
24
41
|
const token = {
|
|
@@ -58,6 +75,23 @@ export function getTokens (fx, tokenHandlers = [], emitRanges = false, mergeRang
|
|
|
58
75
|
...(emitRanges ? { range: [ startPos, pos ] } : {})
|
|
59
76
|
};
|
|
60
77
|
|
|
78
|
+
if (tokenType === STRING && !tokenValue.endsWith('"')) {
|
|
79
|
+
token.unterminated = true;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (negativeNumbers && tokenType === NUMBER) {
|
|
83
|
+
const last1 = lookBehind(1);
|
|
84
|
+
if (last1 && isType(last1, OPERATOR) && last1.value === '-') {
|
|
85
|
+
// we have a number preceded by a minus
|
|
86
|
+
const last2 = lookBehindIgnoreWS(2);
|
|
87
|
+
// missing last2 means we are at the start of the stream
|
|
88
|
+
if (!last2 || isType(last2, FX_PREFIX) || (isType(last2, OPERATOR) && ![ '%', '}', ')', '#' ].includes(last2.value))) {
|
|
89
|
+
tokens.pop();
|
|
90
|
+
token.value = '-' + tokenValue;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
61
95
|
if (mergeRanges) {
|
|
62
96
|
if (tokenType === RANGE || tokenType === RANGE_NAMED || tokenType === RANGE_BEAM) {
|
|
63
97
|
const merge = [];
|
|
@@ -94,7 +128,7 @@ export function getTokens (fx, tokenHandlers = [], emitRanges = false, mergeRang
|
|
|
94
128
|
|
|
95
129
|
// Formulas can either have RC or A1 style refs, not both: because C1 and R1 are both!
|
|
96
130
|
// Refmode: A1 | RC | Anostic emit ranges with RANGE
|
|
97
|
-
export function tokenize (fx,
|
|
98
|
-
const tokenHandlers = r1c1 ? tokenHandlersRC : tokenHandlersA1;
|
|
99
|
-
return getTokens(fx, tokenHandlers,
|
|
131
|
+
export function tokenize (fx, options = {}) {
|
|
132
|
+
const tokenHandlers = options.r1c1 ? tokenHandlersRC : tokenHandlersA1;
|
|
133
|
+
return getTokens(fx, tokenHandlers, options);
|
|
100
134
|
}
|
package/lib/parseRef.js
CHANGED
|
@@ -51,7 +51,10 @@ const validRunsNamed = validRuns.concat([
|
|
|
51
51
|
]);
|
|
52
52
|
|
|
53
53
|
export function parseRef (ref, allow_named = true, tokenHandlers = []) {
|
|
54
|
-
const tokens = getTokens(ref, tokenHandlers,
|
|
54
|
+
const tokens = getTokens(ref, tokenHandlers, {
|
|
55
|
+
emitRanges: false,
|
|
56
|
+
mergeRanges: false
|
|
57
|
+
});
|
|
55
58
|
const refData = {
|
|
56
59
|
sheetName: '',
|
|
57
60
|
workbookName: '',
|
package/package.json
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@borgar/fx",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "Utilities for working with Excel formulas",
|
|
5
5
|
"main": "dist/fx.js",
|
|
6
6
|
"module": "lib/index.js",
|
|
7
7
|
"exports": {
|
|
8
8
|
".": {
|
|
9
|
-
"require":
|
|
9
|
+
"require": "./dist/fx.js",
|
|
10
10
|
"default": "./lib/index.js"
|
|
11
11
|
}
|
|
12
12
|
},
|
|
13
13
|
"scripts": {
|
|
14
14
|
"lint": "eslint index.js lib/*.js",
|
|
15
|
-
"test": "tape
|
|
15
|
+
"test": "tape lib/*-test.js | tap-min",
|
|
16
16
|
"build": "NODE_ENV=production rollup -c"
|
|
17
17
|
},
|
|
18
18
|
"repository": {
|
|
19
19
|
"type": "git",
|
|
20
|
-
"url": "git+https://github.com/borgar/
|
|
20
|
+
"url": "git+https://github.com/borgar/fx.git"
|
|
21
21
|
},
|
|
22
22
|
"bugs": {
|
|
23
|
-
"url": "https://github.com/borgar/
|
|
23
|
+
"url": "https://github.com/borgar/fx/issues"
|
|
24
24
|
},
|
|
25
25
|
"browserslist": [
|
|
26
26
|
"defaults",
|
|
@@ -36,16 +36,18 @@
|
|
|
36
36
|
"author": "Borgar Þorsteinsson <borgar@borgar.net> (http://borgar.net/)",
|
|
37
37
|
"license": "MIT",
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@babel/core": "~7.
|
|
40
|
-
"@babel/eslint-parser": "~7.
|
|
41
|
-
"@babel/preset-env": "~7.
|
|
39
|
+
"@babel/core": "~7.18.13",
|
|
40
|
+
"@babel/eslint-parser": "~7.18.9",
|
|
41
|
+
"@babel/preset-env": "~7.18.10",
|
|
42
42
|
"@borgar/eslint-config": "~2.2.1",
|
|
43
|
-
"@rollup/plugin-babel": "~5.3.
|
|
43
|
+
"@rollup/plugin-babel": "~5.3.1",
|
|
44
44
|
"babel-eslint": "~10.1.0",
|
|
45
|
-
"eslint": "~
|
|
46
|
-
"rollup": "~2.
|
|
47
|
-
"rollup-plugin-uglify": "~6.0.4",
|
|
45
|
+
"eslint": "~8.23.0",
|
|
46
|
+
"rollup": "~2.79.0",
|
|
48
47
|
"tap-min": "~2.0.0",
|
|
49
|
-
"tape": "~5.
|
|
48
|
+
"tape": "~5.6.0"
|
|
49
|
+
},
|
|
50
|
+
"dependencies": {
|
|
51
|
+
"rollup-plugin-terser": "~7.0.2"
|
|
50
52
|
}
|
|
51
53
|
}
|
package/rollup.config.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import babel from '@rollup/plugin-babel';
|
|
2
|
-
import {
|
|
2
|
+
import { terser } from 'rollup-plugin-terser';
|
|
3
3
|
import pkg from './package.json';
|
|
4
4
|
|
|
5
5
|
const isProd = process.env.NODE_ENV === 'production';
|
|
@@ -16,6 +16,6 @@ export default {
|
|
|
16
16
|
file: pkg.main,
|
|
17
17
|
format: 'cjs',
|
|
18
18
|
sourcemap: 'inline',
|
|
19
|
-
plugins: [ isProd &&
|
|
19
|
+
plugins: [ isProd && terser() ]
|
|
20
20
|
}
|
|
21
21
|
};
|