{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-tom/src/components/widgets/lively-table.js"],"names":["aexpr","Morph","ContextMenu","DragBehavior","_","LivelyTable","create","createElement","initialize","addEventListener","evt","onClick","setAttribute","onMouseDown","onCopy","onCut","onPaste","onFocus","onFocusout","onExtentChanged","onContextMenu","isCell","cell","isEditingCells","activeElement","allParents","rows","from","querySelectorAll","column","indexOrLabel","index","isInteger","headers","undefined","cells","row","ea","cellsIn","cellAt","columnIndex","rowIndex","columnOfCell","rowOfCell","initailizeCells","element","rowCells","keyForCell","asArray","selectCell","multipleSelection","indexOf","map","selectCellPrivate","dispatchEvent","CustomEvent","addSelectedCell","selectRow","multiselection","clearSelection","selectColumn","changeSelection","columnDelta","rowDelta","removeSelection","columnA","columnB","rowA","rowB","changeSelectionBetween","columnMin","min","columnMax","max","rowMin","rowMax","removeSelectedCell","detail","table","navigateRelative","newCell","setTextSelectionOfCellContents","range","createRange","sel","getSelection","setStart","i","textContent","length","e","collapse","removeAllRanges","addRange","clearAllSelection","removeAttribute","doNotClearStart","stopPropagation","preventDefault","menu","insertColumnAt","removeColumnAt","insertRowAt","removeRowAt","openIn","document","get","setWidth","getExtent","setHeight","sleep","isInFocus","setFocusAndTextSelection","focus","onEnterDown","wasEditing","isInEditing","stopEditingCurrentCell","startEditingCurrentCell","onEscDown","handleArrowKey","deltaColumn","deltaRow","onLeftDown","onRightDown","onUpDown","onDownDown","composedPath","onMouseMoveSelection","onMouseUpSelection","removeEventListener","data","getSelectionAsCSV","selString","baseRow","baseColumn","setCellExpression","moveRelativeReferencesInCode","setFromCSVat","deactivateAllExpressions","registerOnAllCells","moveReferencesAfter","moveColumns","isInsertion","delta","rewrittenCode","moveReferencesInCode","code","replace","ref","absoluteOrRelative","columnIndexToDigit","columnOffset","rowOffset","log","cellArray","oldCell","remove","focusedElement","lively","oldRow","newRow","eaRow","eaCell","asCSV","join","asJSO","all","header","slice","obj","forEach","name","currentRowToJSO","rowToJSO","rowContents","jso","maxColumnsIn","array","reduce","sum","setFromArrayClean","maxColumns","html","setEmptyWithSize","width","height","setFromArray","force","querySelector","filter","setFromArrayAt","tableLength","appendChild","rowElement","push","fromRow","j","Error","splitIntoRows","csv","separator","split","line","m","match","setFromCSV","setFromJSO","clean","keys","key","unshift","copySelectionAsTable","tmp","values","groupBy","sortBy","getSelectionAsJSO","result","each","livelyMigrate","other","selection","livelyExample","getCellValue","val","ae","dispose","registerCellForActivityChanges","expression","isActive","cellChangedActive","text","substring","value","evaluateCellText","inactiveExpression","getCurrentValue","isDisposed","expressionCode","onChangeCode","newValue","onChange","eval","isError","evaluateToCurrentValue","CellReferenceRegex","params","cellFromCode","a","toUpperCase","charCodeAt","fromCharCode","floor"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;AAKOA,W;;;;AAHAC,W;;AACAC,iB;;AACAC,kB;;AAEAC,O;;;;;;;;;;;;;;;AAJAH,mL;;;;;;;;;;;;;;;;;;;;;;;;;;AACAC,yL;;;;;;;;;;;;;;;;;;;;;;;;;;AACAC,0L;;;;;;;;;;;;;;;;;;;;;;;;;;AACAH,mL;;;;;;;;;;;;;;;;;;;;;;;;;;AACAI,+K;;;;;;;;;;;;;;;;;;AAEQ,YAAMC,WAAN,SAA0BJ,KAA1B,CAAgC;;AAE7C,eAAOK,MAAP,GAAgB;AACd;AACA,yHAAO,8EAASC,aAAT,CAAuB,cAAvB,CAAP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD;;AAEDC,qBAAa;AAAA;;AACX,eAAKC,gBAAL,CAAsB,OAAtB,EAA+BC;AAAA;AAAO,kGAAKC,OAAL,6EAAaD,GAAb;AAAP,WAA/B;AADW;AAEX,eAAKE,YAAL,CAAkB,UAAlB,EAA8B,CAA9B;AACA,4IAAyB,IAAzB,EAA+B,OAA/B;AAHW;AAIX,eAAKH,gBAAL,CAAsB,WAAtB,EAAmCC;AAAA;AAAO,sGAAKG,WAAL,6EAAiBH,GAAjB;AAAP,WAAnC;;AAJW;AAMX,eAAKD,gBAAL,CAAsB,MAAtB,EAA8BC;AAAA;AAAO,iGAAKI,MAAL,6EAAYJ,GAAZ;AAAP,WAA9B;AANW;AAOX,eAAKD,gBAAL,CAAsB,KAAtB,EAA6BC;AAAA;AAAO,gGAAKK,KAAL,8EAAWL,GAAX;AAAP,WAA7B;AAPW;AAQX,eAAKD,gBAAL,CAAsB,OAAtB,EAA+BC;AAAA;AAAO,kGAAKM,OAAL,8EAAaN,GAAb;AAAP,WAA/B;;AARW;AAUX,eAAKD,gBAAL,CAAsB,OAAtB,EAA+BC;AAAA;AAAO,kGAAKO,OAAL,8EAAaP,GAAb;AAAP,WAA/B;AAVW;AAWX,eAAKD,gBAAL,CAAsB,UAAtB,EAAkCC;AAAA;AAAO,qGAAKQ,UAAL,8EAAgBR,GAAhB;AAAP,WAAlC;;AAXW;AAaX,eAAKD,gBAAL,CAAsB,gBAAtB,EAAwCC;AAAA;AAAO,0GAAKS,eAAL,8EAAqBT,GAArB;AAAP,WAAxC;AAbW;AAcX,eAAKD,gBAAL,CAAsB,aAAtB,EAAqCC;AAAA;AAAO,wGAAKU,aAAL,8EAAmBV,GAAnB;AAAP,WAArC,EAAqE,KAArE;;AAEA,wDAAiC,EAAjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAhBW;AAiBZ;;AAED;;AAEAW,eAAOC,IAAP,EAAa;AAAA;;AACX,iBAAO,+GAAgB,IAAhB,IAAwB,+GAAgB,IAA/C;AACD;;AAEDC,yBAAiB;AAAA;;AACf,cAAIC,mGAAgB,0EAAOA,aAAP,EAAhB,CAAJ;AACA,iBAAO,+NAAiBA,aAAjB,2HAAkD,0EAAOC,UAAP,kGAAkBD,aAAlB,GAAiC,EAAjC,EAAqC,IAArC,CAAlD,gBAAsG,IAAtG,EAAP;AACD;;AAEDE,eAAO;AACL,yFAAO,wEAAMC,IAAN,qFAAW,KAAKC,gBAAL,CAAsB,IAAtB,CAAX,EAAP;AACD;;AAEDC,eAAOC,YAAP,EAAqB;AAAA;;AACnB,cAAIC,KAAJ;AACA,4FAAI,0EAAOC,SAAP,gGAAiBF,YAAjB,EAAJ,EAAoC;AAClCC,mHAAQD,YAAR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD,WAFD,MAEO;AACLC,iHAAQ,KAAKE,OAAL,EAAR,8GAA+BH,YAA/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,gBAAI,2FAAS,CAAC,CAAd;AAAiB,yFAAOI,SAAP;AAAjB;AACD;AACD,4GAAO,KAAKC,KAAL,EAAP,WAAwBC;AAAA;AAAO,kMAAIL,KAAJ;AAAP,WAAxB;AACD;;AAEDI,gBAAQ;AACN,2GAAO,KAAKT,IAAL,EAAP,WAAuBW;AAAA;AAAM,kGAAKC,OAAL,4EAAaD,EAAb;AAAN,WAAvB;AACD;;AAEDC,gBAAQF,GAAR,EAAa;AAAA;;AACX,yFAAO,wEAAMT,IAAN,oFAAW,kFAAIC,gBAAJ,CAAqB,OAArB,CAAX,EAAP;AACD;;AAEDW,eAAOC,WAAP,EAAoBC,QAApB,EAA8B;AAAA;;AAC5B,cAAIL,yFAAM,KAAKV,IAAL,EAAN,0FAAkBe,QAAlB,EAAJ;AACA,cAAI,8EAACL,GAAD,CAAJ;AAAU,uFAAOF,SAAP;AAAV,WACA,qGAAO,kFAAIN,gBAAJ,CAAqB,OAArB,CAAP,gGAAqCY,WAArC;AACD;;AAEDE,qBAAapB,IAAb,EAAmB;AAAA;;AACjB,8GAAO,KAAKgB,OAAL,2FAAahB,IAAb,oBAAP,8FAAgDA,IAAhD;AACD;;AAEDqB,kBAAUrB,IAAV,EAAgB;AAAA;;AACd,cAAIc,gGAAMd,IAAN,mBAAJ;AACA,2GAAO,KAAKI,IAAL,EAAP,4FAA2BU,GAA3B;AACD;;AAED;AACAQ,wBAAgBC,OAAhB,EAAyB;AAAA;;AACvB,cAAInB,+EAAO,KAAKA,IAAL,EAAP,CAAJ;AAAA,cACIU,sGAAMS,OAAN,mBADJ;AAAA,cAEIC,sFAAW,KAAKR,OAAL,8EAAaF,GAAb,EAAX,CAFJ;AAGA,iBAAO;AACLV,gBADK;AAELU,eAFK;AAGLU;AAHK,WAAP;AAKD;;AAEDC,mBAAWzB,IAAX,EAAiB;AAAA;;AACf,2HAAO,KAAKa,KAAL,EAAP,GAAoB,CAApB,mFAAuB,KAAKO,YAAL,gFAAkBpB,IAAlB,EAAvB;AACD;;AAEDW,kBAAU;AACR,uGAAO,KAAKe,OAAL,EAAP,GAAsB,CAAtB;AACD;AACD;;AAEAC,mBAAWJ,OAAX,EAAoBK,iBAApB,EAAuC;AAAA;;AACrC,cAAI,2EAAC,KAAK7B,MAAL,sFAAYwB,OAAZ,EAAD,CAAJ;AAA2B;AAA3B,WACA,IAAI,mCAAoB,wHAAoBA,OAApB,CAAxB,EAAqD;AACnD,2EAAmC,KAAnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,gBAAI,0GAACK,iBAAD,CAAJ;AAAwB,qGAAkC,gBAAlC;AAAxB;AACD;AACD,cAAI,iGAACL,OAAD,mBAAJ;AAA4B;AAA5B,WANqC,CAMD;;AAEpC,+HAAmBA,OAAnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,gBAAM;AACJnB,gBADI;AAEJU,eAFI;AAGJU;AAHI,iGAIF,KAAKF,eAAL,sFAAqBC,OAArB,EAJE,CAAN;;AAMA,yBAAI,IAAJ,iBAAqB;AACnB,kGAAiC,SAAjC;AACD;AACD,sHAAkBT,GAAlB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,6FAA8B,SAA9B;;AAEA,yHAAuB,qFAAKe,OAAL,8EAAaf,GAAb,EAAvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,gIAA0B,iGAASe,OAAT,sFAAiBN,OAAjB,EAA1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mHAAqB,qFAAKO,GAAL,CAASf;AAAA;AAAM,yHAAG,IAAH;AAAN,WAAT,CAArB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAvBqC;AAyBrC,eAAKgB,iBAAL,0GAAuBH,iBAAvB,kFAA0CxB,IAA1C,gFAAgDU,GAAhD,0FAAqDU,QAArD,wFAA+DD,OAA/D;;AAzBqC;AA2BrC,eAAKS,aAAL,CAAmB,2EAAIC,WAAJ,EAAgB,eAAhB,CAAnB;AACD;;AAED;AACAF,0BAAkBH,iBAAlB,EAAqCxB,IAArC,EAA2CU,GAA3C,EAAgDU,QAAhD,EAA0DD,OAA1D,EAAmE;AAAA;;AACjE,sHAAIK,iBAAJ,EAAuB;AAAA;;AACrB,iBAAKM,eAAL,YAAqB,IAArB;AACD,WAFD,MAEO;AACL,2BAAI,IAAJ;AAAwB,+EAA2BnB,MAAM;AAAA;;AACvD,sJAAoB,iBAApB;AACA,sJAAoB,gBAApB;AACD,eAHuB;AAAxB,aAIA,kCAAqB,YAAC,IAAD,iBAArB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,gGAA+B,gBAA/B;AACA,qDAAiB,IAAjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,yHAAqB,qFAAKc,OAAL,8EAAaf,GAAb,EAArB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,gIAAwB,iGAASe,OAAT,sFAAiBN,OAAjB,EAAxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,8FAA6B,iBAA7B;AACD;AACF;;AAEDY,kBAAUhB,QAAV,EAAoBiB,cAApB,EAAoC;AAAA;;AAClC,cAAI,oGAACA,cAAD,CAAJ,EAAqB;AAAA;;AACnB,iBAAKC,cAAL;AACD;AACD,qHAAKxB,KAAL,4FAAaM,QAAb,gBAA+BnB,QAAQ;AAAA;AAAA;;AACrC,iBAAK2B,UAAL,gFAAgB3B,IAAhB,GAAsB,IAAtB;AACD,WAFD;AAGD;;AAEDsC,qBAAapB,WAAb,EAA0BkB,cAA1B,EAA0C;AAAA;;AACxC,cAAI,oGAACA,cAAD,CAAJ,EAAqB;AAAA;;AACnB,iBAAKC,cAAL;AACD;AACD,0GAAKxB,KAAL,iBAAqBC,OAAO;AAAA;AAAA;;AAC1B,iBAAKa,UAAL,yFAAgBb,GAAhB,gGAAoBI,WAApB,IAAkC,IAAlC;AACD,WAFD;AAGD;;AAEDqB,wBAAgBC,WAAhB,EAA6BC,QAA7B,EAAuCC,eAAvC,EAAwD;AAAA;;AACtD,cAAIC,qBAAU,IAAV,qBAAJ;AAAA,cACIC,UAAU,sIAA0BJ,WAA1B,CADd;AAAA,cAEIK,kBAAO,IAAP,kBAFJ;AAAA,cAGIC,OAAO,6HAAuBL,QAAvB,CAHX;AADsD;AAKtD,eAAKM,sBAAL,sFAA4BJ,OAA5B,wFAAqCC,OAArC,kFAA8CC,IAA9C,kFAAoDC,IAApD,wGAA0DJ,eAA1D;AACD;;AAEDK,+BAAuBJ,OAAvB,EAAgCC,OAAhC,EAAyCC,IAAzC,EAA+CC,IAA/C,EAAqDJ,eAArD,EAAsE;AAAA;;AACpE,cAAI7B,iFAAQ,KAAKA,KAAL,EAAR,CAAJ;AAAA,cACImC,mFAAY,sEAAKC,GAAL,sFAASN,OAAT,wFAAkBC,OAAlB,EAAZ,CADJ;AAAA,cAEIM,mFAAY,sEAAKC,GAAL,sFAASR,OAAT,wFAAkBC,OAAlB,EAAZ,CAFJ;AAAA,cAGIQ,gFAAS,sEAAKH,GAAL,gFAASJ,IAAT,kFAAeC,IAAf,EAAT,CAHJ;AAAA,cAIIO,gFAAS,sEAAKF,GAAL,gFAASN,IAAT,kFAAeC,IAAf,EAAT,CAJJ;;AAMA,eAAK,IAAI3B,WAAWiC,MAApB,EAA4BjC,YAAYkC,MAAxC,EAAgDlC,UAAhD,EAA4D;AAC1D,gBAAIL,kGAAMD,KAAN,0FAAYM,QAAZ,EAAJ;;AAEA,4FAAIL,GAAJ,EAAS;AACP;;AAEA,mBAAK,IAAII,cAAc8B,SAAvB,EAAkC9B,eAAegC,SAAjD,EAA4DhC,aAA5D,EAA2E;AACzE,oBAAIlB,+FAAOc,GAAP,gGAAWI,WAAX,EAAJ;AACA;AACA,kGAAIlB,IAAJ,EAAU;AACR,0HAAI0C,eAAJ,EAAqB;AAAA;;AACnB,yBAAKY,kBAAL,gFAAwBtD,IAAxB;AACD,mBAFD,MAEO;AAAA;;AACL,yBAAKkC,eAAL,gFAAqBlC,IAArB;AACD;AACF;AACF;AACF;AACF;;AAzBmE;AA2BpE,eAAKgC,aAAL,CAAmB,2EAAIC,WAAJ,EAAgB,mBAAhB,EAAqC,EAAEsB,QAAQ,EAAEC,OAAO,IAAT,EAAV,EAArC,CAAnB;AACD;;AAEDC,yBAAiBjB,WAAjB,EAA8BC,QAA9B,EAAwCb,iBAAxC,EAA2D;AAAA;;AACzD,cAAI,gHAA4BhB,SAA5B,CAAJ;AAA2C;AAA3C,WACA,IAAIC,iFAAQ,KAAKA,KAAL,EAAR,CAAJ;AACA,sHAAIe,iBAAJ,EAAuB;AAAA;;AACrB,iBAAKW,eAAL,CAAqB,8FAACC,WAAD,CAArB,EAAmC,wFAACC,QAAD,CAAnC,EAA8C,IAA9C;;AADqB;AAGrB,iBAAKF,eAAL,8FAAqBC,WAArB,0FAAkCC,QAAlC;AACD;AACD,cAAI3B,kGAAMD,KAAN,GAAY,6HAAuB4B,QAAvB,CAAZ,CAAJ;AACA,cAAI,8EAAC3B,GAAD,CAAJ;AAAU;AAAV,WACA,IAAI4C,kGAAU5C,GAAV,GAAc,sIAA0B0B,WAA1B,CAAd,CAAJ;;AAEA,kGAAIkB,OAAJ,EAAa;AAAA;;AACX,iBAAK/B,UAAL,sFAAgB+B,OAAhB,4GAAyB9B,iBAAzB;AACD;AACF;;AAED+B,uCAA+B3D,IAA/B,EAAqC;AAAA;;AACnC,cAAI4D,2FAAQ,8EAASC,WAAT,EAAR,CAAJ;AACA,cAAIC,wFAAM,0EAAOC,YAAP,EAAN,CAAJ;AACA,cAAI;AAAA;;AACF;AACA,oGAAMC,QAAN,gFAAehE,IAAf,GAAqB,CAArB;AACA;AACA,iBAAK,IAAIiE,IAAI,CAAb,EAAgBA,KAAKjE,KAAKkE,WAAL,CAAiBC,MAAtC,EAA8CF,GAA9C,EAAmD;AAAA;;AACjD,sGAAMD,QAAN,gFAAehE,IAAf,4EAAqBiE,CAArB;AACD;AACF,WAPD,CAOE,OAAOG,CAAP,EAAU;AACV;AACD;AAZkC;AAanC,kGAAMC,QAAN,CAAe,IAAf;AAbmC;AAcnC,4FAAIC,eAAJ;AAdmC;AAenC,4FAAIC,QAAJ,kFAAaX,KAAb;AACD;;AAEDY,4BAAoB;AAClB,qHAAKlE,gBAAL,CAAsB,IAAtB,gBAAoCS,MAAM;AAAA;;AACxC,kJAAoB,SAApB;AADwC;AAExC,2FAAG0D,eAAH,CAAmB;AACnB;;AADA;AAID,WAND;AAOD;;AAEDpC,uBAAeqC,eAAf,EAAgC;AAAA;;AAC9B,yBAAI,IAAJ,kBAAsB;AACpB,mFAAiC,iBAAjC;AACA,mGAAkC,gBAAlC;AACD;AACD,cAAI,sGAACA,eAAD,CAAJ,EAAsB;AACpB,iHAAmB9D,SAAnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,gHAAkBA,SAAlB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,qHAAuBA,SAAvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,wHAA0BA,SAA1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mHAAqBA,SAArB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,+GAAiBA,SAAjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mHAAqBA,SAArB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,sHAAwBA,SAAxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD;;AAED,qHAAKN,gBAAL,CAAsB,OAAtB,gBAAuCS,MAAM;AAAA;;AAC3C,kJAAoB,gBAApB;AACA,kJAAoB,iBAApB;AACD,WAHD;;AAKA,4CAAqB,EAArB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD;;AAEDmB,wBAAgBX,OAAhB,EAAyB;AAAA;;AACvB,cAAI,YAAC,IAAD,kBAAJ;AAAyB,8CAAqB,EAArB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAzB,WACA,IAAI,sJAA2BA,OAA3B,MAAsC,CAA1C,EAA6C;AAC3C,+JAAwBA,OAAxB;AACD;AACD,4JAAsB,gBAAtB;AACD;;AAED+B,2BAAmB/B,OAAnB,EAA4B;AAAA;;AAC1B,cAAI,YAAC,IAAD,kBAAJ;AAAyB,8CAAqB,EAArB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAzB,WACA,mJAAwBA,OAAxB;AACA,yEAAqB,IAArB,+BAA+CR;AAAA;AAAM,2LAAOQ,OAAP;AAAN,WAA/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,+JAAyB,gBAAzB;AACD;;AAED;;AAEAzB,sBAAcV,GAAd,EAAmB;AAAA;;AACjB,cAAI,yFAACA,GAAD,cAAJ,EAAmB;AAAA;;AACjB,8FAAIuF,eAAJ;AADiB;AAEjB,8FAAIC,cAAJ;AACA,gBAAIC,OAAO,+FAAIjG,WAAJ,EAAgB,IAAhB,EAAsB,CAAC,CAAC,YAAD,EAAe;AAAM,2GAAKkG,cAAL,YAAoB,IAApB;AAAN,aAAf,CAAD,EAAqE,CAAC,eAAD,EAAkB;AAAM,2GAAKC,cAAL,YAAoB,IAApB;AAAN,aAAlB,CAArE,EAA4I,CAAC,SAAD,EAAY;AAAM,wGAAKC,WAAL,YAAiB,IAAjB;AAAN,aAAZ,CAA5I,EAAuM,CAAC,YAAD,EAAe;AAAM,wGAAKC,WAAL,YAAiB,IAAjB;AAAN,aAAf,CAAvM,CAAtB,CAAX;AAHiB;AAIjB,iGAAKC,MAAL,gFAAYC,QAAZ,yFAA2B/F,GAA3B,GAAgC,IAAhC;AACA,mBAAO,IAAP;AACD;AACF;;AAEDS,0BAAkB;AAAA;;AAChB,cAAI2D,+EAAQ,KAAK4B,GAAL,CAAS,OAAT,CAAR,CAAJ;AADgB;AAEhB,oFAAOC,QAAP,kFAAgB7B,KAAhB,6FAAuB,0EAAO8B,SAAP,CAAiB,IAAjB,CAAvB;AAFgB;AAGhB,oFAAOC,SAAP,CAAiB,IAAjB,4FAAuB,0EAAOD,SAAP,kFAAiB9B,KAAjB,EAAvB,SAAkD,IAAlD;AACD;;AAED,cAAM5D,UAAN,GAAmB;AACjB;AACA,2FAAM,0EAAO4F,KAAP,CAAa;AACnB;AADM,WAAN,EAEE,IAAI,8EAAC,KAAKC,SAAL,EAAD,CAAJ,EAAuB;AACvB,wEAAsB,QAAtB;AACD;AACF;;AAED9F,kBAAU;AACR,0FAAI,KAAK8F,SAAL,EAAJ,EAAsB;AACpB,qEAAmB,QAAnB;AACD;AACF;;AAEDC,iCAAyBnE,OAAzB,EAAkC;AAAA;;AAChC,cAAI,sFAACA,OAAD,CAAJ;AAAc;AAAd,WADgC;AAEhC,eAAKiD,iBAAL;AACA;AAHgC;AAIhC,wGAAQmB,KAAR;AACA,cAAI7B,wFAAM,0EAAOC,YAAP,EAAN,CAAJ;AACA;AACD;AACD;;AAEA;AACA6B,oBAAYxG,GAAZ,EAAiB;AAAA;;;AAEf,cAAI,YAAC,IAAD,gBAAJ;AAAuB;AAAvB,WACA,IAAIY,kBAAO,IAAP,gBAAJ;AACA,cAAI6F,4FAAa,KAAKC,WAAL,gFAAiB9F,IAAjB,EAAb,CAAJ;;AAEA,wGAAI6F,UAAJ,EAAgB;AACd,2EAAmC,KAAnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AADc;AAEd,iBAAKF,KAAL;;AAFc;AAId,iBAAKI,sBAAL;AACD,WALD,MAKO;AAAA;;AACL,iBAAKC,uBAAL;AACD;;AAbc;AAef,4FAAIrB,eAAJ;AAfe;AAgBf,4FAAIC,cAAJ;AACD;;AAEDqB,kBAAU7G,GAAV,EAAe;AAAA;;AACb,cAAI,YAAC,IAAD,gBAAJ;AAAuB;AAAvB,WADa;AAEb,eAAKsG,wBAAL,YAA8B,IAA9B;AAFa;AAGb,4FAAIf,eAAJ;AAHa;AAIb,4FAAIC,cAAJ;AACD;;AAEDkB,oBAAY9F,IAAZ,EAAkB;AAAA;;AAChB,6HAAOA,IAAP,8BAA+B,SAA/B;AACD;;AAEDkG,uBAAe9G,GAAf,EAAoB+G,WAApB,EAAiCC,QAAjC,EAA2C;AAAA;;AACzC,4FAAI,KAAKN,WAAL,YAAiB,IAAjB,iBAAJ;AAAwC;AAAxC,WADyC;AAEzC,eAAKrC,gBAAL,8FAAsB0C,WAAtB,0FAAmCC,QAAnC,GAA6C,6GAAgB,IAA7D;AAFyC;AAGzC,eAAKV,wBAAL,YAA8B,IAA9B;AAHyC;AAIzC,4FAAIf,eAAJ;AAJyC;AAKzC,4FAAIC,cAAJ;AACD;;AAEDoB,kCAA0B;AACxB,cAAI,YAAC,IAAD,gBAAJ;AAAuB;AAAvB,WADwB,CAExB;AACA,yEAAmC,IAAnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,8FAA+B,SAA/B;AAJwB;AAKxB,eAAKhE,aAAL,CAAmB,2EAAIC,WAAJ,EAAgB,oBAAhB,CAAnB;AACA;AACD;;AAED8D,iCAAyB;AACvB,cAAI,YAAC,IAAD,gBAAJ;AAAuB;AAAvB,WADuB,CAEvB;AACA,yEAAmC,KAAnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iGAAkC,SAAlC;AAJuB;AAKvB,eAAK/D,aAAL,CAAmB,2EAAIC,WAAJ,EAAgB,qBAAhB,CAAnB;AACD;AACD;;AAEAoE,mBAAWjH,GAAX,EAAgB;AAAA;AAAA;;AACd,eAAK8G,cAAL,8EAAoB9G,GAApB,GAAyB,CAAC,CAA1B,EAA6B,CAA7B;AACD;;AAEDkH,oBAAYlH,GAAZ,EAAiB;AAAA;AAAA;;AACf,eAAK8G,cAAL,8EAAoB9G,GAApB,GAAyB,CAAzB,EAA4B,CAA5B;AACD;;AAEDmH,iBAASnH,GAAT,EAAc;AAAA;AAAA;;AACZ,eAAK8G,cAAL,8EAAoB9G,GAApB,GAAyB,CAAzB,EAA4B,CAAC,CAA7B;AACD;;AAEDoH,mBAAWpH,GAAX,EAAgB;AAAA;AAAA;;AACd,eAAK8G,cAAL,8EAAoB9G,GAApB,GAAyB,CAAzB,EAA4B,CAA5B;AACD;;AAED;AACAG,oBAAYH,GAAZ,EAAiB;AAAA;;AACf,cAAIY,iGAAO,kFAAIyG,YAAJ,EAAP,GAA0B,CAA1B,CAAJ;AACA,cAAI,iHAAkB,IAAtB;AAA4B;AAA5B,WAFe,CAEqB;;AAEpC,sGAAIrH,GAAJ,eAAiB;AACf,gBAAI,iHAAkB,IAAtB,EAA4B;AAAA;;AAC1B,mBAAKuC,UAAL,gFAAgB3B,IAAhB,GAAsB,IAAtB;AACA;AACD;AACF;;AAGD,cAAI,oGAAS,IAAT,gBAAJ,EAA+B;AAC7B,8FAAI,KAAK8F,WAAL,YAAiB,IAAjB,iBAAJ,EAAwC;AACtC;AACD,aAFD,MAEO;AAAA;;AACL;AACA,mBAAKE,uBAAL;AACD;AACF,WAPD,MAOO;AACL,gBAAI,2EAAoB,IAApB,6CAAwD,SAAxD,EAAJ,EAAwE;AAAA;;AACtE,mBAAKD,sBAAL;AACD;;AAHI;AAKL,iBAAKJ,KAAL;AALK;AAML,iBAAKhE,UAAL,gFAAgB3B,IAAhB;AANK;AAOL,iBAAK0F,wBAAL,YAA8B,IAA9B;AACD;AA3Bc;AA4Bf,4FAAIf,eAAJ;AA5Be;AA6Bf,4FAAIC,cAAJ;;AAEA,cAAI,oGAAS,IAAT,gBAAJ,EAA+B;AAAA;;AAC7B,iBAAKvC,cAAL,CAAoB,IAApB;AAD6B;AAE7B,iBAAKV,UAAL,gFAAgB3B,IAAhB;AACD;;AAlCc;AAoCf,oFAAOb,gBAAP,CAAwB,aAAxB,iFAAuCgG,QAAvC,YAAsD,WAAtD,EAAmE/F;AAAA;AAAO,+GAAKsH,oBAAL,8EAA0BtH,GAA1B;AAAP,WAAnE;AApCe;AAqCf,oFAAOD,gBAAP,CAAwB,aAAxB,iFAAuCgG,QAAvC,YAAsD,SAAtD,EAAiE/F;AAAA;AAAO,6GAAKuH,kBAAL,8EAAwBvH,GAAxB;AAAP,WAAjE;;AArCe;AAuCf,4FAAIwF,cAAJ;AAvCe;AAwCf,4FAAID,eAAJ;AACD;;AAED+B,6BAAqBtH,GAArB,EAA0B;AAAA;;AACxB,cAAIY,iGAAO,kFAAIyG,YAAJ,EAAP,GAA0B,CAA1B,CAAJ;AACA,uFAAI,KAAK1G,MAAL,gFAAYC,IAAZ,EAAJ,EAAuB;AACrB,gBAAI,oGAAS,IAAT,gBAAJ;AAA+B;AAA/B,aADqB;AAGrB,iBAAKqC,cAAL,CAAoB,IAApB;;AAEA,gBAAI9B,yFAAS,KAAKa,YAAL,gFAAkBpB,IAAlB,EAAT,CAAJ;AACA,gBAAIc,mFAAM,KAAKO,SAAL,gFAAerB,IAAf,EAAN,CAAJ;;AANqB;AAQrB,iBAAK+C,sBAAL,YAA4B,IAA5B,0GAAmDxC,MAAnD,cAA2D,IAA3D,iGAA+EO,GAA/E;AAID;AACF;;AAED;AACA;AACA;;AAEA6F,2BAAmBvH,GAAnB,EAAwB;AAAA;AAAA;;AACtB,oFAAOwH,mBAAP,CAA2B,aAA3B,iFAA0CzB,QAA1C,YAAyD,WAAzD;AADsB;AAEtB,oFAAOyB,mBAAP,CAA2B,aAA3B,iFAA0CzB,QAA1C,YAAyD,SAAzD;;AAEA,cAAInF,iGAAO,kFAAIyG,YAAJ,EAAP,GAA0B,CAA1B,CAAJ;AACA,cAAI,oGAAS,IAAT,gBAAJ;AAA+B;AAA/B,WALsB;AAOtB,eAAKf,wBAAL,YAA8B,IAA9B;AAQD;;AAEDrG,gBAAQD,GAAR,EAAa,CAAE;;AAEf;;AAEAI,eAAOJ,GAAP,EAAY;AAAA;;AACV,+FAAI,KAAKa,cAAL,EAAJ;AAA2B;AAA3B,WADU,CAGV;;AAEA,cAAI,YAAC,IAAD,gBAAJ;AAAuB;AAAvB,WACA,IAAI,qCAAsB,0DAA4B,CAAtD,EAAyD;AACvD,gBAAI4G,4FAAO,KAAKC;AAChB;AADW,cAAP,CAAJ,CAEG,8IAA0B,YAA1B,iFAAwCD,IAAxC;AACJ,WAJD,MAIO;AACL,gBAAIE,gHAAY,0EAAOhD,YAAP,EAAZ,kBAAJ;AACA,gBAAI,4HAAmB,CAAvB,EAA0B;AACxB,4JAA0B,YAA1B,2FAAwCgD,SAAxC;AACD,aAFD,MAEO;AACL,4JAA0B,YAA1B,wBAAwC,IAAxC;AACD;AACF;AAjBS;AAkBV,4FAAIpC,eAAJ;AAlBU;AAmBV,4FAAIC,cAAJ;AACD;;AAEDnF,cAAML,GAAN,EAAW;AAAA;;AACT,+FAAI,KAAKa,cAAL,EAAJ;AAA2B;AAA3B,WADS;AAGT,eAAKT,MAAL,8EAAYJ,GAAZ;AACA,cAAI,qCAAsB,0DAA4B,CAAtD,EAAyD;AACvD;AACA,6EAA2B2B,MAAM;AAAA;;AAC/B,wHAAiB,EAAjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD,aAFD;AAGD,WALD,MAKO;AACL,uEAA+B,EAA/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD;AACF;;AAEDrB,gBAAQN,GAAR,EAAa;AAAA;;AACX,+FAAI,KAAKa,cAAL,EAAJ;AAA2B;AAA3B,WADW,CAGX;;AAEA,cAAI,YAAC,IAAD,gBAAJ;AAAuB;AAAvB,WAEA,IAAIY,KAAJ;AACA,cAAI,qCAAsB,0DAA4B,CAAtD,EAAyD;AACvD;AACAA,+BAAQ,IAAR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD,WAHD,MAGO;AACLA,oBAAQ,YAAC,IAAD,iBAAR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD;;AAED,cAAIgG,mIAAOzH,GAAP,iCAAiC,YAAjC,eAAJ;;AAEA,cAAI4H,uFAAU,KAAK3F,SAAL,6FAAeR,KAAf,GAAqB,CAArB,EAAV,CAAJ;AACA,cAAIoG,6FAAa,KAAK7F,YAAL,6FAAkBP,KAAlB,GAAwB,CAAxB,EAAb,CAAJ;;AAEA,4LAAMiB,GAAN,CAAU9B,QAAQ;AAAA;;AAChB;AACA,mBAAO,EAAEO,wFAAQ,KAAKa,YAAL,gFAAkBpB,IAAlB,EAAR,CAAF,EAAmCc,kFAAK,KAAKO,SAAL,gFAAerB,IAAf,EAAL,CAAnC,EAA8DA,IAA9D,EAAP;AACD,WAHD,gBAGW,CAAC,EAACO,MAAD,EAASO,GAAT,EAAcd,IAAd,EAAD,KAAyB;AAAA;;AAClC,gBAAG,iGAAK,CAAL,MAAU,GAAb,EAAkB;AAAA;;AAChB,mBAAKkH,iBAAL,gFAAuBlH,IAAvB,mGAA6B,KAAKmH,4BAAL,gFAAkCN,IAAlC,GAAwC,wLAASI,UAAT,CAAxC,EAA6D,yKAAMD,OAAN,CAA7D,CAA7B;AACD,aAFD,MAEO;AAAA;;AACL,mBAAKI,YAAL,gFAAkBP,IAAlB,sFAAwBtG,MAAxB,gFAAgCO,GAAhC;AACD;AACF,WATD;;AApBW;AA+BX,4FAAI6D,eAAJ;AA/BW;AAgCX,4FAAIC,cAAJ;AACD;;AAED;;AAEAyC,mCAA2B;AACzB,eAAK,MAAMvG,GAAX,6EAAkB,KAAKD,KAAL,EAAlB,GAAgC;AAAA;;AAC9B,iBAAK,MAAMb,IAAX,iFAAmBc,GAAnB,GAAwB;AAAA;;AACtB,4GAAId,IAAJ,kBAAqB;AACnB;AACD;AACF;AACF;AAPwB;AAQzB,eAAKsH,kBAAL;AACD;;AAEDC,4BAAoB9G,KAApB,EAA2B+G,WAA3B,EAAwCC,WAAxC,EAAqD;AAAA;;AACnD,gBAAMC,QAAQ,4GAAc,CAAd,GAAkB,CAAC,CAAjC;;AAEA,eAAK,MAAM5G,GAAX,6EAAkB,KAAKD,KAAL,EAAlB,GAAgC;AAAA;;AAC9B,iBAAK,MAAMb,IAAX,iFAAmBc,GAAnB,GAAwB;AAAA;;AACtB,4GAAId,IAAJ,kBAAqB;AAAA;;AACnB,sBAAM2H,wGAAgB,KAAKC,oBAAL,sGAA0B5H,IAA1B,4GAAgDS,KAAhD,gGAAuD+G,WAAvD,gGAAoEC,WAApE,EAAhB,CAAN;AADmB;AAEnB,qBAAKP,iBAAL,gFAAuBlH,IAAvB,oGAA6B2H,aAA7B;AACD;AACF;AACF;AAVkD;AAWnD,eAAKL,kBAAL;AACD;;AAEDM,6BAAqBC,IAArB,EAA2BpH,KAA3B,EAAkC+G,WAAlC,EAA+CC,WAA/C,EAA4D;AAAA;;AAC1D,2FAAO,qFAAKK,OAAL,yGAAa/I,WAAb,0BAA6C,CAACgJ,GAAD,EAAMC,kBAAN,EAA0BzH,MAA1B,EAAkCO,GAAlC,KAA0C;AAAA;;AAC5F,4GAAG0G,WAAH,EAAgB;AAAA;;AACd,kBAAItG,6FAAc,KAAKA,WAAL,oFAAiBX,MAAjB,EAAd,CAAJ;AACA,kBAAG,4GAAc,CAAd,qFAAmBE,KAAnB,CAAH,EAA6B;AAC3B,gHAAGgH,WAAH,EAAgB;AACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD,iBAFD,MAEO;AACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD;AACF;AACDlH,6GAAS,KAAK0H,kBAAL,8FAAwB/G,WAAxB,EAAT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD,aAVD,MAUO;AACLJ,oBAAM,8EAACA,GAAD,CAAN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,kBAAG,oFAAM,CAAN,qFAAWL,KAAX,CAAH,EAAqB;AACnB,gHAAGgH,WAAH,EAAgB;AACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD,iBAFD,MAEO;AACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD;AACF;AACF;AACD,mBAAO,oNAAmBlH,MAAnB,iFAA0BO,GAA1B,CAAP;AACD,WAtBM,CAAP;AAuBD;;AAEDqG,qCAA6BU,IAA7B,EAAmCK,YAAnC,EAAiDC,SAAjD,EAA4D;AAAA;AAAA;;AAC1D,sFAAQC,GAAR,gGAAYF,YAAZ,4FAA0BC,SAA1B;AACA,2FAAO,qFAAKL,OAAL,yGAAa/I,WAAb,0BAA6C,CAACgJ,GAAD,EAAMC,kBAAN,EAA0BzH,MAA1B,EAAkCO,GAAlC,KAA0C;AAAA;;AAC5F,gBAAG,mIAAuB,GAA1B,EAA+B;AAAA;;AAC7B,kBAAII,6FAAc,KAAKA,WAAL,oFAAiBX,MAAjB,EAAd,CAAJ;AACAW,4HAAegH,YAAf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA3H,6GAAS,KAAK0H,kBAAL,8FAAwB/G,WAAxB,EAAT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAEAJ,oBAAM,8EAACA,GAAD,CAAN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACAA,8GAAOqH,SAAP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD;AACD,mBAAO,oNAAmB5H,MAAnB,iFAA0BO,GAA1B,CAAP;AACD,WAVM,CAAP;AAWD;;AAEDgE,uBAAerE,KAAf,EAAsB;AAAA;AAAA;;AACpB,eAAK4G,wBAAL;AACA,0GAAKxG,KAAL,iBAAqBwH,aAAa;AAAA;;AAChC,gBAAIC,8GAAUD,SAAV,oFAAoB5H,KAApB,EAAJ;AACA,gBAAIiD,kHAAU,8EAASzE,aAAT,iGAAuBqJ,OAAvB,cAAV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAJ;AACA,gQAAmC5E,OAAnC,wFAA4C4E,OAA5C;AACA,+PAAsBA,OAAtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD,WALD;AAFoB;AAQpB,eAAKf,mBAAL,kFAAyB9G,KAAzB,GAAgC,IAAhC,EAAsC,IAAtC;AACD;;AAEDsE,uBAAetE,KAAf,EAAsB;AAAA;AAAA;;AACpB,eAAK4G,wBAAL;AACA,0GAAKxG,KAAL,iBAAqBwH,aAAa;AAAA;;AAChC,gBAAIC,8GAAUD,SAAV,oFAAoB5H,KAApB,EAAJ;AADgC;AAEhC,0GAAQ8H,MAAR;AACD,WAHD;AAFoB;AAMpB,eAAKhB,mBAAL,kFAAyB9G,KAAzB,GAAgC,IAAhC,EAAsC,KAAtC;AACD;;AAEDgF,kBAAU+C,iBAAiBC,OAAOvI,aAAP,EAA3B,EAAmD;AAAA;;AACjD,cAAI,uHAAmB,IAAvB;AAA6B,mBAAO,IAAP;AAA7B,WACA,IAAI,oGAACsI,cAAD,CAAJ;AAAqB,mBAAO,KAAP;AAArB,WACA,mFAAO,KAAK/C,SAAL,CAAe,iQAAgC+C,cAAhC,gBAAf,CAAP;AACD;;AAEDxD,oBAAYvE,KAAZ,EAAmB;AAAA;AAAA;;AACjB,eAAK4G,wBAAL;AACA,cAAIqB,4FAAS,KAAKtI,IAAL,EAAT,oFAAqBK,KAArB,EAAJ;AACA,cAAIkI,iHAAS,8EAAS1J,aAAT,CAAuB,IAAvB,CAAT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAJ;AACA,4NAAmByJ,MAAnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,6MAAOpI,gBAAP,CAAwB,OAAxB,gBAAyCS;AAAA;AAAM,6HAAiB,EAAjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAN,WAAzC;AACA,yPAAkC4H,MAAlC,sFAA0CD,MAA1C;AANiB;AAOjB,eAAKnB,mBAAL,kFAAyB9G,KAAzB,GAAgC,KAAhC,EAAuC,IAAvC;AACA,mGAAOkI,MAAP;AACD;;AAED1D,oBAAYxE,KAAZ,EAAmB;AAAA;AAAA;;AACjB,eAAK4G,wBAAL;AACA,cAAIqB,4FAAS,KAAKtI,IAAL,EAAT,oFAAqBK,KAArB,EAAJ;AAFiB;AAGjB,qGAAO8H,MAAP;AAHiB;AAIjB,eAAKjB,kBAAL;AAJiB;AAKjB,eAAKC,mBAAL,kFAAyB9G,KAAzB,GAAgC,KAAhC,EAAuC,KAAvC;AACD;;AAED;;AAEAiB,kBAAU;AACR,4GAAO,wEAAMrB,IAAN,qFAAW,KAAKC,gBAAL,CAAsB,IAAtB,CAAX,EAAP,WAAmDsI,SAAS;AAAA;;AAC1D,8GAAO,wEAAMvI,IAAN,sFAAW,wFAAMC,gBAAN,CAAuB,OAAvB,CAAX,EAAP,WAAuDuI;AAAA;AAAU;AAAV,aAAvD;AACD,WAFD;AAGD;;AAEDC,gBAAQ;AACN,gIAAO,KAAKpH,OAAL,EAAP,WAA0BkH;AAAA;AAAS,mLAAMG,IAAN,CAAW,IAAX;AAAT,WAA1B,aAA0D,IAA1D;AACD;;AAEDC,gBAAQ;AAAA;;AACN,cAAIC,iFAAM,KAAKvH,OAAL,EAAN,CAAJ;AACA,cAAIwH,iGAASD,GAAT,GAAa,CAAb,CAAJ;AACA,2GAAO,kFAAIE,KAAJ,CAAU,CAAV,CAAP,WAAwBrI,OAAO;AAAA;;AAC7B,gBAAIsI,MAAM,EAAV;AAD6B;AAE7B,8FAAIC,OAAJ,CAAY,CAACtI,EAAD,EAAKN,KAAL,KAAe;AAAA;;AACzB,kBAAI6I,qGAAOJ,MAAP,oFAAczI,KAAd,EAAJ;AACA,2LAAI6I,IAAJ,8EAAYvI,EAAZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD,aAHD;AAIA,+FAAOqI,GAAP;AACD,WAPD;AAQD;;AAEDG,0BAAkB;AAChB,4FAAO,KAAKC,QAAL,YAAc,IAAd,gBAAP;AACD;;AAEDA,iBAAS1I,GAAT,EAAc;AAAA;;AACZ,cAAI2I,yGAAe,wEAAMpJ,IAAN,oFAAW,kFAAIC,gBAAJ,CAAqB,IAArB,CAAX,EAAf,WAA0DS;AAAA;AAAM;AAAN,WAA1D,EAAJ;AACA,cAAI2I,MAAM,EAAV;AACA,cAAI/I,qFAAU,KAAKA,OAAL,EAAV,CAAJ;AACA,eAAI,IAAIsD,CAAR,wFAAatD,OAAb,EAAsB;AACpB,0MAAIA,OAAJ,4EAAYsD,CAAZ,4GAAkBwF,WAAlB,4EAA8BxF,CAA9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD;AACD,6FAAOyF,GAAP;AACD;;AAED;AACAC,qBAAaC,KAAb,EAAoB;AAAA;;AAClB,2FAAO,wFAAMC,MAAN,CAAa,CAACC,GAAD,EAAM/I,EAAN;AAAA;AAAa,+JAAKoC,GAAL,8EAAS2G,GAAT,yFAAc/I,EAAd;AAAb,WAAb,EAAoD,CAApD,CAAP;AACD;;AAEDgJ,0BAAkBH,KAAlB,EAAyB;AAAA;;AACvB,cAAII,6FAAa,KAAKL,YAAL,kFAAkBC,KAAlB,EAAb,CAAJ;AACA,wCAAiB,sGAAY,wFAAM9H,GAAN,CAAU,CAAChB,GAAD,EAAMK,QAAN,KAAmB;AAAA;;AACxD,gBAAI8I,OAAO,EAAX;AACA,iBAAK,IAAIhG,IAAI,CAAb,EAAgBA,IAAI+F,UAApB,EAAgC/F,GAAhC,EAAqC;AACnC,kBAAIlD,KAAK,uKAAIkD,CAAJ,4EAAWrD,SAAX,4FAAuBE,GAAvB,4EAA2BmD,CAA3B,KAAgC,EAAzC;AACAgG,sBAAQ,oGAAY,CAAZ,GAAgB;AACvB,yCAAD,2EAA2BlJ,EAA3B,CAA8B,OADtB,GACgC,OAAD,2EAAOA,EAAP,CAAU,OADjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAED;AACD,mBAAO,wFAASkJ,IAAT,IAAgB,OAAvB;AACD,WAR4B,CAAZ,YAQT,IARS,KAQD,UARhB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAFuB;AAWvB,eAAK3C,kBAAL;AACD;;AAED4C,yBAAiBC,KAAjB,EAAwBC,MAAxB,EAAgC;AAAA;;AAC9B,cAAI5G,QAAQ,WAAZ;AACA,eAAK,IAAIjD,SAAS,CAAlB,EAAqBA,SAAS4J,KAA9B,EAAqC5J,QAArC,EAA+C;AAC7C,gBAAI0J,OAAO,EAAX;AACA,iBAAK,IAAInJ,MAAM,CAAf,EAAkBA,MAAMsJ,MAAxB,EAAgCtJ,KAAhC,EAAuC;AACrCmJ,sBAAQ,+CAAR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD;AACDzG,qBAAS,yFAASyG,IAAT,IAAgB,SAAzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD;AACDzG,mBAAS,UAAT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,kIAAkBA,KAAlB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAV8B;AAW9B,eAAK8D,kBAAL;AACD;;AAED+C,qBAAaT,KAAb,EAAoBU,KAApB,EAA2B;AAAA;;AACzB,cAAI,kFAAC,KAAKC,aAAL,CAAmB,OAAnB,CAAD,uFAAgCD,KAAhC,CAAJ,EAA2C;AAAA;;AACzC,iBAAKP,iBAAL,mFAAuBH,KAAvB;AACD,WAFD,MAEO;AACL,gBAAII,6FAAa,KAAKL,YAAL,mFAAkBC,KAAlB,EAAb,CAAJ;AACA,6HAAKxJ,IAAL,gBAAmB,CAACW,EAAD,EAAKN,KAAL;AAAA;AAAe,8MAASmJ,KAAT;AAAf,aAAnB,gBAAiE7I;AAAA;AAAM,4KAAGwH,MAAH;AAAN,aAAjE;AACA,4GAAK1H,KAAL,iBAAqBC,OAAO;AAAA;;AAC1B,4LAAI0J,MAAJ,CAAW,CAACxK,IAAD,EAAOS,KAAP,KAAiB;AAAA;;AAC1B,uBAAO,wLAASuJ,UAAT,CAAP;AACD,eAFD,gBAEWjJ;AAAA;AAAM,8KAAGwH,MAAH;AAAN,eAFX;AAGD,aAJD;AAKA,uHAAKjI,gBAAL,CAAsB,OAAtB,gBAAuCS;AAAA;AAAM,gIAAiB,EAAjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAN,aAAvC;AARK;AASL,iBAAK0J,cAAL,mFAAoBb,KAApB,GAA2B,CAA3B,EAA8B,CAA9B;AACD;AACF;;AAEDa,uBAAeb,KAAf,EAAsB1B,YAAtB,EAAoCC,SAApC,EAA+C;AAAA;;AAC7C,cAAItH,iFAAQ,KAAKA,KAAL,EAAR,CAAJ;AACA,cAAIqI,sGAASrI,KAAT,GAAe,CAAf,CAAJ;AACA,cAAI6J,cAAc,wNAAed,KAAf,GAAqB,CAArB,YAAlB;AACA;AACA,cAAI,4MAAcV,MAAd,YAAJ,EAAiC;AAC/B,gBAAI9I,+EAAO,KAAKA;AAChB;AADW,cAAP,CAAJ,CAD+B;AAG5B,kGAAKiJ,OAAL,CAAa,CAACvI,GAAD,EAAML,KAAN,KAAgB;AAAA;;AAC9B,mBAAK,IAAIwD,IAAI,CAAb,EAAgBA,IAAIyG,cAAcxB,OAAO/E,MAAzC,EAAiDF,GAAjD,EAAsD;AACpD,oBAAIjE,+GAAO,8EAASf,aAAT,CAAuB,IAAvB,CAAP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAJ;AADoD;AAEpD,mGAAI0L,WAAJ,iFAAgB3K,IAAhB;AACD;AACF;AACD;AANG,cAODa,iFAAQ,KAAKA,KAAL,EAAR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACFqI,kHAASrI,KAAT,GAAe,CAAf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD;AACD,eAAK,IAAIoD,IAAI,CAAb,EAAgBA,IAAI2F,MAAMzF,MAA1B,EAAkCF,GAAlC,EAAuC;AACrC,gBAAInD,mGAAMD,KAAN,GAAY,iLAAYoD,CAAZ,CAAZ,CAAJ;AACA,gBAAI,+EAACnD,GAAD,CAAJ,EAAU;AACR,kBAAI8J,qHAAa,8EAAS3L,aAAT,CAAuB,IAAvB,CAAb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAJ;AACA,0OAAuB,4FAAO6C,GAAP,CAAWf;AAAM;AAAN,eAAX,CAAvB,YAA0D,EAA1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,sHAAKwJ,aAAL,CAAmB,OAAnB,gHAAwCK,UAAxC;AACA,kBAAI9J,gGAAM,wGAAWR,gBAAX,CAA4B,IAA5B,CAAN,CAAJ;AAJQ;AAKR,uGAAMuK,IAAN,+EAAW/J,GAAX;AACD;AACD,gBAAIgK,uGAAUlB,KAAV,6EAAgB3F,CAAhB,EAAJ;AACA,iBAAK,IAAI8G,IAAI,CAAb,EAAgBA,IAAID,QAAQ3G,MAA5B,EAAoC4G,GAApC,EAAyC;AACvC,kBAAItK,QAAQ,0LAAesK,CAAf,CAAZ;AACA,kBAAI/K,gGAAOc,GAAP,qFAAWL,KAAX,EAAJ;AACA,kBAAI,iFAACT,IAAD,CAAJ;AAAW,sBAAM,qEAAIgL,KAAJ,EAAU,kGAAgBvK,KAAhB,IAAwB,OAAxB,iFAAkCK,GAAlC,CAAV,CAAN;AAAX,eACA,kNAAmBgK,OAAnB,6EAA2BC,CAA3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD;AACF;AAlC4C;AAmC7C,eAAKzD,kBAAL;AACD;;AAED;AACA2D,sBAAcC,GAAd,EAAmBC,YAAY,QAA/B,EAAyC;AAAA;;AACvC,2GAAO,mFAAIC,KAAJ,CAAU,IAAV,CAAP,WAA2BC,QAAQ;AAAA;;AACjC,8GAAO,sFAAKD,KAAL,2FAAWD,SAAX,EAAP,WAAiCpK,MAAM;AAAA;;AACrC,kBAAIuK,2EAAI,gFAAGC,KAAH,CAAS,UAAT,CAAJ,CAAJ;AACA,2FAAID,CAAJ,EAAO;AACL,4GAAOA,CAAP,GAAS,CAAT;AACD,eAFD,MAEO;AACL,kGAAOvK,EAAP;AACD;AACF,aAPD;AAQD,WATD;AAUD;;AAEDyK,mBAAWN,GAAX,EAAgBC,SAAhB,EAA2B;AAAA;AAAA;;AACzB,eAAKd,YAAL,kFAAkB,KAAKY,aAAL,+EAAmBC,GAAnB,6FAAwBC,SAAxB,EAAlB;AACD;;AAED/D,qBAAa8D,GAAb,EAAkB3K,MAAlB,EAA0BO,GAA1B,EAA+BqK,SAA/B,EAA0C;AAAA;AAAA;;AACxC,eAAKV,cAAL,kFAAoB,KAAKQ,aAAL,+EAAmBC,GAAnB,6FAAwBC,SAAxB,EAApB,uFAAwD5K,MAAxD,iFAAgEO,GAAhE;AACD;;AAED;;;;AAIA2K,mBAAW/B,GAAX,EAAgBgC,QAAQ,KAAxB,EAA+B;AAAA;;AAC7B,cAAI,+EAAChC,GAAD,CAAJ;AAAU;AAAV,WACA,IAAI/I,UAAU,EAAd;AACA,cAAIP,6EAAO,mFAAI0B,GAAJ,CAAQsH,OAAO;AAAA;;AACxBA,kBAAM,sFAAO,EAAb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA,kLAAOuC,IAAP,+EAAYvC,GAAZ,iBAAyBwC,OAAO;AAAA;;AAC9B,kBAAI,6KAAQ/J,OAAR,+EAAgB+J,GAAhB,MAAuB,CAA3B,EAA8B;AAAA;;AAC5B,+GAAQf,IAAR,+EAAae,GAAb;AACD;AACF,aAJD;AAKA,4FAAO,+FAAQ9J,GAAR,CAAY8J,OAAO;AAAA;;AACxB,8GAAOxC,GAAP,iFAAWwC,GAAX;AACD,aAFM,CAAP;AAGD,WAXU,CAAP,CAAJ;AAH6B;AAe7B,gGAAKC,OAAL,uFAAalL,OAAb;AACA,+FAAI+K,KAAJ,EAAW;AAAA;;AACT,iBAAK3B,iBAAL,iFAAuB3J,IAAvB;AACD,WAFD,MAEO;AAAA;;AACL,iBAAKiK,YAAL,iFAAkBjK,IAAlB,GADK,CACoB;AAC1B;AACF;;AAED;AACA0L,+BAAuB;AAAA;;AACrB,cAAIC,uFAAM,0GAAY/M,MAAZ,EAAN,CAAJ;AADqB;AAErB,6FAAIqL,YAAJ,0FAAiB,0EAAE2B,MAAF,yEAAS,0EAAEC,OAAF,YAAU,IAAV,oBAA8BlL;AAAA;AAAM,oGAAKM,SAAL,6EAAeN,EAAf;AAAN,WAA9B,CAAT,EAAjB,WAAuFD;AAAA;AAAO,sLAAEoL,MAAF,+EAASpL,GAAT,GAAcC;AAAA;AAAM,yGAAKK,YAAL,6EAAkBL,EAAlB;AAAN,aAAd,YAA+CA;AAAA;AAAM;AAAN,aAA/C;AAAP,WAAvF;AACA,8FAAOgL,GAAP;AACD;;AAEDjF,4BAAoB;AAClB,2HAAO,KAAKgF,oBAAL,EAAP;AACD;;AAEDK,4BAAoB;AAAA;;AAClB,cAAI,YAAC,IAAD,kBAAJ;AAAyB,mBAAO,EAAP;AAAzB,WAEA,IAAIC,SAAS,EAAb;;AAEA,2EAA2BC,QAAQ;AAAA;;AACjC,gBAAIvL,mFAAM,KAAKO,SAAL,iFAAegL,IAAf,EAAN,CAAJ;AACA,gBAAIT,oFAAM,KAAKnK,UAAL,iFAAgB4K,IAAhB,EAAN,CAAJ;AACA,gBAAI,gGAACD,MAAD,iFAAQtL,GAAR,EAAJ;AAAkB,oMAAOA,GAAP,GAAc,EAAd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAlB,aACA,iMAAOA,GAAP,kFAAY8K,GAAZ,8FAAmBS,IAAnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD,WALD;;AAOA,oGAAOD,MAAP;AACD;;AAED;;AAEAE,sBAAcC,KAAd,EAAqB;AAAA;AAAA;;AACnB,eAAKlK,cAAL;AACA,cAAImK,sFAAY,KAAKvL,MAAL,8FAAYsL,KAAZ,sHAAqCA,KAArC,sBAAZ,CAAJ;AACA,uGAAIC,SAAJ;AAAA;AAAe,iBAAK7K,UAAL,2FAAgB6K,SAAhB;AAAf;AACD;;AAED;AACAC,wBAAgB;AAAA;;AACd;AACA,eAAKvC,gBAAL,CAAsB,EAAtB,EAA0B,EAA1B;AACD;;AAED;AACAwC,qBAAa1M,IAAb,EAAmB;AAAA;;AACjB,cAAI,iFAACA,IAAD,CAAJ;AAAW,uFAAOY,SAAP;AAAX,WACA,IAAI,mHAAmB,yHAACZ,IAAD,kDAAvB,EAAiE;AAC/D,2IAAOA,IAAP;AACD;AACD,cAAI2M,iGAAM3M,IAAN,iBAAJ;AACA,cAAI,oHAAqBA,IAArB,CAAJ,EAA+B;AAC7B2M,6BAAM,IAAN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD;AACD,iBAAO,wEAAM,+EAACA,GAAD,CAAN,kFAAcA,GAAd,IAAoB,+EAACA,GAAD,CAA3B;AACD;;AAEDrF,6BAAqB;AACnB,eAAK,MAAMsF,EAAX,IAAiB,iDAAkC,EAAnD,EAAuD;AAAA;AAAA;;AACrD,4FAAGC,OAAH;AACD;AACD,wDAAiC,EAAjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,gBAAMhM,iFAAQ,KAAKA,KAAL,EAAR,CAAN;AACA,eAAK,MAAMC,GAAX,6EAAkB,KAAKD,KAAL,EAAlB,GAAgC;AAAA;;AAC9B,iBAAK,MAAMb,IAAX,kFAAmBc,GAAnB,GAAwB;AAAA;AAAA;;AACtB,mBAAKgM,8BAAL,iFAAoC9M,IAApC;AACD;AACF;AACF;;AAED8M,uCAA+B9M,IAA/B,EAAqC;AAAA;;AACnC,gBAAM+M,+BAAa,sFAAM;AAAM,wHAAS,IAAT;AAAN,WAAN,CAAb,eAA6DC;AAAA;AAAY,4GAAKC,iBAAL,iFAAuBjN,IAAvB,2FAA6BgN,QAA7B;AAAZ,WAA7D,EAAN;AACA,gLAAoCD,UAApC;AACD;;AAEDE,0BAAkBjN,IAAlB,EAAwBgN,QAAxB,EAAkC;AAAA;;AAChC,gBAAME,kGAAOlN,IAAP,iBAAN;AACA,qGAAIgN,QAAJ,EAAc;AAAA;;AACZ,kBAAMD,wGAAa/M,IAAb,gBAAN;AACA,2GAAI+M,UAAJ,EAAgB;AACd,kBAAG,0HAACA,UAAD,mCAAH,EAAwC;AACtC,8KAAwBA,UAAxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACD;AACD,sOAAmBA,UAAnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD,aAND,MAMO;AACL,8IAAwB/M,IAAxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD;AACD,0GAAOA,IAAP;AACD,WAZD,MAYO;AAAA;;AACL,iBAAKkH,iBAAL,iFAAuBlH,IAAvB,mFAA6BkN,IAA7B;AACD;AACF;;AAEDhG,0BAAkBlH,IAAlB,EAAwBkN,IAAxB,EAA8B;AAAA;AAAA;;AAC5B,gGAAKzI,eAAL,CAAqB,SAArB;;AAEA,cAAI,kGAAK,CAAL,MAAY,GAAhB,EAAqB;AACnB,gBAAI,kGAAK,CAAL,MAAY,GAAhB,EAAqB;AAAA;;AACnB,kBAAIoD,oFAAO,sFAAKsF,SAAL,CAAe,CAAf,6FAAkBD,IAAlB,aAAP,CAAJ;AACA,oBAAME,4FAAQ,KAAKC,gBAAL,iFAAsBxF,IAAtB,EAAR,CAAN;AACA,iNAAmBuF,KAAnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAAME,qBAAqB,EAAEC,iBAAiB,MAAM;AAChD,0GAAOH,KAAP;AACD,iBAFwB,EAEtBP,SAAS,MAAM,CAAE,CAFK,EAEHW,YAAY,MAAM;AAAC,yBAAO,KAAP;AAAa,iBAF7B,EAA3B;AAGA,8HAAkB,EAAET,YAAYO,kBAAd,EAAkCJ,IAAlC,EAAlB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD,aARD,MAQO;AAAA;AAAA;;AACL,oGAAK5N,YAAL,CAAkB,SAAlB,EAA6B,QAA7B;AACA,kBAAIuI,oFAAO,sFAAKsF,SAAL,CAAe,CAAf,6FAAkBD,IAAlB,aAAP,CAAJ;AACA,oBAAM,CAACO,cAAD,EAAiBC,YAAjB,6EAAiC,sFAAKtC,KAAL,CAAW,GAAX,CAAjC,CAAN;;AAEA,kBAAI2B,+BAAa,sFAAM;AAAM,+GAAKM,gBAAL,qGAAsBI,cAAtB;AAAN,eAAN,CAAb,eAAyEE;AAAA;AAAY,gOAAmBA,QAAnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAZ,eAAzE,EAAJ;AACA,iHAAID,YAAJ,EAAkB;AAAA;;AAChB,wHAAWE,QAAX,CAAoBR,SAAS;AAC3BS,uHAAKH,YAAL;AACD,iBAFD;AAGD;AACD,oBAAM,EAAEN,KAAF,EAASU,OAAT,qGAAqB,wGAAWC,sBAAX,EAArB,CAAN;AACA,uGAAID,OAAJ,EAAa;AACX,iIAAmB,qBAAnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AADW;AAEX,wHAAWjB,OAAX;AACD,eAHD,MAGO;AACL,mNAAmBO,KAAnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD;AACD,8HAAkB,EAAEL,UAAF,EAAcG,IAAd,EAAlB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD;AACF;AACF;;AAED,mBAAWc,kBAAX,GAAgC;AAC9B,iBAAO;AAAP;AACD;;AAGDX,yBAAiBxF,IAAjB,EAAuB;AAAA;;AACrB,cAAIoG,SAAS,EAAb;AACA,iBAAOJ,gFAAK,sFAAK/F,OAAL,yGAAa/I,WAAb,0BAA6C,CAACgJ,GAAD,EAAMC,kBAAN,EAA0BzH,MAA1B,EAAkCO,GAAlC,KAA0C;AAAA;;AACjG,kMAAOiH,GAAP,mFAAc,KAAK2E,YAAL,iFAAkB,KAAKwB,YAAL,qFAAkB3N,MAAlB,iFAA0BO,GAA1B,EAAlB,EAAd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAO,4FAAciH,GAAd,IAAoB,KAA3B;AACD,WAHW,CAAL,EAAP;AAID;;AAED;;;;;AAKAmG,qBAAa3N,MAAb,EAAqBY,QAArB,EAA+B;AAAA;;AAC7B,0FAAO,KAAKF,MAAL,gFAAY,KAAKC,WAAL,qFAAiBX,MAAjB,EAAZ,GAAsC,oGAAW,CAAjD,CAAP;AACD;;AAEDW,oBAAYX,MAAZ,EAAoB;AAAA;;AAClB,cAAI4N,qFAAI,4FAAOC,WAAP,EAAJ,CAAJ;AACA,cAAIlN,cAAc,CAAlB;AACA,iBAAO,qGAAW,CAAlB,EAAqB;AACnBA,2BAAe,EAAf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACAA,2BAAe,wJAAEmN,UAAF,CAAa,CAAb,KAAkB,EAAjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACAF,0FAAI,6EAAEhB,SAAF,CAAY,CAAZ,uFAAegB,CAAf,aAAJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD;AACD,iBAAO,6GAAc,CAArB;AACD;;AAEDlG,2BAAmB/G,WAAnB,EAAgC;AAAA;;AAC9B,cAAIX,SAAS,EAAb;AACA,iBAAO,8GAAe,EAAtB,EAA0B;AACxBA,qBAAS,4JAAO+N,YAAP,CAAoB,KAAK,6GAAc,EAAvC,yFAA6C/N,MAA7C,CAAT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACAW,2BAAe,EAAf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACAA,mGAAc,sEAAKqN,KAAL,+FAAWrN,WAAX,EAAd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD;AACDX,mBAAS,4JAAO+N,YAAP,CAAoB,KAAK,6GAAc,EAAvC,yFAA6C/N,MAA7C,CAAT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oGAAOA,MAAP;AACD;AAt/B4C;;yBAA1BxB,W;;;;;;;;;;6BAAAA,iL","file":"lively-table.js","sourcesContent":["\"enable aexpr\";\n\nimport Morph from 'src/components/widgets/lively-morph.js';\nimport ContextMenu from 'src/client/contextmenu.js';\nimport DragBehavior from \"src/client/morphic/dragbehavior.js\";\nimport aexpr from 'active-expression-rewriting';\nimport _ from 'src/external/lodash/lodash.js';\n\nexport default class LivelyTable extends Morph {\n\n  static create() {\n    // return Object.create(LivelyTable.prototype, {})\n    return document.createElement(\"lively-table\");\n  }\n\n  initialize() {\n    this.addEventListener(\"click\", evt => this.onClick(evt));\n    this.setAttribute(\"tabindex\", 0);\n    lively.html.registerKeys(this, \"Table\");\n    this.addEventListener(\"mousedown\", evt => this.onMouseDown(evt));\n    \n    this.addEventListener(\"copy\", evt => this.onCopy(evt));\n    this.addEventListener(\"cut\", evt => this.onCut(evt));\n    this.addEventListener(\"paste\", evt => this.onPaste(evt));\n\n    this.addEventListener(\"focus\", evt => this.onFocus(evt));\n    this.addEventListener(\"focusout\", evt => this.onFocusout(evt));\n\n    this.addEventListener(\"extent-changed\", evt => this.onExtentChanged(evt));\n    this.addEventListener('contextmenu', evt => this.onContextMenu(evt), false);\n\n    this.activityChangeExpressions = [];\n  }\n\n  /*MD ## Rows, Columns, Cells MD*/\n\n  isCell(cell) {\n    return cell.tagName == \"TD\" || cell.tagName == \"TH\";\n  }  \n  \n  isEditingCells() {\n    var activeElement = lively.activeElement()\n    return activeElement && activeElement.contentEditable && lively.allParents(activeElement, [], true).includes(this)\n  }\n\n  rows() {\n    return Array.from(this.querySelectorAll(\"tr\"));\n  }\n\n  column(indexOrLabel) {\n    var index;\n    if (Number.isInteger(indexOrLabel)) {\n      index = indexOrLabel;\n    } else {\n      index = this.headers().indexOf(indexOrLabel);\n      if (index == -1) return undefined;\n    }\n    return this.cells().map(row => row[index]);\n  }\n\n  cells() {\n    return this.rows().map(ea => this.cellsIn(ea));\n  }\n\n  cellsIn(row) {\n    return Array.from(row.querySelectorAll(\"td,th\"));\n  }\n\n  cellAt(columnIndex, rowIndex) {\n    var row = this.rows()[rowIndex];\n    if (!row) return undefined;\n    return row.querySelectorAll(\"td,th\")[columnIndex];\n  }\n\n  columnOfCell(cell) {\n    return this.cellsIn(cell.parentElement).indexOf(cell);\n  }\n\n  rowOfCell(cell) {\n    var row = cell.parentElement;\n    return this.rows().indexOf(row);\n  }\n\n  // #private\n  initailizeCells(element) {\n    let rows = this.rows(),\n        row = element.parentElement,\n        rowCells = this.cellsIn(row);\n    return {\n      rows,\n      row,\n      rowCells\n    };\n  }\n\n  keyForCell(cell) {\n    return this.cells()[0][this.columnOfCell(cell)].textContent;\n  }\n\n  headers() {\n    return this.asArray()[0];\n  }\n  /*MD ## Selection MD*/\n\n  selectCell(element, multipleSelection) {\n    if (!this.isCell(element)) return;\n    if (this.currentCell && this.currentCell != element) {\n      this.currentCell.contentEditable = false;\n      if (!multipleSelection) this.currentCell.classList.remove(\"table-selected\");\n    }\n    if (!element.parentElement) return; // cell must be one of mine\n\n    this.currentCell = element;\n    const {\n      rows,\n      row,\n      rowCells\n    } = this.initailizeCells(element);\n\n    if (this.currentRow) {\n      this.currentRow.classList.remove('current');\n    }\n    this.currentRow = row;\n    this.currentRow.classList.add('current');\n\n    this.currentRowIndex = rows.indexOf(row);\n    this.currentColumnIndex = rowCells.indexOf(element);\n    this.currentColumn = rows.map(ea => ea[this.currentColumnIndex]);\n\n    this.selectCellPrivate(multipleSelection, rows, row, rowCells, element);\n\n    this.dispatchEvent(new CustomEvent(\"cell-selected\"));\n  }\n\n  // #private\n  selectCellPrivate(multipleSelection, rows, row, rowCells, element) {\n    if (multipleSelection) {\n      this.addSelectedCell(this.currentCell);\n    } else {\n      if (this.selectedCells) this.selectedCells.forEach(ea => {\n        ea.classList.remove(\"start-selection\");\n        ea.classList.remove(\"table-selected\");\n      });\n      this.selectedCells = [this.currentCell];\n      this.currentCell.classList.add(\"table-selected\");\n      this.startCell = this.currentCell;\n      this.startRowIndex = rows.indexOf(row);\n      this.startColumnIndex = rowCells.indexOf(element);\n      this.startCell.classList.add(\"start-selection\");\n    }\n  }\n\n  selectRow(rowIndex, multiselection) {\n    if (!multiselection) {\n      this.clearSelection();\n    }\n    this.cells()[rowIndex].forEach(cell => {\n      this.selectCell(cell, true);\n    });\n  }\n\n  selectColumn(columnIndex, multiselection) {\n    if (!multiselection) {\n      this.clearSelection();\n    }\n    this.cells().forEach(row => {\n      this.selectCell(row[columnIndex], true);\n    });\n  }\n\n  changeSelection(columnDelta, rowDelta, removeSelection) {\n    let columnA = this.startColumnIndex,\n        columnB = this.currentColumnIndex + columnDelta,\n        rowA = this.startRowIndex,\n        rowB = this.currentRowIndex + rowDelta;\n    this.changeSelectionBetween(columnA, columnB, rowA, rowB, removeSelection);\n  }\n\n  changeSelectionBetween(columnA, columnB, rowA, rowB, removeSelection) {\n    var cells = this.cells(),\n        columnMin = Math.min(columnA, columnB),\n        columnMax = Math.max(columnA, columnB),\n        rowMin = Math.min(rowA, rowB),\n        rowMax = Math.max(rowA, rowB);\n\n    for (var rowIndex = rowMin; rowIndex <= rowMax; rowIndex++) {\n      var row = cells[rowIndex];\n\n      if (row) {\n        // lively.notify(\"change selection \" + columnMin + \" \" + columnMax)\n\n        for (var columnIndex = columnMin; columnIndex <= columnMax; columnIndex++) {\n          var cell = row[columnIndex];\n          // lively.showElement(cell)\n          if (cell) {\n            if (removeSelection) {\n              this.removeSelectedCell(cell);\n            } else {\n              this.addSelectedCell(cell);\n            }\n          }\n        }\n      }\n    }\n\n    this.dispatchEvent(new CustomEvent(\"selection-changed\", { detail: { table: this } }));\n  }\n\n  navigateRelative(columnDelta, rowDelta, multipleSelection) {\n    if (this.currentColumnIndex === undefined) return;\n    var cells = this.cells();\n    if (multipleSelection) {\n      this.changeSelection(-columnDelta, -rowDelta, true);\n\n      this.changeSelection(columnDelta, rowDelta);\n    }\n    var row = cells[this.currentRowIndex + rowDelta];\n    if (!row) return;\n    var newCell = row[this.currentColumnIndex + columnDelta];\n\n    if (newCell) {\n      this.selectCell(newCell, multipleSelection);\n    }\n  }\n\n  setTextSelectionOfCellContents(cell) {\n    var range = document.createRange();\n    var sel = window.getSelection();\n    try {\n      // #TODO find a more correct way to set selection.... \n      range.setStart(cell, 0);\n      // I have problems setting this to the end... so lets go as far as we can in small steps\n      for (var i = 0; i <= cell.textContent.length; i++) {\n        range.setStart(cell, i);\n      }\n    } catch (e) {\n      // do nothing..\n    }\n    range.collapse(true);\n    sel.removeAllRanges();\n    sel.addRange(range);\n  }\n\n  clearAllSelection() {\n    this.querySelectorAll(\"td\").forEach(ea => {\n      ea.classList.remove(\"editing\");\n      ea.removeAttribute(\"contentEditable\"\n      // ea.contentEditable = false\n\n      );\n    });\n  }\n\n  clearSelection(doNotClearStart) {\n    if (this.currentCell) {\n      this.currentCell.removeAttribute(\"contentEditable\");\n      this.currentCell.classList.remove(\"table-selected\");\n    }\n    if (!doNotClearStart) {\n      this.currentCell = undefined;\n      this.currentRow = undefined;\n      this.currentRowIndex = undefined;\n      this.currentColumnIndex = undefined;\n      this.currentColumn = undefined;\n      this.startCell = undefined;\n      this.startRowIndex = undefined;\n      this.startColumnIndex = undefined;\n    }\n\n    this.querySelectorAll(\"td,th\").forEach(ea => {\n      ea.classList.remove(\"table-selected\");\n      ea.classList.remove(\"start-selection\");\n    });\n\n    this.selectedCells = [];\n  }\n\n  addSelectedCell(element) {\n    if (!this.selectedCells) this.selectedCells = [];\n    if (this.selectedCells.indexOf(element) < 0) {\n      this.selectedCells.push(element);\n    }\n    element.classList.add(\"table-selected\");\n  }\n\n  removeSelectedCell(element) {\n    if (!this.selectedCells) this.selectedCells = [];\n    this.selectedCells.push(element);\n    this.selectedCells = this.selectedCells.filter(ea => ea !== element);\n    element.classList.remove(\"table-selected\");\n  }\n\n  /*MD ## Focus MD*/\n\n  onContextMenu(evt) {\n    if (!evt.shiftKey) {\n      evt.stopPropagation();\n      evt.preventDefault();\n      var menu = new ContextMenu(this, [[\"add column\", () => this.insertColumnAt(this.currentColumnIndex)], [\"remove column\", () => this.removeColumnAt(this.currentColumnIndex)], [\"add row\", () => this.insertRowAt(this.currentRowIndex)], [\"remove row\", () => this.removeRowAt(this.currentRowIndex)]]);\n      menu.openIn(document.body, evt, this);\n      return true;\n    }\n  }\n\n  onExtentChanged() {\n    var table = this.get(\"table\");\n    lively.setWidth(table, lively.getExtent(this).x);\n    lively.setHeight(this, lively.getExtent(table).y, true);\n  }\n\n  async onFocusout() {\n    // we are about to lose our focus lets wait a bit\n    await lively.sleep(0\n    // if we really lost our focus... \n    );if (!this.isInFocus()) {\n      this.classList.remove(\"active\");\n    }\n  }\n\n  onFocus() {\n    if (this.isInFocus()) {\n      this.classList.add(\"active\");\n    }\n  }\n\n  setFocusAndTextSelection(element) {\n    if (!element) return;\n    this.clearAllSelection();\n    // element.contentEditable = true;\n    element.focus();\n    var sel = window.getSelection();\n    // sel.selectAllChildren(element)    \n  }\n  /*MD ## Keyboard Events MD*/\n\n  // #important\n  onEnterDown(evt) {\n\n    if (!this.currentCell) return;\n    var cell = this.currentCell;\n    var wasEditing = this.isInEditing(cell);\n\n    if (wasEditing) {\n      this.currentCell.contentEditable = false;\n      this.focus();\n\n      this.stopEditingCurrentCell();\n    } else {\n      this.startEditingCurrentCell();\n    }\n\n    evt.stopPropagation();\n    evt.preventDefault();\n  }\n\n  onEscDown(evt) {\n    if (!this.currentCell) return;\n    this.setFocusAndTextSelection(this.currentCell);\n    evt.stopPropagation();\n    evt.preventDefault();\n  }\n\n  isInEditing(cell) {\n    return cell.classList.contains(\"editing\");\n  }\n\n  handleArrowKey(evt, deltaColumn, deltaRow) {\n    if (this.isInEditing(this.currentCell)) return;\n    this.navigateRelative(deltaColumn, deltaRow, evt.shiftKey == true);\n    this.setFocusAndTextSelection(this.currentCell);\n    evt.stopPropagation();\n    evt.preventDefault();\n  }\n\n  startEditingCurrentCell() {\n    if (!this.currentCell) return;\n    // lively.showElement(this.currentCell).style.outline = \"4px dashed green\"\n    this.currentCell.contentEditable = true;\n    this.currentCell.classList.add(\"editing\");\n    this.dispatchEvent(new CustomEvent(\"start-editing-cell\"));\n    this.currentCell.focus();\n  }\n\n  stopEditingCurrentCell() {\n    if (!this.currentCell) return;\n    // lively.showElement(this.currentCell).style.outline = \"4px dashed red\"\n    this.currentCell.contentEditable = false;\n    this.currentCell.classList.remove(\"editing\");\n    this.dispatchEvent(new CustomEvent(\"finish-editing-cell\"));\n  }\n  /*MD ## Events MD*/\n\n  onLeftDown(evt) {\n    this.handleArrowKey(evt, -1, 0);\n  }\n\n  onRightDown(evt) {\n    this.handleArrowKey(evt, 1, 0);\n  }\n\n  onUpDown(evt) {\n    this.handleArrowKey(evt, 0, -1);\n  }\n\n  onDownDown(evt) {\n    this.handleArrowKey(evt, 0, 1);\n  }\n\n  // #important\n  onMouseDown(evt) {\n    var cell = evt.composedPath()[0];\n    if (cell.localName != 'td') return; // clicked somewhere elese...\n\n    if (evt.ctrlKey) {\n      if (cell.localName == 'td') {\n        this.selectCell(cell, true)\n        return\n      }\n    }\n    \n    \n    if (cell === this.currentCell) {\n      if (this.isInEditing(this.currentCell)) {\n        return;\n      } else {\n        // edit only on second click into selection #TODO does not work any more... edit seems to be always on\n        this.startEditingCurrentCell();\n      }\n    } else {\n      if (this.currentCell && this.currentCell.classList.contains(\"editing\")) {\n        this.stopEditingCurrentCell();\n      }\n\n      this.focus();\n      this.selectCell(cell);\n      this.setFocusAndTextSelection(this.currentCell);\n    }\n    evt.stopPropagation();\n    evt.preventDefault();\n\n    if (cell !== this.currentCell) {\n      this.clearSelection(true);\n      this.selectCell(cell);\n    }\n\n    lively.addEventListener(\"LivelyTable\", document.body, \"mousemove\", evt => this.onMouseMoveSelection(evt));\n    lively.addEventListener(\"LivelyTable\", document.body, \"mouseup\", evt => this.onMouseUpSelection(evt));\n\n    evt.preventDefault();\n    evt.stopPropagation();\n  }\n\n  onMouseMoveSelection(evt) {\n    var cell = evt.composedPath()[0];\n    if (this.isCell(cell)) {\n      if (cell === this.currentCell) return;\n\n      this.clearSelection(true);\n\n      var column = this.columnOfCell(cell);\n      var row = this.rowOfCell(cell);\n\n      this.changeSelectionBetween(this.startColumnIndex, column, this.startRowIndex, row\n\n      // lively.notify(\"mouse move\")\n      );\n    }\n  }\n\n  //\n  // Mouse Events\n  //\n\n  onMouseUpSelection(evt) {\n    lively.removeEventListener(\"LivelyTable\", document.body, \"mousemove\");\n    lively.removeEventListener(\"LivelyTable\", document.body, \"mouseup\");\n\n    var cell = evt.composedPath()[0];\n    if (cell === this.currentCell) return;\n\n    this.setFocusAndTextSelection(this.currentCell\n    // var sel = window.getSelection();\n    // sel.removeAllRanges();\n    // var range = document.createRange();\n    // this.currentCell.focus()\n    // range.selectNodeContents(this.currentCell);  \n    // sel.addRange(range);\n    );\n  }\n\n  onClick(evt) {}\n\n  /*MD ## Copy and Paste MD*/\n\n  onCopy(evt) {\n    if (this.isEditingCells()) return\n    \n    // lively.notify(\"on copy\")\n\n    if (!this.currentCell) return;\n    if (this.selectedCells && this.selectedCells.length > 1) {\n      var data = this.getSelectionAsCSV\n      // lively.notify(\"data \" + data)\n      ();evt.clipboardData.setData('text/plain', data);\n    } else {\n      var selString = window.getSelection().toString();\n      if (selString.length > 0) {\n        evt.clipboardData.setData('text/plain', selString);\n      } else {\n        evt.clipboardData.setData('text/plain', this.currentCell.textContent);\n      }\n    }\n    evt.stopPropagation();\n    evt.preventDefault();\n  }\n\n  onCut(evt) {\n    if (this.isEditingCells()) return\n    \n    this.onCopy(evt);\n    if (this.selectedCells && this.selectedCells.length > 1) {\n      // lively.notify(\"cut \" + this.selectedCells.length)\n      this.selectedCells.forEach(ea => {\n        ea.textContent = \"\";\n      });\n    } else {\n      this.currentCell.textContent = \"\";\n    }\n  }\n\n  onPaste(evt) {    \n    if (this.isEditingCells()) return\n    \n    // lively.notify(\"on paste\")\n\n    if (!this.currentCell) return;\n\n    var cells;\n    if (this.selectedCells && this.selectedCells.length > 1) {\n      // lively.notify(\"cut \" + this.selectedCells.length)\n      cells = this.selectedCells;\n    } else {\n      cells = [this.currentCell];\n    }\n\n    var data = evt.clipboardData.getData('text/plain').trim();\n    \n    let baseRow = this.rowOfCell(cells[0]);\n    let baseColumn = this.columnOfCell(cells[0]);\n   \n    cells.map(cell => {\n      // cells will change so get them early... \n      return { column: this.columnOfCell(cell), row: this.rowOfCell(cell), cell};\n    }).forEach(({column, row, cell}) => {\n      if(data[0]==='=') {      \n        this.setCellExpression(cell, this.moveRelativeReferencesInCode(data, column - baseColumn, row - baseRow));\n      } else {\n        this.setFromCSVat(data, column, row);\n      }\n    });\n    \n    evt.stopPropagation();\n    evt.preventDefault();\n  }\n\n  /*MD ## Rows and Columns MD*/\n\n  deactivateAllExpressions() {\n    for (const row of this.cells()) {\n      for (const cell of row) {\n        if (cell.expression) {\n          cell.expression.expression.dispose();\n        }\n      }\n    }\n    this.registerOnAllCells();\n  }\n\n  moveReferencesAfter(index, moveColumns, isInsertion) {\n    const delta = isInsertion ? 1 : -1;\n\n    for (const row of this.cells()) {\n      for (const cell of row) {\n        if (cell.expression) {\n          const rewrittenCode = this.moveReferencesInCode(cell.expression.text, index, moveColumns, isInsertion);\n          this.setCellExpression(cell, rewrittenCode);\n        }\n      }\n    }\n    this.registerOnAllCells();\n  }\n  \n  moveReferencesInCode(code, index, moveColumns, isInsertion) {\n    return code.replace(LivelyTable.CellReferenceRegex, (ref, absoluteOrRelative, column, row) => {\n      if(moveColumns) {\n        let columnIndex = this.columnIndex(column);\n        if(columnIndex - 1 >= index) {\n          if(isInsertion) {\n            columnIndex++;\n          } else {\n            columnIndex--;\n          }\n        }\n        column = this.columnIndexToDigit(columnIndex);\n      } else {\n        row = +row;\n        if(row - 1 >= index) {\n          if(isInsertion) {\n            row++;\n          } else {\n            row--;\n          }\n        }\n      }\n      return absoluteOrRelative+column+row;\n    })\n  }\n  \n  moveRelativeReferencesInCode(code, columnOffset, rowOffset) {\n    console.log(columnOffset, rowOffset);\n    return code.replace(LivelyTable.CellReferenceRegex, (ref, absoluteOrRelative, column, row) => {\n      if(absoluteOrRelative === '~') {\n        let columnIndex = this.columnIndex(column);\n        columnIndex += columnOffset;\n        column = this.columnIndexToDigit(columnIndex);\n        \n        row = +row;\n        row += rowOffset;\n      }\n      return absoluteOrRelative+column+row;\n    })\n  }\n\n  insertColumnAt(index) {\n    this.deactivateAllExpressions();\n    this.cells().forEach(cellArray => {\n      var oldCell = cellArray[index];\n      var newCell = document.createElement(oldCell.tagName);\n      oldCell.parentElement.insertBefore(newCell, oldCell);\n      newCell.style.width = oldCell.style.width;\n    });\n    this.moveReferencesAfter(index, true, true);\n  }\n\n  removeColumnAt(index) {\n    this.deactivateAllExpressions();\n    this.cells().forEach(cellArray => {\n      var oldCell = cellArray[index];\n      oldCell.remove();\n    });\n    this.moveReferencesAfter(index, true, false);\n  }\n\n  isInFocus(focusedElement = lively.activeElement()) {\n    if (focusedElement === this) return true;\n    if (!focusedElement) return false;\n    return this.isInFocus(focusedElement.parentElement || focusedElement.parentNode);\n  }\n\n  insertRowAt(index) {\n    this.deactivateAllExpressions();\n    var oldRow = this.rows()[index];\n    var newRow = document.createElement(\"tr\");\n    newRow.innerHTML = oldRow.innerHTML;\n    newRow.querySelectorAll(\"th,td\").forEach(ea => ea.textContent = \"\");\n    oldRow.parentElement.insertBefore(newRow, oldRow);\n    this.moveReferencesAfter(index, false, true);\n    return newRow;\n  }\n\n  removeRowAt(index) {\n    this.deactivateAllExpressions();\n    var oldRow = this.rows()[index];\n    oldRow.remove();\n    this.registerOnAllCells();\n    this.moveReferencesAfter(index, false, false);\n  }\n\n  /*MD # Accessing Content MD*/\n\n  asArray() {\n    return Array.from(this.querySelectorAll(\"tr\")).map(eaRow => {\n      return Array.from(eaRow.querySelectorAll(\"td,th\")).map(eaCell => eaCell.textContent);\n    });\n  }\n\n  asCSV() {\n    return this.asArray().map(eaRow => eaRow.join(\"\\t\")).join(\"\\n\");\n  }\n\n  asJSO() {\n    var all = this.asArray();\n    var header = all[0];\n    return all.slice(1).map(row => {\n      var obj = {};\n      row.forEach((ea, index) => {\n        var name = header[index];\n        obj[name] = ea;\n      });\n      return obj;\n    });\n  }\n\n  currentRowToJSO() {\n    return this.rowToJSO(this.currentRow)\n  }\n  \n  rowToJSO(row) {\n    var rowContents =  Array.from(row.querySelectorAll(\"td\")).map(ea => ea.textContent)\n    var jso = {}\n    var headers = this.headers()\n    for(var i in headers) {\n      jso[headers[i]] = rowContents[i]\n    }\n    return jso\n  }\n  \n  // #private\n  maxColumnsIn(array) {\n    return array.reduce((sum, ea) => Math.max(sum, ea.length), 0);\n  }\n\n  setFromArrayClean(array) {\n    var maxColumns = this.maxColumnsIn(array);\n    this.innerHTML = \"<table>\" + array.map((row, rowIndex) => {\n      var html = \"\";\n      for (var i = 0; i < maxColumns; i++) {\n        var ea = row[i] !== undefined ? row[i] : \"\";\n        html += rowIndex == 0 ? // header \n        `<th style=\"width: 40px\">${ea}</th>` : `<td>${ea}</td>`;\n      }\n      return \"<tr>\" + html + \"</tr>\";\n    }).join(\"\\n\") + \"</table>\";\n    this.registerOnAllCells();\n  }\n\n  setEmptyWithSize(width, height) {\n    var table = \"<table>\\n\";\n    for (var column = 0; column < width; column++) {\n      var html = \"\";\n      for (var row = 0; row < height; row++) {\n        html += '<td style=\"min-width:30px; height:20px\"></td>';\n      }\n      table += \"<tr>\" + html + \"</tr>\\n\";\n    }\n    table += \"</table>\";\n    this.innerHTML += table;\n    this.registerOnAllCells();\n  }\n\n  setFromArray(array, force) {\n    if (!this.querySelector(\"tbody\") || force) {\n      this.setFromArrayClean(array);\n    } else {\n      var maxColumns = this.maxColumnsIn(array);\n      this.rows().filter((ea, index) => index >= array.length).forEach(ea => ea.remove());\n      this.cells().forEach(row => {\n        row.filter((cell, index) => {\n          return index >= maxColumns;\n        }).forEach(ea => ea.remove());\n      });\n      this.querySelectorAll(\"td,th\").forEach(ea => ea.textContent = \"\");\n      this.setFromArrayAt(array, 0, 0);\n    }\n  }\n\n  setFromArrayAt(array, columnOffset, rowOffset) {\n    var cells = this.cells();\n    var header = cells[0];\n    var tableLength = columnOffset + array[0].length;\n    // lively.notify(\"grow table? \" + tableLength  + \" \" + header.length + \" | \" + columnOffset + \" \" + array.length )\n    if (tableLength > header.length) {\n      var rows = this.rows\n      // we have to grow wider\n      ();rows.forEach((row, index) => {\n        for (var i = 0; i < tableLength - header.length; i++) {\n          var cell = document.createElement(\"td\");\n          row.appendChild(cell);\n        }\n      }\n      // we changed this contents and have to update\n      );cells = this.cells();\n      header = cells[0];\n    }\n    for (var i = 0; i < array.length; i++) {\n      var row = cells[rowOffset + i];\n      if (!row) {\n        var rowElement = document.createElement(\"tr\");\n        rowElement.innerHTML = header.map(ea => \"<td></td>\").join(\"\");\n        this.querySelector(\"tbody\").appendChild(rowElement);\n        var row = rowElement.querySelectorAll(\"td\");\n        cells.push(row);\n      }\n      var fromRow = array[i];\n      for (var j = 0; j < fromRow.length; j++) {\n        var index = columnOffset + j;\n        var cell = row[index];\n        if (!cell) throw new Error(\"No cell at \" + index + \", in \" + row);\n        cell.textContent = fromRow[j];\n      }\n    }\n    this.registerOnAllCells();\n  }\n\n  // #private\n  splitIntoRows(csv, separator = /[;\\t,]/) {\n    return csv.split(\"\\n\").map(line => {\n      return line.split(separator).map(ea => {\n        var m = ea.match(/^\"(.*)\"$/);\n        if (m) {\n          return m[1];\n        } else {\n          return ea;\n        }\n      });\n    });\n  }\n\n  setFromCSV(csv, separator) {\n    this.setFromArray(this.splitIntoRows(csv, separator));\n  }\n\n  setFromCSVat(csv, column, row, separator) {\n    this.setFromArrayAt(this.splitIntoRows(csv, separator), column, row);\n  }\n\n  /*\n   * set the contents of the table from a JSO where the keys of each object will become the header\n   * example: [{a: 1, b: 2}, {a: 4, b: 5, c: 6}]\n   */\n  setFromJSO(jso, clean = false) {\n    if (!jso) return;\n    var headers = [];\n    var rows = jso.map(obj => {\n      obj = obj || {};\n      // add headers that are introduced in that row\n      Object.keys(obj).forEach(key => {\n        if (headers.indexOf(key) < 0) {\n          headers.push(key);\n        }\n      });\n      return headers.map(key => {\n        return obj[key];\n      });\n    });\n    rows.unshift(headers);\n    if (clean) {\n      this.setFromArrayClean(rows);\n    } else {\n      this.setFromArray(rows); // #TODO why do we need this optimization again?\n    }\n  }\n\n  // #private\n  copySelectionAsTable() {\n    var tmp = LivelyTable.create();\n    tmp.setFromArray(_.values(_.groupBy(this.selectedCells, ea => this.rowOfCell(ea))).map(row => _.sortBy(row, ea => this.columnOfCell(ea)).map(ea => ea.textContent)));\n    return tmp;\n  }\n\n  getSelectionAsCSV() {\n    return this.copySelectionAsTable().asCSV();\n  }\n\n  getSelectionAsJSO() {\n    if (!this.selectedCells) return [];\n\n    let result = [];\n\n    this.selectedCells.forEach(each => {\n      let row = this.rowOfCell(each);\n      let key = this.keyForCell(each);\n      if (!result[row]) result[row] = {};\n      result[row][key] = each.textContent;\n    });\n\n    return result;\n  }\n\n  /*MD ## Lively4 API MD*/\n\n  livelyMigrate(other) {\n    this.clearSelection();\n    var selection = this.cellAt(other.currenColumnIndex, other.currentRowIndex);\n    if (selection) this.selectCell(selection);\n  }\n\n  // #important #lively4api\n  livelyExample() {\n    //this.setFromArray([['A', 'B', 'C', 'D', 'E'], ['First', 'Second', 'Third', 'Fourth', ''], ['Hello', 'World', '', '', ''], ['Foo', 'Bar', '', '', '']]);\n    this.setEmptyWithSize(20, 20);\n  }\n\n  /*MD ## Excel Functionality MD*/\n  getCellValue(cell) {\n    if (!cell) return undefined;\n    if (cell.expression && !cell.expression.expression.isDisposed()) {\n      return cell.expression.expression.getCurrentValue();\n    }\n    let val = cell.textContent;\n    if (this.currentCell === cell) {\n      val = this.currentCellValue;\n    }\n    return isNaN(+val) ? val : +val;\n  }\n\n  registerOnAllCells() {\n    for (const ae of this.activityChangeExpressions || []) {\n      ae.dispose();\n    }\n    this.activityChangeExpressions = [];\n    const cells = this.cells();\n    for (const row of this.cells()) {\n      for (const cell of row) {\n        this.registerCellForActivityChanges(cell);\n      }\n    }\n  }\n\n  registerCellForActivityChanges(cell) {\n    const expression = aexpr(() => cell === this.currentCell).onChange(isActive => this.cellChangedActive(cell, isActive));\n    this.activityChangeExpressions.push(expression);\n  }\n\n  cellChangedActive(cell, isActive) {\n    const text = cell.textContent;\n    if (isActive) {\n      const expression = cell.expression;\n      if (expression) {\n        if(!expression.expression.isDisposed()) {          \n          this.currentCellValue = expression.expression.getCurrentValue();\n          expression.expression.dispose();\n        }\n        cell.textContent = expression.text;\n      } else {\n        this.currentCellValue = cell.textContent;\n      }\n      delete cell.expression;\n    } else {\n      this.setCellExpression(cell, text)\n    }\n  }\n\n  setCellExpression(cell, text) {\n    cell.removeAttribute(\"bgcolor\");\n\n    if (text[0] === '=') {\n      if (text[1] === '=') {\n        let code = text.substring(2, text.length);\n        const value = this.evaluateCellText(code);\n        cell.textContent = value;\n        const inactiveExpression = { getCurrentValue: () => {\n            return value;\n          }, dispose: () => {}, isDisposed: () => {return false} };\n        cell.expression = { expression: inactiveExpression, text };\n      } else {\n        cell.setAttribute(\"bgcolor\", \"CCFFCC\");\n        let code = text.substring(1, text.length);\n        const [expressionCode, onChangeCode] = code.split('|');\n        \n        let expression = aexpr(() => this.evaluateCellText(expressionCode)).onChange(newValue => cell.textContent = newValue);\n        if (onChangeCode) {\n          expression.onChange(value => {\n            eval(onChangeCode);\n          });\n        }\n        const { value, isError } = expression.evaluateToCurrentValue();\n        if (isError) {\n          cell.textContent = \"Error in Expression\";\n          expression.dispose();\n        } else {          \n          cell.textContent = value;\n        }\n        cell.expression = { expression, text };\n      }\n    }\n  }\n  \n  static get CellReferenceRegex() {\n    return /([\\$~])([a-zA-Z]+)(\\d+)/gm;\n  }\n\n\n  evaluateCellText(code) {\n    let params = {};\n    return eval(code.replace(LivelyTable.CellReferenceRegex, (ref, absoluteOrRelative, column, row) => {\n      params[ref] = this.getCellValue(this.cellFromCode(column, row));\n      return \"params[\\\"\" + ref + \"\\\"]\";\n    }));\n  }\n\n  /** \n    @param column: The column in A - ZZ... Format\n    @param rowIndex: The Index of the row in 1 - Infintiy Range\n    @Return the corresponding cell\n   */\n  cellFromCode(column, rowIndex) {\n    return this.cellAt(this.columnIndex(column), rowIndex - 1);\n  }\n\n  columnIndex(column) {\n    var a = column.toUpperCase();\n    let columnIndex = 0;\n    while (a.length > 0) {\n      columnIndex *= 26;\n      columnIndex++;\n      columnIndex += a.charCodeAt(0) - 65;\n      a = a.substring(1, a.length);\n    }\n    return columnIndex - 1;\n  }\n  \n  columnIndexToDigit(columnIndex) {\n    var column = \"\";\n    while (columnIndex >= 26) {\n      column = String.fromCharCode(65 + columnIndex % 26) + column;\n      columnIndex /= 26;\n      columnIndex = Math.floor(columnIndex);\n      columnIndex--;\n    }\n    column = String.fromCharCode(65 + columnIndex % 26) + column;\n    return column;\n  }\n}"]}