{"version":3,"sources":["webpack://GridStack/webpack/universalModuleDefinition","webpack://GridStack/./src/gridstack-dd.ts","webpack://GridStack/./src/gridstack-ddi.ts","webpack://GridStack/./src/gridstack-engine.ts","webpack://GridStack/./src/gridstack.ts","webpack://GridStack/./src/h5/dd-base-impl.ts","webpack://GridStack/./src/h5/dd-draggable.ts","webpack://GridStack/./src/h5/dd-droppable.ts","webpack://GridStack/./src/h5/dd-element.ts","webpack://GridStack/./src/h5/dd-manager.ts","webpack://GridStack/./src/h5/dd-resizable-handle.ts","webpack://GridStack/./src/h5/dd-resizable.ts","webpack://GridStack/./src/h5/dd-utils.ts","webpack://GridStack/./src/h5/gridstack-dd-native.ts","webpack://GridStack/./src/index-h5.ts","webpack://GridStack/./src/utils.ts","webpack://GridStack/webpack/bootstrap","webpack://GridStack/webpack/startup"],"names":["root","factory","exports","module","define","amd","self","GridStackDD","GridStackDDI","get","el","this","draggable","resizable","gridstackNode","_initDD","GridStack","prototype","_setupAcceptWidget","opts","staticGrid","acceptWidgets","onDrag","event","node","pos","getCellFromPixel","left","pageX","top","pageY","x","Math","max","y","_added","engine","canMoveNode","moveNode","_updateContainerHeight","autoPosition","cleanNodes","beginUpdate","addNode","_writeAttrs","placeholder","w","h","appendChild","_beforeDragX","_beforeDragY","droppable","accept","grid","selector","matches","on","getAttribute","parseInt","round","offsetWidth","cellWidth","offsetHeight","getCellHeight","newNode","prepareNode","_temporary","_isOutOfGrid","_gridstackNodeOrig","off","removeNode","parentNode","remove","helper","origNode","oGrid","removedNodes","push","_triggerRemoveEvent","_id","cleanupNode","cloneNode","Utils","removePositioningStyles","_writeAttr","addedNodes","_triggerAddEvent","_triggerChangeEvent","endUpdate","_gsEventHandler","type","undefined","window","setTimeout","parentElement","_prepareDragDropByNode","_setupRemoveDrop","removable","trashEl","document","querySelector","isDroppable","removableOptions","dataset","inTrashZone","_setupRemovingTimeout","_clearRemovingTimeout","_removeTimeout","classList","add","_isAboutToRemove","removeTimeout","clearTimeout","_setupDragIn","dragIn","isDraggable","dragInOptions","cellHeight","locked","noMove","disableDrag","noResize","disableResize","onStartMoving","ui","target","setAttribute","append","_prevYPix","position","minW","minH","dragOrResize","floor","distance","updateScrollPosition","column","float","getRow","_temporaryRemoved","size","width","height","_lastTriedW","_lastTriedH","_lastTriedX","_lastTriedY","onEndMoving","gridToNotify","_resizeNestedGrids","start","stop","drag","resize","movable","els","val","getElements","forEach","pluginClass","ddi","registerPlugin","GridStackEngine","onchange","maxRow","nodes","getGridHeight","obsolete","_float","batchMode","_prevFloat","_packNodes","_notify","_sortNodes","nn","hasLocked","Boolean","find","n","moved","collisionNode","isIntercepted","length","batchUpdate","copyNodes","_dirty","commit","dir","sort","i","_updating","_packY","newY","box","slice","bn","canBeMoved","resizing","_idSeq","defaults","Number","isNaN","maxW","min","maxH","verify","dirtNodes","_origY","_origX","_origW","_origH","filter","removeDOM","dirtyNodes","Array","isArray","concat","getDirtyNodes","triggerAddEvent","_fixCollisions","triggerEvent","splice","findIndex","_layouts","isNodeChangedPosition","clonedNode","clone","map","canMove","noPack","reduce","memo","saveElement","widgets","key","_ignoreLayoutsNodeChange","layout","l","ratio","oldColumn","cacheLayout","cacheNodes","lastIndex","cacheNode","j","newNodes","move","scale","clear","copy","prop","obsoleteOpts","obsoleteAttr","row","minRow","rowAttr","toNumber","itemClass","placeholderClass","placeholderText","handle","handleClass","styleInHead","margin","auto","minWidth","toBool","_class","random","toFixed","animate","alwaysShowResizeHandle","autoHide","handles","scroll","appendTo","revert","rtl","marginUnit","cellHeightUnit","disableOneColumnMode","oneColumnModeDomSort","initMargin","style","direction","_isNested","closestByClass","_isAutoCellHeight","marginDiff","marginRight","marginLeft","marginTop","marginBottom","_setStaticClass","_updateStyles","cbNodes","removeChild","elements","getGridItems","e","item","_prepareElement","saveInitial","setAnimation","placeholderChild","createElement","className","innerHTML","_updateWindowResizeEvent","options","elOrString","getGridElement","gridstack","console","error","grids","getGridElements","arguments","warn","a","opt","id","addWidget","doc","implementation","createHTMLDocument","body","children","content","domAttr","_readAttr","saveContent","list","save","sub","addAndRemove","items","_prevColumn","some","removed","removeWidget","update","forcePixel","data","parseHeight","unit","compact","domNodes","updateNodeWidths","from","setStatic","removeAll","_removeStylesheet","enableMove","enableResize","_triggerEvent","doEnable","includeNewWidgets","useDocRelative","containerPos","getBoundingClientRect","documentElement","scrollTop","offsetTop","offsetLeft","relativeLeft","relativeTop","columnWidth","rowHeight","isAreaEmpty","getElement","name","callback","indexOf","split","noData","detail","addEventListener","log","removeEventListener","doAnimate","m","keys","k","changed","ddChanged","value","canBePlacedWithRespectToHeight","layoutsNodesChange","CustomEvent","bubbles","Event","dispatchEvent","_styles","removeStylesheet","forceUpdate","prefix","styleLocation","createStylesheet","_max","addCSSRule","bottom","right","getHeight","rows","cssMinHeight","getComputedStyle","String","removeProperty","querySelectorAll","onParentResize","same","attrs","resizeHandles","removeAttribute","hasOwnProperty","classes","throttle","clientWidth","_oneColumnMode","forceRemove","workTodo","_windowResizeBind","bind","margins","Engine","_disabled","_eventRegister","eventName","disabled","DDDraggable","DDBaseImplement","option","super","dragging","containmentRect","offset","_mouseDown","_dragStart","_drag","_dragEnd","_dragFollow","enable","disable","destroy","Object","mouseDownElement","preventDefault","DDManager","dragElement","_createHelper","_setupHelperContainmentStyle","dragOffset","_getDragOffset","helperContainment","ev","DDUtils","initEvent","_setupDragFollowNodeNotifyStart","dragFollowTimer","_cancelDragGhost","_setupHelperStyle","dragEventListenerOption","paintTimer","cancelAnimationFrame","parentOriginStylePosition","_removeHelperStyle","apply","contains","dragElementOriginStyle","originStyleProp","pointerEvents","transition","basePosition","zIndex","requestAnimationFrame","clientX","clientY","match","dataTransfer","setData","effectAllowed","DataTransfer","setDragImage","display","stopPropagation","Image","parent","xformOffsetX","xformOffsetY","testEl","addElStyles","opacity","testElPosition","targetOffset","isEventSupportPassiveOption","capture","passive","DDDroppable","acceptable","_dragEnter","_dragOver","_dragLeave","_drop","_setupAccept","_canDrop","over","_ui","relatedTarget","_removeLeaveCallbacks","out","drop","DDElement","ddElement","ddDraggable","ddDroppable","ddResizable","updateOption","DDResizable","DDResizableHandle","host","mouseMoving","started","_mouseMove","_mouseUp","init","userSelect","mouseDownEvent","_hasMoved","oEvent","oClientX","oClientY","abs","_showHandlers","_hideHandlers","rect","temporalRect","originalRect","_setupAutoHide","_setupHandlers","_removeHandlers","updateHandles","updateAutoHide","handlerDirection","handlers","trim","_resizeStart","_resizeStop","_resizing","startEvent","_setupHelper","_applyChange","_getChange","_cleanHelper","elOriginStyle","_originStyleProp","newRect","offsetH","offsetV","reshape","_getReShapeSize","oWidth","oHeight","maxWidth","maxHeight","minHeight","containmentEl","test","styles","s","info","kbdProps","ptProps","evt","obj","button","which","buttons","cancelable","originEvent","DragEvent","assign","_copyProps","dst","src","props","p","supportsPassive","passiveTest","GridStackDDNative","_getDDElements","dEl","cleanResizable","setupResizable","cleanDraggable","setupDraggable","containment","dragOut","_accept","cleanDroppable","setupDroppable","create","hosts","d","f","oldName","newName","rev","wrapper","args","oldAttr","getElementById","substring","b","widths","styleSheet","cssText","createTextNode","insertBefore","firstChild","getElementsByTagName","sheet","rules","addRule","insertRule","v","toLowerCase","Error","parseFloat","sources","source","delay","isWaiting","returnEl","scrollHeight","clientHeight","getScrollParent","innerHeightOrClientHeight","innerHeight","offsetDiffDown","offsetDiffUp","scrollEl","prevScroll","__webpack_module_cache__","__webpack_require__","moduleId","__webpack_modules__","call"],"mappings":";CAAA,SAA2CA,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,IACQ,mBAAXG,QAAyBA,OAAOC,IAC9CD,OAAO,GAAIH,GACe,iBAAZC,QACdA,QAAmB,UAAID,IAEvBD,EAAgB,UAAIC,IARtB,CASGK,MAAM,WACT,M,6GCDA,eAEA,SACA,SAoBA,MAAsBC,UAAoB,EAAAC,aAGxC,aACE,OAAO,EAAAA,aAAaC,MAIf,OAAOC,GAKZ,OAJAC,KAAKC,UAAUF,EAAI,WAAWG,UAAUH,EAAI,WACxCA,EAAGI,sBACEJ,EAAGI,cAAcC,QAEnBJ,MAbX,gBA2CA,EAAAK,UAAUC,UAAUC,mBAAqB,WACvC,GAAIP,KAAKQ,KAAKC,aAAeT,KAAKQ,KAAKE,cAAe,OAAOV,KAE7D,IAAIW,EAAS,CAACC,EAAOb,KACnB,IAAIc,EAAOd,EAAGI,cACVW,EAAMd,KAAKe,iBAAiB,CAACC,KAAMJ,EAAMK,MAAOC,IAAKN,EAAMO,QAAQ,GACnEC,EAAIC,KAAKC,IAAI,EAAGR,EAAIM,GACpBG,EAAIF,KAAKC,IAAI,EAAGR,EAAIS,GACnBV,EAAKW,OAkBEJ,IAAMP,EAAKO,GAAKG,IAAMV,EAAKU,IAAMvB,KAAKyB,OAAOC,YAAYb,EAAMO,EAAGG,KAC5EvB,KAAKyB,OAAOE,SAASd,EAAMO,EAAGG,GAC9BvB,KAAK4B,2BAnBLf,EAAKW,QAAS,EAEdX,EAAKd,GAAKA,EACVc,EAAKO,EAAIA,EACTP,EAAKU,EAAIA,SACFV,EAAKgB,aACZ7B,KAAKyB,OAAOK,aACZ9B,KAAKyB,OAAOM,YAAYlB,GACxBb,KAAKyB,OAAOO,QAAQnB,GAEpBb,KAAKiC,YAAYjC,KAAKkC,YAAarB,EAAKO,EAAGP,EAAKU,EAAGV,EAAKsB,EAAGtB,EAAKuB,GAChEpC,KAAKD,GAAGsC,YAAYrC,KAAKkC,aACzBrB,EAAKd,GAAKC,KAAKkC,YACfrB,EAAKyB,aAAezB,EAAKO,EACzBP,EAAK0B,aAAe1B,EAAKU,EAEzBvB,KAAK4B,2BAyIT,OAlIAhC,EAAYE,MACT0C,UAAUxC,KAAKD,GAAI,CAClB0C,OAAS1C,IACP,IAAIc,EAAsBd,EAAGI,cAC7B,GAAIU,GAAQA,EAAK6B,OAAS1C,KACxB,OAAO,EAET,GAAuC,mBAA5BA,KAAKQ,KAAKE,cACnB,OAAOV,KAAKQ,KAAKE,cAAcX,GAEjC,IAAI4C,GAAwC,IAA5B3C,KAAKQ,KAAKE,cAAyB,mBAAqBV,KAAKQ,KAAKE,cAClF,OAAOX,EAAG6C,QAAQD,MAGrBE,GAAG7C,KAAKD,GAAI,YAAY,CAACa,EAAOb,KAE/B,IAAIc,EAAOd,EAAGI,eAAiB,GAC/B,GAAIU,EAAK6B,OAAS1C,KAEhB,cADOa,EAAKW,QACL,EAIT,GAAIzB,EAAG+C,gBAAkBjC,EAAKsB,IAAMtB,EAAKuB,GAAI,CAC3C,IAAID,EAAIY,SAAShD,EAAG+C,aAAa,SAC7BX,EAAI,IAAKtB,EAAKsB,EAAIA,GACtB,IAAIC,EAAIW,SAAShD,EAAG+C,aAAa,SAC7BV,EAAI,IAAKvB,EAAKuB,EAAIA,GAIpBvB,EAAK6B,MAAQ7B,EAAK6B,OAAS1C,OAC7Ba,EAAKW,QAAS,GAIhB,IAAIW,EAAItB,EAAKsB,GAAKd,KAAK2B,MAAMjD,EAAGkD,YAAcjD,KAAKkD,cAAgB,EAC/Dd,EAAIvB,EAAKuB,GAAKf,KAAK2B,MAAMjD,EAAGoD,aAAenD,KAAKoD,eAAc,KAAU,EAGxEC,EAAUrD,KAAKyB,OAAO6B,YAAY,OAAD,wBAAKzC,GAAS,CAACsB,IAAGC,IAAGZ,QAAQ,EAAO+B,YAAY,KAMrF,OALAF,EAAQG,cAAe,EACvBzD,EAAGI,cAAgBkD,EACnBtD,EAAG0D,mBAAqB5C,EAExBjB,EAAYE,MAAM+C,GAAG9C,EAAI,OAAQY,IAC1B,KAERkC,GAAG7C,KAAKD,GAAI,WAAW,CAACa,EAAOb,KAC9B,IAAIc,EAAOd,EAAGI,cACd,GAAKU,WAGEA,EAAKW,OAIPX,EAAK2C,cAYV,OARA5D,EAAYE,MAAM4D,IAAI3D,EAAI,QAC1Bc,EAAKd,GAAK,KACVC,KAAKyB,OAAOkC,WAAW9C,GACnBb,KAAKkC,YAAY0B,aAAe5D,KAAKD,IACvCC,KAAKkC,YAAY2B,SAEnB7D,KAAK4B,yBACL7B,EAAGI,cAAgBJ,EAAG0D,oBACf,KAERZ,GAAG7C,KAAKD,GAAI,QAAQ,CAACa,EAAOb,EAAyB+D,KACpD,IAAIjD,EAAOd,EAAGI,cAEd,GAAIU,GAAQA,EAAK6B,OAAS1C,KAAQ,OAAO,EAEzCA,KAAKkC,YAAY2B,SAGjB,IAAIE,EAAWhE,EAAG0D,mBAElB,UADO1D,EAAG0D,mBACNM,GAAYA,EAASrB,MAAQqB,EAASrB,OAAS1C,KAAM,CACvD,IAAIgE,EAAQD,EAASrB,KACrBsB,EAAM9B,YAAY2B,SAClBE,EAAShE,GAAKA,EACdiE,EAAMvC,OAAOwC,aAAaC,KAAKH,GAC/BC,EAAMG,sBAIR,IAAKtD,EAAQ,OAAO,EACpB,MAAMuD,EAAMvD,EAAKuD,IAqCjB,OApCApE,KAAKyB,OAAO4C,YAAYxD,GACxBA,EAAKuD,IAAMA,EACXvD,EAAK6B,KAAO1C,KACZJ,EAAYE,MAAM4D,IAAI3D,EAAI,QAGtB+D,IAAW/D,GACb+D,EAAOD,SACP9D,EAAGI,cAAgB4D,EACnBhE,EAAKA,EAAGuE,WAAU,KAElBvE,EAAG8D,SACHjE,EAAYE,MAAM+D,OAAO9D,IAE3BA,EAAGI,cAAgBU,EACnBA,EAAKd,GAAKA,EAEV,EAAAwE,MAAMC,wBAAwBzE,GAC9BC,KAAKyE,WAAW1E,EAAIc,GACpBb,KAAKD,GAAGsC,YAAYtC,GACpBC,KAAK4B,yBACL5B,KAAKyB,OAAOiD,WAAWR,KAAKrD,GAC5Bb,KAAK2E,mBACL3E,KAAK4E,sBAEL5E,KAAKyB,OAAOoD,YACR7E,KAAK8E,gBAAyB,SAChC9E,KAAK8E,gBAAyB,QAAE,CAACC,KAAM,WAAYhB,GAAYA,EAASrB,KAAOqB,OAAWiB,EAAWnE,GAKvGoE,OAAOC,YAAW,KACZrE,EAAKd,IAAMc,EAAKd,GAAGoF,eAAenF,KAAKoF,uBAAuBvE,OAG7D,KAEJb,MAIT,EAAAK,UAAUC,UAAU+E,iBAAmB,WACrC,IAAKrF,KAAKQ,KAAKC,YAA6C,iBAAxBT,KAAKQ,KAAK8E,UAAwB,CACpE,IAAIC,EAAUC,SAASC,cAAczF,KAAKQ,KAAK8E,WAC/C,IAAKC,EAAS,OAAOvF,KAIhBJ,EAAYE,MAAM4F,YAAYH,IACjC3F,EAAYE,MAAM0C,UAAU+C,EAASvF,KAAKQ,KAAKmF,kBAC5C9C,GAAG0C,EAAS,YAAY,SAAS3E,EAAOb,GACvC,IAAIc,EAAOd,EAAGI,cACTU,GAASA,EAAK6B,OACnB3C,EAAG6F,QAAQC,YAAc,OACzBhF,EAAK6B,KAAKoD,sBAAsB/F,OAEjC8C,GAAG0C,EAAS,WAAW,SAAS3E,EAAOb,GACtC,IAAIc,EAAOd,EAAGI,cACTU,GAASA,EAAK6B,cACZ3C,EAAG6F,QAAQC,YAClBhF,EAAK6B,KAAKqD,sBAAsBhG,OAIxC,OAAOC,MAIT,EAAAK,UAAUC,UAAUwF,sBAAwB,SAAS/F,GACnD,IAAIc,EAAOd,EAAGI,cACd,OAAKU,IAAQA,EAAKmF,gBAAmBhG,KAAKQ,KAAK8E,WAC/CzE,EAAKmF,eAAiBf,OAAOC,YAAW,KACtCnF,EAAGkG,UAAUC,IAAI,4BACjBrF,EAAKsF,kBAAmB,IACvBnG,KAAKQ,KAAK4F,eACNpG,MAL0DA,MASnE,EAAAK,UAAUC,UAAUyF,sBAAwB,SAAShG,GACnD,IAAIc,EAAOd,EAAGI,cACd,OAAKU,GAASA,EAAKmF,gBACnBK,aAAaxF,EAAKmF,uBACXnF,EAAKmF,eACZjG,EAAGkG,UAAUpC,OAAO,mCACbhD,EAAKsF,iBACLnG,MALmCA,MAS5C,EAAAK,UAAUC,UAAUgG,aAAe,WAMjC,OALKtG,KAAKQ,KAAKC,YAA0C,iBAArBT,KAAKQ,KAAK+F,QACvC3G,EAAYE,MAAM0G,YAAYxG,KAAKQ,KAAK+F,SAC3C3G,EAAYE,MAAMyG,OAAOvG,KAAKQ,KAAK+F,OAAQvG,KAAKQ,KAAKiG,eAGlDzG,MAIT,EAAAK,UAAUC,UAAU8E,uBAAyB,SAASvE,GACpD,IA4BIqC,EACAwD,EA7BA3G,EAAKc,EAAKd,GAGd,GAAIC,KAAKQ,KAAKC,YAAcI,EAAK8F,SAC7B9F,EAAK+F,QAAU5G,KAAKQ,KAAKqG,eAAiBhG,EAAKiG,UAAY9G,KAAKQ,KAAKuG,eAMvE,OALIlG,EAAKT,UACPR,EAAYE,MAAM+D,OAAOhD,EAAKd,WACvBc,EAAKT,SAEdS,EAAKd,GAAGkG,UAAUC,IAAI,wBAAyB,yBACxClG,KAGT,GAAIa,EAAKT,QAQP,OANIS,EAAK+F,QAAU5G,KAAKQ,KAAKqG,cAC3BjH,EAAYE,MAAMG,UAAUF,EAAI,YAE9Bc,EAAKiG,UAAY9G,KAAKQ,KAAKuG,gBAC7BnH,EAAYE,MAAMI,UAAUH,EAAI,WAE3BC,KAITa,EAAKd,GAAGkG,UAAUpC,OAAO,wBAAyB,yBAOlD,IAAImD,EAAgB,CAACpG,EAAcqG,KACjC,IAAIC,EAAStG,EAAMsG,OAGflH,KAAK8E,gBAAgBlE,EAAMmE,OAC7B/E,KAAK8E,gBAAgBlE,EAAMmE,MAAMnE,EAAOsG,GAG1ClH,KAAKyB,OAAOK,aACZ9B,KAAKyB,OAAOM,YAAYlB,GACxBqC,EAAYlD,KAAKkD,YACjBwD,EAAa1G,KAAKoD,eAAc,GAEhCpD,KAAKkC,YAAYiF,aAAa,OAAQD,EAAOpE,aAAa,SAC1D9C,KAAKkC,YAAYiF,aAAa,OAAQD,EAAOpE,aAAa,SAC1D9C,KAAKkC,YAAYiF,aAAa,OAAQD,EAAOpE,aAAa,SAC1D9C,KAAKkC,YAAYiF,aAAa,OAAQD,EAAOpE,aAAa,SAC1D9C,KAAKD,GAAGqH,OAAOpH,KAAKkC,aAEpBrB,EAAKd,GAAKC,KAAKkC,YACfrB,EAAKyB,aAAezB,EAAKO,EACzBP,EAAK0B,aAAe1B,EAAKU,EACzBV,EAAKwG,UAAYJ,EAAGK,SAASpG,IAE7BtB,EAAYE,MAAMI,UAAUH,EAAI,SAAU,WAAYmD,GAAarC,EAAK0G,MAAQ,IAChF3H,EAAYE,MAAMI,UAAUH,EAAI,SAAU,YAAa2G,GAAc7F,EAAK2G,MAAQ,KAIhFC,EAAe,CAAC7G,EAAcqG,KAChC,IAEI9E,EACAC,EAHAhB,EAAIC,KAAK2B,MAAMiE,EAAGK,SAAStG,KAAOkC,GAClC3B,EAAIF,KAAKqG,OAAOT,EAAGK,SAASpG,IAAMwF,EAAa,GAAKA,GAIxD,GAAmB,SAAf9F,EAAMmE,KAAiB,CACzB,IAAI4C,EAAWV,EAAGK,SAASpG,IAAML,EAAKwG,UAItC,GAHAxG,EAAKwG,UAAYJ,EAAGK,SAASpG,IAC7B,EAAAqD,MAAMqD,qBAAqB7H,EAAIkH,EAAGK,SAAUK,GAExC5H,EAAG6F,QAAQC,aAAezE,EAAI,GAAKA,GAAKpB,KAAKyB,OAAOoG,QAAUtG,EAAI,IAAOvB,KAAKyB,OAAOqG,OAASvG,EAAIvB,KAAKyB,OAAOsG,UAAalH,EAAKW,OAAQ,CAC1I,GAAIX,EAAKmH,kBAAqB,QACF,IAAxBhI,KAAKQ,KAAK8E,WACZtF,KAAK8F,sBAAsB/F,GAG7BqB,EAAIP,EAAKyB,aACTf,EAAIV,EAAK0B,aAELvC,KAAKkC,YAAY0B,aAAe5D,KAAKD,IACvCC,KAAKkC,YAAY2B,SAEnB7D,KAAKyB,OAAOkC,WAAW9C,GACvBb,KAAK4B,yBAELf,EAAKmH,mBAAoB,SAClBnH,EAAKW,YAEZxB,KAAK+F,sBAAsBhG,GAEvBc,EAAKmH,oBACPhI,KAAKyB,OAAOO,QAAQnB,GACpBb,KAAKiC,YAAYjC,KAAKkC,YAAad,EAAGG,EAAGY,EAAGC,GAC5CpC,KAAKD,GAAGsC,YAAYrC,KAAKkC,aACzBrB,EAAKd,GAAKC,KAAKkC,mBACRrB,EAAKmH,wBAGX,GAAmB,WAAfpH,EAAMmE,KAAoB,CACnC,GAAI3D,EAAI,EAAG,OACXe,EAAId,KAAK2B,MAAMiE,EAAGgB,KAAKC,MAAQhF,GAC/Bd,EAAIf,KAAK2B,MAAMiE,EAAGgB,KAAKE,OAASzB,GAGlC,IAAI0B,EAAejG,GAAKtB,EAAKuH,YACzBC,EAAejG,GAAKvB,EAAKwH,aACxBrI,KAAKyB,OAAOC,YAAYb,EAAMO,EAAGG,EAAGY,EAAGC,IACzCvB,EAAKyH,cAAgBlH,GAAKP,EAAK0H,cAAgBhH,GAChDV,EAAKuH,cAAgBA,GAAevH,EAAKwH,cAAgBA,IAG3DxH,EAAKyH,YAAclH,EACnBP,EAAK0H,YAAchH,EACnBV,EAAKuH,YAAcjG,EACnBtB,EAAKwH,YAAcjG,EACnBpC,KAAKyB,OAAOE,SAASd,EAAMO,EAAGG,EAAGY,EAAGC,GACpCpC,KAAK4B,2BAIH4G,EAAe5H,IACbZ,KAAKkC,YAAY0B,aAAe5D,KAAKD,IACvCC,KAAKkC,YAAY2B,SAInB,IAAIqD,EAA8BtG,EAAMsG,OACxC,GAAKA,EAAO/G,eAAiB+G,EAAO/G,cAAcuC,OAAS1C,KAA3D,CAIA,GAFAa,EAAKd,GAAKmH,EAENrG,EAAKsF,iBAAkB,CACzB,IAAIsC,EAAe1I,EAAGI,cAAcuC,KAChC+F,EAAa3D,gBAAgBlE,EAAMmE,OACrC0D,EAAa3D,gBAAgBlE,EAAMmE,MAAMnE,EAAOsG,GAElDuB,EAAahH,OAAOwC,aAAaC,KAAKrD,GACtCjB,EAAYE,MAAM+D,OAAO9D,UAClBA,EAAGI,cACVsI,EAAatE,sBACTpE,EAAGoF,eACLpF,EAAG8D,cAGL7D,KAAK+F,sBAAsBhG,GACtBc,EAAKmH,mBAIR,EAAAzD,MAAMC,wBAAwB0C,GAC9BlH,KAAKiC,YAAYiF,EAAQrG,EAAKyB,aAAczB,EAAK0B,aAAc1B,EAAKsB,EAAGtB,EAAKuB,GAC5EvB,EAAKO,EAAIP,EAAKyB,aACdzB,EAAKU,EAAIV,EAAK0B,oBACP1B,EAAKmH,kBACZhI,KAAKyB,OAAOO,QAAQnB,KARpB,EAAA0D,MAAMC,wBAAwB0C,GAC9BlH,KAAKiC,YAAYiF,EAAQrG,EAAKO,EAAGP,EAAKU,EAAGV,EAAKsB,EAAGtB,EAAKuB,IASpDpC,KAAK8E,gBAAgBlE,EAAMmE,OAC7B/E,KAAK8E,gBAAgBlE,EAAMmE,MAAMnE,EAAOsG,GAI5ClH,KAAK4B,yBACL5B,KAAK4E,sBAEL5E,KAAKyB,OAAOoD,YAGO,eAAfjE,EAAMmE,MACR/E,KAAK0I,mBAAmBxB,KAwB5B,OApBAtH,EAAYE,MACTG,UAAUF,EAAI,CACb4I,MAAO3B,EACP4B,KAAMJ,EACNK,KAAMpB,IAEPvH,UAAUH,EAAI,CACb4I,MAAO3B,EACP4B,KAAMJ,EACNM,OAAQrB,IAEZ5G,EAAKT,SAAU,GAGXS,EAAK+F,QAAU5G,KAAKQ,KAAKqG,cAC3BjH,EAAYE,MAAMG,UAAUF,EAAI,YAE9Bc,EAAKiG,UAAY9G,KAAKQ,KAAKuG,gBAC7BnH,EAAYE,MAAMI,UAAUH,EAAI,WAE3BC,MAQT,EAAAK,UAAUC,UAAUyI,QAAU,SAASC,EAAuBC,GAC5D,OAAIA,GAAOjJ,KAAKQ,KAAKC,YACrB,EAAAJ,UAAU6I,YAAYF,GAAKG,SAAQpJ,IACjC,IAAIc,EAAOd,EAAGI,cACTU,IACLA,EAAK+F,QAAWqC,EACZpI,EAAK+F,QACPhH,EAAYE,MAAMG,UAAUF,EAAI,WAChCA,EAAGkG,UAAUpC,OAAO,yBAEpB7D,KAAKoF,uBAAuBvE,GAC5BjB,EAAYE,MAAMG,UAAUF,EAAI,UAChCA,EAAGkG,UAAUpC,OAAO,4BAXkB7D,MAsB5C,EAAAK,UAAUC,UAAUJ,UAAY,SAAS8I,EAAuBC,GAC9D,OAAIA,GAAOjJ,KAAKQ,KAAKC,YACrB,EAAAJ,UAAU6I,YAAYF,GAAKG,SAAQpJ,IACjC,IAAIc,EAAOd,EAAGI,cACTU,IACLA,EAAKiG,UAAamC,EACdpI,EAAKiG,SACPlH,EAAYE,MAAMI,UAAUH,EAAI,YAEhCC,KAAKoF,uBAAuBvE,GAC5BjB,EAAYE,MAAMI,UAAUH,EAAI,eATMC,O,mFCjgB5C,MAAaH,EAKX,sBAAsBuJ,GACpBvJ,EAAawJ,IAAM,IAAID,EAIzB,aAEE,OADKvJ,EAAawJ,KAAOxJ,EAAayJ,eAAezJ,GAC9CA,EAAawJ,IAIf,OAAOtJ,GACZ,OAAOC,MAjBX,kB,uFCNA,eAWA,MAAauJ,EAmBX,YAAmB1B,EAAS,GAAI2B,EAAuB1B,GAAQ,EAAO2B,EAAS,EAAGC,EAAyB,IAdpG,KAAAhF,WAA8B,GAC9B,KAAAT,aAAgC,GAkoB/B,KAAA0F,cAAgB,EAAAC,SAAS5J,KAAMuJ,EAAgBjJ,UAAUyH,OAAQ,gBAAiB,SAAU,UApnBlG/H,KAAK6H,OAASA,EACd7H,KAAKwJ,SAAWA,EAChBxJ,KAAK6J,OAAS/B,EACd9H,KAAKyJ,OAASA,EACdzJ,KAAK0J,MAAQA,EAGR,cACL,OAAI1J,KAAK8J,YACT9J,KAAK8J,WAAY,EACjB9J,KAAK+J,WAAa/J,KAAK6J,OACvB7J,KAAK6J,QAAS,GAHa7J,KAOtB,SACL,OAAKA,KAAK8J,WACV9J,KAAK8J,WAAY,EACjB9J,KAAK6J,OAAS7J,KAAK+J,kBACZ/J,KAAK+J,WACZ/J,KAAKgK,aACLhK,KAAKiK,UACEjK,MANqBA,KAUtB,eAAea,GACrBb,KAAKkK,YAAY,GAEjB,IAAIC,EAAKtJ,EACLuJ,EAAYC,QAAQrK,KAAK0J,MAAMY,MAAKC,GAAKA,EAAE5D,UAI/C,IAHK3G,KAAK8H,OAAUsC,IAClBD,EAAK,CAAC/I,EAAG,EAAGG,EAAGV,EAAKU,EAAGY,EAAGnC,KAAK6H,OAAQzF,EAAGvB,EAAKuB,MAEpC,CACX,IAEIoI,EAFAC,EAAgBzK,KAAK0J,MAAMY,MAAMC,GAAKA,IAAM1J,GAAQ,EAAA0D,MAAMmG,cAAcH,EAAGJ,IAAK,CAACtJ,KAAMA,EAAMsJ,GAAIA,IACrG,IAAKM,EAAiB,OAAOzK,KAU7B,GANEwK,EAFEC,EAAc9D,OAER3G,KAAK2B,SAASd,EAAMA,EAAKO,EAAGqJ,EAAclJ,EAAIkJ,EAAcrI,EAClEvB,EAAKsB,EAAGtB,EAAKuB,GAAG,GAEVpC,KAAK2B,SAAS8I,EAAeA,EAAcrJ,EAAGP,EAAKU,EAAIV,EAAKuB,EAClEqI,EAActI,EAAGsI,EAAcrI,GAAG,IAEjCoI,EAAS,OAAOxK,MAIlB,YAAYoB,EAAWG,EAAWY,EAAWC,GAClD,IAAI+H,EAAoB,CAAC/I,EAAGA,GAAK,EAAGG,EAAGA,GAAK,EAAGY,EAAGA,GAAK,EAAGC,EAAGA,GAAK,GAIlE,OAHoBpC,KAAK0J,MAAMY,MAAKC,GAC3B,EAAAhG,MAAMmG,cAAcH,EAAGJ,KAM3B,UACL,GAA0B,IAAtBnK,KAAK0J,MAAMiB,OAAgB,OAAO3K,KACtCA,KAAK4K,cACL5K,KAAKkK,aACL,IAAIW,EAAY7K,KAAK0J,MAUrB,OATA1J,KAAK0J,MAAQ,GACbmB,EAAU1B,SAAQtI,IACXA,EAAK+F,QAAW/F,EAAK8F,SACxB9F,EAAKgB,cAAe,GAEtB7B,KAAKgC,QAAQnB,GAAM,GACnBA,EAAKiK,QAAS,KAEhB9K,KAAK+K,SACE/K,KAIT,UAAiBiJ,GACXjJ,KAAK6J,SAAWZ,IACpBjJ,KAAK6J,OAASZ,IAAO,EAChBA,IACHjJ,KAAKgK,aACLhK,KAAKiK,YAKT,YAA8B,OAAOjK,KAAK6J,SAAU,EAG5C,WAAWmB,GAEjB,OADAhL,KAAK0J,MAAQ,EAAAnF,MAAM0G,KAAKjL,KAAK0J,MAAOsB,EAAKhL,KAAK6H,QACvC7H,KAID,aA4CN,OA3CAA,KAAKkK,aAEDlK,KAAK8H,MACP9H,KAAK0J,MAAMP,SAAQ,CAACoB,EAAGW,KACrB,GAAIX,EAAEY,gBAA0BnG,IAAbuF,EAAEa,QAAwBb,EAAEhJ,IAAMgJ,EAAEa,OACrD,OAAOpL,KAET,IAAIqL,EAAOd,EAAEhJ,EACb,KAAO8J,GAAQd,EAAEa,QAAQ,CACvB,IAAIE,EAAuB,CAAClK,EAAGmJ,EAAEnJ,EAAGG,EAAG8J,EAAMlJ,EAAGoI,EAAEpI,EAAGC,EAAGmI,EAAEnI,GACtCpC,KAAK0J,MACtB6B,MAAM,EAAGL,GACTZ,MAAKkB,GAAM,EAAAjH,MAAMmG,cAAcY,EAAKE,IAAK,CAACjB,EAAGA,EAAGc,KAAMA,MAEvDd,EAAEO,QAAS,EACXP,EAAEhJ,EAAI8J,KAENA,MAINrL,KAAK0J,MAAMP,SAAQ,CAACoB,EAAGW,KACrB,GAAIX,EAAE5D,OAAU,OAAO3G,KACvB,KAAOuK,EAAEhJ,EAAI,GAAG,CACd,IAAI8J,EAAOd,EAAEhJ,EAAI,EACbkK,EAAmB,IAANP,EACbI,EAAuB,CAAClK,EAAGmJ,EAAEnJ,EAAGG,EAAG8J,EAAMlJ,EAAGoI,EAAEpI,EAAGC,EAAGmI,EAAEnI,GAQ1D,GAPI8I,EAAI,IAINO,OAA+BzG,IAHXhF,KAAK0J,MACtB6B,MAAM,EAAGL,GACTZ,MAAKkB,GAAM,EAAAjH,MAAMmG,cAAcY,EAAKE,IAAK,CAACjB,EAAGA,EAAGc,KAAMA,MAItDI,EAAc,MAInBlB,EAAEO,OAAUP,EAAEhJ,IAAM8J,EACpBd,EAAEhJ,EAAI8J,MAILrL,KAQF,YAAYa,EAAqB6K,IACtC7K,EAAOA,GAAQ,IACVuD,IAAMvD,EAAKuD,KAAOmF,EAAgBoC,cAGxB3G,IAAXnE,EAAKO,QAA8B4D,IAAXnE,EAAKU,GAA8B,OAAXV,EAAKO,GAAyB,OAAXP,EAAKU,IAC1EV,EAAKgB,cAAe,GAItB,IAAI+J,EAA0B,CAAExK,EAAG,EAAGG,EAAG,EAAGY,EAAG,EAAGC,EAAG,GAwDrD,OAvDA,EAAAmC,MAAMqH,SAAS/K,EAAM+K,GAEhB/K,EAAKgB,qBAAuBhB,EAAKgB,aACjChB,EAAKiG,iBAAmBjG,EAAKiG,SAC7BjG,EAAK+F,eAAiB/F,EAAK+F,OAGX,iBAAV/F,EAAKO,IAAsBP,EAAKO,EAAIyK,OAAOhL,EAAKO,IACtC,iBAAVP,EAAKU,IAAsBV,EAAKU,EAAIsK,OAAOhL,EAAKU,IACtC,iBAAVV,EAAKsB,IAAkBtB,EAAKsB,EAAI0J,OAAOhL,EAAKsB,IAClC,iBAAVtB,EAAKuB,IAAiBvB,EAAKuB,EAAIyJ,OAAOhL,EAAKuB,IAClD0J,MAAMjL,EAAKO,KAAWP,EAAKO,EAAIwK,EAASxK,EAAGP,EAAKgB,cAAe,GAC/DiK,MAAMjL,EAAKU,KAAWV,EAAKU,EAAIqK,EAASrK,EAAGV,EAAKgB,cAAe,GAC/DiK,MAAMjL,EAAKsB,KAAOtB,EAAKsB,EAAIyJ,EAASzJ,GACpC2J,MAAMjL,EAAKuB,KAAMvB,EAAKuB,EAAIwJ,EAASxJ,GAEnCvB,EAAKkL,OAAQlL,EAAKsB,EAAId,KAAK2K,IAAInL,EAAKsB,EAAGtB,EAAKkL,OAC5ClL,EAAKoL,OAAQpL,EAAKuB,EAAIf,KAAK2K,IAAInL,EAAKuB,EAAGvB,EAAKoL,OAC5CpL,EAAK0G,OAAQ1G,EAAKsB,EAAId,KAAKC,IAAIT,EAAKsB,EAAGtB,EAAK0G,OAC5C1G,EAAK2G,OAAQ3G,EAAKuB,EAAIf,KAAKC,IAAIT,EAAKuB,EAAGvB,EAAK2G,OAE5C3G,EAAKsB,EAAInC,KAAK6H,OAChBhH,EAAKsB,EAAInC,KAAK6H,OACLhH,EAAKsB,EAAI,IAClBtB,EAAKsB,EAAI,GAGPnC,KAAKyJ,QAAU5I,EAAKuB,EAAIpC,KAAKyJ,OAC/B5I,EAAKuB,EAAIpC,KAAKyJ,OACL5I,EAAKuB,EAAI,IAClBvB,EAAKuB,EAAI,GAGPvB,EAAKO,EAAI,IACXP,EAAKO,EAAI,GAEPP,EAAKU,EAAI,IACXV,EAAKU,EAAI,GAGPV,EAAKO,EAAIP,EAAKsB,EAAInC,KAAK6H,SACrB6D,EACF7K,EAAKsB,EAAInC,KAAK6H,OAAShH,EAAKO,EAE5BP,EAAKO,EAAIpB,KAAK6H,OAAShH,EAAKsB,GAG5BnC,KAAKyJ,QAAU5I,EAAKU,EAAIV,EAAKuB,EAAIpC,KAAKyJ,SACpCiC,EACF7K,EAAKuB,EAAIpC,KAAKyJ,OAAS5I,EAAKU,EAE5BV,EAAKU,EAAIvB,KAAKyJ,OAAS5I,EAAKuB,GAIzBvB,EAGF,cAAcqL,GAEnB,GAAIA,EAAQ,CACV,IAAIC,EAA6B,GAUjC,OATAnM,KAAK0J,MAAMP,SAAQoB,IACbA,EAAEO,SACAP,EAAEhJ,IAAMgJ,EAAE6B,QAAU7B,EAAEnJ,IAAMmJ,EAAE8B,QAAU9B,EAAEpI,IAAMoI,EAAE+B,QAAU/B,EAAEnI,IAAMmI,EAAEgC,cACjEhC,EAAEO,OAETqB,EAAUjI,KAAKqG,OAId4B,EAGT,OAAOnM,KAAK0J,MAAM8C,QAAOjC,GAAKA,EAAEO,SAI1B,QAAQpB,EAAyC+C,GAAY,GACnE,GAAIzM,KAAK8J,UAAa,OAAO9J,KAE7B,IAAI0M,GADJhD,OAAmB1E,IAAV0E,EAAsB,GAAMiD,MAAMC,QAAQlD,GAASA,EAAQ,CAACA,IAC9CmD,OAAO7M,KAAK8M,iBAInC,OAHI9M,KAAKwJ,UACPxJ,KAAKwJ,SAASkD,EAAYD,GAErBzM,KAGF,aACL,OAAIA,KAAK8J,WACT9J,KAAK0J,MAAMP,SAAQoB,WAAcA,EAAEO,UADN9K,KAKxB,QAAQa,EAAqBkM,GAAkB,GAGpD,IAFAlM,EAAOb,KAAKsD,YAAYzC,IAEfgB,aAAc,CACrB7B,KAAKkK,aAEL,IAAK,IAAIgB,EAAI,KAAMA,EAAG,CACpB,IAAI9J,EAAI8J,EAAIlL,KAAK6H,OACbtG,EAAIF,KAAKqG,MAAMwD,EAAIlL,KAAK6H,QAC5B,GAAIzG,EAAIP,EAAKsB,EAAInC,KAAK6H,OACpB,SAEF,IAAIyD,EAAM,CAAClK,IAAGG,IAAGY,EAAGtB,EAAKsB,EAAGC,EAAGvB,EAAKuB,GACpC,IAAKpC,KAAK0J,MAAMY,MAAKC,GAAK,EAAAhG,MAAMmG,cAAcY,EAAKf,IAAI,CAACnJ,IAAGG,IAAGV,SAAQ,CACpEA,EAAKO,EAAIA,EACTP,EAAKU,EAAIA,SACFV,EAAKgB,aACZ,QAaN,OARA7B,KAAK0J,MAAMxF,KAAKrD,GACZkM,GACF/M,KAAK0E,WAAWR,KAAKrD,GAGvBb,KAAKgN,eAAenM,GACpBb,KAAKgK,aACLhK,KAAKiK,UACEpJ,EAGF,WAAWA,EAAqB4L,GAAY,EAAMQ,GAAe,GAYtE,OAXIA,GACFjN,KAAKiE,aAAaC,KAAKrD,GAEzBA,EAAKuD,IAAM,KAGXpE,KAAK0J,MAAMwD,OAAOlN,KAAK0J,MAAMyD,WAAU5C,GAAKA,IAAM1J,IAAO,GACpDb,KAAK8H,OACR9H,KAAKgK,aAEPhK,KAAKiK,QAAQpJ,EAAM4L,GACZzM,KAGF,UAAUyM,GAAY,GAE3B,cADOzM,KAAKoN,SACc,IAAtBpN,KAAK0J,MAAMiB,SACX8B,GACFzM,KAAK0J,MAAMP,SAAQoB,IAAOA,EAAEnG,IAAM,QAEpCpE,KAAKiE,aAAejE,KAAK0J,MACzB1J,KAAK0J,MAAQ,GACb1J,KAAKiK,QAAQjK,KAAKiE,aAAcwI,IANMzM,KAUjC,YAAYa,EAAqBO,EAAWG,EAAWY,EAAYC,GACxE,IAAKpC,KAAKqN,sBAAsBxM,EAAMO,EAAGG,EAAGY,EAAGC,GAC7C,OAAO,EAET,IAMIkL,EANAlD,EAAYC,QAAQrK,KAAK0J,MAAMY,MAAKC,GAAKA,EAAE5D,UAE/C,IAAK3G,KAAKyJ,SAAWW,EACnB,OAAO,EAIT,IAAImD,EAAQ,IAAIhE,EACdvJ,KAAK6H,OACL,KACA7H,KAAK8H,MACL,EACA9H,KAAK0J,MAAM8D,KAAIjD,GACTA,IAAM1J,GACRyM,EAAa,EAAA/I,MAAMgJ,MAAMhD,GAClB+C,GAEF,EAAA/I,MAAMgJ,MAAMhD,MAGvB,IAAK+C,EAAe,OAAO,EAE3BC,EAAM5L,SAAS2L,EAAYlM,EAAGG,EAAGY,EAAGC,GAEpC,IAAIqL,GAAU,EAUd,OATIrD,IACFqD,EAAUA,IAAYpD,QAAQkD,EAAM7D,MAAMY,MAAKC,GACtCA,IAAM+C,GAAcjD,QAAQE,EAAE5D,SAAW0D,QAAQE,EAAEO,YAG1D9K,KAAKyJ,SACPgE,EAAUA,GAAYF,EAAMxF,UAAY/H,KAAKyJ,QAGxCgE,EAGF,+BAA+B5M,GACpC,IAAKb,KAAKyJ,OACR,OAAO,EAGT,IAAI8D,EAAQ,IAAIhE,EACdvJ,KAAK6H,OACL,KACA7H,KAAK8H,MACL,EACA9H,KAAK0J,MAAM8D,KAAIjD,GAAK,EAAAhG,MAAMgJ,MAAMhD,MAElC,OADAgD,EAAMvL,QAAQnB,GACP0M,EAAMxF,UAAY/H,KAAKyJ,OAGzB,sBAAsB5I,EAAqBO,EAAWG,EAAWY,EAAWC,GAWjF,MAViB,iBAANhB,IAAkBA,EAAIP,EAAKO,GACrB,iBAANG,IAAkBA,EAAIV,EAAKU,GACrB,iBAANY,IAAkBA,EAAItB,EAAKsB,GACrB,iBAANC,IAAkBA,EAAIvB,EAAKuB,GAElCvB,EAAKkL,OAAQ5J,EAAId,KAAK2K,IAAI7J,EAAGtB,EAAKkL,OAClClL,EAAKoL,OAAQ7J,EAAIf,KAAK2K,IAAI5J,EAAGvB,EAAKoL,OAClCpL,EAAK0G,OAAQpF,EAAId,KAAKC,IAAIa,EAAGtB,EAAK0G,OAClC1G,EAAK2G,OAAQpF,EAAIf,KAAKC,IAAIc,EAAGvB,EAAK2G,OAElC3G,EAAKO,IAAMA,GAAKP,EAAKU,IAAMA,GAAKV,EAAKsB,IAAMA,GAAKtB,EAAKuB,IAAMA,EAM1D,SAASvB,EAAqBO,EAAWG,EAAWY,EAAYC,EAAYsL,GACjF,GAAI7M,EAAK8F,OAAU,OAAO,KACT,iBAANvF,IAAkBA,EAAIP,EAAKO,GACrB,iBAANG,IAAkBA,EAAIV,EAAKU,GACrB,iBAANY,IAAkBA,EAAItB,EAAKsB,GACrB,iBAANC,IAAkBA,EAAIvB,EAAKuB,GAGtC,IAAIsJ,EAAY7K,EAAKsB,IAAMA,GAAKtB,EAAKuB,IAAMA,EACvC+H,EAAoB,CAAE/I,IAAGG,IAAGY,IAAGC,IAAG2J,KAAMlL,EAAKkL,KAAME,KAAMpL,EAAKoL,KAAM1E,KAAM1G,EAAK0G,KAAMC,KAAM3G,EAAK2G,MAEpG,OADA2C,EAAKnK,KAAKsD,YAAY6G,EAAIuB,GACtB7K,EAAKO,IAAM+I,EAAG/I,GAAKP,EAAKU,IAAM4I,EAAG5I,GAAKV,EAAKsB,IAAMgI,EAAGhI,GAAKtB,EAAKuB,IAAM+H,EAAG/H,EAClE,MAGTvB,EAAKiK,QAAS,EAEdjK,EAAKO,EAAIP,EAAKyH,YAAc6B,EAAG/I,EAC/BP,EAAKU,EAAIV,EAAK0H,YAAc4B,EAAG5I,EAC/BV,EAAKsB,EAAItB,EAAKuH,YAAc+B,EAAGhI,EAC/BtB,EAAKuB,EAAIvB,EAAKwH,YAAc8B,EAAG/H,EAE/BpC,KAAKgN,eAAenM,GACf6M,IACH1N,KAAKgK,aACLhK,KAAKiK,WAEApJ,GAGF,SACL,OAAOb,KAAK0J,MAAMiE,QAAO,CAACC,EAAMrD,IAAMlJ,KAAKC,IAAIsM,EAAMrD,EAAEhJ,EAAIgJ,EAAEnI,IAAI,GAG5D,YAAYvB,GACjB,OAAIA,EAAKsK,YACTtK,EAAKsK,WAAY,EACjBnL,KAAK0J,MAAMP,SAAQoB,IAAOA,EAAEa,OAASb,EAAEhJ,MAFZvB,KAMtB,YACL,IAAIuK,EAAIvK,KAAK0J,MAAMY,MAAKC,GAAKA,EAAEY,YAK/B,OAJIZ,WACKA,EAAEY,UACTnL,KAAK0J,MAAMP,SAAQoB,WAAcA,EAAEa,WAE9BpL,KAIF,KAAK6N,GAAc,GACxB,IAAIC,EAA2B,GAe/B,OAdA,EAAAvJ,MAAM0G,KAAKjL,KAAK0J,OAChB1J,KAAK0J,MAAMP,SAAQoB,IACjB,IAAIpI,EAAmB,GACvB,IAAK,IAAI4L,KAAOxD,EAAoB,MAAXwD,EAAI,IAAyB,OAAXxD,EAAEwD,SAA4B/I,IAAXuF,EAAEwD,KAAqB5L,EAAE4L,GAAOxD,EAAEwD,IAE3FF,UAAoB1L,EAAEpC,UACpBoC,EAAEO,KAEJP,EAAEN,qBAAqBM,EAAEN,aACzBM,EAAE2E,iBAAiB3E,EAAE2E,SACrB3E,EAAEyE,eAAezE,EAAEyE,OACnBzE,EAAEwE,eAAexE,EAAEwE,OACxBmH,EAAQ5J,KAAK/B,MAER2L,EAIF,mBAAmBpE,GACxB,OAAK1J,KAAKoN,UAAYpN,KAAKgO,0BAE3BhO,KAAKoN,SAASjE,SAAQ,CAAC8E,EAAQpG,KAC7B,IAAKoG,GAAUpG,IAAW7H,KAAK6H,OAAQ,OAAO7H,KAC1C6H,EAAS7H,KAAK6H,OAChB7H,KAAKoN,SAASvF,QAAU7C,EAKxB0E,EAAMP,SAAQtI,IACZ,IAAI0J,EAAI0D,EAAO3D,MAAK4D,GAAKA,EAAE9J,MAAQvD,EAAKuD,MACxC,IAAKmG,EAAG,OAAOvK,KACf,IAAImO,EAAQtG,EAAS7H,KAAK6H,OAGtBhH,EAAKU,IAAMV,EAAKuL,SAClB7B,EAAEhJ,GAAMV,EAAKU,EAAIV,EAAKuL,QAGpBvL,EAAKO,IAAMP,EAAKwL,SAClB9B,EAAEnJ,EAAIC,KAAK2B,MAAMnC,EAAKO,EAAI+M,IAGxBtN,EAAKsB,IAAMtB,EAAKyL,SAClB/B,EAAEpI,EAAId,KAAK2B,MAAMnC,EAAKsB,EAAIgM,UAzB0BnO,KA6CvD,iBAAiBoO,EAAmBvG,EAAgB6B,EAAwBuE,EAAwB,aACzG,IAAKjO,KAAK0J,MAAMiB,QAAUyD,IAAcvG,EAAU,OAAO7H,KAMzD,GAHAA,KAAKqO,YAAYrO,KAAK0J,MAAO0E,GAGd,IAAXvG,GAAgB6B,GAASA,EAAMiB,OAAQ,CACzC,IAAIzJ,EAAM,EACVwI,EAAMP,SAAQoB,IACZA,EAAEnJ,EAAI,EACNmJ,EAAEpI,EAAI,EACNoI,EAAEhJ,EAAIF,KAAKC,IAAIiJ,EAAEhJ,EAAGL,GACpBA,EAAMqJ,EAAEhJ,EAAIgJ,EAAEnI,UAGhBsH,EAAQ,EAAAnF,MAAM0G,KAAKjL,KAAK0J,OAAQ,EAAG0E,GAIrC,IAAIE,EAAatO,KAAKoN,SAASvF,IAAW,GAEtC0G,EAAYvO,KAAKoN,SAASzC,OAAS,EACb,IAAtB2D,EAAW3D,QAAgB9C,EAASuG,GAAavG,EAAS0G,IAC5DD,EAAatO,KAAKoN,SAASmB,IAAc,GACrCD,EAAW3D,SAEbyD,EAAYG,EACZD,EAAWnF,SAAQqF,IACjB,IAAIC,EAAI/E,EAAMyD,WAAU5C,GAAKA,EAAEnG,MAAQoK,EAAUpK,OACtC,IAAPqK,IAEF/E,EAAM+E,GAAGrN,EAAIoN,EAAUpN,EACvBsI,EAAM+E,GAAGlN,EAAIiN,EAAUjN,EACvBmI,EAAM+E,GAAGtM,EAAIqM,EAAUrM,MAG3BmM,EAAa,KAKjB,IAAII,EAA4B,GAahC,GAZAJ,EAAWnF,SAAQqF,IACjB,IAAIC,EAAI/E,EAAMyD,WAAU5C,GAAKA,EAAEnG,MAAQoK,EAAUpK,OACtC,IAAPqK,IAEF/E,EAAM+E,GAAGrN,EAAIoN,EAAUpN,EACvBsI,EAAM+E,GAAGlN,EAAIiN,EAAUjN,EACvBmI,EAAM+E,GAAGtM,EAAIqM,EAAUrM,EACvBuM,EAASxK,KAAKwF,EAAM+E,IACpB/E,EAAMwD,OAAOuB,EAAG,OAIhB/E,EAAMiB,OACR,GAAsB,mBAAXsD,EACTA,EAAOpG,EAAQuG,EAAWM,EAAUhF,OAC/B,CACL,IAAIyE,EAAQtG,EAASuG,EACjBO,EAAmB,SAAXV,GAAgC,cAAXA,EAC7BW,EAAoB,UAAXX,GAAiC,cAAXA,EACnCvE,EAAMP,SAAQtI,IACZA,EAAKO,EAAgB,IAAXyG,EAAe,EAAK8G,EAAOtN,KAAK2B,MAAMnC,EAAKO,EAAI+M,GAAS9M,KAAK2K,IAAInL,EAAKO,EAAGyG,EAAS,GAC5FhH,EAAKsB,EAAiB,IAAX0F,GAA8B,IAAduG,EAAmB,EAC5CQ,EAASvN,KAAK2B,MAAMnC,EAAKsB,EAAIgM,IAAU,EAAM9M,KAAK2K,IAAInL,EAAKsB,EAAG0F,GAChE6G,EAASxK,KAAKrD,MAEhB6I,EAAQ,GAeZ,OAVAgF,EAAW,EAAAnK,MAAM0G,KAAKyD,GAAW,EAAG7G,GACpC7H,KAAKgO,0BAA2B,EAChChO,KAAK4K,cACL5K,KAAK0J,MAAQ,GACbgF,EAASvF,SAAQtI,IACfb,KAAKgC,QAAQnB,GAAM,GACnBA,EAAKiK,QAAS,IACb9K,MACHA,KAAK+K,gBACE/K,KAAKgO,yBACLhO,KAIF,cAQL,OAPAA,KAAK0J,MAAMP,SAAQoB,IACjBA,EAAE8B,OAAS9B,EAAEnJ,EACbmJ,EAAE6B,OAAS7B,EAAEhJ,EACbgJ,EAAE+B,OAAS/B,EAAEpI,EACboI,EAAEgC,OAAShC,EAAEnI,SACNmI,EAAEO,UAEJ9K,KASF,YAAY0J,EAAwB7B,EAAgBgH,GAAQ,GACjE,IAAIC,EAAiB,GAOrB,OANApF,EAAMP,SAAQ,CAACoB,EAAGW,KAChBX,EAAEnG,IAAMmG,EAAEnG,KAAOmF,EAAgBoC,SACjCmD,EAAK5D,GAAK,CAAC9J,EAAGmJ,EAAEnJ,EAAGG,EAAGgJ,EAAEhJ,EAAGY,EAAGoI,EAAEpI,EAAGiC,IAAKmG,EAAEnG,QAE5CpE,KAAKoN,SAAWyB,EAAQ,GAAK7O,KAAKoN,UAAY,GAC9CpN,KAAKoN,SAASvF,GAAUiH,EACjB9O,KAKF,YAAYa,GACjB,IAAK,IAAIkO,KAAQlO,EACC,MAAZkO,EAAK,WAAmBlO,EAAKkO,GAEnC,OAAO/O,MApoBX,oBAiBiB,EAAA2L,OAAS,G,iaC5B1B,cACA,SAEA,SAGA,YACA,YACA,WACA,YAmCA,MAAatL,EA6FX,YAAmBN,EAAqBS,EAAyB,IAb1D,KAAAsE,gBAAkB,GAcvB9E,KAAKD,GAAKA,EACVS,EAAOA,GAAQ,GAEf,EAAAwO,aAAaxO,EAAM,iBAAkB,SAAU,QAE/C,EAAAyO,aAAajP,KAAKD,GAAI,yBAA0B,iBAAkB,UAG9DS,EAAK0O,MACP1O,EAAK2O,OAAS3O,EAAKiJ,OAASjJ,EAAK0O,WAC1B1O,EAAK0O,KAEd,IAAIE,EAAU,EAAA7K,MAAM8K,SAAStP,EAAG+C,aAAa,WAGzC8I,EAA6B,CAC/B/D,OAAQ,EAAAtD,MAAM8K,SAAStP,EAAG+C,aAAa,eAAiB,GACxDqM,OAAQC,GAAoB,EAAA7K,MAAM8K,SAAStP,EAAG+C,aAAa,gBAAkB,EAC7E2G,OAAQ2F,GAAoB,EAAA7K,MAAM8K,SAAStP,EAAG+C,aAAa,gBAAkB,EAC7EwM,UAAW,kBACXC,iBAAkB,yBAClBC,gBAAiB,GACjBC,OAAQ,2BACRC,YAAa,KACbC,aAAa,EACbjJ,WAAY,OACZkJ,OAAQ,GACRC,MAAM,EACNC,SAAU,IACVhI,OAAO,EACPrH,WAAY,EAAA8D,MAAMwL,OAAOhQ,EAAG+C,aAAa,gBAAiB,EAC1DkN,OAAQ,wBAA0C,IAAhB3O,KAAK4O,UAAkBC,QAAQ,GACjEC,SAAS,EACTC,uBAAwB5P,EAAK4P,yBAA0B,EACvDlQ,UAAW,CACTmQ,UAAY7P,EAAK4P,uBACjBE,QAAS,MAEXrQ,UAAW,CACTwP,QAASjP,EAAKkP,YAAc,IAAMlP,EAAKkP,YAAelP,EAAKiP,OAASjP,EAAKiP,OAAS,KAAQ,2BAC1Fc,QAAQ,EACRC,SAAU,QAEZjK,YAAQvB,EACRyB,cAAgB,CACdgK,OAAQ,UACRhB,OAAQ,2BACRc,QAAQ,EACRC,SAAU,QAEZ3J,aAAa,EACbE,eAAe,EACf2J,IAAK,OACLpL,WAAW,EACXK,iBAAkB,CAChBlD,OAAQ,KAAOjC,EAAK8O,WAAa,oBAEnClJ,cAAe,IACfuK,WAAY,KACZC,eAAgB,KAChBC,sBAAsB,EACtBC,sBAAsB,GAwBxB,GAtBI/Q,EAAG+C,aAAa,gBAClB8I,EAASuE,QAAU,EAAA5L,MAAMwL,OAAOhQ,EAAG+C,aAAa,gBAGlD9C,KAAKQ,KAAO,EAAA+D,MAAMqH,SAASpL,EAAMoL,GACjCpL,EAAO,KACPR,KAAK+Q,aAEiB,SAAlB/Q,KAAKQ,KAAKkQ,MACZ1Q,KAAKQ,KAAKkQ,IAA6B,QAAvB3Q,EAAGiR,MAAMC,WAGvBjR,KAAKQ,KAAKkQ,KACZ1Q,KAAKD,GAAGkG,UAAUC,IAAI,kBAGxBlG,KAAKQ,KAAK0Q,UAAmE,OAAvD,EAAA3M,MAAM4M,eAAenR,KAAKD,GAAIC,KAAKQ,KAAK8O,WAC1DtP,KAAKQ,KAAK0Q,WACZlR,KAAKD,GAAGkG,UAAUC,IAAI,qBAGxBlG,KAAKoR,kBAA8C,SAAzBpR,KAAKQ,KAAKkG,WAChC1G,KAAKoR,kBAAmB,CAE1B,IAAIC,GAAgBrR,KAAKQ,KAAK8Q,YAA0BtR,KAAKQ,KAAK+Q,WAC7DvR,KAAKQ,KAAKgR,UAAwBxR,KAAKQ,KAAKiR,aACjDzR,KAAK0G,WAAW1G,KAAKkD,YAAcmO,GAAY,QAE/CrR,KAAK0G,WAAW1G,KAAKQ,KAAKkG,YAAY,GAsBxC,GAnBA1G,KAAKD,GAAGkG,UAAUC,IAAIlG,KAAKQ,KAAKwP,QAEhChQ,KAAK0R,kBACL1R,KAAK2R,gBAEL3R,KAAKyB,OAAS,IAAI,EAAA8H,gBAAgBvJ,KAAKQ,KAAKqH,QAAQ,CAAC+J,EAASnF,GAAY,KACxE,IAAIR,EAAO,EACXjM,KAAKyB,OAAOiI,MAAMP,SAAQoB,IAAO0B,EAAO5K,KAAKC,IAAI2K,EAAM1B,EAAEhJ,EAAIgJ,EAAEnI,MAC/DwP,EAAQzI,SAAQoB,IACd,IAAIxK,EAAKwK,EAAExK,GACP0M,GAAuB,OAAVlC,EAAEnG,IACbrE,GAAMA,EAAG6D,YAAc7D,EAAG6D,WAAWiO,YAAY9R,GAErDC,KAAKiC,YAAYlC,EAAIwK,EAAEnJ,EAAGmJ,EAAEhJ,EAAGgJ,EAAEpI,EAAGoI,EAAEnI,MAG1CpC,KAAK2R,eAAc,EAAO1F,KACzBjM,KAAKQ,KAAKsH,MAAO9H,KAAKQ,KAAKiJ,QAE1BzJ,KAAKQ,KAAKqP,KAAM,CAClB,IAAIiC,EAA2C,GAC/C9R,KAAK+R,eAAe5I,SAAQpJ,IAC1B,IAAIqB,EAAI2B,SAAShD,EAAG+C,aAAa,SAC7BvB,EAAIwB,SAAShD,EAAG+C,aAAa,SACjCgP,EAAS5N,KAAK,CACZnE,KAEAmL,GAAIW,OAAOC,MAAM1K,GAAK,IAAOA,IAAMyK,OAAOC,MAAMvK,GAAK,IAAOA,GAAKvB,KAAKQ,KAAKqH,YAG/EiK,EAAS7G,MAAK+G,GAAKA,EAAE9G,IAAG/B,SAAQ8I,IAAUjS,KAAKkS,gBAAgBD,EAAKlS,OAEtEC,KAAKyB,OAAO0Q,cAEZnS,KAAKoS,aAAapS,KAAKQ,KAAK2P,SAE5B,IAAIkC,EAAmB7M,SAAS8M,cAAc,OAC9CD,EAAiBE,UAAY,sBAC7BF,EAAiBG,UAAYxS,KAAKQ,KAAKgP,gBACvCxP,KAAKkC,YAAcsD,SAAS8M,cAAc,OAC1CtS,KAAKkC,YAAY+D,UAAUC,IAAIlG,KAAKQ,KAAK+O,iBAAkB3D,EAAS0D,UAAWtP,KAAKQ,KAAK8O,WACzFtP,KAAKkC,YAAYG,YAAYgQ,GAE7BrS,KAAK4B,yBAEL5B,KAAKsG,eACLtG,KAAKqF,mBACLrF,KAAKO,qBACLP,KAAKyS,2BA7NA,YAAYC,EAA4B,GAAIC,EAA+B,eAChF,IAAI5S,EAAKM,EAAUuS,eAAeD,GAClC,OAAK5S,GASAA,EAAG8S,YACN9S,EAAG8S,UAAY,IAAIxS,EAAUN,EAAI,EAAAwE,MAAMgJ,MAAMmF,KAExC3S,EAAG8S,YAXkB,iBAAfF,EACTG,QAAQC,MAAM,wDAA0DJ,EAA1D,+IAGdG,QAAQC,MAAM,gDAET,MAiBJ,eAAeL,EAA4B,GAAI/P,EAAW,eAC/D,IAAIqQ,EAAqB,GAWzB,OAVA3S,EAAU4S,gBAAgBtQ,GAAUwG,SAAQpJ,IACrCA,EAAG8S,YACN9S,EAAG8S,UAAY,IAAIxS,EAAUN,EAAI,EAAAwE,MAAMgJ,MAAMmF,KAE/CM,EAAM9O,KAAKnE,EAAG8S,cAEK,IAAjBG,EAAMrI,QACRmI,QAAQC,MAAM,wDAA0DpQ,EAA1D,+IAGTqQ,EAyMF,UAAUhK,EAA0C0J,GAGzD,GAAIQ,UAAUvI,OAAS,EAAG,CACxBmI,QAAQK,KAAK,kIAEb,IAAIC,EAAIF,UAAWhI,EAAI,EACrBmI,EAAuB,CAAEjS,EAAEgS,EAAElI,KAAM3J,EAAE6R,EAAElI,KAAM/I,EAAEiR,EAAElI,KAAM9I,EAAEgR,EAAElI,KAAMrJ,aAAauR,EAAElI,KAC9E3D,KAAK6L,EAAElI,KAAMa,KAAKqH,EAAElI,KAAM1D,KAAK4L,EAAElI,KAAMe,KAAKmH,EAAElI,KAAMoI,GAAGF,EAAElI,MAC7D,OAAOlL,KAAKuT,UAAUvK,EAAKqK,GAO7B,IAAItT,EACJ,GAAmB,iBAARiJ,EAAkB,CAC3B,IAAIwK,EAAMhO,SAASiO,eAAeC,qBAClCF,EAAIG,KAAKnB,UAAYxJ,EACrBjJ,EAAKyT,EAAIG,KAAKC,SAAS,QAClB,GAAyB,IAArBV,UAAUvI,QAAqC,IAArBuI,UAAUvI,cAR9B3F,KADU7C,EASsD6G,GARtE5H,QAA2B4D,IAAR7C,EAAEZ,QAA2ByD,IAAR7C,EAAEA,QAA2B6C,IAAR7C,EAAEC,QAAiC4C,IAAd7C,EAAE0R,SAQR,CACrF,IAAIA,EAAU7K,GAAOA,EAAwB6K,SAAgB,GAC7DnB,EAAU1J,EACV,IAAIwK,EAAMhO,SAASiO,eAAeC,qBAClCF,EAAIG,KAAKnB,UAAY,qEAAqEqB,gBAC1F9T,EAAKyT,EAAIG,KAAKC,SAAS,QAEvB7T,EAAKiJ,EAhBP,IAA2B7G,EAsB3B,IAAI2R,EAAU9T,KAAK+T,UAAUhU,GAc7B,OAbA2S,EAAU,OAAH,UAAQA,GAAW,IAC1B,EAAAnO,MAAMqH,SAAS8G,EAASoB,GACxB9T,KAAKyB,OAAO6B,YAAYoP,GACxB1S,KAAKyE,WAAW1E,EAAI2S,GAEpB1S,KAAKD,GAAGsC,YAAYtC,GAGpBC,KAAKkS,gBAAgBnS,GAAI,EAAM2S,GAC/B1S,KAAK4B,yBACL5B,KAAK2E,mBACL3E,KAAK4E,sBAEE7E,EAIF,KAAKiU,GAAc,GACxB,IAAIC,EAAOjU,KAAKyB,OAAOyS,KAAKF,GAY5B,OAVIA,GACFC,EAAK9K,SAAQoB,IACX,GAAIA,EAAExK,GAAI,CACR,IAAIoU,EAAM5J,EAAExK,GAAG0F,cAAc,4BAC7B8E,EAAEsJ,QAAUM,EAAMA,EAAI3B,eAAYxN,EAC7BuF,EAAEsJ,gBAAgBtJ,EAAEsJ,eAClBtJ,EAAExK,OAIRkU,EAaF,KAAKhG,EAA2BmG,GAAwE,GAC7G,IAAIC,EAAQhU,EAAUkE,MAAM0G,KAAKgD,GAAS,EAAGjO,KAAKsU,aAAetU,KAAKQ,KAAKqH,QAIvE7H,KAAKsU,aAAetU,KAAKsU,cAAgBtU,KAAKQ,KAAKqH,QAAUwM,EAAME,MAAKhK,GAAMA,EAAEnJ,EAAImJ,EAAEpI,EAAKnC,KAAKQ,KAAKqH,WACvG7H,KAAKgO,0BAA2B,EAChChO,KAAKyB,OAAO4M,YAAYgG,EAAOrU,KAAKsU,aAAa,IAGnD,IAAIE,EAA2B,GAoC/B,OAnCAxU,KAAK4K,cAEDwJ,GACc,IAAIpU,KAAKyB,OAAOiI,OACtBP,SAAQoB,IACL8J,EAAM/J,MAAKnI,GAAKoI,EAAE+I,KAAOnR,EAAEmR,OAEP,mBAAnB,EACRc,EAAa7J,GAAG,IAEhBiK,EAAQtQ,KAAKqG,GACbvK,KAAKyU,aAAalK,EAAExK,IAAI,GAAM,QAMtCsU,EAAMlL,SAAQhH,IACZ,IAAI8P,EAAQ9P,EAAEmR,IAAe,IAATnR,EAAEmR,GAAYtT,KAAKyB,OAAOiI,MAAMY,MAAKC,GAAKA,EAAE+I,KAAOnR,EAAEmR,UAAMtO,EAC3EiN,EACFjS,KAAK0U,OAAOzC,EAAKlS,GAAIoC,GACZiS,IACoB,mBAAnB,EACRA,EAAajS,GAAG,GAEhBnC,KAAKuT,UAAUpR,OAIrBnC,KAAKyB,OAAOwC,aAAeuQ,EAC3BxU,KAAK+K,gBAGE/K,KAAKgO,yBAELhO,KAMF,cAEL,OADAA,KAAKyB,OAAOmJ,cACL5K,KAMF,cAAc2U,GAAa,GAChC,GAAI3U,KAAKQ,KAAKkG,YAAuC,SAAzB1G,KAAKQ,KAAKkG,cACjCiO,IAAe3U,KAAKQ,KAAKoQ,gBAA+C,OAA7B5Q,KAAKQ,KAAKoQ,gBACxD,OAAO5Q,KAAKQ,KAAKkG,WAInB,IAAI3G,EAAKC,KAAKD,GAAG0F,cAAc,IAAMzF,KAAKQ,KAAK8O,WAC3CnH,EAAS,EAAA5D,MAAM8K,SAAStP,EAAG+C,aAAa,SAC5C,OAAOzB,KAAK2B,MAAMjD,EAAGoD,aAAegF,GAc/B,WAAWc,EAAqByL,GAAS,GAC9C,IAAIE,EAAO,EAAArQ,MAAMsQ,YAAY5L,GAC7B,OAAIjJ,KAAKQ,KAAKoQ,iBAAmBgE,EAAKE,MAAQ9U,KAAKQ,KAAKkG,aAAekO,EAAKxS,IAG5EpC,KAAKQ,KAAKoQ,eAAiBgE,EAAKE,KAChC9U,KAAKQ,KAAKkG,WAAakO,EAAKxS,EAExBsS,GACF1U,KAAK2R,eAAc,GAErB3R,KAAK0I,mBAAmB1I,KAAKD,KARpBC,KAeJ,YACL,OAAOA,KAAKD,GAAGkD,YAAcjD,KAAKQ,KAAKqH,OAMlC,SAKL,OAJA7H,KAAKyB,OAAOsJ,SACZ/K,KAAKmE,sBACLnE,KAAK2E,mBACL3E,KAAK4E,sBACE5E,KAIF,UAGL,OAFAA,KAAKyB,OAAOsT,UACZ/U,KAAK4E,sBACE5E,KAYF,OAAO6H,EAAgBoG,EAAwB,aACpD,GAAIjO,KAAKQ,KAAKqH,SAAWA,EAAU,OAAO7H,KAC1C,IAeIgV,EAfA5G,EAAYpO,KAAKQ,KAAKqH,OA8B1B,OA1Be,IAAXA,EACF7H,KAAKsU,YAAclG,SAEZpO,KAAKsU,YAGdtU,KAAKD,GAAGkG,UAAUpC,OAAO,cAAgBuK,GACzCpO,KAAKD,GAAGkG,UAAUC,IAAI,cAAgB2B,GACtC7H,KAAKQ,KAAKqH,OAAS7H,KAAKyB,OAAOoG,OAASA,EAIzB,IAAXA,GAAgB7H,KAAKQ,KAAKsQ,uBAC5BkE,EAAW,GACXhV,KAAK+R,eAAe5I,SAAQpJ,IACtBA,EAAGI,eAAiB6U,EAAS9Q,KAAKnE,EAAGI,kBAEtC6U,EAASrK,SAAUqK,OAAWhQ,IAErChF,KAAKyB,OAAOwT,iBAAiB7G,EAAWvG,EAAQmN,EAAU/G,GAG1DjO,KAAKgO,0BAA2B,EAChChO,KAAK4E,6BACE5E,KAAKgO,yBAELhO,KAMF,YACL,OAAOA,KAAKQ,KAAKqH,OAIZ,eACL,OAAO8E,MAAMuI,KAAKlV,KAAKD,GAAG6T,UACvBpH,QAAQzM,GAAoBA,EAAG6C,QAAQ,IAAM5C,KAAKQ,KAAK8O,aAAevP,EAAG6C,QAAQ,IAAM5C,KAAKQ,KAAK+O,oBAO/F,QAAQ9C,GAAY,GAazB,OAZAzM,KAAKyS,0BAAyB,GAC9BzS,KAAKmV,WAAU,GACV1I,EAKHzM,KAAKD,GAAG6D,WAAWiO,YAAY7R,KAAKD,KAJpCC,KAAKoV,UAAU3I,GACfzM,KAAKD,GAAGkG,UAAUpC,OAAO7D,KAAKQ,KAAKwP,eAC5BhQ,KAAKD,GAAG8S,WAIjB7S,KAAKqV,2BACErV,KAAKkC,mBACLlC,KAAKyB,OACLzB,KASF,UAIL,OAHAA,KAAKsV,YAAW,GAChBtV,KAAKuV,cAAa,GAClBvV,KAAKwV,cAAc,WACZxV,KASF,SAIL,OAHAA,KAAKsV,YAAW,GAChBtV,KAAKuV,cAAa,GAClBvV,KAAKwV,cAAc,UACZxV,KAUF,WAAWyV,EAAmBC,GAAoB,GACvD,OAAID,GAAYzV,KAAKQ,KAAKC,aAC1BT,KAAK+R,eAAe5I,SAAQpJ,GAAMC,KAAK+I,QAAQhJ,EAAI0V,KAC/CC,IACF1V,KAAKQ,KAAKqG,aAAe4O,IAHoBzV,KAc1C,aAAayV,EAAmBC,GAAoB,GACzD,OAAID,GAAYzV,KAAKQ,KAAKC,aAC1BT,KAAK+R,eAAe5I,SAAQpJ,GAAMC,KAAKE,UAAUH,EAAI0V,KACjDC,IACF1V,KAAKQ,KAAKuG,eAAiB0O,IAHkBzV,KAW1C,MAAMiJ,GAUX,OAFAjJ,KAAKyB,OAAOqG,MAAQmB,EACpBjJ,KAAK4E,sBACE5E,KAMF,WACL,OAAOA,KAAKyB,OAAOqG,MAYd,iBAAiBR,EAAyBqO,GAAiB,GAChE,IAEIC,EAFAtK,EAAMtL,KAAKD,GAAG8V,wBAIhBD,EADED,EACa,CAACzU,IAAKoK,EAAIpK,IAAMsE,SAASsQ,gBAAgBC,UAAW/U,KAAMsK,EAAItK,MAG9D,CAACE,IAAKlB,KAAKD,GAAGiW,UAAWhV,KAAMhB,KAAKD,GAAGkW,YAGxD,IAAIC,EAAe5O,EAAStG,KAAO4U,EAAa5U,KAC5CmV,EAAc7O,EAASpG,IAAM0U,EAAa1U,IAE1CkV,EAAe9K,EAAIpD,MAAQlI,KAAKQ,KAAKqH,OACrCwO,EAAa/K,EAAInD,OAASpF,SAAS/C,KAAKD,GAAG+C,aAAa,mBAE5D,MAAO,CAAC1B,EAAGC,KAAKqG,MAAMwO,EAAeE,GAAc7U,EAAGF,KAAKqG,MAAMyO,EAAcE,IAI1E,SACL,OAAOhV,KAAKC,IAAItB,KAAKyB,OAAOsG,SAAU/H,KAAKQ,KAAK2O,QAU3C,YAAY/N,EAAWG,EAAWY,EAAWC,GAClD,OAAOpC,KAAKyB,OAAO6U,YAAYlV,EAAGG,EAAGY,EAAGC,GAcnC,WAAW4G,GAChB,IAAIjJ,EAAKM,EAAUkW,WAAWvN,GAK9B,OAJAhJ,KAAKkS,gBAAgBnS,GAAI,GACzBC,KAAK4B,yBACL5B,KAAK2E,mBACL3E,KAAK4E,sBACE7E,EAoBF,GAAGyW,EAAsBC,GAE9B,IAA2B,IAAvBD,EAAKE,QAAQ,KAGf,OAFYF,EAAKG,MAAM,KACjBxN,SAAQqN,GAAQxW,KAAK6C,GAAG2T,EAAMC,KAC7BzW,KAGT,GAAa,WAATwW,GAA8B,UAATA,GAA6B,YAATA,GAA+B,WAATA,GAA8B,YAATA,EAAoB,CAE1G,IAAII,EAAmB,WAATJ,GAA8B,YAATA,EAEjCxW,KAAK8E,gBAAgB0R,GADnBI,EAC4BhW,GAAiB6V,EAAS7V,GAE1BA,GAAuB6V,EAAS7V,EAAOA,EAAMiW,QAE7E7W,KAAKD,GAAG+W,iBAAiBN,EAAMxW,KAAK8E,gBAAgB0R,QAClC,cAATA,GAAiC,aAATA,GAAgC,gBAATA,GAAmC,eAATA,GAAkC,YAATA,EAG3GxW,KAAK8E,gBAAgB0R,GAAQC,EAE7B3D,QAAQiE,IAAI,gBAAkBP,EAAO,mHAEvC,OAAOxW,KAOF,IAAIwW,GAET,OAA2B,IAAvBA,EAAKE,QAAQ,MACHF,EAAKG,MAAM,KACjBxN,SAAQqN,GAAQxW,KAAK0D,IAAI8S,KACxBxW,OAGI,WAATwW,GAA8B,UAATA,GAA6B,YAATA,GAA+B,WAATA,GAA8B,YAATA,GAElFxW,KAAK8E,gBAAgB0R,IACvBxW,KAAKD,GAAGiX,oBAAoBR,EAAMxW,KAAK8E,gBAAgB0R,WAGpDxW,KAAK8E,gBAAgB0R,GAErBxW,MASF,aAAagJ,EAAuByD,GAAY,EAAMQ,GAAe,GAwB1E,OAvBA5M,EAAU6I,YAAYF,GAAKG,SAAQpJ,IACjC,GAAIA,EAAGoF,gBAAkBnF,KAAKD,GAAI,OAClC,IAAIc,EAAOd,EAAGI,cAETU,IACHA,EAAOb,KAAKyB,OAAOiI,MAAMY,MAAKC,GAAKxK,IAAOwK,EAAExK,MAEzCc,WAGEd,EAAGI,cACV,EAAAN,aAAaC,MAAM+D,OAAO9D,GAE1BC,KAAKyB,OAAOkC,WAAW9C,EAAM4L,EAAWQ,GAEpCR,GAAa1M,EAAGoF,eAClBpF,EAAG8D,aAGHoJ,IACFjN,KAAKmE,sBACLnE,KAAK4E,uBAEA5E,KAOF,UAAUyM,GAAY,GAQ3B,OANAzM,KAAKyB,OAAOiI,MAAMP,SAAQoB,WACjBA,EAAExK,GAAGI,cACZ,EAAAN,aAAaC,MAAM+D,OAAO0G,EAAExK,OAE9BC,KAAKyB,OAAO2T,UAAU3I,GACtBzM,KAAKmE,sBACEnE,KAOF,aAAaiX,GAMlB,OALIA,EACFjX,KAAKD,GAAGkG,UAAUC,IAAI,sBAEtBlG,KAAKD,GAAGkG,UAAUpC,OAAO,sBAEpB7D,KAQF,UAAUiJ,GACf,OAAIjJ,KAAKQ,KAAKC,aAAewI,IAC7BjJ,KAAKQ,KAAKC,WAAawI,EACvBjJ,KAAKyB,OAAOiI,MAAMP,SAAQoB,GAAKvK,KAAKoF,uBAAuBmF,KAC3DvK,KAAK0R,mBAHsC1R,KAYtC,OAAOgJ,EAAuBqK,GAGnC,GAAIH,UAAUvI,OAAS,EAAG,CACxBmI,QAAQK,KAAK,qHAEb,IAAIC,EAAIF,UAAWhI,EAAI,EAEvB,OADAmI,EAAM,CAAEjS,EAAEgS,EAAElI,KAAM3J,EAAE6R,EAAElI,KAAM/I,EAAEiR,EAAElI,KAAM9I,EAAEgR,EAAElI,MACnClL,KAAK0U,OAAO1L,EAAKqK,GA4D1B,OAzDAhT,EAAU6I,YAAYF,GAAKG,SAAQpJ,IACjC,IAAKA,IAAOA,EAAGI,cAAiB,OAChC,IAAIoK,EAAIxK,EAAGI,cACPgC,EAAI,OAAH,UAAOkR,UACLlR,EAAEN,aAGT,IACIqV,EADAC,EAAO,CAAC,IAAK,IAAK,IAAK,KAe3B,GAbIA,EAAK5C,MAAK6C,QAAcpS,IAAT7C,EAAEiV,IAAoBjV,EAAEiV,KAAO7M,EAAE6M,OAClDF,EAAI,GACJC,EAAKhO,SAAQiO,IACXF,EAAEE,QAAepS,IAAT7C,EAAEiV,GAAoBjV,EAAEiV,GAAK7M,EAAE6M,UAChCjV,EAAEiV,QAIRF,IAAM/U,EAAEoF,MAAQpF,EAAEqF,MAAQrF,EAAE4J,MAAQ5J,EAAE8J,QACzCiL,EAAI,IAIF/U,EAAE0R,QAAS,CACb,IAAIM,EAAMpU,EAAG0F,cAAc,4BACvB0O,GAAOA,EAAI3B,YAAcrQ,EAAE0R,UAC7BM,EAAI3B,UAAYrQ,EAAE0R,gBAEb1R,EAAE0R,QAIX,IAAIwD,GAAU,EACVC,GAAY,EAChB,IAAK,MAAMvJ,KAAO5L,EACD,MAAX4L,EAAI,IAAcxD,EAAEwD,KAAS5L,EAAE4L,KACjCxD,EAAEwD,GAAO5L,EAAE4L,GACXsJ,GAAU,EACVC,EAAYA,IAAetX,KAAKQ,KAAKC,aAAuB,aAARsN,GAA8B,WAARA,GAA4B,WAARA,IAK9FmJ,IACFlX,KAAKyB,OAAOK,aACZ9B,KAAKyB,OAAOM,YAAYwI,GACxBvK,KAAKyB,OAAOE,SAAS4I,EAAG2M,EAAE9V,EAAG8V,EAAE3V,EAAG2V,EAAE/U,EAAG+U,EAAE9U,GACzCpC,KAAK4B,yBACL5B,KAAK4E,sBACL5E,KAAKyB,OAAOoD,aAEVwS,GACFrX,KAAKyE,WAAW1E,EAAIwK,GAElB+M,GACFtX,KAAKoF,uBAAuBmF,MAGzBvK,KAOF,OAAOuX,GAGZ,KAFqC,iBAAVA,GAAsBA,EAAMZ,MAAM,KAAKhM,OAAS,GAExD,CACjB,IAAIiK,EAAO,EAAArQ,MAAMsQ,YAAY0C,GAC7B,GAAIvX,KAAKQ,KAAKmQ,aAAeiE,EAAKE,MAAQ9U,KAAKQ,KAAKoP,SAAWgF,EAAKxS,EAAG,OASzE,OANApC,KAAKQ,KAAKoP,OAAS2H,EACnBvX,KAAKQ,KAAKgR,UAAYxR,KAAKQ,KAAKiR,aAAezR,KAAKQ,KAAK+Q,WAAavR,KAAKQ,KAAK8Q,iBAActM,EAC9FhF,KAAK+Q,aAEL/Q,KAAK2R,eAAc,GAEZ3R,KAIF,YAAsB,OAAOA,KAAKQ,KAAKoP,OAmBvC,UAAUxO,EAAWG,EAAWY,EAAWC,EAAWP,GAC3D,OAAO7B,KAAKyB,OAAO+V,+BAA+B,CAACpW,IAAGG,IAAGY,IAAGC,IAAGP,iBAIzD,sBACN,GAAI7B,KAAKyB,OAAOqI,UAAa,OAAO9J,KACpC,IAAI8R,EAAW9R,KAAKyB,OAAOqL,eAAc,GAQzC,OAPIgF,GAAYA,EAASnH,SAClB3K,KAAKgO,0BACRhO,KAAKyB,OAAOgW,mBAAmB3F,GAEjC9R,KAAKwV,cAAc,SAAU1D,IAE/B9R,KAAKyB,OAAO0Q,cACLnS,KAID,mBACN,OAAIA,KAAKyB,OAAOqI,WACZ9J,KAAKyB,OAAOiD,YAAc1E,KAAKyB,OAAOiD,WAAWiG,OAAS,IACvD3K,KAAKgO,0BACRhO,KAAKyB,OAAOgW,mBAAmBzX,KAAKyB,OAAOiD,YAG7C1E,KAAKyB,OAAOiD,WAAWyE,SAAQoB,WAAcA,EAAEO,UAC/C9K,KAAKwV,cAAc,QAASxV,KAAKyB,OAAOiD,YACxC1E,KAAKyB,OAAOiD,WAAa,IARS1E,KAc/B,sBACL,OAAIA,KAAKyB,OAAOqI,WACZ9J,KAAKyB,OAAOwC,cAAgBjE,KAAKyB,OAAOwC,aAAa0G,OAAS,IAChE3K,KAAKwV,cAAc,UAAWxV,KAAKyB,OAAOwC,cAC1CjE,KAAKyB,OAAOwC,aAAe,IAHOjE,KAS9B,cAAcwW,EAAc5B,GAClC,IAAIhU,EAAQgU,EAAO,IAAI8C,YAAYlB,EAAM,CAACmB,SAAS,EAAOd,OAAQjC,IAAS,IAAIgD,MAAMpB,GAErF,OADAxW,KAAKD,GAAG8X,cAAcjX,GACfZ,KAID,oBAMN,OAJIA,KAAK8X,UACP,EAAAvT,MAAMwT,iBAAiB/X,KAAK8X,QAAQ1T,YAC7BpE,KAAK8X,SAEP9X,KAID,cAAcgY,GAAc,EAAO/L,GAOzC,GALI+L,GACFhY,KAAKqV,oBAGPrV,KAAK4B,0BACA5B,KAAKQ,KAAKkG,WACb,OAAO1G,KAGT,IAAI0G,EAAa1G,KAAKQ,KAAKkG,WACvBkK,EAAiB5Q,KAAKQ,KAAKoQ,eAC3BqH,EAAS,IAAIjY,KAAKQ,KAAKwP,aAAahQ,KAAKQ,KAAK8O,YAGlD,IAAKtP,KAAK8X,QAAS,CACjB,IAAIxE,EAAK,oBAAsC,IAAhBjS,KAAK4O,UAAmBC,UAEnDgI,EAAgBlY,KAAKQ,KAAKmP,iBAAc3K,EAAYhF,KAAKD,GAAG6D,WAEhE,GADA5D,KAAK8X,QAAU,EAAAvT,MAAM4T,iBAAiB7E,EAAI4E,IACrClY,KAAK8X,QAAW,OAAO9X,KAC5BA,KAAK8X,QAAQ1T,IAAMkP,EACnBtT,KAAK8X,QAAQM,KAAO,EAGpB,EAAA7T,MAAM8T,WAAWrY,KAAK8X,QAASG,EAAQ,eAAevR,IAAakK,KAEnE,IAAI1P,EAAclB,KAAKQ,KAAKgR,UAAYxR,KAAKQ,KAAKmQ,WAC9C2H,EAAiBtY,KAAKQ,KAAKiR,aAAezR,KAAKQ,KAAKmQ,WACpD4H,EAAgBvY,KAAKQ,KAAK8Q,YAActR,KAAKQ,KAAKmQ,WAClD3P,EAAehB,KAAKQ,KAAK+Q,WAAavR,KAAKQ,KAAKmQ,WAChDkD,EAAU,GAAGoE,+BACb/V,EAAc,IAAIlC,KAAKQ,KAAKwP,0DAChC,EAAAzL,MAAM8T,WAAWrY,KAAK8X,QAASjE,EAAS,QAAQ3S,aAAeqX,cAAkBD,YAAiBtX,MAClG,EAAAuD,MAAM8T,WAAWrY,KAAK8X,QAAS5V,EAAa,QAAQhB,aAAeqX,cAAkBD,YAAiBtX,MAEtG,EAAAuD,MAAM8T,WAAWrY,KAAK8X,QAAS,GAAGG,uBAA6B,UAAUM,KACzE,EAAAhU,MAAM8T,WAAWrY,KAAK8X,QAAS,GAAGG,sBAA4B,UAAUM,KACxE,EAAAhU,MAAM8T,WAAWrY,KAAK8X,QAAS,GAAGG,uBAA6B,UAAUM,cAAkBD,KAC3F,EAAA/T,MAAM8T,WAAWrY,KAAK8X,QAAS,GAAGG,uBAA6B,SAASjX,KACxE,EAAAuD,MAAM8T,WAAWrY,KAAK8X,QAAS,GAAGG,sBAA4B,SAASjX,KACvE,EAAAuD,MAAM8T,WAAWrY,KAAK8X,QAAS,GAAGG,uBAA6B,SAASjX,cAAiBsX,KAK3F,IADArM,EAAOA,GAAQjM,KAAK8X,QAAQM,MACjBpY,KAAK8X,QAAQM,KAAM,CAC5B,IAAII,EAAaC,GAA0B/R,EAAa+R,EAAQ7H,EAChE,IAAK,IAAI1F,EAAIlL,KAAK8X,QAAQM,KAAO,EAAGlN,GAAKe,EAAMf,IAAK,CAClD,IAAI9I,EAAYoW,EAAUtN,GAC1B,EAAA3G,MAAM8T,WAAWrY,KAAK8X,QAAS,GAAGG,WAAgB/M,EAAE,MAAc,QAAQsN,EAAUtN,EAAE,MACtF,EAAA3G,MAAM8T,WAAWrY,KAAK8X,QAAS,GAAGG,WAAgB/M,MAAW,WAAW9I,KACxE,EAAAmC,MAAM8T,WAAWrY,KAAK8X,QAAS,GAAGG,eAAoB/M,MAAO,eAAe9I,KAC5E,EAAAmC,MAAM8T,WAAWrY,KAAK8X,QAAS,GAAGG,eAAoB/M,MAAO,eAAe9I,KAE9EpC,KAAK8X,QAAQM,KAAOnM,EAEtB,OAAOjM,KAID,yBACN,IAAKA,KAAKyB,QAAUzB,KAAKyB,OAAOqI,UAAa,OAAO9J,KACpD,IAAIkP,EAAMlP,KAAK+H,SAEX2Q,EAAe3V,SAAS4V,iBAAiB3Y,KAAKD,IAAI,eACtD,GAAI2Y,EAAe,EAAG,CACpB,IAAIvJ,EAAS9N,KAAK2B,MAAM0V,EAAe1Y,KAAKoD,eAAc,IACtD8L,EAAMC,IACRD,EAAMC,GAIV,GADAnP,KAAKD,GAAGoH,aAAa,iBAAkByR,OAAO1J,IAClC,IAARA,EAEF,OADAlP,KAAKD,GAAGiR,MAAM6H,eAAe,UACtB7Y,KAET,IAAI0G,EAAa1G,KAAKQ,KAAKkG,WACvBoO,EAAO9U,KAAKQ,KAAKoQ,eACrB,OAAKlK,GACL1G,KAAKD,GAAGiR,MAAM7I,OAAS+G,EAAMxI,EAAaoO,EACnC9U,MAFmBA,KAMpB,mBAAmBkH,GAKzB,OAJAA,EAAO4R,iBAAiB,eAAe3P,SAASpJ,IAC1CA,EAAG8S,WACL9S,EAAG8S,UAAUkG,oBAEV/Y,KAKD,gBAAgBD,EAAyBgN,GAAkB,EAAOlM,GACnEA,IACHd,EAAGkG,UAAUC,IAAIlG,KAAKQ,KAAK8O,WAC3BzO,EAAOb,KAAK+T,UAAUhU,IAExBA,EAAGI,cAAgBU,EACnBA,EAAKd,GAAKA,EACVc,EAAK6B,KAAO1C,KACZ,IAAI8O,EAAO,OAAH,UAAOjO,GAOf,OANAA,EAAOb,KAAKyB,OAAOO,QAAQnB,EAAMkM,GAE5B,EAAAxI,MAAMyU,KAAKnY,EAAMiO,IACpB9O,KAAKyE,WAAW1E,EAAIc,GAEtBb,KAAKoF,uBAAuBvE,GACrBb,KAID,YAAYD,EAAiBqB,EAAYG,EAAYY,EAAYC,GAKvE,OAJIhB,SAAiCrB,EAAGoH,aAAa,OAAQyR,OAAOxX,IAChEG,SAAiCxB,EAAGoH,aAAa,OAAQyR,OAAOrX,IAChEY,GAAKpC,EAAGoH,aAAa,OAAQyR,OAAOzW,IACpCC,GAAKrC,EAAGoH,aAAa,OAAQyR,OAAOxW,IACjCpC,KAID,WAAWD,EAAiBc,GAClC,IAAKA,EAAM,OAAOb,KAClBA,KAAKiC,YAAYlC,EAAIc,EAAKO,EAAGP,EAAKU,EAAGV,EAAKsB,EAAGtB,EAAKuB,GAElD,IAAI6W,EAA8B,CAChCpX,aAAc,mBACd0F,KAAM,WACNC,KAAM,WACNuE,KAAM,WACNE,KAAM,WACNnF,SAAU,eACVF,OAAQ,aACRD,OAAQ,YACR2M,GAAI,QACJ4F,cAAe,qBAEjB,IAAK,MAAMnL,KAAOkL,EACZpY,EAAKkN,GACPhO,EAAGoH,aAAa8R,EAAMlL,GAAM6K,OAAO/X,EAAKkN,KAExChO,EAAGoZ,gBAAgBF,EAAMlL,IAG7B,OAAO/N,KAID,UAAUD,EAAiBc,EAAsB,IACvDA,EAAKO,EAAI,EAAAmD,MAAM8K,SAAStP,EAAG+C,aAAa,SACxCjC,EAAKU,EAAI,EAAAgD,MAAM8K,SAAStP,EAAG+C,aAAa,SACxCjC,EAAKsB,EAAI,EAAAoC,MAAM8K,SAAStP,EAAG+C,aAAa,SACxCjC,EAAKuB,EAAI,EAAAmC,MAAM8K,SAAStP,EAAG+C,aAAa,SACxCjC,EAAKkL,KAAO,EAAAxH,MAAM8K,SAAStP,EAAG+C,aAAa,aAC3CjC,EAAK0G,KAAO,EAAAhD,MAAM8K,SAAStP,EAAG+C,aAAa,aAC3CjC,EAAKoL,KAAO,EAAA1H,MAAM8K,SAAStP,EAAG+C,aAAa,aAC3CjC,EAAK2G,KAAO,EAAAjD,MAAM8K,SAAStP,EAAG+C,aAAa,aAC3CjC,EAAKgB,aAAe,EAAA0C,MAAMwL,OAAOhQ,EAAG+C,aAAa,qBACjDjC,EAAKiG,SAAW,EAAAvC,MAAMwL,OAAOhQ,EAAG+C,aAAa,iBAC7CjC,EAAK+F,OAAS,EAAArC,MAAMwL,OAAOhQ,EAAG+C,aAAa,eAC3CjC,EAAK8F,OAAS,EAAApC,MAAMwL,OAAOhQ,EAAG+C,aAAa,cAC3CjC,EAAKqY,cAAgBnZ,EAAG+C,aAAa,qBACrCjC,EAAKyS,GAAKvT,EAAG+C,aAAa,SAG1B,IAAK,MAAMiL,KAAOlN,EAAM,CACtB,IAAKA,EAAKuY,eAAerL,GAAQ,OAC5BlN,EAAKkN,IAAsB,IAAdlN,EAAKkN,WACdlN,EAAKkN,GAIhB,OAAOlN,EAID,kBACN,IAAIwY,EAAU,CAAC,qBAUf,OARIrZ,KAAKQ,KAAKC,YACZT,KAAKD,GAAGkG,UAAUC,OAAOmT,GACzBrZ,KAAKD,GAAGoH,aAAa,YAAa,UAElCnH,KAAKD,GAAGkG,UAAUpC,UAAUwV,GAC5BrZ,KAAKD,GAAGoZ,gBAAgB,cAGnBnZ,KAOF,iBAUL,GARIA,KAAKoR,mBACP,EAAA7M,MAAM+U,UAAS,KACb,IAAIjI,GAAgBrR,KAAKQ,KAAK8Q,YAA0BtR,KAAKQ,KAAK+Q,WAC7DvR,KAAKQ,KAAKgR,UAAwBxR,KAAKQ,KAAKiR,aACjDzR,KAAK0G,WAAW1G,KAAKkD,YAAcmO,KAClC,MAGArR,KAAKQ,KAAKqQ,sBAAwB7Q,KAAKD,GAAGwZ,aAAevZ,KAAKQ,KAAKsP,SAAU,CAChF,GAAI9P,KAAKwZ,eAAkB,OAAOxZ,KAClCA,KAAKwZ,gBAAiB,EACtBxZ,KAAK6H,OAAO,GACZ7H,KAAK0I,mBAAmB1I,KAAKD,QACxB,CACL,IAAKC,KAAKwZ,eAAkB,OAAOxZ,YAC5BA,KAAKwZ,eACZxZ,KAAK6H,OAAO7H,KAAKsU,aACjBtU,KAAK0I,mBAAmB1I,KAAKD,IAG/B,OAAOC,KAID,yBAAyByZ,GAAc,GAC7C,MAAMC,EAAY1Z,KAAKoR,oBAAsBpR,KAAKQ,KAAKqQ,qBAYvD,OATI6I,GAAaD,GAAgBzZ,KAAKQ,KAAK0Q,WAAclR,KAAK2Z,mBAIlDF,GAAgBC,IAAa1Z,KAAK2Z,oBAC5C1U,OAAO+R,oBAAoB,SAAUhX,KAAK2Z,0BACnC3Z,KAAK2Z,oBALZ3Z,KAAK2Z,kBAAoB3Z,KAAK+Y,eAAea,KAAK5Z,MAClDiF,OAAO6R,iBAAiB,SAAU9W,KAAK2Z,mBACvC3Z,KAAK+Y,kBAMA/Y,KAIF,kBAAkBgJ,EAAwB,oBAA2C,OAAO,EAAAzE,MAAMgS,WAAWvN,GAE7G,mBAAmBA,EAAwB,oBAA6C,OAAO,EAAAzE,MAAM2E,YAAYF,GAEjH,sBAAsBA,GAA0C,OAAO3I,EAAUkW,WAAWvN,GAE5F,uBAAuBA,GAAkC,OAAO,EAAAzE,MAAM2E,YAAYF,GAGjF,aAEN,IAAI4L,EACAhF,EAAS,EAGTiK,EAAoB,GAsDxB,MArDgC,iBAArB7Z,KAAKQ,KAAKoP,SACnBiK,EAAU7Z,KAAKQ,KAAKoP,OAAO+G,MAAM,MAEZ,IAAnBkD,EAAQlP,QACV3K,KAAKQ,KAAKgR,UAAYxR,KAAKQ,KAAKiR,aAAeoI,EAAQ,GACvD7Z,KAAKQ,KAAK+Q,WAAavR,KAAKQ,KAAK8Q,YAAcuI,EAAQ,IAC3B,IAAnBA,EAAQlP,QACjB3K,KAAKQ,KAAKgR,UAAYqI,EAAQ,GAC9B7Z,KAAKQ,KAAK8Q,YAAcuI,EAAQ,GAChC7Z,KAAKQ,KAAKiR,aAAeoI,EAAQ,GACjC7Z,KAAKQ,KAAK+Q,WAAasI,EAAQ,KAE/BjF,EAAO,EAAArQ,MAAMsQ,YAAY7U,KAAKQ,KAAKoP,QACnC5P,KAAKQ,KAAKmQ,WAAaiE,EAAKE,KAC5BlF,EAAS5P,KAAKQ,KAAKoP,OAASgF,EAAKxS,QAIP4C,IAAxBhF,KAAKQ,KAAKgR,UACZxR,KAAKQ,KAAKgR,UAAY5B,GAEtBgF,EAAO,EAAArQ,MAAMsQ,YAAY7U,KAAKQ,KAAKgR,WACnCxR,KAAKQ,KAAKgR,UAAYoD,EAAKxS,SACpBpC,KAAKQ,KAAKoP,aAGY5K,IAA3BhF,KAAKQ,KAAKiR,aACZzR,KAAKQ,KAAKiR,aAAe7B,GAEzBgF,EAAO,EAAArQ,MAAMsQ,YAAY7U,KAAKQ,KAAKiR,cACnCzR,KAAKQ,KAAKiR,aAAemD,EAAKxS,SACvBpC,KAAKQ,KAAKoP,aAGW5K,IAA1BhF,KAAKQ,KAAK8Q,YACZtR,KAAKQ,KAAK8Q,YAAc1B,GAExBgF,EAAO,EAAArQ,MAAMsQ,YAAY7U,KAAKQ,KAAK8Q,aACnCtR,KAAKQ,KAAK8Q,YAAcsD,EAAKxS,SACtBpC,KAAKQ,KAAKoP,aAGU5K,IAAzBhF,KAAKQ,KAAK+Q,WACZvR,KAAKQ,KAAK+Q,WAAa3B,GAEvBgF,EAAO,EAAArQ,MAAMsQ,YAAY7U,KAAKQ,KAAK+Q,YACnCvR,KAAKQ,KAAK+Q,WAAaqD,EAAKxS,SACrBpC,KAAKQ,KAAKoP,QAEnB5P,KAAKQ,KAAKmQ,WAAaiE,EAAKE,KACxB9U,KAAKQ,KAAKgR,YAAcxR,KAAKQ,KAAKiR,cAAgBzR,KAAKQ,KAAK+Q,aAAevR,KAAKQ,KAAK8Q,aAAetR,KAAKQ,KAAKgR,YAAcxR,KAAKQ,KAAK8Q,cACxItR,KAAKQ,KAAKoP,OAAS5P,KAAKQ,KAAKgR,WAExBxR,KAiBF,QAAQgJ,EAAuBC,GAA2B,OAAOjJ,KAMjE,UAAUgJ,EAAuBC,GAA2B,OAAOjJ,KAEnE,qBAAkC,OAAOA,KAEzC,mBAAgC,OAAOA,KAEvC,sBAAsBD,GAAsC,OAAOC,KAEnE,sBAAsBD,GAAsC,OAAOC,KAEnE,eAA4B,OAAOA,KAEnC,uBAAuBa,GAAkC,OAAOb,KAIhE,OAAOgJ,EAAuBrC,GAA8B,OAAO3G,KAAK0U,OAAO1L,EAAK,CAACrC,WAErF,SAASqC,EAAuB+C,GAA2B,OAAO/L,KAAK0U,OAAO1L,EAAK,CAAC+C,SAEpF,SAAS/C,EAAuBzB,GAA4B,OAAOvH,KAAK0U,OAAO1L,EAAK,CAACzB,SAErF,UAAUyB,EAAuBiD,GAA2B,OAAOjM,KAAK0U,OAAO1L,EAAK,CAACiD,SAErF,UAAUjD,EAAuBxB,GAA2B,OAAOxH,KAAK0U,OAAO1L,EAAK,CAACxB,SAErF,KAAKwB,EAAuB5H,EAAYG,GAAyB,OAAOvB,KAAK0U,OAAO1L,EAAK,CAAC5H,IAAGG,MAE7F,OAAOyH,EAAuB7G,EAAYC,GAAyB,OAAOpC,KAAK0U,OAAO1L,EAAK,CAAC7G,IAAGC,OA50CxG,cAyDgB,EAAAmC,MAAQ,EAAAA,MAGR,EAAAuV,OAAS,EAAAvQ,iB,sFCxGzB,sCAKU,KAAAwQ,WAAY,EAEZ,KAAAC,eAEJ,GAPJ,eAAmC,OAAOha,KAAK+Z,UASxC,GAAGnZ,EAAe6V,GACvBzW,KAAKga,eAAepZ,GAAS6V,EAGxB,IAAI7V,UACFZ,KAAKga,eAAepZ,GAGtB,SACLZ,KAAK+Z,WAAY,EAGZ,UACL/Z,KAAK+Z,WAAY,EAGZ,iBACE/Z,KAAKga,eAGP,aAAaC,EAAmBrZ,GACrC,IAAIZ,KAAKka,UACJla,KAAKga,eACV,OAAIha,KAAKga,eAAeC,GACfja,KAAKga,eAAeC,GAAWrZ,QADxC,K,oFCnCJ,eACA,SACA,SA0BA,MAAauZ,UAAoB,EAAAC,gBA6B/B,YAAYra,EAAiBsa,EAAyB,IACpDC,QAhBM,KAAAC,UAAW,EAwSZ,KAAAtT,GAAK,KACV,MACMuT,EADgBxa,KAAKD,GAAGoF,cACQ0Q,wBAChC4E,EAASza,KAAK8D,OAAO+R,wBAC3B,MAAO,CACLvO,SAAU,CACRpG,IAAKuZ,EAAOvZ,IAAMsZ,EAAgBtZ,IAClCF,KAAMyZ,EAAOzZ,KAAOwZ,EAAgBxZ,QA9RxChB,KAAKD,GAAKA,EACVC,KAAKqa,OAASA,EAEdra,KAAK0a,WAAa1a,KAAK0a,WAAWd,KAAK5Z,MACvCA,KAAK2a,WAAa3a,KAAK2a,WAAWf,KAAK5Z,MACvCA,KAAK4a,MAAQ5a,KAAK4a,MAAMhB,KAAK5Z,MAC7BA,KAAK6a,SAAW7a,KAAK6a,SAASjB,KAAK5Z,MACnCA,KAAK8a,YAAc9a,KAAK8a,YAAYlB,KAAK5Z,MAEzCA,KAAKD,GAAGE,WAAY,EACpBD,KAAKD,GAAGkG,UAAUC,IAAI,gBACtBlG,KAAKD,GAAG+W,iBAAiB,YAAa9W,KAAK0a,YAC3C1a,KAAKD,GAAG+W,iBAAiB,YAAa9W,KAAK2a,YAGtC,GAAG/Z,EAA0C6V,GAClD6D,MAAMzX,GAAGjC,EAAO6V,GAGX,IAAI7V,GACT0Z,MAAM5W,IAAI9C,GAGL,SACL0Z,MAAMS,SACN/a,KAAKD,GAAGE,WAAY,EACpBD,KAAKD,GAAGkG,UAAUpC,OAAO,yBAGpB,UACLyW,MAAMU,UACNhb,KAAKD,GAAGE,WAAY,EACpBD,KAAKD,GAAGkG,UAAUC,IAAI,yBAGjB,UACDlG,KAAKua,UAIPva,KAAK6a,SAAS,IAEhB7a,KAAKD,GAAGE,WAAY,EACpBD,KAAKD,GAAGkG,UAAUpC,OAAO,gBACzB7D,KAAKD,GAAGiX,oBAAoB,YAAahX,KAAK0a,YAC9C1a,KAAKD,GAAGiX,oBAAoB,YAAahX,KAAK2a,mBACvC3a,KAAKD,UACLC,KAAK8D,cACL9D,KAAKqa,OACZC,MAAMW,UAGD,aAAaza,GAElB,OADA0a,OAAO/D,KAAK3W,GAAM2I,SAAQ4E,GAAO/N,KAAKqa,OAAOtM,GAAOvN,EAAKuN,KAClD/N,KAID,WAAWY,GACjBZ,KAAKmb,iBAAmBva,EAAMsG,OAIxB,WAAWtG,GACjB,GAAIZ,KAAKqa,OAAO5K,UACdzP,KAAKmb,mBACFnb,KAAKmb,iBAAiBvY,QACvB,GAAG5C,KAAKqa,OAAO5K,WAAWzP,KAAKqa,OAAO5K,eAIxC,YADA7O,EAAMwa,iBAGR,EAAAC,UAAUC,YAActb,KACxBA,KAAK8D,OAAS9D,KAAKub,cAAc3a,GACjCZ,KAAKwb,+BACLxb,KAAKyb,WAAazb,KAAK0b,eAAe9a,EAAOZ,KAAKD,GAAIC,KAAK2b,mBAC3D,MAAMC,EAAK,EAAAC,QAAQC,UAAqBlb,EAAO,CAAEsG,OAAQlH,KAAKD,GAAIgF,KAAM,cACpE/E,KAAK8D,SAAW9D,KAAKD,GACvBC,KAAK+b,gCAAgCH,GAErC5b,KAAKgc,gBAAkB/W,OAAOC,YAAW,YAChClF,KAAKgc,gBACZhc,KAAK+b,gCAAgCH,KACpC,GAEL5b,KAAKic,iBAAiBrb,GAIhB,gCAAgCgb,GAUtC,OATA5b,KAAKkc,oBACL1W,SAASsR,iBAAiB,WAAY9W,KAAK4a,MAAOT,EAAYgC,yBAC9Dnc,KAAKD,GAAG+W,iBAAiB,UAAW9W,KAAK6a,UACrC7a,KAAKqa,OAAO1R,OACd3I,KAAKqa,OAAO1R,MAAMiT,EAAI5b,KAAKiH,MAE7BjH,KAAKua,UAAW,EAChBva,KAAK8D,OAAOmC,UAAUC,IAAI,yBAC1BlG,KAAKiN,aAAa,YAAa2O,GACxB5b,KAID,MAAMY,GACZZ,KAAK8a,YAAYla,GACjB,MAAMgb,EAAK,EAAAC,QAAQC,UAAqBlb,EAAO,CAAEsG,OAAQlH,KAAKD,GAAIgF,KAAM,SACpE/E,KAAKqa,OAAOxR,MACd7I,KAAKqa,OAAOxR,KAAK+S,EAAI5b,KAAKiH,MAE5BjH,KAAKiN,aAAa,OAAQ2O,GAIpB,SAAShb,GACf,GAAIZ,KAAKgc,gBAGP,OAFA3V,aAAarG,KAAKgc,6BACXhc,KAAKgc,gBAGRhc,KAAKoc,YACPC,qBAAqBrc,KAAKoc,YAE5B5W,SAASwR,oBAAoB,WAAYhX,KAAK4a,MAAOT,EAAYgC,yBACjEnc,KAAKD,GAAGiX,oBAAoB,UAAWhX,KAAK6a,UAE9C7a,KAAKua,UAAW,EAChBva,KAAK8D,OAAOmC,UAAUpC,OAAO,yBAC7B7D,KAAK2b,kBAAkB3K,MAAM1J,SAAWtH,KAAKsc,2BAA6B,KACtEtc,KAAK8D,SAAW9D,KAAKD,GACvBC,KAAKuc,qBAELvc,KAAK8D,OAAOD,SAEd,MAAM+X,EAAK,EAAAC,QAAQC,UAAqBlb,EAAO,CAAEsG,OAAQlH,KAAKD,GAAIgF,KAAM,aACpE/E,KAAKqa,OAAOzR,MACd5I,KAAKqa,OAAOzR,KAAKgT,GAEnB5b,KAAKiN,aAAa,WAAY2O,UACvB,EAAAP,UAAUC,mBACVtb,KAAK8D,cACL9D,KAAKmb,iBAIN,cAAcva,GACpB,MACMkD,EADmD,mBAAxB9D,KAAKqa,OAAOvW,OAExC9D,KAAKqa,OAAOvW,OAA2C0Y,MAAMxc,KAAKD,GAAI,CAACa,IAChD,UAAvBZ,KAAKqa,OAAOvW,OAAqB,EAAA+X,QAAQtO,MAAMvN,KAAKD,IAAMC,KAAKD,GAUpE,OARKyF,SAASmO,KAAK8I,SAAS3Y,IAC1B,EAAA+X,QAAQrL,SAAS1M,EAAkC,WAAzB9D,KAAKqa,OAAO7J,SAClCxQ,KAAKD,GAAG6D,WACR5D,KAAKqa,OAAO7J,UAEd1M,IAAW9D,KAAKD,KAClBC,KAAK0c,uBAAyBvC,EAAYwC,gBAAgBnP,KAAIuB,GAAQ/O,KAAKD,GAAGiR,MAAMjC,MAE/EjL,EAID,oBAaN,OAZA9D,KAAK8D,OAAOkN,MAAM4L,cAAgB,OAClC5c,KAAK8D,OAAOkN,MAAM9I,MAAQlI,KAAKyb,WAAWvT,MAAQ,KAClDlI,KAAK8D,OAAOkN,MAAM7I,OAASnI,KAAKyb,WAAWtT,OAAS,KACpDnI,KAAK8D,OAAOkN,MAAkB,WAAI,YAClChR,KAAK8D,OAAOkN,MAAM6L,WAAa,OAC/B7c,KAAK8D,OAAOkN,MAAM1J,SAAWtH,KAAKqa,OAAOyC,cAAgB3C,EAAY2C,aACrE9c,KAAK8D,OAAOkN,MAAM+L,OAAS,OAC3B7X,YAAW,KACLlF,KAAK8D,SACP9D,KAAK8D,OAAOkN,MAAM6L,WAAa,QAEhC,GACI7c,KAID,qB,QAQN,OANyD,QAArD,EAAsC,QAAtC,EAAGA,KAAK8D,cAA8B,eAAE3D,qBAAa,eAAEgG,mBACzDgU,EAAYwC,gBAAgBxT,SAAQ4F,IAClC/O,KAAK8D,OAAOkN,MAAMjC,GAAQ/O,KAAK0c,uBAAuB3N,IAAS,eAG5D/O,KAAK0c,uBACL1c,KAID,YAAYY,GACdZ,KAAKoc,YACPC,qBAAqBrc,KAAKoc,YAE5Bpc,KAAKoc,WAAaY,uBAAsB,YAC/Bhd,KAAKoc,WACZ,MAAM3B,EAASza,KAAKyb,WACpB,IAAIjB,EAAkB,CAAExZ,KAAM,EAAGE,IAAK,GACtC,GAAmC,aAA/BlB,KAAK8D,OAAOkN,MAAM1J,SAAyB,CAC7C,MAAM,KAAEtG,EAAI,IAAEE,GAAQlB,KAAK2b,kBAAkB9F,wBAC7C2E,EAAkB,CAAExZ,OAAME,OAE5BlB,KAAK8D,OAAOkN,MAAMhQ,KAAOJ,EAAMqc,QAAUxC,EAAOxE,WAAauE,EAAgBxZ,KAAO,KACpFhB,KAAK8D,OAAOkN,MAAM9P,IAAMN,EAAMsc,QAAUzC,EAAOzE,UAAYwE,EAAgBtZ,IAAM,QAK7E,+BAQN,OAPAlB,KAAK2b,kBAAoB3b,KAAK8D,OAAOqB,cACJ,UAA7BnF,KAAKqa,OAAOyC,eACd9c,KAAKsc,0BAA4Btc,KAAK2b,kBAAkB3K,MAAM1J,SAC1DrC,OAAO0T,iBAAiB3Y,KAAK2b,mBAAmBrU,SAAS6V,MAAM,YACjEnd,KAAK2b,kBAAkB3K,MAAM1J,SAAW,aAGrCtH,KAID,iBAAiBgS,GAKvB,OAJsB,MAAlBA,EAAEoL,cACJpL,EAAEoL,aAAaC,QAAQ,OAAQ,IAEjCrL,EAAEoL,aAAaE,cAAgB,OAC3B,mBAAsBC,aAAajd,UAAUkd,cAI9CxL,EAAE9K,OAAuB8J,MAAMyM,QAAU,OAC1CvY,YAAW,KACR8M,EAAE9K,OAAuB8J,MAAMyM,QAAU,WAE5CzL,EAAE0L,oBAPF1L,EAAEoL,aAAaI,aAAa,IAAIG,MAAS,EAAG,GAU9C3L,EAAE0L,kBACK1d,MAID,eAAeY,EAAkBb,EAAiB6d,GAGxD,IAAIC,EAAe,EACfC,EAAe,EACnB,GAAIF,EAAQ,CACV,MAAMG,EAASvY,SAAS8M,cAAc,OACtC,EAAAuJ,QAAQmC,YAAYD,EAAQ,CAC1BE,QAAS,IACT3W,SAAU,QACVpG,IAAK,MACLF,KAAM,MACNkH,MAAO,MACPC,OAAQ,MACR4U,OAAQ,YAEVa,EAAOvb,YAAY0b,GACnB,MAAMG,EAAiBH,EAAOlI,wBAC9B+H,EAAO/L,YAAYkM,GACnBF,EAAeK,EAAeld,KAC9B8c,EAAeI,EAAehd,IAIhC,MAAMid,EAAepe,EAAG8V,wBACxB,MAAO,CACL7U,KAAMmd,EAAand,KACnBE,IAAKid,EAAajd,IAClB+U,YAAcrV,EAAMqc,QAAUkB,EAAand,KAAO6c,EAClD7H,WAAapV,EAAMsc,QAAUiB,EAAajd,IAAM4c,EAChD5V,MAAOiW,EAAajW,MACpBC,OAAQgW,EAAahW,SAjT3B,gBAsBiB,EAAA2U,aAAqC,WAErC,EAAAX,yBAA0B,EAAAN,QAAQuC,6BAA8B,CAAEC,SAAS,EAAMC,SAAS,GAE1F,EAAA3B,gBAAkB,CAAC,aAAc,gBAAiB,WAC/D,OAAQ,MAAO,UAAW,SAAU,QAAS,SAAU,e,mFCtD3D,eACA,SACA,SASA,MAAa4B,UAAoB,EAAAnE,gBAS/B,YAAYra,EAAiBS,EAAuB,IAClD8Z,QAHM,KAAAkE,WAAsB,KAI5Bxe,KAAKD,GAAKA,EACVC,KAAKqa,OAAS7Z,EAEdR,KAAKye,WAAaze,KAAKye,WAAW7E,KAAK5Z,MACvCA,KAAK0e,UAAY1e,KAAK0e,UAAU9E,KAAK5Z,MACrCA,KAAK2e,WAAa3e,KAAK2e,WAAW/E,KAAK5Z,MACvCA,KAAK4e,MAAQ5e,KAAK4e,MAAMhF,KAAK5Z,MAE7BA,KAAKD,GAAGkG,UAAUC,IAAI,gBACtBlG,KAAKD,GAAG+W,iBAAiB,YAAa9W,KAAKye,YAC3Cze,KAAK6e,eAGA,GAAGje,EAAwC6V,GAChD6D,MAAMzX,GAAGjC,EAAO6V,GAGX,IAAI7V,GACT0Z,MAAM5W,IAAI9C,GAGL,SACAZ,KAAKka,WACVI,MAAMS,SACN/a,KAAKD,GAAGkG,UAAUpC,OAAO,yBACzB7D,KAAKD,GAAG+W,iBAAiB,YAAa9W,KAAKye,aAGtC,UACDze,KAAKka,WACTI,MAAMU,UACNhb,KAAKD,GAAGkG,UAAUC,IAAI,yBACtBlG,KAAKD,GAAGiX,oBAAoB,YAAahX,KAAKye,aAGzC,UACLze,KAAKD,GAAGkG,UAAUpC,OAAO,gBACrB7D,KAAKka,WACPla,KAAKD,GAAGkG,UAAUpC,OAAO,yBACzB7D,KAAKD,GAAGiX,oBAAoB,YAAahX,KAAKye,YAC9Cze,KAAKD,GAAGiX,oBAAoB,WAAYhX,KAAK0e,WAC7C1e,KAAKD,GAAGiX,oBAAoB,OAAQhX,KAAK4e,OACzC5e,KAAKD,GAAGiX,oBAAoB,YAAahX,KAAK2e,aAEhDrE,MAAMW,UAGD,aAAaza,GAGlB,OAFA0a,OAAO/D,KAAK3W,GAAM2I,SAAQ4E,GAAO/N,KAAKqa,OAAOtM,GAAOvN,EAAKuN,KACzD/N,KAAK6e,eACE7e,KAID,WAAWY,GAGjB,GAFAZ,KAAKD,GAAGiX,oBAAoB,YAAahX,KAAKye,YAC9Cze,KAAKwe,WAAaxe,KAAK8e,WACnB9e,KAAKwe,WAAY,CACnB5d,EAAMwa,iBACN,MAAMQ,EAAK,EAAAC,QAAQC,UAAqBlb,EAAO,CAAEsG,OAAQlH,KAAKD,GAAIgF,KAAM,aACpE/E,KAAKqa,OAAO0E,MACd/e,KAAKqa,OAAO0E,KAAKnD,EAAI5b,KAAKgf,IAAI,EAAA3D,UAAUC,cAE1Ctb,KAAKiN,aAAa,WAAY2O,GAC9B5b,KAAKD,GAAG+W,iBAAiB,WAAY9W,KAAK0e,WAC1C1e,KAAKD,GAAG+W,iBAAiB,OAAQ9W,KAAK4e,OAExC5e,KAAKD,GAAGkG,UAAUC,IAAI,qBACtBlG,KAAKD,GAAG+W,iBAAiB,YAAa9W,KAAK2e,YAIrC,UAAU/d,GAChBA,EAAMwa,iBACNxa,EAAM8c,kBAIA,WAAW9c,GACjB,IAAIZ,KAAKD,GAAG0c,SAAS7b,EAAMqe,iBAC3Bjf,KAAKkf,wBACDlf,KAAKwe,YAAY,CACnB5d,EAAMwa,iBACN,MAAMQ,EAAK,EAAAC,QAAQC,UAAqBlb,EAAO,CAAEsG,OAAQlH,KAAKD,GAAIgF,KAAM,YACpE/E,KAAKqa,OAAO8E,KACdnf,KAAKqa,OAAO8E,IAAIvD,EAAI5b,KAAKgf,IAAI,EAAA3D,UAAUC,cAEzCtb,KAAKiN,aAAa,UAAW2O,IAKzB,MAAMhb,GACZ,IAAKZ,KAAKwe,WAAc,OACxB5d,EAAMwa,iBACN,MAAMQ,EAAK,EAAAC,QAAQC,UAAqBlb,EAAO,CAAEsG,OAAQlH,KAAKD,GAAIgF,KAAM,SACpE/E,KAAKqa,OAAO+E,MACdpf,KAAKqa,OAAO+E,KAAKxD,EAAI5b,KAAKgf,IAAI,EAAA3D,UAAUC,cAE1Ctb,KAAKiN,aAAa,OAAQ2O,GAC1B5b,KAAKkf,wBAIC,wBACNlf,KAAKD,GAAGiX,oBAAoB,YAAahX,KAAK2e,YAC9C3e,KAAKD,GAAGkG,UAAUpC,OAAO,qBACrB7D,KAAKwe,aACPxe,KAAKD,GAAGiX,oBAAoB,WAAYhX,KAAK0e,WAC7C1e,KAAKD,GAAGiX,oBAAoB,OAAQhX,KAAK4e,QAE3C5e,KAAKD,GAAG+W,iBAAiB,YAAa9W,KAAKye,YAIrC,WACN,OAAO,EAAApD,UAAUC,eAAiBtb,KAAKyC,QAAUzC,KAAKyC,OAAO,EAAA4Y,UAAUC,YAAYvb,KAI7E,eAQN,OAPIC,KAAKqa,OAAO5X,QAAwC,iBAAvBzC,KAAKqa,OAAO5X,OAC3CzC,KAAKyC,OAAU1C,GACNA,EAAG6C,QAAQ5C,KAAKqa,OAAO5X,QAGhCzC,KAAKyC,OAASzC,KAAKqa,OAAO5X,OAErBzC,KAID,IAAI6I,GACV,OAAO,OAAP,QACE5I,UAAW4I,EAAK9I,IACb8I,EAAK5B,OAlJd,iB,kFCZA,cAEA,SACA,QAMA,MAAaoY,EAYX,YAAYtf,GACVC,KAAKD,GAAKA,EAXZ,YAAYA,GAEV,OADKA,EAAGuf,YAAavf,EAAGuf,UAAY,IAAID,EAAUtf,IAC3CA,EAAGuf,UAYL,GAAGrF,EAAmBxD,GAQ3B,OAPIzW,KAAKuf,aAAe,CAAC,OAAQ,YAAa,YAAY7I,QAAQuD,IAAc,EAC9Eja,KAAKuf,YAAY1c,GAAGoX,EAAgDxD,GAC3DzW,KAAKwf,aAAe,CAAC,OAAQ,WAAY,WAAW9I,QAAQuD,IAAc,EACnFja,KAAKwf,YAAY3c,GAAGoX,EAA8CxD,GACzDzW,KAAKyf,aAAe,CAAC,cAAe,SAAU,cAAc/I,QAAQuD,IAAc,GAC3Fja,KAAKyf,YAAY5c,GAAGoX,EAAsDxD,GAErEzW,KAGF,IAAIia,GAQT,OAPIja,KAAKuf,aAAe,CAAC,OAAQ,YAAa,YAAY7I,QAAQuD,IAAc,EAC9Eja,KAAKuf,YAAY7b,IAAIuW,GACZja,KAAKwf,aAAe,CAAC,OAAQ,WAAY,WAAW9I,QAAQuD,IAAc,EACnFja,KAAKwf,YAAY9b,IAAIuW,GACZja,KAAKyf,aAAe,CAAC,cAAe,SAAU,cAAc/I,QAAQuD,IAAc,GAC3Fja,KAAKyf,YAAY/b,IAAIuW,GAEhBja,KAGF,eAAeQ,GAMpB,OALKR,KAAKuf,YAGRvf,KAAKuf,YAAYG,aAAalf,GAF9BR,KAAKuf,YAAc,IAAI,EAAApF,YAAYna,KAAKD,GAAIS,GAIvCR,KAGF,iBAKL,OAJIA,KAAKuf,cACPvf,KAAKuf,YAAYtE,iBACVjb,KAAKuf,aAEPvf,KAGF,eAAeQ,GAMpB,OALKR,KAAKyf,YAGRzf,KAAKyf,YAAYC,aAAalf,GAF9BR,KAAKyf,YAAc,IAAI,EAAAE,YAAY3f,KAAKD,GAAIS,GAIvCR,KAGF,iBAKL,OAJIA,KAAKyf,cACPzf,KAAKyf,YAAYxE,iBACVjb,KAAKyf,aAEPzf,KAGF,eAAeQ,GAMpB,OALKR,KAAKwf,YAGRxf,KAAKwf,YAAYE,aAAalf,GAF9BR,KAAKwf,YAAc,IAAI,EAAAjB,YAAYve,KAAKD,GAAIS,GAIvCR,KAGF,iBAKL,OAJIA,KAAKwf,cACPxf,KAAKwf,YAAYvE,iBACVjb,KAAKwf,aAEPxf,MAtFX,e,gFCPA,qB,wFCIA,MAAa4f,EAkBX,YAAYC,EAAmB5O,EAAmBoJ,GAR1C,KAAAyF,aAAc,EAEd,KAAAC,SAAU,EAOhB/f,KAAK6f,KAAOA,EACZ7f,KAAKgL,IAAMiG,EACXjR,KAAKqa,OAASA,EAEdra,KAAK0a,WAAa1a,KAAK0a,WAAWd,KAAK5Z,MACvCA,KAAKggB,WAAahgB,KAAKggB,WAAWpG,KAAK5Z,MACvCA,KAAKigB,SAAWjgB,KAAKigB,SAASrG,KAAK5Z,MAEnCA,KAAKkgB,OAGA,OACL,MAAMngB,EAAKyF,SAAS8M,cAAc,OAQlC,OAPAvS,EAAGkG,UAAUC,IAAI,uBACjBnG,EAAGkG,UAAUC,IAAI,GAAG0Z,EAAkB3H,SAASjY,KAAKgL,OACpDjL,EAAGiR,MAAM+L,OAAS,MAClBhd,EAAGiR,MAAMmP,WAAa,OACtBngB,KAAKD,GAAKA,EACVC,KAAK6f,KAAKxd,YAAYrC,KAAKD,IAC3BC,KAAKD,GAAG+W,iBAAiB,YAAa9W,KAAK0a,YACpC1a,KAGF,UAEL,OADAA,KAAK6f,KAAKhO,YAAY7R,KAAKD,IACpBC,KAID,WAAWY,GACjBZ,KAAKogB,eAAiBxf,EACtBsE,YAAW,KACTM,SAASsR,iBAAiB,YAAa9W,KAAKggB,YAAY,GACxDxa,SAASsR,iBAAiB,UAAW9W,KAAKigB,UAC1C/a,YAAW,KACJlF,KAAK8f,cACRta,SAASwR,oBAAoB,YAAahX,KAAKggB,YAAY,GAC3Dxa,SAASwR,oBAAoB,UAAWhX,KAAKigB,iBACtCjgB,KAAKogB,kBAEb,OACF,KAIG,WAAWxf,GACZZ,KAAK+f,SAAY/f,KAAK8f,aACrB9f,KAAKqgB,UAAUzf,EAAOZ,KAAKogB,kBAC7BpgB,KAAK8f,aAAc,EACnB9f,KAAKwV,cAAc,QAASxV,KAAKogB,gBACjCpgB,KAAK+f,SAAU,GAGf/f,KAAK+f,SACP/f,KAAKwV,cAAc,OAAQ5U,GAKvB,SAASA,GACXZ,KAAK8f,aACP9f,KAAKwV,cAAc,OAAQ5U,GAE7B4E,SAASwR,oBAAoB,YAAahX,KAAKggB,YAAY,GAC3Dxa,SAASwR,oBAAoB,UAAWhX,KAAKigB,UAC7CjgB,KAAK8f,aAAc,EACnB9f,KAAK+f,SAAU,SACR/f,KAAKogB,eAIN,UAAUxf,EAAmB0f,GACnC,MAAM,QAAErD,EAAO,QAAEC,GAAYtc,GACrBqc,QAASsD,EAAUrD,QAASsD,GAAaF,EACjD,OACEjf,KAAKof,IAAIxD,EAAUsD,GAAY,GAC5Blf,KAAKof,IAAIvD,EAAUsD,GAAY,EAK9B,cAAchK,EAAc5V,GAIlC,OAHIZ,KAAKqa,OAAO7D,IACdxW,KAAKqa,OAAO7D,GAAM5V,GAEbZ,MAxGX,sBAgBiB,EAAAiY,OAAS,iB,mFCtB1B,eACA,SACA,SAiBA,MAAa0H,UAAoB,EAAAvF,gBAqB/B,YAAYra,EAAiBS,EAAuB,IAClD8Z,QAwEM,KAAAoG,cAAgB,KACtB1gB,KAAKD,GAAGkG,UAAUpC,OAAO,0BAInB,KAAA8c,cAAgB,KACtB3gB,KAAKD,GAAGkG,UAAUC,IAAI,0BAqKhB,KAAA8Y,IAAM,KACZ,MACMxE,EADgBxa,KAAKD,GAAGoF,cACQ0Q,wBAChC+K,EAAO5gB,KAAK6gB,cAAgB7gB,KAAK8gB,aACvC,MAAO,CACLxZ,SAAU,CACRtG,KAAM4f,EAAK5f,KAAOwZ,EAAgBxZ,KAClCE,IAAK0f,EAAK1f,IAAMsZ,EAAgBtZ,KAElC+G,KAAM,CACJC,MAAO0Y,EAAK1Y,MACZC,OAAQyY,EAAKzY,UA7PjBnI,KAAKD,GAAKA,EACVC,KAAKqa,OAAS7Z,EAEdR,KAAKD,GAAGkG,UAAUC,IAAI,gBACtBlG,KAAK+gB,iBACL/gB,KAAKghB,iBAGA,GAAGpgB,EAAgD6V,GACxD6D,MAAMzX,GAAGjC,EAAO6V,GAGX,IAAI7V,GACT0Z,MAAM5W,IAAI9C,GAGL,SACDZ,KAAKka,WACPI,MAAMS,SACN/a,KAAKD,GAAGkG,UAAUpC,OAAO,0BAItB,UACA7D,KAAKka,WACRI,MAAMU,UACNhb,KAAKD,GAAGkG,UAAUC,IAAI,0BAInB,UACLlG,KAAKihB,kBACDjhB,KAAKqa,OAAOhK,WACdrQ,KAAKD,GAAGiX,oBAAoB,YAAahX,KAAK0gB,eAC9C1gB,KAAKD,GAAGiX,oBAAoB,WAAYhX,KAAK2gB,gBAE/C3gB,KAAKD,GAAGkG,UAAUpC,OAAO,uBAClB7D,KAAKD,GACZua,MAAMW,UAGD,aAAaza,GAClB,IAAI0gB,EAAiB1gB,EAAK8P,SAAW9P,EAAK8P,UAAYtQ,KAAKqa,OAAO/J,QAC9D6Q,EAAkB3gB,EAAK6P,UAAY7P,EAAK6P,WAAarQ,KAAKqa,OAAOhK,SASrE,OARA6K,OAAO/D,KAAK3W,GAAM2I,SAAQ4E,GAAO/N,KAAKqa,OAAOtM,GAAOvN,EAAKuN,KACrDmT,IACFlhB,KAAKihB,kBACLjhB,KAAKghB,kBAEHG,GACFnhB,KAAK+gB,iBAEA/gB,KAID,iBAWN,OAVIA,KAAKqa,OAAOhK,UACdrQ,KAAKD,GAAGkG,UAAUC,IAAI,yBAEtBlG,KAAKD,GAAG+W,iBAAiB,YAAa9W,KAAK0gB,eAC3C1gB,KAAKD,GAAG+W,iBAAiB,WAAY9W,KAAK2gB,iBAE1C3gB,KAAKD,GAAGkG,UAAUpC,OAAO,yBACzB7D,KAAKD,GAAGiX,oBAAoB,YAAahX,KAAK0gB,eAC9C1gB,KAAKD,GAAGiX,oBAAoB,WAAYhX,KAAK2gB,gBAExC3gB,KAcD,iBACN,IAAIohB,EAAmBphB,KAAKqa,OAAO/J,SAAW,SAiB9C,MAhByB,QAArB8Q,IACFA,EAAmB,uBAErBphB,KAAKqhB,SAAWD,EAAiBzK,MAAM,KACpCnJ,KAAIxC,GAAOA,EAAIsW,SACf9T,KAAIxC,GAAO,IAAI,EAAA4U,kBAAkB5f,KAAKD,GAAIiL,EAAK,CAC9CrC,MAAQ/H,IACNZ,KAAKuhB,aAAa3gB,IAEpBgI,KAAOhI,IACLZ,KAAKwhB,YAAY5gB,IAEnB+N,KAAO/N,IACLZ,KAAKyhB,UAAU7gB,EAAOoK,QAGrBhL,KAID,aAAaY,GACnBZ,KAAK8gB,aAAe9gB,KAAKD,GAAG8V,wBAC5B7V,KAAK0hB,WAAa9gB,EAClBZ,KAAK2hB,eACL3hB,KAAK4hB,eACL,MAAMhG,EAAK,EAAAC,QAAQC,UAAsBlb,EAAO,CAAEmE,KAAM,cAAemC,OAAQlH,KAAKD,KAMpF,OALIC,KAAKqa,OAAO1R,OACd3I,KAAKqa,OAAO1R,MAAMiT,EAAI5b,KAAKgf,OAE7Bhf,KAAKD,GAAGkG,UAAUC,IAAI,yBACtBlG,KAAKiN,aAAa,cAAe2O,GAC1B5b,KAID,UAAUY,EAAmBoK,GACnChL,KAAK6gB,aAAe7gB,KAAK6hB,WAAWjhB,EAAOoK,GAC3ChL,KAAK4hB,eACL,MAAMhG,EAAK,EAAAC,QAAQC,UAAsBlb,EAAO,CAAEmE,KAAM,SAAUmC,OAAQlH,KAAKD,KAK/E,OAJIC,KAAKqa,OAAOvR,QACd9I,KAAKqa,OAAOvR,OAAO8S,EAAI5b,KAAKgf,OAE9Bhf,KAAKiN,aAAa,SAAU2O,GACrB5b,KAID,YAAYY,GAClB,MAAMgb,EAAK,EAAAC,QAAQC,UAAsBlb,EAAO,CAAEmE,KAAM,aAAcmC,OAAQlH,KAAKD,KAUnF,OATIC,KAAKqa,OAAOzR,MACd5I,KAAKqa,OAAOzR,KAAKgT,GAEnB5b,KAAKD,GAAGkG,UAAUpC,OAAO,yBACzB7D,KAAKiN,aAAa,aAAc2O,GAChC5b,KAAK8hB,sBACE9hB,KAAK0hB,kBACL1hB,KAAK8gB,oBACL9gB,KAAK6gB,aACL7gB,KAID,eASN,OARAA,KAAK+hB,cAAgBpC,EAAYqC,iBAAiBxU,KAAIuB,GAAQ/O,KAAKD,GAAGiR,MAAMjC,KAC5E/O,KAAKsc,0BAA4Btc,KAAKD,GAAGoF,cAAc6L,MAAM1J,SACzDrC,OAAO0T,iBAAiB3Y,KAAKD,GAAGoF,eAAemC,SAAS6V,MAAM,YAChEnd,KAAKD,GAAGoF,cAAc6L,MAAM1J,SAAW,YAEzCtH,KAAKD,GAAGiR,MAAM1J,SAAWtH,KAAKqa,OAAOyC,cAAgB,WACrD9c,KAAKD,GAAGiR,MAAMiN,QAAU,MACxBje,KAAKD,GAAGiR,MAAM+L,OAAS,OAChB/c,KAID,eAKN,OAJA2f,EAAYqC,iBAAiB7Y,SAAQ4F,IACnC/O,KAAKD,GAAGiR,MAAMjC,GAAQ/O,KAAK+hB,cAAchT,IAAS,QAEpD/O,KAAKD,GAAGoF,cAAc6L,MAAM1J,SAAWtH,KAAKsc,2BAA6B,KAClEtc,KAID,WAAWY,EAAmBoK,GACpC,MAAMsV,EAAStgB,KAAK0hB,WACdO,EAAU,CACd/Z,MAAOlI,KAAK8gB,aAAa5Y,MACzBC,OAAQnI,KAAK8gB,aAAa3Y,OAC1BnH,KAAMhB,KAAK8gB,aAAa9f,KACxBE,IAAKlB,KAAK8gB,aAAa5f,KAEnBghB,EAAUthB,EAAMqc,QAAUqD,EAAOrD,QACjCkF,EAAUvhB,EAAMsc,QAAUoD,EAAOpD,QAEnClS,EAAI0L,QAAQ,MAAQ,IACtBuL,EAAQ/Z,OAAStH,EAAMqc,QAAUqD,EAAOrD,SAEtCjS,EAAI0L,QAAQ,MAAQ,IACtBuL,EAAQ9Z,QAAUvH,EAAMsc,QAAUoD,EAAOpD,SAEvClS,EAAI0L,QAAQ,MAAQ,IACtBuL,EAAQ/Z,OAASga,EACjBD,EAAQjhB,MAAQkhB,GAEdlX,EAAI0L,QAAQ,MAAQ,IACtBuL,EAAQ9Z,QAAUga,EAClBF,EAAQ/gB,KAAOihB,GAEjB,MAAMC,EAAUpiB,KAAKqiB,gBAAgBJ,EAAQ/Z,MAAO+Z,EAAQ9Z,QAa5D,OAZI8Z,EAAQ/Z,QAAUka,EAAQla,QACxB8C,EAAI0L,QAAQ,MAAQ,IACtBuL,EAAQjhB,MAAQohB,EAAQla,MAAQ+Z,EAAQ/Z,OAE1C+Z,EAAQ/Z,MAAQka,EAAQla,OAEtB+Z,EAAQ9Z,SAAWia,EAAQja,SACzB6C,EAAI0L,QAAQ,MAAQ,IACtBuL,EAAQ/gB,KAAOkhB,EAAQja,OAAS8Z,EAAQ9Z,QAE1C8Z,EAAQ9Z,OAASia,EAAQja,QAEpB8Z,EAID,gBAAgBK,EAAgBC,GACtC,MAAMC,EAAWxiB,KAAKqa,OAAOmI,UAAYF,EACnCxS,EAAW9P,KAAKqa,OAAOvK,UAAYwS,EACnCG,EAAYziB,KAAKqa,OAAOoI,WAAaF,EACrCG,EAAY1iB,KAAKqa,OAAOqI,WAAaH,EAG3C,MAAO,CAAEra,MAFK7G,KAAK2K,IAAIwW,EAAUnhB,KAAKC,IAAIwO,EAAUwS,IAEpCna,OADD9G,KAAK2K,IAAIyW,EAAWphB,KAAKC,IAAIohB,EAAWH,KAKjD,eACN,IAAI/H,EAAkB,CAAExZ,KAAM,EAAGE,IAAK,EAAGgH,MAAO,EAAGC,OAAQ,GAC3D,GAA+B,aAA3BnI,KAAKD,GAAGiR,MAAM1J,SAAyB,CACzC,MAAMqb,EAAgB3iB,KAAKD,GAAGoF,eACxB,KAAEnE,EAAI,IAAEE,GAAQyhB,EAAc9M,wBACpC2E,EAAkB,CAAExZ,OAAME,MAAKgH,MAAO,EAAGC,OAAQ,GAMnD,OAJA+S,OAAO/D,KAAKnX,KAAK6gB,cAAgB7gB,KAAK8gB,cAAc3X,SAAQ4E,IAC1D,MAAMwJ,EAAQvX,KAAK6gB,aAAa9S,GAChC/N,KAAKD,GAAGiR,MAAMjD,GAAOwJ,EAAQiD,EAAgBzM,GAAO,QAE/C/N,KAID,kBAGN,OAFAA,KAAKqhB,SAASlY,SAAQsG,GAAUA,EAAOwL,mBAChCjb,KAAKqhB,SACLrhB,MArQX,gBAmBiB,EAAAgiB,iBAAmB,CAAC,QAAS,SAAU,WAAY,OAAQ,MAAO,UAAW,W,8ECrC9F,MAAanG,EAiBJ,aAAa9b,GAClB,MAAMc,EAAOd,EAAGuE,WAAU,GAE1B,OADAzD,EAAKsY,gBAAgB,MACdtY,EAGF,gBAAgBd,EAAiB6d,GACtC,IAAIha,EAEFA,EADoB,iBAAXga,EACIpY,SAASC,cAAcmY,GAEvBA,EAEXha,GACFA,EAAWwD,OAAOrH,GAIf,2BAA2BA,GAC3B,aAAe6iB,KAAK3d,OAAO0T,iBAAiB5Y,GAAIuH,YACnDvH,EAAGiR,MAAM1J,SAAW,YAIjB,mBAAmBvH,EAAiB8iB,GACzC,GAAIA,aAAkB3H,OACpB,IAAK,MAAM4H,KAAKD,EACVA,EAAOzJ,eAAe0J,KACpBnW,MAAMC,QAAQiW,EAAOC,IAEtBD,EAAOC,GAAgB3Z,SAAQF,IAC9BlJ,EAAGiR,MAAM8R,GAAK7Z,KAGhBlJ,EAAGiR,MAAM8R,GAAKD,EAAOC,IAOxB,iBAAoB9Q,EAA2B+Q,GACpD,MAAMC,EAAW,kCAAkCrM,MAAM,KACnDsM,EAAU,8CAA8CtM,MAAM,KAC9DuM,EAAM,CAAEne,KAAMge,EAAKhe,MACnBoe,EAAM,CACVC,OAAQ,EACRC,MAAO,EACPC,QAAS,EACT3L,SAAS,EACT4L,YAAY,EACZC,YAAaxR,EACb9K,OAAQ6b,EAAK7b,OAAS6b,EAAK7b,OAAS8K,EAAE9K,QAQxC,OANI8K,aAAayR,WACfvI,OAAOwI,OAAOP,EAAK,CAAE/F,aAAcpL,EAAEoL,eAEvCvB,EAAQ8H,WAAWT,EAAKlR,EAAGgR,GAC3BnH,EAAQ8H,WAAWT,EAAKlR,EAAGiR,GAC3BpH,EAAQ8H,WAAWT,EAAKC,EAAKjI,OAAO/D,KAAKgM,IAClCD,EAID,kBAAkBU,EAAcC,EAAcC,GACpD,IAAK,IAAI5Y,EAAI,EAAGA,EAAI4Y,EAAMnZ,OAAQO,IAAK,CACrC,MAAM6Y,EAAID,EAAM5Y,GAChB0Y,EAAIG,GAAKF,EAAIE,KApFnB,YAEgB,EAAA3F,4BAA+B,MAC3C,IAAI4F,GAAkB,EAClBC,EAAc,OAUlB,OAPAze,SAASsR,iBAAiB,OAAQmN,EAAa,CAC7C,cAEE,OADAD,GAAkB,GACX,KAGXxe,SAASwR,oBAAoB,OAAQiN,GAC9BD,GAZmC,I,yaCH9C,eACA,SAGA,QAEA,SAGA,WAKA,MAAaE,UAA0B,EAAAtkB,YAE9B,UAAUG,EAAyBS,EAAcuN,EAAawJ,GAwBnE,OAvBAvX,KAAKmkB,eAAepkB,GAAIoJ,SAAQib,IAC9B,GAAa,YAAT5jB,GAA+B,WAATA,EACxB4jB,EAAI3E,YAAYjf,UACX,GAAa,YAATA,EACL4jB,EAAI3E,aACN2E,EAAIC,sBAED,GAAa,WAAT7jB,EACT4jB,EAAIE,eAAe,CAAE,CAACvW,GAAMwJ,QACvB,CACL,MAAM7U,EAAO0hB,EAAIrkB,GAAGI,cAAcuC,KAClC,IAAI4N,EAAU8T,EAAIrkB,GAAG+C,aAAa,qBAAuBshB,EAAIrkB,GAAG+C,aAAa,qBAAuBJ,EAAKlC,KAAKN,UAAUoQ,QACxH8T,EAAIE,eAAe,OAAD,sCACb5hB,EAAKlC,KAAKN,WACV,CAAEoQ,QAASA,IACX,CACD3H,MAAOnI,EAAKmI,MACZC,KAAMpI,EAAKoI,KACXE,OAAQtI,EAAKsI,cAKd9I,KAGF,UAAUD,EAAyBS,EAAcuN,EAAawJ,GAyBnE,OAxBAvX,KAAKmkB,eAAepkB,GAAIoJ,SAAQib,IAC9B,GAAa,YAAT5jB,GAA+B,WAATA,EACxB4jB,EAAI7E,aAAe6E,EAAI7E,YAAY/e,UAC9B,GAAa,YAATA,EACL4jB,EAAI7E,aACN6E,EAAIG,sBAED,GAAa,WAAT/jB,EACT4jB,EAAII,eAAe,CAAE,CAACzW,GAAMwJ,QACvB,CACL,MAAM7U,EAAO0hB,EAAIrkB,GAAGI,cAAcuC,KAClC0hB,EAAII,eAAe,OAAD,wBACb9hB,EAAKlC,KAAKP,WACV,CACDwkB,YAAc/hB,EAAKlC,KAAK0Q,YAAcxO,EAAKlC,KAAKkkB,QAC5ChiB,EAAK3C,GAAGoF,cACPzC,EAAKlC,KAAKP,UAAUwkB,aAAe,KACxC9b,MAAOnI,EAAKmI,MACZC,KAAMpI,EAAKoI,KACXC,KAAMrI,EAAKqI,YAKZ7I,KAGF,OAAOD,EAAsBS,GAElC,OADAR,KAAKmkB,eAAepkB,GAAIoJ,SAAQib,GAAOA,EAAII,eAAehkB,KACnDR,KAGF,UAAUD,EAAyBS,EAA0BuN,EAAawJ,GAkB/E,MAjB2B,mBAAhB/W,EAAKiC,QAA0BjC,EAAKmkB,UAC7CnkB,EAAKmkB,QAAUnkB,EAAKiC,OACpBjC,EAAKiC,OAAU1C,GAAOS,EAAKmkB,QAAQ5kB,IAErCC,KAAKmkB,eAAepkB,GAAIoJ,SAAQib,IACjB,YAAT5jB,GAA+B,WAATA,EACxB4jB,EAAI5E,aAAe4E,EAAI5E,YAAYhf,KACjB,YAATA,EACL4jB,EAAI5E,aACN4E,EAAIQ,iBAEY,WAATpkB,EACT4jB,EAAIS,eAAe,CAAE,CAAC9W,GAAMwJ,IAE5B6M,EAAIS,eAAerkB,MAGhBR,KAIF,YAAYD,GACjB,OAAOA,GAAMA,EAAGuf,WAAavf,EAAGuf,UAAUE,cAAgBzf,EAAGuf,UAAUE,YAAYtF,SAI9E,YAAYna,GACjB,OAAOA,GAAMA,EAAGuf,WAAavf,EAAGuf,UAAUC,cAAgBxf,EAAGuf,UAAUC,YAAYrF,SAI9E,YAAYna,GACjB,OAAOA,GAAMA,EAAGuf,WAAavf,EAAGuf,UAAUG,cAAgB1f,EAAGuf,UAAUG,YAAYvF,SAG9E,GAAGna,EAAyByW,EAAcC,GAS/C,OARAzW,KAAKmkB,eAAepkB,GAAIoJ,SAAQib,GAC9BA,EAAIvhB,GAAG2T,GAAO5V,IACZ6V,EACE7V,EACA,EAAAya,UAAUC,YAAc,EAAAD,UAAUC,YAAYvb,GAAKa,EAAMsG,OACzD,EAAAmU,UAAUC,YAAc,EAAAD,UAAUC,YAAYxX,OAAS,WAGtD9D,KAGF,IAAID,EAAyByW,GAElC,OADAxW,KAAKmkB,eAAepkB,GAAIoJ,SAAQib,GAAOA,EAAI1gB,IAAI8S,KACxCxW,KAID,eAAegJ,EAAuB8b,GAAS,GACrD,IAAIC,EAAQ,EAAAxgB,MAAM2E,YAAYF,GAC9B,IAAK+b,EAAMpa,OAAU,MAAO,GAC5B,IAAIsJ,EAAO8Q,EAAMvX,KAAIwE,GAAKA,EAAEsN,YAAcwF,EAAS,EAAAzF,UAAUa,KAAKlO,GAAK,QAEvE,OADK8S,GAAU7Q,EAAKzH,QAAOwY,GAAKA,IACzB/Q,GAzHX,sBA8HA,EAAArU,YAAY0J,eAAe4a,I,8YC/I3B,YACA,YACA,WACA,YACA,YAEA,a,qMCOA,oBAAyBvkB,EAAMslB,EAAGC,EAAiBC,EAAiBC,GAClE,IAAIC,EAAU,IAAIC,KAChBxS,QAAQK,KAAK,2BAA6B+R,EAAU,sBAAwBE,EAA/D,gCACFD,EAAU,gDACdF,EAAEzI,MAAM7c,EAAM2lB,IAGvB,OADAD,EAAQ/kB,UAAY2kB,EAAE3kB,UACf+kB,GAIT,wBAA6B7kB,EAAwB0kB,EAAiBC,EAAiBC,QAC/DpgB,IAAlBxE,EAAK0kB,KACP1kB,EAAK2kB,GAAW3kB,EAAK0kB,GACrBpS,QAAQK,KAAK,yBAA2B+R,EAAU,sBAAwBE,EAAM,gCAC9ED,EAAU,kDAKhB,2BAAgC3kB,EAAwB0kB,EAAiBE,EAAarC,QAC9D/d,IAAlBxE,EAAK0kB,IACPpS,QAAQK,KAAK,yBAA2B+R,EAAU,sBAAwBE,EAAMrC,IAKpF,wBAA6BhjB,EAAiBmlB,EAAiBC,EAAiBC,GAC9E,IAAIG,EAAUxlB,EAAG+C,aAAaoiB,GACd,OAAZK,IACFxlB,EAAGoH,aAAage,EAASI,GACzBzS,QAAQK,KAAK,4BAA8B+R,EAAU,KAAOK,EAAU,oCAAsCH,EAAM,gCAChHD,EAAU,kDAOhB,MAAa5gB,EAGX,mBAAmByE,GACjB,GAAmB,iBAARA,EAAkB,CAC3B,IAAIiL,EAAOzO,SAASsT,iBAAiB9P,GAKrC,OAJKiL,EAAKtJ,QAAqB,MAAX3B,EAAI,IAAyB,MAAXA,EAAI,KACxCiL,EAAOzO,SAASsT,iBAAiB,IAAM9P,GAClCiL,EAAKtJ,SAAUsJ,EAAOzO,SAASsT,iBAAiB,IAAM9P,KAEtD2D,MAAMuI,KAAKjB,GAEpB,MAAO,CAACjL,GAIV,kBAAkBA,GAChB,GAAmB,iBAARA,EAAkB,CAC3B,IAAKA,EAAI2B,OAAU,OAAO,KAC1B,GAAe,MAAX3B,EAAI,GACN,OAAOxD,SAASggB,eAAexc,EAAIyc,UAAU,IAE/C,GAAe,MAAXzc,EAAI,IAAyB,MAAXA,EAAI,GACxB,OAAOxD,SAASC,cAAcuD,GAIhC,IAAI8C,OAAO9C,EAAI,IACb,OAAOxD,SAASggB,eAAexc,GAIjC,IAAIjJ,EAAKyF,SAASC,cAAcuD,GAGhC,OAFKjJ,IAAMA,EAAKyF,SAASggB,eAAexc,IACnCjJ,IAAMA,EAAKyF,SAASC,cAAc,IAAMuD,IACtCjJ,EAET,OAAOiJ,EAIT,qBAAqBoK,EAAoBsS,GACvC,QAAStS,EAAEhS,EAAIgS,EAAEjR,GAAKujB,EAAEtkB,GAAKskB,EAAEtkB,EAAIskB,EAAEvjB,GAAKiR,EAAEhS,GAAKgS,EAAE7R,EAAI6R,EAAEhR,GAAKsjB,EAAEnkB,GAAKmkB,EAAEnkB,EAAImkB,EAAEtjB,GAAKgR,EAAE7R,GAStF,YAAYmI,EAAwBsB,EAAcnD,GAChD,IAAKA,EAAQ,CACX,IAAI8d,EAASjc,EAAM8D,KAAIjD,GAAKA,EAAEnJ,EAAImJ,EAAEpI,IACpC0F,EAASxG,KAAKC,OAAOqkB,GAGvB,OAAa,IAAT3a,EACKtB,EAAMuB,MAAK,CAACmI,EAAGsS,IAAOA,EAAEtkB,EAAIskB,EAAEnkB,EAAIsG,GAASuL,EAAEhS,EAAIgS,EAAE7R,EAAIsG,KAEvD6B,EAAMuB,MAAK,CAACya,EAAGtS,IAAOsS,EAAEtkB,EAAIskB,EAAEnkB,EAAIsG,GAASuL,EAAEhS,EAAIgS,EAAE7R,EAAIsG,KASlE,wBAAwByL,EAAYsK,GAClC,IAAI5M,EAA0BxL,SAAS8M,cAAc,SAiBrD,OAhBAtB,EAAM7J,aAAa,OAAQ,YAC3B6J,EAAM7J,aAAa,cAAemM,GAE7BtC,EAAc4U,WAEhB5U,EAAc4U,WAAWC,QAAU,GAEpC7U,EAAM3O,YAAYmD,SAASsgB,eAAe,KAEvClI,EAKHA,EAAOmI,aAAa/U,EAAO4M,EAAOoI,aAHlCpI,EAASpY,SAASygB,qBAAqB,QAAQ,IACxC5jB,YAAY2O,GAIdA,EAAMkV,MAIf,wBAAwB5S,GACtB,IAAIvT,EAAKyF,SAASC,cAAc,qBAAuB6N,EAAK,KACvDvT,GAAOA,EAAG6D,YACf7D,EAAG6D,WAAWiO,YAAY9R,GAI5B,kBAAkBmmB,EAAsBvjB,EAAkBwjB,GAC3B,mBAAlBD,EAAME,QACfF,EAAME,QAAQzjB,EAAUwjB,GACa,mBAArBD,EAAMG,YACtBH,EAAMG,WAAW,GAAG1jB,KAAYwjB,MAKpC,cAAcG,GACZ,MAAiB,kBAANA,EACFA,EAEQ,iBAANA,IAEM,MADfA,EAAIA,EAAEC,gBACqB,OAAND,GAAoB,UAANA,GAAuB,MAANA,GAE/Cjc,QAAQic,GAGjB,gBAAgB/O,GACd,OAAkB,OAAVA,GAAmC,IAAjBA,EAAM5M,YAAgB3F,EAAY6G,OAAO0L,GAGrE,mBAAmBtO,GACjB,IAAI7G,EACA0S,EAAO,KACX,GAAmB,iBAAR7L,EAAkB,CAC3B,IAAIkU,EAAQlU,EAAIkU,MAAM,yEACtB,IAAKA,EACH,MAAM,IAAIqJ,MAAM,kBAElB1R,EAAOqI,EAAM,IAAM,KACnB/a,EAAIqkB,WAAWtJ,EAAM,SAErB/a,EAAI6G,EAEN,MAAO,CAAE7G,IAAG0S,QAKd,gBAAgB5N,KAAWwf,GAczB,OAZAA,EAAQvd,SAAQwd,IACd,IAAK,MAAM5Y,KAAO4Y,EAAQ,CACxB,IAAKA,EAAOvN,eAAerL,GAAQ,OACf,OAAhB7G,EAAO6G,SAAiC/I,IAAhBkC,EAAO6G,GACjC7G,EAAO6G,GAAO4Y,EAAO5Y,GACW,iBAAhB4Y,EAAO5Y,IAA4C,iBAAhB7G,EAAO6G,IAE1D/N,KAAK4L,SAAS1E,EAAO6G,GAAM4Y,EAAO5Y,QAKjC7G,EAIT,YAAYkM,EAAYsS,GACtB,GAAiB,iBAANtS,EAAmB,OAAOA,GAAKsS,EAC1C,UAAWtS,UAAasS,EAAK,OAAO,EAEpC,GAAIxK,OAAO/D,KAAK/D,GAAGzI,SAAWuQ,OAAO/D,KAAKuO,GAAG/a,OAAU,OAAO,EAC9D,IAAK,MAAMoD,KAAOqF,EAChB,GAAIA,EAAErF,KAAS2X,EAAE3X,GAAQ,OAAO,EAElC,OAAO,EAKT,aAAa7G,GACX,OAAO,OAAP,UAAWA,GAIb,sBAAsBnH,EAAiByW,GAErC,OADAzW,EAAKA,EAAGoF,eAEJpF,EAAGkG,UAAUwW,SAASjG,GAAczW,EACjCwE,EAAM4M,eAAepR,EAAIyW,GAFhB,KAMlB,gBAAgBC,EAAsBmQ,GACpC,IAAIC,GAAY,EAEhB,MAAO,IAAIvB,KACJuB,IACHpQ,EAAS+F,MAAMxc,KAAMslB,GACrBuB,GAAY,EACZ3hB,YAAW,IAAM2hB,GAAY,GAAOD,KAK1C,+BAA+B7mB,GAC7B,IAAIiR,EAAQjR,EAAGiR,MACXA,EAAM1J,UACR0J,EAAM6H,eAAe,YAEnB7H,EAAMhQ,MACRgQ,EAAM6H,eAAe,QAEnB7H,EAAM9P,KACR8P,EAAM6H,eAAe,OAEnB7H,EAAM9I,OACR8I,EAAM6H,eAAe,SAEnB7H,EAAM7I,QACR6I,EAAM6H,eAAe,UAKzB,uBAAuB9Y,GACrB,IAAI+mB,EAQJ,OANEA,EADS,OAAP/mB,EACS,KACFA,EAAGgnB,aAAehnB,EAAGinB,aACnBjnB,EAEAC,KAAKinB,gBAAgBlnB,EAAGoF,eAE9B2hB,EAIT,4BAA4B/mB,EAAiBuH,EAAyBK,GAEpE,IAAIiZ,EAAO7gB,EAAG8V,wBACVqR,EAA6BjiB,OAAOkiB,aAAe3hB,SAASsQ,gBAAgBkR,aAChF,GAAIpG,EAAK1f,IAAM,GACb0f,EAAKtI,OAAS4O,EACd,CAIA,IAAIE,EAAiBxG,EAAKtI,OAAS4O,EAC/BG,EAAezG,EAAK1f,IACpBomB,EAAWtnB,KAAKinB,gBAAgBlnB,GACpC,GAAiB,OAAbunB,EAAmB,CACrB,IAAIC,EAAaD,EAASvR,UACtB6K,EAAK1f,IAAM,GAAKyG,EAAW,EAEzB5H,EAAGoD,aAAe+jB,EACpBI,EAASvR,WAAapO,EAEtB2f,EAASvR,WAAa1U,KAAKof,IAAI4G,GAAgBhmB,KAAKof,IAAI9Y,GAAYA,EAAW0f,EAExE1f,EAAW,IAEhB5H,EAAGoD,aAAe+jB,EACpBI,EAASvR,WAAapO,EAEtB2f,EAASvR,WAAaqR,EAAiBzf,EAAWA,EAAWyf,GAIjE9f,EAASpG,KAAOomB,EAASvR,UAAYwR,KApQ7C,YCvDIC,EAA2B,GCE/B,ODCA,SAASC,EAAoBC,GAE5B,GAAGF,EAAyBE,GAC3B,OAAOF,EAAyBE,GAAUnoB,QAG3C,IAAIC,EAASgoB,EAAyBE,GAAY,CAGjDnoB,QAAS,IAOV,OAHAooB,EAAoBD,GAAUE,KAAKpoB,EAAOD,QAASC,EAAQA,EAAOD,QAASkoB,GAGpEjoB,EAAOD,QCjBRkoB,CAAoB,M","file":"gridstack-h5.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"GridStack\"] = factory();\n\telse\n\t\troot[\"GridStack\"] = factory();\n})(self, function() {\nreturn ","// gridstack-GridStackDD.get().ts 3.0.0 @preserve\r\n\r\n/**\r\n * https://gridstackjs.com/\r\n * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov\r\n * gridstack.js may be freely distributed under the MIT license.\r\n*/\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\n\r\nimport { GridStackDDI } from './gridstack-ddi';\r\nimport { GridItemHTMLElement, GridStackNode, GridStackElement, DDUIData, DDDragInOpt } from './types';\r\nimport { GridStack } from './gridstack';\r\nimport { Utils } from './utils';\r\n\r\n/** Drag&Drop drop options */\r\nexport type DDDropOpt = {\r\n /** function or class type that this grid will accept as dropped items (see GridStackOptions.acceptWidgets) */\r\n accept?: (el: GridItemHTMLElement) => boolean;\r\n}\r\n\r\n/** drag&drop options currently called from the main code, but others can be passed in grid options */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport type DDOpts = 'enable' | 'disable' | 'destroy' | 'option' | string | any;\r\nexport type DDKey = 'minWidth' | 'minHeight';\r\nexport type DDValue = number | string;\r\n\r\n/** drag&drop events callbacks */\r\nexport type DDCallback = (event: Event, arg2: GridItemHTMLElement, helper?: GridItemHTMLElement) => void;\r\n\r\n/**\r\n * Base class implementing common Grid drag'n'drop functionality, with domain specific subclass (h5 vs jq subclasses)\r\n */\r\nexport abstract class GridStackDD extends GridStackDDI {\r\n\r\n /** override to cast to correct type */\r\n static get(): GridStackDD {\r\n return GridStackDDI.get() as GridStackDD;\r\n }\r\n\r\n /** removes any drag&drop present (called during destroy) */\r\n public remove(el: GridItemHTMLElement): GridStackDD {\r\n this.draggable(el, 'destroy').resizable(el, 'destroy');\r\n if (el.gridstackNode) {\r\n delete el.gridstackNode._initDD; // reset our DD init flag\r\n }\r\n return this;\r\n }\r\n\r\n // APIs that must be implemented by subclasses to do actual darg/drop/resize called by GridStack code below\r\n\r\n public abstract resizable(el: GridItemHTMLElement, opts: DDOpts, key?: DDKey, value?: DDValue): GridStackDD;\r\n\r\n public abstract isResizable(el: HTMLElement): boolean;\r\n\r\n public abstract draggable(el: GridItemHTMLElement, opts: DDOpts, key?: DDKey, value?: DDValue): GridStackDD;\r\n\r\n public abstract dragIn(el: GridStackElement, opts: DDDragInOpt): GridStackDD;\r\n\r\n public abstract isDraggable(el: HTMLElement): boolean;\r\n\r\n public abstract droppable(el: GridItemHTMLElement, opts: DDOpts | DDDropOpt, key?: DDKey, value?: DDValue): GridStackDD;\r\n\r\n public abstract isDroppable(el: HTMLElement): boolean;\r\n\r\n public abstract on(el: GridItemHTMLElement, eventName: string, callback: DDCallback): GridStackDD;\r\n\r\n public abstract off(el: GridItemHTMLElement, eventName: string): GridStackDD;\r\n}\r\n\r\n/********************************************************************************\r\n * GridStack code that is doing drag&drop extracted here so main class is smaller\r\n * for static grid that don't do any of this work anyway. Saves about 10k.\r\n ********************************************************************************/\r\n\r\n/** @internal called to add drag over support to support widgets */\r\nGridStack.prototype._setupAcceptWidget = function(): GridStack {\r\n if (this.opts.staticGrid || !this.opts.acceptWidgets) return this;\r\n\r\n let onDrag = (event, el: GridItemHTMLElement) => {\r\n let node = el.gridstackNode;\r\n let pos = this.getCellFromPixel({left: event.pageX, top: event.pageY}, true);\r\n let x = Math.max(0, pos.x);\r\n let y = Math.max(0, pos.y);\r\n if (!node._added) {\r\n node._added = true;\r\n\r\n node.el = el;\r\n node.x = x;\r\n node.y = y;\r\n delete node.autoPosition;\r\n this.engine.cleanNodes();\r\n this.engine.beginUpdate(node);\r\n this.engine.addNode(node);\r\n\r\n this._writeAttrs(this.placeholder, node.x, node.y, node.w, node.h);\r\n this.el.appendChild(this.placeholder);\r\n node.el = this.placeholder; // dom we update while dragging...\r\n node._beforeDragX = node.x;\r\n node._beforeDragY = node.y;\r\n\r\n this._updateContainerHeight();\r\n } else if ((x !== node.x || y !== node.y) && this.engine.canMoveNode(node, x, y)) {\r\n this.engine.moveNode(node, x, y);\r\n this._updateContainerHeight();\r\n }\r\n };\r\n\r\n GridStackDD.get()\r\n .droppable(this.el, {\r\n accept: (el: GridItemHTMLElement) => {\r\n let node: GridStackNode = el.gridstackNode;\r\n if (node && node.grid === this) {\r\n return true; // set accept drop to true on ourself (which we ignore) so we don't get \"can't drop\" icon in HTML5 mode while moving\r\n }\r\n if (typeof this.opts.acceptWidgets === 'function') {\r\n return this.opts.acceptWidgets(el);\r\n }\r\n let selector = (this.opts.acceptWidgets === true ? '.grid-stack-item' : this.opts.acceptWidgets as string);\r\n return el.matches(selector);\r\n }\r\n })\r\n .on(this.el, 'dropover', (event, el: GridItemHTMLElement) => {\r\n // ignore drop enter on ourself, and prevent parent from receiving event\r\n let node = el.gridstackNode || {};\r\n if (node.grid === this) {\r\n delete node._added; // reset this to track placeholder again in case we were over other grid #1484 (dropout doesn't always clear)\r\n return false;\r\n }\r\n\r\n // see if we already have a node with widget/height and check for attributes\r\n if (el.getAttribute && (!node.w || !node.h)) {\r\n let w = parseInt(el.getAttribute('gs-w'));\r\n if (w > 0) { node.w = w; }\r\n let h = parseInt(el.getAttribute('gs-h'));\r\n if (h > 0) { node.h = h; }\r\n }\r\n\r\n // if the item came from another grid, let it know it was added here to removed duplicate shadow #393\r\n if (node.grid && node.grid !== this) {\r\n node._added = true;\r\n }\r\n\r\n // if not calculate the grid size based on element outer size\r\n let w = node.w || Math.round(el.offsetWidth / this.cellWidth()) || 1;\r\n let h = node.h || Math.round(el.offsetHeight / this.getCellHeight(true)) || 1;\r\n\r\n // copy the node original values (min/max/id/etc...) but override width/height/other flags which are this grid specific\r\n let newNode = this.engine.prepareNode({...node, ...{w, h, _added: false, _temporary: true}});\r\n newNode._isOutOfGrid = true;\r\n el.gridstackNode = newNode;\r\n el._gridstackNodeOrig = node;\r\n\r\n GridStackDD.get().on(el, 'drag', onDrag);\r\n return false; // prevent parent from receiving msg (which may be grid as well)\r\n })\r\n .on(this.el, 'dropout', (event, el: GridItemHTMLElement) => {\r\n let node = el.gridstackNode;\r\n if (!node) { return; }\r\n\r\n // clear any added flag now that we are leaving #1484\r\n delete node._added;\r\n\r\n // jquery-ui bug. Must verify widget is being dropped out\r\n // check node variable that gets set when widget is out of grid\r\n if (!node._isOutOfGrid) {\r\n return;\r\n }\r\n\r\n GridStackDD.get().off(el, 'drag');\r\n node.el = null;\r\n this.engine.removeNode(node);\r\n if (this.placeholder.parentNode === this.el) {\r\n this.placeholder.remove();\r\n }\r\n this._updateContainerHeight();\r\n el.gridstackNode = el._gridstackNodeOrig;\r\n return false; // prevent parent from receiving msg (which may be grid as well)\r\n })\r\n .on(this.el, 'drop', (event, el: GridItemHTMLElement, helper: GridItemHTMLElement) => {\r\n let node = el.gridstackNode;\r\n // ignore drop on ourself from ourself - dragend will handle the simple move instead\r\n if (node && node.grid === this) { return false; }\r\n\r\n this.placeholder.remove();\r\n\r\n // notify previous grid of removal\r\n let origNode = el._gridstackNodeOrig;\r\n delete el._gridstackNodeOrig;\r\n if (origNode && origNode.grid && origNode.grid !== this) {\r\n let oGrid = origNode.grid;\r\n oGrid.placeholder.remove();\r\n origNode.el = el; // was using placeholder, have it point to node we've moved instead\r\n oGrid.engine.removedNodes.push(origNode);\r\n oGrid._triggerRemoveEvent();\r\n }\r\n\r\n // use existing placeholder node as it's already in our list with drop location\r\n if (!node) { return false; }\r\n const _id = node._id;\r\n this.engine.cleanupNode(node); // removes all internal _xyz values (including the _id so add that back)\r\n node._id = _id;\r\n node.grid = this;\r\n GridStackDD.get().off(el, 'drag');\r\n // if we made a copy ('helper' which is temp) of the original node then insert a copy, else we move the original node (#1102)\r\n // as the helper will be nuked by jqueryui otherwise\r\n if (helper !== el) {\r\n helper.remove();\r\n el.gridstackNode = origNode; // original item (left behind) is re-stored to pre dragging as the node now has drop info\r\n el = el.cloneNode(true) as GridItemHTMLElement;\r\n } else {\r\n el.remove(); // reduce flicker as we change depth here, and size further down\r\n GridStackDD.get().remove(el);\r\n }\r\n el.gridstackNode = node;\r\n node.el = el;\r\n\r\n Utils.removePositioningStyles(el);\r\n this._writeAttr(el, node);\r\n this.el.appendChild(el);\r\n this._updateContainerHeight();\r\n this.engine.addedNodes.push(node);\r\n this._triggerAddEvent();\r\n this._triggerChangeEvent();\r\n\r\n this.engine.endUpdate();\r\n if (this._gsEventHandler['dropped']) {\r\n this._gsEventHandler['dropped']({type: 'dropped'}, origNode && origNode.grid ? origNode : undefined, node);\r\n }\r\n\r\n // wait till we return out of the drag callback to set the new drag&resize handler or they may get messed up\r\n // IFF we are still there (some application will use as placeholder and insert their real widget instead)\r\n window.setTimeout(() => {\r\n if (node.el && node.el.parentElement) this._prepareDragDropByNode(node);\r\n });\r\n\r\n return false; // prevent parent from receiving msg (which may be grid as well)\r\n });\r\n return this;\r\n}\r\n\r\n/** @internal called to setup a trash drop zone if the user specifies it */\r\nGridStack.prototype._setupRemoveDrop = function(): GridStack {\r\n if (!this.opts.staticGrid && typeof this.opts.removable === 'string') {\r\n let trashEl = document.querySelector(this.opts.removable) as HTMLElement;\r\n if (!trashEl) return this;\r\n // only register ONE dropover/dropout callback for the 'trash', and it will\r\n // update the passed in item and parent grid because the 'trash' is a shared resource anyway,\r\n // and Native DD only has 1 event CB (having a list and technically a per grid removableOptions complicates things greatly)\r\n if (!GridStackDD.get().isDroppable(trashEl)) {\r\n GridStackDD.get().droppable(trashEl, this.opts.removableOptions)\r\n .on(trashEl, 'dropover', function(event, el) { // don't use => notation to avoid using 'this' as grid by mistake...\r\n let node = el.gridstackNode;\r\n if (!node || !node.grid) return;\r\n el.dataset.inTrashZone = 'true';\r\n node.grid._setupRemovingTimeout(el);\r\n })\r\n .on(trashEl, 'dropout', function(event, el) { // same\r\n let node = el.gridstackNode;\r\n if (!node || !node.grid) return;\r\n delete el.dataset.inTrashZone;\r\n node.grid._clearRemovingTimeout(el);\r\n });\r\n }\r\n }\r\n return this;\r\n}\r\n\r\n/** @internal */\r\nGridStack.prototype._setupRemovingTimeout = function(el: GridItemHTMLElement): GridStack {\r\n let node = el.gridstackNode;\r\n if (!node || node._removeTimeout || !this.opts.removable) return this;\r\n node._removeTimeout = window.setTimeout(() => {\r\n el.classList.add('grid-stack-item-removing');\r\n node._isAboutToRemove = true;\r\n }, this.opts.removeTimeout);\r\n return this;\r\n}\r\n\r\n/** @internal */\r\nGridStack.prototype._clearRemovingTimeout = function(el: GridItemHTMLElement): GridStack {\r\n let node = el.gridstackNode;\r\n if (!node || !node._removeTimeout) return this;\r\n clearTimeout(node._removeTimeout);\r\n delete node._removeTimeout;\r\n el.classList.remove('grid-stack-item-removing');\r\n delete node._isAboutToRemove;\r\n return this;\r\n}\r\n\r\n/** @internal call to setup dragging in from the outside (say toolbar), with options */\r\nGridStack.prototype._setupDragIn = function(): GridStack {\r\n if (!this.opts.staticGrid && typeof this.opts.dragIn === 'string') {\r\n if (!GridStackDD.get().isDraggable(this.opts.dragIn)) {\r\n GridStackDD.get().dragIn(this.opts.dragIn, this.opts.dragInOptions);\r\n }\r\n }\r\n return this;\r\n}\r\n\r\n/** @internal prepares the element for drag&drop **/\r\nGridStack.prototype._prepareDragDropByNode = function(node: GridStackNode): GridStack {\r\n let el = node.el;\r\n\r\n // check for disabled grid first\r\n if (this.opts.staticGrid || node.locked ||\r\n ((node.noMove || this.opts.disableDrag) && (node.noResize || this.opts.disableResize))) {\r\n if (node._initDD) {\r\n GridStackDD.get().remove(node.el); // nukes everything instead of just disable, will add some styles back next\r\n delete node._initDD;\r\n }\r\n node.el.classList.add('ui-draggable-disabled', 'ui-resizable-disabled'); // add styles one might depend on #1435\r\n return this;\r\n }\r\n // check if init already done\r\n if (node._initDD) {\r\n // fine tune drag vs move by disabling any part...\r\n if (node.noMove || this.opts.disableDrag) {\r\n GridStackDD.get().draggable(el, 'disable');\r\n }\r\n if (node.noResize || this.opts.disableResize) {\r\n GridStackDD.get().resizable(el, 'disable');\r\n }\r\n return this;\r\n }\r\n\r\n // remove our style that look like D&D\r\n node.el.classList.remove('ui-draggable-disabled', 'ui-resizable-disabled');\r\n\r\n // variables used/cashed between the 3 start/move/end methods, in addition to node passed above\r\n let cellWidth: number;\r\n let cellHeight: number;\r\n\r\n /** called when item starts moving/resizing */\r\n let onStartMoving = (event: Event, ui: DDUIData): void => {\r\n let target = event.target as HTMLElement;\r\n\r\n // trigger any 'dragstart' / 'resizestart' manually\r\n if (this._gsEventHandler[event.type]) {\r\n this._gsEventHandler[event.type](event, target);\r\n }\r\n\r\n this.engine.cleanNodes();\r\n this.engine.beginUpdate(node);\r\n cellWidth = this.cellWidth();\r\n cellHeight = this.getCellHeight(true); // force pixels for calculations\r\n\r\n this.placeholder.setAttribute('gs-x', target.getAttribute('gs-x'));\r\n this.placeholder.setAttribute('gs-y', target.getAttribute('gs-y'));\r\n this.placeholder.setAttribute('gs-w', target.getAttribute('gs-w'));\r\n this.placeholder.setAttribute('gs-h', target.getAttribute('gs-h'));\r\n this.el.append(this.placeholder);\r\n\r\n node.el = this.placeholder;\r\n node._beforeDragX = node.x;\r\n node._beforeDragY = node.y;\r\n node._prevYPix = ui.position.top;\r\n\r\n GridStackDD.get().resizable(el, 'option', 'minWidth', cellWidth * (node.minW || 1));\r\n GridStackDD.get().resizable(el, 'option', 'minHeight', cellHeight * (node.minH || 1));\r\n }\r\n\r\n /** called when item is being dragged/resized */\r\n let dragOrResize = (event: Event, ui: DDUIData): void => {\r\n let x = Math.round(ui.position.left / cellWidth);\r\n let y = Math.floor((ui.position.top + cellHeight / 2) / cellHeight);\r\n let w;\r\n let h;\r\n\r\n if (event.type === 'drag') {\r\n let distance = ui.position.top - node._prevYPix;\r\n node._prevYPix = ui.position.top;\r\n Utils.updateScrollPosition(el, ui.position, distance);\r\n // if inTrash, outside of the bounds or added to another grid (#393) temporarily remove it from us\r\n if (el.dataset.inTrashZone || x < 0 || x >= this.engine.column || y < 0 || (!this.engine.float && y > this.engine.getRow()) || node._added) {\r\n if (node._temporaryRemoved) { return; }\r\n if (this.opts.removable === true) {\r\n this._setupRemovingTimeout(el);\r\n }\r\n\r\n x = node._beforeDragX;\r\n y = node._beforeDragY;\r\n\r\n if (this.placeholder.parentNode === this.el) {\r\n this.placeholder.remove();\r\n }\r\n this.engine.removeNode(node);\r\n this._updateContainerHeight();\r\n\r\n node._temporaryRemoved = true;\r\n delete node._added; // no need for this now\r\n } else {\r\n this._clearRemovingTimeout(el);\r\n\r\n if (node._temporaryRemoved) {\r\n this.engine.addNode(node);\r\n this._writeAttrs(this.placeholder, x, y, w, h);\r\n this.el.appendChild(this.placeholder);\r\n node.el = this.placeholder;\r\n delete node._temporaryRemoved;\r\n }\r\n }\r\n } else if (event.type === 'resize') {\r\n if (x < 0) return;\r\n w = Math.round(ui.size.width / cellWidth);\r\n h = Math.round(ui.size.height / cellHeight);\r\n }\r\n // width and height are undefined if not resizing\r\n let _lastTriedW = (w || node._lastTriedW);\r\n let _lastTriedH = (h || node._lastTriedH);\r\n if (!this.engine.canMoveNode(node, x, y, w, h) ||\r\n (node._lastTriedX === x && node._lastTriedY === y &&\r\n node._lastTriedW === _lastTriedW && node._lastTriedH === _lastTriedH)) {\r\n return;\r\n }\r\n node._lastTriedX = x;\r\n node._lastTriedY = y;\r\n node._lastTriedW = w;\r\n node._lastTriedH = h;\r\n this.engine.moveNode(node, x, y, w, h);\r\n this._updateContainerHeight();\r\n }\r\n\r\n /** called when the item stops moving/resizing */\r\n let onEndMoving = (event: Event): void => {\r\n if (this.placeholder.parentNode === this.el) {\r\n this.placeholder.remove();\r\n }\r\n\r\n // if the item has moved to another grid, we're done here\r\n let target: GridItemHTMLElement = event.target as GridItemHTMLElement;\r\n if (!target.gridstackNode || target.gridstackNode.grid !== this) return;\r\n\r\n node.el = target;\r\n\r\n if (node._isAboutToRemove) {\r\n let gridToNotify = el.gridstackNode.grid;\r\n if (gridToNotify._gsEventHandler[event.type]) {\r\n gridToNotify._gsEventHandler[event.type](event, target);\r\n }\r\n gridToNotify.engine.removedNodes.push(node);\r\n GridStackDD.get().remove(el);\r\n delete el.gridstackNode; // hint we're removing it next and break circular link\r\n gridToNotify._triggerRemoveEvent();\r\n if (el.parentElement) {\r\n el.remove(); // finally remove it\r\n }\r\n } else {\r\n this._clearRemovingTimeout(el);\r\n if (!node._temporaryRemoved) {\r\n Utils.removePositioningStyles(target);\r\n this._writeAttrs(target, node.x, node.y, node.w, node.h);\r\n } else {\r\n Utils.removePositioningStyles(target);\r\n this._writeAttrs(target, node._beforeDragX, node._beforeDragY, node.w, node.h);\r\n node.x = node._beforeDragX;\r\n node.y = node._beforeDragY;\r\n delete node._temporaryRemoved;\r\n this.engine.addNode(node);\r\n }\r\n if (this._gsEventHandler[event.type]) {\r\n this._gsEventHandler[event.type](event, target);\r\n }\r\n }\r\n\r\n this._updateContainerHeight();\r\n this._triggerChangeEvent();\r\n\r\n this.engine.endUpdate();\r\n\r\n // if we re-sized a nested grid item, let the children resize as well\r\n if (event.type === 'resizestop') {\r\n this._resizeNestedGrids(target);\r\n }\r\n }\r\n\r\n GridStackDD.get()\r\n .draggable(el, {\r\n start: onStartMoving,\r\n stop: onEndMoving,\r\n drag: dragOrResize\r\n })\r\n .resizable(el, {\r\n start: onStartMoving,\r\n stop: onEndMoving,\r\n resize: dragOrResize\r\n });\r\n node._initDD = true; // we've set DD support now\r\n\r\n // finally fine tune drag vs move by disabling any part...\r\n if (node.noMove || this.opts.disableDrag) {\r\n GridStackDD.get().draggable(el, 'disable');\r\n }\r\n if (node.noResize || this.opts.disableResize) {\r\n GridStackDD.get().resizable(el, 'disable');\r\n }\r\n return this;\r\n}\r\n\r\n/**\r\n * Enables/Disables moving.\r\n * @param els widget or selector to modify.\r\n * @param val if true widget will be draggable.\r\n */\r\nGridStack.prototype.movable = function(els: GridStackElement, val: boolean): GridStack {\r\n if (val && this.opts.staticGrid) { return this; } // can't move a static grid!\r\n GridStack.getElements(els).forEach(el => {\r\n let node = el.gridstackNode;\r\n if (!node) { return }\r\n node.noMove = !(val || false);\r\n if (node.noMove) {\r\n GridStackDD.get().draggable(el, 'disable');\r\n el.classList.remove('ui-draggable-handle');\r\n } else {\r\n this._prepareDragDropByNode(node); // init DD if need be\r\n GridStackDD.get().draggable(el, 'enable');\r\n el.classList.remove('ui-draggable-handle');\r\n }\r\n });\r\n return this;\r\n}\r\n\r\n/**\r\n * Enables/Disables resizing.\r\n * @param els widget or selector to modify\r\n * @param val if true widget will be resizable.\r\n */\r\nGridStack.prototype.resizable = function(els: GridStackElement, val: boolean): GridStack {\r\n if (val && this.opts.staticGrid) { return this; } // can't resize a static grid!\r\n GridStack.getElements(els).forEach(el => {\r\n let node = el.gridstackNode;\r\n if (!node) { return; }\r\n node.noResize = !(val || false);\r\n if (node.noResize) {\r\n GridStackDD.get().resizable(el, 'disable');\r\n } else {\r\n this._prepareDragDropByNode(node); // init DD if need be\r\n GridStackDD.get().resizable(el, 'enable');\r\n }\r\n });\r\n return this;\r\n}\r\n","// gridstack-ddi.ts 3.0.0 @preserve\r\n\r\n/**\r\n * https://gridstackjs.com/\r\n * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov\r\n * gridstack.js may be freely distributed under the MIT license.\r\n*/\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\n\r\nimport { GridItemHTMLElement } from './types';\r\n\r\n/**\r\n * Abstract Partial Interface API for drag'n'drop plugin - look at GridStackDD and HTML5 / Jquery implementation versions\r\n */\r\nexport class GridStackDDI {\r\n\r\n protected static ddi: GridStackDDI;\r\n\r\n /** call this method to register your plugin instead of the default no-op one */\r\n static registerPlugin(pluginClass: typeof GridStackDDI): void {\r\n GridStackDDI.ddi = new pluginClass();\r\n }\r\n\r\n /** get the current registered plugin to use */\r\n static get(): GridStackDDI {\r\n if (!GridStackDDI.ddi) { GridStackDDI.registerPlugin(GridStackDDI); }\r\n return GridStackDDI.ddi;\r\n }\r\n\r\n /** removes any drag&drop present (called during destroy) */\r\n public remove(el: GridItemHTMLElement): GridStackDDI {\r\n return this; // no-op for static grids\r\n }\r\n}\r\n","// gridstack-engine.ts 3.0.0 @preserve\r\n\r\n/**\r\n * https://gridstackjs.com/\r\n * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov\r\n * gridstack.js may be freely distributed under the MIT license.\r\n*/\r\n\r\nimport { Utils, obsolete } from './utils';\r\nimport { GridStackNode, ColumnOptions, GridStackWidget } from './types';\r\n\r\nexport type onChangeCB = (nodes: GridStackNode[], removeDOM?: boolean) => void;\r\n\r\n/**\r\n * Defines the GridStack engine that does most no DOM grid manipulation.\r\n * See GridStack methods and vars for descriptions.\r\n *\r\n * NOTE: values should not be modified directly - call the main GridStack API instead\r\n */\r\nexport class GridStackEngine {\r\n public column: number;\r\n public maxRow: number;\r\n public nodes: GridStackNode[];\r\n public onchange: onChangeCB;\r\n public addedNodes: GridStackNode[] = [];\r\n public removedNodes: GridStackNode[] = [];\r\n public batchMode: boolean;\r\n /** @internal */\r\n private _float: boolean;\r\n /** @internal */\r\n private _prevFloat: boolean;\r\n /** @internal */\r\n private _layouts?: Layout[][]; // maps column # to array of values nodes\r\n /** @internal */\r\n private _ignoreLayoutsNodeChange: boolean;\r\n /** @internal */\r\n private static _idSeq = 1;\r\n\r\n public constructor(column = 12, onchange?: onChangeCB, float = false, maxRow = 0, nodes: GridStackNode[] = []) {\r\n this.column = column;\r\n this.onchange = onchange;\r\n this._float = float;\r\n this.maxRow = maxRow;\r\n this.nodes = nodes;\r\n }\r\n\r\n public batchUpdate(): GridStackEngine {\r\n if (this.batchMode) return this;\r\n this.batchMode = true;\r\n this._prevFloat = this._float;\r\n this._float = true; // let things go anywhere for now... commit() will restore and possibly reposition\r\n return this;\r\n }\r\n\r\n public commit(): GridStackEngine {\r\n if (!this.batchMode) return this;\r\n this.batchMode = false;\r\n this._float = this._prevFloat;\r\n delete this._prevFloat;\r\n this._packNodes();\r\n this._notify();\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n private _fixCollisions(node: GridStackNode): GridStackEngine {\r\n this._sortNodes(-1);\r\n\r\n let nn = node;\r\n let hasLocked = Boolean(this.nodes.find(n => n.locked));\r\n if (!this.float && !hasLocked) {\r\n nn = {x: 0, y: node.y, w: this.column, h: node.h};\r\n }\r\n while (true) {\r\n let collisionNode = this.nodes.find( n => n !== node && Utils.isIntercepted(n, nn), {node: node, nn: nn});\r\n if (!collisionNode) { return this }\r\n let moved;\r\n if (collisionNode.locked) {\r\n // if colliding with a locked item, move ourself instead\r\n moved = this.moveNode(node, node.x, collisionNode.y + collisionNode.h,\r\n node.w, node.h, true);\r\n } else {\r\n moved = this.moveNode(collisionNode, collisionNode.x, node.y + node.h,\r\n collisionNode.w, collisionNode.h, true);\r\n }\r\n if (!moved) { return this } // break inf loop if we couldn't move after all (ex: maxRow, fixed)\r\n }\r\n }\r\n\r\n public isAreaEmpty(x: number, y: number, w: number, h: number): boolean {\r\n let nn: GridStackNode = {x: x || 0, y: y || 0, w: w || 1, h: h || 1};\r\n let collisionNode = this.nodes.find(n => {\r\n return Utils.isIntercepted(n, nn);\r\n });\r\n return !collisionNode;\r\n }\r\n\r\n /** re-layout grid items to reclaim any empty space */\r\n public compact(): GridStackEngine {\r\n if (this.nodes.length === 0) { return this }\r\n this.batchUpdate();\r\n this._sortNodes();\r\n let copyNodes = this.nodes;\r\n this.nodes = []; // pretend we have no nodes to conflict layout to start with...\r\n copyNodes.forEach(node => {\r\n if (!node.noMove && !node.locked) {\r\n node.autoPosition = true;\r\n }\r\n this.addNode(node, false); // 'false' for add event trigger\r\n node._dirty = true; // force attr update\r\n });\r\n this.commit();\r\n return this;\r\n }\r\n\r\n /** enable/disable floating widgets (default: `false`) See [example](http://gridstackjs.com/demo/float.html) */\r\n public set float(val: boolean) {\r\n if (this._float === val) { return; }\r\n this._float = val || false;\r\n if (!val) {\r\n this._packNodes();\r\n this._notify();\r\n }\r\n }\r\n\r\n /** float getter method */\r\n public get float(): boolean { return this._float || false; }\r\n\r\n /** @internal */\r\n private _sortNodes(dir?: -1 | 1): GridStackEngine {\r\n this.nodes = Utils.sort(this.nodes, dir, this.column);\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n private _packNodes(): GridStackEngine {\r\n this._sortNodes();\r\n\r\n if (this.float) {\r\n this.nodes.forEach((n, i) => {\r\n if (n._updating || n._packY === undefined || n.y === n._packY) {\r\n return this;\r\n }\r\n let newY = n.y;\r\n while (newY >= n._packY) {\r\n let box: GridStackWidget = {x: n.x, y: newY, w: n.w, h: n.h};\r\n let collisionNode = this.nodes\r\n .slice(0, i)\r\n .find(bn => Utils.isIntercepted(box, bn), {n: n, newY: newY});\r\n if (!collisionNode) {\r\n n._dirty = true;\r\n n.y = newY;\r\n }\r\n --newY;\r\n }\r\n });\r\n } else {\r\n this.nodes.forEach((n, i) => {\r\n if (n.locked) { return this }\r\n while (n.y > 0) {\r\n let newY = n.y - 1;\r\n let canBeMoved = i === 0;\r\n let box: GridStackWidget = {x: n.x, y: newY, w: n.w, h: n.h};\r\n if (i > 0) {\r\n let collisionNode = this.nodes\r\n .slice(0, i)\r\n .find(bn => Utils.isIntercepted(box, bn), {n: n, newY: newY});\r\n canBeMoved = collisionNode === undefined;\r\n }\r\n\r\n if (!canBeMoved) { break; }\r\n // Note: must be dirty (from last position) for GridStack::OnChange CB to update positions\r\n // and move items back. The user 'change' CB should detect changes from the original\r\n // starting position instead.\r\n n._dirty = (n.y !== newY);\r\n n.y = newY;\r\n }\r\n });\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * given a random node, makes sure it's coordinates/values are valid in the current grid\r\n * @param node to adjust\r\n * @param resizing if out of bound, resize down or move into the grid to fit ?\r\n */\r\n public prepareNode(node: GridStackNode, resizing?: boolean): GridStackNode {\r\n node = node || {};\r\n node._id = node._id || GridStackEngine._idSeq++;\r\n\r\n // if we're missing position, have the grid position us automatically (before we set them to 0,0)\r\n if (node.x === undefined || node.y === undefined || node.x === null || node.y === null) {\r\n node.autoPosition = true;\r\n }\r\n\r\n // assign defaults for missing required fields\r\n let defaults: GridStackNode = { x: 0, y: 0, w: 1, h: 1};\r\n Utils.defaults(node, defaults);\r\n\r\n if (!node.autoPosition) { delete node.autoPosition; }\r\n if (!node.noResize) { delete node.noResize; }\r\n if (!node.noMove) { delete node.noMove; }\r\n\r\n // check for NaN (in case messed up strings were passed. can't do parseInt() || defaults.x above as 0 is valid #)\r\n if (typeof node.x == 'string') { node.x = Number(node.x); }\r\n if (typeof node.y == 'string') { node.y = Number(node.y); }\r\n if (typeof node.w == 'string') { node.w = Number(node.w); }\r\n if (typeof node.h == 'string') { node.h = Number(node.h); }\r\n if (isNaN(node.x)) { node.x = defaults.x; node.autoPosition = true; }\r\n if (isNaN(node.y)) { node.y = defaults.y; node.autoPosition = true; }\r\n if (isNaN(node.w)) { node.w = defaults.w; }\r\n if (isNaN(node.h)) { node.h = defaults.h; }\r\n\r\n if (node.maxW) { node.w = Math.min(node.w, node.maxW); }\r\n if (node.maxH) { node.h = Math.min(node.h, node.maxH); }\r\n if (node.minW) { node.w = Math.max(node.w, node.minW); }\r\n if (node.minH) { node.h = Math.max(node.h, node.minH); }\r\n\r\n if (node.w > this.column) {\r\n node.w = this.column;\r\n } else if (node.w < 1) {\r\n node.w = 1;\r\n }\r\n\r\n if (this.maxRow && node.h > this.maxRow) {\r\n node.h = this.maxRow;\r\n } else if (node.h < 1) {\r\n node.h = 1;\r\n }\r\n\r\n if (node.x < 0) {\r\n node.x = 0;\r\n }\r\n if (node.y < 0) {\r\n node.y = 0;\r\n }\r\n\r\n if (node.x + node.w > this.column) {\r\n if (resizing) {\r\n node.w = this.column - node.x;\r\n } else {\r\n node.x = this.column - node.w;\r\n }\r\n }\r\n if (this.maxRow && node.y + node.h > this.maxRow) {\r\n if (resizing) {\r\n node.h = this.maxRow - node.y;\r\n } else {\r\n node.y = this.maxRow - node.h;\r\n }\r\n }\r\n\r\n return node;\r\n }\r\n\r\n public getDirtyNodes(verify?: boolean): GridStackNode[] {\r\n // compare original X,Y,W,H (or entire node?) instead as _dirty can be a temporary state\r\n if (verify) {\r\n let dirtNodes: GridStackNode[] = [];\r\n this.nodes.forEach(n => {\r\n if (n._dirty) {\r\n if (n.y === n._origY && n.x === n._origX && n.w === n._origW && n.h === n._origH) {\r\n delete n._dirty;\r\n } else {\r\n dirtNodes.push(n);\r\n }\r\n }\r\n });\r\n return dirtNodes;\r\n }\r\n\r\n return this.nodes.filter(n => n._dirty);\r\n }\r\n\r\n /** @internal */\r\n private _notify(nodes?: GridStackNode | GridStackNode[], removeDOM = true): GridStackEngine {\r\n if (this.batchMode) { return this }\r\n nodes = (nodes === undefined ? [] : (Array.isArray(nodes) ? nodes : [nodes]) );\r\n let dirtyNodes = nodes.concat(this.getDirtyNodes());\r\n if (this.onchange) {\r\n this.onchange(dirtyNodes, removeDOM);\r\n }\r\n return this;\r\n }\r\n\r\n public cleanNodes(): GridStackEngine {\r\n if (this.batchMode) { return this }\r\n this.nodes.forEach(n => { delete n._dirty; });\r\n return this;\r\n }\r\n\r\n public addNode(node: GridStackNode, triggerAddEvent = false): GridStackNode {\r\n node = this.prepareNode(node);\r\n\r\n if (node.autoPosition) {\r\n this._sortNodes();\r\n\r\n for (let i = 0;; ++i) {\r\n let x = i % this.column;\r\n let y = Math.floor(i / this.column);\r\n if (x + node.w > this.column) {\r\n continue;\r\n }\r\n let box = {x, y, w: node.w, h: node.h};\r\n if (!this.nodes.find(n => Utils.isIntercepted(box, n), {x, y, node})) {\r\n node.x = x;\r\n node.y = y;\r\n delete node.autoPosition; // found our slot\r\n break;\r\n }\r\n }\r\n }\r\n\r\n this.nodes.push(node);\r\n if (triggerAddEvent) {\r\n this.addedNodes.push(node);\r\n }\r\n\r\n this._fixCollisions(node);\r\n this._packNodes();\r\n this._notify();\r\n return node;\r\n }\r\n\r\n public removeNode(node: GridStackNode, removeDOM = true, triggerEvent = false): GridStackEngine {\r\n if (triggerEvent) { // we wait until final drop to manually track removed items (rather than during drag)\r\n this.removedNodes.push(node);\r\n }\r\n node._id = null; // hint that node is being removed\r\n // TODO: .splice(findIndex(),1) would be faster but apparently there are cases we have 2 instances ! (see spec 'load add new, delete others')\r\n // this.nodes = this.nodes.filter(n => n !== node);\r\n this.nodes.splice(this.nodes.findIndex(n => n === node), 1);\r\n if (!this.float) {\r\n this._packNodes();\r\n }\r\n this._notify(node, removeDOM);\r\n return this;\r\n }\r\n\r\n public removeAll(removeDOM = true): GridStackEngine {\r\n delete this._layouts;\r\n if (this.nodes.length === 0) { return this }\r\n if (removeDOM) {\r\n this.nodes.forEach(n => { n._id = null; }); // hint that node is being removed\r\n }\r\n this.removedNodes = this.nodes;\r\n this.nodes = [];\r\n this._notify(this.removedNodes, removeDOM);\r\n return this;\r\n }\r\n\r\n public canMoveNode(node: GridStackNode, x: number, y: number, w?: number, h?: number): boolean {\r\n if (!this.isNodeChangedPosition(node, x, y, w, h)) {\r\n return false;\r\n }\r\n let hasLocked = Boolean(this.nodes.find(n => n.locked));\r\n\r\n if (!this.maxRow && !hasLocked) {\r\n return true;\r\n }\r\n\r\n let clonedNode: GridStackNode;\r\n let clone = new GridStackEngine(\r\n this.column,\r\n null,\r\n this.float,\r\n 0,\r\n this.nodes.map(n => {\r\n if (n === node) {\r\n clonedNode = Utils.clone(n);\r\n return clonedNode;\r\n }\r\n return Utils.clone(n);\r\n }));\r\n\r\n if (!clonedNode) { return true;}\r\n\r\n clone.moveNode(clonedNode, x, y, w, h);\r\n\r\n let canMove = true;\r\n if (hasLocked) {\r\n canMove = canMove && !Boolean(clone.nodes.find(n => {\r\n return n !== clonedNode && Boolean(n.locked) && Boolean(n._dirty);\r\n }));\r\n }\r\n if (this.maxRow) {\r\n canMove = canMove && (clone.getRow() <= this.maxRow);\r\n }\r\n\r\n return canMove;\r\n }\r\n\r\n public canBePlacedWithRespectToHeight(node: GridStackNode): boolean {\r\n if (!this.maxRow) {\r\n return true;\r\n }\r\n\r\n let clone = new GridStackEngine(\r\n this.column,\r\n null,\r\n this.float,\r\n 0,\r\n this.nodes.map(n => Utils.clone(n)));\r\n clone.addNode(node);\r\n return clone.getRow() <= this.maxRow;\r\n }\r\n\r\n public isNodeChangedPosition(node: GridStackNode, x: number, y: number, w: number, h: number): boolean {\r\n if (typeof x !== 'number') { x = node.x; }\r\n if (typeof y !== 'number') { y = node.y; }\r\n if (typeof w !== 'number') { w = node.w; }\r\n if (typeof h !== 'number') { h = node.h; }\r\n\r\n if (node.maxW) { w = Math.min(w, node.maxW); }\r\n if (node.maxH) { h = Math.min(h, node.maxH); }\r\n if (node.minW) { w = Math.max(w, node.minW); }\r\n if (node.minH) { h = Math.max(h, node.minH); }\r\n\r\n if (node.x === x && node.y === y && node.w === w && node.h === h) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public moveNode(node: GridStackNode, x: number, y: number, w?: number, h?: number, noPack?: boolean): GridStackNode {\r\n if (node.locked) { return null; }\r\n if (typeof x !== 'number') { x = node.x; }\r\n if (typeof y !== 'number') { y = node.y; }\r\n if (typeof w !== 'number') { w = node.w; }\r\n if (typeof h !== 'number') { h = node.h; }\r\n\r\n // constrain the passed in values and check if we're still changing our node\r\n let resizing = (node.w !== w || node.h !== h);\r\n let nn: GridStackNode = { x, y, w, h, maxW: node.maxW, maxH: node.maxH, minW: node.minW, minH: node.minH};\r\n nn = this.prepareNode(nn, resizing);\r\n if (node.x === nn.x && node.y === nn.y && node.w === nn.w && node.h === nn.h) {\r\n return null;\r\n }\r\n\r\n node._dirty = true;\r\n\r\n node.x = node._lastTriedX = nn.x;\r\n node.y = node._lastTriedY = nn.y;\r\n node.w = node._lastTriedW = nn.w;\r\n node.h = node._lastTriedH = nn.h;\r\n\r\n this._fixCollisions(node);\r\n if (!noPack) {\r\n this._packNodes();\r\n this._notify();\r\n }\r\n return node;\r\n }\r\n\r\n public getRow(): number {\r\n return this.nodes.reduce((memo, n) => Math.max(memo, n.y + n.h), 0);\r\n }\r\n\r\n public beginUpdate(node: GridStackNode): GridStackEngine {\r\n if (node._updating) return this;\r\n node._updating = true;\r\n this.nodes.forEach(n => { n._packY = n.y; });\r\n return this;\r\n }\r\n\r\n public endUpdate(): GridStackEngine {\r\n let n = this.nodes.find(n => n._updating);\r\n if (n) {\r\n delete n._updating;\r\n this.nodes.forEach(n => { delete n._packY; });\r\n }\r\n return this;\r\n }\r\n\r\n /** saves the current layout returning a list of widgets for serialization */\r\n public save(saveElement = true): GridStackNode[] {\r\n let widgets: GridStackNode[] = [];\r\n Utils.sort(this.nodes);\r\n this.nodes.forEach(n => {\r\n let w: GridStackNode = {};\r\n for (let key in n) { if (key[0] !== '_' && n[key] !== null && n[key] !== undefined ) w[key] = n[key]; }\r\n // delete other internals\r\n if (!saveElement) delete w.el;\r\n delete w.grid;\r\n // delete default values (will be re-created on read)\r\n if (!w.autoPosition) delete w.autoPosition;\r\n if (!w.noResize) delete w.noResize;\r\n if (!w.noMove) delete w.noMove;\r\n if (!w.locked) delete w.locked;\r\n widgets.push(w);\r\n });\r\n return widgets;\r\n }\r\n\r\n /** @internal called whenever a node is added or moved - updates the cached layouts */\r\n public layoutsNodesChange(nodes: GridStackNode[]): GridStackEngine {\r\n if (!this._layouts || this._ignoreLayoutsNodeChange) return this;\r\n // remove smaller layouts - we will re-generate those on the fly... larger ones need to update\r\n this._layouts.forEach((layout, column) => {\r\n if (!layout || column === this.column) return this;\r\n if (column < this.column) {\r\n this._layouts[column] = undefined;\r\n }\r\n else {\r\n // we save the original x,y,w (h isn't cached) to see what actually changed to propagate better.\r\n // Note: we don't need to check against out of bound scaling/moving as that will be done when using those cache values.\r\n nodes.forEach(node => {\r\n let n = layout.find(l => l._id === node._id);\r\n if (!n) return this; // no cache for new nodes. Will use those values.\r\n let ratio = column / this.column;\r\n // Y changed, push down same amount\r\n // TODO: detect doing item 'swaps' will help instead of move (especially in 1 column mode)\r\n if (node.y !== node._origY) {\r\n n.y += (node.y - node._origY);\r\n }\r\n // X changed, scale from new position\r\n if (node.x !== node._origX) {\r\n n.x = Math.round(node.x * ratio);\r\n }\r\n // width changed, scale from new width\r\n if (node.w !== node._origW) {\r\n n.w = Math.round(node.w * ratio);\r\n }\r\n // ...height always carries over from cache\r\n });\r\n }\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal Called to scale the widget width & position up/down based on the column change.\r\n * Note we store previous layouts (especially original ones) to make it possible to go\r\n * from say 12 -> 1 -> 12 and get back to where we were.\r\n *\r\n * @param oldColumn previous number of columns\r\n * @param column new column number\r\n * @param nodes different sorted list (ex: DOM order) instead of current list\r\n * @param layout specify the type of re-layout that will happen (position, size, etc...).\r\n * Note: items will never be outside of the current column boundaries. default (moveScale). Ignored for 1 column\r\n */\r\n public updateNodeWidths(oldColumn: number, column: number, nodes: GridStackNode[], layout: ColumnOptions = 'moveScale'): GridStackEngine {\r\n if (!this.nodes.length || oldColumn === column) { return this }\r\n\r\n // cache the current layout in case they want to go back (like 12 -> 1 -> 12) as it requires original data\r\n this.cacheLayout(this.nodes, oldColumn);\r\n\r\n // if we're going to 1 column and using DOM order rather than default sorting, then generate that layout\r\n if (column === 1 && nodes && nodes.length) {\r\n let top = 0;\r\n nodes.forEach(n => {\r\n n.x = 0;\r\n n.w = 1;\r\n n.y = Math.max(n.y, top);\r\n top = n.y + n.h;\r\n });\r\n } else {\r\n nodes = Utils.sort(this.nodes, -1, oldColumn); // current column reverse sorting so we can insert last to front (limit collision)\r\n }\r\n\r\n // see if we have cached previous layout.\r\n let cacheNodes = this._layouts[column] || [];\r\n // if not AND we are going up in size start with the largest layout as down-scaling is more accurate\r\n let lastIndex = this._layouts.length - 1;\r\n if (cacheNodes.length === 0 && column > oldColumn && column < lastIndex) {\r\n cacheNodes = this._layouts[lastIndex] || [];\r\n if (cacheNodes.length) {\r\n // pretend we came from that larger column by assigning those values as starting point\r\n oldColumn = lastIndex;\r\n cacheNodes.forEach(cacheNode => {\r\n let j = nodes.findIndex(n => n._id === cacheNode._id);\r\n if (j !== -1) {\r\n // still current, use cache info positions\r\n nodes[j].x = cacheNode.x;\r\n nodes[j].y = cacheNode.y;\r\n nodes[j].w = cacheNode.w;\r\n }\r\n });\r\n cacheNodes = []; // we still don't have new column cached data... will generate from larger one.\r\n }\r\n }\r\n\r\n // if we found cache re-use those nodes that are still current\r\n let newNodes: GridStackNode[] = [];\r\n cacheNodes.forEach(cacheNode => {\r\n let j = nodes.findIndex(n => n._id === cacheNode._id);\r\n if (j !== -1) {\r\n // still current, use cache info positions\r\n nodes[j].x = cacheNode.x;\r\n nodes[j].y = cacheNode.y;\r\n nodes[j].w = cacheNode.w;\r\n newNodes.push(nodes[j]);\r\n nodes.splice(j, 1);\r\n }\r\n });\r\n // ...and add any extra non-cached ones\r\n if (nodes.length) {\r\n if (typeof layout === 'function') {\r\n layout(column, oldColumn, newNodes, nodes);\r\n } else {\r\n let ratio = column / oldColumn;\r\n let move = (layout === 'move' || layout === 'moveScale');\r\n let scale = (layout === 'scale' || layout === 'moveScale');\r\n nodes.forEach(node => {\r\n node.x = (column === 1 ? 0 : (move ? Math.round(node.x * ratio) : Math.min(node.x, column - 1)));\r\n node.w = ((column === 1 || oldColumn === 1) ? 1 :\r\n scale ? (Math.round(node.w * ratio) || 1) : (Math.min(node.w, column)));\r\n newNodes.push(node);\r\n });\r\n nodes = [];\r\n }\r\n }\r\n\r\n // finally re-layout them in reverse order (to get correct placement)\r\n newNodes = Utils.sort(newNodes, -1, column);\r\n this._ignoreLayoutsNodeChange = true;\r\n this.batchUpdate();\r\n this.nodes = []; // pretend we have no nodes to start with (we use same structures) to simplify layout\r\n newNodes.forEach(node => {\r\n this.addNode(node, false); // 'false' for add event trigger\r\n node._dirty = true; // force attr update\r\n }, this);\r\n this.commit();\r\n delete this._ignoreLayoutsNodeChange;\r\n return this;\r\n }\r\n\r\n /** @internal called to save initial position/size */\r\n public saveInitial(): GridStackEngine {\r\n this.nodes.forEach(n => {\r\n n._origX = n.x;\r\n n._origY = n.y;\r\n n._origW = n.w;\r\n n._origH = n.h;\r\n delete n._dirty;\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * call to cache the given layout internally to the given location so we can restore back when column changes size\r\n * @param nodes list of nodes\r\n * @param column corresponding column index to save it under\r\n * @param clear if true, will force other caches to be removed (default false)\r\n */\r\n public cacheLayout(nodes: GridStackNode[], column: number, clear = false): GridStackEngine {\r\n let copy: Layout[] = [];\r\n nodes.forEach((n, i) => {\r\n n._id = n._id || GridStackEngine._idSeq++; // make sure we have an id in case this is new layout, else re-use id already set\r\n copy[i] = {x: n.x, y: n.y, w: n.w, _id: n._id} // only thing we change is x,y,w and id to find it back\r\n });\r\n this._layouts = clear ? [] : this._layouts || []; // use array to find larger quick\r\n this._layouts[column] = copy;\r\n return this;\r\n }\r\n\r\n\r\n /** called to remove all internal values */\r\n public cleanupNode(node: GridStackNode): GridStackEngine {\r\n for (let prop in node) {\r\n if (prop[0] === '_') delete node[prop];\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal legacy method renames */\r\n private getGridHeight = obsolete(this, GridStackEngine.prototype.getRow, 'getGridHeight', 'getRow', 'v1.0.0');\r\n}\r\n\r\n/** @internal class to store per column layout bare minimal info (subset of GridStackWidget) */\r\ninterface Layout {\r\n x: number;\r\n y: number;\r\n w: number;\r\n _id: number; // so we can find full node back\r\n}\r\n","// gridstack.ts 3.0.0 @preserve\r\n\r\n/**\r\n * https://gridstackjs.com/\r\n * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov\r\n * gridstack.js may be freely distributed under the MIT license.\r\n*/\r\n\r\nimport { GridStackEngine } from './gridstack-engine';\r\nimport { obsoleteOpts, obsoleteAttr, Utils, HeightData } from './utils';\r\nimport { GridStackElement, GridItemHTMLElement, GridStackWidget, GridStackNode, GridStackOptions, numberOrString, ColumnOptions } from './types';\r\nimport { GridStackDDI } from './gridstack-ddi';\r\n\r\n// export all dependent file as well to make it easier for users to just import the main file\r\nexport * from './types';\r\nexport * from './utils';\r\nexport * from './gridstack-engine';\r\nexport * from './gridstack-ddi';\r\n\r\nexport interface GridHTMLElement extends HTMLElement {\r\n gridstack?: GridStack; // grid's parent DOM element points back to grid class\r\n}\r\nexport type GridStackEvent = 'added' | 'change' | 'disable' | 'dragstart' | 'dragstop' | 'dropped' |\r\n 'enable' | 'removed' | 'resizestart' | 'resizestop';\r\n\r\n/** Defines the coordinates of an object */\r\nexport interface MousePosition {\r\n top: number;\r\n left: number;\r\n}\r\n\r\n/** Defines the position of a cell inside the grid*/\r\nexport interface CellPosition {\r\n x: number;\r\n y: number;\r\n}\r\n\r\ninterface GridCSSStyleSheet extends CSSStyleSheet {\r\n _id?: string; // random id we will use to style us\r\n _max?: number; // internal tracker of the max # of rows we created\\\r\n}\r\n\r\n/**\r\n * Main gridstack class - you will need to call `GridStack.init()` first to initialize your grid.\r\n * Note: your grid elements MUST have the following classes for the CSS layout to work:\r\n * @example\r\n *
\r\n *
\r\n *
Item 1
\r\n *
\r\n *
\r\n */\r\nexport class GridStack {\r\n\r\n /**\r\n * initializing the HTML element, or selector string, into a grid will return the grid. Calling it again will\r\n * simply return the existing instance (ignore any passed options). There is also an initAll() version that support\r\n * multiple grids initialization at once.\r\n * @param options grid options (optional)\r\n * @param elOrString element or CSS selector (first one used) to convert to a grid (default to '.grid-stack' class selector)\r\n *\r\n * @example\r\n * let grid = GridStack.init();\r\n *\r\n * Note: the HTMLElement (of type GridHTMLElement) will store a `gridstack: GridStack` value that can be retrieve later\r\n * let grid = document.querySelector('.grid-stack').gridstack;\r\n */\r\n public static init(options: GridStackOptions = {}, elOrString: GridStackElement = '.grid-stack'): GridStack {\r\n let el = GridStack.getGridElement(elOrString);\r\n if (!el) {\r\n if (typeof elOrString === 'string') {\r\n console.error('GridStack.initAll() no grid was found with selector \"' + elOrString + '\" - element missing or wrong selector ?' +\r\n '\\nNote: \".grid-stack\" is required for proper CSS styling and drag/drop, and is the default selector.');\r\n } else {\r\n console.error('GridStack.init() no grid element was passed.');\r\n }\r\n return null;\r\n }\r\n if (!el.gridstack) {\r\n el.gridstack = new GridStack(el, Utils.clone(options));\r\n }\r\n return el.gridstack\r\n }\r\n\r\n /**\r\n * Will initialize a list of elements (given a selector) and return an array of grids.\r\n * @param options grid options (optional)\r\n * @param selector elements selector to convert to grids (default to '.grid-stack' class selector)\r\n *\r\n * @example\r\n * let grids = GridStack.initAll();\r\n * grids.forEach(...)\r\n */\r\n public static initAll(options: GridStackOptions = {}, selector = '.grid-stack'): GridStack[] {\r\n let grids: GridStack[] = [];\r\n GridStack.getGridElements(selector).forEach(el => {\r\n if (!el.gridstack) {\r\n el.gridstack = new GridStack(el, Utils.clone(options));\r\n }\r\n grids.push(el.gridstack);\r\n });\r\n if (grids.length === 0) {\r\n console.error('GridStack.initAll() no grid was found with selector \"' + selector + '\" - element missing or wrong selector ?' +\r\n '\\nNote: \".grid-stack\" is required for proper CSS styling and drag/drop, and is the default selector.');\r\n }\r\n return grids;\r\n }\r\n\r\n /** scoping so users can call GridStack.Utils.sort() for example */\r\n public static Utils = Utils;\r\n\r\n /** scoping so users can call new GridStack.Engine(12) for example */\r\n public static Engine = GridStackEngine;\r\n\r\n /** the HTML element tied to this grid after it's been initialized */\r\n public el: GridHTMLElement;\r\n\r\n /** engine used to implement non DOM grid functionality */\r\n public engine: GridStackEngine;\r\n\r\n /** grid options - public for classes to access, but use methods to modify! */\r\n public opts: GridStackOptions;\r\n\r\n /** @internal */\r\n public placeholder: HTMLElement;\r\n /** @internal */\r\n private _oneColumnMode: boolean;\r\n /** @internal */\r\n private _prevColumn: number;\r\n /** @internal */\r\n private _ignoreLayoutsNodeChange: boolean;\r\n /** @internal */\r\n public _gsEventHandler = {};\r\n /** @internal */\r\n private _styles: GridCSSStyleSheet;\r\n /** @internal flag to keep cells square during resize */\r\n private _isAutoCellHeight: boolean;\r\n /** @internal track event binding to window resize so we can remove */\r\n private _windowResizeBind: () => GridStack;\r\n\r\n /**\r\n * Construct a grid item from the given element and options\r\n * @param el\r\n * @param opts\r\n */\r\n public constructor(el: GridHTMLElement, opts: GridStackOptions = {}) {\r\n this.el = el; // exposed HTML element to the user\r\n opts = opts || {}; // handles null/undefined/0\r\n\r\n obsoleteOpts(opts, 'verticalMargin', 'margin', 'v2.0');\r\n\r\n obsoleteAttr(this.el, 'data-gs-current-height', 'gs-current-row', 'v1.0.0');\r\n\r\n // if row property exists, replace minRow and maxRow instead\r\n if (opts.row) {\r\n opts.minRow = opts.maxRow = opts.row;\r\n delete opts.row;\r\n }\r\n let rowAttr = Utils.toNumber(el.getAttribute('gs-row'));\r\n\r\n // elements attributes override any passed options (like CSS style) - merge the two together\r\n let defaults: GridStackOptions = {\r\n column: Utils.toNumber(el.getAttribute('gs-column')) || 12,\r\n minRow: rowAttr ? rowAttr : Utils.toNumber(el.getAttribute('gs-min-row')) || 0,\r\n maxRow: rowAttr ? rowAttr : Utils.toNumber(el.getAttribute('gs-max-row')) || 0,\r\n itemClass: 'grid-stack-item',\r\n placeholderClass: 'grid-stack-placeholder',\r\n placeholderText: '',\r\n handle: '.grid-stack-item-content',\r\n handleClass: null,\r\n styleInHead: false,\r\n cellHeight: 'auto',\r\n margin: 10,\r\n auto: true,\r\n minWidth: 768,\r\n float: false,\r\n staticGrid: Utils.toBool(el.getAttribute('gs-static')) || false,\r\n _class: 'grid-stack-instance-' + (Math.random() * 10000).toFixed(0),\r\n animate: true,\r\n alwaysShowResizeHandle: opts.alwaysShowResizeHandle || false,\r\n resizable: {\r\n autoHide: !(opts.alwaysShowResizeHandle || false),\r\n handles: 'se'\r\n },\r\n draggable: {\r\n handle: (opts.handleClass ? '.' + opts.handleClass : (opts.handle ? opts.handle : '')) || '.grid-stack-item-content',\r\n scroll: false,\r\n appendTo: 'body'\r\n },\r\n dragIn: undefined,\r\n dragInOptions : {\r\n revert: 'invalid',\r\n handle: '.grid-stack-item-content',\r\n scroll: false,\r\n appendTo: 'body'\r\n },\r\n disableDrag: false,\r\n disableResize: false,\r\n rtl: 'auto',\r\n removable: false,\r\n removableOptions: {\r\n accept: '.' + (opts.itemClass || 'grid-stack-item')\r\n },\r\n removeTimeout: 2000,\r\n marginUnit: 'px',\r\n cellHeightUnit: 'px',\r\n disableOneColumnMode: false,\r\n oneColumnModeDomSort: false\r\n };\r\n if (el.getAttribute('gs-animate')) {\r\n defaults.animate = Utils.toBool(el.getAttribute('gs-animate'))\r\n }\r\n\r\n this.opts = Utils.defaults(opts, defaults);\r\n opts = null; // make sure we use this.opts instead\r\n this.initMargin();\r\n\r\n if (this.opts.rtl === 'auto') {\r\n this.opts.rtl = el.style.direction === 'rtl';\r\n }\r\n\r\n if (this.opts.rtl) {\r\n this.el.classList.add('grid-stack-rtl');\r\n }\r\n\r\n this.opts._isNested = Utils.closestByClass(this.el, this.opts.itemClass) !== null;\r\n if (this.opts._isNested) {\r\n this.el.classList.add('grid-stack-nested');\r\n }\r\n\r\n this._isAutoCellHeight = (this.opts.cellHeight === 'auto');\r\n if (this._isAutoCellHeight) {\r\n // make the cell content square initially (will use resize event to keep it square)\r\n let marginDiff = - (this.opts.marginRight as number) - (this.opts.marginLeft as number)\r\n + (this.opts.marginTop as number) + (this.opts.marginBottom as number);\r\n this.cellHeight(this.cellWidth() + marginDiff, false);\r\n } else {\r\n this.cellHeight(this.opts.cellHeight, false);\r\n }\r\n\r\n this.el.classList.add(this.opts._class);\r\n\r\n this._setStaticClass();\r\n this._updateStyles();\r\n\r\n this.engine = new GridStackEngine(this.opts.column, (cbNodes, removeDOM = true) => {\r\n let maxH = 0;\r\n this.engine.nodes.forEach(n => { maxH = Math.max(maxH, n.y + n.h) });\r\n cbNodes.forEach(n => {\r\n let el = n.el;\r\n if (removeDOM && n._id === null) {\r\n if (el && el.parentNode) { el.parentNode.removeChild(el) }\r\n } else {\r\n this._writeAttrs(el, n.x, n.y, n.w, n.h);\r\n }\r\n });\r\n this._updateStyles(false, maxH); // false = don't recreate, just append if need be\r\n }, this.opts.float, this.opts.maxRow);\r\n\r\n if (this.opts.auto) {\r\n let elements: {el: HTMLElement; i: number}[] = [];\r\n this.getGridItems().forEach(el => {\r\n let x = parseInt(el.getAttribute('gs-x'));\r\n let y = parseInt(el.getAttribute('gs-y'));\r\n elements.push({\r\n el,\r\n // if x,y are missing (autoPosition) add them to end of list - but keep their respective DOM order\r\n i: (Number.isNaN(x) ? 1000 : x) + (Number.isNaN(y) ? 1000 : y) * this.opts.column\r\n });\r\n });\r\n elements.sort(e => e.i).forEach(item => { this._prepareElement(item.el) });\r\n }\r\n this.engine.saveInitial(); // initial start of items\r\n\r\n this.setAnimation(this.opts.animate);\r\n\r\n let placeholderChild = document.createElement('div');\r\n placeholderChild.className = 'placeholder-content';\r\n placeholderChild.innerHTML = this.opts.placeholderText;\r\n this.placeholder = document.createElement('div');\r\n this.placeholder.classList.add(this.opts.placeholderClass, defaults.itemClass, this.opts.itemClass);\r\n this.placeholder.appendChild(placeholderChild);\r\n\r\n this._updateContainerHeight();\r\n\r\n this._setupDragIn();\r\n this._setupRemoveDrop();\r\n this._setupAcceptWidget();\r\n this._updateWindowResizeEvent(); // finally this may size us down to 1 column\r\n }\r\n\r\n /**\r\n * add a new widget and returns it.\r\n *\r\n * Widget will be always placed even if result height is more than actual grid height.\r\n * You need to use willItFit method before calling addWidget for additional check.\r\n * See also `makeWidget()`.\r\n *\r\n * @example\r\n * let grid = GridStack.init();\r\n * grid.addWidget({w: 3, content: 'hello'});\r\n * grid.addWidget('
hello
', {w: 3});\r\n *\r\n * @param el GridStackWidget (which can have content string as well), html element, or string definition to add\r\n * @param options widget position/size options (optional, and ignore if first param is already option) - see GridStackWidget\r\n */\r\n public addWidget(els?: GridStackWidget | GridStackElement, options?: GridStackWidget): GridItemHTMLElement {\r\n\r\n // support legacy call for now ?\r\n if (arguments.length > 2) {\r\n console.warn('gridstack.ts: `addWidget(el, x, y, width...)` is deprecated. Use `addWidget({x, y, w, content, ...})`. It will be removed soon');\r\n // eslint-disable-next-line prefer-rest-params\r\n let a = arguments, i = 1,\r\n opt: GridStackWidget = { x:a[i++], y:a[i++], w:a[i++], h:a[i++], autoPosition:a[i++],\r\n minW:a[i++], maxW:a[i++], minH:a[i++], maxH:a[i++], id:a[i++] };\r\n return this.addWidget(els, opt);\r\n }\r\n\r\n function isGridStackWidget(w: GridStackWidget): w is GridStackWidget { // https://medium.com/ovrsea/checking-the-type-of-an-object-in-typescript-the-type-guards-24d98d9119b0\r\n return w.x !== undefined || w.y !== undefined || w.w !== undefined || w.h !== undefined || w.content !== undefined ? true : false;\r\n }\r\n\r\n let el: HTMLElement;\r\n if (typeof els === 'string') {\r\n let doc = document.implementation.createHTMLDocument();\r\n doc.body.innerHTML = els;\r\n el = doc.body.children[0] as HTMLElement;\r\n } else if (arguments.length === 0 || arguments.length === 1 && isGridStackWidget(els)) {\r\n let content = els ? (els as GridStackWidget).content || '' : '';\r\n options = els;\r\n let doc = document.implementation.createHTMLDocument();\r\n doc.body.innerHTML = `
${content}
`;\r\n el = doc.body.children[0] as HTMLElement;\r\n } else {\r\n el = els as HTMLElement;\r\n }\r\n\r\n // Tempting to initialize the passed in opt with default and valid values, but this break knockout demos\r\n // as the actual value are filled in when _prepareElement() calls el.getAttribute('gs-xyz) before adding the node.\r\n // So make sure we load any DOM attributes that are not specified in passed in options (which override)\r\n let domAttr = this._readAttr(el);\r\n options = {...(options || {})}; // make a copy before we modify in case caller re-uses it\r\n Utils.defaults(options, domAttr);\r\n this.engine.prepareNode(options);\r\n this._writeAttr(el, options);\r\n\r\n this.el.appendChild(el);\r\n\r\n // similar to makeWidget() that doesn't read attr again and worse re-create a new node and loose any _id\r\n this._prepareElement(el, true, options);\r\n this._updateContainerHeight();\r\n this._triggerAddEvent();\r\n this._triggerChangeEvent();\r\n\r\n return el;\r\n }\r\n\r\n /** saves the current layout returning a list of widgets for serialization */\r\n public save(saveContent = true): GridStackWidget[] {\r\n let list = this.engine.save(saveContent);\r\n // check for HTML content as well\r\n if (saveContent) {\r\n list.forEach(n => {\r\n if (n.el) {\r\n let sub = n.el.querySelector('.grid-stack-item-content');\r\n n.content = sub ? sub.innerHTML : undefined;\r\n if (!n.content) delete n.content;\r\n delete n.el;\r\n }\r\n });\r\n }\r\n return list;\r\n }\r\n\r\n /**\r\n * load the widgets from a list. This will call update() on each (matching by id) or add/remove widgets that are not there.\r\n *\r\n * @param layout list of widgets definition to update/create\r\n * @param addAndRemove boolean (default true) or callback method can be passed to control if and how missing widgets can be added/removed, giving\r\n * the user control of insertion.\r\n *\r\n * @example\r\n * see http://gridstackjs.com/demo/serialization.html\r\n **/\r\n public load(layout: GridStackWidget[], addAndRemove: boolean | ((w: GridStackWidget, add: boolean) => void) = true): GridStack {\r\n let items = GridStack.Utils.sort(layout, -1, this._prevColumn || this.opts.column);\r\n\r\n // if we're loading a layout into 1 column (_prevColumn is set only when going to 1) and items don't fit, make sure to save\r\n // the original wanted layout so we can scale back up correctly #1471\r\n if (this._prevColumn && this._prevColumn !== this.opts.column && items.some(n => (n.x + n.w) > this.opts.column)) {\r\n this._ignoreLayoutsNodeChange = true; // skip layout update\r\n this.engine.cacheLayout(items, this._prevColumn, true);\r\n }\r\n\r\n let removed: GridStackNode[] = [];\r\n this.batchUpdate();\r\n // see if any items are missing from new layout and need to be removed first\r\n if (addAndRemove) {\r\n let copyNodes = [...this.engine.nodes]; // don't loop through array you modify\r\n copyNodes.forEach(n => {\r\n let item = items.find(w => n.id === w.id);\r\n if (!item) {\r\n if (typeof(addAndRemove) === 'function') {\r\n addAndRemove(n, false);\r\n } else {\r\n removed.push(n); // batch keep track\r\n this.removeWidget(n.el, true, false);\r\n }\r\n }\r\n });\r\n }\r\n // now add/update the widgets\r\n items.forEach(w => {\r\n let item = (w.id || w.id === 0) ? this.engine.nodes.find(n => n.id === w.id) : undefined;\r\n if (item) {\r\n this.update(item.el, w);\r\n } else if (addAndRemove) {\r\n if (typeof(addAndRemove) === 'function') {\r\n addAndRemove(w, true);\r\n } else {\r\n this.addWidget(w);\r\n }\r\n }\r\n });\r\n this.engine.removedNodes = removed;\r\n this.commit();\r\n\r\n // after commit, clear that flag\r\n delete this._ignoreLayoutsNodeChange;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Initializes batch updates. You will see no changes until `commit()` method is called.\r\n */\r\n public batchUpdate(): GridStack {\r\n this.engine.batchUpdate();\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets current cell height.\r\n */\r\n public getCellHeight(forcePixel = false): number {\r\n if (this.opts.cellHeight && this.opts.cellHeight !== 'auto' &&\r\n (!forcePixel || !this.opts.cellHeightUnit || this.opts.cellHeightUnit === 'px')) {\r\n return this.opts.cellHeight as number;\r\n }\r\n // else get first cell height\r\n // or do entire grid and # of rows ? (this.el.getBoundingClientRect().height) / parseInt(this.el.getAttribute('gs-current-row'))\r\n let el = this.el.querySelector('.' + this.opts.itemClass) as HTMLElement;\r\n let height = Utils.toNumber(el.getAttribute('gs-h'));\r\n return Math.round(el.offsetHeight / height);\r\n }\r\n\r\n /**\r\n * Update current cell height - see `GridStackOptions.cellHeight` for format.\r\n * This method rebuilds an internal CSS style sheet.\r\n * Note: You can expect performance issues if call this method too often.\r\n *\r\n * @param val the cell height\r\n * @param update (Optional) if false, styles will not be updated\r\n *\r\n * @example\r\n * grid.cellHeight(grid.cellWidth() * 1.2);\r\n */\r\n public cellHeight(val: numberOrString, update = true): GridStack {\r\n let data = Utils.parseHeight(val);\r\n if (this.opts.cellHeightUnit === data.unit && this.opts.cellHeight === data.h) {\r\n return this;\r\n }\r\n this.opts.cellHeightUnit = data.unit;\r\n this.opts.cellHeight = data.h;\r\n\r\n if (update) {\r\n this._updateStyles(true); // true = force re-create\r\n }\r\n this._resizeNestedGrids(this.el);\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets current cell width.\r\n */\r\n public cellWidth(): number {\r\n return this.el.offsetWidth / this.opts.column;\r\n }\r\n\r\n /**\r\n * Finishes batch updates. Updates DOM nodes. You must call it after batchUpdate.\r\n */\r\n public commit(): GridStack {\r\n this.engine.commit();\r\n this._triggerRemoveEvent();\r\n this._triggerAddEvent();\r\n this._triggerChangeEvent();\r\n return this;\r\n }\r\n\r\n /** re-layout grid items to reclaim any empty space */\r\n public compact(): GridStack {\r\n this.engine.compact();\r\n this._triggerChangeEvent();\r\n return this;\r\n }\r\n\r\n /**\r\n * set the number of columns in the grid. Will update existing widgets to conform to new number of columns,\r\n * as well as cache the original layout so you can revert back to previous positions without loss.\r\n * Requires `gridstack-extra.css` or `gridstack-extra.min.css` for [2-11],\r\n * else you will need to generate correct CSS (see https://github.com/gridstack/gridstack.js#change-grid-columns)\r\n * @param column - Integer > 0 (default 12).\r\n * @param layout specify the type of re-layout that will happen (position, size, etc...).\r\n * Note: items will never be outside of the current column boundaries. default (moveScale). Ignored for 1 column\r\n */\r\n public column(column: number, layout: ColumnOptions = 'moveScale'): GridStack {\r\n if (this.opts.column === column) { return this; }\r\n let oldColumn = this.opts.column;\r\n\r\n // if we go into 1 column mode (which happens if we're sized less than minW unless disableOneColumnMode is on)\r\n // then remember the original columns so we can restore.\r\n if (column === 1) {\r\n this._prevColumn = oldColumn;\r\n } else {\r\n delete this._prevColumn;\r\n }\r\n\r\n this.el.classList.remove('grid-stack-' + oldColumn);\r\n this.el.classList.add('grid-stack-' + column);\r\n this.opts.column = this.engine.column = column;\r\n\r\n // update the items now - see if the dom order nodes should be passed instead (else default to current list)\r\n let domNodes: GridStackNode[];\r\n if (column === 1 && this.opts.oneColumnModeDomSort) {\r\n domNodes = [];\r\n this.getGridItems().forEach(el => {\r\n if (el.gridstackNode) { domNodes.push(el.gridstackNode); }\r\n });\r\n if (!domNodes.length) { domNodes = undefined; }\r\n }\r\n this.engine.updateNodeWidths(oldColumn, column, domNodes, layout);\r\n\r\n // and trigger our event last...\r\n this._ignoreLayoutsNodeChange = true; // skip layout update\r\n this._triggerChangeEvent();\r\n delete this._ignoreLayoutsNodeChange;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * get the number of columns in the grid (default 12)\r\n */\r\n public getColumn(): number {\r\n return this.opts.column;\r\n }\r\n\r\n /** returns an array of grid HTML elements (no placeholder) - used to iterate through our children */\r\n public getGridItems(): GridItemHTMLElement[] {\r\n return Array.from(this.el.children)\r\n .filter((el: HTMLElement) => el.matches('.' + this.opts.itemClass) && !el.matches('.' + this.opts.placeholderClass)) as GridItemHTMLElement[];\r\n }\r\n\r\n /**\r\n * Destroys a grid instance.\r\n * @param removeDOM if `false` grid and items elements will not be removed from the DOM (Optional. Default `true`).\r\n */\r\n public destroy(removeDOM = true): GridStack {\r\n this._updateWindowResizeEvent(true);\r\n this.setStatic(true); // permanently removes DD\r\n if (!removeDOM) {\r\n this.removeAll(removeDOM);\r\n this.el.classList.remove(this.opts._class);\r\n delete this.el.gridstack;\r\n } else {\r\n this.el.parentNode.removeChild(this.el);\r\n }\r\n this._removeStylesheet();\r\n delete this.placeholder;\r\n delete this.engine;\r\n return this;\r\n }\r\n\r\n /**\r\n * Disables widgets moving/resizing. This is a shortcut for:\r\n * @example\r\n * grid.enableMove(false);\r\n * grid.enableResize(false);\r\n */\r\n public disable(): GridStack {\r\n this.enableMove(false);\r\n this.enableResize(false);\r\n this._triggerEvent('disable');\r\n return this;\r\n }\r\n\r\n /**\r\n * Enables widgets moving/resizing. This is a shortcut for:\r\n * @example\r\n * grid.enableMove(true);\r\n * grid.enableResize(true);\r\n */\r\n public enable(): GridStack {\r\n this.enableMove(true);\r\n this.enableResize(true);\r\n this._triggerEvent('enable');\r\n return this;\r\n }\r\n\r\n /**\r\n * Enables/disables widget moving.\r\n *\r\n * @param doEnable\r\n * @param includeNewWidgets will force new widgets to be draggable as per\r\n * doEnable`s value by changing the disableDrag grid option (default: true).\r\n */\r\n public enableMove(doEnable: boolean, includeNewWidgets = true): GridStack {\r\n if (doEnable && this.opts.staticGrid) { return this; } // can't move a static grid!\r\n this.getGridItems().forEach(el => this.movable(el, doEnable));\r\n if (includeNewWidgets) {\r\n this.opts.disableDrag = !doEnable;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Enables/disables widget resizing\r\n * @param doEnable\r\n * @param includeNewWidgets will force new widgets to be draggable as per\r\n * doEnable`s value by changing the disableResize grid option (default: true).\r\n */\r\n public enableResize(doEnable: boolean, includeNewWidgets = true): GridStack {\r\n if (doEnable && this.opts.staticGrid) { return this; } // can't size a static grid!\r\n this.getGridItems().forEach(el => this.resizable(el, doEnable));\r\n if (includeNewWidgets) {\r\n this.opts.disableResize = !doEnable;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * enable/disable floating widgets (default: `false`) See [example](http://gridstackjs.com/demo/float.html)\r\n */\r\n public float(val: boolean): GridStack {\r\n /*\r\n if (val === undefined) {\r\n // TODO: should we support and/or change signature ? figure this soon...\r\n console.warn('gridstack.ts: getter `float()` is deprecated in 2.x and has been replaced by `getFloat()`. It will be **completely** removed soon');\r\n return this.getFloat();\r\n }\r\n */\r\n this.engine.float = val;\r\n this._triggerChangeEvent();\r\n return this;\r\n }\r\n\r\n /**\r\n * get the current float mode\r\n */\r\n public getFloat(): boolean {\r\n return this.engine.float;\r\n }\r\n\r\n /**\r\n * Get the position of the cell under a pixel on screen.\r\n * @param position the position of the pixel to resolve in\r\n * absolute coordinates, as an object with top and left properties\r\n * @param useDocRelative if true, value will be based on document position vs parent position (Optional. Default false).\r\n * Useful when grid is within `position: relative` element\r\n *\r\n * Returns an object with properties `x` and `y` i.e. the column and row in the grid.\r\n */\r\n public getCellFromPixel(position: MousePosition, useDocRelative = false): CellPosition {\r\n let box = this.el.getBoundingClientRect();\r\n // console.log(`getBoundingClientRect left: ${box.left} top: ${box.top} w: ${box.w} h: ${box.h}`)\r\n let containerPos;\r\n if (useDocRelative) {\r\n containerPos = {top: box.top + document.documentElement.scrollTop, left: box.left};\r\n // console.log(`getCellFromPixel scrollTop: ${document.documentElement.scrollTop}`)\r\n } else {\r\n containerPos = {top: this.el.offsetTop, left: this.el.offsetLeft}\r\n // console.log(`getCellFromPixel offsetTop: ${containerPos.left} offsetLeft: ${containerPos.top}`)\r\n }\r\n let relativeLeft = position.left - containerPos.left;\r\n let relativeTop = position.top - containerPos.top;\r\n\r\n let columnWidth = (box.width / this.opts.column);\r\n let rowHeight = (box.height / parseInt(this.el.getAttribute('gs-current-row')));\r\n\r\n return {x: Math.floor(relativeLeft / columnWidth), y: Math.floor(relativeTop / rowHeight)};\r\n }\r\n\r\n /** returns the current number of rows, which will be at least `minRow` if set */\r\n public getRow(): number {\r\n return Math.max(this.engine.getRow(), this.opts.minRow);\r\n }\r\n\r\n /**\r\n * Checks if specified area is empty.\r\n * @param x the position x.\r\n * @param y the position y.\r\n * @param w the width of to check\r\n * @param h the height of to check\r\n */\r\n public isAreaEmpty(x: number, y: number, w: number, h: number): boolean {\r\n return this.engine.isAreaEmpty(x, y, w, h);\r\n }\r\n\r\n /**\r\n * If you add elements to your grid by hand, you have to tell gridstack afterwards to make them widgets.\r\n * If you want gridstack to add the elements for you, use `addWidget()` instead.\r\n * Makes the given element a widget and returns it.\r\n * @param els widget or single selector to convert.\r\n *\r\n * @example\r\n * let grid = GridStack.init();\r\n * grid.el.appendChild('
');\r\n * grid.makeWidget('#gsi-1');\r\n */\r\n public makeWidget(els: GridStackElement): GridItemHTMLElement {\r\n let el = GridStack.getElement(els);\r\n this._prepareElement(el, true);\r\n this._updateContainerHeight();\r\n this._triggerAddEvent();\r\n this._triggerChangeEvent();\r\n return el;\r\n }\r\n\r\n /**\r\n * Event handler that extracts our CustomEvent data out automatically for receiving custom\r\n * notifications (see doc for supported events)\r\n * @param name of the event (see possible values) or list of names space separated\r\n * @param callback function called with event and optional second/third param\r\n * (see README documentation for each signature).\r\n *\r\n * @example\r\n * grid.on('added', function(e, items) { log('added ', items)} );\r\n * or\r\n * grid.on('added removed change', function(e, items) { log(e.type, items)} );\r\n *\r\n * Note: in some cases it is the same as calling native handler and parsing the event.\r\n * grid.el.addEventListener('added', function(event) { log('added ', event.detail)} );\r\n *\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n public on(name: GridStackEvent, callback: (event: Event, arg2?: GridItemHTMLElement | GridStackNode[]) => void): GridStack {\r\n // check for array of names being passed instead\r\n if (name.indexOf(' ') !== -1) {\r\n let names = name.split(' ') as GridStackEvent[];\r\n names.forEach(name => this.on(name, callback));\r\n return this;\r\n }\r\n\r\n if (name === 'change' || name === 'added' || name === 'removed' || name === 'enable' || name === 'disable') {\r\n // native CustomEvent handlers - cash the generic handlers so we can easily remove\r\n let noData = (name === 'enable' || name === 'disable');\r\n if (noData) {\r\n this._gsEventHandler[name] = (event: Event) => callback(event);\r\n } else {\r\n this._gsEventHandler[name] = (event: CustomEvent) => callback(event, event.detail);\r\n }\r\n this.el.addEventListener(name, this._gsEventHandler[name]);\r\n } else if (name === 'dragstart' || name === 'dragstop' || name === 'resizestart' || name === 'resizestop' || name === 'dropped') {\r\n // drag&drop stop events NEED to be call them AFTER we update node attributes so handle them ourself.\r\n // do same for start event to make it easier...\r\n this._gsEventHandler[name] = callback;\r\n } else {\r\n console.log('GridStack.on(' + name + ') event not supported, but you can still use $(\".grid-stack\").on(...) while jquery-ui is still used internally.');\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * unsubscribe from the 'on' event below\r\n * @param name of the event (see possible values)\r\n */\r\n public off(name: GridStackEvent): GridStack {\r\n // check for array of names being passed instead\r\n if (name.indexOf(' ') !== -1) {\r\n let names = name.split(' ') as GridStackEvent[];\r\n names.forEach(name => this.off(name));\r\n return this;\r\n }\r\n\r\n if (name === 'change' || name === 'added' || name === 'removed' || name === 'enable' || name === 'disable') {\r\n // remove native CustomEvent handlers\r\n if (this._gsEventHandler[name]) {\r\n this.el.removeEventListener(name, this._gsEventHandler[name]);\r\n }\r\n }\r\n delete this._gsEventHandler[name];\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes widget from the grid.\r\n * @param el widget or selector to modify\r\n * @param removeDOM if `false` DOM element won't be removed from the tree (Default? true).\r\n * @param triggerEvent if `false` (quiet mode) element will not be added to removed list and no 'removed' callbacks will be called (Default? true).\r\n */\r\n public removeWidget(els: GridStackElement, removeDOM = true, triggerEvent = true): GridStack {\r\n GridStack.getElements(els).forEach(el => {\r\n if (el.parentElement !== this.el) return; // not our child!\r\n let node = el.gridstackNode;\r\n // For Meteor support: https://github.com/gridstack/gridstack.js/pull/272\r\n if (!node) {\r\n node = this.engine.nodes.find(n => el === n.el);\r\n }\r\n if (!node) return;\r\n\r\n // remove our DOM data (circular link) and drag&drop permanently\r\n delete el.gridstackNode;\r\n GridStackDDI.get().remove(el);\r\n\r\n this.engine.removeNode(node, removeDOM, triggerEvent);\r\n\r\n if (removeDOM && el.parentElement) {\r\n el.remove(); // in batch mode engine.removeNode doesn't call back to remove DOM\r\n }\r\n });\r\n if (triggerEvent) {\r\n this._triggerRemoveEvent();\r\n this._triggerChangeEvent();\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes all widgets from the grid.\r\n * @param removeDOM if `false` DOM elements won't be removed from the tree (Default? `true`).\r\n */\r\n public removeAll(removeDOM = true): GridStack {\r\n // always remove our DOM data (circular link) before list gets emptied and drag&drop permanently\r\n this.engine.nodes.forEach(n => {\r\n delete n.el.gridstackNode;\r\n GridStackDDI.get().remove(n.el);\r\n });\r\n this.engine.removeAll(removeDOM);\r\n this._triggerRemoveEvent();\r\n return this;\r\n }\r\n\r\n /**\r\n * Toggle the grid animation state. Toggles the `grid-stack-animate` class.\r\n * @param doAnimate if true the grid will animate.\r\n */\r\n public setAnimation(doAnimate: boolean): GridStack {\r\n if (doAnimate) {\r\n this.el.classList.add('grid-stack-animate');\r\n } else {\r\n this.el.classList.remove('grid-stack-animate');\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Toggle the grid static state, which permanently removes/add Drag&Drop support, unlike disable()/enable() that just turns it off/on.\r\n * Also toggle the grid-stack-static class.\r\n * @param val if true the grid become static.\r\n */\r\n public setStatic(val: boolean): GridStack {\r\n if (this.opts.staticGrid === val) { return this; }\r\n this.opts.staticGrid = val;\r\n this.engine.nodes.forEach(n => this._prepareDragDropByNode(n)); // either delete Drag&drop or initialize it\r\n this._setStaticClass();\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates widget position/size and other info. Note: if you need to call this on all nodes, use load() instead which will update what changed.\r\n * @param els widget or selector of objects to modify (note: setting the same x,y for multiple items will be indeterministic and likely unwanted)\r\n * @param opt new widget options (x,y,w,h, etc..). Only those set will be updated.\r\n */\r\n public update(els: GridStackElement, opt: GridStackWidget): GridStack {\r\n\r\n // support legacy call for now ?\r\n if (arguments.length > 2) {\r\n console.warn('gridstack.ts: `update(el, x, y, w, h)` is deprecated. Use `update({x, w, content, ...})`. It will be removed soon');\r\n // eslint-disable-next-line prefer-rest-params\r\n let a = arguments, i = 1;\r\n opt = { x:a[i++], y:a[i++], w:a[i++], h:a[i++] };\r\n return this.update(els, opt);\r\n }\r\n\r\n GridStack.getElements(els).forEach(el => {\r\n if (!el || !el.gridstackNode) { return; }\r\n let n = el.gridstackNode;\r\n let w = {...opt}; // make a copy we can modify in case they re-use it or multiple items\r\n delete w.autoPosition;\r\n\r\n // move/resize widget if anything changed\r\n let keys = ['x', 'y', 'w', 'h'];\r\n let m: GridStackWidget;\r\n if (keys.some(k => w[k] !== undefined && w[k] !== n[k])) {\r\n m = {};\r\n keys.forEach(k => {\r\n m[k] = (w[k] !== undefined) ? w[k] : n[k];\r\n delete w[k];\r\n });\r\n }\r\n // for a move as well IFF there is any min/max fields set\r\n if (!m && (w.minW || w.minH || w.maxW || w.maxH)) {\r\n m = {}; // will use node position but validate values\r\n }\r\n\r\n // check for content changing\r\n if (w.content) {\r\n let sub = el.querySelector('.grid-stack-item-content');\r\n if (sub && sub.innerHTML !== w.content) {\r\n sub.innerHTML = w.content;\r\n }\r\n delete w.content;\r\n }\r\n\r\n // any remaining fields are assigned, but check for dragging changes, resize constrain\r\n let changed = false;\r\n let ddChanged = false;\r\n for (const key in w) {\r\n if (key[0] !== '_' && n[key] !== w[key]) {\r\n n[key] = w[key];\r\n changed = true;\r\n ddChanged = ddChanged || (!this.opts.staticGrid && (key === 'noResize' || key === 'noMove' || key === 'locked'));\r\n }\r\n }\r\n\r\n // finally move the widget\r\n if (m) {\r\n this.engine.cleanNodes();\r\n this.engine.beginUpdate(n);\r\n this.engine.moveNode(n, m.x, m.y, m.w, m.h);\r\n this._updateContainerHeight();\r\n this._triggerChangeEvent();\r\n this.engine.endUpdate();\r\n }\r\n if (changed) { // move will only update x,y,w,h so update the rest too\r\n this._writeAttr(el, n);\r\n }\r\n if (ddChanged) {\r\n this._prepareDragDropByNode(n);\r\n }\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the margins which will set all 4 sides at once - see `GridStackOptions.margin` for format options (CSS string format of 1,2,4 values or single number).\r\n * @param value margin value\r\n */\r\n public margin(value: numberOrString): GridStack {\r\n let isMultiValue = (typeof value === 'string' && value.split(' ').length > 1);\r\n // check if we can skip re-creating our CSS file... won't check if multi values (too much hassle)\r\n if (!isMultiValue) {\r\n let data = Utils.parseHeight(value);\r\n if (this.opts.marginUnit === data.unit && this.opts.margin === data.h) return;\r\n }\r\n // re-use existing margin handling\r\n this.opts.margin = value;\r\n this.opts.marginTop = this.opts.marginBottom = this.opts.marginLeft = this.opts.marginRight = undefined;\r\n this.initMargin();\r\n\r\n this._updateStyles(true); // true = force re-create\r\n\r\n return this;\r\n }\r\n\r\n /** returns current margin number value (undefined if 4 sides don't match) */\r\n public getMargin(): number { return this.opts.margin as number; }\r\n\r\n /**\r\n * Returns true if the height of the grid will be less the vertical\r\n * constraint. Always returns true if grid doesn't have height constraint.\r\n * @param x new position x. If value is null or undefined it will be ignored.\r\n * @param y new position y. If value is null or undefined it will be ignored.\r\n * @param w new dimensions width. If value is null or undefined it will be ignored.\r\n * @param h new dimensions height. If value is null or undefined it will be ignored.\r\n * @param autoPosition if true then x, y parameters will be ignored and widget\r\n * will be places on the first available position\r\n *\r\n * @example\r\n * if (grid.willItFit(newNode.x, newNode.y, newNode.w, newNode.h, newNode.autoPosition)) {\r\n * grid.addWidget(newNode);\r\n * } else {\r\n * alert('Not enough free space to place the widget');\r\n * }\r\n */\r\n public willItFit(x: number, y: number, w: number, h: number, autoPosition: boolean): boolean {\r\n return this.engine.canBePlacedWithRespectToHeight({x, y, w, h, autoPosition});\r\n }\r\n\r\n /** @internal */\r\n private _triggerChangeEvent(): GridStack {\r\n if (this.engine.batchMode) { return this; }\r\n let elements = this.engine.getDirtyNodes(true); // verify they really changed\r\n if (elements && elements.length) {\r\n if (!this._ignoreLayoutsNodeChange) {\r\n this.engine.layoutsNodesChange(elements);\r\n }\r\n this._triggerEvent('change', elements);\r\n }\r\n this.engine.saveInitial(); // we called, now reset initial values & dirty flags\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n private _triggerAddEvent(): GridStack {\r\n if (this.engine.batchMode) { return this }\r\n if (this.engine.addedNodes && this.engine.addedNodes.length > 0) {\r\n if (!this._ignoreLayoutsNodeChange) {\r\n this.engine.layoutsNodesChange(this.engine.addedNodes);\r\n }\r\n // prevent added nodes from also triggering 'change' event (which is called next)\r\n this.engine.addedNodes.forEach(n => { delete n._dirty; });\r\n this._triggerEvent('added', this.engine.addedNodes);\r\n this.engine.addedNodes = [];\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n public _triggerRemoveEvent(): GridStack {\r\n if (this.engine.batchMode) { return this; }\r\n if (this.engine.removedNodes && this.engine.removedNodes.length > 0) {\r\n this._triggerEvent('removed', this.engine.removedNodes);\r\n this.engine.removedNodes = [];\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n private _triggerEvent(name: string, data?: GridStackNode[]): GridStack {\r\n let event = data ? new CustomEvent(name, {bubbles: false, detail: data}) : new Event(name);\r\n this.el.dispatchEvent(event);\r\n return this;\r\n }\r\n\r\n /** @internal called to delete the current dynamic style sheet used for our layout */\r\n private _removeStylesheet(): GridStack {\r\n\r\n if (this._styles) {\r\n Utils.removeStylesheet(this._styles._id);\r\n delete this._styles;\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal updated/create the CSS styles for row based layout and initial margin setting */\r\n private _updateStyles(forceUpdate = false, maxH?: number): GridStack {\r\n // call to delete existing one if we change cellHeight / margin\r\n if (forceUpdate) {\r\n this._removeStylesheet();\r\n }\r\n\r\n this._updateContainerHeight();\r\n if (!this.opts.cellHeight) { // The rest will be handled by CSS TODO: I don't understand this usage\r\n return this;\r\n }\r\n\r\n let cellHeight = this.opts.cellHeight as number;\r\n let cellHeightUnit = this.opts.cellHeightUnit;\r\n let prefix = `.${this.opts._class} > .${this.opts.itemClass}`;\r\n\r\n // create one as needed\r\n if (!this._styles) {\r\n let id = 'gridstack-style-' + (Math.random() * 100000).toFixed();\r\n // insert style to parent (instead of 'head' by default) to support WebComponent\r\n let styleLocation = this.opts.styleInHead ? undefined : this.el.parentNode as HTMLElement;\r\n this._styles = Utils.createStylesheet(id, styleLocation);\r\n if (!this._styles) { return this; }\r\n this._styles._id = id;\r\n this._styles._max = 0;\r\n\r\n // these are done once only\r\n Utils.addCSSRule(this._styles, prefix, `min-height: ${cellHeight}${cellHeightUnit}`);\r\n // content margins\r\n let top: string = this.opts.marginTop + this.opts.marginUnit;\r\n let bottom: string = this.opts.marginBottom + this.opts.marginUnit;\r\n let right: string = this.opts.marginRight + this.opts.marginUnit;\r\n let left: string = this.opts.marginLeft + this.opts.marginUnit;\r\n let content = `${prefix} > .grid-stack-item-content`;\r\n let placeholder = `.${this.opts._class} > .grid-stack-placeholder > .placeholder-content`;\r\n Utils.addCSSRule(this._styles, content, `top: ${top}; right: ${right}; bottom: ${bottom}; left: ${left};`);\r\n Utils.addCSSRule(this._styles, placeholder, `top: ${top}; right: ${right}; bottom: ${bottom}; left: ${left};`);\r\n // resize handles offset (to match margin)\r\n Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-ne`, `right: ${right}`);\r\n Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-e`, `right: ${right}`);\r\n Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-se`, `right: ${right}; bottom: ${bottom}`);\r\n Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-nw`, `left: ${left}`);\r\n Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-w`, `left: ${left}`);\r\n Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-sw`, `left: ${left}; bottom: ${bottom}`);\r\n }\r\n\r\n // now update the height specific fields\r\n maxH = maxH || this._styles._max;\r\n if (maxH > this._styles._max) {\r\n let getHeight = (rows: number): string => (cellHeight * rows) + cellHeightUnit;\r\n for (let i = this._styles._max + 1; i <= maxH; i++) { // start at 1\r\n let h: string = getHeight(i);\r\n Utils.addCSSRule(this._styles, `${prefix}[gs-y=\"${i-1}\"]`, `top: ${getHeight(i-1)}`); // start at 0\r\n Utils.addCSSRule(this._styles, `${prefix}[gs-h=\"${i}\"]`, `height: ${h}`);\r\n Utils.addCSSRule(this._styles, `${prefix}[gs-min-h=\"${i}\"]`, `min-height: ${h}`);\r\n Utils.addCSSRule(this._styles, `${prefix}[gs-max-h=\"${i}\"]`, `max-height: ${h}`);\r\n }\r\n this._styles._max = maxH;\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n private _updateContainerHeight(): GridStack {\r\n if (!this.engine || this.engine.batchMode) { return this; }\r\n let row = this.getRow(); // checks for minRow already\r\n // check for css min height\r\n let cssMinHeight = parseInt(getComputedStyle(this.el)['min-height']);\r\n if (cssMinHeight > 0) {\r\n let minRow = Math.round(cssMinHeight / this.getCellHeight(true));\r\n if (row < minRow) {\r\n row = minRow;\r\n }\r\n }\r\n this.el.setAttribute('gs-current-row', String(row));\r\n if (row === 0) {\r\n this.el.style.removeProperty('height');\r\n return this;\r\n }\r\n let cellHeight = this.opts.cellHeight as number;\r\n let unit = this.opts.cellHeightUnit;\r\n if (!cellHeight) { return this }\r\n this.el.style.height = row * cellHeight + unit;\r\n return this;\r\n }\r\n\r\n /** called to resize children nested grids when we/item resizes */\r\n private _resizeNestedGrids(target: HTMLElement): GridStack {\r\n target.querySelectorAll('.grid-stack').forEach((el: GridHTMLElement) => {\r\n if (el.gridstack) {\r\n el.gridstack.onParentResize();\r\n }});\r\n return this;\r\n }\r\n\r\n\r\n /** @internal */\r\n private _prepareElement(el: GridItemHTMLElement, triggerAddEvent = false, node?: GridStackNode): GridStack {\r\n if (!node) {\r\n el.classList.add(this.opts.itemClass);\r\n node = this._readAttr(el);\r\n }\r\n el.gridstackNode = node;\r\n node.el = el;\r\n node.grid = this;\r\n let copy = {...node};\r\n node = this.engine.addNode(node, triggerAddEvent);\r\n // write node attr back in case there was collision or we have to fix bad values during addNode()\r\n if (!Utils.same(node, copy)) {\r\n this._writeAttr(el, node);\r\n }\r\n this._prepareDragDropByNode(node);\r\n return this;\r\n }\r\n\r\n /** @internal call to write x,y,w,h attributes back to element */\r\n private _writeAttrs(el: HTMLElement, x?: number, y?: number, w?: number, h?: number): GridStack {\r\n if (x !== undefined && x !== null) { el.setAttribute('gs-x', String(x)); }\r\n if (y !== undefined && y !== null) { el.setAttribute('gs-y', String(y)); }\r\n if (w) { el.setAttribute('gs-w', String(w)); }\r\n if (h) { el.setAttribute('gs-h', String(h)); }\r\n return this;\r\n }\r\n\r\n /** @internal call to write any default attributes back to element */\r\n private _writeAttr(el: HTMLElement, node: GridStackWidget): GridStack {\r\n if (!node) return this;\r\n this._writeAttrs(el, node.x, node.y, node.w, node.h);\r\n\r\n let attrs /*: GridStackWidget*/ = { // remaining attributes\r\n autoPosition: 'gs-auto-position',\r\n minW: 'gs-min-w',\r\n minH: 'gs-min-h',\r\n maxW: 'gs-max-w',\r\n maxH: 'gs-max-h',\r\n noResize: 'gs-no-resize',\r\n noMove: 'gs-no-move',\r\n locked: 'gs-locked',\r\n id: 'gs-id',\r\n resizeHandles: 'gs-resize-handles'\r\n };\r\n for (const key in attrs) {\r\n if (node[key]) { // 0 is valid for x,y only but done above already and not in list\r\n el.setAttribute(attrs[key], String(node[key]));\r\n } else {\r\n el.removeAttribute(attrs[key]);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal call to read any default attributes from element */\r\n private _readAttr(el: HTMLElement, node: GridStackNode = {}): GridStackWidget {\r\n node.x = Utils.toNumber(el.getAttribute('gs-x'));\r\n node.y = Utils.toNumber(el.getAttribute('gs-y'));\r\n node.w = Utils.toNumber(el.getAttribute('gs-w'));\r\n node.h = Utils.toNumber(el.getAttribute('gs-h'));\r\n node.maxW = Utils.toNumber(el.getAttribute('gs-max-w'));\r\n node.minW = Utils.toNumber(el.getAttribute('gs-min-w'));\r\n node.maxH = Utils.toNumber(el.getAttribute('gs-max-h'));\r\n node.minH = Utils.toNumber(el.getAttribute('gs-min-h'));\r\n node.autoPosition = Utils.toBool(el.getAttribute('gs-auto-position'));\r\n node.noResize = Utils.toBool(el.getAttribute('gs-no-resize'));\r\n node.noMove = Utils.toBool(el.getAttribute('gs-no-move'));\r\n node.locked = Utils.toBool(el.getAttribute('gs-locked'));\r\n node.resizeHandles = el.getAttribute('gs-resize-handles');\r\n node.id = el.getAttribute('gs-id');\r\n\r\n // remove any key not found (null or false which is default)\r\n for (const key in node) {\r\n if (!node.hasOwnProperty(key)) { return; }\r\n if (!node[key] && node[key] !== 0) { // 0 can be valid value (x,y only really)\r\n delete node[key];\r\n }\r\n }\r\n\r\n return node;\r\n }\r\n\r\n /** @internal */\r\n private _setStaticClass(): GridStack {\r\n let classes = ['grid-stack-static'];\r\n\r\n if (this.opts.staticGrid) {\r\n this.el.classList.add(...classes);\r\n this.el.setAttribute('gs-static', 'true');\r\n } else {\r\n this.el.classList.remove(...classes);\r\n this.el.removeAttribute('gs-static');\r\n\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * called when we are being resized by the window - check if the one Column Mode needs to be turned on/off\r\n * and remember the prev columns we used, as well as check for auto cell height (square)\r\n */\r\n public onParentResize(): GridStack {\r\n // make the cells content (minus margin) square again\r\n if (this._isAutoCellHeight) {\r\n Utils.throttle(() => {\r\n let marginDiff = - (this.opts.marginRight as number) - (this.opts.marginLeft as number)\r\n + (this.opts.marginTop as number) + (this.opts.marginBottom as number);\r\n this.cellHeight(this.cellWidth() + marginDiff);\r\n }, 100);\r\n }\r\n\r\n if (!this.opts.disableOneColumnMode && this.el.clientWidth <= this.opts.minWidth) {\r\n if (this._oneColumnMode) { return this }\r\n this._oneColumnMode = true;\r\n this.column(1);\r\n this._resizeNestedGrids(this.el);\r\n } else {\r\n if (!this._oneColumnMode) { return this }\r\n delete this._oneColumnMode;\r\n this.column(this._prevColumn);\r\n this._resizeNestedGrids(this.el);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /** add or remove the window size event handler */\r\n private _updateWindowResizeEvent(forceRemove = false): GridStack {\r\n const workTodo = (this._isAutoCellHeight || !this.opts.disableOneColumnMode);\r\n\r\n // only add event if we're not nested (parent will call us) and we're auto sizing cells or supporting oneColumn (i.e. doing work)\r\n if (workTodo && !forceRemove && !this.opts._isNested && !this._windowResizeBind) {\r\n this._windowResizeBind = this.onParentResize.bind(this); // so we can properly remove later\r\n window.addEventListener('resize', this._windowResizeBind);\r\n this.onParentResize(); // initially call it once...\r\n } else if ((forceRemove || !workTodo) && this._windowResizeBind) {\r\n window.removeEventListener('resize', this._windowResizeBind);\r\n delete this._windowResizeBind; // remove link to us so we can free\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /** @internal convert a potential selector into actual element */\r\n public static getElement(els: GridStackElement = '.grid-stack-item'): GridItemHTMLElement { return Utils.getElement(els) }\r\n /** @internal */\r\n public static getElements(els: GridStackElement = '.grid-stack-item'): GridItemHTMLElement[] { return Utils.getElements(els) }\r\n /** @internal */\r\n public static getGridElement(els: GridStackElement): GridHTMLElement { return GridStack.getElement(els) }\r\n /** @internal */\r\n public static getGridElements(els: string): GridHTMLElement[] { return Utils.getElements(els) }\r\n\r\n /** @internal initialize margin top/bottom/left/right and units */\r\n private initMargin(): GridStack {\r\n\r\n let data: HeightData;\r\n let margin = 0;\r\n\r\n // support passing multiple values like CSS (ex: '5px 10px 0 20px')\r\n let margins: string[] = [];\r\n if (typeof this.opts.margin === 'string') {\r\n margins = this.opts.margin.split(' ')\r\n }\r\n if (margins.length === 2) { // top/bot, left/right like CSS\r\n this.opts.marginTop = this.opts.marginBottom = margins[0];\r\n this.opts.marginLeft = this.opts.marginRight = margins[1];\r\n } else if (margins.length === 4) { // Clockwise like CSS\r\n this.opts.marginTop = margins[0];\r\n this.opts.marginRight = margins[1];\r\n this.opts.marginBottom = margins[2];\r\n this.opts.marginLeft = margins[3];\r\n } else {\r\n data = Utils.parseHeight(this.opts.margin);\r\n this.opts.marginUnit = data.unit;\r\n margin = this.opts.margin = data.h;\r\n }\r\n\r\n // see if top/bottom/left/right need to be set as well\r\n if (this.opts.marginTop === undefined) {\r\n this.opts.marginTop = margin;\r\n } else {\r\n data = Utils.parseHeight(this.opts.marginTop);\r\n this.opts.marginTop = data.h;\r\n delete this.opts.margin;\r\n }\r\n\r\n if (this.opts.marginBottom === undefined) {\r\n this.opts.marginBottom = margin;\r\n } else {\r\n data = Utils.parseHeight(this.opts.marginBottom);\r\n this.opts.marginBottom = data.h;\r\n delete this.opts.margin;\r\n }\r\n\r\n if (this.opts.marginRight === undefined) {\r\n this.opts.marginRight = margin;\r\n } else {\r\n data = Utils.parseHeight(this.opts.marginRight);\r\n this.opts.marginRight = data.h;\r\n delete this.opts.margin;\r\n }\r\n\r\n if (this.opts.marginLeft === undefined) {\r\n this.opts.marginLeft = margin;\r\n } else {\r\n data = Utils.parseHeight(this.opts.marginLeft);\r\n this.opts.marginLeft = data.h;\r\n delete this.opts.margin;\r\n }\r\n this.opts.marginUnit = data.unit; // in case side were spelled out, use those units instead...\r\n if (this.opts.marginTop === this.opts.marginBottom && this.opts.marginLeft === this.opts.marginRight && this.opts.marginTop === this.opts.marginRight) {\r\n this.opts.margin = this.opts.marginTop; // makes it easier to check for no-ops in setMargin()\r\n }\r\n return this;\r\n }\r\n\r\n /*\r\n * drag&drop empty stubs that will be implemented in gridstack-dd.ts for non static grid\r\n * so we don't incur the load unless needed.\r\n * NOTE: had to make those methods public in order to define them else as\r\n * GridStack.prototype._setupAcceptWidget = function()\r\n * maybe there is a better way....\r\n */\r\n /* eslint-disable @typescript-eslint/no-unused-vars */\r\n\r\n /**\r\n * Enables/Disables moving.\r\n * @param els widget or selector to modify.\r\n * @param val if true widget will be draggable.\r\n */\r\n public movable(els: GridStackElement, val: boolean): GridStack { return this; }\r\n /**\r\n * Enables/Disables resizing.\r\n * @param els widget or selector to modify\r\n * @param val if true widget will be resizable.\r\n */\r\n public resizable(els: GridStackElement, val: boolean): GridStack { return this; }\r\n /** @internal called to add drag over support to support widgets */\r\n public _setupAcceptWidget(): GridStack { return this; }\r\n /** @internal called to setup a trash drop zone if the user specifies it */\r\n public _setupRemoveDrop(): GridStack { return this; }\r\n /** @internal */\r\n public _setupRemovingTimeout(el: GridItemHTMLElement): GridStack { return this; }\r\n /** @internal */\r\n public _clearRemovingTimeout(el: GridItemHTMLElement): GridStack { return this; }\r\n /** @internal call to setup dragging in from the outside (say toolbar), with options */\r\n public _setupDragIn(): GridStack {return this; }\r\n /** @internal prepares the element for drag&drop **/\r\n public _prepareDragDropByNode(node: GridStackNode): GridStack { return this; }\r\n\r\n // 2.x API that just calls the new and better update() - keep those around for backward compat only...\r\n /** @internal */\r\n public locked(els: GridStackElement, locked: boolean): GridStack { return this.update(els, {locked}) }\r\n /** @internal */\r\n public maxWidth(els: GridStackElement, maxW: number): GridStack { return this.update(els, {maxW}) }\r\n /** @internal */\r\n public minWidth(els: GridStackElement, minW: number): GridStack { return this.update(els, {minW}) }\r\n /** @internal */\r\n public maxHeight(els: GridStackElement, maxH: number): GridStack { return this.update(els, {maxH}) }\r\n /** @internal */\r\n public minHeight(els: GridStackElement, minH: number): GridStack { return this.update(els, {minH}) }\r\n /** @internal */\r\n public move(els: GridStackElement, x?: number, y?: number): GridStack { return this.update(els, {x, y}) }\r\n /** @internal */\r\n public resize(els: GridStackElement, w?: number, h?: number): GridStack { return this.update(els, {w, h}) }\r\n}\r\n","// dd-base-impl.ts 3.0.0 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\nexport type EventCallback = (event: Event) => boolean|void;\nexport abstract class DDBaseImplement {\n /** returns the enable state, but you have to call enable()/disable() to change (as other things need to happen) */\n public get disabled(): boolean { return this._disabled; }\n\n /** @internal */\n private _disabled = false;\n /** @internal */\n private _eventRegister: {\n [eventName: string]: EventCallback;\n } = {};\n\n public on(event: string, callback: EventCallback): void {\n this._eventRegister[event] = callback;\n }\n\n public off(event: string): void {\n delete this._eventRegister[event];\n }\n\n public enable(): void {\n this._disabled = false;\n }\n\n public disable(): void {\n this._disabled = true;\n }\n\n public destroy(): void {\n delete this._eventRegister;\n }\n\n public triggerEvent(eventName: string, event: Event): boolean|void {\n if (this.disabled) { return; }\n if (!this._eventRegister) {return; } // used when destroy before triggerEvent fire\n if (this._eventRegister[eventName]) {\n return this._eventRegister[eventName](event);\n }\n }\n}\n\nexport interface HTMLElementExtendOpt {\n el: HTMLElement;\n option: T;\n updateOption(T): DDBaseImplement;\n}\n","// dd-draggable.ts 3.0.0 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\nimport { DDManager } from './dd-manager';\nimport { DDUtils } from './dd-utils';\nimport { DDBaseImplement, HTMLElementExtendOpt } from './dd-base-impl';\nimport { GridItemHTMLElement, DDUIData } from '../types';\n\n// TODO: merge with DDDragOpt ?\nexport interface DDDraggableOpt {\n appendTo?: string | HTMLElement;\n containment?: string | HTMLElement; // TODO: not implemented yet\n handle?: string;\n revert?: string | boolean | unknown; // TODO: not implemented yet\n scroll?: boolean; // nature support by HTML5 drag drop, can't be switch to off actually\n helper?: string | HTMLElement | ((event: Event) => HTMLElement);\n basePosition?: 'fixed' | 'absolute';\n start?: (event: Event, ui: DDUIData) => void;\n stop?: (event: Event) => void;\n drag?: (event: Event, ui: DDUIData) => void;\n}\n\ninterface DragOffset {\n left: number;\n top: number;\n width: number;\n height: number;\n offsetLeft: number;\n offsetTop: number;\n}\n\nexport class DDDraggable extends DDBaseImplement implements HTMLElementExtendOpt {\n public el: HTMLElement;\n public option: DDDraggableOpt;\n public helper: HTMLElement; // used by GridStackDDNative\n\n /** @internal */\n private dragOffset: DragOffset;\n /** @internal */\n private dragElementOriginStyle: Array;\n /** @internal */\n private dragFollowTimer: number;\n /** @internal */\n private mouseDownElement: HTMLElement;\n /** @internal */\n private dragging = false;\n /** @internal */\n private paintTimer: number;\n /** @internal */\n private parentOriginStylePosition: string;\n /** @internal */\n private helperContainment: HTMLElement;\n /** @internal */\n private static basePosition: 'fixed' | 'absolute' = 'absolute';\n /** @internal */\n private static dragEventListenerOption = DDUtils.isEventSupportPassiveOption ? { capture: true, passive: true } : true;\n /** @internal */\n private static originStyleProp = ['transition', 'pointerEvents', 'position',\n 'left', 'top', 'opacity', 'zIndex', 'width', 'height', 'willChange'];\n\n constructor(el: HTMLElement, option: DDDraggableOpt = {}) {\n super();\n this.el = el;\n this.option = option;\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._mouseDown = this._mouseDown.bind(this);\n this._dragStart = this._dragStart.bind(this);\n this._drag = this._drag.bind(this);\n this._dragEnd = this._dragEnd.bind(this);\n this._dragFollow = this._dragFollow.bind(this);\n\n this.el.draggable = true;\n this.el.classList.add('ui-draggable');\n this.el.addEventListener('mousedown', this._mouseDown);\n this.el.addEventListener('dragstart', this._dragStart);\n }\n\n public on(event: 'drag' | 'dragstart' | 'dragstop', callback: (event: DragEvent) => void): void {\n super.on(event, callback);\n }\n\n public off(event: 'drag' | 'dragstart' | 'dragstop'): void {\n super.off(event);\n }\n\n public enable(): void {\n super.enable();\n this.el.draggable = true;\n this.el.classList.remove('ui-draggable-disabled');\n }\n\n public disable(): void {\n super.disable();\n this.el.draggable = false;\n this.el.classList.add('ui-draggable-disabled');\n }\n\n public destroy(): void {\n if (this.dragging) {\n // Destroy while dragging should remove dragend listener and manually trigger\n // dragend, otherwise dragEnd can't perform dragstop because eventRegistry is\n // destroyed.\n this._dragEnd({} as DragEvent);\n }\n this.el.draggable = false;\n this.el.classList.remove('ui-draggable');\n this.el.removeEventListener('mousedown', this._mouseDown);\n this.el.removeEventListener('dragstart', this._dragStart);\n delete this.el;\n delete this.helper;\n delete this.option;\n super.destroy();\n }\n\n public updateOption(opts: DDDraggableOpt): DDDraggable {\n Object.keys(opts).forEach(key => this.option[key] = opts[key]);\n return this;\n }\n\n /** @internal */\n private _mouseDown(event: MouseEvent): void {\n this.mouseDownElement = event.target as HTMLElement;\n }\n\n /** @internal */\n private _dragStart(event: DragEvent): void {\n if (this.option.handle && !(\n this.mouseDownElement\n && this.mouseDownElement.matches(\n `${this.option.handle}, ${this.option.handle} > *`\n )\n )) {\n event.preventDefault();\n return;\n }\n DDManager.dragElement = this;\n this.helper = this._createHelper(event);\n this._setupHelperContainmentStyle();\n this.dragOffset = this._getDragOffset(event, this.el, this.helperContainment);\n const ev = DDUtils.initEvent(event, { target: this.el, type: 'dragstart' });\n if (this.helper !== this.el) {\n this._setupDragFollowNodeNotifyStart(ev);\n } else {\n this.dragFollowTimer = window.setTimeout(() => {\n delete this.dragFollowTimer;\n this._setupDragFollowNodeNotifyStart(ev);\n }, 0);\n }\n this._cancelDragGhost(event);\n }\n\n /** @internal */\n private _setupDragFollowNodeNotifyStart(ev: Event): DDDraggable {\n this._setupHelperStyle();\n document.addEventListener('dragover', this._drag, DDDraggable.dragEventListenerOption);\n this.el.addEventListener('dragend', this._dragEnd);\n if (this.option.start) {\n this.option.start(ev, this.ui());\n }\n this.dragging = true;\n this.helper.classList.add('ui-draggable-dragging');\n this.triggerEvent('dragstart', ev);\n return this;\n }\n\n /** @internal */\n private _drag(event: DragEvent): void {\n this._dragFollow(event);\n const ev = DDUtils.initEvent(event, { target: this.el, type: 'drag' });\n if (this.option.drag) {\n this.option.drag(ev, this.ui());\n }\n this.triggerEvent('drag', ev);\n }\n\n /** @internal */\n private _dragEnd(event: DragEvent): void {\n if (this.dragFollowTimer) {\n clearTimeout(this.dragFollowTimer);\n delete this.dragFollowTimer;\n return;\n } else {\n if (this.paintTimer) {\n cancelAnimationFrame(this.paintTimer);\n }\n document.removeEventListener('dragover', this._drag, DDDraggable.dragEventListenerOption);\n this.el.removeEventListener('dragend', this._dragEnd);\n }\n this.dragging = false;\n this.helper.classList.remove('ui-draggable-dragging');\n this.helperContainment.style.position = this.parentOriginStylePosition || null;\n if (this.helper === this.el) {\n this._removeHelperStyle();\n } else {\n this.helper.remove();\n }\n const ev = DDUtils.initEvent(event, { target: this.el, type: 'dragstop' });\n if (this.option.stop) {\n this.option.stop(ev); // Note: ui() not used by gridstack so don't pass\n }\n this.triggerEvent('dragstop', ev);\n delete DDManager.dragElement;\n delete this.helper;\n delete this.mouseDownElement;\n }\n\n /** @internal */\n private _createHelper(event: DragEvent): HTMLElement {\n const helperIsFunction = (typeof this.option.helper) === 'function';\n const helper = (helperIsFunction\n ? (this.option.helper as ((event: Event) => HTMLElement)).apply(this.el, [event])\n : (this.option.helper === \"clone\" ? DDUtils.clone(this.el) : this.el)\n ) as HTMLElement;\n if (!document.body.contains(helper)) {\n DDUtils.appendTo(helper, (this.option.appendTo === \"parent\"\n ? this.el.parentNode\n : this.option.appendTo));\n }\n if (helper === this.el) {\n this.dragElementOriginStyle = DDDraggable.originStyleProp.map(prop => this.el.style[prop]);\n }\n return helper;\n }\n\n /** @internal */\n private _setupHelperStyle(): DDDraggable {\n this.helper.style.pointerEvents = 'none';\n this.helper.style.width = this.dragOffset.width + 'px';\n this.helper.style.height = this.dragOffset.height + 'px';\n this.helper.style['willChange'] = 'left, top';\n this.helper.style.transition = 'none'; // show up instantly\n this.helper.style.position = this.option.basePosition || DDDraggable.basePosition;\n this.helper.style.zIndex = '1000';\n setTimeout(() => {\n if (this.helper) {\n this.helper.style.transition = null; // recover animation\n }\n }, 0);\n return this;\n }\n\n /** @internal */\n private _removeHelperStyle(): DDDraggable {\n // don't bother restoring styles if we're gonna remove anyway...\n if (! (this.helper as GridItemHTMLElement)?.gridstackNode?._isAboutToRemove) {\n DDDraggable.originStyleProp.forEach(prop => {\n this.helper.style[prop] = this.dragElementOriginStyle[prop] || null;\n });\n }\n delete this.dragElementOriginStyle;\n return this;\n }\n\n /** @internal */\n private _dragFollow(event: DragEvent): void {\n if (this.paintTimer) {\n cancelAnimationFrame(this.paintTimer);\n }\n this.paintTimer = requestAnimationFrame(() => {\n delete this.paintTimer;\n const offset = this.dragOffset;\n let containmentRect = { left: 0, top: 0 };\n if (this.helper.style.position === 'absolute') {\n const { left, top } = this.helperContainment.getBoundingClientRect();\n containmentRect = { left, top };\n }\n this.helper.style.left = event.clientX + offset.offsetLeft - containmentRect.left + 'px';\n this.helper.style.top = event.clientY + offset.offsetTop - containmentRect.top + 'px';\n });\n }\n\n /** @internal */\n private _setupHelperContainmentStyle(): DDDraggable {\n this.helperContainment = this.helper.parentElement;\n if (this.option.basePosition !== 'fixed') {\n this.parentOriginStylePosition = this.helperContainment.style.position;\n if (window.getComputedStyle(this.helperContainment).position.match(/static/)) {\n this.helperContainment.style.position = 'relative';\n }\n }\n return this;\n }\n\n /** @internal */\n private _cancelDragGhost(e: DragEvent): DDDraggable {\n if (e.dataTransfer != null) {\n e.dataTransfer.setData('text', '');\n }\n e.dataTransfer.effectAllowed = 'move';\n if ('function' === typeof DataTransfer.prototype.setDragImage) {\n e.dataTransfer.setDragImage(new Image(), 0, 0);\n } else {\n // ie\n (e.target as HTMLElement).style.display = 'none';\n setTimeout(() => {\n (e.target as HTMLElement).style.display = '';\n });\n e.stopPropagation();\n return;\n }\n e.stopPropagation();\n return this;\n }\n\n /** @internal */\n private _getDragOffset(event: DragEvent, el: HTMLElement, parent: HTMLElement): DragOffset {\n\n // in case ancestor has transform/perspective css properties that change the viewpoint\n let xformOffsetX = 0;\n let xformOffsetY = 0;\n if (parent) {\n const testEl = document.createElement('div');\n DDUtils.addElStyles(testEl, {\n opacity: '0',\n position: 'fixed',\n top: 0 + 'px',\n left: 0 + 'px',\n width: '1px',\n height: '1px',\n zIndex: '-999999',\n });\n parent.appendChild(testEl);\n const testElPosition = testEl.getBoundingClientRect();\n parent.removeChild(testEl);\n xformOffsetX = testElPosition.left;\n xformOffsetY = testElPosition.top;\n // TODO: scale ?\n }\n\n const targetOffset = el.getBoundingClientRect();\n return {\n left: targetOffset.left,\n top: targetOffset.top,\n offsetLeft: - event.clientX + targetOffset.left - xformOffsetX,\n offsetTop: - event.clientY + targetOffset.top - xformOffsetY,\n width: targetOffset.width,\n height: targetOffset.height\n };\n }\n\n /** @internal TODO: set to public as called by DDDroppable! */\n public ui = (): DDUIData => {\n const containmentEl = this.el.parentElement;\n const containmentRect = containmentEl.getBoundingClientRect();\n const offset = this.helper.getBoundingClientRect();\n return {\n position: { //Current CSS position of the helper as { top, left } object\n top: offset.top - containmentRect.top,\n left: offset.left - containmentRect.left\n }\n /* not used by GridStack for now...\n helper: [this.helper], //The object arr representing the helper that's being dragged.\n offset: { top: offset.top, left: offset.left } // Current offset position of the helper as { top, left } object.\n */\n };\n }\n}\n\n\n","// dd-droppable.ts 3.0.0 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\nimport { DDDraggable } from './dd-draggable';\nimport { DDManager } from './dd-manager';\nimport { DDBaseImplement, HTMLElementExtendOpt } from './dd-base-impl';\nimport { DDUtils } from './dd-utils';\n\nexport interface DDDroppableOpt {\n accept?: string | ((el: HTMLElement) => boolean);\n drop?: (event: DragEvent, ui) => void;\n over?: (event: DragEvent, ui) => void;\n out?: (event: DragEvent, ui) => void;\n}\n\nexport class DDDroppable extends DDBaseImplement implements HTMLElementExtendOpt {\n\n public accept: (el: HTMLElement) => boolean;\n public el: HTMLElement;\n public option: DDDroppableOpt;\n\n /** @internal */\n private acceptable: boolean = null;\n\n constructor(el: HTMLElement, opts: DDDroppableOpt = {}) {\n super();\n this.el = el;\n this.option = opts;\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._dragEnter = this._dragEnter.bind(this);\n this._dragOver = this._dragOver.bind(this);\n this._dragLeave = this._dragLeave.bind(this);\n this._drop = this._drop.bind(this);\n\n this.el.classList.add('ui-droppable');\n this.el.addEventListener('dragenter', this._dragEnter);\n this._setupAccept();\n }\n\n public on(event: 'drop' | 'dropover' | 'dropout', callback: (event: DragEvent) => void): void {\n super.on(event, callback);\n }\n\n public off(event: 'drop' | 'dropover' | 'dropout'): void {\n super.off(event);\n }\n\n public enable(): void {\n if (!this.disabled) { return; }\n super.enable();\n this.el.classList.remove('ui-droppable-disabled');\n this.el.addEventListener('dragenter', this._dragEnter);\n }\n\n public disable(): void {\n if (this.disabled) { return; }\n super.disable();\n this.el.classList.add('ui-droppable-disabled');\n this.el.removeEventListener('dragenter', this._dragEnter);\n }\n\n public destroy(): void {\n this.el.classList.remove('ui-droppable');\n if (this.disabled) {\n this.el.classList.remove('ui-droppable-disabled');\n this.el.removeEventListener('dragenter', this._dragEnter);\n this.el.removeEventListener('dragover', this._dragOver);\n this.el.removeEventListener('drop', this._drop);\n this.el.removeEventListener('dragleave', this._dragLeave);\n }\n super.destroy();\n }\n\n public updateOption(opts: DDDroppableOpt): DDDroppable {\n Object.keys(opts).forEach(key => this.option[key] = opts[key]);\n this._setupAccept();\n return this;\n }\n\n /** @internal called when the cursor enters our area - prepare for a possible drop and track leaving */\n private _dragEnter(event: DragEvent): void {\n this.el.removeEventListener('dragenter', this._dragEnter);\n this.acceptable = this._canDrop();\n if (this.acceptable) {\n event.preventDefault();\n const ev = DDUtils.initEvent(event, { target: this.el, type: 'dropover' });\n if (this.option.over) {\n this.option.over(ev, this._ui(DDManager.dragElement))\n }\n this.triggerEvent('dropover', ev);\n this.el.addEventListener('dragover', this._dragOver);\n this.el.addEventListener('drop', this._drop);\n }\n this.el.classList.add('ui-droppable-over');\n this.el.addEventListener('dragleave', this._dragLeave);\n }\n\n /** @internal called when an acceptable to drop item is being dragged over - do nothing but eat the event */\n private _dragOver(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n }\n\n /** @internal called when the item is leaving our area, stop tracking if we had acceptable item */\n private _dragLeave(event: DragEvent): void {\n if (this.el.contains(event.relatedTarget as HTMLElement)) { return; }\n this._removeLeaveCallbacks();\n if (this.acceptable) {\n event.preventDefault();\n const ev = DDUtils.initEvent(event, { target: this.el, type: 'dropout' });\n if (this.option.out) {\n this.option.out(ev, this._ui(DDManager.dragElement))\n }\n this.triggerEvent('dropout', ev);\n }\n }\n\n /** @internal item is being dropped on us - call the client drop event */\n private _drop(event: DragEvent): void {\n if (!this.acceptable) { return; } // should not have received event...\n event.preventDefault();\n const ev = DDUtils.initEvent(event, { target: this.el, type: 'drop' });\n if (this.option.drop) {\n this.option.drop(ev, this._ui(DDManager.dragElement))\n }\n this.triggerEvent('drop', ev);\n this._removeLeaveCallbacks();\n }\n\n /** @internal called to remove callbacks when leaving or dropping */\n private _removeLeaveCallbacks() {\n this.el.removeEventListener('dragleave', this._dragLeave);\n this.el.classList.remove('ui-droppable-over');\n if (this.acceptable) {\n this.el.removeEventListener('dragover', this._dragOver);\n this.el.removeEventListener('drop', this._drop);\n }\n this.el.addEventListener('dragenter', this._dragEnter);\n }\n\n /** @internal */\n private _canDrop(): boolean {\n return DDManager.dragElement && (!this.accept || this.accept(DDManager.dragElement.el));\n }\n\n /** @internal */\n private _setupAccept(): DDDroppable {\n if (this.option.accept && typeof this.option.accept === 'string') {\n this.accept = (el: HTMLElement) => {\n return el.matches(this.option.accept as string)\n }\n } else {\n this.accept = this.option.accept as ((el: HTMLElement) => boolean);\n }\n return this;\n }\n\n /** @internal */\n private _ui(drag: DDDraggable) {\n return {\n draggable: drag.el,\n ...drag.ui()\n };\n }\n}\n\n","// dd-elements.ts 3.0.0 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\nimport { DDResizable, DDResizableOpt } from './dd-resizable';\nimport { GridItemHTMLElement } from './../types';\nimport { DDDraggable, DDDraggableOpt } from './dd-draggable';\nimport { DDDroppable, DDDroppableOpt } from './dd-droppable';\n\nexport interface DDElementHost extends GridItemHTMLElement {\n ddElement?: DDElement;\n}\n\nexport class DDElement {\n\n static init(el: DDElementHost): DDElement {\n if (!el.ddElement) { el.ddElement = new DDElement(el); }\n return el.ddElement;\n }\n\n public el: DDElementHost;\n public ddDraggable?: DDDraggable;\n public ddDroppable?: DDDroppable;\n public ddResizable?: DDResizable;\n\n constructor(el: DDElementHost) {\n this.el = el;\n }\n\n public on(eventName: string, callback: (event: MouseEvent) => void): DDElement {\n if (this.ddDraggable && ['drag', 'dragstart', 'dragstop'].indexOf(eventName) > -1) {\n this.ddDraggable.on(eventName as 'drag' | 'dragstart' | 'dragstop', callback);\n } else if (this.ddDroppable && ['drop', 'dropover', 'dropout'].indexOf(eventName) > -1) {\n this.ddDroppable.on(eventName as 'drop' | 'dropover' | 'dropout', callback);\n } else if (this.ddResizable && ['resizestart', 'resize', 'resizestop'].indexOf(eventName) > -1) {\n this.ddResizable.on(eventName as 'resizestart' | 'resize' | 'resizestop', callback);\n }\n return this;\n }\n\n public off(eventName: string): DDElement {\n if (this.ddDraggable && ['drag', 'dragstart', 'dragstop'].indexOf(eventName) > -1) {\n this.ddDraggable.off(eventName as 'drag' | 'dragstart' | 'dragstop');\n } else if (this.ddDroppable && ['drop', 'dropover', 'dropout'].indexOf(eventName) > -1) {\n this.ddDroppable.off(eventName as 'drop' | 'dropover' | 'dropout');\n } else if (this.ddResizable && ['resizestart', 'resize', 'resizestop'].indexOf(eventName) > -1) {\n this.ddResizable.off(eventName as 'resizestart' | 'resize' | 'resizestop');\n }\n return this;\n }\n\n public setupDraggable(opts: DDDraggableOpt): DDElement {\n if (!this.ddDraggable) {\n this.ddDraggable = new DDDraggable(this.el, opts);\n } else {\n this.ddDraggable.updateOption(opts);\n }\n return this;\n }\n\n public cleanDraggable(): DDElement {\n if (this.ddDraggable) {\n this.ddDraggable.destroy();\n delete this.ddDraggable;\n }\n return this;\n }\n\n public setupResizable(opts: DDResizableOpt): DDElement {\n if (!this.ddResizable) {\n this.ddResizable = new DDResizable(this.el, opts);\n } else {\n this.ddResizable.updateOption(opts);\n }\n return this;\n }\n\n public cleanResizable(): DDElement {\n if (this.ddResizable) {\n this.ddResizable.destroy();\n delete this.ddResizable;\n }\n return this;\n }\n\n public setupDroppable(opts: DDDroppableOpt): DDElement {\n if (!this.ddDroppable) {\n this.ddDroppable = new DDDroppable(this.el, opts);\n } else {\n this.ddDroppable.updateOption(opts);\n }\n return this;\n }\n\n public cleanDroppable(): DDElement {\n if (this.ddDroppable) {\n this.ddDroppable.destroy();\n delete this.ddDroppable;\n }\n return this;\n }\n}\n","// dd-manager.ts 3.0.0 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\nimport { DDDraggable } from './dd-draggable';\n\nexport class DDManager {\n static dragElement: DDDraggable;\n}\n","// dd-resizable-handle.ts 3.0.0 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\nexport interface DDResizableHandleOpt {\n start?: (event) => void;\n move?: (event) => void;\n stop?: (event) => void;\n}\n\nexport class DDResizableHandle {\n /** @internal */\n private el: HTMLElement;\n /** @internal */\n private host: HTMLElement;\n /** @internal */\n private option: DDResizableHandleOpt;\n /** @internal */\n private dir: string;\n /** @internal */\n private mouseMoving = false;\n /** @internal */\n private started = false;\n /** @internal */\n private mouseDownEvent: MouseEvent;\n /** @internal */\n private static prefix = 'ui-resizable-';\n\n constructor(host: HTMLElement, direction: string, option: DDResizableHandleOpt) {\n this.host = host;\n this.dir = direction;\n this.option = option;\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._mouseDown = this._mouseDown.bind(this);\n this._mouseMove = this._mouseMove.bind(this);\n this._mouseUp = this._mouseUp.bind(this);\n\n this.init();\n }\n\n public init(): DDResizableHandle {\n const el = document.createElement('div');\n el.classList.add('ui-resizable-handle');\n el.classList.add(`${DDResizableHandle.prefix}${this.dir}`);\n el.style.zIndex = '100';\n el.style.userSelect = 'none';\n this.el = el;\n this.host.appendChild(this.el);\n this.el.addEventListener('mousedown', this._mouseDown);\n return this;\n }\n\n public destroy(): DDResizableHandle {\n this.host.removeChild(this.el);\n return this;\n }\n\n /** @internal */\n private _mouseDown(event: MouseEvent): void {\n this.mouseDownEvent = event;\n setTimeout(() => {\n document.addEventListener('mousemove', this._mouseMove, true);\n document.addEventListener('mouseup', this._mouseUp);\n setTimeout(() => {\n if (!this.mouseMoving) {\n document.removeEventListener('mousemove', this._mouseMove, true);\n document.removeEventListener('mouseup', this._mouseUp);\n delete this.mouseDownEvent;\n }\n }, 300);\n }, 100);\n }\n\n /** @internal */\n private _mouseMove(event: MouseEvent): void {\n if (!this.started && !this.mouseMoving) {\n if (this._hasMoved(event, this.mouseDownEvent)) {\n this.mouseMoving = true;\n this._triggerEvent('start', this.mouseDownEvent);\n this.started = true;\n }\n }\n if (this.started) {\n this._triggerEvent('move', event);\n }\n }\n\n /** @internal */\n private _mouseUp(event: MouseEvent): void {\n if (this.mouseMoving) {\n this._triggerEvent('stop', event);\n }\n document.removeEventListener('mousemove', this._mouseMove, true);\n document.removeEventListener('mouseup', this._mouseUp);\n this.mouseMoving = false;\n this.started = false;\n delete this.mouseDownEvent;\n }\n\n /** @internal */\n private _hasMoved(event: MouseEvent, oEvent: MouseEvent): boolean {\n const { clientX, clientY } = event;\n const { clientX: oClientX, clientY: oClientY } = oEvent;\n return (\n Math.abs(clientX - oClientX) > 1\n || Math.abs(clientY - oClientY) > 1\n );\n }\n\n /** @internal */\n private _triggerEvent(name: string, event: MouseEvent): DDResizableHandle {\n if (this.option[name]) {\n this.option[name](event);\n }\n return this;\n }\n}\n","// dd-resizable.ts 3.0.0 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\nimport { DDResizableHandle } from './dd-resizable-handle';\nimport { DDBaseImplement, HTMLElementExtendOpt } from './dd-base-impl';\nimport { DDUtils } from './dd-utils';\nimport { DDUIData, Rect, Size } from '../types';\n\n// TODO: merge with DDDragOpt\nexport interface DDResizableOpt {\n autoHide?: boolean;\n handles?: string;\n maxHeight?: number;\n maxWidth?: number;\n minHeight?: number;\n minWidth?: number;\n basePosition?: 'fixed' | 'absolute';\n start?: (event: Event, ui: DDUIData) => void;\n stop?: (event: Event) => void;\n resize?: (event: Event, ui: DDUIData) => void;\n}\n\nexport class DDResizable extends DDBaseImplement implements HTMLElementExtendOpt {\n\n // have to be public else complains for HTMLElementExtendOpt ?\n public el: HTMLElement;\n public option: DDResizableOpt;\n\n /** @internal */\n private handlers: DDResizableHandle[];\n /** @internal */\n private originalRect: Rect;\n /** @internal */\n private temporalRect: Rect;\n /** @internal */\n private startEvent: MouseEvent;\n /** @internal */\n private elOriginStyle;\n /** @internal */\n private parentOriginStylePosition;\n /** @internal */\n private static _originStyleProp = ['width', 'height', 'position', 'left', 'top', 'opacity', 'zIndex'];\n\n constructor(el: HTMLElement, opts: DDResizableOpt = {}) {\n super();\n this.el = el;\n this.option = opts;\n\n this.el.classList.add('ui-resizable');\n this._setupAutoHide();\n this._setupHandlers();\n }\n\n public on(event: 'resizestart' | 'resize' | 'resizestop', callback: (event: DragEvent) => void): void {\n super.on(event, callback);\n }\n\n public off(event: 'resizestart' | 'resize' | 'resizestop'): void {\n super.off(event);\n }\n\n public enable(): void {\n if (this.disabled) {\n super.enable();\n this.el.classList.remove('ui-resizable-disabled');\n }\n }\n\n public disable(): void {\n if (!this.disabled) {\n super.disable();\n this.el.classList.add('ui-resizable-disabled');\n }\n }\n\n public destroy(): void {\n this._removeHandlers();\n if (this.option.autoHide) {\n this.el.removeEventListener('mouseover', this._showHandlers);\n this.el.removeEventListener('mouseout', this._hideHandlers);\n }\n this.el.classList.remove('ui-resizable');\n delete this.el;\n super.destroy();\n }\n\n public updateOption(opts: DDResizableOpt): DDResizable {\n let updateHandles = (opts.handles && opts.handles !== this.option.handles);\n let updateAutoHide = (opts.autoHide && opts.autoHide !== this.option.autoHide);\n Object.keys(opts).forEach(key => this.option[key] = opts[key]);\n if (updateHandles) {\n this._removeHandlers();\n this._setupHandlers();\n }\n if (updateAutoHide) {\n this._setupAutoHide();\n }\n return this;\n }\n\n /** @internal */\n private _setupAutoHide(): DDResizable {\n if (this.option.autoHide) {\n this.el.classList.add('ui-resizable-autohide');\n // use mouseover/mouseout instead of mouseenter mouseleave to get better performance;\n this.el.addEventListener('mouseover', this._showHandlers);\n this.el.addEventListener('mouseout', this._hideHandlers);\n } else {\n this.el.classList.remove('ui-resizable-autohide');\n this.el.removeEventListener('mouseover', this._showHandlers);\n this.el.removeEventListener('mouseout', this._hideHandlers);\n }\n return this;\n }\n\n /** @internal */\n private _showHandlers = () => {\n this.el.classList.remove('ui-resizable-autohide');\n }\n\n /** @internal */\n private _hideHandlers = () => {\n this.el.classList.add('ui-resizable-autohide');\n }\n\n /** @internal */\n private _setupHandlers(): DDResizable {\n let handlerDirection = this.option.handles || 'e,s,se';\n if (handlerDirection === 'all') {\n handlerDirection = 'n,e,s,w,se,sw,ne,nw';\n }\n this.handlers = handlerDirection.split(',')\n .map(dir => dir.trim())\n .map(dir => new DDResizableHandle(this.el, dir, {\n start: (event: MouseEvent) => {\n this._resizeStart(event);\n },\n stop: (event: MouseEvent) => {\n this._resizeStop(event);\n },\n move: (event: MouseEvent) => {\n this._resizing(event, dir);\n }\n }));\n return this;\n }\n\n /** @internal */\n private _resizeStart(event: MouseEvent): DDResizable {\n this.originalRect = this.el.getBoundingClientRect();\n this.startEvent = event;\n this._setupHelper();\n this._applyChange();\n const ev = DDUtils.initEvent(event, { type: 'resizestart', target: this.el });\n if (this.option.start) {\n this.option.start(ev, this._ui());\n }\n this.el.classList.add('ui-resizable-resizing');\n this.triggerEvent('resizestart', ev);\n return this;\n }\n\n /** @internal */\n private _resizing(event: MouseEvent, dir: string): DDResizable {\n this.temporalRect = this._getChange(event, dir);\n this._applyChange();\n const ev = DDUtils.initEvent(event, { type: 'resize', target: this.el });\n if (this.option.resize) {\n this.option.resize(ev, this._ui());\n }\n this.triggerEvent('resize', ev);\n return this;\n }\n\n /** @internal */\n private _resizeStop(event: MouseEvent): DDResizable {\n const ev = DDUtils.initEvent(event, { type: 'resizestop', target: this.el });\n if (this.option.stop) {\n this.option.stop(ev); // Note: ui() not used by gridstack so don't pass\n }\n this.el.classList.remove('ui-resizable-resizing');\n this.triggerEvent('resizestop', ev);\n this._cleanHelper();\n delete this.startEvent;\n delete this.originalRect;\n delete this.temporalRect;\n return this;\n }\n\n /** @internal */\n private _setupHelper(): DDResizable {\n this.elOriginStyle = DDResizable._originStyleProp.map(prop => this.el.style[prop]);\n this.parentOriginStylePosition = this.el.parentElement.style.position;\n if (window.getComputedStyle(this.el.parentElement).position.match(/static/)) {\n this.el.parentElement.style.position = 'relative';\n }\n this.el.style.position = this.option.basePosition || 'absolute'; // or 'fixed'\n this.el.style.opacity = '0.8';\n this.el.style.zIndex = '1000';\n return this;\n }\n\n /** @internal */\n private _cleanHelper(): DDResizable {\n DDResizable._originStyleProp.forEach(prop => {\n this.el.style[prop] = this.elOriginStyle[prop] || null;\n });\n this.el.parentElement.style.position = this.parentOriginStylePosition || null;\n return this;\n }\n\n /** @internal */\n private _getChange(event: MouseEvent, dir: string): Rect {\n const oEvent = this.startEvent;\n const newRect = { // Note: originalRect is a complex object, not a simple Rect, so copy out.\n width: this.originalRect.width,\n height: this.originalRect.height,\n left: this.originalRect.left,\n top: this.originalRect.top\n };\n const offsetH = event.clientX - oEvent.clientX;\n const offsetV = event.clientY - oEvent.clientY;\n\n if (dir.indexOf('e') > -1) {\n newRect.width += event.clientX - oEvent.clientX;\n }\n if (dir.indexOf('s') > -1) {\n newRect.height += event.clientY - oEvent.clientY;\n }\n if (dir.indexOf('w') > -1) {\n newRect.width -= offsetH;\n newRect.left += offsetH;\n }\n if (dir.indexOf('n') > -1) {\n newRect.height -= offsetV;\n newRect.top += offsetV\n }\n const reshape = this._getReShapeSize(newRect.width, newRect.height);\n if (newRect.width !== reshape.width) {\n if (dir.indexOf('w') > -1) {\n newRect.left += reshape.width - newRect.width;\n }\n newRect.width = reshape.width;\n }\n if (newRect.height !== reshape.height) {\n if (dir.indexOf('n') > -1) {\n newRect.top += reshape.height - newRect.height;\n }\n newRect.height = reshape.height;\n }\n return newRect;\n }\n\n /** @internal */\n private _getReShapeSize(oWidth: number, oHeight: number): Size {\n const maxWidth = this.option.maxWidth || oWidth;\n const minWidth = this.option.minWidth || oWidth;\n const maxHeight = this.option.maxHeight || oHeight;\n const minHeight = this.option.minHeight || oHeight;\n const width = Math.min(maxWidth, Math.max(minWidth, oWidth));\n const height = Math.min(maxHeight, Math.max(minHeight, oHeight));\n return { width, height };\n }\n\n /** @internal */\n private _applyChange(): DDResizable {\n let containmentRect = { left: 0, top: 0, width: 0, height: 0 };\n if (this.el.style.position === 'absolute') {\n const containmentEl = this.el.parentElement;\n const { left, top } = containmentEl.getBoundingClientRect();\n containmentRect = { left, top, width: 0, height: 0 };\n }\n Object.keys(this.temporalRect || this.originalRect).forEach(key => {\n const value = this.temporalRect[key];\n this.el.style[key] = value - containmentRect[key] + 'px';\n });\n return this;\n }\n\n /** @internal */\n private _removeHandlers(): DDResizable {\n this.handlers.forEach(handle => handle.destroy());\n delete this.handlers;\n return this;\n }\n\n /** @internal */\n private _ui = (): DDUIData => {\n const containmentEl = this.el.parentElement;\n const containmentRect = containmentEl.getBoundingClientRect();\n const rect = this.temporalRect || this.originalRect;\n return {\n position: {\n left: rect.left - containmentRect.left,\n top: rect.top - containmentRect.top\n },\n size: {\n width: rect.width,\n height: rect.height\n }\n /* Gridstack ONLY needs position set above... keep around in case.\n element: [this.el], // The object representing the element to be resized\n helper: [], // TODO: not support yet - The object representing the helper that's being resized\n originalElement: [this.el],// we don't wrap here, so simplify as this.el //The object representing the original element before it is wrapped\n originalPosition: { // The position represented as { left, top } before the resizable is resized\n left: this.originalRect.left - containmentRect.left,\n top: this.originalRect.top - containmentRect.top\n },\n originalSize: { // The size represented as { width, height } before the resizable is resized\n width: this.originalRect.width,\n height: this.originalRect.height\n }\n */\n };\n }\n}\n","// dd-utils.ts 3.0.0 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\n\nexport class DDUtils {\n\n public static isEventSupportPassiveOption = ((() => {\n let supportsPassive = false;\n let passiveTest = () => {\n // do nothing\n };\n document.addEventListener('test', passiveTest, {\n get passive() {\n supportsPassive = true;\n return true;\n }\n });\n document.removeEventListener('test', passiveTest);\n return supportsPassive;\n })());\n\n public static clone(el: HTMLElement): HTMLElement {\n const node = el.cloneNode(true) as HTMLElement;\n node.removeAttribute('id');\n return node;\n }\n\n public static appendTo(el: HTMLElement, parent: string | HTMLElement | Node): void {\n let parentNode: HTMLElement;\n if (typeof parent === 'string') {\n parentNode = document.querySelector(parent as string);\n } else {\n parentNode = parent as HTMLElement;\n }\n if (parentNode) {\n parentNode.append(el);\n }\n }\n\n public static setPositionRelative(el): void {\n if (!(/^(?:r|a|f)/).test(window.getComputedStyle(el).position)) {\n el.style.position = \"relative\";\n }\n }\n\n public static addElStyles(el: HTMLElement, styles: { [prop: string]: string | string[] }): void {\n if (styles instanceof Object) {\n for (const s in styles) {\n if (styles.hasOwnProperty(s)) {\n if (Array.isArray(styles[s])) {\n // support fallback value\n (styles[s] as string[]).forEach(val => {\n el.style[s] = val;\n });\n } else {\n el.style[s] = styles[s];\n }\n }\n }\n }\n }\n\n public static initEvent(e: DragEvent | MouseEvent, info: { type: string; target?: EventTarget }): T {\n const kbdProps = 'altKey,ctrlKey,metaKey,shiftKey'.split(',');\n const ptProps = 'pageX,pageY,clientX,clientY,screenX,screenY'.split(',');\n const evt = { type: info.type };\n const obj = {\n button: 0,\n which: 0,\n buttons: 1,\n bubbles: true,\n cancelable: true,\n originEvent: e,\n target: info.target ? info.target : e.target\n }\n if (e instanceof DragEvent) {\n Object.assign(obj, { dataTransfer: e.dataTransfer });\n }\n DDUtils._copyProps(evt, e, kbdProps);\n DDUtils._copyProps(evt, e, ptProps);\n DDUtils._copyProps(evt, obj, Object.keys(obj));\n return evt as unknown as T;\n }\n\n /** @internal */\n private static _copyProps(dst: unknown, src: unknown, props: string[]): void {\n for (let i = 0; i < props.length; i++) {\n const p = props[i];\n dst[p] = src[p];\n }\n }\n}\n","// gridstack-dd-native.ts 3.0.0 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\nimport { DDManager } from './dd-manager';\nimport { DDElement, DDElementHost } from './dd-element';\n\nimport { GridStackElement } from '../gridstack';\nimport { GridStackDD, DDOpts, DDKey, DDDropOpt, DDCallback, DDValue } from '../gridstack-dd';\nimport { GridItemHTMLElement, DDDragInOpt } from '../types';\nimport { Utils } from '../utils';\n\n// export our base class (what user should use) and all associated types\nexport * from '../gridstack-dd';\n\n/**\n * HTML 5 Native DragDrop based drag'n'drop plugin.\n */\nexport class GridStackDDNative extends GridStackDD {\n\n public resizable(el: GridItemHTMLElement, opts: DDOpts, key?: DDKey, value?: DDValue): GridStackDDNative {\n this._getDDElements(el).forEach(dEl => {\n if (opts === 'disable' || opts === 'enable') {\n dEl.ddResizable[opts]();\n } else if (opts === 'destroy') {\n if (dEl.ddResizable) {\n dEl.cleanResizable();\n }\n } else if (opts === 'option') {\n dEl.setupResizable({ [key]: value });\n } else {\n const grid = dEl.el.gridstackNode.grid;\n let handles = dEl.el.getAttribute('gs-resize-handles') ? dEl.el.getAttribute('gs-resize-handles') : grid.opts.resizable.handles;\n dEl.setupResizable({\n ...grid.opts.resizable,\n ...{ handles: handles },\n ...{\n start: opts.start,\n stop: opts.stop,\n resize: opts.resize\n }\n });\n }\n });\n return this;\n }\n\n public draggable(el: GridItemHTMLElement, opts: DDOpts, key?: DDKey, value?: DDValue): GridStackDDNative {\n this._getDDElements(el).forEach(dEl => {\n if (opts === 'disable' || opts === 'enable') {\n dEl.ddDraggable && dEl.ddDraggable[opts]();\n } else if (opts === 'destroy') {\n if (dEl.ddDraggable) { // error to call destroy if not there\n dEl.cleanDraggable();\n }\n } else if (opts === 'option') {\n dEl.setupDraggable({ [key]: value });\n } else {\n const grid = dEl.el.gridstackNode.grid;\n dEl.setupDraggable({\n ...grid.opts.draggable,\n ...{\n containment: (grid.opts._isNested && !grid.opts.dragOut)\n ? grid.el.parentElement\n : (grid.opts.draggable.containment || null),\n start: opts.start,\n stop: opts.stop,\n drag: opts.drag\n }\n });\n }\n });\n return this;\n }\n\n public dragIn(el: GridStackElement, opts: DDDragInOpt): GridStackDDNative {\n this._getDDElements(el).forEach(dEl => dEl.setupDraggable(opts));\n return this;\n }\n\n public droppable(el: GridItemHTMLElement, opts: DDOpts | DDDropOpt, key?: DDKey, value?: DDValue): GridStackDDNative {\n if (typeof opts.accept === 'function' && !opts._accept) {\n opts._accept = opts.accept;\n opts.accept = (el) => opts._accept(el);\n }\n this._getDDElements(el).forEach(dEl => {\n if (opts === 'disable' || opts === 'enable') {\n dEl.ddDroppable && dEl.ddDroppable[opts]();\n } else if (opts === 'destroy') {\n if (dEl.ddDroppable) { // error to call destroy if not there\n dEl.cleanDroppable();\n }\n } else if (opts === 'option') {\n dEl.setupDroppable({ [key]: value });\n } else {\n dEl.setupDroppable(opts);\n }\n });\n return this;\n }\n\n /** true if element is droppable */\n public isDroppable(el: DDElementHost): boolean {\n return el && el.ddElement && el.ddElement.ddDroppable && !el.ddElement.ddDroppable.disabled;\n }\n\n /** true if element is draggable */\n public isDraggable(el: DDElementHost): boolean {\n return el && el.ddElement && el.ddElement.ddDraggable && !el.ddElement.ddDraggable.disabled;\n }\n\n /** true if element is draggable */\n public isResizable(el: DDElementHost): boolean {\n return el && el.ddElement && el.ddElement.ddResizable && !el.ddElement.ddResizable.disabled;\n }\n\n public on(el: GridItemHTMLElement, name: string, callback: DDCallback): GridStackDDNative {\n this._getDDElements(el).forEach(dEl =>\n dEl.on(name, (event: Event) => {\n callback(\n event,\n DDManager.dragElement ? DDManager.dragElement.el : event.target as GridItemHTMLElement,\n DDManager.dragElement ? DDManager.dragElement.helper : null)\n })\n );\n return this;\n }\n\n public off(el: GridItemHTMLElement, name: string): GridStackDD {\n this._getDDElements(el).forEach(dEl => dEl.off(name));\n return this;\n }\n\n /** @internal returns a list of DD elements, creating them on the fly by default */\n private _getDDElements(els: GridStackElement, create = true): DDElement[] {\n let hosts = Utils.getElements(els) as DDElementHost[];\n if (!hosts.length) { return []; }\n let list = hosts.map(e => e.ddElement || (create ? DDElement.init(e) : null));\n if (!create) { list.filter(d => d); } // remove nulls\n return list;\n }\n}\n\n// finally register ourself\nGridStackDD.registerPlugin(GridStackDDNative);\n","// index.html5.ts 3.0.0 - everything you need for a Grid that uses HTML5 native drag&drop (work in progress) @preserve\r\n\r\n// import './gridstack-poly.js';\r\n\r\nexport * from './types';\r\nexport * from './utils';\r\nexport * from './gridstack-engine';\r\nexport * from './gridstack-ddi';\r\nexport * from './gridstack';\r\n\r\nexport * from './h5/gridstack-dd-native';\r\n\r\n// declare module 'gridstack'; for umd ?\r\n","// utils.ts 3.0.0 @preserve\r\n\r\n/**\r\n * https://gridstackjs.com/\r\n * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov\r\n * gridstack.js may be freely distributed under the MIT license.\r\n*/\r\n\r\nimport { GridStackElement, GridStackWidget, GridStackNode, GridStackOptions, numberOrString } from './types';\r\n\r\nexport interface HeightData {\r\n h: number;\r\n unit: string;\r\n}\r\n\r\n/** checks for obsolete method names */\r\n// eslint-disable-next-line\r\nexport function obsolete(self, f, oldName: string, newName: string, rev: string): (...args: any[]) => any {\r\n let wrapper = (...args) => {\r\n console.warn('gridstack.js: Function `' + oldName + '` is deprecated in ' + rev + ' and has been replaced ' +\r\n 'with `' + newName + '`. It will be **completely** removed in v1.0');\r\n return f.apply(self, args);\r\n }\r\n wrapper.prototype = f.prototype;\r\n return wrapper;\r\n}\r\n\r\n/** checks for obsolete grid options (can be used for any fields, but msg is about options) */\r\nexport function obsoleteOpts(opts: GridStackOptions, oldName: string, newName: string, rev: string): void {\r\n if (opts[oldName] !== undefined) {\r\n opts[newName] = opts[oldName];\r\n console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + ' and has been replaced with `' +\r\n newName + '`. It will be **completely** removed in v1.0');\r\n }\r\n}\r\n\r\n/** checks for obsolete grid options which are gone */\r\nexport function obsoleteOptsDel(opts: GridStackOptions, oldName: string, rev: string, info: string): void {\r\n if (opts[oldName] !== undefined) {\r\n console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + info);\r\n }\r\n}\r\n\r\n/** checks for obsolete Jquery element attributes */\r\nexport function obsoleteAttr(el: HTMLElement, oldName: string, newName: string, rev: string): void {\r\n let oldAttr = el.getAttribute(oldName);\r\n if (oldAttr !== null) {\r\n el.setAttribute(newName, oldAttr);\r\n console.warn('gridstack.js: attribute `' + oldName + '`=' + oldAttr + ' is deprecated on this object in ' + rev + ' and has been replaced with `' +\r\n newName + '`. It will be **completely** removed in v1.0');\r\n }\r\n}\r\n\r\n/**\r\n * Utility methods\r\n */\r\nexport class Utils {\r\n\r\n /** convert a potential selector into actual list of html elements */\r\n static getElements(els: GridStackElement): HTMLElement[] {\r\n if (typeof els === 'string') {\r\n let list = document.querySelectorAll(els);\r\n if (!list.length && els[0] !== '.' && els[0] !== '#') {\r\n list = document.querySelectorAll('.' + els);\r\n if (!list.length) { list = document.querySelectorAll('#' + els) }\r\n }\r\n return Array.from(list) as HTMLElement[];\r\n }\r\n return [els];\r\n }\r\n\r\n /** convert a potential selector into actual single element */\r\n static getElement(els: GridStackElement): HTMLElement {\r\n if (typeof els === 'string') {\r\n if (!els.length) { return null}\r\n if (els[0] === '#') {\r\n return document.getElementById(els.substring(1));\r\n }\r\n if (els[0] === '.' || els[0] === '[') {\r\n return document.querySelector(els);\r\n }\r\n\r\n // if we start with a digit, assume it's an id (error calling querySelector('#1')) as class are not valid CSS\r\n if(!isNaN(+els[0])) { // start with digit\r\n return document.getElementById(els);\r\n }\r\n\r\n // finally try string, then id then class\r\n let el = document.querySelector(els);\r\n if (!el) { el = document.getElementById(els) }\r\n if (!el) { el = document.querySelector('.' + els) }\r\n return el as HTMLElement;\r\n }\r\n return els;\r\n }\r\n\r\n /** returns true if a and b overlap */\r\n static isIntercepted(a: GridStackWidget, b: GridStackWidget): boolean {\r\n return !(a.x + a.w <= b.x || b.x + b.w <= a.x || a.y + a.h <= b.y || b.y + b.h <= a.y);\r\n }\r\n\r\n /**\r\n * Sorts array of nodes\r\n * @param nodes array to sort\r\n * @param dir 1 for asc, -1 for desc (optional)\r\n * @param width width of the grid. If undefined the width will be calculated automatically (optional).\r\n **/\r\n static sort(nodes: GridStackNode[], dir?: -1 | 1, column?: number): GridStackNode[] {\r\n if (!column) {\r\n let widths = nodes.map(n => n.x + n.w);\r\n column = Math.max(...widths);\r\n }\r\n\r\n if (dir === -1)\r\n return nodes.sort((a, b) => (b.x + b.y * column)-(a.x + a.y * column));\r\n else\r\n return nodes.sort((b, a) => (b.x + b.y * column)-(a.x + a.y * column));\r\n }\r\n\r\n /**\r\n * creates a style sheet with style id under given parent\r\n * @param id will set the 'gs-style-id' attribute to that id\r\n * @param parent to insert the stylesheet as first child,\r\n * if none supplied it will be appended to the document head instead.\r\n */\r\n static createStylesheet(id: string, parent?: HTMLElement): CSSStyleSheet {\r\n let style: HTMLStyleElement = document.createElement('style');\r\n style.setAttribute('type', 'text/css');\r\n style.setAttribute('gs-style-id', id);\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n if ((style as any).styleSheet) { // TODO: only CSSImportRule have that and different beast ??\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (style as any).styleSheet.cssText = '';\r\n } else {\r\n style.appendChild(document.createTextNode('')); // WebKit hack\r\n }\r\n if (!parent) {\r\n // default to head\r\n parent = document.getElementsByTagName('head')[0];\r\n parent.appendChild(style);\r\n } else {\r\n parent.insertBefore(style, parent.firstChild);\r\n }\r\n return style.sheet as CSSStyleSheet;\r\n }\r\n\r\n /** removed the given stylesheet id */\r\n static removeStylesheet(id: string): void {\r\n let el = document.querySelector('STYLE[gs-style-id=' + id + ']');\r\n if (!el || !el.parentNode) return;\r\n el.parentNode.removeChild(el);\r\n }\r\n\r\n /** inserts a CSS rule */\r\n static addCSSRule(sheet: CSSStyleSheet, selector: string, rules: string): void {\r\n if (typeof sheet.addRule === 'function') {\r\n sheet.addRule(selector, rules);\r\n } else if (typeof sheet.insertRule === 'function') {\r\n sheet.insertRule(`${selector}{${rules}}`);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static toBool(v: unknown): boolean {\r\n if (typeof v === 'boolean') {\r\n return v;\r\n }\r\n if (typeof v === 'string') {\r\n v = v.toLowerCase();\r\n return !(v === '' || v === 'no' || v === 'false' || v === '0');\r\n }\r\n return Boolean(v);\r\n }\r\n\r\n static toNumber(value: null | string): number {\r\n return (value === null || value.length === 0) ? undefined : Number(value);\r\n }\r\n\r\n static parseHeight(val: numberOrString): HeightData {\r\n let h: number;\r\n let unit = 'px';\r\n if (typeof val === 'string') {\r\n let match = val.match(/^(-[0-9]+\\.[0-9]+|[0-9]*\\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%)?$/);\r\n if (!match) {\r\n throw new Error('Invalid height');\r\n }\r\n unit = match[2] || 'px';\r\n h = parseFloat(match[1]);\r\n } else {\r\n h = val;\r\n }\r\n return { h, unit };\r\n }\r\n\r\n /** copies unset fields in target to use the given default sources values */\r\n // eslint-disable-next-line\r\n static defaults(target, ...sources): {} {\r\n\r\n sources.forEach(source => {\r\n for (const key in source) {\r\n if (!source.hasOwnProperty(key)) { return; }\r\n if (target[key] === null || target[key] === undefined) {\r\n target[key] = source[key];\r\n } else if (typeof source[key] === 'object' && typeof target[key] === 'object') {\r\n // property is an object, recursively add it's field over... #1373\r\n this.defaults(target[key], source[key]);\r\n }\r\n }\r\n });\r\n\r\n return target;\r\n }\r\n\r\n /** given 2 objects return true if they have the same values. Checks for Object {} having same fields and values (just 1 level down) */\r\n static same(a: unknown, b: unknown): boolean {\r\n if (typeof a !== 'object') { return a == b; }\r\n if (typeof a !== typeof b) { return false; }\r\n // else we have object, check just 1 level deep for being same things...\r\n if (Object.keys(a).length !== Object.keys(b).length) { return false; }\r\n for (const key in a) {\r\n if (a[key] !== b[key]) { return false; }\r\n }\r\n return true;\r\n }\r\n\r\n /** makes a shallow copy of the passed json struct */\r\n // eslint-disable-next-line\r\n static clone(target: {}): {} {\r\n return {...target};\r\n }\r\n\r\n /** return the closest parent matching the given class */\r\n static closestByClass(el: HTMLElement, name: string): HTMLElement {\r\n el = el.parentElement;\r\n if (!el) return null;\r\n if (el.classList.contains(name)) return el;\r\n return Utils.closestByClass(el, name);\r\n }\r\n\r\n /** delay calling the given function by certain amount of time */\r\n static throttle(callback: () => void, delay: number): () => void {\r\n let isWaiting = false;\r\n\r\n return (...args) => {\r\n if (!isWaiting) {\r\n callback.apply(this, args);\r\n isWaiting = true;\r\n setTimeout(() => isWaiting = false, delay);\r\n }\r\n }\r\n }\r\n\r\n static removePositioningStyles(el: HTMLElement): void {\r\n let style = el.style;\r\n if (style.position) {\r\n style.removeProperty('position');\r\n }\r\n if (style.left) {\r\n style.removeProperty('left');\r\n }\r\n if (style.top) {\r\n style.removeProperty('top');\r\n }\r\n if (style.width) {\r\n style.removeProperty('width');\r\n }\r\n if (style.height) {\r\n style.removeProperty('height');\r\n }\r\n }\r\n\r\n /** @internal */\r\n static getScrollParent(el: HTMLElement): HTMLElement {\r\n let returnEl;\r\n if (el === null) {\r\n returnEl = null;\r\n } else if (el.scrollHeight > el.clientHeight) {\r\n returnEl = el;\r\n } else {\r\n returnEl = this.getScrollParent(el.parentElement);\r\n }\r\n return returnEl;\r\n }\r\n\r\n /** @internal */\r\n static updateScrollPosition(el: HTMLElement, position: {top: number}, distance: number): void {\r\n // is widget in view?\r\n let rect = el.getBoundingClientRect();\r\n let innerHeightOrClientHeight = (window.innerHeight || document.documentElement.clientHeight);\r\n if (rect.top < 0 ||\r\n rect.bottom > innerHeightOrClientHeight\r\n ) {\r\n // set scrollTop of first parent that scrolls\r\n // if parent is larger than el, set as low as possible\r\n // to get entire widget on screen\r\n let offsetDiffDown = rect.bottom - innerHeightOrClientHeight;\r\n let offsetDiffUp = rect.top;\r\n let scrollEl = this.getScrollParent(el);\r\n if (scrollEl !== null) {\r\n let prevScroll = scrollEl.scrollTop;\r\n if (rect.top < 0 && distance < 0) {\r\n // moving up\r\n if (el.offsetHeight > innerHeightOrClientHeight) {\r\n scrollEl.scrollTop += distance;\r\n } else {\r\n scrollEl.scrollTop += Math.abs(offsetDiffUp) > Math.abs(distance) ? distance : offsetDiffUp;\r\n }\r\n } else if (distance > 0) {\r\n // moving down\r\n if (el.offsetHeight > innerHeightOrClientHeight) {\r\n scrollEl.scrollTop += distance;\r\n } else {\r\n scrollEl.scrollTop += offsetDiffDown > distance ? distance : offsetDiffDown;\r\n }\r\n }\r\n // move widget y by amount scrolled\r\n position.top += scrollEl.scrollTop - prevScroll;\r\n }\r\n }\r\n }\r\n}\r\n\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tif(__webpack_module_cache__[moduleId]) {\n\t\treturn __webpack_module_cache__[moduleId].exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// module exports must be returned from runtime so entry inlining is disabled\n// startup\n// Load entry module and return exports\nreturn __webpack_require__(117);\n"],"sourceRoot":""}