sa2kit 1.6.2 → 1.6.3
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/audioDetection/index.js.map +1 -1
- package/dist/audioDetection/index.mjs.map +1 -1
- package/dist/{chunk-5XUE72Y3.mjs → chunk-6LEA37ZM.mjs} +2 -2
- package/dist/{chunk-5XUE72Y3.mjs.map → chunk-6LEA37ZM.mjs.map} +1 -1
- package/dist/chunk-EBP7AE6F.js +167 -0
- package/dist/chunk-EBP7AE6F.js.map +1 -0
- package/dist/chunk-MBG4DBGP.mjs +154 -0
- package/dist/chunk-MBG4DBGP.mjs.map +1 -0
- package/dist/{chunk-DQVPZTVC.js → chunk-QKXKXAAV.js} +2 -2
- package/dist/{chunk-DQVPZTVC.js.map → chunk-QKXKXAAV.js.map} +1 -1
- package/dist/imageCrop/index.js.map +1 -1
- package/dist/imageCrop/index.mjs.map +1 -1
- package/dist/index-DtLpANUB.d.mts +70 -0
- package/dist/index-DtLpANUB.d.ts +70 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/mmd/admin/index.d.mts +1 -1
- package/dist/mmd/admin/index.d.ts +1 -1
- package/dist/mmd/index.d.mts +16 -2
- package/dist/mmd/index.d.ts +16 -2
- package/dist/mmd/index.js +280 -130
- package/dist/mmd/index.js.map +1 -1
- package/dist/mmd/index.mjs +280 -130
- package/dist/mmd/index.mjs.map +1 -1
- package/dist/mmd/server/index.d.mts +1 -1
- package/dist/mmd/server/index.d.ts +1 -1
- package/dist/music/index.d.mts +30 -0
- package/dist/music/index.d.ts +30 -0
- package/dist/music/index.js +458 -0
- package/dist/music/index.js.map +1 -0
- package/dist/music/index.mjs +427 -0
- package/dist/music/index.mjs.map +1 -0
- package/dist/music/server/index.d.mts +1 -0
- package/dist/music/server/index.d.ts +1 -0
- package/dist/music/server/index.js +29 -0
- package/dist/music/server/index.js.map +1 -0
- package/dist/music/server/index.mjs +4 -0
- package/dist/music/server/index.mjs.map +1 -0
- package/dist/testYourself/admin/index.js +3 -3
- package/dist/testYourself/admin/index.mjs +1 -1
- package/dist/testYourself/index.js +7 -7
- package/dist/testYourself/index.js.map +1 -1
- package/dist/testYourself/index.mjs +2 -2
- package/dist/testYourself/index.mjs.map +1 -1
- package/dist/{types-DxYJqqes.d.mts → types-B60F7EZZ.d.mts} +16 -1
- package/dist/{types-DxYJqqes.d.ts → types-B60F7EZZ.d.ts} +16 -1
- package/dist/universalFile/server/index.js +5 -5
- package/dist/universalFile/server/index.mjs +1 -1
- package/package.json +32 -19
- package/tailwind.animations.js +5 -0
package/dist/mmd/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/mmd/utils/ammo-loader.ts","../../src/mmd/components/MMDPlayerBase.tsx","../../src/mmd/components/ControlPanel.tsx","../../src/mmd/components/SettingsPanel.tsx","../../src/mmd/components/MMDPlayerEnhancedDebugInfo.tsx","../../src/mmd/components/MMDPlayerEnhanced.tsx","../../src/mmd/components/MMDPlaylistDebugInfo.tsx","../../src/mmd/components/MMDPlaylist.tsx","../../src/mmd/visual-novel/DialogueBox.tsx","../../src/mmd/visual-novel/HistoryPanel.tsx","../../src/mmd/visual-novel/LoadingScreen.tsx","../../src/mmd/visual-novel/StartScreen.tsx","../../src/mmd/visual-novel/LoadingOverlay.tsx","../../src/mmd/visual-novel/SkipConfirmDialog.tsx","../../src/mmd/visual-novel/ChoiceMenu.tsx","../../src/mmd/visual-novel/MMDVisualNovel.tsx","../../src/mmd/music-player/components/MusicControls.tsx","../../src/mmd/music-player/components/PlaylistPanel.tsx","../../src/mmd/music-player/components/TrackInfo.tsx","../../src/mmd/music-player/MMDMusicPlayer.tsx"],"names":["THREE","forwardRef","useRef","useEffect","useImperativeHandle","OutlineEffect","EffectComposer","RenderPass","UnrealBloomPass","OrbitControls","MMDLoader","MMDAnimationHelper","mesh","Ammo","React","SkipBack","Pause","Play","SkipForward","Repeat","Repeat1","Camera","Grid3x3","Settings","Minimize","Maximize","Video","Check","User","ImageIcon","Music","X","useState","useCallback","StatusBadge","createPortal","Shuffle","ListMusic"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,IAAI,WAAA,GAAmC,IAAA;AAMhC,IAAM,QAAA,GAAW,CAAC,IAAA,GAAe,oBAAA,KAAuC;AAC7E,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,WAAA,GAAc,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AAE7C,IAAA,IAAI,OAAO,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AAErC,MAAA,MAAA,CAAO,IAAA,EAAK,CAAE,IAAA,CAAK,CAAC,GAAA,KAAa;AAC/B,QAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,MACb,CAAC,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,EAAU;AAElC,MAAA,OAAA,CAAQ,OAAO,IAAI,CAAA;AACnB,MAAA;AAAA,IACH;AAEA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,GAAA,GAAM,IAAA;AACb,IAAA,MAAA,CAAO,KAAA,GAAQ,IAAA;AAEf,IAAA,MAAA,CAAO,SAAS,MAAM;AACpB,MAAA,IAAI,OAAO,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AAErC,QAAA,MAAA,CAAO,IAAA,EAAK,CAAE,IAAA,CAAK,CAAC,GAAA,KAAa;AAG/B,UAAA,OAAA,CAAQ,GAAA,IAAO,OAAO,IAAI,CAAA;AAAA,QAC5B,CAAC,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAa;AACrB,UAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,GAAG,CAAA;AAChD,UAAA,MAAA,CAAO,GAAG,CAAA;AAAA,QACZ,CAAC,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,kDAAkD,CAAC,CAAA;AAAA,MACtE;AAAA,IACF,CAAA;AAEA,IAAA,MAAA,CAAO,OAAA,GAAU,CAAC,GAAA,KAAQ;AACxB,MAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,GAAG,CAAA;AACnD,MAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,IAAI,EAAE,CAAC,CAAA;AAAA,IACzD,CAAA;AAEA,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,EAClC,CAAC,CAAA;AAED,EAAA,OAAO,WAAA;AACT;;;ACxDA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,EAAMA,uBAAM,OAAA,GAAU,IAAA;AACxB;AASA,eAAe,qBAAA,CACb,MAAA,EACA,QAAA,EACA,KAAA,EACA,MAAA,EACe;AACf,EAAA,MAAM,WAA4B,EAAC;AACnC,EAAA,IAAI,SAAA,GAAY,CAAA;AAGhB,EAAA,MAAA,CAAO,QAAA,CAAS,CAAC,GAAA,KAAQ;AACvB,IAAA,IAAI,GAAA,YAAqBA,gBAAA,CAAA,IAAA,IAAQ,GAAA,YAAqBA,gBAAA,CAAA,WAAA,EAAa;AACjE,MAAA,SAAA,EAAA;AACA,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,IAAI,GAAA,CAAI,QAAA,GAAW,CAAC,GAAA,CAAI,QAAQ,CAAA;AAE5E,MAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,QAAA,KAAa;AAC9B,QAAA,IAAI,oBAA0BA,gBAAA,CAAA,QAAA,EAAU;AAEtC,UAAA,MAAM,YAAA,GAAe;AAAA,YACnB,KAAA;AAAA,YAAO,UAAA;AAAA,YAAY,SAAA;AAAA,YAAW,WAAA;AAAA,YAAa,aAAA;AAAA,YAC3C,QAAA;AAAA,YAAU,UAAA;AAAA,YAAY,aAAA;AAAA,YAAe,iBAAA;AAAA,YACrC,cAAA;AAAA,YAAgB,cAAA;AAAA,YAAgB,OAAA;AAAA;AAAA,YAEhC,aAAA;AAAA,YAAe,SAAA;AAAA,YAAW,WAAA;AAAA,YAAa;AAAA,WACzC;AAEA,UAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,IAAA,KAAS;AAC7B,YAAA,MAAM,OAAA,GAAW,SAAiB,IAAI,CAAA;AACtC,YAAA,IAAI,mBAAyBA,gBAAA,CAAA,OAAA,IAAW,CAAC,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG;AACnE,cAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,YACvB;AAAA,UACF,CAAC,CAAA;AAAA,QACH;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,IAAI,CAAA,sBAAA,EAAyB,SAAS,CAAA,YAAA,EAAe,QAAA,CAAS,MAAM,CAAA,gBAAA,CAAkB,CAAA;AAG9F,EAAA,MAAM,eAAA,GAAkB,QAAA,CAAS,GAAA,CAAI,CAAC,SAAS,KAAA,KAAU;AACvD,IAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AACpC,MAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AAGtB,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAA,CAAQ,IAAI,CAAA,0BAAA,EAA6B,KAAA,GAAQ,CAAC,CAAA,CAAA,EAAI,QAAA,CAAS,MAAM,CAAA,UAAA,CAAY,CAAA;AACjF,QAAA,OAAA,EAAQ;AACR,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,iBAAiB,gBAAA,EAAkB;AACrC,QAAA,IAAI,KAAA,CAAM,QAAA,IAAY,KAAA,CAAM,YAAA,GAAe,CAAA,EAAG;AAC5C,UAAA,OAAA,CAAQ,IAAI,CAAA,0BAAA,EAA6B,KAAA,GAAQ,CAAC,CAAA,CAAA,EAAI,QAAA,CAAS,MAAM,CAAA,gBAAA,CAAkB,CAAA;AACvF,UAAA,OAAA,EAAQ;AAAA,QACV,CAAA,MAAO;AAEL,UAAA,MAAM,SAAS,MAAM;AACnB,YAAA,OAAA,CAAQ,IAAI,CAAA,0BAAA,EAA6B,KAAA,GAAQ,CAAC,CAAA,CAAA,EAAI,QAAA,CAAS,MAAM,CAAA,QAAA,CAAU,CAAA;AAC/E,YAAA,KAAA,CAAM,mBAAA,CAAoB,QAAQ,MAAM,CAAA;AACxC,YAAA,KAAA,CAAM,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC1C,YAAA,OAAA,EAAQ;AAAA,UACV,CAAA;AAEA,UAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAW;AAC1B,YAAA,OAAA,CAAQ,IAAA,CAAK,6BAA6B,KAAA,GAAQ,CAAC,IAAI,QAAA,CAAS,MAAM,oBAAoB,CAAC,CAAA;AAC3F,YAAA,KAAA,CAAM,mBAAA,CAAoB,QAAQ,MAAM,CAAA;AACxC,YAAA,KAAA,CAAM,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC1C,YAAA,OAAA,EAAQ;AAAA,UACV,CAAA;AAEA,UAAA,KAAA,CAAM,gBAAA,CAAiB,QAAQ,MAAM,CAAA;AACrC,UAAA,KAAA,CAAM,gBAAA,CAAiB,SAAS,OAAO,CAAA;AAGvC,UAAA,UAAA,CAAW,MAAM;AACf,YAAA,KAAA,CAAM,mBAAA,CAAoB,QAAQ,MAAM,CAAA;AACxC,YAAA,KAAA,CAAM,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC1C,YAAA,OAAA,CAAQ,KAAK,CAAA,0BAAA,EAA6B,KAAA,GAAQ,CAAC,CAAA,CAAA,EAAI,QAAA,CAAS,MAAM,CAAA,SAAA,CAAW,CAAA;AACjF,YAAA,OAAA,EAAQ;AAAA,UACV,GAAG,GAAI,CAAA;AAAA,QACT;AAAA,MACF,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAI,CAAA,0BAAA,EAA6B,KAAA,GAAQ,CAAC,CAAA,CAAA,EAAI,QAAA,CAAS,MAAM,CAAA,gBAAA,CAAkB,CAAA;AACvF,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,MAAM,OAAA,CAAQ,IAAI,eAAe,CAAA;AACjC,EAAA,OAAA,CAAQ,IAAI,2CAA2C,CAAA;AAGvD,EAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC5B,IAAA,OAAA,CAAQ,WAAA,GAAc,IAAA;AAAA,EACxB,CAAC,CAAA;AAGK,EAAA,OAAA,CAAQ,IAAI,wCAAwC,CAAA;AACpD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AACnC,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAA,IAAI;AAEF,UAAA,MAAA,CAAO,QAAA,CAAS,CAAC,GAAA,KAAQ;AACvB,YAAA,IAAK,IAAY,MAAA,EAAQ;AACvB,cAAA,MAAM,IAAA,GAAO,GAAA;AACb,cAAA,MAAM,SAAA,GAAY,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,QAAQ,IAAI,IAAA,CAAK,QAAA,GAAW,CAAC,IAAA,CAAK,QAAQ,CAAA;AAG/E,cAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,QAAA,CAAS,eAAA,IACf,MAAA,CAAO,KAAK,IAAA,CAAK,QAAA,CAAS,eAAe,CAAA,CAAE,MAAA,GAAS,CAAA;AAE9E,cAAA,SAAA,CAAU,QAAQ,CAAA,CAAA,KAAK;AAErB,gBAAA,IAAI,CAAC,kBAAA,EAAoB;AAEvB,kBAAC,EAAU,YAAA,GAAe,KAAA;AAG1B,kBAAA,IAAI,IAAA,CAAK,SAAS,eAAA,EAAiB;AACjC,oBAAA,IAAA,CAAK,QAAA,CAAS,kBAAkB,EAAC;AAAA,kBACnC;AAGA,kBAAA,IAAK,KAAa,qBAAA,EAAuB;AACvC,oBAAC,IAAA,CAAa,wBAAwB,EAAC;AAAA,kBACzC;AACA,kBAAA,IAAK,KAAa,qBAAA,EAAuB;AACvC,oBAAC,IAAA,CAAa,wBAAwB,EAAC;AAAA,kBACzC;AACA,kBAAA,CAAA,CAAE,WAAA,GAAc,IAAA;AAAA,gBAClB;AAAA,cACF,CAAC,CAAA;AAED,cAAA,IAAK,KAAa,kBAAA,EAAoB;AACpC,gBAAC,KAAa,kBAAA,EAAmB;AAAA,cACnC;AAAA,YACF;AAAA,UACF,CAAC,CAAA;AAED,UAAA,QAAA,CAAS,MAAA,CAAO,OAAO,MAAM,CAAA;AAC7B,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gCAAA,EAAmC,CAAA,GAAI,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,QAC1D,SAAS,WAAA,EAAa;AACpB,UAAA,OAAA,CAAQ,IAAA,CAAK,qEAAqE,WAAW,CAAA;AAAA,QAC/F;AACA,QAAA,OAAA,EAAQ;AAAA,MACV,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAEN,EAAA,OAAA,CAAQ,IAAI,wDAAwD,CAAA;AACtE;AAEO,IAAM,aAAA,GAAgBC,iBAAA,CAAiD,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC5F,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,QAAQ,EAAC;AAAA,IACT,kBAAA,GAAqB,EAAE,OAAA,EAAS,IAAA,EAAK;AAAA,IACrC,QAAA,GAAW,KAAA;AAAA,IACX,IAAA,GAAO,IAAA;AAAA,IACP,MAAA,GAAS,CAAA;AAAA,IACT,KAAA,GAAQ,KAAA;AAAA,IACR,QAAA,GAAW,KAAA;AAAA,IACX,MAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AAGJ,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,YAAA,IAAgB,SAAA;AACjE,EAAA,MAAM,iBAAiB,EAAE,GAAG,MAAM,cAAA,EAAgB,GAAG,MAAM,cAAA,EAAe;AAC1E,EAAA,MAAM,eAAe,EAAE,GAAG,MAAM,YAAA,EAAc,GAAG,MAAM,YAAA,EAAa;AAGpE,EAAA,MAAM,YAAA,GAAeC,cAAuB,IAAI,CAAA;AAGhD,EAAA,MAAM,QAAA,GAAWA,cAA2B,IAAI,CAAA;AAChD,EAAA,MAAM,SAAA,GAAYA,cAAuC,IAAI,CAAA;AAC7D,EAAA,MAAM,WAAA,GAAcA,cAAmC,IAAI,CAAA;AAC3D,EAAA,MAAM,gBAAA,GAAmBA,cAA6B,IAAI,CAAA;AAC1D,EAAA,MAAM,WAAA,GAAcA,cAA8B,IAAI,CAAA;AACtD,EAAA,MAAM,WAAA,GAAcA,cAA6B,IAAI,CAAA;AACrD,EAAA,MAAM,SAAA,GAAYA,cAAY,IAAI,CAAA;AAClC,EAAA,MAAM,aAAA,GAAgBA,cAAgC,IAAI,CAAA;AAC1D,EAAA,MAAM,QAAA,GAAWA,aAAA,CAAoB,IAAUF,gBAAA,CAAA,KAAA,EAAO,CAAA;AACtD,EAAA,MAAM,cAAA,GAAiBE,cAAsB,IAAI,CAAA;AACjD,EAAA,MAAM,iBAAA,GAAoBA,cAA8B,IAAI,CAAA;AAG5D,EAAA,MAAM,UAAA,GAAaA,cAAO,KAAK,CAAA;AAC/B,EAAA,MAAM,YAAA,GAAeA,cAAO,KAAK,CAAA;AACjC,EAAA,MAAM,SAAA,GAAYA,cAAO,CAAC,CAAA;AAC1B,EAAA,MAAM,WAAA,GAAcA,cAAO,CAAC,CAAA;AAC5B,EAAA,MAAM,gBAAA,GAAmBA,cAAmC,IAAI,CAAA;AAChE,EAAA,MAAM,OAAA,GAAUA,cAAO,IAAI,CAAA;AAC3B,EAAA,MAAM,QAAA,GAAWA,cAA2B,IAAI,CAAA;AAGhD,EAAA,MAAM,kBAAkBA,aAAA,CAAO,EAAE,QAAQ,OAAA,EAAS,OAAA,EAAS,cAAc,CAAA;AACzE,EAAAC,gBAAA,CAAU,MAAM;AACd,IAAA,eAAA,CAAgB,OAAA,GAAU,EAAE,MAAA,EAAQ,OAAA,EAAS,SAAS,YAAA,EAAa;AAAA,EACrE,GAAG,CAAC,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,YAAY,CAAC,CAAA;AAI3C,EAAA,MAAM,uBAAuBD,aAAA,CAM1B;AAAA,IACD,SAAS,EAAC;AAAA,IACV,aAAa,EAAC;AAAA,IACd,QAAQ,EAAC;AAAA,IACT,SAAS,EAAC;AAAA,IACV,QAAQ;AAAC,GACV,CAAA;AAGD,EAAA,MAAM,YAAA,GAAeA,aAAA,CAAe,IAAA,CAAK,GAAA,EAAK,CAAA;AAC9C,EAAA,MAAM,mBAAA,GAAsBA,cAAe,CAAC,CAAA;AAG5C,EAAAE,0BAAA,CAAoB,KAAK,OAAO;AAAA,IAC9B,MAAM,MAAM;AACV,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACzB,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,MAAA,IAAI,CAAC,QAAA,CAAS,OAAA,CAAQ,OAAA,EAAS,QAAA,CAAS,QAAQ,KAAA,EAAM;AACtD,MAAA,eAAA,CAAgB,QAAQ,MAAA,IAAS;AAAA,IACnC,CAAA;AAAA,IACA,OAAO,MAAM;AACX,MAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AAC3B,MAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,MAAA,QAAA,CAAS,QAAQ,IAAA,EAAK;AACtB,MAAA,eAAA,CAAgB,QAAQ,OAAA,IAAU;AAAA,IACpC,CAAA;AAAA,IACA,MAAM,MAAM;AACV,MAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,MAAA,QAAA,CAAS,QAAQ,IAAA,EAAK;AACtB,MAAA,eAAA,CAAgB,QAAQ,OAAA,IAAU;AAAA,IACpC,CAAA;AAAA,IACA,IAAA,EAAM,CAAC,IAAA,KAAiB;AACtB,MAAA,OAAA,CAAQ,KAAK,iDAAiD,CAAA;AAAA,IAChE,CAAA;AAAA,IACA,gBAAgB,MAAM;AACnB,MAAA,MAAM,OAAA,GAAU,SAAS,OAAA,CAAQ,WAAA;AACjC,MAAA,MAAM,WAAW,WAAA,CAAY,OAAA;AAE7B,MAAA,IAAI,QAAA,GAAW,CAAA,IAAK,OAAA,CAAQ,OAAA,EAAS;AACnC,QAAA,OAAO,OAAA,GAAU,QAAA;AAAA,MACnB;AACA,MAAA,OAAO,OAAA;AAAA,IACV,CAAA;AAAA,IACA,WAAA,EAAa,MAAM,WAAA,CAAY,OAAA;AAAA,IAC/B,SAAA,EAAW,MAAM,YAAA,CAAa,OAAA;AAAA,IAC9B,UAAU,MAAM;AACd,MAAA,IAAI,CAAC,WAAA,CAAY,OAAA,EAAS,OAAO,EAAA;AACjC,MAAA,IAAI,QAAA,CAAS,OAAA,IAAW,SAAA,CAAU,OAAA,EAAS;AACzC,QAAA,WAAA,CAAY,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,OAAA,EAAS,UAAU,OAAO,CAAA;AAAA,MAChE;AACA,MAAA,OAAO,WAAA,CAAY,OAAA,CAAQ,UAAA,CAAW,SAAA,CAAU,WAAW,CAAA;AAAA,IAC7D,CAAA;AAAA,IACA,aAAa,MAAM;AACjB,MAAA,IAAI,CAAC,SAAA,CAAU,OAAA,IAAW,CAAC,YAAY,OAAA,EAAS;AAEhD,MAAA,MAAM,EAAE,cAAA,EAAgB,YAAA,EAAa,GAAI,KAAA;AAEzC,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,MAAM,GAAA,GAAM,cAAA;AACZ,QAAA,SAAA,CAAU,OAAA,CAAQ,SAAS,GAAA,CAAI,GAAA,CAAI,GAAG,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,MACpD,CAAA,MAAO;AACL,QAAA,SAAA,CAAU,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,IAAI,EAAE,CAAA;AAAA,MAC1C;AAEA,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,MAAM,MAAA,GAAS,YAAA;AACf,QAAA,WAAA,CAAY,OAAA,CAAQ,OAAO,GAAA,CAAI,MAAA,CAAO,GAAG,MAAA,CAAO,CAAA,EAAG,OAAO,CAAC,CAAA;AAAA,MAC7D,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,MACzC;AAEA,MAAA,WAAA,CAAY,QAAQ,MAAA,EAAO;AAC3B,MAAA,cAAA,GAAiB,KAAK,CAAA;AAAA,IACxB;AAAA,GACF,CAAE,CAAA;AAGF,EAAAD,gBAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AAE3B,IAAA,MAAM,OAAO,YAAY;AAEvB,MAAA,MAAM,IAAA,GAAO,EAAE,SAAA,CAAU,OAAA;AAGzB,MAAA,MAAM,iBAAiB,MAAM;AAC3B,QAAA,OAAO,IAAA,KAAS,SAAA,CAAU,OAAA,IAAW,CAAC,YAAA,CAAa,OAAA;AAAA,MACrD,CAAA;AAGA,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,YAAA,CAAa,QAAQ,SAAA,GAAY,EAAA;AAAA,MACnC;AAGA,MAAA,oBAAA,CAAqB,OAAA,GAAU;AAAA,QAC7B,SAAS,EAAC;AAAA,QACV,aAAa,EAAC;AAAA,QACd,QAAQ,EAAC;AAAA,QACT,SAAS,EAAC;AAAA,QACV,QAAQ;AAAC,OACX;AAGA,MAAA,IAAI,mBAAA,CAAoB,YAAY,CAAA,EAAG;AAErC,QAAA,YAAA,CAAa,OAAA,GAAU,KAAK,GAAA,EAAI;AAChC,QAAA,mBAAA,CAAoB,OAAA,GAAU,CAAA;AAC9B,QAAA,OAAA,CAAQ,GAAA,CAAI,mEAA8B,IAAI,IAAA,CAAK,aAAa,OAAO,CAAA,CAAE,gBAAgB,CAAA;AAAA,MAC3F,CAAA,MAAO;AAEL,QAAA,mBAAA,CAAoB,OAAA,EAAA;AACpB,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,EAAI,GAAI,YAAA,CAAa,OAAA;AAC9C,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,GAAK,CAAA;AAC9C,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAO,WAAA,GAAc,MAAS,GAAI,CAAA;AACvD,QAAA,OAAA,CAAQ,GAAA,CAAI,uDAA4B,mBAAA,CAAoB,OAAO,+BAAW,OAAO,CAAA,MAAA,EAAI,OAAO,CAAA,OAAA,CAAI,CAAA;AAAA,MACtG;AAEA,MAAA,IAAI;AAEF,QAAA,IAAI,KAAA,CAAM,aAAA,KAAkB,KAAA,IAAS,CAAC,mBAAmB,cAAA,EAAgB;AACvE,UAAA,OAAA,CAAQ,IAAI,mDAAmD,CAAA;AAC/D,UAAA,MAAM,QAAA,CAAS,MAAM,WAAW,CAAA;AAChC,UAAA,IAAI,gBAAe,EAAG;AACtB,UAAA,OAAA,CAAQ,IAAI,6CAA6C,CAAA;AAIzD,UAAA,MAAM,OAAQ,MAAA,CAAe,IAAA;AAC7B,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,OAAA,CAAQ,IAAI,0DAA0D,CAAA;AAGtE,YAAA,MAAM,0CAA0C,IAAA,CAAK,+BAAA;AACrD,YAAA,MAAM,gCAAgC,IAAA,CAAK,qBAAA;AAC3C,YAAA,MAAM,2BAA2B,IAAA,CAAK,gBAAA;AACtC,YAAA,MAAM,8CAA8C,IAAA,CAAK,mCAAA;AACzD,YAAA,MAAM,kCAAkC,IAAA,CAAK,uBAAA;AAI7C,YAAA,MAAM,gBAAgB,oBAAA,CAAqB,OAAA;AAE3C,YAAA,IAAA,CAAK,+BAAA,GAAkC,YAAY,IAAA,EAAa;AAC9D,cAAA,MAAM,GAAA,GAAM,IAAI,uCAAA,CAAwC,GAAG,IAAI,CAAA;AAC/D,cAAA,aAAA,CAAc,OAAA,CAAQ,KAAK,GAAG,CAAA;AAC9B,cAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oEAAA,EAAgE,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAA,CAAE,CAAA;AAC1G,cAAA,OAAO,GAAA;AAAA,YACT,CAAA;AAEA,YAAA,IAAA,CAAK,qBAAA,GAAwB,YAAY,IAAA,EAAa;AACpD,cAAA,MAAM,GAAA,GAAM,IAAI,6BAAA,CAA8B,GAAG,IAAI,CAAA;AACrD,cAAA,aAAA,CAAc,WAAA,CAAY,KAAK,GAAG,CAAA;AAClC,cAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,0DAAA,EAAsD,aAAA,CAAc,WAAA,CAAY,MAAM,CAAA,CAAE,CAAA;AACpG,cAAA,OAAO,GAAA;AAAA,YACT,CAAA;AAEA,YAAA,IAAA,CAAK,gBAAA,GAAmB,YAAY,IAAA,EAAa;AAC/C,cAAA,MAAM,GAAA,GAAM,IAAI,wBAAA,CAAyB,GAAG,IAAI,CAAA;AAChD,cAAA,aAAA,CAAc,MAAA,CAAO,KAAK,GAAG,CAAA;AAC7B,cAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qDAAA,EAAiD,aAAA,CAAc,MAAA,CAAO,MAAM,CAAA,CAAE,CAAA;AAC1F,cAAA,OAAO,GAAA;AAAA,YACT,CAAA;AAEA,YAAA,IAAA,CAAK,mCAAA,GAAsC,YAAY,IAAA,EAAa;AAClE,cAAA,MAAM,GAAA,GAAM,IAAI,2CAAA,CAA4C,GAAG,IAAI,CAAA;AACnE,cAAA,aAAA,CAAc,OAAA,CAAQ,KAAK,GAAG,CAAA;AAC9B,cAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wEAAA,EAAoE,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAA,CAAE,CAAA;AAC9G,cAAA,OAAO,GAAA;AAAA,YACT,CAAA;AAEA,YAAA,IAAA,CAAK,uBAAA,GAA0B,YAAY,IAAA,EAAa;AACtD,cAAA,MAAM,GAAA,GAAM,IAAI,+BAAA,CAAgC,GAAG,IAAI,CAAA;AACvD,cAAA,aAAA,CAAc,MAAA,CAAO,KAAK,GAAG,CAAA;AAC7B,cAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,4DAAA,EAAwD,aAAA,CAAc,MAAA,CAAO,MAAM,CAAA,CAAE,CAAA;AACjG,cAAA,OAAO,GAAA;AAAA,YACT,CAAA;AAEA,YAAA,OAAA,CAAQ,IAAI,kEAA6D,CAAA;AAAA,UAC3E;AAAA,QACF,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,IAAI,kCAAkC,CAAA;AAAA,QAChD;AAGA,QAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,QAAA,MAAM,KAAA,GAAQ,UAAU,WAAA,IAAe,GAAA;AACvC,QAAA,MAAM,MAAA,GAAS,UAAU,YAAA,IAAgB,GAAA;AAGzC,QAAA,MAAM,KAAA,GAAQ,IAAUH,gBAAA,CAAA,KAAA,EAAM;AAC9B,QAAA,IAAI,MAAM,eAAA,EAAiB;AACzB,UAAA,KAAA,CAAM,UAAA,GAAa,IAAUA,gBAAA,CAAA,KAAA,CAAM,KAAA,CAAM,eAAe,CAAA;AAAA,QAC1D,CAAA,MAAA,IAAW,MAAM,eAAA,EAAiB;AAChC,UAAA,MAAM,aAAA,GAAgB,IAAUA,gBAAA,CAAA,aAAA,EAAc;AAC9C,UAAA,aAAA,CAAc,IAAA,CAAK,KAAA,CAAM,eAAA,EAAiB,CAAC,OAAA,KAAY;AACrD,YAAA,KAAA,CAAM,UAAA,GAAa,OAAA;AAAA,UACrB,CAAC,CAAA;AAAA,QACH;AACA,QAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AAGnB,QAAA,MAAM,SAAS,IAAUA,gBAAA,CAAA,iBAAA,CAAkB,IAAI,KAAA,GAAQ,MAAA,EAAQ,KAAK,GAAI,CAAA;AACxE,QAAA,IAAI,MAAM,cAAA,EAAgB;AACvB,UAAA,MAAM,MAAM,KAAA,CAAM,cAAA;AAClB,UAAA,MAAA,CAAO,SAAS,GAAA,CAAI,GAAA,CAAI,GAAG,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,QAC1C,CAAA,MAAO;AACJ,UAAA,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA;AAAA,QAChC;AACA,QAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AAGpB,QAAA,MAAM,QAAA,GAAW,IAAUA,gBAAA,CAAA,aAAA,CAAc;AAAA,UACvC,SAAA,EAAW,CAAC,kBAAA,CAAmB,OAAA;AAAA,UAC/B,KAAA,EAAO,IAAA;AAAA,UACP,qBAAA,EAAuB;AAAA,SACxB,CAAA;AACD,QAAA,QAAA,CAAS,OAAA,CAAQ,OAAO,MAAM,CAAA;AAE9B,QAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,OAAA,GACjC,kBAAA,CAAmB,UAAA,IAAc,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,gBAAA,EAAkB,CAAC,CAAA,GACrE,MAAA,CAAO,gBAAA;AACX,QAAA,QAAA,CAAS,cAAc,UAAU,CAAA;AACjC,QAAA,OAAA,CAAQ,GAAA,CAAI,uCAAuC,UAAU,CAAA;AAG7D,QAAA,IAAI,gBAAe,EAAG;AAClB,UAAA,QAAA,CAAS,OAAA,EAAQ;AACjB,UAAA;AAAA,QACJ;AAGA,QAAA,SAAA,CAAU,SAAA,GAAY,EAAA;AAGtB,QAAA,QAAA,CAAS,UAAA,CAAW,MAAM,OAAA,GAAU,OAAA;AACpC,QAAA,QAAA,CAAS,UAAA,CAAW,MAAM,KAAA,GAAQ,MAAA;AAClC,QAAA,QAAA,CAAS,UAAA,CAAW,MAAM,MAAA,GAAS,MAAA;AACnC,QAAA,QAAA,CAAS,UAAA,CAAW,MAAM,OAAA,GAAU,MAAA;AACpC,QAAA,QAAA,CAAS,UAAA,CAAW,MAAM,QAAA,GAAW,UAAA;AAGrC,QAAA,IAAI,KAAA,CAAM,YAAA,KAAiB,KAAA,IAAS,CAAC,mBAAmB,mBAAA,EAAqB;AAC3E,UAAA,QAAA,CAAS,UAAU,OAAA,GAAU,IAAA;AAC7B,UAAA,QAAA,CAAS,UAAU,IAAA,GAAaA,gBAAA,CAAA,gBAAA;AAAA,QAClC;AAEA,QAAA,SAAA,CAAU,WAAA,CAAY,SAAS,UAAU,CAAA;AACzC,QAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAItB,QAAA,MAAM,MAAA,GAAS,IAAIK,yBAAA,CAAc,QAAA,EAAU;AAAA,UACzC,gBAAA,EAAkB,eAAe,SAAA,IAAa,IAAA;AAAA,UAC9C,cAAc,IAAUL,gBAAA,CAAA,KAAA,CAAM,eAAe,KAAA,IAAS,SAAS,EAAE,OAAA,EAAQ;AAAA,UACzE,YAAA,EAAc,CAAA;AAAA,UACd,gBAAA,EAAkB;AAAA,SACnB,CAAA;AACD,QAAA,gBAAA,CAAiB,OAAA,GAAU,MAAA;AAG3B,QAAA,MAAM,QAAA,GAAW,IAAIM,0BAAA,CAAe,QAAQ,CAAA;AAC5C,QAAA,MAAM,UAAA,GAAa,IAAIC,sBAAA,CAAW,KAAA,EAAO,MAAM,CAAA;AAC/C,QAAA,QAAA,CAAS,QAAQ,UAAU,CAAA;AAE3B,QAAA,MAAM,YAAY,IAAIC,2BAAA;AAAA,UACpB,IAAUR,gBAAA,CAAA,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA;AAAA,UAC/B,aAAa,QAAA,IAAY,CAAA;AAAA,UACzB,aAAa,MAAA,IAAU,GAAA;AAAA,UACvB,aAAa,SAAA,IAAa;AAAA,SAC5B;AACA,QAAA,QAAA,CAAS,QAAQ,SAAS,CAAA;AAC1B,QAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAGtB,QAAA,MAAM,eAAe,IAAUA,gBAAA,CAAA,YAAA,CAAa,QAAA,EAAU,KAAA,CAAM,yBAAyB,GAAG,CAAA;AACxF,QAAA,KAAA,CAAM,IAAI,YAAY,CAAA;AAEtB,QAAA,MAAM,WAAW,IAAUA,gBAAA,CAAA,gBAAA,CAAiB,QAAA,EAAU,KAAA,CAAM,6BAA6B,GAAG,CAAA;AAC5F,QAAA,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,EAAA,EAAI,CAAC,CAAA;AAC9B,QAAA,IAAI,KAAA,CAAM,iBAAiB,KAAA,EAAO;AAChC,UAAA,QAAA,CAAS,UAAA,GAAa,IAAA;AACtB,UAAA,QAAA,CAAS,MAAA,CAAO,OAAA,CAAQ,KAAA,GAAQ,kBAAA,CAAmB,UAAU,IAAA,GAAO,IAAA;AACpE,UAAA,QAAA,CAAS,MAAA,CAAO,OAAA,CAAQ,MAAA,GAAS,kBAAA,CAAmB,UAAU,IAAA,GAAO,IAAA;AACrE,UAAA,QAAA,CAAS,OAAO,IAAA,GAAO,CAAA,IAAA;AAAA,QACzB;AACA,QAAA,KAAA,CAAM,IAAI,QAAQ,CAAA;AAGlB,QAAA,MAAM,QAAA,GAAW,IAAIS,yBAAA,CAAc,MAAA,EAAQ,SAAS,UAAU,CAAA;AAC9D,QAAA,QAAA,CAAS,WAAA,GAAc,EAAA;AACvB,QAAA,QAAA,CAAS,WAAA,GAAc,GAAA;AACvB,QAAA,IAAI,MAAM,YAAA,EAAc;AACtB,UAAA,MAAM,SAAS,KAAA,CAAM,YAAA;AACrB,UAAA,QAAA,CAAS,OAAO,GAAA,CAAI,MAAA,CAAO,GAAG,MAAA,CAAO,CAAA,EAAG,OAAO,CAAC,CAAA;AAAA,QAClD,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,CAAA,EAAG,EAAA,EAAI,CAAC,CAAA;AAAA,QAC9B;AACA,QAAA,QAAA,CAAS,MAAA,EAAO;AAGhB,QAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,MAAM;AACvC,UAAA,cAAA,GAAiB,IAAI,CAAA;AAAA,QACvB,CAAC,CAAA;AAED,QAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAGtB,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,UAAA,GAAa,IAAUT,gBAAA,CAAA,UAAA,CAAW,EAAE,CAAA;AAC1C,UAAA,KAAA,CAAM,IAAI,UAAU,CAAA;AACpB,UAAA,aAAA,CAAc,OAAA,GAAU,UAAA;AAAA,QAC1B;AAGA,QAAA,MAAM,WAAW,MAAM;AACrB,UAAA,IAAI,CAAC,aAAa,OAAA,IAAW,CAAC,UAAU,OAAA,IAAW,CAAC,YAAY,OAAA,EAAS;AACzE,UAAA,MAAM,CAAA,GAAI,aAAa,OAAA,CAAQ,WAAA;AAC/B,UAAA,MAAM,CAAA,GAAI,aAAa,OAAA,CAAQ,YAAA;AAE/B,UAAA,IAAI,CAAA,KAAM,CAAA,IAAK,CAAA,KAAM,CAAA,EAAG;AAExB,UAAA,SAAA,CAAU,OAAA,CAAQ,SAAS,CAAA,GAAI,CAAA;AAC/B,UAAA,SAAA,CAAU,QAAQ,sBAAA,EAAuB;AAEzC,UAAA,WAAA,CAAY,OAAA,CAAQ,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAA;AAChC,UAAA,IAAI,YAAY,OAAA,EAAS;AACvB,YAAA,WAAA,CAAY,OAAA,CAAQ,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAA;AAAA,UAClC;AAAA,QACF,CAAA;AAEA,QAAA,MAAM,cAAA,GAAiB,IAAI,cAAA,CAAe,QAAQ,CAAA;AAClD,QAAA,cAAA,CAAe,QAAQ,SAAS,CAAA;AAChC,QAAA,iBAAA,CAAkB,OAAA,GAAU,cAAA;AAG5B,QAAA,QAAA,EAAS;AAIT,QAAA,OAAA,CAAQ,IAAI,yDAAyD,CAAA;AACrE,QAAA,OAAA,EAAQ;AAGR,QAAA,OAAA,CAAQ,IAAI,4CAAA,EAA8C;AAAA,UACxD,OAAO,SAAA,CAAU,SAAA;AAAA,UACjB,OAAO,SAAA,CAAU,cAAA;AAAA,UACjB,QAAQ,SAAA,CAAU;AAAA,SACnB,CAAA;AACD,QAAA,MAAM,MAAA,GAAS,IAAIU,qBAAA,EAAU;AAC7B,QAAA,MAAM,MAAA,GAAS,IAAIC,8BAAA,CAAmB;AAAA,UACpC,SAAA,EAAW;AAAA,SACZ,CAAA;AACD,QAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AAGpB,QAAA,MAAM,gBAAA,GAAmB,IAAI,OAAA,CAAsE,CAAC,SAAS,MAAA,KAAW;AACtH,UAAA,IAAI,UAAU,UAAA,EAAY;AACxB,YAAA,OAAA,CAAQ,GAAA,CAAI,4CAAA,EAA8C,SAAA,CAAU,UAAU,CAAA;AAC9E,YAAA,MAAA,CAAO,iBAAA;AAAA,cACL,SAAA,CAAU,SAAA;AAAA,cACV,SAAA,CAAU,UAAA;AAAA,cACV,CAAC,GAAA,KAAQ;AACP,gBAAA,OAAA,CAAQ,EAAE,IAAA,EAAM,GAAA,CAAI,MAAM,SAAA,EAAW,GAAA,CAAI,WAAW,CAAA;AAAA,cACtD,CAAA;AAAA,cACA,CAAC,GAAA,KAAQ;AACP,gBAAA,IAAI,IAAI,gBAAA,EAAkB;AACxB,kBAAA,MAAM,OAAA,GAAW,GAAA,CAAI,MAAA,GAAS,GAAA,CAAI,KAAA,GAAS,GAAA;AAC3C,kBAAA,cAAA,GAAiB,SAAS,cAAc,CAAA;AAAA,gBAC1C;AAAA,cACF,CAAA;AAAA,cACA,CAAC,GAAA,KAAQ,MAAA,CAAO,GAAG;AAAA,aACrB;AAAA,UACF,CAAA,MAAO;AACL,YAAA,OAAA,CAAQ,IAAI,oCAAoC,CAAA;AAChD,YAAA,MAAA,CAAO,IAAA;AAAA,cACL,SAAA,CAAU,SAAA;AAAA,cACV,CAACC,KAAAA,KAAS;AACR,gBAAA,OAAA,CAAQ,EAAE,IAAA,EAAMA,KAAAA,EAA2B,CAAA;AAAA,cAC7C,CAAA;AAAA,cACA,CAAC,GAAA,KAAQ;AACP,gBAAA,IAAI,IAAI,gBAAA,EAAkB;AACxB,kBAAA,MAAM,OAAA,GAAW,GAAA,CAAI,MAAA,GAAS,GAAA,CAAI,KAAA,GAAS,GAAA;AAC3C,kBAAA,cAAA,GAAiB,SAAS,OAAO,CAAA;AAAA,gBACnC;AAAA,cACF,CAAA;AAAA,cACA,CAAC,GAAA,KAAQ,MAAA,CAAO,GAAG;AAAA,aACrB;AAAA,UACF;AAAA,QACF,CAAC,CAAA;AAED,QAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAU,GAAI,MAAM,gBAAA;AAGlC,QAAA,IAAI,gBAAe,EAAG;AAEtB,QAAA,OAAA,CAAQ,GAAA,CAAI,iCAAiC,IAAI,CAAA;AAGjD,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,gBAAA,CAAiB,OAAA,GAAU,SAAA;AAC3B,UAAA,WAAA,CAAY,UAAU,SAAA,CAAU,QAAA;AAChC,UAAA,OAAA,CAAQ,GAAA,CAAI,qCAAA,EAAuC,SAAA,CAAU,QAAQ,CAAA;AAAA,QACvE;AAGA,QAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,QAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAIrB,QAAA,OAAA,CAAQ,IAAI,mEAAmE,CAAA;AAG/E,QAAA,MAAM,SAAA,GAAY,IAAUZ,gBAAA,CAAA,KAAA,EAAM;AAClC,QAAA,SAAA,CAAU,IAAI,IAAI,CAAA;AAClB,QAAA,MAAM,qBAAA,CAAsB,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,MAAM,CAAA;AAE7D,QAAA,IAAI,gBAAe,EAAG;AACtB,QAAA,OAAA,CAAQ,IAAI,0DAAqD,CAAA;AAGjE,QAAA,SAAA,CAAU,OAAO,IAAI,CAAA;AAGrB,QAAA,MAAM,GAAA,GAAM,IAAUA,gBAAA,CAAA,IAAA,EAAK,CAAE,cAAc,IAAI,CAAA;AAC/C,QAAA,IAAI,CAAC,GAAA,CAAI,OAAA,EAAQ,EAAG;AAChB,UAAA,MAAM,MAAA,GAAS,GAAA,CAAI,SAAA,CAAU,IAAUA,0BAAS,CAAA;AAChD,UAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,IAAUA,0BAAS,CAAA;AAC5C,UAAA,OAAA,CAAQ,GAAA,CAAI,+BAAA,EAAiC,EAAE,MAAA,EAAQ,MAAM,CAAA;AAE7D,UAAA,IAAI,CAAC,MAAM,YAAA,EAAc;AAErB,YAAA,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,MAAA,CAAO,IAAI,IAAA,CAAK,CAAA,GAAI,IAAA,EAAM,MAAA,CAAO,CAAC,CAAA;AAEhE,YAAA,IAAI,CAAC,MAAM,cAAA,EAAgB;AAGvB,cAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,IAAA,CAAK,GAAG,IAAA,CAAK,CAAA,EAAG,KAAK,CAAC,CAAA;AAC9C,cAAA,MAAM,OAAO,MAAA,GAAS,CAAA;AAGtB,cAAA,MAAA,CAAO,QAAA,CAAS,GAAA;AAAA,gBACZ,MAAA,CAAO,CAAA;AAAA;AAAA,gBACP,MAAA,CAAO,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,GAAA;AAAA;AAAA,gBACpB,OAAO,CAAA,GAAI;AAAA;AAAA,eACf;AACA,cAAA,OAAA,CAAQ,GAAA,CAAI,uCAAA,EAAyC,MAAA,CAAO,QAAQ,CAAA;AAAA,YACxE;AACA,YAAA,QAAA,CAAS,MAAA,EAAO;AAAA,UACpB;AAAA,QACJ;AAGA,QAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,aAAA,KAAkB,KAAA,IAAS,CAAC,kBAAA,CAAmB,cAAA;AAE3E,QAAA,MAAA,CAAO,IAAI,IAAA,EAAM;AAAA,UACf,SAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV,CAAA;AAED,QAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AACd,QAAA,OAAA,CAAQ,IAAI,4DAAuD,CAAA;AAGnE,QAAA,MAAM,iBAAiB,gEAAA,CAAiE,IAAA,CAAK,UAAU,SAAS,CAAA,IACxF,OAAO,UAAA,IAAc,GAAA;AAE7C,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,OAAA,CAAQ,IAAI,6EAAsE,CAAA;AAGlF,UAAA,IAAI,QAAA,CAAS,aAAa,cAAA,EAAgB;AACxC,YAAA,OAAA,CAAQ,IAAI,oDAA+C,CAAA;AAAA,UAC7D,CAAA,MAAO;AACL,YAAA,OAAA,CAAQ,IAAI,8DAAoD,CAAA;AAAA,UAClE;AAGA,UAAA,IAAI,uBAAA,GAA0B,CAAA;AAC9B,UAAA,IAAA,CAAK,QAAA,CAAS,CAAC,KAAA,KAAU;AACvB,YAAA,IAAI,KAAA,YAAuBA,gBAAA,CAAA,IAAA,IAAQ,KAAA,YAAuBA,gBAAA,CAAA,WAAA,EAAa;AACrE,cAAA,MAAM,SAAA,GAAY,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,QAAQ,IAAI,KAAA,CAAM,QAAA,GAAW,CAAC,KAAA,CAAM,QAAQ,CAAA;AAClF,cAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,QAAA,EAAU,GAAA,KAAQ;AACnC,gBAAA,IAAI,QAAA,YAA0BA,gBAAA,CAAA,iBAAA,IAC1B,QAAA,YAA0BA,gBAAA,CAAA,oBAAA,EAAsB;AAElD,kBAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,KAAA,EAAO,KAAA,EAAM;AAC5C,kBAAA,MAAM,cAAc,QAAA,CAAS,GAAA;AAG7B,kBAAA,MAAM,aAAA,GAAgB,IAAUA,gBAAA,CAAA,iBAAA,CAAkB;AAAA,oBAChD,OAAO,aAAA,IAAiB,QAAA;AAAA,oBACxB,GAAA,EAAK,WAAA;AAAA,oBACL,aAAa,QAAA,CAAS,WAAA;AAAA,oBACtB,SAAS,QAAA,CAAS,OAAA;AAAA,oBAClB,MAAM,QAAA,CAAS,IAAA;AAAA,oBACf,WAAW,QAAA,CAAS;AAAA,mBACrB,CAAA;AAGD,kBAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,QAAQ,CAAA,EAAG;AACjC,oBAAA,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,GAAI,aAAA;AAAA,kBACxB,CAAA,MAAO;AACL,oBAAA,KAAA,CAAM,QAAA,GAAW,aAAA;AAAA,kBACnB;AAGA,kBAAA,QAAA,CAAS,OAAA,EAAQ;AACjB,kBAAA,uBAAA,EAAA;AAAA,gBACF;AAAA,cACF,CAAC,CAAA;AAAA,YACH;AAAA,UACF,CAAC,CAAA;AAED,UAAA,IAAI,0BAA0B,CAAA,EAAG;AAC/B,YAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oCAAA,EAAkC,uBAAuB,CAAA,+BAAA,CAAiC,CAAA;AAAA,UACxG;AAGA,UAAA,MAAM,SAAA,GAAY,EAAA;AAClB,UAAA,IAAI,KAAK,QAAA,EAAU;AACjB,YAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,MAAA;AACtC,YAAA,IAAI,YAAY,SAAA,EAAW;AACzB,cAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,yCAAA,EAAkC,SAAS,CAAA,yBAAA,EAA4B,SAAS,CAAA,CAAA,CAAG,CAAA;AAChG,cAAA,OAAA,CAAQ,KAAK,CAAA,qEAAA,CAAuE,CAAA;AAAA,YACtF,CAAA,MAAO;AACL,cAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qCAAA,EAAmC,SAAS,CAAA,eAAA,CAAiB,CAAA;AAAA,YAC3E;AAAA,UACF;AAEA,UAAA,OAAA,CAAQ,IAAI,wDAAiD,CAAA;AAAA,QAC/D;AAGA,QAAA,IAAI,UAAU,UAAA,EAAY;AACxB,UAAA,MAAA,CAAO,aAAA;AAAA,YACL,SAAA,CAAU,UAAA;AAAA,YACV,MAAA;AAAA,YACA,CAAC,eAAA,KAAoB;AACnB,cAAA,IAAI,gBAAe,EAAG;AACtB,cAAA,MAAA,CAAO,IAAI,MAAA,EAAQ;AAAA,gBACjB,SAAA,EAAW;AAAA,eACZ,CAAA;AAAA,YACH,CAAA;AAAA,YACA,KAAA,CAAA;AAAA,YACA,CAAC,GAAA,KAAQ,OAAA,CAAQ,KAAA,CAAM,iCAAiC,GAAG;AAAA,WAC7D;AAAA,QACF;AAGA,QAAA,IAAI,UAAU,SAAA,EAAW;AACvB,UAAA,MAAM,QAAA,GAAW,IAAUA,gBAAA,CAAA,aAAA,EAAc;AACzC,UAAA,MAAA,CAAO,IAAI,QAAQ,CAAA;AAEnB,UAAA,MAAM,KAAA,GAAQ,IAAUA,gBAAA,CAAA,KAAA,CAAM,QAAQ,CAAA;AACtC,UAAA,MAAM,WAAA,GAAc,IAAUA,gBAAA,CAAA,WAAA,EAAY;AAE1C,UAAA,WAAA,CAAY,IAAA;AAAA,YACV,SAAA,CAAU,SAAA;AAAA,YACV,CAAC,MAAA,KAAW;AACV,cAAA,IAAI,gBAAe,EAAG;AACtB,cAAA,KAAA,CAAM,UAAU,MAAM,CAAA;AACtB,cAAA,KAAA,CAAM,OAAA,CAAQ,QAAQ,OAAO,CAAA;AAC7B,cAAA,KAAA,CAAM,UAAU,MAAM,CAAA;AACtB,cAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AAEnB,cAAA,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,gBAChB,KAAA,EAAO,CAAA;AAAA,gBACP,UAAU,MAAA,CAAO;AAAA,eACX,CAAA;AAAA,YACV,CAAA;AAAA,YACA,KAAA,CAAA;AAAA,YACA,CAAC,GAAA,KAAQ,OAAA,CAAQ,KAAA,CAAM,yBAAyB,GAAG;AAAA,WACrD;AAAA,QACF;AAGA,QAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,cAAc,CAAA,GACrD,SAAA,CAAU,cAAA,GACT,SAAA,CAAU,cAAA,GAAiB,CAAC,SAAA,CAAU,cAAc,IAAI,EAAC;AAE9D,QAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,UAAA,IAAI;AACF,YAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oCAAA,EAAuC,SAAS,CAAA,CAAE,CAAA;AAC9D,YAAA,MAAM,YAAY,MAAM,IAAI,OAAA,CAAwB,CAAC,SAAS,MAAA,KAAW;AACvE,cAAA,MAAA,CAAO,IAAA;AAAA,gBACL,SAAA;AAAA,gBACA,CAACY,KAAAA,KAAS,OAAA,CAAQA,KAAI,CAAA;AAAA,gBACtB,CAAC,GAAA,KAAQ;AACP,kBAAA,IAAI,IAAI,gBAAA,EAAkB;AACxB,oBAAA,MAAM,OAAA,GAAW,GAAA,CAAI,MAAA,GAAS,GAAA,CAAI,KAAA,GAAS,GAAA;AAC3C,oBAAA,IAAI,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,GAAI,EAAA,KAAO,CAAA,EAAG,OAAA,CAAQ,GAAA,CAAI,CAAA,+BAAA,EAAkC,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,kBACzG;AAAA,gBACF,CAAA;AAAA,gBACA,CAAC,GAAA,KAAQ,MAAA,CAAO,GAAG;AAAA,eACrB;AAAA,YACF,CAAC,CAAA;AAED,YAAA,IAAI,gBAAe,EAAG;AAEtB,YAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oCAAA,EAAuC,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA;AAGzE,YAAA,SAAA,CAAU,QAAA,CAAS,CAAC,KAAA,KAAU;AAC5B,cAAA,IAAI,iBAAuBZ,gBAAA,CAAA,IAAA,EAAM;AAC/B,gBAAA,KAAA,CAAM,UAAA,GAAa,IAAA;AACnB,gBAAA,KAAA,CAAM,aAAA,GAAgB,IAAA;AAEtB,gBAAA,MAAMY,KAAAA,GAAO,KAAA;AACb,gBAAA,MAAM,SAAA,GAAY,KAAA,CAAM,OAAA,CAAQA,KAAAA,CAAK,QAAQ,IAAIA,KAAAA,CAAK,QAAA,GAAW,CAACA,KAAAA,CAAK,QAAQ,CAAA;AAE/E,gBAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAA,EAAG,GAAA,KAAQ;AAE3B,kBAAA,IAAK,EAAU,YAAA,EAAc;AAC5B,oBAAC,EAAU,YAAA,GAAe,KAAA;AAC1B,oBAAA,CAAA,CAAE,WAAA,GAAc,IAAA;AAAA,kBAClB;AAAA,gBACF,CAAC,CAAA;AAGD,gBAAA,IAAIA,KAAAA,CAAK,SAAS,eAAA,EAAiB;AACjC,kBAAAA,KAAAA,CAAK,QAAA,CAAS,eAAA,GAAkB,EAAC;AAAA,gBACnC;AACA,gBAAA,IAAKA,MAAa,qBAAA,EAAuB;AACvC,kBAACA,KAAAA,CAAa,wBAAwB,EAAC;AAAA,gBACzC;AAAA,cACF;AAAA,YACF,CAAC,CAAA;AAGD,YAAA,IAAI;AACF,cAAA,MAAM,qBAAA,CAAsB,SAAA,EAAW,QAAA,EAAU,KAAA,EAAO,MAAM,CAAA;AAAA,YAChE,SAAS,CAAA,EAAG;AACV,cAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,uCAAA,EAA0C,SAAS,CAAA,CAAA,CAAA,EAAK,CAAC,CAAA;AAAA,YACxE;AAEA,YAAA,IAAI,gBAAe,EAAG;AAGtB,YAAA,KAAA,CAAM,IAAI,SAAS,CAAA;AAGnB,YAAA,MAAM,QAAA,GAAW,IAAUZ,gBAAA,CAAA,IAAA,EAAK,CAAE,cAAc,SAAS,CAAA;AACzD,YAAA,MAAM,SAAA,GAAY,QAAA,CAAS,OAAA,CAAQ,IAAUA,0BAAS,CAAA;AAEtD,YAAA,IAAI,SAAA,CAAU,MAAA,EAAO,GAAI,CAAA,EAAG;AAC1B,cAAA,SAAA,CAAU,KAAA,CAAM,eAAe,GAAG,CAAA;AAAA,YACpC,CAAA,MAAA,IAAW,SAAA,CAAU,CAAA,GAAI,CAAA,EAAG;AAC1B,cAAA,SAAA,CAAU,KAAA,CAAM,eAAe,EAAE,CAAA;AAAA,YACnC;AAKA,YAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oCAAA,EAAkC,SAAS,CAAA,CAAE,CAAA;AAGzD,YAAA,IAAI,UAAU,eAAA,EAAiB;AAC7B,cAAC,OAAe,aAAA,CAAc,SAAA,CAAU,eAAA,EAAiB,SAAA,EAAW,CAAC,IAAA,KAAc;AACjF,gBAAA,IAAI,CAAC,gBAAe,EAAG,MAAA,CAAO,IAAI,SAAA,EAAkB,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAAA,cACzE,CAAC,CAAA;AAAA,YACH;AAAA,UACF,SAAS,GAAA,EAAK;AACZ,YAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qBAAA,EAAwB,SAAS,CAAA,CAAA,CAAA,EAAK,GAAG,CAAA;AAAA,UACzD;AAAA,QACF;AAEA,QAAA,IAAI,gBAAe,EAAG;AAGtB,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,QAAA,OAAA,CAAQ,IAAI,iEAA0D,CAAA;AACtE,QAAA,OAAA,CAAQ,IAAI,oCAA6B,CAAA;AACzC,QAAA,OAAA,CAAQ,IAAI,CAAA,gEAAA,CAA6D,CAAA;AACzE,QAAA,IAAI,UAAU,cAAA,EAAgB;AAC5B,UAAA,OAAA,CAAQ,IAAI,CAAA,gEAAA,CAA6D,CAAA;AAAA,QAC3E;AACA,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,OAAA,CAAQ,IAAI,CAAA,6CAAA,EAA2C,SAAA,CAAU,SAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,QAC1F;AACA,QAAA,OAAA,CAAQ,IAAI,sDAA+C,CAAA;AAC3D,QAAA,MAAA,IAAS;AAET,QAAA,IAAI,QAAA,EAAU;AAEZ,UAAA,UAAA,CAAW,MAAM;AACd,YAAA,IAAI,gBAAe,EAAG;AACtB,YAAA,OAAA,CAAQ,IAAI,sFAA+E,CAAA;AAC3F,YAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,YAAA,IAAI,CAAC,QAAA,CAAS,OAAA,CAAQ,OAAA,EAAS,QAAA,CAAS,QAAQ,KAAA,EAAM;AACtD,YAAA,MAAA,IAAS;AAAA,UACZ,GAAG,GAAG,CAAA;AAAA,QACR;AAAA,MAEF,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,gBAAe,EAAG;AACtB,QAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,KAAK,CAAA;AAG3D,QAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,QAAA,IAAI,aAAa,QAAA,CAAS,KAAK,KAAK,YAAA,CAAa,QAAA,CAAS,eAAe,CAAA,EAAG;AAE1E,UAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,EAAI,GAAI,YAAA,CAAa,OAAA;AAC9C,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,IAAO,CAAA;AAC9C,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAO,WAAA,GAAc,OAAW,GAAK,CAAA;AAC1D,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAO,WAAA,GAAc,MAAS,GAAI,CAAA;AAEvD,UAAA,MAAM,aAAa,KAAA,GAAQ,CAAA,GACvB,GAAG,KAAK,CAAA,YAAA,EAAK,OAAO,CAAA,MAAA,EAAI,OAAO,CAAA,MAAA,CAAA,GAC/B,OAAA,GAAU,IACR,CAAA,EAAG,OAAO,SAAI,OAAO,CAAA,MAAA,CAAA,GACrB,GAAG,OAAO,CAAA,MAAA,CAAA;AAEhB,UAAA,KAAA,CAAM,CAAA;;AAAA;AAAA,iCAAA,EAGN,UAAU;AAAA,6CAAA,EACR,oBAAoB,OAAO;AAAA,iCAAA,EAC7B,IAAI,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA,CAAE,gBAAgB;AAAA,iCAAA,EAAA,iBAC/C,IAAI,IAAA,EAAK,EAAE,cAAA,EAAgB;;AAAA;AAAA;;AAAA;AAAA,EAMnC,YAAY;;AAAA,8FAAA,CAEI,CAAA;AAAA,QACV;AAEA,QAAA,OAAA,GAAU,KAAA,YAAiB,QAAQ,KAAA,GAAQ,IAAI,MAAM,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAAA,MACrE;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,EAAK;AAEL,IAAA,OAAO,MAAM;AAEX,MAAA,OAAA,CAAQ,IAAI,iCAAiC,CAAA;AAG7C,MAAA,SAAA,CAAU,OAAA,EAAA;AAGV,MAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,QAAA,oBAAA,CAAqB,eAAe,OAAO,CAAA;AAC3C,QAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AAAA,MAC3B;AAEA,MAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,MAAA,UAAA,CAAW,OAAA,GAAU,KAAA;AAGrB,MAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,QAAA,iBAAA,CAAkB,QAAQ,UAAA,EAAW;AACrC,QAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA;AAAA,MAC9B;AAGA,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,IAAI;AACF,UAAA,IAAI,QAAA,CAAS,QAAQ,SAAA,EAAW;AAC9B,YAAA,QAAA,CAAS,QAAQ,IAAA,EAAK;AAAA,UACxB;AACA,UAAA,IAAI,QAAA,CAAS,QAAQ,MAAA,EAAQ;AAC3B,YAAA,QAAA,CAAS,QAAQ,UAAA,EAAW;AAAA,UAC9B;AAEA,UAAA,IAAI,QAAA,CAAS,QAAQ,MAAA,EAAQ;AAC3B,YAAA,QAAA,CAAS,QAAQ,MAAA,GAAS,IAAA;AAAA,UAC5B;AACA,UAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,QACrB,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,IAAA,CAAK,4CAA4C,CAAC,CAAA;AAAA,QAC5D;AAAA,MACF;AAGA,MAAA,IAAI,UAAU,OAAA,EAAS;AACrB,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,IAAI,6CAA6C,CAAA;AAEzD,UAAA,MAAM,aAAA,GAAiB,UAAU,OAAA,CAAgB,OAAA;AACjD,UAAA,MAAM,MAAA,GAAU,SAAA,CAAU,OAAA,CAAgB,MAAA,IAAU,EAAC;AAErD,UAAA,OAAA,CAAQ,GAAA,CAAI,qCAAA,EAAuC,MAAA,CAAO,MAAM,CAAA;AAEhE,UAAA,IAAI,UAAU,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,IAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AACxD,YAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,IAAA,EAAW,GAAA,KAAgB;AACzC,cAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,8BAAA,EAAiC,GAAG,CAAA,CAAA,CAAA,EAAK,KAAK,IAAI,CAAA;AAG9D,cAAA,IAAI,QAAA,GAAgB,IAAA;AAEpB,cAAA,IAAI,yBAAyB,OAAA,EAAS;AACpC,gBAAA,OAAA,CAAQ,IAAI,yDAAyD,CAAA;AACrE,gBAAA,QAAA,GAAW,aAAA,CAAc,IAAI,IAAI,CAAA;AAEjC,gBAAA,IAAI,QAAA,EAAU;AACZ,kBAAA,MAAM,YAAA,GAAe,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AACzC,kBAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,0DAAA,EAAwD,YAAA,CAAa,MAAM,MAAM,YAAY,CAAA;AAGzG,kBAAA,MAAM,kBAAA,GAAqB,aAAa,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,WAAA,EAAY,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA;AACpF,kBAAA,IAAI,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACjC,oBAAA,OAAA,CAAQ,GAAA,CAAI,2CAA2C,kBAAkB,CAAA;AACzE,oBAAA,kBAAA,CAAmB,QAAQ,CAAA,GAAA,KAAO;AAChC,sBAAA,MAAM,KAAA,GAAQ,SAAS,GAAG,CAAA;AAC1B,sBAAA,OAAA,CAAQ,GAAA,CAAI,uBAAuB,GAAG,CAAA,CAAA,CAAA,EAAK,OAAO,KAAA,EAAO,KAAA,EAAO,WAAA,EAAa,IAAA,IAAQ,KAAK,CAAA;AAAA,oBAC5F,CAAC,CAAA;AAAA,kBACH;AAAA,gBACF,CAAA,MAAO;AACL,kBAAA,OAAA,CAAQ,IAAI,2EAAiE,CAAA;AAAA,gBAC/E;AAAA,cACF;AAGA,cAAA,IAAI,CAAC,QAAA,EAAU;AACb,gBAAA,OAAA,CAAQ,IAAI,iDAAiD,CAAA;AAC7D,gBAAA,QAAA,GAAW,IAAA;AAAA,cACb;AAGA,cAAA,MAAM,UAAU,QAAA,EAAU,OAAA;AAE1B,cAAA,IAAI,OAAA,EAAS;AACX,gBAAA,IAAI;AACF,kBAAA,OAAA,CAAQ,GAAA,CAAI,+DAAwD,GAAG,CAAA;AACvE,kBAAA,OAAA,CAAQ,GAAA,CAAI,+CAAA,EAAiD,MAAA,CAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AAGjF,kBAAA,IAAI,OAAO,OAAA,CAAQ,OAAA,KAAY,UAAA,EAAY;AACzC,oBAAA,OAAA,CAAQ,IAAI,mDAAmD,CAAA;AAC/D,oBAAA,OAAA,CAAQ,OAAA,EAAQ;AAChB,oBAAA,OAAA,CAAQ,IAAI,yDAAoD,CAAA;AAAA,kBAClE,CAAA,MAAO;AAEL,oBAAA,OAAA,CAAQ,IAAI,8EAA8E,CAAA;AAE1F,oBAAA,MAAMa,QAAQ,MAAA,CAAe,IAAA;AAC7B,oBAAA,IAAI,CAACA,KAAAA,IAAQ,CAACA,KAAAA,CAAK,OAAA,EAAS;AAC1B,sBAAA,OAAA,CAAQ,KAAK,2DAAiD,CAAA;AAAA,oBAChE,CAAA,MAAO;AAEL,sBAAA,IAAI,OAAA,CAAQ,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,IAAK,OAAA,CAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC/E,wBAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2BAAA,EAA8B,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,gBAAA,CAAkB,CAAA;AACjF,wBAAA,KAAA,IAAS,IAAI,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACnD,0BAAA,IAAI;AACF,4BAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA;AAC7B,4BAAA,IAAI,IAAA,IAAQ,KAAK,IAAA,EAAM;AACrB,8BAAA,OAAA,CAAQ,KAAA,CAAM,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AAAA,4BACzC;AAAA,0BACF,SAAS,CAAA,EAAG;AACV,4BAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,wCAAA,EAA2C,CAAC,CAAA,CAAA,CAAA,EAAK,CAAC,CAAA;AAAA,0BACjE;AAAA,wBACF;AACA,wBAAA,OAAA,CAAQ,OAAO,MAAA,GAAS,CAAA;AACxB,wBAAA,OAAA,CAAQ,IAAI,mDAA8C,CAAA;AAAA,sBAC5D;AAGA,sBAAA,IAAI,OAAA,CAAQ,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,WAAW,CAAA,IAAK,OAAA,CAAQ,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AACzF,wBAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2BAAA,EAA8B,OAAA,CAAQ,WAAA,CAAY,MAAM,CAAA,eAAA,CAAiB,CAAA;AACrF,wBAAA,KAAA,IAAS,IAAI,OAAA,CAAQ,WAAA,CAAY,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACxD,0BAAA,IAAI;AACF,4BAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,WAAA,CAAY,CAAC,CAAA;AACxC,4BAAA,IAAI,UAAA,EAAY;AACd,8BAAA,OAAA,CAAQ,KAAA,CAAM,iBAAiB,UAAU,CAAA;AAAA,4BAC3C;AAAA,0BACF,SAAS,CAAA,EAAG;AACV,4BAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,8CAAA,EAAiD,CAAC,CAAA,CAAA,CAAA,EAAK,CAAC,CAAA;AAAA,0BACvE;AAAA,wBACF;AACA,wBAAA,OAAA,CAAQ,YAAY,MAAA,GAAS,CAAA;AAC7B,wBAAA,OAAA,CAAQ,IAAI,kDAA6C,CAAA;AAAA,sBAC3D;AAAA,oBAGF;AAAA,kBACF;AAGA,kBAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAEnB,kBAAA,OAAA,CAAQ,GAAA,CAAI,6DAAwD,GAAG,CAAA;AAAA,gBACzE,SAAS,YAAA,EAAc;AACrB,kBAAA,OAAA,CAAQ,KAAA,CAAM,qDAAgD,YAAY,CAAA;AAC1E,kBAAA,OAAA,CAAQ,KAAA,CAAM,sCAAA,EAAyC,YAAA,CAAuB,KAAK,CAAA;AAAA,gBACrF;AAAA,cACF,CAAA,MAAO;AACL,gBAAA,OAAA,CAAQ,GAAA,CAAI,iEAAuD,GAAG,CAAA;AAAA,cACxE;AAGA,cAAA,IAAI,UAAU,KAAA,EAAO;AACnB,gBAAA,QAAA,CAAS,MAAM,aAAA,EAAc;AAC7B,gBAAA,QAAA,CAAS,KAAA,CAAM,WAAA,CAAY,QAAA,CAAS,IAAA,IAAQ,IAAI,CAAA;AAEhD,gBAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,QAAA,IAAY,EAAC;AAC1C,gBAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,MAAA,KAAgB;AAC7B,kBAAA,IAAI,OAAO,KAAA,EAAO;AAChB,oBAAA,MAAA,CAAO,KAAA,GAAQ,IAAA;AAAA,kBACjB;AAAA,gBACF,CAAC,CAAA;AACD,gBAAA,QAAA,CAAS,KAAA,GAAQ,IAAA;AAAA,cACnB;AAGA,cAAA,IAAI,UAAU,KAAA,EAAO;AACnB,gBAAA,IAAI,QAAA,CAAS,MAAM,SAAA,EAAW;AAC5B,kBAAA,QAAA,CAAS,MAAM,IAAA,EAAK;AAAA,gBACtB;AACA,gBAAA,IAAI,QAAA,CAAS,MAAM,MAAA,EAAQ;AACzB,kBAAA,QAAA,CAAS,MAAM,UAAA,EAAW;AAAA,gBAC5B;AACA,gBAAA,IAAI,QAAA,CAAS,MAAM,MAAA,EAAQ;AACzB,kBAAA,QAAA,CAAS,MAAM,MAAA,GAAS,IAAA;AAAA,gBAC1B;AACA,gBAAA,QAAA,CAAS,KAAA,GAAQ,IAAA;AAAA,cACnB;AAAA,YACF,CAAC,CAAA;AAED,YAAA,MAAA,CAAO,MAAA,GAAS,CAAA;AAAA,UAClB;AAGA,UAAA,OAAA,CAAQ,IAAI,2EAAoE,CAAA;AAChF,UAAA,MAAM,OAAQ,MAAA,CAAe,IAAA;AAC7B,UAAA,IAAI,IAAA,IAAQ,KAAK,OAAA,EAAS;AACxB,YAAA,MAAM,aAAa,oBAAA,CAAqB,OAAA;AAExC,YAAA,OAAA,CAAQ,IAAI,CAAA,mDAAA,CAAA,EAAgD;AAAA,cAC1D,MAAA,EAAQ,WAAW,MAAA,CAAO,MAAA;AAAA,cAC1B,OAAA,EAAS,WAAW,OAAA,CAAQ,MAAA;AAAA,cAC5B,MAAA,EAAQ,WAAW,MAAA,CAAO,MAAA;AAAA,cAC1B,WAAA,EAAa,WAAW,WAAA,CAAY,MAAA;AAAA,cACpC,OAAA,EAAS,WAAW,OAAA,CAAQ;AAAA,aAC7B,CAAA;AAOD,YAAA,IAAI,UAAA,CAAW,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAChC,cAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,6CAAA,EAAoC,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA,8BAAA,CAAgC,CAAA;AACxG,cAAA,KAAA,IAAS,IAAI,UAAA,CAAW,MAAA,CAAO,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACtD,gBAAA,IAAI;AACF,kBAAA,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,gBACnC,SAAS,CAAA,EAAG;AACV,kBAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,iDAAA,EAA+C,CAAC,CAAA,CAAA,CAAA,EAAK,CAAC,CAAA;AAAA,gBACtE;AAAA,cACF;AACA,cAAA,UAAA,CAAW,OAAO,MAAA,GAAS,CAAA;AAC3B,cAAA,OAAA,CAAQ,IAAI,gEAA2D,CAAA;AAAA,YACzE;AAGA,YAAA,IAAI,UAAA,CAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACjC,cAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,6CAAA,EAAoC,UAAA,CAAW,OAAA,CAAQ,MAAM,CAAA,0CAAA,CAA4C,CAAA;AACrH,cAAA,KAAA,IAAS,IAAI,UAAA,CAAW,OAAA,CAAQ,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACvD,gBAAA,IAAI;AACF,kBAAA,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,gBACpC,SAAS,CAAA,EAAG;AACV,kBAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,kDAAA,EAAgD,CAAC,CAAA,CAAA,CAAA,EAAK,CAAC,CAAA;AAAA,gBACvE;AAAA,cACF;AACA,cAAA,UAAA,CAAW,QAAQ,MAAA,GAAS,CAAA;AAC5B,cAAA,OAAA,CAAQ,IAAI,4EAAuE,CAAA;AAAA,YACrF;AAGA,YAAA,IAAI,UAAA,CAAW,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAChC,cAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,6CAAA,EAAoC,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA,uBAAA,CAAyB,CAAA;AACjG,cAAA,KAAA,IAAS,IAAI,UAAA,CAAW,MAAA,CAAO,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACtD,gBAAA,IAAI;AACF,kBAAA,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,gBACnC,SAAS,CAAA,EAAG;AACV,kBAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,iDAAA,EAA+C,CAAC,CAAA,CAAA,CAAA,EAAK,CAAC,CAAA;AAAA,gBACtE;AAAA,cACF;AACA,cAAA,UAAA,CAAW,OAAO,MAAA,GAAS,CAAA;AAC3B,cAAA,OAAA,CAAQ,IAAI,yDAAoD,CAAA;AAAA,YAClE;AAGA,YAAA,IAAI,UAAA,CAAW,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AACrC,cAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,6CAAA,EAAoC,UAAA,CAAW,WAAA,CAAY,MAAM,CAAA,4BAAA,CAA8B,CAAA;AAC3G,cAAA,KAAA,IAAS,IAAI,UAAA,CAAW,WAAA,CAAY,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC3D,gBAAA,IAAI;AACF,kBAAA,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,WAAA,CAAY,CAAC,CAAC,CAAA;AAAA,gBACxC,SAAS,CAAA,EAAG;AACV,kBAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sDAAA,EAAoD,CAAC,CAAA,CAAA,CAAA,EAAK,CAAC,CAAA;AAAA,gBAC3E;AAAA,cACF;AACA,cAAA,UAAA,CAAW,YAAY,MAAA,GAAS,CAAA;AAChC,cAAA,OAAA,CAAQ,IAAI,8DAAyD,CAAA;AAAA,YACvE;AAGA,YAAA,IAAI,UAAA,CAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACjC,cAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,6CAAA,EAAoC,UAAA,CAAW,OAAA,CAAQ,MAAM,CAAA,sCAAA,CAAwC,CAAA;AACjH,cAAA,KAAA,IAAS,IAAI,UAAA,CAAW,OAAA,CAAQ,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACvD,gBAAA,IAAI;AACF,kBAAA,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,gBACpC,SAAS,CAAA,EAAG;AACV,kBAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,kDAAA,EAAgD,CAAC,CAAA,CAAA,CAAA,EAAK,CAAC,CAAA;AAAA,gBACvE;AAAA,cACF;AACA,cAAA,UAAA,CAAW,QAAQ,MAAA,GAAS,CAAA;AAC5B,cAAA,OAAA,CAAQ,IAAI,wEAAmE,CAAA;AAAA,YACjF;AAEA,YAAA,OAAA,CAAQ,IAAI,iEAA0D,CAAA;AAAA,UACxE,CAAA,MAAO;AACL,YAAA,OAAA,CAAQ,KAAK,mFAAyE,CAAA;AAAA,UACxF;AAGA,UAAA,OAAA,CAAQ,IAAI,kDAAkD,CAAA;AAC9D,UAAA,IAAK,SAAA,CAAU,QAAgB,aAAA,EAAe;AAC5C,YAAA,OAAA,CAAQ,IAAI,qDAAqD,CAAA;AACjE,YAAC,SAAA,CAAU,QAAgB,aAAA,GAAgB,IAAA;AAAA,UAC7C;AACA,UAAA,IAAK,SAAA,CAAU,QAAgB,aAAA,EAAe;AAC5C,YAAA,OAAA,CAAQ,IAAI,qDAAqD,CAAA;AACjE,YAAC,SAAA,CAAU,QAAgB,aAAA,GAAgB,IAAA;AAAA,UAC7C;AAGA,UAAA,IAAI,SAAA,CAAU,QAAQ,OAAA,EAAS;AAC7B,YAAA,SAAA,CAAU,QAAQ,OAAA,EAAQ;AAAA,UAC5B;AAAA,QACF,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,IAAA,CAAK,sDAAsD,CAAC,CAAA;AAAA,QACtE;AACA,QAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAA,MACtB;AAGA,MAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAG3B,MAAA,IAAI,cAAc,OAAA,EAAS;AACzB,QAAA,IAAI,SAAS,OAAA,EAAS;AACpB,UAAA,QAAA,CAAS,OAAA,CAAQ,MAAA,CAAO,aAAA,CAAc,OAAO,CAAA;AAAA,QAC/C;AACA,QAAA,aAAA,CAAc,QAAQ,OAAA,EAAQ;AAC9B,QAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AAAA,MAC1B;AAGA,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,QAAA,CAAS,OAAA,CAAQ,QAAA,CAAS,CAAC,MAAA,KAAW;AAEpC,UAAA,IAAI,MAAA,YAAwBb,gBAAA,CAAA,IAAA,IAAQ,MAAA,YAAwBA,gBAAA,CAAA,WAAA,EAAa;AAEvE,YAAA,IAAI,kBAAwBA,gBAAA,CAAA,WAAA,EAAa;AACvC,cAAA,IAAI,OAAO,QAAA,EAAU;AACnB,gBAAA,MAAA,CAAO,SAAS,OAAA,EAAQ;AAAA,cAC1B;AAEA,cAAA,IAAI,OAAO,UAAA,EAAY;AACrB,gBAAA,MAAA,CAAO,UAAA,GAAa,IAAA;AAAA,cACtB;AACA,cAAA,IAAI,OAAO,iBAAA,EAAmB;AAC5B,gBAAA,MAAA,CAAO,iBAAA,GAAoB,IAAA;AAAA,cAC7B;AAAA,YACF;AAGA,YAAA,IAAI,OAAO,QAAA,EAAU;AACnB,cAAA,MAAA,CAAO,SAAS,OAAA,EAAQ;AACxB,cAAA,MAAA,CAAO,QAAA,GAAW,IAAA;AAAA,YACpB;AAGA,YAAA,IAAI,OAAO,QAAA,EAAU;AACnB,cAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAsB;AAE7C,gBAAA,MAAM,YAAA,GAAe;AAAA,kBACnB,KAAA;AAAA,kBAAO,UAAA;AAAA,kBAAY,SAAA;AAAA,kBAAW,WAAA;AAAA,kBAAa,aAAA;AAAA,kBAC3C,QAAA;AAAA,kBAAU,UAAA;AAAA,kBAAY,aAAA;AAAA,kBAAe,iBAAA;AAAA,kBACrC,cAAA;AAAA,kBAAgB,cAAA;AAAA,kBAAgB,OAAA;AAAA;AAAA,kBAEhC,aAAA;AAAA,kBAAe,SAAA;AAAA,kBAAW,WAAA;AAAA,kBAAa;AAAA,iBACzC;AAEA,gBAAA,YAAA,CAAa,QAAQ,CAAA,IAAA,KAAQ;AAE3B,kBAAA,IAAI,EAAE,IAAI,CAAA,IAAK,CAAA,CAAE,IAAI,EAAE,OAAA,EAAS;AAE9B,oBAAA,CAAA,CAAE,IAAI,EAAE,OAAA,EAAQ;AAEhB,oBAAA,CAAA,CAAE,IAAI,CAAA,GAAI,IAAA;AAAA,kBACZ;AAAA,gBACF,CAAC,CAAA;AAGD,gBAAA,CAAA,CAAE,OAAA,EAAQ;AAAA,cACZ,CAAA;AAEA,cAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,EAAG;AAClC,gBAAA,MAAA,CAAO,QAAA,CAAS,QAAQ,eAAe,CAAA;AAAA,cACzC,CAAA,MAAO;AACL,gBAAA,eAAA,CAAgB,OAAO,QAAQ,CAAA;AAAA,cACjC;AACA,cAAA,MAAA,CAAO,QAAA,GAAW,IAAA;AAAA,YACpB;AAAA,UACF;AAGA,UAAA,IAAI,kBAAwBA,gBAAA,CAAA,aAAA,EAAe;AACzC,YAAA,IAAI;AAEF,cAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,OAAA,CAAQ,UAAU,QAAA,EAAU;AAEvD,gBAAA,MAAA,CAAO,QAAQ,KAAA,IAAQ;AAAA,cACzB;AAAA,YACF,SAAS,CAAA,EAAG;AACV,cAAA,OAAA,CAAQ,IAAA,CAAK,+CAA+C,CAAC,CAAA;AAAA,YAC/D;AAAA,UACF;AAGA,UAAA,IAAI,kBAAwBA,gBAAA,CAAA,KAAA,EAAO;AACjC,YAAA,IAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK;AACtC,cAAA,MAAA,CAAO,MAAA,CAAO,IAAI,OAAA,EAAQ;AAC1B,cAAA,MAAA,CAAO,OAAO,GAAA,GAAM,IAAA;AAAA,YACtB;AAAA,UACF;AAAA,QACF,CAAC,CAAA;AAGD,QAAA,QAAA,CAAS,QAAQ,KAAA,EAAM;AACvB,QAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,MACrB;AAGA,MAAA,IAAI,YAAY,OAAA,EAAS;AACvB,QAAA,WAAA,CAAY,QAAQ,OAAA,EAAQ;AAC9B,QAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AAAA,MACtB;AAGA,MAAA,IAAI,YAAY,OAAA,EAAS;AACvB,QAAA,IAAI;AAEF,UAAA,IAAI,YAAY,OAAA,EAAS;AACvB,YAAA,WAAA,CAAY,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,CAAA,IAAA,KAAQ;AACzC,cAAA,IAAK,IAAA,CAAa,OAAA,EAAU,IAAA,CAAa,OAAA,EAAQ;AAAA,YACnD,CAAC,CAAA;AACD,YAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AAAA,UACxB;AAGA,UAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAG3B,UAAA,MAAM,WAAW,WAAA,CAAY,OAAA;AAG7B,UAAA,IAAI,SAAS,WAAA,EAAa;AACxB,YAAA,QAAA,CAAS,YAAY,OAAA,EAAQ;AAAA,UAC/B;AAGA,UAAA,IAAI,QAAA,CAAS,IAAA,IAAQ,QAAA,CAAS,IAAA,CAAK,QAAA,EAAU;AAC3C,YAAA,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAiB;AAC/C,cAAA,IAAI,OAAA,IAAW,QAAQ,OAAA,EAAS;AAC9B,gBAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,cAClB;AAAA,YACF,CAAC,CAAA;AAAA,UACH;AAGA,UAAA,IAAI,SAAS,UAAA,EAAY;AACvB,YAAA,MAAM,EAAA,GAAK,SAAS,UAAA,EAAW;AAC/B,YAAA,MAAM,eAAA,GAAkB,EAAA,CAAG,YAAA,CAAa,EAAA,CAAG,uBAAuB,CAAA;AAClE,YAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,eAAA,EAAiB,EAAE,IAAA,EAAM;AACjD,cAAA,EAAA,CAAG,aAAA,CAAc,EAAA,CAAG,QAAA,GAAW,IAAI,CAAA;AACnC,cAAA,EAAA,CAAG,WAAA,CAAY,EAAA,CAAG,UAAA,EAAY,IAAI,CAAA;AAClC,cAAA,EAAA,CAAG,WAAA,CAAY,EAAA,CAAG,gBAAA,EAAkB,IAAI,CAAA;AAAA,YAC1C;AAAA,UACF;AAGA,UAAA,QAAA,CAAS,OAAA,EAAQ;AAGjB,UAAA,QAAA,CAAS,gBAAA,EAAiB;AAG1B,UAAA,IAAI,YAAA,CAAa,OAAA,IAAW,QAAA,CAAS,UAAA,EAAY;AAC/C,YAAA,IAAI,YAAA,CAAa,OAAA,CAAQ,QAAA,CAAS,QAAA,CAAS,UAAU,CAAA,EAAG;AACtD,cAAA,YAAA,CAAa,OAAA,CAAQ,WAAA,CAAY,QAAA,CAAS,UAAU,CAAA;AAAA,YACtD;AAAA,UACF;AAGA,UAAA,IAAI,SAAS,UAAA,EAAY;AACvB,YAAA,QAAA,CAAS,WAAW,KAAA,GAAQ,CAAA;AAC5B,YAAA,QAAA,CAAS,WAAW,MAAA,GAAS,CAAA;AAAA,UAC/B;AAAA,QAEF,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,IAAA,CAAK,+CAA+C,CAAC,CAAA;AAAA,QAC/D;AACA,QAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AAAA,MACxB;AAGA,MAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAGpB,MAAA,QAAA,CAAS,OAAA,GAAU,IAAUA,gBAAA,CAAA,KAAA,EAAM;AAGnC,MAAA,WAAA,CAAY,OAAA,GAAU,CAAA;AAEtB,MAAA,OAAA,CAAQ,IAAI,mCAAmC,CAAA;AAG/C,MAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,IAAA,IAAQ,MAAA,EAAQ;AACnD,QAAA,IAAI;AAEF,UAAA,MAAA,CAAO,EAAA,EAAG;AAAA,QACZ,SAAS,CAAA,EAAG;AAAA,QAEZ;AAAA,MACF;AAAA,IACF,CAAA;AAAA,EAEF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAGd,EAAAG,gBAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AAEvB,IAAA,IAAI,QAAA,IAAY,CAAC,aAAA,CAAc,OAAA,EAAS;AACtC,MAAA,MAAM,UAAA,GAAa,IAAUH,gBAAA,CAAA,UAAA,CAAW,EAAE,CAAA;AAC1C,MAAA,QAAA,CAAS,OAAA,CAAQ,IAAI,UAAU,CAAA;AAC/B,MAAA,aAAA,CAAc,OAAA,GAAU,UAAA;AAAA,IAC1B,CAAA,MAAA,IAAW,CAAC,QAAA,IAAY,aAAA,CAAc,OAAA,EAAS;AAC7C,MAAA,QAAA,CAAS,OAAA,CAAQ,MAAA,CAAO,aAAA,CAAc,OAAO,CAAA;AAC7C,MAAA,aAAA,CAAc,QAAQ,OAAA,EAAQ;AAC9B,MAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AAAA,IAC1B;AAAA,EACF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAAG,gBAAA,CAAU,MAAM;AACd,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAGlB,IAAA,IAAI,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,OAAA,CAAQ,MAAA,EAAQ;AAC/C,MAAA,QAAA,CAAS,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAAA,IAC/B;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAGT,EAAAA,gBAAA,CAAU,MAAM;AACd,IAAA,IAAI,iBAAiB,OAAA,EAAS;AAK9B,IAAA,IAAI,YAAY,OAAA,EAAS;AACvB,MAAA,MAAM,YAAY,WAAA,CAAY,OAAA,CAAQ,OAAO,IAAA,CAAK,CAAA,CAAA,KAAK,aAAaK,2BAAe,CAAA;AACnF,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,SAAA,CAAU,QAAA,GAAW,aAAa,QAAA,IAAY,CAAA;AAC9C,QAAA,SAAA,CAAU,MAAA,GAAS,aAAa,MAAA,IAAU,GAAA;AAC1C,QAAA,SAAA,CAAU,SAAA,GAAY,aAAa,SAAA,IAAa,GAAA;AAAA,MAClD;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,CAAa,QAAA,EAAU,aAAa,MAAA,EAAQ,YAAA,CAAa,SAAS,CAAC,CAAA;AAGvE,EAAAL,gBAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AAGzB,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,IAAI,MAAM,eAAA,EAAiB;AACzB,QAAA,QAAA,CAAS,OAAA,CAAQ,UAAA,GAAa,IAAUH,gBAAA,CAAA,KAAA,CAAM,MAAM,eAAe,CAAA;AAAA,MACrE,CAAA,MAAA,IAAW,MAAM,eAAA,EAAiB;AAChC,QAAA,MAAM,aAAA,GAAgB,IAAUA,gBAAA,CAAA,aAAA,EAAc;AAC9C,QAAA,aAAA,CAAc,IAAA,CAAK,KAAA,CAAM,eAAA,EAAiB,CAAC,OAAA,KAAY;AACrD,UAAA,IAAI,QAAA,CAAS,OAAA,EAAS,QAAA,CAAS,OAAA,CAAQ,UAAA,GAAa,OAAA;AAAA,QACtD,CAAC,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,QAAA,CAAS,OAAA,CAAQ,QAAA,CAAS,CAAC,GAAA,KAAQ;AACjC,QAAA,IAAI,GAAA,YAAqBA,gBAAA,CAAA,YAAA,IAAgB,KAAA,CAAM,qBAAA,KAA0B,MAAA,EAAW;AAClF,UAAA,GAAA,CAAI,YAAY,KAAA,CAAM,qBAAA;AAAA,QACxB;AACA,QAAA,IAAI,GAAA,YAAqBA,gBAAA,CAAA,gBAAA,IAAoB,KAAA,CAAM,yBAAA,KAA8B,MAAA,EAAW;AAC1F,UAAA,GAAA,CAAI,YAAY,KAAA,CAAM,yBAAA;AAAA,QACxB;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,SAAA,CAAU,OAAA,IAAW,KAAA,CAAM,cAAA,EAAgB;AAC7C,MAAA,MAAM,MAAM,KAAA,CAAM,cAAA;AAClB,MAAA,SAAA,CAAU,OAAA,CAAQ,SAAS,GAAA,CAAI,GAAA,CAAI,GAAG,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,IACpD;AACA,IAAA,IAAI,WAAA,CAAY,OAAA,IAAW,KAAA,CAAM,YAAA,EAAc;AAC7C,MAAA,MAAM,SAAS,KAAA,CAAM,YAAA;AACrB,MAAA,WAAA,CAAY,OAAA,CAAQ,OAAO,GAAA,CAAI,MAAA,CAAO,GAAG,MAAA,CAAO,CAAA,EAAG,OAAO,CAAC,CAAA;AAC3D,MAAA,WAAA,CAAY,QAAQ,MAAA,EAAO;AAAA,IAC7B;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,CAAM,eAAA,EAAiB,MAAM,eAAA,EAAiB,KAAA,CAAM,qBAAA,EAAuB,KAAA,CAAM,yBAAA,EAA2B,KAAA,CAAM,cAAA,EAAgB,KAAA,CAAM,YAAY,CAAC,CAAA;AAGzJ,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,cAAA,CAAe,OAAA,GAAU,sBAAsB,OAAO,CAAA;AAEtD,IAAA,IAAI,WAAA,CAAY,OAAA,IAAW,QAAA,CAAS,OAAA,IAAW,UAAU,OAAA,EAAS;AAChE,MAAA,IAAI,UAAA,CAAW,OAAA,IAAW,YAAA,CAAa,OAAA,IAAW,UAAU,OAAA,EAAS;AACnE,QAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,QAAA,EAAS;AACxC,QAAA,SAAA,CAAU,OAAA,CAAQ,OAAO,KAAK,CAAA;AAG9B,QAAA,MAAM,OAAA,GAAU,SAAS,OAAA,CAAQ,WAAA;AACjC,QAAA,MAAM,WAAW,WAAA,CAAY,OAAA;AAC7B,QAAA,MAAM,cAAc,QAAA,GAAW,CAAA,IAAK,OAAA,CAAQ,OAAA,GAAW,UAAU,QAAA,GAAY,OAAA;AAC7E,QAAA,eAAA,CAAgB,OAAA,CAAQ,eAAe,WAAW,CAAA;AAGlD,QAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,IAAW,QAAA,GAAW,CAAA,IAAK,WAAW,QAAA,EAAU;AAC3D,UAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,UAAA,QAAA,CAAS,QAAQ,IAAA,EAAK;AACtB,UAAA,eAAA,CAAgB,QAAQ,OAAA,IAAU;AAAA,QACpC;AAAA,MACF;AAGA,MAAA,MAAM,UAAA,GAAa,YAAA,KAAiB,SAAA,IAAa,YAAA,KAAiB,eAAA;AAClE,MAAA,MAAM,QAAA,GAAW,YAAA,KAAiB,OAAA,IAAW,YAAA,KAAiB,eAAA;AAE9D,MAAA,IAAI,QAAA,IAAY,YAAY,OAAA,EAAS;AACnC,QAAA,WAAA,CAAY,QAAQ,MAAA,EAAO;AAAA,MAC7B,CAAA,MAAA,IAAW,UAAA,IAAc,gBAAA,CAAiB,OAAA,EAAS;AACjD,QAAA,gBAAA,CAAiB,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,OAAA,EAAS,UAAU,OAAO,CAAA;AAAA,MACrE,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,OAAA,EAAS,UAAU,OAAO,CAAA;AAAA,MAChE;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,uBACEc,uBAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,YAAA;AAAA,MACL,SAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,MAAA;AAAA,QACP,MAAA,EAAQ,MAAA;AAAA,QACR,QAAA,EAAU,QAAA;AAAA,QACV,QAAA,EAAU,UAAA;AAAA;AAAA,QACV,eAAA,EAAiB,MAAM,eAAA,IAAmB,MAAA;AAAA,QAC1C,GAAG;AAAA;AACL;AAAA,GACF;AAEJ,CAAC;AAED,aAAA,CAAc,WAAA,GAAc,eAAA;ACrjDrB,IAAM,eAA4C,CAAC;AAAA,EACxD,SAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA,GAAiB,KAAA;AAAA,EACjB,YAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,YAAA,GAAe,KAAA;AAAA,EACf,KAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,uBACEA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sIAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8CAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EAAA,EAEZ,YAAA,IAAgB,UAAA,oBACfA,uBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,UAAA;AAAA,MACT,SAAA,EAAU,sDAAA;AAAA,MACV,KAAA,EAAM;AAAA,KAAA;AAAA,oBAENA,uBAAAA,CAAA,aAAA,CAACC,oBAAA,EAAA,EAAS,MAAM,EAAA,EAAI;AAAA,GACtB,kBAIFD,uBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,WAAA;AAAA,MACT,SAAA,EAAU,sDAAA;AAAA,MACV,KAAA,EAAO,YAAY,cAAA,GAAO;AAAA,KAAA;AAAA,IAEzB,SAAA,mBAAYA,uBAAAA,CAAA,aAAA,CAACE,iBAAA,EAAA,EAAM,IAAA,EAAM,EAAA,EAAI,CAAA,mBAAKF,uBAAAA,CAAA,aAAA,CAACG,gBAAA,EAAA,EAAK,MAAM,EAAA,EAAI;AAAA,GACrD,EAGC,YAAA,IAAgB,MAAA,oBACfH,uBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,MAAA;AAAA,MACT,SAAA,EAAU,sDAAA;AAAA,MACV,KAAA,EAAM;AAAA,KAAA;AAAA,oBAENA,uBAAAA,CAAA,aAAA,CAACI,uBAAA,EAAA,EAAY,MAAM,EAAA,EAAI;AAAA,GAG7B,CAAA,kBAEAJ,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAAA,EAAA,CAEX,KAAA,IAAS,QAAA,qBACTA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDAAA,EAAA,EACZ,KAAA,EACA,QAAA,oBAAYA,uBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAAA,EAA2B,QAAS,CACnE,CAAA,EAID,gBAAA,oBACCA,uBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,gBAAA;AAAA,MACT,SAAA,EAAW,CAAA,mCAAA,EAAsC,aAAA,GAAgB,uCAAA,GAA0C,mBAAmB,CAAA,CAAA;AAAA,MAC9H,KAAA,EAAO,gBAAgB,4CAAA,GAAY;AAAA,KAAA;AAAA,oBAEnCA,uBAAAA,CAAA,aAAA,CAACK,kBAAA,EAAA,EAAO,MAAM,EAAA,EAAI;AAAA,GACpB,kBAIFL,uBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,YAAA;AAAA,MACT,SAAA,EAAW,CAAA,mCAAA,EAAsC,SAAA,GAAY,qCAAA,GAAwC,mBAAmB,CAAA,CAAA;AAAA,MACxH,KAAA,EAAO,YAAY,4CAAA,GAAY;AAAA,KAAA;AAAA,oBAE/BA,uBAAAA,CAAA,aAAA,CAACM,mBAAA,EAAA,EAAQ,MAAM,EAAA,EAAI;AAAA,GACrB,EAGC,cAAA,IAAkB,aAAA,oBACjBN,uBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,aAAA;AAAA,MACT,SAAA,EAAU,uIAAA;AAAA,MACV,KAAA,EAAM;AAAA,KAAA;AAAA,oBAENA,uBAAAA,CAAA,aAAA,CAACO,kBAAA,EAAA,EAAO,MAAM,EAAA,EAAI;AAAA,GACpB,EAID,YAAA,oBACCP,uBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,YAAA;AAAA,MACT,SAAA,EAAW,CAAA,mCAAA,EAAsC,QAAA,GAAW,qCAAA,GAAwC,mBAAmB,CAAA,CAAA;AAAA,MACvH,KAAA,EAAM;AAAA,KAAA;AAAA,oBAENA,uBAAAA,CAAA,aAAA,CAACQ,mBAAA,EAAA,EAAQ,MAAM,EAAA,EAAI;AAAA,GACrB,EAID,YAAA,oBACCR,uBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,cAAA;AAAA,MACT,SAAA,EAAU,sDAAA;AAAA,MACV,KAAA,EAAM;AAAA,KAAA;AAAA,oBAENA,uBAAAA,CAAA,aAAA,CAACS,oBAAA,EAAA,EAAS,MAAM,EAAA,EAAI;AAAA,GACtB,kBAIFT,uBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,kBAAA;AAAA,MACT,SAAA,EAAU,sDAAA;AAAA,MACV,KAAA,EAAO,eAAe,0BAAA,GAAS;AAAA,KAAA;AAAA,IAE9B,YAAA,mBAAeA,uBAAAA,CAAA,aAAA,CAACU,oBAAA,EAAA,EAAS,IAAA,EAAM,EAAA,EAAI,CAAA,mBAAKV,uBAAAA,CAAA,aAAA,CAACW,oBAAA,EAAA,EAAS,MAAM,EAAA,EAAI;AAAA,GAEjE,CACF,CACF,CAAA;AAEJ,CAAA;ACnIO,IAAM,gBAA8C,CAAC;AAAA,EAC1D,IAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,KAAM;AAEJ,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,uBACEX,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EAAA,EACZ,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACVA,uBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,KAAK,IAAA,CAAK,EAAA;AAAA,QACV,OAAA,EAAS,MAAM,UAAA,GAAa,IAAA,CAAK,EAAE,CAAA;AAAA,QACnC,WAAW,CAAA,4DAAA,EACT,SAAA,KAAc,IAAA,CAAK,EAAA,GACf,wCACA,8BACN,CAAA;AAAA,OAAA;AAAA,sBAEAA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8FAAA,EAAA,EACZ,IAAA,CAAK,SAAA,mBACJA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,IAAA,CAAK,SAAA,EAAW,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,SAAA,EAAU,4BAAA,EAA6B,CAAA,mBAEjFA,uBAAAA,CAAA,aAAA,CAACY,iBAAA,EAAA,EAAM,IAAA,EAAM,EAAA,EAAI,SAAA,EAAU,cAAa,CAE5C,CAAA;AAAA,sBACAZ,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,YAAA,EAAe,cAAc,IAAA,CAAK,EAAA,GAAK,eAAA,GAAkB,YAAY,CAAA,CAAA,EAAA,EAClF,IAAA,CAAK,IACR,CAAA,EACC,KAAK,WAAA,oBACJA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EAAA,EAAkC,IAAA,CAAK,WAAY,CAEtE,CAAA;AAAA,MACC,SAAA,KAAc,IAAA,CAAK,EAAA,oBAAMA,uBAAAA,CAAA,cAACa,iBAAA,EAAA,EAAM,IAAA,EAAM,EAAA,EAAI,SAAA,EAAU,eAAA,EAAgB;AAAA,KAExE,CACH,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,MAAM,iBAAA,GAAoB,CACxB,KAAA,EACA,IAAA,EACA,MACA,IAAA,GAAyB,IACzB,UAAA,KACG;AACH,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,GAAG,OAAO,IAAA;AAEvC,IAAA,uBACEb,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEAAA,EAAA,EACZ,sBACDA,uBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAM,KAAM,CACf,CAAA,kBACAA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EAAA,EACZ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,qBACRA,uBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,KAAK,GAAA,CAAI,EAAA;AAAA,QACT,OAAA,EAAS,MAAM,cAAA,GAAiB,IAAA,EAAM,IAAI,EAAE,CAAA;AAAA,QAC5C,WAAW,CAAA,oFAAA,EACT,UAAA,KAAe,GAAA,CAAI,EAAA,GACf,wCACA,8BACN,CAAA;AAAA,OAAA;AAAA,MAEC,GAAA,CAAI,SAAA,mBACFA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,GAAA,EAAK,GAAA,CAAI,SAAA,EAAW,GAAA,EAAK,GAAA,CAAI,IAAA,EAAM,SAAA,EAAU,gDAA+C,CAAA,mBAEjGA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAA,EAAsB,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAE,CAC5D,CAAA;AAAA,sBAEHA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,wBAAA,EAA2B,UAAA,KAAe,GAAA,CAAI,EAAA,GAAK,eAAA,GAAkB,eAAe,CAAA,CAAA,EAAA,EACjG,IAAI,IACP,CAAA;AAAA,MACC,eAAe,GAAA,CAAI,EAAA,oBAClBA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EAAA,kBACbA,wBAAA,aAAA,CAACa,iBAAA,EAAA,EAAM,MAAM,EAAA,EAAI,SAAA,EAAU,cAAa,CAC1C;AAAA,KAGL,CACH,CACF,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,IAAA,uBACEb,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SACZ,iBAAA,CAAkB,cAAA,kBAAMA,uBAAAA,CAAA,cAACc,gBAAA,EAAA,EAAK,IAAA,EAAM,IAAI,CAAA,EAAI,QAAA,EAAU,QAAQ,MAAA,EAAQ,gBAAA,EAAkB,OAAO,CAAA,EAC/F,kBAAkB,cAAA,kBAAMd,uBAAAA,CAAA,aAAA,CAACY,qBAAM,IAAA,EAAM,EAAA,EAAI,CAAA,EAAI,SAAA,EAAW,QAAQ,OAAA,EAAS,gBAAA,EAAkB,QAAQ,CAAA,EACnG,iBAAA,CAAkB,gCAAMZ,uBAAAA,CAAA,aAAA,CAACe,iBAAA,EAAA,EAAU,MAAM,EAAA,EAAI,CAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,SAAS,gBAAA,EAAkB,QAAQ,CAAA,EACvG,iBAAA,CAAkB,gCAAMf,uBAAAA,CAAA,cAACgB,iBAAA,EAAA,EAAM,IAAA,EAAM,IAAI,CAAA,EAAI,QAAA,EAAU,OAAA,CAAQ,MAAA,EAAQ,kBAAkB,OAAO,CAAA,EAChG,iBAAA,CAAkB,cAAA,kBAAMhB,uBAAAA,CAAA,aAAA,CAACe,iBAAA,EAAA,EAAU,IAAA,EAAM,IAAI,CAAA,EAAI,QAAA,EAAU,QAAQ,MAAA,EAAQ,gBAAA,EAAkB,OAAO,CACvG,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,uBACEf,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qNACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mHAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kCAAA,EAAA,EACX,IAAA,KAAS,SAAS,0BAAA,GAAS,gCAC9B,CAAA,kBACAA,uBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,OAAA;AAAA,MACT,SAAA,EAAU;AAAA,KAAA;AAAA,oBAEVA,uBAAAA,CAAA,aAAA,CAACiB,aAAA,EAAA,EAAE,MAAM,EAAA,EAAI;AAAA,GAEjB,CAAA,kBAEAjB,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,OAAA,EAAA,EACZ,IAAA,KAAS,MAAA,GAAS,cAAA,EAAe,GAAI,iBAAA,EACxC,CACF,CAAA;AAEJ,CAAA;AC3IO,IAAM,6BAAwE,CAAC;AAAA,EACpF,SAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA;AAAA,EACA,mBAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIkB,gBAAc,IAAI,CAAA;AAEtD,EAAA7B,iBAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAG9B,MAAA,IAAI,YAAY,MAAA,EAAQ;AAEtB,QAAA,MAAM,QAAQ,WAAA,CAAY,MAAA,CAAO,cAAA,GAAiB,OAAA,EAAS,QAAQ,CAAC,CAAA;AAEpE,QAAA,MAAM,SAAS,WAAA,CAAY,MAAA,CAAO,eAAA,GAAkB,OAAA,EAAS,QAAQ,CAAC,CAAA;AAEtE,QAAA,MAAM,SAAS,WAAA,CAAY,MAAA,CAAO,eAAA,GAAkB,OAAA,EAAS,QAAQ,CAAC,CAAA;AACtE,QAAA,aAAA,CAAc,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,CAAA;AAAA,MACtC;AAAA,IACF,GAAG,GAAI,CAAA;AACP,IAAA,OAAO,MAAM,cAAc,KAAK,CAAA;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,uBACEW,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8BAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,IAAA,EAAA,EAAG,WAAU,sDAAA,EAAA,EAAuD,mCAErE,mBAGAA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,QAAG,SAAA,EAAU,oBAAA,EAAA,EAAqB,0BAAI,CAAA,kBACvCA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAA,kBACbA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDACbA,uBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAA,EAAgB,qBAAI,CAAA,kBACpCA,wBAAA,aAAA,CAAC,WAAA,EAAA,EAAY,QAAQ,SAAA,EAAW,KAAA,EAAO,YAAY,SAAA,GAAY,QAAA,EAAU,CAC3E,CAAA,kBACAA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAA,EAAgB,eAAG,CAAA,kBACnCA,uBAAAA,CAAA,aAAA,CAAC,eAAY,MAAA,EAAQ,SAAA,EAAW,OAAO,SAAA,GAAY,IAAA,GAAO,KAAA,EAAO,CACnE,CAAA,kBACAA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAA,EAAgB,qBAAI,CAAA,kBACpCA,uBAAAA,CAAA,aAAA,CAAC,eAAY,MAAA,EAAQ,SAAA,EAAW,OAAO,SAAA,GAAY,SAAA,GAAY,SAAS,CAC1E,CACF,CACF,CAAA,kBAGAA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,wBAAqB,0BAAI,CAAA,kBACvCA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,gBAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,eAAA,EAAA,EAAgB,eAAG,CAAA,kBACnCA,uBAAAA,CAAA,aAAA,CAAC,eAAY,MAAA,EAAQ,YAAA,EAAc,OAAO,YAAA,GAAe,KAAA,GAAQ,MAAM,CACzE,CAAA,kBACAA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,eAAA,EAAA,EAAgB,qBAAI,CAAA,kBACpCA,uBAAAA,CAAA,aAAA,CAAC,eAAY,MAAA,EAAQ,QAAA,EAAU,OAAO,QAAA,GAAW,MAAA,GAAS,QAAQ,CACpE,CACF,CACF,CAAA,kBAGAA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BACbA,uBAAAA,CAAA,cAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oBAAA,EAAA,EAAqB,0BAAI,CAAA,kBACvCA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gBAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,eAAA,EAAA,EAAgB,eAAG,mBACnCA,uBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAAA,EAA2B,IAAK,CAClD,CAAA,EACC,SAAS,MAAA,oBACRA,wBAAA,aAAA,CAAAA,uBAAAA,CAAA,QAAA,EAAA,IAAA,kBACEA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,mCAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAU,eAAA,EAAA,EAAgB,eAAG,CAAA,kBACnCA,uBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAkB,cAAe,CACnD,GACC,iBAAA,oBACCA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDACbA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAA4B,0BAAI,CAAA,kBAC/CA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EAAA,EAAuB,mBAAA,IAAuB,iBAAkB,CAAA,kBAC/EA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EAAA,EAA0C,MAAA,EAAK,iBAAkB,CAClF,CAEJ,CAEJ,CACF,CAAA,EAGC,UAAA,oBACCA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,IAAA,EAAA,EAAG,WAAU,oBAAA,EAAA,EAAqB,wCAAkB,mBACrDA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDACbA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mEACbA,uBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAA,EAAgB,eAAG,CAAA,kBACnCA,wBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,2BAAA,EAAA,EAA6B,UAAA,CAAW,IAAA,EAAK,KAAG,CAClE,CAAA,kBACAA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,+CAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAA,EAAgB,eAAG,mBACnCA,uBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAiB,UAAA,CAAW,KAAA,EAAM,KAAG,CACvD,CAAA,kBACAA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+CAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAA,EAAgB,eAAG,CAAA,kBACnCA,uBAAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAU,eAAA,EAAA,EAAiB,WAAW,KAAA,EAAM,KAAG,CACvD,CAAA,kBAEAA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BACbA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,mCAAA,EACR,UAAA,CAAW,UAAA,CAAW,IAAI,IAAI,UAAA,CAAW,UAAA,CAAW,KAAK,CAAA,GAAK,GAAA,GAAM,EAAA,GACjE,eACC,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA,GAAI,UAAA,CAAW,UAAA,CAAW,KAAK,CAAA,GAAK,GAAA,GAAM,EAAA,GACrE,eAAA,GACA,cACN,CAAA,CAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAM,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA,GAAI,UAAA,CAAW,UAAA,CAAW,KAAK,CAAA,GAAK,GAAG,CAAC,CAAA,CAAA;AAAA;AAC7F;AAAA,GAEJ,mBACAA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDACV,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA,GAAI,UAAA,CAAW,WAAW,KAAK,CAAA,GAAK,KAAK,OAAA,CAAQ,CAAC,GAAE,GACnF,CACF,CACF,CACF,CAAA,kBAIFA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,uCAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,2BAAA,EAAA,EAA4B,kCAC3B,IAAI,IAAA,IAAO,kBAAA,EAC3B,CACF,CACF,CAAA;AAEJ;AAGA,IAAM,cAA4D,CAAC,EAAE,QAAQ,KAAA,EAAM,qBACjFA,uBAAAA,CAAA,aAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,SAAA,EAAW,CAAA,0CAAA,EACT,MAAA,GACI,yBAAA,GACA,2BACN,CAAA;AAAA,GAAA;AAAA,EAEC;AACH,CAAA;;;AC7JK,IAAM,oBAAsD,CAAC;AAAA,EAClE,SAAA,EAAW,aAAA;AAAA,EACX,aAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,IAAA,GAAO,IAAA;AAAA,EACP,QAAQ,aAAA,GAAgB,CAAA;AAAA,EACxB,OAAO,YAAA,GAAe,KAAA;AAAA,EACtB,kBAAA;AAAA,EACA,aAAA,GAAgB,KAAA;AAAA,EAChB,SAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAG;AACL,CAAA,KAAM;AAEJ,EAAA,MAAM,IAAA,GAAO,aAAA,GAAgB,MAAA,GAAU,eAAA,GAAkB,SAAA,GAAY,QAAA;AAGrE,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIkB,gBAAmC,aAAa,CAAA;AAChG,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,gBAA6B,iBAAiB,CAAA;AAChF,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,IAAIA,eAAAA,CAAS,gBAAA,IAAoB,EAAE,CAAA;AAGjE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,gBAAS,QAAQ,CAAA;AACnD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,gBAAS,aAAa,CAAA;AAClD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,gBAAS,YAAY,CAAA;AACnD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,gBAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,gBAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,gBAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,gBAAS,IAAI,CAAA;AAG/C,EAAA,MAAM,SAAA,GAAY9B,cAAyB,IAAI,CAAA;AAC/C,EAAA,MAAM,YAAA,GAAeA,cAAuB,IAAI,CAAA;AAGhD,EAAAC,iBAAU,MAAM;AACd,IAAA,IAAI,IAAA,KAAS,UAAU,aAAA,EAAe;AACnC,MAAA,MAAM,QAAA,GAAW,SAAA,IAAa,aAAA,CAAc,CAAC,CAAA,EAAG,EAAA;AAChD,MAAA,MAAM,OAAO,aAAA,CAAc,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,QAAQ,CAAA;AACtD,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,mBAAA,CAAoB,KAAK,SAAS,CAAA;AAClC,QAAA,YAAA,CAAa,KAAK,EAAE,CAAA;AAAA,MACtB;AAAA,IACH,CAAA,MAAA,IAAW,IAAA,KAAS,SAAA,IAAa,eAAA,EAAiB;AAE/C,MAAA,MAAM,GAAA,GAAoB,EAAE,SAAA,EAAW,EAAA,EAAG;AAE1C,MAAA,IAAI,UAAU,OAAA,EAAS;AACrB,QAAA,MAAM,CAAA,GAAI,gBAAgB,MAAA,CAAO,IAAA,CAAK,OAAK,CAAA,CAAE,EAAA,KAAO,UAAU,OAAO,CAAA;AACrE,QAAA,IAAI,CAAA,EAAG,GAAA,CAAI,SAAA,GAAY,CAAA,CAAE,IAAA;AAAA,MAC5B,CAAA,MAAA,IAAW,eAAA,CAAgB,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5C,QAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,MAAA,CAAO,CAAC,CAAA;AAC3C,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,GAAA,CAAI,YAAY,UAAA,CAAW,IAAA;AAC3B,UAAA,YAAA,CAAa,QAAM,EAAE,GAAG,GAAG,OAAA,EAAS,UAAA,CAAW,IAAG,CAAE,CAAA;AAAA,QACtD;AAAA,MACF;AAEC,MAAA,IAAI,UAAU,QAAA,EAAU;AACtB,QAAA,MAAM,CAAA,GAAI,gBAAgB,OAAA,CAAQ,IAAA,CAAK,OAAK,CAAA,CAAE,EAAA,KAAO,UAAU,QAAQ,CAAA;AACvE,QAAA,IAAI,CAAA,EAAG,GAAA,CAAI,UAAA,GAAa,CAAA,CAAE,IAAA;AAAA,MAC5B;AAGA,MAAA,IAAI,UAAU,QAAA,EAAU;AACtB,QAAA,MAAM,CAAA,GAAI,gBAAgB,OAAA,EAAS,IAAA,CAAK,OAAK,CAAA,CAAE,EAAA,KAAO,UAAU,QAAQ,CAAA;AACxE,QAAA,IAAI,CAAA,EAAG,GAAA,CAAI,UAAA,GAAa,CAAA,CAAE,IAAA;AAAA,MAC5B;AAEA,MAAA,IAAI,UAAU,OAAA,EAAS;AACrB,QAAA,MAAM,CAAA,GAAI,gBAAgB,MAAA,EAAQ,IAAA,CAAK,OAAK,CAAA,CAAE,EAAA,KAAO,UAAU,OAAO,CAAA;AACtE,QAAA,IAAI,CAAA,EAAG,GAAA,CAAI,SAAA,GAAY,CAAA,CAAE,IAAA;AAAA,MAC3B;AAEA,MAAA,IAAI,UAAU,OAAA,EAAS;AACrB,QAAA,MAAM,CAAA,GAAI,gBAAgB,MAAA,EAAQ,IAAA,CAAK,OAAK,CAAA,CAAE,EAAA,KAAO,UAAU,OAAO,CAAA;AACtE,QAAA,IAAI,CAAA,EAAG,GAAA,CAAI,cAAA,GAAiB,CAAA,CAAE,IAAA;AAAA,MAChC;AAEA,MAAA,mBAAA,CAAoB,GAAG,CAAA;AAAA,IAC1B,CAAA,MAAO;AACJ,MAAA,mBAAA,CAAoB,aAAa,CAAA;AAAA,IACpC;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,aAAA,EAAe,iBAAiB,SAAA,EAAW,SAAA,EAAW,aAAa,CAAC,CAAA;AAG9E,EAAA,MAAM,gBAAA,GAAmB8B,mBAAY,MAAM;AACzC,IAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AAE3B,IAAA,IAAI,CAAC,SAAS,iBAAA,EAAmB;AAC/B,MAAA,YAAA,CAAa,OAAA,CAAQ,iBAAA,EAAkB,CAAE,KAAA,CAAM,CAAA,GAAA,KAAO;AACpD,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,uCAAA,EAA0C,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAAA,MACvE,CAAC,CAAA;AACD,MAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,IACtB,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,cAAA,EAAe;AACxB,MAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,IACvB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA9B,iBAAU,MAAM;AACd,IAAA,MAAM,iBAAiB,MAAM;AAC3B,MAAA,eAAA,CAAgB,CAAC,CAAC,QAAA,CAAS,iBAAiB,CAAA;AAAA,IAC9C,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,oBAAoB,cAAc,CAAA;AAC5D,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,kBAAA,EAAoB,cAAc,CAAA;AAAA,EAC9E,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,SAAA,CAAU,SAAS,KAAA,EAAM;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,SAAS,IAAA,EAAK;AAAA,IAC1B;AACA,IAAA,YAAA,CAAa,CAAC,SAAS,CAAA;AAAA,EACzB,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,EAAA,KAAe;AACvC,IAAA,YAAA,CAAa,EAAE,CAAA;AACf,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,EACvB,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,CAAC,IAAA,EAAc,EAAA,KAAe;AACvD,IAAA,YAAA,CAAa,CAAA,IAAA,KAAQ;AACnB,MAAA,MAAM,IAAA,GAAO,EAAE,GAAG,IAAA,EAAK;AACvB,MAAA,IAAI,IAAA,KAAS,QAAA,EAAU,IAAA,CAAK,OAAA,GAAU,EAAA;AACtC,MAAA,IAAI,IAAA,KAAS,SAAA,EAAW,IAAA,CAAK,QAAA,GAAW,EAAA;AACxC,MAAA,IAAI,IAAA,KAAS,SAAA,EAAW,IAAA,CAAK,QAAA,GAAW,EAAA;AACxC,MAAA,IAAI,IAAA,KAAS,QAAA,EAAU,IAAA,CAAK,OAAA,GAAU,EAAA;AACtC,MAAA,IAAI,IAAA,KAAS,QAAA,EAAU,IAAA,CAAK,OAAA,GAAU,EAAA;AACtC,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,IAAA,uBAAOW,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wEAAqE,yBAAuB,CAAA;AAAA,EACpH;AAEA,EAAA,uBACEA,uBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,YAAA;AAAA,MACL,SAAA,EAAW,gDAAgD,SAAS,CAAA,CAAA;AAAA,MACpE;AAAA,KAAA;AAAA,oBAGAA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,iBAAA,EAAA,kBAGfA,uBAAAA,CAAA,aAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,KAAK,IAAA,KAAS,MAAA,GAAS,SAAA,GAAY,IAAA,CAAK,UAAU,gBAAgB,CAAA;AAAA,QAClE,GAAA,EAAK,SAAA;AAAA,QACL,SAAA,EAAW,gBAAA;AAAA,QACX,KAAA;AAAA,QACA,QAAA;AAAA,QACA,IAAA,EAAM,SAAA;AAAA,QACN,MAAA;AAAA,QACA,KAAA,EAAO,OAAA;AAAA,QACP,QAAA;AAAA,QACA,kBAAA;AAAA,QACA,QAAQ,MAAM;AACZ,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA,MAAA,IAAS;AACT,UAAA,IAAI,SAAA,EAAW,SAAA,CAAU,OAAA,EAAS,IAAA,EAAK;AAAA,QACzC,CAAA;AAAA,QACA,QAAQ,MAAM;AACZ,UAAA,YAAA,CAAa,IAAI,CAAA;AACjB,UAAA,MAAA,IAAS;AAAA,QACX,CAAA;AAAA,QACA,SAAS,MAAM;AACb,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA,OAAA,IAAU;AAAA,QACZ,CAAA;AAAA,QACA,SAAS,MAAM;AACb,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA,OAAA,IAAU;AAAA,QACZ,CAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN,EAGC,SAAA,oBACCA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qFAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gFAAA,EAAiF,CAClG,CAAA,kBAIFA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,gCAAA,EAAmC,SAAA,IAAa,CAAC,YAAA,GAAe,mCAAA,GAAsC,aAAa,CAAA,CAAA,EAAA,kBACjIA,uBAAAA,CAAA,aAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,SAAA;AAAA,QACA,YAAA;AAAA,QACA,SAAA;AAAA,QACA,cAAc,IAAA,KAAS,QAAA;AAAA,QACvB,QAAA;AAAA,QACA,KAAA,EAAO,IAAA,KAAS,MAAA,GAAS,aAAA,EAAe,IAAA,CAAK,OAAK,CAAA,CAAE,EAAA,KAAO,SAAS,CAAA,EAAG,IAAA,GAAO,MAAA;AAAA,QAC9E,WAAA,EAAa,eAAA;AAAA,QACb,kBAAA,EAAoB,gBAAA;AAAA,QACpB,YAAA,EAAc,MAAM,YAAA,CAAa,CAAC,SAAS,CAAA;AAAA,QAC3C,YAAA,EAAc,MAAM,WAAA,CAAY,CAAC,QAAQ,CAAA;AAAA,QACzC,cAAA,EAAgB,MAAM,eAAA,CAAgB,IAAI;AAAA;AAAA,KAE9C,GAGC,YAAA,KAAiB,IAAA,KAAS,UAAU,IAAA,KAAS,SAAA,CAAA,oBAC5CA,uBAAAA,CAAA,aAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,KAAA,EAAO,aAAA;AAAA,QACP,SAAA;AAAA,QACA,UAAA,EAAY,gBAAA;AAAA,QACZ,OAAA,EAAS,eAAA;AAAA,QACT,gBAAA,EAAkB,SAAA;AAAA,QAClB,cAAA,EAAgB,kBAAA;AAAA,QAChB,OAAA,EAAS,MAAM,eAAA,CAAgB,KAAK;AAAA;AAAA,KAGxC,CAAA;AAAA,IAGC,aAAA,oBACCA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,kEAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA;AAAA,MAAC,0BAAA;AAAA,MAAA;AAAA,QACC,SAAA;AAAA,QACA,SAAA;AAAA,QACA,YAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA,iBAAA,EAAmB,SAAA;AAAA,QACnB,mBAAA,EACE,IAAA,KAAS,MAAA,GAAS,aAAA,EAAe,IAAA,CAAK,OAAK,CAAA,CAAE,EAAA,KAAO,SAAS,CAAA,EAAG,IAAA,GAAO,MAAA;AAAA,QAEzE,IAAA;AAAA,QACA,cAAA,EAAgB,eAAe,MAAA,IAAU;AAAA;AAAA,KAE7C;AAAA,GAEJ;AAEJ;ACtPO,IAAM,uBAA4D,CAAC;AAAA,EACxE,YAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIkB,gBAAc,IAAI,CAAA;AAEtD,EAAA7B,iBAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAG9B,MAAA,IAAI,YAAY,MAAA,EAAQ;AAEtB,QAAA,MAAM,QAAQ,WAAA,CAAY,MAAA,CAAO,cAAA,GAAiB,OAAA,EAAS,QAAQ,CAAC,CAAA;AAEpE,QAAA,MAAM,SAAS,WAAA,CAAY,MAAA,CAAO,eAAA,GAAkB,OAAA,EAAS,QAAQ,CAAC,CAAA;AAEtE,QAAA,MAAM,SAAS,WAAA,CAAY,MAAA,CAAO,eAAA,GAAkB,OAAA,EAAS,QAAQ,CAAC,CAAA;AACtE,QAAA,aAAA,CAAc,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,CAAA;AAAA,MACtC;AAAA,IACF,GAAG,GAAI,CAAA;AACP,IAAA,OAAO,MAAM,cAAc,KAAK,CAAA;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,uBACEW,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,8BAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,QAAG,SAAA,EAAU,sDAAA,EAAA,EAAuD,6BAErE,CAAA,kBAGAA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,QAAG,SAAA,EAAU,oBAAA,EAAA,EAAqB,0BAAI,CAAA,kBACvCA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gBAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EAAA,EACZ,YACH,mBACAA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,eAAA,EAAA,EAAgB,eAAG,mBACnCA,uBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBACb,YAAA,GAAe,CAAA,EAAE,OAAI,UACxB,CACF,mBACAA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDACbA,uBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAgB,2BAAK,CAAA,kBACrCA,uBAAAA,CAAA,aAAA,CAACoB,cAAA,EAAY,MAAA,EAAQ,eAAe,KAAA,EAAO,aAAA,GAAgB,IAAA,GAAO,KAAA,EAAO,CAC3E,CACF,CACF,mBAGApB,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BACbA,uBAAAA,CAAA,cAAC,IAAA,EAAA,EAAG,SAAA,EAAU,wBAAqB,0BAAI,CAAA,kBACvCA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,mCAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,mCAAA,EAAA,EACZ,YAAY,IACf,CAAA,kBACAA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,oCAAA,EAAA,EAAqC,QAC7C,WAAA,CAAY,EACnB,GACC,WAAA,CAAY,QAAA,oBACXA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDACbA,uBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAgB,eAAG,CAAA,kBACnCA,uBAAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAU,gBAAA,EAAA,EAAkB,YAAY,QAAA,EAAS,GAAC,CAC1D,CAAA,kBAEFA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,eAAA,EAAA,EAAgB,2BAAK,mBACrCA,uBAAAA,CAAA,cAACoB,YAAAA,EAAA,EAAY,QAAQ,aAAA,EAAe,KAAA,EAAO,aAAA,GAAgB,IAAA,GAAO,OAAO,CAC3E,CACF,CACF,CAAA,kBAGApB,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,IAAA,EAAA,EAAG,WAAU,oBAAA,EAAA,EAAqB,0BAAI,mBACvCA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCACbA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDACbA,uBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAgB,qBAAI,CAAA,kBACpCA,uBAAAA,CAAA,aAAA,CAACoB,cAAA,EAAY,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO,YAAY,SAAA,GAAY,QAAA,EAAU,CAC3E,CAAA,kBACApB,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,eAAA,EAAA,EAAgB,qBAAI,mBACpCA,uBAAAA,CAAA,cAACoB,YAAAA,EAAA,EAAY,QAAQ,SAAA,EAAW,KAAA,EAAO,YAAY,SAAA,GAAY,OAAA,EAAS,CAC1E,CACF,CACF,mBAGApB,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BACbA,uBAAAA,CAAA,cAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oBAAA,EAAA,EAAqB,gCAAK,mBACxCA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCACbA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDACbA,uBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAgB,eAAG,CAAA,kBACnCA,uBAAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAW,CAAA,oDAAA,EACf,oBAAoB,KAAA,GAAQ,uBAAA,GAC5B,oBAAoB,MAAA,GAAS,0BAAA,GAC7B,2BACF,CAAA,CAAA,EAAA,EACG,eACH,CACF,CAAA,kBACAA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAU,eAAA,EAAA,EAAgB,2BAAK,CAAA,kBACrCA,wBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iBAAA,EAAA,EAAmB,cAAA,CAAe,MAAO,CAC3D,CAAA,EACC,eAAe,MAAA,GAAS,CAAA,oBACvBA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,8BAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,gCAAA,EAAA,EAAiC,4CAAO,CAAA,kBACvDA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sBAAA,EAAA,EACZ,cAAA,CAAe,IAAI,CAAC,GAAA,qBACnBA,uBAAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,GAAA;AAAA,MACL,SAAA,EAAW,CAAA,kCAAA,EACT,GAAA,KAAQ,YAAA,GACJ,sCACA,2BACN,CAAA;AAAA,KAAA;AAAA,IAEC;AAAA,GAEJ,CACH,CACF,CAEJ,CACF,CAAA,kBAGAA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,IAAA,EAAA,EAAG,WAAU,oBAAA,EAAA,EAAqB,0BAAI,mBACvCA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCACbA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDACbA,uBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAgB,eAAG,CAAA,kBACnCA,uBAAAA,CAAA,aAAA,CAACoB,cAAA,EAAY,MAAA,EAAQ,cAAc,KAAA,EAAO,YAAA,GAAe,QAAQ,IAAA,EAAM,CACzE,mBACApB,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDACbA,uBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAgB,qBAAI,CAAA,kBACpCA,uBAAAA,CAAA,aAAA,CAACoB,cAAA,EAAY,MAAA,EAAQ,UAAU,KAAA,EAAO,QAAA,GAAW,SAAS,MAAA,EAAQ,CACpE,CACF,CACF,CAAA,EAGC,8BACCpB,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BACbA,uBAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oBAAA,EAAA,EAAqB,wCAAkB,CAAA,kBACrDA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+CAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,eAAA,EAAA,EAAgB,eAAG,mBACnCA,uBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAA6B,UAAA,CAAW,IAAA,EAAK,KAAG,CAClE,CAAA,kBACAA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,+CAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAU,eAAA,EAAA,EAAgB,eAAG,CAAA,kBACnCA,uBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAiB,UAAA,CAAW,KAAA,EAAM,KAAG,CACvD,CAAA,kBACAA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,+CAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAU,eAAA,EAAA,EAAgB,eAAG,CAAA,kBACnCA,wBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,eAAA,EAAA,EAAiB,UAAA,CAAW,OAAM,KAAG,CACvD,mBAEAA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BACbA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,mCAAA,EACR,UAAA,CAAW,UAAA,CAAW,IAAI,IAAI,UAAA,CAAW,UAAA,CAAW,KAAK,CAAA,GAAK,GAAA,GAAM,EAAA,GACjE,eACC,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA,GAAI,UAAA,CAAW,UAAA,CAAW,KAAK,CAAA,GAAK,GAAA,GAAM,EAAA,GACrE,eAAA,GACA,cACN,CAAA,CAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAM,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA,GAAI,UAAA,CAAW,UAAA,CAAW,KAAK,CAAA,GAAK,GAAG,CAAC,CAAA,CAAA;AAAA;AAC7F;AAAA,GAEJ,CAAA,kBACAA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EAAA,EAAA,CACV,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA,GAAI,UAAA,CAAW,WAAW,KAAK,CAAA,GAAK,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,EAAE,GACnF,CACF,CACF,CACF,CAAA,kBAIFA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,MAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oBAAA,EAAA,EAAqB,0BAAI,CAAA,kBACvCA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EAAA,EACZ,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,UAAA,EAAY,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,GAAA,qBAC1CA,uBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,GAAA;AAAA,MACL,SAAA,EAAW,CAAA,gEAAA,EACT,GAAA,KAAQ,YAAA,GACJ,kCAAA,GACA,eAAe,QAAA,CAAS,GAAG,CAAA,GAC3B,kCAAA,GACA,2BACN,CAAA;AAAA,KAAA;AAAA,oBAEAA,uBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAK,iBAAI,GAAI,CAAA;AAAA,IACb,QAAQ,YAAA,oBAAgBA,uBAAAA,CAAA,aAAA,CAAC,cAAK,QAAC,CAAA;AAAA,IAC/B,cAAA,CAAe,QAAA,CAAS,GAAG,CAAA,IAAK,GAAA,KAAQ,gCAAgBA,uBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAK,QAAC;AAAA,GAEnE,CACH,CACF,CAAA,kBAGAA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAAA,EAA4B,eAAA,EAAA,iBAC3B,IAAI,MAAK,EAAE,kBAAA,EAC3B,CACF,CACF,CAAA;AAEJ;AAGA,IAAMoB,eAA4D,CAAC,EAAE,QAAQ,KAAA,EAAM,qBACjFpB,uBAAAA,CAAA,aAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,SAAA,EAAW,CAAA,0CAAA,EACT,MAAA,GACI,yBAAA,GACA,2BACN,CAAA;AAAA,GAAA;AAAA,EAEC;AACH,CAAA;;;ACzOK,IAAM,cAA0C,CAAC;AAAA,EACtD,QAAA;AAAA,EACA,KAAA;AAAA,EACA,kBAAA;AAAA,EACA,YAAA;AAAA,EACA,kBAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA,GAAgB,KAAA;AAAA,EAChB,SAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,OAAO,IAAA,GAAO,KAAA,EAAO,UAAU,MAAA,EAAQ,QAAA,GAAW,OAAM,GAAI,QAAA;AAGpE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIkB,gBAAS,CAAC,CAAA;AAClD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,gBAAS,QAAQ,CAAA;AACnD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,gBAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,gBAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,gBAAS,IAAI,CAAA;AACvD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,gBAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAC5D,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAG1D,EAAA,MAAM,SAAA,GAAY9B,cAAyB,IAAI,CAAA;AAC/C,EAAA,MAAM,YAAA,GAAeA,cAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,YAAA,GAAeA,aAAAA,iBAAoB,IAAI,GAAA,EAAK,CAAA;AAGlD,EAAA,MAAM,WAAA,GAAc,MAAM,YAAY,CAAA;AAGtC,EAAA,MAAM,QAAA,GAAW+B,kBAAAA;AAAA,IACf,CAAC,KAAA,KAAkB;AACjB,MAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,KAAA,IAAS,KAAA,CAAM,MAAA,EAAQ;AACxC,MAAA,IAAI,eAAA,EAAiB;AAErB,MAAA,MAAM,IAAA,GAAO,MAAM,KAAK,CAAA;AACxB,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,0CAAA,EAA6C,KAAK,CAAA,CAAE,CAAA;AAGhE,MAAA,MAAM,UAAA,GAAa,SAAA;AACnB,MAAA,YAAA,CAAa,KAAK,CAAA;AAGlB,MAAA,kBAAA,CAAmB,IAAI,CAAA;AAGvB,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAA,qBAAA,CAAsB,MAAM;AAC1B,UAAA,UAAA,CAAW,MAAM;AAEf,YAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,+BAAA,EAAkC,KAAK,CAAA,CAAE,CAAA;AACrD,YAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,YAAA,YAAA,CAAa,IAAI,CAAA;AACjB,YAAA,YAAA,GAAe,MAAM,KAAK,CAAA;AAG1B,YAAA,qBAAA,CAAsB,MAAM;AAC1B,cAAA,qBAAA,CAAsB,MAAM;AAC1B,gBAAA,UAAA,CAAW,MAAM;AACf,kBAAA,kBAAA,CAAmB,KAAK,CAAA;AAGxB,kBAAA,IAAI,UAAA,EAAY;AACd,oBAAA,YAAA,CAAa,IAAI,CAAA;AAAA,kBACnB;AAEA,kBAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,iCAAA,EAAoC,KAAK,CAAA,UAAA,CAAY,CAAA;AAAA,gBACnE,GAAG,GAAG,CAAA;AAAA,cACR,CAAC,CAAA;AAAA,YACH,CAAC,CAAA;AAAA,UACH,GAAG,GAAG,CAAA;AAAA,QACR,CAAC,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,SAAA,EAAW,eAAA,EAAiB,YAAY;AAAA,GAClD;AAGA,EAAA,MAAM,cAAA,GAAiBA,mBAAY,MAAM;AACvC,IAAA,MAAM,YAAY,YAAA,GAAe,CAAA;AACjC,IAAA,IAAI,aAAa,CAAA,EAAG;AAClB,MAAA,QAAA,CAAS,SAAS,CAAA;AAAA,IACpB,WAAW,aAAA,EAAe;AAExB,MAAA,QAAA,CAAS,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,YAAA,EAAc,eAAe,KAAA,CAAM,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAGxD,EAAA,MAAM,UAAA,GAAaA,mBAAY,MAAM;AACnC,IAAA,MAAM,YAAY,YAAA,GAAe,CAAA;AACjC,IAAA,IAAI,SAAA,GAAY,MAAM,MAAA,EAAQ;AAC5B,MAAA,QAAA,CAAS,SAAS,CAAA;AAAA,IACpB,WAAW,aAAA,EAAe;AAExB,MAAA,QAAA,CAAS,CAAC,CAAA;AAAA,IACZ,CAAA,MAAO;AAEL,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,kBAAA,IAAqB;AAAA,IACvB;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,aAAA,EAAe,MAAM,MAAA,EAAQ,QAAA,EAAU,kBAAkB,CAAC,CAAA;AAG5E,EAAA,MAAM,eAAA,GAAkBA,mBAAY,MAAM;AACxC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,SAAA,CAAU,SAAS,KAAA,EAAM;AACzB,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,SAAS,IAAA,EAAK;AACxB,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAGd,EAAA,MAAM,gBAAA,GAAmBA,mBAAY,MAAM;AACzC,IAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AAE3B,IAAA,IAAI,CAAC,SAAS,iBAAA,EAAmB;AAC/B,MAAA,YAAA,CAAa,OAAA,CAAQ,iBAAA,EAAkB,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AACtD,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,uCAAA,EAA0C,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAAA,MACvE,CAAC,CAAA;AACD,MAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,IACtB,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,cAAA,EAAe;AACxB,MAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,IACvB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA9B,iBAAU,MAAM;AACd,IAAA,MAAM,iBAAiB,MAAM;AAC3B,MAAA,eAAA,CAAgB,CAAC,CAAC,QAAA,CAAS,iBAAiB,CAAA;AAAA,IAC9C,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,oBAAoB,cAAc,CAAA;AAC5D,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,kBAAA,EAAoB,cAAc,CAAA;AAAA,EAC9E,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,WAAA,GAAc8B,mBAAY,MAAM;AACpC,IAAA,IAAI,SAAA,EAAW;AAEb,MAAA,SAAA,CAAU,SAAS,IAAA,EAAK;AAAA,IAC1B,CAAA,MAAO;AAEL,MAAA,UAAA,EAAW;AAAA,IACb;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,UAAU,CAAC,CAAA;AAK1B,EAAA9B,iBAAU,MAAM;AACd,IAAA,IAAI,YAAY,MAAA,EAAQ;AAExB,IAAA,IAAI,YAAY,KAAA,EAAO;AAErB,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,GAAA,KAAQ;AAC3B,QAAA,IAAI,CAAC,YAAA,CAAa,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AAClC,UAAA,YAAA,CAAa,OAAA,CAAQ,IAAI,GAAG,CAAA;AAC5B,UAAA,OAAA,CAAQ,IAAI,CAAA,kDAAA,EAAqD,GAAG,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,QACvF;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,YAAY,MAAA,EAAQ;AAE7B,MAAA,MAAM,SAAA,GAAA,CAAa,YAAA,GAAe,CAAA,IAAK,KAAA,CAAM,MAAA;AAC7C,MAAA,MAAM,QAAA,GAAW,MAAM,SAAS,CAAA;AAChC,MAAA,IAAI,YAAY,CAAC,YAAA,CAAa,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG;AACpD,QAAA,YAAA,CAAa,OAAA,CAAQ,IAAI,SAAS,CAAA;AAClC,QAAA,OAAA,CAAQ,IAAI,CAAA,mDAAA,EAAsD,SAAS,CAAA,EAAA,EAAK,QAAA,CAAS,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,MAClG;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,KAAA,EAAO,OAAO,CAAC,CAAA;AAGjC,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,OAAA,KAAY,MAAA,IAAU,OAAA,KAAY,KAAA,EAAO;AAC7C,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAGxB,IAAA,MAAM,SAAA,GAAA,CAAa,YAAA,GAAe,CAAA,IAAK,KAAA,CAAM,MAAA;AAC7C,IAAA,MAAM,8BAAc,IAAI,GAAA,CAAI,CAAC,YAAA,EAAc,SAAS,CAAC,CAAA;AAErD,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,YAAA,CAAa,OAAA,CAAQ,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAEpC,MAAA,IAAI,OAAO,KAAA,CAAM,MAAA,IAAU,CAAC,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AAChD,QAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AAAA,MACnB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACxB,QAAA,YAAA,CAAa,OAAA,CAAQ,OAAO,GAAG,CAAA;AAC/B,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,4DAAA,EAA+D,GAAG,CAAA,CAAE,CAAA;AAAA,MAClF,CAAC,CAAA;AAAA,IACH;AAAA,EACF,GAAG,CAAC,YAAA,EAAc,KAAA,CAAM,MAAA,EAAQ,OAAO,CAAC,CAAA;AAGxC,EAAAA,iBAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,OAAA,CAAQ,IAAI,+DAA+D,CAAA;AAC3E,MAAA,YAAA,CAAa,QAAQ,KAAA,EAAM;AAAA,IAC7B,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,uBACEW,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wEAAqE,sCAEpF,CAAA;AAAA,EAEJ;AAGA,EAAA,MAAM,YAAA,GAAe,MAAM,MAAA,GAAS,CAAA;AAEpC,EAAA,uBACEA,uBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,YAAA;AAAA,MACL,SAAA,EAAW,uDAAuD,SAAS,CAAA,CAAA;AAAA,MAC3E;AAAA,KAAA;AAAA,oBAGAA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iBAAA,EAAA,EAEd,CAAC,eAAA,oBACAA,uBAAAA,CAAA,aAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,KAAK,WAAA,CAAY,EAAA;AAAA,QACjB,GAAA,EAAK,SAAA;AAAA,QACL,WAAW,WAAA,CAAY,SAAA;AAAA,QACvB,OAAO,EAAE,GAAG,KAAA,EAAO,GAAG,YAAY,KAAA,EAAM;AAAA,QACxC,QAAA,EAAU,YAAY,YAAA,KAAiB,CAAA;AAAA,QACvC,IAAA,EAAM,SAAA;AAAA,QACN,QAAA;AAAA,QACA,kBAAA;AAAA,QACA,QAAQ,MAAM;AACZ,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA,IAAI,SAAA,IAAa,eAAe,CAAA,EAAG;AAEjC,YAAA,SAAA,CAAU,SAAS,IAAA,EAAK;AAAA,UAC1B;AAAA,QACF,CAAA;AAAA,QACA,MAAA,EAAQ,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,QAC/B,OAAA,EAAS,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,QACjC,cAAA,EAAgB,CAAC,QAAA,KAAa,iBAAA,CAAkB,QAAQ,CAAA;AAAA,QACxD,OAAA,EAAS,WAAA;AAAA,QACT;AAAA;AAAA,QAKF,SAAA,IAAa,eAAA,qBACbA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,qFAAA,EAAA,kBACbA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDACbA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gFAAA,EAAiF,CAAA,kBAChGA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,uBAAA,EAAA,EACZ,kBAAkB,uBAAA,GAAW,CAAA,yBAAA,EAAQ,eAAe,CAAC,CAAA,GAAA,EAAM,MAAM,MAAM,CAAA,CAC1E,CACF,CACF,CAAA,kBAIFA,uBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,WAAW,CAAA,gCAAA,EACT,SAAA,IAAa,CAAC,YAAA,GAAe,sCAAsC,aACrE,CAAA;AAAA,OAAA;AAAA,sBAEAA,uBAAAA,CAAA,aAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,SAAA;AAAA,UACA,YAAA;AAAA,UACA,SAAA;AAAA,UACA,aAAA;AAAA,UACA,cAAA;AAAA,UACA,YAAA,EAAc,IAAA;AAAA,UACd,QAAA;AAAA,UACA,YAAA;AAAA,UACA,OAAO,WAAA,CAAY,IAAA;AAAA,UACnB,UAAU,CAAA,EAAG,YAAA,GAAe,CAAC,CAAA,GAAA,EAAM,MAAM,MAAM,CAAA,CAAA;AAAA,UAC/C,WAAA,EAAa,eAAA;AAAA,UACb,UAAA,EAAY,cAAA;AAAA,UACZ,MAAA,EAAQ,UAAA;AAAA,UACR,kBAAA,EAAoB,gBAAA;AAAA,UACpB,YAAA,EAAc,MAAM,YAAA,CAAa,CAAC,SAAS,CAAA;AAAA,UAC3C,gBAAA,EAAkB,MAAM,gBAAA,CAAiB,CAAC,aAAa,CAAA;AAAA,UACvD,YAAA,EAAc,MAAM,WAAA,CAAY,CAAC,QAAQ,CAAA;AAAA,UACzC,cAAA,EAAgB,MAAM,eAAA,CAAgB,CAAC,YAAY,CAAA;AAAA,UACnD,eAAe,MAAM;AACnB,YAAA,SAAA,CAAU,SAAS,WAAA,EAAY;AAC/B,YAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,UACzB;AAAA;AAAA;AACF,KACF,EAGC,gCACCA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uFACbA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qFAEbA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+FAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,6BACCA,uBAAAA,CAAA,cAAC,IAAA,EAAA,EAAG,SAAA,EAAU,8BAA4B,QAAA,CAAS,IAAK,mBACxDA,uBAAAA,CAAA,cAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kCAA+B,SAAA,EACvC,KAAA,CAAM,QAAO,qBAClB,CACF,CAAA,kBACAA,uBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,MAAM,eAAA,CAAgB,KAAK,CAAA;AAAA,QACpC,SAAA,EAAU,oDAAA;AAAA,QACV,YAAA,EAAW;AAAA,OAAA;AAAA,sBAEXA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAqB,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAA,kBACzEA,uBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,WAAA,EAAa,CAAA,EAAG,CAAA,EAAE,sBAAA,EAAuB,CAC9F;AAAA,KAEJ,CAAA,kBAGAA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,KAAA,EAAA,EACZ,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,qBAChBA,uBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,KAAK,IAAA,CAAK,EAAA;AAAA,QACV,SAAS,MAAM;AACb,UAAA,QAAA,CAAS,KAAK,CAAA;AACd,UAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,QACvB,CAAA;AAAA,QACA,SAAA,EAAW,CAAA,kEAAA,EACT,KAAA,KAAU,YAAA,GACN,2BACA,6CACN,CAAA;AAAA,OAAA;AAAA,sBAGAA,uBAAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,CAAA,0FAAA,EACT,KAAA,KAAU,YAAA,GAAe,gBAAgB,aAC3C,CAAA;AAAA,SAAA;AAAA,QAEC,KAAA,GAAQ;AAAA,OACX;AAAA,sBAGAA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,kBAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAA,EAAe,KAAK,IAAK,CAAA,EACvC,KAAK,QAAA,oBACJA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAAA,EACZ,KAAK,KAAA,CAAM,IAAA,CAAK,WAAW,EAAE,CAAA,EAAE,KAAE,MAAA,CAAO,IAAA,CAAK,MAAM,IAAA,CAAK,QAAA,GAAW,EAAE,CAAC,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAC1F,CAEJ,CAAA;AAAA,MAGC,KAAA,KAAU,YAAA,oBACTA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,eAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,SAAA,EAAU,IAAA,EAAK,cAAA,EAAe,OAAA,EAAQ,WAAA,EAAA,kBACnDA,uBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,eAAA,EAAgB,CAC1B,CACF;AAAA,KAGL,CACH,CACF,CACF,CAEF,CAAA;AAAA,IAGC,aAAA,oBACCA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,uFAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA;AAAA,MAAC,oBAAA;AAAA,MAAA;AAAA,QACC,cAAc,QAAA,CAAS,IAAA;AAAA,QACvB,YAAA;AAAA,QACA,WAAA;AAAA,QACA,YAAY,KAAA,CAAM,MAAA;AAAA,QAClB,SAAA;AAAA,QACA,aAAA;AAAA,QACA,aAAA,EAAe,SAAA;AAAA,QACf,eAAA,EAAiB,OAAA;AAAA,QACjB,WAAW,SAAA,IAAa,eAAA;AAAA,QACxB,YAAA;AAAA,QACA,QAAA;AAAA,QACA,cAAA,EAAgB,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,OAAO;AAAA;AAAA,KAEnD;AAAA,GAEJ;AAEJ;AC3ZA,IAAI,OAAO,QAAA,KAAa,WAAA,IAAe,CAAC,QAAA,CAAS,cAAA,CAAe,yBAAyB,CAAA,EAAG;AAC1F,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,EAAA,GAAK,yBAAA;AACX,EAAA,KAAA,CAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AA0BpB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AACjC;AAGA,IAAM,YAAA,GAAiC;AAAA,EACrC,eAAA,EAAiB,2BAAA;AAAA,EACjB,WAAA,EAAa,2BAAA;AAAA,EACb,SAAA,EAAW,SAAA;AAAA,EACX,cAAA,EAAgB,2BAAA;AAAA,EAChB,gBAAA,EAAkB,SAAA;AAAA,EAClB,OAAA,EAAS,IAAA;AAAA,EACT,IAAA,EAAM,MAAA;AAAA,EACN,YAAA,EAAc,iCAAA;AAAA,EACd,gBAAA,EAAkB;AACpB,CAAA;AAWO,IAAM,cAA0C,CAAC;AAAA,EACtD,QAAA;AAAA,EACA,KAAA,EAAO,SAAA;AAAA,EACP,QAAA,GAAW,KAAA;AAAA,EACX,UAAA,GAAa,KAAA;AAAA,EACb,OAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA,GAAiB,KAAA;AAAA,EACjB,YAAA,GAAe,IAAA;AAAA,EACf,cAAA,GAAiB,IAAA;AAAA,EACjB,cAAA,GAAiB,IAAA;AAAA,EACjB,iBAAA,GAAoB,IAAA;AAAA,EACpB;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,KAAA,GAAQ,EAAE,GAAG,YAAA,EAAc,GAAG,SAAA,EAAU;AAC9C,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIkB,gBAAS,EAAE,CAAA;AACrD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAChD,EAAA,MAAM,SAAA,GAAY9B,cAA8B,IAAI,CAAA;AACpD,EAAA,MAAM,cAAA,GAAiBA,cAAe,EAAE,CAAA;AAGxC,EAAAC,iBAAU,MAAM;AACd,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,gBAAA,CAAiB,EAAE,CAAA;AACnB,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AACtB,IAAA,MAAM,KAAA,GAAQ,SAAS,SAAA,IAAa,EAAA;AAGpC,IAAA,IAAI,UAAU,OAAA,EAAS;AACrB,MAAA,YAAA,CAAa,UAAU,OAAO,CAAA;AAAA,IAChC;AAGA,IAAA,gBAAA,CAAiB,EAAE,CAAA;AACnB,IAAA,aAAA,CAAc,KAAK,CAAA;AACnB,IAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AAEzB,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,MAAM,WAAW,MAAM;AACrB,MAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,MAAA,IAAU,cAAA,CAAe,YAAY,IAAA,EAAM;AAC1D,QAAA,gBAAA,CAAiB,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAC,CAAA;AACzC,QAAA,KAAA,EAAA;AACA,QAAA,SAAA,CAAU,OAAA,GAAU,UAAA,CAAW,QAAA,EAAU,KAAK,CAAA;AAAA,MAChD,CAAA,MAAA,IAAW,cAAA,CAAe,OAAA,KAAY,IAAA,EAAM;AAC1C,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAGA,IAAA,SAAA,CAAU,OAAA,GAAU,UAAA,CAAW,QAAA,EAAU,KAAK,CAAA;AAE9C,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,UAAU,OAAA,EAAS;AACrB,QAAA,YAAA,CAAa,UAAU,OAAO,CAAA;AAAA,MAChC;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAA,MAAM,gBAAA,GAAmB8B,mBAAY,MAAM;AACzC,IAAA,IAAI,UAAU,OAAA,EAAS;AACrB,MAAA,YAAA,CAAa,UAAU,OAAO,CAAA;AAAA,IAChC;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,gBAAA,CAAiB,SAAS,IAAI,CAAA;AAC9B,MAAA,aAAA,CAAc,IAAI,CAAA;AAAA,IACpB;AACA,IAAA,YAAA,IAAe;AAAA,EACjB,CAAA,EAAG,CAAC,QAAA,EAAU,YAAY,CAAC,CAAA;AAG3B,EAAA,MAAM,WAAA,GAAcA,mBAAY,MAAM;AACpC,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,gBAAA,EAAiB;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,OAAA,IAAU;AAAA,IACZ;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,gBAAA,EAAkB,OAAO,CAAC,CAAA;AAE1C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAqB,QAAA,CAAS,YAAA,IAAgB,KAAA,CAAM;AAEpD,EAAA,OAAA,CAAQ,IAAI,0BAAA,EAA4B;AAAA,IACtC,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,MAAM,QAAA,CAAS,IAAA;AAAA,IACf,aAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,eAAA,mBACJnB,uBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,EAAG,SAAA,IAAa,EAAE,CAAA,CAAA;AAAA,MAC7B,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,OAAA;AAAA,QACV,MAAA,EAAQ,CAAA;AAAA,QACR,IAAA,EAAM,CAAA;AAAA,QACN,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,MAAA;AAAA,QACR,SAAA,EAAW,OAAA;AAAA,QACX,SAAA,EAAW,MAAA;AAAA,QACX,MAAA,EAAQ,CAAA;AAAA,QACR,aAAA,EAAe;AAAA;AACjB,KAAA;AAAA,oBAGAA,uBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,4JAAA;AAAA,QACV,OAAA,EAAS,WAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,aAAa,KAAA,CAAM,WAAA;AAAA,UACnB,cAAA,EAAgB,CAAA,KAAA,EAAQ,KAAA,CAAM,IAAI,CAAA,gBAAA,CAAA;AAAA,UAClC,oBAAA,EAAsB,CAAA,KAAA,EAAQ,KAAA,CAAM,IAAI,CAAA,gBAAA,CAAA;AAAA,UACxC,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,aAAA,EAAe,MAAA;AAAA,UACf,QAAA,EAAU,UAAA;AAAA,UACV,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,CAAA;AAAA;AAAA;AAAA,0CAAA,CAAA;AAAA,UAIZ,SAAA,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA;AAAA;AAMb,OAAA;AAAA,sBAGAA,uBAAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,iDAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,UAAA,EAAY,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4CAAA,CAAA;AAAA,YAMZ,cAAA,EAAgB,WAAA;AAAA,YAChB,SAAA,EAAW;AAAA;AACb;AAAA,OACF;AAAA,sBAGAA,uBAAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,mCAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,UAAA,EAAY;AAAA;AACd;AAAA,OACF;AAAA,sBAGAA,uBAAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,uCAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,UAAA,EAAY;AAAA;AACd;AAAA,OACF;AAAA,MAEC,YAAA,oBACCA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,mEAAA,EAAA,EACZ,iBAAA,oBACCA,uBAAAA,CAAA,aAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,YAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,YAAA,aAAA,IAAgB;AAAA,UAClB,CAAA;AAAA,UACA,SAAA,EAAU,6LAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,UAAA,EAAY,8EAAA;AAAA,YACZ,SAAA,EAAW;AAAA,WACb;AAAA,UACA,KAAA,EAAM;AAAA,SAAA;AAAA,QACP;AAAA,OAED,EAED,cAAA,oBACCA,uBAAAA,CAAA,aAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,YAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,YAAA,aAAA,IAAgB;AAAA,UAClB,CAAA;AAAA,UACA,SAAA,EAAU,gOAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,UAAA,EAAY,0EAAA;AAAA,YACZ,SAAA,EAAW;AAAA,WACb;AAAA,UACA,KAAA,EAAM;AAAA,SAAA;AAAA,QACP;AAAA,OAED,EAED,cAAA,oBACCA,uBAAAA,CAAA,aAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,YAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,YAAA,YAAA,IAAe;AAAA,UACjB,CAAA;AAAA,UACA,SAAA,EAAW,CAAA,0HAAA,EAA6H,UAAA,GAClI,4BAAA,GACA,kDACJ,CAAA,CAAA;AAAA,UACF,KAAA,EAAO;AAAA,YACL,UAAA,EAAY,aACR,+EAAA,GACA,8EAAA;AAAA,YACJ,SAAA,EAAW,aACP,6EAAA,GACA;AAAA,WACN;AAAA,UACA,KAAA,EAAM;AAAA,SAAA;AAAA,QACP;AAAA,OAED,EAED,cAAA,oBACCA,uBAAAA,CAAA,aAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,YAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,YAAA,MAAA,IAAS;AAAA,UACX,CAAA;AAAA,UACA,SAAA,EAAU,6LAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,UAAA,EAAY,8EAAA;AAAA,YACZ,SAAA,EAAW;AAAA,WACb;AAAA,UACA,KAAA,EAAM;AAAA,SAAA;AAAA,QACP;AAAA,OAIL,CAAA;AAAA,sBAIFA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6EAAA,EAAA,EAEZ,QAAA,CAAS,OAAA,oBACRA,uBAAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,2IAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,KAAA,EAAO,SAAA;AAAA,YACP,UAAA,EAAY,CAAA;AAAA;AAAA,gDAAA,CAAA;AAAA,YAGZ,cAAA,EAAgB,YAAA;AAAA,YAChB,oBAAA,EAAsB,YAAA;AAAA,YACtB,SAAA,EAAW,8EAAA;AAAA,YACX,MAAA,EAAQ;AAAA;AACV,SAAA;AAAA,wBAGAA,uBAAAA,CAAA,aAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,6BAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,UAAA,EAAY,qFAAA;AAAA,cACZ,cAAA,EAAgB,WAAA;AAAA,cAChB,SAAA,EAAW;AAAA;AACb;AAAA,SACF;AAAA,wBACAA,uBAAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAU,8BAAA,EAAA,EAAgC,SAAS,OAAQ;AAAA,OACnE,kBAIFA,uBAAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,kCAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,OAAO,KAAA,CAAM,SAAA;AAAA,YACb,UAAA,EAAY;AAAA;AACd,SAAA;AAAA,wBAEAA,uBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAe,KAAA,EAAO;AAAA,UACpC,SAAA,EAAW,CAAC,UAAA,GAAa,0BAAA,GAA6B;AAAA,aAErD,aACH,CAAA;AAAA,QAEC,CAAC,UAAA,oBACAA,uBAAAA,CAAA,aAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,wCAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,UAAA,EAAY,8EAAA;AAAA,cACZ,SAAA,EAAW,qCAAA;AAAA,cACX,SAAA,EAAW;AAAA;AACb;AAAA;AACF,OAEJ,EAGC,UAAA,IAAc,KAAA,CAAM,gBAAA,oBACnBA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,6DAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,UAAA,EAAY,+EAAA;AAAA,YACZ,KAAA,EAAO,0BAAA;AAAA,YACP,SAAA,EAAW,gCAAA;AAAA,YACX,SAAA,EAAW,6EAAA;AAAA,YACX,MAAA,EAAQ;AAAA;AACV,SAAA;AAAA,QAEC,KAAA,CAAM;AAAA,OAEX,CAEJ;AAAA;AACF,GACF;AAKF,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,eAAA,GAAkB,QAAA,CAAS,cAAA,CAAe,sBAAsB,CAAA;AACpE,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,eAAA,GAAkB,QAAA,CAAS,cAAc,KAAK,CAAA;AAC9C,IAAA,eAAA,CAAgB,EAAA,GAAK,sBAAA;AACrB,IAAA,eAAA,CAAgB,MAAM,OAAA,GAAU,mEAAA;AAChC,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,eAAe,CAAA;AAAA,EAC3C;AACA,EAAA,OAAOqB,qBAAA,CAAa,iBAAiB,eAAe,CAAA;AACtD;ACjYO,IAAM,eAA4C,CAAC;AAAA,EACxD,OAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,KAAM;AAEJ,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIH,gBAAS,KAAK,CAAA;AAEhD,EAAA7B,iBAAU,MAAM;AACd,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,cAAA,mBACJW,uBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,+BAA+B,SAAS,CAAA,CAAA;AAAA,MACnD,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,CAAA;AAAA,QACR,aAAA,EAAe,MAAA;AAAA,QACf,UAAA,EAAY;AAAA,OACd;AAAA,MACA,OAAA,EAAS;AAAA,KAAA;AAAA,oBAGTA,uBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,iDAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,UAAA,EAAY,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2CAAA,CAAA;AAAA,UAMZ,cAAA,EAAgB,WAAA;AAAA,UAChB,SAAA,EAAW;AAAA;AACb;AAAA,KACF;AAAA,oBAGAA,uBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,sCAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,cAAA,EAAgB,2BAAA;AAAA,UAChB,oBAAA,EAAsB;AAAA;AACxB;AAAA,KACF;AAAA,oBAGAA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EAAqC,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB,EAAA,kBAEpFA,uBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,+DAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,WAAA,EAAa,2BAAA;AAAA,UACb,UAAA,EAAY,8EAAA;AAAA,UACZ,cAAA,EAAgB,YAAA;AAAA,UAChB,oBAAA,EAAsB,YAAA;AAAA,UACtB,SAAA,EAAW;AAAA;AACb,OAAA;AAAA,sBAEAA,uBAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2EACZA,uBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAA,EAAW,WAAE,CAAA,kBAC7BA,uBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,qCAAA,EAAsC,EAAA,EAAG,0BAAI,CAC1E,CAAA;AAAA,sBACAA,uBAAAA,CAAA,aAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,OAAA;AAAA,UACT,SAAA,EAAU,8GAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,UAAA,EAAY,8EAAA;AAAA,YACZ,cAAA,EAAgB,YAAA;AAAA,YAChB,oBAAA,EAAsB,YAAA;AAAA,YACtB,SAAA,EAAW,8EAAA;AAAA,YACX,MAAA,EAAQ;AAAA,WACV;AAAA,UACA,YAAA,EAAW;AAAA,SAAA;AAAA,wBAEXA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAA,kBAC9DA,uBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,WAAA,EAAa,CAAA,EAAG,CAAA,EAAE,sBAAA,EAAuB,CAC9F;AAAA;AACF,KACF,kBAGAA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EAAA,EACZ,OAAA,CAAQ,MAAA,KAAW,CAAA,mBAClBA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDAAA,EAAsD,KAAA,EAAO,EAAE,UAAA,EAAY,8BAAA,EAA+B,EAAA,EAAG,sCAE5H,CAAA,GAEA,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,qBACjBA,uBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,GAAG,IAAA,CAAK,SAAS,IAAI,IAAA,CAAK,aAAa,IAAI,KAAK,CAAA,CAAA;AAAA,QACrD,SAAA,EAAU,2FAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,UAAA,EAAY,8EAAA;AAAA,UACZ,cAAA,EAAgB,YAAA;AAAA,UAChB,oBAAA,EAAsB,YAAA;AAAA,UACtB,MAAA,EAAQ,oCAAA;AAAA,UACR,SAAA,EAAW;AAAA;AACb,OAAA;AAAA,sBAGAA,uBAAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,qCAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,UAAA,EAAY;AAAA;AACd;AAAA,OACF;AAAA,MAGC,IAAA,CAAK,OAAA,oBACJA,uBAAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,6FAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,UAAA,EAAY,6EAAA;AAAA,YACZ,cAAA,EAAgB,YAAA;AAAA,YAChB,oBAAA,EAAsB,YAAA;AAAA,YACtB,KAAA,EAAO,SAAA;AAAA,YACP,SAAA,EAAW,8EAAA;AAAA,YACX,MAAA,EAAQ;AAAA;AACV,SAAA;AAAA,wBAGAA,uBAAAA,CAAA,aAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,6BAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,UAAA,EAAY,wFAAA;AAAA,cACZ,cAAA,EAAgB,WAAA;AAAA,cAChB,SAAA,EAAW;AAAA;AACb;AAAA,SACF;AAAA,wBACAA,uBAAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAU,8BAAA,EAAA,EAAgC,KAAK,OAAQ;AAAA,OAC/D;AAAA,sBAIFA,uBAAAA,CAAA,aAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,2BAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,KAAA,EAAO,SAAA;AAAA,YACP,UAAA,EAAY;AAAA;AACd,SAAA;AAAA,QAEC,IAAA,CAAK;AAAA;AACR,KAEH,CAEL,CAAA,kBAGAA,uBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,gCAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,WAAA,EAAa,0BAAA;AAAA,UACb,UAAA,EAAY,8EAAA;AAAA,UACZ,cAAA,EAAgB,YAAA;AAAA,UAChB,oBAAA,EAAsB,YAAA;AAAA,UACtB,SAAA,EAAW;AAAA;AACb,OAAA;AAAA,sBAEAA,uBAAAA,CAAA,aAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,2DAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,KAAA,EAAO,0BAAA;AAAA,YACP,UAAA,EAAY,8EAAA;AAAA,YACZ,cAAA,EAAgB,YAAA;AAAA,YAChB,oBAAA,EAAsB,YAAA;AAAA,YACtB,SAAA,EAAW,6EAAA;AAAA,YACX,MAAA,EAAQ,qCAAA;AAAA,YACR,UAAA,EAAY;AAAA;AACd,SAAA;AAAA,QACD;AAAA;AAED,KAEJ;AAAA,GACF;AAKF,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,eAAA,GAAkB,QAAA,CAAS,cAAA,CAAe,qBAAqB,CAAA;AACnE,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,eAAA,GAAkB,QAAA,CAAS,cAAc,KAAK,CAAA;AAC9C,IAAA,eAAA,CAAgB,EAAA,GAAK,qBAAA;AACrB,IAAA,eAAA,CAAgB,MAAM,OAAA,GAAU,mEAAA;AAChC,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,eAAe,CAAA;AAAA,EAC3C;AACA,EAAA,OAAOqB,qBAAAA,CAAa,gBAAgB,eAAe,CAAA;AACrD;ACvMO,IAAM,gBAA8C,CAAC;AAAA,EAC1D,SAAA,GAAY,IAAA;AAAA,EACZ,WAAA,GAAc,+CAAA;AAAA,EACd,SAAA,GAAY;AACd,CAAA,KAAM;AAEJ,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIH,gBAAS,KAAK,CAAA;AAEhD,EAAA7B,iBAAU,MAAM;AACd,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,OAAA,CAAQ,IAAI,+BAAA,EAAiC;AAAA,IAC3C,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAA,CAAQ,IAAI,6CAA6C,CAAA;AACzD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,mBACJW,uBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,oEAAoE,SAAS,CAAA,CAAA;AAAA,MACxF,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,MAAA;AAAA,QACR,aAAA,EAAe,MAAA;AAAA,QACf,eAAA,EAAiB,oBAAA;AAAA,QACjB,MAAA,EAAQ,CAAA;AAAA,QACR,OAAA,EAAS;AAAA;AACX,KAAA;AAAA,oBAGAA,uBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,oDAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,UAAA,EAAY,8EAAA;AAAA,UACZ,cAAA,EAAgB,2BAAA;AAAA,UAChB,oBAAA,EAAsB;AAAA;AACxB,OAAA;AAAA,sBAGAA,uBAAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,qFAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,UAAA,EAAY,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0CAAA,CAAA;AAAA,YAMZ,cAAA,EAAgB,WAAA;AAAA,YAChB,SAAA,EAAW;AAAA;AACb,SAAA;AAAA,wBAEAA,uBAAAA,CAAA,aAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU;AAAA,WAAA;AAAA,UACT;AAAA;AACH;AACF;AACF,GACF;AAIF,EAAA,IAAI,eAAA,GAAkB,QAAA,CAAS,cAAA,CAAe,4BAA4B,CAAA;AAC1E,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,eAAA,GAAkB,QAAA,CAAS,cAAc,KAAK,CAAA;AAC9C,IAAA,eAAA,CAAgB,EAAA,GAAK,4BAAA;AACrB,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,eAAe,CAAA;AAAA,EAC3C;AAGA,EAAA,eAAA,CAAgB,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA,CAa9B,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,IAAA,EAAK;AAE5B,EAAA,OAAOqB,qBAAAA,CAAa,SAAS,eAAe,CAAA;AAC9C;AAEA,aAAA,CAAc,WAAA,GAAc,eAAA;AC/FrB,IAAM,cAA0C,CAAC;AAAA,EACtD,eAAA,GAAkB,KAAA;AAAA,EAClB,UAAA,GAAa,EAAA;AAAA,EACb,SAAA,GAAY,0BAAA;AAAA,EACZ,OAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAM;AAEJ,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIH,gBAAS,KAAK,CAAA;AAEhD,EAAA7B,iBAAU,MAAM;AACd,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,OAAA,CAAQ,IAAI,6BAAA,EAA+B;AAAA,IACzC,eAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,OAAA,CAAQ,IAAI,2CAA2C,CAAA;AACvD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,mBACJW,uBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,mFAAmF,SAAS,CAAA,CAAA;AAAA,MACvG,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,MAAA;AAAA,QACR,aAAA,EAAe,MAAA;AAAA,QACf,eAAA,EAAiB,oBAAA;AAAA,QACjB,MAAA,EAAQ,CAAA;AAAA,QACR,OAAA,EAAS;AAAA,OACX;AAAA,MACA,OAAA,EAAS;AAAA,KAAA;AAAA,oBAGTA,uBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,oDAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,UAAA,EAAY,8EAAA;AAAA,UACZ,cAAA,EAAgB,2BAAA;AAAA,UAChB,oBAAA,EAAsB;AAAA;AACxB,OAAA;AAAA,sBAIAA,uBAAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,qFAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,UAAA,EAAY,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2CAAA,CAAA;AAAA,YAMZ,cAAA,EAAgB,WAAA;AAAA,YAChB,SAAA,EAAW;AAAA;AACb,SAAA;AAAA,wBAGAA,uBAAAA,CAAA,aAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,8GAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,UAAA,EAAY,8EAAA;AAAA,cACZ,cAAA,EAAgB,YAAA;AAAA,cAChB,oBAAA,EAAsB,YAAA;AAAA,cACtB,MAAA,EAAQ,oCAAA;AAAA,cACR,SAAA,EAAW;AAAA;AAAA;AAAA;AAAA,UAAA;AAAA;AAKb,WAAA;AAAA,0BAGAA,uBAAAA,CAAA,aAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,+CAAA;AAAA,cACV,KAAA,EAAO;AAAA,gBACL,UAAA,EAAY;AAAA;AACd;AAAA,WACF;AAAA,0BAGAA,uBAAAA,CAAA,aAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,6CAAA;AAAA,cACV,KAAA,EAAO;AAAA,gBACL,UAAA,EAAY;AAAA;AACd,aAAA;AAAA,YAEC,UAAA;AAAA,4BAEDA,uBAAAA,CAAA,aAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,yEAAA;AAAA,gBACV,KAAA,EAAO;AAAA,kBACL,KAAA,EAAO,KAAA;AAAA,kBACP,UAAA,EAAY;AAAA;AACd;AAAA;AACF,WACF;AAAA,0BAGAA,uBAAAA,CAAA,aAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,iHAAA;AAAA,cACV,KAAA,EAAO;AAAA,gBACL,UAAA,EAAY,+EAAA;AAAA,gBACZ,cAAA,EAAgB,YAAA;AAAA,gBAChB,oBAAA,EAAsB,YAAA;AAAA,gBACtB,MAAA,EAAQ,oCAAA;AAAA,gBACR,SAAA,EAAW;AAAA;AAAA;AAAA,YAAA,CAAA;AAAA,gBAIX,UAAA,EAAY,8BAAA;AAAA,gBACZ,SAAA,EAAW;AAAA;AACb,aAAA;AAAA,4BAEAA,uBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAiB,SAAU;AAAA,WAC7C;AAAA,0BAGAA,uBAAAA,CAAA,aAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,uCAAA;AAAA,cACV,KAAA,EAAO;AAAA,gBACL,UAAA,EAAY;AAAA;AACd;AAAA;AACF;AACF;AACF;AAEF,GAIF;AAIF,EAAA,IAAI,eAAA,GAAkB,QAAA,CAAS,cAAA,CAAe,0BAA0B,CAAA;AACxE,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,eAAA,GAAkB,QAAA,CAAS,cAAc,KAAK,CAAA;AAC9C,IAAA,eAAA,CAAgB,EAAA,GAAK,0BAAA;AACrB,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,eAAe,CAAA;AAAA,EAC3C;AAGA,EAAA,eAAA,CAAgB,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA,CAa9B,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,IAAA,EAAK;AAE5B,EAAA,OAAOqB,qBAAAA,CAAa,SAAS,eAAe,CAAA;AAC9C;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA;;;AC5L1B,IAAI,OAAO,QAAA,KAAa,WAAA,IAAe,CAAC,QAAA,CAAS,cAAA,CAAe,4BAA4B,CAAA,EAAG;AAC7F,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,EAAA,GAAK,4BAAA;AACX,EAAA,KAAA,CAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAWpB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AACjC;AAyBO,IAAM,iBAAgD,CAAC;AAAA,EAC5D,SAAA,GAAY,IAAA;AAAA,EACZ,eAAA,GAAkB,KAAA;AAAA,EAClB,UAAA,GAAa,EAAA;AAAA,EACb,WAAA,GAAc,+CAAA;AAAA,EACd,SAAA,GAAY,0BAAA;AAAA,EACZ,OAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAM;AACJ,EAAA,uBACErB,uBAAAA,CAAA,aAAA,CAAAA,uBAAAA,CAAA,QAAA,EAAA,IAAA,kBACEA,uBAAAA,CAAA,aAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA;AAAA,GACF,kBACAA,uBAAAA,CAAA,aAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,eAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA;AAAA,GAEJ,CAAA;AAEJ;AAEA,cAAA,CAAe,WAAA,GAAc,gBAAA;AChEtB,IAAM,oBAAsD,CAAC;AAAA,EAClE,SAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,uBAAAA,CAAM,SAAS,KAAK,CAAA;AAEtD,EAAAA,uBAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AAEvB,EAAA,MAAM,OAAA,mBACJA,uBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,iGAAA;AAAA,MACV,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA;AAAO,KAAA;AAAA,oBAExBA,uBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,iGAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,UAAA,EAAY,CAAA;AAAA;AAAA,0CAAA,CAAA;AAAA,UAGZ,cAAA,EAAgB,2BAAA;AAAA,UAChB,oBAAA,EAAsB;AAAA;AACxB,OAAA;AAAA,sBAEAA,uBAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,sDAAmD,kDAAQ,CAAA;AAAA,sBACzEA,uBAAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uDAAoD,sLAEjE,CAAA;AAAA,sBACAA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,wBAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,QAAA;AAAA,UACT,SAAA,EAAU;AAAA,SAAA;AAAA,QACX;AAAA,OAED,kBACAA,uBAAAA,CAAA,aAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,SAAA;AAAA,UACT,SAAA,EAAU;AAAA,SAAA;AAAA,QACX;AAAA,OAGH;AAAA;AACF,GACF;AAGF,EAAA,IAAI,eAAA,GAAkB,QAAA,CAAS,cAAA,CAAe,sBAAsB,CAAA;AACpE,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,eAAA,GAAkB,QAAA,CAAS,cAAc,KAAK,CAAA;AAC9C,IAAA,eAAA,CAAgB,EAAA,GAAK,sBAAA;AACrB,IAAA,eAAA,CAAgB,MAAM,OAAA,GAAU,mEAAA;AAChC,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,eAAe,CAAA;AAAA,EAC3C;AAEA,EAAA,OAAOqB,qBAAAA,CAAa,SAAS,eAAe,CAAA;AAC9C,CAAA;ACxDO,IAAM,aAAwC,CAAC;AAAA,EACpD,OAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIrB,uBAAAA,CAAM,SAAS,KAAK,CAAA;AAEtD,EAAAA,uBAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AAEvB,EAAA,MAAM,OAAA,mBACJA,uBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,yJAAA;AAAA,MACV,KAAA,EAAO,EAAE,MAAA,EAAQ,GAAA;AAAQ,KAAA;AAAA,oBAEzBA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EAAA,EACZ,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,qBACpBA,uBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,KAAA;AAAA,QACL,OAAA,EAAS,MAAM,QAAA,CAAS,MAAM,CAAA;AAAA,QAC9B,SAAA,EAAU,0KAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,UAAA,EAAY,CAAA;AAAA;AAAA,8CAAA,CAAA;AAAA,UAGZ,cAAA,EAAgB,2BAAA;AAAA,UAChB,oBAAA,EAAsB;AAAA;AACxB,OAAA;AAAA,sBAGAA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mFAAA,EAAoF,CAAA;AAAA,sBACnGA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6KAAA,EAA8K,CAAA;AAAA,sBAE7LA,uBAAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAU,8BAAA,EAAA,EAAgC,OAAO,IAAK;AAAA,KAE/D,CACH;AAAA,GACF;AAGF,EAAA,IAAI,eAAA,GAAkB,QAAA,CAAS,cAAA,CAAe,sBAAsB,CAAA;AACpE,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,eAAA,GAAkB,QAAA,CAAS,cAAc,KAAK,CAAA;AAC9C,IAAA,eAAA,CAAgB,EAAA,GAAK,sBAAA;AACrB,IAAA,eAAA,CAAgB,MAAM,OAAA,GAAU,mEAAA;AAChC,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,eAAe,CAAA;AAAA,EAC3C;AAEA,EAAA,OAAOqB,qBAAAA,CAAa,SAAS,eAAe,CAAA;AAC9C;;;AC5BO,IAAM,cAAA,GAAiBlC,iBAAAA;AAAA,EAC5B,CACE;AAAA,IACE,MAAA;AAAA,IACA,KAAA;AAAA,IACA,kBAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA,GAAY,KAAA;AAAA,IACZ,gBAAA,GAAmB,CAAA;AAAA,IACnB,oBAAA,GAAuB,CAAA;AAAA,IACvB,YAAA;AAAA,IACA,gBAAA;AAAA,IACA,gBAAA;AAAA,IACA,OAAA;AAAA,IACA,aAAA,GAAgB,KAAA;AAAA,IAChB,cAAA,GAAiB,IAAA;AAAA,IACjB,cAAA,GAAiB,IAAA;AAAA,IACjB,iBAAA,GAAoB,IAAA;AAAA,IACpB,SAAA;AAAA,IACA;AAAA,KAEF,GAAA,KACG;AACH,IAAA,MAAM,EAAE,KAAA,EAAO,IAAA,GAAO,KAAA,EAAM,GAAI,MAAA;AAGhC,IAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI+B,gBAAS,gBAAgB,CAAA;AACzE,IAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIA,gBAAS,oBAAoB,CAAA;AACrF,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,gBAAS,IAAI,CAAA;AAC/C,IAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAClE,IAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAC5D,IAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAClD,IAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAC9C,IAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,gBAAS,KAAK,CAAA;AACpD,IAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAAA,CAAgC,EAAE,CAAA;AAChE,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,gBAAS,SAAS,CAAA;AACpD,IAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,gBAAS,KAAK,CAAA;AACxD,IAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,gBAAwB,IAAI,CAAA;AAC5E,IAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,gBAAS,KAAK,CAAA;AACpD,IAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAC1D,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAAA,CAAoD,EAAE,CAAA;AACxF,IAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,gBAA8B,IAAI,CAAA;AAG1E,IAAA,MAAM,SAAA,GAAY9B,cAAyB,IAAI,CAAA;AAC/C,IAAA,MAAM,YAAA,GAAeA,cAAuB,IAAI,CAAA;AAChD,IAAA,MAAM,YAAA,GAAeA,cAA8B,IAAI,CAAA;AACvD,IAAA,MAAM,iBAAA,GAAoBA,cAAO,KAAK,CAAA;AACtC,IAAA,MAAM,YAAA,GAAeA,cAAO,SAAS,CAAA;AACrC,IAAA,MAAM,oBAAA,GAAuBA,cAAO,CAAC,CAAA;AACrC,IAAA,MAAM,gBAAA,GAAmBA,cAAO,KAAK,CAAA;AACrC,IAAA,MAAM,cAAA,GAAiBA,cAA8B,IAAI,CAAA;AAGzD,IAAA,MAAM,WAAA,GAAc,MAAM,gBAAgB,CAAA;AAC1C,IAAA,MAAM,eAAA,GAAkB,WAAA,EAAa,SAAA,CAAU,oBAAoB,CAAA,IAAK,IAAA;AAGxE,IAAA,MAAM,YAAA,GAAe+B,kBAAAA,CAAY,CAAC,QAAA,EAAwB,WAAmB,aAAA,KAA0B;AACrG,MAAA,UAAA,CAAW,CAAC,IAAA,KAAS;AAAA,QACnB,GAAG,IAAA;AAAA,QACH;AAAA,UACE,SAAA;AAAA,UACA,aAAA;AAAA,UACA,SAAS,QAAA,CAAS,OAAA;AAAA,UAClB,MAAM,QAAA,CAAS,IAAA;AAAA,UACf,SAAA,EAAW,KAAK,GAAA;AAAI;AACtB,OACD,CAAA;AAAA,IACH,CAAA,EAAG,EAAE,CAAA;AAGL,IAAA,MAAM,aAAA,GAAgBA,kBAAAA,CAAY,CAAC,MAAA,KAA0B;AAC3D,MAAA,IAAI,CAAC,MAAA,EAAQ;AAGb,MAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,QAAA,YAAA,CAAa,eAAe,OAAO,CAAA;AAAA,MACrC;AAEA,MAAA,eAAA,CAAgB,MAAM,CAAA;AAGtB,MAAA,cAAA,CAAe,OAAA,GAAU,WAAW,MAAM;AACxC,QAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,QAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AAAA,MAC3B,CAAA,EAAG,MAAA,CAAO,QAAA,IAAY,GAAI,CAAA;AAAA,IAC5B,CAAA,EAAG,EAAE,CAAA;AAGL,IAAA,MAAM,QAAA,GAAWA,kBAAAA;AAAA,MACf,CAAC,SAAA,EAAmB,KAAA,GAAiB,KAAA,KAAU;AAC7C,QAAA,IAAI,SAAA,GAAY,CAAA,IAAK,SAAA,IAAa,KAAA,CAAM,MAAA,EAAQ;AAChD,QAAA,IAAI,eAAA,EAAiB;AAErB,QAAA,MAAM,IAAA,GAAO,MAAM,SAAS,CAAA;AAC5B,QAAA,IAAI,CAAC,IAAA,EAAM;AAGX,QAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,gBAAgB,CAAA,EAAG,SAAA;AAClD,QAAA,IAAI,CAAC,KAAA,IAAS,gBAAA,EAAkB,UAAA,IAAc,CAAC,iBAAiB,OAAA,EAAS;AACvE,UAAA,OAAA,CAAQ,IAAI,yDAAyD,CAAA;AACrE,UAAA,mBAAA,CAAoB,SAAS,CAAA;AAC7B,UAAA;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,uCAAA,EAA0C,SAAS,CAAA,CAAE,CAAA;AAGjE,QAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,qBAAA,CAAsB,KAAK,CAAA;AAC3B,QAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,QAAA,gBAAA,CAAiB,OAAA,GAAU,KAAA;AAC3B,QAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,QAAA,cAAA,CAAe,KAAK,CAAA;AACpB,QAAA,oBAAA,CAAqB,OAAA,GAAU,CAAA;AAG/B,QAAA,UAAA,CAAW,MAAM;AAEf,UAAA,mBAAA,CAAoB,SAAS,CAAA;AAC7B,UAAA,uBAAA,CAAwB,CAAC,CAAA;AACzB,UAAA,iBAAA,CAAkB,OAAA,GAAU,KAAA;AAG5B,UAAA,IAAI,IAAA,CAAK,UAAU,MAAA,GAAS,CAAA,IAAK,MAAM,SAAA,CAAU,CAAC,MAAM,MAAA,EAAW;AACjE,YAAA,YAAA,CAAa,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA,EAAG,WAAW,CAAC,CAAA;AAAA,UAC9C;AAEA,UAAA,YAAA,GAAe,MAAM,SAAS,CAAA;AAC9B,UAAA,IAAI,IAAA,CAAK,UAAU,MAAA,GAAS,CAAA,IAAK,MAAM,SAAA,CAAU,CAAC,MAAM,MAAA,EAAW;AACjE,YAAA,gBAAA,GAAmB,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA,EAAG,GAAG,SAAS,CAAA;AAAA,UACpD;AAIA,UAAA,UAAA,CAAW,MAAM;AACf,YAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,YAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oCAAA,EAAuC,SAAS,CAAA,kCAAA,CAAoC,CAAA;AAAA,UAClG,GAAG,GAAG,CAAA;AAAA,QACR,GAAG,GAAG,CAAA;AAAA,MACR,CAAA;AAAA,MACA,CAAC,KAAA,EAAO,eAAA,EAAiB,YAAA,EAAc,YAAA,EAAc,kBAAkB,gBAAgB;AAAA,KACzF;AAGA,IAAA,MAAM,qBAAA,GAAwBA,mBAAY,MAAM;AAC9C,MAAA,IAAI,CAAC,WAAA,EAAa;AAElB,MAAA,IAAI,gBAAgB,gBAAA,GAAmB,CAAA;AAGvC,MAAA,IAAI,YAAY,aAAA,EAAe;AAC7B,QAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAK,YAAA,KAAiB,WAAA,CAAY,aAAA;AAC/C,QAAA,MAAM,GAAA,GAAM,UAAU,GAAG,CAAA;AACzB,QAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,CAAI,GAAsB,MAAM,MAAA,EAAW;AAClE,UAAA,aAAA,GAAgB,IAAI,GAAsB,CAAA;AAC1C,UAAA,OAAA,CAAQ,IAAI,CAAA,4BAAA,EAA+B,GAAG,IAAI,GAAG,CAAA,SAAA,EAAY,aAAa,CAAA,CAAE,CAAA;AAAA,QAClF,CAAA,MAAO;AACL,UAAA,aAAA,GAAgB,YAAA;AAAA,QAClB;AAAA,MACF;AAEA,MAAA,IAAI,aAAA,GAAgB,KAAA,CAAM,MAAA,IAAU,aAAA,IAAiB,CAAA,EAAG;AACtD,QAAA,QAAA,CAAS,aAAa,CAAA;AAAA,MACxB,WAAW,IAAA,EAAM;AACf,QAAA,QAAA,CAAS,CAAC,CAAA;AAAA,MACZ,CAAA,MAAO;AAEL,QAAA,gBAAA,IAAmB;AAAA,MACrB;AAAA,IACF,CAAA,EAAG,CAAC,WAAA,EAAa,gBAAA,EAAkB,KAAA,CAAM,QAAQ,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,gBAAgB,CAAC,CAAA;AAG7F,IAAA,MAAM,gBAAA,GAAmBA,mBAAY,MAAM;AACzC,MAAA,IAAI,CAAC,WAAA,EAAa;AAGlB,MAAA,IAAI,iBAAiB,OAAA,IAAW,eAAA,CAAgB,QAAQ,MAAA,GAAS,CAAA,IAAK,CAAC,WAAA,EAAa;AAClF,QAAA,cAAA,CAAe,IAAI,CAAA;AACnB,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,YAAA,CAAa,aAAa,OAAO,CAAA;AACjC,QAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AAAA,MACzB;AAEA,MAAA,MAAM,oBAAoB,oBAAA,GAAuB,CAAA;AAEjD,MAAA,IAAI,iBAAA,GAAoB,YAAY,SAAA,CAAU,MAAA,IAAU,aAAa,SAAA,CAAU,iBAAiB,MAAM,MAAA,EAAW;AAE/G,QAAA,MAAM,YAAA,GAAe,WAAA,CAAY,SAAA,CAAU,iBAAiB,CAAA;AAC5D,QAAA,uBAAA,CAAwB,iBAAiB,CAAA;AACzC,QAAA,YAAA,CAAa,YAAA,EAAc,kBAAkB,iBAAiB,CAAA;AAC9D,QAAA,gBAAA,GAAmB,YAAA,EAAc,mBAAmB,gBAAgB,CAAA;AACpE,QAAA,iBAAA,CAAkB,OAAA,GAAU,KAAA;AAAA,MAC9B,WAAW,WAAA,CAAY,OAAA,IAAW,WAAA,CAAY,OAAA,CAAQ,SAAS,CAAA,EAAG;AAEhE,QAAA,cAAA,CAAe,IAAI,CAAA;AAAA,MACrB,CAAA,MAAO;AAEL,QAAA,qBAAA,EAAsB;AAAA,MACxB;AAAA,IACF,GAAG,CAAC,WAAA,EAAa,eAAA,EAAiB,oBAAA,EAAsB,kBAAkB,KAAA,CAAM,MAAA,EAAQ,IAAA,EAAM,YAAA,EAAc,kBAAkB,gBAAA,EAAkB,WAAA,EAAa,SAAA,EAAW,QAAA,EAAU,qBAAqB,CAAC,CAAA;AAGxM,IAAA,MAAM,YAAA,GAAeA,kBAAAA;AAAA,MACnB,CAAC,aAAA,KAA0B;AACzB,QAAA,IAAI,CAAC,WAAA,EAAa;AAClB,QAAA,MAAM,QAAA,GAAW,WAAA,CAAY,SAAA,CAAU,aAAa,CAAA;AAEpD,QAAA,IAAI,gBAAgB,CAAA,IAAK,aAAA,IAAiB,YAAY,SAAA,CAAU,MAAA,IAAU,aAAa,MAAA,EAAW;AAClG,QAAA,uBAAA,CAAwB,aAAa,CAAA;AACrC,QAAA,YAAA,CAAa,QAAA,EAAU,kBAAkB,aAAa,CAAA;AACtD,QAAA,gBAAA,GAAmB,QAAA,EAAU,eAAe,gBAAgB,CAAA;AAC5D,QAAA,iBAAA,CAAkB,OAAA,GAAU,KAAA;AAAA,MAC9B,CAAA;AAAA,MACA,CAAC,WAAA,EAAa,gBAAA,EAAkB,YAAA,EAAc,gBAAgB;AAAA,KAChE;AAGA,IAAA,MAAM,mBAAA,GAAsBA,mBAAY,MAAM;AAC5C,MAAA,IAAI,CAAC,kBAAkB,OAAA,EAAS;AAE9B,QAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA;AAC5B,QAAA;AAAA,MACF;AAGA,MAAA,gBAAA,EAAiB;AAAA,IACnB,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAGrB,IAAA,MAAM,oBAAA,GAAuBA,mBAAY,MAAM;AAC7C,MAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA;AAC5B,MAAA,WAAA,CAAY,KAAK,CAAA;AAGjB,MAAA,IAAI,UAAA,IAAc,eAAA,EAAiB,YAAA,KAAiB,KAAA,EAAO;AACzD,QAAA,MAAM,KAAA,GAAQ,iBAAiB,SAAA,IAAa,GAAA;AAC5C,QAAA,YAAA,CAAa,OAAA,GAAU,WAAW,MAAM;AACtC,UAAA,gBAAA,EAAiB;AAAA,QACnB,GAAG,KAAK,CAAA;AAAA,MACV;AAAA,IACF,CAAA,EAAG,CAAC,UAAA,EAAY,eAAA,EAAiB,gBAAgB,CAAC,CAAA;AAGlD,IAAA9B,iBAAU,MAAM;AACd,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,WAAA,CAAY,IAAI,CAAA;AAChB,QAAA,iBAAA,CAAkB,OAAA,GAAU,KAAA;AAG5B,QAAA,MAAM,OAAO,eAAA,CAAgB,IAAA;AAC7B,QAAA,MAAM,KAAA,GAAQ,gBAAgB,SAAA,IAAa,EAAA;AAC3C,QAAA,MAAM,cAAA,GAAiB,KAAK,MAAA,GAAS,KAAA;AAErC,QAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,UAAA,oBAAA,EAAqB;AAAA,QACvB,GAAG,cAAc,CAAA;AAEjB,QAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,MACjC;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,EAAG,CAAC,eAAA,EAAiB,oBAAoB,CAAC,CAAA;AAE1C,IAAAA,iBAAU,MAAM;AAChB,MAAA,IAAI,iBAAiB,MAAA,EAAQ;AAC3B,QAAA,aAAA,CAAc,gBAAgB,MAAM,CAAA;AAAA,MACtC;AAAA,IACF,CAAA,EAAG,CAAC,gBAAA,EAAkB,oBAAA,EAAsB,aAAa,CAAC,CAAA;AAGxD,IAAA,MAAM,cAAA,GAAiB8B,mBAAY,MAAM;AACvC,MAAA,aAAA,CAAc,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,IAC/B,CAAA,EAAG,EAAE,CAAA;AAGL,IAAA,MAAM,UAAA,GAAaA,mBAAY,MAAM;AACnC,MAAA,IAAI,WAAA,EAAa,OAAA,IAAW,WAAA,CAAY,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC1D,QAAA,cAAA,CAAe,IAAI,CAAA;AACnB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,gBAAgB,gBAAA,GAAmB,CAAA;AACzC,MAAA,IAAI,aAAA,GAAgB,MAAM,MAAA,EAAQ;AAChC,QAAA,QAAA,CAAS,aAAa,CAAA;AAAA,MACxB,WAAW,IAAA,EAAM;AACf,QAAA,QAAA,CAAS,CAAC,CAAA;AAAA,MACZ,CAAA,MAAO;AACL,QAAA,gBAAA,IAAmB;AAAA,MACrB;AAAA,IACF,CAAA,EAAG,CAAC,gBAAA,EAAkB,KAAA,CAAM,QAAQ,IAAA,EAAM,QAAA,EAAU,gBAAgB,CAAC,CAAA;AAGrE,IAAA,MAAM,WAAA,GAAcA,mBAAY,MAAM;AACpC,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,MAAA,IAAI,WAAA,IAAe,YAAY,SAAA,CAAU,MAAA,GAAS,KAAK,WAAA,EAAa,SAAA,CAAU,CAAC,CAAA,KAAM,MAAA,EAAW;AAC9F,QAAA,YAAA,CAAa,WAAA,EAAa,SAAA,CAAU,CAAC,CAAA,EAAG,kBAAkB,CAAC,CAAA;AAAA,MAC7D;AAEA,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,SAAA,CAAU,SAAS,IAAA,EAAK;AAAA,MAC1B,GAAG,GAAG,CAAA;AAAA,IACR,CAAA,EAAG,CAAC,WAAA,EAAa,gBAAA,EAAkB,YAAY,CAAC,CAAA;AAGhD,IAAA7B,0BAAAA;AAAA,MACE,GAAA;AAAA,MACA,OAAO;AAAA,QACL,QAAA;AAAA,QACA,YAAA;AAAA,QACA,qBAAqB,MAAM,gBAAA;AAAA,QAC3B,yBAAyB,MAAM,oBAAA;AAAA,QAC/B,YAAY,MAAM,OAAA;AAAA,QAClB,cAAc,MAAM,SAAA;AAAA,QACpB,WAAA,EAAa,CAAC,GAAA,EAAa,KAAA,KAAqC;AAC9D,UAAA,YAAA,CAAa,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,CAAC,GAAG,GAAG,OAAM,CAAE,CAAA;AAAA,QAClD,CAAA;AAAA,QACA,WAAA,EAAa,aAAA;AAAA,QACb,YAAY,MAAM;AAChB,UAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA;AAAA,QAC9B,CAAA;AAAA,QACA;AAAA,OACF,CAAA;AAAA,MACA,CAAC,QAAA,EAAU,YAAA,EAAc,gBAAA,EAAkB,oBAAA,EAAsB,SAAS,aAAa;AAAA,KACzF;AAGA,IAAAD,iBAAU,MAAM;AACd,MAAA,IAAI,SAAA,IAAa,WAAA,IAAe,WAAA,CAAY,SAAA,CAAU,MAAA,GAAS,CAAA,IAAK,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,WAAA,EAAa,SAAA,CAAU,CAAC,MAAM,MAAA,EAAW;AACnI,QAAA,YAAA,CAAa,WAAA,EAAa,SAAA,CAAU,CAAC,CAAA,EAAG,kBAAkB,CAAC,CAAA;AAAA,MAC7D;AAAA,IACF,CAAA,EAAG,CAAC,SAAA,EAAW,WAAA,EAAa,kBAAkB,OAAA,CAAQ,MAAA,EAAQ,YAAY,CAAC,CAAA;AAG3E,IAAAA,iBAAU,MAAM;AACd,MAAA,OAAO,MAAM;AACX,QAAA,IAAI,aAAa,OAAA,EAAS;AACxB,UAAA,YAAA,CAAa,aAAa,OAAO,CAAA;AAAA,QACnC;AACA,QAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,UAAA,YAAA,CAAa,eAAe,OAAO,CAAA;AAAA,QACrC;AAAA,MACF,CAAA;AAAA,IACF,CAAA,EAAG,EAAE,CAAA;AAGL,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,uBACEW,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wEAAqE,0BAEpF,CAAA;AAAA,IAEJ;AAEA,IAAA,uBACEA,uBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,YAAA;AAAA,QACL,SAAA,EAAW,qBAAqB,SAAS,CAAA,CAAA;AAAA,QACzC,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAQ,MAAA,EAAQ,QAAA,EAAU,QAAA,EAAU,GAAG,KAAA;AAAM,OAAA;AAAA,sBAGrEA,uBAAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,gCAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,MAAA,EAAQ,CAAA;AAAA;AAAA,YAER,OAAA,EAAU,SAAA,IAAa,eAAA,IAAmB,CAAC,qBAAsB,CAAA,GAAI,CAAA;AAAA,YACrE,UAAA,EAAY;AAAA;AACd,SAAA;AAAA,QAEC,CAAC,eAAA,oBACAA,uBAAAA,CAAA,aAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,KAAK,WAAA,CAAY,EAAA;AAAA,YACjB,GAAA,EAAK,SAAA;AAAA,YACL,WAAW,WAAA,CAAY,SAAA;AAAA,YACvB,OAAO,EAAE,GAAG,KAAA,EAAO,GAAG,YAAY,KAAA,EAAM;AAAA,YACxC,QAAA,EAAU,SAAA;AAAA,YACV,IAAA,EAAM,YAAY,aAAA,KAAkB,IAAA;AAAA,YACpC,kBAAA;AAAA,YACA,QAAQ,MAAM;AACZ,cAAA,OAAA,CAAQ,IAAI,8CAA8C,CAAA;AAC1D,cAAA,YAAA,CAAa,KAAK,CAAA;AAElB,cAAA,IAAI,aAAa,OAAA,EAAS;AACxB,gBAAA,OAAA,CAAQ,IAAI,wDAAwD,CAAA;AACpE,gBAAA,UAAA,CAAW,MAAM;AACf,kBAAA,SAAA,CAAU,SAAS,IAAA,EAAK;AAAA,gBAC1B,GAAG,GAAG,CAAA;AAAA,cACR;AAAA,YACF,CAAA;AAAA,YACA,QAAQ,MAAM;AAEZ,cAAA,OAAA,CAAQ,IAAI,8CAA8C,CAAA;AAC1D,cAAA,qBAAA,CAAsB,IAAI,CAAA;AAAA,YAC5B,CAAA;AAAA,YACA,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,cAAA,MAAM,QAAA,GAAW,SAAA,CAAU,OAAA,EAAS,WAAA,EAAY,IAAK,CAAA;AAKrD,cAAA,MAAM,SAAA,GAAY,QAAA,GAAW,CAAA,IAAK,IAAA,GAAO,QAAA,GAAW,IAAA;AACpD,cAAA,MAAM,QAAA,GAAW,IAAA,GAAO,oBAAA,CAAqB,OAAA,IAAW,qBAAqB,OAAA,GAAU,CAAA;AAEvF,cAAA,IAAI,aAAa,QAAA,EAAU;AACzB,gBAAA,IAAI,CAAC,iBAAiB,OAAA,EAAS;AAC7B,kBAAA,OAAA,CAAQ,IAAI,2DAA2D,CAAA;AACvE,kBAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAC3B,kBAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,gBACvB;AAAA,cACF;AACA,cAAA,oBAAA,CAAqB,OAAA,GAAU,IAAA;AAAA,YACjC,CAAA;AAAA,YACA,SAAS,MAAM;AACb,cAAA,OAAA,CAAQ,IAAI,iDAAiD,CAAA;AAC7D,cAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAC3B,cAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,YACvB,CAAA;AAAA,YACA,cAAA,EAAgB,CAAC,QAAA,KAAa;AAC5B,cAAA,iBAAA,CAAkB,QAAQ,CAAA;AAAA,YAC5B,CAAA;AAAA,YACA;AAAA;AAAA;AACF,OAEJ;AAAA,MAGC,YAAA,oBACCA,uBAAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,uEAAA;AAAA,UACV,KAAA,EAAO,EAAE,MAAA,EAAQ,GAAA;AAAI,SAAA;AAAA,QAEpB,YAAA,CAAa,IAAA,KAAS,OAAA,oBACrBA,uBAAAA,CAAA,aAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,eAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,eAAA,EAAiB,aAAa,KAAA,IAAS,OAAA;AAAA,cACvC,SAAA,EAAW,CAAA,WAAA,EAAc,YAAA,CAAa,QAAA,IAAY,GAAG,CAAA,oBAAA;AAAA;AACvD;AAAA,SACF;AAAA,QAGD,aAAa,IAAA,KAAS,KAAA,IAAS,YAAA,CAAa,GAAA,oBAC3CA,uBAAAA,CAAA,aAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAK,YAAA,CAAa,GAAA;AAAA,YAClB,GAAA,EAAI,QAAA;AAAA,YACJ,SAAA,EAAW,YAAA,CAAa,QAAA,KAAa,MAAA,GAAS,4BAAA,GAA+B;AAAA;AAAA,SAC/E;AAAA,wBAGFA,uBAAAA,CAAA,aAAA,CAAC,OAAA,EAAA,IAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,CAMN;AAAA,OACJ;AAAA,sBAIFA,uBAAAA,CAAA,aAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,YAAY,MAAM;AAChB,YAAA,MAAM,iBAAA,GAAA,CAAqB,SAAA,IAAa,eAAA,IAAmB,CAAC,kBAAA,KAAuB,SAAA;AACnF,YAAA,OAAA,CAAQ,IAAI,6CAAA,EAA+C;AAAA,cACzD,SAAA;AAAA,cACA,eAAA;AAAA,cACA,kBAAA;AAAA,cACA,SAAA;AAAA,cACA;AAAA,aACD,CAAA;AACD,YAAA,OAAO,iBAAA;AAAA,UACT,CAAA,GAAG;AAAA,UACH,iBAAiB,CAAC,SAAA;AAAA,UAClB,YAAY,MAAA,CAAO,IAAA;AAAA,UACnB,WAAA,EAAY,+CAAA;AAAA,UACZ,SAAA,EAAU,0BAAA;AAAA,UACV,OAAA,EAAS;AAAA;AAAA,OACX;AAAA,MAAA,CAGE,MAAM;AACN,QAAA,MAAM,aAAa,SAAA,IAAa,kBAAA,IAAsB,eAAA,IAAmB,CAAC,eAAe,CAAC,WAAA;AAC1F,QAAA,OAAA,CAAQ,IAAI,gDAAA,EAAkD;AAAA,UAC5D,SAAA;AAAA,UACA,kBAAA;AAAA,UACA,WAAA,EAAa,CAAC,CAAC,eAAA;AAAA,UACf,WAAA;AAAA,UACA,WAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA,EAAU;AAAA,SACX,CAAA;AAED,QAAA,OAAO,UAAA,mBACLA,uBAAAA,CAAA,aAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,QAAA,EAAU,eAAA;AAAA,YACV,KAAA,EAAO,aAAA;AAAA,YACP,QAAA;AAAA,YACA,UAAA;AAAA,YACA,OAAA,EAAS,mBAAA;AAAA,YACT,cAAc,MAAM;AAClB,cAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA;AAAA,YAC9B,CAAA;AAAA,YACA,YAAA,EAAc,cAAA;AAAA,YACd,aAAA,EAAe,MAAM,cAAA,CAAe,IAAI,CAAA;AAAA,YACxC,MAAA,EAAQ,UAAA;AAAA,YACR,eAAe,MAAM;AACnB,cAAA,SAAA,CAAU,SAAS,WAAA,EAAY;AAC/B,cAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,YACzB,CAAA;AAAA,YACA,cAAA;AAAA,YACA,YAAA,EAAc,IAAA;AAAA,YACd,cAAA;AAAA,YACA,cAAA;AAAA,YACA;AAAA;AAAA,SACF,GACE,IAAA;AAAA,MACN,CAAA,GAAG;AAAA,MAGF,gBAAA,KAAqB,IAAA,oBACpBA,uBAAAA,CAAA,aAAA;AAAA,QAAC,iBAAA;AAAA,QAAA;AAAA,UACC,WAAW,MAAM;AACf,YAAA,IAAI,qBAAqB,IAAA,EAAM;AAC7B,cAAA,QAAA,CAAS,kBAAkB,IAAI,CAAA;AAAA,YACjC;AAAA,UACF,CAAA;AAAA,UACA,UAAU,MAAM;AACd,YAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,UAC1B;AAAA;AAAA,OACF;AAAA,MAID,gBAAgB,eAAA,EAAiB,OAAA,IAAW,WAAA,CAAY,OAAA,CAAA,oBACvDA,uBAAAA,CAAA,aAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAU,eAAA,EAAiB,OAAA,IAAW,WAAA,CAAY,OAAA;AAAA,UAClD,KAAA,EAAO,aAAA;AAAA,UACP,QAAA,EAAU,CAAC,MAAA,KAAW;AAEpB,YAAA,IAAI,OAAO,WAAA,EAAa;AACtB,cAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAM,GAAI,MAAA,CAAO,WAAA;AAC9B,cAAA,YAAA,CAAa,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,CAAC,GAAG,GAAG,OAAM,CAAE,CAAA;AAChD,cAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,+BAAA,EAAkC,GAAG,CAAA,GAAA,EAAM,KAAK,CAAA,CAAE,CAAA;AAAA,YAChE;AAGF,YAAA,MAAA,CAAO,QAAA,IAAW;AAGlB,YAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,cAAA,aAAA,CAAc,OAAO,MAAM,CAAA;AAAA,YAC7B;AAGA,YAAA,cAAA,CAAe,KAAK,CAAA;AAElB,YAAA,IAAI,MAAA,CAAO,kBAAkB,MAAA,EAAW;AACtC,cAAA,IAAI,MAAA,CAAO,kBAAkB,gBAAA,EAAkB;AAE7C,gBAAA,YAAA,CAAa,MAAA,CAAO,qBAAqB,CAAC,CAAA;AAAA,cAC5C,CAAA,MAAO;AAEL,gBAAA,QAAA,CAAS,MAAA,CAAO,eAAe,IAAI,CAAA;AAAA,cACrC;AAAA,YACF,CAAA,MAAA,IAAW,iBAAiB,OAAA,EAAS;AAEnC,cAAA,MAAM,UAAU,oBAAA,GAAuB,CAAA;AACvC,cAAA,IAAI,WAAA,IAAe,OAAA,GAAU,WAAA,CAAY,SAAA,CAAU,MAAA,EAAQ;AACzD,gBAAA,MAAM,YAAA,GAAe,WAAA,CAAY,SAAA,CAAU,OAAO,CAAA;AAClD,gBAAA,IAAI,YAAA,EAAc;AAChB,kBAAA,uBAAA,CAAwB,OAAO,CAAA;AAC/B,kBAAA,YAAA,CAAa,YAAA,EAAc,kBAAkB,OAAO,CAAA;AACpD,kBAAA,gBAAA,GAAmB,YAAA,EAAc,SAAS,gBAAgB,CAAA;AAC1D,kBAAA,iBAAA,CAAkB,OAAA,GAAU,KAAA;AAAA,gBAC9B;AAAA,cACF,CAAA,MAAO;AAEL,gBAAA,qBAAA,EAAsB;AAAA,cACxB;AAAA,YACF;AAAA,UACF;AAAA;AAAA,OACF;AAAA,MAID,WAAA,oBACCA,uBAAAA,CAAA,aAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,OAAA;AAAA,UACA,KAAA,EAAO,aAAA;AAAA,UACP,OAAA,EAAS,MAAM,cAAA,CAAe,KAAK;AAAA;AAAA;AACrC,KAIJ;AAAA,EAEJ;AACF;AAEA,cAAA,CAAe,WAAA,GAAc,gBAAA;AClmBtB,IAAM,gBAA8C,CAAC;AAAA,EAC1D,SAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA,GAAiB,KAAA;AAAA,EACjB,WAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAM;AACJ,EAAA,MAAM,UAAA,GAAa,CAAC,OAAA,KAAoB;AACtC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACpC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACpC,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,UAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,EACpD,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,QAAA,GAAW,CAAA,GAAK,WAAA,GAAc,WAAY,GAAA,GAAM,CAAA;AAEjE,EAAA,uBACEA,uBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,0JAA0J,SAAS,CAAA;AAAA,KAAA;AAAA,oBAG9KA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,mGAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,sEAAA;AAAA,QACV,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAA;AAAI;AAAA,KACjC,kBACAA,uBAAAA,CAAA,aAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,OAAA;AAAA,QACL,GAAA,EAAK,CAAA;AAAA,QACL,KAAK,QAAA,IAAY,GAAA;AAAA,QACjB,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,CAAC,CAAA,KAAM,MAAA,CAAO,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QAC9C,SAAA,EAAU;AAAA;AAAA,KAEd,CAAA;AAAA,oBAEAA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,mCAAA,EAAA,kBAEbA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,8DAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,cAAM,UAAA,CAAW,WAAW,CAAE,CAAA,kBAC/BA,uBAAAA,CAAA,aAAA,CAAC,cAAK,GAAC,CAAA,kBACPA,uBAAAA,CAAA,aAAA,CAAC,cAAM,UAAA,CAAW,QAAQ,CAAE,CAC9B,CAAA,kBAGAA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,yBAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,UAAA;AAAA,QACT,SAAA,EAAU;AAAA,OAAA;AAAA,sBAEVA,uBAAAA,CAAA,aAAA,CAACC,oBAAAA,EAAA,EAAS,WAAU,sBAAA,EAAuB;AAAA,KAC7C,kBAEAD,uBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,WAAA;AAAA,QACT,SAAA,EAAU;AAAA,OAAA;AAAA,MAET,SAAA,mBACCA,uBAAAA,CAAA,aAAA,CAACE,mBAAA,EAAM,SAAA,EAAU,sBAAA,EAAuB,CAAA,mBAExCF,uBAAAA,CAAA,aAAA,CAACG,gBAAAA,EAAA,EAAK,WAAU,2BAAA,EAA4B;AAAA,KAEhD,kBAEAH,uBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,MAAA;AAAA,QACT,SAAA,EAAU;AAAA,OAAA;AAAA,sBAEVA,uBAAAA,CAAA,aAAA,CAACI,uBAAAA,EAAA,EAAY,WAAU,sBAAA,EAAuB;AAAA,KAElD,CAAA,kBAGAJ,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,0CAAA,EAAA,EACZ,cAAA,oBACCA,uBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,aAAA;AAAA,QACT,SAAA,EAAU,qFAAA;AAAA,QACV,KAAA,EAAM;AAAA,OAAA;AAAA,sBAENA,uBAAAA,CAAA,aAAA,CAACO,kBAAAA,EAAA,EAAO,WAAU,SAAA,EAAU;AAAA,KAC9B,kBAGFP,uBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,YAAA;AAAA,QACT,SAAA,EAAU,kDAAA;AAAA,QACV,KAAA,EAAO;AAAA,OAAA;AAAA,MAEN,QAAA,KAAa,0BAAUA,uBAAAA,CAAA,cAACK,kBAAAA,EAAA,EAAO,WAAU,SAAA,EAAU,CAAA;AAAA,MACnD,QAAA,KAAa,4BAAYL,uBAAAA,CAAA,cAACM,mBAAAA,EAAA,EAAQ,WAAU,uBAAA,EAAwB,CAAA;AAAA,MACpE,aAAa,SAAA,oBAAaN,wBAAA,aAAA,CAACsB,mBAAA,EAAA,EAAQ,WAAU,yBAAA,EAA0B;AAAA,KAC1E,kBAEAtB,uBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,gBAAA;AAAA,QACT,SAAA,EAAU;AAAA,OAAA;AAAA,sBAEVA,uBAAAA,CAAA,aAAA,CAACuB,qBAAA,EAAA,EAAU,WAAU,SAAA,EAAU;AAAA,KAEnC,CACF;AAAA,GACF;AAEJ;ACjIO,IAAM,gBAA8C,CAAC;AAAA,EAC1D,MAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAM;AACJ,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,uBACEvB,uBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAW,CAAA,8LAAA,EAAiM,MAAA,GAAS,eAAA,GAAkB,kBAAkB,IAAI,SAAS,CAAA;AAAA,KAAA;AAAA,oBAEtQA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAACgB,iBAAAA,EAAA,EAAM,SAAA,EAAU,uBAAA,EAAwB,CAAA,kBACzChB,uBAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,8BAAA,EAAA,EAA+B,0BAAI,CACnD,CAAA,kBACAA,uBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,OAAA;AAAA,QACT,SAAA,EAAU;AAAA,OAAA;AAAA,sBAEVA,uBAAAA,CAAA,aAAA,CAACiB,aAAAA,EAAA,EAAE,WAAU,SAAA,EAAU;AAAA,KAE3B,CAAA;AAAA,oBAEAjB,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2DACZ,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,KAAU;AAC5B,MAAA,MAAM,WAAW,KAAA,KAAU,YAAA;AAC3B,MAAA,uBACEA,uBAAAA,CAAA,aAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,KAAK,KAAA,CAAM,EAAA;AAAA,UACX,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK,CAAA;AAAA,UAClC,SAAA,EAAW,CAAA,mEAAA,EAAsE,QAAA,GAAW,0CAAA,GAA6C,4CAA4C,CAAA;AAAA,SAAA;AAAA,wBAErLA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yEAAA,EAAA,EACZ,KAAA,CAAM,QAAA,mBACLA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,MAAM,QAAA,EAAU,GAAA,EAAK,KAAA,CAAM,KAAA,EAAO,SAAA,EAAU,4BAAA,EAA6B,CAAA,mBAEnFA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAACgB,iBAAAA,EAAA,EAAM,WAAU,SAAA,EAAU,CAC7B,CAAA,EAED,QAAA,oBACChB,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kEAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,0BAAA,EAAA,kBACbA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EAAmC,CAAA,kBAClDA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kCAAA,EAAmC,CAAA,kBAClDA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EAAmC,CACpD,CACF,CAEJ,CAAA;AAAA,wBAEAA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,CAAA,2BAAA,EAA8B,QAAA,GAAW,eAAA,GAAkB,eAAe,CAAA,CAAA,EAAA,EACtF,KAAA,CAAM,KACT,CAAA,kBACAA,uBAAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uCAAA,EAAA,EACV,KAAA,CAAM,MAAA,IAAU,gCACnB,CACF,CAAA;AAAA,QAEC,CAAC,QAAA,oBACAA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EAAA,kBACbA,wBAAA,aAAA,CAACG,gBAAAA,EAAA,EAAK,SAAA,EAAU,sCAAqC,CACvD;AAAA,OAEJ;AAAA,IAEJ,CAAC,CACH,CAAA;AAAA,oBAEAH,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDACbA,uBAAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAE,WAAU,mCAAA,EAAA,EAAoC,SAAA,EAC5C,MAAA,CAAO,MAAA,EAAO,qBACnB,CACF,CAAA;AAAA,oBAEAA,uBAAAA,CAAA,aAAA,CAAC,OAAA,EAAA,EAAM,uBAAA,EAAyB,EAAE,MAAA,EAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,EA6BzC,EAAG;AAAA,GACN;AAEJ;ACrHO,IAAM,YAAsC,CAAC,EAAE,KAAA,EAAO,SAAA,GAAY,IAAG,KAAM;AAChF,EAAA,uBACEA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAW,CAAA,6CAAA,EAAgD,SAAS,CAAA,CAAA,EAAA,kBACvEA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4GACbA,uBAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,+DAAA,EAAA,EACX,KAAA,CAAM,KACT,CACF,CAAA,kBACAA,uBAAAA,CAAA,aAAA,CAAC,OAAE,SAAA,EAAU,kDAAA,EAAA,EACV,KAAA,CAAM,MAAA,IAAU,gCACnB,CACF,CAAA;AAEJ;;;ACOO,IAAM,cAAA,GAAiBb,iBAAAA;AAAA,EAC5B,CACE;AAAA,IACE,MAAA;AAAA,IACA,KAAA;AAAA,IACA,kBAAA;AAAA,IACA,iBAAA,GAAoB,CAAA;AAAA,IACpB,aAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,KAEF,GAAA,KACG;AACH,IAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,GAAW,KAAA,EAAO,eAAA,GAAkB,QAAO,GAAI,MAAA;AAG/D,IAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI+B,gBAAS,iBAAiB,CAAA;AAClE,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,gBAAS,QAAQ,CAAA;AACnD,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,gBAAS,IAAI,CAAA;AAC/C,IAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAC5D,IAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,gBAAS,CAAC,CAAA;AAChD,IAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,gBAAS,CAAC,CAAA;AAC1C,IAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,gBAAwC,eAAe,CAAA;AACvF,IAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,gBAAS,KAAK,CAAA;AACtD,IAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,gBAAS,IAAI,CAAA;AACnD,IAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAG1D,IAAA,MAAM,SAAA,GAAY9B,cAAyB,IAAI,CAAA;AAC/C,IAAA,MAAM,YAAA,GAAeA,cAAuB,IAAI,CAAA;AAChD,IAAA,MAAM,YAAA,GAAeA,cAAO,QAAQ,CAAA;AACpC,IAAA,MAAM,YAAA,GAAeA,cAA8B,IAAI,CAAA;AAGvD,IAAA,MAAM,YAAA,GAAe,OAAO,YAAY,CAAA;AAGxC,IAAA,MAAM,SAAA,GAAY+B,kBAAAA;AAAA,MAChB,CAAC,KAAA,KAAkB;AACjB,QAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,KAAA,IAAS,MAAA,CAAO,MAAA,EAAQ;AACzC,QAAA,IAAI,eAAA,EAAiB;AAErB,QAAA,MAAM,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC1B,QAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,QAAA,OAAA,CAAQ,IAAI,CAAA,wCAAA,EAA2C,KAAK,CAAA,EAAA,EAAK,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAG9E,QAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,MAAM,UAAA,GAAa,SAAA;AACnB,QAAA,YAAA,CAAa,KAAK,CAAA;AAGlB,QAAA,UAAA,CAAW,MAAM;AACf,UAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,UAAA,cAAA,CAAe,CAAC,CAAA;AAChB,UAAA,WAAA,CAAY,CAAC,CAAA;AACb,UAAA,aAAA,GAAgB,OAAO,KAAK,CAAA;AAG5B,UAAA,UAAA,CAAW,MAAM;AACf,YAAA,kBAAA,CAAmB,KAAK,CAAA;AAExB,YAAA,IAAI,UAAA,EAAY;AACd,cAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AAAA,YACzB;AAAA,UACF,GAAG,GAAG,CAAA;AAAA,QACR,GAAG,GAAG,CAAA;AAAA,MACR,CAAA;AAAA,MACA,CAAC,MAAA,EAAQ,eAAA,EAAiB,SAAA,EAAW,aAAa;AAAA,KACpD;AAGA,IAAA,MAAM,IAAA,GAAOA,mBAAY,MAAM;AAC7B,MAAA,IAAI,YAAY,YAAA,GAAe,CAAA;AAC/B,MAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,QAAA,SAAA,GAAY,KAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,GAAI,OAAO,MAAM,CAAA;AAAA,MACtD,CAAA,MAAA,IAAW,SAAA,IAAa,MAAA,CAAO,MAAA,EAAQ;AACrC,QAAA,SAAA,GAAY,CAAA;AAAA,MACd;AACA,MAAA,SAAA,CAAU,SAAS,CAAA;AAAA,IACrB,GAAG,CAAC,YAAA,EAAc,OAAO,MAAA,EAAQ,QAAA,EAAU,SAAS,CAAC,CAAA;AAGrD,IAAA,MAAM,QAAA,GAAWA,mBAAY,MAAM;AACjC,MAAA,IAAI,YAAY,YAAA,GAAe,CAAA;AAC/B,MAAA,IAAI,YAAY,CAAA,EAAG;AACjB,QAAA,SAAA,GAAY,OAAO,MAAA,GAAS,CAAA;AAAA,MAC9B;AACA,MAAA,SAAA,CAAU,SAAS,CAAA;AAAA,IACrB,GAAG,CAAC,YAAA,EAAc,MAAA,CAAO,MAAA,EAAQ,SAAS,CAAC,CAAA;AAG3C,IAAA7B,0BAAAA;AAAA,MACE,GAAA;AAAA,MACA,OAAO;AAAA,QACL,MAAM,MAAM;AACV,UAAA,YAAA,CAAa,IAAI,CAAA;AACjB,UAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,UAAA,SAAA,CAAU,SAAS,IAAA,EAAK;AAAA,QAC1B,CAAA;AAAA,QACA,OAAO,MAAM;AACX,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,UAAA,SAAA,CAAU,SAAS,KAAA,EAAM;AAAA,QAC3B,CAAA;AAAA,QACA,IAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAU,OAAO;AAAA,UACf,YAAA;AAAA,UACA,SAAA;AAAA,UACA,WAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA,SACF;AAAA,OACF,CAAA;AAAA,MACA,CAAC,MAAM,QAAA,EAAU,SAAA,EAAW,cAAc,SAAA,EAAW,WAAA,EAAa,UAAU,QAAQ;AAAA,KACtF;AAGA,IAAA,MAAM,WAAA,GAAc6B,mBAAY,MAAM;AACpC,MAAA,IAAI,aAAa,QAAA,EAAU;AACzB,QAAA,SAAA,CAAU,OAAA,EAAS,KAAK,CAAC,CAAA;AACzB,QAAA,SAAA,CAAU,SAAS,IAAA,EAAK;AAAA,MAC1B,CAAA,MAAO;AACL,QAAA,IAAA,EAAK;AAAA,MACP;AAAA,IACF,CAAA,EAAG,CAAC,QAAA,EAAU,IAAI,CAAC,CAAA;AAGnB,IAAA,MAAM,gBAAA,GAAmBA,kBAAAA,CAAY,CAAC,IAAA,KAAiB;AACrD,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,IAAI,UAAU,OAAA,EAAS;AACrB,QAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,OAAA,CAAQ,WAAA,EAAY;AAC5C,QAAA,WAAA,CAAY,KAAK,CAAA;AACjB,QAAA,UAAA,GAAa,MAAM,KAAK,CAAA;AAAA,MAC1B;AAAA,IACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,IAAA,MAAM,cAAA,GAAiBA,mBAAY,MAAM;AACvC,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,IAAI,YAAA,CAAa,OAAA,EAAS,YAAA,CAAa,YAAA,CAAa,OAAO,CAAA;AAC3D,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,YAAA,CAAa,OAAA,GAAU,WAAW,MAAM;AACtC,UAAA,IAAI,CAAC,YAAA,EAAc,cAAA,CAAe,KAAK,CAAA;AAAA,QACzC,GAAG,GAAI,CAAA;AAAA,MACT;AAAA,IACF,CAAA,EAAG,CAAC,SAAA,EAAW,YAAY,CAAC,CAAA;AAE5B,IAAA9B,iBAAU,MAAM;AACd,MAAA,cAAA,EAAe;AACf,MAAA,OAAO,MAAM;AACX,QAAA,IAAI,YAAA,CAAa,OAAA,EAAS,YAAA,CAAa,YAAA,CAAa,OAAO,CAAA;AAAA,MAC7D,CAAA;AAAA,IACF,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,uBACEW,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wEAAqE,sCAEpF,CAAA;AAAA,IAEJ;AAEA,IAAA,uBACEA,uBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,YAAA;AAAA,QACL,SAAA,EAAW,2BAA2B,SAAS,CAAA,CAAA;AAAA,QAC/C,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAQ,MAAA,EAAQ,QAAA,EAAU,QAAA,EAAU,GAAG,KAAA,EAAM;AAAA,QACrE,WAAA,EAAa,cAAA;AAAA,QACb,OAAA,EAAS;AAAA,OAAA;AAAA,sBAGTA,uBAAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,gCAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,MAAA,EAAQ,CAAA;AAAA,YACR,OAAA,EAAU,SAAA,IAAa,eAAA,GAAmB,CAAA,GAAI,CAAA;AAAA,YAC9C,UAAA,EAAY;AAAA;AACd,SAAA;AAAA,QAEC,CAAC,eAAA,oBACAA,uBAAAA,CAAA,aAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,KAAK,YAAA,CAAa,EAAA;AAAA,YAClB,GAAA,EAAK,SAAA;AAAA,YACL,WAAW,YAAA,CAAa,SAAA;AAAA,YACxB,OAAO,EAAE,GAAG,KAAA,EAAO,GAAG,aAAa,KAAA,EAAM;AAAA,YACzC,UAAU,YAAA,CAAa,OAAA;AAAA,YACvB,MAAM,QAAA,KAAa,QAAA;AAAA,YACnB,kBAAA;AAAA,YACA,QAAQ,MAAM;AACZ,cAAA,OAAA,CAAQ,IAAI,+BAA+B,CAAA;AAC3C,cAAA,YAAA,CAAa,KAAK,CAAA;AAClB,cAAA,IAAI,aAAa,OAAA,EAAS;AACxB,gBAAA,SAAA,CAAU,SAAS,IAAA,EAAK;AACxB,gBAAA,YAAA,CAAa,IAAI,CAAA;AAAA,cACnB;AAAA,YACF,CAAA;AAAA,YACA,QAAQ,MAAM;AACZ,cAAA,YAAA,CAAa,IAAI,CAAA;AACjB,cAAA,WAAA,GAAc,IAAI,CAAA;AAAA,YACpB,CAAA;AAAA,YACA,SAAS,MAAM;AACb,cAAA,YAAA,CAAa,KAAK,CAAA;AAClB,cAAA,WAAA,GAAc,KAAK,CAAA;AAAA,YACrB,CAAA;AAAA,YACA,cAAA,EAAgB,CAAC,QAAA,KAAa;AAC5B,cAAA,iBAAA,CAAkB,QAAQ,CAAA;AAAA,YAC5B,CAAA;AAAA,YACA,YAAA,EAAc,gBAAA;AAAA,YACd,OAAA,EAAS,WAAA;AAAA,YACT;AAAA;AAAA;AACF,OAEJ;AAAA,MAAA,CAGE,SAAA,IAAa,eAAA,qBACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qFAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kCAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gFAAA,EAAiF,CAAA,kBAChGA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAAA,EACZ,eAAA,GAAkB,mCAAA,GAAa,yCAClC,CACF,CACF,CAAA;AAAA,sBAIFA,uBAAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,CAAA,wGAAA,EAA2G,WAAA,GAAc,aAAA,GAAgB,WAAW,CAAA;AAAA,SAAA;AAAA,wBAG/JA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,SAAA,EAAA,EAAU,KAAA,EAAO,YAAA,EAAc,CAClC,CAAA;AAAA,wBAGAA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,YAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,SAAA;AAAA,YACA,WAAA;AAAA,YACA,QAAA;AAAA,YACA,QAAA;AAAA,YACA,cAAA;AAAA,YACA,WAAA,EAAa,MAAM,SAAA,GAAY,SAAA,CAAU,SAAS,KAAA,EAAM,GAAI,SAAA,CAAU,OAAA,EAAS,IAAA,EAAK;AAAA,YACpF,MAAA,EAAQ,IAAA;AAAA,YACR,UAAA,EAAY,QAAA;AAAA,YACZ,QAAQ,CAAC,IAAA,KAAS,SAAA,CAAU,OAAA,EAAS,KAAK,IAAI,CAAA;AAAA,YAC9C,eAAe,MAAM;AACnB,cAAA,SAAA,CAAU,SAAS,WAAA,EAAY;AAC/B,cAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,YACzB,CAAA;AAAA,YACA,cAAc,MAAM;AAClB,cAAA,MAAM,KAAA,GAA2C,CAAC,MAAA,EAAQ,QAAA,EAAU,SAAS,CAAA;AAC7E,cAAA,MAAM,QAAA,GAAW,OAAO,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,CAAA,IAAK,MAAM,MAAM,CAAA;AACnE,cAAA,WAAA,CAAY,QAAQ,CAAA;AAAA,YACtB,CAAA;AAAA,YACA,gBAAA,EAAkB,MAAM,eAAA,CAAgB,CAAC,YAAY;AAAA;AAAA,SAEzD;AAAA,OACF;AAAA,sBAGAA,uBAAAA,CAAA,aAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UACC,MAAA;AAAA,UACA,YAAA;AAAA,UACA,MAAA,EAAQ,YAAA;AAAA,UACR,OAAA,EAAS,MAAM,eAAA,CAAgB,KAAK,CAAA;AAAA,UACpC,aAAA,EAAe,CAAC,KAAA,KAAU;AACxB,YAAA,SAAA,CAAU,KAAK,CAAA;AACf,YAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,UACvB;AAAA;AAAA;AACF,KACF;AAAA,EAEJ;AACF;AAEA,cAAA,CAAe,WAAA,GAAc,gBAAA","file":"index.js","sourcesContent":["\n/**\n * Ammo.js 加载器\n * 用于异步加载 Ammo.js 物理引擎 (WASM 版本)\n */\n\n// 声明全局 Ammo 对象\ndeclare global {\n interface Window {\n Ammo: any;\n }\n}\n\nlet ammoPromise: Promise<any> | null = null;\n\n/**\n * 加载 Ammo.js\n * @param path Ammo.js (WASM wrapper) 的路径,默认为 '/libs/ammo.wasm.js'\n */\nexport const loadAmmo = (path: string = '/libs/ammo.wasm.js'): Promise<any> => {\n if (ammoPromise) {\n return ammoPromise;\n }\n\n ammoPromise = new Promise((resolve, reject) => {\n // 如果已经加载过\n if (typeof window.Ammo === 'function') {\n // Ammo 已经是一个函数(初始化器),直接调用\n window.Ammo().then((lib: any) => {\n resolve(lib);\n });\n return;\n }\n\n if (typeof window.Ammo === 'object') {\n // 已经初始化完毕\n resolve(window.Ammo);\n return;\n }\n\n const script = document.createElement('script');\n script.src = path;\n script.async = true;\n\n script.onload = () => {\n if (typeof window.Ammo === 'function') {\n // 初始化 Ammo\n window.Ammo().then((lib: any) => {\n // 某些版本的 ammo.js 初始化后会返回 lib 实例\n // 但也可能需要直接使用全局对象,这里做一个兼容\n resolve(lib || window.Ammo);\n }).catch((err: any) => {\n console.error('Ammo initialization failed:', err);\n reject(err);\n });\n } else {\n reject(new Error('Ammo.js loaded but window.Ammo is not a function'));\n }\n };\n\n script.onerror = (err) => {\n console.error('Failed to load Ammo.js script:', err);\n reject(new Error(`Failed to load Ammo.js from ${path}`));\n };\n\n document.body.appendChild(script);\n });\n\n return ammoPromise;\n};\n\n","import React, { useEffect, useRef, forwardRef, useImperativeHandle } from 'react';\nimport * as THREE from 'three';\nimport { \n OrbitControls, \n MMDLoader, \n MMDAnimationHelper, \n OutlineEffect,\n EffectComposer,\n RenderPass,\n UnrealBloomPass\n} from 'three-stdlib';\n\n// 🚀 开启 Three.js 全局缓存,确保 CDN 资源在被浏览器缓存后,能直接从内存读取\nif (typeof window !== 'undefined') {\n THREE.Cache.enabled = true;\n}\n\nimport { loadAmmo } from '../utils/ammo-loader';\nimport { MMDPlayerBaseProps, MMDPlayerBaseRef } from '../types';\n\n/**\n * 等待模型的所有材质和纹理加载完成\n * 确保渲染时不会有逐个子模型显示的效果\n */\nasync function waitForMaterialsReady(\n object: THREE.Object3D, \n renderer: THREE.WebGLRenderer,\n scene: THREE.Scene,\n camera: THREE.Camera\n): Promise<void> {\n const textures: THREE.Texture[] = [];\n let meshCount = 0;\n \n // 遍历对象及其所有子对象,收集所有纹理和网格\n object.traverse((obj) => {\n if (obj instanceof THREE.Mesh || obj instanceof THREE.SkinnedMesh) {\n meshCount++;\n const materials = Array.isArray(obj.material) ? obj.material : [obj.material];\n \n materials.forEach((material) => {\n if (material instanceof THREE.Material) {\n // 收集所有可能的纹理属性\n const textureProps = [\n 'map', 'lightMap', 'bumpMap', 'normalMap', 'specularMap',\n 'envMap', 'alphaMap', 'emissiveMap', 'displacementMap',\n 'roughnessMap', 'metalnessMap', 'aoMap',\n // MMD 特有纹理\n 'gradientMap', 'toonMap', 'sphereMap', 'matcap'\n ];\n \n textureProps.forEach((prop) => {\n const texture = (material as any)[prop];\n if (texture instanceof THREE.Texture && !textures.includes(texture)) {\n textures.push(texture);\n }\n });\n }\n });\n }\n });\n \n console.log(`[MMDPlayerBase] Found ${meshCount} meshes and ${textures.length} unique textures`);\n \n // 等待所有纹理的图像数据加载完成\n const texturePromises = textures.map((texture, index) => {\n return new Promise<void>((resolve) => {\n const image = texture.image;\n \n // 检查是否已经加载完成\n if (!image) {\n console.log(`[MMDPlayerBase] Texture ${index + 1}/${textures.length}: No image`);\n resolve();\n return;\n }\n \n if (image instanceof HTMLImageElement) {\n if (image.complete && image.naturalWidth > 0) {\n console.log(`[MMDPlayerBase] Texture ${index + 1}/${textures.length}: Already loaded`);\n resolve();\n } else {\n // 等待图像加载\n const onLoad = () => {\n console.log(`[MMDPlayerBase] Texture ${index + 1}/${textures.length}: Loaded`);\n image.removeEventListener('load', onLoad);\n image.removeEventListener('error', onError);\n resolve();\n };\n \n const onError = (e: any) => {\n console.warn(`[MMDPlayerBase] Texture ${index + 1}/${textures.length}: Failed to load`, e);\n image.removeEventListener('load', onLoad);\n image.removeEventListener('error', onError);\n resolve();\n };\n \n image.addEventListener('load', onLoad);\n image.addEventListener('error', onError);\n \n // 超时保护\n setTimeout(() => {\n image.removeEventListener('load', onLoad);\n image.removeEventListener('error', onError);\n console.warn(`[MMDPlayerBase] Texture ${index + 1}/${textures.length}: Timeout`);\n resolve();\n }, 5000);\n }\n } else {\n console.log(`[MMDPlayerBase] Texture ${index + 1}/${textures.length}: Non-image type`);\n resolve();\n }\n });\n });\n \n await Promise.all(texturePromises);\n console.log('[MMDPlayerBase] All texture images loaded');\n \n // 强制更新所有材质的纹理需要更新标志\n textures.forEach((texture) => {\n texture.needsUpdate = true;\n });\n \n // 执行几次渲染循环,确保所有纹理都上传到 GPU\n console.log('[MMDPlayerBase] Warming up renderer...');\n for (let i = 0; i < 3; i++) {\n await new Promise<void>((resolve) => {\n requestAnimationFrame(() => {\n try {\n // 🎯 核心修复:深度清理无效的变形目标数据,防止 Shader 编译错误 (MORPHTARGETS_COUNT undeclared)\n object.traverse((obj) => {\n if ((obj as any).isMesh) {\n const mesh = obj as THREE.Mesh;\n const materials = Array.isArray(mesh.material) ? mesh.material : [mesh.material];\n \n // 检查几何体是否真的有变形数据\n const hasMorphAttributes = mesh.geometry.morphAttributes && \n Object.keys(mesh.geometry.morphAttributes).length > 0;\n\n materials.forEach(m => {\n // 针对特定的没有实际变形数据的材质\n if (!hasMorphAttributes) {\n // 1. 强制材质关闭变形\n (m as any).morphTargets = false;\n \n // 2. 彻底移除几何体中的变形属性引用\n if (mesh.geometry.morphAttributes) {\n mesh.geometry.morphAttributes = {};\n }\n \n // 3. 重置 Mesh 的变形影响状态\n if ((mesh as any).morphTargetInfluences) {\n (mesh as any).morphTargetInfluences = [];\n }\n if ((mesh as any).morphTargetDictionary) {\n (mesh as any).morphTargetDictionary = {};\n }\n m.needsUpdate = true;\n }\n });\n\n if ((mesh as any).updateMorphTargets) {\n (mesh as any).updateMorphTargets();\n }\n }\n });\n\n renderer.render(scene, camera);\n console.log(`[MMDPlayerBase] Warmup render ${i + 1}/3`);\n } catch (renderError) {\n console.warn('[MMDPlayerBase] Warmup render failed (shader error?), skipping...', renderError);\n }\n resolve();\n });\n });\n }\n \n console.log('[MMDPlayerBase] All materials and textures fully ready');\n}\n\nexport const MMDPlayerBase = forwardRef<MMDPlayerBaseRef, MMDPlayerBaseProps>((props, ref) => {\n const {\n resources,\n stage = {},\n mobileOptimization = { enabled: true },\n autoPlay = false,\n loop = true,\n volume = 1.0,\n muted = false,\n showAxes = false,\n onLoad,\n onLoadProgress,\n onError,\n onPlay,\n onPause,\n onEnded,\n onTimeUpdate,\n onCameraChange,\n className,\n style,\n } = props;\n\n // 合并渲染配置(优先使用 props,其次使用 stage)\n const renderEffect = props.renderEffect || stage.renderEffect || 'default';\n const outlineOptions = { ...stage.outlineOptions, ...props.outlineOptions };\n const bloomOptions = { ...stage.bloomOptions, ...props.bloomOptions };\n\n // 容器 Ref\n const containerRef = useRef<HTMLDivElement>(null);\n \n // Three.js 对象 Refs\n const sceneRef = useRef<THREE.Scene | null>(null);\n const cameraRef = useRef<THREE.PerspectiveCamera | null>(null);\n const rendererRef = useRef<THREE.WebGLRenderer | null>(null);\n const outlineEffectRef = useRef<OutlineEffect | null>(null);\n const composerRef = useRef<EffectComposer | null>(null);\n const controlsRef = useRef<OrbitControls | null>(null);\n const helperRef = useRef<any>(null); // MMDAnimationHelper\n const axesHelperRef = useRef<THREE.AxesHelper | null>(null); // 坐标轴\n const clockRef = useRef<THREE.Clock>(new THREE.Clock());\n const animationIdRef = useRef<number | null>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n \n // 状态 Refs\n const isReadyRef = useRef(false);\n const isPlayingRef = useRef(false);\n const initIdRef = useRef(0); // 初始化 ID 锁\n const durationRef = useRef(0); // 动画时长(秒)\n const animationClipRef = useRef<THREE.AnimationClip | null>(null); // 保存动画剪辑\n const loopRef = useRef(loop); // 循环状态 ref\n const audioRef = useRef<THREE.Audio | null>(null); // 音频对象引用\n\n // 🚀 解决回调函数在渲染循环中的闭包过时问题\n const latestCallbacks = useRef({ onPlay, onPause, onEnded, onTimeUpdate });\n useEffect(() => {\n latestCallbacks.current = { onPlay, onPause, onEnded, onTimeUpdate };\n }, [onPlay, onPause, onEnded, onTimeUpdate]);\n \n // 🎯 新增:物理引擎组件引用 - 用于正确清理 Ammo 对象\n // 改用数组来追踪所有创建的对象(每个模型会创建多个物理世界和刚体)\n const physicsComponentsRef = useRef<{\n configs: any[];\n dispatchers: any[];\n caches: any[];\n solvers: any[];\n worlds: any[];\n }>({\n configs: [],\n dispatchers: [],\n caches: [],\n solvers: [],\n worlds: []\n });\n \n // 🕐 运行时间追踪 - 用于 OOM 错误报告\n const startTimeRef = useRef<number>(Date.now());\n const modelSwitchCountRef = useRef<number>(0);\n\n // 暴露给父组件的方法\n useImperativeHandle(ref, () => ({\n play: () => {\n if (!isReadyRef.current) return;\n isPlayingRef.current = true;\n if (!clockRef.current.running) clockRef.current.start();\n latestCallbacks.current.onPlay?.();\n },\n pause: () => {\n if (!isPlayingRef.current) return;\n isPlayingRef.current = false;\n clockRef.current.stop();\n latestCallbacks.current.onPause?.();\n },\n stop: () => {\n isPlayingRef.current = false;\n clockRef.current.stop();\n latestCallbacks.current.onPause?.();\n },\n seek: (time: number) => {\n console.warn('Seek not fully implemented in MMDPlayerBase yet');\n },\n getCurrentTime: () => {\n const elapsed = clockRef.current.elapsedTime;\n const duration = durationRef.current;\n // 如果是循环播放,返回模除后的时间\n if (duration > 0 && loopRef.current) {\n return elapsed % duration;\n }\n return elapsed;\n }, \n getDuration: () => durationRef.current,\n isPlaying: () => isPlayingRef.current,\n snapshot: () => {\n if (!rendererRef.current) return '';\n if (sceneRef.current && cameraRef.current) {\n rendererRef.current.render(sceneRef.current, cameraRef.current);\n }\n return rendererRef.current.domElement.toDataURL('image/png');\n },\n resetCamera: () => {\n if (!cameraRef.current || !controlsRef.current) return;\n \n const { cameraPosition, cameraTarget } = stage;\n \n if (cameraPosition) {\n const pos = cameraPosition as any;\n cameraRef.current.position.set(pos.x, pos.y, pos.z);\n } else {\n cameraRef.current.position.set(0, 20, 30);\n }\n \n if (cameraTarget) {\n const target = cameraTarget as any;\n controlsRef.current.target.set(target.x, target.y, target.z);\n } else {\n controlsRef.current.target.set(0, 10, 0);\n }\n \n controlsRef.current.update();\n onCameraChange?.(false); // 重置后标记为非手动\n }\n }));\n\n // 初始化 Effect\n useEffect(() => {\n if (!containerRef.current) return;\n\n const init = async () => {\n // 1. 生成当前初始化的唯一 ID\n const myId = ++initIdRef.current;\n \n // 辅助函数:检查当前初始化是否已过时或组件已卸载\n const checkCancelled = () => {\n return myId !== initIdRef.current || !containerRef.current;\n };\n\n // 2. 清空容器 (Double Check)\n if (containerRef.current) {\n containerRef.current.innerHTML = '';\n }\n \n // 3. 重置物理引擎组件引用\n physicsComponentsRef.current = {\n configs: [],\n dispatchers: [],\n caches: [],\n solvers: [],\n worlds: []\n };\n \n // 🕐 记录开始时间和切换计数\n if (modelSwitchCountRef.current === 0) {\n // 首次加载,记录开始时间\n startTimeRef.current = Date.now();\n modelSwitchCountRef.current = 1;\n console.log('[MMDPlayerBase] 🕐 系统启动时间:', new Date(startTimeRef.current).toLocaleString());\n } else {\n // 模型切换\n modelSwitchCountRef.current++;\n const runningTime = Date.now() - startTimeRef.current;\n const minutes = Math.floor(runningTime / 60000);\n const seconds = Math.floor((runningTime % 60000) / 1000);\n console.log(`[MMDPlayerBase] 🔄 模型切换 #${modelSwitchCountRef.current} (运行时间: ${minutes}分${seconds}秒)`);\n }\n\n try {\n // 4. 物理引擎加载\n if (stage.enablePhysics !== false && !mobileOptimization.disablePhysics) {\n console.log('[MMDPlayerBase] Loading Ammo.js physics engine...');\n await loadAmmo(stage.physicsPath);\n if (checkCancelled()) return;\n console.log('[MMDPlayerBase] Ammo.js loaded successfully');\n \n // 🎯 关键修复:Hook MMDPhysics._createWorld 以捕获物理引擎组件\n // 这样我们可以在清理时正确销毁它们,防止 WASM 内存泄漏\n const Ammo = (window as any).Ammo;\n if (Ammo) {\n console.log('[MMDPlayerBase] Setting up physics component tracking...');\n \n // 保存原始的 Ammo 构造函数,以便在 _createWorld 中使用\n const originalBtDefaultCollisionConfiguration = Ammo.btDefaultCollisionConfiguration;\n const originalBtCollisionDispatcher = Ammo.btCollisionDispatcher;\n const originalBtDbvtBroadphase = Ammo.btDbvtBroadphase;\n const originalBtSequentialImpulseConstraintSolver = Ammo.btSequentialImpulseConstraintSolver;\n const originalBtDiscreteDynamicsWorld = Ammo.btDiscreteDynamicsWorld;\n \n // Monkey patch Ammo 构造函数来拦截创建过程\n // ⚠️ 关键修改:使用数组来保存所有对象,而不是只保存最后一个\n const componentsRef = physicsComponentsRef.current;\n \n Ammo.btDefaultCollisionConfiguration = function(...args: any[]) {\n const obj = new originalBtDefaultCollisionConfiguration(...args);\n componentsRef.configs.push(obj); // 🎯 添加到数组而不是覆盖\n console.log(`[MMDPlayerBase] 🔍 Captured btDefaultCollisionConfiguration #${componentsRef.configs.length}`);\n return obj;\n };\n \n Ammo.btCollisionDispatcher = function(...args: any[]) {\n const obj = new originalBtCollisionDispatcher(...args);\n componentsRef.dispatchers.push(obj);\n console.log(`[MMDPlayerBase] 🔍 Captured btCollisionDispatcher #${componentsRef.dispatchers.length}`);\n return obj;\n };\n \n Ammo.btDbvtBroadphase = function(...args: any[]) {\n const obj = new originalBtDbvtBroadphase(...args);\n componentsRef.caches.push(obj);\n console.log(`[MMDPlayerBase] 🔍 Captured btDbvtBroadphase #${componentsRef.caches.length}`);\n return obj;\n };\n \n Ammo.btSequentialImpulseConstraintSolver = function(...args: any[]) {\n const obj = new originalBtSequentialImpulseConstraintSolver(...args);\n componentsRef.solvers.push(obj);\n console.log(`[MMDPlayerBase] 🔍 Captured btSequentialImpulseConstraintSolver #${componentsRef.solvers.length}`);\n return obj;\n };\n \n Ammo.btDiscreteDynamicsWorld = function(...args: any[]) {\n const obj = new originalBtDiscreteDynamicsWorld(...args);\n componentsRef.worlds.push(obj);\n console.log(`[MMDPlayerBase] 🔍 Captured btDiscreteDynamicsWorld #${componentsRef.worlds.length}`);\n return obj;\n };\n \n console.log('[MMDPlayerBase] ✅ Physics component tracking setup complete');\n }\n } else {\n console.log('[MMDPlayerBase] Physics disabled');\n }\n\n // 5. 场景初始化\n const container = containerRef.current!;\n const width = container.clientWidth || 300;\n const height = container.clientHeight || 150;\n\n // Scene\n const scene = new THREE.Scene();\n if (stage.backgroundColor) {\n scene.background = new THREE.Color(stage.backgroundColor);\n } else if (stage.backgroundImage) {\n const textureLoader = new THREE.TextureLoader();\n textureLoader.load(stage.backgroundImage, (texture) => {\n scene.background = texture;\n });\n }\n sceneRef.current = scene;\n\n // Camera\n const camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 2000);\n if (stage.cameraPosition) {\n const pos = stage.cameraPosition as any;\n camera.position.set(pos.x, pos.y, pos.z);\n } else {\n camera.position.set(0, 20, 30);\n }\n cameraRef.current = camera;\n\n // Renderer\n const renderer = new THREE.WebGLRenderer({ \n antialias: !mobileOptimization.enabled, \n alpha: true, \n preserveDrawingBuffer: true \n });\n renderer.setSize(width, height);\n // 使用更高的像素比例以获得更清晰的渲染效果\n const pixelRatio = mobileOptimization.enabled \n ? (mobileOptimization.pixelRatio || Math.min(window.devicePixelRatio, 2))\n : window.devicePixelRatio;\n renderer.setPixelRatio(pixelRatio);\n console.log('[MMDPlayerBase] Pixel ratio set to:', pixelRatio);\n \n // 5. 关键检查点:在操作 DOM 之前再次检查\n if (checkCancelled()) {\n renderer.dispose();\n return;\n }\n \n // 再次确保容器为空,防止并行执行导致的残留\n container.innerHTML = '';\n \n // 强制 Canvas 样式 - 确保 canvas 在最底层\n renderer.domElement.style.display = 'block';\n renderer.domElement.style.width = '100%';\n renderer.domElement.style.height = '100%';\n renderer.domElement.style.outline = 'none';\n renderer.domElement.style.position = 'relative';\n \n // Shadow\n if (stage.enableShadow !== false && !mobileOptimization.reduceShadowQuality) {\n renderer.shadowMap.enabled = true;\n renderer.shadowMap.type = THREE.PCFSoftShadowMap;\n }\n \n container.appendChild(renderer.domElement);\n rendererRef.current = renderer;\n\n // 🎯 初始化渲染特效\n // 1. Outline Effect\n const effect = new OutlineEffect(renderer, {\n defaultThickness: outlineOptions.thickness ?? 0.003,\n defaultColor: new THREE.Color(outlineOptions.color ?? '#000000').toArray(),\n defaultAlpha: 1,\n defaultKeepAlive: true\n });\n outlineEffectRef.current = effect;\n\n // 2. Effect Composer (for Bloom)\n const composer = new EffectComposer(renderer);\n const renderPass = new RenderPass(scene, camera);\n composer.addPass(renderPass);\n\n const bloomPass = new UnrealBloomPass(\n new THREE.Vector2(width, height),\n bloomOptions.strength ?? 1.0,\n bloomOptions.radius ?? 0.4,\n bloomOptions.threshold ?? 0.8\n );\n composer.addPass(bloomPass);\n composerRef.current = composer;\n\n // Lights\n const ambientLight = new THREE.AmbientLight(0xffffff, stage.ambientLightIntensity ?? 0.5);\n scene.add(ambientLight);\n\n const dirLight = new THREE.DirectionalLight(0xffffff, stage.directionalLightIntensity ?? 0.8);\n dirLight.position.set(0, 10, 0);\n if (stage.enableShadow !== false) {\n dirLight.castShadow = true;\n dirLight.shadow.mapSize.width = mobileOptimization.enabled ? 1024 : 2048;\n dirLight.shadow.mapSize.height = mobileOptimization.enabled ? 1024 : 2048;\n dirLight.shadow.bias = -0.0001;\n }\n scene.add(dirLight);\n\n // Controls\n const controls = new OrbitControls(camera, renderer.domElement);\n controls.minDistance = 10;\n controls.maxDistance = 100;\n if (stage.cameraTarget) {\n const target = stage.cameraTarget as any;\n controls.target.set(target.x, target.y, target.z);\n } else {\n controls.target.set(0, 10, 0);\n }\n controls.update();\n\n // 🎯 监听手动相机操作\n controls.addEventListener('start', () => {\n onCameraChange?.(true);\n });\n\n controlsRef.current = controls;\n\n // Axes Helper (坐标轴辅助)\n if (showAxes) {\n const axesHelper = new THREE.AxesHelper(20);\n scene.add(axesHelper);\n axesHelperRef.current = axesHelper;\n }\n\n // Resize Observer\n const onResize = () => {\n if (!containerRef.current || !cameraRef.current || !rendererRef.current) return;\n const w = containerRef.current.clientWidth;\n const h = containerRef.current.clientHeight;\n \n if (w === 0 || h === 0) return;\n\n cameraRef.current.aspect = w / h;\n cameraRef.current.updateProjectionMatrix();\n \n rendererRef.current.setSize(w, h);\n if (composerRef.current) {\n composerRef.current.setSize(w, h);\n }\n };\n \n const resizeObserver = new ResizeObserver(onResize);\n resizeObserver.observe(container);\n resizeObserverRef.current = resizeObserver;\n \n // 立即执行一次 Resize\n onResize();\n \n // 🎯 提前启动渲染循环(但不播放动画)\n // 这样可以在加载过程中显示场景,但动画要等完全准备好才开始\n console.log('[MMDPlayerBase] Starting render loop (animation paused)');\n animate();\n\n // 6. 资源加载\n console.log('[MMDPlayerBase] Start loading resources...', {\n model: resources.modelPath,\n stage: resources.stageModelPath,\n motion: resources.motionPath\n });\n const loader = new MMDLoader();\n const helper = new MMDAnimationHelper({\n afterglow: 2.0\n });\n helperRef.current = helper;\n\n // 6.1 加载模型和动作\n const loadModelPromise = new Promise<{ mesh: THREE.SkinnedMesh, animation?: THREE.AnimationClip }>((resolve, reject) => {\n if (resources.motionPath) {\n console.log('[MMDPlayerBase] Loading model with motion:', resources.motionPath);\n loader.loadWithAnimation(\n resources.modelPath,\n resources.motionPath,\n (mmd) => {\n resolve({ mesh: mmd.mesh, animation: mmd.animation });\n },\n (xhr) => {\n if (xhr.lengthComputable) {\n const percent = (xhr.loaded / xhr.total) * 100;\n onLoadProgress?.(percent, 'model+motion');\n }\n },\n (err) => reject(err)\n );\n } else {\n console.log('[MMDPlayerBase] Loading model only');\n loader.load(\n resources.modelPath,\n (mesh) => {\n resolve({ mesh: mesh as THREE.SkinnedMesh });\n },\n (xhr) => {\n if (xhr.lengthComputable) {\n const percent = (xhr.loaded / xhr.total) * 100;\n onLoadProgress?.(percent, 'model');\n }\n },\n (err) => reject(err)\n );\n }\n });\n\n const { mesh, animation } = await loadModelPromise;\n \n // 关键检查点:资源加载耗时较长,再次检查是否已失效\n if (checkCancelled()) return;\n \n console.log('[MMDPlayerBase] Model loaded:', mesh);\n \n // 保存动画时长\n if (animation) {\n animationClipRef.current = animation;\n durationRef.current = animation.duration;\n console.log('[MMDPlayerBase] Animation duration:', animation.duration);\n }\n\n // 设置模型基础属性\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n \n // 🎯 关键优化:先等待所有材质和纹理加载完成,再添加到场景\n // 这样可以避免用户看到\"逐个子模型显示\"的过程\n console.log('[MMDPlayerBase] Waiting for all materials and textures to load...');\n \n // 创建一个临时场景来等待纹理加载(不影响主场景)\n const tempScene = new THREE.Scene();\n tempScene.add(mesh);\n await waitForMaterialsReady(mesh, renderer, tempScene, camera);\n \n if (checkCancelled()) return;\n console.log('[MMDPlayerBase] ✅ All materials and textures loaded');\n \n // 从临时场景移除\n tempScene.remove(mesh);\n\n // 计算模型边界并自动聚焦\n const box = new THREE.Box3().setFromObject(mesh);\n if (!box.isEmpty()) {\n const center = box.getCenter(new THREE.Vector3());\n const size = box.getSize(new THREE.Vector3());\n console.log('[MMDPlayerBase] Model bounds:', { center, size });\n\n if (!stage.cameraTarget) {\n // 对于人形模型,聚焦在胸部/头部之间的位置(center.y + 30-40% 高度)\n controls.target.set(center.x, center.y + size.y * 0.35, center.z);\n \n if (!stage.cameraPosition) {\n // MMD 模型通常正面朝向 -Z 轴,相机应该在 +Z 方向\n // 距离基于模型尺寸,确保能看到全身\n const maxDim = Math.max(size.x, size.y, size.z);\n const dist = maxDim * 2.0; // 增加距离系数\n \n // 相机位置:在模型前方(+Z),稍微抬高(俯视角度)\n camera.position.set(\n center.x, // X: 水平对齐\n center.y + size.y * 0.6, // Y: 稍高于模型中心(眼睛平视或略俯视)\n center.z + dist // Z: 在模型正前方(+Z 方向)\n );\n console.log('[MMDPlayerBase] Auto camera position:', camera.position);\n }\n controls.update();\n }\n }\n \n // 🎯 现在所有纹理都已加载完成,添加到场景和 helper\n const enablePhysics = stage.enablePhysics !== false && !mobileOptimization.disablePhysics;\n \n helper.add(mesh, {\n animation: animation,\n physics: enablePhysics\n });\n\n scene.add(mesh);\n console.log('[MMDPlayerBase] ✅ Model added to scene (fully loaded)');\n\n // 🎯 自动降级系统 - 针对移动设备优化\n const isMobileDevice = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) || \n (window.innerWidth <= 768);\n \n if (isMobileDevice) {\n console.log('[MMDPlayerBase] 📱 Mobile device detected, applying optimizations...');\n \n // 方案 A: 使用骨骼纹理(如果支持)\n if (renderer.capabilities.vertexTextures) {\n console.log('[MMDPlayerBase] ✅ Vertex textures supported');\n } else {\n console.log('[MMDPlayerBase] ⚠️ Vertex textures NOT supported');\n }\n \n // 方案 B: 简化材质\n let simplifiedMaterialCount = 0;\n mesh.traverse((child) => {\n if (child instanceof THREE.Mesh || child instanceof THREE.SkinnedMesh) {\n const materials = Array.isArray(child.material) ? child.material : [child.material];\n materials.forEach((material, idx) => {\n if (material instanceof THREE.MeshPhongMaterial || \n material instanceof THREE.MeshStandardMaterial) {\n // 保存原始材质的颜色\n const originalColor = material.color?.clone();\n const originalMap = material.map;\n \n // 创建简化的 MeshBasicMaterial\n const basicMaterial = new THREE.MeshBasicMaterial({\n color: originalColor || 0xffffff,\n map: originalMap,\n transparent: material.transparent,\n opacity: material.opacity,\n side: material.side,\n alphaTest: material.alphaTest\n });\n \n // 替换材质\n if (Array.isArray(child.material)) {\n child.material[idx] = basicMaterial;\n } else {\n child.material = basicMaterial;\n }\n \n // 清理旧材质\n material.dispose();\n simplifiedMaterialCount++;\n }\n });\n }\n });\n \n if (simplifiedMaterialCount > 0) {\n console.log(`[MMDPlayerBase] ✅ Simplified ${simplifiedMaterialCount} materials to MeshBasicMaterial`);\n }\n \n // 方案 C: 限制骨骼数量(检查并警告)\n const MAX_BONES = 64;\n if (mesh.skeleton) {\n const boneCount = mesh.skeleton.bones.length;\n if (boneCount > MAX_BONES) {\n console.warn(`[MMDPlayerBase] ⚠️ Model has ${boneCount} bones (max recommended: ${MAX_BONES})`);\n console.warn(`[MMDPlayerBase] This may cause performance issues on mobile devices`);\n } else {\n console.log(`[MMDPlayerBase] ✅ Bone count: ${boneCount} (within limit)`);\n }\n }\n \n console.log('[MMDPlayerBase] 📱 Mobile optimizations applied');\n }\n\n // 6.3 加载相机动画\n if (resources.cameraPath) {\n loader.loadAnimation(\n resources.cameraPath,\n camera,\n (cameraAnimation) => {\n if (checkCancelled()) return; // Callback check\n helper.add(camera, {\n animation: cameraAnimation as THREE.AnimationClip\n });\n },\n undefined,\n (err) => console.error('Failed to load camera motion:', err)\n );\n }\n\n // 6.4 加载音频\n if (resources.audioPath) {\n const listener = new THREE.AudioListener();\n camera.add(listener);\n \n const sound = new THREE.Audio(listener);\n const audioLoader = new THREE.AudioLoader();\n \n audioLoader.load(\n resources.audioPath,\n (buffer) => {\n if (checkCancelled()) return; // Callback check\n sound.setBuffer(buffer);\n sound.setLoop(loopRef.current);\n sound.setVolume(volume);\n audioRef.current = sound; // 保存音频引用以便后续更新循环状态\n \n helper.add(sound, { \n delay: 0.0, \n duration: buffer.duration \n } as any);\n },\n undefined,\n (err) => console.error('Failed to load audio:', err)\n );\n }\n\n // 6.5 加载舞台\n const stagePaths = Array.isArray(resources.stageModelPath) \n ? resources.stageModelPath \n : (resources.stageModelPath ? [resources.stageModelPath] : []);\n\n for (const stagePath of stagePaths) {\n try {\n console.log(`[MMDPlayerBase] Loading stage from: ${stagePath}`);\n const stageMesh = await new Promise<THREE.Object3D>((resolve, reject) => {\n loader.load(\n stagePath,\n (mesh) => resolve(mesh),\n (xhr) => {\n if (xhr.lengthComputable) {\n const percent = (xhr.loaded / xhr.total) * 100;\n if (Math.round(percent) % 20 === 0) console.log(`[MMDPlayerBase] Stage loading: ${percent.toFixed(1)}%`);\n }\n },\n (err) => reject(err)\n );\n });\n \n if (checkCancelled()) return;\n \n console.log(`[MMDPlayerBase] Stage model loaded: ${stagePath}`, stageMesh);\n \n // 🎯 核心修复:深度清理无效的变形目标数据,防止 Shader 编译错误\n stageMesh.traverse((child) => {\n if (child instanceof THREE.Mesh) {\n child.castShadow = true;\n child.receiveShadow = true;\n \n const mesh = child as THREE.Mesh;\n const materials = Array.isArray(mesh.material) ? mesh.material : [mesh.material];\n \n materials.forEach((m, idx) => {\n // 对于普通舞台材质,也确保关闭没用的 morphTargets\n if ((m as any).morphTargets) {\n (m as any).morphTargets = false;\n m.needsUpdate = true;\n }\n });\n\n // 3. 彻底移除几何体中的变形属性引用\n if (mesh.geometry.morphAttributes) {\n mesh.geometry.morphAttributes = {};\n }\n if ((mesh as any).morphTargetInfluences) {\n (mesh as any).morphTargetInfluences = [];\n }\n }\n });\n\n // 🎯 材质预热\n try {\n await waitForMaterialsReady(stageMesh, renderer, scene, camera);\n } catch (e) {\n console.warn(`[MMDPlayerBase] Warmup error for stage ${stagePath}:`, e);\n }\n \n if (checkCancelled()) return;\n \n // 添加到场景\n scene.add(stageMesh);\n \n // 🎯 自动调整比例和位置\n const stageBox = new THREE.Box3().setFromObject(stageMesh);\n const stageSize = stageBox.getSize(new THREE.Vector3());\n \n if (stageSize.length() < 1) {\n stageMesh.scale.multiplyScalar(100);\n } else if (stageSize.y < 5) {\n stageMesh.scale.multiplyScalar(10);\n }\n \n // 确保底部对齐 Y=0 (可选)\n // stageMesh.position.set(0, 0, 0); \n\n console.log(`[MMDPlayerBase] ✅ Stage added: ${stagePath}`);\n\n // 绑定动作\n if (resources.stageMotionPath) {\n (loader as any).loadAnimation(resources.stageMotionPath, stageMesh, (anim: any) => {\n if (!checkCancelled()) helper.add(stageMesh as any, { animation: anim });\n });\n }\n } catch (err) {\n console.error(`Failed to load stage ${stagePath}:`, err);\n }\n }\n\n if (checkCancelled()) return;\n \n // 🎯 所有资源完全加载完成,模型已完全显示,现在可以触发回调并开始播放动画\n isReadyRef.current = true;\n console.log('[MMDPlayerBase] 🎉 All resources fully loaded and ready!');\n console.log('[MMDPlayerBase] 📊 Summary:');\n console.log(`[MMDPlayerBase] - Model: ✅ Fully loaded with all textures`);\n if (resources.stageModelPath) {\n console.log(`[MMDPlayerBase] - Stage: ✅ Fully loaded with all textures`);\n }\n if (animation) {\n console.log(`[MMDPlayerBase] - Animation: ✅ Ready (${animation.duration.toFixed(2)}s)`);\n }\n console.log('[MMDPlayerBase] 🔔 Triggering onLoad callback');\n onLoad?.();\n \n if (autoPlay) {\n // 给一点时间让渲染系统稳定,然后开始播放动画\n setTimeout(() => {\n if (checkCancelled()) return;\n console.log('[MMDPlayerBase] 🎬 Starting animation playback (after materials fully loaded)');\n isPlayingRef.current = true;\n if (!clockRef.current.running) clockRef.current.start();\n onPlay?.();\n }, 100);\n }\n\n } catch (error) {\n if (checkCancelled()) return; // 如果是因为取消导致的 error,忽略\n console.error('MMDPlayerBase initialization failed:', error);\n \n // 检测 OOM 错误并弹出警告\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (errorMessage.includes('OOM') || errorMessage.includes('out of memory')) {\n // 计算运行时间\n const runningTime = Date.now() - startTimeRef.current;\n const hours = Math.floor(runningTime / 3600000);\n const minutes = Math.floor((runningTime % 3600000) / 60000);\n const seconds = Math.floor((runningTime % 60000) / 1000);\n \n const timeString = hours > 0 \n ? `${hours}小时${minutes}分${seconds}秒` \n : minutes > 0\n ? `${minutes}分${seconds}秒`\n : `${seconds}秒`;\n \n alert(`⚠️ 内存溢出错误 (OOM)\n\n📊 系统运行统计:\n• 运行时间: ${timeString}\n• 模型切换次数: ${modelSwitchCountRef.current}\n• 启动时间: ${new Date(startTimeRef.current).toLocaleString()}\n• 错误时间: ${new Date().toLocaleString()}\n\n❌ 问题:物理引擎内存不足!\n这通常意味着之前的物理世界没有正确清理。\n\n🔍 错误详情:\n${errorMessage}\n\n💡 建议:请刷新页面或联系开发者`);\n }\n \n onError?.(error instanceof Error ? error : new Error(String(error)));\n }\n };\n\n init();\n\n return () => {\n // 清理逻辑 - 彻底清理所有 Three.js 资源以防止内存泄漏\n console.log('[MMDPlayerBase] Cleanup started');\n \n // 增加 ID,立即使当前的 init 失效(如果还在跑)\n initIdRef.current++;\n \n // 停止动画循环\n if (animationIdRef.current) {\n cancelAnimationFrame(animationIdRef.current);\n animationIdRef.current = null;\n }\n \n isPlayingRef.current = false;\n isReadyRef.current = false;\n \n // 清理 ResizeObserver\n if (resizeObserverRef.current) {\n resizeObserverRef.current.disconnect();\n resizeObserverRef.current = null;\n }\n \n // 清理音频资源\n if (audioRef.current) {\n try {\n if (audioRef.current.isPlaying) {\n audioRef.current.stop();\n }\n if (audioRef.current.source) {\n audioRef.current.disconnect();\n }\n // 清理音频缓冲区引用\n if (audioRef.current.buffer) {\n audioRef.current.buffer = null as any;\n }\n audioRef.current = null;\n } catch (e) {\n console.warn('[MMDPlayerBase] Error cleaning up audio:', e);\n }\n }\n \n // 清理 AnimationHelper - 包含物理引擎清理 \n if (helperRef.current) {\n try {\n console.log('[MMDPlayerBase] Cleaning up AnimationHelper');\n \n const helperObjects = (helperRef.current as any).objects;\n const meshes = (helperRef.current as any).meshes || [];\n \n console.log('[MMDPlayerBase] Found meshes count:', meshes.length);\n \n if (meshes && Array.isArray(meshes) && meshes.length > 0) {\n meshes.forEach((mesh: any, idx: number) => {\n console.log(`[MMDPlayerBase] Cleaning mesh ${idx}:`, mesh.uuid);\n \n // 🎯 关键修复:从 WeakMap 中获取真正的 meshData\n let meshData: any = null;\n \n if (helperObjects instanceof WeakMap) {\n console.log('[MMDPlayerBase] Accessing WeakMap with mesh as key...');\n meshData = helperObjects.get(mesh);\n \n if (meshData) {\n const meshDataKeys = Object.keys(meshData);\n console.log(`[MMDPlayerBase] ✅ Got meshData from WeakMap, keys (${meshDataKeys.length}):`, meshDataKeys);\n \n // 打印物理相关的属性\n const physicsRelatedKeys = meshDataKeys.filter(k => k.toLowerCase().includes('phys'));\n if (physicsRelatedKeys.length > 0) {\n console.log(`[MMDPlayerBase] Physics-related keys:`, physicsRelatedKeys);\n physicsRelatedKeys.forEach(key => {\n const value = meshData[key];\n console.log(`[MMDPlayerBase] ${key}:`, typeof value, value?.constructor?.name || value);\n });\n }\n } else {\n console.log('[MMDPlayerBase] ⚠️ No meshData found in WeakMap for this mesh');\n }\n }\n \n // 如果没有从 WeakMap 获取到,使用 mesh 本身作为 fallback\n if (!meshData) {\n console.log('[MMDPlayerBase] Using mesh itself as meshData');\n meshData = mesh;\n }\n \n // 清理物理系统 - 从 meshData 中获取\n const physics = meshData?.physics;\n \n if (physics) {\n try {\n console.log('[MMDPlayerBase] 🎯 Starting physics cleanup for mesh', idx);\n console.log('[MMDPlayerBase] Debug: physics object keys:', Object.keys(physics));\n \n // 优先使用 MMDPhysics.dispose() 方法(three-stdlib 提供的标准清理方法)\n if (typeof physics.dispose === 'function') {\n console.log('[MMDPlayerBase] Calling MMDPhysics.dispose()...');\n physics.dispose();\n console.log('[MMDPlayerBase] ✅ MMDPhysics.dispose() completed');\n } else {\n // 手动清理物理组件\n console.log('[MMDPlayerBase] No dispose method, manually cleaning physics components...');\n \n const Ammo = (window as any).Ammo;\n if (!Ammo || !Ammo.destroy) {\n console.warn('[MMDPlayerBase] ⚠️ Ammo.destroy not available');\n } else {\n // 清理刚体\n if (physics.world && Array.isArray(physics.bodies) && physics.bodies.length > 0) {\n console.log(`[MMDPlayerBase] Cleaning ${physics.bodies.length} rigid bodies...`);\n for (let i = physics.bodies.length - 1; i >= 0; i--) {\n try {\n const body = physics.bodies[i];\n if (body && body.body) {\n physics.world.removeRigidBody(body.body);\n }\n } catch (e) {\n console.warn(`[MMDPlayerBase] Error removing body ${i}:`, e);\n }\n }\n physics.bodies.length = 0;\n console.log('[MMDPlayerBase] ✅ All rigid bodies removed');\n }\n \n // 清理约束\n if (physics.world && Array.isArray(physics.constraints) && physics.constraints.length > 0) {\n console.log(`[MMDPlayerBase] Cleaning ${physics.constraints.length} constraints...`);\n for (let i = physics.constraints.length - 1; i >= 0; i--) {\n try {\n const constraint = physics.constraints[i];\n if (constraint) {\n physics.world.removeConstraint(constraint);\n }\n } catch (e) {\n console.warn(`[MMDPlayerBase] Error removing constraint ${i}:`, e);\n }\n }\n physics.constraints.length = 0;\n console.log('[MMDPlayerBase] ✅ All constraints removed');\n }\n \n // 注意:不在这里销毁 world,因为它会在后面统一清理\n }\n }\n \n // 清除引用\n meshData.physics = null;\n \n console.log('[MMDPlayerBase] ✅ Physics cleanup completed for mesh', idx);\n } catch (physicsError) {\n console.error('[MMDPlayerBase] ❌ Error cleaning up physics:', physicsError);\n console.error('[MMDPlayerBase] Physics error stack:', (physicsError as Error).stack);\n }\n } else {\n console.log('[MMDPlayerBase] ⚠️ No physics object found for mesh', idx);\n }\n \n // 清理 AnimationMixer (从 meshData 中获取)\n if (meshData?.mixer) {\n meshData.mixer.stopAllAction();\n meshData.mixer.uncacheRoot(meshData.mesh || mesh);\n // 清理所有 clips 的引用\n const clips = meshData.mixer._actions || [];\n clips.forEach((action: any) => {\n if (action._clip) {\n action._clip = null;\n }\n });\n meshData.mixer = null;\n }\n \n // 清理 audio 引用 (从 meshData 中获取)\n if (meshData?.audio) {\n if (meshData.audio.isPlaying) {\n meshData.audio.stop();\n }\n if (meshData.audio.source) {\n meshData.audio.disconnect();\n }\n if (meshData.audio.buffer) {\n meshData.audio.buffer = null;\n }\n meshData.audio = null;\n }\n });\n // 清空数组\n meshes.length = 0;\n }\n \n // 🎯 核心修复:使用捕获的物理引擎组件引用进行清理\n console.log('[MMDPlayerBase] 🔥 Starting CRITICAL physics components cleanup...');\n const Ammo = (window as any).Ammo;\n if (Ammo && Ammo.destroy) {\n const components = physicsComponentsRef.current;\n \n console.log(`[MMDPlayerBase] 📊 Physics components count:`, {\n worlds: components.worlds.length,\n solvers: components.solvers.length,\n caches: components.caches.length,\n dispatchers: components.dispatchers.length,\n configs: components.configs.length\n });\n \n // 按照正确的顺序销毁 Ammo 对象(与创建顺序相反)\n // 创建顺序:config -> dispatcher -> cache -> solver -> world\n // 销毁顺序:world -> solver -> cache -> dispatcher -> config\n \n // 销毁所有 worlds\n if (components.worlds.length > 0) {\n console.log(`[MMDPlayerBase] 🗑️ Destroying ${components.worlds.length} btDiscreteDynamicsWorld(s)...`);\n for (let i = components.worlds.length - 1; i >= 0; i--) {\n try {\n Ammo.destroy(components.worlds[i]);\n } catch (e) {\n console.error(`[MMDPlayerBase] ❌ Error destroying world #${i}:`, e);\n }\n }\n components.worlds.length = 0;\n console.log('[MMDPlayerBase] ✅ All btDiscreteDynamicsWorld destroyed');\n }\n \n // 销毁所有 solvers\n if (components.solvers.length > 0) {\n console.log(`[MMDPlayerBase] 🗑️ Destroying ${components.solvers.length} btSequentialImpulseConstraintSolver(s)...`);\n for (let i = components.solvers.length - 1; i >= 0; i--) {\n try {\n Ammo.destroy(components.solvers[i]);\n } catch (e) {\n console.error(`[MMDPlayerBase] ❌ Error destroying solver #${i}:`, e);\n }\n }\n components.solvers.length = 0;\n console.log('[MMDPlayerBase] ✅ All btSequentialImpulseConstraintSolver destroyed');\n }\n \n // 销毁所有 caches\n if (components.caches.length > 0) {\n console.log(`[MMDPlayerBase] 🗑️ Destroying ${components.caches.length} btDbvtBroadphase(s)...`);\n for (let i = components.caches.length - 1; i >= 0; i--) {\n try {\n Ammo.destroy(components.caches[i]);\n } catch (e) {\n console.error(`[MMDPlayerBase] ❌ Error destroying cache #${i}:`, e);\n }\n }\n components.caches.length = 0;\n console.log('[MMDPlayerBase] ✅ All btDbvtBroadphase destroyed');\n }\n \n // 销毁所有 dispatchers\n if (components.dispatchers.length > 0) {\n console.log(`[MMDPlayerBase] 🗑️ Destroying ${components.dispatchers.length} btCollisionDispatcher(s)...`);\n for (let i = components.dispatchers.length - 1; i >= 0; i--) {\n try {\n Ammo.destroy(components.dispatchers[i]);\n } catch (e) {\n console.error(`[MMDPlayerBase] ❌ Error destroying dispatcher #${i}:`, e);\n }\n }\n components.dispatchers.length = 0;\n console.log('[MMDPlayerBase] ✅ All btCollisionDispatcher destroyed');\n }\n \n // 销毁所有 configs\n if (components.configs.length > 0) {\n console.log(`[MMDPlayerBase] 🗑️ Destroying ${components.configs.length} btDefaultCollisionConfiguration(s)...`);\n for (let i = components.configs.length - 1; i >= 0; i--) {\n try {\n Ammo.destroy(components.configs[i]);\n } catch (e) {\n console.error(`[MMDPlayerBase] ❌ Error destroying config #${i}:`, e);\n }\n }\n components.configs.length = 0;\n console.log('[MMDPlayerBase] ✅ All btDefaultCollisionConfiguration destroyed');\n }\n \n console.log('[MMDPlayerBase] 🎉 Physics components cleanup completed!');\n } else {\n console.warn('[MMDPlayerBase] ⚠️ Ammo.destroy not available, skipping physics cleanup');\n }\n \n // 清理 sharedPhysics 和 masterPhysics(如果存在)\n console.log('[MMDPlayerBase] Checking helper-level physics...');\n if ((helperRef.current as any).sharedPhysics) {\n console.log('[MMDPlayerBase] Clearing sharedPhysics reference...');\n (helperRef.current as any).sharedPhysics = null;\n }\n if ((helperRef.current as any).masterPhysics) {\n console.log('[MMDPlayerBase] Clearing masterPhysics reference...');\n (helperRef.current as any).masterPhysics = null;\n }\n \n // 清理 helper 自身\n if (helperRef.current.dispose) {\n helperRef.current.dispose();\n }\n } catch (e) {\n console.warn('[MMDPlayerBase] Error cleaning up AnimationHelper:', e);\n }\n helperRef.current = null;\n }\n \n // 清理 AnimationClip\n animationClipRef.current = null;\n \n // 清理坐标轴\n if (axesHelperRef.current) {\n if (sceneRef.current) {\n sceneRef.current.remove(axesHelperRef.current);\n }\n axesHelperRef.current.dispose();\n axesHelperRef.current = null;\n }\n \n // 清理场景中的所有对象 - 增强版\n if (sceneRef.current) {\n sceneRef.current.traverse((object) => {\n // 清理几何体和材质\n if (object instanceof THREE.Mesh || object instanceof THREE.SkinnedMesh) {\n // 清理骨骼相关(SkinnedMesh)\n if (object instanceof THREE.SkinnedMesh) {\n if (object.skeleton) {\n object.skeleton.dispose();\n }\n // 清理绑定矩阵\n if (object.bindMatrix) {\n object.bindMatrix = null as any;\n }\n if (object.bindMatrixInverse) {\n object.bindMatrixInverse = null as any;\n }\n }\n \n // 清理几何体\n if (object.geometry) {\n object.geometry.dispose();\n object.geometry = null as any;\n }\n \n // 清理材质和纹理\n if (object.material) {\n const disposeMaterial = (m: THREE.Material) => {\n // 清理所有可能的纹理类型(包括 MMD 特有的)\n const textureProps = [\n 'map', 'lightMap', 'bumpMap', 'normalMap', 'specularMap', \n 'envMap', 'alphaMap', 'emissiveMap', 'displacementMap',\n 'roughnessMap', 'metalnessMap', 'aoMap',\n // MMD 特有纹理\n 'gradientMap', 'toonMap', 'sphereMap', 'matcap'\n ];\n \n textureProps.forEach(prop => {\n // @ts-ignore\n if (m[prop] && m[prop].dispose) {\n // @ts-ignore\n m[prop].dispose();\n // @ts-ignore\n m[prop] = null;\n }\n });\n \n // 清理材质本身\n m.dispose();\n };\n \n if (Array.isArray(object.material)) {\n object.material.forEach(disposeMaterial);\n } else {\n disposeMaterial(object.material);\n }\n object.material = null as any;\n }\n }\n \n // 清理 AudioListener\n if (object instanceof THREE.AudioListener) {\n try {\n // @ts-ignore\n if (object.context && object.context.state !== 'closed') {\n // @ts-ignore\n object.context.close?.();\n }\n } catch (e) {\n console.warn('[MMDPlayerBase] Error closing AudioContext:', e);\n }\n }\n \n // 清理灯光的阴影贴图\n if (object instanceof THREE.Light) {\n if (object.shadow && object.shadow.map) {\n object.shadow.map.dispose();\n object.shadow.map = null as any;\n }\n }\n });\n \n // 清空场景\n sceneRef.current.clear();\n sceneRef.current = null;\n }\n\n // 清理 Controls\n if (controlsRef.current) {\n controlsRef.current.dispose();\n controlsRef.current = null;\n }\n\n // 清理 Renderer - 增强版\n if (rendererRef.current) {\n try {\n // 清理 Composer\n if (composerRef.current) {\n composerRef.current.passes.forEach(pass => {\n if ((pass as any).dispose) (pass as any).dispose();\n });\n composerRef.current = null;\n }\n \n // 清理 OutlineEffect\n outlineEffectRef.current = null;\n\n // 清理所有渲染目标\n const renderer = rendererRef.current;\n \n // 清理渲染列表\n if (renderer.renderLists) {\n renderer.renderLists.dispose();\n }\n \n // 清理渲染器信息\n if (renderer.info && renderer.info.programs) {\n renderer.info.programs.forEach((program: any) => {\n if (program && program.destroy) {\n program.destroy();\n }\n });\n }\n \n // 清理 WebGL 程序\n if (renderer.getContext) {\n const gl = renderer.getContext();\n const numTextureUnits = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n for (let unit = 0; unit < numTextureUnits; ++unit) {\n gl.activeTexture(gl.TEXTURE0 + unit);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, null);\n }\n }\n \n // Dispose 渲染器\n renderer.dispose();\n \n // 强制失去 WebGL 上下文\n renderer.forceContextLoss();\n \n // 从 DOM 中移除 canvas\n if (containerRef.current && renderer.domElement) {\n if (containerRef.current.contains(renderer.domElement)) {\n containerRef.current.removeChild(renderer.domElement);\n }\n }\n \n // 清空 canvas 引用\n if (renderer.domElement) {\n renderer.domElement.width = 1;\n renderer.domElement.height = 1;\n }\n \n } catch (e) {\n console.warn('[MMDPlayerBase] Error cleaning up renderer:', e);\n }\n rendererRef.current = null;\n }\n \n // 重置 Camera\n cameraRef.current = null;\n \n // 重置 Clock\n clockRef.current = new THREE.Clock();\n \n // 重置时长\n durationRef.current = 0;\n \n console.log('[MMDPlayerBase] Cleanup completed');\n \n // 提示浏览器可以进行垃圾回收(只在开发环境)\n if (typeof window !== 'undefined' && 'gc' in window) {\n try {\n // @ts-ignore\n window.gc();\n } catch (e) {\n // gc 不可用时忽略\n }\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [resources]); // 关键依赖:当 resources 变了(且没有 key 强制重刷时),执行这个 effect\n\n // 监听 showAxes 变化,动态添加/移除坐标轴\n useEffect(() => {\n if (!sceneRef.current) return;\n \n if (showAxes && !axesHelperRef.current) {\n const axesHelper = new THREE.AxesHelper(20);\n sceneRef.current.add(axesHelper);\n axesHelperRef.current = axesHelper;\n } else if (!showAxes && axesHelperRef.current) {\n sceneRef.current.remove(axesHelperRef.current);\n axesHelperRef.current.dispose();\n axesHelperRef.current = null;\n }\n }, [showAxes]);\n\n // 监听 loop 变化,更新循环状态\n useEffect(() => {\n loopRef.current = loop;\n \n // 同步更新音频的循环状态\n if (audioRef.current && audioRef.current.buffer) {\n audioRef.current.setLoop(loop);\n }\n }, [loop]);\n\n // 监听渲染特效配置变化\n useEffect(() => {\n if (outlineEffectRef.current) {\n // OutlineEffect 不直接支持实时修改参数,通常需要重新创建或访问私有属性\n // 这里我们可以通过访问内部 renderer 的属性来实现一些更新\n }\n \n if (composerRef.current) {\n const bloomPass = composerRef.current.passes.find(p => p instanceof UnrealBloomPass) as UnrealBloomPass;\n if (bloomPass) {\n bloomPass.strength = bloomOptions.strength ?? 1.0;\n bloomPass.radius = bloomOptions.radius ?? 0.4;\n bloomPass.threshold = bloomOptions.threshold ?? 0.8;\n }\n }\n }, [bloomOptions.strength, bloomOptions.radius, bloomOptions.threshold]);\n\n // 监听 stage 变化,动态更新场景属性(不触发完整重载)\n useEffect(() => {\n if (!isReadyRef.current) return;\n\n // 更新背景\n if (sceneRef.current) {\n if (stage.backgroundColor) {\n sceneRef.current.background = new THREE.Color(stage.backgroundColor);\n } else if (stage.backgroundImage) {\n const textureLoader = new THREE.TextureLoader();\n textureLoader.load(stage.backgroundImage, (texture) => {\n if (sceneRef.current) sceneRef.current.background = texture;\n });\n }\n }\n\n // 更新灯光强度\n if (sceneRef.current) {\n sceneRef.current.traverse((obj) => {\n if (obj instanceof THREE.AmbientLight && stage.ambientLightIntensity !== undefined) {\n obj.intensity = stage.ambientLightIntensity;\n }\n if (obj instanceof THREE.DirectionalLight && stage.directionalLightIntensity !== undefined) {\n obj.intensity = stage.directionalLightIntensity;\n }\n });\n }\n\n // 更新相机和目标\n if (cameraRef.current && stage.cameraPosition) {\n const pos = stage.cameraPosition as any;\n cameraRef.current.position.set(pos.x, pos.y, pos.z);\n }\n if (controlsRef.current && stage.cameraTarget) {\n const target = stage.cameraTarget as any;\n controlsRef.current.target.set(target.x, target.y, target.z);\n controlsRef.current.update();\n }\n }, [stage.backgroundColor, stage.backgroundImage, stage.ambientLightIntensity, stage.directionalLightIntensity, stage.cameraPosition, stage.cameraTarget]);\n\n // 渲染循环\n const animate = () => {\n animationIdRef.current = requestAnimationFrame(animate);\n \n if (rendererRef.current && sceneRef.current && cameraRef.current) {\n if (isReadyRef.current && isPlayingRef.current && helperRef.current) {\n const delta = clockRef.current.getDelta();\n helperRef.current.update(delta);\n \n // 触发时间更新回调(使用模除后的时间)\n const elapsed = clockRef.current.elapsedTime;\n const duration = durationRef.current;\n const currentTime = duration > 0 && loopRef.current ? (elapsed % duration) : elapsed;\n latestCallbacks.current.onTimeUpdate?.(currentTime);\n \n // 简单的结束检测(非循环模式)\n if (!loopRef.current && duration > 0 && elapsed >= duration) {\n isPlayingRef.current = false;\n clockRef.current.stop();\n latestCallbacks.current.onEnded?.();\n }\n }\n \n // 使用选定的渲染方式\n const useOutline = renderEffect === 'outline' || renderEffect === 'outline+bloom';\n const useBloom = renderEffect === 'bloom' || renderEffect === 'outline+bloom';\n\n if (useBloom && composerRef.current) {\n composerRef.current.render();\n } else if (useOutline && outlineEffectRef.current) {\n outlineEffectRef.current.render(sceneRef.current, cameraRef.current);\n } else {\n rendererRef.current.render(sceneRef.current, cameraRef.current);\n }\n }\n };\n\n return (\n <div \n ref={containerRef} \n className={className} \n style={{ \n width: '100%', \n height: '100%', \n overflow: 'hidden', \n position: 'relative', // 恢复 relative,作为 canvas 的定位容器\n backgroundColor: stage.backgroundColor || '#000',\n ...style \n }}\n />\n );\n});\n\nMMDPlayerBase.displayName = 'MMDPlayerBase';\n","import React from 'react';\nimport { Play, Pause, Maximize, Minimize, Settings, Grid3x3, Repeat, Repeat1, SkipBack, SkipForward, Camera } from 'lucide-react';\n\ninterface ControlPanelProps {\n isPlaying: boolean;\n isFullscreen: boolean;\n isLooping: boolean; // 是否单节点循环播放\n isListLooping?: boolean; // 是否列表循环(播放列表专用)\n isCameraManual?: boolean;\n showSettings?: boolean;\n showAxes?: boolean; // 坐标轴是否显示\n showPrevNext?: boolean; // 是否显示上一个/下一个按钮\n title?: string;\n subtitle?: string; // 副标题 (如 \"1 / 3\")\n \n onPlayPause: () => void;\n onToggleFullscreen: () => void;\n onToggleLoop: () => void; // 切换单节点循环播放\n onToggleListLoop?: () => void; // 切换列表循环\n onToggleAxes?: () => void; // 切换坐标轴显示\n onOpenSettings?: () => void;\n onPrevious?: () => void; // 上一个\n onNext?: () => void; // 下一个\n onResetCamera?: () => void; // 重置相机\n}\n\nexport const ControlPanel: React.FC<ControlPanelProps> = ({\n isPlaying,\n isFullscreen,\n isLooping,\n isListLooping,\n isCameraManual = false,\n showSettings,\n showAxes = false,\n showPrevNext = false,\n title,\n subtitle,\n onPlayPause,\n onToggleFullscreen,\n onToggleLoop,\n onToggleListLoop,\n onToggleAxes,\n onOpenSettings,\n onPrevious,\n onNext,\n onResetCamera,\n}) => {\n return (\n <div className=\"absolute bottom-0 left-0 right-0 bg-gradient-to-t from-black/80 to-transparent p-4 transition-opacity duration-300 hover:opacity-100\">\n <div className=\"flex items-center justify-between text-white\">\n <div className=\"flex items-center gap-2\">\n {/* 上一个按钮 */}\n {showPrevNext && onPrevious && (\n <button \n onClick={onPrevious}\n className=\"rounded-full p-2 hover:bg-white/20 transition-colors\"\n title=\"上一个\"\n >\n <SkipBack size={20} />\n </button>\n )}\n\n {/* 播放/暂停按钮 */}\n <button \n onClick={onPlayPause}\n className=\"rounded-full p-2 hover:bg-white/20 transition-colors\"\n title={isPlaying ? '暂停' : '播放'}\n >\n {isPlaying ? <Pause size={24} /> : <Play size={24} />}\n </button>\n\n {/* 下一个按钮 */}\n {showPrevNext && onNext && (\n <button \n onClick={onNext}\n className=\"rounded-full p-2 hover:bg-white/20 transition-colors\"\n title=\"下一个\"\n >\n <SkipForward size={20} />\n </button>\n )}\n </div>\n\n <div className=\"flex items-center gap-4\">\n {/* 标题和副标题 */}\n {(title || subtitle) && (\n <div className=\"hidden text-sm font-medium opacity-80 md:block\">\n {title}\n {subtitle && <span className=\"ml-2 text-xs opacity-60\">{subtitle}</span>}\n </div>\n )}\n\n {/* 列表循环切换(仅播放列表模式) */}\n {onToggleListLoop && (\n <button \n onClick={onToggleListLoop}\n className={`rounded-full p-2 transition-colors ${isListLooping ? 'bg-green-500/30 hover:bg-green-500/50' : 'hover:bg-white/20'}`}\n title={isListLooping ? '列表循环:开启' : '列表循环:关闭'}\n >\n <Repeat size={20} />\n </button>\n )}\n\n {/* 单节点循环切换 */}\n <button \n onClick={onToggleLoop}\n className={`rounded-full p-2 transition-colors ${isLooping ? 'bg-blue-500/30 hover:bg-blue-500/50' : 'hover:bg-white/20'}`}\n title={isLooping ? '单曲循环:开启' : '单曲循环:关闭'}\n >\n <Repeat1 size={20} />\n </button>\n\n {/* 相机重置按钮 */}\n {isCameraManual && onResetCamera && (\n <button \n onClick={onResetCamera}\n className=\"rounded-full p-2 bg-blue-500/30 text-blue-400 hover:bg-blue-500/50 hover:text-blue-300 transition-all animate-in zoom-in duration-300\"\n title=\"恢复初始视角\"\n >\n <Camera size={20} />\n </button>\n )}\n\n {/* 坐标轴切换 */}\n {onToggleAxes && (\n <button \n onClick={onToggleAxes}\n className={`rounded-full p-2 transition-colors ${showAxes ? 'bg-blue-500/30 hover:bg-blue-500/50' : 'hover:bg-white/20'}`}\n title=\"显示/隐藏坐标轴\"\n >\n <Grid3x3 size={20} />\n </button>\n )}\n\n {/* 设置 */}\n {showSettings && (\n <button \n onClick={onOpenSettings}\n className=\"rounded-full p-2 hover:bg-white/20 transition-colors\"\n title=\"资源设置\"\n >\n <Settings size={20} />\n </button>\n )}\n\n {/* 全屏 */}\n <button \n onClick={onToggleFullscreen}\n className=\"rounded-full p-2 hover:bg-white/20 transition-colors\"\n title={isFullscreen ? '退出全屏' : '全屏'}\n >\n {isFullscreen ? <Minimize size={20} /> : <Maximize size={20} />}\n </button>\n </div>\n </div>\n </div>\n );\n};\n\n","import React from 'react';\nimport { X, Check, Image as ImageIcon, Music, Video, User } from 'lucide-react';\nimport { MMDResourceItem, MMDResourceOptions, ResourceOption } from '../types';\n\ninterface SettingsPanelProps {\n mode: 'list' | 'options';\n \n // List Mode Props\n items?: MMDResourceItem[];\n currentId?: string;\n onSelectId?: (id: string) => void;\n \n // Options Mode Props\n options?: MMDResourceOptions;\n currentSelection?: {\n modelId?: string;\n motionId?: string;\n cameraId?: string;\n audioId?: string;\n stageId?: string;\n };\n onSelectOption?: (type: 'models'|'motions'|'cameras'|'audios'|'stages', id: string) => void;\n \n onClose: () => void;\n}\n\nexport const SettingsPanel: React.FC<SettingsPanelProps> = ({\n mode,\n items,\n currentId,\n onSelectId,\n options,\n currentSelection,\n onSelectOption,\n onClose,\n}) => {\n \n const renderListMode = () => {\n if (!items) return null;\n return (\n <div className=\"grid grid-cols-1 gap-2 p-4 sm:grid-cols-2\">\n {items.map((item) => (\n <button\n key={item.id}\n onClick={() => onSelectId?.(item.id)}\n className={`group flex items-center gap-3 rounded-lg p-3 transition-all ${\n currentId === item.id \n ? 'bg-blue-500/20 ring-1 ring-blue-500' \n : 'bg-white/5 hover:bg-white/10'\n }`}\n >\n <div className=\"flex h-12 w-12 flex-shrink-0 items-center justify-center rounded bg-black/20 overflow-hidden\">\n {item.thumbnail ? (\n <img src={item.thumbnail} alt={item.name} className=\"h-full w-full object-cover\" />\n ) : (\n <Video size={20} className=\"opacity-50\" />\n )}\n </div>\n <div className=\"flex-1 text-left\">\n <div className={`font-medium ${currentId === item.id ? 'text-blue-400' : 'text-white'}`}>\n {item.name}\n </div>\n {item.description && (\n <div className=\"text-xs text-white/50 truncate\">{item.description}</div>\n )}\n </div>\n {currentId === item.id && <Check size={16} className=\"text-blue-400\" />}\n </button>\n ))}\n </div>\n );\n };\n\n const renderOptionGroup = (\n title: string, \n icon: React.ReactNode, \n type: 'models'|'motions'|'cameras'|'audios'|'stages',\n list: ResourceOption[] = [],\n currentVal?: string\n ) => {\n if (!list || list.length === 0) return null;\n \n return (\n <div className=\"mb-6\">\n <div className=\"mb-3 flex items-center gap-2 text-sm font-medium text-white/70\">\n {icon}\n <span>{title}</span>\n </div>\n <div className=\"grid grid-cols-2 gap-2 sm:grid-cols-3\">\n {list.map(opt => (\n <button\n key={opt.id}\n onClick={() => onSelectOption?.(type, opt.id)}\n className={`relative flex flex-col items-center gap-2 rounded-lg p-2 text-center transition-all ${\n currentVal === opt.id \n ? 'bg-blue-500/20 ring-1 ring-blue-500' \n : 'bg-white/5 hover:bg-white/10'\n }`}\n >\n {opt.thumbnail ? (\n <img src={opt.thumbnail} alt={opt.name} className=\"h-16 w-full rounded object-cover bg-black/20\" />\n ) : (\n <div className=\"flex h-16 w-full items-center justify-center rounded bg-black/20\">\n <div className=\"text-xs opacity-30\">{opt.name.slice(0, 2)}</div>\n </div>\n )}\n <div className={`w-full truncate text-xs ${currentVal === opt.id ? 'text-blue-400' : 'text-white/80'}`}>\n {opt.name}\n </div>\n {currentVal === opt.id && (\n <div className=\"absolute top-1 right-1 rounded-full bg-blue-500 p-0.5\">\n <Check size={10} className=\"text-white\" />\n </div>\n )}\n </button>\n ))}\n </div>\n </div>\n );\n };\n\n const renderOptionsMode = () => {\n if (!options) return null;\n return (\n <div className=\"p-4\">\n {renderOptionGroup('模型', <User size={16} />, 'models', options.models, currentSelection?.modelId)}\n {renderOptionGroup('动作', <Video size={16} />, 'motions', options.motions, currentSelection?.motionId)}\n {renderOptionGroup('镜头', <ImageIcon size={16} />, 'cameras', options.cameras, currentSelection?.cameraId)}\n {renderOptionGroup('音频', <Music size={16} />, 'audios', options.audios, currentSelection?.audioId)}\n {renderOptionGroup('舞台', <ImageIcon size={16} />, 'stages', options.stages, currentSelection?.stageId)}\n </div>\n );\n };\n\n return (\n <div className=\"absolute right-0 top-0 h-full w-full max-w-sm transform bg-[#1a1a1e]/95 backdrop-blur-md shadow-2xl transition-transform duration-300 ease-in-out overflow-y-auto z-20 border-l border-white/10\">\n <div className=\"sticky top-0 z-10 flex items-center justify-between border-b border-white/10 bg-[#1a1a1e]/95 p-4 backdrop-blur-md\">\n <h2 className=\"text-lg font-semibold text-white\">\n {mode === 'list' ? '播放列表' : '自定义场景'}\n </h2>\n <button \n onClick={onClose}\n className=\"rounded-full p-2 text-white/50 hover:bg-white/10 hover:text-white\"\n >\n <X size={20} />\n </button>\n </div>\n \n <div className=\"pb-20\">\n {mode === 'list' ? renderListMode() : renderOptionsMode()}\n </div>\n </div>\n );\n};\n\n","import React, { useState, useEffect } from 'react';\n\ninterface MMDPlayerEnhancedDebugInfoProps {\n isPlaying: boolean;\n isLooping: boolean;\n isFullscreen: boolean;\n showAxes: boolean;\n isLoading: boolean;\n currentResourceId?: string;\n currentResourceName?: string;\n mode: 'single' | 'list' | 'options';\n totalResources: number;\n}\n\nexport const MMDPlayerEnhancedDebugInfo: React.FC<MMDPlayerEnhancedDebugInfoProps> = ({\n isPlaying,\n isLooping,\n isFullscreen,\n showAxes,\n isLoading,\n currentResourceId,\n currentResourceName,\n mode,\n totalResources,\n}) => {\n const [memoryInfo, setMemoryInfo] = useState<any>(null);\n\n useEffect(() => {\n const timer = setInterval(() => {\n // 获取内存信息(仅在Chrome中可用)\n // @ts-ignore\n if (performance.memory) {\n // @ts-ignore\n const used = (performance.memory.usedJSHeapSize / 1048576).toFixed(1);\n // @ts-ignore\n const total = (performance.memory.totalJSHeapSize / 1048576).toFixed(1);\n // @ts-ignore\n const limit = (performance.memory.jsHeapSizeLimit / 1048576).toFixed(1);\n setMemoryInfo({ used, total, limit });\n }\n }, 1000);\n return () => clearInterval(timer);\n }, []);\n return (\n <div className=\"text-white text-xs font-mono\">\n <h3 className=\"text-sm font-bold mb-3 pb-2 border-b border-gray-700\">\n 🎮 MMDPlayerEnhanced Debug\n </h3>\n\n {/* 播放状态 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">播放状态</h4>\n <div className=\"space-y-1 pl-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">播放中:</span>\n <StatusBadge active={isPlaying} label={isPlaying ? 'Playing' : 'Paused'} />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">循环:</span>\n <StatusBadge active={isLooping} label={isLooping ? 'On' : 'Off'} />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">加载中:</span>\n <StatusBadge active={isLoading} label={isLoading ? 'Loading' : 'Ready'} />\n </div>\n </div>\n </div>\n\n {/* 视图状态 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">视图状态</h4>\n <div className=\"space-y-1 pl-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">全屏:</span>\n <StatusBadge active={isFullscreen} label={isFullscreen ? 'Yes' : 'No'} />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">坐标轴:</span>\n <StatusBadge active={showAxes} label={showAxes ? 'Show' : 'Hide'} />\n </div>\n </div>\n </div>\n\n {/* 资源信息 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">资源信息</h4>\n <div className=\"space-y-1 pl-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">模式:</span>\n <span className=\"text-blue-400 uppercase\">{mode}</span>\n </div>\n {mode === 'list' && (\n <>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">总数:</span>\n <span className=\"text-green-400\">{totalResources}</span>\n </div>\n {currentResourceId && (\n <div className=\"mt-2 p-2 bg-gray-800 rounded\">\n <div className=\"text-gray-400 text-[10px]\">当前资源</div>\n <div className=\"text-white truncate\">{currentResourceName || currentResourceId}</div>\n <div className=\"text-gray-500 text-[10px] mt-1 truncate\">ID: {currentResourceId}</div>\n </div>\n )}\n </>\n )}\n </div>\n </div>\n\n {/* 内存监控 */}\n {memoryInfo && (\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">内存监控 (Chrome only)</h4>\n <div className=\"space-y-2 p-2 bg-gray-800 rounded\">\n <div className=\"flex items-center justify-between text-[10px]\">\n <span className=\"text-gray-400\">已用:</span>\n <span className=\"text-yellow-400 font-bold\">{memoryInfo.used} MB</span>\n </div>\n <div className=\"flex items-center justify-between text-[10px]\">\n <span className=\"text-gray-400\">总计:</span>\n <span className=\"text-blue-400\">{memoryInfo.total} MB</span>\n </div>\n <div className=\"flex items-center justify-between text-[10px]\">\n <span className=\"text-gray-400\">限制:</span>\n <span className=\"text-gray-400\">{memoryInfo.limit} MB</span>\n </div>\n {/* 内存使用进度条 */}\n <div className=\"mt-2\">\n <div className=\"bg-gray-700 rounded-full h-2 overflow-hidden\">\n <div\n className={`h-full transition-all duration-300 ${\n (parseFloat(memoryInfo.used) / parseFloat(memoryInfo.limit)) * 100 > 80\n ? 'bg-red-500'\n : (parseFloat(memoryInfo.used) / parseFloat(memoryInfo.limit)) * 100 > 60\n ? 'bg-yellow-500'\n : 'bg-green-500'\n }`}\n style={{\n width: `${Math.min(100, (parseFloat(memoryInfo.used) / parseFloat(memoryInfo.limit)) * 100)}%`,\n }}\n />\n </div>\n <div className=\"text-[9px] text-gray-500 mt-1 text-center\">\n {((parseFloat(memoryInfo.used) / parseFloat(memoryInfo.limit)) * 100).toFixed(1)}%\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* 时间戳 */}\n <div className=\"mt-auto pt-4 border-t border-gray-700\">\n <div className=\"text-gray-500 text-[10px]\">\n Last Update: {new Date().toLocaleTimeString()}\n </div>\n </div>\n </div>\n );\n};\n\n// 辅助组件:状态徽章\nconst StatusBadge: React.FC<{ active: boolean; label: string }> = ({ active, label }) => (\n <span\n className={`px-2 py-0.5 rounded text-[10px] font-bold ${\n active\n ? 'bg-green-600 text-white'\n : 'bg-gray-700 text-gray-400'\n }`}\n >\n {label}\n </span>\n);\n\n\n\n","import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { MMDPlayerBase } from './MMDPlayerBase';\nimport { ControlPanel } from './ControlPanel';\nimport { SettingsPanel } from './SettingsPanel';\nimport { MMDPlayerEnhancedDebugInfo } from './MMDPlayerEnhancedDebugInfo';\nimport { \n MMDPlayerEnhancedProps,\n MMDResources, \n MMDResourceItem, \n MMDResourceOptions, \n MMDPlayerBaseRef \n} from '../types';\n\nexport const MMDPlayerEnhanced: React.FC<MMDPlayerEnhancedProps> = ({\n resources: propResources,\n resourcesList,\n resourceOptions,\n defaultResourceId,\n defaultSelection,\n stage,\n autoPlay = false,\n loop = true,\n volume: initialVolume = 1.0,\n muted: initialMuted = false,\n mobileOptimization,\n showDebugInfo = false,\n className,\n style,\n onLoad,\n onPlay,\n onPause,\n onEnded,\n ...rest\n}) => {\n // 模式判断\n const mode = resourcesList ? 'list' : (resourceOptions ? 'options' : 'single');\n \n // 内部状态\n const [currentResources, setCurrentResources] = useState<MMDResources | undefined>(propResources);\n const [currentId, setCurrentId] = useState<string | undefined>(defaultResourceId);\n const [selection, setSelection] = useState(defaultSelection || {});\n \n // 播放器状态\n const [isPlaying, setIsPlaying] = useState(autoPlay);\n const [volume, setVolume] = useState(initialVolume);\n const [isMuted, setIsMuted] = useState(initialMuted);\n const [isLoading, setIsLoading] = useState(true);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [showSettings, setShowSettings] = useState(false);\n const [showAxes, setShowAxes] = useState(false); // 坐标轴显示状态\n const [isLooping, setIsLooping] = useState(loop); // 循环状态\n \n // Refs\n const playerRef = useRef<MMDPlayerBaseRef>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // 初始化资源逻辑\n useEffect(() => {\n if (mode === 'list' && resourcesList) {\n const targetId = currentId || resourcesList[0]?.id;\n const item = resourcesList.find(i => i.id === targetId);\n if (item) {\n setCurrentResources(item.resources);\n setCurrentId(item.id);\n }\n } else if (mode === 'options' && resourceOptions) {\n // 构建 Resources 对象\n const res: MMDResources = { modelPath: '' };\n \n if (selection.modelId) {\n const m = resourceOptions.models.find(o => o.id === selection.modelId);\n if (m) res.modelPath = m.path;\n } else if (resourceOptions.models.length > 0) {\n // 默认选第一个模型\n const firstModel = resourceOptions.models[0];\n if (firstModel) {\n res.modelPath = firstModel.path;\n setSelection(s => ({ ...s, modelId: firstModel.id }));\n }\n }\n \n if (selection.motionId) {\n const m = resourceOptions.motions.find(o => o.id === selection.motionId);\n if (m) res.motionPath = m.path;\n }\n \n // ... 其他选项映射\n if (selection.cameraId) {\n const c = resourceOptions.cameras?.find(o => o.id === selection.cameraId);\n if (c) res.cameraPath = c.path;\n }\n\n if (selection.audioId) {\n const a = resourceOptions.audios?.find(o => o.id === selection.audioId);\n if (a) res.audioPath = a.path;\n }\n \n if (selection.stageId) {\n const s = resourceOptions.stages?.find(o => o.id === selection.stageId);\n if (s) res.stageModelPath = s.path;\n }\n\n setCurrentResources(res);\n } else {\n setCurrentResources(propResources);\n }\n }, [mode, resourcesList, resourceOptions, currentId, selection, propResources]);\n\n // 处理全屏\n const toggleFullscreen = useCallback(() => {\n if (!containerRef.current) return;\n \n if (!document.fullscreenElement) {\n containerRef.current.requestFullscreen().catch(err => {\n console.error(`Error attempting to enable fullscreen: ${err.message}`);\n });\n setIsFullscreen(true);\n } else {\n document.exitFullscreen();\n setIsFullscreen(false);\n }\n }, []);\n\n // 监听全屏变化 (Esc 退出)\n useEffect(() => {\n const handleFsChange = () => {\n setIsFullscreen(!!document.fullscreenElement);\n };\n document.addEventListener('fullscreenchange', handleFsChange);\n return () => document.removeEventListener('fullscreenchange', handleFsChange);\n }, []);\n\n // 回调处理\n const handlePlayPause = () => {\n if (isPlaying) {\n playerRef.current?.pause();\n } else {\n playerRef.current?.play();\n }\n setIsPlaying(!isPlaying);\n };\n \n const handleListSelect = (id: string) => {\n setCurrentId(id);\n setIsPlaying(true); // 切换后自动播放\n setShowSettings(false); // 手机端可能需要关闭\n };\n \n const handleOptionSelect = (type: string, id: string) => {\n setSelection(prev => {\n const next = { ...prev };\n if (type === 'models') next.modelId = id;\n if (type === 'motions') next.motionId = id;\n if (type === 'cameras') next.cameraId = id;\n if (type === 'audios') next.audioId = id;\n if (type === 'stages') next.stageId = id;\n return next;\n });\n };\n\n if (!currentResources) {\n return <div className=\"flex h-full w-full items-center justify-center bg-black text-white\">No Resources Configured</div>;\n }\n\n return (\n <div \n ref={containerRef}\n className={`relative overflow-hidden bg-black group flex ${className}`}\n style={style}\n >\n {/* 主播放器区域 */}\n <div className=\"flex-1 relative\">\n {/* 核心播放器 */}\n {/* Key 很重要:当资源变化时,通过改变 key 强制重置 BasePlayer,实现最彻底的清理和重新加载 */}\n <MMDPlayerBase\n key={mode === 'list' ? currentId : JSON.stringify(currentResources)}\n ref={playerRef}\n resources={currentResources}\n stage={stage}\n autoPlay={autoPlay} // 注意:这里 autoPlay 只在 mount 时生效\n loop={isLooping}\n volume={volume}\n muted={isMuted}\n showAxes={showAxes}\n mobileOptimization={mobileOptimization}\n onLoad={() => {\n setIsLoading(false);\n onLoad?.();\n if (isPlaying) playerRef.current?.play();\n }}\n onPlay={() => {\n setIsPlaying(true);\n onPlay?.();\n }}\n onPause={() => {\n setIsPlaying(false);\n onPause?.();\n }}\n onEnded={() => {\n setIsPlaying(false);\n onEnded?.();\n }}\n {...rest}\n />\n\n {/* 加载遮罩 */}\n {isLoading && (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center bg-black/50 backdrop-blur-sm\">\n <div className=\"h-10 w-10 animate-spin rounded-full border-4 border-white/20 border-t-blue-500\" />\n </div>\n )}\n\n {/* 控制栏 - 鼠标悬停或暂停时显示 */}\n <div className={`transition-opacity duration-300 ${isPlaying && !showSettings ? 'opacity-0 group-hover:opacity-100' : 'opacity-100'}`}>\n <ControlPanel\n isPlaying={isPlaying}\n isFullscreen={isFullscreen}\n isLooping={isLooping}\n showSettings={mode !== 'single'}\n showAxes={showAxes}\n title={mode === 'list' ? resourcesList?.find(i => i.id === currentId)?.name : undefined}\n onPlayPause={handlePlayPause}\n onToggleFullscreen={toggleFullscreen}\n onToggleLoop={() => setIsLooping(!isLooping)}\n onToggleAxes={() => setShowAxes(!showAxes)}\n onOpenSettings={() => setShowSettings(true)}\n />\n </div>\n\n {/* 设置面板 */}\n {showSettings && (mode === 'list' || mode === 'options') && (\n <SettingsPanel\n mode={mode}\n items={resourcesList}\n currentId={currentId}\n onSelectId={handleListSelect}\n options={resourceOptions}\n currentSelection={selection}\n onSelectOption={handleOptionSelect}\n onClose={() => setShowSettings(false)}\n />\n )}\n </div>\n\n {/* 调试信息面板 */}\n {showDebugInfo && (\n <div className=\"w-96 bg-gray-900/95 border-l border-gray-700 p-4 overflow-y-auto\">\n <MMDPlayerEnhancedDebugInfo\n isPlaying={isPlaying}\n isLooping={isLooping}\n isFullscreen={isFullscreen}\n showAxes={showAxes}\n isLoading={isLoading}\n currentResourceId={currentId}\n currentResourceName={\n mode === 'list' ? resourcesList?.find(i => i.id === currentId)?.name : undefined\n }\n mode={mode}\n totalResources={resourcesList?.length || 1}\n />\n </div>\n )}\n </div>\n );\n};\n\n","import React, { useState, useEffect } from 'react';\nimport { MMDPlaylistNode } from '../types';\n\ninterface MMDPlaylistDebugInfoProps {\n playlistName: string;\n currentIndex: number;\n currentNode: MMDPlaylistNode;\n totalNodes: number;\n isPlaying: boolean;\n isListLooping: boolean;\n isNodeLooping: boolean;\n preloadStrategy: 'none' | 'next' | 'all';\n isLoading: boolean;\n isFullscreen: boolean;\n showAxes: boolean;\n preloadedNodes: number[];\n}\n\nexport const MMDPlaylistDebugInfo: React.FC<MMDPlaylistDebugInfoProps> = ({\n playlistName,\n currentIndex,\n currentNode,\n totalNodes,\n isPlaying,\n isListLooping,\n isNodeLooping,\n preloadStrategy,\n isLoading,\n isFullscreen,\n showAxes,\n preloadedNodes,\n}) => {\n const [memoryInfo, setMemoryInfo] = useState<any>(null);\n\n useEffect(() => {\n const timer = setInterval(() => {\n // 获取内存信息(仅在Chrome中可用)\n // @ts-ignore\n if (performance.memory) {\n // @ts-ignore\n const used = (performance.memory.usedJSHeapSize / 1048576).toFixed(1);\n // @ts-ignore\n const total = (performance.memory.totalJSHeapSize / 1048576).toFixed(1);\n // @ts-ignore\n const limit = (performance.memory.jsHeapSizeLimit / 1048576).toFixed(1);\n setMemoryInfo({ used, total, limit });\n }\n }, 1000);\n return () => clearInterval(timer);\n }, []);\n return (\n <div className=\"text-white text-xs font-mono\">\n <h3 className=\"text-sm font-bold mb-3 pb-2 border-b border-gray-700\">\n 🎭 MMDPlaylist Debug\n </h3>\n\n {/* 播放列表信息 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">播放列表</h4>\n <div className=\"space-y-1 pl-2\">\n <div className=\"text-white truncate\">\n {playlistName}\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">进度:</span>\n <span className=\"text-blue-400\">\n {currentIndex + 1} / {totalNodes}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">列表循环:</span>\n <StatusBadge active={isListLooping} label={isListLooping ? 'On' : 'Off'} />\n </div>\n </div>\n </div>\n\n {/* 当前节点 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">当前节点</h4>\n <div className=\"p-2 bg-gray-800 rounded space-y-1\">\n <div className=\"text-white font-semibold truncate\">\n {currentNode.name}\n </div>\n <div className=\"text-gray-500 text-[10px] truncate\">\n ID: {currentNode.id}\n </div>\n {currentNode.duration && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">时长:</span>\n <span className=\"text-green-400\">{currentNode.duration}s</span>\n </div>\n )}\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">节点循环:</span>\n <StatusBadge active={isNodeLooping} label={isNodeLooping ? 'On' : 'Off'} />\n </div>\n </div>\n </div>\n\n {/* 播放状态 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">播放状态</h4>\n <div className=\"space-y-1 pl-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">播放中:</span>\n <StatusBadge active={isPlaying} label={isPlaying ? 'Playing' : 'Paused'} />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">加载中:</span>\n <StatusBadge active={isLoading} label={isLoading ? 'Loading' : 'Ready'} />\n </div>\n </div>\n </div>\n\n {/* 预加载策略 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">预加载策略</h4>\n <div className=\"space-y-1 pl-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">策略:</span>\n <span className={`px-2 py-0.5 rounded text-[10px] font-bold uppercase ${\n preloadStrategy === 'all' ? 'bg-red-600 text-white' :\n preloadStrategy === 'next' ? 'bg-yellow-600 text-white' :\n 'bg-gray-700 text-gray-400'\n }`}>\n {preloadStrategy}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">已预加载:</span>\n <span className=\"text-purple-400\">{preloadedNodes.length}</span>\n </div>\n {preloadedNodes.length > 0 && (\n <div className=\"mt-2 p-2 bg-gray-800 rounded\">\n <div className=\"text-gray-400 text-[10px] mb-1\">预加载节点索引</div>\n <div className=\"flex flex-wrap gap-1\">\n {preloadedNodes.map((idx) => (\n <span\n key={idx}\n className={`px-1.5 py-0.5 rounded text-[10px] ${\n idx === currentIndex\n ? 'bg-green-600 text-white font-bold'\n : 'bg-gray-700 text-gray-300'\n }`}\n >\n {idx}\n </span>\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* 视图状态 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">视图状态</h4>\n <div className=\"space-y-1 pl-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">全屏:</span>\n <StatusBadge active={isFullscreen} label={isFullscreen ? 'Yes' : 'No'} />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">坐标轴:</span>\n <StatusBadge active={showAxes} label={showAxes ? 'Show' : 'Hide'} />\n </div>\n </div>\n </div>\n\n {/* 内存监控 */}\n {memoryInfo && (\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">内存监控 (Chrome only)</h4>\n <div className=\"space-y-2 p-2 bg-gray-800 rounded\">\n <div className=\"flex items-center justify-between text-[10px]\">\n <span className=\"text-gray-400\">已用:</span>\n <span className=\"text-yellow-400 font-bold\">{memoryInfo.used} MB</span>\n </div>\n <div className=\"flex items-center justify-between text-[10px]\">\n <span className=\"text-gray-400\">总计:</span>\n <span className=\"text-blue-400\">{memoryInfo.total} MB</span>\n </div>\n <div className=\"flex items-center justify-between text-[10px]\">\n <span className=\"text-gray-400\">限制:</span>\n <span className=\"text-gray-400\">{memoryInfo.limit} MB</span>\n </div>\n {/* 内存使用进度条 */}\n <div className=\"mt-2\">\n <div className=\"bg-gray-700 rounded-full h-2 overflow-hidden\">\n <div\n className={`h-full transition-all duration-300 ${\n (parseFloat(memoryInfo.used) / parseFloat(memoryInfo.limit)) * 100 > 80\n ? 'bg-red-500'\n : (parseFloat(memoryInfo.used) / parseFloat(memoryInfo.limit)) * 100 > 60\n ? 'bg-yellow-500'\n : 'bg-green-500'\n }`}\n style={{\n width: `${Math.min(100, (parseFloat(memoryInfo.used) / parseFloat(memoryInfo.limit)) * 100)}%`,\n }}\n />\n </div>\n <div className=\"text-[9px] text-gray-500 mt-1 text-center\">\n {((parseFloat(memoryInfo.used) / parseFloat(memoryInfo.limit)) * 100).toFixed(1)}%\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* 节点列表 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">节点列表</h4>\n <div className=\"space-y-1 max-h-40 overflow-y-auto\">\n {Array.from({ length: totalNodes }).map((_, idx) => (\n <div\n key={idx}\n className={`px-2 py-1 rounded text-[10px] flex items-center justify-between ${\n idx === currentIndex\n ? 'bg-blue-600 text-white font-bold'\n : preloadedNodes.includes(idx)\n ? 'bg-yellow-900/50 text-yellow-300'\n : 'bg-gray-800 text-gray-400'\n }`}\n >\n <span>节点 {idx}</span>\n {idx === currentIndex && <span>▶</span>}\n {preloadedNodes.includes(idx) && idx !== currentIndex && <span>⏳</span>}\n </div>\n ))}\n </div>\n </div>\n\n {/* 时间戳 */}\n <div className=\"mt-auto pt-4 border-t border-gray-700\">\n <div className=\"text-gray-500 text-[10px]\">\n Last Update: {new Date().toLocaleTimeString()}\n </div>\n </div>\n </div>\n );\n};\n\n// 辅助组件:状态徽章\nconst StatusBadge: React.FC<{ active: boolean; label: string }> = ({ active, label }) => (\n <span\n className={`px-2 py-0.5 rounded text-[10px] font-bold ${\n active\n ? 'bg-green-600 text-white'\n : 'bg-gray-700 text-gray-400'\n }`}\n >\n {label}\n </span>\n);\n\n\n\n","import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { MMDPlayerBase } from './MMDPlayerBase';\nimport { ControlPanel } from './ControlPanel';\nimport { MMDPlaylistDebugInfo } from './MMDPlaylistDebugInfo';\nimport {\n MMDPlaylistProps,\n MMDPlaylistNode,\n MMDPlayerBaseRef,\n} from '../types';\n\n/**\n * MMDPlaylist - 播放列表管理器\n * \n * 核心功能:\n * - 管理多个播放节点\n * - 实现无缝切换(通过 key 变化触发组件重新挂载)\n * - 预加载策略 (none / next / all)\n * - 智能内存回收\n * - 播放列表 UI\n */\nexport const MMDPlaylist: React.FC<MMDPlaylistProps> = ({\n playlist,\n stage,\n mobileOptimization,\n onNodeChange,\n onPlaylistComplete,\n onError,\n showDebugInfo = false,\n className,\n style,\n}) => {\n const { nodes, loop = false, preload = 'none', autoPlay = false } = playlist;\n\n // 状态管理\n const [currentIndex, setCurrentIndex] = useState(0);\n const [isPlaying, setIsPlaying] = useState(autoPlay);\n const [isLoading, setIsLoading] = useState(true);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [showAxes, setShowAxes] = useState(false);\n const [isLooping, setIsLooping] = useState(false); // 单节点循环\n const [isListLooping, setIsListLooping] = useState(loop); // 列表循环\n const [showPlaylist, setShowPlaylist] = useState(false);\n const [isTransitioning, setIsTransitioning] = useState(false); // 切换过渡状态\n const [isCameraManual, setIsCameraManual] = useState(false);\n\n // Refs\n const playerRef = useRef<MMDPlayerBaseRef>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const preloadedRef = useRef<Set<number>>(new Set()); // 记录已预加载的节点索引\n\n // 获取当前节点\n const currentNode = nodes[currentIndex];\n\n // 节点切换 - 两阶段切换,特别关注物理引擎清理\n const goToNode = useCallback(\n (index: number) => {\n if (index < 0 || index >= nodes.length) return;\n if (isTransitioning) return; // 防止在过渡期间重复切换\n \n const node = nodes[index];\n if (!node) return;\n \n console.log(`[MMDPlaylist] Starting transition to node ${index}`);\n \n // 先暂停播放\n const wasPlaying = isPlaying;\n setIsPlaying(false);\n \n // 第一阶段:卸载旧播放器(包括物理引擎)\n setIsTransitioning(true);\n \n // 给物理引擎足够的时间完全清理\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setTimeout(() => {\n // 第二阶段:挂载新播放器\n console.log(`[MMDPlaylist] Loading new node ${index}`);\n setCurrentIndex(index);\n setIsLoading(true);\n onNodeChange?.(node, index);\n \n // 给新组件足够时间初始化\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setTimeout(() => {\n setIsTransitioning(false);\n \n // 切换后如果之前在播放,则自动播放新节点\n if (wasPlaying) {\n setIsPlaying(true);\n }\n \n console.log(`[MMDPlaylist] Transition to node ${index} completed`);\n }, 100);\n });\n });\n }, 300); // 给物理引擎更多清理时间(300ms)\n });\n });\n },\n [nodes, isPlaying, isTransitioning, onNodeChange]\n );\n\n // 上一个节点\n const handlePrevious = useCallback(() => {\n const prevIndex = currentIndex - 1;\n if (prevIndex >= 0) {\n goToNode(prevIndex);\n } else if (isListLooping) {\n // 如果列表循环,跳到最后一个\n goToNode(nodes.length - 1);\n }\n }, [currentIndex, isListLooping, nodes.length, goToNode]);\n\n // 下一个节点\n const handleNext = useCallback(() => {\n const nextIndex = currentIndex + 1;\n if (nextIndex < nodes.length) {\n goToNode(nextIndex);\n } else if (isListLooping) {\n // 如果列表循环,跳回第一个\n goToNode(0);\n } else {\n // 播放列表完成\n setIsPlaying(false);\n onPlaylistComplete?.();\n }\n }, [currentIndex, isListLooping, nodes.length, goToNode, onPlaylistComplete]);\n\n // 播放控制\n const handlePlayPause = useCallback(() => {\n if (isPlaying) {\n playerRef.current?.pause();\n setIsPlaying(false);\n } else {\n playerRef.current?.play();\n setIsPlaying(true);\n }\n }, [isPlaying]);\n\n // 全屏控制\n const toggleFullscreen = useCallback(() => {\n if (!containerRef.current) return;\n\n if (!document.fullscreenElement) {\n containerRef.current.requestFullscreen().catch((err) => {\n console.error(`Error attempting to enable fullscreen: ${err.message}`);\n });\n setIsFullscreen(true);\n } else {\n document.exitFullscreen();\n setIsFullscreen(false);\n }\n }, []);\n\n // 监听全屏变化\n useEffect(() => {\n const handleFsChange = () => {\n setIsFullscreen(!!document.fullscreenElement);\n };\n document.addEventListener('fullscreenchange', handleFsChange);\n return () => document.removeEventListener('fullscreenchange', handleFsChange);\n }, []);\n\n // 当前节点播放结束时的处理\n const handleEnded = useCallback(() => {\n if (isLooping) {\n // 如果单节点循环,重新播放当前节点\n playerRef.current?.play();\n } else {\n // 否则播放下一个节点\n handleNext();\n }\n }, [isLooping, handleNext]);\n\n // 预加载策略实现\n // 注意:当前架构下通过 key 变化实现资源切换,真正的预加载需要创建隐藏组件实例\n // 这里实现基础的预加载标记和日志,作为未来扩展的基础\n useEffect(() => {\n if (preload === 'none') return;\n\n if (preload === 'all') {\n // 标记所有节点为\"应该预加载\"(实际预加载需要后台资源加载器支持)\n nodes.forEach((node, idx) => {\n if (!preloadedRef.current.has(idx)) {\n preloadedRef.current.add(idx);\n console.log(`[MMDPlaylist] Preload strategy: all - marked node ${idx} (${node.name})`);\n }\n });\n } else if (preload === 'next') {\n // 预加载下一个节点\n const nextIndex = (currentIndex + 1) % nodes.length;\n const nextNode = nodes[nextIndex];\n if (nextNode && !preloadedRef.current.has(nextIndex)) {\n preloadedRef.current.add(nextIndex);\n console.log(`[MMDPlaylist] Preload strategy: next - marked node ${nextIndex} (${nextNode.name})`);\n }\n }\n }, [currentIndex, nodes, preload]);\n\n // 智能内存回收:清理已预加载但距离当前节点较远的资源标记\n useEffect(() => {\n if (preload === 'none' || preload === 'all') return;\n if (nodes.length === 0) return; // 防御性检查\n\n // 对于 'next' 策略,清理除当前和下一个之外的预加载标记\n const nextIndex = (currentIndex + 1) % nodes.length;\n const keepIndices = new Set([currentIndex, nextIndex]);\n \n const toRemove: number[] = [];\n preloadedRef.current.forEach((idx) => {\n // 确保索引在有效范围内\n if (idx >= nodes.length || !keepIndices.has(idx)) {\n toRemove.push(idx);\n }\n });\n\n if (toRemove.length > 0) {\n toRemove.forEach((idx) => {\n preloadedRef.current.delete(idx);\n console.log(`[MMDPlaylist] Memory cleanup: removed preload mark for node ${idx}`);\n });\n }\n }, [currentIndex, nodes.length, preload]);\n\n // 组件卸载时清理所有预加载标记\n useEffect(() => {\n return () => {\n console.log('[MMDPlaylist] Component unmounted, clearing all preload marks');\n preloadedRef.current.clear();\n };\n }, []);\n\n if (!currentNode) {\n return (\n <div className=\"flex h-full w-full items-center justify-center bg-black text-white\">\n 播放列表为空\n </div>\n );\n }\n\n // 是否显示上一个/下一个按钮\n const showPrevNext = nodes.length > 1;\n\n return (\n <div\n ref={containerRef}\n className={`relative overflow-hidden bg-black group flex h-full ${className}`}\n style={style}\n >\n {/* 主播放器区域 */}\n <div className=\"flex-1 relative\">\n {/* 核心播放器 - 通过 key 变化实现资源切换和自动清理 */}\n {!isTransitioning && (\n <MMDPlayerBase\n key={currentNode.id}\n ref={playerRef}\n resources={currentNode.resources}\n stage={{ ...stage, ...currentNode.stage }}\n autoPlay={autoPlay && currentIndex === 0} // 只有第一个节点自动播放\n loop={isLooping} // 单节点循环\n showAxes={showAxes}\n mobileOptimization={mobileOptimization}\n onLoad={() => {\n setIsLoading(false);\n if (isPlaying && currentIndex > 0) {\n // 切换节点后继续播放\n playerRef.current?.play();\n }\n }}\n onPlay={() => setIsPlaying(true)}\n onPause={() => setIsPlaying(false)}\n onCameraChange={(isManual) => setIsCameraManual(isManual)}\n onEnded={handleEnded}\n onError={onError}\n />\n )}\n\n {/* 加载/过渡遮罩 */}\n {(isLoading || isTransitioning) && (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center bg-black/50 backdrop-blur-sm\">\n <div className=\"flex flex-col items-center gap-3\">\n <div className=\"h-10 w-10 animate-spin rounded-full border-4 border-white/20 border-t-blue-500\" />\n <div className=\"text-sm text-white/80\">\n {isTransitioning ? '切换中...' : `正在加载 ${currentIndex + 1} / ${nodes.length}`}\n </div>\n </div>\n </div>\n )}\n\n {/* 控制栏 */}\n <div\n className={`transition-opacity duration-300 ${\n isPlaying && !showPlaylist ? 'opacity-0 group-hover:opacity-100' : 'opacity-100'\n }`}\n >\n <ControlPanel\n isPlaying={isPlaying}\n isFullscreen={isFullscreen}\n isLooping={isLooping}\n isListLooping={isListLooping}\n isCameraManual={isCameraManual}\n showSettings={true} // 显示播放列表按钮\n showAxes={showAxes}\n showPrevNext={showPrevNext}\n title={currentNode.name}\n subtitle={`${currentIndex + 1} / ${nodes.length}`}\n onPlayPause={handlePlayPause}\n onPrevious={handlePrevious}\n onNext={handleNext}\n onToggleFullscreen={toggleFullscreen}\n onToggleLoop={() => setIsLooping(!isLooping)}\n onToggleListLoop={() => setIsListLooping(!isListLooping)}\n onToggleAxes={() => setShowAxes(!showAxes)}\n onOpenSettings={() => setShowPlaylist(!showPlaylist)}\n onResetCamera={() => {\n playerRef.current?.resetCamera();\n setIsCameraManual(false);\n }}\n />\n </div>\n\n {/* 播放列表面板 */}\n {showPlaylist && (\n <div className=\"absolute inset-0 z-20 flex items-end bg-black/80 backdrop-blur-sm\">\n <div className=\"w-full max-h-[60vh] overflow-y-auto bg-gray-900/95 rounded-t-xl\">\n {/* 标题栏 */}\n <div className=\"sticky top-0 flex items-center justify-between bg-gray-800 px-4 py-3 border-b border-gray-700\">\n <div>\n <h3 className=\"text-white font-semibold\">{playlist.name}</h3>\n <p className=\"text-xs text-gray-400 mt-0.5\">\n 共 {nodes.length} 个节点\n </p>\n </div>\n <button\n onClick={() => setShowPlaylist(false)}\n className=\"p-2 hover:bg-white/10 rounded-lg transition-colors\"\n aria-label=\"关闭播放列表\"\n >\n <svg className=\"w-5 h-5 text-white\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* 节点列表 */}\n <div className=\"p-2\">\n {nodes.map((node, index) => (\n <button\n key={node.id}\n onClick={() => {\n goToNode(index);\n setShowPlaylist(false);\n }}\n className={`w-full flex items-center gap-3 p-3 rounded-lg mb-2 transition-all ${\n index === currentIndex\n ? 'bg-blue-600 text-white'\n : 'bg-gray-800 text-gray-300 hover:bg-gray-700'\n }`}\n >\n {/* 序号 */}\n <div\n className={`flex-shrink-0 w-8 h-8 rounded-full flex items-center justify-center text-sm font-semibold ${\n index === currentIndex ? 'bg-white/20' : 'bg-gray-700'\n }`}\n >\n {index + 1}\n </div>\n\n {/* 节点信息 */}\n <div className=\"flex-1 text-left\">\n <div className=\"font-medium\">{node.name}</div>\n {node.duration && (\n <div className=\"text-xs opacity-75 mt-0.5\">\n {Math.floor(node.duration / 60)}:{String(Math.floor(node.duration % 60)).padStart(2, '0')}\n </div>\n )}\n </div>\n\n {/* 当前播放指示器 */}\n {index === currentIndex && (\n <div className=\"flex-shrink-0\">\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n </div>\n )}\n </button>\n ))}\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* 调试信息面板 */}\n {showDebugInfo && (\n <div className=\"w-96 flex-shrink-0 bg-gray-900/95 border-l border-gray-700 p-4 overflow-y-auto h-full\">\n <MMDPlaylistDebugInfo\n playlistName={playlist.name}\n currentIndex={currentIndex}\n currentNode={currentNode}\n totalNodes={nodes.length}\n isPlaying={isPlaying}\n isListLooping={isListLooping}\n isNodeLooping={isLooping}\n preloadStrategy={preload}\n isLoading={isLoading || isTransitioning}\n isFullscreen={isFullscreen}\n showAxes={showAxes}\n preloadedNodes={Array.from(preloadedRef.current)}\n />\n </div>\n )}\n </div>\n );\n};\n\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { DialogueBoxProps, DialogueBoxTheme } from './types';\n\n// 注入全局样式\nif (typeof document !== 'undefined' && !document.getElementById('dialogue-box-animations')) {\n const style = document.createElement('style');\n style.id = 'dialogue-box-animations';\n style.textContent = `\n @keyframes gradientShift {\n 0%, 100% { background-position: 0% 50%; }\n 50% { background-position: 100% 50%; }\n }\n \n @keyframes shimmer {\n 0% { background-position: -200% 0; }\n 100% { background-position: 200% 0; }\n }\n \n @keyframes cursorBlink {\n 0%, 100% { opacity: 1; transform: scaleY(1); }\n 50% { opacity: 0.3; transform: scaleY(0.8); }\n }\n \n @keyframes textFadeIn {\n from { opacity: 0; transform: translateY(2px); }\n to { opacity: 1; transform: translateY(0); }\n }\n \n @keyframes bounce {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-4px); }\n }\n `;\n document.head.appendChild(style);\n}\n\n/** 默认主题配置 - 白色主色调 */\nconst defaultTheme: DialogueBoxTheme = {\n backgroundColor: 'rgba(255, 255, 255, 0.15)',\n borderColor: 'rgba(255, 255, 255, 0.25)',\n textColor: '#ffffff',\n speakerBgColor: 'rgba(255, 255, 255, 0.25)',\n speakerTextColor: '#ffffff',\n opacity: 0.98,\n blur: '24px',\n continueHint: '点击继续 ▼',\n showContinueHint: true,\n};\n\n/**\n * DialogueBox - Galgame 风格对话框组件\n * \n * 功能:\n * - 打字机效果显示文本\n * - 说话者名称栏\n * - 点击继续提示\n * - 控制按钮(自动、快进、历史)\n */\nexport const DialogueBox: React.FC<DialogueBoxProps> = ({\n dialogue,\n theme: userTheme,\n isTyping = false,\n isAutoMode = false,\n onClick,\n onSkipTyping,\n onToggleAuto,\n onOpenHistory,\n onSkip,\n onResetCamera,\n isCameraManual = false,\n showControls = true,\n showSkipButton = true,\n showAutoButton = true,\n showHistoryButton = true,\n className,\n}) => {\n const theme = { ...defaultTheme, ...userTheme };\n const [displayedText, setDisplayedText] = useState('');\n const [isComplete, setIsComplete] = useState(false);\n const [isMounted, setIsMounted] = useState(false);\n const typingRef = useRef<NodeJS.Timeout | null>(null);\n const currentTextRef = useRef<string>('');\n\n // 避免 SSR hydration 错误\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n // 打字机效果\n useEffect(() => {\n if (!dialogue) {\n setDisplayedText('');\n setIsComplete(false);\n return;\n }\n\n const text = dialogue.text;\n const speed = dialogue.typeSpeed ?? 50;\n\n // 清除之前的定时器\n if (typingRef.current) {\n clearTimeout(typingRef.current);\n }\n\n // 重置状态\n setDisplayedText('');\n setIsComplete(false);\n currentTextRef.current = text;\n\n let index = 0;\n\n const typeNext = () => {\n if (index < text.length && currentTextRef.current === text) {\n setDisplayedText(text.slice(0, index + 1));\n index++;\n typingRef.current = setTimeout(typeNext, speed);\n } else if (currentTextRef.current === text) {\n setIsComplete(true);\n }\n };\n\n // 开始打字\n typingRef.current = setTimeout(typeNext, speed);\n\n return () => {\n if (typingRef.current) {\n clearTimeout(typingRef.current);\n }\n };\n }, [dialogue]);\n\n // 跳过打字动画\n const handleSkipTyping = useCallback(() => {\n if (typingRef.current) {\n clearTimeout(typingRef.current);\n }\n if (dialogue) {\n setDisplayedText(dialogue.text);\n setIsComplete(true);\n }\n onSkipTyping?.();\n }, [dialogue, onSkipTyping]);\n\n // 处理点击\n const handleClick = useCallback(() => {\n if (!isComplete) {\n handleSkipTyping();\n } else {\n onClick?.();\n }\n }, [isComplete, handleSkipTyping, onClick]);\n\n if (!dialogue) {\n return null;\n }\n\n const speakerColor = dialogue.speakerColor || theme.speakerBgColor;\n\n console.log('[DialogueBox] Rendering:', { \n speaker: dialogue.speaker, \n text: dialogue.text,\n displayedText,\n isComplete \n });\n\n const dialogueContent = (\n <div\n className={`${className || ''}`}\n style={{ \n position: 'fixed',\n bottom: 0,\n left: 0,\n right: 0,\n height: '30vh',\n minHeight: '200px',\n maxHeight: '30vh',\n zIndex: 1,\n pointerEvents: 'auto',\n }}\n >\n {/* 对话框主体 - 占满容器宽度和高度 */}\n <div\n className=\"w-full h-full rounded-t-3xl border cursor-pointer select-none transition-all hover:border-white/50 hover:shadow-2xl flex flex-col relative overflow-hidden\"\n onClick={handleClick}\n style={{\n borderColor: theme.borderColor,\n backdropFilter: `blur(${theme.blur}) saturate(200%)`,\n WebkitBackdropFilter: `blur(${theme.blur}) saturate(200%)`,\n opacity: theme.opacity,\n pointerEvents: 'auto',\n position: 'relative',\n display: 'flex',\n background: `linear-gradient(135deg, \n rgba(255, 255, 255, 0.15) 0%, \n rgba(255, 255, 255, 0.12) 50%, \n rgba(255, 255, 255, 0.1) 100%)`,\n boxShadow: `\n 0 -8px 40px rgba(255, 255, 255, 0.1),\n 0 -4px 16px rgba(255, 255, 255, 0.05),\n inset 0 1px 0 rgba(255, 255, 255, 0.3),\n inset 0 -1px 0 rgba(255, 255, 255, 0.1)\n `,\n }}\n >\n {/* 装饰性渐变层 - 柔和的彩虹渐变 */}\n <div \n className=\"absolute inset-0 opacity-20 pointer-events-none\"\n style={{\n background: `linear-gradient(45deg, \n rgba(255, 182, 193, 0.2) 0%, \n rgba(173, 216, 230, 0.2) 25%,\n rgba(221, 160, 221, 0.2) 50%,\n rgba(255, 218, 185, 0.2) 75%,\n rgba(255, 182, 193, 0.2) 100%)`,\n backgroundSize: '400% 400%',\n animation: 'gradientShift 15s ease infinite',\n }}\n />\n \n {/* 顶部高光 - 更明显的白色光泽 */}\n <div \n className=\"absolute top-0 left-0 right-0 h-1\"\n style={{\n background: 'linear-gradient(90deg, transparent, rgba(255,255,255,0.6), transparent)',\n }}\n />\n \n {/* 底部柔和光晕 */}\n <div \n className=\"absolute bottom-0 left-0 right-0 h-px\"\n style={{\n background: 'linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent)',\n }}\n />\n {/* 控制按钮区域 - 放在对话框内部顶部 */}\n {showControls && (\n <div className=\"flex justify-end gap-3 px-6 pt-4 pb-2 flex-shrink-0 relative z-10\">\n {showHistoryButton && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onOpenHistory?.();\n }}\n className=\"px-4 py-2 text-xs rounded-xl text-white font-medium hover:text-white transition-all backdrop-blur-lg border border-white/30 hover:border-white/50 hover:scale-105 active:scale-95 shadow-lg\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.15))',\n boxShadow: '0 4px 16px rgba(255, 255, 255, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\n }}\n title=\"历史记录\"\n >\n 📜 历史\n </button>\n )}\n {isCameraManual && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onResetCamera?.();\n }}\n className=\"px-4 py-2 text-xs rounded-xl text-white font-medium hover:text-white transition-all backdrop-blur-lg border border-blue-400/50 hover:border-blue-400 hover:scale-105 active:scale-95 shadow-lg animate-in zoom-in duration-300\"\n style={{\n background: 'linear-gradient(135deg, rgba(59, 130, 246, 0.3), rgba(37, 99, 235, 0.2))',\n boxShadow: '0 4px 16px rgba(59, 130, 246, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.2)',\n }}\n title=\"恢复初始视角\"\n >\n 🎥 恢复视角\n </button>\n )}\n {showAutoButton && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onToggleAuto?.();\n }}\n className={`px-4 py-2 text-xs rounded-xl font-medium transition-all backdrop-blur-lg border hover:scale-105 active:scale-95 shadow-lg ${isAutoMode\n ? 'border-white/50 text-white'\n : 'border-white/30 hover:border-white/50 text-white'\n }`}\n style={{\n background: isAutoMode \n ? 'linear-gradient(135deg, rgba(255, 255, 255, 0.35), rgba(255, 255, 255, 0.25))'\n : 'linear-gradient(135deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.15))',\n boxShadow: isAutoMode \n ? '0 4px 20px rgba(255, 255, 255, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.4)'\n : '0 4px 16px rgba(255, 255, 255, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\n }}\n title=\"自动播放\"\n >\n ▶ 自动\n </button>\n )}\n {showSkipButton && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onSkip?.();\n }}\n className=\"px-4 py-2 text-xs rounded-xl text-white font-medium hover:text-white transition-all backdrop-blur-lg border border-white/30 hover:border-white/50 hover:scale-105 active:scale-95 shadow-lg\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.15))',\n boxShadow: '0 4px 16px rgba(255, 255, 255, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\n }}\n title=\"快进\"\n >\n ⏩ 快进\n </button>\n )}\n </div>\n )}\n\n {/* 内容区域 - 使用 flex-1 占据剩余空间 */}\n <div className=\"px-8 pb-6 flex-1 flex flex-col justify-center overflow-y-auto relative z-10\">\n {/* 说话者名称 */}\n {dialogue.speaker && (\n <div\n className=\"inline-block px-6 py-2.5 rounded-2xl mb-4 text-sm font-bold shadow-2xl self-start relative overflow-hidden transition-all hover:scale-105\"\n style={{\n color: '#ffffff',\n background: `linear-gradient(135deg, \n rgba(255, 255, 255, 0.3) 0%, \n rgba(255, 255, 255, 0.2) 100%)`,\n backdropFilter: 'blur(20px)',\n WebkitBackdropFilter: 'blur(20px)',\n boxShadow: '0 8px 32px rgba(255, 255, 255, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.4)',\n border: '1px solid rgba(255, 255, 255, 0.3)',\n }}\n >\n {/* 装饰光效 */}\n <div \n className=\"absolute inset-0 opacity-30\"\n style={{\n background: 'linear-gradient(45deg, transparent 30%, rgba(255,255,255,0.5) 50%, transparent 70%)',\n backgroundSize: '200% 200%',\n animation: 'shimmer 3s infinite',\n }}\n />\n <span className=\"relative z-10 drop-shadow-lg\">{dialogue.speaker}</span>\n </div>\n )}\n\n {/* 对话文本 */}\n <div\n className=\"text-lg leading-relaxed relative\"\n style={{ \n color: theme.textColor,\n textShadow: '0 2px 8px rgba(0, 0, 0, 0.5)',\n }}\n >\n <span className=\"inline-block\" style={{\n animation: !isComplete ? 'textFadeIn 0.3s ease-out' : 'none'\n }}>\n {displayedText}\n </span>\n {/* 打字光标 - 增强效果 */}\n {!isComplete && (\n <span \n className=\"inline-block w-1 h-6 ml-1 align-middle\"\n style={{\n background: 'linear-gradient(to bottom, rgba(255, 255, 255, 1), rgba(255, 255, 255, 0.6))',\n animation: 'cursorBlink 1s ease-in-out infinite',\n boxShadow: '0 0 12px rgba(255, 255, 255, 0.8)',\n }}\n />\n )}\n </div>\n\n {/* 点击继续提示 */}\n {isComplete && theme.showContinueHint && (\n <div className=\"flex justify-end mt-4\">\n <span \n className=\"text-sm px-4 py-2 rounded-full backdrop-blur-lg font-medium\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.25), rgba(255, 255, 255, 0.15))',\n color: 'rgba(255, 255, 255, 0.9)',\n animation: 'bounce 2s ease-in-out infinite',\n boxShadow: '0 4px 16px rgba(255, 255, 255, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\n border: '1px solid rgba(255, 255, 255, 0.3)',\n }}\n >\n {theme.continueHint}\n </span>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n\n // 使用 Portal 将对话框渲染到 body,避免父容器的 overflow:hidden 影响\n // 仅在客户端挂载后使用 Portal,避免 SSR hydration 错误\n if (!isMounted) {\n return null;\n }\n\n // 确保有一个专门的容器用于 Portal 内容\n let portalContainer = document.getElementById('dialogue-portal-root');\n if (!portalContainer) {\n portalContainer = document.createElement('div');\n portalContainer.id = 'dialogue-portal-root';\n portalContainer.style.cssText = 'position: fixed; inset: 0; pointer-events: none; z-index: 999999;';\n document.body.appendChild(portalContainer);\n }\n return createPortal(dialogueContent, portalContainer);\n};\n\nexport default DialogueBox;\n\n\n\n\n","import React, { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { DialogueHistoryItem, DialogueBoxTheme } from './types';\n\ninterface HistoryPanelProps {\n /** 历史记录列表 */\n history: DialogueHistoryItem[];\n /** 主题配置 */\n theme?: DialogueBoxTheme;\n /** 关闭面板 */\n onClose: () => void;\n /** 样式 */\n className?: string;\n}\n\n/**\n * HistoryPanel - 对话历史记录面板\n * \n * 显示玩家已经阅读过的所有对话\n */\nexport const HistoryPanel: React.FC<HistoryPanelProps> = ({\n history,\n theme,\n onClose,\n className,\n}) => {\n // 避免 SSR hydration 错误\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n // 历史面板内容\n const historyContent = (\n <div\n className={`fixed inset-0 flex flex-col ${className}`}\n style={{\n zIndex: 1,\n pointerEvents: 'auto',\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.05))',\n }}\n onClick={onClose}\n >\n {/* 背景装饰层 - 柔和的彩虹渐变 */}\n <div \n className=\"absolute inset-0 opacity-25 pointer-events-none\"\n style={{\n background: `linear-gradient(45deg, \n rgba(255, 182, 193, 0.15) 0%, \n rgba(173, 216, 230, 0.15) 25%,\n rgba(221, 160, 221, 0.15) 50%,\n rgba(255, 218, 185, 0.15) 75%,\n rgba(255, 182, 193, 0.15) 100%)`,\n backgroundSize: '400% 400%',\n animation: 'gradientShift 15s ease infinite',\n }}\n />\n\n {/* 毛玻璃效果 */}\n <div \n className=\"absolute inset-0 pointer-events-none\"\n style={{\n backdropFilter: 'blur(32px) saturate(200%)',\n WebkitBackdropFilter: 'blur(32px) saturate(200%)',\n }}\n />\n\n {/* 内容容器 */}\n <div className=\"relative z-10 flex flex-col h-full\" onClick={(e) => e.stopPropagation()}>\n {/* 标题栏 */}\n <div \n className=\"flex items-center justify-between px-8 py-6 border-b relative\"\n style={{\n borderColor: 'rgba(255, 255, 255, 0.25)',\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.15))',\n backdropFilter: 'blur(20px)',\n WebkitBackdropFilter: 'blur(20px)',\n boxShadow: '0 4px 24px rgba(255, 255, 255, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\n }}\n >\n <h2 className=\"text-2xl font-bold text-white flex items-center gap-3\">\n <span className=\"text-3xl\">📜</span>\n <span style={{ textShadow: '0 2px 12px rgba(255, 255, 255, 0.3)' }}>对话历史</span>\n </h2>\n <button\n onClick={onClose}\n className=\"p-3 hover:bg-white/20 rounded-2xl transition-all text-white hover:text-white hover:scale-110 active:scale-95\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.15))',\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n boxShadow: '0 4px 16px rgba(255, 255, 255, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\n border: '1px solid rgba(255, 255, 255, 0.25)',\n }}\n aria-label=\"关闭\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* 历史记录列表 */}\n <div className=\"flex-1 overflow-y-auto p-6 space-y-4\">\n {history.length === 0 ? (\n <div className=\"text-center text-white/70 py-20 text-lg font-medium\" style={{ textShadow: '0 2px 8px rgba(0, 0, 0, 0.3)' }}>\n 暂无对话历史\n </div>\n ) : (\n history.map((item, index) => (\n <div\n key={`${item.nodeIndex}-${item.dialogueIndex}-${index}`}\n className=\"p-6 rounded-2xl transition-all hover:scale-[1.01] relative overflow-hidden cursor-pointer\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0.1))',\n backdropFilter: 'blur(16px)',\n WebkitBackdropFilter: 'blur(16px)',\n border: '1px solid rgba(255, 255, 255, 0.2)',\n boxShadow: '0 8px 24px rgba(255, 255, 255, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.25)',\n }}\n >\n {/* 装饰光效 */}\n <div \n className=\"absolute top-0 left-0 right-0 h-0.5\"\n style={{\n background: 'linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.5), transparent)',\n }}\n />\n \n {/* 说话者 */}\n {item.speaker && (\n <div\n className=\"inline-block px-5 py-2 rounded-xl mb-3 text-sm font-bold shadow-lg relative overflow-hidden\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.2))',\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n color: '#ffffff',\n boxShadow: '0 4px 12px rgba(255, 255, 255, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\n border: '1px solid rgba(255, 255, 255, 0.25)',\n }}\n >\n {/* 装饰光效 */}\n <div \n className=\"absolute inset-0 opacity-30\"\n style={{\n background: 'linear-gradient(45deg, transparent 30%, rgba(255, 255, 255, 0.4) 50%, transparent 70%)',\n backgroundSize: '200% 200%',\n animation: 'shimmer 3s infinite',\n }}\n />\n <span className=\"relative z-10 drop-shadow-lg\">{item.speaker}</span>\n </div>\n )}\n \n {/* 对话内容 */}\n <p\n className=\"text-base leading-relaxed\"\n style={{ \n color: '#ffffff',\n textShadow: '0 2px 8px rgba(0, 0, 0, 0.3)',\n }}\n >\n {item.text}\n </p>\n </div>\n ))\n )}\n </div>\n\n {/* 底部提示 */}\n <div \n className=\"px-8 py-4 border-t text-center\"\n style={{\n borderColor: 'rgba(255, 255, 255, 0.2)',\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0.1))',\n backdropFilter: 'blur(20px)',\n WebkitBackdropFilter: 'blur(20px)',\n boxShadow: 'inset 0 1px 0 rgba(255, 255, 255, 0.2)',\n }}\n >\n <span \n className=\"text-sm px-5 py-2.5 rounded-full inline-block font-medium\"\n style={{\n color: 'rgba(255, 255, 255, 0.9)',\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.15))',\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n boxShadow: '0 4px 16px rgba(255, 255, 255, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\n border: '1px solid rgba(255, 255, 255, 0.25)',\n textShadow: '0 2px 8px rgba(0, 0, 0, 0.3)',\n }}\n >\n 点击背景关闭\n </span>\n </div>\n </div>\n </div>\n );\n\n // 使用 Portal 将历史面板渲染到 body,确保显示在最上层\n // 仅在客户端挂载后使用 Portal,避免 SSR hydration 错误\n if (!isMounted) {\n return null;\n }\n\n // 确保有一个专门的容器用于 Portal 内容\n let portalContainer = document.getElementById('history-portal-root');\n if (!portalContainer) {\n portalContainer = document.createElement('div');\n portalContainer.id = 'history-portal-root';\n portalContainer.style.cssText = 'position: fixed; inset: 0; pointer-events: none; z-index: 999999;';\n document.body.appendChild(portalContainer);\n }\n return createPortal(historyContent, portalContainer);\n};\n\nexport default HistoryPanel;\n\n\n\n\n","import React, { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport interface LoadingScreenProps {\n /** 是否显示加载状态 */\n isLoading?: boolean;\n /** 加载文本 */\n loadingText?: string;\n /** 自定义类名 */\n className?: string;\n}\n\n/**\n * LoadingScreen - 加载界面组件\n * \n * 用于 MMD Visual Novel 的加载状态显示\n */\nexport const LoadingScreen: React.FC<LoadingScreenProps> = ({\n isLoading = true,\n loadingText = '正在准备场景中...',\n className = '',\n}) => {\n // 使用 state 确保 SSR 和客户端初始渲染一致\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n // 调试日志\n console.log('[LoadingScreen] Render state:', {\n isLoading,\n isMounted,\n });\n\n // 只在客户端挂载后才渲染\n if (!isMounted) {\n return null;\n }\n\n // 如果不显示,返回 null\n if (!isLoading) {\n console.log('[LoadingScreen] Not showing, returning null');\n return null;\n }\n\n const content = (\n <div\n className={`fixed inset-0 w-screen h-screen flex items-center justify-center ${className}`}\n style={{\n zIndex: 999998,\n pointerEvents: 'auto',\n backgroundColor: 'rgba(0, 0, 0, 0.4)',\n margin: 0,\n padding: 0,\n }}\n >\n {/* 白色毛玻璃层 */}\n <div\n className=\"absolute inset-0 w-full h-full pointer-events-none\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0.1))',\n backdropFilter: 'blur(32px) saturate(200%)',\n WebkitBackdropFilter: 'blur(32px) saturate(200%)',\n }}\n >\n {/* 背景装饰层 - 柔和的彩虹渐变 */}\n <div\n className=\"flex items-center justify-center flex-col inset-0 w-full h-full pointer-events-none\"\n style={{\n background: `linear-gradient(45deg, \n rgba(255, 182, 193, 0.2) 0%, \n rgba(173, 216, 230, 0.2) 25%,\n rgba(221, 160, 221, 0.2) 50%,\n rgba(255, 218, 185, 0.2) 75%,\n rgba(255, 182, 193, 0.2) 100%)`,\n backgroundSize: '400% 400%',\n animation: 'gradientShift 15s ease infinite',\n }}\n >\n <div\n className=\"text-lg font-medium text-white text-center px-6 py-3 rounded-2xl\">\n {loadingText}\n </div>\n </div>\n </div>\n </div>\n );\n\n // 使用 Portal 渲染到 body\n let portalContainer = document.getElementById('loading-screen-portal-root');\n if (!portalContainer) {\n portalContainer = document.createElement('div');\n portalContainer.id = 'loading-screen-portal-root';\n document.body.appendChild(portalContainer);\n }\n\n // 更新容器样式\n portalContainer.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n width: 100vw;\n height: 100vh;\n margin: 0;\n padding: 0;\n overflow: hidden;\n z-index: 999998;\n pointer-events: none;\n `.replace(/\\s+/g, ' ').trim();\n\n return createPortal(content, portalContainer);\n};\n\nLoadingScreen.displayName = 'LoadingScreen';\n\nexport default LoadingScreen;\n\n\n\n\n","import React, { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport interface StartScreenProps {\n /** 是否显示开始界面 */\n showStartScreen?: boolean;\n /** 脚本名称 */\n scriptName?: string;\n /** 开始按钮文本 */\n startText?: string;\n /** 点击开始回调 */\n onStart?: () => void;\n /** 自定义类名 */\n className?: string;\n}\n\n/**\n * StartScreen - 开始界面组件\n * \n * 用于 MMD Visual Novel 的开始界面显示\n */\nexport const StartScreen: React.FC<StartScreenProps> = ({\n showStartScreen = false,\n scriptName = '',\n startText = '点击开始',\n onStart,\n className = '',\n}) => {\n // 使用 state 确保 SSR 和客户端初始渲染一致\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n // 调试日志\n console.log('[StartScreen] Render state:', {\n showStartScreen,\n scriptName,\n isMounted,\n });\n\n // 只在客户端挂载后才渲染\n if (!isMounted) {\n return null;\n }\n\n // 如果不显示,返回 null\n if (!showStartScreen) {\n console.log('[StartScreen] Not showing, returning null');\n return null;\n }\n\n const content = (\n <div\n className={`fixed inset-0 w-screen h-screen flex items-center justify-center cursor-pointer ${className}`}\n style={{\n zIndex: 999999,\n pointerEvents: 'auto',\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n margin: 0,\n padding: 0,\n }}\n onClick={onStart}\n >\n {/* 白色毛玻璃层 */}\n <div\n className=\"absolute inset-0 w-full h-full pointer-events-none\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.15))',\n backdropFilter: 'blur(40px) saturate(200%)',\n WebkitBackdropFilter: 'blur(40px) saturate(200%)',\n }}\n\n >\n {/* 背景装饰层 - 柔和的彩虹渐变 */}\n <div\n className=\"flex items-center justify-center flex-col inset-0 w-full h-full pointer-events-none\"\n style={{\n background: `linear-gradient(45deg, \n rgba(255, 182, 193, 0.25) 0%, \n rgba(173, 216, 230, 0.25) 25%,\n rgba(221, 160, 221, 0.25) 50%,\n rgba(255, 218, 185, 0.25) 75%,\n rgba(255, 182, 193, 0.25) 100%)`,\n backgroundSize: '400% 400%',\n animation: 'gradientShift 15s ease infinite',\n }}\n >\n {/* 内容容器 */}\n <div\n className=\"relative z-10 text-center px-16 py-14 rounded-3xl max-w-2xl mx-auto transform transition-all hover:scale-105\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.15))',\n backdropFilter: 'blur(24px)',\n WebkitBackdropFilter: 'blur(24px)',\n border: '2px solid rgba(255, 255, 255, 0.3)',\n boxShadow: `\n 0 12px 48px rgba(255, 255, 255, 0.15),\n 0 4px 16px rgba(255, 255, 255, 0.1),\n inset 0 1px 0 rgba(255, 255, 255, 0.4)\n `,\n }}\n >\n {/* 顶部装饰光效 */}\n <div\n className=\"absolute top-0 left-0 right-0 h-1 margin-auto\"\n style={{\n background: 'linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.6), transparent)',\n }}\n />\n\n {/* 标题 */}\n <h1\n className=\"text-5xl font-bold text-white mb-8 relative\"\n style={{\n textShadow: '0 4px 16px rgba(255, 255, 255, 0.3), 0 2px 8px rgba(0, 0, 0, 0.5)',\n }}\n >\n {scriptName}\n {/* 标题下划线装饰 */}\n <div\n className=\"absolute -bottom-3 left-1/2 transform -translate-x-1/2 h-1 rounded-full\"\n style={{\n width: '60%',\n background: 'linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.5), transparent)',\n }}\n />\n </h1>\n\n {/* 开始按钮 */}\n <div\n className=\"inline-block px-10 py-4 rounded-2xl font-bold text-xl text-white transition-all hover:scale-110 active:scale-95\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.35), rgba(255, 255, 255, 0.25))',\n backdropFilter: 'blur(16px)',\n WebkitBackdropFilter: 'blur(16px)',\n border: '2px solid rgba(255, 255, 255, 0.4)',\n boxShadow: `\n 0 8px 32px rgba(255, 255, 255, 0.2),\n inset 0 1px 0 rgba(255, 255, 255, 0.5)\n `,\n textShadow: '0 2px 8px rgba(0, 0, 0, 0.3)',\n animation: 'pulse 2s ease-in-out infinite',\n }}\n >\n <span className=\"relative z-10\">{startText}</span>\n </div>\n\n {/* 底部装饰光效 */}\n <div\n className=\"absolute bottom-0 left-0 right-0 h-px\"\n style={{\n background: 'linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent)',\n }}\n />\n </div>\n </div>\n\n </div>\n\n\n\n </div>\n );\n\n // 使用 Portal 渲染到 body\n let portalContainer = document.getElementById('start-screen-portal-root');\n if (!portalContainer) {\n portalContainer = document.createElement('div');\n portalContainer.id = 'start-screen-portal-root';\n document.body.appendChild(portalContainer);\n }\n\n // 更新容器样式\n portalContainer.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n width: 100vw;\n height: 100vh;\n margin: 0;\n padding: 0;\n overflow: hidden;\n z-index: 999999;\n pointer-events: none;\n `.replace(/\\s+/g, ' ').trim();\n\n return createPortal(content, portalContainer);\n};\n\nStartScreen.displayName = 'StartScreen';\n\nexport default StartScreen;\n\n\n\n\n","import React from 'react';\nimport { LoadingScreen } from './LoadingScreen';\nimport { StartScreen } from './StartScreen';\n\n// 注入全局样式(如果还没有)\nif (typeof document !== 'undefined' && !document.getElementById('loading-overlay-animations')) {\n const style = document.createElement('style');\n style.id = 'loading-overlay-animations';\n style.textContent = `\n @keyframes gradientShift {\n 0%, 100% { background-position: 0% 50%; }\n 50% { background-position: 100% 50%; }\n }\n \n @keyframes pulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.9; transform: scale(1.05); }\n }\n `;\n document.head.appendChild(style);\n}\n\nexport interface LoadingOverlayProps {\n /** 是否显示加载状态 */\n isLoading?: boolean;\n /** 是否显示开始界面 */\n showStartScreen?: boolean;\n /** 脚本名称(用于开始界面) */\n scriptName?: string;\n /** 加载文本 */\n loadingText?: string;\n /** 开始按钮文本 */\n startText?: string;\n /** 点击开始回调 */\n onStart?: () => void;\n /** 自定义类名 */\n className?: string;\n}\n\n/**\n * LoadingOverlay - 加载遮罩和开始界面组件容器\n * \n * 用于 MMD Visual Novel 的加载状态和开始界面显示\n * 组合了 LoadingScreen 和 StartScreen 两个独立组件\n */\nexport const LoadingOverlay: React.FC<LoadingOverlayProps> = ({\n isLoading = true,\n showStartScreen = false,\n scriptName = '',\n loadingText = '正在准备场景中...',\n startText = '点击开始',\n onStart,\n className = '',\n}) => {\n return (\n <>\n <LoadingScreen\n isLoading={isLoading}\n loadingText={loadingText}\n className={className}\n />\n <StartScreen\n showStartScreen={showStartScreen}\n scriptName={scriptName}\n startText={startText}\n onStart={onStart}\n className={className}\n />\n </>\n );\n};\n\nLoadingOverlay.displayName = 'LoadingOverlay';\n\nexport default LoadingOverlay;\n\n\n\n\n","import React from 'react';\nimport { createPortal } from 'react-dom';\n\nexport interface SkipConfirmDialogProps {\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport const SkipConfirmDialog: React.FC<SkipConfirmDialogProps> = ({\n onConfirm,\n onCancel,\n}) => {\n const [isMounted, setIsMounted] = React.useState(false);\n\n React.useEffect(() => {\n setIsMounted(true);\n }, []);\n\n if (!isMounted) return null;\n\n const content = (\n <div \n className=\"fixed inset-0 flex items-center justify-center bg-black/40 backdrop-blur-sm pointer-events-auto\"\n style={{ zIndex: 999999 }}\n >\n <div \n className=\"p-8 rounded-3xl border border-white/30 shadow-2xl max-w-sm w-full mx-4 overflow-hidden relative\"\n style={{\n background: `linear-gradient(135deg, \n rgba(255, 255, 255, 0.2) 0%, \n rgba(255, 255, 255, 0.1) 100%)`,\n backdropFilter: 'blur(32px) saturate(200%)',\n WebkitBackdropFilter: 'blur(32px) saturate(200%)',\n }}\n >\n <h3 className=\"text-xl font-bold text-white mb-4 drop-shadow-md\">动画尚未播放完成</h3>\n <p className=\"text-white/90 mb-8 leading-relaxed drop-shadow-sm\">\n 当前场景的动画还没有完整播放一遍,是否直接跳转到下一个场景?\n </p>\n <div className=\"flex justify-end gap-4\">\n <button\n onClick={onCancel}\n className=\"px-6 py-2.5 rounded-2xl text-white/80 font-medium hover:text-white hover:bg-white/10 transition-all border border-white/10 hover:border-white/30\"\n >\n 取消\n </button>\n <button\n onClick={onConfirm}\n className=\"px-6 py-2.5 rounded-2xl bg-white/20 hover:bg-white/30 text-white font-bold transition-all border border-white/40 shadow-lg hover:scale-105 active:scale-95\"\n >\n 直接跳转\n </button>\n </div>\n </div>\n </div>\n );\n\n let portalContainer = document.getElementById('dialogue-portal-root');\n if (!portalContainer) {\n portalContainer = document.createElement('div');\n portalContainer.id = 'dialogue-portal-root';\n portalContainer.style.cssText = 'position: fixed; inset: 0; pointer-events: none; z-index: 999999;';\n document.body.appendChild(portalContainer);\n }\n\n return createPortal(content, portalContainer);\n};\n\nexport default SkipConfirmDialog;\n\n","import React from 'react';\nimport { createPortal } from 'react-dom';\nimport { DialogueChoice, DialogueBoxTheme } from './types';\n\nexport interface ChoiceMenuProps {\n choices: DialogueChoice[];\n onSelect: (choice: DialogueChoice) => void;\n theme?: DialogueBoxTheme;\n}\n\nexport const ChoiceMenu: React.FC<ChoiceMenuProps> = ({\n choices,\n onSelect,\n theme,\n}) => {\n const [isMounted, setIsMounted] = React.useState(false);\n\n React.useEffect(() => {\n setIsMounted(true);\n }, []);\n\n if (!isMounted) return null;\n\n const content = (\n <div \n className=\"fixed inset-0 flex flex-col items-center justify-center bg-black/20 backdrop-blur-sm pointer-events-auto transition-all animate-in fade-in duration-500\"\n style={{ zIndex: 1000000 }}\n >\n <div className=\"flex flex-col gap-4 w-full max-w-md px-6\">\n {choices.map((choice, index) => (\n <button\n key={index}\n onClick={() => onSelect(choice)}\n className=\"w-full py-4 px-8 rounded-2xl text-white font-bold text-lg transition-all border border-white/20 shadow-xl hover:scale-105 active:scale-95 group relative overflow-hidden\"\n style={{\n background: `linear-gradient(135deg, \n rgba(255, 255, 255, 0.2) 0%, \n rgba(255, 255, 255, 0.1) 100%)`,\n backdropFilter: 'blur(32px) saturate(200%)',\n WebkitBackdropFilter: 'blur(32px) saturate(200%)',\n }}\n >\n {/* 悬停光效 */}\n <div className=\"absolute inset-0 bg-white/10 opacity-0 group-hover:opacity-100 transition-opacity\" />\n <div className=\"absolute inset-0 bg-gradient-to-r from-transparent via-white/5 to-transparent -translate-x-full group-hover:translate-x-full transition-transform duration-1000 ease-in-out\" />\n \n <span className=\"relative z-10 drop-shadow-md\">{choice.text}</span>\n </button>\n ))}\n </div>\n </div>\n );\n\n let portalContainer = document.getElementById('dialogue-portal-root');\n if (!portalContainer) {\n portalContainer = document.createElement('div');\n portalContainer.id = 'dialogue-portal-root';\n portalContainer.style.cssText = 'position: fixed; inset: 0; pointer-events: none; z-index: 999999;';\n document.body.appendChild(portalContainer);\n }\n\n return createPortal(content, portalContainer);\n};\n\nexport default ChoiceMenu;\n\n","import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n forwardRef,\n useImperativeHandle,\n} from 'react';\nimport { MMDPlayerBase } from '../components/MMDPlayerBase';\nimport { MMDPlayerBaseRef } from '../types';\nimport { DialogueBox } from './DialogueBox';\nimport { HistoryPanel } from './HistoryPanel';\nimport { LoadingOverlay } from './LoadingOverlay';\nimport { SkipConfirmDialog } from './SkipConfirmDialog';\nimport { ChoiceMenu } from './ChoiceMenu';\nimport {\n MMDVisualNovelProps,\n MMDVisualNovelRef,\n VisualNovelNode,\n DialogueLine,\n DialogueHistoryItem,\n VisualEffect,\n} from './types';\n\n/**\n * MMDVisualNovel - Galgame 风格视觉小说组件\n * \n * 核心功能:\n * - 将 MMDPlaylist 封装为 Galgame 风格\n * - 每个节点包含:模型、动作、对话数组\n * - 用户阅读完对话后自动切换节点\n * - 打字机效果显示文本\n * - 支持自动播放、快进、历史记录\n */\nexport const MMDVisualNovel = forwardRef<MMDVisualNovelRef, MMDVisualNovelProps>(\n (\n {\n script,\n stage,\n mobileOptimization,\n dialogueTheme,\n autoStart = false,\n initialNodeIndex = 0,\n initialDialogueIndex = 0,\n onNodeChange,\n onDialogueChange,\n onScriptComplete,\n onError,\n showDebugInfo = false,\n showSkipButton = true,\n showAutoButton = true,\n showHistoryButton = true,\n className,\n style,\n },\n ref\n ) => {\n const { nodes, loop = false } = script;\n\n // 状态管理\n const [currentNodeIndex, setCurrentNodeIndex] = useState(initialNodeIndex);\n const [currentDialogueIndex, setCurrentDialogueIndex] = useState(initialDialogueIndex);\n const [isLoading, setIsLoading] = useState(true);\n const [isAnimationPlaying, setIsAnimationPlaying] = useState(false); // 新增:追踪动画是否已开始播放\n const [isTransitioning, setIsTransitioning] = useState(false);\n const [isAutoMode, setIsAutoMode] = useState(false);\n const [isTyping, setIsTyping] = useState(false);\n const [showHistory, setShowHistory] = useState(false);\n const [history, setHistory] = useState<DialogueHistoryItem[]>([]);\n const [isStarted, setIsStarted] = useState(autoStart);\n const [isVmdFinished, setIsVmdFinished] = useState(false);\n const [pendingNodeIndex, setPendingNodeIndex] = useState<number | null>(null);\n const [showChoices, setShowChoices] = useState(false);\n const [isCameraManual, setIsCameraManual] = useState(false);\n const [variables, setVariables] = useState<Record<string, string | number | boolean>>({});\n const [activeEffect, setActiveEffect] = useState<VisualEffect | null>(null);\n\n // Refs\n const playerRef = useRef<MMDPlayerBaseRef>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const autoTimerRef = useRef<NodeJS.Timeout | null>(null);\n const typingCompleteRef = useRef(false);\n const isStartedRef = useRef(autoStart); // 用 ref 跟踪 isStarted 的当前值\n const lastAnimationTimeRef = useRef(0);\n const isVmdFinishedRef = useRef(false);\n const effectTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n // 获取当前节点和对话\n const currentNode = nodes[currentNodeIndex];\n const currentDialogue = currentNode?.dialogues[currentDialogueIndex] || null;\n\n // 添加对话到历史记录\n const addToHistory = useCallback((dialogue: DialogueLine, nodeIndex: number, dialogueIndex: number) => {\n setHistory((prev) => [\n ...prev,\n {\n nodeIndex,\n dialogueIndex,\n speaker: dialogue.speaker,\n text: dialogue.text,\n timestamp: Date.now(),\n },\n ]);\n }, []);\n\n // 触发特效\n const triggerEffect = useCallback((effect?: VisualEffect) => {\n if (!effect) return;\n \n // 清除旧的特效定时器\n if (effectTimerRef.current) {\n clearTimeout(effectTimerRef.current);\n }\n\n setActiveEffect(effect);\n \n // 自动清理\n effectTimerRef.current = setTimeout(() => {\n setActiveEffect(null);\n effectTimerRef.current = null;\n }, effect.duration || 1000);\n }, []);\n\n // 跳转到指定节点\n const goToNode = useCallback(\n (nodeIndex: number, force: boolean = false) => {\n if (nodeIndex < 0 || nodeIndex >= nodes.length) return;\n if (isTransitioning) return;\n\n const node = nodes[nodeIndex];\n if (!node) return;\n\n // 如果当前节点有 VMD 动画且未播放完成,且不是强制跳转,则弹出确认框\n const currentResources = nodes[currentNodeIndex]?.resources;\n if (!force && currentResources?.motionPath && !isVmdFinishedRef.current) {\n console.log('[MMDVisualNovel] VMD not finished, showing confirmation');\n setPendingNodeIndex(nodeIndex);\n return;\n }\n\n console.log(`[MMDVisualNovel] Transitioning to node ${nodeIndex}`);\n\n // 🔧 立即设置加载状态,确保遮罩覆盖整个切换过程\n setIsTransitioning(true);\n setIsLoading(true);\n setIsAnimationPlaying(false); // 重置动画播放状态\n setIsVmdFinished(false); // 重置 VMD 完成状态\n isVmdFinishedRef.current = false; // 同步重置 ref\n setPendingNodeIndex(null); // 清除挂起的跳转\n setShowChoices(false); // 隐藏选项菜单\n lastAnimationTimeRef.current = 0; // 重置动画时间记录\n\n // 给物理引擎清理时间后再更新节点\n setTimeout(() => {\n // 更新节点\n setCurrentNodeIndex(nodeIndex);\n setCurrentDialogueIndex(0);\n typingCompleteRef.current = false;\n\n // 添加第一条对话到历史\n if (node.dialogues.length > 0 && node?.dialogues[0] !== undefined) {\n addToHistory(node.dialogues[0], nodeIndex, 0);\n }\n\n onNodeChange?.(node, nodeIndex);\n if (node.dialogues.length > 0 && node?.dialogues[0] !== undefined) {\n onDialogueChange?.(node.dialogues[0], 0, nodeIndex);\n }\n\n // 🔧 结束过渡状态,但保持加载状态直到新模型完全加载\n // 注意:isLoading 和 isAnimationPlaying 会在 MMDPlayerBase 的回调中更新\n setTimeout(() => {\n setIsTransitioning(false);\n console.log(`[MMDVisualNovel] Transition to node ${nodeIndex} completed, waiting for model load`);\n }, 100);\n }, 300);\n },\n [nodes, isTransitioning, addToHistory, onNodeChange, onDialogueChange, currentNodeIndex]\n );\n\n // 判定并跳转到下一个节点\n const triggerNodeTransition = useCallback(() => {\n if (!currentNode) return;\n \n let nextNodeIndex = currentNodeIndex + 1;\n\n // 如果存在分支判定逻辑\n if (currentNode.nextCondition) {\n const { key, map, defaultIndex } = currentNode.nextCondition;\n const val = variables[key];\n if (val !== undefined && map[val as string | number] !== undefined) {\n nextNodeIndex = map[val as string | number]!;\n console.log(`[MMDVisualNovel] Branching: ${key}=${val} -> node ${nextNodeIndex}`);\n } else {\n nextNodeIndex = defaultIndex;\n }\n }\n\n if (nextNodeIndex < nodes.length && nextNodeIndex >= 0) {\n goToNode(nextNodeIndex);\n } else if (loop) {\n goToNode(0);\n } else {\n // 剧本结束\n onScriptComplete?.();\n }\n }, [currentNode, currentNodeIndex, nodes.length, loop, variables, goToNode, onScriptComplete]);\n\n // 切换到下一条对话\n const goToNextDialogue = useCallback(() => {\n if (!currentNode) return;\n\n // 如果当前对话行自带分支,且还未显示分支,则先显示分支\n if (currentDialogue?.choices && currentDialogue.choices.length > 0 && !showChoices) {\n setShowChoices(true);\n return;\n }\n\n // 清除自动播放定时器\n if (autoTimerRef.current) {\n clearTimeout(autoTimerRef.current);\n autoTimerRef.current = null;\n }\n\n const nextDialogueIndex = currentDialogueIndex + 1;\n\n if (nextDialogueIndex < currentNode.dialogues.length && currentNode?.dialogues[nextDialogueIndex] !== undefined) {\n // 还有更多对话\n const nextDialogue = currentNode.dialogues[nextDialogueIndex];\n setCurrentDialogueIndex(nextDialogueIndex);\n addToHistory(nextDialogue, currentNodeIndex, nextDialogueIndex);\n onDialogueChange?.(nextDialogue, nextDialogueIndex, currentNodeIndex);\n typingCompleteRef.current = false;\n } else if (currentNode.choices && currentNode.choices.length > 0) {\n // 当前节点末尾有分支选项(兼容旧版)\n setShowChoices(true);\n } else {\n // 无分支,自动切换到下一个节点\n triggerNodeTransition();\n }\n }, [currentNode, currentDialogue, currentDialogueIndex, currentNodeIndex, nodes.length, loop, addToHistory, onDialogueChange, onScriptComplete, showChoices, variables, goToNode, triggerNodeTransition]);\n\n // 跳转到指定对话\n const goToDialogue = useCallback(\n (dialogueIndex: number) => {\n if (!currentNode) return;\n const dialogue = currentNode.dialogues[dialogueIndex];\n\n if (dialogueIndex < 0 || dialogueIndex >= currentNode.dialogues.length || dialogue === undefined) return;\n setCurrentDialogueIndex(dialogueIndex);\n addToHistory(dialogue, currentNodeIndex, dialogueIndex);\n onDialogueChange?.(dialogue, dialogueIndex, currentNodeIndex);\n typingCompleteRef.current = false;\n },\n [currentNode, currentNodeIndex, addToHistory, onDialogueChange]\n );\n\n // 处理点击对话框\n const handleDialogueClick = useCallback(() => {\n if (!typingCompleteRef.current) {\n // 还在打字中,跳过打字动画\n typingCompleteRef.current = true;\n return;\n }\n\n // 打字完成,切换到下一条对话\n goToNextDialogue();\n }, [goToNextDialogue]);\n\n // 处理打字完成\n const handleTypingComplete = useCallback(() => {\n typingCompleteRef.current = true;\n setIsTyping(false);\n\n // 如果是自动模式或不需要等待点击\n if (isAutoMode || currentDialogue?.waitForClick === false) {\n const delay = currentDialogue?.autoDelay ?? 2000;\n autoTimerRef.current = setTimeout(() => {\n goToNextDialogue();\n }, delay);\n }\n }, [isAutoMode, currentDialogue, goToNextDialogue]);\n\n // 监听打字状态\n useEffect(() => {\n if (currentDialogue) {\n setIsTyping(true);\n typingCompleteRef.current = false;\n\n // 计算打字完成时间\n const text = currentDialogue.text;\n const speed = currentDialogue.typeSpeed ?? 50;\n const typingDuration = text.length * speed;\n\n const timer = setTimeout(() => {\n handleTypingComplete();\n }, typingDuration);\n\n return () => clearTimeout(timer);\n }\n // 如果没有对话,返回空的清理函数\n return undefined;\n }, [currentDialogue, handleTypingComplete]);\n\n useEffect(() => {\n if (currentDialogue?.effect) {\n triggerEffect(currentDialogue.effect);\n }\n }, [currentNodeIndex, currentDialogueIndex, triggerEffect]);\n\n // 切换自动模式\n const toggleAutoMode = useCallback(() => {\n setIsAutoMode((prev) => !prev);\n }, []);\n\n // 快进 - 跳到下一个节点\n const handleSkip = useCallback(() => {\n if (currentNode?.choices && currentNode.choices.length > 0) {\n setShowChoices(true);\n return;\n }\n \n const nextNodeIndex = currentNodeIndex + 1;\n if (nextNodeIndex < nodes.length) {\n goToNode(nextNodeIndex);\n } else if (loop) {\n goToNode(0);\n } else {\n onScriptComplete?.();\n }\n }, [currentNodeIndex, nodes.length, loop, goToNode, onScriptComplete]);\n\n // 开始游戏\n const handleStart = useCallback(() => {\n setIsStarted(true);\n isStartedRef.current = true; // 同步更新 ref\n if (currentNode && currentNode.dialogues.length > 0 && currentNode?.dialogues[0] !== undefined) {\n addToHistory(currentNode?.dialogues[0], currentNodeIndex, 0);\n }\n // 启动动画播放\n setTimeout(() => {\n playerRef.current?.play();\n }, 100);\n }, [currentNode, currentNodeIndex, addToHistory]);\n\n // 暴露给父组件的方法\n useImperativeHandle(\n ref,\n () => ({\n goToNode,\n goToDialogue,\n getCurrentNodeIndex: () => currentNodeIndex,\n getCurrentDialogueIndex: () => currentDialogueIndex,\n getHistory: () => history,\n getVariables: () => variables,\n setVariable: (key: string, value: string | number | boolean) => {\n setVariables(prev => ({ ...prev, [key]: value }));\n },\n setAutoMode: setIsAutoMode,\n skipTyping: () => {\n typingCompleteRef.current = true;\n },\n triggerEffect,\n }),\n [goToNode, goToDialogue, currentNodeIndex, currentDialogueIndex, history, triggerEffect]\n );\n\n // 自动开始时添加第一条对话到历史\n useEffect(() => {\n if (autoStart && currentNode && currentNode.dialogues.length > 0 && history.length === 0 && currentNode?.dialogues[0] !== undefined) {\n addToHistory(currentNode?.dialogues[0], currentNodeIndex, 0);\n }\n }, [autoStart, currentNode, currentNodeIndex, history.length, addToHistory]);\n\n // 清理定时器\n useEffect(() => {\n return () => {\n if (autoTimerRef.current) {\n clearTimeout(autoTimerRef.current);\n }\n if (effectTimerRef.current) {\n clearTimeout(effectTimerRef.current);\n }\n };\n }, []);\n\n // 空剧本检查\n if (!currentNode) {\n return (\n <div className=\"flex h-full w-full items-center justify-center bg-black text-white\">\n 剧本为空\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={`relative bg-black ${className}`}\n style={{ width: '100%', height: '100%', overflow: 'hidden', ...style }}\n >\n {/* MMD 播放器层 - 覆盖整个屏幕,明确在最底层 */}\n <div \n className=\"absolute inset-0 w-full h-full\"\n style={{ \n zIndex: 0,\n // 在加载期间隐藏,避免看到模型加载过程\n opacity: (isLoading || isTransitioning || !isAnimationPlaying) ? 0 : 1,\n transition: 'opacity 0.3s ease-in-out'\n }}\n >\n {!isTransitioning && (\n <MMDPlayerBase\n key={currentNode.id}\n ref={playerRef}\n resources={currentNode.resources}\n stage={{ ...stage, ...currentNode.stage }}\n autoPlay={isStarted}\n loop={currentNode.loopAnimation === true}\n mobileOptimization={mobileOptimization}\n onLoad={() => {\n console.log('[MMDVisualNovel] MMDPlayerBase onLoad called');\n setIsLoading(false);\n // 如果已经开始游戏,启动动画播放(使用 ref 获取最新值)\n if (isStartedRef.current) {\n console.log('[MMDVisualNovel] Game already started, triggering play');\n setTimeout(() => {\n playerRef.current?.play();\n }, 100);\n }\n }}\n onPlay={() => {\n // 动画开始播放时才设置为 true\n console.log('[MMDVisualNovel] MMDPlayerBase onPlay called');\n setIsAnimationPlaying(true);\n }}\n onTimeUpdate={(time) => {\n const duration = playerRef.current?.getDuration() || 0;\n \n // 判定动画完成的条件:\n // 1. 播放进度超过 98%\n // 2. 或者检测到时间回跳(循环发生)\n const isNearEnd = duration > 0 && time > duration * 0.98;\n const isLooped = time < lastAnimationTimeRef.current && lastAnimationTimeRef.current > 0;\n\n if (isNearEnd || isLooped) {\n if (!isVmdFinishedRef.current) {\n console.log('[MMDVisualNovel] VMD finished/looped, marking as finished');\n isVmdFinishedRef.current = true;\n setIsVmdFinished(true);\n }\n }\n lastAnimationTimeRef.current = time;\n }}\n onEnded={() => {\n console.log('[MMDVisualNovel] VMD ended, marking as finished');\n isVmdFinishedRef.current = true;\n setIsVmdFinished(true);\n }}\n onCameraChange={(isManual) => {\n setIsCameraManual(isManual);\n }}\n onError={onError}\n />\n )}\n </div>\n\n {/* 特效渲染层 */}\n {activeEffect && (\n <div \n className=\"pointer-events-none absolute inset-0 flex items-center justify-center\"\n style={{ zIndex: 999 }}\n >\n {activeEffect.type === 'flash' && (\n <div \n className=\"h-full w-full\"\n style={{ \n backgroundColor: activeEffect.color || 'white',\n animation: `flash-anim ${activeEffect.duration || 500}ms ease-out forwards`\n }} \n />\n )}\n\n {activeEffect.type === 'gif' && activeEffect.url && (\n <img \n src={activeEffect.url} \n alt=\"effect\"\n className={activeEffect.position === 'full' ? 'h-full w-full object-cover' : 'max-h-full max-w-full'}\n />\n )}\n \n <style>{`\n @keyframes flash-anim {\n 0% { opacity: 0; }\n 25% { opacity: 1; }\n 100% { opacity: 0; }\n }\n `}</style>\n </div>\n )}\n\n {/* 加载遮罩和开始界面 */}\n <LoadingOverlay\n isLoading={(() => {\n const shouldShowLoading = (isLoading || isTransitioning || !isAnimationPlaying) && isStarted;\n console.log('[MMDVisualNovel] LoadingOverlay conditions:', {\n isLoading,\n isTransitioning,\n isAnimationPlaying,\n isStarted,\n shouldShowLoading\n });\n return shouldShowLoading;\n })()}\n showStartScreen={!isStarted}\n scriptName={script.name}\n loadingText=\"正在准备场景中...\"\n startText=\"点击开始\"\n onStart={handleStart}\n />\n\n {/* 对话框 - 仅在动画开始播放后显示 */}\n {(() => {\n const shouldShow = isStarted && isAnimationPlaying && currentDialogue && !showHistory && !showChoices;\n console.log('[MMDVisualNovel] DialogueBox render condition:', {\n isStarted,\n isAnimationPlaying,\n hasDialogue: !!currentDialogue,\n showHistory,\n showChoices,\n shouldShow,\n dialogue: currentDialogue\n });\n \n return shouldShow ? (\n <DialogueBox\n dialogue={currentDialogue}\n theme={dialogueTheme}\n isTyping={isTyping}\n isAutoMode={isAutoMode}\n onClick={handleDialogueClick}\n onSkipTyping={() => {\n typingCompleteRef.current = true;\n }}\n onToggleAuto={toggleAutoMode}\n onOpenHistory={() => setShowHistory(true)}\n onSkip={handleSkip}\n onResetCamera={() => {\n playerRef.current?.resetCamera();\n setIsCameraManual(false);\n }}\n isCameraManual={isCameraManual}\n showControls={true}\n showSkipButton={showSkipButton}\n showAutoButton={showAutoButton}\n showHistoryButton={showHistoryButton}\n />\n ) : null;\n })()}\n\n {/* 确认跳过动画弹窗 */}\n {pendingNodeIndex !== null && (\n <SkipConfirmDialog\n onConfirm={() => {\n if (pendingNodeIndex !== null) {\n goToNode(pendingNodeIndex, true);\n }\n }}\n onCancel={() => {\n setPendingNodeIndex(null);\n }}\n />\n )}\n\n {/* 分支选项菜单 */}\n {showChoices && (currentDialogue?.choices || currentNode.choices) && (\n <ChoiceMenu\n choices={(currentDialogue?.choices || currentNode.choices)!}\n theme={dialogueTheme}\n onSelect={(choice) => {\n // 1. 处理变量设置\n if (choice.setVariable) {\n const { key, value } = choice.setVariable;\n setVariables(prev => ({ ...prev, [key]: value }));\n console.log(`[MMDVisualNovel] Variable set: ${key} = ${value}`);\n }\n\n // 2. 执行回调\n choice.onSelect?.();\n\n // 3. 触发特效\n if (choice.effect) {\n triggerEffect(choice.effect);\n }\n\n // 4. 处理跳转逻辑\n setShowChoices(false);\n\n if (choice.nextNodeIndex !== undefined) {\n if (choice.nextNodeIndex === currentNodeIndex) {\n // 跳转到当前节点的特定对话\n goToDialogue(choice.nextDialogueIndex || 0);\n } else {\n // 跳转到其他节点\n goToNode(choice.nextNodeIndex, true);\n }\n } else if (currentDialogue?.choices) {\n // 没有指定跳转目标且是在对话行中触发的,逻辑上应该进入下一行\n const nextIdx = currentDialogueIndex + 1;\n if (currentNode && nextIdx < currentNode.dialogues.length) {\n const nextDialogue = currentNode.dialogues[nextIdx];\n if (nextDialogue) {\n setCurrentDialogueIndex(nextIdx);\n addToHistory(nextDialogue, currentNodeIndex, nextIdx);\n onDialogueChange?.(nextDialogue, nextIdx, currentNodeIndex);\n typingCompleteRef.current = false;\n }\n } else {\n // 如果是最后一行了,执行正常的节点切换逻辑\n triggerNodeTransition();\n }\n }\n }}\n />\n )}\n\n {/* 历史记录面板 */}\n {showHistory && (\n <HistoryPanel\n history={history}\n theme={dialogueTheme}\n onClose={() => setShowHistory(false)}\n />\n )}\n\n \n </div>\n );\n }\n);\n\nMMDVisualNovel.displayName = 'MMDVisualNovel';\n\nexport default MMDVisualNovel;\n\n","import React from 'react';\nimport { \n Play, \n Pause, \n SkipBack, \n SkipForward, \n Repeat, \n Repeat1, \n Shuffle,\n Volume2,\n VolumeX,\n ListMusic,\n Camera\n} from 'lucide-react';\n\nexport interface MusicControlsProps {\n isPlaying: boolean;\n currentTime: number;\n duration: number;\n loopMode: 'list' | 'single' | 'shuffle';\n isCameraManual?: boolean;\n onPlayPause: () => void;\n onNext: () => void;\n onPrevious: () => void;\n onSeek: (time: number) => void;\n onToggleLoop: () => void;\n onTogglePlaylist: () => void;\n onResetCamera?: () => void;\n className?: string;\n}\n\nexport const MusicControls: React.FC<MusicControlsProps> = ({\n isPlaying,\n currentTime,\n duration,\n loopMode,\n isCameraManual = false,\n onPlayPause,\n onNext,\n onPrevious,\n onSeek,\n onToggleLoop,\n onTogglePlaylist,\n onResetCamera,\n className = '',\n}) => {\n const formatTime = (seconds: number) => {\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n };\n\n const progress = duration > 0 ? (currentTime / duration) * 100 : 0;\n\n return (\n <div \n className={`w-full max-w-4xl mx-auto px-6 py-4 bg-white/10 backdrop-blur-xl border border-white/20 rounded-2xl shadow-2xl pointer-events-auto transition-all group ${className}`}\n >\n {/* 进度条 */}\n <div className=\"relative w-full h-1.5 bg-white/20 rounded-full mb-4 cursor-pointer group/progress overflow-hidden\">\n <div \n className=\"absolute h-full bg-blue-500 rounded-full transition-all duration-300\"\n style={{ width: `${progress}%` }}\n />\n <input\n type=\"range\"\n min={0}\n max={duration || 100}\n value={currentTime}\n onChange={(e) => onSeek(Number(e.target.value))}\n className=\"absolute inset-0 w-full h-full opacity-0 cursor-pointer\"\n />\n </div>\n\n <div className=\"flex items-center justify-between\">\n {/* 时间显示 */}\n <div className=\"flex items-center gap-2 text-xs font-mono text-white/60 w-32\">\n <span>{formatTime(currentTime)}</span>\n <span>/</span>\n <span>{formatTime(duration)}</span>\n </div>\n\n {/* 主控制按钮 */}\n <div className=\"flex items-center gap-6\">\n <button \n onClick={onPrevious}\n className=\"text-white/80 hover:text-white transition-colors\"\n >\n <SkipBack className=\"w-6 h-6 fill-current\" />\n </button>\n\n <button \n onClick={onPlayPause}\n className=\"w-12 h-12 flex items-center justify-center bg-blue-500 hover:bg-blue-400 text-white rounded-full shadow-lg shadow-blue-500/20 transition-all hover:scale-105 active:scale-95\"\n >\n {isPlaying ? (\n <Pause className=\"w-6 h-6 fill-current\" />\n ) : (\n <Play className=\"w-6 h-6 fill-current ml-1\" />\n )}\n </button>\n\n <button \n onClick={onNext}\n className=\"text-white/80 hover:text-white transition-colors\"\n >\n <SkipForward className=\"w-6 h-6 fill-current\" />\n </button>\n </div>\n\n {/* 附加功能按钮 */}\n <div className=\"flex items-center gap-4 w-32 justify-end\">\n {isCameraManual && (\n <button \n onClick={onResetCamera}\n className=\"text-blue-400 hover:text-blue-300 transition-colors animate-in zoom-in duration-300\"\n title=\"恢复初始视角\"\n >\n <Camera className=\"w-5 h-5\" />\n </button>\n )}\n\n <button \n onClick={onToggleLoop}\n className=\"text-white/60 hover:text-white transition-colors\"\n title={loopMode}\n >\n {loopMode === 'list' && <Repeat className=\"w-5 h-5\" />}\n {loopMode === 'single' && <Repeat1 className=\"w-5 h-5 text-blue-400\" />}\n {loopMode === 'shuffle' && <Shuffle className=\"w-5 h-5 text-orange-400\" />}\n </button>\n\n <button \n onClick={onTogglePlaylist}\n className=\"text-white/60 hover:text-white transition-colors\"\n >\n <ListMusic className=\"w-5 h-5\" />\n </button>\n </div>\n </div>\n </div>\n );\n};\n\n","import React from 'react';\nimport { X, Play, Music } from 'lucide-react';\nimport { MusicTrack } from '../types';\n\nexport interface PlaylistPanelProps {\n tracks: MusicTrack[];\n currentIndex: number;\n isOpen: boolean;\n onClose: () => void;\n onSelectTrack: (index: number) => void;\n className?: string;\n}\n\nexport const PlaylistPanel: React.FC<PlaylistPanelProps> = ({\n tracks,\n currentIndex,\n isOpen,\n onClose,\n onSelectTrack,\n className = '',\n}) => {\n if (!isOpen) return null;\n\n return (\n <div \n className={`fixed inset-y-0 right-0 w-80 bg-gray-900/90 backdrop-blur-2xl border-l border-white/10 shadow-2xl z-50 flex flex-col pointer-events-auto transform transition-transform duration-500 ease-out ${isOpen ? 'translate-x-0' : 'translate-x-full'} ${className}`}\n >\n <div className=\"flex items-center justify-between p-6 border-b border-white/10\">\n <div className=\"flex items-center gap-3\">\n <Music className=\"w-5 h-5 text-blue-400\" />\n <h3 className=\"text-lg font-bold text-white\">播放列表</h3>\n </div>\n <button \n onClick={onClose}\n className=\"p-2 text-white/60 hover:text-white transition-colors\"\n >\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-4 space-y-2 custom-scrollbar\">\n {tracks.map((track, index) => {\n const isActive = index === currentIndex;\n return (\n <button\n key={track.id}\n onClick={() => onSelectTrack(index)}\n className={`w-full flex items-center gap-4 p-3 rounded-xl transition-all group ${isActive ? 'bg-blue-500/20 border border-blue-500/30' : 'hover:bg-white/5 border border-transparent'}`}\n >\n <div className=\"relative w-12 h-12 flex-shrink-0 rounded-lg overflow-hidden bg-gray-800\">\n {track.coverUrl ? (\n <img src={track.coverUrl} alt={track.title} className=\"w-full h-full object-cover\" />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center text-white/20\">\n <Music className=\"w-6 h-6\" />\n </div>\n )}\n {isActive && (\n <div className=\"absolute inset-0 bg-blue-500/40 flex items-center justify-center\">\n <div className=\"flex gap-1 items-end h-4\">\n <div className=\"w-1 bg-white animate-music-bar-1\" />\n <div className=\"w-1 bg-white animate-music-bar-2\" />\n <div className=\"w-1 bg-white animate-music-bar-3\" />\n </div>\n </div>\n )}\n </div>\n\n <div className=\"flex-1 text-left min-w-0\">\n <h4 className={`text-sm font-bold truncate ${isActive ? 'text-blue-400' : 'text-white/90'}`}>\n {track.title}\n </h4>\n <p className=\"text-xs text-white/40 truncate mt-0.5\">\n {track.artist || '未知艺术家'}\n </p>\n </div>\n\n {!isActive && (\n <div className=\"opacity-0 group-hover:opacity-100 transition-opacity\">\n <Play className=\"w-4 h-4 text-white/40 fill-current\" />\n </div>\n )}\n </button>\n );\n })}\n </div>\n\n <div className=\"p-6 border-t border-white/10\">\n <p className=\"text-xs text-gray-500 text-center\">\n 共 {tracks.length} 首曲目\n </p>\n </div>\n\n <style dangerouslySetInnerHTML={{ __html: `\n .custom-scrollbar::-webkit-scrollbar {\n width: 4px;\n }\n .custom-scrollbar::-webkit-scrollbar-track {\n background: transparent;\n }\n .custom-scrollbar::-webkit-scrollbar-thumb {\n background: rgba(255, 255, 255, 0.1);\n border-radius: 10px;\n }\n .custom-scrollbar::-webkit-scrollbar-thumb:hover {\n background: rgba(255, 255, 255, 0.2);\n }\n @keyframes music-bar-1 {\n 0%, 100% { height: 4px; }\n 50% { height: 12px; }\n }\n @keyframes music-bar-2 {\n 0%, 100% { height: 8px; }\n 50% { height: 16px; }\n }\n @keyframes music-bar-3 {\n 0%, 100% { height: 6px; }\n 50% { height: 14px; }\n }\n .animate-music-bar-1 { animation: music-bar-1 0.6s infinite; }\n .animate-music-bar-2 { animation: music-bar-2 0.8s infinite; }\n .animate-music-bar-3 { animation: music-bar-3 0.7s infinite; }\n `}} />\n </div>\n );\n};\n\n","import React from 'react';\nimport { MusicTrack } from '../types';\n\nexport interface TrackInfoProps {\n track: MusicTrack;\n className?: string;\n}\n\nexport const TrackInfo: React.FC<TrackInfoProps> = ({ track, className = '' }) => {\n return (\n <div className={`flex flex-col items-center text-center gap-2 ${className}`}>\n <div className=\"px-4 py-1.5 bg-black/40 backdrop-blur-md rounded-full border border-white/10 shadow-lg\">\n <h2 className=\"text-lg font-bold text-white tracking-wider truncate max-w-md\">\n {track.title}\n </h2>\n </div>\n <p className=\"text-sm font-medium text-white/60 drop-shadow-md\">\n {track.artist || '未知艺术家'}\n </p>\n </div>\n );\n};\n\n","import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n forwardRef,\n useImperativeHandle,\n} from 'react';\nimport { MMDPlayerBase } from '../components/MMDPlayerBase';\nimport { MMDPlayerBaseRef } from '../types';\nimport {\n MMDMusicPlayerProps,\n MMDMusicPlayerRef,\n MusicTrack,\n} from './types';\nimport { MusicControls } from './components/MusicControls';\nimport { PlaylistPanel } from './components/PlaylistPanel';\nimport { TrackInfo } from './components/TrackInfo';\n\n/**\n * MMDMusicPlayer - MMD 音乐播放器组件 (Study with Miku 风格)\n * \n * 核心功能:\n * - 多曲目无缝切换\n * - 完整的媒体控制 (播放/暂停/进度/音量)\n * - 沉浸式 3D 舞台\n * - 自动清理内存与物理引擎\n */\nexport const MMDMusicPlayer = forwardRef<MMDMusicPlayerRef, MMDMusicPlayerProps>(\n (\n {\n config,\n stage,\n mobileOptimization,\n initialTrackIndex = 0,\n onTrackChange,\n onPlayPause,\n onProgress,\n onError,\n className,\n style,\n },\n ref\n ) => {\n const { tracks, autoPlay = false, defaultLoopMode = 'list' } = config;\n\n // 状态管理\n const [currentIndex, setCurrentIndex] = useState(initialTrackIndex);\n const [isPlaying, setIsPlaying] = useState(autoPlay);\n const [isLoading, setIsLoading] = useState(true);\n const [isTransitioning, setIsTransitioning] = useState(false);\n const [currentTime, setCurrentTime] = useState(0);\n const [duration, setDuration] = useState(0);\n const [loopMode, setLoopMode] = useState<'list' | 'single' | 'shuffle'>(defaultLoopMode);\n const [showPlaylist, setShowPlaylist] = useState(false);\n const [isUIVisible, setIsUIVisible] = useState(true);\n const [isCameraManual, setIsCameraManual] = useState(false);\n\n // Refs\n const playerRef = useRef<MMDPlayerBaseRef>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const isStartedRef = useRef(autoPlay);\n const uiTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n // 获取当前曲目\n const currentTrack = tracks[currentIndex];\n\n // 切换到指定曲目 - 包含物理引擎清理逻辑\n const goToTrack = useCallback(\n (index: number) => {\n if (index < 0 || index >= tracks.length) return;\n if (isTransitioning) return;\n\n const track = tracks[index];\n if (!track) return;\n\n console.log(`[MMDMusicPlayer] Transitioning to track ${index}: ${track.title}`);\n\n // 1. 进入过渡状态并暂停\n setIsTransitioning(true);\n setIsLoading(true);\n const wasPlaying = isPlaying;\n setIsPlaying(false);\n\n // 2. 给物理引擎和 Three.js 资源清理留出时间 (参照 MMDPlaylist 逻辑)\n setTimeout(() => {\n setCurrentIndex(index);\n setCurrentTime(0);\n setDuration(0);\n onTrackChange?.(track, index);\n\n // 3. 结束过渡,允许新播放器挂载\n setTimeout(() => {\n setIsTransitioning(false);\n // 如果之前在播放,等待加载完成后恢复\n if (wasPlaying) {\n isStartedRef.current = true;\n }\n }, 100);\n }, 300);\n },\n [tracks, isTransitioning, isPlaying, onTrackChange]\n );\n\n // 下一曲逻辑\n const next = useCallback(() => {\n let nextIndex = currentIndex + 1;\n if (loopMode === 'shuffle') {\n nextIndex = Math.floor(Math.random() * tracks.length);\n } else if (nextIndex >= tracks.length) {\n nextIndex = 0;\n }\n goToTrack(nextIndex);\n }, [currentIndex, tracks.length, loopMode, goToTrack]);\n\n // 上一曲逻辑\n const previous = useCallback(() => {\n let prevIndex = currentIndex - 1;\n if (prevIndex < 0) {\n prevIndex = tracks.length - 1;\n }\n goToTrack(prevIndex);\n }, [currentIndex, tracks.length, goToTrack]);\n\n // 暴露方法给外部\n useImperativeHandle(\n ref,\n () => ({\n play: () => {\n setIsPlaying(true);\n isStartedRef.current = true;\n playerRef.current?.play();\n },\n pause: () => {\n setIsPlaying(false);\n isStartedRef.current = false;\n playerRef.current?.pause();\n },\n next,\n previous,\n goToTrack,\n setLoopMode,\n getState: () => ({\n currentIndex,\n isPlaying,\n currentTime,\n duration,\n loopMode,\n }),\n }),\n [next, previous, goToTrack, currentIndex, isPlaying, currentTime, duration, loopMode]\n );\n\n // 处理播放结束\n const handleEnded = useCallback(() => {\n if (loopMode === 'single') {\n playerRef.current?.seek(0);\n playerRef.current?.play();\n } else {\n next();\n }\n }, [loopMode, next]);\n\n // 处理时间更新\n const handleTimeUpdate = useCallback((time: number) => {\n setCurrentTime(time);\n if (playerRef.current) {\n const total = playerRef.current.getDuration();\n setDuration(total);\n onProgress?.(time, total);\n }\n }, [onProgress]);\n\n // UI 自动隐藏逻辑\n const resetUITimeout = useCallback(() => {\n setIsUIVisible(true);\n if (uiTimeoutRef.current) clearTimeout(uiTimeoutRef.current);\n if (isPlaying) {\n uiTimeoutRef.current = setTimeout(() => {\n if (!showPlaylist) setIsUIVisible(false);\n }, 5000);\n }\n }, [isPlaying, showPlaylist]);\n\n useEffect(() => {\n resetUITimeout();\n return () => {\n if (uiTimeoutRef.current) clearTimeout(uiTimeoutRef.current);\n };\n }, [resetUITimeout]);\n\n if (!currentTrack) {\n return (\n <div className=\"flex h-full w-full items-center justify-center bg-black text-white\">\n 播放列表为空\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={`relative bg-black group ${className}`}\n style={{ width: '100%', height: '100%', overflow: 'hidden', ...style }}\n onMouseMove={resetUITimeout}\n onClick={resetUITimeout}\n >\n {/* 3D 舞台层 */}\n <div \n className=\"absolute inset-0 w-full h-full\"\n style={{ \n zIndex: 0,\n opacity: (isLoading || isTransitioning) ? 0 : 1,\n transition: 'opacity 0.5s ease-in-out'\n }}\n >\n {!isTransitioning && (\n <MMDPlayerBase\n key={currentTrack.id}\n ref={playerRef}\n resources={currentTrack.resources}\n stage={{ ...stage, ...currentTrack.stage }}\n autoPlay={isStartedRef.current}\n loop={loopMode === 'single'}\n mobileOptimization={mobileOptimization}\n onLoad={() => {\n console.log('[MMDMusicPlayer] Track loaded');\n setIsLoading(false);\n if (isStartedRef.current) {\n playerRef.current?.play();\n setIsPlaying(true);\n }\n }}\n onPlay={() => {\n setIsPlaying(true);\n onPlayPause?.(true);\n }}\n onPause={() => {\n setIsPlaying(false);\n onPlayPause?.(false);\n }}\n onCameraChange={(isManual) => {\n setIsCameraManual(isManual);\n }}\n onTimeUpdate={handleTimeUpdate}\n onEnded={handleEnded}\n onError={onError}\n />\n )}\n </div>\n\n {/* 加载遮罩 */}\n {(isLoading || isTransitioning) && (\n <div className=\"absolute inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-md\">\n <div className=\"flex flex-col items-center gap-4\">\n <div className=\"h-12 w-12 animate-spin rounded-full border-4 border-white/20 border-t-blue-500\" />\n <div className=\"text-white font-medium\">\n {isTransitioning ? '准备下一首...' : '正在加载舞台...'}\n </div>\n </div>\n </div>\n )}\n\n {/* UI 交互层 */}\n <div \n className={`absolute inset-0 z-10 flex flex-col justify-between transition-opacity duration-700 pointer-events-none ${isUIVisible ? 'opacity-100' : 'opacity-0'}`}\n >\n {/* 顶部信息 */}\n <div className=\"pt-12 px-8 flex justify-center\">\n <TrackInfo track={currentTrack} />\n </div>\n\n {/* 底部控制 */}\n <div className=\"pb-12 px-8\">\n <MusicControls \n isPlaying={isPlaying}\n currentTime={currentTime}\n duration={duration}\n loopMode={loopMode}\n isCameraManual={isCameraManual}\n onPlayPause={() => isPlaying ? playerRef.current?.pause() : playerRef.current?.play()}\n onNext={next}\n onPrevious={previous}\n onSeek={(time) => playerRef.current?.seek(time)}\n onResetCamera={() => {\n playerRef.current?.resetCamera();\n setIsCameraManual(false);\n }}\n onToggleLoop={() => {\n const modes: ('list' | 'single' | 'shuffle')[] = ['list', 'single', 'shuffle'];\n const nextMode = modes[(modes.indexOf(loopMode) + 1) % modes.length]!;\n setLoopMode(nextMode);\n }}\n onTogglePlaylist={() => setShowPlaylist(!showPlaylist)}\n />\n </div>\n </div>\n\n {/* 侧边播放列表 */}\n <PlaylistPanel \n tracks={tracks}\n currentIndex={currentIndex}\n isOpen={showPlaylist}\n onClose={() => setShowPlaylist(false)}\n onSelectTrack={(index) => {\n goToTrack(index);\n setShowPlaylist(false);\n }}\n />\n </div>\n );\n }\n);\n\nMMDMusicPlayer.displayName = 'MMDMusicPlayer';\n\nexport default MMDMusicPlayer;\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/mmd/utils/ammo-loader.ts","../../src/mmd/components/MMDPlayerBase.tsx","../../src/mmd/components/ControlPanel.tsx","../../src/mmd/components/SettingsPanel.tsx","../../src/mmd/components/MMDPlayerEnhancedDebugInfo.tsx","../../src/mmd/components/MMDPlayerEnhanced.tsx","../../src/mmd/components/MMDPlaylistDebugInfo.tsx","../../src/mmd/components/MMDPlaylist.tsx","../../src/mmd/visual-novel/DialogueBox.tsx","../../src/mmd/visual-novel/HistoryPanel.tsx","../../src/mmd/visual-novel/LoadingScreen.tsx","../../src/mmd/visual-novel/StartScreen.tsx","../../src/mmd/visual-novel/LoadingOverlay.tsx","../../src/mmd/visual-novel/SkipConfirmDialog.tsx","../../src/mmd/visual-novel/ChoiceMenu.tsx","../../src/mmd/visual-novel/MMDVisualNovel.tsx","../../src/mmd/music-player/components/MusicControls.tsx","../../src/mmd/music-player/components/PlaylistPanel.tsx","../../src/mmd/music-player/components/TrackInfo.tsx","../../src/mmd/music-player/MMDMusicPlayer.tsx"],"names":["THREE","forwardRef","useRef","useEffect","useImperativeHandle","OutlineEffect","EffectComposer","RenderPass","UnrealBloomPass","OrbitControls","MMDLoader","MMDAnimationHelper","mesh","Ammo","React","SkipBack","Pause","Play","SkipForward","Repeat","Repeat1","Camera","Grid3x3","Settings","Minimize","Maximize","Video","Check","User","ImageIcon","Music","X","useState","useCallback","StatusBadge","createPortal","Shuffle","ListMusic"],"mappings":"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","file":"index.js","sourcesContent":["\n/**\n * Ammo.js 加载器\n * 用于异步加载 Ammo.js 物理引擎 (WASM 版本)\n */\n\n// 声明全局 Ammo 对象\ndeclare global {\n interface Window {\n Ammo: any;\n }\n}\n\nlet ammoPromise: Promise<any> | null = null;\n\n/**\n * 加载 Ammo.js\n * @param path Ammo.js (WASM wrapper) 的路径,默认为 '/libs/ammo.wasm.js'\n */\nexport const loadAmmo = (path: string = '/libs/ammo.wasm.js'): Promise<any> => {\n if (ammoPromise) {\n return ammoPromise;\n }\n\n ammoPromise = new Promise((resolve, reject) => {\n // 如果已经加载过\n if (typeof window.Ammo === 'function') {\n // Ammo 已经是一个函数(初始化器),直接调用\n window.Ammo().then((lib: any) => {\n resolve(lib);\n });\n return;\n }\n\n if (typeof window.Ammo === 'object') {\n // 已经初始化完毕\n resolve(window.Ammo);\n return;\n }\n\n const script = document.createElement('script');\n script.src = path;\n script.async = true;\n\n script.onload = () => {\n if (typeof window.Ammo === 'function') {\n // 初始化 Ammo\n window.Ammo().then((lib: any) => {\n // 某些版本的 ammo.js 初始化后会返回 lib 实例\n // 但也可能需要直接使用全局对象,这里做一个兼容\n resolve(lib || window.Ammo);\n }).catch((err: any) => {\n console.error('Ammo initialization failed:', err);\n reject(err);\n });\n } else {\n reject(new Error('Ammo.js loaded but window.Ammo is not a function'));\n }\n };\n\n script.onerror = (err) => {\n console.error('Failed to load Ammo.js script:', err);\n reject(new Error(`Failed to load Ammo.js from ${path}`));\n };\n\n document.body.appendChild(script);\n });\n\n return ammoPromise;\n};\n\n","import React, { useEffect, useRef, forwardRef, useImperativeHandle } from 'react';\nimport * as THREE from 'three';\nimport { \n OrbitControls, \n MMDLoader, \n MMDAnimationHelper, \n OutlineEffect,\n EffectComposer,\n RenderPass,\n UnrealBloomPass\n} from 'three-stdlib';\n\n// 🚀 开启 Three.js 全局缓存,确保 CDN 资源在被浏览器缓存后,能直接从内存读取\nif (typeof window !== 'undefined') {\n THREE.Cache.enabled = true;\n}\n\nimport { loadAmmo } from '../utils/ammo-loader';\nimport { MMDPlayerBaseProps, MMDPlayerBaseRef } from '../types';\n\n/**\n * 等待模型的所有材质和纹理加载完成\n * 确保渲染时不会有逐个子模型显示的效果\n */\nasync function waitForMaterialsReady(\n object: THREE.Object3D, \n renderer: THREE.WebGLRenderer,\n scene: THREE.Scene,\n camera: THREE.Camera\n): Promise<void> {\n const textures: THREE.Texture[] = [];\n let meshCount = 0;\n \n // 遍历对象及其所有子对象,收集所有纹理和网格\n object.traverse((obj) => {\n if (obj instanceof THREE.Mesh || obj instanceof THREE.SkinnedMesh) {\n meshCount++;\n const materials = Array.isArray(obj.material) ? obj.material : [obj.material];\n \n materials.forEach((material) => {\n if (material instanceof THREE.Material) {\n // 收集所有可能的纹理属性\n const textureProps = [\n 'map', 'lightMap', 'bumpMap', 'normalMap', 'specularMap',\n 'envMap', 'alphaMap', 'emissiveMap', 'displacementMap',\n 'roughnessMap', 'metalnessMap', 'aoMap',\n // MMD 特有纹理\n 'gradientMap', 'toonMap', 'sphereMap', 'matcap'\n ];\n \n textureProps.forEach((prop) => {\n const texture = (material as any)[prop];\n if (texture instanceof THREE.Texture && !textures.includes(texture)) {\n textures.push(texture);\n }\n });\n }\n });\n }\n });\n \n console.log(`[MMDPlayerBase] Found ${meshCount} meshes and ${textures.length} unique textures`);\n \n // 等待所有纹理的图像数据加载完成\n const texturePromises = textures.map((texture, index) => {\n return new Promise<void>((resolve) => {\n const image = texture.image;\n \n // 检查是否已经加载完成\n if (!image) {\n console.log(`[MMDPlayerBase] Texture ${index + 1}/${textures.length}: No image`);\n resolve();\n return;\n }\n \n if (image instanceof HTMLImageElement) {\n if (image.complete && image.naturalWidth > 0) {\n console.log(`[MMDPlayerBase] Texture ${index + 1}/${textures.length}: Already loaded`);\n resolve();\n } else {\n // 等待图像加载\n const onLoad = () => {\n console.log(`[MMDPlayerBase] Texture ${index + 1}/${textures.length}: Loaded`);\n image.removeEventListener('load', onLoad);\n image.removeEventListener('error', onError);\n resolve();\n };\n \n const onError = (e: any) => {\n console.warn(`[MMDPlayerBase] Texture ${index + 1}/${textures.length}: Failed to load`, e);\n image.removeEventListener('load', onLoad);\n image.removeEventListener('error', onError);\n resolve();\n };\n \n image.addEventListener('load', onLoad);\n image.addEventListener('error', onError);\n \n // 超时保护\n setTimeout(() => {\n image.removeEventListener('load', onLoad);\n image.removeEventListener('error', onError);\n console.warn(`[MMDPlayerBase] Texture ${index + 1}/${textures.length}: Timeout`);\n resolve();\n }, 5000);\n }\n } else {\n console.log(`[MMDPlayerBase] Texture ${index + 1}/${textures.length}: Non-image type`);\n resolve();\n }\n });\n });\n \n await Promise.all(texturePromises);\n console.log('[MMDPlayerBase] All texture images loaded');\n \n // 强制更新所有材质的纹理需要更新标志\n textures.forEach((texture) => {\n texture.needsUpdate = true;\n });\n \n // 执行几次渲染循环,确保所有纹理都上传到 GPU\n console.log('[MMDPlayerBase] Warming up renderer...');\n for (let i = 0; i < 3; i++) {\n await new Promise<void>((resolve) => {\n requestAnimationFrame(() => {\n try {\n // 🎯 核心修复:深度清理无效的变形目标数据,防止 Shader 编译错误 (MORPHTARGETS_COUNT undeclared)\n object.traverse((obj) => {\n if ((obj as any).isMesh) {\n const mesh = obj as THREE.Mesh;\n const materials = Array.isArray(mesh.material) ? mesh.material : [mesh.material];\n \n // 检查几何体是否真的有变形数据\n const hasMorphAttributes = mesh.geometry.morphAttributes && \n Object.keys(mesh.geometry.morphAttributes).length > 0;\n\n materials.forEach(m => {\n // 针对特定的没有实际变形数据的材质\n if (!hasMorphAttributes) {\n // 1. 强制材质关闭变形\n (m as any).morphTargets = false;\n \n // 2. 彻底移除几何体中的变形属性引用\n if (mesh.geometry.morphAttributes) {\n mesh.geometry.morphAttributes = {};\n }\n \n // 3. 重置 Mesh 的变形影响状态\n if ((mesh as any).morphTargetInfluences) {\n (mesh as any).morphTargetInfluences = [];\n }\n if ((mesh as any).morphTargetDictionary) {\n (mesh as any).morphTargetDictionary = {};\n }\n m.needsUpdate = true;\n }\n });\n\n if ((mesh as any).updateMorphTargets) {\n (mesh as any).updateMorphTargets();\n }\n }\n });\n\n renderer.render(scene, camera);\n console.log(`[MMDPlayerBase] Warmup render ${i + 1}/3`);\n } catch (renderError) {\n console.warn('[MMDPlayerBase] Warmup render failed (shader error?), skipping...', renderError);\n }\n resolve();\n });\n });\n }\n \n console.log('[MMDPlayerBase] All materials and textures fully ready');\n}\n\nexport const MMDPlayerBase = forwardRef<MMDPlayerBaseRef, MMDPlayerBaseProps>((props, ref) => {\n const {\n resources,\n stage = {},\n mobileOptimization = { enabled: true },\n autoPlay = false,\n loop = true,\n volume = 1.0,\n muted = false,\n showAxes = false,\n onLoad,\n onLoadProgress,\n onError,\n onPlay,\n onPause,\n onEnded,\n onTimeUpdate,\n onCameraChange,\n className,\n style,\n } = props;\n\n // 合并渲染配置(优先使用 props,其次使用 stage)\n const renderEffect = props.renderEffect || stage.renderEffect || 'default';\n const outlineOptions = { ...stage.outlineOptions, ...props.outlineOptions };\n const bloomOptions = { ...stage.bloomOptions, ...props.bloomOptions };\n const toonOptions = { ...stage.toonOptions, ...props.toonOptions };\n\n // 容器 Ref\n const containerRef = useRef<HTMLDivElement>(null);\n \n // Three.js 对象 Refs\n const sceneRef = useRef<THREE.Scene | null>(null);\n const cameraRef = useRef<THREE.PerspectiveCamera | null>(null);\n const rendererRef = useRef<THREE.WebGLRenderer | null>(null);\n const outlineEffectRef = useRef<OutlineEffect | null>(null);\n const composerRef = useRef<EffectComposer | null>(null);\n const controlsRef = useRef<OrbitControls | null>(null);\n const helperRef = useRef<any>(null); // MMDAnimationHelper\n const axesHelperRef = useRef<THREE.AxesHelper | null>(null); // 坐标轴\n const clockRef = useRef<THREE.Clock>(new THREE.Clock());\n const animationIdRef = useRef<number | null>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n \n // 状态 Refs\n const isReadyRef = useRef(false);\n const isPlayingRef = useRef(false);\n const initIdRef = useRef(0); // 初始化 ID 锁\n const durationRef = useRef(0); // 动画时长(秒)\n const animationClipRef = useRef<THREE.AnimationClip | null>(null); // 保存动画剪辑\n const loopRef = useRef(loop); // 循环状态 ref\n const audioRef = useRef<THREE.Audio | null>(null); // 音频对象引用\n\n // 🚀 解决回调函数在渲染循环中的闭包过时问题\n const latestCallbacks = useRef({ onPlay, onPause, onEnded, onTimeUpdate });\n useEffect(() => {\n latestCallbacks.current = { onPlay, onPause, onEnded, onTimeUpdate };\n }, [onPlay, onPause, onEnded, onTimeUpdate]);\n \n // 🎯 新增:物理引擎组件引用 - 用于正确清理 Ammo 对象\n // 改用数组来追踪所有创建的对象(每个模型会创建多个物理世界和刚体)\n const physicsComponentsRef = useRef<{\n configs: any[];\n dispatchers: any[];\n caches: any[];\n solvers: any[];\n worlds: any[];\n }>({\n configs: [],\n dispatchers: [],\n caches: [],\n solvers: [],\n worlds: []\n });\n \n // 🕐 运行时间追踪 - 用于 OOM 错误报告\n const startTimeRef = useRef<number>(Date.now());\n const modelSwitchCountRef = useRef<number>(0);\n\n // 暴露给父组件的方法\n useImperativeHandle(ref, () => ({\n play: () => {\n if (!isReadyRef.current) return;\n isPlayingRef.current = true;\n if (!clockRef.current.running) clockRef.current.start();\n latestCallbacks.current.onPlay?.();\n },\n pause: () => {\n if (!isPlayingRef.current) return;\n isPlayingRef.current = false;\n clockRef.current.stop();\n latestCallbacks.current.onPause?.();\n },\n stop: () => {\n isPlayingRef.current = false;\n clockRef.current.stop();\n latestCallbacks.current.onPause?.();\n },\n seek: (time: number) => {\n console.warn('Seek not fully implemented in MMDPlayerBase yet');\n },\n getCurrentTime: () => {\n const elapsed = clockRef.current.elapsedTime;\n const duration = durationRef.current;\n // 如果是循环播放,返回模除后的时间\n if (duration > 0 && loopRef.current) {\n return elapsed % duration;\n }\n return elapsed;\n }, \n getDuration: () => durationRef.current,\n isPlaying: () => isPlayingRef.current,\n snapshot: () => {\n if (!rendererRef.current) return '';\n if (sceneRef.current && cameraRef.current) {\n rendererRef.current.render(sceneRef.current, cameraRef.current);\n }\n return rendererRef.current.domElement.toDataURL('image/png');\n },\n resetCamera: () => {\n if (!cameraRef.current || !controlsRef.current) return;\n \n const { cameraPosition, cameraTarget } = stage;\n \n if (cameraPosition) {\n const pos = cameraPosition as any;\n cameraRef.current.position.set(pos.x, pos.y, pos.z);\n } else {\n cameraRef.current.position.set(0, 20, 30);\n }\n \n if (cameraTarget) {\n const target = cameraTarget as any;\n controlsRef.current.target.set(target.x, target.y, target.z);\n } else {\n controlsRef.current.target.set(0, 10, 0);\n }\n \n controlsRef.current.update();\n onCameraChange?.(false); // 重置后标记为非手动\n }\n }));\n\n // 初始化 Effect\n useEffect(() => {\n if (!containerRef.current) return;\n\n const init = async () => {\n // 1. 生成当前初始化的唯一 ID\n const myId = ++initIdRef.current;\n \n // 辅助函数:检查当前初始化是否已过时或组件已卸载\n const checkCancelled = () => {\n return myId !== initIdRef.current || !containerRef.current;\n };\n\n // 2. 清空容器 (Double Check)\n if (containerRef.current) {\n containerRef.current.innerHTML = '';\n }\n \n // 3. 重置物理引擎组件引用\n physicsComponentsRef.current = {\n configs: [],\n dispatchers: [],\n caches: [],\n solvers: [],\n worlds: []\n };\n \n // 🕐 记录开始时间和切换计数\n if (modelSwitchCountRef.current === 0) {\n // 首次加载,记录开始时间\n startTimeRef.current = Date.now();\n modelSwitchCountRef.current = 1;\n console.log('[MMDPlayerBase] 🕐 系统启动时间:', new Date(startTimeRef.current).toLocaleString());\n } else {\n // 模型切换\n modelSwitchCountRef.current++;\n const runningTime = Date.now() - startTimeRef.current;\n const minutes = Math.floor(runningTime / 60000);\n const seconds = Math.floor((runningTime % 60000) / 1000);\n console.log(`[MMDPlayerBase] 🔄 模型切换 #${modelSwitchCountRef.current} (运行时间: ${minutes}分${seconds}秒)`);\n }\n\n try {\n // 4. 物理引擎加载\n if (stage.enablePhysics !== false && !mobileOptimization.disablePhysics) {\n console.log('[MMDPlayerBase] Loading Ammo.js physics engine...');\n await loadAmmo(stage.physicsPath);\n if (checkCancelled()) return;\n console.log('[MMDPlayerBase] Ammo.js loaded successfully');\n \n // 🎯 关键修复:Hook MMDPhysics._createWorld 以捕获物理引擎组件\n // 这样我们可以在清理时正确销毁它们,防止 WASM 内存泄漏\n const Ammo = (window as any).Ammo;\n if (Ammo) {\n console.log('[MMDPlayerBase] Setting up physics component tracking...');\n \n // 保存原始的 Ammo 构造函数,以便在 _createWorld 中使用\n const originalBtDefaultCollisionConfiguration = Ammo.btDefaultCollisionConfiguration;\n const originalBtCollisionDispatcher = Ammo.btCollisionDispatcher;\n const originalBtDbvtBroadphase = Ammo.btDbvtBroadphase;\n const originalBtSequentialImpulseConstraintSolver = Ammo.btSequentialImpulseConstraintSolver;\n const originalBtDiscreteDynamicsWorld = Ammo.btDiscreteDynamicsWorld;\n \n // Monkey patch Ammo 构造函数来拦截创建过程\n // ⚠️ 关键修改:使用数组来保存所有对象,而不是只保存最后一个\n const componentsRef = physicsComponentsRef.current;\n \n Ammo.btDefaultCollisionConfiguration = function(...args: any[]) {\n const obj = new originalBtDefaultCollisionConfiguration(...args);\n componentsRef.configs.push(obj); // 🎯 添加到数组而不是覆盖\n console.log(`[MMDPlayerBase] 🔍 Captured btDefaultCollisionConfiguration #${componentsRef.configs.length}`);\n return obj;\n };\n \n Ammo.btCollisionDispatcher = function(...args: any[]) {\n const obj = new originalBtCollisionDispatcher(...args);\n componentsRef.dispatchers.push(obj);\n console.log(`[MMDPlayerBase] 🔍 Captured btCollisionDispatcher #${componentsRef.dispatchers.length}`);\n return obj;\n };\n \n Ammo.btDbvtBroadphase = function(...args: any[]) {\n const obj = new originalBtDbvtBroadphase(...args);\n componentsRef.caches.push(obj);\n console.log(`[MMDPlayerBase] 🔍 Captured btDbvtBroadphase #${componentsRef.caches.length}`);\n return obj;\n };\n \n Ammo.btSequentialImpulseConstraintSolver = function(...args: any[]) {\n const obj = new originalBtSequentialImpulseConstraintSolver(...args);\n componentsRef.solvers.push(obj);\n console.log(`[MMDPlayerBase] 🔍 Captured btSequentialImpulseConstraintSolver #${componentsRef.solvers.length}`);\n return obj;\n };\n \n Ammo.btDiscreteDynamicsWorld = function(...args: any[]) {\n const obj = new originalBtDiscreteDynamicsWorld(...args);\n componentsRef.worlds.push(obj);\n console.log(`[MMDPlayerBase] 🔍 Captured btDiscreteDynamicsWorld #${componentsRef.worlds.length}`);\n return obj;\n };\n \n console.log('[MMDPlayerBase] ✅ Physics component tracking setup complete');\n }\n } else {\n console.log('[MMDPlayerBase] Physics disabled');\n }\n\n // 5. 场景初始化\n const container = containerRef.current!;\n const width = container.clientWidth || 300;\n const height = container.clientHeight || 150;\n\n // Scene\n const scene = new THREE.Scene();\n if (stage.backgroundColor) {\n scene.background = new THREE.Color(stage.backgroundColor);\n } else if (stage.backgroundImage) {\n const textureLoader = new THREE.TextureLoader();\n textureLoader.load(stage.backgroundImage, (texture) => {\n scene.background = texture;\n });\n }\n sceneRef.current = scene;\n\n // Camera\n const camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 2000);\n if (stage.cameraPosition) {\n const pos = stage.cameraPosition as any;\n camera.position.set(pos.x, pos.y, pos.z);\n } else {\n camera.position.set(0, 20, 30);\n }\n cameraRef.current = camera;\n\n // Renderer\n const renderer = new THREE.WebGLRenderer({ \n antialias: !mobileOptimization.enabled, \n alpha: true, \n preserveDrawingBuffer: true \n });\n renderer.setSize(width, height);\n // 使用更高的像素比例以获得更清晰的渲染效果\n const pixelRatio = mobileOptimization.enabled \n ? (mobileOptimization.pixelRatio || Math.min(window.devicePixelRatio, 2))\n : window.devicePixelRatio;\n renderer.setPixelRatio(pixelRatio);\n console.log('[MMDPlayerBase] Pixel ratio set to:', pixelRatio);\n \n // 🎯 三渲二优化:关闭色调映射,使色彩更接近 2D 原色\n if (renderEffect.includes('outline') || toonOptions.enabled) {\n renderer.toneMapping = THREE.NoToneMapping;\n } else {\n renderer.toneMapping = THREE.ACESFilmicToneMapping;\n }\n \n // 5. 关键检查点:在操作 DOM 之前再次检查\n if (checkCancelled()) {\n renderer.dispose();\n return;\n }\n \n // 再次确保容器为空,防止并行执行导致的残留\n container.innerHTML = '';\n \n // 强制 Canvas 样式 - 确保 canvas 在最底层\n renderer.domElement.style.display = 'block';\n renderer.domElement.style.width = '100%';\n renderer.domElement.style.height = '100%';\n renderer.domElement.style.outline = 'none';\n renderer.domElement.style.position = 'relative';\n \n // Shadow\n if (stage.enableShadow !== false && !mobileOptimization.reduceShadowQuality) {\n renderer.shadowMap.enabled = true;\n renderer.shadowMap.type = THREE.PCFSoftShadowMap;\n }\n \n container.appendChild(renderer.domElement);\n rendererRef.current = renderer;\n\n // 🎯 初始化渲染特效\n // 1. Outline Effect\n const effect = new OutlineEffect(renderer, {\n defaultThickness: outlineOptions.thickness ?? 0.003,\n defaultColor: new THREE.Color(outlineOptions.color ?? '#000000').toArray(),\n defaultAlpha: 1,\n defaultKeepAlive: true\n });\n outlineEffectRef.current = effect;\n\n // 2. Effect Composer (for Bloom)\n const composer = new EffectComposer(renderer);\n const renderPass = new RenderPass(scene, camera);\n composer.addPass(renderPass);\n\n const bloomPass = new UnrealBloomPass(\n new THREE.Vector2(width, height),\n bloomOptions.strength ?? 1.0,\n bloomOptions.radius ?? 0.4,\n bloomOptions.threshold ?? 0.8\n );\n composer.addPass(bloomPass);\n composerRef.current = composer;\n\n // Lights\n const ambientLight = new THREE.AmbientLight(0xffffff, stage.ambientLightIntensity ?? 0.5);\n scene.add(ambientLight);\n\n const dirLight = new THREE.DirectionalLight(0xffffff, stage.directionalLightIntensity ?? 0.8);\n dirLight.position.set(0, 10, 0);\n if (stage.enableShadow !== false) {\n dirLight.castShadow = true;\n dirLight.shadow.mapSize.width = mobileOptimization.enabled ? 1024 : 2048;\n dirLight.shadow.mapSize.height = mobileOptimization.enabled ? 1024 : 2048;\n dirLight.shadow.bias = -0.0001;\n }\n scene.add(dirLight);\n\n // Controls\n const controls = new OrbitControls(camera, renderer.domElement);\n controls.minDistance = 10;\n controls.maxDistance = 100;\n if (stage.cameraTarget) {\n const target = stage.cameraTarget as any;\n controls.target.set(target.x, target.y, target.z);\n } else {\n controls.target.set(0, 10, 0);\n }\n controls.update();\n\n // 🎯 监听手动相机操作\n controls.addEventListener('start', () => {\n onCameraChange?.(true);\n });\n\n controlsRef.current = controls;\n\n // Axes Helper (坐标轴辅助)\n if (showAxes) {\n const axesHelper = new THREE.AxesHelper(20);\n scene.add(axesHelper);\n axesHelperRef.current = axesHelper;\n }\n\n // Resize Observer\n const onResize = () => {\n if (!containerRef.current || !cameraRef.current || !rendererRef.current) return;\n const w = containerRef.current.clientWidth;\n const h = containerRef.current.clientHeight;\n \n if (w === 0 || h === 0) return;\n\n cameraRef.current.aspect = w / h;\n cameraRef.current.updateProjectionMatrix();\n \n rendererRef.current.setSize(w, h);\n if (composerRef.current) {\n composerRef.current.setSize(w, h);\n }\n };\n \n const resizeObserver = new ResizeObserver(onResize);\n resizeObserver.observe(container);\n resizeObserverRef.current = resizeObserver;\n \n // 立即执行一次 Resize\n onResize();\n \n // 🎯 提前启动渲染循环(但不播放动画)\n // 这样可以在加载过程中显示场景,但动画要等完全准备好才开始\n console.log('[MMDPlayerBase] Starting render loop (animation paused)');\n animate();\n\n // 6. 资源加载\n console.log('[MMDPlayerBase] Start loading resources...', {\n model: resources.modelPath,\n stage: resources.stageModelPath,\n motion: resources.motionPath\n });\n const loader = new MMDLoader();\n const helper = new MMDAnimationHelper({\n afterglow: 2.0\n });\n helperRef.current = helper;\n\n // 6.1 加载模型和动作\n const loadModelPromise = new Promise<{ mesh: THREE.SkinnedMesh, animation?: THREE.AnimationClip }>((resolve, reject) => {\n if (resources.motionPath) {\n console.log('[MMDPlayerBase] Loading model with motion:', resources.motionPath);\n loader.loadWithAnimation(\n resources.modelPath,\n resources.motionPath,\n (mmd) => {\n resolve({ mesh: mmd.mesh, animation: mmd.animation });\n },\n (xhr) => {\n if (xhr.lengthComputable) {\n const percent = (xhr.loaded / xhr.total) * 100;\n onLoadProgress?.(percent, 'model+motion');\n }\n },\n (err) => reject(err)\n );\n } else {\n console.log('[MMDPlayerBase] Loading model only');\n loader.load(\n resources.modelPath,\n (mesh) => {\n resolve({ mesh: mesh as THREE.SkinnedMesh });\n },\n (xhr) => {\n if (xhr.lengthComputable) {\n const percent = (xhr.loaded / xhr.total) * 100;\n onLoadProgress?.(percent, 'model');\n }\n },\n (err) => reject(err)\n );\n }\n });\n\n const { mesh, animation } = await loadModelPromise;\n \n // 关键检查点:资源加载耗时较长,再次检查是否已失效\n if (checkCancelled()) return;\n \n console.log('[MMDPlayerBase] Model loaded:', mesh);\n \n // 保存动画时长\n if (animation) {\n animationClipRef.current = animation;\n durationRef.current = animation.duration;\n console.log('[MMDPlayerBase] Animation duration:', animation.duration);\n }\n\n // 设置模型基础属性\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n \n // 🎯 关键优化:先等待所有材质和纹理加载完成,再添加到场景\n // 这样可以避免用户看到\"逐个子模型显示\"的过程\n console.log('[MMDPlayerBase] Waiting for all materials and textures to load...');\n \n // 创建一个临时场景来等待纹理加载(不影响主场景)\n const tempScene = new THREE.Scene();\n tempScene.add(mesh);\n await waitForMaterialsReady(mesh, renderer, tempScene, camera);\n \n if (checkCancelled()) return;\n console.log('[MMDPlayerBase] ✅ All materials and textures loaded');\n \n // 从临时场景移除\n tempScene.remove(mesh);\n\n // 计算模型边界并自动聚焦\n const box = new THREE.Box3().setFromObject(mesh);\n if (!box.isEmpty()) {\n const center = box.getCenter(new THREE.Vector3());\n const size = box.getSize(new THREE.Vector3());\n console.log('[MMDPlayerBase] Model bounds:', { center, size });\n\n if (!stage.cameraTarget) {\n // 对于人形模型,聚焦在胸部/头部之间的位置(center.y + 30-40% 高度)\n controls.target.set(center.x, center.y + size.y * 0.35, center.z);\n \n if (!stage.cameraPosition) {\n // MMD 模型通常正面朝向 -Z 轴,相机应该在 +Z 方向\n // 距离基于模型尺寸,确保能看到全身\n const maxDim = Math.max(size.x, size.y, size.z);\n const dist = maxDim * 2.0; // 增加距离系数\n \n // 相机位置:在模型前方(+Z),稍微抬高(俯视角度)\n camera.position.set(\n center.x, // X: 水平对齐\n center.y + size.y * 0.6, // Y: 稍高于模型中心(眼睛平视或略俯视)\n center.z + dist // Z: 在模型正前方(+Z 方向)\n );\n console.log('[MMDPlayerBase] Auto camera position:', camera.position);\n }\n controls.update();\n }\n }\n \n // 🎯 现在所有纹理都已加载完成,添加到场景和 helper\n const enablePhysics = stage.enablePhysics !== false && !mobileOptimization.disablePhysics;\n \n // 🎯 应用描边设置到模型材质\n // MMD 模型通常在材质的 userData.outlineParameters 中带有来自 PMX 的描边参数\n // 我们需要覆盖它们以使 props.outlineOptions 生效\n mesh.traverse((obj) => {\n if (obj instanceof THREE.Mesh || obj instanceof THREE.SkinnedMesh) {\n const materials = Array.isArray(obj.material) ? obj.material : [obj.material];\n materials.forEach((m) => {\n if (!m.userData) m.userData = {};\n if (!m.userData.outlineParameters) {\n m.userData.outlineParameters = {\n thickness: outlineOptions.thickness ?? 0.003,\n color: new THREE.Color(outlineOptions.color ?? '#000000').toArray(),\n alpha: 1,\n visible: true,\n keepAlive: true\n };\n } else {\n // 覆盖来自模型的默认值\n if (outlineOptions.thickness !== undefined) {\n m.userData.outlineParameters.thickness = outlineOptions.thickness;\n }\n if (outlineOptions.color !== undefined) {\n m.userData.outlineParameters.color = new THREE.Color(outlineOptions.color).toArray();\n }\n }\n\n // 🎯 应用三渲二(Toon)优化\n if (m instanceof THREE.MeshPhongMaterial) {\n if (toonOptions.enabled !== false && (toonOptions.enabled || renderEffect.includes('outline'))) {\n // 1. 降低光泽度,使表面更平整,避免塑料感\n m.shininess = toonOptions.shininess ?? 0;\n m.specular.setScalar(0); // 移除物理高光\n\n // 2. 强制硬色阶 (如果是 Toon 材质)\n if (toonOptions.forceHardShading && (m as any).toonMap) {\n (m as any).toonMap.magFilter = THREE.NearestFilter;\n (m as any).toonMap.minFilter = THREE.NearestFilter;\n (m as any).toonMap.needsUpdate = true;\n }\n }\n }\n });\n }\n });\n\n helper.add(mesh, {\n animation: animation,\n physics: enablePhysics\n });\n\n scene.add(mesh);\n console.log('[MMDPlayerBase] ✅ Model added to scene (fully loaded)');\n\n // 🎯 自动降级系统 - 针对移动设备优化\n const isMobileDevice = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) || \n (window.innerWidth <= 768);\n \n if (isMobileDevice) {\n console.log('[MMDPlayerBase] 📱 Mobile device detected, applying optimizations...');\n \n // 方案 A: 使用骨骼纹理(如果支持)\n if (renderer.capabilities.vertexTextures) {\n console.log('[MMDPlayerBase] ✅ Vertex textures supported');\n } else {\n console.log('[MMDPlayerBase] ⚠️ Vertex textures NOT supported');\n }\n \n // 方案 B: 简化材质\n let simplifiedMaterialCount = 0;\n mesh.traverse((child) => {\n if (child instanceof THREE.Mesh || child instanceof THREE.SkinnedMesh) {\n const materials = Array.isArray(child.material) ? child.material : [child.material];\n materials.forEach((material, idx) => {\n if (material instanceof THREE.MeshPhongMaterial || \n material instanceof THREE.MeshStandardMaterial) {\n // 保存原始材质的颜色\n const originalColor = material.color?.clone();\n const originalMap = material.map;\n \n // 创建简化的 MeshBasicMaterial\n const basicMaterial = new THREE.MeshBasicMaterial({\n color: originalColor || 0xffffff,\n map: originalMap,\n transparent: material.transparent,\n opacity: material.opacity,\n side: material.side,\n alphaTest: material.alphaTest\n });\n \n // 替换材质\n if (Array.isArray(child.material)) {\n child.material[idx] = basicMaterial;\n } else {\n child.material = basicMaterial;\n }\n \n // 清理旧材质\n material.dispose();\n simplifiedMaterialCount++;\n }\n });\n }\n });\n \n if (simplifiedMaterialCount > 0) {\n console.log(`[MMDPlayerBase] ✅ Simplified ${simplifiedMaterialCount} materials to MeshBasicMaterial`);\n }\n \n // 方案 C: 限制骨骼数量(检查并警告)\n const MAX_BONES = 64;\n if (mesh.skeleton) {\n const boneCount = mesh.skeleton.bones.length;\n if (boneCount > MAX_BONES) {\n console.warn(`[MMDPlayerBase] ⚠️ Model has ${boneCount} bones (max recommended: ${MAX_BONES})`);\n console.warn(`[MMDPlayerBase] This may cause performance issues on mobile devices`);\n } else {\n console.log(`[MMDPlayerBase] ✅ Bone count: ${boneCount} (within limit)`);\n }\n }\n \n console.log('[MMDPlayerBase] 📱 Mobile optimizations applied');\n }\n\n // 6.3 加载相机动画\n if (resources.cameraPath) {\n loader.loadAnimation(\n resources.cameraPath,\n camera,\n (cameraAnimation) => {\n if (checkCancelled()) return; // Callback check\n helper.add(camera, {\n animation: cameraAnimation as THREE.AnimationClip\n });\n },\n undefined,\n (err) => console.error('Failed to load camera motion:', err)\n );\n }\n\n // 6.4 加载音频\n if (resources.audioPath) {\n const listener = new THREE.AudioListener();\n camera.add(listener);\n \n const sound = new THREE.Audio(listener);\n const audioLoader = new THREE.AudioLoader();\n \n audioLoader.load(\n resources.audioPath,\n (buffer) => {\n if (checkCancelled()) return; // Callback check\n sound.setBuffer(buffer);\n sound.setLoop(loopRef.current);\n sound.setVolume(volume);\n audioRef.current = sound; // 保存音频引用以便后续更新循环状态\n \n helper.add(sound, { \n delay: 0.0, \n duration: buffer.duration \n } as any);\n },\n undefined,\n (err) => console.error('Failed to load audio:', err)\n );\n }\n\n // 6.5 加载舞台\n const stagePaths = Array.isArray(resources.stageModelPath) \n ? resources.stageModelPath \n : (resources.stageModelPath ? [resources.stageModelPath] : []);\n\n for (const stagePath of stagePaths) {\n try {\n console.log(`[MMDPlayerBase] Loading stage from: ${stagePath}`);\n const stageMesh = await new Promise<THREE.Object3D>((resolve, reject) => {\n loader.load(\n stagePath,\n (mesh) => resolve(mesh),\n (xhr) => {\n if (xhr.lengthComputable) {\n const percent = (xhr.loaded / xhr.total) * 100;\n if (Math.round(percent) % 20 === 0) console.log(`[MMDPlayerBase] Stage loading: ${percent.toFixed(1)}%`);\n }\n },\n (err) => reject(err)\n );\n });\n \n if (checkCancelled()) return;\n \n console.log(`[MMDPlayerBase] Stage model loaded: ${stagePath}`, stageMesh);\n \n // 🎯 核心修复:深度清理无效的变形目标数据,防止 Shader 编译错误\n stageMesh.traverse((child) => {\n if (child instanceof THREE.Mesh) {\n child.castShadow = true;\n child.receiveShadow = true;\n \n const mesh = child as THREE.Mesh;\n const materials = Array.isArray(mesh.material) ? mesh.material : [mesh.material];\n \n materials.forEach((m, idx) => {\n // 对于普通舞台材质,也确保关闭没用的 morphTargets\n if ((m as any).morphTargets) {\n (m as any).morphTargets = false;\n m.needsUpdate = true;\n }\n });\n\n // 3. 彻底移除几何体中的变形属性引用\n if (mesh.geometry.morphAttributes) {\n mesh.geometry.morphAttributes = {};\n }\n if ((mesh as any).morphTargetInfluences) {\n (mesh as any).morphTargetInfluences = [];\n }\n\n // 4. 🎯 应用描边设置到舞台材质\n materials.forEach((m) => {\n if (!m.userData) m.userData = {};\n // 舞台通常没有预设描边,我们手动为其添加\n m.userData.outlineParameters = {\n thickness: outlineOptions.thickness ?? 0.003,\n color: new THREE.Color(outlineOptions.color ?? '#000000').toArray(),\n alpha: 1,\n visible: true,\n keepAlive: true\n };\n\n // 🎯 应用三渲二(Toon)优化 (舞台也可能需要)\n if (m instanceof THREE.MeshPhongMaterial) {\n if (toonOptions.enabled !== false && (toonOptions.enabled || renderEffect.includes('outline'))) {\n m.shininess = toonOptions.shininess ?? 0;\n m.specular.setScalar(0);\n }\n }\n });\n }\n });\n\n // 🎯 材质预热\n try {\n await waitForMaterialsReady(stageMesh, renderer, scene, camera);\n } catch (e) {\n console.warn(`[MMDPlayerBase] Warmup error for stage ${stagePath}:`, e);\n }\n \n if (checkCancelled()) return;\n \n // 添加到场景\n scene.add(stageMesh);\n \n // 🎯 自动调整比例和位置\n const stageBox = new THREE.Box3().setFromObject(stageMesh);\n const stageSize = stageBox.getSize(new THREE.Vector3());\n \n if (stageSize.length() < 1) {\n stageMesh.scale.multiplyScalar(100);\n } else if (stageSize.y < 5) {\n stageMesh.scale.multiplyScalar(10);\n }\n \n // 确保底部对齐 Y=0 (可选)\n // stageMesh.position.set(0, 0, 0); \n\n console.log(`[MMDPlayerBase] ✅ Stage added: ${stagePath}`);\n\n // 绑定动作\n if (resources.stageMotionPath) {\n (loader as any).loadAnimation(resources.stageMotionPath, stageMesh, (anim: any) => {\n if (!checkCancelled()) helper.add(stageMesh as any, { animation: anim });\n });\n }\n } catch (err) {\n console.error(`Failed to load stage ${stagePath}:`, err);\n }\n }\n\n if (checkCancelled()) return;\n \n // 🎯 所有资源完全加载完成,模型已完全显示,现在可以触发回调并开始播放动画\n isReadyRef.current = true;\n console.log('[MMDPlayerBase] 🎉 All resources fully loaded and ready!');\n console.log('[MMDPlayerBase] 📊 Summary:');\n console.log(`[MMDPlayerBase] - Model: ✅ Fully loaded with all textures`);\n if (resources.stageModelPath) {\n console.log(`[MMDPlayerBase] - Stage: ✅ Fully loaded with all textures`);\n }\n if (animation) {\n console.log(`[MMDPlayerBase] - Animation: ✅ Ready (${animation.duration.toFixed(2)}s)`);\n }\n console.log('[MMDPlayerBase] 🔔 Triggering onLoad callback');\n onLoad?.();\n \n if (autoPlay) {\n // 给一点时间让渲染系统稳定,然后开始播放动画\n setTimeout(() => {\n if (checkCancelled()) return;\n console.log('[MMDPlayerBase] 🎬 Starting animation playback (after materials fully loaded)');\n isPlayingRef.current = true;\n if (!clockRef.current.running) clockRef.current.start();\n onPlay?.();\n }, 100);\n }\n\n } catch (error) {\n if (checkCancelled()) return; // 如果是因为取消导致的 error,忽略\n console.error('MMDPlayerBase initialization failed:', error);\n \n // 检测 OOM 错误并弹出警告\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (errorMessage.includes('OOM') || errorMessage.includes('out of memory')) {\n // 计算运行时间\n const runningTime = Date.now() - startTimeRef.current;\n const hours = Math.floor(runningTime / 3600000);\n const minutes = Math.floor((runningTime % 3600000) / 60000);\n const seconds = Math.floor((runningTime % 60000) / 1000);\n \n const timeString = hours > 0 \n ? `${hours}小时${minutes}分${seconds}秒` \n : minutes > 0\n ? `${minutes}分${seconds}秒`\n : `${seconds}秒`;\n \n alert(`⚠️ 内存溢出错误 (OOM)\n\n📊 系统运行统计:\n• 运行时间: ${timeString}\n• 模型切换次数: ${modelSwitchCountRef.current}\n• 启动时间: ${new Date(startTimeRef.current).toLocaleString()}\n• 错误时间: ${new Date().toLocaleString()}\n\n❌ 问题:物理引擎内存不足!\n这通常意味着之前的物理世界没有正确清理。\n\n🔍 错误详情:\n${errorMessage}\n\n💡 建议:请刷新页面或联系开发者`);\n }\n \n onError?.(error instanceof Error ? error : new Error(String(error)));\n }\n };\n\n init();\n\n return () => {\n // 清理逻辑 - 彻底清理所有 Three.js 资源以防止内存泄漏\n console.log('[MMDPlayerBase] Cleanup started');\n \n // 增加 ID,立即使当前的 init 失效(如果还在跑)\n initIdRef.current++;\n \n // 停止动画循环\n if (animationIdRef.current) {\n cancelAnimationFrame(animationIdRef.current);\n animationIdRef.current = null;\n }\n \n isPlayingRef.current = false;\n isReadyRef.current = false;\n \n // 清理 ResizeObserver\n if (resizeObserverRef.current) {\n resizeObserverRef.current.disconnect();\n resizeObserverRef.current = null;\n }\n \n // 清理音频资源\n if (audioRef.current) {\n try {\n if (audioRef.current.isPlaying) {\n audioRef.current.stop();\n }\n if (audioRef.current.source) {\n audioRef.current.disconnect();\n }\n // 清理音频缓冲区引用\n if (audioRef.current.buffer) {\n audioRef.current.buffer = null as any;\n }\n audioRef.current = null;\n } catch (e) {\n console.warn('[MMDPlayerBase] Error cleaning up audio:', e);\n }\n }\n \n // 清理 AnimationHelper - 包含物理引擎清理 \n if (helperRef.current) {\n try {\n console.log('[MMDPlayerBase] Cleaning up AnimationHelper');\n \n const helperObjects = (helperRef.current as any).objects;\n const meshes = (helperRef.current as any).meshes || [];\n \n console.log('[MMDPlayerBase] Found meshes count:', meshes.length);\n \n if (meshes && Array.isArray(meshes) && meshes.length > 0) {\n meshes.forEach((mesh: any, idx: number) => {\n console.log(`[MMDPlayerBase] Cleaning mesh ${idx}:`, mesh.uuid);\n \n // 🎯 关键修复:从 WeakMap 中获取真正的 meshData\n let meshData: any = null;\n \n if (helperObjects instanceof WeakMap) {\n console.log('[MMDPlayerBase] Accessing WeakMap with mesh as key...');\n meshData = helperObjects.get(mesh);\n \n if (meshData) {\n const meshDataKeys = Object.keys(meshData);\n console.log(`[MMDPlayerBase] ✅ Got meshData from WeakMap, keys (${meshDataKeys.length}):`, meshDataKeys);\n \n // 打印物理相关的属性\n const physicsRelatedKeys = meshDataKeys.filter(k => k.toLowerCase().includes('phys'));\n if (physicsRelatedKeys.length > 0) {\n console.log(`[MMDPlayerBase] Physics-related keys:`, physicsRelatedKeys);\n physicsRelatedKeys.forEach(key => {\n const value = meshData[key];\n console.log(`[MMDPlayerBase] ${key}:`, typeof value, value?.constructor?.name || value);\n });\n }\n } else {\n console.log('[MMDPlayerBase] ⚠️ No meshData found in WeakMap for this mesh');\n }\n }\n \n // 如果没有从 WeakMap 获取到,使用 mesh 本身作为 fallback\n if (!meshData) {\n console.log('[MMDPlayerBase] Using mesh itself as meshData');\n meshData = mesh;\n }\n \n // 清理物理系统 - 从 meshData 中获取\n const physics = meshData?.physics;\n \n if (physics) {\n try {\n console.log('[MMDPlayerBase] 🎯 Starting physics cleanup for mesh', idx);\n console.log('[MMDPlayerBase] Debug: physics object keys:', Object.keys(physics));\n \n // 优先使用 MMDPhysics.dispose() 方法(three-stdlib 提供的标准清理方法)\n if (typeof physics.dispose === 'function') {\n console.log('[MMDPlayerBase] Calling MMDPhysics.dispose()...');\n physics.dispose();\n console.log('[MMDPlayerBase] ✅ MMDPhysics.dispose() completed');\n } else {\n // 手动清理物理组件\n console.log('[MMDPlayerBase] No dispose method, manually cleaning physics components...');\n \n const Ammo = (window as any).Ammo;\n if (!Ammo || !Ammo.destroy) {\n console.warn('[MMDPlayerBase] ⚠️ Ammo.destroy not available');\n } else {\n // 清理刚体\n if (physics.world && Array.isArray(physics.bodies) && physics.bodies.length > 0) {\n console.log(`[MMDPlayerBase] Cleaning ${physics.bodies.length} rigid bodies...`);\n for (let i = physics.bodies.length - 1; i >= 0; i--) {\n try {\n const body = physics.bodies[i];\n if (body && body.body) {\n physics.world.removeRigidBody(body.body);\n }\n } catch (e) {\n console.warn(`[MMDPlayerBase] Error removing body ${i}:`, e);\n }\n }\n physics.bodies.length = 0;\n console.log('[MMDPlayerBase] ✅ All rigid bodies removed');\n }\n \n // 清理约束\n if (physics.world && Array.isArray(physics.constraints) && physics.constraints.length > 0) {\n console.log(`[MMDPlayerBase] Cleaning ${physics.constraints.length} constraints...`);\n for (let i = physics.constraints.length - 1; i >= 0; i--) {\n try {\n const constraint = physics.constraints[i];\n if (constraint) {\n physics.world.removeConstraint(constraint);\n }\n } catch (e) {\n console.warn(`[MMDPlayerBase] Error removing constraint ${i}:`, e);\n }\n }\n physics.constraints.length = 0;\n console.log('[MMDPlayerBase] ✅ All constraints removed');\n }\n \n // 注意:不在这里销毁 world,因为它会在后面统一清理\n }\n }\n \n // 清除引用\n meshData.physics = null;\n \n console.log('[MMDPlayerBase] ✅ Physics cleanup completed for mesh', idx);\n } catch (physicsError) {\n console.error('[MMDPlayerBase] ❌ Error cleaning up physics:', physicsError);\n console.error('[MMDPlayerBase] Physics error stack:', (physicsError as Error).stack);\n }\n } else {\n console.log('[MMDPlayerBase] ⚠️ No physics object found for mesh', idx);\n }\n \n // 清理 AnimationMixer (从 meshData 中获取)\n if (meshData?.mixer) {\n meshData.mixer.stopAllAction();\n meshData.mixer.uncacheRoot(meshData.mesh || mesh);\n // 清理所有 clips 的引用\n const clips = meshData.mixer._actions || [];\n clips.forEach((action: any) => {\n if (action._clip) {\n action._clip = null;\n }\n });\n meshData.mixer = null;\n }\n \n // 清理 audio 引用 (从 meshData 中获取)\n if (meshData?.audio) {\n if (meshData.audio.isPlaying) {\n meshData.audio.stop();\n }\n if (meshData.audio.source) {\n meshData.audio.disconnect();\n }\n if (meshData.audio.buffer) {\n meshData.audio.buffer = null;\n }\n meshData.audio = null;\n }\n });\n // 清空数组\n meshes.length = 0;\n }\n \n // 🎯 核心修复:使用捕获的物理引擎组件引用进行清理\n console.log('[MMDPlayerBase] 🔥 Starting CRITICAL physics components cleanup...');\n const Ammo = (window as any).Ammo;\n if (Ammo && Ammo.destroy) {\n const components = physicsComponentsRef.current;\n \n console.log(`[MMDPlayerBase] 📊 Physics components count:`, {\n worlds: components.worlds.length,\n solvers: components.solvers.length,\n caches: components.caches.length,\n dispatchers: components.dispatchers.length,\n configs: components.configs.length\n });\n \n // 按照正确的顺序销毁 Ammo 对象(与创建顺序相反)\n // 创建顺序:config -> dispatcher -> cache -> solver -> world\n // 销毁顺序:world -> solver -> cache -> dispatcher -> config\n \n // 销毁所有 worlds\n if (components.worlds.length > 0) {\n console.log(`[MMDPlayerBase] 🗑️ Destroying ${components.worlds.length} btDiscreteDynamicsWorld(s)...`);\n for (let i = components.worlds.length - 1; i >= 0; i--) {\n try {\n Ammo.destroy(components.worlds[i]);\n } catch (e) {\n console.error(`[MMDPlayerBase] ❌ Error destroying world #${i}:`, e);\n }\n }\n components.worlds.length = 0;\n console.log('[MMDPlayerBase] ✅ All btDiscreteDynamicsWorld destroyed');\n }\n \n // 销毁所有 solvers\n if (components.solvers.length > 0) {\n console.log(`[MMDPlayerBase] 🗑️ Destroying ${components.solvers.length} btSequentialImpulseConstraintSolver(s)...`);\n for (let i = components.solvers.length - 1; i >= 0; i--) {\n try {\n Ammo.destroy(components.solvers[i]);\n } catch (e) {\n console.error(`[MMDPlayerBase] ❌ Error destroying solver #${i}:`, e);\n }\n }\n components.solvers.length = 0;\n console.log('[MMDPlayerBase] ✅ All btSequentialImpulseConstraintSolver destroyed');\n }\n \n // 销毁所有 caches\n if (components.caches.length > 0) {\n console.log(`[MMDPlayerBase] 🗑️ Destroying ${components.caches.length} btDbvtBroadphase(s)...`);\n for (let i = components.caches.length - 1; i >= 0; i--) {\n try {\n Ammo.destroy(components.caches[i]);\n } catch (e) {\n console.error(`[MMDPlayerBase] ❌ Error destroying cache #${i}:`, e);\n }\n }\n components.caches.length = 0;\n console.log('[MMDPlayerBase] ✅ All btDbvtBroadphase destroyed');\n }\n \n // 销毁所有 dispatchers\n if (components.dispatchers.length > 0) {\n console.log(`[MMDPlayerBase] 🗑️ Destroying ${components.dispatchers.length} btCollisionDispatcher(s)...`);\n for (let i = components.dispatchers.length - 1; i >= 0; i--) {\n try {\n Ammo.destroy(components.dispatchers[i]);\n } catch (e) {\n console.error(`[MMDPlayerBase] ❌ Error destroying dispatcher #${i}:`, e);\n }\n }\n components.dispatchers.length = 0;\n console.log('[MMDPlayerBase] ✅ All btCollisionDispatcher destroyed');\n }\n \n // 销毁所有 configs\n if (components.configs.length > 0) {\n console.log(`[MMDPlayerBase] 🗑️ Destroying ${components.configs.length} btDefaultCollisionConfiguration(s)...`);\n for (let i = components.configs.length - 1; i >= 0; i--) {\n try {\n Ammo.destroy(components.configs[i]);\n } catch (e) {\n console.error(`[MMDPlayerBase] ❌ Error destroying config #${i}:`, e);\n }\n }\n components.configs.length = 0;\n console.log('[MMDPlayerBase] ✅ All btDefaultCollisionConfiguration destroyed');\n }\n \n console.log('[MMDPlayerBase] 🎉 Physics components cleanup completed!');\n } else {\n console.warn('[MMDPlayerBase] ⚠️ Ammo.destroy not available, skipping physics cleanup');\n }\n \n // 清理 sharedPhysics 和 masterPhysics(如果存在)\n console.log('[MMDPlayerBase] Checking helper-level physics...');\n if ((helperRef.current as any).sharedPhysics) {\n console.log('[MMDPlayerBase] Clearing sharedPhysics reference...');\n (helperRef.current as any).sharedPhysics = null;\n }\n if ((helperRef.current as any).masterPhysics) {\n console.log('[MMDPlayerBase] Clearing masterPhysics reference...');\n (helperRef.current as any).masterPhysics = null;\n }\n \n // 清理 helper 自身\n if (helperRef.current.dispose) {\n helperRef.current.dispose();\n }\n } catch (e) {\n console.warn('[MMDPlayerBase] Error cleaning up AnimationHelper:', e);\n }\n helperRef.current = null;\n }\n \n // 清理 AnimationClip\n animationClipRef.current = null;\n \n // 清理坐标轴\n if (axesHelperRef.current) {\n if (sceneRef.current) {\n sceneRef.current.remove(axesHelperRef.current);\n }\n axesHelperRef.current.dispose();\n axesHelperRef.current = null;\n }\n \n // 清理场景中的所有对象 - 增强版\n if (sceneRef.current) {\n sceneRef.current.traverse((object) => {\n // 清理几何体和材质\n if (object instanceof THREE.Mesh || object instanceof THREE.SkinnedMesh) {\n // 清理骨骼相关(SkinnedMesh)\n if (object instanceof THREE.SkinnedMesh) {\n if (object.skeleton) {\n object.skeleton.dispose();\n }\n // 清理绑定矩阵\n if (object.bindMatrix) {\n object.bindMatrix = null as any;\n }\n if (object.bindMatrixInverse) {\n object.bindMatrixInverse = null as any;\n }\n }\n \n // 清理几何体\n if (object.geometry) {\n object.geometry.dispose();\n object.geometry = null as any;\n }\n \n // 清理材质和纹理\n if (object.material) {\n const disposeMaterial = (m: THREE.Material) => {\n // 清理所有可能的纹理类型(包括 MMD 特有的)\n const textureProps = [\n 'map', 'lightMap', 'bumpMap', 'normalMap', 'specularMap', \n 'envMap', 'alphaMap', 'emissiveMap', 'displacementMap',\n 'roughnessMap', 'metalnessMap', 'aoMap',\n // MMD 特有纹理\n 'gradientMap', 'toonMap', 'sphereMap', 'matcap'\n ];\n \n textureProps.forEach(prop => {\n // @ts-ignore\n if (m[prop] && m[prop].dispose) {\n // @ts-ignore\n m[prop].dispose();\n // @ts-ignore\n m[prop] = null;\n }\n });\n \n // 清理材质本身\n m.dispose();\n };\n \n if (Array.isArray(object.material)) {\n object.material.forEach(disposeMaterial);\n } else {\n disposeMaterial(object.material);\n }\n object.material = null as any;\n }\n }\n \n // 清理 AudioListener\n if (object instanceof THREE.AudioListener) {\n try {\n // @ts-ignore\n if (object.context && object.context.state !== 'closed') {\n // @ts-ignore\n object.context.close?.();\n }\n } catch (e) {\n console.warn('[MMDPlayerBase] Error closing AudioContext:', e);\n }\n }\n \n // 清理灯光的阴影贴图\n if (object instanceof THREE.Light) {\n if (object.shadow && object.shadow.map) {\n object.shadow.map.dispose();\n object.shadow.map = null as any;\n }\n }\n });\n \n // 清空场景\n sceneRef.current.clear();\n sceneRef.current = null;\n }\n\n // 清理 Controls\n if (controlsRef.current) {\n controlsRef.current.dispose();\n controlsRef.current = null;\n }\n\n // 清理 Renderer - 增强版\n if (rendererRef.current) {\n try {\n // 清理 Composer\n if (composerRef.current) {\n composerRef.current.passes.forEach(pass => {\n if ((pass as any).dispose) (pass as any).dispose();\n });\n composerRef.current = null;\n }\n \n // 清理 OutlineEffect\n outlineEffectRef.current = null;\n\n // 清理所有渲染目标\n const renderer = rendererRef.current;\n \n // 清理渲染列表\n if (renderer.renderLists) {\n renderer.renderLists.dispose();\n }\n \n // 清理渲染器信息\n if (renderer.info && renderer.info.programs) {\n renderer.info.programs.forEach((program: any) => {\n if (program && program.destroy) {\n program.destroy();\n }\n });\n }\n \n // 清理 WebGL 程序\n if (renderer.getContext) {\n const gl = renderer.getContext();\n const numTextureUnits = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n for (let unit = 0; unit < numTextureUnits; ++unit) {\n gl.activeTexture(gl.TEXTURE0 + unit);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, null);\n }\n }\n \n // Dispose 渲染器\n renderer.dispose();\n \n // 强制失去 WebGL 上下文\n renderer.forceContextLoss();\n \n // 从 DOM 中移除 canvas\n if (containerRef.current && renderer.domElement) {\n if (containerRef.current.contains(renderer.domElement)) {\n containerRef.current.removeChild(renderer.domElement);\n }\n }\n \n // 清空 canvas 引用\n if (renderer.domElement) {\n renderer.domElement.width = 1;\n renderer.domElement.height = 1;\n }\n \n } catch (e) {\n console.warn('[MMDPlayerBase] Error cleaning up renderer:', e);\n }\n rendererRef.current = null;\n }\n \n // 重置 Camera\n cameraRef.current = null;\n \n // 重置 Clock\n clockRef.current = new THREE.Clock();\n \n // 重置时长\n durationRef.current = 0;\n \n console.log('[MMDPlayerBase] Cleanup completed');\n \n // 提示浏览器可以进行垃圾回收(只在开发环境)\n if (typeof window !== 'undefined' && 'gc' in window) {\n try {\n // @ts-ignore\n window.gc();\n } catch (e) {\n // gc 不可用时忽略\n }\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [resources]); // 关键依赖:当 resources 变了(且没有 key 强制重刷时),执行这个 effect\n\n // 监听 showAxes 变化,动态添加/移除坐标轴\n useEffect(() => {\n if (!sceneRef.current) return;\n \n if (showAxes && !axesHelperRef.current) {\n const axesHelper = new THREE.AxesHelper(20);\n sceneRef.current.add(axesHelper);\n axesHelperRef.current = axesHelper;\n } else if (!showAxes && axesHelperRef.current) {\n sceneRef.current.remove(axesHelperRef.current);\n axesHelperRef.current.dispose();\n axesHelperRef.current = null;\n }\n }, [showAxes]);\n\n // 监听 loop 变化,更新循环状态\n useEffect(() => {\n loopRef.current = loop;\n \n // 同步更新音频的循环状态\n if (audioRef.current && audioRef.current.buffer) {\n audioRef.current.setLoop(loop);\n }\n }, [loop]);\n\n // 监听渲染特效配置变化\n useEffect(() => {\n if (outlineEffectRef.current) {\n // @ts-ignore\n outlineEffectRef.current.defaultThickness = outlineOptions.thickness ?? 0.003;\n // @ts-ignore\n outlineEffectRef.current.defaultColor = new THREE.Color(outlineOptions.color ?? '#000000').toArray();\n\n // 同步更新场景中所有现有材质的描边参数\n if (sceneRef.current) {\n sceneRef.current.traverse((obj) => {\n if (obj instanceof THREE.Mesh || obj instanceof THREE.SkinnedMesh) {\n const materials = Array.isArray(obj.material) ? obj.material : [obj.material];\n materials.forEach((m) => {\n if (m.userData && m.userData.outlineParameters) {\n if (outlineOptions.thickness !== undefined) {\n m.userData.outlineParameters.thickness = outlineOptions.thickness;\n }\n if (outlineOptions.color !== undefined) {\n m.userData.outlineParameters.color = new THREE.Color(outlineOptions.color).toArray();\n }\n }\n });\n }\n });\n }\n }\n \n if (composerRef.current) {\n const bloomPass = composerRef.current.passes.find(p => p instanceof UnrealBloomPass) as UnrealBloomPass;\n if (bloomPass) {\n bloomPass.strength = bloomOptions.strength ?? 1.0;\n bloomPass.radius = bloomOptions.radius ?? 0.4;\n bloomPass.threshold = bloomOptions.threshold ?? 0.8;\n }\n }\n }, [outlineOptions.thickness, outlineOptions.color, bloomOptions.strength, bloomOptions.radius, bloomOptions.threshold]);\n\n // 监听三渲二(Toon)配置变化\n useEffect(() => {\n if (!sceneRef.current) return;\n\n sceneRef.current.traverse((obj) => {\n if (obj instanceof THREE.Mesh || obj instanceof THREE.SkinnedMesh) {\n const materials = Array.isArray(obj.material) ? obj.material : [obj.material];\n materials.forEach((m) => {\n if (m instanceof THREE.MeshPhongMaterial) {\n if (toonOptions.enabled !== false && (toonOptions.enabled || renderEffect.includes('outline'))) {\n m.shininess = toonOptions.shininess ?? 0;\n m.specular.setScalar(0);\n \n if (toonOptions.forceHardShading && (m as any).toonMap) {\n (m as any).toonMap.magFilter = THREE.NearestFilter;\n (m as any).toonMap.minFilter = THREE.NearestFilter;\n (m as any).toonMap.needsUpdate = true;\n }\n }\n }\n });\n }\n });\n }, [toonOptions.enabled, toonOptions.shininess, toonOptions.forceHardShading, renderEffect]);\n\n // 监听 stage 变化,动态更新场景属性(不触发完整重载)\n useEffect(() => {\n if (!isReadyRef.current) return;\n\n // 更新背景\n if (sceneRef.current) {\n if (stage.backgroundColor) {\n sceneRef.current.background = new THREE.Color(stage.backgroundColor);\n } else if (stage.backgroundImage) {\n const textureLoader = new THREE.TextureLoader();\n textureLoader.load(stage.backgroundImage, (texture) => {\n if (sceneRef.current) sceneRef.current.background = texture;\n });\n }\n }\n\n // 更新灯光强度\n if (sceneRef.current) {\n sceneRef.current.traverse((obj) => {\n if (obj instanceof THREE.AmbientLight && stage.ambientLightIntensity !== undefined) {\n obj.intensity = stage.ambientLightIntensity;\n }\n if (obj instanceof THREE.DirectionalLight && stage.directionalLightIntensity !== undefined) {\n obj.intensity = stage.directionalLightIntensity;\n }\n });\n }\n\n // 更新相机和目标\n if (cameraRef.current && stage.cameraPosition) {\n const pos = stage.cameraPosition as any;\n cameraRef.current.position.set(pos.x, pos.y, pos.z);\n }\n if (controlsRef.current && stage.cameraTarget) {\n const target = stage.cameraTarget as any;\n controlsRef.current.target.set(target.x, target.y, target.z);\n controlsRef.current.update();\n }\n }, [stage.backgroundColor, stage.backgroundImage, stage.ambientLightIntensity, stage.directionalLightIntensity, stage.cameraPosition, stage.cameraTarget]);\n\n // 渲染循环\n const animate = () => {\n animationIdRef.current = requestAnimationFrame(animate);\n \n if (rendererRef.current && sceneRef.current && cameraRef.current) {\n if (isReadyRef.current && isPlayingRef.current && helperRef.current) {\n const delta = clockRef.current.getDelta();\n helperRef.current.update(delta);\n \n // 触发时间更新回调(使用模除后的时间)\n const elapsed = clockRef.current.elapsedTime;\n const duration = durationRef.current;\n const currentTime = duration > 0 && loopRef.current ? (elapsed % duration) : elapsed;\n latestCallbacks.current.onTimeUpdate?.(currentTime);\n \n // 简单的结束检测(非循环模式)\n if (!loopRef.current && duration > 0 && elapsed >= duration) {\n isPlayingRef.current = false;\n clockRef.current.stop();\n latestCallbacks.current.onEnded?.();\n }\n }\n \n // 使用选定的渲染方式\n const useOutline = renderEffect === 'outline' || renderEffect === 'outline+bloom';\n const useBloom = renderEffect === 'bloom' || renderEffect === 'outline+bloom';\n\n if (useBloom && composerRef.current) {\n composerRef.current.render();\n } else if (useOutline && outlineEffectRef.current) {\n outlineEffectRef.current.render(sceneRef.current, cameraRef.current);\n } else {\n rendererRef.current.render(sceneRef.current, cameraRef.current);\n }\n }\n };\n\n return (\n <div \n ref={containerRef} \n className={className} \n style={{ \n width: '100%', \n height: '100%', \n overflow: 'hidden', \n position: 'relative', // 恢复 relative,作为 canvas 的定位容器\n backgroundColor: stage.backgroundColor || '#000',\n ...style \n }}\n />\n );\n});\n\nMMDPlayerBase.displayName = 'MMDPlayerBase';\n","import React from 'react';\nimport { Play, Pause, Maximize, Minimize, Settings, Grid3x3, Repeat, Repeat1, SkipBack, SkipForward, Camera } from 'lucide-react';\n\ninterface ControlPanelProps {\n isPlaying: boolean;\n isFullscreen: boolean;\n isLooping: boolean; // 是否单节点循环播放\n isListLooping?: boolean; // 是否列表循环(播放列表专用)\n isCameraManual?: boolean;\n showSettings?: boolean;\n showAxes?: boolean; // 坐标轴是否显示\n showPrevNext?: boolean; // 是否显示上一个/下一个按钮\n title?: string;\n subtitle?: string; // 副标题 (如 \"1 / 3\")\n \n onPlayPause: () => void;\n onToggleFullscreen: () => void;\n onToggleLoop: () => void; // 切换单节点循环播放\n onToggleListLoop?: () => void; // 切换列表循环\n onToggleAxes?: () => void; // 切换坐标轴显示\n onOpenSettings?: () => void;\n onPrevious?: () => void; // 上一个\n onNext?: () => void; // 下一个\n onResetCamera?: () => void; // 重置相机\n}\n\nexport const ControlPanel: React.FC<ControlPanelProps> = ({\n isPlaying,\n isFullscreen,\n isLooping,\n isListLooping,\n isCameraManual = false,\n showSettings,\n showAxes = false,\n showPrevNext = false,\n title,\n subtitle,\n onPlayPause,\n onToggleFullscreen,\n onToggleLoop,\n onToggleListLoop,\n onToggleAxes,\n onOpenSettings,\n onPrevious,\n onNext,\n onResetCamera,\n}) => {\n return (\n <div className=\"absolute bottom-0 left-0 right-0 bg-gradient-to-t from-black/80 to-transparent p-4 transition-opacity duration-300 hover:opacity-100\">\n <div className=\"flex items-center justify-between text-white\">\n <div className=\"flex items-center gap-2\">\n {/* 上一个按钮 */}\n {showPrevNext && onPrevious && (\n <button \n onClick={onPrevious}\n className=\"rounded-full p-2 hover:bg-white/20 transition-colors\"\n title=\"上一个\"\n >\n <SkipBack size={20} />\n </button>\n )}\n\n {/* 播放/暂停按钮 */}\n <button \n onClick={onPlayPause}\n className=\"rounded-full p-2 hover:bg-white/20 transition-colors\"\n title={isPlaying ? '暂停' : '播放'}\n >\n {isPlaying ? <Pause size={24} /> : <Play size={24} />}\n </button>\n\n {/* 下一个按钮 */}\n {showPrevNext && onNext && (\n <button \n onClick={onNext}\n className=\"rounded-full p-2 hover:bg-white/20 transition-colors\"\n title=\"下一个\"\n >\n <SkipForward size={20} />\n </button>\n )}\n </div>\n\n <div className=\"flex items-center gap-4\">\n {/* 标题和副标题 */}\n {(title || subtitle) && (\n <div className=\"hidden text-sm font-medium opacity-80 md:block\">\n {title}\n {subtitle && <span className=\"ml-2 text-xs opacity-60\">{subtitle}</span>}\n </div>\n )}\n\n {/* 列表循环切换(仅播放列表模式) */}\n {onToggleListLoop && (\n <button \n onClick={onToggleListLoop}\n className={`rounded-full p-2 transition-colors ${isListLooping ? 'bg-green-500/30 hover:bg-green-500/50' : 'hover:bg-white/20'}`}\n title={isListLooping ? '列表循环:开启' : '列表循环:关闭'}\n >\n <Repeat size={20} />\n </button>\n )}\n\n {/* 单节点循环切换 */}\n <button \n onClick={onToggleLoop}\n className={`rounded-full p-2 transition-colors ${isLooping ? 'bg-blue-500/30 hover:bg-blue-500/50' : 'hover:bg-white/20'}`}\n title={isLooping ? '单曲循环:开启' : '单曲循环:关闭'}\n >\n <Repeat1 size={20} />\n </button>\n\n {/* 相机重置按钮 */}\n {isCameraManual && onResetCamera && (\n <button \n onClick={onResetCamera}\n className=\"rounded-full p-2 bg-blue-500/30 text-blue-400 hover:bg-blue-500/50 hover:text-blue-300 transition-all animate-in zoom-in duration-300\"\n title=\"恢复初始视角\"\n >\n <Camera size={20} />\n </button>\n )}\n\n {/* 坐标轴切换 */}\n {onToggleAxes && (\n <button \n onClick={onToggleAxes}\n className={`rounded-full p-2 transition-colors ${showAxes ? 'bg-blue-500/30 hover:bg-blue-500/50' : 'hover:bg-white/20'}`}\n title=\"显示/隐藏坐标轴\"\n >\n <Grid3x3 size={20} />\n </button>\n )}\n\n {/* 设置 */}\n {showSettings && (\n <button \n onClick={onOpenSettings}\n className=\"rounded-full p-2 hover:bg-white/20 transition-colors\"\n title=\"资源设置\"\n >\n <Settings size={20} />\n </button>\n )}\n\n {/* 全屏 */}\n <button \n onClick={onToggleFullscreen}\n className=\"rounded-full p-2 hover:bg-white/20 transition-colors\"\n title={isFullscreen ? '退出全屏' : '全屏'}\n >\n {isFullscreen ? <Minimize size={20} /> : <Maximize size={20} />}\n </button>\n </div>\n </div>\n </div>\n );\n};\n\n","import React from 'react';\nimport { X, Check, Image as ImageIcon, Music, Video, User } from 'lucide-react';\nimport { MMDResourceItem, MMDResourceOptions, ResourceOption } from '../types';\n\ninterface SettingsPanelProps {\n mode: 'list' | 'options';\n \n // List Mode Props\n items?: MMDResourceItem[];\n currentId?: string;\n onSelectId?: (id: string) => void;\n \n // Options Mode Props\n options?: MMDResourceOptions;\n currentSelection?: {\n modelId?: string;\n motionId?: string;\n cameraId?: string;\n audioId?: string;\n stageId?: string;\n };\n onSelectOption?: (type: 'models'|'motions'|'cameras'|'audios'|'stages', id: string) => void;\n \n onClose: () => void;\n}\n\nexport const SettingsPanel: React.FC<SettingsPanelProps> = ({\n mode,\n items,\n currentId,\n onSelectId,\n options,\n currentSelection,\n onSelectOption,\n onClose,\n}) => {\n \n const renderListMode = () => {\n if (!items) return null;\n return (\n <div className=\"grid grid-cols-1 gap-2 p-4 sm:grid-cols-2\">\n {items.map((item) => (\n <button\n key={item.id}\n onClick={() => onSelectId?.(item.id)}\n className={`group flex items-center gap-3 rounded-lg p-3 transition-all ${\n currentId === item.id \n ? 'bg-blue-500/20 ring-1 ring-blue-500' \n : 'bg-white/5 hover:bg-white/10'\n }`}\n >\n <div className=\"flex h-12 w-12 flex-shrink-0 items-center justify-center rounded bg-black/20 overflow-hidden\">\n {item.thumbnail ? (\n <img src={item.thumbnail} alt={item.name} className=\"h-full w-full object-cover\" />\n ) : (\n <Video size={20} className=\"opacity-50\" />\n )}\n </div>\n <div className=\"flex-1 text-left\">\n <div className={`font-medium ${currentId === item.id ? 'text-blue-400' : 'text-white'}`}>\n {item.name}\n </div>\n {item.description && (\n <div className=\"text-xs text-white/50 truncate\">{item.description}</div>\n )}\n </div>\n {currentId === item.id && <Check size={16} className=\"text-blue-400\" />}\n </button>\n ))}\n </div>\n );\n };\n\n const renderOptionGroup = (\n title: string, \n icon: React.ReactNode, \n type: 'models'|'motions'|'cameras'|'audios'|'stages',\n list: ResourceOption[] = [],\n currentVal?: string\n ) => {\n if (!list || list.length === 0) return null;\n \n return (\n <div className=\"mb-6\">\n <div className=\"mb-3 flex items-center gap-2 text-sm font-medium text-white/70\">\n {icon}\n <span>{title}</span>\n </div>\n <div className=\"grid grid-cols-2 gap-2 sm:grid-cols-3\">\n {list.map(opt => (\n <button\n key={opt.id}\n onClick={() => onSelectOption?.(type, opt.id)}\n className={`relative flex flex-col items-center gap-2 rounded-lg p-2 text-center transition-all ${\n currentVal === opt.id \n ? 'bg-blue-500/20 ring-1 ring-blue-500' \n : 'bg-white/5 hover:bg-white/10'\n }`}\n >\n {opt.thumbnail ? (\n <img src={opt.thumbnail} alt={opt.name} className=\"h-16 w-full rounded object-cover bg-black/20\" />\n ) : (\n <div className=\"flex h-16 w-full items-center justify-center rounded bg-black/20\">\n <div className=\"text-xs opacity-30\">{opt.name.slice(0, 2)}</div>\n </div>\n )}\n <div className={`w-full truncate text-xs ${currentVal === opt.id ? 'text-blue-400' : 'text-white/80'}`}>\n {opt.name}\n </div>\n {currentVal === opt.id && (\n <div className=\"absolute top-1 right-1 rounded-full bg-blue-500 p-0.5\">\n <Check size={10} className=\"text-white\" />\n </div>\n )}\n </button>\n ))}\n </div>\n </div>\n );\n };\n\n const renderOptionsMode = () => {\n if (!options) return null;\n return (\n <div className=\"p-4\">\n {renderOptionGroup('模型', <User size={16} />, 'models', options.models, currentSelection?.modelId)}\n {renderOptionGroup('动作', <Video size={16} />, 'motions', options.motions, currentSelection?.motionId)}\n {renderOptionGroup('镜头', <ImageIcon size={16} />, 'cameras', options.cameras, currentSelection?.cameraId)}\n {renderOptionGroup('音频', <Music size={16} />, 'audios', options.audios, currentSelection?.audioId)}\n {renderOptionGroup('舞台', <ImageIcon size={16} />, 'stages', options.stages, currentSelection?.stageId)}\n </div>\n );\n };\n\n return (\n <div className=\"absolute right-0 top-0 h-full w-full max-w-sm transform bg-[#1a1a1e]/95 backdrop-blur-md shadow-2xl transition-transform duration-300 ease-in-out overflow-y-auto z-20 border-l border-white/10\">\n <div className=\"sticky top-0 z-10 flex items-center justify-between border-b border-white/10 bg-[#1a1a1e]/95 p-4 backdrop-blur-md\">\n <h2 className=\"text-lg font-semibold text-white\">\n {mode === 'list' ? '播放列表' : '自定义场景'}\n </h2>\n <button \n onClick={onClose}\n className=\"rounded-full p-2 text-white/50 hover:bg-white/10 hover:text-white\"\n >\n <X size={20} />\n </button>\n </div>\n \n <div className=\"pb-20\">\n {mode === 'list' ? renderListMode() : renderOptionsMode()}\n </div>\n </div>\n );\n};\n\n","import React, { useState, useEffect } from 'react';\n\ninterface MMDPlayerEnhancedDebugInfoProps {\n isPlaying: boolean;\n isLooping: boolean;\n isFullscreen: boolean;\n showAxes: boolean;\n isLoading: boolean;\n currentResourceId?: string;\n currentResourceName?: string;\n mode: 'single' | 'list' | 'options';\n totalResources: number;\n}\n\nexport const MMDPlayerEnhancedDebugInfo: React.FC<MMDPlayerEnhancedDebugInfoProps> = ({\n isPlaying,\n isLooping,\n isFullscreen,\n showAxes,\n isLoading,\n currentResourceId,\n currentResourceName,\n mode,\n totalResources,\n}) => {\n const [memoryInfo, setMemoryInfo] = useState<any>(null);\n\n useEffect(() => {\n const timer = setInterval(() => {\n // 获取内存信息(仅在Chrome中可用)\n // @ts-ignore\n if (performance.memory) {\n // @ts-ignore\n const used = (performance.memory.usedJSHeapSize / 1048576).toFixed(1);\n // @ts-ignore\n const total = (performance.memory.totalJSHeapSize / 1048576).toFixed(1);\n // @ts-ignore\n const limit = (performance.memory.jsHeapSizeLimit / 1048576).toFixed(1);\n setMemoryInfo({ used, total, limit });\n }\n }, 1000);\n return () => clearInterval(timer);\n }, []);\n return (\n <div className=\"text-white text-xs font-mono\">\n <h3 className=\"text-sm font-bold mb-3 pb-2 border-b border-gray-700\">\n 🎮 MMDPlayerEnhanced Debug\n </h3>\n\n {/* 播放状态 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">播放状态</h4>\n <div className=\"space-y-1 pl-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">播放中:</span>\n <StatusBadge active={isPlaying} label={isPlaying ? 'Playing' : 'Paused'} />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">循环:</span>\n <StatusBadge active={isLooping} label={isLooping ? 'On' : 'Off'} />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">加载中:</span>\n <StatusBadge active={isLoading} label={isLoading ? 'Loading' : 'Ready'} />\n </div>\n </div>\n </div>\n\n {/* 视图状态 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">视图状态</h4>\n <div className=\"space-y-1 pl-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">全屏:</span>\n <StatusBadge active={isFullscreen} label={isFullscreen ? 'Yes' : 'No'} />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">坐标轴:</span>\n <StatusBadge active={showAxes} label={showAxes ? 'Show' : 'Hide'} />\n </div>\n </div>\n </div>\n\n {/* 资源信息 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">资源信息</h4>\n <div className=\"space-y-1 pl-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">模式:</span>\n <span className=\"text-blue-400 uppercase\">{mode}</span>\n </div>\n {mode === 'list' && (\n <>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">总数:</span>\n <span className=\"text-green-400\">{totalResources}</span>\n </div>\n {currentResourceId && (\n <div className=\"mt-2 p-2 bg-gray-800 rounded\">\n <div className=\"text-gray-400 text-[10px]\">当前资源</div>\n <div className=\"text-white truncate\">{currentResourceName || currentResourceId}</div>\n <div className=\"text-gray-500 text-[10px] mt-1 truncate\">ID: {currentResourceId}</div>\n </div>\n )}\n </>\n )}\n </div>\n </div>\n\n {/* 内存监控 */}\n {memoryInfo && (\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">内存监控 (Chrome only)</h4>\n <div className=\"space-y-2 p-2 bg-gray-800 rounded\">\n <div className=\"flex items-center justify-between text-[10px]\">\n <span className=\"text-gray-400\">已用:</span>\n <span className=\"text-yellow-400 font-bold\">{memoryInfo.used} MB</span>\n </div>\n <div className=\"flex items-center justify-between text-[10px]\">\n <span className=\"text-gray-400\">总计:</span>\n <span className=\"text-blue-400\">{memoryInfo.total} MB</span>\n </div>\n <div className=\"flex items-center justify-between text-[10px]\">\n <span className=\"text-gray-400\">限制:</span>\n <span className=\"text-gray-400\">{memoryInfo.limit} MB</span>\n </div>\n {/* 内存使用进度条 */}\n <div className=\"mt-2\">\n <div className=\"bg-gray-700 rounded-full h-2 overflow-hidden\">\n <div\n className={`h-full transition-all duration-300 ${\n (parseFloat(memoryInfo.used) / parseFloat(memoryInfo.limit)) * 100 > 80\n ? 'bg-red-500'\n : (parseFloat(memoryInfo.used) / parseFloat(memoryInfo.limit)) * 100 > 60\n ? 'bg-yellow-500'\n : 'bg-green-500'\n }`}\n style={{\n width: `${Math.min(100, (parseFloat(memoryInfo.used) / parseFloat(memoryInfo.limit)) * 100)}%`,\n }}\n />\n </div>\n <div className=\"text-[9px] text-gray-500 mt-1 text-center\">\n {((parseFloat(memoryInfo.used) / parseFloat(memoryInfo.limit)) * 100).toFixed(1)}%\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* 时间戳 */}\n <div className=\"mt-auto pt-4 border-t border-gray-700\">\n <div className=\"text-gray-500 text-[10px]\">\n Last Update: {new Date().toLocaleTimeString()}\n </div>\n </div>\n </div>\n );\n};\n\n// 辅助组件:状态徽章\nconst StatusBadge: React.FC<{ active: boolean; label: string }> = ({ active, label }) => (\n <span\n className={`px-2 py-0.5 rounded text-[10px] font-bold ${\n active\n ? 'bg-green-600 text-white'\n : 'bg-gray-700 text-gray-400'\n }`}\n >\n {label}\n </span>\n);\n\n\n\n","import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { MMDPlayerBase } from './MMDPlayerBase';\nimport { ControlPanel } from './ControlPanel';\nimport { SettingsPanel } from './SettingsPanel';\nimport { MMDPlayerEnhancedDebugInfo } from './MMDPlayerEnhancedDebugInfo';\nimport { \n MMDPlayerEnhancedProps,\n MMDResources, \n MMDResourceItem, \n MMDResourceOptions, \n MMDPlayerBaseRef \n} from '../types';\n\nexport const MMDPlayerEnhanced: React.FC<MMDPlayerEnhancedProps> = ({\n resources: propResources,\n resourcesList,\n resourceOptions,\n defaultResourceId,\n defaultSelection,\n stage,\n autoPlay = false,\n loop = true,\n volume: initialVolume = 1.0,\n muted: initialMuted = false,\n mobileOptimization,\n showDebugInfo = false,\n className,\n style,\n onLoad,\n onPlay,\n onPause,\n onEnded,\n ...rest\n}) => {\n // 模式判断\n const mode = resourcesList ? 'list' : (resourceOptions ? 'options' : 'single');\n \n // 内部状态\n const [currentResources, setCurrentResources] = useState<MMDResources | undefined>(propResources);\n const [currentId, setCurrentId] = useState<string | undefined>(defaultResourceId);\n const [selection, setSelection] = useState(defaultSelection || {});\n \n // 播放器状态\n const [isPlaying, setIsPlaying] = useState(autoPlay);\n const [volume, setVolume] = useState(initialVolume);\n const [isMuted, setIsMuted] = useState(initialMuted);\n const [isLoading, setIsLoading] = useState(true);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [showSettings, setShowSettings] = useState(false);\n const [showAxes, setShowAxes] = useState(false); // 坐标轴显示状态\n const [isLooping, setIsLooping] = useState(loop); // 循环状态\n \n // Refs\n const playerRef = useRef<MMDPlayerBaseRef>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // 初始化资源逻辑\n useEffect(() => {\n if (mode === 'list' && resourcesList) {\n const targetId = currentId || resourcesList[0]?.id;\n const item = resourcesList.find(i => i.id === targetId);\n if (item) {\n setCurrentResources(item.resources);\n setCurrentId(item.id);\n }\n } else if (mode === 'options' && resourceOptions) {\n // 构建 Resources 对象\n const res: MMDResources = { modelPath: '' };\n \n if (selection.modelId) {\n const m = resourceOptions.models.find(o => o.id === selection.modelId);\n if (m) res.modelPath = m.path;\n } else if (resourceOptions.models.length > 0) {\n // 默认选第一个模型\n const firstModel = resourceOptions.models[0];\n if (firstModel) {\n res.modelPath = firstModel.path;\n setSelection(s => ({ ...s, modelId: firstModel.id }));\n }\n }\n \n if (selection.motionId) {\n const m = resourceOptions.motions.find(o => o.id === selection.motionId);\n if (m) res.motionPath = m.path;\n }\n \n // ... 其他选项映射\n if (selection.cameraId) {\n const c = resourceOptions.cameras?.find(o => o.id === selection.cameraId);\n if (c) res.cameraPath = c.path;\n }\n\n if (selection.audioId) {\n const a = resourceOptions.audios?.find(o => o.id === selection.audioId);\n if (a) res.audioPath = a.path;\n }\n \n if (selection.stageId) {\n const s = resourceOptions.stages?.find(o => o.id === selection.stageId);\n if (s) res.stageModelPath = s.path;\n }\n\n setCurrentResources(res);\n } else {\n setCurrentResources(propResources);\n }\n }, [mode, resourcesList, resourceOptions, currentId, selection, propResources]);\n\n // 处理全屏\n const toggleFullscreen = useCallback(() => {\n if (!containerRef.current) return;\n \n if (!document.fullscreenElement) {\n containerRef.current.requestFullscreen().catch(err => {\n console.error(`Error attempting to enable fullscreen: ${err.message}`);\n });\n setIsFullscreen(true);\n } else {\n document.exitFullscreen();\n setIsFullscreen(false);\n }\n }, []);\n\n // 监听全屏变化 (Esc 退出)\n useEffect(() => {\n const handleFsChange = () => {\n setIsFullscreen(!!document.fullscreenElement);\n };\n document.addEventListener('fullscreenchange', handleFsChange);\n return () => document.removeEventListener('fullscreenchange', handleFsChange);\n }, []);\n\n // 回调处理\n const handlePlayPause = () => {\n if (isPlaying) {\n playerRef.current?.pause();\n } else {\n playerRef.current?.play();\n }\n setIsPlaying(!isPlaying);\n };\n \n const handleListSelect = (id: string) => {\n setCurrentId(id);\n setIsPlaying(true); // 切换后自动播放\n setShowSettings(false); // 手机端可能需要关闭\n };\n \n const handleOptionSelect = (type: string, id: string) => {\n setSelection(prev => {\n const next = { ...prev };\n if (type === 'models') next.modelId = id;\n if (type === 'motions') next.motionId = id;\n if (type === 'cameras') next.cameraId = id;\n if (type === 'audios') next.audioId = id;\n if (type === 'stages') next.stageId = id;\n return next;\n });\n };\n\n if (!currentResources) {\n return <div className=\"flex h-full w-full items-center justify-center bg-black text-white\">No Resources Configured</div>;\n }\n\n return (\n <div \n ref={containerRef}\n className={`relative overflow-hidden bg-black group flex ${className}`}\n style={style}\n >\n {/* 主播放器区域 */}\n <div className=\"flex-1 relative\">\n {/* 核心播放器 */}\n {/* Key 很重要:当资源变化时,通过改变 key 强制重置 BasePlayer,实现最彻底的清理和重新加载 */}\n <MMDPlayerBase\n key={mode === 'list' ? currentId : JSON.stringify(currentResources)}\n ref={playerRef}\n resources={currentResources}\n stage={stage}\n autoPlay={autoPlay} // 注意:这里 autoPlay 只在 mount 时生效\n loop={isLooping}\n volume={volume}\n muted={isMuted}\n showAxes={showAxes}\n mobileOptimization={mobileOptimization}\n onLoad={() => {\n setIsLoading(false);\n onLoad?.();\n if (isPlaying) playerRef.current?.play();\n }}\n onPlay={() => {\n setIsPlaying(true);\n onPlay?.();\n }}\n onPause={() => {\n setIsPlaying(false);\n onPause?.();\n }}\n onEnded={() => {\n setIsPlaying(false);\n onEnded?.();\n }}\n {...rest}\n />\n\n {/* 加载遮罩 */}\n {isLoading && (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center bg-black/50 backdrop-blur-sm\">\n <div className=\"h-10 w-10 animate-spin rounded-full border-4 border-white/20 border-t-blue-500\" />\n </div>\n )}\n\n {/* 控制栏 - 鼠标悬停或暂停时显示 */}\n <div className={`transition-opacity duration-300 ${isPlaying && !showSettings ? 'opacity-0 group-hover:opacity-100' : 'opacity-100'}`}>\n <ControlPanel\n isPlaying={isPlaying}\n isFullscreen={isFullscreen}\n isLooping={isLooping}\n showSettings={mode !== 'single'}\n showAxes={showAxes}\n title={mode === 'list' ? resourcesList?.find(i => i.id === currentId)?.name : undefined}\n onPlayPause={handlePlayPause}\n onToggleFullscreen={toggleFullscreen}\n onToggleLoop={() => setIsLooping(!isLooping)}\n onToggleAxes={() => setShowAxes(!showAxes)}\n onOpenSettings={() => setShowSettings(true)}\n />\n </div>\n\n {/* 设置面板 */}\n {showSettings && (mode === 'list' || mode === 'options') && (\n <SettingsPanel\n mode={mode}\n items={resourcesList}\n currentId={currentId}\n onSelectId={handleListSelect}\n options={resourceOptions}\n currentSelection={selection}\n onSelectOption={handleOptionSelect}\n onClose={() => setShowSettings(false)}\n />\n )}\n </div>\n\n {/* 调试信息面板 */}\n {showDebugInfo && (\n <div className=\"w-96 bg-gray-900/95 border-l border-gray-700 p-4 overflow-y-auto\">\n <MMDPlayerEnhancedDebugInfo\n isPlaying={isPlaying}\n isLooping={isLooping}\n isFullscreen={isFullscreen}\n showAxes={showAxes}\n isLoading={isLoading}\n currentResourceId={currentId}\n currentResourceName={\n mode === 'list' ? resourcesList?.find(i => i.id === currentId)?.name : undefined\n }\n mode={mode}\n totalResources={resourcesList?.length || 1}\n />\n </div>\n )}\n </div>\n );\n};\n\n","import React, { useState, useEffect } from 'react';\nimport { MMDPlaylistNode } from '../types';\n\ninterface MMDPlaylistDebugInfoProps {\n playlistName: string;\n currentIndex: number;\n currentNode: MMDPlaylistNode;\n totalNodes: number;\n isPlaying: boolean;\n isListLooping: boolean;\n isNodeLooping: boolean;\n preloadStrategy: 'none' | 'next' | 'all';\n isLoading: boolean;\n isFullscreen: boolean;\n showAxes: boolean;\n preloadedNodes: number[];\n}\n\nexport const MMDPlaylistDebugInfo: React.FC<MMDPlaylistDebugInfoProps> = ({\n playlistName,\n currentIndex,\n currentNode,\n totalNodes,\n isPlaying,\n isListLooping,\n isNodeLooping,\n preloadStrategy,\n isLoading,\n isFullscreen,\n showAxes,\n preloadedNodes,\n}) => {\n const [memoryInfo, setMemoryInfo] = useState<any>(null);\n\n useEffect(() => {\n const timer = setInterval(() => {\n // 获取内存信息(仅在Chrome中可用)\n // @ts-ignore\n if (performance.memory) {\n // @ts-ignore\n const used = (performance.memory.usedJSHeapSize / 1048576).toFixed(1);\n // @ts-ignore\n const total = (performance.memory.totalJSHeapSize / 1048576).toFixed(1);\n // @ts-ignore\n const limit = (performance.memory.jsHeapSizeLimit / 1048576).toFixed(1);\n setMemoryInfo({ used, total, limit });\n }\n }, 1000);\n return () => clearInterval(timer);\n }, []);\n return (\n <div className=\"text-white text-xs font-mono\">\n <h3 className=\"text-sm font-bold mb-3 pb-2 border-b border-gray-700\">\n 🎭 MMDPlaylist Debug\n </h3>\n\n {/* 播放列表信息 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">播放列表</h4>\n <div className=\"space-y-1 pl-2\">\n <div className=\"text-white truncate\">\n {playlistName}\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">进度:</span>\n <span className=\"text-blue-400\">\n {currentIndex + 1} / {totalNodes}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">列表循环:</span>\n <StatusBadge active={isListLooping} label={isListLooping ? 'On' : 'Off'} />\n </div>\n </div>\n </div>\n\n {/* 当前节点 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">当前节点</h4>\n <div className=\"p-2 bg-gray-800 rounded space-y-1\">\n <div className=\"text-white font-semibold truncate\">\n {currentNode.name}\n </div>\n <div className=\"text-gray-500 text-[10px] truncate\">\n ID: {currentNode.id}\n </div>\n {currentNode.duration && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">时长:</span>\n <span className=\"text-green-400\">{currentNode.duration}s</span>\n </div>\n )}\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">节点循环:</span>\n <StatusBadge active={isNodeLooping} label={isNodeLooping ? 'On' : 'Off'} />\n </div>\n </div>\n </div>\n\n {/* 播放状态 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">播放状态</h4>\n <div className=\"space-y-1 pl-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">播放中:</span>\n <StatusBadge active={isPlaying} label={isPlaying ? 'Playing' : 'Paused'} />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">加载中:</span>\n <StatusBadge active={isLoading} label={isLoading ? 'Loading' : 'Ready'} />\n </div>\n </div>\n </div>\n\n {/* 预加载策略 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">预加载策略</h4>\n <div className=\"space-y-1 pl-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">策略:</span>\n <span className={`px-2 py-0.5 rounded text-[10px] font-bold uppercase ${\n preloadStrategy === 'all' ? 'bg-red-600 text-white' :\n preloadStrategy === 'next' ? 'bg-yellow-600 text-white' :\n 'bg-gray-700 text-gray-400'\n }`}>\n {preloadStrategy}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">已预加载:</span>\n <span className=\"text-purple-400\">{preloadedNodes.length}</span>\n </div>\n {preloadedNodes.length > 0 && (\n <div className=\"mt-2 p-2 bg-gray-800 rounded\">\n <div className=\"text-gray-400 text-[10px] mb-1\">预加载节点索引</div>\n <div className=\"flex flex-wrap gap-1\">\n {preloadedNodes.map((idx) => (\n <span\n key={idx}\n className={`px-1.5 py-0.5 rounded text-[10px] ${\n idx === currentIndex\n ? 'bg-green-600 text-white font-bold'\n : 'bg-gray-700 text-gray-300'\n }`}\n >\n {idx}\n </span>\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* 视图状态 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">视图状态</h4>\n <div className=\"space-y-1 pl-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">全屏:</span>\n <StatusBadge active={isFullscreen} label={isFullscreen ? 'Yes' : 'No'} />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">坐标轴:</span>\n <StatusBadge active={showAxes} label={showAxes ? 'Show' : 'Hide'} />\n </div>\n </div>\n </div>\n\n {/* 内存监控 */}\n {memoryInfo && (\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">内存监控 (Chrome only)</h4>\n <div className=\"space-y-2 p-2 bg-gray-800 rounded\">\n <div className=\"flex items-center justify-between text-[10px]\">\n <span className=\"text-gray-400\">已用:</span>\n <span className=\"text-yellow-400 font-bold\">{memoryInfo.used} MB</span>\n </div>\n <div className=\"flex items-center justify-between text-[10px]\">\n <span className=\"text-gray-400\">总计:</span>\n <span className=\"text-blue-400\">{memoryInfo.total} MB</span>\n </div>\n <div className=\"flex items-center justify-between text-[10px]\">\n <span className=\"text-gray-400\">限制:</span>\n <span className=\"text-gray-400\">{memoryInfo.limit} MB</span>\n </div>\n {/* 内存使用进度条 */}\n <div className=\"mt-2\">\n <div className=\"bg-gray-700 rounded-full h-2 overflow-hidden\">\n <div\n className={`h-full transition-all duration-300 ${\n (parseFloat(memoryInfo.used) / parseFloat(memoryInfo.limit)) * 100 > 80\n ? 'bg-red-500'\n : (parseFloat(memoryInfo.used) / parseFloat(memoryInfo.limit)) * 100 > 60\n ? 'bg-yellow-500'\n : 'bg-green-500'\n }`}\n style={{\n width: `${Math.min(100, (parseFloat(memoryInfo.used) / parseFloat(memoryInfo.limit)) * 100)}%`,\n }}\n />\n </div>\n <div className=\"text-[9px] text-gray-500 mt-1 text-center\">\n {((parseFloat(memoryInfo.used) / parseFloat(memoryInfo.limit)) * 100).toFixed(1)}%\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* 节点列表 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">节点列表</h4>\n <div className=\"space-y-1 max-h-40 overflow-y-auto\">\n {Array.from({ length: totalNodes }).map((_, idx) => (\n <div\n key={idx}\n className={`px-2 py-1 rounded text-[10px] flex items-center justify-between ${\n idx === currentIndex\n ? 'bg-blue-600 text-white font-bold'\n : preloadedNodes.includes(idx)\n ? 'bg-yellow-900/50 text-yellow-300'\n : 'bg-gray-800 text-gray-400'\n }`}\n >\n <span>节点 {idx}</span>\n {idx === currentIndex && <span>▶</span>}\n {preloadedNodes.includes(idx) && idx !== currentIndex && <span>⏳</span>}\n </div>\n ))}\n </div>\n </div>\n\n {/* 时间戳 */}\n <div className=\"mt-auto pt-4 border-t border-gray-700\">\n <div className=\"text-gray-500 text-[10px]\">\n Last Update: {new Date().toLocaleTimeString()}\n </div>\n </div>\n </div>\n );\n};\n\n// 辅助组件:状态徽章\nconst StatusBadge: React.FC<{ active: boolean; label: string }> = ({ active, label }) => (\n <span\n className={`px-2 py-0.5 rounded text-[10px] font-bold ${\n active\n ? 'bg-green-600 text-white'\n : 'bg-gray-700 text-gray-400'\n }`}\n >\n {label}\n </span>\n);\n\n\n\n","import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { MMDPlayerBase } from './MMDPlayerBase';\nimport { ControlPanel } from './ControlPanel';\nimport { MMDPlaylistDebugInfo } from './MMDPlaylistDebugInfo';\nimport {\n MMDPlaylistProps,\n MMDPlaylistNode,\n MMDPlayerBaseRef,\n} from '../types';\n\n/**\n * MMDPlaylist - 播放列表管理器\n * \n * 核心功能:\n * - 管理多个播放节点\n * - 实现无缝切换(通过 key 变化触发组件重新挂载)\n * - 预加载策略 (none / next / all)\n * - 智能内存回收\n * - 播放列表 UI\n */\nexport const MMDPlaylist: React.FC<MMDPlaylistProps> = ({\n playlist,\n stage,\n mobileOptimization,\n onNodeChange,\n onPlaylistComplete,\n onError,\n showDebugInfo = false,\n className,\n style,\n}) => {\n const { nodes, loop = false, preload = 'none', autoPlay = false } = playlist;\n\n // 状态管理\n const [currentIndex, setCurrentIndex] = useState(0);\n const [isPlaying, setIsPlaying] = useState(autoPlay);\n const [isLoading, setIsLoading] = useState(true);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [showAxes, setShowAxes] = useState(false);\n const [isLooping, setIsLooping] = useState(false); // 单节点循环\n const [isListLooping, setIsListLooping] = useState(loop); // 列表循环\n const [showPlaylist, setShowPlaylist] = useState(false);\n const [isTransitioning, setIsTransitioning] = useState(false); // 切换过渡状态\n const [isCameraManual, setIsCameraManual] = useState(false);\n\n // Refs\n const playerRef = useRef<MMDPlayerBaseRef>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const preloadedRef = useRef<Set<number>>(new Set()); // 记录已预加载的节点索引\n\n // 获取当前节点\n const currentNode = nodes[currentIndex];\n\n // 节点切换 - 两阶段切换,特别关注物理引擎清理\n const goToNode = useCallback(\n (index: number) => {\n if (index < 0 || index >= nodes.length) return;\n if (isTransitioning) return; // 防止在过渡期间重复切换\n \n const node = nodes[index];\n if (!node) return;\n \n console.log(`[MMDPlaylist] Starting transition to node ${index}`);\n \n // 先暂停播放\n const wasPlaying = isPlaying;\n setIsPlaying(false);\n \n // 第一阶段:卸载旧播放器(包括物理引擎)\n setIsTransitioning(true);\n \n // 给物理引擎足够的时间完全清理\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setTimeout(() => {\n // 第二阶段:挂载新播放器\n console.log(`[MMDPlaylist] Loading new node ${index}`);\n setCurrentIndex(index);\n setIsLoading(true);\n onNodeChange?.(node, index);\n \n // 给新组件足够时间初始化\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setTimeout(() => {\n setIsTransitioning(false);\n \n // 切换后如果之前在播放,则自动播放新节点\n if (wasPlaying) {\n setIsPlaying(true);\n }\n \n console.log(`[MMDPlaylist] Transition to node ${index} completed`);\n }, 100);\n });\n });\n }, 300); // 给物理引擎更多清理时间(300ms)\n });\n });\n },\n [nodes, isPlaying, isTransitioning, onNodeChange]\n );\n\n // 上一个节点\n const handlePrevious = useCallback(() => {\n const prevIndex = currentIndex - 1;\n if (prevIndex >= 0) {\n goToNode(prevIndex);\n } else if (isListLooping) {\n // 如果列表循环,跳到最后一个\n goToNode(nodes.length - 1);\n }\n }, [currentIndex, isListLooping, nodes.length, goToNode]);\n\n // 下一个节点\n const handleNext = useCallback(() => {\n const nextIndex = currentIndex + 1;\n if (nextIndex < nodes.length) {\n goToNode(nextIndex);\n } else if (isListLooping) {\n // 如果列表循环,跳回第一个\n goToNode(0);\n } else {\n // 播放列表完成\n setIsPlaying(false);\n onPlaylistComplete?.();\n }\n }, [currentIndex, isListLooping, nodes.length, goToNode, onPlaylistComplete]);\n\n // 播放控制\n const handlePlayPause = useCallback(() => {\n if (isPlaying) {\n playerRef.current?.pause();\n setIsPlaying(false);\n } else {\n playerRef.current?.play();\n setIsPlaying(true);\n }\n }, [isPlaying]);\n\n // 全屏控制\n const toggleFullscreen = useCallback(() => {\n if (!containerRef.current) return;\n\n if (!document.fullscreenElement) {\n containerRef.current.requestFullscreen().catch((err) => {\n console.error(`Error attempting to enable fullscreen: ${err.message}`);\n });\n setIsFullscreen(true);\n } else {\n document.exitFullscreen();\n setIsFullscreen(false);\n }\n }, []);\n\n // 监听全屏变化\n useEffect(() => {\n const handleFsChange = () => {\n setIsFullscreen(!!document.fullscreenElement);\n };\n document.addEventListener('fullscreenchange', handleFsChange);\n return () => document.removeEventListener('fullscreenchange', handleFsChange);\n }, []);\n\n // 当前节点播放结束时的处理\n const handleEnded = useCallback(() => {\n if (isLooping) {\n // 如果单节点循环,重新播放当前节点\n playerRef.current?.play();\n } else {\n // 否则播放下一个节点\n handleNext();\n }\n }, [isLooping, handleNext]);\n\n // 预加载策略实现\n // 注意:当前架构下通过 key 变化实现资源切换,真正的预加载需要创建隐藏组件实例\n // 这里实现基础的预加载标记和日志,作为未来扩展的基础\n useEffect(() => {\n if (preload === 'none') return;\n\n if (preload === 'all') {\n // 标记所有节点为\"应该预加载\"(实际预加载需要后台资源加载器支持)\n nodes.forEach((node, idx) => {\n if (!preloadedRef.current.has(idx)) {\n preloadedRef.current.add(idx);\n console.log(`[MMDPlaylist] Preload strategy: all - marked node ${idx} (${node.name})`);\n }\n });\n } else if (preload === 'next') {\n // 预加载下一个节点\n const nextIndex = (currentIndex + 1) % nodes.length;\n const nextNode = nodes[nextIndex];\n if (nextNode && !preloadedRef.current.has(nextIndex)) {\n preloadedRef.current.add(nextIndex);\n console.log(`[MMDPlaylist] Preload strategy: next - marked node ${nextIndex} (${nextNode.name})`);\n }\n }\n }, [currentIndex, nodes, preload]);\n\n // 智能内存回收:清理已预加载但距离当前节点较远的资源标记\n useEffect(() => {\n if (preload === 'none' || preload === 'all') return;\n if (nodes.length === 0) return; // 防御性检查\n\n // 对于 'next' 策略,清理除当前和下一个之外的预加载标记\n const nextIndex = (currentIndex + 1) % nodes.length;\n const keepIndices = new Set([currentIndex, nextIndex]);\n \n const toRemove: number[] = [];\n preloadedRef.current.forEach((idx) => {\n // 确保索引在有效范围内\n if (idx >= nodes.length || !keepIndices.has(idx)) {\n toRemove.push(idx);\n }\n });\n\n if (toRemove.length > 0) {\n toRemove.forEach((idx) => {\n preloadedRef.current.delete(idx);\n console.log(`[MMDPlaylist] Memory cleanup: removed preload mark for node ${idx}`);\n });\n }\n }, [currentIndex, nodes.length, preload]);\n\n // 组件卸载时清理所有预加载标记\n useEffect(() => {\n return () => {\n console.log('[MMDPlaylist] Component unmounted, clearing all preload marks');\n preloadedRef.current.clear();\n };\n }, []);\n\n if (!currentNode) {\n return (\n <div className=\"flex h-full w-full items-center justify-center bg-black text-white\">\n 播放列表为空\n </div>\n );\n }\n\n // 是否显示上一个/下一个按钮\n const showPrevNext = nodes.length > 1;\n\n return (\n <div\n ref={containerRef}\n className={`relative overflow-hidden bg-black group flex h-full ${className}`}\n style={style}\n >\n {/* 主播放器区域 */}\n <div className=\"flex-1 relative\">\n {/* 核心播放器 - 通过 key 变化实现资源切换和自动清理 */}\n {!isTransitioning && (\n <MMDPlayerBase\n key={currentNode.id}\n ref={playerRef}\n resources={currentNode.resources}\n stage={{ ...stage, ...currentNode.stage }}\n autoPlay={autoPlay && currentIndex === 0} // 只有第一个节点自动播放\n loop={isLooping} // 单节点循环\n showAxes={showAxes}\n mobileOptimization={mobileOptimization}\n onLoad={() => {\n setIsLoading(false);\n if (isPlaying && currentIndex > 0) {\n // 切换节点后继续播放\n playerRef.current?.play();\n }\n }}\n onPlay={() => setIsPlaying(true)}\n onPause={() => setIsPlaying(false)}\n onCameraChange={(isManual) => setIsCameraManual(isManual)}\n onEnded={handleEnded}\n onError={onError}\n />\n )}\n\n {/* 加载/过渡遮罩 */}\n {(isLoading || isTransitioning) && (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center bg-black/50 backdrop-blur-sm\">\n <div className=\"flex flex-col items-center gap-3\">\n <div className=\"h-10 w-10 animate-spin rounded-full border-4 border-white/20 border-t-blue-500\" />\n <div className=\"text-sm text-white/80\">\n {isTransitioning ? '切换中...' : `正在加载 ${currentIndex + 1} / ${nodes.length}`}\n </div>\n </div>\n </div>\n )}\n\n {/* 控制栏 */}\n <div\n className={`transition-opacity duration-300 ${\n isPlaying && !showPlaylist ? 'opacity-0 group-hover:opacity-100' : 'opacity-100'\n }`}\n >\n <ControlPanel\n isPlaying={isPlaying}\n isFullscreen={isFullscreen}\n isLooping={isLooping}\n isListLooping={isListLooping}\n isCameraManual={isCameraManual}\n showSettings={true} // 显示播放列表按钮\n showAxes={showAxes}\n showPrevNext={showPrevNext}\n title={currentNode.name}\n subtitle={`${currentIndex + 1} / ${nodes.length}`}\n onPlayPause={handlePlayPause}\n onPrevious={handlePrevious}\n onNext={handleNext}\n onToggleFullscreen={toggleFullscreen}\n onToggleLoop={() => setIsLooping(!isLooping)}\n onToggleListLoop={() => setIsListLooping(!isListLooping)}\n onToggleAxes={() => setShowAxes(!showAxes)}\n onOpenSettings={() => setShowPlaylist(!showPlaylist)}\n onResetCamera={() => {\n playerRef.current?.resetCamera();\n setIsCameraManual(false);\n }}\n />\n </div>\n\n {/* 播放列表面板 */}\n {showPlaylist && (\n <div className=\"absolute inset-0 z-20 flex items-end bg-black/80 backdrop-blur-sm\">\n <div className=\"w-full max-h-[60vh] overflow-y-auto bg-gray-900/95 rounded-t-xl\">\n {/* 标题栏 */}\n <div className=\"sticky top-0 flex items-center justify-between bg-gray-800 px-4 py-3 border-b border-gray-700\">\n <div>\n <h3 className=\"text-white font-semibold\">{playlist.name}</h3>\n <p className=\"text-xs text-gray-400 mt-0.5\">\n 共 {nodes.length} 个节点\n </p>\n </div>\n <button\n onClick={() => setShowPlaylist(false)}\n className=\"p-2 hover:bg-white/10 rounded-lg transition-colors\"\n aria-label=\"关闭播放列表\"\n >\n <svg className=\"w-5 h-5 text-white\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* 节点列表 */}\n <div className=\"p-2\">\n {nodes.map((node, index) => (\n <button\n key={node.id}\n onClick={() => {\n goToNode(index);\n setShowPlaylist(false);\n }}\n className={`w-full flex items-center gap-3 p-3 rounded-lg mb-2 transition-all ${\n index === currentIndex\n ? 'bg-blue-600 text-white'\n : 'bg-gray-800 text-gray-300 hover:bg-gray-700'\n }`}\n >\n {/* 序号 */}\n <div\n className={`flex-shrink-0 w-8 h-8 rounded-full flex items-center justify-center text-sm font-semibold ${\n index === currentIndex ? 'bg-white/20' : 'bg-gray-700'\n }`}\n >\n {index + 1}\n </div>\n\n {/* 节点信息 */}\n <div className=\"flex-1 text-left\">\n <div className=\"font-medium\">{node.name}</div>\n {node.duration && (\n <div className=\"text-xs opacity-75 mt-0.5\">\n {Math.floor(node.duration / 60)}:{String(Math.floor(node.duration % 60)).padStart(2, '0')}\n </div>\n )}\n </div>\n\n {/* 当前播放指示器 */}\n {index === currentIndex && (\n <div className=\"flex-shrink-0\">\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n </div>\n )}\n </button>\n ))}\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* 调试信息面板 */}\n {showDebugInfo && (\n <div className=\"w-96 flex-shrink-0 bg-gray-900/95 border-l border-gray-700 p-4 overflow-y-auto h-full\">\n <MMDPlaylistDebugInfo\n playlistName={playlist.name}\n currentIndex={currentIndex}\n currentNode={currentNode}\n totalNodes={nodes.length}\n isPlaying={isPlaying}\n isListLooping={isListLooping}\n isNodeLooping={isLooping}\n preloadStrategy={preload}\n isLoading={isLoading || isTransitioning}\n isFullscreen={isFullscreen}\n showAxes={showAxes}\n preloadedNodes={Array.from(preloadedRef.current)}\n />\n </div>\n )}\n </div>\n );\n};\n\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { DialogueBoxProps, DialogueBoxTheme } from './types';\n\n// 注入全局样式\nif (typeof document !== 'undefined' && !document.getElementById('dialogue-box-animations')) {\n const style = document.createElement('style');\n style.id = 'dialogue-box-animations';\n style.textContent = `\n @keyframes gradientShift {\n 0%, 100% { background-position: 0% 50%; }\n 50% { background-position: 100% 50%; }\n }\n \n @keyframes shimmer {\n 0% { background-position: -200% 0; }\n 100% { background-position: 200% 0; }\n }\n \n @keyframes cursorBlink {\n 0%, 100% { opacity: 1; transform: scaleY(1); }\n 50% { opacity: 0.3; transform: scaleY(0.8); }\n }\n \n @keyframes textFadeIn {\n from { opacity: 0; transform: translateY(2px); }\n to { opacity: 1; transform: translateY(0); }\n }\n \n @keyframes bounce {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-4px); }\n }\n `;\n document.head.appendChild(style);\n}\n\n/** 默认主题配置 - 白色主色调 */\nconst defaultTheme: DialogueBoxTheme = {\n backgroundColor: 'rgba(255, 255, 255, 0.15)',\n borderColor: 'rgba(255, 255, 255, 0.25)',\n textColor: '#ffffff',\n speakerBgColor: 'rgba(255, 255, 255, 0.25)',\n speakerTextColor: '#ffffff',\n opacity: 0.98,\n blur: '24px',\n continueHint: '点击继续 ▼',\n showContinueHint: true,\n};\n\n/**\n * DialogueBox - Galgame 风格对话框组件\n * \n * 功能:\n * - 打字机效果显示文本\n * - 说话者名称栏\n * - 点击继续提示\n * - 控制按钮(自动、快进、历史)\n */\nexport const DialogueBox: React.FC<DialogueBoxProps> = ({\n dialogue,\n theme: userTheme,\n isTyping = false,\n isAutoMode = false,\n onClick,\n onSkipTyping,\n onToggleAuto,\n onOpenHistory,\n onSkip,\n onResetCamera,\n isCameraManual = false,\n showControls = true,\n showSkipButton = true,\n showAutoButton = true,\n showHistoryButton = true,\n className,\n}) => {\n const theme = { ...defaultTheme, ...userTheme };\n const [displayedText, setDisplayedText] = useState('');\n const [isComplete, setIsComplete] = useState(false);\n const [isMounted, setIsMounted] = useState(false);\n const typingRef = useRef<NodeJS.Timeout | null>(null);\n const currentTextRef = useRef<string>('');\n\n // 避免 SSR hydration 错误\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n // 打字机效果\n useEffect(() => {\n if (!dialogue) {\n setDisplayedText('');\n setIsComplete(false);\n return;\n }\n\n const text = dialogue.text;\n const speed = dialogue.typeSpeed ?? 50;\n\n // 清除之前的定时器\n if (typingRef.current) {\n clearTimeout(typingRef.current);\n }\n\n // 重置状态\n setDisplayedText('');\n setIsComplete(false);\n currentTextRef.current = text;\n\n let index = 0;\n\n const typeNext = () => {\n if (index < text.length && currentTextRef.current === text) {\n setDisplayedText(text.slice(0, index + 1));\n index++;\n typingRef.current = setTimeout(typeNext, speed);\n } else if (currentTextRef.current === text) {\n setIsComplete(true);\n }\n };\n\n // 开始打字\n typingRef.current = setTimeout(typeNext, speed);\n\n return () => {\n if (typingRef.current) {\n clearTimeout(typingRef.current);\n }\n };\n }, [dialogue]);\n\n // 跳过打字动画\n const handleSkipTyping = useCallback(() => {\n if (typingRef.current) {\n clearTimeout(typingRef.current);\n }\n if (dialogue) {\n setDisplayedText(dialogue.text);\n setIsComplete(true);\n }\n onSkipTyping?.();\n }, [dialogue, onSkipTyping]);\n\n // 处理点击\n const handleClick = useCallback(() => {\n if (!isComplete) {\n handleSkipTyping();\n } else {\n onClick?.();\n }\n }, [isComplete, handleSkipTyping, onClick]);\n\n if (!dialogue) {\n return null;\n }\n\n const speakerColor = dialogue.speakerColor || theme.speakerBgColor;\n\n console.log('[DialogueBox] Rendering:', { \n speaker: dialogue.speaker, \n text: dialogue.text,\n displayedText,\n isComplete \n });\n\n const dialogueContent = (\n <div\n className={`${className || ''}`}\n style={{ \n position: 'fixed',\n bottom: 0,\n left: 0,\n right: 0,\n height: '30vh',\n minHeight: '200px',\n maxHeight: '30vh',\n zIndex: 1,\n pointerEvents: 'auto',\n }}\n >\n {/* 对话框主体 - 占满容器宽度和高度 */}\n <div\n className=\"w-full h-full rounded-t-3xl border cursor-pointer select-none transition-all hover:border-white/50 hover:shadow-2xl flex flex-col relative overflow-hidden\"\n onClick={handleClick}\n style={{\n borderColor: theme.borderColor,\n backdropFilter: `blur(${theme.blur}) saturate(200%)`,\n WebkitBackdropFilter: `blur(${theme.blur}) saturate(200%)`,\n opacity: theme.opacity,\n pointerEvents: 'auto',\n position: 'relative',\n display: 'flex',\n background: `linear-gradient(135deg, \n rgba(255, 255, 255, 0.15) 0%, \n rgba(255, 255, 255, 0.12) 50%, \n rgba(255, 255, 255, 0.1) 100%)`,\n boxShadow: `\n 0 -8px 40px rgba(255, 255, 255, 0.1),\n 0 -4px 16px rgba(255, 255, 255, 0.05),\n inset 0 1px 0 rgba(255, 255, 255, 0.3),\n inset 0 -1px 0 rgba(255, 255, 255, 0.1)\n `,\n }}\n >\n {/* 装饰性渐变层 - 柔和的彩虹渐变 */}\n <div \n className=\"absolute inset-0 opacity-20 pointer-events-none\"\n style={{\n background: `linear-gradient(45deg, \n rgba(255, 182, 193, 0.2) 0%, \n rgba(173, 216, 230, 0.2) 25%,\n rgba(221, 160, 221, 0.2) 50%,\n rgba(255, 218, 185, 0.2) 75%,\n rgba(255, 182, 193, 0.2) 100%)`,\n backgroundSize: '400% 400%',\n animation: 'gradientShift 15s ease infinite',\n }}\n />\n \n {/* 顶部高光 - 更明显的白色光泽 */}\n <div \n className=\"absolute top-0 left-0 right-0 h-1\"\n style={{\n background: 'linear-gradient(90deg, transparent, rgba(255,255,255,0.6), transparent)',\n }}\n />\n \n {/* 底部柔和光晕 */}\n <div \n className=\"absolute bottom-0 left-0 right-0 h-px\"\n style={{\n background: 'linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent)',\n }}\n />\n {/* 控制按钮区域 - 放在对话框内部顶部 */}\n {showControls && (\n <div className=\"flex justify-end gap-3 px-6 pt-4 pb-2 flex-shrink-0 relative z-10\">\n {showHistoryButton && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onOpenHistory?.();\n }}\n className=\"px-4 py-2 text-xs rounded-xl text-white font-medium hover:text-white transition-all backdrop-blur-lg border border-white/30 hover:border-white/50 hover:scale-105 active:scale-95 shadow-lg\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.15))',\n boxShadow: '0 4px 16px rgba(255, 255, 255, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\n }}\n title=\"历史记录\"\n >\n 📜 历史\n </button>\n )}\n {isCameraManual && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onResetCamera?.();\n }}\n className=\"px-4 py-2 text-xs rounded-xl text-white font-medium hover:text-white transition-all backdrop-blur-lg border border-blue-400/50 hover:border-blue-400 hover:scale-105 active:scale-95 shadow-lg animate-in zoom-in duration-300\"\n style={{\n background: 'linear-gradient(135deg, rgba(59, 130, 246, 0.3), rgba(37, 99, 235, 0.2))',\n boxShadow: '0 4px 16px rgba(59, 130, 246, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.2)',\n }}\n title=\"恢复初始视角\"\n >\n 🎥 恢复视角\n </button>\n )}\n {showAutoButton && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onToggleAuto?.();\n }}\n className={`px-4 py-2 text-xs rounded-xl font-medium transition-all backdrop-blur-lg border hover:scale-105 active:scale-95 shadow-lg ${isAutoMode\n ? 'border-white/50 text-white'\n : 'border-white/30 hover:border-white/50 text-white'\n }`}\n style={{\n background: isAutoMode \n ? 'linear-gradient(135deg, rgba(255, 255, 255, 0.35), rgba(255, 255, 255, 0.25))'\n : 'linear-gradient(135deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.15))',\n boxShadow: isAutoMode \n ? '0 4px 20px rgba(255, 255, 255, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.4)'\n : '0 4px 16px rgba(255, 255, 255, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\n }}\n title=\"自动播放\"\n >\n ▶ 自动\n </button>\n )}\n {showSkipButton && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onSkip?.();\n }}\n className=\"px-4 py-2 text-xs rounded-xl text-white font-medium hover:text-white transition-all backdrop-blur-lg border border-white/30 hover:border-white/50 hover:scale-105 active:scale-95 shadow-lg\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.15))',\n boxShadow: '0 4px 16px rgba(255, 255, 255, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\n }}\n title=\"快进\"\n >\n ⏩ 快进\n </button>\n )}\n </div>\n )}\n\n {/* 内容区域 - 使用 flex-1 占据剩余空间 */}\n <div className=\"px-8 pb-6 flex-1 flex flex-col justify-center overflow-y-auto relative z-10\">\n {/* 说话者名称 */}\n {dialogue.speaker && (\n <div\n className=\"inline-block px-6 py-2.5 rounded-2xl mb-4 text-sm font-bold shadow-2xl self-start relative overflow-hidden transition-all hover:scale-105\"\n style={{\n color: '#ffffff',\n background: `linear-gradient(135deg, \n rgba(255, 255, 255, 0.3) 0%, \n rgba(255, 255, 255, 0.2) 100%)`,\n backdropFilter: 'blur(20px)',\n WebkitBackdropFilter: 'blur(20px)',\n boxShadow: '0 8px 32px rgba(255, 255, 255, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.4)',\n border: '1px solid rgba(255, 255, 255, 0.3)',\n }}\n >\n {/* 装饰光效 */}\n <div \n className=\"absolute inset-0 opacity-30\"\n style={{\n background: 'linear-gradient(45deg, transparent 30%, rgba(255,255,255,0.5) 50%, transparent 70%)',\n backgroundSize: '200% 200%',\n animation: 'shimmer 3s infinite',\n }}\n />\n <span className=\"relative z-10 drop-shadow-lg\">{dialogue.speaker}</span>\n </div>\n )}\n\n {/* 对话文本 */}\n <div\n className=\"text-lg leading-relaxed relative\"\n style={{ \n color: theme.textColor,\n textShadow: '0 2px 8px rgba(0, 0, 0, 0.5)',\n }}\n >\n <span className=\"inline-block\" style={{\n animation: !isComplete ? 'textFadeIn 0.3s ease-out' : 'none'\n }}>\n {displayedText}\n </span>\n {/* 打字光标 - 增强效果 */}\n {!isComplete && (\n <span \n className=\"inline-block w-1 h-6 ml-1 align-middle\"\n style={{\n background: 'linear-gradient(to bottom, rgba(255, 255, 255, 1), rgba(255, 255, 255, 0.6))',\n animation: 'cursorBlink 1s ease-in-out infinite',\n boxShadow: '0 0 12px rgba(255, 255, 255, 0.8)',\n }}\n />\n )}\n </div>\n\n {/* 点击继续提示 */}\n {isComplete && theme.showContinueHint && (\n <div className=\"flex justify-end mt-4\">\n <span \n className=\"text-sm px-4 py-2 rounded-full backdrop-blur-lg font-medium\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.25), rgba(255, 255, 255, 0.15))',\n color: 'rgba(255, 255, 255, 0.9)',\n animation: 'bounce 2s ease-in-out infinite',\n boxShadow: '0 4px 16px rgba(255, 255, 255, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\n border: '1px solid rgba(255, 255, 255, 0.3)',\n }}\n >\n {theme.continueHint}\n </span>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n\n // 使用 Portal 将对话框渲染到 body,避免父容器的 overflow:hidden 影响\n // 仅在客户端挂载后使用 Portal,避免 SSR hydration 错误\n if (!isMounted) {\n return null;\n }\n\n // 确保有一个专门的容器用于 Portal 内容\n let portalContainer = document.getElementById('dialogue-portal-root');\n if (!portalContainer) {\n portalContainer = document.createElement('div');\n portalContainer.id = 'dialogue-portal-root';\n portalContainer.style.cssText = 'position: fixed; inset: 0; pointer-events: none; z-index: 999999;';\n document.body.appendChild(portalContainer);\n }\n return createPortal(dialogueContent, portalContainer);\n};\n\nexport default DialogueBox;\n\n\n\n\n","import React, { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { DialogueHistoryItem, DialogueBoxTheme } from './types';\n\ninterface HistoryPanelProps {\n /** 历史记录列表 */\n history: DialogueHistoryItem[];\n /** 主题配置 */\n theme?: DialogueBoxTheme;\n /** 关闭面板 */\n onClose: () => void;\n /** 样式 */\n className?: string;\n}\n\n/**\n * HistoryPanel - 对话历史记录面板\n * \n * 显示玩家已经阅读过的所有对话\n */\nexport const HistoryPanel: React.FC<HistoryPanelProps> = ({\n history,\n theme,\n onClose,\n className,\n}) => {\n // 避免 SSR hydration 错误\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n // 历史面板内容\n const historyContent = (\n <div\n className={`fixed inset-0 flex flex-col ${className}`}\n style={{\n zIndex: 1,\n pointerEvents: 'auto',\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.05))',\n }}\n onClick={onClose}\n >\n {/* 背景装饰层 - 柔和的彩虹渐变 */}\n <div \n className=\"absolute inset-0 opacity-25 pointer-events-none\"\n style={{\n background: `linear-gradient(45deg, \n rgba(255, 182, 193, 0.15) 0%, \n rgba(173, 216, 230, 0.15) 25%,\n rgba(221, 160, 221, 0.15) 50%,\n rgba(255, 218, 185, 0.15) 75%,\n rgba(255, 182, 193, 0.15) 100%)`,\n backgroundSize: '400% 400%',\n animation: 'gradientShift 15s ease infinite',\n }}\n />\n\n {/* 毛玻璃效果 */}\n <div \n className=\"absolute inset-0 pointer-events-none\"\n style={{\n backdropFilter: 'blur(32px) saturate(200%)',\n WebkitBackdropFilter: 'blur(32px) saturate(200%)',\n }}\n />\n\n {/* 内容容器 */}\n <div className=\"relative z-10 flex flex-col h-full\" onClick={(e) => e.stopPropagation()}>\n {/* 标题栏 */}\n <div \n className=\"flex items-center justify-between px-8 py-6 border-b relative\"\n style={{\n borderColor: 'rgba(255, 255, 255, 0.25)',\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.15))',\n backdropFilter: 'blur(20px)',\n WebkitBackdropFilter: 'blur(20px)',\n boxShadow: '0 4px 24px rgba(255, 255, 255, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\n }}\n >\n <h2 className=\"text-2xl font-bold text-white flex items-center gap-3\">\n <span className=\"text-3xl\">📜</span>\n <span style={{ textShadow: '0 2px 12px rgba(255, 255, 255, 0.3)' }}>对话历史</span>\n </h2>\n <button\n onClick={onClose}\n className=\"p-3 hover:bg-white/20 rounded-2xl transition-all text-white hover:text-white hover:scale-110 active:scale-95\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.15))',\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n boxShadow: '0 4px 16px rgba(255, 255, 255, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\n border: '1px solid rgba(255, 255, 255, 0.25)',\n }}\n aria-label=\"关闭\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* 历史记录列表 */}\n <div className=\"flex-1 overflow-y-auto p-6 space-y-4\">\n {history.length === 0 ? (\n <div className=\"text-center text-white/70 py-20 text-lg font-medium\" style={{ textShadow: '0 2px 8px rgba(0, 0, 0, 0.3)' }}>\n 暂无对话历史\n </div>\n ) : (\n history.map((item, index) => (\n <div\n key={`${item.nodeIndex}-${item.dialogueIndex}-${index}`}\n className=\"p-6 rounded-2xl transition-all hover:scale-[1.01] relative overflow-hidden cursor-pointer\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0.1))',\n backdropFilter: 'blur(16px)',\n WebkitBackdropFilter: 'blur(16px)',\n border: '1px solid rgba(255, 255, 255, 0.2)',\n boxShadow: '0 8px 24px rgba(255, 255, 255, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.25)',\n }}\n >\n {/* 装饰光效 */}\n <div \n className=\"absolute top-0 left-0 right-0 h-0.5\"\n style={{\n background: 'linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.5), transparent)',\n }}\n />\n \n {/* 说话者 */}\n {item.speaker && (\n <div\n className=\"inline-block px-5 py-2 rounded-xl mb-3 text-sm font-bold shadow-lg relative overflow-hidden\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.2))',\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n color: '#ffffff',\n boxShadow: '0 4px 12px rgba(255, 255, 255, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\n border: '1px solid rgba(255, 255, 255, 0.25)',\n }}\n >\n {/* 装饰光效 */}\n <div \n className=\"absolute inset-0 opacity-30\"\n style={{\n background: 'linear-gradient(45deg, transparent 30%, rgba(255, 255, 255, 0.4) 50%, transparent 70%)',\n backgroundSize: '200% 200%',\n animation: 'shimmer 3s infinite',\n }}\n />\n <span className=\"relative z-10 drop-shadow-lg\">{item.speaker}</span>\n </div>\n )}\n \n {/* 对话内容 */}\n <p\n className=\"text-base leading-relaxed\"\n style={{ \n color: '#ffffff',\n textShadow: '0 2px 8px rgba(0, 0, 0, 0.3)',\n }}\n >\n {item.text}\n </p>\n </div>\n ))\n )}\n </div>\n\n {/* 底部提示 */}\n <div \n className=\"px-8 py-4 border-t text-center\"\n style={{\n borderColor: 'rgba(255, 255, 255, 0.2)',\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0.1))',\n backdropFilter: 'blur(20px)',\n WebkitBackdropFilter: 'blur(20px)',\n boxShadow: 'inset 0 1px 0 rgba(255, 255, 255, 0.2)',\n }}\n >\n <span \n className=\"text-sm px-5 py-2.5 rounded-full inline-block font-medium\"\n style={{\n color: 'rgba(255, 255, 255, 0.9)',\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.15))',\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n boxShadow: '0 4px 16px rgba(255, 255, 255, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\n border: '1px solid rgba(255, 255, 255, 0.25)',\n textShadow: '0 2px 8px rgba(0, 0, 0, 0.3)',\n }}\n >\n 点击背景关闭\n </span>\n </div>\n </div>\n </div>\n );\n\n // 使用 Portal 将历史面板渲染到 body,确保显示在最上层\n // 仅在客户端挂载后使用 Portal,避免 SSR hydration 错误\n if (!isMounted) {\n return null;\n }\n\n // 确保有一个专门的容器用于 Portal 内容\n let portalContainer = document.getElementById('history-portal-root');\n if (!portalContainer) {\n portalContainer = document.createElement('div');\n portalContainer.id = 'history-portal-root';\n portalContainer.style.cssText = 'position: fixed; inset: 0; pointer-events: none; z-index: 999999;';\n document.body.appendChild(portalContainer);\n }\n return createPortal(historyContent, portalContainer);\n};\n\nexport default HistoryPanel;\n\n\n\n\n\n\n","import React, { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport interface LoadingScreenProps {\n /** 是否显示加载状态 */\n isLoading?: boolean;\n /** 加载文本 */\n loadingText?: string;\n /** 自定义类名 */\n className?: string;\n}\n\n/**\n * LoadingScreen - 加载界面组件\n * \n * 用于 MMD Visual Novel 的加载状态显示\n */\nexport const LoadingScreen: React.FC<LoadingScreenProps> = ({\n isLoading = true,\n loadingText = '正在准备场景中...',\n className = '',\n}) => {\n // 使用 state 确保 SSR 和客户端初始渲染一致\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n // 调试日志\n console.log('[LoadingScreen] Render state:', {\n isLoading,\n isMounted,\n });\n\n // 只在客户端挂载后才渲染\n if (!isMounted) {\n return null;\n }\n\n // 如果不显示,返回 null\n if (!isLoading) {\n console.log('[LoadingScreen] Not showing, returning null');\n return null;\n }\n\n const content = (\n <div\n className={`fixed inset-0 w-screen h-screen flex items-center justify-center ${className}`}\n style={{\n zIndex: 999998,\n pointerEvents: 'auto',\n backgroundColor: 'rgba(0, 0, 0, 0.4)',\n margin: 0,\n padding: 0,\n }}\n >\n {/* 白色毛玻璃层 */}\n <div\n className=\"absolute inset-0 w-full h-full pointer-events-none\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0.1))',\n backdropFilter: 'blur(32px) saturate(200%)',\n WebkitBackdropFilter: 'blur(32px) saturate(200%)',\n }}\n >\n {/* 背景装饰层 - 柔和的彩虹渐变 */}\n <div\n className=\"flex items-center justify-center flex-col inset-0 w-full h-full pointer-events-none\"\n style={{\n background: `linear-gradient(45deg, \n rgba(255, 182, 193, 0.2) 0%, \n rgba(173, 216, 230, 0.2) 25%,\n rgba(221, 160, 221, 0.2) 50%,\n rgba(255, 218, 185, 0.2) 75%,\n rgba(255, 182, 193, 0.2) 100%)`,\n backgroundSize: '400% 400%',\n animation: 'gradientShift 15s ease infinite',\n }}\n >\n <div\n className=\"text-lg font-medium text-white text-center px-6 py-3 rounded-2xl\">\n {loadingText}\n </div>\n </div>\n </div>\n </div>\n );\n\n // 使用 Portal 渲染到 body\n let portalContainer = document.getElementById('loading-screen-portal-root');\n if (!portalContainer) {\n portalContainer = document.createElement('div');\n portalContainer.id = 'loading-screen-portal-root';\n document.body.appendChild(portalContainer);\n }\n\n // 更新容器样式\n portalContainer.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n width: 100vw;\n height: 100vh;\n margin: 0;\n padding: 0;\n overflow: hidden;\n z-index: 999998;\n pointer-events: none;\n `.replace(/\\s+/g, ' ').trim();\n\n return createPortal(content, portalContainer);\n};\n\nLoadingScreen.displayName = 'LoadingScreen';\n\nexport default LoadingScreen;\n\n\n\n\n\n\n","import React, { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport interface StartScreenProps {\n /** 是否显示开始界面 */\n showStartScreen?: boolean;\n /** 脚本名称 */\n scriptName?: string;\n /** 开始按钮文本 */\n startText?: string;\n /** 设置按钮文本 */\n settingsText?: string;\n /** 关于按钮文本 */\n aboutText?: string;\n /** 点击开始回调 */\n onStart?: () => void;\n /** 自定义类名 */\n className?: string;\n}\n\n/**\n * VNModal - 简单的弹窗组件,用于设置和关于\n */\nconst VNModal: React.FC<{\n title: string;\n show: boolean;\n onClose: () => void;\n children: React.ReactNode;\n}> = ({ title, show, onClose, children }) => {\n if (!show) return null;\n\n return (\n <div \n className=\"fixed inset-0 flex items-center justify-center bg-black/40 backdrop-blur-xl z-[1000000] pointer-events-auto transition-all animate-in fade-in zoom-in-95 duration-300\"\n onClick={onClose}\n >\n <div \n className=\"w-full max-w-lg mx-4 p-8 rounded-[2.5rem] border border-white/40 shadow-[0_20px_80px_rgba(0,0,0,0.4)] relative overflow-hidden\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.15))',\n backdropFilter: 'blur(40px) saturate(200%)',\n WebkitBackdropFilter: 'blur(40px) saturate(200%)',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* 装饰性背景光晕 */}\n <div className=\"absolute -top-24 -right-24 w-64 h-64 bg-cyan-400/20 rounded-full blur-3xl pointer-events-none\" />\n <div className=\"absolute -bottom-24 -left-24 w-64 h-64 bg-pink-400/20 rounded-full blur-3xl pointer-events-none\" />\n\n {/* 标题 */}\n <div className=\"flex items-center justify-between mb-8 relative\">\n <div className=\"flex flex-col\">\n <h2 className=\"text-2xl font-bold text-white tracking-wider drop-shadow-lg\">{title}</h2>\n <div className=\"h-1.5 w-16 bg-white/60 rounded-full mt-2 shadow-[0_0_10px_rgba(255,255,255,0.5)]\" />\n </div>\n <button \n onClick={onClose}\n className=\"w-12 h-12 rounded-full flex items-center justify-center bg-white/10 hover:bg-white/30 text-white transition-all border border-white/20 shadow-inner\"\n >\n ✕\n </button>\n </div>\n \n {/* 内容 */}\n <div className=\"text-white leading-relaxed max-h-[50vh] overflow-y-auto pr-4 custom-scrollbar relative font-medium\">\n {children}\n </div>\n \n {/* 确定按钮 */}\n <div className=\"mt-10 flex justify-center relative\">\n <button\n onClick={onClose}\n className=\"px-14 py-3.5 rounded-2xl bg-white/20 hover:bg-white/40 text-white font-bold transition-all border border-white/50 shadow-[0_0_20px_rgba(255,255,255,0.2)] hover:scale-105 active:scale-95 tracking-[0.2em] uppercase text-sm\"\n >\n Confirm\n </button>\n </div>\n </div>\n </div>\n );\n};\n\n/**\n * StartScreen - 开始界面组件\n * \n * 用于 MMD Visual Novel 的开始界面显示\n */\nexport const StartScreen: React.FC<StartScreenProps> = ({\n showStartScreen = false,\n scriptName = '',\n startText = '开始游戏',\n settingsText = '游戏设置',\n aboutText = '关于作品',\n onStart,\n className = '',\n}) => {\n const [isMounted, setIsMounted] = useState(false);\n const [showSettings, setShowSettings] = useState(false);\n const [showAbout, setShowAbout] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n if (!isMounted) return null;\n if (!showStartScreen) return null;\n\n const content = (\n <div\n className={`fixed inset-0 w-screen h-screen flex items-center justify-center overflow-hidden ${className}`}\n style={{\n zIndex: 999999,\n pointerEvents: 'auto',\n backgroundColor: '#050505',\n margin: 0,\n padding: 0,\n }}\n >\n {/* 动态明亮背景层 */}\n <div className=\"absolute inset-0 w-full h-full overflow-hidden\">\n {/* 中心扩散光辉 */}\n <div \n className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[150vw] h-[150vw] opacity-40 pointer-events-none\"\n style={{\n background: 'radial-gradient(circle at center, rgba(57, 197, 187, 0.4) 0%, rgba(255, 182, 193, 0.2) 30%, transparent 70%)',\n filter: 'blur(60px)',\n animation: 'pulse 10s ease-in-out infinite'\n }}\n />\n \n {/* 漂浮的彩色星云 */}\n <div className=\"absolute inset-0 transition-opacity duration-1000\">\n <div className=\"absolute top-[-10%] left-[-10%] w-[60%] h-[60%] bg-cyan-500/10 rounded-full blur-[120px] animate-blob\" />\n <div className=\"absolute bottom-[-10%] right-[-10%] w-[60%] h-[60%] bg-purple-500/10 rounded-full blur-[120px] animate-blob animation-delay-2000\" />\n <div className=\"absolute top-[20%] right-[10%] w-[40%] h-[40%] bg-pink-500/10 rounded-full blur-[100px] animate-blob animation-delay-4000\" />\n </div>\n\n {/* 密集的微粒效果 */}\n <div className=\"absolute inset-0 opacity-60\">\n {[...Array(40)].map((_, i) => (\n <div \n key={i}\n className=\"absolute bg-white/40 rounded-full\"\n style={{\n width: Math.random() * 3 + 1 + 'px',\n height: Math.random() * 3 + 1 + 'px',\n top: Math.random() * 100 + '%',\n left: Math.random() * 100 + '%',\n boxShadow: '0 0 10px rgba(255,255,255,0.5)',\n animation: `floatParticle ${Math.random() * 10 + 10}s linear infinite`,\n animationDelay: `-${Math.random() * 20}s`\n }}\n />\n ))}\n </div>\n </div>\n\n {/* 主内容区域 */}\n <div className=\"relative z-10 w-full max-w-5xl mx-auto px-6 flex flex-col items-center\">\n \n {/* 标题区域 - 彻底解决重叠与间距 */}\n <div className=\"text-center mb-20 md:mb-32 group flex flex-col items-center\">\n {/* 上装饰线 */}\n <div className=\"w-40 h-px bg-gradient-to-r from-transparent via-white/60 to-transparent mb-10 shadow-[0_0_15px_rgba(255,255,255,0.5)]\" />\n \n <h1\n className=\"text-6xl md:text-8xl font-black text-white tracking-[0.15em] leading-tight select-none\"\n style={{\n filter: 'drop-shadow(0 0 20px rgba(255,255,255,0.3))',\n textShadow: '0 10px 30px rgba(0,0,0,0.5)'\n }}\n >\n {scriptName || 'VISUAL NOVEL'}\n </h1>\n \n {/* 下装饰区 - 增加明显间距 */}\n <div className=\"mt-10 flex flex-col items-center gap-4\">\n <div className=\"h-1 w-32 bg-white rounded-full opacity-80 shadow-[0_0_20px_rgba(255,255,255,0.8)]\" />\n <span className=\"text-sm md:text-base tracking-[0.8em] text-white/60 font-medium uppercase translate-x-[0.4em]\">\n Adventure System\n </span>\n </div>\n </div>\n\n {/* 交互按钮区 - 更加明亮精致 */}\n <div className=\"flex flex-col gap-10 items-center w-full max-w-sm\">\n \n {/* 核心开始按钮 */}\n <button\n onClick={onStart}\n className=\"group relative w-full h-20 flex items-center justify-center transition-all duration-500 active:scale-95\"\n >\n {/* 按钮底色 */}\n <div \n className=\"absolute inset-0 bg-white/10 backdrop-blur-2xl border-2 border-white/40 rounded-3xl transition-all duration-500 group-hover:bg-white/25 group-hover:border-white/70 group-hover:shadow-[0_0_50px_rgba(255,255,255,0.3)] group-hover:-inset-1\"\n />\n \n {/* 流光特效 */}\n <div className=\"absolute inset-0 overflow-hidden rounded-3xl pointer-events-none\">\n <div className=\"absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-700 bg-gradient-to-r from-transparent via-white/20 to-transparent -skew-x-[25deg] -translate-x-[200%] group-hover:translate-x-[200%] transition-transform duration-1000 ease-in-out\" />\n </div>\n \n <div className=\"relative flex items-center gap-6\">\n <div className=\"w-3 h-3 rounded-full bg-cyan-400 animate-ping opacity-75\" />\n <span className=\"text-2xl font-black text-white tracking-[0.4em] drop-shadow-md\">{startText}</span>\n <div className=\"w-3 h-3 rounded-full bg-pink-400 animate-ping opacity-75\" />\n </div>\n </button>\n\n {/* 功能按钮组 */}\n <div className=\"flex gap-8 w-full justify-center\">\n {[\n { text: settingsText, onClick: () => setShowSettings(true), color: 'rgba(57, 197, 187, 0.2)' },\n { text: aboutText, onClick: () => setShowAbout(true), color: 'rgba(255, 182, 193, 0.2)' }\n ].map((btn, idx) => (\n <button\n key={idx}\n onClick={btn.onClick}\n className=\"group relative flex-1 h-14 flex items-center justify-center transition-all duration-300 active:scale-95 overflow-hidden rounded-2xl\"\n >\n <div \n className=\"absolute inset-0 bg-white/5 backdrop-blur-xl border border-white/20 transition-all duration-300 group-hover:bg-white/15 group-hover:border-white/40\"\n />\n <div \n className=\"absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity\" \n style={{ background: btn.color }}\n />\n <span className=\"relative text-sm md:text-base font-bold text-white/80 group-hover:text-white tracking-[0.25em] transition-colors uppercase\">\n {btn.text}\n </span>\n </button>\n ))}\n </div>\n </div>\n </div>\n\n {/* 固定到底部的版本信息 - 不再随内容重叠 */}\n <div className=\"fixed bottom-10 left-0 right-0 text-center pointer-events-none select-none\">\n <div className=\"inline-block px-6 py-2 rounded-full bg-white/5 backdrop-blur-md border border-white/10\">\n <span className=\"text-[10px] md:text-xs text-white/30 tracking-[0.5em] font-light uppercase\">\n Ver 1.6.2 — ENGINE POWERED BY SA2KIT\n </span>\n </div>\n </div>\n\n {/* 弹窗内容 */}\n <VNModal title={settingsText} show={showSettings} onClose={() => setShowSettings(false)}>\n <div className=\"space-y-8 py-4\">\n <div className=\"space-y-4\">\n <div className=\"flex justify-between items-center text-sm font-bold tracking-widest text-white/60\">\n <span>MUSIC VOLUME</span>\n <span>80%</span>\n </div>\n <div className=\"h-3 bg-white/10 rounded-full p-0.5 border border-white/10\">\n <div className=\"h-full w-[80%] bg-gradient-to-r from-cyan-400 to-blue-500 rounded-full shadow-[0_0_15px_rgba(34,211,238,0.5)]\" />\n </div>\n </div>\n \n <div className=\"space-y-4\">\n <div className=\"flex justify-between items-center text-sm font-bold tracking-widest text-white/60\">\n <span>TEXT SPEED</span>\n <span>NORMAL</span>\n </div>\n <div className=\"flex gap-3\">\n {['SLOW', 'NORMAL', 'FAST'].map((s, i) => (\n <div key={s} className={`flex-1 py-3 rounded-xl border text-center text-xs font-bold transition-all cursor-pointer ${i===1 ? 'bg-white/20 border-white/60 text-white' : 'bg-white/5 border-white/10 text-white/40 hover:bg-white/10 hover:border-white/30'}`}>\n {s}\n </div>\n ))}\n </div>\n </div>\n \n <div className=\"pt-4 flex items-center justify-between opacity-50 italic text-xs border-t border-white/10\">\n <span>Auto Save Enabled</span>\n <span>Cloud Sync Active</span>\n </div>\n </div>\n </VNModal>\n\n <VNModal title={aboutText} show={showAbout} onClose={() => setShowAbout(false)}>\n <div className=\"space-y-8 py-4\">\n <div className=\"flex items-center gap-6 p-6 rounded-3xl bg-white/5 border border-white/10\">\n <div className=\"w-20 h-20 rounded-2xl bg-gradient-to-br from-cyan-400 via-blue-500 to-purple-600 flex items-center justify-center text-3xl font-black text-white shadow-[0_10px_30px_rgba(0,0,0,0.3)]\">\n S2\n </div>\n <div>\n <h3 className=\"text-2xl font-black text-white tracking-tight\">{scriptName || 'Project SA2'}</h3>\n <p className=\"text-xs font-bold text-white/40 tracking-widest mt-1 uppercase\">Visual Novel Experience</p>\n </div>\n </div>\n \n <div className=\"space-y-4 px-2\">\n <p className=\"text-white/80 font-medium leading-relaxed\">\n 采用 sa2kit 引擎构建的新一代实时 3D 视觉小说。结合了 MMD 实时渲染技术与交互式剧情分支系统,致力于打造极致的沉浸式叙事体验。\n </p>\n </div>\n\n <div className=\"grid grid-cols-2 gap-4 pt-6 border-t border-white/10\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[10px] font-bold text-white/30 tracking-widest\">DEVELOPER</span>\n <span className=\"text-xs font-bold text-white/80\">SA2KIT TEAM</span>\n </div>\n <div className=\"flex flex-col gap-1 text-right\">\n <span className=\"text-[10px] font-bold text-white/30 tracking-widest\">ENGINE</span>\n <span className=\"text-xs font-bold text-white/80\">THREE.JS / REACT</span>\n </div>\n </div>\n </div>\n </VNModal>\n\n {/* 注入所需的关键帧动画 */}\n <style>{`\n @keyframes floatParticle {\n from { transform: translateY(0) translateX(0); opacity: 0; }\n 20% { opacity: 1; }\n 80% { opacity: 1; }\n to { transform: translateY(-100vh) translateX(50px); opacity: 0; }\n }\n @keyframes blob {\n 0%, 100% { transform: scale(1); opacity: 0.1; }\n 50% { transform: scale(1.2); opacity: 0.2; }\n }\n .animate-blob {\n animation: blob 10s infinite;\n }\n .animation-delay-2000 {\n animation-delay: 2s;\n }\n .animation-delay-4000 {\n animation-delay: 4s;\n }\n .custom-scrollbar::-webkit-scrollbar {\n width: 6px;\n }\n .custom-scrollbar::-webkit-scrollbar-track {\n background: rgba(255, 255, 255, 0.05);\n border-radius: 10px;\n }\n .custom-scrollbar::-webkit-scrollbar-thumb {\n background: rgba(255, 255, 255, 0.3);\n border-radius: 10px;\n border: 2px solid transparent;\n background-clip: content-box;\n }\n `}</style>\n </div>\n );\n\n // Portal 逻辑保持不变\n let portalContainer = typeof document !== 'undefined' ? document.getElementById('start-screen-portal-root') : null;\n if (typeof document !== 'undefined' && !portalContainer) {\n portalContainer = document.createElement('div');\n portalContainer.id = 'start-screen-portal-root';\n document.body.appendChild(portalContainer);\n }\n\n if (portalContainer) {\n portalContainer.style.cssText = `\n position: fixed;\n top: 0; left: 0; right: 0; bottom: 0;\n width: 100vw; height: 100vh;\n margin: 0; padding: 0;\n overflow: hidden;\n z-index: 999999;\n pointer-events: none;\n `.replace(/\\s+/g, ' ').trim();\n }\n\n if (!portalContainer) return content;\n return createPortal(content, portalContainer);\n};\n\nStartScreen.displayName = 'StartScreen';\nexport default StartScreen;\n","import React from 'react';\nimport { LoadingScreen } from './LoadingScreen';\nimport { StartScreen } from './StartScreen';\n\n// 注入全局样式(如果还没有)\nif (typeof document !== 'undefined' && !document.getElementById('loading-overlay-animations')) {\n const style = document.createElement('style');\n style.id = 'loading-overlay-animations';\n style.textContent = `\n @keyframes gradientShift {\n 0%, 100% { background-position: 0% 50%; }\n 50% { background-position: 100% 50%; }\n }\n \n @keyframes pulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.9; transform: scale(1.05); }\n }\n `;\n document.head.appendChild(style);\n}\n\nexport interface LoadingOverlayProps {\n /** 是否显示加载状态 */\n isLoading?: boolean;\n /** 是否显示开始界面 */\n showStartScreen?: boolean;\n /** 脚本名称(用于开始界面) */\n scriptName?: string;\n /** 加载文本 */\n loadingText?: string;\n /** 开始按钮文本 */\n startText?: string;\n /** 设置按钮文本 */\n settingsText?: string;\n /** 关于按钮文本 */\n aboutText?: string;\n /** 点击开始回调 */\n onStart?: () => void;\n /** 自定义类名 */\n className?: string;\n}\n\n/**\n * LoadingOverlay - 加载遮罩和开始界面组件容器\n * \n * 用于 MMD Visual Novel 的加载状态和开始界面显示\n * 组合了 LoadingScreen 和 StartScreen 两个独立组件\n */\nexport const LoadingOverlay: React.FC<LoadingOverlayProps> = ({\n isLoading = true,\n showStartScreen = false,\n scriptName = '',\n loadingText = '正在准备场景中...',\n startText = '开始游戏',\n settingsText = '游戏设置',\n aboutText = '关于作品',\n onStart,\n className = '',\n}) => {\n return (\n <>\n <LoadingScreen\n isLoading={isLoading}\n loadingText={loadingText}\n className={className}\n />\n <StartScreen\n showStartScreen={showStartScreen}\n scriptName={scriptName}\n startText={startText}\n settingsText={settingsText}\n aboutText={aboutText}\n onStart={onStart}\n className={className}\n />\n </>\n );\n};\n\nLoadingOverlay.displayName = 'LoadingOverlay';\n\nexport default LoadingOverlay;\n\n\n\n\n\n\n\n","import React from 'react';\nimport { createPortal } from 'react-dom';\n\nexport interface SkipConfirmDialogProps {\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport const SkipConfirmDialog: React.FC<SkipConfirmDialogProps> = ({\n onConfirm,\n onCancel,\n}) => {\n const [isMounted, setIsMounted] = React.useState(false);\n\n React.useEffect(() => {\n setIsMounted(true);\n }, []);\n\n if (!isMounted) return null;\n\n const content = (\n <div \n className=\"fixed inset-0 flex items-center justify-center bg-black/40 backdrop-blur-sm pointer-events-auto\"\n style={{ zIndex: 999999 }}\n >\n <div \n className=\"p-8 rounded-3xl border border-white/30 shadow-2xl max-w-sm w-full mx-4 overflow-hidden relative\"\n style={{\n background: `linear-gradient(135deg, \n rgba(255, 255, 255, 0.2) 0%, \n rgba(255, 255, 255, 0.1) 100%)`,\n backdropFilter: 'blur(32px) saturate(200%)',\n WebkitBackdropFilter: 'blur(32px) saturate(200%)',\n }}\n >\n <h3 className=\"text-xl font-bold text-white mb-4 drop-shadow-md\">动画尚未播放完成</h3>\n <p className=\"text-white/90 mb-8 leading-relaxed drop-shadow-sm\">\n 当前场景的动画还没有完整播放一遍,是否直接跳转到下一个场景?\n </p>\n <div className=\"flex justify-end gap-4\">\n <button\n onClick={onCancel}\n className=\"px-6 py-2.5 rounded-2xl text-white/80 font-medium hover:text-white hover:bg-white/10 transition-all border border-white/10 hover:border-white/30\"\n >\n 取消\n </button>\n <button\n onClick={onConfirm}\n className=\"px-6 py-2.5 rounded-2xl bg-white/20 hover:bg-white/30 text-white font-bold transition-all border border-white/40 shadow-lg hover:scale-105 active:scale-95\"\n >\n 直接跳转\n </button>\n </div>\n </div>\n </div>\n );\n\n let portalContainer = document.getElementById('dialogue-portal-root');\n if (!portalContainer) {\n portalContainer = document.createElement('div');\n portalContainer.id = 'dialogue-portal-root';\n portalContainer.style.cssText = 'position: fixed; inset: 0; pointer-events: none; z-index: 999999;';\n document.body.appendChild(portalContainer);\n }\n\n return createPortal(content, portalContainer);\n};\n\nexport default SkipConfirmDialog;\n\n","import React from 'react';\nimport { createPortal } from 'react-dom';\nimport { DialogueChoice, DialogueBoxTheme } from './types';\n\nexport interface ChoiceMenuProps {\n choices: DialogueChoice[];\n onSelect: (choice: DialogueChoice) => void;\n theme?: DialogueBoxTheme;\n}\n\nexport const ChoiceMenu: React.FC<ChoiceMenuProps> = ({\n choices,\n onSelect,\n theme,\n}) => {\n const [isMounted, setIsMounted] = React.useState(false);\n\n React.useEffect(() => {\n setIsMounted(true);\n }, []);\n\n if (!isMounted) return null;\n\n const content = (\n <div \n className=\"fixed inset-0 flex flex-col items-center justify-center bg-black/20 backdrop-blur-sm pointer-events-auto transition-all animate-in fade-in duration-500\"\n style={{ zIndex: 1000000 }}\n >\n <div className=\"flex flex-col gap-4 w-full max-w-md px-6\">\n {choices.map((choice, index) => (\n <button\n key={index}\n onClick={() => onSelect(choice)}\n className=\"w-full py-4 px-8 rounded-2xl text-white font-bold text-lg transition-all border border-white/20 shadow-xl hover:scale-105 active:scale-95 group relative overflow-hidden\"\n style={{\n background: `linear-gradient(135deg, \n rgba(255, 255, 255, 0.2) 0%, \n rgba(255, 255, 255, 0.1) 100%)`,\n backdropFilter: 'blur(32px) saturate(200%)',\n WebkitBackdropFilter: 'blur(32px) saturate(200%)',\n }}\n >\n {/* 悬停光效 */}\n <div className=\"absolute inset-0 bg-white/10 opacity-0 group-hover:opacity-100 transition-opacity\" />\n <div className=\"absolute inset-0 bg-gradient-to-r from-transparent via-white/5 to-transparent -translate-x-full group-hover:translate-x-full transition-transform duration-1000 ease-in-out\" />\n \n <span className=\"relative z-10 drop-shadow-md\">{choice.text}</span>\n </button>\n ))}\n </div>\n </div>\n );\n\n let portalContainer = document.getElementById('dialogue-portal-root');\n if (!portalContainer) {\n portalContainer = document.createElement('div');\n portalContainer.id = 'dialogue-portal-root';\n portalContainer.style.cssText = 'position: fixed; inset: 0; pointer-events: none; z-index: 999999;';\n document.body.appendChild(portalContainer);\n }\n\n return createPortal(content, portalContainer);\n};\n\nexport default ChoiceMenu;\n\n","import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n forwardRef,\n useImperativeHandle,\n} from 'react';\nimport { MMDPlayerBase } from '../components/MMDPlayerBase';\nimport { MMDPlayerBaseRef } from '../types';\nimport { DialogueBox } from './DialogueBox';\nimport { HistoryPanel } from './HistoryPanel';\nimport { LoadingOverlay } from './LoadingOverlay';\nimport { SkipConfirmDialog } from './SkipConfirmDialog';\nimport { ChoiceMenu } from './ChoiceMenu';\nimport {\n MMDVisualNovelProps,\n MMDVisualNovelRef,\n VisualNovelNode,\n DialogueLine,\n DialogueHistoryItem,\n VisualEffect,\n} from './types';\n\n/**\n * MMDVisualNovel - Galgame 风格视觉小说组件\n * \n * 核心功能:\n * - 将 MMDPlaylist 封装为 Galgame 风格\n * - 每个节点包含:模型、动作、对话数组\n * - 用户阅读完对话后自动切换节点\n * - 打字机效果显示文本\n * - 支持自动播放、快进、历史记录\n */\nexport const MMDVisualNovel = forwardRef<MMDVisualNovelRef, MMDVisualNovelProps>(\n (\n {\n script,\n stage,\n mobileOptimization,\n dialogueTheme,\n autoStart = false,\n startText,\n settingsText,\n aboutText,\n initialNodeIndex = 0,\n initialDialogueIndex = 0,\n onNodeChange,\n onDialogueChange,\n onScriptComplete,\n onError,\n showDebugInfo = false,\n showSkipButton = true,\n showAutoButton = true,\n showHistoryButton = true,\n className,\n style,\n },\n ref\n ) => {\n const { nodes, loop = false } = script;\n\n // 状态管理\n const [currentNodeIndex, setCurrentNodeIndex] = useState(initialNodeIndex);\n const [currentDialogueIndex, setCurrentDialogueIndex] = useState(initialDialogueIndex);\n const [isLoading, setIsLoading] = useState(true);\n const [isAnimationPlaying, setIsAnimationPlaying] = useState(false); // 新增:追踪动画是否已开始播放\n const [isTransitioning, setIsTransitioning] = useState(false);\n const [isAutoMode, setIsAutoMode] = useState(false);\n const [isTyping, setIsTyping] = useState(false);\n const [showHistory, setShowHistory] = useState(false);\n const [history, setHistory] = useState<DialogueHistoryItem[]>([]);\n const [isStarted, setIsStarted] = useState(autoStart);\n const [isVmdFinished, setIsVmdFinished] = useState(false);\n const [pendingNodeIndex, setPendingNodeIndex] = useState<number | null>(null);\n const [showChoices, setShowChoices] = useState(false);\n const [isCameraManual, setIsCameraManual] = useState(false);\n const [variables, setVariables] = useState<Record<string, string | number | boolean>>({});\n const [activeEffect, setActiveEffect] = useState<VisualEffect | null>(null);\n\n // Refs\n const playerRef = useRef<MMDPlayerBaseRef>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const autoTimerRef = useRef<NodeJS.Timeout | null>(null);\n const typingCompleteRef = useRef(false);\n const isStartedRef = useRef(autoStart); // 用 ref 跟踪 isStarted 的当前值\n const lastAnimationTimeRef = useRef(0);\n const isVmdFinishedRef = useRef(false);\n const effectTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n // 获取当前节点和对话\n const currentNode = nodes[currentNodeIndex];\n const currentDialogue = currentNode?.dialogues[currentDialogueIndex] || null;\n\n // 添加对话到历史记录\n const addToHistory = useCallback((dialogue: DialogueLine, nodeIndex: number, dialogueIndex: number) => {\n setHistory((prev) => [\n ...prev,\n {\n nodeIndex,\n dialogueIndex,\n speaker: dialogue.speaker,\n text: dialogue.text,\n timestamp: Date.now(),\n },\n ]);\n }, []);\n\n // 触发特效\n const triggerEffect = useCallback((effect?: VisualEffect) => {\n if (!effect) return;\n \n // 清除旧的特效定时器\n if (effectTimerRef.current) {\n clearTimeout(effectTimerRef.current);\n }\n\n setActiveEffect(effect);\n \n // 自动清理\n effectTimerRef.current = setTimeout(() => {\n setActiveEffect(null);\n effectTimerRef.current = null;\n }, effect.duration || 1000);\n }, []);\n\n // 跳转到指定节点\n const goToNode = useCallback(\n (nodeIndex: number, force: boolean = false) => {\n if (nodeIndex < 0 || nodeIndex >= nodes.length) return;\n if (isTransitioning) return;\n\n const node = nodes[nodeIndex];\n if (!node) return;\n\n // 如果当前节点有 VMD 动画且未播放完成,且不是强制跳转,则弹出确认框\n const currentResources = nodes[currentNodeIndex]?.resources;\n if (!force && currentResources?.motionPath && !isVmdFinishedRef.current) {\n console.log('[MMDVisualNovel] VMD not finished, showing confirmation');\n setPendingNodeIndex(nodeIndex);\n return;\n }\n\n console.log(`[MMDVisualNovel] Transitioning to node ${nodeIndex}`);\n\n // 🔧 立即设置加载状态,确保遮罩覆盖整个切换过程\n setIsTransitioning(true);\n setIsLoading(true);\n setIsAnimationPlaying(false); // 重置动画播放状态\n setIsVmdFinished(false); // 重置 VMD 完成状态\n isVmdFinishedRef.current = false; // 同步重置 ref\n setPendingNodeIndex(null); // 清除挂起的跳转\n setShowChoices(false); // 隐藏选项菜单\n lastAnimationTimeRef.current = 0; // 重置动画时间记录\n\n // 给物理引擎清理时间后再更新节点\n setTimeout(() => {\n // 更新节点\n setCurrentNodeIndex(nodeIndex);\n setCurrentDialogueIndex(0);\n typingCompleteRef.current = false;\n\n // 添加第一条对话到历史\n if (node.dialogues.length > 0 && node?.dialogues[0] !== undefined) {\n addToHistory(node.dialogues[0], nodeIndex, 0);\n }\n\n onNodeChange?.(node, nodeIndex);\n if (node.dialogues.length > 0 && node?.dialogues[0] !== undefined) {\n onDialogueChange?.(node.dialogues[0], 0, nodeIndex);\n }\n\n // 🔧 结束过渡状态,但保持加载状态直到新模型完全加载\n // 注意:isLoading 和 isAnimationPlaying 会在 MMDPlayerBase 的回调中更新\n setTimeout(() => {\n setIsTransitioning(false);\n console.log(`[MMDVisualNovel] Transition to node ${nodeIndex} completed, waiting for model load`);\n }, 100);\n }, 300);\n },\n [nodes, isTransitioning, addToHistory, onNodeChange, onDialogueChange, currentNodeIndex]\n );\n\n // 判定并跳转到下一个节点\n const triggerNodeTransition = useCallback(() => {\n if (!currentNode) return;\n \n let nextNodeIndex = currentNodeIndex + 1;\n\n // 如果存在分支判定逻辑\n if (currentNode.nextCondition) {\n const { key, map, defaultIndex } = currentNode.nextCondition;\n const val = variables[key];\n if (val !== undefined && map[val as string | number] !== undefined) {\n nextNodeIndex = map[val as string | number]!;\n console.log(`[MMDVisualNovel] Branching: ${key}=${val} -> node ${nextNodeIndex}`);\n } else {\n nextNodeIndex = defaultIndex;\n }\n }\n\n if (nextNodeIndex < nodes.length && nextNodeIndex >= 0) {\n goToNode(nextNodeIndex);\n } else if (loop) {\n goToNode(0);\n } else {\n // 剧本结束\n onScriptComplete?.();\n }\n }, [currentNode, currentNodeIndex, nodes.length, loop, variables, goToNode, onScriptComplete]);\n\n // 切换到下一条对话\n const goToNextDialogue = useCallback(() => {\n if (!currentNode) return;\n\n // 如果当前对话行自带分支,且还未显示分支,则先显示分支\n if (currentDialogue?.choices && currentDialogue.choices.length > 0 && !showChoices) {\n setShowChoices(true);\n return;\n }\n\n // 清除自动播放定时器\n if (autoTimerRef.current) {\n clearTimeout(autoTimerRef.current);\n autoTimerRef.current = null;\n }\n\n const nextDialogueIndex = currentDialogueIndex + 1;\n\n if (nextDialogueIndex < currentNode.dialogues.length && currentNode?.dialogues[nextDialogueIndex] !== undefined) {\n // 还有更多对话\n const nextDialogue = currentNode.dialogues[nextDialogueIndex];\n setCurrentDialogueIndex(nextDialogueIndex);\n addToHistory(nextDialogue, currentNodeIndex, nextDialogueIndex);\n onDialogueChange?.(nextDialogue, nextDialogueIndex, currentNodeIndex);\n typingCompleteRef.current = false;\n } else if (currentNode.choices && currentNode.choices.length > 0) {\n // 当前节点末尾有分支选项(兼容旧版)\n setShowChoices(true);\n } else {\n // 无分支,自动切换到下一个节点\n triggerNodeTransition();\n }\n }, [currentNode, currentDialogue, currentDialogueIndex, currentNodeIndex, nodes.length, loop, addToHistory, onDialogueChange, onScriptComplete, showChoices, variables, goToNode, triggerNodeTransition]);\n\n // 跳转到指定对话\n const goToDialogue = useCallback(\n (dialogueIndex: number) => {\n if (!currentNode) return;\n const dialogue = currentNode.dialogues[dialogueIndex];\n\n if (dialogueIndex < 0 || dialogueIndex >= currentNode.dialogues.length || dialogue === undefined) return;\n setCurrentDialogueIndex(dialogueIndex);\n addToHistory(dialogue, currentNodeIndex, dialogueIndex);\n onDialogueChange?.(dialogue, dialogueIndex, currentNodeIndex);\n typingCompleteRef.current = false;\n },\n [currentNode, currentNodeIndex, addToHistory, onDialogueChange]\n );\n\n // 处理点击对话框\n const handleDialogueClick = useCallback(() => {\n if (!typingCompleteRef.current) {\n // 还在打字中,跳过打字动画\n typingCompleteRef.current = true;\n return;\n }\n\n // 打字完成,切换到下一条对话\n goToNextDialogue();\n }, [goToNextDialogue]);\n\n // 处理打字完成\n const handleTypingComplete = useCallback(() => {\n typingCompleteRef.current = true;\n setIsTyping(false);\n\n // 如果是自动模式或不需要等待点击\n if (isAutoMode || currentDialogue?.waitForClick === false) {\n const delay = currentDialogue?.autoDelay ?? 2000;\n autoTimerRef.current = setTimeout(() => {\n goToNextDialogue();\n }, delay);\n }\n }, [isAutoMode, currentDialogue, goToNextDialogue]);\n\n // 监听打字状态\n useEffect(() => {\n if (currentDialogue) {\n setIsTyping(true);\n typingCompleteRef.current = false;\n\n // 计算打字完成时间\n const text = currentDialogue.text;\n const speed = currentDialogue.typeSpeed ?? 50;\n const typingDuration = text.length * speed;\n\n const timer = setTimeout(() => {\n handleTypingComplete();\n }, typingDuration);\n\n return () => clearTimeout(timer);\n }\n // 如果没有对话,返回空的清理函数\n return undefined;\n }, [currentDialogue, handleTypingComplete]);\n\n useEffect(() => {\n if (currentDialogue?.effect) {\n triggerEffect(currentDialogue.effect);\n }\n }, [currentNodeIndex, currentDialogueIndex, triggerEffect]);\n\n // 切换自动模式\n const toggleAutoMode = useCallback(() => {\n setIsAutoMode((prev) => !prev);\n }, []);\n\n // 快进 - 跳到下一个节点\n const handleSkip = useCallback(() => {\n if (currentNode?.choices && currentNode.choices.length > 0) {\n setShowChoices(true);\n return;\n }\n \n const nextNodeIndex = currentNodeIndex + 1;\n if (nextNodeIndex < nodes.length) {\n goToNode(nextNodeIndex);\n } else if (loop) {\n goToNode(0);\n } else {\n onScriptComplete?.();\n }\n }, [currentNodeIndex, nodes.length, loop, goToNode, onScriptComplete]);\n\n // 开始游戏\n const handleStart = useCallback(() => {\n setIsStarted(true);\n isStartedRef.current = true; // 同步更新 ref\n if (currentNode && currentNode.dialogues.length > 0 && currentNode?.dialogues[0] !== undefined) {\n addToHistory(currentNode?.dialogues[0], currentNodeIndex, 0);\n }\n // 启动动画播放\n setTimeout(() => {\n playerRef.current?.play();\n }, 100);\n }, [currentNode, currentNodeIndex, addToHistory]);\n\n // 暴露给父组件的方法\n useImperativeHandle(\n ref,\n () => ({\n goToNode,\n goToDialogue,\n getCurrentNodeIndex: () => currentNodeIndex,\n getCurrentDialogueIndex: () => currentDialogueIndex,\n getHistory: () => history,\n getVariables: () => variables,\n setVariable: (key: string, value: string | number | boolean) => {\n setVariables(prev => ({ ...prev, [key]: value }));\n },\n setAutoMode: setIsAutoMode,\n skipTyping: () => {\n typingCompleteRef.current = true;\n },\n triggerEffect,\n }),\n [goToNode, goToDialogue, currentNodeIndex, currentDialogueIndex, history, triggerEffect]\n );\n\n // 自动开始时添加第一条对话到历史\n useEffect(() => {\n if (autoStart && currentNode && currentNode.dialogues.length > 0 && history.length === 0 && currentNode?.dialogues[0] !== undefined) {\n addToHistory(currentNode?.dialogues[0], currentNodeIndex, 0);\n }\n }, [autoStart, currentNode, currentNodeIndex, history.length, addToHistory]);\n\n // 清理定时器\n useEffect(() => {\n return () => {\n if (autoTimerRef.current) {\n clearTimeout(autoTimerRef.current);\n }\n if (effectTimerRef.current) {\n clearTimeout(effectTimerRef.current);\n }\n };\n }, []);\n\n // 空剧本检查\n if (!currentNode) {\n return (\n <div className=\"flex h-full w-full items-center justify-center bg-black text-white\">\n 剧本为空\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={`relative bg-black ${className}`}\n style={{ width: '100%', height: '100%', overflow: 'hidden', ...style }}\n >\n {/* MMD 播放器层 - 覆盖整个屏幕,明确在最底层 */}\n <div \n className=\"absolute inset-0 w-full h-full\"\n style={{ \n zIndex: 0,\n // 在加载期间隐藏,避免看到模型加载过程\n opacity: (isLoading || isTransitioning || !isAnimationPlaying) ? 0 : 1,\n transition: 'opacity 0.3s ease-in-out'\n }}\n >\n {!isTransitioning && (\n <MMDPlayerBase\n key={currentNode.id}\n ref={playerRef}\n resources={currentNode.resources}\n stage={{ ...stage, ...currentNode.stage }}\n autoPlay={isStarted}\n loop={currentNode.loopAnimation === true}\n mobileOptimization={mobileOptimization}\n onLoad={() => {\n console.log('[MMDVisualNovel] MMDPlayerBase onLoad called');\n setIsLoading(false);\n // 如果已经开始游戏,启动动画播放(使用 ref 获取最新值)\n if (isStartedRef.current) {\n console.log('[MMDVisualNovel] Game already started, triggering play');\n setTimeout(() => {\n playerRef.current?.play();\n }, 100);\n }\n }}\n onPlay={() => {\n // 动画开始播放时才设置为 true\n console.log('[MMDVisualNovel] MMDPlayerBase onPlay called');\n setIsAnimationPlaying(true);\n }}\n onTimeUpdate={(time) => {\n const duration = playerRef.current?.getDuration() || 0;\n \n // 判定动画完成的条件:\n // 1. 播放进度超过 98%\n // 2. 或者检测到时间回跳(循环发生)\n const isNearEnd = duration > 0 && time > duration * 0.98;\n const isLooped = time < lastAnimationTimeRef.current && lastAnimationTimeRef.current > 0;\n\n if (isNearEnd || isLooped) {\n if (!isVmdFinishedRef.current) {\n console.log('[MMDVisualNovel] VMD finished/looped, marking as finished');\n isVmdFinishedRef.current = true;\n setIsVmdFinished(true);\n }\n }\n lastAnimationTimeRef.current = time;\n }}\n onEnded={() => {\n console.log('[MMDVisualNovel] VMD ended, marking as finished');\n isVmdFinishedRef.current = true;\n setIsVmdFinished(true);\n }}\n onCameraChange={(isManual) => {\n setIsCameraManual(isManual);\n }}\n onError={onError}\n />\n )}\n </div>\n\n {/* 特效渲染层 */}\n {activeEffect && (\n <div \n className=\"pointer-events-none absolute inset-0 flex items-center justify-center\"\n style={{ zIndex: 999 }}\n >\n {activeEffect.type === 'flash' && (\n <div \n className=\"h-full w-full\"\n style={{ \n backgroundColor: activeEffect.color || 'white',\n animation: `flash-anim ${activeEffect.duration || 500}ms ease-out forwards`\n }} \n />\n )}\n\n {activeEffect.type === 'gif' && activeEffect.url && (\n <img \n src={activeEffect.url} \n alt=\"effect\"\n className={activeEffect.position === 'full' ? 'h-full w-full object-cover' : 'max-h-full max-w-full'}\n />\n )}\n \n <style>{`\n @keyframes flash-anim {\n 0% { opacity: 0; }\n 25% { opacity: 1; }\n 100% { opacity: 0; }\n }\n `}</style>\n </div>\n )}\n\n {/* 加载遮罩和开始界面 */}\n <LoadingOverlay\n isLoading={(() => {\n const shouldShowLoading = (isLoading || isTransitioning || !isAnimationPlaying) && isStarted;\n console.log('[MMDVisualNovel] LoadingOverlay conditions:', {\n isLoading,\n isTransitioning,\n isAnimationPlaying,\n isStarted,\n shouldShowLoading\n });\n return shouldShowLoading;\n })()}\n showStartScreen={!isStarted}\n scriptName={script.name}\n loadingText=\"正在准备场景中...\"\n startText={startText}\n settingsText={settingsText}\n aboutText={aboutText}\n onStart={handleStart}\n />\n\n {/* 对话框 - 仅在动画开始播放后显示 */}\n {(() => {\n const shouldShow = isStarted && isAnimationPlaying && currentDialogue && !showHistory && !showChoices;\n console.log('[MMDVisualNovel] DialogueBox render condition:', {\n isStarted,\n isAnimationPlaying,\n hasDialogue: !!currentDialogue,\n showHistory,\n showChoices,\n shouldShow,\n dialogue: currentDialogue\n });\n \n return shouldShow ? (\n <DialogueBox\n dialogue={currentDialogue}\n theme={dialogueTheme}\n isTyping={isTyping}\n isAutoMode={isAutoMode}\n onClick={handleDialogueClick}\n onSkipTyping={() => {\n typingCompleteRef.current = true;\n }}\n onToggleAuto={toggleAutoMode}\n onOpenHistory={() => setShowHistory(true)}\n onSkip={handleSkip}\n onResetCamera={() => {\n playerRef.current?.resetCamera();\n setIsCameraManual(false);\n }}\n isCameraManual={isCameraManual}\n showControls={true}\n showSkipButton={showSkipButton}\n showAutoButton={showAutoButton}\n showHistoryButton={showHistoryButton}\n />\n ) : null;\n })()}\n\n {/* 确认跳过动画弹窗 */}\n {pendingNodeIndex !== null && (\n <SkipConfirmDialog\n onConfirm={() => {\n if (pendingNodeIndex !== null) {\n goToNode(pendingNodeIndex, true);\n }\n }}\n onCancel={() => {\n setPendingNodeIndex(null);\n }}\n />\n )}\n\n {/* 分支选项菜单 */}\n {showChoices && (currentDialogue?.choices || currentNode.choices) && (\n <ChoiceMenu\n choices={(currentDialogue?.choices || currentNode.choices)!}\n theme={dialogueTheme}\n onSelect={(choice) => {\n // 1. 处理变量设置\n if (choice.setVariable) {\n const { key, value } = choice.setVariable;\n setVariables(prev => ({ ...prev, [key]: value }));\n console.log(`[MMDVisualNovel] Variable set: ${key} = ${value}`);\n }\n\n // 2. 执行回调\n choice.onSelect?.();\n\n // 3. 触发特效\n if (choice.effect) {\n triggerEffect(choice.effect);\n }\n\n // 4. 处理跳转逻辑\n setShowChoices(false);\n\n if (choice.nextNodeIndex !== undefined) {\n if (choice.nextNodeIndex === currentNodeIndex) {\n // 跳转到当前节点的特定对话\n goToDialogue(choice.nextDialogueIndex || 0);\n } else {\n // 跳转到其他节点\n goToNode(choice.nextNodeIndex, true);\n }\n } else if (currentDialogue?.choices) {\n // 没有指定跳转目标且是在对话行中触发的,逻辑上应该进入下一行\n const nextIdx = currentDialogueIndex + 1;\n if (currentNode && nextIdx < currentNode.dialogues.length) {\n const nextDialogue = currentNode.dialogues[nextIdx];\n if (nextDialogue) {\n setCurrentDialogueIndex(nextIdx);\n addToHistory(nextDialogue, currentNodeIndex, nextIdx);\n onDialogueChange?.(nextDialogue, nextIdx, currentNodeIndex);\n typingCompleteRef.current = false;\n }\n } else {\n // 如果是最后一行了,执行正常的节点切换逻辑\n triggerNodeTransition();\n }\n }\n }}\n />\n )}\n\n {/* 历史记录面板 */}\n {showHistory && (\n <HistoryPanel\n history={history}\n theme={dialogueTheme}\n onClose={() => setShowHistory(false)}\n />\n )}\n\n \n </div>\n );\n }\n);\n\nMMDVisualNovel.displayName = 'MMDVisualNovel';\n\nexport default MMDVisualNovel;\n\n","import React from 'react';\nimport { \n Play, \n Pause, \n SkipBack, \n SkipForward, \n Repeat, \n Repeat1, \n Shuffle,\n Volume2,\n VolumeX,\n ListMusic,\n Camera\n} from 'lucide-react';\n\nexport interface MusicControlsProps {\n isPlaying: boolean;\n currentTime: number;\n duration: number;\n loopMode: 'list' | 'single' | 'shuffle';\n isCameraManual?: boolean;\n onPlayPause: () => void;\n onNext: () => void;\n onPrevious: () => void;\n onSeek: (time: number) => void;\n onToggleLoop: () => void;\n onTogglePlaylist: () => void;\n onResetCamera?: () => void;\n className?: string;\n}\n\nexport const MusicControls: React.FC<MusicControlsProps> = ({\n isPlaying,\n currentTime,\n duration,\n loopMode,\n isCameraManual = false,\n onPlayPause,\n onNext,\n onPrevious,\n onSeek,\n onToggleLoop,\n onTogglePlaylist,\n onResetCamera,\n className = '',\n}) => {\n const formatTime = (seconds: number) => {\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n };\n\n const progress = duration > 0 ? (currentTime / duration) * 100 : 0;\n\n return (\n <div \n className={`w-full max-w-4xl mx-auto px-6 py-4 bg-white/10 backdrop-blur-xl border border-white/20 rounded-2xl shadow-2xl pointer-events-auto transition-all group ${className}`}\n >\n {/* 进度条 */}\n <div className=\"relative w-full h-1.5 bg-white/20 rounded-full mb-4 cursor-pointer group/progress overflow-hidden\">\n <div \n className=\"absolute h-full bg-blue-500 rounded-full transition-all duration-300\"\n style={{ width: `${progress}%` }}\n />\n <input\n type=\"range\"\n min={0}\n max={duration || 100}\n value={currentTime}\n onChange={(e) => onSeek(Number(e.target.value))}\n className=\"absolute inset-0 w-full h-full opacity-0 cursor-pointer\"\n />\n </div>\n\n <div className=\"flex items-center justify-between\">\n {/* 时间显示 */}\n <div className=\"flex items-center gap-2 text-xs font-mono text-white/60 w-32\">\n <span>{formatTime(currentTime)}</span>\n <span>/</span>\n <span>{formatTime(duration)}</span>\n </div>\n\n {/* 主控制按钮 */}\n <div className=\"flex items-center gap-6\">\n <button \n onClick={onPrevious}\n className=\"text-white/80 hover:text-white transition-colors\"\n >\n <SkipBack className=\"w-6 h-6 fill-current\" />\n </button>\n\n <button \n onClick={onPlayPause}\n className=\"w-12 h-12 flex items-center justify-center bg-blue-500 hover:bg-blue-400 text-white rounded-full shadow-lg shadow-blue-500/20 transition-all hover:scale-105 active:scale-95\"\n >\n {isPlaying ? (\n <Pause className=\"w-6 h-6 fill-current\" />\n ) : (\n <Play className=\"w-6 h-6 fill-current ml-1\" />\n )}\n </button>\n\n <button \n onClick={onNext}\n className=\"text-white/80 hover:text-white transition-colors\"\n >\n <SkipForward className=\"w-6 h-6 fill-current\" />\n </button>\n </div>\n\n {/* 附加功能按钮 */}\n <div className=\"flex items-center gap-4 w-32 justify-end\">\n {isCameraManual && (\n <button \n onClick={onResetCamera}\n className=\"text-blue-400 hover:text-blue-300 transition-colors animate-in zoom-in duration-300\"\n title=\"恢复初始视角\"\n >\n <Camera className=\"w-5 h-5\" />\n </button>\n )}\n\n <button \n onClick={onToggleLoop}\n className=\"text-white/60 hover:text-white transition-colors\"\n title={loopMode}\n >\n {loopMode === 'list' && <Repeat className=\"w-5 h-5\" />}\n {loopMode === 'single' && <Repeat1 className=\"w-5 h-5 text-blue-400\" />}\n {loopMode === 'shuffle' && <Shuffle className=\"w-5 h-5 text-orange-400\" />}\n </button>\n\n <button \n onClick={onTogglePlaylist}\n className=\"text-white/60 hover:text-white transition-colors\"\n >\n <ListMusic className=\"w-5 h-5\" />\n </button>\n </div>\n </div>\n </div>\n );\n};\n\n","import React from 'react';\nimport { X, Play, Music } from 'lucide-react';\nimport { MusicTrack } from '../types';\n\nexport interface PlaylistPanelProps {\n tracks: MusicTrack[];\n currentIndex: number;\n isOpen: boolean;\n onClose: () => void;\n onSelectTrack: (index: number) => void;\n className?: string;\n}\n\nexport const PlaylistPanel: React.FC<PlaylistPanelProps> = ({\n tracks,\n currentIndex,\n isOpen,\n onClose,\n onSelectTrack,\n className = '',\n}) => {\n if (!isOpen) return null;\n\n return (\n <div \n className={`fixed inset-y-0 right-0 w-80 bg-gray-900/90 backdrop-blur-2xl border-l border-white/10 shadow-2xl z-50 flex flex-col pointer-events-auto transform transition-transform duration-500 ease-out ${isOpen ? 'translate-x-0' : 'translate-x-full'} ${className}`}\n >\n <div className=\"flex items-center justify-between p-6 border-b border-white/10\">\n <div className=\"flex items-center gap-3\">\n <Music className=\"w-5 h-5 text-blue-400\" />\n <h3 className=\"text-lg font-bold text-white\">播放列表</h3>\n </div>\n <button \n onClick={onClose}\n className=\"p-2 text-white/60 hover:text-white transition-colors\"\n >\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-4 space-y-2 custom-scrollbar\">\n {tracks.map((track, index) => {\n const isActive = index === currentIndex;\n return (\n <button\n key={track.id}\n onClick={() => onSelectTrack(index)}\n className={`w-full flex items-center gap-4 p-3 rounded-xl transition-all group ${isActive ? 'bg-blue-500/20 border border-blue-500/30' : 'hover:bg-white/5 border border-transparent'}`}\n >\n <div className=\"relative w-12 h-12 flex-shrink-0 rounded-lg overflow-hidden bg-gray-800\">\n {track.coverUrl ? (\n <img src={track.coverUrl} alt={track.title} className=\"w-full h-full object-cover\" />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center text-white/20\">\n <Music className=\"w-6 h-6\" />\n </div>\n )}\n {isActive && (\n <div className=\"absolute inset-0 bg-blue-500/40 flex items-center justify-center\">\n <div className=\"flex gap-1 items-end h-4\">\n <div className=\"w-1 bg-white animate-music-bar-1\" />\n <div className=\"w-1 bg-white animate-music-bar-2\" />\n <div className=\"w-1 bg-white animate-music-bar-3\" />\n </div>\n </div>\n )}\n </div>\n\n <div className=\"flex-1 text-left min-w-0\">\n <h4 className={`text-sm font-bold truncate ${isActive ? 'text-blue-400' : 'text-white/90'}`}>\n {track.title}\n </h4>\n <p className=\"text-xs text-white/40 truncate mt-0.5\">\n {track.artist || '未知艺术家'}\n </p>\n </div>\n\n {!isActive && (\n <div className=\"opacity-0 group-hover:opacity-100 transition-opacity\">\n <Play className=\"w-4 h-4 text-white/40 fill-current\" />\n </div>\n )}\n </button>\n );\n })}\n </div>\n\n <div className=\"p-6 border-t border-white/10\">\n <p className=\"text-xs text-gray-500 text-center\">\n 共 {tracks.length} 首曲目\n </p>\n </div>\n\n <style dangerouslySetInnerHTML={{ __html: `\n .custom-scrollbar::-webkit-scrollbar {\n width: 4px;\n }\n .custom-scrollbar::-webkit-scrollbar-track {\n background: transparent;\n }\n .custom-scrollbar::-webkit-scrollbar-thumb {\n background: rgba(255, 255, 255, 0.1);\n border-radius: 10px;\n }\n .custom-scrollbar::-webkit-scrollbar-thumb:hover {\n background: rgba(255, 255, 255, 0.2);\n }\n @keyframes music-bar-1 {\n 0%, 100% { height: 4px; }\n 50% { height: 12px; }\n }\n @keyframes music-bar-2 {\n 0%, 100% { height: 8px; }\n 50% { height: 16px; }\n }\n @keyframes music-bar-3 {\n 0%, 100% { height: 6px; }\n 50% { height: 14px; }\n }\n .animate-music-bar-1 { animation: music-bar-1 0.6s infinite; }\n .animate-music-bar-2 { animation: music-bar-2 0.8s infinite; }\n .animate-music-bar-3 { animation: music-bar-3 0.7s infinite; }\n `}} />\n </div>\n );\n};\n\n","import React from 'react';\nimport { MusicTrack } from '../types';\n\nexport interface TrackInfoProps {\n track: MusicTrack;\n className?: string;\n}\n\nexport const TrackInfo: React.FC<TrackInfoProps> = ({ track, className = '' }) => {\n return (\n <div className={`flex flex-col items-center text-center gap-2 ${className}`}>\n <div className=\"px-4 py-1.5 bg-black/40 backdrop-blur-md rounded-full border border-white/10 shadow-lg\">\n <h2 className=\"text-lg font-bold text-white tracking-wider truncate max-w-md\">\n {track.title}\n </h2>\n </div>\n <p className=\"text-sm font-medium text-white/60 drop-shadow-md\">\n {track.artist || '未知艺术家'}\n </p>\n </div>\n );\n};\n\n","import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n forwardRef,\n useImperativeHandle,\n} from 'react';\nimport { MMDPlayerBase } from '../components/MMDPlayerBase';\nimport { MMDPlayerBaseRef } from '../types';\nimport {\n MMDMusicPlayerProps,\n MMDMusicPlayerRef,\n MusicTrack,\n} from './types';\nimport { MusicControls } from './components/MusicControls';\nimport { PlaylistPanel } from './components/PlaylistPanel';\nimport { TrackInfo } from './components/TrackInfo';\n\n/**\n * MMDMusicPlayer - MMD 音乐播放器组件 (Study with Miku 风格)\n * \n * 核心功能:\n * - 多曲目无缝切换\n * - 完整的媒体控制 (播放/暂停/进度/音量)\n * - 沉浸式 3D 舞台\n * - 自动清理内存与物理引擎\n */\nexport const MMDMusicPlayer = forwardRef<MMDMusicPlayerRef, MMDMusicPlayerProps>(\n (\n {\n config,\n stage,\n mobileOptimization,\n initialTrackIndex = 0,\n onTrackChange,\n onPlayPause,\n onProgress,\n onError,\n className,\n style,\n },\n ref\n ) => {\n const { tracks, autoPlay = false, defaultLoopMode = 'list' } = config;\n\n // 状态管理\n const [currentIndex, setCurrentIndex] = useState(initialTrackIndex);\n const [isPlaying, setIsPlaying] = useState(autoPlay);\n const [isLoading, setIsLoading] = useState(true);\n const [isTransitioning, setIsTransitioning] = useState(false);\n const [currentTime, setCurrentTime] = useState(0);\n const [duration, setDuration] = useState(0);\n const [loopMode, setLoopMode] = useState<'list' | 'single' | 'shuffle'>(defaultLoopMode);\n const [showPlaylist, setShowPlaylist] = useState(false);\n const [isUIVisible, setIsUIVisible] = useState(true);\n const [isCameraManual, setIsCameraManual] = useState(false);\n\n // Refs\n const playerRef = useRef<MMDPlayerBaseRef>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const isStartedRef = useRef(autoPlay);\n const uiTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n // 获取当前曲目\n const currentTrack = tracks[currentIndex];\n\n // 切换到指定曲目 - 包含物理引擎清理逻辑\n const goToTrack = useCallback(\n (index: number) => {\n if (index < 0 || index >= tracks.length) return;\n if (isTransitioning) return;\n\n const track = tracks[index];\n if (!track) return;\n\n console.log(`[MMDMusicPlayer] Transitioning to track ${index}: ${track.title}`);\n\n // 1. 进入过渡状态并暂停\n setIsTransitioning(true);\n setIsLoading(true);\n const wasPlaying = isPlaying;\n setIsPlaying(false);\n\n // 2. 给物理引擎和 Three.js 资源清理留出时间 (参照 MMDPlaylist 逻辑)\n setTimeout(() => {\n setCurrentIndex(index);\n setCurrentTime(0);\n setDuration(0);\n onTrackChange?.(track, index);\n\n // 3. 结束过渡,允许新播放器挂载\n setTimeout(() => {\n setIsTransitioning(false);\n // 如果之前在播放,等待加载完成后恢复\n if (wasPlaying) {\n isStartedRef.current = true;\n }\n }, 100);\n }, 300);\n },\n [tracks, isTransitioning, isPlaying, onTrackChange]\n );\n\n // 下一曲逻辑\n const next = useCallback(() => {\n let nextIndex = currentIndex + 1;\n if (loopMode === 'shuffle') {\n nextIndex = Math.floor(Math.random() * tracks.length);\n } else if (nextIndex >= tracks.length) {\n nextIndex = 0;\n }\n goToTrack(nextIndex);\n }, [currentIndex, tracks.length, loopMode, goToTrack]);\n\n // 上一曲逻辑\n const previous = useCallback(() => {\n let prevIndex = currentIndex - 1;\n if (prevIndex < 0) {\n prevIndex = tracks.length - 1;\n }\n goToTrack(prevIndex);\n }, [currentIndex, tracks.length, goToTrack]);\n\n // 暴露方法给外部\n useImperativeHandle(\n ref,\n () => ({\n play: () => {\n setIsPlaying(true);\n isStartedRef.current = true;\n playerRef.current?.play();\n },\n pause: () => {\n setIsPlaying(false);\n isStartedRef.current = false;\n playerRef.current?.pause();\n },\n next,\n previous,\n goToTrack,\n setLoopMode,\n getState: () => ({\n currentIndex,\n isPlaying,\n currentTime,\n duration,\n loopMode,\n }),\n }),\n [next, previous, goToTrack, currentIndex, isPlaying, currentTime, duration, loopMode]\n );\n\n // 处理播放结束\n const handleEnded = useCallback(() => {\n if (loopMode === 'single') {\n playerRef.current?.seek(0);\n playerRef.current?.play();\n } else {\n next();\n }\n }, [loopMode, next]);\n\n // 处理时间更新\n const handleTimeUpdate = useCallback((time: number) => {\n setCurrentTime(time);\n if (playerRef.current) {\n const total = playerRef.current.getDuration();\n setDuration(total);\n onProgress?.(time, total);\n }\n }, [onProgress]);\n\n // UI 自动隐藏逻辑\n const resetUITimeout = useCallback(() => {\n setIsUIVisible(true);\n if (uiTimeoutRef.current) clearTimeout(uiTimeoutRef.current);\n if (isPlaying) {\n uiTimeoutRef.current = setTimeout(() => {\n if (!showPlaylist) setIsUIVisible(false);\n }, 5000);\n }\n }, [isPlaying, showPlaylist]);\n\n useEffect(() => {\n resetUITimeout();\n return () => {\n if (uiTimeoutRef.current) clearTimeout(uiTimeoutRef.current);\n };\n }, [resetUITimeout]);\n\n if (!currentTrack) {\n return (\n <div className=\"flex h-full w-full items-center justify-center bg-black text-white\">\n 播放列表为空\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={`relative bg-black group ${className}`}\n style={{ width: '100%', height: '100%', overflow: 'hidden', ...style }}\n onMouseMove={resetUITimeout}\n onClick={resetUITimeout}\n >\n {/* 3D 舞台层 */}\n <div \n className=\"absolute inset-0 w-full h-full\"\n style={{ \n zIndex: 0,\n opacity: (isLoading || isTransitioning) ? 0 : 1,\n transition: 'opacity 0.5s ease-in-out'\n }}\n >\n {!isTransitioning && (\n <MMDPlayerBase\n key={currentTrack.id}\n ref={playerRef}\n resources={currentTrack.resources}\n stage={{ ...stage, ...currentTrack.stage }}\n autoPlay={isStartedRef.current}\n loop={loopMode === 'single'}\n mobileOptimization={mobileOptimization}\n onLoad={() => {\n console.log('[MMDMusicPlayer] Track loaded');\n setIsLoading(false);\n if (isStartedRef.current) {\n playerRef.current?.play();\n setIsPlaying(true);\n }\n }}\n onPlay={() => {\n setIsPlaying(true);\n onPlayPause?.(true);\n }}\n onPause={() => {\n setIsPlaying(false);\n onPlayPause?.(false);\n }}\n onCameraChange={(isManual) => {\n setIsCameraManual(isManual);\n }}\n onTimeUpdate={handleTimeUpdate}\n onEnded={handleEnded}\n onError={onError}\n />\n )}\n </div>\n\n {/* 加载遮罩 */}\n {(isLoading || isTransitioning) && (\n <div className=\"absolute inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-md\">\n <div className=\"flex flex-col items-center gap-4\">\n <div className=\"h-12 w-12 animate-spin rounded-full border-4 border-white/20 border-t-blue-500\" />\n <div className=\"text-white font-medium\">\n {isTransitioning ? '准备下一首...' : '正在加载舞台...'}\n </div>\n </div>\n </div>\n )}\n\n {/* UI 交互层 */}\n <div \n className={`absolute inset-0 z-10 flex flex-col justify-between transition-opacity duration-700 pointer-events-none ${isUIVisible ? 'opacity-100' : 'opacity-0'}`}\n >\n {/* 顶部信息 */}\n <div className=\"pt-12 px-8 flex justify-center\">\n <TrackInfo track={currentTrack} />\n </div>\n\n {/* 底部控制 */}\n <div className=\"pb-12 px-8\">\n <MusicControls \n isPlaying={isPlaying}\n currentTime={currentTime}\n duration={duration}\n loopMode={loopMode}\n isCameraManual={isCameraManual}\n onPlayPause={() => isPlaying ? playerRef.current?.pause() : playerRef.current?.play()}\n onNext={next}\n onPrevious={previous}\n onSeek={(time) => playerRef.current?.seek(time)}\n onResetCamera={() => {\n playerRef.current?.resetCamera();\n setIsCameraManual(false);\n }}\n onToggleLoop={() => {\n const modes: ('list' | 'single' | 'shuffle')[] = ['list', 'single', 'shuffle'];\n const nextMode = modes[(modes.indexOf(loopMode) + 1) % modes.length]!;\n setLoopMode(nextMode);\n }}\n onTogglePlaylist={() => setShowPlaylist(!showPlaylist)}\n />\n </div>\n </div>\n\n {/* 侧边播放列表 */}\n <PlaylistPanel \n tracks={tracks}\n currentIndex={currentIndex}\n isOpen={showPlaylist}\n onClose={() => setShowPlaylist(false)}\n onSelectTrack={(index) => {\n goToTrack(index);\n setShowPlaylist(false);\n }}\n />\n </div>\n );\n }\n);\n\nMMDMusicPlayer.displayName = 'MMDMusicPlayer';\n\nexport default MMDMusicPlayer;\n\n"]}
|