@djangocfg/ui-tools 2.1.135 → 2.1.137
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{CronScheduler.client-Q6HLKGLR.cjs → CronScheduler.client-3JXCOKFY.cjs} +11 -11
- package/dist/{CronScheduler.client-Q6HLKGLR.cjs.map → CronScheduler.client-3JXCOKFY.cjs.map} +1 -1
- package/dist/{CronScheduler.client-T42ZXXOG.mjs → CronScheduler.client-MCNY3POV.mjs} +3 -3
- package/dist/{CronScheduler.client-T42ZXXOG.mjs.map → CronScheduler.client-MCNY3POV.mjs.map} +1 -1
- package/dist/{chunk-WU6ZLOL4.cjs → chunk-AL7PTAS5.cjs} +29 -8
- package/dist/chunk-AL7PTAS5.cjs.map +1 -0
- package/dist/{chunk-7H4LDBIH.mjs → chunk-QIAP4G5L.mjs} +31 -10
- package/dist/chunk-QIAP4G5L.mjs.map +1 -0
- package/dist/index.cjs +22 -22
- package/dist/index.d.cts +6 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.mjs +3 -3
- package/package.json +6 -6
- package/src/tools/CronScheduler/components/SchedulePreview.tsx +26 -6
- package/src/tools/CronScheduler/context/CronSchedulerContext.tsx +5 -0
- package/src/tools/CronScheduler/context/hooks.ts +3 -3
- package/src/tools/CronScheduler/types/index.ts +2 -0
- package/src/tools/CronScheduler/utils/cron-parser.ts +16 -3
- package/src/tools/Gallery/components/media/GalleryImage.tsx +1 -0
- package/src/tools/Gallery/components/preview/GalleryGrid.tsx +6 -13
- package/src/tools/Gallery/utils/index.ts +5 -0
- package/src/tools/Gallery/utils/normalizeUrl.ts +31 -0
- package/dist/chunk-7H4LDBIH.mjs.map +0 -1
- package/dist/chunk-WU6ZLOL4.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/CronScheduler/utils/cron-builder.ts","../src/tools/CronScheduler/utils/cron-parser.ts","../src/tools/CronScheduler/utils/cron-humanize.ts","../src/tools/CronScheduler/context/CronSchedulerContext.tsx","../src/tools/CronScheduler/context/hooks.ts","../src/tools/CronScheduler/components/ScheduleTypeSelector.tsx","../src/tools/CronScheduler/components/TimeSelector.tsx","../src/tools/CronScheduler/components/DayChips.tsx","../src/tools/CronScheduler/components/MonthDayGrid.tsx","../src/tools/CronScheduler/components/CustomInput.tsx","../src/tools/CronScheduler/components/CronCheatsheet.tsx","../src/tools/CronScheduler/components/SchedulePreview.tsx"],"names":["parseWeekDays","parseMonthDays","useMemo","jsx","cn","isWeekdays","jsxs","PresetButton","useState","useEffect","useCallback"],"mappings":";;;;;;;;AAsBO,SAAS,UAAU,KAAA,EAAmC;AAE3D,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,IAAA,EAAM,IAAA,GAAO,CAAA,EAAG,SAAS,CAAA,EAAG,QAAA,GAAW,EAAC,EAAG,SAAA,GAAY,EAAC,EAAG,UAAA,GAAa,IAAG,GAAI,KAAA;AAGvF,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,MAAA,CAAO,IAAI,CAAA,IAAK,CAAC,CAAC,CAAA;AACrD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,MAAA,CAAO,MAAM,CAAA,IAAK,CAAC,CAAC,CAAA;AAGvD,EAAA,MAAM,eAAe,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,WAAW,EAAC;AAC3D,EAAA,MAAM,gBAAgB,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,GAAI,YAAY,EAAC;AAE9D,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,OAAA;AAEH,MAAA,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,MAAA,CAAA;AAAA,IAElB,KAAK,QAAA,EAAU;AAEb,MAAA,MAAM,UAAA,GAAa,CAAC,GAAG,YAAY,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACzD,MAAA,MAAM,UAAU,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,gBAAA,CAAiB,UAAU,CAAA,GAAI,GAAA;AACvE,MAAA,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,QAAQ,OAAO,CAAA,CAAA;AAAA,IACjC;AAAA,IAEA,KAAK,SAAA,EAAW;AAEd,MAAA,MAAM,UAAA,GAAa,CAAC,GAAG,aAAa,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAC1D,MAAA,MAAM,UAAU,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,gBAAA,CAAiB,UAAU,CAAA,GAAI,GAAA;AACvE,MAAA,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,OAAO,CAAA,IAAA,CAAA;AAAA,IAC7B;AAAA,IAEA,KAAK,QAAA;AAEH,MAAA,OAAA,CAAQ,UAAA,IAAc,EAAA,EAAI,IAAA,EAAK,IAAK,WAAA;AAAA,IAEtC;AACE,MAAA,OAAO,WAAA;AAAA;AAEb;AA1CgB,MAAA,CAAA,SAAA,EAAA,WAAA,CAAA;AAgDhB,SAAS,iBAAiB,IAAA,EAAwB;AAChD,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC9B,EAAA,IAAI,KAAK,MAAA,KAAW,CAAA,SAAU,IAAA,CAAK,CAAC,EAAE,QAAA,EAAS;AAE/C,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAC7C,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,KAAA,GAAQ,OAAO,CAAC,CAAA;AACpB,EAAA,IAAI,GAAA,GAAM,OAAO,CAAC,CAAA;AAElB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,GAAA,GAAM,CAAA,EAAG;AAEzB,MAAA,GAAA,GAAM,OAAO,CAAC,CAAA;AAAA,IAChB,CAAA,MAAO;AAEL,MAAA,MAAA,CAAO,IAAA,CAAK,KAAA,KAAU,GAAA,GAAM,CAAA,EAAG,KAAK,KAAK,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AAC1D,MAAA,KAAA,GAAQ,OAAO,CAAC,CAAA;AAChB,MAAA,GAAA,GAAM,OAAO,CAAC,CAAA;AAAA,IAChB;AAAA,EACF;AAGA,EAAA,MAAA,CAAO,IAAA,CAAK,KAAA,KAAU,GAAA,GAAM,CAAA,EAAG,KAAK,KAAK,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AAE1D,EAAA,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AACxB;AAzBS,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;;;AChDF,SAAS,UAAU,IAAA,EAAyC;AACjE,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,IAAA;AAE9C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA;AAGrC,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE/B,EAAA,MAAM,CAAC,UAAA,EAAY,QAAA,EAAU,cAAA,EAAgB,SAAA,EAAW,aAAa,CAAA,GAAI,KAAA;AAGzE,EAAA,IAAI,CAAC,gBAAA,CAAiB,UAAA,EAAY,CAAA,EAAG,EAAE,GAAG,OAAO,IAAA;AACjD,EAAA,IAAI,CAAC,gBAAA,CAAiB,QAAA,EAAU,CAAA,EAAG,EAAE,GAAG,OAAO,IAAA;AAC/C,EAAA,IAAI,CAAC,gBAAA,CAAiB,cAAA,EAAgB,CAAA,EAAG,EAAE,GAAG,OAAO,IAAA;AACrD,EAAA,IAAI,CAAC,gBAAA,CAAiB,SAAA,EAAW,CAAA,EAAG,EAAE,GAAG,OAAO,IAAA;AAChD,EAAA,IAAI,CAAC,gBAAA,CAAiB,aAAA,EAAe,CAAA,EAAG,CAAC,GAAG,OAAO,IAAA;AAGnD,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,UAAiB,CAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,QAAe,CAAA;AAGvC,EAAA,MAAM,MAAA,GAAS,kBAAA;AAAA,IACb,UAAA;AAAA,IACA,QAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,MAAM,IAAA,IAAQ,CAAA;AAAA,IACd,QAAQ,MAAA,IAAU,CAAA;AAAA,IAClB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,UAAA,EAAY,IAAA;AAAA,IACZ,OAAA,EAAS;AAAA,GACX;AACF;AAvCgB,MAAA,CAAA,SAAA,EAAA,WAAA,CAAA;AA6ChB,SAAS,cAAc,IAAA,EAAuB;AAC5C,EAAA,OAAO,IAAA,KAAS,GAAA,IAAO,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAC1C;AAFS,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAOT,SAAS,kBAAA,CACP,UAAA,EACA,QAAA,EACA,cAAA,EACA,WACA,aAAA,EAKA;AAEA,EAAA,IAAI,IAAA,GAAqB,QAAA;AACzB,EAAA,IAAI,WAAsB,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AACxC,EAAA,IAAI,SAAA,GAAwB,CAAC,CAAC,CAAA;AAG9B,EAAA,IAAI,CAAC,aAAA,CAAc,UAAU,KAAK,CAAC,aAAA,CAAc,QAAQ,CAAA,EAAG;AAC1D,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,SAAA,EAAU;AAAA,EAC/C;AAGA,EAAA,IAAI,cAAA,KAAmB,GAAA,IAAO,SAAA,KAAc,GAAA,IAAO,kBAAkB,GAAA,EAAK;AACxE,IAAA,IAAA,GAAO,OAAA;AAAA,EACT,WAES,cAAA,KAAmB,GAAA,IAAO,SAAA,KAAc,GAAA,IAAO,kBAAkB,GAAA,EAAK;AAC7E,IAAA,IAAA,GAAO,QAAA;AACP,IAAA,QAAA,GAAW,cAAc,aAAa,CAAA;AAAA,EACxC,WAES,cAAA,KAAmB,GAAA,IAAO,SAAA,KAAc,GAAA,IAAO,kBAAkB,GAAA,EAAK;AAC7E,IAAA,IAAA,GAAO,SAAA;AACP,IAAA,SAAA,GAAY,eAAe,cAAc,CAAA;AAAA,EAC3C;AAGA,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAU;AACrC;AAtCS,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AA4CT,SAAS,gBAAA,CAAiB,IAAA,EAAc,GAAA,EAAa,GAAA,EAAsB;AACzE,EAAA,IAAI,IAAA,KAAS,KAAK,OAAO,IAAA;AAGzB,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AACtB,IAAA,MAAM,CAAC,IAAA,EAAM,IAAI,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACnC,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,QAAQ,IAAA,CAAK,IAAI,GAAG,OAAO,KAAA;AACzC,IAAA,IAAI,IAAA,KAAS,KAAK,OAAO,IAAA;AAEzB,IAAA,OAAO,gBAAA,CAAiB,IAAA,EAAM,GAAA,EAAK,GAAG,CAAA;AAAA,EACxC;AAGA,EAAA,IAAI,IAAA,CAAK,SAAS,GAAG,CAAA,IAAK,CAAC,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AAC7C,IAAA,MAAM,CAAC,KAAA,EAAO,GAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,QAAA,CAAS,CAAA,EAAG,EAAE,CAAC,CAAA;AAC7D,IAAA,OAAO,CAAC,KAAA,CAAM,KAAK,CAAA,IAAK,CAAC,KAAA,CAAM,GAAG,CAAA,IAAK,KAAA,IAAS,GAAA,IAAO,GAAA,IAAO,GAAA,IAAO,KAAA,IAAS,GAAA;AAAA,EAChF;AAGA,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AACtB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM,CAAA,CAAA,KAAK,gBAAA,CAAiB,CAAA,CAAE,IAAA,EAAK,EAAG,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,EACxE;AAGA,EAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG;AACtB,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,EAAM,EAAE,CAAA;AAC7B,IAAA,OAAO,GAAA,IAAO,OAAO,GAAA,IAAO,GAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,KAAA;AACT;AA9BS,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAmCT,SAAS,UAAA,CAAW,IAAA,EAAc,IAAA,EAAc,IAAA,EAA6B;AAC3E,EAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG;AACtB,IAAA,OAAO,QAAA,CAAS,MAAM,EAAE,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO,IAAA;AACT;AALS,MAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AAWT,SAAS,cAAc,IAAA,EAAyB;AAC9C,EAAA,MAAM,SAAoB,EAAC;AAG3B,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AACtB,IAAA,MAAM,CAAC,KAAA,EAAO,GAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,QAAA,CAAS,CAAA,EAAG,EAAE,CAAC,CAAA;AAC7D,IAAA,IAAI,CAAC,KAAA,CAAM,KAAK,KAAK,CAAC,KAAA,CAAM,GAAG,CAAA,EAAG;AAChC,MAAA,KAAA,IAAS,IAAI,KAAA,EAAO,CAAA,IAAK,GAAA,IAAO,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC3C,QAAA,IAAI,CAAA,IAAK,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,CAAY,CAAA;AAAA,MACtC;AAAA,IACF;AACA,IAAA,OAAO,MAAA,CAAO,SAAS,CAAA,GAAI,MAAA,GAAS,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAA,EACpD;AAGA,EAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,EAAG;AACrC,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,OAAA,CAAQ,IAAA,IAAQ,EAAE,CAAA;AACvC,IAAA,IAAI,CAAC,KAAA,CAAM,GAAG,KAAK,GAAA,IAAO,CAAA,IAAK,OAAO,CAAA,EAAG;AACvC,MAAA,MAAA,CAAO,KAAK,GAAc,CAAA;AAAA,IAC5B;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,SAAS,CAAA,GAAI,MAAA,GAAS,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACpD;AAvBS,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AA6BT,SAAS,eAAe,IAAA,EAA0B;AAChD,EAAA,MAAM,SAAqB,EAAC;AAG5B,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AACtB,IAAA,MAAM,CAAC,KAAA,EAAO,GAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,QAAA,CAAS,CAAA,EAAG,EAAE,CAAC,CAAA;AAC7D,IAAA,IAAI,CAAC,KAAA,CAAM,KAAK,KAAK,CAAC,KAAA,CAAM,GAAG,CAAA,EAAG;AAChC,MAAA,KAAA,IAAS,IAAI,KAAA,EAAO,CAAA,IAAK,GAAA,IAAO,CAAA,IAAK,IAAI,CAAA,EAAA,EAAK;AAC5C,QAAA,IAAI,CAAA,IAAK,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,CAAa,CAAA;AAAA,MACvC;AAAA,IACF;AACA,IAAA,OAAO,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA,EACxC;AAGA,EAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,EAAG;AACrC,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,OAAA,CAAQ,IAAA,IAAQ,EAAE,CAAA;AACvC,IAAA,IAAI,CAAC,KAAA,CAAM,GAAG,KAAK,GAAA,IAAO,CAAA,IAAK,OAAO,EAAA,EAAI;AACxC,MAAA,MAAA,CAAO,KAAK,GAAe,CAAA;AAAA,IAC7B;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,CAAC,CAAC,CAAA;AACxC;AAvBS,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AA4BF,SAAS,YAAY,IAAA,EAAuB;AACjD,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,KAAA;AAE9C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA;AACrC,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAE/B,EAAA,MAAM,CAAC,UAAA,EAAY,QAAA,EAAU,cAAA,EAAgB,SAAA,EAAW,aAAa,CAAA,GAAI,KAAA;AAEzE,EAAA,OACE,gBAAA,CAAiB,YAAY,CAAA,EAAG,EAAE,KAClC,gBAAA,CAAiB,QAAA,EAAU,CAAA,EAAG,EAAE,CAAA,IAChC,gBAAA,CAAiB,gBAAgB,CAAA,EAAG,EAAE,CAAA,IACtC,gBAAA,CAAiB,SAAA,EAAW,CAAA,EAAG,EAAE,CAAA,IACjC,gBAAA,CAAiB,aAAA,EAAe,CAAA,EAAG,CAAC,CAAA;AAExC;AAfgB,MAAA,CAAA,WAAA,EAAA,aAAA,CAAA;;;ACtNhB,IAAM,aAAA,GAAgB,CAAC,KAAA,EAAO,KAAA,EAAO,OAAO,KAAA,EAAO,KAAA,EAAO,OAAO,KAAK,CAAA;AAU/D,SAAS,aAAa,IAAA,EAAsB;AACjD,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,kBAAA;AAE9C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA;AACrC,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,kBAAA;AAE/B,EAAA,MAAM,CAAC,UAAA,EAAY,QAAA,EAAU,cAAA,EAAgB,SAAA,EAAW,aAAa,CAAA,GAAI,KAAA;AAGzE,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,UAAA,EAAY,EAAE,CAAA;AACtC,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,QAAA,EAAU,EAAE,CAAA;AAClC,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,IAAA,EAAM,MAAM,CAAA;AAGvC,EAAA,IAAI,UAAA,KAAe,OAAO,QAAA,KAAa,GAAA,IAAO,mBAAmB,GAAA,IAAO,SAAA,KAAc,GAAA,IAAO,aAAA,KAAkB,GAAA,EAAK;AAClH,IAAA,OAAO,cAAA;AAAA,EACT;AAGA,EAAA,IAAI,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA,EAAG;AAC/B,IAAA,MAAM,WAAW,QAAA,CAAS,UAAA,CAAW,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AACjD,IAAA,IAAI,aAAa,GAAA,EAAK;AACpB,MAAA,OAAO,SAAS,QAAQ,CAAA,OAAA,EAAU,QAAA,GAAW,CAAA,GAAI,MAAM,EAAE,CAAA,CAAA;AAAA,IAC3D;AACA,IAAA,OAAO,CAAA,MAAA,EAAS,QAAQ,CAAA,OAAA,EAAU,QAAA,GAAW,IAAI,GAAA,GAAM,EAAE,YAAY,IAAI,CAAA,CAAA;AAAA,EAC3E;AAGA,EAAA,IAAI,CAAC,KAAA,CAAM,MAAM,CAAA,IAAK,QAAA,KAAa,GAAA,IAAO,cAAA,KAAmB,GAAA,IAAO,SAAA,KAAc,GAAA,IAAO,aAAA,KAAkB,GAAA,EAAK;AAC9G,IAAA,OAAO,wBAAwB,MAAM,CAAA,CAAA;AAAA,EACvC;AAGA,EAAA,IAAI,cAAA,KAAmB,GAAA,IAAO,SAAA,KAAc,GAAA,IAAO,kBAAkB,GAAA,EAAK;AACxE,IAAA,OAAO,gBAAgB,OAAO,CAAA,CAAA;AAAA,EAChC;AAGA,EAAA,IAAI,cAAA,KAAmB,GAAA,IAAO,SAAA,KAAc,GAAA,IAAO,kBAAkB,GAAA,EAAK;AACxE,IAAA,MAAM,IAAA,GAAOA,eAAc,aAAa,CAAA;AAExC,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,OAAO,gBAAgB,OAAO,CAAA,CAAA;AAAA,IAChC;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,IAAK,UAAA,CAAW,IAAI,CAAA,EAAG;AACzC,MAAA,OAAO,eAAe,OAAO,CAAA,CAAA;AAAA,IAC/B;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,IAAK,SAAA,CAAU,IAAI,CAAA,EAAG;AACxC,MAAA,OAAO,eAAe,OAAO,CAAA,CAAA;AAAA,IAC/B;AAEA,IAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,CAAA,KAAK,cAAc,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC1D,IAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,IAAA,EAAO,OAAO,CAAA,CAAA;AAAA,EAClC;AAGA,EAAA,IAAI,cAAA,KAAmB,GAAA,IAAO,SAAA,KAAc,GAAA,IAAO,kBAAkB,GAAA,EAAK;AACxE,IAAA,MAAM,IAAA,GAAOC,gBAAe,cAAc,CAAA;AAE1C,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,OAAO,GAAG,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAC,CAAC,sBAAsB,OAAO,CAAA,CAAA;AAAA,IACzD;AAEA,IAAA,IAAI,IAAA,CAAK,UAAU,CAAA,EAAG;AACpB,MAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,CAAA,CAAA,KAAK,QAAQ,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAClD,MAAA,OAAO,CAAA,EAAG,MAAM,CAAA,mBAAA,EAAsB,OAAO,CAAA,CAAA;AAAA,IAC/C;AAEA,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,mBAAA,EAAsB,OAAO,CAAA,CAAA;AAAA,EACpD;AAGA,EAAA,OAAO,CAAA,eAAA,CAAA;AACT;AA3EgB,MAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAgFhB,SAAS,UAAA,CAAW,MAAc,MAAA,EAAwB;AACxD,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAI,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAI,CAAC,CAAA;AAC1D,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,MAAM,CAAC,CAAA;AAC9D,EAAA,OAAO,CAAA,EAAG,CAAA,CAAE,QAAA,EAAS,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,EAAE,QAAA,EAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAC1E;AAJS,MAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AAoBT,SAASD,eAAc,IAAA,EAAwB;AAC7C,EAAA,MAAM,SAAmB,EAAC;AAG1B,EAAA,IAAI,IAAA,CAAK,SAAS,GAAG,CAAA,IAAK,CAAC,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AAC7C,IAAA,MAAM,CAAC,KAAA,EAAO,GAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,QAAA,CAAS,CAAA,EAAG,EAAE,CAAC,CAAA;AAC7D,IAAA,IAAI,CAAC,KAAA,CAAM,KAAK,KAAK,CAAC,KAAA,CAAM,GAAG,CAAA,EAAG;AAChC,MAAA,KAAA,IAAS,IAAI,KAAA,EAAO,CAAA,IAAK,GAAA,IAAO,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC3C,QAAA,IAAI,CAAA,IAAK,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AAAA,MAC3B;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,EAAG;AAErC,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AACzB,MAAA,MAAM,CAAC,KAAA,EAAO,GAAG,CAAA,GAAI,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,QAAA,CAAS,CAAA,EAAG,EAAE,CAAC,CAAA;AAChE,MAAA,IAAI,CAAC,KAAA,CAAM,KAAK,KAAK,CAAC,KAAA,CAAM,GAAG,CAAA,EAAG;AAChC,QAAA,KAAA,IAAS,IAAI,KAAA,EAAO,CAAA,IAAK,GAAA,IAAO,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC3C,UAAA,IAAI,CAAA,IAAK,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AAAA,QAC3B;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,OAAA,CAAQ,IAAA,IAAQ,EAAE,CAAA;AACvC,MAAA,IAAI,CAAC,KAAA,CAAM,GAAG,KAAK,GAAA,IAAO,CAAA,IAAK,OAAO,CAAA,EAAG;AACvC,QAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AACpC;AAjCS,MAAA,CAAAA,cAAAA,EAAA,eAAA,CAAA;AAsCT,SAASC,gBAAe,IAAA,EAAwB;AAC9C,EAAA,MAAM,SAAmB,EAAC;AAG1B,EAAA,IAAI,IAAA,CAAK,SAAS,GAAG,CAAA,IAAK,CAAC,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AAC7C,IAAA,MAAM,CAAC,KAAA,EAAO,GAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,QAAA,CAAS,CAAA,EAAG,EAAE,CAAC,CAAA;AAC7D,IAAA,IAAI,CAAC,KAAA,CAAM,KAAK,KAAK,CAAC,KAAA,CAAM,GAAG,CAAA,EAAG;AAChC,MAAA,KAAA,IAAS,IAAI,KAAA,EAAO,CAAA,IAAK,GAAA,IAAO,CAAA,IAAK,IAAI,CAAA,EAAA,EAAK;AAC5C,QAAA,IAAI,CAAA,IAAK,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AAAA,MAC3B;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,EAAG;AACrC,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,OAAA,CAAQ,IAAA,IAAQ,EAAE,CAAA;AACvC,IAAA,IAAI,CAAC,KAAA,CAAM,GAAG,KAAK,GAAA,IAAO,CAAA,IAAK,OAAO,EAAA,EAAI;AACxC,MAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AACpC;AAvBS,MAAA,CAAAA,eAAAA,EAAA,gBAAA,CAAA;AA4BT,SAAS,WAAW,IAAA,EAAyB;AAC3C,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAC7C,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,KAAM,WAAA;AAC9B;AAHS,MAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AAQT,SAAS,UAAU,IAAA,EAAyB;AAC1C,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAC7C,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,KAAM,KAAA;AAC9B;AAHS,MAAA,CAAA,SAAA,EAAA,WAAA,CAAA;AAQT,SAAS,QAAQ,CAAA,EAAmB;AAClC,EAAA,MAAM,CAAA,GAAI,CAAC,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AACjC,EAAA,MAAM,IAAI,CAAA,GAAI,GAAA;AACd,EAAA,OAAO,CAAA,IAAK,CAAA,CAAA,CAAG,CAAA,GAAI,EAAA,IAAM,EAAE,KAAK,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,CAAE,CAAC,CAAA,CAAA;AAC7C;AAJS,MAAA,CAAA,OAAA,EAAA,SAAA,CAAA;ACrKT,IAAM,oBAAA,GAAuB,cAAgD,IAAI,CAAA;AAMjF,IAAM,aAAA,GAAoC;AAAA,EACxC,IAAA,EAAM,OAAA;AAAA,EACN,IAAA,EAAM,CAAA;AAAA,EACN,MAAA,EAAQ,CAAA;AAAA,EACR,UAAU,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA;AAAA,EACxB,SAAA,EAAW,CAAC,CAAC,CAAA;AAAA,EACb,UAAA,EAAY,WAAA;AAAA,EACZ,OAAA,EAAS;AACX,CAAA;AAMO,SAAS,qBAAA,CAAsB;AAAA,EACpC,QAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA,GAAc;AAChB,CAAA,EAA+B;AAE7B,EAAA,MAAM,cAAA,GAAiB,OAAO,IAAI,CAAA;AAGlC,EAAA,MAAM,WAAA,GAAc,OAAO,QAAQ,CAAA;AACnC,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAGtB,EAAA,MAAM,CAAC,YAAY,CAAA,GAAI,QAAA,CAAS,MAAM,SAAS,IAAI,CAAA;AAGnD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAA6B,MAAM;AAC3D,IAAA,IAAI;AACF,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,MAAA,GAAS,UAAU,KAAK,CAAA;AAC9B,QAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,MACrB;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO,EAAE,GAAG,aAAA,EAAe,IAAA,EAAM,WAAA,EAAY;AAAA,EAC/C,CAAC,CAAA;AAGD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI;AACF,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,MAAA,GAAS,UAAU,KAAK,CAAA;AAC9B,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAM,WAAA,GAAc,UAAU,KAAK,CAAA;AACnC,UAAA,IAAI,UAAU,WAAA,EAAa;AACzB,YAAA,QAAA,CAAS,MAAM,CAAA;AAAA,UACjB;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAGV,EAAA,MAAM,cAAA,GAAiB,QAAQ,MAAM,SAAA,CAAU,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAG9D,EAAA,MAAM,gBAAA,GAAmB,QAAQ,MAAM,YAAA,CAAa,cAAc,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAIrF,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,MAAA,cAAA,CAAe,OAAA,GAAU,KAAA;AACzB,MAAA;AAAA,IACF;AACA,IAAA,WAAA,CAAY,UAAU,cAAc,CAAA;AAAA,EACtC,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAMnB,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,CAAC,IAAA,KAAuB;AAClD,IAAA,QAAA,CAAS,CAAA,CAAA,MAAM,EAAE,GAAG,CAAA,EAAG,MAAK,CAAE,CAAA;AAAA,EAChC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,CAAC,IAAA,EAAc,MAAA,KAAmB;AAC5D,IAAA,QAAA,CAAS,CAAA,CAAA,MAAM;AAAA,MACb,GAAG,CAAA;AAAA,MACH,IAAA,EAAM,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,MACpC,MAAA,EAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,EAAA,EAAI,MAAM,CAAC;AAAA,KAC1C,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,CAAC,GAAA,KAAiB;AAClD,IAAA,QAAA,CAAS,CAAA,CAAA,KAAK;AACZ,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA;AAEtC,MAAA,IAAI,MAAA,IAAU,CAAA,CAAE,QAAA,CAAS,MAAA,KAAW,GAAG,OAAO,CAAA;AAE9C,MAAA,MAAM,OAAA,GAAU,MAAA,GACZ,CAAA,CAAE,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,KAAM,GAAG,CAAA,GAChC,CAAC,GAAG,CAAA,CAAE,UAAU,GAAG,CAAA;AAEvB,MAAA,OAAO;AAAA,QACL,GAAG,CAAA;AAAA,QACH,UAAU,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC;AAAA,OACxC;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,CAAC,IAAA,KAAoB;AACnD,IAAA,QAAA,CAAS,CAAA,CAAA,MAAM;AAAA,MACb,GAAG,CAAA;AAAA,MACH,UAAU,IAAA,CAAK,MAAA,GAAS,CAAA,GACpB,CAAC,GAAG,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,GAC9B,CAAC,CAAC;AAAA;AAAA,KACR,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,CAAC,GAAA,KAAkB;AACpD,IAAA,QAAA,CAAS,CAAA,CAAA,KAAK;AACZ,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,SAAA,CAAU,QAAA,CAAS,GAAG,CAAA;AAEvC,MAAA,IAAI,MAAA,IAAU,CAAA,CAAE,SAAA,CAAU,MAAA,KAAW,GAAG,OAAO,CAAA;AAE/C,MAAA,MAAM,OAAA,GAAU,MAAA,GACZ,CAAA,CAAE,SAAA,CAAU,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,KAAM,GAAG,CAAA,GACjC,CAAC,GAAG,CAAA,CAAE,WAAW,GAAG,CAAA;AAExB,MAAA,OAAO;AAAA,QACL,GAAG,CAAA;AAAA,QACH,WAAW,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC;AAAA,OACzC;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,IAAA,KAAqB;AACrD,IAAA,QAAA,CAAS,CAAA,CAAA,MAAM;AAAA,MACb,GAAG,CAAA;AAAA,MACH,WAAW,IAAA,CAAK,MAAA,GAAS,CAAA,GACrB,CAAC,GAAG,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,GAC9B,CAAC,CAAC;AAAA;AAAA,KACR,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,CAAC,UAAA,KAAuB;AACxD,IAAA,MAAM,MAAA,GAAS,UAAU,UAAU,CAAA;AACnC,IAAA,QAAA,CAAS,CAAA,CAAA,MAAM;AAAA,MACb,GAAG,CAAA;AAAA,MACH,UAAA;AAAA,MACA,SAAS,MAAA,KAAW;AAAA,KACtB,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,IAAA,QAAA,CAAS,EAAE,GAAG,aAAA,EAAe,IAAA,EAAM,aAAa,CAAA;AAAA,EAClD,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAMhB,EAAA,MAAM,YAAA,GAA0C,OAAA;AAAA,IAC9C,OAAO;AAAA;AAAA,MAEL,GAAG,KAAA;AAAA;AAAA,MAEH,cAAA;AAAA,MACA,gBAAA;AAAA,MACA,YAAA;AAAA;AAAA,MAEA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA;AAAA,MACE,KAAA;AAAA,MACA,cAAA;AAAA,MACA,gBAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,2BACG,oBAAA,CAAqB,QAAA,EAArB,EAA8B,KAAA,EAAO,cACnC,QAAA,EACH,CAAA;AAEJ;AA1LgB,MAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;AAgMT,SAAS,uBAAA,GAAqD;AACnE,EAAA,MAAM,OAAA,GAAU,WAAW,oBAAoB,CAAA;AAC/C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AARgB,MAAA,CAAA,uBAAA,EAAA,yBAAA,CAAA;ACrOT,SAAS,WAAA,GAAc;AAC5B,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,uBAAA,EAAwB;AAClD,EAAA,OAAOC,OAAAA,CAAQ,OAAO,EAAE,IAAA,EAAM,SAAQ,CAAA,EAAI,CAAC,IAAA,EAAM,OAAO,CAAC,CAAA;AAC3D;AAHgB,MAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AAST,SAAS,WAAA,GAAc;AAC5B,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,KAAY,uBAAA,EAAwB;AAC1D,EAAA,OAAOA,OAAAA,CAAQ,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAQ,CAAA,EAAI,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAC,CAAA;AAC3E;AAHgB,MAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AAST,SAAS,eAAA,GAAkB;AAChC,EAAA,MAAM,EAAE,QAAA,EAAU,aAAA,EAAe,WAAA,KAAgB,uBAAA,EAAwB;AACzE,EAAA,OAAOA,OAAAA;AAAA,IACL,OAAO,EAAE,QAAA,EAAU,aAAA,EAAe,WAAA,EAAY,CAAA;AAAA,IAC9C,CAAC,QAAA,EAAU,aAAA,EAAe,WAAW;AAAA,GACvC;AACF;AANgB,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAYT,SAAS,gBAAA,GAAmB;AACjC,EAAA,MAAM,EAAE,SAAA,EAAW,cAAA,EAAgB,YAAA,KAAiB,uBAAA,EAAwB;AAC5E,EAAA,OAAOA,OAAAA;AAAA,IACL,OAAO,EAAE,SAAA,EAAW,cAAA,EAAgB,YAAA,EAAa,CAAA;AAAA,IACjD,CAAC,SAAA,EAAW,cAAA,EAAgB,YAAY;AAAA,GAC1C;AACF;AANgB,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAYT,SAAS,aAAA,GAAgB;AAC9B,EAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAS,aAAA,KAAkB,uBAAA,EAAwB;AACvE,EAAA,OAAOA,OAAAA;AAAA,IACL,OAAO,EAAE,UAAA,EAAY,OAAA,EAAS,aAAA,EAAc,CAAA;AAAA,IAC5C,CAAC,UAAA,EAAY,OAAA,EAAS,aAAa;AAAA,GACrC;AACF;AANgB,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAYT,SAAS,cAAA,GAAiB;AAC/B,EAAA,MAAM,EAAE,cAAA,EAAgB,gBAAA,EAAkB,OAAA,EAAS,YAAA,KAAiB,uBAAA,EAAwB;AAC5F,EAAA,OAAOA,OAAAA;AAAA,IACL,OAAO,EAAE,cAAA,EAAgB,gBAAA,EAAkB,SAAS,YAAA,EAAa,CAAA;AAAA,IACjE,CAAC,cAAA,EAAgB,gBAAA,EAAkB,OAAA,EAAS,YAAY;AAAA,GAC1D;AACF;AANgB,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AAYT,SAAS,gBAAA,GAAmB;AACjC,EAAA,OAAO,uBAAA,EAAwB;AACjC;AAFgB,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;ACrEhB,IAAM,cAAA,GAA2D;AAAA,EAC/D,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,EACjC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,EACnC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,EACrC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA;AAC5B,CAAA;AAOO,SAAS,oBAAA,CAAqB;AAAA,EACnC,QAAA;AAAA,EACA;AACF,CAAA,EAA8B;AAC5B,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,WAAA,EAAY;AAEtC,EAAA,MAAM,gBAAA,GAAmB,EAAA;AAAA,IACvB,iCAAA;AAAA,IACA,+BAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,WAAW,cAAA,CAAe,GAAA,CAAI,CAAC,EAAE,KAAA,EAAO,OAAM,MAAO;AAAA,IACzD,KAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA,EAAW;AAAA,GACb,CAAE,CAAA;AAEF,EAAA,uBACEC,GAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,IAAA;AAAA,MACP,aAAA,EAAe,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAiB,CAAA;AAAA,MAC/C,SAAA,EAAW,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA;AAAA,MAEjC,QAAA,kBAAAA,IAAC,QAAA,EAAA,EAAS,SAAA,EAAU,qCACjB,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,qBACbA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UAEC,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,UAAU,OAAA,CAAQ,QAAA;AAAA,UAClB,WAAW,OAAA,CAAQ,SAAA;AAAA,UAElB,QAAA,EAAA,OAAA,CAAQ;AAAA,SAAA;AAAA,QALJ,OAAA,CAAQ;AAAA,OAOhB,CAAA,EACH;AAAA;AAAA,GACF;AAEJ;AAvCgB,MAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA;ACPhB,IAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAG,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,CAAA;AACpD,IAAM,OAAA,GAAU,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AAQtD,SAAS,YAAA,CAAa;AAAA,EAC3B,MAAA,GAAS,KAAA;AAAA,EACT,QAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,KAAY,WAAA,EAAY;AAE9C,EAAA,MAAM,QAAQ,MAAA,KAAW,KAAA;AACzB,EAAA,MAAM,WAAA,GAAc,KAAA,GAAQ,IAAA,GAAQ,IAAA,GAAO,EAAA,IAAO,EAAA;AAClD,EAAA,MAAM,OAAO,IAAA,IAAQ,EAAA;AAErB,EAAA,MAAM,gBAAA,2BAAoB,KAAA,KAAkB;AAC1C,IAAA,IAAI,OAAA,GAAU,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,IAAI,IAAA,IAAQ,OAAA,KAAY,EAAA,EAAI,OAAA,IAAW,EAAA;AAAA,WAAA,IAC9B,CAAC,IAAA,IAAQ,OAAA,KAAY,EAAA,EAAI,OAAA,GAAU,CAAA;AAAA,IAC9C;AACA,IAAA,OAAA,CAAQ,SAAS,MAAM,CAAA;AAAA,EACzB,CAAA,EAPyB,kBAAA,CAAA;AASzB,EAAA,MAAM,kBAAA,2BAAsB,KAAA,KAAkB;AAC5C,IAAA,OAAA,CAAQ,IAAA,EAAM,QAAA,CAAS,KAAA,EAAO,EAAE,CAAC,CAAA;AAAA,EACnC,CAAA,EAF2B,oBAAA,CAAA;AAI3B,EAAA,MAAM,kBAAA,2BAAsB,KAAA,KAAkB;AAC5C,IAAA,MAAM,UAAU,KAAA,KAAU,IAAA;AAC1B,IAAA,IAAI,OAAA,GAAU,IAAA;AACd,IAAA,IAAI,OAAA,IAAW,IAAA,GAAO,EAAA,EAAI,OAAA,GAAU,IAAA,GAAO,EAAA;AAAA,SAAA,IAClC,CAAC,OAAA,IAAW,IAAA,IAAQ,EAAA,YAAc,IAAA,GAAO,EAAA;AAClD,IAAA,OAAA,CAAQ,SAAS,MAAM,CAAA;AAAA,EACzB,CAAA,EAN2B,oBAAA,CAAA;AAQ3B,EAAA,MAAM,KAAA,GAAQ,KAAA,GAAQ,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,EAAA,EAAG,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAExE,EAAA,4BACG,KAAA,EAAA,EAAI,SAAA,EAAWC,EAAAA,CAAG,yBAAA,EAA2B,SAAS,CAAA,EACrD,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+CAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,sBAC3BA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAU,QAAA,EAAA,QAAA,EAAM;AAAA,KAAA,EAClC,CAAA;AAAA,oBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EAEb,QAAA,EAAA;AAAA,sBAAA,IAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,YAAY,QAAA,EAAS;AAAA,UAC5B,aAAA,EAAe,gBAAA;AAAA,UACf,QAAA;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAA,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,cAAA,EACvB,0BAAAA,GAAAA,CAAC,WAAA,EAAA,EACE,QAAA,EAAA,WAAA,CAAY,QAAA,EAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,GACzC,CAAA,EACF,CAAA;AAAA,4BACAA,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,UAAA,EACtB,gBAAM,GAAA,CAAI,CAAC,CAAA,qBACVA,GAAAA,CAAC,UAAA,EAAA,EAAmB,OAAO,CAAA,CAAE,QAAA,EAAS,EACnC,QAAA,EAAA,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA,EAAA,EADd,CAEjB,CACD,CAAA,EACH;AAAA;AAAA;AAAA,OACF;AAAA,sBAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAoC,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,sBAGrD,IAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,OAAO,QAAA,EAAS;AAAA,UACvB,aAAA,EAAe,kBAAA;AAAA,UACf,QAAA;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAA,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,cAAA,EACvB,0BAAAA,GAAAA,CAAC,WAAA,EAAA,EACE,QAAA,EAAA,MAAA,CAAO,QAAA,EAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,GACpC,CAAA,EACF,CAAA;AAAA,4BACAA,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,UAAA,EACtB,kBAAQ,GAAA,CAAI,CAAC,CAAA,qBACZA,GAAAA,CAAC,UAAA,EAAA,EAAmB,OAAO,CAAA,CAAE,QAAA,EAAS,EACnC,QAAA,EAAA,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA,EAAA,EADd,CAEjB,CACD,CAAA,EACH;AAAA;AAAA;AAAA,OACF;AAAA,MAGC,CAAC,KAAA,oBACA,IAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,OAAO,IAAA,GAAO,IAAA;AAAA,UACrB,aAAA,EAAe,kBAAA;AAAA,UACf,QAAA;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAA,IAAC,aAAA,EAAA,EAAc,SAAA,EAAU,gBACvB,QAAA,kBAAAA,GAAAA,CAAC,eAAY,CAAA,EACf,CAAA;AAAA,iCACC,aAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,IAAA,EAAK,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,8BACzBA,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,MAAK,QAAA,EAAA,IAAA,EAAE;AAAA,aAAA,EAC3B;AAAA;AAAA;AAAA;AACF,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AAvGgB,MAAA,CAAA,YAAA,EAAA,cAAA,CAAA;ACfhB,IAAM,IAAA,GAA4C;AAAA,EAChD,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,KAAA,EAAM;AAAA,EACzB,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,KAAA,EAAM;AAAA,EACzB,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,KAAA,EAAM;AAAA,EACzB,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,KAAA,EAAM;AAAA,EACzB,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,KAAA,EAAM;AAAA,EACzB,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,KAAA,EAAM;AAAA,EACzB,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,KAAA;AACrB,CAAA;AAQO,SAAS,QAAA,CAAS;AAAA,EACvB,QAAA;AAAA,EACA,WAAA,GAAc,IAAA;AAAA,EACd;AACF,CAAA,EAAkB;AAChB,EAAA,MAAM,EAAE,QAAA,EAAU,aAAA,EAAe,WAAA,KAAgB,eAAA,EAAgB;AAGjE,EAAA,MAAM,eAAe,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,WAAW,EAAC;AAG3D,EAAA,MAAME,cAAa,YAAA,CAAa,MAAA,KAAW,CAAA,IAAK,CAAC,GAAE,CAAA,EAAE,CAAA,EAAE,CAAA,EAAE,CAAC,EAAE,KAAA,CAAM,CAAA,CAAA,KAAK,YAAA,CAAa,QAAA,CAAS,CAAY,CAAC,CAAA;AAC1G,EAAA,MAAM,eAAA,GAAkB,YAAA,CAAa,MAAA,KAAW,CAAA,IAAK,CAAC,CAAA,EAAE,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,CAAA,KAAK,YAAA,CAAa,QAAA,CAAS,CAAY,CAAC,CAAA;AACzG,EAAA,MAAM,UAAA,GAAa,aAAa,MAAA,KAAW,CAAA;AAE3C,EAAA,MAAM,aAAa,IAAA,CAAK,GAAA,CAAI,CAAC,EAAE,KAAA,EAAO,OAAM,KAAM;AAChD,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA;AAC9C,IAAA,MAAM,YAAA,GAAe,KAAA,KAAU,CAAA,IAAK,KAAA,KAAU,CAAA;AAE9C,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA,EAAWD,EAAAA;AAAA,QACT,2CAAA;AAAA,QACA,uCAAA;AAAA,QACA,6BAAA;AAAA,QACA,uEAAA;AAAA,QACA,qBAAA;AAAA,QACA,aACI,8CAAA,GACAA,EAAAA;AAAA,UACE,4BAAA;AAAA,UACA,eAAe,0BAAA,GAA6B;AAAA,SAC9C;AAAA,QACJ,QAAA,IAAY;AAAA;AACd,KACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,EAAE,KAAA,EAAO,UAAA,EAAY,QAAA,EAAUC,WAAAA,EAAY,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAe;AAAA,IAC9E,EAAE,OAAO,UAAA,EAAY,QAAA,EAAU,iBAAiB,IAAA,EAAM,CAAC,CAAA,EAAG,CAAC,CAAA,EAAe;AAAA,IAC1E,EAAE,KAAA,EAAO,WAAA,EAAa,QAAA,EAAU,YAAY,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAe,GACvF;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAWF,EAAAA,CAAG,WAAA,EAAa,SAAS,CAAA,EAEvC,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,SAAI,SAAA,EAAU,wBAAA,EACZ,qBAAW,GAAA,CAAI,CAAC,wBACfA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,QAAA;AAAA,QACL,QAAA;AAAA,QACA,OAAA,EAAS,MAAM,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA;AAAA,QACtC,gBAAc,GAAA,CAAI,UAAA;AAAA,QAClB,WAAW,GAAA,CAAI,SAAA;AAAA,QAEf,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,GAAA,CAAI,KAAA,EAAM;AAAA,OAAA;AAAA,MAPZ,GAAA,CAAI;AAAA,KASZ,CAAA,EACH,CAAA;AAAA,IAGC,WAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZA,GAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QAEC,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,OAAA,EAAS,MAAM,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA;AAAA,QACtC;AAAA,OAAA;AAAA,MAJK,MAAA,CAAO;AAAA,KAMf,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAjFgB,MAAA,CAAA,QAAA,EAAA,UAAA,CAAA;AA0FhB,SAAS,aAAa,EAAE,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,UAAS,EAAsB;AAC/E,EAAA,uBACEA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,QAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA,EAAWC,EAAAA;AAAA,QACT,mDAAA;AAAA,QACA,gCAAA;AAAA,QACA,uEAAA;AAAA,QACA,WACI,qDAAA,GACA,+EAAA;AAAA,QACJ,QAAA,IAAY;AAAA,OACd;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;AAnBS,MAAA,CAAA,YAAA,EAAA,cAAA,CAAA;ACzGgB,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,EAAA,EAAG,EAAG,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,GAAI,CAAc;AAGjF,IAAM,SAAA,GAAY,EAAA;AAQX,SAAS,YAAA,CAAa;AAAA,EAC3B,QAAA;AAAA,EACA,WAAA,GAAc,IAAA;AAAA,EACd;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,EAAE,SAAA,EAAW,cAAA,EAAgB,YAAA,KAAiB,gBAAA,EAAiB;AAGrE,EAAA,MAAM,gBAAgB,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,GAAI,YAAY,EAAC;AAG9D,EAAA,MAAM,QAAQ,aAAA,CAAc,MAAA,KAAW,CAAA,IAAK,aAAA,CAAc,CAAC,CAAA,KAAM,CAAA;AACjE,EAAA,MAAM,SAAS,aAAA,CAAc,MAAA,KAAW,CAAA,IAAK,aAAA,CAAc,CAAC,CAAA,KAAM,EAAA;AAClE,EAAA,MAAM,YAAA,GAAe,aAAA,CAAc,MAAA,KAAW,CAAA,IAAK,aAAA,CAAc,SAAS,CAAC,CAAA,IAAK,aAAA,CAAc,QAAA,CAAS,EAAE,CAAA;AAEzG,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,EAAE,OAAO,KAAA,EAAO,QAAA,EAAU,OAAO,IAAA,EAAM,CAAC,CAAC,CAAA,EAAgB;AAAA,IACzD,EAAE,OAAO,MAAA,EAAQ,QAAA,EAAU,QAAQ,IAAA,EAAM,CAAC,EAAE,CAAA,EAAgB;AAAA,IAC5D,EAAE,OAAO,YAAA,EAAc,QAAA,EAAU,cAAc,IAAA,EAAM,CAAC,CAAA,EAAG,EAAE,CAAA;AAAgB,GAC7E;AAGA,EAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,EAAE,QAAQ,SAAA,EAAU,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM;AAC5D,IAAA,MAAM,MAAM,CAAA,GAAI,CAAA;AAChB,IAAA,MAAM,aAAa,GAAA,IAAO,EAAA;AAC1B,IAAA,MAAM,UAAA,GAAa,UAAA,IAAc,aAAA,CAAc,QAAA,CAAS,GAAe,CAAA;AACvE,IAAA,MAAM,iBAAiB,GAAA,GAAM,EAAA;AAE7B,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAkB,GAAA,EAAK,CAAA,EAAE;AAAA,IAC1C;AAEA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,GAAA,EAAK,GAAA;AAAA,MACL,GAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA,EAAWA,EAAAA;AAAA,QACT,gDAAA;AAAA,QACA,gCAAA;AAAA,QACA,6BAAA;AAAA,QACA,uEAAA;AAAA,QACA,qBAAA;AAAA,QACA,aACI,8CAAA,GACAA,EAAAA;AAAA,UACE,+BAAA;AAAA,UACA,iBACI,0BAAA,GACA;AAAA,SACN;AAAA,QACJ,QAAA,IAAY;AAAA;AACd,KACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,iBAAiB,aAAA,CAAc,MAAA;AAErC,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAWF,EAAAA,CAAG,WAAA,EAAa,SAAS,CAAA,EAEtC,QAAA,EAAA;AAAA,IAAA,WAAA,oBACCD,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZA,GAAAA;AAAA,MAACI,aAAAA;AAAA,MAAA;AAAA,QAEC,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,OAAA,EAAS,MAAM,YAAA,CAAa,MAAA,CAAO,IAAI,CAAA;AAAA,QACvC;AAAA,OAAA;AAAA,MAJK,MAAA,CAAO;AAAA,KAMf,CAAA,EACH,CAAA;AAAA,oBAIFJ,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BACZ,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,KAAS;AACvB,MAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,QAAA,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAmB,SAAA,EAAU,eAAA,EAAA,EAApB,KAAK,GAA+B,CAAA;AAAA,MACvD;AAEA,MAAA,uBACEA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,QAAA;AAAA,UACA,OAAA,EAAS,MAAM,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA;AAAA,UACtC,gBAAc,IAAA,CAAK,UAAA;AAAA,UACnB,YAAA,EAAY,CAAA,IAAA,EAAO,IAAA,CAAK,GAAG,CAAA,CAAA;AAAA,UAC3B,WAAW,IAAA,CAAK,SAAA;AAAA,UAEf,QAAA,EAAA,IAAA,CAAK;AAAA,SAAA;AAAA,QARD,IAAA,CAAK;AAAA,OASZ;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA;AAAA,IAGC,iBAAiB,CAAA,oBAChBG,IAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,2CAAA,EACV,QAAA,EAAA;AAAA,MAAA,cAAA;AAAA,MAAe;AAAA,KAAA,EAClB;AAAA,GAAA,EAEJ,CAAA;AAEJ;AA1GgB,MAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAmHhB,SAASC,cAAa,EAAE,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,UAAS,EAAsB;AAC/E,EAAA,uBACEJ,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,QAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA,EAAWC,EAAAA;AAAA,QACT,mDAAA;AAAA,QACA,gCAAA;AAAA,QACA,uEAAA;AAAA,QACA,WACI,qDAAA,GACA,+EAAA;AAAA,QACJ,QAAA,IAAY;AAAA,OACd;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;AAnBS,MAAA,CAAAG,aAAAA,EAAA,cAAA,CAAA;ACxHF,SAAS,WAAA,CAAY,EAAE,QAAA,EAAU,SAAA,EAAU,EAAqB;AACrE,EAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAS,aAAA,KAAkB,aAAA,EAAc;AAC7D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIC,SAAS,UAAU,CAAA;AACvD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,OAAO,CAAA;AAEpD,EAAAC,UAAU,MAAM;AACd,IAAA,aAAA,CAAc,UAAU,CAAA;AACxB,IAAA,aAAA,CAAc,OAAO,CAAA;AAAA,EACvB,CAAA,EAAG,CAAC,UAAA,EAAY,OAAO,CAAC,CAAA;AAExB,EAAA,MAAM,YAAA,2BAAgB,CAAA,KAA2C;AAC/D,IAAA,MAAM,KAAA,GAAQ,EAAE,MAAA,CAAO,KAAA;AACvB,IAAA,aAAA,CAAc,KAAK,CAAA;AACnB,IAAA,MAAM,KAAA,GAAQ,YAAY,KAAK,CAAA;AAC/B,IAAA,aAAA,CAAc,KAAK,CAAA;AACnB,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA,EANqB,cAAA,CAAA;AAQrB,EAAA,uBACEH,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAWF,EAAAA,CAAG,WAAA,EAAa,SAAS,CAAA,EACvC,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,iBAAA,EAAe,CAAA;AAAA,oBAE/DG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,sBAAAH,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,KAAA,EAAO,UAAA;AAAA,UACP,QAAA,EAAU,YAAA;AAAA,UACV,QAAA;AAAA,UACA,WAAA,EAAY,WAAA;AAAA,UACZ,SAAA,EAAWC,EAAAA;AAAA,YACT,gCAAA;AAAA,YACA,CAAC,UAAA,IAAc,UAAA,CAAW,IAAA,EAAK,IAAK;AAAA;AACtC;AAAA,OACF;AAAA,sBACAD,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CACZ,QAAA,EAAA,UAAA,CAAW,IAAA,OACV,UAAA,mBACEA,IAAC,YAAA,EAAA,EAAa,SAAA,EAAU,0BAAyB,CAAA,mBAEjDA,IAAC,WAAA,EAAA,EAAY,SAAA,EAAU,4BAA2B,CAAA,CAAA,EAGxD;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AA9CgB,MAAA,CAAA,WAAA,EAAA,aAAA,CAAA;ACAT,SAAS,cAAA,CAAe,EAAE,SAAA,EAAU,EAAwB;AACjE,EAAA,uBACEG,KAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAH,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EACrB,QAAA,kBAAAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAWC,EAAAA;AAAA,UACT,iDAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,YAAA,EAAW,kBAAA;AAAA,QAEX,QAAA,kBAAAD,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,+BAAA,EAAgC;AAAA;AAAA,KACxD,EACF,CAAA;AAAA,oBACAA,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,UAAA,EAAW,KAAA,EAAM,KAAA,EACzC,QAAA,kBAAAG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAH,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,sBAC9CA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oEAAmE,QAAA,EAAA,4BAAA,EAEnF,CAAA;AAAA,sBAEAG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,0BAC9CA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,MAAA,EAAI;AAAA,SAAA,EACZ,CAAA;AAAA,wBACAG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,0BAC5CA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,MAAA,EAAI;AAAA,SAAA,EACZ,CAAA;AAAA,wBACAG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,0BAC3CA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,MAAA,EAAI;AAAA,SAAA,EACZ,CAAA;AAAA,wBACAG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,0BAC7CA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,MAAA,EAAI;AAAA,SAAA,EACZ,CAAA;AAAA,wBACAG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACb,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,0BAC/CA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,eAAA,EAAa;AAAA,SAAA,EACrB;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACb,QAAA,EAAA;AAAA,wBAAAH,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,oBAAA,EAAkB,CAAA;AAAA,wBACrDG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,4BAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,YAAO;AAAA,WAAA,EAAU,CAAA;AAAA,0BAChEG,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,4BAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,YAAO;AAAA,WAAA,EAAa,CAAA;AAAA,0BACnEG,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,4BAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,YAAO;AAAA,WAAA,EAAY,CAAA;AAAA,0BAClEG,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,4BAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,YAAO;AAAA,WAAA,EAAY;AAAA,SAAA,EACpE;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACb,QAAA,EAAA;AAAA,wBAAAH,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,wBAC3CG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,4BAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,4BACjDA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,cAAA,EAAY;AAAA,WAAA,EACpB,CAAA;AAAA,0BACAG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,4BAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,4BACnDA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,cAAA,EAAY;AAAA,WAAA,EACpB,CAAA;AAAA,0BACAG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,4BAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,4BACpDA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,cAAA,EAAY;AAAA,WAAA,EACpB,CAAA;AAAA,0BACAG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,4BAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,4BACjDA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,cAAA,EAAY;AAAA,WAAA,EACpB;AAAA,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAhFgB,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;ACMT,SAAS,eAAA,CAAgB;AAAA,EAC9B,kBAAA,GAAqB,IAAA;AAAA,EACrB,SAAA,GAAY,KAAA;AAAA,EACZ,gBAAA,GAAmB,IAAA;AAAA,EACnB;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,EAAE,cAAA,EAAgB,gBAAA,EAAkB,OAAA,EAAS,YAAA,KAAiB,cAAA,EAAe;AAGnF,EAAA,MAAM,UAAA,GAAaD,OAAAA;AAAA,IACjB,MAAM,gBAAA,IAAoB,YAAA,IAAgB,YAAA,KAAiB,cAAA;AAAA,IAC3D,CAAC,gBAAA,EAAkB,YAAA,EAAc,cAAc;AAAA,GACjD;AACA,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIM,SAAS,KAAK,CAAA;AAE1C,EAAA,MAAM,UAAA,GAAaE,YAAY,YAAY;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,cAAc,CAAA;AAClD,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,UAAA,CAAW,MAAM,SAAA,CAAU,KAAK,CAAA,EAAG,GAAI,CAAA;AAAA,IACzC,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,mBAAmB,GAAG,CAAA;AAAA,IACtC;AAAA,EACF,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,EAAA,uBACEJ,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWF,EAAAA;AAAA,QACT,+BAAA;AAAA,QACA,8BAAA;AAAA,QACA,CAAC,OAAA,IAAW,wCAAA;AAAA,QACZ;AAAA,OACF;AAAA,MAGA,QAAA,EAAA;AAAA,wBAAAE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACb,QAAA,EAAA;AAAA,4BAAAH,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAWC,EAAAA;AAAA,kBACT,kBAAA;AAAA,kBACA,UAAU,cAAA,GAAiB;AAAA;AAC7B;AAAA,aACF;AAAA,4BACAD,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAWC,EAAAA;AAAA,kBACT,SAAA;AAAA,kBACA,UAAU,iBAAA,GAAoB;AAAA,iBAChC;AAAA,gBAEC,QAAA,EAAA;AAAA;AAAA;AACH,WAAA,EACF,CAAA;AAAA,UAGC,6BACCD,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,UAAA;AAAA,cACT,UAAU,CAAC,OAAA;AAAA,cACX,SAAA,EAAWC,EAAAA;AAAA,gBACT,4CAAA;AAAA,gBACA,sFAAA;AAAA,gBACA;AAAA,eACF;AAAA,cACA,KAAA,EAAO,SAAS,SAAA,GAAY,sBAAA;AAAA,cAE3B,QAAA,EAAA,MAAA,mBACCD,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,4BAAA,EAA6B,CAAA,mBAE9CA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EAAoC;AAAA;AAAA;AAExD,SAAA,EAEJ,CAAA;AAAA,QAGC,kBAAA,oBACCG,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2EAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACZ,QAAA,EAAA;AAAA,YAAA,UAAA,oBACCA,KAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yDAAA,EACb,QAAA,EAAA,YAAA,EACH,CAAA;AAAA,8BACAA,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,2CAAA,EAA4C;AAAA,aAAA,EACpE,CAAA;AAAA,4BAEFA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CACb,QAAA,EAAA,cAAA,EACH;AAAA,WAAA,EACF,CAAA;AAAA,0BACAA,IAAC,cAAA,EAAA,EAAe;AAAA,SAAA,EAClB;AAAA;AAAA;AAAA,GAEJ;AAEJ;AAhGgB,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA","file":"chunk-QIAP4G5L.mjs","sourcesContent":["/**\n * Cron Builder\n *\n * Converts CronSchedulerState to Unix 5-field cron expression\n * Format: minute hour day-of-month month day-of-week\n */\n\nimport type { CronSchedulerState } from '../types';\n\n/**\n * Builds Unix 5-field cron expression from state\n *\n * @example\n * // Daily at 9:00\n * buildCron({ type: 'daily', hour: 9, minute: 0, ... }) // '0 9 * * *'\n *\n * // Weekly on Mon, Wed, Fri at 14:30\n * buildCron({ type: 'weekly', hour: 14, minute: 30, weekDays: [1, 3, 5], ... }) // '30 14 * * 1,3,5'\n *\n * // Monthly on 1st and 15th at 0:00\n * buildCron({ type: 'monthly', hour: 0, minute: 0, monthDays: [1, 15], ... }) // '0 0 1,15 * *'\n */\nexport function buildCron(state: CronSchedulerState): string {\n // Guard against invalid state\n if (!state || typeof state !== 'object') {\n return '0 0 * * *';\n }\n\n const { type, hour = 0, minute = 0, weekDays = [], monthDays = [], customCron = '' } = state;\n\n // Ensure valid hour/minute\n const h = Math.max(0, Math.min(23, Number(hour) || 0));\n const m = Math.max(0, Math.min(59, Number(minute) || 0));\n\n // Ensure arrays\n const safeWeekDays = Array.isArray(weekDays) ? weekDays : [];\n const safeMonthDays = Array.isArray(monthDays) ? monthDays : [];\n\n switch (type) {\n case 'daily':\n // Run every day at specified time\n return `${m} ${h} * * *`;\n\n case 'weekly': {\n // Run on specified days of week at specified time\n const sortedDays = [...safeWeekDays].sort((a, b) => a - b);\n const daysStr = sortedDays.length > 0 ? formatNumberList(sortedDays) : '*';\n return `${m} ${h} * * ${daysStr}`;\n }\n\n case 'monthly': {\n // Run on specified days of month at specified time\n const sortedDays = [...safeMonthDays].sort((a, b) => a - b);\n const daysStr = sortedDays.length > 0 ? formatNumberList(sortedDays) : '1';\n return `${m} ${h} ${daysStr} * *`;\n }\n\n case 'custom':\n // Return user-provided expression\n return (customCron || '').trim() || '* * * * *';\n\n default:\n return '0 0 * * *';\n }\n}\n\n/**\n * Formats a list of numbers as ranges where possible\n * [1,2,3,5,7,8,9] -> \"1-3,5,7-9\"\n */\nfunction formatNumberList(nums: number[]): string {\n if (nums.length === 0) return '';\n if (nums.length === 1) return nums[0].toString();\n\n const sorted = [...nums].sort((a, b) => a - b);\n const ranges: string[] = [];\n let start = sorted[0];\n let end = sorted[0];\n\n for (let i = 1; i < sorted.length; i++) {\n if (sorted[i] === end + 1) {\n // Continue the range\n end = sorted[i];\n } else {\n // End current range, start new one\n ranges.push(start === end ? `${start}` : `${start}-${end}`);\n start = sorted[i];\n end = sorted[i];\n }\n }\n\n // Don't forget the last range\n ranges.push(start === end ? `${start}` : `${start}-${end}`);\n\n return ranges.join(',');\n}\n\n/**\n * Builds cron for a specific schedule type with defaults\n */\nexport function buildDefaultCron(type: CronSchedulerState['type']): string {\n const defaults: Record<typeof type, string> = {\n daily: '0 9 * * *', // Every day at 9:00\n weekly: '0 9 * * 1-5', // Weekdays at 9:00\n monthly: '0 9 1 * *', // 1st of month at 9:00\n custom: '* * * * *', // Every minute\n };\n return defaults[type];\n}\n","/**\n * Cron Parser\n *\n * Parses Unix 5-field cron expression into CronSchedulerState\n * Format: minute hour day-of-month month day-of-week\n */\n\nimport type { CronSchedulerState, ScheduleType, WeekDay, MonthDay } from '../types';\n\n/**\n * Parses Unix 5-field cron expression into state\n *\n * @param cron - Cron expression to parse\n * @returns Parsed state or null if invalid\n *\n * @example\n * parseCron('0 9 * * *')\n * // { type: 'daily', hour: 9, minute: 0, ... }\n *\n * parseCron('30 14 * * 1,3,5')\n * // { type: 'weekly', hour: 14, minute: 30, weekDays: [1, 3, 5], ... }\n */\nexport function parseCron(cron: string): CronSchedulerState | null {\n if (!cron || typeof cron !== 'string') return null;\n\n const parts = cron.trim().split(/\\s+/);\n\n // Unix cron has exactly 5 fields\n if (parts.length !== 5) return null;\n\n const [minutePart, hourPart, dayOfMonthPart, monthPart, dayOfWeekPart] = parts;\n\n // Validate all fields have valid cron syntax\n if (!isValidCronField(minutePart, 0, 59)) return null;\n if (!isValidCronField(hourPart, 0, 23)) return null;\n if (!isValidCronField(dayOfMonthPart, 1, 31)) return null;\n if (!isValidCronField(monthPart, 1, 12)) return null;\n if (!isValidCronField(dayOfWeekPart, 0, 6)) return null;\n\n // Parse simple numeric values for hour/minute (for UI state)\n const minute = parseField(minutePart, 0, 59);\n const hour = parseField(hourPart, 0, 23);\n\n // Determine schedule type based on field patterns\n const result = detectScheduleType(\n minutePart,\n hourPart,\n dayOfMonthPart,\n monthPart,\n dayOfWeekPart\n );\n\n return {\n type: result.type,\n hour: hour ?? 0,\n minute: minute ?? 0,\n weekDays: result.weekDays,\n monthDays: result.monthDays,\n customCron: cron,\n isValid: true,\n };\n}\n\n/**\n * Checks if a field is a simple value (number or *)\n * Complex patterns like ranges, lists, steps are NOT simple\n */\nfunction isSimpleField(part: string): boolean {\n return part === '*' || /^\\d+$/.test(part);\n}\n\n/**\n * Detects schedule type from cron fields\n */\nfunction detectScheduleType(\n minutePart: string,\n hourPart: string,\n dayOfMonthPart: string,\n monthPart: string,\n dayOfWeekPart: string\n): {\n type: ScheduleType;\n weekDays: WeekDay[];\n monthDays: MonthDay[];\n} {\n // Default values\n let type: ScheduleType = 'custom';\n let weekDays: WeekDay[] = [1, 2, 3, 4, 5]; // Mon-Fri\n let monthDays: MonthDay[] = [1];\n\n // If minute or hour have complex patterns (ranges, steps, lists) -> custom\n if (!isSimpleField(minutePart) || !isSimpleField(hourPart)) {\n return { type: 'custom', weekDays, monthDays };\n }\n\n // Daily: M H * * * (simple minute and hour, rest are *)\n if (dayOfMonthPart === '*' && monthPart === '*' && dayOfWeekPart === '*') {\n type = 'daily';\n }\n // Weekly: M H * * 1,2,3 (or ranges like 1-5)\n else if (dayOfMonthPart === '*' && monthPart === '*' && dayOfWeekPart !== '*') {\n type = 'weekly';\n weekDays = parseWeekDays(dayOfWeekPart);\n }\n // Monthly: M H 1,15 * * (day-of-month specified)\n else if (dayOfMonthPart !== '*' && monthPart === '*' && dayOfWeekPart === '*') {\n type = 'monthly';\n monthDays = parseMonthDays(dayOfMonthPart);\n }\n // Everything else is custom\n\n return { type, weekDays, monthDays };\n}\n\n/**\n * Validates a cron field has valid syntax\n * Supports: asterisk, number, range (1-5), list (1,3,5), step (star/15, 1-5/2)\n */\nfunction isValidCronField(part: string, min: number, max: number): boolean {\n if (part === '*') return true;\n\n // Step pattern: */N or range/N\n if (part.includes('/')) {\n const [base, step] = part.split('/');\n if (!step || !/^\\d+$/.test(step)) return false;\n if (base === '*') return true;\n // Validate base part (range or number)\n return isValidCronField(base, min, max);\n }\n\n // Range pattern: N-M\n if (part.includes('-') && !part.includes(',')) {\n const [start, end] = part.split('-').map(s => parseInt(s, 10));\n return !isNaN(start) && !isNaN(end) && start >= min && end <= max && start <= end;\n }\n\n // List pattern: N,M,O\n if (part.includes(',')) {\n return part.split(',').every(p => isValidCronField(p.trim(), min, max));\n }\n\n // Simple number\n if (/^\\d+$/.test(part)) {\n const num = parseInt(part, 10);\n return num >= min && num <= max;\n }\n\n return false;\n}\n\n/**\n * Parses a single numeric field (simple number only)\n */\nfunction parseField(part: string, _min: number, _max: number): number | null {\n if (/^\\d+$/.test(part)) {\n return parseInt(part, 10);\n }\n return null;\n}\n\n/**\n * Parses week days from cron field\n * Supports: 1,2,3 or 1-5 or MON,WED,FRI\n */\nfunction parseWeekDays(part: string): WeekDay[] {\n const result: WeekDay[] = [];\n\n // Handle ranges like 1-5\n if (part.includes('-')) {\n const [start, end] = part.split('-').map(s => parseInt(s, 10));\n if (!isNaN(start) && !isNaN(end)) {\n for (let i = start; i <= end && i <= 6; i++) {\n if (i >= 0) result.push(i as WeekDay);\n }\n }\n return result.length > 0 ? result : [1, 2, 3, 4, 5];\n }\n\n // Handle comma-separated list\n for (const segment of part.split(',')) {\n const num = parseInt(segment.trim(), 10);\n if (!isNaN(num) && num >= 0 && num <= 6) {\n result.push(num as WeekDay);\n }\n }\n\n return result.length > 0 ? result : [1, 2, 3, 4, 5];\n}\n\n/**\n * Parses month days from cron field\n * Supports: 1,15 or 1-15\n */\nfunction parseMonthDays(part: string): MonthDay[] {\n const result: MonthDay[] = [];\n\n // Handle ranges like 1-15\n if (part.includes('-')) {\n const [start, end] = part.split('-').map(s => parseInt(s, 10));\n if (!isNaN(start) && !isNaN(end)) {\n for (let i = start; i <= end && i <= 31; i++) {\n if (i >= 1) result.push(i as MonthDay);\n }\n }\n return result.length > 0 ? result : [1];\n }\n\n // Handle comma-separated list\n for (const segment of part.split(',')) {\n const num = parseInt(segment.trim(), 10);\n if (!isNaN(num) && num >= 1 && num <= 31) {\n result.push(num as MonthDay);\n }\n }\n\n return result.length > 0 ? result : [1];\n}\n\n/**\n * Validates cron expression syntax\n */\nexport function isValidCron(cron: string): boolean {\n if (!cron || typeof cron !== 'string') return false;\n\n const parts = cron.trim().split(/\\s+/);\n if (parts.length !== 5) return false;\n\n const [minutePart, hourPart, dayOfMonthPart, monthPart, dayOfWeekPart] = parts;\n\n return (\n isValidCronField(minutePart, 0, 59) &&\n isValidCronField(hourPart, 0, 23) &&\n isValidCronField(dayOfMonthPart, 1, 31) &&\n isValidCronField(monthPart, 1, 12) &&\n isValidCronField(dayOfWeekPart, 0, 6)\n );\n}\n","/**\n * Cron Humanize\n *\n * Converts cron expressions to human-readable descriptions\n */\n\nconst WEEKDAY_NAMES = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\nconst WEEKDAY_SHORT = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\n/**\n * Converts cron expression to human-readable description\n *\n * Examples:\n * - humanizeCron('0 9 * * *') returns \"Every day at 09:00\"\n * - humanizeCron('30 14 * * 1,3,5') returns \"Mon, Wed, Fri at 14:30\"\n * - humanizeCron('0 0 1 * *') returns \"1st of every month at 00:00\"\n */\nexport function humanizeCron(cron: string): string {\n if (!cron || typeof cron !== 'string') return 'Invalid schedule';\n\n const parts = cron.trim().split(/\\s+/);\n if (parts.length !== 5) return 'Invalid schedule';\n\n const [minutePart, hourPart, dayOfMonthPart, monthPart, dayOfWeekPart] = parts;\n\n // Parse time\n const minute = parseInt(minutePart, 10);\n const hour = parseInt(hourPart, 10);\n const timeStr = formatTime(hour, minute);\n\n // Every minute\n if (minutePart === '*' && hourPart === '*' && dayOfMonthPart === '*' && monthPart === '*' && dayOfWeekPart === '*') {\n return 'Every minute';\n }\n\n // Every N minutes\n if (minutePart.startsWith('*/')) {\n const interval = parseInt(minutePart.slice(2), 10);\n if (hourPart === '*') {\n return `Every ${interval} minute${interval > 1 ? 's' : ''}`;\n }\n return `Every ${interval} minute${interval > 1 ? 's' : ''} at hour ${hour}`;\n }\n\n // Hourly\n if (!isNaN(minute) && hourPart === '*' && dayOfMonthPart === '*' && monthPart === '*' && dayOfWeekPart === '*') {\n return `Every hour at minute ${minute}`;\n }\n\n // Daily\n if (dayOfMonthPart === '*' && monthPart === '*' && dayOfWeekPart === '*') {\n return `Every day at ${timeStr}`;\n }\n\n // Weekly\n if (dayOfMonthPart === '*' && monthPart === '*' && dayOfWeekPart !== '*') {\n const days = parseWeekDays(dayOfWeekPart);\n\n if (days.length === 7) {\n return `Every day at ${timeStr}`;\n }\n\n if (days.length === 5 && isWeekdays(days)) {\n return `Weekdays at ${timeStr}`;\n }\n\n if (days.length === 2 && isWeekend(days)) {\n return `Weekends at ${timeStr}`;\n }\n\n const dayNames = days.map(d => WEEKDAY_SHORT[d]).join(', ');\n return `${dayNames} at ${timeStr}`;\n }\n\n // Monthly\n if (dayOfMonthPart !== '*' && monthPart === '*' && dayOfWeekPart === '*') {\n const days = parseMonthDays(dayOfMonthPart);\n\n if (days.length === 1) {\n return `${ordinal(days[0])} of every month at ${timeStr}`;\n }\n\n if (days.length <= 3) {\n const dayStr = days.map(d => ordinal(d)).join(', ');\n return `${dayStr} of every month at ${timeStr}`;\n }\n\n return `${days.length} days per month at ${timeStr}`;\n }\n\n // Complex expression - show as-is\n return `Custom schedule`;\n}\n\n/**\n * Formats time as HH:MM\n */\nfunction formatTime(hour: number, minute: number): string {\n const h = isNaN(hour) ? 0 : Math.max(0, Math.min(23, hour));\n const m = isNaN(minute) ? 0 : Math.max(0, Math.min(59, minute));\n return `${h.toString().padStart(2, '0')}:${m.toString().padStart(2, '0')}`;\n}\n\n/**\n * Formats time in 12-hour format with AM/PM\n */\nexport function formatTime12h(hour: number, minute: number): string {\n const h = isNaN(hour) ? 0 : Math.max(0, Math.min(23, hour));\n const m = isNaN(minute) ? 0 : Math.max(0, Math.min(59, minute));\n const period = h >= 12 ? 'PM' : 'AM';\n const h12 = h % 12 || 12;\n return `${h12}:${m.toString().padStart(2, '0')} ${period}`;\n}\n\n/**\n * Parses week days from cron field\n */\nfunction parseWeekDays(part: string): number[] {\n const result: number[] = [];\n\n // Handle ranges like 1-5\n if (part.includes('-') && !part.includes(',')) {\n const [start, end] = part.split('-').map(s => parseInt(s, 10));\n if (!isNaN(start) && !isNaN(end)) {\n for (let i = start; i <= end && i <= 6; i++) {\n if (i >= 0) result.push(i);\n }\n }\n return result;\n }\n\n // Handle comma-separated list\n for (const segment of part.split(',')) {\n // Handle nested ranges\n if (segment.includes('-')) {\n const [start, end] = segment.split('-').map(s => parseInt(s, 10));\n if (!isNaN(start) && !isNaN(end)) {\n for (let i = start; i <= end && i <= 6; i++) {\n if (i >= 0) result.push(i);\n }\n }\n } else {\n const num = parseInt(segment.trim(), 10);\n if (!isNaN(num) && num >= 0 && num <= 6) {\n result.push(num);\n }\n }\n }\n\n return result.sort((a, b) => a - b);\n}\n\n/**\n * Parses month days from cron field\n */\nfunction parseMonthDays(part: string): number[] {\n const result: number[] = [];\n\n // Handle ranges\n if (part.includes('-') && !part.includes(',')) {\n const [start, end] = part.split('-').map(s => parseInt(s, 10));\n if (!isNaN(start) && !isNaN(end)) {\n for (let i = start; i <= end && i <= 31; i++) {\n if (i >= 1) result.push(i);\n }\n }\n return result;\n }\n\n // Handle comma-separated list\n for (const segment of part.split(',')) {\n const num = parseInt(segment.trim(), 10);\n if (!isNaN(num) && num >= 1 && num <= 31) {\n result.push(num);\n }\n }\n\n return result.sort((a, b) => a - b);\n}\n\n/**\n * Checks if days array represents weekdays (Mon-Fri)\n */\nfunction isWeekdays(days: number[]): boolean {\n const sorted = [...days].sort((a, b) => a - b);\n return sorted.join(',') === '1,2,3,4,5';\n}\n\n/**\n * Checks if days array represents weekend (Sat-Sun)\n */\nfunction isWeekend(days: number[]): boolean {\n const sorted = [...days].sort((a, b) => a - b);\n return sorted.join(',') === '0,6';\n}\n\n/**\n * Returns ordinal suffix for a number (1st, 2nd, 3rd, etc.)\n */\nfunction ordinal(n: number): string {\n const s = ['th', 'st', 'nd', 'rd'];\n const v = n % 100;\n return n + (s[(v - 20) % 10] || s[v] || s[0]);\n}\n\n/**\n * Gets full weekday name\n */\nexport function getWeekdayName(day: number): string {\n return WEEKDAY_NAMES[day] || 'Unknown';\n}\n\n/**\n * Gets short weekday name\n */\nexport function getWeekdayShort(day: number): string {\n return WEEKDAY_SHORT[day] || '?';\n}\n","'use client';\n\n/**\n * CronScheduler Context\n *\n * Provides centralized state management for the CronScheduler component.\n * All child components subscribe to this context for state and actions.\n */\n\nimport {\n createContext,\n useContext,\n useMemo,\n useCallback,\n useState,\n useEffect,\n useRef,\n} from 'react';\nimport type {\n CronSchedulerContextValue,\n CronSchedulerState,\n CronSchedulerProviderProps,\n ScheduleType,\n WeekDay,\n MonthDay,\n} from '../types';\nimport { buildCron } from '../utils/cron-builder';\nimport { parseCron } from '../utils/cron-parser';\nimport { humanizeCron } from '../utils/cron-humanize';\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst CronSchedulerContext = createContext<CronSchedulerContextValue | null>(null);\n\n// ============================================================================\n// Default State\n// ============================================================================\n\nconst DEFAULT_STATE: CronSchedulerState = {\n type: 'daily',\n hour: 9,\n minute: 0,\n weekDays: [1, 2, 3, 4, 5] as WeekDay[], // Mon-Fri\n monthDays: [1] as MonthDay[],\n customCron: '* * * * *',\n isValid: true,\n};\n\n// ============================================================================\n// Provider\n// ============================================================================\n\nexport function CronSchedulerProvider({\n children,\n value,\n onChange,\n defaultType = 'daily',\n}: CronSchedulerProviderProps) {\n // Track if this is initial mount to avoid calling onChange on mount\n const isInitialMount = useRef(true);\n\n // Store onChange in a ref to avoid triggering effects when it changes\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n // Track initial value from props (for showing \"original\" vs \"current\")\n const [initialValue] = useState(() => value || null);\n\n // Initialize state from value prop or defaults\n const [state, setState] = useState<CronSchedulerState>(() => {\n try {\n if (value) {\n const parsed = parseCron(value);\n if (parsed) return parsed;\n }\n } catch {\n // Fallback to default on any parsing error\n }\n return { ...DEFAULT_STATE, type: defaultType };\n });\n\n // Sync with external value (controlled component support)\n useEffect(() => {\n try {\n if (value) {\n const parsed = parseCron(value);\n if (parsed) {\n const currentCron = buildCron(state);\n if (value !== currentCron) {\n setState(parsed);\n }\n }\n }\n } catch {\n // Ignore parsing errors, keep current state\n }\n }, [value]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Computed: cron expression\n const cronExpression = useMemo(() => buildCron(state), [state]);\n\n // Computed: human-readable description\n const humanDescription = useMemo(() => humanizeCron(cronExpression), [cronExpression]);\n\n // Notify parent on change (skip initial mount)\n // Use ref to avoid re-triggering when onChange identity changes\n useEffect(() => {\n if (isInitialMount.current) {\n isInitialMount.current = false;\n return;\n }\n onChangeRef.current?.(cronExpression);\n }, [cronExpression]);\n\n // ============================================================================\n // Actions\n // ============================================================================\n\n const setType = useCallback((type: ScheduleType) => {\n setState(s => ({ ...s, type }));\n }, []);\n\n const setTime = useCallback((hour: number, minute: number) => {\n setState(s => ({\n ...s,\n hour: Math.max(0, Math.min(23, hour)),\n minute: Math.max(0, Math.min(59, minute)),\n }));\n }, []);\n\n const toggleWeekDay = useCallback((day: WeekDay) => {\n setState(s => {\n const hasDay = s.weekDays.includes(day);\n // Prevent deselecting the last day\n if (hasDay && s.weekDays.length === 1) return s;\n\n const newDays = hasDay\n ? s.weekDays.filter(d => d !== day)\n : [...s.weekDays, day];\n\n return {\n ...s,\n weekDays: newDays.sort((a, b) => a - b) as WeekDay[],\n };\n });\n }, []);\n\n const setWeekDays = useCallback((days: WeekDay[]) => {\n setState(s => ({\n ...s,\n weekDays: days.length > 0\n ? [...days].sort((a, b) => a - b) as WeekDay[]\n : [1] as WeekDay[], // Default to Monday if empty\n }));\n }, []);\n\n const toggleMonthDay = useCallback((day: MonthDay) => {\n setState(s => {\n const hasDay = s.monthDays.includes(day);\n // Prevent deselecting the last day\n if (hasDay && s.monthDays.length === 1) return s;\n\n const newDays = hasDay\n ? s.monthDays.filter(d => d !== day)\n : [...s.monthDays, day];\n\n return {\n ...s,\n monthDays: newDays.sort((a, b) => a - b) as MonthDay[],\n };\n });\n }, []);\n\n const setMonthDays = useCallback((days: MonthDay[]) => {\n setState(s => ({\n ...s,\n monthDays: days.length > 0\n ? [...days].sort((a, b) => a - b) as MonthDay[]\n : [1] as MonthDay[], // Default to 1st if empty\n }));\n }, []);\n\n const setCustomCron = useCallback((customCron: string) => {\n const parsed = parseCron(customCron);\n setState(s => ({\n ...s,\n customCron,\n isValid: parsed !== null,\n }));\n }, []);\n\n const reset = useCallback(() => {\n setState({ ...DEFAULT_STATE, type: defaultType });\n }, [defaultType]);\n\n // ============================================================================\n // Context Value\n // ============================================================================\n\n const contextValue: CronSchedulerContextValue = useMemo(\n () => ({\n // State\n ...state,\n // Computed\n cronExpression,\n humanDescription,\n initialValue,\n // Actions\n setType,\n setTime,\n toggleWeekDay,\n setWeekDays,\n toggleMonthDay,\n setMonthDays,\n setCustomCron,\n reset,\n }),\n [\n state,\n cronExpression,\n humanDescription,\n initialValue,\n setType,\n setTime,\n toggleWeekDay,\n setWeekDays,\n toggleMonthDay,\n setMonthDays,\n setCustomCron,\n reset,\n ]\n );\n\n return (\n <CronSchedulerContext.Provider value={contextValue}>\n {children}\n </CronSchedulerContext.Provider>\n );\n}\n\n// ============================================================================\n// Context Hook\n// ============================================================================\n\nexport function useCronSchedulerContext(): CronSchedulerContextValue {\n const context = useContext(CronSchedulerContext);\n if (!context) {\n throw new Error(\n 'useCronSchedulerContext must be used within CronSchedulerProvider'\n );\n }\n return context;\n}\n","'use client';\n\n/**\n * CronScheduler Hooks\n *\n * Selective subscription hooks for optimal re-renders.\n * Each hook returns only the data it needs, preventing\n * unnecessary re-renders when unrelated state changes.\n */\n\nimport { useMemo } from 'react';\nimport { useCronSchedulerContext } from './CronSchedulerContext';\n\n/**\n * Hook for schedule type selection\n * Re-renders only when type changes\n */\nexport function useCronType() {\n const { type, setType } = useCronSchedulerContext();\n return useMemo(() => ({ type, setType }), [type, setType]);\n}\n\n/**\n * Hook for time selection\n * Re-renders only when hour/minute changes\n */\nexport function useCronTime() {\n const { hour, minute, setTime } = useCronSchedulerContext();\n return useMemo(() => ({ hour, minute, setTime }), [hour, minute, setTime]);\n}\n\n/**\n * Hook for week days selection\n * Re-renders only when weekDays changes\n */\nexport function useCronWeekDays() {\n const { weekDays, toggleWeekDay, setWeekDays } = useCronSchedulerContext();\n return useMemo(\n () => ({ weekDays, toggleWeekDay, setWeekDays }),\n [weekDays, toggleWeekDay, setWeekDays]\n );\n}\n\n/**\n * Hook for month days selection\n * Re-renders only when monthDays changes\n */\nexport function useCronMonthDays() {\n const { monthDays, toggleMonthDay, setMonthDays } = useCronSchedulerContext();\n return useMemo(\n () => ({ monthDays, toggleMonthDay, setMonthDays }),\n [monthDays, toggleMonthDay, setMonthDays]\n );\n}\n\n/**\n * Hook for custom cron input\n * Re-renders only when customCron/isValid changes\n */\nexport function useCronCustom() {\n const { customCron, isValid, setCustomCron } = useCronSchedulerContext();\n return useMemo(\n () => ({ customCron, isValid, setCustomCron }),\n [customCron, isValid, setCustomCron]\n );\n}\n\n/**\n * Hook for preview display\n * Re-renders only when computed values change\n */\nexport function useCronPreview() {\n const { cronExpression, humanDescription, isValid, initialValue } = useCronSchedulerContext();\n return useMemo(\n () => ({ cronExpression, humanDescription, isValid, initialValue }),\n [cronExpression, humanDescription, isValid, initialValue]\n );\n}\n\n/**\n * Full context access\n * Use sparingly - causes re-render on any state change\n */\nexport function useCronScheduler() {\n return useCronSchedulerContext();\n}\n","'use client';\n\n/**\n * ScheduleTypeSelector\n *\n * Segmented control for selecting schedule type.\n * Uses Tabs from ui-core styled as a compact segmented control.\n */\n\nimport { Tabs, TabsList, TabsTrigger } from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { useCronType } from '../context/hooks';\nimport type { ScheduleType } from '../types';\n\nconst SCHEDULE_TYPES: { value: ScheduleType; label: string }[] = [\n { value: 'daily', label: 'Daily' },\n { value: 'weekly', label: 'Weekly' },\n { value: 'monthly', label: 'Monthly' },\n { value: 'custom', label: 'Custom' },\n];\n\nexport interface ScheduleTypeSelectorProps {\n disabled?: boolean;\n className?: string;\n}\n\nexport function ScheduleTypeSelector({\n disabled,\n className,\n}: ScheduleTypeSelectorProps) {\n const { type, setType } = useCronType();\n\n const triggerClassName = cn(\n 'text-xs font-medium px-2 py-1.5',\n 'data-[state=active]:shadow-sm',\n 'transition-all duration-150'\n );\n\n const triggers = SCHEDULE_TYPES.map(({ value, label }) => ({\n value,\n label,\n disabled,\n className: triggerClassName,\n }));\n\n return (\n <Tabs\n value={type}\n onValueChange={(v) => setType(v as ScheduleType)}\n className={cn('w-full', className)}\n >\n <TabsList className=\"grid w-full grid-cols-4 h-9 p-0.5\">\n {triggers.map((trigger) => (\n <TabsTrigger\n key={trigger.value}\n value={trigger.value}\n disabled={trigger.disabled}\n className={trigger.className}\n >\n {trigger.label}\n </TabsTrigger>\n ))}\n </TabsList>\n </Tabs>\n );\n}\n","'use client';\n\n/**\n * TimeSelector\n *\n * Clean time picker with hour and minute selects.\n */\n\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { Clock } from 'lucide-react';\nimport { useCronTime } from '../context/hooks';\n\nconst HOURS = Array.from({ length: 24 }, (_, i) => i);\nconst MINUTES = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55];\n\nexport interface TimeSelectorProps {\n format?: '12h' | '24h';\n disabled?: boolean;\n className?: string;\n}\n\nexport function TimeSelector({\n format = '24h',\n disabled,\n className,\n}: TimeSelectorProps) {\n const { hour, minute, setTime } = useCronTime();\n\n const is24h = format === '24h';\n const displayHour = is24h ? hour : (hour % 12) || 12;\n const isPM = hour >= 12;\n\n const handleHourChange = (value: string) => {\n let newHour = parseInt(value, 10);\n if (!is24h) {\n if (isPM && newHour !== 12) newHour += 12;\n else if (!isPM && newHour === 12) newHour = 0;\n }\n setTime(newHour, minute);\n };\n\n const handleMinuteChange = (value: string) => {\n setTime(hour, parseInt(value, 10));\n };\n\n const handlePeriodChange = (value: string) => {\n const newIsPM = value === 'PM';\n let newHour = hour;\n if (newIsPM && hour < 12) newHour = hour + 12;\n else if (!newIsPM && hour >= 12) newHour = hour - 12;\n setTime(newHour, minute);\n };\n\n const hours = is24h ? HOURS : Array.from({ length: 12 }, (_, i) => i + 1);\n\n return (\n <div className={cn('flex items-center gap-3', className)}>\n <div className=\"flex items-center gap-2 text-muted-foreground\">\n <Clock className=\"h-4 w-4\" />\n <span className=\"text-sm\">Run at</span>\n </div>\n\n <div className=\"flex items-center gap-1.5 flex-1\">\n {/* Hour */}\n <Select\n value={displayHour.toString()}\n onValueChange={handleHourChange}\n disabled={disabled}\n >\n <SelectTrigger className=\"w-[70px] h-9\">\n <SelectValue>\n {displayHour.toString().padStart(2, '0')}\n </SelectValue>\n </SelectTrigger>\n <SelectContent className=\"max-h-48\">\n {hours.map((h) => (\n <SelectItem key={h} value={h.toString()}>\n {h.toString().padStart(2, '0')}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n <span className=\"text-muted-foreground font-medium\">:</span>\n\n {/* Minute */}\n <Select\n value={minute.toString()}\n onValueChange={handleMinuteChange}\n disabled={disabled}\n >\n <SelectTrigger className=\"w-[70px] h-9\">\n <SelectValue>\n {minute.toString().padStart(2, '0')}\n </SelectValue>\n </SelectTrigger>\n <SelectContent className=\"max-h-48\">\n {MINUTES.map((m) => (\n <SelectItem key={m} value={m.toString()}>\n {m.toString().padStart(2, '0')}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n {/* AM/PM for 12h */}\n {!is24h && (\n <Select\n value={isPM ? 'PM' : 'AM'}\n onValueChange={handlePeriodChange}\n disabled={disabled}\n >\n <SelectTrigger className=\"w-[70px] h-9\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"AM\">AM</SelectItem>\n <SelectItem value=\"PM\">PM</SelectItem>\n </SelectContent>\n </Select>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\n/**\n * DayChips\n *\n * Full-width day of week selector with clear labels.\n * Shows abbreviated day names for clarity.\n */\n\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { useCronWeekDays } from '../context/hooks';\nimport type { WeekDay } from '../types';\n\nconst DAYS: { value: WeekDay; label: string }[] = [\n { value: 1, label: 'Mon' },\n { value: 2, label: 'Tue' },\n { value: 3, label: 'Wed' },\n { value: 4, label: 'Thu' },\n { value: 5, label: 'Fri' },\n { value: 6, label: 'Sat' },\n { value: 0, label: 'Sun' },\n];\n\nexport interface DayChipsProps {\n disabled?: boolean;\n showPresets?: boolean;\n className?: string;\n}\n\nexport function DayChips({\n disabled,\n showPresets = true,\n className,\n}: DayChipsProps) {\n const { weekDays, toggleWeekDay, setWeekDays } = useCronWeekDays();\n\n // Ensure weekDays is always an array\n const safeWeekDays = Array.isArray(weekDays) ? weekDays : [];\n\n // Prepare data before render\n const isWeekdays = safeWeekDays.length === 5 && [1,2,3,4,5].every(d => safeWeekDays.includes(d as WeekDay));\n const isWeekendPreset = safeWeekDays.length === 2 && [0,6].every(d => safeWeekDays.includes(d as WeekDay));\n const isEveryday = safeWeekDays.length === 7;\n\n const dayButtons = DAYS.map(({ value, label }) => {\n const isSelected = safeWeekDays.includes(value);\n const isWeekendDay = value === 0 || value === 6;\n\n return {\n value,\n label,\n isSelected,\n isWeekendDay,\n className: cn(\n 'flex flex-col items-center justify-center',\n 'py-2.5 rounded-lg text-xs font-medium',\n 'transition-all duration-150',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50',\n 'active:scale-[0.97]',\n isSelected\n ? 'bg-primary text-primary-foreground shadow-sm'\n : cn(\n 'bg-muted/50 hover:bg-muted',\n isWeekendDay ? 'text-muted-foreground/70' : 'text-muted-foreground'\n ),\n disabled && 'opacity-50 cursor-not-allowed pointer-events-none'\n ),\n };\n });\n\n const presets = [\n { label: 'Weekdays', isActive: isWeekdays, days: [1, 2, 3, 4, 5] as WeekDay[] },\n { label: 'Weekends', isActive: isWeekendPreset, days: [0, 6] as WeekDay[] },\n { label: 'Every day', isActive: isEveryday, days: [0, 1, 2, 3, 4, 5, 6] as WeekDay[] },\n ];\n\n return (\n <div className={cn('space-y-3', className)}>\n {/* Day Grid - full width */}\n <div className=\"grid grid-cols-7 gap-1\">\n {dayButtons.map((day) => (\n <button\n key={day.value}\n type=\"button\"\n disabled={disabled}\n onClick={() => toggleWeekDay(day.value)}\n aria-pressed={day.isSelected}\n className={day.className}\n >\n <span>{day.label}</span>\n </button>\n ))}\n </div>\n\n {/* Quick Presets */}\n {showPresets && (\n <div className=\"flex gap-2\">\n {presets.map((preset) => (\n <PresetButton\n key={preset.label}\n label={preset.label}\n isActive={preset.isActive}\n onClick={() => setWeekDays(preset.days)}\n disabled={disabled}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\ninterface PresetButtonProps {\n label: string;\n isActive: boolean;\n onClick: () => void;\n disabled?: boolean;\n}\n\nfunction PresetButton({ label, isActive, onClick, disabled }: PresetButtonProps) {\n return (\n <button\n type=\"button\"\n disabled={disabled}\n onClick={onClick}\n className={cn(\n 'flex-1 px-3 py-1.5 rounded-md text-xs font-medium',\n 'transition-colors duration-150',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50',\n isActive\n ? 'bg-primary/15 text-primary border border-primary/30'\n : 'bg-muted/30 text-muted-foreground hover:bg-muted/50 border border-transparent',\n disabled && 'opacity-50 cursor-not-allowed'\n )}\n >\n {label}\n </button>\n );\n}\n","'use client';\n\n/**\n * MonthDayGrid\n *\n * Full-width calendar-style grid for selecting days of the month.\n * Clean, intuitive design like a mini calendar.\n */\n\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { useCronMonthDays } from '../context/hooks';\nimport type { MonthDay } from '../types';\n\n// Generate days 1-31\nconst DAYS: MonthDay[] = Array.from({ length: 31 }, (_, i) => (i + 1) as MonthDay);\n\n// Fill to complete last row (31 days = 4 full rows + 3 days, need 4 more to fill)\nconst GRID_SIZE = 35; // 5 rows x 7 columns\n\nexport interface MonthDayGridProps {\n disabled?: boolean;\n showPresets?: boolean;\n className?: string;\n}\n\nexport function MonthDayGrid({\n disabled,\n showPresets = true,\n className,\n}: MonthDayGridProps) {\n const { monthDays, toggleMonthDay, setMonthDays } = useCronMonthDays();\n\n // Ensure monthDays is always an array\n const safeMonthDays = Array.isArray(monthDays) ? monthDays : [];\n\n // Prepare presets data\n const is1st = safeMonthDays.length === 1 && safeMonthDays[0] === 1;\n const is15th = safeMonthDays.length === 1 && safeMonthDays[0] === 15;\n const is1stAnd15th = safeMonthDays.length === 2 && safeMonthDays.includes(1) && safeMonthDays.includes(15);\n\n const presets = [\n { label: '1st', isActive: is1st, days: [1] as MonthDay[] },\n { label: '15th', isActive: is15th, days: [15] as MonthDay[] },\n { label: '1st & 15th', isActive: is1stAnd15th, days: [1, 15] as MonthDay[] },\n ];\n\n // Prepare grid cells data\n const gridCells = Array.from({ length: GRID_SIZE }, (_, i) => {\n const day = i + 1;\n const isValidDay = day <= 31;\n const isSelected = isValidDay && safeMonthDays.includes(day as MonthDay);\n const isPartialMonth = day > 28;\n\n if (!isValidDay) {\n return { type: 'empty' as const, key: i };\n }\n\n return {\n type: 'day' as const,\n key: day,\n day: day as MonthDay,\n isSelected,\n className: cn(\n 'aspect-square flex items-center justify-center',\n 'rounded-lg text-sm font-medium',\n 'transition-all duration-150',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50',\n 'active:scale-[0.95]',\n isSelected\n ? 'bg-primary text-primary-foreground shadow-sm'\n : cn(\n 'bg-muted/30 hover:bg-muted/60',\n isPartialMonth\n ? 'text-muted-foreground/50'\n : 'text-muted-foreground'\n ),\n disabled && 'opacity-50 cursor-not-allowed pointer-events-none'\n ),\n };\n });\n\n const selectionCount = safeMonthDays.length;\n\n return (\n <div className={cn('space-y-3', className)}>\n {/* Quick Presets */}\n {showPresets && (\n <div className=\"flex gap-2\">\n {presets.map((preset) => (\n <PresetButton\n key={preset.label}\n label={preset.label}\n isActive={preset.isActive}\n onClick={() => setMonthDays(preset.days)}\n disabled={disabled}\n />\n ))}\n </div>\n )}\n\n {/* Calendar Grid - full width */}\n <div className=\"grid grid-cols-7 gap-1\">\n {gridCells.map((cell) => {\n if (cell.type === 'empty') {\n return <div key={cell.key} className=\"aspect-square\" />;\n }\n\n return (\n <button\n key={cell.key}\n type=\"button\"\n disabled={disabled}\n onClick={() => toggleMonthDay(cell.day)}\n aria-pressed={cell.isSelected}\n aria-label={`Day ${cell.day}`}\n className={cell.className}\n >\n {cell.day}\n </button>\n );\n })}\n </div>\n\n {/* Selection hint */}\n {selectionCount > 1 && (\n <p className=\"text-xs text-muted-foreground text-center\">\n {selectionCount} days selected\n </p>\n )}\n </div>\n );\n}\n\ninterface PresetButtonProps {\n label: string;\n isActive: boolean;\n onClick: () => void;\n disabled?: boolean;\n}\n\nfunction PresetButton({ label, isActive, onClick, disabled }: PresetButtonProps) {\n return (\n <button\n type=\"button\"\n disabled={disabled}\n onClick={onClick}\n className={cn(\n 'flex-1 px-3 py-1.5 rounded-md text-xs font-medium',\n 'transition-colors duration-150',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50',\n isActive\n ? 'bg-primary/15 text-primary border border-primary/30'\n : 'bg-muted/30 text-muted-foreground hover:bg-muted/50 border border-transparent',\n disabled && 'opacity-50 cursor-not-allowed'\n )}\n >\n {label}\n </button>\n );\n}\n","'use client';\n\n/**\n * CustomInput\n *\n * Raw cron expression input with validation and help popover.\n */\n\nimport { useState, useEffect } from 'react';\nimport { Input } from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { AlertCircle, CheckCircle2 } from 'lucide-react';\nimport { useCronCustom } from '../context/hooks';\nimport { isValidCron } from '../utils/cron-parser';\n\nexport interface CustomInputProps {\n disabled?: boolean;\n className?: string;\n}\n\nexport function CustomInput({ disabled, className }: CustomInputProps) {\n const { customCron, isValid, setCustomCron } = useCronCustom();\n const [localValue, setLocalValue] = useState(customCron);\n const [localValid, setLocalValid] = useState(isValid);\n\n useEffect(() => {\n setLocalValue(customCron);\n setLocalValid(isValid);\n }, [customCron, isValid]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setLocalValue(value);\n const valid = isValidCron(value);\n setLocalValid(valid);\n setCustomCron(value);\n };\n\n return (\n <div className={cn('space-y-2', className)}>\n <span className=\"text-sm text-muted-foreground\">Cron expression</span>\n\n <div className=\"relative\">\n <Input\n type=\"text\"\n value={localValue}\n onChange={handleChange}\n disabled={disabled}\n placeholder=\"* * * * *\"\n className={cn(\n 'font-mono text-base pr-10 h-11',\n !localValid && localValue.trim() && 'border-destructive focus-visible:ring-destructive/50'\n )}\n />\n <div className=\"absolute right-3 top-1/2 -translate-y-1/2\">\n {localValue.trim() && (\n localValid ? (\n <CheckCircle2 className=\"h-5 w-5 text-green-500\" />\n ) : (\n <AlertCircle className=\"h-5 w-5 text-destructive\" />\n )\n )}\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\n/**\n * CronCheatsheet\n *\n * Popover with cron syntax reference.\n */\n\nimport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n} from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { HelpCircle } from 'lucide-react';\n\nexport interface CronCheatsheetProps {\n className?: string;\n}\n\nexport function CronCheatsheet({ className }: CronCheatsheetProps) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n 'p-1 rounded hover:bg-muted/50 transition-colors',\n className\n )}\n aria-label=\"Cron syntax help\"\n >\n <HelpCircle className=\"h-4 w-4 text-muted-foreground\" />\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-72 p-3\" align=\"end\">\n <div className=\"space-y-3\">\n <p className=\"font-medium text-sm\">Cron Format</p>\n <code className=\"block text-xs bg-muted px-2 py-1.5 rounded font-mono text-center\">\n min hour day month weekday\n </code>\n\n <div className=\"grid grid-cols-2 gap-x-4 gap-y-1 text-xs\">\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">minute</span>\n <span>0-59</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">hour</span>\n <span>0-23</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">day</span>\n <span>1-31</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">month</span>\n <span>1-12</span>\n </div>\n <div className=\"flex justify-between col-span-2\">\n <span className=\"text-muted-foreground\">weekday</span>\n <span>0-6 (Sun-Sat)</span>\n </div>\n </div>\n\n <div className=\"pt-2 border-t border-border space-y-1.5\">\n <p className=\"text-xs font-medium\">Special characters</p>\n <div className=\"grid grid-cols-2 gap-1.5 text-xs\">\n <span><code className=\"bg-muted px-1 rounded\">*</code> any value</span>\n <span><code className=\"bg-muted px-1 rounded\">,</code> list (1,3,5)</span>\n <span><code className=\"bg-muted px-1 rounded\">-</code> range (1-5)</span>\n <span><code className=\"bg-muted px-1 rounded\">/</code> step (*/15)</span>\n </div>\n </div>\n\n <div className=\"pt-2 border-t border-border space-y-1.5\">\n <p className=\"text-xs font-medium\">Examples</p>\n <div className=\"space-y-1 text-xs\">\n <div className=\"flex justify-between font-mono\">\n <span className=\"text-muted-foreground\">0 9 * * *</span>\n <span>daily at 9am</span>\n </div>\n <div className=\"flex justify-between font-mono\">\n <span className=\"text-muted-foreground\">0 9 * * 1-5</span>\n <span>weekdays 9am</span>\n </div>\n <div className=\"flex justify-between font-mono\">\n <span className=\"text-muted-foreground\">*/15 * * * *</span>\n <span>every 15 min</span>\n </div>\n <div className=\"flex justify-between font-mono\">\n <span className=\"text-muted-foreground\">0 0 1 * *</span>\n <span>1st of month</span>\n </div>\n </div>\n </div>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n","'use client';\n\n/**\n * SchedulePreview\n *\n * Human-readable preview with cron expression and cheatsheet.\n * Shows initial value when it differs from current.\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport { Calendar, Copy, Check, ArrowRight } from 'lucide-react';\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { useCronPreview } from '../context/hooks';\nimport { CronCheatsheet } from './CronCheatsheet';\n\nexport interface SchedulePreviewProps {\n /** Show raw cron expression (default: true) */\n showCronExpression?: boolean;\n /** Enable copy to clipboard */\n allowCopy?: boolean;\n /** Show initial value when changed (default: true) */\n showInitialValue?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\nexport function SchedulePreview({\n showCronExpression = true,\n allowCopy = false,\n showInitialValue = true,\n className,\n}: SchedulePreviewProps) {\n const { cronExpression, humanDescription, isValid, initialValue } = useCronPreview();\n\n // Check if value has changed from initial\n const hasChanged = useMemo(\n () => showInitialValue && initialValue && initialValue !== cronExpression,\n [showInitialValue, initialValue, cronExpression]\n );\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(cronExpression);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error('Failed to copy:', err);\n }\n }, [cronExpression]);\n\n return (\n <div\n className={cn(\n 'px-3 py-2.5 rounded-lg border',\n 'bg-muted/30 border-border/50',\n !isValid && 'border-destructive/30 bg-destructive/5',\n className\n )}\n >\n {/* Human description */}\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <Calendar\n className={cn(\n 'h-4 w-4 shrink-0',\n isValid ? 'text-primary' : 'text-destructive'\n )}\n />\n <span\n className={cn(\n 'text-sm',\n isValid ? 'text-foreground' : 'text-destructive'\n )}\n >\n {humanDescription}\n </span>\n </div>\n\n {/* Copy Button */}\n {allowCopy && (\n <button\n type=\"button\"\n onClick={handleCopy}\n disabled={!isValid}\n className={cn(\n 'p-1 rounded transition-colors duration-150',\n 'hover:bg-muted focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50',\n 'disabled:opacity-50 disabled:cursor-not-allowed'\n )}\n title={copied ? 'Copied!' : 'Copy cron expression'}\n >\n {copied ? (\n <Check className=\"h-3.5 w-3.5 text-green-500\" />\n ) : (\n <Copy className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n </button>\n )}\n </div>\n\n {/* Cron expression with cheatsheet */}\n {showCronExpression && (\n <div className=\"mt-1.5 pt-1.5 border-t border-border/30 flex items-center justify-between\">\n <div className=\"flex items-center gap-1.5 min-w-0\">\n {hasChanged && (\n <>\n <code className=\"text-xs font-mono text-muted-foreground/60 line-through\">\n {initialValue}\n </code>\n <ArrowRight className=\"h-3 w-3 text-muted-foreground/40 shrink-0\" />\n </>\n )}\n <code className=\"text-xs font-mono text-muted-foreground\">\n {cronExpression}\n </code>\n </div>\n <CronCheatsheet />\n </div>\n )}\n </div>\n );\n}\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -5,7 +5,7 @@ var chunkCY3CQS26_cjs = require('./chunk-CY3CQS26.cjs');
|
|
|
5
5
|
require('./chunk-F2N7P5XU.cjs');
|
|
6
6
|
var chunkTEFRA7GW_cjs = require('./chunk-TEFRA7GW.cjs');
|
|
7
7
|
var chunkXTBRWVIV_cjs = require('./chunk-XTBRWVIV.cjs');
|
|
8
|
-
var
|
|
8
|
+
var chunkAL7PTAS5_cjs = require('./chunk-AL7PTAS5.cjs');
|
|
9
9
|
var chunkOYLQZT62_cjs = require('./chunk-OYLQZT62.cjs');
|
|
10
10
|
var chunkDFWXRCIC_cjs = require('./chunk-DFWXRCIC.cjs');
|
|
11
11
|
var chunkPNZSJN6T_cjs = require('./chunk-PNZSJN6T.cjs');
|
|
@@ -849,7 +849,7 @@ var LazyImageViewer = createLazyComponent(
|
|
|
849
849
|
}
|
|
850
850
|
);
|
|
851
851
|
var LazyCronScheduler = createLazyComponent(
|
|
852
|
-
() => import('./CronScheduler.client-
|
|
852
|
+
() => import('./CronScheduler.client-3JXCOKFY.cjs'),
|
|
853
853
|
{
|
|
854
854
|
displayName: "LazyCronScheduler",
|
|
855
855
|
fallback: /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -881,7 +881,7 @@ var Playground = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({ config }) => {
|
|
|
881
881
|
return /* @__PURE__ */ jsxRuntime.jsx(chunkOYLQZT62_cjs.PlaygroundProvider, { config, children: /* @__PURE__ */ jsxRuntime.jsx(React3.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx(LoadingFallback9, {}), children: /* @__PURE__ */ jsxRuntime.jsx(PlaygroundLayout, {}) }) });
|
|
882
882
|
}, "Playground");
|
|
883
883
|
var OpenapiViewer_default = Playground;
|
|
884
|
-
var CronSchedulerClient = React3.lazy(() => import('./CronScheduler.client-
|
|
884
|
+
var CronSchedulerClient = React3.lazy(() => import('./CronScheduler.client-3JXCOKFY.cjs'));
|
|
885
885
|
function CronScheduler(props) {
|
|
886
886
|
return /* @__PURE__ */ jsxRuntime.jsx(React3.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx(CronSchedulerFallback, {}), children: /* @__PURE__ */ jsxRuntime.jsx(CronSchedulerClient, { ...props }) });
|
|
887
887
|
}
|
|
@@ -1116,79 +1116,79 @@ Object.defineProperty(exports, "useVideoPlayerSettings", {
|
|
|
1116
1116
|
});
|
|
1117
1117
|
Object.defineProperty(exports, "CronSchedulerProvider", {
|
|
1118
1118
|
enumerable: true,
|
|
1119
|
-
get: function () { return
|
|
1119
|
+
get: function () { return chunkAL7PTAS5_cjs.CronSchedulerProvider; }
|
|
1120
1120
|
});
|
|
1121
1121
|
Object.defineProperty(exports, "CustomInput", {
|
|
1122
1122
|
enumerable: true,
|
|
1123
|
-
get: function () { return
|
|
1123
|
+
get: function () { return chunkAL7PTAS5_cjs.CustomInput; }
|
|
1124
1124
|
});
|
|
1125
1125
|
Object.defineProperty(exports, "DayChips", {
|
|
1126
1126
|
enumerable: true,
|
|
1127
|
-
get: function () { return
|
|
1127
|
+
get: function () { return chunkAL7PTAS5_cjs.DayChips; }
|
|
1128
1128
|
});
|
|
1129
1129
|
Object.defineProperty(exports, "MonthDayGrid", {
|
|
1130
1130
|
enumerable: true,
|
|
1131
|
-
get: function () { return
|
|
1131
|
+
get: function () { return chunkAL7PTAS5_cjs.MonthDayGrid; }
|
|
1132
1132
|
});
|
|
1133
1133
|
Object.defineProperty(exports, "SchedulePreview", {
|
|
1134
1134
|
enumerable: true,
|
|
1135
|
-
get: function () { return
|
|
1135
|
+
get: function () { return chunkAL7PTAS5_cjs.SchedulePreview; }
|
|
1136
1136
|
});
|
|
1137
1137
|
Object.defineProperty(exports, "ScheduleTypeSelector", {
|
|
1138
1138
|
enumerable: true,
|
|
1139
|
-
get: function () { return
|
|
1139
|
+
get: function () { return chunkAL7PTAS5_cjs.ScheduleTypeSelector; }
|
|
1140
1140
|
});
|
|
1141
1141
|
Object.defineProperty(exports, "TimeSelector", {
|
|
1142
1142
|
enumerable: true,
|
|
1143
|
-
get: function () { return
|
|
1143
|
+
get: function () { return chunkAL7PTAS5_cjs.TimeSelector; }
|
|
1144
1144
|
});
|
|
1145
1145
|
Object.defineProperty(exports, "buildCron", {
|
|
1146
1146
|
enumerable: true,
|
|
1147
|
-
get: function () { return
|
|
1147
|
+
get: function () { return chunkAL7PTAS5_cjs.buildCron; }
|
|
1148
1148
|
});
|
|
1149
1149
|
Object.defineProperty(exports, "humanizeCron", {
|
|
1150
1150
|
enumerable: true,
|
|
1151
|
-
get: function () { return
|
|
1151
|
+
get: function () { return chunkAL7PTAS5_cjs.humanizeCron; }
|
|
1152
1152
|
});
|
|
1153
1153
|
Object.defineProperty(exports, "isValidCron", {
|
|
1154
1154
|
enumerable: true,
|
|
1155
|
-
get: function () { return
|
|
1155
|
+
get: function () { return chunkAL7PTAS5_cjs.isValidCron; }
|
|
1156
1156
|
});
|
|
1157
1157
|
Object.defineProperty(exports, "parseCron", {
|
|
1158
1158
|
enumerable: true,
|
|
1159
|
-
get: function () { return
|
|
1159
|
+
get: function () { return chunkAL7PTAS5_cjs.parseCron; }
|
|
1160
1160
|
});
|
|
1161
1161
|
Object.defineProperty(exports, "useCronCustom", {
|
|
1162
1162
|
enumerable: true,
|
|
1163
|
-
get: function () { return
|
|
1163
|
+
get: function () { return chunkAL7PTAS5_cjs.useCronCustom; }
|
|
1164
1164
|
});
|
|
1165
1165
|
Object.defineProperty(exports, "useCronMonthDays", {
|
|
1166
1166
|
enumerable: true,
|
|
1167
|
-
get: function () { return
|
|
1167
|
+
get: function () { return chunkAL7PTAS5_cjs.useCronMonthDays; }
|
|
1168
1168
|
});
|
|
1169
1169
|
Object.defineProperty(exports, "useCronPreview", {
|
|
1170
1170
|
enumerable: true,
|
|
1171
|
-
get: function () { return
|
|
1171
|
+
get: function () { return chunkAL7PTAS5_cjs.useCronPreview; }
|
|
1172
1172
|
});
|
|
1173
1173
|
Object.defineProperty(exports, "useCronScheduler", {
|
|
1174
1174
|
enumerable: true,
|
|
1175
|
-
get: function () { return
|
|
1175
|
+
get: function () { return chunkAL7PTAS5_cjs.useCronScheduler; }
|
|
1176
1176
|
});
|
|
1177
1177
|
Object.defineProperty(exports, "useCronSchedulerContext", {
|
|
1178
1178
|
enumerable: true,
|
|
1179
|
-
get: function () { return
|
|
1179
|
+
get: function () { return chunkAL7PTAS5_cjs.useCronSchedulerContext; }
|
|
1180
1180
|
});
|
|
1181
1181
|
Object.defineProperty(exports, "useCronTime", {
|
|
1182
1182
|
enumerable: true,
|
|
1183
|
-
get: function () { return
|
|
1183
|
+
get: function () { return chunkAL7PTAS5_cjs.useCronTime; }
|
|
1184
1184
|
});
|
|
1185
1185
|
Object.defineProperty(exports, "useCronType", {
|
|
1186
1186
|
enumerable: true,
|
|
1187
|
-
get: function () { return
|
|
1187
|
+
get: function () { return chunkAL7PTAS5_cjs.useCronType; }
|
|
1188
1188
|
});
|
|
1189
1189
|
Object.defineProperty(exports, "useCronWeekDays", {
|
|
1190
1190
|
enumerable: true,
|
|
1191
|
-
get: function () { return
|
|
1191
|
+
get: function () { return chunkAL7PTAS5_cjs.useCronWeekDays; }
|
|
1192
1192
|
});
|
|
1193
1193
|
Object.defineProperty(exports, "PrettyCode", {
|
|
1194
1194
|
enumerable: true,
|
package/dist/index.d.cts
CHANGED
|
@@ -1257,6 +1257,8 @@ interface CronSchedulerComputed {
|
|
|
1257
1257
|
cronExpression: string;
|
|
1258
1258
|
/** Human-readable description */
|
|
1259
1259
|
humanDescription: string;
|
|
1260
|
+
/** Initial value from props (null if not provided) */
|
|
1261
|
+
initialValue: string | null;
|
|
1260
1262
|
}
|
|
1261
1263
|
interface CronSchedulerActions {
|
|
1262
1264
|
/** Set schedule type */
|
|
@@ -1953,6 +1955,7 @@ declare function useCronPreview(): {
|
|
|
1953
1955
|
cronExpression: string;
|
|
1954
1956
|
humanDescription: string;
|
|
1955
1957
|
isValid: boolean;
|
|
1958
|
+
initialValue: string;
|
|
1956
1959
|
};
|
|
1957
1960
|
/**
|
|
1958
1961
|
* Full context access
|
|
@@ -2061,10 +2064,12 @@ interface SchedulePreviewProps {
|
|
|
2061
2064
|
showCronExpression?: boolean;
|
|
2062
2065
|
/** Enable copy to clipboard */
|
|
2063
2066
|
allowCopy?: boolean;
|
|
2067
|
+
/** Show initial value when changed (default: true) */
|
|
2068
|
+
showInitialValue?: boolean;
|
|
2064
2069
|
/** Additional CSS classes */
|
|
2065
2070
|
className?: string;
|
|
2066
2071
|
}
|
|
2067
|
-
declare function SchedulePreview({ showCronExpression, allowCopy, className, }: SchedulePreviewProps): react_jsx_runtime.JSX.Element;
|
|
2072
|
+
declare function SchedulePreview({ showCronExpression, allowCopy, showInitialValue, className, }: SchedulePreviewProps): react_jsx_runtime.JSX.Element;
|
|
2068
2073
|
|
|
2069
2074
|
/**
|
|
2070
2075
|
* CronScheduler with Suspense wrapper
|
package/dist/index.d.ts
CHANGED
|
@@ -1257,6 +1257,8 @@ interface CronSchedulerComputed {
|
|
|
1257
1257
|
cronExpression: string;
|
|
1258
1258
|
/** Human-readable description */
|
|
1259
1259
|
humanDescription: string;
|
|
1260
|
+
/** Initial value from props (null if not provided) */
|
|
1261
|
+
initialValue: string | null;
|
|
1260
1262
|
}
|
|
1261
1263
|
interface CronSchedulerActions {
|
|
1262
1264
|
/** Set schedule type */
|
|
@@ -1953,6 +1955,7 @@ declare function useCronPreview(): {
|
|
|
1953
1955
|
cronExpression: string;
|
|
1954
1956
|
humanDescription: string;
|
|
1955
1957
|
isValid: boolean;
|
|
1958
|
+
initialValue: string;
|
|
1956
1959
|
};
|
|
1957
1960
|
/**
|
|
1958
1961
|
* Full context access
|
|
@@ -2061,10 +2064,12 @@ interface SchedulePreviewProps {
|
|
|
2061
2064
|
showCronExpression?: boolean;
|
|
2062
2065
|
/** Enable copy to clipboard */
|
|
2063
2066
|
allowCopy?: boolean;
|
|
2067
|
+
/** Show initial value when changed (default: true) */
|
|
2068
|
+
showInitialValue?: boolean;
|
|
2064
2069
|
/** Additional CSS classes */
|
|
2065
2070
|
className?: string;
|
|
2066
2071
|
}
|
|
2067
|
-
declare function SchedulePreview({ showCronExpression, allowCopy, className, }: SchedulePreviewProps): react_jsx_runtime.JSX.Element;
|
|
2072
|
+
declare function SchedulePreview({ showCronExpression, allowCopy, showInitialValue, className, }: SchedulePreviewProps): react_jsx_runtime.JSX.Element;
|
|
2068
2073
|
|
|
2069
2074
|
/**
|
|
2070
2075
|
* CronScheduler with Suspense wrapper
|
package/dist/index.mjs
CHANGED
|
@@ -3,7 +3,7 @@ export { NativeProvider, StreamProvider, VideoControls, VideoErrorFallback, Vide
|
|
|
3
3
|
import './chunk-JWB2EWQO.mjs';
|
|
4
4
|
export { ImageViewer } from './chunk-2DSR7V2L.mjs';
|
|
5
5
|
export { generateContentKey, useAudioCache, useBlobUrlCleanup, useImageCache, useMediaCacheStore, useVideoCache, useVideoPlayerSettings } from './chunk-LTJX2JXE.mjs';
|
|
6
|
-
export { CronSchedulerProvider, CustomInput, DayChips, MonthDayGrid, SchedulePreview, ScheduleTypeSelector, TimeSelector, buildCron, humanizeCron, isValidCron, parseCron, useCronCustom, useCronMonthDays, useCronPreview, useCronScheduler, useCronSchedulerContext, useCronTime, useCronType, useCronWeekDays } from './chunk-
|
|
6
|
+
export { CronSchedulerProvider, CustomInput, DayChips, MonthDayGrid, SchedulePreview, ScheduleTypeSelector, TimeSelector, buildCron, humanizeCron, isValidCron, parseCron, useCronCustom, useCronMonthDays, useCronPreview, useCronScheduler, useCronSchedulerContext, useCronTime, useCronType, useCronWeekDays } from './chunk-QIAP4G5L.mjs';
|
|
7
7
|
import { PlaygroundProvider, PrettyCode_default } from './chunk-XZZ22EHP.mjs';
|
|
8
8
|
export { PrettyCode_default as PrettyCode } from './chunk-XZZ22EHP.mjs';
|
|
9
9
|
export { JsonTree_default as JsonTree } from './chunk-XXFYTIQK.mjs';
|
|
@@ -825,7 +825,7 @@ var LazyImageViewer = createLazyComponent(
|
|
|
825
825
|
}
|
|
826
826
|
);
|
|
827
827
|
var LazyCronScheduler = createLazyComponent(
|
|
828
|
-
() => import('./CronScheduler.client-
|
|
828
|
+
() => import('./CronScheduler.client-MCNY3POV.mjs'),
|
|
829
829
|
{
|
|
830
830
|
displayName: "LazyCronScheduler",
|
|
831
831
|
fallback: /* @__PURE__ */ jsx(
|
|
@@ -857,7 +857,7 @@ var Playground = /* @__PURE__ */ __name(({ config }) => {
|
|
|
857
857
|
return /* @__PURE__ */ jsx(PlaygroundProvider, { config, children: /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(LoadingFallback9, {}), children: /* @__PURE__ */ jsx(PlaygroundLayout, {}) }) });
|
|
858
858
|
}, "Playground");
|
|
859
859
|
var OpenapiViewer_default = Playground;
|
|
860
|
-
var CronSchedulerClient = lazy(() => import('./CronScheduler.client-
|
|
860
|
+
var CronSchedulerClient = lazy(() => import('./CronScheduler.client-MCNY3POV.mjs'));
|
|
861
861
|
function CronScheduler(props) {
|
|
862
862
|
return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(CronSchedulerFallback, {}), children: /* @__PURE__ */ jsx(CronSchedulerClient, { ...props }) });
|
|
863
863
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@djangocfg/ui-tools",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.137",
|
|
4
4
|
"description": "Heavy React tools with lazy loading - for Electron, Vite, CRA, Next.js apps",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ui-tools",
|
|
@@ -63,8 +63,8 @@
|
|
|
63
63
|
"check": "tsc --noEmit"
|
|
64
64
|
},
|
|
65
65
|
"peerDependencies": {
|
|
66
|
-
"@djangocfg/i18n": "^2.1.
|
|
67
|
-
"@djangocfg/ui-core": "^2.1.
|
|
66
|
+
"@djangocfg/i18n": "^2.1.137",
|
|
67
|
+
"@djangocfg/ui-core": "^2.1.137",
|
|
68
68
|
"lucide-react": "^0.545.0",
|
|
69
69
|
"react": "^19.0.0",
|
|
70
70
|
"react-dom": "^19.0.0",
|
|
@@ -96,10 +96,10 @@
|
|
|
96
96
|
"@maplibre/maplibre-gl-geocoder": "^1.7.0"
|
|
97
97
|
},
|
|
98
98
|
"devDependencies": {
|
|
99
|
-
"@djangocfg/i18n": "^2.1.
|
|
99
|
+
"@djangocfg/i18n": "^2.1.137",
|
|
100
100
|
"@djangocfg/playground": "workspace:*",
|
|
101
|
-
"@djangocfg/typescript-config": "^2.1.
|
|
102
|
-
"@djangocfg/ui-core": "^2.1.
|
|
101
|
+
"@djangocfg/typescript-config": "^2.1.137",
|
|
102
|
+
"@djangocfg/ui-core": "^2.1.137",
|
|
103
103
|
"@types/mapbox__mapbox-gl-draw": "^1.4.8",
|
|
104
104
|
"@types/node": "^24.7.2",
|
|
105
105
|
"@types/react": "^19.1.0",
|
|
@@ -4,10 +4,11 @@
|
|
|
4
4
|
* SchedulePreview
|
|
5
5
|
*
|
|
6
6
|
* Human-readable preview with cron expression and cheatsheet.
|
|
7
|
+
* Shows initial value when it differs from current.
|
|
7
8
|
*/
|
|
8
9
|
|
|
9
|
-
import { useState, useCallback } from 'react';
|
|
10
|
-
import { Calendar, Copy, Check } from 'lucide-react';
|
|
10
|
+
import { useState, useCallback, useMemo } from 'react';
|
|
11
|
+
import { Calendar, Copy, Check, ArrowRight } from 'lucide-react';
|
|
11
12
|
import { cn } from '@djangocfg/ui-core/lib';
|
|
12
13
|
import { useCronPreview } from '../context/hooks';
|
|
13
14
|
import { CronCheatsheet } from './CronCheatsheet';
|
|
@@ -17,6 +18,8 @@ export interface SchedulePreviewProps {
|
|
|
17
18
|
showCronExpression?: boolean;
|
|
18
19
|
/** Enable copy to clipboard */
|
|
19
20
|
allowCopy?: boolean;
|
|
21
|
+
/** Show initial value when changed (default: true) */
|
|
22
|
+
showInitialValue?: boolean;
|
|
20
23
|
/** Additional CSS classes */
|
|
21
24
|
className?: string;
|
|
22
25
|
}
|
|
@@ -24,9 +27,16 @@ export interface SchedulePreviewProps {
|
|
|
24
27
|
export function SchedulePreview({
|
|
25
28
|
showCronExpression = true,
|
|
26
29
|
allowCopy = false,
|
|
30
|
+
showInitialValue = true,
|
|
27
31
|
className,
|
|
28
32
|
}: SchedulePreviewProps) {
|
|
29
|
-
const { cronExpression, humanDescription, isValid } = useCronPreview();
|
|
33
|
+
const { cronExpression, humanDescription, isValid, initialValue } = useCronPreview();
|
|
34
|
+
|
|
35
|
+
// Check if value has changed from initial
|
|
36
|
+
const hasChanged = useMemo(
|
|
37
|
+
() => showInitialValue && initialValue && initialValue !== cronExpression,
|
|
38
|
+
[showInitialValue, initialValue, cronExpression]
|
|
39
|
+
);
|
|
30
40
|
const [copied, setCopied] = useState(false);
|
|
31
41
|
|
|
32
42
|
const handleCopy = useCallback(async () => {
|
|
@@ -92,9 +102,19 @@ export function SchedulePreview({
|
|
|
92
102
|
{/* Cron expression with cheatsheet */}
|
|
93
103
|
{showCronExpression && (
|
|
94
104
|
<div className="mt-1.5 pt-1.5 border-t border-border/30 flex items-center justify-between">
|
|
95
|
-
<
|
|
96
|
-
{
|
|
97
|
-
|
|
105
|
+
<div className="flex items-center gap-1.5 min-w-0">
|
|
106
|
+
{hasChanged && (
|
|
107
|
+
<>
|
|
108
|
+
<code className="text-xs font-mono text-muted-foreground/60 line-through">
|
|
109
|
+
{initialValue}
|
|
110
|
+
</code>
|
|
111
|
+
<ArrowRight className="h-3 w-3 text-muted-foreground/40 shrink-0" />
|
|
112
|
+
</>
|
|
113
|
+
)}
|
|
114
|
+
<code className="text-xs font-mono text-muted-foreground">
|
|
115
|
+
{cronExpression}
|
|
116
|
+
</code>
|
|
117
|
+
</div>
|
|
98
118
|
<CronCheatsheet />
|
|
99
119
|
</div>
|
|
100
120
|
)}
|
|
@@ -65,6 +65,9 @@ export function CronSchedulerProvider({
|
|
|
65
65
|
const onChangeRef = useRef(onChange);
|
|
66
66
|
onChangeRef.current = onChange;
|
|
67
67
|
|
|
68
|
+
// Track initial value from props (for showing "original" vs "current")
|
|
69
|
+
const [initialValue] = useState(() => value || null);
|
|
70
|
+
|
|
68
71
|
// Initialize state from value prop or defaults
|
|
69
72
|
const [state, setState] = useState<CronSchedulerState>(() => {
|
|
70
73
|
try {
|
|
@@ -203,6 +206,7 @@ export function CronSchedulerProvider({
|
|
|
203
206
|
// Computed
|
|
204
207
|
cronExpression,
|
|
205
208
|
humanDescription,
|
|
209
|
+
initialValue,
|
|
206
210
|
// Actions
|
|
207
211
|
setType,
|
|
208
212
|
setTime,
|
|
@@ -217,6 +221,7 @@ export function CronSchedulerProvider({
|
|
|
217
221
|
state,
|
|
218
222
|
cronExpression,
|
|
219
223
|
humanDescription,
|
|
224
|
+
initialValue,
|
|
220
225
|
setType,
|
|
221
226
|
setTime,
|
|
222
227
|
toggleWeekDay,
|
|
@@ -70,10 +70,10 @@ export function useCronCustom() {
|
|
|
70
70
|
* Re-renders only when computed values change
|
|
71
71
|
*/
|
|
72
72
|
export function useCronPreview() {
|
|
73
|
-
const { cronExpression, humanDescription, isValid } = useCronSchedulerContext();
|
|
73
|
+
const { cronExpression, humanDescription, isValid, initialValue } = useCronSchedulerContext();
|
|
74
74
|
return useMemo(
|
|
75
|
-
() => ({ cronExpression, humanDescription, isValid }),
|
|
76
|
-
[cronExpression, humanDescription, isValid]
|
|
75
|
+
() => ({ cronExpression, humanDescription, isValid, initialValue }),
|
|
76
|
+
[cronExpression, humanDescription, isValid, initialValue]
|
|
77
77
|
);
|
|
78
78
|
}
|
|
79
79
|
|
|
@@ -45,6 +45,8 @@ export interface CronSchedulerComputed {
|
|
|
45
45
|
cronExpression: string;
|
|
46
46
|
/** Human-readable description */
|
|
47
47
|
humanDescription: string;
|
|
48
|
+
/** Initial value from props (null if not provided) */
|
|
49
|
+
initialValue: string | null;
|
|
48
50
|
}
|
|
49
51
|
|
|
50
52
|
// ============================================================================
|
|
@@ -61,12 +61,20 @@ export function parseCron(cron: string): CronSchedulerState | null {
|
|
|
61
61
|
};
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
+
/**
|
|
65
|
+
* Checks if a field is a simple value (number or *)
|
|
66
|
+
* Complex patterns like ranges, lists, steps are NOT simple
|
|
67
|
+
*/
|
|
68
|
+
function isSimpleField(part: string): boolean {
|
|
69
|
+
return part === '*' || /^\d+$/.test(part);
|
|
70
|
+
}
|
|
71
|
+
|
|
64
72
|
/**
|
|
65
73
|
* Detects schedule type from cron fields
|
|
66
74
|
*/
|
|
67
75
|
function detectScheduleType(
|
|
68
|
-
|
|
69
|
-
|
|
76
|
+
minutePart: string,
|
|
77
|
+
hourPart: string,
|
|
70
78
|
dayOfMonthPart: string,
|
|
71
79
|
monthPart: string,
|
|
72
80
|
dayOfWeekPart: string
|
|
@@ -80,7 +88,12 @@ function detectScheduleType(
|
|
|
80
88
|
let weekDays: WeekDay[] = [1, 2, 3, 4, 5]; // Mon-Fri
|
|
81
89
|
let monthDays: MonthDay[] = [1];
|
|
82
90
|
|
|
83
|
-
//
|
|
91
|
+
// If minute or hour have complex patterns (ranges, steps, lists) -> custom
|
|
92
|
+
if (!isSimpleField(minutePart) || !isSimpleField(hourPart)) {
|
|
93
|
+
return { type: 'custom', weekDays, monthDays };
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Daily: M H * * * (simple minute and hour, rest are *)
|
|
84
97
|
if (dayOfMonthPart === '*' && monthPart === '*' && dayOfWeekPart === '*') {
|
|
85
98
|
type = 'daily';
|
|
86
99
|
}
|