@prose-reader/core 0.0.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/cfi.d.ts +74 -0
  2. package/dist/constants.d.ts +5 -0
  3. package/dist/context.d.ts +48 -0
  4. package/dist/createReaderWithEnhancer.d.ts +2242 -0
  5. package/dist/enhancers/accessibility.d.ts +2 -0
  6. package/dist/enhancers/chrome.d.ts +2 -0
  7. package/dist/enhancers/composeEnhancer.d.ts +21 -0
  8. package/dist/enhancers/firefox.d.ts +2 -0
  9. package/dist/enhancers/fonts.d.ts +12 -0
  10. package/dist/enhancers/hotkeys.d.ts +2 -0
  11. package/dist/enhancers/layoutEnhancer/createMovingSafePan$.d.ts +3 -0
  12. package/dist/enhancers/layoutEnhancer/layoutEnhancer.d.ts +10 -0
  13. package/dist/enhancers/links.d.ts +12 -0
  14. package/dist/enhancers/media.d.ts +2 -0
  15. package/dist/enhancers/navigation.d.ts +5 -0
  16. package/dist/enhancers/pagination.d.ts +46 -0
  17. package/dist/enhancers/progression.d.ts +15 -0
  18. package/dist/enhancers/resources/index.d.ts +2 -0
  19. package/dist/enhancers/resources/indexedDB.d.ts +6 -0
  20. package/dist/enhancers/resources/resourcesManager.d.ts +6 -0
  21. package/dist/enhancers/theme.d.ts +22 -0
  22. package/dist/enhancers/types.d.ts +28 -0
  23. package/dist/enhancers/utils.d.ts +6 -0
  24. package/dist/enhancers/webkit.d.ts +2 -0
  25. package/dist/enhancers/zoom.d.ts +16 -0
  26. package/dist/frames.d.ts +5 -0
  27. package/dist/index.d.ts +10 -0
  28. package/dist/index.js +701 -0
  29. package/dist/index.js.LICENSE.txt +385 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/pagination.d.ts +65 -0
  32. package/dist/reader.d.ts +63 -0
  33. package/dist/report.d.ts +26 -0
  34. package/dist/selection.d.ts +6 -0
  35. package/dist/settings.d.ts +37 -0
  36. package/dist/spine/cfiLocator.d.ts +257 -0
  37. package/dist/spine/createSpine.d.ts +896 -0
  38. package/dist/spine/eventsHelper.d.ts +11 -0
  39. package/dist/spine/locationResolver.d.ts +479 -0
  40. package/dist/spine/navigationResolver.d.ts +48 -0
  41. package/dist/spine/viewportNavigator/manualViewportNavigator.d.ts +99 -0
  42. package/dist/spine/viewportNavigator/panViewportNavigator.d.ts +50 -0
  43. package/dist/spine/viewportNavigator/scrollViewportNavigator.d.ts +23 -0
  44. package/dist/spine/viewportNavigator/viewportNavigator.d.ts +85 -0
  45. package/dist/spineItem/commonSpineItem.d.ts +160 -0
  46. package/dist/spineItem/createSpineItem.d.ts +458 -0
  47. package/dist/spineItem/frameItem/createFrame$.d.ts +1 -0
  48. package/dist/spineItem/frameItem/createFrameManipulator.d.ts +5 -0
  49. package/dist/spineItem/frameItem/createHtmlPageFromResource.d.ts +2 -0
  50. package/dist/spineItem/frameItem/frameItem.d.ts +49 -0
  51. package/dist/spineItem/frameItem/loader.d.ts +27 -0
  52. package/dist/spineItem/index.d.ts +458 -0
  53. package/dist/spineItem/locationResolver.d.ts +27 -0
  54. package/dist/spineItem/navigationResolver.d.ts +23 -0
  55. package/dist/spineItem/prePaginatedSpineItem.d.ts +223 -0
  56. package/dist/spineItem/reflowableSpineItem.d.ts +222 -0
  57. package/dist/spineItem/trackers.d.ts +34 -0
  58. package/dist/spineItemManager.d.ts +264 -0
  59. package/dist/tryEnhancer/compose.d.ts +20 -0
  60. package/dist/tryEnhancer/createReader.d.ts +3 -0
  61. package/dist/tryEnhancer/enhancer.d.ts +24 -0
  62. package/dist/tryEnhancer/index.d.ts +1 -0
  63. package/dist/types/Hook.d.ts +70 -0
  64. package/dist/types/index.d.ts +16 -0
  65. package/dist/utils/compose.d.ts +8 -0
  66. package/dist/utils/contentType.d.ts +2 -0
  67. package/dist/utils/dom.d.ts +19 -0
  68. package/dist/utils/manifest.d.ts +2 -0
  69. package/dist/utils/objects.d.ts +6 -0
  70. package/dist/utils/objects.test.d.ts +1 -0
  71. package/dist/utils/rxjs.d.ts +4 -0
  72. package/dist/utils/url.d.ts +1 -0
  73. package/package.json +44 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","mappings":";;;;;;;;;;;;;;;AAKY;AAEZ,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY;AACtC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS;AAChC,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB;AAElD,SAAS,SAAS,CAAE,GAAW;IAC7B,OAAO,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC;AAC5C,CAAC;AAID,SAAS,QAAQ,CAAE,GAAW,EAAE,MAAW,EAAE,GAAQ;IACnD,GAAG,GAAG,GAAG,IAAI,CAAC;IACd,MAAM,OAAO,GAAG,EAAE;IAClB,IAAI,MAAM,GAAG,CAAC;IACd,IAAI,CAAC;IACL,GAAG;QACD,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;QACrB,IAAI,CAAC,CAAC;YAAE,MAAK;QACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC;QAE3B,MAAM,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM;QAE5B,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC;KACpC,QAAQ,MAAM,GAAG,GAAG,CAAC,MAAM,EAAC;IAE7B,OAAO,OAAO;AAChB,CAAC;AAGD,SAAS,OAAO,CAAE,CAAQ,EAAE,CAAS;IACnC,IAAI,OAAO;IACX,IAAI,OAAO;IACX,IAAI,CAAC,EAAE,IAAI;IACX,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC7B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAEzB,IAAI,CAAC,CAAC,IAAI,IAAI,GAAG,OAAO,EAAE;YACxB,IAAI,GAAG,OAAO;YACd,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;SACf;KACF;IACD,OAAO,OAAO;AAChB,CAAC;AAOD,SAAS,gBAAgB,CAAE,KAAkD,EAAE,CAAS,EAAE,MAAc;IACtG,IAAI,KAAK,GAAG,CAAC;IACb,IAAI,cAAc;IAClB,IAAI,UAAU,GAAG,CAAC;IAClB,IAAI,SAAS,GAAG,IAAI;IACpB,IAAI,CAAC,EAAE,IAAI;IACX,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACjC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;QAEf,IAAI,IAAI,CAAC,QAAQ,KAAK,YAAY,EAAE;YAClC,IAAI,cAAc,IAAI,SAAS,EAAE;gBAC/B,KAAK,IAAI,CAAC;gBACV,SAAS,GAAG,KAAK;aAClB;iBAAM;gBACL,KAAK,EAAE;aACR;YAGD,IAAI,CAAC,KAAK,IAAI,EAAE;gBAEd,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE;oBACxC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;iBACzB;qBAAM;oBACL,OAAO,EAAE,KAAK,EAAE;iBACjB;aACF;YACD,UAAU,GAAG,CAAC;YACd,cAAc,GAAG,IAAI;SAEtB;aAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAEpC,IAAI,CAAC,QAAQ,KAAK,kBAAkB,EAAE;YACtC,IAAI,cAAc,IAAI,SAAS,EAAE;gBAC/B,KAAK,EAAE;gBACP,SAAS,GAAG,KAAK;aAClB;YAGD,IAAI,CAAC,KAAK,IAAI,EAAE;gBACd,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE;aAC9C;YAGD,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM;YACrC,cAAc,GAAG,KAAK;SACvB;aAAM;YACL,SAAQ;SACT;KACF;IACD,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC;AAC9E,CAAC;AAED,SAAS,eAAe,CAAE,CAAS,EAAE,CAAS;IAC5C,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;IACnC,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;IAEnC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG;QAAE,OAAO,CAAC;IAC1B,IAAI,CAAC,GAAG,IAAI,GAAG;QAAE,OAAO,CAAC,CAAC;IAC1B,IAAI,GAAG,IAAI,CAAC,GAAG;QAAE,OAAO,CAAC;IAEzB,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;AAChC,CAAC;AAED,SAAS,cAAc,CAAE,CAAM,EAAE,CAAM;IACrC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC;IACtB,IAAI,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,IAAI,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC;IAErB,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,IAAI;QAAE,OAAO,IAAI;IAErB,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,GAAG;IAMP,YAAa,GAAW,EAAE,IAAQ;QALlC,YAAO,GAAY,KAAK;QAMtB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;YAGxB,YAAY,EAAE,KAAK;YAGnB,QAAQ,EAAE,IAAI;SACf,EAAE,IAAI,IAAI,EAAE,CAAC;QAEd,IAAI,CAAC,GAAG,GAAG,GAAG;QACd,IAAI,CAAC,KAAK,GAAG,EAAE;QACf,MAAM,KAAK,GAAG,mBAAmB;QAEjC,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE;QAChB,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC;QAC1C,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,OAAM;QAExB,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;QAEhB,IAAI,MAAM,EAAE,MAAM,EAAE,MAAM;QAC1B,IAAI,QAAQ,GAAG,EAAE;QACjB,IAAI,QAAQ,GAAG,CAAC;QAChB,OAAO,GAAG,CAAC,MAAM,EAAE;YACjB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9C,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC;YACjE,IAAI,QAAQ,IAAI,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC;YAE5G,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;YAGrB,IAAI,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE;gBAEtC,IAAI,QAAQ,KAAK,CAAC,EAAE;oBAElB,IAAI,CAAC,EAAE,GAAG,QAAQ;iBACnB;qBAAM;oBACL,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;iBAC1B;gBACD,QAAQ,GAAG,EAAE;aACd;YAED,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;YAGvB,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;gBAClB,IAAI,QAAQ,KAAK,CAAC,EAAE;oBAClB,IAAI,QAAQ,CAAC,MAAM,EAAE;wBACnB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;qBAC1B;oBACD,QAAQ,GAAG,EAAE;iBACd;qBAAM,IAAI,QAAQ,KAAK,CAAC,EAAE;oBACzB,IAAI,QAAQ,CAAC,MAAM,EAAE;wBAEnB,IAAI,CAAC,IAAI,GAAG,QAAQ;qBACrB;oBACD,QAAQ,GAAG,EAAE;iBACd;gBACD,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;gBAClB,QAAQ,EAAE;aACX;SACF;QAED,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAEjC,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE;gBAEzD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;gBAEzC,OAAO,IAAI,CAAC,IAAI;gBAEhB,OAAO,IAAI,CAAC,EAAE;aACf;iBAAM;gBACL,IAAI,CAAC,OAAO,GAAG,IAAI;aACpB;SACF;QAED,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAEtB,IAAI,CAAC,iBAAiB,EAAE;SACzB;IACH,CAAC;IAED,iBAAiB,CAAE,KAAY;QAC7B,IAAI,CAAC,KAAK,EAAE;YAEV,IAAI,IAAI,CAAC,IAAI,EAAE;gBAEb,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAEjC,IAAI,CAAC,IAAI,CAAC,EAAE;oBAAE,OAAM;gBAEpB,KAAK,GAAG,IAAI,CAAC,EAAE;aAChB;iBAAM;gBACL,KAAK,GAAG,IAAI,CAAC,KAAK;aACnB;SACF;QAED,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO;QACvB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACjC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;YACf,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBACpC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC;gBACjB,OAAO,OAAO,CAAC,QAAQ;gBACvB,OAAO,OAAO,CAAC,OAAO;gBACtB,OAAO,OAAO,CAAC,MAAM;gBACrB,OAAO,OAAO,CAAC,qBAAqB;aACrC;SACF;IACH,CAAC;IAED,MAAM,CAAC,YAAY,CAAE,IAAoB,EAAE,MAAe,EAAE,KAAU;QAEpE,KAAK,CAAC,KAAK,CAAC;QACZ,IAAI,GAAG,GAAG,EAAE;QACZ,IAAI,CAAC;QACL,OAAO,IAAI,CAAC,UAAU,EAAE;YAEtB,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC;YAC9D,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM;gBAAE,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,MAAM;YAG1C,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;YAG7E,IAAI,GAAG,IAAI,CAAC,UAAU;SACvB;QAED,OAAO,GAAG;IACZ,CAAC;IAED,MAAM,CAAC,QAAQ,CAAE,IAAU,EAAE,MAAe,EAAE,KAAU;QACtD,IAAI,GAAG;QAEP,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACvB,MAAM,IAAI,GAAG,EAAE;YACf,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;gBACpB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;aACtD;YACD,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;SACrB;aAAM;YACL,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC;SAC7C;QAED,IAAI,KAAK;YAAE,GAAG,IAAI,KAAK;QAEvB,OAAO,UAAU,GAAG,GAAG,GAAG,GAAG;IAC/B,CAAC;IAED,MAAM,CAAC,QAAQ,CAAE,GAAQ;QACvB,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;SAE5B;QACD,IAAI,GAAG,CAAC,OAAO,EAAE;YACf,OAAO,GAAG,CAAC,OAAO,EAAE;SACrB;aAAM;YACL,OAAO,GAAG,CAAC,GAAG,EAAE;SACjB;IACH,CAAC;IAGD,MAAM,CAAC,WAAW,CAAE,CAAQ,EAAE,CAAQ;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QAExC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI;QACnB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;YACxB,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;YACT,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;YACT,IAAI,CAAC,EAAE;gBAAE,OAAO,CAAC,CAAC;YAClB,IAAI,CAAC,EAAE;gBAAE,OAAO,CAAC;YAEjB,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC;YAChC,IAAI,IAAI;gBAAE,OAAO,IAAI;SACtB;QACD,OAAO,CAAC;IACV,CAAC;IAGD,MAAM,CAAC,IAAI,CAAE,CAAM;QAEjB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACd,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3B,CAAC,CAAC;IACJ,CAAC;IAGD,MAAM,CAAC,OAAO,CAAE,CAAM,EAAE,CAAM;QAC5B,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE;QAChB,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE;QAChB,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,EAAE;YAC1B,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,EAAE;gBAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;gBAC/C,IAAI,IAAI;oBAAE,OAAO,IAAI;gBACrB,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;aACtC;YACD,IAAI,CAAC,CAAC,OAAO;gBAAE,EAAE,GAAG,EAAE,CAAC,IAAI;YAC3B,IAAI,CAAC,CAAC,OAAO;gBAAE,EAAE,GAAG,EAAE,CAAC,IAAI;YAE3B,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC;SAChC;aAAM;YACL,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC;SAChC;IACH,CAAC;IAGD,MAAM,CAAC,YAAY,CAAE,CAAM,EAAE,CAAM;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QAExC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI;QACnB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;YACxB,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;YACT,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;YACT,IAAI,CAAC,EAAE;gBAAE,OAAO,CAAC,CAAC;YAClB,IAAI,CAAC,EAAE;gBAAE,OAAO,CAAC;YAEjB,IAAI,GAAG,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS;YAClC,IAAI,IAAI;gBAAE,OAAO,IAAI;YAIrB,IAAI,EAAE,CAAC,SAAS,KAAK,CAAC,EAAE;gBACtB,OAAO,CAAC;aACT;YAKD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;gBAAE,SAAQ;YAGzB,IAAI,EAAE,CAAC,SAAS,GAAG,CAAC,KAAK,CAAC,EAAE;gBAC1B,IAAI,GAAG,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC;gBAChD,IAAI,IAAI;oBAAE,OAAO,IAAI;gBAErB,IAAI,GAAG,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC;gBAC7C,IAAI,IAAI;oBAAE,OAAO,IAAI;aACtB;YAED,IAAI,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC;YAC1C,IAAI,IAAI;gBAAE,OAAO,IAAI;SACtB;QACD,OAAO,CAAC;IACV,CAAC;IAED,cAAc,CAAE,GAAa,EAAE,GAAW;QACxC,IAAI;YACF,MAAM,EAAE,GAAG,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC;YACxC,EAAE,CAAC,SAAS,GAAG,GAAG;YAClB,OAAO,EAAE,CAAC,KAAK,IAAI,EAAE;SACtB;QAAC,OAAO,GAAG,EAAE;YAGZ,OAAO,GAAG;SACX;IACH,CAAC;IAGD,UAAU,CAAE,GAAa,EAAE,GAAW;QACpC,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,MAAM;IAC7C,CAAC;IAED,OAAO;QACL,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC;QAE9E,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACd,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;SAClC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;QAExC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QACnE,OAAO,KAAK;IACd,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC;QACxE,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;QAExC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACjE,OAAO,KAAK;IACd,CAAC;IAED,GAAG;QACD,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE;gBACpB,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE;gBAChB,OAAO,EAAE,IAAI;aACd;SACF;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;IACnC,CAAC;IAED,aAAa,CAAE,CAAM,EAAE,GAAQ;QAC7B,IAAI,CAAC,GAAG;YAAE,OAAM;QAChB,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC;QAC7C,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YACtB,IAAI,OAAO,CAAC,CAAC,qBAAqB,KAAK,QAAQ,EAAE;gBAC/C,CAAC,CAAC,qBAAqB,CAAC,IAAI,GAAG,GAAG;aACnC;iBAAM;gBACL,CAAC,CAAC,qBAAqB,GAAG,GAAG;aAC9B;YACD,OAAM;SACP;QACD,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;YACR,IAAI,OAAO,CAAC,CAAC,qBAAqB,KAAK,QAAQ,EAAE;gBAC/C,CAAC,CAAC,qBAAqB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;aACpC;iBAAM;gBACL,CAAC,CAAC,qBAAqB,GAAG,CAAC,CAAC,CAAC,CAAC;aAC/B;SACF;QAED,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;YAChB,CAAC,CAAC,QAAQ,GAAG,OAAO;SACrB;aAAM;YACL,CAAC,CAAC,QAAQ,GAAG,QAAQ;SACtB;IACH,CAAC;IAED,iBAAiB,CAAE,KAAU;QAC3B,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS;QAC5B,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,uBAAuB,CAAC;QACrD,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,SAAS;QACxC,MAAM,CAAC,GAAG;YACR,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAClB;QACD,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;YACtD,OAAO,SAAS;SACjB;QACD,OAAO,CAAC;IACV,CAAC;IAED,KAAK,CAAE,GAAQ;QACb,MAAM,CAAC,GAAG,EAAE;QACZ,MAAM,QAAQ,GAAG,MAAM;QACvB,IAAI,CAAC;QACL,IAAI,KAAK;QACT,IAAI,SAAS;QACb,IAAI,GAAG,EAAE,MAAM;QACf,IAAI,SAAS,GAAG,KAAK;QACrB,IAAI,SAAS,GAAG,KAAK;QACrB,IAAI,CAAC;QACL,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAChC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE;gBAClB,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;aACb;iBAAM;gBACL,GAAG,GAAG,EAAE;aACT;YACD,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;gBAC1B,MAAM,GAAG,IAAI;gBACb,SAAQ;aACT;YAED,IAAI,KAAK,KAAK,GAAG,EAAE;gBACjB,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;oBACvB,IAAI,CAAC,CAAC,EAAE;wBACN,CAAC,GAAG,GAAG;qBACR;yBAAM;wBACL,CAAC,IAAI,GAAG;qBACT;oBACD,MAAM,GAAG,KAAK;oBACd,SAAQ;iBACT;qBAAM;oBACL,IAAI,CAAC,EAAE;wBAEL,CAAC,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC;wBACzB,CAAC,GAAG,IAAI;qBACT;oBACD,SAAS,GAAG,KAAK;oBACjB,KAAK,GAAG,IAAI;iBACb;aACF;YAED,IAAI,KAAK,KAAK,GAAG,EAAE;gBACjB,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;oBACvB,IAAI,CAAC,CAAC,EAAE;wBACN,CAAC,GAAG,GAAG;qBACR;yBAAM;wBACL,CAAC,IAAI,GAAG;qBACT;oBACD,MAAM,GAAG,KAAK;oBACd,SAAQ;iBACT;qBAAM;oBACL,IAAI,CAAC,EAAE;wBAEL,CAAC,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC;wBACtB,CAAC,GAAG,IAAI;qBACT;oBACD,SAAS,GAAG,KAAK;oBACjB,KAAK,GAAG,IAAI;iBACb;aACF;YAED,IAAI,KAAK,KAAK,GAAG,EAAE;gBACjB,IAAI,IAAI,GAAG,KAAK;gBAChB,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,EAAE;oBACrD,IAAI,GAAG,KAAK,GAAG,EAAE;wBACf,IAAI,CAAC,SAAS,EAAE;4BACd,SAAS,GAAG,IAAI;yBACjB;6BAAM;4BACL,IAAI,GAAG,IAAI;yBACZ;qBACF;iBACF;qBAAM;oBACL,IAAI,GAAG,IAAI;iBACZ;gBACD,IAAI,CAAC,IAAI,EAAE;oBACT,IAAI,CAAC,CAAC,EAAE;wBACN,CAAC,GAAG,GAAG;qBACR;yBAAM;wBACL,CAAC,IAAI,GAAG;qBACT;oBACD,MAAM,GAAG,KAAK;oBACd,SAAQ;iBACT;qBAAM;oBACL,SAAS,GAAG,KAAK;oBACjB,KAAK,GAAG,IAAI;oBAEZ,IAAI,CAAC,IAAI,SAAS;wBAAE,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;oBACzD,CAAC,GAAG,IAAI;iBACT;aACF;YAED,IAAI,KAAK,KAAK,GAAG,EAAE;gBACjB,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAG,KAAK,GAAG,EAAE;oBACtC,IAAI,CAAC,CAAC,EAAE;wBACN,CAAC,GAAG,GAAG;qBACR;yBAAM;wBACL,CAAC,IAAI,GAAG;qBACT;oBACD,MAAM,GAAG,KAAK;oBACd,SAAQ;iBACT;qBAAM;oBACL,IAAI,CAAC,EAAE;wBAEL,CAAC,CAAC,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC;qBAC3B;oBACD,SAAS,GAAG,KAAK;oBACjB,KAAK,GAAG,IAAI;oBACZ,CAAC,GAAG,IAAI;iBACT;aACF;YAED,IAAI,CAAC,KAAK,EAAE;gBACV,IAAI,GAAG,KAAK,GAAG,EAAE;oBACf,CAAC,EAAE;oBACH,KAAK,GAAG,GAAG;oBACX,MAAK;iBACN;gBAED,IAAI,GAAG,KAAK,GAAG,EAAE;oBACf,MAAK;iBACN;gBAED,IAAI,GAAG,KAAK,GAAG,EAAE;oBACf,IAAI,SAAS,EAAE;wBACb,MAAK;qBACN;yBAAM;wBACL,SAAS,GAAG,IAAI;wBAChB,SAAS,GAAG,KAAK;wBACjB,KAAK,GAAG,GAAG;wBACX,MAAM,GAAG,KAAK;wBACd,SAAQ;qBACT;iBACF;gBAED,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,EAAE;oBAE7C,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;wBAItB,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAK,WAAW,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,WAAW,CAAC,EAAE;4BAC1F,MAAK;yBACN;wBAID,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,EAAE;4BACrE,MAAK;yBACN;qBACF;oBACD,SAAS,GAAG,KAAK;oBACjB,KAAK,GAAG,GAAG;oBACX,MAAM,GAAG,KAAK;oBACd,SAAS,GAAG,KAAK;oBACjB,SAAQ;iBACT;gBAED,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,KAAK,GAAG,EAAE;oBAC/C,SAAS,GAAG,KAAK;oBACjB,KAAK,GAAG,GAAG;oBACX,MAAM,GAAG,KAAK;oBACd,SAAQ;iBACT;gBAED,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,KAAK,GAAG,EAAE;oBAC/C,SAAS,GAAG,KAAK;oBACjB,KAAK,GAAG,QAAQ;oBAChB,MAAM,GAAG,KAAK;oBACd,SAAQ;iBACT;aACF;YAED,IAAI,KAAK,KAAK,GAAG,EAAE;gBACjB,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;oBAC1B,SAAS,GAAG,KAAK;oBACjB,KAAK,GAAG,IAAI;oBACZ,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;oBACxB,CAAC,GAAG,IAAI;iBACT;qBAAM,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;oBAEjC,CAAC,CAAC,qBAAqB,GAAG,EAAE;oBAC5B,IAAI,CAAC,EAAE;wBAEL,CAAC,CAAC,qBAAqB,CAAC,GAAG,GAAG,CAAC;qBAChC;oBACD,CAAC,GAAG,IAAI;iBACT;qBAAM;oBACL,IAAI,CAAC,CAAC,EAAE;wBACN,CAAC,GAAG,GAAG;qBACR;yBAAM;wBACL,CAAC,IAAI,GAAG;qBACT;iBACF;gBACD,MAAM,GAAG,KAAK;gBACd,SAAQ;aACT;YAED,IAAI,KAAK,KAAK,QAAQ,EAAE;gBACtB,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;oBAC1B,SAAS,GAAG,KAAK;oBACjB,KAAK,GAAG,IAAI;oBAEZ,CAAC,CAAC,MAAM,GAAG,CAAC;oBACZ,CAAC,GAAG,IAAI;iBACT;qBAAM;oBACL,IAAI,CAAC,CAAC,EAAE;wBACN,CAAC,GAAG,GAAG;qBACR;yBAAM;wBACL,CAAC,IAAI,GAAG;qBACT;iBACF;gBACD,MAAM,GAAG,KAAK;gBACd,SAAQ;aACT;YAED,MAAM,GAAG,KAAK;SACf;QAGD,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC;QAEzF,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,KAAK,GAAG,CAAC,EAAE;IAC1D,CAAC;IAKD,sBAAsB,CAAE,GAAa,EAAE,UAAmB,EAAE,KAAa,EAAE,MAAc;QAEvF,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU;QACtC,IAAI,CAAC,QAAQ,CAAC,MAAM;YAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE;QAI5D,IAAI,KAAK,IAAI,CAAC,EAAE;YACd,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE;SAClE;QAED,IAAI,QAAQ,GAAG,CAAC;QAChB,IAAI,SAAS;QACb,IAAI,CAAC,EAAE,KAAK;QAGZ,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpC,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC;YAEnB,QAAQ,KAAK,CAAC,QAAQ,EAAE;gBACtB,KAAK,YAAY;oBAMf,IAAI,QAAQ,GAAG,CAAC,KAAK,CAAC,EAAE;wBACtB,QAAQ,IAAI,CAAC;wBACb,IAAI,QAAQ,IAAI,KAAK,EAAE;4BAErB,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,KAAK,IAAI,MAAM,EAAE;gCACnD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;6BAC/B;4BACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE;yBAClC;qBACF;yBAAM;wBACL,QAAQ,IAAI,CAAC;wBACb,IAAI,QAAQ,KAAK,KAAK,EAAE;4BAEtB,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,KAAK,IAAI,MAAM,EAAE;gCACnD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;6BAC/B;4BAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE;yBAKlC;6BAAM,IAAI,QAAQ,GAAG,KAAK,EAAE;4BAC3B,IAAI,CAAC,SAAS,EAAE;gCACd,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE;6BACvC;4BAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,WAAW,CAAC,EAAE;yBAChF;qBACF;oBACD,SAAS,GAAG,KAAK;oBACjB,MAAK;gBACP,KAAK,SAAS,CAAC;gBACf,KAAK,kBAAkB;oBAGrB,IAAI,QAAQ,KAAK,CAAC,IAAI,QAAQ,GAAG,CAAC,KAAK,CAAC,EAAE;wBACxC,QAAQ,IAAI,CAAC;qBACd;yBAAM;qBAGN;oBAED,IAAI,QAAQ,KAAK,KAAK,EAAE;wBAKtB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,CAAC;wBAE1D,IAAI,MAAM,IAAI,UAAU,EAAE;4BACxB,MAAM,IAAI,UAAU;yBACrB;6BAAM;4BACL,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE;yBACvC;qBACF;oBACD,SAAS,GAAG,KAAK;oBACjB,MAAK;gBACP;oBACE,SAAQ;aACX;SACF;QAMD,IAAI,KAAK,GAAG,QAAQ,EAAE;YACpB,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE;YAChD,IAAI,CAAC,SAAS,EAAE;gBAEd,CAAC,CAAC,IAAI,GAAG,UAAU;aACpB;iBAAM;gBAEL,CAAC,CAAC,IAAI,GAAG,SAAS;aACnB;YAED,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;gBAE3B,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;aAC3D;YACD,OAAO,CAAC;SACT;IACH,CAAC;IAED,UAAU,CAAE,IAAa;QACvB,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK;QACvB,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,kBAAkB,EAAE;YACvE,OAAO,IAAI;SACZ;QACD,OAAO,KAAK;IACd,CAAC;IAGD,aAAa,CAAE,GAAa,EAAE,IAAa,EAAE,MAAc,EAAE,SAAc;QACzE,IAAI,OAAO,GAAG,IAAI;QAClB,IAAI,QAA4B;QAEhC,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;YACjC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC;SAC/C;aAAM;YACL,SAAS,CAAC,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC;YACvD,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC;YACzD,QAAQ,GAAG,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,SAAS,CAAC,IAAI;SAChD;QAED,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE;YAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE;SAC3B;QAGD,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;YAE/C,OAAO,GAAG,OAAO,CAAC,eAAe;SAClC;QAED,MAAM,SAAS,GAAG,OAAO;QACzB,IAAI,GAAG;QACP,MAAM,WAAW,GAAG,EAAE;QACtB,IAAI,GAAG,GAAG,EAAE;QACZ,IAAI,CAAC,GAAG,CAAC;QACT,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;YAE/B,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC;YACnD,WAAW,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM;YAC3B,GAAG,IAAI,GAAG;YAEV,IAAI,CAAC,OAAO,CAAC,WAAW;gBAAE,MAAK;YAE/B,OAAO,GAAG,OAAO,CAAC,WAAW;YAC7B,CAAC,EAAE;SACJ;QAGD,MAAM,WAAW,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC;QAC1D,IAAI,CAAC,CAAC,CAAC,MAAM;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE;QAGtC,IAAI,SAAS,GAAG,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC;QAElC,IAAI,OAAO,KAAK,IAAI,IAAI,SAAS,KAAK,MAAM,EAAE;YAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE;SACxB;QAED,CAAC,GAAG,CAAC;QACL,OAAO,GAAG,SAAS;QAEnB,OAAO,SAAS,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE;YAElC,SAAS,IAAI,WAAW,CAAC,CAAC,CAAC;YAC3B,IAAI,SAAS,GAAG,CAAC;gBAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE;YAE1C,MAAM,WAAW,GAAG,EAAE;YAEtB,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,MAAM;gBAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE;YAChF,CAAC,EAAE;YAEH,OAAO,GAAG,OAAO,CAAC,WAAW;SAC9B;QAED,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE;IAC7C,CAAC;IAED,WAAW,CAAE,KAAa,EAAE,QAAmE,EAAE,GAAa,EAAE,IAAQ;QACtH,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC;QAIjD,IAAI,SAAS;QACb,IAAI,KAAK,KAAK,CAAC,EAAE;YACf,SAAS,GAAG,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC;SACzC;QAED,IAAI,CAAC,SAAS,EAAE;YACd,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,UAAU,EAAE;gBAC9B,IAAI,CAAC,CAAC,QAAQ,KAAK,YAAY,EAAE;oBAE/B,SAAS,GAAG,CAAC;oBACb,MAAK;iBACN;aACF;SACF;QAGD,SAAS,GAAG,GAAG;QAGf,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC;QAElE,IAAI,IAAI,GAAG,SAAS;QACpB,IAAI,SAAS,GAAG,CAAC;QACjB,IAAI,CAAC;QACL,IAAI,OAA4C;QAChD,KAAK,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YACzC,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC;YAErB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE;gBACpF,SAAS,GAAG,CAAC,GAAG,CAAC;gBACjB,MAAK;aACN;SACF;QAID,IAAI,CAAC,IAAI,EAAE;YACT,IAAI,GAAG,SAAS;SACjB;QAED,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE;QAE3B,IAAI,SAAS;QACb,KAAK,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC5C,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC;YAErB,IAAI,OAAO,EAAE;gBAGX,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC;gBAG/E,IAAI,OAAO,CAAC,qBAAqB,EAAE;oBAGjC,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC;iBACnF;aACF;SACF;QAED,OAAO,CAAC;IACV,CAAC;IAWD,UAAU,CAAE,KAAa,EAAE,GAAa,EAAE,IAA6B;QACrE,IAAI,GAAG,IAAI,IAAI,EAAE;QACjB,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YAC9C,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;SAC1C;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAClC,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,KAAK,CAAC;QAGtE,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC;QAEtD,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI;QAGjB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;QAC1C,IAAI,OAAO,KAAK,SAAS;YAEvB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE;YAEnD,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;YACxC,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC;YAExE,IAAI,GAAG,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC;YAChC,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC;YAErE,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;YACtC,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC;YAErE,OAAO,IAAI;SACZ;QAED,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,OAAO,EAAE;YAE/C,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;YACpC,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,OAAO,GAAG,qCAAqC,CAAC;YAC1E,OAAO,GAAG;SACX;QAED,IAAI,OAAO,KAAK,QAAQ,EAAE;YAExB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;YACtC,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,OAAO,GAAG,sCAAsC,CAAC;YAC5E,OAAO,IAAI;SACZ;QAED,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,KAAK,EAAE;YAE5C,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;YAC5C,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,OAAO,GAAG,4CAA4C,CAAC;YAClF,OAAO,IAAI;SACZ;QAED,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC;IACjC,CAAC;IAED,SAAS,CAAE,CAAM;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,eAAe,CAAE,GAAa,EAAE,KAAW;QACzC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;QAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,KAAK,CAAC;QAGtE,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC;QAGhD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAE9D,OAAO,QAAQ,CAAC,SAAS;QAEzB,IAAI,CAAC,QAAQ,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC,MAAM;QAErC,uCAAY,QAAQ,GAAK,CAAC,EAAE;IAC9B,CAAC;IAKD,WAAW,CAAE,GAAa,EAAE,IAAQ;QAClC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;YACnB,KAAK,EAAE,KAAK;SACb,EAAE,IAAI,IAAI,EAAE,CAAC;QAEd,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC;SAC7C;QAGD,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE;YAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE;YAC3B,IAAI,IAAI,CAAC,cAAc,KAAK,QAAQ,EAAE;gBAEpC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;aAC7C;iBAAM,IAAI,IAAI,CAAC,cAAc,KAAK,OAAO,EAAE;gBAE1C,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;aAC5C;iBAAM;gBACL,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;aACvC;YAED,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE;YACvB,IAAI,EAAE,CAAC,cAAc,KAAK,QAAQ,EAAE;gBAElC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC;aACvC;iBAAM,IAAI,EAAE,CAAC,cAAc,KAAK,OAAO,EAAE;gBAExC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC;aACtC;iBAAM;gBACL,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC;aACjC;YAED,OAAO,KAAK;SACb;QAED,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;YAC/C,EAAE,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3C,OAAO,EAAE,IAAI;SACd;IACH,CAAC;IAED,OAAO,CAAE,GAAa,EAAE,IAAQ;QAE9B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC;IACpC,CAAC;CACF;AAIA;AAEM,MAAM,2BAA2B,GAAG,CAAC,GAAW,EAIrD,EAAE;;IACF,MAAM,CAAC,MAAM,CAAC,GAAG,UAAG;SACjB,KAAK,CAAC,gCAAgC,CAAC,0CACtC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC;SAC5C,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAI,EAAE;IAC7B,MAAM,CAAC,MAAM,CAAC,GAAG,UAAG;SACjB,KAAK,CAAC,gCAAgC,CAAC,0CACtC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC;SAC5C,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAI,EAAE;IAC7B,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,kCAAkC,EAAE,EAAE,CAAC;IACtE,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;IAE1C,OAAO;QACL,UAAU;QACV,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM;QACpD,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;KACrD;AACH,CAAC;;;;;;;;;;;;;;;;;;;AChmCM,MAAM,4CAA4C,GAAG,0CAA0C;AAC/F,MAAM,sBAAsB,GAAG,oBAAoB;AACnD,MAAM,4BAA4B,GAAG,CAAC;AACtC,MAAM,oDAAoD,GAAG,GAAG;AAChE,MAAM,kCAAkC,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;ACJ9B;AAC4B;AAGhC;AAIpC,MAAM,aAAa,GAAG,CAAC,eAAqD,EAAE,EAAE;IACrF,IAAI,QAA8B;IAClC,IAAI,WAAoC;IACxC,MAAM,0BAA0B,GAAG,IAAI,iDAAe,CAAC,KAAK,CAAC;IAC7D,MAAM,YAAY,GAAG,IAAI,yCAAO,EAAY;IAC5C,MAAM,eAAe,GAAG;QACtB,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;QACT,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC;KACL;IACD,MAAM,gBAAgB,GAAG,EAAE;IAC3B,MAAM,cAAc,GAAG,EAAE;IACzB,MAAM,SAAS,GAAG,CAAC;IACnB,MAAM,YAAY,GAAG,CAAC;IACtB,MAAM,QAAQ,GAAG,IAAI,yCAAO,EAAQ;IACpC,MAAM,QAAQ,GAAG,yDAAc,CAAC,eAAe,CAAC;IAOhD,MAAM,mBAAmB,GAAG,GAAG,EAAE;QAC/B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,eAAe;QACzC,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM;QAElC,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC,mBAAmB;YAAE,OAAO,KAAK;QAM5D,IAAI,SAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,aAAa,MAAK,qBAAqB;YAAE,OAAO,KAAK;QAGnE,IAAI,CAAC,WAAW,IAAI,SAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,eAAe,MAAK,UAAU,EAAE;YAC5D,OAAO,IAAI;SACZ;QAGD,OAAO,CACL,WAAW;YACX,CACE,SAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,eAAe,MAAK,SAAS;gBACvC,SAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,eAAe,MAAK,MAAM;gBACpC,SAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,eAAe,MAAK,WAAW;gBACzC,SAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,eAAe,MAAK,MAAM,CACrC,CACF;IACH,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,WAAqB,EAAE,cAA2B,EAAE,EAAE;QAClE,QAAQ,GAAG,WAAW;QACtB,WAAW,GAAG,cAAc;QAE5B,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,yBAAyB,EAAE,0BAA0B,CAAC,KAAK,EAAE,CAAC;QAE7F,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC;IAChC,CAAC;IAKD,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,OAAO,SAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,gBAAgB,MAAK,KAAK;IAC7C,CAAC;IAED,MAAM,qBAAqB,GAAG,GAAG,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC;IAKzE,0BAA0B;SACvB,IAAI,CACH,oDAAI,CAAC,CAAC,CAAC,EACP,oEAAoB,EAAE,EACtB,mDAAG,CAAC,GAAG,EAAE;QACP,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,yBAAyB,EAAE,0BAA0B,CAAC,KAAK,EAAE,CAAC;IAC/F,CAAC,CAAC,EACF,yDAAS,CAAC,QAAQ,CAAC,CACpB;SACA,SAAS,EAAE;IAEd,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,QAAQ,CAAC,OAAO,EAAE;QAClB,YAAY,CAAC,QAAQ,EAAE;QACvB,QAAQ,CAAC,IAAI,EAAE;QACf,QAAQ,CAAC,QAAQ,EAAE;QACnB,0BAA0B,CAAC,QAAQ,EAAE;IACvC,CAAC;IAED,OAAO;QACL,IAAI;QACJ,KAAK;QACL,uBAAuB,EAAE,GAAG,EAAE,CAAC,uBAAuB,CAAC,QAAQ,CAAC;QAChE,OAAO;QACP,cAAc,EAAE,GAAG,EAAE,CAAC,WAAW;QACjC,wBAAwB,EAAE,GAAG,EAAE,CAAC,CAAC;QACjC,kBAAkB,EAAE,GAAG,EAAE,CAAC,eAAe;QACzC,mBAAmB;QACnB,qBAAqB;QACrB,kBAAkB,EAAE,CAClB,CAAS,EACT,CAAS,EACT,KAAa,EACb,MAAc,EACd,EAAE;YAEF,eAAe,CAAC,KAAK,GAAG,KAAK;YAC7B,eAAe,CAAC,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,YAAY;YAC1D,eAAe,CAAC,CAAC,GAAG,CAAC;YACrB,eAAe,CAAC,CAAC,GAAG,CAAC;QAMvB,CAAC;QACD,WAAW,EAAE,GAAG,EAAE,CAAC,QAAQ;QAC3B,mBAAmB,EAAE,GAAG,EAAE,CAAC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,gBAAgB;QACrD,WAAW,EAAE,GAAG,EAAE;YAChB,OAAO;gBACL,KAAK,EAAE,mBAAmB,EAAE;oBAC1B,CAAC,CAAC,eAAe,CAAC,KAAK,GAAG,CAAC;oBAC3B,CAAC,CAAC,eAAe,CAAC,KAAK;gBACzB,MAAM,EAAE,eAAe,CAAC,MAAM;aAC/B;QACH,CAAC;QACD,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,WAAW,EAAE,CAAC,IAAgD,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE;YAC5F,yBAAyB,EAAE,0BAA0B,CAAC,KAAK;YAC3D,QAAQ;SACT,CAAC;QACF,CAAC,EAAE;YACD,mBAAmB,EAAE,0BAA0B;iBAC5C,YAAY,EAAE;iBACd,IAAI,CAAC,oEAAoB,EAAE,CAAC;YAC/B,QAAQ,EAAE,QAAQ;iBACf,YAAY,EAAE;YACjB,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS;YAC/B,KAAK,EAAE,YAAY;iBAChB,YAAY,EAAE;SAClB;KACF;AACH,CAAC;AAID,MAAM,uBAAuB,GAAG,CAAC,QAA8B,EAAE,EAAE,CAAC,CAAC,SAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,KAAK,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7J1F;AACF;AACI;AACqB;AACzB;AACU;AACA;AACV;AAC6B;AAE/B;AAC2C;AACzC;AACQ;AACR;AACY;AACI;AACd;AAOnD,MAAM,iBAAiB,GAAG,CAAsD,MAAW,EAAE,EAAE;IAC7F,MAAM,EACJ,OAAO,EACP,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,4BAA4B,EAC5B,YAAY,EACZ,OAAO,EACP,qBAAqB,EACrB,WAAW,EACX,UAAU,EACV,qBAAqB,EACrB,KAAK,KAEH,MAAM,EADL,aAAa,UACd,MAAM,EAfJ,4PAeL,CAAS;IAEV,OAAO,aAAa;AACtB,CAAC;AAKD,MAAM,gBAAgB,GAAG,2EAAe,CACtC,wEAAmB,EAEjB,qEAAkB,EAClB,+DAAe,EACf,2DAAa,EACb,qEAAkB,EAClB,6DAAc,EACd,4DAAa,EACb,yDAAY,EACZ,oFAAc,EACd,4DAAa,EACb,oEAAiB,EACjB,4EAAqB,EACrB,2DAAa,EACb,2DAAa,EACb,8DAAc,CACjB;AAQM,SAAS,wBAAwB,CAAiC,OAAiF,EAAE,QAAuB;IACjL,IAAI,CAAC,QAAQ,EAAE;QACb,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,kDAAoB,CAAC;QAEnE,OAAO,iBAAiB,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;KACxD;IAED,MAAM,aAAa,GAAG,2EAAe,CAAC,gBAAgB,EAAE,QAAQ,CAAC;IACjE,MAAM,oBAAoB,GAAG,aAAa,CAAC,kDAAoB,CAAC;IAEhE,OAAO,iBAAiB,CAAC,oBAAoB,CAAC,OAAO,CAAQ,CAAC;AAChE,CAAC;;;;;;;;;;;;;;;AC/EM,MAAM,qBAAqB,GAE7B,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IAE5B,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CAAC,CAAC,OAAO,EAAE,EAAE;QACpD,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACtB,IAAI,KAAK,CAAC,cAAc,EAAE;gBACxB,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,WAAW,CAAC;aAC1C;iBAAM;gBACL,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC;aAC7C;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,EACF,CAAC;IAEF,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;;QACzD,QAAQ,CAAC,4BAA4B,EAAE;;UAKjC,EAAE;;;KAGP,CAAC;QAEF,MAAM,KAAK,GAAG,WAAK,CAAC,eAAe,0CAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;QAE/D,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO,CAAC,IAAI,CAAC,EAAE;YACpB,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;QACxB,CAAC,CAAC;QAEF,OAAO,GAAG,EAAE;YACV,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO,CAAC,IAAI,CAAC,EAAE;gBACpB,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,CAAC,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;IAEF,yBACK,MAAM,EACV;AACH,CAAC;;;;;;;;;;;;;;;AC9CD,MAAM,iBAAiB,GAAG,KAAK;AAKxB,MAAM,cAAc,GAEtB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IA0B5B,MAAM,CAAC,mBAAmB,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE;QAClD,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,oBAAoB,KAAK,YAAY,EAAE;gBACtE,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;aACzB;QACH,CAAC;QAOD,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAc9C,SAAS,CAAC,GAAG,EAAE;YACb,SAAS,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC;QACnD,CAAC,CAAC;QAEF,OAAO,iBAAiB;IAC1B,CAAC,CAAC;IAEF,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;;QAM/C,WAAK,CAAC,eAAe,0CAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC;IAC5D,CAAC,CAAC;IAiBF,OAAO,MAAM;AACf,CAAC;;;;;;;;;;;;;;;;AC7FyC;AAiGnC,SAAS,eAAe,CAAE,GAAG,KAAY;IAC9C,OAAO,uDAAO,CAAC,GAAG,KAAK,CAAC;AAC1B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpGiG;AACpD;AAG9C,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU;AAC1E,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAU;AAuCnE,MAAM,aAAa,GAAkD,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAMtF,EAAE,EAAE;QANkF,EACrF,SAAS,GAAG,CAAC,EACb,UAAU,GAAG,WAAW,EACxB,UAAU,GAAG,WAAW,EACxB,iBAAiB,GAAG,WAAW,OAEhC,EADI,OAAO,cAL2E,8DAMtF,CADW;IAEV,MAAM,gBAAgB,GAAG,IAAI,iDAAe,CAAgB;QAC1D,SAAS;QACT,UAAU;QACV,UAAU;QACV,iBAAiB;KAClB,CAAC;IACF,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IAE5B,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC;MAQnB,EAAE;;QAEA,gBAAgB,CAAC,KAAK,CAAC,SAAS,KAAK,CAAC;QACxC,CAAC,CAAC,cAAc,gBAAgB,CAAC,KAAK,CAAC,SAAS,gBAAgB;QAChE,CAAC,CAAC,EAAE;QACF,gBAAgB,CAAC,KAAK,CAAC,UAAU,KAAK,WAAW;QACnD,CAAC,CAAC,gBAAgB,gBAAgB,CAAC,KAAK,CAAC,UAAU,cAAc;QACjE,CAAC,CAAC,EAAE;QACF,gBAAgB,CAAC,KAAK,CAAC,UAAU,KAAK,WAAW;QACnD,CAAC,CAAC,gBAAgB,gBAAgB,CAAC,KAAK,CAAC,UAAU,cAAc;QACjE,CAAC,CAAC,EAAE;QACF,gBAAgB,CAAC,KAAK,CAAC,iBAAiB,KAAK,WAAW;QAC1D,CAAC,CAAC,eAAe,gBAAgB,CAAC,KAAK,CAAC,iBAAiB,cAAc;QACvE,CAAC,CAAC,EAAE;;GAEP;IAKD,MAAM,sBAAsB,GAAG,CAAC,aAAsB,EAAE,EAAE;QACxD,MAAM,CAAC,oBAAoB,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE;YAC9D,IAAI,IAAI,CAAC,eAAe,KAAK,eAAe,EAAE;gBAC5C,WAAW,CAAC,oBAAoB,CAAC;gBACjC,QAAQ,CAAC,oBAAoB,EAAE,QAAQ,EAAE,CAAC;aAC3C;YAED,OAAO,aAAa;QACtB,CAAC,CAAC;IACJ,CAAC;IAKD,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE;QACrE,IAAI,IAAI,CAAC,eAAe,KAAK,eAAe,EAAE;YAC5C,WAAW,CAAC,oBAAoB,CAAC;YACjC,QAAQ,CAAC,oBAAoB,EAAE,QAAQ,EAAE,CAAC;SAC3C;IACH,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAG,CAAqD,MAAqB,EAAE,EAAE,CAAC,MAAM;SAC9G,IAAI,CACH,wDAAQ,EAAE,EACV,yCAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE;QACpB,IAAI,MAAM,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS;YAAE,OAAO,IAAI;QACnD,IAAI,MAAM,CAAC,UAAU,KAAK,GAAG,CAAC,UAAU;YAAE,OAAO,IAAI;QAErD,OAAO,KAAK;IACd,CAAC,CAAC,CACH;IAEH,gBAAgB,CAAC,YAAY,EAAE;SAC5B,IAAI,CACH,mBAAmB,EACnB,mDAAG,CAAC,sBAAsB,CAAC,EAC3B,+CAAS,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAC7B;SACA,SAAS,EAAE;IAEd,uCACK,MAAM,KAIT,WAAW,EAAE,CAAC,QAAQ,EAAE,EAAE;YACxB,MAAM,EACJ,iBAAiB,GAAG,gBAAgB,CAAC,KAAK,CAAC,iBAAiB,EAC5D,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAC5C,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,UAAU,EAC9C,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,UAAU,KAE5C,QAAQ,EADP,mBAAmB,UACpB,QAAQ,EANN,8DAML,CAAW;YAEZ,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC,mBAAmB,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,EAAE;gBACvF,gBAAgB,CAAC,IAAI,CAAC,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;aAChF;YACD,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC;QACzC,CAAC,EACD,CAAC,kCACI,MAAM,CAAC,CAAC,KAIX,SAAS,EAAE,mDAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;iBAC7D,IAAI,CACH,yCAAG,CAAC,CAAC,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,iCAC9B,aAAa,GACb,QAAQ,EACX,CAAC,CACJ,OAEN;AACH,CAAC;AAED,MAAM,SAAS,GAAG,CAA6B,GAAQ,EAAE,IAAW,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC;;;;;;;;;;;;;;;AChK9F,MAAM,eAAe,GAAqB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE;IACrE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IAE5B,MAAM,UAAU,GAAG,CAAC,CAAgB,EAAE,EAAE;QACtC,IAAI,CAAC,CAAC,GAAG,KAAK,YAAY,EAAE;YAC1B,MAAM,CAAC,SAAS,EAAE;SACnB;QAED,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW,EAAE;YACzB,MAAM,CAAC,QAAQ,EAAE;SAClB;IACH,CAAC;IAED,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC;IAE9C,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;;QAC/C,WAAK,CAAC,eAAe,0CAAE,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC;QAE5D,OAAO,GAAG,EAAE;;YACV,WAAK,CAAC,eAAe,0CAAE,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC;QACjE,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC;QACjD,MAAM,CAAC,OAAO,EAAE;IAClB,CAAC;IAED,uCACK,MAAM,KACT,OAAO,IACR;AACH,CAAC;;;;;;;;;;;;;;;;;;;AClCwE;AAC0B;AAGnG,MAAM,iBAAiB,GAAG,KAAK;AAYxB,MAAM,oBAAoB,GAAG,CAAC,MAAc,EAAE,EAAE;IACrD,IAAI,iCAA6D;IAEjE,MAAM,CAAC,mBAAmB,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE;QAClD,iCAAiC,GAAG,SAAS,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC;QAChF,iCAAiC,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;KAOjD;QACD,SAAS,CAAC,WAAW,CAAC,iCAAiC,CAAC;QAExD,SAAS,CAAC,GAAG,EAAE;YACb,iCAAiC,aAAjC,iCAAiC,uBAAjC,iCAAiC,CAAE,MAAM,EAAE;QAC7C,CAAC,CAAC;QAEF,OAAO,iBAAiB;IAC1B,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,CAAI,MAAqB,EAAE,EAAE,CAAC,+CAAS,CAAC,MAAM,EAAE,yDAAuB,CAAC;SAC9F,IAAI,CACH,mDAAG,CAAC,GAAG,EAAE;QACP,iCAAiC,aAAjC,iCAAiC,uBAAjC,iCAAiC,CAAE,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,QAAQ,CAAC;IAC9E,CAAC,CAAC,CACH;IAEH,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,sDAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IACnF,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,sDAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAEnF,MAAM,sBAAsB,GAAG,aAAa;SACzC,IAAI,CACH,mDAAG,CAAC,GAAG,EAAE;QACP,iCAAiC,aAAjC,iCAAiC,uBAAjC,iCAAiC,CAAE,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,SAAS,CAAC;IAC/E,CAAC,CAAC,CACH;IAEH,MAAM,sBAAsB,GAAG,gBAAgB,CAAC,aAAa,CAAC;SAC3D,IAAI,CACH,oDAAI,CAAC,CAAC,CAAC,CACR;IAEH,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;SAC7C,IAAI,CACH,mDAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,oBAAoB,CAAC,EAC5D,oEAAoB,EAAE,CACvB;IAEH,MAAM,mBAAmB,GAAG,aAAa;SACtC,IAAI,CACH,yDAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,YAAY;QACvC,CAAC,CAAC,sBAAsB;aACrB,IAAI,CACH,yDAAS,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC,CACxC;QACH,CAAC,CAAC,gBAAgB,CAAC,wCAAE,CAAC,SAAS,CAAC,CAAC,CAClC,EACD,yDAAS,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAC7B;IAEH,OAAO,mBAAmB;AAC5B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC/EoD;AAC2B;AAEnB;AACjB;AACQ;AAEpD,MAAM,iBAAiB,GAAG,KAAK;AASxB,MAAM,cAAc,GAOa,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAkE,EAAE,EAAE;QAAtE,EAAE,oBAAoB,GAAG,EAAE,EAAE,kBAAkB,GAAG,EAAE,OAAc,EAAT,OAAO,cAAhE,8CAAkE,CAAF;IACjH,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IAC5B,MAAM,gBAAgB,GAAG,IAAI,iDAAe,CAAiB;QAC3D,oBAAoB;QACpB,kBAAkB;KACnB,CAAC;IAEF,MAAM,CAAC,YAAY,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACjD,IAAI,UAAU,GAAG,KAAK;QAwBtB,MAAM,CAAC,oBAAoB,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;YACxC,IAAI,CAAC,UAAU,IAAI,KAAK,EAAE;gBAExB,KAAK,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC;gBACzC,UAAU,GAAG,IAAI;aAClB;YAED,OAAO,iBAAiB;QAC1B,CAAC,CAAC;IACJ,CAAC,CAAC;IAMF,MAAM,CAAC,YAAY,CAAC,+BAA+B,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE;;QAClG,MAAM,EAAE,oBAAoB,GAAG,CAAC,EAAE,kBAAkB,GAAG,CAAC,EAAE,GAAG,gBAAgB,CAAC,KAAK;QACnF,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE;QAE7C,IACE,IAAI,CAAC,eAAe,KAAK,YAAY;YACrC,KAAK,CAAC,UAAU,EAAE;YAClB,CAAC,WAAW,EAAE;YACd,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAC9B;YACA,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE,EAAE,CAAC;YAEjC,IAAI,WAAW,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,oBAAoB,GAAG,CAAC,CAAC;YAC7D,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,kBAAkB,GAAG,CAAC,CAAC;YAC/D,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,oBAAoB,GAAG,CAAC,CAAC;YACvD,IAAI,SAAS,GAAG,oBAAoB,GAAG,CAAC;YAExC,IAAI,KAAK,CAAC,sBAAsB,EAAE,EAAE;gBAClC,KAAK,GAAG,YAAY,GAAG,CAAC,oBAAoB,GAAG,CAAC,CAAC;gBACjD,WAAW,GAAG,YAAY;gBAC1B,SAAS,GAAG,kBAAkB,GAAG,CAAC;aACnC;YAED,WAAK,CAAC,mBAAmB,EAAE,0CAAE,WAAW,CAAC,2BAA2B,CAAC;YACrE,WAAK,CAAC,mBAAmB,EAAE,0CAAE,QAAQ,CAAC,2BAA2B,EAAE;;mBAEtD,KAAK;oBACJ,kBAAkB,MAAM,oBAAoB;wBACxC,SAAS;0BACP,WAAW;oBACjB,YAAY;;;uBAGT,WAAW;wBACV,YAAY;;;uBAGb,WAAW;;;uBAGX,WAAW;;OAE3B,CAAC;SACH;IACH,CAAC,CAAC;IAWF,IAAI,QAAoC;IAExC,IAAI,OAAO,CAAC,gBAAgB,KAAK,WAAW,EAAE;QAC5C,QAAQ,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE;YACjC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,EAAE;QAClB,CAAC,CAAC;QACF,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC;KAC3C;IAED,MAAM,cAAc,GAAG,2EAAoB,CAAC,MAAM,CAAC;IAEnD,cAAc,CAAC,SAAS,EAAE;IAE1B,gBAAgB;SACb,IAAI,CACH,sDAAS,CAAC,CAAC,sBAAsB,EAAE,oBAAoB,CAAC,CAAC,EACzD,oEAAoB,CAAC,0DAAc,CAAC,EACpC,oDAAI,CAAC,CAAC,CAAC,EACP,mDAAG,CAAC,GAAG,EAAE;QACP,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE;IACvB,CAAC,CAAC,EACF,yDAAS,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAC7B;SACA,SAAS,EAAE;IAEd,uCACK,MAAM,KACT,OAAO,EAAE,GAAG,EAAE;YACZ,MAAM,CAAC,OAAO,EAAE;YAChB,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,UAAU,EAAE;QACxB,CAAC,EACD,WAAW,EAAE,CAAC,EAAqD,EAAE,EAAE;gBAAzD,EAAE,kBAAkB,EAAE,oBAAoB,OAAW,EAAN,IAAI,cAAnD,8CAAqD,CAAF;YAC/D,IAAI,oBAAoB,KAAK,SAAS,IAAI,kBAAkB,KAAK,SAAS,EAAE;gBAC1E,gBAAgB,CAAC,IAAI,CAAC;oBACpB,oBAAoB,EAAE,oBAAoB,aAApB,oBAAoB,cAApB,oBAAoB,GAAI,gBAAgB,CAAC,KAAK,CAAC,oBAAoB;oBACzF,kBAAkB,EAAE,kBAAkB,aAAlB,kBAAkB,cAAlB,kBAAkB,GAAI,gBAAgB,CAAC,KAAK,CAAC,kBAAkB;iBACpF,CAAC;aACH;YAED,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC;QAC1B,CAAC,EACD,CAAC,kCACI,MAAM,CAAC,CAAC,KACX,SAAS,EAAE,mDAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,gBAAgB,CAAC,YAAY,EAAE,CAAC,CAAC;iBAC5E,IAAI,CACH,mDAAG,CAAC,CAAC,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,iCAC9B,aAAa,GACb,QAAQ,EACX,CAAC,CACJ,OAEN;AACH,CAAC;;;;;;;;;;;;;;;;;;ACjLyC;AACR;AAK3B,MAAM,aAAa,GAIrB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IAC5B,MAAM,OAAO,GAAG,IAAI,yCAAO,EAAe;IAE1C,MAAM,wBAAwB,GAAG,CAAC,OAA0B,EAAE,EAAE;;QAC9D,IAAI,CAAC,OAAO,CAAC,IAAI;YAAE,OAAM;QAEzB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;QACrC,MAAM,iBAAiB,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE;QAEhE,MAAM,oBAAoB,GAAG,YAAM,CAAC,OAAO,CAAC,WAAW,EAAE,0CAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,iBAAiB,CAAC;QACnH,IAAI,oBAAoB,EAAE;YACxB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;SACxB;IACH,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QAC/C,IAAI,KAAK,CAAC,eAAe,EAAE;YACzB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACjH,IAAI,CAAC,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,CAAC,MAAM,IAAI,cAAc,IAAI,CAAC,CAAC,MAAM,EAAE;oBACjE,gDAAW,CAAC,oBAAoB,EAAE,OAAO,EAAE,CAAC,CAAC;oBAC7C,CAAC,CAAC,cAAc,EAAE;oBAClB,wBAAwB,CAAC,OAAO,CAAC;oBACjC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;iBACtD;YACH,CAAC,CAAC,CAAC;SACJ;IACH,CAAC,CAAC;IAEF,uCACK,MAAM,KACT,CAAC,kCACI,MAAM,CAAC,CAAC,KACX,MAAM,EAAE,OAAO,CAAC,YAAY,EAAE,OAEjC;AACH,CAAC;;;;;;;;;;;;;;;AC5CM,MAAM,aAAa,GAErB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IAE5B,MAAM,aAAa,GAAG,IAAI,oBAAoB,CAAC,CAAC,OAAO,EAAE,EAAE;QACzD,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;;YACtB,MAAM,KAAK,GAAG,KAAK,CAAC,MAA2B;YAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,YAAK,CAAC,eAAe,0CAAE,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,KAAI,EAAE,CAAC;YAE1F,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;gBACzB,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;oBAC5B,YAAY,CAAC,KAAK,EAAE;oBACpB,YAAY,CAAC,WAAW,GAAG,CAAC;gBAC9B,CAAC,CAAC;aACH;iBAAM;gBACL,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;oBAC5B,IAAI,YAAY,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC,UAAU,IAAI,CAAC,EAAE;wBAChG,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;qBACzC;gBACH,CAAC,CAAC;aACH;QACH,CAAC,CAAC;IACJ,CAAC,EAAE;QACD,SAAS,EAAE,IAAI;KAChB,CAAC;IAEF,MAAM,eAAe,GAAG,IAAI,oBAAoB,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3D,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACtB,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,KAAK,OAAO,EAAE;gBACpC,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;gBAC9C,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;oBACzB,KAAK,CAAC,KAAK,EAAE;oBACb,KAAK,CAAC,WAAW,GAAG,CAAC;iBACtB;qBAAM;oBACL,IAAI,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE;wBAGlC,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,EAAE;4BACzC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;yBAClC;qBACF;iBACF;aACF;QACH,CAAC,CAAC;IACJ,CAAC,EAAE;QACD,SAAS,EAAE,GAAG;KACf,CAAC;IAEF,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;;QAC/C,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC;QAE5B,MAAM,MAAM,GAAG,WAAK,CAAC,eAAe,0CAAE,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;QAExE,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YAC/D,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC;YAEhC,OAAO,GAAG,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,OAAO,CAAC;QACjD,CAAC,CAAC;QAEF,OAAO,GAAG,EAAE;YACV,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC;YAC9B,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;QACrD,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,aAAa,CAAC,UAAU,EAAE;QAC1B,eAAe,CAAC,UAAU,EAAE;QAC5B,MAAM,CAAC,OAAO,EAAE;IAClB,CAAC;IAED,uCACK,MAAM,KACT,OAAO,IACR;AACH,CAAC;;;;;;;;;;;;;;;ACzEM,MAAM,kBAAkB,GAG1B,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IAE5B,MAAM,iBAAiB,GAAG,GAAG,EAAE;;QAC7B,MAAM,qBAAqB,GAAG,MAAM,CAAC,wBAAwB,EAAE,IAAI,CAAC;QACpE,MAAM,EAAE,GAAG,GAAG,qBAAqB,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,qCAAqC,CAAC,MAAM,CAAC,4BAA4B,EAAE,CAAC,IAAI,EAAE;QACzI,MAAM,kBAAkB,GAAG,kBAAM,CAAC,OAAO,CAAC,WAAW,EAAE,0CAAE,UAAU,CAAC,MAAM,mCAAI,CAAC;QAC/E,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC;QACxB,IAAI,QAAQ,GAAG,kBAAkB,EAAE;YACjC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC;SAC/B;IACH,CAAC;IAED,MAAM,qBAAqB,GAAG,GAAG,EAAE;QACjC,MAAM,qBAAqB,GAAG,MAAM,CAAC,wBAAwB,EAAE,IAAI,CAAC;QACpE,MAAM,EAAE,KAAK,GAAG,qBAAqB,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,qCAAqC,CAAC,MAAM,CAAC,4BAA4B,EAAE,CAAC,IAAI,EAAE;QAC3I,MAAM,QAAQ,GAAG,KAAK,GAAG,CAAC;QAC1B,IAAI,QAAQ,IAAI,CAAC,EAAE;YACjB,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC;SAC/B;IACH,CAAC;IAED,uCACK,MAAM,KACT,iBAAiB,EAAE,GAAG,EAAE;YACtB,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE;gBAC1B,OAAO,iBAAiB,EAAE;aAC3B;YAED,OAAO,qBAAqB,EAAE;QAChC,CAAC,EACD,kBAAkB,EAAE,GAAG,EAAE;YACvB,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE;gBAC1B,OAAO,qBAAqB,EAAE;aAC/B;YAED,OAAO,iBAAiB,EAAE;QAC5B,CAAC,IACF;AACH,CAAC;;;;;;;;;;;;;;;;;;AC9CmC;AAqE7B,MAAM,kBAAkB,GAKU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IAE5B,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC;QACxE,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE;QAC7C,OAAO,IAAI,IAAI,QAAQ,IAAI,6BAA6B,CAAC,QAAQ,EAAE,IAAI,CAAC;IAC1E,CAAC;IAED,MAAM,iBAAiB,GAAG,GAAmB,EAAE;;QAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,eAAe;QACzC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO;QAC9B,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC,YAAY,EAAE;QAC7D,MAAM,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC,UAAU,EAAE;QACzD,MAAM,SAAS,GAAG,eAAe,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS;QAChI,MAAM,OAAO,GAAG,aAAa,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS;QAE1H,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS;QAE7C,OAAO;YACL,KAAK,EAAE;gBACL,WAAW,EAAE,cAAc,EAAE;gBAC7B,kBAAkB,EAAE,eAAe,CAAC,SAAS;gBAC7C,iBAAiB,EAAE,eAAe,CAAC,iBAAiB;gBACpD,sBAAsB,EAAE,eAAe,CAAC,aAAa;gBAWrD,cAAc,EAAE,eAAe,CAAC,cAAc;gBAG9C,GAAG,EAAE,eAAe,CAAC,GAAG;gBACxB,yBAAyB,EAAE,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,mBAAmB,EAAE;aAC5D;YACD,GAAG,EAAE;gBACH,WAAW,EAAE,cAAc,EAAE;gBAC7B,kBAAkB,EAAE,aAAa,CAAC,SAAS;gBAC3C,iBAAiB,EAAE,aAAa,CAAC,iBAAiB;gBAClD,sBAAsB,EAAE,aAAa,CAAC,aAAa;gBACnD,cAAc,EAAE,aAAa,CAAC,cAAc;gBAG5C,yBAAyB,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,mBAAmB,EAAE;gBACzD,GAAG,EAAE,aAAa,CAAC,GAAG;aACvB;YASD,wBAAwB,EAAE,OAAO;gBAC/B,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,qBAAqB,CACxC,OAAO,EACP,mBAAa,CAAC,cAAc,mCAAI,CAAC,EACjC,aAAa,CAAC,aAAa,EAC3B,aAAa,CAAC,SAAS,IAAI,CAAC,EAC5B,MAAM,CAAC,0BAA0B,EAAE,EACnC,OAAO,CACR;gBACD,CAAC,CAAC,CAAC;YAIL,kBAAkB,EAAE,UAAU,CAAC,qBAAqB,EAAE;YACtD,aAAa,EAAE,OAAO,CAAC,mBAAmB,EAAE;SAM7C;IACH,CAAC;IAED,uCACK,MAAM,KACT,UAAU,EAAE;YACV,CAAC,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;iBACxB,IAAI,CACH,mDAAG,CAAC,GAAG,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAC/B;YACH,OAAO,EAAE,iBAAiB;SAC3B,IACF;AACH,CAAC;AAEM,MAAM,6BAA6B,GAAG,CAAC,QAAkB,EAAE,SAAoB,EAAE,EAAE;IACxF,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,IAAI;IAE/B,OAAO,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;AAC/C,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,QAAgC,EAA2B,EAAE;IACjG,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,GAA4B,EAAE,OAAO,EAAE,EAAE;QAC/D,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;QAC7C,MAAM,wBAAwB,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI;QACrG,IAAI,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE;YAC3C,OAAO;gBACL,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,IAAI,EAAE,OAAO,CAAC,IAAI;aACnB;SACF;QAED,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC;QAEtD,IAAI,OAAO,EAAE;YACX,OAAO;gBACL,UAAU,EAAE,OAAO;gBACnB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,IAAI,EAAE,OAAO,CAAC,IAAI;aACnB;SACF;QAED,OAAO,GAAG;IACZ,CAAC,EAAE,SAAS,CAAC;AACf,CAAC;;;;;;;;;;;;;;;AChMM,MAAM,mBAAmB,GAY3B,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IAE5B,MAAM,qBAAqB,GAAG,CAC5B,OAAgB,EAChB,iBAAyB,EACzB,aAAqB,EACrB,SAAiB,EACjB,eAAyC,EACzC,WAAsB,EACtB,EAAE;;QACF,MAAM,sBAAsB,GAAG,cAAO,CAAC,WAAW,EAAE,0CAAE,eAAe,MAAK,eAAe;QACzF,MAAM,kBAAkB,GAAG,cAAO,CAAC,WAAW,EAAE,0CAAE,UAAU,CAAC,MAAM,KAAI,CAAC;QACxE,MAAM,sBAAsB,GAAG,cAAO,CAAC,WAAW,EAAE,0CAAE,UAAU,CAC7D,KAAK,CAAC,CAAC,EAAE,iBAAiB,EAC1B,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,KAAI,CAAC;QAC9D,MAAM,iBAAiB,GAAG,oBAAO,CAAC,WAAW,EAAE,0CAAE,UAAU,CAAC,iBAAiB,CAAC,0CAAE,iBAAiB,KAAI,CAAC;QAKtG,IAAI,sBAAsB,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,iBAAiB,GAAG,aAAa,CAAC;QAElF,IAAI,CAAC,sBAAsB,IAAI,WAAW,CAAC,YAAY,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE;YACjF,sBAAsB,GAAG,CAAC;SAC3B;QAED,IAAI,aAAa,GAAG,sBAAsB,GAAG,sBAAsB;QAEnE,IAAI,cAAO,CAAC,WAAW,EAAE,0CAAE,aAAa,MAAK,qBAAqB,EAAE;YAClE,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE;gBACzB,sBAAsB,GAAG,6BAA6B,CAAC,OAAO,EAAE,eAAe,EAAE,WAAW,CAAC;aAC9F;iBAAM;gBAGL,sBAAsB,GAAG,CAAC;aAC3B;YACD,aAAa,GAAG,+BAA+B,CAAC,sBAAsB,EAAE,iBAAiB,EAAE,sBAAsB,CAAC;SACnH;QAID,IAAI,CAAC,iBAAiB,KAAK,kBAAkB,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,KAAK,aAAa,GAAG,CAAC,CAAC,IAAI,aAAa,GAAG,IAAI,EAAE;YAC/G,OAAO,CAAC;SACT;QAED,OAAO,aAAa;IACtB,CAAC;IAED,MAAM,+BAA+B,GAAG,CAAC,sBAA8B,EAAE,iBAAyB,EAAE,sBAA8B,EAAE,EAAE;QACpI,OAAO,sBAAsB,GAAG,CAAC,iBAAiB,GAAG,sBAAsB,CAAC;IAC9E,CAAC;IAED,MAAM,6BAA6B,GAAG,CAAC,OAAgB,EAAE,eAAyC,EAAE,WAAsB,EAAE,EAAE;QAC5H,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,oBAAoB,EAAE;QAE5D,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,qBAAqB,CAAC,WAAW,CAAC;QAEzE,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,yBAAyB,KAAK,UAAU,EAAE;YAClE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;SACjH;aAAM;YACL,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;SAChH;IACH,CAAC;IAED,uCACK,MAAM,KACT,WAAW,EAAE;YACX,qBAAqB;YACrB,6BAA6B;SAC9B,IACF;AACH,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;AC1F0D;AAEpD,MAAM,iBAAiB,GAEzB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IAC5B,MAAM,eAAe,GAAG,yEAAsB,CAAC,MAAM,CAAC,OAAO,CAAC;IAM9D,MAAM,IAAI,GAAuB,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE;QACzD,MAAM,CAAC,IAAI,CAAC,QAAQ,oBACf,WAAW,EACd;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,oBAAoB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAO,IAAI,EAAE,EAAE;QACpE,OAAO,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC;IAC3C,CAAC,EAAC;IAEF,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,eAAe,CAAC,OAAO,EAAE;QACzB,MAAM,CAAC,OAAO,EAAE;IAClB,CAAC;IAED,uCACK,MAAM,KACT,OAAO;QACP,IAAI,IACL;AACH,CAAC;;;;;;;;;;;;;;;;;;;;;;;;ACjCD,MAAM,cAAc,GAAG,CAAC,EAA0B,EAAE,EAAE;IACpD,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,IAAU,EAAE,EAAE;QACtC,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;YAE1D,WAAW,CAAC,OAAO,GAAG,UAAU,KAAK;gBACnC,MAAM,CAAC,KAAK,CAAC;YACf,CAAC;YAED,WAAW,CAAC,UAAU,GAAG;gBACvB,OAAO,EAAE;YACX,CAAC;YAED,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC;YACpD,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC;YAE3C,QAAQ,CAAC,SAAS,GAAG,GAAG,EAAE;gBACxB,OAAO,EAAE;YACX,CAAC;YAED,QAAQ,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE;gBAC3B,MAAM,CAAC,KAAK,CAAC;YACf,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,EAAE;QAC1B,OAAO,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAClD,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;YAC1D,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC;YACpD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;YAEpC,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE;gBACvB,IAAI,KAAK,GAAG,OAAO,CAAC,MAAM;gBAC1B,IAAI,KAAK,KAAK,SAAS,EAAE;oBACvB,KAAK,GAAG,IAAI;iBACb;gBACD,OAAO,CAAC,KAAK,CAAC;YAChB,CAAC;YAED,WAAW,CAAC,OAAO,GAAG;gBACpB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YACvB,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,GAA2B,EAAE,EAAE;QAC7C,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;YAE1D,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC;YACpD,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC;YAEvC,WAAW,CAAC,OAAO,GAAG;gBACpB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YACvB,CAAC;YAED,WAAW,CAAC,UAAU,GAAG;gBACvB,OAAO,EAAE;YACX,CAAC;YAID,WAAW,CAAC,OAAO,GAAG;;gBACpB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK;oBACvB,CAAC,CAAC,OAAO,CAAC,KAAK;oBACf,CAAC,CAAC,aAAO,CAAC,WAAW,0CAAE,KAAK;gBAC9B,MAAM,CAAC,GAAG,CAAC;YACb,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,OAAO,IAAI,OAAO,CAA2B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC/D,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC;YAEzD,WAAW,CAAC,OAAO,GAAG,UAAU,KAAK;gBACnC,MAAM,CAAC,KAAK,CAAC;YACf,CAAC;YAMD,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC;YACpD,MAAM,OAAO,GAAG,WAAW,CAAC,aAAa,EAAE;YAC3C,MAAM,IAAI,GAA6B,EAAE;YAEzC,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE;gBACvB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM;gBAE7B,IAAI,CAAC,MAAM,EAAE;oBACX,OAAO,CAAC,IAAI,CAAC;oBACb,OAAM;iBACP;gBAED,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;gBACrB,MAAM,CAAC,QAAQ,EAAE;YACnB,CAAC;YAED,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE;gBACrB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YACvB,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,GAAG;QACH,IAAI;QACJ,GAAG;QACH,MAAM;KACP;AACH,CAAC;AAEM,MAAM,YAAY,GAAG,CAAO,IAAY,EAAE,EAAE;IACjD,OAAO,IAAI,OAAO,CAAoC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACxE,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QAE3C,OAAO,CAAC,OAAO,GAAG,UAAU,KAAK;YAC/B,MAAM,CAAC,KAAK,CAAC;QACf,CAAC;QAED,OAAO,CAAC,SAAS,GAAG;YAClB,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,CAAC,eAAe,GAAG,GAAG,EAAE;YAC7B,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC/H2D;AACyB;AAEhD;AAEK;AAEnC,MAAM,sBAAsB,GAAG,CAAC,OAAgB,EAAE,EAAE;IACzD,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACpC,MAAM,MAAM,GAAG,IAAI,yCAAO,EAA+E;IAEzG,MAAM,YAAY,GAAG,CAAC,aAAkE,EAAE,EAAE;;QAC1F,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE;YAC1E,MAAM,EAAE,GAAG,OAAO,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;YAC3E,OAAO,aAAO,CAAC,WAAW,EAAE,0CAAE,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;SAC1E;aAAM;YACL,OAAO,aAAO,CAAC,WAAW,EAAE,0CAAE,UAAU,CAAC,aAAa,CAAC;SACxD;IACH,CAAC;IAED,MAAM,GAAG,GAAG,CAAO,aAAkE,EAAE,aAA2E,EAAE,EAAE;QACpK,MAAM,IAAI,GAAG,YAAY,CAAC,aAAa,CAAC;QAExC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,QAAQ,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAEjE,MAAM,EAAE,GAAG,MAAM,wDAAY,CAAC,cAAc,CAAC;QAC7C,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,QAAQ,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;QAExD,IAAI,SAAS,EAAE;YACb,OAAO,IAAI,QAAQ,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;SAChD;QAED,MAAM,IAAI,GAAG,CAAC,aAAa,KAAI,MAAM,aAAa,CAAC,IAAI,CAAC,EAAC,KAAI,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAEnF,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QAEzB,OAAO,IAAI;IACb,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,aAAkE,EAAE,IAAc,EAAE,EAAE;QACnG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,CAAC,YAAY,EAAE;SAClB,IAAI,CACH,wDAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,CAAC;QAE7B,IAAI,CAAC,IAAI;YAAE,OAAO,uCAAK;QAEvB,OAAO,0CAAI,CAAC,8CAAQ,CAAC,CAAC,wDAAY,CAAC,cAAc,CAAC,EAAE,0CAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;aACrE,IAAI,CACH,yDAAS,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE;YACvB,OAAO,0CAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,QAAQ,IAAI,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QACrD,CAAC,CAAC,EACF,0DAAU,CAAC,KAAK,CAAC,EAAE;YACjB,iDAAY,CAAC,KAAK,CAAC;YAEnB,OAAO,uCAAK;QACd,CAAC,CAAC,CACH;IACL,CAAC,CAAC,EACF,yDAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAC9B;SACA,SAAS,EAAE;IAEd,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK;SAC5B,IAAI,CACH,mDAAG,CAAC,GAAG,EAAE;QACP,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAClC,CAAC,CAAC,CACH;IAOH,2CAAK,CAAC,OAAO,CAAC;SACX,IAAI,CACH,yDAAS,CAAC,GAAG,EAAE;QACb,+CAAU,CAAC,yBAAyB,CAAC;QAErC,OAAO,0CAAI,CAAC,wDAAY,CAAC,cAAc,CAAC,CAAC;aACtC,IAAI,CACH,yDAAS,CAAC,EAAE,CAAC,EAAE,CACb,0CAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;aACZ,IAAI,CACH,mDAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,EACrE,yDAAS,CAAC,CAAC,YAAY,EAAE,EAAE;YACzB,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAExD,OAAO,0CAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC,CAAC,CACH,CACJ,EACD,0DAAU,CAAC,KAAK,CAAC,EAAE;YACjB,iDAAY,CAAC,KAAK,CAAC;YAEnB,OAAO,uCAAK;QACd,CAAC,CAAC,CACH;IACL,CAAC,CAAC,EACF,yDAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAC9B;SACA,SAAS,EAAE;IAEd,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,MAAM,CAAC,QAAQ,EAAE;IACnB,CAAC;IAED,OAAO;QACL,GAAG;QACH,OAAO;KACR;AACH,CAAC;;;;;;;;;;;;;;;ACpHD,MAAM,aAAa,GAAG;IACpB;QACE,IAAI,EAAE,QAAiB;QACvB,eAAe,EAAE,OAAO;KACzB;IACD;QACE,IAAI,EAAE,OAAgB;QACtB,eAAe,EAAE,SAAS;QAC1B,eAAe,EAAE,OAAO;KACzB;IACD;QACE,IAAI,EAAE,OAAgB;QACtB,eAAe,EAAE,SAAS;QAC1B,eAAe,EAAE,SAAS;KAC3B;CACF;AAIM,MAAM,aAAa,GAKrB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE;IACzB,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IAC5B,IAAI,YAAY,GAAG,KAAK;IAExB,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC;QAE3E,OAAO;;UAED,UAAU,KAAK,SAAS;YAC1B,CAAC,CAAC,qBAAqB,UAAU,CAAC,eAAe,cAAc;YAC/D,CAAC,CAAC,EAAE;;QAEJ,WAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,eAAe;YAC3B,CAAC,CAAC;;cAKI,EAAE;qBACK,UAAU,CAAC,eAAe;;SAEtC;YACD,CAAC,CAAC,EAAE;KACP;IACH,CAAC;IAED,MAAM,6BAA6B,GAAG,CAAC,EAAE,SAAS,EAAE,cAAc,EAA2D,EAAE,EAAE;QAC/H,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC;QAC3E,IAAI,UAAU,EAAE;YACd,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,kBAAkB,EAAE,UAAU,CAAC,eAAe,CAAC;YAC3E,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,kBAAkB,EAAE,UAAU,CAAC,eAAe,CAAC;SACjF;IACH,CAAC;IAED,MAAM,sBAAsB,GAAG,GAAG,EAAE;QAClC,MAAM,CAAC,oBAAoB,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE,EAAE;YACnF,WAAW,CAAC,oBAAoB,CAAC;YACjC,QAAQ,CAAC,oBAAoB,EAAE,QAAQ,EAAE,CAAC;YAC1C,6BAA6B,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;YAE5D,OAAO,KAAK;QACd,CAAC,CAAC;IACJ,CAAC;IAKD,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC/D,WAAW,CAAC,oBAAoB,CAAC;QACjC,QAAQ,CAAC,oBAAoB,EAAE,QAAQ,EAAE,CAAC;IAC5C,CAAC,CAAC;IAMF,MAAM,CAAC,YAAY,CAAC,gBAAgB,EAAE,6BAA6B,CAAC;IAEpE,uCACK,MAAM,KACT,QAAQ,EAAE,CAAC,KAAwB,EAAE,EAAE;YACrC,YAAY,GAAG,KAAK;YACpB,sBAAsB,EAAE;QAC1B,CAAC,EACD,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY,IAC7B;AACH,CAAC;;;;;;;;;;;;;;;;AC7F2C;AAErC,MAAM,aAAa,GAIrB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IAE5B,MAAM,qBAAqB,GAAG,CAAC,MAAuB,EAAE,EAAE;QACxD,IAAI,yDAAa,CAAC,MAAM,CAAC,EAAE;YACzB,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;YACnE,IAAI,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,YAAY,CAAC,MAAM,CAAC,EAAE;gBAC9B,OAAO,IAAI;aACZ;SACF;QAED,OAAO,KAAK;IACd,CAAC;IAED,uCACK,MAAM,KACT,KAAK,EAAE;YACL,qBAAqB;SACtB,IACF;AACH,CAAC;;;;;;;;;;;;;;;ACrBD,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAK9F,MAAM,cAAc,GAEtB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE;IAMzB,MAAM,wBAAwB,GAA4B;QACxD;YACE,IAAI,EAAE,gCAAgC;YACtC,EAAE,EAAE,OAAO,CAAC,EAAE;gBACZ,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG;YACpB,OAAO,CAAC,KAAK,CAAC,OAAO;;SAExB;gBAED,OAAO,OAAO;YAChB,CAAC;SACF;QACD;YACE,IAAI,EAAE,+BAA+B;YACrC,EAAE,EAAE,OAAO,CAAC,EAAE;gBACZ,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG;YACpB,OAAO,CAAC,KAAK,CAAC,OAAO;;;SAGxB;gBAED,OAAO,OAAO;YAChB,CAAC;SACF;KACF;IAED,MAAM,MAAM,GAAG,IAAI,iCACd,OAAO,GACP,SAAS,IAAI;QACd,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,GAAG,wBAAwB,CAAC;KAC7D,EACD;IAEF,OAAO,MAAM;AACf,CAAC;;;;;;;;;;;;;;;ACnDD,MAAM,iBAAiB,GAAG,KAAK;AAKxB,MAAM,YAAY,GAQpB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IAC5B,IAAI,uBAAmD;IACvD,IAAI,eAAe,GAA6B,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IAC9D,IAAI,eAAe,GAAyC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IAC1E,IAAI,SAAS,GAAG,CAAC;IAEjB,MAAM,KAAK,GAAG,CAAC,UAA4B,EAAE,EAAE;QAC7C,MAAM,CAAC,mBAAmB,CAAC,CAAC,SAAS,EAAE,EAAE;YACvC,uBAAuB,GAAG,SAAS,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC;YACtE,uBAAuB,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;;OASvC;YACD,MAAM,gBAAgB,GAAG,UAAU,CAAC,SAAS,EAAsB;YACnE,gBAAgB,CAAC,GAAG,GAAG,UAAU,CAAC,GAAG;YACrC,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC;YACpD,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC;YACnD,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,SAAS,CAAC;YAG3D,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,gBAAgB,EAAE,MAAM,CAAC;YAE5D,uBAAuB,CAAC,WAAW,CAAC,gBAAgB,CAAC;YACrD,SAAS,CAAC,WAAW,CAAC,uBAAuB,CAAC;YAE9C,eAAe,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;YAChC,SAAS,GAAG,CAAC;YAEb,OAAO,iBAAiB;QAC1B,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,MAAM,CAAC,mBAAmB,CAAC,GAAG,EAAE;YAC9B,uBAAuB,aAAvB,uBAAuB,uBAAvB,uBAAuB,CAAE,MAAM,EAAE;YACjC,uBAAuB,GAAG,SAAS;YAEnC,OAAO,iBAAiB;QAC1B,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,KAA2C,EAAE,EAAE,OAAO,EAAE,MAAM,EAAyC,EAAE,EAAE;QACvH,MAAM,UAAU,GAAG,uBAAuB,aAAvB,uBAAuB,uBAAvB,uBAAuB,CAAE,aAAa,CAAC,KAAK,CAAC;QAEhE,IAAI,OAAO,EAAE;YACX,eAAe,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;SACjC;QAED,IAAI,KAAK,EAAE;YACT,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,gBAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,CAAC,KAAI,CAAC,CAAC;YACtD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,gBAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,CAAC,KAAI,CAAC,CAAC;YAEtD,eAAe,GAAG,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC,GAAG,UAAU,EAAE;YAE1F,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,eAAe,eAAe,CAAC,CAAC,OAAO,eAAe,CAAC,CAAC,oBAAoB,SAAS,KAAK,SAAS,MAAM,CAAC;YAErJ,eAAe,GAAG,KAAK;SACxB;QAED,IAAI,MAAM,EAAE;YACV,eAAe,GAAG,SAAS;SAC5B;IACH,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE;QAC9B,MAAM,UAAU,GAAG,uBAAuB,aAAvB,uBAAuB,uBAAvB,uBAAuB,CAAE,aAAa,CAAC,KAAK,CAAC;QAChE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;QAG1C,IAAI,YAAY,GAAG,CAAC,EAAE;YACpB,eAAe,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;SACjC;QAED,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,eAAe,eAAe,CAAC,CAAC,OAAO,eAAe,CAAC,CAAC,oBAAoB,QAAQ,KAAK,QAAQ,MAAM,CAAC;QACnJ,SAAS,GAAG,QAAQ;IACtB,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,uBAAuB;IAEjD,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,uBAAuB,aAAvB,uBAAuB,uBAAvB,uBAAuB,CAAE,MAAM,EAAE;QACjC,uBAAuB,GAAG,SAAS;QACnC,MAAM,CAAC,OAAO,EAAE;IAClB,CAAC;IAED,uCACK,MAAM,KACT,OAAO,EACP,IAAI,EAAE;YACJ,KAAK;YACL,IAAI;YACJ,IAAI;YACJ,SAAS;YACT,KAAK;SACN,IACF;AACH,CAAC;;;;;;;;;;;;;;;;;;;;ACvHyE;AAEnE,MAAM,uBAAuB,GAAG,CAAC,YAA2C,EAAE,EAAE,CAAC,CAAC,EAAU,EAAE,EAAE;IACrG,IACE,YAAY;QACZ,YAAY,CAAC,eAAe;QAC5B,YAAY,CAAC,eAAe,CAAC,IAAI,EACjC;QACA,MAAM,YAAY,GAAG,YAAY,CAAC,eAAe,CAAC,cAAc,CAAC,EAAE,CAAC;QACpE,IAAI,YAAY,EAAE;YAChB,YAAY,CAAC,MAAM,EAAE;SACtB;KACF;AACH,CAAC;AAEM,MAAM,oBAAoB,GAAG,CAAC,YAA2C,EAAE,EAAE,CAAC,CAAC,EAAU,EAAE,KAAa,EAAE,OAAO,GAAG,KAAK,EAAE,EAAE;IAClI,IACE,YAAY;QACZ,YAAY,CAAC,eAAe;QAC5B,YAAY,CAAC,eAAe,CAAC,IAAI,EACjC;QACA,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;QACjD,SAAS,CAAC,EAAE,GAAG,EAAE;QACjB,SAAS,CAAC,SAAS,GAAG,KAAK;QAC3B,IAAI,OAAO,EAAE;YACX,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;SACrD;aAAM;YACL,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;SACzD;KACF;AACH,CAAC;AAEM,MAAM,2BAA2B,GAAG,CAAC,MAAc,EAAE,GAAW,EAAE,EAAE;IACzE,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,oBAAoB,EAAE,GAAG,CAAC;IAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;IACxC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG;IAElC,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC;AAEM,MAAM,sCAAsC,GAAG,CAAkB,KAAQ,EAAiB,EAAE;IAEjG,OAAO,KAAK,CAAC,oFAA4C,CAAC;AAC5D,CAAC;AAEM,MAAM,uCAAuC,GAAG,CAAkB,KAAQ,EAAE,UAAa,EAAE,EAAE;IAClG,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,oFAA4C,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AACrH,CAAC;;;;;;;;;;;;;;;;;;;;;;;;AC/C4F;AAEpD;AASxC;AAIgC;AAE4B;AACpB;;;;;;;;;;;;;;;;;;;;;AClBX;AAIG;AAEjC,MAAM,SAAS,GAAG,YAAY;AAEvB,MAAM,gBAAgB,GAAG,CAAC,EAAE,OAAO,EAA4D,EAAE,EAAE;IACxG,MAAM,OAAO,GAAG,IAAI,yCAAO,EAAuB;IAClD,IAAI,cAAkC;IACtC,IAAI,kBAAkB,GAAG,CAAC;IAC1B,IAAI,QAA4B;IAChC,IAAI,mBAAuC;IAC3C,IAAI,YAAgC;IACpC,IAAI,gBAAgB,GAAG,CAAC;IACxB,IAAI,MAA0B;IAC9B,IAAI,iBAAqC;IACzC,IAAI,qBAAqB,GAAa,EAAE;IAExC,MAAM,yBAAyB,GAAG,CAAC,SAAoB,EAAE,EAAE;QAIzD,MAAM,WAAW,GAAG,SAAS,CAAC,cAAc,CAAC,cAAc,EAAE;QAC7D,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,oBAAoB,EAAE;QAE1D,IAAI,WAAW,KAAK,aAAa,EAAE;YACjC,OAAO,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC;SAC9D;QAED,OAAO,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC;IAC7D,CAAC;IAED,MAAM,gBAAgB,GAAG,CAAC,IASzB,EAAE,EAAE;QACH,MAAM,aAAa,GAAG,yBAAyB,CAAC,IAAI,CAAC,SAAS,CAAC;QAE/D,MAAM,GAAG,GAAuB,SAAS;QAmBzC,OAAO;YACL,aAAa;YACb,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,GAAG,EAAE,IAAI,CAAC,GAAG;SACd;IACH,CAAC;IAED,OAAO;QACL,YAAY;YACV,OAAO;gBACL,SAAS,EAAE,cAAc;gBACzB,iBAAiB,EAAE,qBAAqB;qBACrC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC;qBAC7B,MAAM,CAAC,CAAC,GAAG,EAAE,oBAAoB,EAAE,EAAE,CAAC,GAAG,GAAG,oBAAoB,EAAE,cAAc,aAAd,cAAc,cAAd,cAAc,GAAI,CAAC,CAAC;gBACzF,GAAG,EAAE,QAAQ;gBACb,aAAa,EAAE,kBAAkB;gBACjC,cAAc,EAAE,mBAAmB;aACpC;QACH,CAAC;QACD,UAAU;YACR,OAAO;gBACL,SAAS,EAAE,YAAY;gBACvB,iBAAiB,EAAE,qBAAqB;qBACrC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC;qBAC3B,MAAM,CAAC,CAAC,GAAG,EAAE,oBAAoB,EAAE,EAAE,CAAC,GAAG,GAAG,oBAAoB,EAAE,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,CAAC,CAAC;gBACvF,GAAG,EAAE,MAAM;gBACX,aAAa,EAAE,gBAAgB;gBAC/B,cAAc,EAAE,iBAAiB;aAClC;QACH,CAAC;QACD,qBAAqB,EAAE,GAAG,EAAE;YAC1B,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,oBAAoB,EAAE,EAAE,CAAC,GAAG,GAAG,oBAAoB,EAAE,CAAC,CAAC;QACnG,CAAC;QACD,wBAAwB,EAAE,CAAC,UAAuB,EAAE,EAAE;YACpD,qBAAqB,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC9C,OAAO,yBAAyB,CAAC,IAAI,CAAC;YACxC,CAAC,EAAE,CAAC,CAAC;YAEL,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QACnC,CAAC;QACD,iBAAiB,EAAE,8DAAyB,CAAC,GAAG,SAAS,oBAAoB,EAAE,CAAC,EAAE,CAChF,KAEC,EACD,GAEC,EACD,EAAE;YACF,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC;YACzC,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC;YAErC,cAAc,GAAG,SAAS,CAAC,SAAS;YACpC,kBAAkB,GAAG,SAAS,CAAC,aAAa;YAC5C,QAAQ,GAAG,SAAS,CAAC,GAAG;YACxB,mBAAmB,GAAG,KAAK,CAAC,cAAc;YAE1C,YAAY,GAAG,OAAO,CAAC,SAAS;YAChC,gBAAgB,GAAG,OAAO,CAAC,aAAa;YACxC,MAAM,GAAG,OAAO,CAAC,GAAG;YACpB,iBAAiB,GAAG,GAAG,CAAC,cAAc;YAEtC,+CAAU,CAAC,SAAS,EAAE,mBAAmB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;YAEpH,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QACnC,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACrB,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE;KAC1B;AACH,CAAC;AAIM,MAAM,0BAA0B,GAAG,CAAC,SAAiB,EAAE,SAAiB,EAAE,SAAiB,EAAE,EAAE;IACpG,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS;IAC5C,MAAM,aAAa,GAAG,CAAC,SAAS,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC,GAAG,SAAS;IAEvE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;AAC7D,CAAC;AAEM,MAAM,gBAAgB,GAAG,CAAC,SAAiB,EAAE,SAAiB,EAAE,EAAE;IACvE,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC;IAC9D,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;AACvD,CAAC;AAEM,MAAM,iDAAiD,GAAG,CAAC,MAAc,EAAE,SAAiB,EAAE,SAAiB,EAAE,EAAE;IACxH,MAAM,aAAa,GAAG,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;IAC5D,MAAM,YAAY,GAAG,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC;IAE3E,IAAI,MAAM,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAAE,OAAO,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC;IAE5F,OAAO,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC;AAClF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3JkF;AAClD;AAC6B;AACH;AACH;AAGyC;AAEpB;AAE7B;AAKhD,MAAM,8BAA8B,GAAG,qCAAqC;AAqErE,MAAM,YAAY,GAAG,CAAC,EAA2E,EAAE,EAAE;QAA/E,EAAE,gBAAgB,EAAE,KAAK,EAAE,YAAY,OAAoC,EAA/B,QAAQ,cAApD,6BAAsD,CAAF;IAC/E,MAAM,aAAa,GAAG,IAAI,iDAAe,CAKtC;QACD,0BAA0B,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;QACrD,qBAAqB,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;QACnD,0BAA0B,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC;QACtD,kCAAkC,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC;KAC/D,CAAC;IACF,MAAM,aAAa,GAAG,IAAI,yCAAO,EAAQ;IACzC,MAAM,QAAQ,GAAG,IAAI,yCAAO,EAAQ;IACpC,MAAM,iBAAiB,GAAG,IAAI,yCAAO,EAA6C;IAClF,MAAM,aAAa,GAAG,IAAI,iDAAe,CAAS,YAAY,IAAI,EAAE,CAAC;IACrE,MAAM,OAAO,GAAG,uDAAiB,CAAC,QAAQ,CAAC;IAC3C,MAAM,gBAAgB,GAAG,yEAAsB,CAAC,EAAE,OAAO,EAAE,CAAC;IAC5D,MAAM,UAAU,GAAG,6DAAgB,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAClE,MAAM,OAAO,GAAG,oBAAoB,CAAC,gBAAgB,CAAC;IACtD,MAAM,wBAAwB,GAAG,8BAA8B,CAAC,gBAAgB,CAAC;IACjF,IAAI,oCAAoC,GAAmB,EAAE;IAC7D,MAAM,KAAK,GAAG,+DAAW,CAAC;QACxB,aAAa,EAAE,OAAO;QACtB,wBAAwB;QACxB,OAAO;QACP,UAAU;QACV,gBAAgB;QAChB,MAAM,EAAE,aAAa;KACtB,CAAC;IAEF,gBAAgB,CAAC,WAAW,CAAC,OAAO,CAAC;IACrC,OAAO,CAAC,WAAW,CAAC,wBAAwB,CAAC;IAE7C,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,MAAM,UAAU,GAAG;YACjB,KAAK,EAAE,gBAAgB,CAAC,WAAW;YACnC,MAAM,EAAE,gBAAgB,CAAC,YAAY;SACtC;QACD,MAAM,MAAM,GAAG,CAAC;QAChB,MAAM,SAAS,GAAG,CAAC;QACnB,MAAM,YAAY,GAAG,CAAC;QACtB,MAAM,QAAQ,GAAG,IAAI;QACrB,MAAM,qBAAqB,GAAG,UAAU,CAAC,KAAK;QAC9C,MAAM,yBAAyB,GAC7B,qBAAqB,GAAG,CAAC,KAAK,CAAC,IAAI,QAAQ;YACzC,CAAC,CAAC,qBAAqB;YACvB,CAAC,CAAC,qBAAqB,GAAG,CAAC;QAE/B,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,GAAG,SAAS,GAAG,YAAY,IAAI;QAC1E,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,yBAAyB,GAAG,CAAC,GAAG,MAAM,IAAI;QAEnE,IAAI,MAAM,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE;YACnD,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,SAAS,MAAM,MAAM,MAAM,YAAY,IAAI;SACtE;QACD,MAAM,WAAW,GAAG,OAAO,CAAC,qBAAqB,EAAE;QAEnD,OAAO,CAAC,kBAAkB,CACxB,WAAW,CAAC,CAAC,EACb,WAAW,CAAC,CAAC,EACb,yBAAyB,EACzB,UAAU,CAAC,MAAM,CAClB;QAED,KAAK,CAAC,MAAM,EAAE;IAChB,CAAC;IAED,MAAM,IAAI,GAAG,CACX,QAAkB,EAClB,cAA2B,EAAE,EAC7B,EAAE;QACF,IAAI,OAAO,CAAC,WAAW,EAAE,EAAE;YACzB,gDAAW,CAAC,yCAAyC,CAAC;YACtD,OAAM;SACP;QAED,+CAAU,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;QAE7C,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC;QAInC,KAAK,CAAC,IAAI,EAAE;QAEZ,MAAM,EAAE;QAER,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE;YACpB,KAAK,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;SAC7D;aAAM;YACL,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;SACrE;QAED,aAAa,CAAC,IAAI,EAAE;IACtB,CAAC;IAED,MAAM,YAAY,GAAiB,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE;QAC9C,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAU,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,mBAAmB,GAAG,CAAC,EAAqF,EAAE,EAAE;QACpH,MAAM,SAAS,GAAG,CAAC,WAAuB,EAAE,EAAE;YAC5C,oCAAoC,CAAC,IAAI,CAAC,WAAW,CAAC;QACxD,CAAC;QAGD,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,CAAC,CAAC,CAAC;SACN,IAAI,CACH,mDAAG,CAAC,KAAK,CAAC,EAAE;QACV,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE;YACtC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;SACnC;IACH,CAAC,CAAC,EACF,yDAAS,CAAC,QAAQ,CAAC,CACpB;SACA,SAAS,EAAE;IAEd,2CAAK,CACH,OAAO,CAAC,CAAC,CAAC,KAAK,EACf,OAAO,CAAC,CAAC,CAAC,SAAS,EACnB,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAC9B;SACE,IAAI,CACH,qDAAK,CAAC,SAAS,CAAC,EAChB,8DAAc,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAC7C,mDAAG,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,EAAE,EAAE;QAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE;QACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE;QAEtC,OAAO;YACL,kBAAkB;YAClB,aAAa,EAAE,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,aAAa;YACtC,eAAe,EAAE,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,eAAe;YAC1C,oBAAoB,EAAE,QAAQ,CAAC,oBAAoB;SACpD;IACH,CAAC,CAAC,EACF,oEAAoB,CAAC,0DAAc,CAAC,EACpC,mDAAG,CAAC,CAAC,EAAE,kBAAkB,EAAE,aAAa,EAAE,eAAe,EAAE,oBAAoB,EAAE,EAAyC,EAAE,CAAC,iCACxH,aAAa,CAAC,KAAK,KACtB,qBAAqB,EACnB,aAAa,KAAK,qBAAqB;YACrC,CAAC,CAAC,CAAC,YAAY,CAAC;YAChB,CAAC,CAAC,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,YAAY,CAAC,EACxF,0BAA0B,EACxB,aAAa,KAAK,qBAAqB,IAAI,oBAAoB,KAAK,YAAY;YAC9E,CAAC,CAAC,CAAC,MAAM,CAAC;YACV,CAAC,CAAC,kBAAkB;gBAClB,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC;gBAClB,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EACjC,0BAA0B,EACxB,oBAAoB,KAAK,YAAY;YACnC,CAAC,CAAC,CAAC,UAAU,CAAC;YACd,CAAC,CAAC,eAAe,KAAK,YAAY;gBAChC,CAAC,CAAC,CAAC,YAAY,CAAC;gBAChB,CAAC,CAAC,CAAC,YAAY,EAAE,UAAU,CAAC,IAClC,CAAC,EACH,yDAAS,CAAC,QAAQ,CAAC,CACpB;SACA,SAAS,CAAC,aAAa,CAAC;IAW3B,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,oCAAoC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxD,oCAAoC,GAAG,EAAE;QACzC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,aAAa,CAAC,QAAQ,EAAE;QACxB,OAAO,CAAC,OAAO,EAAE;QACjB,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO,EAAE;QAChB,OAAO,CAAC,MAAM,EAAE;QAChB,wBAAwB,CAAC,MAAM,EAAE;QACjC,aAAa,CAAC,QAAQ,EAAE;QACxB,aAAa,CAAC,QAAQ,EAAE;QACxB,iBAAiB,CAAC,QAAQ,EAAE;QAC5B,QAAQ,CAAC,IAAI,EAAE;QACf,QAAQ,CAAC,QAAQ,EAAE;IACrB,CAAC;IAED,MAAM,MAAM,GAAG;QACb,eAAe,EAAE,UAAU;QAC3B,OAAO;QACP,YAAY;QACZ,KAAK;QACL,oBAAoB,EAAE,KAAK,CAAC,oBAAoB;QAChD,mBAAmB;QACnB,MAAM,EAAE,KAAK,CAAC,iBAAiB,CAAC,MAAM;QACtC,QAAQ,EAAE,KAAK,CAAC,iBAAiB,CAAC,QAAQ;QAC1C,SAAS,EAAE,KAAK,CAAC,iBAAiB,CAAC,SAAS;QAC5C,wBAAwB,EAAE,KAAK,CAAC,iBAAiB,CAAC,wBAAwB;QAC1E,QAAQ,EAAE,KAAK,CAAC,iBAAiB,CAAC,QAAQ;QAC1C,OAAO,EAAE,KAAK,CAAC,iBAAiB,CAAC,OAAO;QACxC,OAAO,EAAE,KAAK,CAAC,iBAAiB,CAAC,OAAO;QACxC,aAAa,EAAE,KAAK,CAAC,iBAAiB,CAAC,aAAa;QACpD,wBAAwB,EAAE,gBAAgB,CAAC,wBAAwB;QACnE,YAAY,EAAE,gBAAgB,CAAC,GAAG;QAClC,qBAAqB,EAAE,gBAAgB,CAAC,qBAAqB;QAC7D,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,yBAAyB,EAAE,KAAK,CAAC,yBAAyB;QAC1D,qBAAqB,EAAE,KAAK,CAAC,UAAU,CAAC,qBAAqB;QAC7D,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,UAAU;QACvC,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB;QAC/C,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,4BAA4B,EAAE,KAAK,CAAC,iBAAiB,CAAC,4BAA4B;QAClF,0BAA0B,EAAE,KAAK,CAAC,iBAAiB,CAAC,0BAA0B;QAC9E,MAAM;QACN,IAAI;QACJ,OAAO;QACP,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,CAAC,EAAE;YACD,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;YAC9B,MAAM,EAAE,aAAa,CAAC,YAAY,EAAE;YAOpC,MAAM,EAAE,aAAa,CAAC,YAAY,EAAE;YAIpC,UAAU,EAAE,iBAAiB,CAAC,YAAY,EAAE;YAC5C,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC,cAAc;YACtC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO;YACxB,QAAQ;SACT;QACD,OAAO,EAAE;YACP,UAAU;YACV,OAAO;YACP,gBAAgB;SACV;KACT;IAED,OAAO,MAAM;AACf,CAAC;AAED,MAAM,oBAAoB,GAAG,CAAC,gBAA6B,EAAE,EAAE;IAC7D,MAAM,OAAO,GAAG,gBAAgB,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC;IACnE,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG;;;GAGvB;IAED,OAAO,OAAO;AAChB,CAAC;AAED,MAAM,8BAA8B,GAAG,CAAC,gBAA6B,EAAE,EAAE;IACvE,MAAM,wBAAwB,GAAG,gBAAgB,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC;IACpF,wBAAwB,CAAC,EAAE,GAAG,8BAA8B;IAC5D,wBAAwB,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;GAOxC;IAED,OAAO,wBAAwB;AACjC,CAAC;;;;;;;;;;;;;;;ACnWD,MAAM,cAAc,GAAG,oBAAoB;AAE3C,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG;AAExC,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,cAAc,GAAG,CAAC,EAAE,EAAE;IAChD,IAAI,IAAI,GAAG,CAAC;IACZ,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE;IAI5B,OAAO,GAAG,EAAE;QACV,IAAI,EAAE;QACN,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE;QAG5B,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,WAAW,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,cAAc,CAAC;IACzF,CAAC;AACH,CAAC;AAED,MAAM,YAAY,GAAG,CAAC,SAAkB,EAAE,EAAE,CAAC,CAAC;IAE5C,GAAG,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE;QACtB,IAAI,MAAM,CAAC,oBAAoB,EAAE;YAE/B,IAAI,SAAS;gBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,CAAC;;gBACrE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,GAAG,IAAI,CAAC;SAChD;IACH,CAAC;IAED,IAAI,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE;QACvB,IAAI,MAAM,CAAC,oBAAoB,EAAE;YAE/B,IAAI,SAAS;gBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,CAAC;;gBACtE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,GAAG,IAAI,CAAC;SACjD;IACH,CAAC;IAED,KAAK,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE;QAExB,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IACxB,CAAC;IAaD,IAAI;IACJ,SAAS,EAAE,CAAC,gBAAuE,EAAE,cAAc,GAAG,CAAC,EAAE,EAAE;QAEzG,IAAI,MAAM,CAAC,oBAAoB,EAAE;YAC/B,IAAI,gBAAgB,CAAC,QAAQ,IAAI,cAAc,EAAE;aAGhD;iBAAM;gBAEL,OAAO,CAAC,IAAI,CACV,0BAA0B,EAC1B,GAAG,gBAAgB,CAAC,IAAI,SAAS,gBAAgB,CAAC,QAAQ,yBAAyB,cAAc,6BAA6B,CAC/H;aACF;SACF;IACH,CAAC;IAED,kBAAkB,EAAE,CAAoC,IAAY,EAAE,cAAc,GAAG,EAAE,EAAE,iBAAoB,EAAE,EAAE,OAAO,KAA4B,EAAE,EAAE,EAAE;QAC1J,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,oBAAoB;YAAE,OAAO,iBAAiB;QAErE,OAAO,CAAC,GAAG,IAAmB,EAAiB,EAAE;YAC/C,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE;YAG5B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAI,IAAY,CAAC;YAEpD,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE;gBAC7B,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAQ,EAAE,EAAE;oBAChC,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE;oBAC5B,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,cAAc,CAAC;oBAC7D,OAAO,GAAG;gBACZ,CAAC,CAAC;aACH;YAED,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE;YAC5B,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,cAAc,CAAC;YAE7D,OAAO,QAAQ;QACjB,CAAC;IACH,CAAC;CACF,CAAC;AAEK,MAAM,MAAM,GAAG,iCACjB,YAAY,EAAE,KACjB,SAAS,EAAE,CAAC,SAAiB,EAAE,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,IACzD;;;;;;;;;;;;;;;;AClGyB;AAGpB,MAAM,eAAe,GAAG,CAAC,SAAoB,EAAE,IAAoC,EAAE,EAAE;IAC5F,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,EAAE;IAEjC,OAAO;QACL,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI;QACpB,YAAY,EAAE,GAAG,EAAE;YACjB,IAAI,SAAS,CAAC,UAAU,EAAE;gBACxB,OAAO,8CAAY,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,YAAY,EAAE,kBAAkB,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;aACpH;QACH,CAAC;QACD,WAAW,EAAE,GAAG,EAAE;YAChB,IAAI,SAAS,CAAC,SAAS,EAAE;gBACvB,OAAO,8CAAY,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,WAAW,EAAE,kBAAkB,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;aAClH;QACH,CAAC;KACF;AACH,CAAC;;;;;;;;;;;;;;;;;;;;;ACnBqC;AACe;AAEpB;AACe;AAyBzC,MAAM,cAAc,GAAG,CAAC,eAAwC,EAAE,EAAE;IACzE,MAAM,cAAc,mBAClB,mBAAmB,EAAE,KAAK,EAC1B,iBAAiB,EAAE,MAAM,EACzB,yBAAyB,EAAE,MAAM,EACjC,iBAAiB,EAAE,YAAY,EAC/B,yBAAyB,EAAE,YAAY,EACvC,yBAAyB,EAAE,SAAS,EACpC,iCAAiC,EAAE,CAAC,EACpC,YAAY,EAAE,YAAY,EAC1B,oBAAoB,EAAE,YAAY,EAClC,6BAA6B,EAAE,GAAG,IAC/B,eAAe,CACnB;IAED,sBAAsB,CAAC,SAAS,EAAE,cAAc,EAAE,KAAK,CAAC;IAExD,MAAM,gBAAgB,GAAG,IAAI,iDAAe,CAAC,cAAc,CAAC;IAE5D,MAAM,WAAW,GAAG,CAAC,WAAoC,EAAE,OAA+E,EAAE,EAAE;QAC5I,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAEjD,MAAM,iBAAiB,mCAAQ,gBAAgB,CAAC,KAAK,GAAK,WAAW,CAAE;QAEvE,sBAAsB,CAAC,OAAO,CAAC,QAAQ,EAAE,iBAAiB,EAAE,OAAO,CAAC,yBAAyB,CAAC;QAE9F,gBAAgB,CAAC,IAAI,CAAC,iBAAiB,CAAC;IAC1C,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,OAA+E,EAAE,EAAE;QACpG,MAAM,iBAAiB,qBAAQ,gBAAgB,CAAC,KAAK,CAAE;QAEvD,sBAAsB,CAAC,OAAO,CAAC,QAAQ,EAAE,iBAAiB,EAAE,OAAO,CAAC,yBAAyB,CAAC;QAE9F,gBAAgB,CAAC,IAAI,CAAC,iBAAiB,CAAC;IAC1C,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,gBAAgB,CAAC,QAAQ,EAAE;IAC7B,CAAC;IAED,OAAO;QACL,WAAW,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,KAAK;QACzC,WAAW;QACX,SAAS;QACT,OAAO;QACP,CAAC,EAAE;YACD,SAAS,EAAE,gBAAgB;iBACxB,YAAY,EAAE;iBACd,IAAI,CAAC,oEAAoB,CAAC,0DAAc,CAAC,CAAC;SAC9C;KACF;AACH,CAAC;AAED,MAAM,uBAAuB,GAAG,CAAC,QAA8B,EAAE,EAAE,CAAC,CAAC,SAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,KAAK,YAAY,CAAC;AAE7I,MAAM,sBAAsB,GAAG,CAAC,WAAiC,EAAE,QAAuB,EAAE,kBAA2B,EAAE,EAAE;IACzH,QAAQ,CAAC,yBAAyB,GAAG,QAAQ,CAAC,iBAAiB;IAC/D,QAAQ,CAAC,yBAAyB,GAAG,QAAQ,CAAC,iBAAiB;IAC/D,QAAQ,CAAC,oBAAoB,GAAG,YAAY;IAG5C,IAAI,YAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,aAAa,MAAK,qBAAqB,EAAE;QACxD,QAAQ,CAAC,oBAAoB,GAAG,YAAY;QAC5C,QAAQ,CAAC,yBAAyB,GAAG,UAAU;KAChD;SAAM,IAAI,WAAW,IAAI,QAAQ,CAAC,YAAY,KAAK,YAAY,IAAI,CAAC,WAAW,CAAC,eAAe,KAAK,eAAe,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC,EAAE;QAC9J,gDAAW,CAAC,gBAAgB,QAAQ,CAAC,YAAY,4DAA4D,CAAC;QAC9G,QAAQ,CAAC,yBAAyB,GAAG,MAAM;QAC3C,QAAQ,CAAC,oBAAoB,GAAG,YAAY;KAC7C;SAAM,IAAI,QAAQ,CAAC,YAAY,KAAK,YAAY,EAAE;QACjD,QAAQ,CAAC,oBAAoB,GAAG,YAAY;QAC5C,QAAQ,CAAC,yBAAyB,GAAG,UAAU;KAChD;IAGD,IAAI,kBAAkB,IAAI,QAAQ,CAAC,yBAAyB,KAAK,OAAO,EAAE;QACxE,gDAAW,CAAC,qBAAqB,QAAQ,CAAC,yBAAyB,4DAA4D,CAAC;QAChI,QAAQ,CAAC,yBAAyB,GAAG,MAAM;KAC5C;IAGD,IAAI,QAAQ,CAAC,oBAAoB,KAAK,YAAY,EAAE;QAClD,QAAQ,CAAC,iCAAiC,GAAG,CAAC;QAC9C,QAAQ,CAAC,yBAAyB,GAAG,MAAM;KAC5C;SAAM;QACL,QAAQ,CAAC,iCAAiC,GAAG,QAAQ,CAAC,yBAAyB,KAAK,SAAS;YAC3F,CAAC,CAAC,QAAQ,CAAC,yBAAyB;YACpC,CAAC,CAAC,GAAG;KACR;AACH,CAAC;;;;;;;;;;;;;;;;;ACtHwD;AAKvB;AAG3B,MAAM,gBAAgB,GAAG,CAAC,EAAE,gBAAgB,EAAE,gBAAgB,EAIpE,EAAE,EAAE;IACH,MAAM,aAAa,GAAG,CAAC,SAAoB,EAAE,EAAE,CAAC,kBAAkB,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG;IAQ1G,MAAM,MAAM,GAAG,8DAAyB,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,SAAiB,EAAE,SAAoB,EAAE,EAAE;;QACjG,MAAM,WAAW,GAAG,gBAAgB,CAAC,yBAAyB,CAAC,SAAS,EAAE,SAAS,CAAC;QACpF,MAAM,GAAG,GAAG,2BAAS,CAAC,cAAc,CAAC,mBAAmB,EAAE,0CAAE,KAAK,0CAAE,aAAa,0CAAE,QAAQ;QAE1F,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,CAAC;QAI3C,MAAM,MAAM,GAAG,kBAAkB,YAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,MAAM,KAAI,CAAC,GAAG;QAE5D,IAAI,WAAW,IAAI,GAAG,EAAE;YACtB,MAAM,SAAS,GAAG,8CAAY,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,UAAU,GAAG,MAAM,EAAE,CAAC;YAE7E,OAAO,SAAS;SACjB;QAED,OAAO,UAAU,CAAC,SAAS,CAAC;IAC9B,CAAC,CAAC;IAOF,MAAM,UAAU,GAAG,CAAC,SAAoB,EAAE,EAAE;QAC1C,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,CAAC;QAE3C,OAAO,aAAa,UAAU,IAAI;IACpC,CAAC;IAED,MAAM,mBAAmB,GAAG,CAAC,GAAW,EAAE,EAAE;QAC1C,MAAM,EAAE,MAAM,EAAE,GAAG,iEAA2B,CAAC,GAAG,CAAC;QAEnD,IAAI,MAAM,EAAE;YACV,MAAM,EAAE,MAAM,EAAE,GAAG,iEAA2B,CAAC,GAAG,CAAC;YACnD,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;YAEhG,OAAO,SAAS;SACjB;QAED,OAAO,SAAS;IAClB,CAAC;IAED,MAAM,qBAAqB,GAAG,CAAC,GAAW,EAAE,EAAE;QAC5C,MAAM,SAAS,GAAG,mBAAmB,CAAC,GAAG,CAAC;QAE1C,IAAI,SAAS,EAAE;YACb,OAAO;gBACL,cAAc,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,SAAS,CAAC;aAC9D;SACF;QAED,OAAO,SAAS;IAClB,CAAC;IAKD,MAAM,UAAU,GAAG,CAAC,SAAiB,EAAE,EAAE;;QACvC,IAAI,CAAC,SAAS;YAAE,OAAO,SAAS;QAEhC,MAAM,SAAS,GAAG,mBAAmB,CAAC,SAAS,CAAC;QAChD,MAAM,cAAc,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC;QAEzE,IAAI,CAAC,SAAS;YAAE,OAAO,SAAS;QAEhC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,iEAA2B,CAAC,SAAS,CAAC;QACrE,MAAM,GAAG,GAAG,IAAI,qCAAG,CAAC,UAAU,EAAE,EAAE,CAAC;QAEnC,MAAM,GAAG,GAAG,2BAAS,CAAC,cAAc,CAAC,mBAAmB,EAAE,0CAAE,KAAK,0CAAE,aAAa,0CAAE,QAAQ;QAE1F,IAAI,GAAG,EAAE;YACP,IAAI;gBACF,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;gBAE7D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,cAAc,EAAE,cAAc,EAAE;aAClE;YAAC,OAAO,CAAC,EAAE;gBACV,iDAAY,CAAC,CAAC,CAAC;gBACf,OAAO,SAAS;aACjB;SACF;QAED,OAAO,SAAS;IAClB,CAAC;IA6BD,MAAM,iBAAiB,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAkE,EAAE,IAAoC,EAAE,EAAE;QACrK,MAAM,QAAQ,GAAG,8CAAY,CAAC,SAAS,EAAE,KAAK,EAAE,kBAAkB,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;QACjG,MAAM,MAAM,GAAG,8CAAY,CAAC,OAAO,EAAE,GAAG,EAAE,kBAAkB,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;QAE3F,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE;IACzC,CAAC;IAED,OAAO;QACL,mBAAmB;QACnB,qBAAqB;QACrB,MAAM;QACN,UAAU;QACV,UAAU;QACV,iBAAiB;KAClB;AACH,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpJ6G;AACsC;AAClH;AAE6C;AAEjC;AACkD;AAErC;AACZ;AACI;AACL;AAEG;AAER;AAEzC,MAAM,SAAS,GAAG,OAAO;AASlB,MAAM,WAAW,GAAG,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,EAOnH,EAAE,EAAE;IACH,MAAM,cAAc,GAAG,IAAI,yCAAO,EAAQ;IAC1C,MAAM,OAAO,GAAG,IAAI,yCAAO,EAAS;IACpC,MAAM,GAAG,GAAG,aAAa,CAAC,aAAa;IACvC,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC;IAC5D,aAAa,CAAC,WAAW,CAAC,gBAAgB,CAAC;IAC3C,MAAM,gBAAgB,GAAG,mFAAsB,CAAC,EAAE,OAAO,EAAE,CAAC;IAC5D,MAAM,OAAO,GAAG,yEAAsB,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;IACvF,MAAM,UAAU,GAAG,6DAAgB,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;IACpF,MAAM,iBAAiB,GAAG,6FAAuB,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACpJ,MAAM,YAAY,GAAG,iEAAkB,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,OAAO,EAAE,CAAC;IACzG,IAAI,qBAA+C;IAEnD,MAAM,IAAI,GAAG,GAAG,EAAE;;QAChB,aAAO,CAAC,WAAW,EAAE,0CAAE,UAAU,CAAC,GAAG,CAAC,CAAO,QAAQ,EAAE,EAAE;YACvD,MAAM,SAAS,GAAG,2DAAe,CAAC;gBAChC,IAAI,EAAE,QAAQ;gBACd,gBAAgB,EAAE,gBAAgB;gBAClC,wBAAwB;gBACxB,OAAO;gBACP,MAAM;gBACN,cAAc,EAAE,iBAAiB,CAAC,CAAC,CAAC,MAAM;aAC3C,CAAC;YACF,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC;QACjC,CAAC,EAAC;QACF,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,gBAAgB,EAAE;gBAClC,gBAAgB,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;aACrH;QACH,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,oBAAoB,GAAG,CAAC,EAAuF,EAAE,EAAE;QACvH,IAAI,YAAY,GAAG,KAAK;QACxB,gBAAgB,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAChD,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,iBAAG,KAAK,IAAK,IAAI,EAAG,CAAC,IAAI,YAAY;QAC3F,CAAC,CAAC;QAEF,IAAI,YAAY,EAAE;YAChB,gBAAgB,CAAC,MAAM,EAAE;SAC1B;IACH,CAAC;IAUD,MAAM,uBAAuB,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS;SAChD,IAAI,CACH,uDAAS,CAAC,CAAC,2BAA2B,EAAE,sBAAsB,CAAC,CAAC,EAChE,oEAAoB,CAAC,2DAAc,CAAC,EACpC,oDAAI,CAAC,CAAC,CAAC,CACR;IAEH,MAAM,oBAAoB,GAAG,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,sDAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,EAAE,oDAAI,CAAC,CAAC,CAAC,CAAC;IAEhG,MAAM,OAAO,GAAG,2CAAK,CAAC,cAAc,EAAE,uBAAuB,CAAC;SAC3D,IAAI,CACH,mDAAG,CAAC,GAAG,EAAE;QACP,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,oBAAoB,KAAK,YAAY,EAAE;YAC/D,gBAAgB,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ;YAC1C,gBAAgB,CAAC,KAAK,CAAC,SAAS,GAAG,QAAQ;SAC5C;aAAM;YACL,gBAAgB,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC;YACjD,gBAAgB,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC;SACnD;QAED,iBAAiB,CAAC,MAAM,EAAE;QAC1B,gBAAgB,CAAC,MAAM,EAAE;IAC3B,CAAC,CAAC,EACF,qDAAK,EAAE,CACR;IAEH,OAAO;SACJ,IAAI,CACH,yDAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAC9B;SACA,SAAS,EAAE;IAYd,MAAM,iBAAiB,GAAG,CAAC,QAAiC,EAAE,EAAE;QAC9D,OAAO,oBAAoB;aACxB,IAAI,CACH,mDAAG,CAAC,8DAAyB,CAAC,GAAG,SAAS,mBAAmB,EAAE,CAAC,EAAE,GAAG,EAAE;;YACrE,MAAM,sBAAsB,GAAG,OAAO,CAAC,qCAAqC,CAAC,QAAQ,CAAC;YACtF,MAAM,cAAc,GAAG,sBAAsB,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;YAC9G,MAAM,YAAY,GAAG,sBAAsB,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;YAC1G,MAAM,YAAY,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC,GAAG;YAClD,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,EAAE,CAAC,GAAG;YAE9C,MAAM,oBAAoB,GACxB,UAAU,CAAC,YAAY,EAAE,CAAC,cAAc,MAAK,sBAAsB,aAAtB,sBAAsB,uBAAtB,sBAAsB,CAAE,KAAK;gBAC1E,YAAY,KAAK,SAAS;iBAC1B,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,UAAU,CAAC,YAAY,CAAC;YAExC,MAAM,kBAAkB,GACtB,UAAU,CAAC,UAAU,EAAE,CAAC,cAAc,MAAK,sBAAsB,aAAtB,sBAAsB,uBAAtB,sBAAsB,CAAE,GAAG;gBACtE,UAAU,KAAK,SAAS;iBACxB,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,UAAU,CAAC,YAAY,CAAC;YAEtC,IAAI,cAAc,IAAI,YAAY,IAAI,sBAAsB,EAAE;gBAC5D,MAAM,aAAa,GAAG,OAAO,CAAC,qCAAqC,CAAC,sBAAsB,CAAC,aAAa,EAAE,cAAc,CAAC;gBACzH,MAAM,cAAc,GAAG,gBAAgB,CAAC,iCAAiC,CAAC,aAAa,EAAE,cAAc,CAAC;gBACxG,MAAM,WAAW,GAAG,OAAO,CAAC,qCAAqC,CAAC,sBAAsB,CAAC,WAAW,EAAE,YAAY,CAAC;gBACnH,MAAM,YAAY,GAAG,gBAAgB,CAAC,iCAAiC,CAAC,WAAW,EAAE,YAAY,CAAC;gBAElG,UAAU,CAAC,iBAAiB,CAAC;oBAC3B,SAAS,EAAE,cAAc;oBACzB,cAAc,EAAE,sBAAgB,CAAC,iBAAiB,CAAC,cAAc,CAAC,mCAAI,CAAC;oBACvE,SAAS,EAAE,gBAAgB,CAAC,iCAAiC,CAAC,aAAa,EAAE,cAAc,CAAC;oBAC5F,GAAG,EAAE,oBAAoB,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,YAAY;oBAC5F,OAAO,EAAE;wBACP,gBAAgB,EAAE,KAAK;qBACxB;iBACF,EAAE;oBACD,SAAS,EAAE,YAAY;oBACvB,cAAc,EAAE,sBAAgB,CAAC,iBAAiB,CAAC,YAAY,CAAC,mCAAI,CAAC;oBACrE,SAAS,EAAE,gBAAgB,CAAC,iCAAiC,CAAC,WAAW,EAAE,YAAY,CAAC;oBACxF,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,UAAU;oBACpF,OAAO,EAAE;wBACP,gBAAgB,EAAE,KAAK;qBACxB;iBACF,CAAC;aACH;YAED,+CAAU,CAAC,SAAS,EAAE,mBAAmB,CAAC;QAC5C,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CACvB;IACL,CAAC;IA0BD,MAAM,4BAA4B,GAAG,gBAAgB,CAAC,CAAC,CAAC,OAAO;SAC5D,IAAI,CAmBH,yDAAS,CAAC,GAAG,EAAE,CACb,oBAAoB;SACjB,IAAI,CACH,yDAAS,CAAC,GAAG,EAAE;QACb,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,mBAAmB,EAAE;QAE/D,IAAI,CAAC,gBAAgB;YAAE,OAAO,uCAAK;QAEnC,OAAO,iBAAiB,CAAC,gBAAgB,CAAC,gBAAgB,CAAC;IAC7D,CAAC,CAAC,EACF,yDAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC,WAAW,CAAC,CAC3C,CACJ,EACD,qDAAK,EAAE,CACR;IAEH,2CAAK,CACH,4BAA4B;SACzB,IAAI,CACH,yDAAS,CAAC,CAAC,EAAE,qBAAqB,EAAE,EAAE,EAAE;QACtC,OAAO,iBAAiB,CAAC,qBAAqB,CAAC;aAC5C,IAAI,CACH,yDAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC,WAAW,CAAC,CAC3C;IACL,CAAC,CAAC,CACH,EACH,gBAAgB,CAAC,CAAC,CAAC,OAAO;SACvB,IAAI,CACH,4DAAY,CAAC,EAAE,EAAE,yDAAuB,CAAC,EACzC,mDAAG,CAAC,GAAG,EAAE;QACP,UAAU,CAAC,wBAAwB,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;IAChE,CAAC,CAAC,CACH,CACJ;SACE,IAAI,CACH,yDAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAC9B;SACA,SAAS,EAAE;IAEd,2CAAK,CACH,gBAAgB,CAAC,CAAC,CAAC,MAAM;SACtB,IAAI,CACH,mDAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAGZ,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI;QAC5B,MAAM,cAAc,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC;QAChD,MAAM,iBAAiB,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAEtD,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAE,WAAW,EAAE;QACpC,qBAAqB,GAAG,2CAAK,CAC3B,iBAAiB;aACd,IAAI,CACH,sDAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,iBAAiB,CAAC,EAClD,mDAAG,CAAC,KAAK,CAAC,EAAE;YACV,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,2DAAe,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACpH,CAAC,CAAC,CACH,EACH,iBAAiB;aACd,IAAI,CACH,sDAAM,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,KAAK,aAAa,CAAC,EAC9C,yDAAS,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc;aAC1B,IAAI,CACH,sDAAM,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,KAAK,YAAY,CAAC,EAC7C,wDAAQ,CAAC,GAAG,EAAE,CAAC,8CAAQ,CAAC,IAAI,CAAC,CAAC,EAC9B,yDAAS,CAAC,cAAc;aACrB,IAAI,CACH,sDAAM,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,KAAK,WAAW,CAAC,EAC5C,mDAAG,CAAC,GAAG,EAAE;QAET,CAAC,CAAC,CACH,CACF,EACD,mDAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;YAEf,IAAI,IAAI,EAAE;aAOT;QACH,CAAC,CAAC,CACH,CACF,CACF,CACJ;aACE,SAAS,EAAE;IAChB,CAAC,CAAC,EACF,0DAAU,CAAC,CAAC,CAAC,EAAE;QACb,iDAAY,CAAC,CAAC,CAAC;QAEf,OAAO,uCAAK;IACd,CAAC,CAAC,EACF,yDAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAC9B,CACJ;SACE,SAAS,EAAE;IAEd,MAAM,uBAAuB,GAAG,iBAAiB,CAAC,CAAC,CAAC,WAAW;SAC5D,IAAI,CACH,mDAAG,CAAC,CAAC,IAAI,EAAE,EAAE;;QACX,MAAM,IAAI,GAAG,gDAAW,CAAC,GAAG,SAAS,aAAa,EAAE,CAAC,CAAC;QACtD,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,mBAAmB,EAAE;QAC/D,MAAM,sBAAsB,GAAG,OAAO,CAAC,qCAAqC,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC3F,IAAI,cAAc,GAAG,sBAAsB,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC5G,IAAI,YAAY,GAAG,sBAAsB,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;QACxG,cAAc,GAAG,cAAc,IAAI,gBAAgB;QACnD,YAAY,GAAG,YAAY,IAAI,gBAAgB;QAK/C,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,cAAc;QAElE,IAAI,gBAAgB,IAAI,gBAAgB,KAAK,gBAAgB,EAAE;YAC7D,gBAAgB,CAAC,KAAK,CAAC,gBAAgB,CAAC;SACzC;aAAM,IAAI,CAAC,gBAAgB,EAAE;YAE5B,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;SAC1B;QAED,IAAI,gBAAgB,IAAI,cAAc,IAAI,YAAY,IAAI,sBAAsB,EAAE;YAChF,MAAM,sBAAsB,GAAG,iBAAiB,CAAC,6BAA6B,EAAE;YAChF,MAAM,cAAc,GAAG,sBAAgB,CAAC,iBAAiB,CAAC,cAAc,CAAC,mCAAI,CAAC;YAC9E,MAAM,aAAa,GAAG,OAAO,CAAC,qCAAqC,CAAC,sBAAsB,CAAC,aAAa,EAAE,cAAc,CAAC;YACzH,MAAM,cAAc,GAAG,gBAAgB,CAAC,iCAAiC,CAAC,aAAa,EAAE,cAAc,CAAC;YACxG,MAAM,WAAW,GAAG,OAAO,CAAC,qCAAqC,CAAC,sBAAsB,CAAC,WAAW,EAAE,YAAY,CAAC;YACnH,MAAM,YAAY,GAAG,gBAAgB,CAAC,iCAAiC,CAAC,WAAW,EAAE,YAAY,CAAC;YAClG,MAAM,YAAY,GAAG,sBAAgB,CAAC,iBAAiB,CAAC,YAAY,CAAC,mCAAI,CAAC;YAE1E,UAAU,CAAC,iBAAiB,CAAC;gBAC3B,SAAS,EAAE,cAAc;gBACzB,cAAc,EAAE,cAAc;gBAC9B,SAAS,EAAE,cAAc;gBAazB,GAAG,EAAE,uBAAsB,aAAtB,sBAAsB,uBAAtB,sBAAsB,CAAE,IAAI,MAAK,mBAAmB,IAAI,gBAAgB,KAAK,cAAc;oBAC9F,CAAC,CAAC,sBAAsB,CAAC,IAAI;oBAC7B,CAAC,CAAC,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,oBAAoB,KAAK,YAAY;wBAC5F,CAAC,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,GAAG;wBAC/B,CAAC,CAAC,cAAc,KAAK,UAAU,CAAC,YAAY,EAAE,CAAC,cAAc;4BAC3D,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,cAAc,CAAC;4BACvC,CAAC,CAAC,SAAS;gBACjB,OAAO,EAAE;oBACP,gBAAgB,EAAE,KAAK;iBACxB;aACF,EAAE;gBACD,SAAS,EAAE,YAAY;gBACvB,cAAc,EAAE,YAAY;gBAC5B,SAAS,EAAE,YAAY;gBACvB,GAAG,EAAE,uBAAsB,aAAtB,sBAAsB,uBAAtB,sBAAsB,CAAE,IAAI,MAAK,mBAAmB,IAAI,gBAAgB,KAAK,YAAY;oBAC5F,CAAC,CAAC,sBAAsB,CAAC,IAAI;oBAC7B,CAAC,CAAC,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,oBAAoB,KAAK,YAAY;wBAC5F,CAAC,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,GAAG;wBAC7B,CAAC,CAAC,YAAY,KAAK,UAAU,CAAC,UAAU,EAAE,CAAC,cAAc;4BACvD,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC;4BACrC,CAAC,CAAC,SAAS;gBACjB,OAAO,EAAE;oBACP,gBAAgB,EAAE,KAAK;iBACxB;aACF,CAAC;YAEF,+CAAU,CAAC,SAAS,EAAE,yBAAyB,EAAE,EAAE,mBAAmB,EAAE,gBAAgB,KAAK,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,KAAK,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,cAAc,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,CAAC;SACpT;QAED,IAAI,EAAE;IACR,CAAC,CAAC,EACF,qDAAK,EAAE,EACP,yDAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAC9B;IAOH,uBAAuB;SACpB,IAAI,CACH,yDAAS,CAAC,CAAC,IAAI,EAAE,EAAE;QACjB,OAAO,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC;aACpC,IAAI,CACH,yDAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,CACtC;IACL,CAAC,CAAC,EACF,yDAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAC9B;SACA,SAAS,EAAE;IAiBd,2CAAK,CAMH,uBAAuB,EAKvB,4BAA4B,CAC7B;SACE,IAAI,CACH,yDAAS,CAAC,GAAG,EAAE;QACb,OAAO,oBAAoB;aACxB,IAAI,CACH,mDAAG,CAAC,GAAG,EAAE;YACP,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,wBAAwB,EAAE;YAEzE,+CAAU,CAAC,SAAS,EAAE,iBAAiB,EAAE,EAAE,qBAAqB,EAAE,CAAC;YAEnE,IAAI,qBAAqB,KAAK,SAAS;gBAAE,OAAM;YAE/C,MAAM,EAAE,KAAK,GAAG,qBAAqB,EAAE,GAAG,GAAG,qBAAqB,EAAE,GAAG,OAAO,CAAC,qCAAqC,CAAC,iBAAiB,CAAC,4BAA4B,EAAE,CAAC,IAAI,EAAE;YAE5K,IAAI,KAAK,KAAK,qBAAqB,IAAI,GAAG,KAAK,qBAAqB,EAAE;gBACpE,gDAAW,CAAC,4FAA4F,CAAC;gBACzG,gBAAgB,CAAC,YAAY,CAAC,CAAC,qBAAqB,EAAE,qBAAqB,CAAC,CAAC;aAC9E;iBAAM;gBACL,gBAAgB,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;aAC5C;QACH,CAAC,CAAC,EACF,oDAAI,CAAC,CAAC,CAAC,CACR;IACL,CAAC,CAAC,EACF,yDAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAC9B,CAAC,SAAS,EAAE;IAEf,OAAO;QACL,iBAAiB;QACjB,OAAO,EAAE,gBAAgB;QACzB,OAAO;QACP,gBAAgB;QAChB,UAAU;QACV,yBAAyB,EAAE,YAAY,CAAC,yBAAyB;QACjE,oBAAoB;QACpB,IAAI;QACJ,MAAM,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE;QACnC,OAAO,EAAE,GAAG,EAAE;YACZ,iBAAiB,CAAC,OAAO,EAAE;YAC3B,gBAAgB,CAAC,OAAO,EAAE;YAC1B,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAE,WAAW,EAAE;YACpC,gBAAgB,CAAC,MAAM,EAAE;QAC3B,CAAC;QACD,WAAW,EAAE,GAAG,EAAE,WAAC,6BAAgB,CAAC,mBAAmB,EAAE,0CAAE,gBAAgB,CAAC,WAAW,EAAE;QACzF,YAAY,EAAE,GAAG,EAAE,WAAC,6BAAgB,CAAC,mBAAmB,EAAE,0CAAE,gBAAgB,CAAC,YAAY,EAAE;QAC3F,CAAC,EAAE;YACD,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE;YACzB,cAAc,EAAE,iBAAiB,CAAC,CAAC,CAAC,MAAM;YAC1C,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,OAAO;SACpC;KACF;AACH,CAAC;AAED,MAAM,sBAAsB,GAAG,CAAC,GAAa,EAAE,MAA+B,EAAE,EAAE;IAChF,MAAM,OAAO,GAAgB,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC;IACrD,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG;;;GAGvB;IAUD,OAAO,CAAC,KAAK,CAAC,eAAe,GAAG,KAAK;IAErC,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;QAChD,IAAI,IAAI,CAAC,IAAI,KAAK,gCAAgC,EAAE;YAClD,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;SACxB;QAED,OAAO,OAAO;IAChB,CAAC,EAAE,OAAO,CAAC;AACb,CAAC;;;;;;;;;;;;;;;;;AC5gBiE;AAEO;AAGlE,MAAM,kBAAkB,GAAG,CAAC,EAAE,wBAAwB,EAAE,OAAO,EAKrE,EAAE,EAAE;IACH,MAAM,yBAAyB,GAAG,CAAqD,KAAQ,EAAE,EAAE;;QACjG,MAAM,uBAAuB,GAAG,KAAK,CAAC,MAAM,KAAK,wBAAwB;QACzE,MAAM,mBAAmB,GAAG,+EAAsC,CAAC,KAAK,CAAC;QACzE,MAAM,aAAa,GAAG,yBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,IAAI,0CAAE,YAAY;QAE7D,IAAI,CAAC,uBAAuB,IAAI,CAAC,mBAAmB,IAAI,CAAC,aAAa;YAAE,OAAO,KAAK;QAEpF,MAAM,SAAS,GAAG,OAAO,CAAC,sBAAsB,CAAC,aAAa,CAAC;QAE/D,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK;QAE5B,IAAI,0DAAc,CAAC,KAAK,CAAC,EAAE;YACzB,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,8BAA8B,CAAC,KAAK,CAAC;YAE5E,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,IAAI,kCACvC,KAAK,KACR,OAAO;gBACP,OAAO,IACF;YAEP,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YAElG,OAAO,QAAQ;SAChB;QAED,IAAI,wDAAY,CAAC,KAAK,CAAC,EAAE;YACvB,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,8BAA8B,CAAC,KAAK,CAAC;YAE5E,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,kCACrC,KAAK,KACR,OAAO;gBACP,OAAO,IACF;YAEP,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YAElG,OAAO,QAAQ;SAChB;QAED,IAAI,wDAAY,CAAC,KAAK,CAAC,EAAE;YACvB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAC3C,CAAC,KAAK,EAAE,EAAE;gBACR,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,8BAA8B,CAAC,KAAK,CAAC;gBAE5E,OAAO,IAAI,KAAK,CAAC;oBACf,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,OAAO;oBACP,OAAO;iBACR,CAAC;YACJ,CAAC,CACF;YAED,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE;gBAC1C,OAAO;gBACP,cAAc,EAAE,OAAO;gBACvB,aAAa,EAAE,OAAO;aACvB,CAAM;YAEP,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YAElG,OAAO,QAAQ;SAChB;QAED,OAAO,KAAK;IACd,CAAC;IAED,OAAO;QACL,yBAAyB;KAC1B;AACH,CAAC;;;;;;;;;;;;;;;;AC9EiC;AAK3B,MAAM,sBAAsB,GAAG,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,EAInF,EAAE,EAAE;IACH,MAAM,qCAAqC,GAAG,8DAAyB,CAAC,uCAAuC,EAAE,EAAE,EAAE,CAAC,QAAuB,EAAE,SAAoB,EAAqB,EAAE;QACxL,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAAC,qBAAqB,CAAC,SAAS,CAAC;QAelG,IAAI,OAAO,CAAC,KAAK,EAAE,EAAE;YACnB,OAAO;gBACL,CAAC,EAAE,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK;gBAEvD,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC;aACtC;SACF;QAED,OAAO;YAQL,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,SAAS,CAAC;YACtC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC;SACtC;IACH,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAYrB,MAAM,qCAAqC,GAAG,CAAC,iBAAoC,EAAE,SAAoB,EAAiB,EAAE;QAC1H,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAAC,qBAAqB,CAAC,SAAS,CAAC;QAelG,IAAI,OAAO,CAAC,KAAK,EAAE,EAAE;YACnB,OAAO;gBACL,CAAC,EAAE,CAAC,OAAO,GAAG,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK;gBAEhE,CAAC,EAAE,QAAQ,GAAG,iBAAiB,CAAC,CAAC;aAClC;SACF;QAGD,OAAO;YACL,CAAC,EAAE,SAAS,GAAG,iBAAiB,CAAC,CAAC;YAClC,CAAC,EAAE,QAAQ,GAAG,iBAAiB,CAAC,CAAC;SAClC;IACH,CAAC;IAKD,MAAM,wBAAwB,GAAG,8DAAyB,CAAC,wBAAwB,EAAE,EAAE,EAAE,CAAC,QAAuB,EAAE,EAAE;QACnH,MAAM,SAAS,GAAG,gBAAgB,CAAC,sBAAsB,CAAC,QAAQ,CAAC;QAEnE,OAAO,SAAS;IAClB,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAErB,MAAM,6BAA6B,GAAG,CAAC,SAAoB,EAAE,EAAE;QAC7D,OAAO,qCAAqC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,CAAC;IACzE,CAAC;IAED,MAAM,mCAAmC,GAAG,CAAC,MAAc,EAAE,SAAoB,EAAE,EAAE;QACnF,MAAM,eAAe,GAAG,gBAAgB,CAAC,4BAA4B,CAAC,MAAM,EAAE,SAAS,CAAC;QAExF,MAAM,QAAQ,GAAG,qCAAqC,CAAC,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,CAAC;QAE/F,OAAO,QAAQ;IACjB,CAAC;IAED,MAAM,qCAAqC,GAAG,CAAC,QAAuB,EAOxD,EAAE;;QACd,MAAM,SAAS,GAAG,wBAAwB,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,mBAAmB,EAAE;QAC9F,MAAM,cAAc,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAEpE,IAAI,cAAc,KAAK,SAAS;YAAE,OAAO,SAAS;QAElD,IAAI,WAAW,GAAG,QAAQ;QAE1B,IAAI,OAAO,CAAC,mBAAmB,EAAE,EAAE;YACjC,WAAW,GAAG,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE;SAC7E;QAED,MAAM,YAAY,GAAG,sBAAgB,CAAC,iBAAiB,CACrD,wBAAwB,CAAC,WAAW,CAAC,IAAI,gBAAgB,CAAC,mBAAmB,EAAE,CAChF,mCAAI,cAAc;QAEnB,MAAM,CAAC,IAAI,GAAG,cAAc,EAAE,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QAG5G,OAAO;YACL,KAAK,EAAE,cAAc;YACrB,aAAa,EAAE,QAAQ;YACvB,GAAG,EAAE,YAAY;YACjB,WAAW,EAAE,WAAW;YACxB,IAAI;YACJ,KAAK;SACN;IACH,CAAC;IAED,MAAM,sBAAsB,GAAG,CAAC,MAAe,EAAE,EAAE;QACjD,OAAO,gBAAgB,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,KAAK,MAAM,CAAC;IACjG,CAAC;IAED,MAAM,6BAA6B,GAAG,CAAC,IAAU,EAAE,MAA0B,EAAE,gBAAoC,EAAE,EAAE;QACrH,IAAI,OAAO,gBAAgB,KAAK,QAAQ,EAAE;YACxC,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,gBAAgB,CAAC;YACxD,OAAO,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,6BAA6B,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;SAC5G;QAED,OAAO,gBAAgB,CAAC,6BAA6B,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,EAAE,gBAAgB,CAAC;IAC5F,CAAC;IAED,OAAO;QACL,qCAAqC;QACrC,6BAA6B;QAC7B,mCAAmC;QACnC,qCAAqC;QACrC,wBAAwB;QACxB,sBAAsB;QACtB,6BAA6B;QAC7B,qCAAqC;KACtC;AACH,CAAC;;;;;;;;;;;;;;;;;AC5KiC;AAIoE;AAQtG,MAAM,SAAS,GAAG,gBAAgB;AAE3B,MAAM,wBAAwB,GAAG,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,EAKxF,EAAE,EAAE;IACH,MAAM,kBAAkB,GAAG,uFAAwB,CAAC,EAAE,OAAO,EAAE,CAAC;IAEhE,MAAM,qBAAqB,GAAG,CAAC,CAA0B,EAAE,CAA0B,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpH,MAAM,sBAAsB,GAAG,CAAC,CAA0B,EAAE,CAA0B,EAAE,EAAE,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC;IAE7L,MAAM,wBAAwB,GAAG,8DAAyB,CAAC,GAAG,SAAS,2BAA2B,EAAE,CAAC,EAAE,CAAC,QAA2B,EAAE,EAAE;QAErI,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,gBAAgB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC5E,MAAM,uBAAuB,GAAG,gBAAgB,CAAC,qBAAqB,CAAC,aAAa,IAAI,CAAC,CAAC;QAC1F,MAAM,cAAc,GAAG,uBAAuB,CAAC,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK;QACpF,MAAM,cAAc,GAAG,uBAAuB,CAAC,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM;QAEpF,OAAO;YACL,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC;YACpD,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC;SACrD;IACH,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAErB,MAAM,4BAA4B,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAA2B,EAA2B,EAAE;QAClG,MAAM,iBAAiB,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;QACxE,MAAM,UAAU,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAE1E,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;IAC7B,CAAC;IAED,MAAM,mBAAmB,GAAG,CAAC,GAAW,EAA2B,EAAE;QACnE,MAAM,SAAS,GAAG,UAAU,CAAC,mBAAmB,CAAC,GAAG,CAAC;QACrD,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE;QAE7D,IAAI,CAAC,SAAS,EAAE;YACd,gDAAW,CAAC,SAAS,EAAE,qCAAqC,GAAG,EAAE,CAAC;SACnE;aAAM;YACL,MAAM,mBAAmB,GAAG,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;YACrH,MAAM,eAAe,GAAG,OAAO,CAAC,qCAAqC,CAAC,mBAAmB,EAAE,SAAS,CAAC;YAGrG,uCAAY,4BAA4B,CAAC,eAAe,CAAC,KAAE,SAAS,IAAE;SACvE;QAED,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACvB,CAAC;IAED,MAAM,oBAAoB,GAAG,CAAC,SAAiB,EAAE,SAAqB,EAA2B,EAAE;QAGjG,IAAI,CAAC,SAAS,EAAE;YACd,MAAM,qBAAqB,GAAG,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK;YACrE,OAAO,wBAAwB,CAAC,EAAE,CAAC,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;SACpE;QAED,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC;QACzF,MAAM,aAAa,GAAG,OAAO,CAAC,qCAAqC,CAAC,mBAAmB,EAAE,SAAS,CAAC;QAEnG,OAAO,4BAA4B,CAAC,aAAa,CAAC;IACpD,CAAC;IAED,MAAM,wBAAwB,GAAG,CAAC,SAAoB,EAA2B,EAAE;QACjF,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,wBAAwB,CAAC,SAAS,CAAC;QAClF,MAAM,QAAQ,GAAG,OAAO,CAAC,qCAAqC,CAAC,mBAAmB,EAAE,SAAS,CAAC;QAE9F,OAAO,4BAA4B,CAAC,QAAQ,CAAC;IAC/C,CAAC;IAED,MAAM,8BAA8B,GAAG,CAAC,SAA0B,EAA2B,EAAE;QAC7F,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC;QACjD,IAAI,SAAS,EAAE;YACb,MAAM,QAAQ,GAAG,OAAO,CAAC,6BAA6B,CAAC,SAAS,CAAC;YAEjE,uCAAY,4BAA4B,CAAC,QAAQ,CAAC,KAAE,SAAS,IAAE;SAChE;QAED,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACvB,CAAC;IAED,MAAM,+BAA+B,GAAG,CAAC,QAA2B,EAA2B,EAAE;QAC/F,MAAM,iBAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,yBAAyB;QACzE,MAAM,SAAS,GAAG,OAAO,CAAC,wBAAwB,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,mBAAmB,EAAE;QACtG,MAAM,iBAAiB,GAAG,QAAQ;QAElC,IAAI,CAAC,SAAS,EAAE;YACd,OAAO,iBAAiB;SACzB;QAGD,MAAM,iBAAiB,GAAG,OAAO,CAAC,qCAAqC,CAAC,QAAQ,EAAE,SAAS,CAAC;QAE5F,MAAM,+BAA+B,GAAG,kBAAkB,CAAC,yBAAyB,CAAC,iBAAiB,EAAE,SAAS,CAAC;QAElH,MAAM,4BAA4B,GAAG,CAAC,iBAAiB,CAAC,mBAAmB,IAAI,qBAAqB,CAAC,+BAA+B,EAAE,iBAAiB,CAAC;QAGxJ,IAAI,CAAC,4BAA4B,EAAE;YACjC,OAAO,wBAAwB,CAC7B,OAAO,CAAC,KAAK,EAAE;gBACb,CAAC,CAAC,iBAAiB,KAAK,YAAY;oBAClC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE;oBACvD,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE;gBAC1D,CAAC,CAAC,iBAAiB,KAAK,YAAY;oBAClC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE;oBACvD,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAC7D;SACF;aAAM;YACL,MAAM,oBAAoB,GAAG,OAAO,CAAC,qCAAqC,CAAC,+BAA+B,EAAE,SAAS,CAAC;YAEtH,OAAO,oBAAoB;SAC5B;IACH,CAAC;IAED,MAAM,8BAA8B,GAAG,CAAC,QAA2B,EAA2B,EAAE;QAC9F,MAAM,iBAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,yBAAyB;QACzE,MAAM,SAAS,GAAG,OAAO,CAAC,wBAAwB,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,mBAAmB,EAAE;QACtG,MAAM,iBAAiB,mCAAQ,QAAQ,KAAE,SAAS,GAAE;QAEpD,IAAI,CAAC,SAAS,EAAE;YACd,OAAO,iBAAiB;SACzB;QAED,MAAM,iBAAiB,GAAG,OAAO,CAAC,qCAAqC,CAAC,QAAQ,EAAE,SAAS,CAAC;QAC5F,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,wBAAwB,CAAC,iBAAiB,EAAE,SAAS,CAAC;QACrG,MAAM,4BAA4B,GAAG,CAAC,iBAAiB,CAAC,mBAAmB,IAAI,qBAAqB,CAAC,mBAAmB,EAAE,iBAAiB,CAAC;QAE5I,IAAI,CAAC,4BAA4B,EAAE;YACjC,OAAO,wBAAwB,CAC7B,OAAO,CAAC,KAAK,EAAE;gBACb,CAAC,CAAC,iBAAiB,KAAK,YAAY;oBAClC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE;oBACvD,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE;gBAC1D,CAAC,CAAC,iBAAiB,KAAK,YAAY;oBAClC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE;oBACvD,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAC7D;SACF;aAAM;YACL,MAAM,oBAAoB,GAAG,OAAO,CAAC,qCAAqC,CAAC,mBAAmB,EAAE,SAAS,CAAC;YAE1G,OAAO,oBAAoB;SAC5B;IACH,CAAC;IASD,MAAM,yBAAyB,GAAG,CAAC,QAA2B,EAA2B,EAAE;QACzF,MAAM,mBAAmB,GAAG,OAAO,CAAC,wBAAwB,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,mBAAmB,EAAE;QAEhH,IAAI,UAAU,GAAG,+BAA+B,CAAC,QAAQ,CAAC;QAG1D,IAAI,oBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,sBAAsB,EAAE,KAAI,QAAQ,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,EAAE;YAChF,OAAO,4BAA4B,CAAC,UAAU,CAAC;SAChD;QAED,IAAI,OAAO,CAAC,mBAAmB,EAAE,EAAE;YAKjC,IAAI,oBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,sBAAsB,EAAE,KAAI,QAAQ,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,EAAE;gBAChF,OAAO,4BAA4B,CACjC,wBAAwB,CACtB,OAAO,CAAC,KAAK,EAAE;oBACb,CAAC,iCACM,UAAU,KACb,CAAC,EAAE,UAAU,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,IAEjD,CAAC,iCACM,UAAU,KACb,CAAC,EAAE,UAAU,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,GAC9C,CACN,CACF;aACF;YAMD,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,yBAAyB,KAAK,UAAU,IAAI,QAAQ,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,EAAE;gBACjG,OAAO,4BAA4B,CAAC,UAAU,CAAC;aAChD;YAED,UAAU,GAAG,+BAA+B,CAAC,UAAU,CAAC;SACzD;QAED,OAAO,4BAA4B,CAAC,UAAU,CAAC;IACjD,CAAC;IASD,MAAM,wBAAwB,GAAG,CAAC,QAA2B,EAA2B,EAAE;QACxF,MAAM,mBAAmB,GAAG,OAAO,CAAC,wBAAwB,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,mBAAmB,EAAE;QAEhH,IAAI,UAAU,GAAG,8BAA8B,CAAC,QAAQ,CAAC;QAGzD,IAAI,oBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,sBAAsB,EAAE,KAAI,QAAQ,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,EAAE;YAChF,OAAO,4BAA4B,CAAC,UAAU,CAAC;SAChD;QAED,IAAI,OAAO,CAAC,mBAAmB,EAAE,EAAE;YAKjC,IAAI,oBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,sBAAsB,EAAE,KAAI,QAAQ,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,EAAE;gBAChF,OAAO,4BAA4B,CACjC,wBAAwB,CACtB,OAAO,CAAC,KAAK,EAAE;oBACb,CAAC,iCAAM,UAAU,KAAE,CAAC,EAAE,UAAU,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,IAChE,CAAC,iCAAM,UAAU,KAAE,CAAC,EAAE,UAAU,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,GAAE,CACrE,CACF;aACF;YAMD,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,yBAAyB,KAAK,UAAU,IAAI,QAAQ,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,EAAE;gBACjG,OAAO,4BAA4B,CAAC,UAAU,CAAC;aAChD;YAED,UAAU,GAAG,8BAA8B,CAAC,UAAU,CAAC;SACxD;QAED,OAAO,4BAA4B,CAAC,UAAU,CAAC;IACjD,CAAC;IAED,MAAM,mBAAmB,GAAG,CAAC,GAAiB,EAAsD,EAAE;;QACpG,IAAI,QAAyB;QAC7B,IAAI;YACF,QAAQ,GAAG,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC;SACnD;QAAC,OAAO,CAAC,EAAE;YACV,iDAAY,CAAC,CAAC,CAAC;SAChB;QACD,IAAI,QAAQ,EAAE;YACZ,MAAM,gBAAgB,GAAG,GAAG,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE;YACjE,MAAM,iBAAiB,GAAG,aAAO,CAAC,WAAW,EAAE,0CAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,gBAAgB,CAAC;YACxG,IAAI,iBAAiB,EAAE;gBACrB,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAC5D,IAAI,SAAS,EAAE;oBACb,MAAM,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;oBAEjE,uCAAY,4BAA4B,CAAC,QAAQ,CAAC,KAAE,GAAG,EAAE,QAAQ,IAAE;iBACpE;aACF;SACF;QAED,OAAO,SAAS;IAClB,CAAC;IAED,MAAM,sBAAsB,GAAG,CAAC,MAAc,EAAE,SAAoB,EAAE,EAAE;QACtE,MAAM,QAAQ,GAAG,OAAO,CAAC,mCAAmC,CAAC,MAAM,EAAE,SAAS,CAAC;QAE/E,OAAO,4BAA4B,CAAC,QAAQ,CAAC;IAC/C,CAAC;IAED,MAAM,wBAAwB,GAAG,CAAC,gBAAkC,EAAE,EAAE;QACtE,MAAM,SAAS,GAAG,OAAO,CAAC,wBAAwB,CAAC,gBAAgB,CAAC;QAEpE,IAAI,SAAS,EAAE;YACb,MAAM,iBAAiB,GAAG,OAAO,CAAC,qCAAqC,CAAC,gBAAgB,EAAE,SAAS,CAAC;YACpG,MAAM,sBAAsB,GAAG,kBAAkB,CAAC,wBAAwB,CAAC,SAAS,EAAE,iBAAiB,CAAC;YACxG,MAAM,kBAAkB,GAAG,OAAO,CAAC,qCAAqC,CAAC,sBAAsB,EAAE,SAAS,CAAC;YAE3G,OAAO,4BAA4B,CAAC,kBAAkB,CAAC;SACxD;QAED,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACvB,CAAC;IAMD,MAAM,uCAAuC,GAAG,CAAC,gBAAkC,EAAE,EAAE;QACrF,MAAM,iBAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,yBAAyB;QAIzE,MAAM,iBAAiB,GAAG,GAAG;QAC7B,MAAM,gBAAgB,GAAG,iBAAiB,KAAK,YAAY;YACzD,CAAC,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,KAAK,GAAG,iBAAiB,CAAC;YAC/E,CAAC,CAAC,CAAC;QACL,MAAM,gBAAgB,GAAG,iBAAiB,KAAK,YAAY;YACzD,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,MAAM,GAAG,iBAAiB,CAAC;QAClF,MAAM,6BAA6B,GAAG,wBAAwB,CAAC,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC;QAC5G,OAAO,wBAAwB,CAAC,6BAA6B,CAAC;IAChE,CAAC;IAED,MAAM,4BAA4B,GAAG,CAAC,EAAoB,EAAE,IAAsB,EAAE,EAAE;QACpF,MAAM,iBAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,yBAAyB;QAEzE,IAAI,iBAAiB,KAAK,UAAU,EAAE;YACpC,OAAO,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;SACrB;QAED,OAAO,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,OAAO;QACL,mBAAmB;QACnB,oBAAoB;QACpB,wBAAwB;QACxB,8BAA8B;QAC9B,yBAAyB;QACzB,wBAAwB;QACxB,mBAAmB;QACnB,sBAAsB;QACtB,wBAAwB;QACxB,uCAAuC;QACvC,wBAAwB;QACxB,4BAA4B;QAC5B,sBAAsB;QACtB,qBAAqB;KACtB;AACH,CAAC;;;;;;;;;;;;;;;;;;;;AC1VgE;AACW;AAGvC;AAIrC,MAAM,SAAS,GAAG,yBAAyB;AAUpC,MAAM,6BAA6B,GAAG,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,OAAO,EAAE,OAAO,EAOvH,EAAE,EAAE;IACH,MAAM,aAAa,GAAG,CAAC,IAAI,iDAAe,CAAkB,KAAK,CAAC,CAAC;IACnE,MAAM,yBAAyB,GAAG,IAAI,yCAAO,EAQ1C;IAEH,MAAM,QAAQ,GAAG,CAAC,EAAE,oBAAoB,GAAG,IAAI,KAAyC,EAAE,EAAE,EAAE,CAC5F,yBAAyB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,oBAAoB,EAAE,EAAE,CAAC;IAEtF,MAAM,SAAS,GAAG,CAAC,EAAE,oBAAoB,GAAG,IAAI,KAAyC,EAAE,EAAE,EAAE;QAC7F,yBAAyB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,oBAAoB,EAAE,EAAE,CAAC;IACvF,CAAC;IAGD,MAAM,wBAAwB,GAAG,CAAC,SAAiB,EAAE,EAAE,CACrD,yBAAyB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC;IAE9E,MAAM,QAAQ,GAAG,CAAC,SAAiB,EAAE,EAAE,CACrC,yBAAyB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC;IAE5E,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,UAAgC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CACjF,yBAAyB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,kBAAI,GAAG,IAAK,OAAO,CAAE,EAAE,CAAC;IAE5E,MAAM,OAAO,GAAG,CAAC,GAAiB,EAAE,EAAE,CACpC,yBAAyB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IAE5D,MAAM,aAAa,GAAG,CAAC,SAA0B,EAAE,UAAgC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;QACtG,yBAAyB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,kBAAI,SAAS,IAAK,OAAO,CAAE,EAAE,CAAC;IACxF,CAAC;IAED,MAAM,cAAc,GAAG,yBAAyB;SAC7C,IAAI,CACH,sDAAM,CAAC,CAAC,CAAC,EAAsB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,EACnD,yDAAS,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;QACrB,MAAM,UAAU,GAAG,SAAS,CAAC,mBAAmB,CAAC,IAAI,CAAC;QAEtD,IAAI,UAAU,EAAE;YACd,OAAO,wCAAE,iCAAM,UAAU,KAAE,OAAO,EAAE,IAAI,EAAE,0BAA0B,EAAE,EAAE,IAAI,EAAE,sBAA+B,EAAE,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAG;SAC9I;QAED,OAAO,uCAAK;IACd,CAAC,CAAC,CACH;IAEH,MAAM,oBAAoB,GAAG,yBAAyB;SACnD,IAAI,CACH,sDAAM,CAAC,CAAC,CAAC,EAA4B,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,EAC/D,yDAAS,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE;QAC7C,MAAM,UAAU,GAAG,SAAS,CAAC,8BAA8B,CAAC,SAAS,CAAC;QAGtE,MAAM,0BAA0B,GAAG,EAAE,IAAI,EAAE,6BAAsC,EAAE;QAEnF,+CAAU,CAAC,SAAS,EAAE,eAAe,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;QAE1E,OAAO,wCAAE,iCAAM,UAAU,KAAE,OAAO,EAAE,0BAA0B,IAAG;IACnE,CAAC,CAAC,CACH;IAEH,MAAM,cAAc,GAAG,yBAAyB;SAC7C,IAAI,CACH,sDAAM,CAAC,CAAC,CAAC,EAAsB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,EACnD,mDAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;QACjC,MAAM,UAAU,GAAG,SAAS,CAAC,mBAAmB,CAAC,GAAG,CAAC;QAErD,+CAAU,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;QAE9D,OAAO,iCACF,UAAU,KAAE,OAAO,EAAE,0BAA0B,EAAE,EAAE,IAAI,EAAE,mBAA4B,EAAE,IAAI,EAAE,GAAG,EAAE,IACrG;IACJ,CAAC,CAAC,CACH;IAEH,MAAM,sBAAsB,GAAG,yBAAyB;SACrD,IAAI,CACH,sDAAM,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,EACnE,yDAAS,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE;QACpC,MAAM,SAAS,GAAG,gBAAgB,CAAC,mBAAmB,EAAE;QAExD,IAAI,SAAS,EAAE;YACb,MAAM,UAAU,GAAG,SAAS,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC;YAEvE,OAAO,wCAAE,iCAAM,UAAU,KAAE,0BAA0B,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,IAAG;SACnF;QAED,OAAO,uCAAK;IACd,CAAC,CAAC,CACH;IAEH,MAAM,eAAe,GAAG,yBAAyB;SAC9C,IAAI,CACH,sDAAM,CAAC,CAAC,CAAC,EAA4B,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,EAC/D,sDAAM,CAAC,CAAC,CAAC,EAAE;;QACT,IAAI,cAAO,CAAC,WAAW,EAAE,0CAAE,eAAe,MAAK,YAAY,EAAE;YAC3D,gDAAW,CAAC,kDAAkD,CAAC;YAC/D,OAAO,KAAK;SACb;QAED,OAAO,IAAI;IACb,CAAC,CAAC,EACF,yDAAS,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE;QACpC,OAAO,wCAAE,iCACJ,SAAS,CAAC,oBAAoB,CAAC,SAAS,CAAC,KAC5C,0BAA0B,EAAE,SAAS,EACrC,OAAO,EAAE,IAAI,IACb;IACJ,CAAC,CAAC,CACH;IAEH,MAAM,WAAW,GAAG,8DAAyB,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,UAAmC,EAAE,EAAE,oBAAoB,GAAG,IAAI,KAAyC,EAAE,EAAE,EAAE;QAC5K,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,mBAAmB,EAAE;QAE/D,IAAI,CAAC,gBAAgB;YAAE,OAAO,uCAAK;QAEnC,MAAM,YAAY,GAAG,OAAO,CAAC,wBAAwB,CAAC,UAAU,CAAC,IAAI,gBAAgB;QACrF,MAAM,mBAAmB,GAAG,YAAY,KAAK,gBAAgB;QAE7D,IAAI,mBAAmB,EAAE;YACvB,IAAI,oBAAoB,EAAE;gBACxB,IAAI,gBAAgB,CAAC,iBAAiB,CAAC,YAAY,EAAE,gBAAgB,CAAC,KAAK,QAAQ,EAAE;oBACnF,OAAO,wCAAE,iCAAM,UAAU,KAAE,0BAA0B,EAAE,EAAE,IAAI,EAAE,yBAAkC,EAAE,EAAE,OAAO,EAAE,IAAI,IAAG;iBACtH;qBAAM;oBACL,OAAO,wCAAE,iCAAM,UAAU,KAAE,0BAA0B,EAAE,EAAE,IAAI,EAAE,6BAAsC,EAAE,EAAE,OAAO,EAAE,IAAI,IAAG;iBAC1H;aACF;SACF;aAAM;YACL,OAAO,wCAAE,iCAAM,UAAU,KAAE,0BAA0B,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,IAAG;SACnF;QAED,OAAO,uCAAK;IACd,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAG,yBAAyB;SAClD,IAAI,CACH,sDAAM,CAAC,CAAC,CAAC,EAA2B,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,EAC7D,8DAAc,CAAC,yBAAyB,CAAC,EACzC,yDAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,iBAAiB,CAAC,EAAE,EAAE;QACpE,MAAM,UAAU,GAAG,SAAS,CAAC,wBAAwB,CAAC,iBAAiB,CAAC;QAExE,OAAO,WAAW,CAAC,UAAU,EAAE,EAAE,oBAAoB,EAAE,CAAC;IAC1D,CAAC,CAAC,CACH;IAEH,MAAM,oBAAoB,GAAG,yBAAyB;SACnD,IAAI,CACH,sDAAM,CAAC,CAAC,CAAC,EAA4B,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,EAC/D,8DAAc,CAAC,yBAAyB,CAAC,EACzC,yDAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,iBAAiB,CAAC,EAAE,EAAE;QACpE,MAAM,UAAU,GAAG,SAAS,CAAC,yBAAyB,CAAC,iBAAiB,CAAC;QAEzE,OAAO,WAAW,CAAC,UAAU,EAAE,EAAE,oBAAoB,EAAE,CAAC;IAC1D,CAAC,CAAC,CACH;IAEH,MAAM,WAAW,GAAG,2CAAK,CACvB,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EAEpB,2CAAK,CACH,cAAc,EACd,eAAe,CAChB,CACF;SACE,IAAI,CAMH,8DAAc,CAAC,yBAAyB,CAAC,EACzC,sDAAM,CAAC,CAAC,CAAC,UAAU,EAAE,iBAAiB,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,sBAAsB,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC,EAC5G,mDAAG,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAClC;IAEH,OAAO;QACL,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC;QAClB,mBAAmB,EAAE,CAAC,CAA2B,EAAE,EAAE;YACnD,OAAO,KAAK;QACd,CAAC;QACD,QAAQ;QACR,SAAS;QACT,OAAO;QACP,wBAAwB;QACxB,aAAa;QACb,OAAO;QACP,QAAQ;QACR,CAAC,EAAE;YACD,MAAM,EAAE,aAAa,CAAC,YAAY,EAAE;YACpC,WAAW;SACZ;KACF;AACH,CAAC;;;;;;;;;;;;;;;;;;;;ACjOyD;AACR;AAGb;AAKrC,MAAM,SAAS,GAAG,sBAAsB;AAIjC,MAAM,0BAA0B,GAAG,CAAC,EAAE,0BAA0B,EAAE,SAAS,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,EAAE,yBAAyB,EAQhJ,EAAE,EAAE;IACH,MAAM,yBAAyB,GAAG,IAAI,yCAAO,EAE1C;IACH,MAAM,aAAa,GAAG,IAAI,iDAAe,CAAkB,KAAK,CAAC;IACjE,IAAI,eAAe,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACpC,IAAI,kBAAkB,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACvC,MAAM,cAAc,GAAG,IAAI,yCAAO,EAAyC;IAK3E,MAAM,MAAM,GAAG,8DAAyB,CAAC,GAAG,SAAS,SAAS,EAAE,CAAC,EAAE,CAAC,KAA2C,EAAE,EAAE,KAAK,EAAE,KAAK,KAA2C,EAAE,EAAE,EAAE;QAC9K,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,oBAAoB,KAAK,YAAY,EAAE;YAC/D,gDAAW,CAAC,qDAAqD,CAAC;YAClE,OAAM;SACP;QAED,MAAM,iBAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,yBAAyB;QAEzE,IAAI,KAAK,EAAE;YACT,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;YAC3B,eAAe,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;YAChC,kBAAkB,GAAG,0BAA0B,EAAE;SAClD;QAED,IAAI,UAAU,GAAG,yBAAyB,CAAC,KAAK;QAEhD,IAAI,KAAK,EAAE;YACT,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,gBAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,CAAC,KAAI,CAAC,CAAC;YACtD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,gBAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,CAAC,KAAI,CAAC,CAAC;YAEtD,UAAU,GAAG,SAAS,CAAC,wBAAwB,CAAC;gBAC9C,CAAC,EAAE,iBAAiB,KAAK,YAAY;oBACnC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE;wBACf,CAAC,CAAC,kBAAkB,CAAC,CAAC,GAAG,UAAU;wBACnC,CAAC,CAAC,kBAAkB,CAAC,CAAC,GAAG,UAAU;oBACrC,CAAC,CAAC,CAAC;gBACL,CAAC,EAAE,iBAAiB,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,GAAG,UAAU;aAC9E,CAAC;YAEF,eAAe,GAAG,KAAK;SACxB;aAAM;YACL,UAAU,GAAG,0BAA0B,EAAE;SAC1C;QAED,kBAAkB,GAAG,UAAU;QAE/B,IAAI,KAAK,EAAE;YACT,eAAe,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;YAEhC,MAAM,CAAC;gBACL,IAAI,EAAE,yBAAyB,CAAC,KAAK;gBACrC,EAAE,EAAE,UAAU;gBACd,GAAG,EAAE,kBAAkB;aACxB,CAAC;YACF,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;YAEzB,OAAM;SACP;QAED,cAAc,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IAC/C,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAEtB,MAAM,MAAM,GAAG,CAAC,IAA4B,EAAE,EAAE;QAC9C,yBAAyB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACxD,CAAC;IAED,MAAM,6BAA6B,GAAG,8DAAyB,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,UAAmC,EAAE,EAAE,oBAAoB,GAAG,IAAI,KAAyC,EAAE,EAAE,EAAE;QAC9L,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,mBAAmB,EAAE;QAE/D,IAAI,CAAC,gBAAgB;YAAE,OAAO,SAAS;QAEvC,MAAM,YAAY,GAAG,OAAO,CAAC,wBAAwB,CAAC,UAAU,CAAC,IAAI,gBAAgB;QACrF,MAAM,mBAAmB,GAAG,YAAY,KAAK,gBAAgB;QAE7D,IAAI,mBAAmB,EAAE;YACvB,IAAI,oBAAoB,EAAE;gBACxB,IAAI,gBAAgB,CAAC,iBAAiB,CAAC,YAAY,EAAE,gBAAgB,CAAC,KAAK,QAAQ,EAAE;oBACnF,OAAO,EAAE,IAAI,EAAE,yBAAkC,EAAE;iBACpD;qBAAM;oBACL,OAAO,EAAE,IAAI,EAAE,6BAAsC,EAAE;iBACxD;aACF;SACF;aAAM;YACL,OAAO,SAAS;SACjB;IACH,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,yBAAyB;SAC9C,IAAI,CACH,sDAAM,CAAC,CAAC,CAAC,EAAuB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EACrD,yDAAS,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;QACnC,MAAM,iBAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,yBAAyB;QACzE,MAAM,aAAa,GAAG,SAAS,CAAC,4BAA4B,CAAC,EAAE,EAAE,IAAI,CAAC;QACtE,MAAM,iBAAiB,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;QACnD,MAAM,gBAAgB,GAAG,iBAAiB,KAAK,YAAY;YACzD,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,KAAK,GAAG,iBAAiB,CAAC;YACjE,CAAC,CAAC,CAAC;QACL,MAAM,gBAAgB,GAAG,iBAAiB,KAAK,YAAY;YACzD,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,MAAM,GAAG,iBAAiB,CAAC;QACpE,MAAM,6BAA6B,GAAG,SAAS,CAAC,wBAAwB,CAAC,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC;QACtH,MAAM,eAAe,GAAG,SAAS,CAAC,wBAAwB,CAAC,6BAA6B,CAAC;QACzF,MAAM,0BAA0B,GAAG,6BAA6B,CAAC,eAAe,CAAC;QAIjF,OAAO,wCAAE,iCAAM,eAAe,KAAE,0BAA0B,IAAG;IAC/D,CAAC,CAAC,CACH;IAEH,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,cAAc,CAAC,QAAQ,EAAE;QACzB,aAAa,CAAC,QAAQ,EAAE;IAC1B,CAAC;IAED,OAAO;QACL,MAAM;QACN,OAAO;QACP,mBAAmB,EAAE,CAAC,CAA2B,EAAE,EAAE;YACnD,OAAO,KAAK;QACd,CAAC;QACD,CAAC,EAAE;YACD,cAAc;YACd,MAAM,EAAE,aAAa,CAAC,YAAY,EAAE;YACpC,WAAW,EAAE,2CAAK,CAChB,eAAe,CAChB;SACF;KACF;AACH,CAAC;;;;;;;;;;;;;;;;;;;ACxJsI;AACM;AAI7I,MAAM,gCAAgC,GAAG,GAAG;AAErC,MAAM,6BAA6B,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,yBAAyB,EAKrG,EAAE,EAAE;IACH,IAAI,sCAAsC,GAAG,KAAK;IAElD,MAAM,oBAAoB,GAAG,CAAI,MAAqB,EAAiB,EAAE,CACvE,MAAM,CAAC,IAAI,CAAC,sDAAM,CAAC,GAAG,EAAE;QACtB,IAAI,sCAAsC,EAAE;YAC1C,sCAAsC,GAAG,KAAK;YAC9C,OAAO,KAAK;SACb;QAED,OAAO,IAAI;IACb,CAAC,CAAC,CAAC;IAEL,MAAM,mBAAmB,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAA4B,EAAE,EAAE;QACjE,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,oBAAoB,KAAK,YAAY,EAAE;YAC/D,sCAAsC,GAAG,IAAI;YAC7C,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;YAErC,OAAO,IAAI;SACZ;QAED,OAAO,KAAK;IACd,CAAC;IAED,MAAM,0BAA0B,GAAG,CAAI,MAAqB,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;SACjF,IAAI,CACH,mDAAG,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,oBAAoB,CAAC,EACrD,oEAAoB,EAAE,EACtB,yDAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CACjB,yCAAG,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,YAAY,EAAE,uCAAK,EAAE,MAAM,CAAC,CAChD,CACF;IAEH,MAAM,WAAW,GAAG,0BAA0B,CAAC,+CAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;SACzE,IAAI,CACH,oBAAoB,EACpB,qDAAK,EAAE,EACP,yDAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAC9B;IAEH,MAAM,mBAAmB,GAAG,WAAW;SACpC,IAAI,CACH,4DAAY,CAAC,gCAAgC,EAAE,yDAAuB,CAAC,EACvE,8DAAc,CAAC,yBAAyB,CAAC,EACzC,yDAAS,CAAC,GAAG,EAAE;QACb,MAAM,UAAU,GAAG,SAAS,CAAC,uCAAuC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;QAMrH,OAAO,wCAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,0BAA0B,EAAE,SAAS,EAAE,CAAC;IAC5F,CAAC,CAAC,EACF,qDAAK,EAAE,CACR;IAEH,MAAM,cAAc,GAAG,WAAW;SAC/B,IAAI,CACH,4DAAY,CAAC,gCAAgC,EAAE,yDAAuB,CAAC,EACvE,qDAAK,EAAE,EACP,yDAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAC9B;IAEH,MAAM,MAAM,GAAG,2CAAK,CAClB,WAAW;SACR,IAAI,CACH,mDAAG,CAAC,GAAG,EAAE,CAAC,OAAgB,CAAC,EAC3B,oEAAoB,EAAE,CACvB,EACH,cAAc;SACX,IAAI,CACH,mDAAG,CAAC,GAAG,EAAE,CAAC,KAAc,CAAC,CAC1B,CACJ;SACE,IAAI,CACH,yDAAS,CAAC,KAAK,CAAC,CACjB;IAEH,OAAO;QACL,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC;QAClB,mBAAmB;QACnB,CAAC,EAAE;YACD,MAAM;YACN,WAAW,EAAE,mBAAmB;SACjC;KACF;AACH,CAAC;;;;;;;;;;;;;;;;;;;;;;;;AClGoC;AAKoD;AACsC;AAEoC;AAE1F;AACA;AAEN;AAEnE,MAAM,SAAS,GAAG,mBAAmB;AAE9B,MAAM,uBAAuB,GAAG,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAQpH,EAAE,EAAE;IACH,IAAI,iCAAuE;IAQ3E,IAAI,yBAAyB,GAA4B,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACxE,MAAM,yBAAyB,GAAG,IAAI,iDAAe,CAAC,yBAAyB,CAAC;IAChF,MAAM,SAAS,GAAG,6EAAwB,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;IAC9F,MAAM,wBAAwB,GAAG,IAAI,yCAAO,EAA2D;IAOvG,MAAM,0BAA0B,GAAG,8DAAyB,CAAC,GAAG,SAAS,6BAA6B,EAAE,CAAC,EAAE,GAAG,EAAE;QAC9G,IAAI,iCAAiC,IAAI,kCAAiC,aAAjC,iCAAiC,uBAAjC,iCAAiC,CAAE,CAAC,MAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE;SAE9I;QAGD,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,oBAAoB,KAAK,YAAY,EAAE;YAC/D,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,OAAO,CAAC,SAAS,EAAE;YAChE,iCAAiC,GAAG,QAAQ;YAE5C,OAAO,iCAAiC;SACzC;QAED,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,qBAAqB,EAAE;QAEhD,MAAM,QAAQ,GAAG;YAIf,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE;YAC5B,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE;SAC7B;QACD,iCAAiC,GAAG,QAAQ;QAE5C,OAAO,iCAAiC;IAC1C,CAAC,CAAC;IAEF,MAAM,oBAAoB,GAAG,iFAA0B,CAAC;QACtD,OAAO;QACP,OAAO;QACP,SAAS;QACT,gBAAgB;QAChB,OAAO;QACP,0BAA0B;QAC1B,yBAAyB;KAC1B,CAAC;IACF,MAAM,uBAAuB,GAAG,uFAA6B,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,yBAAyB,EAAE,CAAC;IACzH,MAAM,uBAAuB,GAAG,uFAA6B,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC;IAEpJ,MAAM,kBAAkB,GAAG,CAAC,uBAAuB,EAAE,oBAAoB,EAAE,uBAAuB,CAAC;IACnG,MAAM,8BAA8B,GAAG,2CAAK,CAAC,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAEtG,IAAI,0BAS8C;IAElD,MAAM,SAAS,GAAG,CAAI,OAAsB,EAAE,EAAE;QAC9C,OAAO,CAAC,IAAI,CAAC,yDAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE;QAEvD,OAAO,OAAO;IAChB,CAAC;IAMD,MAAM,mBAAmB,GAAG,8DAAyB,CAAC,qBAAqB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAA4B,EAAE,KAAa,EAAE,EAAE;QACpI,iCAAiC,GAAG,SAAS;QAE7C,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE;YACrE,OAAO,SAAS,CAAC,mBAAmB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,UAAU;QAC9D,CAAC,EAAE,KAAK,CAAC;QAET,IAAI,CAAC,UAAU,EAAE;YACf,IAAI,OAAO,CAAC,KAAK,EAAE,EAAE;gBACnB,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,eAAe,CAAC,QAAQ,CAAC,QAAQ;aAC5D;iBAAM;gBACL,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,QAAQ;aAC7D;SACF;QAED,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACnB,IAAI,IAAI,CAAC,IAAI,KAAK,wBAAwB,EAAE;gBAC1C,IAAI,CAAC,EAAE,EAAE;aACV;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAarB,MAAM,gBAAgB,GAAG,CAAC,SAAoB,EAAE,EAAE;QAEhD,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC,GAAG;QAC7C,IAAI,qBAAqB,GAAG,yBAAyB;QACrD,MAAM,iBAAiB,GAAG,CAAC;QAE3B,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,oBAAoB,KAAK,YAAY,EAAE;YAC/D,qBAAqB,GAAG,SAAS,CAAC,uCAAuC,CAAC,0BAA0B,EAAE,CAAC;SACxG;aAAM,IAAI,2BAA0B,aAA1B,0BAA0B,uBAA1B,0BAA0B,CAAE,IAAI,MAAK,mBAAmB,EAAE;YAKnE,qBAAqB,GAAG,SAAS,CAAC,mBAAmB,CAAC,0BAA0B,CAAC,IAAI,CAAC;YACtF,+CAAU,CAAC,SAAS,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,cAAc,CAAC;SAC/E;aAAM,IAAI,2BAA0B,aAA1B,0BAA0B,uBAA1B,0BAA0B,CAAE,IAAI,MAAK,yBAAyB,EAAE;YAKzE,qBAAqB,GAAG,SAAS,CAAC,wBAAwB,CAAC,SAAS,CAAC;YACrE,+CAAU,CAAC,SAAS,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,EAAE,CAAC;SACzE;aAAM,IAAI,2BAA0B,aAA1B,0BAA0B,uBAA1B,0BAA0B,CAAE,IAAI,MAAK,6BAA6B,EAAE;YAK7E,qBAAqB,GAAG,SAAS,CAAC,oBAAoB,CAAC,CAAC,EAAE,SAAS,CAAC;YACpE,+CAAU,CAAC,SAAS,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,EAAE,CAAC;SAC7E;aAAM,IAAI,2BAA0B,aAA1B,0BAA0B,uBAA1B,0BAA0B,CAAE,IAAI,MAAK,sBAAsB,EAAE;YAKtE,MAAM,MAAM,GAAG,0BAA0B,CAAC,IAAI;YAC9C,qBAAqB,GAAG,SAAS,CAAC,sBAAsB,CAAC,MAAM,EAAE,SAAS,CAAC;SAC5E;aAAM,IAAI,OAAO,EAAE;YAOlB,qBAAqB,GAAG,SAAS,CAAC,mBAAmB,CAAC,OAAO,CAAC;YAC9D,+CAAU,CAAC,SAAS,EAAE,kBAAkB,EAAE,cAAc,CAAC;SAC1D;aAAM;YAOL,MAAM,gBAAgB,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC,SAAS,IAAI,CAAC;YACjE,qBAAqB,GAAG,SAAS,CAAC,oBAAoB,CAAC,gBAAgB,EAAE,SAAS,CAAC;YACnF,+CAAU,CAAC,SAAS,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,EAAE,CAAC;SACpE;QAED,MAAM,YAAY,GAAG,SAAS,CAAC,qBAAqB,CAAC,qBAAqB,EAAE,yBAAyB,CAAC;QAEtG,+CAAU,CAAC,SAAS,EAAE,kBAAkB,EAAE,EAAE,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,CAAC;QAEjL,IAAI,YAAY,EAAE;YAChB,wBAAwB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,qBAAqB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;SACnF;QAED,OAAO,wCAAE,CAAC,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,YAAY,EAAE,CAAC;IAC3G,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,iCAAiC,GAAG,SAAS;QAE7C,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,oBAAoB,KAAK,YAAY,EAAE;YAC/D,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC;YACzC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC;SAC3C;IACH,CAAC;IAED,MAAM,WAAW,GAIZ,2CAAK,CACR,oBAAoB,CAAC,CAAC,CAAC,WAAW;SAC/B,IAAI,CACH,mDAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iCACV,KAAK,KACR,QAAQ,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,EAChE,SAAS,EAAE,MAAe,EAC1B,WAAW,EAAE,QAAiB,IAC9B,CAAC,CACJ,EACH,uBAAuB,CAAC,CAAC,CAAC,WAAW;SAClC,IAAI,CACH,mDAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iCACV,KAAK,KACR,QAAQ,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,EAChE,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAe,CAAC,CAAC,CAAC,KAAc,EAC3D,WAAW,EAAE,QAAiB,IAC9B,CAAC,CACJ,EACH,wBAAwB;SACrB,IAAI,CACH,mDAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iCACV,KAAK,KACR,WAAW,EAAE,QAAiB,EAC9B,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAe,CAAC,CAAC,CAAC,KAAc,IAC3D,CAAC,CACJ,EACH,uBAAuB,CAAC,CAAC,CAAC,WAAW;SAClC,IAAI,CACH,mDAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iCACV,KAAK,KACR,WAAW,EAAE,QAAiB,EAC9B,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAe,CAAC,CAAC,CAAC,KAAc,IAC3D,CAAC,CACJ,CACJ;SACE,IAAI,CACH,mDAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACZ,IAAI,4BAA4B,IAAI,KAAK,EAAE;YACzC,0BAA0B,GAAG,KAAK,CAAC,0BAA0B;SAC9D;QACD,yBAAyB,GAAG,KAAK,CAAC,QAAQ;QAC1C,yBAAyB,CAAC,IAAI,CAAC,yBAAyB,CAAC;IAC3D,CAAC,CAAC,EACF,qDAAK,EAAE,EACP,yDAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAC9B;IAQH,MAAM,mCAAmC,GAAG,WAAW;SACpD,IAAI,CACH,sDAAM,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE;QACzB,IACE,WAAW,KAAK,QAAQ;YACxB,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,oBAAoB,KAAK,YAAY,IAAI,WAAW,KAAK,QAAQ,CAAC,EACzF;YACA,OAAO,KAAK;SACb;aAAM;YACL,OAAO,IAAI;SACZ;IACH,CAAC,CAAC,CACH;IAEH,MAAM,aAAa,GAAG,2CAAK,CACzB,oBAAoB,CAAC,CAAC,CAAC,cAAc,CAAC,YAAY,EAAE;SACjD,IAAI,CACH,mDAAG,CAAC,KAAK,CAAC,EAAE,CAAC,iCAAM,KAAK,KAAE,SAAS,EAAE,KAAc,IAAG,CAAC,CACxD,EACH,mCAAmC,CACpC;SACE,IAAI,CACH,mDAAG,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC9B,MAAM,aAAa,GACjB,CAAC,CACC,CAAC,SAAS;YACV,CAAC,SAAS,KAAK,MAAM,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,yBAAyB,KAAK,MAAM,CAAC,CACrF;QAEH,OAAO;YACL,IAAI,EAAE,cAAuB;YAC7B,aAAa;YACb,SAAS;YACT,QAAQ;SACT;IACH,CAAC,CAAC,EACF,qDAAK,EAAE,CACR;IAEH,MAAM,oBAAoB,GAAG,2CAAK,CAChC,aAAa,CACd;SACE,IAAI,CACH,yDAAS,CAAC,SAAS,CAAC,EACpB,wDAAQ,EAAE,EACV,mDAAG,CAAC,CAAC,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,EAAE;QAEhC,IAAI,UAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,IAAI,MAAK,cAAc,IAAI,aAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,MAAK,cAAc,EAAE;YAC/E,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC;YAC/C,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC;SAC1C;IACH,CAAC,CAAC,EACF,yDAAS,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,EAAE;QAC7B,IAAI,aAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,MAAK,cAAc;YAAE,OAAO,uCAAK;QAEvD,MAAM,iBAAiB,GAAG,YAAY,CAAC,SAAS,KAAK,MAAM;YACzD,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,6BAA6B;YACrD,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,iCAAiC;QAC3D,MAAM,iBAAiB,GAAG,YAAY,CAAC,SAAS,KAAK,MAAM;YACzD,CAAC,CAAC,OAAgB;YAClB,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,yBAAyB;QAEnD,OAAO,wCAAE,CAAC,YAAY,CAAC;aACpB,IAAI,CASH,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,qDAAK,CAAC,CAAC,EAAE,yDAAuB,CAAC,CAAC,CAAC,CAAC,0CAAQ,EACzE,mDAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAEX,MAAM,kBAAkB,GAAG,KAAK;YAEhC,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,kBAAkB,EAAE;gBAC7C,IAAI,iBAAiB,KAAK,MAAM,EAAE;oBAChC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,WAAW,iBAAiB,GAAG,CAAC,IAAI,CAAC;oBAC7E,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC;iBAC1C;qBAAM,IAAI,YAAY,CAAC,SAAS,KAAK,MAAM,IAAI,iBAAiB,KAAK,OAAO,EAAE;oBAC7E,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,aAAa,iBAAiB,IAAI,CAAC;oBAC3E,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC;iBAC1C;aACF;iBAAM;gBACL,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC;gBAC/C,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC;aAC1C;QACH,CAAC,CAAC,EASF,8DAAc,CAAC,MAAM,CAAC,EACtB,mDAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;YACpB,IAAI,iBAAiB,KAAK,MAAM,EAAE;gBAChC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC;aAC1C;QACH,CAAC,CAAC,EACF,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,qDAAK,CAAC,iBAAiB,GAAG,CAAC,EAAE,yDAAuB,CAAC,CAAC,CAAC,CAAC,0CAAQ,EAC7F,mDAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;YACpB,IAAI,iBAAiB,KAAK,MAAM,EAAE;gBAChC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC;gBACzC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC;aAC1C;QACH,CAAC,CAAC,EACF,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,qDAAK,CAAC,iBAAiB,GAAG,CAAC,EAAE,yDAAuB,CAAC,CAAC,CAAC,CAAC,0CAAQ,EAC7F,mDAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;YACpB,IAAI,iBAAiB,KAAK,MAAM,EAAE;gBAChC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC;aAC1C;QACH,CAAC,CAAC,EACF,yDAAS,CACP,8BAA8B,CAAC,IAAI,CACjC,sDAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,OAAO,CAAC,EAClC,oDAAI,CAAC,CAAC,CAAC,CACR,CACF,CACF;IACL,CAAC,CAAC,EACF,qDAAK,EAAE,EACP,yDAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAC9B;IAMH,MAAM,gBAAgB,GAAG,2CAAK,CAC5B,2CAAK,CAAC,aAAa,CAAC;SACjB,IAAI,CACH,mDAAG,CAAC,GAAG,EAAE,CAAC,OAAgB,CAAC,CAC5B,EACH,2CAAK,CACH,oBAAoB,CACrB;SACE,IAAI,CACH,mDAAG,CAAC,GAAG,EAAE,CAAC,KAAc,CAAC,CAC1B,CACJ;IAYD,MAAM,MAAM,GAAG,mDAAa,CAAC;QAC3B,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC;QACxD,gBAAgB;KACjB,CAAC;SACC,IAAI,CACH,mDAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EACzE,oEAAoB,EAAE,EACtB,2DAAW,CAAC,CAAC,CAAC,EAOd,SAAS,CACV;IAEH,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,wBAAwB,CAAC,QAAQ,EAAE;QACnC,kBAAkB,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAC9D,CAAC;IAED,OAAO;QACL,OAAO;QACP,MAAM;QACN,4BAA4B,EAAE,GAAG,EAAE,CAAC,yBAAyB;QAC7D,0BAA0B;QAC1B,QAAQ,EAAE,uBAAuB,CAAC,QAAQ;QAC1C,SAAS,EAAE,uBAAuB,CAAC,SAAS;QAC5C,QAAQ,EAAE,uBAAuB,CAAC,QAAQ;QAC1C,aAAa,EAAE,uBAAuB,CAAC,aAAa;QACpD,OAAO,EAAE,uBAAuB,CAAC,OAAO;QACxC,OAAO,EAAE,uBAAuB,CAAC,OAAO;QACxC,wBAAwB,EAAE,uBAAuB,CAAC,wBAAwB;QAC1E,gBAAgB;QAChB,MAAM,EAAE,oBAAoB,CAAC,MAAM;QACnC,6BAA6B,EAAE,GAAG,EAAE,CAAC,0BAA0B;QAC/D,CAAC,EAAE;YACD,MAAM;YACN,WAAW;SACZ;KACF;AACH,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxdsE;AAEZ;AACa;AACb;AACQ;AAEC;AAGpE,MAAM,aAAa,GAAG;IACpB,eAAwB;IACxB,aAAsB;IACtB,cAAuB;IACvB,cAAuB;IACvB,aAAsB;IACtB,YAAqB;IACrB,aAAsB;IACtB,WAAoB;CACrB;AAED,MAAM,WAAW,GAAG;IAClB,WAAoB;IACpB,SAAkB;IAClB,YAAqB;IACrB,YAAqB;IACrB,WAAoB;IACpB,UAAmB;IACnB,WAAoB;CACrB;AAED,MAAM,iBAAiB,GAAG,CAAC,GAAG,aAAa,EAAE,GAAG,WAAW,CAAC;AAErD,MAAM,qBAAqB,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,EAAE,cAAc,EAOrH,EAAE,EAAE;;IACH,MAAM,eAAe,GAAG,IAAI,yCAAO,EAAQ;IAC3C,MAAM,YAAY,GAAG,KAAK;IAC1B,MAAM,2BAA2B,GAAG,IAAI,yCAAO,EAAgD;IAC/F,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,aAAa,EAAE,IAAI,EAAE,MAAM,CAAC;IAC5E,MAAM,cAAc,GAAG,oBAAoB,CAAC,aAAa,EAAE,IAAI,EAAE,OAAO,CAAC;IACzE,MAAM,cAAc,GAAG,oBAAoB,CAAC,aAAa,EAAE,IAAI,CAAC;IAChE,MAAM,aAAa,GAAG,8DAAmB,EAAE;IAC3C,MAAM,gBAAgB,GAAG,iEAAsB,EAAE;IACjD,MAAM,UAAU,GAAG,gBAAgB,CAAC,wBAAwB,EAAE,aAAa,EAAE,gBAAgB,CAAC;IAC9F,MAAM,cAAc,GAAG,qEAAe,CAAC;QACrC,MAAM,EAAE,gBAAgB;QACxB,IAAI;QACJ,OAAO;QACP,aAAa,EAAE,aAAO,CAAC,cAAc,EAAE,0CAAE,aAAa;QACtD,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE;aAC1B,IAAI,CACH,mDAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,EAAE,GAAG,UAAU,CAAC,CAAC,CACxC;QACH,cAAc;KACf,CAAC;IAGF,gBAAgB,CAAC,WAAW,CAAC,cAAc,CAAC;IAC5C,gBAAgB,CAAC,WAAW,CAAC,cAAc,CAAC;IAC5C,aAAa,CAAC,WAAW,CAAC,gBAAgB,CAAC;IAG3C,IAAI,yBAAwE;IAE5E,MAAM,oBAAoB,GAAG,GAAG,EAAE;QAChC,IAAI,yBAAyB,EAAE;YAC7B,OAAO,yBAAyB;SACjC;QAED,MAAM,IAAI,GAAG,gBAAgB,CAAC,qBAAqB,EAAE;QACrD,MAAM,gBAAgB,mCACjB,IAAI,KAGP,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,EAAE,EACvC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,GAC1C;QAED,yBAAyB,GAAG,gBAAgB;QAE5C,OAAO,yBAAyB;IAClC,CAAC;IAOD,MAAM,WAAW,GAAG,GAAG,EAAE,WAAC,iBAAI,CAAC,SAAS,0CAAE,UAAU,CAAC,QAAQ,CAAC;IAE9D,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,EAAE;;QACtC,oBAAc,CAAC,mBAAmB,EAAE,0CAAE,WAAW,CAAC,kBAAkB,CAAC;QACrE,oBAAc,CAAC,mBAAmB,EAAE,0CAAE,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IAC7E,CAAC;IAED,MAAM,uBAAuB,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAmD,EAAE,EAAE;QACxG,IAAI,KAAK,KAAK,SAAS,EAAE;YACvB,gBAAgB,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,KAAK,IAAI;SAC5C;aAAM;YACL,gBAAgB,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC;SAC/C;QACD,IAAI,IAAI,KAAK,SAAS,EAAE;YACtB,gBAAgB,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI;SAC1C;aAAM;YACL,gBAAgB,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC;SAC9C;QACD,IAAI,GAAG,KAAK,SAAS,EAAE;YACrB,gBAAgB,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI;SACxC;aAAM;YACL,gBAAgB,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC;SAC7C;IACH,CAAC;IAED,MAAM,sBAAsB,GAAG,GAAG,EAAE;;QAClC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE;QACtE,MAAM,kBAAkB,GAAG,cAAc,CAAC,qBAAqB,EAAE;QACjE,MAAM,YAAY,GAAG,oBAAc,CAAC,mBAAmB,EAAE,0CAAE,KAAK;QAChE,IAAI,gBAAgB,KAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,eAAe,MAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,aAAa,KAAI,kBAAkB,EAAE;YAC1G,MAAM,kBAAkB,GAAG,SAAS,GAAG,kBAAkB,CAAC,KAAK;YAC/D,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC;YAE1F,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,kBAAkB,EAAE;SACjE;QAED,uBAAS,aAAa,EAAE,CAAC,EAAE,kBAAkB,EAAE,CAAC,IAAK,kBAAkB,EAAE;IAC3E,CAAC;IAED,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE;IAE/C,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE;IAEnD,MAAM,oCAAoC,GAAG,CAAC,QAAgB,EAAE,EAAE;;QAChE,MAAM,KAAK,GAAG,oBAAc,CAAC,mBAAmB,EAAE,0CAAE,KAAK;QACzD,IAAI,KAAK,IAAI,QAAQ,EAAE;YACrB,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;gBAC5B,OAAO,iBAAK,CAAC,eAAe,0CAAE,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,0CAAE,qBAAqB,EAAE;aACjG;YACD,OAAO,iBAAK,CAAC,eAAe,0CAAE,aAAa,CAAC,QAAQ,CAAC,0CAAE,qBAAqB,EAAE;SAC/E;IACH,CAAC;IAED,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,yBAAyB,GAAG,SAAS;IACvC,CAAC;IAGD,MAAM,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,EAAqC,EAAE,EAAE;QACtE,gBAAgB,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,KAAK,IAAI;QAC3C,gBAAgB,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,MAAM,IAAI;QAE7C,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,KAAK,IAAI,CAAC;QAIxF,cAAc,EAAE;IAOlB,CAAC;IAED,MAAM,8BAA8B,GAAG,CAAC,QAA8C,EAAE,EAAE;;QAIxF,MAAM,EAAE,IAAI,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,qBAAc,CAAC,eAAe,EAAE,0CAAE,qBAAqB,EAAE,KAAI,EAAE;QAC7F,MAAM,EAAE,aAAa,GAAG,CAAC,EAAE,GAAG,sBAAsB,EAAE,IAAI,EAAE;QAC5D,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,GAAG,aAAa,GAAG,IAAI;QACzD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,GAAG,aAAa,GAAG,GAAG;QAExD,OAAO;YACL,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,SAAS;SACnB;IACH,CAAC;IAED,MAAM,WAAW,GAAG,GAAS,EAAE;QAC7B,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE;QAC5C,MAAM,SAAS,GAAG,CAAC,CAAiC,EAAE,EAAE;YACtD,IAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,aAAa,EAAE;gBAC9B,OAAO,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC;aACvC;YAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QACzB,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACxD,IAAI,IAAI,CAAC,IAAI,KAAK,oBAAoB,EAAE;gBACtC,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;aACpB;YAED,OAAO,GAAG;QACZ,CAAC,EAAE,SAAS,CAAC;QAEb,OAAO,MAAM,UAAU,CAAC,IAAI,CAAC;IAC/B,CAAC;IAED,MAAM,mBAAmB,GAAG,CAC1B,EAKoK,EACpK,EAAE;QACF,MAAM,gBAAgB,GAAG,cAAc,CAAC,mBAAmB,EAAE;QAE7D,IAAI,gBAAgB;YAAE,OAAO,EAAE,iCAAM,gBAAgB,KAAE,SAAS,EAAE,gBAAgB,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,IAAG;QAE3H,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,cAAc,EAAE,CAAC;IACjJ,CAAC;IAED,MAAM,mCAAmC,GAAG,CAAC,OAAiC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAClH,IAAI,IAAI,CAAC,IAAI,KAAK,+BAA+B,EAAE;YACjD,IAAI,CAAC,EAAE,iBACL,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,gBAAgB,EAC3B,IAAI;gBACJ,WAAW,IACR,OAAO,EACV;SACH;IACH,CAAC,CAAC;IAEF,cAAc,CAAC,CAAC,CAAC,oBAAoB;SAClC,IAAI,CACH,8DAAc,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,EACzC,yDAAS,CAAC,eAAe,CAAC,CAC3B;SACA,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE;QAC7B,IAAI,IAAI,CAAC,aAAa,IAAI,OAAO,EAAE;YACjC,cAAc,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ;SAC3C;QACD,2BAA2B,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,CAAC;IAClF,CAAC,CAAC;IAEJ,cAAc,CAAC,CAAC,CAAC,OAAO;SACrB,IAAI,CACH,mDAAG,CAAC,GAAG,EAAE;QACP,IAAI,cAAc,IAAI,cAAc,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,EAAE;YACnE,cAAc,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS;SAC5C;IACH,CAAC,CAAC,EACF,yDAAS,CAAC,eAAe,CAAC,CAC3B;SACA,SAAS,EAAE;IAEd,OAAO;QACL,IAAI,EAAE,GAAG,EAAE;YACT,cAAc,EAAE;QAClB,CAAC;QACD,MAAM;QACN,uBAAuB;QACvB,oBAAoB;QACpB,oBAAoB;QACpB,mBAAmB,EAAE,cAAc,CAAC,mBAAmB;QACvD,WAAW;QACX,8BAA8B;QAC9B,cAAc;QACd,WAAW;QACX,WAAW;QACX,aAAa;QACb,cAAc;QACd,OAAO,EAAE,gBAAgB;QACzB,cAAc;QACd,YAAY;QACZ,oCAAoC;QACpC,sBAAsB;QACtB,WAAW;QACX,OAAO,EAAE,cAAc,CAAC,UAAU;QAClC,OAAO,EAAE,GAAG,EAAE;YACZ,eAAe,CAAC,IAAI,EAAE;YACtB,cAAc,CAAC,MAAM,GAAG,GAAG,EAAE,GAAG,CAAC;YACjC,cAAc,CAAC,MAAM,EAAE;YACvB,gBAAgB,CAAC,MAAM,EAAE;YACzB,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,OAAO,EAAE;YACzB,aAAa,CAAC,OAAO,EAAE;YACvB,gBAAgB,CAAC,OAAO,EAAE;YAC1B,eAAe,CAAC,QAAQ,EAAE;QAC5B,CAAC;QACD,sBAAsB,EAAE,GAAG,EAAE,WAAC,2BAAc,CAAC,cAAc,EAAE,0CAAE,UAAU,CAAC,UAAU,CAAC;QACrF,mBAAmB,EAAE,GAAG,EAAE;YACxB,OAAO,cAAc,CAAC,mBAAmB,EAAE,IAAI,OAAO,CAAC,mBAAmB,EAAE;QAC9E,CAAC;QACD,mBAAmB;QACnB,mCAAmC;QACnC,gBAAgB;QAChB,aAAa;QACb,CAAC,EAAE;YACD,2BAA2B,EAAE,2BAA2B,CAAC,YAAY,EAAE;YACvE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,OAAO;SAClC;KACF;AACH,CAAC;AAED,MAAM,sBAAsB,GAAG,CAAC,gBAA6B,EAAE,IAAoC,EAAE,MAA+B,EAAE,EAAE;IACtI,MAAM,OAAO,GAAgB,gBAAgB,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC;IAChF,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC;IAClC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,eAAe,EAAE,CAAC;IAC1D,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG;;;GAGvB;IAED,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;QAChD,IAAI,IAAI,CAAC,IAAI,KAAK,+BAA+B,EAAE;YACjD,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;SACxB;QAED,OAAO,OAAO;IAChB,CAAC,EAAE,OAAO,CAAC;AACb,CAAC;AAMD,MAAM,oBAAoB,GAAG,CAAC,gBAA6B,EAAE,IAAoC,EAAE,OAAgB,EAAE,EAAE;IACrH,MAAM,cAAc,GAAG,gBAAgB,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC;IAC1E,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;IACvC,cAAc,CAAC,KAAK,CAAC,OAAO,GAAG;;;iBAGhB,OAAO,CAAC,kBAAkB,EAAE,CAAC,KAAK;;;;;;;;;;GAUhD;IAED,MAAM,WAAW,GAAG,gBAAgB,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC;IACvE,WAAW,CAAC,SAAS,GAAG,OAAO;IAC/B,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG;;;GAG3B;IACD,MAAM,cAAc,GAAG,gBAAgB,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC;IAC1E,cAAc,CAAC,SAAS,GAAG,WAAW,IAAI,CAAC,EAAE,EAAE;IAC/C,cAAc,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;GAQ9B;IACD,cAAc,CAAC,WAAW,CAAC,WAAW,CAAC;IACvC,cAAc,CAAC,WAAW,CAAC,cAAc,CAAC;IAE1C,OAAO,cAAc;AACvB,CAAC;AAED,MAAM,oBAAoB,GAAG,CAAC,gBAA6B,EAAE,IAAoC,EAAE,EAAE;IACnG,MAAM,OAAO,GAAG,gBAAgB,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC;IACnE,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACzC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,IAAI,CAAC,eAAe,EAAE,CAAC;IACjE,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;GAMvB;IAED,OAAO,OAAO;AAChB,CAAC;AAED,MAAM,gBAAgB,GAAG,CAAC,wBAAqC,EAAE,aAAqD,EAAE,gBAA2D,EAAU,EAAE;IAC7L,OAAO;QACL;YACE,IAAI,EAAE,aAAa;YACnB,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;gBAKhB,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;;oBAC/C,MAAM,QAAQ,GAAG,CAAC,CAA4B,EAAE,EAAE;wBAChD,IAAI,cAAc,GAAG,CAAC;wBAEtB,IAAI,0DAAc,CAAC,CAAC,CAAC,EAAE;4BACrB,cAAc,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;yBAC7C;wBAED,IAAI,wDAAY,CAAC,CAAC,CAAC,EAAE;4BACnB,cAAc,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;yBAC3C;wBAED,IAAI,cAAc,KAAK,CAAC,EAAE;4BACxB,gFAAuC,CAAC,cAAc,EAAE,CAAC,CAAC;4BAC1D,wBAAwB,CAAC,aAAa,CAAC,cAAc,CAAC;yBACvD;oBACH,CAAC;oBAED,WAAK,CAAC,eAAe,0CAAE,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC;oBAExD,OAAO,GAAG,EAAE;;wBACV,WAAK,CAAC,eAAe,0CAAE,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC;oBAC7D,CAAC;gBACH,CAAC,CAAC;gBAEF,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC;gBAC7B,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC;gBAE1B,OAAO,GAAG,EAAE;oBACV,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAChC,CAAC;YACH,CAAC;SACF;KACF;AACH,CAAC;;;;;;;;;;;;;;;;;;ACzawB;AACY;AAE9B,MAAM,YAAY,GAAG,8DAAyB,CAAC,4BAA4B,EAAE,QAAQ,EAAE,GAAG,EAAE;IAGjG,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;IAC9C,KAAK,CAAC,WAAW,GAAG,IAAI;IACxB,KAAK,CAAC,QAAQ,GAAG,CAAC;IAClB,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,iCAAiC,CAAC;IAChE,KAAK,CAAC,SAAS,GAAG,IAAI;IACtB,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;GAQrB;IAED,OAAO,wCAAE,CAAC,KAAK,CAAC;AAClB,CAAC,CAAC;;;;;;;;;;;;;;;;ACtB0E;AAErE,MAAM,sBAAsB,GAAG,CAAC,YAA+B,EAAE,EAAE,CAAC,CAAC;IAC1E,KAAK,EAAE,YAAY;IACnB,WAAW,EAAE,gEAAuB,CAAC,YAAY,CAAC;IAClD,QAAQ,EAAE,6DAAoB,CAAC,YAAY,CAAC;CAC7C,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;ACL2E;AACtB;AAKhD,MAAM,0BAA0B,GAAG,CAAO,gBAAmC,EAAE,IAAoC,EAAE,EAAE;IAC5H,IAAI,OAAO,gBAAgB,KAAK,QAAQ;QAAE,OAAO,gBAAgB;IAEjE,MAAM,WAAW,GAAG,oEAAgB,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,IAAI,qEAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;IAExH,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,WAAW,CAAC,EAAE;QAC7F,MAAM,IAAI,GAAG,MAAM,iEAAiB,CAAC,MAAM,gBAAgB,CAAC,IAAI,EAAE,CAAC;QAEnE,OAAO;;;;;;;mBAOQ,IAAI;;;;;SAKd;KACN;IAED,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,WAAW,CAAC,EAAE;QACrD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE;QAE1C,OAAO;;;;;;;;;;;;;iBAaM,IAAI;;;KAGhB;KACF;IAED,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE;IAI7C,OAAO,OAAO;AAChB,CAAC;;;;;;;;;;;;;;;;;;;;;;;ACzDiE;AAGR;AAEtB;AACG;AAC0B;AACQ;AAElE,MAAM,eAAe,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAO7F,EAAE,EAAE;IACH,MAAM,eAAe,GAAG,IAAI,yCAAO,EAAQ;IAE3C,MAAM,EACJ,CAAC,EAAE,EACD,OAAO,EACP,OAAO,EACP,SAAS,EACT,QAAQ,EACR,SAAS,EACT,aAAa,EACb,MAAM,EACP,EACD,IAAI,EACJ,MAAM,EACN,OAAO,EAAE,aAAa,EACtB,yBAAyB,EAC1B,GAAG,qDAAY,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC;IAElF,MAAM,gBAAgB,GAAG,IAAI,iDAAe,CAAC,KAAK,CAAC;IACnD,MAAM,eAAe,GAAG,IAAI,iDAAe,CAAC,KAAK,CAAC;IAElD,SAAS,CAAC,SAAS,CAAC,gBAAgB,CAAC;IACrC,QAAQ,CAAC,SAAS,CAAC,eAAe,CAAC;IAEnC,MAAM,mBAAmB,GAAG,GAAG,EAAE;QAC/B,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,EAAE;QACtC,IAAI,gBAAgB,CAAC,KAAK,IAAI,KAAK,EAAE;YACnC,OAAO,+EAAsB,CAAC,KAAK,CAAC;SACrC;IACH,CAAC;IAGD,MAAM,qBAAqB,GAAG,GAAG,EAAE;QACjC,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,EAAE;QAEtC,IAAI,KAAK,KAAI,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,eAAe,GAAE;YACnC,MAAM,GAAG,GAAG,KAAK,CAAC,eAAe;YACjC,MAAM,YAAY,GAAG,GAAG,CAAC,aAAa,CAAC,uBAAuB,CAAC;YAC/D,IAAI,YAAY,EAAE;gBAChB,MAAM,iBAAiB,GAAG,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC;gBAC9D,IAAI,iBAAiB,EAAE;oBACrB,MAAM,KAAK,GAAG,oEAA2B,CAAC,iBAAiB,EAAE,OAAO,CAAC;oBACrE,MAAM,MAAM,GAAG,oEAA2B,CAAC,iBAAiB,EAAE,QAAQ,CAAC;oBACvE,IAAI,KAAK,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE;wBAC3B,OAAO;4BACL,KAAK,EAAE,KAAK;4BACZ,MAAM,EAAE,MAAM;yBACf;qBACF;yBAAM;wBACL,OAAO,SAAS;qBACjB;iBACF;aACF;SACF;QAED,OAAO,SAAS;IAClB,CAAC;IAED,MAAM,cAAc,GAAG,GAAG,EAAE;;QAC1B,OAAO,+BAAyB,EAAE,0CAAE,WAA0D;IAChG,CAAC;IAED,MAAM,sBAAsB,GAAG,GAAG,EAAE;;QAClC,OAAO,CAAC,CAAC,qBAAc,EAAE,0CAAE,UAAU,CAAC,UAAU,CAAC;IACnD,CAAC;IAED,MAAM,mBAAmB,GAAG,CAAC,QAAkB,EAAE,EAAE;QACjD,OAAO,uFAA0B,CAAC,QAAQ,EAAE,IAAI,CAAC;IACnD,CAAC;IAED,MAAM,oBAAoB,GAAG,2CAAK,CAChC,SAAS;SACN,IAAI,CACH,mDAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,CACtC,EACH,MAAM;SACH,IAAI,CACH,mDAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CACrC,CACJ;IAED,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,MAAM,EAAE;QACR,aAAa,EAAE;QACf,eAAe,CAAC,IAAI,EAAE;QACtB,eAAe,CAAC,QAAQ,EAAE;IAC5B,CAAC;IAED,OAAO;QACL,WAAW,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,KAAK;QACzC,UAAU,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK;QACvC,qBAAqB;QACrB,eAAe,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE;QAC/C,mBAAmB;QACnB,IAAI;QACJ,MAAM;QAON,YAAY,EAAE,CAAC,IAAuC,EAAE,EAAE;YACxD,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,EAAE;YACtC,IAAI,KAAK,EAAE;gBACT,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI;gBACrC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI;gBAEvC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,oBAAoB,KAAK,YAAY,EAAE;oBAE/D,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,GAAG,CAAC;iBACrC;aACF;QACH,CAAC;QAGD,mBAAmB;QACnB,mBAAmB,EAAE,GAA8B,EAAE;;YACnD,MAAM,WAAW,GAAG,cAAc,EAAE;YACpC,IAAI,WAAW,KAAK,aAAa,EAAE;gBACjC,OAAO,KAAK;aACb;YAED,MAAM,SAAS,GAAG,+BAAyB,EAAE,0CAAE,SAAS;YACxD,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC;gBAAE,OAAO,SAA4B;YAEjF,OAAO,SAAS;QAClB,CAAC;QACD,sBAAsB;QACtB,cAAc;QACd,OAAO;QACP,CAAC,EAAE;YACD,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,SAAS;YACpB,OAAO;YACP,MAAM;YACN,QAAQ,EAAE,eAAe,CAAC,YAAY,EAAE;YAKxC,oBAAoB;SACrB;KACF;AACH,CAAC;;;;;;;;;;;;;;;;;;;;;;;;AClK6F;AACgE;AAChI;AACsC;AAIvB;AACoB;AACQ;AAEzE,MAAM,YAAY,GAAG,CAAC,IAAU,EAAkD,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,aAAa;AAEzG,MAAM,YAAY,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAO1F,EAAE,EAAE;IACH,MAAM,eAAe,GAAG,IAAI,yCAAO,EAAQ;IAC3C,MAAM,YAAY,GAAG,IAAI,yCAAO,EAAQ;IACxC,MAAM,cAAc,GAAG,IAAI,yCAAO,EAAQ;IAC1C,MAAM,oBAAoB,GAAG,IAAI,iDAAe,CAAgC,SAAS,CAAC;IAC1F,MAAM,gBAAgB,GAAG,IAAI,iDAAe,CAAC,KAAK,CAAC;IACnD,MAAM,eAAe,GAAG,IAAI,iDAAe,CAAC,KAAK,CAAC;IAClD,IAAI,oBAAoB,GAA+D,EAAE;IACzF,IAAI,sBAAuD;IAE3D,MAAM,SAAS,GAAG,CAAI,OAAsB,EAAE,EAAE;QAC9C,OAAO,CAAC,IAAI,CAAC,yDAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE;QAEvD,OAAO,OAAO;IAChB,CAAC;IAED,MAAM,mBAAmB,GAAG,CAAC,QAAkB,EAAE,EAAE;QACjD,OAAO,uFAA0B,CAAC,QAAQ,EAAE,IAAI,CAAC;IACnD,CAAC;IAED,MAAM,oBAAoB,GAAG,cAAc,CAAC,IAAI,CAAC,sDAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,EAAE,oDAAI,CAAC,CAAC,CAAC,CAAC;IAKpF,MAAM,KAAK,GAAG,YAAY,CAAC,YAAY,EAAE;SACtC,IAAI,CACH,8DAAc,CAAC,gBAAgB,CAAC,EAChC,sDAAM,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,EAEpC,0DAAU,CAAC,GAAG,EAAE;QACd,OAAO,2DAAY,EAAE;aAClB,IAAI,CACH,wDAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,qDAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAC5D,wDAAQ,CAAC,CAAC,KAAK,EAAE,EAAE;YACjB,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC;YAEzB,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC;YAShC,IACE,CAAC,aAAa;gBACd,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC5C,CAEE,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,uBAAuB,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAElH,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,+EAAuC,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAC3G,EACD;gBACA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;gBAErC,OAAO,wCAAE,CAAC,KAAK,CAAC;aACjB;iBAAM;gBACL,MAAM,OAAO,GAAG,aAAa,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEzD,OAAO,0CAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;qBACvB,IAAI,CACH,wDAAQ,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,EACrD,mDAAG,CAAC,CAAC,OAAO,EAAE,EAAE;oBACd,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC;gBACxC,CAAC,CAAC,EACF,mDAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CACjB;aACJ;QACH,CAAC,CAAC,EACF,wDAAQ,CAAC,CAAC,KAAK,EAAE,EAAE;YACjB,IAAI,CAAC,KAAK;gBAAE,OAAO,uCAAK;YAExB,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,iCAAiC,CAAC;YAEhE,OAAO,+CAAS,CAAC,KAAK,EAAE,MAAM,CAAC;iBAC5B,IAAI,CACH,oDAAI,CAAC,CAAC,CAAC,EACP,8DAAc,CAAC,MAAM,CAAC,EACtB,wDAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE;;gBACtB,MAAM,IAAI,GAAmC,WAAK,CAAC,eAAe,0CAAE,IAAI;gBAExE,IAAI,CAAC,IAAI,EAAE;oBACT,2CAAY,CAAC,uCAAuC,IAAI,CAAC,EAAE,EAAE,CAAC;oBAE9D,OAAO,uCAAK;iBACb;gBAeD,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC;gBAElC,IAAI,MAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,eAAe,KAAI,IAAI,EAAE;oBAClC,sBAAsB,GAAG,WAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,0CAAE,gBAAgB,CAAC,IAAI,CAAC;iBACtE;gBAED,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,oBAAoB,KAAK,YAAY,EAAE;oBAE/D,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,GAAG,CAAC;iBACrC;gBAED,MAAM,gBAAgB,GAAG,+EAAsB,CAAC,KAAK,CAAC;gBAEtD,oBAAoB,GAAG,KAAK;qBACzB,MAAM,CAAC,YAAY,CAAC;qBACpB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,IAAI,IAAI,CAAC,EAAE,iCAAM,gBAAgB,KAAE,IAAI,IAAG,CAAC;gBAM1E,OAAO,wCAAE,CAAC,KAAK,CAAC;YAClB,CAAC,CAAC,CACH;QACL,CAAC,CAAC,EAEF,yDAAS,CAAC,cAAc,CAAC,CAC1B;IACL,CAAC,CAAC,EACF,qDAAK,EAAE,EACP,SAAS,EACT,yDAAS,CAAC,eAAe,CAAC,CAC3B;IAOH,MAAM,MAAM,GAAG,KAAK;SACjB,IAAI,CACH,yDAAS,CAAC,CAAC,KAAK,EAAE,EAAE;;QAClB,iDAAI,CAAC,YAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,eAAe,0CAAE,KAAK,CAAC,KAAK,KAAI,wCAAE,CAAC,SAAS,CAAC,CAAC;aACvD,IAAI,CACH,yDAAS,CAAC,cAAc,CAAC,CAC1B;KAAA,CACJ,EACD,qDAAK,EAAE,EACP,SAAS,EACT,yDAAS,CAAC,eAAe,CAAC,CAC3B;IAEH,MAAM,OAAO,GAAG,cAAc,CAAC,YAAY,EAAE;SAC1C,IAAI,CACH,8DAAc,CAAC,oBAAoB,CAAC,EACpC,sDAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAC/B,0DAAU,CAAC,GAAG,EAAE;;QACd,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;QAC9C,0BAAoB,CAAC,QAAQ,EAAE,0CAAE,MAAM,EAAE;QACzC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC;QAIpC,OAAO,wCAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CACvB,yDAAS,CAAC,KAAK,CAAC,CACjB;IACH,CAAC,CAAC,EACF,qDAAK,EAAE,EACP,yDAAS,CAAC,eAAe,CAAC,CAC3B;IAEH,2CAAK,CAAC,KAAK,CAAC,IAAI,CAAC,qDAAK,CAAC,IAAI,CAAC,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC,qDAAK,CAAC,KAAK,CAAC,CAAC,CAAC;SAC9D,IAAI,CACH,oEAAoB,EAAE,EACtB,yDAAS,CAAC,eAAe,CAAC,CAC3B;SACA,SAAS,CAAC,gBAAgB,CAAC;IAE9B,2CAAK,CAAC,MAAM,CAAC,IAAI,CAAC,qDAAK,CAAC,IAAI,CAAC,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC,qDAAK,CAAC,KAAK,CAAC,CAAC,CAAC;SAC/D,IAAI,CACH,oEAAoB,EAAE,EACtB,yDAAS,CAAC,eAAe,CAAC,CAC3B;SACA,SAAS,CAAC,eAAe,CAAC;IAE7B,OAAO,CAAC,SAAS,EAAE;IAEnB,OAAO;QACL,IAAI,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE;QAC/B,MAAM,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE;QACnC,OAAO,EAAE,GAAG,EAAE;YACZ,YAAY,CAAC,QAAQ,EAAE;YACvB,cAAc,CAAC,QAAQ,EAAE;YACzB,oBAAoB,CAAC,QAAQ,EAAE;YAC/B,eAAe,CAAC,IAAI,EAAE;YACtB,eAAe,CAAC,QAAQ,EAAE;YAC1B,eAAe,CAAC,QAAQ,EAAE;YAC1B,gBAAgB,CAAC,QAAQ,EAAE;QAC7B,CAAC;QACD,yBAAyB,EAAE,GAAG,EAAE,CAAC,sBAAsB;QACvD,CAAC,EAAE;YACD,KAAK,EAAE,YAAY,CAAC,YAAY,EAAE;YAClC,OAAO,EAAE,cAAc,CAAC,YAAY,EAAE;YACtC,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,gBAAgB,CAAC,YAAY,EAAE;YAC1C,QAAQ,EAAE,eAAe,CAAC,YAAY,EAAE;YACxC,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,OAAO;YAClB,aAAa,EAAE,oBAAoB;SACpC;KACF;AACH,CAAC;;;;;;;;;;;;;;;;;ACtOoE;AACJ;AAM1D,MAAM,eAAe,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,EAAE,cAAc,EAOjH,EAAE,EAAE;IACJ,IAAI,SAAwG;IAE5G,IAAI,IAAI,CAAC,eAAe,KAAK,eAAe,EAAE;QAC5C,SAAS,GAAG,mFAA2B,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;KAC/H;SAAM;QACL,SAAS,GAAG,+EAAyB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;KAC7H;IAED,uBACE,IAAI,IACD,SAAS,EACb;AACH,CAAC;;;;;;;;;;;;;;;;;AC9B8H;AAEhD;AAIxE,MAAM,sBAAsB,GAAG,CAAC,EAAE,OAAO,EAE/C,EAAE,EAAE;IACH,MAAM,iCAAiC,GAAG,CAAC,SAAiB,EAAE,SAAoB,EAAqB,EAAE;QACvG,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC,oBAAoB,EAAE;QACjF,MAAM,oBAAoB,GAAG,SAAS,CAAC,mBAAmB,EAAE;QAE5D,IAAI,SAAS,CAAC,sBAAsB,EAAE,EAAE;YACtC,MAAM,iBAAiB,GAAG,uEAA0B,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC;YAEzG,OAAO;gBACL,CAAC,EAAE,CAAC;gBACJ,CAAC,EAAE,iBAAiB;aACrB;SACF;QAED,MAAM,iBAAiB,GAAG,uEAA0B,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC;QAEvG,IAAI,oBAAoB,KAAK,KAAK,EAAE;YAClC,OAAO;gBACL,CAAC,EAAE,CAAC,SAAS,GAAG,iBAAiB,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK;gBAChE,CAAC,EAAE,CAAC;aACL;SACF;QAED,OAAO;YACL,CAAC,EAAE,iBAAiB;YACpB,CAAC,EAAE,CAAC;SACL;IACH,CAAC;IAOD,MAAM,iCAAiC,GAAG,CAAC,QAA2B,EAAE,SAAoB,EAAE,EAAE;QAC9F,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC,oBAAoB,EAAE;QACjF,MAAM,oBAAoB,GAAG,SAAS,CAAC,mBAAmB,EAAE;QAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK;QAC7C,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM;QAE/C,IAAI,sBAAsB,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEzE,IAAI,oBAAoB,KAAK,KAAK,EAAE;YAClC,sBAAsB,GAAG,CAAC,SAAS,GAAG,sBAAsB,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK;SAC5F;QAED,IAAI,SAAS,CAAC,sBAAsB,EAAE,EAAE;YACtC,MAAM,aAAa,GAAG,6DAAgB,CAAC,UAAU,EAAE,UAAU,CAAC;YAE9D,OAAO,iBAAiB,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,aAAa,CAAC;SAChE;aAAM;YACL,MAAM,aAAa,GAAG,6DAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;YAC5D,MAAM,SAAS,GAAG,iBAAiB,CAAC,sBAAsB,EAAE,SAAS,EAAE,aAAa,CAAC;YAErF,OAAO,SAAS;SACjB;IACH,CAAC;IAED,MAAM,4BAA4B,GAAG,CAAC,MAAc,EAAE,SAAoB,EAAE,EAAE;;QAC5E,MAAM,SAAS,GAAG,CAAC,gBAAS,CAAC,oBAAoB,EAAE,0CAAE,KAAK,KAAI,CAAC,CAAC;QAChE,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK;QAC7C,MAAM,yBAAyB,GAAG,SAAS,CAAC,oCAAoC,CAAC,MAAM,CAAC;QAExF,MAAM,cAAc,GAAG,0BAAyB,aAAzB,yBAAyB,uBAAzB,yBAAyB,CAAE,CAAC,KAAI,CAAC;QAExD,OAAO,8FAAiD,CAAC,cAAc,EAAE,SAAS,EAAE,SAAS,CAAC;IAChG,CAAC;IAED,MAAM,4BAA4B,GAAG,CAAC,IAAU,EAAE,MAAc,EAAE,SAAoB,EAAE,EAAE;;QACxF,IAAI,uBAA2C;QAG/C,IAAI,KAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ,MAAK,KAAK,IAAI,CAAC,KAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,WAAW,MAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY,CAAC,EAAE;YACjG,uBAAuB,GAAI,IAAoB,CAAC,qBAAqB,EAAE,CAAC,CAAC;SAC1E;aAAM,IAAI,IAAI,EAAE;YACf,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,4DAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;YAC/D,uBAAuB,GAAG,MAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,qBAAqB,GAAG,CAAC,KAAI,uBAAuB;SACtF;QAED,MAAM,cAAc,GAAG,gBAAS,CAAC,oBAAoB,EAAE,0CAAE,KAAK,KAAI,CAAC;QACnE,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK;QAE7C,IAAI,uBAAuB,EAAE;YAC3B,MAAM,GAAG,GAAG,8FAAiD,CAAC,uBAAuB,EAAE,SAAS,EAAE,cAAc,CAAC;YAGjH,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE;SACxB;QAED,OAAO,SAAS;IAClB,CAAC;IAKD,MAAM,yBAAyB,GAAG,CAAC,SAAiB,EAAE,SAAoB,EAAE,EAAE;;QAC5E,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE;QACtC,MAAM,KAAK,GAAG,qBAAS,CAAC,cAAc,0CAAE,mBAAmB,EAAE,0CAAE,KAAK;QAEpE,IACE,YAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,0CAAE,QAAQ;YAE9B,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,EAC1C;YAGA,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,iCAAiC,CAAC,SAAS,EAAE,SAAS,CAAC;YACnF,MAAM,QAAQ,GAAG;gBACf,IAAI;gBACJ,KAAK,EAAE,IAAI,GAAG,QAAQ,CAAC,KAAK;gBAC5B,GAAG;gBACH,MAAM,EAAE,GAAG,GAAG,QAAQ,CAAC,MAAM;aAC9B;YAED,MAAM,GAAG,GAAG,0EAA8B,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC;YAElF,OAAO,GAAG;SACX;QAED,OAAO,SAAS;IAClB,CAAC;IAED,MAAM,6CAA6C,GAAG,CAAC,cAAiC,EAAE,SAAoB,EAAE,EAAE;QAChH,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,oBAAoB,EAAE;QAE1D,MAAM,gBAAgB,GAAG;YACvB,CAAC,EAAE,8FAAiD,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;YAC1G,CAAC,EAAE,8FAAiD,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;SAC7G;QAED,OAAO,gBAAgB;IACzB,CAAC;IAED,MAAM,6BAA6B,GAAG,CAAC,IAAU,EAAE,MAAc,EAAE,SAAoB,EAAE,EAAE;QACzF,MAAM,QAAQ,GAAG,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC;QAEtE,OAAO,QAAQ,CAAC,CAAC,CAAC,iCAAiC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;IACtF,CAAC;IAED,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAE,SAAiB,EAAE,aAAqB,EAAE,EAAE;QACrF,MAAM,YAAY,GAAG,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC;QAE3E,IAAI,MAAM,IAAI,CAAC;YAAE,OAAO,CAAC;QAEzB,IAAI,MAAM,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;YAAE,OAAO,aAAa,GAAG,CAAC;QAEnE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC;IAC/F,CAAC;IAED,OAAO;QACL,4BAA4B;QAC5B,iCAAiC;QACjC,4BAA4B;QAC5B,iCAAiC;QACjC,6BAA6B;QAC7B,6CAA6C;QAC7C,yBAAyB;KAC1B;AACH,CAAC;;;;;;;;;;;;;;;;;ACrK+C;AACW;AAIpD,MAAM,wBAAwB,GAAG,CAAC,EAAE,OAAO,EAAwB,EAAE,EAAE;IAC5E,MAAM,gBAAgB,GAAG,yEAAsB,CAAC,EAAE,OAAO,EAAE,CAAC;IAE5D,MAAM,wBAAwB,GAAG,CAAC,QAA2B,EAAE,SAAoB,EAAqB,EAAE;QACxG,IAAI,qBAAqB,GAAG;YAC1B,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK;YAC3C,CAAC,EAAE,QAAQ,CAAC,CAAC;SACd;QAED,IAAI,SAAS,CAAC,sBAAsB,EAAE,EAAE;YACtC,qBAAqB,GAAG;gBACtB,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACb,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM;aAC7C;SACF;QAED,OAAO,gBAAgB,CAAC,6CAA6C,CAAC,qBAAqB,EAAE,SAAS,CAAC;IACzG,CAAC;IAED,MAAM,yBAAyB,GAAG,CAAC,QAA2B,EAAE,SAAoB,EAAqB,EAAE;QACzG,IAAI,qBAAqB,GAAG;YAC1B,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK;YAC3C,CAAC,EAAE,QAAQ,CAAC,CAAC;SACd;QAED,IAAI,SAAS,CAAC,sBAAsB,EAAE,EAAE;YACtC,qBAAqB,GAAG;gBACtB,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACb,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM;aAC7C;SACF;QAED,OAAO,gBAAgB,CAAC,6CAA6C,CAAC,qBAAqB,EAAE,SAAS,CAAC;IACzG,CAAC;IAED,MAAM,wBAAwB,GAAG,CAAC,SAAoB,EAAqB,EAAE;QAC3E,IAAI,SAAS,CAAC,sBAAsB,EAAE,EAAE;YACtC,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM;YAC/C,MAAM,aAAa,GAAG,6DAAgB,CAAC,SAAS,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;YAC3F,OAAO,oBAAoB,CAAC,aAAa,GAAG,CAAC,EAAE,SAAS,CAAC;SAC1D;aAAM;YACL,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK;YAC7C,MAAM,aAAa,GAAG,6DAAgB,CAAC,SAAS,CAAC,oBAAoB,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC;YACzF,OAAO,oBAAoB,CAAC,aAAa,GAAG,CAAC,EAAE,SAAS,CAAC;SAC1D;IACH,CAAC;IAED,MAAM,oBAAoB,GAAG,CAAC,SAAiB,EAAE,SAAoB,EAAqB,EAAE;QAC1F,MAAM,eAAe,GAAG,gBAAgB,CAAC,iCAAiC,CAAC,SAAS,EAAE,SAAS,CAAC;QAEhG,OAAO,eAAe;IACxB,CAAC;IAED,MAAM,qBAAqB,GAAG,CAAC,SAAoB,EAAE,IAAU,EAAE,MAAc,EAAE,EAAE;QACjF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC;QAEvF,OAAO,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACnC,CAAC;IAED,MAAM,wBAAwB,GAAG,CAAC,SAAoB,EAAE,QAA2B,EAAE,EAAE;QACrF,MAAM,4BAA4B,GAAG,gBAAgB,CAAC,6CAA6C,CAAC,QAAQ,EAAE,SAAS,CAAC;QAExH,OAAO,4BAA4B;IACrC,CAAC;IAED,OAAO;QACL,wBAAwB;QACxB,yBAAyB;QACzB,wBAAwB;QACxB,oBAAoB;QACpB,wBAAwB;QACxB,qBAAqB;KACtB;AACH,CAAC;;;;;;;;;;;;;;;;AC5EwD;AAElD,MAAM,2BAA2B,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,EAAE,cAAc,EAO9H,EAAE,EAAE;IACH,MAAM,eAAe,GAAG,uEAAqB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IACnJ,MAAM,cAAc,GAAG,eAAe,CAAC,cAAc;IAErD,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE;QACtC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK;QAChC,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM;QACpC,MAAM,WAAW,GAAG,SAAS;QAE7B,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE;IACtC,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,EAAE,iBAAiB,EAAE,YAAY,EAAE,cAAc,EAAuH,EAAE,EAAE;;QAC7L,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE;QACtE,MAAM,EAAE,kBAAkB,EAAE,aAAa,EAAE,GAAG,eAAe,CAAC,sBAAsB,EAAE;QACtF,MAAM,WAAW,GAAG,OAAO,CAAC,kBAAkB,EAAE;QAChD,MAAM,YAAY,GAAG,oBAAc,CAAC,mBAAmB,EAAE,0CAAE,KAAK;QAEhE,IAAI,eAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,WAAW,EAAE,MAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,eAAe,MAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,aAAa,GAAE;YACjG,MAAM,YAAY,GAAG,SAAS;YAC9B,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,GAAG,OAAO,CAAC,wBAAwB,EAAE;YAE7E,MAAM,OAAO,GAAG,kBAAkB,iCAC7B,aAAa,EAAE,KAClB,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,oBAAoB,KAAK,YAAY,EACxE,cAAc,KACb,kBAAkB,CAAC;YAEtB,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,SAAS,CAAC;YACxD,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC;YAE/C,IAAI,kBAAkB,EAAE;gBACtB,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC;gBACpC,cAAc,CAAC,YAAY,CAAC;oBAC1B,KAAK,EAAE,kBAAkB,CAAC,KAAK;oBAC/B,MAAM,EAAE,kBAAkB,CAAC,MAAM;iBAClC,CAAC;gBACF,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,aAAa,EAAE,CAAC;gBAC9D,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC;gBACvD,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC;gBAC7C,IAAI,cAAc,KAAK,MAAM,EAAE;oBAC7B,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC;oBAC7C,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC;iBAC3C;qBAAM,IAAI,iBAAiB,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,EAAE,EAAE;oBAC5D,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC;oBAC/C,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC;iBAC3C;qBAAM,IAAI,cAAc,KAAK,OAAO,EAAE;oBACrC,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC;oBAC5C,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC;iBAC5C;qBAAM;oBACL,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,WAAW,CAAC,MAAM,EACpC,iBAAiB,KAAK,QAAQ;wBAC5B,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;wBACjC,CAAC,CAAC,iBAAiB,KAAK,OAAO;4BAC7B,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;4BACjC,CAAC,CAAC,KAAK,CACZ;oBACD,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC;iBAC5C;gBACD,MAAM,mBAAmB,GACvB,cAAc,KAAK,MAAM;oBACvB,CAAC,CAAC,GAAG;oBACL,CAAC,CAAC,MAAM;gBACZ,MAAM,gBAAgB,GACpB,CAAC,cAAc,KAAK,OAAO,IAAI,iBAAiB,KAAK,QAAQ,CAAC;oBAC5D,CAAC,CAAC,MAAM;oBACR,CAAC,CAAC,CAAC,cAAc,KAAK,MAAM,IAAI,CAAC,iBAAiB,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;wBAChF,CAAC,CAAC,OAAO;wBACT,CAAC,CAAC,QAAQ;gBAClB,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,aAAa,mBAAmB,iBAAiB,aAAa,GAAG,CAAC;gBAC/G,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,WAAW,CAAC,kBAAkB,EAAE,GAAG,gBAAgB,SAAS,CAAC;gBAEjF,eAAe,CAAC,mCAAmC,CAAC,EAAE,YAAY,EAAE,CAAC;aACtE;iBAAM;gBACL,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC;gBACpC,cAAc,CAAC,YAAY,CAAC;oBAC1B,KAAK,EAAE,YAAY;oBACnB,MAAM,EAAE,aAAa;iBACtB,CAAC;gBACF,IAAI,iBAAiB,KAAK,QAAQ,EAAE;oBAClC,IAAI,OAAO,CAAC,KAAK,EAAE,EAAE;wBACnB,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,WAAW,CAAC,cAAc,EAAE,GAAG,SAAS,IAAI,CAAC;qBAClE;yBAAM;wBACL,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,WAAW,CAAC,aAAa,EAAE,GAAG,SAAS,IAAI,CAAC;qBACjE;iBACF;qBAAM;oBACL,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC;oBACjD,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;iBACnD;aACF;YAED,eAAe,CAAC,mCAAmC,CAAC,EAAE,YAAY,EAAE,CAAC;YAGrE,eAAe,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;YAEtE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE;SACtD;aAAM;YACL,eAAe,CAAC,mCAAmC,CAAC,EAAE,YAAY,EAAE,CAAC;YAErE,eAAe,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;SACpE;QAED,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE;IACpD,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,iBAAsI,EAAE,EAAE;QACxJ,OAAO,SAAS,CAAC,iBAAiB,CAAC;IACrC,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,eAAe,CAAC,OAAO,EAAE;IAC3B,CAAC;IAED,uCACK,eAAe,KAClB,MAAM;QACN,OAAO,IACR;AACH,CAAC;AAED,MAAM,kBAAkB,GAAG,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAKrE,EAAE,kBAAiE,EAAE,EAAE;IACtE,OAAO;;;;;;QAMD,CAAC,kBAAkB;QACrB,CAAC,CAAC;;2BAEmB,cAAc,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ;OACjH;QACD,CAAC,CAAC,EAAE;;MAKJ,EAAE;;;;;MAQF,EAAE;;oBAEY,WAAW;;MAO3B,EAAE;;QAEE,WAAW;QACb,CAAC,CAAC;;OAED;QACD,CAAC,CAAC,EAAE;;MAIJ,EAAE;;;;;;;;QAUA,EAAE;;QAOF,EAAE;QACF,CAAC,kBAAkB;QACrB,CAAC,CAAC;;;;;OAKD;QACD,CAAC,CAAC,EAAE;;GAEP;AACH,CAAC;;;;;;;;;;;;;;;;AChNwD;AAElD,MAAM,yBAAyB,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,EAAE,cAAc,EAO5H,EAAE,EAAE;IACH,MAAM,eAAe,GAAG,uEAAqB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IACnJ,MAAM,cAAc,GAAG,eAAe,CAAC,cAAc;IAWrD,IAAI,6BAAiD;IAErD,MAAM,aAAa,GAAG,CAAC,sBAA+B,EAAE,YAAoB,EAAE,EAAE;QAC9E,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE;QACtC,MAAM,gBAAgB,GAAG,CAAC;QAC1B,MAAM,cAAc,GAAG,CAAC;QACxB,IAAI,WAAW,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,gBAAgB,GAAG,CAAC,CAAC;QACzD,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC;QAC3D,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAEnD,IAAI,sBAAsB,EAAE;YAC1B,KAAK,GAAG,YAAY,GAAG,CAAC,gBAAgB,GAAG,CAAC,CAAC;YAC7C,WAAW,GAAG,YAAY;SAC3B;QAED,OAAO;YACL,YAAY;YACZ,WAAW;YAGX,KAAK;SACN;IACH,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,EAAE,iBAAiB,EAAE,YAAY,EAA4E,EAAE,EAAE;;QAC/H,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE;QAEtE,0BAAc,CAAC,mBAAmB,EAAE,0CAAE,KAAK,0CAAE,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,SAAS,IAAI,CAAC;QACzF,0BAAc,CAAC,mBAAmB,EAAE,0CAAE,KAAK,0CAAE,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,GAAG,UAAU,IAAI,CAAC;QAE3F,MAAM,kBAAkB,GAAG,cAAc,CAAC,qBAAqB,EAAE;QACjE,MAAM,WAAW,GAAG,OAAO,CAAC,kBAAkB,EAAE;QAChD,MAAM,YAAY,GAAG,oBAAc,CAAC,mBAAmB,EAAE,0CAAE,KAAK;QAChE,MAAM,sBAAsB,GAAG,cAAO,CAAC,WAAW,EAAE,0CAAE,eAAe,MAAK,eAAe;QAEzF,IAAI,eAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,WAAW,EAAE,MAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,eAAe,MAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,aAAa,GAAE;YACjG,IAAI,YAAY,GAAG,SAAS;YAC5B,IAAI,aAAa,GAAG,WAAW,CAAC,MAAM,GAAG,OAAO,CAAC,wBAAwB,EAAE;YAE3E,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,SAAS,CAAC;YACxD,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC;YAE/C,IAAI,kBAAkB,EAAE;gBACtB,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC;gBAC5G,eAAe,CAAC,WAAW,CAAC,6BAA6B,EAAE,CAAC;gBAE5D,eAAe,CAAC,mCAAmC,CAAC,EAAE,YAAY,EAAE,CAAC;gBAErE,cAAc,CAAC,YAAY,CAAC;oBAC1B,KAAK,EAAE,kBAAkB,CAAC,KAAK;oBAC/B,MAAM,EAAE,kBAAkB,CAAC,MAAM;iBAClC,CAAC;gBACF,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,aAAa,EAAE,CAAC;gBAC9D,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC;gBACvD,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC;gBAC7C,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,WAAW,CAAC,MAAM,EACpC,iBAAiB,KAAK,QAAQ;oBAC5B,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;oBACjC,CAAC,CAAC,iBAAiB,KAAK,OAAO;wBAC7B,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;wBACjC,CAAC,CAAC,KAAK,CACZ;gBACD,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,+BAA+B,aAAa,GAAG,CAAC;gBAC7F,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,WAAW,CAAC,kBAAkB,EAAE,eAAe,CAAC;aACrE;iBAAM;gBACL,MAAM,UAAU,GAAG,eAAe,CAAC,WAAW,EAAE;oBAC9C,CAAC,CAAC,gCAAgC,CAAC;wBACjC,YAAY,EAAE,cAAO,CAAC,WAAW,EAAE,0CAAE,aAAa,MAAK,qBAAqB;wBAC5E,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,oBAAoB,KAAK,YAAY;qBACzE,CAAC;oBACF,CAAC,CAAC,yBAAyB,CAAC,aAAa,CAAC,cAAc,CAAC,sBAAsB,EAAE,EAAE,YAAY,CAAC,CAAC;gBAEnG,eAAe,CAAC,WAAW,CAAC,UAAU,CAAC;gBAEvC,eAAe,CAAC,mCAAmC,CAAC,EAAE,YAAY,EAAE,CAAC;gBAErE,IAAI,cAAc,CAAC,sBAAsB,EAAE,EAAE;oBAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CACrB,YAAY,CAAC,eAAe,CAAC,eAAe,CAAC,YAAY,GAAG,UAAU,CACvE;oBACD,aAAa,GAAG,KAAK,GAAG,UAAU;oBAElC,cAAc,CAAC,YAAY,CAAC;wBAC1B,KAAK,EAAE,YAAY;wBACnB,MAAM,EAAE,aAAa;qBACtB,CAAC;iBACH;qBAAM,IAAI,cAAO,CAAC,WAAW,EAAE,0CAAE,aAAa,MAAK,qBAAqB,EAAE;oBACzE,aAAa,GAAG,YAAY,CAAC,eAAe,CAAC,eAAe,CAAC,YAAY;oBACzE,6BAA6B,GAAG,aAAa;oBAE7C,cAAc,CAAC,YAAY,CAAC;wBAC1B,KAAK,EAAE,YAAY;wBACnB,MAAM,EAAE,aAAa;qBACtB,CAAC;iBACH;qBAAM;oBACL,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CACrB,YAAY,CAAC,eAAe,CAAC,eAAe,CAAC,WAAW,GAAG,SAAS,CACrE;oBASD,IAAI,sBAAsB,EAAE;wBAC1B,YAAY,GAAG,SAAS;qBACzB;yBAAM;wBACL,YAAY,GAAG,KAAK,GAAG,SAAS;qBACjC;oBAED,cAAc,CAAC,YAAY,CAAC;wBAC1B,KAAK,EAAE,YAAY;wBACnB,MAAM,EAAE,aAAa;qBACtB,CAAC;iBACH;aACF;YAED,MAAM,kBAAkB,GAAG,YAAY,GAAG,YAAY,KAAK,CAAC;YAI5D,IAAI,CAAC,kBAAkB,EAAE;gBACvB,YAAY,GAAG,YAAY,GAAG,SAAS;gBACvC,IAAI,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,sBAAsB,EAAE,EAAE;oBAChE,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,WAAW,CAAC,aAAa,EAAE,GAAG,SAAS,IAAI,CAAC;iBACjE;aACF;iBAAM;gBACL,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,WAAW,CAAC,aAAa,EAAE,KAAK,CAAC;aACtD;YAED,eAAe,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;YAEtE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE;SACtD;aAAM;YACL,eAAe,CAAC,mCAAmC,CAAC,EAAE,YAAY,EAAE,CAAC;SACtE;QAED,MAAM,MAAM,GAAG,6BAA6B,IAAI,UAAU;QAE1D,eAAe,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;QAEvD,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE;IACxC,CAAC;IAED,uCACK,eAAe,KAClB,YAAY,EAAE,IAAI,EAClB,MAAM,IACP;AACH,CAAC;AAQD,MAAM,6BAA6B,GAAG,GAAG,EAAE;IACzC,OAAO;;;;;;;;;;MAcL,EAAE;;;;;;;;;;GAUH;AACH,CAAC;AASD,MAAM,gCAAgC,GAAG,CAAC,EAAE,YAAY,EAAE,WAAW,EAAmD,EAAE,EAAE;IAC1H,OAAO;;;;;MASL,EAAE;;;;;QAKE,WAAW;QACb,CAAC,CAAC;;OAED;QACD,CAAC,CAAC,EAAE;;MAEJ,YAAY;QACZ,CAAC,CAAC;;;;;;UAWF,EAAE;;;KAGH;QACC,CAAC,CAAC,EAAE;GACP;AACH,CAAC;AAaD,MAAM,yBAAyB,GAAG,CAAC,EACjC,KAAK,EACL,YAAY,EACZ,WAAW,EAKZ,EAAE,EAAE;IACH,OAAO;;;;MAOH,EAAE;;;;oBAIY,WAAW;;MAYzB,EAAE;;;eAGO,KAAK;gBACJ,YAAY;;;sBAGN,WAAW;;;;;;;;;QAWzB,EAAE;;;MAON,EAAE;;;;MAMA,EAAE;;oBAEY,WAAW;;MAOzB,EAAE;;;mBAGW,WAAW;oBACV,YAAY;;;;;;;qBAOX,WAAW;;;;;;qBAMX,WAAW;;MAW1B,EAAE;;mBAEW,WAAW;;;;mBAIX,WAAW;;GAE3B;AACH,CAAC;;;;;;;;;;;;;;;;;;AC7X6B;AAEvB,MAAM,mBAAmB,GAAG,GAAG,EAAE;IACtC,MAAM,sBAAsB,GAAqD,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE;IAC/G,MAAM,OAAO,GAAG,IAAI,yCAAO,EAAqG;IAChI,IAAI,WAAW,GAAG,KAAK;IAEvB,MAAM,KAAK,GAAG,CAAC,KAAwB,EAAE,EAAE;;QACzC,sBAAsB,CAAC,CAAC,GAAG,SAAS;QACpC,sBAAsB,CAAC,CAAC,GAAG,SAAS;QAEpC,WAAK,CAAC,eAAe,0CAAE,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE;YACzD,WAAW,GAAG,IAAI;YAClB,sBAAsB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,sBAAsB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACjE,CAAC,CAAC;QAEF,WAAK,CAAC,eAAe,0CAAE,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE;YACtD,WAAW,GAAG,KAAK;YACnB,sBAAsB,CAAC,CAAC,GAAG,SAAS;YACpC,sBAAsB,CAAC,CAAC,GAAG,SAAS;YACpC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACvD,CAAC,CAAC;QAEF,WAAK,CAAC,eAAe,0CAAE,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE;YACzD,IAAI,WAAW,EAAE;gBACf,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;aAChE;QACH,CAAC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK;QACL,yBAAyB;YACvB,OAAO,CAAC,sBAAsB,CAAC,CAAC,KAAK,SAAS,IAAI,sBAAsB,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,sBAAsB;QAChI,CAAC;QACD,OAAO,EAAE,GAAG,EAAE;QAEd,CAAC;QACD,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE;KAC1B;AACH,CAAC;AAEM,MAAM,sBAAsB,GAAG,GAAG,EAAE;IACzC,IAAI,WAAW,GAAG,KAAK;IACvB,IAAI,KAAoC;IACxC,MAAM,OAAO,GAAG,IAAI,yCAAO,EAIxB;IACH,MAAM,aAAa,GAAG;QACpB,SAAkB;QAClB,WAAoB;KACrB;IAED,MAAM,KAAK,GAAG,CAAC,YAA+B,EAAE,EAAE;;QAChD,KAAK,GAAG,YAAY;QAEpB,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;;YAChC,kBAAY,CAAC,aAAa,0CAAE,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE;gBAC3D,WAAW,GAAG,KAAK;YAGrB,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,kBAAY,CAAC,eAAe,0CAAE,gBAAgB,CAAC,iBAAiB,EAAE,GAAG,EAAE;;YACrE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,YAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,0CAAE,YAAY,EAAE,KAAI,IAAI,EAAE,CAAC;QAChG,CAAC,CAAC;QAEF,kBAAY,CAAC,aAAa,0CAAE,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE;YAC/D,WAAW,GAAG,IAAI;QAGpB,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,EAAE;IAErB,CAAC;IAED,OAAO;QACL,KAAK;QACL,OAAO;QACP,WAAW,EAAE,GAAG,EAAE,CAAC,WAAW;QAC9B,YAAY,EAAE,GAAG,EAAE;;YACjB,MAAM,SAAS,GAAG,WAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,0CAAE,YAAY,EAAE;YACtD,IAAI,CAAC,UAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,UAAU,KAAI,SAAS,CAAC,IAAI,KAAK,MAAM,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO;gBAAE,OAAO,SAAS;YAEvG,OAAO,SAAS;QAClB,CAAC;QACD,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE;KAC1B;AACH,CAAC;;;;;;;;;;;;;;;;;;;;;;AC/F6B;AACiB;AACd;AAGe;AACD;AAG/C,MAAM,SAAS,GAAG,kBAAkB;AAE7B,MAAM,sBAAsB,GAAG,CAAC,EAAE,OAAO,EAAwB,EAAE,EAAE;IAC1E,MAAM,MAAM,GAAG,IAAI,yCAAO,EAAuB;IACjD,MAAM,OAAO,GAAG,IAAI,yCAAO,EAAW;IAOtC,IAAI,qBAAqB,GAA8G,EAAE;IACzI,MAAM,iBAAiB,GAAgB,EAAE;IAWzC,IAAI,qBAAyC;IAO7C,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE;QACtC,MAAM,wBAAwB,GAAiC,EAAE;QACjE,MAAM,sBAAsB,GAAG,SAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,eAAe,MAAK,eAAe;QAC5E,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,6DAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;QAEpE,iBAAiB,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;YACnD,MAAM,WAAW,GAAG,cAAc,KAAK,KAAK;YAC5C,IAAI,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK;YAC9C,IAAI,iBAAiB,GAAgC,MAAM;YAC3D,MAAM,oBAAoB,GAAG,UAAU,CAAC,KAAK,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,KAAK,KAAK,CAAC;YACxF,MAAM,UAAU,GAAG,KAAK,KAAK,iBAAiB,CAAC,MAAM,GAAG,CAAC;YAEzD,IAAI,OAAO,CAAC,mBAAmB,EAAE,EAAE;gBAmBjC,IAAI,CAAC,sBAAsB,IAAI,IAAI,CAAC,YAAY,IAAI,KAAK,KAAK,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC1F,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,GAAG,CAAC;iBAC/C;gBAGD,IAAI,CAAC,sBAAsB,IAAI,IAAI,CAAC,YAAY,IAAI,KAAK,KAAK,iBAAiB,CAAC,MAAM,GAAG,CAAC,IAAI,oBAAoB,EAAE;oBAClH,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,GAAG,CAAC;iBAC/C;gBAED,MAAM,2CAA2C,GAAG,oBAAoB,IAAI,UAAU,IAAI,sBAAsB;gBAEhH,IAAI,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,oBAAoB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE;oBACzE,iBAAiB,GAAG,QAAQ;oBAC5B,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,GAAG,CAAC;iBAC/C;qBAAM,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,oBAAoB,IAAI,OAAO,CAAC,KAAK,EAAE,EAAE;oBAC9E,iBAAiB,GAAG,QAAQ;oBAC5B,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,GAAG,CAAC;iBAC/C;qBAAM,IAAI,2CAA2C,EAAE;oBACtD,IAAI,OAAO,CAAC,KAAK,EAAE,EAAE;wBACnB,iBAAiB,GAAG,QAAQ;qBAC7B;yBAAM;wBACL,iBAAiB,GAAG,OAAO;qBAC5B;oBACD,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,GAAG,CAAC;iBAC/C;gBAED,IAAI,sBAAsB,IAAI,WAAW,EAAE;oBACzC,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,GAAG,CAAC;iBAC/C;aACF;YAED,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;gBACpC,YAAY;gBACZ,iBAAiB;gBACjB,cAAc,EAAE,OAAO,CAAC,mBAAmB,EAAE;oBAC3C,CAAC,CAAC,oBAAoB;wBACpB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;wBACpC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;oBACtC,CAAC,CAAC,MAAM;aACX,CAAC;YAEF,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,yBAAyB,KAAK,UAAU,EAAE;gBAClE,MAAM,uCAAuC,GAAG,oBAAoB,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,MAAM;gBAChJ,MAAM,uCAAuC,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK;gBAE3F,IAAI,OAAO,CAAC,KAAK,EAAE,EAAE;oBACnB,IAAI,CAAC,uBAAuB,CAAC;wBAC3B,GAAG,EAAE,uCAAuC;wBAC5C,IAAI,EAAE,uCAAuC;qBAC9C,CAAC;iBACH;qBAAM;oBACL,IAAI,CAAC,uBAAuB,CAAC;wBAC3B,GAAG,EAAE,uCAAuC;wBAC5C,IAAI,EAAE,uCAAuC;qBAC9C,CAAC;iBACH;gBAED,MAAM,QAAQ,GAAG,KAAK,GAAG,uCAAuC;gBAChE,MAAM,QAAQ,GAAG,MAAM,GAAG,uCAAuC;gBAEjE,wBAAwB,CAAC,IAAI,CAAC;oBAC5B,SAAS,EAAE,uCAAuC;oBAClD,OAAO,EAAE,QAAQ;oBACjB,QAAQ,EAAE,uCAAuC;oBACjD,MAAM,EAAE,QAAQ;oBAChB,MAAM;oBACN,KAAK;iBACN,CAAC;gBAEF,OAAO;oBACL,KAAK,EAAE,QAAQ;oBACf,KAAK,EAAE,QAAQ;iBAChB;aACF;YAED,IAAI,OAAO,CAAC,KAAK,EAAE,EAAE;gBAGnB,IAAI,CAAC,uBAAuB,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;aAClE;iBAAM;gBAEL,IAAI,CAAC,uBAAuB,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;aACjE;YAED,MAAM,QAAQ,GAAG,KAAK,GAAG,UAAU,CAAC,KAAK;YAEzC,wBAAwB,CAAC,IAAI,CAAC;gBAC5B,SAAS,EAAE,UAAU,CAAC,KAAK;gBAC3B,OAAO,EAAE,QAAQ;gBACjB,QAAQ,EAAE,UAAU,CAAC,KAAK;gBAC1B,MAAM,EAAE,MAAM;gBACd,MAAM;gBACN,KAAK;aACN,CAAC;YAEF,OAAO;gBACL,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,CAAC;aACT;QACH,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAE1B,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,8DAAc,CAAC,GAAG,EAAE,wBAAwB,CAAC,KAAK,CAAC,CAAC,CAAC;QAE1H,qBAAqB,GAAG,wBAAwB;QAEhD,+CAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,CAAC;QAE5E,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC;IAChC,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,gBAAoC,EAAE,EAAE;QACrD,MAAM,gBAAgB,GAAG,OAAO,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,gBAAgB;QAExG,IAAI,CAAC,gBAAgB;YAAE,OAAM;QAE7B,MAAM,uBAAuB,GAAG,iBAAiB,CAAC,OAAO,CAAC,gBAAgB,CAAC;QAE3E,IAAI,uBAAuB,KAAK,qBAAqB;YAAE,OAAM;QAE7D,qBAAqB,GAAG,uBAAuB;QAE/C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC;IACzC,CAAC;IAQD,MAAM,YAAY,GAAG,8DAAyB,CAAC,cAAc,EAAE,EAAE,EAAE,CAAC,YAA8B,EAAE,EAAE;;QACpG,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,YAAY;QAC5C,MAAM,kCAAkC,GAAG,cAAO,CAAC,cAAc,EAAE,0CAAE,kCAAkC,KAAI,CAAC;QAC5G,MAAM,cAAc,GAAG,cAAO,CAAC,WAAW,EAAE,0CAAE,eAAe,MAAK,eAAe;QACjF,MAAM,iBAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,oBAAoB,KAAK,YAAY;QAErF,iBAAiB,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,KAAK,EAAE,EAAE;YACpD,MAAM,0BAA0B,GAE9B,CAAC,KAAK,GAAG,SAAS,IAAI,CAAC,cAAc,IAAI,iBAAiB,CAAC;gBACzD,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,KAAK,GAAG,CAAC,SAAS,GAAG,kCAAkC,CAAC;YAC9D,MAAM,sBAAsB,GAAG,KAAK,GAAG,CAAC,UAAU,GAAG,kCAAkC,CAAC;YACxF,IAAI,CAAC,0BAA0B,IAAI,CAAC,sBAAsB,EAAE;gBAC1D,gBAAgB,CAAC,WAAW,EAAE;aAC/B;iBAAM;gBACL,gBAAgB,CAAC,aAAa,EAAE;aACjC;QACH,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,GAAG,GAAG,CAAC,SAA0B,EAAE,EAAE;QACzC,IAAI,OAAO,SAAS,KAAK,QAAQ;YAAE,OAAO,iBAAiB,CAAC,SAAS,CAAC;QAEtE,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC;IACpE,CAAC;IAMD,MAAM,qBAAqB,GAAG,8DAAyB,CAAC,uBAAuB,EAAE,EAAE,EAAE,CAAC,gBAAoC,EAAE,EAAE;QAC5H,MAAM,iBAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,yBAAyB;QACzE,MAAM,WAAW,GAAG,OAAO,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,gBAAgB,CAAC;QAEzH,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,WAAW,CAAC;QAE5D,IAAI,CAAC,iBAAiB,EAAE;YACtB,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;SACjF;QAoBD,OAAO,qBAAqB,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;IACxH,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAErB,MAAM,mBAAmB,GAAG,GAAG,EAAE,CAAC,qBAAqB,KAAK,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,SAAS;IAE5H,MAAM,iBAAiB,GAAG,CAAC,SAAoB,EAAE,QAAmB,EAAE,EAAE;QACtE,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC;QAE1F,IAAI,OAAO,EAAE;YACX,OAAO,OAAO;SACf;QAED,OAAO,QAAQ;IACjB,CAAC;IAED,MAAM,iBAAiB,GAAG,CAAC,SAAgC,EAAE,EAAE;QAC7D,IAAI,CAAC,SAAS;YAAE,OAAO,SAAS;QAChC,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC;QAElD,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK;IACtC,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,SAAoB,EAAE,EAAE;QACnC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC;QAEjC,SAAS,CAAC,CAAC,CAAC,2BAA2B;aACpC,IAAI,CAAC,yDAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;aACnC,SAAS,CAAC,GAAG,EAAE;YAGd,MAAM,EAAE;QACV,CAAC,CAAC;QAEJ,SAAS,CAAC,CAAC,CAAC,OAAO;aAChB,IAAI,CACH,mDAAG,CAAC,GAAG,EAAE;YACP,IAAI,SAAS,CAAC,sBAAsB,EAAE,EAAE;gBACtC,OAAO,CAAC,qBAAqB,EAAE;aAChC;QACH,CAAC,CAAC,EACF,yDAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAC9B;aACA,SAAS,EAAE;QAEd,SAAS,CAAC,IAAI,EAAE;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,iBAAiB;IAEtC,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,OAAO,iBAAiB,CAAC,MAAM;IACjC,CAAC;IAED,MAAM,wBAAwB,GAAG,GAAG,EAAE;QACpC,MAAM,IAAI,GAAG,mBAAmB,EAAE;QAClC,OAAO,IAAI,IAAI,iBAAiB,CAAC,IAAI,CAAC;IACxC,CAAC;IAED,MAAM,sBAAsB,GAAG,8DAAyB,CAAC,wBAAwB,EAAE,EAAE,EAAE,CAAC,QAA0B,EAAE,EAAE;QACpH,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACjD,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,qBAAqB,CAAC,IAAI,CAAC;YAE5E,MAAM,aAAa,GAAG,QAAQ,CAAC,CAAC,IAAI,SAAS,IAAI,QAAQ,CAAC,CAAC,GAAG,OAAO;YAErE,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,yBAAyB,KAAK,YAAY,EAAE;gBACpE,OAAO,aAAa;aACrB;iBAAM;gBACL,OAAO,aAAa,IAAI,QAAQ,CAAC,CAAC,IAAI,QAAQ,IAAI,QAAQ,CAAC,CAAC,GAAG,MAAM;aACtE;QACH,CAAC,CAAC;QAEF,IAAI,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO,iBAAiB,CAAC,CAAC,CAAC;QAElE,OAAO,YAAY;IACrB,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAErB,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACjD,MAAM,CAAC,QAAQ,EAAE;QACjB,OAAO,CAAC,QAAQ,EAAE;IACpB,CAAC;IAED,OAAO;QACL,GAAG;QACH,GAAG;QACH,MAAM;QACN,SAAS;QACT,MAAM;QACN,KAAK;QACL,YAAY;QACZ,iBAAiB;QACjB,qBAAqB;QACrB,sBAAsB;QACtB,mBAAmB;QACnB,wBAAwB;QACxB,iBAAiB;QACjB,OAAO;QACP,CAAC,EAAE;YACD,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE;YAC7B,OAAO,EAAE,OAAO,CAAC,YAAY,EAAE;SAChC;KACF;AACH,CAAC;;;;;;;;;;;;;;;AC7TD,SAAS,OAAO,CAAE,GAAG,KAAiB;IACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;QAEtB,OAAO,CAAI,GAAM,EAAE,EAAE,CAAC,GAAG;KAC1B;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;QACtB,OAAO,KAAK,CAAC,CAAC,CAAC;KAChB;IAMD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,IAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAChE,CAAC;AAIA;;;;;;;;;;;;;;;;;AChEsC;AAEhC,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAE,EAAE;IAChD,MAAM,SAAS,GAAG,qDAAe,CAAC,IAAI,CAAC;IAEvC,QAAQ,SAAS,EAAE;QACjB,KAAK,KAAK,CAAC,CAAC,OAAO,WAAW;QAC9B,KAAK,KAAK,CAAC,CAAC,OAAO,WAAW;QAC9B,KAAK,MAAM,CAAC,CAAC,OAAO,YAAY;QAChC,KAAK,KAAK,CAAC,CAAC,OAAO,YAAY;QAC/B,KAAK,MAAM,CAAC,CAAC,OAAO,YAAY;KACjC;IAED,OAAO,SAAS;AAClB,CAAC;AAEM,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAAE,EAAE;IAC9C,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO,SAAS;IAEjC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;IAE5B,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;AACvD,CAAC;;;;;;;;;;;;;;;;;;;;;ACQiC;AAY3B,MAAM,aAAa,GAAG,CAAC,OAA6C,EAA0B,EAAE;IACrG,OAAO,CACL,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,UAAU,IAAI,OAAO,IAAI,QAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,MAAK,IAAI,CAAC,YAAY,IAAI,WAAW,IAAK,OAAuB,CACxJ;AACH,CAAC;AAED,SAAS,2BAA2B,CAAE,GAAa,EAAE,MAAc,EAAE,MAAc;IAEjF,IAAI,wBAAwB,IAAI,GAAG,EAAE;QAGnC,OAAO,GAAG,CAAC,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAyC;KAC1F;SAAM,IAAI,OAAO,GAAG,CAAC,mBAAmB,KAAK,WAAW,EAAE;QACzD,OAAO,GAAG,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC;KAC/C;AACH,CAAC;AAOM,MAAM,8BAA8B,GAAG,8DAAyB,CAAC,gCAAgC,EAAE,CAAC,EAAE,CAAC,iBAAqC,EAAE,QAAkB,EAAE,EAAE;IACzK,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,iBAAiB,CAAC;QAC3C,CAAC,CAAC,iCAAiC,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC;QACrE,CAAC,CAAC,iCAAiC,CAAC,iBAAiB,EAAE,QAAQ,CAAC;IAElE,MAAM,aAAa,GAAG,aAAa,IAAI,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,aAAa;IAE9G,IAAI,OAAO,EAAE;QACX,IAAI,cAAiC;QACrC,IAAI,eAAe,GAAG,CAAC;QACvB,MAAM,KAAK,GAAG,aAAa,CAAC,WAAW,EAAE;QAEzC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YAC9C,KAAK,CAAC,kBAAkB,CAAC,SAAS,CAAC;YACnC,MAAM,KAAK,GAAG,KAAK,CAAC,cAAc,EAAE;YACpC,MAAM,WAAW,GAAG,sBAAsB,CAAC,KAAK,EAAE,QAAQ,CAAC;YAI3D,IAAI,WAAW,EAAE;gBACf,cAAc,GAAG,KAAK,CAAC,UAAU,EAAE;gBAWnC,MAAM,YAAY,GAAG,2BAA2B,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;gBAGxH,IAAI,YAAY,IAAI,gBAAgB,IAAI,YAAY,IAAI,YAAY,CAAC,cAAc,KAAK,cAAc,CAAC,cAAc,EAAE;oBACrH,eAAe,GAAG,YAAY,CAAC,WAAW;iBAC3C;gBACD,IAAI,YAAY,IAAI,YAAY,IAAI,YAAY,IAAI,YAAY,CAAC,UAAU,KAAK,cAAc,CAAC,cAAc,EAAE;oBAC7G,eAAe,GAAG,YAAY,CAAC,MAAM;iBACtC;gBACD,OAAO,IAAI;aACZ;YACD,OAAO,KAAK;QACd,CAAC,CAAC;QAEF,IAAI,cAAc,EAAE;YAClB,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE;SACxE;QAED,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE;KACpC;IAED,OAAO,SAAS;AAClB,CAAC,CAAC;AAEF,MAAM,iCAAiC,GAAG,CAAC,OAAgB,EAAE,QAAkB,EAAE,EAAE;IACjF,IAAI,gBAAqC;IACzC,MAAM,oBAAoB,GAAG,oCAAoC,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,QAAQ,CAAC;IAE5G,IAAI,oBAAoB,KAAK,QAAQ,IAAI,oBAAoB,KAAK,OAAO,EAAE;QACzE,gBAAgB,GAAG,OAAO;KAC3B;IAED,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QACxC,MAAM,eAAe,GAAG,iCAAiC,CAAC,KAAK,EAAE,QAAQ,CAAC;QAC1E,IAAI,eAAe,EAAE;YACnB,gBAAgB,GAAG,eAAe;YAElC,OAAO,IAAI;SACZ;QAED,OAAO,KAAK;IACd,CAAC,CAAC;IAEF,OAAO,gBAAgB;AACzB,CAAC;AAED,SAAS,oCAAoC,CAAE,OAAgB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAY;IAExF,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,IAAI,OAAO,CAAC,KAAK,IAAI,IAAI;QAAE,OAAO,QAAQ;IAClE,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,IAAI,OAAO,CAAC,KAAK,GAAG,IAAI,IAAI,OAAO,CAAC,KAAK,IAAI,KAAK;QAAE,OAAO,kBAAkB;IACrG,IAAI,OAAO,CAAC,IAAI,IAAI,KAAK,IAAI,OAAO,CAAC,KAAK,GAAG,KAAK;QAAE,OAAO,iBAAiB;IAC5E,IAAI,OAAO,CAAC,IAAI,GAAG,KAAK;QAAE,OAAO,OAAO;IACxC,OAAO,QAAQ;AAKjB,CAAC;AAED,SAAS,sBAAsB,CAAE,OAAoB,EAAE,QAAkB;IACvE,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;QACxC,MAAM,QAAQ,GAAG,oCAAoC,CAAC,OAAO,EAAE,QAAQ,CAAC;QAExE,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,OAAO,EAAE;YACjD,OAAO,IAAI;SACZ;QACD,OAAO,KAAK;IACd,CAAC,CAAC;AACJ,CAAC;AAEM,MAAM,gBAAgB,GAAG,CAAC,IAAU,EAAE,MAAc,EAAE,EAAE;;IAC7D,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,kBAAkB,EAAE;QAC1F,MAAM,KAAK,GAAG,UAAI,CAAC,aAAa,0CAAE,WAAW,EAAE;QAC/C,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,kBAAkB,CAAC,IAAI,CAAC;QAE/B,IAAI;YACF,IAAI,MAAM,IAAI,CAAC,MAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,SAAS,KAAI,CAAC,CAAC,EAAE;gBACrC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC;aACnC;SACF;QAAC,OAAO,CAAC,EAAE;YACV,iDAAY,CAAC,CAAC,CAAC;SAChB;QAED,OAAO,KAAK;KACb;IAED,OAAO,SAAS;AAClB,CAAC;AAEM,MAAM,cAAc,GAAG,CAAC,KAAY,EAAyB,EAAE;;IACpE,IAAI,OAAC,KAAsB,0CAAE,MAAM,MAAI,YAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,MAAkB,0CAAE,aAAa,0CAAE,WAAW,GAAE;QAC7F,MAAM,SAAS,GAAG,YAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,MAAkB,0CAAE,aAAa,0CAAE,WAAyC;QAEtG,IAAI,SAAS,CAAC,YAAY,EAAE;YAC1B,OAAO,KAAK,YAAY,SAAS,CAAC,YAAY;SAC/C;KACF;IAED,IAAI,OAAC,KAAsB,0CAAE,IAAI,MAAI,YAAC,KAAsB,0CAAE,IAAI,0CAAE,MAAM,GAAE;QAC1E,MAAM,SAAS,GAAG,MAAC,KAAsB,0CAAE,IAAkC;QAE7E,IAAI,SAAS,CAAC,YAAY,EAAE;YAC1B,OAAO,KAAK,YAAY,SAAS,CAAC,YAAY;SAC/C;KACF;IAED,OAAO,KAAK;AACd,CAAC;AAEM,MAAM,YAAY,GAAG,CAAC,KAAY,EAAuB,EAAE;;IAChE,IAAI,cAAc,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK;IAEvC,IAAI,OAAC,KAAoB,0CAAE,MAAM,MAAI,YAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,MAAkB,0CAAE,aAAa,0CAAE,WAAW,GAAE;QAC3F,MAAM,SAAS,GAAG,YAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,MAAkB,0CAAE,aAAa,0CAAE,WAAyC;QAEtG,IAAI,SAAS,CAAC,UAAU,EAAE;YACxB,OAAO,KAAK,YAAY,SAAS,CAAC,UAAU;SAC7C;KACF;IAED,IAAI,OAAC,KAAoB,0CAAE,IAAI,MAAI,YAAC,KAAoB,0CAAE,IAAI,0CAAE,MAAM,GAAE;QACtE,MAAM,SAAS,GAAG,MAAC,KAAoB,0CAAE,IAAkC;QAE3E,IAAI,SAAS,CAAC,UAAU,EAAE;YACxB,OAAO,KAAK,YAAY,SAAS,CAAC,UAAU;SAC7C;KACF;IAED,OAAO,KAAK;AACd,CAAC;AAEM,MAAM,YAAY,GAAG,CAAC,KAAY,EAAuB,EAAE;;IAChE,IAAI,OAAC,KAAoB,0CAAE,MAAM,MAAI,YAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,MAAkB,0CAAE,aAAa,0CAAE,WAAW,GAAE;QAC3F,MAAM,SAAS,GAAG,YAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,MAAkB,0CAAE,aAAa,0CAAE,WAAyC;QAEtG,IAAI,SAAS,CAAC,UAAU,EAAE;YACxB,OAAO,KAAK,YAAY,SAAS,CAAC,UAAU;SAC7C;KACF;IAED,IAAI,OAAC,KAAoB,0CAAE,IAAI,MAAI,YAAC,KAAoB,0CAAE,IAAI,0CAAE,MAAM,GAAE;QACtE,MAAM,SAAS,GAAG,MAAC,KAAoB,0CAAE,IAAkC;QAE3E,IAAI,SAAS,CAAC,UAAU,EAAE;YACxB,OAAO,KAAK,YAAY,SAAS,CAAC,UAAU;SAC7C;KACF;IAED,OAAO,KAAK;AACd,CAAC;;;;;;;;;;;;;;;AC/OM,MAAM,YAAY,GAAG,CAAC,QAAkB,EAAE,EAAE;;IACjD,MAAM,SAAS,GAAG,cAAQ,CAAC,KAAK,0CAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC;IAErE,OAAO,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnF,CAAC;;;;;;;;;;;;;;;;;;ACRD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc;AAGvC,MAAM,EAAE,GAAG,CAAC,CAAM,EAAE,CAAM,EAAW,EAAE;IAC5C,IAAI,CAAC,KAAK,CAAC,EAAE;QACX,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;KACnD;SAAM;QACL,OAAO,KAAK;KACb;AACH,CAAC;AAYM,MAAM,cAAc,GAAG,CAC5B,OAAU,EACV,OAAU,EACV,OAEC,EACQ,EAAE;IAEX,IAAI,OAAO,KAAK,OAAO,EAAE;QACvB,OAAO,IAAI;KACZ;IACD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE;QACnD,OAAO,KAAK;KACb;IACD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE;QACnD,OAAO,KAAK;KACb;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;IAElC,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE;QACjC,OAAO,KAAK;KACb;IAED,MAAM,OAAO,GAAG,OAAO,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;IAE/F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;QAE1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE;YACtE,OAAO,KAAK;SACb;KACF;IAED,OAAO,IAAI;AACb,CAAC;AAEM,MAAM,OAAO,GAAG,CAAyB,IAAS,EAAE,MAAsB,EAAE,EAAE,CACnF,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE;IACpC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;IACjC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE;IAC1C,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;IACjC,OAAO,QAAQ;AACjB,CAAC,EAAE,EAAoB,CAAC;AAEnB,MAAM,iBAAiB,GAAG,CAAC,IAAU,EAAE,EAAE;IAC9C,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE;IAE/B,OAAO,IAAI,OAAO,CAAS,OAAO,CAAC,EAAE;QACnC,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE;YAC9B,OAAO,CAAC,MAAM,CAAC,MAAgB,CAAC;QAClC,CAAC,EAAE,KAAK,CAAC;QAET,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;IAC5B,CAAC,CAAC;AACJ,CAAC;;;;;;;;;;;;;;;;;AC7EmC;AAE7B,MAAM,SAAS,GAAG,CAAsD,IAAS,EAAmC,EAAE;IAC3H,OAAO,mDAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACjB,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;aACvB,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YAC5B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAU,CAAC,EAAE;gBAC7B,uCACK,GAAG,KACN,CAAC,GAAG,CAAC,EAAE,KAAK,IACb;aACF;YAED,OAAO,GAAG;QACZ,CAAC,EAAE,EAAyB,CAAC;IACjC,CAAC,CAAC;AACJ,CAAC;;;;;;;;;;;;;;;ACjBM,MAAM,eAAe,GAAG,CAAC,GAAW,EAAE,EAAE;;IAC7C,OAAO,gBAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,0CAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,0CAAE,IAAI,EAAE,KAAI,EAAE;AAC7D,CAAC;;;;;;;;;;;ACFD;;;;;;;;;;ACAA;;;;;;UCAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;UENA;UACA;UACA;UACA","sources":["webpack://@prose-reader/core/./src/cfi.ts","webpack://@prose-reader/core/./src/constants.ts","webpack://@prose-reader/core/./src/context.ts","webpack://@prose-reader/core/./src/createReaderWithEnhancer.ts","webpack://@prose-reader/core/./src/enhancers/accessibility.ts","webpack://@prose-reader/core/./src/enhancers/chrome.ts","webpack://@prose-reader/core/./src/enhancers/composeEnhancer.ts","webpack://@prose-reader/core/./src/enhancers/fonts.ts","webpack://@prose-reader/core/./src/enhancers/hotkeys.ts","webpack://@prose-reader/core/./src/enhancers/layoutEnhancer/createMovingSafePan$.ts","webpack://@prose-reader/core/./src/enhancers/layoutEnhancer/layoutEnhancer.ts","webpack://@prose-reader/core/./src/enhancers/links.ts","webpack://@prose-reader/core/./src/enhancers/media.ts","webpack://@prose-reader/core/./src/enhancers/navigation.ts","webpack://@prose-reader/core/./src/enhancers/pagination.ts","webpack://@prose-reader/core/./src/enhancers/progression.ts","webpack://@prose-reader/core/./src/enhancers/resources/index.ts","webpack://@prose-reader/core/./src/enhancers/resources/indexedDB.ts","webpack://@prose-reader/core/./src/enhancers/resources/resourcesManager.ts","webpack://@prose-reader/core/./src/enhancers/theme.ts","webpack://@prose-reader/core/./src/enhancers/utils.ts","webpack://@prose-reader/core/./src/enhancers/webkit.ts","webpack://@prose-reader/core/./src/enhancers/zoom.ts","webpack://@prose-reader/core/./src/frames.ts","webpack://@prose-reader/core/./src/index.ts","webpack://@prose-reader/core/./src/pagination.ts","webpack://@prose-reader/core/./src/reader.ts","webpack://@prose-reader/core/./src/report.ts","webpack://@prose-reader/core/./src/selection.ts","webpack://@prose-reader/core/./src/settings.ts","webpack://@prose-reader/core/./src/spine/cfiLocator.ts","webpack://@prose-reader/core/./src/spine/createSpine.ts","webpack://@prose-reader/core/./src/spine/eventsHelper.ts","webpack://@prose-reader/core/./src/spine/locationResolver.ts","webpack://@prose-reader/core/./src/spine/navigationResolver.ts","webpack://@prose-reader/core/./src/spine/viewportNavigator/manualViewportNavigator.ts","webpack://@prose-reader/core/./src/spine/viewportNavigator/panViewportNavigator.ts","webpack://@prose-reader/core/./src/spine/viewportNavigator/scrollViewportNavigator.ts","webpack://@prose-reader/core/./src/spine/viewportNavigator/viewportNavigator.ts","webpack://@prose-reader/core/./src/spineItem/commonSpineItem.ts","webpack://@prose-reader/core/./src/spineItem/frameItem/createFrame$.ts","webpack://@prose-reader/core/./src/spineItem/frameItem/createFrameManipulator.ts","webpack://@prose-reader/core/./src/spineItem/frameItem/createHtmlPageFromResource.ts","webpack://@prose-reader/core/./src/spineItem/frameItem/frameItem.ts","webpack://@prose-reader/core/./src/spineItem/frameItem/loader.ts","webpack://@prose-reader/core/./src/spineItem/index.ts","webpack://@prose-reader/core/./src/spineItem/locationResolver.ts","webpack://@prose-reader/core/./src/spineItem/navigationResolver.ts","webpack://@prose-reader/core/./src/spineItem/prePaginatedSpineItem.ts","webpack://@prose-reader/core/./src/spineItem/reflowableSpineItem.ts","webpack://@prose-reader/core/./src/spineItem/trackers.ts","webpack://@prose-reader/core/./src/spineItemManager.ts","webpack://@prose-reader/core/./src/utils/compose.ts","webpack://@prose-reader/core/./src/utils/contentType.ts","webpack://@prose-reader/core/./src/utils/dom.ts","webpack://@prose-reader/core/./src/utils/manifest.ts","webpack://@prose-reader/core/./src/utils/objects.ts","webpack://@prose-reader/core/./src/utils/rxjs.ts","webpack://@prose-reader/core/./src/utils/url.ts","webpack://@prose-reader/core/external commonjs \"rxjs\"","webpack://@prose-reader/core/external commonjs \"rxjs/operators\"","webpack://@prose-reader/core/webpack/bootstrap","webpack://@prose-reader/core/webpack/runtime/compat get default export","webpack://@prose-reader/core/webpack/runtime/define property getters","webpack://@prose-reader/core/webpack/runtime/hasOwnProperty shorthand","webpack://@prose-reader/core/webpack/runtime/make namespace object","webpack://@prose-reader/core/webpack/before-startup","webpack://@prose-reader/core/webpack/startup","webpack://@prose-reader/core/webpack/after-startup"],"sourcesContent":["/* eslint no-useless-escape: \"off\" */\n/**\n * @see https://github.com/fread-ink/epub-cfi-resolver\n * @latest a0d7e4e39d5b4adc9150e006e0b6d7af9513ae27\n */\n'use strict'\n\nconst ELEMENT_NODE = Node.ELEMENT_NODE\nconst TEXT_NODE = Node.TEXT_NODE\nconst CDATA_SECTION_NODE = Node.CDATA_SECTION_NODE\n\nfunction cfiEscape (str: string) {\n return str.replace(/[\\[\\]\\^,();]/g, `^$&`)\n}\n\n// Get indices of all matches of regExp in str\n// if `add` is non-null, add it to the matched indices\nfunction matchAll (str: string, regExp: any, add: any) {\n add = add || 0\n const matches = []\n let offset = 0\n let m\n do {\n m = str.match(regExp)\n if (!m) break\n matches.push(m.index + add)\n // @ts-ignore\n offset += m.index + m.length\n // @ts-ignore\n str = str.slice(m.index + m.length)\n } while (offset < str.length)\n\n return matches\n}\n\n// Get the number in a that has the smallest diff to n\nfunction closest (a: any[], n: number) {\n let minDiff\n let closest\n let i, diff\n for (i = 0; i < a.length; i++) {\n diff = Math.abs(a[i] - n)\n // @ts-ignore\n if (!i || diff < minDiff) {\n diff = minDiff\n closest = a[i]\n }\n }\n return closest\n}\n\n// Given a set of nodes that are all children\n// and a reference to one of those nodes\n// calculate the count/index of the node\n// according to the CFI spec.\n// Also re-calculate offset if supplied and relevant\nfunction calcSiblingCount (nodes: globalThis.NodeListOf<globalThis.ChildNode>, n: number, offset: number) {\n let count = 0\n let lastWasElement\n let prevOffset = 0\n let firstNode = true\n let i, node\n for (i = 0; i < nodes.length; i++) {\n node = nodes[i]\n // @ts-ignore\n if (node.nodeType === ELEMENT_NODE) {\n if (lastWasElement || firstNode) {\n count += 2\n firstNode = false\n } else {\n count++\n }\n\n // @ts-ignore\n if (n === node) {\n // @ts-ignore\n if (node.tagName.toLowerCase() === `img`) {\n return { count, offset }\n } else {\n return { count }\n }\n }\n prevOffset = 0\n lastWasElement = true\n // @ts-ignore\n } else if (node.nodeType === TEXT_NODE ||\n // @ts-ignore\n node.nodeType === CDATA_SECTION_NODE) {\n if (lastWasElement || firstNode) {\n count++\n firstNode = false\n }\n\n // @ts-ignore\n if (n === node) {\n return { count, offset: offset + prevOffset }\n }\n\n // @ts-ignore\n prevOffset += node.textContent.length\n lastWasElement = false\n } else {\n continue\n }\n }\n throw new Error(`The specified node was not found in the array of siblings`)\n}\n\nfunction compareTemporal (a: number, b: number) {\n const isA = (typeof a === `number`)\n const isB = (typeof b === `number`)\n\n if (!isA && !isB) return 0\n if (!isA && isB) return -1\n if (isA && !isB) return 1\n\n return (a || 0.0) - (b || 0.0)\n}\n\nfunction compareSpatial (a: any, b: any) {\n if (!a && !b) return 0\n if (!a && b) return -1\n if (a && !b) return 1\n\n const diff = (a.y || 0) - (b.y || 0)\n if (diff) return diff\n\n return (a.x || 0) - (b.x || 0)\n}\n\nclass CFI {\n isRange: boolean = false\n parts: {}[]\n opts: {}\n cfi: string\n\n constructor (str: string, opts: {}) {\n this.opts = Object.assign({\n // If CFI is a Simple Range, pretend it isn't\n // by parsing only the start of the range\n flattenRange: false,\n // Strip temporal, spatial, offset and textLocationAssertion\n // from places where they don't make sense\n stricter: true\n }, opts || {})\n\n this.cfi = str\n this.parts = []\n const isCFI = /^epubcfi\\((.*)\\)$/\n\n str = str.trim()\n const m = str.match(isCFI)\n if (!m) throw new Error(`Not a valid CFI`)\n if (m.length < 2) return // Empty CFI\n\n str = m[1] || ``\n\n let parsed, offset, newDoc\n let subParts = []\n let sawComma = 0\n while (str.length) {\n ({ parsed, offset, newDoc } = this.parse(str))\n if (!parsed || offset === null) throw new Error(`Parsing failed`)\n if (sawComma && newDoc) throw new Error(`CFI is a range that spans multiple documents. This is not allowed`)\n\n subParts.push(parsed)\n\n // Handle end of string\n if (newDoc || str.length - offset <= 0) {\n // Handle end if this was a range\n if (sawComma === 2) {\n // @ts-ignore\n this.to = subParts\n } else { // not a range\n this.parts.push(subParts)\n }\n subParts = []\n }\n\n str = str.slice(offset)\n\n // Handle Simple Ranges\n if (str[0] === `,`) {\n if (sawComma === 0) {\n if (subParts.length) {\n this.parts.push(subParts)\n }\n subParts = []\n } else if (sawComma === 1) {\n if (subParts.length) {\n // @ts-ignore\n this.from = subParts\n }\n subParts = []\n }\n str = str.slice(1)\n sawComma++\n }\n }\n // @ts-ignore\n if (this.from && this.from.length) {\n // @ts-ignore\n if (this.opts.flattenRange || !this.to || !this.to.length) {\n // @ts-ignore\n this.parts = this.parts.concat(this.from)\n // @ts-ignore\n delete this.from\n // @ts-ignore\n delete this.to\n } else {\n this.isRange = true\n }\n }\n // @ts-ignore\n if (this.opts.stricter) {\n // @ts-ignore\n this.removeIllegalOpts()\n }\n }\n\n removeIllegalOpts (parts: any[]) {\n if (!parts) {\n // @ts-ignore\n if (this.from) {\n // @ts-ignore\n this.removeIllegalOpts(this.from)\n // @ts-ignore\n if (!this.to) return\n // @ts-ignore\n parts = this.to\n } else {\n parts = this.parts\n }\n }\n\n let i, j, part, subpart\n for (i = 0; i < parts.length; i++) {\n part = parts[i]\n for (j = 0; j < part.length - 1; j++) {\n subpart = part[j]\n delete subpart.temporal\n delete subpart.spatial\n delete subpart.offset\n delete subpart.textLocationAssertion\n }\n }\n }\n\n static generatePart (node: Element | Node, offset?: number, extra?: {}) {\n /* eslint-disable-next-line no-void */\n void (extra)\n let cfi = ``\n let o\n while (node.parentNode) {\n // @ts-ignore\n o = calcSiblingCount(node.parentNode.childNodes, node, offset)\n if (!cfi && o.offset) cfi = `:` + o.offset\n\n // @ts-ignore\n cfi = `/` + o.count + ((node.id) ? `[` + cfiEscape(node.id) + `]` : ``) + cfi\n\n // debugger\n node = node.parentNode\n }\n\n return cfi\n }\n\n static generate (node: Node, offset?: number, extra?: {}) {\n let cfi\n\n if (Array.isArray(node)) {\n const strs = []\n for (const o of node) {\n strs.push(this.generatePart(o.node, o.offset, extra))\n }\n cfi = strs.join(`!`)\n } else {\n cfi = this.generatePart(node, offset, extra)\n }\n\n if (extra) cfi += extra\n\n return `epubcfi(` + cfi + `)`\n }\n\n static toParsed (cfi: any) {\n if (typeof cfi === `string`) {\n // cif = new this(cfi)\n }\n if (cfi.isRange) {\n return cfi.getFrom()\n } else {\n return cfi.get()\n }\n }\n\n // Takes two CFI paths and compares them\n static comparePath (a: any[], b: any[]) {\n const max = Math.max(a.length, b.length)\n\n let i, cA, cB, diff\n for (i = 0; i < max; i++) {\n cA = a[i]\n cB = b[i]\n if (!cA) return -1\n if (!cB) return 1\n\n diff = this.compareParts(cA, cB)\n if (diff) return diff\n }\n return 0\n }\n\n // Sort an array of CFI objects\n static sort (a: any) {\n // @ts-ignore\n a.sort((a, b) => {\n return this.compare(a, b)\n })\n }\n\n // Takes two CFI objects and compares them.\n static compare (a: any, b: any) {\n let oA = a.get()\n let oB = b.get()\n if (a.isRange || b.isRange) {\n if (a.isRange && b.isRange) {\n const diff = this.comparePath(oA.from, oB.from)\n if (diff) return diff\n return this.comparePath(oA.to, oB.to)\n }\n if (a.isRange) oA = oA.from\n if (b.isRange) oB = oB.from\n\n return this.comparePath(oA, oB)\n } else { // neither a nor b is a range\n return this.comparePath(oA, oB)\n }\n }\n\n // Takes two parsed path parts (assuming path is split on '!') and compares them.\n static compareParts (a: any, b: any) {\n const max = Math.max(a.length, b.length)\n\n let i, cA, cB, diff\n for (i = 0; i < max; i++) {\n cA = a[i]\n cB = b[i]\n if (!cA) return -1\n if (!cB) return 1\n\n diff = cA.nodeIndex - cB.nodeIndex\n if (diff) return diff\n\n // The paths must be equal if the \"before the first node\" syntax is used\n // and this must be the last subpart (assuming a valid CFI)\n if (cA.nodeIndex === 0) {\n return 0\n }\n\n // Don't bother comparing offsets, temporals or spatials\n // unless we're on the last element, since they're not\n // supposed to be on elements other than the last\n if (i < max - 1) continue\n\n // Only compare spatials or temporals for element nodes\n if (cA.nodeIndex % 2 === 0) {\n diff = compareTemporal(cA.temporal, cB.temporal)\n if (diff) return diff\n\n diff = compareSpatial(cA.spatial, cB.spatial)\n if (diff) return diff\n }\n\n diff = (cA.offset || 0) - (cB.offset || 0)\n if (diff) return diff\n }\n return 0\n }\n\n decodeEntities (dom: Document, str: string) {\n try {\n const el = dom.createElement(`textarea`)\n el.innerHTML = str\n return el.value || ``\n } catch (err) {\n // TODO fall back to simpler decode?\n // e.g. regex match for stuff like &#160; and &nbsp;\n return str\n }\n }\n\n // decode HTML/XML entities and compute length\n trueLength (dom: Document, str: string) {\n return this.decodeEntities(dom, str).length\n }\n\n getFrom () {\n if (!this.isRange) throw new Error(`Trying to get beginning of non-range CFI`)\n // @ts-ignore\n if (!this.from) {\n return this.deepClone(this.parts)\n }\n const parts = this.deepClone(this.parts)\n // @ts-ignore\n parts[parts.length - 1] = parts[parts.length - 1].concat(this.from)\n return parts\n }\n\n getTo () {\n if (!this.isRange) throw new Error(`Trying to get end of non-range CFI`)\n const parts = this.deepClone(this.parts)\n // @ts-ignore\n parts[parts.length - 1] = parts[parts.length - 1].concat(this.to)\n return parts\n }\n\n get () {\n if (this.isRange) {\n return {\n from: this.getFrom(),\n to: this.getTo(),\n isRange: true\n }\n }\n return this.deepClone(this.parts)\n }\n\n parseSideBias (o: any, loc: any) {\n if (!loc) return\n const m = loc.trim().match(/^(.*);s=([ba])$/)\n if (!m || m.length < 3) {\n if (typeof o.textLocationAssertion === `object`) {\n o.textLocationAssertion.post = loc\n } else {\n o.textLocationAssertion = loc\n }\n return\n }\n if (m[1]) {\n if (typeof o.textLocationAssertion === `object`) {\n o.textLocationAssertion.post = m[1]\n } else {\n o.textLocationAssertion = m[1]\n }\n }\n\n if (m[2] === `a`) {\n o.sideBias = `after`\n } else {\n o.sideBias = `before`\n }\n }\n\n parseSpatialRange (range: any) {\n if (!range) return undefined\n const m = range.trim().match(/^([\\d\\.]+):([\\d\\.]+)$/)\n if (!m || m.length < 3) return undefined\n const o = {\n x: parseInt(m[1]),\n y: parseInt(m[2])\n }\n if (typeof o.x !== `number` || typeof o.y !== `number`) {\n return undefined\n }\n return o\n }\n\n parse (cfi: any) {\n const o = {}\n const isNumber = /[\\d]/\n let f\n let state\n let prevState\n let cur, escape\n let seenColon = false\n let seenSlash = false\n let i\n for (i = 0; i <= cfi.length; i++) {\n if (i < cfi.length) {\n cur = cfi[i]\n } else {\n cur = ``\n }\n if (cur === `^` && !escape) {\n escape = true\n continue\n }\n\n if (state === `/`) {\n if (cur.match(isNumber)) {\n if (!f) {\n f = cur\n } else {\n f += cur\n }\n escape = false\n continue\n } else {\n if (f) {\n // @ts-ignore\n o.nodeIndex = parseInt(f)\n f = null\n }\n prevState = state\n state = null\n }\n }\n\n if (state === `:`) {\n if (cur.match(isNumber)) {\n if (!f) {\n f = cur\n } else {\n f += cur\n }\n escape = false\n continue\n } else {\n if (f) {\n // @ts-ignore\n o.offset = parseInt(f)\n f = null\n }\n prevState = state\n state = null\n }\n }\n\n if (state === `@`) {\n let done = false\n if (cur.match(isNumber) || cur === `.` || cur === `:`) {\n if (cur === `:`) {\n if (!seenColon) {\n seenColon = true\n } else {\n done = true\n }\n }\n } else {\n done = true\n }\n if (!done) {\n if (!f) {\n f = cur\n } else {\n f += cur\n }\n escape = false\n continue\n } else {\n prevState = state\n state = null\n // @ts-ignore\n if (f && seenColon) o.spatial = this.parseSpatialRange(f)\n f = null\n }\n }\n\n if (state === `~`) {\n if (cur.match(isNumber) || cur === `.`) {\n if (!f) {\n f = cur\n } else {\n f += cur\n }\n escape = false\n continue\n } else {\n if (f) {\n // @ts-ignore\n o.temporal = parseFloat(f)\n }\n prevState = state\n state = null\n f = null\n }\n }\n\n if (!state) {\n if (cur === `!`) {\n i++\n state = cur\n break\n }\n\n if (cur === `,`) {\n break\n }\n\n if (cur === `/`) {\n if (seenSlash) {\n break\n } else {\n seenSlash = true\n prevState = state\n state = cur\n escape = false\n continue\n }\n }\n\n if (cur === `:` || cur === `~` || cur === `@`) {\n // @ts-ignore\n if (this.opts.stricter) {\n // We've already had a temporal or spatial indicator\n // and offset does not make sense and the same time\n // @ts-ignore\n if (cur === `:` && (typeof o.temporal !== `undefined` || typeof o.spatial !== `undefined`)) {\n break\n }\n // We've already had an offset\n // and temporal or spatial do not make sense at the same time\n // @ts-ignore\n if ((cur === `~` || cur === `@`) && (typeof o.offset !== `undefined`)) {\n break\n }\n }\n prevState = state\n state = cur\n escape = false\n seenColon = false // only relevant for '@'\n continue\n }\n\n if (cur === `[` && !escape && prevState === `:`) {\n prevState = state\n state = `[`\n escape = false\n continue\n }\n\n if (cur === `[` && !escape && prevState === `/`) {\n prevState = state\n state = `nodeID`\n escape = false\n continue\n }\n }\n\n if (state === `[`) {\n if (cur === `]` && !escape) {\n prevState = state\n state = null\n this.parseSideBias(o, f)\n f = null\n } else if (cur === `,` && !escape) {\n // @ts-ignore\n o.textLocationAssertion = {}\n if (f) {\n // @ts-ignore\n o.textLocationAssertion.pre = f\n }\n f = null\n } else {\n if (!f) {\n f = cur\n } else {\n f += cur\n }\n }\n escape = false\n continue\n }\n\n if (state === `nodeID`) {\n if (cur === `]` && !escape) {\n prevState = state\n state = null\n // @ts-ignore\n o.nodeID = f\n f = null\n } else {\n if (!f) {\n f = cur\n } else {\n f += cur\n }\n }\n escape = false\n continue\n }\n\n escape = false\n }\n\n // @ts-ignore\n if (!o.nodeIndex && o.nodeIndex !== 0) throw new Error(`Missing child node index in CFI`)\n\n return { parsed: o, offset: i, newDoc: (state === `!`) }\n }\n\n // The CFI counts child nodes differently from the DOM\n // Retrieve the child of parentNode at the specified index\n // according to the CFI standard way of counting\n getChildNodeByCFIIndex (dom: Document, parentNode: Element, index: number, offset: number) {\n // console.log(`getChildNodeByCFIIndex`, { parentNode, index, offset })\n const children = parentNode.childNodes\n if (!children.length) return { node: parentNode, offset: 0 }\n\n // index is pointing to the virtual node before the first node\n // as defined in the CFI spec\n if (index <= 0) {\n return { node: children[0], relativeToNode: `before`, offset: 0 }\n }\n\n let cfiCount = 0\n let lastChild\n let i, child\n\n // console.log(children, children.length)\n for (i = 0; i < children.length; i++) {\n child = children[i]\n // @ts-ignore\n switch (child.nodeType) {\n case ELEMENT_NODE:\n\n // If the previous node was also an element node\n // then we have to pretend there was a text node in between\n // the current and previous nodes (according to the CFI spec)\n // so we increment cfiCount by two\n if (cfiCount % 2 === 0) {\n cfiCount += 2\n if (cfiCount >= index) {\n // @ts-ignore\n if (child.tagName.toLowerCase() === `img` && offset) {\n return { node: child, offset }\n }\n return { node: child, offset: 0 }\n }\n } else { // Previous node was a text node\n cfiCount += 1\n if (cfiCount === index) {\n // @ts-ignore\n if (child.tagName.toLowerCase() === `img` && offset) {\n return { node: child, offset }\n }\n\n return { node: child, offset: 0 }\n\n // This happens when offset into the previous text node was greater\n // than the number of characters in that text node\n // So we return a position at the end of the previous text node\n } else if (cfiCount > index) {\n if (!lastChild) {\n return { node: parentNode, offset: 0 }\n }\n // @ts-ignore\n return { node: lastChild, offset: this.trueLength(dom, lastChild.textContent) }\n }\n }\n lastChild = child\n break\n case TEXT_NODE:\n case CDATA_SECTION_NODE:\n // console.log('TEXT')\n // If this is the first node or the previous node was an element node\n if (cfiCount === 0 || cfiCount % 2 === 0) {\n cfiCount += 1\n } else {\n // If previous node was a text node then they should be combined\n // so we count them as one, meaning we don't increment the count\n }\n\n if (cfiCount === index) {\n // If offset is greater than the length of the current text node\n // then we assume that the next node will also be a text node\n // and that we'll be combining them with the current node\n // @ts-ignore\n const trueLength = this.trueLength(dom, child.textContent)\n\n if (offset >= trueLength) {\n offset -= trueLength\n } else {\n return { node: child, offset: offset }\n }\n }\n lastChild = child\n break\n default:\n continue\n }\n }\n\n // console.log(lastChild, index, cfiCount)\n\n // index is pointing to the virtual node after the last child\n // as defined in the CFI spec\n if (index > cfiCount) {\n const o = { relativeToNode: `after`, offset: 0 }\n if (!lastChild) {\n // @ts-ignore\n o.node = parentNode\n } else {\n // @ts-ignore\n o.node = lastChild\n }\n // @ts-ignore\n if (this.isTextNode(o.node)) {\n // @ts-ignore\n o.offset = this.trueLength(dom, o.node.textContent.length)\n }\n return o\n }\n }\n\n isTextNode (node: Element) {\n if (!node) return false\n if (node.nodeType === TEXT_NODE || node.nodeType === CDATA_SECTION_NODE) {\n return true\n }\n return false\n }\n\n // Use a Text Location Assertion to correct and offset\n correctOffset (dom: Document, node: Element, offset: number, assertion: any) {\n let curNode = node\n let matchStr: string | undefined\n\n if (typeof assertion === `string`) {\n matchStr = this.decodeEntities(dom, assertion)\n } else {\n assertion.pre = this.decodeEntities(dom, assertion.pre)\n assertion.post = this.decodeEntities(dom, assertion.post)\n matchStr = assertion.pre + `.` + assertion.post\n }\n\n if (!(this.isTextNode(node))) {\n return { node, offset: 0 }\n }\n\n // @ts-ignore\n while (this.isTextNode(curNode.previousSibling)) {\n // @ts-ignore\n curNode = curNode.previousSibling\n }\n\n const startNode = curNode\n let str\n const nodeLengths = []\n let txt = ``\n let i = 0\n while (this.isTextNode(curNode)) {\n // @ts-ignore\n str = this.decodeEntities(dom, curNode.textContent)\n nodeLengths[i] = str.length\n txt += str\n\n if (!curNode.nextSibling) break\n // @ts-ignore\n curNode = curNode.nextSibling\n i++\n }\n\n // Find all matches to the Text Location Assertion\n const matchOffset = (assertion.pre) ? assertion.pre.length : 0\n const m = matchAll(txt, new RegExp(matchStr), matchOffset)\n if (!m.length) return { node, offset }\n\n // Get the match that has the closest offset to the existing offset\n let newOffset = closest(m, offset)\n\n if (curNode === node && newOffset === offset) {\n return { node, offset }\n }\n\n i = 0\n curNode = startNode\n // @ts-ignore\n while (newOffset >= nodeLengths[i]) {\n // @ts-ignore\n newOffset -= nodeLengths[i]\n if (newOffset < 0) return { node, offset }\n\n const nodeOffsets = [] // added because original code has nodeOffsets undefined. @see https://github.com/fread-ink/epub-cfi-resolver/blob/master/index.js#L826\n\n if (!curNode.nextSibling || i + 1 >= nodeOffsets.length) return { node, offset }\n i++\n // @ts-ignore\n curNode = curNode.nextSibling\n }\n\n return { node: curNode, offset: newOffset }\n }\n\n resolveNode (index: number, subparts: { nodeIndex: number, nodeID?: string, offset?: number }[], dom: Document, opts: {}) {\n opts = Object.assign({}, opts || {})\n if (!dom) throw new Error(`Missing DOM argument`)\n\n // Traverse backwards until a subpart with a valid ID is found\n // or the first subpart is reached\n let startNode\n if (index === 0) {\n startNode = dom.querySelector(`package`)\n }\n\n if (!startNode) {\n for (const n of dom.childNodes) {\n if (n.nodeType === ELEMENT_NODE) {\n // if (n.nodeType === Node.DOCUMENT_NODE) {\n startNode = n\n break\n }\n }\n }\n\n // custom\n startNode = dom\n\n // debugger\n if (!startNode) throw new Error(`Document incompatible with CFIs`)\n\n let node = startNode\n let startFrom = 0\n let i\n let subpart: typeof subparts[number] | undefined\n for (i = subparts.length - 1; i >= 0; i--) {\n subpart = subparts[i]\n // @ts-ignore\n if (!opts.ignoreIDs && subpart.nodeID && (node = dom.getElementById(subpart.nodeID))) {\n startFrom = i + 1\n break\n }\n }\n\n // console.log(startNode, startFrom)\n\n if (!node) {\n node = startNode\n }\n\n let o = { node, offset: 0 }\n\n let nodeIndex\n for (i = startFrom; i < subparts.length; i++) {\n subpart = subparts[i]\n\n if (subpart) {\n // console.log(o, dom, o.node, subpart.nodeIndex, subpart.offset)\n // @ts-ignore\n o = this.getChildNodeByCFIIndex(dom, o.node, subpart.nodeIndex, subpart.offset)\n\n // @ts-ignore\n if (subpart.textLocationAssertion) {\n // console.log(subparts, subpart, o)\n // @ts-ignore\n o = this.correctOffset(dom, o.node, subpart.offset, subpart.textLocationAssertion)\n }\n }\n }\n\n return o\n }\n\n // Each part of a CFI (as separated by '!')\n // references a separate HTML/XHTML/XML document.\n // This function takes an index specifying the part\n // of the CFI and the appropriate Document or XMLDocument\n // that is referenced by the specified part of the CFI\n // and returns the URI for the document referenced by\n // the next part of the CFI\n // If the opt `ignoreIDs` is true then IDs\n // will not be used while resolving\n resolveURI (index: number, dom: Document, opts: { ignoreIDs?: boolean }) {\n opts = opts || {}\n if (index < 0 || index > this.parts.length - 2) {\n throw new Error(`index is out of bounds`)\n }\n\n const subparts = this.parts[index]\n if (!subparts) throw new Error(`Missing CFI part for index: ` + index)\n\n // @ts-ignore\n const o = this.resolveNode(index, subparts, dom, opts)\n // debugger\n let node = o.node\n\n // @ts-ignore\n const tagName = node.tagName.toLowerCase()\n if (tagName === `itemref` &&\n // @ts-ignore\n node.parentNode.tagName.toLowerCase() === `spine`) {\n // @ts-ignore\n const idref = node.getAttribute(`idref`)\n if (!idref) throw new Error(`Referenced node had not 'idref' attribute`)\n // @ts-ignore\n node = dom.getElementById(idref)\n if (!node) throw new Error(`Specified node is missing from manifest`)\n // @ts-ignore\n const href = node.getAttribute(`href`)\n if (!href) throw new Error(`Manifest item is missing href attribute`)\n\n return href\n }\n\n if (tagName === `iframe` || tagName === `embed`) {\n // @ts-ignore\n const src = node.getAttribute(`src`)\n if (!src) throw new Error(tagName + ` element is missing 'src' attribute`)\n return src\n }\n\n if (tagName === `object`) {\n // @ts-ignore\n const data = node.getAttribute(`data`)\n if (!data) throw new Error(tagName + ` element is missing 'data' attribute`)\n return data\n }\n\n if (tagName === `image` || tagName === `use`) {\n // @ts-ignore\n const href = node.getAttribute(`xlink:href`)\n if (!href) throw new Error(tagName + ` element is missing 'xlink:href' attribute`)\n return href\n }\n\n throw new Error(`No URI found`)\n }\n\n deepClone (o: any) {\n return JSON.parse(JSON.stringify(o))\n }\n\n resolveLocation (dom: Document, parts: {}[]) {\n const index = parts.length - 1\n const subparts = parts[index]\n if (!subparts) throw new Error(`Missing CFI part for index: ` + index)\n\n // @ts-ignore\n const o = this.resolveNode(index, subparts, dom)\n\n // @ts-ignore\n const lastPart = this.deepClone(subparts[subparts.length - 1])\n\n delete lastPart.nodeIndex\n // @ts-ignore\n if (!lastPart.offset) delete o.offset\n\n return { ...lastPart, ...o }\n }\n\n // Takes the Document or XMLDocument for the final\n // document referenced by the CFI\n // and returns the node and offset into that node\n resolveLast (dom: Document, opts: {}): string | {} {\n opts = Object.assign({\n range: false\n }, opts || {})\n\n if (!this.isRange) {\n return this.resolveLocation(dom, this.parts)\n }\n\n // @ts-ignore\n if (opts.range) {\n const range = dom.createRange()\n const from = this.getFrom()\n if (from.relativeToNode === `before`) {\n // @ts-ignore\n range.setStartBefore(from.node, from.offset)\n } else if (from.relativeToNode === `after`) {\n // @ts-ignore\n range.setStartAfter(from.node, from.offset)\n } else {\n range.setStart(from.node, from.offset)\n }\n\n const to = this.getTo()\n if (to.relativeToNode === `before`) {\n // @ts-ignore\n range.setEndBefore(to.node, to.offset)\n } else if (to.relativeToNode === `after`) {\n // @ts-ignore\n range.setEndAfter(to.node, to.offset)\n } else {\n range.setEnd(to.node, to.offset)\n }\n\n return range\n }\n\n return {\n from: this.resolveLocation(dom, this.getFrom()),\n to: this.resolveLocation(dom, this.getTo()),\n isRange: true\n }\n }\n\n resolve (doc: Document, opts: {}): { node: Node, offset?: number } | { node?: undefined, offset?: number } {\n // @ts-ignore\n return this.resolveLast(doc, opts)\n }\n}\n\nexport {\n CFI\n}\n\nexport const extractProseMetadataFromCfi = (cfi: string): {\n cleanedCfi: string,\n itemId?: string\n offset?: number\n} => {\n const [itemId] = cfi\n .match(/\\|(\\[prose\\~anchor[^\\]]*\\])+/ig)\n ?.map(s => s.replace(/\\|\\[prose\\~anchor\\~/, ``)\n .replace(/\\]/, ``)) || []\n const [offset] = cfi\n .match(/\\|(\\[prose\\~offset[^\\]]*\\])+/ig)\n ?.map(s => s.replace(/\\|\\[prose\\~offset\\~/, ``)\n .replace(/\\]/, ``)) || []\n const cleanedCfi = cfi.replace(/\\|(\\[prose\\~[^\\]]*\\~[^\\]]*\\])+/ig, ``)\n const foundOffset = parseInt(offset || ``)\n\n return {\n cleanedCfi,\n itemId: itemId ? decodeURIComponent(itemId) : itemId,\n offset: isNaN(foundOffset) ? undefined : foundOffset\n }\n}\n","export const __UNSAFE_REFERENCE_ORIGINAL_IFRAME_EVENT_KEY = `__UNSAFE_REFERENCE_ORIGINAL_IFRAME_EVENT`\nexport const PROSE_READER_NAMESPACE = `@prose-reader/core`\nexport const VIEWPORT_ADJUSTMENT_THROTTLE = 0\nexport const PAGINATION_UPDATE_AFTER_VIEWPORT_ADJUSTMENT_DEBOUNCE = 200\nexport const ITEM_EXTENSION_VALID_FOR_FRAME_SRC = [`.xhtml`, `.html`, `.htm`]\n","import { BehaviorSubject, Subject } from \"rxjs\"\nimport { distinctUntilChanged, takeUntil, tap, skip } from \"rxjs/operators\"\nimport { LoadOptions } from \"./types\"\nimport { Manifest } from \"@prose-reader/shared\"\nimport { createSettings } from \"./settings\"\n\nexport type ContextObservableEvents = {}\n\nexport const createContext = (initialSettings: Parameters<typeof createSettings>[0]) => {\n let manifest: Manifest | undefined\n let loadOptions: LoadOptions | undefined\n const hasVerticalWritingSubject$ = new BehaviorSubject(false)\n const loadSubject$ = new Subject<Manifest>()\n const visibleAreaRect = {\n width: 0,\n height: 0,\n x: 0,\n y: 0\n }\n const horizontalMargin = 24\n const verticalMargin = 20\n const marginTop = 0\n const marginBottom = 0\n const destroy$ = new Subject<void>()\n const settings = createSettings(initialSettings)\n\n /**\n * Global spread behavior\n * @see http://idpf.org/epub/fxl/#property-spread\n * @todo user setting\n */\n const shouldDisplaySpread = () => {\n const { height, width } = visibleAreaRect\n const isLandscape = width > height\n\n if (settings.getSettings().forceSinglePageMode) return false\n\n /**\n * For now we don't support spread for reflowable & scrollable content since\n * two items could have different height, resulting in weird stuff.\n */\n if (manifest?.renditionFlow === `scrolled-continuous`) return false\n\n // portrait only\n if (!isLandscape && manifest?.renditionSpread === `portrait`) {\n return true\n }\n\n // default auto behavior\n return (\n isLandscape &&\n (\n manifest?.renditionSpread === undefined ||\n manifest?.renditionSpread === `auto` ||\n manifest?.renditionSpread === `landscape` ||\n manifest?.renditionSpread === `both`\n )\n )\n }\n\n const load = (newManifest: Manifest, newLoadOptions: LoadOptions) => {\n manifest = newManifest\n loadOptions = newLoadOptions\n\n settings.recompute({ manifest, hasVerticalWritingSubject: hasVerticalWritingSubject$.value })\n\n loadSubject$.next(newManifest)\n }\n\n /**\n * RTL only makes sense for horizontal scrolling\n */\n const isRTL = () => {\n return manifest?.readingDirection === `rtl`\n }\n\n const setHasVerticalWriting = () => hasVerticalWritingSubject$.next(true)\n\n /**\n * Some behavior may trigger settings to change\n */\n hasVerticalWritingSubject$\n .pipe(\n skip(1),\n distinctUntilChanged(),\n tap(() => {\n settings.recompute({ manifest, hasVerticalWritingSubject: hasVerticalWritingSubject$.value })\n }),\n takeUntil(destroy$)\n )\n .subscribe()\n\n const destroy = () => {\n settings.destroy()\n loadSubject$.complete()\n destroy$.next()\n destroy$.complete()\n hasVerticalWritingSubject$.complete()\n }\n\n return {\n load,\n isRTL,\n areAllItemsPrePaginated: () => areAllItemsPrePaginated(manifest),\n destroy,\n getLoadOptions: () => loadOptions,\n getCalculatedInnerMargin: () => 0,\n getVisibleAreaRect: () => visibleAreaRect,\n shouldDisplaySpread,\n setHasVerticalWriting,\n setVisibleAreaRect: (\n x: number,\n y: number,\n width: number,\n height: number\n ) => {\n // visibleAreaRect.width = width - horizontalMargin * 2\n visibleAreaRect.width = width\n visibleAreaRect.height = height - marginTop - marginBottom\n visibleAreaRect.x = x\n visibleAreaRect.y = y\n\n // if (this.useChromiumRubyBugSafeInnerMargin) {\n // this.visibleAreaRect.height =\n // this.visibleAreaRect.height - this.getCalculatedInnerMargin()\n // }\n },\n getManifest: () => manifest,\n getReadingDirection: () => manifest?.readingDirection,\n getPageSize: () => {\n return {\n width: shouldDisplaySpread()\n ? visibleAreaRect.width / 2\n : visibleAreaRect.width,\n height: visibleAreaRect.height\n }\n },\n getSettings: settings.getSettings,\n setSettings: (data: Parameters<typeof settings.setSettings>[0]) => settings.setSettings(data, {\n hasVerticalWritingSubject: hasVerticalWritingSubject$.value,\n manifest\n }),\n $: {\n hasVerticalWriting$: hasVerticalWritingSubject$\n .asObservable()\n .pipe(distinctUntilChanged()),\n destroy$: destroy$\n .asObservable(),\n settings$: settings.$.settings$,\n load$: loadSubject$\n .asObservable()\n }\n }\n}\n\nexport type Context = ReturnType<typeof createContext>\n\nconst areAllItemsPrePaginated = (manifest: Manifest | undefined) => !manifest?.spineItems.some(item => item.renditionLayout === `reflowable`)\n","import { chromeEnhancer } from './enhancers/chrome'\nimport { fontsEnhancer } from './enhancers/fonts'\nimport { hotkeysEnhancer } from './enhancers/hotkeys'\nimport { layoutEnhancer } from './enhancers/layoutEnhancer/layoutEnhancer'\nimport { linksEnhancer } from './enhancers/links'\nimport { navigationEnhancer } from './enhancers/navigation'\nimport { paginationEnhancer } from './enhancers/pagination'\nimport { themeEnhancer } from './enhancers/theme'\nimport { ComposeEnhancer, composeEnhancer } from './enhancers/composeEnhancer'\nimport { Enhancer } from './enhancers/types'\nimport { zoomEnhancer } from './enhancers/zoom'\nimport { createReader as createInternalReader, Reader as ReaderPublicApi } from './reader'\nimport { utilsEnhancer } from './enhancers/utils'\nimport { resourcesEnhancer } from './enhancers/resources'\nimport { mediaEnhancer } from './enhancers/media'\nimport { progressionEnhancer } from './enhancers/progression'\nimport { accessibilityEnhancer } from './enhancers/accessibility'\nimport { webkitEnhancer } from './enhancers/webkit'\n\n/**\n * Only expose a subset of reader API in order to protect against\n * wrong manipulation.\n * To access the extended API, create an enhancer.\n */\nconst withPublicApiOnly = <Api extends { [key in keyof ReaderPublicApi]: any }>(reader: Api) => {\n const {\n context,\n innerPagination,\n manipulateContainer,\n manipulateSpineItems,\n getFocusedSpineItemIndex,\n getCurrentNavigationPosition,\n getSpineItem,\n locator,\n getAbsolutePositionOf,\n generateCfi,\n resolveCfi,\n getCfiMetaInformation,\n spine,\n ...exposedReader\n } = reader\n\n return exposedReader\n}\n\ntype ReaderPublicApiWithSafeExposedKeys = ReturnType<typeof withPublicApiOnly>\ntype RemovedKeysOnly = keyof Omit<ReaderPublicApi, keyof ReaderPublicApiWithSafeExposedKeys>\n\nconst internalEnhancer = composeEnhancer(\n progressionEnhancer\n // @requires progressionEnhancer\n , paginationEnhancer\n , hotkeysEnhancer\n , themeEnhancer\n , navigationEnhancer\n , chromeEnhancer\n , mediaEnhancer\n , zoomEnhancer\n , layoutEnhancer\n , utilsEnhancer\n , resourcesEnhancer\n , accessibilityEnhancer\n , linksEnhancer\n , fontsEnhancer\n , webkitEnhancer\n)\n\ntype WithoutPrivateApi<E> = Omit<E, RemovedKeysOnly | `__debug` | `__API` | `__OutputSettings`>\ntype EnhancerOptions<E extends (...args: any) => any> = Parameters<ReturnType<E>>[0]\ntype EnhancerExposedApi<E extends (...args: any) => any> = ReturnType<ReturnType<E>>\n\nexport function createReaderWithEnhancer(options: EnhancerOptions<typeof internalEnhancer>): WithoutPrivateApi<EnhancerExposedApi<typeof internalEnhancer>>\nexport function createReaderWithEnhancer<UserEnhancer extends Enhancer>(options: EnhancerOptions<UserEnhancer> & EnhancerOptions<typeof internalEnhancer>, enhancer: UserEnhancer): WithoutPrivateApi<EnhancerExposedApi<ComposeEnhancer<typeof internalEnhancer, UserEnhancer>>>\nexport function createReaderWithEnhancer<UserEnhancer extends Enhancer> (options: EnhancerOptions<UserEnhancer> & EnhancerOptions<typeof internalEnhancer>, enhancer?: UserEnhancer) {\n if (!enhancer) {\n const enhancedCreateReader = internalEnhancer(createInternalReader)\n\n return withPublicApiOnly(enhancedCreateReader(options))\n }\n\n const finalEnhancer = composeEnhancer(internalEnhancer, enhancer)\n const enhancedCreateReader = finalEnhancer(createInternalReader)\n\n return withPublicApiOnly(enhancedCreateReader(options) as any)\n}\n\nexport type Reader<E extends Enhancer | void = void> = E extends Enhancer\n ? WithoutPrivateApi<EnhancerExposedApi<ComposeEnhancer<typeof internalEnhancer, E>>>\n : WithoutPrivateApi<EnhancerExposedApi<typeof internalEnhancer>>\n","import { Enhancer } from \"./types\"\n\n/**\n *\n */\nexport const accessibilityEnhancer: Enhancer<{}, {\n\n}> = (next) => (options) => {\n const reader = next(options)\n\n const observer = new IntersectionObserver((entries) => {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n entry.target.removeAttribute(`tab-index`)\n } else {\n entry.target.setAttribute(`tab-index`, `-1`)\n }\n })\n }, {\n })\n\n reader.registerHook(`item.onLoad`, ({ addStyle, frame }) => {\n addStyle(`prose-reader-accessibility`, `\n :focus-visible {\n ${/*\n Some epubs remove the outline, this is not good practice since it reduce accessibility.\n We will try to restore it by force.\n */``}\n outline: -webkit-focus-ring-color auto 1px;\n }\n `)\n\n const links = frame.contentDocument?.body.querySelectorAll(`a`)\n\n links?.forEach(link => {\n observer.observe(link)\n })\n\n return () => {\n links?.forEach(link => {\n observer.unobserve(link)\n })\n }\n })\n\n return {\n ...reader\n }\n}\n","import { Enhancer } from \"./types\"\n\nconst SHOULD_NOT_LAYOUT = false\n\n/**\n * All fixes relative to chromes\n */\nexport const chromeEnhancer: Enhancer<{}, {\n\n}> = (next) => (options) => {\n const reader = next(options)\n\n /**\n * This element is used to force a refresh of a screen in order to fix the\n * frozen screen that happens with chrome.\n * The bug is weird and I have yet to explain it correctly, what happens\n * is that sometime when moving the x-axis on navigation, the screen will still display\n * the old screen, as if it was frozen. Generally any interaction with the page will unfreeze\n * the screen and the new iframe will be displayed. It also happens within the same iframe.\n * So far it seems to be due to scaling and x-axis moving.\n * To ensure the screen does not freeze we are moving a 1:1 square in & out of the screen.\n * That way chrome is \"forced\" to refresh the screen.\n *\n * @todo\n * check https://developer.mozilla.org/en-US/docs/Web/CSS/will-change with will-change: transform\n * to see if it does refresh all the time itself.\n *\n * @todo\n * use transform and translate rather than changing top so it only affect composite layer rather than paint\n * @see https://www.algolia.com/blog/engineering/performant-web-animations/\n *\n * @important\n * This is disabled for now as removing will-change on container seems to fix the issue\n */\n // let screenForceRefreshElt: HTMLDivElement | undefined = undefined\n\n reader.manipulateContainer((container, onDestroy) => {\n const onScroll = () => {\n if (reader.context.getSettings().computedPageTurnMode === `controlled`) {\n container.scrollTo(0, 0)\n }\n }\n\n /**\n * For some reason I have yet to find, chrome will force scroll x-axis on the container\n * whenever the user select text and drag it to the edges. This is not a scroll inside the iframe\n * but a scroll on the container itself..\n */\n container.addEventListener(`scroll`, onScroll)\n\n // screenForceRefreshElt = container.ownerDocument.createElement('div')\n // screenForceRefreshElt.style.cssText = `\n // position: absolute;\n // background-color: black;\n // left: 0;\n // top: -1px;\n // width: 1px;\n // height: 1px;\n // `\n\n // container.appendChild(screenForceRefreshElt)\n\n onDestroy(() => {\n container.removeEventListener(`scroll`, onScroll)\n })\n\n return SHOULD_NOT_LAYOUT\n })\n\n reader.registerHook(`item.onLoad`, ({ frame }) => {\n /**\n * Disable touch to search on first text touch / click. This does not prevent\n * it when selecting text. It needs to be turned off by the user.\n * @see https://developers.google.com/web/updates/2015/10/tap-to-search\n */\n frame.contentDocument?.body.setAttribute(`tabindex`, `-1`)\n })\n\n // const forceScreenRefresh$ = reader.$.$\n // .pipe(\n // // filter(event => event.type === `onNavigationChange`),\n // tap(() => {\n // // screenForceRefreshElt?.style.setProperty(`top`, `0px`)\n // // requestAnimationFrame(() => {\n // // screenForceRefreshElt?.style.setProperty(`top`, `-1px`)\n // // })\n // })\n // )\n\n // merge(forceScreenRefresh$)\n // .pipe(takeUntil(reader.$.destroy$))\n // .subscribe()\n\n return reader\n}\n","import { Enhancer, ExtractApi, ExtractHiddenApi, ExtractOptions } from \"./types\"\nimport { compose } from \"../utils/compose\"\n\nexport type ComposeEnhancer<\n A extends Enhancer<any, any, any> = Enhancer,\n B extends Enhancer<any, any, any> = Enhancer,\n C extends Enhancer<any, any, any> = Enhancer,\n D extends Enhancer<any, any, any> = Enhancer,\n E extends Enhancer<any, any, any> = Enhancer,\n F extends Enhancer<any, any, any> = Enhancer,\n G extends Enhancer<any, any, any> = Enhancer,\n H extends Enhancer<any, any, any> = Enhancer,\n I extends Enhancer<any, any, any> = Enhancer,\n J extends Enhancer<any, any, any> = Enhancer,\n K extends Enhancer<any, any, any> = Enhancer,\n L extends Enhancer<any, any, any> = Enhancer,\n M extends Enhancer<any, any, any> = Enhancer,\n N extends Enhancer<any, any, any> = Enhancer,\n O extends Enhancer<any, any, any> = Enhancer,\n > =\n Enhancer<\n & ExtractOptions<A>\n & ExtractOptions<B>\n & ExtractOptions<C>\n & ExtractOptions<D>\n & ExtractOptions<E>\n & ExtractOptions<F>\n & ExtractOptions<G>\n & ExtractOptions<H>\n & ExtractOptions<I>\n & ExtractOptions<J>\n & ExtractOptions<K>\n & ExtractOptions<L>\n & ExtractOptions<M>\n & ExtractOptions<N>\n & ExtractOptions<O>,\n & ExtractHiddenApi<A>\n & ExtractHiddenApi<B>\n & ExtractHiddenApi<C>\n & ExtractHiddenApi<D>\n & ExtractHiddenApi<E>\n & ExtractHiddenApi<F>\n & ExtractHiddenApi<G>\n & ExtractHiddenApi<H>\n & ExtractHiddenApi<I>\n & ExtractHiddenApi<J>\n & ExtractHiddenApi<K>\n & ExtractHiddenApi<L>\n & ExtractHiddenApi<M>\n & ExtractHiddenApi<N>\n & ExtractHiddenApi<O>,\n & Parameters<ExtractApi<A>[`setSettings`]>[0]\n & Parameters<ExtractApi<B>[`setSettings`]>[0]\n & Parameters<ExtractApi<C>[`setSettings`]>[0]\n & Parameters<ExtractApi<D>[`setSettings`]>[0]\n & Parameters<ExtractApi<E>[`setSettings`]>[0]\n & Parameters<ExtractApi<F>[`setSettings`]>[0]\n & Parameters<ExtractApi<G>[`setSettings`]>[0]\n & Parameters<ExtractApi<H>[`setSettings`]>[0]\n & Parameters<ExtractApi<I>[`setSettings`]>[0]\n & Parameters<ExtractApi<J>[`setSettings`]>[0]\n & Parameters<ExtractApi<K>[`setSettings`]>[0]\n & Parameters<ExtractApi<L>[`setSettings`]>[0]\n & Parameters<ExtractApi<M>[`setSettings`]>[0]\n & Parameters<ExtractApi<N>[`setSettings`]>[0]\n & Parameters<ExtractApi<O>[`setSettings`]>[0],\n & ExtractApi<A>[`__OutputSettings`]\n & ExtractApi<B>[`__OutputSettings`]\n & ExtractApi<C>[`__OutputSettings`]\n & ExtractApi<D>[`__OutputSettings`]\n & ExtractApi<E>[`__OutputSettings`]\n & ExtractApi<F>[`__OutputSettings`]\n & ExtractApi<G>[`__OutputSettings`]\n & ExtractApi<H>[`__OutputSettings`]\n & ExtractApi<I>[`__OutputSettings`]\n & ExtractApi<J>[`__OutputSettings`]\n & ExtractApi<K>[`__OutputSettings`]\n & ExtractApi<L>[`__OutputSettings`]\n & ExtractApi<M>[`__OutputSettings`]\n & ExtractApi<N>[`__OutputSettings`]\n & ExtractApi<O>[`__OutputSettings`]\n >\n\nexport function composeEnhancer<A extends Enhancer<any, any, any>>(a: A): ComposeEnhancer<A>\nexport function composeEnhancer<A extends Enhancer<any, any, any>, B extends Enhancer<any, any, any>>(a: A, b: B): ComposeEnhancer<A, B>\nexport function composeEnhancer<A extends Enhancer<any, any, any>, B extends Enhancer<any, any, any>, C extends Enhancer<any, any, any>>(a: A, b: B, c: C): ComposeEnhancer<A, B, C>\nexport function composeEnhancer<A extends Enhancer<any, any, any>, B extends Enhancer<any, any, any>, C extends Enhancer<any, any, any>, D extends Enhancer<any, any, any>>(a: A, b: B, c: C, d: D): ComposeEnhancer<A, B, C, D>\nexport function composeEnhancer<A extends Enhancer<any, any, any>, B extends Enhancer<any, any, any>, C extends Enhancer<any, any, any>, D extends Enhancer<any, any, any>, E extends Enhancer<any, any, any>>(a: A, b: B, c: C, d: D, e: E): ComposeEnhancer<A, B, C, D, E>\nexport function composeEnhancer<A extends Enhancer<any, any, any>, B extends Enhancer<any, any, any>, C extends Enhancer<any, any, any>, D extends Enhancer<any, any, any>, E extends Enhancer<any, any, any>, F extends Enhancer<any, any, any>>(a: A, b: B, c: C, d: D, e: E, f: F): ComposeEnhancer<A, B, C, D, E, F>\nexport function composeEnhancer<A extends Enhancer<any, any, any>, B extends Enhancer<any, any, any>, C extends Enhancer<any, any, any>, D extends Enhancer<any, any, any>, E extends Enhancer<any, any, any>, F extends Enhancer<any, any, any>, G extends Enhancer<any, any, any>>(a: A, b: B, c: C, d: D, e: E, f: F, g: G): ComposeEnhancer<A, B, C, D, E, F, G>\nexport function composeEnhancer<A extends Enhancer<any, any, any>, B extends Enhancer<any, any, any>, C extends Enhancer<any, any, any>, D extends Enhancer<any, any, any>, E extends Enhancer<any, any, any>, F extends Enhancer<any, any, any>, G extends Enhancer<any, any, any>, H extends Enhancer<any, any, any>>(a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H): ComposeEnhancer<A, B, C, D, E, F, G, H>\nexport function composeEnhancer<A extends Enhancer<any, any, any>, B extends Enhancer<any, any, any>, C extends Enhancer<any, any, any>, D extends Enhancer<any, any, any>, E extends Enhancer<any, any, any>, F extends Enhancer<any, any, any>, G extends Enhancer<any, any, any>, H extends Enhancer<any, any, any>, I extends Enhancer<any, any, any>>(a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I): ComposeEnhancer<A, B, C, D, E, F, G, H, I>\nexport function composeEnhancer<A extends Enhancer<any, any, any>, B extends Enhancer<any, any, any>, C extends Enhancer<any, any, any>, D extends Enhancer<any, any, any>, E extends Enhancer<any, any, any>, F extends Enhancer<any, any, any>, G extends Enhancer<any, any, any>, H extends Enhancer<any, any, any>, I extends Enhancer<any, any, any>, J extends Enhancer<any, any, any>>(a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J): ComposeEnhancer<A, B, C, D, E, F, G, H, I, J>\nexport function composeEnhancer<A extends Enhancer<any, any, any>, B extends Enhancer<any, any, any>, C extends Enhancer<any, any, any>, D extends Enhancer<any, any, any>, E extends Enhancer<any, any, any>, F extends Enhancer<any, any, any>, G extends Enhancer<any, any, any>, H extends Enhancer<any, any, any>, I extends Enhancer<any, any, any>, J extends Enhancer<any, any, any>, K extends Enhancer<any, any, any>>(a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K): ComposeEnhancer<A, B, C, D, E, F, G, H, I, J, K>\nexport function composeEnhancer<A extends Enhancer<any, any, any>, B extends Enhancer<any, any, any>, C extends Enhancer<any, any, any>, D extends Enhancer<any, any, any>, E extends Enhancer<any, any, any>, F extends Enhancer<any, any, any>, G extends Enhancer<any, any, any>, H extends Enhancer<any, any, any>, I extends Enhancer<any, any, any>, J extends Enhancer<any, any, any>, K extends Enhancer<any, any, any>, L extends Enhancer<any, any, any>>(a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K, l: L): ComposeEnhancer<A, B, C, D, E, F, G, H, I, J, K, L>\nexport function composeEnhancer<A extends Enhancer<any, any, any>, B extends Enhancer<any, any, any>, C extends Enhancer<any, any, any>, D extends Enhancer<any, any, any>, E extends Enhancer<any, any, any>, F extends Enhancer<any, any, any>, G extends Enhancer<any, any, any>, H extends Enhancer<any, any, any>, I extends Enhancer<any, any, any>, J extends Enhancer<any, any, any>, K extends Enhancer<any, any, any>, L extends Enhancer<any, any, any>, M extends Enhancer<any, any, any>>(a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K, l: L, m: M): ComposeEnhancer<A, B, C, D, E, F, G, H, I, J, K, L, M>\nexport function composeEnhancer<A extends Enhancer<any, any, any>, B extends Enhancer<any, any, any>, C extends Enhancer<any, any, any>, D extends Enhancer<any, any, any>, E extends Enhancer<any, any, any>, F extends Enhancer<any, any, any>, G extends Enhancer<any, any, any>, H extends Enhancer<any, any, any>, I extends Enhancer<any, any, any>, J extends Enhancer<any, any, any>, K extends Enhancer<any, any, any>, L extends Enhancer<any, any, any>, M extends Enhancer<any, any, any>, N extends Enhancer<any, any, any>>(a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K, l: L, m: M, n: N): ComposeEnhancer<A, B, C, D, E, F, G, H, I, J, K, L, M, N>\nexport function composeEnhancer<A extends Enhancer<any, any, any>, B extends Enhancer<any, any, any>, C extends Enhancer<any, any, any>, D extends Enhancer<any, any, any>, E extends Enhancer<any, any, any>, F extends Enhancer<any, any, any>, G extends Enhancer<any, any, any>, H extends Enhancer<any, any, any>, I extends Enhancer<any, any, any>, J extends Enhancer<any, any, any>, K extends Enhancer<any, any, any>, L extends Enhancer<any, any, any>, M extends Enhancer<any, any, any>, N extends Enhancer<any, any, any>, O extends Enhancer<any, any, any>>(a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K, l: L, m: M, n: N, o: O): ComposeEnhancer<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>\nexport function composeEnhancer (...funcs: any[]) {\n return compose(...funcs)\n}\n","import { BehaviorSubject, combineLatest, map, Observable, ObservedValueOf, takeUntil } from \"rxjs\"\nimport { tap, pairwise } from \"rxjs/operators\"\nimport { Enhancer } from \"./types\"\n\nconst FONT_WEIGHT = [100, 200, 300, 400, 500, 600, 700, 800, 900] as const\nconst FONT_JUSTIFICATION = [`center`, `left`, `right`, `justify`] as const\n\ntype Options = {\n /**\n * @description\n * Scale the font size. 1 means use default publisher/browser font size, 2 means 200%\n * 0.5 50%, etc\n */\n fontScale?: number,\n /**\n * @description\n * Set the line height of the text. The default value is 1\n */\n lineHeight?: number | `publisher`,\n /**\n * @description\n * Set font weight of text\n */\n fontWeight?: typeof FONT_WEIGHT[number] | `publisher`,\n /**\n * @description\n * Set text align justification\n */\n fontJustification?: typeof FONT_JUSTIFICATION[number] | `publisher`,\n}\n\ntype OutputOptions = Required<Options>\n\n/**\n * @important\n * We don't apply font scaling on pre-paginated because it could potentially\n * break publisher scaling. Since it's specifically made for the given fixed layout\n * we should trust the publisher and not break its rendering.\n * @see 9781250213662\n *\n * Setting the font scale on body still has a chance to break publisher potential\n * font size on body if they already use something.\n * @see 9782714493743\n */\nexport const fontsEnhancer: Enhancer<Options, {}, Options, OutputOptions> = (next) => ({\n fontScale = 1,\n lineHeight = `publisher`,\n fontWeight = `publisher`,\n fontJustification = `publisher`,\n ...options\n}) => {\n const settingsSubject$ = new BehaviorSubject<OutputOptions>({\n fontScale,\n lineHeight,\n fontWeight,\n fontJustification\n })\n const reader = next(options)\n\n const getStyle = () => `\n ${/*\n Ideally, we would like to use !important but it could break publisher specific\n cases.\n Also right now we do not apply it to * since it would also break publisher\n more specific scaling down the tree.\n\n body *:not([class^=\"mjx-\"]) {\n */``}\n body {\n ${settingsSubject$.value.fontScale !== 1\n ? `font-size: ${settingsSubject$.value.fontScale}em !important;`\n : ``}\n ${settingsSubject$.value.lineHeight !== `publisher`\n ? `line-height: ${settingsSubject$.value.lineHeight} !important;`\n : ``}\n ${settingsSubject$.value.fontWeight !== `publisher`\n ? `font-weight: ${settingsSubject$.value.fontWeight} !important;`\n : ``}\n ${settingsSubject$.value.fontJustification !== `publisher`\n ? `text-align: ${settingsSubject$.value.fontJustification} !important;`\n : ``}\n }\n `\n\n /**\n * Programmatically update every loaded items\n */\n const applyChangeToSpineItem = (requireLayout: boolean) => {\n reader.manipulateSpineItems(({ removeStyle, addStyle, item }) => {\n if (item.renditionLayout !== `pre-paginated`) {\n removeStyle(`prose-reader-fonts`)\n addStyle(`prose-reader-fonts`, getStyle())\n }\n\n return requireLayout\n })\n }\n\n /**\n * Make sure we apply the style to any new item loaded.\n */\n reader.registerHook(`item.onLoad`, ({ removeStyle, addStyle, item }) => {\n if (item.renditionLayout !== `pre-paginated`) {\n removeStyle(`prose-reader-fonts`)\n addStyle(`prose-reader-fonts`, getStyle())\n }\n })\n\n const shouldRequireLayout = <T extends ObservedValueOf<typeof settingsSubject$>>(source: Observable<T>) => source\n .pipe(\n pairwise(),\n map(([old, latest]) => {\n if (latest.fontScale !== old.fontScale) return true\n if (latest.lineHeight !== old.lineHeight) return true\n\n return false\n })\n )\n\n settingsSubject$.asObservable()\n .pipe(\n shouldRequireLayout,\n tap(applyChangeToSpineItem),\n takeUntil(reader.$.destroy$)\n )\n .subscribe()\n\n return {\n ...reader,\n /**\n * Absorb current enhancer settings and passthrough the rest to reader\n */\n setSettings: (settings) => {\n const {\n fontJustification = settingsSubject$.value.fontJustification,\n fontScale = settingsSubject$.value.fontScale,\n fontWeight = settingsSubject$.value.fontWeight,\n lineHeight = settingsSubject$.value.lineHeight,\n ...passthroughSettings\n } = settings\n\n if (hasOneKey(settings, [`fontJustification`, `fontScale`, `fontWeight`, `lineHeight`])) {\n settingsSubject$.next({ fontJustification, fontScale, fontWeight, lineHeight })\n }\n reader.setSettings(passthroughSettings)\n },\n $: {\n ...reader.$,\n /**\n * Combine reader settings with enhancer settings\n */\n settings$: combineLatest([reader.$.settings$, settingsSubject$])\n .pipe(\n map(([innerSettings, settings]) => ({\n ...innerSettings,\n ...settings\n }))\n )\n }\n }\n}\n\nconst hasOneKey = <Obj, Key extends keyof Obj>(obj: Obj, keys: Key[]) => keys.some(key => key in obj)\n","import { Enhancer } from \"./types\"\n\nexport const hotkeysEnhancer: Enhancer<{}, {}> = (next) => (options) => {\n const reader = next(options)\n\n const onKeyPress = (e: KeyboardEvent) => {\n if (e.key === `ArrowRight`) {\n reader.turnRight()\n }\n\n if (e.key === `ArrowLeft`) {\n reader.turnLeft()\n }\n }\n\n document.addEventListener(`keyup`, onKeyPress)\n\n reader.registerHook(`item.onLoad`, ({ frame }) => {\n frame.contentDocument?.addEventListener(`keyup`, onKeyPress)\n\n return () => {\n frame.contentDocument?.removeEventListener(`keyup`, onKeyPress)\n }\n })\n\n const destroy = () => {\n document.removeEventListener(`keyup`, onKeyPress)\n reader.destroy()\n }\n\n return {\n ...reader,\n destroy\n }\n}\n","import { animationFrameScheduler, Observable, of, scheduled } from \"rxjs\"\nimport { distinctUntilChanged, filter, map, switchMap, take, takeUntil, tap } from \"rxjs/operators\"\nimport { Reader } from \"../../reader\"\n\nconst SHOULD_NOT_LAYOUT = false\n\n/**\n * For some reason (bug / expected / engine layout optimization) when the viewport is being animated clicking inside iframe\n * sometimes returns invalid clientX value. This means that when rapidly (or not) clicking during animation on iframe will often\n * time returns invalid value. In order to reduce potential unwanted behavior on consumer side, we temporarily hide the iframe behind\n * an overlay. That way the overlay take over for the pointer event and we all good.\n *\n * @important\n * This obviously block any interaction with iframe but there should not be such interaction with iframe in theory.\n * Theoretically if user decide to interact during the animation that's either to stop it or swipe the pages.\n */\nexport const createMovingSafePan$ = (reader: Reader) => {\n let iframeOverlayForAnimationsElement: HTMLDivElement | undefined\n\n reader.manipulateContainer((container, onDestroy) => {\n iframeOverlayForAnimationsElement = container.ownerDocument.createElement(`div`)\n iframeOverlayForAnimationsElement.style.cssText = `\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n visibility: hidden;\n `\n container.appendChild(iframeOverlayForAnimationsElement)\n\n onDestroy(() => {\n iframeOverlayForAnimationsElement?.remove()\n })\n\n return SHOULD_NOT_LAYOUT\n })\n\n const createResetLock$ = <T>(source: Observable<T>) => scheduled(source, animationFrameScheduler)\n .pipe(\n tap(() => {\n iframeOverlayForAnimationsElement?.style.setProperty(`visibility`, `hidden`)\n })\n )\n\n const viewportFree$ = reader.$.viewportState$.pipe(filter(data => data === `free`))\n const viewportBusy$ = reader.$.viewportState$.pipe(filter(data => data === `busy`))\n\n const lockAfterViewportBusy$ = viewportBusy$\n .pipe(\n tap(() => {\n iframeOverlayForAnimationsElement?.style.setProperty(`visibility`, `visible`)\n })\n )\n\n const resetLockViewportFree$ = createResetLock$(viewportFree$)\n .pipe(\n take(1)\n )\n\n const pageTurnMode$ = reader.context.$.settings$\n .pipe(\n map(() => reader.context.getSettings().computedPageTurnMode),\n distinctUntilChanged()\n )\n\n const handleViewportLock$ = pageTurnMode$\n .pipe(\n switchMap((mode) => mode === `controlled`\n ? lockAfterViewportBusy$\n .pipe(\n switchMap(() => resetLockViewportFree$)\n )\n : createResetLock$(of(undefined))\n ),\n takeUntil(reader.$.destroy$)\n )\n\n return handleViewportLock$\n}\n","import { BehaviorSubject, combineLatest } from \"rxjs\"\nimport { distinctUntilChanged, map, takeUntil, tap, skip } from \"rxjs/operators\"\nimport { Enhancer } from \"../types\"\nimport { createMovingSafePan$ } from \"./createMovingSafePan$\"\nimport { mapKeysTo } from \"../../utils/rxjs\"\nimport { isShallowEqual } from \"../../utils/objects\"\n\nconst SHOULD_NOT_LAYOUT = false\n\ntype SettingsInput = {\n pageHorizontalMargin?: number,\n pageVerticalMargin?: number,\n}\n\ntype SettingsOutput = Required<SettingsInput>\n\nexport const layoutEnhancer: Enhancer<SettingsInput & {\n /**\n * Can be used to let the reader automatically resize.\n * `container`: observe and resize the reader whenever the container resize.\n * `false`: do not automatically resize.\n */\n layoutAutoResize?: `container` | false\n}, {}, SettingsInput, SettingsOutput> = (next) => ({ pageHorizontalMargin = 24, pageVerticalMargin = 24, ...options }) => {\n const reader = next(options)\n const settingsSubject$ = new BehaviorSubject<SettingsOutput>({\n pageHorizontalMargin,\n pageVerticalMargin\n })\n\n reader.registerHook(`onViewportOffsetAdjust`, () => {\n let hasRedrawn = false\n\n /**\n * When adjusting the offset, there is a chance that pointer event being dispatched right after\n * have a wrong `clientX` / `pageX` etc. This is because even if the iframe left value (once requested) is correct,\n * it does not seem to have been correctly taken by the browser when creating the event.\n * What we do here is that after a viewport adjustment we immediately force a reflow on the engine.\n *\n * @example\n * [pointer event] -> clientX = 50, left = 0, translated clientX = 50 (CORRECT)\n * [translate viewport] -> left = +100px\n * [pointer event] -> clientX = ~50, left = -100, translated clientX = ~-50 (INCORRECT)\n * [pointer event] -> clientX = 150, left = -100, translated clientX = 50 (CORRECT)\n *\n * For some reason the engine must be doing some optimization and unfortunately the first pointer event gets the clientX wrong.\n *\n * The bug can be observed by commenting this code, using CPU slowdown and increasing the throttle on the adjustment stream.\n * The bug seems to affect only chrome / firefox. Nor safari.\n *\n * Also we only need to use `getBoundingClientRect` once.\n *\n * @todo\n * Consider creating a bug ticket on both chromium and gecko projects.\n */\n reader.manipulateSpineItems(({ frame }) => {\n if (!hasRedrawn && frame) {\n /* eslint-disable-next-line no-void */\n void (frame.getBoundingClientRect().left)\n hasRedrawn = true\n }\n\n return SHOULD_NOT_LAYOUT\n })\n })\n\n /**\n * Apply margins to frame item\n * @todo memoize\n */\n reader.registerHook(`item.onLayoutBeforeMeasurment`, ({ frame, minimumWidth, item, isImageType }) => {\n const { pageHorizontalMargin = 0, pageVerticalMargin = 0 } = settingsSubject$.value\n const pageSize = reader.context.getPageSize()\n\n if (\n item.renditionLayout === `reflowable` &&\n frame.getIsReady() &&\n !isImageType() &&\n !frame.getViewportDimensions()\n ) {\n console.warn(`YOUHOU ${item.id}`)\n\n let columnWidth = pageSize.width - (pageHorizontalMargin * 2)\n const columnHeight = pageSize.height - (pageVerticalMargin * 2)\n let width = pageSize.width - (pageHorizontalMargin * 2)\n let columnGap = pageHorizontalMargin * 2\n\n if (frame.isUsingVerticalWriting()) {\n width = minimumWidth - (pageHorizontalMargin * 2)\n columnWidth = columnHeight\n columnGap = pageVerticalMargin * 2\n }\n\n frame.getManipulableFrame()?.removeStyle(`prose-layout-enhancer-css`)\n frame.getManipulableFrame()?.addStyle(`prose-layout-enhancer-css`, `\n body {\n width: ${width}px !important;\n margin: ${pageVerticalMargin}px ${pageHorizontalMargin}px !important;\n column-gap: ${columnGap}px !important;\n column-width: ${columnWidth}px !important;\n height: ${columnHeight}px !important;\n }\n img, video, audio, object, svg {\n max-width: ${columnWidth}px !important;\n max-height: ${columnHeight}px !important;\n }\n table {\n max-width: ${columnWidth}px !important;\n }\n td {\n max-width: ${columnWidth}px;\n }\n `)\n }\n })\n\n // @todo fix the panstart issue\n // @todo maybe increasing the hammer distance before triggering pan as well\n // reader.registerHook(`item.onLoad`, ({frame}) => {\n // frame.contentDocument?.body.addEventListener(`contextmenu`, e => {\n // console.log(`ad`)\n // e.preventDefault()\n // })\n // })\n\n let observer: ResizeObserver | undefined\n\n if (options.layoutAutoResize === `container`) {\n observer = new ResizeObserver(() => {\n reader?.layout()\n })\n observer.observe(options.containerElement)\n }\n\n const movingSafePan$ = createMovingSafePan$(reader)\n\n movingSafePan$.subscribe()\n\n settingsSubject$\n .pipe(\n mapKeysTo([`pageHorizontalMargin`, `pageVerticalMargin`]),\n distinctUntilChanged(isShallowEqual),\n skip(1),\n tap(() => {\n reader.spine.layout()\n }),\n takeUntil(reader.$.destroy$)\n )\n .subscribe()\n\n return {\n ...reader,\n destroy: () => {\n reader.destroy()\n observer?.disconnect()\n },\n setSettings: ({ pageVerticalMargin, pageHorizontalMargin, ...rest }) => {\n if (pageHorizontalMargin !== undefined || pageVerticalMargin !== undefined) {\n settingsSubject$.next({\n pageHorizontalMargin: pageHorizontalMargin ?? settingsSubject$.value.pageHorizontalMargin,\n pageVerticalMargin: pageVerticalMargin ?? settingsSubject$.value.pageVerticalMargin\n })\n }\n\n reader.setSettings(rest)\n },\n $: {\n ...reader.$,\n settings$: combineLatest([reader.$.settings$, settingsSubject$.asObservable()])\n .pipe(\n map(([innerSettings, settings]) => ({\n ...innerSettings,\n ...settings\n }))\n )\n }\n }\n}\n","import { Observable, Subject } from \"rxjs\"\nimport { Report } from \"../report\"\nimport { Enhancer } from \"./types\"\n\ntype SubjectData = { event: `linkClicked`, data: HTMLAnchorElement }\n\nexport const linksEnhancer: Enhancer<{}, {\n $: {\n links$: Observable<SubjectData>\n }\n}> = (next) => (options) => {\n const reader = next(options)\n const subject = new Subject<SubjectData>()\n\n const handleNavigationForClick = (element: HTMLAnchorElement) => {\n if (!element.href) return\n\n const hrefUrl = new URL(element.href)\n const hrefWithoutAnchor = `${hrefUrl.origin}${hrefUrl.pathname}`\n // internal link, we can handle\n const hasExistingSpineItem = reader.context.getManifest()?.spineItems.some(item => item.href === hrefWithoutAnchor)\n if (hasExistingSpineItem) {\n reader.goToUrl(hrefUrl)\n }\n }\n\n reader.registerHook(`item.onLoad`, ({ frame }) => {\n if (frame.contentDocument) {\n Array.from(frame.contentDocument.querySelectorAll(`a`)).forEach(element => element.addEventListener(`click`, (e) => {\n if (e.target && `style` in e.target && `ELEMENT_NODE` in e.target) {\n Report.warn(`prevented click on`, element, e)\n e.preventDefault()\n handleNavigationForClick(element)\n subject.next({ event: `linkClicked`, data: element })\n }\n }))\n }\n })\n\n return {\n ...reader,\n $: {\n ...reader.$,\n links$: subject.asObservable()\n }\n }\n}\n","import { Enhancer } from \"./types\"\n\nexport const mediaEnhancer: Enhancer<{}, {\n\n}> = (next) => (options) => {\n const reader = next(options)\n\n const frameObserver = new IntersectionObserver((entries) => {\n entries.forEach(entry => {\n const frame = entry.target as HTMLIFrameElement\n const audios = Array.from(frame.contentDocument?.body.getElementsByTagName(`audio`) || [])\n\n if (!entry.isIntersecting) {\n audios.forEach(audioElement => {\n audioElement.pause()\n audioElement.currentTime = 0\n })\n } else {\n audios.forEach(audioElement => {\n if (audioElement.hasAttribute(`autoplay`) && audioElement.paused && audioElement.readyState >= 2) {\n audioElement.play().catch(console.error)\n }\n })\n }\n })\n }, {\n threshold: 0.01\n })\n\n const elementObserver = new IntersectionObserver((entries) => {\n entries.forEach(entry => {\n if (entry.target.tagName === `video`) {\n const video = entry.target as HTMLVideoElement\n if (!entry.isIntersecting) {\n video.pause()\n video.currentTime = 0\n } else {\n if (video.hasAttribute(`autoplay`)) {\n // this can fail when we play the first time due to user not having interacted with\n // document yet. Browsers policy. autoplay will play it the first time anyway.\n if (video.paused && video.readyState >= 2) {\n video.play().catch(console.error)\n }\n }\n }\n }\n })\n }, {\n threshold: 0.5\n })\n\n reader.registerHook(`item.onLoad`, ({ frame }) => {\n frameObserver.observe(frame)\n\n const videos = frame.contentDocument?.body.getElementsByTagName(`video`)\n\n const unobserveElements = Array.from(videos || []).map(element => {\n elementObserver.observe(element)\n\n return () => elementObserver.unobserve(element)\n })\n\n return () => {\n frameObserver.unobserve(frame)\n unobserveElements.forEach(unobserve => unobserve())\n }\n })\n\n const destroy = () => {\n frameObserver.disconnect()\n elementObserver.disconnect()\n reader.destroy()\n }\n\n return {\n ...reader,\n destroy\n }\n}\n","/**\n * Offer extra convenient methods for navigation.\n */\nimport { Enhancer } from \"./types\"\n\nexport const navigationEnhancer: Enhancer<{}, {\n goToLeftSpineItem: () => void,\n goToRightSpineItem: () => void,\n}> = (next) => (options) => {\n const reader = next(options)\n\n const goToNextSpineItem = () => {\n const focusedSpineItemIndex = reader.getFocusedSpineItemIndex() || 0\n const { end = focusedSpineItemIndex } = reader.locator.getSpineItemsFromReadingOrderPosition(reader.getCurrentNavigationPosition()) || {}\n const numberOfSpineItems = reader.context.getManifest()?.spineItems.length ?? 0\n const nextItem = end + 1\n if (nextItem < numberOfSpineItems) {\n reader.goToSpineItem(nextItem)\n }\n }\n\n const goToPreviousSpineItem = () => {\n const focusedSpineItemIndex = reader.getFocusedSpineItemIndex() || 0\n const { begin = focusedSpineItemIndex } = reader.locator.getSpineItemsFromReadingOrderPosition(reader.getCurrentNavigationPosition()) || {}\n const nextItem = begin - 1\n if (nextItem >= 0) {\n reader.goToSpineItem(nextItem)\n }\n }\n\n return {\n ...reader,\n goToLeftSpineItem: () => {\n if (reader.context.isRTL()) {\n return goToNextSpineItem()\n }\n\n return goToPreviousSpineItem()\n },\n goToRightSpineItem: () => {\n if (reader.context.isRTL()) {\n return goToPreviousSpineItem()\n }\n\n return goToNextSpineItem()\n }\n }\n}\n","import { Observable } from \"rxjs\"\nimport { map } from \"rxjs/operators\"\nimport { Enhancer } from \"./types\"\nimport { SpineItem } from \"../spineItem\"\nimport { Manifest } from \"../types\"\nimport { progressionEnhancer } from \"./progression\"\n\n/**\n * @todo\n * Using recursive here provoke this error\n * https://www.google.com/search?q=recursive+Exported+variable+has+or+is+using+namefrom+external+module+but+cannot+be+named.&rlz=1C5CHFA_en&sxsrf=AOaemvK4craypli45-fXfFRdfO82ibGRog%3A1631106978791&ei=orc4YZPUL-6tmAWJgKT4Dw&oq=recursive+Exported+variable+has+or+is+using+namefrom+external+module+but+cannot+be+named.&gs_lcp=Cgdnd3Mtd2l6EAM6BwgAEEcQsANKBAhBGABQjgdYjgdgtQtoAnACeACAAWGIAWGSAQExmAEAoAEByAEIwAEB&sclient=gws-wiz&ved=0ahUKEwiTrb6Au-_yAhXuFqYKHQkACf8Q4dUDCA4&uact=5\n * My guess is that something is wrong and I have too many recursive / inferred types everywhere and especially on the enhancer thingy.\n */\ntype ChapterInfo = {\n title: string\n subChapter?: {\n title: string\n subChapter?: {\n title: string\n subChapter?: {\n title: string\n path: string\n },\n path: string\n },\n path: string\n },\n path: string\n}\n\ntype PaginationInfo = undefined | {\n begin: {\n chapterInfo: undefined | {\n title: string\n subChapter?: ChapterInfo,\n path: string\n },\n pageIndexInChapter: number | undefined,\n absolutePageIndex: number | undefined,\n numberOfPagesInChapter: number | undefined,\n spineItemIndex: number | undefined,\n cfi: string | undefined,\n spineItemReadingDirection: `rtl` | `ltr` | undefined,\n },\n end: {\n chapterInfo: undefined | {\n title: string\n subChapter?: ChapterInfo,\n path: string\n },\n pageIndexInChapter: number | undefined,\n absolutePageIndex: number | undefined,\n numberOfPagesInChapter: number | undefined,\n spineItemIndex: number | undefined,\n cfi: string | undefined,\n spineItemReadingDirection: `rtl` | `ltr` | undefined,\n },\n percentageEstimateOfBook: number | undefined,\n /**\n * @warning\n * This value is only correct for pre-paginated books and or\n * if you preload the entire book in case of reflow. This is because\n * items get loaded unloaded when navigating through the book, meaning\n * we cannot measure the number of pages accurately.\n */\n numberOfTotalPages: number | undefined,\n isUsingSpread: boolean,\n // numberOfSpineItems: number | undefined\n}\n\nexport const paginationEnhancer: Enhancer<{}, {\n pagination: {\n $: Observable<PaginationInfo>,\n getInfo: () => PaginationInfo\n }\n}, {}, {}, typeof progressionEnhancer> = (next) => (options) => {\n const reader = next(options)\n\n const getChapterInfo = () => {\n const item = reader.getSpineItem(reader.getFocusedSpineItemIndex() || 0)\n const manifest = reader.context.getManifest()\n return item && manifest && buildChapterInfoFromSpineItem(manifest, item)\n }\n\n const getPaginationInfo = (): PaginationInfo => {\n const pagination = reader.innerPagination\n const context = reader.context\n const paginationBegin = reader.innerPagination.getBeginInfo()\n const paginationEnd = reader.innerPagination.getEndInfo()\n const beginItem = paginationBegin.spineItemIndex !== undefined ? reader.getSpineItem(paginationBegin.spineItemIndex) : undefined\n const endItem = paginationEnd.spineItemIndex !== undefined ? reader.getSpineItem(paginationEnd.spineItemIndex) : undefined\n\n if (!pagination || !context) return undefined\n\n return {\n begin: {\n chapterInfo: getChapterInfo(),\n pageIndexInChapter: paginationBegin.pageIndex,\n absolutePageIndex: paginationBegin.absolutePageIndex,\n numberOfPagesInChapter: paginationBegin.numberOfPages,\n // chapterIndex: number;\n // pages: number;\n // pageIndexInBook: number;\n // pageIndexInChapter: number;\n // pagesOfChapter: number;\n // pagePercentageInChapter: number;\n // offsetPercentageInChapter: number;\n // domIndex: number;\n // charOffset: number;\n // serializeString?: string;\n spineItemIndex: paginationBegin.spineItemIndex,\n // spineItemPath: beginItem?.item.path,\n // spineItemId: beginItem?.item.id,\n cfi: paginationBegin.cfi,\n spineItemReadingDirection: beginItem?.getReadingDirection()\n },\n end: {\n chapterInfo: getChapterInfo(),\n pageIndexInChapter: paginationEnd.pageIndex,\n absolutePageIndex: paginationEnd.absolutePageIndex,\n numberOfPagesInChapter: paginationEnd.numberOfPages,\n spineItemIndex: paginationEnd.spineItemIndex,\n // spineItemPath: endItem?.item.path,\n // spineItemId: endItem?.item.id,\n spineItemReadingDirection: endItem?.getReadingDirection(),\n cfi: paginationEnd.cfi\n },\n // end: ReadingLocation;\n // spineItemReadingDirection: focusedSpineItem?.getReadingDirection(),\n /**\n * This percentage is based of the weight (kb) of every items and the number of pages.\n * It is not accurate but gives a general good idea of the overall progress.\n * It is recommended to use this progress only for reflow books. For pre-paginated books\n * the number of pages and current index can be used instead since 1 page = 1 chapter.\n */\n percentageEstimateOfBook: endItem\n ? reader.progression.getPercentageEstimate(\n context,\n paginationEnd.spineItemIndex ?? 0,\n paginationEnd.numberOfPages,\n paginationEnd.pageIndex || 0,\n reader.getCurrentViewportPosition(),\n endItem\n )\n : 0,\n /**\n * This may be not accurate for reflowable due to dynamic load / unload.\n */\n numberOfTotalPages: pagination.getTotalNumberOfPages(),\n isUsingSpread: context.shouldDisplaySpread()\n // chaptersOfBook: number;\n // chapter: string;\n // hasNextChapter: (reader.spine.spineItemIndex || 0) < (manifest.readingOrder.length - 1),\n // hasPreviousChapter: (reader.spine.spineItemIndex || 0) < (manifest.readingOrder.length - 1),\n // numberOfSpineItems: context.getManifest()?.readingOrder.length,\n }\n }\n\n return {\n ...reader,\n pagination: {\n $: reader.innerPagination.$\n .pipe(\n map(() => getPaginationInfo())\n ),\n getInfo: getPaginationInfo\n }\n }\n}\n\nexport const buildChapterInfoFromSpineItem = (manifest: Manifest, spineItem: SpineItem) => {\n const { path } = spineItem.item\n\n return getChapterInfo(path, manifest.nav.toc)\n}\n\nconst getChapterInfo = (path: string, tocItems: Manifest[`nav`][`toc`]): ChapterInfo | undefined => {\n return tocItems.reduce((acc: ChapterInfo | undefined, tocItem) => {\n const indexOfHash = tocItem.path.indexOf(`#`)\n const tocItemPathWithoutAnchor = indexOfHash > 0 ? tocItem.path.substr(0, indexOfHash) : tocItem.path\n if (path.endsWith(tocItemPathWithoutAnchor)) {\n return {\n title: tocItem.title,\n path: tocItem.path\n }\n }\n\n const subInfo = getChapterInfo(path, tocItem.contents)\n\n if (subInfo) {\n return {\n subChapter: subInfo,\n title: tocItem.title,\n path: tocItem.path\n }\n }\n\n return acc\n }, undefined)\n}\n","import { Context } from \"../context\"\nimport { Enhancer } from \"./types\"\nimport { SpineItem } from \"../spineItem\"\n\n/**\n * Help dealing with progression through the book\n */\nexport const progressionEnhancer: Enhancer<{}, {\n progression: {\n getPercentageEstimate: (\n context: Context,\n currentSpineIndex: number,\n numberOfPages: number,\n pageIndex: number,\n currentPosition: { x: number, y: number },\n currentItem: SpineItem\n ) => number,\n getScrollPercentageWithinItem: (context: Context, currentPosition: { x: number, y: number }, currentItem: SpineItem) => number\n }\n}> = (next) => (options) => {\n const reader = next(options)\n\n const getPercentageEstimate = (\n context: Context,\n currentSpineIndex: number,\n numberOfPages: number,\n pageIndex: number,\n currentPosition: { x: number, y: number },\n currentItem: SpineItem\n ) => {\n const isGloballyPrePaginated = context.getManifest()?.renditionLayout === `pre-paginated`\n const readingOrderLength = context.getManifest()?.spineItems.length || 0\n const estimateBeforeThisItem = context.getManifest()?.spineItems\n .slice(0, currentSpineIndex)\n .reduce((acc, item) => acc + item.progressionWeight, 0) || 0\n const currentItemWeight = context.getManifest()?.spineItems[currentSpineIndex]?.progressionWeight || 0\n // const nextItem = context.manifest.readingOrder[currentSpineIndex + 1]\n // const nextItemWeight = nextItem ? nextItem.progressionWeight : 1\n // const progressWeightGap = (currentItemWeight + estimateBeforeThisItem) - estimateBeforeThisItem\n\n let progressWithinThisItem = (pageIndex + 1) * (currentItemWeight / numberOfPages)\n\n if (!isGloballyPrePaginated && currentItem.isReflowable && !currentItem.isReady()) {\n progressWithinThisItem = 0\n }\n\n let totalProgress = estimateBeforeThisItem + progressWithinThisItem\n\n if (context.getManifest()?.renditionFlow === `scrolled-continuous`) {\n if (currentItem.isReady()) {\n progressWithinThisItem = getScrollPercentageWithinItem(context, currentPosition, currentItem)\n } else {\n // that way we avoid having a progress of 1 just because the item is not loaded and cover all screen due to smaller size.\n // Therefore it effectively prevent jump from 30% to 25% for example.\n progressWithinThisItem = 0\n }\n totalProgress = getTotalProgressFromPercentages(estimateBeforeThisItem, currentItemWeight, progressWithinThisItem)\n }\n\n // because the rounding of weight use a lot of decimals we will end up with\n // something like 0.999878 for the last page\n if ((currentSpineIndex === readingOrderLength - 1) && (pageIndex === numberOfPages - 1) && totalProgress > 0.99) {\n return 1\n }\n\n return totalProgress\n }\n\n const getTotalProgressFromPercentages = (estimateBeforeThisItem: number, currentItemWeight: number, progressWithinThisItem: number) => {\n return estimateBeforeThisItem + (currentItemWeight * progressWithinThisItem)\n }\n\n const getScrollPercentageWithinItem = (context: Context, currentPosition: { x: number, y: number }, currentItem: SpineItem) => {\n const { height, width } = currentItem.getElementDimensions()\n\n const { topStart, leftStart } = reader.getAbsolutePositionOf(currentItem)\n\n if (context.getSettings().computedPageTurnDirection === `vertical`) {\n return Math.max(0, Math.min(1, ((currentPosition.y - topStart) + context.getVisibleAreaRect().height) / height))\n } else {\n return Math.max(0, Math.min(1, ((currentPosition.x - leftStart) + context.getVisibleAreaRect().width) / width))\n }\n }\n\n return {\n ...reader,\n progression: {\n getPercentageEstimate,\n getScrollPercentageWithinItem\n }\n }\n}\n","import { Enhancer } from \"../types\"\nimport { createResourcesManager } from \"./resourcesManager\"\n\nexport const resourcesEnhancer: Enhancer<{}, {\n\n}> = (next) => (options) => {\n const reader = next(options)\n const resourceManager = createResourcesManager(reader.context)\n\n /**\n * We will serve resources from cache if they exist otherwise fetch it normally.\n * The resource manager use the provided user option to fetch resource if it exists\n */\n const load: typeof reader.load = (manifest, loadOptions) => {\n reader.load(manifest, {\n ...loadOptions\n })\n }\n\n reader.registerHook(`item.onGetResource`, (fetcher) => async (item) => {\n return resourceManager.get(item, fetcher)\n })\n\n const destroy = () => {\n resourceManager.destroy()\n reader.destroy()\n }\n\n return {\n ...reader,\n destroy,\n load\n }\n}\n","const createDatabase = (db: globalThis.IDBDatabase) => {\n const put = (key: string, data: Blob) => {\n return new Promise<void>((resolve, reject) => {\n const transaction = db.transaction([`store`], `readwrite`)\n\n transaction.onerror = function (event) {\n reject(event)\n }\n\n transaction.oncomplete = function () {\n resolve()\n }\n\n const objectStore = transaction.objectStore(`store`)\n const listener = objectStore.put(data, key)\n\n listener.onsuccess = () => {\n resolve()\n }\n\n listener.onerror = (event) => {\n reject(event)\n }\n })\n }\n\n const get = (key: string) => {\n return new Promise<Blob | null>((resolve, reject) => {\n const transaction = db.transaction([`store`], `readwrite`)\n const objectStore = transaction.objectStore(`store`)\n const request = objectStore.get(key)\n\n request.onsuccess = () => {\n let value = request.result\n if (value === undefined) {\n value = null\n }\n resolve(value)\n }\n\n transaction.onerror = function () {\n reject(request.error)\n }\n })\n }\n\n const remove = (key: globalThis.IDBValidKey) => {\n return new Promise<void>((resolve, reject) => {\n const transaction = db.transaction([`store`], `readwrite`)\n\n const objectStore = transaction.objectStore(`store`)\n const request = objectStore.delete(key)\n\n transaction.onerror = function () {\n reject(request.error)\n }\n\n transaction.oncomplete = function () {\n resolve()\n }\n\n // The request will be also be aborted if we've exceeded our storage\n // space.\n transaction.onabort = function () {\n const err = request.error\n ? request.error\n : request.transaction?.error\n reject(err)\n }\n })\n }\n\n const keys = () => {\n return new Promise<globalThis.IDBValidKey[]>((resolve, reject) => {\n const transaction = db.transaction([`store`], `readonly`)\n\n transaction.onerror = function (event) {\n reject(event)\n }\n\n // transaction.oncomplete = function () {\n // resolve()\n // };\n\n const objectStore = transaction.objectStore(`store`)\n const request = objectStore.openKeyCursor()\n const keys: globalThis.IDBValidKey[] = []\n\n request.onsuccess = () => {\n const cursor = request.result\n\n if (!cursor) {\n resolve(keys)\n return\n }\n\n keys.push(cursor.key)\n cursor.continue()\n }\n\n request.onerror = () => {\n reject(request.error)\n }\n })\n }\n\n return {\n put,\n keys,\n get,\n remove\n }\n}\n\nexport const openDatabase = async (name: string) => {\n return new Promise<ReturnType<typeof createDatabase>>((resolve, reject) => {\n const request = window.indexedDB.open(name)\n\n request.onerror = function (event) {\n reject(event)\n }\n\n request.onsuccess = function () {\n resolve(createDatabase(request.result))\n }\n\n request.onupgradeneeded = () => {\n request.result.createObjectStore(`store`)\n }\n })\n}\n","/**\n * @todo web worker\n */\nimport { EMPTY, forkJoin, from, merge, Subject } from \"rxjs\"\nimport { catchError, map, mergeMap, switchMap, takeUntil, tap } from \"rxjs/operators\"\nimport { Context } from \"../../context\"\nimport { Report } from \"../../report\"\nimport { Manifest } from \"../../types\"\nimport { openDatabase } from \"./indexedDB\"\n\nexport const createResourcesManager = (context: Context) => {\n let uniqueID = Date.now().toString()\n const cache$ = new Subject<{ id: number | Pick<Manifest[`spineItems`][number], `id`>, data: Response }>()\n\n const retrieveItem = (itemIndexOrId: number | Pick<Manifest[`spineItems`][number], `id`>) => {\n if (typeof itemIndexOrId === `string` || typeof itemIndexOrId === `object`) {\n const id = typeof itemIndexOrId === `object` ? itemIndexOrId.id : undefined\n return context.getManifest()?.spineItems.find((entry) => entry.id === id)\n } else {\n return context.getManifest()?.spineItems[itemIndexOrId]\n }\n }\n\n const get = async (itemIndexOrId: number | Pick<Manifest[`spineItems`][number], `id`>, fetchResource?: (item: Manifest[`spineItems`][number]) => Promise<Response>) => {\n const item = retrieveItem(itemIndexOrId)\n\n if (!item) return new Response(`Item not found`, { status: 404 })\n\n const db = await openDatabase(`prose-reader`)\n const cacheData = await db.get(`${uniqueID}_${item.id}`)\n\n if (cacheData) {\n return new Response(cacheData, { status: 200 })\n }\n\n const data = (fetchResource && await fetchResource(item)) || await fetch(item.href)\n\n cache(item, data.clone())\n\n return data\n }\n\n const cache = (itemIndexOrId: number | Pick<Manifest[`spineItems`][number], `id`>, data: Response) => {\n cache$.next({ id: itemIndexOrId, data })\n }\n\n cache$.asObservable()\n .pipe(\n mergeMap(({ id, data }) => {\n const item = retrieveItem(id)\n\n if (!item) return EMPTY\n\n return from(forkJoin([openDatabase(`prose-reader`), from(data.blob())]))\n .pipe(\n switchMap(([db, blob]) => {\n return from(db.put(`${uniqueID}_${item.id}`, blob))\n }),\n catchError(error => {\n Report.error(error)\n\n return EMPTY\n })\n )\n }),\n takeUntil(context.$.destroy$)\n )\n .subscribe()\n\n const onLoad$ = context.$.load$\n .pipe(\n tap(() => {\n uniqueID = Date.now().toString()\n })\n )\n\n /**\n * Cleanup old cache on startup if needed\n * @todo\n * do on first time and only then on subsequent load\n */\n merge(onLoad$)\n .pipe(\n switchMap(() => {\n Report.log(`Cleanup up old cache...`)\n\n return from(openDatabase(`prose-reader`))\n .pipe(\n switchMap(db =>\n from(db.keys())\n .pipe(\n map(keys => keys.filter(key => !key.toString().startsWith(uniqueID))),\n switchMap((keysToRemove) => {\n const promises = keysToRemove.map(key => db.remove(key))\n\n return from(Promise.all(promises))\n })\n )\n ),\n catchError(error => {\n Report.error(error)\n\n return EMPTY\n })\n )\n }),\n takeUntil(context.$.destroy$)\n )\n .subscribe()\n\n const destroy = () => {\n cache$.complete()\n }\n\n return {\n get,\n destroy\n }\n}\n","import { Enhancer } from \"./types\"\n\nconst defaultThemes = [\n {\n name: `bright` as const,\n backgroundColor: `white`\n },\n {\n name: `sepia` as const,\n backgroundColor: `#eaddc7`,\n foregroundColor: `black`\n },\n {\n name: `night` as const,\n backgroundColor: `#191717`,\n foregroundColor: `#f1ebeb`\n }\n]\n\nexport type Theme = (typeof defaultThemes[number])[`name`]\n\nexport const themeEnhancer: Enhancer<{\n theme?: Theme,\n}, {\n setTheme: (theme: Theme | undefined) => void,\n getTheme: () => Theme | undefined,\n}> = (next) => (options) => {\n const { theme } = options\n const reader = next(options)\n let currentTheme = theme\n\n const getStyle = () => {\n const foundTheme = defaultThemes.find(entry => entry.name === currentTheme)\n\n return `\n body {\n ${foundTheme !== undefined\n ? `background-color: ${foundTheme.backgroundColor} !important;`\n : ``}\n }\n ${foundTheme?.foregroundColor\n ? `\n body * {\n ${/*\n Ideally, we would like to use !important but it could break publisher specific\n cases\n */``}\n color: ${foundTheme.foregroundColor};\n }\n `\n : ``}\n `\n }\n\n const applyChangeToSpineItemElement = ({ container, loadingElement }: { container: HTMLElement, loadingElement: HTMLElement }) => {\n const foundTheme = defaultThemes.find(entry => entry.name === currentTheme)\n if (foundTheme) {\n container.style.setProperty(`background-color`, foundTheme.backgroundColor)\n loadingElement.style.setProperty(`background-color`, foundTheme.backgroundColor)\n }\n }\n\n const applyChangeToSpineItem = () => {\n reader.manipulateSpineItems(({ removeStyle, addStyle, container, loadingElement }) => {\n removeStyle(`prose-reader-theme`)\n addStyle(`prose-reader-theme`, getStyle())\n applyChangeToSpineItemElement({ container, loadingElement })\n\n return false\n })\n }\n\n /**\n * Make sure to apply theme on item load\n */\n reader.registerHook(`item.onLoad`, ({ removeStyle, addStyle }) => {\n removeStyle(`prose-reader-theme`)\n addStyle(`prose-reader-theme`, getStyle())\n })\n\n /**\n * Make sure to apply theme on item container (fixed layout)\n * & loading element\n */\n reader.registerHook(`item.onCreated`, applyChangeToSpineItemElement)\n\n return {\n ...reader,\n setTheme: (theme: Theme | undefined) => {\n currentTheme = theme\n applyChangeToSpineItem()\n },\n getTheme: () => currentTheme\n }\n}\n","import { Enhancer } from \"./types\"\nimport { isHtmlElement } from \"../utils/dom\"\n\nexport const utilsEnhancer: Enhancer<{}, {\n utils: {\n isOrIsWithinValidLink: (target: Event[`target`]) => boolean\n }\n}> = (next) => (options) => {\n const reader = next(options)\n\n const isOrIsWithinValidLink = (target: Event[`target`]) => {\n if (isHtmlElement(target)) {\n const link = target.nodeName === `a` ? target : target.closest(`a`)\n if (link?.getAttribute(`href`)) {\n return true\n }\n }\n\n return false\n }\n\n return {\n ...reader,\n utils: {\n isOrIsWithinValidLink\n }\n }\n}\n","import { Enhancer } from \"./types\"\n\n/**\n * Ideally we want to target all webkit browser but afaik there are no reliable way to do it.\n * We will fix at least safari\n */\nconst IS_SAFARI = navigator.userAgent.indexOf(``) > -1 && navigator.userAgent.indexOf(`Chrome`) <= -1\n\n/**\n * All fixes relative to webkit\n */\nexport const webkitEnhancer: Enhancer<{}, {\n\n}> = (next) => (options) => {\n /**\n * These hooks are used to fix the flickering on safari that occurs when using transform\n * and more generally GPU transformation. I am not sure what is the impact on performance so\n * we only use them on needed engine (webkit).\n */\n const transformFlickerFixHooks: typeof options[`hooks`] = [\n {\n name: `spine.onBeforeContainerCreated`,\n fn: element => {\n element.style.cssText = `\n ${element.style.cssText}\n -webkit-transform-style: preserve-3d;\n `\n\n return element\n }\n },\n {\n name: `item.onBeforeContainerCreated`,\n fn: element => {\n element.style.cssText = `\n ${element.style.cssText}\n -webkit-transform-style: preserve-3d;\n -webkit-backface-visibility: hidden;\n `\n\n return element\n }\n }\n ]\n\n const reader = next({\n ...options,\n ...IS_SAFARI && {\n hooks: [...options.hooks || [], ...transformFlickerFixHooks]\n }\n })\n\n return reader\n}\n","import { Enhancer } from \"./types\"\n\nconst SHOULD_NOT_LAYOUT = false\n\n/**\n *\n */\nexport const zoomEnhancer: Enhancer<{}, {\n zoom: {\n enter: (imgElement: HTMLImageElement) => void\n exit: () => void,\n move: (position: { x: number, y: number } | undefined, details: { isFirst: boolean, isLast: boolean }) => void,\n isEnabled: () => boolean,\n scale: (scale: number) => void,\n }\n}> = (next) => (options) => {\n const reader = next(options)\n let imageMagnifierContainer: HTMLDivElement | undefined\n let imgLastPosition: { x: number, y: number } = { x: 0, y: 0 }\n let movingLastDelta: { x: number, y: number } | undefined = { x: 0, y: 0 }\n let lastScale = 1\n\n const enter = (imgElement: HTMLImageElement) => {\n reader.manipulateContainer((container) => {\n imageMagnifierContainer = container.ownerDocument.createElement(`div`)\n imageMagnifierContainer.style.cssText = `\n top: 0;\n left: 0;\n display: block;\n position: absolute;\n z-index: 1;\n background: black;\n width: 100%;\n height: 100%;\n `\n const clonedImgElement = imgElement.cloneNode() as HTMLImageElement\n clonedImgElement.src = imgElement.src\n clonedImgElement.style.setProperty(`height`, `100%`)\n clonedImgElement.style.setProperty(`width`, `100%`)\n clonedImgElement.style.setProperty(`object-fit`, `contain`)\n // convenient so that user does not trigger zoom again if for example he is listening to press\n // on img element. Any press event on the zoom container will not have the img as target.\n clonedImgElement.style.setProperty(`pointer-events`, `none`)\n\n imageMagnifierContainer.appendChild(clonedImgElement)\n container.appendChild(imageMagnifierContainer)\n\n imgLastPosition = { x: 0, y: 0 }\n lastScale = 1\n\n return SHOULD_NOT_LAYOUT\n })\n }\n\n const exit = () => {\n reader.manipulateContainer(() => {\n imageMagnifierContainer?.remove()\n imageMagnifierContainer = undefined\n\n return SHOULD_NOT_LAYOUT\n })\n }\n\n const move = (delta: { x: number, y: number } | undefined, { isFirst, isLast }: { isFirst: boolean, isLast: boolean }) => {\n const imgElement = imageMagnifierContainer?.querySelector(`img`)\n\n if (isFirst) {\n movingLastDelta = { x: 0, y: 0 }\n }\n\n if (delta) {\n const correctedX = delta.x - (movingLastDelta?.x || 0)\n const correctedY = delta.y - (movingLastDelta?.y || 0)\n\n imgLastPosition = { x: imgLastPosition.x + correctedX, y: imgLastPosition.y + correctedY }\n\n imgElement?.style.setProperty(`transform`, `translate3d(${imgLastPosition.x}px, ${imgLastPosition.y}px, 0px) scale3d(${lastScale}, ${lastScale}, 1)`)\n\n movingLastDelta = delta\n }\n\n if (isLast) {\n movingLastDelta = undefined\n }\n }\n\n const scale = (scale: number) => {\n const imgElement = imageMagnifierContainer?.querySelector(`img`)\n const roundedScale = Math.ceil(scale * 100) / 100\n const newScale = Math.max(roundedScale, 1)\n\n // if user zoom out that much, we reset img position\n if (roundedScale < 1) {\n imgLastPosition = { x: 0, y: 0 }\n }\n\n imgElement?.style.setProperty(`transform`, `translate3d(${imgLastPosition.x}px, ${imgLastPosition.y}px, 0px) scale3d(${newScale}, ${newScale}, 1)`)\n lastScale = newScale\n }\n\n const isEnabled = () => !!imageMagnifierContainer\n\n const destroy = () => {\n imageMagnifierContainer?.remove()\n imageMagnifierContainer = undefined\n reader.destroy()\n }\n\n return {\n ...reader,\n destroy,\n zoom: {\n enter,\n exit,\n move,\n isEnabled,\n scale\n }\n }\n}\n","import { __UNSAFE_REFERENCE_ORIGINAL_IFRAME_EVENT_KEY } from \"./constants\"\n\nexport const createRemoveStyleHelper = (frameElement: HTMLIFrameElement | undefined) => (id: string) => {\n if (\n frameElement &&\n frameElement.contentDocument &&\n frameElement.contentDocument.head\n ) {\n const styleElement = frameElement.contentDocument.getElementById(id)\n if (styleElement) {\n styleElement.remove()\n }\n }\n}\n\nexport const createAddStyleHelper = (frameElement: HTMLIFrameElement | undefined) => (id: string, style: string, prepend = false) => {\n if (\n frameElement &&\n frameElement.contentDocument &&\n frameElement.contentDocument.head\n ) {\n const userStyle = document.createElement(`style`)\n userStyle.id = id\n userStyle.innerHTML = style\n if (prepend) {\n frameElement.contentDocument.head.prepend(userStyle)\n } else {\n frameElement.contentDocument.head.appendChild(userStyle)\n }\n }\n}\n\nexport const getAttributeValueFromString = (string: string, key: string) => {\n const regExp = new RegExp(key + `\\\\s*=\\\\s*([0-9.]+)`, `i`)\n const match = string.match(regExp) || []\n const firstMatch = match[1] || `0`\n\n return (match && parseFloat(firstMatch)) || 0\n}\n\nexport const getOriginalFrameEventFromDocumentEvent = <E extends Event>(event: E): E | undefined => {\n // @ts-ignore\n return event[__UNSAFE_REFERENCE_ORIGINAL_IFRAME_EVENT_KEY]\n}\n\nexport const attachOriginalFrameEventToDocumentEvent = <E extends Event>(event: E, frameEvent: E) => {\n Object.defineProperty(event, __UNSAFE_REFERENCE_ORIGINAL_IFRAME_EVENT_KEY, { value: frameEvent, enumerable: true })\n}\n","import { createReaderWithEnhancer as createReader, Reader } from './createReaderWithEnhancer'\nimport { createSelection } from './selection'\nexport { compose } from './utils/compose'\nexport { Enhancer } from './enhancers/types'\nexport { ComposeEnhancer } from './enhancers/composeEnhancer'\n\nexport { Manifest } from './types'\n\nexport {\n createReader,\n Reader\n}\n\nexport type ReaderSelection = ReturnType<typeof createSelection>\n\nexport { Report } from './report'\n\nexport { composeEnhancer } from './enhancers/composeEnhancer'\nexport { groupBy } from './utils/objects'\n","import { Subject } from \"rxjs\"\nimport { Context } from \"./context\"\nimport { SpineItem } from \"./spineItem\"\nimport { SpineItemManager } from \"./spineItemManager\"\nimport { Report } from \"./report\"\n\nconst NAMESPACE = `pagination`\n\nexport const createPagination = ({ context }: { context: Context, spineItemManager: SpineItemManager }) => {\n const subject = new Subject<{ event: `change` }>()\n let beginPageIndex: number | undefined\n let beginNumberOfPages = 0\n let beginCfi: string | undefined\n let beginSpineItemIndex: number | undefined\n let endPageIndex: number | undefined\n let endNumberOfPages = 0\n let endCfi: string | undefined\n let endSpineItemIndex: number | undefined\n let numberOfPagesPerItems: number[] = []\n\n const getSpineItemNumberOfPages = (spineItem: SpineItem) => {\n // pre-paginated always are only one page\n // if (!spineItem.isReflowable) return 1\n\n const writingMode = spineItem.spineItemFrame.getWritingMode()\n const { width, height } = spineItem.getElementDimensions()\n\n if (writingMode === `vertical-rl`) {\n return getNumberOfPages(height, context.getPageSize().height)\n }\n\n return getNumberOfPages(width, context.getPageSize().width)\n }\n\n const getInfoForUpdate = (info: {\n spineItem: SpineItem,\n // spineItemPosition: { x: number, y: number },\n pageIndex: number,\n cfi: string | undefined,\n options: {\n isAtEndOfChapter?: boolean,\n // cfi?: string\n }\n }) => {\n const numberOfPages = getSpineItemNumberOfPages(info.spineItem)\n // const pageIndex = spineItemLocator.getSpineItemPageIndexFromPosition(info.spineItemPosition, info.spineItem)\n const cfi: string | undefined = undefined\n\n // @todo update pagination cfi whenever iframe is ready (cause even offset may not change but we still need to get the iframe for cfi)\n // @todo update cfi also whenever a resize occurs in the iframe\n // - load\n // - font loaded\n // - resize\n // future changes would potentially only be resize (easy to track) and font size family change.\n // to track that we can have a hidden text element and track it and send event back\n // console.warn(typeof info.options.cfi)\n // if (info.options.cfi === undefined) {\n // cfi = spineItemLocator.getCfi(pageIndex, info.spineItem)\n // Report.log(`pagination`, `cfi`, pageIndex, cfi)\n // } else {\n // cfi = info.options.cfi\n // }\n\n // cfi = info.options.cfi\n\n return {\n numberOfPages,\n pageIndex: info.pageIndex,\n cfi: info.cfi\n }\n }\n\n return {\n getBeginInfo () {\n return {\n pageIndex: beginPageIndex,\n absolutePageIndex: numberOfPagesPerItems\n .slice(0, beginSpineItemIndex)\n .reduce((acc, numberOfPagesForItem) => acc + numberOfPagesForItem, beginPageIndex ?? 0),\n cfi: beginCfi,\n numberOfPages: beginNumberOfPages,\n spineItemIndex: beginSpineItemIndex\n }\n },\n getEndInfo () {\n return {\n pageIndex: endPageIndex,\n absolutePageIndex: numberOfPagesPerItems\n .slice(0, endSpineItemIndex)\n .reduce((acc, numberOfPagesForItem) => acc + numberOfPagesForItem, endPageIndex ?? 0),\n cfi: endCfi,\n numberOfPages: endNumberOfPages,\n spineItemIndex: endSpineItemIndex\n }\n },\n getTotalNumberOfPages: () => {\n return numberOfPagesPerItems.reduce((acc, numberOfPagesForItem) => acc + numberOfPagesForItem, 0)\n },\n updateTotalNumberOfPages: (spineItems: SpineItem[]) => {\n numberOfPagesPerItems = spineItems.map((item) => {\n return getSpineItemNumberOfPages(item)\n }, 0)\n\n subject.next({ event: `change` })\n },\n updateBeginAndEnd: Report.measurePerformance(`${NAMESPACE} updateBeginAndEnd`, 1, (\n begin: Parameters<typeof getInfoForUpdate>[0] & {\n spineItemIndex: number,\n },\n end: Parameters<typeof getInfoForUpdate>[0] & {\n spineItemIndex: number,\n }\n ) => {\n const beginInfo = getInfoForUpdate(begin)\n const endInfo = getInfoForUpdate(end)\n\n beginPageIndex = beginInfo.pageIndex\n beginNumberOfPages = beginInfo.numberOfPages\n beginCfi = beginInfo.cfi\n beginSpineItemIndex = begin.spineItemIndex\n\n endPageIndex = endInfo.pageIndex\n endNumberOfPages = endInfo.numberOfPages\n endCfi = endInfo.cfi\n endSpineItemIndex = end.spineItemIndex\n\n Report.log(NAMESPACE, `updateBeginAndEnd`, { begin, end, beginCfi, beginSpineItemIndex, endCfi, endSpineItemIndex })\n\n subject.next({ event: `change` })\n }, { disable: true }),\n $: subject.asObservable()\n }\n}\n\nexport type Pagination = ReturnType<typeof createPagination>\n\nexport const getItemOffsetFromPageIndex = (pageWidth: number, pageIndex: number, itemWidth: number) => {\n const lastPageOffset = itemWidth - pageWidth\n const logicalOffset = (itemWidth * (pageIndex * pageWidth)) / itemWidth\n\n return Math.max(0, Math.min(lastPageOffset, logicalOffset))\n}\n\nexport const getNumberOfPages = (itemWidth: number, pageWidth: number) => {\n if ((pageWidth || 0) === 0 || (itemWidth || 0) === 0) return 1\n return Math.floor(Math.max(1, itemWidth / pageWidth))\n}\n\nexport const getClosestValidOffsetFromApproximateOffsetInPages = (offset: number, pageWidth: number, itemWidth: number) => {\n const numberOfPages = getNumberOfPages(itemWidth, pageWidth)\n const offsetValues = [...Array(numberOfPages)].map((_, i) => i * pageWidth)\n\n if (offset >= (numberOfPages * pageWidth)) return offsetValues[offsetValues.length - 1] || 0\n\n return offsetValues.find(offsetRange => offset < (offsetRange + pageWidth)) || 0\n}\n","import { BehaviorSubject, merge, Observable, ObservedValueOf, Subject } from \"rxjs\"\nimport { Report } from \"./report\"\nimport { createContext as createBookContext } from \"./context\"\nimport { createPagination, Pagination } from \"./pagination\"\nimport { createSpine, Spine } from \"./spine/createSpine\"\nimport { LoadOptions, Manifest } from \"./types\"\nimport { __UNSAFE_REFERENCE_ORIGINAL_IFRAME_EVENT_KEY } from \"./constants\"\nimport { takeUntil, tap, distinctUntilChanged, withLatestFrom, mapTo, map } from \"rxjs/operators\"\nimport { createSelection } from \"./selection\"\nimport { createSpineItemManager, SpineItemManager } from \"./spineItemManager\"\nimport { Hook, RegisterHook } from \"./types/Hook\"\nimport { isShallowEqual } from \"./utils/objects\"\n\ntype Context = ReturnType<typeof createBookContext>\ntype ContextSettings = Parameters<Context[`setSettings`]>[0]\n\nconst IFRAME_EVENT_BRIDGE_ELEMENT_ID = `proseReaderIframeEventBridgeElement`\n\ntype CreateReaderOptions = {\n hooks?: Hook[]\n containerElement: HTMLElement,\n} & Pick<\n ContextSettings,\n | `forceSinglePageMode`\n | `pageTurnAnimation`\n | `pageTurnDirection`\n | `pageTurnMode`\n>\n\nexport type Reader = {\n innerPagination: Pagination,\n context: Context,\n registerHook: RegisterHook,\n spine: Spine,\n manipulateSpineItems: Spine[`manipulateSpineItems`],\n manipulateContainer: (cb: (container: HTMLElement, onDestroy: (onDestroyCb: () => void) => void) => boolean) => void,\n moveTo: Spine[`viewportNavigator`][`moveTo`],\n turnLeft: Spine[`viewportNavigator`][`turnLeft`],\n turnRight: Spine[`viewportNavigator`][`turnRight`],\n goToPageOfCurrentChapter: Spine[`viewportNavigator`][`goToPageOfCurrentChapter`],\n goToPage: Spine[`viewportNavigator`][`goToPage`],\n goToUrl: Spine[`viewportNavigator`][`goToUrl`],\n goToCfi: Spine[`viewportNavigator`][`goToCfi`],\n goToSpineItem: Spine[`viewportNavigator`][`goToSpineItem`],\n getFocusedSpineItemIndex: SpineItemManager[`getFocusedSpineItemIndex`],\n getSpineItem: SpineItemManager[`get`],\n getAbsolutePositionOf: SpineItemManager[`getAbsolutePositionOf`],\n getSelection: Spine[`getSelection`],\n isSelecting: Spine[`isSelecting`],\n normalizeEventForViewport: Spine[`normalizeEventForViewport`],\n getCfiMetaInformation: Spine[`cfiLocator`][`getCfiMetaInformation`],\n resolveCfi: Spine[`cfiLocator`][`resolveCfi`],\n generateCfi: Spine[`cfiLocator`][`generateFromRange`],\n locator: Spine[`locator`],\n getCurrentNavigationPosition: Spine[`viewportNavigator`][`getCurrentNavigationPosition`],\n getCurrentViewportPosition: Spine[`viewportNavigator`][`getCurrentViewportPosition`],\n layout: () => void,\n load: (manifest: Manifest, loadOptions?: LoadOptions) => void,\n destroy: () => void,\n setSettings: Context[`setSettings`],\n $: {\n settings$: Context[`$`][`settings$`],\n state$: Observable<{\n supportedPageTurnAnimation: NonNullable<ContextSettings[`pageTurnAnimation`]>[]\n supportedPageTurnMode: NonNullable<ContextSettings[`pageTurnMode`]>[]\n supportedPageTurnDirection: NonNullable<ContextSettings[`pageTurnDirection`]>[]\n supportedComputedPageTurnDirection: NonNullable<ContextSettings[`pageTurnDirection`]>[]\n }>,\n /**\n * Dispatched when the reader has loaded a book and is displayed a book.\n * Using navigation API and getting information about current content will\n * have an effect.\n * It can typically be used to hide a loading indicator.\n */\n ready$: Observable<void>,\n /**\n * Dispatched when a change in selection happens\n */\n selection$: Observable<ReturnType<typeof createSelection> | null>,\n viewportState$: Spine[`$`][`viewportState$`],\n layout$: Spine[`$`][`layout$`],\n destroy$: Observable<void>,\n },\n}\n\nexport const createReader = ({ containerElement, hooks: initialHooks, ...settings }: CreateReaderOptions) => {\n const stateSubject$ = new BehaviorSubject<{\n supportedPageTurnAnimation: NonNullable<ContextSettings[`pageTurnAnimation`]>[]\n supportedPageTurnMode: NonNullable<ContextSettings[`pageTurnMode`]>[]\n supportedPageTurnDirection: NonNullable<ContextSettings[`pageTurnDirection`]>[]\n supportedComputedPageTurnDirection: NonNullable<ContextSettings[`pageTurnDirection`]>[]\n }>({\n supportedPageTurnAnimation: [`fade`, `none`, `slide`],\n supportedPageTurnMode: [`controlled`, `scrollable`],\n supportedPageTurnDirection: [`horizontal`, `vertical`],\n supportedComputedPageTurnDirection: [`horizontal`, `vertical`]\n })\n const readySubject$ = new Subject<void>()\n const destroy$ = new Subject<void>()\n const selectionSubject$ = new Subject<ReturnType<typeof createSelection> | null>()\n const hooksSubject$ = new BehaviorSubject<Hook[]>(initialHooks || [])\n const context = createBookContext(settings)\n const spineItemManager = createSpineItemManager({ context })\n const pagination = createPagination({ context, spineItemManager })\n const element = createWrapperElement(containerElement)\n const iframeEventBridgeElement = createIframeEventBridgeElement(containerElement)\n let containerManipulationOnDestroyCbList: (() => void)[] = []\n const spine = createSpine({\n parentElement: element,\n iframeEventBridgeElement,\n context,\n pagination,\n spineItemManager,\n hooks$: hooksSubject$\n })\n\n containerElement.appendChild(element)\n element.appendChild(iframeEventBridgeElement)\n\n const layout = () => {\n const dimensions = {\n width: containerElement.offsetWidth,\n height: containerElement.offsetHeight\n }\n const margin = 0\n const marginTop = 0\n const marginBottom = 0\n const isReflow = true // @todo\n const containerElementWidth = dimensions.width\n const containerElementEvenWidth =\n containerElementWidth % 2 === 0 || isReflow\n ? containerElementWidth\n : containerElementWidth - 1 // @todo careful with the -1, dunno why it's here yet\n\n element.style.setProperty(`overflow`, `hidden`)\n element.style.height = `${dimensions.height - marginTop - marginBottom}px`\n element.style.width = `${containerElementEvenWidth - 2 * margin}px`\n\n if (margin > 0 || marginTop > 0 || marginBottom > 0) {\n element.style.margin = `${marginTop}px ${margin}px ${marginBottom}px`\n }\n const elementRect = element.getBoundingClientRect()\n\n context.setVisibleAreaRect(\n elementRect.x,\n elementRect.y,\n containerElementEvenWidth,\n dimensions.height\n )\n\n spine.layout()\n }\n\n const load = (\n manifest: Manifest,\n loadOptions: LoadOptions = {}\n ) => {\n if (context.getManifest()) {\n Report.warn(`loading a new book is not supported yet`)\n return\n }\n\n Report.log(`load`, { manifest, loadOptions })\n\n context.load(manifest, loadOptions)\n\n // manifest.readingOrder.forEach((_, index) => resourcesManager.cache(index))\n\n spine.load()\n\n layout()\n\n if (!loadOptions.cfi) {\n spine.viewportNavigator.goToSpineItem(0, { animate: false })\n } else {\n spine.viewportNavigator.goToCfi(loadOptions.cfi, { animate: false })\n }\n\n readySubject$.next()\n }\n\n const registerHook: RegisterHook = (name, fn) => {\n hooksSubject$.next([...hooksSubject$.getValue(), { name, fn } as Hook])\n }\n\n const manipulateContainer = (cb: (container: HTMLElement, onDestroy: (onDestroyCb: () => void) => void) => boolean) => {\n const onDestroy = (onDestroyCb: () => void) => {\n containerManipulationOnDestroyCbList.push(onDestroyCb)\n }\n\n // @todo re-layout based on return\n cb(element, onDestroy)\n }\n\n spine.$.$\n .pipe(\n tap(event => {\n if (event.type === `onSelectionChange`) {\n selectionSubject$.next(event.data)\n }\n }),\n takeUntil(destroy$)\n )\n .subscribe()\n\n merge(\n context.$.load$,\n context.$.settings$,\n context.$.hasVerticalWriting$\n )\n .pipe(\n mapTo(undefined),\n withLatestFrom(context.$.hasVerticalWriting$),\n map(([, hasVerticalWriting]) => {\n const settings = context.getSettings()\n const manifest = context.getManifest()\n\n return {\n hasVerticalWriting,\n renditionFlow: manifest?.renditionFlow,\n renditionLayout: manifest?.renditionLayout,\n computedPageTurnMode: settings.computedPageTurnMode\n }\n }),\n distinctUntilChanged(isShallowEqual),\n map(({ hasVerticalWriting, renditionFlow, renditionLayout, computedPageTurnMode }): ObservedValueOf<typeof stateSubject$> => ({\n ...stateSubject$.value,\n supportedPageTurnMode:\n renditionFlow === `scrolled-continuous`\n ? [`scrollable`]\n : !context.areAllItemsPrePaginated() ? [`controlled`] : [`controlled`, `scrollable`],\n supportedPageTurnAnimation:\n renditionFlow === `scrolled-continuous` || computedPageTurnMode === `scrollable`\n ? [`none`]\n : hasVerticalWriting\n ? [`fade`, `none`]\n : [`fade`, `none`, `slide`],\n supportedPageTurnDirection:\n computedPageTurnMode === `scrollable`\n ? [`vertical`]\n : renditionLayout === `reflowable`\n ? [`horizontal`]\n : [`horizontal`, `vertical`]\n })),\n takeUntil(destroy$)\n )\n .subscribe(stateSubject$)\n\n /**\n * Free up resources, and dispose the whole reader.\n * You should call this method if you leave the reader.\n *\n * This is not possible to use any of the reader features once it\n * has been destroyed. If you need to open a new book you need to\n * either create a new reader or call `load` with a different manifest\n * instead of destroying it.\n */\n const destroy = () => {\n containerManipulationOnDestroyCbList.forEach(cb => cb())\n containerManipulationOnDestroyCbList = []\n hooksSubject$.next([])\n hooksSubject$.complete()\n context.destroy()\n spine?.destroy()\n element.remove()\n iframeEventBridgeElement.remove()\n readySubject$.complete()\n stateSubject$.complete()\n selectionSubject$.complete()\n destroy$.next()\n destroy$.complete()\n }\n\n const reader = {\n innerPagination: pagination,\n context,\n registerHook,\n spine,\n manipulateSpineItems: spine.manipulateSpineItems,\n manipulateContainer,\n moveTo: spine.viewportNavigator.moveTo,\n turnLeft: spine.viewportNavigator.turnLeft,\n turnRight: spine.viewportNavigator.turnRight,\n goToPageOfCurrentChapter: spine.viewportNavigator.goToPageOfCurrentChapter,\n goToPage: spine.viewportNavigator.goToPage,\n goToUrl: spine.viewportNavigator.goToUrl,\n goToCfi: spine.viewportNavigator.goToCfi,\n goToSpineItem: spine.viewportNavigator.goToSpineItem,\n getFocusedSpineItemIndex: spineItemManager.getFocusedSpineItemIndex,\n getSpineItem: spineItemManager.get,\n getAbsolutePositionOf: spineItemManager.getAbsolutePositionOf,\n getSelection: spine.getSelection,\n isSelecting: spine.isSelecting,\n normalizeEventForViewport: spine.normalizeEventForViewport,\n getCfiMetaInformation: spine.cfiLocator.getCfiMetaInformation,\n resolveCfi: spine.cfiLocator.resolveCfi,\n generateCfi: spine.cfiLocator.generateFromRange,\n locator: spine.locator,\n getCurrentNavigationPosition: spine.viewportNavigator.getCurrentNavigationPosition,\n getCurrentViewportPosition: spine.viewportNavigator.getCurrentViewportPosition,\n layout,\n load,\n destroy,\n setSettings: context.setSettings,\n $: {\n settings$: context.$.settings$,\n state$: stateSubject$.asObservable(),\n /**\n * Dispatched when the reader has loaded a book and is displayed a book.\n * Using navigation API and getting information about current content will\n * have an effect.\n * It can typically be used to hide a loading indicator.\n */\n ready$: readySubject$.asObservable(),\n /**\n * Dispatched when a change in selection happens\n */\n selection$: selectionSubject$.asObservable(),\n viewportState$: spine.$.viewportState$,\n layout$: spine.$.layout$,\n destroy$\n },\n __debug: {\n pagination,\n context,\n spineItemManager\n } as any // using any because otherwise ts breaks due to too many types to infer\n }\n\n return reader\n}\n\nconst createWrapperElement = (containerElement: HTMLElement) => {\n const element = containerElement.ownerDocument.createElement(`div`)\n element.style.cssText = `\n background-color: white;\n position: relative;\n `\n\n return element\n}\n\nconst createIframeEventBridgeElement = (containerElement: HTMLElement) => {\n const iframeEventBridgeElement = containerElement.ownerDocument.createElement(`div`)\n iframeEventBridgeElement.id = IFRAME_EVENT_BRIDGE_ELEMENT_ID\n iframeEventBridgeElement.style.cssText = `\n position: absolute;\n height: 100%;\n width: 100%;\n top: 0;\n left: 0;\n z-index: -1;\n `\n\n return iframeEventBridgeElement\n}\n","const ROOT_NAMESPACE = `@prose-reader/core`\n\nconst wrap = (str: string) => `[${str}]`\n\nconst time = (name: string, targetDuration = 0) => {\n let tick = 0\n const t0 = performance.now()\n // const t0 = Date.now()\n // console.time(name)\n\n return () => {\n tick++\n const t1 = performance.now()\n // const t1 = Date.now()\n // console.timeEnd(name)\n Report.logMetric({ name: `${name} - tick ${tick}`, duration: t1 - t0 }, targetDuration)\n }\n}\n\nconst createReport = (namespace?: string) => ({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n log: (...data: any[]) => {\n if (window.__PROSE_READER_DEBUG) {\n // eslint-disable-next-line no-console\n if (namespace) console.log(wrap(ROOT_NAMESPACE), wrap(namespace), ...data)\n else console.log(wrap(ROOT_NAMESPACE), ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n warn: (...data: any[]) => {\n if (window.__PROSE_READER_DEBUG) {\n // eslint-disable-next-line no-console\n if (namespace) console.warn(wrap(ROOT_NAMESPACE), wrap(namespace), ...data)\n else console.warn(wrap(ROOT_NAMESPACE), ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error: (...data: any[]) => {\n // eslint-disable-next-line no-console\n console.error(...data)\n },\n // time: (label?: string | undefined) => {\n // if (window.__PROSE_READER_DEBUG) {\n // // eslint-disable-next-line no-console\n // console.time(`[prose-reader] [metric] ${label}`);\n // }\n // },\n // timeEnd: (label?: string | undefined) => {\n // if (window.__PROSE_READER_DEBUG) {\n // // eslint-disable-next-line no-console\n // console.timeEnd(`[prose-reader] [metric] ${label}`);\n // }\n // },\n time,\n logMetric: (performanceEntry: PerformanceEntry | { name: string; duration: number }, targetDuration = 0) => {\n // const duration = typeof performanceEntry === 'number' ? performanceEntry : performanceEntry.duration;\n if (window.__PROSE_READER_DEBUG) {\n if (performanceEntry.duration <= targetDuration) {\n // eslint-disable-next-line no-console\n // console.log(`[prose-reader] [metric] `, `${performanceEntry.name} took ${duration}ms`);\n } else {\n // eslint-disable-next-line no-console\n console.warn(\n `[prose-reader] [metric] `,\n `${performanceEntry.name} took ${performanceEntry.duration}ms which is above the ${targetDuration}ms target for this function`\n )\n }\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n measurePerformance: <F extends (...args: any[]) => any>(name: string, targetDuration = 10, functionToMeasure: F, { disable }: { disable?: boolean } = {}) => {\n if (disable || !window.__PROSE_READER_DEBUG) return functionToMeasure\n\n return (...args: Parameters<F>): ReturnType<F> => {\n const t0 = performance.now()\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const response = functionToMeasure(...(args as any))\n\n if (response && response.then) {\n return response.then((res: any) => {\n const t1 = performance.now()\n Report.logMetric({ name, duration: t1 - t0 }, targetDuration)\n return res\n })\n }\n\n const t1 = performance.now()\n Report.logMetric({ name, duration: t1 - t0 }, targetDuration)\n\n return response\n }\n }\n})\n\nexport const Report = ({\n ...createReport(),\n namespace: (namespace: string) => createReport(namespace)\n})\n","import { CFI } from \"./cfi\"\nimport { Manifest } from \"./types\"\n\nexport const createSelection = (selection: Selection, item: Manifest[`spineItems`][number]) => {\n const text = selection.toString()\n\n return {\n toString: () => text,\n getAnchorCfi: () => {\n if (selection.anchorNode) {\n return CFI.generate(selection.anchorNode, selection.anchorOffset, `|[prose~anchor~${encodeURIComponent(item.id)}]`)\n }\n },\n getFocusCfi: () => {\n if (selection.focusNode) {\n return CFI.generate(selection.focusNode, selection.focusOffset, `|[prose~anchor~${encodeURIComponent(item.id)}]`)\n }\n }\n }\n}\n","import { BehaviorSubject } from \"rxjs\"\nimport { distinctUntilChanged } from \"rxjs/operators\"\nimport { Manifest } from \"./types\"\nimport { Report } from \"./report\"\nimport { isShallowEqual } from \"./utils/objects\"\n\nexport type PublicSettings = {\n forceSinglePageMode: boolean,\n pageTurnAnimation: `none` | `fade` | `slide`,\n pageTurnAnimationDuration: undefined | number\n pageTurnDirection: `vertical` | `horizontal`,\n pageTurnMode: `controlled` | `scrollable`,\n}\n\n/**\n * Represent the settings that are derived from user settings.\n * Because some of the user settings can sometime be invalid based on some\n * context we need to use the computed one internally.\n * For example if the user decide to use horizontal page turn direction with scrolled content\n * we will overwrite it and force it to vertical (granted we only support vertical).\n */\ntype InnerSettings = PublicSettings & {\n computedPageTurnMode: PublicSettings[`pageTurnMode`],\n computedPageTurnDirection: PublicSettings[`pageTurnDirection`],\n computedPageTurnAnimation: PublicSettings[`pageTurnAnimation`],\n computedPageTurnAnimationDuration: number,\n computedSnapAnimationDuration: number,\n}\n\nexport const createSettings = (initialSettings: Partial<PublicSettings>) => {\n const mergedSettings: InnerSettings = {\n forceSinglePageMode: false,\n pageTurnAnimation: `none`,\n computedPageTurnAnimation: `none`,\n pageTurnDirection: `horizontal`,\n computedPageTurnDirection: `horizontal`,\n pageTurnAnimationDuration: undefined,\n computedPageTurnAnimationDuration: 0,\n pageTurnMode: `controlled`,\n computedPageTurnMode: `controlled`,\n computedSnapAnimationDuration: 300,\n ...initialSettings\n }\n\n updateComputedSettings(undefined, mergedSettings, false)\n\n const settingsSubject$ = new BehaviorSubject(mergedSettings)\n\n const setSettings = (newSettings: Partial<PublicSettings>, options: { hasVerticalWritingSubject: boolean, manifest: Manifest | undefined }) => {\n if (Object.keys(newSettings).length === 0) return\n\n const newMergedSettings = { ...settingsSubject$.value, ...newSettings }\n\n updateComputedSettings(options.manifest, newMergedSettings, options.hasVerticalWritingSubject)\n\n settingsSubject$.next(newMergedSettings)\n }\n\n const recompute = (options: { hasVerticalWritingSubject: boolean, manifest: Manifest | undefined }) => {\n const newMergedSettings = { ...settingsSubject$.value }\n\n updateComputedSettings(options.manifest, newMergedSettings, options.hasVerticalWritingSubject)\n\n settingsSubject$.next(newMergedSettings)\n }\n\n const destroy = () => {\n settingsSubject$.complete()\n }\n\n return {\n getSettings: () => settingsSubject$.value,\n setSettings,\n recompute,\n destroy,\n $: {\n settings$: settingsSubject$\n .asObservable()\n .pipe(distinctUntilChanged(isShallowEqual))\n }\n }\n}\n\nconst areAllItemsPrePaginated = (manifest: Manifest | undefined) => !manifest?.spineItems.some(item => item.renditionLayout === `reflowable`)\n\nconst updateComputedSettings = (newManifest: Manifest | undefined, settings: InnerSettings, hasVerticalWriting: boolean) => {\n settings.computedPageTurnDirection = settings.pageTurnDirection\n settings.computedPageTurnAnimation = settings.pageTurnAnimation\n settings.computedPageTurnMode = `controlled`\n\n // We force scroll mode for some books\n if (newManifest?.renditionFlow === `scrolled-continuous`) {\n settings.computedPageTurnMode = `scrollable`\n settings.computedPageTurnDirection = `vertical`\n } else if (newManifest && settings.pageTurnMode === `scrollable` && (newManifest.renditionLayout !== `pre-paginated` || !areAllItemsPrePaginated(newManifest))) {\n Report.warn(`pageTurnMode ${settings.pageTurnMode} incompatible with current book, switching back to default`)\n settings.computedPageTurnAnimation = `none`\n settings.computedPageTurnMode = `controlled`\n } else if (settings.pageTurnMode === `scrollable`) {\n settings.computedPageTurnMode = `scrollable`\n settings.computedPageTurnDirection = `vertical`\n }\n\n // some settings are not available for vertical writing\n if (hasVerticalWriting && settings.computedPageTurnAnimation === `slide`) {\n Report.warn(`pageTurnAnimation ${settings.computedPageTurnAnimation} incompatible with current book, switching back to default`)\n settings.computedPageTurnAnimation = `none`\n }\n\n // for now we only support animation none for scrollable\n if (settings.computedPageTurnMode === `scrollable`) {\n settings.computedPageTurnAnimationDuration = 0\n settings.computedPageTurnAnimation = `none`\n } else {\n settings.computedPageTurnAnimationDuration = settings.pageTurnAnimationDuration !== undefined\n ? settings.pageTurnAnimationDuration\n : 300\n }\n}\n","import { CFI, extractProseMetadataFromCfi } from \"../cfi\"\nimport { Context } from \"../context\"\nimport { SpineItem } from \"../spineItem\"\nimport { createLocationResolver } from \"../spineItem/locationResolver\"\nimport { SpineItemManager } from \"../spineItemManager\"\nimport { Report } from \"../report\"\nimport { Manifest } from \"../types\"\n\nexport const createCfiLocator = ({ spineItemManager, spineItemLocator }: {\n spineItemManager: SpineItemManager,\n context: Context,\n spineItemLocator: ReturnType<typeof createLocationResolver>\n}) => {\n const getItemAnchor = (spineItem: SpineItem) => `|[prose~anchor~${encodeURIComponent(spineItem.item.id)}]`\n\n /**\n * Heavy cfi hookup. Use it to have a refined, precise cfi anchor. It requires the content to be loaded otherwise\n * it will return a root cfi.\n *\n * @todo optimize\n */\n const getCfi = Report.measurePerformance(`getCfi`, 10, (pageIndex: number, spineItem: SpineItem) => {\n const nodeOrRange = spineItemLocator.getFirstNodeOrRangeAtPage(pageIndex, spineItem)\n const doc = spineItem.spineItemFrame.getManipulableFrame()?.frame?.contentWindow?.document\n\n const itemAnchor = getItemAnchor(spineItem)\n // because the current cfi library does not works well with offset we are just using custom\n // format and do it manually after resolving the node\n // @see https://github.com/fread-ink/epub-cfi-resolver/issues/8\n const offset = `|[prose~offset~${nodeOrRange?.offset || 0}]`\n\n if (nodeOrRange && doc) {\n const cfiString = CFI.generate(nodeOrRange.node, 0, `${itemAnchor}${offset}`)\n\n return cfiString\n }\n\n return getRootCfi(spineItem)\n })\n\n /**\n * Very light cfi lookup. Use it when you need to anchor user to correct item\n * but do not want to have heavy dom lookup. This is useful as pre-cfi before the content\n * is loaded for example.\n */\n const getRootCfi = (spineItem: SpineItem) => {\n const itemAnchor = getItemAnchor(spineItem)\n\n return `epubcfi(/0${itemAnchor}) `\n }\n\n const getSpineItemFromCfi = (cfi: string) => {\n const { itemId } = extractProseMetadataFromCfi(cfi)\n\n if (itemId) {\n const { itemId } = extractProseMetadataFromCfi(cfi)\n const spineItem = (itemId ? spineItemManager.get(itemId) : undefined) || spineItemManager.get(0)\n\n return spineItem\n }\n\n return undefined\n }\n\n const getCfiMetaInformation = (cfi: string) => {\n const spineItem = getSpineItemFromCfi(cfi)\n\n if (spineItem) {\n return {\n spineItemIndex: spineItemManager.getSpineItemIndex(spineItem)\n }\n }\n\n return undefined\n }\n\n /**\n * Returns the node and offset for the given cfi.\n */\n const resolveCfi = (cfiString: string) => {\n if (!cfiString) return undefined\n\n const spineItem = getSpineItemFromCfi(cfiString)\n const spineItemIndex = spineItemManager.getSpineItemIndex(spineItem) || 0\n\n if (!spineItem) return undefined\n\n const { cleanedCfi, offset } = extractProseMetadataFromCfi(cfiString)\n const cfi = new CFI(cleanedCfi, {})\n\n const doc = spineItem.spineItemFrame.getManipulableFrame()?.frame?.contentWindow?.document\n\n if (doc) {\n try {\n const { node, offset: resolvedOffset } = cfi.resolve(doc, {})\n\n return { node, offset: offset ?? resolvedOffset, spineItemIndex }\n } catch (e) {\n Report.error(e)\n return undefined\n }\n }\n\n return undefined\n }\n\n // const resolveCfi = (cfi: string) => {\n // const { spineItemIndex = -1 } = getCfiMetaInformation(cfi) || {}\n // const spineItem = spineItemManager.get(spineItemIndex)\n\n // if (spineItem) {\n // let position: { x: number, y: number } | undefined = undefined\n // const { node, offset = 0 } = spineItemLocator.resolveCfi(cfi, spineItem) || {}\n // if (node) {\n // position = spineItemLocator.getSpineItemPositionFromNode(node, offset, spineItem)\n // }\n // const pageIndex = position ? spineItemLocator.getSpineItemPageIndexFromPosition(position, spineItem) : undefined\n\n // return {\n // spineItemIndex,\n // pageIndex,\n // node,\n // offset,\n // }\n // }\n\n // return undefined\n // }\n\n /**\n * @todo the package does not support creating for range at the moment @see https://github.com/fread-ink/epub-cfi-resolver/issues/3\n * so we use two cfi for start and end.\n */\n const generateFromRange = ({ startNode, start, end, endNode }: { startNode: Node, start: number, endNode: Node, end: number }, item: Manifest[`spineItems`][number]) => {\n const startCFI = CFI.generate(startNode, start, `|[prose~anchor~${encodeURIComponent(item.id)}]`)\n const endCFI = CFI.generate(endNode, end, `|[prose~anchor~${encodeURIComponent(item.id)}]`)\n\n return { start: startCFI, end: endCFI }\n }\n\n return {\n getSpineItemFromCfi,\n getCfiMetaInformation,\n getCfi,\n getRootCfi,\n resolveCfi,\n generateFromRange\n }\n}\n","import { animationFrameScheduler, BehaviorSubject, EMPTY, interval, merge, Subject, Subscription } from \"rxjs\"\nimport { catchError, debounce, debounceTime, distinctUntilChanged, filter, map, share, skip, switchMap, take, takeUntil, tap } from \"rxjs/operators\"\nimport { Report } from \"../report\"\nimport { Context } from \"../context\"\nimport { createViewportNavigator } from \"./viewportNavigator/viewportNavigator\"\nimport { Pagination } from \"../pagination\"\nimport { createSpineItem } from \"../spineItem\"\nimport { createLocationResolver as createSpineItemLocator } from \"../spineItem/locationResolver\"\nimport { SpineItemManager } from \"../spineItemManager\"\nimport { createLocationResolver } from \"./locationResolver\"\nimport { createCfiLocator } from \"./cfiLocator\"\nimport { createEventsHelper } from \"./eventsHelper\"\nimport { createSelection } from \"../selection\"\nimport { ViewportNavigationEntry } from \"./navigationResolver\"\nimport { isShallowEqual } from \"../utils/objects\"\nimport { Hook } from \"../types/Hook\"\nimport { mapKeysTo } from \"../utils/rxjs\"\n\nconst NAMESPACE = `spine`\n\ntype SpineItem = ReturnType<typeof createSpineItem>\ntype RequireLayout = boolean\ntype ManipulableSpineItemCallback = Parameters<SpineItem[`manipulateSpineItem`]>[0]\ntype ManipulableSpineItemCallbackPayload = Parameters<ManipulableSpineItemCallback>[0]\n\ntype Event = { type: `onSelectionChange`, data: ReturnType<typeof createSelection> | null }\n\nexport const createSpine = ({ parentElement, context, pagination, iframeEventBridgeElement, spineItemManager, hooks$ }: {\n parentElement: HTMLElement,\n iframeEventBridgeElement: HTMLElement,\n context: Context,\n pagination: Pagination,\n spineItemManager: SpineItemManager,\n hooks$: BehaviorSubject<Hook[]>\n}) => {\n const layoutSubject$ = new Subject<void>()\n const subject = new Subject<Event>()\n const doc = parentElement.ownerDocument\n const containerElement = createContainerElement(doc, hooks$)\n parentElement.appendChild(containerElement)\n const spineItemLocator = createSpineItemLocator({ context })\n const locator = createLocationResolver({ context, spineItemManager, spineItemLocator })\n const cfiLocator = createCfiLocator({ spineItemManager, context, spineItemLocator })\n const viewportNavigator = createViewportNavigator({ context, pagination, spineItemManager, element: containerElement, cfiLocator, locator, hooks$ })\n const eventsHelper = createEventsHelper({ context, spineItemManager, iframeEventBridgeElement, locator })\n let selectionSubscription: Subscription | undefined\n\n const load = () => {\n context.getManifest()?.spineItems.map(async (resource) => {\n const spineItem = createSpineItem({\n item: resource,\n containerElement: containerElement,\n iframeEventBridgeElement,\n context,\n hooks$,\n viewportState$: viewportNavigator.$.state$\n })\n spineItemManager.add(spineItem)\n })\n hooks$.getValue().forEach(hook => {\n if (hook.name === `item.onCreated`) {\n spineItemManager.getAll().forEach(item => hook.fn({ container: item.element, loadingElement: item.loadingElement }))\n }\n })\n }\n\n const manipulateSpineItems = (cb: (payload: ManipulableSpineItemCallbackPayload & { index: number }) => RequireLayout) => {\n let shouldLayout = false\n spineItemManager.getAll().forEach((item, index) => {\n shouldLayout = item.manipulateSpineItem((opts) => cb({ index, ...opts })) || shouldLayout\n })\n\n if (shouldLayout) {\n spineItemManager.layout()\n }\n }\n\n /**\n * Watch for settings update that require changes\n * on this layer.\n *\n * @important\n * Try not to have duplicate with other lower components that also listen to settings change and re-layout\n * on the same settings.\n */\n const layoutOnSettingChanges$ = context.$.settings$\n .pipe(\n mapKeysTo([`computedPageTurnDirection`, `computedPageTurnMode`]),\n distinctUntilChanged(isShallowEqual),\n skip(1)\n )\n\n const waitForViewportFree$ = viewportNavigator.$.state$.pipe(filter(v => v === `free`), take(1))\n\n const layout$ = merge(layoutSubject$, layoutOnSettingChanges$)\n .pipe(\n tap(() => {\n if (context.getSettings().computedPageTurnMode === `scrollable`) {\n containerElement.style.overflow = `hidden`\n containerElement.style.overflowY = `scroll`\n } else {\n containerElement.style.removeProperty(`overflow`)\n containerElement.style.removeProperty(`overflowY`)\n }\n\n viewportNavigator.layout()\n spineItemManager.layout()\n }),\n share()\n )\n\n layout$\n .pipe(\n takeUntil(context.$.destroy$)\n )\n .subscribe()\n\n /**\n * This adjustment is used to update the pagination with the most up to date values we can.\n * It needs to be ran only when viewport is free because some operation such as looking up cfi can\n * be really heavy.\n *\n * The cfi will only be updated if it needs to be:\n * - cfi is a root target\n * - cfi is undefined\n * - items are different\n */\n const adjustPagination$ = (position: ViewportNavigationEntry) => {\n return waitForViewportFree$\n .pipe(\n tap(Report.measurePerformance(`${NAMESPACE} adjustPagination`, 1, () => {\n const spineItemsFromPosition = locator.getSpineItemsFromReadingOrderPosition(position)\n const beginSpineItem = spineItemsFromPosition ? spineItemManager.get(spineItemsFromPosition.begin) : undefined\n const endSpineItem = spineItemsFromPosition ? spineItemManager.get(spineItemsFromPosition.end) : undefined\n const beginLastCfi = pagination.getBeginInfo().cfi\n const endLastCfi = pagination.getEndInfo().cfi\n\n const shouldUpdateBeginCfi =\n pagination.getBeginInfo().spineItemIndex !== spineItemsFromPosition?.begin ||\n beginLastCfi === undefined ||\n beginLastCfi?.startsWith(`epubcfi(/0`)\n\n const shouldUpdateEndCfi =\n pagination.getEndInfo().spineItemIndex !== spineItemsFromPosition?.end ||\n endLastCfi === undefined ||\n endLastCfi?.startsWith(`epubcfi(/0`)\n\n if (beginSpineItem && endSpineItem && spineItemsFromPosition) {\n const beginPosition = locator.getSpineItemPositionFromSpinePosition(spineItemsFromPosition.beginPosition, beginSpineItem)\n const beginPageIndex = spineItemLocator.getSpineItemPageIndexFromPosition(beginPosition, beginSpineItem)\n const endPosition = locator.getSpineItemPositionFromSpinePosition(spineItemsFromPosition.endPosition, endSpineItem)\n const endPageIndex = spineItemLocator.getSpineItemPageIndexFromPosition(endPosition, endSpineItem)\n\n pagination.updateBeginAndEnd({\n spineItem: beginSpineItem,\n spineItemIndex: spineItemManager.getSpineItemIndex(beginSpineItem) ?? 0,\n pageIndex: spineItemLocator.getSpineItemPageIndexFromPosition(beginPosition, beginSpineItem),\n cfi: shouldUpdateBeginCfi ? cfiLocator.getCfi(beginPageIndex, beginSpineItem) : beginLastCfi,\n options: {\n isAtEndOfChapter: false\n }\n }, {\n spineItem: endSpineItem,\n spineItemIndex: spineItemManager.getSpineItemIndex(endSpineItem) ?? 0,\n pageIndex: spineItemLocator.getSpineItemPageIndexFromPosition(endPosition, endSpineItem),\n cfi: shouldUpdateEndCfi ? cfiLocator.getCfi(endPageIndex, endSpineItem) : endLastCfi,\n options: {\n isAtEndOfChapter: false\n }\n })\n }\n\n Report.log(NAMESPACE, `adjustPagination$`)\n }, { disable: true }))\n )\n }\n\n /**\n * Use cases covered by this observer\n * - Layout changed for items\n * - viewport is free\n * - we adjust the navigation\n * - we update the pagination\n * - viewport is busy (ongoing navigation, animation, etc)\n * - we wait for viewport free\n * - we adjust pagination\n * - we update pagination\n *\n * Once navigation is adjusted we update the pagination regardless if the\n * adjustment was needed or not. This is because the layout may have change. In some case, the content\n * may have changed but by change the viewport position is still the same. It does not mean the actual content\n * is the same.\n *\n * @important\n * Adjustment and pagination update are cancelled as soon as another navigation happens. (it will already be handled there).\n * adjustNavigation$ can trigger a navigation if adjustment is needed which will in term cancel the inner stream.\n *\n * @todo\n * Right now we react to literally every layout and some time we might not need to update pagination (ex pre-paginated element got unload).\n * Maybe we should only listen to current items visible only ?\n */\n const adjustNavigationAfterLayout$ = spineItemManager.$.layout$\n .pipe(\n /**\n * @important\n * Careful with using debounce / throttle here since it can decrease user experience\n * when layout happens it can means an item before the current one has been unloaded, at current code\n * we unload and size back each item to the screen so it will have the effect of flicker for user.\n * Consider this workflow:\n * - user navigate to page 2\n * - viewport move to item 2\n * - page 1 unload and goes back from 2000px to 500px\n * - layout triggered\n * - viewport is now on an item far after item 2 because item 1 shrink (PROBLEM)\n * - sometime after viewport is adjusted back to item 2.\n *\n * Two solution to fix this issue:\n * - maybe later try to implement a different strategy and never shrink back item unless they are loaded\n * - do not use debounce / throttle and navigate back to the item right on the same tick\n */\n // debounceTime(10, animationFrameScheduler),\n switchMap(() =>\n waitForViewportFree$\n .pipe(\n switchMap(() => {\n const focusedSpineItem = spineItemManager.getFocusedSpineItem()\n\n if (!focusedSpineItem) return EMPTY\n\n return viewportNavigator.adjustNavigation(focusedSpineItem)\n }),\n takeUntil(viewportNavigator.$.navigation$)\n )\n ),\n share()\n )\n\n merge(\n adjustNavigationAfterLayout$\n .pipe(\n switchMap(({ adjustedSpinePosition }) => {\n return adjustPagination$(adjustedSpinePosition)\n .pipe(\n takeUntil(viewportNavigator.$.navigation$)\n )\n })\n ),\n spineItemManager.$.layout$\n .pipe(\n debounceTime(10, animationFrameScheduler),\n tap(() => {\n pagination.updateTotalNumberOfPages(spineItemManager.getAll())\n })\n )\n )\n .pipe(\n takeUntil(context.$.destroy$)\n )\n .subscribe()\n\n merge(\n spineItemManager.$.focus$\n .pipe(\n tap((event) => {\n // @todo track tail as well (selection, finger etc)\n\n const spineItem = event.data\n const fingerTracker$ = spineItem.fingerTracker.$\n const selectionTracker$ = spineItem.selectionTracker.$\n\n selectionSubscription?.unsubscribe()\n selectionSubscription = merge(\n selectionTracker$\n .pipe(\n filter(event => event.event === `selectionchange`),\n tap(event => {\n subject.next({ type: `onSelectionChange`, data: event.data ? createSelection(event.data, spineItem.item) : null })\n })\n ),\n selectionTracker$\n .pipe(\n filter(({ event }) => event === `selectstart`),\n switchMap(_ => fingerTracker$\n .pipe(\n filter(({ event }) => event === `fingermove`),\n debounce(() => interval(1000)),\n takeUntil(fingerTracker$\n .pipe(\n filter(({ event }) => event === `fingerout`),\n tap(() => {\n\n })\n )\n ),\n tap(({ data }) => {\n // console.log(data)\n if (data) {\n // const fingerPosition = translateFramePositionIntoPage(context, pagination, data, spineItem)\n // if (fingerPosition.x >= context.getPageSize().width) {\n // viewportNavigator.turnRight({ allowSpineItemChange: false })\n // } else if (fingerPosition.x <= context.getPageSize().width) {\n // viewportNavigator.turnLeft({ allowSpineItemChange: false })\n // }\n }\n })\n )\n )\n )\n )\n .subscribe()\n }),\n catchError(e => {\n Report.error(e)\n\n return EMPTY\n }),\n takeUntil(context.$.destroy$)\n )\n )\n .subscribe()\n\n const itemUpdateOnNavigation$ = viewportNavigator.$.navigation$\n .pipe(\n tap((data) => {\n const time = Report.time(`${NAMESPACE} navigation`, 1)\n const currentSpineItem = spineItemManager.getFocusedSpineItem()\n const spineItemsFromPosition = locator.getSpineItemsFromReadingOrderPosition(data.position)\n let beginSpineItem = spineItemsFromPosition ? spineItemManager.get(spineItemsFromPosition.begin) : undefined\n let endSpineItem = spineItemsFromPosition ? spineItemManager.get(spineItemsFromPosition.end) : undefined\n beginSpineItem = beginSpineItem || currentSpineItem\n endSpineItem = endSpineItem || currentSpineItem\n\n // In theory the item to focus should be either begin or end. This is because the navigation should at least take us on top\n // of it. However this is the theory, due to wrong layout / missing adjustment it could be different.\n // In case of no item to focus is detected we will just fallback to 0\n const spineItemToFocus = data.position.spineItem || beginSpineItem\n\n if (spineItemToFocus && spineItemToFocus !== currentSpineItem) {\n spineItemManager.focus(spineItemToFocus)\n } else if (!spineItemToFocus) {\n // we default to item 0 so if anything wrong happens during navigation we can fallback to a valid item\n spineItemManager.focus(0)\n }\n\n if (spineItemToFocus && beginSpineItem && endSpineItem && spineItemsFromPosition) {\n const lastExpectedNavigation = viewportNavigator.getLastUserExpectedNavigation()\n const beginItemIndex = spineItemManager.getSpineItemIndex(beginSpineItem) ?? 0\n const beginPosition = locator.getSpineItemPositionFromSpinePosition(spineItemsFromPosition.beginPosition, beginSpineItem)\n const beginPageIndex = spineItemLocator.getSpineItemPageIndexFromPosition(beginPosition, beginSpineItem)\n const endPosition = locator.getSpineItemPositionFromSpinePosition(spineItemsFromPosition.endPosition, endSpineItem)\n const endPageIndex = spineItemLocator.getSpineItemPageIndexFromPosition(endPosition, endSpineItem)\n const endItemIndex = spineItemManager.getSpineItemIndex(endSpineItem) ?? 0\n\n pagination.updateBeginAndEnd({\n spineItem: beginSpineItem,\n spineItemIndex: beginItemIndex,\n pageIndex: beginPageIndex,\n /**\n * Because the start of a navigation may involve animations and interactions we don't resolve heavy CFI here.\n * We do want to have certain information correct in the pagination right after a navigation (same tick) but we just\n * defer heavy non vital stuff for later.\n * There are only 4 different cfi update at this stage:\n * - navigation comes from cfi, we simply affect the cfi to the pagination\n * - navigation comes from adjustment with controlled mode, we don't update the cfi, just pass the previous one\n * - navigation comes from adjustment with free mode, we will update with root cfi if needed because we could be on new page\n * - navigation is not from adjustment, this means we are on either new page or new reading item, we use light cfi with root (no dom lookup)\n *\n * The cfi is later adjusted with heavy dom lookup once the viewport is free.\n */\n cfi: lastExpectedNavigation?.type === `navigate-from-cfi` && spineItemToFocus === beginSpineItem\n ? lastExpectedNavigation.data\n : data.triggeredBy === `adjust` && context.getSettings().computedPageTurnMode === `controlled`\n ? pagination.getBeginInfo().cfi\n : beginItemIndex !== pagination.getBeginInfo().spineItemIndex\n ? cfiLocator.getRootCfi(beginSpineItem)\n : undefined,\n options: {\n isAtEndOfChapter: false\n }\n }, {\n spineItem: endSpineItem,\n spineItemIndex: endItemIndex,\n pageIndex: endPageIndex,\n cfi: lastExpectedNavigation?.type === `navigate-from-cfi` && spineItemToFocus === endSpineItem\n ? lastExpectedNavigation.data\n : data.triggeredBy === `adjust` && context.getSettings().computedPageTurnMode === `controlled`\n ? pagination.getEndInfo().cfi\n : endItemIndex !== pagination.getEndInfo().spineItemIndex\n ? cfiLocator.getRootCfi(endSpineItem)\n : undefined,\n options: {\n isAtEndOfChapter: false\n }\n })\n\n Report.log(NAMESPACE, `itemUpdateOnNavigation$`, { spineItemHasChanged: spineItemToFocus !== currentSpineItem, item: spineItemToFocus, spineItemToFocus, index: spineItemManager.getSpineItemIndex(spineItemToFocus), offset: data, endSpineItem, beginSpineItem, lastExpectedNavigation, spineItemsFromPosition })\n }\n\n time()\n }),\n share(),\n takeUntil(context.$.destroy$)\n )\n\n /**\n * Adjust heavier pagination once the navigation and items are updated.\n * This is also cancelled if the layout changes, because the layout will\n * trigger a new navigation adjustment and pagination again.\n */\n itemUpdateOnNavigation$\n .pipe(\n switchMap((data) => {\n return adjustPagination$(data.position)\n .pipe(\n takeUntil(spineItemManager.$.layout$)\n )\n }),\n takeUntil(context.$.destroy$)\n )\n .subscribe()\n\n /**\n * Loading and unloading content has two important issues that need to be considered\n * - For reflow book it will un-sync the viewport\n * - Loading / unload is CPU intensive.\n *\n * Because of theses two reason we only load/unload when the adjustment is done. This ensure a smooth transition for the second point.\n * For the first point it avoid having content being un-sync while the transition is happening. That way we avoid a new chapter\n * to suddenly being displayed under the transition. The first issue is only a problem for reflow book as paginated will not\n * un-sync the viewport.\n * The flow for the first point is as follow:\n * [navigate] -> [transition] -> [new position] -> [iframe unload/load] -> (eventual adjustment).\n *\n * It would ne nice to be able to load/unload without having to worry about viewport mis-adjustment but due to the current iframe and viewport\n * layout method we have to take it into consideration.\n */\n merge(\n /**\n * We want to update content after navigation since we are at a different place.\n * We also wait for navigated items to be updated so that we have access to correct focus.\n * which is why we use this observer rather than `navigation$`.\n */\n itemUpdateOnNavigation$,\n /**\n * This one make sure we also listen for layout change and that we execute the code once the navigation\n * has been adjusted (whether it's needed or not).\n */\n adjustNavigationAfterLayout$\n )\n .pipe(\n switchMap(() => {\n return waitForViewportFree$\n .pipe(\n map(() => {\n const focusedSpineItemIndex = spineItemManager.getFocusedSpineItemIndex()\n\n Report.log(NAMESPACE, `update contents`, { focusedSpineItemIndex })\n\n if (focusedSpineItemIndex === undefined) return\n\n const { begin = focusedSpineItemIndex, end = focusedSpineItemIndex } = locator.getSpineItemsFromReadingOrderPosition(viewportNavigator.getCurrentNavigationPosition()) || {}\n\n if (begin !== focusedSpineItemIndex && end !== focusedSpineItemIndex) {\n Report.warn(`Current viewport is not in sync with focus item, load from focus item rather than viewport`)\n spineItemManager.loadContents([focusedSpineItemIndex, focusedSpineItemIndex])\n } else {\n spineItemManager.loadContents([begin, end])\n }\n }),\n take(1)\n )\n }),\n takeUntil(context.$.destroy$)\n ).subscribe()\n\n return {\n viewportNavigator,\n element: containerElement,\n locator,\n spineItemLocator,\n cfiLocator,\n normalizeEventForViewport: eventsHelper.normalizeEventForViewport,\n manipulateSpineItems,\n load,\n layout: () => layoutSubject$.next(),\n destroy: () => {\n viewportNavigator.destroy()\n spineItemManager.destroy()\n selectionSubscription?.unsubscribe()\n containerElement.remove()\n },\n isSelecting: () => spineItemManager.getFocusedSpineItem()?.selectionTracker.isSelecting(),\n getSelection: () => spineItemManager.getFocusedSpineItem()?.selectionTracker.getSelection(),\n $: {\n $: subject.asObservable(),\n viewportState$: viewportNavigator.$.state$,\n layout$: spineItemManager.$.layout$\n }\n }\n}\n\nconst createContainerElement = (doc: Document, hooks$: BehaviorSubject<Hook[]>) => {\n const element: HTMLElement = doc.createElement(`div`)\n element.style.cssText = `\n height: 100%;\n position: relative;\n `\n /**\n * Beware of this property, do not try to change anything else or remove it.\n * This is early forced optimization and is used for this specific context.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/will-change\n *\n * @important\n * This seems to be responsible for the screen freeze issue\n */\n // element.style.willChange = `transform`\n element.style.transformOrigin = `0 0`\n\n return hooks$.getValue().reduce((element, hook) => {\n if (hook.name === `spine.onBeforeContainerCreated`) {\n return hook.fn(element)\n }\n\n return element\n }, element)\n}\n\nexport type Spine = ReturnType<typeof createSpine>\n","import { Context } from \"../context\"\nimport { getOriginalFrameEventFromDocumentEvent } from \"../frames\"\nimport { SpineItemManager } from \"../spineItemManager\"\nimport { isMouseEvent, isPointerEvent, isTouchEvent } from \"../utils/dom\"\nimport { createLocationResolver } from \"./locationResolver\"\n\nexport const createEventsHelper = ({ iframeEventBridgeElement, locator }: {\n iframeEventBridgeElement: HTMLElement,\n spineItemManager: SpineItemManager,\n context: Context,\n locator: ReturnType<typeof createLocationResolver>\n}) => {\n const normalizeEventForViewport = <E extends (MouseEvent | TouchEvent | PointerEvent)>(event: E) => {\n const eventIsComingFromBridge = event.target === iframeEventBridgeElement\n const iframeOriginalEvent = getOriginalFrameEventFromDocumentEvent(event)\n const originalFrame = iframeOriginalEvent?.view?.frameElement\n\n if (!eventIsComingFromBridge || !iframeOriginalEvent || !originalFrame) return event\n\n const spineItem = locator.getSpineItemFromIframe(originalFrame)\n\n if (!spineItem) return event\n\n if (isPointerEvent(event)) {\n const { clientX, clientY } = spineItem.translateFramePositionIntoPage(event)\n\n const newEvent = new PointerEvent(event.type, {\n ...event,\n clientX,\n clientY\n }) as E\n\n Object.defineProperty(newEvent, `target`, { value: iframeOriginalEvent.target, enumerable: true })\n\n return newEvent\n }\n\n if (isMouseEvent(event)) {\n const { clientX, clientY } = spineItem.translateFramePositionIntoPage(event)\n\n const newEvent = new MouseEvent(event.type, {\n ...event,\n clientX,\n clientY\n }) as E\n\n Object.defineProperty(newEvent, `target`, { value: iframeOriginalEvent.target, enumerable: true })\n\n return newEvent\n }\n\n if (isTouchEvent(event)) {\n const touches = Array.from(event.touches).map(\n (touch) => {\n const { clientX, clientY } = spineItem.translateFramePositionIntoPage(touch)\n\n return new Touch({\n identifier: touch.identifier,\n target: touch.target,\n clientX,\n clientY\n })\n }\n )\n\n const newEvent = new TouchEvent(event.type, {\n touches,\n changedTouches: touches,\n targetTouches: touches\n }) as E\n\n Object.defineProperty(newEvent, `target`, { value: iframeOriginalEvent.target, enumerable: true })\n\n return newEvent\n }\n\n return event\n }\n\n return {\n normalizeEventForViewport\n }\n}\n","import { Context } from \"../context\"\nimport { SpineItem } from \"../spineItem\"\nimport { createLocationResolver as createSpineItemLocator } from \"../spineItem/locationResolver\"\nimport { SpineItemManager } from \"../spineItemManager\"\nimport { Report } from \"../report\"\n\ntype SpinePosition = { x: number, y: number }\ntype SpineItemPosition = { x: number, y: number, outsideOfBoundaries?: boolean }\n\nexport const createLocationResolver = ({ spineItemManager, context, spineItemLocator }: {\n spineItemManager: SpineItemManager,\n context: Context,\n spineItemLocator: ReturnType<typeof createSpineItemLocator>\n}) => {\n const getSpineItemPositionFromSpinePosition = Report.measurePerformance(`getSpineItemPositionFromSpinePosition`, 10, (position: SpinePosition, spineItem: SpineItem): SpineItemPosition => {\n const { leftEnd, leftStart, topStart, topEnd } = spineItemManager.getAbsolutePositionOf(spineItem)\n\n /**\n * For this case the global offset move from right to left but this specific item\n * reads from left to right. This means that when the offset is at the start of the item\n * it is in fact at his end. This behavior can be observed in `haruko` about chapter.\n * @example\n * <---------------------------------------------------- global offset\n * item offset ------------------>\n * [item2 (page0 - page1 - page2)] [item1 (page1 - page0)] [item0 (page0)]\n */\n // if (context.isRTL() && itemReadingDirection === 'ltr') {\n // return (end - readingOrderViewOffset) - context.getPageSize().width\n // }\n\n if (context.isRTL()) {\n return {\n x: (leftEnd - position.x) - context.getPageSize().width,\n // y: (topEnd - position.y) - context.getPageSize().height,\n y: Math.max(0, position.y - topStart)\n }\n }\n\n return {\n /**\n * when using spread the item could be on the right and therefore will be negative\n * @example\n * 400 (position = viewport), page of 200\n * 400 - 600 = -200.\n * However we can assume we are at 0, because we in fact can see the beginning of the item\n */\n x: Math.max(0, position.x - leftStart),\n y: Math.max(0, position.y - topStart)\n }\n }, { disable: true })\n\n /**\n * Be careful when using with spread with RTL, this will return the position for one page size. This is in order to prevent wrong position when\n * an item is not taking the entire spread. That way we always have a valid position for the given item. However you need to adjust it\n * when on spread mode to be sure to position the viewport on the edge.\n *\n * @example\n * [ item-a | item-a ]\n * 400 200 0\n * will return 200, which probably needs to be adjusted as 0\n */\n const getSpinePositionFromSpineItemPosition = (spineItemPosition: SpineItemPosition, spineItem: SpineItem): SpinePosition => {\n const { leftEnd, leftStart, topStart, topEnd } = spineItemManager.getAbsolutePositionOf(spineItem)\n\n /**\n * For this case the global offset move from right to left but this specific item\n * reads from left to right. This means that when the offset is at the start of the item\n * it is in fact at his end. This behavior can be observed in `haruko` about chapter.\n * @example\n * <---------------------------------------------------- global offset\n * item offset ------------------>\n * [item2 (page0 - page1 - page2)] [item1 (page1 - page0)] [item0 (page0)]\n */\n // if (context.isRTL() && itemReadingDirection === 'ltr') {\n // return (end - spineItemOffset) - context.getPageSize().width\n // }\n\n if (context.isRTL()) {\n return {\n x: (leftEnd - spineItemPosition.x) - context.getPageSize().width,\n // y: (topEnd - spineItemPosition.y) - context.getPageSize().height,\n y: topStart + spineItemPosition.y\n }\n }\n\n // console.warn({ leftEnd, leftStart, topStart, topEnd })\n return {\n x: leftStart + spineItemPosition.x,\n y: topStart + spineItemPosition.y\n }\n }\n\n /**\n * This will retrieve the closest item to the x / y position edge relative to the reading direction.\n */\n const getSpineItemFromPosition = Report.measurePerformance(`getSpineItemFromOffset`, 10, (position: SpinePosition) => {\n const spineItem = spineItemManager.getSpineItemAtPosition(position)\n\n return spineItem\n }, { disable: true })\n\n const getSpinePositionFromSpineItem = (spineItem: SpineItem) => {\n return getSpinePositionFromSpineItemPosition({ x: 0, y: 0 }, spineItem)\n }\n\n const getSpinePositionFromSpineItemAnchor = (anchor: string, spineItem: SpineItem) => {\n const spineItemOffset = spineItemLocator.getSpineItemOffsetFromAnchor(anchor, spineItem)\n\n const position = getSpinePositionFromSpineItemPosition({ x: spineItemOffset, y: 0 }, spineItem)\n\n return position\n }\n\n const getSpineItemsFromReadingOrderPosition = (position: SpinePosition): {\n left: number,\n right: number,\n begin: number,\n beginPosition: SpinePosition\n end: number\n endPosition: SpinePosition\n } | undefined => {\n const beginItem = getSpineItemFromPosition(position) || spineItemManager.getFocusedSpineItem()\n const beginItemIndex = spineItemManager.getSpineItemIndex(beginItem)\n\n if (beginItemIndex === undefined) return undefined\n\n let endPosition = position\n\n if (context.shouldDisplaySpread()) {\n endPosition = { x: position.x + context.getPageSize().width, y: position.y }\n }\n\n const endItemIndex = spineItemManager.getSpineItemIndex(\n getSpineItemFromPosition(endPosition) || spineItemManager.getFocusedSpineItem()\n ) ?? beginItemIndex\n\n const [left = beginItemIndex, right = beginItemIndex] = [beginItemIndex, endItemIndex].sort((a, b) => a - b)\n // const [left = beginItemIndex, right = beginItemIndex] = [beginItemIndex, endItemIndex].sort()\n\n return {\n begin: beginItemIndex,\n beginPosition: position,\n end: endItemIndex,\n endPosition: endPosition,\n left,\n right\n }\n }\n\n const getSpineItemFromIframe = (iframe: Element) => {\n return spineItemManager.getAll().find(item => item.spineItemFrame.getFrameElement() === iframe)\n }\n\n const getSpineItemPageIndexFromNode = (node: Node, offset: number | undefined, spineItemOrIndex: SpineItem | number) => {\n if (typeof spineItemOrIndex === `number`) {\n const spineItem = spineItemManager.get(spineItemOrIndex)\n return spineItem ? spineItemLocator.getSpineItemPageIndexFromNode(node, offset || 0, spineItem) : undefined\n }\n\n return spineItemLocator.getSpineItemPageIndexFromNode(node, offset || 0, spineItemOrIndex)\n }\n\n return {\n getSpinePositionFromSpineItemPosition,\n getSpinePositionFromSpineItem,\n getSpinePositionFromSpineItemAnchor,\n getSpineItemPositionFromSpinePosition,\n getSpineItemFromPosition,\n getSpineItemFromIframe,\n getSpineItemPageIndexFromNode,\n getSpineItemsFromReadingOrderPosition\n }\n}\n","import { Report } from \"../report\"\nimport { Context } from \"../context\"\nimport { SpineItemManager } from \"../spineItemManager\"\nimport { SpineItem } from \"../spineItem\"\nimport { createNavigationResolver as createSpineItemNavigator } from \"../spineItem/navigationResolver\"\nimport { createLocationResolver } from \"./locationResolver\"\nimport { createCfiLocator } from \"./cfiLocator\"\n\nexport type ViewportNavigationEntry = { x: number, y: number, spineItem?: SpineItem }\ntype ViewportPosition = { x: number, y: number }\ntype SpineItemPosition = { x: number, y: number }\n\nconst NAMESPACE = `spineNavigator`\n\nexport const createNavigationResolver = ({ context, spineItemManager, cfiLocator, locator }: {\n context: Context,\n spineItemManager: SpineItemManager,\n cfiLocator: ReturnType<typeof createCfiLocator>,\n locator: ReturnType<typeof createLocationResolver>\n}) => {\n const spineItemNavigator = createSpineItemNavigator({ context })\n\n const arePositionsDifferent = (a: ViewportNavigationEntry, b: ViewportNavigationEntry) => a.x !== b.x || a.y !== b.y\n\n const areNavigationDifferent = (a: ViewportNavigationEntry, b: ViewportNavigationEntry) => arePositionsDifferent(a, b) || ((!!a.spineItem && !!b.spineItem) && (a.spineItem !== b.spineItem))\n\n const wrapPositionWithSafeEdge = Report.measurePerformance(`${NAMESPACE} wrapPositionWithSafeEdge`, 1, (position: SpineItemPosition) => {\n // @todo use container width instead to increase performances\n const lastSpineItem = spineItemManager.get(spineItemManager.getLength() - 1)\n const distanceOfLastSpineItem = spineItemManager.getAbsolutePositionOf(lastSpineItem || 0)\n const maximumXOffset = distanceOfLastSpineItem.leftEnd - context.getPageSize().width\n const maximumYOffset = distanceOfLastSpineItem.topEnd - context.getPageSize().height\n\n return {\n x: Math.min(Math.max(0, position.x), maximumXOffset),\n y: Math.min(Math.max(0, position.y), maximumYOffset)\n }\n }, { disable: true })\n\n const getAdjustedPositionForSpread = ({ x, y }: ViewportNavigationEntry): ViewportNavigationEntry => {\n const isOffsetNotAtEdge = (x % context.getVisibleAreaRect().width) !== 0\n const correctedX = isOffsetNotAtEdge ? x - context.getPageSize().width : x\n\n return { x: correctedX, y }\n }\n\n const getNavigationForCfi = (cfi: string): ViewportNavigationEntry => {\n const spineItem = cfiLocator.getSpineItemFromCfi(cfi)\n const { node, offset = 0 } = cfiLocator.resolveCfi(cfi) || {}\n\n if (!spineItem) {\n Report.warn(NAMESPACE, `unable to detect item id from cfi ${cfi}`)\n } else {\n const spineItemNavigation = node ? spineItemNavigator.getNavigationFromNode(spineItem, node, offset) : { x: 0, y: 0 }\n const readingPosition = locator.getSpinePositionFromSpineItemPosition(spineItemNavigation, spineItem)\n\n // very important to always return a reading item since we want to focus on that particular one\n return { ...getAdjustedPositionForSpread(readingPosition), spineItem }\n }\n\n return { x: 0, y: 0 }\n }\n\n const getNavigationForPage = (pageIndex: number, spineItem?: SpineItem): ViewportNavigationEntry => {\n // lookup for entire book\n // This is reliable for pre-paginated, do not use it for reflowable book\n if (!spineItem) {\n const xPositionForPageIndex = pageIndex * context.getPageSize().width\n return getNavigationForPosition({ x: xPositionForPageIndex, y: 0 })\n }\n\n const spineItemNavigation = spineItemNavigator.getNavigationForPage(pageIndex, spineItem)\n const readingOffset = locator.getSpinePositionFromSpineItemPosition(spineItemNavigation, spineItem)\n\n return getAdjustedPositionForSpread(readingOffset)\n }\n\n const getNavigationForLastPage = (spineItem: SpineItem): ViewportNavigationEntry => {\n const spineItemNavigation = spineItemNavigator.getNavigationForLastPage(spineItem)\n const position = locator.getSpinePositionFromSpineItemPosition(spineItemNavigation, spineItem)\n\n return getAdjustedPositionForSpread(position)\n }\n\n const getNavigationForSpineIndexOrId = (indexOrId: number | string): ViewportNavigationEntry => {\n const spineItem = spineItemManager.get(indexOrId)\n if (spineItem) {\n const position = locator.getSpinePositionFromSpineItem(spineItem)\n\n return { ...getAdjustedPositionForSpread(position), spineItem }\n }\n\n return { x: 0, y: 0 }\n }\n\n const getNavigationForRightSinglePage = (position: SpineItemPosition): ViewportNavigationEntry => {\n const pageTurnDirection = context.getSettings().computedPageTurnDirection\n const spineItem = locator.getSpineItemFromPosition(position) || spineItemManager.getFocusedSpineItem()\n const defaultNavigation = position\n\n if (!spineItem) {\n return defaultNavigation\n }\n\n // translate viewport position into reading item local position\n const spineItemPosition = locator.getSpineItemPositionFromSpinePosition(position, spineItem)\n // get reading item local position for right page\n const spineItemNavigationForRightPage = spineItemNavigator.getNavigationForRightPage(spineItemPosition, spineItem)\n // check both position to see if we moved out of it\n const isNewNavigationInCurrentItem = !spineItemPosition.outsideOfBoundaries && arePositionsDifferent(spineItemNavigationForRightPage, spineItemPosition)\n\n // console.warn({ spineItemPosition, spineItemNavigationForRightPage, isNewNavigationInCurrentItem })\n if (!isNewNavigationInCurrentItem) {\n return wrapPositionWithSafeEdge(\n context.isRTL()\n ? pageTurnDirection === `horizontal`\n ? { x: position.x - context.getPageSize().width, y: 0 }\n : { y: position.y + context.getPageSize().height, x: 0 }\n : pageTurnDirection === `horizontal`\n ? { x: position.x + context.getPageSize().width, y: 0 }\n : { y: position.y + context.getPageSize().height, x: 0 }\n )\n } else {\n const readingOrderPosition = locator.getSpinePositionFromSpineItemPosition(spineItemNavigationForRightPage, spineItem)\n\n return readingOrderPosition\n }\n }\n\n const getNavigationForLeftSinglePage = (position: SpineItemPosition): ViewportNavigationEntry => {\n const pageTurnDirection = context.getSettings().computedPageTurnDirection\n const spineItem = locator.getSpineItemFromPosition(position) || spineItemManager.getFocusedSpineItem()\n const defaultNavigation = { ...position, spineItem }\n\n if (!spineItem) {\n return defaultNavigation\n }\n\n const spineItemPosition = locator.getSpineItemPositionFromSpinePosition(position, spineItem)\n const spineItemNavigation = spineItemNavigator.getNavigationForLeftPage(spineItemPosition, spineItem)\n const isNewNavigationInCurrentItem = !spineItemPosition.outsideOfBoundaries && arePositionsDifferent(spineItemNavigation, spineItemPosition)\n\n if (!isNewNavigationInCurrentItem) {\n return wrapPositionWithSafeEdge(\n context.isRTL()\n ? pageTurnDirection === `horizontal`\n ? { x: position.x + context.getPageSize().width, y: 0 }\n : { y: position.y - context.getPageSize().height, x: 0 }\n : pageTurnDirection === `horizontal`\n ? { x: position.x - context.getPageSize().width, y: 0 }\n : { y: position.y - context.getPageSize().height, x: 0 }\n )\n } else {\n const readingOrderPosition = locator.getSpinePositionFromSpineItemPosition(spineItemNavigation, spineItem)\n\n return readingOrderPosition\n }\n }\n\n /**\n * Very naive approach for spread. It could be optimized but by using this approach\n * we do not add complexity to the code and use the current logic to handle it correctly.\n *\n * @important\n * Special case for vertical content, read content\n */\n const getNavigationForRightPage = (position: SpineItemPosition): ViewportNavigationEntry => {\n const spineItemOnPosition = locator.getSpineItemFromPosition(position) || spineItemManager.getFocusedSpineItem()\n\n let navigation = getNavigationForRightSinglePage(position)\n\n // when we move withing vertical content, because only y moves, we don't need two navigation\n if (spineItemOnPosition?.isUsingVerticalWriting() && position.x === navigation.x) {\n return getAdjustedPositionForSpread(navigation)\n }\n\n if (context.shouldDisplaySpread()) {\n // in case of spread the entire screen is taken as one real page for vertical content\n // in order to move out from it we add an extra page width.\n // using `getNavigationForLeftSinglePage` again would keep x as it is and wrongly move y\n // for the next item in case it's also a vertical content\n if (spineItemOnPosition?.isUsingVerticalWriting() && position.x !== navigation.x) {\n return getAdjustedPositionForSpread(\n wrapPositionWithSafeEdge(\n context.isRTL()\n ? {\n ...navigation,\n x: navigation.x - context.getPageSize().width\n }\n : {\n ...navigation,\n x: navigation.x + context.getPageSize().width\n }\n )\n )\n }\n\n /**\n * In vase we move vertically and the y is already different, we don't need a second navigation\n * since we already jumped to a new screen\n */\n if (context.getSettings().computedPageTurnDirection === `vertical` && position.y !== navigation.y) {\n return getAdjustedPositionForSpread(navigation)\n }\n\n navigation = getNavigationForRightSinglePage(navigation)\n }\n\n return getAdjustedPositionForSpread(navigation)\n }\n\n /**\n * Very naive approach for spread. It could be optimized but by using this approach\n * we do not add complexity to the code and use the current logic to handle it correctly.\n *\n * @important\n * Special case for vertical content, read content\n */\n const getNavigationForLeftPage = (position: SpineItemPosition): ViewportNavigationEntry => {\n const spineItemOnPosition = locator.getSpineItemFromPosition(position) || spineItemManager.getFocusedSpineItem()\n\n let navigation = getNavigationForLeftSinglePage(position)\n\n // when we move withing vertical content, because only y moves, we don't need two navigation\n if (spineItemOnPosition?.isUsingVerticalWriting() && position.x === navigation.x) {\n return getAdjustedPositionForSpread(navigation)\n }\n\n if (context.shouldDisplaySpread()) {\n // in case of spread the entire screen is taken as one real page for vertical content\n // in order to move out from it we add an extra page width.\n // using `getNavigationForLeftSinglePage` again would keep x as it is and wrongly move y\n // for the next item in case it's also a vertical content\n if (spineItemOnPosition?.isUsingVerticalWriting() && position.x !== navigation.x) {\n return getAdjustedPositionForSpread(\n wrapPositionWithSafeEdge(\n context.isRTL()\n ? { ...navigation, x: navigation.x + context.getPageSize().width }\n : { ...navigation, x: navigation.x - context.getPageSize().width }\n )\n )\n }\n\n /**\n * In vase we move vertically and the y is already different, we don't need a second navigation\n * since we already jumped to a new screen\n */\n if (context.getSettings().computedPageTurnDirection === `vertical` && position.y !== navigation.y) {\n return getAdjustedPositionForSpread(navigation)\n }\n\n navigation = getNavigationForLeftSinglePage(navigation)\n }\n\n return getAdjustedPositionForSpread(navigation)\n }\n\n const getNavigationForUrl = (url: string | URL): ViewportNavigationEntry & { url: URL } | undefined => {\n let validUrl: URL | undefined\n try {\n validUrl = url instanceof URL ? url : new URL(url)\n } catch (e) {\n Report.error(e)\n }\n if (validUrl) {\n const urlWithoutAnchor = `${validUrl.origin}${validUrl.pathname}`\n const existingSpineItem = context.getManifest()?.spineItems.find(item => item.href === urlWithoutAnchor)\n if (existingSpineItem) {\n const spineItem = spineItemManager.get(existingSpineItem.id)\n if (spineItem) {\n const position = getNavigationForAnchor(validUrl.hash, spineItem)\n\n return { ...getAdjustedPositionForSpread(position), url: validUrl }\n }\n }\n }\n\n return undefined\n }\n\n const getNavigationForAnchor = (anchor: string, spineItem: SpineItem) => {\n const position = locator.getSpinePositionFromSpineItemAnchor(anchor, spineItem)\n\n return getAdjustedPositionForSpread(position)\n }\n\n const getNavigationForPosition = (viewportPosition: ViewportPosition) => {\n const spineItem = locator.getSpineItemFromPosition(viewportPosition)\n\n if (spineItem) {\n const spineItemPosition = locator.getSpineItemPositionFromSpinePosition(viewportPosition, spineItem)\n const spineItemValidPosition = spineItemNavigator.getNavigationForPosition(spineItem, spineItemPosition)\n const viewportNavigation = locator.getSpinePositionFromSpineItemPosition(spineItemValidPosition, spineItem)\n\n return getAdjustedPositionForSpread(viewportNavigation)\n }\n\n return { x: 0, y: 0 }\n }\n\n /**\n * Useful when you want to get a navigation from a scroll position. It uses trigger points so it will\n * try to get the most visible / relevant element as navigation reference\n */\n const getMostPredominantNavigationForPosition = (viewportPosition: ViewportPosition) => {\n const pageTurnDirection = context.getSettings().computedPageTurnDirection\n // @todo movingForward does not work same with free-scroll, try to find a reliable way to detect\n // const movingForward = navigator.isNavigationGoingForwardFrom(navigation, currentNavigationPosition)\n // const triggerPercentage = movingForward ? 0.7 : 0.3\n const triggerPercentage = 0.5\n const triggerXPosition = pageTurnDirection === `horizontal`\n ? viewportPosition.x + (context.getVisibleAreaRect().width * triggerPercentage)\n : 0\n const triggerYPosition = pageTurnDirection === `horizontal`\n ? 0\n : viewportPosition.y + (context.getVisibleAreaRect().height * triggerPercentage)\n const midScreenPositionSafePosition = wrapPositionWithSafeEdge({ x: triggerXPosition, y: triggerYPosition })\n return getNavigationForPosition(midScreenPositionSafePosition)\n }\n\n const isNavigationGoingForwardFrom = (to: ViewportPosition, from: ViewportPosition) => {\n const pageTurnDirection = context.getSettings().computedPageTurnDirection\n\n if (pageTurnDirection === `vertical`) {\n return to.y > from.y\n }\n\n return to.x > from.x\n }\n\n return {\n getNavigationForCfi,\n getNavigationForPage,\n getNavigationForLastPage,\n getNavigationForSpineIndexOrId,\n getNavigationForRightPage,\n getNavigationForLeftPage,\n getNavigationForUrl,\n getNavigationForAnchor,\n getNavigationForPosition,\n getMostPredominantNavigationForPosition,\n wrapPositionWithSafeEdge,\n isNavigationGoingForwardFrom,\n areNavigationDifferent,\n arePositionsDifferent\n }\n}\n","import { BehaviorSubject, EMPTY, merge, of, Subject } from \"rxjs\"\nimport { filter, map, switchMap, tap, withLatestFrom } from \"rxjs/operators\"\nimport { Context } from \"../../context\"\nimport { SpineItemManager } from \"../../spineItemManager\"\nimport { Report } from \"../../report\"\nimport { createNavigationResolver, ViewportNavigationEntry } from \"../navigationResolver\"\nimport { createLocationResolver } from \"../locationResolver\"\n\nconst NAMESPACE = `manualViewportNavigator`\n\ntype UrlNavigation = { type: `url`, data: string | URL }\ntype SpineItemNavigation = { type: `spineItem`, data: { indexOrId: number | string, animate: boolean } }\ntype CfiNavigation = { type: `cfi`, data: { cfi: string, animate: boolean } }\ntype ChapterPageNavigation = { type: `chapterPage`, data: { pageIndex: number } }\ntype PageIndexNavigation = { type: `pageIndex`, data: { pageIndex: number } }\ntype LeftPageNavigation = { type: `leftPage`, data: { allowSpineItemChange: boolean } }\ntype RightPageNavigation = { type: `rightPage`, data: { allowSpineItemChange: boolean } }\n\nexport const createManualViewportNavigator = ({ navigator, spineItemManager, currentNavigationSubject$, locator, context }: {\n context: Context,\n element: HTMLElement,\n navigator: ReturnType<typeof createNavigationResolver>,\n currentNavigationSubject$: BehaviorSubject<ViewportNavigationEntry>,\n spineItemManager: SpineItemManager,\n locator: ReturnType<typeof createLocationResolver>,\n}) => {\n const stateSubject$ = (new BehaviorSubject<`start` | `end`>(`end`))\n const navigationTriggerSubject$ = new Subject<\n | UrlNavigation\n | SpineItemNavigation\n | CfiNavigation\n | ChapterPageNavigation\n | PageIndexNavigation\n | LeftPageNavigation\n | RightPageNavigation\n >()\n\n const turnLeft = ({ allowSpineItemChange = true }: { allowSpineItemChange?: boolean } = {}) =>\n navigationTriggerSubject$.next({ type: `leftPage`, data: { allowSpineItemChange } })\n\n const turnRight = ({ allowSpineItemChange = true }: { allowSpineItemChange?: boolean } = {}) => {\n navigationTriggerSubject$.next({ type: `rightPage`, data: { allowSpineItemChange } })\n }\n\n // @todo it's wrong because we can be in two different chapter on same page for spread\n const goToPageOfCurrentChapter = (pageIndex: number) =>\n navigationTriggerSubject$.next({ type: `chapterPage`, data: { pageIndex } })\n\n const goToPage = (pageIndex: number) =>\n navigationTriggerSubject$.next({ type: `pageIndex`, data: { pageIndex } })\n\n const goToCfi = (cfi: string, options: { animate: boolean } = { animate: true }) =>\n navigationTriggerSubject$.next({ type: `cfi`, data: { cfi, ...options } })\n\n const goToUrl = (url: string | URL) =>\n navigationTriggerSubject$.next({ type: `url`, data: url })\n\n const goToSpineItem = (indexOrId: number | string, options: { animate: boolean } = { animate: true }) => {\n navigationTriggerSubject$.next({ type: `spineItem`, data: { indexOrId, ...options } })\n }\n\n const urlNavigation$ = navigationTriggerSubject$\n .pipe(\n filter((e): e is UrlNavigation => e.type === `url`),\n switchMap(({ data }) => {\n const navigation = navigator.getNavigationForUrl(data)\n\n if (navigation) {\n return of({ ...navigation, animate: true, lastUserExpectedNavigation: { type: `navigate-from-anchor` as const, data: navigation.url.hash } })\n }\n\n return EMPTY\n })\n )\n\n const spineItemNavigation$ = navigationTriggerSubject$\n .pipe(\n filter((e): e is SpineItemNavigation => e.type === `spineItem`),\n switchMap(({ data: { animate, indexOrId } }) => {\n const navigation = navigator.getNavigationForSpineIndexOrId(indexOrId)\n\n // always want to be at the beginning of the item\n const lastUserExpectedNavigation = { type: `navigate-from-previous-item` as const }\n\n Report.log(NAMESPACE, `goToSpineItem`, { indexOrId, animate, navigation })\n\n return of({ ...navigation, animate, lastUserExpectedNavigation })\n })\n )\n\n const cfiNavigation$ = navigationTriggerSubject$\n .pipe(\n filter((e): e is CfiNavigation => e.type === `cfi`),\n map(({ data: { animate, cfi } }) => {\n const navigation = navigator.getNavigationForCfi(cfi)\n\n Report.log(NAMESPACE, `goToCfi`, { cfi, animate, navigation })\n\n return ({\n ...navigation, animate, lastUserExpectedNavigation: { type: `navigate-from-cfi` as const, data: cfi }\n })\n })\n )\n\n const chapterPageNavigation$ = navigationTriggerSubject$\n .pipe(\n filter((e): e is ChapterPageNavigation => e.type === `chapterPage`),\n switchMap(({ data: { pageIndex } }) => {\n const spineItem = spineItemManager.getFocusedSpineItem()\n\n if (spineItem) {\n const navigation = navigator.getNavigationForPage(pageIndex, spineItem)\n\n return of({ ...navigation, lastUserExpectedNavigation: undefined, animate: true })\n }\n\n return EMPTY\n })\n )\n\n const pageNavigation$ = navigationTriggerSubject$\n .pipe(\n filter((e): e is PageIndexNavigation => e.type === `pageIndex`),\n filter(_ => {\n if (context.getManifest()?.renditionLayout === `reflowable`) {\n Report.warn(`This method only works for pre-paginated content`)\n return false\n }\n\n return true\n }),\n switchMap(({ data: { pageIndex } }) => {\n return of({\n ...navigator.getNavigationForPage(pageIndex),\n lastUserExpectedNavigation: undefined,\n animate: true\n })\n })\n )\n\n const turnPageTo$ = Report.measurePerformance(`turnTo`, 10, (navigation: ViewportNavigationEntry, { allowSpineItemChange = true }: { allowSpineItemChange?: boolean } = {}) => {\n const currentSpineItem = spineItemManager.getFocusedSpineItem()\n\n if (!currentSpineItem) return EMPTY\n\n const newSpineItem = locator.getSpineItemFromPosition(navigation) || currentSpineItem\n const spineItemHasChanged = newSpineItem !== currentSpineItem\n\n if (spineItemHasChanged) {\n if (allowSpineItemChange) {\n if (spineItemManager.comparePositionOf(newSpineItem, currentSpineItem) === `before`) {\n return of({ ...navigation, lastUserExpectedNavigation: { type: `navigate-from-next-item` as const }, animate: true })\n } else {\n return of({ ...navigation, lastUserExpectedNavigation: { type: `navigate-from-previous-item` as const }, animate: true })\n }\n }\n } else {\n return of({ ...navigation, lastUserExpectedNavigation: undefined, animate: true })\n }\n\n return EMPTY\n })\n\n const leftPageNavigation$ = navigationTriggerSubject$\n .pipe(\n filter((e): e is LeftPageNavigation => e.type === `leftPage`),\n withLatestFrom(currentNavigationSubject$),\n switchMap(([{ data: { allowSpineItemChange } }, currentNavigation]) => {\n const navigation = navigator.getNavigationForLeftPage(currentNavigation)\n\n return turnPageTo$(navigation, { allowSpineItemChange })\n })\n )\n\n const rightPageNavigation$ = navigationTriggerSubject$\n .pipe(\n filter((e): e is RightPageNavigation => e.type === `rightPage`),\n withLatestFrom(currentNavigationSubject$),\n switchMap(([{ data: { allowSpineItemChange } }, currentNavigation]) => {\n const navigation = navigator.getNavigationForRightPage(currentNavigation)\n\n return turnPageTo$(navigation, { allowSpineItemChange })\n })\n )\n\n const navigation$ = merge(\n urlNavigation$,\n spineItemNavigation$,\n chapterPageNavigation$,\n leftPageNavigation$,\n rightPageNavigation$,\n // for some reason after too much item ts complains\n merge(\n cfiNavigation$,\n pageNavigation$\n )\n )\n .pipe(\n /**\n * Ideally when manually navigating we expect the navigation to be different from the previous one.\n * This is because manual navigation is not used with scroll where you can move within the same item. A manual\n * navigation would theoretically always move to different items.\n */\n withLatestFrom(currentNavigationSubject$),\n filter(([navigation, currentNavigation]) => navigator.areNavigationDifferent(navigation, currentNavigation)),\n map(([navigation]) => navigation)\n )\n\n return {\n destroy: () => { },\n adjustReadingOffset: (_: { x: number, y: number }) => {\n return false\n },\n turnLeft,\n turnRight,\n goToCfi,\n goToPageOfCurrentChapter,\n goToSpineItem,\n goToUrl,\n goToPage,\n $: {\n state$: stateSubject$.asObservable(),\n navigation$\n }\n }\n}\n","import { BehaviorSubject, merge, of, Subject } from \"rxjs\"\nimport { filter, switchMap } from \"rxjs/operators\"\nimport { Context } from \"../../context\"\nimport { SpineItemManager } from \"../../spineItemManager\"\nimport { Report } from \"../../report\"\nimport { createNavigationResolver, ViewportNavigationEntry } from \"../navigationResolver\"\nimport { createLocationResolver } from \"../locationResolver\"\nimport { ViewportPosition } from \"../../types\"\n\nconst NAMESPACE = `panViewportNavigator`\n\ntype SnapNavigation = { type: `snap`, data: { from: ViewportNavigationEntry, to: ViewportNavigationEntry, pan: { x: number, y: number } } }\n\nexport const createPanViewportNavigator = ({ getCurrentViewportPosition, navigator, spineItemManager, locator, context, currentNavigationSubject$ }: {\n context: Context,\n element: HTMLElement,\n navigator: ReturnType<typeof createNavigationResolver>,\n currentNavigationSubject$: BehaviorSubject<ViewportNavigationEntry>,\n spineItemManager: SpineItemManager,\n locator: ReturnType<typeof createLocationResolver>,\n getCurrentViewportPosition: () => ViewportPosition\n}) => {\n const navigationTriggerSubject$ = new Subject<\n | SnapNavigation\n >()\n const stateSubject$ = new BehaviorSubject<`end` | `start`>(`end`)\n let movingLastDelta = { x: 0, y: 0 }\n let movingLastPosition = { x: 0, y: 0 }\n const moveToSubject$ = new Subject<{ position: ViewportNavigationEntry }>()\n\n /**\n * @prototype\n */\n const moveTo = Report.measurePerformance(`${NAMESPACE} moveTo`, 5, (delta: { x: number, y: number } | undefined, { final, start }: { start?: boolean, final?: boolean } = {}) => {\n if (context.getSettings().computedPageTurnMode === `scrollable`) {\n Report.warn(`pan control is not available on free page turn mode`)\n return\n }\n\n const pageTurnDirection = context.getSettings().computedPageTurnDirection\n\n if (start) {\n stateSubject$.next(`start`)\n movingLastDelta = { x: 0, y: 0 }\n movingLastPosition = getCurrentViewportPosition()\n }\n\n let navigation = currentNavigationSubject$.value\n\n if (delta) {\n const correctedX = delta.x - (movingLastDelta?.x || 0)\n const correctedY = delta.y - (movingLastDelta?.y || 0)\n\n navigation = navigator.wrapPositionWithSafeEdge({\n x: pageTurnDirection === `horizontal`\n ? context.isRTL()\n ? movingLastPosition.x + correctedX\n : movingLastPosition.x - correctedX\n : 0,\n y: pageTurnDirection === `horizontal` ? 0 : movingLastPosition.y - correctedY\n })\n\n movingLastDelta = delta\n } else {\n navigation = getCurrentViewportPosition()\n }\n\n movingLastPosition = navigation\n\n if (final) {\n movingLastDelta = { x: 0, y: 0 }\n\n snapTo({\n from: currentNavigationSubject$.value,\n to: navigation,\n pan: movingLastPosition\n })\n stateSubject$.next(`end`)\n\n return\n }\n\n moveToSubject$.next({ position: navigation })\n }, { disable: false })\n\n const snapTo = (data: SnapNavigation[`data`]) => {\n navigationTriggerSubject$.next({ type: `snap`, data })\n }\n\n const getLastUserExpectedNavigation = Report.measurePerformance(`turnTo`, 10, (navigation: ViewportNavigationEntry, { allowSpineItemChange = true }: { allowSpineItemChange?: boolean } = {}) => {\n const currentSpineItem = spineItemManager.getFocusedSpineItem()\n\n if (!currentSpineItem) return undefined\n\n const newSpineItem = locator.getSpineItemFromPosition(navigation) || currentSpineItem\n const spineItemHasChanged = newSpineItem !== currentSpineItem\n\n if (spineItemHasChanged) {\n if (allowSpineItemChange) {\n if (spineItemManager.comparePositionOf(newSpineItem, currentSpineItem) === `before`) {\n return { type: `navigate-from-next-item` as const }\n } else {\n return { type: `navigate-from-previous-item` as const }\n }\n }\n } else {\n return undefined\n }\n })\n\n const snapNavigation$ = navigationTriggerSubject$\n .pipe(\n filter((e): e is SnapNavigation => e.type === `snap`),\n switchMap(({ data: { from, to } }) => {\n const pageTurnDirection = context.getSettings().computedPageTurnDirection\n const movingForward = navigator.isNavigationGoingForwardFrom(to, from)\n const triggerPercentage = movingForward ? 0.7 : 0.3\n const triggerXPosition = pageTurnDirection === `horizontal`\n ? to.x + (context.getVisibleAreaRect().width * triggerPercentage)\n : 0\n const triggerYPosition = pageTurnDirection === `horizontal`\n ? 0\n : to.y + (context.getVisibleAreaRect().height * triggerPercentage)\n const midScreenPositionSafePosition = navigator.wrapPositionWithSafeEdge({ x: triggerXPosition, y: triggerYPosition })\n const finalNavigation = navigator.getNavigationForPosition(midScreenPositionSafePosition)\n const lastUserExpectedNavigation = getLastUserExpectedNavigation(finalNavigation)\n\n // @todo return an animation interpolation based on the distance\n\n return of({ ...finalNavigation, lastUserExpectedNavigation })\n })\n )\n\n const destroy = () => {\n moveToSubject$.complete()\n stateSubject$.complete()\n }\n\n return {\n moveTo,\n destroy,\n adjustReadingOffset: (_: { x: number, y: number }) => {\n return false\n },\n $: {\n moveToSubject$,\n state$: stateSubject$.asObservable(),\n navigation$: merge(\n snapNavigation$\n )\n }\n }\n}\n","import { animationFrameScheduler, BehaviorSubject, EMPTY, fromEvent, iif, merge, MonoTypeOperatorFunction, Observable, of } from \"rxjs\"\nimport { debounceTime, distinctUntilChanged, filter, map, share, switchMap, takeUntil, withLatestFrom, startWith, tap } from \"rxjs/operators\"\nimport { Context } from \"../../context\"\nimport { createNavigationResolver, ViewportNavigationEntry } from \"../navigationResolver\"\n\nconst SCROLL_FINISHED_DEBOUNCE_TIMEOUT = 200\n\nexport const createScrollViewportNavigator = ({ context, element, navigator, currentNavigationSubject$ }: {\n context: Context,\n element: HTMLElement,\n navigator: ReturnType<typeof createNavigationResolver>,\n currentNavigationSubject$: BehaviorSubject<ViewportNavigationEntry>\n}) => {\n let lastScrollWasProgrammaticallyTriggered = false\n\n const onlyUserScrollFilter = <T>(source: Observable<T>): Observable<T> =>\n source.pipe(filter(() => {\n if (lastScrollWasProgrammaticallyTriggered) {\n lastScrollWasProgrammaticallyTriggered = false\n return false\n }\n\n return true\n }))\n\n const adjustReadingOffset = ({ x, y }: { x: number, y: number }) => {\n if (context.getSettings().computedPageTurnMode === `scrollable`) {\n lastScrollWasProgrammaticallyTriggered = true\n element.scrollTo({ left: x, top: y })\n\n return true\n }\n\n return false\n }\n\n const runOnFreePageTurnModeOnly$ = <T>(source: Observable<T>) => context.$.settings$\n .pipe(\n map(() => context.getSettings().computedPageTurnMode),\n distinctUntilChanged(),\n switchMap((mode) =>\n iif(() => mode === `controlled`, EMPTY, source)\n )\n )\n\n const userScroll$ = runOnFreePageTurnModeOnly$(fromEvent(element, `scroll`))\n .pipe(\n onlyUserScrollFilter,\n share(),\n takeUntil(context.$.destroy$)\n )\n\n const navigationOnScroll$ = userScroll$\n .pipe(\n debounceTime(SCROLL_FINISHED_DEBOUNCE_TIMEOUT, animationFrameScheduler),\n withLatestFrom(currentNavigationSubject$),\n switchMap(() => {\n const navigation = navigator.getMostPredominantNavigationForPosition({ x: element.scrollLeft, y: element.scrollTop })\n /**\n * Because scroll navigation is always different: we can scroll through the same item but at different progress\n * we always return something from the observable. So for example if we have only one long height item (webtoon)\n * we are able to update the general progress\n */\n return of({ position: navigation, animate: false, lastUserExpectedNavigation: undefined })\n }),\n share()\n )\n\n const userScrollEnd$ = userScroll$\n .pipe(\n debounceTime(SCROLL_FINISHED_DEBOUNCE_TIMEOUT, animationFrameScheduler),\n share(),\n takeUntil(context.$.destroy$)\n )\n\n const state$ = merge(\n userScroll$\n .pipe(\n map(() => `start` as const),\n distinctUntilChanged()\n ),\n userScrollEnd$\n .pipe(\n map(() => `end` as const)\n )\n )\n .pipe(\n startWith(`end`)\n )\n\n return {\n destroy: () => { },\n adjustReadingOffset,\n $: {\n state$,\n navigation$: navigationOnScroll$\n }\n }\n}\n","import { Report } from \"../../report\"\nimport { Context } from \"../../context\"\nimport { Pagination } from \"../../pagination\"\nimport { SpineItemManager } from \"../../spineItemManager\"\nimport { createLocationResolver } from \"../locationResolver\"\nimport { createNavigationResolver, ViewportNavigationEntry } from \"../navigationResolver\"\nimport { animationFrameScheduler, BehaviorSubject, combineLatest, EMPTY, identity, merge, Observable, of, Subject } from \"rxjs\"\nimport { SpineItem } from \"../../spineItem\"\nimport { delay, distinctUntilChanged, filter, map, pairwise, share, shareReplay, startWith, switchMap, takeUntil, tap, withLatestFrom, skip } from \"rxjs/operators\"\nimport { createCfiLocator } from \"../cfiLocator\"\nimport { createScrollViewportNavigator } from \"./scrollViewportNavigator\"\nimport { createManualViewportNavigator } from \"./manualViewportNavigator\"\nimport { Hook } from \"../../types/Hook\"\nimport { createPanViewportNavigator } from \"./panViewportNavigator\"\n\nconst NAMESPACE = `viewportNavigator`\n\nexport const createViewportNavigator = ({ spineItemManager, context, pagination, element, cfiLocator, locator, hooks$ }: {\n spineItemManager: SpineItemManager,\n pagination: Pagination,\n context: Context,\n element: HTMLElement,\n cfiLocator: ReturnType<typeof createCfiLocator>\n locator: ReturnType<typeof createLocationResolver>,\n hooks$: Observable<Hook[]>\n}) => {\n let currentViewportPositionMemoUnused: { x: number, y: number } | undefined\n /**\n * This position correspond to the current navigation position.\n * This is always sync with navigation and adjustment but IS NOT necessarily\n * synced with current viewport. This is because viewport can be animated.\n * This value may be used to adjust / get current valid info about what should be visible.\n * This DOES NOT reflect necessarily what is visible for the user at instant T.\n */\n let currentNavigationPosition: ViewportNavigationEntry = { x: -1, y: 0 }\n const currentNavigationSubject$ = new BehaviorSubject(currentNavigationPosition)\n const navigator = createNavigationResolver({ context, spineItemManager, cfiLocator, locator })\n const adjustNavigationSubject$ = new Subject<{ position: ViewportNavigationEntry, animate: boolean }>()\n\n /**\n * Keep in mind that the viewport position IS NOT necessarily the current navigation position.\n * Because there could be an animation running the viewport may be late. To retrieve the current position\n * use the dedicated property.\n */\n const getCurrentViewportPosition = Report.measurePerformance(`${NAMESPACE} getCurrentViewportPosition`, 1, () => {\n if (currentViewportPositionMemoUnused && currentViewportPositionMemoUnused?.x !== (~~(Math.abs(element.getBoundingClientRect().x) * 10) / 10)) {\n // console.error(`FOOOOO`, currentViewportPositionMemo?.x, ~~(Math.abs(element.getBoundingClientRect().x) * 10) / 10)\n }\n // if (currentViewportPositionMemo) return currentViewportPositionMemo\n\n if (context.getSettings().computedPageTurnMode === `scrollable`) {\n const newValue = { x: element.scrollLeft, y: element.scrollTop }\n currentViewportPositionMemoUnused = newValue\n\n return currentViewportPositionMemoUnused\n }\n\n const { x, y } = element.getBoundingClientRect()\n\n const newValue = {\n // we want to round to first decimal because it's possible to have half pixel\n // however browser engine can also gives back x.yyyy based on their precision\n // @see https://stackoverflow.com/questions/13847053/difference-between-and-math-floor for ~~\n x: ~~(Math.abs(x) * 10) / 10,\n y: ~~(Math.abs(y) * 10) / 10\n }\n currentViewportPositionMemoUnused = newValue\n\n return currentViewportPositionMemoUnused\n })\n\n const panViewportNavigator = createPanViewportNavigator({\n context,\n element,\n navigator,\n spineItemManager,\n locator,\n getCurrentViewportPosition,\n currentNavigationSubject$\n })\n const scrollViewportNavigator = createScrollViewportNavigator({ context, element, navigator, currentNavigationSubject$ })\n const manualViewportNavigator = createManualViewportNavigator({ context, element, navigator, currentNavigationSubject$, spineItemManager, locator })\n\n const viewportNavigators = [scrollViewportNavigator, panViewportNavigator, manualViewportNavigator]\n const viewportNavigatorsSharedState$ = merge(...viewportNavigators.map(({ $: { state$ } }) => state$))\n\n let lastUserExpectedNavigation:\n | undefined\n // always adjust at the first page\n | { type: `navigate-from-previous-item` }\n // always adjust at the last page\n | { type: `navigate-from-next-item` }\n // always adjust using this cfi\n | { type: `navigate-from-cfi`, data: string }\n // always adjust using this anchor\n | { type: `navigate-from-anchor`, data: string }\n\n const makeItHot = <T>(source$: Observable<T>) => {\n source$.pipe(takeUntil(context.$.destroy$)).subscribe()\n\n return source$\n }\n\n /**\n * @see https://stackoverflow.com/questions/22111256/translate3d-vs-translate-performance\n * for remark about flicker / fonts smoothing\n */\n const adjustReadingOffset = Report.measurePerformance(`adjustReadingOffset`, 2, ({ x, y }: { x: number, y: number }, hooks: Hook[]) => {\n currentViewportPositionMemoUnused = undefined\n\n const isAdjusted = viewportNavigators.reduce((isAdjusted, navigator) => {\n return navigator.adjustReadingOffset({ x, y }) || isAdjusted\n }, false)\n\n if (!isAdjusted) {\n if (context.isRTL()) {\n element.style.transform = `translate3d(${x}px, -${y}px, 0)`\n } else {\n element.style.transform = `translate3d(-${x}px, -${y}px, 0)`\n }\n }\n\n hooks.forEach(hook => {\n if (hook.name === `onViewportOffsetAdjust`) {\n hook.fn()\n }\n })\n }, { disable: true })\n\n /**\n * Verify that current offset is within the current reading item and is at\n * desired pagination.\n * If it is not, then we adjust the offset.\n * The offset could be wrong in the case of there has been re-layout.\n * In this case we always need to make sure to be synchronized with pagination.\n * Pagination is in theory always right because when we move the offset we directly update\n * the pagination. It's after, when re-layout happens for various reason that the page can be at\n * the wrong offset\n * @todo this is being called a lot, try to optimize\n */\n const adjustNavigation = (spineItem: SpineItem) => {\n // @todo we should get the cfi of focused item, if focused item is not inside pagination then go to spine index\n const lastCfi = pagination.getBeginInfo().cfi\n let adjustedSpinePosition = currentNavigationPosition\n const offsetInSpineItem = 0\n\n if (context.getSettings().computedPageTurnMode === `scrollable`) {\n adjustedSpinePosition = navigator.getMostPredominantNavigationForPosition(getCurrentViewportPosition())\n } else if (lastUserExpectedNavigation?.type === `navigate-from-cfi`) {\n /**\n * When `navigate-from-cfi` we always try to retrieve offset from cfi node and navigate\n * to there\n */\n adjustedSpinePosition = navigator.getNavigationForCfi(lastUserExpectedNavigation.data)\n Report.log(NAMESPACE, `adjustNavigation`, `navigate-from-cfi`, `use last cfi`)\n } else if (lastUserExpectedNavigation?.type === `navigate-from-next-item`) {\n /**\n * When `navigate-from-next-item` we always try to get the offset of the last page, that way\n * we ensure reader is always redirected to last page\n */\n adjustedSpinePosition = navigator.getNavigationForLastPage(spineItem)\n Report.log(NAMESPACE, `adjustNavigation`, `navigate-from-next-item`, {})\n } else if (lastUserExpectedNavigation?.type === `navigate-from-previous-item`) {\n /**\n * When `navigate-from-previous-item'`\n * we always try stay on the first page of the item\n */\n adjustedSpinePosition = navigator.getNavigationForPage(0, spineItem)\n Report.log(NAMESPACE, `adjustNavigation`, `navigate-from-previous-item`, {})\n } else if (lastUserExpectedNavigation?.type === `navigate-from-anchor`) {\n /**\n * When `navigate-from-anchor` we just stay on the current reading item and try to get\n * the offset of that anchor.\n */\n const anchor = lastUserExpectedNavigation.data\n adjustedSpinePosition = navigator.getNavigationForAnchor(anchor, spineItem)\n } else if (lastCfi) {\n // @todo, ignore cfi if the current focus item\n /**\n * When there is no last navigation then we first look for any existing CFI. If there is a cfi we try to retrieve\n * the offset and navigate the user to it\n * @todo handle vertical writing, we are always redirected to page 1 currently\n */\n adjustedSpinePosition = navigator.getNavigationForCfi(lastCfi)\n Report.log(NAMESPACE, `adjustNavigation`, `use last cfi`)\n } else {\n // @todo we should get the page index of the focused item, if focus item is not inside pagination then go to spine index\n /**\n * Last resort case, there is no CFI so we check the current page and try to navigate to the closest one\n */\n // @todo get x of first visible element and try to get the page for this element\n // using the last page is not accurate since we could have less pages\n const currentPageIndex = pagination.getBeginInfo().pageIndex || 0\n adjustedSpinePosition = navigator.getNavigationForPage(currentPageIndex, spineItem)\n Report.log(NAMESPACE, `adjustNavigation`, `use guess strategy`, {})\n }\n\n const areDifferent = navigator.arePositionsDifferent(adjustedSpinePosition, currentNavigationPosition)\n\n Report.log(NAMESPACE, `adjustNavigation`, { areDifferent, offsetInSpineItem, expectedSpineOffset: adjustedSpinePosition, currentNavigationPosition, lastUserExpectedNavigation })\n\n if (areDifferent) {\n adjustNavigationSubject$.next({ position: adjustedSpinePosition, animate: false })\n }\n\n return of({ previousNavigationPosition: currentNavigationPosition, adjustedSpinePosition, areDifferent })\n }\n\n const layout = () => {\n currentViewportPositionMemoUnused = undefined\n\n if (context.getSettings().computedPageTurnMode === `scrollable`) {\n element.style.removeProperty(`transform`)\n element.style.removeProperty(`transition`)\n }\n }\n\n const navigation$: Observable<{\n position: { x: number, y: number, spineItem?: SpineItem },\n triggeredBy: `manual` | `adjust` | `scroll`,\n animation: false | `turn` | `snap`\n }> = merge(\n panViewportNavigator.$.navigation$\n .pipe(\n map((event) => ({\n ...event,\n position: { x: event.x, y: event.y, spineItem: event.spineItem },\n animation: `snap` as const,\n triggeredBy: `manual` as const\n }))\n ),\n manualViewportNavigator.$.navigation$\n .pipe(\n map((event) => ({\n ...event,\n position: { x: event.x, y: event.y, spineItem: event.spineItem },\n animation: event.animate ? `turn` as const : false as false,\n triggeredBy: `manual` as const\n }))\n ),\n adjustNavigationSubject$\n .pipe(\n map((event) => ({\n ...event,\n triggeredBy: `adjust` as const,\n animation: event.animate ? `turn` as const : false as false\n }))\n ),\n scrollViewportNavigator.$.navigation$\n .pipe(\n map((event) => ({\n ...event,\n triggeredBy: `scroll` as const,\n animation: event.animate ? `turn` as const : false as false\n }))\n )\n )\n .pipe(\n tap((event) => {\n if (`lastUserExpectedNavigation` in event) {\n lastUserExpectedNavigation = event.lastUserExpectedNavigation\n }\n currentNavigationPosition = event.position\n currentNavigationSubject$.next(currentNavigationPosition)\n }),\n share(),\n takeUntil(context.$.destroy$)\n )\n\n /**\n * Typically all manual navigation (user turn, user end of pan, etc).\n * We try to filter out all navigation that are asynchrone such as scrolling.\n * This is because we do not want to trigger adjust for them since they already adjust\n * the viewport on their own.\n */\n const navigationWhichRequireManualAdjust$ = navigation$\n .pipe(\n filter(({ triggeredBy }) => {\n if (\n triggeredBy === `scroll` ||\n (context.getSettings().computedPageTurnMode === `scrollable` && triggeredBy === `adjust`)\n ) {\n return false\n } else {\n return true\n }\n })\n )\n\n const manualAdjust$ = merge(\n panViewportNavigator.$.moveToSubject$.asObservable()\n .pipe(\n map(event => ({ ...event, animation: false as false }))\n ),\n navigationWhichRequireManualAdjust$\n )\n .pipe(\n map(({ animation, position }) => {\n const shouldAnimate =\n !(\n !animation ||\n (animation === `turn` && context.getSettings().computedPageTurnAnimation === `none`)\n )\n\n return {\n type: `manualAdjust` as const,\n shouldAnimate,\n animation,\n position\n }\n }),\n share()\n )\n\n const processManualAdjust$ = merge(\n manualAdjust$\n )\n .pipe(\n startWith(undefined),\n pairwise(),\n tap(([prevEvent, currentEvent]) => {\n // cleanup potential previous manual adjust\n if (prevEvent?.type === `manualAdjust` && currentEvent?.type !== `manualAdjust`) {\n element.style.setProperty(`transition`, `none`)\n element.style.setProperty(`opacity`, `1`)\n }\n }),\n switchMap(([, currentEvent]) => {\n if (currentEvent?.type !== `manualAdjust`) return EMPTY\n\n const animationDuration = currentEvent.animation === `snap`\n ? context.getSettings().computedSnapAnimationDuration\n : context.getSettings().computedPageTurnAnimationDuration\n const pageTurnAnimation = currentEvent.animation === `snap`\n ? `slide` as const\n : context.getSettings().computedPageTurnAnimation\n\n return of(currentEvent)\n .pipe(\n /**\n * @important\n * Optimization:\n * When the adjustment does not need animation it means we want to be there as fast as possible\n * One example is when we adjust position after layout. In this case we don't want to have flicker or see\n * anything for x ms while we effectively adjust. We want it to be immediate.\n * However when user is repeatedly turning page, we can improve smoothness by delaying a bit the adjustment\n */\n currentEvent.shouldAnimate ? delay(1, animationFrameScheduler) : identity,\n tap((data) => {\n // const noAdjustmentNeeded = !areNavigationDifferent(data.position, getCurrentViewportPosition())\n const noAdjustmentNeeded = false\n\n if (data.shouldAnimate && !noAdjustmentNeeded) {\n if (pageTurnAnimation === `fade`) {\n element.style.setProperty(`transition`, `opacity ${animationDuration / 2}ms`)\n element.style.setProperty(`opacity`, `0`)\n } else if (currentEvent.animation === `snap` || pageTurnAnimation === `slide`) {\n element.style.setProperty(`transition`, `transform ${animationDuration}ms`)\n element.style.setProperty(`opacity`, `1`)\n }\n } else {\n element.style.setProperty(`transition`, `none`)\n element.style.setProperty(`opacity`, `1`)\n }\n }),\n /**\n * @important\n * We always need to adjust the reading offset. Even if the current viewport value\n * is the same as the payload position. This is because an already running animation could\n * be active, meaning the viewport is still adjusting itself (after animation duration). So we\n * need to adjust to anchor to the payload position. This is because we use viewport computed position,\n * not the value set by `setProperty`\n */\n withLatestFrom(hooks$),\n tap(([data, hooks]) => {\n if (pageTurnAnimation !== `fade`) {\n adjustReadingOffset(data.position, hooks)\n }\n }),\n currentEvent.shouldAnimate ? delay(animationDuration / 2, animationFrameScheduler) : identity,\n tap(([data, hooks]) => {\n if (pageTurnAnimation === `fade`) {\n adjustReadingOffset(data.position, hooks)\n element.style.setProperty(`opacity`, `1`)\n }\n }),\n currentEvent.shouldAnimate ? delay(animationDuration / 2, animationFrameScheduler) : identity,\n tap(([data, hooks]) => {\n if (pageTurnAnimation === `fade`) {\n adjustReadingOffset(data.position, hooks)\n }\n }),\n takeUntil(\n viewportNavigatorsSharedState$.pipe(\n filter(state => state === `start`),\n skip(1)\n )\n )\n )\n }),\n share(),\n takeUntil(context.$.destroy$)\n )\n\n /**\n * Observe the state of adjustment.\n * This is used to know whether the viewport is being adjusted by whatever means.\n */\n const adjustmentState$ = merge(\n merge(manualAdjust$)\n .pipe(\n map(() => `start` as const)\n ),\n merge(\n processManualAdjust$\n )\n .pipe(\n map(() => `end` as const)\n )\n )\n\n /**\n * Observe the viewport state.\n * Some actions such as adjustment, user pan moving, etc set the viewport as busy because they require\n * high responsiveness in order to avoid stuttering or fps drop. This observable let you know when is\n * a good time to perform heavy operation.\n *\n * @returns\n * free means the viewport is not moving so it's safe to do computation\n * busy means the viewport is either controlled or animated, etc.\n */\n const state$ = combineLatest([\n ...viewportNavigators.map(({ $: { state$ } }) => state$),\n adjustmentState$\n ])\n .pipe(\n map((states) => states.every(state => state === `end`) ? `free` : `busy`),\n distinctUntilChanged(),\n shareReplay(1),\n /**\n * @important\n * Since state$ is being updated from navigation$ and other exported streams we need it to be\n * hot so it always have the correct value no matter when someone subscribe later.\n * We cannot wait for the cold stream to start after a navigation already happened for example.\n */\n makeItHot\n )\n\n const destroy = () => {\n adjustNavigationSubject$.complete()\n viewportNavigators.forEach(navigator => navigator.destroy())\n }\n\n return {\n destroy,\n layout,\n getCurrentNavigationPosition: () => currentNavigationPosition,\n getCurrentViewportPosition,\n turnLeft: manualViewportNavigator.turnLeft,\n turnRight: manualViewportNavigator.turnRight,\n goToPage: manualViewportNavigator.goToPage,\n goToSpineItem: manualViewportNavigator.goToSpineItem,\n goToUrl: manualViewportNavigator.goToUrl,\n goToCfi: manualViewportNavigator.goToCfi,\n goToPageOfCurrentChapter: manualViewportNavigator.goToPageOfCurrentChapter,\n adjustNavigation,\n moveTo: panViewportNavigator.moveTo,\n getLastUserExpectedNavigation: () => lastUserExpectedNavigation,\n $: {\n state$,\n navigation$\n }\n }\n}\n","import { Context } from \"../context\"\nimport { createFrameItem, SpineItemFrame } from \"./frameItem/frameItem\"\nimport { Manifest } from \"../types\"\nimport { BehaviorSubject, Observable, Subject } from \"rxjs\"\nimport { createFingerTracker, createSelectionTracker } from \"./trackers\"\nimport { isMouseEvent, isPointerEvent } from \"../utils/dom\"\nimport { attachOriginalFrameEventToDocumentEvent } from \"../frames\"\nimport { Hook } from \"../types/Hook\"\nimport { map, takeUntil, tap, withLatestFrom } from \"rxjs/operators\"\nimport { createFrameManipulator } from \"./frameItem/createFrameManipulator\"\n\nconst pointerEvents = [\n `pointercancel` as const,\n `pointerdown` as const,\n `pointerenter` as const,\n `pointerleave` as const,\n `pointermove` as const,\n `pointerout` as const,\n `pointerover` as const,\n `pointerup` as const\n]\n\nconst mouseEvents = [\n `mousedown` as const,\n `mouseup` as const,\n `mouseenter` as const,\n `mouseleave` as const,\n `mousemove` as const,\n `mouseout` as const,\n `mouseover` as const\n]\n\nconst passthroughEvents = [...pointerEvents, ...mouseEvents]\n\nexport const createCommonSpineItem = ({ item, context, parentElement, iframeEventBridgeElement, hooks$, viewportState$ }: {\n item: Manifest[`spineItems`][number],\n parentElement: HTMLElement,\n iframeEventBridgeElement: HTMLElement,\n context: Context,\n hooks$: BehaviorSubject<Hook[]>,\n viewportState$: Observable<`free` | `busy`>\n}) => {\n const destroySubject$ = new Subject<void>()\n const isReflowable = false\n const contentLayoutChangeSubject$ = new Subject<{ isFirstLayout: boolean, isReady: boolean }>()\n const containerElement = createContainerElement(parentElement, item, hooks$)\n const loadingElement = createLoadingElement(parentElement, item, context)\n const overlayElement = createOverlayElement(parentElement, item)\n const fingerTracker = createFingerTracker()\n const selectionTracker = createSelectionTracker()\n const frameHooks = createFrameHooks(iframeEventBridgeElement, fingerTracker, selectionTracker)\n const spineItemFrame = createFrameItem({\n parent: containerElement,\n item,\n context,\n fetchResource: context.getLoadOptions()?.fetchResource,\n hooks$: hooks$.asObservable()\n .pipe(\n map(hooks => [...hooks, ...frameHooks])\n ),\n viewportState$\n })\n // let layoutInformation: { blankPagePosition: `before` | `after` | `none`, minimumWidth: number } = { blankPagePosition: `none`, minimumWidth: context.getPageSize().width }\n\n containerElement.appendChild(loadingElement)\n containerElement.appendChild(overlayElement)\n parentElement.appendChild(containerElement)\n\n // Do not memoize x,y,top,left as they change relatively to the viewport all the time\n let memoizedElementDimensions: { width: number, height: number } | undefined\n\n const getElementDimensions = () => {\n if (memoizedElementDimensions) {\n return memoizedElementDimensions\n }\n\n const rect = containerElement.getBoundingClientRect()\n const normalizedValues = {\n ...rect,\n // we want to round to first decimal because it's possible to have half pixel\n // however browser engine can also gives back x.yyyy based on their precision\n width: Math.round(rect.width * 10) / 10,\n height: Math.round(rect.height * 10) / 10\n }\n\n memoizedElementDimensions = normalizedValues\n\n return memoizedElementDimensions\n }\n\n /**\n * Detect the type of resource (independently of rendition flow).\n * If an image is detected for reflowable for example we may want to display\n * things accordingly.\n */\n const isImageType = () => item.mediaType?.startsWith(`image/`)\n\n const injectStyle = (cssText: string) => {\n spineItemFrame.getManipulableFrame()?.removeStyle(`prose-reader-css`)\n spineItemFrame.getManipulableFrame()?.addStyle(`prose-reader-css`, cssText)\n }\n\n const adjustPositionOfElement = ({ right, left, top }: { right?: number, left?: number, top?: number }) => {\n if (right !== undefined) {\n containerElement.style.right = `${right}px`\n } else {\n containerElement.style.removeProperty(`right`)\n }\n if (left !== undefined) {\n containerElement.style.left = `${left}px`\n } else {\n containerElement.style.removeProperty(`left`)\n }\n if (top !== undefined) {\n containerElement.style.top = `${top}px`\n } else {\n containerElement.style.removeProperty(`top`)\n }\n }\n\n const getViewPortInformation = () => {\n const { width: pageWidth, height: pageHeight } = context.getPageSize()\n const viewportDimensions = spineItemFrame.getViewportDimensions()\n const frameElement = spineItemFrame.getManipulableFrame()?.frame\n if (containerElement && frameElement?.contentDocument && frameElement?.contentWindow && viewportDimensions) {\n const computedWidthScale = pageWidth / viewportDimensions.width\n const computedScale = Math.min(computedWidthScale, pageHeight / viewportDimensions.height)\n\n return { computedScale, computedWidthScale, viewportDimensions }\n }\n\n return { computedScale: 1, computedWidthScale: 1, ...viewportDimensions }\n }\n\n const loadContent = () => spineItemFrame.load()\n\n const unloadContent = () => spineItemFrame.unload()\n\n const getBoundingRectOfElementFromSelector = (selector: string) => {\n const frame = spineItemFrame.getManipulableFrame()?.frame\n if (frame && selector) {\n if (selector.startsWith(`#`)) {\n return frame.contentDocument?.getElementById(selector.replace(`#`, ``))?.getBoundingClientRect()\n }\n return frame.contentDocument?.querySelector(selector)?.getBoundingClientRect()\n }\n }\n\n const setLayoutDirty = () => {\n memoizedElementDimensions = undefined\n }\n\n // const layout = ({ height, width, ...newLayoutInformation }: { height: number, width: number } & typeof layoutInformation) => {\n const layout = ({ height, width }: { height: number, width: number }) => {\n containerElement.style.width = `${width}px`\n containerElement.style.height = `${height}px`\n\n loadingElement.style.setProperty(`max-width`, `${context.getVisibleAreaRect().width}px`)\n\n // layoutInformation = newLayoutInformation\n\n setLayoutDirty()\n\n // hooks$.getValue().forEach(hook => {\n // if (hook.name === `item.onLayout`) {\n // hook.fn({ frame: spineItemFrame.getFrameElement(), container: containerElement, loadingElement, item, overlayElement })\n // }\n // })\n }\n\n const translateFramePositionIntoPage = (position: { clientX: number, clientY: number }) => {\n // Here we use getBoundingClientRect meaning we will get relative value for left / top based on current\n // window (viewport). This is handy because we can easily get the translated x/y without any extra information\n // such as page index, etc. However this might be a bit less performance to request heavily getBoundingClientRect\n const { left = 0, top = 0 } = spineItemFrame.getFrameElement()?.getBoundingClientRect() || {}\n const { computedScale = 1 } = getViewPortInformation() || {}\n const adjustedX = position.clientX * computedScale + left\n const adjustedY = position.clientY * computedScale + top\n\n return {\n clientX: adjustedX,\n clientY: adjustedY\n }\n }\n\n const getResource = async () => {\n const loadOptions = context.getLoadOptions()\n const lastFetch = (_: Manifest[`spineItems`][number]) => {\n if (loadOptions?.fetchResource) {\n return loadOptions.fetchResource(item)\n }\n\n return fetch(item.href)\n }\n\n const finalFetch = hooks$.getValue().reduce((acc, hook) => {\n if (hook.name === `item.onGetResource`) {\n return hook.fn(acc)\n }\n\n return acc\n }, lastFetch)\n\n return await finalFetch(item)\n }\n\n const manipulateSpineItem = (\n cb: (options: {\n container: HTMLElement,\n loadingElement: HTMLElement,\n item: Manifest[`spineItems`][number],\n overlayElement: HTMLDivElement,\n } & (ReturnType<typeof createFrameManipulator> | { frame: undefined, removeStyle: (id: string) => void, addStyle: (id: string, style: string) => void })) => boolean\n ) => {\n const manipulableFrame = spineItemFrame.getManipulableFrame()\n\n if (manipulableFrame) return cb({ ...manipulableFrame, container: containerElement, loadingElement, item, overlayElement })\n\n return cb({ container: containerElement, loadingElement, item, frame: undefined, removeStyle: () => { }, addStyle: () => { }, overlayElement })\n }\n\n const executeOnLayoutBeforeMeasurmentHook = (options: { minimumWidth: number }) => hooks$.getValue().forEach(hook => {\n if (hook.name === `item.onLayoutBeforeMeasurment`) {\n hook.fn({\n frame: spineItemFrame,\n container: containerElement,\n item,\n isImageType,\n ...options\n })\n }\n })\n\n spineItemFrame.$.contentLayoutChange$\n .pipe(\n withLatestFrom(spineItemFrame.$.isReady$),\n takeUntil(destroySubject$)\n )\n .subscribe(([data, isReady]) => {\n if (data.isFirstLayout && isReady) {\n loadingElement.style.visibility = `hidden`\n }\n contentLayoutChangeSubject$.next({ isFirstLayout: data.isFirstLayout, isReady })\n })\n\n spineItemFrame.$.unload$\n .pipe(\n tap(() => {\n if (loadingElement && loadingElement.style.visibility !== `visible`) {\n loadingElement.style.visibility = `visible`\n }\n }),\n takeUntil(destroySubject$)\n )\n .subscribe()\n\n return {\n load: () => {\n setLayoutDirty()\n },\n layout,\n adjustPositionOfElement,\n createLoadingElement,\n getElementDimensions,\n getHtmlFromResource: spineItemFrame.getHtmlFromResource,\n getResource,\n translateFramePositionIntoPage,\n setLayoutDirty,\n injectStyle,\n loadContent,\n unloadContent,\n spineItemFrame,\n element: containerElement,\n loadingElement,\n isReflowable,\n getBoundingRectOfElementFromSelector,\n getViewPortInformation,\n isImageType,\n isReady: spineItemFrame.getIsReady,\n destroy: () => {\n destroySubject$.next()\n loadingElement.onload = () => { }\n loadingElement.remove()\n containerElement.remove()\n spineItemFrame?.destroy()\n fingerTracker.destroy()\n selectionTracker.destroy()\n destroySubject$.complete()\n },\n isUsingVerticalWriting: () => spineItemFrame.getWritingMode()?.startsWith(`vertical`),\n getReadingDirection: () => {\n return spineItemFrame.getReadingDirection() || context.getReadingDirection()\n },\n manipulateSpineItem,\n executeOnLayoutBeforeMeasurmentHook,\n selectionTracker,\n fingerTracker,\n $: {\n contentLayoutChangeSubject$: contentLayoutChangeSubject$.asObservable(),\n loaded$: spineItemFrame.$.loaded$\n }\n }\n}\n\nconst createContainerElement = (containerElement: HTMLElement, item: Manifest[`spineItems`][number], hooks$: BehaviorSubject<Hook[]>) => {\n const element: HTMLElement = containerElement.ownerDocument.createElement(`div`)\n element.classList.add(`spineItem`)\n element.classList.add(`spineItem-${item.renditionLayout}`)\n element.style.cssText = `\n position: absolute;\n overflow: hidden;\n `\n\n return hooks$.getValue().reduce((element, hook) => {\n if (hook.name === `item.onBeforeContainerCreated`) {\n return hook.fn(element)\n }\n\n return element\n }, element)\n}\n\n/**\n * We use iframe for loading element mainly to be able to use share hooks / manipulation\n * with iframe. That way the loading element always match whatever style is applied to iframe.\n */\nconst createLoadingElement = (containerElement: HTMLElement, item: Manifest[`spineItems`][number], context: Context) => {\n const loadingElement = containerElement.ownerDocument.createElement(`div`)\n loadingElement.classList.add(`loading`)\n loadingElement.style.cssText = `\n height: 100%;\n width: 100%;\n max-width: ${context.getVisibleAreaRect().width}px;\n text-align: center;\n display: flex;\n justify-content: center;\n align-items: center;\n flex-direction: column;\n position: absolute;\n left: 0;\n top: 0;\n background-color: white;\n `\n\n const logoElement = containerElement.ownerDocument.createElement(`div`)\n logoElement.innerText = `prose`\n logoElement.style.cssText = `\n font-size: 4em;\n color: #cacaca;\n `\n const detailsElement = containerElement.ownerDocument.createElement(`div`)\n detailsElement.innerText = `loading ${item.id}`\n detailsElement.style.cssText = `\n font-size: 1.2em;\n color: rgb(202, 202, 202);\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n max-width: 300px;\n width: 80%;\n `\n loadingElement.appendChild(logoElement)\n loadingElement.appendChild(detailsElement)\n\n return loadingElement\n}\n\nconst createOverlayElement = (containerElement: HTMLElement, item: Manifest[`spineItems`][number]) => {\n const element = containerElement.ownerDocument.createElement(`div`)\n element.classList.add(`spineItemOverlay`)\n element.classList.add(`spineItemOverlay-${item.renditionLayout}`)\n element.style.cssText = `\n position: absolute;\n width: 100%;\n height: 100%;\n pointer-events: none;\n background-color: transparent;\n `\n\n return element\n}\n\nconst createFrameHooks = (iframeEventBridgeElement: HTMLElement, fingerTracker: ReturnType<typeof createFingerTracker>, selectionTracker: ReturnType<typeof createSelectionTracker>): Hook[] => {\n return [\n {\n name: `item.onLoad`,\n fn: ({ frame }) => {\n /**\n * Register event listener for all mouse/pointer event in order to\n * passthrough events to main document\n */\n const unregister = passthroughEvents.map(event => {\n const listener = (e: MouseEvent | PointerEvent) => {\n let convertedEvent = e\n\n if (isPointerEvent(e)) {\n convertedEvent = new PointerEvent(e.type, e)\n }\n\n if (isMouseEvent(e)) {\n convertedEvent = new MouseEvent(e.type, e)\n }\n\n if (convertedEvent !== e) {\n attachOriginalFrameEventToDocumentEvent(convertedEvent, e)\n iframeEventBridgeElement.dispatchEvent(convertedEvent)\n }\n }\n\n frame.contentDocument?.addEventListener(event, listener)\n\n return () => {\n frame.contentDocument?.removeEventListener(event, listener)\n }\n })\n\n selectionTracker.track(frame)\n fingerTracker.track(frame)\n\n return () => {\n unregister.forEach(cb => cb())\n }\n }\n }\n ]\n}\n","import { of } from \"rxjs\"\nimport { Report } from \"../../report\"\n\nexport const createFrame$ = Report.measurePerformance(`SpineItemFrame createFrame`, Infinity, () => {\n // we force undefined because otherwise the load method will believe it's defined after this call but the code is async and\n // the iframe could be undefined later\n const frame = document.createElement(`iframe`)\n frame.frameBorder = `no`\n frame.tabIndex = 0\n frame.setAttribute(`sandbox`, `allow-same-origin allow-scripts`)\n frame.scrolling = `no`\n frame.style.cssText = `\n visibility: hidden;\n overflow: hidden;\n background-color: transparent;\n border: 0px none transparent;\n padding: 0px;\n transition: opacity 300ms;\n opacity: 0;\n `\n\n return of(frame)\n})\n","import { createAddStyleHelper, createRemoveStyleHelper } from \"../../frames\"\n\nexport const createFrameManipulator = (frameElement: HTMLIFrameElement) => ({\n frame: frameElement,\n removeStyle: createRemoveStyleHelper(frameElement),\n addStyle: createAddStyleHelper(frameElement)\n})\n","import { Manifest } from \"../../types\"\nimport { detectContentType, parseContentType } from \"../../utils/contentType\"\nimport { getBase64FromBlob } from \"../../utils/objects\"\n\n/**\n * Document is application/xhtml+xml\n */\nexport const createHtmlPageFromResource = async (resourceResponse: Response | string, item: Manifest[`spineItems`][number]) => {\n if (typeof resourceResponse === `string`) return resourceResponse\n\n const contentType = parseContentType(resourceResponse.headers.get(`Content-Type`) || ``) || detectContentType(item.href)\n\n if ([`image/jpg`, `image/jpeg`, `image/png`, `image/webp`].some(mime => mime === contentType)) {\n const data = await getBase64FromBlob(await resourceResponse.blob())\n\n return `\n <html>\n <head>\n <meta name=\"viewport\" content=\"width=device-width, minimum-scale=0.1\">\n </head>\n <body style=\"margin: 0px;\" tab-index=\"-1;\">\n <img\n src=\"${data}\"\n style=\"max-width: 100%;height:100%;object-fit:contain;\"\n >\n </body>\n </html>\n `\n }\n\n if ([`text/plain`].some(mime => mime === contentType)) {\n const data = await resourceResponse.text()\n\n return `\n <!DOCTYPE html>\n <html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:epub=\"http://www.idpf.org/2007/ops\" xml:lang=\"en\" lang=\"en\">\n <head>\n <style>\n pre {\n white-space: pre;\n white-space: pre-wrap;\n word-wrap: break-word;\n }\n </style>\n </head>\n <body>\n <pre>${data}</pre>\n </body>\n </html>\n `\n }\n\n const content = await resourceResponse.text()\n\n // return content.replace(`<head>`, `<head><base xmlns href=\"${item.href}\" />`)\n\n return content\n}\n","import { BehaviorSubject, merge, Observable, Subject } from \"rxjs\"\nimport { Manifest } from \"../../types\"\nimport { Context } from \"../../context\"\nimport { getAttributeValueFromString } from \"../../frames\"\nimport { Hook } from \"../../types/Hook\"\nimport { map } from \"rxjs/operators\"\nimport { createLoader } from \"./loader\"\nimport { createFrameManipulator } from \"./createFrameManipulator\"\nimport { createHtmlPageFromResource } from \"./createHtmlPageFromResource\"\n\nexport const createFrameItem = ({ item, parent, fetchResource, context, hooks$, viewportState$ }: {\n parent: HTMLElement,\n item: Manifest[`spineItems`][number],\n context: Context,\n fetchResource?: (item: Manifest[`spineItems`][number]) => Promise<Response>,\n hooks$: Observable<Hook[]>,\n viewportState$: Observable<`free` | `busy`>\n}) => {\n const destroySubject$ = new Subject<void>()\n\n const {\n $: {\n unload$,\n loaded$,\n isLoaded$,\n isReady$,\n unloaded$,\n frameElement$,\n ready$\n },\n load,\n unload,\n destroy: loaderDestroy,\n getComputedStyleAfterLoad\n } = createLoader({ context, hooks$, item, parent, fetchResource, viewportState$ })\n\n const isLoadedSubject$ = new BehaviorSubject(false)\n const isReadySubject$ = new BehaviorSubject(false)\n\n isLoaded$.subscribe(isLoadedSubject$)\n isReady$.subscribe(isReadySubject$)\n\n const getManipulableFrame = () => {\n const frame = frameElement$.getValue()\n if (isLoadedSubject$.value && frame) {\n return createFrameManipulator(frame)\n }\n }\n\n // @todo memoize\n const getViewportDimensions = () => {\n const frame = frameElement$.getValue()\n\n if (frame && frame?.contentDocument) {\n const doc = frame.contentDocument\n const viewPortMeta = doc.querySelector(`meta[name='viewport']`)\n if (viewPortMeta) {\n const viewPortMetaInfos = viewPortMeta.getAttribute(`content`)\n if (viewPortMetaInfos) {\n const width = getAttributeValueFromString(viewPortMetaInfos, `width`)\n const height = getAttributeValueFromString(viewPortMetaInfos, `height`)\n if (width > 0 && height > 0) {\n return {\n width: width,\n height: height\n }\n } else {\n return undefined\n }\n }\n }\n }\n\n return undefined\n }\n\n const getWritingMode = () => {\n return getComputedStyleAfterLoad()?.writingMode as `vertical-rl` | `horizontal-tb` | undefined\n }\n\n const isUsingVerticalWriting = () => {\n return !!getWritingMode()?.startsWith(`vertical`)\n }\n\n const getHtmlFromResource = (response: Response) => {\n return createHtmlPageFromResource(response, item)\n }\n\n const contentLayoutChange$ = merge(\n unloaded$\n .pipe(\n map(() => ({ isFirstLayout: false }))\n ),\n ready$\n .pipe(\n map(() => ({ isFirstLayout: true }))\n )\n )\n\n const destroy = () => {\n unload()\n loaderDestroy()\n destroySubject$.next()\n destroySubject$.complete()\n }\n\n return {\n getIsLoaded: () => isLoadedSubject$.value,\n getIsReady: () => isReadySubject$.value,\n getViewportDimensions,\n getFrameElement: () => frameElement$.getValue(),\n getHtmlFromResource,\n load,\n unload,\n /**\n * Upward layout is used when the parent wants to manipulate the iframe without triggering\n * `layout` event. This is a particular case needed for iframe because the parent can layout following\n * an iframe `layout` event. Because the parent `layout` may change some of iframe properties we do not\n * want the iframe to trigger a new `layout` even and have infinite loop.\n */\n staticLayout: (size: { width: number, height: number }) => {\n const frame = frameElement$.getValue()\n if (frame) {\n frame.style.width = `${size.width}px`\n frame.style.height = `${size.height}px`\n\n if (context.getSettings().computedPageTurnMode !== `scrollable`) {\n // @todo see what's the impact\n frame.setAttribute(`tab-index`, `0`)\n }\n }\n },\n // @todo block access, only public API to manipulate / get information (in order to memo / optimize)\n // manipulate() with cb and return boolean whether re-layout or not\n getManipulableFrame,\n getReadingDirection: (): `ltr` | `rtl` | undefined => {\n const writingMode = getWritingMode()\n if (writingMode === `vertical-rl`) {\n return `rtl`\n }\n\n const direction = getComputedStyleAfterLoad()?.direction\n if ([`ltr`, `rtl`].includes(direction || ``)) return direction as (`ltr` | `rtl`)\n\n return undefined\n },\n isUsingVerticalWriting,\n getWritingMode,\n destroy,\n $: {\n unload$: unload$,\n unloaded$: unloaded$,\n loaded$,\n ready$,\n isReady$: isReadySubject$.asObservable(),\n /**\n * This is used as upstream layout change. This event is being listened to by upper app\n * in order to layout again and adjust every element based on the new content.\n */\n contentLayoutChange$\n }\n }\n}\n\nexport type SpineItemFrame = ReturnType<typeof createFrameItem>\n","import { BehaviorSubject, EMPTY, from, fromEvent, merge, Observable, of, Subject } from \"rxjs\"\nimport { exhaustMap, filter, map, mapTo, mergeMap, share, take, takeUntil, delay, tap, withLatestFrom, switchMap, distinctUntilChanged } from \"rxjs/operators\"\nimport { Report } from \"../..\"\nimport { ITEM_EXTENSION_VALID_FOR_FRAME_SRC } from \"../../constants\"\nimport { Context } from \"../../context\"\nimport { Manifest } from \"../../types\"\nimport { Hook } from \"../../types/Hook\"\nimport { createFrame$ } from \"./createFrame$\"\nimport { createFrameManipulator } from \"./createFrameManipulator\"\nimport { createHtmlPageFromResource } from \"./createHtmlPageFromResource\"\n\nconst isOnLoadHook = (hook: Hook): hook is Extract<Hook, { name: `item.onLoad` }> => hook.name === `item.onLoad`\n\nexport const createLoader = ({ item, parent, fetchResource, hooks$, context, viewportState$ }: {\n item: Manifest[`spineItems`][number],\n parent: HTMLElement,\n fetchResource?: (item: Manifest[`spineItems`][number]) => Promise<Response>,\n hooks$: Observable<Hook[]>,\n context: Context,\n viewportState$: Observable<`free` | `busy`>\n}) => {\n const destroySubject$ = new Subject<void>()\n const loadSubject$ = new Subject<void>()\n const unloadSubject$ = new Subject<void>()\n const frameElementSubject$ = new BehaviorSubject<HTMLIFrameElement | undefined>(undefined)\n const isLoadedSubject$ = new BehaviorSubject(false)\n const isReadySubject$ = new BehaviorSubject(false)\n let hookDestroyFunctions: ReturnType<Extract<Hook, { name: `item.onLoad` }>[`fn`]>[] = []\n let computedStyleAfterLoad: CSSStyleDeclaration | undefined\n\n const makeItHot = <T>(source$: Observable<T>) => {\n source$.pipe(takeUntil(context.$.destroy$)).subscribe()\n\n return source$\n }\n\n const getHtmlFromResource = (response: Response) => {\n return createHtmlPageFromResource(response, item)\n }\n\n const waitForViewportFree$ = viewportState$.pipe(filter(v => v === `free`), take(1))\n\n /**\n * Observable for loading the frame\n */\n const load$ = loadSubject$.asObservable()\n .pipe(\n withLatestFrom(isLoadedSubject$),\n filter(([_, isLoaded]) => !isLoaded),\n // let's ignore later load as long as the first one still runs\n exhaustMap(() => {\n return createFrame$()\n .pipe(\n mergeMap((frame) => waitForViewportFree$.pipe(mapTo(frame))),\n mergeMap((frame) => {\n parent.appendChild(frame)\n\n frameElementSubject$.next(frame)\n\n /**\n * Because of the bug with iframe and sw, we should not use srcdoc and sw together for\n * html document. This is because resources will not pass through SW. IF `fetchResource` is being\n * used the user should be aware of the limitation. We use srcdoc for everything except if we detect\n * an html document and same origin. Hopefully that bug gets fixed one day.\n * @see https://bugs.chromium.org/p/chromium/issues/detail?id=880768\n */\n if (\n !fetchResource &&\n item.href.startsWith(window.location.origin) &&\n (\n // we have an encoding and it's a valid html\n (item.mediaType && [`application/xhtml+xml`, `application/xml`, `text/html`, `text/xml`].includes(item.mediaType)) ||\n // no encoding ? then try to detect html\n (!item.mediaType && (ITEM_EXTENSION_VALID_FOR_FRAME_SRC.some(extension => item.href.endsWith(extension))))\n )\n ) {\n frame?.setAttribute(`src`, item.href)\n\n return of(frame)\n } else {\n const fetchFn = fetchResource || (() => fetch(item.href))\n\n return from(fetchFn(item))\n .pipe(\n mergeMap((response) => getHtmlFromResource(response)),\n tap((htmlDoc) => {\n frame?.setAttribute(`srcdoc`, htmlDoc)\n }),\n map(() => frame)\n )\n }\n }),\n mergeMap((frame) => {\n if (!frame) return EMPTY\n\n frame.setAttribute(`sandbox`, `allow-same-origin allow-scripts`)\n\n return fromEvent(frame, `load`)\n .pipe(\n take(1),\n withLatestFrom(hooks$),\n mergeMap(([_, hooks]) => {\n const body: HTMLElement | undefined | null = frame.contentDocument?.body\n\n if (!body) {\n Report.error(`Something went wrong on iframe load ${item.id}`)\n\n return EMPTY\n }\n // console.log(frame.contentDocument?.head.childNodes)\n // console.log(frame.contentDocument?.body.childNodes)\n\n // const script = frame.contentDocument?.createElement(`script`)\n // // script?.setAttribute(`src`, `https://fred-wang.github.io/mathml.css/mspace.js`)\n // // script?.setAttribute(`src`, `https://fred-wang.github.io/mathjax.js/mpadded-min.js`)\n // // script?.setAttribute(`src`, `https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js`)\n // // script?.setAttribute(`src`, `https://cdn.jsdelivr.net/npm/mathjax@2/MathJax.js?config=TeX-AMS-MML_CHTML`)\n // if (script) {\n // // console.log(frame.contentDocument?.head.childNodes)\n // // console.log(frame.contentDocument?.body.childNodes)\n // // frame.contentDocument?.head.appendChild(script)\n // }\n\n frame.setAttribute(`role`, `main`)\n\n if (frame?.contentDocument && body) {\n computedStyleAfterLoad = frame?.contentWindow?.getComputedStyle(body)\n }\n\n if (context.getSettings().computedPageTurnMode !== `scrollable`) {\n // @todo see what's the impact\n frame.setAttribute(`tab-index`, `0`)\n }\n\n const manipulableFrame = createFrameManipulator(frame)\n\n hookDestroyFunctions = hooks\n .filter(isOnLoadHook)\n .map(hook => manipulableFrame && hook.fn({ ...manipulableFrame, item }))\n\n // we conveniently wait for all the hooks so that the dom is correctly prepared\n // in addition to be ready.\n // domReadySubject$.next(frame)\n\n return of(frame)\n })\n )\n }),\n // we stop loading as soon as unload is requested\n takeUntil(unloadSubject$)\n )\n }),\n share(),\n makeItHot,\n takeUntil(destroySubject$)\n )\n\n /**\n * Observable for when the frame is:\n * - loaded\n * - ready\n */\n const ready$ = load$\n .pipe(\n switchMap((frame) =>\n from(frame?.contentDocument?.fonts.ready || of(undefined))\n .pipe(\n takeUntil(unloadSubject$)\n )\n ),\n share(),\n makeItHot,\n takeUntil(destroySubject$)\n )\n\n const unload$ = unloadSubject$.asObservable()\n .pipe(\n withLatestFrom(frameElementSubject$),\n filter(([_, frame]) => !!frame),\n exhaustMap(() => {\n hookDestroyFunctions.forEach(fn => fn && fn())\n frameElementSubject$.getValue()?.remove()\n frameElementSubject$.next(undefined)\n\n // @todo remove iframe when viewport is free\n\n return of(undefined).pipe(\n takeUntil(load$)\n )\n }),\n share(),\n takeUntil(destroySubject$)\n )\n\n merge(load$.pipe(mapTo(true)), unloadSubject$.pipe(mapTo(false)))\n .pipe(\n distinctUntilChanged(),\n takeUntil(destroySubject$)\n )\n .subscribe(isLoadedSubject$)\n\n merge(ready$.pipe(mapTo(true)), unloadSubject$.pipe(mapTo(false)))\n .pipe(\n distinctUntilChanged(),\n takeUntil(destroySubject$)\n )\n .subscribe(isReadySubject$)\n\n unload$.subscribe()\n\n return {\n load: () => loadSubject$.next(),\n unload: () => unloadSubject$.next(),\n destroy: () => {\n loadSubject$.complete()\n unloadSubject$.complete()\n frameElementSubject$.complete()\n destroySubject$.next()\n destroySubject$.complete()\n isReadySubject$.complete()\n isLoadedSubject$.complete()\n },\n getComputedStyleAfterLoad: () => computedStyleAfterLoad,\n $: {\n load$: loadSubject$.asObservable(),\n unload$: unloadSubject$.asObservable(),\n loaded$: load$,\n isLoaded$: isLoadedSubject$.asObservable(),\n isReady$: isReadySubject$.asObservable(),\n ready$: ready$,\n unloaded$: unload$,\n frameElement$: frameElementSubject$\n }\n }\n}\n","import { BehaviorSubject, Observable } from \"rxjs\"\nimport { Context } from \"../context\"\nimport { Manifest } from \"../types\"\nimport { Hook } from \"../types/Hook\"\nimport { createPrePaginatedSpineItem } from \"./prePaginatedSpineItem\"\nimport { createReflowableSpineItem } from \"./reflowableSpineItem\"\n\nexport type SpineItem = {\n item: Manifest[`spineItems`][number],\n} & (ReturnType<typeof createPrePaginatedSpineItem> | ReturnType<typeof createReflowableSpineItem>)\n\nexport const createSpineItem = ({ item, context, containerElement, iframeEventBridgeElement, hooks$, viewportState$ }: {\n item: Manifest[`spineItems`][number],\n containerElement: HTMLElement,\n iframeEventBridgeElement: HTMLElement,\n context: Context,\n hooks$: BehaviorSubject<Hook[]>,\n viewportState$: Observable<`free` | `busy`>\n }) => {\n let spineItem: ReturnType<typeof createPrePaginatedSpineItem> | ReturnType<typeof createReflowableSpineItem>\n\n if (item.renditionLayout === `pre-paginated`) {\n spineItem = createPrePaginatedSpineItem({ item, context, containerElement, iframeEventBridgeElement, hooks$, viewportState$ })\n } else {\n spineItem = createReflowableSpineItem({ item, context, containerElement, iframeEventBridgeElement, hooks$, viewportState$ })\n }\n\n return {\n item,\n ...spineItem\n }\n}\n","import { Context } from \"../context\"\nimport { getItemOffsetFromPageIndex, getClosestValidOffsetFromApproximateOffsetInPages, getNumberOfPages } from \"../pagination\"\nimport { SpineItem } from \".\"\nimport { getFirstVisibleNodeForViewport, getRangeFromNode } from \"../utils/dom\"\n\ntype SpineItemPosition = { x: number, y: number }\n\nexport const createLocationResolver = ({ context }: {\n context: Context,\n}) => {\n const getSpineItemPositionFromPageIndex = (pageIndex: number, spineItem: SpineItem): SpineItemPosition => {\n const { width: itemWidth, height: itemHeight } = spineItem.getElementDimensions()\n const itemReadingDirection = spineItem.getReadingDirection()\n\n if (spineItem.isUsingVerticalWriting()) {\n const ltrRelativeOffset = getItemOffsetFromPageIndex(context.getPageSize().height, pageIndex, itemHeight)\n\n return {\n x: 0,\n y: ltrRelativeOffset\n }\n }\n\n const ltrRelativeOffset = getItemOffsetFromPageIndex(context.getPageSize().width, pageIndex, itemWidth)\n\n if (itemReadingDirection === `rtl`) {\n return {\n x: (itemWidth - ltrRelativeOffset) - context.getPageSize().width,\n y: 0\n }\n }\n\n return {\n x: ltrRelativeOffset,\n y: 0\n }\n }\n\n /**\n * @important\n * This calculation takes blank page into account, the iframe could be only one page but with a blank page\n * positioned before. Resulting on two page index possible values (0 & 1).\n */\n const getSpineItemPageIndexFromPosition = (position: SpineItemPosition, spineItem: SpineItem) => {\n const { width: itemWidth, height: itemHeight } = spineItem.getElementDimensions()\n const itemReadingDirection = spineItem.getReadingDirection()\n const pageWidth = context.getPageSize().width\n const pageHeight = context.getPageSize().height\n\n let offsetNormalizedForLtr = Math.min(itemWidth, Math.max(0, position.x))\n\n if (itemReadingDirection === `rtl`) {\n offsetNormalizedForLtr = (itemWidth - offsetNormalizedForLtr) - context.getPageSize().width\n }\n\n if (spineItem.isUsingVerticalWriting()) {\n const numberOfPages = getNumberOfPages(itemHeight, pageHeight)\n\n return getPageFromOffset(position.y, pageHeight, numberOfPages)\n } else {\n const numberOfPages = getNumberOfPages(itemWidth, pageWidth)\n const pageIndex = getPageFromOffset(offsetNormalizedForLtr, pageWidth, numberOfPages)\n\n return pageIndex\n }\n }\n\n const getSpineItemOffsetFromAnchor = (anchor: string, spineItem: SpineItem) => {\n const itemWidth = (spineItem.getElementDimensions()?.width || 0)\n const pageWidth = context.getPageSize().width\n const anchorElementBoundingRect = spineItem.getBoundingRectOfElementFromSelector(anchor)\n\n const offsetOfAnchor = anchorElementBoundingRect?.x || 0\n\n return getClosestValidOffsetFromApproximateOffsetInPages(offsetOfAnchor, pageWidth, itemWidth)\n }\n\n const getSpineItemPositionFromNode = (node: Node, offset: number, spineItem: SpineItem) => {\n let offsetOfNodeInSpineItem: number | undefined\n\n // for some reason `img` does not work with range (x always = 0)\n if (node?.nodeName === `img` || (node?.textContent === `` && node.nodeType === Node.ELEMENT_NODE)) {\n offsetOfNodeInSpineItem = (node as HTMLElement).getBoundingClientRect().x\n } else if (node) {\n const range = node ? getRangeFromNode(node, offset) : undefined\n offsetOfNodeInSpineItem = range?.getBoundingClientRect().x || offsetOfNodeInSpineItem\n }\n\n const spineItemWidth = spineItem.getElementDimensions()?.width || 0\n const pageWidth = context.getPageSize().width\n\n if (offsetOfNodeInSpineItem) {\n const val = getClosestValidOffsetFromApproximateOffsetInPages(offsetOfNodeInSpineItem, pageWidth, spineItemWidth)\n\n // @todo vertical\n return { x: val, y: 0 }\n }\n\n return undefined\n }\n\n /**\n * @todo handle vertical\n */\n const getFirstNodeOrRangeAtPage = (pageIndex: number, spineItem: SpineItem) => {\n const pageSize = context.getPageSize()\n const frame = spineItem.spineItemFrame?.getManipulableFrame()?.frame\n\n if (\n frame?.contentWindow?.document &&\n // very important because it is being used by next functions\n frame.contentWindow.document.body !== null\n ) {\n // @todo handle vertical jp\n // top seems ok but left is not, it should probably not be 0 or something\n const { x: left, y: top } = getSpineItemPositionFromPageIndex(pageIndex, spineItem)\n const viewport = {\n left,\n right: left + pageSize.width,\n top,\n bottom: top + pageSize.height\n }\n\n const res = getFirstVisibleNodeForViewport(frame.contentWindow.document, viewport)\n\n return res\n }\n\n return undefined\n }\n\n const getSpineItemClosestPositionFromUnsafePosition = (unsafePosition: SpineItemPosition, spineItem: SpineItem) => {\n const { width, height } = spineItem.getElementDimensions()\n\n const adjustedPosition = {\n x: getClosestValidOffsetFromApproximateOffsetInPages(unsafePosition.x, context.getPageSize().width, width),\n y: getClosestValidOffsetFromApproximateOffsetInPages(unsafePosition.y, context.getPageSize().height, height)\n }\n\n return adjustedPosition\n }\n\n const getSpineItemPageIndexFromNode = (node: Node, offset: number, spineItem: SpineItem) => {\n const position = getSpineItemPositionFromNode(node, offset, spineItem)\n\n return position ? getSpineItemPageIndexFromPosition(position, spineItem) : undefined\n }\n\n const getPageFromOffset = (offset: number, pageWidth: number, numberOfPages: number) => {\n const offsetValues = [...Array(numberOfPages)].map((_, i) => i * pageWidth)\n\n if (offset <= 0) return 0\n\n if (offset >= (numberOfPages * pageWidth)) return numberOfPages - 1\n\n return Math.max(0, offsetValues.findIndex(offsetRange => offset < (offsetRange + pageWidth)))\n }\n\n return {\n getSpineItemPositionFromNode,\n getSpineItemPositionFromPageIndex,\n getSpineItemOffsetFromAnchor,\n getSpineItemPageIndexFromPosition,\n getSpineItemPageIndexFromNode,\n getSpineItemClosestPositionFromUnsafePosition,\n getFirstNodeOrRangeAtPage\n }\n}\n","import { SpineItem } from \".\"\nimport { Context } from \"../context\"\nimport { getNumberOfPages } from \"../pagination\"\nimport { createLocationResolver } from \"./locationResolver\"\n\ntype SpineItemPosition = { x: number, y: number }\n\nexport const createNavigationResolver = ({ context }: { context: Context }) => {\n const spineItemLocator = createLocationResolver({ context })\n\n const getNavigationForLeftPage = (position: SpineItemPosition, spineItem: SpineItem): SpineItemPosition => {\n let nextPotentialPosition = {\n x: position.x - context.getPageSize().width,\n y: position.y\n }\n\n if (spineItem.isUsingVerticalWriting()) {\n nextPotentialPosition = {\n x: position.x,\n y: position.y + context.getPageSize().height\n }\n }\n\n return spineItemLocator.getSpineItemClosestPositionFromUnsafePosition(nextPotentialPosition, spineItem)\n }\n\n const getNavigationForRightPage = (position: SpineItemPosition, spineItem: SpineItem): SpineItemPosition => {\n let nextPotentialPosition = {\n x: position.x + context.getPageSize().width,\n y: position.y\n }\n\n if (spineItem.isUsingVerticalWriting()) {\n nextPotentialPosition = {\n x: position.x,\n y: position.y - context.getPageSize().height\n }\n }\n\n return spineItemLocator.getSpineItemClosestPositionFromUnsafePosition(nextPotentialPosition, spineItem)\n }\n\n const getNavigationForLastPage = (spineItem: SpineItem): SpineItemPosition => {\n if (spineItem.isUsingVerticalWriting()) {\n const pageHeight = context.getPageSize().height\n const numberOfPages = getNumberOfPages(spineItem.getElementDimensions().height, pageHeight)\n return getNavigationForPage(numberOfPages - 1, spineItem)\n } else {\n const pageWidth = context.getPageSize().width\n const numberOfPages = getNumberOfPages(spineItem.getElementDimensions().width, pageWidth)\n return getNavigationForPage(numberOfPages - 1, spineItem)\n }\n }\n\n const getNavigationForPage = (pageIndex: number, spineItem: SpineItem): SpineItemPosition => {\n const currentViewport = spineItemLocator.getSpineItemPositionFromPageIndex(pageIndex, spineItem)\n\n return currentViewport\n }\n\n const getNavigationFromNode = (spineItem: SpineItem, node: Node, offset: number) => {\n const position = spineItemLocator.getSpineItemPositionFromNode(node, offset, spineItem)\n\n return position || { x: 0, y: 0 }\n }\n\n const getNavigationForPosition = (spineItem: SpineItem, position: SpineItemPosition) => {\n const potentiallyCorrectedPosition = spineItemLocator.getSpineItemClosestPositionFromUnsafePosition(position, spineItem)\n\n return potentiallyCorrectedPosition\n }\n\n return {\n getNavigationForLeftPage,\n getNavigationForRightPage,\n getNavigationForLastPage,\n getNavigationForPage,\n getNavigationForPosition,\n getNavigationFromNode\n }\n}\n","import { BehaviorSubject, Observable } from \"rxjs\"\nimport { Context } from \"../context\"\nimport { Manifest } from \"../types\"\nimport { Hook } from \"../types/Hook\"\nimport { createCommonSpineItem } from \"./commonSpineItem\"\n\nexport const createPrePaginatedSpineItem = ({ item, context, containerElement, iframeEventBridgeElement, hooks$, viewportState$ }: {\n item: Manifest[`spineItems`][number],\n containerElement: HTMLElement,\n iframeEventBridgeElement: HTMLElement,\n context: Context,\n hooks$: BehaviorSubject<Hook[]>,\n viewportState$: Observable<`free` | `busy`>\n}) => {\n const commonSpineItem = createCommonSpineItem({ context, item, parentElement: containerElement, iframeEventBridgeElement, hooks$, viewportState$ })\n const spineItemFrame = commonSpineItem.spineItemFrame\n\n const getDimensions = () => {\n const pageSize = context.getPageSize()\n const pageWidth = pageSize.width\n const columnHeight = pageSize.height\n const columnWidth = pageWidth\n\n return { columnHeight, columnWidth }\n }\n\n const applySize = ({ blankPagePosition, minimumWidth, spreadPosition }: { blankPagePosition: `before` | `after` | `none`, minimumWidth: number, spreadPosition: `none` | `left` | `right` }) => {\n const { width: pageWidth, height: pageHeight } = context.getPageSize()\n const { viewportDimensions, computedScale } = commonSpineItem.getViewPortInformation()\n const visibleArea = context.getVisibleAreaRect()\n const frameElement = spineItemFrame.getManipulableFrame()?.frame\n\n if (spineItemFrame?.getIsLoaded() && frameElement?.contentDocument && frameElement?.contentWindow) {\n const contentWidth = pageWidth\n const contentHeight = visibleArea.height + context.getCalculatedInnerMargin()\n\n const cssLink = buildDocumentStyle({\n ...getDimensions(),\n enableTouch: context.getSettings().computedPageTurnMode !== `scrollable`,\n spreadPosition\n }, viewportDimensions)\n\n frameElement?.style.setProperty(`visibility`, `visible`)\n frameElement?.style.setProperty(`opacity`, `1`)\n\n if (viewportDimensions) {\n commonSpineItem.injectStyle(cssLink)\n spineItemFrame.staticLayout({\n width: viewportDimensions.width,\n height: viewportDimensions.height\n })\n frameElement?.style.setProperty(`--scale`, `${computedScale}`)\n frameElement?.style.setProperty(`position`, `absolute`)\n frameElement?.style.setProperty(`top`, `50%`)\n if (spreadPosition === `left`) {\n frameElement?.style.setProperty(`right`, `0`)\n frameElement?.style.removeProperty(`left`)\n } else if (blankPagePosition === `before` && context.isRTL()) {\n frameElement?.style.setProperty(`right`, `50%`)\n frameElement?.style.removeProperty(`left`)\n } else if (spreadPosition === `right`) {\n frameElement?.style.setProperty(`left`, `0`)\n frameElement?.style.removeProperty(`right`)\n } else {\n frameElement?.style.setProperty(`left`,\n blankPagePosition === `before`\n ? context.isRTL() ? `25%` : `75%`\n : blankPagePosition === `after`\n ? context.isRTL() ? `75%` : `25%`\n : `50%`\n )\n frameElement?.style.removeProperty(`right`)\n }\n const transformTranslateX =\n spreadPosition !== `none`\n ? `0`\n : `-50%`\n const transformOriginX =\n (spreadPosition === `right` && blankPagePosition !== `before`)\n ? `left`\n : (spreadPosition === `left` || (blankPagePosition === `before` && context.isRTL()))\n ? `right`\n : `center`\n frameElement?.style.setProperty(`transform`, `translate(${transformTranslateX}, -50%) scale(${computedScale})`)\n frameElement?.style.setProperty(`transform-origin`, `${transformOriginX} center`)\n\n commonSpineItem.executeOnLayoutBeforeMeasurmentHook({ minimumWidth })\n } else {\n commonSpineItem.injectStyle(cssLink)\n spineItemFrame.staticLayout({\n width: contentWidth,\n height: contentHeight\n })\n if (blankPagePosition === `before`) {\n if (context.isRTL()) {\n frameElement?.style.setProperty(`margin-right`, `${pageWidth}px`)\n } else {\n frameElement?.style.setProperty(`margin-left`, `${pageWidth}px`)\n }\n } else {\n frameElement?.style.removeProperty(`margin-left`)\n frameElement?.style.removeProperty(`margin-right`)\n }\n }\n\n commonSpineItem.executeOnLayoutBeforeMeasurmentHook({ minimumWidth })\n\n // commonSpineItem.layout({ width: minimumWidth, height: contentHeight, minimumWidth, blankPagePosition })\n commonSpineItem.layout({ width: minimumWidth, height: contentHeight })\n\n return { width: minimumWidth, height: contentHeight }\n } else {\n commonSpineItem.executeOnLayoutBeforeMeasurmentHook({ minimumWidth })\n // commonSpineItem.layout({ width: minimumWidth, height: pageHeight, minimumWidth, blankPagePosition })\n commonSpineItem.layout({ width: minimumWidth, height: pageHeight })\n }\n\n return { width: minimumWidth, height: pageHeight }\n }\n\n const layout = (layoutInformation: { blankPagePosition: `before` | `after` | `none`, minimumWidth: number, spreadPosition: `none` | `left` | `right` }) => {\n return applySize(layoutInformation)\n }\n\n const destroy = () => {\n commonSpineItem.destroy()\n }\n\n return {\n ...commonSpineItem,\n layout,\n destroy\n }\n}\n\nconst buildDocumentStyle = ({ columnWidth, enableTouch, spreadPosition }: {\n columnWidth: number,\n columnHeight: number,\n enableTouch: boolean,\n spreadPosition: `none` | `left` | `right`\n}, viewportDimensions: { height: number, width: number } | undefined) => {\n return `\n body {\n \n }\n body {\n margin: 0;\n ${!viewportDimensions\n ? `\n display: flex;\n justify-content: ${spreadPosition === `left` ? `flex-end` : spreadPosition === `right` ? `flex-start` : `center`};\n `\n : ``}\n }\n ${/*\n might be html * but it does mess up things like figure if so.\n check accessible_epub_3\n */``}\n html, body {\n height: 100%;\n width: 100%;\n }\n ${/*\n This one is important for preventing 100% img to resize above\n current width. Especially needed for cbz conversion\n */``}\n html, body {\n -max-width: ${columnWidth}px !important;\n }\n ${\n /*\n * @see https://hammerjs.github.io/touch-action/\n * It needs to be disabled when using free scroll\n */\n ``}\n html, body {\n ${enableTouch\n ? `\n touch-action: none\n `\n : ``}\n }\n ${/*\n prevent drag of image instead of touch on firefox\n */``}\n img {\n user-select: none;\n -webkit-user-drag: none;\n -khtml-user-drag: none;\n -moz-user-drag: none;\n -o-user-drag: none;\n user-drag: none;\n ${/*\n prevent weird overflow or margin. Try `block` if `flex` has weird behavior\n */``}\n display: flex;\n ${/*\n If the document does not have viewport, we cannot scale anything inside.\n This should never happens with a valid epub document however it will happens if\n we load .jpg, .png, etc directly in the iframe. This is expected, in this case we force\n the inner content to display correctly.\n */``}\n ${!viewportDimensions\n ? `\n -width: 100%;\n max-width: 100%;\n height:100%;\n object-fit:contain;\n `\n : ``}\n }\n `\n}\n","import { BehaviorSubject, Observable } from \"rxjs\"\nimport { Context } from \"../context\"\nimport { Manifest } from \"../types\"\nimport { Hook } from \"../types/Hook\"\nimport { createCommonSpineItem } from \"./commonSpineItem\"\n\nexport const createReflowableSpineItem = ({ item, context, containerElement, iframeEventBridgeElement, hooks$, viewportState$ }: {\n item: Manifest[`spineItems`][number],\n containerElement: HTMLElement,\n iframeEventBridgeElement: HTMLElement,\n context: Context,\n hooks$: BehaviorSubject<Hook[]>,\n viewportState$: Observable<`free` | `busy`>\n}) => {\n const commonSpineItem = createCommonSpineItem({ context, item, parentElement: containerElement, iframeEventBridgeElement, hooks$, viewportState$ })\n const spineItemFrame = commonSpineItem.spineItemFrame\n /**\n * This value is being used to avoid item to shrink back to smaller size when getting a layout after\n * the content has been loaded.\n * This means when previous content get unload, the user does not end up farther than he should be due to previous content\n * shrinking.\n *\n * @important\n * For now it's only used for continuous-scroll as experimental test. This could potentially solve the sliding\n * issue with reflow content as wel.\n */\n let latestContentHeightWhenLoaded: number | undefined\n\n const getDimensions = (isUsingVerticalWriting: boolean, minimumWidth: number) => {\n const pageSize = context.getPageSize()\n const horizontalMargin = 0\n const verticalMargin = 0\n let columnWidth = pageSize.width - (horizontalMargin * 2)\n const columnHeight = pageSize.height - (verticalMargin * 2)\n let width = pageSize.width - (horizontalMargin * 2)\n\n if (isUsingVerticalWriting) {\n width = minimumWidth - (horizontalMargin * 2)\n columnWidth = columnHeight\n }\n\n return {\n columnHeight,\n columnWidth,\n // horizontalMargin,\n // verticalMargin,\n width\n }\n }\n\n const layout = ({ blankPagePosition, minimumWidth }: { blankPagePosition: `before` | `after` | `none`, minimumWidth: number }) => {\n const { width: pageWidth, height: pageHeight } = context.getPageSize()\n // reset width of iframe to be able to retrieve real size later\n spineItemFrame.getManipulableFrame()?.frame?.style.setProperty(`width`, `${pageWidth}px`)\n spineItemFrame.getManipulableFrame()?.frame?.style.setProperty(`height`, `${pageHeight}px`)\n\n const viewportDimensions = spineItemFrame.getViewportDimensions()\n const visibleArea = context.getVisibleAreaRect()\n const frameElement = spineItemFrame.getManipulableFrame()?.frame\n const isGloballyPrePaginated = context.getManifest()?.renditionLayout === `pre-paginated`\n\n if (spineItemFrame?.getIsLoaded() && frameElement?.contentDocument && frameElement?.contentWindow) {\n let contentWidth = pageWidth\n let contentHeight = visibleArea.height + context.getCalculatedInnerMargin()\n\n frameElement?.style.setProperty(`visibility`, `visible`)\n frameElement?.style.setProperty(`opacity`, `1`)\n\n if (viewportDimensions) {\n const computedScale = Math.min(pageWidth / viewportDimensions.width, pageHeight / viewportDimensions.height)\n commonSpineItem.injectStyle(buildStyleForFakePrePaginated())\n\n commonSpineItem.executeOnLayoutBeforeMeasurmentHook({ minimumWidth })\n\n spineItemFrame.staticLayout({\n width: viewportDimensions.width,\n height: viewportDimensions.height\n })\n frameElement?.style.setProperty(`--scale`, `${computedScale}`)\n frameElement?.style.setProperty(`position`, `absolute`)\n frameElement?.style.setProperty(`top`, `50%`)\n frameElement?.style.setProperty(`left`,\n blankPagePosition === `before`\n ? context.isRTL() ? `25%` : `75%`\n : blankPagePosition === `after`\n ? context.isRTL() ? `75%` : `25%`\n : `50%`\n )\n frameElement?.style.setProperty(`transform`, `translate(-50%, -50%) scale(${computedScale})`)\n frameElement?.style.setProperty(`transform-origin`, `center center`)\n } else {\n const frameStyle = commonSpineItem.isImageType()\n ? buildStyleForReflowableImageOnly({\n isScrollable: context.getManifest()?.renditionFlow === `scrolled-continuous`,\n enableTouch: context.getSettings().computedPageTurnMode !== `scrollable`\n })\n : buildStyleWithMultiColumn(getDimensions(spineItemFrame.isUsingVerticalWriting(), minimumWidth))\n\n commonSpineItem.injectStyle(frameStyle)\n\n commonSpineItem.executeOnLayoutBeforeMeasurmentHook({ minimumWidth })\n\n if (spineItemFrame.isUsingVerticalWriting()) {\n const pages = Math.ceil(\n frameElement.contentDocument.documentElement.scrollHeight / pageHeight\n )\n contentHeight = pages * pageHeight\n\n spineItemFrame.staticLayout({\n width: minimumWidth,\n height: contentHeight\n })\n } else if (context.getManifest()?.renditionFlow === `scrolled-continuous`) {\n contentHeight = frameElement.contentDocument.documentElement.scrollHeight\n latestContentHeightWhenLoaded = contentHeight\n\n spineItemFrame.staticLayout({\n width: minimumWidth,\n height: contentHeight\n })\n } else {\n const pages = Math.ceil(\n frameElement.contentDocument.documentElement.scrollWidth / pageWidth\n )\n /**\n * It is possible that a pre-paginated epub has reflowable item inside it. This is weird because\n * the spec says that we should use pre-paginated for each spine item. Could be a publisher mistake, in\n * any case we follow the spec and enforce the iframe to be contained within page width.\n * If we don't respect the spec we end up with dynamic pagination for a fixed document, which can update\n * the correct number of pages when item is loaded/unload. Bringing weird user experience.\n * The publisher should use global reflowable with pre-paginated content instead.\n */\n if (isGloballyPrePaginated) {\n contentWidth = pageWidth\n } else {\n contentWidth = pages * pageWidth\n }\n\n spineItemFrame.staticLayout({\n width: contentWidth,\n height: contentHeight\n })\n }\n }\n\n const isFillingAllScreen = contentWidth % minimumWidth === 0\n\n // when a reflow iframe does not fill the entire screen (when spread) we will\n // enlarge the container to make sure no other reflow item starts on the same screen\n if (!isFillingAllScreen) {\n contentWidth = contentWidth + pageWidth\n if (context.isRTL() && !commonSpineItem.isUsingVerticalWriting()) {\n frameElement?.style.setProperty(`margin-left`, `${pageWidth}px`)\n }\n } else {\n frameElement?.style.setProperty(`margin-left`, `0px`)\n }\n\n commonSpineItem.layout({ width: contentWidth, height: contentHeight })\n\n return { width: contentWidth, height: contentHeight }\n } else {\n commonSpineItem.executeOnLayoutBeforeMeasurmentHook({ minimumWidth })\n }\n\n const height = latestContentHeightWhenLoaded || pageHeight\n\n commonSpineItem.layout({ width: minimumWidth, height })\n\n return { width: minimumWidth, height }\n }\n\n return {\n ...commonSpineItem,\n isReflowable: true,\n layout\n }\n}\n\n/**\n * Item is:\n * - anything that contains a defined width/height viewport\n *\n * In this case we respect the viewport, scale it and act as pre-paginated\n */\nconst buildStyleForFakePrePaginated = () => {\n return `\n html {\n width: 100%;\n height: 100%;\n }\n body {\n width: 100%;\n height: 100%;\n margin: 0;\n }\n ${\n /*\n * @see https://hammerjs.github.io/touch-action/\n */\n ``}\n html, body {\n touch-action: none;\n }\n img {\n display: flex;\n max-width: 100%;\n max-height: 100%;\n margin: 0 auto;\n }\n `\n}\n\n/**\n * Item is:\n * - not pre-paginated (we would not be in this item otherwise)\n * - jpg, png, etc\n *\n * It does not means it has to be pre-paginated (scrollable for example)\n */\nconst buildStyleForReflowableImageOnly = ({ isScrollable, enableTouch }: { enableTouch: boolean, isScrollable: boolean }) => {\n return `\n html {\n }\n body {\n }\n ${\n /*\n * @see https://hammerjs.github.io/touch-action/\n */\n ``}\n html, body {\n width: 100%;\n margin: 0;\n padding: 0;\n ${enableTouch\n ? `\n touch-action: none\n `\n : ``}\n }\n ${isScrollable\n ? `\n img {\n height: auto !important;\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n ${\n /**\n * line break issue\n * @see https://stackoverflow.com/questions/37869020/image-not-taking-up-the-full-height-of-container\n */\n ``}\n display: block;\n }\n `\n : ``}\n `\n}\n\n/**\n * Item is:\n * - regular html document\n * - does not contain defined width/height viewport\n *\n * We use css multi column to paginate it\n *\n * @important\n * The style here does not takes margin into account, we assume everything is 0.\n * It is being handled by enhancer.\n */\nconst buildStyleWithMultiColumn = ({\n width,\n columnHeight,\n columnWidth\n}: {\n width: number,\n columnWidth: number,\n columnHeight: number,\n}) => {\n return `\n parsererror {\n display: none !important;\n }\n ${/*\n might be html * but it does mess up things like figure if so.\n check accessible_epub_3\n */``}\n html, body {\n margin: 0;\n padding: 0 !important;\n -max-width: ${columnWidth}px !important;\n }\n ${/*\n body {\n height: ${columnHeight}px !important;\n width: ${columnWidth}px !important;\n -margin-left: ${horizontalMargin}px !important;\n -margin-right: ${horizontalMargin}px !important;\n -margin: ${verticalMargin}px ${horizontalMargin}px !important;\n -padding-top: ${horizontalMargin}px !important;\n -padding-bottom: ${horizontalMargin}px !important;\n }\n */``}\n body {\n padding: 0 !important;\n width: ${width}px !important;\n height: ${columnHeight}px !important;\n overflow-y: hidden;\n column-gap: 0px !important;\n column-width: ${columnWidth}px !important;\n column-fill: auto !important;\n word-wrap: break-word;\n box-sizing: border-box;\n }\n body {\n margin: 0;\n }\n body:focus-visible {\n ${/*\n we make sure that there are no outline when we focus something inside the iframe\n */``}\n outline: none;\n }\n ${\n /*\n * @see https://hammerjs.github.io/touch-action/\n */\n ``}\n html, body {\n touch-action: none;\n }\n ${/*\n this messes up hard, be careful with this\n */``}\n * {\n -max-width: ${columnWidth}px !important;\n }\n ${/*\n this is necessary to have a proper calculation when determining size\n of iframe content. If an img is using something like width:100% it would expand to\n the size of the original image and potentially gives back a wrong size (much larger)\n @see https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Columns/Handling_Overflow_in_Multicol\n */``}\n img, video, audio, object, svg {\n max-width: 100%;\n max-width: ${columnWidth}px !important;\n max-height: ${columnHeight}px !important;\n -pointer-events: none;\n -webkit-column-break-inside: avoid;\n page-break-inside: avoid;\n break-inside: avoid;\n }\n figure {\n d-max-width: ${columnWidth}px !important;\n }\n img {\n object-fit: contain;\n break-inside: avoid;\n box-sizing: border-box;\n d-max-width: ${columnWidth}px !important;\n }\n ${/*\n img, video, audio, object, svg {\n max-height: ${columnHeight}px !important;\n box-sizing: border-box;\n object-fit: contain;\n -webkit-column-break-inside: avoid;\n page-break-inside: avoid;\n break-inside: avoid;\n }\n */``}\n table {\n max-width: ${columnWidth}px !important;\n table-layout: fixed;\n }\n td {\n max-width: ${columnWidth}px;\n }\n `\n}\n","import { Subject } from \"rxjs\"\n\nexport const createFingerTracker = () => {\n const fingerPositionInIframe: { x: number | undefined, y: number | undefined } = { x: undefined, y: undefined }\n const subject = new Subject<{ event: `fingermove`, data: { x: number, y: number } } | { event: `fingerout`, data: undefined }>()\n let isMouseDown = false\n\n const track = (frame: HTMLIFrameElement) => {\n fingerPositionInIframe.x = undefined\n fingerPositionInIframe.y = undefined\n\n frame.contentDocument?.addEventListener(`mousedown`, (e) => {\n isMouseDown = true\n fingerPositionInIframe.x = e.x\n fingerPositionInIframe.y = e.y\n subject.next({ event: `fingermove`, data: { x: e.x, y: e.y } })\n })\n\n frame.contentDocument?.addEventListener(`mouseup`, () => {\n isMouseDown = false\n fingerPositionInIframe.x = undefined\n fingerPositionInIframe.y = undefined\n subject.next({ event: `fingerout`, data: undefined })\n })\n\n frame.contentDocument?.addEventListener(`mousemove`, (e) => {\n if (isMouseDown) {\n subject.next({ event: `fingermove`, data: { x: e.x, y: e.y } })\n }\n })\n }\n\n return {\n track,\n getFingerPositionInIframe () {\n return (fingerPositionInIframe.x === undefined || fingerPositionInIframe.y === undefined) ? undefined : fingerPositionInIframe\n },\n destroy: () => {\n\n },\n $: subject.asObservable()\n }\n}\n\nexport const createSelectionTracker = () => {\n let isSelecting = false\n let frame: HTMLIFrameElement | undefined\n const subject = new Subject<\n { event: `selectionchange`, data: Selection | null }\n | { event: `selectstart`, data: Selection | null }\n | { event: `selectend`, data: Selection | null }\n >()\n const mouseUpEvents = [\n `mouseup` as const,\n `pointerup` as const\n ]\n\n const track = (frameToTrack: HTMLIFrameElement) => {\n frame = frameToTrack\n\n mouseUpEvents.forEach(eventName => {\n frameToTrack.contentWindow?.addEventListener(eventName, () => {\n isSelecting = false\n // console.log(`${eventName} selectend`, frame?.contentWindow?.getSelection(), frame?.contentWindow?.getSelection()?.toString())\n // subject.next({ event: 'selectend', data: frame?.contentWindow?.getSelection() || null })\n })\n })\n\n frameToTrack.contentDocument?.addEventListener(`selectionchange`, () => {\n subject.next({ event: `selectionchange`, data: frame?.contentWindow?.getSelection() || null })\n })\n\n frameToTrack.contentWindow?.addEventListener(`selectstart`, () => {\n isSelecting = true\n // console.log(`selectstart`, e)\n // subject.next({ event: 'selectstart', data: frame?.contentWindow?.getSelection() || null })\n })\n }\n\n const destroy = () => {\n\n }\n\n return {\n track,\n destroy,\n isSelecting: () => isSelecting,\n getSelection: () => {\n const selection = frame?.contentWindow?.getSelection()\n if (!selection?.anchorNode || selection.type === `None` || selection.type === `Caret`) return undefined\n\n return selection\n },\n $: subject.asObservable()\n }\n}\n","import { Subject } from \"rxjs\"\nimport { tap, takeUntil } from \"rxjs/operators\"\nimport { Report } from \"./report\"\nimport { Context } from \"./context\"\nimport { SpineItem } from \"./spineItem\"\nimport { isShallowEqual } from \"./utils/objects\"\nimport { getCoverItem } from \"./utils/manifest\"\nimport { ViewportPosition } from \"./types\"\n\nconst NAMESPACE = `spineItemManager`\n\nexport const createSpineItemManager = ({ context }: { context: Context }) => {\n const focus$ = new Subject<{ data: SpineItem }>()\n const layout$ = new Subject<boolean>()\n /**\n * This contains every item dimension / position on the viewport.\n * This is only used to avoid intensively request bounding of each items later.\n * This is always in sync with every layout since it is being updated for every layout\n * done with the manager.\n */\n let itemLayoutInformation: { leftStart: number, leftEnd: number, topStart: number, topEnd: number, width: number, height: number }[] = []\n const orderedSpineItems: SpineItem[] = []\n /**\n * focused item represent the current item that the user navigated to.\n * It can be either the left or right page for a spread, not necessarily the begin item\n * either. This focused item is very important for everything that is related to navigation\n * and adjustment of viewport.\n *\n * @important\n * The focused item can sometime not be visible on the screen, in case of a viewport misalignment.\n * However it means the next adjustment will use the focused item to detect when to move the viewport.\n */\n let focusedSpineItemIndex: number | undefined\n\n /**\n * @todo\n * make sure to check how many times it is being called and try to reduce number of layouts\n * it is called eery time an item is being unload (which can adds up quickly for big books)\n */\n const layout = () => {\n const manifest = context.getManifest()\n const newItemLayoutInformation: typeof itemLayoutInformation = []\n const isGloballyPrePaginated = manifest?.renditionLayout === `pre-paginated`\n const coverItemIndex = manifest ? getCoverItem(manifest) : undefined\n\n orderedSpineItems.reduce((edgeOffset, item, index) => {\n const isPageCover = coverItemIndex === index\n let minimumWidth = context.getPageSize().width\n let blankPagePosition: `none` | `before` | `after` = `none`\n const itemStartOnNewScreen = edgeOffset.edgeX % context.getVisibleAreaRect().width === 0\n const isLastItem = index === orderedSpineItems.length - 1\n\n if (context.shouldDisplaySpread()) {\n /**\n * for now every reflowable content that has reflow siblings takes the entire screen by default\n * this simplify many things and I am not sure the specs allow one reflow\n * to end and an other one to start on the same screen anyway\n *\n * @important\n * For now this is impossible to have reflow not taking all screen. This is because\n * when an element is unloaded, the next element will move back its x, then an adjustment\n * will occurs and the previous element will become visible again, meaning it will be loaded,\n * therefore pushing the focused element, meaning adjustment again, then unload of previous one,\n * ... infinite loop. Due to the nature of reflow it's pretty much impossible to not load the entire\n * book with spread on to make it work.\n *\n * @important\n * When the book is globally pre-paginated we will not apply any of this even if each item is\n * reflowable. This is mostly a publisher mistake but does not comply with spec. Therefore\n * we ignore it\n */\n if (!isGloballyPrePaginated && item.isReflowable && index !== orderedSpineItems.length - 1) {\n minimumWidth = context.getPageSize().width * 2\n }\n\n // mainly to make loading screen looks good\n if (!isGloballyPrePaginated && item.isReflowable && index === orderedSpineItems.length - 1 && itemStartOnNewScreen) {\n minimumWidth = context.getPageSize().width * 2\n }\n\n const lastItemStartOnNewScreenInAPrepaginatedBook = itemStartOnNewScreen && isLastItem && isGloballyPrePaginated\n\n if (item.item.pageSpreadRight && itemStartOnNewScreen && !context.isRTL()) {\n blankPagePosition = `before`\n minimumWidth = context.getPageSize().width * 2\n } else if (item.item.pageSpreadLeft && itemStartOnNewScreen && context.isRTL()) {\n blankPagePosition = `before`\n minimumWidth = context.getPageSize().width * 2\n } else if (lastItemStartOnNewScreenInAPrepaginatedBook) {\n if (context.isRTL()) {\n blankPagePosition = `before`\n } else {\n blankPagePosition = `after`\n }\n minimumWidth = context.getPageSize().width * 2\n }\n\n if (isGloballyPrePaginated && isPageCover) {\n minimumWidth = context.getPageSize().width * 2\n }\n }\n\n const { width, height } = item.layout({\n minimumWidth,\n blankPagePosition,\n spreadPosition: context.shouldDisplaySpread()\n ? itemStartOnNewScreen\n ? context.isRTL() ? `right` : `left`\n : context.isRTL() ? `left` : `right`\n : `none`\n })\n\n if (context.getSettings().computedPageTurnDirection === `vertical`) {\n const currentValidEdgeYForVerticalPositioning = itemStartOnNewScreen ? edgeOffset.edgeY : edgeOffset.edgeY - context.getVisibleAreaRect().height\n const currentValidEdgeXForVerticalPositioning = itemStartOnNewScreen ? 0 : edgeOffset.edgeX\n\n if (context.isRTL()) {\n item.adjustPositionOfElement({\n top: currentValidEdgeYForVerticalPositioning,\n left: currentValidEdgeXForVerticalPositioning\n })\n } else {\n item.adjustPositionOfElement({\n top: currentValidEdgeYForVerticalPositioning,\n left: currentValidEdgeXForVerticalPositioning\n })\n }\n\n const newEdgeX = width + currentValidEdgeXForVerticalPositioning\n const newEdgeY = height + currentValidEdgeYForVerticalPositioning\n\n newItemLayoutInformation.push({\n leftStart: currentValidEdgeXForVerticalPositioning,\n leftEnd: newEdgeX,\n topStart: currentValidEdgeYForVerticalPositioning,\n topEnd: newEdgeY,\n height,\n width\n })\n\n return {\n edgeX: newEdgeX,\n edgeY: newEdgeY\n }\n }\n\n if (context.isRTL()) {\n // could also be negative left but I am not in the mood\n // will push items on the left\n item.adjustPositionOfElement({ right: edgeOffset.edgeX, top: 0 })\n } else {\n // will push items on the right\n item.adjustPositionOfElement({ left: edgeOffset.edgeX, top: 0 })\n }\n\n const newEdgeX = width + edgeOffset.edgeX\n\n newItemLayoutInformation.push({\n leftStart: edgeOffset.edgeX,\n leftEnd: newEdgeX,\n topStart: edgeOffset.edgeY,\n topEnd: height,\n height,\n width\n })\n\n return {\n edgeX: newEdgeX,\n edgeY: 0\n }\n }, { edgeX: 0, edgeY: 0 })\n\n const hasLayoutChanges = itemLayoutInformation.some((old, index) => !isShallowEqual(old, newItemLayoutInformation[index]))\n\n itemLayoutInformation = newItemLayoutInformation\n\n Report.log(NAMESPACE, `layout`, { hasLayoutChanges, itemLayoutInformation })\n\n layout$.next(hasLayoutChanges)\n }\n\n const focus = (indexOrSpineItem: number | SpineItem) => {\n const spineItemToFocus = typeof indexOrSpineItem === `number` ? get(indexOrSpineItem) : indexOrSpineItem\n\n if (!spineItemToFocus) return\n\n const newActiveSpineItemIndex = orderedSpineItems.indexOf(spineItemToFocus)\n\n if (newActiveSpineItemIndex === focusedSpineItemIndex) return\n\n focusedSpineItemIndex = newActiveSpineItemIndex\n\n focus$.next({ data: spineItemToFocus })\n }\n\n /**\n * @todo\n * optimize useless calls to it, such as when the layout has not changed and the focus is still the same\n * @todo\n * analyze poor performances\n */\n const loadContents = Report.measurePerformance(`loadContents`, 10, (rangeOfIndex: [number, number]) => {\n const [leftIndex, rightIndex] = rangeOfIndex\n const numberOfAdjacentSpineItemToPreLoad = context.getLoadOptions()?.numberOfAdjacentSpineItemToPreLoad || 0\n const isPrePaginated = context.getManifest()?.renditionLayout === `pre-paginated`\n const isUsingFreeScroll = context.getSettings().computedPageTurnMode === `scrollable`\n\n orderedSpineItems.forEach((orderedSpineItem, index) => {\n const isBeforeFocusedWithPreload =\n // we never want to preload anything before on free scroll on flow because it could offset the cursor\n (index < leftIndex && !isPrePaginated && isUsingFreeScroll)\n ? true\n : index < (leftIndex - numberOfAdjacentSpineItemToPreLoad)\n const isAfterTailWithPreload = index > (rightIndex + numberOfAdjacentSpineItemToPreLoad)\n if (!isBeforeFocusedWithPreload && !isAfterTailWithPreload) {\n orderedSpineItem.loadContent()\n } else {\n orderedSpineItem.unloadContent()\n }\n })\n })\n\n const get = (indexOrId: number | string) => {\n if (typeof indexOrId === `number`) return orderedSpineItems[indexOrId]\n\n return orderedSpineItems.find(({ item }) => item.id === indexOrId)\n }\n\n /**\n * It's important to not use x,y since we need the absolute position of each element. Otherwise x,y would be relative to\n * current window (viewport).\n */\n const getAbsolutePositionOf = Report.measurePerformance(`getAbsolutePositionOf`, 10, (spineItemOrIndex: SpineItem | number) => {\n const pageTurnDirection = context.getSettings().computedPageTurnDirection\n const indexOfItem = typeof spineItemOrIndex === `number` ? spineItemOrIndex : orderedSpineItems.indexOf(spineItemOrIndex)\n\n const layoutInformation = itemLayoutInformation[indexOfItem]\n\n if (!layoutInformation) {\n return { leftStart: 0, leftEnd: 0, topStart: 0, topEnd: 0, width: 0, height: 0 }\n }\n\n // const distance = orderedSpineItems\n // .slice(0, indexOfItem + 1)\n // .reduce((acc, spineItem) => {\n // const { width, height } = spineItem.getElementDimensions()\n\n // return {\n // leftStart: pageTurnDirection === `horizontal` ? acc.leftEnd : 0,\n // leftEnd: pageTurnDirection === `horizontal` ? acc.leftEnd + width : width,\n // topStart: pageTurnDirection === `horizontal` ? 0 : acc.topEnd,\n // topEnd: pageTurnDirection === `horizontal` ? height : acc.topEnd + height,\n // width,\n // height\n // }\n // }, { leftStart: 0, leftEnd: 0, topStart: 0, topEnd: 0, width: 0, height: 0 })\n\n // console.log(distance, itemLayoutInformation[indexOfItem])\n // return distance\n\n return itemLayoutInformation[indexOfItem] || { leftStart: 0, leftEnd: 0, topStart: 0, topEnd: 0, width: 0, height: 0 }\n }, { disable: true })\n\n const getFocusedSpineItem = () => focusedSpineItemIndex !== undefined ? orderedSpineItems[focusedSpineItemIndex] : undefined\n\n const comparePositionOf = (toCompare: SpineItem, withItem: SpineItem) => {\n const isAfter = orderedSpineItems.indexOf(toCompare) > orderedSpineItems.indexOf(withItem)\n\n if (isAfter) {\n return `after`\n }\n\n return `before`\n }\n\n const getSpineItemIndex = (spineItem: SpineItem | undefined) => {\n if (!spineItem) return undefined\n const index = orderedSpineItems.indexOf(spineItem)\n\n return index < 0 ? undefined : index\n }\n\n const add = (spineItem: SpineItem) => {\n orderedSpineItems.push(spineItem)\n\n spineItem.$.contentLayoutChangeSubject$\n .pipe(takeUntil(context.$.destroy$))\n .subscribe(() => {\n // upstream change, meaning we need to layout again to both resize correctly each item but also to\n // adjust positions, etc\n layout()\n })\n\n spineItem.$.loaded$\n .pipe(\n tap(() => {\n if (spineItem.isUsingVerticalWriting()) {\n context.setHasVerticalWriting()\n }\n }),\n takeUntil(context.$.destroy$)\n )\n .subscribe()\n\n spineItem.load()\n }\n\n const getAll = () => orderedSpineItems\n\n const getLength = () => {\n return orderedSpineItems.length\n }\n\n const getFocusedSpineItemIndex = () => {\n const item = getFocusedSpineItem()\n return item && getSpineItemIndex(item)\n }\n\n const getSpineItemAtPosition = Report.measurePerformance(`getSpineItemAtPosition`, 10, (position: ViewportPosition) => {\n const detectedItem = orderedSpineItems.find(item => {\n const { leftStart, leftEnd, topEnd, topStart } = getAbsolutePositionOf(item)\n\n const isWithinXAxis = position.x >= leftStart && position.x < leftEnd\n\n if (context.getSettings().computedPageTurnDirection === `horizontal`) {\n return isWithinXAxis\n } else {\n return isWithinXAxis && position.y >= topStart && position.y < topEnd\n }\n })\n\n if (position.x === 0 && !detectedItem) return orderedSpineItems[0]\n\n return detectedItem\n }, { disable: true })\n\n const destroy = () => {\n orderedSpineItems.forEach(item => item.destroy())\n focus$.complete()\n layout$.complete()\n }\n\n return {\n add,\n get,\n getAll,\n getLength,\n layout,\n focus,\n loadContents,\n comparePositionOf,\n getAbsolutePositionOf,\n getSpineItemAtPosition,\n getFocusedSpineItem,\n getFocusedSpineItemIndex,\n getSpineItemIndex,\n destroy,\n $: {\n focus$: focus$.asObservable(),\n layout$: layout$.asObservable()\n }\n }\n}\n\nexport type SpineItemManager = ReturnType<typeof createSpineItemManager>\n","type Func<T extends any[], R> = (...a: T) => R\n\n/**\n * Composes single-argument functions from right to left. The rightmost\n * function can take multiple arguments as it provides the signature for the\n * resulting composite function.\n *\n * @param funcs The functions to compose.\n * @returns A function obtained by composing the argument functions from right\n * to left. For example, `compose(f, g, h)` is identical to doing\n * `(...args) => f(g(h(...args)))`.\n */\n// export default function compose(): <R>(a: R) => R\n\nfunction compose<F extends Function>(f: F): F\n\n/* two functions */\nfunction compose<A, T extends any[], R>(\n f1: (a: A) => R,\n f2: Func<T, A>\n): Func<T, R>\n\n/* three functions */\nfunction compose<A, B, T extends any[], R>(\n f1: (b: B) => R,\n f2: (a: A) => B,\n f3: Func<T, A>\n): Func<T, R>\n\n/* four functions */\nfunction compose<A, B, C, T extends any[], R>(\n f1: (c: C) => R,\n f2: (b: B) => C,\n f3: (a: A) => B,\n f4: Func<T, A>\n): Func<T, R>\n\n/* rest */\nfunction compose<R>(\n f1: (a: any) => R,\n ...funcs: Function[]\n): (...args: any[]) => R\n\nfunction compose<R>(...funcs: Function[]): (...args: any[]) => R\n\nfunction compose (...funcs: Function[]) {\n if (funcs.length === 0) {\n // infer the argument type so it is usable in inference down the line\n return <T>(arg: T) => arg\n }\n\n if (funcs.length === 1) {\n return funcs[0]\n }\n\n // return funcs.reduce((a, b) => (...args: any) => a(b(...args)))\n\n // compose from left-to-right instead of right-to-left. That way end user always\n // has sub enhancer as dependency\n return funcs.reduce((a, b) => (...args: any) => b(a(...args)))\n}\n\nexport {\n compose\n}\n","import { getUrlExtension } from \"./url\"\n\nexport const detectContentType = (name: string) => {\n const extension = getUrlExtension(name)\n\n switch (extension) {\n case `png`: return `image/png`\n case `jpg`: return `image/jpg`\n case `jpeg`: return `image/jpeg`\n case `txt`: return `text/plain`\n case `webp`: return `image/webp`\n }\n\n return undefined\n}\n\nexport const parseContentType = (str: string) => {\n if (!str.length) return undefined\n\n const cut = str.indexOf(`;`)\n\n return cut ? str.substring(0, str.indexOf(`;`)) : str\n}\n","// export function createSelectionFromPoint(startX: number, startY: number, endX: number, endY: number) {\n// var doc = document;\n// var start, end, range = null;\n// if (typeof doc.caretPositionFromPoint != \"undefined\") {\n// start = doc.caretPositionFromPoint(startX, startY);\n// end = doc.caretPositionFromPoint(endX, endY);\n// range = doc.createRange();\n// range.setStart(start.offsetNode, start.offset);\n// range.setEnd(end.offsetNode, end.offset);\n// } else if (typeof doc.caretRangeFromPoint != \"undefined\") {\n// start = doc.caretRangeFromPoint(startX, startY);\n// end = doc.caretRangeFromPoint(endX, endY);\n// range = doc.createRange();\n// range.setStart(start.startContainer, start.startOffset);\n// range.setEnd(end.startContainer, end.startOffset);\n// }\n// if (range !== null && typeof window.getSelection != \"undefined\") {\n// var sel = window.getSelection();\n// sel.removeAllRanges();\n// sel.addRange(range);\n// } else if (typeof doc.body.createTextRange != \"undefined\") {\n// range = doc.body.createTextRange();\n// range.moveToPoint(startX, startY);\n// var endRange = range.duplicate();\n// endRange.moveToPoint(endX, endY);\n// range.setEndPoint(\"EndToEnd\", endRange);\n// range.select();\n// }\n// }\n\nimport { Report } from \"../report\"\n\n/**\n * Global env agnostic method to detect if an element is HtmlElement.\n *\n * @example\n * checking instance of element from iframe will not work because\n * `window.HtmlElement` is not the same as iframe.window.HtmlElement\n * element instanceof HtmlElement -> false\n *\n * isHtmlElement(element) -> true\n */\nexport const isHtmlElement = (element?: Element | Node | null | EventTarget): element is HTMLElement => {\n return (\n typeof element === `object` && !!element && `nodeType` in element && element?.nodeType === Node.ELEMENT_NODE && `innerText` in (element as HTMLElement)\n )\n}\n\nfunction createRangeOrCaretFromPoint (doc: Document, startX: number, startY: number) {\n // @see https://developer.mozilla.org/en-US/docs/Web/API/Document/caretPositionFromPoint\n if (`caretPositionFromPoint` in doc) {\n // @see https://developer.mozilla.org/en-US/docs/Web/API/CaretPosition\n // @ts-expect-error\n return doc.caretPositionFromPoint(startX, startY) as { offsetNode: Node, offset: number }\n } else if (typeof doc.caretRangeFromPoint !== `undefined`) {\n return doc.caretRangeFromPoint(startX, startY)\n }\n}\n\ntype ViewPort = { left: number, right: number, top: number, bottom: number }\n\n/**\n * @todo optimize\n */\nexport const getFirstVisibleNodeForViewport = Report.measurePerformance(`getFirstVisibleNodeForViewport`, 1, (documentOrElement: Document | Element, viewport: ViewPort) => {\n const element = (`body` in documentOrElement)\n ? getFirstVisibleElementForViewport(documentOrElement.body, viewport)\n : getFirstVisibleElementForViewport(documentOrElement, viewport)\n\n const ownerDocument = `createRange` in documentOrElement ? documentOrElement : documentOrElement.ownerDocument\n\n if (element) {\n let lastValidRange: Range | undefined\n let lastValidOffset = 0\n const range = ownerDocument.createRange()\n\n Array.from(element.childNodes).some(childNode => {\n range.selectNodeContents(childNode)\n const rects = range.getClientRects()\n const visibleRect = getFirstVisibleDOMRect(rects, viewport)\n\n // At this point we know the range is valid and contains visible rect.\n // This means we have a valid Node. We still need to know the visible offset to be 100% accurate\n if (visibleRect) {\n lastValidRange = range.cloneRange()\n\n /**\n * Now we will try to refine the search to get the offset\n * this is an incredibly expensive operation so we will try to\n * use native functions to get something\n * @important\n * when using float value it looks like sometime when at the begin of the book the returned range will be the last offset of the page\n * it can be tested with moby-dick.txt by using different font size. Whenever using something different than default font size we might\n * have floating point for font and we start having issue. Using ceil \"make sure\" to be inside the point. Hopefully.\n */\n const rangeOrCaret = createRangeOrCaretFromPoint(ownerDocument, Math.ceil(visibleRect.left), Math.ceil(visibleRect.top))\n\n // good news we found something with same node so we can assume the offset is already better than nothing\n if (rangeOrCaret && `startContainer` in rangeOrCaret && rangeOrCaret.startContainer === lastValidRange.startContainer) {\n lastValidOffset = rangeOrCaret.startOffset\n }\n if (rangeOrCaret && `offsetNode` in rangeOrCaret && rangeOrCaret.offsetNode === lastValidRange.startContainer) {\n lastValidOffset = rangeOrCaret.offset\n }\n return true\n }\n return false\n })\n\n if (lastValidRange) {\n return { node: lastValidRange.startContainer, offset: lastValidOffset }\n }\n\n return { node: element, offset: 0 }\n }\n\n return undefined\n})\n\nconst getFirstVisibleElementForViewport = (element: Element, viewport: ViewPort) => {\n let lastValidElement: Element | undefined\n const positionFromViewport = getElementOrNodePositionFromViewPort(element.getBoundingClientRect(), viewport)\n\n if (positionFromViewport !== `before` && positionFromViewport !== `after`) {\n lastValidElement = element\n }\n\n Array.from(element.children).some(child => {\n const childInViewPort = getFirstVisibleElementForViewport(child, viewport)\n if (childInViewPort) {\n lastValidElement = childInViewPort\n\n return true\n }\n\n return false\n })\n\n return lastValidElement\n}\n\nfunction getElementOrNodePositionFromViewPort (domRect: DOMRect, { left, right }: ViewPort) {\n // horizontal + ltr\n if (domRect.left <= left && domRect.right <= left) return `before`\n if (domRect.left <= left && domRect.right > left && domRect.right <= right) return `partially-before`\n if (domRect.left <= right && domRect.right > right) return `partially-after`\n if (domRect.left > right) return `after`\n return `within`\n\n // @todo rtl\n // @todo vertical-lrt\n // @todo vertical-rtl\n}\n\nfunction getFirstVisibleDOMRect (domRect: DOMRectList, viewport: ViewPort) {\n return Array.from(domRect).find(domRect => {\n const position = getElementOrNodePositionFromViewPort(domRect, viewport)\n\n if (position !== `before` && position !== `after`) {\n return true\n }\n return false\n })\n}\n\nexport const getRangeFromNode = (node: Node, offset: number) => {\n if (node.nodeType !== Node.CDATA_SECTION_NODE && node.nodeType !== Node.DOCUMENT_TYPE_NODE) {\n const range = node.ownerDocument?.createRange()\n range?.selectNodeContents(node)\n\n try {\n if (offset <= (range?.endOffset || 0)) {\n range?.setStart(node, offset || 0)\n }\n } catch (e) {\n Report.error(e)\n }\n\n return range\n }\n\n return undefined\n}\n\nexport const isPointerEvent = (event: Event): event is PointerEvent => {\n if ((event as PointerEvent)?.target && (event?.target as Element)?.ownerDocument?.defaultView) {\n const eventView = (event?.target as Element)?.ownerDocument?.defaultView as Window & typeof globalThis\n\n if (eventView.PointerEvent) {\n return event instanceof eventView.PointerEvent\n }\n }\n\n if ((event as PointerEvent)?.view && (event as PointerEvent)?.view?.window) {\n const eventView = (event as PointerEvent)?.view as Window & typeof globalThis\n\n if (eventView.PointerEvent) {\n return event instanceof eventView.PointerEvent\n }\n }\n\n return false\n}\n\nexport const isMouseEvent = (event: Event): event is MouseEvent => {\n if (isPointerEvent(event)) return false\n\n if ((event as MouseEvent)?.target && (event?.target as Element)?.ownerDocument?.defaultView) {\n const eventView = (event?.target as Element)?.ownerDocument?.defaultView as Window & typeof globalThis\n\n if (eventView.MouseEvent) {\n return event instanceof eventView.MouseEvent\n }\n }\n\n if ((event as MouseEvent)?.view && (event as MouseEvent)?.view?.window) {\n const eventView = (event as MouseEvent)?.view as Window & typeof globalThis\n\n if (eventView.MouseEvent) {\n return event instanceof eventView.MouseEvent\n }\n }\n\n return false\n}\n\nexport const isTouchEvent = (event: Event): event is TouchEvent => {\n if ((event as TouchEvent)?.target && (event?.target as Element)?.ownerDocument?.defaultView) {\n const eventView = (event?.target as Element)?.ownerDocument?.defaultView as Window & typeof globalThis\n\n if (eventView.TouchEvent) {\n return event instanceof eventView.TouchEvent\n }\n }\n\n if ((event as TouchEvent)?.view && (event as TouchEvent)?.view?.window) {\n const eventView = (event as TouchEvent)?.view as Window & typeof globalThis\n\n if (eventView.TouchEvent) {\n return event instanceof eventView.TouchEvent\n }\n }\n\n return false\n}\n","import { Manifest } from \"@prose-reader/shared\"\n\n/**\n * @todo strip out param url so that equality works better\n */\nexport const getCoverItem = (manifest: Manifest) => {\n const coverItem = manifest.guide?.find(item => item.type === `cover`)\n\n return manifest.spineItems.findIndex(item => coverItem?.href.endsWith(item.path))\n}\n","// MIT © 2017 azu\nconst hasOwn = Object.prototype.hasOwnProperty\n\n// Object.is polyfill\nexport const is = (x: any, y: any): boolean => {\n if (x === y) {\n return (x !== 0) || (y !== 0) || (1 / x === 1 / y)\n } else {\n return false\n }\n}\n\n/**\n * Return true, if `objectA` is shallow equal to `objectB`.\n * Pass Custom equality function to `customEqual`.\n * Default equality is `Object.is`\n *\n * Options:\n *\n * - `customEqual`: function should return true if the `a` value is equal to `b` value.\n * - `debug`: enable debug info to console log. This log will be disable in production build\n */\nexport const isShallowEqual = <T = any, R = any>(\n objectA: T,\n objectB: R,\n options?: {\n customEqual?: <T>(a: T, b: T) => boolean;\n }\n): boolean => {\n // @ts-ignore\n if (objectA === objectB) {\n return true\n }\n if (typeof objectA !== `object` || objectA === null) {\n return false\n }\n if (typeof objectB !== `object` || objectB === null) {\n return false\n }\n\n const keysA = Object.keys(objectA)\n const keysB = Object.keys(objectB)\n\n if (keysA.length !== keysB.length) {\n return false\n }\n\n const isEqual = options && typeof options.customEqual === `function` ? options.customEqual : is\n\n for (let i = 0; i < keysA.length; i++) {\n const key = keysA[i] || ``\n // @ts-ignore\n if (!hasOwn.call(objectB, key) || !isEqual(objectA[key], objectB[key])) {\n return false\n }\n }\n\n return true\n}\n\nexport const groupBy = <T, K extends keyof any>(list: T[], getKey: (item: T) => K) =>\n list.reduce((previous, currentItem) => {\n const group = getKey(currentItem)\n if (!previous[group]) previous[group] = []\n previous[group].push(currentItem)\n return previous\n }, {} as Record<K, T[]>)\n\nexport const getBase64FromBlob = (data: Blob) => {\n const reader = new FileReader()\n\n return new Promise<string>(resolve => {\n reader.addEventListener(`load`, function () {\n resolve(reader.result as string)\n }, false)\n\n reader.readAsDataURL(data)\n })\n}\n","import { OperatorFunction } from \"rxjs\"\nimport { map } from \"rxjs/operators\"\n\nexport const mapKeysTo = <R extends { [key: string]: any }, K extends keyof R>(keys: K[]): OperatorFunction<R, Pick<R, K>> => {\n return map((obj) => {\n return Object.entries(obj)\n .reduce((acc, [key, entry]) => {\n if (keys.includes(key as any)) {\n return {\n ...acc,\n [key]: entry\n }\n }\n\n return acc\n }, {} as Pick<typeof obj, K>)\n })\n}\n","export const getUrlExtension = (url: string) => {\n return url.split(/[#?]/)[0]?.split(`.`).pop()?.trim() || ``\n}\n","module.exports = require(\"rxjs\");","module.exports = require(\"rxjs/operators\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(\"./src/index.ts\");\n",""],"names":[],"sourceRoot":""}