utilitify-core 1.0.0

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 (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +338 -0
  3. package/dist/async.cjs +25 -0
  4. package/dist/async.cjs.map +1 -0
  5. package/dist/async.d.cts +104 -0
  6. package/dist/async.d.ts +104 -0
  7. package/dist/async.js +4 -0
  8. package/dist/async.js.map +1 -0
  9. package/dist/chunk-2ICNRTSN.cjs +346 -0
  10. package/dist/chunk-2ICNRTSN.cjs.map +1 -0
  11. package/dist/chunk-3DPF72DY.js +170 -0
  12. package/dist/chunk-3DPF72DY.js.map +1 -0
  13. package/dist/chunk-4CV4JOE5.js +24 -0
  14. package/dist/chunk-4CV4JOE5.js.map +1 -0
  15. package/dist/chunk-4SLYNSLH.cjs +783 -0
  16. package/dist/chunk-4SLYNSLH.cjs.map +1 -0
  17. package/dist/chunk-5WP7DWCG.js +1285 -0
  18. package/dist/chunk-5WP7DWCG.js.map +1 -0
  19. package/dist/chunk-BMQ6YPKV.js +876 -0
  20. package/dist/chunk-BMQ6YPKV.js.map +1 -0
  21. package/dist/chunk-BZCMWUKS.cjs +479 -0
  22. package/dist/chunk-BZCMWUKS.cjs.map +1 -0
  23. package/dist/chunk-C5R744DY.cjs +173 -0
  24. package/dist/chunk-C5R744DY.cjs.map +1 -0
  25. package/dist/chunk-C75J62CV.cjs +913 -0
  26. package/dist/chunk-C75J62CV.cjs.map +1 -0
  27. package/dist/chunk-CZLDE2OZ.cjs +28 -0
  28. package/dist/chunk-CZLDE2OZ.cjs.map +1 -0
  29. package/dist/chunk-DSMB6AF6.cjs +193 -0
  30. package/dist/chunk-DSMB6AF6.cjs.map +1 -0
  31. package/dist/chunk-ETWGPOPY.js +426 -0
  32. package/dist/chunk-ETWGPOPY.js.map +1 -0
  33. package/dist/chunk-FQBPVN63.cjs +403 -0
  34. package/dist/chunk-FQBPVN63.cjs.map +1 -0
  35. package/dist/chunk-G4GYQGTW.cjs +178 -0
  36. package/dist/chunk-G4GYQGTW.cjs.map +1 -0
  37. package/dist/chunk-GFDMZDMI.js +486 -0
  38. package/dist/chunk-GFDMZDMI.js.map +1 -0
  39. package/dist/chunk-HOTOYIPB.js +171 -0
  40. package/dist/chunk-HOTOYIPB.js.map +1 -0
  41. package/dist/chunk-HYADH4ZX.js +176 -0
  42. package/dist/chunk-HYADH4ZX.js.map +1 -0
  43. package/dist/chunk-JBN7C5WE.js +255 -0
  44. package/dist/chunk-JBN7C5WE.js.map +1 -0
  45. package/dist/chunk-JNCTPFTD.cjs +25 -0
  46. package/dist/chunk-JNCTPFTD.cjs.map +1 -0
  47. package/dist/chunk-N3BH3BV7.js +21 -0
  48. package/dist/chunk-N3BH3BV7.js.map +1 -0
  49. package/dist/chunk-NFPGAVRQ.js +749 -0
  50. package/dist/chunk-NFPGAVRQ.js.map +1 -0
  51. package/dist/chunk-OFFRGRBN.cjs +1332 -0
  52. package/dist/chunk-OFFRGRBN.cjs.map +1 -0
  53. package/dist/chunk-OZLKYIZL.cjs +490 -0
  54. package/dist/chunk-OZLKYIZL.cjs.map +1 -0
  55. package/dist/chunk-P3NUK46X.js +145 -0
  56. package/dist/chunk-P3NUK46X.js.map +1 -0
  57. package/dist/chunk-P7P2B7ZI.cjs +429 -0
  58. package/dist/chunk-P7P2B7ZI.cjs.map +1 -0
  59. package/dist/chunk-PB6SKSJN.cjs +150 -0
  60. package/dist/chunk-PB6SKSJN.cjs.map +1 -0
  61. package/dist/chunk-R3IXCJR7.js +378 -0
  62. package/dist/chunk-R3IXCJR7.js.map +1 -0
  63. package/dist/chunk-SD6P3WEJ.js +324 -0
  64. package/dist/chunk-SD6P3WEJ.js.map +1 -0
  65. package/dist/chunk-YSCHP26P.js +451 -0
  66. package/dist/chunk-YSCHP26P.js.map +1 -0
  67. package/dist/chunk-ZLMPRPCY.cjs +274 -0
  68. package/dist/chunk-ZLMPRPCY.cjs.map +1 -0
  69. package/dist/common-CBDYNJeh.d.cts +48 -0
  70. package/dist/common-CBDYNJeh.d.ts +48 -0
  71. package/dist/constants.cjs +42 -0
  72. package/dist/constants.cjs.map +1 -0
  73. package/dist/constants.d.cts +60 -0
  74. package/dist/constants.d.ts +60 -0
  75. package/dist/constants.js +5 -0
  76. package/dist/constants.js.map +1 -0
  77. package/dist/country/index.cjs +154 -0
  78. package/dist/country/index.cjs.map +1 -0
  79. package/dist/country/index.d.cts +1 -0
  80. package/dist/country/index.d.ts +1 -0
  81. package/dist/country/index.js +5 -0
  82. package/dist/country/index.js.map +1 -0
  83. package/dist/date/index.cjs +117 -0
  84. package/dist/date/index.cjs.map +1 -0
  85. package/dist/date/index.d.cts +283 -0
  86. package/dist/date/index.d.ts +283 -0
  87. package/dist/date/index.js +4 -0
  88. package/dist/date/index.js.map +1 -0
  89. package/dist/environment/index.cjs +73 -0
  90. package/dist/environment/index.cjs.map +1 -0
  91. package/dist/environment/index.d.cts +127 -0
  92. package/dist/environment/index.d.ts +127 -0
  93. package/dist/environment/index.js +4 -0
  94. package/dist/environment/index.js.map +1 -0
  95. package/dist/form/index.cjs +81 -0
  96. package/dist/form/index.cjs.map +1 -0
  97. package/dist/form/index.d.cts +227 -0
  98. package/dist/form/index.d.ts +227 -0
  99. package/dist/form/index.js +4 -0
  100. package/dist/form/index.js.map +1 -0
  101. package/dist/i18n.cjs +37 -0
  102. package/dist/i18n.cjs.map +1 -0
  103. package/dist/i18n.d.cts +102 -0
  104. package/dist/i18n.d.ts +102 -0
  105. package/dist/i18n.js +4 -0
  106. package/dist/i18n.js.map +1 -0
  107. package/dist/index-BXBmBHyL.d.ts +718 -0
  108. package/dist/index-BYsUCP3u.d.cts +718 -0
  109. package/dist/index-Cl26FrAZ.d.cts +362 -0
  110. package/dist/index-Cl26FrAZ.d.ts +362 -0
  111. package/dist/index.cjs +1265 -0
  112. package/dist/index.cjs.map +1 -0
  113. package/dist/index.d.cts +205 -0
  114. package/dist/index.d.ts +205 -0
  115. package/dist/index.js +277 -0
  116. package/dist/index.js.map +1 -0
  117. package/dist/schema.cjs +13 -0
  118. package/dist/schema.cjs.map +1 -0
  119. package/dist/schema.d.cts +84 -0
  120. package/dist/schema.d.ts +84 -0
  121. package/dist/schema.js +4 -0
  122. package/dist/schema.js.map +1 -0
  123. package/dist/security/index.cjs +94 -0
  124. package/dist/security/index.cjs.map +1 -0
  125. package/dist/security/index.d.cts +216 -0
  126. package/dist/security/index.d.ts +216 -0
  127. package/dist/security/index.js +5 -0
  128. package/dist/security/index.js.map +1 -0
  129. package/dist/string/index.cjs +153 -0
  130. package/dist/string/index.cjs.map +1 -0
  131. package/dist/string/index.d.cts +471 -0
  132. package/dist/string/index.d.ts +471 -0
  133. package/dist/string/index.js +4 -0
  134. package/dist/string/index.js.map +1 -0
  135. package/dist/transform/index.cjs +105 -0
  136. package/dist/transform/index.cjs.map +1 -0
  137. package/dist/transform/index.d.cts +271 -0
  138. package/dist/transform/index.d.ts +271 -0
  139. package/dist/transform/index.js +4 -0
  140. package/dist/transform/index.js.map +1 -0
  141. package/dist/validators/index.cjs +195 -0
  142. package/dist/validators/index.cjs.map +1 -0
  143. package/dist/validators/index.d.cts +2 -0
  144. package/dist/validators/index.d.ts +2 -0
  145. package/dist/validators/index.js +6 -0
  146. package/dist/validators/index.js.map +1 -0
  147. package/package.json +229 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/validators/email.ts","../src/validators/name.ts","../src/validators/phone.ts","../src/validators/username.ts","../src/validators/url.ts","../src/validators/creditCard.ts","../src/validators/ip.ts","../src/validators/financial.ts"],"names":["init_constants","DISPOSABLE_EMAIL_DOMAINS","FREE_EMAIL_DOMAINS","DEFAULT_OPTIONS","getPhoneFormat","PHONE_FORMATS","RESERVED_USERNAMES","createEmptyResult","IPV4_REGEX","IPV6_REGEX"],"mappings":";;;;;;AACAA,gCAAA,EAAA;AAMA,IAAM,WAAA,GACF,8aAAA;AAKJ,IAAM,kBAAA,GAAqB,4BAAA;AAK3B,IAAM,eAAA,GAAgC;AAAA,EAClC,eAAA,EAAiB,IAAA;AAAA,EACjB,cAAA,EAAgB;AACpB,CAAA;AAkBO,SAAS,aAAA,CAAc,KAAA,EAAe,OAAA,GAAwB,EAAC,EAA0B;AAC5F,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,eAAA,EAAiB,GAAG,OAAA,EAAQ;AAC9C,EAAA,MAAM,SAA6B,EAAC;AAGpC,EAAA,MAAM,YAAA,GAAe,KAAA,EAAO,IAAA,EAAK,IAAK,EAAA;AAGtC,EAAA,IAAI,CAAC,YAAA,EAAc;AACf,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACZ,CAAA;AACD,IAAA,OAAO,YAAA,CAAa,KAAA,EAAO,MAAA,EAAQ,EAAA,EAAI,IAAI,EAAE,CAAA;AAAA,EACjD;AAEA,EAAA,IAAI,KAAA,CAAM,SAAS,GAAA,EAAK;AACpB,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,gBAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACZ,CAAA;AACD,IAAA,OAAO,YAAA,CAAa,KAAA,EAAO,MAAA,EAAQ,EAAA,EAAI,IAAI,EAAE,CAAA;AAAA,EACjD;AACA,EAAA,MAAM,eAAA,GAAkB,aAAa,WAAA,EAAY;AAGjD,EAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,WAAA,CAAY,GAAG,CAAA;AAC/C,EAAA,MAAM,YAAY,OAAA,GAAU,CAAA,GAAI,gBAAgB,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,GAAI,EAAA;AACpE,EAAA,MAAM,SAAS,OAAA,GAAU,CAAA,GAAI,gBAAgB,KAAA,CAAM,OAAA,GAAU,CAAC,CAAA,GAAI,EAAA;AAKlE,EAAA,IAAI,YAAA,CAAa,SAAS,GAAA,EAAK;AAC3B,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACZ,CAAA;AAAA,EACL;AAGA,EAAA,IAAI,CAAC,WAAA,CAAY,IAAA,CAAK,eAAe,CAAA,EAAG;AACpC,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,gBAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACZ,CAAA;AACD,IAAA,OAAO,YAAA,CAAa,KAAA,EAAO,MAAA,EAAQ,eAAA,EAAiB,WAAW,MAAM,CAAA;AAAA,EACzE;AAGA,EAAA,IAAI,SAAA,CAAU,SAAS,EAAA,EAAI;AACvB,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,qBAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACZ,CAAA;AAAA,EACL;AAGA,EAAA,MAAM,YAAA,GAAeC,0CAAA,CAAyB,GAAA,CAAI,MAAM,CAAA;AACxD,EAAA,IAAI,IAAA,CAAK,mBAAmB,YAAA,EAAc;AACtC,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,kBAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACZ,CAAA;AAAA,EACL;AAGA,EAAA,IAAI,IAAA,CAAK,cAAA,EAAgB,QAAA,CAAS,MAAM,CAAA,EAAG;AACvC,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,gBAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACZ,CAAA;AAAA,EACL;AAGA,EAAA,IAAI,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,cAAA,CAAe,SAAS,CAAA,EAAG;AACvD,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,CAAe,QAAA,CAAS,MAAM,CAAA,EAAG;AACvC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,KAAA,EAAO,OAAA;AAAA,QACP,IAAA,EAAM,oBAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACZ,CAAA;AAAA,IACL;AAAA,EACJ;AAGA,EAAA,MAAM,cAAc,CAACC,oCAAA,CAAmB,GAAA,CAAI,MAAM,KAAK,CAAC,YAAA;AAExD,EAAA,OAAO;AAAA,IACH,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,IAC3B,MAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA,EAAY,eAAe,eAAe,CAAA;AAAA,IAC1C,MAAA;AAAA,IACA;AAAA,GACJ;AACJ;AASO,SAAS,aAAa,KAAA,EAAwB;AACjD,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAChD,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,OAAO,kBAAA,CAAmB,KAAK,OAAO,CAAA,IAAK,YAAY,IAAA,CAAK,OAAA,CAAQ,aAAa,CAAA;AACrF;AASO,SAAS,kBAAkB,KAAA,EAAwB;AACtD,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAChD,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,EAAK,CAAE,aAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AACtD,EAAA,OAAO,MAAA,GAASD,0CAAA,CAAyB,GAAA,CAAI,MAAM,CAAA,GAAI,KAAA;AAC3D;AAYO,SAAS,eAAe,KAAA,EAAuB;AAClD,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,EAAA;AAEhD,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACzC,EAAA,MAAM,CAAC,SAAA,EAAW,MAAM,CAAA,GAAI,OAAA,CAAQ,MAAM,GAAG,CAAA;AAE7C,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,MAAA,EAAQ,OAAO,OAAA;AAElC,EAAA,IAAI,eAAA,GAAkB,SAAA;AAGtB,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,OAAA,CAAQ,GAAG,CAAA;AAC7C,EAAA,IAAI,YAAY,CAAA,EAAG;AACf,IAAA,eAAA,GAAkB,eAAA,CAAgB,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA;AAAA,EACxD;AAGA,EAAA,IAAI,MAAA,KAAW,WAAA,IAAe,MAAA,KAAW,gBAAA,EAAkB;AACvD,IAAA,eAAA,GAAkB,eAAA,CAAgB,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAAA,EACvD;AAEA,EAAA,OAAO,CAAA,EAAG,eAAe,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AACvC;AASO,SAAS,eAAe,KAAA,EAAuB;AAClD,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,EAAA;AAChD,EAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,GAAO,WAAA,EAAY,CAAE,MAAM,GAAG,CAAA;AAClD,EAAA,OAAO,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AACvB;AAKA,SAAS,YAAA,CACL,OAAA,EACA,MAAA,EACA,UAAA,EACA,WACA,MAAA,EACqB;AACrB,EAAA,OAAO;AAAA,IACH,OAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA,EAAc,MAAA,GAASA,0CAAA,CAAyB,GAAA,CAAI,MAAM,CAAA,GAAI,KAAA;AAAA,IAC9D,aAAa,MAAA,GAAS,CAACC,oCAAA,CAAmB,GAAA,CAAI,MAAM,CAAA,GAAI,KAAA;AAAA,IACxD,UAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACJ;AACJ;;;ACxOA,IAAM,eAAA,GAAkB;AAAA,EACpB,KAAA,EAAO,qEAAA;AAAA,EACP,MAAA,EAAQ,2CAAA;AAAA,EACR,GAAA,EAAK,qEAAA;AAAA,EACL,QAAA,EAAU,8BAAA;AAAA,EACV,UAAA,EAAY;AAChB,CAAA;AAKA,IAAM,kBAAA,GAAqB,wBAAA;AAK3B,IAAMC,gBAAAA,GAA+B;AAAA,EACjC,SAAA,EAAW,CAAA;AAAA,EACX,SAAA,EAAW,GAAA;AAAA,EACX,iBAAA,EAAmB,IAAA;AAAA,EACnB,YAAA,EAAc,KAAA;AAAA,EACd,gBAAgB,CAAC,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,YAAY,YAAY;AACvE,CAAA;AAkBO,SAAS,YAAA,CAAa,IAAA,EAAc,OAAA,GAAuB,EAAC,EAAyB;AACxF,EAAA,MAAM,IAAA,GAAO,EAAE,GAAGA,gBAAAA,EAAiB,GAAG,OAAA,EAAQ;AAC9C,EAAA,MAAM,SAA6B,EAAC;AAGpC,EAAA,MAAM,SAAA,GAAY,aAAa,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,aAAa,SAAS,CAAA;AAG7C,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,SAAA,EAAW;AACrB,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,MAAA;AAAA,MACP,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS,IAAA,CAAK,QAAA,EAAU,QAAA,IAAY;AAAA,KACvC,CAAA;AACD,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,QAAQ,SAAA,EAAW,EAAA,EAAI,gBAAgB,SAAA,EAAU;AAAA,EAC9E;AAGA,EAAA,IAAI,SAAA,CAAU,MAAA,IAAU,IAAA,CAAK,SAAA,IAAa,CAAA,CAAA,EAAI;AAC1C,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,MAAA;AAAA,MACP,IAAA,EAAM,WAAA;AAAA,MACN,SAAS,IAAA,CAAK,QAAA,EAAU,QAAA,IAAY,CAAA,sBAAA,EAAyB,KAAK,SAAS,CAAA,WAAA;AAAA,KAC9E,CAAA;AAAA,EACL;AAEA,EAAA,IAAI,SAAA,CAAU,MAAA,IAAU,IAAA,CAAK,SAAA,IAAa,GAAA,CAAA,EAAM;AAC5C,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,MAAA;AAAA,MACP,IAAA,EAAM,UAAA;AAAA,MACN,SAAS,IAAA,CAAK,QAAA,EAAU,OAAA,IAAW,CAAA,qBAAA,EAAwB,KAAK,SAAS,CAAA,WAAA;AAAA,KAC5E,CAAA;AAAA,EACL;AAGA,EAAA,IAAI,CAAC,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AAC5C,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,MAAA;AAAA,MACP,IAAA,EAAM,kBAAA;AAAA,MACN,OAAA,EAAS,IAAA,CAAK,QAAA,EAAU,eAAA,IAAmB;AAAA,KAC9C,CAAA;AAAA,EACL;AAGA,EAAA,IAAI,CAAC,KAAK,iBAAA,EAAmB;AAEzB,IAAA,IAAI,CAAC,sBAAA,CAAuB,IAAA,CAAK,SAAS,CAAA,EAAG;AACzC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,KAAA,EAAO,MAAA;AAAA,QACP,IAAA,EAAM,oBAAA;AAAA,QACN,OAAA,EAAS,IAAA,CAAK,QAAA,EAAU,YAAA,IAAgB;AAAA,OAC3C,CAAA;AAAA,IACL;AAAA,EACJ,CAAA,MAAO;AAEH,IAAA,IAAI,CAAC,kBAAA,CAAmB,IAAA,CAAK,SAAS,CAAA,EAAG;AACrC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,KAAA,EAAO,MAAA;AAAA,QACP,IAAA,EAAM,oBAAA;AAAA,QACN,OAAA,EAAS,IAAA,CAAK,QAAA,EAAU,YAAA,IAAgB;AAAA,OAC3C,CAAA;AAAA,IACL;AAAA,EACJ;AAGA,EAAA,IAAI,KAAK,cAAA,IAAkB,IAAA,CAAK,eAAe,MAAA,GAAS,CAAA,IAAK,mBAAmB,OAAA,EAAS;AACrF,IAAA,IAAI,mBAAmB,SAAA,IAAa,CAAC,KAAK,cAAA,CAAe,QAAA,CAAS,cAAc,CAAA,EAAG;AAC/E,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,KAAA,EAAO,MAAA;AAAA,QACP,IAAA,EAAM,oBAAA;AAAA,QACN,OAAA,EAAS,IAAA,CAAK,QAAA,EAAU,gBAAA,IAAoB,WAAW,cAAc,CAAA,gBAAA;AAAA,OACxE,CAAA;AAAA,IACL;AAAA,EACJ;AAQA,EAAA,IAAI,WAAW,IAAA,CAAK,SAAA,CAAU,QAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,EAAG;AAC/C,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,MAAA;AAAA,MACP,IAAA,EAAM,oBAAA;AAAA,MACN,OAAA,EAAS,IAAA,CAAK,QAAA,EAAU,UAAA,IAAc;AAAA,KACzC,CAAA;AAAA,EACL;AAEA,EAAA,OAAO;AAAA,IACH,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,IAC3B,MAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACJ;AACJ;AASO,SAAS,YAAY,IAAA,EAAuB;AAC/C,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,KAAA;AAC9C,EAAA,MAAM,SAAA,GAAY,aAAa,IAAI,CAAA;AACnC,EAAA,OAAO,SAAA,CAAU,UAAU,CAAA,IAAK,SAAA,CAAU,UAAU,GAAA,IAAO,kBAAA,CAAmB,KAAK,SAAS,CAAA;AAChG;AAaO,SAAS,aAAa,IAAA,EAAsB;AAC/C,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,EAAA;AAE9C,EAAA,OACI,IAAA,CAEK,SAAA,CAAU,KAAK,CAAA,CAEf,IAAA,EAAK,CAEL,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAEnB,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA;AAE3C;AASO,SAAS,aACZ,IAAA,EAC4E;AAC5E,EAAA,IAAI,CAAC,MAAM,OAAO,SAAA;AAElB,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,EAAG;AAC7D,IAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG;AACpB,MAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,IACvB;AAAA,EACJ;AAEA,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,SAAA;AACjC,EAAA,IAAI,QAAQ,MAAA,KAAW,CAAA;AACnB,IAAA,OAAO,QAAQ,CAAC,CAAA;AACpB,EAAA,OAAO,OAAA;AACX;AASO,SAAS,WAAW,IAAA,EAAsB;AAC7C,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,EAAA;AAE9C,EAAA,OAAO,aAAa,IAAI,CAAA,CACnB,MAAM,GAAG,CAAA,CACT,IAAI,CAAA,IAAA,KAAQ;AACT,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAE9B,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AACpB,MAAA,OAAO,IAAA,CACF,MAAM,GAAG,CAAA,CACT,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,CAAA,CAAE,MAAM,CAAC,CAAA,CAAE,aAAa,CAAA,CAC7D,KAAK,GAAG,CAAA;AAAA,IACjB;AAEA,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AACpB,MAAA,OAAO,IAAA,CACF,MAAM,GAAG,CAAA,CACT,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,CAAA,CAAE,MAAM,CAAC,CAAA,CAAE,aAAa,CAAA,CAC7D,KAAK,GAAG,CAAA;AAAA,IACjB;AACA,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,KAAgB,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AAAA,EACpE,CAAC,CAAA,CACA,IAAA,CAAK,GAAG,CAAA;AACjB;AASO,SAAS,UAAU,QAAA,EAIxB;AACE,EAAA,MAAM,SAAA,GAAY,aAAa,QAAQ,CAAA;AACvC,EAAA,MAAM,QAAQ,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AAEjD,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACpB,IAAA,OAAO,EAAE,SAAA,EAAW,EAAA,EAAI,QAAA,EAAU,EAAA,EAAG;AAAA,EACzC;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACpB,IAAA,OAAO,EAAE,SAAA,EAAW,KAAA,CAAM,CAAC,CAAA,EAAG,UAAU,EAAA,EAAG;AAAA,EAC/C;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACpB,IAAA,OAAO,EAAE,WAAW,KAAA,CAAM,CAAC,GAAG,QAAA,EAAU,KAAA,CAAM,CAAC,CAAA,EAAE;AAAA,EACrD;AAEA,EAAA,OAAO;AAAA,IACH,SAAA,EAAW,MAAM,CAAC,CAAA;AAAA,IAClB,YAAY,KAAA,CAAM,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,IACvC,QAAA,EAAU,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC;AAAA,GACpC;AACJ;;;AC5QA,IAAMA,gBAAAA,GAAgC;AAAA,EAClC,MAAA,EAAQ,KAAA;AAAA,EACR,UAAA,EAAY;AAChB,CAAA;AAkBO,SAAS,aAAA,CAAc,KAAA,EAAe,OAAA,GAAwB,EAAC,EAA0B;AAC5F,EAAA,MAAM,IAAA,GAAO,EAAE,GAAGA,gBAAAA,EAAiB,GAAG,OAAA,EAAQ;AAC9C,EAAA,MAAM,SAA6B,EAAC;AAGpC,EAAA,IAAI,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,EAAA,EAAI;AAC5B,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,gBAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACZ,CAAA;AACD,IAAA,OAAO,kBAAkB,MAAM,CAAA;AAAA,EACnC;AAGA,EAAA,MAAM,OAAA,GAAU,iBAAiB,KAAK,CAAA;AAGtC,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,OAAA,EAAS;AACpB,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS,IAAA,CAAK,QAAA,EAAU,QAAA,IAAY;AAAA,KACvC,CAAA;AACD,IAAA,OAAO,kBAAkB,MAAM,CAAA;AAAA,EACnC;AAGA,EAAA,IAAI,eAAA,GAAkB,IAAA,CAAK,WAAA,EAAa,WAAA,EAAY,IAAK,EAAA;AACzD,EAAA,IAAI,cAAA,GAAiB,OAAA;AACrB,EAAA,IAAI,QAAA,GAAW,EAAA;AAGf,EAAA,IAAI,QAAQ,UAAA,CAAW,GAAG,KAAK,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AAClD,IAAA,MAAM,SAAA,GAAY,uBAAuB,OAAO,CAAA;AAChD,IAAA,IAAI,SAAA,EAAW;AACX,MAAA,eAAA,GAAkB,SAAA,CAAU,WAAA;AAC5B,MAAA,cAAA,GAAiB,SAAA,CAAU,cAAA;AAC3B,MAAA,QAAA,GAAW,SAAA,CAAU,QAAA;AAAA,IACzB;AAAA,EACJ;AAGA,EAAA,MAAM,MAAA,GAAS,eAAA,GAAkBC,gCAAA,CAAe,eAAe,CAAA,GAAI,IAAA;AAEnE,EAAA,IAAI,CAAC,MAAA,IAAU,IAAA,CAAK,WAAA,EAAa;AAC7B,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,qBAAA;AAAA,MACN,SAAS,IAAA,CAAK,QAAA,EAAU,kBAAA,IAAsB,CAAA,SAAA,EAAY,KAAK,WAAW,CAAA,kBAAA;AAAA,KAC7E,CAAA;AACD,IAAA,OAAO,kBAAkB,MAAM,CAAA;AAAA,EACnC;AAGA,EAAA,IAAI,MAAA,EAAQ;AACR,IAAA,QAAA,GAAW,MAAA,CAAO,QAAA;AAClB,IAAA,MAAM,eAAe,MAAA,CAAO,OAAA;AAG5B,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,OAAO,EAAE,CAAA;AACxD,IAAA,IAAI,cAAA,CAAe,UAAA,CAAW,cAAc,CAAA,EAAG;AAC3C,MAAA,cAAA,GAAiB,cAAA,CAAe,KAAA,CAAM,cAAA,CAAe,MAAM,CAAA;AAAA,IAC/D;AAGA,IAAA,IAAI,cAAA,CAAe,UAAA,CAAW,GAAG,CAAA,EAAG;AAChC,MAAA,cAAA,GAAiB,cAAA,CAAe,MAAM,CAAC,CAAA;AAAA,IAC3C;AAEA,IAAA,IAAI,CAAC,YAAA,CAAa,QAAA,CAAS,cAAA,CAAe,MAAM,CAAA,EAAG;AAC/C,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,KAAA,EAAO,OAAA;AAAA,QACP,IAAA,EAAM,gBAAA;AAAA,QACN,OAAA,EACI,IAAA,CAAK,QAAA,EAAU,aAAA,IACf,CAAA,qBAAA,EAAwB,aAAa,IAAA,CAAK,MAAM,CAAC,CAAA,YAAA,EAAe,eAAe,CAAA;AAAA,OACtF,CAAA;AAAA,IACL;AAGA,IAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,cAAA,EAAgB,MAAM,CAAA;AAG3D,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,SAAA,KAAc,QAAA,EAAU;AAC3C,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,KAAA,EAAO,OAAA;AAAA,QACP,IAAA,EAAM,aAAA;AAAA,QACN,OAAA,EAAS,IAAA,CAAK,QAAA,EAAU,UAAA,IAAc;AAAA,OACzC,CAAA;AAAA,IACL;AAEA,IAAA,OAAO;AAAA,MACH,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,MAC3B,MAAA;AAAA,MACA,WAAA,EAAa,eAAA;AAAA,MACb,cAAA;AAAA,MACA,SAAA,EAAW;AAAA,QACP,QAAA,EAAU,cAAA,CAAe,cAAA,EAAgB,MAAM,CAAA;AAAA,QAC/C,aAAA,EAAe,mBAAA,CAAoB,cAAA,EAAgB,MAAM,CAAA;AAAA,QACzD,IAAA,EAAM,UAAA,CAAW,cAAA,EAAgB,MAAM;AAAA,OAC3C;AAAA,MACA,IAAA,EAAM;AAAA,KACV;AAAA,EACJ;AAGA,EAAA,IAAI,cAAA,CAAe,MAAA,GAAS,CAAA,IAAK,cAAA,CAAe,SAAS,EAAA,EAAI;AACzD,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,gBAAA;AAAA,MACN,OAAA,EAAS,IAAA,CAAK,QAAA,EAAU,aAAA,IAAiB;AAAA,KAC5C,CAAA;AAAA,EACL;AAEA,EAAA,OAAO;AAAA,IACH,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,IAC3B,MAAA;AAAA,IACA,WAAA,EAAa,eAAA;AAAA,IACb,cAAA;AAAA,IACA,SAAA,EAAW;AAAA,MACP,QAAA,EAAU,cAAA;AAAA,MACV,eAAe,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,cAAc,CAAA,CAAA,GAAK,cAAA;AAAA,MAC5D,IAAA,EAAM,WAAW,CAAA,EAAG,QAAQ,GAAG,cAAc,CAAA,CAAA,GAAK,IAAI,cAAc,CAAA;AAAA,KACxE;AAAA,IACA,IAAA,EAAM;AAAA,GACV;AACJ;AAUO,SAAS,YAAA,CAAa,OAAe,WAAA,EAA+B;AACvE,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,KAAA,EAAO,EAAE,aAAa,CAAA;AACnD,EAAA,OAAO,MAAA,CAAO,OAAA;AAClB;AAWO,SAAS,WAAA,CACZ,KAAA,EACA,MAAA,GAAgD,eAAA,EAChD,WAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,KAAA,EAAO,EAAE,aAAa,CAAA;AACnD,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,OAAO,KAAA;AAC5B,EAAA,OAAO,MAAA,CAAO,UAAU,MAAM,CAAA;AAClC;AAKA,SAAS,iBAAiB,KAAA,EAAuB;AAC7C,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,EAAA;AAEhD,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA;AACtC,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAExC,EAAA,OAAO,OAAA,GAAU,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,GAAK,MAAA;AACpC;AAMA,SAAS,uBACL,KAAA,EACwE;AACxE,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAGtC,EAAA,IAAI,OAAO,UAAA,CAAW,GAAG,CAAA,IAAK,MAAA,CAAO,UAAU,CAAA,EAAG;AAC9C,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAClC,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAGrC,IAAA,KAAA,MAAW,MAAA,IAAU,MAAA,CAAO,MAAA,CAAOC,+BAAa,CAAA,EAAG;AAC/C,MAAA,IAAI,OAAO,QAAA,KAAa,IAAA,IAAQ,OAAO,SAAA,EAAW,QAAA,CAAS,QAAQ,CAAA,EAAG;AAClE,QAAA,OAAO;AAAA,UACH,aAAa,MAAA,CAAO,WAAA;AAAA,UACpB,cAAA;AAAA,UACA,QAAA,EAAU;AAAA,SACd;AAAA,MACJ;AAAA,IACJ;AAGA,IAAA,OAAO;AAAA,MACH,WAAA,EAAa,IAAA;AAAA,MACb,cAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACd;AAAA,EACJ;AAGA,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,MAAA,CAAOA,+BAAa,CAAA,CAAE,IAAA;AAAA,IAC/C,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,SAAS,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,SAAS,CAAA,CAAE,QAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE;AAAA,GACnF;AAEA,EAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAChC,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,OAAO,EAAE,CAAA;AAEpD,IAAA,IAAI,MAAA,CAAO,aAAa,IAAA,EAAM;AAE9B,IAAA,IAAI,MAAA,CAAO,UAAA,CAAW,UAAU,CAAA,EAAG;AAC/B,MAAA,OAAO;AAAA,QACH,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,cAAA,EAAgB,MAAA,CAAO,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA;AAAA,QAC9C,UAAU,MAAA,CAAO;AAAA,OACrB;AAAA,IACJ;AAAA,EACJ;AAEA,EAAA,OAAO,IAAA;AACX;AAKA,SAAS,kBAAA,CACL,gBACA,MAAA,EAC2D;AAE3D,EAAA,KAAA,MAAW,MAAA,IAAU,OAAO,cAAA,EAAgB;AACxC,IAAA,IAAI,cAAA,CAAe,UAAA,CAAW,MAAM,CAAA,EAAG;AACnC,MAAA,OAAO,QAAA;AAAA,IACX;AAAA,EACJ;AAGA,EAAA,KAAA,MAAW,MAAA,IAAU,OAAO,gBAAA,EAAkB;AAC1C,IAAA,IAAI,cAAA,CAAe,UAAA,CAAW,MAAM,CAAA,EAAG;AACnC,MAAA,OAAO,UAAA;AAAA,IACX;AAAA,EACJ;AAGA,EAAA,IAAI,OAAO,cAAA,CAAe,MAAA,KAAW,KAAK,MAAA,CAAO,gBAAA,CAAiB,WAAW,CAAA,EAAG;AAC5E,IAAA,OAAO,SAAA;AAAA,EACX;AAEA,EAAA,OAAO,SAAA;AACX;AAKA,SAAS,cAAA,CAAe,gBAAwB,MAAA,EAAqC;AACjF,EAAA,OAAO,YAAA,CAAa,cAAA,EAAgB,MAAA,CAAO,OAAO,CAAA;AACtD;AAKA,SAAS,mBAAA,CACL,gBACA,MAAA,EACM;AACN,EAAA,OAAO,CAAA,EAAG,OAAO,QAAQ,CAAA,CAAA,EAAI,aAAa,cAAA,EAAgB,MAAA,CAAO,OAAO,CAAC,CAAA,CAAA;AAC7E;AAKA,SAAS,UAAA,CAAW,gBAAwB,MAAA,EAAsC;AAC9E,EAAA,OAAO,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAA,EAAG,cAAc,CAAA,CAAA;AAC9C;AAKA,SAAS,YAAA,CAAa,QAAgB,OAAA,EAAyB;AAC3D,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,IAAI,WAAA,GAAc,CAAA;AAElB,EAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AACxB,IAAA,IAAI,SAAS,GAAA,EAAK;AACd,MAAA,IAAI,WAAA,GAAc,OAAO,MAAA,EAAQ;AAC7B,QAAA,MAAA,IAAU,OAAO,WAAW,CAAA;AAC5B,QAAA,WAAA,EAAA;AAAA,MACJ;AAAA,IACJ,CAAA,MAAO;AACH,MAAA,MAAA,IAAU,IAAA;AAAA,IACd;AAAA,EACJ;AAGA,EAAA,IAAI,WAAA,GAAc,OAAO,MAAA,EAAQ;AAC7B,IAAA,MAAA,IAAU,MAAA,CAAO,MAAM,WAAW,CAAA;AAAA,EACtC;AAEA,EAAA,OAAO,OAAO,IAAA,EAAK;AACvB;AAKA,SAAS,kBAAkB,MAAA,EAAmD;AAC1E,EAAA,OAAO;AAAA,IACH,OAAA,EAAS,KAAA;AAAA,IACT,MAAA;AAAA,IACA,WAAA,EAAa,EAAA;AAAA,IACb,cAAA,EAAgB,EAAA;AAAA,IAChB,SAAA,EAAW;AAAA,MACP,QAAA,EAAU,EAAA;AAAA,MACV,aAAA,EAAe,EAAA;AAAA,MACf,IAAA,EAAM;AAAA,KACV;AAAA,IACA,IAAA,EAAM;AAAA,GACV;AACJ;AASO,SAAS,eAAe,WAAA,EAAoC;AAC/D,EAAA,MAAM,MAAA,GAASD,iCAAe,WAAW,CAAA;AACzC,EAAA,OAAO,QAAQ,QAAA,IAAY,IAAA;AAC/B;AASO,SAAS,WAAW,KAAA,EAKzB;AACE,EAAA,MAAM,MAAA,GAAS,cAAc,KAAK,CAAA;AAClC,EAAA,OAAO;AAAA,IACH,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,QAAA,EAAU,cAAA,CAAe,MAAA,CAAO,WAAW,CAAA,IAAK,EAAA;AAAA,IAChD,gBAAgB,MAAA,CAAO,cAAA;AAAA,IACvB,SAAS,MAAA,CAAO;AAAA,GACpB;AACJ;;;AChYAJ,gCAAA,EAAA;AAMA,IAAM,wBAAA,GAA2B,oBAAA;AAKjC,IAAMG,gBAAAA,GAAmC;AAAA,EACrC,SAAA,EAAW,CAAA;AAAA,EACX,SAAA,EAAW,EAAA;AAAA,EACX,YAAA,EAAc,wBAAA;AAAA,EACd,UAAU,EAAC;AAAA,EACX,UAAA,EAAY;AAChB,CAAA;AAiBO,SAAS,gBAAA,CACZ,QAAA,EACA,OAAA,GAA2B,EAAC,EACJ;AACxB,EAAA,MAAM,IAAA,GAAO,EAAE,GAAGA,gBAAAA,EAAiB,GAAG,OAAA,EAAQ;AAC9C,EAAA,MAAM,SAA6B,EAAC;AAGpC,EAAA,MAAM,SAAA,GAAY,QAAA,EAAU,IAAA,EAAK,CAAE,aAAY,IAAK,EAAA;AAGpD,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,SAAA,EAAW;AACzB,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,UAAA;AAAA,MACP,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS,IAAA,CAAK,QAAA,EAAU,QAAA,IAAY;AAAA,KACvC,CAAA;AACD,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,QAAQ,SAAA,EAAW,EAAA,EAAI,YAAY,KAAA,EAAM;AAAA,EACtE;AAGA,EAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,SAAA,CAAU,QAAA,CAAS,GAAG,CAAA,EAAG;AAC7C,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,UAAA;AAAA,MACP,IAAA,EAAM,mBAAA;AAAA,MACN,OAAA,EAAS,IAAA,CAAK,QAAA,EAAU,eAAA,IAAmB;AAAA,KAC9C,CAAA;AAAA,EACL;AAGA,EAAA,IAAI,SAAA,CAAU,MAAA,IAAU,IAAA,CAAK,SAAA,IAAa,CAAA,CAAA,EAAI;AAC1C,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,UAAA;AAAA,MACP,IAAA,EAAM,WAAA;AAAA,MACN,SAAS,IAAA,CAAK,QAAA,EAAU,QAAA,IAAY,CAAA,0BAAA,EAA6B,KAAK,SAAS,CAAA,WAAA;AAAA,KAClF,CAAA;AAAA,EACL;AAEA,EAAA,IAAI,SAAA,CAAU,MAAA,IAAU,IAAA,CAAK,SAAA,IAAa,EAAA,CAAA,EAAK;AAC3C,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,UAAA;AAAA,MACP,IAAA,EAAM,UAAA;AAAA,MACN,SAAS,IAAA,CAAK,QAAA,EAAU,OAAA,IAAW,CAAA,yBAAA,EAA4B,KAAK,SAAS,CAAA,WAAA;AAAA,KAChF,CAAA;AAAA,EACL;AAGA,EAAA,MAAM,WAAA,GAAc,KAAK,YAAA,IAAgB,wBAAA;AACzC,EAAA,IAAI,CAAC,WAAA,CAAY,IAAA,CAAK,SAAS,CAAA,EAAG;AAC9B,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,UAAA;AAAA,MACP,IAAA,EAAM,oBAAA;AAAA,MACN,OAAA,EACI,IAAA,CAAK,QAAA,EAAU,YAAA,IACf;AAAA,KACP,CAAA;AAAA,EACL;AAGA,EAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,SAAS,CAAA,EAAG;AACnC,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,UAAA;AAAA,MACP,IAAA,EAAM,mBAAA;AAAA,MACN,OAAA,EACI,IAAA,CAAK,QAAA,EAAU,eAAA,IACf;AAAA,KACP,CAAA;AAAA,EACL;AAGA,EAAA,IAAI,YAAA,CAAa,IAAA,CAAK,SAAS,CAAA,EAAG;AAC9B,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,UAAA;AAAA,MACP,IAAA,EAAM,qBAAA;AAAA,MACN,OAAA,EACI,IAAA,CAAK,QAAA,EAAU,kBAAA,IACf;AAAA,KACP,CAAA;AAAA,EACL;AAGA,EAAA,MAAM,WAAA,mBAAc,IAAI,GAAA,CAAI,CAAC,GAAGG,oCAAA,EAAoB,GAAI,IAAA,CAAK,QAAA,IAAY,EAAG,CAAC,CAAA;AAC7E,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA;AAE5C,EAAA,IAAI,UAAA,EAAY;AACZ,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,UAAA;AAAA,MACP,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS,IAAA,CAAK,QAAA,EAAU,QAAA,IAAY;AAAA,KACvC,CAAA;AAAA,EACL;AAEA,EAAA,OAAO;AAAA,IACH,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,IAC3B,MAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACJ;AACJ;AAQO,SAAS,gBAAgB,QAAA,EAA2B;AACvD,EAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,UAAU,OAAO,KAAA;AACtD,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,IAAA,EAAK,CAAE,WAAA,EAAY;AAE5C,EAAA,OACI,OAAA,CAAQ,UAAU,CAAA,IAClB,OAAA,CAAQ,UAAU,EAAA,IAClB,wBAAA,CAAyB,IAAA,CAAK,OAAO,CAAA,IACrC,CAAC,kBAAkB,IAAA,CAAK,OAAO,CAAA,IAC/B,CAAC,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA,IAC1B,CAACA,oCAAA,CAAmB,GAAA,CAAI,OAAO,CAAA;AAEvC;AASO,SAAS,kBAAA,CAAmB,QAAA,EAAkB,kBAAA,GAA+B,EAAC,EAAY;AAC7F,EAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,UAAU,OAAO,KAAA;AACtD,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,IAAA,EAAK,CAAE,WAAA,EAAY;AAC/C,EAAA,MAAM,WAAA,uBAAkB,GAAA,CAAI,CAAC,GAAGA,oCAAA,EAAoB,GAAG,kBAAkB,CAAC,CAAA;AAC1E,EAAA,OAAO,WAAA,CAAY,IAAI,UAAU,CAAA;AACrC;AAQO,SAAS,iBAAiB,QAAA,EAA0B;AACvD,EAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,UAAU,OAAO,EAAA;AAEtD,EAAA,OACI,QAAA,CACK,MAAK,CACL,WAAA,GAEA,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAEnB,OAAA,CAAQ,gBAAA,EAAkB,EAAE,CAAA,CAE5B,OAAA,CAAQ,YAAY,CAAA,KAAA,KAAS,KAAA,CAAM,CAAC,CAAC,CAAA,CAErC,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA;AAE3C;AASO,SAAS,gBAAA,CAAiB,IAAA,EAAc,KAAA,GAAgB,CAAA,EAAa;AACxE,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,SAAiB,EAAC;AAG/C,EAAA,IAAI,YAAA,GAAe,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,GAAI,KAAK,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,GAAI,IAAA;AAG7D,EAAA,YAAA,GAAe,iBAAiB,YAAY,CAAA;AAE5C,EAAA,IAAI,CAAC,YAAA,EAAc,OAAO,EAAC;AAE3B,EAAA,MAAM,WAAA,GAAwB,CAAC,YAAY,CAAA;AAG3C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,WAAA,CAAY,MAAA,GAAS,OAAO,CAAA,EAAA,EAAK;AAC7C,IAAA,WAAA,CAAY,IAAA,CAAK,CAAA,EAAG,YAAY,CAAA,EAAG,CAAC,CAAA,CAAE,CAAA;AAAA,EAC1C;AAGA,EAAA,MAAM,eAAe,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,GAAI,CAAA;AACpD,EAAA,WAAA,CAAY,IAAA,CAAK,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE,CAAA;AAElD,EAAA,OAAO,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AACrC;;;AC3KA,IAAMH,gBAAAA,GAA8B;AAAA,EAChC,YAAA,EAAc,KAAA;AAAA,EACd,cAAA,EAAgB,IAAA;AAAA,EAChB,cAAA,EAAgB,IAAA;AAAA,EAChB,gBAAA,EAAkB,CAAC,OAAA,EAAS,QAAQ;AACxC,CAAA;AAKA,IAAM,UAAA,GAAa,yBAAA;AAKnB,IAAM,UAAA,GAAa,oBAAA;AAiBZ,SAAS,WAAA,CAAY,GAAA,EAAa,OAAA,GAAsB,EAAC,EAAwB;AACpF,EAAA,MAAM,IAAA,GAAO,EAAE,GAAGA,gBAAAA,EAAiB,GAAG,OAAA,EAAQ;AAC9C,EAAA,MAAM,SAA6B,EAAC;AAGpC,EAAA,IAAI,GAAA,IAAO,GAAA,CAAI,MAAA,GAAS,IAAA,EAAM;AAC1B,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,KAAA;AAAA,MACP,IAAA,EAAM,gBAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACZ,CAAA;AACD,IAAA,OAAOI,mBAAkB,MAAM,CAAA;AAAA,EACnC;AAGA,EAAA,MAAM,OAAA,GAAU,GAAA,EAAK,IAAA,EAAK,IAAK,EAAA;AAG/B,EAAA,IAAI,CAAC,OAAA,EAAS;AACV,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,KAAA;AAAA,MACP,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS,IAAA,CAAK,QAAA,EAAU,QAAA,IAAY;AAAA,KACvC,CAAA;AACD,IAAA,OAAOA,mBAAkB,MAAM,CAAA;AAAA,EACnC;AAGA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACA,IAAA,MAAA,GAAS,IAAI,IAAI,OAAO,CAAA;AAAA,EAC5B,CAAA,CAAA,MAAQ;AACJ,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,KAAA;AAAA,MACP,IAAA,EAAM,gBAAA;AAAA,MACN,OAAA,EAAS,IAAA,CAAK,QAAA,EAAU,aAAA,IAAiB;AAAA,KAC5C,CAAA;AACD,IAAA,OAAOA,mBAAkB,MAAM,CAAA;AAAA,EACnC;AAGA,EAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,gBAAA,IAAoB,CAAC,SAAS,QAAQ,CAAA;AACpE,EAAA,IAAI,CAAC,gBAAA,CAAiB,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC7C,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,KAAA;AAAA,MACP,IAAA,EAAM,kBAAA;AAAA,MACN,OAAA,EAAS,KAAK,QAAA,EAAU,eAAA,IACpB,4BAA4B,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KAC9D,CAAA;AAAA,EACL;AAGA,EAAA,IAAI,IAAA,CAAK,YAAA,IAAgB,MAAA,CAAO,QAAA,KAAa,QAAA,EAAU;AACnD,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,KAAA;AAAA,MACP,IAAA,EAAM,gBAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACZ,CAAA;AAAA,EACL;AAGA,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAA,KAAa,WAAA,IACpC,MAAA,CAAO,QAAA,KAAa,WAAA,IACpB,MAAA,CAAO,QAAA,KAAa,KAAA,IACpB,MAAA,CAAO,QAAA,KAAa,OAAA;AACxB,EAAA,IAAI,CAAC,IAAA,CAAK,cAAA,IAAkB,WAAA,EAAa;AACrC,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,KAAA;AAAA,MACP,IAAA,EAAM,uBAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACZ,CAAA;AAAA,EACL;AAGA,EAAA,MAAM,WAAA,GAAc,WAAW,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,IAAK,UAAA,CAAW,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AACvF,EAAA,IAAI,CAAC,IAAA,CAAK,cAAA,IAAkB,WAAA,IAAe,CAAC,WAAA,EAAa;AACrD,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,KAAA;AAAA,MACP,IAAA,EAAM,wBAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACZ,CAAA;AAAA,EACL;AAGA,EAAA,IAAI,KAAK,cAAA,EAAgB,QAAA,CAAS,OAAO,QAAA,CAAS,WAAA,EAAa,CAAA,EAAG;AAC9D,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,KAAA;AAAA,MACP,IAAA,EAAM,gBAAA;AAAA,MACN,OAAA,EAAS,IAAA,CAAK,QAAA,EAAU,aAAA,IAAiB;AAAA,KAC5C,CAAA;AAAA,EACL;AAGA,EAAA,IAAI,IAAA,CAAK,eAAe,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA,IAAK,CAAC,WAAA,IAAe,CAAC,WAAA,EAAa;AACjF,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AACvC,IAAA,MAAM,MAAM,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,GAAG,WAAA,EAAY;AACjD,IAAA,IAAI,OAAO,CAAC,IAAA,CAAK,WAAA,CAAY,QAAA,CAAS,GAAG,CAAA,EAAG;AACxC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,KAAA,EAAO,KAAA;AAAA,QACP,IAAA,EAAM,aAAA;AAAA,QACN,OAAA,EAAS,KAAK,QAAA,EAAU,UAAA,IACpB,uBAAuB,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,OACzD,CAAA;AAAA,IACL;AAAA,EACJ;AAEA,EAAA,OAAO;AAAA,IACH,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,IAC3B,MAAA;AAAA,IACA,MAAA,EAAQ;AAAA,MACJ,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,MAAM,MAAA,CAAO;AAAA,KACjB;AAAA,IACA,YAAY,MAAA,CAAO;AAAA,GACvB;AACJ;AAQO,SAAS,WAAW,GAAA,EAAsB;AAC7C,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,KAAA;AAC5C,EAAA,IAAI;AACA,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA;AACjC,IAAA,OAAO,CAAC,OAAA,EAAS,QAAQ,CAAA,CAAE,QAAA,CAAS,OAAO,QAAQ,CAAA;AAAA,EACvD,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,KAAA;AAAA,EACX;AACJ;AAQO,SAAS,WAAW,GAAA,EAAsB;AAC7C,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,KAAA;AAC5C,EAAA,IAAI;AACA,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA;AACjC,IAAA,OAAO,OAAO,QAAA,KAAa,QAAA;AAAA,EAC/B,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,KAAA;AAAA,EACX;AACJ;AAQO,SAAS,aAAa,GAAA,EAAqB;AAC9C,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,EAAA;AAC5C,EAAA,IAAI;AACA,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA;AACjC,IAAA,OAAO,MAAA,CAAO,QAAA;AAAA,EAClB,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,EAAA;AAAA,EACX;AACJ;AAQO,SAAS,aAAa,GAAA,EAAqB;AAC9C,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,EAAA;AAC5C,EAAA,IAAI;AACA,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA;AAEjC,IAAA,IAAI,OAAO,QAAA,KAAa,GAAA,IAAO,OAAO,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,EAAG;AAC1D,MAAA,MAAA,CAAO,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,CAAA;AAAA,IACjD;AACA,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAClB,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,EAAA;AAAA,EACX;AACJ;AAQO,SAAS,UAAU,GAAA,EAAsB;AAC5C,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,KAAA;AAC5C,EAAA,OAAO,IAAI,IAAA,EAAK,CAAE,WAAA,EAAY,CAAE,WAAW,OAAO,CAAA;AACtD;AAQO,SAAS,eAAe,GAAA,EAAsB;AACjD,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,KAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,CAAC,aAAA,EAAe,WAAA,EAAa,OAAO,CAAA;AACtD,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,IAAA,EAAK,CAAE,WAAA,EAAY;AACvC,EAAA,OAAO,UAAU,IAAA,CAAK,CAAA,MAAA,KAAU,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAC,CAAA;AAC9D;AAKA,SAASA,mBAAkB,MAAA,EAAiD;AACxE,EAAA,OAAO;AAAA,IACH,OAAA,EAAS,KAAA;AAAA,IACT,MAAA;AAAA,IACA,UAAA,EAAY;AAAA,GAChB;AACJ;;;AC9PA,IAAM,aAAA,GAA0C;AAAA,EAC5C,IAAA,EAAM,2BAAA;AAAA,EACN,UAAA,EAAY,4FAAA;AAAA,EACZ,IAAA,EAAM,kBAAA;AAAA,EACN,QAAA,EAAU,+BAAA;AAAA,EACV,MAAA,EAAQ,kCAAA;AAAA,EACR,GAAA,EAAK,+BAAA;AAAA,EACL,QAAA,EAAU,kBAAA;AAAA,EACV,OAAA,EAAS,8BAAA;AAAA,EACT,OAAA,EAAS;AACb,CAAA;AAKA,IAAM,aAAA,GAA0C;AAAA,EAC5C,GAAA,EAAK,MAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM,YAAA;AAAA,EACN,IAAA,EAAM,YAAA;AAAA,EACN,IAAA,EAAM,YAAA;AAAA,EACN,IAAA,EAAM,YAAA;AAAA,EACN,IAAA,EAAM,YAAA;AAAA,EACN,IAAA,EAAM,YAAA;AAAA,EACN,IAAA,EAAM,YAAA;AAAA,EACN,IAAA,EAAM,YAAA;AAAA,EACN,IAAA,EAAM,YAAA;AAAA,EACN,IAAA,EAAM,YAAA;AAAA,EACN,IAAA,EAAM,YAAA;AAAA,EACN,MAAA,EAAQ,UAAA;AAAA,EACR,IAAA,EAAM,UAAA;AAAA,EACN,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM,KAAA;AAAA,EACN,IAAA,EAAM;AACV,CAAA;AAKA,IAAMJ,gBAAAA,GAAqC;AAAA,EACvC,SAAA,EAAW;AACf,CAAA;AAiBO,SAAS,kBAAA,CACZ,UAAA,EACA,OAAA,GAA6B,EAAC,EACJ;AAC1B,EAAA,MAAM,IAAA,GAAO,EAAE,GAAGA,gBAAAA,EAAiB,GAAG,OAAA,EAAQ;AAC9C,EAAA,MAAM,SAA6B,EAAC;AAGpC,EAAA,IAAI,UAAA,IAAc,UAAA,CAAW,MAAA,GAAS,EAAA,EAAI;AACtC,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,YAAA;AAAA,MACP,IAAA,EAAM,gBAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACZ,CAAA;AACD,IAAA,OAAOI,mBAAkB,MAAM,CAAA;AAAA,EACnC;AAGA,EAAA,MAAM,OAAA,GAAU,gBAAgB,UAAU,CAAA;AAG1C,EAAA,IAAI,CAAC,UAAA,IAAc,CAAC,OAAA,EAAS;AACzB,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,YAAA;AAAA,MACP,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS,IAAA,CAAK,QAAA,EAAU,QAAA,IAAY;AAAA,KACvC,CAAA;AACD,IAAA,OAAOA,mBAAkB,MAAM,CAAA;AAAA,EACnC;AAGA,EAAA,IAAI,CAAC,gBAAA,CAAiB,IAAA,CAAK,OAAO,CAAA,EAAG;AACjC,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,YAAA;AAAA,MACP,IAAA,EAAM,gBAAA;AAAA,MACN,OAAA,EAAS,IAAA,CAAK,QAAA,EAAU,aAAA,IAAiB;AAAA,KAC5C,CAAA;AACD,IAAA,OAAOA,kBAAAA,CAAkB,QAAQ,OAAO,CAAA;AAAA,EAC5C;AAGA,EAAA,MAAM,QAAA,GAAW,eAAe,OAAO,CAAA;AAGvC,EAAA,IAAI,IAAA,CAAK,SAAA,IAAa,CAAC,SAAA,CAAU,OAAO,CAAA,EAAG;AACvC,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,YAAA;AAAA,MACP,IAAA,EAAM,cAAA;AAAA,MACN,OAAA,EAAS,IAAA,CAAK,QAAA,EAAU,WAAA,IAAe;AAAA,KAC1C,CAAA;AAAA,EACL;AAGA,EAAA,IAAI,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA,EAAG;AACnD,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,QAAA,CAAS,QAAQ,CAAA,EAAG;AACvC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,KAAA,EAAO,YAAA;AAAA,QACP,IAAA,EAAM,kBAAA;AAAA,QACN,OAAA,EAAS,IAAA,CAAK,QAAA,EAAU,cAAA,IACpB,cAAc,QAAQ,CAAA,gBAAA;AAAA,OAC7B,CAAA;AAAA,IACL;AAAA,EACJ;AAEA,EAAA,OAAO;AAAA,IACH,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,IAC3B,MAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA,EAAQ,eAAe,OAAO,CAAA;AAAA,IAC9B;AAAA,GACJ;AACJ;AAQO,SAAS,kBAAkB,UAAA,EAA6B;AAC3D,EAAA,IAAI,CAAC,UAAA,IAAc,OAAO,UAAA,KAAe,UAAU,OAAO,KAAA;AAC1D,EAAA,MAAM,OAAA,GAAU,gBAAgB,UAAU,CAAA;AAC1C,EAAA,OAAO,gBAAA,CAAiB,IAAA,CAAK,OAAO,CAAA,IAAK,UAAU,OAAO,CAAA;AAC9D;AAQO,SAAS,eAAe,UAAA,EAA8B;AACzD,EAAA,MAAM,OAAA,GAAU,gBAAgB,UAAU,CAAA;AAG1C,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAAG;AACzD,IAAA,IAAI,IAAA,KAAS,SAAA,IAAa,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,EAAG;AAC7C,MAAA,OAAO,IAAA;AAAA,IACX;AAAA,EACJ;AAEA,EAAA,OAAO,SAAA;AACX;AAQO,SAAS,sBAAsB,UAAA,EAAqC;AACvE,EAAA,MAAM,OAAA,GAAU,gBAAgB,UAAU,CAAA;AAC1C,EAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAG/B,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,MAAM,CAAA;AAE9E,EAAA,KAAA,MAAW,UAAU,QAAA,EAAU;AAC3B,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA,EAAG;AAC5B,MAAA,OAAO,cAAc,MAAM,CAAA;AAAA,IAC/B;AAAA,EACJ;AAEA,EAAA,OAAO,IAAA;AACX;AAQO,SAAS,UAAU,UAAA,EAA6B;AACnD,EAAA,MAAM,OAAA,GAAU,gBAAgB,UAAU,CAAA;AAC1C,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,GAAS,IAAI,OAAO,KAAA;AAE5C,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,MAAA,GAAS,KAAA;AAEb,EAAA,KAAA,IAAS,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC1C,IAAA,IAAI,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,CAAC,GAAG,EAAE,CAAA;AAEnC,IAAA,IAAI,MAAA,EAAQ;AACR,MAAA,KAAA,IAAS,CAAA;AACT,MAAA,IAAI,QAAQ,CAAA,EAAG;AACX,QAAA,KAAA,IAAS,CAAA;AAAA,MACb;AAAA,IACJ;AAEA,IAAA,GAAA,IAAO,KAAA;AACP,IAAA,MAAA,GAAS,CAAC,MAAA;AAAA,EACd;AAEA,EAAA,OAAO,MAAM,EAAA,KAAO,CAAA;AACxB;AASO,SAAS,cAAA,CAAe,UAAA,EAAoB,QAAA,GAAmB,GAAA,EAAa;AAC/E,EAAA,MAAM,OAAA,GAAU,gBAAgB,UAAU,CAAA;AAC1C,EAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,OAAO,OAAA;AAE/B,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,EAAE,CAAA;AACjC,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAC,CAAA;AACjD,EAAA,OAAO,MAAA,GAAS,QAAA;AACpB;AAQO,SAAS,iBAAiB,UAAA,EAA4B;AACzD,EAAA,MAAM,OAAA,GAAU,gBAAgB,UAAU,CAAA;AAC1C,EAAA,MAAM,IAAA,GAAO,eAAe,OAAO,CAAA;AAGnC,EAAA,IAAI,SAAS,MAAA,EAAQ;AACjB,IAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,uBAAA,EAAyB,UAAU,EAAE,IAAA,EAAK;AAAA,EACrE;AAGA,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,gBAAA,EAAkB,KAAK,EAAE,IAAA,EAAK;AACzD;AASO,SAAS,UAAA,CAAW,KAAa,QAAA,EAA8B;AAClE,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,KAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAGrC,EAAA,IAAI,aAAa,MAAA,EAAQ;AACrB,IAAA,OAAO,SAAA,CAAU,KAAK,OAAO,CAAA;AAAA,EACjC;AAGA,EAAA,OAAO,WAAA,CAAY,KAAK,OAAO,CAAA;AACnC;AASO,SAAS,aAAA,CAAc,OAAwB,IAAA,EAAgC;AAClF,EAAA,MAAM,IAAI,OAAO,KAAA,KAAU,WAAW,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA,GAAI,KAAA;AAC5D,EAAA,IAAI,IAAI,OAAO,IAAA,KAAS,WAAW,QAAA,CAAS,IAAA,EAAM,EAAE,CAAA,GAAI,IAAA;AAGxD,EAAA,IAAI,IAAI,GAAA,EAAK;AACT,IAAA,CAAA,IAAK,GAAA;AAAA,EACT;AAGA,EAAA,IAAI,MAAM,CAAC,CAAA,IAAK,IAAI,CAAA,IAAK,CAAA,GAAI,IAAI,OAAO,KAAA;AAGxC,EAAA,IAAI,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA,GAAI,KAAM,OAAO,KAAA;AAGjC,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,CAAA,EAAG,GAAG,CAAC,CAAA;AAE/B,EAAA,OAAO,MAAA,IAAU,GAAA;AACrB;AAKA,SAAS,gBAAgB,UAAA,EAA4B;AACjD,EAAA,IAAI,CAAC,UAAA,IAAc,OAAO,UAAA,KAAe,UAAU,OAAO,EAAA;AAC1D,EAAA,OAAO,UAAA,CAAW,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACvC;AAKA,SAASA,kBAAAA,CACL,MAAA,EACA,OAAA,GAAkB,EAAA,EACQ;AAC1B,EAAA,OAAO;AAAA,IACH,OAAA,EAAS,KAAA;AAAA,IACT,MAAA;AAAA,IACA,QAAA,EAAU,IAAA;AAAA,IACV,MAAA,EAAQ,EAAA;AAAA,IACR;AAAA,GACJ;AACJ;;;AC3UA,IAAMC,WAAAA,GAAa,6FAAA;AAKnB,IAAM,eAAA,GAAkB,uHAAA;AAKxB,IAAMC,WAAAA,GAAa,knBAAA;AAKnB,IAAM,eAAA,GAAkB,+CAAA;AAKxB,IAAM,mBAAA,GAAsB;AAAA,EACxB,OAAA;AAAA;AAAA,EACA,+BAAA;AAAA;AAAA,EACA,aAAA;AAAA;AAAA,EACA;AAAA;AACJ,CAAA;AAKA,IAAMN,gBAAAA,GAA6B;AAAA,EAC/B,OAAA,EAAS,MAAA;AAAA,EACT,SAAA,EAAW,KAAA;AAAA,EACX,YAAA,EAAc;AAClB,CAAA;AAkBO,SAAS,UAAA,CAAW,EAAA,EAAY,OAAA,GAAqB,EAAC,EAAuB;AAChF,EAAA,MAAM,IAAA,GAAO,EAAE,GAAGA,gBAAAA,EAAiB,GAAG,OAAA,EAAQ;AAC9C,EAAA,MAAM,SAA6B,EAAC;AAGpC,EAAA,MAAM,OAAA,GAAU,EAAA,EAAI,IAAA,EAAK,IAAK,EAAA;AAG9B,EAAA,IAAI,CAAC,EAAA,IAAM,CAAC,OAAA,EAAS;AACjB,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS,IAAA,CAAK,QAAA,EAAU,QAAA,IAAY;AAAA,KACvC,CAAA;AACD,IAAA,OAAOI,mBAAkB,MAAM,CAAA;AAAA,EACnC;AAGA,EAAA,IAAI,MAAA,GAAS,OAAA;AACb,EAAA,IAAI,IAAA,GAAsB,IAAA;AAE1B,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AACvB,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACjB,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,KAAA,EAAO,IAAA;AAAA,QACP,IAAA,EAAM,kBAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACZ,CAAA;AAAA,IACL;AACA,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA;AAC/B,IAAA,MAAA,GAAS,MAAM,CAAC,CAAA;AAChB,IAAA,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,EAChC;AAGA,EAAA,IAAI,OAAA,GAAwB,IAAA;AAC5B,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,IAAIC,WAAAA,CAAW,IAAA,CAAK,MAAM,CAAA,EAAG;AACzB,IAAA,OAAA,GAAU,CAAA;AACV,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,IAAI,IAAA,KAAS,IAAA,KAAS,IAAA,GAAO,CAAA,IAAK,OAAO,EAAA,CAAA,EAAK;AAC1C,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,KAAA,EAAO,IAAA;AAAA,QACP,IAAA,EAAM,cAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACZ,CAAA;AAAA,IACL;AAAA,EACJ,CAAA,MAAA,IAAWC,WAAAA,CAAW,IAAA,CAAK,MAAM,CAAA,EAAG;AAChC,IAAA,OAAA,GAAU,CAAA;AACV,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,IAAI,IAAA,KAAS,IAAA,KAAS,IAAA,GAAO,CAAA,IAAK,OAAO,GAAA,CAAA,EAAM;AAC3C,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,KAAA,EAAO,IAAA;AAAA,QACP,IAAA,EAAM,cAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACZ,CAAA;AAAA,IACL;AAAA,EACJ;AAEA,EAAA,IAAI,CAAC,OAAA,EAAS;AACV,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAM,gBAAA;AAAA,MACN,OAAA,EAAS,IAAA,CAAK,QAAA,EAAU,aAAA,IAAiB;AAAA,KAC5C,CAAA;AACD,IAAA,OAAOF,kBAAAA,CAAkB,QAAQ,OAAO,CAAA;AAAA,EAC5C;AAGA,EAAA,IAAI,IAAA,CAAK,OAAA,KAAY,MAAA,IAAU,OAAA,KAAY,KAAK,OAAA,EAAS;AACrD,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAM,qBAAA;AAAA,MACN,OAAA,EAAS,KAAK,QAAA,EAAU,iBAAA,IACpB,MAAM,OAAO,CAAA,6BAAA,EAAgC,KAAK,OAAO,CAAA;AAAA,KAChE,CAAA;AAAA,EACL;AAGA,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,MAAA,EAAQ,OAAA,IAAW,MAAS,CAAA;AAC1D,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,MAAA,EAAQ,OAAA,IAAW,MAAS,CAAA;AAE5D,EAAA,IAAI,CAAC,IAAA,CAAK,YAAA,KAAiB,SAAA,IAAa,UAAA,CAAA,EAAa;AACjD,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAM,qBAAA;AAAA,MACN,OAAA,EAAS,IAAA,CAAK,QAAA,EAAU,iBAAA,IACpB;AAAA,KACP,CAAA;AAAA,EACL;AAEA,EAAA,OAAO;AAAA,IACH,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,IAC3B,MAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA,EAAY,QAAQ,WAAA;AAAY,GACpC;AACJ;AAQO,SAAS,YAAY,EAAA,EAAqB;AAC7C,EAAA,IAAI,CAAC,EAAA,IAAM,OAAO,EAAA,KAAO,UAAU,OAAO,KAAA;AAC1C,EAAA,OAAOC,WAAAA,CAAW,IAAA,CAAK,EAAA,CAAG,IAAA,EAAM,CAAA;AACpC;AAQO,SAAS,YAAY,EAAA,EAAqB;AAC7C,EAAA,IAAI,CAAC,EAAA,IAAM,OAAO,EAAA,KAAO,UAAU,OAAO,KAAA;AAC1C,EAAA,OAAOC,WAAAA,CAAW,IAAA,CAAK,EAAA,CAAG,IAAA,EAAM,CAAA;AACpC;AAQO,SAAS,UAAU,EAAA,EAAqB;AAC3C,EAAA,OAAO,WAAA,CAAY,EAAE,CAAA,IAAK,WAAA,CAAY,EAAE,CAAA;AAC5C;AASO,SAAS,WAAA,CAAY,IAAY,OAAA,EAA0B;AAC9D,EAAA,IAAI,CAAC,IAAI,OAAO,KAAA;AAEhB,EAAA,MAAM,CAAA,GAAI,YAAY,WAAA,CAAY,EAAE,IAAI,CAAA,GAAI,WAAA,CAAY,EAAE,CAAA,GAAI,CAAA,GAAI,MAAA,CAAA;AAElE,EAAA,IAAI,MAAM,CAAA,EAAG;AACT,IAAA,OAAO,oBAAoB,IAAA,CAAK,CAAA,KAAA,KAAS,KAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,EAC3D;AAEA,EAAA,IAAI,MAAM,CAAA,EAAG;AACT,IAAA,MAAM,KAAA,GAAQ,GAAG,WAAA,EAAY;AAE7B,IAAA,OAAO,MAAM,UAAA,CAAW,IAAI,CAAA,IAAK,KAAA,CAAM,WAAW,IAAI,CAAA;AAAA,IAElD,KAAA,CAAM,WAAW,MAAM,CAAA;AAAA,EAC/B;AAEA,EAAA,OAAO,KAAA;AACX;AASO,SAAS,YAAA,CAAa,IAAY,OAAA,EAA0B;AAC/D,EAAA,IAAI,CAAC,IAAI,OAAO,KAAA;AAEhB,EAAA,MAAM,CAAA,GAAI,YAAY,WAAA,CAAY,EAAE,IAAI,CAAA,GAAI,WAAA,CAAY,EAAE,CAAA,GAAI,CAAA,GAAI,MAAA,CAAA;AAElE,EAAA,IAAI,MAAM,CAAA,EAAG;AACT,IAAA,OAAO,EAAA,CAAG,WAAW,MAAM,CAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,MAAM,CAAA,EAAG;AACT,IAAA,MAAM,KAAA,GAAQ,GAAG,WAAA,EAAY;AAC7B,IAAA,OAAO,KAAA,KAAU,SAAS,KAAA,KAAU,yCAAA;AAAA,EACxC;AAEA,EAAA,OAAO,KAAA;AACX;AAQO,SAAS,aAAa,EAAA,EAA0B;AACnD,EAAA,IAAI,WAAA,CAAY,EAAE,CAAA,EAAG,OAAO,CAAA;AAC5B,EAAA,IAAI,WAAA,CAAY,EAAE,CAAA,EAAG,OAAO,CAAA;AAC5B,EAAA,OAAO,IAAA;AACX;AAQO,SAAS,YAAY,IAAA,EAAuB;AAC/C,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,KAAA;AAE9C,EAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,IAAA;AAEvC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA;AACxC,EAAA,IAAI,KAAA,EAAO;AACP,IAAA,OAAOA,WAAAA,CAAW,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,IAAK,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AAAA,EAClE;AAEA,EAAA,OAAO,KAAA;AACX;AAKA,SAASF,kBAAAA,CACL,MAAA,EACA,UAAA,GAAqB,EAAA,EACH;AAClB,EAAA,OAAO;AAAA,IACH,OAAA,EAAS,KAAA;AAAA,IACT,MAAA;AAAA,IACA,OAAA,EAAS,IAAA;AAAA,IACT,SAAA,EAAW,KAAA;AAAA,IACX,UAAA,EAAY,KAAA;AAAA,IACZ,IAAA,EAAM,IAAA;AAAA,IACN;AAAA,GACJ;AACJ;;;ACnSO,SAAS,YAAA,CAAa,IAAA,EAAc,OAAA,GAAuB,EAAC,EAAqD;AACpH,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACnC,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,UAAA,EAAY,OAAA,EAAS,kBAAA,EAAoB,CAAA,EAAE;AAAA,EACxG;AAEA,EAAA,MAAM,YAAY,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,EAAE,EAAE,WAAA,EAAY;AACzD,EAAA,MAAM,SAA6B,EAAC;AAGpC,EAAA,IAAI,IAAA,CAAK,SAAS,EAAA,EAAI;AAClB,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,MAAA;AAAA,MACP,IAAA,EAAM,gBAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACZ,CAAA;AACD,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAO;AAAA,EACpC;AAGA,EAAA,IAAI,CAAC,kCAAA,CAAmC,IAAA,CAAK,SAAS,CAAA,EAAG;AACrD,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,MAAA;AAAA,MACP,IAAA,EAAM,gBAAA;AAAA,MACN,OAAA,EAAS,OAAA,CAAQ,QAAA,EAAU,aAAA,IAAiB;AAAA,KAC/C,CAAA;AACD,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAO;AAAA,EACpC;AAGA,EAAA,MAAM,OAAA,GAAkC;AAAA,IACpC,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAC5E,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAC5E,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAC5E,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAC5E,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAC5E,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAC5E,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAAI,EAAA;AAAA,IAAI,EAAA,EAA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","file":"chunk-OFFRGRBN.cjs","sourcesContent":["import type { EmailOptions, EmailValidationResult, IValidationError } from '../types';\r\nimport { DISPOSABLE_EMAIL_DOMAINS, FREE_EMAIL_DOMAINS } from '../utils/constants';\r\n\r\n/**\r\n * RFC 5322 compliant email regex pattern\r\n * Simplified but practical for real-world use\r\n */\r\nconst EMAIL_REGEX =\r\n /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)])$/i;\r\n\r\n/**\r\n * Simpler email regex for quick validation\r\n */\r\nconst SIMPLE_EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n\r\n/**\r\n * Default email validation options\r\n */\r\nconst DEFAULT_OPTIONS: EmailOptions = {\r\n checkDisposable: true,\r\n checkCorporate: false,\r\n};\r\n\r\n/**\r\n * Validate an email address with comprehensive checks\r\n *\r\n * @param email - Email address to validate\r\n * @param options - Validation options\r\n * @returns Validation result with details\r\n * @since 1.0.0\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = validateEmail('user@example.com');\r\n * if (result.isValid) {\r\n * console.log('Email is valid:', result.normalized);\r\n * }\r\n * ```\r\n */\r\nexport function validateEmail(email: string, options: EmailOptions = {}): EmailValidationResult {\r\n const opts = { ...DEFAULT_OPTIONS, ...options };\r\n const errors: IValidationError[] = [];\r\n\r\n // Trim and lowercase\r\n const trimmedEmail = email?.trim() ?? '';\r\n\r\n // Basic validation\r\n if (!trimmedEmail) {\r\n errors.push({\r\n field: 'email',\r\n code: 'REQUIRED',\r\n message: 'Email is required',\r\n });\r\n return createResult(false, errors, '', '', '');\r\n }\r\n\r\n if (email.length > 320) {\r\n errors.push({\r\n field: 'email',\r\n code: 'INVALID_LENGTH',\r\n message: 'Email must be between 1 and 320 characters',\r\n });\r\n return createResult(false, errors, '', '', '');\r\n }\r\n const normalizedEmail = trimmedEmail.toLowerCase();\r\n\r\n // Extract parts\r\n const atIndex = normalizedEmail.lastIndexOf('@');\r\n const localPart = atIndex > 0 ? normalizedEmail.slice(0, atIndex) : '';\r\n const domain = atIndex > 0 ? normalizedEmail.slice(atIndex + 1) : '';\r\n\r\n\r\n\r\n // Length check\r\n if (trimmedEmail.length > 254) {\r\n errors.push({\r\n field: 'email',\r\n code: 'TOO_LONG',\r\n message: 'Email must not exceed 254 characters',\r\n });\r\n }\r\n\r\n // Format validation\r\n if (!EMAIL_REGEX.test(normalizedEmail)) {\r\n errors.push({\r\n field: 'email',\r\n code: 'INVALID_FORMAT',\r\n message: 'Email format is invalid',\r\n });\r\n return createResult(false, errors, normalizedEmail, localPart, domain);\r\n }\r\n\r\n // Local part length check\r\n if (localPart.length > 64) {\r\n errors.push({\r\n field: 'email',\r\n code: 'LOCAL_PART_TOO_LONG',\r\n message: 'Local part must not exceed 64 characters',\r\n });\r\n }\r\n\r\n // Check for disposable domains\r\n const isDisposable = DISPOSABLE_EMAIL_DOMAINS.has(domain);\r\n if (opts.checkDisposable && isDisposable) {\r\n errors.push({\r\n field: 'email',\r\n code: 'DISPOSABLE_EMAIL',\r\n message: 'Disposable email addresses are not allowed',\r\n });\r\n }\r\n\r\n // Check blocked domains\r\n if (opts.blockedDomains?.includes(domain)) {\r\n errors.push({\r\n field: 'email',\r\n code: 'BLOCKED_DOMAIN',\r\n message: 'This email domain is not allowed',\r\n });\r\n }\r\n\r\n // Check allowed domains\r\n if (opts.allowedDomains && opts.allowedDomains.length > 0) {\r\n if (!opts.allowedDomains.includes(domain)) {\r\n errors.push({\r\n field: 'email',\r\n code: 'DOMAIN_NOT_ALLOWED',\r\n message: 'This email domain is not in the allowed list',\r\n });\r\n }\r\n }\r\n\r\n // Determine if corporate (not free email)\r\n const isCorporate = !FREE_EMAIL_DOMAINS.has(domain) && !isDisposable;\r\n\r\n return {\r\n isValid: errors.length === 0,\r\n errors,\r\n isDisposable,\r\n isCorporate,\r\n normalized: normalizeEmail(normalizedEmail),\r\n domain,\r\n localPart,\r\n };\r\n}\r\n\r\n/**\r\n * Simple email format validation\r\n *\r\n * @param email - Email to validate\r\n * @returns true if email format is valid\r\n * @since 1.0.0\r\n */\r\nexport function isValidEmail(email: string): boolean {\r\n if (!email || typeof email !== 'string') return false;\r\n const trimmed = email.trim();\r\n return SIMPLE_EMAIL_REGEX.test(trimmed) && EMAIL_REGEX.test(trimmed.toLowerCase());\r\n}\r\n\r\n/**\r\n * Check if email domain is disposable\r\n *\r\n * @param email - Email to check\r\n * @returns true if domain is disposable\r\n * @since 1.0.0\r\n */\r\nexport function isDisposableEmail(email: string): boolean {\r\n if (!email || typeof email !== 'string') return false;\r\n const domain = email.trim().toLowerCase().split('@')[1];\r\n return domain ? DISPOSABLE_EMAIL_DOMAINS.has(domain) : false;\r\n}\r\n\r\n/**\r\n * Normalize email address\r\n * - Lowercase\r\n * - Remove dots from Gmail local part\r\n * - Remove + aliases\r\n *\r\n * @param email - Email to normalize\r\n * @returns Normalized email\r\n * @since 1.0.0\r\n */\r\nexport function normalizeEmail(email: string): string {\r\n if (!email || typeof email !== 'string') return '';\r\n\r\n const trimmed = email.trim().toLowerCase();\r\n const [localPart, domain] = trimmed.split('@');\r\n\r\n if (!localPart || !domain) return trimmed;\r\n\r\n let normalizedLocal = localPart;\r\n\r\n // Remove + alias\r\n const plusIndex = normalizedLocal.indexOf('+');\r\n if (plusIndex > 0) {\r\n normalizedLocal = normalizedLocal.slice(0, plusIndex);\r\n }\r\n\r\n // Remove dots for Gmail\r\n if (domain === 'gmail.com' || domain === 'googlemail.com') {\r\n normalizedLocal = normalizedLocal.replace(/\\./g, '');\r\n }\r\n\r\n return `${normalizedLocal}@${domain}`;\r\n}\r\n\r\n/**\r\n * Extract domain from email\r\n *\r\n * @param email - Email address\r\n * @returns Domain part of email\r\n * @since 1.0.0\r\n */\r\nexport function getEmailDomain(email: string): string {\r\n if (!email || typeof email !== 'string') return '';\r\n const parts = email.trim().toLowerCase().split('@');\r\n return parts[1] || '';\r\n}\r\n\r\n/**\r\n * Create validation result helper\r\n */\r\nfunction createResult(\r\n isValid: boolean,\r\n errors: IValidationError[],\r\n normalized: string,\r\n localPart: string,\r\n domain: string\r\n): EmailValidationResult {\r\n return {\r\n isValid,\r\n errors,\r\n isDisposable: domain ? DISPOSABLE_EMAIL_DOMAINS.has(domain) : false,\r\n isCorporate: domain ? !FREE_EMAIL_DOMAINS.has(domain) : false,\r\n normalized,\r\n domain,\r\n localPart,\r\n };\r\n}\r\n","import type { NameOptions, NameValidationResult, IValidationError } from '../types';\r\n\r\n/**\r\n * Unicode script detection patterns\r\n */\r\nconst SCRIPT_PATTERNS = {\r\n latin: /[\\u0041-\\u005A\\u0061-\\u007A\\u00C0-\\u00FF\\u0100-\\u017F\\u0180-\\u024F]/,\r\n arabic: /[\\u0600-\\u06FF\\u0750-\\u077F\\u08A0-\\u08FF]/,\r\n cjk: /[\\u4E00-\\u9FFF\\u3400-\\u4DBF\\u3040-\\u309F\\u30A0-\\u30FF\\uAC00-\\uD7AF]/,\r\n cyrillic: /[\\u0400-\\u04FF\\u0500-\\u052F]/,\r\n devanagari: /[\\u0900-\\u097F]/,\r\n};\r\n\r\n/**\r\n * Characters that are generally allowed in names\r\n */\r\nconst ALLOWED_NAME_CHARS = /^[\\p{L}\\p{M}'\\-\\s.]+$/u;\r\n\r\n/**\r\n * Default name validation options\r\n */\r\nconst DEFAULT_OPTIONS: NameOptions = {\r\n minLength: 2,\r\n maxLength: 100,\r\n allowSpecialChars: true,\r\n allowNumbers: false,\r\n allowedScripts: ['latin', 'arabic', 'cjk', 'cyrillic', 'devanagari'],\r\n};\r\n\r\n/**\r\n * Validate a name with multilingual support\r\n *\r\n * @param name - Name to validate\r\n * @param options - Validation options\r\n * @returns Validation result\r\n * @since 1.0.0\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = validateName('John Doe');\r\n * if (result.isValid) {\r\n * console.log('Name is valid:', result.sanitized);\r\n * }\r\n * ```\r\n */\r\nexport function validateName(name: string, options: NameOptions = {}): NameValidationResult {\r\n const opts = { ...DEFAULT_OPTIONS, ...options };\r\n const errors: IValidationError[] = [];\r\n\r\n // Sanitize and trim\r\n const sanitized = sanitizeName(name);\r\n const detectedScript = detectScript(sanitized);\r\n\r\n // Required check\r\n if (!name || !sanitized) {\r\n errors.push({\r\n field: 'name',\r\n code: 'REQUIRED',\r\n message: opts.messages?.required || 'Name is required',\r\n });\r\n return { isValid: false, errors, sanitized: '', detectedScript: 'unknown' };\r\n }\r\n\r\n // Length validation\r\n if (sanitized.length < (opts.minLength ?? 2)) {\r\n errors.push({\r\n field: 'name',\r\n code: 'TOO_SHORT',\r\n message: opts.messages?.tooShort || `Name must be at least ${opts.minLength} characters`,\r\n });\r\n }\r\n\r\n if (sanitized.length > (opts.maxLength ?? 100)) {\r\n errors.push({\r\n field: 'name',\r\n code: 'TOO_LONG',\r\n message: opts.messages?.tooLong || `Name must not exceed ${opts.maxLength} characters`,\r\n });\r\n }\r\n\r\n // Character validation\r\n if (!opts.allowNumbers && /\\d/.test(sanitized)) {\r\n errors.push({\r\n field: 'name',\r\n code: 'CONTAINS_NUMBERS',\r\n message: opts.messages?.containsNumbers || 'Name cannot contain numbers',\r\n });\r\n }\r\n\r\n // Special characters check\r\n if (!opts.allowSpecialChars) {\r\n // Only allow letters, spaces, hyphens, apostrophes\r\n if (!/^[\\p{L}\\p{M}\\s'-]+$/u.test(sanitized)) {\r\n errors.push({\r\n field: 'name',\r\n code: 'INVALID_CHARACTERS',\r\n message: opts.messages?.invalidChars || 'Name contains invalid characters',\r\n });\r\n }\r\n } else {\r\n // Allow more characters but still validate\r\n if (!ALLOWED_NAME_CHARS.test(sanitized)) {\r\n errors.push({\r\n field: 'name',\r\n code: 'INVALID_CHARACTERS',\r\n message: opts.messages?.invalidChars || 'Name contains invalid characters',\r\n });\r\n }\r\n }\r\n\r\n // Script validation\r\n if (opts.allowedScripts && opts.allowedScripts.length > 0 && detectedScript !== 'mixed') {\r\n if (detectedScript !== 'unknown' && !opts.allowedScripts.includes(detectedScript)) {\r\n errors.push({\r\n field: 'name',\r\n code: 'SCRIPT_NOT_ALLOWED',\r\n message: opts.messages?.scriptNotAllowed || `Script '${detectedScript}' is not allowed`,\r\n });\r\n }\r\n }\r\n\r\n // Check for excessive whitespace or special patterns\r\n if (/^\\s|\\s$|\\s{2,}/.test(name)) {\r\n // Already sanitized, just note it was cleaned\r\n }\r\n\r\n // Check for suspicious patterns (all same character)\r\n if (/^(.)\\1+$/.test(sanitized.replace(/\\s/g, ''))) {\r\n errors.push({\r\n field: 'name',\r\n code: 'SUSPICIOUS_PATTERN',\r\n message: opts.messages?.suspicious || 'Name appears to be invalid',\r\n });\r\n }\r\n\r\n return {\r\n isValid: errors.length === 0,\r\n errors,\r\n sanitized,\r\n detectedScript,\r\n };\r\n}\r\n\r\n/**\r\n * Simple name validation check\r\n *\r\n * @param name - Name to validate\r\n * @returns true if name is valid\r\n * @since 1.0.0\r\n */\r\nexport function isValidName(name: string): boolean {\r\n if (!name || typeof name !== 'string') return false;\r\n const sanitized = sanitizeName(name);\r\n return sanitized.length >= 2 && sanitized.length <= 100 && ALLOWED_NAME_CHARS.test(sanitized);\r\n}\r\n\r\n/**\r\n * Sanitize a name string\r\n * - Trim whitespace\r\n * - Normalize unicode\r\n * - Remove excessive spaces\r\n * - Capitalize properly\r\n *\r\n * @param name - Name to sanitize\r\n * @returns Sanitized name\r\n * @since 1.0.0\r\n */\r\nexport function sanitizeName(name: string): string {\r\n if (!name || typeof name !== 'string') return '';\r\n\r\n return (\r\n name\r\n // Normalize unicode\r\n .normalize('NFC')\r\n // Trim\r\n .trim()\r\n // Replace multiple spaces with single\r\n .replace(/\\s+/g, ' ')\r\n // Remove control characters\r\n .replace(/[\\x00-\\x1F\\x7F]/g, '')\r\n );\r\n}\r\n\r\n/**\r\n * Detect the primary script used in a string\r\n *\r\n * @param text - Text to analyze\r\n * @returns Detected script\r\n * @since 1.0.0\r\n */\r\nexport function detectScript(\r\n text: string\r\n): 'latin' | 'arabic' | 'cjk' | 'cyrillic' | 'devanagari' | 'mixed' | 'unknown' {\r\n if (!text) return 'unknown';\r\n\r\n const scripts: string[] = [];\r\n\r\n for (const [script, pattern] of Object.entries(SCRIPT_PATTERNS)) {\r\n if (pattern.test(text)) {\r\n scripts.push(script);\r\n }\r\n }\r\n\r\n if (scripts.length === 0) return 'unknown';\r\n if (scripts.length === 1)\r\n return scripts[0] as 'latin' | 'arabic' | 'cjk' | 'cyrillic' | 'devanagari';\r\n return 'mixed';\r\n}\r\n\r\n/**\r\n * Format name to proper title case\r\n *\r\n * @param name - Name to format\r\n * @returns Formatted name\r\n * @since 1.0.0\r\n */\r\nexport function formatName(name: string): string {\r\n if (!name || typeof name !== 'string') return '';\r\n\r\n return sanitizeName(name)\r\n .split(' ')\r\n .map(part => {\r\n if (part.length === 0) return '';\r\n // Handle hyphenated names\r\n if (part.includes('-')) {\r\n return part\r\n .split('-')\r\n .map(p => p.charAt(0).toUpperCase() + p.slice(1).toLowerCase())\r\n .join('-');\r\n }\r\n // Handle apostrophes (O'Brien, etc.)\r\n if (part.includes(\"'\")) {\r\n return part\r\n .split(\"'\")\r\n .map(p => p.charAt(0).toUpperCase() + p.slice(1).toLowerCase())\r\n .join(\"'\");\r\n }\r\n return part.charAt(0).toUpperCase() + part.slice(1).toLowerCase();\r\n })\r\n .join(' ');\r\n}\r\n\r\n/**\r\n * Split full name into parts\r\n *\r\n * @param fullName - Full name string\r\n * @returns Object with firstName, lastName, middleName\r\n * @since 1.0.0\r\n */\r\nexport function splitName(fullName: string): {\r\n firstName: string;\r\n lastName: string;\r\n middleName?: string;\r\n} {\r\n const sanitized = sanitizeName(fullName);\r\n const parts = sanitized.split(' ').filter(Boolean);\r\n\r\n if (parts.length === 0) {\r\n return { firstName: '', lastName: '' };\r\n }\r\n\r\n if (parts.length === 1) {\r\n return { firstName: parts[0], lastName: '' };\r\n }\r\n\r\n if (parts.length === 2) {\r\n return { firstName: parts[0], lastName: parts[1] };\r\n }\r\n\r\n return {\r\n firstName: parts[0],\r\n middleName: parts.slice(1, -1).join(' '),\r\n lastName: parts[parts.length - 1],\r\n };\r\n}\r\n","import type { PhoneOptions, PhoneValidationResult, IValidationError } from '../types';\r\nimport { PHONE_FORMATS, getPhoneFormat } from '../country/data/phoneFormats';\r\n\r\n/**\r\n * Default phone validation options\r\n */\r\nconst DEFAULT_OPTIONS: PhoneOptions = {\r\n strict: false,\r\n mobileOnly: false,\r\n};\r\n\r\n/**\r\n * Validate a phone number\r\n *\r\n * @param phone - Phone number to validate\r\n * @param options - Validation options\r\n * @returns Validation result\r\n * @since 1.0.0\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = validatePhone('+1 555-123-4567', { countryCode: 'US' });\r\n * if (result.isValid) {\r\n * console.log('Phone:', result.formatted.international);\r\n * }\r\n * ```\r\n */\r\nexport function validatePhone(phone: string, options: PhoneOptions = {}): PhoneValidationResult {\r\n const opts = { ...DEFAULT_OPTIONS, ...options };\r\n const errors: IValidationError[] = [];\r\n\r\n // Length check to prevent ReDoS\r\n if (phone && phone.length > 50) {\r\n errors.push({\r\n field: 'phone',\r\n code: 'INVALID_LENGTH',\r\n message: 'Phone number is too long',\r\n });\r\n return createEmptyResult(errors);\r\n }\r\n\r\n // Clean the phone number\r\n const cleaned = cleanPhoneNumber(phone);\r\n\r\n // Empty check\r\n if (!phone || !cleaned) {\r\n errors.push({\r\n field: 'phone',\r\n code: 'REQUIRED',\r\n message: opts.messages?.required || 'Phone number is required',\r\n });\r\n return createEmptyResult(errors);\r\n }\r\n\r\n // Detect country if not provided\r\n let detectedCountry = opts.countryCode?.toUpperCase() || '';\r\n let nationalNumber = cleaned;\r\n let dialCode = '';\r\n\r\n // Try to detect from international format\r\n if (cleaned.startsWith('+') || phone.startsWith('+')) {\r\n const detection = detectCountryFromPhone(cleaned);\r\n if (detection) {\r\n detectedCountry = detection.countryCode;\r\n nationalNumber = detection.nationalNumber;\r\n dialCode = detection.dialCode;\r\n }\r\n }\r\n\r\n // Get phone format for country\r\n const format = detectedCountry ? getPhoneFormat(detectedCountry) : null;\r\n\r\n if (!format && opts.countryCode) {\r\n errors.push({\r\n field: 'phone',\r\n code: 'UNSUPPORTED_COUNTRY',\r\n message: opts.messages?.unsupportedCountry || `Country '${opts.countryCode}' is not supported`,\r\n });\r\n return createEmptyResult(errors);\r\n }\r\n\r\n // Validate length\r\n if (format) {\r\n dialCode = format.dialCode;\r\n const validLengths = format.lengths;\r\n\r\n // Remove dial code from national number if present\r\n const dialCodeDigits = format.dialCode.replace(/\\D/g, '');\r\n if (nationalNumber.startsWith(dialCodeDigits)) {\r\n nationalNumber = nationalNumber.slice(dialCodeDigits.length);\r\n }\r\n\r\n // Remove leading zero if present (common in many countries)\r\n if (nationalNumber.startsWith('0')) {\r\n nationalNumber = nationalNumber.slice(1);\r\n }\r\n\r\n if (!validLengths.includes(nationalNumber.length)) {\r\n errors.push({\r\n field: 'phone',\r\n code: 'INVALID_LENGTH',\r\n message:\r\n opts.messages?.invalidLength ||\r\n `Phone number must be ${validLengths.join(' or ')} digits for ${detectedCountry}`,\r\n });\r\n }\r\n\r\n // Determine phone type\r\n const phoneType = determinePhoneType(nationalNumber, format);\r\n\r\n // Mobile only check\r\n if (opts.mobileOnly && phoneType !== 'mobile') {\r\n errors.push({\r\n field: 'phone',\r\n code: 'MOBILE_ONLY',\r\n message: opts.messages?.mobileOnly || 'Only mobile numbers are allowed',\r\n });\r\n }\r\n\r\n return {\r\n isValid: errors.length === 0,\r\n errors,\r\n countryCode: detectedCountry,\r\n nationalNumber,\r\n formatted: {\r\n national: formatNational(nationalNumber, format),\r\n international: formatInternational(nationalNumber, format),\r\n e164: formatE164(nationalNumber, format),\r\n },\r\n type: phoneType,\r\n };\r\n }\r\n\r\n // No format available, do basic validation\r\n if (nationalNumber.length < 7 || nationalNumber.length > 15) {\r\n errors.push({\r\n field: 'phone',\r\n code: 'INVALID_LENGTH',\r\n message: opts.messages?.invalidLength || 'Phone number length is invalid',\r\n });\r\n }\r\n\r\n return {\r\n isValid: errors.length === 0,\r\n errors,\r\n countryCode: detectedCountry,\r\n nationalNumber,\r\n formatted: {\r\n national: nationalNumber,\r\n international: dialCode ? `${dialCode} ${nationalNumber}` : nationalNumber,\r\n e164: dialCode ? `${dialCode}${nationalNumber}` : `+${nationalNumber}`,\r\n },\r\n type: 'unknown',\r\n };\r\n}\r\n\r\n/**\r\n * Simple phone validation\r\n *\r\n * @param phone - Phone number to validate\r\n * @param countryCode - Optional country code\r\n * @returns true if phone is valid\r\n * @since 1.0.0\r\n */\r\nexport function isValidPhone(phone: string, countryCode?: string): boolean {\r\n const result = validatePhone(phone, { countryCode });\r\n return result.isValid;\r\n}\r\n\r\n/**\r\n * Format phone number to specified format\r\n *\r\n * @param phone - Phone number\r\n * @param format - Format type\r\n * @param countryCode - Country code\r\n * @returns Formatted phone number\r\n * @since 1.0.0\r\n */\r\nexport function formatPhone(\r\n phone: string,\r\n format: 'national' | 'international' | 'e164' = 'international',\r\n countryCode?: string\r\n): string {\r\n const result = validatePhone(phone, { countryCode });\r\n if (!result.isValid) return phone;\r\n return result.formatted[format];\r\n}\r\n\r\n/**\r\n * Clean phone number - remove all non-digit characters except leading +\r\n */\r\nfunction cleanPhoneNumber(phone: string): string {\r\n if (!phone || typeof phone !== 'string') return '';\r\n\r\n const trimmed = phone.trim();\r\n const hasPlus = trimmed.startsWith('+');\r\n const digits = trimmed.replace(/\\D/g, '');\r\n\r\n return hasPlus ? `+${digits}` : digits;\r\n}\r\n\r\n/**\r\n * Detect country from international phone number\r\n * For NANP countries (+1), uses area code to distinguish USA, Canada, and Caribbean\r\n */\r\nfunction detectCountryFromPhone(\r\n phone: string\r\n): { countryCode: string; nationalNumber: string; dialCode: string } | null {\r\n const digits = phone.replace(/\\D/g, '');\r\n\r\n // Special handling for NANP (+1) - check area codes\r\n if (digits.startsWith('1') && digits.length >= 4) {\r\n const areaCode = digits.slice(1, 4);\r\n const nationalNumber = digits.slice(1);\r\n\r\n // Check all NANP countries for matching area code\r\n for (const format of Object.values(PHONE_FORMATS)) {\r\n if (format.dialCode === '+1' && format.areaCodes?.includes(areaCode)) {\r\n return {\r\n countryCode: format.countryCode,\r\n nationalNumber,\r\n dialCode: '+1',\r\n };\r\n }\r\n }\r\n\r\n // Default to US if no area code match (most +1 numbers are US)\r\n return {\r\n countryCode: 'US',\r\n nationalNumber,\r\n dialCode: '+1',\r\n };\r\n }\r\n\r\n // Sort formats by dial code length (longest first) to match correctly\r\n const sortedFormats = Object.values(PHONE_FORMATS).sort(\r\n (a, b) => b.dialCode.replace(/\\D/g, '').length - a.dialCode.replace(/\\D/g, '').length\r\n );\r\n\r\n for (const format of sortedFormats) {\r\n const dialDigits = format.dialCode.replace(/\\D/g, '');\r\n // Skip +1 countries in this loop (handled above)\r\n if (format.dialCode === '+1') continue;\r\n\r\n if (digits.startsWith(dialDigits)) {\r\n return {\r\n countryCode: format.countryCode,\r\n nationalNumber: digits.slice(dialDigits.length),\r\n dialCode: format.dialCode,\r\n };\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Determine if phone is mobile or landline\r\n */\r\nfunction determinePhoneType(\r\n nationalNumber: string,\r\n format: { mobilePrefixes: string[]; landlinePrefixes: string[] }\r\n): 'mobile' | 'landline' | 'toll_free' | 'premium' | 'unknown' {\r\n // Check mobile prefixes\r\n for (const prefix of format.mobilePrefixes) {\r\n if (nationalNumber.startsWith(prefix)) {\r\n return 'mobile';\r\n }\r\n }\r\n\r\n // Check landline prefixes\r\n for (const prefix of format.landlinePrefixes) {\r\n if (nationalNumber.startsWith(prefix)) {\r\n return 'landline';\r\n }\r\n }\r\n\r\n // If no prefixes defined, try to guess based on common patterns\r\n if (format.mobilePrefixes.length === 0 && format.landlinePrefixes.length === 0) {\r\n return 'unknown';\r\n }\r\n\r\n return 'unknown';\r\n}\r\n\r\n/**\r\n * Format to national format\r\n */\r\nfunction formatNational(nationalNumber: string, format: { pattern: string }): string {\r\n return applyPattern(nationalNumber, format.pattern);\r\n}\r\n\r\n/**\r\n * Format to international format\r\n */\r\nfunction formatInternational(\r\n nationalNumber: string,\r\n format: { dialCode: string; pattern: string }\r\n): string {\r\n return `${format.dialCode} ${applyPattern(nationalNumber, format.pattern)}`;\r\n}\r\n\r\n/**\r\n * Format to E.164 format\r\n */\r\nfunction formatE164(nationalNumber: string, format: { dialCode: string }): string {\r\n return `${format.dialCode}${nationalNumber}`;\r\n}\r\n\r\n/**\r\n * Apply formatting pattern to number\r\n */\r\nfunction applyPattern(number: string, pattern: string): string {\r\n let result = '';\r\n let numberIndex = 0;\r\n\r\n for (const char of pattern) {\r\n if (char === 'X') {\r\n if (numberIndex < number.length) {\r\n result += number[numberIndex];\r\n numberIndex++;\r\n }\r\n } else {\r\n result += char;\r\n }\r\n }\r\n\r\n // Add remaining digits\r\n if (numberIndex < number.length) {\r\n result += number.slice(numberIndex);\r\n }\r\n\r\n return result.trim();\r\n}\r\n\r\n/**\r\n * Create empty result helper\r\n */\r\nfunction createEmptyResult(errors: IValidationError[]): PhoneValidationResult {\r\n return {\r\n isValid: false,\r\n errors,\r\n countryCode: '',\r\n nationalNumber: '',\r\n formatted: {\r\n national: '',\r\n international: '',\r\n e164: '',\r\n },\r\n type: 'unknown',\r\n };\r\n}\r\n\r\n/**\r\n * Get dialing code for a country\r\n *\r\n * @param countryCode - ISO country code\r\n * @returns Dialing code or null\r\n * @since 1.0.0\r\n */\r\nexport function getDialingCode(countryCode: string): string | null {\r\n const format = getPhoneFormat(countryCode);\r\n return format?.dialCode || null;\r\n}\r\n\r\n/**\r\n * Parse phone number and extract components\r\n *\r\n * @param phone - Phone number\r\n * @returns Parsed components\r\n * @since 1.0.0\r\n */\r\nexport function parsePhone(phone: string): {\r\n countryCode: string;\r\n dialCode: string;\r\n nationalNumber: string;\r\n isValid: boolean;\r\n} {\r\n const result = validatePhone(phone);\r\n return {\r\n countryCode: result.countryCode,\r\n dialCode: getDialingCode(result.countryCode) || '',\r\n nationalNumber: result.nationalNumber,\r\n isValid: result.isValid,\r\n };\r\n}\r\n","import type { UsernameOptions, UsernameValidationResult, IValidationError } from '../types';\r\nimport { RESERVED_USERNAMES } from '../utils/constants';\r\n\r\n/**\r\n * Default allowed username pattern\r\n * Alphanumeric, underscore, hyphen, period\r\n */\r\nconst DEFAULT_USERNAME_PATTERN = /^[a-zA-Z0-9_\\-.]+$/;\r\n\r\n/**\r\n * Default username validation options\r\n */\r\nconst DEFAULT_OPTIONS: UsernameOptions = {\r\n minLength: 3,\r\n maxLength: 30,\r\n allowedChars: DEFAULT_USERNAME_PATTERN,\r\n reserved: [],\r\n allowEmail: false,\r\n};\r\n\r\n/**\r\n * Validate a username\r\n *\r\n * @param username - Username to validate\r\n * @param options - Validation options\r\n * @returns Validation result\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = validateUsername('john_doe');\r\n * if (result.isValid) {\r\n * console.log('Username is valid');\r\n * }\r\n * ```\r\n */\r\nexport function validateUsername(\r\n username: string,\r\n options: UsernameOptions = {}\r\n): UsernameValidationResult {\r\n const opts = { ...DEFAULT_OPTIONS, ...options };\r\n const errors: IValidationError[] = [];\r\n\r\n // Trim and lowercase\r\n const sanitized = username?.trim().toLowerCase() ?? '';\r\n\r\n // Required check\r\n if (!username || !sanitized) {\r\n errors.push({\r\n field: 'username',\r\n code: 'REQUIRED',\r\n message: opts.messages?.required || 'Username is required',\r\n });\r\n return { isValid: false, errors, sanitized: '', isReserved: false };\r\n }\r\n\r\n // Check if it's an email (unless allowed)\r\n if (!opts.allowEmail && sanitized.includes('@')) {\r\n errors.push({\r\n field: 'username',\r\n code: 'EMAIL_NOT_ALLOWED',\r\n message: opts.messages?.emailNotAllowed || 'Email addresses are not allowed as usernames',\r\n });\r\n }\r\n\r\n // Length validation\r\n if (sanitized.length < (opts.minLength ?? 3)) {\r\n errors.push({\r\n field: 'username',\r\n code: 'TOO_SHORT',\r\n message: opts.messages?.tooShort || `Username must be at least ${opts.minLength} characters`,\r\n });\r\n }\r\n\r\n if (sanitized.length > (opts.maxLength ?? 30)) {\r\n errors.push({\r\n field: 'username',\r\n code: 'TOO_LONG',\r\n message: opts.messages?.tooLong || `Username must not exceed ${opts.maxLength} characters`,\r\n });\r\n }\r\n\r\n // Character validation\r\n const charPattern = opts.allowedChars ?? DEFAULT_USERNAME_PATTERN;\r\n if (!charPattern.test(sanitized)) {\r\n errors.push({\r\n field: 'username',\r\n code: 'INVALID_CHARACTERS',\r\n message:\r\n opts.messages?.invalidChars ||\r\n 'Username can only contain letters, numbers, underscores, hyphens, and periods',\r\n });\r\n }\r\n\r\n // Cannot start or end with special characters\r\n if (/^[_\\-.]|[_\\-.]$/.test(sanitized)) {\r\n errors.push({\r\n field: 'username',\r\n code: 'INVALID_START_END',\r\n message:\r\n opts.messages?.invalidStartEnd ||\r\n 'Username cannot start or end with special characters',\r\n });\r\n }\r\n\r\n // Cannot have consecutive special characters\r\n if (/[_\\-.]{2,}/.test(sanitized)) {\r\n errors.push({\r\n field: 'username',\r\n code: 'CONSECUTIVE_SPECIAL',\r\n message:\r\n opts.messages?.consecutiveSpecial ||\r\n 'Username cannot have consecutive special characters',\r\n });\r\n }\r\n\r\n // Check reserved usernames\r\n const allReserved = new Set([...RESERVED_USERNAMES, ...(opts.reserved ?? [])]);\r\n const isReserved = allReserved.has(sanitized);\r\n\r\n if (isReserved) {\r\n errors.push({\r\n field: 'username',\r\n code: 'RESERVED',\r\n message: opts.messages?.reserved || 'This username is reserved',\r\n });\r\n }\r\n\r\n return {\r\n isValid: errors.length === 0,\r\n errors,\r\n sanitized,\r\n isReserved,\r\n };\r\n}\r\n\r\n/**\r\n * Simple username validation\r\n *\r\n * @param username - Username to validate\r\n * @returns true if username is valid\r\n */\r\nexport function isValidUsername(username: string): boolean {\r\n if (!username || typeof username !== 'string') return false;\r\n const trimmed = username.trim().toLowerCase();\r\n\r\n return (\r\n trimmed.length >= 3 &&\r\n trimmed.length <= 30 &&\r\n DEFAULT_USERNAME_PATTERN.test(trimmed) &&\r\n !/^[_\\-.]|[_\\-.]$/.test(trimmed) &&\r\n !/[_\\-.]{2,}/.test(trimmed) &&\r\n !RESERVED_USERNAMES.has(trimmed)\r\n );\r\n}\r\n\r\n/**\r\n * Check if username is reserved\r\n *\r\n * @param username - Username to check\r\n * @param additionalReserved - Additional reserved usernames\r\n * @returns true if username is reserved\r\n */\r\nexport function isReservedUsername(username: string, additionalReserved: string[] = []): boolean {\r\n if (!username || typeof username !== 'string') return false;\r\n const normalized = username.trim().toLowerCase();\r\n const allReserved = new Set([...RESERVED_USERNAMES, ...additionalReserved]);\r\n return allReserved.has(normalized);\r\n}\r\n\r\n/**\r\n * Sanitize username\r\n *\r\n * @param username - Username to sanitize\r\n * @returns Sanitized username\r\n */\r\nexport function sanitizeUsername(username: string): string {\r\n if (!username || typeof username !== 'string') return '';\r\n\r\n return (\r\n username\r\n .trim()\r\n .toLowerCase()\r\n // Replace spaces with underscores\r\n .replace(/\\s+/g, '_')\r\n // Remove invalid characters\r\n .replace(/[^a-z0-9_\\-.]/g, '')\r\n // Remove consecutive special characters\r\n .replace(/[_\\-.]+/g, match => match[0])\r\n // Remove leading/trailing special characters\r\n .replace(/^[_\\-.]|[_\\-.]$/g, '')\r\n );\r\n}\r\n\r\n/**\r\n * Generate username suggestions based on input\r\n *\r\n * @param base - Base string (e.g., name or email)\r\n * @param count - Number of suggestions\r\n * @returns Array of username suggestions\r\n */\r\nexport function suggestUsernames(base: string, count: number = 5): string[] {\r\n if (!base || typeof base !== 'string') return [];\r\n\r\n // Extract base from email if provided\r\n let baseUsername = base.includes('@') ? base.split('@')[0] : base;\r\n\r\n // Sanitize\r\n baseUsername = sanitizeUsername(baseUsername);\r\n\r\n if (!baseUsername) return [];\r\n\r\n const suggestions: string[] = [baseUsername];\r\n\r\n // Add number suffixes\r\n for (let i = 1; suggestions.length < count; i++) {\r\n suggestions.push(`${baseUsername}${i}`);\r\n }\r\n\r\n // Add random suffixes\r\n const randomSuffix = Math.floor(Math.random() * 1000);\r\n suggestions.push(`${baseUsername}_${randomSuffix}`);\r\n\r\n return suggestions.slice(0, count);\r\n}\r\n","import type { IValidationError } from '../types';\r\n\r\n/**\r\n * URL validation options\r\n */\r\nexport interface UrlOptions {\r\n /** Require HTTPS (default: false) */\r\n requireHttps?: boolean;\r\n /** Allow localhost (default: true) */\r\n allowLocalhost?: boolean;\r\n /** Allow IP addresses (default: true) */\r\n allowIpAddress?: boolean;\r\n /** Allowed protocols (default: ['http:', 'https:']) */\r\n allowedProtocols?: string[];\r\n /** Blocked domains */\r\n blockedDomains?: string[];\r\n /** Require specific TLDs */\r\n allowedTlds?: string[];\r\n /** Custom error messages */\r\n messages?: {\r\n required?: string;\r\n invalidFormat?: string;\r\n invalidProtocol?: string;\r\n blockedDomain?: string;\r\n invalidTld?: string;\r\n };\r\n}\r\n\r\n/**\r\n * URL validation result\r\n */\r\nexport interface UrlValidationResult {\r\n /** Whether URL is valid */\r\n isValid: boolean;\r\n /** Validation errors */\r\n errors: IValidationError[];\r\n /** Parsed URL components */\r\n parsed?: {\r\n protocol: string;\r\n hostname: string;\r\n port: string;\r\n pathname: string;\r\n search: string;\r\n hash: string;\r\n };\r\n /** Normalized URL */\r\n normalized: string;\r\n}\r\n\r\n/**\r\n * Default URL validation options\r\n */\r\nconst DEFAULT_OPTIONS: UrlOptions = {\r\n requireHttps: false,\r\n allowLocalhost: true,\r\n allowIpAddress: true,\r\n allowedProtocols: ['http:', 'https:'],\r\n};\r\n\r\n/**\r\n * IPv4 regex pattern\r\n */\r\nconst IPV4_REGEX = /^(\\d{1,3}\\.){3}\\d{1,3}$/;\r\n\r\n/**\r\n * IPv6 simplified pattern (brackets for URLs)\r\n */\r\nconst IPV6_REGEX = /^\\[[\\da-fA-F:]+\\]$/;\r\n\r\n/**\r\n * Validate a URL\r\n *\r\n * @param url - URL to validate\r\n * @param options - Validation options\r\n * @returns Validation result\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = validateUrl('https://example.com/path');\r\n * if (result.isValid) {\r\n * console.log('Valid URL:', result.normalized);\r\n * }\r\n * ```\r\n */\r\nexport function validateUrl(url: string, options: UrlOptions = {}): UrlValidationResult {\r\n const opts = { ...DEFAULT_OPTIONS, ...options };\r\n const errors: IValidationError[] = [];\r\n\r\n // Length check\r\n if (url && url.length > 4096) {\r\n errors.push({\r\n field: 'url',\r\n code: 'INVALID_LENGTH',\r\n message: 'URL is too long',\r\n });\r\n return createEmptyResult(errors);\r\n }\r\n\r\n // Trim input\r\n const trimmed = url?.trim() ?? '';\r\n\r\n // Empty check\r\n if (!trimmed) {\r\n errors.push({\r\n field: 'url',\r\n code: 'REQUIRED',\r\n message: opts.messages?.required || 'URL is required',\r\n });\r\n return createEmptyResult(errors);\r\n }\r\n\r\n // Try to parse URL\r\n let parsed: URL;\r\n try {\r\n parsed = new URL(trimmed);\r\n } catch {\r\n errors.push({\r\n field: 'url',\r\n code: 'INVALID_FORMAT',\r\n message: opts.messages?.invalidFormat || 'URL format is invalid',\r\n });\r\n return createEmptyResult(errors);\r\n }\r\n\r\n // Check protocol\r\n const allowedProtocols = opts.allowedProtocols || ['http:', 'https:'];\r\n if (!allowedProtocols.includes(parsed.protocol)) {\r\n errors.push({\r\n field: 'url',\r\n code: 'INVALID_PROTOCOL',\r\n message: opts.messages?.invalidProtocol ||\r\n `Protocol must be one of: ${allowedProtocols.join(', ')}`,\r\n });\r\n }\r\n\r\n // Check HTTPS requirement\r\n if (opts.requireHttps && parsed.protocol !== 'https:') {\r\n errors.push({\r\n field: 'url',\r\n code: 'HTTPS_REQUIRED',\r\n message: 'HTTPS is required',\r\n });\r\n }\r\n\r\n // Check localhost\r\n const isLocalhost = parsed.hostname === 'localhost' ||\r\n parsed.hostname === '127.0.0.1' ||\r\n parsed.hostname === '::1' ||\r\n parsed.hostname === '[::1]';\r\n if (!opts.allowLocalhost && isLocalhost) {\r\n errors.push({\r\n field: 'url',\r\n code: 'LOCALHOST_NOT_ALLOWED',\r\n message: 'Localhost URLs are not allowed',\r\n });\r\n }\r\n\r\n // Check IP addresses\r\n const isIpAddress = IPV4_REGEX.test(parsed.hostname) || IPV6_REGEX.test(parsed.hostname);\r\n if (!opts.allowIpAddress && isIpAddress && !isLocalhost) {\r\n errors.push({\r\n field: 'url',\r\n code: 'IP_ADDRESS_NOT_ALLOWED',\r\n message: 'IP address URLs are not allowed',\r\n });\r\n }\r\n\r\n // Check blocked domains\r\n if (opts.blockedDomains?.includes(parsed.hostname.toLowerCase())) {\r\n errors.push({\r\n field: 'url',\r\n code: 'BLOCKED_DOMAIN',\r\n message: opts.messages?.blockedDomain || 'This domain is not allowed',\r\n });\r\n }\r\n\r\n // Check TLDs\r\n if (opts.allowedTlds && opts.allowedTlds.length > 0 && !isIpAddress && !isLocalhost) {\r\n const parts = parsed.hostname.split('.');\r\n const tld = parts[parts.length - 1]?.toLowerCase();\r\n if (tld && !opts.allowedTlds.includes(tld)) {\r\n errors.push({\r\n field: 'url',\r\n code: 'INVALID_TLD',\r\n message: opts.messages?.invalidTld ||\r\n `TLD must be one of: ${opts.allowedTlds.join(', ')}`,\r\n });\r\n }\r\n }\r\n\r\n return {\r\n isValid: errors.length === 0,\r\n errors,\r\n parsed: {\r\n protocol: parsed.protocol,\r\n hostname: parsed.hostname,\r\n port: parsed.port,\r\n pathname: parsed.pathname,\r\n search: parsed.search,\r\n hash: parsed.hash,\r\n },\r\n normalized: parsed.href,\r\n };\r\n}\r\n\r\n/**\r\n * Simple URL format validation\r\n *\r\n * @param url - URL to validate\r\n * @returns true if URL format is valid\r\n */\r\nexport function isValidUrl(url: string): boolean {\r\n if (!url || typeof url !== 'string') return false;\r\n try {\r\n const parsed = new URL(url.trim());\r\n return ['http:', 'https:'].includes(parsed.protocol);\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Check if URL is HTTPS\r\n *\r\n * @param url - URL to check\r\n * @returns true if URL uses HTTPS\r\n */\r\nexport function isHttpsUrl(url: string): boolean {\r\n if (!url || typeof url !== 'string') return false;\r\n try {\r\n const parsed = new URL(url.trim());\r\n return parsed.protocol === 'https:';\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Extract domain from URL\r\n *\r\n * @param url - URL to extract from\r\n * @returns Domain/hostname or empty string\r\n */\r\nexport function getUrlDomain(url: string): string {\r\n if (!url || typeof url !== 'string') return '';\r\n try {\r\n const parsed = new URL(url.trim());\r\n return parsed.hostname;\r\n } catch {\r\n return '';\r\n }\r\n}\r\n\r\n/**\r\n * Normalize URL (lowercase host, remove trailing slash, etc.)\r\n *\r\n * @param url - URL to normalize\r\n * @returns Normalized URL or empty string\r\n */\r\nexport function normalizeUrl(url: string): string {\r\n if (!url || typeof url !== 'string') return '';\r\n try {\r\n const parsed = new URL(url.trim());\r\n // Remove trailing slash from pathname (unless it's just /)\r\n if (parsed.pathname !== '/' && parsed.pathname.endsWith('/')) {\r\n parsed.pathname = parsed.pathname.slice(0, -1);\r\n }\r\n return parsed.href;\r\n } catch {\r\n return '';\r\n }\r\n}\r\n\r\n/**\r\n * Check if URL is a data URL\r\n *\r\n * @param url - URL to check\r\n * @returns true if data URL\r\n */\r\nexport function isDataUrl(url: string): boolean {\r\n if (!url || typeof url !== 'string') return false;\r\n return url.trim().toLowerCase().startsWith('data:');\r\n}\r\n\r\n/**\r\n * Check if URL contains potentially dangerous schemes\r\n *\r\n * @param url - URL to check\r\n * @returns true if dangerous\r\n */\r\nexport function isDangerousUrl(url: string): boolean {\r\n if (!url || typeof url !== 'string') return false;\r\n const dangerous = ['javascript:', 'vbscript:', 'data:'];\r\n const trimmed = url.trim().toLowerCase();\r\n return dangerous.some(scheme => trimmed.startsWith(scheme));\r\n}\r\n\r\n/**\r\n * Create empty result helper\r\n */\r\nfunction createEmptyResult(errors: IValidationError[]): UrlValidationResult {\r\n return {\r\n isValid: false,\r\n errors,\r\n normalized: '',\r\n };\r\n}\r\n","import type { IValidationError } from '../types';\r\n\r\n/**\r\n * Credit card validation options\r\n */\r\nexport interface CreditCardOptions {\r\n /** Check Luhn algorithm (default: true) */\r\n checkLuhn?: boolean;\r\n /** Allowed card types */\r\n allowedTypes?: CardType[];\r\n /** Custom error messages */\r\n messages?: {\r\n required?: string;\r\n invalidFormat?: string;\r\n invalidLuhn?: string;\r\n typeNotAllowed?: string;\r\n };\r\n}\r\n\r\n/**\r\n * Credit card validation result\r\n */\r\nexport interface CreditCardValidationResult {\r\n /** Whether card number is valid */\r\n isValid: boolean;\r\n /** Validation errors */\r\n errors: IValidationError[];\r\n /** Detected card type */\r\n cardType: CardType | null;\r\n /** Masked card number (last 4 digits visible) */\r\n masked: string;\r\n /** Cleaned card number (digits only) */\r\n cleaned: string;\r\n}\r\n\r\n/**\r\n * Supported card types\r\n */\r\nexport type CardType =\r\n | 'visa'\r\n | 'mastercard'\r\n | 'amex'\r\n | 'discover'\r\n | 'diners'\r\n | 'jcb'\r\n | 'unionpay'\r\n | 'maestro'\r\n | 'unknown';\r\n\r\n/**\r\n * Card type detection patterns\r\n */\r\nconst CARD_PATTERNS: Record<CardType, RegExp> = {\r\n visa: /^4[0-9]{12}(?:[0-9]{3})?$/,\r\n mastercard: /^5[1-5][0-9]{14}$|^2(?:2(?:2[1-9]|[3-9][0-9])|[3-6][0-9][0-9]|7(?:[01][0-9]|20))[0-9]{12}$/,\r\n amex: /^3[47][0-9]{13}$/,\r\n discover: /^6(?:011|5[0-9]{2})[0-9]{12}$/,\r\n diners: /^3(?:0[0-5]|[68][0-9])[0-9]{11}$/,\r\n jcb: /^(?:2131|1800|35\\d{3})\\d{11}$/,\r\n unionpay: /^62[0-9]{14,17}$/,\r\n maestro: /^(?:5[06789]|6)[0-9]{10,17}$/,\r\n unknown: /^[0-9]{13,19}$/,\r\n};\r\n\r\n/**\r\n * Card type prefixes for early detection\r\n */\r\nconst CARD_PREFIXES: Record<string, CardType> = {\r\n '4': 'visa',\r\n '34': 'amex',\r\n '37': 'amex',\r\n '51': 'mastercard',\r\n '52': 'mastercard',\r\n '53': 'mastercard',\r\n '54': 'mastercard',\r\n '55': 'mastercard',\r\n '22': 'mastercard',\r\n '23': 'mastercard',\r\n '24': 'mastercard',\r\n '25': 'mastercard',\r\n '26': 'mastercard',\r\n '27': 'mastercard',\r\n '6011': 'discover',\r\n '65': 'discover',\r\n '30': 'diners',\r\n '36': 'diners',\r\n '38': 'diners',\r\n '35': 'jcb',\r\n '62': 'unionpay',\r\n};\r\n\r\n/**\r\n * Default options\r\n */\r\nconst DEFAULT_OPTIONS: CreditCardOptions = {\r\n checkLuhn: true,\r\n};\r\n\r\n/**\r\n * Validate a credit card number\r\n *\r\n * @param cardNumber - Credit card number to validate\r\n * @param options - Validation options\r\n * @returns Validation result\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = validateCreditCard('4111111111111111');\r\n * if (result.isValid) {\r\n * console.log('Card type:', result.cardType); // 'visa'\r\n * }\r\n * ```\r\n */\r\nexport function validateCreditCard(\r\n cardNumber: string,\r\n options: CreditCardOptions = {}\r\n): CreditCardValidationResult {\r\n const opts = { ...DEFAULT_OPTIONS, ...options };\r\n const errors: IValidationError[] = [];\r\n\r\n // Length check\r\n if (cardNumber && cardNumber.length > 50) {\r\n errors.push({\r\n field: 'creditCard',\r\n code: 'INVALID_LENGTH',\r\n message: 'Credit card number is too long',\r\n });\r\n return createEmptyResult(errors);\r\n }\r\n\r\n // Clean the card number (remove spaces, dashes)\r\n const cleaned = cleanCardNumber(cardNumber);\r\n\r\n // Empty check\r\n if (!cardNumber || !cleaned) {\r\n errors.push({\r\n field: 'creditCard',\r\n code: 'REQUIRED',\r\n message: opts.messages?.required || 'Credit card number is required',\r\n });\r\n return createEmptyResult(errors);\r\n }\r\n\r\n // Format check (only digits, 13-19 characters)\r\n if (!/^[0-9]{13,19}$/.test(cleaned)) {\r\n errors.push({\r\n field: 'creditCard',\r\n code: 'INVALID_FORMAT',\r\n message: opts.messages?.invalidFormat || 'Credit card number format is invalid',\r\n });\r\n return createEmptyResult(errors, cleaned);\r\n }\r\n\r\n // Detect card type\r\n const cardType = detectCardType(cleaned);\r\n\r\n // Check Luhn algorithm\r\n if (opts.checkLuhn && !luhnCheck(cleaned)) {\r\n errors.push({\r\n field: 'creditCard',\r\n code: 'INVALID_LUHN',\r\n message: opts.messages?.invalidLuhn || 'Credit card number is invalid',\r\n });\r\n }\r\n\r\n // Check allowed types\r\n if (opts.allowedTypes && opts.allowedTypes.length > 0) {\r\n if (!opts.allowedTypes.includes(cardType)) {\r\n errors.push({\r\n field: 'creditCard',\r\n code: 'TYPE_NOT_ALLOWED',\r\n message: opts.messages?.typeNotAllowed ||\r\n `Card type '${cardType}' is not allowed`,\r\n });\r\n }\r\n }\r\n\r\n return {\r\n isValid: errors.length === 0,\r\n errors,\r\n cardType,\r\n masked: maskCardNumber(cleaned),\r\n cleaned,\r\n };\r\n}\r\n\r\n/**\r\n * Simple credit card validation\r\n *\r\n * @param cardNumber - Card number to validate\r\n * @returns true if valid\r\n */\r\nexport function isValidCreditCard(cardNumber: string): boolean {\r\n if (!cardNumber || typeof cardNumber !== 'string') return false;\r\n const cleaned = cleanCardNumber(cardNumber);\r\n return /^[0-9]{13,19}$/.test(cleaned) && luhnCheck(cleaned);\r\n}\r\n\r\n/**\r\n * Detect credit card type from number\r\n *\r\n * @param cardNumber - Card number\r\n * @returns Detected card type\r\n */\r\nexport function detectCardType(cardNumber: string): CardType {\r\n const cleaned = cleanCardNumber(cardNumber);\r\n\r\n // Check full patterns\r\n for (const [type, pattern] of Object.entries(CARD_PATTERNS)) {\r\n if (type !== 'unknown' && pattern.test(cleaned)) {\r\n return type as CardType;\r\n }\r\n }\r\n\r\n return 'unknown';\r\n}\r\n\r\n/**\r\n * Get card type from prefix (for real-time typing)\r\n *\r\n * @param cardNumber - Partial card number\r\n * @returns Detected card type or null\r\n */\r\nexport function getCardTypeFromPrefix(cardNumber: string): CardType | null {\r\n const cleaned = cleanCardNumber(cardNumber);\r\n if (cleaned.length < 1) return null;\r\n\r\n // Check prefixes from longest to shortest\r\n const prefixes = Object.keys(CARD_PREFIXES).sort((a, b) => b.length - a.length);\r\n\r\n for (const prefix of prefixes) {\r\n if (cleaned.startsWith(prefix)) {\r\n return CARD_PREFIXES[prefix];\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Luhn algorithm check (mod 10)\r\n *\r\n * @param cardNumber - Card number (digits only)\r\n * @returns true if passes Luhn check\r\n */\r\nexport function luhnCheck(cardNumber: string): boolean {\r\n const cleaned = cleanCardNumber(cardNumber);\r\n if (!cleaned || cleaned.length < 13) return false;\r\n\r\n let sum = 0;\r\n let isEven = false;\r\n\r\n for (let i = cleaned.length - 1; i >= 0; i--) {\r\n let digit = parseInt(cleaned[i], 10);\r\n\r\n if (isEven) {\r\n digit *= 2;\r\n if (digit > 9) {\r\n digit -= 9;\r\n }\r\n }\r\n\r\n sum += digit;\r\n isEven = !isEven;\r\n }\r\n\r\n return sum % 10 === 0;\r\n}\r\n\r\n/**\r\n * Mask credit card number (show last 4 digits)\r\n *\r\n * @param cardNumber - Card number to mask\r\n * @param maskChar - Character to use for masking (default: '*')\r\n * @returns Masked card number\r\n */\r\nexport function maskCardNumber(cardNumber: string, maskChar: string = '*'): string {\r\n const cleaned = cleanCardNumber(cardNumber);\r\n if (cleaned.length < 4) return cleaned;\r\n\r\n const lastFour = cleaned.slice(-4);\r\n const masked = maskChar.repeat(cleaned.length - 4);\r\n return masked + lastFour;\r\n}\r\n\r\n/**\r\n * Format credit card number with spaces\r\n *\r\n * @param cardNumber - Card number to format\r\n * @returns Formatted card number\r\n */\r\nexport function formatCardNumber(cardNumber: string): string {\r\n const cleaned = cleanCardNumber(cardNumber);\r\n const type = detectCardType(cleaned);\r\n\r\n // Amex uses 4-6-5 grouping\r\n if (type === 'amex') {\r\n return cleaned.replace(/(\\d{4})(\\d{6})(\\d{5})/, '$1 $2 $3').trim();\r\n }\r\n\r\n // Most cards use 4-4-4-4 grouping\r\n return cleaned.replace(/(\\d{4})(?=\\d)/g, '$1 ').trim();\r\n}\r\n\r\n/**\r\n * Validate CVV/CVC\r\n *\r\n * @param cvv - CVV code\r\n * @param cardType - Card type (amex has 4-digit CVV)\r\n * @returns true if valid\r\n */\r\nexport function isValidCVV(cvv: string, cardType?: CardType): boolean {\r\n if (!cvv || typeof cvv !== 'string') return false;\r\n const cleaned = cvv.replace(/\\D/g, '');\r\n\r\n // Amex uses 4-digit CVV\r\n if (cardType === 'amex') {\r\n return /^\\d{4}$/.test(cleaned);\r\n }\r\n\r\n // Most cards use 3-digit CVV\r\n return /^\\d{3,4}$/.test(cleaned);\r\n}\r\n\r\n/**\r\n * Validate expiry date\r\n *\r\n * @param month - Expiry month (1-12 or '01'-'12')\r\n * @param year - Expiry year (2-digit or 4-digit)\r\n * @returns true if not expired\r\n */\r\nexport function isValidExpiry(month: string | number, year: string | number): boolean {\r\n const m = typeof month === 'string' ? parseInt(month, 10) : month;\r\n let y = typeof year === 'string' ? parseInt(year, 10) : year;\r\n\r\n // Handle 2-digit year\r\n if (y < 100) {\r\n y += 2000;\r\n }\r\n\r\n // Validate month\r\n if (isNaN(m) || m < 1 || m > 12) return false;\r\n\r\n // Validate year\r\n if (isNaN(y) || y < 2000) return false;\r\n\r\n // Check if not expired\r\n const now = new Date();\r\n const expiry = new Date(y, m, 0); // Last day of expiry month\r\n\r\n return expiry >= now;\r\n}\r\n\r\n/**\r\n * Clean card number (remove non-digits)\r\n */\r\nfunction cleanCardNumber(cardNumber: string): string {\r\n if (!cardNumber || typeof cardNumber !== 'string') return '';\r\n return cardNumber.replace(/\\D/g, '');\r\n}\r\n\r\n/**\r\n * Create empty result helper\r\n */\r\nfunction createEmptyResult(\r\n errors: IValidationError[],\r\n cleaned: string = ''\r\n): CreditCardValidationResult {\r\n return {\r\n isValid: false,\r\n errors,\r\n cardType: null,\r\n masked: '',\r\n cleaned,\r\n };\r\n}\r\n","import type { IValidationError } from '../types';\r\n\r\n/**\r\n * IP validation options\r\n */\r\nexport interface IpOptions {\r\n /** Version to validate (default: both) */\r\n version?: 4 | 6 | 'both';\r\n /** Allow CIDR notation (default: false) */\r\n allowCidr?: boolean;\r\n /** Allow private/local IPs (default: true) */\r\n allowPrivate?: boolean;\r\n /** Custom error messages */\r\n messages?: {\r\n required?: string;\r\n invalidFormat?: string;\r\n versionNotAllowed?: string;\r\n privateNotAllowed?: string;\r\n };\r\n}\r\n\r\n/**\r\n * IP validation result\r\n */\r\nexport interface IpValidationResult {\r\n /** Whether IP is valid */\r\n isValid: boolean;\r\n /** Validation errors */\r\n errors: IValidationError[];\r\n /** IP version (4 or 6) */\r\n version: 4 | 6 | null;\r\n /** Whether IP is private/local */\r\n isPrivate: boolean;\r\n /** Whether IP is loopback */\r\n isLoopback: boolean;\r\n /** CIDR prefix if present */\r\n cidr: number | null;\r\n /** Normalized IP */\r\n normalized: string;\r\n}\r\n\r\n/**\r\n * IPv4 regex pattern\r\n */\r\nconst IPV4_REGEX = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\r\n\r\n/**\r\n * IPv4 with CIDR\r\n */\r\nconst IPV4_CIDR_REGEX = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\/([0-9]|[12][0-9]|3[0-2])$/;\r\n\r\n/**\r\n * IPv6 regex pattern (simplified)\r\n */\r\nconst IPV6_REGEX = /^(?:(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,7}:|(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,5}(?::[0-9a-fA-F]{1,4}){1,2}|(?:[0-9a-fA-F]{1,4}:){1,4}(?::[0-9a-fA-F]{1,4}){1,3}|(?:[0-9a-fA-F]{1,4}:){1,3}(?::[0-9a-fA-F]{1,4}){1,4}|(?:[0-9a-fA-F]{1,4}:){1,2}(?::[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:(?::[0-9a-fA-F]{1,4}){1,6}|:(?::[0-9a-fA-F]{1,4}){1,7}|::(?:[fF]{4}:)?(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|(?:[0-9a-fA-F]{1,4}:){1,4}:(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))$/;\r\n\r\n/**\r\n * IPv6 with CIDR\r\n */\r\nconst IPV6_CIDR_REGEX = /^(.+)\\/([0-9]|[1-9][0-9]|1[01][0-9]|12[0-8])$/;\r\n\r\n/**\r\n * Private IPv4 ranges\r\n */\r\nconst PRIVATE_IPV4_RANGES = [\r\n /^10\\./, // 10.0.0.0/8\r\n /^172\\.(1[6-9]|2[0-9]|3[01])\\./, // 172.16.0.0/12\r\n /^192\\.168\\./, // 192.168.0.0/16\r\n /^169\\.254\\./, // Link-local 169.254.0.0/16\r\n];\r\n\r\n/**\r\n * Default options\r\n */\r\nconst DEFAULT_OPTIONS: IpOptions = {\r\n version: 'both',\r\n allowCidr: false,\r\n allowPrivate: true,\r\n};\r\n\r\n/**\r\n * Validate an IP address\r\n *\r\n * @param ip - IP address to validate\r\n * @param options - Validation options\r\n * @returns Validation result\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = validateIp('192.168.1.1');\r\n * if (result.isValid) {\r\n * console.log('IP version:', result.version); // 4\r\n * console.log('Is private:', result.isPrivate); // true\r\n * }\r\n * ```\r\n */\r\nexport function validateIp(ip: string, options: IpOptions = {}): IpValidationResult {\r\n const opts = { ...DEFAULT_OPTIONS, ...options };\r\n const errors: IValidationError[] = [];\r\n\r\n // Trim input\r\n const trimmed = ip?.trim() ?? '';\r\n\r\n // Empty check\r\n if (!ip || !trimmed) {\r\n errors.push({\r\n field: 'ip',\r\n code: 'REQUIRED',\r\n message: opts.messages?.required || 'IP address is required',\r\n });\r\n return createEmptyResult(errors);\r\n }\r\n\r\n // Check for CIDR notation\r\n let ipPart = trimmed;\r\n let cidr: number | null = null;\r\n\r\n if (trimmed.includes('/')) {\r\n if (!opts.allowCidr) {\r\n errors.push({\r\n field: 'ip',\r\n code: 'CIDR_NOT_ALLOWED',\r\n message: 'CIDR notation is not allowed',\r\n });\r\n }\r\n const parts = trimmed.split('/');\r\n ipPart = parts[0];\r\n cidr = parseInt(parts[1], 10);\r\n }\r\n\r\n // Detect version and validate\r\n let version: 4 | 6 | null = null;\r\n let isValid = false;\r\n\r\n if (IPV4_REGEX.test(ipPart)) {\r\n version = 4;\r\n isValid = true;\r\n if (cidr !== null && (cidr < 0 || cidr > 32)) {\r\n errors.push({\r\n field: 'ip',\r\n code: 'INVALID_CIDR',\r\n message: 'CIDR prefix must be 0-32 for IPv4',\r\n });\r\n }\r\n } else if (IPV6_REGEX.test(ipPart)) {\r\n version = 6;\r\n isValid = true;\r\n if (cidr !== null && (cidr < 0 || cidr > 128)) {\r\n errors.push({\r\n field: 'ip',\r\n code: 'INVALID_CIDR',\r\n message: 'CIDR prefix must be 0-128 for IPv6',\r\n });\r\n }\r\n }\r\n\r\n if (!isValid) {\r\n errors.push({\r\n field: 'ip',\r\n code: 'INVALID_FORMAT',\r\n message: opts.messages?.invalidFormat || 'IP address format is invalid',\r\n });\r\n return createEmptyResult(errors, trimmed);\r\n }\r\n\r\n // Check version restriction\r\n if (opts.version !== 'both' && version !== opts.version) {\r\n errors.push({\r\n field: 'ip',\r\n code: 'VERSION_NOT_ALLOWED',\r\n message: opts.messages?.versionNotAllowed ||\r\n `IPv${version} is not allowed, expected IPv${opts.version}`,\r\n });\r\n }\r\n\r\n // Check private IP (convert null to undefined for type compatibility)\r\n const isPrivate = isPrivateIp(ipPart, version ?? undefined);\r\n const isLoopback = isLoopbackIp(ipPart, version ?? undefined);\r\n\r\n if (!opts.allowPrivate && (isPrivate || isLoopback)) {\r\n errors.push({\r\n field: 'ip',\r\n code: 'PRIVATE_NOT_ALLOWED',\r\n message: opts.messages?.privateNotAllowed ||\r\n 'Private/local IP addresses are not allowed',\r\n });\r\n }\r\n\r\n return {\r\n isValid: errors.length === 0,\r\n errors,\r\n version,\r\n isPrivate,\r\n isLoopback,\r\n cidr,\r\n normalized: trimmed.toLowerCase(),\r\n };\r\n}\r\n\r\n/**\r\n * Simple IPv4 validation\r\n *\r\n * @param ip - IP address to validate\r\n * @returns true if valid IPv4\r\n */\r\nexport function isValidIPv4(ip: string): boolean {\r\n if (!ip || typeof ip !== 'string') return false;\r\n return IPV4_REGEX.test(ip.trim());\r\n}\r\n\r\n/**\r\n * Simple IPv6 validation\r\n *\r\n * @param ip - IP address to validate\r\n * @returns true if valid IPv6\r\n */\r\nexport function isValidIPv6(ip: string): boolean {\r\n if (!ip || typeof ip !== 'string') return false;\r\n return IPV6_REGEX.test(ip.trim());\r\n}\r\n\r\n/**\r\n * Check if IP is valid (v4 or v6)\r\n *\r\n * @param ip - IP address to validate\r\n * @returns true if valid\r\n */\r\nexport function isValidIP(ip: string): boolean {\r\n return isValidIPv4(ip) || isValidIPv6(ip);\r\n}\r\n\r\n/**\r\n * Check if IP is private\r\n *\r\n * @param ip - IP address to check\r\n * @param version - IP version (auto-detect if not provided)\r\n * @returns true if private\r\n */\r\nexport function isPrivateIp(ip: string, version?: 4 | 6): boolean {\r\n if (!ip) return false;\r\n\r\n const v = version ?? (isValidIPv4(ip) ? 4 : isValidIPv6(ip) ? 6 : undefined);\r\n\r\n if (v === 4) {\r\n return PRIVATE_IPV4_RANGES.some(range => range.test(ip));\r\n }\r\n\r\n if (v === 6) {\r\n const lower = ip.toLowerCase();\r\n // fc00::/7 (Unique Local Addresses)\r\n return lower.startsWith('fc') || lower.startsWith('fd') ||\r\n // fe80::/10 (Link-local)\r\n lower.startsWith('fe80');\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Check if IP is loopback\r\n *\r\n * @param ip - IP address to check\r\n * @param version - IP version\r\n * @returns true if loopback\r\n */\r\nexport function isLoopbackIp(ip: string, version?: 4 | 6): boolean {\r\n if (!ip) return false;\r\n\r\n const v = version ?? (isValidIPv4(ip) ? 4 : isValidIPv6(ip) ? 6 : undefined);\r\n\r\n if (v === 4) {\r\n return ip.startsWith('127.');\r\n }\r\n\r\n if (v === 6) {\r\n const lower = ip.toLowerCase();\r\n return lower === '::1' || lower === '0000:0000:0000:0000:0000:0000:0000:0001';\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Get IP version\r\n *\r\n * @param ip - IP address\r\n * @returns 4, 6, or null\r\n */\r\nexport function getIpVersion(ip: string): 4 | 6 | null {\r\n if (isValidIPv4(ip)) return 4;\r\n if (isValidIPv6(ip)) return 6;\r\n return null;\r\n}\r\n\r\n/**\r\n * Validate CIDR notation\r\n *\r\n * @param cidr - CIDR string (e.g., \"192.168.1.0/24\")\r\n * @returns true if valid CIDR\r\n */\r\nexport function isValidCidr(cidr: string): boolean {\r\n if (!cidr || typeof cidr !== 'string') return false;\r\n\r\n if (IPV4_CIDR_REGEX.test(cidr)) return true;\r\n\r\n const match = cidr.match(IPV6_CIDR_REGEX);\r\n if (match) {\r\n return IPV6_REGEX.test(match[1]) && parseInt(match[2], 10) <= 128;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Create empty result helper\r\n */\r\nfunction createEmptyResult(\r\n errors: IValidationError[],\r\n normalized: string = ''\r\n): IpValidationResult {\r\n return {\r\n isValid: false,\r\n errors,\r\n version: null,\r\n isPrivate: false,\r\n isLoopback: false,\r\n cidr: null,\r\n normalized,\r\n };\r\n}\r\n","/**\r\n * Financial validation module\r\n * Includes IBAN and VAT validation\r\n *\r\n * @packageDocumentation\r\n * @since 1.0.0\r\n */\r\n\r\nimport { IValidationError } from '../types';\r\n\r\n/**\r\n * IBAN validation options\r\n */\r\nexport interface IbanOptions {\r\n /** Custom error messages */\r\n messages?: {\r\n invalidFormat?: string;\r\n invalidLength?: string;\r\n invalidChecksum?: string;\r\n };\r\n}\r\n\r\n/**\r\n * VAT validation options\r\n */\r\nexport interface VatOptions {\r\n /** Country code (e.g. 'GB', 'DE') */\r\n countryCode?: string;\r\n}\r\n\r\n/**\r\n * Validate International Bank Account Number (IBAN)\r\n * Supports all SEPA and SWIFT IBAN formats\r\n *\r\n * @param iban - IBAN string\r\n * @param options - Validation options\r\n * @returns Validation result\r\n */\r\nexport function validateIBAN(iban: string, options: IbanOptions = {}): { isValid: boolean; errors: IValidationError[] } {\r\n if (!iban || typeof iban !== 'string') {\r\n return { isValid: false, errors: [{ field: 'iban', code: 'REQUIRED', message: 'IBAN is required' }] };\r\n }\r\n\r\n const cleanIban = iban.replace(/[\\s]+/g, '').toUpperCase();\r\n const errors: IValidationError[] = [];\r\n\r\n // Length check for security\r\n if (iban.length > 50) {\r\n errors.push({\r\n field: 'iban',\r\n code: 'INVALID_LENGTH',\r\n message: 'IBAN is too long',\r\n });\r\n return { isValid: false, errors };\r\n }\r\n\r\n // Basic format check\r\n if (!/^[A-Z]{2}[0-9]{2}[A-Z0-9]{1,30}$/.test(cleanIban)) {\r\n errors.push({\r\n field: 'iban',\r\n code: 'INVALID_FORMAT',\r\n message: options.messages?.invalidFormat || 'Invalid IBAN format',\r\n });\r\n return { isValid: false, errors };\r\n }\r\n\r\n // Country-specific length checks (simplified list)\r\n const lengths: Record<string, number> = {\r\n AL: 28, AD: 24, AT: 20, AZ: 28, BH: 22, BE: 16, BA: 20, BR: 29, BG: 22, CR: 21,\r\n HR: 21, CY: 28, CZ: 24, DK: 18, DO: 28, EE: 20, FO: 18, FI: 18, FR: 27, GE: 22,\r\n DE: 22, GI: 23, GR: 27, GL: 18, GT: 28, HU: 28, IS: 26, IE: 22, IL: 23, IT: 27,\r\n JO: 30, KZ: 20, KW: 30, LV: 21, LB: 28, LI: 21, LT: 20, LU: 20, MK: 19, MT: 31,\r\n MR: 27, MU: 30, MC: 27, MD: 24, ME: 22, NL: 18, NO: 15, PK: 24, PS: 29, PL: 28,\r\n PT: 25, QA: 29, RO: 24, LC: 32, SM: 27, ST: 25, SA: 24, RS: 22, SC: 31, SK: 24,\r\n SI: 19, ES: 24, SE: 24, CH: 21, TN: 24, TR: 26, AE: 23, GB: 22, VG: 24,\r\n };\r\n\r\n const countryCode = cleanIban.substring(0, 2);\r\n const expectedLength = lengths[countryCode];\r\n\r\n if (expectedLength && cleanIban.length !== expectedLength) {\r\n errors.push({\r\n field: 'iban',\r\n code: 'INVALID_LENGTH',\r\n message: options.messages?.invalidLength || `IBAN for ${countryCode} must be ${expectedLength} characters`,\r\n });\r\n return { isValid: false, errors };\r\n }\r\n\r\n // MOD 97 Check\r\n const rearranged = cleanIban.substring(4) + cleanIban.substring(0, 4);\r\n const numeric = rearranged.replace(/[A-Z]/g, char => (char.charCodeAt(0) - 55).toString());\r\n\r\n if (mod97(numeric) !== 1) {\r\n errors.push({\r\n field: 'iban',\r\n code: 'INVALID_CHECKSUM',\r\n message: options.messages?.invalidChecksum || 'Invalid IBAN checksum',\r\n });\r\n return { isValid: false, errors };\r\n }\r\n\r\n return { isValid: true, errors: [] };\r\n}\r\n\r\n/**\r\n * Validate VAT number (Simplified regex-based check)\r\n *\r\n * @param vat - VAT number\r\n * @param options - Validation options\r\n * @returns Validation result\r\n */\r\nexport function validateVAT(vat: string, options: VatOptions = {}): { isValid: boolean; errors: IValidationError[] } {\r\n if (!vat || typeof vat !== 'string') {\r\n return { isValid: false, errors: [{ field: 'vat', code: 'REQUIRED', message: 'VAT number is required' }] };\r\n }\r\n\r\n const cleanVat = vat.replace(/[\\s.-]+/g, '').toUpperCase();\r\n const errors: IValidationError[] = [];\r\n\r\n // Length check\r\n if (vat.length > 50) {\r\n errors.push({\r\n field: 'vat',\r\n code: 'INVALID_LENGTH',\r\n message: 'VAT number is too long',\r\n });\r\n return { isValid: false, errors };\r\n }\r\n\r\n // Common EU VAT regex validation\r\n // Format: CC + 2-13 alphanumerics (CC = country code)\r\n if (!/^[A-Z]{2}[A-Z0-9]{2,13}$/.test(cleanVat)) {\r\n errors.push({\r\n field: 'vat',\r\n code: 'INVALID_FORMAT',\r\n message: 'Invalid VAT number format',\r\n });\r\n return { isValid: false, errors };\r\n }\r\n\r\n if (options.countryCode) {\r\n const providedCode = options.countryCode.toUpperCase();\r\n if (!cleanVat.startsWith(providedCode)) {\r\n errors.push({\r\n field: 'vat',\r\n code: 'INVALID_COUNTRY',\r\n message: `VAT number must start with ${providedCode}`,\r\n });\r\n return { isValid: false, errors };\r\n }\r\n }\r\n\r\n // NOTE: Full algorithmic validation for all EU countries is complex.\r\n // This provides a baseline format check.\r\n\r\n return { isValid: true, errors: [] };\r\n}\r\n\r\n/**\r\n * Large integer modulo 97 calculation\r\n */\r\nfunction mod97(numericString: string): number {\r\n let remainder = 0;\r\n for (let i = 0; i < numericString.length; i += 7) {\r\n const chunk = (remainder ? remainder.toString() : '') + numericString.substring(i, i + 7);\r\n remainder = parseInt(chunk, 10) % 97;\r\n }\r\n return remainder;\r\n}\r\n"]}