@ninebone/util 1.0.15 โ 1.0.16
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/dist/nine-util.js +22 -8
- package/dist/nine-util.js.map +1 -1
- package/dist/nine-util.umd.js +1 -1
- package/dist/nine-util.umd.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nine-util.umd.js","sources":["../src/core/Config.js","../src/core/Trace.js","../src/core/TaskDebouncer.js","../src/external/NoPeer.js","../src/ux/Loading.js","../src/net/Fetch.js","../src/ux/dialog/style.dialog.js","../src/ux/dialog/nineDialog.js","../src/ux/dialog/nineConfirm.js","../src/ux/dialog/ninePrompt.js","../src/ux/dialog/NineUxUtil.js","../src/ux/UxSplitter.js","../node_modules/dayjs/dayjs.min.js","../src/utils/NinePopup.js","../src/utils/TreeUtil.js","../src/utils/NineUtil.js","../src/index.js","../src/utils/promise.js"],"sourcesContent":["const listeners = new Set();\r\n\r\n// ๐ก [ํต์ฌ] ์ ์ญ ์ ์ฅ์๋ฅผ ๋จ์ผํํฉ๋๋ค.\r\n// window์ ์ด๋ฏธ ์์ผ๋ฉด ๊ทธ๊ฒ์ ์ฐ๊ณ , ์์ผ๋ฉด ์ด๊ธฐ๊ฐ์ ์์ฑํ์ฌ ๋ฑ๋กํฉ๋๋ค.\r\nconst _initialConfig = {\r\n\tux: { nativeOverride: false, theme: 'light' },\r\n\tboard: { readOnly: false },\r\n\tcssPath: \"\",\r\n\tdebug: false\r\n};\r\n\r\nif (typeof window !== 'undefined' && !window.__NINE_GLOBAL_CONFIG__) {\r\n\twindow.__NINE_GLOBAL_CONFIG__ = _initialConfig;\r\n}\r\n\r\n// ์ด์ ๋ชจ๋ ๋ชจ๋์ _config๋ ๋์ผํ window ๊ฐ์ฒด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.\r\nconst _config = typeof window !== 'undefined' ? window.__NINE_GLOBAL_CONFIG__ : _initialConfig;\r\n\r\nexport const subscribeConfig = (fn) => {\r\n\tlisteners.add(fn);\r\n\tfn('all', _config);\r\n\treturn () => listeners.delete(fn);\r\n};\r\n\r\n// Proxy ์ญ์ ์ ์ญ ์ ์ฅ์์ธ _config๋ฅผ ์กฐ์ํฉ๋๋ค.\r\nexport const config = new Proxy(_config, {\r\n\tset(target, prop, value) {\r\n\t\ttarget[prop] = value;\r\n\t\tlisteners.forEach(fn => fn(prop, target));\r\n\t\treturn true;\r\n\t},\r\n\tget(target, prop) {\r\n\t\treturn target[prop];\r\n\t}\r\n});\r\n\r\nexport const nine = {\r\n\tconfig: config,\r\n\r\n\t// Getter์์ window.nine๊น์ง ํ์ธํ ํ์๋ ์์ต๋๋ค.\r\n\t// ์ด๋ฏธ config ์์ฒด๊ฐ ์ ์ญ ์ ์ฅ์(__NINE_GLOBAL_CONFIG__)๋ฅผ ๋ฐ๋ผ๋ณด๊ณ ์๊ธฐ ๋๋ฌธ์
๋๋ค.\r\n\tget cssPath() {\r\n\t\treturn this.config.cssPath || \"\";\r\n\t},\r\n\r\n\tsetup(options = {}) {\r\n\t\tObject.entries(options).forEach(([key, value]) => {\r\n\t\t\t// ๊น์ ๋ณํฉ ์ง์\r\n\t\t\tif (typeof value === 'object' && value !== null && !Array.isArray(value)) {\r\n\t\t\t\tthis.config[key] = { ...this.config[key], ...value };\r\n\t\t\t} else {\r\n\t\t\t\tthis.config[key] = value;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// ๋ค๋ฅธ ๋ชจ๋์์ window.nine์ผ๋ก ์ ๊ทผํ ์ ์๋๋ก ๋ณด์ฅ\r\n\t\tif (typeof window !== 'undefined') {\r\n\t\t\twindow.nine = window.nine || this;\r\n\t\t}\r\n\t}\r\n};","//import { nine } from '@nine-lab/nine-util';\r\n\r\nexport class Trace {\r\n\t#name;\r\n\t#color;\r\n\r\n\tconstructor(name = null, color = \"green\") {\r\n\t\tthis.#name = name;\r\n\t\tthis.#color = color;\r\n\t}\r\n\r\n\tinit(name, color = \"green\") {\r\n\t\tthis.#name = name;\r\n\t\tthis.#color = color;\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * ๐ฏ ์ค์๊ฐ ๋๋ฒ๊ทธ ํ์ฑํ ๋ฐ ํํฐ ํ๊ฒ ์ฌ๋ถ ์ฒดํฌ ํฌํผ\r\n\t */\r\n\t#isTraceEnabled() {\r\n\t\t// 1. ์ต์๋จ main.jsx์์ nine.setup() ์ธํ
์ด ์๋ฃ๋์๋์ง ํ์ธ\r\n\t\tif (nine && nine.config && nine.config.debug) {\r\n\t\t\tconst debugConfig = nine.config.debug;\r\n\r\n\t\t\t// ๐จ ๋๋ฒ๊ทธ ๋ง์คํฐ ์ค์์น๊ฐ ๊บผ์ ธ์์ผ๋ฉด ๋ฌด์กฐ๊ฑด ์ถ๋ ฅ ์ ํจ\r\n\t\t\tif (debugConfig.enable === false) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// ๐ฏ [ํํฐ ์ฒดํฌ ์ถ๊ฐ] ๋๋ฒ๊ทธ๊ฐ ์ผ์ ธ์๊ณ , ํํฐ(filter) ๋ฐฐ์ด ๋ช
๋จ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ\r\n\t\t\tif (debugConfig.enable === true && Array.isArray(debugConfig.filter)) {\r\n\t\t\t\t// ์ด๋ฆ์ด ์ง์ ์ ๋ ์์ trace.log๋ ํต๊ณผ, ์ด๋ฆ์ด ์๋ค๋ฉด ํํฐ ๋ช
๋จ์ ์์ด์ผ๋ง ํต๊ณผ!\r\n\t\t\t\tif (this.#name) {\r\n\t\t\t\t\treturn debugConfig.filter.includes(this.#name);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn debugConfig.enable;\r\n\t\t}\r\n\r\n\t\t// 2. [Fallback] ๋ง์ฝ nine ์
์
์ ์ ํธ์ถ๋๊ฑฐ๋ ์ธํ
์ด ์๋ค๋ฉด ๊ธฐ์กด ๋ก์ปฌ ์ฃผ์ ์ฌ๋ถ๋ก ํ๋จ\r\n\t\tif (typeof window !== 'undefined') {\r\n\t\t\treturn window.location.hostname === 'localhost' ||\r\n\t\t\t\twindow.location.hostname === '127.0.0.1' ||\r\n\t\t\t\twindow.location.hostname.startsWith('192.168.');\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\t// ๐ด ํต์ฌ: ์์ค ์์น ์ ์ง๋ฅผ ์ํ Getter ๋ก์ง\r\n\tget log() {\r\n\t\tif (!this.#isTraceEnabled()) return () => {};\r\n\r\n\t\tconst style = `color: ${this.#color}; font-weight: bold;`;\r\n\t\treturn (this.#name)\r\n\t\t\t? console.log.bind(console, `%c[${this.#name}]`, style)\r\n\t\t\t: console.log.bind(console);\r\n\t}\r\n\r\n\tget warn() {\r\n\t\tif (!this.#isTraceEnabled()) return () => {};\r\n\t\treturn (this.#name)\r\n\t\t\t? console.warn.bind(console, `%c[${this.#name}]`, \"color: cyan; font-weight: bold;\")\r\n\t\t\t: console.warn.bind(console);\r\n\t}\r\n\r\n\tget error() {\r\n\t\t// ์์คํ
์น๋ช
์ ์ฅ์ ์๋ฌ๋ ๋๋ฒ๊ทธ ๋ชจ๋/ํํฐ ์ฌ๋ถ์ ์๊ด์์ด ์ค์ ์ฅ์ ๋ชจ๋ํฐ๋ง์ ์ํด ๋ฌด์กฐ๊ฑด ์ธ์ํฉ๋๋ค.\r\n\t\treturn (this.#name)\r\n\t\t\t? console.error.bind(console, `%c[${this.#name}]`, \"color: red; font-weight: bold;\")\r\n\t\t\t: console.error.bind(console);\r\n\t}\r\n}\r\n\r\nexport const trace = new Trace();\r\nif (typeof window !== 'undefined') window.trace = trace;","export class TaskDebouncer {\r\n\t#timer = null;\r\n\t#queue = [];\r\n\t#delay;\r\n\r\n\tconstructor(delay = 50) {\r\n\t\tthis.#delay = delay;\r\n\t}\r\n\r\n\t/**\r\n\t * @param {Function} func - ์คํํ ํจ์\r\n\t * @param {...any} args - ํจ์์ ์ ๋ฌํ ์์์ ํ๋ผ๋ฏธํฐ๋ค\r\n\t */\r\n\texec(func, ...args) {\r\n\t\t// 1. ์ด๋ค ํจ์์ ์ด๋ค ์ธ์๋ค์ด ๋ค์ด์๋์ง ํ์ ์ ์ฅ\r\n\t\tthis.#queue.push({ func, args });\r\n\r\n\t\t// 2. ๋๋ฐ์ด์ค ํ์ด๋จธ ์ค์ \r\n\t\tif (this.#timer) clearTimeout(this.#timer);\r\n\r\n\t\tthis.#timer = setTimeout(() => this.#flush(), this.#delay);\r\n\t}\r\n\r\n\texecWithKey(key, func, ...args) {\r\n\t\t// 1. ๊ฐ์ ํค(์: 'resize')๊ฐ ๋ค์ด์ค๋ฉด ์ด์ ํ์์ ํด๋น ํค ์ญ์ (์ค๋ณต ์ ๊ฑฐ)\r\n\t\tthis.#queue = this.#queue.filter(task => task.key !== key);\r\n\r\n\t\t// 2. ์๋ก์ด ํ์คํฌ ์ถ๊ฐ\r\n\t\tthis.#queue.push({ key, func, args });\r\n\r\n\t\tif (this.#timer) clearTimeout(this.#timer);\r\n\t\tthis.#timer = setTimeout(() => this.#flush(), this.#delay);\r\n\t}\r\n\r\n\t#flush() {\r\n\t\tif (this.#queue.length === 0) return;\r\n\r\n\t\t// 3. ํ์ฌ๊น์ง ์์ธ ํ๋ฅผ ์ ๋นผ์ด\r\n\t\tconst tasks = this.#queue.splice(0, this.#queue.length);\r\n\t\tconst seen = new Set();\r\n\r\n\t\ttasks.forEach(task => {\r\n\t\t\t// 4. ํต์ฌ: ํจ์ ์ด๋ฆ๊ณผ ์ธ์๋ค์ ๋ฌธ์์ด๋ก ํฉ์ณ์ ์ ๋ํฌ ํค ์์ฑ\r\n\t\t\t// JSON.stringify๋ฅผ ํตํด [1, {a:1}] ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ ๋ฌธ์์ด๋ก ๋น๊ต ๊ฐ๋ฅ\r\n\t\t\tconst identifier = `${task.func.name}_${JSON.stringify(task.args)}`;\r\n\r\n\t\t\tif (!seen.has(identifier)) {\r\n\t\t\t\t// 5. ์ค๋ณต์ด ์๋ ๋๋ง ์๋ ์ธ์๋ค(...args) ๊ทธ๋๋ก ์คํ\r\n\t\t\t\ttask.func(...task.args);\r\n\t\t\t\tseen.add(identifier);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.#timer = null;\r\n\t}\r\n}","import { trace as traceOrigin } from '../core/Trace.js';\n\nexport class Trace extends traceOrigin.constructor {\n constructor() {\n super();\n this.init(\"nine-util\", \"green\");\n }\n}\n\nexport const trace = new Trace();","export class Loading {\n\tstatic show() {\n\t\tlet overlay = document.getElementById(\"global-loading-overlay\");\n\t\tif (!overlay) {\n\t\t\toverlay = document.createElement(\"div\");\n\t\t\toverlay.id = \"global-loading-overlay\";\n\t\t\toverlay.style.cssText = `\n position: fixed; inset: 0; z-index: 9999;\n background: rgba(0, 0, 0, 0.4); display: flex; \n justify-content: center; align-items: center;\n backdrop-filter: blur(2px);\n `;\n\t\t\toverlay.innerHTML = `<div class=\"loading-spinner\"></div>`;\n\t\t\tdocument.body.appendChild(overlay);\n\n\t\t\tif (!document.getElementById(\"nine-util-style\")) {\n\t\t\t\tconst style = document.createElement(\"style\");\n\t\t\t\tstyle.id = \"nine-util-style\";\n\t\t\t\tstyle.innerHTML = `\n .loading-spinner {\n width: 48px; height: 48px;\n border: 5px solid rgba(255, 255, 255, 0.3);\n border-top-color: white; border-radius: 50%;\n animation: nine-spin 1s linear infinite;\n }\n @keyframes nine-spin { to { transform: rotate(360deg); } }\n `;\n\t\t\t\tdocument.head.appendChild(style);\n\t\t\t}\n\t\t}\n\t\toverlay.style.display = \"flex\";\n\t}\n\n\tstatic hide() {\n\t\tconst overlay = document.getElementById(\"global-loading-overlay\");\n\t\tif (overlay) overlay.style.display = \"none\";\n\t}\n}","import { trace } from \"@nopeer\";\nimport { Loading } from \"../ux/Loading.js\";\n\nexport class Fetch {\n\tstatic BASE_URL = window.__API_BASE_URL__ || \"\";\n\n\tstatic #request = (method, url, data = {}, showLoading = true) => {\n\t\tconst finalUrl = url.startsWith('http') ? url : `${this.BASE_URL}${url}`;\n\n\t\tif (showLoading) {\n\t\t\tLoading.show();\n\t\t}\n\n\t\t// 1. ๊ธฐ๋ณธ ํค๋ ์ค์ \n\t\tconst headers = {};\n\n\t\t// ๐ด ํต์ฌ: ๋ฐ์ดํฐ๊ฐ FormData๊ฐ ์๋ ๋๋ง JSON ํค๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.\n\t\tif (!(data instanceof FormData)) {\n\t\t\theaders[\"Content-Type\"] = \"application/json\";\n\t\t}\n\n\t\tconst options = {\n\t\t\tmethod,\n\t\t\theaders\n\t\t};\n\n\t\tlet targetUrl = finalUrl;\n\t\tif (method === \"GET\") {\n\t\t\ttargetUrl += `?${new URLSearchParams(data)}`;\n\t\t} else {\n\t\t\t// ๐ด ํต์ฌ: FormData๋ ๊ทธ๋๋ก body์ ๋ฃ๊ณ , ์ผ๋ฐ ๊ฐ์ฒด๋ JSON.stringify ์ฒ๋ฆฌํฉ๋๋ค.\n\t\t\toptions.body = data instanceof FormData ? data : JSON.stringify(data);\n\t\t}\n\n\t\treturn fetch(targetUrl, options)\n\t\t\t.then(async res => {\n\t\t\t\tif (!res.ok) {\n\t\t\t\t\tconst text = await res.text();\n\t\t\t\t\tthrow new Error(`API ์ค๋ฅ (${res.status}): ${text}`);\n\t\t\t\t}\n\t\t\t\treturn res.json();\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\ttrace.error(`[IdeFetch.${method.toLowerCase()}] ${finalUrl} ์คํจ:`, err);\n\t\t\t\tthrow err;\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tif (showLoading) {\n\t\t\t\t\tLoading.hide();\n\t\t\t\t}\n\t\t\t});\n\t};\n\n\t// ๊ธฐ์กด post/get ๋ฉ์๋๋ ์ธ์๋ฅผ ๋๊ฒจ์ฃผ๋๋ก ์์ \n\tstatic get = (url, data = {}, showLoading = true) => this.#request(\"GET\", url, data, showLoading);\n\tstatic post = (url, data = {}, showLoading = true) => this.#request(\"POST\", url, data, showLoading);\n\n\t/**\n\t * ๐ ๋ฒ์ฉ ์ฒญํฌ ์ ์ก (ํ๋ผ๋ฏธํฐ ์ด๋ฆ๊น์ง ๋์ ์ค์ )\n\t * @param {string} url - API ์ฃผ์\n\t * @param {Array} rows - ๋ฐ์ดํฐ ๋ฐฐ์ด\n\t * @param {object} options - ์์ธ ์ต์
\n\t * - fileKey: ๊ฐ์ฒด ๋ด ํ์ผ ์์ฑ๋ช
(๊ธฐ๋ณธ: 'fileContents')\n\t * - filePartName: ์๋ฒ์์ ๋ฐ์ ํ์ผ ํํธ๋ช
(๊ธฐ๋ณธ: 'files')\n\t * - jsonPartName: ์๋ฒ์์ ๋ฐ์ JSON ํํธ๋ช
(๊ธฐ๋ณธ: 'dataList')\n\t * - chunkSize: ๋ถํ ๋จ์ (๊ธฐ๋ณธ: 10)\n\t */\n\tstatic postMultipart = async (url, rows = [], options = {}) => {\n\t\tconst {\n\t\t\tfileKey = 'fileContents',\n\t\t\tfilePartName = 'files',\n\t\t\tjsonPartName = 'dataList',\n\t\t\tchunkSize = 10\n\t\t} = options;\n\n\t\tconst dataRows = Array.isArray(rows) ? rows : [rows];\n\n\t\tLoading.show();\n\t\tlet totalCount = 0;\n\t\tlet lastResponse = null;\n\n\t\treturn (async () => {\n\n\t\t\tlet globalFileIndex = 0;\n\n\t\t\tfor (let i = 0; i < dataRows.length; i += chunkSize) {\n\t\t\t\tconst formData = new FormData();\n\t\t\t\tconst chunk = dataRows.slice(i, i + chunkSize);\n\t\t\t\tconst rowDataList = [];\n\n\t\t\t\tchunk.forEach((row, rowIndex) => {\n\t\t\t\t\t// row์์ ํ์ผ ๋ฐ์ดํฐ์ ๋๋จธ์ง ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌ\n\t\t\t\t\tconst { [fileKey]: fileData, ...rest } = row;\n\t\t\t\t\t//rowDataList.push(rest);\n\n\t\t\t\t\t// 2๋ฒ ๋ฐฉ์์ ํต์ฌ: ๋ฐฐ์ด์ด๋ ์๋๋ ๋ช
ํํ ์์๋ฅผ ์งํด\n\t\t\t\t\tconst files = Array.isArray(fileData) ? fileData : [fileData];\n\n\t\t\t\t\tconst fileIndices = [];\n\t\t\t\t\tfiles.forEach(fileObj => {\n\t\t\t\t\t\tif (fileObj instanceof File) {\n\t\t\t\t\t\t\tformData.append(filePartName, fileObj);\n\t\t\t\t\t\t\tfileIndices.push(globalFileIndex++);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\trowDataList.push({ ...rest, fileIndices });\n\t\t\t\t});\n\n\t\t\t\t// JSON ๋ฐ์ดํฐ๋ฅผ FormData์ ์ถ๊ฐ\n\t\t\t\t//const jsonBlob = new Blob([JSON.stringify(rowDataList)], { type: 'application/json' });\n\t\t\t\tconst jsonBlob = new Blob(\n\t\t\t\t\t[JSON.stringify(Array.isArray(rows) ? rowDataList : rowDataList[0])],\n\t\t\t\t\t{ type: 'application/json' }\n\t\t\t\t);\n\t\t\t\tformData.append(jsonPartName, jsonBlob);\n\n\t\t\t\tlastResponse = await this.post(url, formData, false);\n\n\t\t\t\tif (lastResponse && (lastResponse.success || lastResponse.status === 'OK')) {\n\t\t\t\t\ttotalCount += chunk.length;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(`์ฒญํฌ ์ ์ก ์คํจ: ${i}๋ฒ์งธ ์น์
`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { ...lastResponse, success: true, totalCount };\n\t\t})()\n\t\t\t.finally(() => Loading.hide());\n\t};\n\n\tstatic postOneMultipart = async (url, row = {}, options = {}) => {\n\t\tconst {\n\t\t\tfileKey = 'fileContents', // row ๋ด ํ์ผ ๊ฐ์ฒด๊ฐ ๋ด๊ธด ํค\n\t\t\tjsonPartName = 'dataList' // ์๋ฒ์์ JSON ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ํค\n\t\t} = options;\n\n\t\tLoading.show();\n\n\t\ttry {\n\t\t\tconst formData = new FormData();\n\n\t\t\t// 1. row์์ ํ์ผ ๋ฐ์ดํฐ์ ๋๋จธ์ง ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌ\n\t\t\tconst { [fileKey]: fileData, ...rest } = row;\n\n\t\t\t// 2. ํ์ผ ๋ฐ์ดํฐ๋ฅผ FormData์ ๊ฐ๋ณ ํค๋ก ์ถ๊ฐ\n\t\t\t// ์: fileData๊ฐ { template: file1, thumbnail: file2 }๋ผ๋ฉด\n\t\t\t// formData์ ๊ฐ๊ฐ \"template\", \"thumbnail\" ํค๋ก append ๋ฉ๋๋ค.\n\t\t\tif (fileData && typeof fileData === 'object') {\n\t\t\t\tObject.entries(fileData).forEach(([key, fileObj]) => {\n\t\t\t\t\tif (fileObj instanceof File) {\n\t\t\t\t\t\tformData.append(key, fileObj);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// 3. ๋๋จธ์ง ๋ฐ์ดํฐ๋ฅผ JSON์ผ๋ก ๋ณํํ์ฌ ์ถ๊ฐ\n\t\t\tconst jsonBlob = new Blob([JSON.stringify(rest)], { type: 'application/json' });\n\t\t\tformData.append(jsonPartName, jsonBlob);\n\n\t\t\t// 4. ์ ์ก\n\t\t\tconst response = await this.post(url, formData, false);\n\n\t\t\tif (response && (response.success || response.status === 'OK')) {\n\t\t\t\treturn { ...response, success: true };\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"์ ์ก ์คํจ\");\n\t\t\t}\n\t\t} catch (err) {\n\t\t\ttrace.error(\"[postOneMultipart] Error:\", err);\n\t\t\tthrow err;\n\t\t} finally {\n\t\t\tLoading.hide();\n\t\t}\n\t};\n\n\tstatic postMultipart_BAK = async (url, rows = [], options = {}) => {\n\t\tconst {\n\t\t\tfileKey = 'fileContents',\n\t\t\tfilePartName = 'files',\n\t\t\tjsonPartName = 'dataList',\n\t\t\tchunkSize = 10\n\t\t} = options;\n\n\t\t// 1. ์์ ์ ๋ก๋ฉ๋ฐ ๋์ฐ๊ธฐ\n\t\tLoading.show();\n\n\t\tlet totalCount = 0;\n\t\tlet lastResponse = null;\n\n\t\t// ๐ด 2. ์ ์ฒด ๋ฃจํ๋ฅผ Promise ์ฒด์ธ์ฒ๋ผ ๊ด๋ฆฌ (๋ด๋ถ๋ await ์ ์ง)\n\t\treturn (async () => {\n\t\t\tfor (let i = 0; i < rows.length; i += chunkSize) {\n\t\t\t\tconst formData = new FormData();\n\t\t\t\tconst chunk = rows.slice(i, i + chunkSize);\n\t\t\t\tconst rowDataList = [];\n\n\t\t\t\tchunk.forEach((row) => {\n\t\t\t\t\tconst { [fileKey]: fileObj, _fileObj, ...rest } = row;\n\t\t\t\t\trowDataList.push(rest);\n\t\t\t\t\tif (fileObj instanceof File) {\n\t\t\t\t\t\tformData.append(filePartName, fileObj);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tconst jsonBlob = new Blob([JSON.stringify(rowDataList)], { type: 'application/json' });\n\t\t\t\tformData.append(jsonPartName, jsonBlob);\n\n\t\t\t\t// showLoading = false๋ก ๋ด๋ถ ํธ์ถ\n\t\t\t\tlastResponse = await this.post(url, formData, false);\n\n\t\t\t\tif (lastResponse && (lastResponse.success || lastResponse.status === 'OK')) {\n\t\t\t\t\ttotalCount += chunk.length;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(`์ฒญํฌ ์ ์ก ์คํจ: ${i}๋ฒ์งธ ์น์
`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { ...lastResponse, success: true, totalCount };\n\t\t})()\n\t\t\t.catch(err => {\n\t\t\t\ttrace.error(\"[postChunk] Error:\", err);\n\t\t\t\tthrow err;\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\t// ๐ด 3. ์ฑ๊ณตํ๋ ์คํจํ๋ ์ฌ๊ธฐ์ ๊น๋ํ๊ฒ ๋ซ๊ธฐ!\n\t\t\t\tLoading.hide();\n\t\t\t});\n\t};\n}\n\nexport const api = Fetch;","// nxDialog.styles.js\nexport const dialogStyles = `\n\tdialog::backdrop {\n\t\tbackground: rgba(0, 0, 0, 0.3);\n\t}\n\t\n\tdialog:modal {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tpadding: 0;\n\t\toverflow: hidden;\n\t\tborder: 1px solid darkgreen;\n\t\toutline: none;\n\t\tresize: both;\n\t\tbox-shadow: 0 0 4px 0 darkgreen;\n width: 500px;\n height: fit-content;\n min-width: 330px;\n min-height: 60px;\n max-height: 100%;\n }\n \n \n \n \n\tdiv.head .rect1, div.head .rect2, div.head .rect3 {\n\t\tdisplay: none;\n\t\twidth: 50px;\n\t\theight: 100%;\n\t}\n\tdiv.head .rect1 {\n\t\tbackground-color: red;\n\t}\n\tdiv.head .rect2 {\n\t\tbackground-color: darkgreen;\n\t}\n\tdiv.head .rect3 {\n\t\tbackground-color: olive;\n\t}\n\t\n\tdiv.head {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\t--height: 30px;\n\t\tbackground-color: darkgreen;\n\t\tpadding: 4px;\n\t\tcursor: move;\n\t}\n\tdiv.head:hover {\n\t\tfilter: brightness(110%);\n\t}\n\t\n\tdiv.head span {\n\t\tfont-size: 12px;\n\t\tposition: relative;\n\t}\n\t\n\tdiv.head span.title {\n\t\tcolor: #ddd;\n\t\tmargin-left: 4px;\n\t\tfont-weight: bold;\n\t}\n\t\n\tdiv.head span.sub-title {\n\t\tcolor: #ccc;\n\t\tmargin-left: 8px;\n\t\tfont-style: italic;\n\t}\n\t\n\tdiv.head form {\n\t\tmargin: 0;\n\t}\n\tdiv.head button {\n\t\tmargin-right: 4px;\n\t\tbackground-color: transparent;\n\t\tborder: none;\n\t\tcolor: #ccc;\n\t\tfont-size: x-small;\n\t}\n\tdiv.head button:hover {\n\t\tcursor: pointer;\n\t}\n\t\n\tdiv.contents {\n\t\tdisplay: flex;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\toverflow: hidden;\n\t\tbackground-color: white;\n\t\tcolor: #333;\n\t}\n\tdiv.left {\n\t\tposition: relative;\n\t\twidth: 16px;\n\t\theight: 100%;\n\t\tbackground-color: #ddd;\n\t\tdisplay: none;\n\t}\n\t\n\tdiv.left span {\n\t\twriting-mode: vertical-rl;\n\t\t-moz-user-select: none;\n\t\t-webkit-user-select: none;\n\t\t-ms-user-select: none;\n\t\tuser-select: none;\n\t\tcolor: #ccc;\n\t\tfont-weight: 700;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmargin-left: 3px;\n\t\tmargin-top: 3px;\n\t}\n\tdiv.close2 {\n\t\tdisplay: none;\n\t\tposition: absolute;\n\t\tright: 0;\n\t\ttop: 3px;\n\t\tcursor: pointer;\n\t\tcolor: #666;\n\t}\n\tdiv.close2 svg:hover {\n\t\tcolor: #999;\n\t}\n\t\n\tdiv.body {\n\t\tdisplay: flex;\n\t\twidth: 100%;\n\t\theight: unset;\n\t\t--border: 3px solid #999;\n\t\t--border-top: none;\n\t\toverflow-x: hidden;\n\t\toverflow-y: auto;\n\t\tpadding: 10px;\n\t\tgap: 8px;\n\t\tflex-direction: column;\n\t}\n\t\n\t\n\t\n\t\n\tng-sphere.icon {\n\t\tmargin-left: 8px;\n\t}\n\t\n\t.buttons {\n\t\tdisplay: flex;\n\t\tposition: absolute;\n\t\tright: 4px;\n\t}\n\t\n\tng-sphere {\n\t\tposition: relative;\n\t\t--width: 16px;\n\t\t--height: 16px;\n\t\tcursor: pointer;\n\t\tmargin-right: 4px;\n\t\tdisplay: flex;\n\t}\n\tng-sphere:hover {\n\t\tfilter: brightness(90%);\n\t}\n\tng-sphere:active {\n\t\tfilter: brightness(80%);\n\t}\n\t\n\tng-sphere:hover::after {\n\t\tcontent: \"\";\n\t\tposition: absolute;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: center;\n\t}\n\tng-sphere.apply:hover::after {\n\t\tbackground-size: 14px 14px;\n\t\tbackground-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\"><polyline points=\"2.5,7 6,10 11,3\" style=\"fill:none;stroke:white;stroke-width:2px;\" /></svg>');\n\t}\n\t\n\tng-sphere.reset:hover::after {\n\t\tbackground-size: 12px 12px;\n\t\tbackground-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" style=\"fill:none;stroke:white;stroke-width:2px;\" focusable=\"false\" aria-hidden=\"true\"><path d=\"M10 5h5V0\"></path><path d=\"M15 8a6.957 6.957 0 0 1-7 7 6.957 6.957 0 0 1-7-7 6.957 6.957 0 0 1 7-7 6.87 6.87 0 0 1 6.3 4\"></path></svg>');\n\t}\n\t\n\tng-sphere.close:hover::after {\n\t\tbackground-size: 12px 12px;\n\t\tbackground-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" style=\"fill:none;stroke:white;stroke-width:2px;\" focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 16 16\"><path d=\"M2 2l12 12M14 2L2 14\"></path></svg>');\n\t}\n\t\n\t\n\tbutton {\n cursor: pointer;\n }\n \n .input-area {\n position: relative;\n height: 100%;\n --display: flex;\n textarea {\n width: 100%;\n height: 100%;\n min-height: 100px;\n padding: 8px;\n box-sizing: border-box;\n resize: none;\n border-radius: 2px;\n border-color: #ccc;\n }\n textarea:focus {\n border-color: green;\n outline: none; /* ๋ธ๋ผ์ฐ์ ๊ธฐ๋ณธ ํ๋์ ํ
๋๋ฆฌ ์ ๊ฑฐ */\n }\n }\n \n .buttons-confirm {\n position: absolute;\n display: flex;\n justify-content: flex-end;\n bottom: 8px;\n right: 8px;\n }\n \n \n .buttons-confirm button {\n height: 32px;\n margin-right: 8px;\n border: none;\n outline: none;\n width: 60px;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n }\n .buttons-confirm button:hover {\n filter: brightness(90%);\n }\n .buttons-confirm button:active {\n color: #ccc;\n }\n \n button.ok {\n --display: none;\n background-color: darkgreen;\n color: white;\n }\n button.cancel {\n color: white;\n background-color: #6c757d;\n }\n \n \n \n div.msg {\n position: relative;\n height: 100%;\n font-size: 14px;\n color: #333;\n padding-bottom: 48px;\n }\n \n .reset, .apply {\n display: none;\n }\n \n \n \n :host(.classic) dialog:modal {\n border: 1px solid #007bff;\n box-shadow: 0 0 4px 0 #007bff;\n }\n \n :host(.classic) div.head {\n background-color: #007bff;\n }\n :host(.classic) div.head:hover {\n filter: brightness(110%);\n }\n \n :host(.classic) div.head span {\n font-size: 12px;\n }\n \n :host(.classic) div.head span.title {\n color: #ddd;\n margin-left: 4px;\n font-weight: bold;\n }\n \n :host(.classic) div.head span.sub-title {\n color: #ccc;\n margin-left: 8px;\n font-style: italic;\n }\n :host(.classic) div.head button {\n margin-right: 4px;\n background-color: transparent;\n border: none;\n color: #ccc;\n font-size: x-small;\n }\n \n \n \n \n :host(.rgb) dialog:modal {\n border: none;\n box-shadow: unset;\n border-top: none;\n }\n \n :host(.rgb) div.left {\n display: block;\n background-color: #ddd;\n }\n :host(.rgb) div.left span {\n color: #ccc;\n }\n :host(.rgb) div.close2 {\n display: block;\n color: #666;\n }\n :host(.rgb) div.close2 svg:hover {\n color: #999;\n }\n :host(.rgb) div.head {\n height: 4px;\n background-color: #999;\n padding: 0;\n }\n :host(.rgb) div.contents {\n height: calc(100% - 4px);\n }\n \n :host(.rgb) div.head ng-sphere,\n :host(.rgb) div.head span,\n :host(.rgb) div.head .buttons {\n display: none;\n }\n \n :host(.rgb) div.head .rect1,\n :host(.rgb) div.head .rect2,\n :host(.rgb) div.head .rect3 {\n display: flex;\n }\n \n \n :host(.rgb) div.head:hover {\n filter: unset;\n }\n \n \n /* --- Animation Core --- */\n:host {\n --nx-duration: 0.4s;\n --nx-timing: cubic-bezier(0.34, 1.56, 0.64, 1);\n}\n\n/* ๐ฏ ์์ : ์ ๋๋ฉ์ด์
ํด๋์ค๊ฐ ๋ถ์ ๊ฒฝ์ฐ์๋ง ์ด๊ธฐ opacity๋ฅผ 0์ผ๋ก ์ค์ */\n:host(.fade) dialog,\n:host(.zoom) dialog,\n:host(.moveUp) dialog,\n:host(.moveDown) dialog,\n:host(.moveLeft) dialog,\n:host(.moveRight) dialog,\n:host(.roadRunner) dialog {\n opacity: 0;\n}\n\n/* shake๋ ์ ๋๋ฉ์ด์
๋ด๋ถ์์ opacity๋ฅผ ๋ค๋ฃจ๋ฏ๋ก ์ ์ธํ๊ฑฐ๋ ๋ณ๋ ์ฒ๋ฆฌ */\n:host(.shake) dialog { \n opacity: 1; \n}\n\n/* 1. Fade (์์ํ ๋ํ๋จ) */\n:host(.fade) dialog { animation: nx-fade-in var(--nx-duration) forwards; }\n@keyframes nx-fade-in { from { opacity: 0; } to { opacity: 1; } }\n\n/* 2. Zoom (์ปค์ง๋ฉฐ ๋ํ๋จ) */\n:host(.zoom) dialog { animation: nx-zoom-in var(--nx-duration) var(--nx-timing) forwards; }\n@keyframes nx-zoom-in { from { opacity: 0; transform: scale(0.5); } to { opacity: 1; transform: scale(1); } }\n\n/* 3. Slide (์ํ์ข์ฐ) */\n:host(.moveUp) dialog { animation: nx-move-up var(--nx-duration) var(--nx-timing) forwards; }\n:host(.moveDown) dialog { animation: nx-move-down var(--nx-duration) var(--nx-timing) forwards; }\n:host(.moveLeft) dialog { animation: nx-move-left var(--nx-duration) var(--nx-timing) forwards; }\n:host(.moveRight) dialog { animation: nx-move-right var(--nx-duration) var(--nx-timing) forwards; }\n\n@keyframes nx-move-up { from { opacity: 0; transform: translateY(100px); } to { opacity: 1; transform: translateY(0); } }\n@keyframes nx-move-down { from { opacity: 0; transform: translateY(-100px); } to { opacity: 1; transform: translateY(0); } }\n@keyframes nx-move-left { from { opacity: 0; transform: translateX(100px); } to { opacity: 1; transform: translateX(0); } }\n@keyframes nx-move-right { from { opacity: 0; transform: translateX(-100px); } to { opacity: 1; transform: translateY(0); } }\n\n/* 4. Shake (์ํ์ข์ฐ ๊ฒฉ๋ ฌํ ์ง๋ - ์๋ฌ ์ธ์ง์ฉ) */\n:host(.shake) dialog { \n animation: nx-heavy-shake 0.5s cubic-bezier(.36,.07,.19,.97) both;\n opacity: 1; \n}\n\n@keyframes nx-heavy-shake {\n 10%, 90% { transform: translate3d(-1px, -2px, 0); }\n 20%, 80% { transform: translate3d(2px, 4px, 0); }\n 30%, 50%, 70% { transform: translate3d(-6px, -6px, 0); }\n 40%, 60% { transform: translate3d(6px, 6px, 0); }\n}\n\n/* 5. Road Runner (๋ฑ์ฅ: ์ผ์ชฝ์์ ํ๋ ฅ ์๊ฒ / ํด์ฅ: ์์ธ ๋ ธ๋ค๊ฐ ๊ด์ ํ์ถ) */\n:host(.roadRunner) dialog { \n animation: roadRunnerIn 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards; \n}\n\n@keyframes roadRunnerIn {\n 0% { transform: translateX(-1500px) skewX(30deg); opacity: 1; }\n 70% { transform: translateX(30px) skewX(-10deg); opacity: 1; }\n 100% { transform: translateX(0) skewX(0deg); opacity: 1; }\n}\n\n/* --- Out Animations (๋ซํ ๋) --- */\ndialog.out { pointer-events: none; }\n\n/* Road Runner ํด์ฅ: ์ฅ ์์ธ ๋ ธ๋ค๊ฐ(Anticipation) ์ฉ~! */\n:host(.roadRunner) dialog.out { \n animation: roadRunnerOut 0.5s cubic-bezier(0.6, -0.28, 0.735, 0.045) forwards; \n}\n\n@keyframes roadRunnerOut {\n 0% { \n transform: translateX(0) scale(1) skewX(0deg); \n opacity: 1; \n }\n 30% { \n /* ์๋น ๋์: ๋ค๋ก ์ด์ง ๊ฐ๋ค๊ฐ ์์ธ ๋ฌ๋ค๊ธฐ */\n transform: translateX(50px) scaleX(1.2) scaleY(0.8) skewX(-20deg); \n opacity: 1; \n }\n 100% { \n /* ๋ฐ์ฌ: ๊ธธ๊ฒ ๋์ด๋๋ฉฐ ๊ด์ ํ์ถ */\n transform: translateX(2000px) scaleX(4) scaleY(0.3) skewX(50deg); \n opacity: 0; \n filter: blur(10px); /* ๐ ์์ ๋๋ ์ถ๊ฐ */\n }\n}\n\n/* ์ผ๋ฐ ํด์ฅ (๊ธฐ๋ณธ) */\ndialog.out { animation: nx-fade-out 0.3s forwards; }\n@keyframes nx-fade-out { from { opacity: 1; transform: scale(1); } to { opacity: 0; transform: scale(0.9); } }\n`;","import { dialogStyles } from './style.dialog.js';\nimport { trace } from '@nopeer';\n\nexport class nineDialog extends HTMLElement\n{\n\t#shift;\n\t#dialog;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tconst v = this.innerHTML;\n\t\tconst titleText = this.getAttribute(\"subject\") || \"Details\";\n\n\t\ttrace.log(dialogStyles);\n\n\t\tthis.innerHTML = `\n\t\t\t<style>${dialogStyles}</style>\n\t\t\n\t\t\t<dialog>\n\t\t\t\t<div class=\"head\">\n\t\t\t\t\t<div class=\"rect1\"></div>\n\t\t\t\t\t<div class=\"rect2\"></div>\n\t\t\t\t\t<div class=\"rect3\"></div>\n\t\t\t\t\t<ng-sphere class=\"icon\" end-fill=\"#666\" size=\"8\"></ng-sphere>\n\t\t\t\t\t<span class=\"title\">${titleText}</span>\n\t\t\t\t\t<span class=\"sub-title\"></span>\n\t\t\t\t\t<div class=\"buttons\">\n\t\t\t\t\t\t<ng-sphere class=\"apply\" start-fill=\"#cc6\" end-fill=\"#660\" size=\"16\" title=\"apply\"></ng-sphere>\n\t\t\t\t\t\t<ng-sphere class=\"reset\" start-fill=\"#99f\" end-fill=\"#00f\" size=\"16\" title=\"reset\"></ng-sphere>\n\t\t\t\t\t\t<ng-sphere class=\"close\" start-fill=\"#f99\" end-fill=\"#f00\" size=\"16\" title=\"close\"></ng-sphere>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"contents\">\n\t\t\t\t\t<div class=\"left\">\n\t\t\t\t\t\t<span>๊ฐ๋๋ค๋ผ๋ง๋ฐ์ฌ์์์ฐจ์นดํํํ๊ฐ๋๋ค๋ผ๋ง๋ฐ์ฌ์์์ฐจ์นดํํํ๊ฐ๋๋ค๋ผ๋ง๋ฐ์ฌ์์์ฐจ์นดํํํ๊ฐ๋๋ค๋ผ๋ง๋ฐ์ฌ์์์ฐจ์นดํํํ๊ฐ๋๋ค๋ผ๋ง๋ฐ์ฌ์์์ฐจ์นดํํํ๊ฐ๋๋ค๋ผ๋ง๋ฐ์ฌ์์์ฐจ์นดํํํ๊ฐ๋๋ค๋ผ๋ง๋ฐ์ฌ์์์ฐจ์นดํํํ๊ฐ๋๋ค๋ผ๋ง๋ฐ์ฌ์์์ฐจ์นดํํํ</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"body\">\n\t\t\t\t\t\t${v}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"close2\">\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n\t\t\t\t\t\t\t<path d=\"M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</dialog>\n\t\t`;\n\n\t\t//this.#owner = this.getRootNode().host.closest(\"nine-grid\");\n\n\t\t//$(\".title\", this).html(\"Details\");\n\n\t\tthis.#dialog = this.querySelector('dialog');\n\t\tthis.#init();\n\t};\n\n\tshowModal = () => {\n\t\tthis.#dialog.showModal();\n\n\t\t(this.shadowRoot?.activeElement || document.activeElement)?.blur();\n\t};\n\n\tclose = () => {\n\t\t// ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ ๊ฑฐ (ํ์ค ๋ฐฉ์์ ํธ๋ค๋ฌ ์ฐธ์กฐ๊ฐ ํ์ํ์ง๋ง,\n\t\t// ์ฌ๊ธฐ์๋ ์์๊ฐ ์ฌ๋ผ์ง๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํด ์ ๋ฆฌ)\n\t\tthis.#dialog.close();\n\t\tthis.remove();\n\t};\n\n\t#init = () => {\n\t\tconst head = this.querySelector('.head');\n\n\t\tif (head) {\n\t\t\thead.addEventListener('mousedown', this.#onMouseDown);\n\t\t\thead.addEventListener('touchstart', this.#onTouchStart);\n\n\t\t\t// ๋ง์ฐ์ค ์ปค์๋ฅผ ๋๋๊ทธ ๊ฐ๋ฅ ์์ด์ฝ(์ด๋ ์ญ์๊ฐ) ๋ชจ์์ผ๋ก ๋ณ๊ฒฝํ์ฌ UX ๊ฐ์ \n\t\t\t//head.style.cursor = 'move';\n\t\t}\n\n\t\t// 1. ๋ชจ๋ ๋ซ๊ธฐ ์ฑ๊ฒฉ์ ๋ฒํผ (.close, .close2, .cancel) ๊ณตํต ์ฒ๋ฆฌ\n\t\tthis.querySelectorAll('.close, .close2, .cancel').forEach(btn => {\n\t\t\tbtn.onclick = () => this.closeWithAnimation(null); // ์ทจ์/๋ซ๊ธฐ๋ null ๋ฆฌํด\n\t\t});\n\n\t\t// 2. ํ์ธ ๋ฒํผ (.ok) ์ฒ๋ฆฌ\n\t\t// ํ์ธ ๋ฒํผ์ ํ
์คํธ ์
๋ ฅ๊ฐ ๋ฑ ๋ฐ์ดํฐ๊ฐ ํ์ํ๋ฏ๋ก\n\t\t// ์ค์ ๋ฐ์ดํฐ ์ถ์ถ์ ๊ฐ ํ์
ํด๋์ค(prompt ๋ฑ)์์ ํ๋,\n\t\t// ๋ซ๊ธฐ ์ ๋๋ฉ์ด์
์คํ์ ์ฌ๊ธฐ์ ๋ด๋นํ๋๋ก ๊ฐ์ด๋ํฉ๋๋ค.\n\t\tthis.querySelectorAll('.ok').forEach(btn => {\n\t\t\t// .ok ๋ฒํผ์ ๋ก์ง์ ๊ฐ ํ์
์ setupEvents์์ ๋ฎ์ด์ฐ๊ฑฐ๋\n\t\t\t// ๋ธ๋ฆฌ๊ฒ์ดํธ ์ด๋ฒคํธ๋ฅผ ํตํด ์ฒ๋ฆฌํฉ๋๋ค.\n\t\t});\n\n\t\t// ๋๋๊ทธ ๋ก์ง ์๋ต...\n\t};\n\n\t// --- ๋๋๊ทธ ๋ก์ง (Vanilla JS) ---\n\t#onMouseDown = e => {\n\n\t\tif (e.target.closest(\"buttons\")) return;\n\t\tif (e.button !== 0 || e.altKey || e.ctrlKey || e.shiftKey) return;\n\n\t\tconst rect = this.#dialog.getBoundingClientRect();\n\t\tthis.#shift = {\n\t\t\tx: e.clientX - rect.left,\n\t\t\ty: e.clientY - rect.top\n\t\t};\n\n\t\tconst onMouseMove = (ev) => {\n\t\t\tthis.#dialog.style.position = 'fixed';\n\t\t\tthis.#dialog.style.margin = '0';\n\t\t\tthis.#dialog.style.left = `${ev.clientX - this.#shift.x}px`;\n\t\t\tthis.#dialog.style.top = `${ev.clientY - this.#shift.y}px`;\n\t\t};\n\n\t\tconst onMouseUp = () => {\n\t\t\tdocument.removeEventListener('mousemove', onMouseMove);\n\t\t\tdocument.removeEventListener('mouseup', onMouseUp);\n\t\t};\n\n\t\tdocument.addEventListener('mousemove', onMouseMove);\n\t\tdocument.addEventListener('mouseup', onMouseUp);\n\t};\n\n\t#onTouchStart = e => {\n\t\tif (e.target.closest(\"buttons\")) return;\n\n\t\tconst rect = this.#dialog.getBoundingClientRect();\n\t\tconst touch = e.changedTouches[0];\n\t\tthis.#shift = {\n\t\t\tx: touch.pageX - rect.left,\n\t\t\ty: touch.pageY - rect.top\n\t\t};\n\n\t\tconst onTouchMove = (ev) => {\n\t\t\tconst t = ev.changedTouches[0];\n\t\t\tthis.#dialog.style.position = 'fixed';\n\t\t\tthis.#dialog.style.margin = '0';\n\t\t\tthis.#dialog.style.left = `${t.pageX - this.#shift.x}px`;\n\t\t\tthis.#dialog.style.top = `${t.pageY - this.#shift.y}px`;\n\t\t};\n\n\t\tconst onTouchEnd = () => {\n\t\t\tdocument.removeEventListener('touchmove', onTouchMove);\n\t\t\tdocument.removeEventListener('touchend', onTouchEnd);\n\t\t};\n\n\t\tdocument.addEventListener('touchmove', onTouchMove);\n\t\tdocument.addEventListener('touchend', onTouchEnd);\n\t};\n\n\tcloseWithAnimation(returnValue) {\n\t\tthis.#dialog.classList.add(\"out\"); // ํด์ฅ ์ ๋๋ฉ์ด์
์์\n\n\t\t// ์ ๋๋ฉ์ด์
(0.3s)์ด ๋๋ ํ ์ ๊ฑฐ ๋ฐ ์ด๋ฒคํธ ๋ฐ์\n\t\tsetTimeout(() => {\n\t\t\tthis.#dialog.close();\n\t\t\t// ๋ถ๋ชจ(BasePopup)์๊ฒ ์์
์๋ฃ์ ๊ฒฐ๊ณผ๊ฐ์ ์๋ฆผ\n\t\t\tthis.dispatchEvent(new CustomEvent('closed', { detail: returnValue }));\n\t\t\tthis.remove();\n\t\t}, 300);\n\t}\n}\n\n// BasePopup.js\nexport class BasePopup extends HTMLElement {\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.attachShadow({ mode: 'open' });\n\t}\n\n\tstatic async open(PopupClass, message, title, options, renderFn) {\n\t\t// 1. ์ค์ ๋ณํฉ\n\t\tconst tagName = PopupClass.tagName.toLowerCase();\n\t\tconst config = {\n\t\t\t\"true-text\": \"ํ์ธ\",\n\t\t\t\"false-text\": \"์ทจ์\",\n\t\t\tclass: \"classic\",\n\t\t\tanimation: \"fade\",\n\t\t\t...(window.nine?.config?.ux?.[tagName.replace('nine-', '').replace('-popup', '')] || {}),\n\t\t\t...options\n\t\t};\n\n\t\t// 2. ์ค๋ณต ์ ๊ฑฐ ๋ฐ ์๋ฆฌ๋จผํธ ์์ฑ\n\t\tdocument.querySelectorAll(tagName).forEach(el => el.remove());\n\t\tconst el = document.createElement(tagName);\n\t\tif (config.class) el.classList.add(config.class);\n\t\tif (config.animation) el.classList.add(config.animation);\n\t\tdocument.body.appendChild(el);\n\n\t\t// 3. ๋ ๋๋ง (๊ฐ ํ์
์ UI ๊ทธ๋ฆฌ๊ธฐ)\n\t\trenderFn(el, message, config);\n\n\t\tconst dialogComp = el.shadowRoot.querySelector(\"nine-dialog\");\n\t\tif (title) dialogComp.setAttribute(\"subject\", title);\n\n\t\treturn new Promise((resolve) => {\n\t\t\t// [์ค์] nine-dialog์ ์ ๋๋ฉ์ด์
์ด ๋๋ ํ ๋์ง๋ ์ด๋ฒคํธ๋ฅผ ์์ \n\t\t\tdialogComp.addEventListener('closed', (e) => resolve(e.detail));\n\n\t\t\t// ๊ฐ ํ์
ํด๋์ค์์ ๋ฒํผ ํด๋ฆญ ์ dialogComp.closeWithAnimation(๊ฐ)์\n\t\t\t// ํธ์ถํ๋๋ก ์ด๋ฒคํธ๋ฅผ ๋ฐ์ธ๋ฉํด์ค\n\t\t\tel.setupEvents(resolve, dialogComp);\n\n\t\t\tdialogComp.showModal();\n\t\t});\n\t}\n}\n\nif (!customElements.get('nine-dialog')) {\n\tcustomElements.define(\"nine-dialog\", nineDialog);\n}\n","import { BasePopup } from \"./nineDialog.js\";\n\nexport class nineConfirmPopup extends BasePopup {\n\tstatic tagName = 'nine-confirm-popup';\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\n\trender(message, config) {\n\t\tthis.shadowRoot.innerHTML = `\n <nine-dialog>\n <div class=\"msg\">${message.replace(/\\n/g, \"<br/>\")}</div>\n <div class=\"buttons-confirm\">\n <button class=\"cancel\">${config[\"false-text\"]}</button>\n <button class=\"ok\">${config[\"true-text\"]}</button>\n </div>\n </nine-dialog>`;\n\t}\n\n\tsetupEvents(resolve, dialogComp) {\n\t\tthis.shadowRoot.querySelector(\".ok\").onclick = () => dialogComp.closeWithAnimation(true);\n\t\t// ์ทจ์๋ nine-dialog ๋ด๋ถ ๊ธฐ๋ณธ ๋ก์ง(closeWithAnimation(null))์ด ์ฒ๋ฆฌํจ\n\t}\n\n\tstatic confirm = (m, t, o) => BasePopup.open(nineConfirmPopup, m, t, o, (el, msg, conf) => el.render(msg, conf));\n}\n\n// --- 3. ALERT (๋จ์ ์๋ฆผ) ---\nexport class nineAlertPopup extends BasePopup {\n\tstatic tagName = 'nine-alert-popup';\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\trender(message, config) {\n\t\tthis.shadowRoot.innerHTML = `\n <nine-dialog>\n <div class=\"msg\">${message.replace(/\\n/g, \"<br/>\")}</div>\n <div class=\"buttons-confirm\">\n <button class=\"cancel\">ํ์ธ</button>\n </div>\n </nine-dialog>`;\n\t}\n\n\tsetupEvents(resolve, dialogComp) {\n\t\t// ์ผ๋ฟ์ ์ทจ์ ๋ฒํผ ํ๋๋ง ๋๊ฑฐ๋, ํ์ธ ๋ฒํผ์ด cancel ์ญํ ์ ์ํํ๊ฒ ํจ\n\t}\n\n\tstatic alert = (m, t, o) => BasePopup.open(nineAlertPopup, m, t, o, (el, msg, conf) => el.render(msg, conf));\n}\n\n// Custom Element ๋ฑ๋ก\nif (!customElements.get('nine-confirm-popup')) customElements.define('nine-confirm-popup', nineConfirmPopup);\nif (!customElements.get('nine-alert-popup')) customElements.define(\"nine-alert-popup\", nineAlertPopup);","import { BasePopup } from \"./nineDialog.js\";\n\n/**\n *\n */\nexport class ninePromptPopup extends BasePopup {\n\tstatic tagName = 'nine-prompt-popup';\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\trender(message, config) {\n\n\t\ttrace.log(this);\n\t\ttrace.log(this.shadowRoot);\n\n\t\tthis.shadowRoot.innerHTML = `\n\t\t\t<style>\n\t\t\t\tdialog {\n\t\t\t\t\theight: 300px !important;\n\t\t\t\t}\n\t\t\t\t.msg {\n\t\t\t\t\theight: unset !important;\n\t\t\t\t}\n\t\t\t</style>\n\t\t\t\n <nine-dialog>\n <div class=\"msg\">${message.replace(/\\n/g, \"<br/>\")}</div>\n <div class=\"input-area\">\n <textarea placeholder=\"๋ด์ฉ์ ์
๋ ฅํ์ธ์...\"></textarea>\n </div>\n <div class=\"buttons-confirm\">\n <button class=\"cancel\">${config[\"false-text\"]}</button>\n <button class=\"ok\">${config[\"true-text\"]}</button>\n </div>\n </nine-dialog>`;\n\t}\n\n\tsetupEvents(resolve, dialogComp) {\n\t\tconst textarea = this.shadowRoot.querySelector(\"textarea\");\n\t\tconst okBtn = this.shadowRoot.querySelector(\".ok\");\n\n\t\t// ํ์ธ ๋ฒํผ ํด๋ฆญ ์ textarea ๊ฐ์ ๊ฐ์ง๊ณ ์ ๋๋ฉ์ด์
๋ซ๊ธฐ\n\t\tokBtn.onclick = () => dialogComp.closeWithAnimation(textarea.value);\n\n\t\t// ๋ ๋๋ง ํ ํฌ์ปค์ค\n\t\trequestAnimationFrame(() => textarea.focus());\n\t}\n\n\tstatic prompt = (m, t, o) => BasePopup.open(ninePromptPopup, m, t, o, (el, msg, conf) => el.render(msg, conf));\n}\n\nif (!customElements.get('nine-prompt-popup')) {\n\tcustomElements.define('nine-prompt-popup', ninePromptPopup);\n}","// src/core/NineUxUtil.js\r\nimport { nineAlertPopup, nineConfirmPopup } from './nineConfirm.js';\r\nimport { ninePromptPopup } from \"./ninePrompt.js\";\r\nimport { nine } from '../../core/Config.js'; // ๐ 1. Config์์ nine ๊ฐ์ฒด ์ํฌํธ\r\n\r\nexport class NineUxUtil {\r\n\t// static ํ๋๋ ํด๋์ค ์์ฒด์ ์ ์ฅ๋จ\r\n\tstatic cssPath = \"\";\r\n\r\n\t/**\r\n\t * ํ์
์ค๋น ๋ก์ง (Private ๋ฉ์๋)\r\n\t */\r\n\t#prepare(type, message, title, defaultClass) {\r\n\r\n\t\tconst options = { class: defaultClass, animation: 'fade' };\r\n\t\t//const popup = type === 'alert' ? nineAlertPopup : (type === 'confirm' ? nineConfirmPopup : ninePromptPopup);\r\n\t\tlet isExecuted = false;\r\n\r\n\t\tconst popupMap = {\r\n\t\t\talert: nineAlertPopup,\r\n\t\t\tconfirm: nineConfirmPopup,\r\n\t\t\tprompt: ninePromptPopup\r\n\t\t};\r\n\r\n\t\tconst popup = popupMap[type];\r\n\r\n\t\tconst runner = {\r\n\t\t\trgb: () => { options.class = 'rgb'; return runner; },\r\n\t\t\tclassic: () => { options.class = 'classic'; return runner; },\r\n\t\t\tshake: () => { options.animation = 'shake'; return runner; },\r\n\t\t\trun: () => { options.animation = 'roadRunner'; return runner; },\r\n\t\t\tzoom: () => { options.animation = 'zoom'; return runner; },\r\n\r\n\t\t\tthen: (resolve, reject) => {\r\n\t\t\t\tisExecuted = true;\r\n\t\t\t\treturn popup[type](message, title, options).then(resolve, reject);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// Microtask: ๋๊ธฐ ์ฒด์ด๋์ด ๋ชจ๋ ๋๋ ํ ์คํ\r\n\t\tPromise.resolve().then(() => {\r\n\t\t\tif (!isExecuted) {\r\n\t\t\t\tisExecuted = true;\r\n\t\t\t\tpopup[type](message, title, options);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn runner;\r\n\t}\r\n\r\n\talert = (message, title = \"Alert\") => {\r\n\t\treturn this.#prepare('alert', message, title, 'classic');\r\n\t}\r\n\r\n\tconfirm = (message, title = \"Confirm\") => {\r\n\t\treturn this.#prepare('confirm', message, title, 'classic');\r\n\t}\r\n\r\n\tprompt = (message, title = \"Prompt\") => {\r\n\t\treturn this.#prepare('prompt', message, title, 'classic');\r\n\t}\r\n}\r\n\r\nObject.assign(nine, new NineUxUtil());","import { trace } from \"@nopeer\";\r\nimport { NineUxUtil } from \"./dialog/NineUxUtil.js\";\r\n\r\nclass UxSplitter extends HTMLElement {\r\n\r\n\t#mode;\r\n\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.attachShadow({ mode: \"open\" });\r\n\t}\r\n\r\n\tconnectedCallback() {\r\n\r\n\t\tthis.#init();\r\n\t}\r\n\r\n\t#detectMode = (el) => {\r\n\t\tconst prev = el.previousElementSibling;\r\n\t\tconst next = el.nextElementSibling;\r\n\t\tif (!prev || !next) {\r\n\t\t\tthis.#mode = this.classList.contains('h') ? \"h\" : \"v\";\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst prevRect = prev.getBoundingClientRect();\r\n\t\tconst nextRect = next.getBoundingClientRect();\r\n\r\n\t\tif (this.classList.contains('h')) {\r\n\t\t\tthis.#mode = \"h\";\r\n\t\t} else if (this.classList.contains('v')) {\r\n\t\t\tthis.#mode = \"v\";\r\n\t\t} else {\r\n\t\t\tthis.#mode = (Math.abs(prevRect.top - nextRect.top) < 5) ? \"h\" : \"v\";\r\n\t\t}\r\n\t};\r\n\r\n\t#startDrag = (e) => {\r\n\r\n\t\te.preventDefault();\r\n\t\te.stopPropagation();\r\n\r\n\t\tconst splitterRect = this.getBoundingClientRect();\r\n\t\tconst isHorizontal = this.#mode === \"h\";\r\n\r\n\t\t// ๋ง์ฐ์ค ํฌ์ธํฐ์ ์คํ๋ฆฌํฐ ์์์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ\r\n\t\tconst clickOffset = isHorizontal\r\n\t\t\t? e.clientX - splitterRect.left\r\n\t\t\t: e.clientY - splitterRect.top;\r\n\r\n\t\tconst dragBar = document.createElement(\"div\");\r\n\t\tdragBar.className = `nx-splitter-drag-bar-${this.#mode}`;\r\n\r\n\t\tObject.assign(dragBar.style, {\r\n\t\t\tposition: \"absolute\",\r\n\t\t\tzIndex: \"999\",\r\n\t\t\tbackground: \"#666\",\r\n\t\t\topacity: \"0.6\",\r\n\t\t\tpointerEvents: \"none\"\r\n\t\t});\r\n\r\n\t\tconst root = this.getRootNode({ composed: true });\r\n\t\tconst parent = root instanceof ShadowRoot ? root.host : this.parentElement;\r\n\t\tconst prev = this.previousElementSibling;\r\n\t\tconst next = this.nextElementSibling;\r\n\r\n\t\tif (!parent || !prev || !next) {\r\n\t\t\ttrace.warn(\"Spliter's parent or siblings not found.\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t(parent.shadowRoot || parent).appendChild(dragBar);\r\n\t\tconst dragBarOffsetParentRect = dragBar.offsetParent.getBoundingClientRect();\r\n\r\n\t\tconst prevRect = prev.getBoundingClientRect();\r\n\t\tconst nextRect = next.getBoundingClientRect();\r\n\r\n\t\t// ๋๋๊ทธ ๋ฐ์ ์ด๊ธฐ ์์น์ ํฌ๊ธฐ ์ค์ \r\n\t\tconst initialSplitterPosInParent = (isHorizontal\r\n\t\t\t? splitterRect.left - dragBarOffsetParentRect.left\r\n\t\t\t: splitterRect.top - dragBarOffsetParentRect.top) + clickOffset;\r\n\r\n\t\tif (isHorizontal) {\r\n\t\t\tdragBar.style.top = \"0\";\r\n\t\t\tdragBar.style.left = `${initialSplitterPosInParent}px`;\r\n\t\t\tdragBar.style.width = \"2px\";\r\n\t\t\tdragBar.style.height = \"100%\";\r\n\t\t} else {\r\n\t\t\tdragBar.style.left = \"0\";\r\n\t\t\tdragBar.style.top = `${initialSplitterPosInParent}px`;\r\n\t\t\tdragBar.style.height = \"2px\";\r\n\t\t\tdragBar.style.width = \"100%\";\r\n\t\t}\r\n\r\n\t\tdragBar.style.mixBlendMode = \"difference\";\r\n\t\tdragBar.style.zIndex = \"99999\";\r\n\r\n\t\tconst minLimit = isHorizontal\r\n\t\t\t? prevRect.left - dragBarOffsetParentRect.left\r\n\t\t\t: prevRect.top - dragBarOffsetParentRect.top;\r\n\t\tconst maxLimit = isHorizontal\r\n\t\t\t? nextRect.right - dragBarOffsetParentRect.left - splitterRect.width\r\n\t\t\t: nextRect.bottom - dragBarOffsetParentRect.top - splitterRect.height;\r\n\r\n\t\tconst onMove = moveEvent => {\r\n\t\t\tconst clientPos = isHorizontal ? moveEvent.clientX : moveEvent.clientY;\r\n\t\t\tconst currentPosInParent = isHorizontal\r\n\t\t\t\t? clientPos - dragBarOffsetParentRect.left\r\n\t\t\t\t: clientPos - dragBarOffsetParentRect.top;\r\n\r\n\t\t\tconst clampedPos = Math.max(minLimit, Math.min(currentPosInParent, maxLimit));\r\n\r\n\t\t\tif (isHorizontal) {\r\n\t\t\t\tdragBar.style.left = `${clampedPos}px`;\r\n\t\t\t} else {\r\n\t\t\t\tdragBar.style.top = `${clampedPos}px`;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst onUp = () => {\r\n\r\n\t\t\twindow.removeEventListener(\"mousemove\", onMove);\r\n\t\t\twindow.removeEventListener(\"mouseup\", onUp);\r\n\t\t\tdragBar.remove();\r\n\r\n\t\t\tconst allChildren = Array.from(parent.children);\r\n\t\t\tconst allPanels = allChildren.filter(el => el.tagName.toLowerCase() !== 'nx-splitter');\r\n\r\n\t\t\t// โญโญ gap ํฌ๊ธฐ ๊ณ์ฐ โญโญ\r\n\t\t\tconst style = window.getComputedStyle(parent);\r\n\t\t\tconst gapValue = isHorizontal ? style.getPropertyValue('column-gap') : style.getPropertyValue('row-gap');\r\n\t\t\tconst gapSize = parseFloat(gapValue) || 0;\r\n\t\t\tconst gapCount = allChildren.length > 1 ? allChildren.length - 1 : 0;\r\n\t\t\tconst totalGapSize = gapCount * gapSize;\r\n\r\n\t\t\tconst finalDragBarPos = isHorizontal ? parseFloat(dragBar.style.left) : parseFloat(dragBar.style.top);\r\n\t\t\tconst dragOffset = finalDragBarPos - initialSplitterPosInParent;\r\n\r\n\t\t\tconst prevSize = isHorizontal ? prev.getBoundingClientRect().width : prev.getBoundingClientRect().height;\r\n\t\t\tconst nextSize = isHorizontal ? next.getBoundingClientRect().width : next.getBoundingClientRect().height;\r\n\r\n\t\t\tlet newPrevSize = prevSize + dragOffset;\r\n\t\t\tlet newNextSize = nextSize - dragOffset;\r\n\r\n\t\t\t// ํจ๋ ํฌ๊ธฐ๊ฐ ์์๊ฐ ๋์ง ์๋๋ก ์ ํํ๊ณ , ๋ค๋ฅธ ํจ๋์ ์ฐจ์ด๋ฅผ ๋ณด์ \r\n\t\t\tif (newPrevSize < 0) {\r\n\t\t\t\tnewNextSize += newPrevSize;\r\n\t\t\t\tnewPrevSize = 0;\r\n\t\t\t}\r\n\t\t\tif (newNextSize < 0) {\r\n\t\t\t\tnewPrevSize += newNextSize;\r\n\t\t\t\tnewNextSize = 0;\r\n\t\t\t}\r\n\r\n\t\t\tconst initialSizes = allPanels.map(panel => isHorizontal ? panel.getBoundingClientRect().width : panel.getBoundingClientRect().height);\r\n\r\n\t\t\tconst totalSplitterSize = allChildren.reduce((sum, child) => {\r\n\t\t\t\tif (child.tagName.toLowerCase() === 'nx-splitter') {\r\n\t\t\t\t\treturn sum + (isHorizontal ? child.getBoundingClientRect().width : child.getBoundingClientRect().height);\r\n\t\t\t\t}\r\n\t\t\t\treturn sum;\r\n\t\t\t}, 0);\r\n\r\n\t\t\tconst totalContainerSize = (isHorizontal ? parent.getBoundingClientRect().width : parent.getBoundingClientRect().height);\r\n\t\t\tconst totalFlexSpace = totalContainerSize - totalSplitterSize - totalGapSize;\r\n\r\n\t\t\t// --- ์์ธ ํ์
์ ์ํ ๋ก๊ทธ ์ถ๊ฐ ---\r\n\t\t\ttrace.log(`[Debug] ---------------------------`);\r\n\t\t\ttrace.log(`[Debug] TotalContainerSize: ${totalContainerSize}`);\r\n\t\t\ttrace.log(`[Debug] TotalSplitterSize: ${totalSplitterSize}`);\r\n\t\t\ttrace.log(`[Debug] GapSize: ${gapSize}, GapCount: ${gapCount}`);\r\n\t\t\ttrace.log(`[Debug] PrevSize(Old): ${prevSize}, NextSize(Old): ${nextSize}`);\r\n\t\t\ttrace.log(`[Debug] DragOffset: ${dragOffset}`);\r\n\t\t\ttrace.log(`[Debug] NewPrevSize: ${newPrevSize}, NewNextSize: ${newNextSize}`);\r\n\r\n\t\t\tallPanels.forEach((panel, index) => {\r\n\t\t\t\tconst isChartPanel = panel.querySelector('canvas') !== null;\r\n\t\t\t\tconst currentSize = isHorizontal ? panel.getBoundingClientRect().width : panel.getBoundingClientRect().height;\r\n\t\t\t\ttrace.log(`[Debug] Panel[${index}] (${isChartPanel ? 'Canvas' : 'Normal'}): Current=${currentSize.toFixed(2)}, New=${(panel === prev ? newPrevSize : (panel === next ? newNextSize : initialSizes[index])).toFixed(2)}`);\r\n\t\t\t});\r\n\t\t\ttrace.log(`[Debug] ---------------------------`);\r\n\r\n\t\t\tlet flexSum = 0;\r\n\t\t\tallPanels.forEach((panel, index) => {\r\n\t\t\t\tlet newSize;\r\n\t\t\t\tif (panel === prev) {\r\n\t\t\t\t\tnewSize = newPrevSize;\r\n\t\t\t\t} else if (panel === next) {\r\n\t\t\t\t\tnewSize = newNextSize;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tnewSize = initialSizes[index];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst newFlexBasis = newSize / totalFlexSpace;\r\n\t\t\t\t//panel.style.flex = `${newFlexBasis} ${newFlexBasis} 0`;\r\n\r\n\t\t\t\ttrace.log(panel);\r\n\r\n\t\t\t\tif (panel.classList.contains('sidebar')) {\r\n\t\t\t\t\t// ๋๋๊ทธ๊ฐ ๋๋ ์์ ์ newSize(px)๋ฅผ ๊ทธ๋๋ก ๊ณ ์ ๊ฐ์ผ๋ก ํ ๋น\r\n\t\t\t\t\t// ์ด๋ ๊ฒ ํ๋ฉด ๋น์จ(%)์ด ์๋๋ผ ๋ฑ ๊ทธ ํฝ์
๋งํผ๋ง ์๋ฆฌ๋ฅผ ์ฐจ์งํ๊ฒ ๋ฉ๋๋ค.\r\n\t\t\t\t\tpanel.style.flex = `0 0 ${newSize}px`;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// ๋๋จธ์ง ๋ฉ์ธ ๋ณด๋ ๊ฐ์ ์ ์ฐํ ํจ๋์ ๋น์จ(%)๋ก ์ฒ๋ฆฌ\r\n\t\t\t\t\t//const newFlexBasis = newSize / totalFlexSpace;\r\n\t\t\t\t\tpanel.style.flex = `${newFlexBasis} ${newFlexBasis} 0`;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tflexSum += newFlexBasis;\r\n\t\t\t});\r\n\r\n\t\t\ttrace.log(`dragOffset: ${dragOffset}`);\r\n\t\t\ttrace.log(`Calculated FlexSum: ${flexSum}`);\r\n\t\t};\r\n\r\n\t\twindow.addEventListener(\"mousemove\", onMove);\r\n\t\twindow.addEventListener(\"mouseup\", onUp);\r\n\t};\r\n\r\n\tget cssPath() {\r\n\t\treturn this.getAttribute(\"css-path\") || NineUxUtil.cssPath;\r\n\t}\r\n\r\n\t#init = () => {\r\n\t\tthis.#detectMode(this);\r\n\t\tthis.classList.add(this.#mode);\r\n\r\n\t\tconst contents = this.innerHTML.trim();\r\n\t\t//const gripClass = `grip-${this.#mode}`;\r\n\t\tconst gripTmpl = (contents === \"\") ? `<div class=\"grip\"></div>` : `<div class=\"grip\"></div><div class=\"inner-container\">${contents}</div><div class=\"grip\"></div>`;\r\n\r\n\t\tconst customImport = nine.cssPath ? `@import \"${nine.cssPath}/nine-util.css\";` : \"\";\r\n\r\n\t\tthis.innerHTML = \"\";\r\n\t\tconst htmlTmpl = document.createElement(\"template\");\r\n\r\n\t\thtmlTmpl.innerHTML = `\r\n\t\t\t<style>\r\n\t\t\t\t@import \"https://cdn.jsdelivr.net/npm/@ninebone/util@${__APP_VERSION__}/dist/css/nine-util.css\";\r\n\t\t\t\t${customImport}\r\n\t\t\t</style>\r\n\t\t\t${gripTmpl}\r\n `;\r\n\r\n\t\tthis.shadowRoot.appendChild(htmlTmpl.content.cloneNode(true));\r\n\r\n\t\tthis.shadowRoot.querySelectorAll(\".grip\").forEach(el => {\r\n\t\t\tel.addEventListener(\"mousedown\", e => this.#startDrag(e));\r\n\t\t});\r\n\r\n\t\tthis.#prepareLayout();\r\n\r\n\t\twindow.addEventListener(\"resize\", () => this.#prepareLayout());\r\n\t};\r\n\r\n\t#prepareLayout = () => {\r\n\t\tconst isHorizontal = this.#mode === \"h\";\r\n\t\tconst parent = this.parentElement;\r\n\t\tconst allPanels = Array.from(parent.children).filter(el => el.tagName.toLowerCase() !== 'nine-splitter');\r\n\t\tif (allPanels.length < 2) return;\r\n\r\n\t\tconst parentRect = parent.getBoundingClientRect();\r\n\t\tconst totalContentSize = allPanels.reduce((sum, el) => {\r\n\t\t\tconst size = isHorizontal ? el.getBoundingClientRect().width : el.getBoundingClientRect().height;\r\n\t\t\treturn sum + size;\r\n\t\t}, 0);\r\n\t\tconst totalParentSize = isHorizontal ? parentRect.width : parentRect.height;\r\n\r\n\t\tallPanels.forEach(panel => {\r\n\t\t\tconst size = isHorizontal ? panel.getBoundingClientRect().width : panel.getBoundingClientRect().height;\r\n\t\t\tconst newSize = totalParentSize * (size / totalContentSize);\r\n\t\t\tconst flexGrow = newSize / totalParentSize;\r\n\t\t\tpanel.style.flex = `${flexGrow} ${flexGrow} 0`;\r\n\t\t});\r\n\t};\r\n}\r\n\r\nif (!customElements.get('nine-splitter')) {\r\n\tcustomElements.define(\"nine-splitter\", UxSplitter);\r\n}","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|YYYY|YY|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),Y=_.prototype;return O.prototype=Y,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){Y[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));","import { trace } from \"@nopeer\";\n\n// ๐ฏ ๋ณต์กํ ์์์ ์ง์ฐ๊ณ ํ์
๊ณ ์ ์ ์ญํ (๊ป๋ฐ๊ธฐ ์กฐ๋ฆฝ)๋ง ์ํํฉ๋๋ค.\nexport class NinePopup extends HTMLElement {\n\tstatic get tagName() { return \"nine-popup\"; }\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.attachShadow({ mode: 'open' });\n\t}\n\n\tconnectedCallback() {\n\t\t// ๐ Shadow DOM ๋ด๋ถ์ nine-dialog ๋ ์ด์์ ๊ตฌ์ถ\n\t\tthis.shadowRoot.innerHTML = `\n\t\t\t<nine-dialog>\n\t\t\t\t<div class=\"popup-body\"></div>\n\t\t\t</nine-dialog>\n\t\t`;\n\t}\n\n\tclose(returnValue = null) {\n\t\tconst $dialog = this.dialog;\n\t\tif ($dialog) {\n\t\t\t// ๐ฏ ๊ตฌ์ง๊ตฌ์งํ ์ปค์คํ
์ด๋ฒคํธ ๋์ , ๊ธฐ์กด ์์ฐ์ธ ๋ค์ด์ผ๋ก๊ทธ์ ์ ๋๋ฉ์ด์
์ข
๋ฃ ํจ์๋ฅผ ์ง์ ํ๊ฒฉํฉ๋๋ค.\n\t\t\t$dialog.closeWithAnimation(returnValue);\n\t\t}\n\t}\n\n\t// ๐ ๋ฆฌ์กํธ ์์ง์ด ๊ฝ์ ๋ฃ์ ์
๊ตฌ ํฌ์ธํฐ ๊ฐ๋ฐฉ\n\tget popupBody() {\n\t\treturn this.shadowRoot?.querySelector('nine-dialog .popup-body') || null;\n\t}\n\n\t// ๐ ๋ฆฌ์กํธ๋ ์ธ๋ถ ์ ํธ์์ ์ง์ ์ ์ดํ ์ ์๋ ์ ์ด ํต๋ก\n\tget dialog() {\n\t\treturn this.shadowRoot?.querySelector('nine-dialog') || null;\n\t}\n}\n\nif (!customElements.get('nine-popup')) customElements.define('nine-popup', NinePopup);","// TreeUtil.js\r\nexport const TreeUtil = {\r\n\tsort: (data, sortField, idField = 'id', parentIdField = 'parentId') => {\r\n\t\t// 1. ID ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋งตํ (๊ฒ์ ์๋ ์ต์ ํ)\r\n\t\tconst map = {};\r\n\t\tdata.forEach(item => {\r\n\t\t\tmap[item[idField]] = { ...item, children: [] };\r\n\t\t});\r\n\r\n\t\t// 2. ๋ถ๋ชจ-์์ ๊ด๊ณ ํธ๋ฆฌ ๊ตฌ์ฑ\r\n\t\tconst roots = [];\r\n\t\tdata.forEach(item => {\r\n\t\t\tconst node = map[item[idField]];\r\n\t\t\tif (item[parentIdField] && map[item[parentIdField]]) {\r\n\t\t\t\tmap[item[parentIdField]].children.push(node);\r\n\t\t\t} else {\r\n\t\t\t\troots.push(node);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// 3. ์ฌ๊ท์ ์ผ๋ก ์ ๋ ฌํ๋ ํจ์\r\n\t\tconst sortNodes = (nodes) => {\r\n\t\t\tnodes.sort((a, b) => {\r\n\t\t\t\tconst valA = a[sortField];\r\n\t\t\t\tconst valB = b[sortField];\r\n\t\t\t\treturn (typeof valA === 'number') ? valA - valB : String(valA || '').localeCompare(String(valB || ''));\r\n\t\t\t});\r\n\t\t\tnodes.forEach(node => sortNodes(node.children));\r\n\t\t};\r\n\r\n\t\tsortNodes(roots);\r\n\r\n\t\t// 4. ๋ค์ ํํํ (Flat Array)\r\n\t\tconst result = [];\r\n\t\tconst flatten = (nodes) => {\r\n\t\t\tnodes.forEach(node => {\r\n\t\t\t\tresult.push(node);\r\n\t\t\t\tif (node.children.length > 0) flatten(node.children);\r\n\t\t\t});\r\n\t\t};\r\n\t\tflatten(roots);\r\n\t\treturn result;\r\n\t}\r\n};","import { nine } from '../core/Config.js';\r\nimport dayjs from \"dayjs\";\r\nimport React from 'react'; // ๐ฏ React ๋ด์ฅ ํฌํผ ์ํฌํธ\r\nimport { createRoot } from 'react-dom/client';\r\nimport { NinePopup } from './NinePopup.js';\r\nimport { TreeUtil } from './TreeUtil.js'; // ๋ถ๋ฆฌํ ํ์ผ ์ํฌํธ\r\n\r\nexport class NineUtil {\r\n\r\n\t// ๐
1. ๋ ์ง ํฌ๋งท ํฌํผ (์ธ์คํด์ค ๋ฉ์๋)\r\n\tformatDate = (v, fmt) => {\r\n\t\treturn dayjs(v).format(fmt);\r\n\t};\r\n\r\n\t/**\r\n\t * ๐ฎ ์ด๊ฐ๋จ ๋ง๋ฅ ๋๋๊ทธ ํ์
์์ง (Promise/Then ๊ท๊ฒฉ)\r\n\t * @param {React.Component} ContentComponent - ํ์
๋ด๋ถ์ ๋์ธ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ\r\n\t * @param {Object} param - ํ์
์๋งน์ด์ 'data'๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ฐฐ๋ฌ๋ ์์ ๋ฐ์ดํฐ ๊ฐ์ฒด\r\n\t * @param {string} title - ์ญ์ ๋๋๊ทธ ๋ฐ ํค๋์ ๊ฝํ ํ์ดํ๋ช
(๊ธฐ๋ณธ๊ฐ: Details)\r\n\t * @returns {Promise} ํ์
์ด ๋ซํ ๋ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ ํ๋กํผํฐ ์์์ฆ\r\n\t */\r\n\tpopup = (ContentComponent, param = {}, title = \"Details\") => {\r\n\t\tdocument.querySelectorAll(NinePopup.tagName).forEach(el => el.remove());\r\n\r\n\t\tconst $popupWrapper = document.createElement(NinePopup.tagName);\r\n\t\tdocument.body.appendChild($popupWrapper);\r\n\r\n\t\treturn new Promise((resolve) => {\r\n\t\t\tconst $bodySpace = $popupWrapper.popupBody;\r\n\t\t\tconst $dialogComp = $popupWrapper.dialog;\r\n\r\n\t\t\tif (title && $dialogComp) $dialogComp.setAttribute(\"subject\", title);\r\n\r\n\t\t\tconst root = createRoot($bodySpace);\r\n\r\n\t\t\t// ๐ฏ ์ค์ง ํ๋, ๋ค์ด์ผ๋ก๊ทธ๊ฐ ์์ ํ ํ๊ดด(Closed)๋๋ ์์ ๋ง ๋ฑ ๋์์ฑ๋๋ค.\r\n\t\t\t$dialogComp?.addEventListener('closed', (e) => {\r\n\t\t\t\tresolve(e.detail); // ์ต์ข
๋ฐํ๊ฐ ๋ถ๋ชจ์ .then()์ผ๋ก ์ ๋ฌ\r\n\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\troot.unmount();\r\n\t\t\t\t\t$popupWrapper.remove();\r\n\t\t\t\t}, 0);\r\n\t\t\t});\r\n\r\n\t\t\troot.render(React.createElement(ContentComponent, { data: param }));\r\n\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\t$dialogComp?.showModal();\r\n\t\t\t}, 0);\r\n\t\t});\r\n\t};\r\n\r\n\t/**\r\n\t * ๐ฏ 2. Shadow DOM ๊ฒฝ๊ณ๋ฅผ ๋ฌด๋ ฅํํ๊ณ ๊น์ด ์๊ด์์ด ๋ชจ๋ ์์๋ฅผ ์์งํ๋ ๋ง๋ฅ ์ฟผ๋ฆฌ\r\n\t * @param {string} selector - ์ฐพ๊ณ ์ ํ๋ CSS ์ ํ์ (์: 'input[name]')\r\n\t * @param {HTMLElement|ShadowRoot|Document} root - ํ์ ์์์ \r\n\t * @returns {HTMLElement[]} ๋งค์นญ๋ ์๋ฐ์คํฌ๋ฆฝํธ DOM ์๋ฆฌ๋จผํธ ๋ฐฐ์ด\r\n\t */\r\n\tquerySelectorAll = (selector, root = document) => {\r\n\t\tconst results = [];\r\n\r\n\t\tconst search = (node) => {\r\n\t\t\tif (!node) return;\r\n\r\n\t\t\t// ํ์ฌ ๋
ธ๋๊ฐ ShadowRoot๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด ๊ทธ ๋ด๋ถ๋ถํฐ ํ์\r\n\t\t\tif (node.shadowRoot) {\r\n\t\t\t\tsearch(node.shadowRoot);\r\n\t\t\t}\r\n\r\n\t\t\t// ํ์ฌ ๋ ๋ฒจ(Light DOM ๋๋ Shadow DOM)์์ ๋งค์นญ๋๋ ํ๊ฒ ์์ง\r\n\t\t\tnode.querySelectorAll?.(selector).forEach(elem => {\r\n\t\t\t\tif (!results.includes(elem)) {\r\n\t\t\t\t\tresults.push(elem);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t// ์ฑ๋ฅ ์ต์ ํ: querySelectorAll('*') ๋์ ์ค์ ์์ ์๋ฆฌ๋จผํธ๋ค๋ง ๋ฃจํ ๋๋ฉฐ ์ฌ๊ท ํ์\r\n\t\t\tconst children = node.children ? Array.from(node.children) : [];\r\n\t\t\tchildren.forEach(child => {\r\n\t\t\t\tsearch(child);\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tsearch(root);\r\n\t\treturn results;\r\n\t};\r\n\r\n\t/**\r\n\t * ๐ฏ 3. Shadow DOM ๊ฒฝ๊ณ๋ฅผ ๋ซ๊ณ ๊ฐ์ฅ ๋จผ์ ๋งค์นญ๋๋ ๋จ ํ๋์ ์์๋ฅผ ๋ฐํ (์กฐ๊ธฐ ์ข
๋ฃ ์ต์ ํ)\r\n\t * @param {string} selector - ์ฐพ๊ณ ์ ํ๋ CSS ์ ํ์\r\n\t * @param {HTMLElement|ShadowRoot|Document} root - ํ์ ์์์ \r\n\t * @returns {HTMLElement|null} ๋งค์นญ๋ ์๋ฆฌ๋จผํธ ๊ฐ์ฒด ๋๋ null\r\n\t */\r\n\tquerySelector = (selector, root = document) => {\r\n\t\tif (!root) return null;\r\n\r\n\t\t// ํ์ฌ ๋
ธ๋ ์์ฒด์์ ๋ฐ๋ก ๋งค์นญ๋๋ ๊ฒ ์๋ค๋ฉด ์ฆ์ ๋ฐํ\r\n\t\tlet found = root.querySelector?.(selector);\r\n\t\tif (found) return found;\r\n\r\n\t\t// ํ์ฌ ๋
ธ๋์ Shadow DOM ์ฅ๋ฒฝ์ด ์๋ค๋ฉด ๊ทธ ๋ด๋ถ๋ฅผ ๋จผ์ ํ์\r\n\t\tif (root.shadowRoot) {\r\n\t\t\tfound = this.querySelector(selector, root.shadowRoot);\r\n\t\t\tif (found) return found;\r\n\t\t}\r\n\r\n\t\t// ์์ ์์๋ค์ ์ํํ๋ฉฐ ๊น์์ด ์จ์ ํ๊ฒ ์ถ์ \r\n\t\tconst children = root.children ? Array.from(root.children) : [];\r\n\t\tfor (const child of children) {\r\n\t\t\tfound = this.querySelector(selector, child);\r\n\t\t\tif (found) return found;\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t};\r\n\r\n\t/**\r\n\t * ๐ฏ 4. Shadow DOM ๊ฒฝ๊ณ๋ฅผ ๊ดํตํ์ฌ ๊ฐ์ฅ ๊ฐ๊น์ด ์กฐ์ ์์๋ฅผ ์ฐพ๋ ๋ง๋ฅ ํด๋ก์ง์คํธ\r\n\t * @param {string} selector - ์ฐพ๊ณ ์ ํ๋ ๋ถ๋ชจ์ CSS ์ ํ์ (์: 'nine-popup')\r\n\t * @param {HTMLElement} startElement - ํ์์ ์์ํ ๊ธฐ์ค ์๋ฆฌ๋จผํธ (๋ณดํต e.target)\r\n\t * @returns {HTMLElement|null} ๋งค์นญ๋ ์กฐ์ ์๋ฆฌ๋จผํธ ๊ฐ์ฒด ๋๋ null\r\n\t */\r\n\tclosest = (selector, startElement) => {\r\n\t\tif (!startElement || typeof selector !== 'string') return null;\r\n\r\n\t\tlet currentElement = startElement;\r\n\r\n\t\twhile (currentElement) {\r\n\t\t\t// โ ์ผ๋ฐ Element ๋
ธ๋์ผ ๋๋ง matches ๊ฒ์ฌ (ShadowRoot ๋ฑ ๋ถ๊ธฐ ๋ฐฉ์ด)\r\n\t\t\tif (currentElement.nodeType === Node.ELEMENT_NODE) {\r\n\t\t\t\tif (currentElement.matches(selector)) {\r\n\t\t\t\t\treturn currentElement;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// โก ๐ [ํต์ฌ] ํ์ฌ ๋
ธ๋๊ฐ Shadow DOM ๋ด๋ถ๋ผ๋ฉด getRootNode().host๋ฅผ ํตํด ๋ฐ๊นฅ ์ธ์(Host)์ผ๋ก ํ์ถ!\r\n\t\t\t// ๋ง์ฝ ๋ ์ด์ ์ฌ๋ผ๊ฐ Host๊ฐ ์๋ค๋ฉด ์ผ๋ฐ ์์ ๋ถ๋ชจ(parentElement)๋ก ์ด๋\r\n\t\t\tconst rootNode = currentElement.getRootNode?.();\r\n\r\n\t\t\tif (rootNode && rootNode instanceof ShadowRoot) {\r\n\t\t\t\tcurrentElement = rootNode.host; // ์ฅ๋ฒฝ ๋ํ\r\n\t\t\t} else {\r\n\t\t\t\tcurrentElement = currentElement.parentElement || null; // ์ผ๋ฐ ๋ถ๋ชจ ์ถ์ \r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t};\r\n\r\n\trandomUUID = (num) => {\r\n\t\tif (!num) num = 10;\r\n\r\n\t\tconst characters ='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\r\n\t\tlet result = '';\r\n\t\tconst charactersLength = characters.length;\r\n\t\tfor (let i = 0; i < num; i++) {\r\n\t\t\tresult += characters.charAt(Math.floor(Math.random() * charactersLength));\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t};\r\n\r\n\ttree = {\r\n\t\tsort: TreeUtil.sort,\r\n\t};\r\n}\r\n\r\nconst utilInstance = new NineUtil();\r\n// ๐ฏ [ํต์ฌ] ๊ธ๋ก๋ฒ `nine` ๊ฐ์ฒด์ ์ ํธ๋ฆฌํฐ ๋ฉ์๋๋ค์ ํต์งธ๋ก ์ด์ํฉ๋๋ค.\r\nObject.assign(nine, utilInstance);","// 1. ๊ธฐ์กด core ๋ชจ๋\r\n//import { NineUxUtil } from './ux/dialog/NineUxUtil.js';\r\nimport { nine, subscribeConfig, config } from './core/Config.js';\r\nimport { Trace, trace } from './core/Trace.js';\r\nimport { TaskDebouncer } from './core/TaskDebouncer.js';\r\n\r\n// 2. ์ ๊ท net ๋ฐ ux ๋ชจ๋ ์ถ๊ฐ\r\nimport { api, Fetch } from './net/Fetch.js';\r\nimport { Loading } from './ux/Loading.js';\r\n\r\nimport { nineDialog } from './ux/dialog/nineDialog.js';\r\nimport { nineConfirmPopup, nineAlertPopup } from './ux/dialog/nineConfirm.js';\r\nimport { ninePromptPopup } from './ux/dialog/ninePrompt.js';\r\n\r\nimport { safe } from \"./utils/promise.js\"; // ๊ฒฝ๋ก์ ๋ง์ถฐ ์ํฌํธ\r\n// ux\r\nimport './ux/UxSplitter.js';\r\nimport './ux/dialog/NineUxUtil.js';\r\nimport './utils/NineUtil.js';\r\nimport './utils/NinePopup.js';\r\n\r\n/**\r\nconst utilInstance = new NineUxUtil();\r\nnine.alert = utilInstance.alert.bind(utilInstance);\r\nnine.confirm = utilInstance.confirm.bind(utilInstance);\r\nnine.prompt = utilInstance.prompt.bind(utilInstance);\r\nnine.formatDate = utilInstance.formatDate.bind(utilInstance);\r\n\t*/\r\n//const utilInstance = new NineUxUtil();\r\n\r\n// ๐ก ์ด๋ฏธ ํ์ดํ ํจ์๋ก ๋ฐ์ธ๋ฉ๋์ด ์์ผ๋ฏ๋ก, ๊ฐ์ฒด ํต์งธ๋ก ๋ณต์ฌํด์ฃผ๋ฉด ๋๋ฉ๋๋ค!\r\n//Object.assign(nine, utilInstance);\r\n\r\nnine.safe = safe;\r\n\r\n// ๊ธฐ์กด nine ๊ฐ์ฒด(Config)์ Util ๊ธฐ๋ฅ์ ํฉ์ฑ\r\n//Object.assign(nine, utilInstance);\r\n\r\nnine.api = api;\r\nnine.trace = trace;\r\nnine.subscribeConfig = subscribeConfig;\r\nnine.config = config || {};\r\n\r\nexport {\r\n\tnine,\r\n\tsubscribeConfig,\r\n\tconfig,\r\n\tTrace,\r\n\ttrace,\r\n\tTaskDebouncer,\r\n\tapi, // ๐ ์ถ๊ฐ: ์ด์ ์๋น์ค์์ api.get() ๊ฐ๋ฅ\r\n\tFetch, // ๐ ์ถ๊ฐ: ํด๋์ค ์์ฒด๋ ํน์ ๋ชจ๋ฅด๋ ๋
ธ์ถ\r\n\tLoading as loading, // ๐ ์ถ๊ฐ: loading.show() ๋ก ์ฐ๊ธฐ ํธํ๊ฒ alias\r\n\tnineDialog,\r\n\tnineAlertPopup, nineConfirmPopup, ninePromptPopup\r\n};\r\n\r\nif (typeof window !== 'undefined') {\r\n\twindow.nine = nine;\r\n}\r\n","/**\r\n * ๋น๋๊ธฐ ํจ์๋ฅผ try-catch ์์ด ์์ ํ๊ฒ ์คํํ๊ฒ ๋์์ฃผ๋ ์ ํธ๋ฆฌํฐ\r\n * @param {Promise} promise\r\n * @returns {Promise<[any, Error|null]>}\r\n */\r\nexport const safe = async (promise) => {\r\n\ttry {\r\n\t\tconst data = await promise;\r\n\t\treturn [data, null];\r\n\t} catch (err) {\r\n\t\treturn [null, err];\r\n\t}\r\n};"],"names":["listeners","Set","_initialConfig","ux","nativeOverride","theme","board","readOnly","cssPath","debug","window","__NINE_GLOBAL_CONFIG__","_config","subscribeConfig","fn","add","delete","config","Proxy","set","target","prop","value","forEach","get","nine","this","setup","options","Object","entries","key","Array","isArray","Trace$1","_a","constructor","name","color","__privateAdd","_Trace_instances","_name","_color","__privateSet","init","log","__privateMethod","isTraceEnabled_fn","call","style","__privateGet","console","bind","warn","error","WeakMap","WeakSet","debugConfig","enable","filter","includes","location","hostname","startsWith","trace","Trace","_timer","_queue","_delay","_TaskDebouncer_instances","flush_fn","length","tasks","splice","seen","task","identifier","func","JSON","stringify","args","has","traceOrigin","super","Loading","show","overlay","document","getElementById","createElement","id","cssText","innerHTML","body","appendChild","head","display","hide","_Fetch","_request","__publicField","__API_BASE_URL__","method","url","data","showLoading","finalUrl","BASE_URL","headers","FormData","targetUrl","URLSearchParams","fetch","then","async","res","ok","text","Error","status","json","catch","err","toLowerCase","finally","rows","fileKey","filePartName","jsonPartName","chunkSize","dataRows","totalCount","lastResponse","globalFileIndex","i","formData","chunk","slice","rowDataList","row","rowIndex","fileData","rest","files","fileIndices","fileObj","File","append","push","jsonBlob","Blob","type","post","success","response","_fileObj","Fetch","api","dialogStyles","nineDialog","HTMLElement","_shift","_dialog","showModal","_b","shadowRoot","activeElement","blur","close","remove","_init","querySelector","addEventListener","_onMouseDown","_onTouchStart","querySelectorAll","btn","onclick","closeWithAnimation","e","closest","button","altKey","ctrlKey","shiftKey","rect","getBoundingClientRect","x","clientX","left","y","clientY","top","onMouseMove","ev","position","margin","onMouseUp","removeEventListener","touch","changedTouches","pageX","pageY","onTouchMove","t","onTouchEnd","connectedCallback","v","titleText","getAttribute","returnValue","classList","setTimeout","dispatchEvent","CustomEvent","detail","BasePopup","attachShadow","mode","open","PopupClass","message","title","renderFn","tagName","class","animation","_c","replace","el","dialogComp","setAttribute","Promise","resolve","setupEvents","customElements","define","_nineConfirmPopup","render","m","o","msg","conf","nineConfirmPopup","_nineAlertPopup","nineAlertPopup","_ninePromptPopup","textarea","requestAnimationFrame","focus","ninePromptPopup","NineUxUtil","_NineUxUtil_instances","prepare_fn","defaultClass","isExecuted","popup","alert","confirm","prompt","runner","rgb","classic","shake","run","zoom","reject","assign","UxSplitter","_mode","_detectMode","prev","previousElementSibling","next","nextElementSibling","contains","prevRect","nextRect","Math","abs","_startDrag","preventDefault","stopPropagation","splitterRect","isHorizontal","clickOffset","dragBar","className","zIndex","background","opacity","pointerEvents","root","getRootNode","composed","parent","ShadowRoot","host","parentElement","dragBarOffsetParentRect","offsetParent","initialSplitterPosInParent","width","height","mixBlendMode","minLimit","maxLimit","right","bottom","onMove","moveEvent","clientPos","currentPosInParent","clampedPos","max","min","onUp","allChildren","from","children","allPanels","getComputedStyle","gapValue","getPropertyValue","gapSize","parseFloat","gapCount","totalGapSize","dragOffset","prevSize","nextSize","newPrevSize","newNextSize","initialSizes","map","panel","totalSplitterSize","reduce","sum","child","totalContainerSize","totalFlexSpace","index","isChartPanel","currentSize","toFixed","flexSum","newSize","newFlexBasis","flex","contents","trim","gripTmpl","customImport","htmlTmpl","content","cloneNode","_prepareLayout","parentRect","totalContentSize","totalParentSize","size","flexGrow","n","r","s","u","a","c","f","h","d","l","$","M","weekdays","split","months","ordinal","String","join","z","utcOffset","floor","date","year","month","clone","ceil","p","w","D","ms","Q","g","S","_","O","arguments","b","locale","$L","utc","$u","$x","$offset","parse","prototype","$d","Date","NaN","test","match","substring","UTC","$y","getFullYear","$M","getMonth","$D","getDate","$W","getDay","$H","getHours","$m","getMinutes","$s","getSeconds","$ms","getMilliseconds","$utils","isValid","toString","isSame","startOf","endOf","isAfter","isBefore","$g","unix","valueOf","getTime","toDate","apply","$locale","weekStart","$set","daysInMonth","Number","round","subtract","format","invalidDate","meridiem","monthsShort","weekdaysMin","weekdaysShort","getTimezoneOffset","diff","toJSON","toISOString","toUTCString","Y","extend","$i","isDayjs","en","Ls","NinePopup","$dialog","dialog","popupBody","TreeUtil","sort","sortField","idField","parentIdField","item","roots","node","sortNodes","nodes","valA","valB","localeCompare","result","flatten","utilInstance","fmt","dayjs","ContentComponent","param","$popupWrapper","$bodySpace","$dialogComp","createRoot","unmount","React","selector","results","search","elem","found","startElement","currentElement","nodeType","Node","ELEMENT_NODE","matches","rootNode","num","characters","charAt","random","safe","promise","delay","exec","clearTimeout","execWithKey"],"mappings":"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","x_google_ignoreList":[12]}
|
|
1
|
+
{"version":3,"file":"nine-util.umd.js","sources":["../src/core/Config.js","../src/core/Trace.js","../src/core/TaskDebouncer.js","../src/external/NoPeer.js","../src/ux/Loading.js","../src/net/Fetch.js","../src/ux/dialog/style.dialog.js","../src/ux/dialog/nineDialog.js","../src/ux/dialog/nineConfirm.js","../src/ux/dialog/ninePrompt.js","../src/ux/dialog/NineUxUtil.js","../src/ux/UxSplitter.js","../node_modules/dayjs/dayjs.min.js","../src/utils/NinePopup.js","../src/utils/TreeUtil.js","../src/utils/NineUtil.js","../src/index.js","../src/utils/promise.js"],"sourcesContent":["const listeners = new Set();\r\n\r\n// ๐ก [ํต์ฌ] ์ ์ญ ์ ์ฅ์๋ฅผ ๋จ์ผํํฉ๋๋ค.\r\n// window์ ์ด๋ฏธ ์์ผ๋ฉด ๊ทธ๊ฒ์ ์ฐ๊ณ , ์์ผ๋ฉด ์ด๊ธฐ๊ฐ์ ์์ฑํ์ฌ ๋ฑ๋กํฉ๋๋ค.\r\nconst _initialConfig = {\r\n\tux: { nativeOverride: false, theme: 'light' },\r\n\tboard: { readOnly: false },\r\n\tcssPath: \"\",\r\n\tdebug: false\r\n};\r\n\r\nif (typeof window !== 'undefined' && !window.__NINE_GLOBAL_CONFIG__) {\r\n\twindow.__NINE_GLOBAL_CONFIG__ = _initialConfig;\r\n}\r\n\r\n// ์ด์ ๋ชจ๋ ๋ชจ๋์ _config๋ ๋์ผํ window ๊ฐ์ฒด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.\r\nconst _config = typeof window !== 'undefined' ? window.__NINE_GLOBAL_CONFIG__ : _initialConfig;\r\n\r\nexport const subscribeConfig = (fn) => {\r\n\tlisteners.add(fn);\r\n\tfn('all', _config);\r\n\treturn () => listeners.delete(fn);\r\n};\r\n\r\n// Proxy ์ญ์ ์ ์ญ ์ ์ฅ์์ธ _config๋ฅผ ์กฐ์ํฉ๋๋ค.\r\nexport const config = new Proxy(_config, {\r\n\tset(target, prop, value) {\r\n\t\ttarget[prop] = value;\r\n\t\tlisteners.forEach(fn => fn(prop, target));\r\n\t\treturn true;\r\n\t},\r\n\tget(target, prop) {\r\n\t\treturn target[prop];\r\n\t}\r\n});\r\n\r\nexport const nine = {\r\n\tconfig: config,\r\n\r\n\t// Getter์์ window.nine๊น์ง ํ์ธํ ํ์๋ ์์ต๋๋ค.\r\n\t// ์ด๋ฏธ config ์์ฒด๊ฐ ์ ์ญ ์ ์ฅ์(__NINE_GLOBAL_CONFIG__)๋ฅผ ๋ฐ๋ผ๋ณด๊ณ ์๊ธฐ ๋๋ฌธ์
๋๋ค.\r\n\tget cssPath() {\r\n\t\treturn this.config.cssPath || \"\";\r\n\t},\r\n\r\n\tsetup(options = {}) {\r\n\t\tObject.entries(options).forEach(([key, value]) => {\r\n\t\t\t// ๊น์ ๋ณํฉ ์ง์\r\n\t\t\tif (typeof value === 'object' && value !== null && !Array.isArray(value)) {\r\n\t\t\t\tthis.config[key] = { ...this.config[key], ...value };\r\n\t\t\t} else {\r\n\t\t\t\tthis.config[key] = value;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// ๋ค๋ฅธ ๋ชจ๋์์ window.nine์ผ๋ก ์ ๊ทผํ ์ ์๋๋ก ๋ณด์ฅ\r\n\t\tif (typeof window !== 'undefined') {\r\n\t\t\twindow.nine = window.nine || this;\r\n\t\t}\r\n\t}\r\n};","//import { nine } from '@nine-lab/nine-util';\r\n\r\nexport class Trace {\r\n\t#name;\r\n\t#color;\r\n\r\n\tconstructor(name = null, color = \"green\") {\r\n\t\tthis.#name = name;\r\n\t\tthis.#color = color;\r\n\t}\r\n\r\n\tinit(name, color = \"green\") {\r\n\t\tthis.#name = name;\r\n\t\tthis.#color = color;\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * ๐ฏ ์ค์๊ฐ ๋๋ฒ๊ทธ ํ์ฑํ ๋ฐ ํํฐ ํ๊ฒ ์ฌ๋ถ ์ฒดํฌ ํฌํผ\r\n\t */\r\n\t#isTraceEnabled() {\r\n\t\t// 1. ์ต์๋จ main.jsx์์ nine.setup() ์ธํ
์ด ์๋ฃ๋์๋์ง ํ์ธ\r\n\t\tif (nine && nine.config && nine.config.debug) {\r\n\t\t\tconst debugConfig = nine.config.debug;\r\n\r\n\t\t\t// ๐จ ๋๋ฒ๊ทธ ๋ง์คํฐ ์ค์์น๊ฐ ๊บผ์ ธ์์ผ๋ฉด ๋ฌด์กฐ๊ฑด ์ถ๋ ฅ ์ ํจ\r\n\t\t\tif (debugConfig.enable === false) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// ๐ฏ [ํํฐ ์ฒดํฌ ์ถ๊ฐ] ๋๋ฒ๊ทธ๊ฐ ์ผ์ ธ์๊ณ , ํํฐ(filter) ๋ฐฐ์ด ๋ช
๋จ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ\r\n\t\t\tif (debugConfig.enable === true && Array.isArray(debugConfig.filter)) {\r\n\t\t\t\t// ์ด๋ฆ์ด ์ง์ ์ ๋ ์์ trace.log๋ ํต๊ณผ, ์ด๋ฆ์ด ์๋ค๋ฉด ํํฐ ๋ช
๋จ์ ์์ด์ผ๋ง ํต๊ณผ!\r\n\t\t\t\tif (this.#name) {\r\n\t\t\t\t\treturn debugConfig.filter.includes(this.#name);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn debugConfig.enable;\r\n\t\t}\r\n\r\n\t\t// 2. [Fallback] ๋ง์ฝ nine ์
์
์ ์ ํธ์ถ๋๊ฑฐ๋ ์ธํ
์ด ์๋ค๋ฉด ๊ธฐ์กด ๋ก์ปฌ ์ฃผ์ ์ฌ๋ถ๋ก ํ๋จ\r\n\t\tif (typeof window !== 'undefined') {\r\n\t\t\treturn window.location.hostname === 'localhost' ||\r\n\t\t\t\twindow.location.hostname === '127.0.0.1' ||\r\n\t\t\t\twindow.location.hostname.startsWith('192.168.');\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\t// ๐ด ํต์ฌ: ์์ค ์์น ์ ์ง๋ฅผ ์ํ Getter ๋ก์ง\r\n\tget log() {\r\n\t\tif (!this.#isTraceEnabled()) return () => {};\r\n\r\n\t\tconst style = `color: ${this.#color}; font-weight: bold;`;\r\n\t\treturn (this.#name)\r\n\t\t\t? console.log.bind(console, `%c[${this.#name}]`, style)\r\n\t\t\t: console.log.bind(console);\r\n\t}\r\n\r\n\tget warn() {\r\n\t\tif (!this.#isTraceEnabled()) return () => {};\r\n\t\treturn (this.#name)\r\n\t\t\t? console.warn.bind(console, `%c[${this.#name}]`, \"color: cyan; font-weight: bold;\")\r\n\t\t\t: console.warn.bind(console);\r\n\t}\r\n\r\n\tget error() {\r\n\t\t// ์์คํ
์น๋ช
์ ์ฅ์ ์๋ฌ๋ ๋๋ฒ๊ทธ ๋ชจ๋/ํํฐ ์ฌ๋ถ์ ์๊ด์์ด ์ค์ ์ฅ์ ๋ชจ๋ํฐ๋ง์ ์ํด ๋ฌด์กฐ๊ฑด ์ธ์ํฉ๋๋ค.\r\n\t\treturn (this.#name)\r\n\t\t\t? console.error.bind(console, `%c[${this.#name}]`, \"color: red; font-weight: bold;\")\r\n\t\t\t: console.error.bind(console);\r\n\t}\r\n}\r\n\r\nexport const trace = new Trace();\r\nif (typeof window !== 'undefined') window.trace = trace;","export class TaskDebouncer {\r\n\t#timer = null;\r\n\t#queue = [];\r\n\t#delay;\r\n\r\n\tconstructor(delay = 50) {\r\n\t\tthis.#delay = delay;\r\n\t}\r\n\r\n\t/**\r\n\t * @param {Function} func - ์คํํ ํจ์\r\n\t * @param {...any} args - ํจ์์ ์ ๋ฌํ ์์์ ํ๋ผ๋ฏธํฐ๋ค\r\n\t */\r\n\texec(func, ...args) {\r\n\t\t// 1. ์ด๋ค ํจ์์ ์ด๋ค ์ธ์๋ค์ด ๋ค์ด์๋์ง ํ์ ์ ์ฅ\r\n\t\tthis.#queue.push({ func, args });\r\n\r\n\t\t// 2. ๋๋ฐ์ด์ค ํ์ด๋จธ ์ค์ \r\n\t\tif (this.#timer) clearTimeout(this.#timer);\r\n\r\n\t\tthis.#timer = setTimeout(() => this.#flush(), this.#delay);\r\n\t}\r\n\r\n\texecWithKey(key, func, ...args) {\r\n\t\t// 1. ๊ฐ์ ํค(์: 'resize')๊ฐ ๋ค์ด์ค๋ฉด ์ด์ ํ์์ ํด๋น ํค ์ญ์ (์ค๋ณต ์ ๊ฑฐ)\r\n\t\tthis.#queue = this.#queue.filter(task => task.key !== key);\r\n\r\n\t\t// 2. ์๋ก์ด ํ์คํฌ ์ถ๊ฐ\r\n\t\tthis.#queue.push({ key, func, args });\r\n\r\n\t\tif (this.#timer) clearTimeout(this.#timer);\r\n\t\tthis.#timer = setTimeout(() => this.#flush(), this.#delay);\r\n\t}\r\n\r\n\t#flush() {\r\n\t\tif (this.#queue.length === 0) return;\r\n\r\n\t\t// 3. ํ์ฌ๊น์ง ์์ธ ํ๋ฅผ ์ ๋นผ์ด\r\n\t\tconst tasks = this.#queue.splice(0, this.#queue.length);\r\n\t\tconst seen = new Set();\r\n\r\n\t\ttasks.forEach(task => {\r\n\t\t\t// 4. ํต์ฌ: ํจ์ ์ด๋ฆ๊ณผ ์ธ์๋ค์ ๋ฌธ์์ด๋ก ํฉ์ณ์ ์ ๋ํฌ ํค ์์ฑ\r\n\t\t\t// JSON.stringify๋ฅผ ํตํด [1, {a:1}] ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ ๋ฌธ์์ด๋ก ๋น๊ต ๊ฐ๋ฅ\r\n\t\t\tconst identifier = `${task.func.name}_${JSON.stringify(task.args)}`;\r\n\r\n\t\t\tif (!seen.has(identifier)) {\r\n\t\t\t\t// 5. ์ค๋ณต์ด ์๋ ๋๋ง ์๋ ์ธ์๋ค(...args) ๊ทธ๋๋ก ์คํ\r\n\t\t\t\ttask.func(...task.args);\r\n\t\t\t\tseen.add(identifier);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.#timer = null;\r\n\t}\r\n}","import { trace as traceOrigin } from '../core/Trace.js';\n\nexport class Trace extends traceOrigin.constructor {\n constructor() {\n super();\n this.init(\"nine-util\", \"green\");\n }\n}\n\nexport const trace = new Trace();","export class Loading {\n\tstatic show() {\n\t\tlet overlay = document.getElementById(\"global-loading-overlay\");\n\t\tif (!overlay) {\n\t\t\toverlay = document.createElement(\"div\");\n\t\t\toverlay.id = \"global-loading-overlay\";\n\t\t\toverlay.style.cssText = `\n position: fixed; inset: 0; z-index: 9999;\n background: rgba(0, 0, 0, 0.4); display: flex; \n justify-content: center; align-items: center;\n backdrop-filter: blur(2px);\n `;\n\t\t\toverlay.innerHTML = `<div class=\"loading-spinner\"></div>`;\n\t\t\tdocument.body.appendChild(overlay);\n\n\t\t\tif (!document.getElementById(\"nine-util-style\")) {\n\t\t\t\tconst style = document.createElement(\"style\");\n\t\t\t\tstyle.id = \"nine-util-style\";\n\t\t\t\tstyle.innerHTML = `\n .loading-spinner {\n width: 48px; height: 48px;\n border: 5px solid rgba(255, 255, 255, 0.3);\n border-top-color: white; border-radius: 50%;\n animation: nine-spin 1s linear infinite;\n }\n @keyframes nine-spin { to { transform: rotate(360deg); } }\n `;\n\t\t\t\tdocument.head.appendChild(style);\n\t\t\t}\n\t\t}\n\t\toverlay.style.display = \"flex\";\n\t}\n\n\tstatic hide() {\n\t\tconst overlay = document.getElementById(\"global-loading-overlay\");\n\t\tif (overlay) overlay.style.display = \"none\";\n\t}\n}","import { trace } from \"@nopeer\";\nimport { Loading } from \"../ux/Loading.js\";\n\nexport class Fetch {\n\tstatic BASE_URL = window.__API_BASE_URL__ || \"\";\n\n\tstatic #request = (method, url, data = {}, showLoading = true) => {\n\t\tconst finalUrl = url.startsWith('http') ? url : `${this.BASE_URL}${url}`;\n\n\t\tif (showLoading) {\n\t\t\tLoading.show();\n\t\t}\n\n\t\t// 1. ๊ธฐ๋ณธ ํค๋ ์ค์ \n\t\tconst headers = {};\n\n\t\t// ๐ด ํต์ฌ: ๋ฐ์ดํฐ๊ฐ FormData๊ฐ ์๋ ๋๋ง JSON ํค๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.\n\t\tif (!(data instanceof FormData)) {\n\t\t\theaders[\"Content-Type\"] = \"application/json\";\n\t\t}\n\n\t\tconst options = {\n\t\t\tmethod,\n\t\t\theaders\n\t\t};\n\n\t\tlet targetUrl = finalUrl;\n\t\tif (method === \"GET\") {\n\t\t\ttargetUrl += `?${new URLSearchParams(data)}`;\n\t\t} else {\n\t\t\t// ๐ด ํต์ฌ: FormData๋ ๊ทธ๋๋ก body์ ๋ฃ๊ณ , ์ผ๋ฐ ๊ฐ์ฒด๋ JSON.stringify ์ฒ๋ฆฌํฉ๋๋ค.\n\t\t\toptions.body = data instanceof FormData ? data : JSON.stringify(data);\n\t\t}\n\n\t\treturn fetch(targetUrl, options)\n\t\t\t.then(async res => {\n\t\t\t\tif (!res.ok) {\n\t\t\t\t\tconst text = await res.text();\n\t\t\t\t\tthrow new Error(`API ์ค๋ฅ (${res.status}): ${text}`);\n\t\t\t\t}\n\t\t\t\treturn res.json();\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\ttrace.error(`[IdeFetch.${method.toLowerCase()}] ${finalUrl} ์คํจ:`, err);\n\t\t\t\tthrow err;\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tif (showLoading) {\n\t\t\t\t\tLoading.hide();\n\t\t\t\t}\n\t\t\t});\n\t};\n\n\t// ๊ธฐ์กด post/get ๋ฉ์๋๋ ์ธ์๋ฅผ ๋๊ฒจ์ฃผ๋๋ก ์์ \n\tstatic get = (url, data = {}, showLoading = true) => this.#request(\"GET\", url, data, showLoading);\n\tstatic post = (url, data = {}, showLoading = true) => this.#request(\"POST\", url, data, showLoading);\n\n\t/**\n\t * ๐ ๋ฒ์ฉ ์ฒญํฌ ์ ์ก (ํ๋ผ๋ฏธํฐ ์ด๋ฆ๊น์ง ๋์ ์ค์ )\n\t * @param {string} url - API ์ฃผ์\n\t * @param {Array} rows - ๋ฐ์ดํฐ ๋ฐฐ์ด\n\t * @param {object} options - ์์ธ ์ต์
\n\t * - fileKey: ๊ฐ์ฒด ๋ด ํ์ผ ์์ฑ๋ช
(๊ธฐ๋ณธ: 'fileContents')\n\t * - filePartName: ์๋ฒ์์ ๋ฐ์ ํ์ผ ํํธ๋ช
(๊ธฐ๋ณธ: 'files')\n\t * - jsonPartName: ์๋ฒ์์ ๋ฐ์ JSON ํํธ๋ช
(๊ธฐ๋ณธ: 'dataList')\n\t * - chunkSize: ๋ถํ ๋จ์ (๊ธฐ๋ณธ: 10)\n\t */\n\tstatic postMultipart = async (url, rows = [], options = {}) => {\n\t\tconst {\n\t\t\tfileKey = 'fileContents',\n\t\t\tfilePartName = 'files',\n\t\t\tjsonPartName = 'dataList',\n\t\t\tchunkSize = 10\n\t\t} = options;\n\n\t\tconst dataRows = Array.isArray(rows) ? rows : [rows];\n\n\t\tLoading.show();\n\t\tlet totalCount = 0;\n\t\tlet lastResponse = null;\n\n\t\treturn (async () => {\n\n\t\t\tlet globalFileIndex = 0;\n\n\t\t\tfor (let i = 0; i < dataRows.length; i += chunkSize) {\n\t\t\t\tconst formData = new FormData();\n\t\t\t\tconst chunk = dataRows.slice(i, i + chunkSize);\n\t\t\t\tconst rowDataList = [];\n\n\t\t\t\tchunk.forEach((row, rowIndex) => {\n\t\t\t\t\t// row์์ ํ์ผ ๋ฐ์ดํฐ์ ๋๋จธ์ง ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌ\n\t\t\t\t\tconst { [fileKey]: fileData, ...rest } = row;\n\t\t\t\t\t//rowDataList.push(rest);\n\n\t\t\t\t\t// 2๋ฒ ๋ฐฉ์์ ํต์ฌ: ๋ฐฐ์ด์ด๋ ์๋๋ ๋ช
ํํ ์์๋ฅผ ์งํด\n\t\t\t\t\tconst files = Array.isArray(fileData) ? fileData : [fileData];\n\n\t\t\t\t\tconst fileIndices = [];\n\t\t\t\t\tfiles.forEach(fileObj => {\n\t\t\t\t\t\tif (fileObj instanceof File) {\n\t\t\t\t\t\t\tformData.append(filePartName, fileObj);\n\t\t\t\t\t\t\tfileIndices.push(globalFileIndex++);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\trowDataList.push({ ...rest, fileIndices });\n\t\t\t\t});\n\n\t\t\t\t// JSON ๋ฐ์ดํฐ๋ฅผ FormData์ ์ถ๊ฐ\n\t\t\t\t//const jsonBlob = new Blob([JSON.stringify(rowDataList)], { type: 'application/json' });\n\t\t\t\tconst jsonBlob = new Blob(\n\t\t\t\t\t[JSON.stringify(Array.isArray(rows) ? rowDataList : rowDataList[0])],\n\t\t\t\t\t{ type: 'application/json' }\n\t\t\t\t);\n\t\t\t\tformData.append(jsonPartName, jsonBlob);\n\n\t\t\t\tlastResponse = await this.post(url, formData, false);\n\n\t\t\t\tif (lastResponse && (lastResponse.success || lastResponse.status === 'OK')) {\n\t\t\t\t\ttotalCount += chunk.length;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(`์ฒญํฌ ์ ์ก ์คํจ: ${i}๋ฒ์งธ ์น์
`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { ...lastResponse, success: true, totalCount };\n\t\t})()\n\t\t\t.finally(() => Loading.hide());\n\t};\n\n\tstatic postOneMultipart = async (url, row = {}, options = {}) => {\n\t\tconst {\n\t\t\tfileKey = 'fileContents', // row ๋ด ํ์ผ ๊ฐ์ฒด๊ฐ ๋ด๊ธด ํค\n\t\t\tjsonPartName = 'dataList' // ์๋ฒ์์ JSON ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ํค\n\t\t} = options;\n\n\t\tLoading.show();\n\n\t\ttry {\n\t\t\tconst formData = new FormData();\n\n\t\t\t// 1. row์์ ํ์ผ ๋ฐ์ดํฐ์ ๋๋จธ์ง ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌ\n\t\t\tconst { [fileKey]: fileData, ...rest } = row;\n\n\t\t\t// 2. ํ์ผ ๋ฐ์ดํฐ๋ฅผ FormData์ ๊ฐ๋ณ ํค๋ก ์ถ๊ฐ\n\t\t\t// ์: fileData๊ฐ { template: file1, thumbnail: file2 }๋ผ๋ฉด\n\t\t\t// formData์ ๊ฐ๊ฐ \"template\", \"thumbnail\" ํค๋ก append ๋ฉ๋๋ค.\n\t\t\tif (fileData && typeof fileData === 'object') {\n\t\t\t\tObject.entries(fileData).forEach(([key, fileObj]) => {\n\t\t\t\t\tif (fileObj instanceof File) {\n\t\t\t\t\t\tformData.append(key, fileObj);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// 3. ๋๋จธ์ง ๋ฐ์ดํฐ๋ฅผ JSON์ผ๋ก ๋ณํํ์ฌ ์ถ๊ฐ\n\t\t\tconst jsonBlob = new Blob([JSON.stringify(rest)], { type: 'application/json' });\n\t\t\tformData.append(jsonPartName, jsonBlob);\n\n\t\t\t// 4. ์ ์ก\n\t\t\tconst response = await this.post(url, formData, false);\n\n\t\t\tif (response && (response.success || response.status === 'OK')) {\n\t\t\t\treturn { ...response, success: true };\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"์ ์ก ์คํจ\");\n\t\t\t}\n\t\t} catch (err) {\n\t\t\ttrace.error(\"[postOneMultipart] Error:\", err);\n\t\t\tthrow err;\n\t\t} finally {\n\t\t\tLoading.hide();\n\t\t}\n\t};\n\n\tstatic postMultipart_BAK = async (url, rows = [], options = {}) => {\n\t\tconst {\n\t\t\tfileKey = 'fileContents',\n\t\t\tfilePartName = 'files',\n\t\t\tjsonPartName = 'dataList',\n\t\t\tchunkSize = 10\n\t\t} = options;\n\n\t\t// 1. ์์ ์ ๋ก๋ฉ๋ฐ ๋์ฐ๊ธฐ\n\t\tLoading.show();\n\n\t\tlet totalCount = 0;\n\t\tlet lastResponse = null;\n\n\t\t// ๐ด 2. ์ ์ฒด ๋ฃจํ๋ฅผ Promise ์ฒด์ธ์ฒ๋ผ ๊ด๋ฆฌ (๋ด๋ถ๋ await ์ ์ง)\n\t\treturn (async () => {\n\t\t\tfor (let i = 0; i < rows.length; i += chunkSize) {\n\t\t\t\tconst formData = new FormData();\n\t\t\t\tconst chunk = rows.slice(i, i + chunkSize);\n\t\t\t\tconst rowDataList = [];\n\n\t\t\t\tchunk.forEach((row) => {\n\t\t\t\t\tconst { [fileKey]: fileObj, _fileObj, ...rest } = row;\n\t\t\t\t\trowDataList.push(rest);\n\t\t\t\t\tif (fileObj instanceof File) {\n\t\t\t\t\t\tformData.append(filePartName, fileObj);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tconst jsonBlob = new Blob([JSON.stringify(rowDataList)], { type: 'application/json' });\n\t\t\t\tformData.append(jsonPartName, jsonBlob);\n\n\t\t\t\t// showLoading = false๋ก ๋ด๋ถ ํธ์ถ\n\t\t\t\tlastResponse = await this.post(url, formData, false);\n\n\t\t\t\tif (lastResponse && (lastResponse.success || lastResponse.status === 'OK')) {\n\t\t\t\t\ttotalCount += chunk.length;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(`์ฒญํฌ ์ ์ก ์คํจ: ${i}๋ฒ์งธ ์น์
`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { ...lastResponse, success: true, totalCount };\n\t\t})()\n\t\t\t.catch(err => {\n\t\t\t\ttrace.error(\"[postChunk] Error:\", err);\n\t\t\t\tthrow err;\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\t// ๐ด 3. ์ฑ๊ณตํ๋ ์คํจํ๋ ์ฌ๊ธฐ์ ๊น๋ํ๊ฒ ๋ซ๊ธฐ!\n\t\t\t\tLoading.hide();\n\t\t\t});\n\t};\n}\n\nexport const api = Fetch;","// nxDialog.styles.js\nexport const dialogStyles = `\n\tdialog::backdrop {\n\t\tbackground: rgba(0, 0, 0, 0.3);\n\t}\n\t\n\tdialog:modal {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tpadding: 0;\n\t\toverflow: hidden;\n\t\tborder: 1px solid darkgreen;\n\t\toutline: none;\n\t\tresize: both;\n\t\tbox-shadow: 0 0 4px 0 darkgreen;\n width: 500px;\n height: fit-content;\n min-width: 330px;\n min-height: 60px;\n max-height: 100%;\n }\n \n \n \n \n\tdiv.head .rect1, div.head .rect2, div.head .rect3 {\n\t\tdisplay: none;\n\t\twidth: 50px;\n\t\theight: 100%;\n\t}\n\tdiv.head .rect1 {\n\t\tbackground-color: red;\n\t}\n\tdiv.head .rect2 {\n\t\tbackground-color: darkgreen;\n\t}\n\tdiv.head .rect3 {\n\t\tbackground-color: olive;\n\t}\n\t\n\tdiv.head {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\t--height: 30px;\n\t\tbackground-color: darkgreen;\n\t\tpadding: 4px;\n\t\tcursor: move;\n\t}\n\tdiv.head:hover {\n\t\tfilter: brightness(110%);\n\t}\n\t\n\tdiv.head span {\n\t\tfont-size: 12px;\n\t\tposition: relative;\n\t}\n\t\n\tdiv.head span.title {\n\t\tcolor: #ddd;\n\t\tmargin-left: 4px;\n\t\tfont-weight: bold;\n\t}\n\t\n\tdiv.head span.sub-title {\n\t\tcolor: #ccc;\n\t\tmargin-left: 8px;\n\t\tfont-style: italic;\n\t}\n\t\n\tdiv.head form {\n\t\tmargin: 0;\n\t}\n\tdiv.head button {\n\t\tmargin-right: 4px;\n\t\tbackground-color: transparent;\n\t\tborder: none;\n\t\tcolor: #ccc;\n\t\tfont-size: x-small;\n\t}\n\tdiv.head button:hover {\n\t\tcursor: pointer;\n\t}\n\t\n\tdiv.contents {\n\t\tdisplay: flex;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\toverflow: hidden;\n\t\tbackground-color: white;\n\t\tcolor: #333;\n\t}\n\tdiv.left {\n\t\tposition: relative;\n\t\twidth: 16px;\n\t\theight: 100%;\n\t\tbackground-color: #ddd;\n\t\tdisplay: none;\n\t}\n\t\n\tdiv.left span {\n\t\twriting-mode: vertical-rl;\n\t\t-moz-user-select: none;\n\t\t-webkit-user-select: none;\n\t\t-ms-user-select: none;\n\t\tuser-select: none;\n\t\tcolor: #ccc;\n\t\tfont-weight: 700;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmargin-left: 3px;\n\t\tmargin-top: 3px;\n\t}\n\tdiv.close2 {\n\t\tdisplay: none;\n\t\tposition: absolute;\n\t\tright: 0;\n\t\ttop: 3px;\n\t\tcursor: pointer;\n\t\tcolor: #666;\n\t}\n\tdiv.close2 svg:hover {\n\t\tcolor: #999;\n\t}\n\t\n\tdiv.body {\n\t\tdisplay: flex;\n\t\twidth: 100%;\n\t\theight: unset;\n\t\t--border: 3px solid #999;\n\t\t--border-top: none;\n\t\toverflow-x: hidden;\n\t\toverflow-y: auto;\n\t\tpadding: 10px;\n\t\tgap: 8px;\n\t\tflex-direction: column;\n\t}\n\t\n\t\n\t\n\t\n\tng-sphere.icon {\n\t\tmargin-left: 8px;\n\t}\n\t\n\t.buttons {\n\t\tdisplay: flex;\n\t\tposition: absolute;\n\t\tright: 4px;\n\t}\n\t\n\tng-sphere {\n\t\tposition: relative;\n\t\t--width: 16px;\n\t\t--height: 16px;\n\t\tcursor: pointer;\n\t\tmargin-right: 4px;\n\t\tdisplay: flex;\n\t}\n\tng-sphere:hover {\n\t\tfilter: brightness(90%);\n\t}\n\tng-sphere:active {\n\t\tfilter: brightness(80%);\n\t}\n\t\n\tng-sphere:hover::after {\n\t\tcontent: \"\";\n\t\tposition: absolute;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: center;\n\t}\n\tng-sphere.apply:hover::after {\n\t\tbackground-size: 14px 14px;\n\t\tbackground-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\"><polyline points=\"2.5,7 6,10 11,3\" style=\"fill:none;stroke:white;stroke-width:2px;\" /></svg>');\n\t}\n\t\n\tng-sphere.reset:hover::after {\n\t\tbackground-size: 12px 12px;\n\t\tbackground-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" style=\"fill:none;stroke:white;stroke-width:2px;\" focusable=\"false\" aria-hidden=\"true\"><path d=\"M10 5h5V0\"></path><path d=\"M15 8a6.957 6.957 0 0 1-7 7 6.957 6.957 0 0 1-7-7 6.957 6.957 0 0 1 7-7 6.87 6.87 0 0 1 6.3 4\"></path></svg>');\n\t}\n\t\n\tng-sphere.close:hover::after {\n\t\tbackground-size: 12px 12px;\n\t\tbackground-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" style=\"fill:none;stroke:white;stroke-width:2px;\" focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 16 16\"><path d=\"M2 2l12 12M14 2L2 14\"></path></svg>');\n\t}\n\t\n\t\n\tbutton {\n cursor: pointer;\n }\n \n .input-area {\n position: relative;\n height: 100%;\n --display: flex;\n textarea {\n width: 100%;\n height: 100%;\n min-height: 100px;\n padding: 8px;\n box-sizing: border-box;\n resize: none;\n border-radius: 2px;\n border-color: #ccc;\n }\n textarea:focus {\n border-color: green;\n outline: none; /* ๋ธ๋ผ์ฐ์ ๊ธฐ๋ณธ ํ๋์ ํ
๋๋ฆฌ ์ ๊ฑฐ */\n }\n }\n \n .buttons-confirm {\n position: absolute;\n display: flex;\n justify-content: flex-end;\n bottom: 8px;\n right: 8px;\n }\n \n \n .buttons-confirm button {\n height: 32px;\n margin-right: 8px;\n border: none;\n outline: none;\n width: 60px;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n }\n .buttons-confirm button:hover {\n filter: brightness(90%);\n }\n .buttons-confirm button:active {\n color: #ccc;\n }\n \n button.ok {\n --display: none;\n background-color: darkgreen;\n color: white;\n }\n button.cancel {\n color: white;\n background-color: #6c757d;\n }\n \n \n \n div.msg {\n position: relative;\n height: 100%;\n font-size: 14px;\n color: #333;\n padding-bottom: 48px;\n }\n \n .reset, .apply {\n display: none;\n }\n \n \n \n :host(.classic) dialog:modal {\n border: 1px solid #007bff;\n box-shadow: 0 0 4px 0 #007bff;\n }\n \n :host(.classic) div.head {\n background-color: #007bff;\n }\n :host(.classic) div.head:hover {\n filter: brightness(110%);\n }\n \n :host(.classic) div.head span {\n font-size: 12px;\n }\n \n :host(.classic) div.head span.title {\n color: #ddd;\n margin-left: 4px;\n font-weight: bold;\n }\n \n :host(.classic) div.head span.sub-title {\n color: #ccc;\n margin-left: 8px;\n font-style: italic;\n }\n :host(.classic) div.head button {\n margin-right: 4px;\n background-color: transparent;\n border: none;\n color: #ccc;\n font-size: x-small;\n }\n \n \n \n \n :host(.rgb) dialog:modal {\n border: none;\n box-shadow: unset;\n border-top: none;\n }\n \n :host(.rgb) div.left {\n display: block;\n background-color: #ddd;\n }\n :host(.rgb) div.left span {\n color: #ccc;\n }\n :host(.rgb) div.close2 {\n display: block;\n color: #666;\n }\n :host(.rgb) div.close2 svg:hover {\n color: #999;\n }\n :host(.rgb) div.head {\n height: 4px;\n background-color: #999;\n padding: 0;\n }\n :host(.rgb) div.contents {\n height: calc(100% - 4px);\n }\n \n :host(.rgb) div.head ng-sphere,\n :host(.rgb) div.head span,\n :host(.rgb) div.head .buttons {\n display: none;\n }\n \n :host(.rgb) div.head .rect1,\n :host(.rgb) div.head .rect2,\n :host(.rgb) div.head .rect3 {\n display: flex;\n }\n \n \n :host(.rgb) div.head:hover {\n filter: unset;\n }\n \n \n /* --- Animation Core --- */\n:host {\n --nx-duration: 0.4s;\n --nx-timing: cubic-bezier(0.34, 1.56, 0.64, 1);\n}\n\n/* ๐ฏ ์์ : ์ ๋๋ฉ์ด์
ํด๋์ค๊ฐ ๋ถ์ ๊ฒฝ์ฐ์๋ง ์ด๊ธฐ opacity๋ฅผ 0์ผ๋ก ์ค์ */\n:host(.fade) dialog,\n:host(.zoom) dialog,\n:host(.moveUp) dialog,\n:host(.moveDown) dialog,\n:host(.moveLeft) dialog,\n:host(.moveRight) dialog,\n:host(.roadRunner) dialog {\n opacity: 0;\n}\n\n/* shake๋ ์ ๋๋ฉ์ด์
๋ด๋ถ์์ opacity๋ฅผ ๋ค๋ฃจ๋ฏ๋ก ์ ์ธํ๊ฑฐ๋ ๋ณ๋ ์ฒ๋ฆฌ */\n:host(.shake) dialog { \n opacity: 1; \n}\n\n/* 1. Fade (์์ํ ๋ํ๋จ) */\n:host(.fade) dialog { animation: nx-fade-in var(--nx-duration) forwards; }\n@keyframes nx-fade-in { from { opacity: 0; } to { opacity: 1; } }\n\n/* 2. Zoom (์ปค์ง๋ฉฐ ๋ํ๋จ) */\n:host(.zoom) dialog { animation: nx-zoom-in var(--nx-duration) var(--nx-timing) forwards; }\n@keyframes nx-zoom-in { from { opacity: 0; transform: scale(0.5); } to { opacity: 1; transform: scale(1); } }\n\n/* 3. Slide (์ํ์ข์ฐ) */\n:host(.moveUp) dialog { animation: nx-move-up var(--nx-duration) var(--nx-timing) forwards; }\n:host(.moveDown) dialog { animation: nx-move-down var(--nx-duration) var(--nx-timing) forwards; }\n:host(.moveLeft) dialog { animation: nx-move-left var(--nx-duration) var(--nx-timing) forwards; }\n:host(.moveRight) dialog { animation: nx-move-right var(--nx-duration) var(--nx-timing) forwards; }\n\n@keyframes nx-move-up { from { opacity: 0; transform: translateY(100px); } to { opacity: 1; transform: translateY(0); } }\n@keyframes nx-move-down { from { opacity: 0; transform: translateY(-100px); } to { opacity: 1; transform: translateY(0); } }\n@keyframes nx-move-left { from { opacity: 0; transform: translateX(100px); } to { opacity: 1; transform: translateX(0); } }\n@keyframes nx-move-right { from { opacity: 0; transform: translateX(-100px); } to { opacity: 1; transform: translateY(0); } }\n\n/* 4. Shake (์ํ์ข์ฐ ๊ฒฉ๋ ฌํ ์ง๋ - ์๋ฌ ์ธ์ง์ฉ) */\n:host(.shake) dialog { \n animation: nx-heavy-shake 0.5s cubic-bezier(.36,.07,.19,.97) both;\n opacity: 1; \n}\n\n@keyframes nx-heavy-shake {\n 10%, 90% { transform: translate3d(-1px, -2px, 0); }\n 20%, 80% { transform: translate3d(2px, 4px, 0); }\n 30%, 50%, 70% { transform: translate3d(-6px, -6px, 0); }\n 40%, 60% { transform: translate3d(6px, 6px, 0); }\n}\n\n/* 5. Road Runner (๋ฑ์ฅ: ์ผ์ชฝ์์ ํ๋ ฅ ์๊ฒ / ํด์ฅ: ์์ธ ๋ ธ๋ค๊ฐ ๊ด์ ํ์ถ) */\n:host(.roadRunner) dialog { \n animation: roadRunnerIn 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards; \n}\n\n@keyframes roadRunnerIn {\n 0% { transform: translateX(-1500px) skewX(30deg); opacity: 1; }\n 70% { transform: translateX(30px) skewX(-10deg); opacity: 1; }\n 100% { transform: translateX(0) skewX(0deg); opacity: 1; }\n}\n\n/* --- Out Animations (๋ซํ ๋) --- */\ndialog.out { pointer-events: none; }\n\n/* Road Runner ํด์ฅ: ์ฅ ์์ธ ๋ ธ๋ค๊ฐ(Anticipation) ์ฉ~! */\n:host(.roadRunner) dialog.out { \n animation: roadRunnerOut 0.5s cubic-bezier(0.6, -0.28, 0.735, 0.045) forwards; \n}\n\n@keyframes roadRunnerOut {\n 0% { \n transform: translateX(0) scale(1) skewX(0deg); \n opacity: 1; \n }\n 30% { \n /* ์๋น ๋์: ๋ค๋ก ์ด์ง ๊ฐ๋ค๊ฐ ์์ธ ๋ฌ๋ค๊ธฐ */\n transform: translateX(50px) scaleX(1.2) scaleY(0.8) skewX(-20deg); \n opacity: 1; \n }\n 100% { \n /* ๋ฐ์ฌ: ๊ธธ๊ฒ ๋์ด๋๋ฉฐ ๊ด์ ํ์ถ */\n transform: translateX(2000px) scaleX(4) scaleY(0.3) skewX(50deg); \n opacity: 0; \n filter: blur(10px); /* ๐ ์์ ๋๋ ์ถ๊ฐ */\n }\n}\n\n/* ์ผ๋ฐ ํด์ฅ (๊ธฐ๋ณธ) */\ndialog.out { animation: nx-fade-out 0.3s forwards; }\n@keyframes nx-fade-out { from { opacity: 1; transform: scale(1); } to { opacity: 0; transform: scale(0.9); } }\n`;","import { dialogStyles } from './style.dialog.js';\nimport { trace } from '@nopeer';\n\nexport class nineDialog extends HTMLElement\n{\n\t#shift;\n\t#dialog;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tconst v = this.innerHTML;\n\t\tconst titleText = this.getAttribute(\"subject\") || \"Details\";\n\n\t\ttrace.log(dialogStyles);\n\n\t\tthis.innerHTML = `\n\t\t\t<style>${dialogStyles}</style>\n\t\t\n\t\t\t<dialog>\n\t\t\t\t<div class=\"head\">\n\t\t\t\t\t<div class=\"rect1\"></div>\n\t\t\t\t\t<div class=\"rect2\"></div>\n\t\t\t\t\t<div class=\"rect3\"></div>\n\t\t\t\t\t<ng-sphere class=\"icon\" end-fill=\"#666\" size=\"8\"></ng-sphere>\n\t\t\t\t\t<span class=\"title\">${titleText}</span>\n\t\t\t\t\t<span class=\"sub-title\"></span>\n\t\t\t\t\t<div class=\"buttons\">\n\t\t\t\t\t\t<ng-sphere class=\"apply\" start-fill=\"#cc6\" end-fill=\"#660\" size=\"16\" title=\"apply\"></ng-sphere>\n\t\t\t\t\t\t<ng-sphere class=\"reset\" start-fill=\"#99f\" end-fill=\"#00f\" size=\"16\" title=\"reset\"></ng-sphere>\n\t\t\t\t\t\t<ng-sphere class=\"close\" start-fill=\"#f99\" end-fill=\"#f00\" size=\"16\" title=\"close\"></ng-sphere>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"contents\">\n\t\t\t\t\t<div class=\"left\">\n\t\t\t\t\t\t<span>๊ฐ๋๋ค๋ผ๋ง๋ฐ์ฌ์์์ฐจ์นดํํํ๊ฐ๋๋ค๋ผ๋ง๋ฐ์ฌ์์์ฐจ์นดํํํ๊ฐ๋๋ค๋ผ๋ง๋ฐ์ฌ์์์ฐจ์นดํํํ๊ฐ๋๋ค๋ผ๋ง๋ฐ์ฌ์์์ฐจ์นดํํํ๊ฐ๋๋ค๋ผ๋ง๋ฐ์ฌ์์์ฐจ์นดํํํ๊ฐ๋๋ค๋ผ๋ง๋ฐ์ฌ์์์ฐจ์นดํํํ๊ฐ๋๋ค๋ผ๋ง๋ฐ์ฌ์์์ฐจ์นดํํํ๊ฐ๋๋ค๋ผ๋ง๋ฐ์ฌ์์์ฐจ์นดํํํ</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"body\">\n\t\t\t\t\t\t${v}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"close2\">\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n\t\t\t\t\t\t\t<path d=\"M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</dialog>\n\t\t`;\n\n\t\t//this.#owner = this.getRootNode().host.closest(\"nine-grid\");\n\n\t\t//$(\".title\", this).html(\"Details\");\n\n\t\tthis.#dialog = this.querySelector('dialog');\n\t\tthis.#init();\n\t};\n\n\tshowModal = () => {\n\t\tthis.#dialog.showModal();\n\n\t\t(this.shadowRoot?.activeElement || document.activeElement)?.blur();\n\t};\n\n\tclose = () => {\n\t\t// ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ ๊ฑฐ (ํ์ค ๋ฐฉ์์ ํธ๋ค๋ฌ ์ฐธ์กฐ๊ฐ ํ์ํ์ง๋ง,\n\t\t// ์ฌ๊ธฐ์๋ ์์๊ฐ ์ฌ๋ผ์ง๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํด ์ ๋ฆฌ)\n\t\tthis.#dialog.close();\n\t\tthis.remove();\n\t};\n\n\t#init = () => {\n\t\tconst head = this.querySelector('.head');\n\n\t\tif (head) {\n\t\t\thead.addEventListener('mousedown', this.#onMouseDown);\n\t\t\thead.addEventListener('touchstart', this.#onTouchStart);\n\n\t\t\t// ๋ง์ฐ์ค ์ปค์๋ฅผ ๋๋๊ทธ ๊ฐ๋ฅ ์์ด์ฝ(์ด๋ ์ญ์๊ฐ) ๋ชจ์์ผ๋ก ๋ณ๊ฒฝํ์ฌ UX ๊ฐ์ \n\t\t\t//head.style.cursor = 'move';\n\t\t}\n\n\t\t// 1. ๋ชจ๋ ๋ซ๊ธฐ ์ฑ๊ฒฉ์ ๋ฒํผ (.close, .close2, .cancel) ๊ณตํต ์ฒ๋ฆฌ\n\t\tthis.querySelectorAll('.close, .close2, .cancel').forEach(btn => {\n\t\t\tbtn.onclick = () => this.closeWithAnimation(null); // ์ทจ์/๋ซ๊ธฐ๋ null ๋ฆฌํด\n\t\t});\n\n\t\t// 2. ํ์ธ ๋ฒํผ (.ok) ์ฒ๋ฆฌ\n\t\t// ํ์ธ ๋ฒํผ์ ํ
์คํธ ์
๋ ฅ๊ฐ ๋ฑ ๋ฐ์ดํฐ๊ฐ ํ์ํ๋ฏ๋ก\n\t\t// ์ค์ ๋ฐ์ดํฐ ์ถ์ถ์ ๊ฐ ํ์
ํด๋์ค(prompt ๋ฑ)์์ ํ๋,\n\t\t// ๋ซ๊ธฐ ์ ๋๋ฉ์ด์
์คํ์ ์ฌ๊ธฐ์ ๋ด๋นํ๋๋ก ๊ฐ์ด๋ํฉ๋๋ค.\n\t\tthis.querySelectorAll('.ok').forEach(btn => {\n\t\t\t// .ok ๋ฒํผ์ ๋ก์ง์ ๊ฐ ํ์
์ setupEvents์์ ๋ฎ์ด์ฐ๊ฑฐ๋\n\t\t\t// ๋ธ๋ฆฌ๊ฒ์ดํธ ์ด๋ฒคํธ๋ฅผ ํตํด ์ฒ๋ฆฌํฉ๋๋ค.\n\t\t});\n\n\t\t// ๋๋๊ทธ ๋ก์ง ์๋ต...\n\t};\n\n\t// --- ๋๋๊ทธ ๋ก์ง (Vanilla JS) ---\n\t#onMouseDown = e => {\n\n\t\tif (e.target.closest(\"buttons\")) return;\n\t\tif (e.button !== 0 || e.altKey || e.ctrlKey || e.shiftKey) return;\n\n\t\tconst rect = this.#dialog.getBoundingClientRect();\n\t\tthis.#shift = {\n\t\t\tx: e.clientX - rect.left,\n\t\t\ty: e.clientY - rect.top\n\t\t};\n\n\t\tconst onMouseMove = (ev) => {\n\t\t\tthis.#dialog.style.position = 'fixed';\n\t\t\tthis.#dialog.style.margin = '0';\n\t\t\tthis.#dialog.style.left = `${ev.clientX - this.#shift.x}px`;\n\t\t\tthis.#dialog.style.top = `${ev.clientY - this.#shift.y}px`;\n\t\t};\n\n\t\tconst onMouseUp = () => {\n\t\t\tdocument.removeEventListener('mousemove', onMouseMove);\n\t\t\tdocument.removeEventListener('mouseup', onMouseUp);\n\t\t};\n\n\t\tdocument.addEventListener('mousemove', onMouseMove);\n\t\tdocument.addEventListener('mouseup', onMouseUp);\n\t};\n\n\t#onTouchStart = e => {\n\t\tif (e.target.closest(\"buttons\")) return;\n\n\t\tconst rect = this.#dialog.getBoundingClientRect();\n\t\tconst touch = e.changedTouches[0];\n\t\tthis.#shift = {\n\t\t\tx: touch.pageX - rect.left,\n\t\t\ty: touch.pageY - rect.top\n\t\t};\n\n\t\tconst onTouchMove = (ev) => {\n\t\t\tconst t = ev.changedTouches[0];\n\t\t\tthis.#dialog.style.position = 'fixed';\n\t\t\tthis.#dialog.style.margin = '0';\n\t\t\tthis.#dialog.style.left = `${t.pageX - this.#shift.x}px`;\n\t\t\tthis.#dialog.style.top = `${t.pageY - this.#shift.y}px`;\n\t\t};\n\n\t\tconst onTouchEnd = () => {\n\t\t\tdocument.removeEventListener('touchmove', onTouchMove);\n\t\t\tdocument.removeEventListener('touchend', onTouchEnd);\n\t\t};\n\n\t\tdocument.addEventListener('touchmove', onTouchMove);\n\t\tdocument.addEventListener('touchend', onTouchEnd);\n\t};\n\n\tcloseWithAnimation(returnValue) {\n\t\tthis.#dialog.classList.add(\"out\"); // ํด์ฅ ์ ๋๋ฉ์ด์
์์\n\n\t\t// ์ ๋๋ฉ์ด์
(0.3s)์ด ๋๋ ํ ์ ๊ฑฐ ๋ฐ ์ด๋ฒคํธ ๋ฐ์\n\t\tsetTimeout(() => {\n\t\t\tthis.#dialog.close();\n\t\t\t// ๋ถ๋ชจ(BasePopup)์๊ฒ ์์
์๋ฃ์ ๊ฒฐ๊ณผ๊ฐ์ ์๋ฆผ\n\t\t\tthis.dispatchEvent(new CustomEvent('closed', { detail: returnValue }));\n\t\t\tthis.remove();\n\t\t}, 300);\n\t}\n}\n\n// BasePopup.js\nexport class BasePopup extends HTMLElement {\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.attachShadow({ mode: 'open' });\n\t}\n\n\tstatic async open(PopupClass, message, title, options, renderFn) {\n\t\t// 1. ์ค์ ๋ณํฉ\n\t\tconst tagName = PopupClass.tagName.toLowerCase();\n\t\tconst config = {\n\t\t\t\"true-text\": \"ํ์ธ\",\n\t\t\t\"false-text\": \"์ทจ์\",\n\t\t\tclass: \"classic\",\n\t\t\tanimation: \"fade\",\n\t\t\t...(window.nine?.config?.ux?.[tagName.replace('nine-', '').replace('-popup', '')] || {}),\n\t\t\t...options\n\t\t};\n\n\t\t// 2. ์ค๋ณต ์ ๊ฑฐ ๋ฐ ์๋ฆฌ๋จผํธ ์์ฑ\n\t\tdocument.querySelectorAll(tagName).forEach(el => el.remove());\n\t\tconst el = document.createElement(tagName);\n\t\tif (config.class) el.classList.add(config.class);\n\t\tif (config.animation) el.classList.add(config.animation);\n\t\tdocument.body.appendChild(el);\n\n\t\t// 3. ๋ ๋๋ง (๊ฐ ํ์
์ UI ๊ทธ๋ฆฌ๊ธฐ)\n\t\trenderFn(el, message, config);\n\n\t\tconst dialogComp = el.shadowRoot.querySelector(\"nine-dialog\");\n\t\tif (title) dialogComp.setAttribute(\"subject\", title);\n\n\t\treturn new Promise((resolve) => {\n\t\t\t// [์ค์] nine-dialog์ ์ ๋๋ฉ์ด์
์ด ๋๋ ํ ๋์ง๋ ์ด๋ฒคํธ๋ฅผ ์์ \n\t\t\tdialogComp.addEventListener('closed', (e) => resolve(e.detail));\n\n\t\t\t// ๊ฐ ํ์
ํด๋์ค์์ ๋ฒํผ ํด๋ฆญ ์ dialogComp.closeWithAnimation(๊ฐ)์\n\t\t\t// ํธ์ถํ๋๋ก ์ด๋ฒคํธ๋ฅผ ๋ฐ์ธ๋ฉํด์ค\n\t\t\tel.setupEvents(resolve, dialogComp);\n\n\t\t\tdialogComp.showModal();\n\t\t});\n\t}\n}\n\nif (!customElements.get('nine-dialog')) {\n\tcustomElements.define(\"nine-dialog\", nineDialog);\n}\n","import { BasePopup } from \"./nineDialog.js\";\n\nexport class nineConfirmPopup extends BasePopup {\n\tstatic tagName = 'nine-confirm-popup';\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\n\trender(message, config) {\n\t\tthis.shadowRoot.innerHTML = `\n <nine-dialog>\n <div class=\"msg\">${message.replace(/\\n/g, \"<br/>\")}</div>\n <div class=\"buttons-confirm\">\n <button class=\"cancel\">${config[\"false-text\"]}</button>\n <button class=\"ok\">${config[\"true-text\"]}</button>\n </div>\n </nine-dialog>`;\n\t}\n\n\tsetupEvents(resolve, dialogComp) {\n\t\tthis.shadowRoot.querySelector(\".ok\").onclick = () => dialogComp.closeWithAnimation(true);\n\t\t// ์ทจ์๋ nine-dialog ๋ด๋ถ ๊ธฐ๋ณธ ๋ก์ง(closeWithAnimation(null))์ด ์ฒ๋ฆฌํจ\n\t}\n\n\tstatic confirm = (m, t, o) => BasePopup.open(nineConfirmPopup, m, t, o, (el, msg, conf) => el.render(msg, conf));\n}\n\n// --- 3. ALERT (๋จ์ ์๋ฆผ) ---\nexport class nineAlertPopup extends BasePopup {\n\tstatic tagName = 'nine-alert-popup';\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\trender(message, config) {\n\t\tthis.shadowRoot.innerHTML = `\n <nine-dialog>\n <div class=\"msg\">${message.replace(/\\n/g, \"<br/>\")}</div>\n <div class=\"buttons-confirm\">\n <button class=\"cancel\">ํ์ธ</button>\n </div>\n </nine-dialog>`;\n\t}\n\n\tsetupEvents(resolve, dialogComp) {\n\t\t// ์ผ๋ฟ์ ์ทจ์ ๋ฒํผ ํ๋๋ง ๋๊ฑฐ๋, ํ์ธ ๋ฒํผ์ด cancel ์ญํ ์ ์ํํ๊ฒ ํจ\n\t}\n\n\tstatic alert = (m, t, o) => BasePopup.open(nineAlertPopup, m, t, o, (el, msg, conf) => el.render(msg, conf));\n}\n\n// Custom Element ๋ฑ๋ก\nif (!customElements.get('nine-confirm-popup')) customElements.define('nine-confirm-popup', nineConfirmPopup);\nif (!customElements.get('nine-alert-popup')) customElements.define(\"nine-alert-popup\", nineAlertPopup);","import { BasePopup } from \"./nineDialog.js\";\n\n/**\n *\n */\nexport class ninePromptPopup extends BasePopup {\n\tstatic tagName = 'nine-prompt-popup';\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\trender(message, config) {\n\n\t\ttrace.log(this);\n\t\ttrace.log(this.shadowRoot);\n\n\t\tthis.shadowRoot.innerHTML = `\n\t\t\t<style>\n\t\t\t\tdialog {\n\t\t\t\t\theight: 300px !important;\n\t\t\t\t}\n\t\t\t\t.msg {\n\t\t\t\t\theight: unset !important;\n\t\t\t\t}\n\t\t\t</style>\n\t\t\t\n <nine-dialog>\n <div class=\"msg\">${message.replace(/\\n/g, \"<br/>\")}</div>\n <div class=\"input-area\">\n <textarea placeholder=\"๋ด์ฉ์ ์
๋ ฅํ์ธ์...\"></textarea>\n </div>\n <div class=\"buttons-confirm\">\n <button class=\"cancel\">${config[\"false-text\"]}</button>\n <button class=\"ok\">${config[\"true-text\"]}</button>\n </div>\n </nine-dialog>`;\n\t}\n\n\tsetupEvents(resolve, dialogComp) {\n\t\tconst textarea = this.shadowRoot.querySelector(\"textarea\");\n\t\tconst okBtn = this.shadowRoot.querySelector(\".ok\");\n\n\t\t// ํ์ธ ๋ฒํผ ํด๋ฆญ ์ textarea ๊ฐ์ ๊ฐ์ง๊ณ ์ ๋๋ฉ์ด์
๋ซ๊ธฐ\n\t\tokBtn.onclick = () => dialogComp.closeWithAnimation(textarea.value);\n\n\t\t// ๋ ๋๋ง ํ ํฌ์ปค์ค\n\t\trequestAnimationFrame(() => textarea.focus());\n\t}\n\n\tstatic prompt = (m, t, o) => BasePopup.open(ninePromptPopup, m, t, o, (el, msg, conf) => el.render(msg, conf));\n}\n\nif (!customElements.get('nine-prompt-popup')) {\n\tcustomElements.define('nine-prompt-popup', ninePromptPopup);\n}","// src/core/NineUxUtil.js\r\nimport { nineAlertPopup, nineConfirmPopup } from './nineConfirm.js';\r\nimport { ninePromptPopup } from \"./ninePrompt.js\";\r\nimport { nine } from '../../core/Config.js'; // ๐ 1. Config์์ nine ๊ฐ์ฒด ์ํฌํธ\r\n\r\nexport class NineUxUtil {\r\n\t// static ํ๋๋ ํด๋์ค ์์ฒด์ ์ ์ฅ๋จ\r\n\tstatic cssPath = \"\";\r\n\r\n\t/**\r\n\t * ํ์
์ค๋น ๋ก์ง (Private ๋ฉ์๋)\r\n\t */\r\n\t#prepare(type, message, title, defaultClass) {\r\n\r\n\t\tconst options = { class: defaultClass, animation: 'fade' };\r\n\t\t//const popup = type === 'alert' ? nineAlertPopup : (type === 'confirm' ? nineConfirmPopup : ninePromptPopup);\r\n\t\tlet isExecuted = false;\r\n\r\n\t\tconst popupMap = {\r\n\t\t\talert: nineAlertPopup,\r\n\t\t\tconfirm: nineConfirmPopup,\r\n\t\t\tprompt: ninePromptPopup\r\n\t\t};\r\n\r\n\t\tconst popup = popupMap[type];\r\n\r\n\t\tconst runner = {\r\n\t\t\trgb: () => { options.class = 'rgb'; return runner; },\r\n\t\t\tclassic: () => { options.class = 'classic'; return runner; },\r\n\t\t\tshake: () => { options.animation = 'shake'; return runner; },\r\n\t\t\trun: () => { options.animation = 'roadRunner'; return runner; },\r\n\t\t\tzoom: () => { options.animation = 'zoom'; return runner; },\r\n\r\n\t\t\tthen: (resolve, reject) => {\r\n\t\t\t\tisExecuted = true;\r\n\t\t\t\treturn popup[type](message, title, options).then(resolve, reject);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// Microtask: ๋๊ธฐ ์ฒด์ด๋์ด ๋ชจ๋ ๋๋ ํ ์คํ\r\n\t\tPromise.resolve().then(() => {\r\n\t\t\tif (!isExecuted) {\r\n\t\t\t\tisExecuted = true;\r\n\t\t\t\tpopup[type](message, title, options);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn runner;\r\n\t}\r\n\r\n\talert = (message, title = \"Alert\") => {\r\n\t\treturn this.#prepare('alert', message, title, 'classic');\r\n\t}\r\n\r\n\tconfirm = (message, title = \"Confirm\") => {\r\n\t\treturn this.#prepare('confirm', message, title, 'classic');\r\n\t}\r\n\r\n\tprompt = (message, title = \"Prompt\") => {\r\n\t\treturn this.#prepare('prompt', message, title, 'classic');\r\n\t}\r\n}\r\n\r\nObject.assign(nine, new NineUxUtil());","import { trace } from \"@nopeer\";\r\nimport { NineUxUtil } from \"./dialog/NineUxUtil.js\";\r\n\r\nclass UxSplitter extends HTMLElement {\r\n\r\n\t#mode;\r\n\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.attachShadow({ mode: \"open\" });\r\n\t}\r\n\r\n\tconnectedCallback() {\r\n\r\n\t\tthis.#init();\r\n\t}\r\n\r\n\t#detectMode = (el) => {\r\n\t\tconst prev = el.previousElementSibling;\r\n\t\tconst next = el.nextElementSibling;\r\n\t\tif (!prev || !next) {\r\n\t\t\tthis.#mode = this.classList.contains('h') ? \"h\" : \"v\";\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst prevRect = prev.getBoundingClientRect();\r\n\t\tconst nextRect = next.getBoundingClientRect();\r\n\r\n\t\tif (this.classList.contains('h')) {\r\n\t\t\tthis.#mode = \"h\";\r\n\t\t} else if (this.classList.contains('v')) {\r\n\t\t\tthis.#mode = \"v\";\r\n\t\t} else {\r\n\t\t\tthis.#mode = (Math.abs(prevRect.top - nextRect.top) < 5) ? \"h\" : \"v\";\r\n\t\t}\r\n\t};\r\n\r\n\t#startDrag = (e) => {\r\n\r\n\t\te.preventDefault();\r\n\t\te.stopPropagation();\r\n\r\n\t\tconst splitterRect = this.getBoundingClientRect();\r\n\t\tconst isHorizontal = this.#mode === \"h\";\r\n\r\n\t\t// ๋ง์ฐ์ค ํฌ์ธํฐ์ ์คํ๋ฆฌํฐ ์์์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ\r\n\t\tconst clickOffset = isHorizontal\r\n\t\t\t? e.clientX - splitterRect.left\r\n\t\t\t: e.clientY - splitterRect.top;\r\n\r\n\t\tconst dragBar = document.createElement(\"div\");\r\n\t\tdragBar.className = `nx-splitter-drag-bar-${this.#mode}`;\r\n\r\n\t\tObject.assign(dragBar.style, {\r\n\t\t\tposition: \"absolute\",\r\n\t\t\tzIndex: \"999\",\r\n\t\t\tbackground: \"#666\",\r\n\t\t\topacity: \"0.6\",\r\n\t\t\tpointerEvents: \"none\"\r\n\t\t});\r\n\r\n\t\tconst root = this.getRootNode({ composed: true });\r\n\t\tconst parent = root instanceof ShadowRoot ? root.host : this.parentElement;\r\n\t\tconst prev = this.previousElementSibling;\r\n\t\tconst next = this.nextElementSibling;\r\n\r\n\t\tif (!parent || !prev || !next) {\r\n\t\t\ttrace.warn(\"Spliter's parent or siblings not found.\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t(parent.shadowRoot || parent).appendChild(dragBar);\r\n\t\tconst dragBarOffsetParentRect = dragBar.offsetParent.getBoundingClientRect();\r\n\r\n\t\tconst prevRect = prev.getBoundingClientRect();\r\n\t\tconst nextRect = next.getBoundingClientRect();\r\n\r\n\t\t// ๋๋๊ทธ ๋ฐ์ ์ด๊ธฐ ์์น์ ํฌ๊ธฐ ์ค์ \r\n\t\tconst initialSplitterPosInParent = (isHorizontal\r\n\t\t\t? splitterRect.left - dragBarOffsetParentRect.left\r\n\t\t\t: splitterRect.top - dragBarOffsetParentRect.top) + clickOffset;\r\n\r\n\t\tif (isHorizontal) {\r\n\t\t\tdragBar.style.top = \"0\";\r\n\t\t\tdragBar.style.left = `${initialSplitterPosInParent}px`;\r\n\t\t\tdragBar.style.width = \"2px\";\r\n\t\t\tdragBar.style.height = \"100%\";\r\n\t\t} else {\r\n\t\t\tdragBar.style.left = \"0\";\r\n\t\t\tdragBar.style.top = `${initialSplitterPosInParent}px`;\r\n\t\t\tdragBar.style.height = \"2px\";\r\n\t\t\tdragBar.style.width = \"100%\";\r\n\t\t}\r\n\r\n\t\tdragBar.style.mixBlendMode = \"difference\";\r\n\t\tdragBar.style.zIndex = \"99999\";\r\n\r\n\t\tconst minLimit = isHorizontal\r\n\t\t\t? prevRect.left - dragBarOffsetParentRect.left\r\n\t\t\t: prevRect.top - dragBarOffsetParentRect.top;\r\n\t\tconst maxLimit = isHorizontal\r\n\t\t\t? nextRect.right - dragBarOffsetParentRect.left - splitterRect.width\r\n\t\t\t: nextRect.bottom - dragBarOffsetParentRect.top - splitterRect.height;\r\n\r\n\t\tconst onMove = moveEvent => {\r\n\t\t\tconst clientPos = isHorizontal ? moveEvent.clientX : moveEvent.clientY;\r\n\t\t\tconst currentPosInParent = isHorizontal\r\n\t\t\t\t? clientPos - dragBarOffsetParentRect.left\r\n\t\t\t\t: clientPos - dragBarOffsetParentRect.top;\r\n\r\n\t\t\tconst clampedPos = Math.max(minLimit, Math.min(currentPosInParent, maxLimit));\r\n\r\n\t\t\tif (isHorizontal) {\r\n\t\t\t\tdragBar.style.left = `${clampedPos}px`;\r\n\t\t\t} else {\r\n\t\t\t\tdragBar.style.top = `${clampedPos}px`;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst onUp = () => {\r\n\r\n\t\t\twindow.removeEventListener(\"mousemove\", onMove);\r\n\t\t\twindow.removeEventListener(\"mouseup\", onUp);\r\n\t\t\tdragBar.remove();\r\n\r\n\t\t\tconst allChildren = Array.from(parent.children);\r\n\t\t\tconst allPanels = allChildren.filter(el => el.tagName.toLowerCase() !== 'nx-splitter');\r\n\r\n\t\t\t// โญโญ gap ํฌ๊ธฐ ๊ณ์ฐ โญโญ\r\n\t\t\tconst style = window.getComputedStyle(parent);\r\n\t\t\tconst gapValue = isHorizontal ? style.getPropertyValue('column-gap') : style.getPropertyValue('row-gap');\r\n\t\t\tconst gapSize = parseFloat(gapValue) || 0;\r\n\t\t\tconst gapCount = allChildren.length > 1 ? allChildren.length - 1 : 0;\r\n\t\t\tconst totalGapSize = gapCount * gapSize;\r\n\r\n\t\t\tconst finalDragBarPos = isHorizontal ? parseFloat(dragBar.style.left) : parseFloat(dragBar.style.top);\r\n\t\t\tconst dragOffset = finalDragBarPos - initialSplitterPosInParent;\r\n\r\n\t\t\tconst prevSize = isHorizontal ? prev.getBoundingClientRect().width : prev.getBoundingClientRect().height;\r\n\t\t\tconst nextSize = isHorizontal ? next.getBoundingClientRect().width : next.getBoundingClientRect().height;\r\n\r\n\t\t\tlet newPrevSize = prevSize + dragOffset;\r\n\t\t\tlet newNextSize = nextSize - dragOffset;\r\n\r\n\t\t\t// ํจ๋ ํฌ๊ธฐ๊ฐ ์์๊ฐ ๋์ง ์๋๋ก ์ ํํ๊ณ , ๋ค๋ฅธ ํจ๋์ ์ฐจ์ด๋ฅผ ๋ณด์ \r\n\t\t\tif (newPrevSize < 0) {\r\n\t\t\t\tnewNextSize += newPrevSize;\r\n\t\t\t\tnewPrevSize = 0;\r\n\t\t\t}\r\n\t\t\tif (newNextSize < 0) {\r\n\t\t\t\tnewPrevSize += newNextSize;\r\n\t\t\t\tnewNextSize = 0;\r\n\t\t\t}\r\n\r\n\t\t\tconst initialSizes = allPanels.map(panel => isHorizontal ? panel.getBoundingClientRect().width : panel.getBoundingClientRect().height);\r\n\r\n\t\t\tconst totalSplitterSize = allChildren.reduce((sum, child) => {\r\n\t\t\t\tif (child.tagName.toLowerCase() === 'nx-splitter') {\r\n\t\t\t\t\treturn sum + (isHorizontal ? child.getBoundingClientRect().width : child.getBoundingClientRect().height);\r\n\t\t\t\t}\r\n\t\t\t\treturn sum;\r\n\t\t\t}, 0);\r\n\r\n\t\t\tconst totalContainerSize = (isHorizontal ? parent.getBoundingClientRect().width : parent.getBoundingClientRect().height);\r\n\t\t\tconst totalFlexSpace = totalContainerSize - totalSplitterSize - totalGapSize;\r\n\r\n\t\t\t// --- ์์ธ ํ์
์ ์ํ ๋ก๊ทธ ์ถ๊ฐ ---\r\n\t\t\ttrace.log(`[Debug] ---------------------------`);\r\n\t\t\ttrace.log(`[Debug] TotalContainerSize: ${totalContainerSize}`);\r\n\t\t\ttrace.log(`[Debug] TotalSplitterSize: ${totalSplitterSize}`);\r\n\t\t\ttrace.log(`[Debug] GapSize: ${gapSize}, GapCount: ${gapCount}`);\r\n\t\t\ttrace.log(`[Debug] PrevSize(Old): ${prevSize}, NextSize(Old): ${nextSize}`);\r\n\t\t\ttrace.log(`[Debug] DragOffset: ${dragOffset}`);\r\n\t\t\ttrace.log(`[Debug] NewPrevSize: ${newPrevSize}, NewNextSize: ${newNextSize}`);\r\n\r\n\t\t\tallPanels.forEach((panel, index) => {\r\n\t\t\t\tconst isChartPanel = panel.querySelector('canvas') !== null;\r\n\t\t\t\tconst currentSize = isHorizontal ? panel.getBoundingClientRect().width : panel.getBoundingClientRect().height;\r\n\t\t\t\ttrace.log(`[Debug] Panel[${index}] (${isChartPanel ? 'Canvas' : 'Normal'}): Current=${currentSize.toFixed(2)}, New=${(panel === prev ? newPrevSize : (panel === next ? newNextSize : initialSizes[index])).toFixed(2)}`);\r\n\t\t\t});\r\n\t\t\ttrace.log(`[Debug] ---------------------------`);\r\n\r\n\t\t\tlet flexSum = 0;\r\n\t\t\tallPanels.forEach((panel, index) => {\r\n\t\t\t\tlet newSize;\r\n\t\t\t\tif (panel === prev) {\r\n\t\t\t\t\tnewSize = newPrevSize;\r\n\t\t\t\t} else if (panel === next) {\r\n\t\t\t\t\tnewSize = newNextSize;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tnewSize = initialSizes[index];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst newFlexBasis = newSize / totalFlexSpace;\r\n\t\t\t\t//panel.style.flex = `${newFlexBasis} ${newFlexBasis} 0`;\r\n\r\n\t\t\t\ttrace.log(panel);\r\n\r\n\t\t\t\tif (panel.classList.contains('sidebar')) {\r\n\t\t\t\t\t// ๋๋๊ทธ๊ฐ ๋๋ ์์ ์ newSize(px)๋ฅผ ๊ทธ๋๋ก ๊ณ ์ ๊ฐ์ผ๋ก ํ ๋น\r\n\t\t\t\t\t// ์ด๋ ๊ฒ ํ๋ฉด ๋น์จ(%)์ด ์๋๋ผ ๋ฑ ๊ทธ ํฝ์
๋งํผ๋ง ์๋ฆฌ๋ฅผ ์ฐจ์งํ๊ฒ ๋ฉ๋๋ค.\r\n\t\t\t\t\tpanel.style.flex = `0 0 ${newSize}px`;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// ๋๋จธ์ง ๋ฉ์ธ ๋ณด๋ ๊ฐ์ ์ ์ฐํ ํจ๋์ ๋น์จ(%)๋ก ์ฒ๋ฆฌ\r\n\t\t\t\t\t//const newFlexBasis = newSize / totalFlexSpace;\r\n\t\t\t\t\tpanel.style.flex = `${newFlexBasis} ${newFlexBasis} 0`;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tflexSum += newFlexBasis;\r\n\t\t\t});\r\n\r\n\t\t\ttrace.log(`dragOffset: ${dragOffset}`);\r\n\t\t\ttrace.log(`Calculated FlexSum: ${flexSum}`);\r\n\t\t};\r\n\r\n\t\twindow.addEventListener(\"mousemove\", onMove);\r\n\t\twindow.addEventListener(\"mouseup\", onUp);\r\n\t};\r\n\r\n\tget cssPath() {\r\n\t\treturn this.getAttribute(\"css-path\") || NineUxUtil.cssPath;\r\n\t}\r\n\r\n\t#init = () => {\r\n\t\tthis.#detectMode(this);\r\n\t\tthis.classList.add(this.#mode);\r\n\r\n\t\tconst contents = this.innerHTML.trim();\r\n\t\t//const gripClass = `grip-${this.#mode}`;\r\n\t\tconst gripTmpl = (contents === \"\") ? `<div class=\"grip\"></div>` : `<div class=\"grip\"></div><div class=\"inner-container\">${contents}</div><div class=\"grip\"></div>`;\r\n\r\n\t\tconst customImport = nine.cssPath ? `@import \"${nine.cssPath}/nine-util.css\";` : \"\";\r\n\r\n\t\tthis.innerHTML = \"\";\r\n\t\tconst htmlTmpl = document.createElement(\"template\");\r\n\r\n\t\thtmlTmpl.innerHTML = `\r\n\t\t\t<style>\r\n\t\t\t\t@import \"https://cdn.jsdelivr.net/npm/@ninebone/util@${__APP_VERSION__}/dist/css/nine-util.css\";\r\n\t\t\t\t${customImport}\r\n\t\t\t</style>\r\n\t\t\t${gripTmpl}\r\n `;\r\n\r\n\t\tthis.shadowRoot.appendChild(htmlTmpl.content.cloneNode(true));\r\n\r\n\t\tthis.shadowRoot.querySelectorAll(\".grip\").forEach(el => {\r\n\t\t\tel.addEventListener(\"mousedown\", e => this.#startDrag(e));\r\n\t\t});\r\n\r\n\t\tthis.#prepareLayout();\r\n\r\n\t\twindow.addEventListener(\"resize\", () => this.#prepareLayout());\r\n\t};\r\n\r\n\t#prepareLayout = () => {\r\n\t\tconst isHorizontal = this.#mode === \"h\";\r\n\t\tconst parent = this.parentElement;\r\n\t\tconst allPanels = Array.from(parent.children).filter(el => el.tagName.toLowerCase() !== 'nine-splitter');\r\n\t\tif (allPanels.length < 2) return;\r\n\r\n\t\tconst parentRect = parent.getBoundingClientRect();\r\n\t\tconst totalContentSize = allPanels.reduce((sum, el) => {\r\n\t\t\tconst size = isHorizontal ? el.getBoundingClientRect().width : el.getBoundingClientRect().height;\r\n\t\t\treturn sum + size;\r\n\t\t}, 0);\r\n\t\tconst totalParentSize = isHorizontal ? parentRect.width : parentRect.height;\r\n\r\n\t\tallPanels.forEach(panel => {\r\n\t\t\tconst size = isHorizontal ? panel.getBoundingClientRect().width : panel.getBoundingClientRect().height;\r\n\t\t\tconst newSize = totalParentSize * (size / totalContentSize);\r\n\t\t\tconst flexGrow = newSize / totalParentSize;\r\n\t\t\tpanel.style.flex = `${flexGrow} ${flexGrow} 0`;\r\n\t\t});\r\n\t};\r\n}\r\n\r\nif (!customElements.get('nine-splitter')) {\r\n\tcustomElements.define(\"nine-splitter\", UxSplitter);\r\n}","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|YYYY|YY|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),Y=_.prototype;return O.prototype=Y,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){Y[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));","import { trace } from \"@nopeer\";\n\n// ๐ฏ ๋ณต์กํ ์์์ ์ง์ฐ๊ณ ํ์
๊ณ ์ ์ ์ญํ (๊ป๋ฐ๊ธฐ ์กฐ๋ฆฝ)๋ง ์ํํฉ๋๋ค.\nexport class NinePopup extends HTMLElement {\n\tstatic get tagName() { return \"nine-popup\"; }\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.attachShadow({ mode: 'open' });\n\t}\n\n\tconnectedCallback() {\n\t\t// ๐ Shadow DOM ๋ด๋ถ์ nine-dialog ๋ ์ด์์ ๊ตฌ์ถ\n\t\tthis.shadowRoot.innerHTML = `\n\t\t\t<nine-dialog>\n\t\t\t\t<div class=\"popup-body\"></div>\n\t\t\t</nine-dialog>\n\t\t`;\n\t}\n\n\tclose(returnValue = null) {\n\t\tconst $dialog = this.dialog;\n\t\tif ($dialog) {\n\t\t\t// ๐ฏ ๊ตฌ์ง๊ตฌ์งํ ์ปค์คํ
์ด๋ฒคํธ ๋์ , ๊ธฐ์กด ์์ฐ์ธ ๋ค์ด์ผ๋ก๊ทธ์ ์ ๋๋ฉ์ด์
์ข
๋ฃ ํจ์๋ฅผ ์ง์ ํ๊ฒฉํฉ๋๋ค.\n\t\t\t$dialog.closeWithAnimation(returnValue);\n\t\t}\n\t}\n\n\t// ๐ ๋ฆฌ์กํธ ์์ง์ด ๊ฝ์ ๋ฃ์ ์
๊ตฌ ํฌ์ธํฐ ๊ฐ๋ฐฉ\n\tget popupBody() {\n\t\treturn this.shadowRoot?.querySelector('nine-dialog .popup-body') || null;\n\t}\n\n\t// ๐ ๋ฆฌ์กํธ๋ ์ธ๋ถ ์ ํธ์์ ์ง์ ์ ์ดํ ์ ์๋ ์ ์ด ํต๋ก\n\tget dialog() {\n\t\treturn this.shadowRoot?.querySelector('nine-dialog') || null;\n\t}\n}\n\nif (!customElements.get('nine-popup')) customElements.define('nine-popup', NinePopup);","export const TreeUtil = {\r\n\t/**\r\n\t * @param {Array} data - ์๋ณธ ๋ฐ์ดํฐ ๋ฐฐ์ด\r\n\t * @param {String} sortField - ์ ๋ ฌ ๊ธฐ์ค ํ๋๋ช
\r\n\t * @param {String} idField - ๊ณ ์ ID ํ๋๋ช
(๊ธฐ๋ณธ: 'id')\r\n\t * @param {String} parentIdField - ๋ถ๋ชจ ID ํ๋๋ช
(๊ธฐ๋ณธ: 'parentId')\r\n\t */\r\n\tsort: (data, idField = 'id', parentIdField = 'parentId', sortField = 'sortOrder') => {\r\n\t\tif (!data || data.length === 0) return [];\r\n\r\n\t\t// 1. ID ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋งตํ (๊ฒ์ ์๋ ์ต์ ํ)\r\n\t\tconst map = {};\r\n\t\tdata.forEach(item => {\r\n\t\t\tmap[item[idField]] = { ...item, children: [] };\r\n\t\t});\r\n\r\n\t\t// 2. ๋ถ๋ชจ-์์ ๊ด๊ณ ํธ๋ฆฌ ๊ตฌ์ฑ\r\n\t\tconst roots = [];\r\n\t\tdata.forEach(item => {\r\n\t\t\tconst node = map[item[idField]];\r\n\t\t\tconst parentId = item[parentIdField];\r\n\r\n\t\t\t// ๋ถ๋ชจ๊ฐ ์กด์ฌํ๊ณ ๋งต์ ์๋ค๋ฉด ์์์ผ๋ก ์ถ๊ฐ, ์๋๋ฉด ๋ฃจํธ๋ก ๊ฐ์ฃผ\r\n\t\t\tif (parentId && map[parentId]) {\r\n\t\t\t\tmap[parentId].children.push(node);\r\n\t\t\t} else {\r\n\t\t\t\troots.push(node);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// 3. ์ฌ๊ท์ ์ผ๋ก ์ ๋ ฌํ๋ ํจ์\r\n\t\tconst sortNodes = (nodes) => {\r\n\t\t\tnodes.sort((a, b) => {\r\n\t\t\t\tconst valA = a[sortField];\r\n\t\t\t\tconst valB = b[sortField];\r\n\r\n\t\t\t\t// ์ซ์/๋ฌธ์์ด ์๋ ํ๋ณ ์ ๋ ฌ\r\n\t\t\t\tif (typeof valA === 'number' && typeof valB === 'number') {\r\n\t\t\t\t\treturn valA - valB;\r\n\t\t\t\t}\r\n\t\t\t\treturn String(valA || '').localeCompare(String(valB || ''));\r\n\t\t\t});\r\n\t\t\t// ์์ ๋
ธ๋๋ค๋ ์ฌ๊ท์ ์ผ๋ก ์ ๋ ฌ\r\n\t\t\tnodes.forEach(node => {\r\n\t\t\t\tif (node.children.length > 0) sortNodes(node.children);\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tsortNodes(roots);\r\n\r\n\t\t// 4. ๋ค์ ํํํ (Flat Array) ํ์ฌ ๊ฒฐ๊ณผ ๋ฐํ\r\n\t\tconst result = [];\r\n\t\tconst flatten = (nodes) => {\r\n\t\t\tnodes.forEach(node => {\r\n\t\t\t\t// children ์์ฑ์ ์์์ฉ์ด๋ฏ๋ก ์๋ณธ์ ๋ฐฉํด๋๋ค๋ฉด ์ญ์ ๊ฐ๋ฅ\r\n\t\t\t\tconst { children, ...item } = node;\r\n\t\t\t\tresult.push(item);\r\n\t\t\t\tif (children.length > 0) flatten(children);\r\n\t\t\t});\r\n\t\t};\r\n\t\tflatten(roots);\r\n\r\n\t\treturn result;\r\n\t}\r\n};","import { nine } from '../core/Config.js';\r\nimport dayjs from \"dayjs\";\r\nimport React from 'react'; // ๐ฏ React ๋ด์ฅ ํฌํผ ์ํฌํธ\r\nimport { createRoot } from 'react-dom/client';\r\nimport { NinePopup } from './NinePopup.js';\r\nimport { TreeUtil } from './TreeUtil.js'; // ๋ถ๋ฆฌํ ํ์ผ ์ํฌํธ\r\n\r\nexport class NineUtil {\r\n\r\n\t// ๐
1. ๋ ์ง ํฌ๋งท ํฌํผ (์ธ์คํด์ค ๋ฉ์๋)\r\n\tformatDate = (v, fmt) => {\r\n\t\treturn dayjs(v).format(fmt);\r\n\t};\r\n\r\n\t/**\r\n\t * ๐ฎ ์ด๊ฐ๋จ ๋ง๋ฅ ๋๋๊ทธ ํ์
์์ง (Promise/Then ๊ท๊ฒฉ)\r\n\t * @param {React.Component} ContentComponent - ํ์
๋ด๋ถ์ ๋์ธ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ\r\n\t * @param {Object} param - ํ์
์๋งน์ด์ 'data'๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ฐฐ๋ฌ๋ ์์ ๋ฐ์ดํฐ ๊ฐ์ฒด\r\n\t * @param {string} title - ์ญ์ ๋๋๊ทธ ๋ฐ ํค๋์ ๊ฝํ ํ์ดํ๋ช
(๊ธฐ๋ณธ๊ฐ: Details)\r\n\t * @returns {Promise} ํ์
์ด ๋ซํ ๋ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ ํ๋กํผํฐ ์์์ฆ\r\n\t */\r\n\tpopup = (ContentComponent, param = {}, title = \"Details\") => {\r\n\t\tdocument.querySelectorAll(NinePopup.tagName).forEach(el => el.remove());\r\n\r\n\t\tconst $popupWrapper = document.createElement(NinePopup.tagName);\r\n\t\tdocument.body.appendChild($popupWrapper);\r\n\r\n\t\treturn new Promise((resolve) => {\r\n\t\t\tconst $bodySpace = $popupWrapper.popupBody;\r\n\t\t\tconst $dialogComp = $popupWrapper.dialog;\r\n\r\n\t\t\tif (title && $dialogComp) $dialogComp.setAttribute(\"subject\", title);\r\n\r\n\t\t\tconst root = createRoot($bodySpace);\r\n\r\n\t\t\t// ๐ฏ ์ค์ง ํ๋, ๋ค์ด์ผ๋ก๊ทธ๊ฐ ์์ ํ ํ๊ดด(Closed)๋๋ ์์ ๋ง ๋ฑ ๋์์ฑ๋๋ค.\r\n\t\t\t$dialogComp?.addEventListener('closed', (e) => {\r\n\t\t\t\tresolve(e.detail); // ์ต์ข
๋ฐํ๊ฐ ๋ถ๋ชจ์ .then()์ผ๋ก ์ ๋ฌ\r\n\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\troot.unmount();\r\n\t\t\t\t\t$popupWrapper.remove();\r\n\t\t\t\t}, 0);\r\n\t\t\t});\r\n\r\n\t\t\troot.render(React.createElement(ContentComponent, { data: param }));\r\n\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\t$dialogComp?.showModal();\r\n\t\t\t}, 0);\r\n\t\t});\r\n\t};\r\n\r\n\t/**\r\n\t * ๐ฏ 2. Shadow DOM ๊ฒฝ๊ณ๋ฅผ ๋ฌด๋ ฅํํ๊ณ ๊น์ด ์๊ด์์ด ๋ชจ๋ ์์๋ฅผ ์์งํ๋ ๋ง๋ฅ ์ฟผ๋ฆฌ\r\n\t * @param {string} selector - ์ฐพ๊ณ ์ ํ๋ CSS ์ ํ์ (์: 'input[name]')\r\n\t * @param {HTMLElement|ShadowRoot|Document} root - ํ์ ์์์ \r\n\t * @returns {HTMLElement[]} ๋งค์นญ๋ ์๋ฐ์คํฌ๋ฆฝํธ DOM ์๋ฆฌ๋จผํธ ๋ฐฐ์ด\r\n\t */\r\n\tquerySelectorAll = (selector, root = document) => {\r\n\t\tconst results = [];\r\n\r\n\t\tconst search = (node) => {\r\n\t\t\tif (!node) return;\r\n\r\n\t\t\t// ํ์ฌ ๋
ธ๋๊ฐ ShadowRoot๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด ๊ทธ ๋ด๋ถ๋ถํฐ ํ์\r\n\t\t\tif (node.shadowRoot) {\r\n\t\t\t\tsearch(node.shadowRoot);\r\n\t\t\t}\r\n\r\n\t\t\t// ํ์ฌ ๋ ๋ฒจ(Light DOM ๋๋ Shadow DOM)์์ ๋งค์นญ๋๋ ํ๊ฒ ์์ง\r\n\t\t\tnode.querySelectorAll?.(selector).forEach(elem => {\r\n\t\t\t\tif (!results.includes(elem)) {\r\n\t\t\t\t\tresults.push(elem);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t// ์ฑ๋ฅ ์ต์ ํ: querySelectorAll('*') ๋์ ์ค์ ์์ ์๋ฆฌ๋จผํธ๋ค๋ง ๋ฃจํ ๋๋ฉฐ ์ฌ๊ท ํ์\r\n\t\t\tconst children = node.children ? Array.from(node.children) : [];\r\n\t\t\tchildren.forEach(child => {\r\n\t\t\t\tsearch(child);\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tsearch(root);\r\n\t\treturn results;\r\n\t};\r\n\r\n\t/**\r\n\t * ๐ฏ 3. Shadow DOM ๊ฒฝ๊ณ๋ฅผ ๋ซ๊ณ ๊ฐ์ฅ ๋จผ์ ๋งค์นญ๋๋ ๋จ ํ๋์ ์์๋ฅผ ๋ฐํ (์กฐ๊ธฐ ์ข
๋ฃ ์ต์ ํ)\r\n\t * @param {string} selector - ์ฐพ๊ณ ์ ํ๋ CSS ์ ํ์\r\n\t * @param {HTMLElement|ShadowRoot|Document} root - ํ์ ์์์ \r\n\t * @returns {HTMLElement|null} ๋งค์นญ๋ ์๋ฆฌ๋จผํธ ๊ฐ์ฒด ๋๋ null\r\n\t */\r\n\tquerySelector = (selector, root = document) => {\r\n\t\tif (!root) return null;\r\n\r\n\t\t// ํ์ฌ ๋
ธ๋ ์์ฒด์์ ๋ฐ๋ก ๋งค์นญ๋๋ ๊ฒ ์๋ค๋ฉด ์ฆ์ ๋ฐํ\r\n\t\tlet found = root.querySelector?.(selector);\r\n\t\tif (found) return found;\r\n\r\n\t\t// ํ์ฌ ๋
ธ๋์ Shadow DOM ์ฅ๋ฒฝ์ด ์๋ค๋ฉด ๊ทธ ๋ด๋ถ๋ฅผ ๋จผ์ ํ์\r\n\t\tif (root.shadowRoot) {\r\n\t\t\tfound = this.querySelector(selector, root.shadowRoot);\r\n\t\t\tif (found) return found;\r\n\t\t}\r\n\r\n\t\t// ์์ ์์๋ค์ ์ํํ๋ฉฐ ๊น์์ด ์จ์ ํ๊ฒ ์ถ์ \r\n\t\tconst children = root.children ? Array.from(root.children) : [];\r\n\t\tfor (const child of children) {\r\n\t\t\tfound = this.querySelector(selector, child);\r\n\t\t\tif (found) return found;\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t};\r\n\r\n\t/**\r\n\t * ๐ฏ 4. Shadow DOM ๊ฒฝ๊ณ๋ฅผ ๊ดํตํ์ฌ ๊ฐ์ฅ ๊ฐ๊น์ด ์กฐ์ ์์๋ฅผ ์ฐพ๋ ๋ง๋ฅ ํด๋ก์ง์คํธ\r\n\t * @param {string} selector - ์ฐพ๊ณ ์ ํ๋ ๋ถ๋ชจ์ CSS ์ ํ์ (์: 'nine-popup')\r\n\t * @param {HTMLElement} startElement - ํ์์ ์์ํ ๊ธฐ์ค ์๋ฆฌ๋จผํธ (๋ณดํต e.target)\r\n\t * @returns {HTMLElement|null} ๋งค์นญ๋ ์กฐ์ ์๋ฆฌ๋จผํธ ๊ฐ์ฒด ๋๋ null\r\n\t */\r\n\tclosest = (selector, startElement) => {\r\n\t\tif (!startElement || typeof selector !== 'string') return null;\r\n\r\n\t\tlet currentElement = startElement;\r\n\r\n\t\twhile (currentElement) {\r\n\t\t\t// โ ์ผ๋ฐ Element ๋
ธ๋์ผ ๋๋ง matches ๊ฒ์ฌ (ShadowRoot ๋ฑ ๋ถ๊ธฐ ๋ฐฉ์ด)\r\n\t\t\tif (currentElement.nodeType === Node.ELEMENT_NODE) {\r\n\t\t\t\tif (currentElement.matches(selector)) {\r\n\t\t\t\t\treturn currentElement;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// โก ๐ [ํต์ฌ] ํ์ฌ ๋
ธ๋๊ฐ Shadow DOM ๋ด๋ถ๋ผ๋ฉด getRootNode().host๋ฅผ ํตํด ๋ฐ๊นฅ ์ธ์(Host)์ผ๋ก ํ์ถ!\r\n\t\t\t// ๋ง์ฝ ๋ ์ด์ ์ฌ๋ผ๊ฐ Host๊ฐ ์๋ค๋ฉด ์ผ๋ฐ ์์ ๋ถ๋ชจ(parentElement)๋ก ์ด๋\r\n\t\t\tconst rootNode = currentElement.getRootNode?.();\r\n\r\n\t\t\tif (rootNode && rootNode instanceof ShadowRoot) {\r\n\t\t\t\tcurrentElement = rootNode.host; // ์ฅ๋ฒฝ ๋ํ\r\n\t\t\t} else {\r\n\t\t\t\tcurrentElement = currentElement.parentElement || null; // ์ผ๋ฐ ๋ถ๋ชจ ์ถ์ \r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t};\r\n\r\n\trandomUUID = (num) => {\r\n\t\tif (!num) num = 10;\r\n\r\n\t\tconst characters ='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\r\n\t\tlet result = '';\r\n\t\tconst charactersLength = characters.length;\r\n\t\tfor (let i = 0; i < num; i++) {\r\n\t\t\tresult += characters.charAt(Math.floor(Math.random() * charactersLength));\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t};\r\n\r\n\ttree = {\r\n\t\tsort: TreeUtil.sort,\r\n\t};\r\n}\r\n\r\nconst utilInstance = new NineUtil();\r\n// ๐ฏ [ํต์ฌ] ๊ธ๋ก๋ฒ `nine` ๊ฐ์ฒด์ ์ ํธ๋ฆฌํฐ ๋ฉ์๋๋ค์ ํต์งธ๋ก ์ด์ํฉ๋๋ค.\r\nObject.assign(nine, utilInstance);","// 1. ๊ธฐ์กด core ๋ชจ๋\r\n//import { NineUxUtil } from './ux/dialog/NineUxUtil.js';\r\nimport { nine, subscribeConfig, config } from './core/Config.js';\r\nimport { Trace, trace } from './core/Trace.js';\r\nimport { TaskDebouncer } from './core/TaskDebouncer.js';\r\n\r\n// 2. ์ ๊ท net ๋ฐ ux ๋ชจ๋ ์ถ๊ฐ\r\nimport { api, Fetch } from './net/Fetch.js';\r\nimport { Loading } from './ux/Loading.js';\r\n\r\nimport { nineDialog } from './ux/dialog/nineDialog.js';\r\nimport { nineConfirmPopup, nineAlertPopup } from './ux/dialog/nineConfirm.js';\r\nimport { ninePromptPopup } from './ux/dialog/ninePrompt.js';\r\n\r\nimport { safe } from \"./utils/promise.js\"; // ๊ฒฝ๋ก์ ๋ง์ถฐ ์ํฌํธ\r\n// ux\r\nimport './ux/UxSplitter.js';\r\nimport './ux/dialog/NineUxUtil.js';\r\nimport './utils/NineUtil.js';\r\nimport './utils/NinePopup.js';\r\n\r\n/**\r\nconst utilInstance = new NineUxUtil();\r\nnine.alert = utilInstance.alert.bind(utilInstance);\r\nnine.confirm = utilInstance.confirm.bind(utilInstance);\r\nnine.prompt = utilInstance.prompt.bind(utilInstance);\r\nnine.formatDate = utilInstance.formatDate.bind(utilInstance);\r\n\t*/\r\n//const utilInstance = new NineUxUtil();\r\n\r\n// ๐ก ์ด๋ฏธ ํ์ดํ ํจ์๋ก ๋ฐ์ธ๋ฉ๋์ด ์์ผ๋ฏ๋ก, ๊ฐ์ฒด ํต์งธ๋ก ๋ณต์ฌํด์ฃผ๋ฉด ๋๋ฉ๋๋ค!\r\n//Object.assign(nine, utilInstance);\r\n\r\nnine.safe = safe;\r\n\r\n// ๊ธฐ์กด nine ๊ฐ์ฒด(Config)์ Util ๊ธฐ๋ฅ์ ํฉ์ฑ\r\n//Object.assign(nine, utilInstance);\r\n\r\nnine.api = api;\r\nnine.trace = trace;\r\nnine.subscribeConfig = subscribeConfig;\r\nnine.config = config || {};\r\n\r\nexport {\r\n\tnine,\r\n\tsubscribeConfig,\r\n\tconfig,\r\n\tTrace,\r\n\ttrace,\r\n\tTaskDebouncer,\r\n\tapi, // ๐ ์ถ๊ฐ: ์ด์ ์๋น์ค์์ api.get() ๊ฐ๋ฅ\r\n\tFetch, // ๐ ์ถ๊ฐ: ํด๋์ค ์์ฒด๋ ํน์ ๋ชจ๋ฅด๋ ๋
ธ์ถ\r\n\tLoading as loading, // ๐ ์ถ๊ฐ: loading.show() ๋ก ์ฐ๊ธฐ ํธํ๊ฒ alias\r\n\tnineDialog,\r\n\tnineAlertPopup, nineConfirmPopup, ninePromptPopup\r\n};\r\n\r\nif (typeof window !== 'undefined') {\r\n\twindow.nine = nine;\r\n}\r\n","/**\r\n * ๋น๋๊ธฐ ํจ์๋ฅผ try-catch ์์ด ์์ ํ๊ฒ ์คํํ๊ฒ ๋์์ฃผ๋ ์ ํธ๋ฆฌํฐ\r\n * @param {Promise} promise\r\n * @returns {Promise<[any, Error|null]>}\r\n */\r\nexport const safe = async (promise) => {\r\n\ttry {\r\n\t\tconst data = await promise;\r\n\t\treturn [data, null];\r\n\t} catch (err) {\r\n\t\treturn [null, err];\r\n\t}\r\n};"],"names":["listeners","Set","_initialConfig","ux","nativeOverride","theme","board","readOnly","cssPath","debug","window","__NINE_GLOBAL_CONFIG__","_config","subscribeConfig","fn","add","delete","config","Proxy","set","target","prop","value","forEach","get","nine","this","setup","options","Object","entries","key","Array","isArray","Trace$1","_a","constructor","name","color","__privateAdd","_Trace_instances","_name","_color","__privateSet","init","log","__privateMethod","isTraceEnabled_fn","call","style","__privateGet","console","bind","warn","error","WeakMap","WeakSet","debugConfig","enable","filter","includes","location","hostname","startsWith","trace","Trace","_timer","_queue","_delay","_TaskDebouncer_instances","flush_fn","length","tasks","splice","seen","task","identifier","func","JSON","stringify","args","has","traceOrigin","super","Loading","show","overlay","document","getElementById","createElement","id","cssText","innerHTML","body","appendChild","head","display","hide","_Fetch","_request","__publicField","__API_BASE_URL__","method","url","data","showLoading","finalUrl","BASE_URL","headers","FormData","targetUrl","URLSearchParams","fetch","then","async","res","ok","text","Error","status","json","catch","err","toLowerCase","finally","rows","fileKey","filePartName","jsonPartName","chunkSize","dataRows","totalCount","lastResponse","globalFileIndex","i","formData","chunk","slice","rowDataList","row","rowIndex","fileData","rest","files","fileIndices","fileObj","File","append","push","jsonBlob","Blob","type","post","success","response","_fileObj","Fetch","api","dialogStyles","nineDialog","HTMLElement","_shift","_dialog","showModal","_b","shadowRoot","activeElement","blur","close","remove","_init","querySelector","addEventListener","_onMouseDown","_onTouchStart","querySelectorAll","btn","onclick","closeWithAnimation","e","closest","button","altKey","ctrlKey","shiftKey","rect","getBoundingClientRect","x","clientX","left","y","clientY","top","onMouseMove","ev","position","margin","onMouseUp","removeEventListener","touch","changedTouches","pageX","pageY","onTouchMove","t","onTouchEnd","connectedCallback","v","titleText","getAttribute","returnValue","classList","setTimeout","dispatchEvent","CustomEvent","detail","BasePopup","attachShadow","mode","open","PopupClass","message","title","renderFn","tagName","class","animation","_c","replace","el","dialogComp","setAttribute","Promise","resolve","setupEvents","customElements","define","_nineConfirmPopup","render","m","o","msg","conf","nineConfirmPopup","_nineAlertPopup","nineAlertPopup","_ninePromptPopup","textarea","requestAnimationFrame","focus","ninePromptPopup","NineUxUtil","_NineUxUtil_instances","prepare_fn","defaultClass","isExecuted","popup","alert","confirm","prompt","runner","rgb","classic","shake","run","zoom","reject","assign","UxSplitter","_mode","_detectMode","prev","previousElementSibling","next","nextElementSibling","contains","prevRect","nextRect","Math","abs","_startDrag","preventDefault","stopPropagation","splitterRect","isHorizontal","clickOffset","dragBar","className","zIndex","background","opacity","pointerEvents","root","getRootNode","composed","parent","ShadowRoot","host","parentElement","dragBarOffsetParentRect","offsetParent","initialSplitterPosInParent","width","height","mixBlendMode","minLimit","maxLimit","right","bottom","onMove","moveEvent","clientPos","currentPosInParent","clampedPos","max","min","onUp","allChildren","from","children","allPanels","getComputedStyle","gapValue","getPropertyValue","gapSize","parseFloat","gapCount","totalGapSize","dragOffset","prevSize","nextSize","newPrevSize","newNextSize","initialSizes","map","panel","totalSplitterSize","reduce","sum","child","totalContainerSize","totalFlexSpace","index","isChartPanel","currentSize","toFixed","flexSum","newSize","newFlexBasis","flex","contents","trim","gripTmpl","customImport","htmlTmpl","content","cloneNode","_prepareLayout","parentRect","totalContentSize","totalParentSize","size","flexGrow","n","r","s","u","a","c","f","h","d","l","$","M","weekdays","split","months","ordinal","String","join","z","utcOffset","floor","date","year","month","clone","ceil","p","w","D","ms","Q","g","S","_","O","arguments","b","locale","$L","utc","$u","$x","$offset","parse","prototype","$d","Date","NaN","test","match","substring","UTC","$y","getFullYear","$M","getMonth","$D","getDate","$W","getDay","$H","getHours","$m","getMinutes","$s","getSeconds","$ms","getMilliseconds","$utils","isValid","toString","isSame","startOf","endOf","isAfter","isBefore","$g","unix","valueOf","getTime","toDate","apply","$locale","weekStart","$set","daysInMonth","Number","round","subtract","format","invalidDate","meridiem","monthsShort","weekdaysMin","weekdaysShort","getTimezoneOffset","diff","toJSON","toISOString","toUTCString","Y","extend","$i","isDayjs","en","Ls","NinePopup","$dialog","dialog","popupBody","TreeUtil","sort","idField","parentIdField","sortField","item","roots","node","parentId","sortNodes","nodes","valA","valB","localeCompare","result","flatten","utilInstance","fmt","dayjs","ContentComponent","param","$popupWrapper","$bodySpace","$dialogComp","createRoot","unmount","React","selector","results","search","elem","found","startElement","currentElement","nodeType","Node","ELEMENT_NODE","matches","rootNode","num","characters","charAt","random","safe","promise","delay","exec","clearTimeout","execWithKey"],"mappings":"64BAAA,MAAMA,MAAgBC,IAIhBC,EAAiB,CACtBC,GAAI,CAAEC,gBAAgB,EAAOC,MAAO,SACpCC,MAAO,CAAEC,UAAU,GACnBC,QAAS,GACTC,OAAO,GAGc,oBAAXC,QAA2BA,OAAOC,yBAC5CD,OAAOC,uBAAyBT,GAIjC,MAAMU,EAA4B,oBAAXF,OAAyBA,OAAOC,uBAAyBT,EAEnEW,EAAmBC,IAC/Bd,EAAUe,IAAID,GACdA,EAAG,MAAOF,GACH,IAAMZ,EAAUgB,OAAOF,IAIlBG,EAAS,IAAIC,MAAMN,EAAS,CACxCO,IAAA,CAAIC,EAAQC,EAAMC,KACjBF,EAAOC,GAAQC,EACftB,EAAUuB,QAAQT,GAAMA,EAAGO,EAAMD,KAC1B,GAERI,IAAA,CAAIJ,EAAQC,IACJD,EAAOC,KAIHI,EAAO,CACnBR,SAIA,WAAIT,GACH,OAAOkB,KAAKT,OAAOT,SAAW,EAC/B,EAEA,KAAAmB,CAAMC,EAAU,IACfC,OAAOC,QAAQF,GAASL,QAAQ,EAAEQ,EAAKT,MAEjB,iBAAVA,GAAgC,OAAVA,GAAmBU,MAAMC,QAAQX,GAGjEI,KAAKT,OAAOc,GAAOT,EAFnBI,KAAKT,OAAOc,GAAO,IAAKL,KAAKT,OAAOc,MAAST,KAOzB,oBAAXZ,SACVA,OAAOe,KAAOf,OAAOe,MAAQC,KAE/B,GCzDM,IAAAQ,GAAAC,EAAA,MAIN,WAAAC,CAAYC,EAAO,KAAMC,EAAQ,SAJ3BC,EAAAb,KAAAc,GACND,EAAAb,KAAAe,GACAF,EAAAb,KAAAgB,GAGCC,EAAAjB,KAAKe,EAAQJ,GACbM,EAAAjB,KAAKgB,EAASJ,EACf,CAEA,IAAAM,CAAKP,EAAMC,EAAQ,SAGlB,OAFAK,EAAAjB,KAAKe,EAAQJ,GACbM,EAAAjB,KAAKgB,EAASJ,GACPZ,IACR,CAqCA,OAAImB,GACH,IAAKC,EAAApB,KAAKc,EAAAO,GAALC,KAAAtB,YAA+B,OAEpC,MAAMuB,EAAQ,UAAUC,EAAAxB,KAAKgB,yBAC7B,OAAQQ,EAAAxB,KAAKe,GACVU,QAAQN,IAAIO,KAAKD,QAAS,MAAMD,EAAAxB,KAAKe,MAAUQ,GAC/CE,QAAQN,IAAIO,KAAKD,QACrB,CAEA,QAAIE,GACH,OAAKP,EAAApB,KAAKc,EAAAO,GAALC,KAAAtB,MACGwB,EAAAxB,KAAKe,GACVU,QAAQE,KAAKD,KAAKD,QAAS,MAAMD,EAAAxB,KAAKe,MAAU,mCAChDU,QAAQE,KAAKD,KAAKD,SAHe,MAIrC,CAEA,SAAIG,GAEH,OAAQJ,EAAAxB,KAAKe,GACVU,QAAQG,MAAMF,KAAKD,QAAS,MAAMD,EAAAxB,KAAKe,MAAU,kCACjDU,QAAQG,MAAMF,KAAKD,QACvB,GAtEAV,cACAC,EAAA,IAAAa,QAFMf,EAAA,IAAAgB,QAkBNT,EAAe,WAEd,GAAItB,MAAQA,KAAKR,QAAUQ,KAAKR,OAAOR,MAAO,CAC7C,MAAMgD,EAAchC,KAAKR,OAAOR,MAGhC,OAA2B,IAAvBgD,EAAYC,UAKW,IAAvBD,EAAYC,QAAmB1B,MAAMC,QAAQwB,EAAYE,SAExDT,OAAKT,GACDgB,EAAYE,OAAOC,SAASV,EAAAxB,KAAKe,IAInCgB,EAAYC,OACpB,CAGA,MAAsB,oBAAXhD,SAC0B,cAA7BA,OAAOmD,SAASC,UACO,cAA7BpD,OAAOmD,SAASC,UAChBpD,OAAOmD,SAASC,SAASC,WAAW,YAIvC,EA/CM5B,GA0EK,MAAC6B,EAAQ,IAAIC,EACH,oBAAXvD,SAAwBA,OAAOsD,MAAQA,GC5EjDE,EAAA,IAAAX,QACAY,EAAA,IAAAZ,QACAa,EAAA,IAAAb,QAHMc,EAAA,IAAAb,QAkCNc,EAAM,WACL,GAA2B,IAAvBpB,EAAAxB,KAAKyC,GAAOI,OAAc,OAG9B,MAAMC,EAAQtB,EAAAxB,KAAKyC,GAAOM,OAAO,EAAGvB,EAAAxB,KAAKyC,GAAOI,QAC1CG,MAAWzE,IAEjBuE,EAAMjD,QAAQoD,IAGb,MAAMC,EAAa,GAAGD,EAAKE,KAAKxC,QAAQyC,KAAKC,UAAUJ,EAAKK,QAEvDN,EAAKO,IAAIL,KAEbD,EAAKE,QAAQF,EAAKK,MAClBN,EAAK3D,IAAI6D,MAIXjC,EAAAjB,KAAKwC,EAAS,KACf,ECpDM,MAAMD,UAAciB,EAAY9C,YACnC,WAAAA,GACI+C,QACAzD,KAAKkB,KAAK,YAAa,QAC3B,EAGG,MAAMoB,EAAQ,IAAIC,ECTlB,MAAMmB,EACZ,WAAOC,GACN,IAAIC,EAAUC,SAASC,eAAe,0BACtC,IAAKF,IACJA,EAAUC,SAASE,cAAc,OACjCH,EAAQI,GAAK,yBACbJ,EAAQrC,MAAM0C,QAAU,yPAMxBL,EAAQM,UAAY,sCACpBL,SAASM,KAAKC,YAAYR,IAErBC,SAASC,eAAe,oBAAoB,CAChD,MAAMvC,EAAQsC,SAASE,cAAc,SACrCxC,EAAMyC,GAAK,kBACXzC,EAAM2C,UAAY,qaASlBL,SAASQ,KAAKD,YAAY7C,EAC3B,CAEDqC,EAAQrC,MAAM+C,QAAU,MACzB,CAEA,WAAOC,GACN,MAAMX,EAAUC,SAASC,eAAe,0BACpCF,IAASA,EAAQrC,MAAM+C,QAAU,OACtC,ECjCM,MAAME,EAAN,QAGCC,EAAA,IAAA5C,QAFP6C,EADYF,EACL,WAAWxF,OAAO2F,kBAAoB,IAE7C9D,EAHY2D,EAGLC,EAAW,CAACG,EAAQC,EAAKC,EAAO,CAAA,EAAIC,GAAc,KACxD,MAAMC,EAAWH,EAAIxC,WAAW,QAAUwC,EAAM,GAAGL,EAAKS,WAAWJ,IAE/DE,GACHrB,EAAQC,OAIT,MAAMuB,EAAU,CAAA,EAGVJ,aAAgBK,WACrBD,EAAQ,gBAAkB,oBAG3B,MAAMhF,EAAU,CACf0E,SACAM,WAGD,IAAIE,EAAYJ,EAQhB,MAPe,QAAXJ,EACHQ,GAAa,IAAI,IAAIC,gBAAgBP,KAGrC5E,EAAQiE,KAAOW,aAAgBK,SAAWL,EAAO1B,KAAKC,UAAUyB,GAG1DQ,MAAMF,EAAWlF,GACtBqF,KAAKC,MAAMC,IACX,IAAKA,EAAIC,GAAI,CACZ,MAAMC,QAAaF,EAAIE,OACvB,MAAM,IAAIC,MAAM,WAAWH,EAAII,YAAYF,IAC5C,CACA,OAAOF,EAAIK,SAEXC,MAAMC,IAEN,MADA1D,EAAMV,MAAM,aAAagD,EAAOqB,kBAAkBjB,QAAgBgB,GAC5DA,IAENE,QAAQ,KACJnB,GACHrB,EAAQa,WAMZG,EAnDYF,EAmDL,MAAM,CAACK,EAAKC,EAAO,CAAA,EAAIC,GAAc,WAAS,OAAAvD,EAAAf,EAAA+D,EAAKC,GAALnD,KAAAb,EAAc,MAAOoE,EAAKC,EAAMC,KACrFL,EApDYF,EAoDL,OAAO,CAACK,EAAKC,EAAO,CAAA,EAAIC,GAAc,WAAS,OAAAvD,EAAAf,EAAA+D,EAAKC,GAALnD,KAAAb,EAAc,OAAQoE,EAAKC,EAAMC,KAYvFL,EAhEYF,EAgEL,gBAAgBgB,MAAOX,EAAKsB,EAAO,GAAIjG,EAAU,MACvD,MAAMkG,QACLA,EAAU,eAAAC,aACVA,EAAe,QAAAC,aACfA,EAAe,WAAAC,UACfA,EAAY,IACTrG,EAEEsG,EAAWlG,MAAMC,QAAQ4F,GAAQA,EAAO,CAACA,GAE/CzC,EAAQC,OACR,IAAI8C,EAAa,EACbC,EAAe,KAEnB,MAAA,WAEC,IAAIC,EAAkB,EAEtB,IAAA,IAASC,EAAI,EAAGA,EAAIJ,EAAS3D,OAAQ+D,GAAKL,EAAW,CACpD,MAAMM,EAAW,IAAI1B,SACf2B,EAAQN,EAASO,MAAMH,EAAGA,EAAIL,GAC9BS,EAAc,GAEpBF,EAAMjH,QAAQ,CAACoH,EAAKC,KAEnB,MAAQd,CAACA,GAAUe,KAAaC,GAASH,EAInCI,EAAQ/G,MAAMC,QAAQ4G,GAAYA,EAAW,CAACA,GAE9CG,EAAc,GACpBD,EAAMxH,QAAQ0H,IACTA,aAAmBC,OACtBX,EAASY,OAAOpB,EAAckB,GAC9BD,EAAYI,KAAKf,QAInBK,EAAYU,KAAK,IAAKN,EAAME,kBAK7B,MAAMK,EAAW,IAAIC,KACpB,CAACxE,KAAKC,UAAU/C,MAAMC,QAAQ4F,GAAQa,EAAcA,EAAY,KAChE,CAAEa,KAAM,qBAMT,GAJAhB,EAASY,OAAOnB,EAAcqB,GAE9BjB,QAAqBlC,EAAKsD,KAAKjD,EAAKgC,GAAU,IAE1CH,IAAiBA,EAAaqB,SAAmC,OAAxBrB,EAAab,OAGzD,MAAM,IAAID,MAAM,aAAagB,UAF7BH,GAAcK,EAAMjE,MAItB,CACA,MAAO,IAAK6D,EAAcqB,SAAS,EAAMtB,eA5C1C,GA8CEP,QAAQ,IAAMxC,EAAQa,UAGzBG,EA/HYF,EA+HL,mBAAmBgB,MAAOX,EAAKoC,EAAM,CAAA,EAAI/G,EAAU,MACzD,MAAMkG,QACLA,EAAU,eAAAE,aACVA,EAAe,YACZpG,EAEJwD,EAAQC,OAER,IACC,MAAMkD,EAAW,IAAI1B,UAGbiB,CAACA,GAAUe,KAAaC,GAASH,EAKrCE,GAAgC,iBAAbA,GACtBhH,OAAOC,QAAQ+G,GAAUtH,QAAQ,EAAEQ,EAAKkH,MACnCA,aAAmBC,MACtBX,EAASY,OAAOpH,EAAKkH,KAMxB,MAAMI,EAAW,IAAIC,KAAK,CAACxE,KAAKC,UAAU+D,IAAQ,CAAES,KAAM,qBAC1DhB,EAASY,OAAOnB,EAAcqB,GAG9B,MAAMK,QAAiBxD,EAAKsD,KAAKjD,EAAKgC,GAAU,GAEhD,GAAImB,IAAaA,EAASD,SAA+B,OAApBC,EAASnC,QAC7C,MAAO,IAAKmC,EAAUD,SAAS,GAE/B,MAAM,IAAInC,MAAM,QAElB,OAASI,GAER,MADA1D,EAAMV,MAAM,4BAA6BoE,GACnCA,CACP,CAAA,QACCtC,EAAQa,MACT,IAGDG,EA5KYF,EA4KL,oBAAoBgB,MAAOX,EAAKsB,EAAO,GAAIjG,EAAU,MAC3D,MAAMkG,QACLA,EAAU,eAAAC,aACVA,EAAe,QAAAC,aACfA,EAAe,WAAAC,UACfA,EAAY,IACTrG,EAGJwD,EAAQC,OAER,IAAI8C,EAAa,EACbC,EAAe,KAGnB,MAAA,WACC,IAAA,IAASE,EAAI,EAAGA,EAAIT,EAAKtD,OAAQ+D,GAAKL,EAAW,CAChD,MAAMM,EAAW,IAAI1B,SACf2B,EAAQX,EAAKY,MAAMH,EAAGA,EAAIL,GAC1BS,EAAc,GAEpBF,EAAMjH,QAASoH,IACd,MAAQb,CAACA,GAAUmB,WAASU,KAAab,GAASH,EAClDD,EAAYU,KAAKN,GACbG,aAAmBC,MACtBX,EAASY,OAAOpB,EAAckB,KAIhC,MAAMI,EAAW,IAAIC,KAAK,CAACxE,KAAKC,UAAU2D,IAAe,CAAEa,KAAM,qBAMjE,GALAhB,EAASY,OAAOnB,EAAcqB,GAG9BjB,QAAqBlC,EAAKsD,KAAKjD,EAAKgC,GAAU,IAE1CH,IAAiBA,EAAaqB,SAAmC,OAAxBrB,EAAab,OAGzD,MAAM,IAAID,MAAM,aAAagB,UAF7BH,GAAcK,EAAMjE,MAItB,CACA,MAAO,IAAK6D,EAAcqB,SAAS,EAAMtB,aAC1C,EA3BA,GA4BEV,MAAMC,IAEN,MADA1D,EAAMV,MAAM,qBAAsBoE,GAC5BA,IAENE,QAAQ,KAERxC,EAAQa,WA7NL,IAAM2D,EAAN1D,EAkOK,MAAC2D,EAAMD,ECpONE,EAAe,42VCErB,MAAMC,UAAmBC,YAK/B,WAAA5H,GACC+C,QAJD5C,EAAAb,KAAAuI,GACA1H,EAAAb,KAAAwI,GAsDA9D,EAAA1E,KAAA,YAAY,aACXwB,EAAAxB,KAAKwI,GAAQC,YAEZ,OAAAC,GAAA,OAAAjI,EAAAT,KAAK2I,mBAALlI,EAAiBmI,gBAAiB/E,SAAS+E,gBAA3CF,EAA2DG,SAG7DnE,EAAA1E,KAAA,QAAQ,KAGPwB,EAAAxB,KAAKwI,GAAQM,QACb9I,KAAK+I,WAGNlI,EAAAb,KAAAgJ,EAAQ,KACP,MAAM3E,EAAOrE,KAAKiJ,cAAc,SAE5B5E,IACHA,EAAK6E,iBAAiB,YAAa1H,EAAAxB,KAAKmJ,IACxC9E,EAAK6E,iBAAiB,aAAc1H,EAAAxB,KAAKoJ,KAO1CpJ,KAAKqJ,iBAAiB,4BAA4BxJ,QAAQyJ,IACzDA,EAAIC,QAAU,IAAMvJ,KAAKwJ,mBAAmB,QAO7CxJ,KAAKqJ,iBAAiB,OAAOxJ,QAAQyJ,SAStCzI,EAAAb,KAAAmJ,EAAeM,IAEd,GAAIA,EAAE/J,OAAOgK,QAAQ,WAAY,OACjC,GAAiB,IAAbD,EAAEE,QAAgBF,EAAEG,QAAUH,EAAEI,SAAWJ,EAAEK,SAAU,OAE3D,MAAMC,EAAOvI,EAAAxB,KAAKwI,GAAQwB,wBAC1B/I,EAAAjB,KAAKuI,EAAS,CACb0B,EAAGR,EAAES,QAAUH,EAAKI,KACpBC,EAAGX,EAAEY,QAAUN,EAAKO,MAGrB,MAAMC,EAAeC,IACpBhJ,EAAAxB,KAAKwI,GAAQjH,MAAMkJ,SAAW,QAC9BjJ,EAAAxB,KAAKwI,GAAQjH,MAAMmJ,OAAS,IAC5BlJ,EAAAxB,KAAKwI,GAAQjH,MAAM4I,KAAUK,EAAGN,QAAU1I,EAAAxB,KAAKuI,GAAO0B,EAA5B,KAC1BzI,EAAAxB,KAAKwI,GAAQjH,MAAM+I,IAASE,EAAGH,QAAU7I,EAAAxB,KAAKuI,GAAO6B,EAA5B,MAGpBO,EAAY,KACjB9G,SAAS+G,oBAAoB,YAAaL,GAC1C1G,SAAS+G,oBAAoB,UAAWD,IAGzC9G,SAASqF,iBAAiB,YAAaqB,GACvC1G,SAASqF,iBAAiB,UAAWyB,KAGtC9J,EAAAb,KAAAoJ,EAAgBK,IACf,GAAIA,EAAE/J,OAAOgK,QAAQ,WAAY,OAEjC,MAAMK,EAAOvI,EAAAxB,KAAKwI,GAAQwB,wBACpBa,EAAQpB,EAAEqB,eAAe,GAC/B7J,EAAAjB,KAAKuI,EAAS,CACb0B,EAAGY,EAAME,MAAQhB,EAAKI,KACtBC,EAAGS,EAAMG,MAAQjB,EAAKO,MAGvB,MAAMW,EAAeT,IACpB,MAAMU,EAAIV,EAAGM,eAAe,GAC5BtJ,EAAAxB,KAAKwI,GAAQjH,MAAMkJ,SAAW,QAC9BjJ,EAAAxB,KAAKwI,GAAQjH,MAAMmJ,OAAS,IAC5BlJ,EAAAxB,KAAKwI,GAAQjH,MAAM4I,KAAUe,EAAEH,MAAQvJ,EAAAxB,KAAKuI,GAAO0B,EAAzB,KAC1BzI,EAAAxB,KAAKwI,GAAQjH,MAAM+I,IAASY,EAAEF,MAAQxJ,EAAAxB,KAAKuI,GAAO6B,EAAzB,MAGpBe,EAAa,KAClBtH,SAAS+G,oBAAoB,YAAaK,GAC1CpH,SAAS+G,oBAAoB,WAAYO,IAG1CtH,SAASqF,iBAAiB,YAAa+B,GACvCpH,SAASqF,iBAAiB,WAAYiC,IA/IvC,CAEA,iBAAAC,GAEC,MAAMC,EAAIrL,KAAKkE,UACToH,EAAYtL,KAAKuL,aAAa,YAAc,UAElDjJ,EAAMnB,IAAIiH,GAEVpI,KAAKkE,UAAY,kBACPkE,sRAQekD,usBAanBD,kdAeNpK,EAAAjB,KAAKwI,EAAUxI,KAAKiJ,cAAc,WAClCzH,EAAAxB,KAAKgJ,GAAL1H,KAAAtB,KACD,CAkGA,kBAAAwJ,CAAmBgC,GAClBhK,EAAAxB,KAAKwI,GAAQiD,UAAUpM,IAAI,OAG3BqM,WAAW,KACVlK,EAAAxB,KAAKwI,GAAQM,QAEb9I,KAAK2L,cAAc,IAAIC,YAAY,SAAU,CAAEC,OAAQL,KACvDxL,KAAK+I,UACH,IACJ,EAjKAR,EAAA,IAAA1G,QACA2G,EAAA,IAAA3G,QAmEAmH,EAAA,IAAAnH,QA6BAsH,EAAA,IAAAtH,QA2BAuH,EAAA,IAAAvH,QAyCM,MAAMiK,UAAkBxD,YAE9B,WAAA5H,GACC+C,QACAzD,KAAK+L,aAAa,CAAEC,KAAM,QAC3B,CAEA,iBAAaC,CAAKC,EAAYC,EAASC,EAAOlM,EAASmM,aAEtD,MAAMC,EAAUJ,EAAWI,QAAQrG,cAC7B1G,EAAS,CACd,YAAa,KACb,aAAc,KACdgN,MAAO,UACPC,UAAW,WACP,OAAAC,EAAA,SAAA,OAAAhM,EAAAzB,OAAOe,WAAP,EAAAU,EAAalB,aAAb,EAAAmJ,EAAqBjK,aAAK6N,EAAQI,QAAQ,QAAS,IAAIA,QAAQ,SAAU,OAAQ,CAAA,KAClFxM,GAIJ2D,SAASwF,iBAAiBiD,GAASzM,QAAQ8M,GAAMA,EAAG5D,UACpD,MAAM4D,EAAK9I,SAASE,cAAcuI,GAC9B/M,EAAOgN,OAAOI,EAAGlB,UAAUpM,IAAIE,EAAOgN,OACtChN,EAAOiN,WAAWG,EAAGlB,UAAUpM,IAAIE,EAAOiN,WAC9C3I,SAASM,KAAKC,YAAYuI,GAG1BN,EAASM,EAAIR,EAAS5M,GAEtB,MAAMqN,EAAaD,EAAGhE,WAAWM,cAAc,eAG/C,OAFImD,GAAOQ,EAAWC,aAAa,UAAWT,GAEvC,IAAIU,QAASC,IAEnBH,EAAW1D,iBAAiB,SAAWO,GAAMsD,EAAQtD,EAAEoC,SAIvDc,EAAGK,YAAYD,EAASH,GAExBA,EAAWnE,aAEb,EAGIwE,eAAenN,IAAI,gBACvBmN,eAAeC,OAAO,cAAe7E,GCtN/B,MAAM8E,EAAN,cAA+BrB,EAGrC,WAAApL,GACC+C,OACD,CAGA,MAAA2J,CAAOjB,EAAS5M,GACfS,KAAK2I,WAAWzE,UAAY,iEAEKiI,EAAQO,QAAQ,MAAO,6GAEbnN,EAAO,kEACXA,EAAO,2EAG/C,CAEA,WAAAyN,CAAYD,EAASH,GACpB5M,KAAK2I,WAAWM,cAAc,OAAOM,QAAU,IAAMqD,EAAWpD,oBAAmB,EAEpF,GArBA9E,EADYyI,EACL,UAAU,sBAuBjBzI,EAxBYyI,EAwBL,UAAU,CAACE,EAAGnC,EAAGoC,IAAMxB,EAAUG,KAAKkB,EAAkBE,EAAGnC,EAAGoC,EAAG,CAACX,EAAIY,EAAKC,IAASb,EAAGS,OAAOG,EAAKC,KAxBpG,IAAMC,EAANN,EA4BA,MAAMO,EAAN,cAA6B5B,EAGnC,WAAApL,GACC+C,OACD,CAEA,MAAA2J,CAAOjB,EAAS5M,GACfS,KAAK2I,WAAWzE,UAAY,iEAEKiI,EAAQO,QAAQ,MAAO,2KAKzD,CAEA,WAAAM,CAAYD,EAASH,GAErB,GAlBAlI,EADYgJ,EACL,UAAU,oBAoBjBhJ,EArBYgJ,EAqBL,QAAQ,CAACL,EAAGnC,EAAGoC,IAAMxB,EAAUG,KAAKyB,EAAgBL,EAAGnC,EAAGoC,EAAG,CAACX,EAAIY,EAAKC,IAASb,EAAGS,OAAOG,EAAKC,KArBhG,IAAMG,GAAND,EAyBFT,eAAenN,IAAI,uBAAuBmN,eAAeC,OAAO,qBAAsBO,GACtFR,eAAenN,IAAI,qBAAqBmN,eAAeC,OAAO,mBAAoBS,ICnDhF,MAAMC,GAAN,cAA8B9B,EAGpC,WAAApL,GACC+C,OACD,CAEA,MAAA2J,CAAOjB,EAAS5M,GAEf+C,MAAMnB,IAAInB,MACVsC,MAAMnB,IAAInB,KAAK2I,YAEf3I,KAAK2I,WAAWzE,UAAY,0OAWKiI,EAAQO,QAAQ,MAAO,qPAKbnN,EAAO,kEACXA,EAAO,2EAG/C,CAEA,WAAAyN,CAAYD,EAASH,GACpB,MAAMiB,EAAW7N,KAAK2I,WAAWM,cAAc,YACjCjJ,KAAK2I,WAAWM,cAAc,OAGtCM,QAAU,IAAMqD,EAAWpD,mBAAmBqE,EAASjO,OAG7DkO,sBAAsB,IAAMD,EAASE,QACtC,GA1CArJ,EADYkJ,GACL,UAAU,qBA4CjBlJ,EA7CYkJ,GA6CL,SAAS,CAACP,EAAGnC,EAAGoC,IAAMxB,EAAUG,KAAK2B,GAAiBP,EAAGnC,EAAGoC,EAAG,CAACX,EAAIY,EAAKC,IAASb,EAAGS,OAAOG,EAAKC,KA7ClG,IAAMQ,GAANJ,GAgDFX,eAAenN,IAAI,sBACvBmN,eAAeC,OAAO,oBAAqBc,ICjDrC,MAAMC,GAAN,WAAAvN,GAAAG,EAAAb,KAAAkO,GA6CNxJ,EAAA1E,KAAA,QAAQ,CAACmM,EAASC,EAAQ,UAClBhL,EAAApB,KAAKkO,EAAAC,GAAL7M,KAAAtB,KAAc,QAASmM,EAASC,EAAO,YAG/C1H,EAAA1E,KAAA,UAAU,CAACmM,EAASC,EAAQ,YACpBhL,EAAApB,KAAKkO,EAAAC,GAAL7M,KAAAtB,KAAc,UAAWmM,EAASC,EAAO,YAGjD1H,EAAA1E,KAAA,SAAS,CAACmM,EAASC,EAAQ,WACnBhL,EAAApB,KAAKkO,EAAAC,GAAL7M,KAAAtB,KAAc,SAAUmM,EAASC,EAAO,WAChD,EAvDM8B,EAAA,IAAApM,QAONqM,EAAQ,SAACtG,EAAMsE,EAASC,EAAOgC,GAE9B,MAAMlO,EAAU,CAAEqM,MAAO6B,EAAc5B,UAAW,QAElD,IAAI6B,GAAa,EAEjB,MAMMC,EANW,CAChBC,MAAOZ,GACPa,QAASf,EACTgB,OAAQT,IAGcnG,GAEjB6G,EAAS,CACdC,IAAS,KAAQzO,EAAQqM,MAAQ,MAAcmC,GAC/CE,QAAS,KAAQ1O,EAAQqM,MAAQ,UAAkBmC,GACnDG,MAAS,KAAQ3O,EAAQsM,UAAY,QAAgBkC,GACrDI,IAAS,KAAQ5O,EAAQsM,UAAY,aAAqBkC,GAC1DK,KAAS,KAAQ7O,EAAQsM,UAAY,OAAekC,GAEpDnJ,KAAM,CAACwH,EAASiC,KACfX,GAAa,EACNC,EAAMzG,GAAMsE,EAASC,EAAOlM,GAASqF,KAAKwH,EAASiC,KAY5D,OAPAlC,QAAQC,UAAUxH,KAAK,KACjB8I,IACJA,GAAa,EACbC,EAAMzG,GAAMsE,EAASC,EAAOlM,MAIvBwO,CACR,EAzCAhK,EAFYuJ,GAEL,UAAU,IAwDlB9N,OAAO8O,OAAOlP,EAAM,IAAIkO,IC5DxB,MAAMiB,WAAmB5G,YAIxB,WAAA5H,GACC+C,QAHD5C,EAAAb,KAAAmP,GAYAtO,EAAAb,KAAAoP,EAAezC,IACd,MAAM0C,EAAO1C,EAAG2C,uBACVC,EAAO5C,EAAG6C,mBAChB,IAAKH,IAASE,EAEb,YADAtO,EAAAjB,KAAKmP,EAAQnP,KAAKyL,UAAUgE,SAAS,KAAO,IAAM,KAInD,MAAMC,EAAWL,EAAKrF,wBAChB2F,EAAWJ,EAAKvF,wBAElBhK,KAAKyL,UAAUgE,SAAS,KAC3BxO,EAAAjB,KAAKmP,EAAQ,KACHnP,KAAKyL,UAAUgE,SAAS,KAClCxO,EAAAjB,KAAKmP,EAAQ,KAEblO,EAAAjB,KAAKmP,EAASS,KAAKC,IAAIH,EAASpF,IAAMqF,EAASrF,KAAO,EAAK,IAAM,OAInEzJ,EAAAb,KAAA8P,EAAcrG,IAEbA,EAAEsG,iBACFtG,EAAEuG,kBAEF,MAAMC,EAAejQ,KAAKgK,wBACpBkG,EAA8B,MAAf1O,OAAK2N,GAGpBgB,EAAcD,EACjBzG,EAAES,QAAU+F,EAAa9F,KACzBV,EAAEY,QAAU4F,EAAa3F,IAEtB8F,EAAUvM,SAASE,cAAc,OACvCqM,EAAQC,UAAY,wBAAwB7O,EAAAxB,KAAKmP,KAEjDhP,OAAO8O,OAAOmB,EAAQ7O,MAAO,CAC5BkJ,SAAU,WACV6F,OAAQ,MACRC,WAAY,OACZC,QAAS,MACTC,cAAe,SAGhB,MAAMC,EAAO1Q,KAAK2Q,YAAY,CAAEC,UAAU,IACpCC,EAASH,aAAgBI,WAAaJ,EAAKK,KAAO/Q,KAAKgR,cACvD3B,EAAOrP,KAAKsP,uBACZC,EAAOvP,KAAKwP,mBAElB,IAAKqB,IAAWxB,IAASE,EAExB,YADAjN,EAAMX,KAAK,4CAIXkP,EAAOlI,YAAckI,GAAQzM,YAAYgM,GAC1C,MAAMa,EAA0Bb,EAAQc,aAAalH,wBAE/C0F,EAAWL,EAAKrF,wBAChB2F,EAAWJ,EAAKvF,wBAGhBmH,GAA8BjB,EACjCD,EAAa9F,KAAO8G,EAAwB9G,KAC5C8F,EAAa3F,IAAM2G,EAAwB3G,KAAO6F,EAEjDD,GACHE,EAAQ7O,MAAM+I,IAAM,IACpB8F,EAAQ7O,MAAM4I,KAAO,GAAGgH,MACxBf,EAAQ7O,MAAM6P,MAAQ,MACtBhB,EAAQ7O,MAAM8P,OAAS,SAEvBjB,EAAQ7O,MAAM4I,KAAO,IACrBiG,EAAQ7O,MAAM+I,IAAM,GAAG6G,MACvBf,EAAQ7O,MAAM8P,OAAS,MACvBjB,EAAQ7O,MAAM6P,MAAQ,QAGvBhB,EAAQ7O,MAAM+P,aAAe,aAC7BlB,EAAQ7O,MAAM+O,OAAS,QAEvB,MAAMiB,EAAWrB,EACdR,EAASvF,KAAO8G,EAAwB9G,KACxCuF,EAASpF,IAAM2G,EAAwB3G,IACpCkH,EAAWtB,EACdP,EAAS8B,MAAQR,EAAwB9G,KAAO8F,EAAamB,MAC7DzB,EAAS+B,OAAST,EAAwB3G,IAAM2F,EAAaoB,OAE1DM,EAASC,IACd,MAAMC,EAAY3B,EAAe0B,EAAU1H,QAAU0H,EAAUvH,QACzDyH,EAAqB5B,EACxB2B,EAAYZ,EAAwB9G,KACpC0H,EAAYZ,EAAwB3G,IAEjCyH,EAAanC,KAAKoC,IAAIT,EAAU3B,KAAKqC,IAAIH,EAAoBN,IAE/DtB,EACHE,EAAQ7O,MAAM4I,KAAO,GAAG4H,MAExB3B,EAAQ7O,MAAM+I,IAAM,GAAGyH,OAInBG,EAAO,KAEZlT,OAAO4L,oBAAoB,YAAa+G,GACxC3S,OAAO4L,oBAAoB,UAAWsH,GACtC9B,EAAQrH,SAER,MAAMoJ,EAAc7R,MAAM8R,KAAKvB,EAAOwB,UAChCC,EAAYH,EAAYlQ,OAAO0K,GAAmC,gBAA7BA,EAAGL,QAAQrG,eAGhD1E,EAAQvC,OAAOuT,iBAAiB1B,GAChC2B,EAAWtC,EAAe3O,EAAMkR,iBAAiB,cAAgBlR,EAAMkR,iBAAiB,WACxFC,EAAUC,WAAWH,IAAa,EAClCI,EAAWT,EAAYtP,OAAS,EAAIsP,EAAYtP,OAAS,EAAI,EAC7DgQ,EAAeD,EAAWF,EAG1BI,GADkB5C,EAAeyC,WAAWvC,EAAQ7O,MAAM4I,MAAQwI,WAAWvC,EAAQ7O,MAAM+I,MAC5D6G,EAE/B4B,EAAW7C,EAAeb,EAAKrF,wBAAwBoH,MAAQ/B,EAAKrF,wBAAwBqH,OAC5F2B,EAAW9C,EAAeX,EAAKvF,wBAAwBoH,MAAQ7B,EAAKvF,wBAAwBqH,OAElG,IAAI4B,EAAcF,EAAWD,EACzBI,EAAcF,EAAWF,EAGzBG,EAAc,IACjBC,GAAeD,EACfA,EAAc,GAEXC,EAAc,IACjBD,GAAeC,EACfA,EAAc,GAGf,MAAMC,EAAeb,EAAUc,IAAIC,GAASnD,EAAemD,EAAMrJ,wBAAwBoH,MAAQiC,EAAMrJ,wBAAwBqH,QAEzHiC,EAAoBnB,EAAYoB,OAAO,CAACC,EAAKC,IACd,gBAAhCA,EAAMnH,QAAQrG,cACVuN,GAAOtD,EAAeuD,EAAMzJ,wBAAwBoH,MAAQqC,EAAMzJ,wBAAwBqH,QAE3FmC,EACL,GAEGE,EAAsBxD,EAAeW,EAAO7G,wBAAwBoH,MAAQP,EAAO7G,wBAAwBqH,OAC3GsC,EAAiBD,EAAqBJ,EAAoBT,EAGhEvQ,EAAMnB,IAAI,uCACVmB,EAAMnB,IAAI,+BAA+BuS,KACzCpR,EAAMnB,IAAI,8BAA8BmS,KACxChR,EAAMnB,IAAI,oBAAoBuR,gBAAsBE,KACpDtQ,EAAMnB,IAAI,0BAA0B4R,qBAA4BC,KAChE1Q,EAAMnB,IAAI,uBAAuB2R,KACjCxQ,EAAMnB,IAAI,wBAAwB8R,mBAA6BC,KAE/DZ,EAAUzS,QAAQ,CAACwT,EAAOO,KACzB,MAAMC,EAAiD,OAAlCR,EAAMpK,cAAc,UACnC6K,EAAc5D,EAAemD,EAAMrJ,wBAAwBoH,MAAQiC,EAAMrJ,wBAAwBqH,OACvG/O,EAAMnB,IAAI,iBAAiByS,OAAWC,EAAe,SAAW,sBAAsBC,EAAYC,QAAQ,YAAYV,IAAUhE,EAAO4D,EAAeI,IAAU9D,EAAO2D,EAAcC,EAAaS,IAASG,QAAQ,QAEpNzR,EAAMnB,IAAI,uCAEV,IAAI6S,EAAU,EACd1B,EAAUzS,QAAQ,CAACwT,EAAOO,KACzB,IAAIK,EAEHA,EADGZ,IAAUhE,EACH4D,EACAI,IAAU9D,EACV2D,EAEAC,EAAaS,GAGxB,MAAMM,EAAeD,EAAUN,EAG/BrR,EAAMnB,IAAIkS,GAENA,EAAM5H,UAAUgE,SAAS,WAG5B4D,EAAM9R,MAAM4S,KAAO,OAAOF,MAI1BZ,EAAM9R,MAAM4S,KAAO,GAAGD,KAAgBA,MAGvCF,GAAWE,IAGZ5R,EAAMnB,IAAI,eAAe2R,KACzBxQ,EAAMnB,IAAI,uBAAuB6S,MAGlChV,OAAOkK,iBAAiB,YAAayI,GACrC3S,OAAOkK,iBAAiB,UAAWgJ,KAOpCrR,EAAAb,KAAAgJ,EAAQ,KACPxH,EAAAxB,KAAKoP,GAAL9N,KAAAtB,KAAiBA,MACjBA,KAAKyL,UAAUpM,IAAImC,EAAAxB,KAAKmP,IAExB,MAAMiF,EAAWpU,KAAKkE,UAAUmQ,OAE1BC,EAAyB,KAAbF,EAAmB,2BAA6B,wDAAwDA,kCAEpHG,EAAexU,KAAKjB,QAAU,YAAYiB,KAAKjB,0BAA4B,GAEjFkB,KAAKkE,UAAY,GACjB,MAAMsQ,EAAW3Q,SAASE,cAAc,YAExCyQ,EAAStQ,UAAY,0HAGjBqQ,4BAEDD,cAGHtU,KAAK2I,WAAWvE,YAAYoQ,EAASC,QAAQC,WAAU,IAEvD1U,KAAK2I,WAAWU,iBAAiB,SAASxJ,QAAQ8M,IACjDA,EAAGzD,iBAAiB,YAAaO,GAAKjI,EAAAxB,KAAK8P,GAALxO,UAAgBmI,MAGvDjI,EAAAxB,KAAK2U,GAALrT,KAAAtB,MAEAhB,OAAOkK,iBAAiB,SAAU,IAAM1H,EAAAxB,KAAK2U,GAALrT,KAAAtB,SAGzCa,EAAAb,KAAA2U,EAAiB,KAChB,MAAMzE,EAA8B,MAAf1O,OAAK2N,GACpB0B,EAAS7Q,KAAKgR,cACdsB,EAAYhS,MAAM8R,KAAKvB,EAAOwB,UAAUpQ,OAAO0K,GAAmC,kBAA7BA,EAAGL,QAAQrG,eACtE,GAAIqM,EAAUzP,OAAS,EAAG,OAE1B,MAAM+R,EAAa/D,EAAO7G,wBACpB6K,EAAmBvC,EAAUiB,OAAO,CAACC,EAAK7G,IAExC6G,GADMtD,EAAevD,EAAG3C,wBAAwBoH,MAAQzE,EAAG3C,wBAAwBqH,QAExF,GACGyD,EAAkB5E,EAAe0E,EAAWxD,MAAQwD,EAAWvD,OAErEiB,EAAUzS,QAAQwT,IACjB,MAAM0B,EAAO7E,EAAemD,EAAMrJ,wBAAwBoH,MAAQiC,EAAMrJ,wBAAwBqH,OAE1F2D,EADUF,GAAmBC,EAAOF,GACfC,EAC3BzB,EAAM9R,MAAM4S,KAAO,GAAGa,KAAYA,UAvQnChV,KAAK+L,aAAa,CAAEC,KAAM,QAC3B,CAEA,iBAAAZ,GAEC5J,EAAAxB,KAAKgJ,GAAL1H,KAAAtB,KACD,CA4MA,WAAIlB,GACH,OAAOkB,KAAKuL,aAAa,aAAe0C,GAAWnP,OACpD,uGAxNAqQ,EAAA,IAAAtN,QAYAuN,EAAA,IAAAvN,QAoBAiO,EAAA,IAAAjO,QA0LAmH,EAAA,IAAAnH,QAgCA8S,EAAA,IAAA9S,QAsBIoL,eAAenN,IAAI,kBACvBmN,eAAeC,OAAO,gBAAiBgC,mECtR8L,IAAIhE,EAAE,IAAIzB,EAAE,IAAIwL,EAAE,KAAKC,EAAE,cAActO,EAAE,SAASuO,EAAE,SAASC,EAAE,OAAOC,EAAE,MAAM/H,EAAE,OAAOgI,EAAE,QAAQC,EAAE,UAAUC,EAAE,OAAOC,EAAE,OAAOC,EAAE,eAAeC,EAAE,6FAA6FvL,EAAE,uFAAuFwL,EAAE,CAACjV,KAAK,KAAKkV,SAAS,2DAA2DC,MAAM,KAAKC,OAAO,wFAAwFD,MAAM,KAAKE,QAAQ,SAAS9K,GAAG,IAAIzB,EAAE,CAAC,KAAK,KAAK,KAAK,MAAMwL,EAAE/J,EAAE,IAAI,MAAM,IAAIA,GAAGzB,GAAGwL,EAAE,IAAI,KAAKxL,EAAEwL,IAAIxL,EAAE,IAAI,GAAG,GAAG4D,EAAE,SAASnC,EAAEzB,EAAEwL,GAAG,IAAIC,EAAEe,OAAO/K,GAAG,OAAOgK,GAAGA,EAAErS,QAAQ4G,EAAEyB,EAAE,GAAG5K,MAAMmJ,EAAE,EAAEyL,EAAErS,QAAQqT,KAAKjB,GAAG/J,CAAC,EAAEG,EAAE,CAAC8J,EAAE9H,EAAE8I,EAAE,SAASjL,GAAG,IAAIzB,GAAGyB,EAAEkL,YAAYnB,EAAErF,KAAKC,IAAIpG,GAAGyL,EAAEtF,KAAKyG,MAAMpB,EAAE,IAAIrO,EAAEqO,EAAE,GAAG,OAAOxL,GAAG,EAAE,IAAI,KAAK4D,EAAE6H,EAAE,EAAE,KAAK,IAAI7H,EAAEzG,EAAE,EAAE,IAAI,EAAEyG,EAAE,SAASnC,EAAEzB,EAAEwL,GAAG,GAAGxL,EAAE6M,OAAOrB,EAAEqB,OAAO,OAAOpL,EAAE+J,EAAExL,GAAG,IAAIyL,EAAE,IAAID,EAAEsB,OAAO9M,EAAE8M,SAAStB,EAAEuB,QAAQ/M,EAAE+M,SAAS5P,EAAE6C,EAAEgN,QAAQpX,IAAI6V,EAAEI,GAAGH,EAAEF,EAAErO,EAAE,EAAEwO,EAAE3L,EAAEgN,QAAQpX,IAAI6V,GAAGC,GAAE,EAAG,GAAGG,GAAG,UAAUJ,GAAGD,EAAErO,IAAIuO,EAAEvO,EAAEwO,EAAEA,EAAExO,KAAK,EAAE,EAAEyO,EAAE,SAASnK,GAAG,OAAOA,EAAE,EAAE0E,KAAK8G,KAAKxL,IAAI,EAAE0E,KAAKyG,MAAMnL,EAAE,EAAEyL,EAAE,SAASzL,GAAG,MAAM,CAAC0K,EAAEN,EAAElL,EAAEoL,EAAEoB,EAAEtJ,EAAEmI,EAAEJ,EAAEwB,EAAEpB,EAAED,EAAEJ,EAAE/H,EAAE8H,EAAEA,EAAEvO,EAAEkQ,GAAG5B,EAAE6B,EAAExB,GAAGrK,IAAI+K,OAAO/K,GAAG,IAAIjF,cAAcyG,QAAQ,KAAK,GAAG,EAAE0I,EAAE,SAASlK,GAAG,YAAO,IAASA,CAAC,GAAG8L,EAAE,KAAKH,EAAE,CAAA,EAAGA,EAAEG,GAAGpB,EAAE,IAAIe,EAAE,iBAAiBM,EAAE,SAAS/L,GAAG,OAAOA,aAAagM,MAAMhM,IAAIA,EAAEyL,GAAG,EAAEC,EAAE,SAAS1L,EAAEzB,EAAEwL,EAAEC,GAAG,IAAItO,EAAE,IAAI6C,EAAE,OAAOuN,EAAE,GAAG,iBAAiBvN,EAAE,CAAC,IAAI0L,EAAE1L,EAAExD,cAAc4Q,EAAE1B,KAAKvO,EAAEuO,GAAGF,IAAI4B,EAAE1B,GAAGF,EAAErO,EAAEuO,GAAG,IAAIC,EAAE3L,EAAEqM,MAAM,KAAK,IAAIlP,GAAGwO,EAAEvS,OAAO,EAAE,OAAOqI,EAAEkK,EAAE,GAAG,KAAK,CAAC,IAAIC,EAAE5L,EAAE9I,KAAKkW,EAAExB,GAAG5L,EAAE7C,EAAEyO,CAAC,CAAC,OAAOH,GAAGtO,IAAIoQ,EAAEpQ,GAAGA,IAAIsO,GAAG8B,CAAC,EAAEG,EAAE,SAASjM,EAAEzB,GAAG,GAAGwN,EAAE/L,GAAG,OAAOA,EAAEuL,QAAQ,IAAIxB,EAAE,iBAAiBxL,EAAEA,EAAE,CAAA,EAAG,OAAOwL,EAAEqB,KAAKpL,EAAE+J,EAAE3R,KAAK8T,UAAU,IAAIF,EAAEjC,EAAE,EAAEoC,EAAEhM,EAAEgM,EAAE3B,EAAEkB,EAAES,EAAEzQ,EAAEqQ,EAAEI,EAAET,EAAE,SAAS1L,EAAEzB,GAAG,OAAO0N,EAAEjM,EAAE,CAACoM,OAAO7N,EAAE8N,GAAGC,IAAI/N,EAAEgO,GAAGxN,EAAER,EAAEiO,GAAGC,QAAQlO,EAAEkO,SAAS,EAAE,IAAIT,aAAa,SAAStB,EAAE1K,GAAGlL,KAAKuX,GAAGX,EAAE1L,EAAEoM,OAAO,MAAK,GAAItX,KAAK4X,MAAM1M,GAAGlL,KAAK0X,GAAG1X,KAAK0X,IAAIxM,EAAEjB,GAAG,CAAA,EAAGjK,KAAK2W,IAAG,CAAE,CAAC,IAAItJ,EAAEuI,EAAEiC,UAAU,OAAOxK,EAAEuK,MAAM,SAAS1M,GAAGlL,KAAK8X,GAAA,SAAY5M,GAAG,IAAIzB,EAAEyB,EAAEoL,KAAKrB,EAAE/J,EAAEsM,IAAI,GAAG,OAAO/N,EAAE,OAAO,IAAIsO,KAAKC,KAAK,GAAGX,EAAEjC,EAAE3L,UAAU,IAAIsO,KAAK,GAAGtO,aAAasO,KAAK,OAAO,IAAIA,KAAKtO,GAAG,GAAG,iBAAiBA,IAAI,MAAMwO,KAAKxO,GAAG,CAAC,IAAIyL,EAAEzL,EAAEyO,MAAMvC,GAAG,GAAGT,EAAE,CAAC,IAAItO,EAAEsO,EAAE,GAAG,GAAG,EAAEC,GAAGD,EAAE,IAAI,KAAKiD,UAAU,EAAE,GAAG,OAAOlD,EAAE,IAAI8C,KAAKA,KAAKK,IAAIlD,EAAE,GAAGtO,EAAEsO,EAAE,IAAI,EAAEA,EAAE,IAAI,EAAEA,EAAE,IAAI,EAAEA,EAAE,IAAI,EAAEC,IAAI,IAAI4C,KAAK7C,EAAE,GAAGtO,EAAEsO,EAAE,IAAI,EAAEA,EAAE,IAAI,EAAEA,EAAE,IAAI,EAAEA,EAAE,IAAI,EAAEC,EAAE,CAAC,CAAC,OAAO,IAAI4C,KAAKtO,EAAE,CAA9X,CAAgYyB,GAAGlL,KAAKkB,MAAM,EAAEmM,EAAEnM,KAAK,WAAW,IAAIgK,EAAElL,KAAK8X,GAAG9X,KAAKqY,GAAGnN,EAAEoN,cAActY,KAAKuY,GAAGrN,EAAEsN,WAAWxY,KAAKyY,GAAGvN,EAAEwN,UAAU1Y,KAAK2Y,GAAGzN,EAAE0N,SAAS5Y,KAAK6Y,GAAG3N,EAAE4N,WAAW9Y,KAAK+Y,GAAG7N,EAAE8N,aAAahZ,KAAKiZ,GAAG/N,EAAEgO,aAAalZ,KAAKmZ,IAAIjO,EAAEkO,iBAAiB,EAAE/L,EAAEgM,OAAO,WAAW,OAAOhC,CAAC,EAAEhK,EAAEiM,QAAQ,WAAW,QAAQtZ,KAAK8X,GAAGyB,aAAa7D,EAAE,EAAErI,EAAEmM,OAAO,SAAStO,EAAEzB,GAAG,IAAIwL,EAAEkC,EAAEjM,GAAG,OAAOlL,KAAKyZ,QAAQhQ,IAAIwL,GAAGA,GAAGjV,KAAK0Z,MAAMjQ,EAAE,EAAE4D,EAAEsM,QAAQ,SAASzO,EAAEzB,GAAG,OAAO0N,EAAEjM,GAAGlL,KAAKyZ,QAAQhQ,EAAE,EAAE4D,EAAEuM,SAAS,SAAS1O,EAAEzB,GAAG,OAAOzJ,KAAK0Z,MAAMjQ,GAAG0N,EAAEjM,EAAE,EAAEmC,EAAEwM,GAAG,SAAS3O,EAAEzB,EAAEwL,GAAG,OAAOoC,EAAEjC,EAAElK,GAAGlL,KAAKyJ,GAAGzJ,KAAKP,IAAIwV,EAAE/J,EAAE,EAAEmC,EAAEyM,KAAK,WAAW,OAAOlK,KAAKyG,MAAMrW,KAAK+Z,UAAU,IAAI,EAAE1M,EAAE0M,QAAQ,WAAW,OAAO/Z,KAAK8X,GAAGkC,SAAS,EAAE3M,EAAEoM,QAAQ,SAASvO,EAAEzB,GAAG,IAAIwL,EAAEjV,KAAKkV,IAAImC,EAAEjC,EAAE3L,IAAIA,EAAE8L,EAAE8B,EAAEV,EAAEzL,GAAGwK,EAAE,SAASxK,EAAEzB,GAAG,IAAI7C,EAAEyQ,EAAET,EAAE3B,EAAEwC,GAAGM,KAAKK,IAAInD,EAAEoD,GAAG5O,EAAEyB,GAAG,IAAI6M,KAAK9C,EAAEoD,GAAG5O,EAAEyB,GAAG+J,GAAG,OAAOC,EAAEtO,EAAEA,EAAE8S,MAAMrE,EAAE,EAAEM,EAAE,SAASzK,EAAEzB,GAAG,OAAO4N,EAAET,EAAE3B,EAAEgF,SAAS/O,GAAGgP,MAAMjF,EAAEgF,OAAO,MAAM/E,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,MAAMnO,MAAM0C,IAAIwL,EAAE,EAAE7K,EAAEpK,KAAK2Y,GAAG/C,EAAE5V,KAAKuY,GAAGlL,EAAErN,KAAKyY,GAAGpN,EAAE,OAAOrL,KAAKyX,GAAG,MAAM,IAAI,OAAOlC,GAAG,KAAKC,EAAE,OAAON,EAAEQ,EAAE,EAAE,GAAGA,EAAE,GAAG,IAAI,KAAKJ,EAAE,OAAOJ,EAAEQ,EAAE,EAAEE,GAAGF,EAAE,EAAEE,EAAE,GAAG,KAAKtI,EAAE,IAAI0J,EAAEhX,KAAKma,UAAUC,WAAW,EAAEvD,GAAGzM,EAAE4M,EAAE5M,EAAE,EAAEA,GAAG4M,EAAE,OAAOtB,EAAER,EAAE7H,EAAEwJ,EAAExJ,GAAG,EAAEwJ,GAAGjB,GAAG,KAAKP,EAAE,KAAKI,EAAE,OAAOE,EAAEtK,EAAE,QAAQ,GAAG,KAAK+J,EAAE,OAAOO,EAAEtK,EAAE,UAAU,GAAG,KAAK8J,EAAE,OAAOQ,EAAEtK,EAAE,UAAU,GAAG,KAAKzE,EAAE,OAAO+O,EAAEtK,EAAE,eAAe,GAAG,QAAQ,OAAOrL,KAAKyW,QAAQ,EAAEpJ,EAAEqM,MAAM,SAASxO,GAAG,OAAOlL,KAAKyZ,QAAQvO,GAAE,EAAG,EAAEmC,EAAEgN,KAAK,SAASnP,EAAEzB,GAAG,IAAIwL,EAAE3H,EAAE+J,EAAEV,EAAEzL,GAAGqK,EAAE,OAAOvV,KAAKyX,GAAG,MAAM,IAAI/B,GAAGT,EAAE,CAAA,EAAGA,EAAEI,GAAGE,EAAE,OAAON,EAAEQ,GAAGF,EAAE,OAAON,EAAEK,GAAGC,EAAE,QAAQN,EAAEO,GAAGD,EAAE,WAAWN,EAAEG,GAAGG,EAAE,QAAQN,EAAEE,GAAGI,EAAE,UAAUN,EAAErO,GAAG2O,EAAE,UAAUN,EAAEC,GAAGK,EAAE,eAAeN,GAAG3H,GAAGqI,EAAErI,IAAI+H,EAAErV,KAAKyY,IAAIhP,EAAEzJ,KAAK2Y,IAAIlP,EAAE,GAAG6D,IAAIgI,GAAGhI,IAAIkI,EAAE,CAAC,IAAIpL,EAAEpK,KAAKyW,QAAQhX,IAAIgW,EAAE,GAAGrL,EAAE0N,GAAGpC,GAAGC,GAAGvL,EAAElJ,OAAOlB,KAAK8X,GAAG1N,EAAE3K,IAAIgW,EAAE7F,KAAKqC,IAAIjS,KAAKyY,GAAGrO,EAAEkQ,gBAAgBxC,EAAE,MAAMpC,GAAG1V,KAAK8X,GAAGpC,GAAGC,GAAG,OAAO3V,KAAKkB,OAAOlB,IAAI,EAAEqN,EAAE5N,IAAI,SAASyL,EAAEzB,GAAG,OAAOzJ,KAAKyW,QAAQ4D,KAAKnP,EAAEzB,EAAE,EAAE4D,EAAEvN,IAAI,SAASoL,GAAG,OAAOlL,KAAKqX,EAAEV,EAAEzL,KAAK,EAAEmC,EAAEhO,IAAI,SAAS6V,EAAEK,GAAG,IAAIE,EAAEC,EAAE1V,KAAKkV,EAAEqF,OAAOrF,GAAG,IAAIS,EAAE0B,EAAEV,EAAEpB,GAAGnL,EAAE,SAASc,GAAG,IAAIzB,EAAE0N,EAAEzB,GAAG,OAAO2B,EAAET,EAAEnN,EAAE6M,KAAK7M,EAAE6M,OAAO1G,KAAK4K,MAAMtP,EAAEgK,IAAIQ,EAAE,EAAE,GAAGC,IAAIL,EAAE,OAAOtV,KAAKP,IAAI6V,EAAEtV,KAAKuY,GAAGrD,GAAG,GAAGS,IAAIH,EAAE,OAAOxV,KAAKP,IAAI+V,EAAExV,KAAKqY,GAAGnD,GAAG,GAAGS,IAAIN,EAAE,OAAOjL,EAAE,GAAG,GAAGuL,IAAIrI,EAAE,OAAOlD,EAAE,GAAG,IAAIwL,GAAGH,EAAE,GAAGA,EAAEN,GAAG1L,EAAEgM,EAAEL,GAAGH,EAAEQ,EAAE7O,GAAGsE,EAAEuK,GAAGE,IAAI,EAAEtI,EAAErN,KAAK8X,GAAGkC,UAAU9E,EAAEU,EAAE,OAAOyB,EAAET,EAAEvJ,EAAErN,KAAK,EAAEqN,EAAEoN,SAAS,SAASvP,EAAEzB,GAAG,OAAOzJ,KAAKX,KAAI,EAAG6L,EAAEzB,EAAE,EAAE4D,EAAEqN,OAAO,SAASxP,GAAG,IAAIzB,EAAEzJ,KAAKiV,EAAEjV,KAAKma,UAAU,IAAIna,KAAKsZ,UAAU,OAAOrE,EAAE0F,aAAajF,EAAE,IAAIR,EAAEhK,GAAG,uBAAuBtE,EAAEyQ,EAAElB,EAAEnW,MAAMmV,EAAEnV,KAAK6Y,GAAGzD,EAAEpV,KAAK+Y,GAAG1D,EAAErV,KAAKuY,GAAGjL,EAAE2H,EAAEY,SAASP,EAAEL,EAAEc,OAAOR,EAAEN,EAAE2F,SAASpF,EAAE,SAAStK,EAAE+J,EAAErO,EAAEuO,GAAG,OAAOjK,IAAIA,EAAE+J,IAAI/J,EAAEzB,EAAEyL,KAAKtO,EAAEqO,GAAGlO,MAAM,EAAEoO,EAAE,EAAEM,EAAE,SAASvK,GAAG,OAAOmM,EAAElC,EAAEA,EAAE,IAAI,GAAGjK,EAAE,IAAI,EAAEyK,EAAEJ,GAAG,SAASrK,EAAEzB,EAAEwL,GAAG,IAAIC,EAAEhK,EAAE,GAAG,KAAK,KAAK,OAAO+J,EAAEC,EAAEjP,cAAciP,CAAC,EAAE,OAAOA,EAAExI,QAAQtC,EAAA,SAAYc,EAAEgK,GAAG,OAAOA,GAAAA,SAAYhK,GAAG,OAAOA,GAAG,IAAI,KAAK,OAAO+K,OAAOxM,EAAE4O,IAAItR,OAAM,GAAI,IAAI,OAAO,OAAOsQ,EAAElC,EAAE1L,EAAE4O,GAAG,EAAE,KAAK,IAAI,IAAI,OAAOhD,EAAE,EAAE,IAAI,KAAK,OAAOgC,EAAElC,EAAEE,EAAE,EAAE,EAAE,KAAK,IAAI,MAAM,OAAOG,EAAEP,EAAE4F,YAAYxF,EAAEC,EAAE,GAAG,IAAI,OAAO,OAAOE,EAAEF,EAAED,GAAG,IAAI,IAAI,OAAO5L,EAAEgP,GAAG,IAAI,KAAK,OAAOpB,EAAElC,EAAE1L,EAAEgP,GAAG,EAAE,KAAK,IAAI,IAAI,OAAOxC,OAAOxM,EAAEkP,IAAI,IAAI,KAAK,OAAOnD,EAAEP,EAAE6F,YAAYrR,EAAEkP,GAAGrL,EAAE,GAAG,IAAI,MAAM,OAAOkI,EAAEP,EAAE8F,cAActR,EAAEkP,GAAGrL,EAAE,GAAG,IAAI,OAAO,OAAOA,EAAE7D,EAAEkP,IAAI,IAAI,IAAI,OAAO1C,OAAOd,GAAG,IAAI,KAAK,OAAOkC,EAAElC,EAAEA,EAAE,EAAE,KAAK,IAAI,IAAI,OAAOM,EAAE,GAAG,IAAI,KAAK,OAAOA,EAAE,GAAG,IAAI,IAAI,OAAOE,EAAER,EAAEC,GAAE,GAAI,IAAI,IAAI,OAAOO,EAAER,EAAEC,GAAE,GAAI,IAAI,IAAI,OAAOa,OAAOb,GAAG,IAAI,KAAK,OAAOiC,EAAElC,EAAEC,EAAE,EAAE,KAAK,IAAI,IAAI,OAAOa,OAAOxM,EAAEwP,IAAI,IAAI,KAAK,OAAO5B,EAAElC,EAAE1L,EAAEwP,GAAG,EAAE,KAAK,IAAI,MAAM,OAAO5B,EAAElC,EAAE1L,EAAE0P,IAAI,EAAE,KAAK,IAAI,IAAI,OAAOvS,EAAE,OAAO,KAAntBsO,CAAytBhK,IAAItE,EAAE8F,QAAQ,IAAI,GAAG,EAAG,EAAEW,EAAE+I,UAAU,WAAW,OAAO,IAAIxG,KAAK4K,MAAMxa,KAAK8X,GAAGkD,oBAAoB,GAAG,EAAE3N,EAAE4N,KAAK,SAAS/F,EAAEO,EAAEC,GAAG,IAAIC,EAAEvL,EAAEpK,KAAK4V,EAAEyB,EAAEV,EAAElB,GAAGpI,EAAE8J,EAAEjC,GAAG7J,GAAGgC,EAAE+I,YAAYpW,KAAKoW,aAAa3M,EAAEuN,EAAEhX,KAAKqN,EAAEwJ,EAAE,WAAW,OAAOQ,EAAEhK,EAAEjD,EAAEiD,EAAE,EAAE,OAAOuI,GAAG,KAAKJ,EAAEG,EAAEkB,IAAI,GAAG,MAAM,KAAKvB,EAAEK,EAAEkB,IAAI,MAAM,KAAKtB,EAAEI,EAAEkB,IAAI,EAAE,MAAM,KAAKvJ,EAAEqI,GAAGqB,EAAE3L,GAAG,OAAO,MAAM,KAAKgK,EAAEM,GAAGqB,EAAE3L,GAAG,MAAM,MAAM,KAAK+J,EAAEO,EAAEqB,EAAE/B,EAAE,MAAM,KAAKE,EAAEQ,EAAEqB,EAAEvN,EAAE,MAAM,KAAK7C,EAAE+O,EAAEqB,EAAE9L,EAAE,MAAM,QAAQyK,EAAEqB,EAAE,OAAOtB,EAAEC,EAAE0B,EAAEhC,EAAEM,EAAE,EAAEtI,EAAEiN,YAAY,WAAW,OAAOta,KAAK0Z,MAAMpE,GAAGmD,EAAE,EAAEpL,EAAE8M,QAAQ,WAAW,OAAOtD,EAAE7W,KAAKuX,GAAG,EAAElK,EAAEiK,OAAO,SAASpM,EAAEzB,GAAG,IAAIyB,EAAE,OAAOlL,KAAKuX,GAAG,IAAItC,EAAEjV,KAAKyW,QAAQvB,EAAE0B,EAAE1L,EAAEzB,GAAE,GAAI,OAAOyL,IAAID,EAAEsC,GAAGrC,GAAGD,CAAC,EAAE5H,EAAEoJ,MAAM,WAAW,OAAOY,EAAET,EAAE5W,KAAK8X,GAAG9X,KAAK,EAAEqN,EAAE4M,OAAO,WAAW,OAAO,IAAIlC,KAAK/X,KAAK+Z,UAAU,EAAE1M,EAAE6N,OAAO,WAAW,OAAOlb,KAAKsZ,UAAUtZ,KAAKmb,cAAc,IAAI,EAAE9N,EAAE8N,YAAY,WAAW,OAAOnb,KAAK8X,GAAGqD,aAAa,EAAE9N,EAAEkM,SAAS,WAAW,OAAOvZ,KAAK8X,GAAGsD,aAAa,EAAExF,CAAC,IAAIyF,EAAEnE,EAAEW,UAAU,OAAOV,EAAEU,UAAUwD,EAAE,CAAC,CAAC,MAAMnG,GAAG,CAAC,KAAKtO,GAAG,CAAC,KAAKuO,GAAG,CAAC,KAAKC,GAAG,CAAC,KAAKC,GAAG,CAAC,KAAKC,GAAG,CAAC,KAAKE,GAAG,CAAC,KAAKC,IAAI5V,QAAA,SAAkBqL,GAAGmQ,EAAEnQ,EAAE,IAAI,SAASzB,GAAG,OAAOzJ,KAAK6Z,GAAGpQ,EAAEyB,EAAE,GAAGA,EAAE,GAAG,IAAKiM,EAAEmE,OAAO,SAASpQ,EAAEzB,GAAG,OAAOyB,EAAEqQ,KAAKrQ,EAAEzB,EAAEyN,EAAEC,GAAGjM,EAAEqQ,IAAG,GAAIpE,CAAC,EAAEA,EAAEG,OAAOV,EAAEO,EAAEqE,QAAQvE,EAAEE,EAAE2C,KAAK,SAAS5O,GAAG,OAAOiM,EAAE,IAAIjM,EAAE,EAAEiM,EAAEsE,GAAG5E,EAAEG,GAAGG,EAAEuE,GAAG7E,EAAEM,EAAER,EAAE,GAAGQ,CAAC,CAAl6N1N,gCCG5E,MAAMkS,WAAkBrT,YAC9B,kBAAWgE,GAAY,MAAO,YAAc,CAE5C,WAAA5L,GACC+C,QACAzD,KAAK+L,aAAa,CAAEC,KAAM,QAC3B,CAEA,iBAAAZ,GAECpL,KAAK2I,WAAWzE,UAAY,2FAK7B,CAEA,KAAA4E,CAAM0C,EAAc,MACnB,MAAMoQ,EAAU5b,KAAK6b,OACjBD,GAEHA,EAAQpS,mBAAmBgC,EAE7B,CAGA,aAAIsQ,SACH,OAAO,OAAArb,EAAAT,KAAK2I,iBAAL,EAAAlI,EAAiBwI,cAAc,6BAA8B,IACrE,CAGA,UAAI4S,SACH,OAAO,OAAApb,EAAAT,KAAK2I,iBAAL,EAAAlI,EAAiBwI,cAAc,iBAAkB,IACzD,EAGIgE,eAAenN,IAAI,eAAemN,eAAeC,OAAO,aAAcyO,ICvCpE,MAAMI,GAAW,CAOvBC,KAAM,CAAClX,EAAMmX,EAAU,KAAMC,EAAgB,WAAYC,EAAY,eACpE,IAAKrX,GAAwB,IAAhBA,EAAKjC,aAAqB,GAGvC,MAAMuQ,EAAM,CAAA,EACZtO,EAAKjF,QAAQuc,IACZhJ,EAAIgJ,EAAKH,IAAY,IAAKG,EAAM/J,SAAU,MAI3C,MAAMgK,EAAQ,GACdvX,EAAKjF,QAAQuc,IACZ,MAAME,EAAOlJ,EAAIgJ,EAAKH,IAChBM,EAAWH,EAAKF,GAGlBK,GAAYnJ,EAAImJ,GACnBnJ,EAAImJ,GAAUlK,SAAS3K,KAAK4U,GAE5BD,EAAM3U,KAAK4U,KAKb,MAAME,EAAaC,IAClBA,EAAMT,KAAK,CAAC3G,EAAGgC,KACd,MAAMqF,EAAOrH,EAAE8G,GACTQ,EAAOtF,EAAE8E,GAGf,MAAoB,iBAATO,GAAqC,iBAATC,EAC/BD,EAAOC,EAER1G,OAAOyG,GAAQ,IAAIE,cAAc3G,OAAO0G,GAAQ,OAGxDF,EAAM5c,QAAQyc,IACTA,EAAKjK,SAASxP,OAAS,GAAG2Z,EAAUF,EAAKjK,aAI/CmK,EAAUH,GAGV,MAAMQ,EAAS,GACTC,EAAWL,IAChBA,EAAM5c,QAAQyc,IAEb,MAAMjK,SAAEA,KAAa+J,GAASE,EAC9BO,EAAOnV,KAAK0U,GACR/J,EAASxP,OAAS,GAAGia,EAAQzK,MAKnC,OAFAyK,EAAQT,GAEDQ,IC0GT,MAAME,GAAe,IAjKd,MAAA,WAAArc,GAGNgE,EAAA1E,KAAA,aAAa,CAACqL,EAAG2R,IACTC,GAAM5R,GAAGqP,OAAOsC,IAUxBtY,EAAA1E,KAAA,QAAQ,CAACkd,EAAkBC,EAAQ,CAAA,EAAI/Q,EAAQ,aAC9CvI,SAASwF,iBAAiBsS,GAAUrP,SAASzM,QAAQ8M,GAAMA,EAAG5D,UAE9D,MAAMqU,EAAgBvZ,SAASE,cAAc4X,GAAUrP,SAGvD,OAFAzI,SAASM,KAAKC,YAAYgZ,GAEnB,IAAItQ,QAASC,IACnB,MAAMsQ,EAAaD,EAActB,UAC3BwB,EAAcF,EAAcvB,OAE9BzP,GAASkR,GAAaA,EAAYzQ,aAAa,UAAWT,GAE9D,MAAMsE,EAAO6M,aAAWF,GAGxB,MAAAC,GAAAA,EAAapU,iBAAiB,SAAWO,IACxCsD,EAAQtD,EAAEoC,QAEVH,WAAW,KACVgF,EAAK8M,UACLJ,EAAcrU,UACZ,KAGJ2H,EAAKtD,OAAOqQ,EAAM1Z,cAAcmZ,EAAkB,CAAEpY,KAAMqY,KAE1DzR,WAAW,KACV,MAAA4R,GAAAA,EAAa7U,aACX,OAUL/D,EAAA1E,KAAA,mBAAmB,CAAC0d,EAAUhN,EAAO7M,YACpC,MAAM8Z,EAAU,GAEVC,EAAUtB,UACf,IAAKA,EAAM,OAGPA,EAAK3T,YACRiV,EAAOtB,EAAK3T,YAIb,OAAAlI,EAAA6b,EAAKjT,mBAAL5I,EAAAa,KAAAgb,EAAwBoB,GAAU7d,QAAQge,IACpCF,EAAQzb,SAAS2b,IACrBF,EAAQjW,KAAKmW,MAKEvB,EAAKjK,SAAW/R,MAAM8R,KAAKkK,EAAKjK,UAAY,IACpDxS,QAAQ4T,IAChBmK,EAAOnK,MAKT,OADAmK,EAAOlN,GACAiN,IASRjZ,EAAA1E,KAAA,gBAAgB,CAAC0d,EAAUhN,EAAO7M,kBACjC,IAAK6M,EAAM,OAAO,KAGlB,IAAIoN,EAAQ,OAAArd,EAAAiQ,EAAKzH,oBAAL,EAAAxI,EAAAa,KAAAoP,EAAqBgN,GACjC,GAAII,EAAO,OAAOA,EAGlB,GAAIpN,EAAK/H,aACRmV,EAAQ9d,KAAKiJ,cAAcyU,EAAUhN,EAAK/H,YACtCmV,GAAO,OAAOA,EAInB,MAAMzL,EAAW3B,EAAK2B,SAAW/R,MAAM8R,KAAK1B,EAAK2B,UAAY,GAC7D,IAAA,MAAWoB,KAASpB,EAEnB,GADAyL,EAAQ9d,KAAKiJ,cAAcyU,EAAUjK,GACjCqK,EAAO,OAAOA,EAGnB,OAAO,OASRpZ,EAAA1E,KAAA,UAAU,CAAC0d,EAAUK,WACpB,IAAKA,GAAoC,iBAAbL,EAAuB,OAAO,KAE1D,IAAIM,EAAiBD,EAErB,KAAOC,GAAgB,CAEtB,GAAIA,EAAeC,WAAaC,KAAKC,cAChCH,EAAeI,QAAQV,GAC1B,OAAOM,EAMT,MAAMK,EAAW,OAAA5d,EAAAud,EAAerN,oBAAflQ,EAAAa,KAAA0c,GAGhBA,EADGK,GAAYA,aAAoBvN,WAClBuN,EAAStN,KAETiN,EAAehN,eAAiB,IAEnD,CAEA,OAAO,OAGRtM,EAAA1E,KAAA,aAAcse,IACRA,IAAKA,EAAM,IAEhB,MAAMC,EAAY,uDAClB,IAAI1B,EAAS,GAEb,IAAA,IAASjW,EAAI,EAAGA,EAAI0X,EAAK1X,IACxBiW,GAAU0B,EAAWC,OAAO5O,KAAKyG,MAFTkI,GAEe3O,KAAK6O,WAG7C,OAAO5B,IAGRnY,EAAA1E,KAAA,OAAO,CACNgc,KAAMD,GAASC,MACjB,GAKA7b,OAAO8O,OAAOlP,EAAMgd,ICzIpBhd,EAAK2e,KC5BelZ,MAAOmZ,IAC1B,IAEC,MAAO,OADYA,EACL,KACf,OAAS3Y,GACR,MAAO,CAAC,KAAMA,EACf,GD2BDjG,EAAKoI,IAAMA,EACXpI,EAAKuC,MAAQA,EACbvC,EAAKZ,gBAAkBA,EACvBY,EAAKR,OAASA,GAAU,GAgBF,oBAAXP,SACVA,OAAOe,KAAOA,6Bd1DR,MAKN,WAAAW,CAAYke,EAAQ,IALd/d,EAAAb,KAAA2C,GACN9B,EAAAb,KAAAwC,EAAS,MACT3B,EAAAb,KAAAyC,EAAS,IACT5B,EAAAb,KAAA0C,GAGCzB,EAAAjB,KAAK0C,EAASkc,EACf,CAMA,IAAAC,CAAK1b,KAASG,GAEb9B,EAAAxB,KAAKyC,GAAOiF,KAAK,CAAEvE,OAAMG,SAGrB9B,EAAAxB,KAAKwC,IAAQsc,aAAatd,EAAAxB,KAAKwC,IAEnCvB,EAAAjB,KAAKwC,EAASkJ,WAAW,IAAMtK,OAAKuB,EAAAC,GAALtB,KAAAtB,MAAewB,OAAKkB,IACpD,CAEA,WAAAqc,CAAY1e,EAAK8C,KAASG,GAEzBrC,EAAAjB,KAAKyC,EAASjB,EAAAxB,KAAKyC,GAAOR,OAAOgB,GAAQA,EAAK5C,MAAQA,IAGtDmB,EAAAxB,KAAKyC,GAAOiF,KAAK,CAAErH,MAAK8C,OAAMG,SAE1B9B,EAAAxB,KAAKwC,IAAQsc,aAAatd,EAAAxB,KAAKwC,IACnCvB,EAAAjB,KAAKwC,EAASkJ,WAAW,IAAMtK,OAAKuB,EAAAC,GAALtB,KAAAtB,MAAewB,OAAKkB,IACpD","x_google_ignoreList":[12]}
|