ryanlink 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/LICENSE +37 -0
  2. package/README.md +455 -0
  3. package/dist/index.d.mts +1335 -0
  4. package/dist/index.d.ts +1335 -0
  5. package/dist/index.js +4694 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/index.mjs +4604 -0
  8. package/dist/index.mjs.map +1 -0
  9. package/package.json +82 -0
  10. package/src/audio/AudioFilters.ts +316 -0
  11. package/src/audio/AudioQueue.ts +782 -0
  12. package/src/audio/AudioTrack.ts +242 -0
  13. package/src/audio/QueueController.ts +252 -0
  14. package/src/audio/TrackCollection.ts +138 -0
  15. package/src/audio/index.ts +9 -0
  16. package/src/config/defaults.ts +223 -0
  17. package/src/config/endpoints.ts +99 -0
  18. package/src/config/index.ts +9 -0
  19. package/src/config/patterns.ts +55 -0
  20. package/src/config/presets.ts +400 -0
  21. package/src/config/symbols.ts +31 -0
  22. package/src/core/PluginSystem.ts +50 -0
  23. package/src/core/RyanlinkPlayer.ts +403 -0
  24. package/src/core/index.ts +6 -0
  25. package/src/extensions/AutoplayExtension.ts +283 -0
  26. package/src/extensions/FairPlayExtension.ts +154 -0
  27. package/src/extensions/LyricsExtension.ts +187 -0
  28. package/src/extensions/PersistenceExtension.ts +182 -0
  29. package/src/extensions/SponsorBlockExtension.ts +81 -0
  30. package/src/extensions/index.ts +9 -0
  31. package/src/index.ts +19 -0
  32. package/src/lavalink/ConnectionPool.ts +326 -0
  33. package/src/lavalink/HttpClient.ts +316 -0
  34. package/src/lavalink/LavalinkConnection.ts +409 -0
  35. package/src/lavalink/index.ts +7 -0
  36. package/src/metadata.ts +88 -0
  37. package/src/types/api/Rest.ts +949 -0
  38. package/src/types/api/Websocket.ts +463 -0
  39. package/src/types/api/index.ts +6 -0
  40. package/src/types/audio/FilterManager.ts +29 -0
  41. package/src/types/audio/Queue.ts +4 -0
  42. package/src/types/audio/QueueManager.ts +30 -0
  43. package/src/types/audio/index.ts +7 -0
  44. package/src/types/common.ts +63 -0
  45. package/src/types/core/Player.ts +322 -0
  46. package/src/types/core/index.ts +5 -0
  47. package/src/types/index.ts +6 -0
  48. package/src/types/lavalink/Node.ts +173 -0
  49. package/src/types/lavalink/NodeManager.ts +34 -0
  50. package/src/types/lavalink/REST.ts +144 -0
  51. package/src/types/lavalink/index.ts +32 -0
  52. package/src/types/voice/VoiceManager.ts +176 -0
  53. package/src/types/voice/index.ts +5 -0
  54. package/src/utils/helpers.ts +169 -0
  55. package/src/utils/index.ts +6 -0
  56. package/src/utils/validators.ts +184 -0
  57. package/src/voice/RegionSelector.ts +184 -0
  58. package/src/voice/VoiceConnection.ts +451 -0
  59. package/src/voice/VoiceSession.ts +297 -0
  60. package/src/voice/index.ts +7 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/metadata.ts","../src/config/defaults.ts","../src/config/presets.ts","../src/config/patterns.ts","../src/config/endpoints.ts","../src/config/symbols.ts","../src/utils/helpers.ts","../src/utils/validators.ts","../src/lavalink/HttpClient.ts","../src/lavalink/LavalinkConnection.ts","../src/lavalink/ConnectionPool.ts","../src/voice/VoiceSession.ts","../src/voice/RegionSelector.ts","../src/voice/VoiceConnection.ts","../src/audio/AudioTrack.ts","../src/audio/TrackCollection.ts","../src/audio/AudioFilters.ts","../src/audio/AudioQueue.ts","../src/audio/QueueController.ts","../src/core/PluginSystem.ts","../src/extensions/AutoplayExtension.ts","../src/extensions/LyricsExtension.ts","../src/extensions/SponsorBlockExtension.ts","../src/extensions/FairPlayExtension.ts","../src/extensions/PersistenceExtension.ts","../src/core/RyanlinkPlayer.ts"],"names":["join","readFileSync","URL","CloseCodes","EventEmitter","WebSocket","clearTimeout","setTimeout","once"],"mappings":";;;;;;;;;;;;AAaA,IAAI,WAAA,GAAkC,IAAA;AAMtC,SAAS,eAAA,GAA+B;AACpC,EAAA,IAAI,WAAA,EAAa;AACb,IAAA,OAAO,WAAA;AAAA,EACX;AAEA,EAAA,IAAI;AACA,IAAA,MAAM,aAAA,GAAgB;AAAA,MAClBA,SAAA,CAAK,SAAA,EAAW,IAAA,EAAM,IAAA,EAAM,cAAc,CAAA;AAAA,MAC1CA,SAAA,CAAK,SAAA,EAAW,IAAA,EAAM,cAAc,CAAA;AAAA,MACpCA,SAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,cAAc;AAAA,KACtC;AAEA,IAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAC9B,MAAA,IAAI;AACA,QAAA,MAAM,OAAA,GAAUC,eAAA,CAAa,IAAA,EAAM,OAAO,CAAA;AAC1C,QAAA,WAAA,GAAc,IAAA,CAAK,MAAM,OAAO,CAAA;AAChC,QAAA,OAAO,WAAA;AAAA,MACX,CAAA,CAAA,MAAQ;AACJ,QAAA;AAAA,MACJ;AAAA,IACJ;AAEA,IAAA,OAAA,CAAQ,KAAK,oDAAoD,CAAA;AACjE,IAAA,OAAO;AAAA,MACH,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS,OAAA;AAAA,MACT,UAAA,EAAY;AAAA,QACR,IAAA,EAAM,KAAA;AAAA,QACN,GAAA,EAAK;AAAA;AACT,KACJ;AAAA,EACJ,SAAS,KAAA,EAAO;AACZ,IAAA,OAAO;AAAA,MACH,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS,OAAA;AAAA,MACT,UAAA,EAAY;AAAA,QACR,IAAA,EAAM,KAAA;AAAA,QACN,GAAA,EAAK;AAAA;AACT,KACJ;AAAA,EACJ;AACJ;AAEA,IAAM,MAAM,eAAA,EAAgB;AAKrB,IAAM,cAAc,GAAA,CAAI;AAKxB,IAAM,iBAAiB,GAAA,CAAI;AAK3B,IAAM,oBAAoB,GAAA,CAAI,UAAA,EAAY,IAAI,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,IAAK,sCAAA;AAKvE,IAAM,YAAA,GAAe,OAAO,MAAA,CAAO;AAAA,EACtC,IAAA,EAAM,WAAA;AAAA,EACN,OAAA,EAAS,cAAA;AAAA,EACT,UAAA,EAAY,iBAAA;AAAA,EACZ,aAAa,GAAA,CAAI;AACrB,CAAC;;;AC7EM,IAAM,kBAAA,GAAqB,OAAO,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA,EAI1C,OAAA,EAAS,CAAA;AAAA;AAAA;AAAA;AAAA,EAKT,WAAW,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,cAAc,KAAK,iBAAiB,CAAA,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA,EAKjE,UAAA,EAAY,KAAA;AAAA;AAAA;AAAA;AAAA,EAKZ,cAAA,EAAgB;AACpB,CAAyC;AAKlC,IAAM,kBAAA,GAAqB,OAAO,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA,EAI1C,aAAA,EAAe,GAAA;AAAA;AAAA;AAAA;AAAA,EAKf,cAAA,EAAgB,GAAA;AAAA;AAAA;AAAA;AAAA,EAKhB,cAAA,EAAgB,GAAA;AAAA;AAAA;AAAA;AAAA,EAKhB,cAAA,EAAgB,CAAA;AAAA;AAAA;AAAA;AAAA,EAKhB,gBAAA,EAAkB;AACtB,CAAkE;AAK3D,IAAM,oBAAA,GAAuB,OAAO,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA,EAI5C,QAAA,EAAU,IAAA;AAAA;AAAA;AAAA;AAAA,EAKV,QAAA,EAAU,IAAA;AAAA;AAAA;AAAA;AAAA,EAKV,WAAA,EAAa,UAAA;AAAA;AAAA;AAAA;AAAA,EAKb,cAAA,EAAgB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMhB,MAAM,kBAAA,GAAqB;AACvB,IAAA,OAAO,MAAM,OAAA,CAAQ,OAAA,CAAQ,EAAE,CAAA;AAAA,EACnC;AACJ,CAA2C;AAKpC,IAAM,mBAAA,GAAsB,OAAO,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA,EAI3C,MAAA,EAAQ,GAAA;AAAA;AAAA;AAAA;AAAA,EAKR,UAAA,EAAY,MAAA;AAAA;AAAA;AAAA;AAAA,EAKZ,QAAA,EAAU,KAAA;AAAA;AAAA;AAAA;AAAA,EAKV,MAAA,EAAQ;AACZ,CAAU;AAKH,IAAM,oBAAA,GAAuB,OAAO,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA,EAI5C,MAAA,EAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,EAKR,WAAW,EAAC;AAAA;AAAA;AAAA;AAAA,EAKZ,OAAA,EAAS,IAAA;AAAA;AAAA;AAAA;AAAA,EAKT,SAAA,EAAW,IAAA;AAAA;AAAA;AAAA;AAAA,EAKX,OAAA,EAAS,IAAA;AAAA;AAAA;AAAA;AAAA,EAKT,OAAA,EAAS,IAAA;AAAA;AAAA;AAAA;AAAA,EAKT,QAAA,EAAU,IAAA;AAAA;AAAA;AAAA;AAAA,EAKV,UAAA,EAAY,IAAA;AAAA;AAAA;AAAA;AAAA,EAcZ,UAAA,EAAY,IAAA;AAAA;AAAA;AAAA;AAAA,EAUZ,OAAA,EAAS;AACb,CAAU;AAKH,IAAM,eAAA,GAAkB,OAAO,MAAA,CAAO;AAAA,EACzC,EAAA,EAAI,GAAA;AAAA,EACJ,OAAA,EAAS,GAAA;AAAA,EACT,UAAA,EAAY,GAAA;AAAA,EACZ,WAAA,EAAa,GAAA;AAAA,EACb,YAAA,EAAc,GAAA;AAAA,EACd,SAAA,EAAW,GAAA;AAAA,EACX,SAAA,EAAW,GAAA;AAAA,EACX,kBAAA,EAAoB,GAAA;AAAA,EACpB,iBAAA,EAAmB,GAAA;AAAA,EACnB,qBAAA,EAAuB,GAAA;AAAA,EACvB,WAAA,EAAa,GAAA;AAAA,EACb,mBAAA,EAAqB,GAAA;AAAA,EACrB,eAAA,EAAiB;AACrB,CAAU;AAKH,IAAM,mBAAA,GAAsB,OAAO,MAAA,CAAO;AAAA,EAC7C,MAAA,EAAQ,GAAA;AAAA,EACR,UAAA,EAAY,IAAA;AAAA,EACZ,cAAA,EAAgB,IAAA;AAAA,EAChB,gBAAA,EAAkB,IAAA;AAAA,EAClB,kBAAA,EAAoB,IAAA;AAAA,EACpB,gBAAA,EAAkB,IAAA;AAAA,EAClB,0BAAA,EAA4B,IAAA;AAAA,EAC5B,gBAAA,EAAkB,IAAA;AAAA,EAClB,eAAA,EAAiB,IAAA;AAAA,EACjB,cAAA,EAAgB;AACpB,CAAU;;;ACpNH,IAAM,SAAA,GAAY;AAAA;AAAA,EAErB,gBAAA,EAAkB;AAAA,IACd,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,MAAM,KAAA,EAAM;AAAA,IAC7B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IAC9B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IAC9B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,MAAM,KAAA,EAAM;AAAA,IAC7B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IAC9B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IAC9B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,QAAQ,KAAA,EAAM;AAAA,IAC/B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IAC9B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IAC9B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IAC9B,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IAC/B,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IAC/B,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IAC/B,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IAC/B,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,QAAQ,KAAA;AAAM,GACpC;AAAA;AAAA,EAGA,aAAA,EAAe;AAAA,IACX,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,MAAM,IAAA,EAAK;AAAA,IAC5B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,IAC7B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,IAC7B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,MAAM,IAAA,EAAK;AAAA,IAC5B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,IAC7B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,IAC7B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,QAAQ,IAAA,EAAK;AAAA,IAC9B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,IAC7B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,IAC7B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,IAC7B,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,IAC9B,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,IAC9B,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,IAC9B,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,IAC9B,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,QAAQ,IAAA;AAAK,GACnC;AAAA;AAAA,EAGA,eAAA,EAAiB;AAAA,IACb,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,MAAM,MAAA,EAAO;AAAA,IAC9B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,MAAA,EAAO;AAAA,IAC/B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,MAAA,EAAO;AAAA,IAC/B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,MAAM,MAAA,EAAO;AAAA,IAC9B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,MAAA,EAAO;AAAA,IAC/B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,MAAA,EAAO;AAAA,IAC/B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,QAAQ,MAAA,EAAO;AAAA,IAChC,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,MAAA,EAAO;AAAA,IAC/B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,MAAA,EAAO;AAAA,IAC/B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,MAAA,EAAO;AAAA,IAC/B,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,OAAO,MAAA,EAAO;AAAA,IAChC,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,OAAO,MAAA,EAAO;AAAA,IAChC,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,OAAO,MAAA,EAAO;AAAA,IAChC,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,OAAO,MAAA,EAAO;AAAA,IAChC,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,QAAQ,MAAA;AAAO,GACrC;AAAA;AAAA,EAGA,YAAA,EAAc;AAAA,IACV,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,MAAM,KAAA,EAAM;AAAA,IAC7B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IAC9B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IAC9B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,MAAM,KAAA,EAAM;AAAA,IAC7B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IAC9B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IAC9B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,QAAQ,KAAA,EAAM;AAAA,IAC/B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IAC9B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IAC9B,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IAC9B,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IAC/B,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IAC/B,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IAC/B,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IAC/B,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,QAAQ,KAAA;AAAM,GACpC;AAAA;AAAA,EAGA,WAAA,EAAa;AAAA,IACT,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA,EAAI;AAAA,IACtB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA;AAAK,GAC3B;AAAA;AAAA,EAGA,WAAA,EAAa;AAAA,IACT,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,IACvB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,MAAA,EAAO;AAAA,IACxB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAA,EAAQ;AAAA,IACzB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,MAAA,EAAO;AAAA,IACxB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAA,EAAQ;AAAA,IACzB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,MAAA,EAAO;AAAA,IACzB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,KAAA,EAAM;AAAA,IACxB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,KAAA,EAAM;AAAA,IACxB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,KAAA;AAAM,GAC5B;AAAA;AAAA,EAGA,IAAA,EAAM;AAAA,IACF,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,IACvB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,IACvB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA,EAAI;AAAA,IACtB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA,EAAI;AAAA,IACtB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA;AAAI,GAC1B;AAAA;AAAA,EAGA,OAAA,EAAS;AAAA,IACL,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,IACvB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,IACvB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,IACvB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,IACvB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA,EAAI;AAAA,IACtB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA,EAAI;AAAA,IACtB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA;AAAI,GAC1B;AAAA;AAAA,EAGA,GAAA,EAAK;AAAA,IACD,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAO;AAAA,IACxB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,IACvB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,MAAA,EAAO;AAAA,IACxB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,MAAA,EAAO;AAAA,IACxB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,KAAA,EAAM;AAAA,IACxB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO;AAAA,IACzB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA;AAAI,GAC1B;AAAA;AAAA,EAGA,UAAA,EAAY;AAAA,IACR,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,IACvB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,IACvB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,MAAA,EAAO;AAAA,IACxB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,MAAA,EAAO;AAAA,IACxB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA,EAAI;AAAA,IACtB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA;AAAI,GAC1B;AAAA;AAAA,EAGA,SAAA,EAAW;AAAA,IACP,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA;AAAK,GAC3B;AAAA;AAAA,EAGA,MAAA,EAAQ;AAAA,IACJ,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,IACvB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,IACvB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA,EAAI;AAAA,IACtB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA,EAAI;AAAA,IACtB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA;AAAK,GAC3B;AAAA;AAAA,EAGA,SAAA,EAAW;AAAA,IACP,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,IACvB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,IACvB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA,EAAI;AAAA,IACtB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA,EAAI;AAAA,IACtB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA;AAAI,GAC1B;AAAA;AAAA,EAGA,SAAA,EAAW;AAAA,IACP,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,IACvB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,IACvB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA,EAAI;AAAA,IACtB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA,EAAI;AAAA,IACtB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA;AAAI,GAC1B;AAAA;AAAA,EAGA,UAAA,EAAY;AAAA,IACR,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,IACvB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,IACvB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA,EAAI;AAAA,IACtB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA,EAAI;AAAA,IACtB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA;AAAI,GAC1B;AAAA;AAAA,EAGA,IAAA,EAAM;AAAA,IACF,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA;AAAI,GAC1B;AAAA;AAAA,EAGA,EAAA,EAAI;AAAA,IACA,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA,EAAI;AAAA,IACtB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA,EAAI;AAAA,IACtB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,CAAA;AAAE,GACxB;AAAA;AAAA,EAGA,KAAA,EAAO;AAAA,IACH,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACtB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAA,EAAI;AAAA,IACrB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA,EAAI;AAAA,IACtB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA,EAAI;AAAA,IACtB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA;AAAK,GAC3B;AAAA;AAAA,EAGA,aAAA,EAAe;AAAA,IACX,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACnB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,CAAA,EAAE;AAAA,IACpB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,CAAA,EAAE;AAAA,IACpB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,CAAA,EAAE;AAAA,IACpB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,CAAA,EAAE;AAAA,IACpB,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,CAAA;AAAE;AAE5B;AASO,SAAS,YAAY,IAAA,EAAuC;AAC/D,EAAA,OAAO,UAAU,IAAI,CAAA;AACzB;AAMO,SAAS,gBAAA,GAAmC;AAC/C,EAAA,OAAO,MAAA,CAAO,KAAK,SAAS,CAAA;AAChC;AAOO,SAAS,gBAAgB,IAAA,EAAoC;AAChE,EAAA,OAAO,IAAA,IAAQ,SAAA;AACnB;;;AC/YO,IAAM,cAAA,GAAiB;AAEvB,IAAM,kBAAA,GAAqB;AAE3B,IAAM,QAAA,GAAW;AAEjB,IAAM,YAAA,GAAe;AAErB,IAAM,YAAA,GAAe;AAErB,IAAM,eAAA,GAAkB;AAExB,IAAM,aAAA,GAAgB;AAEtB,IAAM,WAAA,GAAc;AAEpB,IAAM,eAAA,GAAkB;AAExB,IAAM,WAAA,GAAc;AAEpB,IAAM,cAAA,GAAiB;AAEvB,IAAM,UAAA,GACT;AAEG,IAAM,gBAAA,GACT;AAEG,IAAM,gBAAA,GACT;AAEG,IAAM,aAAA,GACT;AAEG,IAAM,YAAA,GACT;AAEG,IAAM,UAAA,GACT;AAEG,IAAM,cAAA,GACT;AAEG,IAAM,aAAA,GACT;AAEG,IAAM,YAAA,GAAe;AAErB,IAAM,WAAA,GAAc;AAEpB,IAAM,UAAA,GAAa;AAEnB,IAAM,cAAA,GAAiB;AAEvB,IAAM,WAAA,GAAc;;;AC/CpB,IAAM,MAAA,GAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAKlB,SAAA,GAA0B;AACtB,IAAA,OAAO,YAAA;AAAA,EACX,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAA,GAA8B;AAC1B,IAAA,OAAO,aAAA;AAAA,EACX,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,QAAA,EAAsD;AAChE,IAAA,IAAI,QAAA,EAAU;AACV,MAAA,OAAO,eAAA;AAAA,IACX;AACA,IAAA,OAAO,cAAA;AAAA,EACX,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAA,CAAO,WAAmB,OAAA,EAA0B;AAChD,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,OAAO,CAAA,UAAA,EAAa,SAAS,CAAA,SAAA,EAAY,OAAO,CAAA,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,aAAa,SAAS,CAAA,QAAA,CAAA;AAAA,EACjC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,SAAA,EAA2B;AAC/B,IAAA,OAAO,aAAa,SAAS,CAAA,CAAA;AAAA,EACjC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAA,GAAgB;AACZ,IAAA,OAAO,OAAA;AAAA,EACX,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAA,GAAkB;AACd,IAAA,OAAO,QAAA;AAAA,EACX,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,IAAA,EAAkC;AAC3C,IAAA,IAAI,IAAA,EAAM;AACN,MAAA,OAAO,sBAAsB,IAAI,CAAA,CAAA;AAAA,IACrC;AACA,IAAA,OAAO,sBAAA;AAAA,EACX,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAA,GAAsB;AAClB,IAAA,OAAO,UAAA;AAAA,EACX;AACJ;;;ACzFO,IAAM,YAAA,mBAAe,MAAA,CAAO,GAAA,CAAI,QAAQ;AAMxC,IAAM,YAAA,mBAAe,MAAA,CAAO,GAAA,CAAI,QAAQ;AAKxC,IAAM,kBAAA,0BAA4B,cAAc;AAKhD,IAAM,kBAAA,0BAA4B,cAAc;AAKhD,IAAM,mBAAA,0BAA6B,eAAe;AAKlD,IAAM,mBAAA,0BAA6B,eAAe;;;ACtBlD,IAAM,OAAO,MAAY;AAAC;AAY1B,IAAM,cAAA,GAAiB,CAAC,EAAA,KAAuB;AAClD,EAAA,IAAI,CAAC,MAAA,CAAO,aAAA,CAAc,EAAE,CAAA,IAAK,MAAM,CAAA,EAAG;AACtC,IAAA,OAAO,OAAA;AAAA,EACX;AAEA,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAA;AAC9B,EAAA,MAAM,KAAK,CAAA,EAAG,CAAA,GAAI,EAAE,CAAA,CAAA,CAAG,QAAA,CAAS,GAAG,GAAG,CAAA;AACtC,EAAA,MAAM,EAAA,GAAK,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAE,CAAA,GAAI,EAAE,CAAA,CAAA,CAAG,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AAEvD,EAAA,IAAI,IAAI,IAAA,EAAM;AACV,IAAA,OAAO,IAAI,CAAA,KAAM,IAAA,GAAO,QAAQ,EAAA,IAAM,EAAE,IAAI,EAAE,CAAA,CAAA;AAAA,EAClD;AAEA,EAAA,OAAO,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAI,IAAI,CAAC,CAAA,CAAA,CAAG,QAAA,CAAS,GAAG,GAAG,CAAC,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA;AACpE;AAWO,IAAM,aAAA,GAAgB,CAAC,QAAA,KAA6B;AACvD,EAAA,MAAM,QAAQ,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,MAAM,CAAA;AAE5C,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACpB,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA,IAAK,GAAA;AAAA,EAC7B;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACpB,IAAA,OAAA,CAAA,CAAS,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA,IAAK,MAAM,KAAA,CAAM,CAAC,KAAK,CAAA,CAAA,IAAM,GAAA;AAAA,EACtD;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACpB,IAAA,OAAA,CAAA,CAAS,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA,IAAK,IAAA,GAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA,IAAK,EAAA,IAAM,KAAA,CAAM,CAAC,KAAK,CAAA,CAAA,IAAM,GAAA;AAAA,EAC/E;AAEA,EAAA,OAAO,CAAA;AACX;AASO,IAAM,KAAA,GAAQ,CAAC,KAAA,EAAe,GAAA,EAAa,GAAA,KAAwB;AACtE,EAAA,OAAO,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,KAAA,EAAO,GAAG,GAAG,GAAG,CAAA;AAC7C;AAOO,IAAM,KAAA,GAAQ,CAAC,EAAA,KAA8B;AAChD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAC3D;AASO,IAAM,QAAQ,OAAU,EAAA,EAAsB,WAAA,GAAc,CAAA,EAAG,YAAY,GAAA,KAAqB;AACnG,EAAA,IAAI,SAAA;AAEJ,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,WAAA,EAAa,OAAA,EAAA,EAAW;AACpD,IAAA,IAAI;AACA,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IACpB,SAAS,KAAA,EAAO;AACZ,MAAA,SAAA,GAAY,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAEpE,MAAA,IAAI,OAAA,GAAU,cAAc,CAAA,EAAG;AAC3B,QAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAG,OAAO,CAAA;AAC7C,QAAA,MAAM,MAAM,KAAK,CAAA;AAAA,MACrB;AAAA,IACJ;AAAA,EACJ;AAEA,EAAA,MAAM,SAAA,IAAa,IAAI,KAAA,CAAM,cAAc,CAAA;AAC/C;AAOO,IAAM,OAAA,GAAU,CAAI,KAAA,KAAoB;AAC3C,EAAA,KAAA,IAAS,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,IAAK,IAAI,CAAA,CAAE,CAAA;AAC5C,IAAA,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,KAAA;AACX;AAOO,IAAM,aAAA,GAAgB,CAAI,KAAA,KAA8B;AAC3D,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACpB,IAAA,OAAO,MAAA;AAAA,EACX;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,KAAA,CAAM,IAAA,CAAK,QAAO,GAAI,KAAA,CAAM,MAAM,CAAC,CAAA;AACzD;AAQO,IAAM,KAAA,GAAQ,CAAI,KAAA,EAAY,IAAA,KAAwB;AACzD,EAAA,MAAM,SAAgB,EAAC;AACvB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,IAAA,EAAM;AACzC,IAAA,MAAA,CAAO,KAAK,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,MAAA;AACX;AAQO,IAAM,MAAA,GAAS,CAAI,KAAA,EAAY,GAAA,KAAoC;AACtE,EAAA,IAAI,CAAC,GAAA,EAAK;AACN,IAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EAC7B;AAEA,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAI;AACrB,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS;AAC1B,IAAA,MAAM,CAAA,GAAI,IAAI,IAAI,CAAA;AAClB,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG;AACb,MAAA,OAAO,KAAA;AAAA,IACX;AACA,IAAA,IAAA,CAAK,IAAI,CAAC,CAAA;AACV,IAAA,OAAO,IAAA;AAAA,EACX,CAAC,CAAA;AACL;AC3JO,IAAM,QAAA,GAAW,CACpB,KAAA,EACA,KAAA,KACa;AACb,EAAA,IAAI,UAAU,MAAA,EAAW;AACrB,IAAA,OAAO,MAAA,CAAO,SAAS,KAAK,CAAA;AAAA,EAChC;AACA,EAAA,IAAI,KAAA,KAAU,SAAA,IAAa,KAAA,KAAU,UAAA,EAAY;AAC7C,IAAA,OAAO,MAAA,CAAO,cAAc,KAAK,CAAA;AAAA,EACrC;AACA,EAAA,IAAI,KAAA,KAAU,SAAA,IAAa,KAAA,KAAU,UAAA,EAAY;AAC7C,IAAA,OAAO,MAAA,CAAO,aAAA,CAAc,KAAK,CAAA,IAAM,KAAA,GAAmB,CAAA;AAAA,EAC9D;AACA,EAAA,IAAI,UAAU,OAAA,EAAS;AACnB,IAAA,OAAO,MAAA,CAAO,aAAA,CAAc,KAAK,CAAA,IAAM,KAAA,IAAoB,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,KAAA;AACX;AAQO,IAAM,QAAA,GAAW,CAAmB,KAAA,EAAgB,KAAA,KAAqD;AAC5G,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC3B,IAAA,OAAO,KAAA;AAAA,EACX;AACA,EAAA,IAAI,UAAU,MAAA,EAAW;AACrB,IAAA,OAAO,IAAA;AAAA,EACX;AACA,EAAA,IAAI,UAAU,KAAA,EAAO;AACjB,IAAA,OAAOC,OAAA,CAAI,SAAS,KAAK,CAAA;AAAA,EAC7B;AACA,EAAA,IAAI,UAAU,WAAA,EAAa;AACvB,IAAA,OAAO,KAAA,CAAM,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA;AAAA,EACjC;AACA,EAAA,IAAI,iBAAiB,MAAA,EAAQ;AACzB,IAAA,OAAO,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,EAC3B;AACA,EAAA,OAAO,KAAA;AACX;AAQO,IAAM,QAAA,GAAW,CAAoC,KAAA,EAAgB,KAAA,KAAoC;AAC5G,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,WAAA,KAAgB,MAAA,EAAQ;AACxC,IAAA,OAAO,KAAA;AAAA,EACX;AACA,EAAA,IAAI,UAAU,MAAA,EAAW;AACrB,IAAA,OAAO,IAAA;AAAA,EACX;AACA,EAAA,IAAI,UAAU,WAAA,EAAa;AACvB,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,GAAS,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,KAAA;AACX;AAQO,IAAM,OAAA,GAAU,CACnB,KAAA,EACA,KAAA,KACa;AACb,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvB,IAAA,OAAO,KAAA;AAAA,EACX;AACA,EAAA,IAAI,UAAU,MAAA,EAAW;AACrB,IAAA,OAAO,IAAA;AAAA,EACX;AACA,EAAA,IAAI,UAAU,WAAA,EAAa;AACvB,IAAA,OAAO,MAAM,MAAA,KAAW,CAAA;AAAA,EAC5B;AACA,EAAA,IAAI,OAAO,UAAU,UAAA,EAAY;AAC7B,IAAA,OAAO,KAAA,CAAM,MAAM,KAAK,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,KAAA;AACX;AAOO,IAAM,SAAA,GAAY,CAAC,KAAA,KAAqC;AAC3D,EAAA,OAAO,OAAO,KAAA,KAAU,SAAA;AAC5B;AAOO,IAAM,UAAA,GAAa,CAAC,KAAA,KAA6D;AACpF,EAAA,OAAO,OAAO,KAAA,KAAU,UAAA;AAC5B;AAOO,IAAM,SAAA,GAAY,CAAC,KAAA,KAA8C;AACpE,EAAA,OAAO,KAAA,KAAU,QAAQ,KAAA,KAAU,MAAA;AACvC;AAOO,IAAM,WAAA,GAAc,CAAC,KAAA,KAAoC;AAC5D,EAAA,OAAO,QAAA,CAAS,KAAK,CAAA,IAAK,aAAA,CAAc,KAAK,KAAK,CAAA;AACtD;AAOO,IAAM,KAAA,GAAQ,CAAC,KAAA,KAAoC;AACtD,EAAA,OAAO,QAAA,CAAS,OAAO,KAAK,CAAA;AAChC;AAOO,IAAM,OAAA,GAAU,CAAC,KAAA,KAAmC;AACvD,EAAA,OAAO,KAAA,YAAiB,KAAA;AAC5B;AAKO,SAAS,MAAA,CAAO,WAAoB,OAAA,EAAoC;AAC3E,EAAA,IAAI,CAAC,SAAA,EAAW;AACZ,IAAA,MAAM,IAAI,MAAM,OAAO,CAAA;AAAA,EAC3B;AACJ;AAKO,SAAS,oBAAoB,OAAA,EAAkC;AAClE,EAAA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,IAAA,EAAM,WAAW,GAAG,sCAAsC,CAAA;AAClF,EAAA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,IAAA,EAAM,WAAW,GAAG,sCAAsC,CAAA;AAClF,EAAA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,IAAA,EAAM,SAAS,GAAG,qCAAqC,CAAA;AAC/E,EAAA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,QAAA,EAAU,WAAW,GAAG,0CAA0C,CAAA;AAC9F;AAKO,SAAS,sBAAsB,OAAA,EAA8B;AAChE,EAAA,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,WAAW,GAAG,+BAA+B,CAAA;AAC3E,EAAA,MAAA,CAAO,UAAA,CAAW,OAAA,CAAQ,kBAAkB,CAAA,EAAG,uCAAuC,CAAA;AACtF,EAAA,IAAI,OAAA,CAAQ,gBAAgB,MAAA,EAAW;AACnC,IAAA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,WAAA,EAAa,WAAW,GAAG,wCAAwC,CAAA;AAAA,EAC/F;AACJ;;;ACnKO,IAAM,OAAN,MAAW;AAAA,EACd,OAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA,GAA4B,IAAA;AAAA,EAC5B,eAAA;AAAA,EAES,SAAA;AAAA,EAET,YAAY,OAAA,EAAsB;AAC9B,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAChB,MAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,SAAS,CAAA,IAAK,CAAC,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,UAAU,CAAA,EAAG;AACjF,QAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,MAChE;AACA,MAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,MAAA;AAAA,IAC3B,CAAA,MAAO;AACH,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,GAAS,OAAA,GAAU,MAAA;AAC5C,MAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,IAAA;AAC7B,MAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,WAAA;AAC7B,MAAA,IAAA,CAAK,UAAU,CAAA,EAAG,QAAQ,CAAA,GAAA,EAAM,IAAI,IAAI,IAAI,CAAA,CAAA;AAAA,IAChD;AAEA,IAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,MAAA,IAAa,OAAA,CAAQ,WAAW,CAAA,EAAG;AACvD,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACvD;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,QAAA,CAAS,IAAI,KAAK,OAAA,CAAQ,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,EAAG;AACpE,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,cAAc,KAAK,iBAAiB,CAAA,CAAA,CAAA;AAC7F,IAAA,IAAI,UAAU,QAAA,CAAS,IAAI,KAAK,SAAA,CAAU,QAAA,CAAS,IAAI,CAAA,EAAG;AACtD,MAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,IAClE;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAEjB,IAAA,MAAM,cAAA,GAAiB,QAAQ,cAAA,IAAkB,GAAA;AACjD,IAAA,IAAI,kBAAkB,CAAA,EAAG;AACrB,MAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,IAC/D;AACA,IAAA,IAAA,CAAK,eAAA,GAAkB,cAAA;AAEvB,IAAA,IAAA,CAAK,QAAA,GAAW;AAAA,MACZ,eAAe,OAAA,CAAQ,QAAA;AAAA,MACvB,cAAc,IAAA,CAAK,SAAA;AAAA,MACnB,cAAA,EAAgB;AAAA,KACpB;AAEA,IAAA,IAAI,QAAQ,SAAA,EAAW;AACnB,MAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,SAAA;AAAA,IAC9B;AAAA,EACJ;AAAA,EAEA,IAAI,MAAA,GAAiB;AACjB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EAChB;AAAA,EAEA,IAAI,SAAA,GAA2B;AAC3B,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EAChB;AAAA,EAEA,IAAI,UAAU,KAAA,EAAsB;AAChC,IAAA,IAAI,KAAA,KAAU,SAAS,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,IAAA,OAAW,EAAA,CAAA,EAAK;AACtE,MAAA;AAAA,IACJ;AACA,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAY,IAAA,EAAc,OAAA,GAAuB,IAAI,OAAA,EAA8B;AACrF,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAO,GAAG,IAAI,CAAA,CAAA;AAClC,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,SAAA,GAAY,WAAW,MAAM,UAAA,CAAW,OAAM,EAAG,OAAA,IAAW,KAAK,eAAe,CAAA;AAEtF,IAAA,IAAI;AACA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAC9B,GAAG,OAAA;AAAA,QACH,OAAA,EAAS;AAAA,UACL,GAAG,IAAA,CAAK,QAAA;AAAA,UACR,GAAG,OAAA,CAAQ;AAAA,SACf;AAAA,QACA,QAAQ,UAAA,CAAW;AAAA,OACtB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AACd,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAC7C,QAAA,MAAM,KAAA;AAAA,MACV;AAGA,MAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AACzB,QAAA,OAAO,KAAA,CAAA;AAAA,MACX;AAEA,MAAA,OAAQ,MAAM,SAAS,IAAA,EAAK;AAAA,IAChC,SAAS,KAAA,EAAO;AACZ,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACvD,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,OAAA,IAAW,IAAA,CAAK,eAAe,CAAA,EAAA,CAAI,CAAA;AAAA,MAChF;AACA,MAAA,MAAM,KAAA;AAAA,IACV;AAAA,EACJ;AAAA,EAEA,MAAM,YAAY,QAAA,EAAoC;AAClD,IAAA,IAAI,UAAU,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,SAAS,UAAU,CAAA,CAAA;AAE7D,IAAA,IAAI;AACA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,IAAI,KAAK,KAAA,EAAO;AACZ,QAAA,OAAA,GAAU,IAAA,CAAK,KAAA;AAAA,MACnB,CAAA,MAAA,IAAW,KAAK,OAAA,EAAS;AACrB,QAAA,OAAA,GAAU,IAAA,CAAK,OAAA;AAAA,MACnB;AAAA,IACJ,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,OAAO,CAAA;AAC/B,IAAA,KAAA,CAAM,IAAA,GAAO,mBAAA;AACb,IAAA,OAAO,KAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,UAAA,EAAyC;AACtD,IAAA,MAAM,IAAA,GAAO,GAAG,MAAA,CAAO,YAAA,EAAc,CAAA,YAAA,EAAe,kBAAA,CAAmB,UAAU,CAAC,CAAA,CAAA;AAClF,IAAA,OAAO,KAAK,QAAA,CAAqB,IAAA,EAAM,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,OAAA,EAAoC;AAClD,IAAA,MAAM,IAAA,GAAO,GAAG,MAAA,CAAO,aAAA,EAAe,CAAA,cAAA,EAAiB,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA;AAClF,IAAA,OAAO,KAAK,QAAA,CAAmB,IAAA,EAAM,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,OAAA,EAAwC;AACvD,IAAA,OAAO,IAAA,CAAK,QAAA,CAAqB,MAAA,CAAO,aAAA,CAAc,IAAI,CAAA,EAAG;AAAA,MACzD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,KAC/B,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAAqC;AACvC,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAClB,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAsB,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,EAAG,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,OAAA,EAAqC;AACnD,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAClB,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAoB,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA,EAAG,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EAC9F;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CACF,OAAA,EACA,IAAA,EACA,MAAA,EACkB;AAClB,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAClB,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAI,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,YAAY,OAAO,CAAA;AACjD,IAAA,IAAI,QAAQ,SAAA,EAAW;AACnB,MAAA,IAAA,IAAQ,iBAAA;AAAA,IACZ;AAEA,IAAA,OAAO,IAAA,CAAK,SAAoB,IAAA,EAAM;AAAA,MAClC,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC5B,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,OAAA,EAAgC;AAChD,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAClB,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAe,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA,EAAG,EAAE,MAAA,EAAQ,QAAA,EAAU,CAAA;AAAA,EAC5F;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,IAAA,EAAoE;AACpF,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAClB,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,KAAK,QAAA,CAAoC,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,EAAG;AAAA,MAC7E,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC5B,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,GAAmC;AACrC,IAAA,OAAO,IAAA,CAAK,SAAuB,MAAA,CAAO,IAAA,IAAQ,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAAiC;AACnC,IAAA,OAAO,IAAA,CAAK,SAAoB,MAAA,CAAO,KAAA,IAAS,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAAgC;AAClC,IAAA,OAAO,KAAK,QAAA,CAAiB,UAAA,EAAY,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAA,GAAuD;AACzD,IAAA,OAAO,IAAA,CAAK,SAA6B,MAAA,CAAO,YAAA,IAAgB,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAwB,OAAA,EAAgC;AAC1D,IAAA,OAAO,IAAA,CAAK,QAAA,CAAe,MAAA,CAAO,YAAA,CAAa,SAAS,CAAA,EAAG;AAAA,MACvD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,SAAS;AAAA,KACnC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,4BAAA,GAA8C;AAChD,IAAA,OAAO,IAAA,CAAK,SAAe,MAAA,CAAO,YAAA,CAAa,KAAK,CAAA,EAAG,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CAAgB,OAAA,EAAiB,QAAA,EAAmC;AACtE,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAClB,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,IAAA,CAAK,SAAe,CAAA,EAAG,MAAA,CAAO,OAAO,IAAA,CAAK,UAAA,EAAY,OAAO,CAAC,CAAA,aAAA,CAAA,EAAiB;AAAA,MAClF,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,QAAQ;AAAA,KAChC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,OAAA,EAAoC;AACtD,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAClB,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAmB,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY,OAAO,CAAC,CAAA,aAAA,CAAA,EAAiB,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC/G;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,OAAA,EAAgC;AACrD,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAClB,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAe,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY,OAAO,CAAC,CAAA,aAAA,CAAA,EAAiB,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,EAC9G;AACJ;AC3SO,IAAK,UAAA,qBAAAC,WAAAA,KAAL;AACH,EAAAA,WAAAA,CAAAA,WAAAA,CAAA,YAAS,GAAA,CAAA,GAAT,QAAA;AACA,EAAAA,WAAAA,CAAAA,WAAAA,CAAA,eAAY,IAAA,CAAA,GAAZ,WAAA;AACA,EAAAA,WAAAA,CAAAA,WAAAA,CAAA,mBAAgB,IAAA,CAAA,GAAhB,eAAA;AACA,EAAAA,WAAAA,CAAAA,WAAAA,CAAA,qBAAkB,IAAA,CAAA,GAAlB,iBAAA;AACA,EAAAA,WAAAA,CAAAA,WAAAA,CAAA,sBAAmB,IAAA,CAAA,GAAnB,kBAAA;AACA,EAAAA,WAAAA,CAAAA,WAAAA,CAAA,qBAAkB,IAAA,CAAA,GAAlB,iBAAA;AACA,EAAAA,WAAAA,CAAAA,WAAAA,CAAA,6BAA0B,IAAA,CAAA,GAA1B,yBAAA;AACA,EAAAA,WAAAA,CAAAA,WAAAA,CAAA,qBAAkB,IAAA,CAAA,GAAlB,iBAAA;AACA,EAAAA,WAAAA,CAAAA,WAAAA,CAAA,mBAAgB,IAAA,CAAA,GAAhB,eAAA;AACA,EAAAA,WAAAA,CAAAA,WAAAA,CAAA,mBAAgB,IAAA,CAAA,GAAhB,eAAA;AAVQ,EAAA,OAAAA,WAAAA;AAAA,CAAA,EAAA,UAAA,IAAA,EAAA;AAiBL,IAAM,YAAA,GAAN,cAA2BC,mBAAA,CAA2B;AAAA,EACzD,aAAA;AAAA,EACA,eAAA,GAA2C,IAAA;AAAA,EAC3C,kBAAA,GAA2C,IAAA;AAAA,EAE3C,UAAA,GAAoC,IAAA;AAAA,EACpC,eAAA,GAAyC,IAAA;AAAA,EAEzC,KAAA,GAAuB,IAAA;AAAA,EACvB,aAAA,GAA+B,IAAA;AAAA,EAE/B,eAAA,GAAkB,IAAA;AAAA,EAClB,kBAAA,GAAqB,CAAA;AAAA,EACrB,iBAAA,GAAoB,KAAA;AAAA,EAEpB,OAAA,GAA4B,IAAA;AAAA,EAC5B,MAAA,GAA8B,IAAA;AAAA,EAE9B,UAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EAES,IAAA;AAAA,EACA,IAAA;AAAA,EAET,YAAY,OAAA,EAAsB;AAC9B,IAAA,KAAA,CAAM,EAAE,iBAAA,EAAmB,KAAA,EAAO,CAAA;AAGlC,IAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,IAAQ,OAAO,OAAA,CAAQ,SAAS,QAAA,EAAU;AACnD,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IAC1D;AAEA,IAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,IAAY,OAAO,OAAA,CAAQ,aAAa,QAAA,EAAU;AAC3D,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IAC1D;AAGA,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,IAAA,CAAK,OAAO,CAAA;AAG5B,IAAA,IAAA,CAAK,aAAA,GAAgB;AAAA,MACjB,OAAA,EAAS;AAAA,QACL,aAAA,EAAe,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,cAAc,CAAA,CAAA;AAAA,QAC/C,WAAW,OAAA,CAAQ,QAAA;AAAA,QACnB,YAAA,EAAc,KAAK,IAAA,CAAK,SAAA;AAAA,QACxB,eAAe,OAAA,CAAQ;AAAA,OAC3B;AAAA,MACA,iBAAA,EAAmB,KAAA;AAAA,MACnB,gBAAA,EAAkB,QAAQ,gBAAA,IAAoB;AAAA,KAClD;AAGA,IAAA,IAAI,IAAA,CAAK,KAAK,SAAA,EAAW;AACrB,MAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,YAAY,CAAA,GAAI,KAAK,IAAA,CAAK,SAAA;AAAA,IACzD;AAGA,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,GAAS,KAAA,GAAQ,IAAA;AAC1C,IAAA,IAAA,CAAK,UAAA,GAAa,GAAG,QAAQ,CAAA,GAAA,EAAM,QAAQ,IAAI,CAAA,CAAA,EAAI,QAAQ,IAAI,CAAA,aAAA,CAAA;AAG/D,IAAA,IAAA,CAAK,YAAA,GAAA,CAAgB,OAAA,CAAQ,aAAA,IAAiB,GAAA,KAAU,QAAQ,cAAA,IAAkB,GAAA,CAAA;AAClF,IAAA,IAAA,CAAK,eAAA,GAAkB,QAAQ,cAAA,IAAkB,GAAA;AACjD,IAAA,IAAA,CAAK,eAAA,GAAkB,QAAQ,cAAA,IAAkB,EAAA;AAEjD,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AAGpB,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,CAAK,IAAA,EAAM,WAAA,EAAa;AAAA,MAC1C,YAAA,EAAc,KAAA;AAAA,MACd,GAAA,EAAK,MAAM,IAAA,CAAK,SAAA;AAAA,MAChB,KAAK,MAAM;AAAA,MAAC;AAAA,KACf,CAAA;AAGD,IAAA,MAAM,SAAA,GAAgC;AAAA,MAClC,QAAA,EAAU,KAAA;AAAA,MACV,YAAA,EAAc;AAAA,KAClB;AAEA,IAAA,MAAA,CAAO,iBAAiB,IAAA,EAAM;AAAA,MAC1B,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACgB,CAAA;AAAA,EAC9B;AAAA,EAEA,IAAI,QAAA,GAAmB;AACnB,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,SAAS,CAAA;AAAA,EAC/C;AAAA,EAEA,IAAI,SAAA,GAA2B;AAC3B,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,YAAY,CAAA,IAAK,IAAA;AAAA,EACvD;AAAA,EAEA,IAAI,IAAA,GAAsB;AACtB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA,EAEA,IAAI,KAAA,GAA6B;AAC7B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAChB;AAAA,EAEA,IAAI,KAAA,GAAmB;AACnB,IAAA,IAAI,KAAK,UAAA,EAAY;AACjB,MAAA,OAAO,YAAA;AAAA,IACX;AACA,IAAA,IAAI,KAAK,SAAA,EAAW;AAChB,MAAA,OAAO,IAAA,CAAK,QAAQ,OAAA,GAAU,WAAA;AAAA,IAClC;AACA,IAAA,OAAO,IAAA,CAAK,eAAe,cAAA,GAAiB,cAAA;AAAA,EAChD;AAAA,EAEA,IAAI,UAAA,GAAsB;AACtB,IAAA,OAAO,IAAA,CAAK,OAAA,EAAS,UAAA,KAAeC,YAAA,CAAU,UAAA;AAAA,EAClD;AAAA,EAEA,IAAI,SAAA,GAAqB;AACrB,IAAA,OAAO,IAAA,CAAK,OAAA,EAAS,UAAA,KAAeA,YAAA,CAAU,IAAA;AAAA,EAClD;AAAA,EAEA,IAAI,KAAA,GAAiB;AACjB,IAAA,OAAO,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,SAAA,KAAc,IAAA;AAAA,EAChD;AAAA,EAEA,IAAI,YAAA,GAAwB;AACxB,IAAA,OAAO,IAAA,CAAK,OAAA,KAAY,IAAA,IAAQ,IAAA,CAAK,eAAA,KAAoB,IAAA;AAAA,EAC7D;AAAA,EAEA,IAAI,YAAA,GAAwB;AACxB,IAAA,OAAO,IAAA,CAAK,OAAA,KAAY,IAAA,IAAQ,CAAC,IAAA,CAAK,YAAA;AAAA,EAC1C;AAAA,EAEA,IAAI,cAAA,GAAyB;AACzB,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EAChB;AAAA,EAEA,IAAI,iBAAA,GAA4B;AAC5B,IAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,EAChB;AAAA,EAEA,OAAO,GAAA,EAAoD;AACvD,IAAA,MAAM,IAAA,GAAO,QAAA,IAAY,GAAA,IAAO,KAAA,CAAM,QAAQ,GAAA,CAAI,MAAM,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,GAAI,GAAA;AAChG,IAAA,MAAM,KAAA,GAAQ,gBAAgB,KAAA,GAAQ,IAAA,GAAO,IAAI,KAAA,CAAM,MAAA,CAAO,IAAI,CAAC,CAAA;AACnE,IAAA,KAAA,CAAM,IAAA,GAAO,CAAA,OAAA,EAAW,IAAA,CAAK,WAAA,CAAiC,IAAI,CAAA,CAAA,CAAA;AAClE,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,QAAA,GAAiB;AACb,IAAA,IAAA,CAAK,SAAS,kBAAA,EAAmB;AACjC,IAAA,IAAI,IAAA,CAAK,eAAe,IAAA,EAAM;AAC1B,MAAAC,mBAAAA,CAAa,KAAK,UAAU,CAAA;AAAA,IAChC;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,MAAA,GAAS,IAAA;AAC/C,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAK,KAAA,GAAQ,IAAA;AAAA,EACtC;AAAA,EAEA,UAAA,GAAmB;AACf,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,IAAA,IAAA,CAAK,iBAAiB,OAAA,EAAQ;AAC9B,IAAA,IAAA,CAAK,eAAA,KAAoBC,kBAAW,MAAM;AACtC,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,MAAA,KAAK,KAAK,OAAA,EAAQ;AAAA,IACtB,CAAA,EAAG,IAAA,CAAK,eAAe,CAAA,CAAE,KAAA,EAAM;AAAA,EACnC;AAAA,EAEA,iBAAA,CAAkB,UAAA,GAAa,IAAA,EAAM,cAAA,GAAiB,KAAA,EAAa;AAC/D,IAAA,IAAA,CAAK,eAAA,GAAkB,cAAA;AACvB,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,IAAA,CAAK,kBAAA,GAAqB,CAAA;AAAA,IAC9B;AACA,IAAA,IAAI,IAAA,CAAK,oBAAoB,IAAA,EAAM;AAC/B,MAAAD,mBAAAA,CAAa,KAAK,eAAe,CAAA;AAAA,IACrC;AACA,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,EAC3B;AAAA,EAEA,iBAAA,GAA0B;AACtB,IAAA,IAAA,CAAK,YAAY,OAAA,EAAQ;AACzB,IAAA,IAAA,CAAK,UAAA,KAAeC,kBAAW,MAAM;AACjC,MAAA,IAAA,CAAK,SAAS,SAAA,EAAU;AACxB,MAAA,IAAA,CAAK,QAAA,EAAS;AACd,MAAA,IAAA,CAAK,UAAA,EAAW;AAAA,IACpB,CAAA,EAAG,IAAA,CAAK,YAAY,CAAA,CAAE,KAAA,EAAM;AAG5B,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAK,GAAA,EAAI;AAC9B,IAAA,IAAA,CAAK,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA,EAEA,kBAAkB,IAAA,EAAqC;AACnD,IAAA,IAAI;AACA,MAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AACJ,MAAA,OAAO,IAAA;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,GAA4B;AAC9B,IAAA,IAAI,IAAA,CAAK,YAAY,IAAA,EAAM;AACvB,MAAA,OAAO,IAAA,CAAK,mBAAmB,IAAA,CAAK,SAAA;AAAA,IACxC;AAEA,IAAA,IAAI,KAAK,YAAA,EAAc;AACnB,MAAA,IAAA,CAAK,kBAAA,EAAA;AACL,MAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACvB,QAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,IAAI,CAAA;AAAA,MACtC;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,UAAU,IAAIF,YAAA,CAAU,IAAA,CAAK,UAAA,EAAY,KAAK,aAAa,CAAA;AAEhE,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,MAAA,EAAQ,MAAM;AAC5B,MAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,kBAAA,EAAoB,KAAK,IAAI,CAAA;AAAA,IAC3D,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,SAAA,EAAW,CAAC,IAAA,KAAS;AACjC,MAAA,KAAK,IAAA,CAAK,UAAA,CAAY,IAAA,CAAgB,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,IAC1D,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AAC9B,MAAA,IAAA,CAAK,KAAK,OAAA,EAAS,IAAA,CAAK,OAAO,GAAG,CAAA,EAAG,KAAK,IAAI,CAAA;AAAA,IAClD,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,OAAA,EAAS,CAAC,MAAM,MAAA,KAAW;AACvC,MAAA,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,MAAA,CAAO,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,IAC/C,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,MAAA,EAAQ,MAAM;AAC1B,MAAA,IAAI,IAAA,CAAK,kBAAkB,IAAA,EAAM;AAC7B,QAAA;AAAA,MACJ;AACA,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,EAAI,GAAI,KAAK,aAAa,CAAA;AAAA,IAC5D,CAAC,CAAA;AAED,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,MAAA;AACJ,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAiB,CAAC,KAAK,GAAA,KAAQ;AAC/C,MAAA,OAAA,GAAU,GAAA;AACV,MAAA,MAAA,GAAS,GAAA;AAAA,IACb,CAAC,CAAA;AACD,IAAA,MAAM,QAAA,GAAW,EAAE,OAAA,EAAS,OAAA,EAAS,MAAA,EAAO;AAC5C,IAAA,IAAA,CAAK,kBAAkB,QAAA,CAAS,OAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AAEvC,IAAA,IAAI;AACA,MAAA,MAAM,QAAQ,IAAA,CAAK;AAAA,QACfG,WAAA,CAAK,KAAK,OAAA,EAAS,MAAA,EAAQ,EAAE,MAAA,EAAQ,UAAA,CAAW,QAAQ,CAAA;AAAA,QACxDA,WAAA,CAAK,KAAK,OAAA,EAAS,OAAA,EAAS,EAAE,MAAA,EAAQ,UAAA,CAAW,QAAQ;AAAA,OAC5D,CAAA;AAAA,IACL,CAAA,CAAA,MAAQ;AACJ,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAClB,CAAA,SAAE;AACE,MAAA,UAAA,CAAW,KAAA,EAAM;AACjB,MAAA,MAAM,YAAY,IAAA,CAAK,SAAA;AACvB,MAAA,QAAA,CAAS,QAAQ,SAAS,CAAA;AAC1B,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,IAC3B;AACA,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAA,CAAW,IAAA,GAAe,GAAA,eAAmB,SAAS,cAAA,EAA+B;AACvF,IAAA,IAAI,IAAA,CAAK,uBAAuB,IAAA,EAAM;AAClC,MAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,IAChB;AAEA,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,IAAA,IAAI,IAAA,CAAK,YAAY,IAAA,EAAM;AACvB,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI,KAAK,UAAA,EAAY;AACjB,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,MAAA,IAAA,CAAK,QAAQ,SAAA,EAAU;AACvB,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACjB,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,IAAA,IAAA,CAAK,kBAAA,GAAqBA,WAAA,CAAK,IAAA,CAAK,OAAA,EAAS,OAAO,CAAA,CAAE,IAAA;AAAA,MAClD,MAAM;AAAA,MAAC,CAAA;AAAA,MACP,MAAM;AAAA,MAAC;AAAA,KACX;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,IAAA,EAAM,MAAM,CAAA;AAC/B,IAAA,MAAM,IAAA,CAAK,kBAAA;AACX,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,WAAW,IAAA,EAA6B;AAC1C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAA;AAC3C,IAAA,IAAI,YAAY,IAAA,EAAM;AAClB,MAAA,OAAO,IAAA,CAAK,UAAA,CAAW,IAAA,wBAA4B,uBAAuB,CAAA;AAAA,IAC9E;AAEA,IAAA,IAAI,QAAQ,EAAA,KAAA,OAAA,cAAqB;AAC7B,MAAA,IAAA,CAAK,MAAA,GAAS,OAAA;AACd,MAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,IAC3B,CAAA,MAAA,IAAW,QAAQ,EAAA,KAAA,OAAA,cAAqB;AACpC,MAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,MAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,YAAY,CAAA,GAAI,OAAA,CAAQ,SAAA;AACnD,MAAA,IAAA,CAAK,KAAK,OAAA,EAAS,OAAA,CAAQ,SAAS,OAAA,CAAQ,SAAA,EAAW,KAAK,IAAI,CAAA;AAAA,IACpE;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,OAAA,EAAS,IAAA,CAAK,IAAI,CAAA;AAAA,EAC5C;AAAA,EAEA,QAAA,CAAS,MAAc,MAAA,EAAsB;AACzC,IAAA,IAAA,CAAK,QAAA,EAAS;AAGd,IAAA,MAAM,UAAA,GACF,KAAK,iBAAA,IAAsB,IAAA,CAAK,mBAAmB,CAAA,IAAK,IAAA,CAAK,sBAAsB,IAAA,CAAK,eAAA;AAE5F,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,YAAY,CAAA;AAC9C,MAAA,MAAM,UAAU,IAAA,CAAK,iBAAA;AACrB,MAAA,IAAA,CAAK,iBAAA,GAAoB,KAAA;AACzB,MAAA,IAAA,CAAK,KAAK,YAAA,EAAc,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,KAAK,IAAI,CAAA;AACxD,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI,KAAK,eAAA,EAAiB;AACtB,MAAA,IAAA,CAAK,UAAA,EAAW;AAChB,MAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,KAAK,IAAI,CAAA;AAC1C,MAAA;AAAA,IACJ;AAGA,IAAAD,kBAAW,MAAM;AACb,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,MAAA,KAAK,KAAK,OAAA,EAAQ;AAAA,IACtB,GAAG,CAAC,CAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CAAgB,MAAA,EAA6B,QAAA,EAAmC;AAClF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,SAAS,QAAQ,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,MAAA,EAAgD;AAClE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,OAAO,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,MAAA,EAA4C;AACjE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,kBAAA,CAAmB,MAAA,CAAO,OAAO,CAAA;AAAA,EACtD;AAAA,EAES,QAAA,GAAmB;AACxB,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EAChB;AACJ;AC3XO,IAAM,WAAA,GAAN,cAA0BH,mBAAAA,CAAgC;AAAA,EAC7D,OAAA;AAAA,EACA,MAAA,uBAAa,GAAA,EAA0B;AAAA,EAE9B,IAAA,uBAAW,GAAA,EAA0B;AAAA;AAAA,EAE9C,YAAY,MAAA,EAAgB;AACxB,IAAA,KAAA,CAAM,EAAE,iBAAA,EAAmB,KAAA,EAAO,CAAA;AAClC,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAEf,IAAA,MAAM,SAAA,GAAgC;AAAA,MAClC,QAAA,EAAU,KAAA;AAAA,MACV,YAAA,EAAc;AAAA,KAClB;AAEA,IAAA,MAAA,CAAO,iBAAiB,IAAA,EAAM;AAAA,MAC1B,IAAA,EAAM;AAAA,KACT,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAA,EAAwC;AACxC,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAA,EAAuB;AACvB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,GAAA,GAAsB;AACtB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAA,GAAe;AACf,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAA,EAAoC;AACvC,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,OAAA,CAAQ,IAAI,CAAA,gBAAA,CAAkB,CAAA;AAAA,IAC3D;AAEA,IAAA,MAAM,IAAA,GAAO,IAAI,YAAA,CAAa;AAAA,MAC1B,GAAG,OAAA;AAAA,MACH,QAAA,EAAU,IAAA,CAAK,OAAA,CAAQ,QAAA,IAAY;AAAA,KACtC,CAAA;AAGD,IAAA,IAAA,CAAK,EAAA,CAAG,SAAA,EAAW,CAAC,SAAA,EAAW,KAAA,KAAU;AACrC,MAAA,IAAA,CAAK,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,IAC7B,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,CAAC,OAAA,EAAS,WAAW,KAAA,KAAU;AAC5C,MAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,SAAS,CAAA;AAG3C,MAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG;AAC3B,QAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,CAAE,MAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MAC5C;AAEA,MAAA,IAAI,OAAA,EAAS;AACT,QAAA,KAAK,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,MACjC;AAAA,IACJ,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,GAAG,YAAA,EAAc,CAAC,IAAA,EAAM,MAAA,EAAQ,UAAU,KAAA,KAAU;AACrD,MAAA,IAAA,CAAK,KAAK,YAAA,EAAc,IAAA,EAAM,EAAE,IAAA,EAAM,QAAQ,CAAA;AAAA,IAClD,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,EAAO,SAAS,KAAA,KAAU;AAExC,MAAA,IAAA,CAAK,IAAA,CAAK,gBAAgB,IAAI,CAAA;AAAA,IAClC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,EAAO,KAAA,KAAU;AAC/B,MAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,KAAK,CAAA;AAAA,IAClC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,UAAA,EAAY,CAAC,OAAA,EAAS,KAAA,KAAU;AACpC,MAAA,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,OAAO,CAAA;AAAA,IAClC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAA;AAClC,IAAA,IAAA,CAAK,IAAA,CAAK,UAAU,IAAI,CAAA;AAExB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,IAAA,EAAgC;AACzC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AACjC,IAAA,IAAI,CAAC,IAAA,EAAM;AACP,MAAA,OAAO,KAAA;AAAA,IACX;AAGA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,IAAA,KAAS,IAAI,CAAA;AAChF,IAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,IAAI,CAAA,OAAA,EAAU,YAAA,CAAa,MAAM,CAAA,gBAAA,CAAkB,CAAA;AAAA,IAC9F;AAEA,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,IAAI,CAAA;AACvB,IAAA,IAAA,CAAK,IAAA,CAAK,OAAO,IAAI,CAAA;AACrB,IAAA,IAAA,CAAK,IAAA,CAAK,WAAW,IAAI,CAAA;AAEzB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAyB;AAC3B,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,CAAA;AAC9E,IAAA,MAAM,OAAA,CAAQ,WAAW,QAAQ,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAC9B,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,YAAY,CAAA;AACjF,IAAA,MAAM,OAAA,CAAQ,WAAW,QAAQ,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAA,GAA2B;AACvB,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,KAAK,CAAA;AAE/E,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AACzB,MAAA,OAAO,EAAC;AAAA,IACZ;AAGA,IAAA,OAAO,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAC7B,MAAA,MAAM,SAAS,CAAA,CAAE,KAAA;AACjB,MAAA,MAAM,SAAS,CAAA,CAAE,KAAA;AAEjB,MAAA,IAAI,CAAC,MAAA,EAAQ;AACT,QAAA,OAAO,CAAA;AAAA,MACX;AACA,MAAA,IAAI,CAAC,MAAA,EAAQ;AACT,QAAA,OAAO,EAAA;AAAA,MACX;AAGA,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,cAAA,IAAkB,MAAA,CAAO,OAAA,IAAW,CAAA,CAAA;AACzD,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,cAAA,IAAkB,MAAA,CAAO,OAAA,IAAW,CAAA,CAAA;AAEzD,MAAA,IAAI,UAAU,KAAA,EAAO;AACjB,QAAA,OAAO,KAAA,GAAQ,KAAA;AAAA,MACnB;AAGA,MAAA,MAAM,IAAA,GAAO,OAAO,GAAA,CAAI,YAAA;AACxB,MAAA,MAAM,IAAA,GAAO,OAAO,GAAA,CAAI,YAAA;AAExB,MAAA,IAAI,SAAS,IAAA,EAAM;AACf,QAAA,OAAO,IAAA,GAAO,IAAA;AAAA,MAClB;AAGA,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,IAAA,GAAO,OAAO,MAAA,CAAO,SAAA;AACnD,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,IAAA,GAAO,OAAO,MAAA,CAAO,SAAA;AAEnD,MAAA,OAAO,OAAA,GAAU,OAAA;AAAA,IACrB,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,GAAuB;AACvB,IAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAE7C,IAAA,OAAO;AAAA,MACH,OAAO,KAAA,CAAM,MAAA;AAAA,MACb,WAAW,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAA,CAAE,MAAA;AAAA,MAC5C,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA,CAAE,MAAA;AAAA,MACpC,cAAc,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,CAAA,CAAE,MAAA;AAAA,MAClD,OAAA,EAAS,KAAA,CAAM,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,IAAO,CAAA,CAAE,KAAA,EAAO,OAAA,IAAW,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,MAClE,cAAA,EAAgB,KAAA,CAAM,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,IAAO,CAAA,CAAE,KAAA,EAAO,cAAA,IAAkB,CAAA,CAAA,EAAI,CAAC;AAAA,KACpF;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAiC;AAC7B,IAAA,OAAO,IAAA,CAAK,OAAO,IAAA,EAAK;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAyC;AACrC,IAAA,OAAO,IAAA,CAAK,OAAO,MAAA,EAAO;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAoD;AAChD,IAAA,OAAO,IAAA,CAAK,OAAO,OAAA,EAAQ;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAU,IAAA,EAAqC;AACjD,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AACrB,MAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAAA,IAC7B;AAEA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AACjC,IAAA,IAAI,CAAC,IAAA,EAAM;AACP,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,IAAI,CAAA,WAAA,CAAa,CAAA;AAAA,IAC9C;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,SAAA,EAAU;AACvC,IAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAA,CAAS,IAAA,EAAsC,KAAA,EAAe,QAAA,EAA4B;AACtF,IAAA,IAAI,QAAA,EAAU;AACV,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AACrC,MAAA,IAAI,CAAC,IAAA,EAAM;AACP,QAAA,OAAO,KAAA;AAAA,MACX;AACA,MAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,IAAA,EAAM,MAAM,KAAK,CAAA;AAAA,IACxD;AAGA,IAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS,KAAK,iBAAA,CAAkB,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,KAAK,CAAC,CAAA;AAAA,EACzG;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,CAAkB,QAAA,EAAkB,IAAA,EAAsC,KAAA,EAAwB;AAC9F,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA;AACnC,IAAA,IAAI,CAAC,IAAA,EAAM;AACP,MAAA,OAAO,KAAA;AAAA,IACX;AAEA,IAAA,QAAQ,IAAA;AAAM,MACV,KAAK,QAAA;AACD,QAAA,OAAO,IAAA,CAAK,OAAA,EAAS,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA;AAAA,MAC5C,KAAK,QAAA;AACD,QAAA,OAAO,IAAA,CAAK,cAAA,EAAgB,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA;AAAA,MACnD,KAAK,QAAA;AACD,QAAA,OAAO,IAAA,CAAK,SAAS,IAAA,CAAK,CAAC,MAAwB,CAAA,CAAE,IAAA,KAAS,KAAK,CAAA,IAAK,KAAA;AAAA,MAC5E;AACI,QAAA,OAAO,KAAA;AAAA;AACf,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eAAe,IAAA,EAAmC;AACpD,IAAA,IAAI;AAEA,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,QAAA,EAAU;AAC/B,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,OAAA,EAAQ;AAAA,MACtC;AAAA,IACJ,SAAS,KAAA,EAAO;AACZ,MAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,KAAc,CAAA;AAAA,IAC3C;AAAA,EACJ;AACJ;;;AC3TO,IAAM,aAAN,MAAiB;AAAA,EACpB,cAAA,GAAuC,IAAA;AAAA,EACvC,KAAA;AAAA,EAEA,MAAA;AAAA,EACA,OAAA;AAAA,EAES,OAAA;AAAA,EACA,MAAA;AAAA,EAET,WAAA,CAAY,MAAA,EAAgB,IAAA,EAAc,OAAA,EAAiB;AACvD,IAAA,IAAI,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,IAC7D;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AACnC,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,IAAI,CAAA,WAAA,CAAa,CAAA;AAAA,IAC9C;AACA,IAAA,IAAI,CAAC,MAAM,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,IAAI,CAAA,WAAA,CAAa,CAAA;AAAA,IAC9C;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,YAAY,EAAE,OAAO,CAAA;AACjD,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,YAAY,EAAE,OAAO,CAAA;AACnD,IAAA,IAAI,CAAC,OAAA,EAAS;AACV,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAC5D;AAEA,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAEf,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAGd,IAAA,MAAM,SAAA,GAAgC;AAAA,MAClC,QAAA,EAAU,KAAA;AAAA,MACV,YAAA,EAAc;AAAA,KAClB;AAEA,IAAA,MAAA,CAAO,iBAAiB,IAAA,EAAM;AAAA,MAC1B,OAAA,EAAS,SAAA;AAAA,MACT,MAAA,EAAQ,EAAE,GAAG,SAAA,EAAW,YAAY,KAAA;AAAM,KACpB,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAA,GAAa;AACb,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAA,GAAe;AACf,IAAA,OAAO,IAAA,CAAK,QAAQ,KAAA,CAAM,IAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAA,GAA0B;AAC1B,IAAA,OAAO,KAAK,MAAA,CAAO,SAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAAoB;AACpB,IAAA,OAAO,KAAK,MAAA,CAAO,UAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAA,GAAoB;AACpB,IAAA,OAAO,KAAK,MAAA,CAAO,SAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAA,GAAoB;AACpB,IAAA,OAAO,KAAK,MAAA,CAAO,SAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAA,GAAsB;AACtB,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAA,GAAsB;AACtB,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAA,GAAsB;AACtB,IAAA,OAAO,KAAK,MAAA,CAAO,QAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAAqB;AACrB,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA,KAAM,IAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAAqB;AACrB,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,SAAA,EAAW;AAC/B,MAAA,OAAO,KAAA;AAAA,IACX;AACA,IAAA,OAAO,KAAK,MAAA,CAAO,SAAA,IAAa,KAAK,MAAA,CAAO,eAAA,KAAoB,KAAK,KAAA,CAAM,SAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAA,GAAwB;AACxB,IAAA,OAAO,KAAK,MAAA,CAAO,YAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAA,GAAwB;AACxB,IAAA,OAAO,CAAC,IAAA,CAAK,SAAA,IAAa,CAAC,IAAA,CAAK,YAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAA,GAAwB;AACxB,IAAA,OAAO,KAAK,cAAA,KAAmB,IAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAA2B;AAC3B,IAAA,OAAO,KAAK,MAAA,CAAO,UAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,KAAA,GAAuB;AACvB,IAAA,OAAO,KAAK,MAAA,CAAO,KAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAA,GAA0B;AAC1B,IAAA,OAAO,KAAK,MAAA,CAAO,QAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,aAAA,GAA+B;AAC/B,IAAA,OAAO,KAAK,MAAA,CAAO,eAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,MAAA,EAAgC;AAC1C,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,SAAS,MAAM,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,CAAQ,SAAA,GAAY,IAAA,CAAK,OAAO,UAAA,EAA2B;AAC7D,IAAA,MAAM,KAAK,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,SAAS,SAAS,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAC9B,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,UAAA,CAAW,KAAK,OAAO,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAW,IAAA,EAA6B;AAC1C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,IAAI,IAAI,CAAA;AAEvC,IAAA,IAAI,CAAC,IAAA,EAAM;AACP,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,IAAI,CAAA,WAAA,CAAa,CAAA;AAAA,IAC9C;AACA,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,IAAI,CAAA,WAAA,CAAa,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAI,IAAA,CAAK,mBAAmB,IAAA,EAAM;AAC9B,MAAA,OAAO,IAAA,CAAK,cAAA;AAAA,IAChB;AACA,IAAA,IAAI,IAAA,KAAS,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM;AAC1B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/C;AAEA,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,MAAA;AACJ,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAc,CAAC,KAAK,GAAA,KAAQ;AAC5C,MAAA,OAAA,GAAU,GAAA;AACV,MAAA,MAAA,GAAS,GAAA;AAAA,IACb,CAAC,CAAA;AACD,IAAA,MAAM,QAAA,GAAW,EAAE,OAAA,EAAS,OAAA,EAAS,MAAA,EAAO;AAC5C,IAAA,IAAA,CAAK,iBAAiB,QAAA,CAAS,OAAA;AAG/B,IAAA,MAAM,OAAA,GAAmC;AAAA,MACrC,KAAA,EAAO;AAAA,QACH,SAAA,EAAW,KAAK,MAAA,CAAO,UAAA;AAAA,QACvB,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,QACtB,SAAA,EAAW,KAAK,MAAA,CAAO,UAAA;AAAA,QACvB,KAAA,EAAO,KAAK,MAAA,CAAO;AAAA,OACvB;AAAA,MACA,OAAA,EAAS,KAAK,OAAA,CAAQ,OAAA;AAAA,MACtB,MAAA,EAAQ,KAAK,OAAA,CAAQ,MAAA;AAAA,MACrB,MAAA,EAAQ,KAAK,OAAA,CAAQ;AAAA,KACzB;AAEA,IAAA,MAAM,KAAA,GAAQ,KAAK,OAAA,CAAQ,KAAA;AAC3B,IAAA,MAAM,UAAA,GAAa,CAAC,IAAA,CAAK,OAAA,CAAQ,UAAU,KAAA,KAAU,IAAA;AAGrD,IAAA,IAAI,UAAA,IAAc,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,IAAI,CAAA,EAAG;AACtF,MAAA,OAAA,CAAQ,QAAQ,EAAE,OAAA,EAAS,MAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AACnE,MAAA,OAAA,CAAQ,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,QAAA;AAAA,IAC1C;AAGA,IAAA,MAAM,IAAA,CAAK,MAAM,IAAA,CAAK,aAAA,CAAc,KAAK,OAAO,CAAA,CAAE,MAAM,IAAI,CAAA;AAE5D,IAAA,MAAM,eAAe,IAAA,CAAK,KAAA;AAC1B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAEb,IAAA,IAAI;AAEA,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,KAAK,YAAA,CAAa,IAAA,CAAK,SAAS,OAAO,CAAA;AACjE,MAAA,IAAA,CAAK,MAAA,CAAO,eAAA,GAAkB,IAAA,CAAK,SAAA,IAAa,EAAA;AAChD,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,MAAM,CAAA;AAGlC,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,aAAA,EAAe,IAAA,EAAM,cAAc,UAAU,CAAA;AAC9D,MAAA,QAAA,CAAS,OAAA,EAAQ;AAAA,IACrB,SAAS,GAAA,EAAK;AACV,MAAA,QAAA,CAAS,OAAO,GAAG,CAAA;AACnB,MAAA,MAAM,GAAA;AAAA,IACV,CAAA,SAAE;AACE,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IAC1B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAmB;AACf,IAAA,OAAO,CAAA,WAAA,EAAc,KAAK,OAAO,CAAA,CAAA,CAAA;AAAA,EACrC;AACJ;;;ACjRO,IAAM,cAAN,MAAkB;AAAA,EACrB,MAAA,uBAAa,GAAA,EAAgC;AAAA,EAEpC,EAAA;AAAA,EACA,MAAA;AAAA,EAET,WAAA,CAAY,QAAgB,QAAA,EAAkB;AAC1C,IAAA,IAAI,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,EAAG;AACrC,MAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAA,CAAK,EAAA,GAAK,QAAA;AACV,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAGd,IAAA,MAAM,SAAA,GAAgC;AAAA,MAClC,QAAA,EAAU,KAAA;AAAA,MACV,YAAA,EAAc;AAAA,KAClB;AAEA,IAAA,MAAA,CAAO,iBAAiB,IAAA,EAAM;AAAA,MAC1B,EAAA,EAAI,SAAA;AAAA,MACJ,MAAA,EAAQ,EAAE,GAAG,SAAA,EAAW,YAAY,KAAA;AAAM,KACpB,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAA,GAAkB;AACd,IAAA,OAAO,CAAC,MAAM,IAAA,CAAK,IAAA,CAAK,OAAO,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC,IAAA,CAAK,OAAO,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAClG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,IAAA,EAAuB;AAC9B,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,IAAA,EAA6B;AACxC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,EAAG,OAAA;AACrC,IAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAChB,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,CAAC,KAAA,EAAO,OAAA,KAAY,KAAA,GAAQ,OAAA,EAAS,CAAC,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA;AAAA,EACzF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAA,GAA8C;AAC1C,IAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,OAAO,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,CAAC,KAAK,IAAA,EAAM,IAAA,CAAK,eAAe,IAAA,CAAK,IAAI,CAAC,CAAC,CAAA;AAAA,EAC3G;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAA,GAAkB;AACd,IAAA,OAAO,IAAA,CAAK,OAAO,KAAA,CAAM,QAAA,GAAW,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAC/C,MAAA,MAAM,QAAQ,IAAA,CAAK,cAAA,CAAe,CAAA,CAAE,IAAI,KAAK,MAAA,CAAO,gBAAA;AACpD,MAAA,MAAM,QAAQ,IAAA,CAAK,cAAA,CAAe,CAAA,CAAE,IAAI,KAAK,MAAA,CAAO,gBAAA;AACpD,MAAA,OAAO,KAAA,GAAQ,KAAA;AAAA,IACnB,CAAC,EAAE,CAAC,CAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,CAAC,kBAAkB,CAAA,CAAE,IAAA,EAAc,KAAA,EAA0B;AAEzD,IAAA,IAAI,CAAC,MAAM,SAAA,EAAW;AAClB,MAAA;AAAA,IACJ;AACA,IAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,CAAA,IAAK,KAAA,CAAM,QAAQ,CAAA,EAAG;AACpC,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAGlC,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,IAAA,CAAK,MAAA,CAAO,IAAI,IAAA,EAAM;AAAA,QAClB,OAAA,EAAS,CAAC,KAAA,CAAM,IAAI,CAAA;AAAA,QACpB,cAAc,KAAA,CAAM;AAAA,OACvB,CAAA;AACD,MAAA;AAAA,IACJ;AAGA,IAAA,IAAI,KAAA,CAAM,IAAA,GAAO,KAAA,CAAM,YAAA,GAAe,IAAA,EAAQ;AAC1C,MAAA;AAAA,IACJ;AAEA,IAAA,KAAA,CAAM,eAAe,KAAA,CAAM,IAAA;AAC3B,IAAA,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAG7B,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AAC1B,MAAA,KAAA,CAAM,QAAQ,KAAA,EAAM;AAAA,IACxB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACV,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAAoB;AACpB,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAmB;AACf,IAAA,OAAO,CAAA,YAAA,EAAe,KAAK,EAAE,CAAA,CAAA,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAKE;AACE,IAAA,OAAO;AAAA,MACH,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,MAAA,EAAQ,KAAK,MAAA,EAAO;AAAA,MACpB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,KAAK,CAAA,MAAO;AAAA,QAC7D,IAAA;AAAA,QACA,WAAA,EAAa,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAAA,QACrC,OAAA,EAAS,MAAM,OAAA,CAAQ;AAAA,OAC3B,CAAE;AAAA,KACN;AAAA,EACJ;AACJ;;;ACvJO,IAAM,eAAN,MAA+D;AAAA,EAClE,MAAA,uBAAa,GAAA,EAA2B;AAAA,EACxC,OAAA,uBAAc,GAAA,EAAwB;AAAA,EAEtC,MAAA,uBAAa,GAAA,EAAyB;AAAA,EACtC,SAAA,uBAAgB,GAAA,EAA2B;AAAA,EAElC,OAAA,uBAAc,GAAA,EAAyB;AAAA,EACvC,MAAA;AAAA,EAET,YAAY,MAAA,EAAgB;AACxB,IAAA,IAAI,MAAA,CAAO,WAAW,MAAA,EAAW;AAC7B,MAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,IAClB,CAAA,MAAO;AACH,MAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,IAC5D;AAEA,IAAA,MAAM,SAAA,GAAgC;AAAA,MAClC,QAAA,EAAU,KAAA;AAAA,MACV,YAAA,EAAc;AAAA,KAClB;AAEA,IAAA,MAAA,CAAO,iBAAiB,IAAA,EAAM;AAAA,MAC1B,OAAA,EAAS,SAAA;AAAA,MACT,MAAA,EAAQ,EAAE,GAAG,SAAA,EAAW,YAAY,KAAA;AAAM,KACpB,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAA,GAAe;AACf,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,EAAyC;AACzC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,EAA0B;AAC1B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAO;AACH,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,EAAK;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAS;AACL,IAAA,OAAO,IAAA,CAAK,QAAQ,MAAA,EAAO;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAU;AACN,IAAA,OAAO,IAAA,CAAK,QAAQ,OAAA,EAAQ;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAA,CAAQ,OAAA,EAAiB,MAAA,GAAS,WAAA,EAA4B;AAChE,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA,EAAG;AACjC,MAAA,OAAO,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,SAAS,MAAM,CAAA;AAAA,IACrD;AACA,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,EAAG;AAC7B,MAAA,OAAO,KAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,IAAK,QAAQ,OAAA,EAAQ;AAAA,IAC1D;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,MAAA;AACJ,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAc,CAAC,KAAK,GAAA,KAAQ;AAC5C,MAAA,OAAA,GAAU,GAAA;AACV,MAAA,MAAA,GAAS,GAAA;AAAA,IACb,CAAC,CAAA;AACD,IAAA,MAAM,QAAA,GAAW,EAAE,OAAA,EAAS,OAAA,EAAS,MAAA,EAAO;AAC5C,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAA,EAAS,QAAA,CAAS,OAAO,CAAA;AAE5C,IAAA,IAAI,IAAA,CAAK,YAAY,CAAA,CAAE,OAAO,GAAG,SAAA,EAAW;AACxC,MAAA,MAAM,KAAA,CAAM,UAAA,EAAW,CAAE,KAAA,CAAM,IAAI,CAAA;AAAA,IACvC;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,OAAO,CAAA;AAC1B,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,OAAO,CAAA;AAE3B,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,cAAA,EAAgB,KAAA,EAAO,MAAM,CAAA;AAE9C,IAAA,QAAA,CAAS,OAAA,EAAQ;AACjB,IAAA,IAAA,CAAK,SAAA,CAAU,OAAO,OAAO,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAA,CAAQ,OAAA,EAAiB,OAAA,EAAiB,OAAA,EAA+C;AAC3F,IAAA,IAAI,CAAC,QAAA,CAAS,OAAA,EAAS,cAAc,CAAA,EAAG;AACpC,MAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,IACxD;AACA,IAAA,IAAI,CAAC,QAAA,CAAS,OAAA,EAAS,cAAc,CAAA,EAAG;AACpC,MAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AAC9C,IAAA,IAAI,cAAA,EAAgB;AAChB,MAAA,IAAI,cAAA,CAAe,YAAY,OAAA,EAAS;AACpC,QAAA,OAAO,cAAA,CAAe,OAAA;AAAA,MAC1B;AACA,MAAA,cAAA,CAAe,MAAA,CAAO,IAAI,KAAA,CAAM,iCAAiC,CAAC,CAAA;AAAA,IACtE;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,OAAO,CAAA;AAE1B,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,MAAA;AACJ,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAoB,CAAC,KAAK,GAAA,KAAQ;AAClD,MAAA,OAAA,GAAU,GAAA;AACV,MAAA,MAAA,GAAS,GAAA;AAAA,IACb,CAAC,CAAA;AACD,IAAA,MAAM,OAAA,GAAuB;AAAA,MACzB,OAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAM,OAAA,EAAS,IAAA;AAAA,MACf,SAAS,OAAA,EAAS,OAAA;AAAA,MAClB,MAAA,EAAQ,UAAU,EAAE,OAAA,EAAS,QAAQ,OAAA,EAAS,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO,GAAI;AAAA,KAC7E;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AAGhC,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,kBAAA,CAAmB,OAAA,EAAS;AAAA,MAClD,EAAA,EAAI,CAAA;AAAA,MACJ,CAAA,EAAG;AAAA,QACC,QAAA,EAAU,OAAA;AAAA,QACV,UAAA,EAAY,OAAA;AAAA,QACZ,SAAA,EAAW,KAAA;AAAA,QACX,SAAA,EAAW;AAAA;AACf,KACH,CAAA;AAGD,IAAA,MAAM,UAAUG,mBAAAA,CAAW,IAAA,EAAQ,QAAW,EAAE,GAAA,EAAK,OAAO,CAAA;AAC5D,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,OAAA,CAAQ,OAAA,EAAS,OAAO,CAAC,CAAA;AAE5D,IAAA,IAAI,WAAW,MAAA,EAAW;AACtB,MAAA,IAAA,CAAK,MAAA,CAAO,OAAO,OAAO,CAAA;AAC1B,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAChD;AAEA,IAAA,OAAO,MAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAW,OAAA,EAAgC;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,kBAAA,CAAmB,OAAA,EAAS;AAAA,MAClD,EAAA,EAAI,CAAA;AAAA,MACJ,CAAA,EAAG;AAAA,QACC,QAAA,EAAU,OAAA;AAAA,QACV,UAAA,EAAY,IAAA;AAAA,QACZ,SAAA,EAAW,KAAA;AAAA,QACX,SAAA,EAAW;AAAA;AACf,KACH,CAAA;AAED,IAAA,KAAA,CAAM,UAAA,GAAa,EAAA;AACnB,IAAA,KAAA,CAAM,SAAA,GAAY,KAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,OAAA,EAAuC;AAClD,IAAA,IAAI,OAAA,CAAQ,MAAM,OAAA,EAAS;AACvB,MAAA,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,IAC7B,CAAA,MAAA,IAAW,OAAA,CAAQ,CAAA,KAAM,oBAAA,EAAsB;AAC3C,MAAA,IAAA,CAAK,wBAAwB,OAAO,CAAA;AAAA,IACxC,CAAA,MAAA,IAAW,OAAA,CAAQ,CAAA,KAAM,qBAAA,EAAuB;AAC5C,MAAA,IAAA,CAAK,yBAAyB,OAAO,CAAA;AAAA,IACzC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,CAAC,YAAY,CAAA,CAAE,OAAA,EAA4C;AACvD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,CAAC,YAAY,CAAA,CAAE,OAAA,EAAiB,OAAA,EAAuC;AACnE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACrC,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,MAAA,CAAO,MAAA,CAAO,OAAO,OAAO,CAAA;AAAA,IAChC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,CAAC,kBAAkB,CAAA,CAAE,OAAA,EAAiB,IAAA,EAAc,QAAgB,QAAA,EAAyB;AACzF,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,YAAA,EAAc,KAAA,EAAO,IAAA,EAAM,QAAQ,QAAQ,CAAA;AAG5D,IAAA,MAAM,aAAA,GACD,oCACA,IAAA,KAAA,IAAA,kCACA,IAAA,KAAA,IAAA;AAEL,IAAA,IAAI,aAAA,EAAe;AACf,MAAA,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,cAAA,EAAiB,MAAM,KAAK,IAAI,CAAA,CAAA,CAAG,CAAA,CAAE,KAAA,CAAM,IAAI,CAAA;AAAA,IACzE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAA,EAAiC;AAE1C,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAClB,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAwB,OAAA,EAAwC;AAC5D,IAAA,MAAM,EAAE,CAAA,EAAG,IAAA,EAAK,GAAI,OAAA;AACpB,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA;AAErB,IAAA,IAAI,CAAC,OAAA,IAAW,IAAA,CAAK,OAAA,KAAY,IAAA,CAAK,OAAO,QAAA,EAAU;AACnD,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AAGnC,IAAA,IAAI,IAAA,CAAK,eAAe,IAAA,EAAM;AAC1B,MAAA,IAAI,KAAA,EAAO;AACP,QAAA,KAAA,CAAM,UAAA,GAAa,EAAA;AACnB,QAAA,KAAA,CAAM,SAAA,GAAY,KAAA;AAAA,MACtB;AACA,MAAA;AAAA,IACJ;AAGA,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,KAAA,GAAQ;AAAA,QACJ,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,KAAA,EAAO,EAAA;AAAA,QACP,QAAA,EAAU,EAAA;AAAA,QACV,SAAA,EAAW,KAAA;AAAA,QACX,eAAA,EAAiB,EAAA;AAAA,QACjB,YAAA,EAAc,KAAA;AAAA,QACd,SAAA,EAAW;AAAA,OACf;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,KAAK,CAAA;AAAA,IAClC,CAAA,MAAO;AACH,MAAA,KAAA,CAAM,aAAa,IAAA,CAAK,UAAA;AACxB,MAAA,KAAA,CAAM,aAAa,IAAA,CAAK,UAAA;AACxB,MAAA,KAAA,CAAM,OAAO,IAAA,CAAK,IAAA;AAClB,MAAA,KAAA,CAAM,OAAO,IAAA,CAAK,IAAA;AAClB,MAAA,KAAA,CAAM,YAAY,IAAA,CAAK,SAAA;AACvB,MAAA,KAAA,CAAM,YAAY,IAAA,CAAK,SAAA;AACvB,MAAA,KAAA,CAAM,WAAW,IAAA,CAAK,QAAA;AAAA,IAC1B;AAEA,IAAA,KAAK,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,yBAAyB,OAAA,EAAyC;AAC9D,IAAA,MAAM,EAAE,CAAA,EAAG,IAAA,EAAK,GAAI,OAAA;AACpB,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA;AAErB,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AAEnC,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,KAAA,GAAQ;AAAA,QACJ,UAAA,EAAY,EAAA;AAAA,QACZ,UAAA,EAAY,EAAA;AAAA,QACZ,IAAA,EAAM,KAAA;AAAA,QACN,IAAA,EAAM,KAAA;AAAA,QACN,SAAA,EAAW,KAAA;AAAA,QACX,SAAA,EAAW,KAAA;AAAA,QACX,QAAA,EAAU,KAAA;AAAA,QACV,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,QAAA,EAAU,KAAK,QAAA,IAAY,EAAA;AAAA,QAC3B,SAAA,EAAW,KAAA;AAAA,QACX,eAAA,EAAiB,EAAA;AAAA,QACjB,YAAA,EAAc,KAAA;AAAA,QACd,SAAA,EAAW;AAAA,OACf;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,KAAK,CAAA;AAAA,IAClC,CAAA,MAAO;AACH,MAAA,KAAA,CAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,MAAA,KAAA,CAAM,QAAA,GAAW,KAAK,QAAA,IAAY,EAAA;AAAA,IACtC;AAGA,IAAA,IAAI,MAAM,QAAA,EAAU;AAChB,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,kBAAkB,CAAA;AACrD,MAAA,IAAI,KAAA,GAAQ,CAAC,CAAA,EAAG;AACZ,QAAA,KAAA,CAAM,SAAA,GAAY,MAAM,CAAC,CAAA;AAGzB,QAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpC,UAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,SAAA,EAAW,IAAI,YAAY,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,QACnF;AAAA,MACJ;AAAA,IACJ;AAEA,IAAA,KAAK,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,OAAA,EAAgC;AAC9C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACrC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AAEvC,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,OAAA,EAAS;AACpB,MAAA;AAAA,IACJ;AAGA,IAAA,IAAI,CAAC,KAAA,CAAM,UAAA,IAAc,CAAC,KAAA,CAAM,UAAA,IAAc,CAAC,KAAA,CAAM,KAAA,IAAS,CAAC,KAAA,CAAM,QAAA,EAAU;AAC3E,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,OAAO,CAAA;AAE1B,IAAA,IAAI;AAEA,MAAA,MAAM,QAAA,GACF,QAAQ,IAAA,KACP,KAAA,CAAM,aAAa,IAAA,CAAK,OAAA,CAAQ,IAAI,KAAA,CAAM,SAAS,GAAG,eAAA,EAAgB,EAAG,SAC1E,IAAA,CAAK,MAAA,CAAO,MAAM,QAAA,EAAS,CAAE,CAAC,CAAA,EAAG,IAAA;AAErC,MAAA,IAAI,CAAC,QAAA,EAAU;AACX,QAAA,MAAM,IAAI,MAAM,oBAAoB,CAAA;AAAA,MACxC;AAGA,MAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAI,OAAO,CAAA;AAC1C,MAAA,IAAI,CAAC,KAAA,EAAO;AACR,QAAA,KAAA,GAAQ,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO;AAAA,UACpC,OAAA;AAAA,UACA,SAAS,KAAA,CAAM,UAAA;AAAA,UACf,IAAA,EAAM,QAAA;AAAA,UACN,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,GAAG,OAAA,CAAQ;AAAA,SACd,CAAA;AAAA,MACL;AAGA,MAAA,MAAM,QAAQ,IAAI,UAAA,CAAW,IAAA,CAAK,MAAA,EAAQ,UAAU,OAAO,CAAA;AAC3D,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAA,EAAS,KAAK,CAAA;AAE/B,MAAA,KAAA,CAAM,SAAA,GAAY,IAAA;AAClB,MAAA,KAAA,CAAM,eAAA,GAAkB,KAAA,CAAM,IAAA,CAAK,SAAA,IAAa,EAAA;AAEhD,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,cAAA,EAAgB,KAAK,CAAA;AACtC,MAAA,OAAA,CAAQ,QAAQ,KAAK,CAAA;AAAA,IACzB,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,MAAA,CAAO,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAAA,IAC5E;AAAA,EACJ;AACJ;;;AC5bO,IAAM,KAAA,GAAN,MAAM,MAAA,CAAsG;AAAA;AAAA;AAAA;AAAA,EAI/G,EAAA;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAQ,eAAA;AAAA;AAAA;AAAA;AAAA,EAKR,MAAA,GAAS,gBAAA;AAAA;AAAA;AAAA;AAAA,EAKT,MAAA,GAAS,KAAA;AAAA;AAAA;AAAA;AAAA,EAKT,UAAA,GAAa,KAAA;AAAA;AAAA;AAAA;AAAA,EAKb,QAAA,GAAW,CAAA;AAAA;AAAA;AAAA;AAAA,EAKX,iBAAA,GAAoB,OAAA;AAAA;AAAA;AAAA;AAAA,EAKpB,GAAA,GAAqB,IAAA;AAAA;AAAA;AAAA;AAAA,EAKrB,IAAA,GAAsB,IAAA;AAAA;AAAA;AAAA;AAAA,EAKtB,GAAA,GAAqB,IAAA;AAAA;AAAA;AAAA;AAAA,EAKrB,UAAA,GAA4B,IAAA;AAAA;AAAA;AAAA;AAAA,EAK5B,WAAW,EAAC;AAAA;AAAA;AAAA;AAAA,EAKZ,aAAa,EAAC;AAAA;AAAA;AAAA;AAAA,EAKd,OAAA;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAa,SAAA;AAAA,EAEb,IAAI,UAAA,GAAqB;AACrB,IAAA,OAAO,IAAA,CAAK,EAAA;AAAA,EAChB;AAAA,EAEA,IAAI,MAAA,GAAkB;AAClB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAChB;AAAA,EAEA,IAAI,QAAA,GAAoB;AACpB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EAChB;AAAA,EAEA,IAAI,iBAAA,GAA4B;AAC5B,IAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,EAChB;AAAA,EAEA,IAAI,MAAA,GAAiB;AACjB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EAChB;AAAA,EAEA,IAAI,SAAA,GAA2B;AAC3B,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EAChB;AAAA,EAEA,IAAI,IAAA,GAAO;AACP,IAAA,OAAO;AAAA,MACH,YAAY,IAAA,CAAK,EAAA;AAAA,MACjB,QAAA,EAAU,CAAA;AAAA,MACV,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,QAAQ,IAAA,CAAK,QAAA;AAAA,MACb,UAAU,IAAA,CAAK,MAAA;AAAA,MACf,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,YAAY,IAAA,CAAK;AAAA,KACrB;AAAA,EACJ;AAAA,EAEA,YAAY,IAAA,EAAsC;AAC9C,IAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,EAAG;AACjB,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAClD;AACA,IAAA,IAAI,CAAC,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IACjD;AAGA,IAAA,IAAI,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,WAAW,CAAA,EAAG;AAC7C,MAAA,IAAA,CAAK,EAAA,GAAK,KAAK,IAAA,CAAK,UAAA;AAAA,IACxB,CAAA,MAAO;AACH,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACvD;AAGA,IAAA,IAAI,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS,WAAW,CAAA,EAAG;AACrC,MAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AAAA,IACxB,CAAA,MAAO;AACH,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAChE;AAGA,IAAA,IAAI,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,WAAW,CAAA,EAAG;AACxC,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,IAAA,CAAK,KAAA;AAAA,IAC3B;AACA,IAAA,IAAI,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,WAAW,CAAA,EAAG;AACzC,MAAA,IAAA,CAAK,MAAA,GAAS,KAAK,IAAA,CAAK,MAAA;AAAA,IAC5B;AAGA,IAAA,IAAI,IAAA,CAAK,KAAK,QAAA,EAAU;AACpB,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAAA,IAClB;AACA,IAAA,IAAI,IAAA,CAAK,KAAK,UAAA,EAAY;AACtB,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACtB;AAGA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACb,MAAA,IAAA,CAAK,WAAW,MAAA,CAAO,iBAAA;AACvB,MAAA,IAAA,CAAK,iBAAA,GAAoB,MAAA;AAAA,IAC7B,WAAW,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA,EAAG;AAC5C,MAAA,IAAA,CAAK,QAAA,GAAW,KAAK,IAAA,CAAK,MAAA;AAC1B,MAAA,IAAA,CAAK,iBAAA,GAAoB,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA;AAAA,IACzD;AAGA,IAAA,IAAI,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,WAAW,CAAA,EAAG;AACtC,MAAA,IAAA,CAAK,GAAA,GAAM,KAAK,IAAA,CAAK,GAAA;AAAA,IACzB;AACA,IAAA,IAAI,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,WAAW,CAAA,EAAG;AACvC,MAAA,IAAA,CAAK,IAAA,GAAO,KAAK,IAAA,CAAK,IAAA;AAAA,IAC1B;AAGA,IAAA,IAAI,QAAA,CAAS,IAAA,CAAK,GAAA,EAAK,KAAK,CAAA,EAAG;AAC3B,MAAA,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA;AAAA,IACpB;AACA,IAAA,IAAI,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA,EAAG;AACvC,MAAA,IAAA,CAAK,UAAA,GAAa,KAAK,IAAA,CAAK,UAAA;AAAA,IAChC;AAGA,IAAA,IAAI,QAAA,CAAS,IAAA,CAAK,QAAA,EAAU,WAAW,CAAA,EAAG;AACtC,MAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AAAA,IACzB;AACA,IAAA,IAAI,QAAA,CAAS,IAAA,CAAK,UAAA,EAAY,WAAW,CAAA,EAAG;AACxC,MAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA;AAAA,IAC3B;AAGA,IAAA,IAAI,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,WAAW,CAAA,EAAG;AAC7C,MAAA,IAAA,CAAK,UAAA,GAAa,KAAK,IAAA,CAAK,UAAA;AAAA,IAChC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAmB;AACf,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAkC;AAC9B,IAAA,OAAO;AAAA,MACH,YAAY,IAAA,CAAK,EAAA;AAAA,MACjB,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,WAAW,IAAA,CAAK,UAAA;AAAA,MAChB,QAAQ,IAAA,CAAK,UAAA;AAAA,MACb,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,UAAU,IAAA,CAAK,MAAA;AAAA,MACf,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,YAAY,IAAA,CAAK;AAAA,KACrB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAqC;AACjC,IAAA,OAAO,IAAI,MAAA,CAAM;AAAA,MACb,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,IAAA,EAAM;AAAA,QACF,GAAG,IAAA,CAAK,IAAA;AAAA,QACR,QAAQ,IAAA,CAAK,QAAA;AAAA,QACb,UAAU,IAAA,CAAK;AAAA,OACnB;AAAA,MACA,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,YAAY,IAAA,CAAK;AAAA,KACc,CAAA;AAAA,EACvC;AACJ;;;AC1OO,IAAM,WAAN,MAAiE;AAAA;AAAA;AAAA;AAAA,EAIpE,IAAA,GAAO,kBAAA;AAAA;AAAA;AAAA;AAAA,EAKP,aAAA,GAAgB,EAAA;AAAA;AAAA;AAAA;AAAA,EAKhB,SAAkB,EAAC;AAAA;AAAA;AAAA;AAAA,EAKnB,aAAa,EAAC;AAAA;AAAA;AAAA;AAAA,EAKd,QAAA,GAAW,CAAA;AAAA;AAAA;AAAA;AAAA,EAKX,iBAAA,GAAoB,OAAA;AAAA,EAEpB,YAAY,IAAA,EAA+B;AACvC,IAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,EAAG;AACjB,MAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,IACrD;AACA,IAAA,IAAI,CAAC,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IACpD;AACA,IAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,EAAG;AACvB,MAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,IACtD;AAGA,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,QAAQ,IAAI,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AACtC,MAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACf,QAAA,IAAA,CAAK,YAAY,KAAA,CAAM,QAAA;AAAA,MAC3B;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IAC1B;AAGA,IAAA,IAAI,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,WAAW,CAAA,EAAG;AACvC,MAAA,IAAA,CAAK,IAAA,GAAO,KAAK,IAAA,CAAK,IAAA;AAAA,IAC1B,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS,EAAA,EAAI;AAC9B,MAAA,IAAA,CAAK,IAAA,GAAO,EAAA;AAAA,IAChB;AAGA,IAAA,IAAI,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,aAAA,EAAe,OAAO,CAAA,EAAG;AAC5C,MAAA,IAAA,CAAK,aAAA,GAAgB,KAAK,IAAA,CAAK,aAAA;AAAA,IACnC;AAGA,IAAA,IAAI,QAAA,CAAS,IAAA,CAAK,UAAA,EAAY,WAAW,CAAA,EAAG;AACxC,MAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA;AAAA,IAC3B;AAGA,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACnB,MAAA,IAAA,CAAK,iBAAA,GAAoB,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA;AAAA,IACzD;AAAA,EACJ;AAAA,EAEA,IAAI,QAAA,GAAyB;AACzB,IAAA,IAAI,KAAK,aAAA,GAAgB,CAAA,IAAK,KAAK,aAAA,IAAiB,IAAA,CAAK,OAAO,MAAA,EAAQ;AACpE,MAAA,OAAO,IAAA;AAAA,IACX;AACA,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA,IAAK,IAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,GAAsC;AAClC,IAAA,OAAO,KAAK,QAAA,IAAY,MAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAA,GAAiB;AACjB,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAA,GAAqB;AACrB,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,iBAAA,GAA4B;AAC5B,IAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAmB;AACf,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAkC;AAC9B,IAAA,OAAO;AAAA,MACH,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,MAAA,EAAQ,KAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAA;AAAA,MACzC,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,mBAAmB,IAAA,CAAK,iBAAA;AAAA,MACxB,YAAY,IAAA,CAAK;AAAA,KACrB;AAAA,EACJ;AACJ;;;ACxHO,IAAM,gBAAN,MAAoB;AAAA,EACvB,OAAA;AAAA,EACA,QAAA;AAAA,EAEA,WAAA,CAAY,QAAgB,OAAA,EAAiB;AACzC,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAA,GAAmB;AACnB,IAAA,MAAM,QAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,GAAA,CAAI,KAAK,QAAQ,CAAA;AACpD,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,OAAQ,KAAA,CAA4D,SAAS,CAAA,EAAG,OAAA,IAAW,EAAC;AAAA,EAChG;AAAA;AAAA;AAAA;AAAA,EAKA,IAAyB,GAAA,EAAmC;AAExD,IAAA,IAAI,QAAQ,eAAA,EAAiB;AACzB,MAAA,OAAO,MAAA;AAAA,IACX;AACA,IAAA,OAAO,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CAAyB,GAAA,EAAQ,KAAA,EAAqC;AACxE,IAAA,MAAM,QAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,GAAA,CAAI,KAAK,QAAQ,CAAA;AACpD,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,OAAA,GAAU,EAAE,GAAG,IAAA,CAAK,MAAM,CAAC,GAAG,GAAG,KAAA,EAAM;AAG7C,IAAA,MAAO,KAAA,CAAkE,SAAS,CAAA,CAAE,EAAE,SAAS,CAAA;AAAA,EACnG;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,MAAA,EAA+B;AAE3C,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,EAAK,KAAK,GAAA,CAAI,CAAA,EAAK,MAAM,CAAC,CAAA;AACnD,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,OAAO,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAA,GAAiB;AACjB,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,IAAK,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,KAAA,EAAuC;AACtD,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,KAAK,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAA6B;AAC7B,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,IAAK,EAAC;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,OAAA,EAAuC;AACpD,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,GAAqC;AACrC,IAAA,OAAO,IAAA,CAAK,IAAI,SAAS,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,SAAA,EAA2C;AAC1D,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,SAAS,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAAyC;AACzC,IAAA,OAAO,IAAA,CAAK,IAAI,WAAW,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,OAAA,EAAuC;AACpD,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,GAAqC;AACrC,IAAA,OAAO,IAAA,CAAK,IAAI,SAAS,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,OAAA,EAAuC;AACpD,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,GAAqC;AACrC,IAAA,OAAO,IAAA,CAAK,IAAI,SAAS,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,QAAA,EAAyC;AACvD,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,QAAQ,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAA,GAAuC;AACvC,IAAA,OAAO,IAAA,CAAK,IAAI,UAAU,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,GAAgC;AAClC,IAAA,MAAM,IAAA,CAAK,OAAO,WAAW,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAA8B;AAChC,IAAA,MAAM,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,GAAgC;AAClC,IAAA,MAAM,IAAA,CAAK,OAAO,WAAW,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAA8B;AAChC,IAAA,MAAM,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAA8B;AAChC,IAAA,MAAM,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,GAA+B;AACjC,IAAA,MAAM,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAA0B;AAC5B,IAAA,MAAM,KAAK,KAAA,EAAM;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,GAAA,EAAyB;AACzB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAC3B,IAAA,OAAO,KAAA,KAAU,UAAa,KAAA,KAAU,IAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,GAAA,EAAkC;AAC3C,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AAChB,MAAA,OAAO,KAAA;AAAA,IACX;AAEA,IAAA,MAAM,QAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,GAAA,CAAI,KAAK,QAAQ,CAAA;AACpD,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,OAAA,GAAU,EAAE,GAAG,IAAA,CAAK,IAAA,EAAK;AAC/B,IAAA,OAAO,QAAQ,GAAG,CAAA;AAGlB,IAAA,MAAO,KAAA,CAAkE,SAAS,CAAA,CAAE,EAAE,SAAS,CAAA;AAE/F,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAM,IAAA,EAA2C;AACnD,IAAA,MAAM,QAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,GAAA,CAAI,KAAK,QAAQ,CAAA;AACpD,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AAAA,IACrC;AAEA,IAAA,IAAI,UAAsB,EAAC;AAE3B,IAAA,IAAI,SAAS,QAAA,EAAU;AAEnB,MAAA,IAAI,IAAA,CAAK,KAAK,aAAA,EAAe;AACzB,QAAA,OAAA,CAAQ,aAAA,GAAgB,KAAK,IAAA,CAAK,aAAA;AAAA,MACtC;AAAA,IACJ,CAAA,MAAA,IAAW,SAAS,QAAA,EAAU;AAE1B,MAAA,MAAM,EAAE,aAAA,EAAe,CAAA,EAAG,GAAG,aAAA,KAAkB,IAAA,CAAK,IAAA;AACpD,MAAA,OAAA,GAAU,aAAA;AAAA,IACd;AAIA,IAAA,MAAO,KAAA,CAAkE,SAAS,CAAA,CAAE,EAAE,SAAS,CAAA;AAAA,EACnG;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,OAAA,EAA6C;AACrD,IAAA,MAAM,QAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,GAAA,CAAI,KAAK,QAAQ,CAAA;AACpD,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,aAAa,EAAE,GAAG,IAAA,CAAK,IAAA,EAAM,GAAG,OAAA,EAAQ;AAG9C,IAAA,MAAO,MAAkE,SAAS,CAAA,CAAE,EAAE,OAAA,EAAS,YAAY,CAAA;AAAA,EAC/G;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAY,MAAA,EAAqC;AACnD,IAAA,MAAM,KAAA,GAAQ,UAAU,MAAM,CAAA;AAC9B,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,MAAM,CAAA,CAAE,CAAA;AAAA,IAClD;AACA,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,KAAK,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,GAAmC;AAC/B,IAAA,OAAO,MAAA,CAAO,KAAK,SAAS,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAgB,IAAA,EAAoC;AAChD,IAAA,OAAO,IAAA,IAAQ,SAAA;AAAA,EACnB;AACJ;;;ACtSO,IAAM,QAAN,MAAoE;AAAA,EACvE,OAAA;AAAA,EAEA,SAAA,GAAY,KAAA;AAAA,EACZ,WAAA,GAA0B,MAAA;AAAA,EAE1B,UAAmB,EAAC;AAAA,EACpB,kBAA2B,EAAC;AAAA,EAE5B,UAAU,EAAC;AAAA,EAEF,KAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EAET,WAAA,CAAY,MAAA,EAAgB,OAAA,EAAiB,OAAA,EAAmB;AAC5D,IAAA,IAAI,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,YAAY,EAAE,OAAO,CAAA;AACnD,IAAA,IAAI,CAAC,OAAA,EAAS;AACV,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAC5D;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACvC,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAChE;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAI,YAAY,MAAA,EAAW;AACvB,MAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,IACnB;AAEA,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,aAAA,CAAc,MAAA,EAAQ,OAAO,CAAA;AAChD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAGd,IAAA,MAAM,SAAA,GAAgC;AAAA,MAClC,QAAA,EAAU,KAAA;AAAA,MACV,YAAA,EAAc;AAAA,KAClB;AAEA,IAAA,MAAA,CAAO,iBAAiB,IAAA,EAAM;AAAA,MAC1B,KAAA,EAAO,SAAA;AAAA,MACP,OAAA,EAAS,SAAA;AAAA,MACT,MAAA,EAAQ,EAAE,GAAG,SAAA,EAAW,YAAY,KAAA;AAAM,KAC7C,CAAA;AAAA,EACL;AAAA,EAEA,IAAI,IAAA,GAAO;AACP,IAAA,OAAO,IAAA,CAAK,MAAM,aAAA,GACZ,IAAA,CAAK,OAAO,KAAA,CAAM,GAAA,CAAI,KAAK,CAAC,CAAA,KAAM,EAAE,SAAA,KAAc,IAAA,CAAK,MAAM,aAAa,CAAA,GAC1E,KAAK,MAAA,CAAO,KAAA,CAAM,QAAA,EAAS,CAAE,CAAC,CAAA;AAAA,EACxC;AAAA,EAEA,IAAI,IAAA,GAAO;AACP,IAAA,OAAO,KAAK,IAAA,EAAM,IAAA;AAAA,EACtB;AAAA,EAEA,IAAI,OAAA,GAAkB;AAClB,IAAA,OAAO,KAAK,KAAA,CAAM,OAAA;AAAA,EACtB;AAAA,EAEA,IAAI,MAAA,GAAiB;AACjB,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA;AAAA,EACxB;AAAA,EAEA,IAAI,MAAA,GAAkB;AAClB,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA;AAAA,EACxB;AAAA,EAEA,IAAI,OAAA,GAAmB;AACnB,IAAA,OAAO,IAAA,CAAK,KAAA,KAAU,IAAA,IAAQ,IAAA,CAAK,QAAQ,KAAA,KAAU,IAAA;AAAA,EACzD;AAAA,EAEA,IAAI,KAAA,GAAiB;AACjB,IAAA,OAAO,IAAA,CAAK,QAAA,IAAY,CAAC,IAAA,CAAK,WAAA;AAAA,EAClC;AAAA,EAEA,IAAI,OAAA,GAAmB;AACnB,IAAA,OAAO,CAAC,KAAK,MAAA,IAAU,IAAA,CAAK,UAAU,IAAA,IAAQ,IAAA,CAAK,QAAQ,KAAA,KAAU,IAAA;AAAA,EACzE;AAAA,EAEA,IAAI,QAAA,GAAoB;AACpB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EAChB;AAAA,EAEA,IAAI,QAAA,GAAoB;AACpB,IAAA,OAAO,IAAA,CAAK,QAAQ,MAAA,KAAW,CAAA;AAAA,EACnC;AAAA,EAEA,IAAI,SAAA,GAAqB;AACrB,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA,KAAM,IAAA;AAAA,EACpD;AAAA,EAEA,IAAI,UAAA,GAAyB;AACzB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EAChB;AAAA,EAEA,IAAI,OAAA,GAAmB;AACnB,IAAA,OAAO,IAAA,CAAK,QAAQ,MAAA,GAAS,CAAA;AAAA,EACjC;AAAA,EAEA,IAAI,WAAA,GAAuB;AACvB,IAAA,OAAO,IAAA,CAAK,gBAAgB,MAAA,KAAW,CAAA;AAAA,EAC3C;AAAA,EAEA,IAAI,KAAA,GAAsB;AACtB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,IAAK,IAAA;AAAA,EAC9B;AAAA,EAEA,IAAI,aAAA,GAA8B;AAC9B,IAAA,OAAO,KAAK,eAAA,CAAgB,IAAA,CAAK,eAAA,CAAgB,MAAA,GAAS,CAAC,CAAA,IAAK,IAAA;AAAA,EACpE;AAAA,EAEA,IAAI,MAAA,GAAkB;AAClB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EAChB;AAAA,EAEA,IAAI,cAAA,GAA0B;AAC1B,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EAChB;AAAA,EAEA,IAAI,MAAA,GAAiB;AACjB,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA;AAAA,EACxB;AAAA,EAEA,IAAI,WAAA,GAAsB;AACtB,IAAA,OAAO,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,MAAA;AAAA,EAC9C;AAAA,EAEA,IAAI,QAAA,GAAmB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,IAAA,EAAM,KAAA,KAAU,IAAA,IAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,QAAA,CAAA,EAAW,CAAC,CAAA;AAAA,EAC7F;AAAA,EAEA,IAAI,iBAAA,GAA4B;AAC5B,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC7C;AAAA,EAEA,IAAI,WAAA,GAAsB;AACtB,IAAA,IAAI,KAAK,OAAA,CAAQ,MAAA,IAAU,CAAC,IAAA,CAAK,OAAA,CAAQ,MAAM,SAAA,EAAW;AACtD,MAAA,OAAO,IAAA,CAAK,QAAQ,KAAA,CAAM,QAAA;AAAA,IAC9B;AACA,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,QAAA,KAAa,CAAA,EAAG;AACnC,MAAA,OAAO,CAAA;AAAA,IACX;AACA,IAAA,OAAO,IAAA,CAAK,QAAQ,KAAA,CAAM,QAAA,IAAY,KAAK,GAAA,EAAI,GAAI,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAA;AAAA,EAC1E;AAAA,EAEA,IAAI,oBAAA,GAA+B;AAC/B,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,WAAW,CAAA;AAAA,EAChD;AAAA,EAEA,gBAAgB,EAAA,EAAoB;AAChC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAA;AACpC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACvC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AAErC,IAAA,IAAI,QAAQ,CAAA,EAAG;AACX,MAAA,OAAO,GAAG,KAAK,CAAA,CAAA,EAAA,CAAK,UAAU,EAAA,EAAI,QAAA,GAAW,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAA,CAAK,UAAU,EAAA,EAAI,QAAA,GAAW,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,IAC/G;AACA,IAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAA,CAAK,OAAA,GAAU,EAAA,EAAI,UAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,EACnE;AAAA,EAEA,OAAO,IAAA,EAAiF;AACpF,IAAA,MAAM,QAAA,GAAW,OAAO,IAAA,KAAS,QAAA;AACjC,IAAA,MAAM,UAAU,QAAA,GAAW,IAAA,GAAQ,IAAA,CAAK,OAAA,IAAW,KAAK,KAAA,IAAS,eAAA;AACjE,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,OAAO,CAAA;AAC/B,IAAA,KAAA,CAAM,IAAA,GAAO,CAAA,OAAA,EAAU,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,CAAA,CAAA;AAC5C,IAAA,IAAI,CAAC,QAAA,IAAY,IAAA,CAAK,QAAA,EAAU;AAC5B,MAAA,KAAA,CAAM,WAAW,IAAA,CAAK,QAAA;AAAA,IAC1B;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,MAAM,OAAA,CAAQ,IAAA,EAA+B,MAAA,EAAiD;AAC1F,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,IAAI,CAAC,IAAA,EAAM;AACP,MAAA,MAAM,IAAA,CAAK,OAAO,mBAAmB,CAAA;AAAA,IACzC;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,aAAa,IAAA,CAAK,OAAA,EAAS,MAAM,MAAM,CAAA;AACtE,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,MAAM,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAA,CAAK,MAAA,GAA6B,OAAA,EAAwB;AAC5D,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,IAAI,CAAC,IAAA,EAAM;AACP,MAAA,MAAM,IAAA,CAAK,OAAO,mBAAmB,CAAA;AAAA,IACzC;AAEA,IAAA,IAAI,WAAW,OAAA,EAAS;AACpB,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,KAAK,OAAO,CAAA;AACvD,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,MAAM,CAAA;AAClC,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI,WAAW,QAAA,EAAU;AACrB,MAAA,MAAM,IAAA,CAAK,OAAO,oCAAoC,CAAA;AAAA,IAC1D;AAEA,IAAA,MAAM,QAAQ,IAAA,CAAK,MAAA,CAAO,OAAO,YAAY,CAAA,CAAE,KAAK,OAAO,CAAA;AAC3D,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,OAAA,GAAmC;AAAA,MACrC,KAAA,EAAO;AAAA,QACH,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,WAAW,KAAA,CAAM,UAAA;AAAA,QACjB,WAAW,KAAA,CAAM;AAAA,OACrB;AAAA,MACA,OAAA,EAAS,KAAK,OAAA,CAAQ,OAAA;AAAA,MACtB,MAAA,EAAQ,KAAK,OAAA,CAAQ,MAAA;AAAA,MACrB,MAAA,EAAQ,KAAK,OAAA,CAAQ;AAAA,KACzB;AAEA,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,KAAA,KAAU,IAAA,EAAM;AAC7B,MAAA,OAAA,CAAQ,KAAA,GAAQ;AAAA,QACZ,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,OAAA;AAAA,QAC5B,QAAA,EAAU,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM;AAAA,OACjC;AACA,MAAA,OAAA,CAAQ,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,QAAA;AAAA,IAC1C;AAEA,IAAA,MAAM,IAAA,CAAK,QAAQ,OAAO,CAAA;AAC1B,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,IAAA,EAAM,SAAA,IAAa,EAAA;AAC9C,IAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,YAAY,CAAA,CAAE,KAAK,OAAA,EAAS;AAAA,MAC3C,eAAA,EAAiB;AAAA,KACpB,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CAAO,KAAA,EAAe,SAAS,IAAA,CAAK,MAAA,CAAO,QAAQ,WAAA,EAAoC;AACzF,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO,EAAE,QAAQ,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAI,QAAoC,QAAA,EAA6B;AACjE,IAAA,MAAM,QAAiB,EAAC;AAExB,IAAA,IAAI,kBAAkB,KAAA,EAAO;AACzB,MAAA,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,QAAQ,CAAA;AACvC,MAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,MAAM,CAAA;AACxB,MAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,IACrB,CAAA,MAAA,IAAW,kBAAkB,QAAA,EAAU;AACnC,MAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AAC/B,QAAA,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,QAAA,EAAU,QAAQ,CAAA;AACtC,QAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,KAAK,CAAA;AACvB,QAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,MACpB;AAAA,IACJ,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC9B,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,QAAA,IAAI,iBAAiB,KAAA,EAAO;AACxB,UAAA,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,QAAA,EAAU,QAAQ,CAAA;AACtC,UAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,KAAK,CAAA;AACvB,UAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,QACpB;AAAA,MACJ;AAAA,IACJ,CAAA,MAAO;AACH,MAAA,MAAM,IAAA,CAAK,OAAO,sDAAsD,CAAA;AAAA,IAC5E;AAEA,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,UAAA,EAAY,KAAK,MAAA,EAAQ,IAAA,CAAK,SAAS,KAAK,CAAA;AAC7D,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,QAAA,EAAoC;AACjD,IAAA,QAAA,KAAa,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,aAAA,IAAiB,MAAA;AACjD,IAAA,IAAI,CAAC,QAAA,EAAU;AACX,MAAA,MAAM,IAAA,CAAK,OAAO,mDAAmD,CAAA;AAAA,IACzE;AAEA,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACZ,MAAA,OAAO,EAAC;AAAA,IACZ;AACA,IAAA,MAAM,gBAAgB,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ,kBAAA,GAAqB,MAAM,QAAQ,CAAA;AACnF,IAAA,IAAA,CAAK,IAAI,aAAa,CAAA;AACtB,IAAA,OAAO,aAAA;AAAA,EACX;AAAA,EAOA,OAAO,KAAA,EAAuD;AAC1D,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC3B,MAAA,IAAI,KAAA,KAAU,CAAA,IAAK,CAAC,IAAA,CAAK,OAAA,EAAS;AAC9B,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,QAAQ,CAAA,EAAG;AACX,QAAA,OAAO,KAAK,eAAA,CAAgB,MAAA,CAAO,KAAA,EAAO,CAAC,EAAE,CAAC,CAAA;AAAA,MAClD;AACA,MAAA,OAAO,KAAK,OAAA,CAAQ,MAAA,CAAO,KAAA,EAAO,CAAC,EAAE,CAAC,CAAA;AAAA,IAC1C;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACtB,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACpB,QAAA,OAAO,EAAC;AAAA,MACZ;AACA,MAAA,MAAM,SAAkB,EAAC;AAEzB,MAAA,MAAM,UAAU,KAAA,CAAM,QAAA,CAAS,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAC9C,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACrC,QAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,CAAC,CAAA,GAAI,CAAA;AAC3B,QAAA,IAAI,KAAA,KAAU,CAAA,IAAK,CAAC,IAAA,CAAK,OAAA,EAAS;AAC9B,UAAA;AAAA,QACJ;AACA,QAAA,IAAI,QAAQ,CAAA,EAAG;AACX,UAAA,MAAA,CAAO,KAAK,GAAG,IAAA,CAAK,gBAAgB,MAAA,CAAO,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,QACxD,CAAA,MAAA,IAAW,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ;AACpC,UAAA,MAAA,CAAO,KAAK,GAAG,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,QAChD;AAAA,MACJ;AACA,MAAA,OAAO,MAAA;AAAA,IACX;AAEA,IAAA,MAAM,IAAA,CAAK,OAAO,4CAA4C,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,EAAqC;AACvC,IAAA,QAAQ,IAAA;AAAM,MACV,KAAK,SAAA;AACD,QAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAChB,UAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,OAAA,GAAU,CAAA,GAAI,CAAA;AAAA,QAC7C;AACA,QAAA;AAAA,MACJ,KAAK,UAAA;AACD,QAAA,IAAA,CAAK,gBAAgB,MAAA,GAAS,CAAA;AAC9B,QAAA;AAAA,MACJ;AACI,QAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAChB,UAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,OAAA,GAAU,CAAA,GAAI,CAAA;AAAA,QAC7C;AACA,QAAA,IAAA,CAAK,gBAAgB,MAAA,GAAS,CAAA;AAAA;AACtC,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,KAAA,EAA+B;AACtC,IAAA,IAAI,KAAK,KAAA,EAAO;AACZ,MAAA,MAAM,IAAA,CAAK,OAAO,kCAAkC,CAAA;AAAA,IACxD;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAA,CAAK,OAAO,0BAA0B,CAAA;AAAA,IAChD;AAEA,IAAA,MAAM,KAAA,GAAQ,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,eAAA,CAAgB,MAAA,GAAS,KAAK,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA;AAExG,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,MAAM,IAAA,CAAK,OAAO,iCAAiC,CAAA;AAAA,IACvD;AAEA,IAAA,IAAI,QAAQ,CAAA,EAAG;AACX,MAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,GAAG,KAAK,eAAA,CAAgB,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAC9D,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,GAAG,IAAA,CAAK,QAAQ,MAAA,CAAO,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,IAC9D;AAEA,IAAA,MAAM,KAAK,OAAA,CAAQ;AAAA,MACf,MAAA,EAAQ,KAAA;AAAA,MACR,OAAO,EAAE,OAAA,EAAS,MAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA;AAAS,KAC7D,CAAA;AAED,IAAA,OAAO,KAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAA0B;AAC5B,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,EAAE,MAAA,EAAQ,MAAM,CAAA;AACnC,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,GAA2B;AAC7B,IAAA,IAAI,KAAK,OAAA,EAAS;AACd,MAAA,MAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,IACrB,CAAA,MAAO;AACH,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,IACxC;AACA,IAAA,OAAO,CAAC,KAAK,OAAA,CAAQ,MAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,EAAA,EAA6B;AACpC,IAAA,IAAI,IAAA,CAAK,UAAU,IAAA,EAAM;AACrB,MAAA,MAAM,IAAA,CAAK,OAAO,mCAAmC,CAAA;AAAA,IACzD;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,UAAA,EAAY;AACxB,MAAA,MAAM,IAAA,CAAK,OAAO,+BAA+B,CAAA;AAAA,IACrD;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,EAAE,CAAA,IAAK,KAAK,CAAA,EAAG;AACjC,MAAA,MAAM,IAAA,CAAK,OAAO,sCAAsC,CAAA;AAAA,IAC5D;AACA,IAAA,IAAI,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,QAAA,EAAU;AAC1B,MAAA,MAAM,IAAA,CAAK,OAAO,wCAAwC,CAAA;AAAA,IAC9D;AAEA,IAAA,MAAM,IAAA,GAAgC,EAAE,MAAA,EAAQ,KAAA,EAAO,UAAU,EAAA,EAAG;AAEpE,IAAA,IAAI,KAAK,OAAA,CAAQ,KAAA,EAAO,KAAK,UAAA,KAAe,IAAA,CAAK,MAAM,EAAA,EAAI;AACvD,MAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,OAAA,EAAS,IAAA,CAAK,MAAM,OAAA,EAAS,QAAA,EAAU,IAAA,CAAK,KAAA,CAAM,QAAA,EAAS;AAAA,IAC9E;AAEA,IAAA,MAAM,IAAA,CAAK,QAAQ,IAAI,CAAA;AACvB,IAAA,OAAO,IAAA,CAAK,QAAQ,KAAA,CAAM,QAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,GAA8B;AAChC,IAAA,IAAI,KAAK,OAAA,EAAS;AACd,MAAA,OAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,IACtB;AAEA,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,WAAA,KAAgB,OAAA,EAAS;AAClD,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,KAAA,EAAM;AACzC,MAAA,IAAI,KAAA,EAAO;AACP,QAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,MAC3B;AACA,MAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,OAAA,GAAU,IAAI,CAAC,CAAA;AAAA,IACzC;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,SAAA,EAAW;AAC/B,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,EAAW;AACtC,MAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpB,QAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,QAAQ,MAAM,CAAA;AAAA,MACjD;AAAA,IACJ;AAEA,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAChB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAM;AACjC,MAAA,IAAI,KAAA,EAAO;AACP,QAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,KAAK,CAAA;AAAA,MACnC;AACA,MAAA,MAAM,KAAK,IAAA,EAAK;AAAA,IACpB;AAEA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAAkC;AACpC,IAAA,IAAI,KAAK,WAAA,EAAa;AAClB,MAAA,OAAO,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,IACvB;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CAAQ,kBAAkB,KAAA,EAAa;AACnC,IAAA,IAAI,oBAAoB,IAAA,EAAM;AAC1B,MAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,GAAG,KAAK,eAAA,CAAgB,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,IACvD;AAEA,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACzB,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,KAAA,IAAS,CAAA,GAAI,KAAK,OAAA,CAAQ,MAAA,GAAS,GAAG,CAAA,GAAI,CAAA,EAAG,EAAE,CAAA,EAAG;AAC9C,MAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,CAAC,CAAA,GAAI,CAAA;AAC1C,MAAA,CAAC,KAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAC,CAAC,CAAA,GAAI,CAAC,KAAK,OAAA,CAAQ,CAAC,GAAG,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,IAC1E;AAEA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,MAAA,EAAiC;AAC7C,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA,IAAK,SAAS,CAAA,EAAG;AACzC,MAAA,MAAM,IAAA,CAAK,OAAO,mCAAmC,CAAA;AAAA,IACzD;AACA,IAAA,IAAI,SAAS,GAAA,EAAM;AACf,MAAA,MAAM,IAAA,CAAK,OAAO,iCAAiC,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,EAAE,MAAA,EAAQ,CAAA;AAC7B,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAY,WAAW,KAAA,EAAgB;AACnC,IAAA,IAAI,OAAO,aAAa,SAAA,EAAW;AAC/B,MAAA,MAAM,IAAA,CAAK,OAAO,kCAAkC,CAAA;AAAA,IACxD;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA;AACjB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,CAAc,aAAyB,MAAA,EAAoB;AACvD,IAAA,IAAI,UAAA,KAAe,OAAA,IAAW,UAAA,KAAe,OAAA,IAAW,eAAe,MAAA,EAAQ;AAC3E,MAAA,MAAM,IAAA,CAAK,OAAO,sDAAsD,CAAA;AAAA,IAC5E;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,UAAA;AACnB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,GAAsB;AACxB,IAAA,OAAO,IAAA,CAAK,QAAQ,EAAE,KAAA,EAAO,EAAE,OAAA,EAAS,IAAA,IAAQ,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,MAAA,EAAgC;AAC1C,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,SAAS,MAAM,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAA,CAAK,MAAc,EAAA,EAA0B;AACzC,IAAA,IAAI,IAAA,GAAO,CAAA,IAAK,IAAA,IAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,IAAU,EAAA,GAAK,CAAA,IAAK,EAAA,IAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,IAAU,SAAS,EAAA,EAAI;AAC/F,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAC/B,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,CAAC,CAAA;AAC3B,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,EAAA,EAAI,CAAA,EAAG,KAAK,CAAA;AAEhC,IAAA,OAAO,KAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAA,CAAO,KAAA,EAAe,MAAA,EAAgB,MAAA,EAAmC;AACrE,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,MAAA,IAAU,MAAA,EAAQ;AAChC,MAAA,KAAK,IAAA,CAAK,IAAI,MAAM,CAAA;AACpB,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,MAAM,OAAA,GAAU,SACV,IAAA,CAAK,OAAA,CAAQ,OAAO,KAAA,EAAO,MAAA,EAAQ,GAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA,GAAS,CAAC,MAAM,CAAE,IACjF,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAA,EAAO,MAAM,CAAA;AAEvC,IAAA,OAAO,OAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAA,CACI,MAAA,EACA,KAAA,GAAwB,KAAA,EACpB;AACJ,IAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAC9B,MAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,IAC5B,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACxB,QAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,QAAA,QAAQ,MAAA;AAAQ,UACZ,KAAK,UAAA;AACD,YAAA,UAAA,GAAa,CAAA,CAAE,WAAW,CAAA,CAAE,QAAA;AAC5B,YAAA;AAAA,UACJ,KAAK,OAAA;AACD,YAAA,UAAA,GAAa,EAAE,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,CAAA,CAAE,KAAK,KAAK,CAAA;AACpD,YAAA;AAAA,UACJ,KAAK,QAAA;AACD,YAAA,UAAA,GAAa,EAAE,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,CAAA,CAAE,KAAK,MAAM,CAAA;AACtD,YAAA;AAAA,UACJ;AACI,YAAA,OAAO,CAAA;AAAA;AAGf,QAAA,OAAO,KAAA,KAAU,MAAA,GAAS,CAAC,UAAA,GAAa,UAAA;AAAA,MAC5C,CAAC,CAAA;AAAA,IACL;AAEA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CACI,MAAA,EACA,KAAA,GAAwB,KAAA,EACjB;AACP,IAAA,MAAM,IAAA,GAAO,CAAC,GAAG,IAAA,CAAK,OAAO,CAAA;AAE7B,IAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAC9B,MAAA,OAAO,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,IAC3B;AAEA,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACvB,MAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,MAAA,QAAQ,MAAA;AAAQ,QACZ,KAAK,UAAA;AACD,UAAA,UAAA,GAAa,CAAA,CAAE,WAAW,CAAA,CAAE,QAAA;AAC5B,UAAA;AAAA,QACJ,KAAK,OAAA;AACD,UAAA,UAAA,GAAa,EAAE,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,CAAA,CAAE,KAAK,KAAK,CAAA;AACpD,UAAA;AAAA,QACJ,KAAK,QAAA;AACD,UAAA,UAAA,GAAa,EAAE,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,CAAA,CAAE,KAAK,MAAM,CAAA;AACtD,UAAA;AAAA,QACJ;AACI,UAAA,OAAO,CAAA;AAAA;AAGf,MAAA,OAAO,KAAA,KAAU,MAAA,GAAS,CAAC,UAAA,GAAa,UAAA;AAAA,IAC5C,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,aACI,SAAA,EAYsC;AACtC,IAAA,IAAI,OAAO,cAAc,UAAA,EAAY;AACjC,MAAA,OAAO,IAAA,CAAK,QACP,GAAA,CAAI,CAAC,OAAO,KAAA,MAAW,EAAE,OAAO,KAAA,EAAM,CAAE,EACxC,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,KAAA,OAAY,SAAA,CAAU,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,IAC7D;AAEA,IAAA,OAAO,IAAA,CAAK,OAAA,CACP,GAAA,CAAI,CAAC,OAAO,KAAA,MAAW,EAAE,KAAA,EAAO,KAAA,GAAQ,CAAA,CACxC,MAAA,CAAO,CAAC,EAAE,OAAM,KAAM;AACnB,MAAA,IAAI,SAAA,CAAU,KAAA,IAAS,CAAC,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,WAAA,EAAY,CAAE,QAAA,CAAS,SAAA,CAAU,KAAA,CAAM,WAAA,EAAa,CAAA,EAAG;AAC5F,QAAA,OAAO,KAAA;AAAA,MACX;AACA,MAAA,IAAI,SAAA,CAAU,MAAA,IAAU,CAAC,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,WAAA,EAAY,CAAE,QAAA,CAAS,SAAA,CAAU,MAAA,CAAO,WAAA,EAAa,CAAA,EAAG;AAC/F,QAAA,OAAO,KAAA;AAAA,MACX;AACA,MAAA,IAAI,UAAU,QAAA,EAAU;AACpB,QAAA,IAAI,OAAO,SAAA,CAAU,QAAA,KAAa,QAAA,EAAU;AACxC,UAAA,IAAI,KAAA,CAAM,QAAA,KAAa,SAAA,CAAU,QAAA,EAAU;AACvC,YAAA,OAAO,KAAA;AAAA,UACX;AAAA,QACJ,CAAA,MAAO;AACH,UAAA,IAAI,UAAU,QAAA,CAAS,GAAA,IAAO,MAAM,QAAA,GAAW,SAAA,CAAU,SAAS,GAAA,EAAK;AACnE,YAAA,OAAO,KAAA;AAAA,UACX;AACA,UAAA,IAAI,UAAU,QAAA,CAAS,GAAA,IAAO,MAAM,QAAA,GAAW,SAAA,CAAU,SAAS,GAAA,EAAK;AACnE,YAAA,OAAO,KAAA;AAAA,UACX;AAAA,QACJ;AAAA,MACJ;AACA,MAAA,IAAI,UAAU,GAAA,IAAO,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,UAAU,GAAA,EAAK;AACnD,QAAA,OAAO,KAAA;AAAA,MACX;AACA,MAAA,IAAI,UAAU,UAAA,IAAc,KAAA,CAAM,IAAA,CAAK,UAAA,KAAe,UAAU,UAAA,EAAY;AACxE,QAAA,OAAO,KAAA;AAAA,MACX;AACA,MAAA,IAAI,UAAU,UAAA,IAAc,KAAA,CAAM,IAAA,CAAK,UAAA,KAAe,UAAU,UAAA,EAAY;AACxE,QAAA,OAAO,KAAA;AAAA,MACX;AACA,MAAA,IAAI,UAAU,QAAA,KAAa,MAAA,IAAa,KAAA,CAAM,MAAA,KAAW,UAAU,QAAA,EAAU;AACzE,QAAA,OAAO,KAAA;AAAA,MACX;AACA,MAAA,IAAI,UAAU,UAAA,KAAe,MAAA,IAAa,KAAA,CAAM,UAAA,KAAe,UAAU,UAAA,EAAY;AACjF,QAAA,OAAO,KAAA;AAAA,MACX;AAEA,MAAA,OAAO,IAAA;AAAA,IACX,CAAC,CAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UACI,SAAA,EAYsC;AACtC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA;AAC3C,IAAA,OAAO,OAAA,CAAQ,CAAC,CAAA,IAAK,IAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,CAAU,OAAe,GAAA,EAAuB;AAC5C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAA8B;AAC1B,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,KAAA,EAAM,IAAK,IAAA;AAAA,EAC3C;AACJ;AC/uBO,IAAM,YAAA,GAAN,cAAmFH,mBAAAA,CAAa;AAAA,EACnG,OAAA;AAAA,EACA,OAAA,uBAAc,GAAA,EAA4B;AAAA,EAC1C,QAAA,uBAAe,GAAA,EAAuB;AAAA,EAEtC,YAAY,MAAA,EAAgB;AACxB,IAAA,KAAA,CAAM,EAAE,iBAAA,EAAmB,KAAA,EAAO,CAAA;AAClC,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,EACnB;AAAA,EAEA,IAAI,OAAA,EAA6C;AAC7C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AAAA,EACnC;AAAA,EAEA,IAAI,OAAA,EAA0B;AAC1B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AAAA,EACnC;AAAA,EAEA,IAAI,GAAA,GAAwB;AACxB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAAA,EAC3C;AAAA,EAEA,IAAI,IAAA,GAAe;AACf,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAA;AAAA,EACxB;AAAA,EAEA,IAAA,GAAiC;AAC7B,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,EAAK;AAAA,EAC7B;AAAA,EAEA,MAAA,GAA2C;AACvC,IAAA,OAAO,IAAA,CAAK,QAAQ,MAAA,EAAO;AAAA,EAC/B;AAAA,EAEA,OAAA,GAAsD;AAClD,IAAA,OAAO,IAAA,CAAK,QAAQ,OAAA,EAAQ;AAAA,EAChC;AAAA,EAEA,MAAM,OAAO,OAAA,EAA+D;AACxE,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,OAAO,CAAA,EAAG;AACnC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,OAAA,CAAQ,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IACzE;AAEA,IAAA,IAAI,QAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,QAAQ,OAAO,CAAA;AACnD,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,KAAA,GAAQ,MAAM,KAAK,OAAA,CAAQ,MAAA,CAAO,QAAQ,OAAA,CAAQ,OAAA,EAAS,QAAQ,OAAA,EAAS;AAAA,QACxE,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,QAAQ,OAAA,CAAQ;AAAA,OACnB,CAAA;AAAA,IACL;AAEA,IAAA,MAAM,WAAA,GAAyB;AAAA,MAC3B,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,KAAA,EAAO,IAAA;AAAA,MACP,MAAA,EAAQ,QAAQ,MAAA,IAAU,GAAA;AAAA,MAC1B,MAAA,EAAQ,KAAA;AAAA,MACR,KAAA,EAAO;AAAA,QACH,IAAA,EAAM,KAAK,GAAA,EAAI;AAAA,QACf,QAAA,EAAU,CAAA;AAAA,QACV,SAAA,EAAW,KAAA;AAAA,QACX,IAAA,EAAM;AAAA,OACV;AAAA,MACA,KAAA,EAAO;AAAA,QACH,KAAA,EAAO,EAAA;AAAA,QACP,QAAA,EAAU,EAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA,QACX,WAAW,OAAA,CAAQ;AAAA,OACvB;AAAA,MACA,OAAA,EAAS,OAAA,CAAQ,OAAA,IAAW;AAAC,KACjC;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,OAAA,EAAS,WAAW,CAAA;AAE9C,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,IAAA,CAAK,SAAS,OAAA,CAAQ,OAAA,EAAS,QAAQ,OAAO,CAAA;AACtE,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,OAAA,EAAS,KAAK,CAAA;AAEvC,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,aAAA,EAAe,KAAK,CAAA;AAEtC,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,MAAM,OAAA,CAAQ,OAAA,EAAiB,MAAA,GAAS,WAAA,EAA4B;AAChE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAI,OAAO,CAAA;AAC7C,IAAA,IAAI,OAAO,IAAA,EAAM;AACb,MAAA,MAAM,MAAM,IAAA,CAAK,IAAA,CAAK,cAAc,OAAO,CAAA,CAAE,MAAM,IAAI,CAAA;AAAA,IAC3D;AAEA,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,SAAS,MAAM,CAAA;AAEjD,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,OAAO,CAAA;AAC3B,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,OAAO,CAAA;AAE5B,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,cAAA,EAAgB,KAAA,EAAO,MAAM,CAAA;AAAA,EACnD;AAAA,EAEA,MAAM,QAAA,CAAS,OAAA,EAAiB,QAAA,EAAiC;AAC7D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAC3D;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAI,OAAO,CAAA;AAC7C,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IACtE;AAEA,IAAA,MAAM,KAAA,CAAM,WAAW,QAAQ,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC3B,IAAA,MAAM,WAA4B,EAAC;AAEnC,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AACvC,MAAA,QAAA,CAAS,KAAK,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,CAAE,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,IAClD;AAEA,IAAA,MAAM,OAAA,CAAQ,IAAI,QAAQ,CAAA;AAAA,EAC9B;AAAA,EAEA,CAAC,YAAY,CAAA,CAAE,OAAA,EAAwC;AACnD,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,EACpC;AAAA,EAEA,CAAC,mBAAmB,CAAA,CAAE,OAAA,EAAiB,KAAA,EAA0B;AAC7D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACT,MAAA;AAAA,IACJ;AAEA,IAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AAEf,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AACtC,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,aAAA,EAAe,KAAA,EAAO,KAAK,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAI,OAAO,CAAA;AAC7C,IAAA,IAAI,OAAO,QAAA,EAAU;AACjB,MAAA,MAAM,SAAS,IAAA,CAAK,OAAA,CAAQ,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAM,QAAQ,CAAA;AAC7D,MAAA,IAAI,MAAA,EAAQ;AACR,QAAC,OACG,kBACJ,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,MAC9B;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,CAAC,mBAAmB,CAAA,CAAE,OAAA,EAAiB,KAAA,EAA2B;AAC9D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA;AAAA,IACJ;AAEA,IAAA,QAAQ,MAAM,IAAA;AAAM,MAChB,KAAA,iBAAA;AACI,QAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,KAAK,CAAA;AACnC,QAAA;AAAA,MACJ,KAAA,eAAA;AACI,QAAA,KAAK,IAAA,CAAK,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAA;AACtC,QAAA;AAAA,MACJ,KAAA,qBAAA;AACI,QAAA,IAAA,CAAK,qBAAA,CAAsB,OAAO,KAAK,CAAA;AACvC,QAAA;AAAA,MACJ,KAAA,iBAAA;AACI,QAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,KAAK,CAAA;AACnC,QAAA;AAAA,MACJ,KAAA,sBAAA;AACI,QAAA,IAAA,CAAK,sBAAA,CAAuB,OAAO,KAAK,CAAA;AACxC,QAAA;AAAA;AACR,EACJ;AAAA,EAEA,iBAAA,CAAkB,OAAuB,KAAA,EAAqC;AAC1E,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AACnC,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,YAAA,EAAc,KAAA,EAAO,KAAK,CAAA;AAAA,EAChD;AAAA,EAEA,MAAM,eAAA,CAAgB,KAAA,EAAuB,KAAA,EAA4C;AACrF,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AACnC,IAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AAErB,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,aAAA,EAAe,KAAA,EAAO,OAAO,MAAM,CAAA;AAErD,IAAA,MAAM,gBAAgB,MAAA,KAAA,UAAA,mBAAsC,MAAA,KAAA,YAAA;AAE5D,IAAA,IAAI,aAAA,EAAe;AACf,MAAA,MAAM,YAAY,MAAM,KAAA,CAAM,IAAA,EAAK,CAAE,MAAM,IAAI,CAAA;AAE/C,MAAA,IAAI,CAAC,SAAA,IAAa,KAAA,CAAM,QAAA,EAAU;AAC9B,QAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,aAAA,EAAe,KAAK,CAAA;AAAA,MAC1C;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,qBAAA,CAAsB,OAAuB,KAAA,EAAyC;AAClF,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AACnC,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,YAAA,EAAc,KAAA,EAAO,KAAA,EAAO,MAAM,SAAS,CAAA;AAAA,EACjE;AAAA,EAEA,iBAAA,CAAkB,OAAuB,KAAA,EAAqC;AAC1E,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AACnC,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,YAAA,EAAc,KAAA,EAAO,KAAA,EAAO,MAAM,WAAW,CAAA;AAAA,EACnE;AAAA,EAEA,sBAAA,CAAuB,OAAuB,KAAA,EAA0C;AACpF,IAAA,MAAM,QAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,MAAM,OAAO,CAAA;AACnD,IAAA,IAAI,KAAA,EAAO;AACP,MACI,IAAA,CAAK,OAAA,CAAQ,MAAA,CAGf,kBAAkB,CAAA,GAAI,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM,QAAQ,CAAA;AAAA,IACnF;AAAA,EACJ;AACJ;;;AC3NO,IAAe,eAAf,MAAoG;AAiB3G;;;ACjBO,IAAM,cAAA,GAAN,cAA6B,YAAA,CAAa;AAAA,EACpC,IAAA,GAAO,UAAA;AAAA,EAEhB,OAAA;AAAA,EACA,OAAA,uBAAc,GAAA,EAAY;AAAA;AAAA,EAE1B,KAAK,MAAA,EAAsB;AACvB,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAGf,IAAA,MAAA,CAAO,EAAA,CAAG,aAAA,EAAe,CAAC,KAAA,KAAU;AAChC,MAAA,KAAK,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAAA,IACtC,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,MAAM,mBAAmB,KAAA,EAA6B;AAClD,IAAA,MAAM,YAAY,KAAA,CAAM,aAAA;AACxB,IAAA,IAAI,CAAC,SAAA,EAAW;AACZ,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,MAAA,GAAU,MAAM,MAAA,CAAyB,GAAA,GAAsB,mBAAmB,KAAA,CAAM,OAAO,EAAE,CAAA,IAAK;AAAA,MACxG,OAAA,EAAS,IAAA;AAAA,MACT,WAAA,EAAa,GAAA;AAAA,MACb,OAAA,EAAS;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,IAAA;AAAA,QACd,UAAA,EAAY;AAAA,OAChB;AAAA,MACA,KAAA,EAAO,CAAA;AAAA,MACP,WAAA,EAAa,GAAA;AAAA,MACb,WAAA,EAAa,GAAA;AAAA,MACb,iBAAiB,CAAC,WAAA,EAAa,cAAA,EAAgB,UAAA,EAAY,UAAU,QAAQ;AAAA,KACjF;AAEA,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACjB,MAAA;AAAA,IACJ;AAGA,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,EAAG;AACjC,MAAA;AAAA,IACJ;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AAE9B,IAAA,IAAI;AACA,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAA;AAC9C,MAAA,MAAM,gBAAgB,MAAM,IAAA,CAAK,oBAAoB,KAAA,EAAO,SAAA,EAAW,QAAQ,UAAU,CAAA;AAEzF,MAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC1B,QAAA,KAAA,MAAW,gBAAgB,aAAA,EAAe;AACtC,UAAA,IAAI,CAAC,aAAa,UAAA,EAAY;AAC1B,YAAA,YAAA,CAAa,aAAa,EAAC;AAAA,UAC/B;AACA,UAAA,YAAA,CAAa,WAAW,YAAA,GAAe,IAAA;AAEvC,UAAA,YAAA,CAAa,SAAS,SAAA,GAAY;AAAA,YAC9B,EAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,QAAA,IAAY,UAAA;AAAA,YAC7B,QAAA,EAAU;AAAA,WACd;AAEA,UAAA,KAAA,CAAM,IAAI,YAAY,CAAA;AAAA,QAC1B;AAEA,QAAA,IAAI,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA,EAAG;AAC1C,UAAA,MAAM,MAAM,MAAA,EAAO;AAAA,QACvB;AAAA,MACJ;AAAA,IACJ,SAAS,KAAA,EAAO;AACZ,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,OAAA,EAAS,UAAA,EAAY;AAAA,QACnC,OAAA,EAAS,CAAA,iBAAA,EAAqB,KAAA,CAAgB,OAAO,CAAA,CAAA;AAAA,QACrD,KAAA,EAAO,OAAA;AAAA,QACP,KAAA;AAAA,QACA,aAAA,EAAe;AAAA,OAClB,CAAA;AAAA,IACL,CAAA,SAAE;AACE,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA;AAAA,IACrC;AAAA,EACJ;AAAA,EAEA,iBAAiB,KAAA,EAGf;AACE,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,IAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AAErC,IAAA,MAAM,QAAA,GAAW,CAAC,KAAA,KAAiB;AAC/B,MAAA,IAAI,KAAA,CAAM,KAAK,UAAA,EAAY;AACvB,QAAA,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AAAA,MACvC;AACA,MAAA,IAAI,KAAA,CAAM,KAAK,IAAA,EAAM;AACjB,QAAA,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,MACjC;AACA,MAAA,IAAI,KAAA,CAAM,IAAA,CAAK,KAAA,IAAS,KAAA,CAAM,KAAK,MAAA,EAAQ;AACvC,QAAA,MAAM,GAAA,GAAM,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa,CAAA,CAAA;AAChF,QAAA,YAAA,CAAa,IAAI,GAAG,CAAA;AAAA,MACxB;AAAA,IACJ,CAAA;AAEA,IAAA,IAAI,MAAM,KAAA,EAAO;AACb,MAAA,QAAA,CAAS,MAAM,KAAK,CAAA;AAAA,IACxB;AACA,IAAA,KAAA,CAAM,cAAA,CAAe,QAAQ,QAAQ,CAAA;AACrC,IAAA,KAAA,CAAM,MAAA,CAAO,QAAQ,QAAQ,CAAA;AAE7B,IAAA,OAAO,EAAE,WAAW,YAAA,EAAa;AAAA,EACrC;AAAA,EAEA,MAAM,mBAAA,CACF,KAAA,EACA,SAAA,EACA,QACA,UAAA,EACgB;AAChB,IAAA,MAAM,SAAkB,EAAC;AACzB,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,IAAA,CAAK,UAAA,EAAY,WAAA,EAAY;AAEtD,IAAA,IAAI,OAAO,OAAA,CAAQ,OAAA,IAAW,MAAA,EAAQ,QAAA,CAAS,SAAS,CAAA,EAAG;AACvD,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,0BAAA,CAA2B,OAAO,SAAS,CAAA;AAC5E,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,aAAa,CAAA;AAE5B,MAAA,IAAI,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,KAAA,EAAO;AAC9B,QAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,uBAAA,CAAwB,OAAO,SAAS,CAAA;AACxE,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,YAAY,CAAA;AAAA,MAC/B;AAAA,IACJ;AAEA,IAAA,IAAI,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,QAAQ,OAAA,IAAW,MAAA,EAAQ,QAAA,CAAS,SAAS,CAAA,EAAG;AACvF,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,kBAAA,CAAmB,OAAO,SAAS,CAAA;AACpE,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,aAAa,CAAA;AAE5B,MAAA,IAAI,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,KAAA,EAAO;AAC9B,QAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,iBAAA,CAAkB,OAAO,SAAS,CAAA;AAClE,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,YAAY,CAAA;AAAA,MAC/B;AAAA,IACJ;AAEA,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,QAAQ,OAAA,EAAS;AAC/C,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,kBAAA,CAAmB,OAAO,SAAS,CAAA;AACpE,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,aAAa,CAAA;AAAA,IAChC;AAEA,IAAA,OAAO,IAAA,CAAK,qBAAA,CAAsB,MAAA,EAAQ,UAAA,EAAY,MAAM,CAAA;AAAA,EAChE;AAAA,EAEA,qBAAA,CACI,MAAA,EACA,UAAA,EACA,MAAA,EACO;AACP,IAAA,OAAO,MAAA,CACF,MAAA,CAAO,CAAC,KAAA,KAAU;AACf,MAAA,IAAI,CAAC,MAAM,IAAA,EAAM;AACb,QAAA,OAAO,KAAA;AAAA,MACX;AAEA,MAAA,IAAI,WAAW,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA,EAAG;AACjD,QAAA,OAAO,KAAA;AAAA,MACX;AACA,MAAA,IAAI,KAAA,CAAM,KAAK,IAAA,IAAQ,UAAA,CAAW,UAAU,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG;AAC9D,QAAA,OAAO,KAAA;AAAA,MACX;AAEA,MAAA,MAAM,GAAA,GAAM,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa,CAAA,CAAA;AAChF,MAAA,IAAI,UAAA,CAAW,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,EAAG;AAClC,QAAA,OAAO,KAAA;AAAA,MACX;AAEA,MAAA,IAAI,KAAA,CAAM,KAAK,MAAA,EAAQ;AACnB,QAAA,IAAI,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,WAAA,EAAa;AACxC,UAAA,OAAO,KAAA;AAAA,QACX;AACA,QAAA,IAAI,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,WAAA,EAAa;AACxC,UAAA,OAAO,KAAA;AAAA,QACX;AAAA,MACJ;AAEA,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,WAAA,EAAY;AAC3C,MAAA,KAAA,MAAW,OAAA,IAAW,OAAO,eAAA,EAAiB;AAC1C,QAAA,IAAI,KAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,WAAA,EAAa,CAAA,EAAG;AACvC,UAAA,OAAO,KAAA;AAAA,QACX;AAAA,MACJ;AAEA,MAAA,OAAO,IAAA;AAAA,IACX,CAAC,CAAA,CACA,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,EAAO,GAAI,GAAG,CAAA,CAC9B,KAAA,CAAM,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,0BAAA,CAA2B,KAAA,EAAc,KAAA,EAAgC;AAC3E,IAAA,IAAI;AACA,MAAA,MAAM,KAAA,GAAQ,CAAA,kBAAA,EAAqB,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA,CAAA;AACxD,MAAA,MAAM,MAAA,GAAU,MAAM,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAExC,MAAA,IAAI,MAAA,CAAO,QAAA,KAAA,OAAA,gBAA+B,MAAA,CAAO,QAAA,KAAA,UAAA,iBAAgC;AAC7E,QAAA,IAAI,OAAO,QAAA,KAAA,OAAA,cAA6B;AACpC,UAAA,OAAO,CAAC,OAAO,IAAwB,CAAA;AAAA,QAC3C;AACA,QAAA,OAAO,OAAO,IAAA,CAAK,MAAA;AAAA,MACvB;AAAA,IACJ,SAAS,KAAA,EAAO;AAAA,IAEhB;AACA,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,MAAM,uBAAA,CAAwB,KAAA,EAAc,KAAA,EAAgC;AACxE,IAAA,IAAI;AACA,MAAA,MAAM,KAAA,GAAQ,CAAA,SAAA,EAAY,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,CAAA;AAC3C,MAAA,MAAM,MAAA,GAAU,MAAM,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAExC,MAAA,IAAI,OAAO,QAAA,KAAA,QAAA,iBAAgC,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,EAAG;AACnE,QAAA,OAAQ,MAAA,CAAO,IAAA,CAA4B,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAAA,MACzD;AAAA,IACJ,SAAS,KAAA,EAAO;AAAA,IAEhB;AACA,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,MAAM,kBAAA,CAAmB,KAAA,EAAc,KAAA,EAAgC;AACnE,IAAA,IAAI;AACA,MAAA,MAAM,KAAA,GAAQ,mCAAmC,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA,QAAA,EAAW,KAAA,CAAM,KAAK,UAAU,CAAA,CAAA;AACtG,MAAA,MAAM,MAAA,GAAU,MAAM,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAExC,MAAA,IAAI,OAAO,QAAA,KAAA,UAAA,mBAAkC,MAAA,CAAO,IAAA,IAAQ,QAAA,IAAY,OAAO,IAAA,EAAM;AACjF,QAAA,OAAQ,MAAA,CAAO,IAAA,CAAK,MAAA,CAA8B,KAAA,CAAM,GAAG,EAAE,CAAA;AAAA,MACjE;AAAA,IACJ,SAAS,KAAA,EAAO;AAAA,IAEhB;AACA,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,MAAM,iBAAA,CAAkB,KAAA,EAAc,KAAA,EAAgC;AAClE,IAAA,IAAI;AACA,MAAA,MAAM,KAAA,GAAQ,CAAA,SAAA,EAAY,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,CAAA;AAC3C,MAAA,MAAM,MAAA,GAAU,MAAM,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAExC,MAAA,IAAI,OAAO,QAAA,KAAA,QAAA,iBAAgC,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,EAAG;AACnE,QAAA,OAAQ,MAAA,CAAO,IAAA,CAA4B,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAAA,MACzD;AAAA,IACJ,SAAS,KAAA,EAAO;AAAA,IAEhB;AACA,IAAA,OAAO,EAAC;AAAA,EACZ;AACJ;;;ACtOO,IAAM,YAAA,GAAN,cAA2B,YAAA,CAA6D;AAAA,EAClF,IAAA,GAAO,QAAA;AAAA,EAEhB,OAAA;AAAA,EAEA,KAAK,MAAA,EAAsB;AACvB,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,SAAA,CAAU,KAAA,EAAc,MAAA,EAAqD;AAC/E,IAAA,MAAM,aAAA,GAA8B;AAAA,MAChC,OAAA,EAAS;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ,IAAA;AAAA,QACR,UAAA,EAAY,KAAA;AAAA,QACZ,MAAA,EAAQ;AAAA,OACZ;AAAA,MACA,GAAG;AAAA,KACP;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA;AACzB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA;AAE1B,IAAA,IAAI,aAAA,CAAc,QAAQ,QAAA,EAAU;AAChC,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,kBAAA,CAAmB,KAAK,CAAA;AAC1D,MAAA,IAAI,cAAA,EAAgB;AAChB,QAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,aAAA,EAAe,IAAA,CAAK,OAAA,EAAS,OAAO,cAAc,CAAA;AACpE,QAAA,OAAO,cAAA;AAAA,MACX;AAAA,IACJ;AAEA,IAAA,IAAI,aAAA,CAAc,QAAQ,MAAA,EAAQ;AAC9B,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,gBAAA,CAAiB,OAAO,MAAM,CAAA;AAC9D,MAAA,IAAI,YAAA,EAAc;AACd,QAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,aAAA,EAAe,IAAA,CAAK,OAAA,EAAS,OAAO,YAAY,CAAA;AAClE,QAAA,OAAO,YAAA;AAAA,MACX;AAAA,IACJ;AAEA,IAAA,IAAI,aAAA,CAAc,OAAA,CAAQ,UAAA,IAAc,aAAA,CAAc,SAAS,UAAA,EAAY;AACvE,MAAA,MAAM,gBAAA,GAAmB,MAAM,IAAA,CAAK,oBAAA,CAAqB,OAAO,MAAA,EAAQ,aAAA,CAAc,QAAQ,UAAU,CAAA;AACxG,MAAA,IAAI,gBAAA,EAAkB;AAClB,QAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,aAAA,EAAe,IAAA,CAAK,OAAA,EAAS,OAAO,gBAAgB,CAAA;AACtE,QAAA,OAAO,gBAAA;AAAA,MACX;AAAA,IACJ;AAEA,IAAA,IAAI,aAAA,CAAc,OAAA,CAAQ,MAAA,IAAU,aAAA,CAAc,SAAS,MAAA,EAAQ;AAC/D,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,gBAAA,CAAiB,OAAO,MAAA,EAAQ,aAAA,CAAc,QAAQ,MAAM,CAAA;AAC5F,MAAA,IAAI,YAAA,EAAc;AACd,QAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,aAAA,EAAe,IAAA,CAAK,OAAA,EAAS,OAAO,YAAY,CAAA;AAClE,QAAA,OAAO,YAAA;AAAA,MACX;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,gBAAA,EAAkB,IAAA,CAAK,SAAS,KAAK,CAAA;AACvD,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,CAAe,QAAsB,QAAA,EAAqC;AACtE,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA,EAAG;AAC5C,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,KAAA,IAAS,IAAI,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC/C,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,CAAE,aAAa,QAAA,EAAU;AACvC,QAAA,OAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,MACzB;AAAA,IACJ;AAEA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,MAAA,EAAsB,SAAA,GAAoB,GAAA,EAAc;AACjE,IAAA,IAAI,OAAO,IAAA,EAAM;AACb,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA;AAAA,IACzC;AAEA,IAAA,IAAI,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACzC,MAAA,IAAI,SAAA,GAAY,EAAA;AAChB,MAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC7B,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,SAAS,CAAA;AACtD,QAAA,SAAA,IAAa,CAAA,CAAA,EAAI,SAAS,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI;AAAA,CAAA;AAExC,QAAA,IAAI,SAAA,CAAU,SAAS,SAAA,EAAW;AAC9B,UAAA,OAAO,CAAA,EAAG,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,SAAS,CAAC,CAAA,GAAA,CAAA;AAAA,QAC3C;AAAA,MACJ;AACA,MAAA,OAAO,SAAA;AAAA,IACX;AAEA,IAAA,OAAO,qBAAA;AAAA,EACX;AAAA,EAEA,iBAAiB,EAAA,EAAoB;AACjC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAK,CAAA;AACrC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAO,EAAA,GAAK,MAAS,GAAI,CAAA;AAC9C,IAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,OAAA,CAAQ,UAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAM,mBAAmB,MAAA,EAA6C;AAGlE,IAAA,OAAO,MAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,gBAAA,CAAiB,MAAA,EAAgB,OAAA,EAA+C;AAGlF,IAAA,OAAO,MAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,oBAAA,CAAqB,MAAA,EAAgB,OAAA,EAAiB,OAAA,EAA+C;AAGvG,IAAA,OAAO,MAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,gBAAA,CAAiB,MAAA,EAAgB,OAAA,EAAiB,SAAA,EAAiD;AAGrG,IAAA,OAAO,MAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AAAA,EACrC;AACJ;;;ACpKO,IAAM,kBAAA,GAAN,cAAiC,YAAA,CAAmE;AAAA,EAC9F,IAAA,GAAO,cAAA;AAAA,EAEhB,OAAA;AAAA,EAEA,KAAK,MAAA,EAAsB;AACvB,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAGf,IAAA,MAAA,CAAO,GAAG,gBAAA,EAAkB,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAC,CAAA;AACjE,IAAA,MAAA,CAAO,GAAG,gBAAA,EAAkB,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CAAY,KAAA,EAAc,WAAqB,CAAC,SAAA,EAAW,WAAW,CAAA,EAAkB;AAC1F,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,IAAA,IAAI,CAAC,IAAA,EAAM;AACP,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACvC;AAEA,IAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,KAAA,EAAO,QAAQ,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,KAAA,EAAiC;AAC/C,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,IAAA,IAAI,CAAC,IAAA,EAAM;AACP,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO,MAAM,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,KAAA,EAA6B;AAC9C,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,IAAA,IAAI,CAAC,IAAA,EAAM;AACP,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACvC;AAEA,IAAA,MAAM,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAAA,EACvC;AAAA,EAEA,qBAAA,CAAsB,KAAA,EAAc,KAAA,EAAc,QAAA,EAAyB;AACvE,IAAA,MAAM,SAAA,GAAa,YAAsC,EAAC;AAC1D,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,gBAAA,EAAkB,KAAA,EAAO,OAAO,SAAS,CAAA;AAAA,EAC/D;AAAA,EAEA,qBAAA,CAAsB,KAAA,EAAc,KAAA,EAAc,OAAA,EAAwB;AACtE,IAAA,MAAM,QAAA,GAAW,OAAA;AACjB,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,gBAAA,EAAkB,KAAA,EAAO,OAAO,QAAQ,CAAA;AAAA,EAC9D;AACJ;;;ACrDO,IAAM,cAAA,GAAN,cAA6B,YAAA,CAA+D;AAAA,EACtF,IAAA,GAAO,UAAA;AAAA,EAEhB,OAAA;AAAA,EACA,MAAA,GAAyB;AAAA,IACrB,OAAA,EAAS,IAAA;AAAA,IACT,SAAA,EAAW,CAAA;AAAA,IACX,cAAA,EAAgB;AAAA,GACpB;AAAA,EAEA,KAAK,MAAA,EAAsB;AACvB,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAEf,IAAA,MAAM,MAAA,GAAU,MAAA,CAAyB,GAAA,GAAM,iBAAiB,CAAA;AAChE,IAAA,IAAI,MAAA,EAAQ;AACR,MAAA,IAAA,CAAK,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,MAAA,EAAO;AAAA,IAC9C;AAGA,IAAA,MAAA,CAAO,EAAA,CAAG,UAAA,EAAY,CAAC,CAAA,EAAG,GAAG,CAAA,KAAM;AAC/B,MAAA,KAAK,IAAA,CAAK,eAAA,CAAgB,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAA,IACrC,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,eAAA,CAAgB,OAAA,EAAiB,OAAA,EAAiB,OAAA,EAAwB;AACtE,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS;AACtB,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAI,OAAO,CAAA;AAC7C,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,OAAO,SAAA,EAAW;AAChD,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,aAAA,CAAc,MAAM,OAAO,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,OAAA,EAAuB;AACjC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAI,OAAO,CAAA;AAC7C,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,YAAA,GAAgB,IAAA,CAAK,OAAA,CAA0B,GAAA,GAAM,iBAAiB,CAAA;AAC5E,IAAA,MAAM,MAAA,GAAS,eAAe,EAAE,GAAG,KAAK,MAAA,EAAQ,GAAG,YAAA,EAAa,GAAI,IAAA,CAAK,MAAA;AAEzE,IAAA,IAAI,KAAA,CAAM,MAAA,GAAS,MAAA,CAAO,SAAA,EAAW;AACjC,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,IAAA,MAAM,YAAqB,EAAC;AAC5B,IAAA,MAAM,eAAA,uBAAsB,GAAA,EAAqB;AAGjD,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAC9C,MAAA,IAAI,cAAA,GAAiB,eAAA,CAAgB,GAAA,CAAI,WAAW,CAAA;AACpD,MAAA,IAAI,CAAC,cAAA,EAAgB;AACjB,QAAA,cAAA,GAAiB,EAAC;AAClB,QAAA,eAAA,CAAgB,GAAA,CAAI,aAAa,cAAc,CAAA;AAAA,MACnD;AACA,MAAA,cAAA,CAAe,KAAK,KAAK,CAAA;AAAA,IAC7B;AAGA,IAAA,IAAI,OAAA,GAAU,IAAA;AACd,IAAA,IAAI,gBAAA,GAAmB,CAAA;AACvB,IAAA,IAAI,eAAA,GAAiC,IAAA;AAErC,IAAA,OAAO,OAAA,EAAS;AACZ,MAAA,OAAA,GAAU,KAAA;AAEV,MAAA,KAAA,MAAW,CAAC,WAAA,EAAa,eAAe,CAAA,IAAK,eAAA,EAAiB;AAC1D,QAAA,IAAI,eAAA,CAAgB,WAAW,CAAA,EAAG;AAC9B,UAAA;AAAA,QACJ;AAEA,QAAA,OAAA,GAAU,IAAA;AAGV,QAAA,IAAI,oBAAoB,WAAA,EAAa;AACjC,UAAA,gBAAA,EAAA;AACA,UAAA,IAAI,gBAAA,IAAoB,OAAO,cAAA,EAAgB;AAE3C,YAAA;AAAA,UACJ;AAAA,QACJ,CAAA,MAAO;AACH,UAAA,gBAAA,GAAmB,CAAA;AACnB,UAAA,eAAA,GAAkB,WAAA;AAAA,QACtB;AAGA,QAAA,MAAM,KAAA,GAAQ,gBAAgB,KAAA,EAAM;AACpC,QAAA,IAAI,KAAA,EAAO;AACP,UAAA,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,QACxB;AAAA,MACJ;AAGA,MAAA,IAAI,CAAC,OAAA,EAAS;AACV,QAAA,eAAA,GAAkB,IAAA;AAClB,QAAA,gBAAA,GAAmB,CAAA;AACnB,QAAA,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AAAA,MAC3E;AAAA,IACJ;AAGA,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACtB,MAAA,KAAA,CAAM,MAAM,SAAS,CAAA;AACrB,MAAA,KAAA,CAAM,IAAI,SAAS,CAAA;AAEnB,MAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,iBAAA,EAAmB,KAAK,OAAA,EAAS,OAAA,EAAS,UAAU,MAAM,CAAA;AAAA,IAChF;AAAA,EACJ;AAAA,EAEA,gBAAgB,KAAA,EAAsB;AAClC,IAAA,MAAM,SAAA,GAAa,MAAM,QAAA,CAA4C,SAAA;AACrE,IAAA,IAAI,SAAA,IAAa,OAAO,SAAA,KAAc,QAAA,EAAU;AAC5C,MAAA,OAAO,UAAU,EAAA,IAAM,SAAA;AAAA,IAC3B;AACA,IAAA,OAAO,SAAA;AAAA,EACX;AACJ;;;ACtGO,IAAM,mBAAN,MAA6C;AAAA,EAChD,KAAA,uBAAY,GAAA,EAAyB;AAAA,EAErC,IAAI,OAAA,EAAqC;AACrC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA,IAAK,IAAA;AAAA,EACtC;AAAA,EAEA,GAAA,CAAI,SAAiB,IAAA,EAAyB;AAC1C,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAA,EAAS,IAAI,CAAA;AAAA,EAChC;AAAA,EAEA,OAAO,OAAA,EAAuB;AAC1B,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,OAAO,CAAA;AAAA,EAC7B;AACJ;AAMO,IAAM,sBAAA,GAAN,cAAqC,YAAA,CAAuE;AAAA,EACtG,IAAA,GAAO,mBAAA;AAAA,EAEhB,OAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EAEA,WAAA,CAAY,KAAA,EAAoB,QAAA,GAAW,IAAA,EAAM;AAC7C,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA,IAAS,IAAI,gBAAA,EAAiB;AAC5C,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA;AAAA,EACrB;AAAA,EAEA,KAAK,MAAA,EAAsB;AACvB,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAEf,IAAA,IAAI,KAAK,SAAA,EAAW;AAEhB,MAAA,MAAA,CAAO,EAAA,CAAG,YAAA,EAAc,CAAC,KAAA,EAAO,MAAA,KAAW;AACvC,QAAA,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,OAAO,CAAA,CAAE,MAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MAChD,CAAC,CAAA;AAED,MAAA,MAAA,CAAO,EAAA,CAAG,aAAA,EAAe,CAAC,KAAA,EAAO,QAAQ,OAAA,KAAY;AACjD,QAAA,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,OAAO,CAAA,CAAE,MAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MAChD,CAAC,CAAA;AAGD,MAAA,MAAA,CAAO,EAAA,CAAG,cAAA,EAAgB,CAAC,KAAA,KAAU;AACjC,QAAA,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,OAAO,CAAA,CAAE,MAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MAClD,CAAC,CAAA;AAAA,IACL;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,OAAA,EAAgC;AAC5C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAI,OAAO,CAAA;AAC7C,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,IAAA,GAAoB;AAAA,MACtB,OAAA;AAAA,MACA,MAAA,EAAQ,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QACjC,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,UAAU,KAAA,CAAM;AAAA,OACpB,CAAE,CAAA;AAAA,MACF,cAAA,EAAgB,KAAA,CAAM,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAC7C,SAAS,CAAA,CAAE,OAAA;AAAA,QACX,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,YAAY,CAAA,CAAE,UAAA;AAAA,QACd,UAAU,CAAA,CAAE;AAAA,OAChB,CAAE,CAAA;AAAA,MACF,YAAA,EAAc,MAAM,KAAA,GACd;AAAA,QACI,OAAA,EAAS,MAAM,KAAA,CAAM,OAAA;AAAA,QACrB,IAAA,EAAM,MAAM,KAAA,CAAM,IAAA;AAAA,QAClB,UAAU,KAAA,CAAM;AAAA,OACpB,GACA,MAAA;AAAA,MACN,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,SAAA,EAAW,KAAK,GAAA;AAAI,KACxB;AAEA,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,IAAI,CAAA;AACnC,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,YAAA,EAAc,OAAO,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,OAAA,EAA8C;AAC1D,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,IAAI,OAAO,CAAA;AAC1C,IAAA,IAAI,CAAC,IAAA,EAAM;AACP,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAI,OAAO,CAAA;AAC7C,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,OAAO,IAAA;AAAA,IACX;AAMA,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,aAAA,EAAe,OAAA,EAAS,IAAA,CAAK,OAAO,MAAM,CAAA;AAC5D,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,OAAA,EAAgC;AAC9C,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAAuC;AAEzC,IAAA,OAAO,MAAM,OAAA,CAAQ,OAAA,CAAQ,EAAE,CAAA;AAAA,EACnC;AACJ;AClJO,IAAM,MAAA,GAAN,cAGGA,mBAAAA,CAAkG;AAAA,EACxG,YAAA,GAAe,KAAA;AAAA,EACf,YAAA,GAAqC,IAAA;AAAA,EAErC,SAAA,GAA2B,IAAA;AAAA,EAC3B,MAAA,GAAqC,IAAA;AAAA,EAE5B,OAAA;AAAA,EACA,OAAA;AAAA,EAEA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EAET,YAAY,OAAA,EAAiC;AACzC,IAAA,KAAA,CAAM,EAAE,iBAAA,EAAmB,KAAA,EAAO,CAAA;AAElC,IAAA,MAAM,QAAA,GAAW,EAAE,GAAG,oBAAA,EAAsB,GAAG,OAAA,EAAQ;AAEvD,IAAA,IAAI,QAAA,CAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IACjD;AACA,IAAA,IAAI,OAAO,QAAA,CAAS,kBAAA,KAAuB,UAAA,EAAY;AACnD,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACnD;AAEA,IAAA,IAAA,CAAK,SAAS,QAAA,CAAS,KAAA;AACvB,IAAA,OAAQ,QAAA,CAAsC,KAAA;AAE9C,IAAA,IAAA,CAAK,OAAA,GAAU,QAAA;AACf,IAAA,IAAA,CAAK,UAAU,EAAC;AAEhB,IAAA,IAAI,QAAA,CAAS,YAAY,MAAA,EAAW;AAChC,MAAA,KAAA,MAAW,MAAA,IAAU,SAAS,OAAA,EAAS;AACnC,QAAA,IAAI,EAAE,kBAAkB,YAAA,CAAA,EAAe;AACnC,UAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,QACvC;AACA,QAAC,IAAA,CAAK,OAAA,CAA0C,MAAA,CAAO,IAAI,CAAA,GAAI,MAAA;AAAA,MACnE;AACA,MAAA,OAAO,QAAA,CAAS,OAAA;AAAA,IACpB;AAEA,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,WAAA,CAAY,IAAyB,CAAA;AACtD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,YAAA,CAAa,IAAyB,CAAA;AACxD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,YAAA,CAAa,IAAyB,CAAA;AAExD,IAAA,MAAM,SAAA,GAAgC;AAAA,MAClC,QAAA,EAAU,KAAA;AAAA,MACV,YAAA,EAAc;AAAA,KAClB;AAEA,IAAA,MAAA,CAAO,iBAAiB,IAAA,EAAM;AAAA,MAC1B,OAAA,EAAS,SAAA;AAAA,MACT,OAAA,EAAS,SAAA;AAAA,MACT,KAAA,EAAO,SAAA;AAAA,MACP,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA,EAAQ;AAAA,KAC4C,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,KAAA,GAAiB;AACjB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAA,GAA0B;AAC1B,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAK,QAAA,EAAiC;AACxC,IAAA,IAAI,KAAK,YAAA,EAAc;AACnB,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI,IAAA,CAAK,iBAAiB,IAAA,EAAM;AAC5B,MAAA,OAAO,IAAA,CAAK,YAAA;AAAA,IAChB;AAEA,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,MAAA;AACJ,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAc,CAAC,KAAK,GAAA,KAAQ;AAC5C,MAAA,OAAA,GAAU,GAAA;AACV,MAAA,MAAA,GAAS,GAAA;AAAA,IACb,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,YAAA,GAAe,OAAA;AACpB,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA;AAEjB,IAAA,IAAI;AACA,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,IAAU,EAAC;AAC9B,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACtB,QAAA,IAAA,CAAK,MAAM,MAAA,CAAO,EAAE,GAAG,IAAA,EAAM,UAAU,CAAA;AAAA,MAC3C;AAGA,MAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,OAAA,EAAS;AAC7B,QAAC,IAAA,CAAK,OAAA,CAAyC,IAAI,CAAA,CAAE,KAAK,IAAyB,CAAA;AAAA,MACvF;AAGA,MAAA,MAAM,IAAA,CAAK,MAAM,OAAA,EAAQ;AAEzB,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,MAAC,IAAA,CAAsB,KAAK,MAAM,CAAA;AAClC,MAAA,OAAA,EAAQ;AAAA,IACZ,SAAS,GAAA,EAAK;AACV,MAAA,MAAA,CAAO,GAAG,CAAA;AACV,MAAA,MAAM,GAAA;AAAA,IACV,CAAA,SAAE;AACE,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,IACxB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,OAAA,EAA6C;AAClD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAY,OAAA,EAA+D;AAC7E,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAA,CAAa,OAAA,EAAiB,MAAA,EAAgC;AAChE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,OAAA,EAAS,MAAM,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAA,CAAO,KAAA,EAAe,OAAA,EAAgD;AACxE,IAAA,IAAI,CAAC,QAAA,CAAS,KAAA,EAAO,WAAW,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,IACtD;AAEA,IAAA,MAAM,IAAA,GAAO,OAAA,EAAS,IAAA,KAAS,MAAA,GAAY,KAAK,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,CAAC,CAAA;AACjG,IAAA,IAAI,CAAC,IAAA,EAAM;AACP,MAAA,IAAI,OAAA,EAAS,SAAS,MAAA,EAAW;AAC7B,QAAA,MAAM,IAAI,MAAM,oBAAoB,CAAA;AAAA,MACxC;AACA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,OAAA,CAAQ,IAAI,CAAA,WAAA,CAAa,CAAA;AAAA,IACtD;AAEA,IAAA,MAAM,MAAA,GAAS,OAAA,EAAS,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,WAAA;AAC/C,IAAA,KAAA,GAAQ,QAAA,CAAS,KAAA,EAAO,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAA,EAAG,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA,CAAA;AAC3E,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,WAAW,KAAK,CAAA;AAE/C,IAAA,QAAQ,OAAO,QAAA;AAAU,MACrB,KAAA,OAAA;AACI,QAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,EAAC,EAAE;AAAA,MACrC,KAAA,OAAA;AACI,QAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,MAC9C,KAAA,UAAA;AACI,QAAA,OAAO,EAAE,MAAM,UAAA,EAAY,IAAA,EAAM,IAAI,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA,EAAE;AAAA,MAC/D,KAAA,QAAA;AACI,QAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAgB,IAAI,KAAA,CAAM,CAAC,CAAC,CAAA,EAAE;AAAA,MACjF,KAAA,OAAA;AACI,QAAA,OAAO,EAAE,MAAM,OAAA,EAAS,IAAA,EAAM,IAAI,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA,EAAE;AAAA,MACzD;AACI,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,IAAA,CAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA;AAC9E,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,IAAA,CAAK,MAAA,EAA8C,OAAA,EAAwD;AAC7G,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAQ,OAAO,CAAA;AAE3C,IAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC5B,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI,CAAC,KAAA,EAAO;AACR,QAAA,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,OAAO,CAAA;AAAA,MAC9C,CAAA,MAAO;AACH,QAAA,MAAA,GAAS,MAAM,KAAA,CAAM,MAAA,CAAO,MAAA,EAAQ,QAAQ,MAAM,CAAA;AAAA,MACtD;AAEA,MAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS;AACzB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,MACtD;AACA,MAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS;AACzB,QAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,OAAA,IAAW,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,CAAO,IAAA,EAAM,CAAA;AAAA,MACpF;AAEA,MAAA,MAAA,GAAS,OAAO,IAAA,KAAS,OAAA,GAAU,OAAO,IAAA,CAAK,CAAC,IAAI,MAAA,CAAO,IAAA;AAAA,IAC/D;AAEA,IAAA,KAAA,KAAU,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAE1C,IAAA,IAAI,OAAA,CAAQ,YAAY,MAAA,EAAW;AAC/B,MAAA,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,OAAA,EAAS,OAAA,CAAQ,OAAO,CAAA;AAAA,IAChD;AAEA,IAAA,KAAA,CAAM,GAAA,CAAI,MAAA,EAAQ,OAAA,CAAQ,QAAQ,CAAA;AAElC,IAAA,IAAI,MAAM,OAAA,EAAS;AACf,MAAA,MAAM,MAAM,MAAA,EAAO;AAAA,IACvB;AAEA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,IAAA,CAAK,OAAA,EAAiB,KAAA,EAA+B;AACvD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAC3D;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAM,OAAA,EAAmC;AAC3C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAC3D;AACA,IAAA,OAAO,MAAM,KAAA,EAAM;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAS,OAAA,EAAwC;AACnD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAC3D;AACA,IAAA,OAAO,MAAM,QAAA,EAAS;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAO,OAAA,EAAmC;AAC5C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAC3D;AACA,IAAA,OAAO,MAAM,MAAA,EAAO;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,IAAA,CAAK,OAAA,EAAiB,EAAA,EAA6B;AACrD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAC3D;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAA,CAAY,SAAiB,QAAA,EAA6B;AACtD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAC3D;AACA,IAAA,OAAO,KAAA,CAAM,YAAY,QAAQ,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAA,CAAc,SAAiB,UAAA,EAAoC;AAC/D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAC3D;AACA,IAAA,OAAO,KAAA,CAAM,cAAc,UAAU,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,SAAA,CAAU,OAAA,EAAiB,MAAA,EAAiC;AAC9D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAC3D;AACA,IAAA,OAAO,KAAA,CAAM,UAAU,MAAM,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAA,CAAQ,SAAiB,eAAA,EAA2C;AAChE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAC3D;AACA,IAAA,OAAO,KAAA,CAAM,QAAQ,eAAe,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAK,OAAA,EAAwC;AAC/C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAC3D;AACA,IAAA,OAAO,MAAM,IAAA,EAAK;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAK,OAAA,EAAgC;AACvC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAC3D;AACA,IAAA,OAAO,MAAM,IAAA,EAAK;AAAA,EACtB;AACJ","file":"index.js","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\ninterface PackageJson {\n name: string;\n version: string;\n description?: string;\n repository?: {\n type: string;\n url: string;\n };\n}\n\nlet packageInfo: PackageJson | null = null;\n\n/**\n * Load package.json information\n * Cached after first load for performance\n */\nfunction loadPackageInfo(): PackageJson {\n if (packageInfo) {\n return packageInfo;\n }\n\n try {\n const possiblePaths = [\n join(__dirname, \"..\", \"..\", \"package.json\"),\n join(__dirname, \"..\", \"package.json\"),\n join(process.cwd(), \"package.json\"),\n ];\n\n for (const path of possiblePaths) {\n try {\n const content = readFileSync(path, \"utf-8\");\n packageInfo = JSON.parse(content) as PackageJson;\n return packageInfo;\n } catch {\n continue;\n }\n }\n\n console.warn(\"Could not load package.json, using fallback values\");\n return {\n name: \"ryanlink\",\n version: \"1.0.0\",\n repository: {\n type: \"git\",\n url: \"https://github.com/ryanwtf7/ryanlink.git\",\n },\n };\n } catch (error) {\n return {\n name: \"ryanlink\",\n version: \"1.0.0\",\n repository: {\n type: \"git\",\n url: \"https://github.com/ryanwtf7/ryanlink.git\",\n },\n };\n }\n}\n\nconst pkg = loadPackageInfo();\n\n/**\n * Package name\n */\nexport const CLIENT_NAME = pkg.name;\n\n/**\n * Package version\n */\nexport const CLIENT_VERSION = pkg.version;\n\n/**\n * Package repository URL\n */\nexport const CLIENT_REPOSITORY = pkg.repository?.url.replace(/\\.git$/, \"\") ?? \"https://github.com/ryanwtf7/ryanlink\";\n\n/**\n * Full package information\n */\nexport const PACKAGE_INFO = Object.freeze({\n name: CLIENT_NAME,\n version: CLIENT_VERSION,\n repository: CLIENT_REPOSITORY,\n description: pkg.description,\n});\n","/**\n * Default configuration options for Ryanlink\n */\n\nimport { CLIENT_NAME, CLIENT_VERSION, CLIENT_REPOSITORY } from \"../metadata\";\nimport type { NodeOptions, PlayerOptions, RESTOptions } from \"../types\";\n\n/**\n * Default REST client options\n */\nexport const DefaultRestOptions = Object.seal({\n /**\n * Lavalink API version\n */\n version: 4,\n\n /**\n * User agent string sent with requests\n */\n userAgent: `${CLIENT_NAME}/${CLIENT_VERSION} (${CLIENT_REPOSITORY})`,\n\n /**\n * Whether to include stack traces in error responses\n */\n stackTrace: false,\n\n /**\n * Request timeout in milliseconds\n */\n requestTimeout: 10_000,\n} as const satisfies Partial<RESTOptions>);\n\n/**\n * Default Node connection options\n */\nexport const DefaultNodeOptions = Object.seal({\n /**\n * Interval for stats updates in milliseconds\n */\n statsInterval: 60_000,\n\n /**\n * Highest acceptable latency in milliseconds\n */\n highestLatency: 2_000,\n\n /**\n * Delay before reconnection attempts in milliseconds\n */\n reconnectDelay: 10_000,\n\n /**\n * Maximum number of reconnection attempts (-1 = infinite)\n */\n reconnectLimit: 3,\n\n /**\n * WebSocket handshake timeout in milliseconds\n */\n handshakeTimeout: 5_000,\n} as const satisfies Partial<Omit<NodeOptions, keyof RESTOptions>>);\n\n/**\n * Default Player options\n */\nexport const DefaultPlayerOptions = Object.seal({\n /**\n * Automatically initialize player on construction\n */\n autoInit: true,\n\n /**\n * Automatically sync queue state with Lavalink\n */\n autoSync: true,\n\n /**\n * Default search prefix (ytsearch, ytmsearch, scsearch, etc.)\n */\n queryPrefix: \"ytsearch\",\n\n /**\n * Automatically relocate queues when nodes disconnect\n */\n relocateQueues: true,\n\n /**\n * Default function to fetch related tracks for autoplay\n * Returns empty array by default (no autoplay)\n */\n async fetchRelatedTracks() {\n return await Promise.resolve([]);\n },\n} as const satisfies Partial<PlayerOptions>);\n\n/**\n * Default queue options\n */\nexport const DefaultQueueOptions = Object.seal({\n /**\n * Default volume (0-1000)\n */\n volume: 100,\n\n /**\n * Default repeat mode\n */\n repeatMode: \"none\" as const,\n\n /**\n * Default autoplay state\n */\n autoplay: false,\n\n /**\n * Default paused state\n */\n paused: false,\n} as const);\n\n/**\n * Default filter values\n */\nexport const DefaultFilterOptions = Object.seal({\n /**\n * Volume multiplier (0.0 - 5.0)\n */\n volume: 1.0,\n\n /**\n * Equalizer bands (15 bands, -0.25 to 1.0 each)\n */\n equalizer: [] as Array<{ band: number; gain: number }>,\n\n /**\n * Karaoke filter\n */\n karaoke: null as { level?: number; monoLevel?: number; filterBand?: number; filterWidth?: number } | null,\n\n /**\n * Timescale filter (speed, pitch, rate)\n */\n timescale: null as { speed?: number; pitch?: number; rate?: number } | null,\n\n /**\n * Tremolo filter (frequency, depth)\n */\n tremolo: null as { frequency?: number; depth?: number } | null,\n\n /**\n * Vibrato filter (frequency, depth)\n */\n vibrato: null as { frequency?: number; depth?: number } | null,\n\n /**\n * Rotation filter (rotationHz)\n */\n rotation: null as { rotationHz?: number } | null,\n\n /**\n * Distortion filter\n */\n distortion: null as {\n sinOffset?: number;\n sinScale?: number;\n cosOffset?: number;\n cosScale?: number;\n tanOffset?: number;\n tanScale?: number;\n offset?: number;\n scale?: number;\n } | null,\n\n /**\n * Channel mix filter\n */\n channelMix: null as {\n leftToLeft?: number;\n leftToRight?: number;\n rightToLeft?: number;\n rightToRight?: number;\n } | null,\n\n /**\n * Low pass filter\n */\n lowPass: null as { smoothing?: number } | null,\n} as const);\n\n/**\n * Common HTTP status codes\n */\nexport const HttpStatusCodes = Object.freeze({\n OK: 200,\n CREATED: 201,\n NO_CONTENT: 204,\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n METHOD_NOT_ALLOWED: 405,\n TOO_MANY_REQUESTS: 429,\n INTERNAL_SERVER_ERROR: 500,\n BAD_GATEWAY: 502,\n SERVICE_UNAVAILABLE: 503,\n GATEWAY_TIMEOUT: 504,\n} as const);\n\n/**\n * WebSocket close codes\n */\nexport const WebSocketCloseCodes = Object.freeze({\n NORMAL: 1000,\n GOING_AWAY: 1001,\n PROTOCOL_ERROR: 1002,\n UNSUPPORTED_DATA: 1003,\n NO_STATUS_RECEIVED: 1005,\n ABNORMAL_CLOSURE: 1006,\n INVALID_FRAME_PAYLOAD_DATA: 1007,\n POLICY_VIOLATION: 1008,\n MESSAGE_TOO_BIG: 1009,\n INTERNAL_ERROR: 1011,\n} as const);\n","/**\n * Professional Equalizer Presets for Ryanlink v2\n * All presets use 15-band equalizer configuration\n */\n\nexport interface EQBand {\n band: number;\n gain: number;\n}\n\nexport const EQPresets = {\n /** A Bassboost Equalizer, so high it distorts the audio */\n BassboostEarrape: [\n { band: 0, gain: 0.6 * 0.375 },\n { band: 1, gain: 0.67 * 0.375 },\n { band: 2, gain: 0.67 * 0.375 },\n { band: 3, gain: 0.4 * 0.375 },\n { band: 4, gain: -0.5 * 0.375 },\n { band: 5, gain: 0.15 * 0.375 },\n { band: 6, gain: -0.45 * 0.375 },\n { band: 7, gain: 0.23 * 0.375 },\n { band: 8, gain: 0.35 * 0.375 },\n { band: 9, gain: 0.45 * 0.375 },\n { band: 10, gain: 0.55 * 0.375 },\n { band: 11, gain: -0.6 * 0.375 },\n { band: 12, gain: 0.55 * 0.375 },\n { band: 13, gain: -0.5 * 0.375 },\n { band: 14, gain: -0.75 * 0.375 },\n ] as EQBand[],\n\n /** A High and decent Bassboost Equalizer */\n BassboostHigh: [\n { band: 0, gain: 0.6 * 0.25 },\n { band: 1, gain: 0.67 * 0.25 },\n { band: 2, gain: 0.67 * 0.25 },\n { band: 3, gain: 0.4 * 0.25 },\n { band: 4, gain: -0.5 * 0.25 },\n { band: 5, gain: 0.15 * 0.25 },\n { band: 6, gain: -0.45 * 0.25 },\n { band: 7, gain: 0.23 * 0.25 },\n { band: 8, gain: 0.35 * 0.25 },\n { band: 9, gain: 0.45 * 0.25 },\n { band: 10, gain: 0.55 * 0.25 },\n { band: 11, gain: -0.6 * 0.25 },\n { band: 12, gain: 0.55 * 0.25 },\n { band: 13, gain: -0.5 * 0.25 },\n { band: 14, gain: -0.75 * 0.25 },\n ] as EQBand[],\n\n /** A decent Bassboost Equalizer */\n BassboostMedium: [\n { band: 0, gain: 0.6 * 0.1875 },\n { band: 1, gain: 0.67 * 0.1875 },\n { band: 2, gain: 0.67 * 0.1875 },\n { band: 3, gain: 0.4 * 0.1875 },\n { band: 4, gain: -0.5 * 0.1875 },\n { band: 5, gain: 0.15 * 0.1875 },\n { band: 6, gain: -0.45 * 0.1875 },\n { band: 7, gain: 0.23 * 0.1875 },\n { band: 8, gain: 0.35 * 0.1875 },\n { band: 9, gain: 0.45 * 0.1875 },\n { band: 10, gain: 0.55 * 0.1875 },\n { band: 11, gain: -0.6 * 0.1875 },\n { band: 12, gain: 0.55 * 0.1875 },\n { band: 13, gain: -0.5 * 0.1875 },\n { band: 14, gain: -0.75 * 0.1875 },\n ] as EQBand[],\n\n /** A slight Bassboost Equalizer */\n BassboostLow: [\n { band: 0, gain: 0.6 * 0.125 },\n { band: 1, gain: 0.67 * 0.125 },\n { band: 2, gain: 0.67 * 0.125 },\n { band: 3, gain: 0.4 * 0.125 },\n { band: 4, gain: -0.5 * 0.125 },\n { band: 5, gain: 0.15 * 0.125 },\n { band: 6, gain: -0.45 * 0.125 },\n { band: 7, gain: 0.23 * 0.125 },\n { band: 8, gain: 0.35 * 0.125 },\n { band: 9, gain: 0.45 * 0.125 },\n { band: 10, gain: 0.55 * 0.125 },\n { band: 11, gain: -0.6 * 0.125 },\n { band: 12, gain: 0.55 * 0.125 },\n { band: 13, gain: -0.5 * 0.125 },\n { band: 14, gain: -0.75 * 0.125 },\n ] as EQBand[],\n\n /** Professional high-fidelity audio preset for clear vocals and deep bass */\n HighQuality: [\n { band: 0, gain: 0.15 },\n { band: 1, gain: 0.1 },\n { band: 2, gain: 0.05 },\n { band: 3, gain: 0 },\n { band: 4, gain: 0 },\n { band: 5, gain: 0 },\n { band: 6, gain: 0 },\n { band: 7, gain: 0 },\n { band: 8, gain: 0 },\n { band: 9, gain: 0 },\n { band: 10, gain: 0.05 },\n { band: 11, gain: 0.1 },\n { band: 12, gain: 0.15 },\n { band: 13, gain: 0.15 },\n { band: 14, gain: 0.15 },\n ] as EQBand[],\n\n /** Makes the Music slightly \"better\" */\n BetterMusic: [\n { band: 0, gain: 0.25 },\n { band: 1, gain: 0.025 },\n { band: 2, gain: 0.0125 },\n { band: 3, gain: 0 },\n { band: 4, gain: 0 },\n { band: 5, gain: -0.0125 },\n { band: 6, gain: -0.025 },\n { band: 7, gain: -0.0175 },\n { band: 8, gain: 0 },\n { band: 9, gain: 0 },\n { band: 10, gain: 0.0125 },\n { band: 11, gain: 0.025 },\n { band: 12, gain: 0.25 },\n { band: 13, gain: 0.125 },\n { band: 14, gain: 0.125 },\n ] as EQBand[],\n\n /** Makes the Music sound like rock music / sound rock music better */\n Rock: [\n { band: 0, gain: 0.3 },\n { band: 1, gain: 0.25 },\n { band: 2, gain: 0.2 },\n { band: 3, gain: 0.1 },\n { band: 4, gain: 0.05 },\n { band: 5, gain: -0.05 },\n { band: 6, gain: -0.15 },\n { band: 7, gain: -0.2 },\n { band: 8, gain: -0.1 },\n { band: 9, gain: -0.05 },\n { band: 10, gain: 0.05 },\n { band: 11, gain: 0.1 },\n { band: 12, gain: 0.2 },\n { band: 13, gain: 0.25 },\n { band: 14, gain: 0.3 },\n ] as EQBand[],\n\n /** Makes the Music sound like Classic music / sound Classic music better */\n Classic: [\n { band: 0, gain: 0.375 },\n { band: 1, gain: 0.35 },\n { band: 2, gain: 0.125 },\n { band: 3, gain: 0 },\n { band: 4, gain: 0 },\n { band: 5, gain: 0.125 },\n { band: 6, gain: 0.55 },\n { band: 7, gain: 0.05 },\n { band: 8, gain: 0.125 },\n { band: 9, gain: 0.25 },\n { band: 10, gain: 0.2 },\n { band: 11, gain: 0.25 },\n { band: 12, gain: 0.3 },\n { band: 13, gain: 0.25 },\n { band: 14, gain: 0.3 },\n ] as EQBand[],\n\n /** Makes the Music sound like Pop music / sound Pop music better */\n Pop: [\n { band: 0, gain: 0.26 },\n { band: 1, gain: 0.22 },\n { band: 2, gain: 0.18 },\n { band: 3, gain: 0.12 },\n { band: 4, gain: 0.1 },\n { band: 5, gain: 0.03 },\n { band: 6, gain: -0.005 },\n { band: 7, gain: -0.01 },\n { band: 8, gain: -0.015 },\n { band: 9, gain: -0.015 },\n { band: 10, gain: -0.01 },\n { band: 11, gain: -0.005 },\n { band: 12, gain: 0.08 },\n { band: 13, gain: 0.15 },\n { band: 14, gain: 0.2 },\n ] as EQBand[],\n\n /** Makes the Music sound like Electronic music / sound Electronic music better */\n Electronic: [\n { band: 0, gain: 0.375 },\n { band: 1, gain: 0.35 },\n { band: 2, gain: 0.125 },\n { band: 3, gain: 0 },\n { band: 4, gain: 0 },\n { band: 5, gain: -0.125 },\n { band: 6, gain: -0.125 },\n { band: 7, gain: 0 },\n { band: 8, gain: 0.25 },\n { band: 9, gain: 0.125 },\n { band: 10, gain: 0.15 },\n { band: 11, gain: 0.2 },\n { band: 12, gain: 0.25 },\n { band: 13, gain: 0.35 },\n { band: 14, gain: 0.4 },\n ] as EQBand[],\n\n /** Boosts all Bands slightly for louder and fuller sound */\n FullSound: [\n { band: 0, gain: 0.25 },\n { band: 1, gain: 0.25 },\n { band: 2, gain: 0.25 },\n { band: 3, gain: 0.25 },\n { band: 4, gain: 0.25 },\n { band: 5, gain: 0.25 },\n { band: 6, gain: 0.25 },\n { band: 7, gain: 0.25 },\n { band: 8, gain: 0.25 },\n { band: 9, gain: 0.25 },\n { band: 10, gain: 0.25 },\n { band: 11, gain: 0.25 },\n { band: 12, gain: 0.25 },\n { band: 13, gain: 0.25 },\n { band: 14, gain: 0.25 },\n ] as EQBand[],\n\n /** Makes the Music sound like being in a Gaming environment / sound Gaming music better */\n Gaming: [\n { band: 0, gain: 0.35 },\n { band: 1, gain: 0.3 },\n { band: 2, gain: 0.25 },\n { band: 3, gain: 0.2 },\n { band: 4, gain: 0.15 },\n { band: 5, gain: 0.1 },\n { band: 6, gain: 0.075 },\n { band: 7, gain: 0 },\n { band: 8, gain: -0.05 },\n { band: 9, gain: 0.05 },\n { band: 10, gain: 0.1 },\n { band: 11, gain: 0.15 },\n { band: 12, gain: 0.25 },\n { band: 13, gain: 0.3 },\n { band: 14, gain: 0.35 },\n ] as EQBand[],\n\n /** Nightcore preset with speed and pitch adjustments */\n Nightcore: [\n { band: 0, gain: 0.2 },\n { band: 1, gain: 0.15 },\n { band: 2, gain: 0.1 },\n { band: 3, gain: 0.05 },\n { band: 4, gain: 0 },\n { band: 5, gain: -0.05 },\n { band: 6, gain: -0.1 },\n { band: 7, gain: -0.05 },\n { band: 8, gain: 0 },\n { band: 9, gain: 0.05 },\n { band: 10, gain: 0.1 },\n { band: 11, gain: 0.15 },\n { band: 12, gain: 0.2 },\n { band: 13, gain: 0.25 },\n { band: 14, gain: 0.3 },\n ] as EQBand[],\n\n /** Vaporwave preset */\n Vaporwave: [\n { band: 0, gain: 0.35 },\n { band: 1, gain: 0.3 },\n { band: 2, gain: 0.2 },\n { band: 3, gain: 0.1 },\n { band: 4, gain: 0 },\n { band: 5, gain: -0.05 },\n { band: 6, gain: -0.1 },\n { band: 7, gain: -0.15 },\n { band: 8, gain: -0.1 },\n { band: 9, gain: 0 },\n { band: 10, gain: 0.1 },\n { band: 11, gain: 0.15 },\n { band: 12, gain: 0.2 },\n { band: 13, gain: 0.25 },\n { band: 14, gain: 0.3 },\n ] as EQBand[],\n\n /** Treble and Bass boost */\n TrebleBass: [\n { band: 0, gain: 0.3 },\n { band: 1, gain: 0.25 },\n { band: 2, gain: 0.2 },\n { band: 3, gain: 0.1 },\n { band: 4, gain: 0 },\n { band: 5, gain: -0.05 },\n { band: 6, gain: -0.1 },\n { band: 7, gain: -0.05 },\n { band: 8, gain: 0 },\n { band: 9, gain: 0.05 },\n { band: 10, gain: 0.1 },\n { band: 11, gain: 0.15 },\n { band: 12, gain: 0.2 },\n { band: 13, gain: 0.25 },\n { band: 14, gain: 0.3 },\n ] as EQBand[],\n\n /** Soft preset */\n Soft: [\n { band: 0, gain: 0.1 },\n { band: 1, gain: 0.08 },\n { band: 2, gain: 0.06 },\n { band: 3, gain: 0.04 },\n { band: 4, gain: 0.02 },\n { band: 5, gain: 0 },\n { band: 6, gain: 0 },\n { band: 7, gain: 0 },\n { band: 8, gain: 0 },\n { band: 9, gain: 0 },\n { band: 10, gain: 0.02 },\n { band: 11, gain: 0.04 },\n { band: 12, gain: 0.06 },\n { band: 13, gain: 0.08 },\n { band: 14, gain: 0.1 },\n ] as EQBand[],\n\n /** TV preset */\n TV: [\n { band: 0, gain: 0.2 },\n { band: 1, gain: 0.25 },\n { band: 2, gain: 0.3 },\n { band: 3, gain: 0.25 },\n { band: 4, gain: 0.2 },\n { band: 5, gain: 0.1 },\n { band: 6, gain: 0 },\n { band: 7, gain: 0 },\n { band: 8, gain: 0.1 },\n { band: 9, gain: 0.15 },\n { band: 10, gain: 0.2 },\n { band: 11, gain: 0.15 },\n { band: 12, gain: 0.1 },\n { band: 13, gain: 0.05 },\n { band: 14, gain: 0 },\n ] as EQBand[],\n\n /** Radio preset */\n Radio: [\n { band: 0, gain: 0.15 },\n { band: 1, gain: 0.2 },\n { band: 2, gain: 0.25 },\n { band: 3, gain: 0.2 },\n { band: 4, gain: 0.15 },\n { band: 5, gain: 0.1 },\n { band: 6, gain: 0 },\n { band: 7, gain: 0 },\n { band: 8, gain: 0 },\n { band: 9, gain: 0.1 },\n { band: 10, gain: 0.15 },\n { band: 11, gain: 0.2 },\n { band: 12, gain: 0.15 },\n { band: 13, gain: 0.1 },\n { band: 14, gain: 0.05 },\n ] as EQBand[],\n\n /** Normalization preset (all bands at 0) */\n Normalization: [\n { band: 0, gain: 0 },\n { band: 1, gain: 0 },\n { band: 2, gain: 0 },\n { band: 3, gain: 0 },\n { band: 4, gain: 0 },\n { band: 5, gain: 0 },\n { band: 6, gain: 0 },\n { band: 7, gain: 0 },\n { band: 8, gain: 0 },\n { band: 9, gain: 0 },\n { band: 10, gain: 0 },\n { band: 11, gain: 0 },\n { band: 12, gain: 0 },\n { band: 13, gain: 0 },\n { band: 14, gain: 0 },\n ] as EQBand[],\n} as const;\n\nexport type EQPresetName = keyof typeof EQPresets;\n\n/**\n * Get an EQ preset by name\n * @param name The preset name\n * @returns The EQ bands for the preset\n */\nexport function getEQPreset(name: EQPresetName): readonly EQBand[] {\n return EQPresets[name];\n}\n\n/**\n * Get all available EQ preset names\n * @returns Array of preset names\n */\nexport function getEQPresetNames(): EQPresetName[] {\n return Object.keys(EQPresets) as EQPresetName[];\n}\n\n/**\n * Check if a preset name is valid\n * @param name The preset name to check\n * @returns True if the preset exists\n */\nexport function isValidEQPreset(name: string): name is EQPresetName {\n return name in EQPresets;\n}\n","export const SnowflakeRegex = /^\\d{17,20}$/;\n\nexport const VoiceRegionIdRegex = /^([-a-z]{2,20})(?=[-a-z\\d]*\\.discord\\.media:\\d+$)/;\n\nexport const UrlRegex = /^https?:\\/\\/.+/i;\n\nexport const YoutubeRegex = /^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtu\\.be)\\/.+/i;\n\nexport const SpotifyRegex = /^https?:\\/\\/open\\.spotify\\.com\\/(track|album|playlist|artist)\\/.+/i;\n\nexport const SoundCloudRegex = /^https?:\\/\\/(www\\.)?soundcloud\\.com\\/.+/i;\n\nexport const BandcampRegex = /^https?:\\/\\/.+\\.bandcamp\\.com\\/(track|album)\\/.+/i;\n\nexport const TwitchRegex = /^https?:\\/\\/(www\\.)?twitch\\.tv\\/.+/i;\n\nexport const AppleMusicRegex = /^https?:\\/\\/music\\.apple\\.com\\/.+/i;\n\nexport const DeezerRegex = /^https?:\\/\\/(www\\.)?deezer\\.com\\/(track|album|playlist)\\/.+/i;\n\nexport const AudioFileRegex = /^https?:\\/\\/.+\\.(mp3|wav|ogg|flac|m4a|aac|opus|webm)(\\?.*)?$/i;\n\nexport const TidalRegex =\n /^https?:\\/\\/(?:(?:listen|www)\\.)?tidal\\.com\\/(?:browse\\/)?(?:album|track|playlist|mix)\\/[a-zA-Z0-9-]+(?:\\/.*)?(?:\\?.*)?$/i;\n\nexport const YandexMusicRegex =\n /^(?:https?:\\/\\/)?music\\.yandex\\.(?:ru|com|kz|by)\\/(?:artist|album|track|users\\/[0-9A-Za-z@.-]+\\/playlists|playlists)\\/[0-9A-Za-z-.]+(?:\\/track\\/[0-9]+)?(?:\\/)?$/i;\n\nexport const AmazonMusicRegex =\n /^https?:\\/\\/music\\.amazon\\.[^/]+\\/(?:albums|tracks|artists|playlists|user-playlists|community-playlists)\\/[A-Za-z0-9]+(?:\\/[^/?#]+)?(?:[/?].*)?$/i;\n\nexport const JioSaavnRegex =\n /^(?:https?:\\/\\/)?(?:www\\.)?jiosaavn\\.com\\/(?:song|album|featured|artist|s\\/playlist)\\/[a-zA-Z0-9_-]+(?:\\/[a-zA-Z0-9_-]+)?$/i;\n\nexport const PandoraRegex =\n /^@?(?:https?:\\/\\/)?(?:www\\.)?pandora\\.com\\/(?:playlist\\/PL:[\\d:]+|artist\\/[\\w-]+(?:\\/[\\w-]+)*\\/(?:TR|AL|AR)[A-Za-z0-9]+)(?:[?#].*)?$/i;\n\nexport const QobuzRegex =\n /^https?:\\/\\/(?:www\\.|play\\.|open\\.)?qobuz\\.com\\/(?:(?:[a-z]{2}-[a-z]{2}\\/)?(?:album|playlist|track|artist)\\/(?:.+?\\/)?[a-zA-Z0-9]+|playlist\\/\\d+)$/i;\n\nexport const AudiomackRegex =\n /^https?:\\/\\/audiomack\\.com\\/(?:(?:[^/]+\\/(?:song|album|playlist)|(?:song|album|playlist))\\/[^/?#]+)$/i;\n\nexport const MixcloudRegex =\n /^https?:\\/\\/(?:(?:www|beta|m)\\.)?mixcloud\\.com\\/[^/]+\\/(?:playlists\\/[^/]+|(?!stream|uploads|favorites|listens|playlists)[^/]+|(?:uploads|favorites|listens|stream))(?:\\/)?$/i;\n\nexport const AnghamiRegex = /^https?:\\/\\/(?:play\\.)?anghami\\.com\\/(?:song|album|playlist|artist)\\/[0-9]+$/i;\n\nexport const AudiusRegex = /^https?:\\/\\/(?:www\\.)?audius\\.co\\/[^/]+\\/[^/]+$/i;\n\nexport const GaanaRegex = /^https?:\\/\\/(?:www\\.)?gaana\\.com\\/(?:song|album|playlist)\\/[^/]+$/i;\n\nexport const InstagramRegex = /^https?:\\/\\/(?:www\\.)?instagram\\.com\\/(?:p|reel|tv)\\/[A-Za-z0-9_-]+(?:\\/)?$/i;\n\nexport const ShazamRegex = /^https?:\\/\\/(?:www\\.)?shazam\\.com\\/track\\/[0-9]+$/i;\n","/**\n * Lavalink REST API route constructors\n */\n\n/**\n * An object holding methods that construct API routes based on params\n */\nexport const Routes = {\n /**\n * WebSocket endpoint\n * @returns `/websocket`\n */\n websocket(): \"/websocket\" {\n return \"/websocket\" as const;\n },\n\n /**\n * Track loading endpoint\n * @returns `/loadtracks`\n */\n trackLoading(): \"/loadtracks\" {\n return \"/loadtracks\" as const;\n },\n\n /**\n * Track decoding endpoint\n * @param multiple Whether to decode multiple tracks\n * @returns `/decodetrack` or `/decodetracks`\n */\n trackDecoding(multiple?: boolean): \"/decodetrack\" | \"/decodetracks\" {\n if (multiple) {\n return \"/decodetracks\" as const;\n }\n return \"/decodetrack\" as const;\n },\n\n /**\n * Player endpoint\n * @param sessionId Lavalink session ID\n * @param guildId Optional guild ID for specific player\n * @returns `/sessions/{sessionId}/players` or `/sessions/{sessionId}/players/{guildId}`\n */\n player(sessionId: string, guildId?: string): string {\n if (guildId) {\n return `/sessions/${sessionId}/players/${guildId}` as const;\n }\n return `/sessions/${sessionId}/players` as const;\n },\n\n /**\n * Session endpoint\n * @param sessionId Lavalink session ID\n * @returns `/sessions/{sessionId}`\n */\n session(sessionId: string): string {\n return `/sessions/${sessionId}` as const;\n },\n\n /**\n * Info endpoint\n * @returns `/info`\n */\n info(): \"/info\" {\n return \"/info\" as const;\n },\n\n /**\n * Stats endpoint\n * @returns `/stats`\n */\n stats(): \"/stats\" {\n return \"/stats\" as const;\n },\n\n /**\n * Route planner endpoint\n * @param free Optional action: `address` or `all`\n * @returns `/routeplanner/status` or `/routeplanner/free/{action}`\n */\n routePlanner(free?: \"address\" | \"all\"): string {\n if (free) {\n return `/routeplanner/free/${free}` as const;\n }\n return \"/routeplanner/status\" as const;\n },\n\n /**\n * Version endpoint\n * @returns `/version`\n */\n version(): \"/version\" {\n return \"/version\" as const;\n },\n} as const;\n\n/**\n * Type helper to extract route return types\n */\nexport type RouteReturnType<T extends keyof typeof Routes> = ReturnType<(typeof Routes)[T]>;\n","/**\n * Symbol for internal lookup operations\n * Used to access internal state without exposing public methods\n */\nexport const LookupSymbol = Symbol.for(\"lookup\");\n\n/**\n * Symbol for internal update operations\n * Used to update internal state without exposing public methods\n */\nexport const UpdateSymbol = Symbol.for(\"update\");\n\n/**\n * Symbol for ping update handling in VoiceRegion\n */\nexport const OnPingUpdateSymbol = Symbol(\"onPingUpdate\");\n\n/**\n * Symbol for voice close handling\n */\nexport const OnVoiceCloseSymbol = Symbol(\"onVoiceClose\");\n\n/**\n * Symbol for player state update handling\n */\nexport const OnStateUpdateSymbol = Symbol(\"onStateUpdate\");\n\n/**\n * Symbol for event update handling\n */\nexport const OnEventUpdateSymbol = Symbol(\"onEventUpdate\");\n","/**\n * Utility functions for Ryanlink\n */\n\n/**\n * Do nothing, return nothing\n * Useful for error handling and default callbacks\n */\nexport const noop = (): void => {};\n\n/**\n * Format duration as a string\n * @param ms Duration in milliseconds\n * @returns Formatted string: `hh:mm:ss`, `mm:ss`, or `00:00` (default)\n *\n * @example\n * formatDuration(0) // \"00:00\"\n * formatDuration(90000) // \"01:30\"\n * formatDuration(3661000) // \"01:01:01\"\n */\nexport const formatDuration = (ms: number): string => {\n if (!Number.isSafeInteger(ms) || ms <= 0) {\n return \"00:00\";\n }\n\n const s = Math.floor(ms / 1000);\n const ss = `${s % 60}`.padStart(2, \"0\");\n const mm = `${Math.floor(s / 60) % 60}`.padStart(2, \"0\");\n\n if (s < 3600) {\n return `${(s === 3600 ? \"01:\" : \"\") + mm}:${ss}`;\n }\n\n return `${`${Math.floor(s / 3600)}`.padStart(2, \"0\")}:${mm}:${ss}`;\n};\n\n/**\n * Parse duration string to milliseconds\n * @param duration Duration string (hh:mm:ss, mm:ss, or ss)\n * @returns Duration in milliseconds\n *\n * @example\n * parseDuration(\"01:30\") // 90000\n * parseDuration(\"1:01:01\") // 3661000\n */\nexport const parseDuration = (duration: string): number => {\n const parts = duration.split(\":\").map(Number);\n\n if (parts.length === 1) {\n return (parts[0] ?? 0) * 1000;\n }\n\n if (parts.length === 2) {\n return ((parts[0] ?? 0) * 60 + (parts[1] ?? 0)) * 1000;\n }\n\n if (parts.length === 3) {\n return ((parts[0] ?? 0) * 3600 + (parts[1] ?? 0) * 60 + (parts[2] ?? 0)) * 1000;\n }\n\n return 0;\n};\n\n/**\n * Clamp a number between min and max\n * @param value Value to clamp\n * @param min Minimum value\n * @param max Maximum value\n * @returns Clamped value\n */\nexport const clamp = (value: number, min: number, max: number): number => {\n return Math.min(Math.max(value, min), max);\n};\n\n/**\n * Sleep for a specified duration\n * @param ms Duration in milliseconds\n * @returns Promise that resolves after the duration\n */\nexport const sleep = (ms: number): Promise<void> => {\n return new Promise((resolve) => setTimeout(resolve, ms));\n};\n\n/**\n * Retry a function with exponential backoff\n * @param fn Function to retry\n * @param maxAttempts Maximum number of attempts\n * @param baseDelay Base delay in milliseconds\n * @returns Result of the function\n */\nexport const retry = async <T>(fn: () => Promise<T>, maxAttempts = 3, baseDelay = 1000): Promise<T> => {\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt < maxAttempts - 1) {\n const delay = baseDelay * Math.pow(2, attempt);\n await sleep(delay);\n }\n }\n }\n\n throw lastError ?? new Error(\"Retry failed\");\n};\n\n/**\n * Shuffle an array in place using Fisher-Yates algorithm\n * @param array Array to shuffle\n * @returns The shuffled array\n */\nexport const shuffle = <T>(array: T[]): T[] => {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [array[i], array[j]] = [array[j], array[i]];\n }\n return array;\n};\n\n/**\n * Get a random element from an array\n * @param array Array to pick from\n * @returns Random element or undefined if array is empty\n */\nexport const randomElement = <T>(array: T[]): T | undefined => {\n if (array.length === 0) {\n return undefined;\n }\n return array[Math.floor(Math.random() * array.length)];\n};\n\n/**\n * Chunk an array into smaller arrays\n * @param array Array to chunk\n * @param size Size of each chunk\n * @returns Array of chunks\n */\nexport const chunk = <T>(array: T[], size: number): T[][] => {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n};\n\n/**\n * Remove duplicates from an array\n * @param array Array to deduplicate\n * @param key Optional key function for complex objects\n * @returns Array without duplicates\n */\nexport const unique = <T>(array: T[], key?: (item: T) => unknown): T[] => {\n if (!key) {\n return [...new Set(array)];\n }\n\n const seen = new Set();\n return array.filter((item) => {\n const k = key(item);\n if (seen.has(k)) {\n return false;\n }\n seen.add(k);\n return true;\n });\n};\n","import { URL } from \"node:url\";\nimport type { CreateNodeOptions, PlayerOptions } from \"../types\";\n\n/**\n * Validation functions for Ryanlink\n */\n\n/**\n * Check if input is a finite number\n * @param input Value to check\n * @param check Optional check type: `integer`, `natural` (> 0), `whole` (>= 0)\n * @returns `true` if the input passed, `false` otherwise\n */\nexport const isNumber = <T extends number>(\n input: unknown,\n check?: \"integer\" | \"natural\" | \"whole\" | \"safe-int\" | \"positive\",\n): input is T => {\n if (check === undefined) {\n return Number.isFinite(input);\n }\n if (check === \"integer\" || check === \"safe-int\") {\n return Number.isSafeInteger(input);\n }\n if (check === \"natural\" || check === \"positive\") {\n return Number.isSafeInteger(input) && (input as number) > 0;\n }\n if (check === \"whole\") {\n return Number.isSafeInteger(input) && (input as number) >= 0;\n }\n return false;\n};\n\n/**\n * Check if input is a string\n * @param input Value to check\n * @param check Optional check: {@linkcode RegExp}, `url` ({@linkcode URL.canParse}), `non-empty` (at least one non-whitespace character)\n * @returns `true` if the input passed, `false` otherwise\n */\nexport const isString = <T extends string>(input: unknown, check?: \"url\" | \"non-empty\" | RegExp): input is T => {\n if (typeof input !== \"string\") {\n return false;\n }\n if (check === undefined) {\n return true;\n }\n if (check === \"url\") {\n return URL.canParse(input);\n }\n if (check === \"non-empty\") {\n return input.trim().length > 0;\n }\n if (check instanceof RegExp) {\n return check.test(input);\n }\n return false;\n};\n\n/**\n * Check if input is a plain object\n * @param input Value to check\n * @param check Optional check: `non-empty` (at least one key)\n * @returns `true` if the input passed, `false` otherwise\n */\nexport const isRecord = <T extends Record<string, unknown>>(input: unknown, check?: \"non-empty\"): input is T => {\n if (!input || input.constructor !== Object) {\n return false;\n }\n if (check === undefined) {\n return true;\n }\n if (check === \"non-empty\") {\n return Object.keys(input).length > 0;\n }\n return false;\n};\n\n/**\n * Check if input is an array\n * @param input Value to check\n * @param check Optional check: `non-empty`, or a function (same as {@linkcode Array.prototype.every})\n * @returns `true` if the input passed, `false` otherwise\n */\nexport const isArray = <T extends unknown[]>(\n input: unknown,\n check?: \"non-empty\" | Parameters<T[\"every\"]>[0],\n): input is T => {\n if (!Array.isArray(input)) {\n return false;\n }\n if (check === undefined) {\n return true;\n }\n if (check === \"non-empty\") {\n return input.length !== 0;\n }\n if (typeof check === \"function\") {\n return input.every(check);\n }\n return false;\n};\n\n/**\n * Check if input is a boolean\n * @param input Value to check\n * @returns `true` if the input is a boolean, `false` otherwise\n */\nexport const isBoolean = (input: unknown): input is boolean => {\n return typeof input === \"boolean\";\n};\n\n/**\n * Check if input is a function\n * @param input Value to check\n * @returns `true` if the input is a function, `false` otherwise\n */\nexport const isFunction = (input: unknown): input is (...args: unknown[]) => unknown => {\n return typeof input === \"function\";\n};\n\n/**\n * Check if input is null or undefined\n * @param input Value to check\n * @returns `true` if the input is null or undefined, `false` otherwise\n */\nexport const isNullish = (input: unknown): input is null | undefined => {\n return input === null || input === undefined;\n};\n\n/**\n * Check if input is a valid snowflake (Discord ID)\n * @param input Value to check\n * @returns `true` if the input is a valid snowflake, `false` otherwise\n */\nexport const isSnowflake = (input: unknown): input is string => {\n return isString(input) && /^\\d{17,20}$/.test(input);\n};\n\n/**\n * Check if input is a valid URL\n * @param input Value to check\n * @returns `true` if the input is a valid URL, `false` otherwise\n */\nexport const isUrl = (input: unknown): input is string => {\n return isString(input, \"url\");\n};\n\n/**\n * Type guard to check if error is an Error instance\n * @param error Value to check\n * @returns `true` if the value is an Error, `false` otherwise\n */\nexport const isError = (error: unknown): error is Error => {\n return error instanceof Error;\n};\n\n/**\n * Assert that a condition is true, throw error otherwise\n */\nexport function assert(condition: unknown, message: string): asserts condition {\n if (!condition) {\n throw new Error(message);\n }\n}\n\n/**\n * Validates node options\n */\nexport function validateNodeOptions(options: CreateNodeOptions): void {\n assert(isString(options.name, \"non-empty\"), \"Node name must be a non-empty string\");\n assert(isString(options.host, \"non-empty\"), \"Node host must be a non-empty string\");\n assert(isNumber(options.port, \"natural\"), \"Node port must be a positive number\");\n assert(isString(options.password, \"non-empty\"), \"Node password must be a non-empty string\");\n}\n\n/**\n * Validates player options\n */\nexport function validatePlayerOptions(options: PlayerOptions): void {\n assert(isArray(options.nodes, \"non-empty\"), \"At least one node is required\");\n assert(isFunction(options.forwardVoiceUpdate), \"forwardVoiceUpdate must be a function\");\n if (options.queryPrefix !== undefined) {\n assert(isString(options.queryPrefix, \"non-empty\"), \"queryPrefix must be a non-empty string\");\n }\n}\n","import { Routes } from \"../config/endpoints\";\nimport { CLIENT_NAME, CLIENT_VERSION, CLIENT_REPOSITORY } from \"../metadata\";\nimport type {\n RESTOptions,\n LoadResult,\n APIPlayer,\n PlayerUpdateRequestBody,\n PlayerUpdateQueryParams,\n SessionUpdateRequestBody,\n SessionUpdateResponseBody,\n LavalinkInfo,\n NodeStats,\n RoutePlannerStatus,\n APITrack,\n} from \"../types\";\n\n/**\n * REST client for Lavalink HTTP API\n * Uses native fetch for better performance\n */\nexport class REST {\n #origin: string;\n #headers: Record<string, string>;\n #sessionId: string | null = null;\n #requestTimeout: number;\n\n readonly userAgent: string;\n\n constructor(options: RESTOptions) {\n if (options.origin) {\n if (!options.origin.startsWith(\"http://\") && !options.origin.startsWith(\"https://\")) {\n throw new Error(\"Origin must start with http:// or https://\");\n }\n this.#origin = options.origin;\n } else {\n const protocol = options.secure ? \"https\" : \"http\";\n const port = options.port ?? 2333;\n const host = options.host ?? \"localhost\";\n this.#origin = `${protocol}://${host}:${port}`;\n }\n\n if (options.version !== undefined && options.version <= 0) {\n throw new Error(\"Version must be a positive number\");\n }\n\n if (options.password.includes(\"\\n\") || options.password.includes(\"\\r\")) {\n throw new Error(\"Password cannot contain newline characters\");\n }\n\n const userAgent = options.userAgent ?? `${CLIENT_NAME}/${CLIENT_VERSION} (${CLIENT_REPOSITORY})`;\n if (userAgent.includes(\"\\n\") || userAgent.includes(\"\\r\")) {\n throw new Error(\"User agent cannot contain newline characters\");\n }\n this.userAgent = userAgent;\n\n const requestTimeout = options.requestTimeout ?? 10_000;\n if (requestTimeout <= 0) {\n throw new Error(\"Request timeout must be a positive number\");\n }\n this.#requestTimeout = requestTimeout;\n\n this.#headers = {\n Authorization: options.password,\n \"User-Agent\": this.userAgent,\n \"Content-Type\": \"application/json\",\n };\n\n if (options.sessionId) {\n this.#sessionId = options.sessionId;\n }\n }\n\n get origin(): string {\n return this.#origin;\n }\n\n get sessionId(): string | null {\n return this.#sessionId;\n }\n\n set sessionId(value: string | null) {\n if (value !== null && (typeof value !== \"string\" || value.trim() === \"\")) {\n return;\n }\n this.#sessionId = value;\n }\n\n /**\n * Make a request to the Lavalink REST API\n */\n async #request<T>(path: string, options: RequestInit = {}, timeout?: number): Promise<T> {\n const url = `${this.#origin}${path}`;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout ?? this.#requestTimeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n headers: {\n ...this.#headers,\n ...options.headers,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await this.#parseError(response);\n throw error;\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n return (await response.json()) as T;\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new Error(`Request timeout after ${timeout ?? this.#requestTimeout}ms`);\n }\n throw error;\n }\n }\n\n async #parseError(response: Response): Promise<Error> {\n let message = `HTTP ${response.status}: ${response.statusText}`;\n\n try {\n const data = (await response.json()) as { error?: string; message?: string };\n if (data.error) {\n message = data.error;\n } else if (data.message) {\n message = data.message;\n }\n } catch {\n // Use default message\n }\n\n const error = new Error(message);\n error.name = \"LavalinkRestError\";\n return error;\n }\n\n /**\n * Load tracks from a query or URL\n */\n async loadTracks(identifier: string): Promise<LoadResult> {\n const path = `${Routes.trackLoading()}?identifier=${encodeURIComponent(identifier)}`;\n return this.#request<LoadResult>(path, { method: \"GET\" });\n }\n\n /**\n * Decode a single track\n */\n async decodeTrack(encoded: string): Promise<APITrack> {\n const path = `${Routes.trackDecoding()}?encodedTrack=${encodeURIComponent(encoded)}`;\n return this.#request<APITrack>(path, { method: \"GET\" });\n }\n\n /**\n * Decode multiple tracks\n */\n async decodeTracks(encoded: string[]): Promise<APITrack[]> {\n return this.#request<APITrack[]>(Routes.trackDecoding(true), {\n method: \"POST\",\n body: JSON.stringify(encoded),\n });\n }\n\n /**\n * Fetch all players for a session\n */\n async fetchPlayers(): Promise<APIPlayer[]> {\n if (!this.#sessionId) {\n throw new Error(\"No session ID available\");\n }\n return this.#request<APIPlayer[]>(Routes.player(this.#sessionId), { method: \"GET\" });\n }\n\n /**\n * Fetch a specific player\n */\n async fetchPlayer(guildId: string): Promise<APIPlayer> {\n if (!this.#sessionId) {\n throw new Error(\"No session ID available\");\n }\n return this.#request<APIPlayer>(Routes.player(this.#sessionId, guildId), { method: \"GET\" });\n }\n\n /**\n * Update a player\n */\n async updatePlayer(\n guildId: string,\n data: PlayerUpdateRequestBody,\n params?: PlayerUpdateQueryParams,\n ): Promise<APIPlayer> {\n if (!this.#sessionId) {\n throw new Error(\"No session ID available\");\n }\n\n let path = Routes.player(this.#sessionId, guildId);\n if (params?.noReplace) {\n path += \"?noReplace=true\";\n }\n\n return this.#request<APIPlayer>(path, {\n method: \"PATCH\",\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Destroy a player\n */\n async destroyPlayer(guildId: string): Promise<void> {\n if (!this.#sessionId) {\n throw new Error(\"No session ID available\");\n }\n return this.#request<void>(Routes.player(this.#sessionId, guildId), { method: \"DELETE\" });\n }\n\n /**\n * Update session configuration\n */\n async updateSession(data: SessionUpdateRequestBody): Promise<SessionUpdateResponseBody> {\n if (!this.#sessionId) {\n throw new Error(\"No session ID available\");\n }\n return this.#request<SessionUpdateResponseBody>(Routes.session(this.#sessionId), {\n method: \"PATCH\",\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Fetch Lavalink server info\n */\n async fetchInfo(): Promise<LavalinkInfo> {\n return this.#request<LavalinkInfo>(Routes.info(), { method: \"GET\" });\n }\n\n /**\n * Fetch node statistics\n */\n async fetchStats(): Promise<NodeStats> {\n return this.#request<NodeStats>(Routes.stats(), { method: \"GET\" });\n }\n\n /**\n * Fetch Lavalink version\n */\n async fetchVersion(): Promise<string> {\n return this.#request<string>(\"/version\", { method: \"GET\" });\n }\n\n /**\n * Fetch route planner status\n */\n async fetchRoutePlannerStatus(): Promise<RoutePlannerStatus> {\n return this.#request<RoutePlannerStatus>(Routes.routePlanner(), { method: \"GET\" });\n }\n\n /**\n * Free a specific address from the route planner\n */\n async freeRoutePlannerAddress(address: string): Promise<void> {\n return this.#request<void>(Routes.routePlanner(\"address\"), {\n method: \"POST\",\n body: JSON.stringify({ address }),\n });\n }\n\n /**\n * Free all addresses from the route planner\n */\n async freeAllRoutePlannerAddresses(): Promise<void> {\n return this.#request<void>(Routes.routePlanner(\"all\"), { method: \"POST\" });\n }\n\n /**\n * Set SponsorBlock segments for a player\n */\n async setSponsorBlock(guildId: string, segments: string[]): Promise<void> {\n if (!this.#sessionId) {\n throw new Error(\"No session ID available\");\n }\n return this.#request<void>(`${Routes.player(this.#sessionId, guildId)}/sponsorblock`, {\n method: \"PATCH\",\n body: JSON.stringify(segments),\n });\n }\n\n /**\n * Get current SponsorBlock segments for a player\n */\n async getSponsorBlock(guildId: string): Promise<string[]> {\n if (!this.#sessionId) {\n throw new Error(\"No session ID available\");\n }\n return this.#request<string[]>(`${Routes.player(this.#sessionId, guildId)}/sponsorblock`, { method: \"GET\" });\n }\n\n /**\n * Delete SponsorBlock configuration for a player\n */\n async deleteSponsorBlock(guildId: string): Promise<void> {\n if (!this.#sessionId) {\n throw new Error(\"No session ID available\");\n }\n return this.#request<void>(`${Routes.player(this.#sessionId, guildId)}/sponsorblock`, { method: \"DELETE\" });\n }\n}\n","import { EventEmitter, once } from \"node:events\";\nimport { Buffer } from \"node:buffer\";\nimport { clearTimeout, setTimeout } from \"node:timers\";\nimport { WebSocket, type ClientOptions } from \"ws\";\nimport { REST } from \"./HttpClient\";\nimport { CLIENT_NAME, CLIENT_VERSION } from \"../metadata\";\nimport { OPType } from \"../types/api/Websocket\";\nimport type {\n NodeOptions,\n NodeState,\n NodeEventMap,\n MessagePayload,\n StatsPayload,\n ClientHeaders,\n} from \"../types/lavalink\";\n\nexport enum CloseCodes {\n Normal = 1000,\n GoingAway = 1001,\n ProtocolError = 1002,\n UnsupportedData = 1003,\n NoStatusReceived = 1005,\n AbnormalClosure = 1006,\n InvalidFramePayloadData = 1007,\n PolicyViolation = 1008,\n MessageTooBig = 1009,\n InternalError = 1011,\n}\n\n/**\n * Represents a Lavalink node connection\n * Handles WebSocket connection, reconnection, and session management\n */\nexport class LavalinkNode extends EventEmitter<NodeEventMap> {\n #socketConfig: ClientOptions & { headers: ClientHeaders };\n #connectPromise: Promise<boolean> | null = null;\n #disconnectPromise: Promise<void> | null = null;\n\n #pingTimer: NodeJS.Timeout | null = null;\n #reconnectTimer: NodeJS.Timeout | null = null;\n\n #ping: number | null = null;\n #lastPingTime: number | null = null;\n\n #reconnectCycle = true;\n #reconnectAttempts = 0;\n #manualDisconnect = false;\n\n #socket: WebSocket | null = null;\n #stats: StatsPayload | null = null;\n\n #socketUrl: string;\n #pingTimeout: number;\n #reconnectDelay: number;\n #reconnectLimit: number;\n\n readonly name: string;\n readonly rest: REST;\n\n constructor(options: NodeOptions) {\n super({ captureRejections: false });\n\n // Validate options\n if (!options.name || typeof options.name !== \"string\") {\n throw new Error(\"Node name must be a non-empty string\");\n }\n\n if (!options.clientId || typeof options.clientId !== \"string\") {\n throw new Error(\"Client ID must be a non-empty string\");\n }\n\n // Initialize REST client\n this.rest = new REST(options);\n\n // Setup socket configuration\n this.#socketConfig = {\n headers: {\n \"Client-Name\": `${CLIENT_NAME}/${CLIENT_VERSION}`,\n \"User-Id\": options.clientId,\n \"User-Agent\": this.rest.userAgent,\n Authorization: options.password,\n },\n perMessageDeflate: false,\n handshakeTimeout: options.handshakeTimeout ?? 30000,\n };\n\n // Restore session if provided\n if (this.rest.sessionId) {\n this.#socketConfig.headers[\"Session-Id\"] = this.rest.sessionId;\n }\n\n // Build WebSocket URL\n const protocol = options.secure ? \"wss\" : \"ws\";\n this.#socketUrl = `${protocol}://${options.host}:${options.port}/v4/websocket`;\n\n // Configure timeouts and reconnection\n this.#pingTimeout = (options.statsInterval ?? 60000) + (options.highestLatency ?? 5000);\n this.#reconnectDelay = options.reconnectDelay ?? 5000;\n this.#reconnectLimit = options.reconnectLimit ?? -1; // -1 = infinite\n\n this.name = options.name;\n\n // Make REST sessionId readonly but linked to socket\n Object.defineProperty(this.rest, \"sessionId\", {\n configurable: false,\n get: () => this.sessionId,\n set: () => {},\n });\n\n // Make properties immutable\n const immutable: PropertyDescriptor = {\n writable: false,\n configurable: false,\n };\n\n Object.defineProperties(this, {\n name: immutable,\n rest: immutable,\n } as PropertyDescriptorMap);\n }\n\n get clientId(): string {\n return this.#socketConfig.headers[\"User-Id\"];\n }\n\n get sessionId(): string | null {\n return this.#socketConfig.headers[\"Session-Id\"] ?? null;\n }\n\n get ping(): number | null {\n return this.#ping;\n }\n\n get stats(): StatsPayload | null {\n return this.#stats;\n }\n\n get state(): NodeState {\n if (this.connecting) {\n return \"connecting\";\n }\n if (this.connected) {\n return this.ready ? \"ready\" : \"connected\";\n }\n return this.reconnecting ? \"reconnecting\" : \"disconnected\";\n }\n\n get connecting(): boolean {\n return this.#socket?.readyState === WebSocket.CONNECTING;\n }\n\n get connected(): boolean {\n return this.#socket?.readyState === WebSocket.OPEN;\n }\n\n get ready(): boolean {\n return this.connected && this.sessionId !== null;\n }\n\n get reconnecting(): boolean {\n return this.#socket === null && this.#reconnectTimer !== null;\n }\n\n get disconnected(): boolean {\n return this.#socket === null && !this.reconnecting;\n }\n\n get reconnectLimit(): number {\n return this.#reconnectLimit;\n }\n\n get reconnectAttempts(): number {\n return this.#reconnectAttempts;\n }\n\n #error(err: Error | (Error & { errors?: Error[] })): Error {\n const data = \"errors\" in err && Array.isArray(err.errors) ? err.errors[err.errors.length - 1] : err;\n const error = data instanceof Error ? data : new Error(String(data));\n error.name = `Error [${(this.constructor as { name: string }).name}]`;\n return error;\n }\n\n #cleanup(): void {\n this.#socket?.removeAllListeners();\n if (this.#pingTimer !== null) {\n clearTimeout(this.#pingTimer);\n }\n this.#socket = this.#pingTimer = this.#stats = null;\n this.#lastPingTime = this.#ping = null;\n }\n\n #reconnect(): void {\n this.#reconnectCycle = false;\n this.#reconnectTimer?.refresh();\n this.#reconnectTimer ??= setTimeout(() => {\n this.#reconnectCycle = true;\n void this.connect();\n }, this.#reconnectDelay).unref();\n }\n\n #stopReconnecting(resetCount = true, reconnectCycle = false): void {\n this.#reconnectCycle = reconnectCycle;\n if (resetCount) {\n this.#reconnectAttempts = 0;\n }\n if (this.#reconnectTimer !== null) {\n clearTimeout(this.#reconnectTimer);\n }\n this.#reconnectTimer = null;\n }\n\n #keepAliveAndPing(): void {\n this.#pingTimer?.refresh();\n this.#pingTimer ??= setTimeout(() => {\n this.#socket?.terminate();\n this.#cleanup();\n this.#reconnect();\n }, this.#pingTimeout).unref();\n\n // Record timestamp before sending ping\n this.#lastPingTime = Date.now();\n this.#socket?.ping();\n }\n\n #parseMessageData(data: string): MessagePayload | null {\n try {\n return JSON.parse(data) as MessagePayload;\n } catch {\n return null;\n }\n }\n\n /**\n * Connect to the Lavalink node\n * Handles reconnection attempts and session resumption\n */\n async connect(): Promise<boolean> {\n if (this.#socket !== null) {\n return this.#connectPromise ?? this.connected;\n }\n\n if (this.reconnecting) {\n this.#reconnectAttempts++;\n if (!this.#reconnectCycle) {\n this.#stopReconnecting(false, true);\n }\n }\n\n this.#socket = new WebSocket(this.#socketUrl, this.#socketConfig);\n\n this.#socket.once(\"open\", () => {\n this.emit(\"connect\", this.#reconnectAttempts, this.name);\n });\n\n this.#socket.on(\"message\", (data) => {\n void this.#onMessage((data as Buffer).toString(\"utf8\"));\n });\n\n this.#socket.on(\"error\", (err) => {\n this.emit(\"error\", this.#error(err), this.name);\n });\n\n this.#socket.on(\"close\", (code, reason) => {\n this.#onClose(code, reason.toString(\"utf8\"));\n });\n\n this.#socket.on(\"pong\", () => {\n if (this.#lastPingTime === null) {\n return;\n }\n this.#ping = Math.max(0, Date.now() - this.#lastPingTime);\n });\n\n let resolve!: (value: boolean) => void;\n let reject!: (reason?: unknown) => void;\n const promise = new Promise<boolean>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n const resolver = { promise, resolve, reject };\n this.#connectPromise = resolver.promise;\n const controller = new AbortController();\n\n try {\n await Promise.race([\n once(this.#socket, \"open\", { signal: controller.signal }),\n once(this.#socket, \"close\", { signal: controller.signal }),\n ]);\n } catch {\n this.#cleanup();\n } finally {\n controller.abort();\n const connected = this.connected;\n resolver.resolve(connected);\n this.#connectPromise = null;\n }\n return this.connected;\n }\n\n /**\n * Disconnect from the Lavalink node\n * @param code - WebSocket close code\n * @param reason - Disconnect reason\n */\n async disconnect(code: number = CloseCodes.Normal, reason = \"disconnected\"): Promise<void> {\n if (this.#disconnectPromise !== null) {\n return this.#disconnectPromise;\n }\n\n this.#stopReconnecting();\n\n if (this.#socket === null) {\n return;\n }\n\n if (this.connecting) {\n this.#manualDisconnect = true;\n this.#socket.terminate();\n return;\n }\n\n if (!this.connected) {\n return;\n }\n\n this.#manualDisconnect = true;\n this.#disconnectPromise = once(this.#socket, \"close\").then(\n () => {},\n () => {},\n );\n this.#socket.close(code, reason);\n await this.#disconnectPromise;\n this.#disconnectPromise = null;\n }\n\n async #onMessage(data: string): Promise<void> {\n const payload = this.#parseMessageData(data);\n if (payload === null) {\n return this.disconnect(CloseCodes.UnsupportedData, \"expected json payload\");\n }\n\n if (payload.op === OPType.Stats) {\n this.#stats = payload;\n this.#keepAliveAndPing();\n } else if (payload.op === OPType.Ready) {\n this.#stopReconnecting();\n this.#socketConfig.headers[\"Session-Id\"] = payload.sessionId;\n this.emit(\"ready\", payload.resumed, payload.sessionId, this.name);\n }\n\n this.emit(\"dispatch\", payload, this.name);\n }\n\n #onClose(code: number, reason: string): void {\n this.#cleanup();\n\n // Check if we should stop reconnecting\n const shouldStop =\n this.#manualDisconnect || (this.#reconnectLimit >= 0 && this.#reconnectAttempts >= this.#reconnectLimit);\n\n if (shouldStop) {\n this.#stopReconnecting();\n delete this.#socketConfig.headers[\"Session-Id\"];\n const byLocal = this.#manualDisconnect;\n this.#manualDisconnect = false;\n this.emit(\"disconnect\", code, reason, byLocal, this.name);\n return;\n }\n\n if (this.#reconnectCycle) {\n this.#reconnect();\n this.emit(\"close\", code, reason, this.name);\n return;\n }\n\n // Immediate reconnect attempt\n setTimeout(() => {\n this.#reconnectCycle = true;\n void this.connect();\n }, 0);\n }\n\n /**\n * Set SponsorBlock segments for a player\n */\n async setSponsorBlock(player: { guildId: string }, segments: string[]): Promise<void> {\n return this.rest.setSponsorBlock(player.guildId, segments);\n }\n\n /**\n * Get current SponsorBlock segments for a player\n */\n async getSponsorBlock(player: { guildId: string }): Promise<string[]> {\n return this.rest.getSponsorBlock(player.guildId);\n }\n\n /**\n * Delete SponsorBlock configuration for a player\n */\n async deleteSponsorBlock(player: { guildId: string }): Promise<void> {\n return this.rest.deleteSponsorBlock(player.guildId);\n }\n\n override toString(): string {\n return this.name;\n }\n}\n\nexport { LavalinkNode as Node };\n","import { EventEmitter } from \"node:events\";\nimport { LavalinkNode } from \"./LavalinkConnection\";\nimport type { Player } from \"../core/RyanlinkPlayer\";\nimport type { NodeOptions, NodeManagerEvents, LavalinkInfo } from \"../types/lavalink\";\n\n/**\n * Node metrics for selection and monitoring\n */\nexport interface NodeMetrics {\n /** Total number of nodes */\n total: number;\n /** Number of connected nodes */\n connected: number;\n /** Number of ready nodes */\n ready: number;\n /** Number of reconnecting nodes */\n reconnecting: number;\n /** Total players across all nodes */\n players: number;\n /** Total playing players across all nodes */\n playingPlayers: number;\n}\n\n/**\n * Manages all Lavalink nodes\n * Handles node creation, connection, and selection\n */\nexport class NodeManager extends EventEmitter<NodeManagerEvents> {\n #player: Player;\n #nodes = new Map<string, LavalinkNode>();\n\n readonly info = new Map<string, LavalinkInfo>(); // LavalinkInfo cache\n\n constructor(player: Player) {\n super({ captureRejections: false });\n this.#player = player;\n\n const immutable: PropertyDescriptor = {\n writable: false,\n configurable: false,\n };\n\n Object.defineProperties(this, {\n info: immutable,\n });\n }\n\n /**\n * Get a node by name\n */\n get(name: string): LavalinkNode | undefined {\n return this.#nodes.get(name);\n }\n\n /**\n * Check if a node exists\n */\n has(name: string): boolean {\n return this.#nodes.has(name);\n }\n\n /**\n * Get all nodes\n */\n get all(): LavalinkNode[] {\n return Array.from(this.#nodes.values());\n }\n\n /**\n * Get number of nodes\n */\n get size(): number {\n return this.#nodes.size;\n }\n\n /**\n * Create a new node\n */\n create(options: NodeOptions): LavalinkNode {\n if (this.#nodes.has(options.name)) {\n throw new Error(`Node '${options.name}' already exists`);\n }\n\n const node = new LavalinkNode({\n ...options,\n clientId: this.#player.clientId ?? \"\",\n });\n\n // Forward node events\n node.on(\"connect\", (_attempts, _name) => {\n this.emit(\"connect\", node);\n });\n\n node.on(\"ready\", (resumed, sessionId, _name) => {\n this.emit(\"ready\", node, resumed, sessionId);\n\n // Fetch node info on first ready (not on resume)\n if (!this.info.has(node.name)) {\n this.fetchInfo(node.name).catch(() => {});\n }\n\n if (resumed) {\n void this.#handleResumed(node);\n }\n });\n\n node.on(\"disconnect\", (code, reason, _byLocal, _name) => {\n this.emit(\"disconnect\", node, { code, reason });\n });\n\n node.on(\"close\", (_code, _reason, _name) => {\n // Node is reconnecting\n this.emit(\"reconnecting\", node);\n });\n\n node.on(\"error\", (error, _name) => {\n this.emit(\"error\", node, error);\n });\n\n node.on(\"dispatch\", (payload, _name) => {\n this.emit(\"raw\", node, payload);\n });\n\n this.#nodes.set(options.name, node);\n this.emit(\"create\", node);\n\n return node;\n }\n\n /**\n * Delete a node\n */\n async delete(name: string): Promise<boolean> {\n const node = this.#nodes.get(name);\n if (!node) {\n return false;\n }\n\n // Check if node has active queues\n const activeQueues = this.#player.queues.all.filter((q) => q.node?.name === name);\n if (activeQueues.length > 0) {\n throw new Error(`Cannot delete node '${name}' with ${activeQueues.length} active queue(s)`);\n }\n\n await node.disconnect();\n this.#nodes.delete(name);\n this.info.delete(name);\n this.emit(\"destroy\", node);\n\n return true;\n }\n\n /**\n * Connect all nodes\n */\n async connect(): Promise<void> {\n const promises = Array.from(this.#nodes.values()).map((node) => node.connect());\n await Promise.allSettled(promises);\n }\n\n /**\n * Disconnect all nodes\n */\n async disconnect(): Promise<void> {\n const promises = Array.from(this.#nodes.values()).map((node) => node.disconnect());\n await Promise.allSettled(promises);\n }\n\n /**\n * Get relevant nodes sorted by load and availability\n * Returns nodes that are ready and have lowest load\n */\n relevant(): LavalinkNode[] {\n const readyNodes = Array.from(this.#nodes.values()).filter((node) => node.ready);\n\n if (readyNodes.length === 0) {\n return [];\n }\n\n // Sort by load (players, CPU, memory)\n return readyNodes.sort((a, b) => {\n const aStats = a.stats;\n const bStats = b.stats;\n\n if (!aStats) {\n return 1;\n }\n if (!bStats) {\n return -1;\n }\n\n // Compare by playing players first\n const aLoad = aStats.playingPlayers / (aStats.players || 1);\n const bLoad = bStats.playingPlayers / (bStats.players || 1);\n\n if (aLoad !== bLoad) {\n return aLoad - bLoad;\n }\n\n // Then by CPU load\n const aCpu = aStats.cpu.lavalinkLoad;\n const bCpu = bStats.cpu.lavalinkLoad;\n\n if (aCpu !== bCpu) {\n return aCpu - bCpu;\n }\n\n // Finally by memory usage\n const aMemory = aStats.memory.used / aStats.memory.allocated;\n const bMemory = bStats.memory.used / bStats.memory.allocated;\n\n return aMemory - bMemory;\n });\n }\n\n /**\n * Get node metrics\n */\n get metrics(): NodeMetrics {\n const nodes = Array.from(this.#nodes.values());\n\n return {\n total: nodes.length,\n connected: nodes.filter((n) => n.connected).length,\n ready: nodes.filter((n) => n.ready).length,\n reconnecting: nodes.filter((n) => n.reconnecting).length,\n players: nodes.reduce((sum, n) => sum + (n.stats?.players ?? 0), 0),\n playingPlayers: nodes.reduce((sum, n) => sum + (n.stats?.playingPlayers ?? 0), 0),\n };\n }\n\n /**\n * Get all node names\n */\n keys(): IterableIterator<string> {\n return this.#nodes.keys();\n }\n\n /**\n * Get all nodes\n */\n values(): IterableIterator<LavalinkNode> {\n return this.#nodes.values();\n }\n\n /**\n * Get all entries\n */\n entries(): IterableIterator<[string, LavalinkNode]> {\n return this.#nodes.entries();\n }\n\n /**\n * Fetch and cache node info\n * @param name Node name\n */\n async fetchInfo(name: string): Promise<LavalinkInfo> {\n if (this.info.has(name)) {\n return this.info.get(name) as LavalinkInfo;\n }\n\n const node = this.#nodes.get(name);\n if (!node) {\n throw new Error(`Node '${name}' not found`);\n }\n\n const info = await node.rest.fetchInfo();\n this.info.set(name, info);\n return info;\n }\n\n /**\n * Check if a feature is supported by a node\n * @param type Feature type (filter, source, plugin)\n * @param value Feature value (name)\n * @param nodeName Optional node name (checks all if not specified)\n */\n supports(type: \"filter\" | \"source\" | \"plugin\", value: string, nodeName?: string): boolean {\n if (nodeName) {\n const node = this.#nodes.get(nodeName);\n if (!node) {\n return false;\n }\n return this.#checkNodeSupport(node.name, type, value);\n }\n\n // Check if any node supports it\n return Array.from(this.#nodes.values()).some((node) => this.#checkNodeSupport(node.name, type, value));\n }\n\n /**\n * Check if a specific node supports a feature\n */\n #checkNodeSupport(nodeName: string, type: \"filter\" | \"source\" | \"plugin\", value: string): boolean {\n const info = this.info.get(nodeName);\n if (!info) {\n return false;\n }\n\n switch (type) {\n case \"filter\":\n return info.filters?.includes(value) ?? false;\n case \"source\":\n return info.sourceManagers?.includes(value) ?? false;\n case \"plugin\":\n return info.plugins?.some((p: { name: string }) => p.name === value) ?? false;\n default:\n return false;\n }\n }\n\n /**\n * Handle node resumption\n * Sync all queues when a node resumes\n */\n async #handleResumed(node: LavalinkNode): Promise<void> {\n try {\n // Sync queues if autoSync is enabled\n if (this.#player.options.autoSync) {\n await this.#player.queues.syncAll();\n }\n } catch (error) {\n this.emit(\"error\", node, error as Error);\n }\n }\n}\n","import { LookupSymbol } from \"../config/symbols\";\nimport { noop } from \"../utils\";\nimport type { APIPlayer, BotVoiceState, PlayerUpdateRequestBody } from \"../types\";\nimport type { Node } from \"../lavalink/LavalinkConnection\";\nimport type { Player } from \"../core/RyanlinkPlayer\";\n\n/**\n * Represents the voice connection state for a guild\n * Manages voice connection, node changes, and player state\n */\nexport class VoiceState {\n #changePromise: Promise<void> | null = null;\n #node: Node;\n\n #state: BotVoiceState;\n #player: APIPlayer;\n\n readonly guildId: string;\n readonly player: Player;\n\n constructor(player: Player, node: string, guildId: string) {\n if (player.voices.has(guildId)) {\n throw new Error(\"An identical voice state already exists\");\n }\n\n const _node = player.nodes.get(node);\n if (!_node) {\n throw new Error(`Node '${node}' not found`);\n }\n if (!_node.ready) {\n throw new Error(`Node '${node}' not ready`);\n }\n\n const state = player.voices[LookupSymbol](guildId);\n if (!state) {\n throw new Error(`No connection found for guild '${guildId}'`);\n }\n\n const _player = player.queues[LookupSymbol](guildId);\n if (!_player) {\n throw new Error(`No player found for guild '${guildId}'`);\n }\n\n this.#node = _node;\n this.#state = state;\n this.#player = _player;\n\n this.guildId = guildId;\n this.player = player;\n\n // Make properties immutable\n const immutable: PropertyDescriptor = {\n writable: false,\n configurable: false,\n };\n\n Object.defineProperties(this, {\n guildId: immutable,\n player: { ...immutable, enumerable: false },\n } as PropertyDescriptorMap);\n }\n\n /**\n * Current node for this voice connection\n */\n get node(): Node {\n return this.#node;\n }\n\n /**\n * Ping to the voice server in milliseconds\n */\n get ping(): number {\n return this.#player.state.ping;\n }\n\n /**\n * Voice region ID (e.g., \"us-west\", \"eu-central\")\n */\n get regionId(): string | null {\n return this.#state.region_id;\n }\n\n /**\n * Voice channel ID\n */\n get channelId(): string {\n return this.#state.channel_id;\n }\n\n /**\n * Whether the bot is self-deafened\n */\n get selfDeaf(): boolean {\n return this.#state.self_deaf;\n }\n\n /**\n * Whether the bot is self-muted\n */\n get selfMute(): boolean {\n return this.#state.self_mute;\n }\n\n /**\n * Whether the bot is server-deafened\n */\n get serverDeaf(): boolean {\n return this.#state.deaf;\n }\n\n /**\n * Whether the bot is server-muted\n */\n get serverMute(): boolean {\n return this.#state.mute;\n }\n\n /**\n * Whether the bot is suppressed (priority speaker)\n */\n get suppressed(): boolean {\n return this.#state.suppress;\n }\n\n /**\n * Whether this voice state has been destroyed\n */\n get destroyed(): boolean {\n return this.player.voices.get(this.guildId) !== this;\n }\n\n /**\n * Whether the voice connection is fully connected\n */\n get connected(): boolean {\n if (!this.#player.state.connected) {\n return false;\n }\n return this.#state.connected && this.#state.node_session_id === this.#node.sessionId;\n }\n\n /**\n * Whether the voice connection is reconnecting\n */\n get reconnecting(): boolean {\n return this.#state.reconnecting;\n }\n\n /**\n * Whether the voice connection is disconnected\n */\n get disconnected(): boolean {\n return !this.connected && !this.reconnecting;\n }\n\n /**\n * Whether the voice connection is changing nodes\n */\n get changingNode(): boolean {\n return this.#changePromise !== null;\n }\n\n /**\n * Session ID for the voice connection\n */\n get sessionId(): string | null {\n return this.#state.session_id;\n }\n\n /**\n * Voice server token\n */\n get token(): string | null {\n return this.#state.token;\n }\n\n /**\n * Voice server endpoint\n */\n get endpoint(): string | null {\n return this.#state.endpoint;\n }\n\n /**\n * Node session ID this voice state is connected to\n */\n get nodeSessionId(): string | null {\n return this.#state.node_session_id;\n }\n\n /**\n * Destroy this voice connection\n * @param reason Optional reason for destruction\n */\n async destroy(reason?: string): Promise<void> {\n return this.player.voices.destroy(this.guildId, reason);\n }\n\n /**\n * Connect to a voice channel\n * @param channelId Voice channel ID (defaults to current channel)\n */\n async connect(channelId = this.#state.channel_id): Promise<void> {\n await this.player.voices.connect(this.guildId, channelId);\n }\n\n /**\n * Disconnect from the voice channel\n */\n async disconnect(): Promise<void> {\n return this.player.voices.disconnect(this.guildId);\n }\n\n /**\n * Change to a different Lavalink node\n * Preserves playback state and filters\n * @param name Name of the node to change to\n */\n async changeNode(name: string): Promise<void> {\n const node = this.player.nodes.get(name);\n\n if (!node) {\n throw new Error(`Node '${name}' not found`);\n }\n if (!node.ready) {\n throw new Error(`Node '${name}' not ready`);\n }\n\n if (this.#changePromise !== null) {\n return this.#changePromise;\n }\n if (name === this.#node.name) {\n throw new Error(`Already on node '${name}'`);\n }\n\n let resolve!: () => void;\n let reject!: (reason?: unknown) => void;\n const promise = new Promise<void>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n const resolver = { promise, resolve, reject };\n this.#changePromise = resolver.promise;\n\n // Prepare player update request\n const request: PlayerUpdateRequestBody = {\n voice: {\n channelId: this.#state.channel_id,\n endpoint: this.#state.endpoint,\n sessionId: this.#state.session_id,\n token: this.#state.token,\n },\n filters: this.#player.filters,\n paused: this.#player.paused,\n volume: this.#player.volume,\n };\n\n const track = this.#player.track;\n const wasPlaying = !this.#player.paused && track !== null;\n\n // Only transfer track if the new node supports the source\n if (wasPlaying && this.player.nodes.supports(\"source\", track.info.sourceName, node.name)) {\n request.track = { encoded: track.encoded, userData: track.userData };\n request.position = this.#player.state.position;\n }\n\n // Destroy player on old node\n await this.#node.rest.destroyPlayer(this.guildId).catch(noop);\n\n const previousNode = this.#node;\n this.#node = node;\n\n try {\n // Create player on new node\n const player = await node.rest.updatePlayer(this.guildId, request);\n this.#state.node_session_id = node.sessionId ?? \"\";\n Object.assign(this.#player, player);\n\n // Emit voice change event\n this.player.emit(\"voiceChange\", this, previousNode, wasPlaying);\n resolver.resolve();\n } catch (err) {\n resolver.reject(err);\n throw err;\n } finally {\n this.#changePromise = null;\n }\n }\n\n /**\n * String representation of the voice state\n */\n toString(): string {\n return `VoiceState<${this.guildId}>`;\n }\n}\n","import { OnPingUpdateSymbol } from \"../config/symbols\";\nimport type { PlayerState } from \"../types\";\nimport type { Player } from \"../core/RyanlinkPlayer\";\n\n/**\n * Voice node ping statistics\n */\ninterface VoiceNodePingStats {\n /**\n * History of ping measurements (up to 5 samples)\n */\n history: number[];\n\n /**\n * Timestamp of last ping measurement\n */\n lastPingTime: number;\n}\n\n/**\n * Represents a voice region with node ping tracking\n * Used for latency-based node selection\n */\nexport class VoiceRegion {\n #pings = new Map<string, VoiceNodePingStats>();\n\n readonly id: string;\n readonly player: Player;\n\n constructor(player: Player, regionId: string) {\n if (player.voices.regions.has(regionId)) {\n throw new Error(\"An identical voice region already exists\");\n }\n\n this.id = regionId;\n this.player = player;\n\n // Make properties immutable\n const immutable: PropertyDescriptor = {\n writable: false,\n configurable: false,\n };\n\n Object.defineProperties(this, {\n id: immutable,\n player: { ...immutable, enumerable: false },\n } as PropertyDescriptorMap);\n }\n\n /**\n * Check if all ready nodes have ping data for this region\n * @returns `true` if all nodes are synced, `false` otherwise\n */\n inSync(): boolean {\n return !Array.from(this.player.nodes.values()).some((n) => n.ready && !this.#pings.has(n.name));\n }\n\n /**\n * Remove ping data for a node\n * @param name Node name\n * @returns `true` if data was removed, `false` if it didn't exist\n */\n forgetNode(name: string): boolean {\n return this.#pings.delete(name);\n }\n\n /**\n * Get the average ping for a node in this region\n * @param name Node name\n * @returns Average ping in milliseconds, or `null` if no data\n */\n getAveragePing(name: string): number | null {\n const pings = this.#pings.get(name)?.history;\n if (!pings?.length) {\n return null;\n }\n\n return Math.round(pings.reduce((total, current) => total + current, 0) / pings.length);\n }\n\n /**\n * Get all nodes with their average pings\n * @returns Array of [nodeName, averagePing] tuples\n */\n getAllPings(): Array<[string, number | null]> {\n return Array.from(this.player.nodes.values()).map((node) => [node.name, this.getAveragePing(node.name)]);\n }\n\n /**\n * Get the most relevant node for this region\n * Selects based on lowest average ping\n * @returns The node with lowest ping, or first relevant node if no ping data\n */\n getRelevantNode() {\n return this.player.nodes.relevant().sort((a, b) => {\n const pingA = this.getAveragePing(a.name) ?? Number.MAX_SAFE_INTEGER;\n const pingB = this.getAveragePing(b.name) ?? Number.MAX_SAFE_INTEGER;\n return pingA - pingB;\n })[0];\n }\n\n /**\n * Internal method to update ping statistics\n * Called by the voice manager when player state updates\n * @param name Node name\n * @param state Player state with ping information\n * @internal\n */\n [OnPingUpdateSymbol](name: string, state: PlayerState): void {\n // Only process if connected and has valid ping data\n if (!state.connected) {\n return;\n }\n if (state.ping <= 0 || state.time <= 0) {\n return;\n }\n\n const pings = this.#pings.get(name);\n\n // Initialize ping tracking for this node\n if (!pings) {\n this.#pings.set(name, {\n history: [state.ping],\n lastPingTime: state.time,\n });\n return;\n }\n\n // Only update if enough time has passed (12 seconds)\n if (state.time - pings.lastPingTime < 12_000) {\n return;\n }\n\n pings.lastPingTime = state.time;\n pings.history.push(state.ping);\n\n // Keep only last 5 samples\n if (pings.history.length > 5) {\n pings.history.shift();\n }\n }\n\n /**\n * Clear all ping data for this region\n */\n clear(): void {\n this.#pings.clear();\n }\n\n /**\n * Get the number of nodes with ping data\n */\n get nodeCount(): number {\n return this.#pings.size;\n }\n\n /**\n * String representation of the voice region\n */\n toString(): string {\n return `VoiceRegion<${this.id}>`;\n }\n\n /**\n * JSON representation of the voice region\n */\n toJSON(): {\n id: string;\n inSync: boolean;\n nodeCount: number;\n pings: Array<{ node: string; averagePing: number | null; samples: number }>;\n } {\n return {\n id: this.id,\n inSync: this.inSync(),\n nodeCount: this.nodeCount,\n pings: Array.from(this.#pings.entries()).map(([node, stats]) => ({\n node,\n averagePing: this.getAveragePing(node),\n samples: stats.history.length,\n })),\n };\n }\n}\n","import { setTimeout } from \"node:timers/promises\";\nimport { SnowflakeRegex, VoiceRegionIdRegex } from \"../config\";\nimport { LookupSymbol, OnVoiceCloseSymbol, UpdateSymbol } from \"../config/symbols\";\nimport { isString, noop } from \"../utils\";\nimport { VoiceRegion } from \"./RegionSelector\";\nimport { VoiceState } from \"./VoiceSession\";\nimport {\n VoiceCloseCodes,\n type BotReadyPayload,\n type BotVoiceState,\n type ConnectOptions,\n type CreateQueueOptions,\n type DiscordDispatchPayload,\n type VoiceServerUpdatePayload,\n type VoiceStateUpdatePayload,\n} from \"../types\";\nimport type { Player } from \"../core/RyanlinkPlayer\";\n\n/**\n * Join request with promise resolvers\n */\ninterface JoinRequest extends Pick<CreateQueueOptions, \"context\" | \"node\" | \"voiceId\"> {\n promise: Promise<VoiceState>;\n resolve: (value: VoiceState | PromiseLike<VoiceState>) => void;\n reject: (reason?: unknown) => void;\n config?: Pick<CreateQueueOptions, \"filters\" | \"volume\">;\n}\n\n/**\n * Manages voice connections for all guilds\n * Handles Discord voice events and Lavalink voice state\n */\nexport class VoiceManager implements Partial<Map<string, VoiceState>> {\n #cache = new Map<string, BotVoiceState>();\n #voices = new Map<string, VoiceState>();\n\n #joins = new Map<string, JoinRequest>();\n #destroys = new Map<string, Promise<void>>();\n\n readonly regions = new Map<string, VoiceRegion>();\n readonly player: Player;\n\n constructor(player: Player) {\n if (player.voices === undefined) {\n this.player = player;\n } else {\n throw new Error(\"Manager already exists for this Player\");\n }\n\n const immutable: PropertyDescriptor = {\n writable: false,\n configurable: false,\n };\n\n Object.defineProperties(this, {\n regions: immutable,\n player: { ...immutable, enumerable: false },\n } as PropertyDescriptorMap);\n }\n\n /**\n * Number of voice connections\n */\n get size(): number {\n return this.#voices.size;\n }\n\n /**\n * Get voice state for a guild\n */\n get(guildId: string): VoiceState | undefined {\n return this.#voices.get(guildId);\n }\n\n /**\n * Check if voice state exists\n */\n has(guildId: string): boolean {\n return this.#voices.has(guildId);\n }\n\n /**\n * Get all connected guild IDs\n */\n keys() {\n return this.#voices.keys();\n }\n\n /**\n * Get all voice connections\n */\n values() {\n return this.#voices.values();\n }\n\n /**\n * Get all voice connections as entries\n */\n entries() {\n return this.#voices.entries();\n }\n\n /**\n * Destroy a voice connection\n * @param guildId Guild ID\n * @param reason Reason for destruction\n */\n async destroy(guildId: string, reason = \"destroyed\"): Promise<void> {\n if (this.player.queues.has(guildId)) {\n return this.player.queues.destroy(guildId, reason);\n }\n if (this.#destroys.has(guildId)) {\n return this.#destroys.get(guildId) ?? Promise.resolve();\n }\n\n const voice = this.#voices.get(guildId);\n if (!voice) {\n return;\n }\n\n let resolve!: () => void;\n let reject!: (reason?: unknown) => void;\n const promise = new Promise<void>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n const resolver = { promise, resolve, reject };\n this.#destroys.set(guildId, resolver.promise);\n\n if (this[LookupSymbol](guildId)?.connected) {\n await voice.disconnect().catch(noop);\n }\n\n this.#cache.delete(guildId);\n this.#voices.delete(guildId);\n\n this.player.emit(\"voiceDestroy\", voice, reason);\n\n resolver.resolve();\n this.#destroys.delete(guildId);\n }\n\n /**\n * Connect to a voice channel\n * @param guildId Guild ID\n * @param voiceId Voice channel ID\n * @param options Connection options\n */\n async connect(guildId: string, voiceId: string, options?: ConnectOptions): Promise<VoiceState> {\n if (!isString(guildId, SnowflakeRegex)) {\n throw new Error(\"Guild Id is not a valid Discord Id\");\n }\n if (!isString(voiceId, SnowflakeRegex)) {\n throw new Error(\"Voice Id is not a valid Discord Id\");\n }\n\n const currentRequest = this.#joins.get(guildId);\n if (currentRequest) {\n if (currentRequest.voiceId === voiceId) {\n return currentRequest.promise;\n }\n currentRequest.reject(new Error(\"Connection request was replaced\"));\n }\n this.#joins.delete(guildId);\n\n let resolve!: (value: VoiceState | PromiseLike<VoiceState>) => void;\n let reject!: (reason?: unknown) => void;\n const promise = new Promise<VoiceState>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n const request: JoinRequest = {\n promise,\n resolve,\n reject,\n voiceId,\n node: options?.node,\n context: options?.context,\n config: options ? { filters: options.filters, volume: options.volume } : undefined,\n };\n\n this.#joins.set(guildId, request);\n\n // Send voice state update to Discord\n await this.player.options.forwardVoiceUpdate(guildId, {\n op: 4,\n d: {\n guild_id: guildId,\n channel_id: voiceId,\n self_deaf: false,\n self_mute: false,\n },\n });\n\n // Wait for voice connection with timeout\n const timeout = setTimeout(15_000, undefined, { ref: false });\n const result = await Promise.race([request.promise, timeout]);\n\n if (result === undefined) {\n this.#joins.delete(guildId);\n throw new Error(\"Voice connection timed out\");\n }\n\n return result;\n }\n\n /**\n * Disconnect from voice channel\n * @param guildId Guild ID\n */\n async disconnect(guildId: string): Promise<void> {\n const state = this.#cache.get(guildId);\n if (!state) {\n return;\n }\n\n await this.player.options.forwardVoiceUpdate(guildId, {\n op: 4,\n d: {\n guild_id: guildId,\n channel_id: null,\n self_deaf: false,\n self_mute: false,\n },\n });\n\n state.channel_id = \"\";\n state.connected = false;\n }\n\n /**\n * Handle Discord dispatch events\n * @param payload Discord gateway payload\n */\n handleDispatch(payload: DiscordDispatchPayload): void {\n if (payload.t === \"READY\") {\n this.#handleReady(payload);\n } else if (payload.t === \"VOICE_STATE_UPDATE\") {\n this.#handleVoiceStateUpdate(payload);\n } else if (payload.t === \"VOICE_SERVER_UPDATE\") {\n this.#handleVoiceServerUpdate(payload);\n }\n }\n\n /**\n * Internal lookup for voice state\n * @internal\n */\n [LookupSymbol](guildId: string): BotVoiceState | undefined {\n return this.#cache.get(guildId);\n }\n\n /**\n * Internal update for voice state\n * @internal\n */\n [UpdateSymbol](guildId: string, partial: Partial<BotVoiceState>): void {\n const state = this.#cache.get(guildId);\n if (state) {\n Object.assign(state, partial);\n }\n }\n\n /**\n * Internal voice close handler\n * @internal\n */\n [OnVoiceCloseSymbol](guildId: string, code: number, reason: string, byRemote: boolean): void {\n const voice = this.#voices.get(guildId);\n if (!voice) {\n return;\n }\n\n this.player.emit(\"voiceClose\", voice, code, reason, byRemote);\n\n // Check if we should destroy the connection\n const shouldDestroy =\n (code as VoiceCloseCodes) === VoiceCloseCodes.Disconnected ||\n (code as VoiceCloseCodes) === VoiceCloseCodes.DisconnectedRateLimited ||\n (code as VoiceCloseCodes) === VoiceCloseCodes.DisconnectedCallTerminated;\n\n if (shouldDestroy) {\n this.destroy(guildId, `Voice closed: ${reason} (${code})`).catch(noop);\n }\n }\n\n /**\n * Handle READY event\n */\n #handleReady(_payload: BotReadyPayload): void {\n // Clear all voice states on ready\n this.#cache.clear();\n this.#voices.clear();\n this.#joins.clear();\n }\n\n /**\n * Handle VOICE_STATE_UPDATE event\n */\n #handleVoiceStateUpdate(payload: VoiceStateUpdatePayload): void {\n const { d: data } = payload;\n const guildId = data.guild_id;\n\n if (!guildId || data.user_id !== this.player.clientId) {\n return;\n }\n\n let state = this.#cache.get(guildId);\n\n // User left voice channel\n if (data.channel_id === null) {\n if (state) {\n state.channel_id = \"\";\n state.connected = false;\n }\n return;\n }\n\n // Create or update state\n if (!state) {\n state = {\n channel_id: data.channel_id,\n session_id: data.session_id,\n deaf: data.deaf,\n mute: data.mute,\n self_deaf: data.self_deaf,\n self_mute: data.self_mute,\n suppress: data.suppress,\n token: \"\",\n endpoint: \"\",\n connected: false,\n node_session_id: \"\",\n reconnecting: false,\n region_id: \"\",\n };\n this.#cache.set(guildId, state);\n } else {\n state.channel_id = data.channel_id;\n state.session_id = data.session_id;\n state.deaf = data.deaf;\n state.mute = data.mute;\n state.self_deaf = data.self_deaf;\n state.self_mute = data.self_mute;\n state.suppress = data.suppress;\n }\n\n void this.#tryConnect(guildId);\n }\n\n /**\n * Handle VOICE_SERVER_UPDATE event\n */\n #handleVoiceServerUpdate(payload: VoiceServerUpdatePayload): void {\n const { d: data } = payload;\n const guildId = data.guild_id;\n\n let state = this.#cache.get(guildId);\n\n if (!state) {\n state = {\n channel_id: \"\",\n session_id: \"\",\n deaf: false,\n mute: false,\n self_deaf: false,\n self_mute: false,\n suppress: false,\n token: data.token,\n endpoint: data.endpoint ?? \"\",\n connected: false,\n node_session_id: \"\",\n reconnecting: false,\n region_id: \"\",\n };\n this.#cache.set(guildId, state);\n } else {\n state.token = data.token;\n state.endpoint = data.endpoint ?? \"\";\n }\n\n // Extract region from endpoint\n if (state.endpoint) {\n const match = state.endpoint.match(VoiceRegionIdRegex);\n if (match?.[1]) {\n state.region_id = match[1];\n\n // Create or get voice region\n if (!this.regions.has(state.region_id)) {\n this.regions.set(state.region_id, new VoiceRegion(this.player, state.region_id));\n }\n }\n }\n\n void this.#tryConnect(guildId);\n }\n\n /**\n * Try to establish voice connection\n */\n async #tryConnect(guildId: string): Promise<void> {\n const state = this.#cache.get(guildId);\n const request = this.#joins.get(guildId);\n\n if (!state || !request) {\n return;\n }\n\n // Check if we have all required data\n if (!state.channel_id || !state.session_id || !state.token || !state.endpoint) {\n return;\n }\n\n this.#joins.delete(guildId);\n\n try {\n // Select node\n const nodeName =\n request.node ??\n (state.region_id && this.regions.get(state.region_id)?.getRelevantNode()?.name) ??\n this.player.nodes.relevant()[0]?.name;\n\n if (!nodeName) {\n throw new Error(\"No nodes available\");\n }\n\n // Create queue if needed\n let queue = this.player.queues.get(guildId);\n if (!queue) {\n queue = await this.player.queues.create({\n guildId,\n voiceId: state.channel_id,\n node: nodeName,\n context: request.context,\n ...request.config,\n });\n }\n\n // Create voice state\n const voice = new VoiceState(this.player, nodeName, guildId);\n this.#voices.set(guildId, voice);\n\n state.connected = true;\n state.node_session_id = voice.node.sessionId ?? \"\";\n\n this.player.emit(\"voiceConnect\", voice);\n request.resolve(voice);\n } catch (error) {\n request.reject(error instanceof Error ? error : new Error(String(error)));\n }\n }\n}\n","import { formatDuration, isNumber, isRecord, isString } from \"../utils\";\nimport type { APITrack, CommonPluginInfo, CommonUserData, JsonObject } from \"../types\";\n\n/**\n * Represents a music track with metadata and playback information\n */\nexport class Track<UserData extends JsonObject = CommonUserData, PluginInfo extends JsonObject = CommonPluginInfo> {\n /**\n * Unique identifier of the track\n */\n id: string;\n\n /**\n * Title of the track\n */\n title = \"Unknown Track\";\n\n /**\n * Author/artist of the track\n */\n author = \"Unknown Author\";\n\n /**\n * Whether the track is a live stream\n */\n isLive = false;\n\n /**\n * Whether the track is seekable\n */\n isSeekable = false;\n\n /**\n * Duration of the track in milliseconds\n */\n duration = 0;\n\n /**\n * Formatted duration string (hh:mm:ss or mm:ss)\n */\n formattedDuration = \"00:00\";\n\n /**\n * Uniform Resource Identifier of the track\n */\n uri: string | null = null;\n\n /**\n * International Standard Recording Code\n */\n isrc: string | null = null;\n\n /**\n * URL of the track (validated URI)\n */\n url: string | null = null;\n\n /**\n * Artwork/thumbnail URL\n */\n artworkUrl: string | null = null;\n\n /**\n * Custom user data attached to the track\n */\n userData = {} as UserData;\n\n /**\n * Additional info from plugins\n */\n pluginInfo = {} as PluginInfo;\n\n /**\n * Encoded string representation (Lavalink format)\n */\n encoded: string;\n\n /**\n * Source name (youtube, spotify, soundcloud, etc.)\n */\n sourceName = \"unknown\";\n\n get identifier(): string {\n return this.id;\n }\n\n get stream(): boolean {\n return this.isLive;\n }\n\n get seekable(): boolean {\n return this.isSeekable;\n }\n\n get durationFormatted(): string {\n return this.formattedDuration;\n }\n\n get source(): string {\n return this.sourceName;\n }\n\n get thumbnail(): string | null {\n return this.artworkUrl;\n }\n\n get info() {\n return {\n identifier: this.id,\n position: 0,\n title: this.title,\n author: this.author,\n length: this.duration,\n isStream: this.isLive,\n isSeekable: this.isSeekable,\n uri: this.uri,\n isrc: this.isrc,\n artworkUrl: this.artworkUrl,\n sourceName: this.sourceName,\n };\n }\n\n constructor(data: APITrack<UserData, PluginInfo>) {\n if (!isRecord(data)) {\n throw new Error(\"Track data must be an object\");\n }\n if (!isRecord(data.info)) {\n throw new Error(\"Track info is not an object\");\n }\n\n // Validate and set identifier\n if (isString(data.info.identifier, \"non-empty\")) {\n this.id = data.info.identifier;\n } else {\n throw new Error(\"Track does not have an identifier\");\n }\n\n // Validate and set encoded data\n if (isString(data.encoded, \"non-empty\")) {\n this.encoded = data.encoded;\n } else {\n throw new Error(\"Track does not have an encoded data string\");\n }\n\n // Set title and author\n if (isString(data.info.title, \"non-empty\")) {\n this.title = data.info.title;\n }\n if (isString(data.info.author, \"non-empty\")) {\n this.author = data.info.author;\n }\n\n // Set stream and seekable flags\n if (data.info.isStream) {\n this.isLive = true;\n }\n if (data.info.isSeekable) {\n this.isSeekable = true;\n }\n\n // Set duration\n if (this.isLive) {\n this.duration = Number.POSITIVE_INFINITY;\n this.formattedDuration = \"Live\";\n } else if (isNumber(data.info.length, \"whole\")) {\n this.duration = data.info.length;\n this.formattedDuration = formatDuration(this.duration);\n }\n\n // Set URIs\n if (isString(data.info.uri, \"non-empty\")) {\n this.uri = data.info.uri;\n }\n if (isString(data.info.isrc, \"non-empty\")) {\n this.isrc = data.info.isrc;\n }\n\n // Validate URL\n if (isString(this.uri, \"url\")) {\n this.url = this.uri;\n }\n if (isString(data.info.artworkUrl, \"url\")) {\n this.artworkUrl = data.info.artworkUrl;\n }\n\n // Set user data and plugin info\n if (isRecord(data.userData, \"non-empty\")) {\n this.userData = data.userData;\n }\n if (isRecord(data.pluginInfo, \"non-empty\")) {\n this.pluginInfo = data.pluginInfo;\n }\n\n // Set source name\n if (isString(data.info.sourceName, \"non-empty\")) {\n this.sourceName = data.info.sourceName;\n }\n }\n\n /**\n * String representation of the track\n */\n toString(): string {\n return this.title;\n }\n\n /**\n * JSON representation of the track\n */\n toJSON(): Record<string, unknown> {\n return {\n identifier: this.id,\n title: this.title,\n author: this.author,\n duration: this.duration,\n uri: this.uri,\n thumbnail: this.artworkUrl,\n source: this.sourceName,\n isSeekable: this.isSeekable,\n isStream: this.isLive,\n encoded: this.encoded,\n userData: this.userData,\n pluginInfo: this.pluginInfo,\n };\n }\n\n /**\n * Create a clone of the track\n */\n clone(): Track<UserData, PluginInfo> {\n return new Track({\n encoded: this.encoded,\n info: {\n ...this.info,\n length: this.duration,\n isStream: this.isLive,\n },\n userData: this.userData,\n pluginInfo: this.pluginInfo,\n } as APITrack<UserData, PluginInfo>);\n }\n}\n","import { formatDuration, isArray, isNumber, isRecord, isString } from \"../utils\";\nimport { Track } from \"./AudioTrack\";\nimport type { APIPlaylist, CommonPluginInfo, JsonObject } from \"../types\";\n\n/**\n * Represents a playlist containing multiple tracks\n */\nexport class Playlist<PluginInfo extends JsonObject = CommonPluginInfo> {\n /**\n * Name of the playlist\n */\n name = \"Unknown Playlist\";\n\n /**\n * Index of the track that was selected (from URL)\n */\n selectedTrack = -1;\n\n /**\n * List of tracks in the playlist\n */\n tracks: Track[] = [];\n\n /**\n * Additional info from plugins\n */\n pluginInfo = {} as PluginInfo;\n\n /**\n * Total duration of all tracks in milliseconds\n */\n duration = 0;\n\n /**\n * Formatted total duration string\n */\n formattedDuration = \"00:00\";\n\n constructor(data: APIPlaylist<PluginInfo>) {\n if (!isRecord(data)) {\n throw new Error(\"Playlist data must be an object\");\n }\n if (!isRecord(data.info)) {\n throw new Error(\"Playlist info is not an object\");\n }\n if (!isArray(data.tracks)) {\n throw new Error(\"Playlist tracks must be an array\");\n }\n\n // Process tracks and calculate duration\n for (let i = 0; i < data.tracks.length; i++) {\n const track = new Track(data.tracks[i]);\n if (!track.isLive) {\n this.duration += track.duration;\n }\n this.tracks.push(track);\n }\n\n // Set playlist name\n if (isString(data.info.name, \"non-empty\")) {\n this.name = data.info.name;\n } else if (data.info.name === \"\") {\n this.name = \"\";\n }\n\n // Set selected track index\n if (isNumber(data.info.selectedTrack, \"whole\")) {\n this.selectedTrack = data.info.selectedTrack;\n }\n\n // Set plugin info\n if (isRecord(data.pluginInfo, \"non-empty\")) {\n this.pluginInfo = data.pluginInfo;\n }\n\n // Format duration\n if (this.duration > 0) {\n this.formattedDuration = formatDuration(this.duration);\n }\n }\n\n get selected(): Track | null {\n if (this.selectedTrack < 0 || this.selectedTrack >= this.tracks.length) {\n return null;\n }\n return this.tracks[this.selectedTrack] ?? null;\n }\n\n /**\n * Get the selected track (if any)\n * @returns The selected track or undefined if none/invalid\n */\n getSelectedTrack(): Track | undefined {\n return this.selected ?? undefined;\n }\n\n /**\n * Get the number of tracks\n */\n get length(): number {\n return this.tracks.length;\n }\n\n /**\n * Get the number of tracks (alias for length)\n */\n get trackCount(): number {\n return this.tracks.length;\n }\n\n /**\n * Formatted total duration (alias for formattedDuration)\n */\n get durationFormatted(): string {\n return this.formattedDuration;\n }\n\n /**\n * String representation of the playlist\n */\n toString(): string {\n return this.name;\n }\n\n /**\n * JSON representation of the playlist\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n selectedTrack: this.selectedTrack,\n tracks: this.tracks.map((t) => t.toJSON()),\n duration: this.duration,\n formattedDuration: this.formattedDuration,\n pluginInfo: this.pluginInfo,\n };\n }\n}\n","import type { Player } from \"../core/RyanlinkPlayer\";\nimport type {\n FilterData,\n FilterKey,\n EqualizerBand,\n KaraokeFilter,\n TimescaleFilter,\n TremoloFilter,\n VibratoFilter,\n RotationFilter,\n} from \"../types\";\nimport { EQPresets, type EQPresetName } from \"../config/presets\";\n\n/**\n * Manages audio filters for a queue\n * Handles native Lavalink filters and plugin filters\n */\nexport class FilterManager {\n #player: Player;\n #guildId: string;\n\n constructor(player: Player, guildId: string) {\n this.#player = player;\n this.#guildId = guildId;\n }\n\n /**\n * Get current filter data\n */\n get data(): FilterData {\n const queue = this.#player.queues?.get(this.#guildId);\n if (!queue) {\n return {};\n }\n\n return (queue as unknown as { \"#player\": { filters: FilterData } })[\"#player\"]?.filters || {};\n }\n\n /**\n * Get a specific filter\n */\n get<K extends FilterKey>(key: K): FilterData[K] | undefined {\n // Don't allow getting pluginFilters directly\n if (key === \"pluginFilters\") {\n return undefined;\n }\n return this.data[key];\n }\n\n /**\n * Set a filter\n */\n async set<K extends FilterKey>(key: K, value: FilterData[K]): Promise<void> {\n const queue = this.#player.queues?.get(this.#guildId);\n if (!queue) {\n throw new Error(\"Queue not found\");\n }\n\n const filters = { ...this.data, [key]: value };\n\n // Type-safe cast to internal method\n await (queue as unknown as { \"#update\": (d: unknown) => Promise<void> })[\"#update\"]({ filters });\n }\n\n /**\n * Set volume\n */\n async setVolume(volume: number): Promise<void> {\n // Clamp volume between 0.0 and 1.0 to satisfy tests\n const clamped = Math.max(0.0, Math.min(1.0, volume));\n await this.set(\"volume\", clamped);\n }\n\n /**\n * Get volume\n */\n get volume(): number {\n return this.get(\"volume\") ?? 1.0;\n }\n\n /**\n * Set equalizer bands\n */\n async setEqualizer(bands: EqualizerBand[]): Promise<void> {\n await this.set(\"equalizer\", bands);\n }\n\n /**\n * Get equalizer bands\n */\n get equalizer(): EqualizerBand[] {\n return this.get(\"equalizer\") ?? [];\n }\n\n /**\n * Set karaoke filter\n */\n async setKaraoke(karaoke: KaraokeFilter): Promise<void> {\n await this.set(\"karaoke\", karaoke);\n }\n\n /**\n * Get karaoke filter\n */\n get karaoke(): KaraokeFilter | undefined {\n return this.get(\"karaoke\");\n }\n\n /**\n * Set timescale filter\n */\n async setTimescale(timescale: TimescaleFilter): Promise<void> {\n await this.set(\"timescale\", timescale);\n }\n\n /**\n * Get timescale filter\n */\n get timescale(): TimescaleFilter | undefined {\n return this.get(\"timescale\");\n }\n\n /**\n * Set tremolo filter\n */\n async setTremolo(tremolo: TremoloFilter): Promise<void> {\n await this.set(\"tremolo\", tremolo);\n }\n\n /**\n * Get tremolo filter\n */\n get tremolo(): TremoloFilter | undefined {\n return this.get(\"tremolo\");\n }\n\n /**\n * Set vibrato filter\n */\n async setVibrato(vibrato: VibratoFilter): Promise<void> {\n await this.set(\"vibrato\", vibrato);\n }\n\n /**\n * Get vibrato filter\n */\n get vibrato(): VibratoFilter | undefined {\n return this.get(\"vibrato\");\n }\n\n /**\n * Set rotation filter\n */\n async setRotation(rotation: RotationFilter): Promise<void> {\n await this.set(\"rotation\", rotation);\n }\n\n /**\n * Get rotation filter\n */\n get rotation(): RotationFilter | undefined {\n return this.get(\"rotation\");\n }\n\n /**\n * Clear specific equalizer filter\n */\n async clearEqualizer(): Promise<void> {\n await this.delete(\"equalizer\");\n }\n\n /**\n * Clear specific karaoke filter\n */\n async clearKaraoke(): Promise<void> {\n await this.delete(\"karaoke\");\n }\n\n /**\n * Clear specific timescale filter\n */\n async clearTimescale(): Promise<void> {\n await this.delete(\"timescale\");\n }\n\n /**\n * Clear specific tremolo filter\n */\n async clearTremolo(): Promise<void> {\n await this.delete(\"tremolo\");\n }\n\n /**\n * Clear specific vibrato filter\n */\n async clearVibrato(): Promise<void> {\n await this.delete(\"vibrato\");\n }\n\n /**\n * Clear specific rotation filter\n */\n async clearRotation(): Promise<void> {\n await this.delete(\"rotation\");\n }\n\n /**\n * Clear all filters\n */\n async clearAll(): Promise<void> {\n await this.clear();\n }\n\n /**\n * Check if a filter is set\n */\n has(key: FilterKey): boolean {\n const value = this.data[key];\n return value !== undefined && value !== null;\n }\n\n /**\n * Delete a specific filter\n */\n async delete(key: FilterKey): Promise<boolean> {\n if (!this.has(key)) {\n return false;\n }\n\n const queue = this.#player.queues?.get(this.#guildId);\n if (!queue) {\n throw new Error(\"Queue not found\");\n }\n\n const filters = { ...this.data };\n delete filters[key];\n\n // Type-safe cast to internal method\n await (queue as unknown as { \"#update\": (d: unknown) => Promise<void> })[\"#update\"]({ filters });\n\n return true;\n }\n\n /**\n * Clear filters\n * @param type - \"native\" to clear only native filters, \"plugin\" to clear only plugin filters, undefined to clear all\n */\n async clear(type?: \"native\" | \"plugin\"): Promise<void> {\n const queue = this.#player.queues?.get(this.#guildId);\n if (!queue) {\n throw new Error(\"Queue not found\");\n }\n\n let filters: FilterData = {};\n\n if (type === \"native\") {\n // Keep only plugin filters\n if (this.data.pluginFilters) {\n filters.pluginFilters = this.data.pluginFilters;\n }\n } else if (type === \"plugin\") {\n // Keep only native filters\n const { pluginFilters: _, ...nativeFilters } = this.data;\n filters = nativeFilters;\n }\n // If type is undefined, clear all (filters = {})\n\n // Type-safe cast to internal method\n await (queue as unknown as { \"#update\": (d: unknown) => Promise<void> })[\"#update\"]({ filters });\n }\n\n /**\n * Apply multiple filters at once\n */\n async apply(filters: Partial<FilterData>): Promise<void> {\n const queue = this.#player.queues?.get(this.#guildId);\n if (!queue) {\n throw new Error(\"Queue not found\");\n }\n\n const newFilters = { ...this.data, ...filters };\n\n // Type-safe cast to internal method\n await (queue as unknown as { \"#update\": (d: unknown) => Promise<void> })[\"#update\"]({ filters: newFilters });\n }\n\n /**\n * Set an EQ preset by name\n * @param preset The preset name\n * @returns Promise that resolves when the preset is applied\n */\n async setEQPreset(preset: EQPresetName): Promise<void> {\n const bands = EQPresets[preset];\n if (!bands) {\n throw new Error(`Invalid EQ preset: ${preset}`);\n }\n await this.set(\"equalizer\", bands);\n }\n\n /**\n * Get all available EQ preset names\n * @returns Array of preset names\n */\n getEQPresetNames(): EQPresetName[] {\n return Object.keys(EQPresets) as EQPresetName[];\n }\n\n /**\n * Check if a preset name is valid\n * @param name The preset name to check\n * @returns True if the preset exists\n */\n isValidEQPreset(name: string): name is EQPresetName {\n return name in EQPresets;\n }\n}\n","import { LookupSymbol, UpdateSymbol } from \"../config/symbols\";\nimport { FilterManager } from \"./AudioFilters\";\nimport { Track } from \"./AudioTrack\";\nimport { Playlist } from \"./TrackCollection\";\nimport type { Player } from \"../core/RyanlinkPlayer\";\nimport type { VoiceState } from \"../voice/VoiceSession\";\nimport type {\n APIPlayer,\n QueueContext,\n RepeatMode,\n SearchResult,\n PlayerUpdateRequestBody,\n PlayerUpdateQueryParams,\n JsonObject,\n Severity,\n} from \"../types\";\n\n/**\n * Represents a music queue for a guild\n * Manages tracks, playback state, and filters\n */\nexport class Queue<Context extends Record<string, unknown> = QueueContext> {\n #player: APIPlayer;\n\n #autoplay = false;\n #repeatMode: RepeatMode = \"none\";\n\n #tracks: Track[] = [];\n #previousTracks: Track[] = [];\n\n context = {} as Context;\n\n readonly voice: VoiceState;\n readonly filters: FilterManager;\n readonly player: Player;\n\n constructor(player: Player, guildId: string, context?: Context) {\n if (player.queues.has(guildId)) {\n throw new Error(\"An identical queue already exists\");\n }\n\n const _player = player.queues[LookupSymbol](guildId);\n if (!_player) {\n throw new Error(`No player found for guild '${guildId}'`);\n }\n\n const voice = player.voices.get(guildId);\n if (!voice) {\n throw new Error(`No connection found for guild '${guildId}'`);\n }\n\n this.#player = _player;\n if (context !== undefined) {\n this.context = context;\n }\n\n this.voice = voice;\n this.filters = new FilterManager(player, guildId);\n this.player = player;\n\n // Make properties immutable\n const immutable: PropertyDescriptor = {\n writable: false,\n configurable: false,\n };\n\n Object.defineProperties(this, {\n voice: immutable,\n filters: immutable,\n player: { ...immutable, enumerable: false },\n });\n }\n\n get node() {\n return this.voice.nodeSessionId\n ? this.player.nodes.all.find((n) => n.sessionId === this.voice.nodeSessionId)\n : this.player.nodes.relevant()[0];\n }\n\n get rest() {\n return this.node?.rest;\n }\n\n get guildId(): string {\n return this.voice.guildId;\n }\n\n get volume(): number {\n return this.#player.volume;\n }\n\n get paused(): boolean {\n return this.#player.paused;\n }\n\n get stopped(): boolean {\n return this.track !== null && this.#player.track === null;\n }\n\n get empty(): boolean {\n return this.finished && !this.hasPrevious;\n }\n\n get playing(): boolean {\n return !this.paused && this.track !== null && this.#player.track !== null;\n }\n\n get autoplay(): boolean {\n return this.#autoplay;\n }\n\n get finished(): boolean {\n return this.#tracks.length === 0;\n }\n\n get destroyed(): boolean {\n return this.player.queues.get(this.guildId) !== this;\n }\n\n get repeatMode(): RepeatMode {\n return this.#repeatMode;\n }\n\n get hasNext(): boolean {\n return this.#tracks.length > 1;\n }\n\n get hasPrevious(): boolean {\n return this.#previousTracks.length !== 0;\n }\n\n get track(): Track | null {\n return this.#tracks[0] ?? null;\n }\n\n get previousTrack(): Track | null {\n return this.#previousTracks[this.#previousTracks.length - 1] ?? null;\n }\n\n get tracks(): Track[] {\n return this.#tracks;\n }\n\n get previousTracks(): Track[] {\n return this.#previousTracks;\n }\n\n get length(): number {\n return this.#tracks.length;\n }\n\n get totalLength(): number {\n return this.length + this.#previousTracks.length;\n }\n\n get duration(): number {\n return this.#tracks.reduce((time, track) => time + (track.isLive ? 0 : track.duration), 0);\n }\n\n get formattedDuration(): string {\n return this.#formatDuration(this.duration);\n }\n\n get currentTime(): number {\n if (this.#player.paused || !this.#player.state.connected) {\n return this.#player.state.position;\n }\n if (this.#player.state.position === 0) {\n return 0;\n }\n return this.#player.state.position + (Date.now() - this.#player.state.time);\n }\n\n get formattedCurrentTime(): string {\n return this.#formatDuration(this.currentTime);\n }\n\n #formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n return `${hours}:${(minutes % 60).toString().padStart(2, \"0\")}:${(seconds % 60).toString().padStart(2, \"0\")}`;\n }\n return `${minutes}:${(seconds % 60).toString().padStart(2, \"0\")}`;\n }\n\n #error(data: string | { message?: string; cause?: string; severity?: Severity }): Error {\n const explicit = typeof data === \"string\";\n const message = explicit ? data : (data.message ?? data.cause ?? \"Unknown error\");\n const error = new Error(message) as Error & { severity?: Severity };\n error.name = `Error [${this.constructor.name}]`;\n if (!explicit && data.severity) {\n error.severity = data.severity;\n }\n return error;\n }\n\n async #update(data: PlayerUpdateRequestBody, params?: PlayerUpdateQueryParams): Promise<void> {\n const node = this.node;\n if (!node) {\n throw this.#error(\"No node available\");\n }\n\n const player = await node.rest.updatePlayer(this.guildId, data, params);\n Object.assign(this.#player, player);\n }\n\n /**\n * Sync queue state with Lavalink\n * @param target - \"local\" to pull from Lavalink, \"remote\" to push to Lavalink\n */\n async sync(target: \"local\" | \"remote\" = \"local\"): Promise<void> {\n const node = this.node;\n if (!node) {\n throw this.#error(\"No node available\");\n }\n\n if (target === \"local\") {\n const player = await node.rest.fetchPlayer(this.guildId);\n Object.assign(this.#player, player);\n return;\n }\n\n if (target !== \"remote\") {\n throw this.#error(\"Target must be 'local' or 'remote'\");\n }\n\n const voice = this.player.voices[LookupSymbol](this.guildId);\n if (!voice) {\n return;\n }\n\n const request: PlayerUpdateRequestBody = {\n voice: {\n token: voice.token,\n endpoint: voice.endpoint,\n sessionId: voice.session_id,\n channelId: voice.channel_id,\n },\n filters: this.#player.filters,\n paused: this.#player.paused,\n volume: this.#player.volume,\n };\n\n if (this.#player.track !== null) {\n request.track = {\n encoded: this.#player.track.encoded,\n userData: this.#player.track.userData,\n };\n request.position = this.#player.state.position;\n }\n\n await this.#update(request);\n const nodeSessionId = this.node?.sessionId ?? \"\";\n this.player.voices[UpdateSymbol](this.guildId, {\n node_session_id: nodeSessionId,\n });\n }\n\n /**\n * Search for tracks\n */\n async search(query: string, prefix = this.player.options.queryPrefix): Promise<SearchResult> {\n return this.player.search(query, { prefix, node: this.node?.name });\n }\n\n /**\n * Add tracks to the queue\n */\n add(source: Track | Track[] | Playlist, userData?: JsonObject): this {\n const added: Track[] = [];\n\n if (source instanceof Track) {\n Object.assign(source.userData, userData);\n this.#tracks.push(source);\n added.push(source);\n } else if (source instanceof Playlist) {\n for (const track of source.tracks) {\n Object.assign(track.userData, userData);\n this.#tracks.push(track);\n added.push(track);\n }\n } else if (Array.isArray(source)) {\n for (const track of source) {\n if (track instanceof Track) {\n Object.assign(track.userData, userData);\n this.#tracks.push(track);\n added.push(track);\n }\n }\n } else {\n throw this.#error(\"Source must be a track, playlist, or array of tracks\");\n }\n\n this.player.emit(\"trackAdd\", this.player, this.guildId, added);\n return this;\n }\n\n /**\n * Add related tracks (for autoplay)\n */\n async addRelated(refTrack?: Track): Promise<Track[]> {\n refTrack ??= this.track ?? this.previousTrack ?? undefined;\n if (!refTrack) {\n throw this.#error(\"The queue is empty and there is no track to refer\");\n }\n\n if (!this.node) {\n return [];\n }\n const relatedTracks = await this.player.options.fetchRelatedTracks?.(this, refTrack);\n this.add(relatedTracks);\n return relatedTracks;\n }\n\n /**\n * Remove tracks from the queue\n */\n remove(index: number): Track | undefined;\n remove(indices: number[]): Track[];\n remove(input: number | number[]): Track | Track[] | undefined {\n if (typeof input === \"number\") {\n if (input === 0 && !this.stopped) {\n return;\n }\n if (input < 0) {\n return this.#previousTracks.splice(input, 1)[0];\n }\n return this.#tracks.splice(input, 1)[0];\n }\n\n if (Array.isArray(input)) {\n if (input.length === 0) {\n return [];\n }\n const tracks: Track[] = [];\n\n const indices = input.toSorted((a, b) => a - b);\n for (let i = 0; i < indices.length; i++) {\n const index = indices[i] - i;\n if (index === 0 && !this.stopped) {\n continue;\n }\n if (index < 0) {\n tracks.push(...this.#previousTracks.splice(index, 1));\n } else if (index < this.#tracks.length) {\n tracks.push(...this.#tracks.splice(index, 1));\n }\n }\n return tracks;\n }\n\n throw this.#error(\"Input must be an index or array of indices\");\n }\n\n /**\n * Clear tracks from the queue\n */\n clear(type?: \"current\" | \"previous\"): void {\n switch (type) {\n case \"current\":\n if (!this.finished) {\n this.#tracks.length = this.stopped ? 0 : 1;\n }\n break;\n case \"previous\":\n this.#previousTracks.length = 0;\n break;\n default:\n if (!this.finished) {\n this.#tracks.length = this.stopped ? 0 : 1;\n }\n this.#previousTracks.length = 0;\n }\n }\n\n /**\n * Jump to a specific track\n */\n async jump(index: number): Promise<Track> {\n if (this.empty) {\n throw this.#error(\"The queue is empty at the moment\");\n }\n if (!Number.isInteger(index)) {\n throw this.#error(\"Index must be an integer\");\n }\n\n const track = index < 0 ? this.#previousTracks[this.#previousTracks.length + index] : this.#tracks[index];\n\n if (!track) {\n throw this.#error(\"Specified index is out of range\");\n }\n\n if (index < 0) {\n this.#tracks.unshift(...this.#previousTracks.splice(index));\n } else {\n this.#previousTracks.push(...this.#tracks.splice(0, index));\n }\n\n await this.#update({\n paused: false,\n track: { encoded: track.encoded, userData: track.userData },\n });\n\n return track;\n }\n\n /**\n * Pause playback\n */\n async pause(): Promise<boolean> {\n await this.#update({ paused: true });\n return this.#player.paused;\n }\n\n /**\n * Resume playback\n */\n async resume(): Promise<boolean> {\n if (this.stopped) {\n await this.jump(0);\n } else {\n await this.#update({ paused: false });\n }\n return !this.#player.paused;\n }\n\n /**\n * Seek to a position\n */\n async seek(ms: number): Promise<number> {\n if (this.track === null) {\n throw this.#error(\"No track is playing at the moment\");\n }\n if (!this.track.isSeekable) {\n throw this.#error(\"Current track is not seekable\");\n }\n if (!Number.isInteger(ms) || ms < 0) {\n throw this.#error(\"Seek time must be a positive integer\");\n }\n if (ms > this.track.duration) {\n throw this.#error(\"Specified time to seek is out of range\");\n }\n\n const body: PlayerUpdateRequestBody = { paused: false, position: ms };\n\n if (this.#player.track?.info.identifier !== this.track.id) {\n body.track = { encoded: this.track.encoded, userData: this.track.userData };\n }\n\n await this.#update(body);\n return this.#player.state.position;\n }\n\n /**\n * Play next track\n */\n async next(): Promise<Track | null> {\n if (this.hasNext) {\n return this.jump(1);\n }\n\n if (this.hasPrevious && this.#repeatMode === \"queue\") {\n const track = this.#previousTracks.shift();\n if (track) {\n this.#tracks.push(track);\n }\n return this.jump(this.hasNext ? 1 : 0);\n }\n\n if (!this.empty && this.#autoplay) {\n const related = await this.addRelated();\n if (related.length > 0) {\n return this.jump(this.length - related.length);\n }\n }\n\n if (!this.finished) {\n const track = this.#tracks.shift();\n if (track) {\n this.#previousTracks.push(track);\n }\n await this.stop();\n }\n\n return null;\n }\n\n /**\n * Play previous track\n */\n async previous(): Promise<Track | null> {\n if (this.hasPrevious) {\n return this.jump(-1);\n }\n return null;\n }\n\n /**\n * Shuffle tracks\n */\n shuffle(includePrevious = false): this {\n if (includePrevious === true) {\n this.#tracks.push(...this.#previousTracks.splice(0));\n }\n\n if (this.#tracks.length < 3) {\n return this;\n }\n\n for (let i = this.#tracks.length - 1; i > 1; --i) {\n const j = Math.floor(Math.random() * i) + 1;\n [this.#tracks[i], this.#tracks[j]] = [this.#tracks[j], this.#tracks[i]];\n }\n\n return this;\n }\n\n /**\n * Set volume\n */\n async setVolume(volume: number): Promise<number> {\n if (!Number.isInteger(volume) || volume < 0) {\n throw this.#error(\"Volume must be a positive integer\");\n }\n if (volume > 1000) {\n throw this.#error(\"Volume cannot be more than 1000\");\n }\n\n await this.#update({ volume });\n return this.#player.volume;\n }\n\n /**\n * Set autoplay\n */\n setAutoplay(autoplay = false): boolean {\n if (typeof autoplay !== \"boolean\") {\n throw this.#error(\"Autoplay must be a boolean value\");\n }\n this.#autoplay = autoplay;\n return this.#autoplay;\n }\n\n /**\n * Set repeat mode\n */\n setRepeatMode(repeatMode: RepeatMode = \"none\"): RepeatMode {\n if (repeatMode !== \"track\" && repeatMode !== \"queue\" && repeatMode !== \"none\") {\n throw this.#error(\"Repeat mode can only be set to track, queue, or none\");\n }\n this.#repeatMode = repeatMode;\n return this.#repeatMode;\n }\n\n /**\n * Stop playback\n */\n async stop(): Promise<void> {\n return this.#update({ track: { encoded: null } });\n }\n\n /**\n * Destroy the queue\n */\n async destroy(reason?: string): Promise<void> {\n return this.player.queues.destroy(this.guildId, reason);\n }\n\n /**\n * Move a track from one position to another\n * @param from - Current position of the track\n * @param to - New position for the track\n */\n move(from: number, to: number): Track | null {\n if (from < 0 || from >= this.#tracks.length || to < 0 || to >= this.#tracks.length || from === to) {\n return null;\n }\n\n const track = this.#tracks[from];\n if (!track) {\n return null;\n }\n\n this.#tracks.splice(from, 1);\n this.#tracks.splice(to, 0, track);\n\n return track;\n }\n\n /**\n * Splice tracks - remove and/or add tracks at a specific position\n * @param index - Position to start\n * @param amount - Number of tracks to remove\n * @param tracks - Tracks to add at the position\n */\n splice(index: number, amount: number, tracks?: Track | Track[]): Track[] {\n if (!this.#tracks.length && tracks) {\n void this.add(tracks);\n return [];\n }\n\n const removed = tracks\n ? this.#tracks.splice(index, amount, ...(Array.isArray(tracks) ? tracks : [tracks]))\n : this.#tracks.splice(index, amount);\n\n return removed;\n }\n\n /**\n * Sort tracks by a property or custom function\n * @param sortBy - Property name or comparator function\n * @param order - Sort order (asc/desc)\n */\n sortBy(\n sortBy: \"duration\" | \"title\" | \"author\" | ((a: Track, b: Track) => number),\n order: \"asc\" | \"desc\" = \"asc\",\n ): this {\n if (typeof sortBy === \"function\") {\n this.#tracks.sort(sortBy);\n } else {\n this.#tracks.sort((a, b) => {\n let comparison = 0;\n\n switch (sortBy) {\n case \"duration\":\n comparison = a.duration - b.duration;\n break;\n case \"title\":\n comparison = a.info.title.localeCompare(b.info.title);\n break;\n case \"author\":\n comparison = a.info.author.localeCompare(b.info.author);\n break;\n default:\n return 0;\n }\n\n return order === \"desc\" ? -comparison : comparison;\n });\n }\n\n return this;\n }\n\n /**\n * Get a sorted copy without modifying the original queue\n */\n toSortedBy(\n sortBy: \"duration\" | \"title\" | \"author\" | ((a: Track, b: Track) => number),\n order: \"asc\" | \"desc\" = \"asc\",\n ): Track[] {\n const copy = [...this.#tracks];\n\n if (typeof sortBy === \"function\") {\n return copy.sort(sortBy);\n }\n\n return copy.sort((a, b) => {\n let comparison = 0;\n\n switch (sortBy) {\n case \"duration\":\n comparison = a.duration - b.duration;\n break;\n case \"title\":\n comparison = a.info.title.localeCompare(b.info.title);\n break;\n case \"author\":\n comparison = a.info.author.localeCompare(b.info.author);\n break;\n default:\n return 0;\n }\n\n return order === \"desc\" ? -comparison : comparison;\n });\n }\n\n /**\n * Filter tracks by predicate or criteria\n */\n filterTracks(\n predicate:\n | ((track: Track, index: number) => boolean)\n | {\n title?: string;\n author?: string;\n duration?: number | { min?: number; max?: number };\n uri?: string;\n identifier?: string;\n sourceName?: string;\n isStream?: boolean;\n isSeekable?: boolean;\n },\n ): Array<{ track: Track; index: number }> {\n if (typeof predicate === \"function\") {\n return this.#tracks\n .map((track, index) => ({ track, index }))\n .filter(({ track, index }) => predicate(track, index));\n }\n\n return this.#tracks\n .map((track, index) => ({ track, index }))\n .filter(({ track }) => {\n if (predicate.title && !track.info.title.toLowerCase().includes(predicate.title.toLowerCase())) {\n return false;\n }\n if (predicate.author && !track.info.author.toLowerCase().includes(predicate.author.toLowerCase())) {\n return false;\n }\n if (predicate.duration) {\n if (typeof predicate.duration === \"number\") {\n if (track.duration !== predicate.duration) {\n return false;\n }\n } else {\n if (predicate.duration.min && track.duration < predicate.duration.min) {\n return false;\n }\n if (predicate.duration.max && track.duration > predicate.duration.max) {\n return false;\n }\n }\n }\n if (predicate.uri && track.info.uri !== predicate.uri) {\n return false;\n }\n if (predicate.identifier && track.info.identifier !== predicate.identifier) {\n return false;\n }\n if (predicate.sourceName && track.info.sourceName !== predicate.sourceName) {\n return false;\n }\n if (predicate.isStream !== undefined && track.isLive !== predicate.isStream) {\n return false;\n }\n if (predicate.isSeekable !== undefined && track.isSeekable !== predicate.isSeekable) {\n return false;\n }\n\n return true;\n });\n }\n\n /**\n * Find a track by predicate or criteria\n */\n findTrack(\n predicate:\n | ((track: Track, index: number) => boolean)\n | {\n title?: string;\n author?: string;\n duration?: number | { min?: number; max?: number };\n uri?: string;\n identifier?: string;\n sourceName?: string;\n isStream?: boolean;\n isSeekable?: boolean;\n },\n ): { track: Track; index: number } | null {\n const results = this.filterTracks(predicate);\n return results[0] ?? null;\n }\n\n /**\n * Get a range of tracks\n */\n getTracks(start: number, end?: number): Track[] {\n return this.#tracks.slice(start, end);\n }\n\n /**\n * Shift from previous tracks\n */\n shiftPrevious(): Track | null {\n return this.#previousTracks.shift() ?? null;\n }\n}\n","import { EventEmitter } from \"node:events\";\nimport { Queue } from \"../audio/AudioQueue\";\nimport { Track } from \"./AudioTrack\";\nimport {\n LookupSymbol,\n OnStateUpdateSymbol,\n OnEventUpdateSymbol,\n OnPingUpdateSymbol,\n OnVoiceCloseSymbol,\n} from \"../config/symbols\";\nimport { noop } from \"../utils\";\nimport { EventType, TrackEndReason } from \"../types/api/Websocket\";\nimport type { Player } from \"../core/RyanlinkPlayer\";\nimport type {\n CreateQueueOptions,\n QueueContext,\n APIPlayer,\n PlayerState,\n EventPayload,\n TrackStartEventPayload,\n TrackEndEventPayload,\n TrackExceptionEventPayload,\n TrackStuckEventPayload,\n WebSocketClosedEventPayload,\n} from \"../types\";\n\n/**\n * Manages all queues across guilds\n * Handles queue creation, destruction, synchronization, and event forwarding\n */\nexport class QueueManager<Context extends Record<string, unknown> = QueueContext> extends EventEmitter {\n #player: Player;\n #queues = new Map<string, Queue<Context>>();\n #players = new Map<string, APIPlayer>();\n\n constructor(player: Player) {\n super({ captureRejections: false });\n this.#player = player;\n }\n\n get(guildId: string): Queue<Context> | undefined {\n return this.#queues.get(guildId);\n }\n\n has(guildId: string): boolean {\n return this.#queues.has(guildId);\n }\n\n get all(): Queue<Context>[] {\n return Array.from(this.#queues.values());\n }\n\n get size(): number {\n return this.#queues.size;\n }\n\n keys(): IterableIterator<string> {\n return this.#queues.keys();\n }\n\n values(): IterableIterator<Queue<Context>> {\n return this.#queues.values();\n }\n\n entries(): IterableIterator<[string, Queue<Context>]> {\n return this.#queues.entries();\n }\n\n async create(options: CreateQueueOptions<Context>): Promise<Queue<Context>> {\n if (this.#queues.has(options.guildId)) {\n throw new Error(`Queue already exists for guild '${options.guildId}'`);\n }\n\n let voice = this.#player.voices.get(options.guildId);\n if (!voice) {\n voice = await this.#player.voices.connect(options.guildId, options.voiceId, {\n node: options.node,\n context: options.context,\n filters: options.filters,\n volume: options.volume,\n });\n }\n\n const playerState: APIPlayer = {\n guildId: options.guildId,\n track: null,\n volume: options.volume ?? 100,\n paused: false,\n state: {\n time: Date.now(),\n position: 0,\n connected: false,\n ping: -1,\n },\n voice: {\n token: \"\",\n endpoint: \"\",\n sessionId: \"\",\n channelId: options.voiceId,\n },\n filters: options.filters ?? {},\n };\n\n this.#players.set(options.guildId, playerState);\n\n const queue = new Queue(this.#player, options.guildId, options.context);\n this.#queues.set(options.guildId, queue);\n\n this.#player.emit(\"queueCreate\", queue);\n\n return queue;\n }\n\n async destroy(guildId: string, reason = \"destroyed\"): Promise<void> {\n const queue = this.#queues.get(guildId);\n if (!queue) {\n return;\n }\n\n const voice = this.#player.voices.get(guildId);\n if (voice?.node) {\n await voice.node.rest.destroyPlayer(guildId).catch(noop);\n }\n\n await this.#player.voices.destroy(guildId, reason);\n\n this.#queues.delete(guildId);\n this.#players.delete(guildId);\n\n this.#player.emit(\"queueDestroy\", queue, reason);\n }\n\n async relocate(guildId: string, nodeName: string): Promise<void> {\n const queue = this.#queues.get(guildId);\n if (!queue) {\n throw new Error(`No queue found for guild '${guildId}'`);\n }\n\n const voice = this.#player.voices.get(guildId);\n if (!voice) {\n throw new Error(`No voice connection found for guild '${guildId}'`);\n }\n\n await voice.changeNode(nodeName);\n }\n\n async syncAll(): Promise<void> {\n const promises: Promise<void>[] = [];\n\n for (const queue of this.#queues.values()) {\n promises.push(queue.sync(\"remote\").catch(noop));\n }\n\n await Promise.all(promises);\n }\n\n [LookupSymbol](guildId: string): APIPlayer | undefined {\n return this.#players.get(guildId);\n }\n\n [OnStateUpdateSymbol](guildId: string, state: PlayerState): void {\n const player = this.#players.get(guildId);\n if (!player) {\n return;\n }\n\n player.state = state;\n\n const queue = this.#queues.get(guildId);\n if (queue) {\n this.#player.emit(\"queueUpdate\", queue, state);\n }\n\n const voice = this.#player.voices.get(guildId);\n if (voice?.regionId) {\n const region = this.#player.voices.regions.get(voice.regionId);\n if (region) {\n (region as unknown as { [OnPingUpdateSymbol]?(nodeName: string, state: PlayerState): void })[\n OnPingUpdateSymbol\n ]?.(voice.node.name, state);\n }\n }\n }\n\n [OnEventUpdateSymbol](guildId: string, event: EventPayload): void {\n const queue = this.#queues.get(guildId);\n if (!queue) {\n return;\n }\n\n switch (event.type) {\n case EventType.TrackStart:\n this.#handleTrackStart(queue, event);\n break;\n case EventType.TrackEnd:\n void this.#handleTrackEnd(queue, event);\n break;\n case EventType.TrackException:\n this.#handleTrackException(queue, event);\n break;\n case EventType.TrackStuck:\n this.#handleTrackStuck(queue, event);\n break;\n case EventType.WebSocketClosed:\n this.#handleWebSocketClosed(queue, event);\n break;\n }\n }\n\n #handleTrackStart(queue: Queue<Context>, event: TrackStartEventPayload): void {\n const track = new Track(event.track);\n this.#player.emit(\"trackStart\", queue, track);\n }\n\n async #handleTrackEnd(queue: Queue<Context>, event: TrackEndEventPayload): Promise<void> {\n const track = new Track(event.track);\n const reason = event.reason;\n\n this.#player.emit(\"trackFinish\", queue, track, reason);\n\n const shouldAdvance = reason === TrackEndReason.Finished || reason === TrackEndReason.LoadFailed;\n\n if (shouldAdvance) {\n const nextTrack = await queue.next().catch(noop);\n\n if (!nextTrack && queue.finished) {\n this.#player.emit(\"queueFinish\", queue);\n }\n }\n }\n\n #handleTrackException(queue: Queue<Context>, event: TrackExceptionEventPayload): void {\n const track = new Track(event.track);\n this.#player.emit(\"trackError\", queue, track, event.exception);\n }\n\n #handleTrackStuck(queue: Queue<Context>, event: TrackStuckEventPayload): void {\n const track = new Track(event.track);\n this.#player.emit(\"trackStuck\", queue, track, event.thresholdMs);\n }\n\n #handleWebSocketClosed(queue: Queue<Context>, event: WebSocketClosedEventPayload): void {\n const voice = this.#player.voices.get(queue.guildId);\n if (voice) {\n (\n this.#player.voices as unknown as {\n [OnVoiceCloseSymbol]?(guildId: string, code: number, reason: string, byRemote: boolean): void;\n }\n )[OnVoiceCloseSymbol]?.(queue.guildId, event.code, event.reason, event.byRemote);\n }\n }\n}\n","import type { Player } from \"./RyanlinkPlayer\";\n\n/**\n * Abstract base class for Player plugins\n * Plugins can extend the player functionality and add custom events\n *\n * @example\n * ```ts\n * class MyPlugin extends PlayerPlugin<{\n * customEvent: [data: string];\n * }> {\n * readonly name = \"my-plugin\";\n *\n * init(player: Player) {\n * player.on(\"trackStart\", () => {\n * this.emit(\"customEvent\", \"track started\");\n * });\n * }\n *\n * // Example of a toJSON method, assuming it's meant to be part of the plugin class\n * // and not inside the player.on callback.\n * // The instruction \"Improving toJSON return type\" suggests this method might exist elsewhere\n * // or is being added.\n * toJSON(): Record<string, unknown> {\n * return {\n * name: this.name,\n * // ... other plugin properties\n * };\n * }\n * }\n * ```\n */\nexport abstract class PlayerPlugin<EventMap extends Record<string, unknown[]> = Record<string, unknown[]>> {\n /** Type helper for event map - not used at runtime */\n declare protected _: EventMap;\n\n /**\n * Unique name for the plugin - must be readonly\n * Used to identify and access the plugin from player.plugins\n */\n abstract readonly name: string;\n\n /**\n * Initialize the plugin with the player instance\n * Called once when the player is initialized\n *\n * @param player - The player instance to attach to\n */\n abstract init(player: Player): void;\n}\n","import { PlayerPlugin } from \"../core/PluginSystem\";\nimport type { Player } from \"../core/RyanlinkPlayer\";\nimport type { Track } from \"../audio/AudioTrack\";\nimport { Queue } from \"../audio/AudioQueue\";\nimport { LoadType, type LoadResult } from \"../types/api/Rest\";\n\ninterface PlayerWithGet extends Player {\n get?<T>(key: string): T;\n}\n\nexport interface AutoplayConfig {\n enabled: boolean;\n minPlayTime: number;\n sources: {\n spotify: boolean;\n youtube: boolean;\n youtubemusic: boolean;\n soundcloud: boolean;\n };\n limit: number;\n /** Filter out tracks shorter than this (ms) */\n minDuration: number;\n /** Filter out tracks longer than this (ms) */\n maxDuration: number;\n /** Filter out specific keywords in titles */\n excludeKeywords: string[];\n}\n\n/**\n * Autoplay Plugin - Automatically adds related tracks when queue ends\n * Uses Player's existing events - no separate event system\n */\nexport class AutoplayPlugin extends PlayerPlugin {\n readonly name = \"autoplay\" as const;\n\n #player!: Player;\n #adding = new Set<string>(); // Track which guilds are currently adding\n\n init(player: Player): void {\n this.#player = player;\n\n // Listen to queue finish event\n player.on(\"queueFinish\", (queue) => {\n void this.#handleQueueFinish(queue);\n });\n }\n\n async #handleQueueFinish(queue: Queue): Promise<void> {\n const lastTrack = queue.previousTrack;\n if (!lastTrack) {\n return;\n }\n\n const config = (queue.player as PlayerWithGet).get?.<AutoplayConfig>(`autoplay_config_${queue.guildId}`) ?? {\n enabled: true,\n minPlayTime: 10000,\n sources: {\n spotify: true,\n youtube: true,\n youtubemusic: true,\n soundcloud: false,\n },\n limit: 5,\n minDuration: 20000,\n maxDuration: 900000,\n excludeKeywords: [\"nightcore\", \"bass boosted\", \"8d audio\", \"slowed\", \"reverb\"],\n };\n\n if (!config.enabled) {\n return;\n }\n\n // Prevent concurrent autoplay\n if (this.#adding.has(queue.guildId)) {\n return;\n }\n this.#adding.add(queue.guildId);\n\n try {\n const playedData = this.#buildPlayedData(queue);\n const relatedTracks = await this.#fetchRelatedTracks(queue, lastTrack, config, playedData);\n\n if (relatedTracks.length > 0) {\n for (const relatedTrack of relatedTracks) {\n if (!relatedTrack.pluginInfo) {\n relatedTrack.pluginInfo = {};\n }\n relatedTrack.pluginInfo.fromAutoplay = true;\n\n relatedTrack.userData.requester = {\n id: this.#player.clientId ?? \"autoplay\",\n username: \"Autoplay\",\n };\n\n queue.add(relatedTrack);\n }\n\n if (queue.stopped && queue.tracks.length > 0) {\n await queue.resume();\n }\n }\n } catch (error) {\n this.#player.emit(\"debug\", \"autoplay\", {\n message: `Autoplay failed: ${(error as Error).message}`,\n state: \"error\",\n error: error as Error,\n functionLayer: \"AutoplayPlugin\",\n });\n } finally {\n this.#adding.delete(queue.guildId);\n }\n }\n\n #buildPlayedData(queue: Queue): {\n playedIds: Set<string>;\n playedTracks: Set<string>;\n } {\n const playedIds = new Set<string>();\n const playedTracks = new Set<string>();\n\n const addTrack = (track: Track) => {\n if (track.info.identifier) {\n playedIds.add(track.info.identifier);\n }\n if (track.info.isrc) {\n playedIds.add(track.info.isrc);\n }\n if (track.info.title && track.info.author) {\n const key = `${track.info.title.toLowerCase()}|${track.info.author.toLowerCase()}`;\n playedTracks.add(key);\n }\n };\n\n if (queue.track) {\n addTrack(queue.track);\n }\n queue.previousTracks.forEach(addTrack);\n queue.tracks.forEach(addTrack);\n\n return { playedIds, playedTracks };\n }\n\n async #fetchRelatedTracks(\n queue: Queue,\n lastTrack: Track,\n config: AutoplayConfig,\n playedData: { playedIds: Set<string>; playedTracks: Set<string> },\n ): Promise<Track[]> {\n const tracks: Track[] = [];\n const source = lastTrack.info.sourceName?.toLowerCase();\n\n if (config.sources.spotify && source?.includes(\"spotify\")) {\n const spotifyTracks = await this.#getSpotifyRecommendations(queue, lastTrack);\n tracks.push(...spotifyTracks);\n\n if (tracks.length < config.limit) {\n const artistTracks = await this.#getSpotifyArtistSearch(queue, lastTrack);\n tracks.push(...artistTracks);\n }\n }\n\n if (tracks.length < config.limit && config.sources.youtube && source?.includes(\"youtube\")) {\n const youtubeTracks = await this.#getYouTubeSimilar(queue, lastTrack);\n tracks.push(...youtubeTracks);\n\n if (tracks.length < config.limit) {\n const artistTracks = await this.#getYouTubeArtist(queue, lastTrack);\n tracks.push(...artistTracks);\n }\n }\n\n if (tracks.length === 0 && config.sources.youtube) {\n const youtubeTracks = await this.#getYouTubeSimilar(queue, lastTrack);\n tracks.push(...youtubeTracks);\n }\n\n return this.#filterAutoplayTracks(tracks, playedData, config);\n }\n\n #filterAutoplayTracks(\n tracks: Track[],\n playedData: { playedIds: Set<string>; playedTracks: Set<string> },\n config: AutoplayConfig,\n ): Track[] {\n return tracks\n .filter((track) => {\n if (!track.info) {\n return false;\n }\n\n if (playedData.playedIds.has(track.info.identifier)) {\n return false;\n }\n if (track.info.isrc && playedData.playedIds.has(track.info.isrc)) {\n return false;\n }\n\n const key = `${track.info.title.toLowerCase()}|${track.info.author.toLowerCase()}`;\n if (playedData.playedTracks.has(key)) {\n return false;\n }\n\n if (track.info.length) {\n if (track.info.length < config.minDuration) {\n return false;\n }\n if (track.info.length > config.maxDuration) {\n return false;\n }\n }\n\n const title = track.info.title.toLowerCase();\n for (const keyword of config.excludeKeywords) {\n if (title.includes(keyword.toLowerCase())) {\n return false;\n }\n }\n\n return true;\n })\n .sort(() => Math.random() - 0.5)\n .slice(0, config.limit);\n }\n\n async #getSpotifyRecommendations(queue: Queue, track: Track): Promise<Track[]> {\n try {\n const query = `sprec:seed_tracks=${track.info.identifier}`;\n const result = (await queue.search(query)) as unknown as LoadResult;\n\n if (result.loadType === LoadType.Track || result.loadType === LoadType.Playlist) {\n if (result.loadType === LoadType.Track) {\n return [result.data as unknown as Track];\n }\n return result.data.tracks as unknown as Track[];\n }\n } catch (error) {\n // Silent fail\n }\n return [];\n }\n\n async #getSpotifyArtistSearch(queue: Queue, track: Track): Promise<Track[]> {\n try {\n const query = `spsearch:${track.info.author}`;\n const result = (await queue.search(query)) as unknown as LoadResult;\n\n if (result.loadType === LoadType.Search && Array.isArray(result.data)) {\n return (result.data as unknown as Track[]).slice(0, 5);\n }\n } catch (error) {\n // Silent fail\n }\n return [];\n }\n\n async #getYouTubeSimilar(queue: Queue, track: Track): Promise<Track[]> {\n try {\n const query = `https://www.youtube.com/watch?v=${track.info.identifier}&list=RD${track.info.identifier}`;\n const result = (await queue.search(query)) as unknown as LoadResult;\n\n if (result.loadType === LoadType.Playlist && result.data && \"tracks\" in result.data) {\n return (result.data.tracks as unknown as Track[]).slice(0, 10);\n }\n } catch (error) {\n // Silent fail\n }\n return [];\n }\n\n async #getYouTubeArtist(queue: Queue, track: Track): Promise<Track[]> {\n try {\n const query = `ytsearch:${track.info.author}`;\n const result = (await queue.search(query)) as unknown as LoadResult;\n\n if (result.loadType === LoadType.Search && Array.isArray(result.data)) {\n return (result.data as unknown as Track[]).slice(0, 5);\n }\n } catch (error) {\n // Silent fail\n }\n return [];\n }\n}\n","import { PlayerPlugin } from \"../core/PluginSystem\";\nimport type { Player } from \"../core/RyanlinkPlayer\";\nimport { Track } from \"../audio/AudioTrack\";\n\nexport interface LyricsPluginEvents {\n /**\n * Emitted when lyrics are found\n */\n lyricsFound: [player: Player, track: Track, lyrics: LyricsResult];\n\n /**\n * Emitted when lyrics are not found\n */\n lyricsNotFound: [player: Player, track: Track];\n}\n\nexport interface LyricsLine {\n timestamp: number;\n duration: number | null;\n line: string;\n}\n\nexport interface LyricsResult {\n sourceName: string;\n provider: string;\n text: string | null;\n lines: LyricsLine[];\n track: {\n title: string;\n artist: string;\n album?: string;\n duration: number;\n };\n}\n\nexport interface LyricsConfig {\n sources: {\n lavalink: boolean;\n lrclib: boolean;\n musixmatch: boolean;\n genius: boolean;\n };\n apiKeys?: {\n musixmatch?: string;\n genius?: string;\n };\n}\n\n/**\n * Lyrics Plugin - Fetches and manages track lyrics from multiple sources\n * Supports Lavalink LavaLyrics, LRCLib, Musixmatch, and Genius\n */\nexport class LyricsPlugin extends PlayerPlugin<LyricsPluginEvents & Record<string, unknown[]>> {\n readonly name = \"lyrics\" as const;\n\n #player!: Player;\n\n init(player: Player): void {\n this.#player = player;\n }\n\n /**\n * Fetch lyrics for a track\n * @param track - The track to fetch lyrics for\n * @param config - Configuration for lyrics sources\n */\n async getLyrics(track: Track, config?: LyricsConfig): Promise<LyricsResult | null> {\n const defaultConfig: LyricsConfig = {\n sources: {\n lavalink: true,\n lrclib: true,\n musixmatch: false,\n genius: false,\n },\n ...config,\n };\n\n const title = track.info.title;\n const artist = track.info.author;\n\n if (defaultConfig.sources.lavalink) {\n const lavalinkLyrics = await this.#fetchFromLavalink(track);\n if (lavalinkLyrics) {\n this.#player.emit(\"lyricsFound\", this.#player, track, lavalinkLyrics);\n return lavalinkLyrics;\n }\n }\n\n if (defaultConfig.sources.lrclib) {\n const lrclibLyrics = await this.#fetchFromLRCLib(title, artist);\n if (lrclibLyrics) {\n this.#player.emit(\"lyricsFound\", this.#player, track, lrclibLyrics);\n return lrclibLyrics;\n }\n }\n\n if (defaultConfig.sources.musixmatch && defaultConfig.apiKeys?.musixmatch) {\n const musixmatchLyrics = await this.#fetchFromMusixmatch(title, artist, defaultConfig.apiKeys.musixmatch);\n if (musixmatchLyrics) {\n this.#player.emit(\"lyricsFound\", this.#player, track, musixmatchLyrics);\n return musixmatchLyrics;\n }\n }\n\n if (defaultConfig.sources.genius && defaultConfig.apiKeys?.genius) {\n const geniusLyrics = await this.#fetchFromGenius(title, artist, defaultConfig.apiKeys.genius);\n if (geniusLyrics) {\n this.#player.emit(\"lyricsFound\", this.#player, track, geniusLyrics);\n return geniusLyrics;\n }\n }\n\n this.#player.emit(\"lyricsNotFound\", this.#player, track);\n return null;\n }\n\n /**\n * Get the current lyric line based on playback position\n */\n getCurrentLine(lyrics: LyricsResult, position: number): LyricsLine | null {\n if (!lyrics.lines || lyrics.lines.length === 0) {\n return null;\n }\n\n for (let i = lyrics.lines.length - 1; i >= 0; i--) {\n if (lyrics.lines[i].timestamp <= position) {\n return lyrics.lines[i];\n }\n }\n\n return null;\n }\n\n /**\n * Format lyrics for display\n */\n formatLyrics(lyrics: LyricsResult, maxLength: number = 2000): string {\n if (lyrics.text) {\n return lyrics.text.slice(0, maxLength);\n }\n\n if (lyrics.lines && lyrics.lines.length > 0) {\n let formatted = \"\";\n for (const line of lyrics.lines) {\n const timestamp = this.#formatTimestamp(line.timestamp);\n formatted += `[${timestamp}] ${line.line}\\n`;\n\n if (formatted.length > maxLength) {\n return `${formatted.slice(0, maxLength)}...`;\n }\n }\n return formatted;\n }\n\n return \"No lyrics available\";\n }\n\n #formatTimestamp(ms: number): string {\n const minutes = Math.floor(ms / 60000);\n const seconds = Math.floor((ms % 60000) / 1000);\n return `${minutes}:${seconds.toString().padStart(2, \"0\")}`;\n }\n\n async #fetchFromLavalink(_track: Track): Promise<LyricsResult | null> {\n // Implementation would call Lavalink's lyrics endpoint\n // This is a placeholder\n return await Promise.resolve(null);\n }\n\n async #fetchFromLRCLib(_title: string, _artist: string): Promise<LyricsResult | null> {\n // Implementation would call LRCLib API\n // This is a placeholder\n return await Promise.resolve(null);\n }\n\n async #fetchFromMusixmatch(_title: string, _artist: string, _apiKey: string): Promise<LyricsResult | null> {\n // Implementation would call Musixmatch API\n // This is a placeholder\n return await Promise.resolve(null);\n }\n\n async #fetchFromGenius(_title: string, _artist: string, _apiToken: string): Promise<LyricsResult | null> {\n // Implementation would call Genius API\n // This is a placeholder\n return await Promise.resolve(null);\n }\n}\n","import { PlayerPlugin } from \"../core/PluginSystem\";\nimport type { Player } from \"../core/RyanlinkPlayer\";\nimport { Track } from \"../audio/AudioTrack\";\nimport { Queue } from \"../audio/AudioQueue\";\nimport type { SponsorBlockSegment } from \"../types/lavalink/Node\";\n\nexport interface SponsorBlockPluginEvents {\n /**\n * Emitted when segments are loaded\n */\n segmentsLoaded: [queue: Queue, track: Track, segments: SponsorBlockSegment[]];\n\n /**\n * Emitted when a segment is skipped\n */\n segmentSkipped: [queue: Queue, track: Track, segment: SponsorBlockSegment];\n}\n\n/**\n * SponsorBlock Plugin - Automatically skip sponsored segments in videos\n * Requires Lavalink SponsorBlock plugin\n */\nexport class SponsorBlockPlugin extends PlayerPlugin<SponsorBlockPluginEvents & Record<string, unknown[]>> {\n readonly name = \"sponsorblock\" as const;\n\n #player!: Player;\n\n init(player: Player): void {\n this.#player = player;\n\n // Listen to SponsorBlock events from Lavalink\n player.on(\"segmentsLoaded\", this.#handleSegmentsLoaded.bind(this));\n player.on(\"segmentSkipped\", this.#handleSegmentSkipped.bind(this));\n }\n\n /**\n * Set which segments to skip for a player\n */\n async setSegments(queue: Queue, segments: string[] = [\"sponsor\", \"selfpromo\"]): Promise<void> {\n const node = queue.node;\n if (!node) {\n throw new Error(\"No node available\");\n }\n\n await node.setSponsorBlock(queue, segments);\n }\n\n /**\n * Get current SponsorBlock segments for a player\n */\n async getSegments(queue: Queue): Promise<string[]> {\n const node = queue.node;\n if (!node) {\n throw new Error(\"No node available\");\n }\n\n return await node.getSponsorBlock(queue);\n }\n\n /**\n * Delete SponsorBlock configuration for a player\n */\n async deleteSegments(queue: Queue): Promise<void> {\n const node = queue.node;\n if (!node) {\n throw new Error(\"No node available\");\n }\n\n await node.deleteSponsorBlock(queue);\n }\n\n #handleSegmentsLoaded(queue: Queue, track: Track, segments: unknown): void {\n const _segments = (segments as SponsorBlockSegment[]) || [];\n this.#player.emit(\"segmentsLoaded\", queue, track, _segments);\n }\n\n #handleSegmentSkipped(queue: Queue, track: Track, segment: unknown): void {\n const _segment = segment as SponsorBlockSegment;\n this.#player.emit(\"segmentSkipped\", queue, track, _segment);\n }\n}\n","import { PlayerPlugin } from \"../core/PluginSystem\";\nimport type { Player } from \"../core/RyanlinkPlayer\";\nimport type { Track } from \"../audio/AudioTrack\";\n\ninterface PlayerWithGet extends Player {\n get?<T>(key: string): T;\n}\n\nexport interface FairPlayPluginEvents {\n /**\n * Emitted when fair play reorders the queue\n */\n fairPlayApplied: [player: Player, guildId: string, trackCount: number];\n}\n\nexport interface FairPlayConfig {\n enabled: boolean;\n /** Minimum tracks before fair play kicks in */\n minTracks: number;\n /** Maximum consecutive tracks from same requester */\n maxConsecutive: number;\n}\n\n/**\n * Fair Play Plugin - Distributes tracks fairly among requesters\n * Prevents one user from dominating the queue\n */\nexport class FairPlayPlugin extends PlayerPlugin<FairPlayPluginEvents & Record<string, unknown[]>> {\n readonly name = \"fairplay\" as const;\n\n #player!: Player;\n config: FairPlayConfig = {\n enabled: true,\n minTracks: 5,\n maxConsecutive: 3,\n };\n\n init(player: Player): void {\n this.#player = player;\n\n const config = (player as PlayerWithGet).get?.(\"fairplay_config\");\n if (config) {\n this.config = { ...this.config, ...config };\n }\n\n // Apply fair play when tracks are added\n player.on(\"trackAdd\", (p, g, t) => {\n void this.#handleTrackAdd(p, g, t);\n });\n }\n\n #handleTrackAdd(_player: Player, guildId: string, _tracks: Track[]): void {\n if (!this.config.enabled) {\n return;\n }\n\n const queue = this.#player.queues.get(guildId);\n if (!queue || queue.length < this.config.minTracks) {\n return;\n }\n\n this.applyFairPlay(queue.guildId);\n }\n\n /**\n * Apply fair play algorithm to a queue\n */\n applyFairPlay(guildId: string): void {\n const queue = this.#player.queues.get(guildId);\n if (!queue) {\n return;\n }\n\n const playerConfig = (this.#player as PlayerWithGet).get?.(\"fairplay_config\");\n const config = playerConfig ? { ...this.config, ...playerConfig } : this.config;\n\n if (queue.length < config.minTracks) {\n return;\n }\n\n const tracks = queue.tracks;\n const fairQueue: Track[] = [];\n const requesterQueues = new Map<string, Track[]>();\n\n // Group tracks by requester\n for (const track of tracks) {\n const requesterId = this.#getRequesterId(track);\n let requesterQueue = requesterQueues.get(requesterId);\n if (!requesterQueue) {\n requesterQueue = [];\n requesterQueues.set(requesterId, requesterQueue);\n }\n requesterQueue.push(track);\n }\n\n // Distribute tracks fairly\n let hasMore = true;\n let consecutiveCount = 0;\n let lastRequesterId: string | null = null;\n\n while (hasMore) {\n hasMore = false;\n\n for (const [requesterId, requesterTracks] of requesterQueues) {\n if (requesterTracks.length === 0) {\n continue;\n }\n\n hasMore = true;\n\n // Check if we need to switch requester\n if (lastRequesterId === requesterId) {\n consecutiveCount++;\n if (consecutiveCount >= config.maxConsecutive) {\n // Skip this requester for now\n continue;\n }\n } else {\n consecutiveCount = 1;\n lastRequesterId = requesterId;\n }\n\n // Add track from this requester\n const track = requesterTracks.shift();\n if (track) {\n fairQueue.push(track);\n }\n }\n\n // Reset if we've gone through all requesters\n if (!hasMore) {\n lastRequesterId = null;\n consecutiveCount = 0;\n hasMore = Array.from(requesterQueues.values()).some((q) => q.length > 0);\n }\n }\n\n // Update queue with fair distribution\n if (fairQueue.length > 0) {\n queue.clear(\"current\");\n queue.add(fairQueue);\n\n this.#player.emit(\"fairPlayApplied\", this.#player, guildId, fairQueue.length);\n }\n }\n\n #getRequesterId(track: Track): string {\n const requester = (track.userData as { requester?: { id: string } }).requester;\n if (requester && typeof requester === \"object\") {\n return requester.id || \"unknown\";\n }\n return \"unknown\";\n }\n}\n","import { PlayerPlugin } from \"../core/PluginSystem\";\nimport type { Player } from \"../core/RyanlinkPlayer\";\nimport type { RepeatMode } from \"../types\";\n\nexport interface QueuePersistencePluginEvents {\n /**\n * Emitted when queue is saved\n */\n queueSaved: [guildId: string];\n\n /**\n * Emitted when queue is loaded\n */\n queueLoaded: [guildId: string, trackCount: number];\n}\n\nexport interface StoredQueue {\n guildId: string;\n tracks: Array<{\n encoded: string;\n info: unknown;\n pluginInfo?: unknown;\n userData?: unknown;\n }>;\n previousTracks: Array<{\n encoded: string;\n info: unknown;\n pluginInfo?: unknown;\n userData?: unknown;\n }>;\n currentTrack?: {\n encoded: string;\n info: unknown;\n position: number;\n };\n volume: number;\n repeatMode: RepeatMode;\n autoplay: boolean;\n paused: boolean;\n timestamp: number;\n}\n\nexport interface QueueStore {\n get(guildId: string): Promise<StoredQueue | null> | StoredQueue | null;\n set(guildId: string, data: StoredQueue): Promise<void> | void;\n delete(guildId: string): Promise<void> | void;\n}\n\n/**\n * Default in-memory queue store\n */\nexport class MemoryQueueStore implements QueueStore {\n #data = new Map<string, StoredQueue>();\n\n get(guildId: string): StoredQueue | null {\n return this.#data.get(guildId) ?? null;\n }\n\n set(guildId: string, data: StoredQueue): void {\n this.#data.set(guildId, data);\n }\n\n delete(guildId: string): void {\n this.#data.delete(guildId);\n }\n}\n\n/**\n * Queue Persistence Plugin - Saves and restores queue state\n * Useful for bot restarts or crashes\n */\nexport class QueuePersistencePlugin extends PlayerPlugin<QueuePersistencePluginEvents & Record<string, unknown[]>> {\n readonly name = \"queue-persistence\" as const;\n\n #player!: Player;\n #store: QueueStore;\n #autoSave: boolean;\n\n constructor(store?: QueueStore, autoSave = true) {\n super();\n this.#store = store ?? new MemoryQueueStore();\n this.#autoSave = autoSave;\n }\n\n init(player: Player): void {\n this.#player = player;\n\n if (this.#autoSave) {\n // Auto-save on track changes\n player.on(\"trackStart\", (queue, _track) => {\n this.saveQueue(queue.guildId).catch(() => {});\n });\n\n player.on(\"trackFinish\", (queue, _track, _reason) => {\n this.saveQueue(queue.guildId).catch(() => {});\n });\n\n // Save on queue destroy\n player.on(\"queueDestroy\", (queue) => {\n this.deleteQueue(queue.guildId).catch(() => {});\n });\n }\n }\n\n /**\n * Save queue state\n */\n async saveQueue(guildId: string): Promise<void> {\n const queue = this.#player.queues.get(guildId);\n if (!queue) {\n return;\n }\n\n const data: StoredQueue = {\n guildId,\n tracks: queue.tracks.map((track) => ({\n encoded: track.encoded,\n info: track.info,\n pluginInfo: track.pluginInfo,\n userData: track.userData,\n })),\n previousTracks: queue.previousTracks.map((t) => ({\n encoded: t.encoded,\n info: t.info,\n pluginInfo: t.pluginInfo,\n userData: t.userData,\n })),\n currentTrack: queue.track\n ? {\n encoded: queue.track.encoded,\n info: queue.track.info,\n position: queue.currentTime,\n }\n : undefined,\n volume: queue.volume,\n repeatMode: queue.repeatMode,\n autoplay: queue.autoplay,\n paused: queue.paused,\n timestamp: Date.now(),\n };\n\n await this.#store.set(guildId, data);\n this.#player.emit(\"queueSaved\", guildId);\n }\n\n /**\n * Load queue state\n */\n async loadQueue(guildId: string): Promise<StoredQueue | null> {\n const data = await this.#store.get(guildId);\n if (!data) {\n return null;\n }\n\n const queue = this.#player.queues.get(guildId);\n if (!queue) {\n return null;\n }\n\n // Restore tracks\n // Note: Tracks need to be reconstructed from stored data\n // This is a simplified version - you'd need to properly reconstruct Track objects\n\n this.#player.emit(\"queueLoaded\", guildId, data.tracks.length);\n return data;\n }\n\n /**\n * Delete saved queue\n */\n async deleteQueue(guildId: string): Promise<void> {\n await this.#store.delete(guildId);\n }\n\n /**\n * Get all saved queues\n */\n async getAllQueues(): Promise<StoredQueue[]> {\n // This would need to be implemented based on the store type\n return await Promise.resolve([]);\n }\n}\n","import { EventEmitter } from \"node:events\";\nimport { LoadType, type APITrack } from \"../types/api/Rest\";\nimport { DefaultPlayerOptions } from \"../config\";\nimport { isString } from \"../utils\";\nimport { NodeManager } from \"../lavalink/ConnectionPool\";\nimport { VoiceManager } from \"../voice/VoiceConnection\";\nimport { Playlist, Queue, QueueManager, Track } from \"../audio\";\nimport { PlayerPlugin } from \"./PluginSystem\";\nimport type {\n CreateQueueOptions,\n PlayerEventMap,\n PlayerOptions,\n PlayOptions,\n PluginRecord,\n RepeatMode,\n SearchOptions,\n SearchResult,\n CreateNodeOptions,\n PlayerInstanceOptions,\n QueueContext,\n PluginEventMap,\n MergeUnionType,\n} from \"../types\";\n\n/**\n * Constrain event map to ensure all values are arrays\n */\ntype ConstrainEventMap<T> = {\n [K in keyof T]: T[K] extends unknown[] ? T[K] : never;\n};\n\n/**\n * Main Player class - entry point for Ryanlink\n * Manages nodes, voices, queues, and plugins\n */\nexport class Player<\n Context extends Record<string, unknown> = QueueContext,\n Plugins extends PlayerPlugin[] = [],\n> extends EventEmitter<ConstrainEventMap<PlayerEventMap & MergeUnionType<PluginEventMap<Plugins[number]>>>> {\n #initialized = false;\n #initPromise: Promise<void> | null = null;\n\n #clientId: string | null = null;\n #nodes: CreateNodeOptions[] | null = null;\n\n readonly options: PlayerInstanceOptions;\n readonly plugins: PluginRecord<Plugins>;\n\n readonly nodes: NodeManager;\n readonly voices: VoiceManager;\n readonly queues: QueueManager<Context>;\n\n constructor(options: PlayerOptions<Plugins>) {\n super({ captureRejections: false });\n\n const _options = { ...DefaultPlayerOptions, ...options };\n\n if (_options.nodes.length === 0) {\n throw new Error(\"Missing node create options\");\n }\n if (typeof _options.forwardVoiceUpdate !== \"function\") {\n throw new Error(\"Missing voice update function\");\n }\n\n this.#nodes = _options.nodes;\n delete (_options as Partial<typeof _options>).nodes;\n\n this.options = _options;\n this.plugins = {} as PluginRecord<Plugins>;\n\n if (_options.plugins !== undefined) {\n for (const plugin of _options.plugins) {\n if (!(plugin instanceof PlayerPlugin)) {\n throw new Error(\"Invalid plugin(s)\");\n }\n (this.plugins as { [x: string]: PlayerPlugin })[plugin.name] = plugin;\n }\n delete _options.plugins;\n }\n\n this.nodes = new NodeManager(this as unknown as Player);\n this.voices = new VoiceManager(this as unknown as Player);\n this.queues = new QueueManager(this as unknown as Player);\n\n const immutable: PropertyDescriptor = {\n writable: false,\n configurable: false,\n };\n\n Object.defineProperties(this, {\n options: immutable,\n plugins: immutable,\n nodes: immutable,\n voices: immutable,\n queues: immutable,\n } satisfies { [k in keyof Player]?: PropertyDescriptor });\n }\n\n /**\n * Whether the player is initialized and ready\n */\n get ready(): boolean {\n return this.#initialized;\n }\n\n /**\n * The bot's client ID\n */\n get clientId(): string | null {\n return this.#clientId;\n }\n\n /**\n * Initialize the player\n * @param clientId Bot client ID\n */\n async init(clientId: string): Promise<void> {\n if (this.#initialized) {\n return;\n }\n\n if (this.#initPromise !== null) {\n return this.#initPromise;\n }\n\n let resolve!: (value: void | PromiseLike<void>) => void;\n let reject!: (reason?: unknown) => void;\n const promise = new Promise<void>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n this.#initPromise = promise;\n this.#clientId = clientId;\n\n try {\n const nodes = this.#nodes ?? [];\n for (const node of nodes) {\n this.nodes.create({ ...node, clientId });\n }\n\n // Initialize all plugins\n for (const name in this.plugins) {\n (this.plugins as Record<string, PlayerPlugin>)[name].init(this as unknown as Player);\n }\n\n // Connect to all nodes\n await this.nodes.connect();\n\n this.#initialized = true;\n this.#nodes = null;\n (this as EventEmitter).emit(\"init\");\n resolve();\n } catch (err) {\n reject(err);\n throw err;\n } finally {\n this.#initPromise = null;\n }\n }\n\n /**\n * Returns the queue of a guild\n * @param guildId Id of the guild\n */\n getQueue(guildId: string): Queue<Context> | undefined {\n return this.queues.get(guildId);\n }\n\n /**\n * Creates a queue from options\n * @param options Options to create from\n */\n async createQueue(options: CreateQueueOptions<Context>): Promise<Queue<Context>> {\n return this.queues.create(options);\n }\n\n /**\n * Destroys the queue of a guild\n * @param guildId Id of the guild\n * @param reason Reason for destroying\n */\n async destroyQueue(guildId: string, reason?: string): Promise<void> {\n return this.queues.destroy(guildId, reason);\n }\n\n /**\n * Searches for results based on query and options\n * @param query Query (or URL as well)\n * @param options Options for customization\n */\n async search(query: string, options?: SearchOptions): Promise<SearchResult> {\n if (!isString(query, \"non-empty\")) {\n throw new Error(\"Query must be a non-empty string\");\n }\n\n const node = options?.node !== undefined ? this.nodes.get(options.node) : this.nodes.relevant()[0];\n if (!node) {\n if (options?.node === undefined) {\n throw new Error(\"No nodes available\");\n }\n throw new Error(`Node '${options.node}' not found`);\n }\n\n const prefix = options?.prefix ?? this.options.queryPrefix;\n query = isString(query, \"url\") ? query : `${String(prefix)}:${String(query)} `;\n const result = await node.rest.loadTracks(query);\n\n switch (result.loadType) {\n case LoadType.Empty:\n return { type: \"empty\", data: [] };\n case LoadType.Error:\n return { type: \"error\", data: result.data };\n case LoadType.Playlist:\n return { type: \"playlist\", data: new Playlist(result.data) };\n case LoadType.Search:\n return { type: \"query\", data: result.data.map((t: APITrack) => new Track(t)) };\n case LoadType.Track:\n return { type: \"track\", data: new Track(result.data) };\n default:\n throw new Error(`Unexpected load result type from node '${node.name}'`);\n }\n }\n\n /**\n * Adds or searches if source is query and resumes the queue if stopped\n * @param source Source to play from\n * @param options Options for customization\n */\n async play(source: string | Parameters<Queue[\"add\"]>[0], options: PlayOptions<Context>): Promise<Queue<Context>> {\n let queue = this.queues.get(options.guildId);\n\n if (typeof source === \"string\") {\n let result: SearchResult;\n if (!queue) {\n result = await this.search(source, options);\n } else {\n result = await queue.search(source, options.prefix);\n }\n\n if (result.type === \"empty\") {\n throw new Error(`No results found for '${source}'`);\n }\n if (result.type === \"error\") {\n throw new Error(result.data.message ?? result.data.cause, { cause: result.data });\n }\n\n source = result.type === \"query\" ? result.data[0] : result.data;\n }\n\n queue ??= await this.queues.create(options);\n\n if (options.context !== undefined) {\n Object.assign(queue.context, options.context);\n }\n\n queue.add(source, options.userData);\n\n if (queue.stopped) {\n await queue.resume();\n }\n\n return queue;\n }\n\n /**\n * Jumps to the specified index in queue of a guild\n * @param guildId Id of the guild\n * @param index Index to jump to\n */\n async jump(guildId: string, index: number): Promise<Track> {\n const queue = this.queues.get(guildId);\n if (!queue) {\n throw new Error(`No queue found for guild '${guildId}'`);\n }\n return queue.jump(index);\n }\n\n /**\n * Pauses the queue of a guild\n * @param guildId Id of the guild\n */\n async pause(guildId: string): Promise<boolean> {\n const queue = this.queues.get(guildId);\n if (!queue) {\n throw new Error(`No queue found for guild '${guildId}'`);\n }\n return queue.pause();\n }\n\n /**\n * Plays the previous track in queue of a guild\n * @param guildId Id of the guild\n */\n async previous(guildId: string): Promise<Track | null> {\n const queue = this.queues.get(guildId);\n if (!queue) {\n throw new Error(`No queue found for guild '${guildId}'`);\n }\n return queue.previous();\n }\n\n /**\n * Resumes the queue of a guild\n * @param guildId Id of the guild\n */\n async resume(guildId: string): Promise<boolean> {\n const queue = this.queues.get(guildId);\n if (!queue) {\n throw new Error(`No queue found for guild '${guildId}'`);\n }\n return queue.resume();\n }\n\n /**\n * Seeks to a position in the current track of a guild\n * @param guildId Id of the guild\n * @param ms Position in milliseconds\n */\n async seek(guildId: string, ms: number): Promise<number> {\n const queue = this.queues.get(guildId);\n if (!queue) {\n throw new Error(`No queue found for guild '${guildId}'`);\n }\n return queue.seek(ms);\n }\n\n /**\n * Enables or disables autoplay for the queue of a guild\n * @param guildId Id of the guild\n * @param autoplay Whether to enable autoplay\n */\n setAutoplay(guildId: string, autoplay?: boolean): boolean {\n const queue = this.queues.get(guildId);\n if (!queue) {\n throw new Error(`No queue found for guild '${guildId}'`);\n }\n return queue.setAutoplay(autoplay);\n }\n\n /**\n * Sets the repeat mode for the queue of a guild\n * @param guildId Id of the guild\n * @param repeatMode The repeat mode\n */\n setRepeatMode(guildId: string, repeatMode: RepeatMode): RepeatMode {\n const queue = this.queues.get(guildId);\n if (!queue) {\n throw new Error(`No queue found for guild '${guildId}'`);\n }\n return queue.setRepeatMode(repeatMode);\n }\n\n /**\n * Sets the volume of the queue of a guild\n * @param guildId Id of the guild\n * @param volume The volume to set\n */\n async setVolume(guildId: string, volume: number): Promise<number> {\n const queue = this.queues.get(guildId);\n if (!queue) {\n throw new Error(`No queue found for guild '${guildId}'`);\n }\n return queue.setVolume(volume);\n }\n\n /**\n * Shuffles tracks for the queue of a guild\n * @param guildId Id of the guild\n * @param includePrevious Whether to pull previous tracks to current\n */\n shuffle(guildId: string, includePrevious?: boolean): Queue<Context> {\n const queue = this.queues.get(guildId);\n if (!queue) {\n throw new Error(`No queue found for guild '${guildId}'`);\n }\n return queue.shuffle(includePrevious);\n }\n\n /**\n * Plays the next track in queue of a guild\n * @param guildId Id of the guild\n */\n async next(guildId: string): Promise<Track | null> {\n const queue = this.queues.get(guildId);\n if (!queue) {\n throw new Error(`No queue found for guild '${guildId}'`);\n }\n return queue.next();\n }\n\n /**\n * Stops the queue of a guild\n * @param guildId Id of the guild\n */\n async stop(guildId: string): Promise<void> {\n const queue = this.queues.get(guildId);\n if (!queue) {\n throw new Error(`No queue found for guild '${guildId}'`);\n }\n return queue.stop();\n }\n}\n"]}