@ninebone/datagrid 0.1.3 โ 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/dist/css/nine-table.css +78 -2
- package/dist/nine-table.js +748 -494
- package/dist/nine-table.js.map +1 -1
- package/dist/nine-table.umd.js +60 -23
- package/dist/nine-table.umd.js.map +1 -1
- package/package.json +4 -9
package/dist/nine-table.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nine-table.js","names":["traceOrigin","trace","GROUP_IDX","GROUP_IDX","start","end","mid","target","elementDebounceState","el","state","pointerEvent","pointerFn","debounceTime","dblClickEvent","dblClickFn","_text","stripHtml","tmp","html","canvas","context","_font","w","h","v","cleanText","metrics","ascent","descent","trace$1","trace","NINE_TABLE","ngRow","#parent","parent","#newrow","ngData","#host","host","#initialize","item","validRecords","#getValidRecords","at","targetRecord","colnm","idx","rowData","rowIndex","colIndex","value","#conv","fields","#defaultHeight","templateElements","#getDefaultMeta","loadData","dataSource","#invalidate","#nextId","rowid","jsonArray","arr","o","json","record","#json2Array","processedArr","#defaultInsert","row","updateState","targetIndex","#getIndexFromRow","arrIndex","records","b","a","targetId","index","COL_IDX","rowState","isSingle","targetArr","result","i","ngDataManager","ds","rowIdx","nRow","rowidx","#init","#fields","f","found","fieldName","fName","#adjust","map","name","type","rawTables","tbl","fieldType","attr","expr","lastIndex","targetField","NineTableSheets","NineTableSheetsFooter","#render","isMultiSelect","tabItem","#switchSheet","updateSplitters","sheets","s","activeSheets","sheet","currentIdx","targetSplitter","tabBar","body","tabItems","sheetElements","isActive","clickedTab","activeTabs","targetSheet","tabsHtml","table","SheetTabItem","Toolbar","#bindEvents","#customContainer","#syncStateFromHost","isSimple","showToolbar","showMenu","caption","titleEl","link","currentCaption","menuBtn","element","text","NineTableHScrollBar","#owner","initWhenReady","#elements","#observeResize","#resizeObserver","#dragging","track","thumb","bodyWidth","tableWidth","needsHScroll","trackWidth","thumbWidth","currentLeft","maxScrollLeft","l","maxThumbLeft","trackBound","targetX","x","delayScroll","#interval1","#interval2","thumbLeft","#thumbMoveTo","pos","currentThumbLeft","clearTimer","evt","e","trackRect","onMouseMove","moveEvent","onMouseUp","NineTableVScrollBar","#sheet","viewRecords","totalCount","scrollHolder","rawContentHeight","MAX_BROWSER_HEIGHT","useScaling","scaleFactor","contentHeight","#getScaleInfo","fixedHeight","bodyHeight","viewHeight","needsVScroll","trackHeight","thumbHeight","currentScrollTop","maxScrollTop","thumbTop","maxThumbTop","#startY","#startThumbTop","deltaY","targetThumbTop","ratio","rowHeight","visibleRowCount","targetRow","clickY","scrollInterval","startContinuousScroll","scrollStep","$firstTr","direction","currentRow","stopContinuousScroll","GROUP_IDX$1","GroupingManager","#groupColumns","#groupMap","groupColumns","sourceTable","$cell","$tr","#isApplying","groupId","rowIds","dataManager","Grouping","validRaw","rawRecords","groupMap","nestedTree","#buildNestedMap","flatResult","renderItems","#flattenTree","counter","isLastLevel","depth","groupKey","subMapOrRecords","mapOrArray","parentId","#collectLeafRowIds","groupRecord","resultArr","#collectLeafRecords","remainingCols","key","subRecords","subVal","r","RowManager","#initResizeObserver","bodyViewport","#measureAndCacheHeight","#renderAllContainers","#handleScroll","force","#isGrouped","#handleGroupedScroll","scrollTop","rawTotalVirtualHeight","totalVirtualHeight","actualScrollTop","maxStartIndex","clampedScrollTop","startIndex","firstTr","#element","currentStartIndex","$tbody","dataIndex","#bindRowData","allRenderItems","totalVirtualCount","bodyContent","templateLength","getItemHeight","dataRowsHeight","groupHeightsTotal","itemHeights","viewportClientHeight","accumulatedHeight","offsetY","visibleRowsCount","dynamicBuffer","targetStart","targetEnd","renderedItems","container","selector","trs","itemIndex","chunkTrs","virtualIndex","isTrGroup","tr","subIdx","#bindGroupRowData","subRowIndex","matrixRow","indices","allRecords","childrenRecords","customComp","$el","#containerTemplates","tableEl","tbody","templateTrs","#sheetHeight","#isProgrammaticScroll","dataRow","targetScrollTop","rawTargetScrollTop","onRendered","#updateRowCount","visibleRows","#BUFFER_ROW_COUNT","groupDepth","#cachedRowCount","#renderRows","#syncRowHeights","targetFixedType","clonedTr","targetTbody","fragment","tmpl","leftTable","bodyTable","rightTable","leftRows","bodyRows","rightRows","maxRows","heights","maxHeight","entry","entries","height","TableCompiler","$table","$srcTable","#syncColAttributes","fixed","$col","cols","grid","rowSpan","colSpan","c","CellSelection","#initEvents","sameGroupTrs","t","$td","col","r1","startRow","endRow","r2","c1","startCol","endCol","c2","containers","expanded","loopCount","#getMatrixRow","cell","cellEndRow","cellEndCol","nsR","neR","nsC","neC","sanitize","val","#range","mainZone","lastMatrixRow","lastCol","targetCell","allCells","rect","targetTr","CellNavigation","#currentCell","#currentTr","#isCellLeftVisible","#isCellRightVisible","isVisible","#isCellBelowVisible","#isCellAboveVisible","scrollTopIndex","#getVisibleRowCount","currentCell","#findCell","nextCell","#getPreviousCell","#getNextCell","#getUpCell","#getDownCell","#moveCellH","#moveCellV","nextCol","cellCol","cellRect","viewportRect","theadHeight","bodyViewport2","viewportHeight","RESIZE_OFFSET","ColResizer","#panel","#tooltip","#onPointerMove","#onPointerDown","#onDblClick","containerType","firstColgroup","totalWidth","colWidths","colIdx","tables","targetCols","globalColIndex","firstContainer","resolvedContainerType","width","sourceCol","headerPart","offsetX","isLeftEdge","isRightEdge","prevCell","#targetCell","#targetContainerType","#getContainerType","baseColIndex","#targetColIndex","#checkIsAutoFit","#nextColIndex","nextColEl","#nextColStartWidth","targetRect","sheetRect","#startCellWidth","#startLeft","attrW","#startColWidth","#startX","#updatePositions","#onDragMove","#onDragEnd","diff","clientX","isAutoFit","maxDiff","minDiff","currentColWidth","realCellWidth","maxCellWidth","currentCellWidth","sizeBadge","finalWidth","newColWidth","newNextWidth","tbodyCell","extraPadding","fieldIdx","font","headerText","maxTextWidth","size","calculatedWidth","ColResizerPanel","#renderer","ColMover","#grip","#indi","root","y","nested","headerCells","hasStrictChildren","isValidGroup","parentGroupRange","subCell","subStart","subSpan","subEnd","isRealGroup","groupRange","#getColGroupRange","origTable","minLeft","maxRight","minTop","maxBottom","targetCells","cCol","cEnd","isGroup","computedStyle","groupWidth","groupHeight","headerContent","clonedCell","style","#checkIsMovable","startX","startY","cancelTimer","#timer","onPointerMovePending","#startDrag","#isDragging","preview","#createGroupHeaderPreview","#sourceCell","#sourceColIndex","#shiftX","bounds","relativeTop","fullHeight","#updateGripPosition","#onPointerUp","#getDeepElementFromPoint","targetColIndex","colMinLeft","colMaxRight","cRect","midX","calculatedTargetCol","indicatorLeft","sourceGroup","movingSpan","sourceRowStart","sourceRowEnd","targetRowStart","targetRowEnd","isRowSpanCompatible","isOutOfBoundsOfParent","pStart","pEnd","isDroppingInsideOtherGroup","spannedCells","sCell","sRowStart","sRowEnd","sStart","sEnd","moveEndCol","isSelfGroup","left","colgroup","targetCol","toColIndex","spanCount","isInRange","fromColIndex","targetViewportCol","fixedType","group","cells","targetRowCell","ColFixManager","baseCol","fixedAttr","targetBoundaryCol","theadTrs","cellBoundaryFound","cEndCol","action","fixType","cIdx","minBaseCol","maxEndCol","rSpan","rIdx","isBroken","isColFixed","NineTableFilterPanel","#closeHandler","#nineTable","#view","#onInput","#onSelectAll","#onOk","#button","filterBtn","panelWidth","top","searchBox","#loadVirtualFilterItems","path","filteredRecords","activeFilters","exprEngine","bindKey","colInfo","exprKey","filterKey","activeSelectedVals","uniqueMap","rawVal","displayVal","uniqueList","valA","valB","numA","numB","selectAllChk","filterRecords","checkedRecords","chk","filterParams","selectedVals","query","data2Idx","matchedValues","isChecked","chkIdx","NineTableFilterButton","#onClick","#columns","seen","uniqueKey","isFiltered","panel","Filtering","#filters","#initFilterPanel","#filterPanel","#isFiltering","#applyFiltering","jsonFilter","oFilter","k","sheetIndex","filterRules","targetKey","allowedValues","isExpr","isPass","recordIdx","allowedSet","Sorting","#handleSort","colName","exprVal","isAsc","isDesc","existingColIndex","m","ruleData","#applySorting","#syncHeaderUI","colRule","asc","SheetView","#cachedVisibleRecords","#viewIndexes","visibleRecords","#convSingle","filterSlot","#sortingColumns","groupResult","columns","rulesWithIdx","rule","idxA","idxB","isEmptyA","isEmptyB","strA","strB","PreCompiler","#ensureColgroup","#ensureThead","#ensureSectionTbodys","#ensureRowIndicator","#normalizeColAttributes","#createColIndicator","#normalizeCollapsibleAttributes","#generateCell","#initColExpanders","#initFilterButtons","#applyInitialCellWidths","thead","firstRow","cnt","td","#numToExcelCol","background","num","headTbody","footTbody","colCount","sum","containerWidth","defaultWidth","widthVal","targetAttributes","autoIdCounter","$tbl","tagName","$datalist","$option","uniqueFuncName","cellType","originalContent","hostFilter","tableFilter","finalFiltering","currentWidth","expandBtn","targetWidth","rows","section","indicatorCell","startColIdx","targetIdx","SheetAPI","colEl","resolve","$trs","matrixRows","n","callback","$sheetBody","tfootHeight","viewportTop","viewportBottom","trRect","isAbove","isBelow","toRowid","NineTableSheet","#rowManager","#api","#bindApiMethods","#template","#index","#colResizer","#filtering","#grouping","#colMover","#colFix","#cellSelection","#cellNavigation","#source","attrTrue","sourceTableTrue","#isSimple","#renderSplitContainers","#updateContainerWidths","#adjustOverlay","$thead","$overlay","#autoFit","enable","totalOriginalWidth","colList","collapsedTotalWidth","availableWidth","allocatedTotal","calculatedCols","exactWidth","baseWidth","remainderPixels","uncollapsedCols","activeParent","$parent","minRows","#syncHeaderAndFooterHeights","#initRowHoverEvent","prefix","firstTable","#createSplitTable","offsetHeight","sheetBottom","tbodyBottom","bodyContainer","scrollLeft","#sorting","leftHeaderRows","bodyHeaderRows","rightHeaderRows","#applyMaxHeights","leftFooterRows","bodyFooterRows","rightFooterRows","activeRowIndex","relatedTarget","api","args","LayoutManager","owner","#initEvent","sheetCount","sheetsHtml","className","sheetId","cssImports","$sheet","#isAutoHeight","#applyAutoHeight","lastHeight","currentHeight","basicHeight","ExprEngine","match","trimmedExpr","compiledExpr","evalFn","#exprCache","rowItem","DataAPI","providerObj","methods","fn","NineTableAPI","ns","#getActiveSheet","targetMethod","prop","NineTable","#shadowRoot","#dataManager","#dataApi","#sheetApi","#templateCnt","#bindDynamicSetters","#layoutManager","#dispatchLoad","checkCount","checkTimer","loadSheetCnt","idOrIndex","extractedMethodNames","matches","internalValue","methodName","newValue","BasicCellElement","exprCache","CellElement","#updateRowState","#cell","#tr","#attr","curRow","renderer","rawRecord","defaultValue","\"display\"","data","cleanExpr","childRecords","funcName","field","acc","EditableCellElement","CellInputText","#target","#maxbyte","maxByteNum","event","CellInputNumber","#onKeyDown","#validate","#max","#min","#scale","str","selectionStart","scale","validKey","isNumKey","CellInputColor","#btn","#dataSource","datalistId","datalist","option","#rendererColor","#isValidColor","g","CellInputDate","#type","formattedVal","d","isValid","#isValidDate","year","month","day","isleap","hour","min","week","CellCheckbox","#label","#trueText","#falseText","#isRadio","trueValue","childHtml","displayText","#enable","#readonly","#visible","CellRadio","#rendererRadio","matchIndex","#radioList","codeVal","#keyName","nameVal","#valueName","label","input","span","CellComboPanel","#grd","grd","itemsAttr","fieldKeys","valueName","activeColumnCount","formattedData","keyName","multi","selectedKeys","#separator","kIndex","chkIndex","#selectRow","currentValue","$btn","btnRect","isDropDown","#isOpen","separator","#isPanelBelow","#calculatePanelHeight","#calculatePanelLeft","#initData","#checkRow","#returnRow","#onKeydown_input","#onKeydown","CellCombo","#targetBtn","#getDisplayText","#validateInput","#multi","keys","#multiSeparator","list","#togglePanel","CellRenderer","CellButton","#cellButtonClick","customEvent","rawValue","CellRowIndicator","#mainTarget","#subTarget","#statusTarget","displayNum","formattedNum","splitIndex","prefixPart","suffixPart","isSorted","isFitered","ColExpand","singleWidth","currentW","splitWidth","ContextMenu","#tableHost","targetTable","#getTargetSheet","items","activeTableId","activeTable","containerElement","targetTableAttr","rootUl","parsedList","#traverseUl","ulEl","child","spanEl","subUl","useDefault","rawItems","customItems","#parseCustomMenuItems","fixManager","#getFixManager","currentFixState","isFixable","isHeaderCell","fixMenuItem","cleanedItems","targetParent","menuItems","#buildMenuItems","#handleMenuClick","#syncMenuStates","isFiltering","autoFit","showTitle","menuId","#onContextMenu","MenuPanel","#onCallback","#appendItems","#bindClickEvents","cellRightX","wrapper","calculatedLeft","panelHeight","calculatedTop","li","condition","sep","parentUl"],"sources":["../src/core/protype.js","../src/external/NoPeer.js","../src/core/constants.js","../src/data/ngData.js","../src/data/ngDataManager.js","../src/data/Fields.js","../src/layout/nine-table-sheets.js","../src/layout/nine-table-sheets-footer.js","../src/layout/nine-table-toolbar.js","../src/layout/nine-table-hscrollbar.js","../src/layout/nine-table-vscrollbar.js","../src/data/Grouping.js","../src/layout/core/RowManager.js","../src/layout/core/TableCompiler.js","../src/cell-manager/CellSelection.js","../src/cell-manager/CellNavigation.js","../src/col/ColResizer.js","../src/col/ColMover.js","../src/col/ColFixManager.js","../src/data/Filtering.js","../src/data/Sorting.js","../src/data/SheetView.js","../src/layout/core/PreCompiler.js","../src/api/SheetAPI.js","../src/layout/nine-table-sheet.js","../src/layout/core/LayoutManager.js","../src/core/ExprEngine.js","../src/api/DataAPI.js","../src/api/NineTableAPI.js","../src/core/nine-table.js","../src/cell/core/BasicCellElement.js","../src/cell/core/CellElement.js","../src/cell/cell-input-text.js","../src/cell/cell-input-number.js","../src/cell/cell-input-color.js","../src/cell/cell-input-date.js","../src/cell/cell-checkbox.js","../src/cell/cell-radio.js","../src/cell/cell-combo-panel.js","../src/cell/cell-combo.js","../src/cell/cell-renderer.js","../src/cell/cell-button.js","../src/cell/cell-row-indicator.js","../src/col/col-expand.js","../src/menu/nine-table-menu.js","../src/menu/nine-table-menu-panel.js"],"sourcesContent":["Array.prototype.nineBinarySearch = function(target) {\n //this.sort((a, b) => { return a > b ? 1 : -1; });\n\n let start = 0;\n let end = this.length - 1;\n let mid;\n\n while (start <= end) {\n mid = parseInt((start + end) / 2);\n\n if (target === this[mid]) {\n return mid;\n } else {\n if (target < this[mid]) {\n end = mid - 1;\n } else {\n start = mid + 1;\n }\n }\n }\n\n return -1;\n};\n\nconst elementDebounceState = new WeakMap();\n\nHTMLElement.prototype.addDebounseEventListener = function(\n dblClickEvent,\n dblClickFn,\n pointerEvent,\n pointerFn,\n debounceTime = 500\n) {\n const el = this;\n\n if (!elementDebounceState.has(el)) {\n elementDebounceState.set(el, { timer: null, cancelFn: null });\n }\n const state = elementDebounceState.get(el);\n\n el.addEventListener(pointerEvent, (e) => {\n e.actualTarget = e.target;\n\n if (state.timer) {\n clearTimeout(state.timer);\n state.timer = null;\n }\n\n // ๐ก 500ms ๋์ ๋๊ธฐํ ๋ค์์ผ ์ค์ pointerFn์ด ์คํ๋จ\n state.timer = setTimeout(() => {\n state.timer = null;\n state.cancelFn = pointerFn.call(el, e);\n }, debounceTime);\n });\n\n el.addEventListener(dblClickEvent, (e) => {\n if (state.timer) {\n clearTimeout(state.timer);\n state.timer = null;\n }\n\n if (state.cancelFn) {\n state.cancelFn();\n state.cancelFn = null;\n }\n\n dblClickFn.call(el, e);\n });\n};\n\n\nnine.measureTextSize = (_text, _font = '12px sans-serif') => {\n if (typeof _text === 'number') _text = _text + \"\";\n if (!_text) return { width: null, height: null };\n\n const stripHtml = (html) => {\n const tmp = document.createElement(\"DIV\");\n tmp.innerHTML = html;\n return tmp.textContent || tmp.innerText || \"\";\n };\n\n _text = _text.replaceAll(\"\\n\", \"<br>\");\n\n let canvas = document.body.querySelector('canvas#_nine_measure_canvas_');\n if (!canvas) {\n canvas = document.createElement('canvas');\n canvas.id = '_nine_measure_canvas_';\n canvas.style.cssText = 'position: absolute; visibility: hidden; pointer-events: none; left: -9999px;';\n document.body.appendChild(canvas);\n }\n\n const context = canvas.getContext('2d');\n context.font = _font;\n\n let w = 0;\n let h = 0;\n\n for (let v of _text.split(\"<br>\")) {\n const cleanText = stripHtml(v);\n const metrics = context.measureText(cleanText);\n\n w = Math.max(w, metrics.width);\n\n const ascent = metrics.fontBoundingBoxAscent || 10;\n const descent = metrics.fontBoundingBoxDescent || 3;\n h += ascent + descent;\n }\n\n return {\n width: w,\n height: h\n };\n};","import { trace as traceOrigin } from '@ninebone/util';\n\nexport class Trace extends traceOrigin.constructor {\n constructor() {\n super();\n this.init(\"nine-table\", \"green\");\n }\n}\n\nexport const trace = new Trace();\n","export const NINE_TABLE = {\n META: {\n INDEX: {\n ROWID: 0,\n ROW_STATE: 1,\n FILTER: 2,\n GROUP: 3,\n // SELECT: 2,\n // EXPAND: 3\n }\n },\n ROW_STATE: {\n EMPTY: 0,\n NORMAL: 1,\n INSERT: 2,\n UPDATE: 3,\n DELETE: 9\n },\n EVENT: {\n LOAD: \"load\",\n ROW_ADDED: \"row-added\",\n ROW_REMOVED: \"row-removed\",\n CELL_BUTTON_CLICK: \"cell-button-click\",\n },\n};","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\n\nexport class ngRow {\n\t#parent;\n\t#newrow = -1;\n\n\tconstructor(parent) {\n\t\tthis.#parent = parent;\n\t}\n\n\tget at() {\n\t\treturn this.#newrow;\n\t}\n\tset at(v) {\n\t\tthis.#newrow = parseInt(v, 10);\n\t}\n\n\tcount = () => this.#parent.rawRecords.length;\n}\n\nexport class ngData {\n\t#host;\n\t#parent;\n\t#nextId = 0;\n\t#defaultHeight = [];\n\n\tstatic META_INDEX = {\n\t\tFILTER: 0,\n\t\t// GROUP: 1,\n\t\t// SELECT: 2,\n\t\t// EXPAND: 3\n\t};\n\n\tstatic ROW_STATE = {\n\t\tEMPTY: 'EMPTY',\n\t\tNORMAL: 'NORMAL',\n\t\tINSERT: 'INSERT',\n\t\tUPDATE: 'UPDATE',\n\t\tDELETE: 'DELETE'\n\t};\n\n\tconstructor(host, parent) {\n\t\tthis.#host = host;\n\t\tthis.#parent = parent;\n\t\tthis.#initialize();\n\t}\n\n\n\t#getValidRecords = () => {\n\t\tconst rawRecords = this.#parent.rawRecords || [];\n\t\treturn rawRecords.filter(item => item.m._[NINE_TABLE.META.INDEX.ROW_STATE] !== NINE_TABLE.ROW_STATE.DELETE);\n\t};\n\n\tget count() {\n\t\treturn this.length;\n\t}\n\n\tcount = () => {\n\t\treturn this.length;\n\t};\n\n\tgetArray = (at, colnm) => {\n\t\tconst validRecords = this.#getValidRecords();\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn validRecords; // ๋ณํ ์์ด ๋ฐฐ์ด ๊ทธ๋๋ก ๋ฐํ (๋ ๋๋ง ์ต์ ํ)\n\t\t}\n\n\t\tif (at < 0 || at >= validRecords.length) return null;\n\n\t\tconst targetRecord = validRecords[at];\n\n\t\tif (colnm != null) {\n\t\t\tconst fields = this.getHostFields();\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn targetRecord;\n\t};\n\n\tsetArray = (rowIndex, colIndex, value) => {\n\t\tconst validRecords = this.#getValidRecords();\n\t\tconst rowData = validRecords[rowIndex];\n\n\t\tconst oldValue = rowData.v[colIndex];\n\t\tif (oldValue !== value && rowData.__ng.rowState !== ngData.ROW_STATE.INSERT) {\n\t\t\trowData.__ng.rowState = ngData.ROW_STATE.UPDATE;\n\t\t}\n\n\t\trowData.v[colIndex] = value;\n\t};\n\n\n\tget = (at, colnm) => {\n\t\tconst validRecords = this.#getValidRecords();\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn this.#conv(validRecords);\n\t\t}\n\n\t\tif (at < 0 || at >= validRecords.length) return null;\n\n\t\tconst targetRecord = validRecords[at];\n\t\tconst fields = this.getHostFields();\n\n\t\tif (colnm != null) {\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn this.#conv(targetRecord);\n\t};\n\n\tgetAll = () => {\n\t\treturn this.#parent.rawRecords || [];\n\t};\n\n\tgetHostFields = () => {\n\t\treturn typeof this.#host.fields?.get === 'function' ? this.#host.fields.get() : [];\n\t};\n\n\t#initialize = () => {\n\t\tthis.#defaultHeight = [];\n\t\tconst templateElements = this.#host.template || [];\n\t\tArray.from(templateElements).forEach(el => {\n\t\t\tthis.#defaultHeight.push(el.getBoundingClientRect?.().height || 24);\n\t\t});\n\n\t\t(this.#parent.rawRecords || []).forEach(v => {\n\t\t\tif (!v.__ng) v.__ng = this.#getDefaultMeta();\n\t\t\tv.__ng.height = this.#defaultHeight.slice();\n\t\t});\n\t};\n\n\tget source() {\n\t\treturn this.#conv(this.#parent.rawRecords);\n\t}\n\tset source(v) {\n\t\tthis.set(v);\n\t}\n\n\t#invalidate = () => {\n\t\tthis.#host.shadowRoot.querySelectorAll(\"nine-table-sheet\").forEach($el => {\n\t\t\t$el.invalidate();\n\t\t});\n\n\t\tthis.#host.shadowRoot.querySelector(\"nine-table-sheets-footer\")?.refresh();\n\t};\n\n\tset = (dataSource) => {\n\n\t\tconst loadData = () => {\n\t\t\tthis.#host.loading = true;\n\t\t\tsetTimeout(() => {\n\t\t\t\ttry {\n\t\t\t\t\tthis.clear();\n\t\t\t\t\tthis.add(dataSource, false);\n\t\t\t\t\tthis.#invalidate();\n\t\t\t\t} finally {\n\t\t\t\t\tthis.#host.loading = false;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (this.#host.loaded) {\n\t\t\tloadData();\n\t\t}\n\t\telse {\n\t\t\tthis.#host.addEventListener(NINE_TABLE.EVENT.LOAD, e => {\n\t\t\t\tloadData();\n\t\t\t}, { once: true });\n\t\t}\n\t};\n\n\tget nextId() {\n\t\treturn this.#nextId++;\n\t}\n\n\tget length() {\n\t\treturn this.#getValidRecords().length;\n\t}\n\n\tget count() {\n\t\treturn this.length;\n\t}\n\n\tgetRowCount() {\n\t\treturn this.length;\n\t}\n\n\t#getDefaultMeta = (rowid = 0) => {\n\t\treturn {\n\t\t\trowState: ngData.ROW_STATE.EMPTY,\n\t\t\tdeleted: false,\n\t\t\tfiltered: false,\n\t\t\theight: this.#defaultHeight.slice(),\n\t\t\to: {},\n\t\t\tc: {},\n\t\t\t__: [0, 0, 0, 0, ngData.ROW_STATE.EMPTY, false, false, true, false, true, true, false, this.#defaultHeight.slice(), -1, {}, {}],\n\t\t\t_: [rowid, NINE_TABLE.ROW_STATE.EMPTY, [], []],\n\t\t};\n\t};\n\n\treset = () => {\n\t\tthis.#parent.rawRecords = [];\n\t\tthis.#invalidate();\n\t};\n\n\tclear = () => {\n\t\tthis.#parent.rawRecords = [];\n\t\tif (this.#parent.viewRecords?.reset) {\n\t\t\tthis.#parent.viewRecords.reset();\n\t\t}\n\n\t\tthis.#nextId = 0;\n\n\t\tthis.#invalidate();\n\t};\n\n\t#json2Array = (jsonArray) => {\n\t\tif (!Array.isArray(jsonArray)) jsonArray = [jsonArray];\n\n\t\tconst fields = this.getHostFields().length > 0 ? this.getHostFields() : Object.keys(jsonArray[0] || {});\n\t\tconst arr = [];\n\n\t\tjsonArray.forEach(json => {\n\t\t\tconst o = { v: [] };\n\t\t\tfields.forEach(colnm => {\n\t\t\t\to.v.push(json[colnm] !== undefined && json[colnm] !== null ? json[colnm] : \"\");\n\t\t\t});\n\t\t\tarr.push(o);\n\t\t});\n\n\t\treturn arr;\n\t};\n\n\t#defaultInsert = (arr) => {\n\t\tif (!Array.isArray(arr)) arr = [arr];\n\t\tarr.forEach(o => {\n\t\t\tconst rowid = this.nextId;\n\n\t\t\to.m = this.#getDefaultMeta(rowid);\n\t\t\to.__ng = o.m;\n\t\t\to.__ng.rowid = rowid;\n\t\t\t//o.__ng.rowState = ngData.ROW_STATE.INSERT;\n\n\t\t\to.m._[NINE_TABLE.META.INDEX.ROWID] = rowid;\n\t\t\to.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.EMPTY;\n\t\t});\n\t\treturn arr;\n\t};\n\n\t#getIndexFromRow = (rowid) => {\n\t\tconst index = this.#parent.rawRecords.findIndex(record => {\n\t\t\tif (!record || !record.m || !record.m._) return false;\n\t\t\treturn record.m._[NINE_TABLE.META.INDEX.ROWID] === rowid;\n\t\t});\n\n\t\treturn index;\n\t}\n\n\tadd = (dataSource, updateState = true) => {\n\t\tif (dataSource === undefined) dataSource = {};\n\t\tconst arr = this.#json2Array(dataSource);\n\n\t\tconst processedArr = this.#defaultInsert(arr);\n\n\t\tthis.#parent.rawRecords = this.#parent.rawRecords.concat(processedArr);\n\n\t\tconst row = this.count() - 1;\n\t\tif (updateState) {\n\t\t\tarr.forEach((_, idx) => {\n\t\t\t\tconst target = this.#parent.rawRecords[this.#parent.rawRecords.length - 1 - idx];\n\t\t\t\tif (target) target.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.INSERT;\n\t\t\t});\n\t\t}\n\n\t\tthis.#invalidate();\n\n\t\tthis.#host.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.ROW_ADDED, {\n\t\t\tbubbles: true,\n\t\t\tdetail: { target: this.#host, rowid: processedArr.length > 0 ? processedArr[0].m._[NINE_TABLE.META.INDEX.ROWID] : null }\n\t\t}));\n\n\t\treturn row;\n\t};\n\n\n\tinsert = (rowid, dataSource, updateState = true) => {\n\t\t//trace.log(\"์ฐพ์ rowid:\", rowid);\n\n\t\tif (dataSource === undefined) dataSource = {};\n\t\tconst arr = this.#json2Array(dataSource);\n\t\tif (arr.length === 0) return -1;\n\n\t\tlet targetIndex = this.#getIndexFromRow(rowid);\n\t\t/**\n\t\tif (rowid !== undefined && rowid !== null) {\n\t\t\ttargetIndex = this.#parent.rawRecords.findIndex(record => {\n\t\t\t\tif (!record || !record.m || !record.m._) return false;\n\t\t\t\treturn record.m._[NINE_TABLE.META.INDEX.ROWID] === rowid;\n\t\t\t});\n\t\t} */\n\n\t\tconst processedArr = this.#defaultInsert(arr);\n\n\t\t//if (targetIndex === -1) {\n\t\t//\ttargetIndex = this.#parent.rawRecords.length;\n\t\t//}\n\n\t\tthis.#parent.rawRecords.splice(targetIndex, 0, ...processedArr);\n\n\t\tif (updateState) {\n\t\t\tprocessedArr.forEach((_, idx) => {\n\t\t\t\tconst target = this.#parent.rawRecords[targetIndex + idx];\n\n\t\t\t\tif (target && target.m && target.m._) {\n\t\t\t\t\ttarget.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.INSERT;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#invalidate();\n\n\t\tthis.#host.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.ROW_ADDED, {\n\t\t\tbubbles: true,\n\t\t\tdetail: { target: this.#host, rowid: processedArr.length > 0 ? processedArr[0].m._[NINE_TABLE.META.INDEX.ROWID] : null }\n\t\t}));\n\n\t\treturn processedArr[0].m._[NINE_TABLE.META.INDEX.ROWID]; // ์ฝ์
๋ ์ค์ ๋ฐฐ์ด ์ธ๋ฑ์ค ๋ฐํ\n\t};\n\n\tremove = (v) => {\n\t\tlet arr = [];\n\t\tif (Array.isArray(v)) {\n\t\t\tarr = at;\n\t\t//} else if (typeof at === \"undefined\") {\n\t\t//\tarr = [this.#parent.host.row.at];\n\t\t} else {\n\t\t\tarr = [parseInt(v, 10)];\n\t\t}\n\n\t\tlet arrIndex = [];\n\t\tarr.forEach(rowid => {\n\t\t\tarrIndex.push(this.#getIndexFromRow(rowid));\n\t\t});\n\n\t\tconst records = this.#parent.rawRecords;//this.#getValidRecords();\n\n\t\tarrIndex.sort((a, b) => b - a).forEach(index => {\n\t\t\t//if (validRecords[index]) {\n\t\t\t\tconst targetId = records[index].m._[NINE_TABLE.META.INDEX.ROWID];\n\n\t\t\t\tif (records[index].m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.INSERT) {\n\t\t\t\t\tthis.#parent.rawRecords = this.#parent.rawRecords.filter(item => item.m._[NINE_TABLE.META.INDEX.ROWID] !== targetId);\n\t\t\t\t} else {\n\t\t\t\t\tthis.#parent.rawRecords.forEach(item => {\n\t\t\t\t\t\tif (item.m._[NINE_TABLE.META.INDEX.ROWID] === targetId) {\n\t\t\t\t\t\t\titem.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.DELETE;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t//}\n\t\t});\n\n\t\tthis.#invalidate();\n\n\t\tthis.#host.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.ROW_REMOVED, {\n\t\t\tbubbles: true,\n\t\t\tdetail: { target: this.#host, rowid: arr.length > 0 ? arr[0] : null }\n\t\t}));\n\t};\n\n\tsetValue = (rowid, colnm, value, updateState = true) => {\n\n\t\trowid = parseInt(rowid, 10);\n\t\tconst fields = this.getHostFields();\n\t\tconst COL_IDX = fields.indexOf(colnm);\n\t\tif (COL_IDX < 0) return;\n\n\t\tconst index = this.#getIndexFromRow(rowid);\n\n\t\tconst records = this.#parent.rawRecords;\n\t\tconst rowData = records[index];\n\t\tif (!rowData) return;\n\n\t\tconst oldValue = rowData.v[COL_IDX];\n\t\tif (oldValue !== value && updateState && rowData.m._[NINE_TABLE.META.INDEX.ROW_STATE] !== NINE_TABLE.ROW_STATE.INSERT) {\n\t\t\trowData.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.UPDATE;\n\t\t}\n\n\t\trowData.v[COL_IDX] = value;\n\t};\n\n\tgetChangedData = (rowState) => {\n\n\t\tconst records = this.#parent.rawRecords;\n\n\t\tif (rowState) {\n\t\t\treturn this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === rowState; } ) );\n\t\t}\n\t\telse {\n\t\t\treturn {\n\t\t\t\tC: this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.INSERT; } ) ),\n\t\t\t\tU: this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.UPDATE; } ) ),\n\t\t\t\tD: this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.DELETE; } ) ),\n\t\t\t};\n\t\t}\n\t};\n\n\t#conv = (arr) => {\n\t\tif (!arr) return arr;\n\n\t\tconst isSingle = !Array.isArray(arr);\n\t\tconst targetArr = isSingle ? [arr] : arr;\n\t\tconst fields = this.getHostFields();\n\n\t\tconst result = targetArr.filter(o => !o.__ng?.deleted).map(o => {\n\t\t\tconst t = {};\n\t\t\tfields.forEach((colnm, i) => {\n\t\t\t\tt[colnm] = o.v ? o.v[i] : o[colnm];\n\t\t\t});\n\t\t\tt.__ng = o.__ng;\n\t\t\treturn t;\n\t\t});\n\n\t\treturn isSingle ? result[0] : result;\n\t};\n}\n","import { ngRow, ngData } from \"./ngData.js\";\n\nexport class ngDataManager {\n\t#host;\n\n\tconstructor(host) {\n\t\tthis.#host = host;\n\n\t\tthis.row = new ngRow(this);\n\t\tthis.data = new ngData(this.#host, this);\n\n\t\tthis.rawRecords = [];\n\t\tthis.viewRecords = [];\n\t\tthis.delRecords = [];\n\t\tthis.pageCnt = 25;\n\n\t\tthis.viewRecords.reset = () => {\n\t\t\tif (this.#host.view?.redraw) this.#host.view.redraw();\n\t\t};\n\n\t\tthis.setDataSource = (ds) => {\n\t\t\tif (this.data) this.data.reset();\n\n\t\t\tthis.rawRecords = [];\n\t\t\tthis.viewRecords = [];\n\t\t\tthis.delRecords = [];\n\n\t\t\tthis.data.set(ds || []);\n\t\t};\n\n\t\tthis.getRowState = (nRow) => {\n\t\t\tconst rowIdx = parseInt(nRow, 10);\n\t\t\tif (rowIdx >= this.data.count()) return;\n\t\t\treturn this.data.getValidData()[rowIdx]?.__ng?.rowState;\n\t\t};\n\n\t\tthis.getRowPosition = () => this.row.at;\n\t\tthis.setRowPosition = (nRow) => { this.row.at = nRow; };\n\n\t\tthis.getColumn = (rowidx, colnm) => this.data.get(rowidx, colnm);\n\n\t\tthis.setColumn = (rowidx, colnm, v) => {\n\t\t\trowidx = parseInt(rowidx, 10);\n\t\t\tthis.data.setValue(rowidx, colnm, v);\n\t\t};\n\n\t\t// ์ด๊ธฐ ๋น ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ\n\t\tthis.setDataSource([]);\n\t}\n}","import { trace } from \"@nopeer\";\n\nexport class fields {\n\t#host;\n\t#fields = [];\n\n\tconstructor(host) {\n\t\tthis.#host = host;\n\t\tthis.#init();\n\t};\n\n\tget() {\n\t\treturn this.#fields.map(f => f.name);\n\t};\n\n\tgetFields() {\n\t\treturn this.#fields;\n\t}\n\n\tgetType(fieldName) {\n\t\tconst found = this.#fields.find(f => f.name === fieldName);\n\t\treturn found ? found.type : 'string';\n\t}\n\n\tadd = (arr, type = 'string') => {\n\t\tarr.forEach(fName => {\n\t\t\tif (!this.#fields.some(f => f.name === fName)) {\n\t\t\t\tthis.#fields.push({ name: fName, type: type });\n\t\t\t}\n\t\t});\n\t\tthis.#adjust();\n\t};\n\n\tindexOf(v) {\n\t\treturn this.#fields.findIndex(f => f.name === v);\n\t};\n\n\tincludes(v) {\n\t\treturn this.#fields.some(f => f.name === v);\n\t};\n\n\t#adjust = () => {\n\t\tconst map = new Map();\n\t\tthis.#fields.forEach(f => {\n\t\t\tmap.set(f.name, f.type);\n\t\t});\n\n\t\tthis.#fields = Array.from(map, ([name, type]) => ({ name, type }));\n\n\t\tthis.#fields = this.#fields.filter(f => f.name !== \"\" && f.name !== \"__ng\");\n\n\t\tthis.#fields.sort((a, b) => { return (a.name.length < b.name.length) ? 1 : -1; });\n\t};\n\n\t#init = () => {\n\t\tthis.#fields = [];\n\n\t\tconst rawTables = Array.from(this.#host.querySelectorAll(\"table\"));\n\n\t\tif (!rawTables || rawTables.length === 0) return;\n\n\t\tfor (const tbl of rawTables) {\n\n\t\t\ttbl.querySelectorAll('[data-bind]').forEach((el) => {\n\t\t\t\tconst fieldName = el.dataset.bind;\n\t\t\t\tconst fieldType = el.getAttribute(\"data-type\") || 'string';\n\n\t\t\t\tif (fieldName) {\n\t\t\t\t\tthis.#fields.push({ name: fieldName, type: fieldType });\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst exprAttrs = [\n\t\t\t\t\"data-expr\", \"background-color\", \"color\", \"tooltip\",\n\t\t\t\t\"visible\", \"readonly\", \"enable-button\", \"enable-check\",\n\t\t\t\t\"class-expr\", \"icon-color\", \"icon-src\"\n\t\t\t];\n\n\t\t\texprAttrs.forEach(attr => {\n\t\t\t\ttbl.querySelectorAll(`[${attr}]`).forEach((el) => {\n\t\t\t\t\tlet expr = el.getAttribute(attr);\n\t\t\t\t\tif (!expr) return;\n\n\t\t\t\t\tif (expr.indexOf(\"data.\") < 0) {\n\t\t\t\t\t\tconst lastIndex = expr.search(/[(]/g);\n\n\t\t\t\t\t\tif (lastIndex > 0) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\texpr = String(window[expr.substring(0, lastIndex).trim()]);\n\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\texpr = \"\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\texpr.split(\"data.\").forEach(v => {\n\t\t\t\t\t\tif (v.trim() != \"\") {\n\t\t\t\t\t\t\tconst lastIndex = v.search(/[^_A-Za-z0-9]/g);\n\t\t\t\t\t\t\tlet targetField = '';\n\n\t\t\t\t\t\t\tif (lastIndex >= 0) {\n\t\t\t\t\t\t\t\ttargetField = v.substring(0, lastIndex);\n\t\t\t\t\t\t\t} else if (expr.startsWith(\"data.\")) {\n\t\t\t\t\t\t\t\ttargetField = v.replace(\"data.\", \"\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (targetField) {\n\t\t\t\t\t\t\t\tthis.#fields.push({ name: targetField, type: 'string' });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tthis.#adjust();\n\t};\n};","export class NineTableSheets extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#init();\n }\n\n #init = () => {\n\n };\n\n}\n\nif (!customElements.get('nine-table-sheets')) {\n customElements.define('nine-table-sheets', NineTableSheets);\n}","export class NineTableSheetsFooter extends HTMLElement {\n #host;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#init();\n }\n\n refresh = () => {\n this.querySelector(\"#row-count\").innerHTML = this.#host.data.count().toLocaleString();\n };\n\n #init = () => {\n this.#host = this.getRootNode().host;\n\n this.#render();\n\n this.querySelector('.nine-tab-bar')?.addEventListener('click', (e) => {\n const isMultiSelect = e.ctrlKey || e.metaKey || e.shiftKey;\n const tabItem = e.target.closest('nt-sheets-tab-item');\n\n if (!tabItem) return;\n\n const index = parseInt(tabItem.dataset.index, 10);\n this.#switchSheet(index, isMultiSelect);\n });\n\n setTimeout(() => {\n this.#switchSheet(0, false);\n })\n };\n\n #switchSheet = (index, isMultiSelect = false) => {\n\n const updateSplitters = () => {\n const sheets = Array.from(this.#host.shadowRoot.querySelectorAll('nine-table-sheet'));\n const splitters = Array.from(this.#host.shadowRoot.querySelectorAll('nine-splitter'));\n\n splitters.forEach(s => s.style.setProperty('display', 'none'));\n\n const activeSheets = sheets\n .map((sheet, idx) => ({ sheet, idx }))\n .filter(({ sheet }) => sheet.classList.contains('active'));\n\n if (activeSheets.length < 2) return;\n\n for (let i = 0; i < activeSheets.length - 1; i++) {\n const currentIdx = activeSheets[i].idx;\n\n const targetSplitter = this.#host.shadowRoot.querySelector(`nine-splitter[data-split-index=\"${currentIdx}\"]`);\n if (targetSplitter) {\n targetSplitter.style.setProperty('display', '');\n }\n }\n };\n\n const tabBar = this.querySelector('.nine-tab-bar');\n const body = this.#host.shadowRoot.querySelector('nine-table-sheets-body');\n const tabItems = tabBar.querySelectorAll('nt-sheets-tab-item');\n const sheetElements = body.querySelectorAll('nine-table-sheet');\n\n if (!tabItems[index]) return;\n\n if (!isMultiSelect) {\n tabItems.forEach((tab, idx) => {\n tab.setActive(idx === index);\n });\n\n sheetElements.forEach((sheet, idx) => {\n const isActive = idx === index;\n sheet.classList.toggle('active', isActive);\n sheet.style.flex = isActive ? '1 1 100%' : '';\n });\n } else {\n const clickedTab = tabItems[index];\n const activeTabs = tabBar.querySelectorAll('nt-sheets-tab-item.active');\n\n if (clickedTab.classList.contains('active') && activeTabs.length <= 1) {\n return;\n }\n\n clickedTab.classList.toggle('active');\n const targetSheet = body.querySelector(`nine-table-sheet[data-index=\"${index}\"]`);\n if (targetSheet) {\n targetSheet.classList.toggle('active');\n if (!targetSheet.classList.contains('active')) {\n targetSheet.style.flex = '';\n }\n }\n }\n\n const activeSheets = body.querySelectorAll('nine-table-sheet.active');\n\n activeSheets?.forEach(sheet => {\n sheet.style.flex = (activeSheets.length > 1) ? '1 1 0%' : '1 1 100%';\n\n if (typeof sheet.refreshLayout === 'function') {\n sheet.refreshLayout();\n } else {\n sheet.invalidate?.();\n }\n });\n\n updateSplitters();\n };\n\n #render() {\n const rawElements = Array.from(this.#host.children);\n const rawTables = rawElements.filter(el => (el.tagName.toUpperCase() === 'TABLE'));\n\n const tabsHtml = rawTables.map((table, idx) => {\n const className = idx === 0 ? 'active' : '';\n const tabName = table.getAttribute('caption') || `Sheet ${idx + 1}`;\n\n return `<nt-sheets-tab-item class=\"${className}\" data-index=\"${idx}\">${tabName}</nt-sheets-tab-item>`;\n }).join('');\n\n this.innerHTML = `\n <div class=\"nine-tab-bar\">${tabsHtml}</div>\n <div class=\"sheets-counter\">Total : <span id=\"row-count\">0</span></div>\n `;\n };\n}\n\nexport class SheetTabItem extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n\n }\n\n setActive(isActive) {\n this.classList.toggle('active', isActive);\n }\n}\n\nif (!customElements.get('nt-sheets-tab-item')) {\n customElements.define('nt-sheets-tab-item', SheetTabItem);\n}\n\nif (!customElements.get('nine-table-sheets-footer')) {\n customElements.define('nine-table-sheets-footer', NineTableSheetsFooter);\n}","import { trace } from \"@nopeer\";\n\nexport class Toolbar extends HTMLElement {\n #host;\n #customContainer;\n\n connectedCallback() {\n this.#host = this.getRootNode().host;\n this.#render();\n this.#bindEvents();\n }\n\n #render() {\n this.innerHTML = `\n <div class=\"ng-toolbar-left\">\n <button type=\"button\" class=\"ng-toolbar-menu-btn\" title=\"Menu\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#374151\" stroke-width=\"2\">\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"></line>\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\"></line>\n </svg>\n </button>\n <span class=\"ng-toolbar-title\"></span>\n </div>\n\n <div class=\"ng-toolbar-custom\" id=\"custom-container\"></div>\n `;\n\n this.#customContainer = this.querySelector('#custom-container');\n this.#syncStateFromHost();\n }\n\n #syncStateFromHost() {\n const isSimple = this.#host.getAttribute('theme') === 'simple' || this.#host.classList.contains('simple');\n const showToolbar = this.#host.getAttribute('show-toolbar') !== 'false';\n const showMenu = this.#host.getAttribute('show-menu') !== 'false';\n const caption = this.#host.getAttribute('caption') || '';\n\n if (isSimple || !showToolbar) {\n this.setAttribute('hidden', '');\n } else {\n this.removeAttribute('hidden');\n }\n\n this.setAttribute('show-menu', showMenu ? 'true' : 'false');\n this.updateCaption(caption);\n }\n\n #bindEvents() {\n const titleEl = this.querySelector('.ng-toolbar-title');\n if (titleEl) {\n titleEl.addEventListener('dblclick', () => {\n const link = '<font color=\"green\">https://www.ninegrid.net</font>';\n const currentCaption = this.#host.getAttribute('caption') || '';\n titleEl.innerHTML = titleEl.innerHTML === link ? currentCaption : link;\n });\n }\n\n const menuBtn = this.querySelector('.ng-toolbar-menu-btn');\n if (menuBtn) {\n menuBtn.addEventListener('click', () => {\n this.#host.dispatchEvent(new CustomEvent('toolbar-menu-click', {\n bubbles: true,\n composed: true,\n detail: { targetTable: this.#host }\n }));\n });\n }\n }\n\n addCustomElement(element) {\n if (this.#customContainer) {\n this.#customContainer.append(element);\n }\n }\n\n updateCaption(text) {\n const titleEl = this.querySelector('.ng-toolbar-title');\n if (titleEl) titleEl.textContent = text;\n }\n}\n\nif (!customElements.get('nine-table-toolbar')) {\n customElements.define('nine-table-toolbar', Toolbar);\n}","// ui/nine-table-hscrollbar.js\nimport { trace } from \"@nopeer\";\n\nexport class NineTableHScrollBar extends HTMLElement {\n #owner;\n #dragging = false;\n #elements;\n #interval1;\n #interval2;\n #resizeObserver;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#owner = this.closest(\"nine-table-sheet\") || this.getRootNode().host;\n if (!this.#owner) return;\n\n this.innerHTML = `\n <button class='scroll-left' disabled><div class='scroll-icon'></div></button>\n <div class='scroll-track'><div class='scroll-thumb'></div></div>\n <button class='scroll-right' disabled><div class='scroll-icon'></div></button>\n `;\n\n const initWhenReady = () => {\n const body = this.#owner.querySelector(\".ng-sheet-body .ng-container-body\");\n if (!body) {\n setTimeout(initWhenReady, 10);\n return;\n }\n\n this.#elements = {\n container : body,\n track : this.querySelector(\".scroll-track\"),\n thumb : this.querySelector(\".scroll-thumb\"),\n left : this.querySelector(\".scroll-left\"),\n right : this.querySelector(\".scroll-right\"),\n };\n\n this.#init();\n this.#observeResize();\n this.refresh();\n };\n\n initWhenReady();\n }\n\n disconnectedCallback() {\n if (this.#resizeObserver) {\n this.#resizeObserver.disconnect();\n }\n }\n\n #observeResize = () => {\n if (!this.#owner) return;\n const body = this.#owner.querySelector(\".ng-sheet-body .ng-container-body\");\n if (!body) return;\n\n this.#resizeObserver = new ResizeObserver(() => {\n this.refresh();\n });\n this.#resizeObserver.observe(body);\n };\n\n refresh = () => {\n\n if (!this.#owner || !this.#elements || this.#dragging) return;\n\n const body = this.#elements.container;\n const table = body.querySelector(\"table\");\n if (!table) return;\n\n const track = this.#elements.track;\n const thumb = this.#elements.thumb;\n\n const bodyWidth = body.clientWidth;\n const tableWidth = table.scrollWidth;\n\n const needsHScroll = (bodyWidth !== 0 && tableWidth > bodyWidth);\n this.#owner.classList.toggle('hscroll-visible', needsHScroll);\n\n if (!needsHScroll) {\n return;\n }\n\n const trackWidth = track.clientWidth;\n if (trackWidth <= 0) return;\n\n const thumbWidth = Math.max(Math.min(trackWidth * (bodyWidth / tableWidth), trackWidth), 20);\n thumb.style.width = `${thumbWidth}px`;\n\n const currentLeft = body.scrollLeft;\n const maxScrollLeft = tableWidth - bodyWidth;\n\n let l = 0;\n if (maxScrollLeft > 0) {\n l = parseInt((currentLeft / maxScrollLeft) * (trackWidth - thumbWidth), 10);\n }\n if (l < 0) l = 0;\n\n const maxThumbLeft = trackWidth - thumbWidth;\n if (l > maxThumbLeft) l = maxThumbLeft;\n\n thumb.style.left = `${l}px`;\n\n this.#elements.left.disabled = (l === 0);\n this.#elements.right.disabled = (l >= maxThumbLeft - 1);\n };\n\n #thumbMoveTo = (x) => {\n if (!this.#elements) return false;\n\n const body = this.#elements.container;\n const table = body.querySelector(\"table\");\n if (!table) return false;\n\n const trackBound = this.#elements.track.getBoundingClientRect();\n const thumbWidth = this.#elements.thumb.clientWidth;\n\n let targetX = x;\n if (targetX < 0) targetX = 0;\n const maxThumbLeft = trackBound.width - thumbWidth;\n if (targetX > maxThumbLeft) targetX = maxThumbLeft;\n targetX = parseInt(targetX, 10);\n\n this.#elements.thumb.style.left = `${targetX}px`;\n\n this.#elements.left.disabled = (targetX === 0);\n this.#elements.right.disabled = (targetX >= maxThumbLeft - 1);\n\n const bodyWidth = body.clientWidth;\n const tableWidth = table.scrollWidth;\n const maxScrollLeft = tableWidth - bodyWidth;\n\n if (maxThumbLeft > 0 && maxScrollLeft > 0) {\n const newScrollLeft = (targetX / maxThumbLeft) * maxScrollLeft;\n body.scrollLeft = newScrollLeft;\n }\n\n return (targetX > 0 && targetX < maxThumbLeft - 1);\n };\n\n #init = () => {\n const delayScroll = (pos) => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n\n const thumbLeft = parseInt(this.#elements.thumb.style.left || 0, 10);\n this.#thumbMoveTo(thumbLeft + pos);\n\n this.#interval1 = setInterval(() => {\n clearInterval(this.#interval1);\n\n this.#interval2 = setInterval(() => {\n const currentThumbLeft = parseInt(this.#elements.thumb.style.left || 0, 10);\n if (!this.#thumbMoveTo(currentThumbLeft + pos)) {\n clearInterval(this.#interval2);\n }\n }, 50);\n }, 500);\n };\n\n const clearTimer = () => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n };\n\n //['mouseup', 'mouseleave', 'touchend'].forEach(evt => {\n ['mouseup', 'mouseleave'].forEach(evt => {\n this.#elements.left.addEventListener(evt, clearTimer);\n this.#elements.right.addEventListener(evt, clearTimer);\n this.#elements.track.addEventListener(evt, clearTimer);\n });\n\n this.#elements.left.addEventListener(\"mousedown\", e => { if (e.button !== 0) return; delayScroll(-20); });\n this.#elements.right.addEventListener(\"mousedown\", e => { if (e.button !== 0) return; delayScroll(20); });\n //this.#elements.left.addEventListener(\"touchstart\", () => delayScroll(-20));\n //this.#elements.right.addEventListener(\"touchstart\", () => delayScroll(20));\n\n this.#elements.track.addEventListener(\"mousedown\", e => {\n if (e.button !== 0) return;\n e.preventDefault();\n const trackRect = this.#elements.track.getBoundingClientRect();\n const thumbWidth = this.#elements.thumb.clientWidth;\n this.#thumbMoveTo(e.clientX - trackRect.left - (thumbWidth / 2));\n });\n\n this.#elements.thumb.addEventListener(\"mousedown\", e => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n this.#dragging = true;\n this.shiftX = e.clientX - this.#elements.thumb.getBoundingClientRect().left;\n\n const onMouseMove = (moveEvent) => {\n if (!this.#dragging) return;\n const trackRect = this.#elements.track.getBoundingClientRect();\n this.#thumbMoveTo(moveEvent.clientX - trackRect.left - this.shiftX);\n };\n\n const onMouseUp = () => {\n this.#dragging = false;\n clearTimer();\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n this.refresh();\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n });\n };\n}\n\nif (!customElements.get('nine-table-hscrollbar')) {\n customElements.define(\"nine-table-hscrollbar\", NineTableHScrollBar);\n}","// ui/nine-table-vscrollbar.js\nimport { trace } from \"@nopeer\";\n\nexport class NineTableVScrollBar extends HTMLElement {\n #host;\n #sheet;\n #dragging = false;\n #elements;\n #startY = 0;\n #startScrollTop = 0;\n #startThumbTop = 0;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#host = this.getRootNode().host;\n this.#sheet = this.closest(\"nine-table-sheet\");\n\n this.innerHTML = `\n <button class='scroll-top' disabled><div class='scroll-icon'></div></button>\n <div class='scroll-track'><div class='scroll-thumb'></div></div>\n <button class='scroll-bottom' disabled><div class='scroll-icon'></div></button>\n `;\n\n const initWhenReady = () => {\n const body = this.#sheet.querySelector(\".ng-sheet-body\");\n if (!body) {\n setTimeout(initWhenReady, 10);\n return;\n }\n\n this.#elements = {\n container: body,\n track: this.querySelector(\".scroll-track\"),\n thumb: this.querySelector(\".scroll-thumb\"),\n top: this.querySelector(\".scroll-top\"),\n bottom: this.querySelector(\".scroll-bottom\"),\n };\n\n this.#init();\n this.refresh();\n };\n\n initWhenReady();\n }\n\n #getScaleInfo = () => {\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords ? viewRecords.length : 0;\n\n const scrollHolder = this.#sheet.elements?.scrollHolder;\n let rawContentHeight = scrollHolder ? parseFloat(scrollHolder.style.height) || 0 : 0;\n\n if (!rawContentHeight || rawContentHeight <= 0) {\n const isGrouped = this.#sheet.sourceTable?.querySelector(\"tbody tr[grouping='true']\") ? true : false;\n if (isGrouped && this.#sheet.rowManager) {\n rawContentHeight = (body.scrollHeight > body.clientHeight) ? body.scrollHeight : (totalCount * 30);\n } else {\n const rowHeight = this.#sheet.getRowHeight() || 1;\n rawContentHeight = totalCount * rowHeight;\n }\n }\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawContentHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n let contentHeight = rawContentHeight;\n\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawContentHeight;\n contentHeight = MAX_BROWSER_HEIGHT;\n }\n\n return { rawContentHeight, contentHeight, scaleFactor, useScaling, totalCount };\n };\n\n\n refresh = () => {\n if (this.#dragging) return;\n\n if (!this.#sheet || !this.#sheet.elements || !this.#elements) return;\n\n const body = this.#elements.container;\n const track = this.#elements.track;\n const thumb = this.#elements.thumb;\n const { contentHeight } = this.#getScaleInfo();\n\n const fixedHeight = (this.#sheet.querySelector('thead')?.offsetHeight || 0) +\n (this.#sheet.querySelector('tfoot')?.offsetHeight || 0) +\n (this.#sheet.querySelector('tbody.head')?.offsetHeight || 0);\n\n const bodyHeight = (this.#sheet.querySelector('.ng-sheet-body').offsetHeight || 0);\n const viewHeight = bodyHeight - fixedHeight;\n\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords.length;\n\n const rawContentHeight = this.#sheet.getRowHeight() * totalCount;\n\n const needsVScroll = (rawContentHeight > viewHeight);\n\n this.#sheet.classList.toggle('vscroll-visible', needsVScroll);\n\n if (!needsVScroll) {\n return;\n }\n\n const trackHeight = track.clientHeight;\n if (trackHeight <= 0) return;\n\n const thumbHeight = Math.max(Math.min(trackHeight * (bodyHeight / rawContentHeight), trackHeight), 20);\n thumb.style.height = `${thumbHeight}px`;\n\n const currentScrollTop = body.scrollTop;\n const maxScrollTop = Math.max(contentHeight - this.#sheet.rowManager.getRowHeight(), 1);\n\n let thumbTop = 0;\n if (maxScrollTop > 0) {\n thumbTop = (currentScrollTop / maxScrollTop) * (trackHeight - thumbHeight);\n }\n\n const maxThumbTop = trackHeight - thumbHeight;\n if (thumbTop < 0) thumbTop = 0;\n if (thumbTop > maxThumbTop) thumbTop = maxThumbTop;\n\n thumb.style.top = `${thumbTop}px`;\n\n this.#elements.top.disabled = (currentScrollTop <= 0);\n this.#elements.bottom.disabled = (currentScrollTop >= maxScrollTop - 1);\n };\n\n #init = () => {\n\n this.#elements.thumb.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n this.#dragging = true;\n\n this.#startY = e.clientY;\n this.#startThumbTop = parseFloat(this.#elements.thumb.style.top) || 0;\n const trackRect = this.#elements.track.getBoundingClientRect();\n const trackHeight = trackRect.height;\n const thumbHeight = this.#elements.thumb.clientHeight;\n const maxThumbTop = trackHeight - thumbHeight;\n\n const onMouseMove = (moveEvent) => {\n if (!this.#dragging) return;\n if (maxThumbTop <= 0) return;\n\n\n const deltaY = moveEvent.clientY - this.#startY;\n let targetThumbTop = this.#startThumbTop + deltaY;\n\n if (targetThumbTop < 0) targetThumbTop = 0;\n if (targetThumbTop > maxThumbTop) targetThumbTop = maxThumbTop;\n\n this.#elements.thumb.style.top = `${targetThumbTop}px`;\n\n const ratio = targetThumbTop / maxThumbTop;\n\n const rowHeight =this.#sheet.getRowHeight();\n const viewHeight = (this.#sheet.querySelector('.ng-sheet-body').offsetHeight || 0) -\n (this.#sheet.elements.body.thead?.offsetHeight || 0) -\n (this.#sheet.elements.body.tfoot?.offsetHeight || 0) -\n (this.#sheet.elements.body.tbody.head.offsetHeight || 0);\n\n const visibleRowCount = Math.floor(viewHeight / rowHeight);\n\n const { totalCount } = this.#getScaleInfo();\n const targetRow = Math.floor(ratio * (totalCount - visibleRowCount + 1));\n\n this.#sheet.rowManager.scrollToDataRow(targetRow);\n\n const { rawContentHeight, contentHeight } = this.#getScaleInfo();\n const currentScrollTop = this.#elements.container.scrollTop;\n const maxScrollTop = Math.max(contentHeight - this.#sheet.rowManager.getRowHeight(), 0);\n\n this.#elements.top.disabled = (currentScrollTop <= 0);\n this.#elements.bottom.disabled = (currentScrollTop >= maxScrollTop - 1);\n };\n\n const onMouseUp = () => {\n this.#dragging = false;\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n });\n\n this.#elements.track.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0 || e.target === this.#elements.thumb) return;\n const trackRect = this.#elements.track.getBoundingClientRect();\n const thumbHeight = this.#elements.thumb.clientHeight;\n const trackHeight = this.#elements.track.clientHeight;\n const maxThumbTop = trackHeight - thumbHeight;\n\n if (maxThumbTop > 0) {\n const clickY = e.clientY - trackRect.top - (thumbHeight / 2);\n const ratio = Math.max(0, Math.min(1, clickY / maxThumbTop));\n\n const { totalCount } = this.#getScaleInfo();\n const targetRow = Math.max(0, Math.min(Math.floor(ratio * (totalCount - 1)), totalCount - 1));\n\n\n if (targetRow >= 0 && this.#sheet.rowManager && typeof this.#sheet.rowManager.scrollToDataRow === 'function') {\n this.#sheet.rowManager.scrollToDataRow(targetRow, 'top');\n }\n }\n this.refresh();\n });\n\n let scrollInterval = null;\n\n const startContinuousScroll = (direction) => {\n if (scrollInterval) return;\n\n const scrollStep = () => {\n const $firstTr = this.#sheet.querySelector(\"tbody.body tr\");\n\n if (!$firstTr || $firstTr.dataset.row === undefined) {\n return;\n }\n\n if (direction === 'down' && this.#sheet.isLastRow()) {\n return;\n }\n\n const currentRow = parseInt($firstTr.dataset.row, 10);\n const targetRow = direction === 'down' ? currentRow+1 : Math.max(0, currentRow-1);\n\n this.#sheet.rowManager.scrollToDataRow(targetRow, null, () => {\n this.refresh();\n });\n };\n\n scrollStep();\n scrollInterval = setInterval(scrollStep, 200); // 100ms ๊ฐ๊ฒฉ ๋ฐ๋ณต\n };\n\n const stopContinuousScroll = () => {\n if (scrollInterval) {\n clearInterval(scrollInterval);\n scrollInterval = null;\n }\n };\n\n this.#elements.top.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n startContinuousScroll('up');\n });\n\n this.#elements.bottom.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n startContinuousScroll('down');\n });\n\n document.addEventListener(\"mouseup\", stopContinuousScroll);\n this.#elements.top.addEventListener(\"mouseleave\", stopContinuousScroll);\n this.#elements.bottom.addEventListener(\"mouseleave\", stopContinuousScroll);\n };\n}\n\nif (!customElements.get('nine-table-vscrollbar')) {\n customElements.define(\"nine-table-vscrollbar\", NineTableVScrollBar);\n}\n\n","import { trace } from \"@nopeer\";\n\nexport const GROUP_IDX = {\n\tID: 0,\n\tDEPTH: 1,\n\tNAME: 2,\n\tCHILDREN: 3,\n};\n\nexport class GroupingManager {\n\t#sheet;\n\t#host;\n\t#groupColumns = [];\n\t#groupMap = new Map(); // ๊ทธ๋ฃน๋ณ ์์ ID ๋งคํ ๊ด๋ฆฌ์ฉ\n\t#isApplying = false;\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = this.#sheet.getRootNode().host;\n\t}\n\n\tget columns() {\n\t\treturn this.#groupColumns;\n\t}\n\n\tget groupMap() {\n\t\treturn this.#groupMap;\n\t}\n\n\tinitialize = () => {\n\t\tlet groupColumns = [];\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\t\tif (sourceTable) {\n\t\t\tsourceTable.querySelectorAll('tbody tr[grouping=\"true\"]').forEach(($tr) => {\n\t\t\t\tconst $cell =$tr.querySelector(`[cell-type=\"tree\"]`);\n\t\t\t\tif ($cell &&$cell.dataset.bind) {\n\t\t\t\t\tgroupColumns.push($cell.dataset.bind);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#groupColumns = groupColumns;\n\t};\n\n\tapply() {\n\n\t\tif (this.#isApplying) return;\n\t\tthis.#isApplying = true;\n\n\t\tlet groupColumns = [];\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\t\tif (sourceTable) {\n\t\t\tsourceTable.querySelectorAll('tbody tr[grouping=\"true\"]').forEach(($tr) => {\n\t\t\t\tconst $cell =$tr.querySelector(`[cell-type=\"tree\"]`);\n\t\t\t\tif ($cell &&$cell.dataset.bind) {\n\t\t\t\t\tgroupColumns.push($cell.dataset.bind);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#groupColumns = groupColumns;\n\n\t\tthis.#isApplying = false;\n\t\tthis.#sheet.scrollToY(0);\n\t\tthis.#sheet.view.refresh();\n\t}\n\n\tclear() {\n\t\tthis.#groupColumns = [];\n\t\tthis.#groupMap.clear();\n\t\tthis.#isApplying = false;\n\t\tthis.#sheet.scrollToY(0);\n\t\tthis.#sheet.view.refresh();\n\t}\n\n\tsetGroupMap(map) {\n\t\tthis.#groupMap = map;\n\t}\n\n\tgetChildrenRowIds(groupId) {\n\t\treturn this.#groupMap.get(groupId) || [];\n\t}\n\n\tgetChildrenRecords(groupId) {\n\t\tconst rowIds = this.getChildrenRowIds(groupId);\n\t\tconst dataManager = this.#host.data;\n\t\treturn rowIds.map(rowid => dataManager.getArray(rowid)).filter(Boolean);\n\t}\n}\n\nexport class Grouping {\n\n\tstatic apply(rawRecords, groupColumns = [], fields = []) {\n\t\tif (!groupColumns || groupColumns.length === 0) {\n\t\t\treturn { headers: [], renderItems: [], groupMap: new Map() };\n\t\t}\n\n\t\tconst validRaw = rawRecords.filter(o => !o.__ng?.deleted);\n\t\tconst groupMap = new Map();\n\n\t\tconst nestedTree = Grouping.#buildNestedMap(validRaw, groupColumns, fields);\n\t\tconst flatResult = [];\n\t\tconst renderItems = [];\n\n\t\tGrouping.#flattenTree(nestedTree, 0, groupColumns, flatResult, renderItems, groupMap, \"\");\n\n\t\treturn { headers: flatResult, renderItems, groupMap };\n\t}\n\n\tstatic #flattenTree(mapOrArray, depth, groupColumns, resultArr, renderItems, groupMap, parentId) {\n\t\tlet counter = 0;\n\t\tconst isLastLevel = (depth === groupColumns.length - 1); // ๐ก ์ฐ์ฐ์ ์์ ๋ฐ์\n\n\t\tfor (let [groupKey, subMapOrRecords] of mapOrArray.entries()) {\n\t\t\tconst groupId = parentId ? `${parentId}_${counter++}` : `g_${counter++}`;\n\n\t\t\tconst rowIds = Grouping.#collectLeafRowIds(subMapOrRecords);\n\t\t\tgroupMap.set(groupId, rowIds);\n\n\t\t\tconst groupRecord = [];\n\t\t\tgroupRecord[GROUP_IDX.ID] = groupId;\n\t\t\tgroupRecord[GROUP_IDX.DEPTH] = depth;\n\t\t\tgroupRecord[GROUP_IDX.NAME] = groupKey;\n\t\t\tgroupRecord[GROUP_IDX.CHILDREN] = rowIds;\n\n\t\t\tgroupRecord.__isGroupHeader = true;\n\t\t\tgroupRecord.__groupId = groupId;\n\n\t\t\tresultArr.push(groupRecord);\n\n\t\t\trenderItems.push({\n\t\t\t\ttype: 'group',\n\t\t\t\trecord: groupRecord,\n\t\t\t\tgroupId: groupId\n\t\t\t});\n\n\t\t\tif (!isLastLevel && subMapOrRecords instanceof Map) {\n\t\t\t\tGrouping.#flattenTree(subMapOrRecords, depth + 1, groupColumns, resultArr, renderItems, groupMap, groupId);\n\t\t\t} else {\n\t\t\t\tconst leafRecords = Grouping.#collectLeafRecords(subMapOrRecords);\n\t\t\t\tleafRecords.forEach(record => {\n\t\t\t\t\trecord.__isGroupHeader = false;\n\t\t\t\t\trecord.__groupId = groupId;\n\t\t\t\t\tresultArr.push(record);\n\n\t\t\t\t\trenderItems.push({\n\t\t\t\t\t\ttype: 'data',\n\t\t\t\t\t\trecord: record,\n\t\t\t\t\t\tgroupId: groupId\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic #buildNestedMap(records, groupColumns, fields) {\n\t\tconst colIndex = fields.indexOf(groupColumns[0]);\n\t\tconst remainingCols = groupColumns.slice(1);\n\t\tconst map = new Map();\n\n\t\trecords.forEach(record => {\n\t\t\tconst key = colIndex >= 0 ? record.v[colIndex] : '(Unknown)';\n\t\t\tif (!map.has(key)) map.set(key, []);\n\t\t\tmap.get(key).push(record);\n\t\t});\n\n\t\tif (remainingCols.length > 0) {\n\t\t\tconst result = new Map();\n\t\t\tfor (let [key, subRecords] of map.entries()) {\n\t\t\t\tresult.set(key, Grouping.#buildNestedMap(subRecords, remainingCols, fields));\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\treturn map;\n\t}\n\n\tstatic #collectLeafRowIds(subMapOrRecords) {\n\t\tlet rowIds = [];\n\t\tif (subMapOrRecords instanceof Map) {\n\t\t\tfor (let subVal of subMapOrRecords.values()) {\n\t\t\t\trowIds = rowIds.concat(Grouping.#collectLeafRowIds(subVal));\n\t\t\t}\n\t\t} else if (Array.isArray(subMapOrRecords)) {\n\t\t\trowIds = rowIds.concat(subMapOrRecords.map(r => r.__ng?.rowid ?? r.m?._?.[0]));\n\t\t}\n\t\treturn rowIds;\n\t}\n\n\tstatic #collectLeafRecords(subMapOrRecords) {\n\t\tlet records = [];\n\t\tif (subMapOrRecords instanceof Map) {\n\t\t\tfor (let subVal of subMapOrRecords.values()) {\n\t\t\t\trecords = records.concat(Grouping.#collectLeafRecords(subVal));\n\t\t\t}\n\t\t} else if (Array.isArray(subMapOrRecords)) {\n\t\t\trecords = records.concat(subMapOrRecords);\n\t\t}\n\t\treturn records;\n\t}\n}","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport { GROUP_IDX } from \"@/data/Grouping.js\";\n\nexport class RowManager {\n #BUFFER_ROW_COUNT = 3;\n\n #host;\n #sheet;\n #element;\n\n #containerTemplates = new Map();\n\n #resizeObserver = null;\n #sheetHeight = 0;\n #cachedRowCount;\n\n #isProgrammaticScroll = false;\n #isGrouped = false;\n\n constructor(sheet) {\n this.#host = sheet.getRootNode().host;\n this.#sheet = sheet;\n\n this.#initResizeObserver();\n }\n\n getRowHeight() {\n return this.#sheet.template.height;\n }\n\n refresh = (force = false) => {\n\n if (!this.#sheet.classList.contains('active')) return;\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n if (!bodyViewport) return;\n\n const wasInvalidHeight = !this.#sheet.template.height || this.#sheet.template.height <= 0;\n\n if (wasInvalidHeight) {\n this.#measureAndCacheHeight();\n if (this.#sheet.template.height && this.#sheet.template.height > 0) {\n this.#renderAllContainers();\n }\n }\n\n\n this.#handleScroll(bodyViewport.scrollTop, force);\n\n this.#sheet.querySelector('nine-table-vscrollbar')?.refresh();\n };\n\n #handleScroll = (scrollTop, force = false) => {\n\n if (this.#isGrouped) {\n this.#handleGroupedScroll(scrollTop, force);\n return;\n }\n\n const rowHeight = this.#sheet.template.height;\n if (!rowHeight || rowHeight <= 0) return;\n\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords.length;\n\n if (totalCount === 0) {\n this.#sheet.elements.scrollHolder.style.height = '0px';\n return;\n }\n\n const fixedHeight = (this.#sheet.elements.body.thead?.offsetHeight || 0) +\n (this.#sheet.elements.body.tfoot?.offsetHeight || 0) +\n this.#sheet.elements.body.tbody.head.offsetHeight;\n\n const viewHeight = this.#sheet.querySelector('.ng-sheet-body').offsetHeight || 0;\n const rawTotalVirtualHeight = Math.max(totalCount * rowHeight - (viewHeight - fixedHeight - rowHeight) - rowHeight, 0);\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawTotalVirtualHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n let totalVirtualHeight = rawTotalVirtualHeight;\n\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawTotalVirtualHeight;\n totalVirtualHeight = MAX_BROWSER_HEIGHT;\n }\n\n\n this.#sheet.elements.scrollHolder.style.height = `${totalVirtualHeight}px`;\n\n const actualScrollTop = useScaling ? (scrollTop / scaleFactor) : scrollTop;\n\n const maxStartIndex = Math.max(0, totalCount - 1);\n const clampedScrollTop = Math.min(actualScrollTop, rawTotalVirtualHeight);\n const startIndex = Math.max(0, Math.min(Math.floor(clampedScrollTop / rowHeight), maxStartIndex));\n\n //trace.log(clampedScrollTop % rowHeight, rowHeight);\n\n /*\n * FIX: Use GPU-accelerated transform3d instead of 'top' positioning.\n * On mobile devices (iOS Safari), direct 'top' updates trigger expensive\n * layout reflows and cause severe scrolling lag during inertia touch scrolls.\n * translate3d forces hardware compositing for buttery-smooth performance.\n */\n this.#sheet.elements.left.tbody.body.style.transform =\n this.#sheet.elements.body.tbody.body.style.transform =\n this.#sheet.elements.right.tbody.body.style.transform = `translate3d(0px, -${clampedScrollTop % rowHeight}px, 0px)`;\n\n\n const firstTr = this.#element.firstTr;\n const currentStartIndex = firstTr && firstTr.dataset.row !== undefined ? parseInt(firstTr.dataset.row, 10) : -1;\n\n if (!force && currentStartIndex === startIndex) {\n return;\n }\n\n [\n this.#sheet.elements.left.tbody.body,\n this.#sheet.elements.body.tbody.body,\n this.#sheet.elements.right.tbody.body\n ].forEach(($tbody, tbodyIdx) => {\n if (!$tbody) return;\n\n const rows = $tbody.querySelectorAll('tbody.body tr');\n\n rows.forEach(($tr, index) => {\n const dataIndex = startIndex + Math.floor(index / this.#sheet.template.length);\n\n if (dataIndex >= totalCount) {\n $tr.style.display = 'none';\n $tr.dataset.matrixRow = null;\n $tr.dataset.row = null;\n $tr.dataset.index = null;\n return;\n }\n\n const record = viewRecords[dataIndex];//this.#sheet.view.getArray(dataIndex);\n\n if (!record) {\n $tr.style.display = 'none';\n return;\n }\n\n const rowid = record.m._[NINE_TABLE.META.INDEX.ROWID];\n\n $tr.style.display = '';\n\n this.#bindRowData($tr, record, rowid, dataIndex);\n });\n });\n\n this.#sheet.selection.refresh();\n };\n\n\n #handleGroupedScroll = (scrollTop, force = false) => {\n\n const allRenderItems = this.#sheet.view.getArray() || [];\n const totalVirtualCount = allRenderItems.length;\n\n if (totalVirtualCount === 0) {\n this.#sheet.elements.scrollHolder.style.height = '0px';\n return;\n }\n\n\n const bodyContent = this.#sheet.querySelector('.ng-sheet-body .ng-sheet-body-content');\n const templateLength = this.#sheet.templateLength || 1;\n\n const getItemHeight = (item) => {\n if (item.type === 'group') {\n const depth = item.record[GROUP_IDX.DEPTH] || 0;\n const groupHeight = this.#sheet.template.height[depth] || this.#sheet.template.height / templateLength;\n return groupHeight;\n } else {\n let dataRowsHeight = 0;\n const templateLength = this.#sheet.templateLength || 1;\n\n let groupHeightsTotal = 0;\n for(let i = 0; i < templateLength - 1; i++) {\n groupHeightsTotal += this.#sheet.template.heights[i] || 0;\n }\n dataRowsHeight = this.#sheet.template.height - groupHeightsTotal;\n\n return dataRowsHeight > 0 ? dataRowsHeight : this.#sheet.template.height;\n }\n };\n\n\n let totalVirtualHeight = 0;\n const itemHeights = new Array(totalVirtualCount);\n for (let i = 0; i < totalVirtualCount; i++) {\n const h = getItemHeight(allRenderItems[i]);\n itemHeights[i] = h;\n totalVirtualHeight += h;\n }\n\n this.#sheet.elements.scrollHolder.style.height = `${totalVirtualHeight}px`;\n\n const viewportClientHeight = this.#sheet.clientHeight;\n\n let accumulatedHeight = 0;\n let startIndex = 0;\n\n for (let i = 0; i < totalVirtualCount; i++) {\n const h = itemHeights[i];\n if (accumulatedHeight + h > scrollTop) {\n startIndex = i;\n break;\n }\n accumulatedHeight += h;\n startIndex = i;\n }\n\n const offsetY = scrollTop - accumulatedHeight;\n if (bodyContent) {\n bodyContent.querySelectorAll(\"tbody\").forEach(($tbody) => {\n $tbody.style.top = `-${Math.max(0, offsetY)}px`;\n });\n }\n\n const firstTr = this.#element.firstTr;\n const currentStartIndex = firstTr && firstTr.dataset.virtualIndex !== undefined\n ? parseInt(firstTr.dataset.virtualIndex, 10)\n : -1;\n\n if (!force && currentStartIndex === startIndex) {\n return;\n }\n\n const visibleRowsCount = Math.ceil(viewportClientHeight / (this.#sheet.template.height / templateLength));\n const dynamicBuffer = (this.#sheet.grouping.columns?.length || 1) * 15;\n const targetStart = startIndex;\n const targetEnd = Math.min(totalVirtualCount, startIndex + visibleRowsCount + dynamicBuffer);\n const renderedItems = allRenderItems.slice(targetStart, targetEnd);\n\n ['.ng-container-body', '.ng-container-left', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (!container) return;\n\n const trs = Array.from(container.querySelectorAll('tbody.body tr'));\n\n for (let i = 0; i < trs.length; i += templateLength) {\n const itemIndex = Math.floor(i / templateLength);\n const item = renderedItems[itemIndex];\n const chunkTrs = trs.slice(i, i + templateLength);\n\n if (!item || itemIndex >= renderedItems.length) {\n chunkTrs.forEach(tr => {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n });\n continue;\n }\n\n const dataIndex = startIndex + itemIndex;\n\n chunkTrs.forEach((tr, subIdx) => {\n const virtualIndex = startIndex + itemIndex;\n tr.dataset.virtualIndex = virtualIndex;\n tr.dataset.row = (item.type === 'data') ? dataIndex : '';\n\n const isTrGroup = tr.getAttribute('grouping') === 'true';\n\n if (item.type === 'group') {\n if (isTrGroup) {\n const depth = item.record[GROUP_IDX.DEPTH];\n if (subIdx === depth) {\n tr.style.display = '';\n this.#bindGroupRowData(tr, allRenderItems, item.record, virtualIndex);\n } else {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n }\n } else {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n }\n } else {\n if (isTrGroup) {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n } else {\n tr.style.display = '';\n\n const rowid = item.record.m?.rowid ?? 0;\n this.#bindRowData(tr, item.record, rowid, virtualIndex);\n }\n }\n });\n }\n });\n\n this.#sheet.selection.refresh();\n };\n\n #bindGroupRowData = ($tr, allRenderItems, groupRecord, virtualIndex) => {\n const templateLength = this.#sheet.templateLength || 1;\n const subRowIndex = parseInt($tr.dataset.subrow, 10) || 0;\n const matrixRow = (virtualIndex * templateLength) + subRowIndex;\n\n const indices = groupRecord[GROUP_IDX.CHILDREN];\n const allRecords = this.#host.data.getArray();\n const childrenRecords = indices ? indices.map(idx => allRecords[idx]).filter(Boolean) : [];\n\n\n $tr.dataset.virtualIndex = virtualIndex;\n $tr.dataset.row = '';\n $tr.dataset.matrixRow = matrixRow;\n $tr.data = childrenRecords;//groupRecord;\n $tr.dataset.groupId = groupRecord[GROUP_IDX.ID];\n\n\n Array.from($tr.cells).forEach(($cell) => {\n\n $cell.dataset.row = virtualIndex;\n\n const customComp = Array.from($cell.children).find($el =>\n $el.tagName.toLowerCase().startsWith('cell-') || typeof $el.refresh === 'function'\n );\n\n\n if (customComp !== undefined && typeof customComp.refresh === 'function') {\n customComp?.refresh();\n }\n });\n };\n\n #bindRowData = ($tr, record, rowid, dataIndex) => {\n const templateLength = this.#sheet.templateLength || 1;\n const subRowIndex = parseInt($tr.dataset.subrow, 10) || 0;\n const matrixRow = (dataIndex * templateLength) + subRowIndex;\n\n $tr.dataset.index = dataIndex;\n $tr.dataset.row = rowid;\n $tr.dataset.matrixRow = matrixRow;\n $tr.data = record;\n\n Array.from($tr.cells).forEach(($cell) => {\n $cell.dataset.index = dataIndex;\n $cell.dataset.row = rowid;\n\n const customComp = Array.from($cell.children).find($el =>\n $el.tagName.toLowerCase().startsWith('cell-') && typeof $el.refresh === 'function'\n );\n\n customComp?.refresh();\n });\n };\n\n initialize = () => {\n\n this.#isGrouped = this.#sheet.sourceTable.querySelector(\"tbody tr[grouping='true']\") ? true : false;\n\n //this.#cachedTemplateHeight = null;\n this.#containerTemplates.clear();\n\n this.#element = {\n scrollTables: this.#sheet.querySelectorAll('.ng-sheet-body table'),\n firstTr: this.#sheet.querySelector('.ng-sheet-body .ng-container-body tbody.body tr'),\n };\n\n ['.ng-container-body', '.ng-container-left', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (!container) return;\n\n const tableEl = container.querySelector('table');\n if (!tableEl) return;\n\n const tbody = tableEl.querySelector('tbody.body');\n if (!tbody) return;\n\n const trs = Array.from(tbody.querySelectorAll('tr'));\n const templateTrs = trs.map(tr => tr.cloneNode(true));\n this.#containerTemplates.set(selector, templateTrs);\n });\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\n if (bodyViewport) {\n this.#sheetHeight = bodyViewport.clientHeight;\n //trace.log(\"this.#sheetHeight\", this.#sheetHeight, this.#sheet);\n\n this.#measureAndCacheHeight();\n this.#renderAllContainers();\n this.#handleScroll(bodyViewport.scrollTop, true);\n\n bodyViewport.addEventListener('scroll', (e) => {\n\n this.#sheet.querySelectorAll(\"cell-combo-panel\").forEach($el => {\n $el.classList.remove('active');\n });\n\n\n if (this.#isProgrammaticScroll) return;\n\n const rowHeight = this.#sheet.template.height || 0;\n const totalCount = this.#sheet.view.getArray()?.length || 0;\n const rawTotalVirtualHeight = totalCount * rowHeight;\n\n if (rawTotalVirtualHeight <= bodyViewport.clientHeight) {\n return;\n }\n\n this.#handleScroll(bodyViewport.scrollTop);\n\n this.#sheet.querySelector('nine-table-vscrollbar').refresh();\n\n }, { passive: true });\n }\n };\n\n scrollToDataRow(dataRow, align = 'top', onRendered) {\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords?.length || 0;\n\n const targetRow = Math.max(0, Math.min(dataRow, totalCount - 1));\n let targetScrollTop = 0;\n\n if (this.#isGrouped) {\n const maxScrollTop = Math.max(bodyViewport.scrollHeight - bodyViewport.clientHeight, 1);\n // targetRow๊ฐ ์ ์ฒด totalCount์์ ์ฐจ์งํ๋ ๋น์จ(ratio)๋งํผ ์ค์ ์คํฌ๋กค ์ต๋ ๋์ด์ ๊ณฑํด์ค\n const ratio = targetRow / Math.max(totalCount - 1, 1);\n targetScrollTop = ratio * maxScrollTop;\n } else {\n\n const rowHeight = this.#sheet.template.height;\n const rawTargetScrollTop = targetRow * rowHeight;\n\n const fixedHeight = (this.#sheet.elements.body.thead?.offsetHeight || 0) +\n (this.#sheet.elements.body.tfoot?.offsetHeight || 0) +\n this.#sheet.elements.body.tbody.head.offsetHeight;\n\n const viewHeight = bodyViewport.offsetHeight || 0;\n const rawTotalVirtualHeight = Math.max(totalCount * rowHeight + fixedHeight - viewHeight, 0);\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawTotalVirtualHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawTotalVirtualHeight;\n }\n\n targetScrollTop = rawTargetScrollTop * scaleFactor;\n }\n\n this.#isProgrammaticScroll = true;\n bodyViewport.scrollTop = targetScrollTop;\n this.#handleScroll(targetScrollTop);\n\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n this.#isProgrammaticScroll = false;\n if (typeof onRendered === 'function') onRendered();\n });\n });\n }\n\n\n\n destroy = () => {\n if (this.#resizeObserver) {\n this.#resizeObserver.disconnect();\n this.#resizeObserver = null;\n }\n };\n\n #measureAndCacheHeight = () => {\n this.#updateRowCount();\n return;\n if (!this.#sheet.classList.contains('active')) return;\n\n if (!this.#sheet.sourceTable) return;\n\n const trTemplates = this.#sheet.sourceTable?.querySelectorAll('tbody.body tr');\n\n const $tbody = this.#sheet.querySelector('.ng-container-body tbody.body');\n if (!$tbody) return;\n\n $tbody?.querySelectorAll('tr')?.forEach(tr => tr.remove());\n\n const fragment = document.createDocumentFragment();\n trTemplates.forEach($tr => fragment.appendChild($tr.cloneNode(true)));\n $tbody?.appendChild(fragment);\n\n const renderedTrs = $tbody.querySelectorAll('tr');\n\n renderedTrs.forEach(tr => tr.remove());\n\n this.#updateRowCount();\n };\n\n #updateRowCount = () => {\n\n if (this.#sheetHeight > 0 && this.#sheet.template.height > 0) {\n const visibleRows = Math.ceil(this.#sheetHeight / this.#sheet.template.height);\n\n let dynamicBuffer = this.#BUFFER_ROW_COUNT;\n if (this.#isGrouped && this.#sheet.grouping) {\n const groupDepth = this.#sheet.grouping.columns?.length || 1;\n dynamicBuffer += (groupDepth * 15);\n }\n\n this.#cachedRowCount = visibleRows + dynamicBuffer;\n }\n };\n\n #renderAllContainers = () => {\n\n ['.ng-container-body', '.ng-container-left', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (container && container.querySelector('tbody')) {\n this.#renderRows(container);\n }\n });\n\n this.#syncRowHeights();\n };\n\n #renderRows = (container) => {\n\n let targetFixedType = null;\n if (container.classList.contains('ng-container-left')) targetFixedType = 'left';\n else if (container.classList.contains('ng-container-right')) targetFixedType = 'right';\n\n const templateTrs = Array.from(this.#sheet.sourceTable.querySelectorAll('tbody.body tr')).map(tr => {\n const clonedTr = tr.cloneNode(true);\n\n\n if (targetFixedType === 'left') {\n clonedTr.querySelectorAll('th,td').forEach($cell => {\n if ($cell.getAttribute('fixed') !== 'left') $cell.remove();\n });\n } else if (targetFixedType === 'right') {\n clonedTr.querySelectorAll('th,td').forEach($cell => {\n if ($cell.getAttribute('fixed') !== 'right') $cell.remove();\n });\n } else {\n clonedTr.querySelectorAll('[fixed=left], [fixed=right]').forEach($cell => {\n $cell.remove();\n });\n }\n\n return clonedTr;\n });\n\n if (templateTrs.length === 0) return;\n\n const targetTbody = container.querySelector('tbody.body');\n\n targetTbody.querySelectorAll(\"tr\").forEach(tr => tr.remove());\n\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < this.#cachedRowCount; i++) {\n templateTrs.forEach(tmpl => fragment.appendChild(tmpl.cloneNode(true)));\n }\n\n\n targetTbody.appendChild(fragment);\n\n if (container.classList.contains('ng-container-body')) {\n this.#element.firstTr = targetTbody.querySelector('tr');\n }\n };\n\n\n\n #syncRowHeights = () => {\n const leftTable = this.#sheet.querySelector('.ng-sheet-body .ng-container-left table');\n const bodyTable = this.#sheet.querySelector('.ng-sheet-body .ng-container-body table');\n const rightTable = this.#sheet.querySelector('.ng-sheet-body .ng-container-right table');\n\n if (bodyTable) {\n const leftRows = leftTable ? Array.from(leftTable.querySelectorAll('tbody tr')) : [];\n const bodyRows = Array.from(bodyTable.querySelectorAll('tbody tr'));\n const rightRows = rightTable ? Array.from(rightTable.querySelectorAll('tbody tr')) : [];\n\n const maxRows = Math.max(leftRows.length, bodyRows.length, rightRows.length);\n\n for (let i = 0; i < maxRows; i++) {\n const heights = [\n leftRows[i]?.getBoundingClientRect().height || 0,\n bodyRows[i]?.getBoundingClientRect().height || 0,\n rightRows[i]?.getBoundingClientRect().height || 0\n ];\n const maxHeight = Math.max(...heights);\n\n if (maxHeight > 0) {\n if (leftRows[i]) leftRows[i].style.height = `${maxHeight}px`;\n if (bodyRows[i]) bodyRows[i].style.height = `${maxHeight}px`;\n if (rightRows[i]) rightRows[i].style.height = `${maxHeight}px`;\n }\n }\n }\n };\n\n #initResizeObserver = () => {\n\n if (!this.#sheet || !(this.#sheet instanceof HTMLElement)) return;\n\n this.#resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n\n const sheetEl = entry.target;\n if (!sheetEl.classList.contains('active')) continue;\n\n const height = entry.contentRect.height;\n const width = entry.contentRect.width;\n\n if (width > 0 && this.#sheet.isAutoFitCol) {\n this.#sheet.autoFit(true);\n }\n\n if (height > 0 && this.#sheetHeight !== height) {\n this.#sheetHeight = height;\n //trace.log(\"this.#sheetHeight\", this.#sheetHeight);\n this.#updateRowCount();\n\n if (this.#sheet.template.height !== null) {\n this.#renderAllContainers();\n this.refresh();\n }\n }\n }\n });\n\n this.#resizeObserver.observe(this.#sheet);\n };\n}","import { trace } from \"@nopeer\";\n\nexport const COLLAPSED_WIDTH = 16;\n\nexport class TableCompiler {\n\n static compile($srcTable) {\n\n const $table = $srcTable.cloneNode(true);\n\n TableCompiler.resetColIndex($table, $table.querySelectorAll('thead tr'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr[grouping=\"true\"]'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr:not([grouping=\"true\"])'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tfoot tr'));\n\n TableCompiler.#syncColAttributes($table);\n\n return $table;\n }\n\n static recompile($table) {\n\n\n TableCompiler.resetColIndex($table, $table.querySelectorAll('thead tr'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr[grouping=\"true\"]'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr:not([grouping=\"true\"])'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tfoot tr'));\n\n TableCompiler.#syncColAttributes($table);\n\n return $table;\n }\n\n static #syncColAttributes($table) {\n\n $table.querySelectorAll('colgroup col').forEach(($col, i) => {\n $col.setAttribute('data-col', i);\n const fixed = $col.getAttribute('fixed');\n\n $table.querySelectorAll(`[data-col=\"${i}\"]`).forEach($el => {\n fixed ? $el.setAttribute('fixed', fixed) : $el.removeAttribute('fixed');\n });\n });\n }\n\n static resetColIndex($table, trs) {\n\n const cols = $table.querySelectorAll('colgroup col');\n const grid = Array.from({ length: trs.length }, () => Array(cols.length).fill(null));\n\n trs.forEach(($tr, index) => {\n\n $tr.dataset.subrow = index;\n\n let colIndex = 0;\n\n $tr.querySelectorAll('th, td').forEach($cell => {\n\n while (colIndex < cols.length && grid[index][colIndex] !== null) {\n colIndex++;\n }\n\n $cell.dataset.col = colIndex;\n\n const rowSpan = $cell.rowSpan || 1;\n const colSpan = $cell.colSpan || 1;\n\n for (let r = 0; r < rowSpan; r++) {\n for (let c = 0; c < colSpan; c++) {\n if (index + r < trs.length && colIndex + c < cols.length) {\n grid[index + r][colIndex + c] = $cell;\n }\n }\n }\n\n colIndex += colSpan;\n });\n });\n }\n\n}","import { trace } from \"@nopeer\";\n\nexport class CellSelection {\n\t#sheet;\n\t#host;\n\t#range = { startRow: -1, startCol: -1, endRow: -1, endCol: -1 };\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tthis.#initEvents();\n\t}\n\n\t#getMatrixRow(tr) {\n\t\tif (!tr) return { dataRow: -1, subRowIndex: -1, matrixRow: -1 };\n\n\t\tconst dataRow = parseInt(tr.dataset.index, 10);\n\t\tif (isNaN(dataRow)) return { dataRow: -1, subRowIndex: -1, matrixRow: -1 };\n\n\t\tconst tbody = tr.closest('tbody');\n\t\tconst trs = Array.from(tbody.querySelectorAll('tr'));\n\n\t\tconst sameGroupTrs = trs.filter(t => parseInt(t.dataset.index, 10) === dataRow);\n\t\tconst subRowIndex = sameGroupTrs.indexOf(tr);\n\t\tconst templateLength = sameGroupTrs.length > 0 ? sameGroupTrs.length : 1;\n\n\t\tconst matrixRow = (dataRow * templateLength) + (subRowIndex >= 0 ? subRowIndex : (tr.sectionRowIndex % templateLength));\n\n\t\treturn { dataRow, subRowIndex, matrixRow };\n\t}\n\n\tsetFocus(matrixRow, col) {\n\t\tthis.#sheet.querySelectorAll(`tr.selected-start`).forEach($tr => {\n\t\t\t$tr.classList.remove(\"selected-start\");\n\t\t\t$tr.querySelectorAll(`td.selected-start`).forEach($td => {\n\t\t\t\t$td.classList.remove(\"selected-start\");\n\t\t\t});\n\t\t});\n\n\t\tconst $td = this.#sheet.querySelector(`.ng-sheet-body-content tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${col}\"]`);\n\t\tif (!$td) return;\n\n\t\t$td.classList.add(\"selected-start\");\n\t\t$td.closest('tr')?.classList.add(\"selected-start\");\n\t}\n\n\tsetRange(startRow, startCol, endRow, endCol) {\n\t\tlet r1 = Math.min(startRow, endRow);\n\t\tlet r2 = Math.max(startRow, endRow);\n\t\tlet c1 = Math.min(startCol, endCol);\n\t\tlet c2 = Math.max(startCol, endCol);\n\n\n\t\tif (this.#host.tagName === \"NINE-TABLE-SIMPLE\") {\n\t\t\tc1 = 1;\n\t\t\tc2 = 10;\n\t\t}\n\n\t\tconst containers = this.#sheet.querySelectorAll('.ng-container-left, .ng-container-body, .ng-container-right');\n\n\t\tlet expanded = true;\n\t\tlet loopCount = 0;\n\n\t\twhile (expanded && loopCount < 5) {\n\t\t\texpanded = false;\n\t\t\tloopCount++;\n\n\t\t\tcontainers.forEach(container => {\n\n\t\t\t\tconst visibleTrs = Array.from(container.querySelectorAll('tbody tr')).filter(tr => {\n\t\t\t\t\treturn tr.style.display !== 'none'; // ํน์ tr.offsetHeight > 0 ์ฒดํฌ\n\t\t\t\t});\n\n\t\t\t\tvisibleTrs.forEach(tr => {\n\t\t\t\t\tconst { matrixRow } = this.#getMatrixRow(tr);\n\t\t\t\t\tif (matrixRow < 0) return;\n\n\t\t\t\t\ttr.querySelectorAll('td, th').forEach(cell => {\n\t\t\t\t\t\tconst col = parseInt(cell.dataset.col, 10);\n\t\t\t\t\t\tif (isNaN(col)) return;\n\n\t\t\t\t\t\tconst colEl = this.#sheet.querySelector(`col[data-col=\"${col}\"]`);\n\t\t\t\t\t\tif (colEl.style.display !== 'none') {\n\t\t\t\t\t\t\tconst rowSpan = parseInt(cell.rowSpan || 1, 10);\n\t\t\t\t\t\t\tconst colSpan = parseInt(cell.colSpan || 1, 10);\n\n\t\t\t\t\t\t\tconst cellEndRow = matrixRow + rowSpan - 1;\n\t\t\t\t\t\t\tconst cellEndCol = col + colSpan - 1;\n\n\t\t\t\t\t\t\tconst isIntersecting = cellEndRow >= r1 && matrixRow <= r2 && cellEndCol >= c1 && col <= c2;\n\n\t\t\t\t\t\t\tif (isIntersecting) {\n\t\t\t\t\t\t\t\tconst nsR = Math.min(r1, matrixRow);\n\t\t\t\t\t\t\t\tconst neR = Math.max(r2, cellEndRow);\n\t\t\t\t\t\t\t\tconst nsC = Math.min(c1, col);\n\t\t\t\t\t\t\t\tconst neC = Math.max(c2, cellEndCol);\n\n\t\t\t\t\t\t\t\tif (nsR !== r1 || neR !== r2 || nsC !== c1 || neC !== c2) {\n\t\t\t\t\t\t\t\t\tr1 = nsR; r2 = neR; c1 = nsC; c2 = neC;\n\t\t\t\t\t\t\t\t\texpanded = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tconst sanitize = (val) => (!Number.isFinite(val) ? -1 : val);\n\n\t\tthis.#range = {\n\t\t\tstartRow: sanitize(r1),\n\t\t\tstartCol: sanitize(c1),\n\t\t\tendRow: sanitize(r2),\n\t\t\tendCol: sanitize(c2)\n\t\t};\n\n\t\t//trace.log(this.#range);\n\n\t\tthis.render();\n\t}\n\n\tclear = () => {\n\t\tthis.#range = { startRow: -1, startCol: -1, endRow: -1, endCol: -1 };\n\t};\n\n\tget minRow() {\n\t\treturn this.#range.startRow;\n\t};\n\tget maxRow() {\n\t\treturn this.#range.endRow;\n\t};\n\tget minCol() {\n\t\treturn this.#range.startCol;\n\t};\n\tget maxCol() {\n\t\treturn this.#range.endCol;\n\t};\n\n\trefresh = () => {\n\t\tthis.render();\n\t}\n\n\trender = () => {\n\t\tconst { startRow, startCol, endRow, endCol } = this.#range;\n\n\t\tconst containers = this.#sheet.querySelectorAll(\n\t\t\t'.ng-container-left, .ng-container-body, .ng-container-right'\n\t\t);\n\n\t\tcontainers.forEach(container => {\n\t\t\tcontainer.querySelectorAll('.selected, .selected-top, .selected-bottom, .selected-left, .selected-right, .selected-start').forEach(el => {\n\t\t\t\tel.classList.remove('selected', 'selected-top', 'selected-bottom', 'selected-left', 'selected-right', 'selected-start');\n\t\t\t});\n\n\t\t\tcontainer.querySelectorAll('tr.selected-start').forEach(tr => {\n\t\t\t\ttr.classList.remove('selected-start');\n\t\t\t});\n\t\t});\n\n\t\tif (startRow < 0 || startCol < 0) return;\n\n\t\tcontainers.forEach((container) => {\n\t\t\tconst visibleTrs = Array.from(container.querySelectorAll('tbody tr')).filter(tr => {\n\t\t\t\treturn tr.style.display !== 'none';\n\t\t\t});\n\n\t\t\tvisibleTrs.forEach(tr => {\n\t\t\t\tconst { matrixRow } = this.#getMatrixRow(tr);\n\t\t\t\tif (matrixRow < 0) return;\n\n\n\t\t\t\tif (matrixRow >= startRow && matrixRow <= endRow) {\n\t\t\t\t\tcontainer.querySelectorAll(`tbody tr[data-index=\"${tr.dataset.index}\"]`).forEach(tr => {\n\t\t\t\t\t\ttr.classList.add('selected');\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t//trace.log(this.#sheet.view);\n\n\n\t\t\t\ttr.querySelectorAll('td, th').forEach(cell => {\n\t\t\t\t\tconst col = parseInt(cell.dataset.col, 10);\n\t\t\t\t\tif (isNaN(col)) return;\n\n\t\t\t\t\tconst rowSpan = parseInt(cell.rowSpan || 1, 10);\n\t\t\t\t\tconst colSpan = parseInt(cell.colSpan || 1, 10);\n\n\t\t\t\t\tconst cellEndRow = matrixRow + rowSpan - 1;\n\t\t\t\t\tconst cellEndCol = col + colSpan - 1;\n\n\t\t\t\t\tconst isSelected = cellEndRow >= startRow && matrixRow <= endRow && cellEndCol >= startCol && col <= endCol;\n\t\t\t\t\tif (!isSelected) return;\n\n\t\t\t\t\tcell.classList.add('selected');\n\n\t\t\t\t\tif (matrixRow <= startRow) cell.classList.add('selected-top');\n\t\t\t\t\tif (cellEndRow >= endRow) cell.classList.add('selected-bottom');\n\t\t\t\t\tif (col <= startCol) cell.classList.add('selected-left');\n\t\t\t\t\tif (cellEndCol >= endCol) cell.classList.add('selected-right');\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\t#initEvents() {\n\t\tconst mainZone = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!mainZone) {\n\t\t\treturn;\n\t\t}\n\n\t\tmainZone.addEventListener('mousedown', (e) => {\n\t\t\tif (e.button !== 0) return;\n\n\t\t\tconst cell = e.target.closest('td, th');\n\t\t\tif (!cell) return;\n\t\t\tif (cell.dataset.row === undefined || cell.dataset.col === undefined) return;\n\n\t\t\tthis.#sheet.style.userSelect = 'none';\n\t\t\tthis.#sheet.style.webkitUserSelect = 'none';\n\n\t\t\tconst tr = cell.closest('tr');\n\t\t\tconst { matrixRow: startRow } = this.#getMatrixRow(tr);\n\t\t\tconst startCol = parseInt(cell.dataset.col, 10);\n\n\t\t\tif (startRow < 0) {\n\t\t\t\tthis.#sheet.style.userSelect = '';\n\t\t\t\tthis.#sheet.style.webkitUserSelect = '';\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.setFocus(startRow, startCol);\n\t\t\tthis.setRange(startRow, startCol, startRow, startCol);\n\n\t\t\tlet lastMatrixRow = startRow;\n\t\t\tlet lastCol = startCol;\n\n\t\t\tconst onMouseMove = (moveEvent) => {\n\t\t\t\tconst targetEl = document.elementFromPoint(moveEvent.clientX, moveEvent.clientY);\n\t\t\t\tlet targetCell = targetEl?.closest('td, th');\n\n\t\t\t\tif (!targetCell || !this.#sheet.contains(targetCell)) {\n\t\t\t\t\tconst allCells = this.#sheet.querySelectorAll('.ng-sheet-body-content tbody tr td, .ng-sheet-body-content tbody tr:not(.nodata) th');\n\t\t\t\t\tfor (const c of allCells) {\n\t\t\t\t\t\tconst rect = c.getBoundingClientRect();\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tmoveEvent.clientX >= rect.left &&\n\t\t\t\t\t\t\tmoveEvent.clientX <= rect.right &&\n\t\t\t\t\t\t\tmoveEvent.clientY >= rect.top &&\n\t\t\t\t\t\t\tmoveEvent.clientY <= rect.bottom\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ttargetCell = c;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!targetCell) return;\n\t\t\t\tif (targetCell.dataset.row === undefined || targetCell.dataset.col === undefined) return;\n\n\t\t\t\tconst targetTr = targetCell.closest('tr');\n\t\t\t\tconst { matrixRow: endRow } = this.#getMatrixRow(targetTr);\n\t\t\t\tconst endCol = parseInt(targetCell.dataset.col, 10);\n\n\t\t\t\tif (endRow < 0) return;\n\t\t\t\tif (lastMatrixRow === endRow && lastCol === endCol) return;\n\n\t\t\t\tlastMatrixRow = endRow;\n\t\t\t\tlastCol = endCol;\n\n\t\t\t\tthis.setRange(startRow, startCol, endRow, endCol);\n\t\t\t};\n\n\t\t\tconst onMouseUp = () => {\n\t\t\t\tthis.#sheet.style.userSelect = '';\n\t\t\t\tthis.#sheet.style.webkitUserSelect = '';\n\n\t\t\t\tdocument.removeEventListener('mousemove', onMouseMove);\n\t\t\t\tdocument.removeEventListener('mouseup', onMouseUp);\n\t\t\t};\n\n\t\t\tdocument.addEventListener('mousemove', onMouseMove);\n\t\t\tdocument.addEventListener('mouseup', onMouseUp);\n\t\t});\n\t}\n}","import { trace } from \"@nopeer\";\n\nexport class CellNavigation {\n\t#sheet;\n\t#host;\n\n\t#currentCell = null;\n\t#currentTr = null;\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tthis.#initEvents();\n\t}\n\n\tget currentCell() {\n\t\treturn this.#currentCell;\n\t}\n\n\tset currentCell(cell) {\n\t\tif (!cell) return;\n\n\t\tthis.#currentCell = cell;\n\t\tcell.focus({ preventScroll: true });\n\n\t\tthis.#currentTr = cell.closest(\"tr\");\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tthis.#sheet.selection.setFocus(matrixRow, this.#currentCell.dataset.col);\n\t}\n\n\n\t#moveCellH = (e, cell) => {\n\n\t\tif (!cell) return;\n\n\t\tswitch (e.code) {\n\t\t\tcase \"Tab\":\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\tif (!this.#isCellLeftVisible(cell)) {\n\t\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (!this.#isCellRightVisible(cell)) {\n\t\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tif (!this.#isCellRightVisible(cell) || !this.#isCellLeftVisible(cell)) {\n\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowLeft\":\n\t\t\t\tif (!this.#isCellLeftVisible(cell)) {\n\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.currentCell = cell;\n\t\tthis.#sheet.selection.setRange(this.#currentTr.dataset.matrixRow, cell.dataset.col, this.#currentTr.dataset.matrixRow, cell.dataset.col);\n\t};\n\n\t#moveCellV = (e, cell) => {\n\t\tif (cell) {\n\t\t\tlet isVisible = false;\n\t\t\tswitch (e.code) {\n\t\t\t\tcase \"Enter\":\n\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\tif (this.#isCellBelowVisible(cell)) {\n\t\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (this.#isCellBelowVisible(cell)) {\n\t\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowDown\":\n\t\t\t\t\tif (this.#isCellBelowVisible(cell)) {\n\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowUp\":\n\t\t\t\t\tif (this.#isCellAboveVisible(cell)) {\n\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (isVisible) {\n\t\t\t\tthis.currentCell = cell;\n\t\t\t\tthis.#sheet.selection.setRange(this.#currentTr.dataset.matrixRow, cell.dataset.col, this.#currentTr.dataset.matrixRow, cell.dataset.col);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst dataIndex = parseInt(this.#currentTr.dataset.index, 10);\n\t\tlet scrollTopIndex = -1;\n\t\tswitch (e.code) {\n\t\t\tcase \"Enter\":\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\tconst visibleRowCount = this.#getVisibleRowCount();\n\t\t\t\t\tscrollTopIndex = Math.max(dataIndex - visibleRowCount + 0, 0);\n\t\t\t\t} else {\n\t\t\t\t\tscrollTopIndex = Math.min(dataIndex, this.#sheet.view.count());\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tscrollTopIndex = Math.min(dataIndex, this.#sheet.view.count());\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tconst visibleRowCount = this.#getVisibleRowCount();\n\t\t\t\tscrollTopIndex = Math.max(dataIndex - visibleRowCount + 0, 0);\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (scrollTopIndex < 0) return;\n\n\t\tlet matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst rowSpan = parseInt(this.#currentCell.rowSpan, 10) || 1;\n\n\t\tswitch (e.code) {\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tmatrixRow += rowSpan;\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tmatrixRow --;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.#sheet.rowManager.scrollToDataRow(scrollTopIndex, null, () => {\n\t\t\tconst currentCell = this.#findCell(matrixRow, col);\n\n\t\t\tif (currentCell) {\n\t\t\t\tthis.currentCell = currentCell;\n\t\t\t\tthis.#sheet.selection.setRange(this.#currentTr.dataset.matrixRow, currentCell.dataset.col, this.#currentTr.dataset.matrixRow, currentCell.dataset.col);\n\t\t\t}\n\t\t});\n\t}\n\n\tmoveCell = (e) => {\n\n\t\tif (e.target.tagName === \"INPUT\") {\n\t\t\tif ([\"text\"].includes(e.target.type)) {\n\t\t\t\tif ([\"ArrowLeft\",\"ArrowRight\",\"Home\",\"End\"].includes(e.code)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ([\"date\",\"datetime-local\",\"time\",\"week\",\"month\"].includes(e.target.type)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.#currentCell || !this.#currentTr) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet nextCell;\n\t\tswitch (e.code) {\n\t\t\tcase \"Tab\":\n\t\t\t\tnextCell = e.shiftKey ? this.#getPreviousCell() : this.#getNextCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tnextCell = this.#getNextCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowLeft\":\n\t\t\t\tnextCell = this.#getPreviousCell();\n\t\t\t\tbreak;\n\t\t\tcase \"Enter\":\n\t\t\t\tnextCell = e.shiftKey ? this.#getUpCell() : this.#getDownCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tnextCell = this.#getDownCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tnextCell = this.#getUpCell();\n\t\t\t\tbreak;\n\t\t}\n\n\t\te.preventDefault();\n\n\t\tif ([\"ArrowLeft\",\"ArrowRight\",\"Tab\"].includes(e.code)) {\n\t\t\tthis.#moveCellH(e, nextCell);\n\t\t}\n\t\telse if ([\"Enter\",\"ArrowUp\",\"ArrowDown\"].includes(e.code)) {\n\t\t\tthis.#moveCellV(e, nextCell);\n\t\t}\n\t}\n\n\t#getNextCell = () => {\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst colSpan = parseInt(this.#currentCell.colSpan, 10) || 1;\n\t\tconst dataIndex = parseInt(this.#currentTr.dataset.index, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tconst nextCol = col + colSpan;\n\n\t\tlet nextCell = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${nextCol}\"]`);\n\t\tif (!nextCell) {\n\t\t\tnextCell = this.#sheet.querySelector(`tbody tr[data-index=\"${dataIndex}\"] td[data-col=\"${nextCol}\"]`);\n\t\t}\n\n\t\treturn nextCell;\n\t}\n\n\t#getPreviousCell = () => {\n\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst dataIndex = parseInt(this.#currentTr.dataset.index, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tlet nextCell;\n\t\tfor (let i = col - 1; i >= 0; i--) {\n\t\t\tnextCell = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${i}\"]`);\n\t\t\tif (!nextCell) {\n\t\t\t\tnextCell = this.#sheet.querySelector(`tbody tr[data-index=\"${dataIndex}\"] td[data-col=\"${i}\"]`);\n\t\t\t}\n\n\t\t\tif (nextCell) break;\n\t\t}\n\n\t\treturn nextCell;\n\t}\n\n\n\n\t#findCell = (matrixRow, col) => {\n\n\t\tconst $tr = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"]`);\n\t\tif (!$tr) return;\n\n\t\tconst dataIndex = parseInt($tr.dataset.index, 10);\n\n\t\tlet targetCell = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${col}\"]`);\n\t\tif (!targetCell) {\n\t\t\tthis.#sheet.querySelectorAll(`tbody tr[data-matrix-row=\"${matrixRow}\"] td`).forEach($cell => {\n\t\t\t\tconst cellCol = parseInt($cell.dataset.col, 10);\n\t\t\t\tconst colSpan = parseInt($cell.colSpan, 10) || 1;\n\n\t\t\t\tif (col >= cellCol && col < cellCol + colSpan) {\n\t\t\t\t\ttargetCell = $cell;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (!targetCell) {\n\t\t\t\ttargetCell = this.#sheet.querySelector(`tbody tr[data-index=\"${dataIndex}\"] td[data-col=\"${col}\"]`);\n\n\t\t\t\tif (!targetCell) {\n\t\t\t\t\tthis.#sheet.querySelectorAll(`tbody tr[data-index=\"${dataIndex}\"] td`).forEach($cell => {\n\t\t\t\t\t\tconst cellCol = parseInt($cell.dataset.col, 10);\n\t\t\t\t\t\tconst colSpan = parseInt($cell.colSpan, 10) || 1;\n\n\t\t\t\t\t\tif (col >= cellCol && col < cellCol + colSpan) {\n\t\t\t\t\t\t\ttargetCell = $cell;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn targetCell;\n\t}\n\n\t#getUpCell = () => {\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\treturn this.#findCell(matrixRow - 1, col);\n\t}\n\n\t#getDownCell = () => {\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\t\tconst rowSpan = parseInt(this.#currentCell.rowSpan, 10) || 1;\n\n\t\treturn this.#findCell(matrixRow + rowSpan, col);\n\t}\n\n\t// 1. ์์ชฝ ์๋ฆผ ์ฒดํฌ (๊ธฐ์ค: bodyViewport)\n\t#isCellAboveVisible = (cell) => {\n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!bodyViewport || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport.getBoundingClientRect();\n\t\tconst theadHeight = bodyViewport.querySelector('thead')?.offsetHeight || 0;\n\n\t\t// ์
์ ์๋จ์ด ํค๋ ์๋์ชฝ๋ณด๋ค ์์ ์์ผ๋ฉด ์๋ฆฐ(์ ๋ณด์ด๋) ์ํ\n\t\treturn cellRect.top >= (viewportRect.top + theadHeight);\n\t}\n\n\t// 2. ์๋์ชฝ ์๋ฆผ ์ฒดํฌ (๊ธฐ์ค: bodyViewport)\n\t#isCellBelowVisible = (cell) => {\n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!bodyViewport || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport.getBoundingClientRect();\n\n\t\t// ์
์ ํ๋จ์ด ๋ทฐํฌํธ ํ๋จ๋ณด๋ค ์๋์ ์์ผ๋ฉด ์๋ฆฐ ์ํ\n\t\treturn cellRect.bottom <= viewportRect.bottom;\n\t}\n\n\t// 3. ์ผ์ชฝ ์๋ฆผ ์ฒดํฌ (๊ธฐ์ค: bodyViewport2)\n\t#isCellLeftVisible = (cell) => {\n\t\tconst bodyViewport2 = this.#sheet.querySelector('.ng-container-body'); // ๋๋ ์ข์ฐ ์คํฌ๋กค์ ๋ด๋นํ๋ ๋ทฐํฌํธ\n\t\tif (!bodyViewport2 || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport2.getBoundingClientRect();\n\n\t\t// ์
์ ์ข์ธก์ด ๋ทฐํฌํธ ์ข์ธก๋ณด๋ค ์ผ์ชฝ์ ์์ผ๋ฉด ์๋ฆฐ ์ํ\n\t\treturn cellRect.left >= viewportRect.left;\n\t}\n\n\t// 4. ์ค๋ฅธ์ชฝ ์๋ฆผ ์ฒดํฌ (๊ธฐ์ค: bodyViewport2)\n\t#isCellRightVisible = (cell) => {\n\t\tconst bodyViewport2 = this.#sheet.querySelector('.ng-container-body');\n\t\tif (!bodyViewport2 || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport2.getBoundingClientRect();\n\n\t\t// ์
์ ์ฐ์ธก์ด ๋ทฐํฌํธ ์ฐ์ธก๋ณด๋ค ์ค๋ฅธ์ชฝ์ ์์ผ๋ฉด ์๋ฆฐ ์ํ\n\t\treturn cellRect.right <= viewportRect.right;\n\t}\n\n\t// ๐ก ํ์ํ๋ค๋ฉด ์ด 4๊ฐ๋ฅผ ์กฐํฉํด์ ์ ์ฒด ๊ฐ์์ฑ์ ํ๋จํ๋ ํตํฉ ํจ์๋ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.\n\t#isCellVisible = (cell) => {\n\t\treturn this.#isCellAboveVisible(cell) &&\n\t\t\tthis.#isCellBelowVisible(cell) &&\n\t\t\tthis.#isCellLeftVisible(cell) &&\n\t\t\tthis.#isCellRightVisible(cell);\n\t}\n\n\t#getVisibleRowCount = () => {\n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tconst viewportHeight = bodyViewport.clientHeight - (bodyViewport.querySelector('thead')?.offsetHeight || 0);\n\t\tconst rowHeight = this.#sheet.rowManager.getRowHeight();\n\n\t\t// ๋ทฐํฌํธ ๋์ด์ ๋ค์ด์ค๋ ํ ๊ฐ์ ๊ณ์ฐ (์์์ ๋ฒ๋ฆผ)\n\t\treturn Math.max(1, Math.floor(viewportHeight / rowHeight));\n\t}\n\n\t#initEvents() {\n\t\tthis.#sheet.addEventListener('mousedown', (e) => {\n\t\t\tif (e.button !== 0) return;\n\t\t\tconst cell = e.target.closest('td, th');\n\t\t\tif (!cell) return;\n\t\t\tif (cell.dataset.index === undefined || cell.dataset.col === undefined) return;\n\n\t\t\tif (cell.querySelector(\"cell-row-indicator\")) {\n\t\t\t\tthis.#sheet.row.focus(cell.dataset.index);\n\t\t\t} else {\n\t\t\t\tthis.currentCell = cell;\n\t\t\t}\n\t\t});\n\n\t\tthis.#sheet.addEventListener('keydown', (e) => {\n\n\t\t\tconst cell = e.target.closest('td,th');\n\t\t\tif (!cell || !this.#sheet.contains(cell)) return;\n\n\t\t\tif (this.#host.tagName === 'NINE-TABLE-SIMPLE') {\n\t\t\t\tif ([\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].includes(e.code)) {\n\t\t\t\t\tthis.moveCell(e);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ([\"Enter\", \"Tab\", \"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].includes(e.code)) {\n\t\t\t\t\tthis.moveCell(e);\n\t\t\t\t} else if ([\"Space\"].includes(e.code)) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}","// ui/col/ColResizer.js\nimport { trace } from \"@nopeer\";\nimport { COLLAPSED_WIDTH } from \"@/layout/core/TableCompiler.js\";\n\nconst RESIZE_OFFSET = 2; // ๐ฏ ๋ฆฌ์ฌ์ด์ฆ ๊ฐ์ง ์์ญ ์คํ์
์ ์๋จ์ผ๋ก ์ถ์ถ\n\nexport class ColResizer {\n #sheet;\n #host;\n #panel;\n #tooltip;\n\n #targetColIndex = null;\n #nextColIndex = null;\n #targetContainerType = null;\n #targetCell = null;\n #startX = 0;\n #startColWidth = 0;\n #nextColStartWidth = 0;\n #startCellWidth = 0;\n #startLeft = 0;\n\n constructor(sheet) {\n this.#sheet = sheet;\n this.#host = sheet.getRootNode().host;\n this.#panel = this.#sheet.querySelector('nine-table-col-resizer-panel');\n\n this.#tooltip = this.#panel.querySelector('.resizer-overlay');\n this.bindEvents();\n }\n\n destroy() {\n this.#sheet.removeEventListener('pointermove', this.#onPointerMove);\n this.#sheet.removeEventListener('pointerdown', this.#onPointerDown);\n this.#sheet.removeEventListener('dblclick', this.#onDblClick);\n }\n\n refreshLayout(containerType = 'body') {\n const containers = Array.from(this.#sheet.querySelectorAll(`.ng-container-${containerType}`));\n if (containers.length === 0) return;\n\n const isFixedContainer = containerType === 'left' || containerType === 'right';\n const isAutoFit = !isFixedContainer && (\n this.#sheet.isAutoFitCol ||\n containers[0].querySelector('table')?.getAttribute('auto-fit-col') === 'true'\n );\n\n if (!isAutoFit) {\n\n const firstColgroup = containers[0].querySelector('table colgroup');\n if (!firstColgroup) return;\n\n let totalWidth = 0;\n const colWidths = {};\n\n Array.from(firstColgroup.querySelectorAll('col')).forEach(col => {\n const colIdx = col.getAttribute('data-col');\n const w = parseInt(col.getAttribute('width'), 10);\n if (!isNaN(w)) {\n colWidths[colIdx] = w;\n totalWidth += w;\n }\n });\n\n containers.forEach(container => {\n const tables = container.querySelectorAll('table');\n\n if (containerType === 'body') {\n tables.forEach(tbl => {\n tbl.style.width = `${totalWidth}px`;\n //tbl.style.minWidth = `${totalWidth}px`;\n });\n } else {\n container.style.flex = `0 0 ${totalWidth}px`;\n container.style.width = `${totalWidth}px`;\n container.style.minWidth = `${totalWidth}px`;\n container.style.maxWidth = `${totalWidth}px`;\n\n tables.forEach(tbl => {\n tbl.style.width = `${totalWidth}px`;\n tbl.style.minWidth = `${totalWidth}px`;\n tbl.style.maxWidth = `${totalWidth}px`;\n\n Object.entries(colWidths).forEach(([colIdx, w]) => {\n tbl.querySelectorAll(`th[data-col=\"${colIdx}\"], td[data-col=\"${colIdx}\"]`).forEach(cell => {\n //cell.style.width = `${w}px`;\n //cell.style.minWidth = `${w}px`;\n //cell.style.maxWidth = `${w}px`;\n });\n });\n });\n }\n });\n } else {\n containers.forEach(container => {\n const tables = container.querySelectorAll('table');\n tables.forEach(tbl => {\n //tbl.style.width = '100%';\n //tbl.style.minWidth = '100%';\n //tbl.style.maxWidth = '';\n });\n });\n }\n\n this.#sheet.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n setColumnWidth(globalColIndex, width, containerType = null) {\n\n let targetCols = [];\n\n targetCols = Array.from(this.#sheet.querySelectorAll(`table colgroup col[data-col=\"${globalColIndex}\"]`));\n\n if (targetCols.length === 0) return;\n\n const firstContainer = targetCols[0].closest('.ng-container-left, .ng-container-body, .ng-container-right');\n const resolvedContainerType = containerType || (\n firstContainer?.classList.contains('ng-container-left') ? 'left' :\n firstContainer?.classList.contains('ng-container-right') ? 'right' : 'body'\n );\n\n targetCols.forEach(col => {\n col.setAttribute('width', width);\n col.style.width = `${width}px`;\n });\n\n const sourceCol = this.#sheet.sourceTable?.querySelector(`colgroup col[data-col=\"${globalColIndex}\"]`);\n if (sourceCol) {\n sourceCol.setAttribute('width', width);\n sourceCol.style.width = `${width}px`;\n }\n\n this.refreshLayout(resolvedContainerType);\n\n if (resolvedContainerType === 'left' || resolvedContainerType === 'right') {\n this.refreshLayout('body');\n }\n\n this.#sheet.rowManager?.refresh();\n }\n\n #checkIsAutoFit(targetCell) {\n if (this.#sheet.isAutoFitCol) return true;\n const table = targetCell?.closest('table');\n if (table && table.getAttribute('auto-fit-col') === 'true') return true;\n return false;\n }\n\n bindEvents() {\n this.#sheet.addEventListener('pointermove', this.#onPointerMove);\n //this.#sheet.addEventListener('pointerdown', this.#onPointerDown);\n //this.#sheet.addEventListener('dblclick', this.#onDblClick);\n\n this.#sheet.addDebounseEventListener('dblclick', this.#onDblClick, 'pointerdown', this.#onPointerDown);\n }\n\n #getContainerType(cell) {\n const container = cell.closest('.ng-container-left, .ng-container-body, .ng-container-right');\n if (!container) return null;\n if (container.classList.contains('ng-container-left')) return 'left';\n if (container.classList.contains('ng-container-right')) return 'right';\n return 'body';\n }\n\n #onPointerMove = (e) => {\n\n\n const headerPart = e.target.closest('thead');\n if (!headerPart) return;\n\n const cell = e.target.closest('th, td');\n\n headerPart.querySelectorAll('.resizable-edge').forEach(el => {\n if (el !== cell) el.classList.remove('resizable-edge');\n });\n\n if (!cell || cell.dataset.col === undefined) return;\n if (cell.getAttribute('collapsed') === 'true') return;\n\n const rect = cell.getBoundingClientRect();\n const offsetX = e.clientX - rect.left;\n const isLeftEdge = offsetX <= RESIZE_OFFSET;\n const isRightEdge = (rect.width - offsetX) <= RESIZE_OFFSET;\n\n if (isLeftEdge) {\n const prevCell = cell.previousElementSibling;\n if (!prevCell || prevCell.getAttribute('collapsed') === 'true') {\n cell.classList.remove('resizable-edge');\n return;\n }\n }\n\n if (isLeftEdge || isRightEdge) {\n cell.classList.add('resizable-edge');\n } else {\n cell.classList.remove('resizable-edge');\n }\n };\n\n #onPointerDown = (e) => {\n\n const headerPart = e.actualTarget.closest('thead');\n if (!headerPart) return;\n\n const cell = e.actualTarget.closest('th, td');\n\n if (!cell || !cell.classList.contains('resizable-edge')) return;\n\n\n\n e.preventDefault();\n const rect = cell.getBoundingClientRect();\n const offsetX = e.clientX - rect.left;\n\n let targetCell = cell;\n\n if (offsetX <= RESIZE_OFFSET) {\n const prevCell = cell.previousElementSibling;\n if (prevCell && prevCell.dataset.col !== undefined && prevCell.getAttribute('collapsed') !== 'true') {\n targetCell = prevCell;\n } else if (!cell.previousElementSibling) {\n return;\n }\n }\n\n this.#targetCell = targetCell;\n this.#targetContainerType = this.#getContainerType(targetCell);\n\n const container = this.#sheet.querySelector(`.ng-container-${this.#targetContainerType}`);\n if (!container) return;\n\n const baseColIndex = parseInt(targetCell.dataset.col, 10);\n const colSpan = targetCell.colSpan || 1;\n this.#targetColIndex = baseColIndex + colSpan - 1;\n\n const isAutoFit = this.#checkIsAutoFit(targetCell);\n if (isAutoFit) {\n this.#nextColIndex = this.#targetColIndex + 1;\n const nextColEl = container.querySelector(`col[data-col=\"${this.#nextColIndex}\"]`);\n if (nextColEl) {\n this.#nextColStartWidth = parseInt(nextColEl.getAttribute('width'), 10) || 100;\n } else {\n this.#nextColIndex = null;\n }\n } else {\n this.#nextColIndex = null;\n }\n\n const targetRect = targetCell.getBoundingClientRect();\n const sheetRect = this.#sheet.getBoundingClientRect();\n\n this.#startCellWidth = targetRect.width;\n this.#startLeft = targetRect.left - sheetRect.left;\n\n const targetColEl = container.querySelector(`col[data-col=\"${this.#targetColIndex}\"]`);\n const attrW = targetColEl?.getAttribute('width');\n this.#startColWidth = (attrW && !isNaN(parseInt(attrW, 10))) ? parseInt(attrW, 10) : targetRect.width / colSpan;\n\n this.#startX = e.clientX;\n\n if (this.#panel) {\n this.#panel.classList.add('active');\n this.#updatePositions(e.clientX);\n }\n\n window.addEventListener('pointermove', this.#onDragMove);\n window.addEventListener('pointerup', this.#onDragEnd, { once: true });\n };\n\n #updatePositions(clientX) {\n let diff = clientX - this.#startX;\n const isAutoFit = this.#checkIsAutoFit(this.#targetCell);\n\n if (isAutoFit && this.#nextColIndex !== null) {\n const maxDiff = this.#nextColStartWidth - COLLAPSED_WIDTH;\n const minDiff = -(this.#startColWidth - COLLAPSED_WIDTH);\n diff = Math.max(minDiff, Math.min(diff, maxDiff));\n }\n\n const currentColWidth = Math.max(COLLAPSED_WIDTH, this.#startColWidth + diff);\n\n const targetRect = this.#targetCell.getBoundingClientRect();\n let realCellWidth = clientX - targetRect.left;\n\n if (isAutoFit && this.#nextColIndex !== null) {\n const maxCellWidth = this.#startCellWidth + (this.#nextColStartWidth - COLLAPSED_WIDTH);\n realCellWidth = Math.min(realCellWidth, maxCellWidth);\n }\n\n const currentCellWidth = Math.max(COLLAPSED_WIDTH, realCellWidth);\n\n if (this.#panel) {\n this.#panel.style.setProperty('--col-resizer-tooltip-left', `${this.#startLeft}px`);\n this.#panel.style.setProperty('--col-resizer-tooltip-width', `${currentCellWidth}px`);\n }\n\n const sizeBadge = this.#tooltip?.querySelector('.size-badge');\n if (sizeBadge) {\n sizeBadge.textContent = `${Math.round(currentColWidth)}px`;\n }\n }\n\n #onDragMove = (e) => {\n this.#updatePositions(e.clientX);\n };\n\n #onDragEnd = (e) => {\n window.removeEventListener('pointermove', this.#onDragMove);\n\n const diff = e.clientX - this.#startX;\n const isAutoFit = this.#checkIsAutoFit(this.#targetCell);\n let finalWidth = 0;\n\n if (isAutoFit && this.#nextColIndex !== null) {\n let newColWidth = Math.max(COLLAPSED_WIDTH, this.#startColWidth + diff);\n let newNextWidth = this.#startColWidth + this.#nextColStartWidth - newColWidth;\n\n if (newNextWidth < COLLAPSED_WIDTH) {\n newNextWidth = COLLAPSED_WIDTH;\n newColWidth = this.#startColWidth + this.#nextColStartWidth - COLLAPSED_WIDTH;\n }\n\n this.setColumnWidth(this.#targetColIndex, newColWidth, this.#targetContainerType);\n this.setColumnWidth(this.#nextColIndex, newNextWidth, this.#targetContainerType);\n finalWidth = newColWidth;\n } else {\n const newColWidth = Math.max(COLLAPSED_WIDTH, this.#startColWidth + diff);\n if (this.#targetColIndex !== null && this.#targetContainerType) {\n this.setColumnWidth(this.#targetColIndex, newColWidth, this.#targetContainerType);\n finalWidth = newColWidth;\n }\n }\n\n if (this.#targetCell) {\n const targetCell = this.#targetCell;\n if (targetCell.getAttribute('collapsed') !== 'true' && finalWidth > 20) {\n targetCell.dataset.expandWidth = String(finalWidth);\n }\n }\n\n if (this.#panel) {\n this.#tooltip?.classList.add('fade-out');\n setTimeout(() => {\n this.#panel.classList.remove('active');\n this.#tooltip?.classList.remove('fade-out');\n }, 150);\n }\n\n this.#targetColIndex = null;\n this.#nextColIndex = null;\n this.#targetContainerType = null;\n this.#targetCell = null;\n };\n\n #onDblClick = (e) => {\n\n const targetEl = e.target;\n let cell = targetEl.closest('th, td');\n if (!cell || !cell.classList.contains('resizable-edge')) return;\n\n const rect = cell.getBoundingClientRect();\n const offsetX = e.clientX - rect.left;\n\n if (offsetX <= RESIZE_OFFSET) {\n cell = cell.previousElementSibling;\n }\n\n const baseColIndex = parseInt(cell.dataset.col, 10);\n const tbodyCell = this.#sheet.querySelector(`tbody.body [data-col=\"${baseColIndex}\"]`);\n if (!tbodyCell || !tbodyCell.dataset.bind || tbodyCell.classList.contains(\"CELL-RADIO\")) return;\n\n let extraPadding = 0;\n Array.from(tbodyCell.firstElementChild.children).forEach(($el) => {\n switch ($el.tagName) {\n case 'SPAN': extraPadding += 8; break;\n case 'DIV': extraPadding += 8; break;\n case 'BUTTON': extraPadding += 32; break;\n case 'SELECT': extraPadding += 32; break;\n case 'INPUT':\n switch (($el.type || 'text').toLowerCase()) {\n // 1. ์ฒดํฌ๋ฐ์ค / ๋ผ๋์ค (๋น๊ต์ ์ข์ ์์ญ)\n case 'checkbox':\n case 'radio':\n extraPadding += 12;\n break;\n\n // 2. ๋ฒํผ ๊ณ์ด input\n case 'button':\n case 'submit':\n case 'reset':\n case 'image':\n extraPadding += 16;\n break;\n\n // 3. ํน์ ์์ ฏ (์ปฌ๋ฌ, ํ์ผ, ์ฌ๋ผ์ด๋)\n case 'color':\n case 'file':\n case 'range':\n extraPadding += 24;\n break;\n\n // 4. ํ๋ฉด์ ์ ๋ณด์ด๋ hidden ํ๋\n case 'hidden':\n extraPadding += 0;\n break;\n\n // 5. ํ
์คํธ ๋ฐ ์ซ์, ๋ ์ง ๋ฑ ์ผ๋ฐ ์
๋ ฅ ํ๋ (๊ธฐ๋ณธ๊ฐ)\n case 'text':\n case 'search':\n case 'tel':\n case 'url':\n case 'email':\n case 'password':\n case 'number':\n case 'date':\n case 'time':\n case 'datetime-local':\n case 'month':\n case 'week':\n default:\n extraPadding += 16;\n break;\n }\n break;\n }\n });\n\n const fieldIdx = this.#host.fields.get().indexOf(tbodyCell.dataset.bind);\n\n const computedStyle = window.getComputedStyle(tbodyCell);\n const font = computedStyle.font || '12px sans-serif';\n\n const headerText = cell.innerText || \"\";\n const headerSize = nine.measureTextSize(headerText, font);\n let maxTextWidth = (headerSize.width || 0) + 16;\n\n this.#host.execute(() => {\n\n this.#sheet.view.getArray().forEach((record, idx) => {\n const val = String(tbodyCell.dataset.expr ? this.#host.exprEngine.evaluate(tbodyCell.dataset.expr, record, idx) : record.v[fieldIdx] ?? \"\").trim();\n const size = nine.measureTextSize(val, font);\n if (size.width && size.width > maxTextWidth) {\n maxTextWidth = size.width;\n }\n });\n\n const calculatedWidth = Math.max(32, Math.min(400, Math.ceil(maxTextWidth) + extraPadding));\n\n this.setColumnWidth(tbodyCell.dataset.col, calculatedWidth, this.#getContainerType(cell));\n })\n };\n}\n\n\nexport class ColResizerPanel extends HTMLElement {\n #target;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n\n this.#renderer();\n }\n\n #renderer = () => {\n this.innerHTML = `\n <div class=\"resizer-overlay\">\n <span class=\"size-badge\">0px</span>\n </div>\n `;\n };\n}\n\nif (!customElements.get('nine-table-col-resizer-panel')) {\n customElements.define(\"nine-table-col-resizer-panel\", ColResizerPanel);\n}\n","// ui/col/ColMover.js\nimport { trace } from \"@nopeer\";\n\nexport class ColMover {\n #sheet;\n #grip;\n #indi;\n\n #isDragging = false;\n #sourceCell = null;\n #sourceColIndex = null;\n #targetColIndex = null;\n #shiftX = 0;\n #timer = null;\n\n constructor(sheet) {\n this.#sheet = sheet;\n this.#grip = this.#sheet.querySelector('.ng-col-mover-grip');\n this.#indi = this.#sheet.querySelector('.ng-col-mover-indi');\n this.bindEvents();\n }\n\n bindEvents() {\n this.#sheet.addEventListener('pointerdown', this.#onPointerDown);\n }\n\n #checkIsMovable() {\n const host = this.#sheet.getRootNode()?.host;\n return this.#sheet.getAttribute('col-movable') === 'true' || host?.getAttribute('col-movable') === 'true';\n }\n\n #getDeepElementFromPoint(x, y) {\n const root = this.#sheet.getRootNode();\n let el = root.elementFromPoint ? root.elementFromPoint(x, y) : document.elementFromPoint(x, y);\n\n while (el && el.shadowRoot && el.shadowRoot.elementFromPoint) {\n const nested = el.shadowRoot.elementFromPoint(x, y);\n if (!nested || nested === el) break;\n el = nested;\n }\n\n return el;\n }\n\n #getColGroupRange(cell) {\n if (!cell || cell.dataset.col === undefined) return null;\n\n const startCol = parseInt(cell.dataset.col, 10);\n const colSpan = cell.colSpan || 1;\n const endCol = startCol + colSpan - 1;\n const rowIndex = cell.closest('tr')?.sectionRowIndex ?? 0;\n\n const table = cell.closest('table');\n if (!table) return { startCol, colSpan, endCol, rowIndex, isGroup: false, parentGroupRange: null, isValidGroup: true };\n\n const headerCells = table.querySelectorAll('thead th, thead td');\n let hasStrictChildren = false;\n let isValidGroup = true;\n let parentGroupRange = null;\n\n for (const subCell of headerCells) {\n if (subCell === cell || subCell.dataset.col === undefined) continue;\n\n const subStart = parseInt(subCell.dataset.col, 10);\n const subSpan = subCell.colSpan || 1;\n const subEnd = subStart + subSpan - 1;\n const subRowIndex = subCell.closest('tr')?.sectionRowIndex ?? 0;\n\n if (subRowIndex < rowIndex && subStart <= startCol && subEnd >= endCol && subSpan > colSpan) {\n if (!parentGroupRange) {\n parentGroupRange = { startCol: subStart, endCol: subEnd };\n } else {\n parentGroupRange.startCol = Math.max(parentGroupRange.startCol, subStart);\n parentGroupRange.endCol = Math.min(parentGroupRange.endCol, subEnd);\n }\n }\n\n const isOverlap = !(subEnd < startCol || subStart > endCol);\n if (isOverlap) {\n const isFullyContained = (subStart >= startCol && subEnd <= endCol);\n\n if (isFullyContained) {\n if (subSpan < colSpan) {\n hasStrictChildren = true;\n }\n } else if (subStart < startCol || subEnd > endCol) {\n if (!(subStart <= startCol && subEnd >= endCol)) {\n isValidGroup = false;\n }\n }\n }\n }\n\n const isRealGroup = hasStrictChildren && isValidGroup;\n\n return {\n startCol,\n colSpan: isRealGroup ? colSpan : 1,\n endCol: isRealGroup ? endCol : startCol,\n rowIndex,\n isGroup: isRealGroup,\n parentGroupRange,\n isValidGroup\n };\n }\n\n #createGroupHeaderPreview(cell) {\n const groupRange = this.#getColGroupRange(cell);\n if (!groupRange) return null;\n\n const { startCol, endCol, isGroup } = groupRange;\n\n // ํต์ฌ: ํ
์ด๋ธ์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ตฌ์กฐ์ด๋ฏ๋ก cell์ด ์ํ ๋ฐ๋ก ๊ทธ ํ
์ด๋ธ์ ์ง์ ๊ฐ์ ธ์ต๋๋ค.\n const origTable = cell.closest('table');\n if (!origTable) return null;\n\n let minLeft = Infinity, maxRight = -Infinity, minTop = Infinity, maxBottom = -Infinity;\n const targetCells = [];\n\n origTable.querySelectorAll('thead th, thead td').forEach(c => {\n if (c.dataset.col === undefined) return;\n const cCol = parseInt(c.dataset.col, 10);\n const cSpan = c.colSpan || 1;\n const cEnd = cCol + cSpan - 1;\n\n const isTarget = isGroup\n ? (cCol >= startCol && cEnd <= endCol)\n : (c === cell);\n\n if (isTarget) {\n const rect = c.getBoundingClientRect();\n minLeft = Math.min(minLeft, rect.left);\n maxRight = Math.max(maxRight, rect.right);\n minTop = Math.min(minTop, rect.top);\n maxBottom = Math.max(maxBottom, rect.bottom);\n\n const computedStyle = window.getComputedStyle(c);\n targetCells.push({ el: c, rect, style: computedStyle });\n }\n });\n\n if (targetCells.length === 0) return null;\n\n const groupWidth = maxRight - minLeft;\n const groupHeight = maxBottom - minTop;\n\n const headerContent = document.createElement('div');\n headerContent.className = 'grip-header-content';\n headerContent.style.position = 'relative';\n headerContent.style.width = `${groupWidth}px`;\n headerContent.style.height = `${groupHeight}px`;\n\n targetCells.forEach(({ el, rect, style }) => {\n const clonedCell = el.cloneNode(true);\n\n clonedCell.style.position = 'absolute';\n clonedCell.style.left = `${rect.left - minLeft}px`;\n clonedCell.style.top = `${rect.top - minTop}px`;\n\n clonedCell.style.width = `${rect.width}px`;\n clonedCell.style.minWidth = `${rect.width}px`;\n clonedCell.style.maxWidth = 'none';\n\n clonedCell.style.height = `${rect.height}px`;\n clonedCell.style.boxSizing = 'border-box';\n clonedCell.style.margin = '0';\n\n clonedCell.style.backgroundColor = style.backgroundColor !== 'transparent' && style.backgroundColor !== 'rgba(0, 0, 0, 0)'\n ? style.backgroundColor\n : '#f9fafb';\n clonedCell.style.color = style.color;\n clonedCell.style.font = style.font;\n clonedCell.style.fontWeight = style.fontWeight;\n clonedCell.style.fontSize = style.fontSize;\n clonedCell.style.textAlign = style.textAlign;\n clonedCell.style.padding = style.padding;\n clonedCell.style.border = style.border;\n clonedCell.style.borderRight = style.borderRight;\n clonedCell.style.borderBottom = style.borderBottom;\n clonedCell.style.display = 'flex';\n clonedCell.style.alignItems = 'center';\n clonedCell.style.justifyContent = style.textAlign === 'center' ? 'center' : (style.textAlign === 'right' ? 'flex-end' : 'flex-start');\n\n headerContent.appendChild(clonedCell);\n });\n\n return {\n element: headerContent,\n bounds: {\n left: minLeft,\n right: maxRight,\n top: minTop,\n bottom: maxBottom,\n width: groupWidth,\n height: groupHeight\n }\n };\n }\n\n #onPointerDown = (e) => {\n if (!this.#checkIsMovable()) return;\n\n const headerPart = e.target.closest('.ng-sheet-header');\n if (!headerPart) return;\n\n const cell = e.target.closest('th, td');\n if (!cell || cell.classList.contains('resizable-edge') || ['INPUT', 'BUTTON'].includes(e.target.tagName)) return;\n if (cell.dataset.col === undefined) return;\n\n e.preventDefault();\n\n const startX = e.clientX;\n const startY = e.clientY;\n\n const cancelTimer = () => {\n if (this.#timer) {\n clearTimeout(this.#timer);\n this.#timer = null;\n }\n window.removeEventListener('pointermove', onPointerMovePending);\n window.removeEventListener('pointerup', cancelTimer);\n window.removeEventListener('pointercancel', cancelTimer);\n };\n\n const onPointerMovePending = (moveEvent) => {\n const dist = Math.hypot(moveEvent.clientX - startX, moveEvent.clientY - startY);\n if (dist > 5) {\n cancelTimer();\n }\n };\n\n this.#timer = setTimeout(() => {\n cancelTimer();\n this.#startDrag(e, cell);\n }, 500);\n\n window.addEventListener('pointermove', onPointerMovePending);\n window.addEventListener('pointerup', cancelTimer, { once: true });\n window.addEventListener('pointercancel', cancelTimer, { once: true });\n };\n\n #startDrag(e, cell) {\n if (this.#isDragging) return;\n\n const preview = this.#createGroupHeaderPreview(cell);\n if (!preview) return;\n\n this.#isDragging = true;\n this.#sourceCell = cell;\n this.#sourceColIndex = parseInt(cell.dataset.col, 10);\n\n const sheetRect = this.#sheet.getBoundingClientRect();\n const { bounds, element } = preview;\n\n this.#shiftX = e.clientX - bounds.left;\n\n if (this.#grip) {\n this.#grip.replaceChildren(element);\n\n const relativeTop = bounds.top - sheetRect.top;\n const fullHeight = sheetRect.height - relativeTop;\n\n this.#grip.style.width = `${bounds.width}px`;\n this.#grip.style.height = `${fullHeight}px`;\n this.#grip.style.top = `${relativeTop}px`;\n this.#grip.style.display = 'block';\n\n this.#updateGripPosition(e.clientX);\n }\n\n document.body.style.cursor = 'move';\n\n window.addEventListener('pointermove', this.#onPointerMove);\n window.addEventListener('pointerup', this.#onPointerUp, { once: true });\n }\n\n #onPointerMove = (e) => {\n if (!this.#isDragging) return;\n\n this.#updateGripPosition(e.clientX);\n\n if (this.#grip) this.#grip.style.pointerEvents = 'none';\n if (this.#indi) this.#indi.style.pointerEvents = 'none';\n\n const targetElement = this.#getDeepElementFromPoint(e.clientX, e.clientY);\n const targetCell = targetElement?.closest('.ng-sheet-header th, .ng-sheet-header td');\n\n if (targetCell && targetCell.dataset.col !== undefined) {\n const targetColIndex = parseInt(targetCell.dataset.col, 10);\n const sheetRect = this.#sheet.getBoundingClientRect();\n const table = targetCell.closest('table');\n\n let colMinLeft = Infinity;\n let colMaxRight = -Infinity;\n\n if (table) {\n table.querySelectorAll('thead th, thead td').forEach(c => {\n if (c.dataset.col === undefined) return;\n const cCol = parseInt(c.dataset.col, 10);\n const cSpan = c.colSpan || 1;\n const cEnd = cCol + cSpan - 1;\n\n if (cCol <= targetColIndex && cEnd >= targetColIndex) {\n const cRect = c.getBoundingClientRect();\n colMinLeft = Math.min(colMinLeft, cRect.left);\n colMaxRight = Math.max(colMaxRight, cRect.right);\n }\n });\n }\n\n if (colMinLeft === Infinity) {\n const rect = targetCell.getBoundingClientRect();\n colMinLeft = rect.left;\n colMaxRight = rect.right;\n }\n\n const midX = colMinLeft + ((colMaxRight - colMinLeft) / 2);\n let calculatedTargetCol = 0;\n let indicatorLeft = 0;\n\n if (e.clientX < midX) {\n calculatedTargetCol = targetColIndex;\n indicatorLeft = colMinLeft - sheetRect.left;\n } else {\n const colSpan = targetCell.colSpan || 1;\n calculatedTargetCol = targetColIndex + colSpan;\n indicatorLeft = colMaxRight - sheetRect.left;\n }\n\n const sourceGroup = this.#getColGroupRange(this.#sourceCell);\n const movingSpan = sourceGroup.colSpan;\n\n const sourceRowStart = sourceGroup.rowIndex;\n const sourceRowSpan = this.#sourceCell.rowSpan || 1;\n const sourceRowEnd = sourceRowStart + sourceRowSpan - 1;\n\n const targetRowStart = targetCell.closest('tr')?.sectionRowIndex ?? 0;\n const targetRowSpan = targetCell.rowSpan || 1;\n const targetRowEnd = targetRowStart + targetRowSpan - 1;\n\n const isRowSpanCompatible = !(sourceRowEnd < targetRowStart || sourceRowStart > targetRowEnd);\n\n let isOutOfBoundsOfParent = false;\n if (sourceGroup.parentGroupRange) {\n const { startCol: pStart, endCol: pEnd } = sourceGroup.parentGroupRange;\n if (calculatedTargetCol < pStart || (calculatedTargetCol + movingSpan - 1) > pEnd) {\n isOutOfBoundsOfParent = true;\n }\n }\n\n let isDroppingInsideOtherGroup = false;\n if (table) {\n const spannedCells = table.querySelectorAll('thead th[colspan], thead td[colspan]');\n\n for (const sCell of spannedCells) {\n if (sCell === this.#sourceCell) continue;\n\n const sRowStart = sCell.closest('tr')?.sectionRowIndex ?? 0;\n const sRowSpan = sCell.rowSpan || 1;\n const sRowEnd = sRowStart + sRowSpan - 1;\n\n const isVerticalOverlap = !(sourceRowEnd < sRowStart || sourceRowStart > sRowEnd);\n if (!isVerticalOverlap) continue;\n\n const sStart = parseInt(sCell.dataset.col, 10);\n const sSpan = sCell.colSpan || 1;\n const sEnd = sStart + sSpan - 1;\n\n if (calculatedTargetCol > sStart && calculatedTargetCol < sEnd + 1) {\n isDroppingInsideOtherGroup = true;\n break;\n }\n\n const moveEndCol = calculatedTargetCol + movingSpan - 1;\n const isCrossIntersecting = (\n (calculatedTargetCol > sStart && calculatedTargetCol <= sEnd && moveEndCol > sEnd) ||\n (calculatedTargetCol < sStart && moveEndCol >= sStart && moveEndCol < sEnd)\n );\n\n if (isCrossIntersecting) {\n isDroppingInsideOtherGroup = true;\n break;\n }\n }\n }\n\n const isSelfGroup = (\n calculatedTargetCol >= sourceGroup.startCol &&\n calculatedTargetCol <= sourceGroup.endCol + 1\n );\n\n const isInvalidMove = !isRowSpanCompatible || isSelfGroup || isOutOfBoundsOfParent || isDroppingInsideOtherGroup || !sourceGroup.isValidGroup;\n\n if (isInvalidMove) {\n this.#targetColIndex = null;\n if (this.#indi) this.#indi.style.display = 'none';\n if (this.#grip) this.#grip.classList.add('invalid');\n } else {\n this.#targetColIndex = calculatedTargetCol;\n if (this.#grip) this.#grip.classList.remove('invalid');\n\n if (this.#indi) {\n const headerPart = targetCell.closest('.ng-sheet-header');\n const headerRect = headerPart.getBoundingClientRect();\n const relativeTop = headerRect.top - sheetRect.top;\n const fullHeight = sheetRect.height - relativeTop;\n\n this.#indi.style.top = `${relativeTop}px`;\n this.#indi.style.height = `${fullHeight}px`;\n this.#indi.style.left = `${indicatorLeft - 1}px`;\n this.#indi.style.display = 'block';\n }\n }\n } else {\n if (this.#indi) this.#indi.style.display = 'none';\n if (this.#grip) this.#grip.classList.add('invalid');\n this.#targetColIndex = null;\n }\n };\n\n #updateGripPosition(clientX) {\n if (!this.#grip) return;\n const sheetRect = this.#sheet.getBoundingClientRect();\n const left = clientX - sheetRect.left - this.#shiftX;\n this.#grip.style.left = `${left}px`;\n }\n\n #onPointerUp = (e) => {\n if (!this.#isDragging) return;\n\n window.removeEventListener('pointermove', this.#onPointerMove);\n document.body.style.cursor = '';\n\n if (this.#grip) {\n this.#grip.style.display = 'none';\n this.#grip.replaceChildren();\n }\n if (this.#indi) this.#indi.style.display = 'none';\n\n if (\n this.#targetColIndex !== null &&\n this.#sourceColIndex !== null &&\n this.#targetColIndex !== this.#sourceColIndex &&\n this.#targetColIndex !== this.#sourceColIndex + 1\n ) {\n this.moveColumn(this.#sourceColIndex, this.#targetColIndex);\n }\n\n this.#isDragging = false;\n this.#sourceCell = null;\n this.#sourceColIndex = null;\n this.#targetColIndex = null;\n };\n\n moveColumn(fromColIndex, toColIndex) {\n\n const colgroup = this.#sheet.sourceTable.querySelector('colgroup');\n const targetCol = colgroup.querySelector(`col[data-col=\"${toColIndex}\"]`);\n\n const sourceGroup = this.#getColGroupRange(this.#sourceCell);\n if (!sourceGroup || !sourceGroup.isValidGroup) return;\n\n const spanCount = sourceGroup.colSpan;\n const isInRange = (idx) => idx >= fromColIndex && idx < fromColIndex + spanCount;\n\n // 1. colgroup ๋ด <col> ์ด๋ ๋ฐ fixed ์ค์ \n const targetViewportCol = this.#sheet.querySelector(`.ng-sheet-body-content col[data-col=\"${toColIndex}\"]`);\n const fixedType = targetViewportCol?.closest('.ng-container-left') ? 'left' : targetViewportCol?.closest('.ng-container-right') ? 'right' : null;\n\n colgroup.querySelectorAll('col').forEach(col => {\n if (isInRange(parseInt(col.getAttribute('data-col'), 10))) {\n fixedType ? col.setAttribute('fixed', fixedType) : col.removeAttribute('fixed');\n colgroup.insertBefore(col, targetCol);\n }\n });\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n this.#sheet.sourceTable.querySelectorAll(`${group} tr`).forEach(tr => {\n const cells = Array.from(tr.children);\n const targetRowCell = cells.find(c => parseInt(c.dataset.col, 10) >= toColIndex);\n\n cells.forEach(cell => {\n if (isInRange(parseInt(cell.dataset.col, 10))) {\n tr.insertBefore(cell, targetRowCell || null);\n }\n });\n });\n });\n\n this.#sheet.recompileAndRefresh();\n }\n\n destroy() {\n this.#sheet.removeEventListener('pointerdown', this.#onPointerDown);\n }\n}","// ui/col/ColFixManager.js\nimport { trace } from \"@nopeer\";\n\nexport class ColFixManager {\n #sheet;\n\n constructor(sheet) {\n this.#sheet = sheet;\n }\n\n getFixState(targetCell, table) {\n if (!targetCell || !table) return 'none';\n\n const container = targetCell.closest('.ng-container-left, .ng-container-right, .ng-container-body');\n if (container?.classList.contains('ng-container-left')) return 'left';\n if (container?.classList.contains('ng-container-right')) return 'right';\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n if (!isNaN(baseCol)) {\n const colEl = table.querySelector(`colgroup col[data-col=\"${baseCol}\"]`);\n const fixedAttr = colEl?.getAttribute('fixed');\n if (fixedAttr) return fixedAttr;\n }\n\n return 'none';\n }\n\n canFixColumn(targetCell, table) {\n if (!targetCell || targetCell.tagName !== 'TH' || !table) return false;\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n const colSpan = targetCell.colSpan || 1;\n if (isNaN(baseCol)) return false;\n\n const targetBoundaryCol = baseCol + colSpan - 1;\n const theadTrs = Array.from(table.querySelectorAll('thead tr'));\n\n if (theadTrs.length <= 1) return true;\n\n for (const tr of theadTrs) {\n const cells = Array.from(tr.querySelectorAll('th, td'));\n let cellBoundaryFound = false;\n\n for (const cell of cells) {\n const cCol = parseInt(cell.dataset.col, 10);\n const cSpan = cell.colSpan || 1;\n const cEndCol = cCol + cSpan - 1;\n\n if (cCol <= targetBoundaryCol && targetBoundaryCol < cEndCol) {\n return false;\n }\n\n if (cEndCol === targetBoundaryCol) {\n cellBoundaryFound = true;\n break;\n }\n }\n\n if (!cellBoundaryFound) return false;\n }\n\n return true;\n }\n\n executeFixToggle(action, targetCell, fixType = 'left') {\n if (!this.#sheet || !targetCell) return;\n\n const sourceTable = this.#sheet.sourceTable;\n if (!sourceTable) return;\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n const colSpan = targetCell.colSpan || 1;\n const targetColIndex = baseCol + colSpan - 1;\n\n if (isNaN(targetColIndex)) return;\n\n const colgroup = sourceTable.querySelector('colgroup');\n if (!colgroup) return;\n\n const cols = Array.from(colgroup.querySelectorAll('col'));\n\n if (action === 'fix-column') {\n cols.forEach(col => {\n const idx = parseInt(col.getAttribute('data-col'), 10);\n if (idx <= targetColIndex) {\n col.setAttribute('fixed', fixType);\n }\n });\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n sourceTable.querySelectorAll(`${group} tr`).forEach(tr => {\n Array.from(tr.children).forEach(cell => {\n const cIdx = parseInt(cell.dataset.col, 10);\n if (!isNaN(cIdx) && cIdx <= targetColIndex) {\n cell.setAttribute('fixed', fixType);\n }\n });\n });\n });\n\n } else if (action === 'unfix-column') {\n let minBaseCol = baseCol;\n let maxEndCol = baseCol + colSpan - 1;\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n sourceTable.querySelectorAll(`${group} tr`).forEach((tr, rIdx) => {\n Array.from(tr.children).forEach(cell => {\n const cCol = parseInt(cell.dataset.col, 10);\n const cSpan = cell.colSpan || 1;\n const cEnd = cCol + cSpan - 1;\n const rSpan = cell.rowSpan || 1;\n const trIndex = tr.sectionRowIndex ?? rIdx;\n\n const isVerticalOverlap = !(trIndex + rSpan - 1 < cell.closest('tr').sectionRowIndex || trIndex > (cell.closest('tr').sectionRowIndex + rSpan - 1));\n\n const isHorizontalOverlap = !(cEnd < baseCol || cCol > targetColIndex);\n\n if (isHorizontalOverlap) {\n minBaseCol = Math.min(minBaseCol, cCol);\n maxEndCol = Math.max(maxEndCol, cEnd);\n }\n });\n });\n });\n\n cols.forEach(col => {\n const idx = parseInt(col.getAttribute('data-col'), 10);\n if (idx >= minBaseCol) {\n col.removeAttribute('fixed');\n }\n });\n\n let isBroken = false;\n cols.forEach(col => {\n if (isBroken) {\n col.removeAttribute('fixed');\n } else if (!col.getAttribute('fixed')) {\n isBroken = true;\n }\n });\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n sourceTable.querySelectorAll(`${group} tr`).forEach(tr => {\n Array.from(tr.children).forEach(cell => {\n const cIdx = parseInt(cell.dataset.col, 10);\n if (isNaN(cIdx)) return;\n\n const correspondingCol = cols.find(c => parseInt(c.getAttribute('data-col'), 10) === cIdx);\n const isColFixed = correspondingCol?.getAttribute('fixed');\n\n if (isColFixed) {\n cell.setAttribute('fixed', isColFixed);\n } else {\n cell.removeAttribute('fixed');\n }\n });\n });\n });\n }\n\n this.#sheet.recompileAndRefresh?.();\n }\n}","import { NINE_TABLE } from '@/core/constants.js';\nimport { trace } from \"@nopeer\";\n\nexport class NineTableFilterPanel extends HTMLElement {\n\t#sheet;\n\t#host;\n\t#nineTable;\n\t#view;\n\t#button;\n\tcurrentCol = null;\n\n\tconnectedCallback() {\n\t\tthis.#init();\n\t\tdocument.addEventListener(\"mousedown\", this.#closeHandler);\n\t}\n\n\t#init = () => {\n\t\t//setTimeout(() => {\n\t\t\tthis.#renderer();\n\n\t\t\tthis.#sheet = this.closest(\"nine-table-sheet\");\n\t\t\tthis.#host = this.getRootNode().host;\n\n\t\t\tthis.#nineTable = this.querySelector(\"nine-table-simple\");\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.#view = this.#nineTable.shadowRoot.querySelector(\"nine-table-sheet\");\n\t\t\t})\n\n\n\t\t\tthis.querySelector(\".search-box\").addEventListener(\"focusin\", (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t});\n\t\t\tthis.querySelector(\".search-box\").addEventListener(\"input\", this.#onInput);\n\t\t\tthis.querySelector(\"#chkSelectAll\").addEventListener(\"change\", this.#onSelectAll);\n\t\t\tthis.querySelector(\"#btnOk\").addEventListener(\"click\", this.#onOk);\n\t\t//});\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"text\" class=\"search-box\" placeholder=\"Search...\">\n \n <nine-table-simple class=\"filter-list\" theme=\"simple\">\n <table auto-fit-col=\"true\">\n <colgroup>\n <col width=\"32\" fixed=\"left\" />\n <col width=\"180\" />\n <col width=\"0\" fixed=\"right\"/>\n </colgroup>\n <tbody>\n <tr>\n <td cell-type=\"checkbox\" data-bind=\"CHK\"></td>\n <td data-bind=\"DATA2\" html=\"true\"></td>\n <td data-bind=\"DATA\"></td>\n </tr>\n </tbody>\n </table>\n </nine-table-simple>\n\n <div class=\"footer-section\">\n <div class=\"footer-btns\">\n <label><input type=\"checkbox\" id=\"chkSelectAll\" checked> Select All</label>\n <div class=\"btn-group\">\n <button id=\"btnOk\">Apply</button>\n </div>\n </div>\n </div>\n `;\n\t}\n\n\topen(filterBtn) {\n\t\tthis.#button = filterBtn;\n\n\t\tconst cell = filterBtn.closest(\"th, td\");\n\t\tthis.currentCol = cell?.dataset.col;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst sheetRect = this.#sheet.getBoundingClientRect();\n\n\t\tconst panelWidth = this.offsetWidth || 240;\n\t\tlet left = (cellRect.right - sheetRect.left) - panelWidth;\n\t\tlet top = cellRect.bottom - sheetRect.top;\n\n\t\tif (left < 0) {\n\t\t\tleft = Math.max(0, cellRect.left - sheetRect.left);\n\t\t}\n\n\t\tthis.style.left = `${left}px`;\n\t\tthis.style.top = `${top}px`;\n\n\t\tconst searchBox = this.querySelector(\".search-box\");\n\t\tsearchBox.value = \"\";\n\n\n\t\tthis.classList.add(\"active\");\n\t\tthis.classList.add(\"loading\");\n\n\t\tsetTimeout(() => {\n\t\t\ttry {\n\t\t\t\tthis.#loadVirtualFilterItems();\n\t\t\t\tthis.#view.rowManager.scrollToDataRow(0);\n\t\t\t\tsearchBox.focus();\n\t\t\t} finally {\n\t\t\t\tthis.classList.remove(\"loading\");\n\t\t\t}\n\t\t});\n\t}\n\n\t#closeHandler = (e) => {\n\t\tconst path = e.composedPath ? e.composedPath() : [];\n\t\tif (path.includes(this) || (this.#button && path.includes(this.#button))) {\n\t\t\treturn;\n\t\t}\n\t\tthis.close();\n\t};\n\n\tclose() {\n\t\tthis.currentCol = null;\n\t\tthis.classList.remove(\"active\");\n\t\tthis.#button = null;\n\t}\n\n\t#loadVirtualFilterItems() {\n\t\tconst filteredRecords = this.#host.data.getArray();\n\t\tconst targetCols = this.#button?.columns || []; // [{ bind, expr }] ํํ ๋ฐฐ์ด\n\t\tconst fields = this.#host.fields.get() || [];\n\t\tconst activeFilters = this.#sheet.filtering?.filters || {};\n\t\tconst exprEngine = this.#host.exprEngine;\n\n\t\tconst ds = targetCols.flatMap((colInfo) => {\n\t\t\tconst bindKey = colInfo.bind;\n\t\t\tconst exprKey = colInfo.expr;\n\n\t\t\tconst filterKey = bindKey || exprKey; // ์ค์ ํํฐ ํ๋ผ๋ฏธํฐ ํค๋ก ์ฌ์ฉ\n\t\t\tconst fieldIdx = bindKey ? fields.indexOf(bindKey) : -1;\n\t\t\tconst activeSelectedVals = activeFilters[filterKey] || [];\n\n\t\t\tconst uniqueMap = new Map();\n\t\t\tfor (let i = 0; i < filteredRecords.length; i++) {\n\t\t\t\tconst record = filteredRecords[i];\n\t\t\t\tif (!record) continue;\n\n\t\t\t\tlet rawVal = undefined;\n\t\t\t\tif (fieldIdx >= 0 && record.v) {\n\t\t\t\t\trawVal = record.v[fieldIdx];\n\t\t\t\t} else if (bindKey && bindKey.includes(\"data.\")) {\n\t\t\t\t\trawVal = exprEngine ? exprEngine.evaluate(bindKey, record, i) : undefined;\n\t\t\t\t} else if (exprKey && exprEngine) {\n\t\t\t\t\trawVal = exprEngine.evaluate(exprKey, record, i);\n\t\t\t\t}\n\n\t\t\t\tlet displayVal = rawVal;\n\t\t\t\tif (exprKey && exprEngine) {\n\t\t\t\t\tdisplayVal = exprEngine.evaluate(exprKey, record, i);\n\t\t\t\t}\n\n\t\t\t\tif (displayVal !== undefined && displayVal !== null && !uniqueMap.has(displayVal)) {\n\t\t\t\t\tuniqueMap.set(displayVal, {\n\t\t\t\t\t\tv: rawVal, // ๐ก ํํฐ๋ง ๋น๊ต ๊ธฐ์ค (DATA)\n\t\t\t\t\t\tv2: displayVal // ๐ก ํ๋ฉด ์ถ๋ ฅ ๊ธฐ์ค (DATA2)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst uniqueList = [...uniqueMap.values()];\n\n\t\t\tuniqueList.sort((a, b) => {\n\t\t\t\tconst valA = a.v2;\n\t\t\t\tconst valB = b.v2;\n\n\t\t\t\tif (valA === valB) return 0;\n\t\t\t\tif (valA === undefined || valA === null || valA === '') return 1;\n\t\t\t\tif (valB === undefined || valB === null || valB === '') return -1;\n\n\t\t\t\tconst numA = Number(valA);\n\t\t\t\tconst numB = Number(valB);\n\n\t\t\t\tconst isNumA = !isNaN(numA);\n\t\t\t\tconst isNumB = !isNaN(numB);\n\n\t\t\t\tif (isNumA && isNumB) {\n\t\t\t\t\treturn numA - numB;\n\t\t\t\t}\n\n\t\t\t\treturn String(valA).localeCompare(String(valB));\n\t\t\t});\n\t\t\tactiveSelectedVals.sort((a, b) => { return a > b ? 1 : -1; });\n\n\t\t\treturn uniqueList.map(o => ({\n\t\t\t\tLVL: 2,\n\t\t\t\tDATA: o.v, // ํํฐ๋ง ๋น๊ต์ฉ ๊ฐ\n\t\t\t\tDATA2: (o.v2 === \"\" || o.v2 === null || o.v2 === undefined) ? '<span class=\"empty-value\">(empty)</span>' : o.v2,\n\t\t\t\tCOLNM: filterKey,\n\t\t\t\tCHK: activeSelectedVals.length === 0 || activeSelectedVals.nineBinarySearch(o.v) >= 0 ? \"Y\" : \"N\"\n\t\t\t}));\n\t\t});\n\n\t\tthis.#nineTable.data.set(ds);\n\n\t\tconst selectAllChk = this.querySelector(\"#chkSelectAll\");\n\t\tif (selectAllChk) {\n\t\t\tselectAllChk.checked = ds.length > 0 && ds.every(item => item.CHK === \"Y\");\n\t\t}\n\t}\n\n\t#onOk = () => {\n\t\tthis.#host.loading = true;\n\n\t\tconst filterRecords = this.#view.view.getArray();\n\t\tconst fields = this.#nineTable.data.getHostFields();\n\n\t\tconst checkedRecords = filterRecords.filter(record => {\n\t\t\tconst chk = record.v[fields.indexOf(\"CHK\")];\n\t\t\treturn (chk === \"Y\" || chk === true);\n\t\t});\n\n\t\tconst filterParams = { ...(this.#sheet.filtering?.filters || {}) };\n\n\t\tthis.#button.columns.forEach(colInfo => {\n\t\t\tconst filterKey = colInfo.expr || colInfo.bind;\n\t\t\tconst fieldIdx = colInfo.expr ? fields.indexOf(\"DATA2\") : fields.indexOf(\"DATA\");\n\t\t\tconst selectedVals = checkedRecords.map(r => r.v[fieldIdx]);\n\n\t\t\tif (selectedVals.length > 0) {\n\t\t\t\tfilterParams[filterKey] = selectedVals;\n\t\t\t} else {\n\t\t\t\tdelete filterParams[filterKey];\n\t\t\t}\n\t\t});\n\n\t\tconst totalCount = this.#nineTable.data.count();\n\n\t\tsetTimeout(() => {\n\t\t\ttry {\n\t\t\t\tif (totalCount === checkedRecords.length) {\n\t\t\t\t\tthis.#button.columns.forEach(colInfo => {\n\t\t\t\t\t\tconst filterKey = colInfo.expr || colInfo.bind;\n\t\t\t\t\t\tif (filterKey) this.#sheet.filtering.clear(filterKey);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.#sheet.filtering.set(filterParams);\n\t\t\t\t}\n\n\t\t\t\tthis.#sheet.querySelectorAll(\"nine-table-filter-button\").forEach(btn => {\n\t\t\t\t\tbtn.updateFilteredState();\n\t\t\t\t});\n\n\t\t\t\tthis.#sheet.invalidate();\n\t\t\t\tthis.close();\n\t\t\t} finally {\n\t\t\t\tthis.#host.loading = false;\n\t\t\t}\n\t\t});\n\t};\n\n\t#onInput = (e) => {\n\n\t\tconst query = e.target.value.toLowerCase().trim();\n\n\t\tif (!query) {\n\t\t\tthis.#view.filtering.clear();\n\t\t} else {\n\t\t\tconst rawRecords = this.#nineTable.data.getArray();\n\t\t\tconst fields = this.#nineTable.data.getHostFields();\n\t\t\tconst data2Idx = fields.indexOf(\"DATA2\");\n\n\t\t\tconst matchedValues = [];\n\t\t\trawRecords.forEach(record => {\n\t\t\t\tconst val = data2Idx >= 0 && record.v ? record.v[data2Idx] : \"\";\n\t\t\t\tconst textVal = String(val).replace(/<[^>]*>?/gm, '').toLowerCase();\n\n\t\t\t\tif (textVal.includes(query)) {\n\t\t\t\t\tmatchedValues.push(val);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.#view.filtering.set({\n\t\t\t\tDATA2: [...new Set(matchedValues)]\n\t\t\t});\n\t\t}\n\t};\n\n\t#onSelectAll = (e) => {\n\t\tconst isChecked = e.target.checked;\n\t\tconst rawRecords = this.#nineTable?.data?.getArray() || [];\n\t\tconst fields = this.#nineTable.data.getHostFields();\n\t\tconst chkIdx = fields.indexOf(\"CHK\");\n\n\t\tif (chkIdx >= 0) {\n\t\t\trawRecords.forEach(record => {\n\t\t\t\trecord.v[chkIdx] = isChecked ? \"Y\" : \"N\";\n\t\t\t});\n\t\t}\n\n\t\tthis.#nineTable.refresh();\n\t};\n\n\t#onCancel = () => {\n\t\tthis.close();\n\t};\n}\n\nexport class NineTableFilterButton extends HTMLElement {\n\t#sheet;\n\t#columns = null;\n\n\tconnectedCallback() {\n\t\tthis.#sheet = this.closest(\"nine-table-sheet\") || this.getRootNode().host;\n\t\tthis.removeEventListener(\"click\", this.#onClick);\n\t\tthis.addEventListener(\"click\", this.#onClick);\n\t}\n\n\tget columns() {\n\t\tif (this.#columns) return this.#columns;\n\n\t\tconst cell = this.closest(\"th, td\");\n\t\tconst colIndex = cell?.dataset.col;\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\n\t\tconst cols = [];\n\t\tconst seen = new Set();\n\n\t\tif (sourceTable && colIndex !== undefined) {\n\t\t\tsourceTable.querySelectorAll(`tbody [data-col=\"${colIndex}\"]`).forEach($td => {\n\t\t\t\tconst bindKey = $td.dataset.bind;\n\t\t\t\tconst exprKey = $td.dataset.expr;\n\n\t\t\t\tif (bindKey || exprKey) {\n\t\t\t\t\tconst uniqueKey = `${bindKey || ''}_${exprKey || ''}`;\n\t\t\t\t\tif (!seen.has(uniqueKey)) {\n\t\t\t\t\t\tseen.add(uniqueKey);\n\t\t\t\t\t\tcols.push({\n\t\t\t\t\t\t\tbind: bindKey,\n\t\t\t\t\t\t\texpr: exprKey,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#columns = cols;\n\t\treturn this.#columns;\n\t}\n\n\tupdateFilteredState = () => {\n\t\tconst activeFilters = this.#sheet.filtering?.filters || {};\n\t\tconst isFiltered = this.columns.some(colInfo => {\n\t\t\tconst key = colInfo.expr || colInfo.bind;\n\t\t\treturn key && activeFilters[key] && activeFilters[key].length > 0;\n\t\t});\n\t\tthis.classList.toggle('filtered', isFiltered);\n\t};\n\n\t#onClick = (e) => {\n\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tconst panel = this.#sheet.querySelector(\"nine-table-filter-panel\");\n\t\tconst cell = this.closest(\"th, td\");\n\t\tconst col = cell.dataset.col;\n\n\t\tif (panel && panel.currentCol === col && panel.classList.contains('active')) {\n\t\t\tpanel.close();\n\t\t} else if (panel) {\n\t\t\tpanel.open(this);\n\t\t}\n\t};\n}\n\nexport class Filtering {\n\t#sheet;\n\t#host;\n\t#isFiltering = false;\n\t#filterPanel = null;\n\t#filters = {};\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = this.#sheet.getRootNode().host;\n\t\tthis.#init();\n\t}\n\n\tget filters() {\n\t\treturn this.#filters;\n\t};\n\n\t#init = () => {\n\t\tthis.#initFilterPanel();\n\t}\n\n\t#initFilterPanel = () => {\n\t\tif (this.#host.tagName.toLowerCase() === \"nine-table-simple\") {\n\t\t\treturn;\n\t\t}\n\n\t\tlet panel = this.#sheet.querySelector(\"nine-table-filter-panel\");\n\t\tif (!panel) {\n\t\t\tpanel = document.createElement(\"nine-table-filter-panel\");\n\t\t\tthis.#sheet.appendChild(panel);\n\t\t}\n\t\tthis.#filterPanel = panel;\n\t}\n\n\tisFiltering() {\n\t\treturn this.#isFiltering;\n\t}\n\n\tclear = (colnm) => {\n\t\tif (colnm) {\n\t\t\tdelete this.#filters[colnm];\n\t\t} else {\n\t\t\tthis.#filters = {};\n\t\t}\n\n\t\tthis.#isFiltering = Object.keys(this.#filters).length > 0;\n\t\tthis.#applyFiltering();\n\n\t\tthis.#sheet.querySelectorAll(\"nine-table-filter-button\").forEach(btn => {\n\t\t\tbtn.updateFilteredState();\n\t\t});\n\t}\n\n\tset = (oFilter) => {\n\n\t\tlet jsonFilter = Array.isArray(oFilter)\n\t\t\t? Object.fromEntries(Object.keys(oFilter[0]).map(k => [k, [...new Set(oFilter.map(item => item[k]))]]))\n\t\t\t: oFilter;\n\n\t\tthis.#filters = jsonFilter;\n\t\tthis.#isFiltering = Object.keys(jsonFilter).length > 0;\n\t\tthis.#sheet.toggleAttribute(\"filtering\", this.#isFiltering);\n\n\t\tthis.#applyFiltering();\n\t}\n\n\t#applyFiltering() {\n\t\tconst hostData = this.#host.data;\n\t\tconst rawRecords = hostData.getArray();\n\t\tconst fields = this.#host.data.getHostFields();\n\t\tconst sheetIndex = this.#sheet.index;\n\t\tconst exprEngine = this.#host.exprEngine;\n\n\t\tconst hasFilters = Object.keys(this.#filters).length > 0;\n\n\t\tif (!hasFilters) {\n\t\t\trawRecords.forEach(record => {\n\t\t\t\tif (record?.m?._?.[NINE_TABLE.META.INDEX.FILTER]) {\n\t\t\t\t\trecord.m._[NINE_TABLE.META.INDEX.FILTER][sheetIndex] = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.#sheet.invalidate();\n\t\t\treturn;\n\t\t}\n\n\t\tconst filterRules = Object.entries(this.#filters).map(([targetKey, allowedValues]) => {\n\t\t\tconst isExpr = targetKey.includes(\"data.\") || targetKey.includes(\"host.\") || targetKey.includes(\"rowItem.v\");\n\t\t\treturn {\n\t\t\t\ttargetKey,\n\t\t\t\tisExpr,\n\t\t\t\tfieldIdx: !isExpr ? fields.indexOf(targetKey) : -1,\n\t\t\t\tallowedSet: new Set(allowedValues)\n\t\t\t};\n\t\t});\n\n\t\trawRecords.forEach((record, recordIdx) => {\n\t\t\tif (!record) return;\n\n\t\t\tif (!record.m._[NINE_TABLE.META.INDEX.FILTER]) {\n\t\t\t\trecord.m._[NINE_TABLE.META.INDEX.FILTER] = [];\n\t\t\t}\n\n\t\t\tlet isPass = true;\n\n\t\t\tfor (let i = 0; i < filterRules.length; i++) {\n\t\t\t\tconst { targetKey, isExpr, fieldIdx, allowedSet } = filterRules[i];\n\t\t\t\tlet val = undefined;\n\n\t\t\t\tif (isExpr && exprEngine) {\n\t\t\t\t\tval = exprEngine.evaluate(targetKey, record, recordIdx);\n\t\t\t\t} else if (fieldIdx >= 0 && record.v) {\n\t\t\t\t\tval = record.v[fieldIdx];\n\t\t\t\t}\n\n\t\t\t\tif (!allowedSet.has(val)) {\n\t\t\t\t\tisPass = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\trecord.m._[NINE_TABLE.META.INDEX.FILTER][sheetIndex] = isPass;\n\t\t});\n\n\t\tthis.#sheet.selection.clear();\n\n\t\tthis.#sheet.invalidate();\n\t}\n}\n\nif (!customElements.get('nine-table-filter-panel')) {\n\tcustomElements.define(\"nine-table-filter-panel\", NineTableFilterPanel);\n}\n\nif (!customElements.get('nine-table-filter-button')) {\n\tcustomElements.define(\"nine-table-filter-button\", NineTableFilterButton);\n}","// ui/data/Sorting.js (๋๋ ์ ๋ ฌ ๊ด๋ จ ์์ค)\nimport { trace } from \"@nopeer\";\n\nexport class Sorting {\n\t#sheet;\n\t#host;\n\n\t#columns = [];\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tsetTimeout(() => {\n\t\t\tthis.#initEvents();\n\t\t}, 300);\n\t}\n\n\t#initEvents() {\n\n\t\tthis.#sheet.querySelectorAll(\"thead\").forEach($el => {\n\n\t\t\t$el.addEventListener('dblclick', (e) => {\n\n\t\t\t\tconst cell = e.target.closest('th, td');\n\t\t\t\tif (!cell || cell.classList.contains('resizable-edge')) return;\n\n\t\t\t\tif ([\"INPUT\",\"CELL-CHECKBOX\"].includes(e.target.tagName)) return;\n\n\t\t\t\tif (e.offsetX <= 2 || e.offsetX >= cell.offsetWidth - 2) return;\n\n\t\t\t\tconst host = this.#sheet.getRootNode().host;\n\n\t\t\t\thost.loading = true;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#handleSort(e, cell);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\thost.loading = false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\t#handleSort(e, cell) {\n\t\tconst colIndex = cell.dataset.col;\n\t\tconst tr = cell.closest('tr');\n\t\tconst subRowIndex = tr ? tr.dataset.subrow || String(tr.sectionRowIndex) : '0';\n\n\t\tif (colIndex === undefined) return;\n\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\t\tif (!sourceTable) return;\n\n\t\tlet colName = null;\n\t\tlet exprVal = null;\n\n\t\tsourceTable.querySelectorAll(`tbody [data-col=\"${colIndex}\"]`).forEach($td => {\n\t\t\tif ($td.dataset.bind) {\n\t\t\t\tcolName = $td.dataset.bind;\n\t\t\t}\n\n\t\t\tif ($td.dataset.expr) {\n\t\t\t\texprVal = $td.dataset.expr;\n\t\t\t}\n\t\t});\n\n\t\tif (!colName && !exprVal) return;\n\n\t\tconst isAsc = cell.classList.contains('asc');\n\t\tconst isDesc = cell.classList.contains('desc');\n\n\t\tif (!e.ctrlKey && !e.shiftKey) {\n\t\t\tthis.#columns = [];\n\t\t}\n\n\t\tconst existingColIndex = this.#columns.findIndex(\n\t\t\tm => (m.colIndex === colIndex && m.subRowIndex === subRowIndex) || m.colName === colName\n\t\t);\n\n\t\tconst ruleData = {\n\t\t\tcolIndex,\n\t\t\tsubRowIndex,\n\t\t\tcolname: colName || exprVal,\n\t\t\tcolName: colName || exprVal,\n\t\t\texpr: exprVal, // ๐ก expr ๊ท์น ๋ณด๊ด\n\t\t\tasc: true,\n\t\t\t\"expr-func\": exprVal ? (record, idx) => this.#host.exprEngine(exprVal, record, idx) : null\n\t\t};\n\n\t\tif (!isAsc && !isDesc) {\n\t\t\tif (existingColIndex >= 0) {\n\t\t\t\tthis.#columns[existingColIndex].asc = true;\n\t\t\t} else {\n\t\t\t\tthis.#columns.push({ ...ruleData, asc: true });\n\t\t\t}\n\t\t} else if (isAsc) {\n\t\t\tif (existingColIndex >= 0) {\n\t\t\t\tthis.#columns[existingColIndex].asc = false;\n\t\t\t} else {\n\t\t\t\tthis.#columns.push({ ...ruleData, asc: false });\n\t\t\t}\n\t\t} else {\n\t\t\tthis.#columns = this.#columns.filter(\n\t\t\t\tm => !((m.colIndex === colIndex && m.subRowIndex === subRowIndex) || m.colName === colName)\n\t\t\t);\n\t\t}\n\n\t\tthis.#applySorting(cell);\n\t}\n\n\t#applySorting(cell) {\n\n\t\tthis.#sheet.view.setSorting(this.#columns);\n\t\tthis.#syncHeaderUI();\n\t\tthis.#sheet.invalidate();\n\t\trequestAnimationFrame(() => {\n\t\tconst cells = this.#sheet.querySelectorAll('tbody.body th, tbody.body td');\n\n\t\tcells.forEach($td => {\n\t\t\t$td.classList.remove('sorting-anim-asc', 'sorting-anim-desc', 'sorting-anim-none');\n\n\t\t\tif (cell.classList.contains('asc')) {\n\t\t\t\t$td.classList.add('sorting-anim-asc');\n\t\t\t} else if (cell.classList.contains('desc')) {\n\t\t\t\t$td.classList.add('sorting-anim-desc');\n\t\t\t} else {\n\t\t\t\t$td.classList.add('sorting-anim-none');\n\t\t\t}\n\t\t});\n\n\t\trequestAnimationFrame(() => {\n\t\t\tcells.forEach($td => {\n\t\t\t\t$td.classList.remove('sorting-anim-asc', 'sorting-anim-desc', 'sorting-anim-none');\n\t\t\t});\n\t\t});\n\t\t});\n\t}\n\n\t#syncHeaderUI() {\n\t\tthis.#sheet.querySelectorAll('thead th, thead td').forEach(el => {\n\t\t\tel.classList.remove('asc', 'desc');\n\t\t});\n\n\t\tif (this.#columns.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#columns.forEach(colRule => {\n\t\t\tconst { colIndex, subRowIndex, asc } = colRule;\n\n\t\t\tif (colIndex !== undefined) {\n\t\t\t\tlet selector = `thead [data-col=\"${colIndex}\"]`;\n\t\t\t\tif (subRowIndex !== undefined) {\n\t\t\t\t\tselector = `thead tr[data-subrow=\"${subRowIndex}\"] [data-col=\"${colIndex}\"]`;\n\t\t\t\t}\n\n\t\t\t\tconst targetHeaderCells = this.#sheet.querySelectorAll(selector);\n\t\t\t\ttargetHeaderCells.forEach(cell => {\n\t\t\t\t\tcell.classList.add(asc ? 'asc' : 'desc');\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\trestore() {\n\t\tthis.#columns = [];\n\t\tif (this.#sheet.view) {\n\t\t\tthis.#sheet.view.resetSorting();\n\t\t}\n\n\t\tthis.#syncHeaderUI();\n\t\tthis.#sheet.rowManager?.refresh(true);\n\t}\n}","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport {Grouping} from \"@/data/Grouping.js\";\n\nexport class SheetView {\n\t#sheet;\n\t#host;\n\t#sortingColumns = [];\n\t#filterRules = [];\n\t#viewIndexes = [];\n\n\t#cachedVisibleRecords = null;\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tthis.refresh();\n\t}\n\n\tgetArray = (at, colnm) => {\n\n\t\tif (!this.#cachedVisibleRecords) {\n\t\t\tconst records = this.#host.data.getArray();\n\t\t\tthis.#cachedVisibleRecords = this.#viewIndexes.map(idx => records[idx]);\n\t\t}\n\n\t\tconst visibleRecords = this.#cachedVisibleRecords;\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn visibleRecords;\n\t\t}\n\n\t\tif (at < 0 || at >= visibleRecords.length) return null;\n\n\t\tconst targetRecord = visibleRecords[at];\n\t\tif (colnm != null) {\n\t\t\tconst fields = this.#host.data.getHostFields();\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0 && targetRecord.v) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn targetRecord;\n\t};\n\n\tcount = () => {\n\t\tif (!this.#cachedVisibleRecords) {\n\t\t\tconst records = this.#host.data.getArray();\n\t\t\tthis.#cachedVisibleRecords = this.#viewIndexes.map(idx => records[idx]);\n\t\t}\n\n\t\treturn this.#cachedVisibleRecords.length;\n\t}\n\n\tget = (at, colnm) => {\n\t\tconst visibleRecords = this.getArray();\n\t\tconst fields = this.#host.data.getHostFields?.() || [];\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn visibleRecords.map(record => this.#convSingle(record, fields));\n\t\t}\n\n\t\tif (at < 0 || at >= visibleRecords.length) return null;\n\n\t\tconst targetRecord = visibleRecords[at];\n\t\tif (!targetRecord) return null;\n\n\t\tif (colnm != null) {\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0 && targetRecord.v) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn this.#convSingle(targetRecord, fields);\n\t};\n\n\t#convSingle = (o, fields) => {\n\t\tif (!o) return null;\n\t\tconst t = {};\n\t\tfields.forEach((colnm, i) => {\n\t\t\tt[colnm] = o.v ? o.v[i] : o[colnm];\n\t\t});\n\t\tif (o.m) t.m = o.m;\n\t\tif (o._) t._ = o._;\n\t\treturn t;\n\t};\n\n\trefresh = () => {\n\n\t\tthis.#cachedVisibleRecords = null;\n\n\t\tconst rawRecords = this.#host.data.getArray();\n\t\tlet indices = [];\n\t\trawRecords.forEach((record, i) => {\n\t\t\tif (!record) return;\n\t\t\tconst filterSlot = record.m?._?.[NINE_TABLE.META.INDEX.FILTER];\n\t\t\tif (filterSlot && filterSlot[this.#sheet.index] === false) return;\n\t\t\tindices.push(i);\n\t\t});\n\n\t\tif (this.#sortingColumns.length > 0) {\n\t\t\tindices = this.#applySorting(indices, rawRecords);\n\t\t}\n\n\t\tthis.#viewIndexes = indices;\n\t\tconst validRecords = indices.map(idx => rawRecords[idx]);\n\n\t\tconst groupColumns = this.#sheet.grouping?.columns || [];\n\t\tif (groupColumns.length > 0) {\n\t\t\tconst groupResult = Grouping.apply(validRecords, groupColumns, this.#host.data.getHostFields());\n\n\t\t\tthis.#cachedVisibleRecords = groupResult.renderItems; // ์ต์ข
๋ ๋๋ง ์์ดํ
\n\n\t\t\tthis.#sheet.grouping.setGroupMap(groupResult.groupMap); // ์์ ๋งคํ ๊ณต์ \n\t\t} else {\n\t\t\tthis.#cachedVisibleRecords = validRecords;\n\t\t}\n\n\n\n\t}\n\n\tsetSorting = (columns) => {\n\t\tthis.#sortingColumns = columns || [];\n\t\tthis.refresh();\n\t};\n\n\tgetSorting = () => {\n\t\treturn this.#sortingColumns;\n\t};\n\n\tresetSorting = () => {\n\t\tthis.#sortingColumns = [];\n\t\tthis.refresh();\n\t};\n\n\n\t#applySorting = (indices, validRecords) => {\n\n\t\tconst fields = typeof this.#host.data.getHostFields === 'function' ? this.#host.data.getHostFields() : [];\n\n\t\tconst rulesWithIdx = this.#sortingColumns.map(rule => ({\n\t\t\t...rule,\n\t\t\tcolIndex: fields.indexOf(rule.colname || rule.colName)\n\t\t}));\n\n\t\treturn indices.sort((idxA, idxB) => {\n\t\t\tconst a = validRecords[idxA];\n\t\t\tconst b = validRecords[idxB];\n\n\t\t\tfor (const rule of rulesWithIdx) {\n\t\t\t\tconst isAsc = rule.asc;\n\t\t\t\tconst expr = rule.expr; // ๐ก ๋ฑ๋ก๋ expr ์์\n\t\t\t\tlet valA, valB;\n\n\t\t\t\tif (expr) {\n\t\t\t\t\tvalA = this.#host.exprEngine.evaluate(expr, a, idxA);\n\t\t\t\t\tvalB = this.#host.exprEngine.evaluate(expr, b, idxB);\n\t\t\t\t} else {\n\t\t\t\t\tif (rule.colIndex >= 0 && a.v && b.v) {\n\t\t\t\t\t\tvalA = a.v[rule.colIndex];\n\t\t\t\t\t\tvalB = b.v[rule.colIndex];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst isEmptyA = (valA === null || valA === undefined || valA === '');\n\t\t\t\tconst isEmptyB = (valB === null || valB === undefined || valB === '');\n\n\t\t\t\tif (isEmptyA && isEmptyB) continue;\n\t\t\t\tif (isEmptyA) return 1;\n\t\t\t\tif (isEmptyB) return -1;\n\n\t\t\t\tif (valA !== valB) {\n\t\t\t\t\tlet diff = 0;\n\n\t\t\t\t\tif (typeof valA === 'number' && typeof valB === 'number') {\n\t\t\t\t\t\tdiff = valA - valB;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst strA = String(valA);\n\t\t\t\t\t\tconst strB = String(valB);\n\t\t\t\t\t\tdiff = strA > strB ? 1 : (strA < strB ? -1 : 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (diff !== 0) {\n\t\t\t\t\t\treturn isAsc ? diff : -diff;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn idxA - idxB;\n\t\t});\n\t};\n}","import { trace } from \"@nopeer\";\nimport { TableCompiler } from \"@/layout/core/TableCompiler.js\";\n\nexport const COLLAPSED_WIDTH = 16;\n\nexport class PreCompiler {\n\n static initializeTable(host, tbl) {\n\n PreCompiler.#ensureColgroup(tbl);\n PreCompiler.#ensureThead(tbl);\n PreCompiler.#ensureSectionTbodys(tbl);\n\n PreCompiler.#ensureRowIndicator(tbl);\n\n PreCompiler.#normalizeColAttributes(tbl);\n\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('thead tr'));\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('tbody.body tr[grouping=\"true\"]'));\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('tbody.body tr:not([grouping=\"true\"])'));\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('tfoot tr'));\n\n PreCompiler.#createColIndicator(tbl);\n\n PreCompiler.#normalizeCollapsibleAttributes(tbl);\n\n PreCompiler.#generateCell(host, tbl);\n\n PreCompiler.#initColExpanders(tbl);\n\n PreCompiler.#initFilterButtons(host, tbl);\n\n PreCompiler.#applyInitialCellWidths(tbl);\n\n return tbl;\n }\n\n static #createColIndicator(tbl) {\n const thead = tbl.querySelector('thead');\n if (!thead || thead.querySelector('.col-indicator-rowgroup')) return;\n\n const tdTmpl = `<th data-col=\"@col\" class=\"col-indicator\" scope=\"col\"></th>`;\n\n const tr = thead.insertRow(0);\n tr.setAttribute('role', 'row');\n tr.classList.add('col-indicator-rowgroup');\n tr.classList.add('collapse');\n\n const firstRow = tbl.querySelector('tbody tr');\n if (!firstRow) return;\n\n let cnt = 0;\n firstRow.querySelectorAll('th, td').forEach(td => {\n if (!td.classList.contains('dummy')) {\n const colSpan = td.colSpan || 1;\n for (let i = 0; i < colSpan; i++) {\n const html = tdTmpl.replace('@col', cnt).replace('@text', PreCompiler.#numToExcelCol(cnt++));\n tr.insertAdjacentHTML('beforeend', html);\n }\n }\n });\n\n const cols = Array.from(tbl.querySelectorAll('colgroup col'));\n tr.querySelectorAll('.col-indicator').forEach((el, i) => {\n const background = cols[i].getAttribute('background');\n if (background) {\n el.style.background = background;\n }\n });\n }\n\n static #numToExcelCol(num) {\n let text = '';\n for (let n = num; n >= 0; n = Math.floor(n / 26) - 1) {\n text = String.fromCharCode(65 + (n % 26)) + text;\n }\n return text;\n }\n\n static #ensureSectionTbodys(tbl) {\n let tbody = tbl.querySelector('tbody:not(.head):not(.foot)');\n\n if (!tbody) return;\n\n tbody.classList.add('body');\n\n if (!tbl.querySelector('tbody.head')) {\n const headTbody = document.createElement('tbody');\n headTbody.classList.add('head');\n tbody.before(headTbody);\n }\n\n if (!tbl.querySelector('tbody.foot')) {\n const footTbody = document.createElement('tbody');\n footTbody.classList.add('foot');\n tbody.after(footTbody);\n }\n }\n\n static #ensureColgroup(tbl) {\n let colgroup = tbl.querySelector('colgroup');\n if (!colgroup) {\n colgroup = document.createElement('colgroup');\n tbl.prepend(colgroup);\n }\n\n if (colgroup.querySelectorAll('col').length === 0) {\n const firstRow = tbl.querySelector('tbody tr');\n let colCount = 1;\n if (firstRow) {\n colCount = Array.from(firstRow.querySelectorAll('th, td')).reduce((sum, cell) => {\n return sum + (parseInt(cell.getAttribute('colspan') || cell.colSpan, 10) || 1);\n }, 0);\n }\n colCount = Math.max(colCount, 1);\n\n for (let i = 0; i < colCount; i++) {\n const col = document.createElement('col');\n colgroup.appendChild(col);\n }\n }\n }\n\n static #normalizeColAttributes(tbl) {\n const cols = Array.from(tbl.querySelectorAll('colgroup col'));\n if (cols.length === 0) return;\n\n const containerWidth = tbl.clientWidth || 0;\n const defaultWidth = Math.max(Math.floor(containerWidth / cols.length), 100);\n\n cols.forEach((col, i) => {\n\n if (!col.hasAttribute('data-col')) {\n col.setAttribute('data-col', i);\n }\n\n const width = col.getAttribute('width') || parseInt(col.style.width, 10) || defaultWidth;\n col.setAttribute('width', width);\n\n const widthVal = String(width).includes('px') ? width : `${width}px`;\n col.style.width = widthVal;\n });\n }\n\n static #ensureThead(tbl) {\n if (tbl.querySelector('thead')) return;\n\n const thead = document.createElement('thead');\n const colgroup = tbl.querySelector('colgroup');\n\n if (colgroup) {\n colgroup.after(thead);\n } else {\n tbl.prepend(thead);\n }\n }\n\n static #normalizeCollapsibleAttributes(tbl) {\n const headers = tbl.querySelectorAll('thead th, thead td');\n headers.forEach(cell => {\n const isCollapsed = cell.getAttribute('collapsed') === 'true';\n if (isCollapsed && cell.getAttribute('collapsible') !== 'true') {\n cell.setAttribute('collapsible', 'true');\n }\n });\n }\n\n static #generateCell(host, $tbl) {\n\n const targetAttributes = ['data-bind', 'data-expr', 'type'];\n let autoIdCounter = 0;\n\n $tbl.querySelectorAll('tbody th, tbody td').forEach($cell => {\n const cellType = $cell.getAttribute('cell-type') || \"renderer\";\n const tagName = `cell-${cellType}`;\n\n const $datalist = $cell.querySelector(\"datalist\");\n\n if ($datalist) {\n let l = [];\n $datalist.querySelectorAll('option').forEach($option => {\n l.push({\n k: $option.getAttribute(\"k\"),\n v: $option.getAttribute(\"v\"),\n value: $option.getAttribute(\"value\"),\n });\n });\n\n const uniqueFuncName = `__ds_${Date.now()}_${++autoIdCounter}`;\n\n if (host) {\n host[uniqueFuncName] = () => l;\n }\n\n $cell.setAttribute(\"data-source\", `host.${uniqueFuncName}()`);\n\n $datalist.remove();\n }\n\n const expr = $cell.dataset.expr;\n if (expr) {\n $cell.setAttribute('data-expr', host.exprEngine.precompile(expr));\n }\n\n Array.from($cell.attributes).forEach(attr => {\n if (['data-bind', 'data-expr', 'cell-type', 'validator'].includes(attr.name)) return;\n if (attr.value.includes(\"data.\") || attr.value.includes(\"host.\")) {\n $cell.setAttribute(attr.name, host.exprEngine.precompile(attr.value));\n }\n });\n\n const innerAttrs = targetAttributes\n .filter(attr => $cell.hasAttribute(attr))\n .map(attr => `${attr}=\"${$cell.getAttribute(attr)}\"`);\n\n $cell.innerHTML = `<${tagName} ${innerAttrs.join(' ')}></${tagName}>`;\n $cell.setAttribute('tabindex', '0');\n });\n\n $tbl.querySelectorAll('thead th, thead td, tfoot th, tfoot td').forEach($cell => {\n const cellType = $cell.getAttribute('cell-type');\n if (cellType) {\n const originalContent = $cell.innerHTML;\n const tagName = `cell-${cellType}`;\n const innerAttrs = targetAttributes\n .filter(attr => $cell.hasAttribute(attr))\n .map(attr => `${attr}=\"${$cell.getAttribute(attr)}\"`);\n\n $cell.innerHTML = `<${tagName} ${innerAttrs.join(' ')} content=\"${originalContent}\"></${tagName}>`;\n }\n });\n }\n\n static #initFilterButtons(host, tbl) {\n const hostFilter = host.getAttribute('filtering') === 'true';\n const tableFilter = tbl.getAttribute('filtering') === 'true';\n\n tbl.querySelectorAll('thead tr:not(.col-indicator-rowgroup) th, thead tr:not(.col-indicator-rowgroup) td').forEach(cell => {\n const finalFiltering = cell.getAttribute('filtering') === 'true' || tableFilter || hostFilter;\n\n cell.setAttribute('filtering', finalFiltering ? 'true' : 'false');\n\n if (finalFiltering) {\n cell.appendChild(document.createElement('nine-table-filter-button'));\n }\n });\n }\n\n static #initColExpanders(tbl) {\n\n tbl.querySelectorAll('thead th, thead td').forEach(cell => {\n const isCollapsible = cell.getAttribute('collapsible') === 'true' || cell.getAttribute('expandable') === 'true';\n if (!isCollapsible) return;\n\n const colIndex = parseInt(cell.dataset.col, 10);\n const colSpan = cell.colSpan || 1;\n const col = tbl.querySelector(`colgroup col[data-col=\"${colIndex}\"]`);\n\n const currentWidth = col ? (parseInt(col.getAttribute('width'), 10) || 100) : 100;\n\n if (!cell.dataset.expandWidth || parseInt(cell.dataset.expandWidth, 10) <= COLLAPSED_WIDTH) {\n cell.dataset.expandWidth = String(currentWidth > COLLAPSED_WIDTH ? currentWidth : 100);\n }\n\n let expandBtn = cell.querySelector('nine-table-col-expand');\n if (!expandBtn) {\n expandBtn = document.createElement('nine-table-col-expand');\n cell.insertBefore(expandBtn, cell.firstChild);\n }\n\n const isCollapsed = cell.getAttribute('collapsed') === 'true';\n\n if (isCollapsed) {\n expandBtn.classList.add('collapsed');\n expandBtn.classList.remove('expand');\n expandBtn.setAttribute('collapsed', 'true');\n cell.style.color = 'transparent';\n\n const targetWidth = Math.max(10, Math.floor(COLLAPSED_WIDTH / colSpan));\n if (!isNaN(colIndex)) {\n for (let i = 0; i < colSpan; i++) {\n const targetCol = tbl.querySelector(`colgroup col[data-col=\"${colIndex + i}\"]`);\n if (targetCol) {\n targetCol.setAttribute('width', targetWidth);\n targetCol.style.width = `${targetWidth}px`;\n }\n }\n }\n } else {\n expandBtn.classList.remove('collapsed');\n expandBtn.classList.add('expand');\n expandBtn.setAttribute('collapsed', 'false');\n cell.style.color = '';\n }\n });\n }\n\n static #ensureRowIndicator(tbl, host) {\n\n const w = tbl.getAttribute(\"row-indicator\") === 'true' ? 48 : 4;\n\n const colgroup = tbl.querySelector('colgroup');\n\n\n const col = document.createElement('col');\n //col.className = 'row-indicator-col';\n col.setAttribute('fixed', 'left');\n col.setAttribute('width', w);\n col.style.width = `${w}px`;\n colgroup.prepend(col);\n\n\n tbl.querySelectorAll('thead, tbody, tfoot').forEach(section => {\n const rows = Array.from(section.querySelectorAll('tr'));\n if (rows.length === 0) return;\n\n const firstTr = rows[0];\n\n const indicatorCell = document.createElement('th');\n indicatorCell.className = 'row-indicator';\n indicatorCell.setAttribute('cell-type', 'row-indicator');\n\n if (rows.length > 1) {\n indicatorCell.rowSpan = rows.length;\n }\n\n firstTr.insertBefore(indicatorCell, firstTr.firstElementChild);\n });\n }\n\n static #applyInitialCellWidths(tbl) {\n\n tbl.querySelectorAll('th[data-col], td[data-col]').forEach(cell => {\n\n const startColIdx = parseInt(cell.getAttribute('data-col'), 10);\n if (isNaN(startColIdx)) return;\n\n\n const colSpan = parseInt(cell.getAttribute('colspan') || cell.colSpan, 10) || 1;\n let totalWidth = 0;\n\n\n for (let i = 0; i < colSpan; i++) {\n const targetIdx = startColIdx + i;\n const col = tbl.querySelector(`colgroup col[data-col=\"${targetIdx}\"]`);\n if (col) {\n totalWidth += parseInt(col.getAttribute('width'), 10) || 100;\n }\n }\n\n if (totalWidth > 0) {\n const widthVal = `${totalWidth}px`;\n //cell.style.width = widthVal;\n //cell.style.minWidth = widthVal;\n //cell.style.maxWidth = widthVal;\n }\n });\n }\n}\n","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\n\nexport class SheetAPI {\n #sheet;\n #host;\n\n constructor(sheet) {\n this.#sheet = sheet;\n this.#host = sheet.getRootNode().host;\n }\n\n /**\n currentRow = () => {\n let rows = this.currentRows();\n return (rows.length === 0) ? -1 : rows[0];\n }\n currentRows = () => {\n\n let rows = [];\n this.#shadowRoot.querySelectorAll('nine-table-sheet.active').forEach($sheet => {\n\n const arr = $sheet.view.getArray($sheet.selection.minRow);\n const rowid = arr.m._[NINE_TABLE.META.INDEX.ROWID];\n\n //trace.log(this.data.getArray($sheet.selection.minRow));\n\n rows.push(rowid);\n });\n\n return rows;\n } */\n\n col = {\n // 1. ํน์ ์ปฌ๋ผ์ ๋๋น ์ค์ (ColResizer ํ์ฉ)\n setWidth: (colIndex, width, containerType = null) => {\n const targetCols = Array.from(this.#sheet.querySelectorAll(`table colgroup col[data-col=\"${colIndex}\"]`));\n targetCols.forEach(col => {\n col.setAttribute('width', width);\n col.style.width = `${width}px`;\n });\n\n },\n\n // 2. ํน์ ์ปฌ๋ผ์ ํ์ฌ ๋๋น ๊ฐ์ ธ์ค๊ธฐ\n getWidth: (colIndex) => {\n const colEl = this.#sheet.querySelector(`table colgroup col[data-col=\"${colIndex}\"]`);\n if (!colEl) return 0;\n return parseInt(colEl.getAttribute('width') || colEl.style.width, 10) || 0;\n },\n measureAutoFitColumnWidth: (cell, tbodyCell) => {\n\n const fieldIdx = this.#host.fields.get().indexOf(tbodyCell.dataset.bind);\n const computedStyle = window.getComputedStyle(tbodyCell);\n const font = computedStyle.font || '12px sans-serif';\n let maxTextWidth = 32;\n\n this.#sheet.view.getArray().forEach((record, idx) => {\n const val = String(tbodyCell.dataset.expr ? this.#host.exprEngine.evaluate(tbodyCell.dataset.expr, record, idx) : record.v[fieldIdx] ?? \"\").trim();\n const size = nine.measureTextSize(val, font);\n if (size.width && size.width > maxTextWidth) {\n maxTextWidth = size.width;\n }\n });\n\n return maxTextWidth;\n },\n // 3. ํน์ ์ปฌ๋ผ ์๋ ๋ง์ถค (์๊น ๋ถ๋ฆฌํ measureAutoFitColumnWidth ์ฐ๋)\n autoFit: (colIndex) => {\n const cell = this.#sheet.querySelector(`thead th[data-col=\"${colIndex}\"]`);\n const tbodyCell = this.#sheet.querySelector(`tbody.body [data-col=\"${colIndex}\"]`);\n\n if (!cell || !tbodyCell) return;\n\n this.#host.execute(() => {\n const calculatedWidth = this.col.measureAutoFitColumnWidth(cell, tbodyCell);\n if (calculatedWidth !== null) {\n this.col.setWidth(colIndex, calculatedWidth);\n }\n });\n },\n\n // 4. ์ปฌ๋ผ ํ์/์จ๊น ์ฒ๋ฆฌ\n setVisible: (colIndex, isVisible) => {\n const targets = this.#sheet.querySelectorAll(`table colgroup col[data-col=\"${colIndex}\"], th[data-col=\"${colIndex}\"], td[data-col=\"${colIndex}\"]`);\n targets.forEach(el => {\n el.style.display = isVisible ? '' : 'none';\n });\n this.#sheet.rowManager?.refresh();\n }\n };\n\n row = {\n at: () => {\n if (this.#sheet.selection.minRow < 0) return -1;\n return Math.floor(this.#sheet.selection.minRow / this.#sheet.template.length);\n },\n focus: async (index, callback) => {\n // 1. ํ๋ฉด์ ์ ๋ณด์ด๋ฉด moveTo ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆผ\n if (!this.#sheet.row.isVisible(index)) {\n await new Promise((resolve) => {\n this.#sheet.row.moveTo(index, () => {\n resolve();\n });\n });\n } else {\n // 2. ์ด๋ฏธ ๋ณด์ด๋๋ผ๋ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ํ์ ํ ํ
ํฌ ์๋ณด (requestAnimationFrame)\n await new Promise((resolve) => requestAnimationFrame(resolve));\n }\n\n // 3. ๋ ๋๋ง์ด ์์ ํ ์์ ํ๋ ์์ ์ DOM ์กฐํ ๋ฐ ์ ํ ์ฒ๋ฆฌ\n const $trs = this.#sheet.querySelectorAll(`tbody.body tr[data-index=\"${index}\"]`);\n const matrixRows = Array.from($trs, $tr => parseInt($tr.dataset.matrixRow, 10)).filter(n => !isNaN(n));\n\n const cols = [];\n $trs.forEach($tr => {\n $tr.querySelectorAll('td, th').forEach($cell => {\n const col = parseInt($cell.dataset.col, 10);\n if (col != 0) cols.push(parseInt($cell.dataset.col, 10));\n });\n });\n\n if (matrixRows.length === 0 || cols.length === 0) return;\n\n const result = this.#sheet.selection.setRange(Math.min(...matrixRows), Math.min(...cols), Math.max(...matrixRows), Math.max(...cols));\n\n if (typeof callback === 'function') {\n callback();\n }\n\n return result;\n },\n isVisible: (index) => {\n\n const $sheetBody = this.#sheet.querySelector('.ng-sheet-body');\n\n const $trs = $sheetBody.querySelectorAll(`.ng-container-body tbody.body tr[data-index=\"${index}\"]`);\n if (!$trs || $trs.length === 0) return false;\n\n const viewportRect = $sheetBody.getBoundingClientRect();\n const theadHeight = $sheetBody.querySelector('thead')?.offsetHeight || 0;\n const tfootHeight = $sheetBody.querySelector('tfoot')?.offsetHeight || 0;\n\n const viewportTop = viewportRect.top + theadHeight;\n const viewportBottom = viewportRect.bottom - tfootHeight;\n\n let isVisible = true;\n\n for (const $tr of $trs) {\n const trRect = $tr.getBoundingClientRect();\n\n const isAbove = trRect.top < viewportTop;\n const isBelow = trRect.bottom > viewportBottom;\n\n if (isAbove || isBelow) {\n isVisible = false;\n break;\n }\n }\n\n return isVisible;\n },\n add: (dataSource, updateState) => {\n return this.#host.data.add(dataSource, updateState);\n },\n moveTo: (index, callback) => {\n if (this.#sheet.row.isVisible(index)) {\n if (typeof callback === 'function') callback();\n } else {\n this.#sheet.scrollTo(index, () => {\n if (typeof callback === 'function') callback();\n });\n }\n },\n insert: (index, dataSource, updateState = true) => {\n\n const currentJson = this.#sheet.view.get(index);\n const rowid = currentJson.m._[NINE_TABLE.META.INDEX.ROWID];\n\n const toRowid = this.#host.data.insert(rowid, dataSource, updateState);\n const records = this.#sheet.view.getArray();\n\n const targetIndex = records.findIndex(record => {\n if (!record || !record.m || !record.m._) return false;\n return record.m._[NINE_TABLE.META.INDEX.ROWID] === toRowid; // ํ์
์ฐจ์ด ๋ฐฉ์ง๋ฅผ ์ํด == ์ฌ์ฉ\n });\n\n return targetIndex;\n },\n remove: (index) => {\n\n const currentJson = this.#sheet.view.get(index);\n const rowid = currentJson.m._[NINE_TABLE.META.INDEX.ROWID];\n\n this.#host.data.remove(rowid);\n },\n };\n}","import { trace } from \"@nopeer\";\nimport './nine-table-hscrollbar.js';\nimport './nine-table-vscrollbar.js';\nimport { RowManager } from './core/RowManager.js';\nimport { TableCompiler } from \"./core/TableCompiler.js\";\nimport { CellSelection } from \"@/cell-manager/CellSelection.js\";\nimport { CellNavigation } from \"@/cell-manager/CellNavigation.js\";\n\nimport { ColResizer } from \"@/col/ColResizer.js\";\nimport { ColMover } from \"@/col/ColMover.js\";\nimport { ColFixManager } from \"@/col/ColFixManager.js\";\n\nimport { Filtering } from \"@/data/Filtering.js\";\nimport { GroupingManager } from \"@/data/Grouping.js\";\nimport { Sorting } from \"@/data/Sorting.js\";\nimport { SheetView } from \"@/data/SheetView.js\";\n\nimport { PreCompiler } from \"@/layout/core/PreCompiler.js\";\nimport { SheetAPI } from \"@/api/SheetAPI.js\";\n\nexport class NineTableSheet extends HTMLElement {\n #index;\n #host;\n #rowManager;\n #cellSelection;\n #cellNavigation;\n #colResizer;\n #colMover;\n #colFix;\n #sorting;\n #filtering;\n #grouping;\n #api;\n\n #view;\n\n #source = {\n table: null,\n };\n\n #elements;\n\n #template = {\n length: 0,\n height: 0,\n heights: [],\n };\n\n static SCROLLBAR_SIZE = 16;\n\n constructor() {\n super();\n\n this.#host = this.getRootNode().host;\n this.#rowManager = new RowManager(this);\n\n this.#api = new SheetAPI(this);\n\n this.#bindApiMethods();\n }\n\n connectedCallback() {\n this.#init();\n }\n\n get template() { return this.#template; }\n get index() { return this.#index; }\n get colResizer() { return this.#colResizer; }\n get filtering() { return this.#filtering; }\n get grouping() { return this.#grouping; }\n get colMover() { return this.#colMover; }\n get colFix() { return this.#colFix; }\n get rowManager() { return this.#rowManager; }\n get selection() { return this.#cellSelection; }\n get navigation() { return this.#cellNavigation; }\n get templateLength() { return this.#source.tbody.tr.length || 0; }\n\n get elements() { return this.#elements; }\n\n /**\n get template() {\n return {\n length: this.#source?.tbody?.tr?.length || 0,\n trs: this.#source?.tbody?.tr || []\n };\n } */\n\n get isAutoFitCol() {\n const attrTrue = this.getAttribute('auto-fit-col') === 'true' || this.#host?.getAttribute('auto-fit-col') === 'true';\n const sourceTableTrue = this.#source.table?.getAttribute('auto-fit-col') === 'true';\n return attrTrue || sourceTableTrue;\n }\n\n get sourceTable() {\n return this.#source.table;\n }\n\n get source() {\n return this.#source;\n }\n\n get #isSimple() {\n return this.#host.hasAttribute('simple') || this.#host.getAttribute('theme') === 'simple';\n }\n\n scrollTo = (dataRow, callback) => {\n this.rowManager.scrollToDataRow(dataRow, 'top', callback);\n }\n\n recompileAndRefresh() {\n if (!this.#source.table) return;\n\n TableCompiler.recompile(this.#source.table);\n\n ['left', 'right', 'body'].forEach(type => {\n ['header', 'body', 'footer'].forEach(section => {\n const container = this.querySelector(`.ng-sheet-${section} .ng-container-${type}`);\n if (!container) return;\n container.querySelectorAll('table').forEach(tbl => tbl.remove());\n });\n });\n\n this.#renderSplitContainers();\n\n this.#updateContainerWidths();\n\n this.#rowManager.initialize();\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n } else {\n this.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n requestAnimationFrame(() => {\n this.#updateContainerWidths();\n this.#rowManager?.refresh();\n });\n }\n\n refreshLayout() {\n\n requestAnimationFrame(() => {\n\n if (!this.classList.contains('active') || !this.#source.table) return;\n\n this.#updateContainerWidths();\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n } else {\n this.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n this.#adjustOverlay();\n\n this.#colResizer?.refreshLayout();\n\n this.#rowManager?.refresh();\n });\n }\n\n #adjustOverlay = () => {\n const $thead = this.querySelector('.ng-container-body thead');\n const $overlay = this.querySelector('.nodata-overlay');\n $overlay.style.top = `${$thead?.offsetHeight}px`;\n }\n\n get view() {\n if (!this.#view && this.#host?.data) {\n this.#view = new SheetView(this);\n }\n return this.#view;\n }\n\n invalidate = () => {\n\n this.view.refresh();\n\n this.#rowManager.refresh(true);\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n }\n };\n\n autoFit = (enable = true) => {\n requestAnimationFrame(() => {\n this.#autoFit?.(enable);\n });\n };\n\n #autoFit = (enable = true) => {\n\n const container = this.querySelector('.ng-sheet-body .ng-container-body');\n if (!container) return;\n\n const firstColgroup = this.querySelector('.ng-container-body table colgroup');\n if (!firstColgroup) return;\n\n if (enable) {\n this.setAttribute('auto-fit-col', 'true');\n const containerWidth = container.clientWidth;\n if (containerWidth <= 0) return;\n\n let totalOriginalWidth = 0;\n const colList = [];\n\n firstColgroup.querySelectorAll('col').forEach(col => {\n const globalColIndex = col.getAttribute('data-col');\n const headerCell = this.querySelector(`thead th[data-col=\"${globalColIndex}\"]`);\n const isCollapsed = headerCell?.getAttribute('collapsed') === 'true';\n\n if (isCollapsed) {\n colList.unshift({ globalColIndex, width: 16, isCollapsed: true });\n } else {\n const w = parseInt(col.getAttribute('width'), 10) || 100;\n colList.push({ globalColIndex, width: w, isCollapsed: false });\n totalOriginalWidth += w;\n }\n });\n\n const collapsedTotalWidth = colList\n .filter(c => c.isCollapsed)\n .reduce((sum, c) => sum + c.width, 0);\n\n const availableWidth = Math.max(0, containerWidth - collapsedTotalWidth);\n\n if (totalOriginalWidth > 0 && colList.length > 0) {\n let allocatedTotal = 0;\n\n const calculatedCols = colList.map(item => {\n if (item.isCollapsed) {\n return { globalColIndex: item.globalColIndex, remainder: 0, width: 16 };\n }\n\n const exactWidth = (item.width * availableWidth) / totalOriginalWidth;\n const baseWidth = Math.max(30, Math.floor(exactWidth));\n allocatedTotal += baseWidth;\n return {\n globalColIndex: item.globalColIndex,\n remainder: exactWidth - Math.floor(exactWidth),\n width: baseWidth\n };\n });\n\n let remainderPixels = availableWidth - allocatedTotal;\n\n const uncollapsedCols = calculatedCols.filter(c => !colList.find(item => item.globalColIndex === c.globalColIndex)?.isCollapsed);\n\n if (remainderPixels > 0 && uncollapsedCols.length > 0) {\n uncollapsedCols.sort((a, b) => b.remainder - a.remainder);\n for (let i = 0; i < remainderPixels; i++) {\n uncollapsedCols[i % uncollapsedCols.length].width += 1;\n }\n } else if (remainderPixels < 0 && uncollapsedCols.length > 0) {\n uncollapsedCols.sort((a, b) => a.remainder - b.remainder);\n for (let i = 0; i < Math.abs(remainderPixels); i++) {\n const target = uncollapsedCols[i % uncollapsedCols.length];\n if (target.width > 30) target.width -= 1;\n }\n }\n\n calculatedCols.forEach(({ globalColIndex, width }) => {\n this.#colResizer?.setColumnWidth(globalColIndex, width, 'body');\n });\n }\n } else {\n this.removeAttribute('auto-fit-col');\n }\n\n this.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n generateTemplate = ($table, index) => {\n\n const activeParent = (v) => {\n\n if (['NINE-TABLE-SIMPLE'].includes(this.#host.tagName)) {\n const $parent = this.#host.closest(\"nine-table-filter-panel, cell-combo-panel\");\n if ($parent) {\n v ? $parent.classList.add('active') : $parent.classList.remove('active');\n }\n }\n };\n\n activeParent(true);\n\n this.#index = index;\n\n this.#source = {\n table: TableCompiler.compile($table),\n tbody: {\n tr: $table.querySelectorAll(\"tbody tr\"),\n }\n };\n\n this.querySelector(`.ng-container-body`).appendChild(this.#source.table);\n\n this.#template.height = this.#template.length = 0;\n this.#template.heights = [];\n this.querySelectorAll(`.ng-container-body tbody.body tr`).forEach(($tr) => {\n this.#template.height += Math.max($tr.offsetHeight || 0, 28);\n this.#template.heights.push($tr.offsetHeight || 0);\n //if (['NINE-TABLE-SIMPLE'].includes(this.#host.tagName)) {\n // trace.log(this.#host, $tr.offsetHeight, $tr.clientHeight);\n //}\n });\n this.#template.length = this.#template.heights.length;\n\n if (this.#index === 0) {\n const minRows = parseInt(this.#host.getAttribute('display-min-rows'), 10);\n const maxRows = parseInt(this.#host.getAttribute('display-max-rows'), 10);\n\n const h = (this.querySelector(\"nine-table-toolbar\")?.offsetHeight || 0) +\n (this.querySelector(\"nine-table-footer\")?.offsetHeight || 0) +\n (this.querySelector(\"thead\")?.offsetHeight || 0) +\n (this.querySelector(\"tfoot\")?.offsetHeight || 0) +\n (this.querySelector(\"tbody.head\")?.offsetHeight || 0);\n\n if (this.#host.getAttribute('auto-height') === \"true\" || !isNaN(minRows) || !isNaN(maxRows)) {\n this.#host.setAttribute('scroll-bar', \"none\");\n }\n\n if (!isNaN(minRows)) {\n this.#host.style.minHeight = h + (this.#template.height * minRows) + \"px\";\n }\n\n if (!isNaN(maxRows)) {\n this.#host.style.maxHeight = h + (this.#template.height * maxRows) + \"px\";\n }\n }\n\n this.querySelectorAll((\"tbody.body tr\")).forEach(($tr) => {\n $tr.style.display = \"none\";\n });\n\n this.querySelector(`.ng-container-body table`).remove();\n\n activeParent(false);\n };\n\n generate = () => {\n\n this.#renderSplitContainers();\n\n this.#updateContainerWidths();\n\n this.#syncHeaderAndFooterHeights();\n\n this.#initRowHoverEvent();\n\n ['left', 'body', 'right'].forEach(type => {\n const prefix = `.ng-container-${type}`;\n this.#elements[type] = {\n thead: this.querySelector(`${prefix} thead`),\n tbody: {\n head: this.querySelector(`${prefix} tbody.head`),\n body: this.querySelector(`${prefix} tbody.body`),\n foot: this.querySelector(`${prefix} tbody.foot`),\n },\n tfoot: this.querySelector(`${prefix} tfoot`),\n };\n });\n\n this.#rowManager.initialize();\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n } else {\n this.querySelector('nine-table-hscrollbar').refresh();\n }\n\n this.#grouping.initialize();\n\n this.loaded = true;\n };\n\n\n #updateContainerWidths = () => {\n\n if (this.#host.classList.contains(\"combo-list\")) return;\n\n ['left', 'right', 'body'].forEach(type => {\n const containers = this.querySelectorAll(`.ng-container-${type}`);\n if (containers.length === 0) return;\n\n const firstTable = containers[0].querySelector('table');\n if (!firstTable) return;\n\n let width = 0;\n firstTable.querySelectorAll('col').forEach(col => {\n const w = parseInt(col.getAttribute('width'), 10);\n if (!isNaN(w)) width += w;\n });\n\n containers.forEach(container => {\n const tables = container.querySelectorAll('table');\n if (type === 'body') {\n container.style.flex = `1`;\n } else {\n container.style.flex = `0 0 ${width}px`;\n container.style.width = `${width}px`;\n container.style.minWidth = `${width}px`;\n container.style.maxWidth = `${width}px`;\n }\n });\n });\n };\n\n #renderSplitContainers = () => {\n const colTypes = [\n { selector: '.ng-container-left', type: 'left' },\n { selector: '.ng-container-body', type: null },\n { selector: '.ng-container-right', type: 'right' }\n ];\n\n colTypes.forEach(({ selector, type }) => {\n this.querySelector(`.ng-sheet-body ${selector}`).appendChild(this.#createSplitTable(type));\n });\n };\n\n #createSplitTable = (targetFixedType) => {\n\n const $tbl = this.#source.table.cloneNode(true);\n\n if (targetFixedType === 'left') {\n $tbl.querySelectorAll(\"col, th, td\").forEach($el => {\n if ($el.getAttribute(\"fixed\") !== \"left\") $el.remove();\n });\n } else if (targetFixedType === 'right') {\n $tbl.querySelectorAll(\"col, th, td\").forEach($el => {\n if ($el.getAttribute(\"fixed\") !== \"right\") $el.remove();\n });\n } else {\n $tbl.querySelectorAll(\"[fixed=left], [fixed=right]\").forEach($el => {\n $el.remove();\n });\n }\n\n return $tbl;\n };\n\n getRowHeight = () => {\n return this.#rowManager.getRowHeight();\n };\n\n getViewHeight = () => {\n\n const viewHeight = this.#elements.content.offsetHeight || 0;\n\n const fixedHeight = (this.#elements.body.thead?.offsetHeight || 0) +\n (this.#elements.body.tfoot?.offsetHeight || 0) +\n (this.#elements.body.tbody.head.offsetHeight || 0);\n\n return viewHeight - fixedHeight;\n };\n\n isLastRow = () => {\n\n const sheet = this.querySelector('.ng-sheet-body');\n const tbody = this.querySelector(\".ng-container-body tbody.body\");\n\n const offsetHeight = (this.#elements.body.tfoot?.offsetHeight || 0);\n\n const sheetBottom = sheet.getBoundingClientRect().bottom;\n const tbodyBottom = tbody.getBoundingClientRect().bottom;\n\n return (sheetBottom - offsetHeight) >= tbodyBottom;\n };\n\n scrollToX = (scrollLeft) => {\n const bodyContainer = this.querySelector('.ng-sheet-body .ng-container-body');\n if (bodyContainer) bodyContainer.scrollLeft = scrollLeft;\n };\n\n scrollToY = (scrollTop) => {\n const bodyViewport = this.querySelector('.ng-sheet-body');\n if (bodyViewport) bodyViewport.scrollTop = scrollTop;\n };\n\n #init = () => {\n\n this.#render();\n\n this.#cellSelection = new CellSelection(this);\n this.#cellNavigation = new CellNavigation(this);\n this.#colResizer = new ColResizer(this);\n this.#colMover = new ColMover(this);\n this.#colFix = new ColFixManager(this);\n\n this.#view = new SheetView(this);\n this.#filtering = new Filtering(this);\n this.#grouping = new GroupingManager(this);\n\n if (!this.#isSimple) {\n this.#sorting = new Sorting(this);\n }\n\n this.#elements.mainBody.addEventListener('scroll', (e) => {\n this.querySelectorAll(\"nine-table-filter-panel,cell-combo-panel\").forEach($el => {\n $el.classList.remove('active');\n });\n this.querySelector(\"nine-table-hscrollbar\").refresh();\n });\n };\n\n\n\n #render = () => {\n\n this.setAttribute(\"tabindex\", \"0\");\n\n this.innerHTML = `\n <div class=\"ng-sheet-body\">\n <div class=\"ng-sheet-body-content\">\n <div class=\"ng-container-left\"></div>\n <div class=\"ng-container-body\">\n \n </div>\n <div class=\"ng-container-right\"></div>\n </div>\n <div class=\"ng-virtual-height-holder\"></div>\n </div>\n\n <div class=\"nodata-overlay\">Data Not Found</div>\n\n <nine-table-vscrollbar></nine-table-vscrollbar>\n <nine-table-hscrollbar></nine-table-hscrollbar>\n <div class=\"scroll-edge\"></div>\n \n <nine-table-col-resizer-panel></nine-table-col-resizer-panel>\n \n \n <div class=\"ng-col-mover-grip\"></div>\n <div class=\"ng-col-mover-indi\"></div>\n `;\n\n this.#elements = {\n mainBody: this.querySelector('.ng-sheet-body .ng-container-body'),\n hscrollbar: this.querySelector('nine-table-hscrollbar'),\n vscrollbar: this.querySelector('nine-table-vscrollbar'),\n content: this.querySelector('.ng-sheet-body .ng-sheet-body-content'),\n scrollHolder: this.querySelector('.ng-sheet-body .ng-virtual-height-holder'),\n }\n };\n\n #syncHeaderAndFooterHeights = () => {\n\n const leftTable = this.querySelector('.ng-container-left table');\n const bodyTable = this.querySelector('.ng-container-body table');\n const rightTable = this.querySelector('.ng-container-right table');\n\n const leftHeaderRows = Array.from(leftTable.querySelectorAll('thead tr:not(.col-indicator-rowgroup)'));\n const bodyHeaderRows = Array.from(bodyTable.querySelectorAll('thead tr:not(.col-indicator-rowgroup)'));\n const rightHeaderRows = Array.from(rightTable.querySelectorAll('thead tr:not(.col-indicator-rowgroup)'));\n\n this.#applyMaxHeights(leftHeaderRows, bodyHeaderRows, rightHeaderRows);\n\n const leftFooterRows = Array.from(leftTable.querySelectorAll('tfoot tr'));\n const bodyFooterRows = Array.from(bodyTable.querySelectorAll('tfoot tr'));\n const rightFooterRows = Array.from(rightTable.querySelectorAll('tfoot tr'));\n\n this.#applyMaxHeights(leftFooterRows, bodyFooterRows, rightFooterRows);\n };\n\n #applyMaxHeights = (leftRows, bodyRows, rightRows) => {\n\n setTimeout(() => {\n const maxRows = Math.max(leftRows.length, bodyRows.length, rightRows.length);\n\n for (let i = 0; i < maxRows; i++) {\n\n const heights = [\n leftRows[i]?.getBoundingClientRect().height || 0,\n bodyRows[i]?.getBoundingClientRect().height || 0,\n rightRows[i]?.getBoundingClientRect().height || 0\n ];\n const maxHeight = Math.max(...heights);\n\n if (maxHeight > 0) {\n if (leftRows[i]) leftRows[i].style.height = `${maxHeight}px`;\n if (bodyRows[i]) bodyRows[i].style.height = `${maxHeight}px`;\n if (rightRows[i]) rightRows[i].style.height = `${maxHeight}px`;\n }\n }\n });\n };\n\n #initRowHoverEvent = () => {\n const bodyViewport = this.querySelector('.ng-sheet-body');\n if (!bodyViewport) return;\n\n let activeRowIndex = null;\n\n bodyViewport.addEventListener('mouseover', (e) => {\n const tr = e.target.closest('tr');\n if (!tr || !tr.dataset.row && tr.dataset.row !== '0') return;\n\n const rowIndex = tr.dataset.row;\n if (activeRowIndex === rowIndex) return;\n activeRowIndex = rowIndex;\n\n bodyViewport.querySelectorAll(`tr[data-row=\"${rowIndex}\"]`).forEach($tr => {\n $tr.classList.add('hover');\n });\n });\n\n bodyViewport.addEventListener('mouseout', (e) => {\n const tr = e.target.closest('tr');\n if (!tr) return;\n\n const relatedTarget = e.relatedTarget;\n if (tr.contains(relatedTarget)) return;\n\n bodyViewport.querySelectorAll('tr.hover').forEach($tr => {\n $tr.classList.remove('hover');\n });\n activeRowIndex = null;\n });\n }\n\n #bindApiMethods = () => {\n //const apis = [this.#sheetAPI, this.#dataAPI];\n const apis = [this.#api];\n\n apis.forEach(api => {\n // api ์ธ์คํด์ค(this)์ ์ง์ ์ ์ธ๋ ์์ฑ๋ค๊ณผ ํ๋กํ ํ์
์์ฑ์ ๋ชจ๋ ๊ฐ์ ธ์ด\n // Reflect.ownKeys๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ณผ์ด๋ ์จ๊ฒจ์ง ํ๋กํผํฐ๊น์ง ์์ ํ๊ฒ ํ์ ๊ฐ๋ฅํฉ๋๋ค.\n const keys = new Set([\n ...Reflect.ownKeys(api),\n ...Reflect.ownKeys(Object.getPrototypeOf(api))\n ]);\n\n keys.forEach(key => {\n // constructor๋ ๋ด๋ถ ํ๋ผ์ด๋น ๋ฉค๋ฒ(#)๋ ์ ์ธ\n if (key === 'constructor' || String(key).startsWith('#')) return;\n\n const target = api[key];\n\n if (typeof target === 'function') {\n if (!this[key]) {\n //trace.log(`[Binding Function] ${key}`);\n this[key] = (...args) => target.apply(api, args);\n }\n } else if (target !== null && typeof target === 'object') {\n\n if (!this[key]) {\n //trace.log(`[Binding Object Namespace] ${key}`);\n this[key] = target; // ๊ฐ์ฒด ๋ค์์คํ์ด์ค(์: row) ํต์งธ๋ก ์ฐ๊ฒฐ\n }\n }\n });\n });\n }\n\n disconnectedCallback() {\n this.#colResizer?.destroy();\n this.#colMover?.destroy();\n this.innerHTML = '';\n }\n}\n\nif (!customElements.get('nine-table-sheet')) {\n customElements.define('nine-table-sheet', NineTableSheet);\n}","import { trace } from \"@nopeer\";\nimport '@/layout/nine-table-sheets.js';\nimport '@/layout/nine-table-sheets-footer.js';\nimport '@/layout/nine-table-toolbar.js';\nimport { NineTableSheet } from \"@/layout/nine-table-sheet.js\";\nimport {PreCompiler} from \"@/layout/core/PreCompiler.js\";\nimport {NINE_TABLE} from \"@\";\n\nexport class LayoutManager {\n #host;\n\n constructor(owner) {\n this.#host = owner;\n this.#init();\n }\n\n #init = () => {\n this.#render();\n this.#initEvent();\n }\n\n set loading(val) {\n if (!!val) {\n this.#host.classList.add(\"loading\");\n } else {\n this.#host.classList.remove(\"loading\");\n }\n }\n\n\n\n #render = () => {\n\n const rawElements = Array.from(this.#host.children);\n const rawTables = rawElements.filter(el => (el.tagName.toUpperCase() === 'TABLE') );\n const sheetCount = rawTables.length;\n\n const sheetsHtml = rawTables.map((tbl, idx) => {\n const className = idx === 0 ? 'active' : '';\n const sheetId = tbl.id || `sheet${idx + 1}`;\n\n const sheetTag = `<nine-table-sheet class=\"${className}\" data-index=\"${idx}\" data-sheet-id=\"${sheetId}\" id=\"${sheetId}\"></nine-table-sheet>`;\n const splitterTag = idx < sheetCount - 1 ? `<nine-splitter class=\"h\" data-split-index=\"${idx}\"></nine-splitter>` : '';\n return sheetTag + splitterTag;\n }).join('');\n\n const cssImports = [\n `@import \"https://cdn.jsdelivr.net/npm/@ninebone/datagrid@${__APP_VERSION__}/dist/css/nine-table.css\";`,\n ];\n\n if (nine[\"nine-table\"] && nine[\"nine-table\"].cssFile) {\n cssImports.push(`@import \"${nine[\"nine-table\"].cssFile}\";`);\n }\n\n this.#host.shadowRoot.innerHTML = `\n <style>\n ${cssImports.join('\\n')}\n ${this.#host.provider.style.value}\n </style>\n \n <nine-table-toolbar></nine-table-toolbar>\n\n <nine-table-body>\n <nine-table-summary></nine-table-summary>\n <div class=\"ng-loading-bar\"></div>\n <nine-table-sheets>\n <nine-table-sheets-body>\n ${sheetsHtml}\n </nine-table-sheets-body>\n <nine-table-sheets-footer></nine-table-sheets-footer>\n </nine-table-sheets>\n <nine-table-analysis></nine-table-analysis>\n </nine-table-body>\n <nine-table-footer></nine-table-footer>\n `;\n\n rawTables.forEach($el => {\n PreCompiler.initializeTable(this.#host, $el);\n })\n\n this.#host.shadowRoot.querySelectorAll('nine-table-sheet').forEach(($sheet, idx) => {\n $sheet.classList.add('active');\n $sheet.generateTemplate(rawTables[idx], idx);\n });\n\n this.#host.shadowRoot.querySelectorAll('nine-table-sheet').forEach(($sheet) => {\n\n setTimeout(() => {\n $sheet.generate();\n if (this.#isAutoHeight) this.#applyAutoHeight();\n });\n });\n\n\n setTimeout(() => {\n this.#host.data.clear();\n });\n };\n\n #initEvent = () => {\n\n this.#host.addEventListener(NINE_TABLE.EVENT.ROW_ADDED, () => {\n if (this.#isAutoHeight) this.#applyAutoHeight();\n });\n\n this.#host.addEventListener(NINE_TABLE.EVENT.ROW_REMOVED, () => {\n if (this.#isAutoHeight) this.#applyAutoHeight();\n });\n\n let lastHeight = 0; // ์ง์ ๋์ด๋ฅผ ๊ธฐ์ตํ ๋ณ์\n\n new ResizeObserver((entries) => {\n for (let entry of entries) {\n if (entry.target.tagName === \"NINE-TABLE\") {\n const currentHeight = entry.contentRect.height;\n\n if (currentHeight !== lastHeight) {\n lastHeight = currentHeight;\n if (this.#isAutoHeight) {\n this.#applyAutoHeight();\n }\n }\n }\n }\n }).observe(this.#host);\n };\n\n #applyAutoHeight = () => {\n this.#host.shadowRoot.querySelectorAll('nine-table-sheet').forEach(($sheet) => {\n if ($sheet.index === 0) {\n const fixedHeight = ($sheet.querySelector(\"thead\")?.offsetHeight || 0) +\n ($sheet.querySelector(\"tfoot\")?.offsetHeight || 0) +\n ($sheet.querySelector(\"tbody.head\")?.offsetHeight || 0);\n const basicHeight = this.#host.offsetHeight - $sheet.offsetHeight + fixedHeight;\n\n const h = Math.min($sheet.template.height * $sheet.view.count(), window.innerHeight * 0.8);\n\n this.#host.style.height = basicHeight + (h) + \"px\";\n }\n });\n };\n\n get #isAutoHeight() {\n return this.#host.getAttribute('auto-height') === 'true';\n }\n}","import { trace } from \"@nopeer\";\n\nexport class ExprEngine {\n #host;\n #fields;\n #exprCache = new Map(); // ๐ก ํตํฉ๋ ๋จ์ผ ์บ์๋ก ๋ชจ๋ ์ปดํ์ผ๋ ํจ์ ๊ด๋ฆฌ\n\n constructor(host) {\n this.#host = host;\n this.#fields = host.fields.get();\n }\n\n rewriteExpr(expr) {\n\n if (!expr || !this.#fields.length) return expr;\n\n return expr.replace(/data\\.([a-zA-Z_$][\\w$]*)/g, (match, fieldName) => {\n const idx = this.#fields.indexOf(fieldName);\n return idx >= 0 ? `rowItem.v[${idx}]` : match;\n });\n }\n\n precompile(expr) {\n if (!expr) return expr;\n return this.rewriteExpr(expr);\n }\n\n evaluate(expr, rowItem, row = 0) {\n\n if (expr === undefined || expr === null) return \"\";\n\n try {\n const trimmedExpr = String(expr).trim();\n const compiledExpr = this.rewriteExpr(trimmedExpr);\n\n if (compiledExpr.includes(\"provider.\") || compiledExpr.includes(\"host.\") || compiledExpr.includes(\"data.\") || compiledExpr.includes(\"rowItem.v\") || compiledExpr.includes(\"(\")) {\n\n let evalFn = this.#exprCache.get(compiledExpr);\n\n if (!evalFn) {\n evalFn = new Function('rowItem', 'row', 'host', `\n const data = rowItem;\n const provider = host;\n\n if (!data && !host) return \"\";\n return ${compiledExpr};\n `);\n\n this.#exprCache.set(compiledExpr, evalFn);\n }\n\n return evalFn(rowItem, row, this.#host);\n }\n\n return compiledExpr;\n } catch (e) {\n /**\n if (expr.includes(\"getCommonCode\")) {\n console.trace(\"ExprEngine evaluation error:\", e);\n } */\n return expr;\n }\n }\n}","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\n\nexport class DataAPI {\n\n #host;\n\n constructor(host) {\n this.#host = host;\n }\n\n provider = {\n // ์คํ์ผ ๋ฐ์ดํฐ๋ฅผ provider ๊ฐ์ฒด ๋ด๋ถ์์ ์ง์ ๊ด๋ฆฌ (์ผ๋ฐ ๋ฉ์๋ ์ถ์ฝํ ์ฌ์ฉ)\n style: {\n value: '',\n },\n add: (providerObj) => {\n if (!providerObj || typeof providerObj !== 'object') return;\n\n const { style, ...methods } = providerObj;\n\n if (style && typeof style === 'string') {\n this.provider.style.value = style;\n }\n\n if (Object.keys(methods).length > 0) {\n setTimeout(() => {\n Object.entries(methods).forEach(([name, fn]) => {\n if (typeof fn === 'function') {\n this.#host[name] = fn;\n }\n });\n\n this.#host.rerenderer();\n });\n }\n },\n }\n\n}","export class NineTableAPI {\n #host;\n\n constructor(host) {\n this.#host = host;\n\n // ๊ด๋ฆฌํ ๋ค์์คํ์ด์ค๋ค์ ๋ฐฐ์ด๋ก ์ ์\n const namespaces = [\"col\", \"row\"]; // ๋์ค์ \"col\", \"cell\" ๋ฑ๋ง ์ถ๊ฐํ๋ฉด ๋!\n\n namespaces.forEach(ns => {\n this[ns] = new Proxy({}, {\n get: (target, prop) => {\n const $sheet = this.#getActiveSheet();\n if (!$sheet || !$sheet[ns]) return undefined;\n\n const targetMethod = $sheet[ns][prop];\n\n if (typeof targetMethod === 'function') {\n return (...args) => targetMethod.apply($sheet[ns], args);\n }\n return targetMethod;\n }\n });\n });\n }\n\n getActiveSheets() {\n return this.#host.shadow.querySelectorAll('nine-table-sheet.active');\n }\n\n #getActiveSheet() {\n const arr = this.getActiveSheets();\n return arr.length > 0 ? arr[0] : null;\n }\n}","import { trace } from \"@nopeer\";\nimport { ngDataManager } from '@/data/ngDataManager.js';\nimport { fields } from \"@/data/Fields.js\";\nimport { LayoutManager } from '@/layout/core/LayoutManager.js';\nimport { ExprEngine } from \"@/core/ExprEngine.js\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport { DataAPI } from '../api/DataAPI.js';\nimport { NineTableAPI } from '../api/NineTableAPI.js';\n\nexport default class NineTable extends HTMLElement {\n #shadowRoot;\n #dataManager;\n #layoutManager;\n #dataApi;\n #sheetApi;\n #templateCnt = 0;\n\n constructor() {\n super();\n\n if ([\"NINE-TABLE\"].includes(this.tagName)) {\n trace.log(\"Welcome nine-table\", __APP_VERSION__);\n }\n\n this.#shadowRoot = this.attachShadow({ mode: 'open' });\n this.#dataManager = new ngDataManager(this);\n\n this.#dataApi = new DataAPI(this);\n this.#sheetApi = new NineTableAPI(this);\n\n this.#bindApiMethods();\n }\n\n connectedCallback() {\n setTimeout(() => {\n this.#templateCnt = this.querySelectorAll(\"table\")?.length;\n\n this.fields = new fields(this);\n this.exprEngine = new ExprEngine(this);\n\n this.#bindDynamicSetters();\n\n this.#layoutManager = new LayoutManager(this);\n\n this.#dispatchLoad();\n });\n }\n\n disconnectedCallback() {\n //trace.log('NineTable disconnected.');\n }\n\n #dispatchLoad = () => {\n\n let checkCount = 0;\n const maxChecks = 50; // ์ต๋ 5์ด ๋๊ธฐ (100ms * 50)\n\n const checkTimer = setInterval(() => {\n checkCount++;\n\n const sheets = this.shadow.querySelectorAll('nine-table-sheet');\n\n if (checkCount >= maxChecks) {\n clearInterval(checkTimer);\n }\n\n if (sheets.length >= this.#templateCnt) {\n let loadSheetCnt = 0;\n sheets.forEach($sheet => {\n if ($sheet.loaded) loadSheetCnt++;\n });\n\n if (loadSheetCnt >= this.#templateCnt) {\n clearInterval(checkTimer);\n this.loaded = true;\n this.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.LOAD, { bubbles: true, detail: { target: this } }));\n }\n }\n }, 100);\n }\n\n // ๐ฏ ๊ณตํต ๋ฐ์ดํฐ & API ์ ๊ทผ์\n get shadow() { return this.#shadowRoot; }\n get dataManager() { return this.#dataManager; }\n get data() { return this.#dataManager.data; }\n //get row() { return this.#dataManager.row; }\n\n\n\n\n\n setData(records) {\n this.#dataManager.data.set(records);\n this.refresh();\n }\n\n refresh() {\n this.activeSheet?.invalidate();\n }\n\n\n set loading(val) {\n if (this.#layoutManager) this.#layoutManager.loading = val;\n }\n\n rerenderer() {\n\n this.activeSheet?.querySelectorAll(\"tbody.body th,tbody.body td\").forEach(($cell) => {\n const customComp = Array.from($cell.children).find($el => {\n return $el.tagName.toLowerCase().startsWith('cell-') && typeof $el.rerenderer === 'function'\n });\n\n customComp?.rerenderer();\n })\n }\n\n sheet = (idOrIndex) => {\n if (idOrIndex === null || idOrIndex < 0) return this.activeSheet;\n const sheets = Array.from(this.shadow.querySelectorAll('nine-table-sheet'));\n\n if (typeof idOrIndex === 'number') return sheets[idOrIndex] || null;\n if (typeof idOrIndex === 'string') {\n return this.shadow.querySelector(`nine-table-sheet#${idOrIndex}, nine-table-sheet[data-sheet-id=\"${idOrIndex}\"]`) || null;\n }\n return sheets[0] || null;\n }\n\n get sheets() {\n return Array.from(this.shadow.querySelectorAll('nine-table-sheet'));\n }\n\n get activeSheet() {\n return this.shadow.querySelector('nine-table-sheet.active') || null;\n }\n\n #bindDynamicSetters() {\n const extractedMethodNames = new Set();\n\n this.querySelectorAll('[data-source]').forEach(el => {\n const dataSource = el.getAttribute('data-source');\n if (!dataSource) return;\n\n const matches = dataSource.matchAll(/(?:host\\.)?([a-zA-Z0-9_$]+)\\s*\\(/g);\n for (const match of matches) {\n const name = match[1];\n if (name && name !== 'host') {\n extractedMethodNames.add(name);\n }\n }\n });\n\n extractedMethodNames.forEach(methodName => {\n let internalValue = null;\n\n Object.defineProperty(this, methodName, {\n set: (newValue) => {\n internalValue = newValue;\n\n this.rerenderer();\n },\n get: () => internalValue,\n configurable: true,\n enumerable: true\n });\n });\n }\n\n execute = (fn) => {\n setTimeout(() => {\n this.loading = true;\n setTimeout(() => {\n try {\n fn.call(this);\n } finally {\n this.loading = false;\n }\n });\n });\n }\n\n #bindApiMethods() {\n\n const apis = [this.#dataApi, this.#sheetApi];\n\n apis.forEach(api => {\n // api ์ธ์คํด์ค(this)์ ์ง์ ์ ์ธ๋ ์์ฑ๋ค๊ณผ ํ๋กํ ํ์
์์ฑ์ ๋ชจ๋ ๊ฐ์ ธ์ด\n // Reflect.ownKeys๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ณผ์ด๋ ์จ๊ฒจ์ง ํ๋กํผํฐ๊น์ง ์์ ํ๊ฒ ํ์ ๊ฐ๋ฅํฉ๋๋ค.\n const keys = new Set([\n ...Reflect.ownKeys(api),\n ...Reflect.ownKeys(Object.getPrototypeOf(api))\n ]);\n\n keys.forEach(key => {\n // constructor๋ ๋ด๋ถ ํ๋ผ์ด๋น ๋ฉค๋ฒ(#)๋ ์ ์ธ\n if (key === 'constructor' || String(key).startsWith('#')) return;\n\n const target = api[key];\n\n if (typeof target === 'function') {\n if (!this[key]) {\n //trace.log(`[Binding Function] ${key}`);\n this[key] = (...args) => target.apply(api, args);\n }\n } else if (target !== null && typeof target === 'object') {\n if (!this[key]) {\n //trace.log(`[Binding Object Namespace] ${key}`, target);\n this[key] = target; // ๊ฐ์ฒด ๋ค์์คํ์ด์ค(์: row) ํต์งธ๋ก ์ฐ๊ฒฐ\n }\n }\n });\n });\n }\n}\n\nif (!customElements.get('nine-table')) {\n customElements.define('nine-table', NineTable);\n}\n\nif (!customElements.get('nine-table-simple')) {\n customElements.define('nine-table-simple', class extends NineTable {\n connectedCallback() {\n this.setAttribute('theme', 'simple');\n\n super.connectedCallback();\n }\n });\n}","export class BasicCellElement extends HTMLElement {\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tapplyBaseStyle() {\n\t}\n\n\tconnectedCallback() {\n\t}\n}","import { trace } from \"@nopeer\";\nimport { BasicCellElement } from './BasicCellElement.js';\n\nconst exprCache = new Map();\n\nexport class CellElement extends BasicCellElement {\n\t#host;\n\t#sheet;\n\t#tr;\n\t#cell;\n\t#attr;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tget #updateRowState() {\n\t\treturn this.#cell.getAttribute(\"update-row-state\") === \"false\";\n\t}\n\n\tget host() { return this.#host; }\n\tget sheet() { return this.#sheet; }\n\tget cell() { return this.#cell; }\n\tget tr() { return this.#tr; }\n\tget attr() { return this.#attr; }\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#host = this.getRootNode().host;\n\n\t\tthis.#cell = this.closest(\"th,td\");\n\t\tthis.#tr = this.#cell.closest(\"tr\");\n\t\tthis.#sheet = this.#tr.closest(\"nine-table-sheet\");\n\n\t\tthis.#cell.classList.add(this.tagName);\n\n\t\tthis.#attr = {};\n\t\tfor (let i = 0; i < this.#cell.attributes.length; i++) {\n\t\t\tconst name = this.#cell.attributes[i].name;\n\t\t\tif (![\"text-align\",\"class\",\"cell-type\",\"data-bind\",\"data-expr\",\"data-col\",\"tabindex\"].includes(name)) {\n\t\t\t\tthis.#attr[name] = this.#cell.attributes[i].value;\n\t\t\t\t//this.setAttribute(name, this.#cell.attributes[i].value);\n\t\t\t}\n\t\t}\n\n\t\tif (!this.#cell) return;\n\n\n\t\tconst root = this.shadowRoot || this;\n\n\t\t// ๐ฏ ๋ฒํผ ์ด๋ฒคํธ ์ฐ๊ฒฐ\n\t\troot.querySelectorAll(\"button, ng-expand-button\").forEach(button => {\n\t\t\tbutton.addEventListener(\"click\", () => {\n\t\t\t\tlet fn = this.getAttribute(\"onbuttonclick\") || this.getAttribute(\"onButtonClick\") || this.#cell?.getAttribute(\"onbuttonclick\") || this.#cell?.getAttribute(\"onButtonClick\");\n\n\t\t\t\tconst rowData = this.data; // Proxy Lazy ์ ๊ทผ\n\t\t\t\tconst curRow = parseInt(this.#cell.dataset.row, 10);\n\n\t\t\t\tif (fn && this.#host) {\n\t\t\t\t\tfn = fn.replace(\"()\", \"\");\n\t\t\t\t\tconst match = fn.match(/^(\\w+)\\s*\\(/);\n\t\t\t\t\tconst methodName = match?.[1] || fn;\n\n\t\t\t\t\tif (typeof this.#host[methodName] === 'function') {\n\t\t\t\t\t\tthis.#host[methodName].call(this.#host, rowData, curRow, this.#cell);\n\t\t\t\t\t} else if (typeof this.#host.exprFunction === 'function') {\n\t\t\t\t\t\tthis.#host.exprFunction(fn).call(this, rowData, curRow);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t/**\n\t\t\t\tthis.#host?.dispatchEvent(new CustomEvent(ninegrid.EVENT.BUTTON_CLICK, {\n\t\t\t\t\tdetail: { target: this.#cell, data: rowData, currow: curRow },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true\n\t\t\t\t})); */\n\t\t\t});\n\t\t});\n\n\t\t// ๐ฏ ๋งํฌ ์ด๋ฒคํธ ์ฐ๊ฒฐ\n\t\tconst renderer = root.querySelector(\".renderer\");\n\t\tif (renderer && this.getAttribute(\"link\") === \"true\") {\n\t\t\trenderer.classList.add(\"link\");\n\n\t\t\trenderer.addEventListener(\"click\", () => {\n\t\t\t\tlet fn = this.getAttribute(\"onlinkclick\") || this.getAttribute(\"onLinkClick\");\n\n\t\t\t\tconst rowData = this.data;\n\t\t\t\tconst curRow = parseInt(this.#cell.dataset.row, 10);\n\n\t\t\t\tif (fn && this.#host) {\n\t\t\t\t\tfn = fn.replace(\"()\", \"\");\n\t\t\t\t\tconst match = fn.match(/^(\\w+)\\s*\\(/);\n\t\t\t\t\tconst methodName = match?.[1] || fn;\n\n\t\t\t\t\tif (typeof this.#host[methodName] === 'function') {\n\t\t\t\t\t\tthis.#host[methodName].call(this.#host, rowData, curRow, this.#cell);\n\t\t\t\t\t} else if (typeof this.#host.exprFunction === 'function') {\n\t\t\t\t\t\tthis.#host.exprFunction(fn).call(this, rowData, curRow);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.#host?.dispatchEvent(new CustomEvent(ninegrid.EVENT.LINK_CLICK, {\n\t\t\t\t\tdetail: { target: this.#cell, data: rowData, currow: curRow },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true\n\t\t\t\t}));\n\t\t\t});\n\t\t}\n\t}\n\n\tget data() {\n\t\tconst rawRecord = this.#tr?.data;\n\t\tif (!rawRecord) return null;\n\t\tif (!rawRecord.v) return rawRecord;\n\n\t\tconst host = this.#host;\n\n\t\treturn new Proxy(rawRecord, {\n\t\t\tget(target, prop) {\n\t\t\t\tif (prop === '__ng') return target.__ng;\n\t\t\t\tif (prop === 'v') return target.v;\n\n\t\t\t\tconst idx = host?.fields?.indexOf?.(prop) ?? -1;\n\t\t\t\treturn idx >= 0 ? target.v[idx] : target[prop];\n\t\t\t}\n\t\t});\n\t}\n\n\tget value() {\n\t\tif (!this.#cell || !this.#tr?.data) return \"\";\n\n\t\tconst bindKey = this.#cell.dataset?.bind;\n\t\tif (!bindKey) return \"\";\n\n\t\tconst rawRecord = this.#tr.data;\n\n\t\tif (rawRecord.v && Array.isArray(rawRecord.v)) {\n\t\t\tconst colIdx = this.#host.fields.get().indexOf(bindKey) ?? -1;\n\t\t\treturn colIdx >= 0 ? (rawRecord.v[colIdx] ?? \"\") : \"\";\n\t\t}\n\n\t\treturn rawRecord[bindKey] ?? \"\";\n\t}\n\n\tset value(v) {\n\t\tif (!this.#cell || !this.#host?.data) return;\n\n\t\tconst row = parseInt(this.#tr.dataset.row, 10);\n\t\tconst bindKey = this.#cell.dataset.bind;\n\t\tif (isNaN(row) || !bindKey) return;\n\n\t\t//update-row-state\n\t\tthis.#host.data.setValue(row, bindKey, v, this.#updateRowState);\n\t}\n\n\tget row() {\n\t\treturn parseInt(this.#cell?.dataset?.row, 10);\n\t}\n\tget index() {\n\t\treturn parseInt(this.#cell?.dataset?.index, 10);\n\t}\n\n\tisValid() {\n\t\treturn this.#cell.classList.contains(\"invalid\") ? false : true;\n\t}\n\n\tisInvalid() {\n\t\treturn !this.isValid();\n\t}\n\n\tgetDisplayText = (defaultValue = \"\") => {\n\n\t\tif (!this.#cell || !this.#cell.closest(\"tbody\")) return defaultValue;\n\n\t\tconst rawRecord = this.#tr.data;\n\n\t\tif (!rawRecord) return defaultValue;\n\n\t\tconst expr = this.#cell.dataset.expr;\n\t\tconst bindKey = this.#cell.dataset.bind;\n\t\tconst row = parseInt(this.#cell.dataset.row, 10);\n\n\t\tif (expr) {\n\t\t\ttry {\n\t\t\t\tif (this.#tr.getAttribute(\"grouping\") === \"true\") {\n\n\t\t\t\t\treturn this.getGroupExprValue(expr, this.#tr.data, row, this.#cell);\n\t\t\t\t} else {\n\t\t\t\t\treturn this.#host.exprEngine.evaluate(expr, this.#tr.data, row);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\treturn defaultValue;\n\t\t\t}\n\t\t}\n\n\t\tif (bindKey) {\n\t\t\tconst val = this.value;\n\t\t\treturn val !== null && val !== undefined ? val : defaultValue;\n\t\t}\n\n\t\treturn defaultValue;\n\t};\n\n\n\n\trefresh() {\n\n\t\tif (!this.#cell || !this.#tr) return;\n\n\t\tconst val = this.value;\n\n\t\tthis.#cell.classList.remove(\"invalid\");\n\n\t\t[\"color\",\"background\",\"background-color\",\"visible\",\"enable\",\"validator\"].forEach(v => {\n\n\t\t\tconst expr = this.#attr[v];\n\t\t\tif (expr) {\n\t\t\t\tconst result = this.#host.exprEngine.evaluate(expr, this.#tr.data, parseInt(this.#cell.dataset.row, 10));\n\n\t\t\t\tif (v === \"validator\") {\n\t\t\t\t\tif (!result) {\n\t\t\t\t\t\tthis.#cell.classList.add(\"invalid\");\n\t\t\t\t\t}\n\t\t\t\t} else if (v === \"visible\") {\n\t\t\t\t\tthis.style[\"display\"] = result ? \"\" : \"none\";\n\t\t\t\t} else if (v === \"enable\") {\n\t\t\t\t\tthis.querySelectorAll(\"input, button, textarea, select\").forEach($el => {\n\t\t\t\t\t\t$el.disabled = !result;\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!!result) {\n\t\t\t\t\t\tthis.#cell.removeAttribute(\"disabled\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.#cell.setAttribute(\"disabled\", \"true\");\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.#cell.style[v] = result;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn val;\n\t}\n\n\tgetExprValue(expr, data, row) {\n\t\tif (!this.#host || !this.#host.exprEngine || expr === undefined || expr === null || expr === \"\") return expr;\n\n\t\treturn this.#host.exprEngine.evaluate(expr, data, row);\n\t}\n\n\tgetGroupExprValue = (expr, groupRecord, row, cell) => {\n\t\tif (!expr) return \"\";\n\n\t\ttry {\n\t\t\trow = parseInt(row, 10);\n\t\t\tconst cleanExpr = expr.replace(\"()\", \"\").trim();\n\n\t\t\tif (this.#host && typeof this.#host[cleanExpr] === 'function') {\n\t\t\t\treturn this.#host[cleanExpr].call(this, groupRecord, row, cell);\n\t\t\t}\n\n\t\t\tconst match = cleanExpr.match(/^(\\w+)\\s*\\(\\s*([\\w\\-]*)\\s*\\)/);\n\t\t\tif (match) {\n\t\t\t\tconst indices = groupRecord[GROUP_IDX.CHILDREN];\n\t\t\t\tconst allRecords = this.#host?.data?.getArray ? this.#host.data.getArray() : [];\n\t\t\t\tconst childRecords = indices ? indices.map(idx => allRecords[idx]).filter(Boolean) : [];\n\n\t\t\t\tconst [, funcName, field] = match;\n\t\t\t\tconst host = this.#host;\n\n\t\t\t\tswitch (funcName.toLowerCase()) {\n\t\t\t\t\tcase 'count':\n\t\t\t\t\t\treturn childRecords.length;\n\n\t\t\t\t\tcase 'sum': {\n\t\t\t\t\t\tconst colIdx = host?.fields?.indexOf?.(field) ?? -1;\n\t\t\t\t\t\treturn childRecords.reduce((acc, record) => {\n\t\t\t\t\t\t\tconst val = colIdx >= 0 ? record.v?.[colIdx] : record[field];\n\t\t\t\t\t\t\treturn acc + (Number(val) || 0);\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 'avg': {\n\t\t\t\t\t\tif (childRecords.length === 0) return 0;\n\t\t\t\t\t\tconst colIdx = host?.fields?.indexOf?.(field) ?? -1;\n\t\t\t\t\t\tconst sum = childRecords.reduce((acc, record) => {\n\t\t\t\t\t\t\tconst val = colIdx >= 0 ? record.v?.[colIdx] : record[field];\n\t\t\t\t\t\t\treturn acc + (Number(val) || 0);\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t\treturn sum / childRecords.length;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 3. ํธ์คํธ์ exprFunction ํ์ฉ\n\t\t\tif (this.#host && typeof this.#host.exprFunction === 'function') {\n\t\t\t\treturn this.#host.exprFunction(expr).call(this, groupRecord, row, this.#host.data);\n\t\t\t}\n\n\t\t\tif (expr.includes(\"data.\") || expr.includes(\"childRecords\") || expr.includes(\"groupRecord\")) {\n\t\t\t\tlet evalFn = exprCache.get(\"grp_\" + expr);\n\t\t\t\tif (!evalFn) {\n\t\t\t\t\tevalFn = new Function('groupRecord', 'row', 'cell', 'host', `\n const indices = groupRecord[3]; // GROUP_IDX.CHILDREN = 3\n const allRecords = host?.data?.getArray ? host.data.getArray() : [];\n \n let childRecords = [];\n if (Array.isArray(indices)) {\n // indices๊ฐ ์ซ์ ์ธ๋ฑ์ค ๋ฐฐ์ด์ธ์ง, rowid ๋ฌธ์์ด ๋ฐฐ์ด์ธ์ง ํ๋ณํ์ฌ ์์ ํ๊ฒ ์ถ์ถ\n childRecords = indices.map(idx => {\n if (typeof idx === 'number') {\n return allRecords[idx];\n } else {\n // rowid ๋ฑ ๋ฌธ์์ด ์๋ณ์์ธ ๊ฒฝ์ฐ ์ ์ฒด ๋ฐฐ์ด์์ ์ฐพ๊ฑฐ๋ dataManager ํ์ฉ\n return allRecords.find(r => r?.__ng?.rowid === idx || r?.m?._?.[0] === idx);\n }\n }).filter(Boolean);\n }\n \n // ๋ง์ฝ ์์์ ๋ชป ์ฐพ์๋๋ฐ host.grouping์ ์ธ ์ ์๋ค๋ฉด ๋งค๋์ ์์ ์๋\n if (childRecords.length === 0 && host?.grouping?.getChildrenRecords && groupRecord[0]) {\n childRecords = host.grouping.getChildrenRecords(groupRecord[0]);\n }\n\n const data = childRecords; // data.length ๋ฑ์ ์ธ ์ ์๋๋ก ํธํ\n return ${expr};\n `);\n\t\t\t\t\texprCache.set(\"grp_\" + expr, evalFn);\n\t\t\t\t}\n\t\t\t\treturn evalFn(groupRecord, row, cell, this.#host);\n\t\t\t}\n\n\t\t\treturn expr;\n\t\t} catch (e) {\n\t\t\tconsole.error(\"Group expr evaluation error:\", expr, e);\n\t\t\treturn expr;\n\t\t}\n\t};\n}\n\nexport class EditableCellElement extends CellElement {\n\n\tget host() { return super.host; }\n\tget sheet() { return super.sheet; }\n\tget cell() { return super.cell; }\n\tget tr() { return super.tr; }\n\tget attr() { return super.attr; }\n\n\tgetExprValue(expr, data, row, cell) {\n\t\treturn super.getExprValue(expr, data, row, cell);\n\t}\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\t}\n\n\trefresh() {\n\t\treturn super.refresh();\n\t}\n\n\tgetExprValue = (expr, data, row, cell) => {\n\t\treturn super.getExprValue(expr, data, row, cell);\n\t}\n\n\tisValid = () => {\n\t\treturn super.isValid();\n\t}\n\n\tisInvalid = () => {\n\t\treturn super.isInvalid();\n\t}\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputText extends EditableCellElement\n{\n\t#target;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\t\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input\");\n\n\t\tthis.#initEvent();\n\t};\n\n\trefresh = () => {\n\t\tconst v = super.refresh();\n\t\tthis.#target.value = v;\n\t};\n\n\t#initEvent = () => {\n\t\tthis.#target.addEventListener(\"input\", e => {\n\t\t\tif (this.#maxbyte) {\n\t\t\t\tconst maxByteNum = Number(this.#maxbyte);\n\t\t\t\tconst currentBytes = nine.getByteLength(e.target.value);\n\n\t\t\t\tif (currentBytes > maxByteNum) {\n\t\t\t\t\te.target.value = nine.cut(e.target.value, maxByteNum);\n\t\t\t\t\tthis.value = e.target.value;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tthis.value = event.target.value;\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\t};\n\n\t#renderer = () => {\n\n\t\tthis.innerHTML = `\n\t\t\t<input type=\"text\" ondragstart=\"return false;\">\n\t\t`;\n\t};\n\n\tget #maxbyte() {\n\t\treturn this.cell.getAttribute(\"maxbyte\") || this.cell.getAttribute(\"max-byte\");\n\t}\n}\n\nif (!customElements.get('cell-input')) {\n\tcustomElements.define(\"cell-input\", CellInputText);\n}\n","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputNumber extends EditableCellElement\n{\n\t#target;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input\");\n\n\t\tthis.#initEvent();\n\n\n\t};\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"text\" ondragstart=\"return false;\">\n `;\n\t};\n\n\t#initEvent = () => {\n\t\tthis.#target.addEventListener(\"keydown\", this.#onKeyDown);\n\n\t\tthis.#target.addEventListener(\"input\", (event) => {\n\t\t\tthis.value = event.target.value;\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tthis.value = event.target.value;\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\t};\n\n\trefresh = () => {\n\t\tconst v = super.refresh();\n\n\t\tthis.#target.value = v;//v !== undefined && v !== null ? v : \"\";\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate();\n\t\t}\n\t};\n\n\t#validate = () => {\n\n\t\tconst v = this.#target.value;\n\n\t\tif (v !== \"\" && v !== null && v !== undefined) {\n\t\t\tconst num = Number(v);\n\n\t\t\tif (isNaN(num) || (this.#max && num > Number(this.#max)) || (this.#min && num < Number(this.#min))) {\n\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t}\n\t\t\telse if (this.#scale) {\n\t\t\t\tconst str = String(v);\n\t\t\t\tconst idx = str.indexOf('.');\n\t\t\t\tif (idx >= 0 && str.substring(idx + 1).length > Number(this.#scale)) {\n\t\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t#onKeyDown = e => {\n\n\t\tif ([\"Escape\", \"Enter\", \"Tab\", \"Home\", \"End\", \"ArrowLeft\", \"ArrowRight\", \"PageUp\", \"PageDown\", \"Backspace\", \"Delete\"].includes(e.code)) return;\n\n\t\tconst target = e.target;\n\t\tconst value = target.value;\n\t\tconst selectionStart = target.selectionStart;\n\t\tconst key = e.key;\n\n\t\tif (key === \"-\") {\n\t\t\tif (value.includes(\"-\") || selectionStart !== 0) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (key === \".\") {\n\t\t\tconst scale = Number(this.#scale);\n\n\t\t\tif (isNaN(scale) || scale <= 0 || value.includes(\".\")) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tlet validKey = [];\n\t\tif (this.#scale && Number(this.#scale) > 0) validKey.push(\".\");\n\t\tif (this.#min || Number(this.#min) > 0) validKey.push(\"-\");\n\n\t\tconst isNumKey = (e.keyCode >= 48 && e.keyCode <= 57) || (e.keyCode >= 96 && e.keyCode <= 105);\n\n\t\tif (!isNumKey && !validKey.includes(e.key)) {\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.#scale && isNumKey && e.target.selectionStart == e.target.selectionEnd) {\n\t\t\tconst s = e.target.value;\n\t\t\tconst idx = s.indexOf(\".\");\n\t\t\tif (idx >= 0 && e.target.selectionStart > idx) {\n\t\t\t\tconst decimalPart = s.substr(idx + 1);\n\t\t\t\tif (decimalPart.length >= Number(this.#scale)) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.#maxbyte && nine.getByteLength(e.target.value) >= Number(this.#maxbyte) && e.target.selectionStart == e.target.selectionEnd) {\n\t\t\te.preventDefault();\n\t\t}\n\t}\n\n\tget #min() {\n\t\treturn this.cell.getAttribute(\"min\") || \"\";\n\t}\n\n\tget #max() {\n\t\treturn this.cell.getAttribute(\"max\") || \"\";\n\t}\n\n\tget #scale() {\n\t\treturn this.cell.getAttribute(\"scale\") || \"\";\n\t}\n\n\tget #maxbyte() {\n\t\treturn this.cell.getAttribute(\"maxbyte\") || this.cell.getAttribute(\"max-byte\");\n\t}\n}\n\nif (!customElements.get('cell-input-number')) {\n\tcustomElements.define(\"cell-input-number\", CellInputNumber);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputColor extends EditableCellElement\n{\n\t#target;\n\t#btn;\n\t#dataSource;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input[type=color]\");\n\t\tthis.#btn = this.querySelector(\"button\");\n\n\t\t//this.#rendererColor();\n\n\t\tthis.#initEvent();\n\t};\n\n\t#initEvent = () => {\n\t\tthis.#btn.addEventListener(\"click\", () => {\n\t\t\tthis.#target.click();\n\t\t});\n\n\t\tthis.#target.addEventListener(\"input\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#validate(val);\n\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#validate(val);\n\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"color\" ondragstart=\"return false;\">\n <button tabindex=\"-1\" type=\"button\"></button>\n `;\n\t};\n\n\trerenderer = () => {\n\t\tthis.refresh();\n\t};\n\n\t#rendererColor = () => {\n\n\t\tconst dataSource = this.cell.getAttribute(\"data-source\");\n\t\tif (!dataSource) return;\n\n\t\tthis.#dataSource = super.getExprValue(dataSource, this.tr.data, this.tr.dataset.row);\n\n\t\tthis.querySelector(\"datalist\")?.remove();\n\n\t\tif (this.#dataSource && Array.isArray(this.#dataSource)) {\n\t\t\tconst datalistId = `color-list-${Math.random().toString(36).substr(2, 9)}`;\n\n\t\t\tconst datalist = document.createElement('datalist');\n\t\t\tdatalist.id = datalistId;\n\n\t\t\tconst fragment = document.createDocumentFragment();\n\n\t\t\tthis.#dataSource.forEach(v => {\n\t\t\t\tif (v.value) {\n\t\t\t\t\tconst option = document.createElement('option');\n\t\t\t\t\toption.value = v.value;\n\t\t\t\t\tfragment.appendChild(option);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdatalist.appendChild(fragment);\n\t\t\tthis.appendChild(datalist);\n\n\t\t\tthis.#target.setAttribute(\"list\", datalistId);\n\t\t}\n\t};\n\n\trefresh = () => {\n\t\tif (!this.tr.data) return;\n\n\t\tconst v = super.refresh();\n\n\t\tthis.#rendererColor();\n\n\t\tthis.#target.value = v !== undefined && v !== null && v !== \"\" ? v : \"#ffffff\";\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate();\n\t\t}\n\t};\n\n\t#validate = () => {\n\n\t\tconst v = this.#target.value;\n\n\t\tif (v !== \"\" && v !== null && v !== undefined) {\n\t\t\tif (!this.#isValidColor(v)) {\n\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t}\n\t\t\telse if (this.#dataSource && Array.isArray(this.#dataSource) && this.#dataSource.length > 0) {\n\t\t\t\tconst exists = this.#dataSource.some(item => {\n\t\t\t\t\tconst itemCode = item.value !== undefined ? item.value : (item.code !== undefined ? item.code : '');\n\t\t\t\t\treturn itemCode.toLowerCase() === v.toLowerCase();\n\t\t\t\t});\n\n\t\t\t\tif (!exists) {\n\t\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t#isValidColor = (v) => {\n\t\tif (typeof v !== \"string\" || v.length != 7 || !v.startsWith(\"#\")) return false;\n\n\t\tvar r = parseInt(v.substr(1, 2), 16);\n\t\tvar g = parseInt(v.substr(3, 2), 16);\n\t\tvar b = parseInt(v.substr(5, 2), 16);\n\n\t\tif (isNaN(r) || isNaN(g) || isNaN(b)) return false;\n\t\tif (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) return false;\n\n\t\treturn true;\n\t}\n}\n\nif (!customElements.get('cell-input-color')) {\n\tcustomElements.define(\"cell-input-color\", CellInputColor);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputDate extends EditableCellElement\n{\n\t#target;\n\t#type;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input\");\n\n\t\tthis.#target.addEventListener(\"input\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#target.classList.toggle(\"has-value\", !!val); // ๐ก ์ค์๊ฐ ๋ฐ์\n\t\t\tthis.#validate(val);\n\n\t\t\tsuper.sheet.rowManager.refresh(true);\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#validate(val);\n\n\t\t\tsuper.sheet.rowManager.refresh(true);\n\t\t});\n\t};\n\n\t#renderer = () => {\n\n\t\tthis.#type = this.cell.getAttribute(\"date-type\") || \"date\";\n\t\tif (![\"date\",\"datetime-local\",\"time\",\"week\",\"month\"].includes(this.#type)) {\n\t\t\tthrow `invalid type : ${this.#type}`;\n\t\t}\n\n\t\tlet attr = [];\n\t\tfor (let i = 0; i < this.cell.attributes.length; i++) {\n\t\t\tif ([\"value\", \"max\", \"min\", \"step\"].includes(this.cell.attributes[i].name)) {\n\t\t\t\tattr.push(`${this.cell.attributes[i].name}=\"${this.cell.attributes[i].value}\"`);\n\t\t\t}\n\t\t}\n\n\t\tthis.innerHTML = `\n <input\n type=\"${this.#type}\"\n data-placeholder=\"${this.cell.getAttribute('placeholder') || 'Select'}\"\n ${attr.join(\" \")}\n required\n />\n `;\n\t};\n\n\trefresh = () => {\n\n\t\tconst v = super.refresh();\n\n\t\tlet formattedVal = v;\n\t\tif (formattedVal) {\n\n\t\t\tswitch (this.#type) {\n\t\t\t\tcase \"date\":\n\t\t\t\t\tformattedVal = formattedVal.substr(0, 10);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"datetime-local\":\n\t\t\t\t\tformattedVal = formattedVal.substr(0, 16);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"time\":\n\t\t\t\t\tvar d = new Date(v);\n\t\t\t\t\tif (d != \"Invalid Date\" && !isNaN(d)) {\n\t\t\t\t\t\tformattedVal = (\"00\" + d.getHours()).slice(-2) + \":\" + (\"00\" + d.getMinutes()).slice(-2);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"month\":\n\t\t\t\t\tvar d = new Date(v);\n\t\t\t\t\tif (d != \"Invalid Date\" && !isNaN(d)) {\n\t\t\t\t\t\tformattedVal = (\"0000\" + d.getFullYear()).slice(-4) + \"-\" + (\"00\" + (d.getMonth() + 1)).slice(-2);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis.#target.value = formattedVal || \"\";\n\t\tthis.#target.classList.toggle(\"has-value\", !!formattedVal); // ๐ก ๊ฐ์ด ์์ผ๋ฉด ํด๋์ค ์ถ๊ฐ\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate(formattedVal);\n\t\t}\n\t};\n\n\t#validate = (val) => {\n\n\t\tif (val !== \"\" && val !== null && val !== undefined) {\n\t\t\tlet isValid = this.#isValidDate(val);\n\n\t\t\tif (isValid) {\n\t\t\t\tif (this.#min && val < this.#min) isValid = false;\n\t\t\t\tif (this.#max && val > this.#max) isValid = false;\n\t\t\t}\n\n\t\t\tif (!isValid) {\n\t\t\t\tsuper.cell.classList.add(\"invalid\");\n\t\t\t}\n\t\t}\n\t};\n\n\t#isValidDate = (v) => {\n\n\t\tif (typeof v !== \"string\") return false;\n\n\t\tlet isValid = true;\n\n\t\tswitch (this.#type) {\n\t\t\tcase \"date\":\n\t\t\tcase \"datetime-local\":\n\t\t\t\tconst year = Number(v.substr(0, 4));\n\t\t\t\tconst month = Number(v.substr(5, 2));\n\t\t\t\tconst day = Number(v.substr(8, 2));\n\n\t\t\t\tif (isNaN(year) || isNaN(month) || isNaN(day)) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t} else if (month < 1 || month > 12 || day < 1 || day > 31) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t} else if ([4, 6, 9, 11].includes(month) && day == 31) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t} else if (month == 2) {\n\t\t\t\t\tlet isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));\n\t\t\t\t\tif (day > 29 || (day == 29 && !isleap)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (isValid) {\n\t\t\tswitch (this.#type) {\n\t\t\t\tcase \"datetime-local\":\n\t\t\t\t\tvar t = v.substr(10, 1);\n\t\t\t\t\tvar hour = Number(v.substr(11, 2));\n\t\t\t\t\tvar min = Number(v.substr(14, 2));\n\n\t\t\t\t\tif (t != \"T\") {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (isNaN(hour) || isNaN(min)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (hour < 0 || hour > 23 || min < 0 || min > 59) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"month\":\n\t\t\t\t\tvar year = Number(v.substr(0, 4));\n\t\t\t\t\tvar month = Number(v.substr(5, 2));\n\n\t\t\t\t\tif (isNaN(year) || isNaN(month)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (month < 1 || month > 12) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"week\":\n\t\t\t\t\tvar year = Number(v.substr(0, 4));\n\t\t\t\t\tvar w = v.substr(5, 1);\n\t\t\t\t\tvar week = Number(v.substr(6, 2));\n\n\t\t\t\t\tif (w != \"W\") {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (isNaN(year) || isNaN(week)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (week <= 0 || week > 53) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn isValid;\n\t}\n\n\tget #min() {\n\t\treturn this.cell.getAttribute(\"min\");\n\t}\n\n\tget #max() {\n\t\treturn this.cell.getAttribute(\"max\");\n\t}\n\n\tget #step() {\n\t\treturn this.cell.getAttribute(\"step\");\n\t}\n}\n\nif (!customElements.get('cell-input-date')) {\n\tcustomElements.define(\"cell-input-date\", CellInputDate);\n}","import { EditableCellElement } from \"./core/CellElement.js\";\nimport {trace} from \"@nopeer\";\n\nclass CellCheckbox extends EditableCellElement {\n #target;\n #label;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n this.#renderer();\n\n this.#target = this.querySelector(\"input\");\n this.#label = this.querySelector(\"span\");\n\n this.#initEvent();\n }\n\n get dataSource() {\n return [\n { value: this.trueValue, text: this.#trueText },\n { value: this.falseValue, text: this.#falseText }\n ];\n }\n\n #initEvent = () => {\n if (this.closest(\"thead\")) {\n this.#target.addEventListener(\"change\", (e) => {\n super.sheet.querySelector(`tbody.body [data-col=\"${super.cell.dataset.col}\"] cell-checkbox`)?.selectAll(e.target.checked);\n });\n }\n\n this.#target.addEventListener(\"change\", (event) => {\n if (!this.closest(\"tbody\")) return;\n\n if (this.#isRadio) {\n this.selectAll(false);\n this.value = this.trueValue;\n }\n else {\n this.value = event.target.checked ? this.trueValue : this.falseValue;\n }\n\n this.sheet.rowManager.refresh(true);\n });\n };\n\n #renderer = () => {\n\n const trueValue = this.trueValue;//this.cell.getAttribute(\"true-value\") || false;\n //const selectedBorderColor = this.getAttribute(\"selected-border-color\") || \"dimgray\";\n\n const originalContent = this.cell.getAttribute(\"content\") || \"\";\n const childHtml = this.#isRadio ? `<input type=\"radio\" value=\"${trueValue}\" />` : `<label><input type=\"checkbox\" /><span>${originalContent}</span></label>`;\n\n this.innerHTML = `\n ${childHtml}\n `;\n }\n\n refresh = () => {\n const val = super.refresh();\n\n this.#target.checked = (val === this.trueValue);\n\n if (this.isValid()) {\n this.#validate(val);\n }\n\n const displayText = (val === this.trueValue) ? this.#trueText : ((val === this.falseValue) ? this.#falseText : val);\n\n if (this.#label) {\n this.#label.textContent = displayText;\n }\n };\n\n #validate = (val) => {\n\n this.cell.classList.remove(\"invalid\");\n\n if (val !== \"\" && val !== null && val !== undefined) {\n if (val !== this.trueValue && val !== this.falseValue) {\n this.cell.classList.add(\"invalid\");\n }\n }\n };\n\n selectAll = (v) => {\n if (this.closest(\"thead\")) return; // ํค๋ ์์ ์ ์ ์ธ\n\n const data = this.host.data.getArray();\n const colIndex = this.host.fields.indexOf(this.cell.dataset.bind);\n\n if (colIndex < 0) return;\n\n for (let i = 0; i < data.length; i++) {\n if (this.#enable && super.getExprValue(this.#enable, data[i], i, this.cell) === false) continue;\n if (this.#readonly && super.getExprValue(this.#readonly, data[i], i, this.cell) === true) continue;\n if (this.#visible && super.getExprValue(this.#visible, data[i], i, this.cell) === false) continue;\n\n data[i].v[colIndex] = v ? this.trueValue : this.falseValue;\n }\n\n super.sheet.invalidate();\n };\n\n get trueValue() {\n return this.cell.getAttribute(\"true-value\") || \"Y\";\n }\n get falseValue() {\n return this.cell.getAttribute(\"false-value\")|| \"N\";\n }\n get #trueText() {\n return this.cell.getAttribute(\"true-text\") || \"\";\n }\n get #falseText() {\n return this.cell.getAttribute(\"false-text\") || \"\";\n }\n get #isRadio() {\n return this.cell.getAttribute(\"is-radio\") || false;\n }\n get #enable() {\n return this.cell.getAttribute(\"enable\") || false;\n }\n get #readonly() {\n return this.cell.getAttribute(\"readonly\") || false;\n }\n get #visible() {\n return this.cell.getAttribute(\"visible\") || false;\n }\n}\n\nif (!customElements.get('cell-checkbox')) {\n customElements.define(\"cell-checkbox\", CellCheckbox);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellRadio extends EditableCellElement {\n\t#target;\n\t#radioList = [];\n\t#dataSource = [];\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#rendererRadio();\n\n\t\tthis.#initEvent();\n\t}\n\n\t#initEvent = () => {\n\n\t\tthis.cell.addEventListener(\"keydown\", e => {\n\n\t\t\tif (this.cell.hasAttribute(\"readonly\") || this.cell.classList.contains(\"readonly\")) return;\n\t\t\tif (this.cell.getAttribute(\"disabled\") === \"true\") return;\n\n\t\t\tif (e.code === \"Space\") {\n\t\t\t\te.preventDefault();\n\n\t\t\t\tlet matchIndex = -1;\n\n\t\t\t\tthis.#radioList.forEach(($el,index) => {\n\t\t\t\t\tif (this.value === $el.getAttribute(\"value\")) {\n\t\t\t\t\t\tmatchIndex = index;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tmatchIndex = (matchIndex === this.#radioList.length - 1) ? 0 : (matchIndex >= 0 ? matchIndex + 1 : 0);\n\t\t\t\tthis.value = this.#radioList[matchIndex].getAttribute(\"value\");\n\n\t\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t\t}\n\t\t});\n\t};\n\n\t#rendererRadio = () => {\n\n\t\tif (!this.host) return;\n\n\t\tconst dataSource = this.cell.getAttribute(\"data-source\");\n\t\tif (!dataSource) return;\n\n\t\tthis.#dataSource = super.getExprValue(dataSource, this.tr.data, this.tr.dataset.row);\n\n\t\tthis.#target.replaceChildren();\n\n\t\tif (this.#dataSource && Array.isArray(this.#dataSource)) {\n\n\t\t\tconst fragment = document.createDocumentFragment();\n\n\t\t\tthis.#dataSource.forEach(v => {\n\t\t\t\tconst codeVal = v[this.#keyName] !== undefined ? v[this.#keyName] : '';\n\t\t\t\tconst nameVal = v[this.#valueName] !== undefined ? v[this.#valueName] : '';\n\n\t\t\t\tconst label = document.createElement('label');\n\n\t\t\t\tconst input = document.createElement('input');\n\t\t\t\tinput.type = 'radio';\n\t\t\t\tinput.value = codeVal;\n\n\t\t\t\tconst span = document.createElement('span');\n\t\t\t\tspan.textContent = nameVal;\n\n\t\t\t\tlabel.appendChild(input);\n\t\t\t\tlabel.appendChild(span);\n\t\t\t\tfragment.appendChild(label);\n\t\t\t});\n\n\t\t\tthis.#target.appendChild(fragment);\n\n\n\t\t\tthis.#radioList = Array.from(this.querySelectorAll(\"input\"));\n\n\n\n\t\t\tthis.#radioList.forEach($el => {\n\t\t\t\t$el.addEventListener(\"change\", (e) => {\n\t\t\t\t\tthis.value = e.target.value;\n\t\t\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t};\n\n\t#renderer = () => {\n\n\t\tthis.innerHTML = `\n\t\t\t<div></div>\n `;\n\n\t\tthis.#target = this.querySelector(\"div\");\n\t};\n\n\trerenderer = () => {\n\t\tthis.#rendererRadio();\n\t\tthis.refresh();\n\t};\n\n\trefresh = () => {\n\n\t\tconst v = super.refresh();\n\n\t\tthis.#radioList.forEach($el => {\n\t\t\t$el.checked = (v === $el.value);\n\t\t});\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate();\n\t\t}\n\t};\n\n\t#validate = () => {\n\n\t\tif (this.value === null || this.value === undefined || this.value === \"\" || !Array.isArray(this.#dataSource)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst idx = this.#dataSource.findIndex(m => this.value === m[this.#keyName]);\n\t\tif (idx < 0) {\n\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t}\n\t};\n\n\tget dataSource() {\n\t\treturn this.#dataSource;\n\t}\n\n\tget #keyName() {\n\t\treturn this.cell.getAttribute(\"key-name\") || \"k\";\n\t}\n\n\tget #valueName() {\n\t\treturn this.cell.getAttribute(\"value-name\") || \"v\";\n\t}\n}\n\nif (!customElements.get('cell-radio')) {\n\tcustomElements.define(\"cell-radio\", CellRadio);\n}","import { trace } from \"@nopeer\";\nimport {NINE_TABLE} from \"@\";\n\nexport class CellComboPanel extends HTMLElement {\n\t#parent;\n\t#keyName;\n\t#valueName;\n\t#isOpen = false;\n\n\t#grd;\n\t#sheet;\n\t#separator;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tthis.#renderer();\n\n\t\tthis.#grd = this.querySelector(\"nine-table-simple\");\n\t\tsetTimeout(() => {\n\t\t\tthis.#sheet = this.#grd.shadowRoot.querySelector(\"nine-table-sheet\");\n\t\t\tthis.#initEvents();\n\t\t})\n\t}\n\n\t#initData = (dataSource, keyName, valueName, multi) => {\n\n\t\tconst grd = this.querySelector(\"nine-table-simple\");\n\t\tif (!grd || !dataSource || dataSource.length === 0) return;\n\n\t\tconst itemsAttr = this.#parent.closest(\"th,td\").getAttribute(\"items\");\n\t\tlet fieldKeys = [];\n\n\t\tif (itemsAttr) {\n\t\t\tfieldKeys = itemsAttr.split(\",\").map(s => s.trim());\n\t\t} else {\n\t\t\tfieldKeys = [valueName].filter(Boolean);\n\t\t}\n\n\t\tconst activeColumnCount = fieldKeys.length;\n\n\t\t//grd.shadowRoot.querySelector(\".ng-container-left\").style.display = multi ? '' : 'none';\n\n\t\tconst sheet = grd.shadowRoot.querySelector(\"nine-table-sheet\");\n\n\t\tsheet.source.table.querySelectorAll('colgroup col, tbody td').forEach(($el, idx) => {\n\t\t\tconst col = parseInt($el.dataset.col, 10);\n\t\t\tif (col >= 2) {\n\t\t\t\t$el.style.display = (col - 2 >= activeColumnCount) ? 'none' : '';\n\t\t\t}\n\t\t});\n\n\t\tgrd.shadowRoot.querySelectorAll('table colgroup col').forEach(($el, idx) => {\n\t\t\tconst col = parseInt($el.dataset.col, 10);\n\t\t\tif (col >= 2) {\n\t\t\t\t$el.style.display = (col - 2 >= activeColumnCount) ? 'none' : '';\n\t\t\t}\n\t\t});\n\n\n\t\tconst formattedData = dataSource.map(item => {\n\t\t\tconst row = {\n\t\t\t\tCHK: \"N\",\n\t\t\t\tk: keyName && item[keyName] !== undefined ? item[keyName] : (item[0] !== undefined ? item[0] : \"\")\n\t\t\t};\n\n\t\t\tfieldKeys.forEach((key, idx) => {\n\t\t\t\trow[`tmp${idx + 1}`] = item[key] !== undefined ? item[key] : (item[idx] !== undefined ? item[idx] : \"\");\n\t\t\t});\n\t\t\treturn row;\n\t\t});\n\n\t\tgrd.addEventListener(NINE_TABLE.EVENT.ROW_ADDED, () => {\n\t\t\tsetTimeout(() => {\n\n\t\t\t\tthis.style.opacity = \"\";\n\t\t\t\tthis.classList.add(\"active\");\n\n\t\t\t\tgrd.shadowRoot.querySelectorAll('colgroup col').forEach(($el, idx) => {\n\t\t\t\t\tconst col = parseInt($el.dataset.col, 10);\n\t\t\t\t\tif (col >= 2 && $el.style.display !== \"none\") {\n\t\t\t\t\t\tsheet.col.autoFit(col);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tconst fields = this.#grd.fields.get();\n\n\t\t\t\tif (multi) {\n\t\t\t\t\tconst selectedKeys = this.#parent.value ? String(this.#parent.value).split(this.#separator).map(s => s.trim()) : [];\n\t\t\t\t\tconst kIndex = fields.indexOf(\"k\");\n\t\t\t\t\tconst chkIndex = fields.indexOf(\"CHK\");\n\n\t\t\t\t\tthis.#grd.data.getArray().forEach(record => {\n\t\t\t\t\t\trecord.v[chkIndex] = (selectedKeys.includes(String(record.v[kIndex]))) ? \"Y\" : \"N\";\n\t\t\t\t\t});\n\n\t\t\t\t\tconst index = this.#sheet.view.getArray().findIndex((record, idx) => {\n\t\t\t\t\t\treturn record.v[kIndex] === selectedKeys[0];\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.#selectRow(index);\n\t\t\t\t} else {\n\t\t\t\t\tconst currentValue = this.#parent.value;\n\t\t\t\t\tconst kIndex = fields.indexOf(\"k\");\n\t\t\t\t\tconst index = this.#sheet.view.getArray().findIndex((record, idx) => {\n\t\t\t\t\t\treturn record.v[kIndex] === currentValue;\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.#selectRow(index);\n\t\t\t\t}\n\t\t\t})\n\t\t}, {once: true});\n\n\t\tif (multi && this.#parent.value) {\n\t\t\t/**\n\t\t\tconst selectedKeys = String(this.#parent.value).split(separator || \",\");\n\t\t\tgrd.data.getValidData().forEach(m => {\n\t\t\t\tif (selectedKeys.includes(String(m.v[1]))) {\n\t\t\t\t\tm.v[0] = \"Y\";\n\t\t\t\t}\n\t\t\t});\n\t\t\tgrd.refreshData();\n\t\t\t\t*/\n\t\t}\n\n\t\tif (formattedData.length * this.#sheet.template.height >= this.offsetHeight) {\n\t\t\tthis.classList.add(\"expand\");\n\t\t} else {\n\t\t\tthis.classList.remove(\"expand\");\n\t\t}\n\n\t\tgrd.data.set(formattedData);\n\n\n\t};\n\n\t#isPanelBelow = ($btn) => {\n\t\tconst $sheet = $btn.closest(\".ng-sheet-body\");\n\n\t\tconst btnRect = $btn.getBoundingClientRect();\n\t\tconst sheetRect = $sheet.getBoundingClientRect();\n\t\tconst spaceBelow = sheetRect.bottom - btnRect.bottom;\n\t\tconst spaceAbove = btnRect.top - sheetRect.top;\n\n\t\treturn spaceBelow >= spaceAbove;\n\t};\n\n\t#calculatePanelHeight = ($btn, isDropDown = 0) => {\n\t\tconst $sheet = $btn.closest(\".ng-sheet-body\");\n\n\t\tconst btnRect = $btn.getBoundingClientRect();\n\t\tconst sheetRect = $sheet.getBoundingClientRect();\n\n\t\tlet h = (isDropDown ? (sheetRect.bottom - btnRect.bottom) : (btnRect.top - sheetRect.top)) - 5;\n\n\t\treturn h;\n\t}\n\n\t#calculatePanelLeft = ($btn) => {\n\n\t\tconst $cell = $btn.closest(\"th,td\");\n\t\tconst $sheet = $cell.closest(\".ng-sheet-body\");\n\n\n\t\tconst cellRect = $cell.getBoundingClientRect();\n\t\tconst sheetRect = $sheet.getBoundingClientRect();\n\n\t\tlet left = cellRect.left - sheetRect.left;\n\n\t\tconst panelWidth = this.offsetWidth;\n\t\tif (left + panelWidth > sheetRect.width) {\n\t\t\tleft = Math.max(0, sheetRect.width - panelWidth - 2);\n\t\t}\n\n\t\tif (left < 0) {\n\t\t\tleft = 5;\n\t\t}\n\n\t\treturn left;\n\t};\n\n\topen = (parent, dataSource, keyName, valueName, multi, separator) => {\n\t\tthis.#parent = parent;\n\t\tthis.#keyName = keyName;\n\t\tthis.#valueName = valueName;\n\t\tthis.#isOpen = true;\n\n\t\tthis.#separator = separator;\n\n\t\tthis.classList.add(\"active\");\n\t\tthis.style.opacity = \"0\";\n\n\t\tsetTimeout(() => {\n\t\t\tconst grd = this.querySelector(\"nine-table-simple\");\n\t\t\tif (!grd || !dataSource) return;\n\n\t\t\tthis.querySelector(\".search-input\").value = \"\";\n\t\t\tthis.querySelector(\"#chkAll\").checked = true;\n\n\t\t\tconst sheet = parent.closest(\".ng-sheet-body\");\n\t\t\tconst btnRect = parent.getBoundingClientRect();\n\t\t\tconst sheetRect = sheet.getBoundingClientRect();\n\n\t\t\tconst isDropDown = this.#isPanelBelow(parent);\n\t\t\tconst h = this.#calculatePanelHeight(parent, isDropDown);\n\t\t\tconst l = this.#calculatePanelLeft(parent);\n\t\t\tconst t = isDropDown ? (btnRect.bottom - sheetRect.top) : (btnRect.top - sheetRect.top - h);\n\n\t\t\tthis.style.height = `${h}px`;\n\t\t\tthis.style.left = `${l}px`;\n\t\t\tthis.style.top = `${t}px`;\n\t\t\t//this.style.opacity = \"\";\n\n\t\t\tif (multi) {\n\t\t\t\tthis.classList.add(\"multi\");\n\t\t\t\tthis.#grd.classList.add(\"multi\");\n\t\t\t} else {\n\t\t\t\tthis.classList.remove(\"multi\");\n\t\t\t\tthis.#grd.classList.remove(\"multi\");\n\t\t\t}\n\n\t\t\tthis.#initData(dataSource, keyName, valueName, multi);\n\t\t}, 100);\n\t}\n\n\tclose = () => {\n\t\tthis.classList.remove(\"active\");\n\t\tthis.#isOpen = false;\n\t\tif (this.#parent && this.#parent.cell) {\n\t\t\tthis.#parent.cell.focus();\n\t\t}\n\t}\n\n\n\n\n\n\t#onClick = (e) => {\n\t\tconst $cell = e.target.closest(\"th,td\");\n\t\tif (this.#grd.classList.contains(\"multi\")) {\n\t\t\tconst index = parseInt($cell?.dataset.index, 10);\n\t\t\tthis.#checkRow(index);\n\t\t}\n\t\telse {\n\t\t\tconst col = parseInt($cell?.dataset.col, 10);\n\n\t\t\tif (col >= 2) {\n\t\t\t\tthis.#returnRow();\n\t\t\t}\n\t\t}\n\t}\n\n\t#onKeydown_input = (e) => {\n\t\tswitch (e.code) {\n\t\t\tcase \"Enter\":\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tconst index = this.#grd.row.at();\n\t\t\t\tif (index < 0) {\n\t\t\t\t\tthis.#selectRow(0)\n\t\t\t\t} else {\n\t\t\t\t\tthis.#selectRow(index)\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"Tab\":\n\t\t\t\tthis.#selectRow(this.#grd.row.at());\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\t#onKeydown = (e) => {\n\t\tlet index;\n\t\tswitch (e.code) {\n\t\t\tcase \"Escape\":\n\t\t\t\tthis.close();\n\t\t\t\tbreak;\n\t\t\tcase \"Enter\":\n\t\t\t\tif (this.classList.contains(\"multi\")) {\n\t\t\t\t\tthis.#onOk();\n\t\t\t\t} else {\n\t\t\t\t\tthis.#returnRow();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"Tab\":\n\t\t\t\tif (this.classList.contains(\"expand\")) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis.querySelector(\"input[type='text']\").focus();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tindex = this.#grd.row.at();\n\t\t\t\tif (index < 0) {\n\t\t\t\t\tthis.#selectRow(0)\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"Space\":\n\t\t\t\te.preventDefault();\n\t\t\t\tif ([\"TH\",\"TD\"].includes(e.target.tagName)) {\n\t\t\t\t\tthis.#checkRow(this.#grd.row.at());\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t#onOk = () => {\n\n\t\tconst fields = this.#grd.fields.get();\n\t\tconst kIndex = fields.indexOf(\"k\");\n\t\tconst chkIndex = fields.indexOf(\"CHK\");\n\n\t\tconst arr = [];\n\t\tthis.#sheet.view.getArray().forEach(o => {\n\t\t\tif (o.v[chkIndex] === \"Y\") {\n\t\t\t\tarr.push(o.v[kIndex]);\n\t\t\t}\n\t\t});\n\n\t\tthis.#parent.value = arr.join(this.#separator);\n\n\t\tthis.#parent.sheet.rowManager.refresh(true);\n\t\tthis.close();\n\t}\n\n\t#returnRow = () => {\n\t\tconst index = this.#grd.row.at();\n\n\t\tif (index >= 0) {\n\t\t\tconst record = this.#sheet.view.get(index);\n\n\t\t\tthis.#parent.value = record.k;\n\t\t\tthis.#parent.sheet.rowManager.refresh(true);\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\t#checkRow = (index) => {\n\n\t\tif (this.#grd.classList.contains(\"multi\") && index >= 0) {\n\t\t\tconst record = this.#sheet.view.get(index);\n\n\t\t\tthis.#grd.data.setValue(record.m._[NINE_TABLE.META.INDEX.ROWID], \"CHK\", record.CHK === \"Y\" ? \"N\" : \"Y\");\n\n\t\t\tthis.#grd.refresh();\n\t\t}\n\t};\n\n\t#selectRow = (index) => {\n\t\tif (index !== -1) {\n\t\t\tthis.#sheet.row.focus(index, () => {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tconst cell = this.#sheet.querySelector(`tr[data-index=\"${index}\"] td[data-col=\"2\"]`);\n\t\t\t\t\tthis.#sheet.navigation.currentCell = cell;\n\t\t\t\t\tcell.focus();\n\t\t\t\t\tthis.#sheet.invalidate();\n\t\t\t\t});\n\t\t\t});\n\t\t} else {\n\t\t\tthis.#sheet.row.focus(-1, () => {\n\t\t\t});\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.#sheet.selection.clear();\n\n\t\t\t\tthis.#sheet.navigation.currentCell = this.#sheet.querySelector(`tr[data-index=\"0\"] td[data-col=\"2\"]`);\n\t\t\t\tthis.#sheet.focus();\n\t\t\t\tthis.#sheet.invalidate();\n\t\t\t});\n\t\t}\n\t}\n\n\t#onSelectAll = (e) => {\n\n\t\tconst chkIdx = this.#grd.fields.get().indexOf(\"CHK\");\n\n\t\tthis.#grd.data.getArray().forEach(record => {\n\t\t\trecord.v[chkIdx] = e.target.checked ? \"Y\" : \"N\";\n\t\t});\n\n\t\tthis.#sheet.invalidate();\n\t};\n\n\n\t#onInput = (e) => {\n\t\tconst query = e.target.value.toLowerCase().trim();\n\n\t\tif (!query) {\n\t\t\tthis.#sheet.filtering.clear();\n\t\t} else {\n\t\t\tconst rawRecords = this.#grd.data.getArray();\n\t\t\tconst fields = this.#grd.fields.get();\n\n\t\t\tconst colnm = \"tmp1\";\n\t\t\tconst data2Idx = fields.indexOf(colnm);\n\n\t\t\tconst matchedValues = [];\n\t\t\trawRecords.forEach(record => {\n\t\t\t\tconst val = data2Idx >= 0 && record.v ? record.v[data2Idx] : \"\";\n\t\t\t\tconst textVal = String(val).replace(/<[^>]*>?/gm, '').toLowerCase();\n\n\t\t\t\tif (textVal.includes(query)) {\n\t\t\t\t\tmatchedValues.push(val);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.#sheet.filtering.set({\n\t\t\t\t[colnm]: [...new Set(matchedValues)]\n\t\t\t});\n\t\t}\n\t}\n\n\tget isOpen() {\n\t\treturn this.#isOpen;\n\t}\n\n\tget targetCell() {\n\t\treturn this.#parent;\n\t}\n\n\t#initEvents = () => {\n\t\tthis.querySelector(\".search-input\").addEventListener(\"input\", this.#onInput);\n\t\tthis.querySelector(\".search-input\").addEventListener(\"keydown\", this.#onKeydown_input);\n\t\tthis.querySelector(\"#btnOk\").addEventListener(\"click\", this.#onOk);\n\t\tthis.querySelector(\"#chkAll\").addEventListener(\"change\", this.#onSelectAll);\n\n\t\tthis.#sheet.addEventListener(\"keydown\", this.#onKeydown);\n\t\tthis.#sheet.addEventListener(\"click\", this.#onClick);\n\n\t\tdocument.addEventListener(\"mousedown\", (e) => {\n\t\t\tconst path = e.composedPath ? e.composedPath() : [];\n\n\t\t\tif (path.includes(this)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.close();\n\t\t});\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"text\" class=\"search-input\" placeholder=\"Search...\" />\n \n <nine-table-simple class=\"combo-list\" theme=\"simple\">\n <table auto-fit-col=\"true\">\n <colgroup>\n <col width=\"30\" fixed=\"left\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"0\" />\n </colgroup>\n <tbody>\n <tr>\n <td cell-type=\"checkbox\" data-bind=\"CHK\"></td>\n <td data-bind=\"tmp1\" />\n <td data-bind=\"tmp2\" />\n <td data-bind=\"tmp3\" />\n <td data-bind=\"tmp4\" />\n <td data-bind=\"tmp5\" />\n <td data-bind=\"tmp6\" />\n <td data-bind=\"tmp7\" />\n <td data-bind=\"tmp8\" />\n <td data-bind=\"tmp9\" />\n <td data-bind=\"tmp10\" />\n <td data-bind=\"k\" />\n </tr>\n </tbody>\n </table>\n </nine-table-simple>\n \n <div class=\"footer\">\n <label for=\"chkAll\"><input id=\"chkAll\" type=\"checkbox\" checked><span>Select All</span></label>\n <button id=\"btnOk\">OK</button>\n </div>\n `;\n\t};\n}\n\nif (!customElements.get('cell-combo-panel')) {\n\tcustomElements.define(\"cell-combo-panel\", CellComboPanel);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\nimport \"./cell-combo-panel.js\";\n\nexport class CellCombo extends EditableCellElement {\n\t#targetBtn;\n\t#dataSource = [];\n\t#keyName;\n\t#valueName;\n\t#multi;\n\t#multiSeparator;\n\t#panel;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#init();\n\t}\n\n\trerenderer = () => {\n\t\tthis.#initData();\n\t\tthis.refresh();\n\t};\n\n\n\trefresh = () => {\n\t\tconst v = super.refresh();\n\t\tif (!this.#targetBtn) return v;\n\n\t\tthis.#targetBtn.textContent = this.#getDisplayText() || \"Select\";\n\t\tthis.#validateInput();\n\n\t\treturn v;\n\t};\n\n\t#getDisplayText = () => {\n\t\tif (!this.value || !Array.isArray(this.#dataSource)) return \"\";\n\n\t\tif (this.#multi) {\n\t\t\tconst keys = String(this.value).split(this.#multiSeparator);\n\t\t\treturn this.#dataSource\n\t\t\t\t.filter(m => keys.includes(String(m[this.#keyName])))\n\t\t\t\t.map(m => m[this.#valueName])\n\t\t\t\t.join(this.#multiSeparator);\n\t\t} else {\n\t\t\tconst found = this.#dataSource.find(m => String(m[this.#keyName]) === String(this.value));\n\t\t\treturn found ? found[this.#valueName] : this.value;\n\t\t}\n\t}\n\n\t#validateInput = () => {\n\t\tif (!super.cell) return;\n\t\tsuper.cell.classList.remove(\"invalid\");\n\n\t\tif (this.value === null || this.value === undefined || this.value === \"\" || !Array.isArray(this.#dataSource)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst list = this.#multi ? String(this.value).split(this.#multiSeparator) : [this.value];\n\t\tfor (const v of list) {\n\t\t\tconst idx = this.#dataSource.findIndex(m => String(v) === String(m[this.#keyName]));\n\t\t\tif (idx < 0) {\n\t\t\t\tsuper.cell.classList.add(\"invalid\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t};\n\n\t#init = () => {\n\t\tthis.#renderer();\n\n\t\tthis.#keyName = this.cell.getAttribute(\"key-name\") || \"k\";\n\t\tthis.#valueName = this.cell.getAttribute(\"value-name\") || \"v\";\n\t\tthis.#multi = this.cell.getAttribute('multi') === \"true\";\n\t\tthis.#multiSeparator = this.cell.getAttribute(\"multi-separator\") || \",\";\n\n\t\tthis.#initData();\n\t\tthis.#initEvent();\n\t}\n\n\t#initData = () => {\n\t\tif (!super.sheet || !super.cell) return;\n\n\t\tconst dataSource = super.cell?.getAttribute(\"data-source\");\n\t\tif (!dataSource) return;\n\n\t\tthis.#dataSource = super.getExprValue(dataSource, super.tr.data, super.tr.dataset.row);\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <button class=\"btn1\" type=\"button\" tabindex=\"-1\">Select</button>\n <button class=\"btn2\" type=\"button\" tabindex=\"-1\"></button>\n `;\n\n\t\tthis.#targetBtn = this.querySelector(\".btn1\");\n\t};\n\n\t#initEvent = () => {\n\t\tthis.querySelectorAll(\"button\").forEach(btn => {\n\t\t\tbtn.addEventListener(\"click\", (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tthis.#togglePanel();\n\t\t\t});\n\t\t});\n\n\n\t\tthis.cell.addEventListener('keydown', (e) => {\n\t\t\tif ([\"Space\"].includes(e.code)) {\n\t\t\t\tthis.#togglePanel();\n\t\t\t}\n\t\t});\n\t}\n\n\t#togglePanel = () => {\n\n\t\tif (!this.#panel) {\n\t\t\tthis.#panel = super.sheet.querySelector(\"cell-combo-panel\");\n\t\t\tif (!this.#panel) {\n\t\t\t\tthis.#panel = document.createElement(\"cell-combo-panel\");\n\t\t\t\tsuper.sheet.appendChild(this.#panel);\n\t\t\t}\n\t\t}\n\n\t\tif (this.#panel.isOpen && this.#panel.targetCell === this) {\n\t\t\tthis.#panel.close();\n\t\t} else {\n\t\t\tthis.#panel.open(this, this.#dataSource, this.#keyName, this.#valueName, this.#multi, this.#multiSeparator);\n\t\t}\n\t}\n\n\tget dataSource() {\n\t\treturn this.#dataSource;\n\t}\n}\n\nif (!customElements.get('cell-combo')) {\n\tcustomElements.define(\"cell-combo\", CellCombo);\n}","import { trace } from \"@nopeer\";\nimport { CellElement } from \"./core/CellElement.js\";\n\nclass CellRenderer extends CellElement {\n\t#target;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"span\");\n\t}\n\n\trefresh = () => {\n\n\t\tsuper.refresh();\n\n\t\tif (this.cell.getAttribute(\"html\") === \"true\") {\n\t\t\tthis.#target.innerHTML = this.getDisplayText();\n\t\t} else {\n\t\t\tthis.#target.textContent = this.getDisplayText();\n\t\t}\n\t};\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <span class=\"wrapper\"></span>\n `;\n\t};\n}\n\nif (!customElements.get(\"cell-renderer\")) {\n\tcustomElements.define(\"cell-renderer\", CellRenderer);\n}","import { CellElement } from \"./core/CellElement.js\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport { trace } from \"@nopeer\";\n\nexport class CellButton extends CellElement {\n\t#target;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tthis.#renderer();\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#target = this.querySelector(\"button\");\n\n\t\tthis.#target.removeEventListener(\"click\", this.#cellButtonClick);\n\t\tthis.#target.addEventListener(\"click\", this.#cellButtonClick);\n\t}\n\n\t#cellButtonClick = e => {\n\t\te.stopPropagation();\n\n\t\tconst rowid = parseInt(this.cell.dataset.row, 10);\n\n\t\tconst customEvent = new CustomEvent(NINE_TABLE.EVENT.CELL_BUTTON_CLICK, {\n\t\t\tbubbles: true,\n\t\t\tcomposed: true,\n\t\t\tdetail: {\n\t\t\t\toriginalEvent: e,\n\t\t\t\tcell: this.cell,\n\t\t\t\trow: rowid,\n\t\t\t\tcol: parseInt(this.cell.dataset.col, 10),\n\t\t\t\tbind: this.dataset.bind,\n\t\t\t\tdata: this.host.data.get(rowid),\n\t\t\t\tvalue: this.value,\n\t\t\t}\n\t\t});\n\n\t\tthis.dispatchEvent(customEvent);\n\t};\n\n\trefresh = () => {\n\t\tconst rawValue = super.refresh ? super.refresh() : this.value;\n\t\t//let displayValue = this.getDisplayText(rawValue);\n\t\tthis.#target.innerHTML = this.getDisplayText(rawValue);\n\t};\n\n\t#renderer = () => {\n\n\t\tconst buttonText = \"...\";//this.getAttribute(\"text\") || super.attr[\"text\"] || \"\";\n\n\t\tthis.innerHTML = `\n <button class=\"button\">${buttonText}</button>\n `;\n\t};\n}\n\nif (!customElements.get('cell-button')) {\n\tcustomElements.define(\"cell-button\", CellButton);\n}","import { trace } from \"@nopeer\";\nimport { CellElement } from \"./core/CellElement.js\";\nimport {NINE_TABLE} from \"@\";\n\nclass CellRowIndicator extends CellElement {\n\t#mainTarget;\n\t#subTarget;\n\t#statusTarget;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tthis.#renderer();\n\t\tsuper.connectedCallback();\n\n\t\tif (this.cell) {\n\t\t\tthis.cell.removeAttribute(\"tabindex\");\n\t\t\tthis.cell.dataset.bind = \"rowState\";\n\t\t}\n\n\t\tthis.#mainTarget = this.querySelector(\".ng-row-main\");\n\t\tthis.#subTarget = this.querySelector(\".ng-row-sub\");\n\t\tthis.#statusTarget = this.querySelector(\".row-status\");\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n\t\t\t<span class=\"ng-row-main\"></span>\n <span class=\"ng-row-sub\"></span>\n <span class=\"row-status\"></span>\n `;\n\t}\n\n\trefresh = () => {\n\t\tif (!this.cell || !this.tr) return;\n\n\t\tthis.classList.remove(\"is-insert\", \"is-update\", \"is-delete\");\n\n\t\tconst row = this.row;\n\t\tif (isNaN(row)) return;\n\n\t\tconst rawRecord = this.tr.data;\n\n\t\tif (rawRecord) {\n\t\t\tswitch (rawRecord.m._[NINE_TABLE.META.INDEX.ROW_STATE]) {\n\t\t\t\tcase NINE_TABLE.ROW_STATE.INSERT:\n\t\t\t\t\tthis.classList.add(\"is-insert\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase NINE_TABLE.ROW_STATE.UPDATE:\n\t\t\t\t\tthis.classList.add(\"is-update\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase NINE_TABLE.ROW_STATE.DELETE:\n\t\t\t\t\tthis.classList.add(\"is-delete\");\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tconst displayNum = this.index + 1;\n\t\tconst formattedNum = displayNum.toLocaleString();\n\n\t\tif (displayNum >= 10000) {\n\n\t\t\tconst splitIndex = formattedNum.length - 4;\n\t\t\tconst prefixPart = formattedNum.substring(0, splitIndex + 1);\n\t\t\tconst suffixPart = formattedNum.substring(splitIndex + 1);\n\n\t\t\tthis.#mainTarget.innerHTML = `\n \t<span class=\"ng-row-prefix\">${prefixPart}</span>\n \t<span class=\"ng-row-suffix\">${suffixPart}</span>\n \t<div class=\"row-status\"></div>\n \t`;\n\t\t} else {\n\t\t\tthis.#mainTarget.innerHTML = `${formattedNum}`;\n\t\t}\n\n\t\tconst isSorted = this.sheet.querySelector(\"thead .asc,thead .desc\") ? true : false;\n\t\tconst isFitered = this.sheet.querySelector(\"thead nine-table-filter-button.filtered\") ? true : false;\n\n\t\tthis.#subTarget.innerHTML = row;\n\t\tthis.#subTarget.style.display = (isSorted || isFitered) ? \"\" : \"none\";\n\t};\n}\n\nif (!customElements.get('cell-row-indicator')) {\n\tcustomElements.define(\"cell-row-indicator\", CellRowIndicator);\n}","// ui/col/col-expand.js\nimport { COLLAPSED_WIDTH } from \"@/layout/core/TableCompiler.js\";\n\nexport class ColExpand extends HTMLElement {\n #sheet;\n #cell;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#cell = this.closest('th, td');\n this.#sheet = this.closest('nine-table-sheet');\n\n if (this.#cell) {\n this.#cell.style.position = 'relative';\n }\n\n const isCollapsed =\n this.getAttribute('collapsed') === 'true' ||\n this.#cell?.getAttribute('collapsed') === 'true';\n\n if (isCollapsed) {\n requestAnimationFrame(() => {\n this.collapse(true);\n });\n } else {\n this.classList.remove('collapsed');\n this.classList.add('expand');\n }\n\n this.removeEventListener('click', this.#onClick);\n this.addEventListener('click', this.#onClick);\n }\n\n #onClick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (this.classList.contains('expand')) {\n this.collapse();\n } else {\n this.expand();\n }\n };\n\n expand = () => {\n if (!this.#sheet?.colResizer || !this.#cell) return;\n const colIndex = parseInt(this.#cell.dataset.col, 10);\n const colSpan = this.#cell.colSpan || 1;\n\n this.classList.remove('collapsed');\n this.classList.add('expand');\n this.#cell.setAttribute('collapsed', 'false');\n this.#cell.style.color = '';\n\n const targetWidth = parseInt(this.#cell.dataset.expandWidth, 10) || 100;\n\n if (colSpan === 1) {\n this.#sheet.colResizer.setColumnWidth(colIndex, targetWidth);\n } else {\n const singleWidth = Math.max(30, Math.floor(targetWidth / colSpan));\n for (let i = 0; i < colSpan; i++) {\n this.#sheet.colResizer.setColumnWidth(colIndex + i, singleWidth);\n }\n }\n\n requestAnimationFrame(() => {\n if (typeof this.#sheet.refreshLayout === 'function') {\n this.#sheet.refreshLayout();\n }\n });\n };\n\n collapse = (isInitialInit = false) => {\n if (!this.#sheet?.colResizer || !this.#cell) return;\n const colIndex = parseInt(this.#cell.dataset.col, 10);\n const colSpan = this.#cell.colSpan || 1;\n\n if (this.classList.contains('expand')) {\n const col = this.#sheet.querySelector(`colgroup col[data-col=\"${colIndex}\"]`);\n const currentW = col ? parseInt(col.getAttribute('width'), 10) : 0;\n if (currentW > COLLAPSED_WIDTH) {\n this.#cell.dataset.expandWidth = String(currentW * colSpan);\n }\n }\n\n this.classList.remove('expand');\n this.classList.add('collapsed');\n this.#cell.setAttribute('collapsed', 'true');\n this.#cell.style.color = 'transparent';\n\n if (colSpan === 1) {\n this.#sheet.colResizer.setColumnWidth(colIndex, COLLAPSED_WIDTH);\n } else {\n const splitWidth = Math.max(10, Math.floor(COLLAPSED_WIDTH / colSpan));\n for (let i = 0; i < colSpan; i++) {\n this.#sheet.colResizer.setColumnWidth(colIndex + i, splitWidth);\n }\n }\n\n requestAnimationFrame(() => {\n if (typeof this.#sheet.refreshLayout === 'function') {\n this.#sheet.refreshLayout();\n }\n });\n };\n\n disconnectedCallback() {\n this.removeEventListener('click', this.#onClick);\n }\n}\n\nif (!customElements.get('nine-table-col-expand')) {\n customElements.define('nine-table-col-expand', ColExpand);\n}","import { trace } from \"@nopeer\";\nimport { ColFixManager } from \"@/col/ColFixManager.js\";\n\nexport class ContextMenu extends HTMLElement {\n #tableHost;\n #panel;\n\n connectedCallback() {\n const root = this.getRootNode();\n this.#tableHost = root instanceof ShadowRoot ? root.host : (this.closest('nine-table') || root.host);\n\n if (!this.#tableHost) {\n this.#tableHost = this.parentElement?.closest('nine-table') || this.assignedSlot?.closest('nine-table');\n }\n\n if (!this.#tableHost) return;\n }\n\n #onContextMenu = (e) => {\n const path = e.composedPath ? e.composedPath() : [];\n const targetCell = path.find(el => el.tagName === 'TH' || el.tagName === 'TD');\n\n if (!targetCell) return;\n\n const targetTable = path.find(el => el.tagName === 'TABLE') || targetCell.closest('table');\n\n e.preventDefault();\n e.stopPropagation();\n\n this.openMenu(e.clientX, e.clientY, targetCell, targetTable);\n };\n\n #getTargetSheet(targetCell) {\n return targetCell?.closest('nine-table-sheet') || this.#tableHost.activeSheet || this.#tableHost;\n }\n\n #getFixManager(targetCell) {\n const sheet = this.#getTargetSheet(targetCell);\n if (!sheet) return null;\n\n if (!sheet.colFix) {\n sheet.colFix = new ColFixManager(sheet);\n }\n return sheet.colFix;\n }\n\n #parseCustomMenuItems(containerElement, activeTable) {\n const items = [];\n const activeTableId = activeTable?.id;\n const allUls = Array.from(containerElement.querySelectorAll(':scope > ul'));\n\n allUls.forEach(rootUl => {\n const targetTableAttr = rootUl.getAttribute('target-table');\n\n if (!targetTableAttr || (activeTableId && targetTableAttr === activeTableId)) {\n const parsedList = this.#traverseUl(rootUl);\n items.push(...parsedList);\n }\n });\n\n return items;\n }\n\n #traverseUl(ulEl) {\n const list = [];\n Array.from(ulEl.children).forEach(child => {\n const tagName = child.tagName.toLowerCase();\n\n if (tagName === 'hr' || child.classList.contains('separator')) {\n list.push({ type: 'separator' });\n return;\n }\n\n if (tagName === 'li') {\n let name = '';\n const spanEl = child.querySelector(':scope > span');\n if (spanEl) {\n name = spanEl.textContent.trim();\n } else {\n name = Array.from(child.childNodes)\n .filter(n => n.nodeType === Node.TEXT_NODE)\n .map(n => n.textContent.trim())\n .join('');\n }\n\n const subUl = child.querySelector(':scope > ul');\n const item = {\n menuId: child.id || name,\n name: name,\n className: child.className || '',\n disabled: child.hasAttribute('disabled') || child.getAttribute('disabled') === 'true',\n isCustom: true\n };\n\n if (subUl) {\n item.items = this.#traverseUl(subUl);\n }\n\n list.push(item);\n }\n });\n return list;\n }\n\n #buildMenuItems(activeTable, isHeaderCell, targetCell) {\n const useDefault = this.getAttribute('use-default-menu') !== 'false';\n let rawItems = [];\n\n const customItems = this.#parseCustomMenuItems(this, activeTable);\n if (customItems.length > 0) {\n rawItems.push(...customItems);\n }\n\n const fixManager = this.#getFixManager(targetCell);\n const currentFixState = fixManager?.getFixState(targetCell, activeTable) ?? 'none';\n const isFixable = isHeaderCell && (fixManager?.canFixColumn(targetCell, activeTable) ?? false);\n\n let fixMenuItem = null;\n if (currentFixState === 'left' || currentFixState === 'right') {\n fixMenuItem = {\n menuId: 'unfix-column',\n name: 'Unfix Column',\n className: 'ng-menu-unfix-col',\n disabled: !isHeaderCell\n };\n } else {\n fixMenuItem = {\n menuId: 'fix-column',\n name: 'Fix Column',\n className: 'ng-menu-fix-col',\n disabled: !isFixable\n };\n }\n\n if (useDefault) {\n rawItems.push(\n { type: 'separator' },\n {\n menuId: 'sort',\n name: 'Sort',\n className: 'ng-menu-sort',\n disabled: !isHeaderCell\n },\n fixMenuItem,\n { type: 'separator' },\n { menuId: 'filtering', name: 'Filtering', className: 'ng-menu-filtering' },\n { menuId: 'maximize', name: 'Maximize', className: 'maximize' },\n {\n menuId: 'export',\n name: 'Export',\n className: 'export',\n items: [\n { menuId: 'export-excel', name: 'Excel', className: 'export-excel' },\n { menuId: 'export-pdf', name: 'PDF', className: 'export-pdf', disabled: true }\n ]\n },\n {\n menuId: 'properties',\n name: 'Options',\n className: 'options',\n items: [\n { menuId: 'show-title-bar', name: 'Title Bar Show/Hide', className: 'show-title-bar' },\n { menuId: 'show-status-bar', name: 'Status Bar Show/Hide', className: 'show-status-bar' },\n { menuId: 'auto-fit-col', name: 'Auto Fit Columns', className: 'auto-fit-col' }\n ]\n }\n );\n }\n\n const cleanedItems = [];\n rawItems.forEach((item) => {\n if (item.type === 'separator') {\n if (cleanedItems.length === 0 || cleanedItems[cleanedItems.length - 1].type === 'separator') {\n return;\n }\n }\n cleanedItems.push(item);\n });\n\n if (cleanedItems.length > 0 && cleanedItems[cleanedItems.length - 1].type === 'separator') {\n cleanedItems.pop();\n }\n\n return cleanedItems;\n }\n\n openMenu(x, y, targetCell, targetTable) {\n const targetParent = this.#tableHost.shadowRoot || this.#tableHost;\n\n if (!this.#panel) {\n this.#panel = document.createElement('nine-table-menu-panel');\n targetParent.appendChild(this.#panel);\n }\n\n const isHeaderCell = !!targetCell.closest('thead');\n const menuItems = this.#buildMenuItems(targetTable, isHeaderCell, targetCell);\n\n this.#panel.render(menuItems, (e) => this.#handleMenuClick(e, targetCell, targetTable));\n\n const targetSheet = this.#getTargetSheet(targetCell);\n this.#syncMenuStates(targetSheet);\n\n this.#panel.openAt(x, y);\n }\n\n #syncMenuStates(targetSheet) {\n if (!this.#panel || !targetSheet) return;\n\n const isFiltering = targetSheet.filtering?.isFiltering?.() || false;\n this.#panel.toggleItemState('filtering', 'on', isFiltering);\n\n const autoFit = this.#tableHost.getAttribute('auto-fit-col') === 'true';\n this.#panel.toggleItemState('auto-fit-col', 'on', autoFit);\n\n const showTitle = this.#tableHost.getAttribute('show-title-bar') === 'true';\n this.#panel.toggleItemState('show-title-bar', 'on', showTitle);\n }\n\n #handleMenuClick(e, targetCell, targetTable) {\n const menuId = e.menuId;\n\n const customEvent = new CustomEvent('menu-click', {\n detail: { menuId, targetCell, targetTable, originalEvent: e },\n bubbles: true,\n composed: true\n });\n this.dispatchEvent(customEvent);\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n const targetSheet = this.#getTargetSheet(targetCell);\n\n switch (menuId) {\n case 'fix-column':\n case 'unfix-column':\n const fixManager = this.#getFixManager(targetCell);\n fixManager?.executeFixToggle(menuId, targetCell);\n break;\n\n case 'sort':\n if (!isNaN(baseCol)) {\n targetSheet.sorting?.handleSortFromMenu?.(baseCol, targetCell);\n }\n break;\n\n case 'filtering':\n targetSheet?.filtering?.toggle();\n break;\n\n case 'auto-fit-col':\n this.#tableHost.setAttribute('auto-fit-col', this.#tableHost.getAttribute('auto-fit-col') === 'true' ? 'false' : 'true');\n break;\n\n case 'show-title-bar':\n this.#tableHost.setAttribute('show-title-bar', this.#tableHost.getAttribute('show-title-bar') === 'true' ? 'false' : 'true');\n break;\n }\n\n this.#panel.close();\n }\n\n disconnectedCallback() {\n this.#tableHost?.removeEventListener('contextmenu', this.#onContextMenu);\n }\n}\n\nif (!customElements.get('nine-table-menu')) {\n customElements.define('nine-table-menu', ContextMenu);\n}","// ui/menu/nine-table-menu-panel.js\n\nexport class MenuPanel extends HTMLElement {\n #onCallback;\n #closeHandler = null;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n\n this.style.position = 'fixed';\n this.style.display = 'none';\n this.style.zIndex = '99999';\n\n this.innerHTML = `\n <div class=\"menu-wrapper\">\n <ul class=\"menu-container\"></ul>\n </div>\n `;\n }\n\n render(items, callback) {\n this.#onCallback = callback;\n const container = this.querySelector('.menu-container');\n if (!container) return;\n\n container.innerHTML = '';\n\n this.#appendItems(container, items);\n this.#bindClickEvents();\n }\n\n openAt(x, y, targetCell = null) {\n this.style.display = 'block';\n\n if (targetCell) {\n const cellRect = targetCell.getBoundingClientRect();\n const cellRightX = cellRect.right;\n\n requestAnimationFrame(() => {\n const wrapper = this.querySelector('.menu-wrapper');\n if (!wrapper) return;\n const panelWidth = wrapper.getBoundingClientRect().width;\n\n let calculatedLeft = cellRightX - panelWidth;\n\n if (calculatedLeft < 0) {\n calculatedLeft = cellRect.left;\n }\n\n const panelHeight = wrapper.getBoundingClientRect().height;\n let calculatedTop = y;\n if (y + panelHeight > window.innerHeight) {\n calculatedTop = y - panelHeight;\n }\n\n this.style.left = `${calculatedLeft}px`;\n this.style.top = `${calculatedTop}px`;\n });\n } else {\n this.style.left = `${x}px`;\n this.style.top = `${y}px`;\n\n requestAnimationFrame(() => {\n const wrapper = this.querySelector('.menu-wrapper');\n if (!wrapper) return;\n const rect = wrapper.getBoundingClientRect();\n\n if (x + rect.width > window.innerWidth) {\n this.style.left = `${x - rect.width}px`;\n }\n if (y + rect.height > window.innerHeight) {\n this.style.top = `${y - rect.height}px`;\n }\n });\n }\n\n if (this.#closeHandler) {\n window.removeEventListener('pointerdown', this.#closeHandler);\n }\n\n this.#closeHandler = (e) => {\n const path = e.composedPath ? e.composedPath() : [];\n if (!path.includes(this) && !this.contains(e.target)) {\n this.close();\n }\n };\n\n setTimeout(() => {\n window.addEventListener('pointerdown', this.#closeHandler);\n }, 0);\n }\n\n close() {\n this.style.display = 'none';\n if (this.#closeHandler) {\n window.removeEventListener('pointerdown', this.#closeHandler);\n this.#closeHandler = null;\n }\n }\n\n toggleItemState(menuId, className, condition) {\n const li = this.querySelector(`li[menu-id=\"${menuId}\"]`);\n if (li) {\n condition ? li.classList.add(className) : li.classList.remove(className);\n }\n }\n\n #appendItems(parentUl, items) {\n items.forEach(item => {\n if (item.type === 'separator') {\n const sep = document.createElement('li');\n sep.className = 'ng-menu-separator';\n parentUl.appendChild(sep);\n return;\n }\n\n const li = document.createElement('li');\n li.setAttribute('menu-id', item.menuId);\n li.className = `${item.className || ''} ${item.items ? 'submenu' : ''} ${item.disabled ? 'disabled' : ''}`.trim();\n\n const span = document.createElement('span');\n span.textContent = item.name;\n li.appendChild(span);\n\n if (item.items && item.items.length > 0) {\n const subUl = document.createElement('ul');\n subUl.className = 'ng-menu-sublist';\n this.#appendItems(subUl, item.items);\n li.appendChild(subUl);\n }\n\n parentUl.appendChild(li);\n });\n }\n\n #bindClickEvents() {\n this.querySelectorAll('li[menu-id]').forEach(li => {\n li.addEventListener('click', (e) => {\n e.stopPropagation();\n if (li.classList.contains('disabled')) return;\n\n const menuId = li.getAttribute('menu-id');\n this.#onCallback?.({ menuId, target: li });\n this.close();\n });\n });\n }\n\n disconnectedCallback() {\n this.close();\n }\n}\n\nif (!customElements.get('nine-table-menu-panel')) {\n customElements.define('nine-table-menu-panel', MenuPanel);\n}"],"mappings":";;AAAA,MAAM,UAAU,mBAAmB,SAAS,GAAQ;CAGhD,IAAII,IAAQ,GACRC,IAAM,KAAK,SAAS,GACpBC;CAEJ,OAAOF,KAASC,IAAK;EAGjB,IAFA,IAAM,UAAUD,IAAQC,KAAO,CAAC,GAE5BE,MAAW,KAAKD,IAChB,OAAOA;EAEP,AAAIC,IAAS,KAAKD,KACd,IAAMA,IAAM,IAEZ,IAAQA,IAAM;CAG1B;CAEA,OAAO;AACX;AAEA,IAAME,oBAAuB,IAAI,QAAQ;AAEzC,YAAY,UAAU,2BAA2B,SAC7C,GACA,GACA,GACA,GACA,IAAe,KACjB;CACE,IAAMC,IAAK;CAEX,AAAKD,EAAqB,IAAIC,CAAE,KAC5BD,EAAqB,IAAIC,GAAI;EAAE,OAAO;EAAM,UAAU;CAAK,CAAC;CAEhE,IAAMC,IAAQF,EAAqB,IAAIC,CAAE;CAiBzC,AAfAA,EAAG,iBAAiBE,IAAe,MAAM;EASrC,AARA,EAAE,eAAe,EAAE,QAEnB,AAEID,EAAM,WADN,aAAaA,EAAM,KAAK,GACV,OAIlB,EAAM,QAAQ,iBAAiB;GAE3B,AADA,EAAM,QAAQ,MACd,EAAM,WAAWE,EAAU,KAAKH,GAAI,CAAC;EACzC,GAAGI,CAAY;CACnB,CAAC,GAEDJ,EAAG,iBAAiBK,IAAgB,MAAM;EAWtC,AAVA,AAEIJ,EAAM,WADN,aAAaA,EAAM,KAAK,GACV,OAGlB,AAEIA,EAAM,cADNA,EAAM,SAAS,GACE,OAGrBK,EAAW,KAAKN,GAAI,CAAC;CACzB,CAAC;AACL,GAGA,KAAK,mBAAmB,GAAO,IAAQ,sBAAsB;CAEzD,IADI,OAAOO,KAAU,aAAU,KAAgB,KAC3C,CAACA,GAAO,OAAO;EAAE,OAAO;EAAM,QAAQ;CAAK;CAE/C,IAAMC,KAAa,MAAS;EACxB,IAAMC,IAAM,SAAS,cAAc,KAAK;EAExC,OADA,EAAI,YAAYC,GACTD,EAAI,eAAeA,EAAI,aAAa;CAC/C;CAEA,IAAQF,EAAM,WAAW,MAAM,MAAM;CAErC,IAAII,IAAS,SAAS,KAAK,cAAc,8BAA8B;CACvE,AAAKA,MACD,IAAS,SAAS,cAAc,QAAQ,GACxC,EAAO,KAAK,yBACZ,EAAO,MAAM,UAAU,gFACvB,SAAS,KAAK,YAAYA,CAAM;CAGpC,IAAMC,IAAUD,EAAO,WAAW,IAAI;CACtC,EAAQ,OAAOE;CAEf,IAAIC,IAAI,GACJC,IAAI;CAER,KAAK,IAAIC,KAAKT,EAAM,MAAM,MAAM,GAAG;EAC/B,IAAMU,IAAYT,EAAUQ,CAAC,GACvBE,IAAUN,EAAQ,YAAYK,CAAS;EAE7C,IAAI,KAAK,IAAIH,GAAGI,EAAQ,KAAK;EAE7B,IAAMC,IAASD,EAAQ,yBAAyB,IAC1CE,IAAUF,EAAQ,0BAA0B;EAClD,KAAKC,IAASC;CAClB;CAEA,OAAO;EACH,OAAON;EACP,QAAQC;CACZ;AACJ;ACvGA,IAAavB,IAAQ,IAAI,cAPED,EAAY,YAAY;CAC/C,cAAc;EAEV,AADA,MAAM,GACN,KAAK,KAAK,cAAc,OAAO;CACnC;AACJ,EAE+B,GCTlBgC,IAAa;CACtB,MAAM,EACF,OAAO;EACH,OAAO;EACP,WAAW;EACX,QAAQ;EACR,OAAO;CAGX,EACJ;CACA,WAAW;EACP,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;CACZ;CACA,OAAO;EACH,MAAM;EACN,WAAW;EACX,aAAa;EACb,mBAAoB;CACxB;AACJ,GCrBaC,IAAb,MAAmB;CAClB;CACA,KAAU;CAEV,YAAY,GAAQ;EACnB,KAAKC,KAAUC;CAChB;CAEA,IAAI,KAAK;EACR,OAAO,KAAKC;CACb;CACA,IAAI,GAAG,GAAG;EACT,KAAKA,KAAU,SAASX,GAAG,EAAE;CAC9B;CAEA,cAAc,KAAKS,GAAQ,WAAW;AACvC,GAEaG,IAAb,MAAaA,EAAO;CACnB;CACA;CACA,KAAU;CACV,KAAiB,CAAC;CAElB,OAAO,aAAa,EACnB,QAAQ,EAIT;CAEA,OAAO,YAAY;EAClB,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;CACT;CAEA,YAAY,GAAM,GAAQ;EAGzB,AAFA,KAAKC,KAAQC,GACb,KAAKL,KAAUC,GACf,KAAKK,GAAY;CAClB;CAGA,YACoB,KAAKN,GAAQ,cAAc,CAAC,EAAA,CAC7B,QAAO,MAAQO,EAAK,EAAE,EAAET,EAAW,KAAK,MAAM,eAAeA,EAAW,UAAU,MAAM;CAG3G,IAAI,QAAQ;EACX,OAAO,KAAK;CACb;CAEA,cACQ,KAAK;CAGb,YAAY,GAAI,MAAU;EACzB,IAAMU,IAAe,KAAKC,GAAiB;EAE3C,IAAIC,KAA2B,MAC9B,OAAOF;EAGR,IAAIE,IAAK,KAAKA,KAAMF,EAAa,QAAQ,OAAO;EAEhD,IAAMG,IAAeH,EAAaE;EAElC,IAAIE,KAAS,MAAM;GAElB,IAAMC,IADS,KAAK,cACH,CAAC,CAAC,QAAQD,CAAK;GAChC,OAAQC,KAAO,IAAKF,EAAa,EAAEE,KAAO;EAC3C;EAEA,OAAOF;CACR;CAEA,YAAY,GAAU,GAAU,MAAU;EAEzC,IAAMG,IADe,KAAKL,GACC,CAAC,CAACM;EAO7B,AALiBD,EAAQ,EAAEE,OACVC,KAASH,EAAQ,KAAK,aAAaX,EAAO,UAAU,WACpE,EAAQ,KAAK,WAAWA,EAAO,UAAU,SAG1C,EAAQ,EAAEa,KAAYC;CACvB;CAGA,OAAO,GAAI,MAAU;EACpB,IAAMT,IAAe,KAAKC,GAAiB;EAE3C,IAAIC,KAA2B,MAC9B,OAAO,KAAKQ,GAAMV,CAAY;EAG/B,IAAIE,IAAK,KAAKA,KAAMF,EAAa,QAAQ,OAAO;EAEhD,IAAMG,IAAeH,EAAaE,IAC5BS,IAAS,KAAK,cAAc;EAElC,IAAIP,KAAS,MAAM;GAClB,IAAMC,IAAMM,EAAO,QAAQP,CAAK;GAChC,OAAQC,KAAO,IAAKF,EAAa,EAAEE,KAAO;EAC3C;EAEA,OAAO,KAAKK,GAAMP,CAAY;CAC/B;CAEA,eACQ,KAAKX,GAAQ,cAAc,CAAC;CAGpC,sBACQ,OAAO,KAAKI,GAAM,QAAQ,OAAQ,aAAa,KAAKA,GAAM,OAAO,IAAI,IAAI,CAAC;CAGlF,WAAoB;EACnB,KAAKgB,KAAiB,CAAC;EACvB,IAAMC,IAAmB,KAAKjB,GAAM,YAAY,CAAC;EAKjD,AAJA,MAAM,KAAKiB,CAAgB,CAAC,CAAC,SAAQ,MAAM;GAC1C,KAAKD,GAAe,KAAK7C,EAAG,wBAAwB,CAAC,CAAC,UAAU,EAAE;EACnE,CAAC,IAEA,KAAKyB,GAAQ,cAAc,CAAC,EAAA,CAAG,SAAQ,MAAK;GAE5C,AADA,AAAaT,EAAE,SAAO,KAAK+B,GAAgB,GAC3C,EAAE,KAAK,SAAS,KAAKF,GAAe,MAAM;EAC3C,CAAC;CACF;CAEA,IAAI,SAAS;EACZ,OAAO,KAAKF,GAAM,KAAKlB,GAAQ,UAAU;CAC1C;CACA,IAAI,OAAO,GAAG;EACb,KAAK,IAAIT,CAAC;CACX;CAEA,WAAoB;EAKnB,AAJA,KAAKa,GAAM,WAAW,iBAAiB,kBAAkB,CAAC,CAAC,SAAQ,MAAO;GACzE,EAAI,WAAW;EAChB,CAAC,GAED,KAAKA,GAAM,WAAW,cAAc,0BAA0B,CAAC,EAAE,QAAQ;CAC1E;CAEA,OAAO,MAAe;EAErB,IAAMmB,UAAiB;GAEtB,AADA,KAAKnB,GAAM,UAAU,IACrB,iBAAiB;IAChB,IAAI;KAGH,AAFA,KAAK,MAAM,GACX,KAAK,IAAIoB,GAAY,EAAK,GAC1B,KAAKC,GAAY;IAClB,UAAU;KACT,KAAKrB,GAAM,UAAU;IACtB;GACD,CAAC;EACF;EAEA,AAAI,KAAKA,GAAM,SACdmB,EAAS,IAGT,KAAKnB,GAAM,iBAAiBN,EAAW,MAAM,OAAM,MAAK;GACvD,EAAS;EACV,GAAG,EAAE,MAAM,GAAK,CAAC;CAEnB;CAEA,IAAI,SAAS;EACZ,OAAO,KAAK4B;CACb;CAEA,IAAI,SAAS;EACZ,OAAO,KAAKjB,GAAiB,CAAC,CAAC;CAChC;CAEA,IAAI,QAAQ;EACX,OAAO,KAAK;CACb;CAEA,cAAc;EACb,OAAO,KAAK;CACb;CAEA,MAAmB,IAAQ,OACnB;EACN,UAAUN,EAAO,UAAU;EAC3B,SAAS;EACT,UAAU;EACV,QAAQ,KAAKiB,GAAe,MAAM;EAClC,GAAG,CAAC;EACJ,GAAG,CAAC;EACJ,IAAI;GAAC;GAAG;GAAG;GAAG;GAAGjB,EAAO,UAAU;GAAO;GAAO;GAAO;GAAM;GAAO;GAAM;GAAM;GAAO,KAAKiB,GAAe,MAAM;GAAG;GAAI,CAAC;GAAG,CAAC;EAAC;EAC9H,GAAG;GAACO;GAAO7B,EAAW,UAAU;GAAO,CAAC;GAAG,CAAC;EAAC;CAC9C;CAGD,cAAc;EAEb,AADA,KAAKE,GAAQ,aAAa,CAAC,GAC3B,KAAKyB,GAAY;CAClB;CAEA,cAAc;EAQb,AAPA,KAAKzB,GAAQ,aAAa,CAAC,GACvB,KAAKA,GAAQ,aAAa,SAC7B,KAAKA,GAAQ,YAAY,MAAM,GAGhC,KAAK0B,KAAU,GAEf,KAAKD,GAAY;CAClB;CAEA,MAAe,MAAc;EAC5B,AAAK,MAAM,QAAQG,CAAS,MAAG,IAAY,CAACA,CAAS;EAErD,IAAMT,IAAS,KAAK,cAAc,CAAC,CAAC,SAAS,IAAI,KAAK,cAAc,IAAI,OAAO,KAAKS,EAAU,MAAM,CAAC,CAAC,GAChGC,IAAM,CAAC;EAUb,OARAD,EAAU,SAAQ,MAAQ;GACzB,IAAME,IAAI,EAAE,GAAG,CAAC,EAAE;GAIlB,AAHAX,EAAO,SAAQ,MAAS;IACvB,EAAE,EAAE,KAAKY,EAAKnB,OAAW,KAAA,KAAamB,EAAKnB,OAAW,OAAOmB,EAAKnB,KAAS,EAAE;GAC9E,CAAC,GACDiB,EAAI,KAAKC,CAAC;EACX,CAAC,GAEMD;CACR;CAEA,MAAkB,OACZ,MAAM,QAAQA,CAAG,MAAG,IAAM,CAACA,CAAG,IACnCA,EAAI,SAAQ,MAAK;EAChB,IAAMF,IAAQ,KAAK;EAQnB,AANA,EAAE,IAAI,KAAKL,GAAgBK,CAAK,GAChC,EAAE,OAAOG,EAAE,GACX,EAAE,KAAK,QAAQH,GAGf,EAAE,EAAE,EAAE7B,EAAW,KAAK,MAAM,SAAS6B,GACrC,EAAE,EAAE,EAAE7B,EAAW,KAAK,MAAM,aAAaA,EAAW,UAAU;CAC/D,CAAC,GACM+B;CAGR,MAAoB,MACL,KAAK7B,GAAQ,WAAW,WAAU,MAC3C,CAACgC,KAAU,CAACA,EAAO,KAAK,CAACA,EAAO,EAAE,IAAU,KACzCA,EAAO,EAAE,EAAElC,EAAW,KAAK,MAAM,WAAW6B,CAGzC;CAGZ,OAAO,GAAY,IAAc,OAAS;EACzC,AAAIH,MAAe,KAAA,MAAW,IAAa,CAAC;EAC5C,IAAMK,IAAM,KAAKI,GAAYT,CAAU,GAEjCU,IAAe,KAAKC,GAAeN,CAAG;EAE5C,KAAK7B,GAAQ,aAAa,KAAKA,GAAQ,WAAW,OAAOkC,CAAY;EAErE,IAAME,IAAM,KAAK,MAAM,IAAI;EAe3B,OAdIC,KACHR,EAAI,SAAS,GAAG,MAAQ;GACvB,IAAMxD,IAAS,KAAK2B,GAAQ,WAAW,KAAKA,GAAQ,WAAW,SAAS,IAAIa;GAC5E,AAAIxC,MAAQ,EAAO,EAAE,EAAEyB,EAAW,KAAK,MAAM,aAAaA,EAAW,UAAU;EAChF,CAAC,GAGF,KAAK2B,GAAY,GAEjB,KAAKrB,GAAM,cAAc,IAAI,YAAYN,EAAW,MAAM,WAAW;GACpE,SAAS;GACT,QAAQ;IAAE,QAAQ,KAAKM;IAAO,OAAO8B,EAAa,SAAS,IAAIA,EAAa,EAAE,CAAC,EAAE,EAAEpC,EAAW,KAAK,MAAM,SAAS;GAAK;EACxH,CAAC,CAAC,GAEKsC;CACR;CAGA,UAAU,GAAO,GAAY,IAAc,OAAS;EAGnD,AAAIZ,MAAe,KAAA,MAAW,IAAa,CAAC;EAC5C,IAAMK,IAAM,KAAKI,GAAYT,CAAU;EACvC,IAAIK,EAAI,WAAW,GAAG,OAAO;EAE7B,IAAIS,IAAc,KAAKC,GAAiBZ,CAAK,GASvCO,IAAe,KAAKC,GAAeN,CAAG;EAyB5C,OAnBA,KAAK7B,GAAQ,WAAW,OAAOsC,GAAa,GAAG,GAAGJ,CAAY,GAE1DG,KACHH,EAAa,SAAS,GAAG,MAAQ;GAChC,IAAM7D,IAAS,KAAK2B,GAAQ,WAAWsC,IAAczB;GAErD,AAAIxC,KAAUA,EAAO,KAAKA,EAAO,EAAE,MAClC,EAAO,EAAE,EAAEyB,EAAW,KAAK,MAAM,aAAaA,EAAW,UAAU;EAErE,CAAC,GAGF,KAAK2B,GAAY,GAEjB,KAAKrB,GAAM,cAAc,IAAI,YAAYN,EAAW,MAAM,WAAW;GACpE,SAAS;GACT,QAAQ;IAAE,QAAQ,KAAKM;IAAO,OAAO8B,EAAa,SAAS,IAAIA,EAAa,EAAE,CAAC,EAAE,EAAEpC,EAAW,KAAK,MAAM,SAAS;GAAK;EACxH,CAAC,CAAC,GAEKoC,EAAa,EAAE,CAAC,EAAE,EAAEpC,EAAW,KAAK,MAAM;CAClD;CAEA,UAAU,MAAM;EACf,IAAI+B,IAAM,CAAC;EACX,AAKCA,IALG,MAAM,QAAQtC,CAAC,IACZ,KAIA,CAAC,SAASA,GAAG,EAAE,CAAC;EAGvB,IAAIiD,IAAW,CAAC;EAChB,EAAI,SAAQ,MAAS;GACpB,EAAS,KAAK,KAAKD,GAAiBZ,CAAK,CAAC;EAC3C,CAAC;EAED,IAAMc,IAAU,KAAKzC,GAAQ;EAoB7B,AAlBAwC,EAAS,MAAM,GAAG,MAAME,IAAIC,CAAC,CAAC,CAAC,SAAQ,MAAS;GAE9C,IAAMC,IAAWH,EAAQI,EAAM,CAAC,EAAE,EAAE/C,EAAW,KAAK,MAAM;GAE1D,AAAI2C,EAAQI,EAAM,CAAC,EAAE,EAAE/C,EAAW,KAAK,MAAM,eAAeA,EAAW,UAAU,SAChF,KAAKE,GAAQ,aAAa,KAAKA,GAAQ,WAAW,QAAO,MAAQO,EAAK,EAAE,EAAET,EAAW,KAAK,MAAM,WAAW8C,CAAQ,IAEnH,KAAK5C,GAAQ,WAAW,SAAQ,MAAQ;IACvC,AAAIO,EAAK,EAAE,EAAET,EAAW,KAAK,MAAM,WAAW8C,MAC7C,EAAK,EAAE,EAAE9C,EAAW,KAAK,MAAM,aAAaA,EAAW,UAAU;GAEnE,CAAC;EAGJ,CAAC,GAED,KAAK2B,GAAY,GAEjB,KAAKrB,GAAM,cAAc,IAAI,YAAYN,EAAW,MAAM,aAAa;GACtE,SAAS;GACT,QAAQ;IAAE,QAAQ,KAAKM;IAAO,OAAOyB,EAAI,SAAS,IAAIA,EAAI,KAAK;GAAK;EACrE,CAAC,CAAC;CACH;CAEA,YAAY,GAAO,GAAO,GAAO,IAAc,OAAS;EAEvD,IAAQ,SAASF,GAAO,EAAE;EAE1B,IAAMmB,IADS,KAAK,cACC,CAAC,CAAC,QAAQlC,CAAK;EACpC,IAAIkC,IAAU,GAAG;EAEjB,IAAMD,IAAQ,KAAKN,GAAiBZ,CAAK,GAGnCb,IADU,KAAKd,GAAQ,WACL6C;EACxB,AAAK/B,MAEYA,EAAQ,EAAEgC,OACV7B,KAASoB,KAAevB,EAAQ,EAAE,EAAEhB,EAAW,KAAK,MAAM,eAAeA,EAAW,UAAU,WAC9G,EAAQ,EAAE,EAAEA,EAAW,KAAK,MAAM,aAAaA,EAAW,UAAU,SAGrE,EAAQ,EAAEgD,KAAW7B;CACtB;CAEA,kBAAkB,MAAa;EAE9B,IAAMwB,IAAU,KAAKzC,GAAQ;EAM5B,OAJG+C,IACI,KAAK7B,GAAOuB,EAAQ,QAAO,MAAiBlC,EAAK,EAAE,EAAET,EAAW,KAAK,MAAM,eAAeiD,CAAY,CAAE,IAGxG;GACN,GAAG,KAAK7B,GAAOuB,EAAQ,QAAO,MAAiBlC,EAAK,EAAE,EAAET,EAAW,KAAK,MAAM,eAAeA,EAAW,UAAU,MAAU,CAAE;GAC9H,GAAG,KAAKoB,GAAOuB,EAAQ,QAAO,MAAiBlC,EAAK,EAAE,EAAET,EAAW,KAAK,MAAM,eAAeA,EAAW,UAAU,MAAU,CAAE;GAC9H,GAAG,KAAKoB,GAAOuB,EAAQ,QAAO,MAAiBlC,EAAK,EAAE,EAAET,EAAW,KAAK,MAAM,eAAeA,EAAW,UAAU,MAAU,CAAE;EAC/H;CAEF;CAEA,MAAS,MAAQ;EAChB,IAAI,CAAC+B,GAAK,OAAOA;EAEjB,IAAMmB,IAAW,CAAC,MAAM,QAAQnB,CAAG,GAC7BoB,IAAYD,IAAW,CAACnB,CAAG,IAAIA,GAC/BV,IAAS,KAAK,cAAc,GAE5B+B,IAASD,EAAU,QAAO,MAAK,CAACnB,EAAE,MAAM,OAAO,CAAC,CAAC,KAAI,MAAK;GAC/D,IAAM,IAAI,CAAC;GAKX,OAJAX,EAAO,SAAS,GAAO,MAAM;IAC5B,EAAEP,KAASkB,EAAE,IAAIA,EAAE,EAAEqB,KAAKrB,EAAElB;GAC7B,CAAC,GACD,EAAE,OAAOkB,EAAE,MACJ;EACR,CAAC;EAED,OAAOkB,IAAWE,EAAO,KAAKA;CAC/B;AACD,GC5aaE,IAAb,MAA2B;CAC1B;CAEA,YAAY,GAAM;EA0CjB,AAzCA,KAAKhD,KAAQC,GAEb,KAAK,MAAM,IAAIN,EAAM,IAAI,GACzB,KAAK,OAAO,IAAII,EAAO,KAAKC,IAAO,IAAI,GAEvC,KAAK,aAAa,CAAC,GACnB,KAAK,cAAc,CAAC,GACpB,KAAK,aAAa,CAAC,GACnB,KAAK,UAAU,IAEf,KAAK,YAAY,cAAc;GAC9B,AAAI,KAAKA,GAAM,MAAM,UAAQ,KAAKA,GAAM,KAAK,OAAO;EACrD,GAEA,KAAK,iBAAiB,MAAO;GAO5B,AANI,KAAK,QAAM,KAAK,KAAK,MAAM,GAE/B,KAAK,aAAa,CAAC,GACnB,KAAK,cAAc,CAAC,GACpB,KAAK,aAAa,CAAC,GAEnB,KAAK,KAAK,IAAIiD,KAAM,CAAC,CAAC;EACvB,GAEA,KAAK,eAAe,MAAS;GAC5B,IAAMC,IAAS,SAASC,GAAM,EAAE;GAChC,IAAI,OAAU,KAAK,KAAK,MAAM,IAC9B,OAAO,KAAK,KAAK,aAAa,CAAC,CAACD,EAAO,EAAE,MAAM;EAChD,GAEA,KAAK,uBAAuB,KAAK,IAAI,IACrC,KAAK,kBAAkB,MAAS;GAAE,KAAK,IAAI,KAAKC;EAAM,GAEtD,KAAK,aAAa,GAAQ,MAAU,KAAK,KAAK,IAAIC,GAAQ5C,CAAK,GAE/D,KAAK,aAAa,GAAQ,GAAO,MAAM;GAEtC,AADA,IAAS,SAAS4C,GAAQ,EAAE,GAC5B,KAAK,KAAK,SAASA,GAAQ5C,GAAOrB,CAAC;EACpC,GAGA,KAAK,cAAc,CAAC,CAAC;CACtB;AACD,GC/Ca4B,IAAb,MAAoB;CACnB;CACA,KAAU,CAAC;CAEX,YAAY,GAAM;EAEjB,AADA,KAAKf,KAAQC,GACb,KAAKoD,GAAM;CACZ;CAEA,MAAM;EACL,OAAO,KAAKC,GAAQ,KAAI,MAAKC,EAAE,IAAI;CACpC;CAEA,YAAY;EACX,OAAO,KAAKD;CACb;CAEA,QAAQ,GAAW;EAClB,IAAME,IAAQ,KAAKF,GAAQ,MAAK,MAAKC,EAAE,SAASE,CAAS;EACzD,OAAOD,IAAQA,EAAM,OAAO;CAC7B;CAEA,OAAO,GAAK,IAAO,aAAa;EAM/B,AALA/B,EAAI,SAAQ,MAAS;GACpB,AAAK,KAAK6B,GAAQ,MAAK,MAAKC,EAAE,SAASG,CAAK,KAC3C,KAAKJ,GAAQ,KAAK;IAAE,MAAMI;IAAa;GAAK,CAAC;EAE/C,CAAC,GACD,KAAKC,GAAQ;CACd;CAEA,QAAQ,GAAG;EACV,OAAO,KAAKL,GAAQ,WAAU,MAAKC,EAAE,SAASpE,CAAC;CAChD;CAEA,SAAS,GAAG;EACX,OAAO,KAAKmE,GAAQ,MAAK,MAAKC,EAAE,SAASpE,CAAC;CAC3C;CAEA,WAAgB;EACf,IAAMyE,oBAAM,IAAI,IAAI;EASpB,AARA,KAAKN,GAAQ,SAAQ,MAAK;GACzB,EAAI,IAAIC,EAAE,MAAMA,EAAE,IAAI;EACvB,CAAC,GAED,KAAKD,KAAU,MAAM,KAAKM,IAAM,CAACC,GAAMC,QAAW;GAAE;GAAM;EAAK,EAAE,GAEjE,KAAKR,KAAU,KAAKA,GAAQ,QAAO,MAAKC,EAAE,SAAS,MAAMA,EAAE,SAAS,MAAM,GAE1E,KAAKD,GAAQ,MAAM,GAAG,MAAgBf,EAAE,KAAK,SAASD,EAAE,KAAK,SAAU,IAAI,EAAK;CACjF;CAEA,WAAc;EACb,KAAKgB,KAAU,CAAC;EAEhB,IAAMS,IAAY,MAAM,KAAK,KAAK/D,GAAM,iBAAiB,OAAO,CAAC;EAEjE,IAAK+D,KAAaA,EAAU,WAAW,GAEvC;QAAK,IAAMC,KAAOD,GAiBjB,AAfAC,EAAI,iBAAiB,aAAa,CAAC,CAAC,SAAS,MAAO;IACnD,IAAMP,IAAYtF,EAAG,QAAQ,MACvB8F,IAAY9F,EAAG,aAAa,WAAW,KAAK;IAElD,AAAIsF,KACH,KAAKH,GAAQ,KAAK;KAAE,MAAMG;KAAW,MAAMQ;IAAU,CAAC;GAExD,CAAC,GAQD;IALC;IAAa;IAAoB;IAAS;IAC1C;IAAW;IAAY;IAAiB;IACxC;IAAc;IAAc;GAGrB,CAAC,CAAC,SAAQ,MAAQ;IACzB,EAAI,iBAAiB,IAAIC,EAAK,EAAE,CAAC,CAAC,SAAS,MAAO;KACjD,IAAIC,IAAOhG,EAAG,aAAa+F,CAAI;KAC/B,IAAKC,GAEL;UAAIA,EAAK,QAAQ,OAAO,IAAI,GAAG;OAC9B,IAAMC,IAAYD,EAAK,OAAO,MAAM;OAEpC,IAAIC,IAAY,GACf,IAAI;QACH,IAAO,OAAO,OAAOD,EAAK,UAAU,GAAGC,CAAS,CAAC,CAAC,KAAK,EAAE;OAC1D,QAAY;QACX,IAAO;OACR;MAEF;MAEA,EAAK,MAAM,OAAO,CAAC,CAAC,SAAQ,MAAK;OAChC,IAAIjF,EAAE,KAAK,KAAK,IAAI;QACnB,IAAMiF,IAAYjF,EAAE,OAAO,gBAAgB,GACvCkF,IAAc;QAQlB,AANID,KAAa,IAChB,IAAcjF,EAAE,UAAU,GAAGiF,CAAS,IAC5BD,EAAK,WAAW,OAAO,MACjC,IAAchF,EAAE,QAAQ,SAAS,EAAE,IAGhCkF,KACH,KAAKf,GAAQ,KAAK;SAAE,MAAMe;SAAa,MAAM;QAAS,CAAC;OAEzD;MACD,CAAC;KAjBD;IAkBD,CAAC;GACF,CAAC;GAGF,KAAKV,GAAQ;EAFb;CAGD;AACD,GCrHaW,IAAb,cAAqC,YAAY;CAC7C,cAAc;EACV,MAAM;CACV;CAEA,oBAAoB;EAChB,KAAKjB,GAAM;CACf;CAEA,WAAc,CAEd;AAEJ;AAEK,eAAe,IAAI,mBAAmB,KACvC,eAAe,OAAO,qBAAqBiB,CAAe;;AChB9D,IAAaC,IAAb,cAA2C,YAAY;CACnD;CAEA,cAAc;EACV,MAAM;CACV;CAEA,oBAAoB;EAChB,KAAKlB,GAAM;CACf;CAEA,gBAAgB;EACZ,KAAK,cAAc,YAAY,CAAC,CAAC,YAAY,KAAKrD,GAAM,KAAK,MAAM,CAAC,CAAC,eAAe;CACxF;CAEA,WAAc;EAeV,AAdA,KAAKA,KAAQ,KAAK,YAAY,CAAC,CAAC,MAEhC,KAAKwE,GAAQ,GAEb,KAAK,cAAc,eAAe,CAAC,EAAE,iBAAiB,UAAU,MAAM;GAClE,IAAMC,IAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,UAC5CC,IAAU,EAAE,OAAO,QAAQ,oBAAoB;GAErD,IAAI,CAACA,GAAS;GAEd,IAAMjC,IAAQ,SAASiC,EAAQ,QAAQ,OAAO,EAAE;GAChD,KAAKC,GAAalC,GAAOgC,CAAa;EAC1C,CAAC,GAED,iBAAiB;GACb,KAAKE,GAAa,GAAG,EAAK;EAC9B,CAAC;CACL;CAEA,MAAgB,GAAO,IAAgB,OAAU;EAE7C,IAAMC,UAAwB;GAC1B,IAAMC,IAAS,MAAM,KAAK,KAAK7E,GAAM,WAAW,iBAAiB,kBAAkB,CAAC;GAGpF,MAFwB,KAAK,KAAKA,GAAM,WAAW,iBAAiB,eAAe,CAE3E,CAAC,CAAC,SAAQ,MAAK8E,EAAE,MAAM,YAAY,WAAW,MAAM,CAAC;GAE7D,IAAMC,IAAeF,EAChB,KAAK,GAAO,OAAS;IAAE;IAAO;GAAI,EAAE,CAAC,CACrC,QAAQ,EAAE,eAAYG,EAAM,UAAU,SAAS,QAAQ,CAAC;GAE7D,IAAI,IAAa,SAAS,IAE1B,KAAK,IAAIjC,IAAI,GAAGA,IAAIgC,EAAa,SAAS,GAAG,KAAK;IAC9C,IAAME,IAAaF,EAAahC,EAAE,CAAC,KAE7BmC,IAAiB,KAAKlF,GAAM,WAAW,cAAc,mCAAmCiF,EAAW,GAAG;IAC5G,AAAIC,KACAA,EAAe,MAAM,YAAY,WAAW,EAAE;GAEtD;EACJ,GAEMC,IAAS,KAAK,cAAc,eAAe,GAC3CC,IAAO,KAAKpF,GAAM,WAAW,cAAc,wBAAwB,GACnEqF,IAAWF,EAAO,iBAAiB,oBAAoB,GACvDG,IAAgBF,EAAK,iBAAiB,kBAAkB;EAE9D,IAAI,CAACC,EAAS5C,IAAQ;EAEtB,IAAI,CAACgC,GAKD,AAJAY,EAAS,SAAS,GAAK,MAAQ;GAC3B,EAAI,UAAU5E,MAAQgC,CAAK;EAC/B,CAAC,GAED6C,EAAc,SAAS,GAAO,MAAQ;GAClC,IAAMC,IAAW9E,MAAQgC;GAEzB,AADAuC,EAAM,UAAU,OAAO,UAAUO,CAAQ,GACzC,EAAM,MAAM,OAAOA,IAAW,aAAa;EAC/C,CAAC;OACE;GACH,IAAMC,IAAaH,EAAS5C,IACtBgD,IAAaN,EAAO,iBAAiB,2BAA2B;GAEtE,IAAIK,EAAW,UAAU,SAAS,QAAQ,KAAKC,EAAW,UAAU,GAChE;GAGJ,EAAW,UAAU,OAAO,QAAQ;GACpC,IAAMC,IAAcN,EAAK,cAAc,gCAAgC3C,EAAM,GAAG;GAChF,AAAIiD,MACAA,EAAY,UAAU,OAAO,QAAQ,GAChCA,EAAY,UAAU,SAAS,QAAQ,MACxC,EAAY,MAAM,OAAO;EAGrC;EAEA,IAAMX,IAAeK,EAAK,iBAAiB,yBAAyB;EAYpE,AAVAL,GAAc,SAAQ,MAAS;GAG3B,AAFA,EAAM,MAAM,OAAQA,EAAa,SAAS,IAAK,WAAW,YAEtD,OAAOC,EAAM,iBAAkB,aAC/BA,EAAM,cAAc,IAEpBA,EAAM,aAAa;EAE3B,CAAC,GAEDJ,EAAgB;CACpB;CAEA,KAAU;EAIN,IAAMe,IAHc,MAAM,KAAK,KAAK3F,GAAM,QACd,CAAC,CAAC,QAAO,MAAO7B,EAAG,QAAQ,YAAY,MAAM,OAEhD,CAAC,CAAC,KAAK,GAAO,MAI5B,8BAHWsC,MAAQ,IAAI,WAAW,GAGM,gBAAgBA,EAAI,IAFnDmF,EAAM,aAAa,SAAS,KAAK,SAASnF,IAAM,IAEe,sBAClF,CAAC,CAAC,KAAK,EAAE;EAEV,KAAK,YAAY;wCACekF,EAAS;;;CAG7C;AACJ,GAEaE,IAAb,cAAkC,YAAY;CAC1C,cAAc;EACV,MAAM;CACV;CAEA,oBAAoB,CAEpB;CAEA,UAAU,GAAU;EAChB,KAAK,UAAU,OAAO,UAAUN,CAAQ;CAC5C;AACJ;AAEK,eAAe,IAAI,oBAAoB,KACxC,eAAe,OAAO,sBAAsBM,CAAY,GAGvD,eAAe,IAAI,0BAA0B,KAC9C,eAAe,OAAO,4BAA4BtB,CAAqB;;AChJ3E,IAAauB,IAAb,cAA6B,YAAY;CACrC;CACA;CAEA,oBAAoB;EAGhB,AAFA,KAAK9F,KAAQ,KAAK,YAAY,CAAC,CAAC,MAChC,KAAKwE,GAAQ,GACb,KAAKuB,GAAY;CACrB;CAEA,KAAU;EAiBN,AAhBA,KAAK,YAAY,8sBAejB,KAAKC,KAAmB,KAAK,cAAc,mBAAmB,GAC9D,KAAKC,GAAmB;CAC5B;CAEA,KAAqB;EACjB,IAAMC,IAAW,KAAKlG,GAAM,aAAa,OAAO,MAAM,YAAY,KAAKA,GAAM,UAAU,SAAS,QAAQ,GAClGmG,IAAc,KAAKnG,GAAM,aAAa,cAAc,MAAM,SAC1DoG,IAAW,KAAKpG,GAAM,aAAa,WAAW,MAAM,SACpDqG,IAAU,KAAKrG,GAAM,aAAa,SAAS,KAAK;EAStD,AAPIkG,KAAY,CAACC,IACb,KAAK,aAAa,UAAU,EAAE,IAE9B,KAAK,gBAAgB,QAAQ,GAGjC,KAAK,aAAa,aAAaC,IAAW,SAAS,OAAO,GAC1D,KAAK,cAAcC,CAAO;CAC9B;CAEA,KAAc;EACV,IAAMC,IAAU,KAAK,cAAc,mBAAmB;EACtD,AAAIA,KACAA,EAAQ,iBAAiB,kBAAkB;GACvC,IAAMC,IAAO,yDACPC,IAAiB,KAAKxG,GAAM,aAAa,SAAS,KAAK;GAC7D,EAAQ,YAAYsG,EAAQ,cAAcC,IAAOC,IAAiBD;EACtE,CAAC;EAGL,IAAME,IAAU,KAAK,cAAc,sBAAsB;EACzD,AAAIA,KACAA,EAAQ,iBAAiB,eAAe;GACpC,KAAKzG,GAAM,cAAc,IAAI,YAAY,sBAAsB;IAC3D,SAAS;IACT,UAAU;IACV,QAAQ,EAAE,aAAa,KAAKA,GAAM;GACtC,CAAC,CAAC;EACN,CAAC;CAET;CAEA,iBAAiB,GAAS;EACtB,AAAI,KAAKgG,MACL,KAAKA,GAAiB,OAAOU,CAAO;CAE5C;CAEA,cAAc,GAAM;EAChB,IAAMJ,IAAU,KAAK,cAAc,mBAAmB;EACtD,AAAIA,MAAS,EAAQ,cAAcK;CACvC;AACJ;AAEK,eAAe,IAAI,oBAAoB,KACxC,eAAe,OAAO,sBAAsBb,CAAO;;AChFvD,IAAac,IAAb,cAAyC,YAAY;CACjD;CACA,KAAY;CACZ;CACA;CACA;CACA;CAEA,cAAc;EACV,MAAM;CACV;CAEA,oBAAoB;EAEhB,IADA,KAAKC,KAAS,KAAK,QAAQ,kBAAkB,KAAK,KAAK,YAAY,CAAC,CAAC,MACjE,CAAC,KAAKA,IAAQ;EAElB,KAAK,YAAY;EAMjB,IAAMC,UAAsB;GACxB,IAAM1B,IAAO,KAAKyB,GAAO,cAAc,mCAAmC;GAC1E,AAAKzB,KAKL,KAAK2B,KAAY;IACb,WAAY3B;IACZ,OAAY,KAAK,cAAc,eAAe;IAC9C,OAAY,KAAK,cAAc,eAAe;IAC9C,MAAY,KAAK,cAAc,cAAc;IAC7C,OAAY,KAAK,cAAc,eAAe;GAClD,GAEA,KAAK/B,GAAM,GACX,KAAK2D,GAAe,GACpB,KAAK,QAAQ,KAdT,WAAWF,GAAe,EAAE;EAepC;EAEA,EAAc;CAClB;CAEA,uBAAuB;EACnB,AAAI,KAAKG,MACL,KAAKA,GAAgB,WAAW;CAExC;CAEA,WAAuB;EACnB,IAAI,CAAC,KAAKJ,IAAQ;EAClB,IAAMzB,IAAO,KAAKyB,GAAO,cAAc,mCAAmC;EAC1E,AAAKzB,MAEL,KAAK6B,KAAkB,IAAI,qBAAqB;GAC5C,KAAK,QAAQ;EACjB,CAAC,GACD,KAAKA,GAAgB,QAAQ7B,CAAI;CACrC;CAEA,gBAAgB;EAEZ,IAAI,CAAC,KAAKyB,MAAU,CAAC,KAAKE,MAAa,KAAKG,IAAW;EAEvD,IAAM9B,IAAO,KAAK2B,GAAU,WACtBnB,IAAQR,EAAK,cAAc,OAAO;EACxC,IAAI,CAACQ,GAAO;EAEZ,IAAMuB,IAAQ,KAAKJ,GAAU,OACvBK,IAAQ,KAAKL,GAAU,OAEvBM,IAAYjC,EAAK,aACjBkC,IAAa1B,EAAM,aAEnB2B,IAAgBF,MAAc,KAAKC,IAAaD;EAGtD,IAFA,KAAKR,GAAO,UAAU,OAAO,mBAAmBU,CAAY,GAExD,CAACA,GACD;EAGJ,IAAMC,IAAaL,EAAM;EACzB,IAAIK,KAAc,GAAG;EAErB,IAAMC,IAAa,KAAK,IAAI,KAAK,IAAkBJ,IAAYC,IAA1BE,GAAuCA,CAAU,GAAG,EAAE;EAC3F,EAAM,MAAM,QAAQ,GAAGC,EAAW;EAElC,IAAMC,IAActC,EAAK,YACnBuC,IAAgBL,IAAaD,GAE/BO,IAAI;EAIR,AAHID,IAAgB,MAChB,IAAI,SAAUD,IAAcC,KAAkBH,IAAaC,IAAa,EAAE,IAE1EG,IAAI,MAAG,IAAI;EAEf,IAAMC,IAAeL,IAAaC;EAMlC,AALIG,IAAIC,MAAc,IAAIA,IAE1B,EAAM,MAAM,OAAO,GAAGD,EAAE,KAExB,KAAKb,GAAU,KAAK,WAAYa,MAAM,GACtC,KAAKb,GAAU,MAAM,WAAYa,KAAKC,IAAe;CACzD;CAEA,MAAgB,MAAM;EAClB,IAAI,CAAC,KAAKd,IAAW,OAAO;EAE5B,IAAM3B,IAAO,KAAK2B,GAAU,WACtBnB,IAAQR,EAAK,cAAc,OAAO;EACxC,IAAI,CAACQ,GAAO,OAAO;EAEnB,IAAMkC,IAAa,KAAKf,GAAU,MAAM,sBAAsB,GACxDU,IAAa,KAAKV,GAAU,MAAM,aAEpCgB,IAAUC;EACd,AAAID,IAAU,MAAG,IAAU;EAC3B,IAAMF,IAAeC,EAAW,QAAQL;EAOxC,AANIM,IAAUF,MAAc,IAAUA,IACtC,IAAU,SAASE,GAAS,EAAE,GAE9B,KAAKhB,GAAU,MAAM,MAAM,OAAO,GAAGgB,EAAQ,KAE7C,KAAKhB,GAAU,KAAK,WAAYgB,MAAY,GAC5C,KAAKhB,GAAU,MAAM,WAAYgB,KAAWF,IAAe;EAE3D,IAAMR,IAAYjC,EAAK,aAEjBuC,IADa/B,EAAM,cACUyB;EAOnC,OALIQ,IAAe,KAAKF,IAAgB,MAEpC,EAAK,aADkBI,IAAUF,IAAgBF,IAI7CI,IAAU,KAAKA,IAAUF,IAAe;CACpD;CAEA,WAAc;EACV,IAAMI,KAAe,MAAQ;GAEzB,AADA,cAAc,KAAKC,EAAU,GAC7B,cAAc,KAAKC,EAAU;GAE7B,IAAMC,IAAY,SAAS,KAAKrB,GAAU,MAAM,MAAM,QAAQ,GAAG,EAAE;GAGnE,AAFA,KAAKsB,GAAaD,IAAYE,CAAG,GAEjC,KAAKJ,KAAa,kBAAkB;IAGhC,AAFA,cAAc,KAAKA,EAAU,GAE7B,KAAKC,KAAa,kBAAkB;KAChC,IAAMI,IAAmB,SAAS,KAAKxB,GAAU,MAAM,MAAM,QAAQ,GAAG,EAAE;KAC1E,AAAK,KAAKsB,GAAaE,IAAmBD,CAAG,KACzC,cAAc,KAAKH,EAAU;IAErC,GAAG,EAAE;GACT,GAAG,GAAG;EACV,GAEMK,UAAmB;GAErB,AADA,cAAc,KAAKN,EAAU,GAC7B,cAAc,KAAKC,EAAU;EACjC;EAsBA,AAnBA,CAAC,WAAW,YAAY,CAAC,CAAC,SAAQ,MAAO;GAGrC,AAFA,KAAKpB,GAAU,KAAK,iBAAiB0B,GAAKD,CAAU,GACpD,KAAKzB,GAAU,MAAM,iBAAiB0B,GAAKD,CAAU,GACrD,KAAKzB,GAAU,MAAM,iBAAiB0B,GAAKD,CAAU;EACzD,CAAC,GAED,KAAKzB,GAAU,KAAK,iBAAiB,cAAa,MAAK;GAAE,AAAI2B,EAAE,WAAW,KAAWT,EAAY,GAAG;EAAG,CAAC,GACxG,KAAKlB,GAAU,MAAM,iBAAiB,cAAa,MAAK;GAAE,AAAI2B,EAAE,WAAW,KAAWT,EAAY,EAAE;EAAG,CAAC,GAIxG,KAAKlB,GAAU,MAAM,iBAAiB,cAAa,MAAK;GACpD,IAAI,EAAE,WAAW,GAAG;GACpB,EAAE,eAAe;GACjB,IAAM4B,IAAY,KAAK5B,GAAU,MAAM,sBAAsB,GACvDU,IAAa,KAAKV,GAAU,MAAM;GACxC,KAAKsB,GAAa,EAAE,UAAUM,EAAU,OAAQlB,IAAa,CAAE;EACnE,CAAC,GAED,KAAKV,GAAU,MAAM,iBAAiB,cAAa,MAAK;GACpD,IAAI,EAAE,WAAW,GAAG;GAIpB,AAHA,EAAE,gBAAgB,GAClB,EAAE,eAAe,GACjB,KAAKG,KAAY,IACjB,KAAK,SAAS,EAAE,UAAU,KAAKH,GAAU,MAAM,sBAAsB,CAAC,CAAC;GAEvE,IAAM6B,KAAe,MAAc;IAC/B,IAAI,CAAC,KAAK1B,IAAW;IACrB,IAAMyB,IAAY,KAAK5B,GAAU,MAAM,sBAAsB;IAC7D,KAAKsB,GAAaQ,EAAU,UAAUF,EAAU,OAAO,KAAK,MAAM;GACtE,GAEMG,UAAkB;IAKpB,AAJA,KAAK5B,KAAY,IACjBsB,EAAW,GACX,SAAS,oBAAoB,aAAaI,CAAW,GACrD,SAAS,oBAAoB,WAAWE,CAAS,GACjD,KAAK,QAAQ;GACjB;GAGA,AADA,SAAS,iBAAiB,aAAaF,CAAW,GAClD,SAAS,iBAAiB,WAAWE,CAAS;EAClD,CAAC;CACL;AACJ;AAEK,eAAe,IAAI,uBAAuB,KAC3C,eAAe,OAAO,yBAAyBlC,CAAmB;;ACrNtE,IAAamC,IAAb,cAAyC,YAAY;CACjD;CACA;CACA,KAAY;CACZ;CACA,KAAU;CAEV,KAAiB;CAEjB,cAAc;EACV,MAAM;CACV;CAEA,oBAAoB;EAIhB,AAHA,KAAK/I,KAAQ,KAAK,YAAY,CAAC,CAAC,MAChC,KAAKgJ,KAAS,KAAK,QAAQ,kBAAkB,GAE7C,KAAK,YAAY;EAMjB,IAAMlC,UAAsB;GACxB,IAAM1B,IAAO,KAAK4D,GAAO,cAAc,gBAAgB;GACvD,AAAK5D,KAKL,KAAK2B,KAAY;IACb,WAAW3B;IACX,OAAO,KAAK,cAAc,eAAe;IACzC,OAAO,KAAK,cAAc,eAAe;IACzC,KAAK,KAAK,cAAc,aAAa;IACrC,QAAQ,KAAK,cAAc,gBAAgB;GAC/C,GAEA,KAAK/B,GAAM,GACX,KAAK,QAAQ,KAbT,WAAWyD,GAAe,EAAE;EAcpC;EAEA,EAAc;CAClB;CAEA,WAAsB;EAClB,IAAMmC,IAAc,KAAKD,GAAO,KAAK,SAAS,GACxCE,IAAaD,IAAcA,EAAY,SAAS,GAEhDE,IAAe,KAAKH,GAAO,UAAU,cACvCI,IAAmBD,KAAe,WAAWA,EAAa,MAAM,MAAM,KAAK;EAE/E,CAAI,CAACC,KAAoBA,KAAoB,OAEzC,AAIIA,IALc,KAAKJ,GAAO,aAAa,cAAc,2BAA2B,KACnE,KAAKA,GAAO,aACL,KAAK,eAAe,KAAK,eAAgB,KAAK,eAAgBE,IAAa,KAG5EA,KADD,KAAKF,GAAO,aAAa,KAAK;EAKxD,IAAMK,IAAqB,MACrBC,IAAaF,IAAmBC,GAElCE,IAAc,GACdC,IAAgBJ;EAOpB,OALIE,MACA,IAAcD,IAAqBD,GACnC,IAAgBC,IAGb;GAAE;GAAkB;GAAe;GAAa;GAAY;EAAW;CAClF;CAGA,gBAAgB;EAGZ,IAFI,KAAKnC,MAEL,CAAC,KAAK8B,MAAU,CAAC,KAAKA,GAAO,YAAY,CAAC,KAAKjC,IAAW;EAE9D,IAAM3B,IAAO,KAAK2B,GAAU,WACtBI,IAAQ,KAAKJ,GAAU,OACvBK,IAAQ,KAAKL,GAAU,OACvB,EAAE,qBAAkB,KAAK0C,GAAc,GAEvCC,KAAe,KAAKV,GAAO,cAAc,OAAO,CAAC,EAAE,gBAAgB,MACpE,KAAKA,GAAO,cAAc,OAAO,CAAC,EAAE,gBAAgB,MACpD,KAAKA,GAAO,cAAc,YAAY,CAAC,EAAE,gBAAgB,IAExDW,IAAc,KAAKX,GAAO,cAAc,gBAAgB,CAAC,CAAC,gBAAgB,GAC1EY,IAAaD,IAAaD,GAG1BR,IADc,KAAKF,GAAO,KAAK,SACR,CAAC,CAAC,QAEzBI,IAAmB,KAAKJ,GAAO,aAAa,IAAIE,GAEhDW,IAAgBT,IAAmBQ;EAIzC,IAFA,KAAKZ,GAAO,UAAU,OAAO,mBAAmBa,CAAY,GAExD,CAACA,GACD;EAGJ,IAAMC,IAAc3C,EAAM;EAC1B,IAAI2C,KAAe,GAAG;EAEtB,IAAMC,IAAc,KAAK,IAAI,KAAK,IAAmBJ,IAAaP,IAA5BU,GAA+CA,CAAW,GAAG,EAAE;EACrG,EAAM,MAAM,SAAS,GAAGC,EAAY;EAEpC,IAAMC,IAAmB5E,EAAK,WACxB6E,IAAe,KAAK,IAAIT,IAAgB,KAAKR,GAAO,WAAW,aAAa,GAAG,CAAC,GAElFkB,IAAW;EACf,AAAID,IAAe,MACf,IAAYD,IAAmBC,KAAiBH,IAAcC;EAGlE,IAAMI,IAAcL,IAAcC;EAOlC,AANIG,IAAW,MAAG,IAAW,IACzBA,IAAWC,MAAa,IAAWA,IAEvC,EAAM,MAAM,MAAM,GAAGD,EAAS,KAE9B,KAAKnD,GAAU,IAAI,WAAYiD,KAAoB,GACnD,KAAKjD,GAAU,OAAO,WAAYiD,KAAoBC,IAAe;CACzE;CAEA,WAAc;EA6DV,AA3DA,KAAKlD,GAAU,MAAM,iBAAiB,cAAc,MAAM;GACtD,IAAI,EAAE,WAAW,GAAG;GAMpB,AALA,EAAE,gBAAgB,GAClB,EAAE,eAAe,GACjB,KAAKG,KAAY,IAEjB,KAAKkD,KAAU,EAAE,SACjB,KAAKC,KAAiB,WAAW,KAAKtD,GAAU,MAAM,MAAM,GAAG,KAAK;GAIpE,IAAMoD,IAHY,KAAKpD,GAAU,MAAM,sBACX,CAAC,CAAC,SACV,KAAKA,GAAU,MAAM,cAGnC6B,KAAe,MAAc;IAE/B,IADI,CAAC,KAAK1B,MACNiD,KAAe,GAAG;IAGtB,IAAMG,IAASzB,EAAU,UAAU,KAAKuB,IACpCG,IAAiB,KAAKF,KAAiBC;IAK3C,AAHIC,IAAiB,MAAG,IAAiB,IACrCA,IAAiBJ,MAAa,IAAiBA,IAEnD,KAAKpD,GAAU,MAAM,MAAM,MAAM,GAAGwD,EAAe;IAEnD,IAAMC,IAAQD,IAAiBJ,GAEzBM,IAAW,KAAKzB,GAAO,aAAa,GACpCY,KAAc,KAAKZ,GAAO,cAAc,gBAAgB,CAAC,CAAC,gBAAgB,MAC3E,KAAKA,GAAO,SAAS,KAAK,OAAO,gBAAgB,MACjD,KAAKA,GAAO,SAAS,KAAK,OAAO,gBAAgB,MACjD,KAAKA,GAAO,SAAS,KAAK,MAAM,KAAK,gBAAgB,IAEpD0B,IAAkB,KAAK,MAAMd,IAAaa,CAAS,GAEnD,EAAE,kBAAe,KAAKhB,GAAc,GACpCkB,IAAY,KAAK,MAAMH,KAAStB,IAAawB,IAAkB,EAAE;IAEvE,KAAK1B,GAAO,WAAW,gBAAgB2B,CAAS;IAEhD,IAAM,EAAE,qBAAkB,qBAAkB,KAAKlB,GAAc,GACzDO,IAAmB,KAAKjD,GAAU,UAAU,WAC5CkD,IAAe,KAAK,IAAIT,IAAgB,KAAKR,GAAO,WAAW,aAAa,GAAG,CAAC;IAGtF,AADA,KAAKjC,GAAU,IAAI,WAAYiD,KAAoB,GACnD,KAAKjD,GAAU,OAAO,WAAYiD,KAAoBC,IAAe;GACzE,GAEMnB,UAAkB;IAGpB,AAFA,KAAK5B,KAAY,IACjB,SAAS,oBAAoB,aAAa0B,CAAW,GACrD,SAAS,oBAAoB,WAAWE,CAAS;GACrD;GAGA,AADA,SAAS,iBAAiB,aAAaF,CAAW,GAClD,SAAS,iBAAiB,WAAWE,CAAS;EAClD,CAAC,GAED,KAAK/B,GAAU,MAAM,iBAAiB,cAAc,MAAM;GACtD,IAAI,EAAE,WAAW,KAAK,EAAE,WAAW,KAAKA,GAAU,OAAO;GACzD,IAAM4B,IAAY,KAAK5B,GAAU,MAAM,sBAAsB,GACvDgD,IAAc,KAAKhD,GAAU,MAAM,cAEnCoD,IADc,KAAKpD,GAAU,MAAM,eACPgD;GAElC,IAAII,IAAc,GAAG;IACjB,IAAMS,IAAS,EAAE,UAAUjC,EAAU,MAAOoB,IAAc,GACpDS,IAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGI,IAAST,CAAW,CAAC,GAErD,EAAE,kBAAe,KAAKV,GAAc,GACpCkB,IAAY,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,MAAMH,KAAStB,IAAa,EAAE,GAAGA,IAAa,CAAC,CAAC;IAG5F,AAAIyB,KAAa,KAAK,KAAK3B,GAAO,cAAc,OAAO,KAAKA,GAAO,WAAW,mBAAoB,cAC9F,KAAKA,GAAO,WAAW,gBAAgB2B,GAAW,KAAK;GAE/D;GACA,KAAK,QAAQ;EACjB,CAAC;EAED,IAAIE,IAAiB,MAEfC,KAAyB,MAAc;GACzC,IAAID,GAAgB;GAEpB,IAAME,UAAmB;IACrB,IAAMC,IAAW,KAAKhC,GAAO,cAAc,eAAe;IAM1D,IAJI,CAACgC,KAAYA,EAAS,QAAQ,QAAQ,KAAA,KAItCC,MAAc,UAAU,KAAKjC,GAAO,UAAU,GAC9C;IAGJ,IAAMkC,IAAa,SAASF,EAAS,QAAQ,KAAK,EAAE,GAC9CL,IAAYM,MAAc,SAASC,IAAW,IAAI,KAAK,IAAI,GAAGA,IAAW,CAAC;IAEhF,KAAKlC,GAAO,WAAW,gBAAgB2B,GAAW,YAAY;KAC1D,KAAK,QAAQ;IACjB,CAAC;GACL;GAGA,AADAI,EAAW,GACX,IAAiB,YAAYA,GAAY,GAAG;EAChD,GAEMI,UAA6B;GAC/B,AAEIN,OADA,cAAcA,CAAc,GACX;EAEzB;EAcA,AAZA,KAAK9D,GAAU,IAAI,iBAAiB,cAAc,MAAM;GACpD,AAAI,EAAE,WAAW,KACjB+D,EAAsB,IAAI;EAC9B,CAAC,GAED,KAAK/D,GAAU,OAAO,iBAAiB,cAAc,MAAM;GACvD,AAAI,EAAE,WAAW,KACjB+D,EAAsB,MAAM;EAChC,CAAC,GAED,SAAS,iBAAiB,WAAWK,CAAoB,GACzD,KAAKpE,GAAU,IAAI,iBAAiB,cAAcoE,CAAoB,GACtE,KAAKpE,GAAU,OAAO,iBAAiB,cAAcoE,CAAoB;CAC7E;AACJ;AAEK,eAAe,IAAI,uBAAuB,KAC3C,eAAe,OAAO,yBAAyBpC,CAAmB;;AC3QtE,IAAanL,IAAY;CACxB,IAAI;CACJ,OAAO;CACP,MAAM;CACN,UAAU;AACX,GAEayN,IAAb,MAA6B;CAC5B;CACA;CACA,KAAgB,CAAC;CACjB,qBAAY,IAAI,IAAI;CACpB,KAAc;CAEd,YAAY,GAAO;EAElB,AADA,KAAKrC,KAAShE,GACd,KAAKhF,KAAQ,KAAKgJ,GAAO,YAAY,CAAC,CAAC;CACxC;CAEA,IAAI,UAAU;EACb,OAAO,KAAKsC;CACb;CAEA,IAAI,WAAW;EACd,OAAO,KAAKC;CACb;CAEA,mBAAmB;EAClB,IAAIC,IAAe,CAAC,GACdC,IAAc,KAAKzC,GAAO;EAUhC,AATIyC,KACHA,EAAY,iBAAiB,6BAA2B,CAAC,CAAC,SAAS,MAAQ;GAC1E,IAAMC,IAAOC,EAAI,cAAc,sBAAoB;GACnD,AAAID,KAAQA,EAAM,QAAQ,QACzBF,EAAa,KAAKE,EAAM,QAAQ,IAAI;EAEtC,CAAC,GAGF,KAAKJ,KAAgBE;CACtB;CAEA,QAAQ;EAEP,IAAI,KAAKI,IAAa;EACtB,KAAKA,KAAc;EAEnB,IAAIJ,IAAe,CAAC,GACdC,IAAc,KAAKzC,GAAO;EAchC,AAbIyC,KACHA,EAAY,iBAAiB,6BAA2B,CAAC,CAAC,SAAS,MAAQ;GAC1E,IAAMC,IAAOC,EAAI,cAAc,sBAAoB;GACnD,AAAID,KAAQA,EAAM,QAAQ,QACzBF,EAAa,KAAKE,EAAM,QAAQ,IAAI;EAEtC,CAAC,GAGF,KAAKJ,KAAgBE,GAErB,KAAKI,KAAc,IACnB,KAAK5C,GAAO,UAAU,CAAC,GACvB,KAAKA,GAAO,KAAK,QAAQ;CAC1B;CAEA,QAAQ;EAKP,AAJA,KAAKsC,KAAgB,CAAC,GACtB,KAAKC,GAAU,MAAM,GACrB,KAAKK,KAAc,IACnB,KAAK5C,GAAO,UAAU,CAAC,GACvB,KAAKA,GAAO,KAAK,QAAQ;CAC1B;CAEA,YAAY,GAAK;EAChB,KAAKuC,KAAY3H;CAClB;CAEA,kBAAkB,GAAS;EAC1B,OAAO,KAAK2H,GAAU,IAAIM,CAAO,KAAK,CAAC;CACxC;CAEA,mBAAmB,GAAS;EAC3B,IAAMC,IAAS,KAAK,kBAAkBD,CAAO,GACvCE,IAAc,KAAK/L,GAAM;EAC/B,OAAO8L,EAAO,KAAI,MAASC,EAAY,SAASxK,CAAK,CAAC,CAAC,CAAC,OAAO,OAAO;CACvE;AACD,GAEayK,IAAb,MAAaA,EAAS;CAErB,OAAO,MAAM,GAAY,IAAe,CAAC,GAAG,IAAS,CAAC,GAAG;EACxD,IAAI,CAACR,KAAgBA,EAAa,WAAW,GAC5C,OAAO;GAAE,SAAS,CAAC;GAAG,aAAa,CAAC;GAAG,0BAAU,IAAI,IAAI;EAAE;EAG5D,IAAMS,IAAWC,EAAW,QAAO,MAAK,CAACxK,EAAE,MAAM,OAAO,GAClDyK,oBAAW,IAAI,IAAI,GAEnBC,IAAaJ,EAASK,GAAgBJ,GAAUT,GAAczK,CAAM,GACpEuL,IAAa,CAAC,GACdC,IAAc,CAAC;EAIrB,OAFAP,EAASQ,GAAaJ,GAAY,GAAGZ,GAAcc,GAAYC,GAAaJ,GAAU,EAAE,GAEjF;GAAE,SAASG;GAAY;GAAa;EAAS;CACrD;CAEA,OAAOE,GAAa,GAAY,GAAO,GAAc,GAAW,GAAa,GAAU,GAAU;EAChG,IAAIC,IAAU,GACRC,IAAeC,MAAUnB,EAAa,SAAS;EAErD,KAAK,IAAI,CAACoB,GAAUC,MAAoBC,EAAW,QAAQ,GAAG;GAC7D,IAAMjB,IAAUkB,IAAW,GAAGA,EAAS,GAAG,QAAc,KAAK,OAEvDjB,IAASE,EAASgB,GAAmBH,CAAe;GAC1D,EAAS,IAAIhB,GAASC,CAAM;GAE5B,IAAMmB,IAAc,CAAC;GAiBrB,AAhBA,EAAYrP,EAAU,MAAMiO,GAC5B,EAAYjO,EAAU,SAAS+O,GAC/B,EAAY/O,EAAU,QAAQgP,GAC9B,EAAYhP,EAAU,YAAYkO,GAElC,EAAY,kBAAkB,IAC9B,EAAY,YAAYD,GAExBqB,EAAU,KAAKD,CAAW,GAE1BV,EAAY,KAAK;IAChB,MAAM;IACN,QAAQU;IACC;GACV,CAAC,GAEG,CAACP,KAAeG,aAA2B,MAC9Cb,EAASQ,GAAaK,GAAiBF,IAAQ,GAAGnB,GAAc0B,GAAWX,GAAaJ,GAAUN,CAAO,IAGzGG,EAD6BmB,GAAoBN,CACvC,CAAC,CAAC,SAAQ,MAAU;IAK7B,AAJA,EAAO,kBAAkB,IACzB,EAAO,YAAYhB,GACnBqB,EAAU,KAAKtL,CAAM,GAErB2K,EAAY,KAAK;KAChB,MAAM;KACE;KACC;IACV,CAAC;GACF,CAAC;EAEH;CACD;CAEA,OAAOF,GAAgB,GAAS,GAAc,GAAQ;EACrD,IAAMzL,IAAWG,EAAO,QAAQyK,EAAa,EAAE,GACzC4B,IAAgB5B,EAAa,MAAM,CAAC,GACpC5H,oBAAM,IAAI,IAAI;EAQpB,IANAvB,EAAQ,SAAQ,MAAU;GACzB,IAAMgL,IAAMzM,KAAY,IAAIgB,EAAO,EAAEhB,KAAY;GAEjD,AADKgD,EAAI,IAAIyJ,CAAG,KAAGzJ,EAAI,IAAIyJ,GAAK,CAAC,CAAC,GAClCzJ,EAAI,IAAIyJ,CAAG,CAAC,CAAC,KAAKzL,CAAM;EACzB,CAAC,GAEGwL,EAAc,SAAS,GAAG;GAC7B,IAAMtK,oBAAS,IAAI,IAAI;GACvB,KAAK,IAAI,CAACuK,GAAKC,MAAe1J,EAAI,QAAQ,GACzC,EAAO,IAAIyJ,GAAKrB,EAASK,GAAgBiB,GAAYF,GAAerM,CAAM,CAAC;GAE5E,OAAO+B;EACR;EACA,OAAOc;CACR;CAEA,OAAOoJ,GAAmB,GAAiB;EAC1C,IAAIlB,IAAS,CAAC;EACd,IAAIe,aAA2B,KAC9B,KAAK,IAAIU,KAAUV,EAAgB,OAAO,GACzC,IAASf,EAAO,OAAOE,EAASgB,GAAmBO,CAAM,CAAC;OAErD,AAAI,MAAM,QAAQV,CAAe,MACvC,IAASf,EAAO,OAAOe,EAAgB,KAAI,MAAKW,EAAE,MAAM,SAASA,EAAE,GAAG,IAAI,EAAE,CAAC;EAE9E,OAAO1B;CACR;CAEA,OAAOqB,GAAoB,GAAiB;EAC3C,IAAI9K,IAAU,CAAC;EACf,IAAIwK,aAA2B,KAC9B,KAAK,IAAIU,KAAUV,EAAgB,OAAO,GACzC,IAAUxK,EAAQ,OAAO2J,EAASmB,GAAoBI,CAAM,CAAC;OAExD,AAAI,MAAM,QAAQV,CAAe,MACvC,IAAUxK,EAAQ,OAAOwK,CAAe;EAEzC,OAAOxK;CACR;AACD,GCnMaoL,IAAb,MAAwB;CACpB,KAAoB;CAEpB;CACA;CACA;CAEA,qBAAsB,IAAI,IAAI;CAE9B,KAAkB;CAClB,KAAe;CACf;CAEA,KAAwB;CACxB,KAAa;CAEb,YAAY,GAAO;EAIf,AAHA,KAAKzN,KAAQgF,EAAM,YAAY,CAAC,CAAC,MACjC,KAAKgE,KAAShE,GAEd,KAAK0I,GAAoB;CAC7B;CAEA,eAAe;EACX,OAAO,KAAK1E,GAAO,SAAS;CAChC;CAEA,WAAW,IAAQ,OAAU;EAEzB,IAAI,CAAC,KAAKA,GAAO,UAAU,SAAS,QAAQ,GAAG;EAE/C,IAAM2E,IAAe,KAAK3E,GAAO,cAAc,gBAAgB;EAC/D,AAAK2E,OAEoB,CAAC,KAAK3E,GAAO,SAAS,UAAU,KAAKA,GAAO,SAAS,UAAU,OAGpF,KAAK4E,GAAuB,GACxB,KAAK5E,GAAO,SAAS,UAAU,KAAKA,GAAO,SAAS,SAAS,KAC7D,KAAK6E,GAAqB,IAKlC,KAAKC,GAAcH,EAAa,WAAWI,CAAK,GAEhD,KAAK/E,GAAO,cAAc,uBAAuB,CAAC,EAAE,QAAQ;CAChE;CAEA,MAAiB,GAAW,IAAQ,OAAU;EAE1C,IAAI,KAAKgF,IAAY;GACjB,KAAKC,GAAqBC,GAAWH,CAAK;GAC1C;EACJ;EAEA,IAAMtD,IAAY,KAAKzB,GAAO,SAAS;EACvC,IAAI,CAACyB,KAAaA,KAAa,GAAG;EAElC,IAAMxB,IAAc,KAAKD,GAAO,KAAK,SAAS,GACxCE,IAAaD,EAAY;EAE/B,IAAIC,MAAe,GAAG;GAClB,KAAKF,GAAO,SAAS,aAAa,MAAM,SAAS;GACjD;EACJ;EAEA,IAAMU,KAAe,KAAKV,GAAO,SAAS,KAAK,OAAO,gBAAgB,MACjE,KAAKA,GAAO,SAAS,KAAK,OAAO,gBAAgB,KAClD,KAAKA,GAAO,SAAS,KAAK,MAAM,KAAK,cAEnCY,IAAa,KAAKZ,GAAO,cAAc,gBAAgB,CAAC,CAAC,gBAAgB,GACzEmF,IAAwB,KAAK,IAAIjF,IAAauB,KAAab,IAAaF,IAAce,KAAaA,GAAW,CAAC,GAE/GpB,IAAqB,MACrBC,IAAa6E,IAAwB9E,GAEvCE,IAAc,GACd6E,IAAqBD;EAQzB,AANI7E,MACA,IAAcD,IAAqB8E,GACnC,IAAqB9E,IAIzB,KAAKL,GAAO,SAAS,aAAa,MAAM,SAAS,GAAGoF,EAAmB;EAEvE,IAAMC,IAAkB/E,IAAc4E,IAAY3E,IAAe2E,GAE3DI,IAAgB,KAAK,IAAI,GAAGpF,IAAa,CAAC,GAC1CqF,IAAmB,KAAK,IAAIF,GAAiBF,CAAqB,GAClEK,IAAa,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,MAAMD,IAAmB9D,CAAS,GAAG6D,CAAa,CAAC;EAUhG,KAAKtF,GAAO,SAAS,KAAK,MAAM,KAAK,MAAM,YACvC,KAAKA,GAAO,SAAS,KAAK,MAAM,KAAK,MAAM,YACvC,KAAKA,GAAO,SAAS,MAAM,MAAM,KAAK,MAAM,YAAY,qBAAqBuF,IAAmB9D,EAAU;EAGlH,IAAMgE,IAAU,KAAKC,GAAS,SACxBC,IAAoBF,KAAWA,EAAQ,QAAQ,QAAQ,KAAA,IAAY,SAASA,EAAQ,QAAQ,KAAK,EAAE,IAAI;EAE7G,CAAKV,KAASY,MAAsBH,OAIpC;GACI,KAAKxF,GAAO,SAAS,KAAK,MAAM;GAChC,KAAKA,GAAO,SAAS,KAAK,MAAM;GAChC,KAAKA,GAAO,SAAS,MAAM,MAAM;EACrC,CAAC,CAAC,SAAS,GAAQ,MAAa;GAC5B,AAAK4F,KAILA,EAFoB,iBAAiB,eAElC,CAAC,CAAC,SAAS,GAAK,MAAU;IACzB,IAAMC,IAAYL,IAAa,KAAK,MAAM/L,IAAQ,KAAKuG,GAAO,SAAS,MAAM;IAE7E,IAAI6F,KAAa3F,GAAY;KAIzB,AAHA,EAAI,MAAM,UAAU,QACpB,EAAI,QAAQ,YAAY,MACxB,EAAI,QAAQ,MAAM,MAClB,EAAI,QAAQ,QAAQ;KACpB;IACJ;IAEA,IAAMtH,IAASqH,EAAY4F;IAE3B,IAAI,CAACjN,GAAQ;KACT,EAAI,MAAM,UAAU;KACpB;IACJ;IAEA,IAAML,IAAQK,EAAO,EAAE,EAAElC,EAAW,KAAK,MAAM;IAI/C,AAFA,EAAI,MAAM,UAAU,IAEpB,KAAKoP,GAAanD,GAAK/J,GAAQL,GAAOsN,CAAS;GACnD,CAAC;EACL,CAAC,GAED,KAAK7F,GAAO,UAAU,QAAQ;CAClC;CAGA,MAAwB,GAAW,IAAQ,OAAU;EAEjD,IAAM+F,IAAiB,KAAK/F,GAAO,KAAK,SAAS,KAAK,CAAC,GACjDgG,IAAoBD,EAAe;EAEzC,IAAIC,MAAsB,GAAG;GACzB,KAAKhG,GAAO,SAAS,aAAa,MAAM,SAAS;GACjD;EACJ;EAGA,IAAMiG,IAAc,KAAKjG,GAAO,cAAc,uCAAuC,GAC/EkG,IAAiB,KAAKlG,GAAO,kBAAkB,GAE/CmG,KAAiB,MAAS;GAC5B,IAAIhP,EAAK,SAAS,SAAS;IACvB,IAAMwM,IAAQxM,EAAK,OAAOtC,EAAU,UAAU;IAE9C,OADoB,KAAKmL,GAAO,SAAS,OAAO2D,MAAU,KAAK3D,GAAO,SAAS,SAASkG;GAE5F;GAAO;IACH,IAAIE,IAAiB,GACfF,IAAiB,KAAKlG,GAAO,kBAAkB,GAEjDqG,IAAoB;IACxB,KAAI,IAAItM,IAAI,GAAGA,IAAImM,IAAiB,GAAG,KACnC,KAAqB,KAAKlG,GAAO,SAAS,QAAQjG,MAAM;IAI5D,OAFA,IAAiB,KAAKiG,GAAO,SAAS,SAASqG,GAExCD,IAAiB,IAAIA,IAAiB,KAAKpG,GAAO,SAAS;GACtE;EACJ,GAGIoF,IAAqB,GACnBkB,IAAkB,MAAMN,CAAiB;EAC/C,KAAK,IAAIjM,IAAI,GAAGA,IAAIiM,GAAmB,KAAK;GACxC,IAAM9P,IAAIiQ,EAAcJ,EAAehM,EAAE;GAEzC,AADA,EAAYA,KAAK7D,GACjB,KAAsBA;EAC1B;EAEA,KAAK8J,GAAO,SAAS,aAAa,MAAM,SAAS,GAAGoF,EAAmB;EAEvE,IAAMmB,IAAuB,KAAKvG,GAAO,cAErCwG,IAAoB,GACpBhB,IAAa;EAEjB,KAAK,IAAIzL,IAAI,GAAGA,IAAIiM,GAAmB,KAAK;GACxC,IAAM9P,IAAIoQ,EAAYvM;GACtB,IAAIyM,IAAoBtQ,IAAIgP,GAAW;IACnC,IAAanL;IACb;GACJ;GAEA,AADA,KAAqB7D,GACrB,IAAa6D;EACjB;EAEA,IAAM0M,IAAUvB,IAAYsB;EAC5B,AAAIP,KACAA,EAAY,iBAAiB,OAAO,CAAC,CAAC,SAAS,MAAW;GACtD,EAAO,MAAM,MAAM,IAAI,KAAK,IAAI,GAAGQ,CAAO,EAAE;EAChD,CAAC;EAGL,IAAMhB,IAAU,KAAKC,GAAS,SACxBC,IAAoBF,KAAWA,EAAQ,QAAQ,iBAAiB,KAAA,IAChE,SAASA,EAAQ,QAAQ,cAAc,EAAE,IACzC;EAEN,IAAI,CAACV,KAASY,MAAsBH,GAChC;EAGJ,IAAMkB,IAAmB,KAAK,KAAKH,KAAwB,KAAKvG,GAAO,SAAS,SAASkG,EAAe,GAClGS,KAAiB,KAAK3G,GAAO,SAAS,SAAS,UAAU,KAAK,IAC9D4G,IAAcpB,GACdqB,IAAY,KAAK,IAAIb,GAAmBR,IAAakB,IAAmBC,CAAa,GACrFG,IAAgBf,EAAe,MAAMa,GAAaC,CAAS;EAmEjE,AAjEA;GAAC;GAAsB;GAAsB;EAAqB,CAAC,CAAC,SAAQ,MAAY;GACpF,IAAME,IAAY,KAAK/G,GAAO,cAAc,kBAAkBgH,GAAU;GACxE,IAAI,CAACD,GAAW;GAEhB,IAAME,IAAM,MAAM,KAAKF,EAAU,iBAAiB,eAAe,CAAC;GAElE,KAAK,IAAIhN,IAAI,GAAGA,IAAIkN,EAAI,QAAQ,KAAKf,GAAgB;IACjD,IAAMgB,IAAY,KAAK,MAAMnN,IAAImM,CAAc,GACzC/O,IAAO2P,EAAcI,IACrBC,IAAWF,EAAI,MAAMlN,GAAGA,IAAImM,CAAc;IAEhD,IAAI,CAAC/O,KAAQ+P,KAAaJ,EAAc,QAAQ;KAC5C,EAAS,SAAQ,MAAM;MAInB,AAHA,EAAG,MAAM,UAAU,QACnB,EAAG,QAAQ,YAAY,MACvB,EAAG,QAAQ,MAAM,MACjB,EAAG,QAAQ,QAAQ;KACvB,CAAC;KACD;IACJ;IAEA,IAAMjB,IAAYL,IAAa0B;IAE/B,EAAS,SAAS,GAAI,MAAW;KAC7B,IAAME,IAAe5B,IAAa0B;KAElC,AADA,EAAG,QAAQ,eAAeE,GAC1B,EAAG,QAAQ,MAAOjQ,EAAK,SAAS,SAAU0O,IAAY;KAEtD,IAAMwB,IAAYC,EAAG,aAAa,UAAU,MAAM;KAElD,IAAInQ,EAAK,SAAS,SACd,AAAIkQ,KAEIE,MADUpQ,EAAK,OAAOtC,EAAU,UAEhC,EAAG,MAAM,UAAU,IACnB,KAAK2S,GAAkBF,GAAIvB,GAAgB5O,EAAK,QAAQiQ,CAAY,MAQxE,EAAG,MAAM,UAAU,QACnB,EAAG,QAAQ,YAAY,MACvB,EAAG,QAAQ,MAAM,MACjB,EAAG,QAAQ,QAAQ;UAGvB,IAAIC,GAIA,AAHA,EAAG,MAAM,UAAU,QACnB,EAAG,QAAQ,YAAY,MACvB,EAAG,QAAQ,MAAM,MACjB,EAAG,QAAQ,QAAQ;UAChB;MACH,EAAG,MAAM,UAAU;MAEnB,IAAM9O,IAAQpB,EAAK,OAAO,GAAG,SAAS;MACtC,KAAK2O,GAAawB,GAAInQ,EAAK,QAAQoB,GAAO6O,CAAY;KAC1D;IAER,CAAC;GACL;EACJ,CAAC,GAED,KAAKpH,GAAO,UAAU,QAAQ;CAClC;CAEA,MAAqB,GAAK,GAAgB,GAAa,MAAiB;EACpE,IAAMkG,IAAiB,KAAKlG,GAAO,kBAAkB,GAC/CyH,IAAc,SAAS9E,EAAI,QAAQ,QAAQ,EAAE,KAAK,GAClD+E,IAAaN,IAAelB,IAAkBuB,GAE9CE,IAAU1D,EAAYpP,EAAU,WAChC+S,IAAa,KAAK5Q,GAAM,KAAK,SAAS,GACtC6Q,IAAkBF,IAAUA,EAAQ,KAAI,MAAOC,EAAWnQ,EAAI,CAAC,CAAC,OAAO,OAAO,IAAI,CAAC;EAUzF,AAPA,EAAI,QAAQ,eAAe2P,GAC3B,EAAI,QAAQ,MAAM,IAClB,EAAI,QAAQ,YAAYM,GACxB,EAAI,OAAOG,GACX,EAAI,QAAQ,UAAU5D,EAAYpP,EAAU,KAG5C,MAAM,KAAK8N,EAAI,KAAK,CAAC,CAAC,SAAS,MAAU;GAErC,EAAM,QAAQ,MAAMyE;GAEpB,IAAMU,IAAa,MAAM,KAAKpF,EAAM,QAAQ,CAAC,CAAC,MAAK,MAC/CqF,EAAI,QAAQ,YAAY,CAAC,CAAC,WAAW,OAAO,KAAK,OAAOA,EAAI,WAAY,UAC5E;GAGA,AAAID,MAAe,KAAA,KAAa,OAAOA,EAAW,WAAY,cAC1DA,GAAY,QAAQ;EAE5B,CAAC;CACL;CAEA,MAAgB,GAAK,GAAQ,GAAO,MAAc;EAC9C,IAAM5B,IAAiB,KAAKlG,GAAO,kBAAkB,GAC/CyH,IAAc,SAAS9E,EAAI,QAAQ,QAAQ,EAAE,KAAK,GAClD+E,IAAa7B,IAAYK,IAAkBuB;EAOjD,AALA,EAAI,QAAQ,QAAQ5B,GACpB,EAAI,QAAQ,MAAMtN,GAClB,EAAI,QAAQ,YAAYmP,GACxB,EAAI,OAAO9O,GAEX,MAAM,KAAK+J,EAAI,KAAK,CAAC,CAAC,SAAS,MAAU;GAQrC,AAPA,EAAM,QAAQ,QAAQkD,GACtB,EAAM,QAAQ,MAAMtN,GAMpB,MAJyB,KAAKmK,EAAM,QAAQ,CAAC,CAAC,MAAK,MAC/CqF,EAAI,QAAQ,YAAY,CAAC,CAAC,WAAW,OAAO,KAAK,OAAOA,EAAI,WAAY,UAGnE,CAAC,EAAE,QAAQ;EACxB,CAAC;CACL;CAEA,mBAAmB;EAYf,AAVA,KAAK/C,KAAa,OAAKhF,GAAO,YAAY,cAAc,2BAA2B,GAGnF,KAAKgI,GAAoB,MAAM,GAE/B,KAAKtC,KAAW;GACZ,cAAc,KAAK1F,GAAO,iBAAiB,sBAAsB;GACjE,SAAS,KAAKA,GAAO,cAAc,iDAAiD;EACxF,GAEA;GAAC;GAAsB;GAAsB;EAAqB,CAAC,CAAC,SAAQ,MAAY;GACpF,IAAM+G,IAAY,KAAK/G,GAAO,cAAc,kBAAkBgH,GAAU;GACxE,IAAI,CAACD,GAAW;GAEhB,IAAMkB,IAAUlB,EAAU,cAAc,OAAO;GAC/C,IAAI,CAACkB,GAAS;GAEd,IAAMC,IAAQD,EAAQ,cAAc,YAAY;GAChD,IAAI,CAACC,GAAO;GAGZ,IAAMC,IADM,MAAM,KAAKD,EAAM,iBAAiB,IAAI,CAC5B,CAAC,CAAC,KAAI,MAAMZ,EAAG,UAAU,EAAI,CAAC;GACpD,KAAKU,GAAoB,IAAIhB,GAAUmB,CAAW;EACtD,CAAC;EAED,IAAMxD,IAAe,KAAK3E,GAAO,cAAc,gBAAgB;EAE/D,AAAI2E,MACA,KAAKyD,KAAezD,EAAa,cAGjC,KAAKC,GAAuB,GAC5B,KAAKC,GAAqB,GAC1B,KAAKC,GAAcH,EAAa,WAAW,EAAI,GAE/CA,EAAa,iBAAiB,WAAW,MAAM;GAO3C,IALA,KAAK3E,GAAO,iBAAiB,kBAAkB,CAAC,CAAC,SAAQ,MAAO;IAC5D,EAAI,UAAU,OAAO,QAAQ;GACjC,CAAC,GAGG,KAAKqI,IAAuB;GAEhC,IAAM5G,IAAY,KAAKzB,GAAO,SAAS,UAAU;GAIjD,CAHmB,KAAKA,GAAO,KAAK,SAAS,CAAC,EAAE,UAAU,KACfyB,KAEdkD,EAAa,iBAI1C,KAAKG,GAAcH,EAAa,SAAS,GAEzC,KAAK3E,GAAO,cAAc,uBAAuB,CAAC,CAAC,QAAQ;EAE/D,GAAG,EAAE,SAAS,GAAK,CAAC;CAE5B;CAEA,gBAAgB,GAAS,IAAQ,OAAO,GAAY;EAEhD,IAAM2E,IAAe,KAAK3E,GAAO,cAAc,gBAAgB,GAGzDE,IADc,KAAKF,GAAO,KAAK,SACR,CAAC,EAAE,UAAU,GAEpC2B,IAAY,KAAK,IAAI,GAAG,KAAK,IAAI2G,GAASpI,IAAa,CAAC,CAAC,GAC3DqI,IAAkB;EAEtB,IAAI,KAAKvD,IAAY;GACjB,IAAM/D,IAAe,KAAK,IAAI0D,EAAa,eAAeA,EAAa,cAAc,CAAC;GAGtF,IADchD,IAAY,KAAK,IAAIzB,IAAa,GAAG,CAAC,IAC1Be;EAC9B,OAAO;GAEH,IAAMQ,IAAY,KAAKzB,GAAO,SAAS,QACjCwI,IAAqB7G,IAAYF,GAEjCf,KAAe,KAAKV,GAAO,SAAS,KAAK,OAAO,gBAAgB,MACjE,KAAKA,GAAO,SAAS,KAAK,OAAO,gBAAgB,KAClD,KAAKA,GAAO,SAAS,KAAK,MAAM,KAAK,cAEnCY,IAAa+D,EAAa,gBAAgB,GAC1CQ,IAAwB,KAAK,IAAIjF,IAAauB,IAAYf,IAAcE,GAAY,CAAC,GAErFP,IAAqB,MACrBC,IAAa6E,IAAwB9E,GAEvCE,IAAc;GAKlB,AAJID,MACA,IAAcD,IAAqB8E,IAGvC,IAAkBqD,IAAqBjI;EAC3C;EAMA,AAJA,KAAK8H,KAAwB,IAC7B,EAAa,YAAYE,GACzB,KAAKzD,GAAcyD,CAAe,GAElC,4BAA4B;GACxB,4BAA4B;IAExB,AADA,KAAKF,KAAwB,IACzB,OAAOI,KAAe,cAAYA,EAAW;GACrD,CAAC;EACL,CAAC;CACL;CAIA,gBAAgB;EACZ,AAEI,KAAKxK,QADL,KAAKA,GAAgB,WAAW,GACT;CAE/B;CAEA,WAA+B;EAC3B,KAAKyK,GAAgB;CAsBzB;CAEA,WAAwB;EAEpB,IAAI,KAAKN,KAAe,KAAK,KAAKpI,GAAO,SAAS,SAAS,GAAG;GAC1D,IAAM2I,IAAc,KAAK,KAAK,KAAKP,KAAe,KAAKpI,GAAO,SAAS,MAAM,GAEzE2G,IAAgB,KAAKiC;GACzB,IAAI,KAAK5D,MAAc,KAAKhF,GAAO,UAAU;IACzC,IAAM6I,IAAa,KAAK7I,GAAO,SAAS,SAAS,UAAU;IAC3D,KAAkB6I,IAAa;GACnC;GAEA,KAAKC,KAAkBH,IAAchC;EACzC;CACJ;CAEA,WAA6B;EASzB,AAPA;GAAC;GAAsB;GAAsB;EAAqB,CAAC,CAAC,SAAQ,MAAY;GACpF,IAAMI,IAAY,KAAK/G,GAAO,cAAc,kBAAkBgH,GAAU;GACxE,AAAID,KAAaA,EAAU,cAAc,OAAO,KAC5C,KAAKgC,GAAYhC,CAAS;EAElC,CAAC,GAED,KAAKiC,GAAgB;CACzB;CAEA,MAAe,MAAc;EAEzB,IAAIC,IAAkB;EACtB,AAAIlC,EAAU,UAAU,SAAS,mBAAmB,IAAG,IAAkB,SAChEA,EAAU,UAAU,SAAS,oBAAoB,MAAG,IAAkB;EAE/E,IAAMoB,IAAc,MAAM,KAAK,KAAKnI,GAAO,YAAY,iBAAiB,eAAe,CAAC,CAAC,CAAC,KAAI,MAAM;GAChG,IAAMkJ,IAAW5B,EAAG,UAAU,EAAI;GAiBlC,OAdI2B,MAAoB,SACpBC,EAAS,iBAAiB,OAAO,CAAC,CAAC,SAAQ,MAAS;IAChD,AAAIxG,EAAM,aAAa,OAAO,MAAM,UAAQA,EAAM,OAAO;GAC7D,CAAC,IACMuG,MAAoB,UAC3BC,EAAS,iBAAiB,OAAO,CAAC,CAAC,SAAQ,MAAS;IAChD,AAAIxG,EAAM,aAAa,OAAO,MAAM,WAASA,EAAM,OAAO;GAC9D,CAAC,IAEDwG,EAAS,iBAAiB,6BAA6B,CAAC,CAAC,SAAQ,MAAS;IACtE,EAAM,OAAO;GACjB,CAAC,GAGEA;EACX,CAAC;EAED,IAAIf,EAAY,WAAW,GAAG;EAE9B,IAAMgB,IAAcpC,EAAU,cAAc,YAAY;EAExD,EAAY,iBAAiB,IAAI,CAAC,CAAC,SAAQ,MAAMO,EAAG,OAAO,CAAC;EAE5D,IAAM8B,IAAW,SAAS,uBAAuB;EACjD,KAAK,IAAIrP,IAAI,GAAGA,IAAI,KAAK+O,IAAiB,KACtC,EAAY,SAAQ,MAAQM,EAAS,YAAYC,EAAK,UAAU,EAAI,CAAC,CAAC;EAM1E,AAFAF,EAAY,YAAYC,CAAQ,GAE5BrC,EAAU,UAAU,SAAS,mBAAmB,MAChD,KAAKrB,GAAS,UAAUyD,EAAY,cAAc,IAAI;CAE9D;CAIA,WAAwB;EACpB,IAAMG,IAAY,KAAKtJ,GAAO,cAAc,yCAAyC,GAC/EuJ,IAAY,KAAKvJ,GAAO,cAAc,yCAAyC,GAC/EwJ,IAAa,KAAKxJ,GAAO,cAAc,0CAA0C;EAEvF,IAAIuJ,GAAW;GACX,IAAME,IAAWH,IAAY,MAAM,KAAKA,EAAU,iBAAiB,UAAU,CAAC,IAAI,CAAC,GAC7EI,IAAW,MAAM,KAAKH,EAAU,iBAAiB,UAAU,CAAC,GAC5DI,IAAYH,IAAa,MAAM,KAAKA,EAAW,iBAAiB,UAAU,CAAC,IAAI,CAAC,GAEhFI,IAAU,KAAK,IAAIH,EAAS,QAAQC,EAAS,QAAQC,EAAU,MAAM;GAE3E,KAAK,IAAI5P,IAAI,GAAGA,IAAI6P,GAAS,KAAK;IAC9B,IAAMC,IAAU;KACZJ,EAAS1P,EAAE,EAAE,sBAAsB,CAAC,CAAC,UAAU;KAC/C2P,EAAS3P,EAAE,EAAE,sBAAsB,CAAC,CAAC,UAAU;KAC/C4P,EAAU5P,EAAE,EAAE,sBAAsB,CAAC,CAAC,UAAU;IACpD,GACM+P,IAAY,KAAK,IAAI,GAAGD,CAAO;IAErC,AAAIC,IAAY,MACRL,EAAS1P,OAAI,EAASA,EAAE,CAAC,MAAM,SAAS,GAAG+P,EAAU,MACrDJ,EAAS3P,OAAI,EAASA,EAAE,CAAC,MAAM,SAAS,GAAG+P,EAAU,MACrDH,EAAU5P,OAAI,EAAUA,EAAE,CAAC,MAAM,SAAS,GAAG+P,EAAU;GAEnE;EACJ;CACJ;CAEA,WAA4B;EAExB,AAAK,KAAK9J,MAAY,KAAKA,cAAkB,gBAE7C,KAAK/B,KAAkB,IAAI,gBAAgB,MAAY;GACnD,KAAK,IAAM8L,KAASC,GAAS;IAGzB,IAAI,CADYD,EAAM,OACT,UAAU,SAAS,QAAQ,GAAG;IAE3C,IAAME,IAASF,EAAM,YAAY;IAOjC,AANcA,EAAM,YAAY,QAEpB,KAAK,KAAK/J,GAAO,gBACzB,KAAKA,GAAO,QAAQ,EAAI,GAGxBiK,IAAS,KAAK,KAAK7B,OAAiB6B,MACpC,KAAK7B,KAAe6B,GAEpB,KAAKvB,GAAgB,GAEjB,KAAK1I,GAAO,SAAS,WAAW,SAChC,KAAK6E,GAAqB,GAC1B,KAAK,QAAQ;GAGzB;EACJ,CAAC,GAED,KAAK5G,GAAgB,QAAQ,KAAK+B,EAAM;CAC5C;AACJ,GC9nBakK,IAAb,MAAaA,EAAc;CAEvB,OAAO,QAAQ,GAAW;EAEtB,IAAMC,IAASC,EAAU,UAAU,EAAI;EASvC,OAPAF,EAAc,cAAcC,GAAQA,EAAO,iBAAiB,UAAU,CAAC,GACvED,EAAc,cAAcC,GAAQA,EAAO,iBAAiB,kCAAgC,CAAC,GAC7FD,EAAc,cAAcC,GAAQA,EAAO,iBAAiB,wCAAsC,CAAC,GACnGD,EAAc,cAAcC,GAAQA,EAAO,iBAAiB,UAAU,CAAC,GAEvED,EAAcG,GAAmBF,CAAM,GAEhCA;CACX;CAEA,OAAO,UAAU,GAAQ;EAUrB,OAPAD,EAAc,cAAcC,GAAQA,EAAO,iBAAiB,UAAU,CAAC,GACvED,EAAc,cAAcC,GAAQA,EAAO,iBAAiB,kCAAgC,CAAC,GAC7FD,EAAc,cAAcC,GAAQA,EAAO,iBAAiB,wCAAsC,CAAC,GACnGD,EAAc,cAAcC,GAAQA,EAAO,iBAAiB,UAAU,CAAC,GAEvED,EAAcG,GAAmBF,CAAM,GAEhCA;CACX;CAEA,OAAOE,GAAmB,GAAQ;EAE9B,EAAO,iBAAiB,cAAc,CAAC,CAAC,SAAS,GAAM,MAAM;GACzD,EAAK,aAAa,YAAYtQ,CAAC;GAC/B,IAAMuQ,IAAQC,EAAK,aAAa,OAAO;GAEvC,EAAO,iBAAiB,cAAcxQ,EAAE,GAAG,CAAC,CAAC,SAAQ,MAAO;IACxD,IAAQgO,EAAI,aAAa,SAASuC,CAAK,IAAIvC,EAAI,gBAAgB,OAAO;GAC1E,CAAC;EACL,CAAC;CACL;CAEA,OAAO,cAAc,GAAQ,GAAK;EAE9B,IAAMyC,IAAOL,EAAO,iBAAiB,cAAc,GAC7CM,IAAO,MAAM,KAAK,EAAE,QAAQxD,EAAI,OAAO,SAAS,MAAMuD,EAAK,MAAM,CAAC,CAAC,KAAK,IAAI,CAAC;EAEnF,EAAI,SAAS,GAAK,MAAU;GAExB,EAAI,QAAQ,SAAS/Q;GAErB,IAAI7B,IAAW;GAEf,EAAI,iBAAiB,QAAQ,CAAC,CAAC,SAAQ,MAAS;IAE5C,OAAOA,IAAW4S,EAAK,UAAUC,EAAKhR,EAAM,CAAC7B,OAAc,OACvD;IAGJ,EAAM,QAAQ,MAAMA;IAEpB,IAAM8S,IAAUhI,EAAM,WAAW,GAC3BiI,IAAUjI,EAAM,WAAW;IAEjC,KAAK,IAAI8B,IAAI,GAAGA,IAAIkG,GAAS,KACzB,KAAK,IAAIE,IAAI,GAAGA,IAAID,GAAS,KACzB,AAAIlR,IAAQ+K,IAAIyC,EAAI,UAAUrP,IAAWgT,IAAIJ,EAAK,WAC9C,EAAK/Q,IAAQ+K,EAAE,CAAC5M,IAAWgT,KAAKlI;IAK5C,KAAYiI;GAChB,CAAC;EACL,CAAC;CACL;AAEJ,GC9EaE,IAAb,MAA2B;CAC1B;CACA;CACA,KAAS;EAAE,UAAU;EAAI,UAAU;EAAI,QAAQ;EAAI,QAAQ;CAAG;CAE9D,YAAY,GAAO;EAIlB,AAHA,KAAK7K,KAAShE,GACd,KAAKhF,KAAQgF,EAAM,YAAY,CAAC,CAAC,MAEjC,KAAK8O,GAAY;CAClB;CAEA,GAAc,GAAI;EACjB,IAAI,CAACxD,GAAI,OAAO;GAAE,SAAS;GAAI,aAAa;GAAI,WAAW;EAAG;EAE9D,IAAMgB,IAAU,SAAShB,EAAG,QAAQ,OAAO,EAAE;EAC7C,IAAI,MAAMgB,CAAO,GAAG,OAAO;GAAE,SAAS;GAAI,aAAa;GAAI,WAAW;EAAG;EAEzE,IAAMJ,IAAQZ,EAAG,QAAQ,OAAO,GAG1ByD,IAFM,MAAM,KAAK7C,EAAM,iBAAiB,IAAI,CAE3B,CAAC,CAAC,QAAO,MAAK,SAAS8C,EAAE,QAAQ,OAAO,EAAE,MAAM1C,CAAO,GACxEb,IAAcsD,EAAa,QAAQzD,CAAE,GACrCpB,IAAiB6E,EAAa,SAAS,IAAIA,EAAa,SAAS;EAIvE,OAAO;GAAE;GAAS;GAAa,WAFZzC,IAAUpC,KAAmBuB,KAAe,IAAIA,IAAeH,EAAG,kBAAkBpB;EAE9D;CAC1C;CAEA,SAAS,GAAW,GAAK;EACxB,KAAKlG,GAAO,iBAAiB,mBAAmB,CAAC,CAAC,SAAQ,MAAO;GAEhE,AADA2C,EAAI,UAAU,OAAO,gBAAgB,GACrCA,EAAI,iBAAiB,mBAAmB,CAAC,CAAC,SAAQ,MAAO;IACxD,EAAI,UAAU,OAAO,gBAAgB;GACtC,CAAC;EACF,CAAC;EAED,IAAMsI,IAAM,KAAKjL,GAAO,cAAc,8CAA8C0H,EAAU,kBAAkBwD,EAAI,GAAG;EACvH,AAAKD,MAELA,EAAI,UAAU,IAAI,gBAAgB,GAClCA,EAAI,QAAQ,IAAI,CAAC,EAAE,UAAU,IAAI,gBAAgB;CAClD;CAEA,SAAS,GAAU,GAAU,GAAQ,GAAQ;EAC5C,IAAIE,IAAK,KAAK,IAAIC,GAAUC,CAAM,GAC9BC,IAAK,KAAK,IAAIF,GAAUC,CAAM,GAC9BE,IAAK,KAAK,IAAIC,GAAUC,CAAM,GAC9BC,IAAK,KAAK,IAAIF,GAAUC,CAAM;EAGlC,AAAI,KAAKzU,GAAM,YAAY,wBAC1B,IAAK,GACL,IAAK;EAGN,IAAM2U,IAAa,KAAK3L,GAAO,iBAAiB,6DAA6D,GAEzG4L,IAAW,IACXC,IAAY;EAEhB,OAAOD,KAAYC,IAAY,IAI9B,AAHA,IAAW,IACX,KAEAF,EAAW,SAAQ,MAAa;GAM/B,MAJyB,KAAK5E,EAAU,iBAAiB,UAAU,CAAC,CAAC,CAAC,QAAO,MACrEO,EAAG,MAAM,YAAY,MAGpB,CAAC,CAAC,SAAQ,MAAM;IACxB,IAAM,EAAE,iBAAc,KAAKwE,GAAcxE,CAAE;IAC3C,AAAII,IAAY,KAEhBJ,EAAG,iBAAiB,QAAQ,CAAC,CAAC,SAAQ,MAAQ;KAC7C,IAAM4D,IAAM,SAASa,EAAK,QAAQ,KAAK,EAAE;KACzC,IAAI,OAAMb,CAAG,KAEC,KAAKlL,GAAO,cAAc,iBAAiBkL,EAAI,GACrD,CAAC,CAAC,MAAM,YAAY,QAAQ;MACnC,IAAMR,IAAU,SAASqB,EAAK,WAAW,GAAG,EAAE,GACxCpB,IAAU,SAASoB,EAAK,WAAW,GAAG,EAAE,GAExCC,IAAatE,IAAYgD,IAAU,GACnCuB,IAAaf,IAAMP,IAAU;MAInC,IAFuBqB,KAAcb,KAAMzD,KAAa4D,KAAMW,KAAcV,KAAML,KAAOQ,GAErE;OACnB,IAAMQ,IAAM,KAAK,IAAIf,GAAIzD,CAAS,GAC5ByE,IAAM,KAAK,IAAIb,GAAIU,CAAU,GAC7BI,IAAM,KAAK,IAAIb,GAAIL,CAAG,GACtBmB,IAAM,KAAK,IAAIX,GAAIO,CAAU;OAEnC,CAAIC,MAAQf,KAAMgB,MAAQb,KAAMc,MAAQb,KAAMc,MAAQX,OACrD,IAAKQ,GAAK,IAAKC,GAAK,IAAKC,GAAK,IAAKC,GACnC,IAAW;MAEb;KACD;IACD,CAAC;GACF,CAAC;EACF,CAAC;EAGF,IAAMC,KAAY,MAAU,OAAO,SAASC,CAAG,IAASA,IAAL;EAWnD,AATA,KAAKC,KAAS;GACb,UAAUF,EAASnB,CAAE;GACrB,UAAUmB,EAASf,CAAE;GACrB,QAAQe,EAAShB,CAAE;GACnB,QAAQgB,EAASZ,CAAE;EACpB,GAIA,KAAK,OAAO;CACb;CAEA,cAAc;EACb,KAAKc,KAAS;GAAE,UAAU;GAAI,UAAU;GAAI,QAAQ;GAAI,QAAQ;EAAG;CACpE;CAEA,IAAI,SAAS;EACZ,OAAO,KAAKA,GAAO;CACpB;CACA,IAAI,SAAS;EACZ,OAAO,KAAKA,GAAO;CACpB;CACA,IAAI,SAAS;EACZ,OAAO,KAAKA,GAAO;CACpB;CACA,IAAI,SAAS;EACZ,OAAO,KAAKA,GAAO;CACpB;CAEA,gBAAgB;EACf,KAAK,OAAO;CACb;CAEA,eAAe;EACd,IAAM,EAAE,aAAU,aAAU,WAAQ,cAAW,KAAKA,IAE9Cb,IAAa,KAAK3L,GAAO,iBAC9B,6DACD;EAYA,AAVA2L,EAAW,SAAQ,MAAa;GAK/B,AAJA5E,EAAU,iBAAiB,8FAA8F,CAAC,CAAC,SAAQ,MAAM;IACxI,EAAG,UAAU,OAAO,YAAY,gBAAgB,mBAAmB,iBAAiB,kBAAkB,gBAAgB;GACvH,CAAC,GAEDA,EAAU,iBAAiB,mBAAmB,CAAC,CAAC,SAAQ,MAAM;IAC7D,EAAG,UAAU,OAAO,gBAAgB;GACrC,CAAC;EACF,CAAC,GAEGqE,IAAW,KAAKI,IAAW,KAE/BG,EAAW,SAAS,MAAc;GAKjC,MAJyB,KAAK5E,EAAU,iBAAiB,UAAU,CAAC,CAAC,CAAC,QAAO,MACrEO,EAAG,MAAM,YAAY,MAGpB,CAAC,CAAC,SAAQ,MAAM;IACxB,IAAM,EAAE,iBAAc,KAAKwE,GAAcxE,CAAE;IAC3C,AAAII,IAAY,MAGZA,KAAa0D,KAAY1D,KAAa2D,KACzCtE,EAAU,iBAAiB,wBAAwBO,EAAG,QAAQ,MAAM,GAAG,CAAC,CAAC,SAAQ,MAAM;KACtF,EAAG,UAAU,IAAI,UAAU;IAC5B,CAAC,GAMFA,EAAG,iBAAiB,QAAQ,CAAC,CAAC,SAAQ,MAAQ;KAC7C,IAAM4D,IAAM,SAASa,EAAK,QAAQ,KAAK,EAAE;KACzC,IAAI,MAAMb,CAAG,GAAG;KAEhB,IAAMR,IAAU,SAASqB,EAAK,WAAW,GAAG,EAAE,GACxCpB,IAAU,SAASoB,EAAK,WAAW,GAAG,EAAE,GAExCC,IAAatE,IAAYgD,IAAU,GACnCuB,IAAaf,IAAMP,IAAU;KAGnC,AADmBqB,KAAcZ,KAAY1D,KAAa2D,KAAUY,KAAcT,KAAYN,KAAOO,MAGrGM,EAAK,UAAU,IAAI,UAAU,GAEzBrE,KAAa0D,KAAUW,EAAK,UAAU,IAAI,cAAc,GACxDC,KAAcX,KAAQU,EAAK,UAAU,IAAI,iBAAiB,GAC1Db,KAAOM,KAAUO,EAAK,UAAU,IAAI,eAAe,GACnDE,KAAcR,KAAQM,EAAK,UAAU,IAAI,gBAAgB;IAC9D,CAAC;GACF,CAAC;EACF,CAAC;CACF;CAEA,KAAc;EACb,IAAMU,IAAW,KAAKzM,GAAO,cAAc,gBAAgB;EAC3D,AAAKyM,KAILA,EAAS,iBAAiB,cAAc,MAAM;GAC7C,IAAI,EAAE,WAAW,GAAG;GAEpB,IAAMV,IAAO,EAAE,OAAO,QAAQ,QAAQ;GAEtC,IADI,CAACA,KACDA,EAAK,QAAQ,QAAQ,KAAA,KAAaA,EAAK,QAAQ,QAAQ,KAAA,GAAW;GAGtE,AADA,KAAK/L,GAAO,MAAM,aAAa,QAC/B,KAAKA,GAAO,MAAM,mBAAmB;GAErC,IAAMsH,IAAKyE,EAAK,QAAQ,IAAI,GACtB,EAAE,WAAWX,MAAa,KAAKU,GAAcxE,CAAE,GAC/CkE,IAAW,SAASO,EAAK,QAAQ,KAAK,EAAE;GAE9C,IAAIX,IAAW,GAAG;IAEjB,AADA,KAAKpL,GAAO,MAAM,aAAa,IAC/B,KAAKA,GAAO,MAAM,mBAAmB;IACrC;GACD;GAGA,AADA,KAAK,SAASoL,GAAUI,CAAQ,GAChC,KAAK,SAASJ,GAAUI,GAAUJ,GAAUI,CAAQ;GAEpD,IAAIkB,IAAgBtB,GAChBuB,IAAUnB,GAER5L,KAAe,MAAc;IAElC,IAAIgN,IADa,SAAS,iBAAiB/M,EAAU,SAASA,EAAU,OAChD,CAAC,EAAE,QAAQ,QAAQ;IAE3C,IAAI,CAAC+M,KAAc,CAAC,KAAK5M,GAAO,SAAS4M,CAAU,GAAG;KACrD,IAAMC,IAAW,KAAK7M,GAAO,iBAAiB,qFAAqF;KACnI,KAAK,IAAM4K,KAAKiC,GAAU;MACzB,IAAMC,IAAOlC,EAAE,sBAAsB;MACrC,IACC/K,EAAU,WAAWiN,EAAK,QAC1BjN,EAAU,WAAWiN,EAAK,SAC1BjN,EAAU,WAAWiN,EAAK,OAC1BjN,EAAU,WAAWiN,EAAK,QACzB;OACD,IAAalC;OACb;MACD;KACD;IACD;IAGA,IADI,CAACgC,KACDA,EAAW,QAAQ,QAAQ,KAAA,KAAaA,EAAW,QAAQ,QAAQ,KAAA,GAAW;IAElF,IAAMG,IAAWH,EAAW,QAAQ,IAAI,GAClC,EAAE,WAAWvB,MAAW,KAAKS,GAAciB,CAAQ,GACnDtB,IAAS,SAASmB,EAAW,QAAQ,KAAK,EAAE;IAElD,AAAIvB,IAAS,MACTqB,MAAkBrB,KAAUsB,MAAYlB,OAE5C,IAAgBJ,GAChB,IAAUI,GAEV,KAAK,SAASL,GAAUI,GAAUH,GAAQI,CAAM;GACjD,GAEM3L,UAAkB;IAKvB,AAJA,KAAKE,GAAO,MAAM,aAAa,IAC/B,KAAKA,GAAO,MAAM,mBAAmB,IAErC,SAAS,oBAAoB,aAAaJ,CAAW,GACrD,SAAS,oBAAoB,WAAWE,CAAS;GAClD;GAGA,AADA,SAAS,iBAAiB,aAAaF,CAAW,GAClD,SAAS,iBAAiB,WAAWE,CAAS;EAC/C,CAAC;CACF;AACD,GC5RakN,IAAb,MAA4B;CAC3B;CACA;CAEA,KAAe;CACf,KAAa;CAEb,YAAY,GAAO;EAIlB,AAHA,KAAKhN,KAAShE,GACd,KAAKhF,KAAQgF,EAAM,YAAY,CAAC,CAAC,MAEjC,KAAK8O,GAAY;CAClB;CAEA,IAAI,cAAc;EACjB,OAAO,KAAKmC;CACb;CAEA,IAAI,YAAY,GAAM;EACrB,IAAI,CAAClB,GAAM;EAKX,AAHA,KAAKkB,KAAelB,GACpBA,EAAK,MAAM,EAAE,eAAe,GAAK,CAAC,GAElC,KAAKmB,KAAanB,EAAK,QAAQ,IAAI;EACnC,IAAMrE,IAAY,SAAS,KAAKwF,GAAW,QAAQ,WAAW,EAAE;EAEhE,KAAKlN,GAAO,UAAU,SAAS0H,GAAW,KAAKuF,GAAa,QAAQ,GAAG;CACxE;CAGA,MAAc,GAAG,MAAS;EAEzB,IAAKlB,GAEL;WAAQ,EAAE,MAAV;IACC,KAAK;KACJ,AAAI,EAAE,WACA,KAAKoB,GAAmBpB,CAAI,KAChCA,EAAK,eAAe;MAAE,QAAQ;MAAW,OAAO;KAAU,CAAC,IAGvD,KAAKqB,GAAoBrB,CAAI,KACjCA,EAAK,eAAe;MAAE,QAAQ;MAAW,OAAO;KAAU,CAAC;KAG7D;IACD,KAAK;KACJ,AAAK,KAAKqB,GAAoBrB,CAAI,KAAM,KAAKoB,GAAmBpB,CAAI,KACnEA,EAAK,eAAe;MAAE,QAAQ;MAAW,OAAO;KAAU,CAAC;KAE5D;IACD,KAAK,aACJ,AAAK,KAAKoB,GAAmBpB,CAAI,KAChCA,EAAK,eAAe;KAAE,QAAQ;KAAW,OAAO;IAAU,CAAC;GAG9D;GAGA,AADA,KAAK,cAAcA,GACnB,KAAK/L,GAAO,UAAU,SAAS,KAAKkN,GAAW,QAAQ,WAAWnB,EAAK,QAAQ,KAAK,KAAKmB,GAAW,QAAQ,WAAWnB,EAAK,QAAQ,GAAG;EAHvI;CAID;CAEA,MAAc,GAAG,MAAS;EACzB,IAAIA,GAAM;GACT,IAAIsB,IAAY;GAChB,QAAQ,EAAE,MAAV;IACC,KAAK;KACJ,AAAI,EAAE,UACD,KAAKC,GAAoBvB,CAAI,MAChC,IAAY;KAOd;IACD,KAAK;KACJ,AAAI,KAAKuB,GAAoBvB,CAAI,MAChC,IAAY;KAEb;IACD,KAAK,WACJ,AAAI,KAAKwB,GAAoBxB,CAAI,MAChC,IAAY;GAGf;GAEA,IAAIsB,GAAW;IAEd,AADA,KAAK,cAActB,GACnB,KAAK/L,GAAO,UAAU,SAAS,KAAKkN,GAAW,QAAQ,WAAWnB,EAAK,QAAQ,KAAK,KAAKmB,GAAW,QAAQ,WAAWnB,EAAK,QAAQ,GAAG;IACvI;GACD;EACD;EAEA,IAAMlG,IAAY,SAAS,KAAKqH,GAAW,QAAQ,OAAO,EAAE,GACxDM,IAAiB;EACrB,QAAQ,EAAE,MAAV;GACC,KAAK;IACJ,IAAI,EAAE,UAAU;KACf,IAAM9L,IAAkB,KAAK+L,GAAoB;KACjD,IAAiB,KAAK,IAAI5H,IAAYnE,IAAkB,GAAG,CAAC;IAC7D,OACC,IAAiB,KAAK,IAAImE,GAAW,KAAK7F,GAAO,KAAK,MAAM,CAAC;IAE9D;GACD,KAAK;IACJ,IAAiB,KAAK,IAAI6F,GAAW,KAAK7F,GAAO,KAAK,MAAM,CAAC;IAC7D;GACD,KAAK;IACJ,IAAM0B,IAAkB,KAAK+L,GAAoB;IACjD,IAAiB,KAAK,IAAI5H,IAAYnE,IAAkB,GAAG,CAAC;EAE9D;EAEA,IAAI8L,IAAiB,GAAG;EAExB,IAAI9F,IAAY,SAAS,KAAKwF,GAAW,QAAQ,WAAW,EAAE,GACxDhC,IAAM,SAAS,KAAK+B,GAAa,QAAQ,KAAK,EAAE,GAChDvC,IAAU,SAAS,KAAKuC,GAAa,SAAS,EAAE,KAAK;EAE3D,QAAQ,EAAE,MAAV;GACC,KAAK;IACJ,KAAavC;IACb;GACD,KAAK,WACJ;EAEF;EAEA,KAAK1K,GAAO,WAAW,gBAAgBwN,GAAgB,YAAY;GAClE,IAAME,IAAc,KAAKC,GAAUjG,GAAWwD,CAAG;GAEjD,AAAIwC,MACH,KAAK,cAAcA,GACnB,KAAK1N,GAAO,UAAU,SAAS,KAAKkN,GAAW,QAAQ,WAAWQ,EAAY,QAAQ,KAAK,KAAKR,GAAW,QAAQ,WAAWQ,EAAY,QAAQ,GAAG;EAEvJ,CAAC;CACF;CAEA,YAAY,MAAM;EAcjB,IAZI,EAAE,OAAO,YAAY,YACpB,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,OAAO,IAAI,KAC9B;GAAC;GAAY;GAAa;GAAO;EAAK,CAAC,CAAC,SAAS,EAAE,IAAI,KAKxD;GAAC;GAAO;GAAiB;GAAO;GAAO;EAAO,CAAC,CAAC,SAAS,EAAE,OAAO,IAAI,MAKvE,CAAC,KAAKT,MAAgB,CAAC,KAAKC,IAC/B;EAGD,IAAIU;EACJ,QAAQ,EAAE,MAAV;GACC,KAAK;IACJ,IAAW,EAAE,WAAW,KAAKC,GAAiB,IAAI,KAAKC,GAAa;IACpE;GACD,KAAK;IACJ,IAAW,KAAKA,GAAa;IAC7B;GACD,KAAK;IACJ,IAAW,KAAKD,GAAiB;IACjC;GACD,KAAK;IACJ,IAAW,EAAE,WAAW,KAAKE,GAAW,IAAI,KAAKC,GAAa;IAC9D;GACD,KAAK;IACJ,IAAW,KAAKA,GAAa;IAC7B;GACD,KAAK,WACJ,IAAW,KAAKD,GAAW;EAE7B;EAIA,AAFA,EAAE,eAAe,GAEb;GAAC;GAAY;GAAa;EAAK,CAAC,CAAC,SAAS,EAAE,IAAI,IACnD,KAAKE,GAAW,GAAGL,CAAQ,IAEnB;GAAC;GAAQ;GAAU;EAAW,CAAC,CAAC,SAAS,EAAE,IAAI,KACvD,KAAKM,GAAW,GAAGN,CAAQ;CAE7B;CAEA,WAAqB;EACpB,IAAM1C,IAAM,SAAS,KAAK+B,GAAa,QAAQ,KAAK,EAAE,GAChDtC,IAAU,SAAS,KAAKsC,GAAa,SAAS,EAAE,KAAK,GACrDpH,IAAY,SAAS,KAAKqH,GAAW,QAAQ,OAAO,EAAE,GACtDxF,IAAY,SAAS,KAAKwF,GAAW,QAAQ,WAAW,EAAE,GAE1DiB,IAAUjD,IAAMP,GAElBiD,IAAW,KAAK5N,GAAO,cAAc,6BAA6B0H,EAAU,kBAAkByG,EAAQ,GAAG;EAK7G,OAJA,AACCP,MAAW,KAAK5N,GAAO,cAAc,wBAAwB6F,EAAU,kBAAkBsI,EAAQ,GAAG,GAG9FP;CACR;CAEA,WAAyB;EAExB,IAAM1C,IAAM,SAAS,KAAK+B,GAAa,QAAQ,KAAK,EAAE,GAChDpH,IAAY,SAAS,KAAKqH,GAAW,QAAQ,OAAO,EAAE,GACtDxF,IAAY,SAAS,KAAKwF,GAAW,QAAQ,WAAW,EAAE,GAE5DU;EACJ,KAAK,IAAI,IAAI1C,IAAM,GAAG,KAAK,MAC1B,IAAW,KAAKlL,GAAO,cAAc,6BAA6B0H,EAAU,kBAAkB,EAAE,GAAG,GACnG,AACCkG,MAAW,KAAK5N,GAAO,cAAc,wBAAwB6F,EAAU,kBAAkB,EAAE,GAAG,GAG3F,KANyB;EAS9B,OAAO+H;CACR;CAIA,MAAa,GAAW,MAAQ;EAE/B,IAAMjL,IAAM,KAAK3C,GAAO,cAAc,6BAA6B0H,EAAU,GAAG;EAChF,IAAI,CAAC/E,GAAK;EAEV,IAAMkD,IAAY,SAASlD,EAAI,QAAQ,OAAO,EAAE,GAE5CiK,IAAa,KAAK5M,GAAO,cAAc,6BAA6B0H,EAAU,kBAAkBwD,EAAI,GAAG;EA2B3G,OA1BK0B,MACJ,KAAK5M,GAAO,iBAAiB,6BAA6B0H,EAAU,MAAM,CAAC,CAAC,SAAQ,MAAS;GAC5F,IAAM0G,IAAU,SAAS1L,EAAM,QAAQ,KAAK,EAAE,GACxCiI,IAAU,SAASjI,EAAM,SAAS,EAAE,KAAK;GAE/C,AAAIwI,KAAOkD,KAAWlD,IAAMkD,IAAUzD,MACrC,IAAajI;EAEf,CAAC,GAEIkK,MACJ,IAAa,KAAK5M,GAAO,cAAc,wBAAwB6F,EAAU,kBAAkBqF,EAAI,GAAG,GAE7F0B,KACJ,KAAK5M,GAAO,iBAAiB,wBAAwB6F,EAAU,MAAM,CAAC,CAAC,SAAQ,MAAS;GACvF,IAAMuI,IAAU,SAAS1L,EAAM,QAAQ,KAAK,EAAE,GACxCiI,IAAU,SAASjI,EAAM,SAAS,EAAE,KAAK;GAE/C,AAAIwI,KAAOkD,KAAWlD,IAAMkD,IAAUzD,MACrC,IAAajI;EAEf,CAAC,KAKGkK;CACR;CAEA,WAAmB;EAClB,IAAM1B,IAAM,SAAS,KAAK+B,GAAa,QAAQ,KAAK,EAAE,GAChDvF,IAAY,SAAS,KAAKwF,GAAW,QAAQ,WAAW,EAAE;EAEhE,OAAO,KAAKS,GAAUjG,IAAY,GAAGwD,CAAG;CACzC;CAEA,WAAqB;EACpB,IAAMA,IAAM,SAAS,KAAK+B,GAAa,QAAQ,KAAK,EAAE,GAChDvF,IAAY,SAAS,KAAKwF,GAAW,QAAQ,WAAW,EAAE,GAC1DxC,IAAU,SAAS,KAAKuC,GAAa,SAAS,EAAE,KAAK;EAE3D,OAAO,KAAKU,GAAUjG,IAAYgD,GAASQ,CAAG;CAC/C;CAGA,MAAuB,MAAS;EAC/B,IAAMvG,IAAe,KAAK3E,GAAO,cAAc,gBAAgB;EAC/D,IAAI,CAAC2E,KAAgB,CAACoH,GAAM,OAAO;EAEnC,IAAMsC,IAAWtC,EAAK,sBAAsB,GACtCuC,IAAe3J,EAAa,sBAAsB,GAClD4J,IAAc5J,EAAa,cAAc,OAAO,CAAC,EAAE,gBAAgB;EAGzE,OAAO0J,EAAS,OAAQC,EAAa,MAAMC;CAC5C;CAGA,MAAuB,MAAS;EAC/B,IAAM5J,IAAe,KAAK3E,GAAO,cAAc,gBAAgB;EAC/D,IAAI,CAAC2E,KAAgB,CAACoH,GAAM,OAAO;EAEnC,IAAMsC,IAAWtC,EAAK,sBAAsB,GACtCuC,IAAe3J,EAAa,sBAAsB;EAGxD,OAAO0J,EAAS,UAAUC,EAAa;CACxC;CAGA,MAAsB,MAAS;EAC9B,IAAME,IAAgB,KAAKxO,GAAO,cAAc,oBAAoB;EACpE,IAAI,CAACwO,KAAiB,CAACzC,GAAM,OAAO;EAEpC,IAAMsC,IAAWtC,EAAK,sBAAsB,GACtCuC,IAAeE,EAAc,sBAAsB;EAGzD,OAAOH,EAAS,QAAQC,EAAa;CACtC;CAGA,MAAuB,MAAS;EAC/B,IAAME,IAAgB,KAAKxO,GAAO,cAAc,oBAAoB;EACpE,IAAI,CAACwO,KAAiB,CAACzC,GAAM,OAAO;EAEpC,IAAMsC,IAAWtC,EAAK,sBAAsB,GACtCuC,IAAeE,EAAc,sBAAsB;EAGzD,OAAOH,EAAS,SAASC,EAAa;CACvC;CAUA,WAA4B;EAC3B,IAAM3J,IAAe,KAAK3E,GAAO,cAAc,gBAAgB,GACzDyO,IAAiB9J,EAAa,gBAAgBA,EAAa,cAAc,OAAO,CAAC,EAAE,gBAAgB,IACnGlD,IAAY,KAAKzB,GAAO,WAAW,aAAa;EAGtD,OAAO,KAAK,IAAI,GAAG,KAAK,MAAMyO,IAAiBhN,CAAS,CAAC;CAC1D;CAEA,KAAc;EAcb,AAbA,KAAKzB,GAAO,iBAAiB,cAAc,MAAM;GAChD,IAAI,EAAE,WAAW,GAAG;GACpB,IAAM+L,IAAO,EAAE,OAAO,QAAQ,QAAQ;GACtC,AAAKA,KACDA,EAAK,QAAQ,UAAU,KAAA,KAAaA,EAAK,QAAQ,QAAQ,KAAA,MAEzDA,EAAK,cAAc,oBAAoB,IAC1C,KAAK/L,GAAO,IAAI,MAAM+L,EAAK,QAAQ,KAAK,IAExC,KAAK,cAAcA;EAErB,CAAC,GAED,KAAK/L,GAAO,iBAAiB,YAAY,MAAM;GAE9C,IAAM+L,IAAO,EAAE,OAAO,QAAQ,OAAO;GACrC,AAAKA,KAAS,KAAK/L,GAAO,SAAS+L,CAAI,MAEnC,KAAK/U,GAAM,YAAY,sBACtB;IAAC;IAAW;IAAa;IAAa;GAAY,CAAC,CAAC,SAAS,EAAE,IAAI,KACtE,KAAK,SAAS,CAAC,IAGZ;IAAC;IAAS;IAAO;IAAW;IAAa;IAAa;GAAY,CAAC,CAAC,SAAS,EAAE,IAAI,IACtF,KAAK,SAAS,CAAC,IACL,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,IAAI,KACnC,EAAE,eAAe;EAGpB,CAAC;CACF;AACD,GCzXM0X,IAAgB,GAETC,IAAb,MAAwB;CACpB;CACA;CACA;CACA;CAEA,KAAkB;CAClB,KAAgB;CAChB,KAAuB;CACvB,KAAc;CACd,KAAU;CACV,KAAiB;CACjB,KAAqB;CACrB,KAAkB;CAClB,KAAa;CAEb,YAAY,GAAO;EAMf,AALA,KAAK3O,KAAShE,GACd,KAAKhF,KAAQgF,EAAM,YAAY,CAAC,CAAC,MACjC,KAAK4S,KAAS,KAAK5O,GAAO,cAAc,8BAA8B,GAEtE,KAAK6O,KAAW,KAAKD,GAAO,cAAc,kBAAkB,GAC5D,KAAK,WAAW;CACpB;CAEA,UAAU;EAGN,AAFA,KAAK5O,GAAO,oBAAoB,eAAe,KAAK8O,EAAc,GAClE,KAAK9O,GAAO,oBAAoB,eAAe,KAAK+O,EAAc,GAClE,KAAK/O,GAAO,oBAAoB,YAAY,KAAKgP,EAAW;CAChE;CAEA,cAAc,IAAgB,QAAQ;EAClC,IAAMrD,IAAa,MAAM,KAAK,KAAK3L,GAAO,iBAAiB,iBAAiBiP,GAAe,CAAC;EAC5F,IAAItD,EAAW,WAAW,GAQ1B;OANyBsD,MAAkB,UAAUA,MAAkB,WAEnE,MAAKjP,GAAO,gBACZ2L,EAAW,EAAE,CAAC,cAAc,OAAO,CAAC,EAAE,aAAa,cAAc,MAAM,QAG3D;IAEZ,IAAMuD,IAAgBvD,EAAW,EAAE,CAAC,cAAc,gBAAgB;IAClE,IAAI,CAACuD,GAAe;IAEpB,IAAIC,IAAa,GACXC,IAAY,CAAC;IAWnB,AATA,MAAM,KAAKF,EAAc,iBAAiB,KAAK,CAAC,CAAC,CAAC,SAAQ,MAAO;KAC7D,IAAMG,IAASnE,EAAI,aAAa,UAAU,GACpCjV,IAAI,SAASiV,EAAI,aAAa,OAAO,GAAG,EAAE;KAChD,AAAK,MAAMjV,CAAC,MACR,EAAUoZ,KAAUpZ,GACpB,KAAcA;IAEtB,CAAC,GAED0V,EAAW,SAAQ,MAAa;KAC5B,IAAM2D,IAASvI,EAAU,iBAAiB,OAAO;KAEjD,AAAIkI,MAAkB,SAClBK,EAAO,SAAQ,MAAO;MAClB,EAAI,MAAM,QAAQ,GAAGH,EAAW;KAEpC,CAAC,KAED,EAAU,MAAM,OAAO,OAAOA,EAAW,KACzC,EAAU,MAAM,QAAQ,GAAGA,EAAW,KACtC,EAAU,MAAM,WAAW,GAAGA,EAAW,KACzC,EAAU,MAAM,WAAW,GAAGA,EAAW,KAEzCG,EAAO,SAAQ,MAAO;MAKlB,AAJA,EAAI,MAAM,QAAQ,GAAGH,EAAW,KAChC,EAAI,MAAM,WAAW,GAAGA,EAAW,KACnC,EAAI,MAAM,WAAW,GAAGA,EAAW,KAEnC,OAAO,QAAQC,CAAS,CAAC,CAAC,SAAS,CAACC,GAAQpZ,OAAO;OAC/C,EAAI,iBAAiB,gBAAgBoZ,EAAO,mBAAmBA,EAAO,GAAG,CAAC,CAAC,SAAQ,MAAQ,CAI3F,CAAC;MACL,CAAC;KACL,CAAC;IAET,CAAC;GACL,OACI,EAAW,SAAQ,MAAa;IAE5B,EADyB,iBAAiB,OACrC,CAAC,CAAC,SAAQ,MAAO,CAItB,CAAC;GACL,CAAC;GAGL,KAAKrP,GAAO,cAAc,uBAAuB,CAAC,EAAE,QAAQ;EAHvD;CAIT;CAEA,eAAe,GAAgB,GAAO,IAAgB,MAAM;EAExD,IAAIuP,IAAa,CAAC;EAIlB,IAFA,IAAa,MAAM,KAAK,KAAKvP,GAAO,iBAAiB,gCAAgCwP,EAAe,GAAG,CAAC,GAEpGD,EAAW,WAAW,GAAG;EAE7B,IAAME,IAAiBF,EAAW,EAAE,CAAC,QAAQ,6DAA6D,GACpGG,IAAwBT,MAC1BQ,GAAgB,UAAU,SAAS,mBAAmB,IAAI,SACtDA,GAAgB,UAAU,SAAS,oBAAoB,IAAI,UAAU;EAG7E,EAAW,SAAQ,MAAO;GAEtB,AADAvE,EAAI,aAAa,SAASyE,CAAK,GAC/B,EAAI,MAAM,QAAQ,GAAGA,EAAM;EAC/B,CAAC;EAED,IAAMC,IAAY,KAAK5P,GAAO,aAAa,cAAc,0BAA0BwP,EAAe,GAAG;EAYrG,AAXII,MACAA,EAAU,aAAa,SAASD,CAAK,GACrC,EAAU,MAAM,QAAQ,GAAGA,EAAM,MAGrC,KAAK,cAAcD,CAAqB,IAEpCA,MAA0B,UAAUA,MAA0B,YAC9D,KAAK,cAAc,MAAM,GAG7B,KAAK1P,GAAO,YAAY,QAAQ;CACpC;CAEA,GAAgB,GAAY;EACxB,IAAI,KAAKA,GAAO,cAAc,OAAO;EACrC,IAAMpD,IAAQgQ,GAAY,QAAQ,OAAO;EAEzC,OADA,GAAIhQ,KAASA,EAAM,aAAa,cAAc,MAAM;CAExD;CAEA,aAAa;EAKT,AAJA,KAAKoD,GAAO,iBAAiB,eAAe,KAAK8O,EAAc,GAI/D,KAAK9O,GAAO,yBAAyB,YAAY,KAAKgP,IAAa,eAAe,KAAKD,EAAc;CACzG;CAEA,GAAkB,GAAM;EACpB,IAAMhI,IAAYgF,EAAK,QAAQ,6DAA6D;EAI5F,OAHKhF,IACDA,EAAU,UAAU,SAAS,mBAAmB,IAAU,SAC1DA,EAAU,UAAU,SAAS,oBAAoB,IAAU,UACxD,SAHgB;CAI3B;CAEA,MAAkB,MAAM;EAGpB,IAAM8I,IAAa,EAAE,OAAO,QAAQ,OAAO;EAC3C,IAAI,CAACA,GAAY;EAEjB,IAAM9D,IAAO,EAAE,OAAO,QAAQ,QAAQ;EAOtC,IALA8D,EAAW,iBAAiB,iBAAiB,CAAC,CAAC,SAAQ,MAAM;GACzD,AAAI1a,MAAO4W,KAAM5W,EAAG,UAAU,OAAO,gBAAgB;EACzD,CAAC,GAEG,CAAC4W,KAAQA,EAAK,QAAQ,QAAQ,KAAA,KAC9BA,EAAK,aAAa,WAAW,MAAM,QAAQ;EAE/C,IAAMe,IAAOf,EAAK,sBAAsB,GAClC+D,IAAU,EAAE,UAAUhD,EAAK,MAC3BiD,IAAaD,KAAWpB,GACxBsB,IAAelD,EAAK,QAAQgD,KAAYpB;EAE9C,IAAIqB,GAAY;GACZ,IAAME,IAAWlE,EAAK;GACtB,IAAI,CAACkE,KAAYA,EAAS,aAAa,WAAW,MAAM,QAAQ;IAC5D,EAAK,UAAU,OAAO,gBAAgB;IACtC;GACJ;EACJ;EAEA,AAAIF,KAAcC,IACdjE,EAAK,UAAU,IAAI,gBAAgB,IAEnCA,EAAK,UAAU,OAAO,gBAAgB;CAE9C;CAEA,MAAkB,MAAM;EAGpB,IAAI,CADe,EAAE,aAAa,QAAQ,OAC5B,GAAG;EAEjB,IAAMA,IAAO,EAAE,aAAa,QAAQ,QAAQ;EAE5C,IAAI,CAACA,KAAQ,CAACA,EAAK,UAAU,SAAS,gBAAgB,GAAG;EAIzD,EAAE,eAAe;EACjB,IAAMe,IAAOf,EAAK,sBAAsB,GAClC+D,IAAU,EAAE,UAAUhD,EAAK,MAE7BF,IAAab;EAEjB,IAAI+D,KAAWpB,GAAe;GAC1B,IAAMuB,IAAWlE,EAAK;GACtB,IAAIkE,KAAYA,EAAS,QAAQ,QAAQ,KAAA,KAAaA,EAAS,aAAa,WAAW,MAAM,QACzF,IAAaA;QACV,IAAI,CAAClE,EAAK,wBACb;EAER;EAGA,AADA,KAAKmE,KAActD,GACnB,KAAKuD,KAAuB,KAAKC,GAAkBxD,CAAU;EAE7D,IAAM7F,IAAY,KAAK/G,GAAO,cAAc,iBAAiB,KAAKmQ,IAAsB;EACxF,IAAI,CAACpJ,GAAW;EAEhB,IAAMsJ,IAAe,SAASzD,EAAW,QAAQ,KAAK,EAAE,GAClDjC,IAAUiC,EAAW,WAAW;EAItC,IAHA,KAAK0D,KAAkBD,IAAe1F,IAAU,GAE9B,KAAK4F,GAAgB3D,CAC3B,GAAG;GACX,KAAK4D,KAAgB,KAAKF,KAAkB;GAC5C,IAAMG,IAAY1J,EAAU,cAAc,iBAAiB,KAAKyJ,GAAc,GAAG;GACjF,AAAIC,IACA,KAAKC,KAAqB,SAASD,EAAU,aAAa,OAAO,GAAG,EAAE,KAAK,MAE3E,KAAKD,KAAgB;EAE7B,OACI,KAAKA,KAAgB;EAGzB,IAAMG,IAAa/D,EAAW,sBAAsB,GAC9CgE,IAAY,KAAK5Q,GAAO,sBAAsB;EAGpD,AADA,KAAK6Q,KAAkBF,EAAW,OAClC,KAAKG,KAAaH,EAAW,OAAOC,EAAU;EAG9C,IAAMG,IADchK,EAAU,cAAc,iBAAiB,KAAKuJ,GAAgB,GAC1D,CAAC,EAAE,aAAa,OAAO;EAW/C,AAVA,KAAKU,KAAkBD,KAAS,CAAC,MAAM,SAASA,GAAO,EAAE,CAAC,IAAK,SAASA,GAAO,EAAE,IAAIJ,EAAW,QAAQhG,GAExG,KAAKsG,KAAU,EAAE,SAEb,KAAKrC,OACL,KAAKA,GAAO,UAAU,IAAI,QAAQ,GAClC,KAAKsC,GAAiB,EAAE,OAAO,IAGnC,OAAO,iBAAiB,eAAe,KAAKC,EAAW,GACvD,OAAO,iBAAiB,aAAa,KAAKC,IAAY,EAAE,MAAM,GAAK,CAAC;CACxE;CAEA,GAAiB,GAAS;EACtB,IAAIC,IAAOC,IAAU,KAAKL,IACpBM,IAAY,KAAKhB,GAAgB,KAAKL,EAAW;EAEvD,IAAIqB,KAAa,KAAKf,OAAkB,MAAM;GAC1C,IAAMgB,IAAU,KAAKd,KAAA,IACfe,IAAU,EAAE,KAAKT,KAAA;GACvB,IAAO,KAAK,IAAIS,GAAS,KAAK,IAAIJ,GAAMG,CAAO,CAAC;EACpD;EAEA,IAAME,IAAkB,KAAK,IAAA,IAAqB,KAAKV,KAAiBK,CAAI,GAGxEM,IAAgBL,IADD,KAAKpB,GAAY,sBACG,CAAC,CAAC;EAEzC,IAAIqB,KAAa,KAAKf,OAAkB,MAAM;GAC1C,IAAMoB,IAAe,KAAKf,MAAmB,KAAKH,KAAA;GAClD,IAAgB,KAAK,IAAIiB,GAAeC,CAAY;EACxD;EAEA,IAAMC,IAAmB,KAAK,IAAA,IAAqBF,CAAa;EAEhE,AAAI,KAAK/C,OACL,KAAKA,GAAO,MAAM,YAAY,8BAA8B,GAAG,KAAKkC,GAAW,GAAG,GAClF,KAAKlC,GAAO,MAAM,YAAY,+BAA+B,GAAGiD,EAAiB,GAAG;EAGxF,IAAMC,IAAY,KAAKjD,IAAU,cAAc,aAAa;EAC5D,AAAIiD,MACA,EAAU,cAAc,GAAG,KAAK,MAAMJ,CAAe,EAAE;CAE/D;CAEA,MAAe,MAAM;EACjB,KAAKR,GAAiB,EAAE,OAAO;CACnC;CAEA,MAAc,MAAM;EAChB,OAAO,oBAAoB,eAAe,KAAKC,EAAW;EAE1D,IAAME,IAAO,EAAE,UAAU,KAAKJ,IACxBM,IAAY,KAAKhB,GAAgB,KAAKL,EAAW,GACnD6B,IAAa;EAEjB,IAAIR,KAAa,KAAKf,OAAkB,MAAM;GAC1C,IAAIwB,IAAc,KAAK,IAAA,IAAqB,KAAKhB,KAAiBK,CAAI,GAClEY,IAAe,KAAKjB,KAAiB,KAAKN,KAAqBsB;GASnE,AAPIC,IAAA,OACA,IAAA,IACA,IAAc,KAAKjB,KAAiB,KAAKN,KAAA,KAG7C,KAAK,eAAe,KAAKJ,IAAiB0B,GAAa,KAAK7B,EAAoB,GAChF,KAAK,eAAe,KAAKK,IAAeyB,GAAc,KAAK9B,EAAoB,GAC/E,IAAa6B;EACjB,OAAO;GACH,IAAMA,IAAc,KAAK,IAAA,IAAqB,KAAKhB,KAAiBK,CAAI;GACxE,AAAI,KAAKf,OAAoB,QAAQ,KAAKH,OACtC,KAAK,eAAe,KAAKG,IAAiB0B,GAAa,KAAK7B,EAAoB,GAChF,IAAa6B;EAErB;EAEA,IAAI,KAAK9B,IAAa;GAClB,IAAMtD,IAAa,KAAKsD;GACxB,AAAItD,EAAW,aAAa,WAAW,MAAM,UAAUmF,IAAa,OAChE,EAAW,QAAQ,cAAc,OAAOA,CAAU;EAE1D;EAaA,AAXI,KAAKnD,OACL,KAAKC,IAAU,UAAU,IAAI,UAAU,GACvC,iBAAiB;GAEb,AADA,KAAKD,GAAO,UAAU,OAAO,QAAQ,GACrC,KAAKC,IAAU,UAAU,OAAO,UAAU;EAC9C,GAAG,GAAG,IAGV,KAAKyB,KAAkB,MACvB,KAAKE,KAAgB,MACrB,KAAKL,KAAuB,MAC5B,KAAKD,KAAc;CACvB;CAEA,MAAe,MAAM;EAGjB,IAAInE,IADa,EAAE,OACC,QAAQ,QAAQ;EACpC,IAAI,CAACA,KAAQ,CAACA,EAAK,UAAU,SAAS,gBAAgB,GAAG;EAEzD,IAAMe,IAAOf,EAAK,sBAAsB;EAGxC,AAFgB,EAAE,UAAUe,EAAK,QAElB4B,MACX,IAAO3C,EAAK;EAGhB,IAAMsE,IAAe,SAAStE,EAAK,QAAQ,KAAK,EAAE,GAC5CmG,IAAY,KAAKlS,GAAO,cAAc,yBAAyBqQ,EAAa,GAAG;EACrF,IAAI,CAAC6B,KAAa,CAACA,EAAU,QAAQ,QAAQA,EAAU,UAAU,SAAS,YAAY,GAAG;EAEzF,IAAIC,IAAe;EACnB,MAAM,KAAKD,EAAU,kBAAkB,QAAQ,CAAC,CAAC,SAAS,MAAQ;GAC9D,QAAQnK,EAAI,SAAZ;IACI,KAAK;KAAQ,KAAgB;KAAG;IAChC,KAAK;KAAO,KAAgB;KAAG;IAC/B,KAAK;KAAU,KAAgB;KAAI;IACnC,KAAK;KAAU,KAAgB;KAAI;IACnC,KAAK,SACD,SAASA,EAAI,QAAQ,OAAA,CAAQ,YAAY,GAAzC;KAEI,KAAK;KACL,KAAK;MACD,KAAgB;MAChB;KAGJ,KAAK;KACL,KAAK;KACL,KAAK;KACL,KAAK;MACD,KAAgB;MAChB;KAGJ,KAAK;KACL,KAAK;KACL,KAAK;MACD,KAAgB;MAChB;KAGJ,KAAK;MACD,KAAgB;MAChB;KAeJ,SACI,KAAgB;IAExB;GAER;EACJ,CAAC;EAED,IAAMqK,IAAW,KAAKpb,GAAM,OAAO,IAAI,CAAC,CAAC,QAAQkb,EAAU,QAAQ,IAAI,GAGjEG,IADgB,OAAO,iBAAiBH,CACrB,CAAC,CAAC,QAAQ,mBAE7BI,IAAavG,EAAK,aAAa,IAEjCwG,KADe,KAAK,gBAAgBD,GAAYD,CACvB,CAAC,CAAC,SAAS,KAAK;EAE7C,KAAKrb,GAAM,cAAc;GAErB,KAAKgJ,GAAO,KAAK,SAAS,CAAC,CAAC,SAAS,GAAQ,MAAQ;IACjD,IAAMuM,IAAM,OAAO2F,EAAU,QAAQ,OAAO,KAAKlb,GAAM,WAAW,SAASkb,EAAU,QAAQ,MAAMtZ,GAAQnB,CAAG,IAAImB,EAAO,EAAEwZ,MAAa,EAAE,CAAC,CAAC,KAAK,GAC3II,IAAO,KAAK,gBAAgBjG,GAAK8F,CAAI;IAC3C,AAAIG,EAAK,SAASA,EAAK,QAAQD,MAC3B,IAAeC,EAAK;GAE5B,CAAC;GAED,IAAMC,IAAkB,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,KAAK,KAAKF,CAAY,IAAIJ,CAAY,CAAC;GAE1F,KAAK,eAAeD,EAAU,QAAQ,KAAKO,GAAiB,KAAKrC,GAAkBrE,CAAI,CAAC;EAC5F,CAAC;CACL;AACJ,GAGa2G,IAAb,cAAqC,YAAY;CAG7C,cAAc;EACV,MAAM;CACV;CAEA,oBAAoB;EAEhB,KAAKC,GAAU;CACnB;CAEA,WAAkB;EACd,KAAK,YAAY;CAKrB;AACJ;AAEK,eAAe,IAAI,8BAA8B,KAClD,eAAe,OAAO,gCAAgCD,CAAe;;ACzdzE,IAAaE,IAAb,MAAsB;CAClB;CACA;CACA;CAEA,KAAc;CACd,KAAc;CACd,KAAkB;CAClB,KAAkB;CAClB,KAAU;CACV,KAAS;CAET,YAAY,GAAO;EAIf,AAHA,KAAK5S,KAAShE,GACd,KAAK6W,KAAQ,KAAK7S,GAAO,cAAc,oBAAoB,GAC3D,KAAK8S,KAAQ,KAAK9S,GAAO,cAAc,oBAAoB,GAC3D,KAAK,WAAW;CACpB;CAEA,aAAa;EACT,KAAKA,GAAO,iBAAiB,eAAe,KAAK+O,EAAc;CACnE;CAEA,KAAkB;EACd,IAAM9X,IAAO,KAAK+I,GAAO,YAAY,CAAC,EAAE;EACxC,OAAO,KAAKA,GAAO,aAAa,aAAa,MAAM,UAAU/I,GAAM,aAAa,aAAa,MAAM;CACvG;CAEA,GAAyB,GAAG,GAAG;EAC3B,IAAM8b,IAAO,KAAK/S,GAAO,YAAY,GACjC7K,IAAK4d,EAAK,mBAAmBA,EAAK,iBAAiB/T,GAAGgU,CAAC,IAAI,SAAS,iBAAiBhU,GAAGgU,CAAC;EAE7F,OAAO7d,KAAMA,EAAG,cAAcA,EAAG,WAAW,mBAAkB;GAC1D,IAAM8d,IAAS9d,EAAG,WAAW,iBAAiB6J,GAAGgU,CAAC;GAClD,IAAI,CAACC,KAAUA,MAAW9d,GAAI;GAC9B,IAAK8d;EACT;EAEA,OAAO9d;CACX;CAEA,GAAkB,GAAM;EACpB,IAAI,CAAC4W,KAAQA,EAAK,QAAQ,QAAQ,KAAA,GAAW,OAAO;EAEpD,IAAMP,IAAW,SAASO,EAAK,QAAQ,KAAK,EAAE,GACxCpB,IAAUoB,EAAK,WAAW,GAC1BN,IAASD,IAAWb,IAAU,GAC9BhT,IAAWoU,EAAK,QAAQ,IAAI,CAAC,EAAE,mBAAmB,GAElDnP,IAAQmP,EAAK,QAAQ,OAAO;EAClC,IAAI,CAACnP,GAAO,OAAO;GAAE;GAAU;GAAS;GAAQ;GAAU,SAAS;GAAO,kBAAkB;GAAM,cAAc;EAAK;EAErH,IAAMsW,IAActW,EAAM,iBAAiB,oBAAoB,GAC3DuW,IAAoB,IACpBC,IAAe,IACfC,IAAmB;EAEvB,KAAK,IAAMC,KAAWJ,GAAa;GAC/B,IAAII,MAAYvH,KAAQuH,EAAQ,QAAQ,QAAQ,KAAA,GAAW;GAE3D,IAAMC,IAAW,SAASD,EAAQ,QAAQ,KAAK,EAAE,GAC3CE,IAAUF,EAAQ,WAAW,GAC7BG,IAASF,IAAWC,IAAU;GAapC,CAZoBF,EAAQ,QAAQ,IAAI,CAAC,EAAE,mBAAmB,KAE5C3b,KAAY4b,KAAY/H,KAAYiI,KAAUhI,KAAU+H,IAAU7I,MAC3E0I,KAGD,EAAiB,WAAW,KAAK,IAAIA,EAAiB,UAAUE,CAAQ,GACxE,EAAiB,SAAS,KAAK,IAAIF,EAAiB,QAAQI,CAAM,KAHlE,IAAmB;IAAE,UAAUF;IAAU,QAAQE;GAAO,IAO5CA,IAASjI,KAAY+H,IAAW9H,MAEtB8H,KAAY/H,KAAYiI,KAAUhI,IAGpD+H,IAAU7I,MACV,IAAoB,OAEjB4I,IAAW/H,KAAYiI,IAAShI,OACjC8H,KAAY/H,KAAYiI,KAAUhI,MACpC,IAAe;EAI/B;EAEA,IAAMiI,IAAcP,KAAqBC;EAEzC,OAAO;GACH;GACA,SAASM,IAAc/I,IAAU;GACjC,QAAQ+I,IAAcjI,IAASD;GAC/B;GACA,SAASkI;GACT;GACA;EACJ;CACJ;CAEA,GAA0B,GAAM;EAC5B,IAAMC,IAAa,KAAKC,GAAkB7H,CAAI;EAC9C,IAAI,CAAC4H,GAAY,OAAO;EAExB,IAAM,EAAE,aAAU,WAAQ,eAAYA,GAGhCE,IAAY9H,EAAK,QAAQ,OAAO;EACtC,IAAI,CAAC8H,GAAW,OAAO;EAEvB,IAAIC,IAAU,UAAUC,IAAW,WAAWC,IAAS,UAAUC,IAAY,WACvEC,IAAc,CAAC;EAwBrB,IAtBAL,EAAU,iBAAiB,oBAAoB,CAAC,CAAC,SAAQ,MAAK;GAC1D,IAAIjJ,EAAE,QAAQ,QAAQ,KAAA,GAAW;GACjC,IAAMuJ,IAAO,SAASvJ,EAAE,QAAQ,KAAK,EAAE,GAEjCwJ,IAAOD,KADCvJ,EAAE,WAAW,KACC;GAM5B,IAJiByJ,IACVF,KAAQ3I,KAAY4I,KAAQ3I,IAC5Bb,MAAMmB,GAEC;IACV,IAAMe,IAAOlC,EAAE,sBAAsB;IAIrC,AAHA,IAAU,KAAK,IAAIkJ,GAAShH,EAAK,IAAI,GACrC,IAAW,KAAK,IAAIiH,GAAUjH,EAAK,KAAK,GACxC,IAAS,KAAK,IAAIkH,GAAQlH,EAAK,GAAG,GAClC,IAAY,KAAK,IAAImH,GAAWnH,EAAK,MAAM;IAE3C,IAAMwH,IAAgB,OAAO,iBAAiB1J,CAAC;IAC/C,EAAY,KAAK;KAAE,IAAIA;KAAG;KAAM,OAAO0J;IAAc,CAAC;GAC1D;EACJ,CAAC,GAEGJ,EAAY,WAAW,GAAG,OAAO;EAErC,IAAMK,IAAaR,IAAWD,GACxBU,IAAcP,IAAYD,GAE1BS,IAAgB,SAAS,cAAc,KAAK;EAwClD,OAvCA,EAAc,YAAY,uBAC1B,EAAc,MAAM,WAAW,YAC/B,EAAc,MAAM,QAAQ,GAAGF,EAAW,KAC1C,EAAc,MAAM,SAAS,GAAGC,EAAY,KAE5CN,EAAY,SAAS,EAAE,OAAI,SAAM,eAAY;GACzC,IAAMQ,IAAavf,EAAG,UAAU,EAAI;GA8BpC,AA5BA,EAAW,MAAM,WAAW,YAC5B,EAAW,MAAM,OAAO,GAAG2X,EAAK,OAAOgH,EAAQ,KAC/C,EAAW,MAAM,MAAM,GAAGhH,EAAK,MAAMkH,EAAO,KAE5C,EAAW,MAAM,QAAQ,GAAGlH,EAAK,MAAM,KACvC,EAAW,MAAM,WAAW,GAAGA,EAAK,MAAM,KAC1C,EAAW,MAAM,WAAW,QAE5B,EAAW,MAAM,SAAS,GAAGA,EAAK,OAAO,KACzC,EAAW,MAAM,YAAY,cAC7B,EAAW,MAAM,SAAS,KAE1B,EAAW,MAAM,kBAAkB6H,EAAM,oBAAoB,iBAAiBA,EAAM,oBAAoB,qBAClGA,EAAM,kBACN,WACN,EAAW,MAAM,QAAQA,EAAM,OAC/B,EAAW,MAAM,OAAOA,EAAM,MAC9B,EAAW,MAAM,aAAaA,EAAM,YACpC,EAAW,MAAM,WAAWA,EAAM,UAClC,EAAW,MAAM,YAAYA,EAAM,WACnC,EAAW,MAAM,UAAUA,EAAM,SACjC,EAAW,MAAM,SAASA,EAAM,QAChC,EAAW,MAAM,cAAcA,EAAM,aACrC,EAAW,MAAM,eAAeA,EAAM,cACtC,EAAW,MAAM,UAAU,QAC3B,EAAW,MAAM,aAAa,UAC9B,EAAW,MAAM,iBAAiBA,EAAM,cAAc,WAAW,WAAYA,EAAM,cAAc,UAAU,aAAa,cAExHF,EAAc,YAAYC,CAAU;EACxC,CAAC,GAEM;GACH,SAASD;GACT,QAAQ;IACJ,MAAMX;IACN,OAAOC;IACP,KAAKC;IACL,QAAQC;IACR,OAAOM;IACP,QAAQC;GACZ;EACJ;CACJ;CAEA,MAAkB,MAAM;EAIpB,IAHI,CAAC,KAAKI,GAAgB,KAGtB,CADe,EAAE,OAAO,QAAQ,kBACtB,GAAG;EAEjB,IAAM7I,IAAO,EAAE,OAAO,QAAQ,QAAQ;EAEtC,IADI,CAACA,KAAQA,EAAK,UAAU,SAAS,gBAAgB,KAAK,CAAC,SAAS,QAAQ,CAAC,CAAC,SAAS,EAAE,OAAO,OAAO,KACnGA,EAAK,QAAQ,QAAQ,KAAA,GAAW;EAEpC,EAAE,eAAe;EAEjB,IAAM8I,IAAS,EAAE,SACXC,IAAS,EAAE,SAEXC,UAAoB;GAOtB,AANA,AAEI,KAAKC,QADL,aAAa,KAAKA,EAAM,GACV,OAElB,OAAO,oBAAoB,eAAeC,CAAoB,GAC9D,OAAO,oBAAoB,aAAaF,CAAW,GACnD,OAAO,oBAAoB,iBAAiBA,CAAW;EAC3D,GAEME,KAAwB,MAAc;GAExC,AADa,KAAK,MAAMpV,EAAU,UAAUgV,GAAQhV,EAAU,UAAUiV,CACjE,IAAI,KACPC,EAAY;EAEpB;EASA,AAPA,KAAKC,KAAS,iBAAiB;GAE3B,AADAD,EAAY,GACZ,KAAKG,GAAW,GAAGnJ,CAAI;EAC3B,GAAG,GAAG,GAEN,OAAO,iBAAiB,eAAekJ,CAAoB,GAC3D,OAAO,iBAAiB,aAAaF,GAAa,EAAE,MAAM,GAAK,CAAC,GAChE,OAAO,iBAAiB,iBAAiBA,GAAa,EAAE,MAAM,GAAK,CAAC;CACxE;CAEA,GAAW,GAAG,GAAM;EAChB,IAAI,KAAKI,IAAa;EAEtB,IAAMC,IAAU,KAAKC,GAA0BtJ,CAAI;EACnD,IAAI,CAACqJ,GAAS;EAId,AAFA,KAAKD,KAAc,IACnB,KAAKG,KAAcvJ,GACnB,KAAKwJ,KAAkB,SAASxJ,EAAK,QAAQ,KAAK,EAAE;EAEpD,IAAM6E,IAAY,KAAK5Q,GAAO,sBAAsB,GAC9C,EAAE,WAAQ,eAAYoV;EAI5B,IAFA,KAAKI,KAAU,EAAE,UAAUC,EAAO,MAE9B,KAAK5C,IAAO;GACZ,KAAKA,GAAM,gBAAgBnV,CAAO;GAElC,IAAMgY,IAAcD,EAAO,MAAM7E,EAAU,KACrC+E,IAAa/E,EAAU,SAAS8E;GAOtC,AALA,KAAK7C,GAAM,MAAM,QAAQ,GAAG4C,EAAO,MAAM,KACzC,KAAK5C,GAAM,MAAM,SAAS,GAAG8C,EAAW,KACxC,KAAK9C,GAAM,MAAM,MAAM,GAAG6C,EAAY,KACtC,KAAK7C,GAAM,MAAM,UAAU,SAE3B,KAAK+C,GAAoB,EAAE,OAAO;EACtC;EAKA,AAHA,SAAS,KAAK,MAAM,SAAS,QAE7B,OAAO,iBAAiB,eAAe,KAAK9G,EAAc,GAC1D,OAAO,iBAAiB,aAAa,KAAK+G,IAAc,EAAE,MAAM,GAAK,CAAC;CAC1E;CAEA,MAAkB,MAAM;EACpB,IAAI,CAAC,KAAKV,IAAa;EAKvB,AAHA,KAAKS,GAAoB,EAAE,OAAO,GAE9B,KAAK/C,OAAO,KAAKA,GAAM,MAAM,gBAAgB,SAC7C,KAAKC,OAAO,KAAKA,GAAM,MAAM,gBAAgB;EAGjD,IAAMlG,IADgB,KAAKkJ,GAAyB,EAAE,SAAS,EAAE,OAClC,CAAC,EAAE,QAAQ,0CAA0C;EAEpF,IAAIlJ,KAAcA,EAAW,QAAQ,QAAQ,KAAA,GAAW;GACpD,IAAMmJ,IAAiB,SAASnJ,EAAW,QAAQ,KAAK,EAAE,GACpDgE,IAAY,KAAK5Q,GAAO,sBAAsB,GAC9CpD,IAAQgQ,EAAW,QAAQ,OAAO,GAEpCoJ,IAAa,UACbC,IAAc;GAiBlB,IAfIrZ,KACAA,EAAM,iBAAiB,oBAAoB,CAAC,CAAC,SAAQ,MAAK;IACtD,IAAIgO,EAAE,QAAQ,QAAQ,KAAA,GAAW;IACjC,IAAMuJ,IAAO,SAASvJ,EAAE,QAAQ,KAAK,EAAE,GAEjCwJ,IAAOD,KADCvJ,EAAE,WAAW,KACC;IAE5B,IAAIuJ,KAAQ4B,KAAkB3B,KAAQ2B,GAAgB;KAClD,IAAMG,IAAQtL,EAAE,sBAAsB;KAEtC,AADA,IAAa,KAAK,IAAIoL,GAAYE,EAAM,IAAI,GAC5C,IAAc,KAAK,IAAID,GAAaC,EAAM,KAAK;IACnD;GACJ,CAAC,GAGDF,MAAe,UAAU;IACzB,IAAMlJ,IAAOF,EAAW,sBAAsB;IAE9C,AADA,IAAaE,EAAK,MAClB,IAAcA,EAAK;GACvB;GAEA,IAAMqJ,IAAOH,KAAeC,IAAcD,KAAc,GACpDI,IAAsB,GACtBC,IAAgB;GAEpB,AAAI,EAAE,UAAUF,KACZ,IAAsBJ,GACtB,IAAgBC,IAAapF,EAAU,SAGvC,IAAsBmF,KADNnJ,EAAW,WAAW,IAEtC,IAAgBqJ,IAAcrF,EAAU;GAG5C,IAAM0F,IAAc,KAAK1C,GAAkB,KAAK0B,EAAW,GACrDiB,IAAaD,EAAY,SAEzBE,IAAiBF,EAAY,UAE7BG,IAAeD,KADC,KAAKlB,GAAY,WAAW,KACI,GAEhDoB,IAAiB9J,EAAW,QAAQ,IAAI,CAAC,EAAE,mBAAmB,GAE9D+J,IAAeD,KADC9J,EAAW,WAAW,KACU,GAEhDgK,IAAsB,EAAEH,IAAeC,KAAkBF,IAAiBG,IAE5EE,IAAwB;GAC5B,IAAIP,EAAY,kBAAkB;IAC9B,IAAM,EAAE,UAAUQ,GAAQ,QAAQC,MAAST,EAAY;IACvD,CAAIF,IAAsBU,KAAWV,IAAsBG,IAAa,IAAKQ,OACzE,IAAwB;GAEhC;GAEA,IAAIC,IAA6B;GACjC,IAAIpa,GAAO;IACP,IAAMqa,IAAera,EAAM,iBAAiB,sCAAsC;IAElF,KAAK,IAAMsa,KAASD,GAAc;KAC9B,IAAIC,MAAU,KAAK5B,IAAa;KAEhC,IAAM6B,IAAYD,EAAM,QAAQ,IAAI,CAAC,EAAE,mBAAmB,GAEpDE,IAAUD,KADCD,EAAM,WAAW,KACK;KAGvC,IAD4BT,IAAeU,KAAaX,IAAiBY,GACjD;KAExB,IAAMC,IAAS,SAASH,EAAM,QAAQ,KAAK,EAAE,GAEvCI,IAAOD,KADCH,EAAM,WAAW,KACD;KAE9B,IAAId,IAAsBiB,KAAUjB,IAAsBkB,IAAO,GAAG;MAChE,IAA6B;MAC7B;KACJ;KAEA,IAAMC,IAAanB,IAAsBG,IAAa;KAMtD,IAJKH,IAAsBiB,KAAUjB,KAAuBkB,KAAQC,IAAaD,KAC5ElB,IAAsBiB,KAAUE,KAAcF,KAAUE,IAAaD,GAGjD;MACrB,IAA6B;MAC7B;KACJ;IACJ;GACJ;GAEA,IAAME,IACFpB,KAAuBE,EAAY,YACnCF,KAAuBE,EAAY,SAAS;GAKhD,IAFsB,CAACM,KAAuBY,KAAeX,KAAyBG,KAA8B,CAACV,EAAY,cAK7H,AAFA,KAAKhG,KAAkB,MACnB,KAAKwC,OAAO,KAAKA,GAAM,MAAM,UAAU,SACvC,KAAKD,MAAO,KAAKA,GAAM,UAAU,IAAI,SAAS;QAKlD,IAHA,KAAKvC,KAAkB8F,GACnB,KAAKvD,MAAO,KAAKA,GAAM,UAAU,OAAO,SAAS,GAEjD,KAAKC,IAAO;IAGZ,IAAM4C,IAFa9I,EAAW,QAAQ,kBACV,CAAC,CAAC,sBACD,CAAC,CAAC,MAAMgE,EAAU,KACzC+E,IAAa/E,EAAU,SAAS8E;IAKtC,AAHA,KAAK5C,GAAM,MAAM,MAAM,GAAG4C,EAAY,KACtC,KAAK5C,GAAM,MAAM,SAAS,GAAG6C,EAAW,KACxC,KAAK7C,GAAM,MAAM,OAAO,GAAGuD,IAAgB,EAAE,KAC7C,KAAKvD,GAAM,MAAM,UAAU;GAC/B;EAER,OAGI,AAFI,KAAKA,OAAO,KAAKA,GAAM,MAAM,UAAU,SACvC,KAAKD,MAAO,KAAKA,GAAM,UAAU,IAAI,SAAS,GAClD,KAAKvC,KAAkB;CAE/B;CAEA,GAAoB,GAAS;EACzB,IAAI,CAAC,KAAKuC,IAAO;EAEjB,IAAM4E,IAAOnG,IADK,KAAKtR,GAAO,sBACC,CAAC,CAAC,OAAO,KAAKwV;EAC7C,KAAK3C,GAAM,MAAM,OAAO,GAAG4E,EAAK;CACpC;CAEA,MAAgB,MAAM;EAClB,AAAK,KAAKtC,OAEV,OAAO,oBAAoB,eAAe,KAAKrG,EAAc,GAC7D,SAAS,KAAK,MAAM,SAAS,IAEzB,KAAK+D,OACL,KAAKA,GAAM,MAAM,UAAU,QAC3B,KAAKA,GAAM,gBAAgB,IAE3B,KAAKC,OAAO,KAAKA,GAAM,MAAM,UAAU,SAGvC,KAAKxC,OAAoB,QACzB,KAAKiF,OAAoB,QACzB,KAAKjF,OAAoB,KAAKiF,MAC9B,KAAKjF,OAAoB,KAAKiF,KAAkB,KAEhD,KAAK,WAAW,KAAKA,IAAiB,KAAKjF,EAAe,GAG9D,KAAK6E,KAAc,IACnB,KAAKG,KAAc,MACnB,KAAKC,KAAkB,MACvB,KAAKjF,KAAkB;CAC3B;CAEA,WAAW,GAAc,GAAY;EAEjC,IAAMoH,IAAW,KAAK1X,GAAO,YAAY,cAAc,UAAU,GAC3D2X,IAAYD,EAAS,cAAc,iBAAiBE,EAAW,GAAG,GAElEtB,IAAc,KAAK1C,GAAkB,KAAK0B,EAAW;EAC3D,IAAI,CAACgB,KAAe,CAACA,EAAY,cAAc;EAE/C,IAAMuB,IAAYvB,EAAY,SACxBwB,KAAa,MAAQrgB,KAAOsgB,KAAgBtgB,IAAMsgB,IAAeF,GAGjEG,IAAoB,KAAKhY,GAAO,cAAc,wCAAwC4X,EAAW,GAAG,GACpGK,IAAYD,GAAmB,QAAQ,oBAAoB,IAAI,SAASA,GAAmB,QAAQ,qBAAqB,IAAI,UAAU;EAsB5I,AApBAN,EAAS,iBAAiB,KAAK,CAAC,CAAC,SAAQ,MAAO;GAC5C,AAAII,EAAU,SAAS5M,EAAI,aAAa,UAAU,GAAG,EAAE,CAAC,MACpD+M,IAAY/M,EAAI,aAAa,SAAS+M,CAAS,IAAI/M,EAAI,gBAAgB,OAAO,GAC9EwM,EAAS,aAAaxM,GAAKyM,CAAS;EAE5C,CAAC,GAED;GAAC;GAAS;GAAS;EAAO,CAAC,CAAC,SAAQ,MAAS;GACzC,KAAK3X,GAAO,YAAY,iBAAiB,GAAGkY,EAAM,IAAI,CAAC,CAAC,SAAQ,MAAM;IAClE,IAAMC,IAAQ,MAAM,KAAK7Q,EAAG,QAAQ,GAC9B8Q,IAAgBD,EAAM,MAAK,MAAK,SAASvN,EAAE,QAAQ,KAAK,EAAE,KAAKgN,CAAU;IAE/E,EAAM,SAAQ,MAAQ;KAClB,AAAIE,EAAU,SAAS/L,EAAK,QAAQ,KAAK,EAAE,CAAC,KACxCzE,EAAG,aAAayE,GAAMqM,KAAiB,IAAI;IAEnD,CAAC;GACL,CAAC;EACL,CAAC,GAED,KAAKpY,GAAO,oBAAoB;CACpC;CAEA,UAAU;EACN,KAAKA,GAAO,oBAAoB,eAAe,KAAK+O,EAAc;CACtE;AACJ,GC5easJ,IAAb,MAA2B;CACvB;CAEA,YAAY,GAAO;EACf,KAAKrY,KAAShE;CAClB;CAEA,YAAY,GAAY,GAAO;EAC3B,IAAI,CAAC4Q,KAAc,CAAChQ,GAAO,OAAO;EAElC,IAAMmK,IAAY6F,EAAW,QAAQ,6DAA6D;EAClG,IAAI7F,GAAW,UAAU,SAAS,mBAAmB,GAAG,OAAO;EAC/D,IAAIA,GAAW,UAAU,SAAS,oBAAoB,GAAG,OAAO;EAEhE,IAAMuR,IAAU,SAAS1L,EAAW,QAAQ,KAAK,EAAE;EACnD,IAAI,CAAC,MAAM0L,CAAO,GAAG;GAEjB,IAAMC,IADQ3b,EAAM,cAAc,0BAA0B0b,EAAQ,GAC9C,CAAC,EAAE,aAAa,OAAO;GAC7C,IAAIC,GAAW,OAAOA;EAC1B;EAEA,OAAO;CACX;CAEA,aAAa,GAAY,GAAO;EAC5B,IAAI,CAAC3L,KAAcA,EAAW,YAAY,QAAQ,CAAChQ,GAAO,OAAO;EAEjE,IAAM0b,IAAU,SAAS1L,EAAW,QAAQ,KAAK,EAAE,GAC7CjC,IAAUiC,EAAW,WAAW;EACtC,IAAI,MAAM0L,CAAO,GAAG,OAAO;EAE3B,IAAME,IAAoBF,IAAU3N,IAAU,GACxC8N,IAAW,MAAM,KAAK7b,EAAM,iBAAiB,UAAU,CAAC;EAE9D,IAAI6b,EAAS,UAAU,GAAG,OAAO;EAEjC,KAAK,IAAMnR,KAAMmR,GAAU;GACvB,IAAMN,IAAQ,MAAM,KAAK7Q,EAAG,iBAAiB,QAAQ,CAAC,GAClDoR,IAAoB;GAExB,KAAK,IAAM3M,KAAQoM,GAAO;IACtB,IAAMhE,IAAO,SAASpI,EAAK,QAAQ,KAAK,EAAE,GAEpC4M,IAAUxE,KADFpI,EAAK,WAAW,KACC;IAE/B,IAAIoI,KAAQqE,KAAqBA,IAAoBG,GACjD,OAAO;IAGX,IAAIA,MAAYH,GAAmB;KAC/B,IAAoB;KACpB;IACJ;GACJ;GAEA,IAAI,CAACE,GAAmB,OAAO;EACnC;EAEA,OAAO;CACX;CAEA,iBAAiB,GAAQ,GAAY,IAAU,QAAQ;EACnD,IAAI,CAAC,KAAK1Y,MAAU,CAAC4M,GAAY;EAEjC,IAAMnK,IAAc,KAAKzC,GAAO;EAChC,IAAI,CAACyC,GAAa;EAElB,IAAM6V,IAAU,SAAS1L,EAAW,QAAQ,KAAK,EAAE,GAC7CjC,IAAUiC,EAAW,WAAW,GAChCmJ,IAAiBuC,IAAU3N,IAAU;EAE3C,IAAI,MAAMoL,CAAc,GAAG;EAE3B,IAAM2B,IAAWjV,EAAY,cAAc,UAAU;EACrD,IAAI,CAACiV,GAAU;EAEf,IAAMlN,IAAO,MAAM,KAAKkN,EAAS,iBAAiB,KAAK,CAAC;EAExD,IAAIkB,MAAW,cAQX,AAPApO,EAAK,SAAQ,MAAO;GAEhB,AADY,SAASU,EAAI,aAAa,UAAU,GAAG,EAC7C,KAAK6K,KACP7K,EAAI,aAAa,SAAS2N,CAAO;EAEzC,CAAC,GAED;GAAC;GAAS;GAAS;EAAO,CAAC,CAAC,SAAQ,MAAS;GACzC,EAAY,iBAAiB,GAAGX,EAAM,IAAI,CAAC,CAAC,SAAQ,MAAM;IACtD,MAAM,KAAK5Q,EAAG,QAAQ,CAAC,CAAC,SAAQ,MAAQ;KACpC,IAAMwR,IAAO,SAAS/M,EAAK,QAAQ,KAAK,EAAE;KAC1C,AAAI,CAAC,MAAM+M,CAAI,KAAKA,KAAQ/C,KACxBhK,EAAK,aAAa,SAAS8M,CAAO;IAE1C,CAAC;GACL,CAAC;EACL,CAAC;OAEE,IAAID,MAAW,gBAAgB;GAClC,IAAIG,IAAaT,GACbU,IAAYV,IAAU3N,IAAU;GAuBpC,AArBA;IAAC;IAAS;IAAS;GAAO,CAAC,CAAC,SAAQ,MAAS;IACzC,EAAY,iBAAiB,GAAGuN,EAAM,IAAI,CAAC,CAAC,SAAS,GAAI,MAAS;KAC9D,MAAM,KAAK5Q,EAAG,QAAQ,CAAC,CAAC,SAAQ,MAAQ;MACpC,IAAM6M,IAAO,SAASpI,EAAK,QAAQ,KAAK,EAAE,GAEpCqI,IAAOD,KADCpI,EAAK,WAAW,KACF,GACtBkN,IAAQlN,EAAK,WAAW;MAO9B,CANgBzE,EAAG,mBAAmB4R,KAEAD,IAAQ,IAAIlN,EAAK,QAAQ,IAAI,CAAC,CAAC,mBAA8BA,EAAK,QAAQ,IAAI,CAAC,CAAC,kBAAkBkN,IAAQ,GAElH7E,IAAOkE,KAAWnE,IAAO4B,MAGnD,IAAa,KAAK,IAAIgD,GAAY5E,CAAI,GACtC,IAAY,KAAK,IAAI6E,GAAW5E,CAAI;KAE5C,CAAC;IACL,CAAC;GACL,CAAC,GAED5J,EAAK,SAAQ,MAAO;IAEhB,AADY,SAASU,EAAI,aAAa,UAAU,GAAG,EAC7C,KAAK6N,KACP7N,EAAI,gBAAgB,OAAO;GAEnC,CAAC;GAED,IAAIiO,IAAW;GASf,AARA3O,EAAK,SAAQ,MAAO;IAChB,AAAI2O,IACAjO,EAAI,gBAAgB,OAAO,IACnBA,EAAI,aAAa,OAAO,MAChC,IAAW;GAEnB,CAAC,GAED;IAAC;IAAS;IAAS;GAAO,CAAC,CAAC,SAAQ,MAAS;IACzC,EAAY,iBAAiB,GAAGgN,EAAM,IAAI,CAAC,CAAC,SAAQ,MAAM;KACtD,MAAM,KAAK5Q,EAAG,QAAQ,CAAC,CAAC,SAAQ,MAAQ;MACpC,IAAMwR,IAAO,SAAS/M,EAAK,QAAQ,KAAK,EAAE;MAC1C,IAAI,MAAM+M,CAAI,GAAG;MAGjB,IAAMM,IADmB5O,EAAK,MAAK,MAAK,SAASI,EAAE,aAAa,UAAU,GAAG,EAAE,MAAMkO,CACnD,CAAC,EAAE,aAAa,OAAO;MAEzD,AAAIM,IACArN,EAAK,aAAa,SAASqN,CAAU,IAErCrN,EAAK,gBAAgB,OAAO;KAEpC,CAAC;IACL,CAAC;GACL,CAAC;EACL;EAEA,KAAK/L,GAAO,sBAAsB;CACtC;AACJ,GC/JaqZ,IAAb,cAA0C,YAAY;CACrD;CACA;CACA;CACA;CACA;CACA,aAAa;CAEb,oBAAoB;EAEnB,AADA,KAAKhf,GAAM,GACX,SAAS,iBAAiB,aAAa,KAAKif,EAAa;CAC1D;CAEA,WAAc;EAmBZ,AAjBA,KAAK3G,GAAU,GAEf,KAAK3S,KAAS,KAAK,QAAQ,kBAAkB,GAC7C,KAAKhJ,KAAQ,KAAK,YAAY,CAAC,CAAC,MAEhC,KAAKuiB,KAAa,KAAK,cAAc,mBAAmB,GAExD,iBAAiB;GAChB,KAAKC,KAAQ,KAAKD,GAAW,WAAW,cAAc,kBAAkB;EACzE,CAAC,GAGD,KAAK,cAAc,aAAa,CAAC,CAAC,iBAAiB,YAAY,MAAM;GACpE,EAAE,gBAAgB;EACnB,CAAC,GACD,KAAK,cAAc,aAAa,CAAC,CAAC,iBAAiB,SAAS,KAAKE,EAAQ,GACzE,KAAK,cAAc,eAAe,CAAC,CAAC,iBAAiB,UAAU,KAAKC,EAAY,GAChF,KAAK,cAAc,QAAQ,CAAC,CAAC,iBAAiB,SAAS,KAAKC,EAAK;CAEnE;CAEA,WAAkB;EACjB,KAAK,YAAY;CA6BlB;CAEA,KAAK,GAAW;EACf,KAAKC,KAAUC;EAEf,IAAM9N,IAAO8N,EAAU,QAAQ,QAAQ;EACvC,KAAK,aAAa9N,GAAM,QAAQ;EAEhC,IAAMsC,IAAWtC,EAAK,sBAAsB,GACtC6E,IAAY,KAAK5Q,GAAO,sBAAsB,GAE9C8Z,IAAa,KAAK,eAAe,KACnCrC,IAAQpJ,EAAS,QAAQuC,EAAU,OAAQkJ,GAC3CC,IAAM1L,EAAS,SAASuC,EAAU;EAOtC,AALI6G,IAAO,MACV,IAAO,KAAK,IAAI,GAAGpJ,EAAS,OAAOuC,EAAU,IAAI,IAGlD,KAAK,MAAM,OAAO,GAAG6G,EAAK,KAC1B,KAAK,MAAM,MAAM,GAAGsC,EAAI;EAExB,IAAMC,IAAY,KAAK,cAAc,aAAa;EAOlD,AANA,EAAU,QAAQ,IAGlB,KAAK,UAAU,IAAI,QAAQ,GAC3B,KAAK,UAAU,IAAI,SAAS,GAE5B,iBAAiB;GAChB,IAAI;IAGH,AAFA,KAAKC,GAAwB,GAC7B,KAAKT,GAAM,WAAW,gBAAgB,CAAC,GACvCQ,EAAU,MAAM;GACjB,UAAU;IACT,KAAK,UAAU,OAAO,SAAS;GAChC;EACD,CAAC;CACF;CAEA,MAAiB,MAAM;EACtB,IAAME,IAAO,EAAE,eAAe,EAAE,aAAa,IAAI,CAAC;EAClD,AAAIA,EAAK,SAAS,IAAI,KAAM,KAAKN,MAAWM,EAAK,SAAS,KAAKN,EAAO,KAGtE,KAAK,MAAM;CACZ;CAEA,QAAQ;EAGP,AAFA,KAAK,aAAa,MAClB,KAAK,UAAU,OAAO,QAAQ,GAC9B,KAAKA,KAAU;CAChB;CAEA,KAA0B;EACzB,IAAMO,IAAkB,KAAKnjB,GAAM,KAAK,SAAS,GAC3CuY,IAAa,KAAKqK,IAAS,WAAW,CAAC,GACvC7hB,IAAS,KAAKf,GAAM,OAAO,IAAI,KAAK,CAAC,GACrCojB,IAAgB,KAAKpa,GAAO,WAAW,WAAW,CAAC,GACnDqa,IAAa,KAAKrjB,GAAM,YAExBiD,IAAKsV,EAAW,SAAS,MAAY;GAC1C,IAAM+K,IAAUC,EAAQ,MAClBC,IAAUD,EAAQ,MAElBE,IAAYH,KAAWE,GACvBpI,IAAWkI,IAAUviB,EAAO,QAAQuiB,CAAO,IAAI,IAC/CI,IAAqBN,EAAcK,MAAc,CAAC,GAElDE,oBAAY,IAAI,IAAI;GAC1B,KAAK,IAAI5gB,IAAI,GAAGA,IAAIogB,EAAgB,QAAQ,KAAK;IAChD,IAAMvhB,IAASuhB,EAAgBpgB;IAC/B,IAAI,CAACnB,GAAQ;IAEb,IAAIgiB;IACJ,AAAIxI,KAAY,KAAKxZ,EAAO,IAC3B,IAASA,EAAO,EAAEwZ,KACRkI,KAAWA,EAAQ,SAAS,OAAO,IAC7C,IAASD,IAAaA,EAAW,SAASC,GAAS1hB,GAAQmB,CAAC,IAAI,KAAA,IACtDygB,KAAWH,MACrB,IAASA,EAAW,SAASG,GAAS5hB,GAAQmB,CAAC;IAGhD,IAAI8gB,IAAaD;IAKjB,AAJIJ,KAAWH,MACd,IAAaA,EAAW,SAASG,GAAS5hB,GAAQmB,CAAC,IAGhD8gB,KAA2C,QAAQ,CAACF,EAAU,IAAIE,CAAU,KAC/EF,EAAU,IAAIE,GAAY;KACzB,GAAGD;KACH,IAAIC;IACL,CAAC;GAEH;GAEA,IAAMC,IAAa,CAAC,GAAGH,EAAU,OAAO,CAAC;GAwBzC,OAtBAG,EAAW,MAAM,GAAG,MAAM;IACzB,IAAMC,IAAOxhB,EAAE,IACTyhB,IAAO1hB,EAAE;IAEf,IAAIyhB,MAASC,GAAM,OAAO;IAC1B,IAAID,KAA+B,QAAQA,MAAS,IAAI,OAAO;IAC/D,IAAIC,KAA+B,QAAQA,MAAS,IAAI,OAAO;IAE/D,IAAMC,IAAO,OAAOF,CAAI,GAClBG,IAAO,OAAOF,CAAI;IASxB,OAJI,CAHY,MAAMC,CAAI,KAGZ,CAFE,MAAMC,CAAI,IAGlBD,IAAOC,IAGR,OAAOH,CAAI,CAAC,CAAC,cAAc,OAAOC,CAAI,CAAC;GAC/C,CAAC,GACDN,EAAmB,MAAM,GAAG,MAAenhB,IAAID,IAAI,IAAI,EAAK,GAErDwhB,EAAW,KAAI,OAAM;IAC3B,KAAK;IACL,MAAMpiB,EAAE;IACR,OAAQA,EAAE,OAAO,MAAMA,EAAE,OAAO,QAAQA,EAAE,OAAO,KAAA,IAAa,+CAA6CA,EAAE;IAC7G,OAAO+hB;IACP,KAAKC,EAAmB,WAAW,KAAKA,EAAmB,iBAAiBhiB,EAAE,CAAC,KAAK,IAAI,MAAM;GAC/F,EAAE;EACH,CAAC;EAED,KAAK6gB,GAAW,KAAK,IAAItf,CAAE;EAE3B,IAAMkhB,IAAe,KAAK,cAAc,eAAe;EACvD,AAAIA,MACH,EAAa,UAAUlhB,EAAG,SAAS,KAAKA,EAAG,OAAM,MAAQ9C,EAAK,QAAQ,GAAG;CAE3E;CAEA,WAAc;EACb,KAAKH,GAAM,UAAU;EAErB,IAAMokB,IAAgB,KAAK5B,GAAM,KAAK,SAAS,GACzCzhB,IAAS,KAAKwhB,GAAW,KAAK,cAAc,GAE5C8B,IAAiBD,EAAc,QAAO,MAAU;GACrD,IAAME,IAAM1iB,EAAO,EAAEb,EAAO,QAAQ,KAAK;GACzC,OAAQujB,MAAQ,OAAOA,MAAQ;EAChC,CAAC,GAEKC,IAAe,EAAE,GAAI,KAAKvb,GAAO,WAAW,WAAW,CAAC,EAAG;EAEjE,KAAK4Z,GAAQ,QAAQ,SAAQ,MAAW;GACvC,IAAMa,IAAYF,EAAQ,QAAQA,EAAQ,MACpCnI,IAAWmI,EAAQ,OAAOxiB,EAAO,QAAQ,OAAO,IAAIA,EAAO,QAAQ,MAAM,GACzEyjB,IAAeH,EAAe,KAAI,MAAK7W,EAAE,EAAE4N,EAAS;GAE1D,AAAIoJ,EAAa,SAAS,IACzB,EAAaf,KAAae,IAE1B,OAAOD,EAAad;EAEtB,CAAC;EAED,IAAMva,IAAa,KAAKqZ,GAAW,KAAK,MAAM;EAE9C,iBAAiB;GAChB,IAAI;IAeH,AAdIrZ,MAAemb,EAAe,SACjC,KAAKzB,GAAQ,QAAQ,SAAQ,MAAW;KACvC,IAAMa,IAAYF,EAAQ,QAAQA,EAAQ;KAC1C,AAAIE,KAAW,KAAKza,GAAO,UAAU,MAAMya,CAAS;IACrD,CAAC,IAED,KAAKza,GAAO,UAAU,IAAIub,CAAY,GAGvC,KAAKvb,GAAO,iBAAiB,0BAA0B,CAAC,CAAC,SAAQ,MAAO;KACvE,EAAI,oBAAoB;IACzB,CAAC,GAED,KAAKA,GAAO,WAAW,GACvB,KAAK,MAAM;GACZ,UAAU;IACT,KAAKhJ,GAAM,UAAU;GACtB;EACD,CAAC;CACF;CAEA,MAAY,MAAM;EAEjB,IAAMykB,IAAQ,EAAE,OAAO,MAAM,YAAY,CAAC,CAAC,KAAK;EAEhD,IAAI,CAACA,GACJ,KAAKjC,GAAM,UAAU,MAAM;OACrB;GACN,IAAMtW,IAAa,KAAKqW,GAAW,KAAK,SAAS,GAE3CmC,IADS,KAAKnC,GAAW,KAAK,cACd,CAAC,CAAC,QAAQ,OAAO,GAEjCoC,IAAgB,CAAC;GAUvB,AATAzY,EAAW,SAAQ,MAAU;IAC5B,IAAMqJ,IAAMmP,KAAY,KAAK9iB,EAAO,IAAIA,EAAO,EAAE8iB,KAAY;IAG7D,AAFgB,OAAOnP,CAAG,CAAC,CAAC,QAAQ,cAAc,EAAE,CAAC,CAAC,YAE5C,CAAC,CAAC,SAASkP,CAAK,KACzBE,EAAc,KAAKpP,CAAG;GAExB,CAAC,GAED,KAAKiN,GAAM,UAAU,IAAI,EACxB,OAAO,CAAC,GAAG,IAAI,IAAImC,CAAa,CAAC,EAClC,CAAC;EACF;CACD;CAEA,MAAgB,MAAM;EACrB,IAAMC,IAAY,EAAE,OAAO,SACrB1Y,IAAa,KAAKqW,IAAY,MAAM,SAAS,KAAK,CAAC,GAEnDsC,IADS,KAAKtC,GAAW,KAAK,cAChB,CAAC,CAAC,QAAQ,KAAK;EAQnC,AANIsC,KAAU,KACb3Y,EAAW,SAAQ,MAAU;GAC5B,EAAO,EAAE2Y,KAAUD,IAAY,MAAM;EACtC,CAAC,GAGF,KAAKrC,GAAW,QAAQ;CACzB;AAKD,GAEauC,IAAb,cAA2C,YAAY;CACtD;CACA,KAAW;CAEX,oBAAoB;EAGnB,AAFA,KAAK9b,KAAS,KAAK,QAAQ,kBAAkB,KAAK,KAAK,YAAY,CAAC,CAAC,MACrE,KAAK,oBAAoB,SAAS,KAAK+b,EAAQ,GAC/C,KAAK,iBAAiB,SAAS,KAAKA,EAAQ;CAC7C;CAEA,IAAI,UAAU;EACb,IAAI,KAAKC,IAAU,OAAO,KAAKA;EAG/B,IAAMpkB,IADO,KAAK,QAAQ,QACN,CAAC,EAAE,QAAQ,KACzB6K,IAAc,KAAKzC,GAAO,aAE1BwK,IAAO,CAAC,GACRyR,oBAAO,IAAI,IAAI;EAqBrB,OAnBIxZ,KAAe7K,MAAa,KAAA,KAC/B6K,EAAY,iBAAiB,oBAAoB7K,EAAS,GAAG,CAAC,CAAC,SAAQ,MAAO;GAC7E,IAAM0iB,IAAUrP,EAAI,QAAQ,MACtBuP,IAAUvP,EAAI,QAAQ;GAE5B,IAAIqP,KAAWE,GAAS;IACvB,IAAM0B,IAAY,GAAG5B,KAAW,GAAG,GAAGE,KAAW;IACjD,AAAKyB,EAAK,IAAIC,CAAS,MACtBD,EAAK,IAAIC,CAAS,GAClB1R,EAAK,KAAK;KACT,MAAM8P;KACN,MAAME;IACP,CAAC;GAEH;EACD,CAAC,GAGF,KAAKwB,KAAWxR,GACT,KAAKwR;CACb;CAEA,4BAA4B;EAC3B,IAAM5B,IAAgB,KAAKpa,GAAO,WAAW,WAAW,CAAC,GACnDmc,IAAa,KAAK,QAAQ,MAAK,MAAW;GAC/C,IAAM9X,IAAMkW,EAAQ,QAAQA,EAAQ;GACpC,OAAOlW,KAAO+V,EAAc/V,MAAQ+V,EAAc/V,EAAI,CAAC,SAAS;EACjE,CAAC;EACD,KAAK,UAAU,OAAO,YAAY8X,CAAU;CAC7C;CAEA,MAAY,MAAM;EAGjB,AADA,EAAE,eAAe,GACjB,EAAE,gBAAgB;EAElB,IAAMC,IAAQ,KAAKpc,GAAO,cAAc,yBAAyB,GAE3DkL,IADO,KAAK,QAAQ,QACX,CAAC,CAAC,QAAQ;EAEzB,AAAIkR,KAASA,EAAM,eAAelR,KAAOkR,EAAM,UAAU,SAAS,QAAQ,IACzEA,EAAM,MAAM,IACFA,KACVA,EAAM,KAAK,IAAI;CAEjB;AACD,GAEaC,IAAb,MAAuB;CACtB;CACA;CACA,KAAe;CACf,KAAe;CACf,KAAW,CAAC;CAEZ,YAAY,GAAO;EAGlB,AAFA,KAAKrc,KAAShE,GACd,KAAKhF,KAAQ,KAAKgJ,GAAO,YAAY,CAAC,CAAC,MACvC,KAAK3F,GAAM;CACZ;CAEA,IAAI,UAAU;EACb,OAAO,KAAKiiB;CACb;CAEA,WAAc;EACb,KAAKC,GAAiB;CACvB;CAEA,WAAyB;EACxB,IAAI,KAAKvlB,GAAM,QAAQ,YAAY,MAAM,qBACxC;EAGD,IAAIolB,IAAQ,KAAKpc,GAAO,cAAc,yBAAyB;EAK/D,AAJKoc,MACJ,IAAQ,SAAS,cAAc,yBAAyB,GACxD,KAAKpc,GAAO,YAAYoc,CAAK,IAE9B,KAAKI,KAAeJ;CACrB;CAEA,cAAc;EACb,OAAO,KAAKK;CACb;CAEA,SAAS,MAAU;EAUlB,AATIjlB,IACH,OAAO,KAAK8kB,GAAS9kB,KAErB,KAAK8kB,KAAW,CAAC,GAGlB,KAAKG,KAAe,OAAO,KAAK,KAAKH,EAAQ,CAAC,CAAC,SAAS,GACxD,KAAKI,GAAgB,GAErB,KAAK1c,GAAO,iBAAiB,0BAA0B,CAAC,CAAC,SAAQ,MAAO;GACvE,EAAI,oBAAoB;EACzB,CAAC;CACF;CAEA,OAAO,MAAY;EAElB,IAAI2c,IAAa,MAAM,QAAQC,CAAO,IACnC,OAAO,YAAY,OAAO,KAAKA,EAAQ,EAAE,CAAC,CAAC,KAAI,MAAK,CAACC,GAAG,CAAC,GAAG,IAAI,IAAID,EAAQ,KAAI,MAAQzlB,EAAK0lB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IACpGD;EAMH,AAJA,KAAKN,KAAWK,GAChB,KAAKF,KAAe,OAAO,KAAKE,CAAU,CAAC,CAAC,SAAS,GACrD,KAAK3c,GAAO,gBAAgB,aAAa,KAAKyc,EAAY,GAE1D,KAAKC,GAAgB;CACtB;CAEA,KAAkB;EAEjB,IAAMxZ,IADW,KAAKlM,GAAM,KACA,SAAS,GAC/Be,IAAS,KAAKf,GAAM,KAAK,cAAc,GACvC8lB,IAAa,KAAK9c,GAAO,OACzBqa,IAAa,KAAKrjB,GAAM;EAI9B,IAAI,EAFe,OAAO,KAAK,KAAKslB,EAAQ,CAAC,CAAC,SAAS,IAEtC;GAMhB,AALApZ,EAAW,SAAQ,MAAU;IAC5B,AAAItK,GAAQ,GAAG,IAAIlC,EAAW,KAAK,MAAM,YACxC,EAAO,EAAE,EAAEA,EAAW,KAAK,MAAM,OAAO,CAAComB,KAAc;GAEzD,CAAC,GACD,KAAK9c,GAAO,WAAW;GACvB;EACD;EAEA,IAAM+c,IAAc,OAAO,QAAQ,KAAKT,EAAQ,CAAC,CAAC,KAAK,CAACU,GAAWC,OAAmB;GACrF,IAAMC,IAASF,EAAU,SAAS,OAAO,KAAKA,EAAU,SAAS,OAAO,KAAKA,EAAU,SAAS,WAAW;GAC3G,OAAO;IACN;IACA;IACA,UAAWE,IAAqC,KAA5BnlB,EAAO,QAAQilB,CAAS;IAC5C,YAAY,IAAI,IAAIC,CAAa;GAClC;EACD,CAAC;EAgCD,AA9BA/Z,EAAW,SAAS,GAAQ,MAAc;GACzC,IAAI,CAACtK,GAAQ;GAEb,AAAKA,EAAO,EAAE,EAAElC,EAAW,KAAK,MAAM,YACrC,EAAO,EAAE,EAAEA,EAAW,KAAK,MAAM,UAAU,CAAC;GAG7C,IAAIymB,IAAS;GAEb,KAAK,IAAIpjB,IAAI,GAAGA,IAAIgjB,EAAY,QAAQ,KAAK;IAC5C,IAAM,EAAE,cAAW,WAAQ,aAAU,kBAAeA,EAAYhjB,IAC5DwS;IAQJ,IANI2Q,KAAU7C,IACb,IAAMA,EAAW,SAAS2C,GAAWpkB,GAAQwkB,CAAS,IAC5ChL,KAAY,KAAKxZ,EAAO,MAClC,IAAMA,EAAO,EAAEwZ,KAGZ,CAACiL,EAAW,IAAI9Q,CAAG,GAAG;KACzB,IAAS;KACT;IACD;GACD;GAEA,EAAO,EAAE,EAAE7V,EAAW,KAAK,MAAM,OAAO,CAAComB,KAAcK;EACxD,CAAC,GAED,KAAKnd,GAAO,UAAU,MAAM,GAE5B,KAAKA,GAAO,WAAW;CACxB;AACD;AAEK,eAAe,IAAI,yBAAyB,KAChD,eAAe,OAAO,2BAA2BqZ,CAAoB,GAGjE,eAAe,IAAI,0BAA0B,KACjD,eAAe,OAAO,4BAA4ByC,CAAqB;;ACtfxE,IAAawB,IAAb,MAAqB;CACpB;CACA;CAEA,KAAW,CAAC;CAEZ,YAAY,GAAO;EAIlB,AAHA,KAAKtd,KAAShE,GACd,KAAKhF,KAAQgF,EAAM,YAAY,CAAC,CAAC,MAEjC,iBAAiB;GAChB,KAAK8O,GAAY;EAClB,GAAG,GAAG;CACP;CAEA,KAAc;EAEb,KAAK9K,GAAO,iBAAiB,OAAO,CAAC,CAAC,SAAQ,MAAO;GAEpD,EAAI,iBAAiB,aAAa,MAAM;IAEvC,IAAM+L,IAAO,EAAE,OAAO,QAAQ,QAAQ;IAKtC,IAJI,CAACA,KAAQA,EAAK,UAAU,SAAS,gBAAgB,KAEjD,CAAC,SAAQ,eAAe,CAAC,CAAC,SAAS,EAAE,OAAO,OAAO,KAEnD,EAAE,WAAW,KAAK,EAAE,WAAWA,EAAK,cAAc,GAAG;IAEzD,IAAM9U,IAAO,KAAK+I,GAAO,YAAY,CAAC,CAAC;IAGvC,AADA,EAAK,UAAU,IACf,iBAAiB;KAChB,IAAI;MACH,KAAKud,GAAY,GAAGxR,CAAI;KACzB,UAAU;MACT,EAAK,UAAU;KAChB;IACD,CAAC;GACF,CAAC;EACF,CAAC;CACF;CAEA,GAAY,GAAG,GAAM;EACpB,IAAMnU,IAAWmU,EAAK,QAAQ,KACxBzE,IAAKyE,EAAK,QAAQ,IAAI,GACtBtE,IAAcH,IAAKA,EAAG,QAAQ,UAAU,OAAOA,EAAG,eAAe,IAAI;EAE3E,IAAI1P,MAAa,KAAA,GAAW;EAE5B,IAAM6K,IAAc,KAAKzC,GAAO;EAChC,IAAI,CAACyC,GAAa;EAElB,IAAI+a,IAAU,MACVC,IAAU;EAYd,IAVAhb,EAAY,iBAAiB,oBAAoB7K,EAAS,GAAG,CAAC,CAAC,SAAQ,MAAO;GAK7E,AAJIqT,EAAI,QAAQ,SACf,IAAUA,EAAI,QAAQ,OAGnBA,EAAI,QAAQ,SACf,IAAUA,EAAI,QAAQ;EAExB,CAAC,GAEG,CAACuS,KAAW,CAACC,GAAS;EAE1B,IAAMC,IAAQ3R,EAAK,UAAU,SAAS,KAAK,GACrC4R,IAAS5R,EAAK,UAAU,SAAS,MAAM;EAE7C,AAAI,CAAC,EAAE,WAAW,CAAC,EAAE,aACpB,KAAKiQ,KAAW,CAAC;EAGlB,IAAM4B,IAAmB,KAAK5B,GAAS,WACtC,MAAM6B,EAAE,aAAajmB,KAAYimB,EAAE,gBAAgBpW,KAAgBoW,EAAE,YAAYL,CAClF,GAEMM,IAAW;GAChB;GACA;GACA,SAASN,KAAWC;GACpB,SAASD,KAAWC;GACpB,MAAMA;GACN,KAAK;GACL,aAAaA,KAAW,GAAQ,MAAQ,KAAKzmB,GAAM,WAAWymB,GAAS7kB,GAAQnB,CAAG,IAAI;EACvF;EAoBA,AAlBI,CAACimB,KAAS,CAACC,IACVC,KAAoB,IACvB,KAAK5B,GAAS4B,EAAiB,CAAC,MAAM,KAEtC,KAAK5B,GAAS,KAAK;GAAE,GAAG8B;GAAU,KAAK;EAAK,CAAC,IAEpCJ,IACNE,KAAoB,IACvB,KAAK5B,GAAS4B,EAAiB,CAAC,MAAM,KAEtC,KAAK5B,GAAS,KAAK;GAAE,GAAG8B;GAAU,KAAK;EAAM,CAAC,IAG/C,KAAK9B,KAAW,KAAKA,GAAS,QAC7B,MAAK,EAAG6B,EAAE,aAAajmB,KAAYimB,EAAE,gBAAgBpW,KAAgBoW,EAAE,YAAYL,EACpF,GAGD,KAAKO,GAAchS,CAAI;CACxB;CAEA,GAAc,GAAM;EAKnB,AAHA,KAAK/L,GAAO,KAAK,WAAW,KAAKgc,EAAQ,GACzC,KAAKgC,GAAc,GACnB,KAAKhe,GAAO,WAAW,GACvB,4BAA4B;GAC5B,IAAMmY,IAAQ,KAAKnY,GAAO,iBAAiB,8BAA8B;GAczE,AAZAmY,EAAM,SAAQ,MAAO;IAGpB,AAFAlN,EAAI,UAAU,OAAO,oBAAoB,qBAAqB,mBAAmB,GAE7Ec,EAAK,UAAU,SAAS,KAAK,IAChCd,EAAI,UAAU,IAAI,kBAAkB,IAC1Bc,EAAK,UAAU,SAAS,MAAM,IACxCd,EAAI,UAAU,IAAI,mBAAmB,IAErCA,EAAI,UAAU,IAAI,mBAAmB;GAEvC,CAAC,GAED,4BAA4B;IAC3B,EAAM,SAAQ,MAAO;KACpB,EAAI,UAAU,OAAO,oBAAoB,qBAAqB,mBAAmB;IAClF,CAAC;GACF,CAAC;EACD,CAAC;CACF;CAEA,KAAgB;EAKf,AAJA,KAAKjL,GAAO,iBAAiB,oBAAoB,CAAC,CAAC,SAAQ,MAAM;GAChE,EAAG,UAAU,OAAO,OAAO,MAAM;EAClC,CAAC,GAEG,KAAKgc,GAAS,WAAW,KAI7B,KAAKA,GAAS,SAAQ,MAAW;GAChC,IAAM,EAAE,aAAU,gBAAa,WAAQiC;GAEvC,IAAIrmB,MAAa,KAAA,GAAW;IAC3B,IAAIoP,IAAW,oBAAoBpP,EAAS;IAM5C,AALI6P,MAAgB,KAAA,MACnB,IAAW,yBAAyBA,EAAY,gBAAgB7P,EAAS,MAI1E,KAD+BoI,GAAO,iBAAiBgH,CACvC,CAAC,CAAC,SAAQ,MAAQ;KACjC,EAAK,UAAU,IAAIkX,IAAM,QAAQ,MAAM;IACxC,CAAC;GACF;EACD,CAAC;CACF;CAEA,UAAU;EAOT,AANA,KAAKlC,KAAW,CAAC,GACb,KAAKhc,GAAO,QACf,KAAKA,GAAO,KAAK,aAAa,GAG/B,KAAKge,GAAc,GACnB,KAAKhe,GAAO,YAAY,QAAQ,EAAI;CACrC;AACD,GC3Kame,IAAb,MAAuB;CACtB;CACA;CACA,KAAkB,CAAC;CAEnB,KAAe,CAAC;CAEhB,KAAwB;CAExB,YAAY,GAAO;EAIlB,AAHA,KAAKne,KAAShE,GACd,KAAKhF,KAAQgF,EAAM,YAAY,CAAC,CAAC,MAEjC,KAAK,QAAQ;CACd;CAEA,YAAY,GAAI,MAAU;EAEzB,IAAI,CAAC,KAAKoiB,IAAuB;GAChC,IAAM/kB,IAAU,KAAKrC,GAAM,KAAK,SAAS;GACzC,KAAKonB,KAAwB,KAAKC,GAAa,KAAI,MAAOhlB,EAAQ5B,EAAI;EACvE;EAEA,IAAM6mB,IAAiB,KAAKF;EAE5B,IAAI9mB,KAA2B,MAC9B,OAAOgnB;EAGR,IAAIhnB,IAAK,KAAKA,KAAMgnB,EAAe,QAAQ,OAAO;EAElD,IAAM/mB,IAAe+mB,EAAehnB;EACpC,IAAIE,KAAS,MAAM;GAElB,IAAMC,IADS,KAAKT,GAAM,KAAK,cACd,CAAC,CAAC,QAAQQ,CAAK;GAChC,OAAQC,KAAO,KAAKF,EAAa,IAAKA,EAAa,EAAEE,KAAO;EAC7D;EAEA,OAAOF;CACR;CAEA,cAAc;EACb,IAAI,CAAC,KAAK6mB,IAAuB;GAChC,IAAM/kB,IAAU,KAAKrC,GAAM,KAAK,SAAS;GACzC,KAAKonB,KAAwB,KAAKC,GAAa,KAAI,MAAOhlB,EAAQ5B,EAAI;EACvE;EAEA,OAAO,KAAK2mB,GAAsB;CACnC;CAEA,OAAO,GAAI,MAAU;EACpB,IAAME,IAAiB,KAAK,SAAS,GAC/BvmB,IAAS,KAAKf,GAAM,KAAK,gBAAgB,KAAK,CAAC;EAErD,IAAIM,KAA2B,MAC9B,OAAOgnB,EAAe,KAAI,MAAU,KAAKC,GAAY3lB,GAAQb,CAAM,CAAC;EAGrE,IAAIT,IAAK,KAAKA,KAAMgnB,EAAe,QAAQ,OAAO;EAElD,IAAM/mB,IAAe+mB,EAAehnB;EACpC,IAAI,CAACC,GAAc,OAAO;EAE1B,IAAIC,KAAS,MAAM;GAClB,IAAMC,IAAMM,EAAO,QAAQP,CAAK;GAChC,OAAQC,KAAO,KAAKF,EAAa,IAAKA,EAAa,EAAEE,KAAO;EAC7D;EAEA,OAAO,KAAK8mB,GAAYhnB,GAAcQ,CAAM;CAC7C;CAEA,MAAe,GAAG,MAAW;EAC5B,IAAI,CAACW,GAAG,OAAO;EACf,IAAMsS,IAAI,CAAC;EAMX,OALAjT,EAAO,SAAS,GAAO,MAAM;GAC5B,EAAEP,KAASkB,EAAE,IAAIA,EAAE,EAAEqB,KAAKrB,EAAElB;EAC7B,CAAC,GACGkB,EAAE,MAAG,EAAE,IAAIA,EAAE,IACbA,EAAE,MAAG,EAAE,IAAIA,EAAE,IACVsS;CACR;CAEA,gBAAgB;EAEf,KAAKoT,KAAwB;EAE7B,IAAMlb,IAAa,KAAKlM,GAAM,KAAK,SAAS,GACxC2Q,IAAU,CAAC;EAYf,AAXAzE,EAAW,SAAS,GAAQ,MAAM;GACjC,IAAI,CAACtK,GAAQ;GACb,IAAM4lB,IAAa5lB,EAAO,GAAG,IAAIlC,EAAW,KAAK,MAAM;GACvD,AAAI8nB,KAAcA,EAAW,KAAKxe,GAAO,WAAW,MACpD2H,EAAQ,KAAK5N,CAAC;EACf,CAAC,GAEG,KAAK0kB,GAAgB,SAAS,MACjC,IAAU,KAAKV,GAAcpW,GAASzE,CAAU,IAGjD,KAAKmb,KAAe1W;EACpB,IAAMvQ,IAAeuQ,EAAQ,KAAI,MAAOzE,EAAWzL,EAAI,GAEjD+K,IAAe,KAAKxC,GAAO,UAAU,WAAW,CAAC;EACvD,IAAIwC,EAAa,SAAS,GAAG;GAC5B,IAAMkc,IAAc1b,EAAS,MAAM5L,GAAcoL,GAAc,KAAKxL,GAAM,KAAK,cAAc,CAAC;GAI9F,AAFA,KAAKonB,KAAwBM,EAAY,aAEzC,KAAK1e,GAAO,SAAS,YAAY0e,EAAY,QAAQ;EACtD,OACC,KAAKN,KAAwBhnB;CAK/B;CAEA,cAAc,MAAY;EAEzB,AADA,KAAKqnB,KAAkBE,KAAW,CAAC,GACnC,KAAK,QAAQ;CACd;CAEA,mBACQ,KAAKF;CAGb,qBAAqB;EAEpB,AADA,KAAKA,KAAkB,CAAC,GACxB,KAAK,QAAQ;CACd;CAGA,MAAiB,GAAS,MAAiB;EAE1C,IAAM1mB,IAAS,OAAO,KAAKf,GAAM,KAAK,iBAAkB,aAAa,KAAKA,GAAM,KAAK,cAAc,IAAI,CAAC,GAElG4nB,IAAe,KAAKH,GAAgB,KAAI,OAAS;GACtD,GAAGI;GACH,UAAU9mB,EAAO,QAAQ8mB,EAAK,WAAWA,EAAK,OAAO;EACtD,EAAE;EAEF,OAAOlX,EAAQ,MAAM,GAAM,MAAS;GACnC,IAAMpO,IAAInC,EAAa0nB,IACjBxlB,IAAIlC,EAAa2nB;GAEvB,KAAK,IAAMF,KAAQD,GAAc;IAChC,IAAMlB,IAAQmB,EAAK,KACb1jB,IAAO0jB,EAAK,MACd9D,GAAMC;IAEV,AAAI7f,KACH,IAAO,KAAKnE,GAAM,WAAW,SAASmE,GAAM5B,GAAGulB,CAAI,GACnD,IAAO,KAAK9nB,GAAM,WAAW,SAASmE,GAAM7B,GAAGylB,CAAI,KAE/CF,EAAK,YAAY,KAAKtlB,EAAE,KAAKD,EAAE,MAClC,IAAOC,EAAE,EAAEslB,EAAK,WAChB,IAAOvlB,EAAE,EAAEulB,EAAK;IAIlB,IAAMG,IAAYjE,KAAS,QAA8BA,MAAS,IAC5DkE,IAAYjE,KAAS,QAA8BA,MAAS;IAElE,IAAI,OAAYiE,IAChB;SAAID,GAAU,OAAO;KACrB,IAAIC,GAAU,OAAO;KAErB,IAAIlE,MAASC,GAAM;MAClB,IAAI3J,IAAO;MAEX,IAAI,OAAO0J,KAAS,YAAY,OAAOC,KAAS,UAC/C,IAAOD,IAAOC;WACR;OACN,IAAMkE,IAAO,OAAOnE,CAAI,GAClBoE,IAAO,OAAOnE,CAAI;OACxB,IAAOkE,IAAOC,IAAO,IAAKD,IAAOC,IAAO,KAAK;MAC9C;MAEA,IAAI9N,MAAS,GACZ,OAAOqM,IAAQrM,IAAO,CAACA;KAEzB;IAjBqB;GAkBtB;GAEA,OAAOyN,IAAOC;EACf,CAAC;CACF;AACD,GC1LaK,IAAb,MAAaA,EAAY;CAErB,OAAO,gBAAgB,GAAM,GAAK;EA2B9B,OAzBAA,EAAYC,GAAgBrkB,CAAG,GAC/BokB,EAAYE,GAAatkB,CAAG,GAC5BokB,EAAYG,GAAqBvkB,CAAG,GAEpCokB,EAAYI,GAAoBxkB,CAAG,GAEnCokB,EAAYK,GAAwBzkB,CAAG,GAEvCkP,EAAc,cAAclP,GAAKA,EAAI,iBAAiB,UAAU,CAAC,GACjEkP,EAAc,cAAclP,GAAKA,EAAI,iBAAiB,kCAAgC,CAAC,GACvFkP,EAAc,cAAclP,GAAKA,EAAI,iBAAiB,wCAAsC,CAAC,GAC7FkP,EAAc,cAAclP,GAAKA,EAAI,iBAAiB,UAAU,CAAC,GAEjEokB,EAAYM,GAAoB1kB,CAAG,GAEnCokB,EAAYO,GAAgC3kB,CAAG,GAE/CokB,EAAYQ,GAAc3oB,GAAM+D,CAAG,GAEnCokB,EAAYS,GAAkB7kB,CAAG,GAEjCokB,EAAYU,GAAmB7oB,GAAM+D,CAAG,GAExCokB,EAAYW,GAAwB/kB,CAAG,GAEhCA;CACX;CAEA,OAAO0kB,GAAoB,GAAK;EAC5B,IAAMM,IAAQhlB,EAAI,cAAc,OAAO;EACvC,IAAI,CAACglB,KAASA,EAAM,cAAc,yBAAyB,GAAG;EAE9D,IAEM1Y,IAAK0Y,EAAM,UAAU,CAAC;EAG5B,AAFA1Y,EAAG,aAAa,QAAQ,KAAK,GAC7BA,EAAG,UAAU,IAAI,wBAAwB,GACzCA,EAAG,UAAU,IAAI,UAAU;EAE3B,IAAM2Y,IAAWjlB,EAAI,cAAc,UAAU;EAC7C,IAAI,CAACilB,GAAU;EAEf,IAAIC,IAAM;EACV,EAAS,iBAAiB,QAAQ,CAAC,CAAC,SAAQ,MAAM;GAC9C,IAAI,CAACC,EAAG,UAAU,SAAS,OAAO,GAAG;IACjC,IAAMxV,IAAUwV,EAAG,WAAW;IAC9B,KAAK,IAAIpmB,IAAI,GAAGA,IAAI4Q,GAAS,KAAK;KAC9B,IAAM9U,IAAO,oEAAO,QAAQ,QAAQqqB,CAAG,CAAC,CAAC,QAAQ,SAASd,EAAYgB,GAAe,GAAK,CAAC;KAC3F,EAAG,mBAAmB,aAAavqB,CAAI;IAC3C;GACJ;EACJ,CAAC;EAED,IAAM2U,IAAO,MAAM,KAAKxP,EAAI,iBAAiB,cAAc,CAAC;EAC5D,EAAG,iBAAiB,gBAAgB,CAAC,CAAC,SAAS,GAAI,MAAM;GACrD,IAAMqlB,IAAa7V,EAAKzQ,EAAE,CAAC,aAAa,YAAY;GACpD,AAAIsmB,MACA,EAAG,MAAM,aAAaA;EAE9B,CAAC;CACL;CAEA,OAAOD,GAAe,GAAK;EACvB,IAAIziB,IAAO;EACX,KAAK,IAAI,IAAI2iB,GAAK,KAAK,GAAG,IAAI,KAAK,MAAM,IAAI,EAAE,IAAI,GAC/C,IAAO,OAAO,aAAa,KAAM,IAAI,EAAG,IAAI3iB;EAEhD,OAAOA;CACX;CAEA,OAAO4hB,GAAqB,GAAK;EAC7B,IAAIrX,IAAQlN,EAAI,cAAc,6BAA6B;EAE3D,IAAKkN,GAEL;GAEA,IAFAA,EAAM,UAAU,IAAI,MAAM,GAEtB,CAAClN,EAAI,cAAc,YAAY,GAAG;IAClC,IAAMulB,IAAY,SAAS,cAAc,OAAO;IAEhD,AADAA,EAAU,UAAU,IAAI,MAAM,GAC9BrY,EAAM,OAAOqY,CAAS;GAC1B;GAEA,IAAI,CAACvlB,EAAI,cAAc,YAAY,GAAG;IAClC,IAAMwlB,IAAY,SAAS,cAAc,OAAO;IAEhD,AADAA,EAAU,UAAU,IAAI,MAAM,GAC9BtY,EAAM,MAAMsY,CAAS;GACzB;EAZ0B;CAa9B;CAEA,OAAOnB,GAAgB,GAAK;EACxB,IAAI3H,IAAW1c,EAAI,cAAc,UAAU;EAM3C,IALK0c,MACD,IAAW,SAAS,cAAc,UAAU,GAC5C1c,EAAI,QAAQ0c,CAAQ,IAGpBA,EAAS,iBAAiB,KAAK,CAAC,CAAC,WAAW,GAAG;GAC/C,IAAMuI,IAAWjlB,EAAI,cAAc,UAAU,GACzCylB,IAAW;GAMf,AALIR,MACA,IAAW,MAAM,KAAKA,EAAS,iBAAiB,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAK,MAC7DS,KAAO,SAAS3U,EAAK,aAAa,SAAS,KAAKA,EAAK,SAAS,EAAE,KAAK,IAC7E,CAAC,IAER,IAAW,KAAK,IAAI0U,GAAU,CAAC;GAE/B,KAAK,IAAI1mB,IAAI,GAAGA,IAAI0mB,GAAU,KAAK;IAC/B,IAAMvV,IAAM,SAAS,cAAc,KAAK;IACxC,EAAS,YAAYA,CAAG;GAC5B;EACJ;CACJ;CAEA,OAAOuU,GAAwB,GAAK;EAChC,IAAMjV,IAAO,MAAM,KAAKxP,EAAI,iBAAiB,cAAc,CAAC;EAC5D,IAAIwP,EAAK,WAAW,GAAG;EAEvB,IAAMmW,IAAiB3lB,EAAI,eAAe,GACpC4lB,IAAe,KAAK,IAAI,KAAK,MAAMD,IAAiBnW,EAAK,MAAM,GAAG,GAAG;EAE3E,EAAK,SAAS,GAAK,MAAM;GAErB,AAAKU,EAAI,aAAa,UAAU,KAC5BA,EAAI,aAAa,YAAYnR,CAAC;GAGlC,IAAM4V,IAAQzE,EAAI,aAAa,OAAO,KAAK,SAASA,EAAI,MAAM,OAAO,EAAE,KAAK0V;GAC5E,EAAI,aAAa,SAASjR,CAAK;GAE/B,IAAMkR,IAAW,OAAOlR,CAAK,CAAC,CAAC,SAAS,IAAI,IAAIA,IAAQ,GAAGA,EAAM;GACjE,EAAI,MAAM,QAAQkR;EACtB,CAAC;CACL;CAEA,OAAOvB,GAAa,GAAK;EACrB,IAAItkB,EAAI,cAAc,OAAO,GAAG;EAEhC,IAAMglB,IAAQ,SAAS,cAAc,OAAO,GACtCtI,IAAW1c,EAAI,cAAc,UAAU;EAE7C,AAAI0c,IACAA,EAAS,MAAMsI,CAAK,IAEpBhlB,EAAI,QAAQglB,CAAK;CAEzB;CAEA,OAAOL,GAAgC,GAAK;EAExC,EADoB,iBAAiB,oBAC/B,CAAC,CAAC,SAAQ,MAAQ;GAEpB,AADoB5T,EAAK,aAAa,WAAW,MAAM,UACpCA,EAAK,aAAa,aAAa,MAAM,UACpDA,EAAK,aAAa,eAAe,MAAM;EAE/C,CAAC;CACL;CAEA,OAAO6T,GAAc,GAAM,GAAM;EAE7B,IAAMkB,IAAmB;GAAC;GAAa;GAAa;EAAM,GACtDC,IAAgB;EAiDpB,AA/CAC,EAAK,iBAAiB,oBAAoB,CAAC,CAAC,SAAQ,MAAS;GAEzD,IAAMC,IAAU,QADCve,EAAM,aAAa,WAAW,KAAK,cAG9Cwe,IAAYxe,EAAM,cAAc,UAAU;GAEhD,IAAIwe,GAAW;IACX,IAAItiB,IAAI,CAAC;IACT,EAAU,iBAAiB,QAAQ,CAAC,CAAC,SAAQ,MAAW;KACpD,EAAE,KAAK;MACH,GAAGuiB,EAAQ,aAAa,GAAG;MAC3B,GAAGA,EAAQ,aAAa,GAAG;MAC3B,OAAOA,EAAQ,aAAa,OAAO;KACvC,CAAC;IACL,CAAC;IAED,IAAMC,IAAiB,QAAQ,KAAK,IAAI,EAAE,GAAG,EAAEL;IAQ/C,AANI9pB,MACA,EAAKmqB,WAAwBxiB,IAGjC8D,EAAM,aAAa,eAAe,QAAQ0e,EAAe,GAAG,GAE5DF,EAAU,OAAO;GACrB;GAEA,IAAM/lB,IAAOuH,EAAM,QAAQ;GAiB3B,AAhBIvH,KACAuH,EAAM,aAAa,aAAazL,EAAK,WAAW,WAAWkE,CAAI,CAAC,GAGpE,MAAM,KAAKuH,EAAM,UAAU,CAAC,CAAC,SAAQ,MAAQ;IACzC,AAAI;KAAC;KAAa;KAAa;KAAa;IAAW,CAAC,CAAC,SAASxH,EAAK,IAAI,MACvEA,EAAK,MAAM,SAAS,OAAO,KAAKA,EAAK,MAAM,SAAS,OAAO,MAC3DwH,EAAM,aAAaxH,EAAK,MAAMjE,EAAK,WAAW,WAAWiE,EAAK,KAAK,CAAC;GAE5E,CAAC,GAMD,EAAM,YAAY,IAAI+lB,EAAQ,GAJXH,EACd,QAAO,MAAQpe,EAAM,aAAaxH,CAAI,CAAC,CAAC,CACxC,KAAI,MAAQ,GAAGA,EAAK,IAAIwH,EAAM,aAAaxH,CAAI,EAAE,EAEZ,CAAC,CAAC,KAAK,GAAG,EAAE,KAAK+lB,EAAQ,IACnEve,EAAM,aAAa,YAAY,GAAG;EACtC,CAAC,GAEDse,EAAK,iBAAiB,wCAAwC,CAAC,CAAC,SAAQ,MAAS;GAC7E,IAAMK,IAAW3e,EAAM,aAAa,WAAW;GAC/C,IAAI2e,GAAU;IACV,IAAMC,IAAkB5e,EAAM,WACxBue,IAAU,QAAQI;IAKxB,EAAM,YAAY,IAAIJ,EAAQ,GAJXH,EACd,QAAO,MAAQpe,EAAM,aAAaxH,CAAI,CAAC,CAAC,CACxC,KAAI,MAAQ,GAAGA,EAAK,IAAIwH,EAAM,aAAaxH,CAAI,EAAE,EAEZ,CAAC,CAAC,KAAK,GAAG,EAAE,YAAYomB,EAAgB,MAAML,EAAQ;GACpG;EACJ,CAAC;CACL;CAEA,OAAOnB,GAAmB,GAAM,GAAK;EACjC,IAAMyB,IAAatqB,EAAK,aAAa,WAAW,MAAM,QAChDuqB,IAAcxmB,EAAI,aAAa,WAAW,MAAM;EAEtD,EAAI,iBAAiB,oFAAoF,CAAC,CAAC,SAAQ,MAAQ;GACvH,IAAMymB,IAAiB1V,EAAK,aAAa,WAAW,MAAM,UAAUyV,KAAeD;GAInF,AAFAxV,EAAK,aAAa,aAAa0V,IAAiB,SAAS,OAAO,GAE5DA,KACA1V,EAAK,YAAY,SAAS,cAAc,0BAA0B,CAAC;EAE3E,CAAC;CACL;CAEA,OAAO8T,GAAkB,GAAK;EAE1B,EAAI,iBAAiB,oBAAoB,CAAC,CAAC,SAAQ,MAAQ;GAEvD,IADsB9T,EAAK,aAAa,aAAa,MAAM,UAAUA,EAAK,aAAa,YAAY,MAAM,QACrF;GAEpB,IAAMnU,IAAW,SAASmU,EAAK,QAAQ,KAAK,EAAE,GACxCpB,IAAUoB,EAAK,WAAW,GAC1Bb,IAAMlQ,EAAI,cAAc,0BAA0BpD,EAAS,GAAG,GAE9D8pB,IAAexW,KAAO,SAASA,EAAI,aAAa,OAAO,GAAG,EAAE,KAAK;GAEvE,CAAI,CAACa,EAAK,QAAQ,eAAe,SAASA,EAAK,QAAQ,aAAa,EAAE,KAAA,QAClE,EAAK,QAAQ,cAAc,OAAO2V,IAAA,KAAiCA,IAAe,GAAG;GAGzF,IAAIC,IAAY5V,EAAK,cAAc,uBAAuB;GAQ1D,IAPK4V,MACD,IAAY,SAAS,cAAc,uBAAuB,GAC1D5V,EAAK,aAAa4V,GAAW5V,EAAK,UAAU,IAG5BA,EAAK,aAAa,WAAW,MAAM,QAEtC;IAIb,AAHA4V,EAAU,UAAU,IAAI,WAAW,GACnCA,EAAU,UAAU,OAAO,QAAQ,GACnCA,EAAU,aAAa,aAAa,MAAM,GAC1C,EAAK,MAAM,QAAQ;IAEnB,IAAMC,IAAc,KAAK,IAAI,IAAI,KAAK,MAAA,KAAwBjX,CAAO,CAAC;IACtE,IAAI,CAAC,MAAM/S,CAAQ,GACf,KAAK,IAAImC,IAAI,GAAGA,IAAI4Q,GAAS,KAAK;KAC9B,IAAMgN,IAAY3c,EAAI,cAAc,0BAA0BpD,IAAWmC,EAAE,GAAG;KAC9E,AAAI4d,MACAA,EAAU,aAAa,SAASiK,CAAW,GAC3C,EAAU,MAAM,QAAQ,GAAGA,EAAY;IAE/C;GAER,OAII,AAHAD,EAAU,UAAU,OAAO,WAAW,GACtCA,EAAU,UAAU,IAAI,QAAQ,GAChCA,EAAU,aAAa,aAAa,OAAO,GAC3C,EAAK,MAAM,QAAQ;EAE3B,CAAC;CACL;CAEA,OAAOnC,GAAoB,GAAK,GAAM;EAElC,IAAMvpB,IAAI+E,EAAI,aAAa,eAAe,MAAM,SAAS,KAAK,GAExD0c,IAAW1c,EAAI,cAAc,UAAU,GAGvCkQ,IAAM,SAAS,cAAc,KAAK;EAQxC,AANAA,EAAI,aAAa,SAAS,MAAM,GAChCA,EAAI,aAAa,SAASjV,CAAC,GAC3B,EAAI,MAAM,QAAQ,GAAGA,EAAE,KACvByhB,EAAS,QAAQxM,CAAG,GAGpBlQ,EAAI,iBAAiB,qBAAqB,CAAC,CAAC,SAAQ,MAAW;GAC3D,IAAM6mB,IAAO,MAAM,KAAKC,EAAQ,iBAAiB,IAAI,CAAC;GACtD,IAAID,EAAK,WAAW,GAAG;GAEvB,IAAMpc,IAAUoc,EAAK,IAEfE,IAAgB,SAAS,cAAc,IAAI;GAQjD,AAPA,EAAc,YAAY,iBAC1BA,EAAc,aAAa,aAAa,eAAe,GAEnDF,EAAK,SAAS,MACd,EAAc,UAAUA,EAAK,SAGjCpc,EAAQ,aAAasc,GAAetc,EAAQ,iBAAiB;EACjE,CAAC;CACL;CAEA,OAAOsa,GAAwB,GAAK;EAEhC,EAAI,iBAAiB,4BAA4B,CAAC,CAAC,SAAQ,MAAQ;GAE/D,IAAMiC,IAAc,SAASjW,EAAK,aAAa,UAAU,GAAG,EAAE;GAC9D,IAAI,MAAMiW,CAAW,GAAG;GAGxB,IAAMrX,IAAU,SAASoB,EAAK,aAAa,SAAS,KAAKA,EAAK,SAAS,EAAE,KAAK,GAC1EoD,IAAa;GAGjB,KAAK,IAAIpV,IAAI,GAAGA,IAAI4Q,GAAS,KAAK;IAC9B,IAAMsX,IAAYD,IAAcjoB,GAC1BmR,IAAMlQ,EAAI,cAAc,0BAA0BinB,EAAU,GAAG;IACrE,AAAI/W,MACA,KAAc,SAASA,EAAI,aAAa,OAAO,GAAG,EAAE,KAAK;GAEjE;GAEA,AAAIiE,IAAa,KACI,GAAGA;EAK5B,CAAC;CACL;AACJ,GCnWa+S,IAAb,MAAsB;CAClB;CACA;CAEA,YAAY,GAAO;EAEf,AADA,KAAKliB,KAAShE,GACd,KAAKhF,KAAQgF,EAAM,YAAY,CAAC,CAAC;CACrC;CAuBA,MAAM;EAEF,WAAW,GAAU,GAAO,IAAgB,SAAS;GAEjD,MADyB,KAAK,KAAKgE,GAAO,iBAAiB,gCAAgCpI,EAAS,GAAG,CAC9F,CAAC,CAAC,SAAQ,MAAO;IAEtB,AADAsT,EAAI,aAAa,SAASyE,CAAK,GAC/B,EAAI,MAAM,QAAQ,GAAGA,EAAM;GAC/B,CAAC;EAEL;EAGA,WAAW,MAAa;GACpB,IAAMwS,IAAQ,KAAKniB,GAAO,cAAc,gCAAgCpI,EAAS,GAAG;GAEpF,OADKuqB,KACE,SAASA,EAAM,aAAa,OAAO,KAAKA,EAAM,MAAM,OAAO,EAAE,KAAK;EAC7E;EACA,4BAA4B,GAAM,MAAc;GAE5C,IAAM/P,IAAW,KAAKpb,GAAM,OAAO,IAAI,CAAC,CAAC,QAAQkb,EAAU,QAAQ,IAAI,GAEjEG,IADgB,OAAO,iBAAiBH,CACrB,CAAC,CAAC,QAAQ,mBAC/BK,IAAe;GAUnB,OARA,KAAKvS,GAAO,KAAK,SAAS,CAAC,CAAC,SAAS,GAAQ,MAAQ;IACjD,IAAMuM,IAAM,OAAO2F,EAAU,QAAQ,OAAO,KAAKlb,GAAM,WAAW,SAASkb,EAAU,QAAQ,MAAMtZ,GAAQnB,CAAG,IAAImB,EAAO,EAAEwZ,MAAa,EAAE,CAAC,CAAC,KAAK,GAC3II,IAAO,KAAK,gBAAgBjG,GAAK8F,CAAI;IAC3C,AAAIG,EAAK,SAASA,EAAK,QAAQD,MAC3B,IAAeC,EAAK;GAE5B,CAAC,GAEMD;EACX;EAEA,UAAU,MAAa;GACnB,IAAMxG,IAAO,KAAK/L,GAAO,cAAc,sBAAsBpI,EAAS,GAAG,GACnEsa,IAAY,KAAKlS,GAAO,cAAc,yBAAyBpI,EAAS,GAAG;GAEjF,AAAKmU,KAASmG,KAEd,KAAKlb,GAAM,cAAc;IACrB,IAAMyb,IAAkB,KAAK,IAAI,0BAA0B1G,GAAMmG,CAAS;IAC1E,AAAIO,MAAoB,QACpB,KAAK,IAAI,SAAS7a,GAAU6a,CAAe;GAEnD,CAAC;EACL;EAGA,aAAa,GAAU,MAAc;GAKjC,AAHA,KADqBzS,GAAO,iBAAiB,gCAAgCpI,EAAS,mBAAmBA,EAAS,mBAAmBA,EAAS,GACxI,CAAC,CAAC,SAAQ,MAAM;IAClB,EAAG,MAAM,UAAUyV,IAAY,KAAK;GACxC,CAAC,GACD,KAAKrN,GAAO,YAAY,QAAQ;EACpC;CACJ;CAEA,MAAM;EACF,UACQ,KAAKA,GAAO,UAAU,SAAS,IAAU,KACtC,KAAK,MAAM,KAAKA,GAAO,UAAU,SAAS,KAAKA,GAAO,SAAS,MAAM;EAEhF,OAAO,OAAO,GAAO,MAAa;GAE9B,AAAK,KAAKA,GAAO,IAAI,UAAUvG,CAAK,IAQhC,MAAM,IAAI,SAAS,MAAY,sBAAsB2oB,CAAO,CAAC,IAP7D,MAAM,IAAI,SAAS,MAAY;IAC3B,KAAKpiB,GAAO,IAAI,OAAOvG,SAAa;KAChC,EAAQ;IACZ,CAAC;GACL,CAAC;GAOL,IAAM4oB,IAAO,KAAKriB,GAAO,iBAAiB,6BAA6BvG,EAAM,GAAG,GAC1E6oB,IAAa,MAAM,KAAKD,IAAM,MAAO,SAAS1f,EAAI,QAAQ,WAAW,EAAE,CAAC,CAAC,CAAC,QAAO,MAAK,CAAC,MAAM4f,CAAC,CAAC,GAE/F/X,IAAO,CAAC;GAQd,IAPA6X,EAAK,SAAQ,MAAO;IAChB,EAAI,iBAAiB,QAAQ,CAAC,CAAC,SAAQ,MAAS;KAE5C,AADY,SAAS3f,EAAM,QAAQ,KAAK,EAClC,KAAK,KAAG8H,EAAK,KAAK,SAAS9H,EAAM,QAAQ,KAAK,EAAE,CAAC;IAC3D,CAAC;GACL,CAAC,GAEG4f,EAAW,WAAW,KAAK9X,EAAK,WAAW,GAAG;GAElD,IAAM1Q,IAAS,KAAKkG,GAAO,UAAU,SAAS,KAAK,IAAI,GAAGsiB,CAAU,GAAG,KAAK,IAAI,GAAG9X,CAAI,GAAG,KAAK,IAAI,GAAG8X,CAAU,GAAG,KAAK,IAAI,GAAG9X,CAAI,CAAC;GAMpI,OAJI,OAAOgY,KAAa,cACpBA,EAAS,GAGN1oB;EACX;EACA,YAAY,MAAU;GAElB,IAAM2oB,IAAa,KAAKziB,GAAO,cAAc,gBAAgB,GAEvDqiB,IAAOI,EAAW,iBAAiB,gDAAgDhpB,EAAM,GAAG;GAClG,IAAI,CAAC4oB,KAAQA,EAAK,WAAW,GAAG,OAAO;GAEvC,IAAM/T,IAAemU,EAAW,sBAAsB,GAChDlU,IAAckU,EAAW,cAAc,OAAO,CAAC,EAAE,gBAAgB,GACjEC,IAAcD,EAAW,cAAc,OAAO,CAAC,EAAE,gBAAgB,GAEjEE,IAAcrU,EAAa,MAAMC,GACjCqU,IAAiBtU,EAAa,SAASoU,GAEzCrV,IAAY;GAEhB,KAAK,IAAM1K,KAAO0f,GAAM;IACpB,IAAMQ,IAASlgB,EAAI,sBAAsB,GAEnCmgB,IAAUD,EAAO,MAAMF,GACvBI,IAAUF,EAAO,SAASD;IAEhC,IAAIE,KAAWC,GAAS;KACpB,IAAY;KACZ;IACJ;GACJ;GAEA,OAAO1V;EACX;EACA,MAAM,GAAY,MACP,KAAKrW,GAAM,KAAK,IAAIoB,GAAYa,CAAW;EAEtD,SAAS,GAAO,MAAa;GACzB,AAAI,KAAK+G,GAAO,IAAI,UAAUvG,CAAK,IAC3B,OAAO+oB,KAAa,cAAYA,EAAS,IAE7C,KAAKxiB,GAAO,SAASvG,SAAa;IAC9B,AAAI,OAAO+oB,KAAa,cAAYA,EAAS;GACjD,CAAC;EAET;EACA,SAAS,GAAO,GAAY,IAAc,OAAS;GAG/C,IAAMjqB,IADc,KAAKyH,GAAO,KAAK,IAAIvG,CACjB,CAAC,CAAC,EAAE,EAAE/C,EAAW,KAAK,MAAM,QAE9CssB,IAAU,KAAKhsB,GAAM,KAAK,OAAOuB,GAAOH,GAAYa,CAAW;GAQrE,OAPgB,KAAK+G,GAAO,KAAK,SAEP,CAAC,CAAC,WAAU,MAC9B,CAACpH,KAAU,CAACA,EAAO,KAAK,CAACA,EAAO,EAAE,IAAU,KACzCA,EAAO,EAAE,EAAElC,EAAW,KAAK,MAAM,WAAWssB,CAGtC;EACrB;EACA,SAAS,MAAU;GAGf,IAAMzqB,IADc,KAAKyH,GAAO,KAAK,IAAIvG,CACjB,CAAC,CAAC,EAAE,EAAE/C,EAAW,KAAK,MAAM;GAEpD,KAAKM,GAAM,KAAK,OAAOuB,CAAK;EAChC;CACJ;AACJ,GCjLa0qB,IAAb,cAAoC,YAAY;CAC5C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CAEA,KAAU,EACN,OAAO,KACX;CAEA;CAEA,KAAY;EACR,QAAQ;EACR,QAAQ;EACR,SAAS,CAAC;CACd;CAEA,OAAO,iBAAiB;CAExB,cAAc;EAQV,AAPA,MAAM,GAEN,KAAKjsB,KAAQ,KAAK,YAAY,CAAC,CAAC,MAChC,KAAKksB,KAAc,IAAIze,EAAW,IAAI,GAEtC,KAAK0e,KAAO,IAAIjB,EAAS,IAAI,GAE7B,KAAKkB,GAAgB;CACzB;CAEA,oBAAoB;EAChB,KAAK/oB,GAAM;CACf;CAEA,IAAI,WAAW;EAAE,OAAO,KAAKgpB;CAAW;CACxC,IAAI,QAAQ;EAAE,OAAO,KAAKC;CAAQ;CAClC,IAAI,aAAa;EAAE,OAAO,KAAKC;CAAa;CAC5C,IAAI,YAAY;EAAE,OAAO,KAAKC;CAAY;CAC1C,IAAI,WAAW;EAAE,OAAO,KAAKC;CAAW;CACxC,IAAI,WAAW;EAAE,OAAO,KAAKC;CAAW;CACxC,IAAI,SAAS;EAAE,OAAO,KAAKC;CAAS;CACpC,IAAI,aAAa;EAAE,OAAO,KAAKT;CAAa;CAC5C,IAAI,YAAY;EAAE,OAAO,KAAKU;CAAgB;CAC9C,IAAI,aAAa;EAAE,OAAO,KAAKC;CAAiB;CAChD,IAAI,iBAAiB;EAAE,OAAO,KAAKC,GAAQ,MAAM,GAAG,UAAU;CAAG;CAEjE,IAAI,WAAW;EAAE,OAAO,KAAK/lB;CAAW;CAUxC,IAAI,eAAe;EACf,IAAMgmB,IAAW,KAAK,aAAa,cAAc,MAAM,UAAU,KAAK/sB,IAAO,aAAa,cAAc,MAAM,QACxGgtB,IAAkB,KAAKF,GAAQ,OAAO,aAAa,cAAc,MAAM;EAC7E,OAAOC,KAAYC;CACvB;CAEA,IAAI,cAAc;EACd,OAAO,KAAKF,GAAQ;CACxB;CAEA,IAAI,SAAS;EACT,OAAO,KAAKA;CAChB;CAEA,IAAIG,KAAY;EACZ,OAAO,KAAKjtB,GAAM,aAAa,QAAQ,KAAK,KAAKA,GAAM,aAAa,OAAO,MAAM;CACrF;CAEA,YAAY,GAAS,MAAa;EAC9B,KAAK,WAAW,gBAAgBsR,GAAS,OAAOka,CAAQ;CAC5D;CAEA,sBAAsB;EAClB,AAAK,KAAKsB,GAAQ,UAElB5Z,EAAc,UAAU,KAAK4Z,GAAQ,KAAK,GAE1C;GAAC;GAAQ;GAAS;EAAM,CAAC,CAAC,SAAQ,MAAQ;GACtC;IAAC;IAAU;IAAQ;GAAQ,CAAC,CAAC,SAAQ,MAAW;IAC5C,IAAM/c,IAAY,KAAK,cAAc,aAAa+a,EAAQ,iBAAiBhnB,GAAM;IACjF,AAAKiM,KACLA,EAAU,iBAAiB,OAAO,CAAC,CAAC,SAAQ,MAAO/L,EAAI,OAAO,CAAC;GACnE,CAAC;EACL,CAAC,GAED,KAAKkpB,GAAuB,GAE5B,KAAKC,GAAuB,GAE5B,KAAKjB,GAAY,WAAW,GAExB,KAAK,eACL,KAAK,QAAQ,EAAI,IAEjB,KAAK,cAAc,uBAAuB,CAAC,EAAE,QAAQ,GAGzD,4BAA4B;GAExB,AADA,KAAKiB,GAAuB,GAC5B,KAAKjB,IAAa,QAAQ;EAC9B,CAAC;CACL;CAEA,gBAAgB;EAEZ,4BAA4B;GAExB,AAAK,KAAK,UAAU,SAAS,QAAQ,KAAM,KAAKY,GAAQ,UAExD,KAAKK,GAAuB,GAExB,KAAK,eACL,KAAK,QAAQ,EAAI,IAEjB,KAAK,cAAc,uBAAuB,CAAC,EAAE,QAAQ,GAGzD,KAAKC,GAAe,GAEpB,KAAKb,IAAa,cAAc,GAEhC,KAAKL,IAAa,QAAQ;EAC9B,CAAC;CACL;CAEA,WAAuB;EACnB,IAAMmB,IAAS,KAAK,cAAc,0BAA0B,GACtDC,IAAW,KAAK,cAAc,iBAAiB;EACrD,EAAS,MAAM,MAAM,GAAGD,GAAQ,aAAa;CACjD;CAEA,IAAI,OAAO;EAIP,OAHI,CAAC,KAAK7K,MAAS,KAAKxiB,IAAO,SAC3B,KAAKwiB,KAAQ,IAAI2E,EAAU,IAAI,IAE5B,KAAK3E;CAChB;CAEA,mBAAmB;EAMf,AAJA,KAAK,KAAK,QAAQ,GAElB,KAAK0J,GAAY,QAAQ,EAAI,GAEzB,KAAK,gBACL,KAAK,QAAQ,EAAI;CAEzB;CAEA,WAAW,IAAS,OAAS;EACzB,4BAA4B;GACxB,KAAKqB,KAAWC,CAAM;EAC1B,CAAC;CACL;CAEA,MAAY,IAAS,OAAS;EAE1B,IAAMzd,IAAY,KAAK,cAAc,mCAAmC;EACxE,IAAI,CAACA,GAAW;EAEhB,IAAMmI,IAAgB,KAAK,cAAc,mCAAmC;EAC5E,IAAKA,GAEL;OAAIsV,GAAQ;IACR,KAAK,aAAa,gBAAgB,MAAM;IACxC,IAAM7D,IAAiB5Z,EAAU;IACjC,IAAI4Z,KAAkB,GAAG;IAEzB,IAAI8D,IAAqB,GACnBC,IAAU,CAAC;IAEjB,EAAc,iBAAiB,KAAK,CAAC,CAAC,SAAQ,MAAO;KACjD,IAAMlV,IAAiBtE,EAAI,aAAa,UAAU;KAIlD,IAHmB,KAAK,cAAc,sBAAsBsE,EAAe,GAC9C,CAAC,EAAE,aAAa,WAAW,MAAM,QAG1D,EAAQ,QAAQ;MAAE;MAAgB,OAAO;MAAI,aAAa;KAAK,CAAC;UAC7D;MACH,IAAMvZ,IAAI,SAASiV,EAAI,aAAa,OAAO,GAAG,EAAE,KAAK;MAErD,AADAwZ,EAAQ,KAAK;OAAE;OAAgB,OAAOzuB;OAAG,aAAa;MAAM,CAAC,GAC7D,KAAsBA;KAC1B;IACJ,CAAC;IAED,IAAM0uB,IAAsBD,EACvB,QAAO,MAAK9Z,EAAE,WAAW,CAAC,CAC1B,QAAQ,GAAK,MAAM8V,IAAM9V,EAAE,OAAO,CAAC,GAElCga,IAAiB,KAAK,IAAI,GAAGjE,IAAiBgE,CAAmB;IAEvE,IAAIF,IAAqB,KAAKC,EAAQ,SAAS,GAAG;KAC9C,IAAIG,IAAiB,GAEfC,IAAiBJ,EAAQ,KAAI,MAAQ;MACvC,IAAIvtB,EAAK,aACL,OAAO;OAAE,gBAAgBA,EAAK;OAAgB,WAAW;OAAG,OAAO;MAAG;MAG1E,IAAM4tB,IAAc5tB,EAAK,QAAQytB,IAAkBH,GAC7CO,IAAY,KAAK,IAAI,IAAI,KAAK,MAAMD,CAAU,CAAC;MAErD,OADA,KAAkBC,GACX;OACH,gBAAgB7tB,EAAK;OACrB,WAAW4tB,IAAa,KAAK,MAAMA,CAAU;OAC7C,OAAOC;MACX;KACJ,CAAC,GAEGC,IAAkBL,IAAiBC,GAEjCK,IAAkBJ,EAAe,QAAO,MAAK,CAACJ,EAAQ,MAAK,MAAQvtB,EAAK,mBAAmByT,EAAE,cAAc,CAAC,EAAE,WAAW;KAE/H,IAAIqa,IAAkB,KAAKC,EAAgB,SAAS,GAAG;MACnD,EAAgB,MAAM,GAAG,MAAM5rB,EAAE,YAAYC,EAAE,SAAS;MACxD,KAAK,IAAIQ,IAAI,GAAGA,IAAIkrB,GAAiB,KACjC,EAAgBlrB,IAAImrB,EAAgB,OAAO,CAAC,SAAS;KAE7D,OAAO,IAAID,IAAkB,KAAKC,EAAgB,SAAS,GAAG;MAC1D,EAAgB,MAAM,GAAG,MAAM3rB,EAAE,YAAYD,EAAE,SAAS;MACxD,KAAK,IAAIS,IAAI,GAAGA,IAAI,KAAK,IAAIkrB,CAAe,GAAG,KAAK;OAChD,IAAMhwB,IAASiwB,EAAgBnrB,IAAImrB,EAAgB;OACnD,AAAIjwB,EAAO,QAAQ,MAAI,IAAO;MAClC;KACJ;KAEA,EAAe,SAAS,EAAE,mBAAgB,eAAY;MAClD,KAAKsuB,IAAa,eAAe/T,GAAgBG,GAAO,MAAM;KAClE,CAAC;IACL;GACJ,OACI,KAAK,gBAAgB,cAAc;GAGvC,KAAK,cAAc,uBAAuB,CAAC,EAAE,QAAQ;EAHd;CAI3C;CAEA,oBAAoB,GAAQ,MAAU;EAElC,IAAMwV,KAAgB,MAAM;GAExB,IAAI,CAAC,mBAAmB,CAAC,CAAC,SAAS,KAAKnuB,GAAM,OAAO,GAAG;IACpD,IAAMouB,IAAU,KAAKpuB,GAAM,QAAQ,2CAA2C;IAC9E,AAAIouB,MACAjvB,IAAIivB,EAAQ,UAAU,IAAI,QAAQ,IAAIA,EAAQ,UAAU,OAAO,QAAQ;GAE/E;EACJ;EA0BA,IAxBAD,EAAa,EAAI,GAEjB,KAAK7B,KAAS7pB,GAEd,KAAKqqB,KAAU;GACX,OAAO5Z,EAAc,QAAQC,CAAM;GACnC,OAAO,EACH,IAAIA,EAAO,iBAAiB,UAAU,EAC1C;EACJ,GAEA,KAAK,cAAc,oBAAoB,CAAC,CAAC,YAAY,KAAK2Z,GAAQ,KAAK,GAEvE,KAAKT,GAAU,SAAS,KAAKA,GAAU,SAAS,GAChD,KAAKA,GAAU,UAAU,CAAC,GAC1B,KAAK,iBAAiB,kCAAkC,CAAC,CAAC,SAAS,MAAQ;GAEvE,AADA,KAAKA,GAAU,UAAU,KAAK,IAAI1gB,EAAI,gBAAgB,GAAG,EAAE,GAC3D,KAAK0gB,GAAU,QAAQ,KAAK1gB,EAAI,gBAAgB,CAAC;EAIrD,CAAC,GACD,KAAK0gB,GAAU,SAAS,KAAKA,GAAU,QAAQ,QAE3C,KAAKC,OAAW,GAAG;GACnB,IAAM+B,IAAU,SAAS,KAAKruB,GAAM,aAAa,kBAAkB,GAAG,EAAE,GAClE4S,IAAU,SAAS,KAAK5S,GAAM,aAAa,kBAAkB,GAAG,EAAE,GAElEd,KAAK,KAAK,cAAc,oBAAoB,CAAC,EAAE,gBAAgB,MAChE,KAAK,cAAc,mBAAmB,CAAC,EAAE,gBAAgB,MACzD,KAAK,cAAc,OAAO,CAAC,EAAE,gBAAgB,MAC7C,KAAK,cAAc,OAAO,CAAC,EAAE,gBAAgB,MAC7C,KAAK,cAAc,YAAY,CAAC,EAAE,gBAAgB;GAUvD,AARI,KAAKc,GAAM,aAAa,aAAa,MAAM,UAAW,MAAMquB,CAAO,KAAM,MAAMzb,CAAO,KACtF,KAAK5S,GAAM,aAAa,cAAc,MAAM,GAG3C,MAAMquB,CAAO,MACd,KAAKruB,GAAM,MAAM,YAAYd,IAAK,KAAKmtB,GAAU,SAASgC,IAAW,OAGpE,MAAMzb,CAAO,MACd,KAAK5S,GAAM,MAAM,YAAYd,IAAK,KAAKmtB,GAAU,SAASzZ,IAAW;EAE7E;EAQA,AANA,KAAK,iBAAkB,eAAgB,CAAC,CAAC,SAAS,MAAQ;GACtD,EAAI,MAAM,UAAU;EACxB,CAAC,GAED,KAAK,cAAc,0BAA0B,CAAC,CAAC,OAAO,GAEtDub,EAAa,EAAK;CACtB;CAEA,iBAAiB;EAiCb,AA/BA,KAAKjB,GAAuB,GAE5B,KAAKC,GAAuB,GAE5B,KAAKmB,GAA4B,GAEjC,KAAKC,GAAmB,GAExB;GAAC;GAAQ;GAAQ;EAAO,CAAC,CAAC,SAAQ,MAAQ;GACtC,IAAMC,IAAS,iBAAiB1qB;GAChC,KAAKiD,GAAUjD,KAAQ;IACnB,OAAO,KAAK,cAAc,GAAG0qB,EAAO,OAAO;IAC3C,OAAO;KACH,MAAM,KAAK,cAAc,GAAGA,EAAO,YAAY;KAC/C,MAAM,KAAK,cAAc,GAAGA,EAAO,YAAY;KAC/C,MAAM,KAAK,cAAc,GAAGA,EAAO,YAAY;IACnD;IACA,OAAO,KAAK,cAAc,GAAGA,EAAO,OAAO;GAC/C;EACJ,CAAC,GAED,KAAKtC,GAAY,WAAW,GAExB,KAAK,eACL,KAAK,QAAQ,EAAI,IAEjB,KAAK,cAAc,uBAAuB,CAAC,CAAC,QAAQ,GAGxD,KAAKO,GAAU,WAAW,GAE1B,KAAK,SAAS;CAClB;CAGA,WAA+B;EAE3B,AAAI,KAAKzsB,GAAM,UAAU,SAAS,YAAY,KAE9C;GAAC;GAAQ;GAAS;EAAM,CAAC,CAAC,SAAQ,MAAQ;GACtC,IAAM2U,IAAa,KAAK,iBAAiB,iBAAiB7Q,GAAM;GAChE,IAAI6Q,EAAW,WAAW,GAAG;GAE7B,IAAM8Z,IAAa9Z,EAAW,EAAE,CAAC,cAAc,OAAO;GACtD,IAAI,CAAC8Z,GAAY;GAEjB,IAAI9V,IAAQ;GAMZ,AALA8V,EAAW,iBAAiB,KAAK,CAAC,CAAC,SAAQ,MAAO;IAC9C,IAAMxvB,IAAI,SAASiV,EAAI,aAAa,OAAO,GAAG,EAAE;IAChD,AAAK,MAAMjV,CAAC,MAAG,KAASA;GAC5B,CAAC,GAED0V,EAAW,SAAQ,MAAa;IAE5B,AADe5E,EAAU,iBAAiB,OAAO,GAC7CjM,MAAS,SACT,EAAU,MAAM,OAAO,OAEvB,EAAU,MAAM,OAAO,OAAO6U,EAAM,KACpC,EAAU,MAAM,QAAQ,GAAGA,EAAM,KACjC,EAAU,MAAM,WAAW,GAAGA,EAAM,KACpC,EAAU,MAAM,WAAW,GAAGA,EAAM;GAE5C,CAAC;EACL,CAAC;CACL;CAEA,WAA+B;EAO3B;GALI;IAAE,UAAU;IAAsB,MAAM;GAAO;GAC/C;IAAE,UAAU;IAAsB,MAAM;GAAK;GAC7C;IAAE,UAAU;IAAuB,MAAM;GAAQ;EAG9C,CAAC,CAAC,SAAS,EAAE,aAAU,cAAW;GACrC,KAAK,cAAc,kBAAkB3I,GAAU,CAAC,CAAC,YAAY,KAAK0e,GAAkB5qB,CAAI,CAAC;EAC7F,CAAC;CACL;CAEA,MAAqB,MAAoB;EAErC,IAAMkmB,IAAO,KAAK8C,GAAQ,MAAM,UAAU,EAAI;EAgB9C,OAdI7a,MAAoB,SACpB+X,EAAK,iBAAiB,aAAa,CAAC,CAAC,SAAQ,MAAO;GAChD,AAAIjZ,EAAI,aAAa,OAAO,MAAM,UAAQA,EAAI,OAAO;EACzD,CAAC,IACMkB,MAAoB,UAC3B+X,EAAK,iBAAiB,aAAa,CAAC,CAAC,SAAQ,MAAO;GAChD,AAAIjZ,EAAI,aAAa,OAAO,MAAM,WAASA,EAAI,OAAO;EAC1D,CAAC,IAEDiZ,EAAK,iBAAiB,6BAA6B,CAAC,CAAC,SAAQ,MAAO;GAChE,EAAI,OAAO;EACf,CAAC,GAGEA;CACX;CAEA,qBACW,KAAKkC,GAAY,aAAa;CAGzC,uBAEuB,KAAKnlB,GAAU,QAAQ,gBAAgB,OAErC,KAAKA,GAAU,KAAK,OAAO,gBAAgB,MAC3D,KAAKA,GAAU,KAAK,OAAO,gBAAgB,MAC3C,KAAKA,GAAU,KAAK,MAAM,KAAK,gBAAgB;CAKxD,kBAAkB;EAEd,IAAM/B,IAAQ,KAAK,cAAc,gBAAgB,GAC3CkM,IAAQ,KAAK,cAAc,+BAA+B,GAE1Dyd,IAAgB,KAAK5nB,GAAU,KAAK,OAAO,gBAAgB,GAE3D6nB,IAAc5pB,EAAM,sBAAsB,CAAC,CAAC,QAC5C6pB,IAAc3d,EAAM,sBAAsB,CAAC,CAAC;EAElD,OAAQ0d,IAAcD,KAAiBE;CAC3C;CAEA,aAAa,MAAe;EACxB,IAAMC,IAAgB,KAAK,cAAc,mCAAmC;EAC5E,AAAIA,MAAe,EAAc,aAAaC;CAClD;CAEA,aAAa,MAAc;EACvB,IAAMphB,IAAe,KAAK,cAAc,gBAAgB;EACxD,AAAIA,MAAc,EAAa,YAAYO;CAC/C;CAEA,WAAc;EAkBV,AAhBA,KAAK1J,GAAQ,GAEb,KAAKooB,KAAiB,IAAI/Y,EAAc,IAAI,GAC5C,KAAKgZ,KAAkB,IAAI7W,EAAe,IAAI,GAC9C,KAAKuW,KAAc,IAAI5U,EAAW,IAAI,GACtC,KAAK+U,KAAY,IAAI9Q,EAAS,IAAI,GAClC,KAAK+Q,KAAU,IAAItL,EAAc,IAAI,GAErC,KAAKmB,KAAQ,IAAI2E,EAAU,IAAI,GAC/B,KAAKqF,KAAa,IAAInH,EAAU,IAAI,GACpC,KAAKoH,KAAY,IAAIphB,EAAgB,IAAI,GAEpC,KAAK4hB,OACN,KAAK+B,KAAW,IAAI1I,EAAQ,IAAI,IAGpC,KAAKvf,GAAU,SAAS,iBAAiB,WAAW,MAAM;GAItD,AAHA,KAAK,iBAAiB,0CAA0C,CAAC,CAAC,SAAQ,MAAO;IAC9E,EAAI,UAAU,OAAO,QAAQ;GAChC,CAAC,GACD,KAAK,cAAc,uBAAuB,CAAC,CAAC,QAAQ;EACxD,CAAC;CACL;CAIA,WAAgB;EA6BZ,AA3BA,KAAK,aAAa,YAAY,GAAG,GAEjC,KAAK,YAAY,44BAyBjB,KAAKA,KAAY;GACb,UAAU,KAAK,cAAc,mCAAmC;GAChE,YAAY,KAAK,cAAc,uBAAuB;GACtD,YAAY,KAAK,cAAc,uBAAuB;GACtD,SAAS,KAAK,cAAc,uCAAuC;GACnE,cAAc,KAAK,cAAc,0CAA0C;EAC/E;CACJ;CAEA,WAAoC;EAEhC,IAAMuL,IAAY,KAAK,cAAc,0BAA0B,GACzDC,IAAY,KAAK,cAAc,0BAA0B,GACzDC,IAAa,KAAK,cAAc,2BAA2B,GAE3Dyc,IAAiB,MAAM,KAAK3c,EAAU,iBAAiB,uCAAuC,CAAC,GAC/F4c,IAAiB,MAAM,KAAK3c,EAAU,iBAAiB,uCAAuC,CAAC,GAC/F4c,IAAkB,MAAM,KAAK3c,EAAW,iBAAiB,uCAAuC,CAAC;EAEvG,KAAK4c,GAAiBH,GAAgBC,GAAgBC,CAAe;EAErE,IAAME,IAAiB,MAAM,KAAK/c,EAAU,iBAAiB,UAAU,CAAC,GAClEgd,IAAiB,MAAM,KAAK/c,EAAU,iBAAiB,UAAU,CAAC,GAClEgd,IAAkB,MAAM,KAAK/c,EAAW,iBAAiB,UAAU,CAAC;EAE1E,KAAK4c,GAAiBC,GAAgBC,GAAgBC,CAAe;CACzE;CAEA,MAAoB,GAAU,GAAU,MAAc;EAElD,iBAAiB;GACb,IAAM3c,IAAU,KAAK,IAAIH,EAAS,QAAQC,EAAS,QAAQC,EAAU,MAAM;GAE3E,KAAK,IAAI,IAAI,GAAG,IAAIC,GAAS,KAAK;IAE9B,IAAMC,IAAU;KACZJ,EAAS,EAAE,EAAE,sBAAsB,CAAC,CAAC,UAAU;KAC/CC,EAAS,EAAE,EAAE,sBAAsB,CAAC,CAAC,UAAU;KAC/CC,EAAU,EAAE,EAAE,sBAAsB,CAAC,CAAC,UAAU;IACpD,GACMG,IAAY,KAAK,IAAI,GAAGD,CAAO;IAErC,AAAIC,IAAY,MACRL,EAAS,OAAI,EAAS,EAAE,CAAC,MAAM,SAAS,GAAGK,EAAU,MACrDJ,EAAS,OAAI,EAAS,EAAE,CAAC,MAAM,SAAS,GAAGI,EAAU,MACrDH,EAAU,OAAI,EAAU,EAAE,CAAC,MAAM,SAAS,GAAGG,EAAU;GAEnE;EACJ,CAAC;CACL;CAEA,WAA2B;EACvB,IAAMnF,IAAe,KAAK,cAAc,gBAAgB;EACxD,IAAI,CAACA,GAAc;EAEnB,IAAI6hB,IAAiB;EAerB,AAbA7hB,EAAa,iBAAiB,cAAc,MAAM;GAC9C,IAAM2C,IAAK5H,EAAE,OAAO,QAAQ,IAAI;GAChC,IAAI,CAAC4H,KAAM,CAACA,EAAG,QAAQ,OAAOA,EAAG,QAAQ,QAAQ,KAAK;GAEtD,IAAM3P,IAAW2P,EAAG,QAAQ;GAC5B,AAAIkf,MAAmB7uB,MACvB,IAAiBA,GAEjBgN,EAAa,iBAAiB,gBAAgBhN,EAAS,GAAG,CAAC,CAAC,SAAQ,MAAO;IACvE,EAAI,UAAU,IAAI,OAAO;GAC7B,CAAC;EACL,CAAC,GAEDgN,EAAa,iBAAiB,aAAa,MAAM;GAC7C,IAAM2C,IAAK5H,EAAE,OAAO,QAAQ,IAAI;GAChC,IAAI,CAAC4H,GAAI;GAET,IAAMmf,IAAgB/mB,EAAE;GACxB,AAAI4H,EAAG,SAASmf,CAAa,MAE7B9hB,EAAa,iBAAiB,UAAU,CAAC,CAAC,SAAQ,MAAO;IACrD,EAAI,UAAU,OAAO,OAAO;GAChC,CAAC,GACD,IAAiB;EACrB,CAAC;CACL;CAEA,WAAwB;EAIpB,CAFc,KAAKwe,EAEhB,CAAC,CAAC,SAAQ,MAAO;GAQhB,iBAAA,IALiB,IAAI,CACjB,GAAG,QAAQ,QAAQuD,CAAG,GACtB,GAAG,QAAQ,QAAQ,OAAO,eAAeA,CAAG,CAAC,CACjD,CAEG,EAAA,CAAE,SAAQ,MAAO;IAEhB,IAAIriB,MAAQ,iBAAiB,OAAOA,CAAG,CAAC,CAAC,WAAW,GAAG,GAAG;IAE1D,IAAMpP,IAASyxB,EAAIriB;IAEnB,AAAI,OAAOpP,KAAW,aACb,KAAKoP,OAEN,KAAKA,MAAQ,GAAGsiB,MAAS1xB,EAAO,MAAMyxB,GAAKC,CAAI,KAEzB,OAAO1xB,KAAW,YAArCA,MAEF,KAAKoP,OAEN,KAAKA,KAAOpP;GAGxB,CAAC;EACL,CAAC;CACL;CAEA,uBAAuB;EAGnB,AAFA,KAAKsuB,IAAa,QAAQ,GAC1B,KAAKG,IAAW,QAAQ,GACxB,KAAK,YAAY;CACrB;AACJ;AAEK,eAAe,IAAI,kBAAkB,KACtC,eAAe,OAAO,oBAAoBT,CAAc;;AChpB5D,IAAa2D,IAAb,MAA2B;CACvB;CAEA,YAAY,GAAO;EAEf,AADA,KAAK5vB,KAAQ6vB,GACb,KAAKxsB,GAAM;CACf;CAEA,WAAc;EAEV,AADA,KAAKmB,GAAQ,GACb,KAAKsrB,GAAW;CACpB;CAEA,IAAI,QAAQ,GAAK;EACb,AAAMva,IACF,KAAKvV,GAAM,UAAU,IAAI,SAAS,IAElC,KAAKA,GAAM,UAAU,OAAO,SAAS;CAE7C;CAIA,WAAgB;EAGZ,IAAM+D,IADc,MAAM,KAAK,KAAK/D,GAAM,QACd,CAAC,CAAC,QAAO,MAAO7B,EAAG,QAAQ,YAAY,MAAM,OAAS,GAC5E4xB,IAAahsB,EAAU,QAEvBisB,IAAajsB,EAAU,KAAK,GAAK,MAAQ;GAC3C,IAAMksB,IAAYxvB,MAAQ,IAAI,WAAW,IACnCyvB,IAAUlsB,EAAI,MAAM,QAAQvD,IAAM;GAIxC,OAAO,4BAFsCwvB,EAAU,gBAAgBxvB,EAAI,mBAAmByvB,EAAQ,QAAQA,EAAQ,0BAClGzvB,IAAMsvB,IAAa,IAAI,8CAA8CtvB,EAAI,sBAAsB;EAEvH,CAAC,CAAC,CAAC,KAAK,EAAE,GAEJ0vB,IAAa,CACf,4FACJ;EA8CA,AA5CI,KAAK,iBAAiB,KAAK,aAAa,CAAC,WACzCA,EAAW,KAAK,YAAY,KAAK,aAAa,CAAC,QAAQ,GAAG,GAG9D,KAAKnwB,GAAM,WAAW,YAAY;;kBAExBmwB,EAAW,KAAK,IAAI,EAAE;kBACtB,KAAKnwB,GAAM,SAAS,MAAM,MAAM;;;;;;;;;;0BAUxBgwB,EAAW;;;;;;;WAS7BjsB,EAAU,SAAQ,MAAO;GACrB,EAAY,gBAAgB,KAAK/D,IAAO+Q,CAAG;EAC/C,CAAC,GAED,KAAK/Q,GAAM,WAAW,iBAAiB,kBAAkB,CAAC,CAAC,SAAS,GAAQ,MAAQ;GAEhF,AADAowB,EAAO,UAAU,IAAI,QAAQ,GAC7BA,EAAO,iBAAiBrsB,EAAUtD,IAAMA,CAAG;EAC/C,CAAC,GAED,KAAKT,GAAM,WAAW,iBAAiB,kBAAkB,CAAC,CAAC,SAAS,MAAW;GAE3E,iBAAiB;IAEb,AADAowB,EAAO,SAAS,GACZ,KAAKC,MAAe,KAAKC,GAAiB;GAClD,CAAC;EACL,CAAC,GAGD,iBAAiB;GACb,KAAKtwB,GAAM,KAAK,MAAM;EAC1B,CAAC;CACL;CAEA,WAAmB;EAMf,AAJA,KAAKA,GAAM,iBAAiBN,EAAW,MAAM,iBAAiB;GAC1D,AAAI,KAAK2wB,MAAe,KAAKC,GAAiB;EAClD,CAAC,GAED,KAAKtwB,GAAM,iBAAiBN,EAAW,MAAM,mBAAmB;GAC5D,AAAI,KAAK2wB,MAAe,KAAKC,GAAiB;EAClD,CAAC;EAED,IAAIC,IAAa;EAEjB,IAAI,gBAAgB,MAAY;GAC5B,KAAK,IAAIxd,KAASC,GACd,IAAID,EAAM,OAAO,YAAY,cAAc;IACvC,IAAMyd,IAAgBzd,EAAM,YAAY;IAExC,AAAIyd,MAAkBD,MAClB,IAAaC,GACT,KAAKH,MACL,KAAKC,GAAiB;GAGlC;EAER,CAAC,CAAC,CAAC,QAAQ,KAAKtwB,EAAK;CACzB;CAEA,WAAyB;EACrB,KAAKA,GAAM,WAAW,iBAAiB,kBAAkB,CAAC,CAAC,SAAS,MAAW;GAC3E,IAAIowB,EAAO,UAAU,GAAG;IACpB,IAAM1mB,KAAe0mB,EAAO,cAAc,OAAO,CAAC,EAAE,gBAAgB,MAC/DA,EAAO,cAAc,OAAO,CAAC,EAAE,gBAAgB,MAC/CA,EAAO,cAAc,YAAY,CAAC,EAAE,gBAAgB,IACnDK,IAAc,KAAKzwB,GAAM,eAAeowB,EAAO,eAAe1mB,GAE9DxK,IAAI,KAAK,IAAIkxB,EAAO,SAAS,SAASA,EAAO,KAAK,MAAM,GAAG,OAAO,cAAc,EAAG;IAEzF,KAAKpwB,GAAM,MAAM,SAASywB,IAAevxB,IAAK;GAClD;EACJ,CAAC;CACL;CAEA,IAAImxB,KAAgB;EAChB,OAAO,KAAKrwB,GAAM,aAAa,aAAa,MAAM;CACtD;AACJ,GC/Ia0wB,IAAb,MAAwB;CACpB;CACA;CACA,qBAAa,IAAI,IAAI;CAErB,YAAY,GAAM;EAEd,AADA,KAAK1wB,KAAQC,GACb,KAAKqD,KAAUrD,EAAK,OAAO,IAAI;CACnC;CAEA,YAAY,GAAM;EAId,OAFI,CAACkE,KAAQ,CAAC,KAAKb,GAAQ,SAAea,IAEnCA,EAAK,QAAQ,8BAA8B,GAAO,MAAc;GACnE,IAAM1D,IAAM,KAAK6C,GAAQ,QAAQG,CAAS;GAC1C,OAAOhD,KAAO,IAAI,aAAaA,EAAI,KAAKkwB;EAC5C,CAAC;CACL;CAEA,WAAW,GAAM;EAEb,OADKxsB,KACE,KAAK,YAAYA,CAAI;CAChC;CAEA,SAAS,GAAM,GAAS,IAAM,GAAG;EAE7B,IAAIA,KAA+B,MAAM,OAAO;EAEhD,IAAI;GACA,IAAMysB,IAAc,OAAOzsB,CAAI,CAAC,CAAC,KAAK,GAChC0sB,IAAe,KAAK,YAAYD,CAAW;GAEjD,IAAIC,EAAa,SAAS,WAAW,KAAKA,EAAa,SAAS,OAAO,KAAKA,EAAa,SAAS,OAAO,KAAKA,EAAa,SAAS,WAAW,KAAKA,EAAa,SAAS,GAAG,GAAG;IAE5K,IAAIC,IAAS,KAAKC,GAAW,IAAIF,CAAY;IAc7C,OAZKC,MACD,IAAa,SAAS,WAAW,OAAO,QAAQ;;;;;iCAKnCD,EAAa;qBACzB,GAED,KAAKE,GAAW,IAAIF,GAAcC,CAAM,IAGrCA,EAAOE,GAAShvB,GAAK,KAAKhC,EAAK;GAC1C;GAEA,OAAO6wB;EACX,QAAY;GAKR,OAAO1sB;EACX;CACJ;AACJ,GC5Da8sB,IAAb,MAAqB;CAEjB;CAEA,YAAY,GAAM;EACd,KAAKjxB,KAAQC;CACjB;CAEA,WAAW;EAEP,OAAO,EACH,OAAO,GACX;EACA,MAAM,MAAgB;GAClB,IAAI,CAACixB,KAAe,OAAOA,KAAgB,UAAU;GAErD,IAAM,EAAE,UAAO,GAAGC,MAAYD;GAM9B,AAJIvT,KAAS,OAAOA,KAAU,aAC1B,KAAK,SAAS,MAAM,QAAQA,IAG5B,OAAO,KAAKwT,CAAO,CAAC,CAAC,SAAS,KAC9B,iBAAiB;IAOb,AANA,OAAO,QAAQA,CAAO,CAAC,CAAC,SAAS,CAACttB,GAAMutB,OAAQ;KAC5C,AAAI,OAAOA,KAAO,eACd,KAAKpxB,GAAM6D,KAAQutB;IAE3B,CAAC,GAED,KAAKpxB,GAAM,WAAW;GAC1B,CAAC;EAET;CACJ;AAEJ,GCvCaqxB,IAAb,MAA0B;CACtB;CAEA,YAAY,GAAM;EAMd,AALA,KAAKrxB,KAAQC,GAKb,CAFoB,OAAO,KAElB,CAAC,CAAC,SAAQ,MAAM;GACrB,KAAKqxB,KAAM,IAAI,MAAM,CAAC,GAAG,EACrB,MAAM,GAAQ,MAAS;IACnB,IAAMlB,IAAS,KAAKmB,GAAgB;IACpC,IAAI,CAACnB,KAAU,CAACA,EAAOkB,IAAK;IAE5B,IAAME,IAAepB,EAAOkB,EAAG,CAACG;IAKhC,OAHI,OAAOD,KAAiB,cAChB,GAAG7B,MAAS6B,EAAa,MAAMpB,EAAOkB,IAAK3B,CAAI,IAEpD6B;GACX,EACJ,CAAC;EACL,CAAC;CACL;CAEA,kBAAkB;EACd,OAAO,KAAKxxB,GAAM,OAAO,iBAAiB,yBAAyB;CACvE;CAEA,KAAkB;EACd,IAAMyB,IAAM,KAAK,gBAAgB;EACjC,OAAOA,EAAI,SAAS,IAAIA,EAAI,KAAK;CACrC;AACJ,GCzBqBiwB,IAArB,cAAuC,YAAY;CAC/C;CACA;CACA;CACA;CACA;CACA,KAAe;CAEf,cAAc;EAaV,AAZA,MAAM,GAEF,CAAC,YAAY,CAAC,CAAC,SAAS,KAAK,OAAO,KACpClyB,EAAM,IAAI,sBAAA,OAAqC,GAGnD,KAAKmyB,KAAc,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC,GACrD,KAAKC,KAAe,IAAI5uB,EAAc,IAAI,GAE1C,KAAK6uB,KAAW,IAAIZ,EAAQ,IAAI,GAChC,KAAKa,KAAY,IAAIT,EAAa,IAAI,GAEtC,KAAKjF,GAAgB;CAC1B;CAEC,oBAAoB;EAChB,iBAAiB;GAUb,AATA,KAAK2F,KAAe,KAAK,iBAAiB,OAAO,CAAC,EAAE,QAEpD,KAAK,SAAS,IAAIhxB,EAAO,IAAI,GAC7B,KAAK,aAAa,IAAI2vB,EAAW,IAAI,GAErC,KAAKsB,GAAoB,GAEzB,KAAKC,KAAiB,IAAIrC,EAAc,IAAI,GAE5C,KAAKsC,GAAc;EACvB,CAAC;CACL;CAEA,uBAAuB,CAEvB;CAEA,WAAsB;EAElB,IAAIC,IAAa,GAGXC,IAAa,kBAAkB;GACjC;GAEA,IAAMvtB,IAAS,KAAK,OAAO,iBAAiB,kBAAkB;GAM9D,IAJIstB,KAAc,MACd,cAAcC,CAAU,GAGxBvtB,EAAO,UAAU,KAAKktB,IAAc;IACpC,IAAIM,IAAe;IAKnB,AAJAxtB,EAAO,SAAQ,MAAU;KACrB,AAAIurB,EAAO,UAAQ;IACvB,CAAC,GAEGiC,KAAgB,KAAKN,OACrB,cAAcK,CAAU,GACxB,KAAK,SAAS,IACd,KAAK,cAAc,IAAI,YAAY1yB,EAAW,MAAM,MAAM;KAAE,SAAS;KAAM,QAAQ,EAAE,QAAQ,KAAK;IAAE,CAAC,CAAC;GAE9G;EACJ,GAAG,GAAG;CACV;CAGA,IAAI,SAAS;EAAE,OAAO,KAAKiyB;CAAa;CACxC,IAAI,cAAc;EAAE,OAAO,KAAKC;CAAc;CAC9C,IAAI,OAAO;EAAE,OAAO,KAAKA,GAAa;CAAM;CAO5C,QAAQ,GAAS;EAEb,AADA,KAAKA,GAAa,KAAK,IAAIvvB,CAAO,GAClC,KAAK,QAAQ;CACjB;CAEA,UAAU;EACN,KAAK,aAAa,WAAW;CACjC;CAGA,IAAI,QAAQ,GAAK;EACb,AAAI,KAAK4vB,OAAgB,KAAKA,GAAe,UAAU1c;CAC3D;CAEA,aAAa;EAET,KAAK,aAAa,iBAAiB,6BAA6B,CAAC,CAAC,SAAS,MAAU;GAKjF,MAJyB,KAAK7J,EAAM,QAAQ,CAAC,CAAC,MAAK,MACxCqF,EAAI,QAAQ,YAAY,CAAC,CAAC,WAAW,OAAO,KAAK,OAAOA,EAAI,cAAe,UAG7E,CAAC,EAAE,WAAW;EAC3B,CAAC;CACL;CAEA,SAAS,MAAc;EACnB,IAAIuhB,MAAc,QAAQA,IAAY,GAAG,OAAO,KAAK;EACrD,IAAMztB,IAAS,MAAM,KAAK,KAAK,OAAO,iBAAiB,kBAAkB,CAAC;EAM1E,OAJI,OAAOytB,KAAc,WAAiBztB,EAAOytB,MAAc,OAC3D,OAAOA,KAAc,WACd,KAAK,OAAO,cAAc,oBAAoBA,EAAU,oCAAoCA,EAAU,GAAG,KAAK,OAElHztB,EAAO,MAAM;CACxB;CAEA,IAAI,SAAS;EACT,OAAO,MAAM,KAAK,KAAK,OAAO,iBAAiB,kBAAkB,CAAC;CACtE;CAEA,IAAI,cAAc;EACd,OAAO,KAAK,OAAO,cAAc,yBAAyB,KAAK;CACnE;CAEA,KAAsB;EAClB,IAAM0tB,oBAAuB,IAAI,IAAI;EAerC,AAbA,KAAK,iBAAiB,eAAe,CAAC,CAAC,SAAQ,MAAM;GACjD,IAAMnxB,IAAajD,EAAG,aAAa,aAAa;GAChD,IAAI,CAACiD,GAAY;GAEjB,IAAMoxB,IAAUpxB,EAAW,SAAS,mCAAmC;GACvE,KAAK,IAAMuvB,KAAS6B,GAAS;IACzB,IAAM3uB,IAAO8sB,EAAM;IACnB,AAAI9sB,KAAQA,MAAS,UACjB0uB,EAAqB,IAAI1uB,CAAI;GAErC;EACJ,CAAC,GAED0uB,EAAqB,SAAQ,MAAc;GACvC,IAAIE,IAAgB;GAEpB,OAAO,eAAe,MAAMC,GAAY;IACpC,MAAM,MAAa;KAGf,AAFA,IAAgBC,GAEhB,KAAK,WAAW;IACpB;IACA,WAAWF;IACX,cAAc;IACd,YAAY;GAChB,CAAC;EACL,CAAC;CACL;CAEA,WAAW,MAAO;EACd,iBAAiB;GAEb,AADA,KAAK,UAAU,IACf,iBAAiB;IACb,IAAI;KACA,EAAG,KAAK,IAAI;IAChB,UAAU;KACN,KAAK,UAAU;IACnB;GACJ,CAAC;EACL,CAAC;CACL;CAEA,KAAkB;EAId,CAFc,KAAKZ,IAAU,KAAKC,EAE/B,CAAC,CAAC,SAAQ,MAAO;GAQhB,iBAAA,IALiB,IAAI,CACjB,GAAG,QAAQ,QAAQpC,CAAG,GACtB,GAAG,QAAQ,QAAQ,OAAO,eAAeA,CAAG,CAAC,CACjD,CAEG,EAAA,CAAE,SAAQ,MAAO;IAEhB,IAAIriB,MAAQ,iBAAiB,OAAOA,CAAG,CAAC,CAAC,WAAW,GAAG,GAAG;IAE1D,IAAMpP,IAASyxB,EAAIriB;IAEnB,AAAI,OAAOpP,KAAW,aACb,KAAKoP,OAEN,KAAKA,MAAQ,GAAGsiB,MAAS1xB,EAAO,MAAMyxB,GAAKC,CAAI,KAEzB,OAAO1xB,KAAW,YAArCA,MACF,KAAKoP,OAEN,KAAKA,KAAOpP;GAGxB,CAAC;EACL,CAAC;CACL;AACJ;AAEK,eAAe,IAAI,YAAY,KAChC,eAAe,OAAO,cAAcyzB,CAAS,GAG5C,eAAe,IAAI,mBAAmB,KACvC,eAAe,OAAO,qBAAqB,cAAcA,EAAU;CAC/D,oBAAoB;EAGhB,AAFA,KAAK,aAAa,SAAS,QAAQ,GAEnC,MAAM,kBAAkB;CAC5B;AACJ,CAAC;;ACjOL,IAAakB,IAAb,cAAsC,YAAY;CAEjD,cAAc;EACb,MAAM;CACP;CAEA,iBAAiB,CACjB;CAEA,oBAAoB,CACpB;AACD,GCRMC,oBAAY,IAAI,IAAI,GAEbC,IAAb,cAAiCF,EAAiB;CACjD;CACA;CACA;CACA;CACA;CAEA,cAAc;EACb,MAAM;CACP;CAEA,IAAIG,KAAkB;EACrB,OAAO,KAAKC,GAAM,aAAa,kBAAkB,MAAM;CACxD;CAEA,IAAI,OAAO;EAAE,OAAO,KAAKhzB;CAAO;CAChC,IAAI,QAAQ;EAAE,OAAO,KAAKgJ;CAAQ;CAClC,IAAI,OAAO;EAAE,OAAO,KAAKgqB;CAAO;CAChC,IAAI,KAAK;EAAE,OAAO,KAAKC;CAAK;CAC5B,IAAI,OAAO;EAAE,OAAO,KAAKC;CAAO;CAEhC,oBAAoB;EAWnB,AAVA,MAAM,kBAAkB,GAExB,KAAKlzB,KAAQ,KAAK,YAAY,CAAC,CAAC,MAEhC,KAAKgzB,KAAQ,KAAK,QAAQ,OAAO,GACjC,KAAKC,KAAM,KAAKD,GAAM,QAAQ,IAAI,GAClC,KAAKhqB,KAAS,KAAKiqB,GAAI,QAAQ,kBAAkB,GAEjD,KAAKD,GAAM,UAAU,IAAI,KAAK,OAAO,GAErC,KAAKE,KAAQ,CAAC;EACd,KAAK,IAAInwB,IAAI,GAAGA,IAAI,KAAKiwB,GAAM,WAAW,QAAQ,KAAK;GACtD,IAAMnvB,IAAO,KAAKmvB,GAAM,WAAWjwB,EAAE,CAAC;GACtC,AAAK;IAAC;IAAa;IAAQ;IAAY;IAAY;IAAY;IAAW;GAAU,CAAC,CAAC,SAASc,CAAI,MAClG,KAAKqvB,GAAMrvB,KAAQ,KAAKmvB,GAAM,WAAWjwB,EAAE,CAAC;EAG9C;EAEA,IAAI,CAAC,KAAKiwB,IAAO;EAGjB,IAAMjX,IAAO,KAAK,cAAc;EAGhC,EAAK,iBAAiB,0BAA0B,CAAC,CAAC,SAAQ,MAAU;GACnE,EAAO,iBAAiB,eAAe;IACtC,IAAIqV,IAAK,KAAK,aAAa,eAAe,KAAK,KAAK,aAAa,eAAe,KAAK,KAAK4B,IAAO,aAAa,eAAe,KAAK,KAAKA,IAAO,aAAa,eAAe,GAEpKtyB,IAAU,KAAK,MACfyyB,IAAS,SAAS,KAAKH,GAAM,QAAQ,KAAK,EAAE;IAElD,IAAI5B,KAAM,KAAKpxB,IAAO;KACrB,IAAKoxB,EAAG,QAAQ,MAAM,EAAE;KAExB,IAAMsB,IADQtB,EAAG,MAAM,aACA,CAAC,GAAG,MAAMA;KAEjC,AAAI,OAAO,KAAKpxB,GAAM0yB,MAAgB,aACrC,KAAK1yB,GAAM0yB,EAAW,CAAC,KAAK,KAAK1yB,IAAOU,GAASyyB,GAAQ,KAAKH,EAAK,IACzD,OAAO,KAAKhzB,GAAM,gBAAiB,cAC7C,KAAKA,GAAM,aAAaoxB,CAAE,CAAC,CAAC,KAAK,MAAM1wB,GAASyyB,CAAM;IAExD;GAOD,CAAC;EACF,CAAC;EAGD,IAAMC,IAAWrX,EAAK,cAAc,WAAW;EAC/C,AAAIqX,KAAY,KAAK,aAAa,MAAM,MAAM,WAC7CA,EAAS,UAAU,IAAI,MAAM,GAE7BA,EAAS,iBAAiB,eAAe;GACxC,IAAIhC,IAAK,KAAK,aAAa,aAAa,KAAK,KAAK,aAAa,aAAa,GAEtE1wB,IAAU,KAAK,MACfyyB,IAAS,SAAS,KAAKH,GAAM,QAAQ,KAAK,EAAE;GAElD,IAAI5B,KAAM,KAAKpxB,IAAO;IACrB,IAAKoxB,EAAG,QAAQ,MAAM,EAAE;IAExB,IAAMsB,IADQtB,EAAG,MAAM,aACA,CAAC,GAAG,MAAMA;IAEjC,AAAI,OAAO,KAAKpxB,GAAM0yB,MAAgB,aACrC,KAAK1yB,GAAM0yB,EAAW,CAAC,KAAK,KAAK1yB,IAAOU,GAASyyB,GAAQ,KAAKH,EAAK,IACzD,OAAO,KAAKhzB,GAAM,gBAAiB,cAC7C,KAAKA,GAAM,aAAaoxB,CAAE,CAAC,CAAC,KAAK,MAAM1wB,GAASyyB,CAAM;GAExD;GAEA,KAAKnzB,IAAO,cAAc,IAAI,YAAY,SAAS,MAAM,YAAY;IACpE,QAAQ;KAAE,QAAQ,KAAKgzB;KAAO,MAAMtyB;KAAS,QAAQyyB;IAAO;IAC5D,SAAS;IACT,UAAU;GACX,CAAC,CAAC;EACH,CAAC;CAEH;CAEA,IAAI,OAAO;EACV,IAAME,IAAY,KAAKJ,IAAK;EAC5B,IAAI,CAACI,GAAW,OAAO;EACvB,IAAI,CAACA,EAAU,GAAG,OAAOA;EAEzB,IAAMpzB,IAAO,KAAKD;EAElB,OAAO,IAAI,MAAMqzB,GAAW,EAC3B,IAAI,GAAQ,GAAM;GACjB,IAAI5B,MAAS,QAAQ,OAAOxzB,EAAO;GACnC,IAAIwzB,MAAS,KAAK,OAAOxzB,EAAO;GAEhC,IAAMwC,IAAMR,GAAM,QAAQ,UAAUwxB,CAAI,KAAK;GAC7C,OAAOhxB,KAAO,IAAIxC,EAAO,EAAEwC,KAAOxC,EAAOwzB;EAC1C,EACD,CAAC;CACF;CAEA,IAAI,QAAQ;EACX,IAAI,CAAC,KAAKuB,MAAS,CAAC,KAAKC,IAAK,MAAM,OAAO;EAE3C,IAAM3P,IAAU,KAAK0P,GAAM,SAAS;EACpC,IAAI,CAAC1P,GAAS,OAAO;EAErB,IAAM+P,IAAY,KAAKJ,GAAI;EAE3B,IAAII,EAAU,KAAK,MAAM,QAAQA,EAAU,CAAC,GAAG;GAC9C,IAAMhb,IAAS,KAAKrY,GAAM,OAAO,IAAI,CAAC,CAAC,QAAQsjB,CAAO,KAAK;GAC3D,OAAOjL,KAAU,IAAKgb,EAAU,EAAEhb,MAAW,KAAM;EACpD;EAEA,OAAOgb,EAAU/P,MAAY;CAC9B;CAEA,IAAI,MAAM,GAAG;EACZ,IAAI,CAAC,KAAK0P,MAAS,CAAC,KAAKhzB,IAAO,MAAM;EAEtC,IAAMgC,IAAM,SAAS,KAAKixB,GAAI,QAAQ,KAAK,EAAE,GACvC3P,IAAU,KAAK0P,GAAM,QAAQ;EACnC,AAAI,OAAMhxB,CAAG,KAAMshB,KAGnB,KAAKtjB,GAAM,KAAK,SAASgC,GAAKshB,GAASnkB,GAAG,KAAK4zB,EAAe;CAC/D;CAEA,IAAI,MAAM;EACT,OAAO,SAAS,KAAKC,IAAO,SAAS,KAAK,EAAE;CAC7C;CACA,IAAI,QAAQ;EACX,OAAO,SAAS,KAAKA,IAAO,SAAS,OAAO,EAAE;CAC/C;CAEA,UAAU;EACT,OAAO,MAAKA,GAAM,UAAU,SAAS,SAAS;CAC/C;CAEA,YAAY;EACX,OAAO,CAAC,KAAK,QAAQ;CACtB;CAEA,kBAAkB,IAAe,OAAO;EAMvC,IAJI,CAAC,KAAKA,MAAS,CAAC,KAAKA,GAAM,QAAQ,OAAO,KAI1C,CAFc,KAAKC,GAAI,MAEX,OAAOK;EAEvB,IAAMnvB,IAAO,KAAK6uB,GAAM,QAAQ,MAC1B1P,IAAU,KAAK0P,GAAM,QAAQ,MAC7BhxB,IAAM,SAAS,KAAKgxB,GAAM,QAAQ,KAAK,EAAE;EAE/C,IAAI7uB,GACH,IAAI;GAKF,OAJG,KAAK8uB,GAAI,aAAa,UAAU,MAAM,SAElC,KAAK,kBAAkB9uB,GAAM,KAAK8uB,GAAI,MAAMjxB,GAAK,KAAKgxB,EAAK,IAE3D,KAAKhzB,GAAM,WAAW,SAASmE,GAAM,KAAK8uB,GAAI,MAAMjxB,CAAG;EAEhE,QAAY;GACX,OAAOsxB;EACR;EAQD,OALIhQ,IACS,KAAK,SACgCgQ,IAG3CA;CACR;CAIA,UAAU;EAET,IAAI,CAAC,KAAKN,MAAS,CAAC,KAAKC,IAAK;EAE9B,IAAM1d,IAAM,KAAK;EAgCjB,OA9BA,KAAKyd,GAAM,UAAU,OAAO,SAAS,GAErC;GAAC;GAAQ;GAAa;GAAmB;GAAU;GAAS;EAAW,CAAC,CAAC,SAAQ,MAAK;GAErF,IAAM7uB,IAAO,KAAK+uB,GAAM/zB;GACxB,IAAIgF,GAAM;IACT,IAAMrB,IAAS,KAAK9C,GAAM,WAAW,SAASmE,GAAM,KAAK8uB,GAAI,MAAM,SAAS,KAAKD,GAAM,QAAQ,KAAK,EAAE,CAAC;IAEvG,AAAI7zB,MAAM,cACJ2D,KACJ,KAAKkwB,GAAM,UAAU,IAAI,SAAS,IAEzB7zB,MAAM,YAChB,KAAK,MAAMo0B,UAAazwB,IAAS,KAAK,SAC5B3D,MAAM,YAChB,KAAK,iBAAiB,iCAAiC,CAAC,CAAC,SAAQ,MAAO;KACvE,EAAI,WAAW,CAAC2D;IACjB,CAAC,GAEKA,IACL,KAAKkwB,GAAM,gBAAgB,UAAU,IAErC,KAAKA,GAAM,aAAa,YAAY,MAAM,KAG3C,KAAKA,GAAM,MAAM7zB,KAAK2D;GAExB;EACD,CAAC,GAEMyS;CACR;CAEA,aAAa,GAAM,GAAM,GAAK;EAG7B,OAFI,CAAC,KAAKvV,MAAS,CAAC,KAAKA,GAAM,cAAcmE,KAA+B,QAAQA,MAAS,KAAWA,IAEjG,KAAKnE,GAAM,WAAW,SAASmE,GAAMqvB,GAAMxxB,CAAG;CACtD;CAEA,qBAAqB,GAAM,GAAa,GAAK,MAAS;EACrD,IAAI,CAACmC,GAAM,OAAO;EAElB,IAAI;GACH,IAAM,SAASnC,GAAK,EAAE;GACtB,IAAMyxB,IAAYtvB,EAAK,QAAQ,MAAM,EAAE,CAAC,CAAC,KAAK;GAE9C,IAAI,KAAKnE,MAAS,OAAO,KAAKA,GAAMyzB,MAAe,YAClD,OAAO,KAAKzzB,GAAMyzB,EAAU,CAAC,KAAK,MAAMxmB,GAAajL,GAAK+S,CAAI;GAG/D,IAAM4b,IAAQ8C,EAAU,MAAM,8BAA8B;GAC5D,IAAI9C,GAAO;IACV,IAAMhgB,IAAU1D,EAAY,UAAU,WAChC2D,IAAa,KAAK5Q,IAAO,MAAM,WAAW,KAAKA,GAAM,KAAK,SAAS,IAAI,CAAC,GACxE0zB,IAAe/iB,IAAUA,EAAQ,KAAI,MAAOC,EAAWnQ,EAAI,CAAC,CAAC,OAAO,OAAO,IAAI,CAAC,GAEhF,GAAGkzB,GAAUC,KAASjD,GACtB1wB,IAAO,KAAKD;IAElB,QAAQ2zB,EAAS,YAAY,GAA7B;KACC,KAAK,SACJ,OAAOD,EAAa;KAErB,KAAK,OAAO;MACX,IAAMrb,IAASpY,GAAM,QAAQ,UAAU2zB,CAAK,KAAK;MACjD,OAAOF,EAAa,QAAQ,GAAK,MAAW;OAC3C,IAAMne,IAAM8C,KAAU,IAAIzW,EAAO,IAAIyW,KAAUzW,EAAOgyB;OACtD,OAAOC,KAAO,OAAOte,CAAG,KAAK;MAC9B,GAAG,CAAC;KACL;KAEA,KAAK,OAAO;MACX,IAAIme,EAAa,WAAW,GAAG,OAAO;MACtC,IAAMrb,IAASpY,GAAM,QAAQ,UAAU2zB,CAAK,KAAK;MAKjD,OAJYF,EAAa,QAAQ,GAAK,MAAW;OAChD,IAAMne,IAAM8C,KAAU,IAAIzW,EAAO,IAAIyW,KAAUzW,EAAOgyB;OACtD,OAAOC,KAAO,OAAOte,CAAG,KAAK;MAC9B,GAAG,CACM,IAAIme,EAAa;KAC3B;IACD;GACD;GAGA,IAAI,KAAK1zB,MAAS,OAAO,KAAKA,GAAM,gBAAiB,YACpD,OAAO,KAAKA,GAAM,aAAamE,CAAI,CAAC,CAAC,KAAK,MAAM8I,GAAajL,GAAK,KAAKhC,GAAM,IAAI;GAGlF,IAAImE,EAAK,SAAS,OAAO,KAAKA,EAAK,SAAS,cAAc,KAAKA,EAAK,SAAS,aAAa,GAAG;IAC5F,IAAI2sB,IAAS+B,EAAU,IAAI,SAAS1uB,CAAI;IA6BxC,OA5BK2sB,MACJ,IAAa,SAAS,eAAe,OAAO,QAAQ,QAAQ;;;;;;;;;;;;;;;;;;;;;;;4BAuBrC3sB,EAAK;iBAChB,GACZ0uB,EAAU,IAAI,SAAS1uB,GAAM2sB,CAAM,IAE7BA,EAAO7jB,GAAajL,GAAK+S,GAAM,KAAK/U,EAAK;GACjD;GAEA,OAAOmE;EACR,SAASuE,GAAG;GAEX,OADA,QAAQ,MAAM,gCAAgCvE,GAAMuE,CAAC,GAC9CvE;EACR;CACD;AACD,GAEa2vB,IAAb,cAAyChB,EAAY;CAEpD,IAAI,OAAO;EAAE,OAAO,MAAM;CAAM;CAChC,IAAI,QAAQ;EAAE,OAAO,MAAM;CAAO;CAClC,IAAI,OAAO;EAAE,OAAO,MAAM;CAAM;CAChC,IAAI,KAAK;EAAE,OAAO,MAAM;CAAI;CAC5B,IAAI,OAAO;EAAE,OAAO,MAAM;CAAM;CAEhC,aAAa,GAAM,GAAM,GAAK,GAAM;EACnC,OAAO,MAAM,aAAa3uB,GAAMqvB,GAAMxxB,GAAK+S,CAAI;CAChD;CAEA,cAAc;EACb,MAAM;CACP;CAEA,oBAAoB;EACnB,MAAM,kBAAkB;CACzB;CAEA,UAAU;EACT,OAAO,MAAM,QAAQ;CACtB;CAEA,gBAAgB,GAAM,GAAM,GAAK,MACzB,MAAM,aAAa5Q,GAAMqvB,GAAMxxB,GAAK+S,CAAI;CAGhD,gBACQ,MAAM,QAAQ;CAGtB,kBACQ,MAAM,UAAU;AAEzB,GCrXMgf,IAAN,cAA4BD,EAC5B;CACC;CAEA,cAAc;EACb,MAAM;CACP;CAEA,oBAAoB;EAQnB,AANA,MAAM,kBAAkB,GAExB,KAAKnY,GAAU,GAEf,KAAKqY,KAAU,KAAK,cAAc,OAAO,GAEzC,KAAKlE,GAAW;CACjB;CAEA,gBAAgB;EACf,IAAM3wB,IAAI,MAAM,QAAQ;EACxB,KAAK60B,GAAQ,QAAQ70B;CACtB;CAEA,WAAmB;EAalB,AAZA,KAAK60B,GAAQ,iBAAiB,UAAS,MAAK;GAC3C,IAAI,KAAKC,IAAU;IAClB,IAAMC,IAAa,OAAO,KAAKD,EAAQ;IAGvC,AAFqB,KAAK,cAAc,EAAE,OAAO,KAElC,IAAIC,MAClB,EAAE,OAAO,QAAQ,KAAK,IAAI,EAAE,OAAO,OAAOA,CAAU,GACpD,KAAK,QAAQ,EAAE,OAAO;GAExB;EACD,CAAC,GAED,KAAKF,GAAQ,iBAAiB,WAAW,MAAU;GAElD,AADA,KAAK,QAAQG,EAAM,OAAO,OAC1B,KAAK,MAAM,WAAW,QAAQ,EAAI;EACnC,CAAC;CACF;CAEA,WAAkB;EAEjB,KAAK,YAAY;CAGlB;CAEA,IAAIF,KAAW;EACd,OAAO,KAAK,KAAK,aAAa,SAAS,KAAK,KAAK,KAAK,aAAa,UAAU;CAC9E;AACD;AAEK,eAAe,IAAI,YAAY,KACnC,eAAe,OAAO,cAAcF,CAAa;;ACxDlD,IAAMK,IAAN,cAA8BN,EAC9B;CACC;CAEA,cAAe;EACd,MAAM;CACP;CAEA,oBAAoB;EAQnB,AANA,MAAM,kBAAkB,GAExB,KAAKnY,GAAU,GAEf,KAAKqY,KAAU,KAAK,cAAc,OAAO,GAEzC,KAAKlE,GAAW;CAGjB;CAEA,WAAkB;EACjB,KAAK,YAAY;CAGlB;CAEA,WAAmB;EAQlB,AAPA,KAAKkE,GAAQ,iBAAiB,WAAW,KAAKK,EAAU,GAExD,KAAKL,GAAQ,iBAAiB,UAAU,MAAU;GAEjD,AADA,KAAK,QAAQG,EAAM,OAAO,OAC1B,KAAK,MAAM,WAAW,QAAQ,EAAI;EACnC,CAAC,GAED,KAAKH,GAAQ,iBAAiB,WAAW,MAAU;GAElD,AADA,KAAK,QAAQG,EAAM,OAAO,OAC1B,KAAK,MAAM,WAAW,QAAQ,EAAI;EACnC,CAAC;CACF;CAEA,gBAAgB;EACf,IAAMh1B,IAAI,MAAM,QAAQ;EAIxB,AAFA,KAAK60B,GAAQ,QAAQ70B,GAEjB,KAAK,QAAQ,KAChB,KAAKm1B,GAAU;CAEjB;CAEA,WAAkB;EAEjB,IAAMn1B,IAAI,KAAK60B,GAAQ;EAEvB,IAAI70B,MAAM,MAAMA,KAAM,MAAyB;GAC9C,IAAMmqB,IAAM,OAAOnqB,CAAC;GAEpB,IAAI,MAAMmqB,CAAG,KAAM,KAAKiL,MAAQjL,IAAM,OAAO,KAAKiL,EAAI,KAAO,KAAKC,MAAQlL,IAAM,OAAO,KAAKkL,EAAI,GAC/F,KAAK,KAAK,UAAU,IAAI,SAAS;QAE7B,IAAI,KAAKC,IAAQ;IACrB,IAAMC,IAAM,OAAOv1B,CAAC,GACdsB,IAAMi0B,EAAI,QAAQ,GAAG;IAC3B,AAAIj0B,KAAO,KAAKi0B,EAAI,UAAUj0B,IAAM,CAAC,CAAC,CAAC,SAAS,OAAO,KAAKg0B,EAAM,KACjE,KAAK,KAAK,UAAU,IAAI,SAAS;GAEnC;EACD;CACD;CAEA,MAAa,MAAK;EAEjB,IAAI;GAAC;GAAU;GAAS;GAAO;GAAQ;GAAO;GAAa;GAAc;GAAU;GAAY;GAAa;EAAQ,CAAC,CAAC,SAAS,EAAE,IAAI,GAAG;EAExI,IAAMx2B,IAAS,EAAE,QACX4C,IAAQ5C,EAAO,OACf02B,IAAiB12B,EAAO,gBACxBoP,IAAM,EAAE;EAEd,IAAIA,MAAQ,QACPxM,EAAM,SAAS,GAAG,KAAK8zB,MAAmB,IAAG;GAChD,EAAE,eAAe;GACjB;EACD;EAGD,IAAItnB,MAAQ,KAAK;GAChB,IAAMunB,IAAQ,OAAO,KAAKH,EAAM;GAEhC,IAAI,MAAMG,CAAK,KAAKA,KAAS,KAAK/zB,EAAM,SAAS,GAAG,GAAG;IACtD,EAAE,eAAe;IACjB;GACD;EACD;EAEA,IAAIg0B,IAAW,CAAC;EAEhB,AADI,KAAKJ,MAAU,OAAO,KAAKA,EAAM,IAAI,KAAGI,EAAS,KAAK,GAAG,IACzD,KAAKL,MAAQ,OAAO,KAAKA,EAAI,IAAI,MAAGK,EAAS,KAAK,GAAG;EAEzD,IAAMC,IAAY,EAAE,WAAW,MAAM,EAAE,WAAW,MAAQ,EAAE,WAAW,MAAM,EAAE,WAAW;EAE1F,IAAI,CAACA,KAAY,CAACD,EAAS,SAAS,EAAE,GAAG,GACxC,EAAE,eAAe;OAIlB;OAAI,KAAKJ,MAAUK,KAAY,EAAE,OAAO,kBAAkB,EAAE,OAAO,cAAc;IAChF,IAAMhwB,IAAI,EAAE,OAAO,OACbrE,IAAMqE,EAAE,QAAQ,GAAG;IACzB,AAAIrE,KAAO,KAAK,EAAE,OAAO,iBAAiBA,KACrBqE,EAAE,OAAOrE,IAAM,CACrB,CAAC,CAAC,UAAU,OAAO,KAAKg0B,EAAM,KAC3C,EAAE,eAAe;GAGpB;GAEA,AAAI,KAAKR,MAAY,KAAK,cAAc,EAAE,OAAO,KAAK,KAAK,OAAO,KAAKA,EAAQ,KAAK,EAAE,OAAO,kBAAkB,EAAE,OAAO,gBACvH,EAAE,eAAe;EAHlB;CAKD;CAEA,IAAIO,KAAO;EACV,OAAO,KAAK,KAAK,aAAa,KAAK,KAAK;CACzC;CAEA,IAAID,KAAO;EACV,OAAO,KAAK,KAAK,aAAa,KAAK,KAAK;CACzC;CAEA,IAAIE,KAAS;EACZ,OAAO,KAAK,KAAK,aAAa,OAAO,KAAK;CAC3C;CAEA,IAAIR,KAAW;EACd,OAAO,KAAK,KAAK,aAAa,SAAS,KAAK,KAAK,KAAK,aAAa,UAAU;CAC9E;AACD;AAEK,eAAe,IAAI,mBAAmB,KAC1C,eAAe,OAAO,qBAAqBG,CAAe;;AC7I3D,IAAMW,IAAN,cAA6BjB,EAC7B;CACC;CACA;CACA;CAEA,cAAe;EACd,MAAM;CACP;CAEA,oBAAoB;EAWnB,AATA,MAAM,kBAAkB,GAExB,KAAKnY,GAAU,GAEf,KAAKqY,KAAU,KAAK,cAAc,mBAAmB,GACrD,KAAKgB,KAAO,KAAK,cAAc,QAAQ,GAIvC,KAAKlF,GAAW;CACjB;CAEA,WAAmB;EAalB,AAZA,KAAKkF,GAAK,iBAAiB,eAAe;GACzC,KAAKhB,GAAQ,MAAM;EACpB,CAAC,GAED,KAAKA,GAAQ,iBAAiB,UAAU,MAAU;GACjD,IAAMze,IAAM4e,EAAM,OAAO;GAIzB,AAHA,KAAK,QAAQ5e,GACb,KAAK+e,GAAU/e,CAAG,GAElB,KAAK,MAAM,WAAW,QAAQ,EAAI;EACnC,CAAC,GAED,KAAKye,GAAQ,iBAAiB,WAAW,MAAU;GAClD,IAAMze,IAAM4e,EAAM,OAAO;GAIzB,AAHA,KAAK,QAAQ5e,GACb,KAAK+e,GAAU/e,CAAG,GAElB,KAAK,MAAM,WAAW,QAAQ,EAAI;EACnC,CAAC;CACF;CAEA,WAAkB;EACjB,KAAK,YAAY;CAIlB;CAEA,mBAAmB;EAClB,KAAK,QAAQ;CACd;CAEA,WAAuB;EAEtB,IAAMnU,IAAa,KAAK,KAAK,aAAa,aAAa;EACvD,IAAKA,MAEL,KAAK6zB,KAAc,MAAM,aAAa7zB,GAAY,KAAK,GAAG,MAAM,KAAK,GAAG,QAAQ,GAAG,GAEnF,KAAK,cAAc,UAAU,CAAC,EAAE,OAAO,GAEnC,KAAK6zB,MAAe,MAAM,QAAQ,KAAKA,EAAW,IAAG;GACxD,IAAMC,IAAa,cAAc,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,KAEjEC,IAAW,SAAS,cAAc,UAAU;GAClD,EAAS,KAAKD;GAEd,IAAM9iB,IAAW,SAAS,uBAAuB;GAajD,AAXA,KAAK6iB,GAAY,SAAQ,MAAK;IAC7B,IAAI91B,EAAE,OAAO;KACZ,IAAMi2B,IAAS,SAAS,cAAc,QAAQ;KAE9C,AADA,EAAO,QAAQj2B,EAAE,OACjBiT,EAAS,YAAYgjB,CAAM;IAC5B;GACD,CAAC,GAEDD,EAAS,YAAY/iB,CAAQ,GAC7B,KAAK,YAAY+iB,CAAQ,GAEzB,KAAKnB,GAAQ,aAAa,QAAQkB,CAAU;EAC7C;CACD;CAEA,gBAAgB;EACf,IAAI,CAAC,KAAK,GAAG,MAAM;EAEnB,IAAM/1B,IAAI,MAAM,QAAQ;EAMxB,AAJA,KAAKk2B,GAAe,GAEpB,KAAKrB,GAAQ,QAAQ70B,KAAyB,QAAQA,MAAM,KAAKA,IAAI,WAEjE,KAAK,QAAQ,KAChB,KAAKm1B,GAAU;CAEjB;CAEA,WAAkB;EAEjB,IAAMn1B,IAAI,KAAK60B,GAAQ;EAEvB,AAAI70B,MAAM,MAAMA,KAAM,SAChB,KAAKm2B,GAAcn2B,CAAC,IAGhB,KAAK81B,MAAe,MAAM,QAAQ,KAAKA,EAAW,KAAK,KAAKA,GAAY,SAAS,MAC1E,KAAKA,GAAY,MAAK,OACnB90B,EAAK,UAAU,KAAA,IAA0BA,EAAK,SAAS,KAAA,IAAwB,KAAZA,EAAK,OAA7CA,EAAK,MAA+C,CAChF,YAAY,MAAMhB,EAAE,YAAY,CAGvC,KACT,KAAK,KAAK,UAAU,IAAI,SAAS,KATlC,KAAK,KAAK,UAAU,IAAI,SAAS;CAapC;CAEA,MAAiB,MAAM;EACtB,IAAI,OAAOA,KAAM,YAAYA,EAAE,UAAU,KAAK,CAACA,EAAE,WAAW,GAAG,GAAG,OAAO;EAEzE,IAAIqO,IAAI,SAASrO,EAAE,OAAO,GAAG,CAAC,GAAG,EAAE,GAC/Bo2B,IAAI,SAASp2B,EAAE,OAAO,GAAG,CAAC,GAAG,EAAE,GAC/BmD,IAAI,SAASnD,EAAE,OAAO,GAAG,CAAC,GAAG,EAAE;EAKnC,OAFA,EADI,MAAMqO,CAAC,KAAK,MAAM+nB,CAAC,KAAK,MAAMjzB,CAAC,KAC/BkL,IAAI,KAAKA,IAAI,OAAO+nB,IAAI,KAAKA,IAAI,OAAOjzB,IAAI,KAAKA,IAAI;CAG1D;AACD;AAEK,eAAe,IAAI,kBAAkB,KACzC,eAAe,OAAO,oBAAoByyB,CAAc;;AC3IzD,IAAMS,IAAN,cAA4B1B,EAC5B;CACC;CACA;CAEA,cAAe;EACd,MAAM;CACP;CAEA,oBAAoB;EAgBnB,AAfA,MAAM,kBAAkB,GAExB,KAAKnY,GAAU,GAEf,KAAKqY,KAAU,KAAK,cAAc,OAAO,GAEzC,KAAKA,GAAQ,iBAAiB,UAAU,MAAU;GACjD,IAAMze,IAAM4e,EAAM,OAAO;GAKzB,AAJA,KAAK,QAAQ5e,GACb,KAAKye,GAAQ,UAAU,OAAO,aAAa,CAAC,CAACze,CAAG,GAChD,KAAK+e,GAAU/e,CAAG,GAElB,MAAM,MAAM,WAAW,QAAQ,EAAI;EACpC,CAAC,GAED,KAAKye,GAAQ,iBAAiB,WAAW,MAAU;GAClD,IAAMze,IAAM4e,EAAM,OAAO;GAIzB,AAHA,KAAK,QAAQ5e,GACb,KAAK+e,GAAU/e,CAAG,GAElB,MAAM,MAAM,WAAW,QAAQ,EAAI;EACpC,CAAC;CACF;CAEA,WAAkB;EAGjB,IADA,KAAKkgB,KAAQ,KAAK,KAAK,aAAa,WAAW,KAAK,QAChD,CAAC;GAAC;GAAO;GAAiB;GAAO;GAAO;EAAO,CAAC,CAAC,SAAS,KAAKA,EAAK,GACvE,MAAM,kBAAkB,KAAKA;EAG9B,IAAIvxB,IAAO,CAAC;EACZ,KAAK,IAAInB,IAAI,GAAGA,IAAI,KAAK,KAAK,WAAW,QAAQ,KAChD,AAAI;GAAC;GAAS;GAAO;GAAO;EAAM,CAAC,CAAC,SAAS,KAAK,KAAK,WAAWA,EAAE,CAAC,IAAI,KACxEmB,EAAK,KAAK,GAAG,KAAK,KAAK,WAAWnB,EAAE,CAAC,KAAK,IAAI,KAAK,KAAK,WAAWA,EAAE,CAAC,MAAM,EAAE;EAIhF,KAAK,YAAY;;qBAEE,KAAK0yB,GAAM;iCACC,KAAK,KAAK,aAAa,aAAa,KAAK,SAAS;eACpEvxB,EAAK,KAAK,GAAG,EAAE;;;;CAI7B;CAEA,gBAAgB;EAEf,IAAM/E,IAAI,MAAM,QAAQ,GAEpBu2B,IAAev2B;EACnB,IAAIu2B,GAEH,QAAQ,KAAKD,IAAb;GACC,KAAK;IACJ,IAAeC,EAAa,OAAO,GAAG,EAAE;IACxC;GACD,KAAK;IACJ,IAAeA,EAAa,OAAO,GAAG,EAAE;IACxC;GACD,KAAK;IACJ,IAAIC,IAAI,IAAI,KAAKx2B,CAAC;IAClB,AAAIw2B,KAAK,kBAAkB,CAAC,MAAMA,CAAC,MAClC,KAAgB,OAAOA,EAAE,SAAS,EAAA,CAAG,MAAM,EAAE,IAAI,OAAO,OAAOA,EAAE,WAAW,EAAA,CAAG,MAAM,EAAE;IAExF;GACD,KAAK;IACJ,IAAIA,IAAI,IAAI,KAAKx2B,CAAC;IAClB,AAAIw2B,KAAK,kBAAkB,CAAC,MAAMA,CAAC,MAClC,KAAgB,SAASA,EAAE,YAAY,EAAA,CAAG,MAAM,EAAE,IAAI,OAAO,QAAQA,EAAE,SAAS,IAAI,GAAA,CAAI,MAAM,EAAE;EAGnG;EAMD,AAHA,KAAK3B,GAAQ,QAAQ0B,KAAgB,IACrC,KAAK1B,GAAQ,UAAU,OAAO,aAAa,CAAC,CAAC0B,CAAY,GAErD,KAAK,QAAQ,KAChB,KAAKpB,GAAUoB,CAAY;CAE7B;CAEA,MAAa,MAAQ;EAEpB,IAAIngB,MAAQ,MAAMA,KAAQ,MAA2B;GACpD,IAAIqgB,IAAU,KAAKC,GAAatgB,CAAG;GAOnC,AALIqgB,MACC,KAAKpB,MAAQjf,IAAM,KAAKif,OAAM,IAAU,KACxC,KAAKD,MAAQhf,IAAM,KAAKgf,OAAM,IAAU,MAGxCqB,KACJ,MAAM,KAAK,UAAU,IAAI,SAAS;EAEpC;CACD;CAEA,MAAgB,MAAM;EAErB,IAAI,OAAOz2B,KAAM,UAAU,OAAO;EAElC,IAAIy2B,IAAU;EAEd,QAAQ,KAAKH,IAAb;GACC,KAAK;GACL,KAAK;IACJ,IAAMK,IAAQ,OAAO32B,EAAE,OAAO,GAAG,CAAC,CAAC,GAC7B42B,IAAQ,OAAO52B,EAAE,OAAO,GAAG,CAAC,CAAC,GAC7B62B,IAAQ,OAAO72B,EAAE,OAAO,GAAG,CAAC,CAAC;IAEnC,IAAI,MAAM22B,CAAI,KAAK,MAAMC,CAAK,KAAK,MAAMC,CAAG,GAC3C,IAAU;SACJ,IAAID,IAAQ,KAAKA,IAAQ,MAAMC,IAAM,KAAKA,IAAM,IACtD,IAAU;SACJ,IAAI;KAAC;KAAG;KAAG;KAAG;IAAE,CAAC,CAAC,SAASD,CAAK,KAAKC,KAAO,IAClD,IAAU;SACJ,IAAID,KAAS,GAAG;KACtB,IAAIE,IAAUH,IAAO,KAAK,MAAMA,IAAO,OAAO,KAAKA,IAAO,OAAO;KACjE,CAAIE,IAAM,MAAOA,KAAO,MAAM,CAACC,OAC9B,IAAU;IAEZ;EAEF;EAEA,IAAIL,GACH,QAAQ,KAAKH,IAAb;GACC,KAAK;IACJ,IAAIzhB,IAAO7U,EAAE,OAAO,IAAI,CAAC,GACrB+2B,IAAO,OAAO/2B,EAAE,OAAO,IAAI,CAAC,CAAC,GAC7Bg3B,IAAO,OAAOh3B,EAAE,OAAO,IAAI,CAAC,CAAC;IAEjC,AAAI6U,KAAK,OAEE,MAAMkiB,CAAI,KAAK,MAAMC,CAAG,KAExBD,IAAO,KAAKA,IAAO,MAAMC,IAAM,KAAKA,IAAM,QACpD,IAAU,MAJV,IAAU;IAMX;GAED,KAAK;IACJ,IAAIL,IAAQ,OAAO32B,EAAE,OAAO,GAAG,CAAC,CAAC,GAC7B42B,IAAQ,OAAO52B,EAAE,OAAO,GAAG,CAAC,CAAC;IAEjC,CAAI,MAAM22B,CAAI,KAAK,MAAMC,CAAK,KAEnBA,IAAQ,KAAKA,IAAQ,QAC/B,IAAU;IAEX;GAED,KAAK;IACJ,IAAID,IAAO,OAAO32B,EAAE,OAAO,GAAG,CAAC,CAAC,GAC5BF,IAAOE,EAAE,OAAO,GAAG,CAAC,GACpBi3B,IAAO,OAAOj3B,EAAE,OAAO,GAAG,CAAC,CAAC;IAEhC,AAAIF,KAAK,OAEE,MAAM62B,CAAI,KAAK,MAAMM,CAAI,KAEzBA,KAAQ,KAAKA,IAAO,QAC9B,IAAU,MAJV,IAAU;EAOb;EAGD,OAAOR;CACR;CAEA,IAAIpB,KAAO;EACV,OAAO,KAAK,KAAK,aAAa,KAAK;CACpC;CAEA,IAAID,KAAO;EACV,OAAO,KAAK,KAAK,aAAa,KAAK;CACpC;AAKD;AAEK,eAAe,IAAI,iBAAiB,KACxC,eAAe,OAAO,mBAAmBiB,CAAa;;ACvMvD,IAAMa,IAAN,cAA2BvC,EAAoB;CAC3C;CACA;CAEA,cAAc;EACV,MAAM;CACV;CAEA,oBAAoB;EAQhB,AAPA,MAAM,kBAAkB,GAExB,KAAKnY,GAAU,GAEf,KAAKqY,KAAU,KAAK,cAAc,OAAO,GACzC,KAAKsC,KAAS,KAAK,cAAc,MAAM,GAEvC,KAAKxG,GAAW;CACpB;CAEA,IAAI,aAAa;EACb,OAAO,CACH;GAAE,OAAO,KAAK;GAAW,MAAM,KAAKyG;EAAU,GAC9C;GAAE,OAAO,KAAK;GAAY,MAAM,KAAKC;EAAW,CACpD;CACJ;CAEA,WAAmB;EAOf,AANI,KAAK,QAAQ,OAAO,KACpB,KAAKxC,GAAQ,iBAAiB,WAAW,MAAM;GAC3C,MAAM,MAAM,cAAc,yBAAyB,MAAM,KAAK,QAAQ,IAAI,iBAAiB,CAAC,EAAE,UAAU,EAAE,OAAO,OAAO;EAC5H,CAAC,GAGL,KAAKA,GAAQ,iBAAiB,WAAW,MAAU;GAC/C,AAAK,KAAK,QAAQ,OAAO,MAErB,KAAKyC,MACL,KAAK,UAAU,EAAK,GACpB,KAAK,QAAQ,KAAK,aAGlB,KAAK,QAAQtC,EAAM,OAAO,UAAU,KAAK,YAAY,KAAK,YAG9D,KAAK,MAAM,WAAW,QAAQ,EAAI;EACtC,CAAC;CACL;CAEA,WAAkB;EAEd,IAAMuC,IAAY,KAAK,WAGjBpM,IAAkB,KAAK,KAAK,aAAa,SAAS,KAAK,IACvDqM,IAAY,KAAKF,KAAW,8BAA8BC,EAAU,QAAQ,yCAAyCpM,EAAgB;EAE3I,KAAK,YAAY;cACXqM,EAAU;;CAEpB;CAEA,gBAAgB;EACZ,IAAMphB,IAAM,MAAM,QAAQ;EAI1B,AAFA,KAAKye,GAAQ,UAAWze,MAAQ,KAAK,WAEjC,KAAK,QAAQ,KACb,KAAK+e,GAAU/e,CAAG;EAGtB,IAAMqhB,IAAerhB,MAAQ,KAAK,YAAa,KAAKghB,KAAchhB,MAAQ,KAAK,aAAc,KAAKihB,KAAajhB;EAE/G,AAAI,KAAK+gB,OACL,KAAKA,GAAO,cAAcM;CAElC;CAEA,MAAa,MAAQ;EAIjB,AAFA,KAAK,KAAK,UAAU,OAAO,SAAS,GAEhCrhB,MAAQ,MAAMA,KAAQ,QAClBA,MAAQ,KAAK,aAAaA,MAAQ,KAAK,cACvC,KAAK,KAAK,UAAU,IAAI,SAAS;CAG7C;CAEA,aAAa,MAAM;EACf,IAAI,KAAK,QAAQ,OAAO,GAAG;EAE3B,IAAMie,IAAO,KAAK,KAAK,KAAK,SAAS,GAC/B5yB,IAAW,KAAK,KAAK,OAAO,QAAQ,KAAK,KAAK,QAAQ,IAAI;EAEhE,IAAI,MAAW,IAEf;QAAK,IAAImC,IAAI,GAAGA,IAAIywB,EAAK,QAAQ,KAC7B,AAAI,KAAKqD,MAAW,MAAM,aAAa,KAAKA,IAASrD,EAAKzwB,IAAIA,GAAG,KAAK,IAAI,MAAM,MAC5E,KAAK+zB,MAAa,MAAM,aAAa,KAAKA,IAAWtD,EAAKzwB,IAAIA,GAAG,KAAK,IAAI,MAAM,MAChF,KAAKg0B,MAAY,MAAM,aAAa,KAAKA,IAAUvD,EAAKzwB,IAAIA,GAAG,KAAK,IAAI,MAAM,OAElF,EAAKA,EAAE,CAAC,EAAEnC,KAAYzB,IAAI,KAAK,YAAY,KAAK;GAGpD,MAAM,MAAM,WAAW;EAFvB;CAGJ;CAEA,IAAI,YAAY;EACZ,OAAO,KAAK,KAAK,aAAa,YAAY,KAAK;CACnD;CACA,IAAI,aAAa;EACb,OAAO,KAAK,KAAK,aAAa,aAAa,KAAI;CACnD;CACA,IAAIo3B,KAAY;EACZ,OAAO,KAAK,KAAK,aAAa,WAAW,KAAK;CAClD;CACA,IAAIC,KAAa;EACb,OAAO,KAAK,KAAK,aAAa,YAAY,KAAK;CACnD;CACA,IAAIC,KAAW;EACX,OAAO,KAAK,KAAK,aAAa,UAAU,KAAK;CACjD;CACA,IAAII,KAAU;EACV,OAAO,KAAK,KAAK,aAAa,QAAQ,KAAK;CAC/C;CACA,IAAIC,KAAY;EACZ,OAAO,KAAK,KAAK,aAAa,UAAU,KAAK;CACjD;CACA,IAAIC,KAAW;EACX,OAAO,KAAK,KAAK,aAAa,SAAS,KAAK;CAChD;AACJ;AAEK,eAAe,IAAI,eAAe,KACnC,eAAe,OAAO,iBAAiBV,CAAY;;ACtIvD,IAAMW,IAAN,cAAwBlD,EAAoB;CAC3C;CACA,KAAa,CAAC;CACd,KAAc,CAAC;CAEf,cAAc;EACb,MAAM;CACP;CAEA,oBAAoB;EAOnB,AANA,MAAM,kBAAkB,GAExB,KAAKnY,GAAU,GAEf,KAAKsb,GAAe,GAEpB,KAAKnH,GAAW;CACjB;CAEA,WAAmB;EAElB,KAAK,KAAK,iBAAiB,YAAW,MAAK;GAE1C,IAAI,OAAK,KAAK,aAAa,UAAU,KAAK,KAAK,KAAK,UAAU,SAAS,UAAU,MAC7E,KAAK,KAAK,aAAa,UAAU,MAAM,UAEvC,EAAE,SAAS,SAAS;IACvB,EAAE,eAAe;IAEjB,IAAIoH,IAAa;IAYjB,AAVA,KAAKC,GAAW,SAAS,GAAI,MAAU;KACtC,IAAI,KAAK,UAAUpmB,EAAI,aAAa,OAAO,GAE1C,OADA,IAAatO,GACN;IAET,CAAC,GAED,IAAcy0B,MAAe,KAAKC,GAAW,SAAS,IAAK,IAAKD,KAAc,IAAIA,IAAa,IAAI,GACnG,KAAK,QAAQ,KAAKC,GAAWD,EAAW,CAAC,aAAa,OAAO,GAE7D,KAAK,MAAM,WAAW,QAAQ,EAAI;GACnC;EACD,CAAC;CACF;CAEA,WAAuB;EAEtB,IAAI,CAAC,KAAK,MAAM;EAEhB,IAAM91B,IAAa,KAAK,KAAK,aAAa,aAAa;EACvD,IAAKA,MAEL,KAAK6zB,KAAc,MAAM,aAAa7zB,GAAY,KAAK,GAAG,MAAM,KAAK,GAAG,QAAQ,GAAG,GAEnF,KAAK4yB,GAAQ,gBAAgB,GAEzB,KAAKiB,MAAe,MAAM,QAAQ,KAAKA,EAAW,IAAG;GAExD,IAAM7iB,IAAW,SAAS,uBAAuB;GA2BjD,AAzBA,KAAK6iB,GAAY,SAAQ,MAAK;IAC7B,IAAMmC,IAAUj4B,EAAE,KAAKk4B,QAAc,KAAA,IAA+B,KAAnBl4B,EAAE,KAAKk4B,KAClDC,IAAUn4B,EAAE,KAAKo4B,QAAgB,KAAA,IAAiC,KAArBp4B,EAAE,KAAKo4B,KAEpDC,IAAQ,SAAS,cAAc,OAAO,GAEtCC,IAAQ,SAAS,cAAc,OAAO;IAE5C,AADA,EAAM,OAAO,SACb,EAAM,QAAQL;IAEd,IAAMM,IAAO,SAAS,cAAc,MAAM;IAK1C,AAJA,EAAK,cAAcJ,GAEnBE,EAAM,YAAYC,CAAK,GACvBD,EAAM,YAAYE,CAAI,GACtBtlB,EAAS,YAAYolB,CAAK;GAC3B,CAAC,GAED,KAAKxD,GAAQ,YAAY5hB,CAAQ,GAGjC,KAAK+kB,KAAa,MAAM,KAAK,KAAK,iBAAiB,OAAO,CAAC,GAI3D,KAAKA,GAAW,SAAQ,MAAO;IAC9B,EAAI,iBAAiB,WAAW,MAAM;KAErC,AADA,KAAK,QAAQ,EAAE,OAAO,OACtB,KAAK,MAAM,WAAW,QAAQ,EAAI;IACnC,CAAC;GACF,CAAC;EACF;CACD;CAEA,WAAkB;EAMjB,AAJA,KAAK,YAAY,8BAIjB,KAAKnD,KAAU,KAAK,cAAc,KAAK;CACxC;CAEA,mBAAmB;EAElB,AADA,KAAKiD,GAAe,GACpB,KAAK,QAAQ;CACd;CAEA,gBAAgB;EAEf,IAAM93B,IAAI,MAAM,QAAQ;EAMxB,AAJA,KAAKg4B,GAAW,SAAQ,MAAO;GAC9B,EAAI,UAAWh4B,MAAM4R,EAAI;EAC1B,CAAC,GAEG,KAAK,QAAQ,KAChB,KAAKujB,GAAU;CAEjB;CAEA,WAAkB;EAEjB,AAAI,KAAK,UAAU,QAAQ,KAAK,UAAU,KAAA,KAAa,KAAK,UAAU,MAAO,MAAM,QAAQ,KAAKW,EAAW,KAI/F,KAAKA,GAAY,WAAU,MAAK,KAAK,UAAUpO,EAAE,KAAKwQ,GAC5D,IAAI,KACT,KAAK,KAAK,UAAU,IAAI,SAAS;CAEnC;CAEA,IAAI,aAAa;EAChB,OAAO,KAAKpC;CACb;CAEA,IAAIoC,KAAW;EACd,OAAO,KAAK,KAAK,aAAa,UAAU,KAAK;CAC9C;CAEA,IAAIE,KAAa;EAChB,OAAO,KAAK,KAAK,aAAa,YAAY,KAAK;CAChD;AACD;AAEK,eAAe,IAAI,YAAY,KACnC,eAAe,OAAO,cAAcP,CAAS;;ACpJ9C,IAAaW,IAAb,cAAoC,YAAY;CAC/C;CACA;CACA;CACA,KAAU;CAEV;CACA;CACA;CAEA,cAAc;EACb,MAAM;CACP;CAEA,oBAAoB;EAInB,AAHA,KAAKhc,GAAU,GAEf,KAAKic,KAAO,KAAK,cAAc,mBAAmB,GAClD,iBAAiB;GAEhB,AADA,KAAK5uB,KAAS,KAAK4uB,GAAK,WAAW,cAAc,kBAAkB,GACnE,KAAK9jB,GAAY;EAClB,CAAC;CACF;CAEA,MAAa,GAAY,GAAS,GAAW,MAAU;EAEtD,IAAM+jB,IAAM,KAAK,cAAc,mBAAmB;EAClD,IAAI,CAACA,KAAO,CAACz2B,KAAcA,EAAW,WAAW,GAAG;EAEpD,IAAM02B,IAAY,KAAKl4B,GAAQ,QAAQ,OAAO,CAAC,CAAC,aAAa,OAAO,GAChEm4B,IAAY,CAAC;EAEjB,AAGCA,IAHGD,IACSA,EAAU,MAAM,GAAG,CAAC,CAAC,KAAI,MAAKhzB,EAAE,KAAK,CAAC,IAEtC,CAACkzB,CAAS,CAAC,CAAC,OAAO,OAAO;EAGvC,IAAMC,IAAoBF,EAAU,QAI9B/yB,IAAQ6yB,EAAI,WAAW,cAAc,kBAAkB;EAS7D,AAPA7yB,EAAM,OAAO,MAAM,iBAAiB,wBAAwB,CAAC,CAAC,SAAS,GAAK,MAAQ;GACnF,IAAMkP,IAAM,SAASnD,EAAI,QAAQ,KAAK,EAAE;GACxC,AAAImD,KAAO,MACV,EAAI,MAAM,UAAWA,IAAM,KAAK+jB,IAAqB,SAAS;EAEhE,CAAC,GAEDJ,EAAI,WAAW,iBAAiB,oBAAoB,CAAC,CAAC,SAAS,GAAK,MAAQ;GAC3E,IAAM3jB,IAAM,SAASnD,EAAI,QAAQ,KAAK,EAAE;GACxC,AAAImD,KAAO,MACV,EAAI,MAAM,UAAWA,IAAM,KAAK+jB,IAAqB,SAAS;EAEhE,CAAC;EAGD,IAAMC,IAAgB92B,EAAW,KAAI,MAAQ;GAC5C,IAAMY,IAAM;IACX,KAAK;IACL,GAAGm2B,KAAWh4B,EAAKg4B,OAAa,KAAA,IAAYh4B,EAAKg4B,KAAYh4B,EAAK,OAAO,KAAA,IAAsB,KAAVA,EAAK;GAC3F;GAKA,OAHA43B,EAAU,SAAS,GAAK,MAAQ;IAC/B,EAAI,MAAMt3B,IAAM,OAAON,EAAKkN,OAAS,KAAA,IAAyBlN,EAAKM,OAAS,KAAA,IAAwB,KAAZN,EAAKM,KAA5CN,EAAKkN;GACvD,CAAC,GACMrL;EACR,CAAC;EA6DD,AA3DA61B,EAAI,iBAAiBn4B,EAAW,MAAM,iBAAiB;GACtD,iBAAiB;IAKhB,AAHA,KAAK,MAAM,UAAU,IACrB,KAAK,UAAU,IAAI,QAAQ,GAE3Bm4B,EAAI,WAAW,iBAAiB,cAAc,CAAC,CAAC,SAAS,GAAK,MAAQ;KACrE,IAAM3jB,IAAM,SAASnD,EAAI,QAAQ,KAAK,EAAE;KACxC,AAAImD,KAAO,KAAKnD,EAAI,MAAM,YAAY,UACrC/L,EAAM,IAAI,QAAQkP,CAAG;IAEvB,CAAC;IAED,IAAMnT,IAAS,KAAK62B,GAAK,OAAO,IAAI;IAEpC,IAAIQ,GAAO;KACV,IAAMC,IAAe,KAAKz4B,GAAQ,QAAQ,OAAO,KAAKA,GAAQ,KAAK,CAAC,CAAC,MAAM,KAAK04B,EAAU,CAAC,CAAC,KAAI,MAAKxzB,EAAE,KAAK,CAAC,IAAI,CAAC,GAC5GyzB,IAASx3B,EAAO,QAAQ,GAAG,GAC3By3B,IAAWz3B,EAAO,QAAQ,KAAK;KAErC,KAAK62B,GAAK,KAAK,SAAS,CAAC,CAAC,SAAQ,MAAU;MAC3C,EAAO,EAAEY,KAAaH,EAAa,SAAS,OAAOz2B,EAAO,EAAE22B,EAAO,CAAC,IAAK,MAAM;KAChF,CAAC;KAED,IAAM91B,IAAQ,KAAKuG,GAAO,KAAK,SAAS,CAAC,CAAC,WAAW,GAAQ,MACrDpH,EAAO,EAAE22B,OAAYF,EAAa,EACzC;KAED,KAAKI,GAAWh2B,CAAK;IACtB,OAAO;KACN,IAAMi2B,IAAe,KAAK94B,GAAQ,OAC5B24B,IAASx3B,EAAO,QAAQ,GAAG,GAC3B0B,IAAQ,KAAKuG,GAAO,KAAK,SAAS,CAAC,CAAC,WAAW,GAAQ,MACrDpH,EAAO,EAAE22B,OAAYG,CAC5B;KAED,KAAKD,GAAWh2B,CAAK;IACtB;GACD,CAAC;EACF,GAAG,EAAC,MAAM,GAAI,CAAC,GAEX21B,KAAS,KAAKx4B,GAAQ,OAYtBs4B,EAAc,SAAS,KAAKlvB,GAAO,SAAS,UAAU,KAAK,eAC9D,KAAK,UAAU,IAAI,QAAQ,IAE3B,KAAK,UAAU,OAAO,QAAQ,GAG/B6uB,EAAI,KAAK,IAAIK,CAAa;CAG3B;CAEA,MAAiB,MAAS;EACzB,IAAM9H,IAASuI,EAAK,QAAQ,gBAAgB,GAEtCC,IAAUD,EAAK,sBAAsB,GACrC/e,IAAYwW,EAAO,sBAAsB;EAI/C,OAHmBxW,EAAU,SAASgf,EAAQ,UAC3BA,EAAQ,MAAMhf,EAAU;CAG5C;CAEA,MAAyB,GAAM,IAAa,MAAM;EACjD,IAAMwW,IAASuI,EAAK,QAAQ,gBAAgB,GAEtCC,IAAUD,EAAK,sBAAsB,GACrC/e,IAAYwW,EAAO,sBAAsB;EAI/C,QAFSyI,IAAcjf,EAAU,SAASgf,EAAQ,SAAWA,EAAQ,MAAMhf,EAAU,OAAQ;CAG9F;CAEA,MAAuB,MAAS;EAE/B,IAAMlO,IAAQitB,EAAK,QAAQ,OAAO,GAC5BvI,IAAS1kB,EAAM,QAAQ,gBAAgB,GAGvC2L,IAAW3L,EAAM,sBAAsB,GACvCkO,IAAYwW,EAAO,sBAAsB,GAE3C3P,IAAOpJ,EAAS,OAAOuC,EAAU,MAE/BkJ,IAAa,KAAK;EASxB,OARIrC,IAAOqC,IAAalJ,EAAU,UACjC,IAAO,KAAK,IAAI,GAAGA,EAAU,QAAQkJ,IAAa,CAAC,IAGhDrC,IAAO,MACV,IAAO,IAGDA;CACR;CAEA,QAAQ,GAAQ,GAAY,GAAS,GAAW,GAAO,MAAc;EAWpE,AAVA,KAAK7gB,KAAUC,GACf,KAAKw3B,KAAWc,GAChB,KAAKZ,KAAaS,GAClB,KAAKc,KAAU,IAEf,KAAKR,KAAaS,GAElB,KAAK,UAAU,IAAI,QAAQ,GAC3B,KAAK,MAAM,UAAU,KAErB,iBAAiB;GAEhB,IAAI,CADQ,KAAK,cAAc,mBACxB,KAAK,CAAC33B,GAAY;GAGzB,AADA,KAAK,cAAc,eAAe,CAAC,CAAC,QAAQ,IAC5C,KAAK,cAAc,SAAS,CAAC,CAAC,UAAU;GAExC,IAAM4D,IAAQnF,EAAO,QAAQ,gBAAgB,GACvC+4B,IAAU/4B,EAAO,sBAAsB,GACvC+Z,IAAY5U,EAAM,sBAAsB,GAExC6zB,IAAa,KAAKG,GAAcn5B,CAAM,GACtCX,IAAI,KAAK+5B,GAAsBp5B,GAAQg5B,CAAU,GACjDjxB,IAAI,KAAKsxB,GAAoBr5B,CAAM,GACnCmU,IAAI6kB,IAAcD,EAAQ,SAAShf,EAAU,MAAQgf,EAAQ,MAAMhf,EAAU,MAAM1a;GAezF,AAbA,KAAK,MAAM,SAAS,GAAGA,EAAE,KACzB,KAAK,MAAM,OAAO,GAAG0I,EAAE,KACvB,KAAK,MAAM,MAAM,GAAGoM,EAAE,KAGlBokB,KACH,KAAK,UAAU,IAAI,OAAO,GAC1B,KAAKR,GAAK,UAAU,IAAI,OAAO,MAE/B,KAAK,UAAU,OAAO,OAAO,GAC7B,KAAKA,GAAK,UAAU,OAAO,OAAO,IAGnC,KAAKuB,GAAU/3B,GAAY+2B,GAASH,GAAWI,CAAK;EACrD,GAAG,GAAG;CACP;CAEA,cAAc;EAGb,AAFA,KAAK,UAAU,OAAO,QAAQ,GAC9B,KAAKU,KAAU,IACX,KAAKl5B,MAAW,KAAKA,GAAQ,QAChC,KAAKA,GAAQ,KAAK,MAAM;CAE1B;CAMA,MAAY,MAAM;EACjB,IAAM8L,IAAQ,EAAE,OAAO,QAAQ,OAAO;EACtC,IAAI,KAAKksB,GAAK,UAAU,SAAS,OAAO,GAAG;GAC1C,IAAMn1B,IAAQ,SAASiJ,GAAO,QAAQ,OAAO,EAAE;GAC/C,KAAK0tB,GAAU32B,CAAK;EACrB,OAIC,AAFY,SAASiJ,GAAO,QAAQ,KAAK,EAEnC,KAAK,KACV,KAAK2tB,GAAW;CAGnB;CAEA,MAAoB,MAAM;EACzB,QAAQ,EAAE,MAAV;GACC,KAAK;GACL,KAAK;IACJ,IAAM52B,IAAQ,KAAKm1B,GAAK,IAAI,GAAG;IAC/B,AAAIn1B,IAAQ,IACX,KAAKg2B,GAAW,CAAC,IAEjB,KAAKA,GAAWh2B,CAAK;IAEtB;GACD,KAAK,OACJ,KAAKg2B,GAAW,KAAKb,GAAK,IAAI,GAAG,CAAC;EAEpC;CACD;CAEA,MAAc,MAAM;EACnB,IAAIn1B;EACJ,QAAQ,EAAE,MAAV;GACC,KAAK;IACJ,KAAK,MAAM;IACX;GACD,KAAK;IACJ,AAAI,KAAK,UAAU,SAAS,OAAO,IAClC,KAAKkgB,GAAM,IAEX,KAAK0W,GAAW;IAEjB;GACD,KAAK;IACJ,AAAI,KAAK,UAAU,SAAS,QAAQ,MACnC,EAAE,eAAe,GACjB,KAAK,cAAc,oBAAoB,CAAC,CAAC,MAAM;IAEhD;GACD,KAAK;IAEJ,AADA,IAAQ,KAAKzB,GAAK,IAAI,GAAG,GACrBn1B,IAAQ,KACX,KAAKg2B,GAAW,CAAC;IAElB;GACD,KAAK,SAEJ,AADA,EAAE,eAAe,GACb,CAAC,MAAK,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,OAAO,KACxC,KAAKW,GAAU,KAAKxB,GAAK,IAAI,GAAG,CAAC;EAIpC;CACD;CAEA,WAAc;EAEb,IAAM72B,IAAS,KAAK62B,GAAK,OAAO,IAAI,GAC9BW,IAASx3B,EAAO,QAAQ,GAAG,GAC3By3B,IAAWz3B,EAAO,QAAQ,KAAK,GAE/BU,IAAM,CAAC;EAUb,AATA,KAAKuH,GAAO,KAAK,SAAS,CAAC,CAAC,SAAQ,MAAK;GACxC,AAAItH,EAAE,EAAE82B,OAAc,OACrB/2B,EAAI,KAAKC,EAAE,EAAE62B,EAAO;EAEtB,CAAC,GAED,KAAK34B,GAAQ,QAAQ6B,EAAI,KAAK,KAAK62B,EAAU,GAE7C,KAAK14B,GAAQ,MAAM,WAAW,QAAQ,EAAI,GAC1C,KAAK,MAAM;CACZ;CAEA,WAAmB;EAClB,IAAM6C,IAAQ,KAAKm1B,GAAK,IAAI,GAAG;EAE/B,IAAIn1B,KAAS,GAAG;GACf,IAAMb,IAAS,KAAKoH,GAAO,KAAK,IAAIvG,CAAK;GAIzC,AAFA,KAAK7C,GAAQ,QAAQgC,EAAO,GAC5B,KAAKhC,GAAQ,MAAM,WAAW,QAAQ,EAAI,GAC1C,KAAK,MAAM;EACZ;CACD;CAEA,MAAa,MAAU;EAEtB,IAAI,KAAKg4B,GAAK,UAAU,SAAS,OAAO,KAAKn1B,KAAS,GAAG;GACxD,IAAMb,IAAS,KAAKoH,GAAO,KAAK,IAAIvG,CAAK;GAIzC,AAFA,KAAKm1B,GAAK,KAAK,SAASh2B,EAAO,EAAE,EAAElC,EAAW,KAAK,MAAM,QAAQ,OAAOkC,EAAO,QAAQ,MAAM,MAAM,GAAG,GAEtG,KAAKg2B,GAAK,QAAQ;EACnB;CACD;CAEA,MAAc,MAAU;EACvB,AAAIn1B,MAAU,MAUb,KAAKuG,GAAO,IAAI,MAAM,UAAU,CAChC,CAAC,GAED,iBAAiB;GAKhB,AAJA,KAAKA,GAAO,UAAU,MAAM,GAE5B,KAAKA,GAAO,WAAW,cAAc,KAAKA,GAAO,cAAc,yCAAqC,GACpG,KAAKA,GAAO,MAAM,GAClB,KAAKA,GAAO,WAAW;EACxB,CAAC,KAlBD,KAAKA,GAAO,IAAI,MAAMvG,SAAa;GAClC,iBAAiB;IAChB,IAAMsS,IAAO,KAAK/L,GAAO,cAAc,kBAAkBvG,EAAM,oBAAoB;IAGnF,AAFA,KAAKuG,GAAO,WAAW,cAAc+L,GACrCA,EAAK,MAAM,GACX,KAAK/L,GAAO,WAAW;GACxB,CAAC;EACF,CAAC;CAaH;CAEA,MAAgB,MAAM;EAErB,IAAM6b,IAAS,KAAK+S,GAAK,OAAO,IAAI,CAAC,CAAC,QAAQ,KAAK;EAMnD,AAJA,KAAKA,GAAK,KAAK,SAAS,CAAC,CAAC,SAAQ,MAAU;GAC3C,EAAO,EAAE/S,KAAU,EAAE,OAAO,UAAU,MAAM;EAC7C,CAAC,GAED,KAAK7b,GAAO,WAAW;CACxB;CAGA,MAAY,MAAM;EACjB,IAAMyb,IAAQ,EAAE,OAAO,MAAM,YAAY,CAAC,CAAC,KAAK;EAEhD,IAAI,CAACA,GACJ,KAAKzb,GAAO,UAAU,MAAM;OACtB;GACN,IAAMkD,IAAa,KAAK0rB,GAAK,KAAK,SAAS,GACrC72B,IAAS,KAAK62B,GAAK,OAAO,IAAI,GAE9Bp3B,IAAQ,QACRkkB,IAAW3jB,EAAO,QAAQP,CAAK,GAE/BmkB,IAAgB,CAAC;GAUvB,AATAzY,EAAW,SAAQ,MAAU;IAC5B,IAAMqJ,IAAMmP,KAAY,KAAK9iB,EAAO,IAAIA,EAAO,EAAE8iB,KAAY;IAG7D,AAFgB,OAAOnP,CAAG,CAAC,CAAC,QAAQ,cAAc,EAAE,CAAC,CAAC,YAE5C,CAAC,CAAC,SAASkP,CAAK,KACzBE,EAAc,KAAKpP,CAAG;GAExB,CAAC,GAED,KAAKvM,GAAO,UAAU,IAAI,GACxBxI,IAAQ,CAAC,GAAG,IAAI,IAAImkB,CAAa,CAAC,EACpC,CAAC;EACF;CACD;CAEA,IAAI,SAAS;EACZ,OAAO,KAAKmU;CACb;CAEA,IAAI,aAAa;EAChB,OAAO,KAAKl5B;CACb;CAEA,WAAoB;EASnB,AARA,KAAK,cAAc,eAAe,CAAC,CAAC,iBAAiB,SAAS,KAAK6iB,EAAQ,GAC3E,KAAK,cAAc,eAAe,CAAC,CAAC,iBAAiB,WAAW,KAAK6W,EAAgB,GACrF,KAAK,cAAc,QAAQ,CAAC,CAAC,iBAAiB,SAAS,KAAK3W,EAAK,GACjE,KAAK,cAAc,SAAS,CAAC,CAAC,iBAAiB,UAAU,KAAKD,EAAY,GAE1E,KAAK1Z,GAAO,iBAAiB,WAAW,KAAKuwB,EAAU,GACvD,KAAKvwB,GAAO,iBAAiB,SAAS,KAAK+b,EAAQ,GAEnD,SAAS,iBAAiB,cAAc,MAAM;GAG7C,CAFa,EAAE,eAAe,EAAE,aAAa,IAAI,CAAC,EAAA,CAEzC,SAAS,IAAI,KAGtB,KAAK,MAAM;EACZ,CAAC;CACF;CAEA,WAAkB;EACjB,KAAK,YAAY;CA2ClB;AACD;AAEK,eAAe,IAAI,kBAAkB,KACzC,eAAe,OAAO,oBAAoB4S,CAAc;;ACnezD,IAAa6B,IAAb,cAA+B1F,EAAoB;CAClD;CACA,KAAc,CAAC;CACf;CACA;CACA;CACA;CACA;CAEA,cAAc;EACb,MAAM;CACP;CAEA,oBAAoB;EAInB,AAFA,MAAM,kBAAkB,GAExB,KAAKzwB,GAAM;CACZ;CAEA,mBAAmB;EAElB,AADA,KAAK81B,GAAU,GACf,KAAK,QAAQ;CACd;CAGA,gBAAgB;EACf,IAAMh6B,IAAI,MAAM,QAAQ;EAMxB,OALK,KAAKs6B,OAEV,KAAKA,GAAW,cAAc,KAAKC,GAAgB,KAAK,UACxD,KAAKC,GAAe,IAEbx6B;CACR;CAEA,WAAwB;EACvB,IAAI,CAAC,KAAK,SAAS,CAAC,MAAM,QAAQ,KAAK81B,EAAW,GAAG,OAAO;EAE5D,IAAI,KAAK2E,IAAQ;GAChB,IAAMC,IAAO,OAAO,KAAK,KAAK,CAAC,CAAC,MAAM,KAAKC,EAAe;GAC1D,OAAO,KAAK7E,GACV,QAAO,MAAK4E,EAAK,SAAS,OAAOhT,EAAE,KAAKwQ,GAAS,CAAC,CAAC,CAAC,CACpD,KAAI,MAAKxQ,EAAE,KAAK0Q,GAAW,CAAC,CAC5B,KAAK,KAAKuC,EAAe;EAC5B;EAAO;GACN,IAAMt2B,IAAQ,KAAKyxB,GAAY,MAAK,MAAK,OAAOpO,EAAE,KAAKwQ,GAAS,MAAM,OAAO,KAAK,KAAK,CAAC;GACxF,OAAO7zB,IAAQA,EAAM,KAAK+zB,MAAc,KAAK;EAC9C;CACD;CAEA,WAAuB;EAItB,IAHI,CAAC,MAAM,SACX,MAAM,KAAK,UAAU,OAAO,SAAS,GAEjC,KAAK,UAAU,QAAQ,KAAK,UAAU,KAAA,KAAa,KAAK,UAAU,MAAM,CAAC,MAAM,QAAQ,KAAKtC,EAAW,IAC1G;EAGD,IAAM8E,IAAO,KAAKH,KAAS,OAAO,KAAK,KAAK,CAAC,CAAC,MAAM,KAAKE,EAAe,IAAI,CAAC,KAAK,KAAK;EACvF,KAAK,IAAM36B,KAAK46B,GAEf,IADY,KAAK9E,GAAY,WAAU,MAAK,OAAO91B,CAAC,MAAM,OAAO0nB,EAAE,KAAKwQ,GAAS,CAC3E,IAAI,GAAG;GACZ,MAAM,KAAK,UAAU,IAAI,SAAS;GAClC;EACD;CAEF;CAEA,WAAc;EASb,AARA,KAAK1b,GAAU,GAEf,KAAK0b,KAAW,KAAK,KAAK,aAAa,UAAU,KAAK,KACtD,KAAKE,KAAa,KAAK,KAAK,aAAa,YAAY,KAAK,KAC1D,KAAKqC,KAAS,KAAK,KAAK,aAAa,OAAO,MAAM,QAClD,KAAKE,KAAkB,KAAK,KAAK,aAAa,iBAAiB,KAAK,KAEpE,KAAKX,GAAU,GACf,KAAKrJ,GAAW;CACjB;CAEA,WAAkB;EACjB,IAAI,CAAC,MAAM,SAAS,CAAC,MAAM,MAAM;EAEjC,IAAM1uB,IAAa,MAAM,MAAM,aAAa,aAAa;EACzD,AAAKA,MAEL,KAAK6zB,KAAc,MAAM,aAAa7zB,GAAY,MAAM,GAAG,MAAM,MAAM,GAAG,QAAQ,GAAG;CACtF;CAEA,WAAkB;EAMjB,AALA,KAAK,YAAY,gLAKjB,KAAKq4B,KAAa,KAAK,cAAc,OAAO;CAC7C;CAEA,WAAmB;EASlB,AARA,KAAK,iBAAiB,QAAQ,CAAC,CAAC,SAAQ,MAAO;GAC9C,EAAI,iBAAiB,UAAU,MAAM;IAEpC,AADA,EAAE,gBAAgB,GAClB,KAAKO,GAAa;GACnB,CAAC;EACF,CAAC,GAGD,KAAK,KAAK,iBAAiB,YAAY,MAAM;GAC5C,AAAI,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,IAAI,KAC5B,KAAKA,GAAa;EAEpB,CAAC;CACF;CAEA,WAAqB;EAUpB,AARK,KAAKpiB,OACT,KAAKA,KAAS,MAAM,MAAM,cAAc,kBAAkB,GACrD,KAAKA,OACT,KAAKA,KAAS,SAAS,cAAc,kBAAkB,GACvD,MAAM,MAAM,YAAY,KAAKA,EAAM,KAIjC,KAAKA,GAAO,UAAU,KAAKA,GAAO,eAAe,OACpD,KAAKA,GAAO,MAAM,IAElB,KAAKA,GAAO,KAAK,MAAM,KAAKqd,IAAa,KAAKoC,IAAU,KAAKE,IAAY,KAAKqC,IAAQ,KAAKE,EAAe;CAE5G;CAEA,IAAI,aAAa;EAChB,OAAO,KAAK7E;CACb;AACD;AAEK,eAAe,IAAI,YAAY,KACnC,eAAe,OAAO,cAAcuE,CAAS;;AC3I9C,IAAMS,IAAN,cAA2BnH,EAAY;CACtC;CAEA,cAAc;EACb,MAAM;CACP;CAEA,oBAAoB;EAKnB,AAJA,MAAM,kBAAkB,GAExB,KAAKnX,GAAU,GAEf,KAAKqY,KAAU,KAAK,cAAc,MAAM;CACzC;CAEA,gBAAgB;EAIf,AAFA,MAAM,QAAQ,GAEV,KAAK,KAAK,aAAa,MAAM,MAAM,SACtC,KAAKA,GAAQ,YAAY,KAAK,eAAe,IAE7C,KAAKA,GAAQ,cAAc,KAAK,eAAe;CAEjD;CAEA,WAAkB;EACjB,KAAK,YAAY;CAGlB;AACD;AAEK,eAAe,IAAI,eAAe,KACtC,eAAe,OAAO,iBAAiBiG,CAAY;;ACjCpD,IAAaC,IAAb,cAAgCpH,EAAY;CAC3C;CAEA,cAAc;EACb,MAAM;CACP;CAEA,oBAAoB;EASnB,AAPA,KAAKnX,GAAU,GAEf,MAAM,kBAAkB,GAExB,KAAKqY,KAAU,KAAK,cAAc,QAAQ,GAE1C,KAAKA,GAAQ,oBAAoB,SAAS,KAAKmG,EAAgB,GAC/D,KAAKnG,GAAQ,iBAAiB,SAAS,KAAKmG,EAAgB;CAC7D;CAEA,MAAmB,MAAK;EACvB,EAAE,gBAAgB;EAElB,IAAM54B,IAAQ,SAAS,KAAK,KAAK,QAAQ,KAAK,EAAE,GAE1C64B,IAAc,IAAI,YAAY16B,EAAW,MAAM,mBAAmB;GACvE,SAAS;GACT,UAAU;GACV,QAAQ;IACP,eAAe;IACf,MAAM,KAAK;IACX,KAAK6B;IACL,KAAK,SAAS,KAAK,KAAK,QAAQ,KAAK,EAAE;IACvC,MAAM,KAAK,QAAQ;IACnB,MAAM,KAAK,KAAK,KAAK,IAAIA,CAAK;IAC9B,OAAO,KAAK;GACb;EACD,CAAC;EAED,KAAK,cAAc64B,CAAW;CAC/B;CAEA,gBAAgB;EACf,IAAMC,IAAW,MAAM,UAAU,MAAM,QAAQ,IAAI,KAAK;EAExD,KAAKrG,GAAQ,YAAY,KAAK,eAAeqG,CAAQ;CACtD;CAEA,WAAkB;EAIjB,KAAK,YAAY;CAGlB;AACD;AAEK,eAAe,IAAI,aAAa,KACpC,eAAe,OAAO,eAAeH,CAAU;;AC1DhD,IAAMI,IAAN,cAA+BxH,EAAY;CAC1C;CACA;CACA;CAEA,cAAc;EACb,MAAM;CACP;CAEA,oBAAoB;EAWnB,AAVA,KAAKnX,GAAU,GACf,MAAM,kBAAkB,GAEpB,KAAK,SACR,KAAK,KAAK,gBAAgB,UAAU,GACpC,KAAK,KAAK,QAAQ,OAAO,aAG1B,KAAK4e,KAAc,KAAK,cAAc,cAAc,GACpD,KAAKC,KAAa,KAAK,cAAc,aAAa,GAClD,KAAKC,KAAgB,KAAK,cAAc,aAAa;CACtD;CAEA,WAAkB;EACjB,KAAK,YAAY;CAKlB;CAEA,gBAAgB;EACf,IAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,IAAI;EAE5B,KAAK,UAAU,OAAO,aAAa,aAAa,WAAW;EAE3D,IAAMz4B,IAAM,KAAK;EACjB,IAAI,MAAMA,CAAG,GAAG;EAEhB,IAAMqxB,IAAY,KAAK,GAAG;EAE1B,IAAIA,GACH,QAAQA,EAAU,EAAE,EAAE3zB,EAAW,KAAK,MAAM,YAA5C;GACC,KAAKA,EAAW,UAAU;IACzB,KAAK,UAAU,IAAI,WAAW;IAC9B;GACD,KAAKA,EAAW,UAAU;IACzB,KAAK,UAAU,IAAI,WAAW;IAC9B;GACD,KAAKA,EAAW,UAAU,QACzB,KAAK,UAAU,IAAI,WAAW;EAIhC;EAGD,IAAMg7B,IAAa,KAAK,QAAQ,GAC1BC,IAAeD,EAAW,eAAe;EAE/C,IAAIA,KAAc,KAAO;GAExB,IAAME,IAAaD,EAAa,SAAS,GACnCE,IAAaF,EAAa,UAAU,GAAGC,IAAa,CAAC,GACrDE,IAAaH,EAAa,UAAUC,IAAa,CAAC;GAExD,KAAKL,GAAY,YAAY;2CACWM,EAAW;2CACXC,EAAW;;;EAGpD,OACC,KAAKP,GAAY,YAAY,GAAGI;EAGjC,IAAMI,IAAW,OAAK,MAAM,cAAc,wBAAwB,GAC5DC,IAAY,OAAK,MAAM,cAAc,yCAAyC;EAGpF,AADA,KAAKR,GAAW,YAAYx4B,GAC5B,KAAKw4B,GAAW,MAAM,UAAWO,KAAYC,IAAa,KAAK;CAChE;AACD;AAEK,eAAe,IAAI,oBAAoB,KAC3C,eAAe,OAAO,sBAAsBV,CAAgB;;ACrF7D,IAAaW,KAAb,cAA+B,YAAY;CACvC;CACA;CAEA,cAAc;EACV,MAAM;CACV;CAEA,oBAAoB;EAsBhB,AArBA,KAAKjI,KAAQ,KAAK,QAAQ,QAAQ,GAClC,KAAKhqB,KAAS,KAAK,QAAQ,kBAAkB,GAEzC,KAAKgqB,OACL,KAAKA,GAAM,MAAM,WAAW,aAI5B,KAAK,aAAa,WAAW,MAAM,UACnC,KAAKA,IAAO,aAAa,WAAW,MAAM,SAG1C,4BAA4B;GACxB,KAAK,SAAS,EAAI;EACtB,CAAC,KAED,KAAK,UAAU,OAAO,WAAW,GACjC,KAAK,UAAU,IAAI,QAAQ,IAG/B,KAAK,oBAAoB,SAAS,KAAKjO,EAAQ,GAC/C,KAAK,iBAAiB,SAAS,KAAKA,EAAQ;CAChD;CAEA,MAAY,MAAM;EAId,AAHA,EAAE,eAAe,GACjB,EAAE,gBAAgB,GAEd,KAAK,UAAU,SAAS,QAAQ,IAChC,KAAK,SAAS,IAEd,KAAK,OAAO;CAEpB;CAEA,eAAe;EACX,IAAI,CAAC,KAAK/b,IAAQ,cAAc,CAAC,KAAKgqB,IAAO;EAC7C,IAAMpyB,IAAW,SAAS,KAAKoyB,GAAM,QAAQ,KAAK,EAAE,GAC9Crf,IAAU,KAAKqf,GAAM,WAAW;EAKtC,AAHA,KAAK,UAAU,OAAO,WAAW,GACjC,KAAK,UAAU,IAAI,QAAQ,GAC3B,KAAKA,GAAM,aAAa,aAAa,OAAO,GAC5C,KAAKA,GAAM,MAAM,QAAQ;EAEzB,IAAMpI,IAAc,SAAS,KAAKoI,GAAM,QAAQ,aAAa,EAAE,KAAK;EAEpE,IAAIrf,MAAY,GACZ,KAAK3K,GAAO,WAAW,eAAepI,GAAUgqB,CAAW;OACxD;GACH,IAAMsQ,IAAc,KAAK,IAAI,IAAI,KAAK,MAAMtQ,IAAcjX,CAAO,CAAC;GAClE,KAAK,IAAI5Q,IAAI,GAAGA,IAAI4Q,GAAS,KACzB,KAAK3K,GAAO,WAAW,eAAepI,IAAWmC,GAAGm4B,CAAW;EAEvE;EAEA,4BAA4B;GACxB,AAAI,OAAO,KAAKlyB,GAAO,iBAAkB,cACrC,KAAKA,GAAO,cAAc;EAElC,CAAC;CACL;CAEA,YAAY,IAAgB,OAAU;EAClC,IAAI,CAAC,KAAKA,IAAQ,cAAc,CAAC,KAAKgqB,IAAO;EAC7C,IAAMpyB,IAAW,SAAS,KAAKoyB,GAAM,QAAQ,KAAK,EAAE,GAC9Crf,IAAU,KAAKqf,GAAM,WAAW;EAEtC,IAAI,KAAK,UAAU,SAAS,QAAQ,GAAG;GACnC,IAAM9e,IAAM,KAAKlL,GAAO,cAAc,0BAA0BpI,EAAS,GAAG,GACtEu6B,IAAWjnB,IAAM,SAASA,EAAI,aAAa,OAAO,GAAG,EAAE,IAAI;GACjE,AAAIinB,IAAA,OACA,KAAKnI,GAAM,QAAQ,cAAc,OAAOmI,IAAWxnB,CAAO;EAElE;EAOA,IALA,KAAK,UAAU,OAAO,QAAQ,GAC9B,KAAK,UAAU,IAAI,WAAW,GAC9B,KAAKqf,GAAM,aAAa,aAAa,MAAM,GAC3C,KAAKA,GAAM,MAAM,QAAQ,eAErBrf,MAAY,GACZ,KAAK3K,GAAO,WAAW,eAAepI,GAAA,EAAyB;OAC5D;GACH,IAAMw6B,IAAa,KAAK,IAAI,IAAI,KAAK,MAAA,KAAwBznB,CAAO,CAAC;GACrE,KAAK,IAAI5Q,IAAI,GAAGA,IAAI4Q,GAAS,KACzB,KAAK3K,GAAO,WAAW,eAAepI,IAAWmC,GAAGq4B,CAAU;EAEtE;EAEA,4BAA4B;GACxB,AAAI,OAAO,KAAKpyB,GAAO,iBAAkB,cACrC,KAAKA,GAAO,cAAc;EAElC,CAAC;CACL;CAEA,uBAAuB;EACnB,KAAK,oBAAoB,SAAS,KAAK+b,EAAQ;CACnD;AACJ;AAEK,eAAe,IAAI,uBAAuB,KAC3C,eAAe,OAAO,yBAAyBkW,EAAS;;AChH5D,IAAaI,KAAb,cAAiC,YAAY;CACzC;CACA;CAEA,oBAAoB;EAChB,IAAMtf,IAAO,KAAK,YAAY;EAO9B,AANA,KAAKuf,KAAavf,aAAgB,aAAaA,EAAK,OAAQ,KAAK,QAAQ,YAAY,KAAKA,EAAK,MAE/F,AACI,KAAKuf,OAAa,KAAK,eAAe,QAAQ,YAAY,KAAK,KAAK,cAAc,QAAQ,YAAY,GAGrG,KAAKA;CACd;CAEA,MAAkB,MAAM;EACpB,IAAMpY,IAAO,EAAE,eAAe,EAAE,aAAa,IAAI,CAAC,GAC5CtN,IAAasN,EAAK,MAAK,MAAM/kB,EAAG,YAAY,QAAQA,EAAG,YAAY,IAAI;EAE7E,IAAI,CAACyX,GAAY;EAEjB,IAAM2lB,IAAcrY,EAAK,MAAK,MAAM/kB,EAAG,YAAY,OAAO,KAAKyX,EAAW,QAAQ,OAAO;EAKzF,AAHA,EAAE,eAAe,GACjB,EAAE,gBAAgB,GAElB,KAAK,SAAS,EAAE,SAAS,EAAE,SAASA,GAAY2lB,CAAW;CAC/D;CAEA,GAAgB,GAAY;EACxB,OAAO3lB,GAAY,QAAQ,kBAAkB,KAAK,KAAK0lB,GAAW,eAAe,KAAKA;CAC1F;CAEA,GAAe,GAAY;EACvB,IAAMt2B,IAAQ,KAAKw2B,GAAgB5lB,CAAU;EAM7C,OALK5Q,KAEL,AACIA,EAAM,WAAS,IAAIqc,EAAcrc,CAAK,GAEnCA,EAAM,UALM;CAMvB;CAEA,GAAsB,GAAkB,GAAa;EACjD,IAAMy2B,IAAQ,CAAC,GACTC,IAAgBC,GAAa;EAYnC,OATA,MAFqB,KAAKC,EAAiB,iBAAiB,aAAa,CAEpE,CAAC,CAAC,SAAQ,MAAU;GACrB,IAAMC,IAAkBC,EAAO,aAAa,cAAc;GAE1D,IAAI,CAACD,KAAoBH,KAAiBG,MAAoBH,GAAgB;IAC1E,IAAMK,IAAa,KAAKC,GAAYF,CAAM;IAC1C,EAAM,KAAK,GAAGC,CAAU;GAC5B;EACJ,CAAC,GAEMN;CACX;CAEA,GAAY,GAAM;EACd,IAAM1B,IAAO,CAAC;EAqCd,OApCA,MAAM,KAAKkC,EAAK,QAAQ,CAAC,CAAC,SAAQ,MAAS;GACvC,IAAMhS,IAAUiS,EAAM,QAAQ,YAAY;GAE1C,IAAIjS,MAAY,QAAQiS,EAAM,UAAU,SAAS,WAAW,GACxD,EAAK,KAAK,EAAE,MAAM,YAAY,CAAC;QAInC,IAAIjS,MAAY,MAAM;IAClB,IAAIpmB,IAAO,IACLs4B,IAASD,EAAM,cAAc,eAAe;IAClD,AAGIr4B,IAHAs4B,IACOA,EAAO,YAAY,KAAK,IAExB,MAAM,KAAKD,EAAM,UAAU,CAAC,CAC9B,QAAO,MAAK3Q,EAAE,aAAa,KAAK,SAAS,CAAC,CAC1C,KAAI,MAAKA,EAAE,YAAY,KAAK,CAAC,CAAC,CAC9B,KAAK,EAAE;IAGhB,IAAM6Q,IAAQF,EAAM,cAAc,aAAa,GACzC/7B,IAAO;KACT,QAAQ+7B,EAAM,MAAMr4B;KACd;KACN,WAAWq4B,EAAM,aAAa;KAC9B,UAAUA,EAAM,aAAa,UAAU,KAAKA,EAAM,aAAa,UAAU,MAAM;KAC/E,UAAU;IACd;IAMA,AAJIE,MACA,EAAK,QAAQ,KAAKJ,GAAYI,CAAK,IAGvCrC,EAAK,KAAK55B,CAAI;GAClB;EACJ,CAAC,GACM45B;CACX;CAEA,GAAgB,GAAa,GAAc,GAAY;EACnD,IAAMsC,IAAa,KAAK,aAAa,kBAAkB,MAAM,SACzDC,IAAW,CAAC,GAEVC,IAAc,KAAKC,GAAsB,MAAMb,CAAW;EAChE,AAAIY,EAAY,SAAS,KACrBD,EAAS,KAAK,GAAGC,CAAW;EAGhC,IAAME,IAAa,KAAKC,GAAe9mB,CAAU,GAC3C+mB,IAAkBF,GAAY,YAAY7mB,GAAY+lB,CAAW,KAAK,QACtEiB,IAAYC,MAAiBJ,GAAY,aAAa7mB,GAAY+lB,CAAW,KAAK,KAEpFmB,IAAc;EAiBlB,AAhBA,AAQIA,IARAH,MAAoB,UAAUA,MAAoB,UACpC;GACV,QAAQ;GACR,MAAM;GACN,WAAW;GACX,UAAU,CAACE;EACf,IAEc;GACV,QAAQ;GACR,MAAM;GACN,WAAW;GACX,UAAU,CAACD;EACf,GAGAP,KACAC,EAAS,KACL,EAAE,MAAM,YAAY,GACpB;GACI,QAAQ;GACR,MAAM;GACN,WAAW;GACX,UAAU,CAACO;EACf,GACAC,GACA,EAAE,MAAM,YAAY,GACpB;GAAE,QAAQ;GAAa,MAAM;GAAa,WAAW;EAAoB,GACzE;GAAE,QAAQ;GAAY,MAAM;GAAY,WAAW;EAAW,GAC9D;GACI,QAAQ;GACR,MAAM;GACN,WAAW;GACX,OAAO,CACH;IAAE,QAAQ;IAAgB,MAAM;IAAS,WAAW;GAAe,GACnE;IAAE,QAAQ;IAAc,MAAM;IAAO,WAAW;IAAc,UAAU;GAAK,CACjF;EACJ,GACA;GACI,QAAQ;GACR,MAAM;GACN,WAAW;GACX,OAAO;IACH;KAAE,QAAQ;KAAkB,MAAM;KAAuB,WAAW;IAAiB;IACrF;KAAE,QAAQ;KAAmB,MAAM;KAAwB,WAAW;IAAkB;IACxF;KAAE,QAAQ;KAAgB,MAAM;KAAoB,WAAW;IAAe;GAClF;EACJ,CACJ;EAGJ,IAAMC,IAAe,CAAC;EActB,OAbAT,EAAS,SAAS,MAAS;GACvB,CAAIn8B,EAAK,SAAS,eACV48B,EAAa,WAAW,KAAKA,EAAaA,EAAa,SAAS,EAAE,CAAC,SAAS,gBAIpFA,EAAa,KAAK58B,CAAI;EAC1B,CAAC,GAEG48B,EAAa,SAAS,KAAKA,EAAaA,EAAa,SAAS,EAAE,CAAC,SAAS,eAC1EA,EAAa,IAAI,GAGdA;CACX;CAEA,SAAS,GAAG,GAAG,GAAY,GAAa;EACpC,IAAMC,IAAe,KAAK1B,GAAW,cAAc,KAAKA;EAExD,AAAK,KAAK1jB,OACN,KAAKA,KAAS,SAAS,cAAc,uBAAuB,GAC5DolB,EAAa,YAAY,KAAKplB,EAAM;EAGxC,IAAMilB,IAAe,CAAC,CAACjnB,EAAW,QAAQ,OAAO,GAC3CqnB,IAAY,KAAKC,GAAgB3B,GAAasB,GAAcjnB,CAAU;EAE5E,KAAKgC,GAAO,OAAOqlB,IAAY,MAAM,KAAKE,GAAiB,GAAGvnB,GAAY2lB,CAAW,CAAC;EAEtF,IAAM71B,IAAc,KAAK81B,GAAgB5lB,CAAU;EAGnD,AAFA,KAAKwnB,GAAgB13B,CAAW,GAEhC,KAAKkS,GAAO,OAAO5P,GAAGgU,CAAC;CAC3B;CAEA,GAAgB,GAAa;EACzB,IAAI,CAAC,KAAKpE,MAAU,CAAClS,GAAa;EAElC,IAAM23B,IAAc33B,EAAY,WAAW,cAAc,KAAK;EAC9D,KAAKkS,GAAO,gBAAgB,aAAa,MAAMylB,CAAW;EAE1D,IAAMC,IAAU,KAAKhC,GAAW,aAAa,cAAc,MAAM;EACjE,KAAK1jB,GAAO,gBAAgB,gBAAgB,MAAM0lB,CAAO;EAEzD,IAAMC,IAAY,KAAKjC,GAAW,aAAa,gBAAgB,MAAM;EACrE,KAAK1jB,GAAO,gBAAgB,kBAAkB,MAAM2lB,CAAS;CACjE;CAEA,GAAiB,GAAG,GAAY,GAAa;EACzC,IAAMC,IAAS,EAAE,QAEXpD,IAAc,IAAI,YAAY,cAAc;GAC9C,QAAQ;IAAE;IAAQ;IAAY;IAAa,eAAe;GAAE;GAC5D,SAAS;GACT,UAAU;EACd,CAAC;EACD,KAAK,cAAcA,CAAW;EAE9B,IAAM9Y,IAAU,SAAS1L,EAAW,QAAQ,KAAK,EAAE,GAC7ClQ,IAAc,KAAK81B,GAAgB5lB,CAAU;EAEnD,QAAQ4nB,GAAR;GACI,KAAK;GACL,KAAK;IAED,KADwBd,GAAe9mB,CAC9B,CAAC,EAAE,iBAAiB4nB,GAAQ5nB,CAAU;IAC/C;GAEJ,KAAK;IACD,AAAK,MAAM0L,CAAO,KACd5b,EAAY,SAAS,qBAAqB4b,GAAS1L,CAAU;IAEjE;GAEJ,KAAK;IACD,GAAa,WAAW,OAAO;IAC/B;GAEJ,KAAK;IACD,KAAK0lB,GAAW,aAAa,gBAAgB,KAAKA,GAAW,aAAa,cAAc,MAAM,SAAS,UAAU,MAAM;IACvH;GAEJ,KAAK,kBACD,KAAKA,GAAW,aAAa,kBAAkB,KAAKA,GAAW,aAAa,gBAAgB,MAAM,SAAS,UAAU,MAAM;EAEnI;EAEA,KAAK1jB,GAAO,MAAM;CACtB;CAEA,uBAAuB;EACnB,KAAK0jB,IAAY,oBAAoB,eAAe,KAAKmC,EAAc;CAC3E;AACJ;AAEK,eAAe,IAAI,iBAAiB,KACrC,eAAe,OAAO,mBAAmBpC,EAAW;;ACxQxD,IAAaqC,KAAb,cAA+B,YAAY;CACvC;CACA,KAAgB;CAEhB,cAAc;EACV,MAAM;CACV;CAEA,oBAAoB;EAMhB,AAJA,KAAK,MAAM,WAAW,SACtB,KAAK,MAAM,UAAU,QACrB,KAAK,MAAM,SAAS,SAEpB,KAAK,YAAY;CAKrB;CAEA,OAAO,GAAO,GAAU;EACpB,KAAKC,KAAcnS;EACnB,IAAMzb,IAAY,KAAK,cAAc,iBAAiB;EACtD,AAAKA,MAEL,EAAU,YAAY,IAEtB,KAAK6tB,GAAa7tB,GAAW0rB,CAAK,GAClC,KAAKoC,GAAiB;CAC1B;CAEA,OAAO,GAAG,GAAG,IAAa,MAAM;EAG5B,IAFA,KAAK,MAAM,UAAU,SAEjBjoB,GAAY;GACZ,IAAMyB,IAAWzB,EAAW,sBAAsB,GAC5CkoB,IAAazmB,EAAS;GAE5B,4BAA4B;IACxB,IAAM0mB,IAAU,KAAK,cAAc,eAAe;IAClD,IAAI,CAACA,GAAS;IACd,IAAMjb,IAAaib,EAAQ,sBAAsB,CAAC,CAAC,OAE/CC,IAAiBF,IAAahb;IAElC,AAAIkb,IAAiB,MACjB,IAAiB3mB,EAAS;IAG9B,IAAM4mB,IAAcF,EAAQ,sBAAsB,CAAC,CAAC,QAChDG,IAAgBliB;IAMpB,AALIA,IAAIiiB,IAAc,OAAO,gBACzB,IAAgBjiB,IAAIiiB,IAGxB,KAAK,MAAM,OAAO,GAAGD,EAAe,KACpC,KAAK,MAAM,MAAM,GAAGE,EAAc;GACtC,CAAC;EACL,OAII,AAHA,KAAK,MAAM,OAAO,GAAGl2B,EAAE,KACvB,KAAK,MAAM,MAAM,GAAGgU,EAAE,KAEtB,4BAA4B;GACxB,IAAM+hB,IAAU,KAAK,cAAc,eAAe;GAClD,IAAI,CAACA,GAAS;GACd,IAAMjoB,IAAOioB,EAAQ,sBAAsB;GAK3C,AAHI/1B,IAAI8N,EAAK,QAAQ,OAAO,eACxB,KAAK,MAAM,OAAO,GAAG9N,IAAI8N,EAAK,MAAM,MAEpCkG,IAAIlG,EAAK,SAAS,OAAO,gBACzB,KAAK,MAAM,MAAM,GAAGkG,IAAIlG,EAAK,OAAO;EAE5C,CAAC;EAcL,AAXI,KAAKwM,MACL,OAAO,oBAAoB,eAAe,KAAKA,EAAa,GAGhE,KAAKA,MAAiB,MAAM;GAExB,AAAI,EADS,EAAE,eAAe,EAAE,aAAa,IAAI,CAAC,EAAA,CACxC,SAAS,IAAI,KAAK,CAAC,KAAK,SAAS,EAAE,MAAM,KAC/C,KAAK,MAAM;EAEnB,GAEA,iBAAiB;GACb,OAAO,iBAAiB,eAAe,KAAKA,EAAa;EAC7D,GAAG,CAAC;CACR;CAEA,QAAQ;EAEJ,AADA,KAAK,MAAM,UAAU,QACrB,AAEI,KAAKA,QADL,OAAO,oBAAoB,eAAe,KAAKA,EAAa,GACvC;CAE7B;CAEA,gBAAgB,GAAQ,GAAW,GAAW;EAC1C,IAAM6b,IAAK,KAAK,cAAc,eAAeX,EAAO,GAAG;EACvD,AAAIW,MACAC,IAAYD,EAAG,UAAU,IAAIlO,CAAS,IAAIkO,EAAG,UAAU,OAAOlO,CAAS;CAE/E;CAEA,GAAa,GAAU,GAAO;EAC1B,EAAM,SAAQ,MAAQ;GAClB,IAAI9vB,EAAK,SAAS,aAAa;IAC3B,IAAMk+B,IAAM,SAAS,cAAc,IAAI;IAEvC,AADA,EAAI,YAAY,qBAChBC,EAAS,YAAYD,CAAG;IACxB;GACJ;GAEA,IAAMF,IAAK,SAAS,cAAc,IAAI;GAEtC,AADAA,EAAG,aAAa,WAAWh+B,EAAK,MAAM,GACtC,EAAG,YAAY,GAAGA,EAAK,aAAa,GAAG,GAAGA,EAAK,QAAQ,YAAY,GAAG,GAAGA,EAAK,WAAW,aAAa,KAAK,KAAK;GAEhH,IAAMu3B,IAAO,SAAS,cAAc,MAAM;GAI1C,IAHA,EAAK,cAAcv3B,EAAK,MACxBg+B,EAAG,YAAYzG,CAAI,GAEfv3B,EAAK,SAASA,EAAK,MAAM,SAAS,GAAG;IACrC,IAAMi8B,IAAQ,SAAS,cAAc,IAAI;IAGzC,AAFA,EAAM,YAAY,mBAClB,KAAKwB,GAAaxB,GAAOj8B,EAAK,KAAK,GACnCg+B,EAAG,YAAY/B,CAAK;GACxB;GAEA,EAAS,YAAY+B,CAAE;EAC3B,CAAC;CACL;CAEA,KAAmB;EACf,KAAK,iBAAiB,aAAa,CAAC,CAAC,SAAQ,MAAM;GAC/C,EAAG,iBAAiB,UAAU,MAAM;IAEhC,IADAz1B,EAAE,gBAAgB,GACdy1B,EAAG,UAAU,SAAS,UAAU,GAAG;IAEvC,IAAMX,IAASW,EAAG,aAAa,SAAS;IAExC,AADA,KAAKR,KAAc;KAAE;KAAQ,QAAQQ;IAAG,CAAC,GACzC,KAAK,MAAM;GACf,CAAC;EACL,CAAC;CACL;CAEA,uBAAuB;EACnB,KAAK,MAAM;CACf;AACJ;AAEK,eAAe,IAAI,uBAAuB,KAC3C,eAAe,OAAO,yBAAyBT,EAAS"}
|
|
1
|
+
{"version":3,"file":"nine-table.js","names":["traceOrigin","trace","GROUP_IDX","GROUP_IDX","GROUP_IDX","start","end","mid","target","elementDebounceState","el","state","pointerEvent","pointerFn","debounceTime","dblClickEvent","dblClickFn","_text","stripHtml","tmp","html","canvas","context","_font","w","h","v","cleanText","metrics","ascent","descent","trace$1","trace","NINE_TABLE","ngRow","#parent","parent","#newrow","ngData","#host","host","#initialize","item","validRecords","#getValidRecords","at","targetRecord","colnm","idx","rowData","rowIndex","colIndex","value","#conv","fields","#defaultHeight","templateElements","#getDefaultMeta","loadData","dataSource","#invalidate","#nextId","rowid","jsonArray","arr","o","json","record","#json2Array","processedArr","#defaultInsert","row","updateState","targetIndex","#getIndexFromRow","arrIndex","records","b","a","targetId","index","COL_IDX","rowState","isSingle","targetArr","result","i","ngDataManager","ds","rowIdx","nRow","rowidx","#init","#fields","f","found","fieldName","fName","#adjust","map","name","type","rawTables","tbl","fieldType","attr","expr","lastIndex","targetField","NineTableSheets","NineTableSheetsFooter","#render","isMultiSelect","tabItem","#switchSheet","updateSplitters","sheets","s","activeSheets","sheet","currentIdx","targetSplitter","tabBar","body","tabItems","sheetElements","isActive","clickedTab","activeTabs","targetSheet","tabsHtml","table","SheetTabItem","Toolbar","#bindEvents","#customContainer","#syncStateFromHost","isSimple","showToolbar","showMenu","caption","titleEl","link","currentCaption","menuBtn","element","text","NineTableHScrollBar","#owner","initWhenReady","#elements","#observeResize","#resizeObserver","#dragging","track","thumb","bodyWidth","tableWidth","needsHScroll","trackWidth","thumbWidth","currentLeft","maxScrollLeft","l","maxThumbLeft","trackBound","targetX","x","delayScroll","#interval1","#interval2","thumbLeft","#thumbMoveTo","pos","currentThumbLeft","clearTimer","evt","e","trackRect","onMouseMove","moveEvent","onMouseUp","GROUP_IDX$1","GroupingManager","#sheet","#groupColumns","#groupMap","currentState","#collapsedMap","groupId","groupColumns","sourceTable","$cell","$tr","#isApplying","rowIds","dataManager","Grouping","validRaw","rawRecords","groupMap","nestedTree","#buildNestedMap","flatResult","renderItems","#flattenTree","collapsedMap","counter","isLastLevel","depth","groupKey","subMapOrRecords","mapOrArray","parentId","isCollapsed","#collectLeafRowIds","groupRecord","resultArr","#collectLeafRecords","remainingCols","key","subRecords","subVal","r","NineTableVScrollBar","viewRecords","totalCount","scrollHolder","rawContentHeight","getItemHeight","dataRowsHeight","sumHeight","MAX_BROWSER_HEIGHT","useScaling","scaleFactor","contentHeight","#getScaleInfo","fixedHeight","viewHeight","needsVScroll","trackHeight","thumbHeight","currentScrollTop","maxScrollTop","thumbTop","maxThumbTop","#startY","#startThumbTop","deltaY","targetThumbTop","ratio","#onMouseUp","#onMouseMove","#onMouseDown","clickY","scrollTimeout","startContinuousScroll","currentDelay","scrollStep","bodyView","scrollTop","effectiveTop","trs","firstTr","tr","rects","groupTop","isGroupRow","targetScrollTop","targetStepSize","direction","totalGroupHeight","stopContinuousScroll","RowManager","#initResizeObserver","bodyViewport","#measureAndCacheHeight","#renderAllContainers","#chchedAllRecords","#handleScroll","force","rowHeight","#isGrouped","#handleGroupedScroll","rawTotalVirtualHeight","totalVirtualHeight","actualScrollTop","maxStartIndex","clampedScrollTop","startIndex","#element","currentStartIndex","$tbody","dataIndex","#bindRowData","allRenderItems","totalVirtualCount","bodyContent","templateLength","itemHeights","accumulatedHeight","offsetY","targetEnd","renderedItems","headerGroupIds","vIndex","itemIndex","chunkTrs","isTrGroup","subIdx","#bindGroupRowData","subRowIndex","matrixRow","$el","virtualIndex","indices","childrenRecords","#containerTemplates","container","selector","tableEl","tbody","templateTrs","#sheetHeight","#isProgrammaticScroll","targetRow","dataRow","currentDataCount","totalGroupVirtualHeight","targetAccumulatedHeight","itemTotalHeight","tmplTr","isVisible","rawTargetScrollTop","onRendered","#updateRowCount","visibleRows","dynamicBuffer","#BUFFER_ROW_COUNT","groupRows","#cachedRowCount","#renderRows","#syncRowHeights","targetFixedType","clonedTr","targetTbody","fragment","tmpl","fragment2","trIndex","totalGroupingCount","$clonedTr","thead","leftTable","bodyTable","rightTable","leftRows","bodyRows","rightRows","maxRows","heights","maxHeight","entry","entries","height","TableCompiler","$table","$srcTable","#syncColAttributes","fixed","$col","cols","grid","rowSpan","colSpan","c","CellSelection","#initEvents","t","$td","col","r1","startRow","endRow","r2","c1","startCol","endCol","c2","containers","expanded","loopCount","#getMatrixRow","cell","cellEndRow","cellEndCol","nsR","neR","nsC","neC","sanitize","val","#range","root","elements","clientX","clientY","allCells","rect","targetCell","#getCellFromPoint","targetTr","#lastMatrixRow","#lastCol","#startRow","#startCol","mainZone","CellNavigation","#currentCell","#currentTr","#isCellLeftVisible","#isCellRightVisible","#isCellBelowVisible","#isCellAboveVisible","viewportRect","cellRect","theadHeight","delta","targetMatrixRow","targetCol","foundCell","#findCell","nextCell","#getPreviousCell","#getNextCell","#getUpCell","#getDownCell","#moveCellH","#moveCellV","nextCol","cellCol","$nextCell","bodyViewport2","RESIZE_OFFSET","ColResizer","#panel","#tooltip","#onPointerMove","#onPointerDown","#onDblClick","containerType","firstColgroup","totalWidth","colWidths","colIdx","tables","targetCols","globalColIndex","firstContainer","resolvedContainerType","width","sourceCol","headerPart","offsetX","isLeftEdge","isRightEdge","prevCell","#targetCell","#targetContainerType","#getContainerType","baseColIndex","#targetColIndex","#checkIsAutoFit","#nextColIndex","nextColEl","#nextColStartWidth","targetRect","sheetRect","#startCellWidth","#startLeft","attrW","#startColWidth","#startX","#updatePositions","#onDragMove","#onDragEnd","diff","isAutoFit","maxDiff","minDiff","currentColWidth","realCellWidth","maxCellWidth","currentCellWidth","sizeBadge","finalWidth","newColWidth","newNextWidth","tbodyCell","extraPadding","fieldIdx","font","headerText","maxTextWidth","size","calculatedWidth","ColResizerPanel","#renderer","ColMover","#grip","#indi","y","nested","headerCells","hasStrictChildren","isValidGroup","parentGroupRange","subCell","subStart","subSpan","subEnd","isRealGroup","groupRange","#getColGroupRange","origTable","minLeft","maxRight","minTop","maxBottom","targetCells","cCol","cEnd","isGroup","computedStyle","groupWidth","groupHeight","headerContent","clonedCell","style","#checkIsMovable","startX","startY","cancelTimer","#timer","onPointerMovePending","#startDrag","#isDragging","preview","#createGroupHeaderPreview","#sourceCell","#sourceColIndex","#shiftX","bounds","relativeTop","fullHeight","#updateGripPosition","#onPointerUp","#getDeepElementFromPoint","targetColIndex","colMinLeft","colMaxRight","cRect","midX","calculatedTargetCol","indicatorLeft","sourceGroup","movingSpan","sourceRowStart","sourceRowEnd","targetRowStart","targetRowEnd","isRowSpanCompatible","isOutOfBoundsOfParent","pStart","pEnd","isDroppingInsideOtherGroup","spannedCells","sCell","sRowStart","sRowEnd","sStart","sEnd","moveEndCol","isSelfGroup","left","colgroup","toColIndex","spanCount","isInRange","fromColIndex","targetViewportCol","fixedType","group","cells","targetRowCell","ColFixManager","baseCol","fixedAttr","targetBoundaryCol","theadTrs","cellBoundaryFound","cEndCol","action","fixType","cIdx","minBaseCol","maxEndCol","rSpan","rIdx","isBroken","isColFixed","NineTableFilterPanel","#closeHandler","#nineTable","#view","#onInput","#onSelectAll","#onOk","#button","filterBtn","panelWidth","top","searchBox","#loadVirtualFilterItems","path","filteredRecords","activeFilters","exprEngine","bindKey","colInfo","exprKey","filterKey","activeSelectedVals","uniqueMap","rawVal","displayVal","uniqueList","valA","valB","numA","numB","selectAllChk","filterRecords","checkedRecords","chk","filterParams","selectedVals","query","data2Idx","matchedValues","isChecked","chkIdx","NineTableFilterButton","#onClick","#columns","seen","uniqueKey","isFiltered","panel","Filtering","#filters","#initFilterPanel","#filterPanel","#isFiltering","#applyFiltering","jsonFilter","oFilter","k","sheetIndex","filterRules","targetKey","allowedValues","isExpr","isPass","recordIdx","allowedSet","Sorting","#handleSort","colName","exprVal","isAsc","isDesc","existingColIndex","m","ruleData","#applySorting","#syncHeaderUI","colRule","asc","SheetView","#cachedVisibleRecords","#viewIndexes","visibleRecords","#convSingle","filterSlot","#sortingColumns","groupingManager","groupResult","columns","rulesWithIdx","rule","idxA","idxB","isEmptyA","isEmptyB","strA","strB","PreCompiler","#ensureColgroup","#ensureThead","#ensureSectionTbodys","#ensureRowIndicator","#normalizeColAttributes","#createColIndicator","#normalizeCollapsibleAttributes","#generateCell","#initColExpanders","#initFilterButtons","#applyInitialCellWidths","firstRow","cnt","td","#numToExcelCol","background","num","headTbody","footTbody","colCount","sum","containerWidth","defaultWidth","widthVal","theadFoot","targetAttributes","autoIdCounter","$tbl","tagName","$datalist","$option","uniqueFuncName","cellType","originalContent","hostFilter","tableFilter","finalFiltering","currentWidth","expandBtn","targetWidth","rows","section","groups","currentGroup","indicatorCell","startColIdx","targetIdx","SheetAPI","self","getHeight","#resetElements","colEl","resolve","$trs","matrixRows","n","callback","$sheetBody","tfootHeight","viewportTop","viewportBottom","trRect","isAbove","isBelow","toRowid","NineTableSheet","#rowManager","#api","#bindApiMethods","#template","#index","#colResizer","#filtering","#grouping","#colMover","#colFix","#cellSelection","#cellNavigation","#source","attrTrue","sourceTableTrue","#isSimple","#renderSplitContainers","#updateContainerWidths","#adjustOverlay","$thead","$overlay","#autoFit","enable","totalOriginalWidth","colList","collapsedTotalWidth","availableWidth","allocatedTotal","calculatedCols","exactWidth","baseWidth","remainderPixels","uncollapsedCols","activeParent","$parent","minRows","#syncHeaderAndFooterHeights","#initRowHoverEvent","prefix","firstTable","#createSplitTable","offsetHeight","sheetBottom","tbodyBottom","bodyContainer","scrollLeft","#sorting","leftHeaderRows","bodyHeaderRows","rightHeaderRows","#applyMaxHeights","leftFooterRows","bodyFooterRows","rightFooterRows","activeRowIndex","relatedTarget","api","args","LayoutManager","owner","#initEvent","sheetCount","sheetsHtml","className","sheetId","cssImports","$sheet","#isAutoHeight","#applyAutoHeight","lastHeight","currentHeight","basicHeight","ExprEngine","match","trimmedExpr","compiledExpr","evalFn","#exprCache","rowItem","DataAPI","providerObj","methods","fn","NineTableAPI","ns","#getActiveSheet","targetMethod","prop","NineTable","#shadowRoot","#dataManager","#dataApi","#sheetApi","#templateCnt","#bindDynamicSetters","#layoutManager","#dispatchLoad","checkCount","checkTimer","loadSheetCnt","idOrIndex","extractedMethodNames","matches","internalValue","methodName","newValue","BasicCellElement","exprCache","CellElement","#updateRowState","#cell","#tr","#attr","curRow","renderer","rawRecord","defaultValue","\"display\"","data","cleanExpr","allRecords","childRecords","funcName","field","acc","EditableCellElement","CellInputText","#target","#maxbyte","maxByteNum","event","CellInputNumber","#onKeyDown","#validate","#max","#min","#scale","str","selectionStart","scale","validKey","isNumKey","CellInputColor","#btn","#dataSource","datalistId","datalist","option","#rendererColor","#isValidColor","g","CellInputDate","#type","formattedVal","d","isValid","#isValidDate","year","month","day","isleap","hour","min","week","CellCheckbox","#label","#trueText","#falseText","#isRadio","trueValue","childHtml","displayText","#enable","#readonly","#visible","CellRadio","#rendererRadio","matchIndex","#radioList","codeVal","#keyName","nameVal","#valueName","label","input","span","CellComboPanel","#grd","activeColumnCount","selectedKeys","kIndex","chkIndex","#selectRow","currentValue","formattedData","#EXPAND_ROW_COUNT","$btn","btnRect","h1","isDropDown","h2","items","#isPanelBelow","#calculatePanelHeight","#calculatePanelLeft","#initData","#checkRow","#returnRow","#onKeydown_input","#onKeydown","CellCombo","#getDisplayText","#validateInput","keys","list","#togglePanel","CellRenderer","CellButton","#cellButtonClick","customEvent","rawValue","CellTree","level","#textElement","#updateTreeState","hasChildren","#checkHasChildren","#iconElement","CellRowIndicator","#mainTarget","#subTarget","#statusTarget","displayNum","formattedNum","splitIndex","prefixPart","suffixPart","isSorted","isFitered","ColExpand","singleWidth","currentW","splitWidth","ContextMenu","#tableHost","targetTable","#getTargetSheet","activeTableId","activeTable","containerElement","targetTableAttr","rootUl","parsedList","#traverseUl","ulEl","child","spanEl","subUl","useDefault","rawItems","customItems","#parseCustomMenuItems","fixManager","#getFixManager","currentFixState","isFixable","isHeaderCell","fixMenuItem","cleanedItems","targetParent","menuItems","#buildMenuItems","#handleMenuClick","#syncMenuStates","isFiltering","autoFit","showTitle","menuId","#onContextMenu","MenuPanel","#onCallback","#appendItems","#bindClickEvents","cellRightX","wrapper","calculatedLeft","panelHeight","calculatedTop","li","condition","sep","parentUl"],"sources":["../src/core/protype.js","../src/external/NoPeer.js","../src/core/constants.js","../src/data/ngData.js","../src/data/ngDataManager.js","../src/data/Fields.js","../src/layout/nine-table-sheets.js","../src/layout/nine-table-sheets-footer.js","../src/layout/nine-table-toolbar.js","../src/layout/nine-table-hscrollbar.js","../src/data/Grouping.js","../src/layout/nine-table-vscrollbar.js","../src/layout/core/RowManager.js","../src/layout/core/TableCompiler.js","../src/cell-manager/CellSelection.js","../src/cell-manager/CellNavigation.js","../src/col/ColResizer.js","../src/col/ColMover.js","../src/col/ColFixManager.js","../src/data/Filtering.js","../src/data/Sorting.js","../src/data/SheetView.js","../src/layout/core/PreCompiler.js","../src/api/SheetAPI.js","../src/layout/nine-table-sheet.js","../src/layout/core/LayoutManager.js","../src/core/ExprEngine.js","../src/api/DataAPI.js","../src/api/NineTableAPI.js","../src/core/nine-table.js","../src/cell/core/BasicCellElement.js","../src/cell/core/CellElement.js","../src/cell/cell-input-text.js","../src/cell/cell-input-number.js","../src/cell/cell-input-color.js","../src/cell/cell-input-date.js","../src/cell/cell-checkbox.js","../src/cell/cell-radio.js","../src/cell/cell-combo-panel.js","../src/cell/cell-combo.js","../src/cell/cell-renderer.js","../src/cell/cell-button.js","../src/cell/cell-tree.js","../src/cell/cell-row-indicator.js","../src/col/col-expand.js","../src/menu/nine-table-menu.js","../src/menu/nine-table-menu-panel.js"],"sourcesContent":["Array.prototype.nineBinarySearch = function(target) {\n //this.sort((a, b) => { return a > b ? 1 : -1; });\n\n let start = 0;\n let end = this.length - 1;\n let mid;\n\n while (start <= end) {\n mid = parseInt((start + end) / 2);\n\n if (target === this[mid]) {\n return mid;\n } else {\n if (target < this[mid]) {\n end = mid - 1;\n } else {\n start = mid + 1;\n }\n }\n }\n\n return -1;\n};\n\nconst elementDebounceState = new WeakMap();\n\nHTMLElement.prototype.addDebounseEventListener = function(\n dblClickEvent,\n dblClickFn,\n pointerEvent,\n pointerFn,\n debounceTime = 500\n) {\n const el = this;\n\n if (!elementDebounceState.has(el)) {\n elementDebounceState.set(el, { timer: null, cancelFn: null });\n }\n const state = elementDebounceState.get(el);\n\n el.addEventListener(pointerEvent, (e) => {\n e.actualTarget = e.target;\n\n if (state.timer) {\n clearTimeout(state.timer);\n state.timer = null;\n }\n\n // ๐ก 500ms ๋์ ๋๊ธฐํ ๋ค์์ผ ์ค์ pointerFn์ด ์คํ๋จ\n state.timer = setTimeout(() => {\n state.timer = null;\n state.cancelFn = pointerFn.call(el, e);\n }, debounceTime);\n });\n\n el.addEventListener(dblClickEvent, (e) => {\n if (state.timer) {\n clearTimeout(state.timer);\n state.timer = null;\n }\n\n if (state.cancelFn) {\n state.cancelFn();\n state.cancelFn = null;\n }\n\n dblClickFn.call(el, e);\n });\n};\n\n\nnine.measureTextSize = (_text, _font = '12px sans-serif') => {\n if (typeof _text === 'number') _text = _text + \"\";\n if (!_text) return { width: null, height: null };\n\n const stripHtml = (html) => {\n const tmp = document.createElement(\"DIV\");\n tmp.innerHTML = html;\n return tmp.textContent || tmp.innerText || \"\";\n };\n\n _text = _text.replaceAll(\"\\n\", \"<br>\");\n\n let canvas = document.body.querySelector('canvas#_nine_measure_canvas_');\n if (!canvas) {\n canvas = document.createElement('canvas');\n canvas.id = '_nine_measure_canvas_';\n canvas.style.cssText = 'position: absolute; visibility: hidden; pointer-events: none; left: -9999px;';\n document.body.appendChild(canvas);\n }\n\n const context = canvas.getContext('2d');\n context.font = _font;\n\n let w = 0;\n let h = 0;\n\n for (let v of _text.split(\"<br>\")) {\n const cleanText = stripHtml(v);\n const metrics = context.measureText(cleanText);\n\n w = Math.max(w, metrics.width);\n\n const ascent = metrics.fontBoundingBoxAscent || 10;\n const descent = metrics.fontBoundingBoxDescent || 3;\n h += ascent + descent;\n }\n\n return {\n width: w,\n height: h\n };\n};","import { trace as traceOrigin } from '@ninebone/util';\n\nexport class Trace extends traceOrigin.constructor {\n constructor() {\n super();\n this.init(\"nine-table\", \"green\");\n }\n}\n\nexport const trace = new Trace();\n","export const NINE_TABLE = {\n META: {\n INDEX: {\n ROWID: 0,\n ROW_STATE: 1,\n FILTER: 2,\n GROUP: 3,\n // SELECT: 2,\n // EXPAND: 3\n }\n },\n ROW_STATE: {\n EMPTY: 0,\n NORMAL: 1,\n INSERT: 2,\n UPDATE: 3,\n DELETE: 9\n },\n EVENT: {\n LOAD: \"load\",\n ROW_ADDED: \"row-added\",\n ROW_REMOVED: \"row-removed\",\n CELL_BUTTON_CLICK: \"cell-button-click\",\n },\n};","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\n\nexport class ngRow {\n\t#parent;\n\t#newrow = -1;\n\n\tconstructor(parent) {\n\t\tthis.#parent = parent;\n\t}\n\n\tget at() {\n\t\treturn this.#newrow;\n\t}\n\tset at(v) {\n\t\tthis.#newrow = parseInt(v, 10);\n\t}\n\n\tcount = () => this.#parent.rawRecords.length;\n}\n\nexport class ngData {\n\t#host;\n\t#parent;\n\t#nextId = 0;\n\t#defaultHeight = [];\n\n\tstatic META_INDEX = {\n\t\tFILTER: 0,\n\t\t// GROUP: 1,\n\t\t// SELECT: 2,\n\t\t// EXPAND: 3\n\t};\n\n\tstatic ROW_STATE = {\n\t\tEMPTY: 'EMPTY',\n\t\tNORMAL: 'NORMAL',\n\t\tINSERT: 'INSERT',\n\t\tUPDATE: 'UPDATE',\n\t\tDELETE: 'DELETE'\n\t};\n\n\tconstructor(host, parent) {\n\t\tthis.#host = host;\n\t\tthis.#parent = parent;\n\t\tthis.#initialize();\n\t}\n\n\n\t#getValidRecords = () => {\n\t\tconst rawRecords = this.#parent.rawRecords || [];\n\t\treturn rawRecords.filter(item => item.m._[NINE_TABLE.META.INDEX.ROW_STATE] !== NINE_TABLE.ROW_STATE.DELETE);\n\t};\n\n\tgetRawRecords = () => {\n\t\treturn this.#parent.rawRecords || [];\n\t};\n\n\tget count() {\n\t\treturn this.length;\n\t}\n\n\tcount = () => {\n\t\treturn this.length;\n\t};\n\n\tgetArray = (at, colnm) => {\n\t\tconst validRecords = this.#getValidRecords();\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn validRecords; // ๋ณํ ์์ด ๋ฐฐ์ด ๊ทธ๋๋ก ๋ฐํ (๋ ๋๋ง ์ต์ ํ)\n\t\t}\n\n\t\tif (at < 0 || at >= validRecords.length) return null;\n\n\t\tconst targetRecord = validRecords[at];\n\n\t\tif (colnm != null) {\n\t\t\tconst fields = this.getHostFields();\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn targetRecord;\n\t};\n\n\tsetArray = (rowIndex, colIndex, value) => {\n\t\tconst validRecords = this.#getValidRecords();\n\t\tconst rowData = validRecords[rowIndex];\n\n\t\tconst oldValue = rowData.v[colIndex];\n\t\tif (oldValue !== value && rowData.__ng.rowState !== ngData.ROW_STATE.INSERT) {\n\t\t\trowData.__ng.rowState = ngData.ROW_STATE.UPDATE;\n\t\t}\n\n\t\trowData.v[colIndex] = value;\n\t};\n\n\n\tget = (at, colnm) => {\n\t\tconst validRecords = this.#getValidRecords();\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn this.#conv(validRecords);\n\t\t}\n\n\t\tif (at < 0 || at >= validRecords.length) return null;\n\n\t\tconst targetRecord = validRecords[at];\n\t\tconst fields = this.getHostFields();\n\n\t\tif (colnm != null) {\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn this.#conv(targetRecord);\n\t};\n\n\tgetAll = () => {\n\t\treturn this.#parent.rawRecords || [];\n\t};\n\n\tgetHostFields = () => {\n\t\treturn typeof this.#host.fields?.get === 'function' ? this.#host.fields.get() : [];\n\t};\n\n\t#initialize = () => {\n\t\tthis.#defaultHeight = [];\n\t\tconst templateElements = this.#host.template || [];\n\t\tArray.from(templateElements).forEach(el => {\n\t\t\tthis.#defaultHeight.push(el.getBoundingClientRect?.().height || 24);\n\t\t});\n\n\t\t(this.#parent.rawRecords || []).forEach(v => {\n\t\t\tif (!v.__ng) v.__ng = this.#getDefaultMeta();\n\t\t\tv.__ng.height = this.#defaultHeight.slice();\n\t\t});\n\t};\n\n\tget source() {\n\t\treturn this.#conv(this.#parent.rawRecords);\n\t}\n\tset source(v) {\n\t\tthis.set(v);\n\t}\n\n\t#invalidate = () => {\n\t\tthis.#host.shadowRoot.querySelectorAll(\"nine-table-sheet\").forEach($el => {\n\t\t\t$el.invalidate();\n\t\t});\n\n\t\tthis.#host.shadowRoot.querySelector(\"nine-table-sheets-footer\")?.refresh();\n\t};\n\n\tset = (dataSource) => {\n\n\t\tconst loadData = () => {\n\t\t\tthis.#host.loading = true;\n\t\t\tsetTimeout(() => {\n\t\t\t\ttry {\n\t\t\t\t\tthis.clear();\n\t\t\t\t\tthis.add(dataSource, false);\n\t\t\t\t\tthis.#invalidate();\n\t\t\t\t} finally {\n\t\t\t\t\tthis.#host.loading = false;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (this.#host.loaded) {\n\t\t\tloadData();\n\t\t}\n\t\telse {\n\t\t\tthis.#host.addEventListener(NINE_TABLE.EVENT.LOAD, e => {\n\t\t\t\tloadData();\n\t\t\t}, { once: true });\n\t\t}\n\t};\n\n\tget nextId() {\n\t\treturn this.#nextId++;\n\t}\n\n\tget length() {\n\t\treturn this.#getValidRecords().length;\n\t}\n\n\tget count() {\n\t\treturn this.length;\n\t}\n\n\tgetRowCount() {\n\t\treturn this.length;\n\t}\n\n\t#getDefaultMeta = (rowid = 0) => {\n\t\treturn {\n\t\t\trowState: ngData.ROW_STATE.EMPTY,\n\t\t\tdeleted: false,\n\t\t\tfiltered: false,\n\t\t\theight: this.#defaultHeight.slice(),\n\t\t\to: {},\n\t\t\tc: {},\n\t\t\t__: [0, 0, 0, 0, ngData.ROW_STATE.EMPTY, false, false, true, false, true, true, false, this.#defaultHeight.slice(), -1, {}, {}],\n\t\t\t_: [rowid, NINE_TABLE.ROW_STATE.EMPTY, [], []],\n\t\t};\n\t};\n\n\treset = () => {\n\t\tthis.#parent.rawRecords = [];\n\t\tthis.#invalidate();\n\t};\n\n\tclear = () => {\n\t\tthis.#parent.rawRecords = [];\n\t\tif (this.#parent.viewRecords?.reset) {\n\t\t\tthis.#parent.viewRecords.reset();\n\t\t}\n\n\t\tthis.#nextId = 0;\n\n\t\tthis.#invalidate();\n\t};\n\n\t#json2Array = (jsonArray) => {\n\t\tif (!Array.isArray(jsonArray)) jsonArray = [jsonArray];\n\n\t\tconst fields = this.getHostFields().length > 0 ? this.getHostFields() : Object.keys(jsonArray[0] || {});\n\t\tconst arr = [];\n\n\t\tjsonArray.forEach(json => {\n\t\t\tconst o = { v: [] };\n\t\t\tfields.forEach(colnm => {\n\t\t\t\to.v.push(json[colnm] !== undefined && json[colnm] !== null ? json[colnm] : \"\");\n\t\t\t});\n\t\t\tarr.push(o);\n\t\t});\n\n\t\treturn arr;\n\t};\n\n\t#defaultInsert = (arr) => {\n\t\tif (!Array.isArray(arr)) arr = [arr];\n\t\tarr.forEach(o => {\n\t\t\tconst rowid = this.nextId;\n\n\t\t\to.m = this.#getDefaultMeta(rowid);\n\t\t\to.__ng = o.m;\n\t\t\to.__ng.rowid = rowid;\n\t\t\t//o.__ng.rowState = ngData.ROW_STATE.INSERT;\n\n\t\t\to.m._[NINE_TABLE.META.INDEX.ROWID] = rowid;\n\t\t\to.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.EMPTY;\n\t\t});\n\t\treturn arr;\n\t};\n\n\t#getIndexFromRow = (rowid) => {\n\t\tconst index = this.#parent.rawRecords.findIndex(record => {\n\t\t\tif (!record || !record.m || !record.m._) return false;\n\t\t\treturn record.m._[NINE_TABLE.META.INDEX.ROWID] === rowid;\n\t\t});\n\n\t\treturn index;\n\t}\n\n\tadd = (dataSource, updateState = true) => {\n\t\tif (dataSource === undefined) dataSource = {};\n\t\tconst arr = this.#json2Array(dataSource);\n\n\t\tconst processedArr = this.#defaultInsert(arr);\n\n\t\tthis.#parent.rawRecords = this.#parent.rawRecords.concat(processedArr);\n\n\t\tconst row = this.count() - 1;\n\t\tif (updateState) {\n\t\t\tarr.forEach((_, idx) => {\n\t\t\t\tconst target = this.#parent.rawRecords[this.#parent.rawRecords.length - 1 - idx];\n\t\t\t\tif (target) target.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.INSERT;\n\t\t\t});\n\t\t}\n\n\t\tthis.#invalidate();\n\n\t\tthis.#host.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.ROW_ADDED, {\n\t\t\tbubbles: true,\n\t\t\tdetail: { target: this.#host, rowid: processedArr.length > 0 ? processedArr[0].m._[NINE_TABLE.META.INDEX.ROWID] : null }\n\t\t}));\n\n\t\treturn row;\n\t};\n\n\n\tinsert = (rowid, dataSource, updateState = true) => {\n\t\t//trace.log(\"์ฐพ์ rowid:\", rowid);\n\n\t\tif (dataSource === undefined) dataSource = {};\n\t\tconst arr = this.#json2Array(dataSource);\n\t\tif (arr.length === 0) return -1;\n\n\t\tlet targetIndex = this.#getIndexFromRow(rowid);\n\t\t/**\n\t\tif (rowid !== undefined && rowid !== null) {\n\t\t\ttargetIndex = this.#parent.rawRecords.findIndex(record => {\n\t\t\t\tif (!record || !record.m || !record.m._) return false;\n\t\t\t\treturn record.m._[NINE_TABLE.META.INDEX.ROWID] === rowid;\n\t\t\t});\n\t\t} */\n\n\t\tconst processedArr = this.#defaultInsert(arr);\n\n\t\t//if (targetIndex === -1) {\n\t\t//\ttargetIndex = this.#parent.rawRecords.length;\n\t\t//}\n\n\t\tthis.#parent.rawRecords.splice(targetIndex, 0, ...processedArr);\n\n\t\tif (updateState) {\n\t\t\tprocessedArr.forEach((_, idx) => {\n\t\t\t\tconst target = this.#parent.rawRecords[targetIndex + idx];\n\n\t\t\t\tif (target && target.m && target.m._) {\n\t\t\t\t\ttarget.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.INSERT;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#invalidate();\n\n\t\tthis.#host.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.ROW_ADDED, {\n\t\t\tbubbles: true,\n\t\t\tdetail: { target: this.#host, rowid: processedArr.length > 0 ? processedArr[0].m._[NINE_TABLE.META.INDEX.ROWID] : null }\n\t\t}));\n\n\t\treturn processedArr[0].m._[NINE_TABLE.META.INDEX.ROWID]; // ์ฝ์
๋ ์ค์ ๋ฐฐ์ด ์ธ๋ฑ์ค ๋ฐํ\n\t};\n\n\tremove = (v) => {\n\t\tlet arr = [];\n\t\tif (Array.isArray(v)) {\n\t\t\tarr = at;\n\t\t//} else if (typeof at === \"undefined\") {\n\t\t//\tarr = [this.#parent.host.row.at];\n\t\t} else {\n\t\t\tarr = [parseInt(v, 10)];\n\t\t}\n\n\t\tlet arrIndex = [];\n\t\tarr.forEach(rowid => {\n\t\t\tarrIndex.push(this.#getIndexFromRow(rowid));\n\t\t});\n\n\t\tconst records = this.#parent.rawRecords;//this.#getValidRecords();\n\n\t\tarrIndex.sort((a, b) => b - a).forEach(index => {\n\t\t\t//if (validRecords[index]) {\n\t\t\t\tconst targetId = records[index].m._[NINE_TABLE.META.INDEX.ROWID];\n\n\t\t\t\tif (records[index].m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.INSERT) {\n\t\t\t\t\tthis.#parent.rawRecords = this.#parent.rawRecords.filter(item => item.m._[NINE_TABLE.META.INDEX.ROWID] !== targetId);\n\t\t\t\t} else {\n\t\t\t\t\tthis.#parent.rawRecords.forEach(item => {\n\t\t\t\t\t\tif (item.m._[NINE_TABLE.META.INDEX.ROWID] === targetId) {\n\t\t\t\t\t\t\titem.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.DELETE;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t//}\n\t\t});\n\n\t\tthis.#invalidate();\n\n\t\tthis.#host.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.ROW_REMOVED, {\n\t\t\tbubbles: true,\n\t\t\tdetail: { target: this.#host, rowid: arr.length > 0 ? arr[0] : null }\n\t\t}));\n\t};\n\n\tsetValue = (rowid, colnm, value, updateState = true) => {\n\n\t\trowid = parseInt(rowid, 10);\n\t\tconst fields = this.getHostFields();\n\t\tconst COL_IDX = fields.indexOf(colnm);\n\t\tif (COL_IDX < 0) return;\n\n\t\tconst index = this.#getIndexFromRow(rowid);\n\n\t\tconst records = this.#parent.rawRecords;\n\t\tconst rowData = records[index];\n\t\tif (!rowData) return;\n\n\t\tconst oldValue = rowData.v[COL_IDX];\n\t\tif (oldValue !== value && updateState && rowData.m._[NINE_TABLE.META.INDEX.ROW_STATE] !== NINE_TABLE.ROW_STATE.INSERT) {\n\t\t\trowData.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.UPDATE;\n\t\t}\n\n\t\trowData.v[COL_IDX] = value;\n\t};\n\n\tgetChangedData = (rowState) => {\n\n\t\tconst records = this.#parent.rawRecords;\n\n\t\tif (rowState) {\n\t\t\treturn this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === rowState; } ) );\n\t\t}\n\t\telse {\n\t\t\treturn {\n\t\t\t\tC: this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.INSERT; } ) ),\n\t\t\t\tU: this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.UPDATE; } ) ),\n\t\t\t\tD: this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.DELETE; } ) ),\n\t\t\t};\n\t\t}\n\t};\n\n\t#conv = (arr) => {\n\t\tif (!arr) return arr;\n\n\t\tconst isSingle = !Array.isArray(arr);\n\t\tconst targetArr = isSingle ? [arr] : arr;\n\t\tconst fields = this.getHostFields();\n\n\t\tconst result = targetArr.filter(o => !o.__ng?.deleted).map(o => {\n\t\t\tconst t = {};\n\t\t\tfields.forEach((colnm, i) => {\n\t\t\t\tt[colnm] = o.v ? o.v[i] : o[colnm];\n\t\t\t});\n\t\t\tt.__ng = o.__ng;\n\t\t\treturn t;\n\t\t});\n\n\t\treturn isSingle ? result[0] : result;\n\t};\n}\n","import { ngRow, ngData } from \"./ngData.js\";\n\nexport class ngDataManager {\n\t#host;\n\n\tconstructor(host) {\n\t\tthis.#host = host;\n\n\t\tthis.row = new ngRow(this);\n\t\tthis.data = new ngData(this.#host, this);\n\n\t\tthis.rawRecords = [];\n\t\tthis.viewRecords = [];\n\t\tthis.delRecords = [];\n\t\tthis.pageCnt = 25;\n\n\t\tthis.viewRecords.reset = () => {\n\t\t\tif (this.#host.view?.redraw) this.#host.view.redraw();\n\t\t};\n\n\t\tthis.setDataSource = (ds) => {\n\t\t\tif (this.data) this.data.reset();\n\n\t\t\tthis.rawRecords = [];\n\t\t\tthis.viewRecords = [];\n\t\t\tthis.delRecords = [];\n\n\t\t\tthis.data.set(ds || []);\n\t\t};\n\n\t\tthis.getRowState = (nRow) => {\n\t\t\tconst rowIdx = parseInt(nRow, 10);\n\t\t\tif (rowIdx >= this.data.count()) return;\n\t\t\treturn this.data.getValidData()[rowIdx]?.__ng?.rowState;\n\t\t};\n\n\t\tthis.getRowPosition = () => this.row.at;\n\t\tthis.setRowPosition = (nRow) => { this.row.at = nRow; };\n\n\t\tthis.getColumn = (rowidx, colnm) => this.data.get(rowidx, colnm);\n\n\t\tthis.setColumn = (rowidx, colnm, v) => {\n\t\t\trowidx = parseInt(rowidx, 10);\n\t\t\tthis.data.setValue(rowidx, colnm, v);\n\t\t};\n\n\t\t// ์ด๊ธฐ ๋น ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ\n\t\tthis.setDataSource([]);\n\t}\n}","import { trace } from \"@nopeer\";\n\nexport class fields {\n\t#host;\n\t#fields = [];\n\n\tconstructor(host) {\n\t\tthis.#host = host;\n\t\tthis.#init();\n\t};\n\n\tget() {\n\t\treturn this.#fields.map(f => f.name);\n\t};\n\n\tgetFields() {\n\t\treturn this.#fields;\n\t}\n\n\tgetType(fieldName) {\n\t\tconst found = this.#fields.find(f => f.name === fieldName);\n\t\treturn found ? found.type : 'string';\n\t}\n\n\tadd = (arr, type = 'string') => {\n\t\tarr.forEach(fName => {\n\t\t\tif (!this.#fields.some(f => f.name === fName)) {\n\t\t\t\tthis.#fields.push({ name: fName, type: type });\n\t\t\t}\n\t\t});\n\t\tthis.#adjust();\n\t};\n\n\tindexOf(v) {\n\t\treturn this.#fields.findIndex(f => f.name === v);\n\t};\n\n\tincludes(v) {\n\t\treturn this.#fields.some(f => f.name === v);\n\t};\n\n\t#adjust = () => {\n\t\tconst map = new Map();\n\t\tthis.#fields.forEach(f => {\n\t\t\tmap.set(f.name, f.type);\n\t\t});\n\n\t\tthis.#fields = Array.from(map, ([name, type]) => ({ name, type }));\n\n\t\tthis.#fields = this.#fields.filter(f => f.name !== \"\" && f.name !== \"__ng\");\n\n\t\tthis.#fields.sort((a, b) => { return (a.name.length < b.name.length) ? 1 : -1; });\n\t};\n\n\t#init = () => {\n\t\tthis.#fields = [];\n\n\t\tconst rawTables = Array.from(this.#host.querySelectorAll(\"table\"));\n\n\t\tif (!rawTables || rawTables.length === 0) return;\n\n\t\tfor (const tbl of rawTables) {\n\n\t\t\ttbl.querySelectorAll('[data-bind]').forEach((el) => {\n\t\t\t\tconst fieldName = el.dataset.bind;\n\t\t\t\tconst fieldType = el.getAttribute(\"data-type\") || 'string';\n\n\t\t\t\tif (fieldName) {\n\t\t\t\t\tthis.#fields.push({ name: fieldName, type: fieldType });\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst exprAttrs = [\n\t\t\t\t\"data-expr\", \"background-color\", \"color\", \"tooltip\",\n\t\t\t\t\"visible\", \"readonly\", \"enable-button\", \"enable-check\",\n\t\t\t\t\"class-expr\", \"icon-color\", \"icon-src\"\n\t\t\t];\n\n\t\t\texprAttrs.forEach(attr => {\n\t\t\t\ttbl.querySelectorAll(`[${attr}]`).forEach((el) => {\n\t\t\t\t\tlet expr = el.getAttribute(attr);\n\t\t\t\t\tif (!expr) return;\n\n\t\t\t\t\tif (expr.indexOf(\"data.\") < 0) {\n\t\t\t\t\t\tconst lastIndex = expr.search(/[(]/g);\n\n\t\t\t\t\t\tif (lastIndex > 0) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\texpr = String(window[expr.substring(0, lastIndex).trim()]);\n\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\texpr = \"\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\texpr.split(\"data.\").forEach(v => {\n\t\t\t\t\t\tif (v.trim() != \"\") {\n\t\t\t\t\t\t\tconst lastIndex = v.search(/[^_A-Za-z0-9]/g);\n\t\t\t\t\t\t\tlet targetField = '';\n\n\t\t\t\t\t\t\tif (lastIndex >= 0) {\n\t\t\t\t\t\t\t\ttargetField = v.substring(0, lastIndex);\n\t\t\t\t\t\t\t} else if (expr.startsWith(\"data.\")) {\n\t\t\t\t\t\t\t\ttargetField = v.replace(\"data.\", \"\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (targetField) {\n\t\t\t\t\t\t\t\tthis.#fields.push({ name: targetField, type: 'string' });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tthis.#adjust();\n\t};\n};","export class NineTableSheets extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#init();\n }\n\n #init = () => {\n\n };\n\n}\n\nif (!customElements.get('nine-table-sheets')) {\n customElements.define('nine-table-sheets', NineTableSheets);\n}","export class NineTableSheetsFooter extends HTMLElement {\n #host;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#init();\n }\n\n refresh = () => {\n this.querySelector(\"#row-count\").innerHTML = this.#host.data.count().toLocaleString();\n };\n\n #init = () => {\n this.#host = this.getRootNode().host;\n\n this.#render();\n\n this.querySelector('.nine-tab-bar')?.addEventListener('click', (e) => {\n const isMultiSelect = e.ctrlKey || e.metaKey || e.shiftKey;\n const tabItem = e.target.closest('nt-sheets-tab-item');\n\n if (!tabItem) return;\n\n const index = parseInt(tabItem.dataset.index, 10);\n this.#switchSheet(index, isMultiSelect);\n });\n\n setTimeout(() => {\n this.#switchSheet(0, false);\n })\n };\n\n #switchSheet = (index, isMultiSelect = false) => {\n\n const updateSplitters = () => {\n const sheets = Array.from(this.#host.shadowRoot.querySelectorAll('nine-table-sheet'));\n const splitters = Array.from(this.#host.shadowRoot.querySelectorAll('nine-splitter'));\n\n splitters.forEach(s => s.style.setProperty('display', 'none'));\n\n const activeSheets = sheets\n .map((sheet, idx) => ({ sheet, idx }))\n .filter(({ sheet }) => sheet.classList.contains('active'));\n\n if (activeSheets.length < 2) return;\n\n for (let i = 0; i < activeSheets.length - 1; i++) {\n const currentIdx = activeSheets[i].idx;\n\n const targetSplitter = this.#host.shadowRoot.querySelector(`nine-splitter[data-split-index=\"${currentIdx}\"]`);\n if (targetSplitter) {\n targetSplitter.style.setProperty('display', '');\n }\n }\n };\n\n const tabBar = this.querySelector('.nine-tab-bar');\n const body = this.#host.shadowRoot.querySelector('nine-table-sheets-body');\n const tabItems = tabBar.querySelectorAll('nt-sheets-tab-item');\n const sheetElements = body.querySelectorAll('nine-table-sheet');\n\n if (!tabItems[index]) return;\n\n if (!isMultiSelect) {\n tabItems.forEach((tab, idx) => {\n tab.setActive(idx === index);\n });\n\n sheetElements.forEach((sheet, idx) => {\n const isActive = idx === index;\n sheet.classList.toggle('active', isActive);\n sheet.style.flex = isActive ? '1 1 100%' : '';\n });\n } else {\n const clickedTab = tabItems[index];\n const activeTabs = tabBar.querySelectorAll('nt-sheets-tab-item.active');\n\n if (clickedTab.classList.contains('active') && activeTabs.length <= 1) {\n return;\n }\n\n clickedTab.classList.toggle('active');\n const targetSheet = body.querySelector(`nine-table-sheet[data-index=\"${index}\"]`);\n if (targetSheet) {\n targetSheet.classList.toggle('active');\n if (!targetSheet.classList.contains('active')) {\n targetSheet.style.flex = '';\n }\n }\n }\n\n const activeSheets = body.querySelectorAll('nine-table-sheet.active');\n\n activeSheets?.forEach(sheet => {\n sheet.style.flex = (activeSheets.length > 1) ? '1 1 0%' : '1 1 100%';\n\n if (typeof sheet.refreshLayout === 'function') {\n sheet.refreshLayout();\n } else {\n sheet.invalidate?.();\n }\n });\n\n updateSplitters();\n };\n\n #render() {\n const rawElements = Array.from(this.#host.children);\n const rawTables = rawElements.filter(el => (el.tagName.toUpperCase() === 'TABLE'));\n\n const tabsHtml = rawTables.map((table, idx) => {\n const className = idx === 0 ? 'active' : '';\n const tabName = table.getAttribute('caption') || `Sheet ${idx + 1}`;\n\n return `<nt-sheets-tab-item class=\"${className}\" data-index=\"${idx}\">${tabName}</nt-sheets-tab-item>`;\n }).join('');\n\n this.innerHTML = `\n <div class=\"nine-tab-bar\">${tabsHtml}</div>\n <div class=\"sheets-counter\">Total : <span id=\"row-count\">0</span></div>\n `;\n };\n}\n\nexport class SheetTabItem extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n\n }\n\n setActive(isActive) {\n this.classList.toggle('active', isActive);\n }\n}\n\nif (!customElements.get('nt-sheets-tab-item')) {\n customElements.define('nt-sheets-tab-item', SheetTabItem);\n}\n\nif (!customElements.get('nine-table-sheets-footer')) {\n customElements.define('nine-table-sheets-footer', NineTableSheetsFooter);\n}","import { trace } from \"@nopeer\";\n\nexport class Toolbar extends HTMLElement {\n #host;\n #customContainer;\n\n connectedCallback() {\n this.#host = this.getRootNode().host;\n this.#render();\n this.#bindEvents();\n }\n\n #render() {\n this.innerHTML = `\n <div class=\"ng-toolbar-left\">\n <button type=\"button\" class=\"ng-toolbar-menu-btn\" title=\"Menu\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#374151\" stroke-width=\"2\">\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"></line>\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\"></line>\n </svg>\n </button>\n <span class=\"ng-toolbar-title\"></span>\n </div>\n\n <div class=\"ng-toolbar-custom\" id=\"custom-container\"></div>\n `;\n\n this.#customContainer = this.querySelector('#custom-container');\n this.#syncStateFromHost();\n }\n\n #syncStateFromHost() {\n const isSimple = this.#host.getAttribute('theme') === 'simple' || this.#host.classList.contains('simple');\n const showToolbar = this.#host.getAttribute('show-toolbar') !== 'false';\n const showMenu = this.#host.getAttribute('show-menu') !== 'false';\n const caption = this.#host.getAttribute('caption') || '';\n\n if (isSimple || !showToolbar) {\n this.setAttribute('hidden', '');\n } else {\n this.removeAttribute('hidden');\n }\n\n this.setAttribute('show-menu', showMenu ? 'true' : 'false');\n this.updateCaption(caption);\n }\n\n #bindEvents() {\n const titleEl = this.querySelector('.ng-toolbar-title');\n if (titleEl) {\n titleEl.addEventListener('dblclick', () => {\n const link = '<font color=\"green\">https://www.ninegrid.net</font>';\n const currentCaption = this.#host.getAttribute('caption') || '';\n titleEl.innerHTML = titleEl.innerHTML === link ? currentCaption : link;\n });\n }\n\n const menuBtn = this.querySelector('.ng-toolbar-menu-btn');\n if (menuBtn) {\n menuBtn.addEventListener('click', () => {\n this.#host.dispatchEvent(new CustomEvent('toolbar-menu-click', {\n bubbles: true,\n composed: true,\n detail: { targetTable: this.#host }\n }));\n });\n }\n }\n\n addCustomElement(element) {\n if (this.#customContainer) {\n this.#customContainer.append(element);\n }\n }\n\n updateCaption(text) {\n const titleEl = this.querySelector('.ng-toolbar-title');\n if (titleEl) titleEl.textContent = text;\n }\n}\n\nif (!customElements.get('nine-table-toolbar')) {\n customElements.define('nine-table-toolbar', Toolbar);\n}","// ui/nine-table-hscrollbar.js\nimport { trace } from \"@nopeer\";\n\nexport class NineTableHScrollBar extends HTMLElement {\n #owner;\n #dragging = false;\n #elements;\n #interval1;\n #interval2;\n #resizeObserver;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#owner = this.closest(\"nine-table-sheet\") || this.getRootNode().host;\n if (!this.#owner) return;\n\n this.innerHTML = `\n <button class='scroll-left' disabled><div class='scroll-icon'></div></button>\n <div class='scroll-track'><div class='scroll-thumb'></div></div>\n <button class='scroll-right' disabled><div class='scroll-icon'></div></button>\n `;\n\n const initWhenReady = () => {\n const body = this.#owner.querySelector(\".ng-sheet-body .ng-container-body\");\n if (!body) {\n setTimeout(initWhenReady, 10);\n return;\n }\n\n this.#elements = {\n container : body,\n track : this.querySelector(\".scroll-track\"),\n thumb : this.querySelector(\".scroll-thumb\"),\n left : this.querySelector(\".scroll-left\"),\n right : this.querySelector(\".scroll-right\"),\n };\n\n this.#init();\n this.#observeResize();\n this.refresh();\n };\n\n initWhenReady();\n }\n\n disconnectedCallback() {\n if (this.#resizeObserver) {\n this.#resizeObserver.disconnect();\n }\n }\n\n #observeResize = () => {\n if (!this.#owner) return;\n const body = this.#owner.querySelector(\".ng-sheet-body .ng-container-body\");\n if (!body) return;\n\n this.#resizeObserver = new ResizeObserver(() => {\n this.refresh();\n });\n this.#resizeObserver.observe(body);\n };\n\n refresh = () => {\n\n if (!this.#owner || !this.#elements || this.#dragging) return;\n\n const body = this.#elements.container;\n const table = body.querySelector(\"table\");\n if (!table) return;\n\n const track = this.#elements.track;\n const thumb = this.#elements.thumb;\n\n const bodyWidth = body.clientWidth;\n const tableWidth = table.scrollWidth;\n\n const needsHScroll = (bodyWidth !== 0 && tableWidth > bodyWidth);\n this.#owner.classList.toggle('hscroll-visible', needsHScroll);\n\n if (!needsHScroll) {\n return;\n }\n\n const trackWidth = track.clientWidth;\n if (trackWidth <= 0) return;\n\n const thumbWidth = Math.max(Math.min(trackWidth * (bodyWidth / tableWidth), trackWidth), 20);\n thumb.style.width = `${thumbWidth}px`;\n\n const currentLeft = body.scrollLeft;\n const maxScrollLeft = tableWidth - bodyWidth;\n\n let l = 0;\n if (maxScrollLeft > 0) {\n l = parseInt((currentLeft / maxScrollLeft) * (trackWidth - thumbWidth), 10);\n }\n if (l < 0) l = 0;\n\n const maxThumbLeft = trackWidth - thumbWidth;\n if (l > maxThumbLeft) l = maxThumbLeft;\n\n thumb.style.left = `${l}px`;\n\n this.#elements.left.disabled = (l === 0);\n this.#elements.right.disabled = (l >= maxThumbLeft - 1);\n };\n\n #thumbMoveTo = (x) => {\n if (!this.#elements) return false;\n\n const body = this.#elements.container;\n const table = body.querySelector(\"table\");\n if (!table) return false;\n\n const trackBound = this.#elements.track.getBoundingClientRect();\n const thumbWidth = this.#elements.thumb.clientWidth;\n\n let targetX = x;\n if (targetX < 0) targetX = 0;\n const maxThumbLeft = trackBound.width - thumbWidth;\n if (targetX > maxThumbLeft) targetX = maxThumbLeft;\n targetX = parseInt(targetX, 10);\n\n this.#elements.thumb.style.left = `${targetX}px`;\n\n this.#elements.left.disabled = (targetX === 0);\n this.#elements.right.disabled = (targetX >= maxThumbLeft - 1);\n\n const bodyWidth = body.clientWidth;\n const tableWidth = table.scrollWidth;\n const maxScrollLeft = tableWidth - bodyWidth;\n\n if (maxThumbLeft > 0 && maxScrollLeft > 0) {\n const newScrollLeft = (targetX / maxThumbLeft) * maxScrollLeft;\n body.scrollLeft = newScrollLeft;\n }\n\n return (targetX > 0 && targetX < maxThumbLeft - 1);\n };\n\n #init = () => {\n const delayScroll = (pos) => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n\n const thumbLeft = parseInt(this.#elements.thumb.style.left || 0, 10);\n this.#thumbMoveTo(thumbLeft + pos);\n\n this.#interval1 = setInterval(() => {\n clearInterval(this.#interval1);\n\n this.#interval2 = setInterval(() => {\n const currentThumbLeft = parseInt(this.#elements.thumb.style.left || 0, 10);\n if (!this.#thumbMoveTo(currentThumbLeft + pos)) {\n clearInterval(this.#interval2);\n }\n }, 50);\n }, 500);\n };\n\n const clearTimer = () => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n };\n\n //['mouseup', 'mouseleave', 'touchend'].forEach(evt => {\n ['mouseup', 'mouseleave'].forEach(evt => {\n this.#elements.left.addEventListener(evt, clearTimer);\n this.#elements.right.addEventListener(evt, clearTimer);\n this.#elements.track.addEventListener(evt, clearTimer);\n });\n\n this.#elements.left.addEventListener(\"mousedown\", e => { if (e.button !== 0) return; delayScroll(-20); });\n this.#elements.right.addEventListener(\"mousedown\", e => { if (e.button !== 0) return; delayScroll(20); });\n //this.#elements.left.addEventListener(\"touchstart\", () => delayScroll(-20));\n //this.#elements.right.addEventListener(\"touchstart\", () => delayScroll(20));\n\n this.#elements.track.addEventListener(\"mousedown\", e => {\n if (e.button !== 0) return;\n e.preventDefault();\n const trackRect = this.#elements.track.getBoundingClientRect();\n const thumbWidth = this.#elements.thumb.clientWidth;\n this.#thumbMoveTo(e.clientX - trackRect.left - (thumbWidth / 2));\n });\n\n this.#elements.thumb.addEventListener(\"mousedown\", e => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n this.#dragging = true;\n this.shiftX = e.clientX - this.#elements.thumb.getBoundingClientRect().left;\n\n const onMouseMove = (moveEvent) => {\n if (!this.#dragging) return;\n const trackRect = this.#elements.track.getBoundingClientRect();\n this.#thumbMoveTo(moveEvent.clientX - trackRect.left - this.shiftX);\n };\n\n const onMouseUp = () => {\n this.#dragging = false;\n clearTimer();\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n this.refresh();\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n });\n };\n}\n\nif (!customElements.get('nine-table-hscrollbar')) {\n customElements.define(\"nine-table-hscrollbar\", NineTableHScrollBar);\n}","import { trace } from \"@nopeer\";\n\nexport const GROUP_IDX = {\n\tID: 0,\n\tDEPTH: 1,\n\tNAME: 2,\n\tCHILDREN: 3,\n};\n\nexport class GroupingManager {\n\t#sheet;\n\t#host;\n\t#groupColumns = [];\n\t#groupMap = new Map();\n\t#collapsedMap = new Map(); // ๊ทธ๋ฃน๋ณ ์ ํ ์ํ ๊ด๋ฆฌ\n\t#isApplying = false;\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = this.#sheet.getRootNode().host;\n\t}\n\n\tget columns() {\n\t\treturn this.#groupColumns;\n\t}\n\n\tget groupMap() {\n\t\treturn this.#groupMap;\n\t}\n\n\t// ๐ก ๋๋ฝ๋์๋ setGroupMap ๋ฉ์๋ ์ถ๊ฐ\n\tsetGroupMap(map) {\n\t\tthis.#groupMap = map;\n\t}\n\n\t// ํน์ ๊ทธ๋ฃน์ ์ ๊ธฐ/ํด๊ธฐ ์ํ ํ ๊ธ\n\ttoggleGroup(groupId) {\n\t\tconst currentState = this.#collapsedMap.get(groupId) || false;\n\t\tthis.#collapsedMap.set(groupId, !currentState);\n\t\tthis.#sheet.invalidate();\n\t}\n\n\tisCollapsed(groupId) {\n\t\treturn this.#collapsedMap.get(groupId) || false;\n\t}\n\n\tget collapsedMap() {\n\t\treturn this.#collapsedMap;\n\t}\n\n\tinitialize = () => {\n\t\tlet groupColumns = [];\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\t\tif (sourceTable) {\n\t\t\tsourceTable.querySelectorAll('tbody tr[grouping=\"true\"]').forEach(($tr) => {\n\t\t\t\tconst $cell = $tr.querySelector(`[cell-type=\"tree\"]`);\n\t\t\t\tif ($cell && $cell.dataset.bind) {\n\t\t\t\t\tgroupColumns.push($cell.dataset.bind);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tthis.#groupColumns = groupColumns;\n\t};\n\n\tapply() {\n\t\tif (this.#isApplying) return;\n\t\tthis.#isApplying = true;\n\t\tthis.initialize();\n\t\tthis.#isApplying = false;\n\t\tthis.#sheet.scrollToY(0);\n\t\tthis.#sheet.view.refresh();\n\t}\n\n\tclear() {\n\t\tthis.#groupColumns = [];\n\t\tthis.#groupMap.clear();\n\t\tthis.#collapsedMap.clear();\n\t\tthis.#isApplying = false;\n\t\tthis.#sheet.scrollToY(0);\n\t\tthis.#sheet.view.refresh();\n\t}\n\n\tgetChildrenRowIds(groupId) {\n\t\treturn this.#groupMap.get(groupId) || [];\n\t}\n\n\tgetChildrenRecords(groupId) {\n\t\tconst rowIds = this.getChildrenRowIds(groupId);\n\t\tconst dataManager = this.#host.data;\n\t\treturn rowIds.map(rowid => dataManager.getArray(rowid)).filter(Boolean);\n\t}\n}\n\nexport class Grouping {\n\n\tstatic apply(rawRecords, groupColumns = [], fields = [], collapsedMap = new Map()) {\n\t\tif (!groupColumns || groupColumns.length === 0) {\n\t\t\treturn { headers: [], renderItems: [], groupMap: new Map() };\n\t\t}\n\n\t\tconst validRaw = rawRecords.filter(o => !o.__ng?.deleted);\n\t\tconst groupMap = new Map();\n\n\t\tconst nestedTree = Grouping.#buildNestedMap(validRaw, groupColumns, fields);\n\t\tconst flatResult = [];\n\t\tconst renderItems = [];\n\n\t\tGrouping.#flattenTree(nestedTree, 0, groupColumns, flatResult, renderItems, groupMap, \"\", collapsedMap);\n\n\t\treturn { headers: flatResult, renderItems, groupMap };\n\t}\n\n\tstatic #flattenTree(mapOrArray, depth, groupColumns, resultArr, renderItems, groupMap, parentId, collapsedMap) {\n\t\tlet counter = 0;\n\t\tconst isLastLevel = (depth === groupColumns.length - 1);\n\n\t\tfor (let [groupKey, subMapOrRecords] of mapOrArray.entries()) {\n\t\t\tconst groupId = parentId ? `${parentId}_${counter++}` : `g_${counter++}`;\n\t\t\tconst isCollapsed = collapsedMap.get(groupId) || false;\n\n\t\t\tconst rowIds = Grouping.#collectLeafRowIds(subMapOrRecords);\n\t\t\tgroupMap.set(groupId, rowIds);\n\n\t\t\tconst groupRecord = [];\n\t\t\tgroupRecord[GROUP_IDX.ID] = groupId;\n\t\t\tgroupRecord[GROUP_IDX.DEPTH] = depth;\n\t\t\tgroupRecord[GROUP_IDX.NAME] = groupKey;\n\t\t\tgroupRecord[GROUP_IDX.CHILDREN] = rowIds;\n\n\t\t\tgroupRecord.__isGroupHeader = true;\n\t\t\tgroupRecord.__groupId = groupId;\n\t\t\tgroupRecord.__collapsed = isCollapsed;\n\n\t\t\tresultArr.push(groupRecord);\n\n\t\t\trenderItems.push({\n\t\t\t\ttype: 'group',\n\t\t\t\trecord: groupRecord,\n\t\t\t\tgroupId: groupId,\n\t\t\t\tcollapsed: isCollapsed,\n\t\t\t});\n\n\t\t\t// ๐ก ๊ทธ๋ฃน์ด ์ ํ์์ง ์์ ๊ฒฝ์ฐ์๋ง ํ์ ํธ๋ฆฌ ๋ฐ ์์ ๋ ์ฝ๋ ์ถ๊ฐ\n\t\t\tif (!isCollapsed) {\n\t\t\t\tif (!isLastLevel && subMapOrRecords instanceof Map) {\n\t\t\t\t\tGrouping.#flattenTree(subMapOrRecords, depth + 1, groupColumns, resultArr, renderItems, groupMap, groupId, collapsedMap);\n\t\t\t\t} else {\n\t\t\t\t\tconst leafRecords = Grouping.#collectLeafRecords(subMapOrRecords);\n\t\t\t\t\tleafRecords.forEach(record => {\n\t\t\t\t\t\trecord.__isGroupHeader = false;\n\t\t\t\t\t\trecord.__groupId = groupId;\n\t\t\t\t\t\tresultArr.push(record);\n\n\t\t\t\t\t\trenderItems.push({\n\t\t\t\t\t\t\ttype: 'data',\n\t\t\t\t\t\t\trecord: record,\n\t\t\t\t\t\t\tgroupId: groupId\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\tstatic #buildNestedMap(records, groupColumns, fields) {\n\t\tconst colIndex = fields.indexOf(groupColumns[0]);\n\t\tconst remainingCols = groupColumns.slice(1);\n\t\tconst map = new Map();\n\n\t\trecords.forEach(record => {\n\t\t\tconst key = colIndex >= 0 ? record.v[colIndex] : '(Unknown)';\n\t\t\tif (!map.has(key)) map.set(key, []);\n\t\t\tmap.get(key).push(record);\n\t\t});\n\n\t\tif (remainingCols.length > 0) {\n\t\t\tconst result = new Map();\n\t\t\tfor (let [key, subRecords] of map.entries()) {\n\t\t\t\tresult.set(key, Grouping.#buildNestedMap(subRecords, remainingCols, fields));\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\treturn map;\n\t}\n\n\tstatic #collectLeafRowIds(subMapOrRecords) {\n\t\tlet rowIds = [];\n\t\tif (subMapOrRecords instanceof Map) {\n\t\t\tfor (let subVal of subMapOrRecords.values()) {\n\t\t\t\trowIds = rowIds.concat(Grouping.#collectLeafRowIds(subVal));\n\t\t\t}\n\t\t} else if (Array.isArray(subMapOrRecords)) {\n\t\t\trowIds = rowIds.concat(subMapOrRecords.map(r => r.__ng?.rowid ?? r.m?._?.[0]));\n\t\t}\n\t\treturn rowIds;\n\t}\n\n\tstatic #collectLeafRecords(subMapOrRecords) {\n\t\tlet records = [];\n\t\tif (subMapOrRecords instanceof Map) {\n\t\t\tfor (let subVal of subMapOrRecords.values()) {\n\t\t\t\trecords = records.concat(Grouping.#collectLeafRecords(subVal));\n\t\t\t}\n\t\t} else if (Array.isArray(subMapOrRecords)) {\n\t\t\trecords = records.concat(subMapOrRecords);\n\t\t}\n\t\treturn records;\n\t}\n}","// ui/nine-table-vscrollbar.js\nimport { trace } from \"@nopeer\";\nimport { GROUP_IDX } from \"@/data/Grouping.js\";\n\nexport class NineTableVScrollBar extends HTMLElement {\n #host;\n #sheet;\n #dragging = false;\n #elements;\n #startY = 0;\n #startScrollTop = 0;\n #startThumbTop = 0;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#host = this.getRootNode().host;\n this.#sheet = this.closest(\"nine-table-sheet\");\n\n this.innerHTML = `\n <button class='scroll-top' disabled><div class='scroll-icon'></div></button>\n <div class='scroll-track'><div class='scroll-thumb'></div></div>\n <button class='scroll-bottom' disabled><div class='scroll-icon'></div></button>\n `;\n\n const initWhenReady = () => {\n const body = this.#sheet.querySelector(\".ng-sheet-body\");\n if (!body) {\n setTimeout(initWhenReady, 10);\n return;\n }\n\n this.#elements = {\n container: body,\n track: this.querySelector(\".scroll-track\"),\n thumb: this.querySelector(\".scroll-thumb\"),\n top: this.querySelector(\".scroll-top\"),\n bottom: this.querySelector(\".scroll-bottom\"),\n };\n\n this.#init();\n this.refresh();\n };\n\n initWhenReady();\n }\n\n #getScaleInfo = () => {\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords ? viewRecords.length : 0;\n\n const scrollHolder = this.#sheet.elements.scrollHolder;\n let rawContentHeight = scrollHolder ? parseFloat(scrollHolder.style.height) || 0 : 0;\n\n // if (!rawContentHeight || rawContentHeight <= 0) {\n const isGrouped = this.#sheet.sourceTable?.querySelector(\"tbody tr[grouping='true']\") ? true : false;\n if (isGrouped) {\n\n const getItemHeight = (item) => {\n if (item.type === 'group') {\n const depth = item.record[GROUP_IDX.DEPTH];\n return this.#sheet.template.heights[depth];\n } else {\n // ์ ์์ ์ธ ๋ง์ด๋์ค ์ฐ์ฐ์(-)๊ฐ ํฌํจ๋ ๋ฐ์ดํฐ ํ ๋์ด ์ฐ์ถ\n const dataRowsHeight = this.#sheet.template.height - this.#sheet.template.group.height;\n return dataRowsHeight > 0 ? dataRowsHeight : this.#sheet.template.height;\n }\n };\n\n let sumHeight = 0;\n for (let i = 0; i < viewRecords.length; i++) {\n sumHeight += getItemHeight(viewRecords[i]);\n }\n\n rawContentHeight = sumHeight;\n } else {\n const rowHeight = this.#sheet.template.height;\n rawContentHeight = totalCount * rowHeight;\n }\n // }\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawContentHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n let contentHeight = rawContentHeight;\n\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawContentHeight;\n contentHeight = MAX_BROWSER_HEIGHT;\n }\n\n return { contentHeight, scaleFactor, useScaling, totalCount };\n };\n\n\n refresh = () => {\n if (this.#dragging) return;\n\n if (!this.#sheet || !this.#sheet.elements || !this.#elements) return;\n\n const body = this.#elements.container;\n const track = this.#elements.track;\n const thumb = this.#elements.thumb;\n const { contentHeight } = this.#getScaleInfo();\n\n const fixedHeight = (this.#sheet.querySelector('thead')?.offsetHeight || 0) +\n (this.#sheet.querySelector('tfoot')?.offsetHeight || 0) +\n (this.#sheet.querySelector('tbody.head')?.offsetHeight || 0);\n\n const bodyHeight = (this.#sheet.querySelector('.ng-sheet-body').offsetHeight || 0);\n const viewHeight = bodyHeight - fixedHeight;\n\n // ๐ก hardcoded ๋ฐฉ์ ๋์ #getScaleInfo()๊ฐ ์ฐ์ถํ contentHeight๋ฅผ ๊ธฐ์ค(rawContentHeight ๋์ฒด)์ผ๋ก ํ์ฉ\n const rawContentHeight = contentHeight;\n\n const needsVScroll = (rawContentHeight > viewHeight);\n\n this.#sheet.classList.toggle('vscroll-visible', needsVScroll);\n\n if (!needsVScroll) {\n return;\n }\n\n const trackHeight = track.clientHeight;\n if (trackHeight <= 0) return;\n\n // ๐ก ๋๋ฝ๋ ๊ณฑํ๊ธฐ(*) ์ฐ์ฐ์ ๋ณต๊ตฌ\n const thumbHeight = Math.max(Math.min(trackHeight * (viewHeight / rawContentHeight), trackHeight), 20);\n thumb.style.height = `${thumbHeight}px`;\n\n const currentScrollTop = body.scrollTop;\n\n // ๐ก ๋๋ฝ๋ ๋ง์ด๋์ค(-) ์ฐ์ฐ์ ๋ณต๊ตฌ ๋ฐ viewHeight ๊ธฐ์ค ๋ฐ์\n const maxScrollTop = Math.max(rawContentHeight - viewHeight, 1);\n\n let thumbTop = 0;\n if (maxScrollTop > 0) {\n // ๐ก ๋๋ฝ๋ ๋ง์ด๋์ค(-) ์ฐ์ฐ์ ๋ณต๊ตฌ\n thumbTop = (currentScrollTop / maxScrollTop) * (trackHeight - thumbHeight);\n }\n\n // ๐ก ๋๋ฝ๋ ๋ง์ด๋์ค(-) ์ฐ์ฐ์ ๋ณต๊ตฌ\n const maxThumbTop = trackHeight - thumbHeight;\n if (thumbTop < 0) thumbTop = 0;\n if (thumbTop > maxThumbTop) thumbTop = maxThumbTop;\n\n thumb.style.top = `${thumbTop}px`;\n\n this.#elements.top.disabled = (currentScrollTop <= 0);\n // ๐ก ๋๋ฝ๋ ๋ง์ด๋์ค(-) ์ฐ์ฐ์ ๋ณต๊ตฌ\n this.#elements.bottom.disabled = (currentScrollTop >= maxScrollTop - 1);\n };\n\n #onMouseUp = () => {\n this.#dragging = false;\n };\n\n #onMouseDown = (e) => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n this.#dragging = true;\n\n this.#startY = e.clientY;\n this.#startThumbTop = parseFloat(this.#elements.thumb.style.top) || 0;\n\n };\n\n #onMouseMove = (e) => {\n if (!this.#dragging) return;\n\n /** will be move down */\n const trackRect = this.#elements.track.getBoundingClientRect();\n const trackHeight = trackRect.height;\n const thumbHeight = this.#elements.thumb.clientHeight;\n const maxThumbTop = trackHeight - thumbHeight;\n\n if (maxThumbTop <= 0) return;\n\n //trace.log(new Date().toISOString());\n\n const deltaY = e.clientY - this.#startY;\n let targetThumbTop = this.#startThumbTop + deltaY;\n\n if (targetThumbTop < 0) targetThumbTop = 0;\n if (targetThumbTop > maxThumbTop) targetThumbTop = maxThumbTop;\n\n // ์ธ ์์น ์ฆ์ ์ด๋\n this.#elements.thumb.style.top = `${targetThumbTop}px`;\n\n // ์ด๋ ๋น์จ(0 ~ 1) ์ฐ์ถ\n const ratio = maxThumbTop > 0 ? (targetThumbTop / maxThumbTop) : 0;\n\n // RowManager ๋ฐ RowManager #handleScroll๊ณผ ์๋ฒฝํ ๋๊ธฐํ๋๋ ํฝ์
๋จ์ scrollTop ์ฐ์ถ\n const body = this.#elements.container;\n const fixedHeight = (this.#sheet.elements.body?.thead?.offsetHeight || 0) +\n (this.#sheet.elements.body?.tfoot?.offsetHeight || 0) +\n (this.#sheet.elements.body?.tbody.head.offsetHeight || 0);\n const viewHeight = body.clientHeight - fixedHeight;\n\n const { contentHeight } = this.#getScaleInfo();\n const maxScrollTop = Math.max(contentHeight - viewHeight, 0);\n\n const targetScrollTop = ratio * maxScrollTop;\n\n // ๋ทฐํฌํธ ์คํฌ๋กค ์ง์ ์ง์ ๋ฐ RowManager ๊ฐฑ์ ์ ๋\n body.scrollTop = targetScrollTop;\n //this.#sheet.rowManager?.refresh(true);\n\n const currentScrollTop = body.scrollTop;\n this.#elements.top.disabled = (currentScrollTop <= 0);\n this.#elements.bottom.disabled = (currentScrollTop >= maxScrollTop - 1);\n };\n\n\n #init = () => {\n\n document.addEventListener('mouseup', this.#onMouseUp);\n document.addEventListener('mousemove', this.#onMouseMove);\n this.#elements.thumb.addEventListener(\"mousedown\", this.#onMouseDown);\n\n // 2. ํธ๋(Track) ๋น ๊ณต๊ฐ ํด๋ฆญ ์ ์ด\n this.#elements.track.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0 || e.target === this.#elements.thumb) return;\n const trackRect = this.#elements.track.getBoundingClientRect();\n const thumbHeight = this.#elements.thumb.clientHeight;\n const trackHeight = this.#elements.track.clientHeight;\n const maxThumbTop = trackHeight - thumbHeight;\n\n if (maxThumbTop > 0) {\n const clickY = e.clientY - trackRect.top - (thumbHeight / 2);\n const ratio = Math.max(0, Math.min(1, clickY / maxThumbTop));\n\n const body = this.#elements.container;\n const fixedHeight = (this.#sheet.elements.body?.thead?.offsetHeight || 0) +\n (this.#sheet.elements.body?.tfoot?.offsetHeight || 0) +\n (this.#sheet.elements.body?.tbody.head.offsetHeight || 0);\n const viewHeight = body.clientHeight - fixedHeight;\n\n const { contentHeight } = this.#getScaleInfo();\n const maxScrollTop = Math.max(contentHeight - viewHeight, 0);\n\n const targetScrollTop = ratio * maxScrollTop;\n\n body.scrollTop = targetScrollTop;\n this.#sheet.rowManager?.refresh(true);\n }\n this.refresh();\n });\n\n let scrollTimeout = null;\n\n const startContinuousScroll = (direction) => {\n if (scrollTimeout) return;\n\n const viewRecords = this.#sheet.view.getArray();\n\n const fixedHeight = (this.#sheet.querySelector('thead')?.offsetHeight || 0) +\n (this.#sheet.querySelector('tfoot')?.offsetHeight || 0) +\n (this.#sheet.querySelector('tbody.head')?.offsetHeight || 0);\n\n let currentDelay = 400;\n const minDelay = 1;\n\n const scrollStep = () => {\n const bodyView = this.#elements.container; // ๐ก ๋ทฐํฌํธ DOM ์ปจํ
์ด๋ (bodyView)\n const scrollTop = bodyView.scrollTop;\n const bodyRect = bodyView.getBoundingClientRect(); // ๐ก DOM ์์น ์ ๋ณด\n const effectiveTop = bodyRect.top + fixedHeight;\n\n // 1. ํ์ฌ ๋ทฐํฌํธ์ ๋ ๋๋ง๋ tr๋ค์ ๊ฐ์ ธ์ด\n const trs = Array.from(this.#sheet.querySelectorAll('.ng-container-body tbody.body tr'));\n if (trs.length === 0) return;\n\n // 2. ์ฒซ ๋ฒ์งธ ์ ํจํ(๋ณด์ด๋) tr ์ฐพ๊ธฐ\n const firstTr = trs.find(tr => tr.style.display !== 'none');\n if (!firstTr) return;\n\n const index = parseInt(firstTr.dataset.index, 10);\n const sameIndexTrs = trs.filter(tr => {\n if (tr.style.display === 'none') return false;\n return tr.dataset.index === firstTr.dataset.index;\n });\n\n const rects = sameIndexTrs.map(tr => tr.getBoundingClientRect());\n const groupTop = Math.min(...rects.map(r => r.top));\n\n // 3. ์ฒซ ๋ฒ์งธ tr์ด ๊ทธ๋ฃน ํ์ธ์ง ํ๋จ\n const isGroupRow = firstTr.getAttribute('grouping') === 'true';\n\n let targetScrollTop = scrollTop;\n let targetStepSize = 0;\n\n if (direction === 'down') {\n\n if (isGroupRow) {\n\n const groupBottom = Math.max(...rects.map(r => r.bottom));\n const totalGroupHeight = groupBottom - groupTop;\n\n if (effectiveTop > groupTop) {\n targetStepSize = totalGroupHeight - (effectiveTop - groupTop);\n } else {\n targetStepSize = totalGroupHeight;\n }\n } else {\n if (effectiveTop > groupTop) {\n targetStepSize = this.#sheet.template.height - this.#sheet.template.group.height - (effectiveTop - groupTop);\n } else {\n targetStepSize = this.#sheet.template.height - this.#sheet.template.group.height;\n }\n }\n\n targetScrollTop = scrollTop + targetStepSize;\n } else {\n if (groupTop >= effectiveTop) {\n if (index > 0) {\n if (viewRecords[index-1].type === \"group\") {\n const depth = viewRecords[index-1].groupId.split(\"_\").length - 2;\n targetStepSize = this.#sheet.template.group.heights[depth];\n } else {\n targetStepSize = this.#sheet.template.height - this.#sheet.template.group.height;\n }\n }\n } else {\n targetStepSize = effectiveTop - groupTop;\n }\n\n targetScrollTop = Math.max(0, scrollTop - targetStepSize);\n }\n\n bodyView.scrollTop = targetScrollTop;\n this.#sheet.rowManager?.refresh(true);\n this.refresh();\n\n currentDelay = Math.max(minDelay, Math.floor(currentDelay * 0.7));\n scrollTimeout = setTimeout(scrollStep, currentDelay);\n };\n\n scrollStep();\n };\n\n const stopContinuousScroll = () => {\n if (scrollTimeout) {\n clearTimeout(scrollTimeout); // ๐ก setTimeout์ด๋ฏ๋ก clearTimeout ์ฌ์ฉ\n scrollTimeout = null;\n }\n };\n\n this.#elements.top.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n startContinuousScroll('up');\n });\n\n this.#elements.bottom.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n startContinuousScroll('down');\n });\n\n document.addEventListener(\"mouseup\", stopContinuousScroll);\n this.#elements.top.addEventListener(\"mouseleave\", stopContinuousScroll);\n this.#elements.bottom.addEventListener(\"mouseleave\", stopContinuousScroll);\n };\n\n #init1 = () => {\n\n this.#elements.thumb.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n this.#dragging = true;\n\n this.#startY = e.clientY;\n this.#startThumbTop = parseFloat(this.#elements.thumb.style.top) || 0;\n const trackRect = this.#elements.track.getBoundingClientRect();\n const trackHeight = trackRect.height;\n const thumbHeight = this.#elements.thumb.clientHeight;\n const maxThumbTop = trackHeight - thumbHeight;\n\n const records = this.#sheet.getArray();\n\n const onMouseMove = (moveEvent) => {\n if (!this.#dragging) return;\n if (maxThumbTop <= 0) return;\n\n const deltaY = moveEvent.clientY - this.#startY;\n let targetThumbTop = this.#startThumbTop + deltaY;\n\n if (targetThumbTop < 0) targetThumbTop = 0;\n if (targetThumbTop > maxThumbTop) targetThumbTop = maxThumbTop;\n\n this.#elements.thumb.style.top = `${targetThumbTop}px`;\n\n const ratio = targetThumbTop / maxThumbTop;\n\n const rowHeight = this.#sheet.template.height;\n const viewHeight = (this.#sheet.querySelector('.ng-sheet-body').offsetHeight || 0) -\n (this.#sheet.elements.body.thead?.offsetHeight || 0) -\n (this.#sheet.elements.body.tfoot?.offsetHeight || 0) -\n (this.#sheet.elements.body.tbody.head.offsetHeight || 0);\n\n const visibleRowCount = Math.floor(viewHeight / rowHeight);\n\n const { totalCount } = this.#getScaleInfo();\n const targetRow = Math.floor(ratio * (totalCount - visibleRowCount + 1));\n\n trace.log(totalCount, targetRow);\n\n this.#sheet.rowManager.scrollToDataRow(targetRow);\n\n const { contentHeight } = this.#getScaleInfo();\n const currentScrollTop = this.#elements.container.scrollTop;\n const maxScrollTop = Math.max(contentHeight - this.#sheet.rowManager.getRowHeight(), 0);\n\n this.#elements.top.disabled = (currentScrollTop <= 0);\n this.#elements.bottom.disabled = (currentScrollTop >= maxScrollTop - 1);\n\n //trace.log(new Date().toISOString());\n };\n\n const onMouseUp = () => {\n this.#dragging = false;\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n });\n\n this.#elements.track.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0 || e.target === this.#elements.thumb) return;\n const trackRect = this.#elements.track.getBoundingClientRect();\n const thumbHeight = this.#elements.thumb.clientHeight;\n const trackHeight = this.#elements.track.clientHeight;\n const maxThumbTop = trackHeight - thumbHeight;\n\n if (maxThumbTop > 0) {\n const clickY = e.clientY - trackRect.top - (thumbHeight / 2);\n const ratio = Math.max(0, Math.min(1, clickY / maxThumbTop));\n\n const { totalCount } = this.#getScaleInfo();\n const targetRow = Math.max(0, Math.min(Math.floor(ratio * (totalCount - 1)), totalCount - 1));\n\n\n if (targetRow >= 0 && this.#sheet.rowManager && typeof this.#sheet.rowManager.scrollToDataRow === 'function') {\n this.#sheet.rowManager.scrollToDataRow(targetRow, 'top');\n }\n }\n this.refresh();\n });\n\n let scrollInterval = null;\n\n const startContinuousScroll = (direction) => {\n if (scrollInterval) return;\n\n const scrollStep = () => {\n const $firstTr = this.#sheet.querySelector(\"tbody.body tr\");\n\n if (!$firstTr || $firstTr.dataset.row === undefined) {\n return;\n }\n\n if (direction === 'down' && this.#sheet.isLastRow()) {\n return;\n }\n\n const currentRow = parseInt($firstTr.dataset.row, 10);\n const targetRow = direction === 'down' ? currentRow+1 : Math.max(0, currentRow-1);\n\n this.#sheet.rowManager.scrollToDataRow(targetRow, null, () => {\n this.refresh();\n });\n };\n\n scrollStep();\n scrollInterval = setInterval(scrollStep, 200); // 100ms ๊ฐ๊ฒฉ ๋ฐ๋ณต\n };\n\n const stopContinuousScroll = () => {\n if (scrollInterval) {\n clearInterval(scrollInterval);\n scrollInterval = null;\n }\n };\n\n this.#elements.top.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n startContinuousScroll('up');\n });\n\n this.#elements.bottom.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n startContinuousScroll('down');\n });\n\n document.addEventListener(\"mouseup\", stopContinuousScroll);\n this.#elements.top.addEventListener(\"mouseleave\", stopContinuousScroll);\n this.#elements.bottom.addEventListener(\"mouseleave\", stopContinuousScroll);\n };\n}\n\nif (!customElements.get('nine-table-vscrollbar')) {\n customElements.define(\"nine-table-vscrollbar\", NineTableVScrollBar);\n}\n\n","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport { GROUP_IDX } from \"@/data/Grouping.js\";\n\nexport class RowManager {\n #BUFFER_ROW_COUNT = 3;\n\n #host;\n #sheet;\n #element;\n\n #chchedAllRecords;\n #containerTemplates = new Map();\n\n #resizeObserver = null;\n #sheetHeight = 0;\n #cachedRowCount;\n\n #isProgrammaticScroll = false;\n #isGrouped = false;\n\n constructor(sheet) {\n this.#host = sheet.getRootNode().host;\n this.#sheet = sheet;\n\n this.#initResizeObserver();\n }\n\n getRowHeight() {\n return this.#sheet.template.height;\n }\n\n refresh = (force = false) => {\n\n if (!this.#sheet.classList.contains('active')) return;\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n if (!bodyViewport) return;\n\n const wasInvalidHeight = !this.#sheet.template.height || this.#sheet.template.height <= 0;\n\n if (wasInvalidHeight) {\n this.#measureAndCacheHeight();\n if (this.#sheet.template.height && this.#sheet.template.height > 0) {\n this.#renderAllContainers();\n }\n }\n\n this.#chchedAllRecords = this.#host.data.getArray();\n\n this.#handleScroll(bodyViewport.scrollTop, force);\n\n this.#sheet.querySelector('nine-table-vscrollbar')?.refresh();\n };\n\n #handleScroll = (scrollTop, force = false) => {\n\n const rowHeight = this.#sheet.template.height;\n if (!rowHeight || rowHeight <= 0) return;\n\n if (this.#isGrouped) {\n this.#handleGroupedScroll(scrollTop, force);\n return;\n }\n\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords.length;\n\n if (totalCount === 0) {\n this.#sheet.elements.scrollHolder.style.height = '0px';\n return;\n }\n\n const fixedHeight = (this.#sheet.elements.body.thead?.offsetHeight || 0) +\n (this.#sheet.elements.body.tfoot?.offsetHeight || 0) +\n this.#sheet.elements.body.tbody.head.offsetHeight;\n\n const viewHeight = this.#sheet.querySelector('.ng-sheet-body').offsetHeight || 0;\n const rawTotalVirtualHeight = Math.max(totalCount * rowHeight - (viewHeight - fixedHeight - rowHeight) - rowHeight, 0);\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawTotalVirtualHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n let totalVirtualHeight = rawTotalVirtualHeight;\n\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawTotalVirtualHeight;\n totalVirtualHeight = MAX_BROWSER_HEIGHT;\n }\n\n this.#sheet.elements.scrollHolder.style.height = `${totalVirtualHeight}px`;\n\n const actualScrollTop = useScaling ? (scrollTop / scaleFactor) : scrollTop;\n\n const maxStartIndex = Math.max(0, totalCount - 1);\n const clampedScrollTop = Math.min(actualScrollTop, rawTotalVirtualHeight);\n const startIndex = Math.max(0, Math.min(Math.floor(clampedScrollTop / rowHeight), maxStartIndex));\n\n //trace.log(clampedScrollTop % rowHeight, rowHeight);\n\n /*\n * FIX: Use GPU-accelerated transform3d instead of 'top' positioning.\n * On mobile devices (iOS Safari), direct 'top' updates trigger expensive\n * layout reflows and cause severe scrolling lag during inertia touch scrolls.\n * translate3d forces hardware compositing for buttery-smooth performance.\n */\n this.#sheet.elements.left.tbody.body.style.transform =\n this.#sheet.elements.body.tbody.body.style.transform =\n this.#sheet.elements.right.tbody.body.style.transform = `translate3d(0px, -${clampedScrollTop % rowHeight}px, 0px)`;\n\n\n const firstTr = this.#element.firstTr;\n const currentStartIndex = firstTr && firstTr.dataset.row !== undefined ? parseInt(firstTr.dataset.row, 10) : -1;\n\n if (!force && currentStartIndex === startIndex) {\n return;\n }\n\n [\n this.#sheet.elements.left.tbody.body,\n this.#sheet.elements.body.tbody.body,\n this.#sheet.elements.right.tbody.body\n ].forEach(($tbody, tbodyIdx) => {\n if (!$tbody) return;\n\n //const rows = $tbody.querySelectorAll('tbody.body tr');\n\n $tbody.trs.forEach(($tr, index) => {\n const dataIndex = startIndex + Math.floor(index / this.#sheet.template.length);\n\n if (dataIndex >= totalCount) {\n $tr.style.display = 'none';\n $tr.dataset.matrixRow = null;\n $tr.dataset.row = null;\n $tr.dataset.index = null;\n return;\n }\n\n const record = viewRecords[dataIndex];//this.#sheet.view.getArray(dataIndex);\n\n if (!record) {\n $tr.style.display = 'none';\n return;\n }\n\n const rowid = record.m._[NINE_TABLE.META.INDEX.ROWID];\n\n $tr.style.display = '';\n\n this.#bindRowData($tr, record, rowid, dataIndex);\n });\n });\n\n this.#sheet.selection.refresh();\n };\n\n #getPreviousSiblingGroupId = (groupId) => {\n if (!groupId) return null;\n\n const parts = groupId.split('_'); // ์: ['g', '0', '1', '2']\n const lastIdx = parts.length - 1;\n const lastVal = parseInt(parts[lastIdx], 10);\n\n // ๋ง์ง๋ง ์๋ฒ์ด 0๋ณด๋ค ์ปค์ผ ๋ฐ๋ก ์ํ์ ๊ฐ ์กด์ฌํจ\n if (lastVal > 0) {\n let siblingParts = [...parts];\n siblingParts[lastIdx] = lastVal - 1;\n return siblingParts.join('_');\n }\n\n return null; // ๋ฐ๋ก ์ํ์ ๊ฐ ์๋ ๊ฒฝ์ฐ (์: 'g_0', 'g_0_0' ๋ฑ)\n };\n\n #getRootAncestorGroupId = (groupId) => {\n if (!groupId) return null;\n\n const parts = groupId.split('_'); // ์: ['g', '0', '1', '2']\n\n // ์ต์ํ 'g'์ ์ต์์ ๋ฒํธ(์: ['g', '0'])๊ฐ ์์ด์ผ ํจ\n if (parts.length > 2) {\n return parts.slice(0, 2).join('_'); // ํญ์ ['g', '0'] ํํ์ธ ์ต์์ ์กฐ์ ๋ฐํ\n }\n\n return groupId; // ์ด๋ฏธ ์ต์์์ด๊ฑฐ๋ ํ์์ด ๋ค๋ฅธ ๊ฒฝ์ฐ\n };\n\n #getAllAncestorGroupIds = (groupId) => {\n if (!groupId) return [];\n\n const parts = groupId.split('_'); // ์: ['g', '0', '1', '2']\n let ancestors = [];\n\n // 'g'๋ฅผ ์ ์ธํ๊ณ ์ต์์๋ถํฐ ๋ฐ๋ก ์ง์ ๋ถ๋ชจ๊น์ง ์กฐ์ ID๋ค์ ์์๋๋ก ์์ง\n // ์: 'g_0_1_2' -> ['g_0', 'g_0_1']\n for (let i = 2; i < parts.length; i++) {\n ancestors.push(parts.slice(0, i).join('_'));\n }\n\n return ancestors;\n };\n\n #getLastDescendantGroupIds = (groupId, allRenderItems) => {\n if (!groupId || !allRenderItems) return [];\n\n let descendantIds = [];\n let currentId = groupId;\n\n while (true) {\n const prefix = currentId + '_';\n const currentDepth = currentId.split('_').length;\n\n // 1. ํ์ฌ ๋์ค๋ณด๋ค ๋ฑ 1๋จ๊ณ ๊น์ ์ง์ ์์๋ค๋ง ์์ถ\n const children = allRenderItems.filter(item => {\n if (!item.groupId || item.type !== 'group') return false;\n if (!item.groupId.startsWith(prefix)) return false;\n return item.groupId.split('_').length === currentDepth + 1;\n });\n\n // 2. ๋ ์ด์ ์์์ด ์์ผ๋ฉด ํ์ ์ข
๋ฃ\n if (children.length === 0) {\n break;\n }\n\n // 3. ์์๋ค ์ค ๋ฒํธ๊ฐ ๊ฐ์ฅ ํฐ ๋
์(๋ง๋ด) ์ ํ\n children.sort((a, b) => {\n const partsA = a.groupId.split('_');\n const partsB = b.groupId.split('_');\n const valA = parseInt(partsA[partsA.length - 1], 10);\n const valB = parseInt(partsB[partsB.length - 1], 10);\n return valB - valA;\n });\n\n const youngestChildId = children[0].groupId;\n\n // 4. ์ฐพ์ ๋ง๋ด๋ฅผ ๋ฐฐ์ด์ ์ถ๊ฐ\n descendantIds.push(youngestChildId);\n\n // 5. ๊ทธ ๋ง๋ด๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ค์ ๋จ๊ณ(์์์ ์์) ํ์ ์งํ\n currentId = youngestChildId;\n }\n\n return descendantIds; // ๋ง๋ด๋ค์ ์ฒด์ธ ๋ฐฐ์ด ๋ฆฌํด\n };\n\n\n #getParentGroupIds = (renderedItems, allRenderItems) => {\n let headerGroupIds = [];\n\n const firstItem = renderedItems[0];\n if (!firstItem || !firstItem.groupId) return headerGroupIds;\n\n const parts = firstItem.groupId.split('_'); // ์: [\"g\", \"1\"] ๋๋ [\"g\", \"0\", \"1\"]\n\n if (firstItem.type === 'data') {\n // 1. ๋ฐ์ดํฐ ํ์ธ ๊ฒฝ์ฐ: ์กฐ์ ๊ทธ๋ฃน ID๋ค๋ง ์์๋๋ก ๋ชจ๋ ์์ง\n for (let i = 1; i < parts.length; i++) {\n headerGroupIds.push(parts.slice(0, i + 1).join('_'));\n }\n } else {\n // 2. ๊ทธ๋ฃน์ธ ๊ฒฝ์ฐ:\n // A. ๋์ ์ง์ ๋ถ๋ชจ/์กฐ์๋ค ์์ง (๋ง๋จ ๋ณธ์ธ ์ ์ธ)\n if (parts.length > 2) {\n for (let i = 1; i < parts.length - 1; i++) {\n //headerGroupIds.push(parts.slice(0, i + 1).join('_'));\n }\n }\n\n const rootGroupId = this.#getRootAncestorGroupId(firstItem.groupId);\n //const siblingGroupId = this.#getPreviousSiblingGroupId(rootGroupId);\n const siblingGroupId = this.#getPreviousSiblingGroupId(firstItem.groupId);\ntrace.log(firstItem.groupId, siblingGroupId);\n if (siblingGroupId) {\n // 1. ์กฐ์ ๋ฐฐ์ด๋ค์ 1์ฐจ์์ผ๋ก ํผ์ณ์ ์ถ๊ฐ\n headerGroupIds.push(...this.#getAllAncestorGroupIds(siblingGroupId));\n\n //trace.log(siblingGroupId, this.#getLastDescendantGroupIds(siblingGroupId, allRenderItems));\n // 2. ๋ฐ๋ก ์ํ์ ๋ณธ์ธ ์ถ๊ฐ\n headerGroupIds.push(siblingGroupId);\n // 3. ์ํ์ ์ ๋ง๋ด ํ์ ์ถ๊ฐ (allRenderItems ์ธ์ ์ ๋ฌ ํ์ ์ฌ๋ถ ํ์ธ)\n //const lastDescendant = this.#getLastDescendantGroupIds(siblingGroupId, allRenderItems);\n //trace.log(siblingGroupId, lastDescendant);\n headerGroupIds.push(...this.#getLastDescendantGroupIds(siblingGroupId, allRenderItems));\n\n }\n else {\n headerGroupIds.push(...this.#getAllAncestorGroupIds(firstItem.groupId));\n }\n\n }\n\n // โ [๋ฒ์ธ ์์ถ ์๋ฃ] renderedItems(๋ณธ๋ฌธ ํญ๋ชฉ๋ค)๋ฅผ ํค๋๋ก ๊ธ์ด๋ชจ์ผ๋ 3๋ฒ ๋ฃจํ๋ ์์ ํ ์ญ์ ํ์ต๋๋ค!\n // ํค๋๋ ์ค์ง ์์์ ๊ณ์ฐ๋ ์กฐ์๊ณผ ์ํ์ ์ฒด์ธ๋ง ๊ฐ์ง๋ฉด ์ถฉ๋ถํฉ๋๋ค.\n\n // 3. ์งง์ ์กฐ์๋ถํฐ ๊น์ ์์ ์์ผ๋ก ์ ๋ ฌ\n headerGroupIds.sort((a, b) => a.length - b.length || a.localeCompare(b));\n\n return headerGroupIds;\n };\n\n #isShouldHoldHeader = (renderedItems) => {\n\n return false;\n\n const $activeFooterTrs = Array.from(this.#sheet.querySelectorAll('thead.foot tr'))\n .filter(tr => tr.style.display !== 'none' && tr.dataset.groupId);\n\n const lastFooterTr = $activeFooterTrs[$activeFooterTrs.length - 1];\n const lastHeaderGroupId = lastFooterTr?.dataset.groupId;\n const lastHeaderDepth = lastHeaderGroupId ? lastHeaderGroupId.split(\"_\").length - 2 : -1;\n\n const firstItem = renderedItems[0];\n const isFirstItemGroup = firstItem.type === 'group';\n const firstItemDepth = isFirstItemGroup && firstItem.groupId\n ? firstItem.groupId.split(\"_\").length - 2\n : -1;\n\n // ์ ์ง ์กฐ๊ฑด: ๋ฐ์ดํฐ ํ์ด๊ฑฐ๋, ํค๋ ๋ง์ง๋ง ๋์ค๊ฐ ์ฒซ ํ ๋์ค๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๋ ํ๋\n const shouldHoldHeader = !isFirstItemGroup || (lastHeaderDepth >= firstItemDepth);\n\n return shouldHoldHeader;\n };\n\n #findScrollTargetTrs = (renderedItems, allRenderItems) => {\n // 1. ํค๋์ ํ์ฌ ์ด์์๋(display: none์ด ์๋) ๋ชจ๋ footer tr ์ถ์ถ\n const $activeFooterTrs = Array.from(this.#sheet.querySelectorAll('.ng-container-body thead.foot tr'))\n .filter(tr => tr.style.display !== 'none' && tr.dataset.groupId);\n\n if ($activeFooterTrs.length === 0) return [];\n\n // 2. ๋ฐ๋์์ ํ์ฌ ํ๋ฉด์ ๋ณด์ด๋ ์ฒซ ๋ฒ์งธ ์ค๋ฌผ tr ์ฐพ๊ธฐ\n const $visibleTrs = Array.from(this.#sheet.querySelectorAll('.ng-container-body tbody.body tr'));\n const $firstRealTr = $visibleTrs.find(tr => tr.style.display !== 'none');\n\n if (!$firstRealTr) return [];\n\n // 3. ์คํฌ๋กค ์์น ๋ฐ ๋ฐ๋ ์ฒซ ํ๊ณผ์ ์ถฉ๋ ๊ฑฐ๋ฆฌ ๊ณ์ฐ\n const $theadFoot = this.#sheet.querySelector('.ng-container-body thead.foot');\n const footRect = $theadFoot.getBoundingClientRect();\n const trRect = $firstRealTr.getBoundingClientRect();\n const distance = Math.max(0, footRect.bottom - trRect.top);\n\n if (distance === 0) return []; // ์ถฉ๋ํ์ง ์์ผ๋ฉด ์์ง์ผ ํ์ ์์\n\n // 4. ์ด๋ค tr๋ค์ ๋ฐ์ด ์ฌ๋ ค์ผ ํ ์ง ํ๊ฒํ
\n // (์: ํ์ฌ ํค๋์ ์์ฌ ์๋ tr๋ค ์ค ๋ฐ๋ ์ฒซ ํ์ ๋์ค์ ๋ง๋ฌผ๋ฆฌ๊ฑฐ๋ ๋ฐ์ด๋ด์ผ ํ๋ ๋์ ํํฐ๋ง)\n const targets = [];\n\n for (const $tr of $activeFooterTrs) {\n const groupId = $tr.dataset.groupId;\n const headerItem = allRenderItems.find(item => item.groupId === groupId);\n if (!headerItem) continue;\n\n const headerDepth = headerItem.record[GROUP_IDX.DEPTH];\n const firstItem = renderedItems[0];\n const firstItemDepth = firstItem.type === 'group'\n ? firstItem.record[GROUP_IDX.DEPTH]\n : headerDepth;\n\n // ๋ฐ์ด ์ฌ๋ ค์ผ ํ๋ ์กฐ๊ฑด์ ํ๋ณ\n if (headerDepth >= firstItemDepth) {\n targets.push({\n tr: $tr,\n depth: headerDepth,\n distance: distance\n });\n\n //trace.log($tr);\n }\n }\n\n return targets;\n };\n\n #adjustHeaderGroup = (renderedItems, allRenderItems) => {\n const firstItem = renderedItems[0];\n\n const trs = this.#findScrollTargetTrs(renderedItems, allRenderItems);\n\n const $activeFooterTrs = Array.from(this.#sheet.querySelectorAll('.ng-container-body thead.foot tr'))\n .filter(tr => tr.style.display !== 'none' && tr.dataset.groupId);\n\n const lastFooterTr = $activeFooterTrs[$activeFooterTrs.length - 1];\n const lastHeaderGroupId = lastFooterTr?.dataset.groupId;\n const lastHeaderItem = lastHeaderGroupId ? allRenderItems.find(item => item.groupId === lastHeaderGroupId) : null;\n\n // ์ด๊ธฐํ: ๋ชจ๋ ํค๋์ transform ์ ๊ฑฐ\n this.#sheet.querySelectorAll('thead.foot tr').forEach(($tr) => {\n $tr.style.transform = ``;\n });\n\n if (lastHeaderItem && firstItem) {\n const lastHeaderDepth = lastHeaderItem.record[GROUP_IDX.DEPTH];\n const firstItemDepth = firstItem.type === 'group'\n ? firstItem.record[GROUP_IDX.DEPTH]\n : lastHeaderDepth;\n\n const $visibleTrs = Array.from(this.#sheet.querySelectorAll('.ng-container-body tbody.body tr'));\n const $firstRealTr = $visibleTrs.find(tr => tr.style.display !== 'none');\n\n if ($firstRealTr) {\n const targetSectionRowIndex = lastHeaderDepth;\n\n // ํค๋ ๋์ค๊ฐ ๋ฐ๋ ์ฒซ ๋ฒ์งธ ๋์ค๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ ๊ฐ๋ฌธ์ด ๋ค๋ฅผ ๋ ๋ฐ์ด ์ฌ๋ฆผ\n if (lastHeaderDepth >= firstItemDepth) {\n const trRect = $firstRealTr.getBoundingClientRect();\n const $theadFoot = this.#sheet.querySelector('.ng-container-body thead.foot');\n const distance = Math.max(0, $theadFoot.getBoundingClientRect().bottom - trRect.top);\n //trace.log(distance)\n this.#sheet.querySelectorAll('thead.foot tr').forEach(($tr) => {\n if ($tr.sectionRowIndex === targetSectionRowIndex) {\n $tr.style.transform = `translateY(-${distance}px)`;\n }\n });\n }\n }\n }\n };\n\n #handleGroupedScroll = (scrollTop, force = false) => {\n\n //trace.log(scrollTop);\n const allRenderItems = this.#sheet.view.getArray() || [];\n const totalVirtualCount = allRenderItems.length;\n if (totalVirtualCount === 0) {\n this.#sheet.elements.scrollHolder.style.height = '0px';\n return;\n }\n\n const findItemByGroupId = (allRenderItems, targetGroupId) => {\n return allRenderItems.find(item => item.groupId === targetGroupId && item.type === 'group');\n };\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n const bodyContent = this.#sheet.querySelector('.ng-sheet-body .ng-sheet-body-content');\n const templateLength = this.#sheet.template.length;\n\n const getItemHeight = (item) => {\n if (item.type === 'group') {\n const depth = item.record[GROUP_IDX.DEPTH];\n return this.#sheet.template.heights[depth];\n } else {\n const dataRowsHeight = this.#sheet.template.height - this.#sheet.template.group.height;\n return dataRowsHeight > 0 ? dataRowsHeight : this.#sheet.template.height;\n }\n };\n\n let sumHeight = 0;\n const itemHeights = new Array(totalVirtualCount);\n for (let i = 0; i < totalVirtualCount; i++) {\n const h = getItemHeight(allRenderItems[i]);\n itemHeights[i] = h;\n sumHeight += h;\n }\n\n const rawTotalVirtualHeight = Math.max(sumHeight - this.#sheet.viewport.height + this.#sheet.viewport.fixedHeight, 0);\n\n //trace.log(allRenderItems.length);\n //const rawTotalVirtualHeight = Math.max(sumHeight, 0);\n\n\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawTotalVirtualHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n let totalVirtualHeight = rawTotalVirtualHeight;\n\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawTotalVirtualHeight;\n totalVirtualHeight = MAX_BROWSER_HEIGHT;\n }\n\n this.#sheet.elements.scrollHolder.style.height = `${totalVirtualHeight}px`;\n\n const actualScrollTop = useScaling ? (scrollTop / scaleFactor) : scrollTop;\n const clampedScrollTop = Math.min(actualScrollTop, rawTotalVirtualHeight);\n //const clampedScrollTop = Math.min(rawTotalVirtualHeight, rawTotalVirtualHeight);\n\n let accumulatedHeight = 0;\n let startIndex = 0;\n\n for (let i = 0; i < totalVirtualCount; i++) {\n const h = itemHeights[i];\n if (accumulatedHeight + h > clampedScrollTop) {\n startIndex = i;\n break;\n }\n accumulatedHeight += h;\n startIndex = i;\n }\n\n const offsetY = clampedScrollTop - accumulatedHeight;\n //trace.log(offsetY, scrollTop, actualScrollTop, rawTotalVirtualHeight, clampedScrollTop, accumulatedHeight);\n if (bodyContent) {\n bodyContent.querySelectorAll(\"tbody.body\").forEach(($tbody) => {\n $tbody.style.top = `-${Math.max(0, offsetY)}px`;\n });\n }\n\n const targetEnd = Math.min(totalVirtualCount, startIndex + this.#sheet.viewport.tr.length);\n const renderedItems = allRenderItems.slice(startIndex, targetEnd);\n\n\n //trace.log(allRenderItems.length, renderedItems.length, rawTotalVirtualHeight, sumHeight, this.#sheet.viewport.height, this.#sheet.viewport.fixedHeight);\n //trace.log(renderedItems.length, allRenderItems.length, this.#cachedRowCount, totalVirtualCount, startIndex, this.#sheet.viewport.tr.length);\n\n\n if (renderedItems.length === 0) return;\n\n\n const headerGroupIds = [];//this.#getParentGroupIds(renderedItems, allRenderItems);\n\n const shouldHoldHeader = true;//this.#isShouldHoldHeader(renderedItems);\n\n //trace.log(renderedItems[0].groupId, headerGroupIds);\n\n if (!shouldHoldHeader) {\n ['.ng-container-left', '.ng-container-body', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (!container) return;\n\n container.querySelectorAll('thead.foot tr').forEach(($tr, rowIndex) => {\n const targetGroupId = headerGroupIds[rowIndex];\n\n if (targetGroupId) {\n $tr.style.display = '';\n const targetGroup = allRenderItems.find(item => item.groupId === targetGroupId && item.type === 'group');\n if (targetGroup) {\n const actualIndex = allRenderItems.indexOf(targetGroup);\n this.#bindGroupRowData($tr, allRenderItems, targetGroup.record, actualIndex);\n }\n } else {\n $tr.style.display = 'none';\n }\n });\n });\n }\n\n\n const trueFirstItem = renderedItems.find(item => {\n // ๋ง์ฝ group ํ์
์ด๊ณ headerGroupIds์ ํฌํจ๋์ด ์๋ค๋ฉด ๋ณธ๋ฌธ์์ ์จ๊ฒจ์ง๋ฏ๋ก ์ ์ธ\n if (item.type === 'group' && headerGroupIds.includes(item.groupId)) {\n return false;\n }\n return true;\n });\n\n // ==========================================\n // ๐ก 2๋จ๊ณ: ๋ณธ๋ฌธ(tbody.body) ๋ ๋๋ง (๋ชจ๋ ์์ดํ
๋น ์ง์์ด ์ถ๋ ฅ)\n // ==========================================\n [\n this.#sheet.elements.left.tbody.body,\n this.#sheet.elements.body.tbody.body,\n this.#sheet.elements.right.tbody.body\n ].forEach(($tbody, tbodyIdx) => {\n if (!$tbody) return;\n\n let vIndex = startIndex;\n\n for (let i = 0; i < $tbody.trs.length; i += templateLength) {\n const itemIndex = Math.floor(i / templateLength);\n const item = renderedItems[itemIndex];\n const chunkTrs = $tbody.trs.slice(i, i + templateLength);\n\n if (!item || itemIndex >= renderedItems.length) {\n chunkTrs.forEach(tr => {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n });\n continue;\n }\n\n const dataIndex = startIndex + itemIndex;\n\n chunkTrs.forEach((tr, subIdx) => {\n tr.dataset.virtualIndex = vIndex;\n tr.dataset.row = (item.type === 'data') ? dataIndex : '';\n\n const isTrGroup = tr.getAttribute('grouping') === 'true';\n\n if (item.type === 'group') {\n if (isTrGroup) {\n const depth = item.record[GROUP_IDX.DEPTH];\n if (subIdx === depth) {\n tr.style.display = '';\n\n this.#bindGroupRowData(tr, allRenderItems, item.record, startIndex + itemIndex);\n } else {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n }\n } else {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n }\n } else {\n if (isTrGroup) {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n } else {\n tr.style.display = '';\n const rowid = item.record.m._[NINE_TABLE.META.INDEX.ROWID];\n this.#bindRowData(tr, item.record, rowid, startIndex + itemIndex);\n //if (subIdx === templateLength - 1) vIndex++;\n }\n }\n });\n }\n });\n\n //this.#adjustHeaderGroup(renderedItems, allRenderItems);\n /**\n const firstItem = trueFirstItem || renderedItems[0];\n const lastHeaderGroupId = headerGroupIds[headerGroupIds.length - 1];\n const lastHeaderItem = allRenderItems.find(item => item.groupId === lastHeaderGroupId);\n\n if (lastHeaderItem && firstItem) {\n const lastHeaderDepth = lastHeaderItem.record[GROUP_IDX.DEPTH];\n\n const firstItemDepth = firstItem.type === 'group'\n ? firstItem.record[GROUP_IDX.DEPTH]\n : lastHeaderDepth;\n\n const $visibleTrs = Array.from(this.#sheet.querySelectorAll('.ng-container-body tbody.body tr'));\n const $firstRealTr = $visibleTrs.find(tr => tr.style.display !== 'none');\n const sectionRowIndex = $firstRealTr.dataset.groupId?.split(\"_\").length - 2;\n\n if (lastHeaderDepth === firstItemDepth && lastHeaderItem.groupId !== firstItem.groupId) {\n const trRect = $firstRealTr.getBoundingClientRect();\n const $theadFoot = this.#sheet.querySelector('.ng-container-body thead.foot');\n const distance = $theadFoot.getBoundingClientRect().bottom - trRect.top;\n\n this.#sheet.querySelectorAll('thead.foot tr').forEach(($tr) => {\n if ($tr.sectionRowIndex === sectionRowIndex) {\n $tr.style.transform = `translateY(-${distance}px)`;\n }\n });\n } else {\n this.#sheet.querySelectorAll('thead.foot tr').forEach(($tr) => {\n $tr.style.transform = ``;\n });\n }\n }\n */\n this.#sheet.selection.refresh();\n };\n\n\n\n #handleGroupedScroll_BAK = (scrollTop, force = false) => {\n\n trace.log(scrollTop);\n const allRenderItems = this.#sheet.view.getArray() || [];\n const totalVirtualCount = allRenderItems.length;\n if (totalVirtualCount === 0) {\n this.#sheet.elements.scrollHolder.style.height = '0px';\n return;\n }\n\n const findItemByGroupId = (allRenderItems, targetGroupId) => {\n return allRenderItems.find(item => item.groupId === targetGroupId && item.type === 'group');\n };\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n const bodyContent = this.#sheet.querySelector('.ng-sheet-body .ng-sheet-body-content');\n const templateLength = this.#sheet.template.length;\n\n const getItemHeight = (item) => {\n if (item.type === 'group') {\n const depth = item.record[GROUP_IDX.DEPTH];\n return this.#sheet.template.heights[depth];\n } else {\n const dataRowsHeight = this.#sheet.template.height - this.#sheet.template.group.height;\n return dataRowsHeight > 0 ? dataRowsHeight : this.#sheet.template.height;\n }\n };\n\n let sumHeight = 0;\n const itemHeights = new Array(totalVirtualCount);\n for (let i = 0; i < totalVirtualCount; i++) {\n const h = getItemHeight(allRenderItems[i]);\n itemHeights[i] = h;\n sumHeight += h;\n }\n\n //const rawTotalVirtualHeight = Math.max(sumHeight - this.#sheet.viewport.height + this.#sheet.viewport.fixedHeight, 0);\n\n const rawTotalVirtualHeight = Math.max(sumHeight, 0);\n\n\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawTotalVirtualHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n let totalVirtualHeight = rawTotalVirtualHeight;\n\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawTotalVirtualHeight;\n totalVirtualHeight = MAX_BROWSER_HEIGHT;\n }\n\n this.#sheet.elements.scrollHolder.style.height = `${totalVirtualHeight}px`;\n\n const actualScrollTop = useScaling ? (scrollTop / scaleFactor) : scrollTop;\n const clampedScrollTop = Math.min(actualScrollTop, rawTotalVirtualHeight);\n //const clampedScrollTop = Math.min(rawTotalVirtualHeight, rawTotalVirtualHeight);\n\n let accumulatedHeight = 0;\n let startIndex = 0;\n\n for (let i = 0; i < totalVirtualCount; i++) {\n const h = itemHeights[i];\n if (accumulatedHeight + h > clampedScrollTop) {\n startIndex = i;\n break;\n }\n accumulatedHeight += h;\n startIndex = i;\n }\n\n const offsetY = clampedScrollTop - accumulatedHeight;\n //trace.log(offsetY, scrollTop, actualScrollTop, rawTotalVirtualHeight, clampedScrollTop, accumulatedHeight);\n if (bodyContent) {\n bodyContent.querySelectorAll(\"tbody.body\").forEach(($tbody) => {\n $tbody.style.top = `-${Math.max(0, offsetY)}px`;\n });\n }\n\n const targetEnd = Math.min(totalVirtualCount, startIndex + this.#sheet.viewport.tr.length);\n const renderedItems = allRenderItems.slice(startIndex, targetEnd);\n\n\n //trace.log(allRenderItems.length, renderedItems.length, rawTotalVirtualHeight, sumHeight, this.#sheet.viewport.height, this.#sheet.viewport.fixedHeight);\n //trace.log(renderedItems.length, allRenderItems.length, this.#cachedRowCount, totalVirtualCount, startIndex, this.#sheet.viewport.tr.length);\n\n\n if (renderedItems.length === 0) return;\n\n // ==========================================\n // ๐ก 1๋จ๊ณ: thead.foot๋ก ์ฌ๋ฆด ์์ ๊ทธ๋ฃน ์์ดํ
์ ๋ณ (๋ชจ๋ ์์ ๋ถ๋ชจ ์์ ๋์ )\n // ==========================================\n let headerGroupIds = [];\n //const firstItem = renderedItems[0];\n const firstItemGroupId = renderedItems[0].groupId;\n const firstItemdepth = firstItemGroupId.split(\"_\").length - 2;\n\n trace.log(firstItemGroupId, firstItemdepth);\n\n if (firstItemGroupId) {\n const parts = firstItemGroupId.split('_'); // ์: [\"g\", \"1\", \"0\"]\n let ids = [];\n\n if (renderedItems[0].type === 'group') {\n // 2. ๊ทธ๋ฃน ํ์ธ ๊ฒฝ์ฐ: ๋ถ๋ชจ ์กฐ์๋ค + (์ํ์ ๊ฐ ์กด์ฌํ ๋๋ง ๋ฐ๋ก ์ํ์ ์ถ๊ฐ)\n\n // A. ๋ถ๋ชจ ์กฐ์๋ค ์์ง (๋ง์ง๋ง ๋ง๋จ ๊ทธ๋ฃน ์ ์ธ)\n if (parts.length > 2) {\n for (let i = 1; i < parts.length - 1; i++) {\n ids.push(parts.slice(0, i + 1).join('_'));\n }\n }\n\n // B. ๋ง๋จ ๊ทธ๋ฃน์ ์ํ์ ์ฒ๋ฆฌ\n const lastIdx = parts.length - 1;\n const lastVal = parseInt(parts[lastIdx], 10);\n\n // ๐ก ํต์ฌ: lastVal์ด 0๋ณด๋ค ํด ๋๋ง ์ํ์ (lastVal - 1) ์กด์ฌํจ!\n // 0์ธ ๊ฒฝ์ฐ(์ฒซ ๋ฒ์งธ ๊ทธ๋ฃน ๋๋ ์ฒซ์งธ ์์)๋ ์ํ์ ๊ฐ ์์ผ๋ฏ๋ก ์๋ฌด๊ฒ๋ ์ถ๊ฐํ์ง ์์ (g_0 ์ฌ๋จ ๋ฐฉ์ง)\n if (lastVal > 0) {\n let siblingParts = [...parts];\n siblingParts[lastIdx] = lastVal - 1;\n ids.push(siblingParts.join('_'));\n }\n } else {\n // type์ด data์ธ ๊ฒฝ์ฐ: groupId ์์ฒด๊ฐ ์กฐ์๋ค ์ฒด์ธ\n ids = parts.map((_, index) => parts.slice(0, index + 1).join('_')).slice(1);\n }\n\n headerGroupIds = ids;\n }\n\n //trace.log(headerGroupIds);\n\n for (const item of renderedItems) {\n\n const itemDepth = item.groupId.split(\"_\").length - 2;\n //firstItemGroupId\n trace.log(firstItemdepth, itemDepth);\n if (firstItemdepth >= itemDepth) break;\n\n if (item.type === 'group') {\n if (item.groupId && !headerGroupIds.includes(item.groupId)) {\n headerGroupIds.push(item.groupId);\n }\n } else {\n break; // ๋ฐ์ดํฐ ํ์ ๋ง๋๋ฉด ์ค๋จ\n }\n }\n\n\n if (headerGroupIds.length === 0) {\n for (const item of renderedItems) {\n const itemDepth = item.groupId.split(\"_\") - 1;\n\n if (item.type === 'group') {\n if (item.groupId && !headerGroupIds.includes(item.groupId)) {\n headerGroupIds.push(item.groupId);\n }\n } else {\n break; // ๋ฐ์ดํฐ ํ์ ๋ง๋๋ฉด ์ค๋จ\n }\n }\n }\n\n trace.log(headerGroupIds);\n\n // ๐ก thead.foot์ ์ฌ๋ผ๊ฐ์ ๋ณธ๋ฌธ์์ ์จ๊ฒจ์ง(excluded) ์์ดํ
๋ค์ ์ ์ธํ๊ณ ,\n // ์ฌ์ฉ์ ๋์ ์ค์ ๋ก ๋งจ ์ฒ์์ ๋ณด์ด๋ '์ง์ง ์ฒซ ๋ฒ์งธ ์์ดํ
'์ ์ฐพ์ต๋๋ค.\n const trueFirstItem = renderedItems.find(item => {\n // ๋ง์ฝ group ํ์
์ด๊ณ headerGroupIds์ ํฌํจ๋์ด ์๋ค๋ฉด ๋ณธ๋ฌธ์์ ์จ๊ฒจ์ง๋ฏ๋ก ์ ์ธ\n if (item.type === 'group' && headerGroupIds.includes(item.groupId)) {\n return false;\n }\n return true;\n });\n\n\n ['.ng-container-left', '.ng-container-body', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (!container) return;\n\n container.querySelectorAll('thead.foot tr').forEach(($tr, rowIndex) => {\n const targetGroupId = headerGroupIds[rowIndex];\n\n if (targetGroupId) {\n $tr.style.display = '';\n const targetGroup = allRenderItems.find(item => item.groupId === targetGroupId && item.type === 'group');\n if (targetGroup) {\n const actualIndex = allRenderItems.indexOf(targetGroup);\n this.#bindGroupRowData($tr, allRenderItems, targetGroup.record, actualIndex);\n }\n } else {\n $tr.style.display = 'none';\n }\n });\n });\n\n // ==========================================\n // ๐ก 2๋จ๊ณ: ๋ณธ๋ฌธ(tbody.body) ๋ ๋๋ง (๋ชจ๋ ์์ดํ
๋น ์ง์์ด ์ถ๋ ฅ)\n // ==========================================\n [\n this.#sheet.elements.left.tbody.body,\n this.#sheet.elements.body.tbody.body,\n this.#sheet.elements.right.tbody.body\n ].forEach(($tbody, tbodyIdx) => {\n if (!$tbody) return;\n\n let vIndex = startIndex;\n\n for (let i = 0; i < $tbody.trs.length; i += templateLength) {\n const itemIndex = Math.floor(i / templateLength);\n const item = renderedItems[itemIndex];\n const chunkTrs = $tbody.trs.slice(i, i + templateLength);\n\n if (!item || itemIndex >= renderedItems.length) {\n chunkTrs.forEach(tr => {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n });\n continue;\n }\n\n const dataIndex = startIndex + itemIndex;\n\n chunkTrs.forEach((tr, subIdx) => {\n tr.dataset.virtualIndex = vIndex;\n tr.dataset.row = (item.type === 'data') ? dataIndex : '';\n\n const isTrGroup = tr.getAttribute('grouping') === 'true';\n\n if (item.type === 'group') {\n if (isTrGroup) {\n const depth = item.record[GROUP_IDX.DEPTH];\n if (subIdx === depth) {\n tr.style.display = '';\n\n this.#bindGroupRowData(tr, allRenderItems, item.record, startIndex + itemIndex);\n } else {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n }\n } else {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n }\n } else {\n if (isTrGroup) {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n } else {\n tr.style.display = '';\n const rowid = item.record.m._[NINE_TABLE.META.INDEX.ROWID];\n this.#bindRowData(tr, item.record, rowid, startIndex + itemIndex);\n //if (subIdx === templateLength - 1) vIndex++;\n }\n }\n });\n }\n });\n\n const firstItem = trueFirstItem || renderedItems[0];\n const lastHeaderGroupId = headerGroupIds[headerGroupIds.length - 1];\n const lastHeaderItem = allRenderItems.find(item => item.groupId === lastHeaderGroupId);\n\n if (lastHeaderItem && firstItem) {\n const lastHeaderDepth = lastHeaderItem.record[GROUP_IDX.DEPTH];\n\n const firstItemDepth = firstItem.type === 'group'\n ? firstItem.record[GROUP_IDX.DEPTH]\n : lastHeaderDepth;\n\n const $visibleTrs = Array.from(this.#sheet.querySelectorAll('.ng-container-body tbody.body tr'));\n const $firstRealTr = $visibleTrs.find(tr => tr.style.display !== 'none');\n const sectionRowIndex = $firstRealTr.dataset.groupId?.split(\"_\").length - 2;\n\n if (lastHeaderDepth === firstItemDepth && lastHeaderItem.groupId !== firstItem.groupId) {\n const trRect = $firstRealTr.getBoundingClientRect();\n const $theadFoot = this.#sheet.querySelector('.ng-container-body thead.foot');\n const distance = $theadFoot.getBoundingClientRect().bottom - trRect.top;\n\n this.#sheet.querySelectorAll('thead.foot tr').forEach(($tr) => {\n if ($tr.sectionRowIndex === sectionRowIndex) {\n $tr.style.transform = `translateY(-${distance}px)`;\n }\n });\n } else {\n this.#sheet.querySelectorAll('thead.foot tr').forEach(($tr) => {\n $tr.style.transform = ``;\n });\n }\n }\n\n this.#sheet.selection.refresh();\n };\n\n\n #bindRowData = ($tr, record, rowid, dataIndex) => {\n const templateLength = this.#sheet.templateLength || 1;\n const subRowIndex = parseInt($tr.dataset.subrow, 10) || 0;\n const matrixRow = (dataIndex * templateLength) + subRowIndex;\n\n $tr.dataset.index = dataIndex;\n $tr.dataset.row = rowid;\n $tr.dataset.matrixRow = matrixRow;\n $tr.data = record;\n\n Array.from($tr.cells).forEach(($cell) => {\n $cell.dataset.index = dataIndex;\n $cell.dataset.row = rowid;\n\n const customComp = Array.from($cell.children).find($el =>\n $el.tagName.toLowerCase().startsWith('cell-') && typeof $el.refresh === 'function'\n );\n\n customComp?.refresh();\n });\n };\n\n #bindGroupRowData = ($tr, allRenderItems, groupRecord, virtualIndex) => {\n\n const templateLength = this.#sheet.templateLength || 1;\n const subRowIndex = parseInt($tr.dataset.subrow, 10) || 0;\n const matrixRow = (virtualIndex * templateLength) + subRowIndex;\n\n //trace.log(matrixRow);\n\n const indices = groupRecord[GROUP_IDX.CHILDREN];\n //const allRecords = this.#host.data.getArray();\n //trace.log(this.#chchedAllRecords, indices);\n const childrenRecords = indices ? indices.map(idx => this.#chchedAllRecords[idx]).filter(Boolean) : [];\n\n $tr.dataset.virtualIndex = virtualIndex;\n $tr.dataset.index = virtualIndex;\n $tr.dataset.row = '';\n $tr.dataset.matrixRow = matrixRow;\n $tr.data = childrenRecords;//groupRecord;\n $tr.dataset.groupId = groupRecord[GROUP_IDX.ID];\n\n Array.from($tr.cells).forEach(($cell) => {\n $cell.dataset.index = virtualIndex;\n $cell.dataset.row = virtualIndex;\n //$cell.dataset.row = virtualIndex;\n\n const customComp = Array.from($cell.children).find($el =>\n $el.tagName.toLowerCase().startsWith('cell-') || typeof $el.refresh === 'function'\n );\n\n\n //if (customComp !== undefined && typeof customComp.refresh === 'function') {\n customComp?.refresh?.();\n //}\n });\n };\n\n initialize = () => {\n\n this.#isGrouped = this.#sheet.sourceTable.querySelector(\"tbody tr[grouping='true']\") ? true : false;\n\n //this.#cachedTemplateHeight = null;\n this.#containerTemplates.clear();\n\n this.#element = {\n scrollTables: this.#sheet.querySelectorAll('.ng-sheet-body table'),\n firstTr: this.#sheet.querySelector('.ng-sheet-body .ng-container-body tbody.body tr'),\n };\n\n ['.ng-container-body', '.ng-container-left', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (!container) return;\n\n const tableEl = container.querySelector('table');\n if (!tableEl) return;\n\n const tbody = tableEl.querySelector('tbody.body');\n if (!tbody) return;\n\n const trs = Array.from(tbody.querySelectorAll('tr'));\n const templateTrs = trs.map(tr => tr.cloneNode(true));\n this.#containerTemplates.set(selector, templateTrs);\n });\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\n if (bodyViewport) {\n this.#sheetHeight = bodyViewport.clientHeight;\n //trace.log(\"this.#sheetHeight\", this.#sheetHeight, this.#sheet);\n\n this.#measureAndCacheHeight();\n this.#renderAllContainers();\n\n this.#handleScroll(bodyViewport.scrollTop, true);\n\n bodyViewport.addEventListener('scroll', (e) => {\n\n this.#sheet.querySelectorAll(\"cell-combo-panel\").forEach($el => {\n $el.classList.remove('active');\n });\n\n\n if (this.#isProgrammaticScroll) return;\n\n const rowHeight = this.#sheet.template.height || 0;\n const totalCount = this.#sheet.view.getArray()?.length || 0;\n const rawTotalVirtualHeight = totalCount * rowHeight;\n\n if (rawTotalVirtualHeight <= bodyViewport.clientHeight) {\n return;\n }\n\n this.#handleScroll(bodyViewport.scrollTop);\n\n this.#sheet.querySelector('nine-table-vscrollbar').refresh();\n\n }, { passive: true });\n }\n };\n\n scrollToDataRow(dataRow, align = 'top', onRendered) {\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords?.length || 0;\n\n const targetRow = Math.max(0, Math.min(dataRow, totalCount - 1));\n let targetScrollTop = 0;\n\n const MAX_BROWSER_HEIGHT = 15000000;\n\n if (this.#isGrouped) {\n const allRenderItems = this.#sheet.view.getArray() || [];\n const templateTrs = Array.from(this.#sheet.sourceTable?.querySelectorAll('tbody.body tr') || []);\n const templateLength = templateTrs.length || 1;\n\n let accumulatedHeight = 0;\n let currentDataCount = 0;\n\n // 1. ์ ์ฒด ๊ฐ์ ๋์ด(rawTotalVirtualHeight)๋ฅผ ๊ตฌํ๊ธฐ ์ํ ์ ์ฒด ๋์ด ์ธก์ ๋๋ targetRow๊น์ง์ ๋์ ๋์ด\n // ๐ก ์ฃผ์: scaleFactor๋ฅผ ์ ํํ ๊ตฌํ๋ ค๋ฉด \"์ ์ฒด ์ฝํ
์ธ ์ ์ด ๋์ด\"๊ฐ ํ์ํ๋ฏ๋ก\n // ์ ์ฒด ๋ทฐ ์์ดํ
๋ค์ ์ด ๋์ด๋ฅผ ๋จผ์ ๊ตฌํ๊ฑฐ๋ ๋์ ํด์ผ ํฉ๋๋ค.\n let totalGroupVirtualHeight = 0;\n let targetAccumulatedHeight = 0;\n\n for (let i = 0; i < targetRow; i++) {\n const item = allRenderItems[i];\n\n let itemTotalHeight = 0;\n for (let subIdx = 0; subIdx < templateLength; subIdx++) {\n const tmplTr = templateTrs[subIdx];\n if (!tmplTr) continue;\n\n const isTrGroup = tmplTr.getAttribute('grouping') === 'true';\n let isVisible = false;\n\n if (item.type === 'group') {\n if (isTrGroup) {\n const depth = item.record[GROUP_IDX.DEPTH];\n if (subIdx === depth) isVisible = true;\n }\n } else {\n if (!isTrGroup) isVisible = true;\n }\n\n if (isVisible) {\n if (isTrGroup) {\n const depth = item.record[GROUP_IDX.DEPTH];\n itemTotalHeight += this.#sheet.template.group.heights[depth];\n } else {\n const dataRowsHeight = this.#sheet.template.height - this.#sheet.template.group.height;\n itemTotalHeight += (this.#sheet.template.height - this.#sheet.template.group.height) / (this.#sheet.template.length - this.#sheet.template.group.length);\n }\n }\n }\n\n if (item.type === 'data') {\n if (currentDataCount === targetRow) {\n targetAccumulatedHeight = totalGroupVirtualHeight;\n }\n currentDataCount++;\n }\n\n totalGroupVirtualHeight += itemTotalHeight;\n }\n\n // ๋ง์ฝ targetRow๊ฐ ๋ง์ง๋ง ์ธ๋ฑ์ค์ด๊ฑฐ๋ ํ๋ค๋ฉด ๋ณด์ \n if (currentDataCount <= targetRow) {\n targetAccumulatedHeight = totalGroupVirtualHeight;\n }\n\n // 2. ์ค์ผ์ผ๋ง ์ ์ฉ (MAX_BROWSER_HEIGHT ์ด๊ณผ ์ ์์ถ)\n const useScaling = totalGroupVirtualHeight > MAX_BROWSER_HEIGHT;\n let scaleFactor = 1;\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / totalGroupVirtualHeight;\n }\n\n targetScrollTop = Math.max(0, targetAccumulatedHeight * scaleFactor);\n\n } else {\n const rowHeight = this.#sheet.template.height;\n const rawTargetScrollTop = targetRow * rowHeight;\n\n const fixedHeight = (this.#sheet.elements.body.thead?.offsetHeight || 0) +\n (this.#sheet.elements.body.tfoot?.offsetHeight || 0) +\n this.#sheet.elements.body.tbody.head.offsetHeight;\n\n const viewHeight = bodyViewport.offsetHeight || 0;\n const rawTotalVirtualHeight = Math.max(totalCount * rowHeight - rowHeight + fixedHeight - viewHeight - rowHeight, 0);\n\n const useScaling = rawTotalVirtualHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawTotalVirtualHeight;\n }\n\n targetScrollTop = rawTargetScrollTop * scaleFactor;\n }\n\n this.#isProgrammaticScroll = true;\n bodyViewport.scrollTop = targetScrollTop;\n this.#handleScroll(targetScrollTop);\n\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n this.#isProgrammaticScroll = false;\n if (typeof onRendered === 'function') onRendered();\n });\n });\n }\n\n\n\n destroy = () => {\n if (this.#resizeObserver) {\n this.#resizeObserver.disconnect();\n this.#resizeObserver = null;\n }\n };\n\n #measureAndCacheHeight = () => {\n this.#updateRowCount();\n return;\n if (!this.#sheet.classList.contains('active')) return;\n\n if (!this.#sheet.sourceTable) return;\n\n const trTemplates = this.#sheet.sourceTable?.querySelectorAll('tbody.body tr');\n\n const $tbody = this.#sheet.querySelector('.ng-container-body tbody.body');\n if (!$tbody) return;\n\n $tbody?.querySelectorAll('tr')?.forEach(tr => tr.remove());\n\n const fragment = document.createDocumentFragment();\n trTemplates.forEach($tr => fragment.appendChild($tr.cloneNode(true)));\n $tbody?.appendChild(fragment);\n\n const renderedTrs = $tbody.querySelectorAll('tr');\n\n renderedTrs.forEach(tr => tr.remove());\n\n this.#updateRowCount();\n };\n\n #updateRowCount = () => {\n\n if (this.#sheet.viewport.innerHeight > 0 && this.#sheet.template.height > 0) {\n const visibleRows = Math.ceil(this.#sheet.viewport.innerHeight / (this.#sheet.template.height - this.#sheet.template.group.height));\n\n let dynamicBuffer = this.#BUFFER_ROW_COUNT;\n if (this.#isGrouped) {\n const groupRows = Math.ceil(this.#sheet.viewport.innerHeight / this.#sheet.template.group.height) + this.#BUFFER_ROW_COUNT;\n dynamicBuffer += (this.#sheet.viewport.group.length * groupRows);\n }\n\n this.#cachedRowCount = visibleRows + dynamicBuffer;\n }\n };\n\n #renderAllContainers = () => {\n\n ['.ng-container-body', '.ng-container-left', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (container && container.querySelector('tbody')) {\n this.#renderRows(container);\n }\n });\n\n this.#syncRowHeights();\n };\n\n #renderRows = (container) => {\n\n let targetFixedType = null;\n if (container.classList.contains('ng-container-left')) targetFixedType = 'left';\n else if (container.classList.contains('ng-container-right')) targetFixedType = 'right';\n\n const templateTrs = Array.from(this.#sheet.sourceTable.querySelectorAll('tbody.body tr')).map(tr => {\n const clonedTr = tr.cloneNode(true);\n\n if (targetFixedType === 'left') {\n clonedTr.querySelectorAll('th,td').forEach($cell => {\n if ($cell.getAttribute('fixed') !== 'left') $cell.remove();\n });\n } else if (targetFixedType === 'right') {\n clonedTr.querySelectorAll('th,td').forEach($cell => {\n if ($cell.getAttribute('fixed') !== 'right') $cell.remove();\n });\n } else {\n clonedTr.querySelectorAll('[fixed=left], [fixed=right]').forEach($cell => {\n $cell.remove();\n });\n }\n\n return clonedTr;\n });\n\n if (templateTrs.length === 0) return;\n\n const targetTbody = container.querySelector('tbody.body');\n\n targetTbody.querySelectorAll(\"tr\").forEach(tr => tr.remove());\n\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < this.#cachedRowCount; i++) {\n templateTrs.forEach(tmpl => fragment.appendChild(tmpl.cloneNode(true)));\n }\n\n targetTbody.appendChild(fragment);\n\n /****\n */\n const fragment2 = document.createDocumentFragment();\n let trIndex = 0;\n\n// ์ ์ฒด grouping tr ๊ฐ์ ๋ฏธ๋ฆฌ ํ์
(์ญ์ z-index ๋ถ์ฌ๋ฅผ ์ํด)\n const groupingTrs = templateTrs.filter(tmpl => tmpl.getAttribute(\"grouping\") === \"true\");\n const totalGroupingCount = groupingTrs.length;\n\n templateTrs.forEach(tmpl => {\n if (tmpl.getAttribute(\"grouping\") === \"true\") {\n const $clonedTr = tmpl.cloneNode(true);\n\n $clonedTr.style.position = 'relative';\n // ๐ก ํต์ฌ: ์๋๋ก ๋ด๋ ค์ฌ์๋ก z-index๊ฐ ์์์ง๋๋ก ์ค์ (๋๋ถ๋ฅ๊ฐ ๊ฐ์ฅ ์!)\n // ์: 3๋จ ๊ตฌ์กฐ๋ฉด ์ฒซ ๋ฒ์งธ ํ z-index: 30, ๋ ๋ฒ์งธ ํ: 20, ์ธ ๋ฒ์งธ ํ: 10\n $clonedTr.style.zIndex = (totalGroupingCount - trIndex) * 10;\n\n fragment2.appendChild($clonedTr);\n trIndex++;\n }\n });\n\n const thead = container.querySelector('thead.foot');\n if (thead) {\n thead.querySelectorAll(\"tr\").forEach(tr => tr.remove());\n thead.appendChild(fragment2);\n }\n\n\n if (container.classList.contains('ng-container-body')) {\n this.#element.firstTr = targetTbody.querySelector('tr');\n }\n\n targetTbody.trs = Array.from(container.querySelectorAll('tbody.body tr'));\n };\n\n\n\n #syncRowHeights = () => {\n const leftTable = this.#sheet.querySelector('.ng-sheet-body .ng-container-left table');\n const bodyTable = this.#sheet.querySelector('.ng-sheet-body .ng-container-body table');\n const rightTable = this.#sheet.querySelector('.ng-sheet-body .ng-container-right table');\n\n if (bodyTable) {\n const leftRows = leftTable ? Array.from(leftTable.querySelectorAll('tbody tr')) : [];\n const bodyRows = Array.from(bodyTable.querySelectorAll('tbody tr'));\n const rightRows = rightTable ? Array.from(rightTable.querySelectorAll('tbody tr')) : [];\n\n const maxRows = Math.max(leftRows.length, bodyRows.length, rightRows.length);\n\n for (let i = 0; i < maxRows; i++) {\n const heights = [\n leftRows[i]?.getBoundingClientRect().height || 0,\n bodyRows[i]?.getBoundingClientRect().height || 0,\n rightRows[i]?.getBoundingClientRect().height || 0\n ];\n const maxHeight = Math.max(...heights);\n\n if (maxHeight > 0) {\n if (leftRows[i]) leftRows[i].style.height = `${maxHeight}px`;\n if (bodyRows[i]) bodyRows[i].style.height = `${maxHeight}px`;\n if (rightRows[i]) rightRows[i].style.height = `${maxHeight}px`;\n }\n }\n }\n };\n\n #initResizeObserver = () => {\n\n if (!this.#sheet || !(this.#sheet instanceof HTMLElement)) return;\n\n this.#resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n\n const sheetEl = entry.target;\n if (!sheetEl.classList.contains('active')) continue;\n\n const height = entry.contentRect.height;\n const width = entry.contentRect.width;\n\n if (width > 0 && this.#sheet.isAutoFitCol) {\n this.#sheet.autoFit(true);\n }\n\n if (height > 0 && this.#sheetHeight !== height) {\n this.#sheetHeight = height;\n //trace.log(\"this.#sheetHeight\", this.#sheetHeight);\n this.#updateRowCount();\n\n if (this.#sheet.template.height !== null) {\n this.#renderAllContainers();\n this.refresh();\n }\n }\n }\n });\n\n this.#resizeObserver.observe(this.#sheet);\n };\n}","import { trace } from \"@nopeer\";\n\nexport const COLLAPSED_WIDTH = 16;\n\nexport class TableCompiler {\n\n static compile($srcTable) {\n\n const $table = $srcTable.cloneNode(true);\n\n TableCompiler.resetColIndex($table, $table.querySelectorAll('thead tr'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr[grouping=\"true\"]'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr:not([grouping=\"true\"])'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tfoot tr'));\n\n TableCompiler.#syncColAttributes($table);\n\n return $table;\n }\n\n static recompile($table) {\n\n\n TableCompiler.resetColIndex($table, $table.querySelectorAll('thead tr'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr[grouping=\"true\"]'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr:not([grouping=\"true\"])'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tfoot tr'));\n\n TableCompiler.#syncColAttributes($table);\n\n return $table;\n }\n\n static #syncColAttributes($table) {\n\n $table.querySelectorAll('colgroup col').forEach(($col, i) => {\n $col.setAttribute('data-col', i);\n const fixed = $col.getAttribute('fixed');\n\n $table.querySelectorAll(`[data-col=\"${i}\"]`).forEach($el => {\n fixed ? $el.setAttribute('fixed', fixed) : $el.removeAttribute('fixed');\n });\n });\n }\n\n static resetColIndex($table, trs) {\n\n const cols = $table.querySelectorAll('colgroup col');\n const grid = Array.from({ length: trs.length }, () => Array(cols.length).fill(null));\n\n trs.forEach(($tr, index) => {\n\n $tr.dataset.subrow = index;\n\n let colIndex = 0;\n\n $tr.querySelectorAll('th, td').forEach($cell => {\n\n while (colIndex < cols.length && grid[index][colIndex] !== null) {\n colIndex++;\n }\n\n $cell.dataset.col = colIndex;\n\n const rowSpan = $cell.rowSpan || 1;\n const colSpan = $cell.colSpan || 1;\n\n for (let r = 0; r < rowSpan; r++) {\n for (let c = 0; c < colSpan; c++) {\n if (index + r < trs.length && colIndex + c < cols.length) {\n grid[index + r][colIndex + c] = $cell;\n }\n }\n }\n\n colIndex += colSpan;\n });\n });\n }\n\n}","import { trace } from \"@nopeer\";\n\nexport class CellSelection {\n\t#sheet;\n\t#host;\n\t#range = { startRow: -1, startCol: -1, endRow: -1, endCol: -1 };\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tthis.#initEvents();\n\t}\n\n\t#getMatrixRow(tr) {\n\t\tif (!tr) return { dataRow: -1, subRowIndex: -1, matrixRow: -1 };\n\n\t\tconst dataRow = parseInt(tr.dataset.index, 10);\n\t\tif (isNaN(dataRow)) return { dataRow: -1, subRowIndex: -1, matrixRow: -1 };\n\n\t\tconst tbody = tr.closest('tbody');\n\t\tconst trs = Array.from(tbody.querySelectorAll('tr'));\n\n\t\tconst sameGroupTrs = trs.filter(t => parseInt(t.dataset.index, 10) === dataRow);\n\t\tconst subRowIndex = sameGroupTrs.indexOf(tr);\n\n\t\t//const matrixRow = (dataRow * templateLength) + (subRowIndex >= 0 ? subRowIndex : (tr.sectionRowIndex % templateLength));\n\t\t//const matrixRow = (dataRow * this.#sheet.template.length) + subRowIndex;//(subRowIndex >= 0 ? subRowIndex : (tr.sectionRowIndex % this.#sheet.template.length));\n\t\tconst matrixRow = parseInt(tr.dataset.matrixRow, 10);\n\n\t\treturn { dataRow, subRowIndex, matrixRow };\n\t}\n\n\tsetFocus(matrixRow, col) {\n\t\tthis.#sheet.querySelectorAll(`tr.selected-start`).forEach($tr => {\n\t\t\t$tr.classList.remove(\"selected-start\");\n\t\t\t$tr.querySelectorAll(`td.selected-start`).forEach($td => {\n\t\t\t\t$td.classList.remove(\"selected-start\");\n\t\t\t});\n\t\t});\n\n\t\tconst $td = this.#sheet.querySelector(`.ng-sheet-body-content tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${col}\"]`);\n\t\tif (!$td) return;\n\n\t\t$td.classList.add(\"selected-start\");\n\t\t$td.closest('tr')?.classList.add(\"selected-start\");\n\t}\n\n\tsetRange(startRow, startCol, endRow, endCol) {\n\t\tlet r1 = Math.min(startRow, endRow);\n\t\tlet r2 = Math.max(startRow, endRow);\n\t\tlet c1 = Math.min(startCol, endCol);\n\t\tlet c2 = Math.max(startCol, endCol);\n\n\n\n\t\tif (this.#host.tagName === \"NINE-TABLE-SIMPLE\") {\n\t\t\tc1 = 1;\n\t\t\tc2 = 10;\n\t\t}\n\n\n\n\t\tconst containers = this.#sheet.querySelectorAll('.ng-container-left, .ng-container-body, .ng-container-right');\n\n\t\tlet expanded = true;\n\t\tlet loopCount = 0;\n\n\t\twhile (expanded && loopCount < 5) {\n\t\t\texpanded = false;\n\t\t\tloopCount++;\n\n\t\t\tcontainers.forEach(container => {\n\n\t\t\t\tconst visibleTrs = Array.from(container.querySelectorAll('tbody tr')).filter(tr => {\n\t\t\t\t\treturn tr.style.display !== 'none'; // ํน์ tr.offsetHeight > 0 ์ฒดํฌ\n\t\t\t\t});\n\n\t\t\t\tvisibleTrs.forEach(tr => {\n\t\t\t\t\tconst { matrixRow } = this.#getMatrixRow(tr);\n\t\t\t\t\tif (matrixRow < 0) return;\n\n\t\t\t\t\ttr.querySelectorAll('td, th').forEach(cell => {\n\t\t\t\t\t\tconst col = parseInt(cell.dataset.col, 10);\n\t\t\t\t\t\tif (isNaN(col)) return;\n\n\t\t\t\t\t\tconst colEl = this.#sheet.querySelector(`col[data-col=\"${col}\"]`);\n\t\t\t\t\t\tif (colEl.style.display !== 'none') {\n\t\t\t\t\t\t\tconst rowSpan = parseInt(cell.rowSpan || 1, 10);\n\t\t\t\t\t\t\tconst colSpan = parseInt(cell.colSpan || 1, 10);\n\n\t\t\t\t\t\t\tconst cellEndRow = matrixRow + rowSpan - 1;\n\t\t\t\t\t\t\tconst cellEndCol = col + colSpan - 1;\n\n\t\t\t\t\t\t\tconst isIntersecting = cellEndRow >= r1 && matrixRow <= r2 && cellEndCol >= c1 && col <= c2;\n\n\t\t\t\t\t\t\tif (isIntersecting) {\n\t\t\t\t\t\t\t\tconst nsR = Math.min(r1, matrixRow);\n\t\t\t\t\t\t\t\tconst neR = Math.max(r2, cellEndRow);\n\t\t\t\t\t\t\t\tconst nsC = Math.min(c1, col);\n\t\t\t\t\t\t\t\tconst neC = Math.max(c2, cellEndCol);\n\n\t\t\t\t\t\t\t\tif (nsR !== r1 || neR !== r2 || nsC !== c1 || neC !== c2) {\n\t\t\t\t\t\t\t\t\tr1 = nsR; r2 = neR; c1 = nsC; c2 = neC;\n\t\t\t\t\t\t\t\t\texpanded = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tconst sanitize = (val) => (!Number.isFinite(val) ? -1 : val);\n\n\t\tthis.#range = {\n\t\t\tstartRow: sanitize(r1),\n\t\t\tstartCol: sanitize(c1),\n\t\t\tendRow: sanitize(r2),\n\t\t\tendCol: sanitize(c2)\n\t\t};\n\n\n\n\t\t//trace.log(this.#range);\n\n\t\tthis.render();\n\t}\n\n\tclear = () => {\n\t\tthis.#range = { startRow: -1, startCol: -1, endRow: -1, endCol: -1 };\n\t};\n\n\tget minRow() {\n\t\treturn this.#range.startRow;\n\t};\n\tget maxRow() {\n\t\treturn this.#range.endRow;\n\t};\n\tget minCol() {\n\t\treturn this.#range.startCol;\n\t};\n\tget maxCol() {\n\t\treturn this.#range.endCol;\n\t};\n\n\trefresh = () => {\n\t\tthis.render();\n\t}\n\n\trender = () => {\n\t\tconst { startRow, startCol, endRow, endCol } = this.#range;\n\n\t\tconst containers = this.#sheet.querySelectorAll(\n\t\t\t'.ng-container-left, .ng-container-body, .ng-container-right'\n\t\t);\n\n\t\tcontainers.forEach(container => {\n\t\t\tcontainer.querySelectorAll('.selected, .selected-top, .selected-bottom, .selected-left, .selected-right, .selected-start').forEach(el => {\n\t\t\t\tel.classList.remove('selected', 'selected-top', 'selected-bottom', 'selected-left', 'selected-right', 'selected-start');\n\t\t\t});\n\n\t\t\tcontainer.querySelectorAll('tr.selected-start').forEach(tr => {\n\t\t\t\ttr.classList.remove('selected-start');\n\t\t\t});\n\t\t});\n\n\n\t\tif (startRow < 0 || startCol < 0) return;\n\n\t\tcontainers.forEach((container) => {\n\t\t\tconst visibleTrs = Array.from(container.querySelectorAll('tbody tr')).filter(tr => {\n\t\t\t\treturn tr.style.display !== 'none';\n\t\t\t});\n\n\t\t\tvisibleTrs.forEach(tr => {\n\t\t\t\tconst { matrixRow } = this.#getMatrixRow(tr);\n\n\t\t\t\t//trace.log(tr.dataset.matrixRow);\n\n\t\t\t\tif (matrixRow < 0) return;\n\n\t\t\t\t//trace.log(matrixRow, this.#range, startRow, endRow);\n\n\t\t\t\tif (matrixRow >= startRow && matrixRow <= endRow) {\n\n\n\t\t\t\t\tcontainer.querySelectorAll(`tbody tr[data-index=\"${tr.dataset.index}\"]`).forEach(tr => {\n\t\t\t\t\t\ttr.classList.add('selected');\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t//trace.log(this.#sheet.view);\n\n\n\t\t\t\ttr.querySelectorAll('td, th').forEach(cell => {\n\t\t\t\t\tconst col = parseInt(cell.dataset.col, 10);\n\t\t\t\t\tif (isNaN(col)) return;\n\n\t\t\t\t\tconst rowSpan = parseInt(cell.rowSpan || 1, 10);\n\t\t\t\t\tconst colSpan = parseInt(cell.colSpan || 1, 10);\n\n\t\t\t\t\tconst cellEndRow = matrixRow + rowSpan - 1;\n\t\t\t\t\tconst cellEndCol = col + colSpan - 1;\n\n\t\t\t\t\tconst isSelected = cellEndRow >= startRow && matrixRow <= endRow && cellEndCol >= startCol && col <= endCol;\n\t\t\t\t\tif (!isSelected) return;\n\n\t\t\t\t\tcell.classList.add('selected');\n\n\t\t\t\t\tif (matrixRow <= startRow) cell.classList.add('selected-top');\n\t\t\t\t\tif (cellEndRow >= endRow) cell.classList.add('selected-bottom');\n\t\t\t\t\tif (col <= startCol) cell.classList.add('selected-left');\n\t\t\t\t\tif (cellEndCol >= endCol) cell.classList.add('selected-right');\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\t#lastMatrixRow;\n\t#lastCol;\n\t#startRow;\n\t#startCol;\n\t//#dragStart;\n\n\t#getCellFromPoint = (clientX, clientY) => {\n\t\tconst root = this.#sheet.getRootNode();\n\t\tif (root && typeof root.elementsFromPoint === 'function') {\n\t\t\tconst elements = root.elementsFromPoint(clientX, clientY);\n\t\t\tfor (const el of elements) {\n\t\t\t\tconst c = el.closest('td, th');\n\t\t\t\tif (c && this.#sheet.contains(c) && c.dataset.row !== undefined) {\n\t\t\t\t\treturn c;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst allCells = this.#sheet.querySelectorAll('.ng-sheet-body-content tbody tr td, .ng-sheet-body-content tbody tr:not(.nodata) th');\n\t\tfor (const c of allCells) {\n\t\t\tconst rect = c.getBoundingClientRect();\n\t\t\tif (\n\t\t\t\tclientX >= rect.left &&\n\t\t\t\tclientX <= rect.right &&\n\t\t\t\tclientY >= rect.top &&\n\t\t\t\tclientY <= rect.bottom\n\t\t\t) {\n\t\t\t\treturn c;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t};\n\n\t#onMouseMove = (moveEvent) => {\n\n\t\t//if (!this.#dragStart) return;\n\n\t\tconst targetCell = this.#getCellFromPoint(moveEvent.clientX, moveEvent.clientY);\n\t\tif (!targetCell) return;\n\t\tif (targetCell.dataset.row === undefined || targetCell.dataset.col === undefined) return;\n\n\t\tconst targetTr = targetCell.closest('tr');\n\t\tconst { matrixRow: endRow } = this.#getMatrixRow(targetTr);\n\t\tconst endCol = parseInt(targetCell.dataset.col, 10);\n\n\t\tif (endRow < 0) return;\n\t\tif (this.#lastMatrixRow === endRow && this.#lastCol === endCol) return;\n\n\t\t//trace.log(moveEvent);\n\n\t\tthis.#lastMatrixRow = endRow;\n\t\tthis.#lastCol = endCol;\n\n\t\t//trace.log(this.#startRow, this.#startCol, endRow, endCol);\n\n\t\tthis.setRange(this.#startRow, this.#startCol, endRow, endCol);\n\t};\n\n\t#onMouseUp = () => {\n\t\t//this.#dragStart = false;\n\n\t\tdocument.removeEventListener('mousemove', this.#onMouseMove);\n\n\t\t//this.#sheet.style.userSelect = '';\n\t\t//this.#sheet.style.webkitUserSelect = '';\n\n\n\t\t//document.removeEventListener('mouseup', this.#onMouseUp);\n\t};\n\n\t#initEvents() {\n\t\tconst mainZone = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!mainZone) {\n\t\t\treturn;\n\t\t}\n\n\t\tdocument.addEventListener('mouseup', this.#onMouseUp);\n\n\t\tmainZone.addEventListener('mousedown', (e) => {\n\n\t\t\tif (e.button !== 0) return;\n\n\t\t\t/**\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.#dragStart = true;\n\t\t\t}, 100);\n\t\t\t*/\n\n\t\t\tconst cell = e.target.closest('td, th');\n\t\t\tif (!cell) return;\n\t\t\tif (cell.dataset.row === undefined || cell.dataset.col === undefined) return;\n\n\t\t\tthis.#sheet.style.userSelect = 'none';\n\t\t\tthis.#sheet.style.webkitUserSelect = 'none';\n\n\t\t\tconst tr = cell.closest('tr');\n\t\t\tconst { matrixRow: startRow } = this.#getMatrixRow(tr);\n\t\t\tconst startCol = parseInt(cell.dataset.col, 10);\n\n\t\t\tthis.#startRow = startRow;\n\t\t\tthis.#startCol = startCol;\n\n\t\t\tif (startRow < 0) {\n\t\t\t\tthis.#sheet.style.userSelect = '';\n\t\t\t\tthis.#sheet.style.webkitUserSelect = '';\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.setFocus(startRow, startCol);\n\t\t\tthis.setRange(startRow, startCol, startRow, startCol);\n\n\t\t\tthis.#lastMatrixRow = startRow;\n\t\t\tthis.#lastCol = startCol;\n\n\t\t\t// ๋๋๊ทธ๊ฐ ์์๋ ๋๋ง document์ move/up ๋ฆฌ์ค๋๋ฅผ ๋ถ์ฌ ๋ญ๋น๋ฅผ ์ค์ด๊ณ ํ์คํ๊ฒ ์ถ์ \n\t\t\tdocument.addEventListener('mousemove', this.#onMouseMove);\n\t\t});\n\t}\n}","import { trace } from \"@nopeer\";\n\nexport class CellNavigation {\n\t#sheet;\n\t#host;\n\n\t#currentCell = null;\n\t#currentTr = null;\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tthis.#initEvents();\n\t}\n\n\tget currentCell() {\n\t\treturn this.#currentCell;\n\t}\n\n\tset currentCell(cell) {\n\t\tif (!cell) return;\n\n\t\tthis.#currentCell = cell;\n\t\tcell.focus({ preventScroll: true });\n\n\t\tthis.#currentTr = cell.closest(\"tr\");\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tthis.#sheet.selection.setFocus(matrixRow, this.#currentCell.dataset.col);\n\t}\n\n\n\t#moveCellH = (e, cell) => {\n\n\t\tif (!cell) return;\n\n\t\tswitch (e.code) {\n\t\t\tcase \"Tab\":\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\tif (!this.#isCellLeftVisible(cell)) {\n\t\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (!this.#isCellRightVisible(cell)) {\n\t\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tif (!this.#isCellRightVisible(cell) || !this.#isCellLeftVisible(cell)) {\n\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowLeft\":\n\t\t\t\tif (!this.#isCellLeftVisible(cell)) {\n\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.currentCell = cell;\n\t\tthis.#sheet.selection.setRange(this.#currentTr.dataset.matrixRow, cell.dataset.col, this.#currentTr.dataset.matrixRow, cell.dataset.col);\n\t};\n\n\t#moveCellV = (e, cell) => {\n\t\t// 1. ๋ง์ฝ ๋ค์ ์ด๋ํ ์
์ด ์ด๋ฏธ DOM์ ์กด์ฌํ๋ค๋ฉด\n\t\tif (cell) {\n\t\t\tlet isVisible = false;\n\t\t\tswitch (e.code) {\n\t\t\t\tcase \"Enter\":\n\t\t\t\tcase \"ArrowDown\":\n\t\t\t\t\tif (this.#isCellBelowVisible(cell)) isVisible = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowUp\":\n\t\t\t\t\tif (this.#isCellAboveVisible(cell)) isVisible = true;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// ํ๋ฉด ์ ์์ญ์ ์๋ค๋ฉด ๊ฐ๋ณ๊ฒ ํฌ์ปค์ค ๋ฐ ์ ํ ๋ฒ์ ์ง์ ํ ๋ฆฌํด\n\t\t\tif (isVisible) {\n\t\t\t\tthis.currentCell = cell;\n\t\t\t\tthis.#sheet.selection.setRange(this.#currentTr.dataset.matrixRow, cell.dataset.col, this.#currentTr.dataset.matrixRow, cell.dataset.col);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// 2. ์
์ด ํ๋ฉด์ ์๊ฑฐ๋ ์๋ ค ์๋ค๋ฉด(๋ทฐํฌํธ ๋ฐ),\n\t\t// ํ์ฌ ์
(๋๋ ๋์ ์
)๊ณผ .ng-sheet-body์ ์๋์ ์์น(top) ์ฐจ์ด๋ฅผ ์ด์ฉํด scrollTop์ ์ง์ ์กฐ์ \n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!bodyViewport) return;\n\n\t\t// ๋ง์ฝ nextCell์ด ์กด์ฌํ๋ฉด ๊ทธ ์
์ ๊ธฐ์ค์ผ๋ก, ์๋๋ฉด ํ์ฌ ์
๊ธฐ์ค์ผ๋ก ๊ณ์ฐ\n\t\tconst targetCell = cell || this.#currentCell;\n\t\tif (!targetCell) return;\n\n\t\tconst viewportRect = bodyViewport.getBoundingClientRect();\n\t\tconst cellRect = targetCell.getBoundingClientRect();\n\t\tconst theadHeight = bodyViewport.querySelector('thead')?.offsetHeight || 0;\n\n\t\tlet delta = 0;\n\n\t\tswitch (e.code) {\n\t\t\tcase \"Enter\":\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tdelta = (cellRect.top - cellRect.height) - (viewportRect.top + theadHeight);\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tdelta = (cellRect.bottom + cellRect.height) - (viewportRect.bottom);\n\t\t\t\tbreak;\n\t\t}\n\n\t\tconst targetMatrixRow = cell ? parseInt(cell.closest(\"tr\")?.dataset.matrixRow, 10) : parseInt(this.#currentTr.dataset.matrixRow, 10);\n\t\tconst targetCol = cell ? parseInt(cell.dataset.col, 10) : parseInt(this.#currentCell.dataset.col, 10);\n\n\t\tif (delta !== 0) {\n\t\t\tbodyViewport.scrollTop += delta;\n\t\t}\n\n\t\tsetTimeout(() => {\n\t\t\tconst foundCell = this.#findCell(targetMatrixRow, targetCol);\n\t\t\tif (foundCell) {\n\t\t\t\tthis.currentCell = foundCell;\n\t\t\t\tconst targetTr = foundCell.closest(\"tr\");\n\t\t\t\tif (targetTr) {\n\t\t\t\t\tthis.#sheet.selection.setRange(targetTr.dataset.matrixRow, foundCell.dataset.col, targetTr.dataset.matrixRow, foundCell.dataset.col);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tmoveCell = (e) => {\n\n\t\tif (e.target.tagName === \"INPUT\") {\n\t\t\tif ([\"text\"].includes(e.target.type)) {\n\t\t\t\tif ([\"ArrowLeft\",\"ArrowRight\",\"Home\",\"End\"].includes(e.code)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ([\"date\",\"datetime-local\",\"time\",\"week\",\"month\"].includes(e.target.type)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.#currentCell || !this.#currentTr) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet nextCell;\n\t\tswitch (e.code) {\n\t\t\tcase \"Tab\":\n\t\t\t\tnextCell = e.shiftKey ? this.#getPreviousCell() : this.#getNextCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tnextCell = this.#getNextCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowLeft\":\n\t\t\t\tnextCell = this.#getPreviousCell();\n\t\t\t\tbreak;\n\t\t\tcase \"Enter\":\n\t\t\t\tnextCell = e.shiftKey ? this.#getUpCell() : this.#getDownCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tnextCell = this.#getDownCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tnextCell = this.#getUpCell();\n\t\t\t\tbreak;\n\t\t}\n\n\t\te.preventDefault();\n\n\t\tif ([\"ArrowLeft\",\"ArrowRight\",\"Tab\"].includes(e.code)) {\n\t\t\tthis.#moveCellH(e, nextCell);\n\t\t}\n\t\telse if ([\"Enter\",\"ArrowUp\",\"ArrowDown\"].includes(e.code)) {\n\t\t\tthis.#moveCellV(e, nextCell);\n\t\t}\n\t}\n\n\t#getNextCell = () => {\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst colSpan = parseInt(this.#currentCell.colSpan, 10) || 1;\n\t\tconst dataIndex = parseInt(this.#currentTr.dataset.index, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tconst nextCol = col + colSpan;\n\n\t\tlet nextCell = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${nextCol}\"]`);\n\t\tif (!nextCell) {\n\t\t\tnextCell = this.#sheet.querySelector(`tbody tr[data-index=\"${dataIndex}\"] td[data-col=\"${nextCol}\"]`);\n\t\t}\n\n\t\treturn nextCell;\n\t}\n\n\t#getPreviousCell = () => {\n\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst dataIndex = parseInt(this.#currentTr.dataset.index, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tlet nextCell;\n\t\tfor (let i = col - 1; i >= 0; i--) {\n\t\t\tnextCell = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${i}\"]`);\n\t\t\tif (!nextCell) {\n\t\t\t\tnextCell = this.#sheet.querySelector(`tbody tr[data-index=\"${dataIndex}\"] td[data-col=\"${i}\"]`);\n\t\t\t}\n\n\t\t\tif (nextCell) break;\n\t\t}\n\n\t\treturn nextCell;\n\t}\n\n\n\n\t#findCell = (matrixRow, col) => {\n\n\t\tconst $tr = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"]`);\n\n\t\tif (!$tr) return;\n\n\n\n\t\tconst dataIndex = parseInt($tr.dataset.index, 10);\n\n\n\n\t\tlet targetCell = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${col}\"]`);\n\t\tif (!targetCell) {\n\t\t\tthis.#sheet.querySelectorAll(`tbody tr[data-matrix-row=\"${matrixRow}\"] td`).forEach($cell => {\n\t\t\t\tconst cellCol = parseInt($cell.dataset.col, 10);\n\t\t\t\tconst colSpan = parseInt($cell.colSpan, 10) || 1;\n\n\t\t\t\tif (col >= cellCol && col < cellCol + colSpan) {\n\t\t\t\t\ttargetCell = $cell;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (!targetCell) {\n\t\t\t\ttargetCell = this.#sheet.querySelector(`tbody tr[data-index=\"${dataIndex}\"] td[data-col=\"${col}\"]`);\n\n\t\t\t\tif (!targetCell) {\n\t\t\t\t\tthis.#sheet.querySelectorAll(`tbody tr[data-index=\"${dataIndex}\"] td`).forEach($cell => {\n\t\t\t\t\t\tconst cellCol = parseInt($cell.dataset.col, 10);\n\t\t\t\t\t\tconst colSpan = parseInt($cell.colSpan, 10) || 1;\n\n\t\t\t\t\t\tif (col >= cellCol && col < cellCol + colSpan) {\n\t\t\t\t\t\t\ttargetCell = $cell;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn targetCell;\n\t}\n\n\t#getUpCell = () => {\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tlet $nextCell = null\n\t\tfor (let i = 0; i < 100; i++) {\n\t\t\t$nextCell = this.#findCell(matrixRow - 1 - i, col);\n\t\t\tif ($nextCell) break;\n\t\t}\n\n\t\treturn $nextCell;// this.#findCell(matrixRow + rowSpan, col);\n\n\t\t//return this.#findCell(matrixRow - 1, col);\n\t}\n\n\t#getDownCell = () => {\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\t\tconst rowSpan = parseInt(this.#currentCell.rowSpan, 10) || 1;\n\n\t\tlet $nextCell = null\n\t\tfor (let i = 0; i < 100; i++) {\n\t\t\t$nextCell = this.#findCell(matrixRow + rowSpan + i, col);\n\t\t\tif ($nextCell) break;\n\t\t}\n\n\t\treturn $nextCell;// this.#findCell(matrixRow + rowSpan, col);\n\t}\n\n\t// 1. ์์ชฝ ์๋ฆผ ์ฒดํฌ (๊ธฐ์ค: bodyViewport)\n\t#isCellAboveVisible = (cell) => {\n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!bodyViewport || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport.getBoundingClientRect();\n\t\tconst theadHeight = bodyViewport.querySelector('thead')?.offsetHeight || 0;\n\n\t\t// ์
์ ์๋จ์ด ํค๋ ์๋์ชฝ๋ณด๋ค ์์ ์์ผ๋ฉด ์๋ฆฐ(์ ๋ณด์ด๋) ์ํ\n\t\treturn cellRect.top >= (viewportRect.top + theadHeight);\n\t}\n\n\t// 2. ์๋์ชฝ ์๋ฆผ ์ฒดํฌ (๊ธฐ์ค: bodyViewport)\n\t#isCellBelowVisible = (cell) => {\n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!bodyViewport || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport.getBoundingClientRect();\n\n\t\t// ์
์ ํ๋จ์ด ๋ทฐํฌํธ ํ๋จ๋ณด๋ค ์๋์ ์์ผ๋ฉด ์๋ฆฐ ์ํ\n\t\treturn cellRect.bottom <= viewportRect.bottom;\n\t}\n\n\t// 3. ์ผ์ชฝ ์๋ฆผ ์ฒดํฌ (๊ธฐ์ค: bodyViewport2)\n\t#isCellLeftVisible = (cell) => {\n\t\tconst bodyViewport2 = this.#sheet.querySelector('.ng-container-body'); // ๋๋ ์ข์ฐ ์คํฌ๋กค์ ๋ด๋นํ๋ ๋ทฐํฌํธ\n\t\tif (!bodyViewport2 || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport2.getBoundingClientRect();\n\n\t\t// ์
์ ์ข์ธก์ด ๋ทฐํฌํธ ์ข์ธก๋ณด๋ค ์ผ์ชฝ์ ์์ผ๋ฉด ์๋ฆฐ ์ํ\n\t\treturn cellRect.left >= viewportRect.left;\n\t}\n\n\t// 4. ์ค๋ฅธ์ชฝ ์๋ฆผ ์ฒดํฌ (๊ธฐ์ค: bodyViewport2)\n\t#isCellRightVisible = (cell) => {\n\t\tconst bodyViewport2 = this.#sheet.querySelector('.ng-container-body');\n\t\tif (!bodyViewport2 || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport2.getBoundingClientRect();\n\n\t\t// ์
์ ์ฐ์ธก์ด ๋ทฐํฌํธ ์ฐ์ธก๋ณด๋ค ์ค๋ฅธ์ชฝ์ ์์ผ๋ฉด ์๋ฆฐ ์ํ\n\t\treturn cellRect.right <= viewportRect.right;\n\t}\n\n\t// ๐ก ํ์ํ๋ค๋ฉด ์ด 4๊ฐ๋ฅผ ์กฐํฉํด์ ์ ์ฒด ๊ฐ์์ฑ์ ํ๋จํ๋ ํตํฉ ํจ์๋ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.\n\t#isCellVisible = (cell) => {\n\t\treturn this.#isCellAboveVisible(cell) &&\n\t\t\tthis.#isCellBelowVisible(cell) &&\n\t\t\tthis.#isCellLeftVisible(cell) &&\n\t\t\tthis.#isCellRightVisible(cell);\n\t}\n\n\t#getVisibleRowCount = () => {\n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tconst viewportHeight = bodyViewport.clientHeight - (bodyViewport.querySelector('thead')?.offsetHeight || 0);\n\t\tconst rowHeight = this.#sheet.rowManager.getRowHeight();\n\n\t\t// ๋ทฐํฌํธ ๋์ด์ ๋ค์ด์ค๋ ํ ๊ฐ์ ๊ณ์ฐ (์์์ ๋ฒ๋ฆผ)\n\t\treturn Math.max(1, Math.floor(viewportHeight / rowHeight));\n\t}\n\n\t#initEvents() {\n\t\tthis.#sheet.addEventListener('mousedown', (e) => {\n\t\t\tif (e.button !== 0) return;\n\t\t\tconst cell = e.target.closest('td, th');\n\t\t\tif (!cell) return;\n\t\t\tif (cell.dataset.index === undefined || cell.dataset.col === undefined) return;\n\n\t\t\tif (cell.querySelector(\"cell-row-indicator\")) {\n\t\t\t\tthis.#sheet.row.focus(cell.dataset.index);\n\t\t\t} else {\n\t\t\t\tthis.currentCell = cell;\n\t\t\t}\n\t\t});\n\n\t\tthis.#sheet.addEventListener('keydown', (e) => {\n\n\t\t\tconst cell = e.target.closest('td,th');\n\t\t\tif (!cell || !this.#sheet.contains(cell)) return;\n\n\t\t\tif (this.#host.tagName === 'NINE-TABLE-SIMPLE') {\n\t\t\t\tif ([\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].includes(e.code)) {\n\t\t\t\t\tthis.moveCell(e);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ([\"Enter\", \"Tab\", \"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].includes(e.code)) {\n\t\t\t\t\tthis.moveCell(e);\n\t\t\t\t} else if ([\"Space\"].includes(e.code)) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}","// ui/col/ColResizer.js\nimport { trace } from \"@nopeer\";\nimport { COLLAPSED_WIDTH } from \"@/layout/core/TableCompiler.js\";\n\nconst RESIZE_OFFSET = 2; // ๐ฏ ๋ฆฌ์ฌ์ด์ฆ ๊ฐ์ง ์์ญ ์คํ์
์ ์๋จ์ผ๋ก ์ถ์ถ\n\nexport class ColResizer {\n #sheet;\n #host;\n #panel;\n #tooltip;\n\n #targetColIndex = null;\n #nextColIndex = null;\n #targetContainerType = null;\n #targetCell = null;\n #startX = 0;\n #startColWidth = 0;\n #nextColStartWidth = 0;\n #startCellWidth = 0;\n #startLeft = 0;\n\n constructor(sheet) {\n this.#sheet = sheet;\n this.#host = sheet.getRootNode().host;\n this.#panel = this.#sheet.querySelector('nine-table-col-resizer-panel');\n\n this.#tooltip = this.#panel.querySelector('.resizer-overlay');\n this.bindEvents();\n }\n\n destroy() {\n this.#sheet.removeEventListener('pointermove', this.#onPointerMove);\n this.#sheet.removeEventListener('pointerdown', this.#onPointerDown);\n this.#sheet.removeEventListener('dblclick', this.#onDblClick);\n }\n\n refreshLayout(containerType = 'body') {\n const containers = Array.from(this.#sheet.querySelectorAll(`.ng-container-${containerType}`));\n if (containers.length === 0) return;\n\n const isFixedContainer = containerType === 'left' || containerType === 'right';\n const isAutoFit = !isFixedContainer && (\n this.#sheet.isAutoFitCol ||\n containers[0].querySelector('table')?.getAttribute('auto-fit-col') === 'true'\n );\n\n if (!isAutoFit) {\n\n const firstColgroup = containers[0].querySelector('table colgroup');\n if (!firstColgroup) return;\n\n let totalWidth = 0;\n const colWidths = {};\n\n Array.from(firstColgroup.querySelectorAll('col')).forEach(col => {\n const colIdx = col.getAttribute('data-col');\n const w = parseInt(col.getAttribute('width'), 10);\n if (!isNaN(w)) {\n colWidths[colIdx] = w;\n totalWidth += w;\n }\n });\n\n containers.forEach(container => {\n const tables = container.querySelectorAll('table');\n\n if (containerType === 'body') {\n tables.forEach(tbl => {\n tbl.style.width = `${totalWidth}px`;\n //tbl.style.minWidth = `${totalWidth}px`;\n });\n } else {\n container.style.flex = `0 0 ${totalWidth}px`;\n container.style.width = `${totalWidth}px`;\n container.style.minWidth = `${totalWidth}px`;\n container.style.maxWidth = `${totalWidth}px`;\n\n tables.forEach(tbl => {\n tbl.style.width = `${totalWidth}px`;\n tbl.style.minWidth = `${totalWidth}px`;\n tbl.style.maxWidth = `${totalWidth}px`;\n\n Object.entries(colWidths).forEach(([colIdx, w]) => {\n tbl.querySelectorAll(`th[data-col=\"${colIdx}\"], td[data-col=\"${colIdx}\"]`).forEach(cell => {\n //cell.style.width = `${w}px`;\n //cell.style.minWidth = `${w}px`;\n //cell.style.maxWidth = `${w}px`;\n });\n });\n });\n }\n });\n } else {\n containers.forEach(container => {\n const tables = container.querySelectorAll('table');\n tables.forEach(tbl => {\n //tbl.style.width = '100%';\n //tbl.style.minWidth = '100%';\n //tbl.style.maxWidth = '';\n });\n });\n }\n\n this.#sheet.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n setColumnWidth(globalColIndex, width, containerType = null) {\n\n let targetCols = [];\n\n targetCols = Array.from(this.#sheet.querySelectorAll(`table colgroup col[data-col=\"${globalColIndex}\"]`));\n\n if (targetCols.length === 0) return;\n\n const firstContainer = targetCols[0].closest('.ng-container-left, .ng-container-body, .ng-container-right');\n const resolvedContainerType = containerType || (\n firstContainer?.classList.contains('ng-container-left') ? 'left' :\n firstContainer?.classList.contains('ng-container-right') ? 'right' : 'body'\n );\n\n targetCols.forEach(col => {\n col.setAttribute('width', width);\n col.style.width = col.style.minWidth = col.style.maxWidth = `${width}px`;\n });\n\n const sourceCol = this.#sheet.sourceTable?.querySelector(`colgroup col[data-col=\"${globalColIndex}\"]`);\n if (sourceCol) {\n sourceCol.setAttribute('width', width);\n sourceCol.style.width = sourceCol.style.minWidth = sourceCol.style.maxWidth = `${width}px`;\n }\n\n this.refreshLayout(resolvedContainerType);\n\n if (resolvedContainerType === 'left' || resolvedContainerType === 'right') {\n this.refreshLayout('body');\n }\n\n this.#sheet.rowManager?.refresh();\n }\n\n #checkIsAutoFit(targetCell) {\n if (this.#sheet.isAutoFitCol) return true;\n const table = targetCell?.closest('table');\n if (table && table.getAttribute('auto-fit-col') === 'true') return true;\n return false;\n }\n\n bindEvents() {\n this.#sheet.addEventListener('pointermove', this.#onPointerMove);\n //this.#sheet.addEventListener('pointerdown', this.#onPointerDown);\n //this.#sheet.addEventListener('dblclick', this.#onDblClick);\n\n this.#sheet.addDebounseEventListener('dblclick', this.#onDblClick, 'pointerdown', this.#onPointerDown);\n }\n\n #getContainerType(cell) {\n const container = cell.closest('.ng-container-left, .ng-container-body, .ng-container-right');\n if (!container) return null;\n if (container.classList.contains('ng-container-left')) return 'left';\n if (container.classList.contains('ng-container-right')) return 'right';\n return 'body';\n }\n\n #onPointerMove = (e) => {\n\n\n const headerPart = e.target.closest('thead');\n if (!headerPart) return;\n\n const cell = e.target.closest('th, td');\n\n headerPart.querySelectorAll('.resizable-edge').forEach(el => {\n if (el !== cell) el.classList.remove('resizable-edge');\n });\n\n if (!cell || cell.dataset.col === undefined) return;\n if (cell.getAttribute('collapsed') === 'true') return;\n\n const rect = cell.getBoundingClientRect();\n const offsetX = e.clientX - rect.left;\n const isLeftEdge = offsetX <= RESIZE_OFFSET;\n const isRightEdge = (rect.width - offsetX) <= RESIZE_OFFSET;\n\n if (isLeftEdge) {\n const prevCell = cell.previousElementSibling;\n if (!prevCell || prevCell.getAttribute('collapsed') === 'true') {\n cell.classList.remove('resizable-edge');\n return;\n }\n }\n\n if (isLeftEdge || isRightEdge) {\n cell.classList.add('resizable-edge');\n } else {\n cell.classList.remove('resizable-edge');\n }\n };\n\n #onPointerDown = (e) => {\n\n const headerPart = e.actualTarget.closest('thead');\n if (!headerPart) return;\n\n const cell = e.actualTarget.closest('th, td');\n\n if (!cell || !cell.classList.contains('resizable-edge')) return;\n\n\n\n e.preventDefault();\n const rect = cell.getBoundingClientRect();\n const offsetX = e.clientX - rect.left;\n\n let targetCell = cell;\n\n if (offsetX <= RESIZE_OFFSET) {\n const prevCell = cell.previousElementSibling;\n if (prevCell && prevCell.dataset.col !== undefined && prevCell.getAttribute('collapsed') !== 'true') {\n targetCell = prevCell;\n } else if (!cell.previousElementSibling) {\n return;\n }\n }\n\n this.#targetCell = targetCell;\n this.#targetContainerType = this.#getContainerType(targetCell);\n\n const container = this.#sheet.querySelector(`.ng-container-${this.#targetContainerType}`);\n if (!container) return;\n\n const baseColIndex = parseInt(targetCell.dataset.col, 10);\n const colSpan = targetCell.colSpan || 1;\n this.#targetColIndex = baseColIndex + colSpan - 1;\n\n const isAutoFit = this.#checkIsAutoFit(targetCell);\n if (isAutoFit) {\n this.#nextColIndex = this.#targetColIndex + 1;\n const nextColEl = container.querySelector(`col[data-col=\"${this.#nextColIndex}\"]`);\n if (nextColEl) {\n this.#nextColStartWidth = parseInt(nextColEl.getAttribute('width'), 10) || 100;\n } else {\n this.#nextColIndex = null;\n }\n } else {\n this.#nextColIndex = null;\n }\n\n const targetRect = targetCell.getBoundingClientRect();\n const sheetRect = this.#sheet.getBoundingClientRect();\n\n this.#startCellWidth = targetRect.width;\n this.#startLeft = targetRect.left - sheetRect.left;\n\n const targetColEl = container.querySelector(`col[data-col=\"${this.#targetColIndex}\"]`);\n const attrW = targetColEl?.getAttribute('width');\n this.#startColWidth = (attrW && !isNaN(parseInt(attrW, 10))) ? parseInt(attrW, 10) : targetRect.width / colSpan;\n\n this.#startX = e.clientX;\n\n if (this.#panel) {\n this.#panel.classList.add('active');\n this.#updatePositions(e.clientX);\n }\n\n window.addEventListener('pointermove', this.#onDragMove);\n window.addEventListener('pointerup', this.#onDragEnd, { once: true });\n };\n\n #updatePositions(clientX) {\n let diff = clientX - this.#startX;\n const isAutoFit = this.#checkIsAutoFit(this.#targetCell);\n\n if (isAutoFit && this.#nextColIndex !== null) {\n const maxDiff = this.#nextColStartWidth - COLLAPSED_WIDTH;\n const minDiff = -(this.#startColWidth - COLLAPSED_WIDTH);\n diff = Math.max(minDiff, Math.min(diff, maxDiff));\n }\n\n const currentColWidth = Math.max(COLLAPSED_WIDTH, this.#startColWidth + diff);\n\n const targetRect = this.#targetCell.getBoundingClientRect();\n let realCellWidth = clientX - targetRect.left;\n\n if (isAutoFit && this.#nextColIndex !== null) {\n const maxCellWidth = this.#startCellWidth + (this.#nextColStartWidth - COLLAPSED_WIDTH);\n realCellWidth = Math.min(realCellWidth, maxCellWidth);\n }\n\n const currentCellWidth = Math.max(COLLAPSED_WIDTH, realCellWidth);\n\n if (this.#panel) {\n this.#panel.style.setProperty('--col-resizer-tooltip-left', `${this.#startLeft}px`);\n this.#panel.style.setProperty('--col-resizer-tooltip-width', `${currentCellWidth}px`);\n }\n\n const sizeBadge = this.#tooltip?.querySelector('.size-badge');\n if (sizeBadge) {\n sizeBadge.textContent = `${Math.round(currentColWidth)}px`;\n }\n }\n\n #onDragMove = (e) => {\n this.#updatePositions(e.clientX);\n };\n\n #onDragEnd = (e) => {\n window.removeEventListener('pointermove', this.#onDragMove);\n\n const diff = e.clientX - this.#startX;\n const isAutoFit = this.#checkIsAutoFit(this.#targetCell);\n let finalWidth = 0;\n\n if (isAutoFit && this.#nextColIndex !== null) {\n let newColWidth = Math.max(COLLAPSED_WIDTH, this.#startColWidth + diff);\n let newNextWidth = this.#startColWidth + this.#nextColStartWidth - newColWidth;\n\n if (newNextWidth < COLLAPSED_WIDTH) {\n newNextWidth = COLLAPSED_WIDTH;\n newColWidth = this.#startColWidth + this.#nextColStartWidth - COLLAPSED_WIDTH;\n }\n\n this.setColumnWidth(this.#targetColIndex, newColWidth, this.#targetContainerType);\n this.setColumnWidth(this.#nextColIndex, newNextWidth, this.#targetContainerType);\n finalWidth = newColWidth;\n } else {\n const newColWidth = Math.max(COLLAPSED_WIDTH, this.#startColWidth + diff);\n if (this.#targetColIndex !== null && this.#targetContainerType) {\n this.setColumnWidth(this.#targetColIndex, newColWidth, this.#targetContainerType);\n finalWidth = newColWidth;\n }\n }\n\n if (this.#targetCell) {\n const targetCell = this.#targetCell;\n if (targetCell.getAttribute('collapsed') !== 'true' && finalWidth > 20) {\n targetCell.dataset.expandWidth = String(finalWidth);\n }\n }\n\n if (this.#panel) {\n this.#tooltip?.classList.add('fade-out');\n setTimeout(() => {\n this.#panel.classList.remove('active');\n this.#tooltip?.classList.remove('fade-out');\n }, 150);\n }\n\n this.#targetColIndex = null;\n this.#nextColIndex = null;\n this.#targetContainerType = null;\n this.#targetCell = null;\n };\n\n #onDblClick = (e) => {\n\n const targetEl = e.target;\n let cell = targetEl.closest('th, td');\n if (!cell || !cell.classList.contains('resizable-edge')) return;\n\n const rect = cell.getBoundingClientRect();\n const offsetX = e.clientX - rect.left;\n\n if (offsetX <= RESIZE_OFFSET) {\n cell = cell.previousElementSibling;\n }\n\n const baseColIndex = parseInt(cell.dataset.col, 10);\n const tbodyCell = this.#sheet.querySelector(`tbody.body [data-col=\"${baseColIndex}\"]`);\n if (!tbodyCell || !tbodyCell.dataset.bind || tbodyCell.classList.contains(\"CELL-RADIO\")) return;\n\n let extraPadding = 0;\n Array.from(tbodyCell.firstElementChild.children).forEach(($el) => {\n switch ($el.tagName) {\n case 'SPAN': extraPadding += 8; break;\n case 'DIV': extraPadding += 8; break;\n case 'BUTTON': extraPadding += 32; break;\n case 'SELECT': extraPadding += 32; break;\n case 'INPUT':\n switch (($el.type || 'text').toLowerCase()) {\n // 1. ์ฒดํฌ๋ฐ์ค / ๋ผ๋์ค (๋น๊ต์ ์ข์ ์์ญ)\n case 'checkbox':\n case 'radio':\n extraPadding += 12;\n break;\n\n // 2. ๋ฒํผ ๊ณ์ด input\n case 'button':\n case 'submit':\n case 'reset':\n case 'image':\n extraPadding += 16;\n break;\n\n // 3. ํน์ ์์ ฏ (์ปฌ๋ฌ, ํ์ผ, ์ฌ๋ผ์ด๋)\n case 'color':\n case 'file':\n case 'range':\n extraPadding += 24;\n break;\n\n // 4. ํ๋ฉด์ ์ ๋ณด์ด๋ hidden ํ๋\n case 'hidden':\n extraPadding += 0;\n break;\n\n // 5. ํ
์คํธ ๋ฐ ์ซ์, ๋ ์ง ๋ฑ ์ผ๋ฐ ์
๋ ฅ ํ๋ (๊ธฐ๋ณธ๊ฐ)\n case 'text':\n case 'search':\n case 'tel':\n case 'url':\n case 'email':\n case 'password':\n case 'number':\n case 'date':\n case 'time':\n case 'datetime-local':\n case 'month':\n case 'week':\n default:\n extraPadding += 16;\n break;\n }\n break;\n }\n });\n\n const fieldIdx = this.#host.fields.get().indexOf(tbodyCell.dataset.bind);\n\n const computedStyle = window.getComputedStyle(tbodyCell);\n const font = computedStyle.font || '12px sans-serif';\n\n const headerText = cell.innerText || \"\";\n const headerSize = nine.measureTextSize(headerText, font);\n let maxTextWidth = (headerSize.width || 0) + 16;\n\n this.#host.execute(() => {\n\n this.#sheet.view.getArray().forEach((record, idx) => {\n const val = String(tbodyCell.dataset.expr ? this.#host.exprEngine.evaluate(tbodyCell.dataset.expr, record, idx) : record.v[fieldIdx] ?? \"\").trim();\n const size = nine.measureTextSize(val, font);\n if (size.width && size.width > maxTextWidth) {\n maxTextWidth = size.width;\n }\n });\n\n const calculatedWidth = Math.max(32, Math.min(400, Math.ceil(maxTextWidth) + extraPadding));\n\n this.setColumnWidth(tbodyCell.dataset.col, calculatedWidth, this.#getContainerType(cell));\n })\n };\n}\n\n\nexport class ColResizerPanel extends HTMLElement {\n #target;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n\n this.#renderer();\n }\n\n #renderer = () => {\n this.innerHTML = `\n <div class=\"resizer-overlay\">\n <span class=\"size-badge\">0px</span>\n </div>\n `;\n };\n}\n\nif (!customElements.get('nine-table-col-resizer-panel')) {\n customElements.define(\"nine-table-col-resizer-panel\", ColResizerPanel);\n}\n","// ui/col/ColMover.js\nimport { trace } from \"@nopeer\";\n\nexport class ColMover {\n #sheet;\n #grip;\n #indi;\n\n #isDragging = false;\n #sourceCell = null;\n #sourceColIndex = null;\n #targetColIndex = null;\n #shiftX = 0;\n #timer = null;\n\n constructor(sheet) {\n this.#sheet = sheet;\n this.#grip = this.#sheet.querySelector('.ng-col-mover-grip');\n this.#indi = this.#sheet.querySelector('.ng-col-mover-indi');\n this.bindEvents();\n }\n\n bindEvents() {\n this.#sheet.addEventListener('pointerdown', this.#onPointerDown);\n }\n\n #checkIsMovable() {\n const host = this.#sheet.getRootNode()?.host;\n return this.#sheet.getAttribute('col-movable') === 'true' || host?.getAttribute('col-movable') === 'true';\n }\n\n #getDeepElementFromPoint(x, y) {\n const root = this.#sheet.getRootNode();\n let el = root.elementFromPoint ? root.elementFromPoint(x, y) : document.elementFromPoint(x, y);\n\n while (el && el.shadowRoot && el.shadowRoot.elementFromPoint) {\n const nested = el.shadowRoot.elementFromPoint(x, y);\n if (!nested || nested === el) break;\n el = nested;\n }\n\n return el;\n }\n\n #getColGroupRange(cell) {\n if (!cell || cell.dataset.col === undefined) return null;\n\n const startCol = parseInt(cell.dataset.col, 10);\n const colSpan = cell.colSpan || 1;\n const endCol = startCol + colSpan - 1;\n const rowIndex = cell.closest('tr')?.sectionRowIndex ?? 0;\n\n const table = cell.closest('table');\n if (!table) return { startCol, colSpan, endCol, rowIndex, isGroup: false, parentGroupRange: null, isValidGroup: true };\n\n const headerCells = table.querySelectorAll('thead th, thead td');\n let hasStrictChildren = false;\n let isValidGroup = true;\n let parentGroupRange = null;\n\n for (const subCell of headerCells) {\n if (subCell === cell || subCell.dataset.col === undefined) continue;\n\n const subStart = parseInt(subCell.dataset.col, 10);\n const subSpan = subCell.colSpan || 1;\n const subEnd = subStart + subSpan - 1;\n const subRowIndex = subCell.closest('tr')?.sectionRowIndex ?? 0;\n\n if (subRowIndex < rowIndex && subStart <= startCol && subEnd >= endCol && subSpan > colSpan) {\n if (!parentGroupRange) {\n parentGroupRange = { startCol: subStart, endCol: subEnd };\n } else {\n parentGroupRange.startCol = Math.max(parentGroupRange.startCol, subStart);\n parentGroupRange.endCol = Math.min(parentGroupRange.endCol, subEnd);\n }\n }\n\n const isOverlap = !(subEnd < startCol || subStart > endCol);\n if (isOverlap) {\n const isFullyContained = (subStart >= startCol && subEnd <= endCol);\n\n if (isFullyContained) {\n if (subSpan < colSpan) {\n hasStrictChildren = true;\n }\n } else if (subStart < startCol || subEnd > endCol) {\n if (!(subStart <= startCol && subEnd >= endCol)) {\n isValidGroup = false;\n }\n }\n }\n }\n\n const isRealGroup = hasStrictChildren && isValidGroup;\n\n return {\n startCol,\n colSpan: isRealGroup ? colSpan : 1,\n endCol: isRealGroup ? endCol : startCol,\n rowIndex,\n isGroup: isRealGroup,\n parentGroupRange,\n isValidGroup\n };\n }\n\n #createGroupHeaderPreview(cell) {\n const groupRange = this.#getColGroupRange(cell);\n if (!groupRange) return null;\n\n const { startCol, endCol, isGroup } = groupRange;\n\n // ํต์ฌ: ํ
์ด๋ธ์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ตฌ์กฐ์ด๋ฏ๋ก cell์ด ์ํ ๋ฐ๋ก ๊ทธ ํ
์ด๋ธ์ ์ง์ ๊ฐ์ ธ์ต๋๋ค.\n const origTable = cell.closest('table');\n if (!origTable) return null;\n\n let minLeft = Infinity, maxRight = -Infinity, minTop = Infinity, maxBottom = -Infinity;\n const targetCells = [];\n\n origTable.querySelectorAll('thead th, thead td').forEach(c => {\n if (c.dataset.col === undefined) return;\n const cCol = parseInt(c.dataset.col, 10);\n const cSpan = c.colSpan || 1;\n const cEnd = cCol + cSpan - 1;\n\n const isTarget = isGroup\n ? (cCol >= startCol && cEnd <= endCol)\n : (c === cell);\n\n if (isTarget) {\n const rect = c.getBoundingClientRect();\n minLeft = Math.min(minLeft, rect.left);\n maxRight = Math.max(maxRight, rect.right);\n minTop = Math.min(minTop, rect.top);\n maxBottom = Math.max(maxBottom, rect.bottom);\n\n const computedStyle = window.getComputedStyle(c);\n targetCells.push({ el: c, rect, style: computedStyle });\n }\n });\n\n if (targetCells.length === 0) return null;\n\n const groupWidth = maxRight - minLeft;\n const groupHeight = maxBottom - minTop;\n\n const headerContent = document.createElement('div');\n headerContent.className = 'grip-header-content';\n headerContent.style.position = 'relative';\n headerContent.style.width = `${groupWidth}px`;\n headerContent.style.height = `${groupHeight}px`;\n\n targetCells.forEach(({ el, rect, style }) => {\n const clonedCell = el.cloneNode(true);\n\n clonedCell.style.position = 'absolute';\n clonedCell.style.left = `${rect.left - minLeft}px`;\n clonedCell.style.top = `${rect.top - minTop}px`;\n\n clonedCell.style.width = `${rect.width}px`;\n clonedCell.style.minWidth = `${rect.width}px`;\n clonedCell.style.maxWidth = 'none';\n\n clonedCell.style.height = `${rect.height}px`;\n clonedCell.style.boxSizing = 'border-box';\n clonedCell.style.margin = '0';\n\n clonedCell.style.backgroundColor = style.backgroundColor !== 'transparent' && style.backgroundColor !== 'rgba(0, 0, 0, 0)'\n ? style.backgroundColor\n : '#f9fafb';\n clonedCell.style.color = style.color;\n clonedCell.style.font = style.font;\n clonedCell.style.fontWeight = style.fontWeight;\n clonedCell.style.fontSize = style.fontSize;\n clonedCell.style.textAlign = style.textAlign;\n clonedCell.style.padding = style.padding;\n clonedCell.style.border = style.border;\n clonedCell.style.borderRight = style.borderRight;\n clonedCell.style.borderBottom = style.borderBottom;\n clonedCell.style.display = 'flex';\n clonedCell.style.alignItems = 'center';\n clonedCell.style.justifyContent = style.textAlign === 'center' ? 'center' : (style.textAlign === 'right' ? 'flex-end' : 'flex-start');\n\n headerContent.appendChild(clonedCell);\n });\n\n return {\n element: headerContent,\n bounds: {\n left: minLeft,\n right: maxRight,\n top: minTop,\n bottom: maxBottom,\n width: groupWidth,\n height: groupHeight\n }\n };\n }\n\n #onPointerDown = (e) => {\n if (!this.#checkIsMovable()) return;\n\n const headerPart = e.target.closest('.ng-sheet-header');\n if (!headerPart) return;\n\n const cell = e.target.closest('th, td');\n if (!cell || cell.classList.contains('resizable-edge') || ['INPUT', 'BUTTON'].includes(e.target.tagName)) return;\n if (cell.dataset.col === undefined) return;\n\n e.preventDefault();\n\n const startX = e.clientX;\n const startY = e.clientY;\n\n const cancelTimer = () => {\n if (this.#timer) {\n clearTimeout(this.#timer);\n this.#timer = null;\n }\n window.removeEventListener('pointermove', onPointerMovePending);\n window.removeEventListener('pointerup', cancelTimer);\n window.removeEventListener('pointercancel', cancelTimer);\n };\n\n const onPointerMovePending = (moveEvent) => {\n const dist = Math.hypot(moveEvent.clientX - startX, moveEvent.clientY - startY);\n if (dist > 5) {\n cancelTimer();\n }\n };\n\n this.#timer = setTimeout(() => {\n cancelTimer();\n this.#startDrag(e, cell);\n }, 500);\n\n window.addEventListener('pointermove', onPointerMovePending);\n window.addEventListener('pointerup', cancelTimer, { once: true });\n window.addEventListener('pointercancel', cancelTimer, { once: true });\n };\n\n #startDrag(e, cell) {\n if (this.#isDragging) return;\n\n const preview = this.#createGroupHeaderPreview(cell);\n if (!preview) return;\n\n this.#isDragging = true;\n this.#sourceCell = cell;\n this.#sourceColIndex = parseInt(cell.dataset.col, 10);\n\n const sheetRect = this.#sheet.getBoundingClientRect();\n const { bounds, element } = preview;\n\n this.#shiftX = e.clientX - bounds.left;\n\n if (this.#grip) {\n this.#grip.replaceChildren(element);\n\n const relativeTop = bounds.top - sheetRect.top;\n const fullHeight = sheetRect.height - relativeTop;\n\n this.#grip.style.width = `${bounds.width}px`;\n this.#grip.style.height = `${fullHeight}px`;\n this.#grip.style.top = `${relativeTop}px`;\n this.#grip.style.display = 'block';\n\n this.#updateGripPosition(e.clientX);\n }\n\n document.body.style.cursor = 'move';\n\n window.addEventListener('pointermove', this.#onPointerMove);\n window.addEventListener('pointerup', this.#onPointerUp, { once: true });\n }\n\n #onPointerMove = (e) => {\n if (!this.#isDragging) return;\n\n this.#updateGripPosition(e.clientX);\n\n if (this.#grip) this.#grip.style.pointerEvents = 'none';\n if (this.#indi) this.#indi.style.pointerEvents = 'none';\n\n const targetElement = this.#getDeepElementFromPoint(e.clientX, e.clientY);\n const targetCell = targetElement?.closest('.ng-sheet-header th, .ng-sheet-header td');\n\n if (targetCell && targetCell.dataset.col !== undefined) {\n const targetColIndex = parseInt(targetCell.dataset.col, 10);\n const sheetRect = this.#sheet.getBoundingClientRect();\n const table = targetCell.closest('table');\n\n let colMinLeft = Infinity;\n let colMaxRight = -Infinity;\n\n if (table) {\n table.querySelectorAll('thead th, thead td').forEach(c => {\n if (c.dataset.col === undefined) return;\n const cCol = parseInt(c.dataset.col, 10);\n const cSpan = c.colSpan || 1;\n const cEnd = cCol + cSpan - 1;\n\n if (cCol <= targetColIndex && cEnd >= targetColIndex) {\n const cRect = c.getBoundingClientRect();\n colMinLeft = Math.min(colMinLeft, cRect.left);\n colMaxRight = Math.max(colMaxRight, cRect.right);\n }\n });\n }\n\n if (colMinLeft === Infinity) {\n const rect = targetCell.getBoundingClientRect();\n colMinLeft = rect.left;\n colMaxRight = rect.right;\n }\n\n const midX = colMinLeft + ((colMaxRight - colMinLeft) / 2);\n let calculatedTargetCol = 0;\n let indicatorLeft = 0;\n\n if (e.clientX < midX) {\n calculatedTargetCol = targetColIndex;\n indicatorLeft = colMinLeft - sheetRect.left;\n } else {\n const colSpan = targetCell.colSpan || 1;\n calculatedTargetCol = targetColIndex + colSpan;\n indicatorLeft = colMaxRight - sheetRect.left;\n }\n\n const sourceGroup = this.#getColGroupRange(this.#sourceCell);\n const movingSpan = sourceGroup.colSpan;\n\n const sourceRowStart = sourceGroup.rowIndex;\n const sourceRowSpan = this.#sourceCell.rowSpan || 1;\n const sourceRowEnd = sourceRowStart + sourceRowSpan - 1;\n\n const targetRowStart = targetCell.closest('tr')?.sectionRowIndex ?? 0;\n const targetRowSpan = targetCell.rowSpan || 1;\n const targetRowEnd = targetRowStart + targetRowSpan - 1;\n\n const isRowSpanCompatible = !(sourceRowEnd < targetRowStart || sourceRowStart > targetRowEnd);\n\n let isOutOfBoundsOfParent = false;\n if (sourceGroup.parentGroupRange) {\n const { startCol: pStart, endCol: pEnd } = sourceGroup.parentGroupRange;\n if (calculatedTargetCol < pStart || (calculatedTargetCol + movingSpan - 1) > pEnd) {\n isOutOfBoundsOfParent = true;\n }\n }\n\n let isDroppingInsideOtherGroup = false;\n if (table) {\n const spannedCells = table.querySelectorAll('thead th[colspan], thead td[colspan]');\n\n for (const sCell of spannedCells) {\n if (sCell === this.#sourceCell) continue;\n\n const sRowStart = sCell.closest('tr')?.sectionRowIndex ?? 0;\n const sRowSpan = sCell.rowSpan || 1;\n const sRowEnd = sRowStart + sRowSpan - 1;\n\n const isVerticalOverlap = !(sourceRowEnd < sRowStart || sourceRowStart > sRowEnd);\n if (!isVerticalOverlap) continue;\n\n const sStart = parseInt(sCell.dataset.col, 10);\n const sSpan = sCell.colSpan || 1;\n const sEnd = sStart + sSpan - 1;\n\n if (calculatedTargetCol > sStart && calculatedTargetCol < sEnd + 1) {\n isDroppingInsideOtherGroup = true;\n break;\n }\n\n const moveEndCol = calculatedTargetCol + movingSpan - 1;\n const isCrossIntersecting = (\n (calculatedTargetCol > sStart && calculatedTargetCol <= sEnd && moveEndCol > sEnd) ||\n (calculatedTargetCol < sStart && moveEndCol >= sStart && moveEndCol < sEnd)\n );\n\n if (isCrossIntersecting) {\n isDroppingInsideOtherGroup = true;\n break;\n }\n }\n }\n\n const isSelfGroup = (\n calculatedTargetCol >= sourceGroup.startCol &&\n calculatedTargetCol <= sourceGroup.endCol + 1\n );\n\n const isInvalidMove = !isRowSpanCompatible || isSelfGroup || isOutOfBoundsOfParent || isDroppingInsideOtherGroup || !sourceGroup.isValidGroup;\n\n if (isInvalidMove) {\n this.#targetColIndex = null;\n if (this.#indi) this.#indi.style.display = 'none';\n if (this.#grip) this.#grip.classList.add('invalid');\n } else {\n this.#targetColIndex = calculatedTargetCol;\n if (this.#grip) this.#grip.classList.remove('invalid');\n\n if (this.#indi) {\n const headerPart = targetCell.closest('.ng-sheet-header');\n const headerRect = headerPart.getBoundingClientRect();\n const relativeTop = headerRect.top - sheetRect.top;\n const fullHeight = sheetRect.height - relativeTop;\n\n this.#indi.style.top = `${relativeTop}px`;\n this.#indi.style.height = `${fullHeight}px`;\n this.#indi.style.left = `${indicatorLeft - 1}px`;\n this.#indi.style.display = 'block';\n }\n }\n } else {\n if (this.#indi) this.#indi.style.display = 'none';\n if (this.#grip) this.#grip.classList.add('invalid');\n this.#targetColIndex = null;\n }\n };\n\n #updateGripPosition(clientX) {\n if (!this.#grip) return;\n const sheetRect = this.#sheet.getBoundingClientRect();\n const left = clientX - sheetRect.left - this.#shiftX;\n this.#grip.style.left = `${left}px`;\n }\n\n #onPointerUp = (e) => {\n if (!this.#isDragging) return;\n\n window.removeEventListener('pointermove', this.#onPointerMove);\n document.body.style.cursor = '';\n\n if (this.#grip) {\n this.#grip.style.display = 'none';\n this.#grip.replaceChildren();\n }\n if (this.#indi) this.#indi.style.display = 'none';\n\n if (\n this.#targetColIndex !== null &&\n this.#sourceColIndex !== null &&\n this.#targetColIndex !== this.#sourceColIndex &&\n this.#targetColIndex !== this.#sourceColIndex + 1\n ) {\n this.moveColumn(this.#sourceColIndex, this.#targetColIndex);\n }\n\n this.#isDragging = false;\n this.#sourceCell = null;\n this.#sourceColIndex = null;\n this.#targetColIndex = null;\n };\n\n moveColumn(fromColIndex, toColIndex) {\n\n const colgroup = this.#sheet.sourceTable.querySelector('colgroup');\n const targetCol = colgroup.querySelector(`col[data-col=\"${toColIndex}\"]`);\n\n const sourceGroup = this.#getColGroupRange(this.#sourceCell);\n if (!sourceGroup || !sourceGroup.isValidGroup) return;\n\n const spanCount = sourceGroup.colSpan;\n const isInRange = (idx) => idx >= fromColIndex && idx < fromColIndex + spanCount;\n\n // 1. colgroup ๋ด <col> ์ด๋ ๋ฐ fixed ์ค์ \n const targetViewportCol = this.#sheet.querySelector(`.ng-sheet-body-content col[data-col=\"${toColIndex}\"]`);\n const fixedType = targetViewportCol?.closest('.ng-container-left') ? 'left' : targetViewportCol?.closest('.ng-container-right') ? 'right' : null;\n\n colgroup.querySelectorAll('col').forEach(col => {\n if (isInRange(parseInt(col.getAttribute('data-col'), 10))) {\n fixedType ? col.setAttribute('fixed', fixedType) : col.removeAttribute('fixed');\n colgroup.insertBefore(col, targetCol);\n }\n });\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n this.#sheet.sourceTable.querySelectorAll(`${group} tr`).forEach(tr => {\n const cells = Array.from(tr.children);\n const targetRowCell = cells.find(c => parseInt(c.dataset.col, 10) >= toColIndex);\n\n cells.forEach(cell => {\n if (isInRange(parseInt(cell.dataset.col, 10))) {\n tr.insertBefore(cell, targetRowCell || null);\n }\n });\n });\n });\n\n this.#sheet.recompileAndRefresh();\n }\n\n destroy() {\n this.#sheet.removeEventListener('pointerdown', this.#onPointerDown);\n }\n}","// ui/col/ColFixManager.js\nimport { trace } from \"@nopeer\";\n\nexport class ColFixManager {\n #sheet;\n\n constructor(sheet) {\n this.#sheet = sheet;\n }\n\n getFixState(targetCell, table) {\n if (!targetCell || !table) return 'none';\n\n const container = targetCell.closest('.ng-container-left, .ng-container-right, .ng-container-body');\n if (container?.classList.contains('ng-container-left')) return 'left';\n if (container?.classList.contains('ng-container-right')) return 'right';\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n if (!isNaN(baseCol)) {\n const colEl = table.querySelector(`colgroup col[data-col=\"${baseCol}\"]`);\n const fixedAttr = colEl?.getAttribute('fixed');\n if (fixedAttr) return fixedAttr;\n }\n\n return 'none';\n }\n\n canFixColumn(targetCell, table) {\n if (!targetCell || targetCell.tagName !== 'TH' || !table) return false;\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n const colSpan = targetCell.colSpan || 1;\n if (isNaN(baseCol)) return false;\n\n const targetBoundaryCol = baseCol + colSpan - 1;\n const theadTrs = Array.from(table.querySelectorAll('thead tr'));\n\n if (theadTrs.length <= 1) return true;\n\n for (const tr of theadTrs) {\n const cells = Array.from(tr.querySelectorAll('th, td'));\n let cellBoundaryFound = false;\n\n for (const cell of cells) {\n const cCol = parseInt(cell.dataset.col, 10);\n const cSpan = cell.colSpan || 1;\n const cEndCol = cCol + cSpan - 1;\n\n if (cCol <= targetBoundaryCol && targetBoundaryCol < cEndCol) {\n return false;\n }\n\n if (cEndCol === targetBoundaryCol) {\n cellBoundaryFound = true;\n break;\n }\n }\n\n if (!cellBoundaryFound) return false;\n }\n\n return true;\n }\n\n executeFixToggle(action, targetCell, fixType = 'left') {\n if (!this.#sheet || !targetCell) return;\n\n const sourceTable = this.#sheet.sourceTable;\n if (!sourceTable) return;\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n const colSpan = targetCell.colSpan || 1;\n const targetColIndex = baseCol + colSpan - 1;\n\n if (isNaN(targetColIndex)) return;\n\n const colgroup = sourceTable.querySelector('colgroup');\n if (!colgroup) return;\n\n const cols = Array.from(colgroup.querySelectorAll('col'));\n\n if (action === 'fix-column') {\n cols.forEach(col => {\n const idx = parseInt(col.getAttribute('data-col'), 10);\n if (idx <= targetColIndex) {\n col.setAttribute('fixed', fixType);\n }\n });\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n sourceTable.querySelectorAll(`${group} tr`).forEach(tr => {\n Array.from(tr.children).forEach(cell => {\n const cIdx = parseInt(cell.dataset.col, 10);\n if (!isNaN(cIdx) && cIdx <= targetColIndex) {\n cell.setAttribute('fixed', fixType);\n }\n });\n });\n });\n\n } else if (action === 'unfix-column') {\n let minBaseCol = baseCol;\n let maxEndCol = baseCol + colSpan - 1;\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n sourceTable.querySelectorAll(`${group} tr`).forEach((tr, rIdx) => {\n Array.from(tr.children).forEach(cell => {\n const cCol = parseInt(cell.dataset.col, 10);\n const cSpan = cell.colSpan || 1;\n const cEnd = cCol + cSpan - 1;\n const rSpan = cell.rowSpan || 1;\n const trIndex = tr.sectionRowIndex ?? rIdx;\n\n const isVerticalOverlap = !(trIndex + rSpan - 1 < cell.closest('tr').sectionRowIndex || trIndex > (cell.closest('tr').sectionRowIndex + rSpan - 1));\n\n const isHorizontalOverlap = !(cEnd < baseCol || cCol > targetColIndex);\n\n if (isHorizontalOverlap) {\n minBaseCol = Math.min(minBaseCol, cCol);\n maxEndCol = Math.max(maxEndCol, cEnd);\n }\n });\n });\n });\n\n cols.forEach(col => {\n const idx = parseInt(col.getAttribute('data-col'), 10);\n if (idx >= minBaseCol) {\n col.removeAttribute('fixed');\n }\n });\n\n let isBroken = false;\n cols.forEach(col => {\n if (isBroken) {\n col.removeAttribute('fixed');\n } else if (!col.getAttribute('fixed')) {\n isBroken = true;\n }\n });\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n sourceTable.querySelectorAll(`${group} tr`).forEach(tr => {\n Array.from(tr.children).forEach(cell => {\n const cIdx = parseInt(cell.dataset.col, 10);\n if (isNaN(cIdx)) return;\n\n const correspondingCol = cols.find(c => parseInt(c.getAttribute('data-col'), 10) === cIdx);\n const isColFixed = correspondingCol?.getAttribute('fixed');\n\n if (isColFixed) {\n cell.setAttribute('fixed', isColFixed);\n } else {\n cell.removeAttribute('fixed');\n }\n });\n });\n });\n }\n\n this.#sheet.recompileAndRefresh?.();\n }\n}","import { NINE_TABLE } from '@/core/constants.js';\nimport { trace } from \"@nopeer\";\n\nexport class NineTableFilterPanel extends HTMLElement {\n\t#sheet;\n\t#host;\n\t#nineTable;\n\t#view;\n\t#button;\n\tcurrentCol = null;\n\n\tconnectedCallback() {\n\t\tthis.#init();\n\t\tdocument.addEventListener(\"mousedown\", this.#closeHandler);\n\t}\n\n\t#init = () => {\n\t\t//setTimeout(() => {\n\t\t\tthis.#renderer();\n\n\t\t\tthis.#sheet = this.closest(\"nine-table-sheet\");\n\t\t\tthis.#host = this.getRootNode().host;\n\n\t\t\tthis.#nineTable = this.querySelector(\"nine-table-simple\");\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.#view = this.#nineTable.shadowRoot.querySelector(\"nine-table-sheet\");\n\t\t\t})\n\n\n\t\t\tthis.querySelector(\".search-box\").addEventListener(\"focusin\", (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t});\n\t\t\tthis.querySelector(\".search-box\").addEventListener(\"input\", this.#onInput);\n\t\t\tthis.querySelector(\"#chkSelectAll\").addEventListener(\"change\", this.#onSelectAll);\n\t\t\tthis.querySelector(\"#btnOk\").addEventListener(\"click\", this.#onOk);\n\t\t//});\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"text\" class=\"search-box\" placeholder=\"Search...\">\n \n <nine-table-simple class=\"filter-list\" theme=\"simple\">\n <table auto-fit-col=\"true\">\n <colgroup>\n <col width=\"32\" fixed=\"left\" />\n <col width=\"180\" />\n <col width=\"0\" fixed=\"right\"/>\n </colgroup>\n <tbody>\n <tr>\n <td cell-type=\"checkbox\" data-bind=\"CHK\"></td>\n <td data-bind=\"DATA2\" html=\"true\"></td>\n <td data-bind=\"DATA\"></td>\n </tr>\n </tbody>\n </table>\n </nine-table-simple>\n\n <div class=\"footer-section\">\n <div class=\"footer-btns\">\n <label><input type=\"checkbox\" id=\"chkSelectAll\" checked> Select All</label>\n <div class=\"btn-group\">\n <button id=\"btnOk\">Apply</button>\n </div>\n </div>\n </div>\n `;\n\t}\n\n\topen(filterBtn) {\n\t\tthis.#button = filterBtn;\n\n\t\tconst cell = filterBtn.closest(\"th, td\");\n\t\tthis.currentCol = cell?.dataset.col;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst sheetRect = this.#sheet.getBoundingClientRect();\n\n\t\tconst panelWidth = this.offsetWidth || 240;\n\t\tlet left = (cellRect.right - sheetRect.left) - panelWidth;\n\t\tlet top = cellRect.bottom - sheetRect.top;\n\n\t\tif (left < 0) {\n\t\t\tleft = Math.max(0, cellRect.left - sheetRect.left);\n\t\t}\n\n\t\tthis.style.left = `${left}px`;\n\t\tthis.style.top = `${top}px`;\n\n\t\tconst searchBox = this.querySelector(\".search-box\");\n\t\tsearchBox.value = \"\";\n\n\n\t\tthis.classList.add(\"active\");\n\t\tthis.classList.add(\"loading\");\n\n\t\tsetTimeout(() => {\n\t\t\ttry {\n\t\t\t\tthis.#loadVirtualFilterItems();\n\t\t\t\tthis.#view.rowManager.scrollToDataRow(0);\n\t\t\t\tsearchBox.focus({ preventScroll: true });\n\t\t\t} finally {\n\t\t\t\tthis.classList.remove(\"loading\");\n\t\t\t}\n\t\t});\n\t}\n\n\t#closeHandler = (e) => {\n\n\t\tconst path = e.composedPath ? e.composedPath() : [];\n\t\tif (path.includes(this) || (this.#button && path.includes(this.#button))) {\n\t\t\treturn;\n\t\t}\n\t\tthis.close();\n\t};\n\n\tclose() {\n\t\tthis.currentCol = null;\n\t\tthis.classList.remove(\"active\");\n\t\tthis.#button = null;\n\t}\n\n\t#loadVirtualFilterItems() {\n\t\tconst filteredRecords = this.#host.data.getArray();\n\t\tconst targetCols = this.#button?.columns || []; // [{ bind, expr }] ํํ ๋ฐฐ์ด\n\t\tconst fields = this.#host.fields.get() || [];\n\t\tconst activeFilters = this.#sheet.filtering?.filters || {};\n\t\tconst exprEngine = this.#host.exprEngine;\n\n\t\tconst ds = targetCols.flatMap((colInfo) => {\n\t\t\tconst bindKey = colInfo.bind;\n\t\t\tconst exprKey = colInfo.expr;\n\n\t\t\tconst filterKey = bindKey || exprKey; // ์ค์ ํํฐ ํ๋ผ๋ฏธํฐ ํค๋ก ์ฌ์ฉ\n\t\t\tconst fieldIdx = bindKey ? fields.indexOf(bindKey) : -1;\n\t\t\tconst activeSelectedVals = activeFilters[filterKey] || [];\n\n\t\t\tconst uniqueMap = new Map();\n\t\t\tfor (let i = 0; i < filteredRecords.length; i++) {\n\t\t\t\tconst record = filteredRecords[i];\n\t\t\t\tif (!record) continue;\n\n\t\t\t\tlet rawVal = undefined;\n\t\t\t\tif (fieldIdx >= 0 && record.v) {\n\t\t\t\t\trawVal = record.v[fieldIdx];\n\t\t\t\t} else if (bindKey && bindKey.includes(\"data.\")) {\n\t\t\t\t\trawVal = exprEngine ? exprEngine.evaluate(bindKey, record, i) : undefined;\n\t\t\t\t} else if (exprKey && exprEngine) {\n\t\t\t\t\trawVal = exprEngine.evaluate(exprKey, record, i);\n\t\t\t\t}\n\n\t\t\t\tlet displayVal = rawVal;\n\t\t\t\tif (exprKey && exprEngine) {\n\t\t\t\t\tdisplayVal = exprEngine.evaluate(exprKey, record, i);\n\t\t\t\t}\n\n\t\t\t\tif (displayVal !== undefined && displayVal !== null && !uniqueMap.has(displayVal)) {\n\t\t\t\t\tuniqueMap.set(displayVal, {\n\t\t\t\t\t\tv: rawVal, // ๐ก ํํฐ๋ง ๋น๊ต ๊ธฐ์ค (DATA)\n\t\t\t\t\t\tv2: displayVal // ๐ก ํ๋ฉด ์ถ๋ ฅ ๊ธฐ์ค (DATA2)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst uniqueList = [...uniqueMap.values()];\n\n\t\t\tuniqueList.sort((a, b) => {\n\t\t\t\tconst valA = a.v2;\n\t\t\t\tconst valB = b.v2;\n\n\t\t\t\tif (valA === valB) return 0;\n\t\t\t\tif (valA === undefined || valA === null || valA === '') return 1;\n\t\t\t\tif (valB === undefined || valB === null || valB === '') return -1;\n\n\t\t\t\tconst numA = Number(valA);\n\t\t\t\tconst numB = Number(valB);\n\n\t\t\t\tconst isNumA = !isNaN(numA);\n\t\t\t\tconst isNumB = !isNaN(numB);\n\n\t\t\t\tif (isNumA && isNumB) {\n\t\t\t\t\treturn numA - numB;\n\t\t\t\t}\n\n\t\t\t\treturn String(valA).localeCompare(String(valB));\n\t\t\t});\n\t\t\tactiveSelectedVals.sort((a, b) => { return a > b ? 1 : -1; });\n\n\t\t\treturn uniqueList.map(o => ({\n\t\t\t\tLVL: 2,\n\t\t\t\tDATA: o.v, // ํํฐ๋ง ๋น๊ต์ฉ ๊ฐ\n\t\t\t\tDATA2: (o.v2 === \"\" || o.v2 === null || o.v2 === undefined) ? '<span class=\"empty-value\">(empty)</span>' : o.v2,\n\t\t\t\tCOLNM: filterKey,\n\t\t\t\tCHK: activeSelectedVals.length === 0 || activeSelectedVals.nineBinarySearch(o.v) >= 0 ? \"Y\" : \"N\"\n\t\t\t}));\n\t\t});\n\n\t\tthis.#nineTable.data.set(ds);\n\n\t\tconst selectAllChk = this.querySelector(\"#chkSelectAll\");\n\t\tif (selectAllChk) {\n\t\t\tselectAllChk.checked = ds.length > 0 && ds.every(item => item.CHK === \"Y\");\n\t\t}\n\t}\n\n\t#onOk = () => {\n\t\tthis.#host.loading = true;\n\n\t\tconst filterRecords = this.#view.view.getArray();\n\t\tconst fields = this.#nineTable.data.getHostFields();\n\n\t\tconst checkedRecords = filterRecords.filter(record => {\n\t\t\tconst chk = record.v[fields.indexOf(\"CHK\")];\n\t\t\treturn (chk === \"Y\" || chk === true);\n\t\t});\n\n\t\tconst filterParams = { ...(this.#sheet.filtering?.filters || {}) };\n\n\t\tthis.#button.columns.forEach(colInfo => {\n\t\t\tconst filterKey = colInfo.expr || colInfo.bind;\n\t\t\tconst fieldIdx = colInfo.expr ? fields.indexOf(\"DATA2\") : fields.indexOf(\"DATA\");\n\t\t\tconst selectedVals = checkedRecords.map(r => r.v[fieldIdx]);\n\n\t\t\tif (selectedVals.length > 0) {\n\t\t\t\tfilterParams[filterKey] = selectedVals;\n\t\t\t} else {\n\t\t\t\tdelete filterParams[filterKey];\n\t\t\t}\n\t\t});\n\n\t\tconst totalCount = this.#nineTable.data.count();\n\n\t\tsetTimeout(() => {\n\t\t\ttry {\n\t\t\t\tif (totalCount === checkedRecords.length) {\n\t\t\t\t\tthis.#button.columns.forEach(colInfo => {\n\t\t\t\t\t\tconst filterKey = colInfo.expr || colInfo.bind;\n\t\t\t\t\t\tif (filterKey) this.#sheet.filtering.clear(filterKey);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.#sheet.filtering.set(filterParams);\n\t\t\t\t}\n\n\t\t\t\tthis.#sheet.querySelectorAll(\"nine-table-filter-button\").forEach(btn => {\n\t\t\t\t\tbtn.updateFilteredState();\n\t\t\t\t});\n\n\t\t\t\tthis.#sheet.invalidate();\n\t\t\t\tthis.close();\n\t\t\t} finally {\n\t\t\t\tthis.#host.loading = false;\n\t\t\t}\n\t\t});\n\t};\n\n\t#onInput = (e) => {\n\n\t\tconst query = e.target.value.toLowerCase().trim();\n\n\t\tif (!query) {\n\t\t\tthis.#view.filtering.clear();\n\t\t} else {\n\t\t\tconst rawRecords = this.#nineTable.data.getArray();\n\t\t\tconst fields = this.#nineTable.data.getHostFields();\n\t\t\tconst data2Idx = fields.indexOf(\"DATA2\");\n\n\t\t\tconst matchedValues = [];\n\t\t\trawRecords.forEach(record => {\n\t\t\t\tconst val = data2Idx >= 0 && record.v ? record.v[data2Idx] : \"\";\n\t\t\t\tconst textVal = String(val).replace(/<[^>]*>?/gm, '').toLowerCase();\n\n\t\t\t\tif (textVal.includes(query)) {\n\t\t\t\t\tmatchedValues.push(val);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.#view.filtering.set({\n\t\t\t\tDATA2: [...new Set(matchedValues)]\n\t\t\t});\n\t\t}\n\t};\n\n\t#onSelectAll = (e) => {\n\t\tconst isChecked = e.target.checked;\n\t\tconst rawRecords = this.#nineTable?.data?.getArray() || [];\n\t\tconst fields = this.#nineTable.data.getHostFields();\n\t\tconst chkIdx = fields.indexOf(\"CHK\");\n\n\t\tif (chkIdx >= 0) {\n\t\t\trawRecords.forEach(record => {\n\t\t\t\trecord.v[chkIdx] = isChecked ? \"Y\" : \"N\";\n\t\t\t});\n\t\t}\n\n\t\tthis.#nineTable.refresh();\n\t};\n\n\t#onCancel = () => {\n\t\tthis.close();\n\t};\n}\n\nexport class NineTableFilterButton extends HTMLElement {\n\t#sheet;\n\t#columns = null;\n\n\tconnectedCallback() {\n\t\tthis.#sheet = this.closest(\"nine-table-sheet\") || this.getRootNode().host;\n\t\tthis.removeEventListener(\"click\", this.#onClick);\n\t\tthis.addEventListener(\"click\", this.#onClick);\n\t}\n\n\tget columns() {\n\t\tif (this.#columns) return this.#columns;\n\n\t\tconst cell = this.closest(\"th, td\");\n\t\tconst colIndex = cell?.dataset.col;\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\n\t\tconst cols = [];\n\t\tconst seen = new Set();\n\n\t\tif (sourceTable && colIndex !== undefined) {\n\t\t\tsourceTable.querySelectorAll(`tbody [data-col=\"${colIndex}\"]`).forEach($td => {\n\t\t\t\tconst bindKey = $td.dataset.bind;\n\t\t\t\tconst exprKey = $td.dataset.expr;\n\n\t\t\t\tif (bindKey || exprKey) {\n\t\t\t\t\tconst uniqueKey = `${bindKey || ''}_${exprKey || ''}`;\n\t\t\t\t\tif (!seen.has(uniqueKey)) {\n\t\t\t\t\t\tseen.add(uniqueKey);\n\t\t\t\t\t\tcols.push({\n\t\t\t\t\t\t\tbind: bindKey,\n\t\t\t\t\t\t\texpr: exprKey,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#columns = cols;\n\t\treturn this.#columns;\n\t}\n\n\tupdateFilteredState = () => {\n\t\tconst activeFilters = this.#sheet.filtering?.filters || {};\n\t\tconst isFiltered = this.columns.some(colInfo => {\n\t\t\tconst key = colInfo.expr || colInfo.bind;\n\t\t\treturn key && activeFilters[key] && activeFilters[key].length > 0;\n\t\t});\n\t\tthis.classList.toggle('filtered', isFiltered);\n\t};\n\n\t#onClick = (e) => {\n\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tconst panel = this.#sheet.querySelector(\"nine-table-filter-panel\");\n\t\tconst cell = this.closest(\"th, td\");\n\t\tconst col = cell.dataset.col;\n\n\t\tif (panel && panel.currentCol === col && panel.classList.contains('active')) {\n\t\t\tpanel.close();\n\t\t} else if (panel) {\n\t\t\tpanel.open(this);\n\t\t}\n\t};\n}\n\nexport class Filtering {\n\t#sheet;\n\t#host;\n\t#isFiltering = false;\n\t#filterPanel = null;\n\t#filters = {};\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = this.#sheet.getRootNode().host;\n\t\tthis.#init();\n\t}\n\n\tget filters() {\n\t\treturn this.#filters;\n\t};\n\n\t#init = () => {\n\t\tthis.#initFilterPanel();\n\t}\n\n\t#initFilterPanel = () => {\n\t\tif (this.#host.tagName.toLowerCase() === \"nine-table-simple\") {\n\t\t\treturn;\n\t\t}\n\n\t\tlet panel = this.#sheet.querySelector(\"nine-table-filter-panel\");\n\t\tif (!panel) {\n\t\t\tpanel = document.createElement(\"nine-table-filter-panel\");\n\t\t\tthis.#sheet.appendChild(panel);\n\t\t}\n\t\tthis.#filterPanel = panel;\n\t}\n\n\tisFiltering() {\n\t\treturn this.#isFiltering;\n\t}\n\n\tclear = (colnm) => {\n\t\tif (colnm) {\n\t\t\tdelete this.#filters[colnm];\n\t\t} else {\n\t\t\tthis.#filters = {};\n\t\t}\n\n\t\tthis.#isFiltering = Object.keys(this.#filters).length > 0;\n\t\tthis.#applyFiltering();\n\n\t\tthis.#sheet.querySelectorAll(\"nine-table-filter-button\").forEach(btn => {\n\t\t\tbtn.updateFilteredState();\n\t\t});\n\t}\n\n\tset = (oFilter) => {\n\n\t\tlet jsonFilter = Array.isArray(oFilter)\n\t\t\t? Object.fromEntries(Object.keys(oFilter[0]).map(k => [k, [...new Set(oFilter.map(item => item[k]))]]))\n\t\t\t: oFilter;\n\n\t\tthis.#filters = jsonFilter;\n\t\tthis.#isFiltering = Object.keys(jsonFilter).length > 0;\n\t\tthis.#sheet.toggleAttribute(\"filtering\", this.#isFiltering);\n\n\t\tthis.#applyFiltering();\n\t}\n\n\t#applyFiltering() {\n\t\tconst hostData = this.#host.data;\n\t\tconst rawRecords = hostData.getArray();\n\t\tconst fields = this.#host.data.getHostFields();\n\t\tconst sheetIndex = this.#sheet.index;\n\t\tconst exprEngine = this.#host.exprEngine;\n\n\t\tconst hasFilters = Object.keys(this.#filters).length > 0;\n\n\t\tif (!hasFilters) {\n\t\t\trawRecords.forEach(record => {\n\t\t\t\tif (record?.m?._?.[NINE_TABLE.META.INDEX.FILTER]) {\n\t\t\t\t\trecord.m._[NINE_TABLE.META.INDEX.FILTER][sheetIndex] = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.#sheet.invalidate();\n\t\t\treturn;\n\t\t}\n\n\t\tconst filterRules = Object.entries(this.#filters).map(([targetKey, allowedValues]) => {\n\t\t\tconst isExpr = targetKey.includes(\"data.\") || targetKey.includes(\"host.\") || targetKey.includes(\"rowItem.v\");\n\t\t\treturn {\n\t\t\t\ttargetKey,\n\t\t\t\tisExpr,\n\t\t\t\tfieldIdx: !isExpr ? fields.indexOf(targetKey) : -1,\n\t\t\t\tallowedSet: new Set(allowedValues)\n\t\t\t};\n\t\t});\n\n\t\trawRecords.forEach((record, recordIdx) => {\n\t\t\tif (!record) return;\n\n\t\t\tif (!record.m._[NINE_TABLE.META.INDEX.FILTER]) {\n\t\t\t\trecord.m._[NINE_TABLE.META.INDEX.FILTER] = [];\n\t\t\t}\n\n\t\t\tlet isPass = true;\n\n\t\t\tfor (let i = 0; i < filterRules.length; i++) {\n\t\t\t\tconst { targetKey, isExpr, fieldIdx, allowedSet } = filterRules[i];\n\t\t\t\tlet val = undefined;\n\n\t\t\t\tif (isExpr && exprEngine) {\n\t\t\t\t\tval = exprEngine.evaluate(targetKey, record, recordIdx);\n\t\t\t\t} else if (fieldIdx >= 0 && record.v) {\n\t\t\t\t\tval = record.v[fieldIdx];\n\t\t\t\t}\n\n\t\t\t\tif (!allowedSet.has(val)) {\n\t\t\t\t\tisPass = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\trecord.m._[NINE_TABLE.META.INDEX.FILTER][sheetIndex] = isPass;\n\t\t});\n\n\t\tthis.#sheet.selection.clear();\n\n\t\tthis.#sheet.invalidate();\n\t}\n}\n\nif (!customElements.get('nine-table-filter-panel')) {\n\tcustomElements.define(\"nine-table-filter-panel\", NineTableFilterPanel);\n}\n\nif (!customElements.get('nine-table-filter-button')) {\n\tcustomElements.define(\"nine-table-filter-button\", NineTableFilterButton);\n}","// ui/data/Sorting.js (๋๋ ์ ๋ ฌ ๊ด๋ จ ์์ค)\nimport { trace } from \"@nopeer\";\n\nexport class Sorting {\n\t#sheet;\n\t#host;\n\n\t#columns = [];\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tsetTimeout(() => {\n\t\t\tthis.#initEvents();\n\t\t}, 300);\n\t}\n\n\t#initEvents() {\n\n\t\tthis.#sheet.querySelectorAll(\"thead\").forEach($el => {\n\n\t\t\t$el.addEventListener('dblclick', (e) => {\n\n\t\t\t\tconst cell = e.target.closest('th, td');\n\t\t\t\tif (!cell || cell.classList.contains('resizable-edge')) return;\n\n\t\t\t\tif ([\"INPUT\",\"CELL-CHECKBOX\"].includes(e.target.tagName)) return;\n\n\t\t\t\tif (e.offsetX <= 2 || e.offsetX >= cell.offsetWidth - 2) return;\n\n\t\t\t\tconst host = this.#sheet.getRootNode().host;\n\n\t\t\t\thost.loading = true;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#handleSort(e, cell);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\thost.loading = false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\t#handleSort(e, cell) {\n\t\tconst colIndex = cell.dataset.col;\n\t\tconst tr = cell.closest('tr');\n\t\tconst subRowIndex = tr ? tr.dataset.subrow || String(tr.sectionRowIndex) : '0';\n\n\t\tif (colIndex === undefined) return;\n\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\t\tif (!sourceTable) return;\n\n\t\tlet colName = null;\n\t\tlet exprVal = null;\n\n\t\tsourceTable.querySelectorAll(`tbody [data-col=\"${colIndex}\"]`).forEach($td => {\n\t\t\tif ($td.dataset.bind) {\n\t\t\t\tcolName = $td.dataset.bind;\n\t\t\t}\n\n\t\t\tif ($td.dataset.expr) {\n\t\t\t\texprVal = $td.dataset.expr;\n\t\t\t}\n\t\t});\n\n\t\tif (!colName && !exprVal) return;\n\n\t\tconst isAsc = cell.classList.contains('asc');\n\t\tconst isDesc = cell.classList.contains('desc');\n\n\t\tif (!e.ctrlKey && !e.shiftKey) {\n\t\t\tthis.#columns = [];\n\t\t}\n\n\t\tconst existingColIndex = this.#columns.findIndex(\n\t\t\tm => (m.colIndex === colIndex && m.subRowIndex === subRowIndex) || m.colName === colName\n\t\t);\n\n\t\tconst ruleData = {\n\t\t\tcolIndex,\n\t\t\tsubRowIndex,\n\t\t\tcolname: colName || exprVal,\n\t\t\tcolName: colName || exprVal,\n\t\t\texpr: exprVal, // ๐ก expr ๊ท์น ๋ณด๊ด\n\t\t\tasc: true,\n\t\t\t\"expr-func\": exprVal ? (record, idx) => this.#host.exprEngine(exprVal, record, idx) : null\n\t\t};\n\n\t\tif (!isAsc && !isDesc) {\n\t\t\tif (existingColIndex >= 0) {\n\t\t\t\tthis.#columns[existingColIndex].asc = true;\n\t\t\t} else {\n\t\t\t\tthis.#columns.push({ ...ruleData, asc: true });\n\t\t\t}\n\t\t} else if (isAsc) {\n\t\t\tif (existingColIndex >= 0) {\n\t\t\t\tthis.#columns[existingColIndex].asc = false;\n\t\t\t} else {\n\t\t\t\tthis.#columns.push({ ...ruleData, asc: false });\n\t\t\t}\n\t\t} else {\n\t\t\tthis.#columns = this.#columns.filter(\n\t\t\t\tm => !((m.colIndex === colIndex && m.subRowIndex === subRowIndex) || m.colName === colName)\n\t\t\t);\n\t\t}\n\n\t\tthis.#applySorting(cell);\n\t}\n\n\t#applySorting(cell) {\n\n\t\tthis.#sheet.view.setSorting(this.#columns);\n\t\tthis.#syncHeaderUI();\n\t\tthis.#sheet.invalidate();\n\t\trequestAnimationFrame(() => {\n\t\tconst cells = this.#sheet.querySelectorAll('tbody.body th, tbody.body td');\n\n\t\tcells.forEach($td => {\n\t\t\t$td.classList.remove('sorting-anim-asc', 'sorting-anim-desc', 'sorting-anim-none');\n\n\t\t\tif (cell.classList.contains('asc')) {\n\t\t\t\t$td.classList.add('sorting-anim-asc');\n\t\t\t} else if (cell.classList.contains('desc')) {\n\t\t\t\t$td.classList.add('sorting-anim-desc');\n\t\t\t} else {\n\t\t\t\t$td.classList.add('sorting-anim-none');\n\t\t\t}\n\t\t});\n\n\t\trequestAnimationFrame(() => {\n\t\t\tcells.forEach($td => {\n\t\t\t\t$td.classList.remove('sorting-anim-asc', 'sorting-anim-desc', 'sorting-anim-none');\n\t\t\t});\n\t\t});\n\t\t});\n\t}\n\n\t#syncHeaderUI() {\n\t\tthis.#sheet.querySelectorAll('thead th, thead td').forEach(el => {\n\t\t\tel.classList.remove('asc', 'desc');\n\t\t});\n\n\t\tif (this.#columns.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#columns.forEach(colRule => {\n\t\t\tconst { colIndex, subRowIndex, asc } = colRule;\n\n\t\t\tif (colIndex !== undefined) {\n\t\t\t\tlet selector = `thead [data-col=\"${colIndex}\"]`;\n\t\t\t\tif (subRowIndex !== undefined) {\n\t\t\t\t\tselector = `thead tr[data-subrow=\"${subRowIndex}\"] [data-col=\"${colIndex}\"]`;\n\t\t\t\t}\n\n\t\t\t\tconst targetHeaderCells = this.#sheet.querySelectorAll(selector);\n\t\t\t\ttargetHeaderCells.forEach(cell => {\n\t\t\t\t\tcell.classList.add(asc ? 'asc' : 'desc');\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\trestore() {\n\t\tthis.#columns = [];\n\t\tif (this.#sheet.view) {\n\t\t\tthis.#sheet.view.resetSorting();\n\t\t}\n\n\t\tthis.#syncHeaderUI();\n\t\tthis.#sheet.rowManager?.refresh(true);\n\t}\n}","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport {Grouping} from \"@/data/Grouping.js\";\n\nexport class SheetView {\n\t#sheet;\n\t#host;\n\t#sortingColumns = [];\n\t#filterRules = [];\n\t#viewIndexes = [];\n\n\t#cachedVisibleRecords = null;\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tthis.refresh();\n\t}\n\n\tgetArray = (at, colnm) => {\n\n\t\tif (!this.#cachedVisibleRecords) {\n\t\t\tconst records = this.#host.data.getArray();\n\t\t\tthis.#cachedVisibleRecords = this.#viewIndexes.map(idx => records[idx]);\n\t\t}\n\n\t\tconst visibleRecords = this.#cachedVisibleRecords;\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn visibleRecords;\n\t\t}\n\n\t\tif (at < 0 || at >= visibleRecords.length) return null;\n\n\t\tconst targetRecord = visibleRecords[at];\n\t\tif (colnm != null) {\n\t\t\tconst fields = this.#host.fields.get();\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0 && targetRecord.v) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn targetRecord;\n\t};\n\n\tcount = () => {\n\t\tif (!this.#cachedVisibleRecords) {\n\t\t\tconst records = this.#host.data.getArray();\n\t\t\tthis.#cachedVisibleRecords = this.#viewIndexes.map(idx => records[idx]);\n\t\t}\n\n\t\treturn this.#cachedVisibleRecords.length;\n\t}\n\n\tget = (at, colnm) => {\n\t\tconst visibleRecords = this.getArray();\n\t\tconst fields = this.#host.data.getHostFields?.() || [];\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn visibleRecords.map(record => this.#convSingle(record, fields));\n\t\t}\n\n\t\tif (at < 0 || at >= visibleRecords.length) return null;\n\n\t\tconst targetRecord = visibleRecords[at];\n\t\tif (!targetRecord) return null;\n\n\t\tif (colnm != null) {\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0 && targetRecord.v) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn this.#convSingle(targetRecord, fields);\n\t};\n\n\t#convSingle = (o, fields) => {\n\t\tif (!o) return null;\n\t\tconst t = {};\n\t\tfields.forEach((colnm, i) => {\n\t\t\tt[colnm] = o.v ? o.v[i] : o[colnm];\n\t\t});\n\t\tif (o.m) t.m = o.m;\n\t\tif (o._) t._ = o._;\n\t\treturn t;\n\t};\n\n\trefresh = () => {\n\n\t\tthis.#cachedVisibleRecords = null;\n\n\t\tconst rawRecords = this.#host.data.getArray();\n\t\tlet indices = [];\n\t\trawRecords.forEach((record, i) => {\n\t\t\tif (!record) return;\n\t\t\tconst filterSlot = record.m?._?.[NINE_TABLE.META.INDEX.FILTER];\n\t\t\tif (filterSlot && filterSlot[this.#sheet.index] === false) return;\n\t\t\tindices.push(i);\n\t\t});\n\n\t\tif (this.#sortingColumns.length > 0) {\n\t\t\tindices = this.#applySorting(indices, rawRecords);\n\t\t}\n\n\t\tthis.#viewIndexes = indices;\n\t\tconst validRecords = indices.map(idx => rawRecords[idx]);\n\n\t\t// ๐ก ์ํธ๋ณ ๊ทธ๋ฃนํ ์ค์ ๋ฐ ์ ํ ์ํ(collapsedMap) ๊ฐ์ ธ์ค๊ธฐ\n\t\tconst groupingManager = this.#sheet.grouping;\n\t\tconst groupColumns = groupingManager?.columns || [];\n\n\t\tif (groupColumns.length > 0) {\n\t\t\t// ๊ฐ ์ํธ๋ณ ๊ทธ๋ฃนํ ๋งค๋์ ์ ๊ด๋ฆฌ๋๋ collapsedMap์ ์ ๋ฌํ์ฌ ์ ํ ์ํ ์ ์ง\n\t\t\tconst collapsedMap = groupingManager.collapsedMap || new Map();\n\t\t\tconst groupResult = Grouping.apply(validRecords, groupColumns, this.#host.data.getHostFields(), collapsedMap);\n\n\t\t\tthis.#cachedVisibleRecords = groupResult.renderItems; // ์ต์ข
๋ ๋๋ง ์์ดํ
(์ ํ ํญ๋ชฉ ์๋ ์ ์ธ๋จ)\n\n\t\t\tgroupingManager.setGroupMap(groupResult.groupMap); // ์์ ๋งคํ ๊ณต์ \n\t\t} else {\n\t\t\tthis.#cachedVisibleRecords = validRecords;\n\t\t}\n\t}\n\n\tsetSorting = (columns) => {\n\t\tthis.#sortingColumns = columns || [];\n\t\tthis.refresh();\n\t};\n\n\tgetSorting = () => {\n\t\treturn this.#sortingColumns;\n\t};\n\n\tresetSorting = () => {\n\t\tthis.#sortingColumns = [];\n\t\tthis.refresh();\n\t};\n\n\n\t#applySorting = (indices, validRecords) => {\n\n\t\tconst fields = typeof this.#host.data.getHostFields === 'function' ? this.#host.data.getHostFields() : [];\n\n\t\tconst rulesWithIdx = this.#sortingColumns.map(rule => ({\n\t\t\t...rule,\n\t\t\tcolIndex: fields.indexOf(rule.colname || rule.colName)\n\t\t}));\n\n\t\treturn indices.sort((idxA, idxB) => {\n\t\t\tconst a = validRecords[idxA];\n\t\t\tconst b = validRecords[idxB];\n\n\t\t\tfor (const rule of rulesWithIdx) {\n\t\t\t\tconst isAsc = rule.asc;\n\t\t\t\tconst expr = rule.expr; // ๐ก ๋ฑ๋ก๋ expr ์์\n\t\t\t\tlet valA, valB;\n\n\t\t\t\tif (expr) {\n\t\t\t\t\tvalA = this.#host.exprEngine.evaluate(expr, a, idxA);\n\t\t\t\t\tvalB = this.#host.exprEngine.evaluate(expr, b, idxB);\n\t\t\t\t} else {\n\t\t\t\t\tif (rule.colIndex >= 0 && a.v && b.v) {\n\t\t\t\t\t\tvalA = a.v[rule.colIndex];\n\t\t\t\t\t\tvalB = b.v[rule.colIndex];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst isEmptyA = (valA === null || valA === undefined || valA === '');\n\t\t\t\tconst isEmptyB = (valB === null || valB === undefined || valB === '');\n\n\t\t\t\tif (isEmptyA && isEmptyB) continue;\n\t\t\t\tif (isEmptyA) return 1;\n\t\t\t\tif (isEmptyB) return -1;\n\n\t\t\t\tif (valA !== valB) {\n\t\t\t\t\tlet diff = 0;\n\n\t\t\t\t\tif (typeof valA === 'number' && typeof valB === 'number') {\n\t\t\t\t\t\tdiff = valA - valB;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst strA = String(valA);\n\t\t\t\t\t\tconst strB = String(valB);\n\t\t\t\t\t\tdiff = strA > strB ? 1 : (strA < strB ? -1 : 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (diff !== 0) {\n\t\t\t\t\t\treturn isAsc ? diff : -diff;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn idxA - idxB;\n\t\t});\n\t};\n}","import { trace } from \"@nopeer\";\nimport { TableCompiler } from \"@/layout/core/TableCompiler.js\";\n\nexport const COLLAPSED_WIDTH = 16;\n\nexport class PreCompiler {\n\n static initializeTable(host, tbl) {\n\n PreCompiler.#ensureColgroup(tbl);\n PreCompiler.#ensureThead(tbl);\n PreCompiler.#ensureSectionTbodys(tbl);\n\n PreCompiler.#ensureRowIndicator(tbl);\n\n PreCompiler.#normalizeColAttributes(tbl);\n\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('thead tr'));\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('tbody.body tr[grouping=\"true\"]'));\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('tbody.body tr:not([grouping=\"true\"])'));\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('tfoot tr'));\n\n PreCompiler.#createColIndicator(tbl);\n\n PreCompiler.#normalizeCollapsibleAttributes(tbl);\n\n PreCompiler.#generateCell(host, tbl);\n\n PreCompiler.#initColExpanders(tbl);\n\n PreCompiler.#initFilterButtons(host, tbl);\n\n PreCompiler.#applyInitialCellWidths(tbl);\n\n return tbl;\n }\n\n static #createColIndicator(tbl) {\n const thead = tbl.querySelector('thead');\n if (!thead || thead.querySelector('.col-indicator-rowgroup')) return;\n\n const tdTmpl = `<th data-col=\"@col\" class=\"col-indicator\" scope=\"col\"></th>`;\n\n const tr = thead.insertRow(0);\n tr.setAttribute('role', 'row');\n tr.classList.add('col-indicator-rowgroup');\n tr.classList.add('collapse');\n\n const firstRow = tbl.querySelector('tbody tr');\n if (!firstRow) return;\n\n let cnt = 0;\n firstRow.querySelectorAll('th, td').forEach(td => {\n if (!td.classList.contains('dummy')) {\n const colSpan = td.colSpan || 1;\n for (let i = 0; i < colSpan; i++) {\n const html = tdTmpl.replace('@col', cnt).replace('@text', PreCompiler.#numToExcelCol(cnt++));\n tr.insertAdjacentHTML('beforeend', html);\n }\n }\n });\n\n const cols = Array.from(tbl.querySelectorAll('colgroup col'));\n tr.querySelectorAll('.col-indicator').forEach((el, i) => {\n const background = cols[i].getAttribute('background');\n if (background) {\n el.style.background = background;\n }\n });\n }\n\n static #numToExcelCol(num) {\n let text = '';\n for (let n = num; n >= 0; n = Math.floor(n / 26) - 1) {\n text = String.fromCharCode(65 + (n % 26)) + text;\n }\n return text;\n }\n\n static #ensureSectionTbodys(tbl) {\n let tbody = tbl.querySelector('tbody:not(.head):not(.foot)');\n\n if (!tbody) return;\n\n tbody.classList.add('body');\n\n if (!tbl.querySelector('tbody.head')) {\n const headTbody = document.createElement('tbody');\n headTbody.classList.add('head');\n tbody.before(headTbody);\n }\n\n if (!tbl.querySelector('tbody.foot')) {\n const footTbody = document.createElement('tbody');\n footTbody.classList.add('foot');\n tbody.after(footTbody);\n }\n }\n\n static #ensureColgroup(tbl) {\n let colgroup = tbl.querySelector('colgroup');\n if (!colgroup) {\n colgroup = document.createElement('colgroup');\n tbl.prepend(colgroup);\n }\n\n if (colgroup.querySelectorAll('col').length === 0) {\n const firstRow = tbl.querySelector('tbody tr');\n let colCount = 1;\n if (firstRow) {\n colCount = Array.from(firstRow.querySelectorAll('th, td')).reduce((sum, cell) => {\n return sum + (parseInt(cell.getAttribute('colspan') || cell.colSpan, 10) || 1);\n }, 0);\n }\n colCount = Math.max(colCount, 1);\n\n for (let i = 0; i < colCount; i++) {\n const col = document.createElement('col');\n colgroup.appendChild(col);\n }\n }\n }\n\n static #normalizeColAttributes(tbl) {\n const cols = Array.from(tbl.querySelectorAll('colgroup col'));\n if (cols.length === 0) return;\n\n const containerWidth = tbl.clientWidth || 0;\n const defaultWidth = Math.max(Math.floor(containerWidth / cols.length), 100);\n\n cols.forEach((col, i) => {\n\n if (!col.hasAttribute('data-col')) {\n col.setAttribute('data-col', i);\n }\n\n const width = col.getAttribute('width') || parseInt(col.style.width, 10) || defaultWidth;\n col.setAttribute('width', width);\n\n const widthVal = String(width).includes('px') ? width : `${width}px`;\n col.style.width = col.style.minWidth = col.style.maxWidth = widthVal;\n });\n }\n\n static #ensureThead(tbl) {\n // 1. ๊ธฐ๋ณธ ๋ฉ์ธ thead (not .foot) ๋ณด์ฅ\n let thead = tbl.querySelector('thead:not(.foot)');\n if (!thead) {\n thead = document.createElement('thead');\n }\n\n const colgroup = tbl.querySelector('colgroup');\n if (colgroup) {\n colgroup.after(thead);\n } else {\n tbl.prepend(thead);\n }\n\n let theadFoot = tbl.querySelector('thead.foot');\n if (!theadFoot) {\n theadFoot = document.createElement('thead');\n theadFoot.classList.add('foot');\n thead.after(theadFoot); // ๋ฉ์ธ thead ๋ฐ๋ก ๋ค์ ์์นํ๋๋ก ๋ฐฐ์น\n }\n }\n\n\n static #normalizeCollapsibleAttributes(tbl) {\n const headers = tbl.querySelectorAll('thead th, thead td');\n headers.forEach(cell => {\n const isCollapsed = cell.getAttribute('collapsed') === 'true';\n if (isCollapsed && cell.getAttribute('collapsible') !== 'true') {\n cell.setAttribute('collapsible', 'true');\n }\n });\n }\n\n static #generateCell(host, $tbl) {\n\n const targetAttributes = ['data-bind', 'data-expr', 'type'];\n let autoIdCounter = 0;\n\n $tbl.querySelectorAll('tbody th, tbody td').forEach($cell => {\n const cellType = $cell.getAttribute('cell-type') || \"renderer\";\n const tagName = `cell-${cellType}`;\n\n const $datalist = $cell.querySelector(\"datalist\");\n\n if ($datalist) {\n let l = [];\n $datalist.querySelectorAll('option').forEach($option => {\n l.push({\n k: $option.getAttribute(\"k\"),\n v: $option.getAttribute(\"v\"),\n value: $option.getAttribute(\"value\"),\n });\n });\n\n const uniqueFuncName = `__ds_${Date.now()}_${++autoIdCounter}`;\n\n if (host) {\n host[uniqueFuncName] = () => l;\n }\n\n $cell.setAttribute(\"data-source\", `host.${uniqueFuncName}()`);\n\n $datalist.remove();\n }\n\n const $tr = $cell.closest('tr');\n const expr = $cell.dataset.expr;\n if (expr) {\n $cell.setAttribute('data-expr', host.exprEngine.precompile(expr, $tr.getAttribute(\"grouping\") === \"true\"));\n }\n\n Array.from($cell.attributes).forEach(attr => {\n if (['data-bind', 'data-expr', 'cell-type', 'validator'].includes(attr.name)) return;\n if (attr.value.includes(\"data.\") || attr.value.includes(\"host.\")) {\n $cell.setAttribute(attr.name, host.exprEngine.precompile(attr.value));\n }\n });\n\n const innerAttrs = targetAttributes\n .filter(attr => $cell.hasAttribute(attr))\n .map(attr => `${attr}=\"${$cell.getAttribute(attr)}\"`);\n\n $cell.innerHTML = `<${tagName} ${innerAttrs.join(' ')}></${tagName}>`;\n $cell.setAttribute('tabindex', '0');\n });\n\n $tbl.querySelectorAll('thead th, thead td, tfoot th, tfoot td').forEach($cell => {\n const cellType = $cell.getAttribute('cell-type');\n if (cellType) {\n const originalContent = $cell.innerHTML;\n const tagName = `cell-${cellType}`;\n const innerAttrs = targetAttributes\n .filter(attr => $cell.hasAttribute(attr))\n .map(attr => `${attr}=\"${$cell.getAttribute(attr)}\"`);\n\n $cell.innerHTML = `<${tagName} ${innerAttrs.join(' ')} content=\"${originalContent}\"></${tagName}>`;\n }\n });\n }\n\n static #initFilterButtons(host, tbl) {\n const hostFilter = host.getAttribute('filtering') === 'true';\n const tableFilter = tbl.getAttribute('filtering') === 'true';\n\n tbl.querySelectorAll('thead tr:not(.col-indicator-rowgroup) th, thead tr:not(.col-indicator-rowgroup) td').forEach(cell => {\n const finalFiltering = cell.getAttribute('filtering') === 'true' || tableFilter || hostFilter;\n\n cell.setAttribute('filtering', finalFiltering ? 'true' : 'false');\n\n if (finalFiltering) {\n cell.appendChild(document.createElement('nine-table-filter-button'));\n }\n });\n }\n\n static #initColExpanders(tbl) {\n\n tbl.querySelectorAll('thead th, thead td').forEach(cell => {\n const isCollapsible = cell.getAttribute('collapsible') === 'true' || cell.getAttribute('expandable') === 'true';\n if (!isCollapsible) return;\n\n const colIndex = parseInt(cell.dataset.col, 10);\n const colSpan = cell.colSpan || 1;\n const col = tbl.querySelector(`colgroup col[data-col=\"${colIndex}\"]`);\n\n const currentWidth = col ? (parseInt(col.getAttribute('width'), 10) || 100) : 100;\n\n if (!cell.dataset.expandWidth || parseInt(cell.dataset.expandWidth, 10) <= COLLAPSED_WIDTH) {\n cell.dataset.expandWidth = String(currentWidth > COLLAPSED_WIDTH ? currentWidth : 100);\n }\n\n let expandBtn = cell.querySelector('nine-table-col-expand');\n if (!expandBtn) {\n expandBtn = document.createElement('nine-table-col-expand');\n cell.insertBefore(expandBtn, cell.firstChild);\n }\n\n const isCollapsed = cell.getAttribute('collapsed') === 'true';\n\n if (isCollapsed) {\n expandBtn.classList.add('collapsed');\n expandBtn.classList.remove('expand');\n expandBtn.setAttribute('collapsed', 'true');\n cell.style.color = 'transparent';\n\n const targetWidth = Math.max(10, Math.floor(COLLAPSED_WIDTH / colSpan));\n if (!isNaN(colIndex)) {\n for (let i = 0; i < colSpan; i++) {\n const targetCol = tbl.querySelector(`colgroup col[data-col=\"${colIndex + i}\"]`);\n if (targetCol) {\n targetCol.setAttribute('width', targetWidth);\n targetCol.style.width = targetCol.style.minWidth = targetCol.style.maxWidth`${targetWidth}px`;\n }\n }\n }\n } else {\n expandBtn.classList.remove('collapsed');\n expandBtn.classList.add('expand');\n expandBtn.setAttribute('collapsed', 'false');\n cell.style.color = '';\n }\n });\n }\n\n static #ensureRowIndicator(tbl, host) {\n const w = tbl.getAttribute(\"row-indicator\") === 'true' ? 48 : 4;\n const colgroup = tbl.querySelector('colgroup');\n\n // row-indicator์ฉ col์ด ์ด๋ฏธ ์๋ค๋ฉด ์ถ๊ฐ\n if (colgroup && !colgroup.querySelector('.row-indicator-col')) {\n const col = document.createElement('col');\n col.className = 'row-indicator-col';\n col.setAttribute('fixed', 'left');\n col.setAttribute('width', w);\n col.style.width = col.style.minWidth = col.style.maxWidth = `${w}px`;\n colgroup.prepend(col);\n }\n\n tbl.querySelectorAll('thead, tbody, tfoot').forEach(section => {\n const rows = Array.from(section.querySelectorAll('tr'));\n if (rows.length === 0) return;\n\n // 1. ํ๋ค์ ๊ท์น์ ๋ง๊ฒ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ๊ธฐ\n const groups = [];\n let currentGroup = null;\n\n rows.forEach(tr => {\n // col-indicator ์ ์ฉ ํ ๋ฑ์ ์ ์ธ ์ฒ๋ฆฌ\n if (tr.classList.contains('col-indicator-rowgroup')) return;\n\n const isGrouping = tr.getAttribute('grouping') === 'true';\n\n if (isGrouping) {\n // grouping=\"true\"์ธ ํ์ ์ฐ์ ์ฌ๋ถ์ ์๊ด์์ด '๊ฐ๊ฐ ๋
๋ฆฝ๋ ๋จ๋
๊ทธ๋ฃน'์ผ๋ก ๋ถ๋ฆฌ\n groups.push({ isGrouping: true, rows: [tr] });\n currentGroup = null; // ์ผ๋ฐ ๊ทธ๋ฃน ์ฒด์ด๋ ๋๊ธฐ\n } else {\n // ์ผ๋ฐ ํ๋ค์ ์ฐ์๋๋ ๊ฒฝ์ฐ ํ๋์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์\n if (!currentGroup || currentGroup.isGrouping !== false) {\n currentGroup = { isGrouping: false, rows: [tr] };\n groups.push(currentGroup);\n } else {\n currentGroup.rows.push(tr);\n }\n }\n });\n\n // 2. ๊ฐ ๊ทธ๋ฃน๋ณ๋ก ์ฒซ ๋ฒ์งธ tr์ row-indicator ์ฝ์
\n groups.forEach(group => {\n const groupRows = group.rows;\n if (groupRows.length === 0) return;\n\n const firstTr = groupRows[0];\n\n // ์ด๋ฏธ ํด๋น ํ์ row-indicator๊ฐ ์กด์ฌํ๋ฉด ์ค๋ณต ์์ฑ ๋ฐฉ์ง\n if (firstTr.querySelector(':scope > th.row-indicator')) return;\n\n const indicatorCell = document.createElement('th');\n indicatorCell.className = 'row-indicator';\n indicatorCell.setAttribute('cell-type', 'row-indicator');\n\n // grouping ๊ทธ๋ฃน์ ํญ์ rowSpan=1, ์ผ๋ฐ ๊ทธ๋ฃน์ ์ฐ์๋ ํ ๊ฐ์(groupRows.length)๋งํผ ์ง์ \n if (!group.isGrouping && groupRows.length > 1) {\n indicatorCell.rowSpan = groupRows.length;\n }\n\n firstTr.insertBefore(indicatorCell, firstTr.firstElementChild);\n });\n });\n }\n\n static #applyInitialCellWidths(tbl) {\n\n tbl.querySelectorAll('th[data-col], td[data-col]').forEach(cell => {\n\n const startColIdx = parseInt(cell.getAttribute('data-col'), 10);\n if (isNaN(startColIdx)) return;\n\n\n const colSpan = parseInt(cell.getAttribute('colspan') || cell.colSpan, 10) || 1;\n let totalWidth = 0;\n\n\n for (let i = 0; i < colSpan; i++) {\n const targetIdx = startColIdx + i;\n const col = tbl.querySelector(`colgroup col[data-col=\"${targetIdx}\"]`);\n if (col) {\n totalWidth += parseInt(col.getAttribute('width'), 10) || 100;\n }\n }\n });\n }\n}\n","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\n\nexport class SheetAPI {\n #sheet;\n #host;\n #elements;\n\n constructor(sheet) {\n this.#sheet = sheet;\n this.#host = sheet.getRootNode().host;\n\n //this.#resetElements();\n }\n\n #resetElements = () => {\n this.#elements = {\n viewport: this.#sheet.querySelector('.ng-sheet-body'),\n thead: this.#sheet.querySelector('thead'),\n tbody: this.#sheet.querySelector('tbody.body'),\n tfoot: this.#sheet.querySelector('tfoot'),\n thead_foot: this.#sheet.querySelector('thead.foot'),\n tbody_head: this.#sheet.querySelector('tbody.head'),\n tbody_foot: this.#sheet.querySelector('tbody.foot'),\n }\n };\n\n get elem() {\n\n if (this.#elements?.tbody_foot) return this.#elements;\n\n this.#elements = {\n viewport: this.#sheet.querySelector('.ng-sheet-body'),\n thead: this.#sheet.querySelector('thead'),\n tbody: this.#sheet.querySelector('tbody.body'),\n tfoot: this.#sheet.querySelector('tfoot'),\n thead_foot: this.#sheet.querySelector('thead.foot'),\n tbody_head: this.#sheet.querySelector('tbody.head'),\n tbody_foot: this.#sheet.querySelector('tbody.foot'),\n }\n\n return this.#elements;\n }\n\n get viewport() {\n const self = this;\n\n return {\n get tr() {\n return {\n get length() {\n return Math.ceil(self.#sheet.querySelector('.ng-container-body tbody.body tr:last-child').sectionRowIndex / self.#sheet.template.length);\n },\n count() {\n return this.length;\n }\n };\n },\n get group() {\n return {\n get length() {\n return self.#sheet.source.table.querySelectorAll(\"tbody tr[grouping='true']\").length;\n },\n count() {\n return this.length;\n }\n };\n },\n get fixedHeight() {\n const getHeight = () => {\n return (self.elem.thead?.offsetHeight || 0) +\n (self.elem.thead_foot?.offsetHeight || 0) +\n (self.elem.tfoot?.offsetHeight || 0) +\n (self.elem.tbody_head?.offsetHeight || 0);\n }\n\n let h = getHeight();\n\n if (h === 0) {\n self.#resetElements();\n h = getHeight();\n }\n\n return h;\n },\n get height() {\n return self.elem.viewport.offsetHeight;\n },\n get innerHeight() {\n const viewPortHeight = self.elem.viewport.clientHeight;\n return viewPortHeight - this.fixedHeight; // ๐ก ๋์ผ ๊ฐ์ฒด ๋ด๋ถ์ด๋ฏ๋ก this.fixedHeight ์ฌ์ฉ\n },\n get outerHeight() {\n return self.elem.viewport.offsetHeight;\n }\n };\n };\n\n\n\n\n\n col = {\n // 1. ํน์ ์ปฌ๋ผ์ ๋๋น ์ค์ (ColResizer ํ์ฉ)\n setWidth: (colIndex, width, containerType = null) => {\n const targetCols = Array.from(this.#sheet.querySelectorAll(`table colgroup col[data-col=\"${colIndex}\"]`));\n targetCols.forEach(col => {\n col.setAttribute('width', width);\n col.style.width = `${width}px`;\n });\n\n },\n\n // 2. ํน์ ์ปฌ๋ผ์ ํ์ฌ ๋๋น ๊ฐ์ ธ์ค๊ธฐ\n getWidth: (colIndex) => {\n const colEl = this.#sheet.querySelector(`table colgroup col[data-col=\"${colIndex}\"]`);\n if (!colEl) return 0;\n return parseInt(colEl.getAttribute('width') || colEl.style.width, 10) || 0;\n },\n measureAutoFitColumnWidth: (cell, tbodyCell) => {\n\n const fieldIdx = this.#host.fields.get().indexOf(tbodyCell.dataset.bind);\n const computedStyle = window.getComputedStyle(tbodyCell);\n const font = computedStyle.font || '12px sans-serif';\n let maxTextWidth = 32;\n\n this.#sheet.view.getArray().forEach((record, idx) => {\n const val = String(tbodyCell.dataset.expr ? this.#host.exprEngine.evaluate(tbodyCell.dataset.expr, record, idx) : record.v[fieldIdx] ?? \"\").trim();\n const size = nine.measureTextSize(val, font);\n if (size.width && size.width > maxTextWidth) {\n maxTextWidth = size.width;\n }\n });\n\n return maxTextWidth;\n },\n // 3. ํน์ ์ปฌ๋ผ ์๋ ๋ง์ถค (์๊น ๋ถ๋ฆฌํ measureAutoFitColumnWidth ์ฐ๋)\n autoFit: (colIndex) => {\n const cell = this.#sheet.querySelector(`thead th[data-col=\"${colIndex}\"]`);\n const tbodyCell = this.#sheet.querySelector(`tbody.body [data-col=\"${colIndex}\"]`);\n\n if (!cell || !tbodyCell) return;\n\n this.#host.execute(() => {\n const calculatedWidth = this.col.measureAutoFitColumnWidth(cell, tbodyCell);\n if (calculatedWidth !== null) {\n this.col.setWidth(colIndex, calculatedWidth);\n }\n });\n },\n\n // 4. ์ปฌ๋ผ ํ์/์จ๊น ์ฒ๋ฆฌ\n setVisible: (colIndex, isVisible) => {\n const targets = this.#sheet.querySelectorAll(`table colgroup col[data-col=\"${colIndex}\"], th[data-col=\"${colIndex}\"], td[data-col=\"${colIndex}\"]`);\n targets.forEach(el => {\n el.style.display = isVisible ? '' : 'none';\n });\n this.#sheet.rowManager?.refresh();\n }\n };\n\n row = {\n at: () => {\n if (this.#sheet.selection.minRow < 0) return -1;\n return Math.floor(this.#sheet.selection.minRow / this.#sheet.template.length);\n },\n focus: async (index, callback) => {\n // 1. ํ๋ฉด์ ์ ๋ณด์ด๋ฉด moveTo ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆผ\n if (!this.#sheet.row.isVisible(index)) {\n await new Promise((resolve) => {\n this.#sheet.row.moveTo(index, () => {\n resolve();\n });\n });\n } else {\n // 2. ์ด๋ฏธ ๋ณด์ด๋๋ผ๋ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ํ์ ํ ํ
ํฌ ์๋ณด (requestAnimationFrame)\n await new Promise((resolve) => requestAnimationFrame(resolve));\n }\n\n // 3. ๋ ๋๋ง์ด ์์ ํ ์์ ํ๋ ์์ ์ DOM ์กฐํ ๋ฐ ์ ํ ์ฒ๋ฆฌ\n const $trs = this.#sheet.querySelectorAll(`tbody.body tr[data-index=\"${index}\"]`);\n const matrixRows = Array.from($trs, $tr => parseInt($tr.dataset.matrixRow, 10)).filter(n => !isNaN(n));\n\n const cols = [];\n $trs.forEach($tr => {\n $tr.querySelectorAll('td, th').forEach($cell => {\n const col = parseInt($cell.dataset.col, 10);\n if (col != 0) cols.push(parseInt($cell.dataset.col, 10));\n });\n });\n\n if (matrixRows.length === 0 || cols.length === 0) return;\n\n const result = this.#sheet.selection.setRange(Math.min(...matrixRows), Math.min(...cols), Math.max(...matrixRows), Math.max(...cols));\n\n if (typeof callback === 'function') {\n callback();\n }\n\n return result;\n },\n isVisible: (index) => {\n\n const $sheetBody = this.#sheet.querySelector('.ng-sheet-body');\n\n const $trs = $sheetBody.querySelectorAll(`.ng-container-body tbody.body tr[data-index=\"${index}\"]`);\n if (!$trs || $trs.length === 0) return false;\n\n const viewportRect = $sheetBody.getBoundingClientRect();\n const theadHeight = $sheetBody.querySelector('thead')?.offsetHeight || 0;\n const tfootHeight = $sheetBody.querySelector('tfoot')?.offsetHeight || 0;\n\n const viewportTop = viewportRect.top + theadHeight;\n const viewportBottom = viewportRect.bottom - tfootHeight;\n\n let isVisible = true;\n\n for (const $tr of $trs) {\n const trRect = $tr.getBoundingClientRect();\n\n const isAbove = trRect.top < viewportTop;\n const isBelow = trRect.bottom > viewportBottom;\n\n if (isAbove || isBelow) {\n isVisible = false;\n break;\n }\n }\n\n return isVisible;\n },\n add: (dataSource, updateState) => {\n return this.#host.data.add(dataSource, updateState);\n },\n moveTo: (index, callback) => {\n if (this.#sheet.row.isVisible(index)) {\n if (typeof callback === 'function') callback();\n } else {\n this.#sheet.scrollTo(index, () => {\n if (typeof callback === 'function') callback();\n });\n }\n },\n insert: (index, dataSource, updateState = true) => {\n\n const currentJson = this.#sheet.view.get(index);\n const rowid = currentJson.m._[NINE_TABLE.META.INDEX.ROWID];\n\n const toRowid = this.#host.data.insert(rowid, dataSource, updateState);\n const records = this.#sheet.view.getArray();\n\n const targetIndex = records.findIndex(record => {\n if (!record || !record.m || !record.m._) return false;\n return record.m._[NINE_TABLE.META.INDEX.ROWID] === toRowid; // ํ์
์ฐจ์ด ๋ฐฉ์ง๋ฅผ ์ํด == ์ฌ์ฉ\n });\n\n return targetIndex;\n },\n remove: (index) => {\n\n const currentJson = this.#sheet.view.get(index);\n const rowid = currentJson.m._[NINE_TABLE.META.INDEX.ROWID];\n\n this.#host.data.remove(rowid);\n },\n };\n}","import { trace } from \"@nopeer\";\nimport './nine-table-hscrollbar.js';\nimport './nine-table-vscrollbar.js';\nimport { RowManager } from './core/RowManager.js';\nimport { TableCompiler } from \"./core/TableCompiler.js\";\nimport { CellSelection } from \"@/cell-manager/CellSelection.js\";\nimport { CellNavigation } from \"@/cell-manager/CellNavigation.js\";\n\nimport { ColResizer } from \"@/col/ColResizer.js\";\nimport { ColMover } from \"@/col/ColMover.js\";\nimport { ColFixManager } from \"@/col/ColFixManager.js\";\n\nimport { Filtering } from \"@/data/Filtering.js\";\nimport { GroupingManager } from \"@/data/Grouping.js\";\nimport { Sorting } from \"@/data/Sorting.js\";\nimport { SheetView } from \"@/data/SheetView.js\";\n\nimport { PreCompiler } from \"@/layout/core/PreCompiler.js\";\nimport { SheetAPI } from \"@/api/SheetAPI.js\";\n\nexport class NineTableSheet extends HTMLElement {\n #index;\n #host;\n #rowManager;\n #cellSelection;\n #cellNavigation;\n #colResizer;\n #colMover;\n #colFix;\n #sorting;\n #filtering;\n #grouping;\n #api;\n\n #view;\n\n #source = {\n table: null,\n };\n\n #elements;\n\n #template = {\n length: 0,\n height: 0,\n heights: [],\n group: {\n length: 0,\n height: 0,\n heights: [],\n },\n };\n\n static SCROLLBAR_SIZE = 16;\n\n constructor() {\n super();\n\n this.#host = this.getRootNode().host;\n this.#rowManager = new RowManager(this);\n\n this.#api = new SheetAPI(this);\n\n this.#bindApiMethods();\n }\n\n connectedCallback() {\n this.#init();\n }\n\n get template() { return this.#template; }\n get index() { return this.#index; }\n get colResizer() { return this.#colResizer; }\n get filtering() { return this.#filtering; }\n get grouping() { return this.#grouping; }\n get colMover() { return this.#colMover; }\n get colFix() { return this.#colFix; }\n get rowManager() { return this.#rowManager; }\n get selection() { return this.#cellSelection; }\n get navigation() { return this.#cellNavigation; }\n get templateLength() { return this.#source.tbody.tr.length || 0; }\n\n get elements() { return this.#elements; }\n\n /**\n get template() {\n return {\n length: this.#source?.tbody?.tr?.length || 0,\n trs: this.#source?.tbody?.tr || []\n };\n } */\n\n get isAutoFitCol() {\n const attrTrue = this.getAttribute('auto-fit-col') === 'true' || this.#host?.getAttribute('auto-fit-col') === 'true';\n const sourceTableTrue = this.#source.table?.getAttribute('auto-fit-col') === 'true';\n return attrTrue || sourceTableTrue;\n }\n\n get sourceTable() {\n return this.#source.table;\n }\n\n get source() {\n return this.#source;\n }\n\n get #isSimple() {\n return this.#host.hasAttribute('simple') || this.#host.getAttribute('theme') === 'simple';\n }\n\n scrollTo = (dataRow, callback) => {\n this.rowManager.scrollToDataRow(dataRow, 'top', callback);\n }\n\n recompileAndRefresh() {\n if (!this.#source.table) return;\n\n TableCompiler.recompile(this.#source.table);\n\n ['left', 'right', 'body'].forEach(type => {\n ['header', 'body', 'footer'].forEach(section => {\n const container = this.querySelector(`.ng-sheet-${section} .ng-container-${type}`);\n if (!container) return;\n container.querySelectorAll('table').forEach(tbl => tbl.remove());\n });\n });\n\n this.#renderSplitContainers();\n\n this.#updateContainerWidths();\n\n this.#rowManager.initialize();\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n } else {\n this.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n requestAnimationFrame(() => {\n this.#updateContainerWidths();\n this.#rowManager?.refresh();\n });\n }\n\n refreshLayout() {\n\n requestAnimationFrame(() => {\n\n if (!this.classList.contains('active') || !this.#source.table) return;\n\n this.#updateContainerWidths();\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n } else {\n this.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n this.#adjustOverlay();\n\n this.#colResizer?.refreshLayout();\n\n this.#rowManager?.refresh();\n });\n }\n\n #adjustOverlay = () => {\n const $thead = this.querySelector('.ng-container-body thead');\n const $overlay = this.querySelector('.nodata-overlay');\n if ($overlay) {\n $overlay.style.top = `${$thead?.offsetHeight}px`;\n }\n }\n\n get view() {\n if (!this.#view && this.#host?.data) {\n this.#view = new SheetView(this);\n }\n return this.#view;\n }\n\n invalidate = () => {\n\n this.view.refresh();\n\n this.#rowManager.refresh(true);\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n }\n };\n\n autoFit = (enable = true) => {\n requestAnimationFrame(() => {\n this.#autoFit?.(enable);\n });\n };\n\n #autoFit = (enable = true) => {\n\n const container = this.querySelector('.ng-sheet-body .ng-container-body');\n if (!container) return;\n\n const firstColgroup = this.querySelector('.ng-container-body table colgroup');\n if (!firstColgroup) return;\n\n if (enable) {\n this.setAttribute('auto-fit-col', 'true');\n const containerWidth = container.clientWidth;\n if (containerWidth <= 0) return;\n\n let totalOriginalWidth = 0;\n const colList = [];\n\n firstColgroup.querySelectorAll('col').forEach(col => {\n const globalColIndex = col.getAttribute('data-col');\n const headerCell = this.querySelector(`thead th[data-col=\"${globalColIndex}\"]`);\n const isCollapsed = headerCell?.getAttribute('collapsed') === 'true';\n\n if (isCollapsed) {\n colList.unshift({ globalColIndex, width: 16, isCollapsed: true });\n } else {\n const w = parseInt(col.getAttribute('width'), 10) || 100;\n colList.push({ globalColIndex, width: w, isCollapsed: false });\n totalOriginalWidth += w;\n }\n });\n\n const collapsedTotalWidth = colList\n .filter(c => c.isCollapsed)\n .reduce((sum, c) => sum + c.width, 0);\n\n const availableWidth = Math.max(0, containerWidth - collapsedTotalWidth);\n\n if (totalOriginalWidth > 0 && colList.length > 0) {\n let allocatedTotal = 0;\n\n const calculatedCols = colList.map(item => {\n if (item.isCollapsed) {\n return { globalColIndex: item.globalColIndex, remainder: 0, width: 16 };\n }\n\n const exactWidth = (item.width * availableWidth) / totalOriginalWidth;\n const baseWidth = Math.max(30, Math.floor(exactWidth));\n allocatedTotal += baseWidth;\n return {\n globalColIndex: item.globalColIndex,\n remainder: exactWidth - Math.floor(exactWidth),\n width: baseWidth\n };\n });\n\n let remainderPixels = availableWidth - allocatedTotal;\n\n const uncollapsedCols = calculatedCols.filter(c => !colList.find(item => item.globalColIndex === c.globalColIndex)?.isCollapsed);\n\n if (remainderPixels > 0 && uncollapsedCols.length > 0) {\n uncollapsedCols.sort((a, b) => b.remainder - a.remainder);\n for (let i = 0; i < remainderPixels; i++) {\n uncollapsedCols[i % uncollapsedCols.length].width += 1;\n }\n } else if (remainderPixels < 0 && uncollapsedCols.length > 0) {\n uncollapsedCols.sort((a, b) => a.remainder - b.remainder);\n for (let i = 0; i < Math.abs(remainderPixels); i++) {\n const target = uncollapsedCols[i % uncollapsedCols.length];\n if (target.width > 30) target.width -= 1;\n }\n }\n\n calculatedCols.forEach(({ globalColIndex, width }) => {\n this.#colResizer?.setColumnWidth(globalColIndex, width, 'body');\n });\n }\n } else {\n this.removeAttribute('auto-fit-col');\n }\n\n this.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n generateTemplate = ($table, index) => {\n\n const activeParent = (v) => {\n\n if (['NINE-TABLE-SIMPLE'].includes(this.#host.tagName)) {\n const $parent = this.#host.closest(\"nine-table-filter-panel, cell-combo-panel\");\n if ($parent) {\n v ? $parent.classList.add('active') : $parent.classList.remove('active');\n }\n }\n };\n\n activeParent(true);\n\n this.#index = index;\n\n this.#source = {\n table: TableCompiler.compile($table),\n tbody: {\n tr: $table.querySelectorAll(\"tbody tr\"),\n }\n };\n\n this.querySelector(`.ng-container-body`).appendChild(this.#source.table);\n\n this.#template = {\n height: 0,\n heights: [],\n length: 0,\n group: {\n height: 0,\n heights: [],\n length: 0,\n }\n }\n\n this.querySelectorAll(`.ng-container-body tbody.body tr`).forEach(($tr) => {\n const h = Math.max($tr.offsetHeight || 0, 28);\n this.#template.height += h;\n this.#template.heights.push(h);\n });\n\n this.querySelectorAll(`.ng-container-body tbody.body tr[grouping=\"true\"]`).forEach(($tr) => {\n const h = Math.max($tr.offsetHeight || 0, 28);\n this.#template.group.height += h;\n this.#template.group.heights.push(h);\n });\n\n this.#template.length = this.#template.heights.length;\n this.#template.group.length = this.#template.group.heights.length;\n\n if (this.#index === 0) {\n const minRows = parseInt(this.#host.getAttribute('display-min-rows'), 10);\n const maxRows = parseInt(this.#host.getAttribute('display-max-rows'), 10);\n\n const h = (this.querySelector(\"nine-table-toolbar\")?.offsetHeight || 0) +\n (this.querySelector(\"nine-table-footer\")?.offsetHeight || 0) +\n (this.querySelector(\"thead\")?.offsetHeight || 0) +\n (this.querySelector(\"tfoot\")?.offsetHeight || 0) +\n (this.querySelector(\"tbody.head\")?.offsetHeight || 0);\n\n if (this.#host.getAttribute('auto-height') === \"true\" || !isNaN(minRows) || !isNaN(maxRows)) {\n this.#host.setAttribute('scroll-bar', \"none\");\n }\n\n if (!isNaN(minRows)) {\n this.#host.style.minHeight = h + (this.#template.height * minRows) + \"px\";\n }\n\n if (!isNaN(maxRows)) {\n this.#host.style.maxHeight = h + (this.#template.height * maxRows) + \"px\";\n }\n }\n\n this.querySelectorAll((\"tbody.body tr\")).forEach(($tr) => {\n $tr.style.display = \"none\";\n });\n\n this.querySelector(`.ng-container-body table`).remove();\n\n activeParent(false);\n };\n\n generate = () => {\n\n this.#renderSplitContainers();\n\n this.#updateContainerWidths();\n\n this.#syncHeaderAndFooterHeights();\n\n this.#initRowHoverEvent();\n\n ['left', 'body', 'right'].forEach(type => {\n const prefix = `.ng-container-${type}`;\n this.#elements[type] = {\n thead: this.querySelector(`${prefix} thead`),\n tbody: {\n head: this.querySelector(`${prefix} tbody.head`),\n body: this.querySelector(`${prefix} tbody.body`),\n foot: this.querySelector(`${prefix} tbody.foot`),\n },\n tfoot: this.querySelector(`${prefix} tfoot`),\n };\n });\n\n this.#rowManager.initialize();\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n } else {\n this.querySelector('nine-table-hscrollbar').refresh();\n }\n\n this.#grouping.initialize();\n\n this.loaded = true;\n };\n\n\n #updateContainerWidths = () => {\n\n if (this.#host.classList.contains(\"combo-list\")) return;\n\n ['left', 'right', 'body'].forEach(type => {\n const containers = this.querySelectorAll(`.ng-container-${type}`);\n if (containers.length === 0) return;\n\n const firstTable = containers[0].querySelector('table');\n if (!firstTable) return;\n\n let width = 0;\n firstTable.querySelectorAll('col').forEach(col => {\n const w = parseInt(col.getAttribute('width'), 10);\n if (!isNaN(w)) width += w;\n });\n\n containers.forEach(container => {\n const tables = container.querySelectorAll('table');\n if (type === 'body') {\n container.style.flex = `1`;\n } else {\n container.style.flex = `0 0 ${width}px`;\n container.style.width = `${width}px`;\n container.style.minWidth = `${width}px`;\n container.style.maxWidth = `${width}px`;\n }\n });\n });\n };\n\n #renderSplitContainers = () => {\n const colTypes = [\n { selector: '.ng-container-left', type: 'left' },\n { selector: '.ng-container-body', type: null },\n { selector: '.ng-container-right', type: 'right' }\n ];\n\n colTypes.forEach(({ selector, type }) => {\n this.querySelector(`.ng-sheet-body ${selector}`).appendChild(this.#createSplitTable(type));\n });\n };\n\n #createSplitTable = (targetFixedType) => {\n\n const $tbl = this.#source.table.cloneNode(true);\n\n if (targetFixedType === 'left') {\n $tbl.querySelectorAll(\"col, th, td\").forEach($el => {\n if ($el.getAttribute(\"fixed\") !== \"left\") $el.remove();\n });\n } else if (targetFixedType === 'right') {\n $tbl.querySelectorAll(\"col, th, td\").forEach($el => {\n if ($el.getAttribute(\"fixed\") !== \"right\") $el.remove();\n });\n } else {\n $tbl.querySelectorAll(\"[fixed=left], [fixed=right]\").forEach($el => {\n $el.remove();\n });\n }\n\n return $tbl;\n };\n\n getRowHeight = () => {\n\n return this.#rowManager.getRowHeight();\n };\n\n getViewHeight = () => {\n\n const viewHeight = this.#elements.content.offsetHeight || 0;\n\n const fixedHeight = (this.#elements.body.thead?.offsetHeight || 0) +\n (this.#elements.body.tfoot?.offsetHeight || 0) +\n (this.#elements.body.tbody.head.offsetHeight || 0);\n\n return viewHeight - fixedHeight;\n };\n\n isLastRow = () => {\n\n const sheet = this.querySelector('.ng-sheet-body');\n const tbody = this.querySelector(\".ng-container-body tbody.body\");\n\n const offsetHeight = (this.#elements.body.tfoot?.offsetHeight || 0);\n\n const sheetBottom = sheet.getBoundingClientRect().bottom;\n const tbodyBottom = tbody.getBoundingClientRect().bottom;\n\n return (sheetBottom - offsetHeight) >= tbodyBottom;\n };\n\n scrollToX = (scrollLeft) => {\n const bodyContainer = this.querySelector('.ng-sheet-body .ng-container-body');\n if (bodyContainer) bodyContainer.scrollLeft = scrollLeft;\n };\n\n scrollToY = (scrollTop) => {\n const bodyViewport = this.querySelector('.ng-sheet-body');\n if (bodyViewport) bodyViewport.scrollTop = scrollTop;\n };\n\n #init = () => {\n\n this.#render();\n\n this.#cellSelection = new CellSelection(this);\n this.#cellNavigation = new CellNavigation(this);\n this.#colResizer = new ColResizer(this);\n this.#colMover = new ColMover(this);\n this.#colFix = new ColFixManager(this);\n\n this.#view = new SheetView(this);\n this.#filtering = new Filtering(this);\n this.#grouping = new GroupingManager(this);\n\n if (!this.#isSimple) {\n this.#sorting = new Sorting(this);\n }\n\n this.#elements.mainBody.addEventListener('scroll', (e) => {\n this.querySelectorAll(\"nine-table-filter-panel,cell-combo-panel\").forEach($el => {\n $el.classList.remove('active');\n });\n this.querySelector(\"nine-table-hscrollbar\").refresh();\n });\n };\n\n\n\n #render = () => {\n\n this.setAttribute(\"tabindex\", \"0\");\n\n this.innerHTML = `\n <div class=\"ng-sheet-body\">\n <div class=\"ng-sheet-body-content\">\n <div class=\"ng-container-left\"></div>\n <div class=\"ng-container-body\">\n \n </div>\n <div class=\"ng-container-right\"></div>\n </div>\n <div class=\"ng-virtual-height-holder\"></div>\n </div>\n\n <div class=\"nodata-overlay\">Data Not Found</div>\n\n <nine-table-vscrollbar></nine-table-vscrollbar>\n <nine-table-hscrollbar></nine-table-hscrollbar>\n <div class=\"scroll-edge\"></div>\n \n <nine-table-col-resizer-panel></nine-table-col-resizer-panel>\n \n \n <div class=\"ng-col-mover-grip\"></div>\n <div class=\"ng-col-mover-indi\"></div>\n `;\n\n this.#elements = {\n mainBody: this.querySelector('.ng-sheet-body .ng-container-body'),\n hscrollbar: this.querySelector('nine-table-hscrollbar'),\n vscrollbar: this.querySelector('nine-table-vscrollbar'),\n content: this.querySelector('.ng-sheet-body .ng-sheet-body-content'),\n scrollHolder: this.querySelector('.ng-sheet-body .ng-virtual-height-holder'),\n }\n };\n\n #syncHeaderAndFooterHeights = () => {\n\n const leftTable = this.querySelector('.ng-container-left table');\n const bodyTable = this.querySelector('.ng-container-body table');\n const rightTable = this.querySelector('.ng-container-right table');\n\n const leftHeaderRows = Array.from(leftTable.querySelectorAll('thead tr:not(.col-indicator-rowgroup)'));\n const bodyHeaderRows = Array.from(bodyTable.querySelectorAll('thead tr:not(.col-indicator-rowgroup)'));\n const rightHeaderRows = Array.from(rightTable.querySelectorAll('thead tr:not(.col-indicator-rowgroup)'));\n\n this.#applyMaxHeights(leftHeaderRows, bodyHeaderRows, rightHeaderRows);\n\n const leftFooterRows = Array.from(leftTable.querySelectorAll('tfoot tr'));\n const bodyFooterRows = Array.from(bodyTable.querySelectorAll('tfoot tr'));\n const rightFooterRows = Array.from(rightTable.querySelectorAll('tfoot tr'));\n\n this.#applyMaxHeights(leftFooterRows, bodyFooterRows, rightFooterRows);\n };\n\n #applyMaxHeights = (leftRows, bodyRows, rightRows) => {\n\n setTimeout(() => {\n const maxRows = Math.max(leftRows.length, bodyRows.length, rightRows.length);\n\n for (let i = 0; i < maxRows; i++) {\n\n const heights = [\n leftRows[i]?.getBoundingClientRect().height || 0,\n bodyRows[i]?.getBoundingClientRect().height || 0,\n rightRows[i]?.getBoundingClientRect().height || 0\n ];\n const maxHeight = Math.max(...heights);\n\n if (maxHeight > 0) {\n if (leftRows[i]) leftRows[i].style.height = `${maxHeight}px`;\n if (bodyRows[i]) bodyRows[i].style.height = `${maxHeight}px`;\n if (rightRows[i]) rightRows[i].style.height = `${maxHeight}px`;\n }\n }\n });\n };\n\n #initRowHoverEvent = () => {\n const bodyViewport = this.querySelector('.ng-sheet-body');\n if (!bodyViewport) return;\n\n let activeRowIndex = null;\n\n bodyViewport.addEventListener('mouseover', (e) => {\n const tr = e.target.closest('tr');\n if (!tr || !tr.dataset.row && tr.dataset.row !== '0') return;\n\n const rowIndex = tr.dataset.row;\n if (activeRowIndex === rowIndex) return;\n activeRowIndex = rowIndex;\n\n bodyViewport.querySelectorAll(`tr[data-row=\"${rowIndex}\"]`).forEach($tr => {\n $tr.classList.add('hover');\n });\n });\n\n bodyViewport.addEventListener('mouseout', (e) => {\n const tr = e.target.closest('tr');\n if (!tr) return;\n\n const relatedTarget = e.relatedTarget;\n if (tr.contains(relatedTarget)) return;\n\n bodyViewport.querySelectorAll('tr.hover').forEach($tr => {\n $tr.classList.remove('hover');\n });\n activeRowIndex = null;\n });\n }\n\n #bindApiMethods = () => {\n //const apis = [this.#sheetAPI, this.#dataAPI];\n const apis = [this.#api];\n\n apis.forEach(api => {\n // api ์ธ์คํด์ค(this)์ ์ง์ ์ ์ธ๋ ์์ฑ๋ค๊ณผ ํ๋กํ ํ์
์์ฑ์ ๋ชจ๋ ๊ฐ์ ธ์ด\n // Reflect.ownKeys๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ณผ์ด๋ ์จ๊ฒจ์ง ํ๋กํผํฐ๊น์ง ์์ ํ๊ฒ ํ์ ๊ฐ๋ฅํฉ๋๋ค.\n const keys = new Set([\n ...Reflect.ownKeys(api),\n ...Reflect.ownKeys(Object.getPrototypeOf(api))\n ]);\n\n keys.forEach(key => {\n // constructor๋ ๋ด๋ถ ํ๋ผ์ด๋น ๋ฉค๋ฒ(#)๋ ์ ์ธ\n if (key === 'constructor' || String(key).startsWith('#')) return;\n\n const target = api[key];\n\n if (typeof target === 'function') {\n if (!this[key]) {\n //trace.log(`[Binding Function] ${key}`);\n this[key] = (...args) => target.apply(api, args);\n }\n } else if (target !== null && typeof target === 'object') {\n\n if (!this[key]) {\n //trace.log(`[Binding Object Namespace] ${key}`);\n this[key] = target; // ๊ฐ์ฒด ๋ค์์คํ์ด์ค(์: row) ํต์งธ๋ก ์ฐ๊ฒฐ\n }\n }\n });\n });\n }\n\n disconnectedCallback() {\n this.#colResizer?.destroy();\n this.#colMover?.destroy();\n this.innerHTML = '';\n }\n}\n\nif (!customElements.get('nine-table-sheet')) {\n customElements.define('nine-table-sheet', NineTableSheet);\n}","import { trace } from \"@nopeer\";\nimport '@/layout/nine-table-sheets.js';\nimport '@/layout/nine-table-sheets-footer.js';\nimport '@/layout/nine-table-toolbar.js';\nimport { NineTableSheet } from \"@/layout/nine-table-sheet.js\";\nimport {PreCompiler} from \"@/layout/core/PreCompiler.js\";\nimport {NINE_TABLE} from \"@\";\n\nexport class LayoutManager {\n #host;\n\n constructor(owner) {\n this.#host = owner;\n this.#init();\n }\n\n #init = () => {\n this.#render();\n this.#initEvent();\n }\n\n set loading(val) {\n if (!!val) {\n this.#host.classList.add(\"loading\");\n } else {\n this.#host.classList.remove(\"loading\");\n }\n }\n\n\n\n #render = () => {\n\n const rawElements = Array.from(this.#host.children);\n const rawTables = rawElements.filter(el => (el.tagName.toUpperCase() === 'TABLE') );\n const sheetCount = rawTables.length;\n\n rawTables.forEach($el => {\n PreCompiler.initializeTable(this.#host, $el);\n });\n\n const sheetsHtml = rawTables.map((tbl, idx) => {\n const className = idx === 0 ? 'active' : '';\n const sheetId = tbl.id || `sheet${idx + 1}`;\n\n const sheetTag = `<nine-table-sheet class=\"${className}\" data-index=\"${idx}\" data-sheet-id=\"${sheetId}\" id=\"${sheetId}\"></nine-table-sheet>`;\n const splitterTag = idx < sheetCount - 1 ? `<nine-splitter class=\"h\" data-split-index=\"${idx}\"></nine-splitter>` : '';\n return sheetTag + splitterTag;\n }).join('');\n\n const cssImports = [\n `@import \"https://cdn.jsdelivr.net/npm/@ninebone/datagrid@${__APP_VERSION__}/dist/css/nine-table.css\";`,\n ];\n\n if (nine[\"nine-table\"] && nine[\"nine-table\"].cssFile) {\n cssImports.push(`@import \"${nine[\"nine-table\"].cssFile}\";`);\n }\n\n this.#host.shadowRoot.innerHTML = `\n <style>\n ${cssImports.join('\\n')}\n ${this.#host.provider.style.value}\n </style>\n \n <nine-table-toolbar></nine-table-toolbar>\n\n <nine-table-body>\n <nine-table-summary></nine-table-summary>\n <div class=\"ng-loading-bar\"></div>\n <nine-table-sheets>\n <nine-table-sheets-body>\n ${sheetsHtml}\n </nine-table-sheets-body>\n <nine-table-sheets-footer></nine-table-sheets-footer>\n </nine-table-sheets>\n <nine-table-analysis></nine-table-analysis>\n </nine-table-body>\n <nine-table-footer></nine-table-footer>\n `;\n\n\n\n this.#host.shadowRoot.querySelectorAll('nine-table-sheet').forEach(($sheet, idx) => {\n $sheet.classList.add('active');\n $sheet.generateTemplate(rawTables[idx], idx);\n });\n\n this.#host.shadowRoot.querySelectorAll('nine-table-sheet').forEach(($sheet) => {\n\n setTimeout(() => {\n $sheet.generate();\n if (this.#isAutoHeight) this.#applyAutoHeight();\n });\n });\n\n\n setTimeout(() => {\n this.#host.data.clear();\n });\n };\n\n #initEvent = () => {\n\n this.#host.addEventListener(NINE_TABLE.EVENT.ROW_ADDED, () => {\n if (this.#isAutoHeight) this.#applyAutoHeight();\n });\n\n this.#host.addEventListener(NINE_TABLE.EVENT.ROW_REMOVED, () => {\n if (this.#isAutoHeight) this.#applyAutoHeight();\n });\n\n let lastHeight = 0; // ์ง์ ๋์ด๋ฅผ ๊ธฐ์ตํ ๋ณ์\n\n new ResizeObserver((entries) => {\n for (let entry of entries) {\n if (entry.target.tagName === \"NINE-TABLE\") {\n const currentHeight = entry.contentRect.height;\n\n if (currentHeight !== lastHeight) {\n lastHeight = currentHeight;\n if (this.#isAutoHeight) {\n this.#applyAutoHeight();\n }\n }\n }\n }\n }).observe(this.#host);\n };\n\n #applyAutoHeight = () => {\n this.#host.shadowRoot.querySelectorAll('nine-table-sheet').forEach(($sheet) => {\n if ($sheet.index === 0) {\n const fixedHeight = ($sheet.querySelector(\"thead\")?.offsetHeight || 0) +\n ($sheet.querySelector(\"tfoot\")?.offsetHeight || 0) +\n ($sheet.querySelector(\"tbody.head\")?.offsetHeight || 0);\n const basicHeight = this.#host.offsetHeight - $sheet.offsetHeight + fixedHeight;\n\n const h = Math.min($sheet.template.height * $sheet.view.count(), window.innerHeight * 0.8);\n\n this.#host.style.height = basicHeight + (h) + \"px\";\n }\n });\n };\n\n get #isAutoHeight() {\n return this.#host.getAttribute('auto-height') === 'true';\n }\n}","import { trace } from \"@nopeer\";\n\nexport class ExprEngine {\n #host;\n #fields;\n #exprCache = new Map(); // ๐ก ํตํฉ๋ ๋จ์ผ ์บ์๋ก ๋ชจ๋ ์ปดํ์ผ๋ ํจ์ ๊ด๋ฆฌ\n\n constructor(host) {\n this.#host = host;\n this.#fields = host.fields.get();\n }\n\n rewriteExpr(expr) {\n\n if (!expr || !this.#fields.length) return expr;\n\n return expr.replace(/data\\.([a-zA-Z_$][\\w$]*)/g, (match, fieldName) => {\n const idx = this.#fields.indexOf(fieldName);\n return idx >= 0 ? `rowItem.v[${idx}]` : match;\n });\n }\n\n rewriteExprGroup(expr) {\nreturn expr;\n if (!expr || !this.#fields.length) return expr;\n\n return expr.replace(/data\\.([a-zA-Z_$][\\w$]*)/g, (match, fieldName) => {\n const idx = this.#fields.indexOf(fieldName);\n return idx >= 0 ? `childrenItems` : match;\n });\n }\n\n precompile(expr, isGroup) {\n if (!expr) return expr;\n return isGroup ? this.rewriteExprGroup(expr) : this.rewriteExpr(expr);\n }\n\n evaluate(expr, rowItem, row = 0, isGroup = false) {\n\n if (expr === undefined || expr === null) return \"\";\n\n try {\n\n const trimmedExpr = String(expr).trim();\n const compiledExpr = isGroup ? this.rewriteExprGroup(trimmedExpr) : this.rewriteExpr(trimmedExpr);\n\n if (compiledExpr.includes(\"provider.\") || compiledExpr.includes(\"host.\") || compiledExpr.includes(\"data.\") || compiledExpr.includes(\"rowItem.v\") || compiledExpr.includes(\"(\")) {\n\n let evalFn = this.#exprCache.get(compiledExpr);\n\n if (isGroup) {\n if (!evalFn) {\n evalFn = new Function('childrenItems', 'row', 'host', `\n const children = childrenItems || [];\n const fields = ${JSON.stringify(this.#fields)};\n \n const data = new Proxy(children, {\n get(target, prop) {\n if (prop in target || typeof prop === 'symbol') return target[prop];\n \n const idx = fields.indexOf(prop);\n if (idx >= 0) {\n return target.map(r => r.v ? r.v[idx] : r[prop]);\n }\n \n return target[prop];\n }\n });\n \n const provider = host;\n \n // ๐ก 1. ์์ ์์์ ๋ฐ๋ก ์ธ ์ ์๋ ์ง๊ณ ํจ์๋ค ์ ์ธ\n \n const sum = (arr) => Array.isArray(arr) ? arr.reduce((a, b) => a + (Number(b) || 0), 0) : 0;\n const avg = (arr) => Array.isArray(arr) && arr.length > 0 ? sum(arr) / arr.length : 0;\n const max = (arr) => Array.isArray(arr) && arr.length > 0 ? Math.max(...arr.map(Number)) : 0;\n const min = (arr) => Array.isArray(arr) && arr.length > 0 ? Math.min(...arr.map(Number)) : 0;\n \n // ๋ง์ฝ ๊ผญ 'Math.sum' ํํ๋ก ์ฐ๊ณ ์ถ๋ค๋ฉด ์๋์ฒ๋ผ Math ๊ฐ์ฒด์ ์ ์ ๋ถ์ฌ์ค ์๋ ์์ต๋๋ค.\n if (!Math.sum) Math.sum = sum;\n if (!Math.avg) Math.avg = avg;\n \n if (!data && !host) return \"\";\n return ${compiledExpr};\n `);\n\n this.#exprCache.set(compiledExpr, evalFn);\n }\n } else {\n if (!evalFn) {\n evalFn = new Function('rowItem', 'row', 'host', `\n const data = rowItem;\n const provider = host;\n \n if (!data && !host) return \"\";\n return ${compiledExpr};\n `);\n\n this.#exprCache.set(compiledExpr, evalFn);\n }\n }\n\n\n return evalFn(rowItem, row, this.#host);\n }\n\n return compiledExpr;\n } catch (e) {\n /**\n if (expr.includes(\"getCommonCode\")) {\n console.trace(\"ExprEngine evaluation error:\", e);\n } */\n return expr;\n }\n }\n}","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\n\nexport class DataAPI {\n\n #host;\n\n constructor(host) {\n this.#host = host;\n }\n\n provider = {\n // ์คํ์ผ ๋ฐ์ดํฐ๋ฅผ provider ๊ฐ์ฒด ๋ด๋ถ์์ ์ง์ ๊ด๋ฆฌ (์ผ๋ฐ ๋ฉ์๋ ์ถ์ฝํ ์ฌ์ฉ)\n style: {\n value: '',\n },\n add: (providerObj) => {\n if (!providerObj || typeof providerObj !== 'object') return;\n\n const { style, ...methods } = providerObj;\n\n if (style && typeof style === 'string') {\n this.provider.style.value = style;\n }\n\n if (Object.keys(methods).length > 0) {\n setTimeout(() => {\n Object.entries(methods).forEach(([name, fn]) => {\n if (typeof fn === 'function') {\n this.#host[name] = fn;\n }\n });\n\n this.#host.rerenderer();\n });\n }\n },\n }\n\n}","export class NineTableAPI {\n #host;\n\n constructor(host) {\n this.#host = host;\n\n // ๊ด๋ฆฌํ ๋ค์์คํ์ด์ค๋ค์ ๋ฐฐ์ด๋ก ์ ์\n const namespaces = [\"col\", \"row\", \"viewport\"]; // ๋์ค์ \"col\", \"cell\" ๋ฑ๋ง ์ถ๊ฐํ๋ฉด ๋!\n\n namespaces.forEach(ns => {\n this[ns] = new Proxy({}, {\n get: (target, prop) => {\n const $sheet = this.#getActiveSheet();\n if (!$sheet || !$sheet[ns]) return undefined;\n\n const targetMethod = $sheet[ns][prop];\n\n if (typeof targetMethod === 'function') {\n return (...args) => targetMethod.apply($sheet[ns], args);\n }\n return targetMethod;\n }\n });\n });\n }\n\n getActiveSheets() {\n return this.#host.shadow.querySelectorAll('nine-table-sheet.active');\n }\n\n #getActiveSheet() {\n const arr = this.getActiveSheets();\n return arr.length > 0 ? arr[0] : null;\n }\n}","import { trace } from \"@nopeer\";\nimport { ngDataManager } from '@/data/ngDataManager.js';\nimport { fields } from \"@/data/Fields.js\";\nimport { LayoutManager } from '@/layout/core/LayoutManager.js';\nimport { ExprEngine } from \"@/core/ExprEngine.js\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport { DataAPI } from '../api/DataAPI.js';\nimport { NineTableAPI } from '../api/NineTableAPI.js';\n\nexport default class NineTable extends HTMLElement {\n #shadowRoot;\n #dataManager;\n #layoutManager;\n #dataApi;\n #sheetApi;\n #templateCnt = 0;\n\n constructor() {\n super();\n\n if ([\"NINE-TABLE\"].includes(this.tagName)) {\n trace.log(\"Welcome nine-table\", __APP_VERSION__);\n }\n\n this.#shadowRoot = this.attachShadow({ mode: 'open' });\n this.#dataManager = new ngDataManager(this);\n\n this.#dataApi = new DataAPI(this);\n this.#sheetApi = new NineTableAPI(this);\n\n this.#bindApiMethods();\n }\n\n connectedCallback() {\n setTimeout(() => {\n this.#templateCnt = this.querySelectorAll(\"table\")?.length;\n\n this.fields = new fields(this);\n this.exprEngine = new ExprEngine(this);\n\n this.#bindDynamicSetters();\n\n this.#layoutManager = new LayoutManager(this);\n\n this.#dispatchLoad();\n });\n }\n\n disconnectedCallback() {\n //trace.log('NineTable disconnected.');\n }\n\n #dispatchLoad = () => {\n\n let checkCount = 0;\n const maxChecks = 50; // ์ต๋ 5์ด ๋๊ธฐ (100ms * 50)\n\n const checkTimer = setInterval(() => {\n checkCount++;\n\n const sheets = this.shadow.querySelectorAll('nine-table-sheet');\n\n if (checkCount >= maxChecks) {\n clearInterval(checkTimer);\n }\n\n if (sheets.length >= this.#templateCnt) {\n let loadSheetCnt = 0;\n sheets.forEach($sheet => {\n if ($sheet.loaded) loadSheetCnt++;\n });\n\n if (loadSheetCnt >= this.#templateCnt) {\n clearInterval(checkTimer);\n this.loaded = true;\n this.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.LOAD, { bubbles: true, detail: { target: this } }));\n }\n }\n }, 100);\n }\n\n // ๐ฏ ๊ณตํต ๋ฐ์ดํฐ & API ์ ๊ทผ์\n get shadow() { return this.#shadowRoot; }\n get dataManager() { return this.#dataManager; }\n get data() { return this.#dataManager.data; }\n //get row() { return this.#dataManager.row; }\n\n\n\n\n\n setData(records) {\n this.#dataManager.data.set(records);\n this.refresh();\n }\n\n refresh() {\n this.activeSheet?.invalidate();\n }\n\n\n set loading(val) {\n if (this.#layoutManager) this.#layoutManager.loading = val;\n }\n\n rerenderer() {\n\n this.activeSheet?.querySelectorAll(\"tbody.body th,tbody.body td\").forEach(($cell) => {\n const customComp = Array.from($cell.children).find($el => {\n return $el.tagName.toLowerCase().startsWith('cell-') && typeof $el.rerenderer === 'function'\n });\n\n customComp?.rerenderer();\n })\n }\n\n sheet = (idOrIndex) => {\n if (idOrIndex === null || idOrIndex < 0) return this.activeSheet;\n const sheets = Array.from(this.shadow.querySelectorAll('nine-table-sheet'));\n\n if (typeof idOrIndex === 'number') return sheets[idOrIndex] || null;\n if (typeof idOrIndex === 'string') {\n return this.shadow.querySelector(`nine-table-sheet#${idOrIndex}, nine-table-sheet[data-sheet-id=\"${idOrIndex}\"]`) || null;\n }\n return sheets[0] || null;\n }\n\n get sheets() {\n return Array.from(this.shadow.querySelectorAll('nine-table-sheet'));\n }\n\n get activeSheet() {\n return this.shadow.querySelector('nine-table-sheet.active') || null;\n }\n\n #bindDynamicSetters() {\n const extractedMethodNames = new Set();\n\n this.querySelectorAll('[data-source]').forEach(el => {\n const dataSource = el.getAttribute('data-source');\n if (!dataSource) return;\n\n const matches = dataSource.matchAll(/(?:host\\.)?([a-zA-Z0-9_$]+)\\s*\\(/g);\n for (const match of matches) {\n const name = match[1];\n if (name && name !== 'host') {\n extractedMethodNames.add(name);\n }\n }\n });\n\n extractedMethodNames.forEach(methodName => {\n let internalValue = null;\n\n Object.defineProperty(this, methodName, {\n set: (newValue) => {\n internalValue = newValue;\n\n this.rerenderer();\n },\n get: () => internalValue,\n configurable: true,\n enumerable: true\n });\n });\n }\n\n execute = (fn) => {\n setTimeout(() => {\n this.loading = true;\n setTimeout(() => {\n try {\n fn.call(this);\n } finally {\n this.loading = false;\n }\n });\n });\n }\n\n #bindApiMethods() {\n\n const apis = [this.#dataApi, this.#sheetApi];\n\n apis.forEach(api => {\n // api ์ธ์คํด์ค(this)์ ์ง์ ์ ์ธ๋ ์์ฑ๋ค๊ณผ ํ๋กํ ํ์
์์ฑ์ ๋ชจ๋ ๊ฐ์ ธ์ด\n // Reflect.ownKeys๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ณผ์ด๋ ์จ๊ฒจ์ง ํ๋กํผํฐ๊น์ง ์์ ํ๊ฒ ํ์ ๊ฐ๋ฅํฉ๋๋ค.\n const keys = new Set([\n ...Reflect.ownKeys(api),\n ...Reflect.ownKeys(Object.getPrototypeOf(api))\n ]);\n\n keys.forEach(key => {\n // constructor๋ ๋ด๋ถ ํ๋ผ์ด๋น ๋ฉค๋ฒ(#)๋ ์ ์ธ\n if (key === 'constructor' || String(key).startsWith('#')) return;\n\n const target = api[key];\n\n if (typeof target === 'function') {\n if (!this[key]) {\n //trace.log(`[Binding Function] ${key}`);\n this[key] = (...args) => target.apply(api, args);\n }\n } else if (target !== null && typeof target === 'object') {\n if (!this[key]) {\n //trace.log(`[Binding Object Namespace] ${key}`, target);\n this[key] = target; // ๊ฐ์ฒด ๋ค์์คํ์ด์ค(์: row) ํต์งธ๋ก ์ฐ๊ฒฐ\n }\n }\n });\n });\n }\n}\n\nif (!customElements.get('nine-table')) {\n customElements.define('nine-table', NineTable);\n}\n\nif (!customElements.get('nine-table-simple')) {\n customElements.define('nine-table-simple', class extends NineTable {\n connectedCallback() {\n this.setAttribute('theme', 'simple');\n\n super.connectedCallback();\n }\n });\n}","export class BasicCellElement extends HTMLElement {\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tapplyBaseStyle() {\n\t}\n\n\tconnectedCallback() {\n\t}\n}","import { trace } from \"@nopeer\";\nimport { BasicCellElement } from './BasicCellElement.js';\n\nconst exprCache = new Map();\n\nexport class CellElement extends BasicCellElement {\n\t#host;\n\t#sheet;\n\t#tr;\n\t#cell;\n\t#attr;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tget #updateRowState() {\n\t\treturn !(this.#cell.getAttribute(\"update-row-state\") === \"false\");\n\t}\n\n\tget host() { return this.#host; }\n\tget sheet() { return this.#sheet; }\n\tget cell() { return this.#cell; }\n\tget tr() { return this.#tr; }\n\tget attr() { return this.#attr; }\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#host = this.getRootNode().host;\n\n\t\tthis.#cell = this.closest(\"th,td\");\n\t\tthis.#tr = this.#cell.closest(\"tr\");\n\t\tthis.#sheet = this.#tr.closest(\"nine-table-sheet\");\n\n\t\tthis.#cell.classList.add(this.tagName);\n\n\t\tthis.#attr = {};\n\t\tfor (let i = 0; i < this.#cell.attributes.length; i++) {\n\t\t\tconst name = this.#cell.attributes[i].name;\n\t\t\tif (![\"text-align\",\"class\",\"cell-type\",\"data-bind\",\"data-expr\",\"data-col\",\"tabindex\"].includes(name)) {\n\t\t\t\tthis.#attr[name] = this.#cell.attributes[i].value;\n\t\t\t\t//this.setAttribute(name, this.#cell.attributes[i].value);\n\t\t\t}\n\t\t}\n\n\t\tif (!this.#cell) return;\n\n\n\t\tconst root = this.shadowRoot || this;\n\n\t\t// ๐ฏ ๋ฒํผ ์ด๋ฒคํธ ์ฐ๊ฒฐ\n\t\troot.querySelectorAll(\"button, ng-expand-button\").forEach(button => {\n\t\t\tbutton.addEventListener(\"click\", () => {\n\t\t\t\tlet fn = this.getAttribute(\"onbuttonclick\") || this.getAttribute(\"onButtonClick\") || this.#cell?.getAttribute(\"onbuttonclick\") || this.#cell?.getAttribute(\"onButtonClick\");\n\n\t\t\t\tconst rowData = this.data; // Proxy Lazy ์ ๊ทผ\n\t\t\t\tconst curRow = parseInt(this.#cell.dataset.row, 10);\n\n\t\t\t\tif (fn && this.#host) {\n\t\t\t\t\tfn = fn.replace(\"()\", \"\");\n\t\t\t\t\tconst match = fn.match(/^(\\w+)\\s*\\(/);\n\t\t\t\t\tconst methodName = match?.[1] || fn;\n\n\t\t\t\t\tif (typeof this.#host[methodName] === 'function') {\n\t\t\t\t\t\tthis.#host[methodName].call(this.#host, rowData, curRow, this.#cell);\n\t\t\t\t\t} else if (typeof this.#host.exprFunction === 'function') {\n\t\t\t\t\t\tthis.#host.exprFunction(fn).call(this, rowData, curRow);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t/**\n\t\t\t\tthis.#host?.dispatchEvent(new CustomEvent(ninegrid.EVENT.BUTTON_CLICK, {\n\t\t\t\t\tdetail: { target: this.#cell, data: rowData, currow: curRow },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true\n\t\t\t\t})); */\n\t\t\t});\n\t\t});\n\n\t\t// ๐ฏ ๋งํฌ ์ด๋ฒคํธ ์ฐ๊ฒฐ\n\t\tconst renderer = root.querySelector(\".renderer\");\n\t\tif (renderer && this.getAttribute(\"link\") === \"true\") {\n\t\t\trenderer.classList.add(\"link\");\n\n\t\t\trenderer.addEventListener(\"click\", () => {\n\t\t\t\tlet fn = this.getAttribute(\"onlinkclick\") || this.getAttribute(\"onLinkClick\");\n\n\t\t\t\tconst rowData = this.data;\n\t\t\t\tconst curRow = parseInt(this.#cell.dataset.row, 10);\n\n\t\t\t\tif (fn && this.#host) {\n\t\t\t\t\tfn = fn.replace(\"()\", \"\");\n\t\t\t\t\tconst match = fn.match(/^(\\w+)\\s*\\(/);\n\t\t\t\t\tconst methodName = match?.[1] || fn;\n\n\t\t\t\t\tif (typeof this.#host[methodName] === 'function') {\n\t\t\t\t\t\tthis.#host[methodName].call(this.#host, rowData, curRow, this.#cell);\n\t\t\t\t\t} else if (typeof this.#host.exprFunction === 'function') {\n\t\t\t\t\t\tthis.#host.exprFunction(fn).call(this, rowData, curRow);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.#host?.dispatchEvent(new CustomEvent(ninegrid.EVENT.LINK_CLICK, {\n\t\t\t\t\tdetail: { target: this.#cell, data: rowData, currow: curRow },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true\n\t\t\t\t}));\n\t\t\t});\n\t\t}\n\t}\n\n\tget data() {\n\t\tconst rawRecord = this.#tr?.data;\n\t\tif (!rawRecord) return null;\n\t\tif (!rawRecord.v) return rawRecord;\n\n\t\tconst host = this.#host;\n\n\t\treturn new Proxy(rawRecord, {\n\t\t\tget(target, prop) {\n\t\t\t\tif (prop === '__ng') return target.__ng;\n\t\t\t\tif (prop === 'v') return target.v;\n\n\t\t\t\tconst idx = host?.fields?.indexOf?.(prop) ?? -1;\n\t\t\t\treturn idx >= 0 ? target.v[idx] : target[prop];\n\t\t\t}\n\t\t});\n\t}\n\n\tget value() {\n\t\tif (!this.#cell || !this.#tr?.data) return \"\";\n\n\t\tconst bindKey = this.#cell.dataset?.bind;\n\t\tif (!bindKey) return \"\";\n\n\t\tconst rawRecord = this.#tr.data;\n\n\t\tif (rawRecord.v && Array.isArray(rawRecord.v)) {\n\t\t\tconst colIdx = this.#host.fields.get().indexOf(bindKey) ?? -1;\n\t\t\treturn colIdx >= 0 ? (rawRecord.v[colIdx] ?? \"\") : \"\";\n\t\t}\n\n\t\treturn rawRecord[bindKey] ?? \"\";\n\t}\n\n\tset value(v) {\n\t\tif (!this.#cell || !this.#host?.data) return;\n\n\t\tconst row = parseInt(this.#tr.dataset.row, 10);\n\t\tconst bindKey = this.#cell.dataset.bind;\n\t\tif (isNaN(row) || !bindKey) return;\n\n\t\t//update-row-state\n\t\tthis.#host.data.setValue(row, bindKey, v, this.#updateRowState);\n\t}\n\n\tget row() {\n\t\treturn parseInt(this.#cell?.dataset?.row, 10);\n\t}\n\tget index() {\n\t\treturn parseInt(this.#cell?.dataset?.index, 10);\n\t}\n\n\tisValid() {\n\t\treturn this.#cell.classList.contains(\"invalid\") ? false : true;\n\t}\n\n\tisInvalid() {\n\t\treturn !this.isValid();\n\t}\n\n\tgetDisplayText = (defaultValue = \"\") => {\n\n\t\t//if (!this.#cell || !this.#cell.closest(\"tbody\")) return defaultValue;\n\t\tif (!this.#cell || (!this.#cell.closest(\"tbody\") && !this.#cell.closest(\"thead.foot\") && !this.#cell.closest(\"tfoot\"))) {\n\t\t\treturn defaultValue;\n\t\t}\n\n\t\tconst rawRecord = this.#tr.data;\n\n\t\tif (!rawRecord) return defaultValue;\n\n\t\tconst expr = this.#cell.dataset.expr;\n\t\tconst bindKey = this.#cell.dataset.bind;\n\t\tconst row = parseInt(this.#cell.dataset.row, 10);\n\n\t\tif (expr) {\n\t\t\ttry {\n\t\t\t\treturn this.#host.exprEngine.evaluate(expr, this.#tr.data, row, this.#tr.getAttribute(\"grouping\") === \"true\");\n\t\t\t} catch (e) {\n\t\t\t\treturn defaultValue;\n\t\t\t}\n\t\t}\n\n\t\tif (bindKey) {\n\t\t\tif (this.#tr.getAttribute(\"grouping\") === \"true\") {\n\t\t\t\tconst idx = this.#host.fields.get().indexOf(bindKey);\n\t\t\t\treturn this.#tr.data[0].v[idx];\n\t\t\t} else {\n\t\t\t\tconst val = this.value;\n\t\t\t\treturn val !== null && val !== undefined ? val : defaultValue;\n\t\t\t}\n\t\t}\n\n\t\treturn defaultValue;\n\t};\n\n\n\n\trefresh() {\n\n\t\tif (!this.#cell || !this.#tr) return;\n\n\t\tconst val = this.value;\n\n\t\tthis.#cell.classList.remove(\"invalid\");\n\n\t\t[\"color\",\"background\",\"background-color\",\"visible\",\"enable\",\"validator\"].forEach(v => {\n\n\t\t\tconst expr = this.#attr[v];\n\t\t\tif (expr) {\n\t\t\t\tconst result = this.#host.exprEngine.evaluate(expr, this.#tr.data, parseInt(this.#cell.dataset.row, 10), this.#tr.getAttribute(\"grouping\") === \"true\");\n\n\t\t\t\tif (v === \"validator\") {\n\t\t\t\t\tif (!result) {\n\t\t\t\t\t\tthis.#cell.classList.add(\"invalid\");\n\t\t\t\t\t}\n\t\t\t\t} else if (v === \"visible\") {\n\t\t\t\t\tthis.style[\"display\"] = result ? \"\" : \"none\";\n\t\t\t\t} else if (v === \"enable\") {\n\t\t\t\t\tthis.querySelectorAll(\"input, button, textarea, select\").forEach($el => {\n\t\t\t\t\t\t$el.disabled = !result;\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!!result) {\n\t\t\t\t\t\tthis.#cell.removeAttribute(\"disabled\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.#cell.setAttribute(\"disabled\", \"true\");\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.#cell.style[v] = result;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn val;\n\t}\n\n\tgetExprValue(expr, data, row) {\n\t\tif (!this.#host || !this.#host.exprEngine || expr === undefined || expr === null || expr === \"\") return expr;\n\n\t\treturn this.#host.exprEngine.evaluate(expr, data, row, this.#tr.getAttribute(\"grouping\") === \"true\");\n\t}\n\n\tgetGroupExprValue = (expr, groupRecord, row, cell) => {\n\t\tif (!expr) return \"\";\n\n\t\ttry {\n\t\t\trow = parseInt(row, 10);\n\t\t\tconst cleanExpr = expr.replace(\"()\", \"\").trim();\n\n\t\t\tif (this.#host && typeof this.#host[cleanExpr] === 'function') {\n\t\t\t\treturn this.#host[cleanExpr].call(this, groupRecord, row, cell);\n\t\t\t}\n\n\t\t\tconst match = cleanExpr.match(/^(\\w+)\\s*\\(\\s*([\\w\\-]*)\\s*\\)/);\n\t\t\tif (match) {\n\t\t\t\tconst indices = groupRecord[GROUP_IDX.CHILDREN];\n\t\t\t\tconst allRecords = this.#host?.data?.getArray ? this.#host.data.getArray() : [];\n\t\t\t\tconst childRecords = indices ? indices.map(idx => allRecords[idx]).filter(Boolean) : [];\n\n\t\t\t\tconst [, funcName, field] = match;\n\t\t\t\tconst host = this.#host;\n\n\t\t\t\tswitch (funcName.toLowerCase()) {\n\t\t\t\t\tcase 'count':\n\t\t\t\t\t\treturn childRecords.length;\n\n\t\t\t\t\tcase 'sum': {\n\t\t\t\t\t\tconst colIdx = host?.fields?.indexOf?.(field) ?? -1;\n\t\t\t\t\t\treturn childRecords.reduce((acc, record) => {\n\t\t\t\t\t\t\tconst val = colIdx >= 0 ? record.v?.[colIdx] : record[field];\n\t\t\t\t\t\t\treturn acc + (Number(val) || 0);\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 'avg': {\n\t\t\t\t\t\tif (childRecords.length === 0) return 0;\n\t\t\t\t\t\tconst colIdx = host?.fields?.indexOf?.(field) ?? -1;\n\t\t\t\t\t\tconst sum = childRecords.reduce((acc, record) => {\n\t\t\t\t\t\t\tconst val = colIdx >= 0 ? record.v?.[colIdx] : record[field];\n\t\t\t\t\t\t\treturn acc + (Number(val) || 0);\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t\treturn sum / childRecords.length;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 3. ํธ์คํธ์ exprFunction ํ์ฉ\n\t\t\tif (this.#host && typeof this.#host.exprFunction === 'function') {\n\t\t\t\treturn this.#host.exprFunction(expr).call(this, groupRecord, row, this.#host.data);\n\t\t\t}\n\n\t\t\tif (expr.includes(\"data.\") || expr.includes(\"childRecords\") || expr.includes(\"groupRecord\")) {\n\t\t\t\tlet evalFn = exprCache.get(\"grp_\" + expr);\n\t\t\t\tif (!evalFn) {\n\t\t\t\t\tevalFn = new Function('groupRecord', 'row', 'cell', 'host', `\n const indices = groupRecord[3]; // GROUP_IDX.CHILDREN = 3\n const allRecords = host?.data?.getArray ? host.data.getArray() : [];\n \n let childRecords = [];\n if (Array.isArray(indices)) {\n // indices๊ฐ ์ซ์ ์ธ๋ฑ์ค ๋ฐฐ์ด์ธ์ง, rowid ๋ฌธ์์ด ๋ฐฐ์ด์ธ์ง ํ๋ณํ์ฌ ์์ ํ๊ฒ ์ถ์ถ\n childRecords = indices.map(idx => {\n if (typeof idx === 'number') {\n return allRecords[idx];\n } else {\n // rowid ๋ฑ ๋ฌธ์์ด ์๋ณ์์ธ ๊ฒฝ์ฐ ์ ์ฒด ๋ฐฐ์ด์์ ์ฐพ๊ฑฐ๋ dataManager ํ์ฉ\n return allRecords.find(r => r?.__ng?.rowid === idx || r?.m?._?.[0] === idx);\n }\n }).filter(Boolean);\n }\n \n // ๋ง์ฝ ์์์ ๋ชป ์ฐพ์๋๋ฐ host.grouping์ ์ธ ์ ์๋ค๋ฉด ๋งค๋์ ์์ ์๋\n if (childRecords.length === 0 && host?.grouping?.getChildrenRecords && groupRecord[0]) {\n childRecords = host.grouping.getChildrenRecords(groupRecord[0]);\n }\n\n const data = childRecords; // data.length ๋ฑ์ ์ธ ์ ์๋๋ก ํธํ\n return ${expr};\n `);\n\t\t\t\t\texprCache.set(\"grp_\" + expr, evalFn);\n\t\t\t\t}\n\t\t\t\treturn evalFn(groupRecord, row, cell, this.#host);\n\t\t\t}\n\n\t\t\treturn expr;\n\t\t} catch (e) {\n\t\t\tconsole.error(\"Group expr evaluation error:\", expr, e);\n\t\t\treturn expr;\n\t\t}\n\t};\n}\n\nexport class EditableCellElement extends CellElement {\n\n\tget host() { return super.host; }\n\tget sheet() { return super.sheet; }\n\tget cell() { return super.cell; }\n\tget tr() { return super.tr; }\n\tget attr() { return super.attr; }\n\n\tgetExprValue(expr, data, row) {\n\t\treturn super.getExprValue(expr, data, row);\n\t}\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\t}\n\n\trefresh() {\n\t\treturn super.refresh();\n\t}\n\n\tgetExprValue = (expr, data, row, cell) => {\n\t\treturn super.getExprValue(expr, data, row, cell);\n\t}\n\n\tisValid = () => {\n\t\treturn super.isValid();\n\t}\n\n\tisInvalid = () => {\n\t\treturn super.isInvalid();\n\t}\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputText extends EditableCellElement\n{\n\t#target;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\t\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input\");\n\n\t\tthis.#initEvent();\n\t};\n\n\trefresh = () => {\n\t\tconst v = super.refresh();\n\t\tthis.#target.value = v;\n\t};\n\n\t#initEvent = () => {\n\t\tthis.#target.addEventListener(\"input\", e => {\n\t\t\tif (this.#maxbyte) {\n\t\t\t\tconst maxByteNum = Number(this.#maxbyte);\n\t\t\t\tconst currentBytes = nine.getByteLength(e.target.value);\n\n\t\t\t\tif (currentBytes > maxByteNum) {\n\t\t\t\t\te.target.value = nine.cut(e.target.value, maxByteNum);\n\t\t\t\t\tthis.value = e.target.value;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tthis.value = event.target.value;\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\t};\n\n\t#renderer = () => {\n\n\t\tthis.innerHTML = `\n\t\t\t<input type=\"text\" ondragstart=\"return false;\">\n\t\t`;\n\t};\n\n\tget #maxbyte() {\n\t\treturn this.cell.getAttribute(\"maxbyte\") || this.cell.getAttribute(\"max-byte\");\n\t}\n}\n\nif (!customElements.get('cell-input')) {\n\tcustomElements.define(\"cell-input\", CellInputText);\n}\n","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputNumber extends EditableCellElement\n{\n\t#target;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input\");\n\n\t\tthis.#initEvent();\n\n\n\t};\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"text\" ondragstart=\"return false;\">\n `;\n\t};\n\n\t#initEvent = () => {\n\t\tthis.#target.addEventListener(\"keydown\", this.#onKeyDown);\n\n\t\tthis.#target.addEventListener(\"input\", (event) => {\n\t\t\tthis.value = event.target.value;\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tthis.value = event.target.value;\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\t};\n\n\trefresh = () => {\n\t\tconst v = super.refresh();\n\n\t\tthis.#target.value = v;//v !== undefined && v !== null ? v : \"\";\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate();\n\t\t}\n\t};\n\n\t#validate = () => {\n\n\t\tconst v = this.#target.value;\n\n\t\tif (v !== \"\" && v !== null && v !== undefined) {\n\t\t\tconst num = Number(v);\n\n\t\t\tif (isNaN(num) || (this.#max && num > Number(this.#max)) || (this.#min && num < Number(this.#min))) {\n\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t}\n\t\t\telse if (this.#scale) {\n\t\t\t\tconst str = String(v);\n\t\t\t\tconst idx = str.indexOf('.');\n\t\t\t\tif (idx >= 0 && str.substring(idx + 1).length > Number(this.#scale)) {\n\t\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t#onKeyDown = e => {\n\n\t\tif ([\"Escape\", \"Enter\", \"Tab\", \"Home\", \"End\", \"ArrowLeft\", \"ArrowRight\", \"PageUp\", \"PageDown\", \"Backspace\", \"Delete\"].includes(e.code)) return;\n\n\t\tconst target = e.target;\n\t\tconst value = target.value;\n\t\tconst selectionStart = target.selectionStart;\n\t\tconst key = e.key;\n\n\t\tif (key === \"-\") {\n\t\t\tif (value.includes(\"-\") || selectionStart !== 0) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (key === \".\") {\n\t\t\tconst scale = Number(this.#scale);\n\n\t\t\tif (isNaN(scale) || scale <= 0 || value.includes(\".\")) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tlet validKey = [];\n\t\tif (this.#scale && Number(this.#scale) > 0) validKey.push(\".\");\n\t\tif (this.#min || Number(this.#min) > 0) validKey.push(\"-\");\n\n\t\tconst isNumKey = (e.keyCode >= 48 && e.keyCode <= 57) || (e.keyCode >= 96 && e.keyCode <= 105);\n\n\t\tif (!isNumKey && !validKey.includes(e.key)) {\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.#scale && isNumKey && e.target.selectionStart == e.target.selectionEnd) {\n\t\t\tconst s = e.target.value;\n\t\t\tconst idx = s.indexOf(\".\");\n\t\t\tif (idx >= 0 && e.target.selectionStart > idx) {\n\t\t\t\tconst decimalPart = s.substr(idx + 1);\n\t\t\t\tif (decimalPart.length >= Number(this.#scale)) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.#maxbyte && nine.getByteLength(e.target.value) >= Number(this.#maxbyte) && e.target.selectionStart == e.target.selectionEnd) {\n\t\t\te.preventDefault();\n\t\t}\n\t}\n\n\tget #min() {\n\t\treturn this.cell.getAttribute(\"min\") || \"\";\n\t}\n\n\tget #max() {\n\t\treturn this.cell.getAttribute(\"max\") || \"\";\n\t}\n\n\tget #scale() {\n\t\treturn this.cell.getAttribute(\"scale\") || \"\";\n\t}\n\n\tget #maxbyte() {\n\t\treturn this.cell.getAttribute(\"maxbyte\") || this.cell.getAttribute(\"max-byte\");\n\t}\n}\n\nif (!customElements.get('cell-input-number')) {\n\tcustomElements.define(\"cell-input-number\", CellInputNumber);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputColor extends EditableCellElement\n{\n\t#target;\n\t#btn;\n\t#dataSource;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input[type=color]\");\n\t\tthis.#btn = this.querySelector(\"button\");\n\n\t\t//this.#rendererColor();\n\n\t\tthis.#initEvent();\n\t};\n\n\t#initEvent = () => {\n\t\tthis.#btn.addEventListener(\"click\", () => {\n\t\t\tthis.#target.click();\n\t\t});\n\n\t\tthis.#target.addEventListener(\"input\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#validate(val);\n\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#validate(val);\n\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"color\" ondragstart=\"return false;\">\n <button tabindex=\"-1\" type=\"button\"></button>\n `;\n\t};\n\n\trerenderer = () => {\n\t\tthis.refresh();\n\t};\n\n\t#rendererColor = () => {\n\n\t\tconst dataSource = this.cell.getAttribute(\"data-source\");\n\t\tif (!dataSource) return;\n\n\t\tthis.#dataSource = super.getExprValue(dataSource, this.tr.data, this.tr.dataset.row);\n\n\t\tthis.querySelector(\"datalist\")?.remove();\n\n\t\tif (this.#dataSource && Array.isArray(this.#dataSource)) {\n\t\t\tconst datalistId = `color-list-${Math.random().toString(36).substr(2, 9)}`;\n\n\t\t\tconst datalist = document.createElement('datalist');\n\t\t\tdatalist.id = datalistId;\n\n\t\t\tconst fragment = document.createDocumentFragment();\n\n\t\t\tthis.#dataSource.forEach(v => {\n\t\t\t\tif (v.value) {\n\t\t\t\t\tconst option = document.createElement('option');\n\t\t\t\t\toption.value = v.value;\n\t\t\t\t\tfragment.appendChild(option);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdatalist.appendChild(fragment);\n\t\t\tthis.appendChild(datalist);\n\n\t\t\tthis.#target.setAttribute(\"list\", datalistId);\n\t\t}\n\t};\n\n\trefresh = () => {\n\t\tif (!this.tr.data) return;\n\n\t\tconst v = super.refresh();\n\n\t\tthis.#rendererColor();\n\n\t\tthis.#target.value = v !== undefined && v !== null && v !== \"\" ? v : \"#ffffff\";\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate();\n\t\t}\n\t};\n\n\t#validate = () => {\n\n\t\tconst v = this.#target.value;\n\n\t\tif (v !== \"\" && v !== null && v !== undefined) {\n\t\t\tif (!this.#isValidColor(v)) {\n\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t}\n\t\t\telse if (this.#dataSource && Array.isArray(this.#dataSource) && this.#dataSource.length > 0) {\n\t\t\t\tconst exists = this.#dataSource.some(item => {\n\t\t\t\t\tconst itemCode = item.value !== undefined ? item.value : (item.code !== undefined ? item.code : '');\n\t\t\t\t\treturn itemCode.toLowerCase() === v.toLowerCase();\n\t\t\t\t});\n\n\t\t\t\tif (!exists) {\n\t\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t#isValidColor = (v) => {\n\t\tif (typeof v !== \"string\" || v.length != 7 || !v.startsWith(\"#\")) return false;\n\n\t\tvar r = parseInt(v.substr(1, 2), 16);\n\t\tvar g = parseInt(v.substr(3, 2), 16);\n\t\tvar b = parseInt(v.substr(5, 2), 16);\n\n\t\tif (isNaN(r) || isNaN(g) || isNaN(b)) return false;\n\t\tif (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) return false;\n\n\t\treturn true;\n\t}\n}\n\nif (!customElements.get('cell-input-color')) {\n\tcustomElements.define(\"cell-input-color\", CellInputColor);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputDate extends EditableCellElement\n{\n\t#target;\n\t#type;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input\");\n\n\t\tthis.#target.addEventListener(\"input\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#target.classList.toggle(\"has-value\", !!val); // ๐ก ์ค์๊ฐ ๋ฐ์\n\t\t\tthis.#validate(val);\n\n\t\t\tsuper.sheet.rowManager.refresh(true);\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#validate(val);\n\n\t\t\tsuper.sheet.rowManager.refresh(true);\n\t\t});\n\t};\n\n\t#renderer = () => {\n\n\t\tthis.#type = this.cell.getAttribute(\"date-type\") || \"date\";\n\t\tif (![\"date\",\"datetime-local\",\"time\",\"week\",\"month\"].includes(this.#type)) {\n\t\t\tthrow `invalid type : ${this.#type}`;\n\t\t}\n\n\t\tlet attr = [];\n\t\tfor (let i = 0; i < this.cell.attributes.length; i++) {\n\t\t\tif ([\"value\", \"max\", \"min\", \"step\"].includes(this.cell.attributes[i].name)) {\n\t\t\t\tattr.push(`${this.cell.attributes[i].name}=\"${this.cell.attributes[i].value}\"`);\n\t\t\t}\n\t\t}\n\n\t\tthis.innerHTML = `\n <input\n type=\"${this.#type}\"\n data-placeholder=\"${this.cell.getAttribute('placeholder') || 'Select'}\"\n ${attr.join(\" \")}\n required\n />\n `;\n\t};\n\n\trefresh = () => {\n\n\t\tconst v = super.refresh();\n\n\t\tlet formattedVal = v;\n\t\tif (formattedVal) {\n\n\t\t\tswitch (this.#type) {\n\t\t\t\tcase \"date\":\n\t\t\t\t\tformattedVal = formattedVal.substr(0, 10);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"datetime-local\":\n\t\t\t\t\tformattedVal = formattedVal.substr(0, 16);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"time\":\n\t\t\t\t\tvar d = new Date(v);\n\t\t\t\t\tif (d != \"Invalid Date\" && !isNaN(d)) {\n\t\t\t\t\t\tformattedVal = (\"00\" + d.getHours()).slice(-2) + \":\" + (\"00\" + d.getMinutes()).slice(-2);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"month\":\n\t\t\t\t\tvar d = new Date(v);\n\t\t\t\t\tif (d != \"Invalid Date\" && !isNaN(d)) {\n\t\t\t\t\t\tformattedVal = (\"0000\" + d.getFullYear()).slice(-4) + \"-\" + (\"00\" + (d.getMonth() + 1)).slice(-2);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis.#target.value = formattedVal || \"\";\n\t\tthis.#target.classList.toggle(\"has-value\", !!formattedVal); // ๐ก ๊ฐ์ด ์์ผ๋ฉด ํด๋์ค ์ถ๊ฐ\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate(formattedVal);\n\t\t}\n\t};\n\n\t#validate = (val) => {\n\n\t\tif (val !== \"\" && val !== null && val !== undefined) {\n\t\t\tlet isValid = this.#isValidDate(val);\n\n\t\t\tif (isValid) {\n\t\t\t\tif (this.#min && val < this.#min) isValid = false;\n\t\t\t\tif (this.#max && val > this.#max) isValid = false;\n\t\t\t}\n\n\t\t\tif (!isValid) {\n\t\t\t\tsuper.cell.classList.add(\"invalid\");\n\t\t\t}\n\t\t}\n\t};\n\n\t#isValidDate = (v) => {\n\n\t\tif (typeof v !== \"string\") return false;\n\n\t\tlet isValid = true;\n\n\t\tswitch (this.#type) {\n\t\t\tcase \"date\":\n\t\t\tcase \"datetime-local\":\n\t\t\t\tconst year = Number(v.substr(0, 4));\n\t\t\t\tconst month = Number(v.substr(5, 2));\n\t\t\t\tconst day = Number(v.substr(8, 2));\n\n\t\t\t\tif (isNaN(year) || isNaN(month) || isNaN(day)) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t} else if (month < 1 || month > 12 || day < 1 || day > 31) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t} else if ([4, 6, 9, 11].includes(month) && day == 31) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t} else if (month == 2) {\n\t\t\t\t\tlet isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));\n\t\t\t\t\tif (day > 29 || (day == 29 && !isleap)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (isValid) {\n\t\t\tswitch (this.#type) {\n\t\t\t\tcase \"datetime-local\":\n\t\t\t\t\tvar t = v.substr(10, 1);\n\t\t\t\t\tvar hour = Number(v.substr(11, 2));\n\t\t\t\t\tvar min = Number(v.substr(14, 2));\n\n\t\t\t\t\tif (t != \"T\") {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (isNaN(hour) || isNaN(min)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (hour < 0 || hour > 23 || min < 0 || min > 59) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"month\":\n\t\t\t\t\tvar year = Number(v.substr(0, 4));\n\t\t\t\t\tvar month = Number(v.substr(5, 2));\n\n\t\t\t\t\tif (isNaN(year) || isNaN(month)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (month < 1 || month > 12) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"week\":\n\t\t\t\t\tvar year = Number(v.substr(0, 4));\n\t\t\t\t\tvar w = v.substr(5, 1);\n\t\t\t\t\tvar week = Number(v.substr(6, 2));\n\n\t\t\t\t\tif (w != \"W\") {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (isNaN(year) || isNaN(week)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (week <= 0 || week > 53) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn isValid;\n\t}\n\n\tget #min() {\n\t\treturn this.cell.getAttribute(\"min\");\n\t}\n\n\tget #max() {\n\t\treturn this.cell.getAttribute(\"max\");\n\t}\n\n\tget #step() {\n\t\treturn this.cell.getAttribute(\"step\");\n\t}\n}\n\nif (!customElements.get('cell-input-date')) {\n\tcustomElements.define(\"cell-input-date\", CellInputDate);\n}","import { EditableCellElement } from \"./core/CellElement.js\";\nimport {trace} from \"@nopeer\";\n\nclass CellCheckbox extends EditableCellElement {\n #target;\n #label;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n this.#renderer();\n\n this.#target = this.querySelector(\"input\");\n this.#label = this.querySelector(\"span\");\n\n this.#initEvent();\n }\n\n get dataSource() {\n return [\n { value: this.trueValue, text: this.#trueText },\n { value: this.falseValue, text: this.#falseText }\n ];\n }\n\n #initEvent = () => {\n if (this.closest(\"thead\")) {\n this.#target.addEventListener(\"change\", (e) => {\n super.sheet.querySelector(`tbody.body [data-col=\"${super.cell.dataset.col}\"] cell-checkbox`)?.selectAll(e.target.checked);\n });\n }\n\n this.#target.addEventListener(\"change\", (event) => {\n if (!this.closest(\"tbody\")) return;\n\n if (this.#isRadio) {\n this.selectAll(false);\n this.value = this.trueValue;\n }\n else {\n this.value = event.target.checked ? this.trueValue : this.falseValue;\n }\n\n this.sheet.rowManager.refresh(true);\n });\n\n this.cell.addEventListener(\"keydown\", e => {\n\n if (this.cell.hasAttribute(\"readonly\") || this.cell.classList.contains(\"readonly\")) return;\n if (this.cell.getAttribute(\"disabled\") === \"true\") return;\n if (this.style.display === \"none\") return;\n\n if (e.code === \"Space\") {\n e.preventDefault();\n\n this.value = this.#target.checked ? this.falseValue : this.trueValue;\n\n this.sheet.rowManager.refresh(true);\n }\n });\n };\n\n #renderer = () => {\n\n const trueValue = this.trueValue;//this.cell.getAttribute(\"true-value\") || false;\n //const selectedBorderColor = this.getAttribute(\"selected-border-color\") || \"dimgray\";\n\n const originalContent = this.cell.getAttribute(\"content\") || \"\";\n const childHtml = this.#isRadio ? `<input type=\"radio\" value=\"${trueValue}\" />` : `<label><input type=\"checkbox\" /><span>${originalContent}</span></label>`;\n\n this.innerHTML = `\n ${childHtml}\n `;\n }\n\n refresh = () => {\n const val = super.refresh();\n\n this.#target.checked = (val === this.trueValue);\n\n if (this.isValid()) {\n this.#validate(val);\n }\n\n const displayText = (val === this.trueValue) ? this.#trueText : ((val === this.falseValue) ? this.#falseText : val);\n\n if (this.#label) {\n this.#label.textContent = displayText;\n }\n };\n\n #validate = (val) => {\n\n this.cell.classList.remove(\"invalid\");\n\n if (val !== \"\" && val !== null && val !== undefined) {\n if (val !== this.trueValue && val !== this.falseValue) {\n this.cell.classList.add(\"invalid\");\n }\n }\n };\n\n selectAll = (v) => {\n if (this.closest(\"thead\")) return; // ํค๋ ์์ ์ ์ ์ธ\n\n const data = this.host.data.getArray();\n const colIndex = this.host.fields.indexOf(this.cell.dataset.bind);\n\n if (colIndex < 0) return;\n\n for (let i = 0; i < data.length; i++) {\n if (this.#enable && super.getExprValue(this.#enable, data[i], i, this.cell) === false) continue;\n if (this.#readonly && super.getExprValue(this.#readonly, data[i], i, this.cell) === true) continue;\n if (this.#visible && super.getExprValue(this.#visible, data[i], i, this.cell) === false) continue;\n\n data[i].v[colIndex] = v ? this.trueValue : this.falseValue;\n }\n\n super.sheet.invalidate();\n };\n\n get trueValue() {\n return this.cell.getAttribute(\"true-value\") || \"Y\";\n }\n get falseValue() {\n return this.cell.getAttribute(\"false-value\")|| \"N\";\n }\n get #trueText() {\n return this.cell.getAttribute(\"true-text\") || \"\";\n }\n get #falseText() {\n return this.cell.getAttribute(\"false-text\") || \"\";\n }\n get #isRadio() {\n return this.cell.getAttribute(\"is-radio\") || false;\n }\n get #enable() {\n return this.cell.getAttribute(\"enable\") || false;\n }\n get #readonly() {\n return this.cell.getAttribute(\"readonly\") || false;\n }\n get #visible() {\n return this.cell.getAttribute(\"visible\") || false;\n }\n}\n\nif (!customElements.get('cell-checkbox')) {\n customElements.define(\"cell-checkbox\", CellCheckbox);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellRadio extends EditableCellElement {\n\t#target;\n\t#radioList = [];\n\t#dataSource = [];\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#rendererRadio();\n\n\t\tthis.#initEvent();\n\t}\n\n\t#initEvent = () => {\n\n\t\tthis.cell.addEventListener(\"keydown\", e => {\n\n\t\t\tif (this.cell.hasAttribute(\"readonly\") || this.cell.classList.contains(\"readonly\")) return;\n\t\t\tif (this.cell.getAttribute(\"disabled\") === \"true\") return;\n\t\t\tif (this.style.display === \"none\") return;\n\n\t\t\tif (e.code === \"Space\") {\n\t\t\t\te.preventDefault();\n\n\t\t\t\tlet matchIndex = -1;\n\n\t\t\t\tthis.#radioList.forEach(($el,index) => {\n\t\t\t\t\tif (this.value === $el.getAttribute(\"value\")) {\n\t\t\t\t\t\tmatchIndex = index;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tmatchIndex = (matchIndex === this.#radioList.length - 1) ? 0 : (matchIndex >= 0 ? matchIndex + 1 : 0);\n\t\t\t\tthis.value = this.#radioList[matchIndex].getAttribute(\"value\");\n\n\t\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t\t}\n\t\t});\n\t};\n\n\t#rendererRadio = () => {\n\n\t\tif (!this.host) return;\n\n\t\tconst dataSource = this.cell.getAttribute(\"data-source\");\n\t\tif (!dataSource) return;\n\n\t\tthis.#dataSource = super.getExprValue(dataSource, this.tr.data, this.tr.dataset.row);\n\n\t\tthis.#target.replaceChildren();\n\n\t\tif (this.#dataSource && Array.isArray(this.#dataSource)) {\n\n\t\t\tconst fragment = document.createDocumentFragment();\n\n\t\t\tthis.#dataSource.forEach(v => {\n\t\t\t\tconst codeVal = v[this.#keyName] !== undefined ? v[this.#keyName] : '';\n\t\t\t\tconst nameVal = v[this.#valueName] !== undefined ? v[this.#valueName] : '';\n\n\t\t\t\tconst label = document.createElement('label');\n\n\t\t\t\tconst input = document.createElement('input');\n\t\t\t\tinput.type = 'radio';\n\t\t\t\tinput.value = codeVal;\n\n\t\t\t\tconst span = document.createElement('span');\n\t\t\t\tspan.textContent = nameVal;\n\n\t\t\t\tlabel.appendChild(input);\n\t\t\t\tlabel.appendChild(span);\n\t\t\t\tfragment.appendChild(label);\n\t\t\t});\n\n\t\t\tthis.#target.appendChild(fragment);\n\n\n\t\t\tthis.#radioList = Array.from(this.querySelectorAll(\"input\"));\n\n\n\n\t\t\tthis.#radioList.forEach($el => {\n\t\t\t\t$el.addEventListener(\"change\", (e) => {\n\t\t\t\t\tthis.value = e.target.value;\n\t\t\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t};\n\n\t#renderer = () => {\n\n\t\tthis.innerHTML = `\n\t\t\t<div></div>\n `;\n\n\t\tthis.#target = this.querySelector(\"div\");\n\t};\n\n\trerenderer = () => {\n\t\tthis.#rendererRadio();\n\t\tthis.refresh();\n\t};\n\n\trefresh = () => {\n\n\t\tconst v = super.refresh();\n\n\t\tthis.#radioList.forEach($el => {\n\t\t\t$el.checked = (v === $el.value);\n\t\t});\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate();\n\t\t}\n\t};\n\n\t#validate = () => {\n\n\t\tif (this.value === null || this.value === undefined || this.value === \"\" || !Array.isArray(this.#dataSource)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst idx = this.#dataSource.findIndex(m => this.value === m[this.#keyName]);\n\t\tif (idx < 0) {\n\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t}\n\t};\n\n\tget dataSource() {\n\t\treturn this.#dataSource;\n\t}\n\n\tget #keyName() {\n\t\treturn this.cell.getAttribute(\"key-name\") || \"k\";\n\t}\n\n\tget #valueName() {\n\t\treturn this.cell.getAttribute(\"value-name\") || \"v\";\n\t}\n}\n\nif (!customElements.get('cell-radio')) {\n\tcustomElements.define(\"cell-radio\", CellRadio);\n}","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@\";\n\nexport class CellComboPanel extends HTMLElement {\n\t#EXPAND_ROW_COUNT = 10;\n\n\t#parent;\n\t#grd;\n\t#sheet;\n\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tthis.#renderer();\n\n\t\tthis.#grd = this.querySelector(\"nine-table-simple\");\n\t\tsetTimeout(() => {\n\t\t\tthis.#sheet = this.#grd.shadowRoot.querySelector(\"nine-table-sheet\");\n\t\t\tthis.#initEvents();\n\t\t})\n\t}\n\n\t#initData = (formattedData) => {\n\n\t\tif (!this.#grd || !this.#parent.dataSource || this.#parent.dataSource.length === 0) return;\n\n\t\tconst activeColumnCount = this.#parent.items.length || 1;\n\n\t\tthis.#sheet.source.table.querySelectorAll('colgroup col, tbody td').forEach(($el, idx) => {\n\t\t\tconst col = parseInt($el.dataset.col, 10);\n\t\t\tif (col >= 2) {\n\t\t\t\t$el.style.display = (col - 2 >= activeColumnCount) ? 'none' : '';\n\t\t\t}\n\t\t});\n\n\t\tthis.#sheet.querySelectorAll('table colgroup col').forEach(($el, idx) => {\n\t\t\tconst col = parseInt($el.dataset.col, 10);\n\t\t\tif (col >= 2) {\n\t\t\t\t$el.style.display = (col - 2 >= activeColumnCount) ? 'none' : '';\n\t\t\t}\n\t\t});\n\n\n\t\tthis.#grd.addEventListener(NINE_TABLE.EVENT.ROW_ADDED, () => {\n\t\t\tsetTimeout(() => {\n\n\t\t\t\tthis.style.opacity = \"\";\n\t\t\t\tthis.classList.add(\"active\");\n\n\t\t\t\tthis.#sheet.querySelectorAll('colgroup col').forEach(($el, idx) => {\n\t\t\t\t\tconst col = parseInt($el.dataset.col, 10);\n\t\t\t\t\tif (col >= 2 && $el.style.display !== \"none\") {\n\t\t\t\t\t\tthis.#sheet.col.autoFit(col);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tconst fields = this.#grd.fields.get();\n\n\t\t\t\tif (this.#parent.multi) {\n\t\t\t\t\tconst selectedKeys = this.#parent.value ? String(this.#parent.value).split(this.#parent.separator).map(s => s.trim()) : [];\n\t\t\t\t\tconst kIndex = fields.indexOf(\"k\");\n\t\t\t\t\tconst chkIndex = fields.indexOf(\"CHK\");\n\n\t\t\t\t\tthis.#grd.data.getArray().forEach(record => {\n\t\t\t\t\t\trecord.v[chkIndex] = (selectedKeys.includes(String(record.v[kIndex]))) ? \"Y\" : \"N\";\n\t\t\t\t\t});\n\n\t\t\t\t\tconst index = this.#sheet.view.getArray().findIndex((record, idx) => {\n\t\t\t\t\t\treturn record.v[kIndex] === selectedKeys[0];\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.#selectRow(index);\n\t\t\t\t} else {\n\t\t\t\t\tconst currentValue = this.#parent.value;\n\t\t\t\t\tconst kIndex = fields.indexOf(\"k\");\n\t\t\t\t\tconst index = this.#sheet.view.getArray().findIndex((record, idx) => {\n\t\t\t\t\t\treturn record.v[kIndex] === currentValue;\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.#selectRow(index);\n\t\t\t\t}\n\t\t\t})\n\t\t}, {once: true});\n\n\t\tif (formattedData.length > this.#EXPAND_ROW_COUNT) {\n\t\t\tthis.classList.add(\"expand\");\n\t\t} else {\n\t\t\tthis.classList.remove(\"expand\");\n\t\t}\n\n\t\tthis.#grd.data.set(formattedData);\n\t};\n\n\t#isPanelBelow = ($btn) => {\n\t\tconst $sheet = $btn.closest(\".ng-sheet-body\");\n\n\t\tconst btnRect = $btn.getBoundingClientRect();\n\t\tconst sheetRect = $sheet.getBoundingClientRect();\n\t\tconst spaceBelow = sheetRect.bottom - btnRect.bottom;\n\t\tconst spaceAbove = btnRect.top - sheetRect.top;\n\n\t\treturn spaceBelow >= spaceAbove;\n\t};\n\n\t#calculatePanelHeight = ($btn, isDropDown, rows) => {\n\t\tconst $sheet = $btn.closest(\".ng-sheet-body\");\n\n\t\tconst btnRect = $btn.getBoundingClientRect();\n\t\tconst sheetRect = $sheet.getBoundingClientRect();\n\n\t\tconst searchInputHeight = 32;\n\t\tconst h1 = (isDropDown ? (sheetRect.bottom - btnRect.bottom) : (btnRect.top - sheetRect.top)) - 5;\n\t\tconst h2 = (rows * this.#sheet.template.height) + (rows > this.#EXPAND_ROW_COUNT ? searchInputHeight : 0) + 2;\n\n\t\treturn Math.min(h1, h2);\n\t}\n\n\t#calculatePanelLeft = ($btn) => {\n\n\t\tconst $cell = $btn.closest(\"th,td\");\n\t\tconst $sheet = $cell.closest(\".ng-sheet-body\");\n\n\n\t\tconst cellRect = $cell.getBoundingClientRect();\n\t\tconst sheetRect = $sheet.getBoundingClientRect();\n\n\t\tlet left = cellRect.left - sheetRect.left;\n\n\t\tconst panelWidth = this.offsetWidth;\n\t\tif (left + panelWidth > sheetRect.width) {\n\t\t\tleft = Math.max(0, sheetRect.width - panelWidth - 2);\n\t\t}\n\n\t\tif (left < 0) {\n\t\t\tleft = 5;\n\t\t}\n\n\t\treturn left;\n\t};\n\n\topen = (parent) => {\n\t\tthis.#parent = parent;\n\n\t\tthis.classList.add(\"active\");\n\t\tthis.style.opacity = \"0\";\n\n\t\tlet items = this.#parent.items;\n\t\tif (items.length === 0) {\n\t\t\titems.push(this.#parent.valueName);\n\t\t}\n\n\t\tconst formattedData = this.#parent.dataSource.map(item => {\n\t\t\tconst row = {\n\t\t\t\tCHK: \"N\",\n\t\t\t\tk: this.#parent.keyName && item[this.#parent.keyName] !== undefined ? item[this.#parent.keyName] : (item[0] !== undefined ? item[0] : \"\")\n\t\t\t};\n\n\t\t\titems.forEach((key, idx) => {\n\t\t\t\trow[`tmp${idx + 1}`] = item[key] !== undefined ? item[key] : (item[idx] !== undefined ? item[idx] : \"\");\n\t\t\t});\n\t\t\treturn row;\n\t\t});\n\n\t\tsetTimeout(() => {\n\n\t\t\tif (!this.#grd || !this.#parent.dataSource) return;\n\n\t\t\tthis.querySelector(\".search-input\").value = \"\";\n\t\t\tthis.querySelector(\"#chkAll\").checked = true;\n\n\t\t\tconst sheet = parent.closest(\".ng-sheet-body\");\n\t\t\tconst btnRect = parent.getBoundingClientRect();\n\t\t\tconst sheetRect = sheet.getBoundingClientRect();\n\n\t\t\tconst isDropDown = this.#isPanelBelow(parent);\n\t\t\tconst h = this.#calculatePanelHeight(parent, isDropDown, formattedData.length);\n\t\t\tconst l = this.#calculatePanelLeft(parent);\n\t\t\tconst t = isDropDown ? (btnRect.bottom - sheetRect.top) : (btnRect.top - sheetRect.top - h);\n\n\t\t\tthis.style.height = `${h}px`;\n\t\t\tthis.style.left = `${l}px`;\n\t\t\tthis.style.top = `${t}px`;\n\t\t\t//this.style.opacity = \"\";\n\n\t\t\tif (this.#parent.multi) {\n\t\t\t\tthis.classList.add(\"multi\");\n\t\t\t\tthis.#grd.classList.add(\"multi\");\n\t\t\t} else {\n\t\t\t\tthis.classList.remove(\"multi\");\n\t\t\t\tthis.#grd.classList.remove(\"multi\");\n\t\t\t}\n\n\t\t\tthis.#initData(formattedData);\n\t\t}, 100);\n\t}\n\n\tclose = () => {\n\t\tthis.classList.remove(\"active\");\n\t\tif (this.#parent && this.#parent.cell) {\n\t\t\tthis.#parent.cell.focus({ preventScroll: true });\n\t\t}\n\t}\n\n\n\t#onClick = (e) => {\n\t\tconst $cell = e.target.closest(\"th,td\");\n\t\tif (this.#grd.classList.contains(\"multi\")) {\n\t\t\tconst index = parseInt($cell?.dataset.index, 10);\n\t\t\tthis.#checkRow(index);\n\t\t}\n\t\telse {\n\t\t\tconst col = parseInt($cell?.dataset.col, 10);\n\n\t\t\tif (col >= 2) {\n\t\t\t\tthis.#returnRow();\n\t\t\t}\n\t\t}\n\t}\n\n\t#onKeydown_input = (e) => {\n\t\tswitch (e.code) {\n\t\t\tcase \"Enter\":\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tconst index = this.#grd.row.at();\n\t\t\t\tif (index < 0) {\n\t\t\t\t\tthis.#selectRow(0)\n\t\t\t\t} else {\n\t\t\t\t\tthis.#selectRow(index)\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"Tab\":\n\t\t\t\tthis.#selectRow(this.#grd.row.at());\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\t#onKeydown = (e) => {\n\t\tlet index;\n\t\tswitch (e.code) {\n\t\t\tcase \"Escape\":\n\t\t\t\tthis.close();\n\t\t\t\tbreak;\n\t\t\tcase \"Enter\":\n\t\t\t\tif (this.classList.contains(\"multi\")) {\n\t\t\t\t\tthis.#onOk();\n\t\t\t\t} else {\n\t\t\t\t\tthis.#returnRow();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"Tab\":\n\t\t\t\tif (this.classList.contains(\"expand\")) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis.querySelector(\"input[type='text']\").focus({ preventScroll: true });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tindex = this.#grd.row.at();\n\t\t\t\tif (index < 0) {\n\t\t\t\t\tthis.#selectRow(0)\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"Space\":\n\t\t\t\te.preventDefault();\n\t\t\t\tif ([\"TH\",\"TD\"].includes(e.target.tagName)) {\n\t\t\t\t\tthis.#checkRow(this.#grd.row.at());\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t#onOk = () => {\n\n\t\tconst fields = this.#grd.fields.get();\n\t\tconst kIndex = fields.indexOf(\"k\");\n\t\tconst chkIndex = fields.indexOf(\"CHK\");\n\n\t\tconst arr = [];\n\t\tthis.#sheet.view.getArray().forEach(o => {\n\t\t\tif (o.v[chkIndex] === \"Y\") {\n\t\t\t\tarr.push(o.v[kIndex]);\n\t\t\t}\n\t\t});\n\n\t\tthis.#parent.value = arr.join(this.#parent.separator);\n\n\t\tthis.#parent.sheet.rowManager.refresh(true);\n\t\tthis.close();\n\t}\n\n\t#returnRow = () => {\n\t\tconst index = this.#grd.row.at();\n\n\t\tif (index >= 0) {\n\t\t\tconst record = this.#sheet.view.get(index);\n\n\t\t\tthis.#parent.value = record.k;\n\t\t\tthis.#parent.sheet.rowManager.refresh(true);\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\t#checkRow = (index) => {\n\n\t\tif (this.#grd.classList.contains(\"multi\") && index >= 0) {\n\t\t\tconst record = this.#sheet.view.get(index);\n\n\t\t\tthis.#grd.data.setValue(record.m._[NINE_TABLE.META.INDEX.ROWID], \"CHK\", record.CHK === \"Y\" ? \"N\" : \"Y\");\n\n\t\t\tthis.#grd.refresh();\n\t\t}\n\t};\n\n\t#selectRow = (index) => {\n\t\tif (index !== -1) {\n\t\t\tthis.#sheet.row.focus(index, () => {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tconst cell = this.#sheet.querySelector(`tr[data-index=\"${index}\"] td[data-col=\"2\"]`);\n\t\t\t\t\tthis.#sheet.navigation.currentCell = cell;\n\t\t\t\t\tcell.focus({ preventScroll: true });\n\t\t\t\t\tthis.#sheet.invalidate();\n\t\t\t\t});\n\t\t\t});\n\t\t} else {\n\t\t\tthis.#sheet.row.focus(-1, () => {\n\t\t\t});\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.#sheet.selection.clear();\n\n\t\t\t\tthis.#sheet.navigation.currentCell = this.#sheet.querySelector(`tr[data-index=\"0\"] td[data-col=\"2\"]`);\n\t\t\t\tthis.#sheet.focus({ preventScroll: true });\n\t\t\t\tthis.#sheet.invalidate();\n\t\t\t});\n\t\t}\n\t}\n\n\t#onSelectAll = (e) => {\n\n\t\tconst chkIdx = this.#grd.fields.get().indexOf(\"CHK\");\n\n\t\tthis.#grd.data.getArray().forEach(record => {\n\t\t\trecord.v[chkIdx] = e.target.checked ? \"Y\" : \"N\";\n\t\t});\n\n\t\tthis.#sheet.invalidate();\n\t};\n\n\n\t#onInput = (e) => {\n\t\tconst query = e.target.value.toLowerCase().trim();\n\n\t\tif (!query) {\n\t\t\tthis.#sheet.filtering.clear();\n\t\t} else {\n\t\t\tconst rawRecords = this.#grd.data.getArray();\n\t\t\tconst fields = this.#grd.fields.get();\n\n\t\t\tconst colnm = \"tmp1\";\n\t\t\tconst data2Idx = fields.indexOf(colnm);\n\n\t\t\tlet matchedValues = [];\n\t\t\trawRecords.forEach(record => {\n\t\t\t\tconst val = data2Idx >= 0 && record.v ? record.v[data2Idx] : \"\";\n\t\t\t\tconst textVal = String(val).replace(/<[^>]*>?/gm, '').toLowerCase();\n\n\t\t\t\tif (textVal.includes(query)) {\n\t\t\t\t\tmatchedValues.push(val);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.#sheet.filtering.set({\n\t\t\t\t[colnm]: [...new Set(matchedValues)]\n\t\t\t});\n\t\t}\n\t}\n\n\tget targetCell() {\n\t\treturn this.#parent;\n\t}\n\n\t#initEvents = () => {\n\t\tthis.querySelector(\".search-input\").addEventListener(\"input\", this.#onInput);\n\t\tthis.querySelector(\".search-input\").addEventListener(\"keydown\", this.#onKeydown_input);\n\t\tthis.querySelector(\"#btnOk\").addEventListener(\"click\", this.#onOk);\n\t\tthis.querySelector(\"#chkAll\").addEventListener(\"change\", this.#onSelectAll);\n\n\t\tthis.#sheet.addEventListener(\"keydown\", this.#onKeydown);\n\t\tthis.#sheet.addEventListener(\"click\", this.#onClick);\n\n\t\tdocument.addEventListener(\"mousedown\", (e) => {\n\n\t\t\tconst path = e.composedPath ? e.composedPath() : [];\n\n\t\t\tif (path.includes(this)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.close();\n\t\t});\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"text\" class=\"search-input\" placeholder=\"Search...\" />\n \n <nine-table-simple class=\"combo-list\" theme=\"simple\">\n <table auto-fit-col=\"true\">\n <colgroup>\n <col width=\"30\" fixed=\"left\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"0\" />\n </colgroup>\n <tbody>\n <tr>\n <td cell-type=\"checkbox\" data-bind=\"CHK\"></td>\n <td data-bind=\"tmp1\" />\n <td data-bind=\"tmp2\" />\n <td data-bind=\"tmp3\" />\n <td data-bind=\"tmp4\" />\n <td data-bind=\"tmp5\" />\n <td data-bind=\"tmp6\" />\n <td data-bind=\"tmp7\" />\n <td data-bind=\"tmp8\" />\n <td data-bind=\"tmp9\" />\n <td data-bind=\"tmp10\" />\n <td data-bind=\"k\" />\n </tr>\n </tbody>\n </table>\n </nine-table-simple>\n \n <div class=\"footer\">\n <label for=\"chkAll\"><input id=\"chkAll\" type=\"checkbox\" checked><span>Select All</span></label>\n <button id=\"btnOk\">OK</button>\n </div>\n `;\n\t};\n}\n\nif (!customElements.get('cell-combo-panel')) {\n\tcustomElements.define(\"cell-combo-panel\", CellComboPanel);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\nimport \"./cell-combo-panel.js\";\n\nexport class CellCombo extends EditableCellElement {\n\t#target;\n\t#dataSource = [];\n\t#panel;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#init();\n\t}\n\n\trerenderer = () => {\n\t\tthis.#initData();\n\t\tthis.refresh();\n\t};\n\n\n\trefresh = () => {\n\t\tsuper.refresh();\n\n\t\tthis.#target.textContent = this.#getDisplayText() || \"Select\";\n\t\tthis.#validateInput();\n\t};\n\n\t#getDisplayText = () => {\n\t\tif (!this.value || !Array.isArray(this.#dataSource)) return \"\";\n\n\t\tif (this.multi) {\n\t\t\tconst keys = String(this.value).split(this.multiSeparator);\n\t\t\treturn this.#dataSource\n\t\t\t\t.filter(m => keys.includes(String(m[this.keyName])))\n\t\t\t\t.map(m => m[this.valueName])\n\t\t\t\t.join(this.multiSeparator);\n\t\t} else {\n\t\t\tconst found = this.#dataSource.find(m => String(m[this.keyName]) === String(this.value));\n\t\t\treturn found ? found[this.valueName] : this.value;\n\t\t}\n\t}\n\n\t#validateInput = () => {\n\t\tif (!super.cell) return;\n\t\tsuper.cell.classList.remove(\"invalid\");\n\n\t\tif (this.value === null || this.value === undefined || this.value === \"\" || !Array.isArray(this.#dataSource)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst list = this.multi ? String(this.value).split(this.multiSeparator) : [this.value];\n\t\tfor (const v of list) {\n\t\t\tconst idx = this.#dataSource.findIndex(m => String(v) === String(m[this.keyName]));\n\t\t\tif (idx < 0) {\n\t\t\t\tsuper.cell.classList.add(\"invalid\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t};\n\n\t#init = () => {\n\n\t\tthis.#renderer();\n\n\t\tthis.#initData();\n\t\tthis.#initEvent();\n\t}\n\n\t#initData = () => {\n\t\t//if (!this.sheet || !this.cell) return;\n\n\t\tconst dataSource = this.cell.getAttribute(\"data-source\");\n\t\tif (dataSource) {\n\t\t\tthis.#dataSource = super.getExprValue(dataSource, super.tr.data, super.tr.dataset.row);\n\t\t}\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <button class=\"btn1\" type=\"button\" tabindex=\"-1\">Select</button>\n <button class=\"btn2\" type=\"button\" tabindex=\"-1\"></button>\n `;\n\n\t\tthis.#target = this.querySelector(\".btn1\");\n\t};\n\n\t#initEvent = () => {\n\t\tthis.querySelectorAll(\"button\").forEach($el => {\n\t\t\t$el.addEventListener(\"click\", (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tthis.#togglePanel();\n\t\t\t});\n\t\t});\n\n\n\t\tthis.cell.addEventListener('keydown', (e) => {\n\t\t\tif ([\"Space\"].includes(e.code)) {\n\t\t\t\tthis.#togglePanel();\n\t\t\t}\n\t\t});\n\t}\n\n\t#togglePanel = () => {\n\n\t\tif (!this.#panel) {\n\t\t\tthis.#panel = this.sheet.querySelector(\"cell-combo-panel\");\n\t\t\tif (!this.#panel) {\n\t\t\t\tthis.#panel = document.createElement(\"cell-combo-panel\");\n\t\t\t\tthis.sheet.appendChild(this.#panel);\n\t\t\t}\n\t\t}\n\n\t\t//if (this.#panel.isOpen && this.#panel.targetCell === this) {\n\t\tif (this.#panel.classList.contains(\"active\") && this.#panel.targetCell === this) {\n\t\t\tthis.#panel.close();\n\t\t} else {\n\t\t\tthis.#panel.open(this, this.#dataSource, this.keyName, this.valueName, this.multi, this.multiSeparator);\n\t\t}\n\t}\n\n\tget dataSource() {\n\t\treturn this.#dataSource;\n\t}\n\tget keyName() {\n\t\treturn this.cell.getAttribute(\"key-name\") || \"k\";\n\t}\n\tget valueName() {\n\t\treturn this.cell.getAttribute(\"value-name\") || \"v\";\n\t}\n\tget multi() {\n\t\treturn this.cell.getAttribute('multi') === \"true\";\n\t}\n\tget multiSeparator() {\n\t\treturn this.cell.getAttribute(\"multi-separator\") || \",\";\n\t}\n\tget items() {\n\t\treturn this.cell.getAttribute(\"items\")?.split(\",\").map(s => s.trim()) || [];\n\t}\n\tget separator() {\n\t\treturn this.multiSeparator;\n\t}\n}\n\nif (!customElements.get('cell-combo')) {\n\tcustomElements.define(\"cell-combo\", CellCombo);\n}","import { trace } from \"@nopeer\";\nimport { CellElement } from \"./core/CellElement.js\";\n\nclass CellRenderer extends CellElement {\n\t#target;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"span\");\n\t}\n\n\trefresh = () => {\n\n\t\tsuper.refresh();\n\n\t\tif (this.cell.getAttribute(\"html\") === \"true\") {\n\t\t\tthis.#target.innerHTML = this.getDisplayText();\n\t\t} else {\n\t\t\tthis.#target.textContent = this.getDisplayText();\n\t\t}\n\t};\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <span class=\"wrapper\"></span>\n `;\n\t};\n}\n\nif (!customElements.get(\"cell-renderer\")) {\n\tcustomElements.define(\"cell-renderer\", CellRenderer);\n}","import { CellElement } from \"./core/CellElement.js\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport { trace } from \"@nopeer\";\n\nexport class CellButton extends CellElement {\n\t#target;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tthis.#renderer();\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#target = this.querySelector(\"button\");\n\n\t\tthis.#target.removeEventListener(\"click\", this.#cellButtonClick);\n\t\tthis.#target.addEventListener(\"click\", this.#cellButtonClick);\n\t}\n\n\t#cellButtonClick = e => {\n\t\te.stopPropagation();\n\n\t\tconst rowid = parseInt(this.cell.dataset.row, 10);\n\n\t\tconst customEvent = new CustomEvent(NINE_TABLE.EVENT.CELL_BUTTON_CLICK, {\n\t\t\tbubbles: true,\n\t\t\tcomposed: true,\n\t\t\tdetail: {\n\t\t\t\toriginalEvent: e,\n\t\t\t\tcell: this.cell,\n\t\t\t\trow: rowid,\n\t\t\t\tcol: parseInt(this.cell.dataset.col, 10),\n\t\t\t\tbind: this.dataset.bind,\n\t\t\t\tdata: this.host.data.get(rowid),\n\t\t\t\tvalue: this.value,\n\t\t\t}\n\t\t});\n\n\t\tthis.dispatchEvent(customEvent);\n\t};\n\n\trefresh = () => {\n\t\tconst rawValue = super.refresh ? super.refresh() : this.value;\n\t\t//let displayValue = this.getDisplayText(rawValue);\n\t\tthis.#target.innerHTML = this.getDisplayText(rawValue);\n\t};\n\n\t#renderer = () => {\n\n\t\tconst buttonText = \"...\";//this.getAttribute(\"text\") || super.attr[\"text\"] || \"\";\n\n\t\tthis.innerHTML = `\n <button class=\"button\">${buttonText}</button>\n `;\n\t};\n}\n\nif (!customElements.get('cell-button')) {\n\tcustomElements.define(\"cell-button\", CellButton);\n}","import { CellElement } from \"./core/CellElement.js\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport { trace } from \"@nopeer\";\n\nexport class CellTree extends CellElement {\n\n\t#iconElement;\n\t#textElement;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#init();\n\t}\n\n\t#groupExprValue = () => {\n\t\tconst records = this.data;\n\n\t\treturn \"...\";\n\t}\n\t/**\n\t * ๋ฐ์ดํฐ๊ทธ๋ฆฌ๋ ์
ํ์ค refresh ์ฌ์ดํด์ ๋ง์ถฐ ํธ์ถ\n\t */\n\trefresh() {\n\n\t\tif (this.tr.style.display === \"none\") return;\n\n\t\tconst groupId = this.tr.dataset.groupId;\n\n\t\tconst record = this.data; // ํ ๋ฐ์ดํฐ ๋ ์ฝ๋\n\t\tif (!record) return;\n\n\t\tconst level = groupId ? groupId?.split(\"_\").length - 2 : this.sheet.grouping.columns.length;\n\n\t\tthis.style.setProperty('--tree-level', level);\n\n\t\t// 2. ํ
์คํธ ํ์ (data-bind ๋๋ data-expr ๊ฒฐ๊ณผ ๋ฑ)\n\t\tthis.#textElement.textContent = this.getDisplayText();//this.textContent || record[this.getAttribute(\"data-bind\")] || '';\n\n\t\t// 3. ํธ๋ฆฌ ์์ด์ฝ ๋ฐ ์ํ ๋ฐ์\n\t\tthis.#updateTreeState(record);\n\t}\n\n\t#updateTreeState(record) {\n\t\tconst hasChildren = this.#checkHasChildren(record);\n\n\t\tconst isCollapsed = this.sheet.grouping.isCollapsed(this.tr.dataset.groupId);\n\n\t\tthis.#iconElement.className = \"icon\";\n\n\t\tthis.#iconElement.classList.remove(\"expand-on,expand-off\");\n\n\t\tif (hasChildren) {\n\t\t\tthis.#iconElement.classList.add(isCollapsed ? \"expand-off\" : \"expand-on\");\n\t\t} else {\n\t\t\tthis.#iconElement.classList.add(\"node\");\n\t\t}\n\t}\n\n\t#checkHasChildren(record) {\n\t\t// ์์ ์กด์ฌ ์ฌ๋ถ ํ๋จ ๋ก์ง\n\t\treturn this.tr.data.length > 0;\n\t}\n\n\t#init = () => {\n\t\tthis.#renderer();\n\t\tthis.#initEvent();\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n\t <div class=\"item\">\n <div class=\"icon\"></div>\n <span class=\"tree-text\"></span>\n </div>\n `;\n\n\t\tthis.#iconElement = this.querySelector(\".icon\");\n\t\tthis.#textElement = this.querySelector(\".tree-text\");\n\t}\n\n\t#initEvent = () => {\n\t\tthis.#iconElement.addEventListener(\"click\", (e) => {\n\t\t\te.stopPropagation();\n\t\t\tthis.sheet.grouping.toggleGroup(this.tr.dataset.groupId);\n\t\t});\n\t}\n}\n\nif (!customElements.get('cell-tree')) {\n\tcustomElements.define('cell-tree', CellTree);\n}","import { trace } from \"@nopeer\";\nimport { CellElement } from \"./core/CellElement.js\";\nimport {NINE_TABLE} from \"@\";\nimport {CellTree} from \"@/cell/cell-tree.js\";\n\nclass CellRowIndicator extends CellElement {\n\t#mainTarget;\n\t#subTarget;\n\t#statusTarget;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tthis.#renderer();\n\t\tsuper.connectedCallback();\n\n\t\tif (this.cell) {\n\t\t\tthis.cell.removeAttribute(\"tabindex\");\n\t\t\tthis.cell.dataset.bind = \"rowState\";\n\t\t}\n\n\t\tthis.#mainTarget = this.querySelector(\".ng-row-main\");\n\t\tthis.#subTarget = this.querySelector(\".ng-row-sub\");\n\t\tthis.#statusTarget = this.querySelector(\".row-status\");\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n\t\t\t<span class=\"ng-row-main\"></span>\n <span class=\"ng-row-sub\"></span>\n <span class=\"row-status\"></span>\n `;\n\t}\n\n\trefresh = () => {\n\n\t\tif (!this.cell || !this.tr) return;\n\n\t\tthis.classList.remove(\"is-insert\", \"is-update\", \"is-delete\");\n\n\t\tconst rawRecord = this.tr.data;\n\n\t\tif (rawRecord) {\n\n\t\t\tif (rawRecord.m === undefined) {\n\n\t\t\t} else {\n\t\t\t\tswitch (rawRecord.m._[NINE_TABLE.META.INDEX.ROW_STATE]) {\n\t\t\t\t\tcase NINE_TABLE.ROW_STATE.INSERT:\n\t\t\t\t\t\tthis.classList.add(\"is-insert\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase NINE_TABLE.ROW_STATE.UPDATE:\n\t\t\t\t\t\tthis.classList.add(\"is-update\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase NINE_TABLE.ROW_STATE.DELETE:\n\t\t\t\t\t\tthis.classList.add(\"is-delete\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst displayNum = this.index + 1;\n\t\tconst formattedNum = displayNum.toLocaleString();\n\n\t\tif (displayNum >= 10000) {\n\n\t\t\tconst splitIndex = formattedNum.length - 4;\n\t\t\tconst prefixPart = formattedNum.substring(0, splitIndex + 1);\n\t\t\tconst suffixPart = formattedNum.substring(splitIndex + 1);\n\n\t\t\tthis.#mainTarget.innerHTML = `\n \t<span class=\"ng-row-prefix\">${prefixPart}</span>\n \t<span class=\"ng-row-suffix\">${suffixPart}</span>\n \t<div class=\"row-status\"></div>\n \t`;\n\t\t} else {\n\t\t\tthis.#mainTarget.innerHTML = `${formattedNum}`;\n\t\t}\n\n\t\tconst isSorted = this.sheet.querySelector(\"thead .asc,thead .desc\") ? true : false;\n\t\tconst isFitered = this.sheet.querySelector(\"thead nine-table-filter-button.filtered\") ? true : false;\n\n\t\tthis.#subTarget.innerHTML = this.row;\n\t\tthis.#subTarget.style.display = (isSorted || isFitered) ? \"\" : \"none\";\n\t};\n}\n\nif (!customElements.get('cell-row-indicator')) {\n\tcustomElements.define(\"cell-row-indicator\", CellRowIndicator);\n}\n","// ui/col/col-expand.js\nimport { COLLAPSED_WIDTH } from \"@/layout/core/TableCompiler.js\";\n\nexport class ColExpand extends HTMLElement {\n #sheet;\n #cell;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#cell = this.closest('th, td');\n this.#sheet = this.closest('nine-table-sheet');\n\n if (this.#cell) {\n this.#cell.style.position = 'relative';\n }\n\n const isCollapsed =\n this.getAttribute('collapsed') === 'true' ||\n this.#cell?.getAttribute('collapsed') === 'true';\n\n if (isCollapsed) {\n requestAnimationFrame(() => {\n this.collapse(true);\n });\n } else {\n this.classList.remove('collapsed');\n this.classList.add('expand');\n }\n\n this.removeEventListener('click', this.#onClick);\n this.addEventListener('click', this.#onClick);\n }\n\n #onClick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (this.classList.contains('expand')) {\n this.collapse();\n } else {\n this.expand();\n }\n };\n\n expand = () => {\n if (!this.#sheet?.colResizer || !this.#cell) return;\n const colIndex = parseInt(this.#cell.dataset.col, 10);\n const colSpan = this.#cell.colSpan || 1;\n\n this.classList.remove('collapsed');\n this.classList.add('expand');\n this.#cell.setAttribute('collapsed', 'false');\n this.#cell.style.color = '';\n\n const targetWidth = parseInt(this.#cell.dataset.expandWidth, 10) || 100;\n\n if (colSpan === 1) {\n this.#sheet.colResizer.setColumnWidth(colIndex, targetWidth);\n } else {\n const singleWidth = Math.max(30, Math.floor(targetWidth / colSpan));\n for (let i = 0; i < colSpan; i++) {\n this.#sheet.colResizer.setColumnWidth(colIndex + i, singleWidth);\n }\n }\n\n requestAnimationFrame(() => {\n if (typeof this.#sheet.refreshLayout === 'function') {\n this.#sheet.refreshLayout();\n }\n });\n };\n\n collapse = (isInitialInit = false) => {\n if (!this.#sheet?.colResizer || !this.#cell) return;\n const colIndex = parseInt(this.#cell.dataset.col, 10);\n const colSpan = this.#cell.colSpan || 1;\n\n if (this.classList.contains('expand')) {\n const col = this.#sheet.querySelector(`colgroup col[data-col=\"${colIndex}\"]`);\n const currentW = col ? parseInt(col.getAttribute('width'), 10) : 0;\n if (currentW > COLLAPSED_WIDTH) {\n this.#cell.dataset.expandWidth = String(currentW * colSpan);\n }\n }\n\n this.classList.remove('expand');\n this.classList.add('collapsed');\n this.#cell.setAttribute('collapsed', 'true');\n this.#cell.style.color = 'transparent';\n\n if (colSpan === 1) {\n this.#sheet.colResizer.setColumnWidth(colIndex, COLLAPSED_WIDTH);\n } else {\n const splitWidth = Math.max(10, Math.floor(COLLAPSED_WIDTH / colSpan));\n for (let i = 0; i < colSpan; i++) {\n this.#sheet.colResizer.setColumnWidth(colIndex + i, splitWidth);\n }\n }\n\n requestAnimationFrame(() => {\n if (typeof this.#sheet.refreshLayout === 'function') {\n this.#sheet.refreshLayout();\n }\n });\n };\n\n disconnectedCallback() {\n this.removeEventListener('click', this.#onClick);\n }\n}\n\nif (!customElements.get('nine-table-col-expand')) {\n customElements.define('nine-table-col-expand', ColExpand);\n}","import { trace } from \"@nopeer\";\nimport { ColFixManager } from \"@/col/ColFixManager.js\";\n\nexport class ContextMenu extends HTMLElement {\n #tableHost;\n #panel;\n\n connectedCallback() {\n const root = this.getRootNode();\n this.#tableHost = root instanceof ShadowRoot ? root.host : (this.closest('nine-table') || root.host);\n\n if (!this.#tableHost) {\n this.#tableHost = this.parentElement?.closest('nine-table') || this.assignedSlot?.closest('nine-table');\n }\n\n if (!this.#tableHost) return;\n }\n\n #onContextMenu = (e) => {\n const path = e.composedPath ? e.composedPath() : [];\n const targetCell = path.find(el => el.tagName === 'TH' || el.tagName === 'TD');\n\n if (!targetCell) return;\n\n const targetTable = path.find(el => el.tagName === 'TABLE') || targetCell.closest('table');\n\n e.preventDefault();\n e.stopPropagation();\n\n this.openMenu(e.clientX, e.clientY, targetCell, targetTable);\n };\n\n #getTargetSheet(targetCell) {\n return targetCell?.closest('nine-table-sheet') || this.#tableHost.activeSheet || this.#tableHost;\n }\n\n #getFixManager(targetCell) {\n const sheet = this.#getTargetSheet(targetCell);\n if (!sheet) return null;\n\n if (!sheet.colFix) {\n sheet.colFix = new ColFixManager(sheet);\n }\n return sheet.colFix;\n }\n\n #parseCustomMenuItems(containerElement, activeTable) {\n const items = [];\n const activeTableId = activeTable?.id;\n const allUls = Array.from(containerElement.querySelectorAll(':scope > ul'));\n\n allUls.forEach(rootUl => {\n const targetTableAttr = rootUl.getAttribute('target-table');\n\n if (!targetTableAttr || (activeTableId && targetTableAttr === activeTableId)) {\n const parsedList = this.#traverseUl(rootUl);\n items.push(...parsedList);\n }\n });\n\n return items;\n }\n\n #traverseUl(ulEl) {\n const list = [];\n Array.from(ulEl.children).forEach(child => {\n const tagName = child.tagName.toLowerCase();\n\n if (tagName === 'hr' || child.classList.contains('separator')) {\n list.push({ type: 'separator' });\n return;\n }\n\n if (tagName === 'li') {\n let name = '';\n const spanEl = child.querySelector(':scope > span');\n if (spanEl) {\n name = spanEl.textContent.trim();\n } else {\n name = Array.from(child.childNodes)\n .filter(n => n.nodeType === Node.TEXT_NODE)\n .map(n => n.textContent.trim())\n .join('');\n }\n\n const subUl = child.querySelector(':scope > ul');\n const item = {\n menuId: child.id || name,\n name: name,\n className: child.className || '',\n disabled: child.hasAttribute('disabled') || child.getAttribute('disabled') === 'true',\n isCustom: true\n };\n\n if (subUl) {\n item.items = this.#traverseUl(subUl);\n }\n\n list.push(item);\n }\n });\n return list;\n }\n\n #buildMenuItems(activeTable, isHeaderCell, targetCell) {\n const useDefault = this.getAttribute('use-default-menu') !== 'false';\n let rawItems = [];\n\n const customItems = this.#parseCustomMenuItems(this, activeTable);\n if (customItems.length > 0) {\n rawItems.push(...customItems);\n }\n\n const fixManager = this.#getFixManager(targetCell);\n const currentFixState = fixManager?.getFixState(targetCell, activeTable) ?? 'none';\n const isFixable = isHeaderCell && (fixManager?.canFixColumn(targetCell, activeTable) ?? false);\n\n let fixMenuItem = null;\n if (currentFixState === 'left' || currentFixState === 'right') {\n fixMenuItem = {\n menuId: 'unfix-column',\n name: 'Unfix Column',\n className: 'ng-menu-unfix-col',\n disabled: !isHeaderCell\n };\n } else {\n fixMenuItem = {\n menuId: 'fix-column',\n name: 'Fix Column',\n className: 'ng-menu-fix-col',\n disabled: !isFixable\n };\n }\n\n if (useDefault) {\n rawItems.push(\n { type: 'separator' },\n {\n menuId: 'sort',\n name: 'Sort',\n className: 'ng-menu-sort',\n disabled: !isHeaderCell\n },\n fixMenuItem,\n { type: 'separator' },\n { menuId: 'filtering', name: 'Filtering', className: 'ng-menu-filtering' },\n { menuId: 'maximize', name: 'Maximize', className: 'maximize' },\n {\n menuId: 'export',\n name: 'Export',\n className: 'export',\n items: [\n { menuId: 'export-excel', name: 'Excel', className: 'export-excel' },\n { menuId: 'export-pdf', name: 'PDF', className: 'export-pdf', disabled: true }\n ]\n },\n {\n menuId: 'properties',\n name: 'Options',\n className: 'options',\n items: [\n { menuId: 'show-title-bar', name: 'Title Bar Show/Hide', className: 'show-title-bar' },\n { menuId: 'show-status-bar', name: 'Status Bar Show/Hide', className: 'show-status-bar' },\n { menuId: 'auto-fit-col', name: 'Auto Fit Columns', className: 'auto-fit-col' }\n ]\n }\n );\n }\n\n const cleanedItems = [];\n rawItems.forEach((item) => {\n if (item.type === 'separator') {\n if (cleanedItems.length === 0 || cleanedItems[cleanedItems.length - 1].type === 'separator') {\n return;\n }\n }\n cleanedItems.push(item);\n });\n\n if (cleanedItems.length > 0 && cleanedItems[cleanedItems.length - 1].type === 'separator') {\n cleanedItems.pop();\n }\n\n return cleanedItems;\n }\n\n openMenu(x, y, targetCell, targetTable) {\n const targetParent = this.#tableHost.shadowRoot || this.#tableHost;\n\n if (!this.#panel) {\n this.#panel = document.createElement('nine-table-menu-panel');\n targetParent.appendChild(this.#panel);\n }\n\n const isHeaderCell = !!targetCell.closest('thead');\n const menuItems = this.#buildMenuItems(targetTable, isHeaderCell, targetCell);\n\n this.#panel.render(menuItems, (e) => this.#handleMenuClick(e, targetCell, targetTable));\n\n const targetSheet = this.#getTargetSheet(targetCell);\n this.#syncMenuStates(targetSheet);\n\n this.#panel.openAt(x, y);\n }\n\n #syncMenuStates(targetSheet) {\n if (!this.#panel || !targetSheet) return;\n\n const isFiltering = targetSheet.filtering?.isFiltering?.() || false;\n this.#panel.toggleItemState('filtering', 'on', isFiltering);\n\n const autoFit = this.#tableHost.getAttribute('auto-fit-col') === 'true';\n this.#panel.toggleItemState('auto-fit-col', 'on', autoFit);\n\n const showTitle = this.#tableHost.getAttribute('show-title-bar') === 'true';\n this.#panel.toggleItemState('show-title-bar', 'on', showTitle);\n }\n\n #handleMenuClick(e, targetCell, targetTable) {\n const menuId = e.menuId;\n\n const customEvent = new CustomEvent('menu-click', {\n detail: { menuId, targetCell, targetTable, originalEvent: e },\n bubbles: true,\n composed: true\n });\n this.dispatchEvent(customEvent);\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n const targetSheet = this.#getTargetSheet(targetCell);\n\n switch (menuId) {\n case 'fix-column':\n case 'unfix-column':\n const fixManager = this.#getFixManager(targetCell);\n fixManager?.executeFixToggle(menuId, targetCell);\n break;\n\n case 'sort':\n if (!isNaN(baseCol)) {\n targetSheet.sorting?.handleSortFromMenu?.(baseCol, targetCell);\n }\n break;\n\n case 'filtering':\n targetSheet?.filtering?.toggle();\n break;\n\n case 'auto-fit-col':\n this.#tableHost.setAttribute('auto-fit-col', this.#tableHost.getAttribute('auto-fit-col') === 'true' ? 'false' : 'true');\n break;\n\n case 'show-title-bar':\n this.#tableHost.setAttribute('show-title-bar', this.#tableHost.getAttribute('show-title-bar') === 'true' ? 'false' : 'true');\n break;\n }\n\n this.#panel.close();\n }\n\n disconnectedCallback() {\n this.#tableHost?.removeEventListener('contextmenu', this.#onContextMenu);\n }\n}\n\nif (!customElements.get('nine-table-menu')) {\n customElements.define('nine-table-menu', ContextMenu);\n}","// ui/menu/nine-table-menu-panel.js\n\nexport class MenuPanel extends HTMLElement {\n #onCallback;\n #closeHandler = null;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n\n this.style.position = 'fixed';\n this.style.display = 'none';\n this.style.zIndex = '99999';\n\n this.innerHTML = `\n <div class=\"menu-wrapper\">\n <ul class=\"menu-container\"></ul>\n </div>\n `;\n }\n\n render(items, callback) {\n this.#onCallback = callback;\n const container = this.querySelector('.menu-container');\n if (!container) return;\n\n container.innerHTML = '';\n\n this.#appendItems(container, items);\n this.#bindClickEvents();\n }\n\n openAt(x, y, targetCell = null) {\n this.style.display = 'block';\n\n if (targetCell) {\n const cellRect = targetCell.getBoundingClientRect();\n const cellRightX = cellRect.right;\n\n requestAnimationFrame(() => {\n const wrapper = this.querySelector('.menu-wrapper');\n if (!wrapper) return;\n const panelWidth = wrapper.getBoundingClientRect().width;\n\n let calculatedLeft = cellRightX - panelWidth;\n\n if (calculatedLeft < 0) {\n calculatedLeft = cellRect.left;\n }\n\n const panelHeight = wrapper.getBoundingClientRect().height;\n let calculatedTop = y;\n if (y + panelHeight > window.innerHeight) {\n calculatedTop = y - panelHeight;\n }\n\n this.style.left = `${calculatedLeft}px`;\n this.style.top = `${calculatedTop}px`;\n });\n } else {\n this.style.left = `${x}px`;\n this.style.top = `${y}px`;\n\n requestAnimationFrame(() => {\n const wrapper = this.querySelector('.menu-wrapper');\n if (!wrapper) return;\n const rect = wrapper.getBoundingClientRect();\n\n if (x + rect.width > window.innerWidth) {\n this.style.left = `${x - rect.width}px`;\n }\n if (y + rect.height > window.innerHeight) {\n this.style.top = `${y - rect.height}px`;\n }\n });\n }\n\n if (this.#closeHandler) {\n window.removeEventListener('pointerdown', this.#closeHandler);\n }\n\n this.#closeHandler = (e) => {\n const path = e.composedPath ? e.composedPath() : [];\n if (!path.includes(this) && !this.contains(e.target)) {\n this.close();\n }\n };\n\n setTimeout(() => {\n window.addEventListener('pointerdown', this.#closeHandler);\n }, 0);\n }\n\n close() {\n this.style.display = 'none';\n if (this.#closeHandler) {\n window.removeEventListener('pointerdown', this.#closeHandler);\n this.#closeHandler = null;\n }\n }\n\n toggleItemState(menuId, className, condition) {\n const li = this.querySelector(`li[menu-id=\"${menuId}\"]`);\n if (li) {\n condition ? li.classList.add(className) : li.classList.remove(className);\n }\n }\n\n #appendItems(parentUl, items) {\n items.forEach(item => {\n if (item.type === 'separator') {\n const sep = document.createElement('li');\n sep.className = 'ng-menu-separator';\n parentUl.appendChild(sep);\n return;\n }\n\n const li = document.createElement('li');\n li.setAttribute('menu-id', item.menuId);\n li.className = `${item.className || ''} ${item.items ? 'submenu' : ''} ${item.disabled ? 'disabled' : ''}`.trim();\n\n const span = document.createElement('span');\n span.textContent = item.name;\n li.appendChild(span);\n\n if (item.items && item.items.length > 0) {\n const subUl = document.createElement('ul');\n subUl.className = 'ng-menu-sublist';\n this.#appendItems(subUl, item.items);\n li.appendChild(subUl);\n }\n\n parentUl.appendChild(li);\n });\n }\n\n #bindClickEvents() {\n this.querySelectorAll('li[menu-id]').forEach(li => {\n li.addEventListener('click', (e) => {\n e.stopPropagation();\n if (li.classList.contains('disabled')) return;\n\n const menuId = li.getAttribute('menu-id');\n this.#onCallback?.({ menuId, target: li });\n this.close();\n });\n });\n }\n\n disconnectedCallback() {\n this.close();\n }\n}\n\nif (!customElements.get('nine-table-menu-panel')) {\n customElements.define('nine-table-menu-panel', MenuPanel);\n}"],"mappings":"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"}
|