deepbox 0.1.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 (173) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +344 -0
  3. package/dist/CSRMatrix-CwGwQRea.d.cts +219 -0
  4. package/dist/CSRMatrix-KzNt6QpS.d.ts +219 -0
  5. package/dist/Tensor-BQLk1ltW.d.cts +147 -0
  6. package/dist/Tensor-g8mUClel.d.ts +147 -0
  7. package/dist/chunk-4S73VUBD.js +677 -0
  8. package/dist/chunk-4S73VUBD.js.map +1 -0
  9. package/dist/chunk-5R4S63PF.js +2925 -0
  10. package/dist/chunk-5R4S63PF.js.map +1 -0
  11. package/dist/chunk-6AE5FKKQ.cjs +9264 -0
  12. package/dist/chunk-6AE5FKKQ.cjs.map +1 -0
  13. package/dist/chunk-AD436M45.js +3854 -0
  14. package/dist/chunk-AD436M45.js.map +1 -0
  15. package/dist/chunk-ALS7ETWZ.cjs +4263 -0
  16. package/dist/chunk-ALS7ETWZ.cjs.map +1 -0
  17. package/dist/chunk-AU7XHGKJ.js +2092 -0
  18. package/dist/chunk-AU7XHGKJ.js.map +1 -0
  19. package/dist/chunk-B5TNKUEY.js +1481 -0
  20. package/dist/chunk-B5TNKUEY.js.map +1 -0
  21. package/dist/chunk-BCR7G3A6.js +9136 -0
  22. package/dist/chunk-BCR7G3A6.js.map +1 -0
  23. package/dist/chunk-C4PKXY74.cjs +1917 -0
  24. package/dist/chunk-C4PKXY74.cjs.map +1 -0
  25. package/dist/chunk-DWZY6PIP.cjs +6400 -0
  26. package/dist/chunk-DWZY6PIP.cjs.map +1 -0
  27. package/dist/chunk-E3EU5FZO.cjs +2113 -0
  28. package/dist/chunk-E3EU5FZO.cjs.map +1 -0
  29. package/dist/chunk-F3JWBINJ.js +1054 -0
  30. package/dist/chunk-F3JWBINJ.js.map +1 -0
  31. package/dist/chunk-FJYLIGJX.js +1940 -0
  32. package/dist/chunk-FJYLIGJX.js.map +1 -0
  33. package/dist/chunk-JSCDE774.cjs +729 -0
  34. package/dist/chunk-JSCDE774.cjs.map +1 -0
  35. package/dist/chunk-LWECRCW2.cjs +2412 -0
  36. package/dist/chunk-LWECRCW2.cjs.map +1 -0
  37. package/dist/chunk-MLBMYKCG.js +6379 -0
  38. package/dist/chunk-MLBMYKCG.js.map +1 -0
  39. package/dist/chunk-OX6QXFMV.cjs +3874 -0
  40. package/dist/chunk-OX6QXFMV.cjs.map +1 -0
  41. package/dist/chunk-PHV2DKRS.cjs +1072 -0
  42. package/dist/chunk-PHV2DKRS.cjs.map +1 -0
  43. package/dist/chunk-PL7TAYKI.js +4056 -0
  44. package/dist/chunk-PL7TAYKI.js.map +1 -0
  45. package/dist/chunk-PR647I7R.js +1898 -0
  46. package/dist/chunk-PR647I7R.js.map +1 -0
  47. package/dist/chunk-QERHVCHC.cjs +2960 -0
  48. package/dist/chunk-QERHVCHC.cjs.map +1 -0
  49. package/dist/chunk-XEG44RF6.cjs +1514 -0
  50. package/dist/chunk-XEG44RF6.cjs.map +1 -0
  51. package/dist/chunk-XMWVME2W.js +2377 -0
  52. package/dist/chunk-XMWVME2W.js.map +1 -0
  53. package/dist/chunk-ZB75FESB.cjs +1979 -0
  54. package/dist/chunk-ZB75FESB.cjs.map +1 -0
  55. package/dist/chunk-ZLW62TJG.cjs +4061 -0
  56. package/dist/chunk-ZLW62TJG.cjs.map +1 -0
  57. package/dist/chunk-ZXKBDFP3.js +4235 -0
  58. package/dist/chunk-ZXKBDFP3.js.map +1 -0
  59. package/dist/core/index.cjs +204 -0
  60. package/dist/core/index.cjs.map +1 -0
  61. package/dist/core/index.d.cts +2 -0
  62. package/dist/core/index.d.ts +2 -0
  63. package/dist/core/index.js +3 -0
  64. package/dist/core/index.js.map +1 -0
  65. package/dist/dataframe/index.cjs +22 -0
  66. package/dist/dataframe/index.cjs.map +1 -0
  67. package/dist/dataframe/index.d.cts +3 -0
  68. package/dist/dataframe/index.d.ts +3 -0
  69. package/dist/dataframe/index.js +5 -0
  70. package/dist/dataframe/index.js.map +1 -0
  71. package/dist/datasets/index.cjs +134 -0
  72. package/dist/datasets/index.cjs.map +1 -0
  73. package/dist/datasets/index.d.cts +3 -0
  74. package/dist/datasets/index.d.ts +3 -0
  75. package/dist/datasets/index.js +5 -0
  76. package/dist/datasets/index.js.map +1 -0
  77. package/dist/index-74AB8Cyh.d.cts +1126 -0
  78. package/dist/index-9oQx1HgV.d.cts +1180 -0
  79. package/dist/index-BJY2SI4i.d.ts +483 -0
  80. package/dist/index-BWGhrDlr.d.ts +733 -0
  81. package/dist/index-B_DK4FKY.d.cts +242 -0
  82. package/dist/index-BbA2Gxfl.d.ts +456 -0
  83. package/dist/index-BgHYAoSS.d.cts +837 -0
  84. package/dist/index-BndMbqsM.d.ts +1439 -0
  85. package/dist/index-C1mfVYoo.d.ts +2517 -0
  86. package/dist/index-CCvlwAmL.d.cts +809 -0
  87. package/dist/index-CDw5CnOU.d.ts +785 -0
  88. package/dist/index-Cn3SdB0O.d.ts +1126 -0
  89. package/dist/index-CrqLlS-a.d.ts +776 -0
  90. package/dist/index-D61yaSMY.d.cts +483 -0
  91. package/dist/index-D9Loo1_A.d.cts +2517 -0
  92. package/dist/index-DIT_OO9C.d.cts +785 -0
  93. package/dist/index-DIp_RrRt.d.ts +242 -0
  94. package/dist/index-DbultU6X.d.cts +1427 -0
  95. package/dist/index-DmEg_LCm.d.cts +776 -0
  96. package/dist/index-DoPWVxPo.d.cts +1439 -0
  97. package/dist/index-DuCxd-8d.d.ts +837 -0
  98. package/dist/index-Dx42TZaY.d.ts +809 -0
  99. package/dist/index-DyZ4QQf5.d.cts +456 -0
  100. package/dist/index-GFAVyOWO.d.ts +1427 -0
  101. package/dist/index-WHQLn0e8.d.cts +733 -0
  102. package/dist/index-ZtI1Iy4L.d.ts +1180 -0
  103. package/dist/index-eJgeni9c.d.cts +1911 -0
  104. package/dist/index-tk4lSYod.d.ts +1911 -0
  105. package/dist/index.cjs +72 -0
  106. package/dist/index.cjs.map +1 -0
  107. package/dist/index.d.cts +17 -0
  108. package/dist/index.d.ts +17 -0
  109. package/dist/index.js +15 -0
  110. package/dist/index.js.map +1 -0
  111. package/dist/linalg/index.cjs +86 -0
  112. package/dist/linalg/index.cjs.map +1 -0
  113. package/dist/linalg/index.d.cts +3 -0
  114. package/dist/linalg/index.d.ts +3 -0
  115. package/dist/linalg/index.js +5 -0
  116. package/dist/linalg/index.js.map +1 -0
  117. package/dist/metrics/index.cjs +158 -0
  118. package/dist/metrics/index.cjs.map +1 -0
  119. package/dist/metrics/index.d.cts +3 -0
  120. package/dist/metrics/index.d.ts +3 -0
  121. package/dist/metrics/index.js +5 -0
  122. package/dist/metrics/index.js.map +1 -0
  123. package/dist/ml/index.cjs +87 -0
  124. package/dist/ml/index.cjs.map +1 -0
  125. package/dist/ml/index.d.cts +3 -0
  126. package/dist/ml/index.d.ts +3 -0
  127. package/dist/ml/index.js +6 -0
  128. package/dist/ml/index.js.map +1 -0
  129. package/dist/ndarray/index.cjs +501 -0
  130. package/dist/ndarray/index.cjs.map +1 -0
  131. package/dist/ndarray/index.d.cts +5 -0
  132. package/dist/ndarray/index.d.ts +5 -0
  133. package/dist/ndarray/index.js +4 -0
  134. package/dist/ndarray/index.js.map +1 -0
  135. package/dist/nn/index.cjs +142 -0
  136. package/dist/nn/index.cjs.map +1 -0
  137. package/dist/nn/index.d.cts +6 -0
  138. package/dist/nn/index.d.ts +6 -0
  139. package/dist/nn/index.js +5 -0
  140. package/dist/nn/index.js.map +1 -0
  141. package/dist/optim/index.cjs +77 -0
  142. package/dist/optim/index.cjs.map +1 -0
  143. package/dist/optim/index.d.cts +4 -0
  144. package/dist/optim/index.d.ts +4 -0
  145. package/dist/optim/index.js +4 -0
  146. package/dist/optim/index.js.map +1 -0
  147. package/dist/plot/index.cjs +114 -0
  148. package/dist/plot/index.cjs.map +1 -0
  149. package/dist/plot/index.d.cts +6 -0
  150. package/dist/plot/index.d.ts +6 -0
  151. package/dist/plot/index.js +5 -0
  152. package/dist/plot/index.js.map +1 -0
  153. package/dist/preprocess/index.cjs +82 -0
  154. package/dist/preprocess/index.cjs.map +1 -0
  155. package/dist/preprocess/index.d.cts +4 -0
  156. package/dist/preprocess/index.d.ts +4 -0
  157. package/dist/preprocess/index.js +5 -0
  158. package/dist/preprocess/index.js.map +1 -0
  159. package/dist/random/index.cjs +74 -0
  160. package/dist/random/index.cjs.map +1 -0
  161. package/dist/random/index.d.cts +3 -0
  162. package/dist/random/index.d.ts +3 -0
  163. package/dist/random/index.js +5 -0
  164. package/dist/random/index.js.map +1 -0
  165. package/dist/stats/index.cjs +142 -0
  166. package/dist/stats/index.cjs.map +1 -0
  167. package/dist/stats/index.d.cts +3 -0
  168. package/dist/stats/index.d.ts +3 -0
  169. package/dist/stats/index.js +5 -0
  170. package/dist/stats/index.js.map +1 -0
  171. package/dist/tensor-B96jjJLQ.d.cts +205 -0
  172. package/dist/tensor-B96jjJLQ.d.ts +205 -0
  173. package/package.json +226 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ndarray/index.ts","../src/ndarray/tensor/strides.ts","../src/ndarray/tensor/Tensor.ts","../src/ndarray/tensor/shape.ts","../src/ndarray/linalg/index.ts","../src/ndarray/ops/_internal.ts","../src/ndarray/ops/activation.ts","../src/ndarray/ops/broadcast.ts","../src/ndarray/ops/arithmetic.ts","../src/ndarray/ops/comparison.ts","../src/ndarray/ops/conv.ts","../src/ndarray/ops/math.ts","../src/ndarray/ops/random.ts","../src/ndarray/ops/reduction.ts","../src/ndarray/ops/trigonometry.ts","../src/ndarray/tensor/creation.ts","../src/ndarray/tensor/indexing.ts","../src/ndarray/autograd/index.ts","../src/ndarray/ops/logical.ts","../src/ndarray/ops/manipulation.ts","../src/ndarray/ops/sorting.ts","../src/ndarray/sparse/CSRMatrix.ts","../src/ndarray/tensor/shapeOps.ts"],"names":["im2col","logSoftmax","softmax","variance","data","sum","result","scalarShape","max","min","Ctor","out","diff","aLogicalStrides","bLogicalStrides","aContiguous","bContiguous","INT64_MIN","INT64_MAX","acc","outShape","outShapeArr","outSize","OutCtor","ax","axisDim","numericData","minVal","maxVal","outData","outStrides","stride","inStrides","ensureNumericDType","inferred","dtype","numericDtype","shape","sign","startRaw","endRaw","start","end","tData","ensureNumericTensor","ones","grad","outTensor","tensor","stringOut","bigIntOut","numericOut","stringSrc","numericSrc","slice","isStringTensor","isNumericTensor"],"mappings":";;;AAAA,IAAA,eAAA,GAAA;AAAA,QAAA,CAAA,eAAA,EAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,WAAA,EAAA,MAAA,OAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAA,UAAA,EAAA,MAAAA,OAAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,cAAA,EAAA,MAAAC,WAAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,WAAA,EAAA,MAAAC,QAAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,YAAA,EAAA,MAAAC,SAAAA;AAAA,EAAA,KAAA,EAAA,MAAA;AAAA,CAAA,CAAA;;;ACEO,SAAS,YAAA,CAAa,OAAc,OAAA,EAAqC;AAC9E,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,OAAA,CAAQ,MAAA,EAAQ,OAAO,KAAA;AAE5C,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,KAAA,IAAS,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC1C,IAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,KAAM,QAAA,EAAU,OAAO,KAAA;AACpC,IAAA,QAAA,IAAY,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,mBAAA,CACd,IAAA,EACA,cAAA,EACA,OAAA,EACA,MAAA,EACQ;AACR,EAAA,IAAI,GAAA,GAAM,IAAA;AACV,EAAA,IAAI,GAAA,GAAM,MAAA;AACV,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,cAAA,CAAe,QAAQ,IAAA,EAAA,EAAQ;AACvD,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,IAAI,CAAA,IAAK,CAAA;AACvC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,MAAM,CAAA;AACrC,IAAA,GAAA,IAAO,KAAA,GAAQ,MAAA;AACf,IAAA,GAAA,IAAO,KAAA,IAAS,OAAA,CAAQ,IAAI,CAAA,IAAK,CAAA,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,GAAA;AACT;;;ACRA,SAAS,oBAAA,CAAqB,MAAkB,KAAA,EAAuB;AACrE,EAAA,IAAI,KAAA,KAAU,UAAU,OAAO,KAAA;AAC/B,EAAA,IAAI,KAAA,KAAU,SAAA,EAAW,OAAO,IAAA,YAAgB,YAAA;AAChD,EAAA,IAAI,KAAA,KAAU,SAAA,EAAW,OAAO,IAAA,YAAgB,YAAA;AAChD,EAAA,IAAI,KAAA,KAAU,OAAA,EAAS,OAAO,IAAA,YAAgB,UAAA;AAC9C,EAAA,IAAI,KAAA,KAAU,OAAA,EAAS,OAAO,IAAA,YAAgB,aAAA;AAC9C,EAAA,IAAI,KAAA,KAAU,OAAA,IAAW,KAAA,KAAU,MAAA,SAAe,IAAA,YAAgB,UAAA;AAClE,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,wBAAA,CAAyB,MAAkB,KAAA,EAAoB;AACtE,EAAA,IAAI,CAAC,oBAAA,CAAqB,IAAA,EAAM,KAAK,CAAA,EAAG;AACtC,IAAA,MAAM,IAAI,UAAA;AAAA,MACR,CAAA,WAAA,EAAc,IAAA,CAAK,WAAA,CAAY,IAAI,yBAAyB,KAAK,CAAA,mDAAA;AAAA,KAEnE;AAAA,EACF;AACF;AAEA,SAAS,eAAA,CACP,KAAA,EACA,OAAA,EACA,MAAA,EACA,UAAA,EACM;AACN,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,KAAA,CAAM,MAAA,EAAQ;AACnC,IAAA,MAAM,IAAI,UAAA;AAAA,MACR,CAAA,eAAA,EAAkB,OAAA,CAAQ,MAAM,CAAA,6BAAA,EAAgC,MAAM,MAAM,CAAA;AAAA,KAC9E;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,CAAA,oCAAA,EAAuC,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA;AAAA,QACrD,SAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,CAAA,8BAAA,EAAiC,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA;AAAA,QAC/C,SAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,MAAM,IAAI,qBAAA,CAAsB,CAAA,8BAAA,EAAiC,MAAM,CAAA,CAAA,EAAI,UAAU,MAAM,CAAA;AAAA,EAC7F;AAEA,EAAA,IAAI,WAAA,CAAY,KAAK,CAAA,KAAM,CAAA,EAAG;AAC5B,IAAA,IAAI,SAAS,UAAA,EAAY;AACvB,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,OAAA,EAAU,MAAM,CAAA,oCAAA,EAAuC,UAAU,CAAA,CAAE,CAAA;AAAA,IAC1F;AACA,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,SAAA,GAAY,MAAA;AAChB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AACxB,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAC7B,IAAA,IAAI,MAAM,CAAA,EAAG;AACX,MAAA,SAAA,IAAA,CAAc,MAAM,CAAA,IAAK,MAAA;AAAA,IAC3B;AAAA,EACF;AAEA,EAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,IAAA,MAAM,IAAI,UAAA;AAAA,MACR,eAAe,UAAU,CAAA,yBAAA,EAA4B,KAAK,CAAA,gBAAA,EAAmB,OAAO,gBAAgB,MAAM,CAAA;AAAA,KAC5G;AAAA,EACF;AACF;AAmBO,SAAS,eAAe,KAAA,EAAiC;AAC9D,EAAA,MAAM,OAAA,GAAU,IAAI,KAAA,CAAc,KAAA,CAAM,MAAM,CAAA;AAC9C,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,IAAS,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC1C,IAAA,OAAA,CAAQ,CAAC,CAAA,GAAI,MAAA;AACb,IAAA,MAAA,IAAU,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAAA,EACxB;AACA,EAAA,OAAO,OAAA;AACT;AAUO,SAAS,cAAc,GAAA,EAAuC;AACnE,EAAA,OAAO,GAAA,YAAe,aAAA;AACxB;AA8BO,IAAM,MAAA,GAAN,MAAM,OAAA,CAAqF;AAAA,EACvF,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EAED,YAAY,IAAA,EAOjB;AACD,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AACpB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AAEnB,IAAA,IAAA,CAAK,IAAA,GAAO,KAAK,KAAA,CAAM,MAAA;AACvB,IAAA,IAAA,CAAK,IAAA,GAAO,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA;AAAA,EACpC;AAAA,EAEQ,cAAA,GAA8C;AACpD,IAAA,OAAO,KAAK,KAAA,KAAU,QAAA;AAAA,EACxB;AAAA,EAEQ,eAAA,GAA+D;AACrE,IAAA,OAAO,KAAK,KAAA,KAAU,QAAA;AAAA,EACxB;AAAA,EAEA,OAAO,eAAoE,IAAA,EAO1D;AACf,IAAA,aAAA,CAAc,KAAK,KAAK,CAAA;AACxB,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,IAAU,CAAA;AAC9B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,cAAA,CAAe,KAAK,KAAK,CAAA;AACzD,IAAA,wBAAA,CAAyB,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,KAAK,CAAA;AAC9C,IAAA,eAAA,CAAgB,KAAK,KAAA,EAAO,OAAA,EAAS,MAAA,EAAQ,IAAA,CAAK,KAAK,MAAM,CAAA;AAE7D,IAAA,OAAO,IAAI,OAAA,CAAa;AAAA,MACtB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEA,OAAO,gBAAiC,IAAA,EAMhB;AACtB,IAAA,aAAA,CAAc,KAAK,KAAK,CAAA;AACxB,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,IAAU,CAAA;AAC9B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,cAAA,CAAe,KAAK,KAAK,CAAA;AACzD,IAAA,eAAA,CAAgB,KAAK,KAAA,EAAO,OAAA,EAAS,MAAA,EAAQ,IAAA,CAAK,KAAK,MAAM,CAAA;AAE7D,IAAA,OAAO,IAAI,OAAA,CAAO;AAAA,MAChB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,KAAA,EAAO,QAAA;AAAA,MACP,MAAA,EAAQ,KAAK,MAAA,IAAU,KAAA;AAAA,MACvB,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAUA,OAAO,KAAA,CACL,KAAA,EACA,IAAA,EACkB;AAClB,IAAA,aAAA,CAAc,KAAK,CAAA;AACnB,IAAA,MAAM,IAAA,GAAO,YAAY,KAAK,CAAA;AAC9B,IAAA,IAAI,IAAA,CAAK,UAAU,QAAA,EAAU;AAC3B,MAAA,MAAMC,KAAAA,GAAO,IAAI,KAAA,CAAc,IAAI,CAAA;AACnC,MAAAA,KAAAA,CAAK,KAAK,EAAE,CAAA;AACZ,MAAA,OAAO,QAAO,eAAA,CAAgB;AAAA,QAC5B,IAAA,EAAAA,KAAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAQ,IAAA,CAAK;AAAA,OACd,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,IAAA,CAAK,KAAK,CAAA;AAC7C,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,IAAI,CAAA;AAC1B,IAAA,OAAO,QAAO,cAAA,CAAe;AAAA,MAC3B,IAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA,EAyBA,IAAA,CACE,KAAA,EACA,OAAA,EACA,MAAA,GAAS,KAAK,MAAA,EACK;AACnB,IAAA,aAAA,CAAc,KAAK,CAAA;AACnB,IAAA,IAAI,WAAA,CAAY,KAAK,CAAA,KAAM,IAAA,CAAK,IAAA,EAAM;AACpC,MAAA,MAAM,UAAA,CAAW,QAAA,CAAS,CAAC,IAAA,CAAK,IAAI,CAAA,EAAG,CAAC,WAAA,CAAY,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA;AAAA,IACrE;AACA,IAAA,IAAI,IAAA,CAAK,gBAAe,EAAG;AAEzB,MAAA,OAAO,QAAO,eAAA,CAAgB;AAAA,QAC5B,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,KAAA;AAAA,QACA,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,MAAA;AAAA,QACA,OAAA,EAAS,OAAA,IAAW,cAAA,CAAe,KAAK;AAAA,OACzC,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,EAAgB,EAAG;AAC3B,MAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,IAC7D;AAEA,IAAA,OAAO,QAAO,cAAA,CAAe;AAAA,MAC3B,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,KAAA;AAAA,MACA,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,MAAA;AAAA,MACA,OAAA,EAAS,OAAA,IAAW,cAAA,CAAe,KAAK;AAAA,KACzC,CAAA;AAAA,EACH;AAAA,EAoCA,QAA0B,QAAA,EAAiC;AACzD,IAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,IAAA,MAAM,OAAA,GAAU,YAAY,QAAQ,CAAA;AACpC,IAAA,IAAI,OAAA,KAAY,KAAK,IAAA,EAAM;AACzB,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,8BAAA,EAAiC,KAAK,IAAI,CAAA,WAAA,EAAc,QAAQ,CAAA,CAAA,CAAG,CAAA;AAAA,IAC1F;AACA,IAAA,IAAI,CAAC,YAAA,CAAa,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA,EAAG;AAC3C,MAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,IAC7D;AAEA,IAAA,IAAI,IAAA,CAAK,gBAAe,EAAG;AAEzB,MAAA,OAAO,QAAO,eAAA,CAAgB;AAAA,QAC5B,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,KAAA,EAAO,QAAA;AAAA,QACP,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,OAAA,EAAS,eAAe,QAAQ;AAAA,OACjC,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,EAAgB,EAAG;AAC3B,MAAA,MAAM,IAAI,WAAW,yCAAyC,CAAA;AAAA,IAChE;AAEA,IAAA,OAAO,QAAO,cAAA,CAAe;AAAA,MAC3B,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,KAAA,EAAO,QAAA;AAAA,MACP,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAA,EAAS,eAAe,QAAQ;AAAA,KACjC,CAAA;AAAA,EACH;AAAA,EAmBA,OAAA,GAAmC;AACjC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAC,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,OAAA,EAA4B;AAChC,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,IAAA,CAAK,IAAA,EAAM;AAChC,MAAA,MAAM,IAAI,UAAA;AAAA,QACR,CAAA,SAAA,EAAY,KAAK,IAAI,CAAA,eAAA,EAAkB,KAAK,IAAI,CAAA,mBAAA,EAAsB,QAAQ,MAAM,CAAA;AAAA,OACtF;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,IAAA,CAAK,MAAA;AAChB,IAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,IAAA,CAAK,MAAM,IAAA,EAAA,EAAQ;AAC3C,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,IAAK,CAAA;AAChC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,IAAK,CAAA;AACrC,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,CAAA;AAC7B,MAAA,MAAM,GAAA,GAAM,GAAA,GAAM,CAAA,GAAI,GAAA,GAAM,GAAA,GAAM,GAAA;AAElC,MAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,GAAG,CAAA,EAAG;AAC1B,QAAA,MAAM,IAAI,qBAAA;AAAA,UACR,CAAA,eAAA,EAAkB,IAAI,CAAA,8BAAA,EAAiC,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAAA,UAClE,WAAW,IAAI,CAAA,CAAA,CAAA;AAAA,UACf;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,GAAA,GAAM,CAAA,IAAK,GAAA,IAAO,GAAA,EAAK;AACzB,QAAA,MAAM,IAAI,UAAA,CAAW,CAAA,MAAA,EAAS,GAAG,CAAA,wCAAA,EAA2C,GAAG,CAAA,CAAE,CAAA;AAAA,MACnF;AAEA,MAAA,IAAA,IAAQ,GAAA,GAAM,MAAA;AAAA,IAChB;AAEA,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AACxB,IAAA,IAAI,MAAM,MAAA,EAAW;AACnB,MAAA,MAAM,IAAI,aAAa,sDAAsD,CAAA;AAAA,IAC/E;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEA,OAAA,GAAmB;AACjB,IAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,EAAc,UAAA,KAAgC;AAC3D,MAAA,IAAI,IAAA,KAAS,KAAK,IAAA,EAAM;AACtB,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA;AAC9B,QAAA,IAAI,MAAM,MAAA,EAAW;AACnB,UAAA,MAAM,IAAI,aAAa,sDAAsD,CAAA;AAAA,QAC/E;AACA,QAAA,OAAO,CAAA;AAAA,MACT;AAEA,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,IAAK,CAAA;AAChC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,IAAK,CAAA;AACrC,MAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAe,GAAG,CAAA;AAClC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,QAAA,GAAA,CAAI,CAAC,CAAA,GAAI,KAAA,CAAM,OAAO,CAAA,EAAG,UAAA,GAAa,IAAI,MAAM,CAAA;AAAA,MAClD;AACA,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,QAAA,CAAS,cAAc,CAAA,EAAW;AAChC,IAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAuB;AAC1C,MAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,EAAE,QAAA,EAAS;AAC7C,MAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AACzB,QAAA,IAAI,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,EAAM,OAAO,CAAA,CAAE,QAAA,EAAS;AACjE,QAAA,OAAO,CAAA,CAAE,YAAY,CAAC,CAAA;AAAA,MACxB;AACA,MAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,IAAA,CAAK,UAAU,CAAC,CAAA;AAClD,MAAA,OAAO,OAAO,CAAC,CAAA;AAAA,IACjB,CAAA;AAEA,IAAA,MAAM,WAAA,GAAc,CAAC,GAAA,EAAc,KAAA,KAA0B;AAC3D,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG,OAAO,YAAY,GAAG,CAAA;AAE/C,MAAA,MAAM,MAAM,GAAA,CAAI,MAAA;AAChB,MAAA,IAAI,GAAA,KAAQ,GAAG,OAAO,IAAA;AAEtB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,CAAC,CAAA;AACvC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AAEhC,MAAA,IAAI,KAAA;AACJ,MAAA,IAAI,OAAO,WAAA,EAAa;AACtB,QAAA,KAAA,GAAQ,GAAA,CAAI,IAAI,CAAC,EAAA,KAAO,YAAY,EAAA,EAAI,KAAA,GAAQ,CAAC,CAAC,CAAA;AAAA,MACpD,CAAA,MAAO;AACL,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,EAAA,KAAO,WAAA,CAAY,EAAA,EAAI,KAAA,GAAQ,CAAC,CAAC,CAAA;AACtE,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,GAAA,GAAM,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,EAAA,KAAO,WAAA,CAAY,EAAA,EAAI,KAAA,GAAQ,CAAC,CAAC,CAAA;AACzE,QAAA,KAAA,GAAQ,CAAC,GAAG,IAAA,EAAM,KAAA,EAAO,GAAG,IAAI,CAAA;AAAA,MAClC;AAEA,MAAA,IAAI,KAAA,KAAU,CAAA,IAAK,IAAA,CAAK,IAAA,KAAS,CAAA,EAAG;AAClC,QAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MAC7B;AACA,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG;AAC1B,QAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MAC7B;AACA,MAAA,OAAO,CAAA,CAAA,EAAI,MAAM,IAAA,CAAK;AAAA,EAAK,GAAG,EAAE,CAAC,CAAA,CAAA,CAAA;AAAA,IACnC,CAAA;AAGA,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAC/B,MAAA,OAAO,UAAU,WAAA,CAAY,CAAC,CAAC,CAAA,QAAA,EAAW,KAAK,KAAK,CAAA,CAAA,CAAA;AAAA,IACtD;AAEA,IAAA,MAAM,MAAA,GAAS,KAAK,OAAA,EAAQ;AAC5B,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,MAAA,EAAQ,CAAC,CAAA;AAClC,IAAA,OAAO,CAAA,OAAA,EAAU,IAAI,CAAA,QAAA,EAAW,IAAA,CAAK,KAAK,CAAA,CAAA,CAAA;AAAA,EAC5C;AACF;;;ACvhBA,SAAS,eAAe,CAAA,EAAyC;AAC/D,EAAA,OAAO,EAAE,KAAA,KAAU,QAAA;AACrB;AAEA,SAAS,gBAAgB,CAAA,EAA6C;AACpE,EAAA,OAAO,EAAE,KAAA,KAAU,QAAA;AACrB;AASO,SAAS,OAAA,CAAQ,GAAW,QAAA,EAAyB;AAC1D,EAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,EAAA,MAAM,OAAA,GAAU,YAAY,QAAQ,CAAA;AACpC,EAAA,IAAI,OAAA,KAAY,EAAE,IAAA,EAAM;AACtB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,8BAAA,EAAiC,EAAE,IAAI,CAAA,WAAA,EAAc,QAAQ,CAAA,CAAA,CAAG,CAAA;AAAA,EACvF;AACA,EAAA,IAAI,CAAC,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,OAAO,CAAA,EAAG;AACrC,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,cAAA,CAAe,CAAC,CAAA,EAAG;AACrB,IAAA,OAAO,OAAO,eAAA,CAAgB;AAAA,MAC5B,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,KAAA,EAAO,QAAA;AAAA,MACP,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,OAAA,EAAS,eAAe,QAAQ;AAAA,KACjC,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,CAAC,eAAA,CAAgB,CAAC,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,yCAAyC,CAAA;AAAA,EAChE;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,KAAA,EAAO,QAAA;AAAA,IACP,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,OAAA,EAAS,eAAe,QAAQ;AAAA,GACjC,CAAA;AACH;AAKO,SAAS,QAAQ,CAAA,EAAmB;AACzC,EAAA,OAAO,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA;AAC5B;AAwBO,SAAS,SAAA,CAAU,GAAW,IAAA,EAAkC;AACrE,EAAA,IAAI,OAAA;AAEJ,EAAA,IAAI,SAAS,MAAA,EAAW;AAItB,IAAA,OAAA,GAAU,EAAC;AACX,IAAA,KAAA,IAAS,IAAI,CAAA,CAAE,IAAA,GAAO,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACpC,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAA,MAAO;AACL,IAAA,OAAA,GAAU,CAAC,GAAG,IAAI,CAAA;AAGlB,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,CAAE,IAAA,EAAM;AAC7B,MAAA,MAAM,IAAI,WAAW,CAAA,sBAAA,EAAyB,CAAA,CAAE,IAAI,CAAA,MAAA,EAAS,OAAA,CAAQ,MAAM,CAAA,CAAE,CAAA;AAAA,IAC/E;AAEA,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,MAAA,MAAM,IAAA,GAAO,IAAA,GAAO,CAAA,GAAI,CAAA,CAAE,OAAO,IAAA,GAAO,IAAA;AACxC,MAAA,IAAI,IAAA,GAAO,CAAA,IAAK,IAAA,IAAQ,CAAA,CAAE,IAAA,EAAM;AAC9B,QAAA,MAAM,IAAI,qBAAA;AAAA,UACR,CAAA,KAAA,EAAQ,IAAI,CAAA,kBAAA,EAAqB,CAAA,CAAE,IAAI,CAAA,QAAA,CAAA;AAAA,UACvC,MAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AAClB,QAAA,MAAM,IAAI,qBAAA,CAAsB,CAAA,eAAA,EAAkB,IAAI,CAAA,CAAA,EAAI,QAAQ,IAAI,CAAA;AAAA,MACxE;AACA,MAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AACb,MAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,IACtB;AACA,IAAA,OAAA,GAAU,UAAA;AAAA,EACZ;AAGA,EAAA,MAAM,QAAA,GAAqB,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AACnD,EAAA,MAAM,UAAA,GAAuB,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AAErD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,IAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,CAAA;AACtB,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,MAAM,IAAI,WAAW,8BAA8B,CAAA;AAAA,IACrD;AACA,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,IAAI,CAAA;AACxB,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,OAAA,CAAQ,IAAI,CAAA;AAC7B,IAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,MAAA,KAAW,MAAA,EAAW;AAC7C,MAAA,MAAM,IAAI,WAAW,6CAA6C,CAAA;AAAA,IACpE;AACA,IAAA,QAAA,CAAS,CAAC,CAAA,GAAI,GAAA;AACd,IAAA,UAAA,CAAW,CAAC,CAAA,GAAI,MAAA;AAAA,EAClB;AAEA,EAAA,aAAA,CAAc,QAAQ,CAAA;AAEtB,EAAA,IAAI,cAAA,CAAe,CAAC,CAAA,EAAG;AACrB,IAAA,OAAO,OAAO,eAAA,CAAgB;AAAA,MAC5B,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,KAAA,EAAO,QAAA;AAAA,MACP,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,CAAC,eAAA,CAAgB,CAAC,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,2CAA2C,CAAA;AAAA,EAClE;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,KAAA,EAAO,QAAA;AAAA,IACP,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,OAAA,EAAS;AAAA,GACV,CAAA;AACH;;;AC/JA,IAAM,SAAA,GAAY,EAAE,EAAA,IAAM,GAAA,CAAA;AAC1B,IAAM,SAAA,GAAA,CAAa,MAAM,GAAA,IAAO,EAAA;AAEhC,SAAS,aAAa,KAAA,EAAuB;AAC3C,EAAA,OAAO,KAAA,KAAU,aAAa,KAAA,KAAU,SAAA;AAC1C;AAIA,SAAS,eAAA,CAAgB,GAAU,CAAA,EAAwB;AACzD,EAAA,IAAI,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,QAAA,EAAU;AACpC,IAAA,MAAM,IAAI,WAAW,qCAAqC,CAAA;AAAA,EAC5D;AACA,EAAA,IAAI,CAAA,KAAM,OAAA,IAAW,CAAA,KAAM,OAAA,EAAS;AAClC,IAAA,IAAI,MAAM,CAAA,EAAG;AACX,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,uCAAA,EAA0C,CAAC,CAAA,KAAA,EAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,IAC7E;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,YAAA,CAAa,CAAC,CAAA,IAAK,YAAA,CAAa,CAAC,CAAA,EAAG;AACtC,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAI,UAAA,CAAW,CAAA,uCAAA,EAA0C,CAAC,CAAA,KAAA,EAAQ,CAAC,CAAA,CAAE,CAAA;AAC7E;AAkBO,SAAS,GAAA,CAAI,GAAW,CAAA,EAAmB;AAChD,EAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,CAAA,CAAE,KAAA,EAAO,EAAE,KAAK,CAAA;AACjD,EAAA,MAAM,WAAW,QAAA,KAAa,OAAA;AAE9B,EAAA,IAAI,KAAA,CAAM,QAAQ,CAAA,CAAE,IAAI,KAAK,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA,EAAG;AAClD,IAAA,MAAM,IAAI,WAAW,qCAAqC,CAAA;AAAA,EAC5D;AACA,EAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,EAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAGhB,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,CAAA,IAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AAChC,IAAA,IAAI,EAAE,KAAA,CAAM,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,WAAW,CAAA,OAAA,EAAU,CAAA,CAAE,KAAK,CAAA,KAAA,EAAQ,CAAA,CAAE,KAAK,CAAA,YAAA,CAAc,CAAA;AAAA,IACrE;AACA,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAC3B,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAChC,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAChC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI,EAAE,KAAA,YAAiB,aAAA,CAAA,IAAkB,EAAE,iBAAiB,aAAA,CAAA,EAAgB;AAC1E,QAAA,MAAM,IAAI,WAAW,0BAA0B,CAAA;AAAA,MACjD;AACA,MAAA,MAAM,IAAA,GAAO,KAAA;AACb,MAAA,MAAM,IAAA,GAAO,KAAA;AACb,MAAA,IAAIC,IAAAA,GAAM,EAAA;AACV,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,QAAAA,IAAAA,IACE,gBAAA,CAAiB,IAAA,EAAM,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,OAAO,CAAA,GAC7C,gBAAA,CAAiB,IAAA,EAAM,CAAA,CAAE,MAAA,GAAS,IAAI,OAAO,CAAA;AAAA,MACjD;AACA,MAAA,IAAIA,IAAAA,GAAM,SAAA,IAAaA,IAAAA,GAAM,SAAA,EAAW;AACtC,QAAA,MAAM,IAAI,oBAAoB,oBAAoB,CAAA;AAAA,MACpD;AACA,MAAA,MAAMC,OAAAA,GAAS,IAAI,aAAA,CAAc,CAAC,CAAA;AAClC,MAAAA,OAAAA,CAAO,CAAC,CAAA,GAAID,IAAAA;AACZ,MAAA,MAAME,eAAqB,EAAC;AAC5B,MAAA,OAAO,OAAY,cAAA,CAAe;AAAA,QAChC,IAAA,EAAMD,OAAAA;AAAA,QACN,KAAA,EAAOC,YAAAA;AAAA,QACP,KAAA,EAAO,OAAA;AAAA,QACP,QAAQ,CAAA,CAAE;AAAA,OACX,CAAA;AAAA,IACH;AACA,IAAA,IAAI,KAAA,YAAiB,aAAA,IAAiB,KAAA,YAAiB,aAAA,EAAe;AACpE,MAAA,MAAM,IAAI,WAAW,8BAA8B,CAAA;AAAA,IACrD;AACA,IAAA,MAAM,IAAA,GAAO,KAAA;AACb,IAAA,MAAM,IAAA,GAAO,KAAA;AACb,IAAA,IAAIF,IAAAA,GAAM,CAAA;AACV,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAAA,IAAAA,IACE,iBAAA,CAAkB,IAAA,EAAM,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,OAAO,CAAA,GAC9C,iBAAA,CAAkB,IAAA,EAAM,CAAA,CAAE,MAAA,GAAS,IAAI,OAAO,CAAA;AAAA,IAClD;AACA,IAAA,MAAM,IAAA,GAAO,sBAAsB,QAAQ,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,CAAC,CAAA;AACzB,IAAA,MAAA,CAAO,CAAC,CAAA,GAAIA,IAAAA;AACZ,IAAA,MAAM,cAAqB,EAAC;AAC5B,IAAA,OAAO,OAAY,cAAA,CAAe;AAAA,MAChC,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,WAAA;AAAA,MACP,KAAA,EAAO,QAAA;AAAA,MACP,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,CAAA,IAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AAChC,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AACxB,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AACzB,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AACzB,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAExB,IAAA,IAAI,OAAO,EAAA,EAAI;AACb,MAAA,MAAM,IAAI,UAAA;AAAA,QACR,CAAA,OAAA,EAAU,EAAE,KAAK,CAAA,KAAA,EAAQ,EAAE,KAAK,CAAA,cAAA,EAAiB,EAAE,CAAA,YAAA,EAAe,EAAE,CAAA,QAAA;AAAA,OACtE;AAAA,IACF;AAEA,IAAA,MAAM,UAAU,CAAA,GAAI,CAAA;AACpB,IAAA,MAAM,IAAA,GAAO,sBAAsB,QAAQ,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,OAAO,CAAA;AAE/B,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI,EAAE,KAAA,YAAiB,aAAA,CAAA,IAAkB,EAAE,iBAAiB,aAAA,CAAA,EAAgB;AAC1E,QAAA,MAAM,IAAI,WAAW,0BAA0B,CAAA;AAAA,MACjD;AACA,MAAA,IAAI,EAAE,kBAAkB,aAAA,CAAA,EAAgB;AACtC,QAAA,MAAM,IAAI,WAAW,8CAA8C,CAAA;AAAA,MACrE;AACA,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,UAAA,IAAIA,IAAAA,GAAM,EAAA;AACV,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,YAAA,MAAM,IAAA,GAAO,gBAAA;AAAA,cACX,KAAA;AAAA,cACA,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAA,GAAK,CAAA,IAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAAA,aAC5D;AACA,YAAA,MAAM,IAAA,GAAO,gBAAA;AAAA,cACX,KAAA;AAAA,cACA,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAA,GAAK,CAAA,IAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAAA,aAC5D;AACA,YAAAA,QAAO,IAAA,GAAO,IAAA;AAAA,UAChB;AACA,UAAA,IAAIA,IAAAA,GAAM,SAAA,IAAaA,IAAAA,GAAM,SAAA,EAAW;AACtC,YAAA,MAAM,IAAI,oBAAoB,oBAAoB,CAAA;AAAA,UACpD;AACA,UAAA,MAAA,CAAO,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAIA,IAAAA;AAAA,QACtB;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAI,KAAA,YAAiB,aAAA,IAAiB,KAAA,YAAiB,aAAA,EAAe;AACpE,QAAA,MAAM,IAAI,WAAW,8BAA8B,CAAA;AAAA,MACrD;AACA,MAAA,IAAI,kBAAkB,aAAA,EAAe;AACnC,QAAA,MAAM,IAAI,WAAW,gDAAgD,CAAA;AAAA,MACvE;AAEA,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAC5B,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAC5B,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAC5B,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAC5B,MAAA,MAAM,OAAO,CAAA,CAAE,MAAA;AACf,MAAA,MAAM,OAAO,CAAA,CAAE,MAAA;AACf,MAAA,MAAM,IAAA,GAAO,KAAA;AACb,MAAA,MAAM,IAAA,GAAO,KAAA;AACb,MAAA,MAAM,IAAA,GAAO,EAAA;AACb,MAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,MAAM,IAAA,EAAM;AACnC,QAAA,MAAM,IAAA,GAAO,EAAA,GAAK,IAAA,GAAO,CAAA,GAAI,KAAK,IAAA,GAAO,CAAA;AACzC,QAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,EAAA,EAAI,MAAM,IAAA,EAAM;AACpC,UAAA,MAAM,IAAA,GAAO,EAAA,GAAK,IAAA,GAAO,EAAA,GAAK,KAAK,IAAA,GAAO,EAAA;AAC1C,UAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,MAAM,IAAA,EAAM;AACnC,YAAA,MAAM,IAAA,GAAO,EAAA,GAAK,IAAA,GAAO,CAAA,GAAI,KAAK,IAAA,GAAO,CAAA;AACzC,YAAA,KAAA,IAAS,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC9B,cAAA,MAAM,KAAA,GAAQ,OAAO,CAAA,GAAI,GAAA;AACzB,cAAA,MAAM,QAAQ,CAAA,GAAI,CAAA;AAClB,cAAA,KAAA,IAAS,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC9B,gBAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ,CAAA,GAAI,GAAG,CAAA;AACjC,gBAAA,MAAM,KAAA,GAAQ,OAAO,CAAA,GAAI,GAAA;AACzB,gBAAA,KAAA,IAAS,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC9B,kBAAA,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA,GACb,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA,GAAe,IAAA,GAAQ,IAAA,CAAK,KAAA,GAAQ,CAAA,GAAI,GAAG,CAAA;AAAA,gBAChE;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAY,cAAA,CAAe;AAAA,MAChC,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,MACZ,KAAA,EAAO,QAAA;AAAA,MACP,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,CAAA,IAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AAChC,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AACxB,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AACzB,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAEzB,IAAA,IAAI,OAAO,EAAA,EAAI;AACb,MAAA,MAAM,IAAI,WAAW,CAAA,OAAA,EAAU,CAAA,CAAE,KAAK,CAAA,KAAA,EAAQ,CAAA,CAAE,KAAK,CAAA,YAAA,CAAc,CAAA;AAAA,IACrE;AAEA,IAAA,MAAM,IAAA,GAAO,sBAAsB,QAAQ,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,CAAC,CAAA;AAEzB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI,EAAE,KAAA,YAAiB,aAAA,CAAA,IAAkB,EAAE,iBAAiB,aAAA,CAAA,EAAgB;AAC1E,QAAA,MAAM,IAAI,WAAW,0BAA0B,CAAA;AAAA,MACjD;AACA,MAAA,IAAI,EAAE,kBAAkB,aAAA,CAAA,EAAgB;AACtC,QAAA,MAAM,IAAI,WAAW,8CAA8C,CAAA;AAAA,MACrE;AACA,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,QAAA,IAAIA,IAAAA,GAAM,EAAA;AACV,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,UAAA,MAAM,IAAA,GAAO,gBAAA;AAAA,YACX,KAAA;AAAA,YACA,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAA,GAAK,CAAA,IAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAAA,WAC5D;AACA,UAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,KAAA,EAAO,CAAA,CAAE,MAAA,GAAS,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAE,CAAA;AACvE,UAAAA,QAAO,IAAA,GAAO,IAAA;AAAA,QAChB;AACA,QAAA,IAAIA,IAAAA,GAAM,SAAA,IAAaA,IAAAA,GAAM,SAAA,EAAW;AACtC,UAAA,MAAM,IAAI,oBAAoB,oBAAoB,CAAA;AAAA,QACpD;AACA,QAAA,MAAA,CAAO,CAAC,CAAA,GAAIA,IAAAA;AAAA,MACd;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAI,KAAA,YAAiB,aAAA,IAAiB,KAAA,YAAiB,aAAA,EAAe;AACpE,QAAA,MAAM,IAAI,WAAW,8BAA8B,CAAA;AAAA,MACrD;AACA,MAAA,IAAI,kBAAkB,aAAA,EAAe;AACnC,QAAA,MAAM,IAAI,WAAW,gDAAgD,CAAA;AAAA,MACvE;AACA,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,QAAA,IAAIA,IAAAA,GAAM,CAAA;AACV,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,UAAA,MAAM,IAAA,GAAO,iBAAA;AAAA,YACX,KAAA;AAAA,YACA,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAA,GAAK,CAAA,IAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAAA,WAC5D;AACA,UAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,KAAA,EAAO,CAAA,CAAE,MAAA,GAAS,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAE,CAAA;AACxE,UAAAA,QAAO,IAAA,GAAO,IAAA;AAAA,QAChB;AACA,QAAA,MAAA,CAAO,CAAC,CAAA,GAAIA,IAAAA;AAAA,MACd;AAAA,IACF;AAEA,IAAA,OAAO,OAAY,cAAA,CAAe;AAAA,MAChC,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,MACT,KAAA,EAAO,QAAA;AAAA,MACP,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,CAAA,CAAE,IAAA,IAAQ,CAAA,IAAK,CAAA,CAAE,QAAQ,CAAA,EAAG;AAC9B,IAAA,IAAI,CAAA,CAAE,IAAA,GAAO,CAAA,IAAK,CAAA,CAAE,OAAO,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,WAAW,CAAA,+BAAA,EAAkC,CAAA,CAAE,KAAK,CAAA,KAAA,EAAQ,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,IACjF;AAEA,IAAA,MAAM,aAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,OAAO,CAAC,CAAA;AACzC,IAAA,MAAM,aAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,OAAO,CAAC,CAAA;AACzC,IAAA,MAAM,WAAA,GAAc,CAAA,CAAE,KAAA,CAAM,KAAA,CAAM,GAAG,UAAU,CAAA;AAC/C,IAAA,MAAM,WAAA,GAAc,CAAA,CAAE,KAAA,CAAM,KAAA,CAAM,GAAG,UAAU,CAAA;AAE/C,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,UAAA,GAAa,CAAA,IAAK,UAAA,GAAa,CAAA,EAAG;AACpC,MAAA,IAAI,eAAe,UAAA,EAAY;AAC7B,QAAA,MAAM,IAAI,UAAA,CAAW,CAAA,+BAAA,EAAkC,WAAW,CAAA,MAAA,EAAS,WAAW,CAAA,CAAA,CAAG,CAAA;AAAA,MAC3F;AACA,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,QAAA,IAAI,WAAA,CAAY,CAAC,CAAA,KAAM,WAAA,CAAY,CAAC,CAAA,EAAG;AACrC,UAAA,MAAM,IAAI,UAAA;AAAA,YACR,CAAA,+BAAA,EAAkC,WAAW,CAAA,MAAA,EAAS,WAAW,CAAA,CAAA;AAAA,WACnE;AAAA,QACF;AAAA,MACF;AACA,MAAA,UAAA,GAAa,WAAA;AAAA,IACf,CAAA,MAAA,IAAW,aAAa,CAAA,EAAG;AACzB,MAAA,UAAA,GAAa,WAAA;AAAA,IACf,CAAA,MAAA,IAAW,aAAa,CAAA,EAAG;AACzB,MAAA,UAAA,GAAa,WAAA;AAAA,IACf,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,WAAW,CAAA,+BAAA,EAAkC,CAAA,CAAE,KAAK,CAAA,KAAA,EAAQ,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,IACjF;AAEA,IAAA,MAAM,IAAI,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,IAAA,GAAO,CAAC,CAAA,IAAK,CAAA;AACjC,IAAA,MAAM,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,IAAA,GAAO,CAAC,CAAA,IAAK,CAAA;AAClC,IAAA,MAAM,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,IAAA,GAAO,CAAC,CAAA,IAAK,CAAA;AAClC,IAAA,MAAM,IAAI,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,IAAA,GAAO,CAAC,CAAA,IAAK,CAAA;AAEjC,IAAA,IAAI,OAAO,EAAA,EAAI;AACb,MAAA,MAAM,IAAI,WAAW,CAAA,6BAAA,CAA+B,CAAA;AAAA,IACtD;AAEA,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,MAAA,SAAA,IAAa,GAAA;AAAA,IACf;AAEA,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,MAAA,KAAW,CAAA,GAAI,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,CAAC,GAAG,UAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AACxE,IAAA,MAAM,OAAA,GAAU,YAAY,CAAA,GAAI,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,sBAAsB,QAAQ,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,OAAO,CAAA;AAE/B,IAAA,MAAM,QAAA,GAAW,CAAA,CAAE,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAC,CAAA;AACrC,IAAA,MAAM,QAAA,GAAW,CAAA,CAAE,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAC,CAAA;AACrC,IAAA,MAAM,QAAA,GAAW,CAAA,CAAE,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAC,CAAA;AACrC,IAAA,MAAM,QAAA,GAAW,CAAA,CAAE,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAC,CAAA;AAErC,IAAA,IAAI,QAAA,KAAa,MAAA,IAAa,QAAA,KAAa,MAAA,EAAW;AACpD,MAAA,MAAM,IAAI,WAAW,kDAAkD,CAAA;AAAA,IACzE;AACA,IAAA,IAAI,QAAA,KAAa,MAAA,IAAa,QAAA,KAAa,MAAA,EAAW;AACpD,MAAA,MAAM,IAAI,WAAW,mDAAmD,CAAA;AAAA,IAC1E;AAEA,IAAA,MAAM,aAAA,GAAgB,aAAa,CAAA,GAAI,CAAA,CAAE,QAAQ,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA,GAAI,EAAC;AACzE,IAAA,MAAM,aAAA,GAAgB,aAAa,CAAA,GAAI,CAAA,CAAE,QAAQ,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA,GAAI,EAAC;AAEzE,IAAA,MAAM,WAAA,GAAc,CAClB,KAAA,EACA,KAAA,EACA,SACA,UAAA,KACW;AACX,MAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,UAAA;AAC/B,MAAA,IAAI,MAAA,GAAS,UAAA;AACb,MAAA,IAAI,SAAA,GAAY,KAAA;AAChB,MAAA,KAAA,IAAS,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC1C,QAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AACxB,QAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AACxB,QAAA,IAAI,WAAW,MAAA,EAAW;AACxB,UAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,QAC7D;AACA,QAAA,IAAI,QAAQ,CAAA,EAAG;AACb,UAAA,OAAO,UAAA;AAAA,QACT;AACA,QAAA,MAAM,MAAM,SAAA,GAAY,GAAA;AACxB,QAAA,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,GAAG,CAAA;AACtC,QAAA,MAAA,IAAU,GAAA,GAAM,MAAA;AAAA,MAClB;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAEA,IAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,SAAA,EAAW,KAAA,EAAA,EAAS;AAC9C,MAAA,MAAM,OAAA,GACJ,UAAA,GAAa,CAAA,GAAI,WAAA,CAAY,KAAA,EAAO,YAAY,aAAA,EAAe,CAAA,CAAE,MAAM,CAAA,GAAI,CAAA,CAAE,MAAA;AAC/E,MAAA,MAAM,OAAA,GACJ,UAAA,GAAa,CAAA,GAAI,WAAA,CAAY,KAAA,EAAO,YAAY,aAAA,EAAe,CAAA,CAAE,MAAM,CAAA,GAAI,CAAA,CAAE,MAAA;AAE/E,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,IAAI,EAAE,KAAA,YAAiB,aAAA,CAAA,IAAkB,EAAE,iBAAiB,aAAA,CAAA,EAAgB;AAC1E,cAAA,MAAM,IAAI,WAAW,0BAA0B,CAAA;AAAA,YACjD;AACA,YAAA,IAAI,EAAE,kBAAkB,aAAA,CAAA,EAAgB;AACtC,cAAA,MAAM,IAAI,WAAW,8CAA8C,CAAA;AAAA,YACrE;AACA,YAAA,IAAIA,IAAAA,GAAM,EAAA;AACV,YAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,cAAA,MAAM,OAAO,gBAAA,CAAiB,KAAA,EAAO,UAAU,CAAA,GAAI,QAAA,GAAW,IAAI,QAAQ,CAAA;AAC1E,cAAA,MAAM,OAAO,gBAAA,CAAiB,KAAA,EAAO,UAAU,CAAA,GAAI,QAAA,GAAW,IAAI,QAAQ,CAAA;AAC1E,cAAAA,QAAO,IAAA,GAAO,IAAA;AAAA,YAChB;AACA,YAAA,MAAM,QAAA,GAAW,KAAA,IAAS,CAAA,GAAI,CAAA,CAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AAC3C,YAAA,IAAIA,IAAAA,GAAM,SAAA,IAAaA,IAAAA,GAAM,SAAA,EAAW;AACtC,cAAA,MAAM,IAAI,oBAAoB,oBAAoB,CAAA;AAAA,YACpD;AACA,YAAA,MAAA,CAAO,QAAQ,CAAA,GAAIA,IAAAA;AAAA,UACrB,CAAA,MAAO;AACL,YAAA,IAAI,KAAA,YAAiB,aAAA,IAAiB,KAAA,YAAiB,aAAA,EAAe;AACpE,cAAA,MAAM,IAAI,WAAW,8BAA8B,CAAA;AAAA,YACrD;AACA,YAAA,IAAI,kBAAkB,aAAA,EAAe;AACnC,cAAA,MAAM,IAAI,WAAW,gDAAgD,CAAA;AAAA,YACvE;AACA,YAAA,IAAIA,IAAAA,GAAM,CAAA;AACV,YAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,cAAA,MAAM,OAAO,iBAAA,CAAkB,KAAA,EAAO,UAAU,CAAA,GAAI,QAAA,GAAW,IAAI,QAAQ,CAAA;AAC3E,cAAA,MAAM,OAAO,iBAAA,CAAkB,KAAA,EAAO,UAAU,CAAA,GAAI,QAAA,GAAW,IAAI,QAAQ,CAAA;AAC3E,cAAAA,QAAO,IAAA,GAAO,IAAA;AAAA,YAChB;AACA,YAAA,MAAM,QAAA,GAAW,KAAA,IAAS,CAAA,GAAI,CAAA,CAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AAC3C,YAAA,MAAA,CAAO,QAAQ,CAAA,GAAIA,IAAAA;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAY,cAAA,CAAe;AAAA,MAChC,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,KAAA,EAAO,QAAA;AAAA,MACP,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,IAAI,WAAW,CAAA,+BAAA,EAAkC,CAAA,CAAE,KAAK,CAAA,KAAA,EAAQ,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACjF;;;AC/YO,SAAS,UAAA,CACd,IAAA,EACA,MAAA,EACA,UAAA,EACA,gBACA,OAAA,EACQ;AACR,EAAA,OAAO,aAAa,MAAA,GAAS,IAAA,GAAO,oBAAoB,IAAA,EAAM,cAAA,EAAgB,SAAS,MAAM,CAAA;AAC/F;AAMO,SAAS,mBAAmB,CAAA,EAAmB;AACpD,EAAA,MAAMG,IAAAA,GAAM,MAAA,CAAO,MAAA,CAAO,gBAAgB,CAAA;AAC1C,EAAA,MAAMC,OAAM,CAACD,IAAAA;AACb,EAAA,IAAI,CAAA,GAAIA,IAAAA,IAAO,CAAA,GAAIC,IAAAA,EAAK;AACtB,IAAA,MAAM,IAAI,oBAAoB,sDAAsD,CAAA;AAAA,EACtF;AACA,EAAA,OAAO,OAAO,CAAC,CAAA;AACjB;AAMO,SAAS,gBAAA,CAAiB,MAAkB,GAAA,EAAqB;AACtE,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,kBAAA,CAAmB,gBAAA,CAAiB,IAAA,EAAM,GAAG,CAAC,CAAA;AAAA,EACvD;AACA,EAAA,OAAO,iBAAA,CAAkB,MAAM,GAAG,CAAA;AACpC;AAMO,SAAS,WAAA,CAAY,MAAkB,GAAA,EAA8B;AAC1E,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,gBAAA,CAAiB,MAAM,GAAG,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,iBAAA,CAAkB,MAAM,GAAG,CAAA;AACpC;AAOO,SAAS,YAAA,CAAa,MAAkB,GAAA,EAAqB;AAClE,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,MAAA,CAAO,gBAAA,CAAiB,IAAA,EAAM,GAAG,CAAC,CAAA;AAAA,EAC3C;AACA,EAAA,OAAO,iBAAA,CAAkB,MAAM,GAAG,CAAA;AACpC;AAOO,SAAS,kBAAA,CAAmB,MAA6B,MAAA,EAA4B;AAC1F,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,EAAG,MAAM,CAAA,oCAAA,CAAsC,CAAA;AAAA,EACtE;AACA,EAAA,OAAO,IAAA;AACT;;;ACjFA,SAAS,iBAAiB,KAAA,EAA+C;AAEvE,EAAA,IAAI,KAAA,KAAU,WAAW,OAAO,SAAA;AAChC,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,eAAe,CAAA,EAAmB;AACzC,EAAA,IAAI,IAAI,CAAA,EAAG;AACT,IAAA,OAAO,IAAI,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,CAAI,CAAC,CAAC,CAAC,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AAC/B;AAEA,SAAS,eAAe,CAAA,EAAyB;AAC/C,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,+BAA+B,CAAA;AAAA,EACtD;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,kBAAA,CAAmB,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IAC/D;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAA;AAAA,IAC5C;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAsBO,SAAS,QAAQ,CAAA,EAAmB;AACzC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,yCAAyC,CAAA;AAAA,EAChE;AAEA,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,CAAA,CAAE,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAO,sBAAsB,KAAK,CAAA;AACxC,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA;AAC3B,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,yCAAyC,CAAA;AAAA,EAChE;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAA;AAChE,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA,IAAK,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,CAAA,CAAA;AAAA,IACjC;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAA;AAC7C,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA,IAAK,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,CAAA,CAAA;AAAA,IACjC;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA;AAAA,IACA,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAsBO,SAAS,KAAK,CAAA,EAAmB;AACtC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,CAAA,CAAE,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAO,sBAAsB,KAAK,CAAA;AACxC,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA;AAC3B,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAA;AAChE,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,GAAG,CAAA;AAAA,IAC1B;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAA;AAC7C,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,GAAG,CAAA;AAAA,IAC1B;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA;AAAA,IACA,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAmBO,SAAS,SAAA,CAAU,CAAA,EAAW,KAAA,GAAQ,IAAA,EAAc;AACzD,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,2CAA2C,CAAA;AAAA,EAClE;AAEA,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,CAAA,CAAE,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAO,sBAAsB,KAAK,CAAA;AACxC,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA;AAC3B,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,2CAA2C,CAAA;AAAA,EAClE;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAA;AAChE,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,MAAM,KAAA,GAAQ,GAAA;AAAA,IACnC;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAA;AAC7C,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,MAAM,KAAA,GAAQ,GAAA;AAAA,IACnC;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA;AAAA,IACA,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAqBO,SAAS,GAAA,CAAI,CAAA,EAAW,KAAA,GAAgB,CAAA,EAAa;AAC1D,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,qCAAqC,CAAA;AAAA,EAC5D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,qCAAqC,CAAA;AAAA,EAC5D;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAA;AAChE,MAAA,GAAA,CAAI,CAAC,IAAI,GAAA,GAAM,CAAA,GAAI,MAAM,KAAA,IAAS,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,CAAA,CAAA;AAAA,IACpD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAA;AAC7C,MAAA,GAAA,CAAI,CAAC,IAAI,GAAA,GAAM,CAAA,GAAI,MAAM,KAAA,IAAS,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,CAAA,CAAA;AAAA,IACpD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAoBO,SAAS,KAAK,CAAA,EAAmB;AACtC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,KAAK,EAAE,CAAA;AACzC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,CAAA,GAAI,kBAAA,CAAmB,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAA;AAC9D,MAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACnB,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA,GAAM,CAAA,IAAK,CAAA,GAAI,KAAK,IAAA,CAAK,WAAA,IAAe,CAAA,GAAI,QAAA,GAAW,EAAA,CAAG,CAAA,CAAA;AAAA,IACrE;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,CAAA,GAAI,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAA;AAC3C,MAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACnB,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA,GAAM,CAAA,IAAK,CAAA,GAAI,KAAK,IAAA,CAAK,WAAA,IAAe,CAAA,GAAI,QAAA,GAAW,EAAA,CAAG,CAAA,CAAA;AAAA,IACrE;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAoCO,SAAS,OAAA,CAAQ,CAAA,EAAW,IAAA,GAAa,EAAA,EAAY;AAC1D,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,yCAAyC,CAAA;AAAA,EAChE;AAGA,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AAE7C,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AAGnC,EAAA,MAAM,IAAA,GAAO,eAAe,CAAC,CAAA;AAG7B,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,IAAA,SAAA,IAAa,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAAA,EAC7B;AACA,EAAA,MAAM,QAAA,GAAW,CAAA,CAAE,KAAA,CAAM,UAAU,CAAA,IAAK,CAAA;AACxC,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,KAAA,IAAS,IAAI,UAAA,GAAa,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC5C,IAAA,SAAA,IAAa,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAAA,EAC7B;AAIA,EAAA,MAAM,SAAA,GAAY,IAAI,YAAA,CAAa,QAAQ,CAAA;AAG3C,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,SAAA,EAAW,KAAA,EAAA,EAAS;AAC9C,IAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,SAAA,EAAW,KAAA,EAAA,EAAS;AAG9C,MAAA,MAAM,UAAA,GAAa,KAAA,GAAQ,QAAA,GAAW,SAAA,GAAY,KAAA;AAGlD,MAAA,IAAI,MAAA,GAAS,CAAA,QAAA;AACb,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,QAAA,MAAM,GAAA,GAAM,aAAa,CAAA,GAAI,SAAA;AAC7B,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAG,CAAA,IAAK,CAAA;AACzB,QAAA,IAAI,GAAA,GAAM,QAAQ,MAAA,GAAS,GAAA;AAAA,MAC7B;AAGA,MAAA,IAAI,MAAA,GAAS,CAAA;AACb,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,QAAA,MAAM,GAAA,GAAM,aAAa,CAAA,GAAI,SAAA;AAC7B,QAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAA,CAAK,KAAK,GAAG,CAAA,IAAK,KAAK,MAAM,CAAA;AACjD,QAAA,SAAA,CAAU,CAAC,CAAA,GAAI,MAAA;AACf,QAAA,MAAA,IAAU,MAAA;AAAA,MACZ;AAGA,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,QAAA,MAAM,GAAA,GAAM,aAAa,CAAA,GAAI,SAAA;AAC7B,QAAA,GAAA,CAAI,GAAG,CAAA,GAAA,CAAK,SAAA,CAAU,CAAC,KAAK,CAAA,IAAK,MAAA;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAoCO,SAAS,UAAA,CAAW,CAAA,EAAW,IAAA,GAAa,EAAA,EAAY;AAC7D,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,4CAA4C,CAAA;AAAA,EACnE;AAGA,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AAE7C,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AAGnC,EAAA,MAAM,IAAA,GAAO,eAAe,CAAC,CAAA;AAG7B,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,IAAA,SAAA,IAAa,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAAA,EAC7B;AACA,EAAA,MAAM,QAAA,GAAW,CAAA,CAAE,KAAA,CAAM,UAAU,CAAA,IAAK,CAAA;AACxC,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,KAAA,IAAS,IAAI,UAAA,GAAa,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC5C,IAAA,SAAA,IAAa,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAAA,EAC7B;AAGA,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,SAAA,EAAW,KAAA,EAAA,EAAS;AAC9C,IAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,SAAA,EAAW,KAAA,EAAA,EAAS;AAE9C,MAAA,MAAM,UAAA,GAAa,KAAA,GAAQ,QAAA,GAAW,SAAA,GAAY,KAAA;AAGlD,MAAA,IAAI,MAAA,GAAS,CAAA,QAAA;AACb,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,QAAA,MAAM,GAAA,GAAM,aAAa,CAAA,GAAI,SAAA;AAC7B,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAG,CAAA,IAAK,CAAA;AACzB,QAAA,IAAI,GAAA,GAAM,QAAQ,MAAA,GAAS,GAAA;AAAA,MAC7B;AAGA,MAAA,IAAI,MAAA,GAAS,CAAA;AACb,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,QAAA,MAAM,GAAA,GAAM,aAAa,CAAA,GAAI,SAAA;AAC7B,QAAA,MAAA,IAAU,KAAK,GAAA,CAAA,CAAK,IAAA,CAAK,GAAG,CAAA,IAAK,KAAK,MAAM,CAAA;AAAA,MAC9C;AACA,MAAA,MAAM,SAAA,GAAY,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA;AAG1C,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,QAAA,MAAM,GAAA,GAAM,aAAa,CAAA,GAAI,SAAA;AAC7B,QAAA,GAAA,CAAI,GAAG,CAAA,GAAA,CAAK,IAAA,CAAK,GAAG,KAAK,CAAA,IAAK,SAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAiBO,SAAS,MAAM,CAAA,EAAmB;AACvC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAA;AAChE,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA,IAAO,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,CAAA,CAAA;AAAA,IACnC;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAA;AAC7C,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA,IAAO,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,CAAA,CAAA;AAAA,IACnC;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAkBO,SAAS,KAAK,CAAA,EAAmB;AACtC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,CAAA,GAAI,kBAAA,CAAmB,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA,GAAI,KAAK,IAAA,CAAK,cAAA,CAAe,CAAC,CAAC,CAAA;AAAA,IAC1C;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,CAAA,GAAI,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAA;AAC3C,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA,GAAI,KAAK,IAAA,CAAK,cAAA,CAAe,CAAC,CAAC,CAAA;AAAA,IAC1C;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAeO,SAAS,SAAS,CAAA,EAAmB;AAC1C,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,0CAA0C,CAAA;AAAA,EACjE;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,0CAA0C,CAAA;AAAA,EACjE;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAA;AAChE,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,cAAA,CAAe,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAA;AAC7C,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,cAAA,CAAe,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;;;ACrqBO,SAAS,SAAS,CAAA,EAAoB;AAC3C,EAAA,OAAO,CAAA,CAAE,IAAA,KAAS,CAAA,IAAK,CAAA,CAAE,IAAA,KAAS,CAAA;AACpC;AAEO,SAAS,kBAAA,CACd,GACA,EAAA,EACsD;AACtD,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,EAAG,EAAE,CAAA,gCAAA,CAAkC,CAAA;AAAA,EAC9D;AACF;AAEO,SAAS,eAAA,CAAgB,GAAW,CAAA,EAAiB;AAC1D,EAAA,IAAI,CAAA,CAAE,KAAA,KAAU,CAAA,CAAE,KAAA,EAAO;AACvB,IAAA,MAAM,IAAI,WAAW,CAAA,gBAAA,EAAmB,CAAA,CAAE,KAAK,CAAA,IAAA,EAAO,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,EACjE;AACF;AAEO,SAAS,yBAAA,CAA0B,GAAW,CAAA,EAAiB;AACpE,EAAA,IAAI,CAAC,QAAA,CAAS,CAAC,CAAA,IAAK,CAAC,QAAA,CAAS,CAAC,CAAA,IAAK,CAAC,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,KAAK,CAAA,EAAG;AACnE,IAAA,MAAM,WAAW,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,OAAO,WAAW,CAAA;AAAA,EACzD;AACF;AAEO,SAAS,YAAA,CAAa,QAAe,MAAA,EAAwB;AAClE,EAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,MAAA,EAAQ,OAAO,MAAM,CAAA;AACpD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,IAAA,MAAM,OAAO,eAAA,CAAgB,MAAA,EAAQ,OAAO,MAAA,GAAS,CAAA,GAAI,GAAG,CAAC,CAAA;AAC7D,IAAA,MAAM,OAAO,eAAA,CAAgB,MAAA,EAAQ,OAAO,MAAA,GAAS,CAAA,GAAI,GAAG,CAAC,CAAA;AAC7D,IAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,CAAA,IAAK,SAAS,CAAA,EAAG;AAC7C,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,KAAS,CAAA,IAAK,IAAA,KAAS,CAAA,EAAG;AAC5B,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,iBAAA,CAAkB,QAAe,MAAA,EAAsB;AACrE,EAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,MAAA,EAAQ,OAAO,MAAM,CAAA;AACpD,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,IAAA,MAAM,OAAO,eAAA,CAAgB,MAAA,EAAQ,OAAO,MAAA,GAAS,CAAA,GAAI,GAAG,CAAC,CAAA;AAC7D,IAAA,MAAM,OAAO,eAAA,CAAgB,MAAA,EAAQ,OAAO,MAAA,GAAS,CAAA,GAAI,GAAG,CAAC,CAAA;AAC7D,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,MAAA,CAAO,QAAQ,IAAI,CAAA;AAAA,IACrB,CAAA,MAAA,IAAW,SAAS,CAAA,EAAG;AACrB,MAAA,MAAA,CAAO,QAAQ,IAAI,CAAA;AAAA,IACrB,CAAA,MAAA,IAAW,SAAS,CAAA,EAAG;AACrB,MAAA,MAAA,CAAO,QAAQ,IAAI,CAAA;AAAA,IACrB,CAAA,MAAA,IAAW,IAAA,KAAS,CAAA,IAAK,IAAA,KAAS,CAAA,EAAG;AAInC,MAAA,MAAM,UAAA,CAAW,QAAA,CAAS,MAAA,EAAQ,MAAA,EAAQ,WAAW,CAAA;AAAA,IACvD,CAAA,MAAO;AACL,MAAA,MAAM,UAAA,CAAW,QAAA,CAAS,MAAA,EAAQ,MAAA,EAAQ,WAAW,CAAA;AAAA,IACvD;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAaO,SAAS,cAAA,CACd,CAAA,EACA,CAAA,EACA,GAAA,EACA,EAAA,EACM;AACN,EAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAGpB,EAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,IAAA,EAAA,CAAG,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,IAAI,MAAM,CAAA;AACjC,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,WAAW,GAAA,CAAI,KAAA;AACrB,EAAA,MAAM,aAAa,GAAA,CAAI,OAAA;AACvB,EAAA,MAAM,OAAO,QAAA,CAAS,MAAA;AAEtB,EAAA,MAAM,WAAW,IAAI,KAAA,CAAc,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAC/C,EAAA,MAAM,WAAW,IAAI,KAAA,CAAc,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAE/C,EAAA,MAAM,SAAA,GAAY,OAAO,CAAA,CAAE,IAAA;AAC3B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,CAAA,GAAI,SAAS,CAAA,IAAK,CAAA;AAEtC,MAAA,IAAI,MAAM,CAAA,EAAG;AACX,QAAA,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,CAAA,GAAI,SAAS,CAAA,IAAK,CAAA;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,OAAO,CAAA,CAAE,IAAA;AAC3B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,CAAA,GAAI,SAAS,CAAA,IAAK,CAAA;AACtC,MAAA,IAAI,MAAM,CAAA,EAAG;AACX,QAAA,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,CAAA,GAAI,SAAS,CAAA,IAAK,CAAA;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,MAAM,IAAI,KAAA,CAAc,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAC1C,EAAA,IAAI,OAAO,CAAA,CAAE,MAAA;AACb,EAAA,IAAI,OAAO,CAAA,CAAE,MAAA;AACb,EAAA,IAAI,SAAS,GAAA,CAAI,MAAA;AAEjB,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,EAAA,CAAG,IAAA,EAAM,MAAM,MAAM,CAAA;AAGrB,IAAA,IAAI,OAAO,IAAA,GAAO,CAAA;AAClB,IAAA,WAAS;AACP,MAAA,MAAM,UAAA,GAAa,IAAI,IAAI,CAAA;AAC3B,MAAA,IAAI,eAAe,MAAA,EAAW;AAE5B,QAAA;AAAA,MACF;AACA,MAAA,MAAM,UAAU,UAAA,GAAa,CAAA;AAC7B,MAAA,GAAA,CAAI,IAAI,CAAA,GAAI,OAAA;AAEZ,MAAA,MAAM,OAAA,GAAU,SAAS,IAAI,CAAA;AAC7B,MAAA,MAAM,OAAA,GAAU,SAAS,IAAI,CAAA;AAC7B,MAAA,MAAM,SAAA,GAAY,WAAW,IAAI,CAAA;AACjC,MAAA,MAAM,MAAA,GAAS,SAAS,IAAI,CAAA;AAE5B,MAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,MAAA,IAAa,WAAW,MAAA,EAAW;AAE1E,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,IAAQ,OAAA;AACR,MAAA,IAAA,IAAQ,OAAA;AACR,MAAA,MAAA,IAAU,SAAA,IAAa,CAAA;AAEvB,MAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,QAAA;AAAA,MACF;AAIA,MAAA,MAAM,KAAA,GAAQ,OAAA;AACd,MAAA,IAAA,IAAQ,OAAA,GAAU,KAAA;AAClB,MAAA,IAAA,IAAQ,OAAA,GAAU,KAAA;AAClB,MAAA,MAAA,IAAA,CAAW,aAAa,CAAA,IAAK,KAAA;AAC7B,MAAA,GAAA,CAAI,IAAI,CAAA,GAAI,CAAA;AACZ,MAAA,IAAA,EAAA;AAEA,MAAA,IAAI,OAAO,CAAA,EAAG;AAAA,IAChB;AAAA,EACF;AACF;;;ACnJA,SAAS,cAAA,CACP,GACA,CAAA,EAC2E;AAC3E,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,CAAA,EAAG,OAAO,IAAA;AACzB,EAAA,IAAI,EAAE,KAAA,KAAU,OAAA,IAAW,CAAA,CAAE,KAAA,KAAU,SAAS,OAAO,IAAA;AACvD,EAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,EAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,EAAA,IAAI,KAAA,CAAM,QAAQ,KAAK,CAAA,IAAK,MAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,IAAA;AACzD,EAAA,IAAI,KAAA,YAAiB,aAAA,IAAiB,KAAA,YAAiB,aAAA,EAAe,OAAO,IAAA;AAE7E,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,CAAA,CAAE,IAAA,EAAM,OAAO,IAAA;AAC9B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,IAAA,IAAI,CAAA,CAAE,MAAM,CAAC,CAAA,KAAM,EAAE,KAAA,CAAM,CAAC,GAAG,OAAO,IAAA;AAAA,EACxC;AAEA,EAAA,IAAI,EAAE,MAAA,KAAW,CAAA,IAAK,CAAA,CAAE,MAAA,KAAW,GAAG,OAAO,IAAA;AAC7C,EAAA,IAAI,CAAC,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA,IAAK,CAAC,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,OAAO,GAAG,OAAO,IAAA;AACnF,EAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,MAAM,KAAA,EAAO,IAAA,EAAM,EAAE,IAAA,EAAK;AAClD;AAEA,SAAS,mBAAmB,KAAA,EAA2D;AACrF,EAAA,IAAI,KAAA,KAAU,SAAA,IAAa,KAAA,KAAU,SAAA,EAAW,OAAO,KAAA;AACvD,EAAA,OAAO,SAAA;AACT;AASA,SAAS,cAAA,CAAe,GAAW,CAAA,EAAmB;AACpD,EAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,EAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,EAAA,MAAM,YAAY,CAAA,GAAI,EAAA;AACtB,EAAA,MAAM,YAAY,CAAA,GAAI,EAAA;AACtB,EAAA,IAAI,CAAA,KAAM,EAAA,IAAM,SAAA,KAAc,SAAA,EAAW;AACvC,IAAA,OAAO,CAAA,GAAI,EAAA;AAAA,EACb;AACA,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,cAAA,CAAe,GAAW,CAAA,EAAmB;AACpD,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AACzB;AAKA,SAAS,SAAA,CAAU,GAAW,CAAA,EAAmB;AAC/C,EAAA,OAAO,CAAA,GAAI,cAAA,CAAe,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA;AACpC;AAEA,SAAS,SAAA,CAAU,GAAW,CAAA,EAAmB;AAC/C,EAAA,OAAO,CAAA,GAAI,cAAA,CAAe,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA;AACpC;AAEA,SAAS,oBAAoB,CAAA,EAAoB;AAC/C,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,CAAA,EAAG,OAAO,KAAA;AACzB,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAClD,EAAA,IAAI,CAAA,CAAE,gBAAgB,aAAA,EAAe;AACnC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,MAAA,GAAS,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC5E,MAAA,IAAI,iBAAiB,CAAA,CAAE,IAAA,EAAM,MAAM,CAAA,GAAI,IAAI,OAAO,IAAA;AAAA,IACpD;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,cAAc,CAAA,CAAE,IAAA;AACtB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAE9B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,IAAA,MAAM,MAAA,GAAS,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC5E,IAAA,IAAI,iBAAA,CAAkB,WAAA,EAAa,MAAM,CAAA,GAAI,GAAG,OAAO,IAAA;AAAA,EACzD;AACA,EAAA,OAAO,KAAA;AACT;AAQO,SAAS,GAAA,CAAI,GAAW,CAAA,EAAmB;AAChD,EAAA,kBAAA,CAAmB,GAAG,KAAK,CAAA;AAC3B,EAAA,kBAAA,CAAmB,GAAG,KAAK,CAAA;AAC3B,EAAA,eAAA,CAAgB,GAAG,CAAC,CAAA;AACpB,EAAA,yBAAA,CAA0B,GAAG,CAAC,CAAA;AAG9B,EAAA,MAAM,EAAA,GAAK,cAAA,CAAe,CAAA,EAAG,CAAC,CAAA;AAC9B,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,MAAMC,KAAAA,GAAO,qBAAA,CAAsB,CAAA,CAAE,KAAK,CAAA;AAC1C,IAAA,MAAMC,IAAAA,GAAM,IAAID,KAAAA,CAAK,EAAA,CAAG,IAAI,CAAA;AAC5B,IAAA,MAAM,OAAO,EAAA,CAAG,IAAA;AAChB,IAAA,MAAM,OAAO,EAAA,CAAG,IAAA;AAChB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,MAAM,CAAA,EAAA,EAAK;AAChC,MAAAC,KAAI,CAAC,CAAA,GAAK,KAAK,CAAC,CAAA,GAAgB,KAAK,CAAC,CAAA;AAAA,IACxC;AACA,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAMA,IAAAA;AAAA,MACN,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,SAAA,GAAY,SAAS,CAAC,CAAA;AAC5B,EAAA,MAAM,SAAA,GAAY,SAAS,CAAC,CAAA;AAC5B,EAAA,MAAM,QAAA,GAAkB,SAAA,GACpB,CAAA,CAAE,KAAA,GACF,SAAA,GACE,CAAA,CAAE,KAAA,GACF,iBAAA,CAAkB,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,KAAK,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,KAAK,CAAC,CAAA;AAE1D,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,CAAA,CAAE,KAAK,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,OAAO,CAAA;AAC5B,EAAA,MAAM,MAAA,GAAS,OAAO,cAAA,CAAe;AAAA,IACnC,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AAED,EAAA,IAAI,aAAA,CAAc,GAAG,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AACxE,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,MAAA,GAAA,CAAI,MAAM,IAAI,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAA,GAAI,gBAAA,CAAiB,OAAO,IAAI,CAAA;AAAA,IAC5E,CAAC,CAAA;AAAA,EACH,CAAA,MAAA,IAAW,CAAC,aAAA,CAAc,GAAG,KAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,IAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AAClF,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,MAAA,GAAA,CAAI,MAAM,IAAI,iBAAA,CAAkB,KAAA,EAAO,IAAI,CAAA,GAAI,iBAAA,CAAkB,OAAO,IAAI,CAAA;AAAA,IAC9E,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,WAAA,CAAY,GAAW,CAAA,EAAkB;AAChD,EAAA,IAAI,QAAA,CAAS,CAAC,CAAA,EAAG,OAAO,CAAA,CAAE,KAAA;AAC1B,EAAA,IAAI,QAAA,CAAS,CAAC,CAAA,EAAG,OAAO,CAAA,CAAE,KAAA;AAC1B,EAAA,OAAO,iBAAA,CAAkB,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,KAAK,CAAA;AAC3C;AAwBO,SAAS,GAAA,CAAI,GAAW,CAAA,EAAmB;AAChD,EAAA,kBAAA,CAAmB,GAAG,KAAK,CAAA;AAC3B,EAAA,kBAAA,CAAmB,GAAG,KAAK,CAAA;AAC3B,EAAA,eAAA,CAAgB,GAAG,CAAC,CAAA;AACpB,EAAA,yBAAA,CAA0B,GAAG,CAAC,CAAA;AAG9B,EAAA,MAAM,EAAA,GAAK,cAAA,CAAe,CAAA,EAAG,CAAC,CAAA;AAC9B,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,MAAMD,KAAAA,GAAO,qBAAA,CAAsB,CAAA,CAAE,KAAK,CAAA;AAC1C,IAAA,MAAMC,IAAAA,GAAM,IAAID,KAAAA,CAAK,EAAA,CAAG,IAAI,CAAA;AAC5B,IAAA,MAAM,OAAO,EAAA,CAAG,IAAA;AAChB,IAAA,MAAM,OAAO,EAAA,CAAG,IAAA;AAChB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,MAAM,CAAA,EAAA,EAAK;AAChC,MAAAC,KAAI,CAAC,CAAA,GAAK,KAAK,CAAC,CAAA,GAAgB,KAAK,CAAC,CAAA;AAAA,IACxC;AACA,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAMA,IAAAA;AAAA,MACN,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,KAAK,CAAC,CAAA;AAE1D,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,CAAA,CAAE,KAAK,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,OAAO,CAAA;AAC5B,EAAA,MAAM,MAAA,GAAS,OAAO,cAAA,CAAe;AAAA,IACnC,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AAED,EAAA,IAAI,aAAA,CAAc,GAAG,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AACxE,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,MAAA,GAAA,CAAI,MAAM,IAAI,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAA,GAAI,gBAAA,CAAiB,OAAO,IAAI,CAAA;AAAA,IAC5E,CAAC,CAAA;AAAA,EACH,CAAA,MAAA,IAAW,CAAC,aAAA,CAAc,GAAG,KAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,IAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AAClF,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,MAAA,GAAA,CAAI,MAAM,IAAI,iBAAA,CAAkB,KAAA,EAAO,IAAI,CAAA,GAAI,iBAAA,CAAkB,OAAO,IAAI,CAAA;AAAA,IAC9E,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,MAAA;AACT;AAwBO,SAAS,GAAA,CAAI,GAAW,CAAA,EAAmB;AAChD,EAAA,kBAAA,CAAmB,GAAG,KAAK,CAAA;AAC3B,EAAA,kBAAA,CAAmB,GAAG,KAAK,CAAA;AAC3B,EAAA,eAAA,CAAgB,GAAG,CAAC,CAAA;AACpB,EAAA,yBAAA,CAA0B,GAAG,CAAC,CAAA;AAG9B,EAAA,MAAM,EAAA,GAAK,cAAA,CAAe,CAAA,EAAG,CAAC,CAAA;AAC9B,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,MAAMD,KAAAA,GAAO,qBAAA,CAAsB,CAAA,CAAE,KAAK,CAAA;AAC1C,IAAA,MAAMC,IAAAA,GAAM,IAAID,KAAAA,CAAK,EAAA,CAAG,IAAI,CAAA;AAC5B,IAAA,MAAM,OAAO,EAAA,CAAG,IAAA;AAChB,IAAA,MAAM,OAAO,EAAA,CAAG,IAAA;AAChB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,MAAM,CAAA,EAAA,EAAK;AAChC,MAAAC,KAAI,CAAC,CAAA,GAAK,KAAK,CAAC,CAAA,GAAgB,KAAK,CAAC,CAAA;AAAA,IACxC;AACA,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAMA,IAAAA;AAAA,MACN,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,KAAK,CAAC,CAAA;AAE1D,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,CAAA,CAAE,KAAK,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,OAAO,CAAA;AAC5B,EAAA,MAAM,MAAA,GAAS,OAAO,cAAA,CAAe;AAAA,IACnC,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AAED,EAAA,IAAI,aAAA,CAAc,GAAG,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AACxE,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,MAAA,GAAA,CAAI,MAAM,IAAI,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAA,GAAI,gBAAA,CAAiB,OAAO,IAAI,CAAA;AAAA,IAC5E,CAAC,CAAA;AAAA,EACH,CAAA,MAAA,IAAW,CAAC,aAAA,CAAc,GAAG,KAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,IAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AAClF,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,MAAA,GAAA,CAAI,MAAM,IAAI,iBAAA,CAAkB,KAAA,EAAO,IAAI,CAAA,GAAI,iBAAA,CAAkB,OAAO,IAAI,CAAA;AAAA,IAC9E,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,MAAA;AACT;AAwBO,SAAS,GAAA,CAAI,GAAW,CAAA,EAAmB;AAChD,EAAA,kBAAA,CAAmB,GAAG,KAAK,CAAA;AAC3B,EAAA,kBAAA,CAAmB,GAAG,KAAK,CAAA;AAC3B,EAAA,eAAA,CAAgB,GAAG,CAAC,CAAA;AACpB,EAAA,yBAAA,CAA0B,GAAG,CAAC,CAAA;AAG9B,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,CAAA,CAAE,KAAK,CAAA;AAC3C,EAAA,MAAM,EAAA,GAAK,cAAA,CAAe,CAAA,EAAG,CAAC,CAAA;AAC9B,EAAA,IAAI,EAAA,IAAM,QAAA,KAAa,CAAA,CAAE,KAAA,EAAO;AAC9B,IAAA,MAAMD,KAAAA,GAAO,sBAAsB,QAAQ,CAAA;AAC3C,IAAA,MAAMC,IAAAA,GAAM,IAAID,KAAAA,CAAK,EAAA,CAAG,IAAI,CAAA;AAC5B,IAAA,MAAM,OAAO,EAAA,CAAG,IAAA;AAChB,IAAA,MAAM,OAAO,EAAA,CAAG,IAAA;AAChB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,MAAM,CAAA,EAAA,EAAK;AAChC,MAAAC,KAAI,CAAC,CAAA,GAAK,KAAK,CAAC,CAAA,GAAgB,KAAK,CAAC,CAAA;AAAA,IACxC;AACA,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAMA,IAAAA;AAAA,MACN,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,KAAA,EAAO,QAAA;AAAA,MACP,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,KAAK,CAAC,CAAA;AAE1D,EAAA,MAAM,IAAA,GAAO,sBAAsB,QAAQ,CAAA;AAC3C,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,OAAO,CAAA;AAC5B,EAAA,MAAM,MAAA,GAAS,OAAO,cAAA,CAAe;AAAA,IACnC,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,KAAA,EAAO,QAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AAED,EAAA,IAAI,aAAA,CAAc,GAAG,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AACxE,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,MAAA,GAAA,CAAI,MAAM,IAAI,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAA,GAAI,gBAAA,CAAiB,OAAO,IAAI,CAAA;AAAA,IAC5E,CAAC,CAAA;AAAA,EACH,CAAA,MAAA,IAAW,CAAC,aAAA,CAAc,GAAG,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AAChF,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,MAAA,GAAA,CAAI,MAAM,CAAA,GAAI,MAAA,CAAO,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAC,CAAA,GAAI,MAAA,CAAO,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,IAC5F,CAAC,CAAA;AAAA,EACH,CAAA,MAAA,IAAW,CAAC,aAAA,CAAc,GAAG,KAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,IAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AAClF,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,MAAA,GAAA,CAAI,MAAM,IAAI,iBAAA,CAAkB,KAAA,EAAO,IAAI,CAAA,GAAI,iBAAA,CAAkB,OAAO,IAAI,CAAA;AAAA,IAC9E,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,MAAA;AACT;AAiBO,SAAS,SAAA,CAAU,GAAW,CAAA,EAAmB;AACtD,EAAA,kBAAA,CAAmB,GAAG,WAAW,CAAA;AACjC,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,CAAA,CAAE,KAAK,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA;AAC3B,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,IAAI,cAAc,GAAG,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AAC/C,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AACnC,IAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,gBAAA,CAAiB,CAAA,CAAE,IAAA,EAAM,SAAS,CAAA,GAAI,MAAA;AAAA,IACjD;AAAA,EACF,CAAA,MAAA,IAAW,CAAC,aAAA,CAAc,GAAG,KAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AACxD,IAAA,MAAM,UAAU,CAAA,CAAE,IAAA;AAClB,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAE3B,MAAA,IAAI,UAAA,IAAc,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AAChC,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,UAAA,GAAA,CAAI,CAAC,CAAA,GAAK,OAAA,CAAQ,CAAC,CAAA,GAAe,CAAA;AAAA,QACpC;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,UAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,UAAA,GAAA,CAAI,CAAC,CAAA,GAAI,iBAAA,CAAkB,OAAA,EAAS,SAAS,CAAA,GAAI,CAAA;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAiBO,SAAS,SAAA,CAAU,GAAW,CAAA,EAAmB;AACtD,EAAA,kBAAA,CAAmB,GAAG,WAAW,CAAA;AACjC,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,CAAA,CAAE,KAAK,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA;AAC3B,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,IAAI,cAAc,GAAG,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AAC/C,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AACnC,IAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,gBAAA,CAAiB,CAAA,CAAE,IAAA,EAAM,SAAS,CAAA,GAAI,MAAA;AAAA,IACjD;AAAA,EACF,CAAA,MAAA,IAAW,CAAC,aAAA,CAAc,GAAG,KAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AACxD,IAAA,MAAM,UAAU,CAAA,CAAE,IAAA;AAClB,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAE3B,MAAA,IAAI,UAAA,IAAc,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AAChC,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,UAAA,GAAA,CAAI,CAAC,CAAA,GAAK,OAAA,CAAQ,CAAC,CAAA,GAAe,CAAA;AAAA,QACpC;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,UAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,UAAA,GAAA,CAAI,CAAC,CAAA,GAAI,iBAAA,CAAkB,OAAA,EAAS,SAAS,CAAA,GAAI,CAAA;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAkBO,SAAS,QAAA,CAAS,GAAW,CAAA,EAAmB;AACrD,EAAA,kBAAA,CAAmB,GAAG,UAAU,CAAA;AAChC,EAAA,kBAAA,CAAmB,GAAG,UAAU,CAAA;AAChC,EAAA,eAAA,CAAgB,GAAG,CAAC,CAAA;AACpB,EAAA,yBAAA,CAA0B,GAAG,CAAC,CAAA;AAE9B,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,KAAK,CAAC,CAAA;AAE1D,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,CAAA,CAAE,KAAK,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,OAAO,CAAA;AAC5B,EAAA,MAAM,MAAA,GAAS,OAAO,cAAA,CAAe;AAAA,IACnC,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AAED,EAAA,IAAI,aAAA,CAAc,GAAG,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AACxE,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,MAAA,GAAA,CAAI,MAAM,CAAA,GAAI,cAAA,CAAe,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAA,EAAG,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,IAC3F,CAAC,CAAA;AAAA,EACH,CAAA,MAAA,IAAW,CAAC,aAAA,CAAc,GAAG,KAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,IAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AAClF,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,MAAA,GAAA,CAAI,MAAM,CAAA,GAAI,cAAA,CAAe,iBAAA,CAAkB,KAAA,EAAO,IAAI,CAAA,EAAG,iBAAA,CAAkB,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,IAC7F,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,MAAA;AACT;AAkBO,SAAS,GAAA,CAAI,GAAW,CAAA,EAAmB;AAChD,EAAA,kBAAA,CAAmB,GAAG,KAAK,CAAA;AAC3B,EAAA,kBAAA,CAAmB,GAAG,KAAK,CAAA;AAC3B,EAAA,eAAA,CAAgB,GAAG,CAAC,CAAA;AACpB,EAAA,yBAAA,CAA0B,GAAG,CAAC,CAAA;AAE9B,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,KAAK,CAAC,CAAA;AAE1D,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,CAAA,CAAE,KAAK,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,OAAO,CAAA;AAC5B,EAAA,MAAM,MAAA,GAAS,OAAO,cAAA,CAAe;AAAA,IACnC,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AAED,EAAA,IAAI,aAAA,CAAc,GAAG,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AACxE,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,MAAA,GAAA,CAAI,MAAM,CAAA,GAAI,SAAA,CAAU,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAA,EAAG,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,IACtF,CAAC,CAAA;AAAA,EACH,CAAA,MAAA,IAAW,CAAC,aAAA,CAAc,GAAG,KAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,IAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AAClF,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,MAAA,GAAA,CAAI,MAAM,CAAA,GAAI,SAAA,CAAU,iBAAA,CAAkB,KAAA,EAAO,IAAI,CAAA,EAAG,iBAAA,CAAkB,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,IACxF,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,MAAA;AACT;AAkBO,SAAS,GAAA,CAAI,GAAW,CAAA,EAAmB;AAChD,EAAA,kBAAA,CAAmB,GAAG,KAAK,CAAA;AAC3B,EAAA,kBAAA,CAAmB,GAAG,KAAK,CAAA;AAC3B,EAAA,eAAA,CAAgB,GAAG,CAAC,CAAA;AACpB,EAAA,yBAAA,CAA0B,GAAG,CAAC,CAAA;AAE9B,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,KAAK,CAAC,CAAA;AAE1D,EAAA,MAAM,cAAA,GAAA,CAAkB,EAAE,KAAA,KAAU,OAAA,IAAW,EAAE,KAAA,KAAU,OAAA,KAAY,oBAAoB,CAAC,CAAA;AAC5F,EAAA,MAAM,QAAA,GAAW,cAAA,GAAiB,SAAA,GAAY,CAAA,CAAE,KAAA;AAChD,EAAA,MAAM,IAAA,GAAO,sBAAsB,QAAQ,CAAA;AAC3C,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,OAAO,CAAA;AAC5B,EAAA,MAAM,MAAA,GAAS,OAAO,cAAA,CAAe;AAAA,IACnC,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,KAAA,EAAO,QAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AAED,EAAA,IAAI,QAAA,KAAa,SAAA,IAAa,QAAA,KAAa,SAAA,EAAW;AACpD,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAGhB,IAAA,IAAI,aAAA,CAAc,KAAK,CAAA,EAAG;AACxB,MAAA,IAAI,aAAA,CAAc,KAAK,CAAA,EAAG;AACxB,QAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,UAAA,GAAA,CAAI,MAAM,CAAA,GACR,MAAA,CAAO,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAC,CAAA,IAAK,MAAA,CAAO,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,QACjF,CAAC,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,UAAA,GAAA,CAAI,MAAM,CAAA,GAAI,MAAA,CAAO,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAC,CAAA,IAAK,iBAAA,CAAkB,KAAA,EAAO,IAAI,CAAA;AAAA,QACtF,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAI,aAAA,CAAc,KAAK,CAAA,EAAG;AACxB,QAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,UAAA,GAAA,CAAI,MAAM,CAAA,GAAI,iBAAA,CAAkB,KAAA,EAAO,IAAI,KAAK,MAAA,CAAO,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,QACtF,CAAC,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,UAAA,GAAA,CAAI,MAAM,IAAI,iBAAA,CAAkB,KAAA,EAAO,IAAI,CAAA,IAAK,iBAAA,CAAkB,OAAO,IAAI,CAAA;AAAA,QAC/E,CAAC,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAA,MAAA,IAAW,aAAA,CAAc,GAAG,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AAC/E,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,MAAA,GAAA,CAAI,MAAM,IAAI,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAA,IAAK,gBAAA,CAAiB,OAAO,IAAI,CAAA;AAAA,IAC7E,CAAC,CAAA;AAAA,EACH,CAAA,MAAA,IAAW,CAAC,aAAA,CAAc,GAAG,KAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,IAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AAClF,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,MAAA,GAAA,CAAI,MAAM,IAAI,iBAAA,CAAkB,KAAA,EAAO,IAAI,CAAA,IAAK,iBAAA,CAAkB,OAAO,IAAI,CAAA;AAAA,IAC/E,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,MAAA;AACT;AAeO,SAAS,IAAI,CAAA,EAAmB;AACrC,EAAA,kBAAA,CAAmB,GAAG,KAAK,CAAA;AAC3B,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,CAAA,CAAE,KAAK,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA;AAC3B,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,IAAI,cAAc,GAAG,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AAC/C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAC,gBAAA,CAAiB,CAAA,CAAE,MAAM,SAAS,CAAA;AAAA,IAC9C;AAAA,EACF,CAAA,MAAA,IAAW,CAAC,aAAA,CAAc,GAAG,KAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AACxD,IAAA,MAAM,UAAU,CAAA,CAAE,IAAA;AAClB,IAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,OAAO,KAAK,UAAA,IAAc,CAAA,CAAE,WAAW,CAAA,EAAG;AAC3D,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAE,OAAA,CAAQ,CAAC,CAAA;AAAA,MACtB;AAAA,IACF,CAAA,MAAO;AACL,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,QAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAC,iBAAA,CAAkB,CAAA,CAAE,MAAM,SAAS,CAAA;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAiBO,SAAS,IAAI,CAAA,EAAmB;AACrC,EAAA,kBAAA,CAAmB,GAAG,KAAK,CAAA;AAC3B,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,CAAA,CAAE,KAAK,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA;AAC3B,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,IAAI,cAAc,GAAG,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AAC/C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,CAAA,CAAE,IAAA,EAAM,SAAS,CAAA;AAC9C,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA,GAAM,EAAA,GAAK,CAAC,GAAA,GAAM,GAAA;AAAA,IAC7B;AAAA,EACF,CAAA,MAAA,IAAW,CAAC,aAAA,CAAc,GAAG,KAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AACxD,IAAA,MAAM,UAAU,CAAA,CAAE,IAAA;AAClB,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAE3B,MAAA,IAAI,UAAA,IAAc,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AAChC,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,UAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAW,CAAA;AAAA,QACxC;AAAA,MACF,CAAA,MAAO;AACL,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,UAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,UAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,IAAI,iBAAA,CAAkB,OAAA,EAAS,SAAS,CAAC,CAAA;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAiBO,SAAS,KAAK,CAAA,EAAmB;AACtC,EAAA,kBAAA,CAAmB,GAAG,MAAM,CAAA;AAC5B,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,CAAA,CAAE,KAAK,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA;AAC3B,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,IAAI,cAAc,GAAG,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AAC/C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,CAAA,CAAE,IAAA,EAAM,SAAS,CAAA;AAC9C,MAAA,GAAA,CAAI,CAAC,IAAI,GAAA,GAAM,EAAA,GAAK,CAAC,EAAA,GAAK,GAAA,GAAM,KAAK,EAAA,GAAK,EAAA;AAAA,IAC5C;AAAA,EACF,CAAA,MAAA,IAAW,CAAC,aAAA,CAAc,GAAG,KAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AACxD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,IAAI,IAAA,CAAK,IAAA,CAAK,kBAAkB,CAAA,CAAE,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACzD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAeO,SAAS,WAAW,CAAA,EAAmB;AAC5C,EAAA,kBAAA,CAAmB,GAAG,YAAY,CAAA;AAClC,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,CAAA,CAAE,KAAK,CAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,sBAAsB,QAAQ,CAAA;AAC3C,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA;AAC3B,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,IAAI,cAAc,GAAG,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AAC/C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,CAAA,CAAE,IAAA,EAAM,SAAS,CAAA;AAC9C,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA,KAAQ,EAAA,GAAK,KAAK,EAAA,GAAK,GAAA;AAAA,IAClC;AAAA,EACF,CAAA,MAAA,IAAW,CAAC,aAAA,CAAc,GAAG,KAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AACvD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,IAAI,CAAA,GAAI,MAAA,CAAO,iBAAiB,CAAA,CAAE,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACzD;AAAA,EACF,CAAA,MAAA,IAAW,CAAC,aAAA,CAAc,GAAG,KAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AACxD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA,GAAI,iBAAA,CAAkB,CAAA,CAAE,MAAM,SAAS,CAAA;AAAA,IAClD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,QAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAgBO,SAAS,OAAA,CAAQ,GAAW,CAAA,EAAmB;AACpD,EAAA,kBAAA,CAAmB,GAAG,SAAS,CAAA;AAC/B,EAAA,kBAAA,CAAmB,GAAG,SAAS,CAAA;AAC/B,EAAA,eAAA,CAAgB,GAAG,CAAC,CAAA;AACpB,EAAA,yBAAA,CAA0B,GAAG,CAAC,CAAA;AAE9B,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,KAAK,CAAC,CAAA;AAE1D,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,CAAA,CAAE,KAAK,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,OAAO,CAAA;AAC5B,EAAA,MAAM,MAAA,GAAS,OAAO,cAAA,CAAe;AAAA,IACnC,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AAED,EAAA,IAAI,aAAA,CAAc,GAAG,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AACxE,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,MAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAA;AACvC,MAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAA;AACvC,MAAA,GAAA,CAAI,MAAM,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAAA,IAC/B,CAAC,CAAA;AAAA,EACH,CAAA,MAAA,IAAW,CAAC,aAAA,CAAc,GAAG,KAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,IAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AAClF,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,MAAA,GAAA,CAAI,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,iBAAA,CAAkB,KAAA,EAAO,IAAI,CAAA,EAAG,iBAAA,CAAkB,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,IACvF,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,MAAA;AACT;AAgBO,SAAS,OAAA,CAAQ,GAAW,CAAA,EAAmB;AACpD,EAAA,kBAAA,CAAmB,GAAG,SAAS,CAAA;AAC/B,EAAA,kBAAA,CAAmB,GAAG,SAAS,CAAA;AAC/B,EAAA,eAAA,CAAgB,GAAG,CAAC,CAAA;AACpB,EAAA,yBAAA,CAA0B,GAAG,CAAC,CAAA;AAE9B,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,KAAK,CAAC,CAAA;AAE1D,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,CAAA,CAAE,KAAK,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,OAAO,CAAA;AAC5B,EAAA,MAAM,MAAA,GAAS,OAAO,cAAA,CAAe;AAAA,IACnC,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AAED,EAAA,IAAI,aAAA,CAAc,GAAG,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AACxE,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,MAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAA;AACvC,MAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAA;AACvC,MAAA,GAAA,CAAI,MAAM,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAAA,IAC/B,CAAC,CAAA;AAAA,EACH,CAAA,MAAA,IAAW,CAAC,aAAA,CAAc,GAAG,KAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,IAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AAClF,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,KAAK,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,MAAA,MAAM,IAAI,WAAW,yCAAyC,CAAA;AAAA,IAChE;AACA,IAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,MAAA,GAAA,CAAI,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,iBAAA,CAAkB,KAAA,EAAO,IAAI,CAAA,EAAG,iBAAA,CAAkB,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,IACvF,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,MAAA;AACT;AAsBO,SAAS,IAAA,CAAK,CAAA,EAAWF,IAAAA,EAAcD,IAAAA,EAAsB;AAClE,EAAA,kBAAA,CAAmB,GAAG,MAAM,CAAA;AAC5B,EAAA,IAAIC,IAAAA,KAAQ,MAAA,IAAaD,IAAAA,KAAQ,MAAA,IAAaC,OAAMD,IAAAA,EAAK;AACvD,IAAA,MAAM,IAAI,qBAAA,CAAsB,CAAA,WAAA,EAAcC,IAAG,CAAA,kBAAA,EAAqBD,IAAG,KAAK,SAAA,EAAW;AAAA,MACvF,GAAA,EAAAC,IAAAA;AAAA,MACA,GAAA,EAAAD;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,CAAA,CAAE,KAAK,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA;AAC3B,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,IAAI,cAAc,GAAG,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AAC/C,IAAA,MAAM,MAAA,GAASC,SAAQ,MAAA,GAAY,MAAA,CAAO,KAAK,KAAA,CAAMA,IAAG,CAAC,CAAA,GAAI,MAAA;AAC7D,IAAA,MAAM,MAAA,GAASD,SAAQ,MAAA,GAAY,MAAA,CAAO,KAAK,KAAA,CAAMA,IAAG,CAAC,CAAA,GAAI,MAAA;AAE7D,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,IAAI,GAAA,GAAM,gBAAA,CAAiB,CAAA,CAAE,IAAA,EAAM,SAAS,CAAA;AAC5C,MAAA,IAAI,MAAA,KAAW,MAAA,IAAa,GAAA,GAAM,MAAA,EAAQ,GAAA,GAAM,MAAA;AAChD,MAAA,IAAI,MAAA,KAAW,MAAA,IAAa,GAAA,GAAM,MAAA,EAAQ,GAAA,GAAM,MAAA;AAChD,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA;AAAA,IACX;AAAA,EACF,CAAA,MAAA,IAAW,CAAC,aAAA,CAAc,GAAG,KAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AACxD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,IAAI,GAAA,GAAM,iBAAA,CAAkB,CAAA,CAAE,IAAA,EAAM,SAAS,CAAA;AAC7C,MAAA,IAAIC,IAAAA,KAAQ,MAAA,IAAa,GAAA,GAAMA,IAAAA,EAAK,GAAA,GAAMA,IAAAA;AAC1C,MAAA,IAAID,IAAAA,KAAQ,MAAA,IAAa,GAAA,GAAMA,IAAAA,EAAK,GAAA,GAAMA,IAAAA;AAC1C,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA;AAAA,IACX;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;;;AClhCA,SAAS,YAAA,CACP,CAAA,EACA,CAAA,EACA,EAAA,EACS;AACT,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,OAAO,MAAM,QAAA,EAAU;AAClD,IAAA,QAAQ,EAAA;AAAI,MACV,KAAK,IAAA;AACH,QAAA,OAAO,CAAA,KAAM,CAAA;AAAA,MACf,KAAK,KAAA;AACH,QAAA,OAAO,CAAA,KAAM,CAAA;AAAA,MACf,KAAK,IAAA;AACH,QAAA,OAAO,CAAA,GAAI,CAAA;AAAA,MACb,KAAK,IAAA;AACH,QAAA,OAAO,CAAA,IAAK,CAAA;AAAA,MACd,KAAK,IAAA;AACH,QAAA,OAAO,CAAA,GAAI,CAAA;AAAA,MACb,KAAK,IAAA;AACH,QAAA,OAAO,CAAA,IAAK,CAAA;AAAA;AAChB,EACF;AAEA,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,OAAO,MAAM,QAAA,EAAU;AAClD,IAAA,QAAQ,EAAA;AAAI,MACV,KAAK,IAAA;AACH,QAAA,OAAO,CAAA,KAAM,CAAA;AAAA,MACf,KAAK,KAAA;AACH,QAAA,OAAO,CAAA,KAAM,CAAA;AAAA,MACf,KAAK,IAAA;AACH,QAAA,OAAO,CAAA,GAAI,CAAA;AAAA,MACb,KAAK,IAAA;AACH,QAAA,OAAO,CAAA,IAAK,CAAA;AAAA,MACd,KAAK,IAAA;AACH,QAAA,OAAO,CAAA,GAAI,CAAA;AAAA,MACb,KAAK,IAAA;AACH,QAAA,OAAO,CAAA,IAAK,CAAA;AAAA;AAChB,EACF;AAGA,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI,MAAA;AAEJ,EAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AACzB,IAAA,GAAA,GAAM,CAAA;AACN,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,MAAM,IAAI,aAAa,iCAAiC,CAAA;AACnF,IAAA,GAAA,GAAM,CAAA;AACN,IAAA,MAAA,GAAS,IAAA;AAAA,EACX,CAAA,MAAO;AACL,IAAA,GAAA,GAAM,CAAA;AACN,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,MAAM,IAAI,aAAa,iCAAiC,CAAA;AACnF,IAAA,GAAA,GAAM,CAAA;AACN,IAAA,MAAA,GAAS,KAAA;AAAA,EACX;AAEA,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,SAAU,EAAA,KAAO,KAAA;AACrC,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,IAAI,EAAA,KAAO,MAAM,OAAO,KAAA;AACxB,IAAA,IAAI,EAAA,KAAO,OAAO,OAAO,IAAA;AAEzB,IAAA,IAAI,MAAA,EAAQ,OAAO,EAAA,KAAO,IAAA,IAAQ,EAAA,KAAO,IAAA;AACzC,IAAA,OAAO,EAAA,KAAO,QAAQ,EAAA,KAAO,IAAA;AAAA,EAC/B;AACA,EAAA,IAAI,QAAQ,CAAA,QAAA,EAAW;AACrB,IAAA,IAAI,EAAA,KAAO,MAAM,OAAO,KAAA;AACxB,IAAA,IAAI,EAAA,KAAO,OAAO,OAAO,IAAA;AAEzB,IAAA,IAAI,MAAA,EAAQ,OAAO,EAAA,KAAO,IAAA,IAAQ,EAAA,KAAO,IAAA;AACzC,IAAA,OAAO,EAAA,KAAO,QAAQ,EAAA,KAAO,IAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,MAAA,CAAO,SAAA,CAAU,GAAG,CAAA,EAAG;AACzB,IAAA,MAAM,MAAA,GAAS,OAAO,GAAG,CAAA;AACzB,IAAA,MAAM,CAAA,GAAI,SAAS,GAAA,GAAM,MAAA;AACzB,IAAA,MAAM,CAAA,GAAI,SAAS,MAAA,GAAS,GAAA;AAC5B,IAAA,QAAQ,EAAA;AAAI,MACV,KAAK,IAAA;AACH,QAAA,OAAO,CAAA,KAAM,CAAA;AAAA,MACf,KAAK,KAAA;AACH,QAAA,OAAO,CAAA,KAAM,CAAA;AAAA,MACf,KAAK,IAAA;AACH,QAAA,OAAO,CAAA,GAAI,CAAA;AAAA,MACb,KAAK,IAAA;AACH,QAAA,OAAO,CAAA,IAAK,CAAA;AAAA,MACd,KAAK,IAAA;AACH,QAAA,OAAO,CAAA,GAAI,CAAA;AAAA,MACb,KAAK,IAAA;AACH,QAAA,OAAO,CAAA,IAAK,CAAA;AAAA;AAChB,EACF;AAGA,EAAA,IAAI,EAAA,KAAO,MAAM,OAAO,KAAA;AACxB,EAAA,IAAI,EAAA,KAAO,OAAO,OAAO,IAAA;AAEzB,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAIvC,EAAA,IAAI,MAAA,EAAQ;AAEV,IAAA,IAAI,EAAA,KAAO,IAAA,IAAQ,EAAA,KAAO,IAAA,SAAa,GAAA,GAAM,QAAA;AAC7C,IAAA,OAAO,GAAA,IAAO,QAAA;AAAA,EAChB,CAAA,MAAO;AAIL,IAAA,IAAI,EAAA,KAAO,IAAA,IAAQ,EAAA,KAAO,IAAA,SAAa,QAAA,IAAY,GAAA;AACnD,IAAA,OAAO,QAAA,GAAW,GAAA;AAAA,EACpB;AACF;AAEA,SAAS,aAAA,CAAc,CAAA,EAAW,CAAA,EAAW,EAAA,EAAsD;AACjG,EAAA,IAAI,CAAA,CAAE,KAAA,KAAU,QAAA,IAAY,CAAA,CAAE,UAAU,QAAA,EAAU;AAChD,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,EAAG,EAAE,CAAA,oCAAA,CAAsC,CAAA;AAAA,EAClE;AAEA,EAAA,yBAAA,CAA0B,GAAG,CAAC,CAAA;AAE9B,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,CAAA,CAAE,IAAA,EAAM,EAAE,CAAA;AAC3C,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,CAAA,CAAE,IAAA,EAAM,EAAE,CAAA;AAE3C,EAAA,MAAM,SAAA,GAAY,SAAS,CAAC,CAAA;AAC5B,EAAA,MAAM,SAAA,GAAY,SAAS,CAAC,CAAA;AAC5B,EAAA,MAAM,QAAA,GAAkB,SAAA,GACpB,CAAA,CAAE,KAAA,GACF,SAAA,GACE,CAAA,CAAE,KAAA,GACF,iBAAA,CAAkB,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,KAAK,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,KAAK,CAAC,CAAA;AAE1D,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,OAAO,CAAA;AAClC,EAAA,MAAM,MAAA,GAAS,OAAO,cAAA,CAAe;AAAA,IACnC,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AAMD,EAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AAEnD,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,KAAA,EAAO,IAAI,CAAA;AACpC,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,KAAA,EAAO,IAAI,CAAA;AACpC,IAAA,GAAA,CAAI,MAAM,CAAA,GAAI,YAAA,CAAa,MAAM,IAAA,EAAM,EAAE,IAAI,CAAA,GAAI,CAAA;AAAA,EACnD,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAQO,SAAS,KAAA,CAAM,GAAW,CAAA,EAAmB;AAClD,EAAA,OAAO,aAAA,CAAc,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA;AACjC;AAYO,SAAS,QAAA,CAAS,GAAW,CAAA,EAAmB;AACrD,EAAA,OAAO,aAAA,CAAc,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AAClC;AAYO,SAAS,OAAA,CAAQ,GAAW,CAAA,EAAmB;AACpD,EAAA,OAAO,aAAA,CAAc,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA;AACjC;AASO,SAAS,YAAA,CAAa,GAAW,CAAA,EAAmB;AACzD,EAAA,OAAO,aAAA,CAAc,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA;AACjC;AASO,SAAS,IAAA,CAAK,GAAW,CAAA,EAAmB;AACjD,EAAA,OAAO,aAAA,CAAc,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA;AACjC;AASO,SAAS,SAAA,CAAU,GAAW,CAAA,EAAmB;AACtD,EAAA,OAAO,aAAA,CAAc,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA;AACjC;AAeO,SAAS,QAAQ,CAAA,EAAW,CAAA,EAAW,IAAA,GAAe,IAAA,EAAM,OAAe,IAAA,EAAc;AAC9F,EAAA,IAAI,CAAA,CAAE,KAAA,KAAU,QAAA,IAAY,CAAA,CAAE,UAAU,QAAA,EAAU;AAChD,IAAA,MAAM,IAAI,WAAW,6CAA6C,CAAA;AAAA,EACpE;AAEA,EAAA,yBAAA,CAA0B,GAAG,CAAC,CAAA;AAE9B,EAAA,MAAM,SAAA,GAAY,SAAS,CAAC,CAAA;AAC5B,EAAA,MAAM,SAAA,GAAY,SAAS,CAAC,CAAA;AAC5B,EAAA,MAAM,QAAA,GAAkB,SAAA,GACpB,CAAA,CAAE,KAAA,GACF,SAAA,GACE,CAAA,CAAE,KAAA,GACF,iBAAA,CAAkB,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,KAAK,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,KAAK,CAAC,CAAA;AAE1D,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,OAAO,CAAA;AAClC,EAAA,MAAM,MAAA,GAAS,OAAO,cAAA,CAAe;AAAA,IACnC,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AAGD,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,CAAA,CAAE,IAAA,EAAM,SAAS,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,CAAA,CAAE,IAAA,EAAM,SAAS,CAAA;AAElD,EAAA,IAAI,aAAA,CAAc,KAAK,CAAA,IAAK,aAAA,CAAc,KAAK,CAAA,EAAG;AAChD,IAAA,MAAM,IAAI,WAAW,0CAA0C,CAAA;AAAA,EACjE;AAEA,EAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AAEnD,IAAA,MAAM,EAAA,GAAK,YAAA,CAAa,KAAA,EAAO,IAAI,CAAA;AACnC,IAAA,MAAM,EAAA,GAAK,YAAA,CAAa,KAAA,EAAO,IAAI,CAAA;AAGnC,IAAA,MAAMI,KAAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA;AAC7B,IAAA,MAAM,SAAA,GAAY,IAAA,GAAO,IAAA,GAAO,IAAA,CAAK,IAAI,EAAE,CAAA;AAC3C,IAAA,GAAA,CAAI,MAAM,CAAA,GAAIA,KAAAA,IAAQ,SAAA,GAAY,CAAA,GAAI,CAAA;AAAA,EACxC,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAcO,SAAS,SAAS,CAAA,EAAW,CAAA,EAAW,IAAA,GAAe,IAAA,EAAM,OAAe,IAAA,EAAe;AAChG,EAAA,IAAI,CAAA,CAAE,KAAA,KAAU,QAAA,IAAY,CAAA,CAAE,UAAU,QAAA,EAAU;AAChD,IAAA,MAAM,IAAI,WAAW,0CAA0C,CAAA;AAAA,EACjE;AAEA,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,CAAA,CAAE,IAAA,EAAM,UAAU,CAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,CAAA,CAAE,IAAA,EAAM,UAAU,CAAA;AAEnD,EAAA,IAAI,aAAA,CAAc,KAAK,CAAA,IAAK,aAAA,CAAc,KAAK,CAAA,EAAG;AAChD,IAAA,MAAM,IAAI,WAAW,2CAA2C,CAAA;AAAA,EAClE;AAEA,EAAA,MAAM,SAAA,GAAY,SAAS,CAAC,CAAA;AAC5B,EAAA,MAAM,SAAA,GAAY,SAAS,CAAC,CAAA;AAC5B,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,QAAA,GAAW,CAAA,CAAE,KAAA;AAAA,EACf,WAAW,SAAA,EAAW;AACpB,IAAA,QAAA,GAAW,CAAA,CAAE,KAAA;AAAA,EACf,CAAA,MAAO;AACL,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,iBAAA,CAAkB,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,KAAK,CAAA;AAAA,IAC/C,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,KAAK,CAAC,CAAA;AAC1D,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,MAAM,EAAA,GAAK,YAAA,CAAa,KAAA,EAAO,CAAA,CAAE,MAAM,CAAA;AACvC,IAAA,MAAM,EAAA,GAAK,YAAA,CAAa,KAAA,EAAO,CAAA,CAAE,MAAM,CAAA;AACvC,IAAA,MAAMA,KAAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA;AAC7B,IAAA,MAAM,SAAA,GAAY,IAAA,GAAO,IAAA,GAAO,IAAA,CAAK,IAAI,EAAE,CAAA;AAC3C,IAAA,OAAOA,KAAAA,IAAQ,SAAA;AAAA,EACjB;AAGA,EAAA,MAAM,OAAO,QAAA,CAAS,MAAA;AACtB,EAAA,MAAM,WAAW,IAAI,KAAA,CAAc,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAC/C,EAAA,MAAM,WAAW,IAAI,KAAA,CAAc,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAE/C,EAAA,MAAM,SAAA,GAAY,OAAO,CAAA,CAAE,IAAA;AAC3B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,CAAA,GAAI,SAAS,CAAA,IAAK,CAAA;AACtC,MAAA,IAAI,MAAM,CAAA,EAAG;AACX,QAAA,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,CAAA,GAAI,SAAS,CAAA,IAAK,CAAA;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,OAAO,CAAA,CAAE,IAAA;AAC3B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,CAAA,GAAI,SAAS,CAAA,IAAK,CAAA;AACtC,MAAA,IAAI,MAAM,CAAA,EAAG;AACX,QAAA,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,CAAA,GAAI,SAAS,CAAA,IAAK,CAAA;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,MAAM,IAAI,KAAA,CAAc,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAC1C,EAAA,IAAI,OAAO,CAAA,CAAE,MAAA;AACb,EAAA,IAAI,OAAO,CAAA,CAAE,MAAA;AAEb,EAAA,OAAO,IAAA,EAAM;AAGX,IAAA,MAAM,EAAA,GAAK,YAAA,CAAa,KAAA,EAAO,IAAI,CAAA;AACnC,IAAA,MAAM,EAAA,GAAK,YAAA,CAAa,KAAA,EAAO,IAAI,CAAA;AAEnC,IAAA,MAAMA,KAAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA;AAC7B,IAAA,MAAM,SAAA,GAAY,IAAA,GAAO,IAAA,GAAO,IAAA,CAAK,IAAI,EAAE,CAAA;AAC3C,IAAA,IAAIA,QAAO,SAAA,EAAW;AACpB,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,OAAO,IAAA,GAAO,CAAA;AAClB,IAAA,WAAS;AACP,MAAA,MAAM,UAAA,GAAa,GAAA,CAAI,IAAI,CAAA,IAAK,CAAA;AAChC,MAAA,MAAM,UAAU,UAAA,GAAa,CAAA;AAC7B,MAAA,GAAA,CAAI,IAAI,CAAA,GAAI,OAAA;AAEZ,MAAA,MAAM,OAAA,GAAU,SAAS,IAAI,CAAA;AAC7B,MAAA,MAAM,OAAA,GAAU,SAAS,IAAI,CAAA;AAC7B,MAAA,MAAM,GAAA,GAAM,SAAS,IAAI,CAAA;AAEzB,MAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,MAAA,IAAa,QAAQ,MAAA,EAAW;AAEvE,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,IAAA,IAAQ,OAAA;AACR,MAAA,IAAA,IAAQ,OAAA;AAER,MAAA,IAAI,UAAU,GAAA,EAAK;AACjB,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,KAAA,GAAQ,OAAA;AACd,MAAA,IAAA,IAAQ,OAAA,GAAU,KAAA;AAClB,MAAA,IAAA,IAAQ,OAAA,GAAU,KAAA;AAClB,MAAA,GAAA,CAAI,IAAI,CAAA,GAAI,CAAA;AACZ,MAAA,IAAA,EAAA;AAEA,MAAA,IAAI,IAAA,GAAO,GAAG,OAAO,IAAA;AAAA,IACvB;AAAA,EACF;AACF;AAWO,SAAS,UAAA,CAAW,GAAW,CAAA,EAAoB;AAExD,EAAA,IAAI,EAAE,IAAA,KAAS,CAAA,CAAE,QAAQ,CAAA,CAAE,IAAA,KAAS,EAAE,IAAA,EAAM;AAC1C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,IAAA,IAAI,EAAE,KAAA,CAAM,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,EAAG;AAC7B,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IAAI,CAAA,CAAE,KAAA,KAAU,CAAA,CAAE,KAAA,EAAO;AACvB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,IAAI,KAAA,CAAM,QAAQ,CAAA,CAAE,IAAI,KAAK,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA,EAAG;AAClD,MAAA,MAAMC,gBAAAA,GAAkB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC9C,MAAA,MAAMC,gBAAAA,GAAkB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC9C,MAAA,MAAMC,YAAAA,GAAc,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AACnD,MAAA,MAAMC,YAAAA,GAAc,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AACnD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,OAAA,GAAU,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQD,YAAAA,EAAaF,gBAAAA,EAAiB,EAAE,OAAO,CAAA;AAC/E,QAAA,MAAM,OAAA,GAAU,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQG,YAAAA,EAAaF,gBAAAA,EAAiB,EAAE,OAAO,CAAA;AAC/E,QAAA,IAAI,EAAE,IAAA,CAAK,OAAO,MAAM,CAAA,CAAE,IAAA,CAAK,OAAO,CAAA,EAAG;AACvC,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,CAAA,CAAE,IAAA,EAAM,YAAY,CAAA;AACrD,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,CAAA,CAAE,IAAA,EAAM,YAAY,CAAA;AACrD,EAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC9C,EAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC9C,EAAA,MAAM,WAAA,GAAc,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AACnD,EAAA,MAAM,WAAA,GAAc,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAGnD,EAAA,IAAI,aAAA,CAAc,KAAK,CAAA,IAAK,aAAA,CAAc,KAAK,CAAA,EAAG;AAChD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,OAAA,GAAU,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,WAAA,EAAa,eAAA,EAAiB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,OAAA,GAAU,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,WAAA,EAAa,eAAA,EAAiB,EAAE,OAAO,CAAA;AAC/E,MAAA,IAAI,iBAAiB,KAAA,EAAO,OAAO,MAAM,gBAAA,CAAiB,KAAA,EAAO,OAAO,CAAA,EAAG;AACzE,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF,CAAA,MAAA,IAAW,CAAC,aAAA,CAAc,KAAK,KAAK,CAAC,aAAA,CAAc,KAAK,CAAA,EAAG;AACzD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,OAAA,GAAU,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,WAAA,EAAa,eAAA,EAAiB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,OAAA,GAAU,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,WAAA,EAAa,eAAA,EAAiB,EAAE,OAAO,CAAA;AAC/E,MAAA,IAAI,kBAAkB,KAAA,EAAO,OAAO,MAAM,iBAAA,CAAkB,KAAA,EAAO,OAAO,CAAA,EAAG;AAC3E,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAUO,SAAS,MAAM,CAAA,EAAmB;AACvC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,yCAAyC,CAAA;AAAA,EAChE;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,CAAA,CAAE,IAAI,CAAA;AAEjC,EAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,CAAA,CAAE,IAAA,EAAM,OAAO,CAAA;AAC/C,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAGlD,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AAEvB,IAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EACZ,CAAA,MAAO;AAEL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAA;AAC7C,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,GAAG,IAAI,CAAA,GAAI,CAAA;AAAA,IACnC;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,MAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAWO,SAAS,MAAM,CAAA,EAAmB;AACvC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,yCAAyC,CAAA;AAAA,EAChE;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,CAAA,CAAE,IAAI,CAAA;AAEjC,EAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,CAAA,CAAE,IAAA,EAAM,OAAO,CAAA;AAC/C,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAGlD,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,IAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EACZ,CAAA,MAAO;AAEL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAA;AAE7C,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAC,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,IAAK,CAAC,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,IAC7D;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,MAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAUO,SAAS,SAAS,CAAA,EAAmB;AAC1C,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,4CAA4C,CAAA;AAAA,EACnE;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,CAAA,CAAE,IAAI,CAAA;AAEjC,EAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,CAAA,CAAE,IAAA,EAAM,UAAU,CAAA;AAClD,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAGlD,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,IAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EACZ,CAAA,MAAO;AAEL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAA;AAC7C,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,GAAG,IAAI,CAAA,GAAI,CAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,MAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;;;AClmBA,SAAS,gBAAA,CACP,IAAA,EACA,IAAA,EACA,QAAA,EACM;AACN,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,IAAA,CAAK,SAAQ,EAAG;AACnC,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAC,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,IAAK,CAAA,GAAI,QAAA,EAAU;AAC/D,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,CAAC,2BAA2B,QAAQ,CAAA,WAAA,EAAc,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA;AAAA,QACtE,IAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACF;AAaO,SAAS,MAAA,CACd,KAAA,EACA,UAAA,EACA,MAAA,EACA,OAAA,EACQ;AACR,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,6BAAA,EAAgC,KAAA,CAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EACpE;AACA,EAAA,IAAI,KAAA,CAAM,UAAU,QAAA,EAAU;AAC5B,IAAA,MAAM,IAAI,WAAW,wCAAwC,CAAA;AAAA,EAC/D;AAEA,EAAA,gBAAA,CAAiB,YAAA,EAAc,YAAY,CAAC,CAAA;AAC5C,EAAA,gBAAA,CAAiB,QAAA,EAAU,QAAQ,CAAC,CAAA;AACpC,EAAA,gBAAA,CAAiB,SAAA,EAAW,SAAS,CAAC,CAAA;AAEtC,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAChC,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AACnC,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAEhC,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,UAAA;AACjB,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,MAAA;AACjB,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,OAAA;AAEjB,EAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAA,CAAO,MAAA,GAAS,IAAI,EAAA,GAAK,EAAA,IAAM,EAAE,CAAA,GAAI,CAAA;AACvD,EAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAA,CAAO,KAAA,GAAQ,IAAI,EAAA,GAAK,EAAA,IAAM,EAAE,CAAA,GAAI,CAAA;AAEtD,EAAA,IAAI,IAAA,IAAQ,CAAA,IAAK,IAAA,IAAQ,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,CAAA,2BAAA,EAA8B,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,MAC1C,mBAAA;AAAA,MACA,EAAE,MAAM,IAAA;AAAK,KACf;AAAA,EACF;AAIA,EAAA,MAAM,OAAA,GAAU,WAAW,EAAA,GAAK,EAAA;AAChC,EAAA,MAAM,YAAY,IAAA,GAAO,IAAA;AACzB,EAAA,MAAM,QAAA,GAAkB,CAAC,KAAA,EAAO,SAAA,EAAW,OAAO,CAAA;AAElD,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,KAAA,CAAM,KAAK,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,IAAI,IAAA,CAAK,KAAA,GAAQ,YAAY,OAAO,CAAA;AAEpD,EAAA,MAAM,YAAY,KAAA,CAAM,IAAA;AACxB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC5B,IAAA,MAAM,IAAI,WAAW,wCAAwC,CAAA;AAAA,EAC/D;AAEA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAYrC,EAAA,IAAI,qBAAqB,aAAA,EAAe;AACtC,IAAA,IAAI,EAAE,mBAAmB,aAAA,CAAA,EAAgB;AACvC,MAAA,MAAM,IAAI,WAAW,qCAAqC,CAAA;AAAA,IAC5D;AACA,IAAA,MAAM,MAAA,GAAS,OAAA;AAEf,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,MAAA,MAAM,WAAA,GAAc,IAAI,SAAA,GAAY,OAAA;AACpC,MAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,QAAA;AAE5C,MAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,IAAA,EAAM,EAAA,EAAA,EAAM;AAChC,QAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,IAAA,EAAM,EAAA,EAAA,EAAM;AAChC,UAAA,MAAM,SAAA,GAAY,KAAK,IAAA,GAAO,EAAA;AAC9B,UAAA,MAAM,SAAA,GAAY,cAAc,SAAA,GAAY,OAAA;AAC5C,UAAA,IAAI,MAAA,GAAS,CAAA;AAEb,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,YAAA,MAAM,kBAAA,GAAqB,mBAAmB,CAAA,GAAI,QAAA;AAElD,YAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,EAAA,EAAI,EAAA,EAAA,EAAM;AAC9B,cAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAE1B,cAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,EAAA,EAAI,EAAA,EAAA,EAAM;AAC9B,gBAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAE1B,gBAAA,IAAI,GAAA,GAAM,EAAA;AACV,gBAAA,IAAI,MAAM,CAAA,IAAK,EAAA,GAAK,UAAU,EAAA,IAAM,CAAA,IAAK,KAAK,KAAA,EAAO;AACnD,kBAAA,MAAM,WAAA,GAAc,kBAAA,GAAqB,EAAA,GAAK,QAAA,GAAW,EAAA,GAAK,QAAA;AAC9D,kBAAA,GAAA,GAAM,gBAAA,CAAiB,WAAW,WAAW,CAAA;AAAA,gBAC/C;AAEA,gBAAA,MAAA,CAAO,SAAA,GAAY,MAAM,CAAA,GAAI,GAAA;AAC7B,gBAAA,MAAA,EAAA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,IAAI,mBAAmB,aAAA,EAAe;AACpC,MAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,IAC9D;AACA,IAAA,MAAM,MAAA,GAAS,OAAA;AAEf,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,MAAA,MAAM,WAAA,GAAc,IAAI,SAAA,GAAY,OAAA;AACpC,MAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,QAAA;AAE5C,MAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,IAAA,EAAM,EAAA,EAAA,EAAM;AAChC,QAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,IAAA,EAAM,EAAA,EAAA,EAAM;AAChC,UAAA,MAAM,SAAA,GAAY,KAAK,IAAA,GAAO,EAAA;AAC9B,UAAA,MAAM,SAAA,GAAY,cAAc,SAAA,GAAY,OAAA;AAC5C,UAAA,IAAI,MAAA,GAAS,CAAA;AAEb,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,YAAA,MAAM,kBAAA,GAAqB,mBAAmB,CAAA,GAAI,QAAA;AAElD,YAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,EAAA,EAAI,EAAA,EAAA,EAAM;AAC9B,cAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAE1B,cAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,EAAA,EAAI,EAAA,EAAA,EAAM;AAC9B,gBAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAE1B,gBAAA,IAAI,GAAA,GAAM,CAAA;AACV,gBAAA,IAAI,MAAM,CAAA,IAAK,EAAA,GAAK,UAAU,EAAA,IAAM,CAAA,IAAK,KAAK,KAAA,EAAO;AACnD,kBAAA,MAAM,WAAA,GAAc,kBAAA,GAAqB,EAAA,GAAK,QAAA,GAAW,EAAA,GAAK,QAAA;AAC9D,kBAAA,GAAA,GAAM,iBAAA,CAAkB,WAAW,WAAW,CAAA;AAAA,gBAChD;AAEA,gBAAA,MAAA,CAAO,SAAA,GAAY,MAAM,CAAA,GAAI,GAAA;AAC7B,gBAAA,MAAA,EAAA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,QAAQ,KAAA,CAAM;AAAA,GACf,CAAA;AACH;AAeO,SAAS,MAAA,CACd,IAAA,EACA,UAAA,EACA,UAAA,EACA,QACA,OAAA,EACQ;AACR,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,6BAAA,EAAgC,IAAA,CAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EACnE;AACA,EAAA,IAAI,IAAA,CAAK,UAAU,QAAA,EAAU;AAC3B,IAAA,MAAM,IAAI,WAAW,wCAAwC,CAAA;AAAA,EAC/D;AACA,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,2CAAA,EAA8C,UAAA,CAAW,MAAM,CAAA,CAAE,CAAA;AAAA,EACxF;AAEA,EAAA,gBAAA,CAAiB,YAAA,EAAc,YAAY,CAAC,CAAA;AAC5C,EAAA,gBAAA,CAAiB,QAAA,EAAU,QAAQ,CAAC,CAAA;AACpC,EAAA,gBAAA,CAAiB,SAAA,EAAW,SAAS,CAAC,CAAA;AAEtC,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAC/B,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAClC,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAE/B,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,UAAA;AACjB,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,MAAA;AACjB,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,OAAA;AAEjB,EAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAA,CAAO,MAAA,GAAS,IAAI,EAAA,GAAK,EAAA,IAAM,EAAE,CAAA,GAAI,CAAA;AACvD,EAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAA,CAAO,KAAA,GAAQ,IAAI,EAAA,GAAK,EAAA,IAAM,EAAE,CAAA,GAAI,CAAA;AACtD,EAAA,IAAI,IAAA,IAAQ,CAAA,IAAK,IAAA,IAAQ,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,CAAA,2BAAA,EAA8B,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,MAC1C,mBAAA;AAAA,MACA,EAAE,MAAM,IAAA;AAAK,KACf;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,WAAW,EAAA,GAAK,EAAA;AAChC,EAAA,MAAM,YAAY,IAAA,GAAO,IAAA;AAGzB,EAAA,IAAA,CACG,KAAK,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA,MAAO,UACxB,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,IAAK,OAAO,SAAA,IAAA,CACxB,IAAA,CAAK,MAAM,CAAC,CAAA,IAAK,OAAO,OAAA,EACzB;AACA,IAAA,MAAM,IAAI,UAAA;AAAA,MACR,CAAA,uCAAA,EAA0C,KAAK,CAAA,EAAA,EAAK,SAAS,KAAK,OAAO,CAAA,QAAA,EAAW,KAAK,KAAK,CAAA,CAAA;AAAA,KAChG;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,IAAA,CAAK,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAU,IAAI,IAAA,CAAK,KAAA,GAAQ,QAAA,GAAW,SAAS,KAAK,CAAA;AAE1D,EAAA,MAAM,WAAW,IAAA,CAAK,IAAA;AACtB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAI,WAAW,wCAAwC,CAAA;AAAA,EAC/D;AAGA,EAAA,MAAM,UAAA,GAAa,eAAe,UAAU,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAClC,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAClC,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAClC,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAElC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AACpC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AACpC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAEpC,EAAA,IAAI,oBAAoB,aAAA,EAAe;AACrC,IAAA,IAAI,EAAE,mBAAmB,aAAA,CAAA,EAAgB;AACvC,MAAA,MAAM,IAAI,WAAW,qCAAqC,CAAA;AAAA,IAC5D;AACA,IAAA,MAAM,MAAA,GAAS,OAAA;AAEf,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,QAAA;AAC1C,MAAA,MAAM,iBAAiB,CAAA,GAAI,QAAA;AAE3B,MAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,IAAA,EAAM,EAAA,EAAA,EAAM;AAChC,QAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,IAAA,EAAM,EAAA,EAAA,EAAM;AAChC,UAAA,MAAM,MAAA,GAAS,KAAK,IAAA,GAAO,EAAA;AAC3B,UAAA,MAAM,aAAA,GAAgB,kBAAkB,MAAA,GAAS,QAAA;AAEjD,UAAA,IAAI,MAAA,GAAS,CAAA;AACb,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,YAAA,MAAM,gBAAA,GAAmB,iBAAiB,CAAA,GAAI,QAAA;AAE9C,YAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,EAAA,EAAI,EAAA,EAAA,EAAM;AAC9B,cAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC1B,cAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,EAAA,EAAI,EAAA,EAAA,EAAM;AAC9B,gBAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAE1B,gBAAA,IAAI,MAAM,CAAA,IAAK,EAAA,GAAK,UAAU,EAAA,IAAM,CAAA,IAAK,KAAK,KAAA,EAAO;AACnD,kBAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,QAAA,EAAU,aAAA,GAAgB,SAAS,QAAQ,CAAA;AACxE,kBAAA,MAAM,SAAA,GAAY,gBAAA,GAAmB,EAAA,GAAK,QAAA,GAAW,EAAA,GAAK,QAAA;AAC1D,kBAAA,MAAM,IAAA,GAAO,OAAO,SAAS,CAAA;AAC7B,kBAAA,MAAA,CAAO,SAAS,CAAA,GAAA,CAAK,IAAA,KAAS,MAAA,GAAY,KAAK,IAAA,IAAQ,GAAA;AAAA,gBACzD;AACA,gBAAA,MAAA,EAAA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,IAAI,mBAAmB,aAAA,EAAe;AACpC,MAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,IAC9D;AACA,IAAA,MAAM,MAAA,GAAS,OAAA;AAEf,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,QAAA;AAC1C,MAAA,MAAM,iBAAiB,CAAA,GAAI,QAAA;AAE3B,MAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,IAAA,EAAM,EAAA,EAAA,EAAM;AAChC,QAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,IAAA,EAAM,EAAA,EAAA,EAAM;AAChC,UAAA,MAAM,MAAA,GAAS,KAAK,IAAA,GAAO,EAAA;AAC3B,UAAA,MAAM,aAAA,GAAgB,kBAAkB,MAAA,GAAS,QAAA;AAEjD,UAAA,IAAI,MAAA,GAAS,CAAA;AACb,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,YAAA,MAAM,gBAAA,GAAmB,iBAAiB,CAAA,GAAI,QAAA;AAE9C,YAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,EAAA,EAAI,EAAA,EAAA,EAAM;AAC9B,cAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC1B,cAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,EAAA,EAAI,EAAA,EAAA,EAAM;AAC9B,gBAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAE1B,gBAAA,IAAI,MAAM,CAAA,IAAK,EAAA,GAAK,UAAU,EAAA,IAAM,CAAA,IAAK,KAAK,KAAA,EAAO;AACnD,kBAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,QAAA,EAAU,aAAA,GAAgB,SAAS,QAAQ,CAAA;AACzE,kBAAA,MAAM,SAAA,GAAY,gBAAA,GAAmB,EAAA,GAAK,QAAA,GAAW,EAAA,GAAK,QAAA;AAC1D,kBAAA,MAAM,IAAA,GAAO,OAAO,SAAS,CAAA;AAC7B,kBAAA,MAAA,CAAO,SAAS,CAAA,GAAA,CAAK,IAAA,KAAS,MAAA,GAAY,IAAI,IAAA,IAAQ,GAAA;AAAA,gBACxD;AACA,gBAAA,MAAA,EAAA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO,UAAA;AAAA,IACP,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,QAAQ,IAAA,CAAK;AAAA,GACd,CAAA;AACH;;;AC7VO,SAAS,IAAI,CAAA,EAAmB;AACrC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,qCAAqC,CAAA;AAAA,EAC5D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,qCAAqC,CAAA;AAAA,EAC5D;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,IAAI,IAAA,CAAK,GAAA,CAAI,mBAAmB,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAC,CAAA;AAAA,IACzE;AAAA,EACF,CAAA,MAAA,IAAW,UAAA,IAAc,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACvC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,CAAC,CAAW,CAAA;AAAA,IACrC;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,IAAI,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACtD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAgBO,SAAS,IAAI,CAAA,EAAmB;AACrC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,qCAAqC,CAAA;AAAA,EAC5D;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,KAAU,SAAA,GAAY,SAAA,GAAY,SAAA;AAClD,EAAA,MAAM,IAAA,GAAO,sBAAsB,KAAK,CAAA;AACxC,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA;AAC3B,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,qCAAqC,CAAA;AAAA,EAC5D;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,IAAI,IAAA,CAAK,GAAA,CAAI,mBAAmB,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAC,CAAA;AAAA,IACzE;AAAA,EACF,CAAA,MAAA,IAAW,UAAA,IAAc,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACvC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,CAAC,CAAW,CAAA;AAAA,IACrC;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,IAAI,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACtD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA;AAAA,IACA,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAgBO,SAAS,KAAK,CAAA,EAAmB;AACtC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,IAAI,IAAA,CAAK,IAAA,CAAK,mBAAmB,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAC,CAAA;AAAA,IAC1E;AAAA,EACF,CAAA,MAAA,IAAW,UAAA,IAAc,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACvC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,CAAC,CAAW,CAAA;AAAA,IACtC;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,KAAK,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACvD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAaO,SAAS,OAAO,CAAA,EAAmB;AACxC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,wCAAwC,CAAA;AAAA,EAC/D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,wCAAwC,CAAA;AAAA,EAC/D;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAA;AAChE,MAAA,GAAA,CAAI,CAAC,IAAI,GAAA,GAAM,GAAA;AAAA,IACjB;AAAA,EACF,CAAA,MAAA,IAAW,UAAA,IAAc,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACvC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,MAAA,GAAA,CAAI,CAAC,IAAI,GAAA,GAAM,GAAA;AAAA,IACjB;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAA;AAC7C,MAAA,GAAA,CAAI,CAAC,IAAI,GAAA,GAAM,GAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAeO,SAAS,MAAM,CAAA,EAAmB;AACvC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAA;AAChE,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,IAC5B;AAAA,EACF,CAAA,MAAA,IAAW,UAAA,IAAc,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACvC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA,GAAI,KAAK,IAAA,CAAK,IAAA,CAAK,CAAC,CAAW,CAAA;AAAA,IAC1C;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAA;AAC7C,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,IAC5B;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAaO,SAAS,KAAK,CAAA,EAAmB;AACtC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,IAAI,IAAA,CAAK,IAAA,CAAK,mBAAmB,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAC,CAAA;AAAA,IAC1E;AAAA,EACF,CAAA,MAAA,IAAW,UAAA,IAAc,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACvC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,CAAC,CAAW,CAAA;AAAA,IACtC;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,KAAK,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACvD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AASO,SAAS,MAAM,CAAA,EAAmB;AACvC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,IAAI,IAAA,CAAK,KAAA,CAAM,mBAAmB,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAC,CAAA;AAAA,IAC3E;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACxD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAOO,SAAS,KAAK,CAAA,EAAmB;AACtC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAA;AAChE,MAAA,GAAA,CAAI,CAAC,IAAI,CAAA,IAAK,GAAA;AAAA,IAChB;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAA;AAC7C,MAAA,GAAA,CAAI,CAAC,IAAI,CAAA,IAAK,GAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AASO,SAAS,MAAM,CAAA,EAAmB;AACvC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,IAAI,IAAA,CAAK,KAAA,CAAM,mBAAmB,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAC,CAAA;AAAA,IAC3E;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACxD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAOO,SAAS,KAAK,CAAA,EAAmB;AACtC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,IAAI,IAAA,CAAK,IAAA,CAAK,mBAAmB,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAC,CAAA;AAAA,IAC1E;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,KAAK,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACvD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAOO,SAAS,MAAM,CAAA,EAAmB;AACvC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,IAAI,IAAA,CAAK,KAAA,CAAM,mBAAmB,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAC,CAAA;AAAA,IAC3E;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACxD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAOO,SAAS,MAAM,CAAA,EAAmB;AACvC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,IAAI,IAAA,CAAK,KAAA,CAAM,mBAAmB,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAC,CAAA;AAAA,IAC3E;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACxD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAOO,SAAS,KAAK,CAAA,EAAmB;AACtC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,IAAI,IAAA,CAAK,IAAA,CAAK,mBAAmB,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAC,CAAA;AAAA,IAC1E;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,KAAK,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACvD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAOO,SAAS,MAAM,CAAA,EAAmB;AACvC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,IAAI,IAAA,CAAK,KAAA,CAAM,mBAAmB,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAC,CAAA;AAAA,IAC3E;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACxD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAOO,SAAS,MAAM,CAAA,EAAmB;AACvC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,IAAI,IAAA,CAAK,KAAA,CAAM,mBAAmB,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAC,CAAA;AAAA,IAC3E;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAA,GACd,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACxD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;;;ACxrBO,SAAS,WAAA,CACd,KAAA,EACA,CAAA,EACA,KAAA,EACA,OACA,MAAA,EACQ;AACR,EAAA,IAAI,CAAC,OAAO,QAAA,CAAS,CAAC,KAAK,CAAA,GAAI,CAAA,IAAK,KAAK,CAAA,EAAG;AAC1C,IAAA,MAAM,IAAI,qBAAA,CAAsB,qBAAA,EAAuB,GAAA,EAAK,CAAC,CAAA;AAAA,EAC/D;AAEA,EAAA,MAAM,IAAA,GAAO,YAAY,KAAK,CAAA;AAC9B,EAAA,MAAM,IAAA,GAAO,sBAAsB,KAAK,CAAA;AACxC,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,IAAI,CAAA;AAE1B,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AACzC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA,CAAK,MAAA,EAAO,GAAI,IAAI,QAAA,GAAW,EAAA;AAAA,IAC3C;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA,CAAK,MAAA,EAAO,GAAI,IAAI,KAAA,GAAQ,CAAA;AAAA,IACxC;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;;;ACxCA,IAAMG,UAAAA,GAAY,EAAE,EAAA,IAAM,GAAA,CAAA;AAC1B,IAAMC,UAAAA,GAAAA,CAAa,MAAM,GAAA,IAAO,EAAA;AAGhC,SAAS,mBAAA,CAAoB,GAAW,EAAA,EAAsD;AAC5F,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,EAAG,EAAE,CAAA,iCAAA,CAAmC,CAAA;AAAA,EAC/D;AACF;AAEA,SAAS,gBAAA,CAAiB,MAAsB,EAAA,EAA2B;AACzE,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,EAAG,EAAE,CAAA,+BAAA,CAAiC,CAAA;AAAA,EAC7D;AACA,EAAA,IAAI,EAAE,gBAAgB,aAAA,CAAA,EAAgB;AACpC,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,EAAG,EAAE,CAAA,qBAAA,CAAuB,CAAA;AAAA,EACnD;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,iBAAA,CAAkB,MAAsB,EAAA,EAAgD;AAC/F,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,EAAG,EAAE,CAAA,+BAAA,CAAiC,CAAA;AAAA,EAC7D;AACA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,EAAG,EAAE,CAAA,yBAAA,CAA2B,CAAA;AAAA,EACvD;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,eAAe,OAAA,EAAwC;AAC9D,EAAA,IAAI,OAAA,KAAY,SAAS,OAAO,OAAA;AAChC,EAAA,IAAI,OAAA,KAAY,SAAA,IAAa,OAAA,KAAY,SAAA,EAAW,OAAO,SAAA;AAC3D,EAAA,IAAI,OAAA,KAAY,QAAA,EAAU,MAAM,IAAI,WAAW,qCAAqC,CAAA;AACpF,EAAA,OAAO,OAAA;AACT;AAeO,SAAS,GAAA,CAAI,CAAA,EAAW,IAAA,EAAa,QAAA,GAAW,KAAA,EAAe;AACpE,EAAA,mBAAA,CAAoB,GAAG,KAAK,CAAA;AAE5B,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAEvC,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAClD,IAAA,IAAI,CAAA,CAAE,UAAU,OAAA,EAAS;AACvB,MAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,CAAA,CAAE,IAAA,EAAM,KAAK,CAAA;AACjD,MAAA,IAAIC,IAAAA,GAAM,EAAA;AACV,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,QAAAA,IAAAA,IAAO,gBAAA,CAAiB,UAAA,EAAY,SAAS,CAAA;AAAA,MAC/C;AACA,MAAA,IAAIA,IAAAA,GAAMF,UAAAA,IAAaE,IAAAA,GAAMD,UAAAA,EAAW;AACtC,QAAA,MAAM,IAAI,oBAAoB,oBAAoB,CAAA;AAAA,MACpD;AACA,MAAA,MAAMP,IAAAA,GAAM,IAAI,aAAA,CAAc,CAAC,CAAA;AAC/B,MAAAA,IAAAA,CAAI,CAAC,CAAA,GAAIQ,IAAAA;AACT,MAAA,MAAMC,SAAAA,GAAkB,QAAA,GAAW,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,GAAI,EAAC;AACxE,MAAA,OAAO,OAAO,cAAA,CAAe;AAAA,QAC3B,IAAA,EAAMT,IAAAA;AAAA,QACN,KAAA,EAAOS,SAAAA;AAAA,QACP,KAAA,EAAO,OAAA;AAAA,QACP,QAAQ,CAAA,CAAE;AAAA,OACX,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,IAAI,CAAA,CAAE,gBAAgB,aAAA,EAAe;AACnC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,QAAA,GAAA,IAAO,MAAA,CAAO,gBAAA,CAAiB,CAAA,CAAE,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,MACnD;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,cAAc,CAAA,CAAE,IAAA;AACtB,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC9B,QAAA,MAAM,IAAI,WAAW,oCAAoC,CAAA;AAAA,MAC3D;AAEA,MAAA,IAAI,UAAA,IAAc,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AAChC,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,UAAA,GAAA,IAAO,YAAY,CAAC,CAAA;AAAA,QACtB;AAAA,MACF,CAAA,MAAO;AACL,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,UAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,UAAA,GAAA,IAAO,iBAAA,CAAkB,aAAa,SAAS,CAAA;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAMT,IAAAA,GAAM,aAAa,SAAA,GAAY,IAAI,aAAa,CAAC,CAAA,GAAI,IAAI,UAAA,CAAW,CAAC,CAAA;AAC3E,IAAAA,IAAAA,CAAI,CAAC,CAAA,GAAI,GAAA;AACT,IAAA,MAAM,QAAA,GAAkB,QAAA,GAAW,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,GAAI,EAAC;AAExE,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAMA,IAAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,KAAA,EAAO,QAAA;AAAA,MACP,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,EAAA,GAAK,aAAA,CAAc,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,EAAE,CAAA;AAGvC,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,MAAMU,eAAwB,EAAC;AAC/B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,IAAI,MAAM,EAAA,EAAI;AACZ,QAAA,IAAI,QAAA,EAAUA,YAAAA,CAAY,IAAA,CAAK,CAAC,CAAA;AAAA,MAClC,CAAA,MAAO;AACL,QAAAA,aAAY,IAAA,CAAK,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,MAC1C;AAAA,IACF;AACA,IAAA,aAAA,CAAcA,YAAW,CAAA;AACzB,IAAA,MAAMC,QAAAA,GAAUD,aAAY,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AACrD,IAAA,MAAME,QAAAA,GAAU,sBAAsB,QAAQ,CAAA;AAC9C,IAAA,MAAMZ,IAAAA,GAAM,IAAIY,QAAAA,CAAQD,QAAO,CAAA;AAE/B,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAMX,IAAAA;AAAA,MACN,KAAA,EAAOU,YAAAA;AAAA,MACP,KAAA,EAAO,QAAA;AAAA,MACP,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,IAAA,IAAI,MAAM,EAAA,EAAI;AACZ,MAAA,IAAI,QAAA,EAAU,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA;AAAA,IAClC,CAAA,MAAO;AACL,MAAA,WAAA,CAAY,IAAA,CAAK,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,IAC1C;AAAA,EACF;AACA,EAAA,aAAA,CAAc,WAAW,CAAA;AAEzB,EAAA,MAAM,OAAA,GAAU,YAAY,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AACrD,EAAA,MAAM,OAAA,GAAU,sBAAsB,QAAQ,CAAA;AAC9C,EAAA,MAAM,GAAA,GAAM,IAAI,OAAA,CAAQ,OAAO,CAAA;AAG/B,EAAA,MAAM,UAAA,GAAa,IAAI,KAAA,CAAc,WAAA,CAAY,MAAM,CAAA;AACvD,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,IAAS,IAAI,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAChD,IAAA,UAAA,CAAW,CAAC,CAAA,GAAI,MAAA;AAChB,IAAA,MAAA,IAAU,eAAA,CAAgB,aAAa,CAAC,CAAA;AAAA,EAC1C;AAEA,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,OAAA,EAAS,OAAA,EAAA,EAAW;AAClD,IAAA,IAAI,GAAA,GAAM,OAAA;AACV,IAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAc,WAAA,CAAY,MAAM,CAAA;AACnD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AAC3C,MAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,UAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAC1C,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAC9B,MAAA,GAAA,IAAO,CAAA;AAAA,IACT;AAGA,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AACtC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,IAAI,MAAM,EAAA,EAAI;AACZ,UAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AAAA,QACb,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,CAAC,CAAA,GAAI,eAAA,CAAgB,MAAA,EAAQ,CAAC,CAAA;AAAA,QACtC;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAI,OAAA,GAAU,CAAA;AACd,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,IAAI,MAAM,EAAA,EAAI;AACZ,UAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AAAA,QACb,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,CAAC,CAAA,GAAI,eAAA,CAAgB,MAAA,EAAQ,OAAO,CAAA;AAC1C,UAAA,OAAA,EAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,aAAa,CAAA,CAAE,MAAA;AACnB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,UAAA,IAAc,gBAAgB,KAAA,EAAO,CAAC,IAAI,eAAA,CAAgB,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,IACxE;AAEA,IAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,CAAA,CAAE,OAAA,EAAS,EAAE,CAAA;AAChD,IAAA,IAAI,aAAa,OAAA,EAAS;AACxB,MAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,CAAA,CAAE,IAAA,EAAM,KAAK,CAAA;AACjD,MAAA,IAAI,EAAE,eAAe,aAAA,CAAA,EAAgB;AACnC,QAAA,MAAM,IAAI,WAAW,2BAA2B,CAAA;AAAA,MAClD;AACA,MAAA,MAAM,SAAA,GAAY,GAAA;AAClB,MAAA,IAAI,GAAA,GAAM,EAAA;AACV,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,QAAA,GAAA,IAAO,gBAAA,CAAiB,UAAA,EAAY,UAAA,GAAa,CAAA,GAAI,UAAU,CAAA;AAAA,MACjE;AACA,MAAA,IAAI,GAAA,GAAMJ,UAAAA,IAAa,GAAA,GAAMC,UAAAA,EAAW;AACtC,QAAA,MAAM,IAAI,oBAAoB,oBAAoB,CAAA;AAAA,MACpD;AACA,MAAA,SAAA,CAAU,OAAO,CAAA,GAAI,GAAA;AAAA,IACvB,CAAA,MAAO;AACL,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,IAAI,CAAA,CAAE,gBAAgB,aAAA,EAAe;AACnC,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,UAAA,GAAA,IAAO,OAAO,gBAAA,CAAiB,CAAA,CAAE,MAAM,UAAA,GAAa,CAAA,GAAI,UAAU,CAAC,CAAA;AAAA,QACrE;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,CAAA,CAAE,IAAA,EAAM,KAAK,CAAA;AACnD,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,UAAA,GAAA,IAAO,iBAAA,CAAkB,WAAA,EAAa,UAAA,GAAa,CAAA,GAAI,UAAU,CAAA;AAAA,QACnE;AAAA,MACF;AAEA,MAAA,IAAI,eAAe,aAAA,EAAe;AAChC,QAAA,MAAM,IAAI,WAAW,2BAA2B,CAAA;AAAA,MAClD;AACA,MAAA,MAAM,UAAA,GAAa,GAAA;AACnB,MAAA,UAAA,CAAW,OAAO,CAAA,GAAI,GAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAoB,WAAA;AAC1B,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,UAAA;AAAA,IACP,KAAA,EAAO,QAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AA0BO,SAAS,IAAA,CAAK,CAAA,EAAW,IAAA,EAAa,QAAA,GAAW,KAAA,EAAe;AACrE,EAAA,mBAAA,CAAoB,GAAG,MAAM,CAAA;AAG7B,EAAA,IAAI,IAAA,KAAS,MAAA,IAAa,CAAA,CAAE,IAAA,KAAS,CAAA,EAAG;AACtC,IAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAC,CAAA;AAC9B,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA;AACT,IAAA,MAAM,QAAA,GAAkB,QAAA,GAAW,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,GAAI,EAAC;AACxE,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAM,GAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,KAAA,EAAO,SAAA;AAAA,MACP,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,MAAMM,GAAAA,GAAK,aAAA,CAAc,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AACrC,IAAA,MAAMC,QAAAA,GAAU,WAAA,CAAY,CAAA,CAAE,KAAA,EAAOD,GAAE,CAAA;AACvC,IAAA,IAAIC,aAAY,CAAA,EAAG;AACjB,MAAA,MAAM,cAAwB,EAAC;AAC/B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,IAAI,MAAMD,GAAAA,EAAI;AACZ,UAAA,IAAI,QAAA,EAAU,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA;AAAA,QAClC,CAAA,MAAO;AACL,UAAA,WAAA,CAAY,IAAA,CAAK,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,QAC1C;AAAA,MACF;AACA,MAAA,aAAA,CAAc,WAAW,CAAA;AACzB,MAAA,MAAM,OAAA,GAAU,YAAY,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AACrD,MAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,OAAO,CAAA;AACpC,MAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AACZ,MAAA,OAAO,OAAO,cAAA,CAAe;AAAA,QAC3B,IAAA,EAAM,GAAA;AAAA,QACN,KAAA,EAAO,WAAA;AAAA,QACP,KAAA,EAAO,SAAA;AAAA,QACP,QAAQ,CAAA,CAAE;AAAA,OACX,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,CAAA,EAAG,IAAA,EAAM,QAAQ,CAAA;AAGnC,EAAA,IAAI,UAAA,GAAa,KAAA;AACjB,EAAA,IAAI,KAAA,CAAM,KAAA,KAAU,SAAA,IAAa,KAAA,CAAM,UAAU,SAAA,EAAW;AAC1D,IAAA,MAAM,IAAA,GAAO,IAAI,YAAA,CAAa,KAAA,CAAM,IAAI,CAAA;AACxC,IAAA,MAAM,YAAY,KAAA,CAAM,IAAA;AACxB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,WAAW,qCAAqC,CAAA;AAAA,IAC5D;AACA,IAAA,IAAI,qBAAqB,aAAA,EAAe;AACtC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,QAAA,IAAA,CAAK,CAAC,IAAI,kBAAA,CAAmB,gBAAA,CAAiB,WAAW,KAAA,CAAM,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA,MAC5E;AAAA,IACF,CAAA,MAAO;AACL,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,QAAA,IAAA,CAAK,CAAC,CAAA,GAAI,iBAAA,CAAkB,SAAA,EAAW,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,MACzD;AAAA,IACF;AACA,IAAA,UAAA,GAAa,OAAO,cAAA,CAAe;AAAA,MACjC,IAAA;AAAA,MACA,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,KAAA,EAAO,SAAA;AAAA,MACP,QAAQ,KAAA,CAAM;AAAA,KACf,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,SAAS,MAAA,EAAW;AAEtB,IAAA,OAAO,SAAA,CAAU,UAAA,EAAY,CAAA,GAAI,CAAA,CAAE,IAAI,CAAA;AAAA,EACzC;AAGA,EAAA,MAAM,EAAA,GAAK,aAAA,CAAc,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,EAAE,CAAA;AAGvC,EAAA,OAAO,SAAA,CAAU,UAAA,EAAY,CAAA,GAAI,OAAO,CAAA;AAC1C;AAgCO,SAAS,IAAA,CAAK,CAAA,EAAW,IAAA,EAAsB,QAAA,GAAW,KAAA,EAAe;AAC9E,EAAA,mBAAA,CAAoB,GAAG,MAAM,CAAA;AAE7B,EAAA,MAAM,QAAA,GAAW,CACf,KAAA,EACA,EAAA,EACA,IAAA,KACgC;AAChC,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,KAAA,CAAM,KAAA,EAAO,EAAE,CAAA;AAE3C,IAAA,MAAM,cAAwB,EAAC;AAC/B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,MAAA,IAAI,MAAM,EAAA,EAAI;AACZ,QAAA,IAAI,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA;AAAA,MAC9B,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,MAC9C;AAAA,IACF;AACA,IAAA,aAAA,CAAc,WAAW,CAAA;AAEzB,IAAA,MAAM,OAAA,GAAU,YAAY,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAErD,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,KAAA,CAAM,gBAAgB,aAAA,EAAe;AACvC,MAAA,OAAA,GAAU,IAAI,cAAc,OAAO,CAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,MAAMd,KAAAA,GAAO,qBAAA,CAAsB,KAAA,CAAM,KAAK,CAAA;AAC9C,MAAA,OAAA,GAAU,IAAIA,MAAK,OAAO,CAAA;AAAA,IAC5B;AAEA,IAAA,MAAM,UAAA,GAAa,IAAI,KAAA,CAAc,WAAA,CAAY,MAAM,CAAA;AACvD,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,IAAS,IAAI,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAChD,MAAA,UAAA,CAAW,CAAC,CAAA,GAAI,MAAA;AAChB,MAAA,MAAA,IAAU,eAAA,CAAgB,aAAa,CAAC,CAAA;AAAA,IAC1C;AAEA,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,OAAA,EAAS,OAAA,EAAA,EAAW;AAClD,MAAA,IAAI,GAAA,GAAM,OAAA;AACV,MAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAc,WAAA,CAAY,MAAM,CAAA;AACnD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AAC3C,QAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,UAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAC1C,QAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAC9B,QAAA,GAAA,IAAO,CAAA;AAAA,MACT;AAEA,MAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAc,KAAA,CAAM,IAAI,CAAA;AAC1C,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,UAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,KAAM,KAAK,CAAA,GAAI,eAAA,CAAgB,QAAQ,CAAC,CAAA;AAAA,QACrD;AAAA,MACF,CAAA,MAAO;AACL,QAAA,IAAI,OAAA,GAAU,CAAA;AACd,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,UAAA,IAAI,MAAM,EAAA,EAAI;AACZ,YAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AAAA,UACb,CAAA,MAAO;AACL,YAAA,KAAA,CAAM,CAAC,CAAA,GAAI,eAAA,CAAgB,MAAA,EAAQ,OAAO,CAAA;AAC1C,YAAA,OAAA,EAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,aAAa,KAAA,CAAM,MAAA;AACvB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,QAAA,UAAA,IAAc,gBAAgB,KAAA,EAAO,CAAC,IAAI,eAAA,CAAgB,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,MAC5E;AAEA,MAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,KAAA,CAAM,OAAA,EAAS,EAAE,CAAA;AACpD,MAAA,IAAI,KAAA,CAAM,gBAAgB,aAAA,EAAe;AACvC,QAAA,IAAIS,IAAAA,GAAM,EAAA;AACV,QAAA,IAAI,UAAU,CAAA,EAAG;AACf,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,YAAAA,QAAO,gBAAA,CAAiB,KAAA,CAAM,IAAA,EAAM,UAAA,GAAa,IAAI,UAAU,CAAA;AAAA,UACjE;AAAA,QACF;AACA,QAAA,IAAIA,IAAAA,GAAMF,UAAAA,IAAaE,IAAAA,GAAMD,UAAAA,EAAW;AACtC,UAAA,MAAM,IAAI,oBAAoB,qBAAqB,CAAA;AAAA,QACrD;AACA,QAAA,IAAI,EAAE,mBAAmB,aAAA,CAAA,EAAgB;AACvC,UAAA,MAAM,IAAI,WAAW,4BAA4B,CAAA;AAAA,QACnD;AACA,QAAA,OAAA,CAAQ,OAAO,CAAA,GAAIC,IAAAA;AAAA,MACrB,CAAA,MAAO;AACL,QAAA,IAAIA,IAAAA,GAAM,CAAA;AACV,QAAA,IAAI,UAAU,CAAA,EAAG;AACf,UAAA,MAAMO,eAAc,KAAA,CAAM,IAAA;AAC1B,UAAA,IAAI,KAAA,CAAM,OAAA,CAAQA,YAAW,CAAA,EAAG;AAC9B,YAAA,MAAM,IAAI,WAAW,qCAAqC,CAAA;AAAA,UAC5D;AACA,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,YAAAP,IAAAA,IAAO,iBAAA,CAAkBO,YAAAA,EAAa,UAAA,GAAa,IAAI,UAAU,CAAA;AAAA,UACnE;AAAA,QACF;AACA,QAAA,IAAI,mBAAmB,aAAA,EAAe;AACpC,UAAA,MAAM,IAAI,WAAW,4BAA4B,CAAA;AAAA,QACnD;AACA,QAAA,OAAA,CAAQ,OAAO,CAAA,GAAIP,IAAAA;AAAA,MACrB;AAAA,IACF;AAEA,IAAA,IAAI,mBAAmB,aAAA,EAAe;AACpC,MAAA,OAAO,OAAO,cAAA,CAAe;AAAA,QAC3B,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,WAAA;AAAA,QACP,KAAA,EAAO,OAAA;AAAA,QACP,QAAQ,KAAA,CAAM;AAAA,OACf,CAAA;AAAA,IACH;AACA,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,WAAA;AAAA,MACP,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,QAAQ,KAAA,CAAM;AAAA,KACf,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,WACX,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,GACjC,IAAA,CAAK,OAAM,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AACrC,IAAA,IAAI,MAAA,GAAsC,CAAA;AAC1C,IAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,MAAA,MAAA,GAAS,QAAA,CAAS,MAAA,EAAQ,EAAA,EAAI,QAAQ,CAAA;AAAA,IACxC;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAChB,IAAA,MAAM,aAAoB,EAAC;AAC3B,IAAA,IAAI,CAAA,CAAE,UAAU,OAAA,EAAS;AACvB,MAAA,MAAMR,IAAAA,GAAM,IAAI,aAAA,CAAc,CAAC,CAAA;AAC/B,MAAAA,IAAAA,CAAI,CAAC,CAAA,GAAI,EAAA;AACT,MAAA,OAAO,OAAO,cAAA,CAAe;AAAA,QAC3B,IAAA,EAAMA,IAAAA;AAAA,QACN,KAAA,EAAO,UAAA;AAAA,QACP,KAAA,EAAO,OAAA;AAAA,QACP,QAAQ,CAAA,CAAE;AAAA,OACX,CAAA;AAAA,IACH;AACA,IAAA,MAAMD,KAAAA,GAAO,qBAAA,CAAsB,CAAA,CAAE,KAAK,CAAA;AAC1C,IAAA,MAAMC,IAAAA,GAAM,IAAID,KAAAA,CAAK,CAAC,CAAA;AACtB,IAAAC,IAAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AACT,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAMA,IAAAA;AAAA,MACN,KAAA,EAAO,UAAA;AAAA,MACP,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAGlD,EAAA,IAAI,CAAA,CAAE,gBAAgB,aAAA,EAAe;AACnC,IAAA,IAAIQ,IAAAA,GAAM,EAAA;AAGV,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAAA,IAAAA,IAAO,gBAAA,CAAiB,CAAA,CAAE,IAAA,EAAM,SAAS,CAAA;AAAA,IAC3C;AAGA,IAAA,IAAIA,IAAAA,GAAMF,UAAAA,IAAaE,IAAAA,GAAMD,UAAAA,EAAW;AACtC,MAAA,MAAM,IAAI,oBAAoB,qBAAqB,CAAA;AAAA,IACrD;AAEA,IAAA,MAAMP,IAAAA,GAAM,IAAI,aAAA,CAAc,CAAC,CAAA;AAC/B,IAAAA,IAAAA,CAAI,CAAC,CAAA,GAAIQ,IAAAA;AACT,IAAA,MAAMC,SAAAA,GAAkB,QAAA,GAAW,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,GAAI,EAAC;AAExE,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAMT,IAAAA;AAAA,MACN,KAAA,EAAOS,SAAAA;AAAA,MACP,KAAA,EAAO,OAAA;AAAA,MACP,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,cAAc,CAAA,CAAE,IAAA;AACtB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAI,WAAW,qCAAqC,CAAA;AAAA,EAC5D;AACA,EAAA,IAAI,GAAA,GAAM,CAAA;AAGV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,IAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,IAAA,GAAA,IAAO,iBAAA,CAAkB,aAAa,SAAS,CAAA;AAAA,EACjD;AAGA,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,CAAA,CAAE,KAAK,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,CAAC,CAAA;AACtB,EAAA,IAAI,CAAA,CAAE,UAAU,OAAA,EAAS;AACvB,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,EACzB,CAAA,MAAO;AACL,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA;AAAA,EACX;AAEA,EAAA,MAAM,QAAA,GAAkB,QAAA,GAAW,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,GAAI,EAAC;AACxE,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AA+BO,SAAS,IAAI,CAAA,EAAW,IAAA,EAAa,QAAA,GAAW,KAAA,EAAO,OAAO,CAAA,EAAW;AAE9E,EAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,CAAA,EAAG,IAAA,EAAM,UAAU,IAAI,CAAA;AAGvD,EAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,cAAA,CAAe,IAAA,EAAM,KAAK,CAAA;AACjE,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,cAAA,CAAe,IAAI,CAAA;AAEhD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,MAAM,CAAA,EAAA,EAAK;AAC5C,IAAA,GAAA,CAAI,CAAC,IAAI,IAAA,CAAK,IAAA,CAAK,kBAAkB,YAAA,EAAc,cAAA,CAAe,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA,EAC/E;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,cAAA,CAAe,KAAA;AAAA,IACtB,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AA+BO,SAAS,SAAS,CAAA,EAAW,IAAA,EAAa,QAAA,GAAW,KAAA,EAAO,OAAO,CAAA,EAAW;AACnF,EAAA,mBAAA,CAAoB,GAAG,UAAU,CAAA;AAEjC,EAAA,IAAI,OAAO,CAAA,EAAG;AACZ,IAAA,MAAM,IAAI,qBAAA,CAAsB,2BAAA,EAA6B,MAAA,EAAQ,IAAI,CAAA;AAAA,EAC3E;AAGA,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAChB,IAAA,MAAM,IAAI,qBAAA,CAAsB,0CAAA,EAA4C,GAAG,CAAA;AAAA,EACjF;AAGA,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,IAAA,IAAI,CAAA,CAAE,QAAQ,IAAA,EAAM;AAClB,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,CAAA,KAAA,EAAQ,IAAI,CAAA,SAAA,EAAY,CAAA,CAAE,IAAI,CAAA,oBAAA,CAAA;AAAA,QAC9B,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,IAAI,CAAA,CAAE,gBAAgB,aAAA,EAAe;AACnC,MAAA,IAAIf,IAAAA,GAAM,CAAA;AACV,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,QAAAA,QAAO,kBAAA,CAAmB,gBAAA,CAAiB,CAAA,CAAE,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,MAC/D;AACA,MAAA,SAAA,GAAYA,OAAM,CAAA,CAAE,IAAA;AAAA,IACtB,CAAA,MAAO;AACL,MAAA,MAAM,cAAc,CAAA,CAAE,IAAA;AACtB,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC9B,QAAA,MAAM,IAAI,WAAW,yCAAyC,CAAA;AAAA,MAChE;AACA,MAAA,IAAIA,IAAAA,GAAM,CAAA;AACV,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,QAAAA,IAAAA,IAAO,iBAAA,CAAkB,WAAA,EAAa,SAAS,CAAA;AAAA,MACjD;AACA,MAAA,SAAA,GAAYA,OAAM,CAAA,CAAE,IAAA;AAAA,IACtB;AAGA,IAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,IAAA,IAAI,CAAA,CAAE,gBAAgB,aAAA,EAAe;AACnC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,QAAA,MAAM,MAAM,kBAAA,CAAmB,gBAAA,CAAiB,CAAA,CAAE,IAAA,EAAM,SAAS,CAAC,CAAA;AAClE,QAAA,MAAM,YAAY,GAAA,GAAM,SAAA;AACxB,QAAA,aAAA,IAAiB,SAAA,GAAY,SAAA;AAAA,MAC/B;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,cAAc,CAAA,CAAE,IAAA;AACtB,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC9B,QAAA,MAAM,IAAI,WAAW,yCAAyC,CAAA;AAAA,MAChE;AACA,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,QAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,WAAA,EAAa,SAAS,CAAA;AACpD,QAAA,MAAM,YAAY,GAAA,GAAM,SAAA;AACxB,QAAA,aAAA,IAAiB,SAAA,GAAY,SAAA;AAAA,MAC/B;AAAA,IACF;AAGA,IAAA,MAAM,aAAA,GAAgB,aAAA,IAAiB,CAAA,CAAE,IAAA,GAAO,IAAA,CAAA;AAEhD,IAAA,MAAMM,IAAAA,GAAM,IAAI,YAAA,CAAa,CAAC,CAAA;AAC9B,IAAAA,IAAAA,CAAI,CAAC,CAAA,GAAI,aAAA;AACT,IAAA,MAAM,QAAA,GAAkB,QAAA,GAAW,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,GAAI,EAAC;AAExE,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAMA,IAAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,KAAA,EAAO,SAAA;AAAA,MACP,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,EAAA,GAAK,aAAA,CAAc,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,EAAE,CAAA;AAEvC,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,MAAMU,eAAwB,EAAC;AAC/B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,IAAI,MAAM,EAAA,EAAI;AACZ,QAAA,IAAI,QAAA,EAAUA,YAAAA,CAAY,IAAA,CAAK,CAAC,CAAA;AAAA,MAClC,CAAA,MAAO;AACL,QAAAA,aAAY,IAAA,CAAK,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,MAC1C;AAAA,IACF;AACA,IAAA,aAAA,CAAcA,YAAW,CAAA;AACzB,IAAA,MAAMC,QAAAA,GAAUD,aAAY,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AACrD,IAAA,MAAMV,IAAAA,GAAM,IAAI,YAAA,CAAaW,QAAO,CAAA;AACpC,IAAAX,IAAAA,CAAI,KAAK,GAAG,CAAA;AACZ,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAMA,IAAAA;AAAA,MACN,KAAA,EAAOU,YAAAA;AAAA,MACP,KAAA,EAAO,SAAA;AAAA,MACP,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,CAAA,KAAA,EAAQ,IAAI,CAAA,cAAA,EAAiB,OAAO,CAAA,oBAAA,CAAA;AAAA,MACpC,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,IAAA,IAAI,MAAM,EAAA,EAAI;AACZ,MAAA,IAAI,QAAA,EAAU,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA;AAAA,IAClC,CAAA,MAAO;AACL,MAAA,WAAA,CAAY,IAAA,CAAK,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,IAC1C;AAAA,EACF;AACA,EAAA,aAAA,CAAc,WAAW,CAAA;AAEzB,EAAA,MAAM,OAAA,GAAU,YAAY,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AACrD,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,OAAO,CAAA;AAGpC,EAAA,MAAM,UAAA,GAAa,IAAI,KAAA,CAAc,WAAA,CAAY,MAAM,CAAA;AACvD,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,IAAS,IAAI,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAChD,IAAA,UAAA,CAAW,CAAC,CAAA,GAAI,MAAA;AAChB,IAAA,MAAA,IAAU,eAAA,CAAgB,aAAa,CAAC,CAAA;AAAA,EAC1C;AAGA,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,OAAA,EAAS,OAAA,EAAA,EAAW;AAElD,IAAA,IAAI,GAAA,GAAM,OAAA;AACV,IAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAc,WAAA,CAAY,MAAM,CAAA;AACnD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AAC3C,MAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,UAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAC1C,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAC9B,MAAA,GAAA,IAAO,CAAA;AAAA,IACT;AAGA,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AACtC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,KAAM,KAAK,CAAA,GAAI,eAAA,CAAgB,QAAQ,CAAC,CAAA;AAAA,MACrD;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAI,OAAA,GAAU,CAAA;AACd,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,IAAI,MAAM,EAAA,EAAI;AACZ,UAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AAAA,QACb,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,CAAC,CAAA,GAAI,eAAA,CAAgB,MAAA,EAAQ,OAAO,CAAA;AAC1C,UAAA,OAAA,EAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,aAAa,CAAA,CAAE,MAAA;AACnB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,UAAA,IAAc,gBAAgB,KAAA,EAAO,CAAC,IAAI,eAAA,CAAgB,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,IACxE;AAEA,IAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,CAAA,CAAE,OAAA,EAAS,EAAE,CAAA;AAGhD,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,IAAI,CAAA,CAAE,gBAAgB,aAAA,EAAe;AACnC,MAAA,IAAIhB,IAAAA,GAAM,CAAA;AACV,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,QAAAA,IAAAA,IAAO,mBAAmB,gBAAA,CAAiB,CAAA,CAAE,MAAM,UAAA,GAAa,CAAA,GAAI,UAAU,CAAC,CAAA;AAAA,MACjF;AACA,MAAA,SAAA,GAAYA,IAAAA,GAAM,OAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,MAAM,cAAc,CAAA,CAAE,IAAA;AACtB,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC9B,QAAA,MAAM,IAAI,WAAW,yCAAyC,CAAA;AAAA,MAChE;AACA,MAAA,IAAIA,IAAAA,GAAM,CAAA;AACV,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,QAAAA,IAAAA,IAAO,iBAAA,CAAkB,WAAA,EAAa,UAAA,GAAa,IAAI,UAAU,CAAA;AAAA,MACnE;AACA,MAAA,SAAA,GAAYA,IAAAA,GAAM,OAAA;AAAA,IACpB;AAGA,IAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,IAAA,IAAI,CAAA,CAAE,gBAAgB,aAAA,EAAe;AACnC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,QAAA,MAAM,GAAA,GAAM,mBAAmB,gBAAA,CAAiB,CAAA,CAAE,MAAM,UAAA,GAAa,CAAA,GAAI,UAAU,CAAC,CAAA;AACpF,QAAA,MAAM,YAAY,GAAA,GAAM,SAAA;AACxB,QAAA,aAAA,IAAiB,SAAA,GAAY,SAAA;AAAA,MAC/B;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,cAAc,CAAA,CAAE,IAAA;AACtB,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC9B,QAAA,MAAM,IAAI,WAAW,yCAAyC,CAAA;AAAA,MAChE;AACA,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,QAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,WAAA,EAAa,UAAA,GAAa,IAAI,UAAU,CAAA;AACtE,QAAA,MAAM,YAAY,GAAA,GAAM,SAAA;AACxB,QAAA,aAAA,IAAiB,SAAA,GAAY,SAAA;AAAA,MAC/B;AAAA,IACF;AAGA,IAAA,GAAA,CAAI,OAAO,CAAA,GAAI,aAAA,IAAiB,OAAA,GAAU,IAAA,CAAA;AAAA,EAC5C;AAEA,EAAA,MAAM,UAAA,GAAoB,WAAA;AAC1B,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,UAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAwBO,SAAS,GAAA,CAAI,CAAA,EAAW,IAAA,EAAsB,QAAA,GAAW,KAAA,EAAe;AAC7E,EAAA,mBAAA,CAAoB,GAAG,KAAK,CAAA;AAE5B,EAAA,MAAM,OAAA,GAAU,CACd,KAAA,EACA,EAAA,EACA,IAAA,KACgC;AAChC,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,KAAA,CAAM,KAAA,EAAO,EAAE,CAAA;AAC3C,IAAA,IAAI,YAAY,CAAA,EAAG;AACjB,MAAA,MAAM,IAAI,qBAAA,CAAsB,qCAAA,EAAuC,GAAG,CAAA;AAAA,IAC5E;AAEA,IAAA,MAAM,cAAwB,EAAC;AAC/B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,MAAA,IAAI,MAAM,EAAA,EAAI;AACZ,QAAA,IAAI,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA;AAAA,MAC9B,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,MAC9C;AAAA,IACF;AACA,IAAA,aAAA,CAAc,WAAW,CAAA;AAEzB,IAAA,MAAM,OAAA,GAAU,YAAY,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AACrD,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,KAAA,CAAM,gBAAgB,aAAA,EAAe;AACvC,MAAA,OAAA,GAAU,IAAI,cAAc,OAAO,CAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,MAAMK,KAAAA,GAAO,qBAAA,CAAsB,KAAA,CAAM,KAAK,CAAA;AAC9C,MAAA,OAAA,GAAU,IAAIA,MAAK,OAAO,CAAA;AAAA,IAC5B;AAEA,IAAA,MAAM,UAAA,GAAa,IAAI,KAAA,CAAc,WAAA,CAAY,MAAM,CAAA;AACvD,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,IAAS,IAAI,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAChD,MAAA,UAAA,CAAW,CAAC,CAAA,GAAI,MAAA;AAChB,MAAA,MAAA,IAAU,eAAA,CAAgB,aAAa,CAAC,CAAA;AAAA,IAC1C;AAEA,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,OAAA,EAAS,OAAA,EAAA,EAAW;AAClD,MAAA,IAAI,GAAA,GAAM,OAAA;AACV,MAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAc,WAAA,CAAY,MAAM,CAAA;AACnD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AAC3C,QAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,UAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAC1C,QAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAC9B,QAAA,GAAA,IAAO,CAAA;AAAA,MACT;AAEA,MAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAc,KAAA,CAAM,IAAI,CAAA;AAC1C,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,UAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,KAAM,KAAK,CAAA,GAAI,eAAA,CAAgB,QAAQ,CAAC,CAAA;AAAA,QACrD;AAAA,MACF,CAAA,MAAO;AACL,QAAA,IAAI,OAAA,GAAU,CAAA;AACd,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,UAAA,IAAI,MAAM,EAAA,EAAI;AACZ,YAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AAAA,UACb,CAAA,MAAO;AACL,YAAA,KAAA,CAAM,CAAC,CAAA,GAAI,eAAA,CAAgB,MAAA,EAAQ,OAAO,CAAA;AAC1C,YAAA,OAAA,EAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,aAAa,KAAA,CAAM,MAAA;AACvB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,QAAA,UAAA,IAAc,gBAAgB,KAAA,EAAO,CAAC,IAAI,eAAA,CAAgB,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,MAC5E;AAEA,MAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,KAAA,CAAM,OAAA,EAAS,EAAE,CAAA;AACpD,MAAA,IAAI,KAAA,CAAM,gBAAgB,aAAA,EAAe;AACvC,QAAA,IAAIiB,OAAAA,GAAS,gBAAA,CAAiB,KAAA,CAAM,IAAA,EAAM,UAAU,CAAA;AACpD,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,UAAA,MAAM,MAAM,gBAAA,CAAiB,KAAA,CAAM,IAAA,EAAM,UAAA,GAAa,IAAI,UAAU,CAAA;AACpE,UAAA,IAAI,GAAA,GAAMA,OAAAA,EAAQA,OAAAA,GAAS,GAAA;AAAA,QAC7B;AACA,QAAA,IAAI,EAAE,mBAAmB,aAAA,CAAA,EAAgB;AACvC,UAAA,MAAM,IAAI,WAAW,2BAA2B,CAAA;AAAA,QAClD;AACA,QAAA,OAAA,CAAQ,OAAO,CAAA,GAAIA,OAAAA;AAAA,MACrB,CAAA,MAAO;AACL,QAAA,MAAMD,eAAc,KAAA,CAAM,IAAA;AAC1B,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQA,YAAW,CAAA,EAAG;AAC9B,UAAA,MAAM,IAAI,WAAW,oCAAoC,CAAA;AAAA,QAC3D;AACA,QAAA,IAAIC,OAAAA,GAAS,iBAAA,CAAkBD,YAAAA,EAAa,UAAU,CAAA;AACtD,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,UAAA,MAAM,GAAA,GAAM,iBAAA,CAAkBA,YAAAA,EAAa,UAAA,GAAa,IAAI,UAAU,CAAA;AACtE,UAAA,IAAI,MAAMC,OAAAA,IAAU,MAAA,CAAO,MAAM,GAAG,CAAA,EAAGA,OAAAA,GAAS,GAAA;AAAA,QAClD;AACA,QAAA,IAAI,mBAAmB,aAAA,EAAe;AACpC,UAAA,MAAM,IAAI,WAAW,2BAA2B,CAAA;AAAA,QAClD;AACA,QAAA,OAAA,CAAQ,OAAO,CAAA,GAAIA,OAAAA;AAAA,MACrB;AAAA,IACF;AAEA,IAAA,IAAI,mBAAmB,aAAA,EAAe;AACpC,MAAA,OAAO,OAAO,cAAA,CAAe;AAAA,QAC3B,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,WAAA;AAAA,QACP,KAAA,EAAO,OAAA;AAAA,QACP,QAAQ,KAAA,CAAM;AAAA,OACf,CAAA;AAAA,IACH;AACA,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,WAAA;AAAA,MACP,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,QAAQ,KAAA,CAAM;AAAA,KACf,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,WACX,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,GACjC,IAAA,CAAK,OAAM,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AACrC,IAAA,IAAI,MAAA,GAAsC,CAAA;AAC1C,IAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,MAAA,MAAA,GAAS,OAAA,CAAQ,MAAA,EAAQ,EAAA,EAAI,QAAQ,CAAA;AAAA,IACvC;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAChB,IAAA,MAAM,IAAI,qBAAA,CAAsB,qCAAA,EAAuC,GAAG,CAAA;AAAA,EAC5E;AAEA,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAGlD,EAAA,IAAI,CAAA,CAAE,gBAAgB,aAAA,EAAe;AACnC,IAAA,IAAIA,OAAAA,GAAS,gBAAA;AAAA,MACX,CAAA,CAAE,IAAA;AAAA,MACF,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO;AAAA,KAC/D;AAGA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,CAAA,CAAE,IAAA,EAAM,SAAS,CAAA;AAC9C,MAAA,IAAI,MAAMA,OAAAA,EAAQ;AAChB,QAAAA,OAAAA,GAAS,GAAA;AAAA,MACX;AAAA,IACF;AAEA,IAAA,MAAMhB,IAAAA,GAAM,IAAI,aAAA,CAAc,CAAC,CAAA;AAC/B,IAAAA,IAAAA,CAAI,CAAC,CAAA,GAAIgB,OAAAA;AACT,IAAA,MAAMP,SAAAA,GAAkB,QAAA,GAAW,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,GAAI,EAAC;AAExE,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAMT,IAAAA;AAAA,MACN,KAAA,EAAOS,SAAAA;AAAA,MACP,KAAA,EAAO,OAAA;AAAA,MACP,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,CAAA,CAAE,IAAA,EAAM,KAAK,CAAA;AAEnD,EAAA,IAAI,MAAA;AAEJ,EAAA,IAAI,UAAA,IAAc,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AAChC,IAAA,MAAA,GAAS,YAAY,CAAC,CAAA;AACtB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,GAAA,GAAM,YAAY,CAAC,CAAA;AACzB,MAAA,IAAI,GAAA,GAAM,MAAA,IAAU,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AACrC,QAAA,MAAA,GAAS,GAAA;AAAA,MACX;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAA,GAAS,iBAAA;AAAA,MACP,WAAA;AAAA,MACA,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO;AAAA,KAC/D;AAEA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,WAAA,EAAa,SAAS,CAAA;AACpD,MAAA,IAAI,GAAA,GAAM,MAAA,IAAU,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AACrC,QAAA,MAAA,GAAS,GAAA;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,CAAA,CAAE,KAAK,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,CAAC,CAAA;AACtB,EAAA,GAAA,CAAI,CAAC,CAAA,GAAI,MAAA;AAET,EAAA,MAAM,QAAA,GAAkB,QAAA,GAAW,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,GAAI,EAAC;AACxE,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAwBO,SAAS,GAAA,CAAI,CAAA,EAAW,IAAA,EAAsB,QAAA,GAAW,KAAA,EAAe;AAC7E,EAAA,mBAAA,CAAoB,GAAG,KAAK,CAAA;AAE5B,EAAA,MAAM,OAAA,GAAU,CACd,KAAA,EACA,EAAA,EACA,IAAA,KACgC;AAChC,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,KAAA,CAAM,KAAA,EAAO,EAAE,CAAA;AAC3C,IAAA,IAAI,YAAY,CAAA,EAAG;AACjB,MAAA,MAAM,IAAI,qBAAA,CAAsB,qCAAA,EAAuC,GAAG,CAAA;AAAA,IAC5E;AAEA,IAAA,MAAM,cAAwB,EAAC;AAC/B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,MAAA,IAAI,MAAM,EAAA,EAAI;AACZ,QAAA,IAAI,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA;AAAA,MAC9B,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,MAC9C;AAAA,IACF;AACA,IAAA,aAAA,CAAc,WAAW,CAAA;AAEzB,IAAA,MAAM,OAAA,GAAU,YAAY,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AACrD,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,KAAA,CAAM,gBAAgB,aAAA,EAAe;AACvC,MAAA,OAAA,GAAU,IAAI,cAAc,OAAO,CAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,MAAMV,KAAAA,GAAO,qBAAA,CAAsB,KAAA,CAAM,KAAK,CAAA;AAC9C,MAAA,OAAA,GAAU,IAAIA,MAAK,OAAO,CAAA;AAAA,IAC5B;AAEA,IAAA,MAAM,UAAA,GAAa,IAAI,KAAA,CAAc,WAAA,CAAY,MAAM,CAAA;AACvD,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,IAAS,IAAI,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAChD,MAAA,UAAA,CAAW,CAAC,CAAA,GAAI,MAAA;AAChB,MAAA,MAAA,IAAU,eAAA,CAAgB,aAAa,CAAC,CAAA;AAAA,IAC1C;AAEA,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,OAAA,EAAS,OAAA,EAAA,EAAW;AAClD,MAAA,IAAI,GAAA,GAAM,OAAA;AACV,MAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAc,WAAA,CAAY,MAAM,CAAA;AACnD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AAC3C,QAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,UAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAC1C,QAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAC9B,QAAA,GAAA,IAAO,CAAA;AAAA,MACT;AAEA,MAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAc,KAAA,CAAM,IAAI,CAAA;AAC1C,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,UAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,KAAM,KAAK,CAAA,GAAI,eAAA,CAAgB,QAAQ,CAAC,CAAA;AAAA,QACrD;AAAA,MACF,CAAA,MAAO;AACL,QAAA,IAAI,OAAA,GAAU,CAAA;AACd,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,UAAA,IAAI,MAAM,EAAA,EAAI;AACZ,YAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AAAA,UACb,CAAA,MAAO;AACL,YAAA,KAAA,CAAM,CAAC,CAAA,GAAI,eAAA,CAAgB,MAAA,EAAQ,OAAO,CAAA;AAC1C,YAAA,OAAA,EAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,aAAa,KAAA,CAAM,MAAA;AACvB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,QAAA,UAAA,IAAc,gBAAgB,KAAA,EAAO,CAAC,IAAI,eAAA,CAAgB,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,MAC5E;AAEA,MAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,KAAA,CAAM,OAAA,EAAS,EAAE,CAAA;AACpD,MAAA,IAAI,KAAA,CAAM,gBAAgB,aAAA,EAAe;AACvC,QAAA,IAAIkB,OAAAA,GAAS,gBAAA,CAAiB,KAAA,CAAM,IAAA,EAAM,UAAU,CAAA;AACpD,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,UAAA,MAAM,MAAM,gBAAA,CAAiB,KAAA,CAAM,IAAA,EAAM,UAAA,GAAa,IAAI,UAAU,CAAA;AACpE,UAAA,IAAI,GAAA,GAAMA,OAAAA,EAAQA,OAAAA,GAAS,GAAA;AAAA,QAC7B;AACA,QAAA,IAAI,EAAE,mBAAmB,aAAA,CAAA,EAAgB;AACvC,UAAA,MAAM,IAAI,WAAW,2BAA2B,CAAA;AAAA,QAClD;AACA,QAAA,OAAA,CAAQ,OAAO,CAAA,GAAIA,OAAAA;AAAA,MACrB,CAAA,MAAO;AACL,QAAA,MAAMF,YAAAA,GAAc,iBAAA,CAAkB,KAAA,CAAM,IAAA,EAAM,KAAK,CAAA;AACvD,QAAA,IAAIE,OAAAA,GAAS,iBAAA,CAAkBF,YAAAA,EAAa,UAAU,CAAA;AACtD,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,UAAA,MAAM,GAAA,GAAM,iBAAA,CAAkBA,YAAAA,EAAa,UAAA,GAAa,IAAI,UAAU,CAAA;AACtE,UAAA,IAAI,MAAME,OAAAA,IAAU,MAAA,CAAO,MAAM,GAAG,CAAA,EAAGA,OAAAA,GAAS,GAAA;AAAA,QAClD;AACA,QAAA,IAAI,mBAAmB,aAAA,EAAe;AACpC,UAAA,MAAM,IAAI,WAAW,2BAA2B,CAAA;AAAA,QAClD;AACA,QAAA,OAAA,CAAQ,OAAO,CAAA,GAAIA,OAAAA;AAAA,MACrB;AAAA,IACF;AAEA,IAAA,IAAI,mBAAmB,aAAA,EAAe;AACpC,MAAA,OAAO,OAAO,cAAA,CAAe;AAAA,QAC3B,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,WAAA;AAAA,QACP,KAAA,EAAO,OAAA;AAAA,QACP,QAAQ,KAAA,CAAM;AAAA,OACf,CAAA;AAAA,IACH;AACA,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,WAAA;AAAA,MACP,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,QAAQ,KAAA,CAAM;AAAA,KACf,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,WACX,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,GACjC,IAAA,CAAK,OAAM,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AACrC,IAAA,IAAI,MAAA,GAAsC,CAAA;AAC1C,IAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,MAAA,MAAA,GAAS,OAAA,CAAQ,MAAA,EAAQ,EAAA,EAAI,QAAQ,CAAA;AAAA,IACvC;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAChB,IAAA,MAAM,IAAI,qBAAA,CAAsB,qCAAA,EAAuC,GAAG,CAAA;AAAA,EAC5E;AAEA,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAGlD,EAAA,IAAI,CAAA,CAAE,gBAAgB,aAAA,EAAe;AACnC,IAAA,IAAIA,OAAAA,GAAS,gBAAA;AAAA,MACX,CAAA,CAAE,IAAA;AAAA,MACF,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO;AAAA,KAC/D;AAGA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,CAAA,CAAE,IAAA,EAAM,SAAS,CAAA;AAC9C,MAAA,IAAI,MAAMA,OAAAA,EAAQ;AAChB,QAAAA,OAAAA,GAAS,GAAA;AAAA,MACX;AAAA,IACF;AAEA,IAAA,MAAMjB,IAAAA,GAAM,IAAI,aAAA,CAAc,CAAC,CAAA;AAC/B,IAAAA,IAAAA,CAAI,CAAC,CAAA,GAAIiB,OAAAA;AACT,IAAA,MAAMR,SAAAA,GAAkB,QAAA,GAAW,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,GAAI,EAAC;AAExE,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAMT,IAAAA;AAAA,MACN,KAAA,EAAOS,SAAAA;AAAA,MACP,KAAA,EAAO,OAAA;AAAA,MACP,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,CAAA,CAAE,IAAA,EAAM,KAAK,CAAA;AAEnD,EAAA,IAAI,MAAA;AAEJ,EAAA,IAAI,UAAA,IAAc,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AAChC,IAAA,MAAA,GAAS,YAAY,CAAC,CAAA;AACtB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,GAAA,GAAM,YAAY,CAAC,CAAA;AACzB,MAAA,IAAI,GAAA,GAAM,MAAA,IAAU,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AACrC,QAAA,MAAA,GAAS,GAAA;AAAA,MACX;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAA,GAAS,iBAAA;AAAA,MACP,WAAA;AAAA,MACA,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO;AAAA,KAC/D;AAEA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,WAAA,EAAa,SAAS,CAAA;AACpD,MAAA,IAAI,GAAA,GAAM,MAAA,IAAU,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AACrC,QAAA,MAAA,GAAS,GAAA;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,CAAA,CAAE,KAAK,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,CAAC,CAAA;AACtB,EAAA,GAAA,CAAI,CAAC,CAAA,GAAI,MAAA;AAET,EAAA,MAAM,QAAA,GAAkB,QAAA,GAAW,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,GAAI,EAAC;AACxE,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAmCO,SAAS,MAAA,CAAO,CAAA,EAAW,IAAA,EAAa,QAAA,GAAW,KAAA,EAAe;AACvE,EAAA,mBAAA,CAAoB,GAAG,QAAQ,CAAA;AAG/B,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAChB,IAAA,MAAM,IAAI,qBAAA,CAAsB,wCAAA,EAA0C,GAAG,CAAA;AAAA,EAC/E;AAGA,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,IAAI,CAAA,CAAE,gBAAgB,aAAA,EAAe;AACnC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,QAAA,MAAA,CAAO,KAAK,MAAA,CAAO,gBAAA,CAAiB,EAAE,IAAA,EAAM,SAAS,CAAC,CAAC,CAAA;AAAA,MACzD;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,CAAA,CAAE,IAAA,EAAM,QAAQ,CAAA;AACtD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,QAAA,MAAA,CAAO,IAAA,CAAK,iBAAA,CAAkB,WAAA,EAAa,SAAS,CAAC,CAAA;AAAA,MACvD;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAE3B,IAAA,IAAI,WAAA;AACJ,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,SAAS,CAAC,CAAA;AAExC,IAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,KAAM,CAAA,EAAG;AAC3B,MAAA,WAAA,GAAA,CAAe,eAAA,CAAgB,QAAQ,GAAA,GAAM,CAAC,IAAI,eAAA,CAAgB,MAAA,EAAQ,GAAG,CAAA,IAAK,CAAA;AAAA,IACpF,CAAA,MAAO;AACL,MAAA,WAAA,GAAc,eAAA,CAAgB,QAAQ,GAAG,CAAA;AAAA,IAC3C;AAEA,IAAA,MAAMT,IAAAA,GAAM,IAAI,YAAA,CAAa,CAAC,CAAA;AAC9B,IAAAA,IAAAA,CAAI,CAAC,CAAA,GAAI,WAAA;AACT,IAAA,MAAM,QAAA,GAAkB,QAAA,GAAW,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,GAAI,EAAC;AAExE,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAMA,IAAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,KAAA,EAAO,SAAA;AAAA,MACP,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,EAAA,GAAK,aAAA,CAAc,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,EAAE,CAAA;AAEvC,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,MAAM,IAAI,WAAW,wCAAwC,CAAA;AAAA,EAC/D;AAGA,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,IAAA,IAAI,MAAM,EAAA,EAAI;AACZ,MAAA,IAAI,QAAA,EAAU,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA;AAAA,IAClC,CAAA,MAAO;AACL,MAAA,WAAA,CAAY,IAAA,CAAK,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,IAC1C;AAAA,EACF;AACA,EAAA,aAAA,CAAc,WAAW,CAAA;AAEzB,EAAA,MAAM,OAAA,GAAU,YAAY,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AACrD,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,OAAO,CAAA;AAGpC,EAAA,MAAM,UAAA,GAAa,IAAI,KAAA,CAAc,WAAA,CAAY,MAAM,CAAA;AACvD,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,IAAS,IAAI,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAChD,IAAA,UAAA,CAAW,CAAC,CAAA,GAAI,MAAA;AAChB,IAAA,MAAA,IAAU,eAAA,CAAgB,aAAa,CAAC,CAAA;AAAA,EAC1C;AAGA,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,OAAA,EAAS,OAAA,EAAA,EAAW;AAElD,IAAA,IAAI,GAAA,GAAM,OAAA;AACV,IAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAc,WAAA,CAAY,MAAM,CAAA;AACnD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AAC3C,MAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,UAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAC1C,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAC9B,MAAA,GAAA,IAAO,CAAA;AAAA,IACT;AAGA,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AACtC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,KAAM,KAAK,CAAA,GAAI,eAAA,CAAgB,QAAQ,CAAC,CAAA;AAAA,MACrD;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAI,OAAA,GAAU,CAAA;AACd,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,IAAI,MAAM,EAAA,EAAI;AACZ,UAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AAAA,QACb,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,CAAC,CAAA,GAAI,eAAA,CAAgB,MAAA,EAAQ,OAAO,CAAA;AAC1C,UAAA,OAAA,EAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,aAAa,CAAA,CAAE,MAAA;AACnB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,UAAA,IAAc,gBAAgB,KAAA,EAAO,CAAC,IAAI,eAAA,CAAgB,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,IACxE;AAEA,IAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,CAAA,CAAE,OAAA,EAAS,EAAE,CAAA;AAGhD,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,IAAI,CAAA,CAAE,gBAAgB,aAAA,EAAe;AACnC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,QAAA,MAAA,CAAO,IAAA,CAAK,OAAO,gBAAA,CAAiB,CAAA,CAAE,MAAM,UAAA,GAAa,CAAA,GAAI,UAAU,CAAC,CAAC,CAAA;AAAA,MAC3E;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,CAAA,CAAE,IAAA,EAAM,QAAQ,CAAA;AACtD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,QAAA,MAAA,CAAO,KAAK,iBAAA,CAAkB,WAAA,EAAa,UAAA,GAAa,CAAA,GAAI,UAAU,CAAC,CAAA;AAAA,MACzE;AAAA,IACF;AAGA,IAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAC3B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,SAAS,CAAC,CAAA;AAExC,IAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,KAAM,CAAA,EAAG;AAC3B,MAAA,GAAA,CAAI,OAAO,CAAA,GAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,GAAA,GAAM,CAAC,CAAA,GAAI,eAAA,CAAgB,MAAA,EAAQ,GAAG,CAAA,IAAK,CAAA;AAAA,IACrF,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,OAAO,CAAA,GAAI,eAAA,CAAgB,MAAA,EAAQ,GAAG,CAAA;AAAA,IAC5C;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAoB,WAAA;AAC1B,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,UAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAwBO,SAAS,MAAA,CAAO,GAAW,IAAA,EAAqB;AAErD,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,yCAAyC,CAAA;AAAA,EAChE;AAEA,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,MAAM,EAAA,GAAK,aAAA,CAAc,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AACrC,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,EAAE,CAAA;AAEvC,IAAA,MAAM,UAAA,GAAa,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AAC3C,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,IAAS,IAAI,CAAA,CAAE,IAAA,GAAO,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACpC,MAAA,UAAA,CAAW,CAAC,CAAA,GAAI,MAAA;AAChB,MAAA,MAAA,IAAU,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA;AAAA,IAClC;AAEA,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,IAAI,CAAA,KAAM,IAAI,SAAA,CAAU,IAAA,CAAK,YAAY,CAAA,CAAE,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,IACtD;AACA,IAAA,MAAM,QAAA,GAAW,UAAU,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAEpD,IAAA,IAAI,CAAA,CAAE,gBAAgB,aAAA,EAAe;AACnC,MAAA,MAAMA,IAAAA,GAAM,IAAI,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AACpC,MAAA,KAAA,IAAS,QAAA,GAAW,CAAA,EAAG,QAAA,GAAW,QAAA,EAAU,QAAA,EAAA,EAAY;AACtD,QAAA,IAAI,GAAA,GAAM,QAAA;AACV,QAAA,MAAM,OAAA,GAAU,IAAI,KAAA,CAAc,SAAA,CAAU,MAAM,CAAA;AAClD,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,UAAA,MAAM,CAAA,GAAI,SAAA,CAAU,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AAC1D,UAAA,OAAA,CAAQ,CAAC,IAAI,SAAA,CAAU,MAAA,KAAW,IAAI,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA;AAC5D,UAAA,GAAA,GAAM,SAAA,CAAU,MAAA,KAAW,CAAA,GAAI,CAAA,GAAI,GAAA,GAAM,CAAA;AAAA,QAC3C;AAEA,QAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AACtC,QAAA,IAAI,OAAA,GAAU,CAAA;AACd,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,UAAA,IAAI,MAAM,EAAA,EAAI;AACZ,YAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AAAA,UACb,CAAA,MAAO;AACL,YAAA,KAAA,CAAM,CAAC,CAAA,GAAI,OAAA,CAAQ,OAAO,CAAA,IAAK,CAAA;AAC/B,YAAA,OAAA,EAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,eAAe,CAAA,CAAE,MAAA;AACrB,QAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,UAAA,YAAA,IAAgB,gBAAgB,KAAA,EAAO,CAAC,IAAI,eAAA,CAAgB,CAAA,CAAE,SAAS,CAAC,CAAA;AACxE,UAAA,aAAA,IAAiB,gBAAgB,KAAA,EAAO,CAAC,CAAA,GAAI,eAAA,CAAgB,YAAY,CAAC,CAAA;AAAA,QAC5E;AAEA,QAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,CAAA,CAAE,OAAA,EAAS,EAAE,CAAA;AAChD,QAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,UAAA,EAAY,EAAE,CAAA;AACpD,QAAA,IAAIQ,IAAAA,GAAM,EAAA;AACV,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,UAAAA,QAAO,gBAAA,CAAiB,CAAA,CAAE,IAAA,EAAM,YAAA,GAAe,IAAI,UAAU,CAAA;AAC7D,UAAAR,IAAAA,CAAI,aAAA,GAAgB,CAAA,GAAI,aAAa,CAAA,GAAIQ,IAAAA;AAAA,QAC3C;AAAA,MACF;AAEA,MAAA,OAAO,OAAO,cAAA,CAAe;AAAA,QAC3B,IAAA,EAAMR,IAAAA;AAAA,QACN,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,KAAA,EAAO,OAAA;AAAA,QACP,QAAQ,CAAA,CAAE;AAAA,OACX,CAAA;AAAA,IACH;AAEA,IAAA,MAAMe,YAAAA,GAAc,iBAAA,CAAkB,CAAA,CAAE,IAAA,EAAM,QAAQ,CAAA;AACtD,IAAA,MAAMf,IAAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,IAAA,KAAA,IAAS,QAAA,GAAW,CAAA,EAAG,QAAA,GAAW,QAAA,EAAU,QAAA,EAAA,EAAY;AACtD,MAAA,IAAI,GAAA,GAAM,QAAA;AACV,MAAA,MAAM,OAAA,GAAU,IAAI,KAAA,CAAc,SAAA,CAAU,MAAM,CAAA;AAClD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,QAAA,MAAM,CAAA,GAAI,SAAA,CAAU,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AAC1D,QAAA,OAAA,CAAQ,CAAC,IAAI,SAAA,CAAU,MAAA,KAAW,IAAI,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA;AAC5D,QAAA,GAAA,GAAM,SAAA,CAAU,MAAA,KAAW,CAAA,GAAI,CAAA,GAAI,GAAA,GAAM,CAAA;AAAA,MAC3C;AAEA,MAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AACtC,MAAA,IAAI,OAAA,GAAU,CAAA;AACd,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,IAAI,MAAM,EAAA,EAAI;AACZ,UAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AAAA,QACb,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,CAAC,CAAA,GAAI,OAAA,CAAQ,OAAO,CAAA,IAAK,CAAA;AAC/B,UAAA,OAAA,EAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,eAAe,CAAA,CAAE,MAAA;AACrB,MAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,YAAA,IAAgB,gBAAgB,KAAA,EAAO,CAAC,IAAI,eAAA,CAAgB,CAAA,CAAE,SAAS,CAAC,CAAA;AACxE,QAAA,aAAA,IAAiB,gBAAgB,KAAA,EAAO,CAAC,CAAA,GAAI,eAAA,CAAgB,YAAY,CAAC,CAAA;AAAA,MAC5E;AAEA,MAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,CAAA,CAAE,OAAA,EAAS,EAAE,CAAA;AAChD,MAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,UAAA,EAAY,EAAE,CAAA;AACpD,MAAA,IAAIQ,IAAAA,GAAM,CAAA;AACV,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,QAAAA,IAAAA,IAAO,iBAAA,CAAkBO,YAAAA,EAAa,YAAA,GAAe,IAAI,UAAU,CAAA;AACnE,QAAAf,IAAAA,CAAI,aAAA,GAAgB,CAAA,GAAI,aAAa,CAAA,GAAIQ,IAAAA;AAAA,MAC3C;AAAA,IACF;AAEA,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAMR,IAAAA;AAAA,MACN,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,KAAA,EAAO,SAAA;AAAA,MACP,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAGlD,EAAA,IAAI,CAAA,CAAE,gBAAgB,aAAA,EAAe;AACnC,IAAA,MAAMA,IAAAA,GAAM,IAAI,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AACpC,IAAA,IAAIQ,IAAAA,GAAM,EAAA;AAGV,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAAA,IAAAA,IAAO,gBAAA,CAAiB,CAAA,CAAE,IAAA,EAAM,SAAS,CAAA;AACzC,MAAAR,IAAAA,CAAI,CAAC,CAAA,GAAIQ,IAAAA;AAAA,IACX;AAEA,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAMR,IAAAA;AAAA,MACN,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,KAAA,EAAO,OAAA;AAAA,MACP,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAIA,EAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,CAAA,CAAE,IAAA,EAAM,QAAQ,CAAA;AACtD,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,IAAI,GAAA,GAAM,CAAA;AAGV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,IAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,IAAA,GAAA,IAAO,iBAAA,CAAkB,aAAa,SAAS,CAAA;AAC/C,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA;AAAA,EACX;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAwBO,SAAS,OAAA,CAAQ,GAAW,IAAA,EAAqB;AAEtD,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,0CAA0C,CAAA;AAAA,EACjE;AAEA,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,MAAM,EAAA,GAAK,aAAA,CAAc,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AACrC,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,EAAE,CAAA;AAEvC,IAAA,MAAM,UAAA,GAAa,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AAC3C,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,IAAS,IAAI,CAAA,CAAE,IAAA,GAAO,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACpC,MAAA,UAAA,CAAW,CAAC,CAAA,GAAI,MAAA;AAChB,MAAA,MAAA,IAAU,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA;AAAA,IAClC;AAEA,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,IAAI,CAAA,KAAM,IAAI,SAAA,CAAU,IAAA,CAAK,YAAY,CAAA,CAAE,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,IACtD;AACA,IAAA,MAAM,QAAA,GAAW,UAAU,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAEpD,IAAA,IAAI,CAAA,CAAE,gBAAgB,aAAA,EAAe;AACnC,MAAA,MAAMA,IAAAA,GAAM,IAAI,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AACpC,MAAA,KAAA,IAAS,QAAA,GAAW,CAAA,EAAG,QAAA,GAAW,QAAA,EAAU,QAAA,EAAA,EAAY;AACtD,QAAA,IAAI,GAAA,GAAM,QAAA;AACV,QAAA,MAAM,OAAA,GAAU,IAAI,KAAA,CAAc,SAAA,CAAU,MAAM,CAAA;AAClD,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,UAAA,MAAM,CAAA,GAAI,SAAA,CAAU,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AAC1D,UAAA,OAAA,CAAQ,CAAC,IAAI,SAAA,CAAU,MAAA,KAAW,IAAI,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA;AAC5D,UAAA,GAAA,GAAM,SAAA,CAAU,MAAA,KAAW,CAAA,GAAI,CAAA,GAAI,GAAA,GAAM,CAAA;AAAA,QAC3C;AAEA,QAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AACtC,QAAA,IAAI,OAAA,GAAU,CAAA;AACd,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,UAAA,IAAI,MAAM,EAAA,EAAI;AACZ,YAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AAAA,UACb,CAAA,MAAO;AACL,YAAA,KAAA,CAAM,CAAC,CAAA,GAAI,OAAA,CAAQ,OAAO,CAAA,IAAK,CAAA;AAC/B,YAAA,OAAA,EAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,eAAe,CAAA,CAAE,MAAA;AACrB,QAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,UAAA,YAAA,IAAgB,gBAAgB,KAAA,EAAO,CAAC,IAAI,eAAA,CAAgB,CAAA,CAAE,SAAS,CAAC,CAAA;AACxE,UAAA,aAAA,IAAiB,gBAAgB,KAAA,EAAO,CAAC,CAAA,GAAI,eAAA,CAAgB,YAAY,CAAC,CAAA;AAAA,QAC5E;AAEA,QAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,CAAA,CAAE,OAAA,EAAS,EAAE,CAAA;AAChD,QAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,UAAA,EAAY,EAAE,CAAA;AACpD,QAAA,IAAIQ,IAAAA,GAAM,EAAA;AACV,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,UAAAA,QAAO,gBAAA,CAAiB,CAAA,CAAE,IAAA,EAAM,YAAA,GAAe,IAAI,UAAU,CAAA;AAC7D,UAAAR,IAAAA,CAAI,aAAA,GAAgB,CAAA,GAAI,aAAa,CAAA,GAAIQ,IAAAA;AAAA,QAC3C;AAAA,MACF;AAEA,MAAA,OAAO,OAAO,cAAA,CAAe;AAAA,QAC3B,IAAA,EAAMR,IAAAA;AAAA,QACN,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,KAAA,EAAO,OAAA;AAAA,QACP,QAAQ,CAAA,CAAE;AAAA,OACX,CAAA;AAAA,IACH;AAEA,IAAA,MAAMe,YAAAA,GAAc,iBAAA,CAAkB,CAAA,CAAE,IAAA,EAAM,SAAS,CAAA;AACvD,IAAA,MAAMf,IAAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,IAAA,KAAA,IAAS,QAAA,GAAW,CAAA,EAAG,QAAA,GAAW,QAAA,EAAU,QAAA,EAAA,EAAY;AACtD,MAAA,IAAI,GAAA,GAAM,QAAA;AACV,MAAA,MAAM,OAAA,GAAU,IAAI,KAAA,CAAc,SAAA,CAAU,MAAM,CAAA;AAClD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,QAAA,MAAM,CAAA,GAAI,SAAA,CAAU,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AAC1D,QAAA,OAAA,CAAQ,CAAC,IAAI,SAAA,CAAU,MAAA,KAAW,IAAI,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA;AAC5D,QAAA,GAAA,GAAM,SAAA,CAAU,MAAA,KAAW,CAAA,GAAI,CAAA,GAAI,GAAA,GAAM,CAAA;AAAA,MAC3C;AAEA,MAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AACtC,MAAA,IAAI,OAAA,GAAU,CAAA;AACd,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,IAAI,MAAM,EAAA,EAAI;AACZ,UAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AAAA,QACb,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,CAAC,CAAA,GAAI,OAAA,CAAQ,OAAO,CAAA,IAAK,CAAA;AAC/B,UAAA,OAAA,EAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,eAAe,CAAA,CAAE,MAAA;AACrB,MAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,YAAA,IAAgB,gBAAgB,KAAA,EAAO,CAAC,IAAI,eAAA,CAAgB,CAAA,CAAE,SAAS,CAAC,CAAA;AACxE,QAAA,aAAA,IAAiB,gBAAgB,KAAA,EAAO,CAAC,CAAA,GAAI,eAAA,CAAgB,YAAY,CAAC,CAAA;AAAA,MAC5E;AAEA,MAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,CAAA,CAAE,OAAA,EAAS,EAAE,CAAA;AAChD,MAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,UAAA,EAAY,EAAE,CAAA;AACpD,MAAA,IAAIQ,IAAAA,GAAM,CAAA;AACV,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,QAAAA,IAAAA,IAAO,iBAAA,CAAkBO,YAAAA,EAAa,YAAA,GAAe,IAAI,UAAU,CAAA;AACnE,QAAAf,IAAAA,CAAI,aAAA,GAAgB,CAAA,GAAI,aAAa,CAAA,GAAIQ,IAAAA;AAAA,MAC3C;AAAA,IACF;AAEA,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAMR,IAAAA;AAAA,MACN,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,KAAA,EAAO,SAAA;AAAA,MACP,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAGlD,EAAA,IAAI,CAAA,CAAE,gBAAgB,aAAA,EAAe;AACnC,IAAA,MAAMA,IAAAA,GAAM,IAAI,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AACpC,IAAA,IAAIQ,IAAAA,GAAM,EAAA;AAGV,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAAA,IAAAA,IAAO,gBAAA,CAAiB,CAAA,CAAE,IAAA,EAAM,SAAS,CAAA;AACzC,MAAAR,IAAAA,CAAI,CAAC,CAAA,GAAIQ,IAAAA;AAAA,IACX;AAEA,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAMR,IAAAA;AAAA,MACN,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,KAAA,EAAO,OAAA;AAAA,MACP,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAIA,EAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,CAAA,CAAE,IAAA,EAAM,SAAS,CAAA;AACvD,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,IAAI,GAAA,GAAM,CAAA;AAGV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,IAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,IAAA,GAAA,IAAO,iBAAA,CAAkB,aAAa,SAAS,CAAA;AAC/C,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA;AAAA,EACX;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AA0BO,SAAS,IAAA,CAAK,CAAA,EAAW,CAAA,GAAI,CAAA,EAAG,OAAO,EAAA,EAAY;AAExD,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,IAAI,CAAA,EAAG;AACT,IAAA,MAAM,IAAI,qBAAA,CAAsB,gBAAA,EAAkB,GAAA,EAAK,CAAC,CAAA;AAAA,EAC1D;AAEA,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAA,GAAK,aAAA,CAAc,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AAErC,EAAA,MAAM,QAAA,GAAW,CAAC,KAAA,EAAe,OAAA,KAA4B;AAC3D,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,KAAA,CAAM,KAAA,EAAO,OAAO,CAAA;AAChD,IAAA,MAAM,QAAA,GAAW,CAAC,GAAG,KAAA,CAAM,KAAK,CAAA;AAChC,IAAA,QAAA,CAAS,OAAO,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,OAAA,GAAU,GAAG,CAAC,CAAA;AAC3C,IAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,IAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAElD,IAAA,IAAI,KAAA,CAAM,gBAAgB,aAAA,EAAe;AACvC,MAAA,MAAMkB,QAAAA,GAAU,IAAI,aAAA,CAAc,OAAO,CAAA;AACzC,MAAA,IAAI,YAAY,CAAA,EAAG;AACjB,QAAA,OAAO,OAAO,cAAA,CAAe;AAAA,UAC3B,IAAA,EAAMA,QAAAA;AAAA,UACN,KAAA,EAAO,QAAA;AAAA,UACP,KAAA,EAAO,OAAA;AAAA,UACP,QAAQ,KAAA,CAAM;AAAA,SACf,CAAA;AAAA,MACH;AAEA,MAAA,MAAMC,WAAAA,GAAa,IAAI,KAAA,CAAc,QAAA,CAAS,MAAM,CAAA;AACpD,MAAA,IAAIC,OAAAA,GAAS,CAAA;AACb,MAAA,KAAA,IAAS,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC7C,QAAAD,WAAAA,CAAW,CAAC,CAAA,GAAIC,OAAAA;AAChB,QAAAA,OAAAA,IAAU,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA;AAAA,MAC3B;AACA,MAAA,MAAMC,aAAY,KAAA,CAAM,OAAA;AAExB,MAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,OAAA,EAAS,OAAA,EAAA,EAAW;AAClD,QAAA,IAAI,GAAA,GAAM,OAAA;AACV,QAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAc,KAAA,CAAM,IAAI,CAAA;AAC3C,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,UAAA,MAAMD,OAAAA,GAASD,WAAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAChC,UAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAMC,OAAM,CAAA;AACnC,UAAA,GAAA,IAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA,IAAKA,OAAAA;AAAA,QAC5B;AAEA,QAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAO,CAAA,IAAK,CAAA;AACnC,QAAA,MAAM,UAAU,OAAA,GAAU,CAAA;AAC1B,QAAA,IAAI,aAAa,KAAA,CAAM,MAAA;AACvB,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,UAAA,UAAA,IAAA,CAAe,OAAO,CAAC,CAAA,IAAK,CAAA,KAAMC,UAAAA,CAAU,CAAC,CAAA,IAAK,CAAA,CAAA;AAAA,QACpD;AAEA,QAAA,MAAM,UAAA,GAAaA,UAAAA,CAAU,OAAO,CAAA,IAAK,CAAA;AACzC,QAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,KAAA,CAAM,IAAA,EAAM,UAAU,CAAA;AACpD,QAAA,MAAM,OAAO,gBAAA,CAAiB,KAAA,CAAM,MAAM,UAAA,GAAA,CAAc,OAAA,GAAU,WAAW,UAAU,CAAA;AACvF,QAAAH,QAAAA,CAAQ,OAAO,CAAA,GAAI,IAAA,GAAO,IAAA;AAAA,MAC5B;AAEA,MAAA,OAAO,OAAO,cAAA,CAAe;AAAA,QAC3B,IAAA,EAAMA,QAAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,KAAA,EAAO,OAAA;AAAA,QACP,QAAQ,KAAA,CAAM;AAAA,OACf,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,OAAO,CAAA;AACxC,IAAA,IAAI,YAAY,CAAA,EAAG;AACjB,MAAA,OAAO,OAAO,cAAA,CAAe;AAAA,QAC3B,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,KAAA,EAAO,SAAA;AAAA,QACP,QAAQ,KAAA,CAAM;AAAA,OACf,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,UAAA,GAAa,IAAI,KAAA,CAAc,QAAA,CAAS,MAAM,CAAA;AACpD,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,IAAS,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC7C,MAAA,UAAA,CAAW,CAAC,CAAA,GAAI,MAAA;AAChB,MAAA,MAAA,IAAU,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA;AAAA,IAC3B;AACA,IAAA,MAAM,YAAY,KAAA,CAAM,OAAA;AACxB,IAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,KAAA,CAAM,IAAA,EAAM,MAAM,CAAA;AAExD,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,OAAA,EAAS,OAAA,EAAA,EAAW;AAClD,MAAA,IAAI,GAAA,GAAM,OAAA;AACV,MAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAc,KAAA,CAAM,IAAI,CAAA;AAC3C,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,QAAA,MAAME,OAAAA,GAAS,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAChC,QAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAMA,OAAM,CAAA;AACnC,QAAA,GAAA,IAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA,IAAKA,OAAAA;AAAA,MAC5B;AAEA,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAO,CAAA,IAAK,CAAA;AACnC,MAAA,MAAM,UAAU,OAAA,GAAU,CAAA;AAC1B,MAAA,IAAI,aAAa,KAAA,CAAM,MAAA;AACvB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,QAAA,UAAA,IAAA,CAAe,OAAO,CAAC,CAAA,IAAK,CAAA,KAAM,SAAA,CAAU,CAAC,CAAA,IAAK,CAAA,CAAA;AAAA,MACpD;AAEA,MAAA,MAAM,UAAA,GAAa,SAAA,CAAU,OAAO,CAAA,IAAK,CAAA;AACzC,MAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,WAAA,EAAa,UAAU,CAAA;AACtD,MAAA,MAAM,OAAO,iBAAA,CAAkB,WAAA,EAAa,UAAA,GAAA,CAAc,OAAA,GAAU,WAAW,UAAU,CAAA;AACzF,MAAA,OAAA,CAAQ,OAAO,IAAI,IAAA,GAAO,IAAA;AAAA,IAC5B;AAEA,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,KAAA,EAAO,SAAA;AAAA,MACP,QAAQ,KAAA,CAAM;AAAA,KACf,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAA,GAAS,QAAA,CAAS,QAAQ,EAAE,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,MAAA;AACT;AA0BO,SAAS,GAAA,CAAI,CAAA,EAAW,IAAA,EAA0B,QAAA,GAAW,KAAA,EAAe;AACjF,EAAA,mBAAA,CAAoB,GAAG,KAAK,CAAA;AAE5B,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,EAAe,EAAA,EAAY,IAAA,KAA0B;AACpE,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,KAAA,CAAM,KAAA,EAAO,EAAE,CAAA;AAC3C,IAAA,MAAM,cAAwB,EAAC;AAC/B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,MAAA,IAAI,MAAM,EAAA,EAAI;AACZ,QAAA,IAAI,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA;AAAA,MAC9B,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,MAC9C;AAAA,IACF;AACA,IAAA,aAAA,CAAc,WAAW,CAAA;AAEzB,IAAA,MAAM,OAAA,GAAU,YAAY,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AACrD,IAAA,MAAM,OAAA,GAAU,IAAI,UAAA,CAAW,OAAO,CAAA;AAEtC,IAAA,MAAM,UAAA,GAAa,IAAI,KAAA,CAAc,WAAA,CAAY,MAAM,CAAA;AACvD,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,IAAS,IAAI,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAChD,MAAA,UAAA,CAAW,CAAC,CAAA,GAAI,MAAA;AAChB,MAAA,MAAA,IAAU,eAAA,CAAgB,aAAa,CAAC,CAAA;AAAA,IAC1C;AAEA,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,OAAA,EAAS,OAAA,EAAA,EAAW;AAClD,MAAA,IAAI,GAAA,GAAM,OAAA;AACV,MAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAc,WAAA,CAAY,MAAM,CAAA;AACnD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AAC3C,QAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,UAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAC1C,QAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAC9B,QAAA,GAAA,IAAO,CAAA;AAAA,MACT;AAEA,MAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAc,KAAA,CAAM,IAAI,CAAA;AAC1C,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,UAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,KAAM,KAAK,CAAA,GAAI,eAAA,CAAgB,QAAQ,CAAC,CAAA;AAAA,QACrD;AAAA,MACF,CAAA,MAAO;AACL,QAAA,IAAI,OAAA,GAAU,CAAA;AACd,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,UAAA,IAAI,MAAM,EAAA,EAAI;AACZ,YAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AAAA,UACb,CAAA,MAAO;AACL,YAAA,KAAA,CAAM,CAAC,CAAA,GAAI,eAAA,CAAgB,MAAA,EAAQ,OAAO,CAAA;AAC1C,YAAA,OAAA,EAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,YAAY,CAAA,EAAG;AACjB,QAAA,OAAA,CAAQ,OAAO,CAAA,GAAI,CAAA;AACnB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,aAAa,KAAA,CAAM,MAAA;AACvB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,QAAA,UAAA,IAAc,gBAAgB,KAAA,EAAO,CAAC,IAAI,eAAA,CAAgB,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,MAC5E;AAEA,MAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,KAAA,CAAM,OAAA,EAAS,EAAE,CAAA;AACpD,MAAA,IAAIzB,OAAAA,GAAS,CAAA;AACb,MAAA,IAAI,KAAA,CAAM,gBAAgB,aAAA,EAAe;AACvC,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,UAAA,IAAI,iBAAiB,KAAA,CAAM,IAAA,EAAM,aAAa,CAAA,GAAI,UAAU,MAAM,EAAA,EAAI;AACpE,YAAAA,OAAAA,GAAS,CAAA;AACT,YAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,KAAA,CAAM,IAAA,EAAM,KAAK,CAAA;AACvD,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,UAAA,IAAI,kBAAkB,WAAA,EAAa,UAAA,GAAa,CAAA,GAAI,UAAU,MAAM,CAAA,EAAG;AACrE,YAAAA,OAAAA,GAAS,CAAA;AACT,YAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,OAAO,CAAA,GAAIA,OAAAA;AAAA,IACrB;AAEA,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,WAAA;AAAA,MACP,KAAA,EAAO,MAAA;AAAA,MACP,QAAQ,KAAA,CAAM;AAAA,KACf,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,WACX,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,GACjC,IAAA,CAAK,OAAM,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AACrC,IAAA,IAAIA,OAAAA,GAAiB,CAAA;AACrB,IAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,MAAAA,OAAAA,GAAS,OAAA,CAAQA,OAAAA,EAAQ,EAAA,EAAI,QAAQ,CAAA;AAAA,IACvC;AACA,IAAA,OAAOA,OAAAA;AAAA,EACT;AAGA,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,IAAI,CAAA,CAAE,gBAAgB,aAAA,EAAe;AAEnC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,IAAI,gBAAA,CAAiB,CAAA,CAAE,IAAA,EAAM,SAAS,MAAM,EAAA,EAAI;AAC9C,QAAA,MAAA,GAAS,IAAA;AACT,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,CAAA,CAAE,IAAA,EAAM,KAAK,CAAA;AACnD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,IAAI,iBAAA,CAAkB,WAAA,EAAa,SAAS,CAAA,KAAM,CAAA,EAAG;AACnD,QAAA,MAAA,GAAS,IAAA;AACT,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,CAAC,CAAA;AAC5B,EAAA,GAAA,CAAI,CAAC,CAAA,GAAI,MAAA,GAAS,CAAA,GAAI,CAAA;AACtB,EAAA,MAAM,QAAA,GAAkB,QAAA,GAAW,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,GAAI,EAAC;AAExE,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AA0BO,SAAS,GAAA,CAAI,CAAA,EAAW,IAAA,EAA0B,QAAA,GAAW,KAAA,EAAe;AACjF,EAAA,mBAAA,CAAoB,GAAG,KAAK,CAAA;AAE5B,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,EAAe,EAAA,EAAY,IAAA,KAA0B;AACpE,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,KAAA,CAAM,KAAA,EAAO,EAAE,CAAA;AAC3C,IAAA,MAAM,cAAwB,EAAC;AAC/B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,MAAA,IAAI,MAAM,EAAA,EAAI;AACZ,QAAA,IAAI,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA;AAAA,MAC9B,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,MAC9C;AAAA,IACF;AACA,IAAA,aAAA,CAAc,WAAW,CAAA;AAEzB,IAAA,MAAM,OAAA,GAAU,YAAY,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AACrD,IAAA,MAAM,OAAA,GAAU,IAAI,UAAA,CAAW,OAAO,CAAA;AAEtC,IAAA,MAAM,UAAA,GAAa,IAAI,KAAA,CAAc,WAAA,CAAY,MAAM,CAAA;AACvD,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,IAAS,IAAI,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAChD,MAAA,UAAA,CAAW,CAAC,CAAA,GAAI,MAAA;AAChB,MAAA,MAAA,IAAU,eAAA,CAAgB,aAAa,CAAC,CAAA;AAAA,IAC1C;AAEA,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,OAAA,EAAS,OAAA,EAAA,EAAW;AAClD,MAAA,IAAI,GAAA,GAAM,OAAA;AACV,MAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAc,WAAA,CAAY,MAAM,CAAA;AACnD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AAC3C,QAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,UAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAC1C,QAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAC9B,QAAA,GAAA,IAAO,CAAA;AAAA,MACT;AAEA,MAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAc,KAAA,CAAM,IAAI,CAAA;AAC1C,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,UAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,KAAM,KAAK,CAAA,GAAI,eAAA,CAAgB,QAAQ,CAAC,CAAA;AAAA,QACrD;AAAA,MACF,CAAA,MAAO;AACL,QAAA,IAAI,OAAA,GAAU,CAAA;AACd,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,UAAA,IAAI,MAAM,EAAA,EAAI;AACZ,YAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AAAA,UACb,CAAA,MAAO;AACL,YAAA,KAAA,CAAM,CAAC,CAAA,GAAI,eAAA,CAAgB,MAAA,EAAQ,OAAO,CAAA;AAC1C,YAAA,OAAA,EAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,YAAY,CAAA,EAAG;AACjB,QAAA,OAAA,CAAQ,OAAO,CAAA,GAAI,CAAA;AACnB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,aAAa,KAAA,CAAM,MAAA;AACvB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK;AACnC,QAAA,UAAA,IAAc,gBAAgB,KAAA,EAAO,CAAC,IAAI,eAAA,CAAgB,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,MAC5E;AAEA,MAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,KAAA,CAAM,OAAA,EAAS,EAAE,CAAA;AACpD,MAAA,IAAIA,OAAAA,GAAS,CAAA;AACb,MAAA,IAAI,KAAA,CAAM,gBAAgB,aAAA,EAAe;AACvC,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,UAAA,IAAI,iBAAiB,KAAA,CAAM,IAAA,EAAM,aAAa,CAAA,GAAI,UAAU,MAAM,EAAA,EAAI;AACpE,YAAAA,OAAAA,GAAS,CAAA;AACT,YAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,KAAA,CAAM,IAAA,EAAM,KAAK,CAAA;AACvD,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,UAAA,IAAI,kBAAkB,WAAA,EAAa,UAAA,GAAa,CAAA,GAAI,UAAU,MAAM,CAAA,EAAG;AACrE,YAAAA,OAAAA,GAAS,CAAA;AACT,YAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,OAAO,CAAA,GAAIA,OAAAA;AAAA,IACrB;AAEA,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,WAAA;AAAA,MACP,KAAA,EAAO,MAAA;AAAA,MACP,QAAQ,KAAA,CAAM;AAAA,KACf,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,WACX,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,GACjC,IAAA,CAAK,OAAM,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AACrC,IAAA,IAAIA,OAAAA,GAAiB,CAAA;AACrB,IAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,MAAAA,OAAAA,GAAS,OAAA,CAAQA,OAAAA,EAAQ,EAAA,EAAI,QAAQ,CAAA;AAAA,IACvC;AACA,IAAA,OAAOA,OAAAA;AAAA,EACT;AAGA,EAAA,IAAI,MAAA,GAAS,IAAA;AACb,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,IAAI,CAAA,CAAE,gBAAgB,aAAA,EAAe;AAEnC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,IAAI,gBAAA,CAAiB,CAAA,CAAE,IAAA,EAAM,SAAS,MAAM,EAAA,EAAI;AAC9C,QAAA,MAAA,GAAS,KAAA;AACT,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,CAAA,CAAE,IAAA,EAAM,KAAK,CAAA;AACnD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,IAAI,iBAAA,CAAkB,WAAA,EAAa,SAAS,CAAA,KAAM,CAAA,EAAG;AACnD,QAAA,MAAA,GAAS,KAAA;AACT,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,CAAC,CAAA;AAC5B,EAAA,GAAA,CAAI,CAAC,CAAA,GAAI,MAAA,GAAS,CAAA,GAAI,CAAA;AACtB,EAAA,MAAM,QAAA,GAAkB,QAAA,GAAW,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,GAAI,EAAC;AAExE,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;;;ACz0EO,SAAS,IAAI,CAAA,EAAmB;AACrC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,qCAAqC,CAAA;AAAA,EAC5D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,qCAAqC,CAAA;AAAA,EAC5D;AAEA,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,IAAI,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACrD;AAAA,EACF,CAAA,MAAA,IAAW,UAAA,IAAc,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACvC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,CAAC,CAAW,CAAA;AAAA,IACrC;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,IAAI,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACtD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAOO,SAAS,IAAI,CAAA,EAAmB;AACrC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,qCAAqC,CAAA;AAAA,EAC5D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,qCAAqC,CAAA;AAAA,EAC5D;AAEA,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,IAAI,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACrD;AAAA,EACF,CAAA,MAAA,IAAW,UAAA,IAAc,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACvC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,CAAC,CAAW,CAAA;AAAA,IACrC;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,IAAI,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACtD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAOO,SAAS,IAAI,CAAA,EAAmB;AACrC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,qCAAqC,CAAA;AAAA,EAC5D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,qCAAqC,CAAA;AAAA,EAC5D;AAEA,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,IAAI,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACrD;AAAA,EACF,CAAA,MAAA,IAAW,UAAA,IAAc,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACvC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,CAAC,CAAW,CAAA;AAAA,IACrC;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,IAAI,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACtD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAOO,SAAS,KAAK,CAAA,EAAmB;AACtC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,KAAK,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACtD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,KAAK,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACvD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAOO,SAAS,KAAK,CAAA,EAAmB;AACtC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,KAAK,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACtD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,KAAK,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACvD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAOO,SAAS,KAAK,CAAA,EAAmB;AACtC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,KAAK,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACtD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,KAAK,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACvD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAOO,SAAS,KAAA,CAAM,GAAW,CAAA,EAAmB;AAClD,EAAA,IAAI,CAAA,CAAE,KAAA,KAAU,QAAA,IAAY,CAAA,CAAE,UAAU,QAAA,EAAU;AAChD,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,yBAAA,CAA0B,GAAG,CAAC,CAAA;AAE9B,EAAA,MAAM,SAAA,GAAY,SAAS,CAAC,CAAA;AAC5B,EAAA,MAAM,SAAA,GAAY,SAAS,CAAC,CAAA;AAC5B,EAAA,MAAM,QAAA,GAAkB,SAAA,GACpB,CAAA,CAAE,KAAA,GACF,SAAA,GACE,CAAA,CAAE,KAAA,GACF,iBAAA,CAAkB,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,KAAK,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,KAAK,CAAC,CAAA;AAE1D,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,OAAO,CAAA;AACpC,EAAA,MAAM,MAAA,GAAS,OAAO,cAAA,CAAe;AAAA,IACnC,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AAED,EAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,EAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAEhB,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,KAAK,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AAEnD,IAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAA;AACzC,IAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAA;AACzC,IAAA,GAAA,CAAI,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,EACrC,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,KAAK,CAAA,EAAmB;AACtC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,KAAK,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACtD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,KAAK,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACvD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAOO,SAAS,KAAK,CAAA,EAAmB;AACtC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,KAAK,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACtD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,KAAK,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACvD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAOO,SAAS,KAAK,CAAA,EAAmB;AACtC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,KAAK,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACtD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,KAAK,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACvD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAOO,SAAS,MAAM,CAAA,EAAmB;AACvC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACvD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACxD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAOO,SAAS,MAAM,CAAA,EAAmB;AACvC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACvD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACxD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAOO,SAAS,MAAM,CAAA,EAAmB;AACvC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAElD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,uCAAuC,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACvD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACxD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;;;ACnfA,SAAS2B,mBAAAA,CAAmB,OAAc,EAAA,EAA0B;AAClE,EAAA,IAAI,UAAU,QAAA,EAAU;AACtB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,EAAG,EAAE,CAAA,8BAAA,CAAgC,CAAA;AAAA,EAC5D;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,0BAA0B,IAAA,EAAsB;AACvD,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,IAAI,MAAA,GAAkB,IAAA;AACtB,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC5B,IAAA,KAAA,CAAM,IAAA,CAAK,OAAO,MAAM,CAAA;AACxB,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,MAAA,GAAS,OAAO,CAAC,CAAA;AAAA,EACnB;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,gCAAA,CAAiC,IAAA,EAAe,KAAA,EAAc,KAAA,GAAQ,CAAA,EAAS;AACtF,EAAA,IAAI,KAAA,KAAU,MAAM,MAAA,EAAQ;AAC1B,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,MAAA,MAAM,IAAI,oBAAoB,gDAAgD,CAAA;AAAA,IAChF;AACA,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACxB,IAAA,MAAM,IAAI,mBAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,KAAK,CAAA,IAAK,CAAA;AACpC,EAAA,IAAI,IAAA,CAAK,WAAW,WAAA,EAAa;AAC/B,IAAA,MAAM,IAAI,mBAAA;AAAA,MACR,kCAAkC,WAAW,CAAA,UAAA,EAAa,KAAK,CAAA,MAAA,EAAS,KAAK,MAAM,CAAA;AAAA,KACrF;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,IAAA,gCAAA,CAAiC,IAAA,EAAM,KAAA,EAAO,KAAA,GAAQ,CAAC,CAAA;AAAA,EACzD;AACF;AAEA,SAAS,gCAAgC,IAAA,EAAsB;AAC7D,EAAA,OAAO,0BAA0B,IAAI,CAAA;AACvC;AAEA,SAAS,0BAAA,CAA2B,IAAA,EAAe,KAAA,EAAc,KAAA,GAAQ,CAAA,EAAS;AAChF,EAAA,IAAI,KAAA,KAAU,MAAM,MAAA,EAAQ;AAC1B,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,MAAA,MAAM,IAAI,oBAAoB,yCAAyC,CAAA;AAAA,IACzE;AACA,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACxB,IAAA,MAAM,IAAI,oBAAoB,0DAA0D,CAAA;AAAA,EAC1F;AAEA,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,KAAK,CAAA,IAAK,CAAA;AACpC,EAAA,IAAI,IAAA,CAAK,WAAW,WAAA,EAAa;AAC/B,IAAA,MAAM,IAAI,mBAAA;AAAA,MACR,kCAAkC,WAAW,CAAA,UAAA,EAAa,KAAK,CAAA,MAAA,EAAS,KAAK,MAAM,CAAA;AAAA,KACrF;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,IAAA,0BAAA,CAA2B,IAAA,EAAM,KAAA,EAAO,KAAA,GAAQ,CAAC,CAAA;AAAA,EACnD;AACF;AAEA,SAAS,kBAAA,CAAmB,MAAe,GAAA,EAAqB;AAC9D,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,MAAA,kBAAA,CAAmB,MAAM,GAAG,CAAA;AAAA,IAC9B;AACA,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,IAAI,oBAAoB,iBAAiB,CAAA;AAAA,EACjD;AAEA,EAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AACf;AAEA,SAAS,wBAAA,CAAyB,MAAe,GAAA,EAAqB;AACpE,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,MAAA,wBAAA,CAAyB,MAAM,GAAG,CAAA;AAAA,IACpC;AACA,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,IAAI,oBAAoB,iBAAiB,CAAA;AAAA,EACjD;AAEA,EAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AACf;AAEA,SAAS,6BAAA,CAA8B,OAAc,KAAA,EAAgC;AACnF,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,OAAA;AACH,MAAA,IAAI,CAAC,OAAO,QAAA,CAAS,KAAK,KAAK,CAAC,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG;AACvD,QAAA,MAAM,IAAI,UAAA,CAAW,CAAA,sDAAA,EAAyD,KAAK,CAAA,CAAE,CAAA;AAAA,MACvF;AACA,MAAA,OAAO,OAAO,KAAK,CAAA;AAAA,IACrB,KAAK,MAAA;AACH,MAAA,OAAO,QAAQ,CAAA,GAAI,CAAA;AAAA,IACrB;AACE,MAAA,OAAO,KAAA;AAAA;AAEb;AAEA,SAAS,oBAAoB,IAAA,EAA8C;AACzE,EAAA,IAAI,MAAA,GAAsD,IAAA;AAC1D,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC5B,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAO,SAAA;AAAA,IACT;AACA,IAAA,MAAA,GAAS,OAAO,CAAC,CAAA;AAAA,EACnB;AACA,EAAA,OAAO,OAAO,MAAA,KAAW,QAAA,GAAW,QAAA,GAAW,SAAA;AACjD;AAEA,SAAS,yBAAyB,IAAA,EAAyB;AACzD,EAAA,IAAI,IAAA,YAAgB,cAAc,OAAO,SAAA;AACzC,EAAA,IAAI,IAAA,YAAgB,cAAc,OAAO,SAAA;AACzC,EAAA,IAAI,IAAA,YAAgB,YAAY,OAAO,OAAA;AACvC,EAAA,IAAI,IAAA,YAAgB,eAAe,OAAO,OAAA;AAC1C,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,+BAAA,CAAgC,MAAkB,KAAA,EAAuB;AAChF,EAAA,IAAI,KAAA,KAAU,UAAU,OAAO,KAAA;AAC/B,EAAA,IAAI,KAAA,KAAU,SAAA,EAAW,OAAO,IAAA,YAAgB,YAAA;AAChD,EAAA,IAAI,KAAA,KAAU,SAAA,EAAW,OAAO,IAAA,YAAgB,YAAA;AAChD,EAAA,IAAI,KAAA,KAAU,OAAA,EAAS,OAAO,IAAA,YAAgB,UAAA;AAC9C,EAAA,IAAI,KAAA,KAAU,OAAA,EAAS,OAAO,IAAA,YAAgB,aAAA;AAC9C,EAAA,IAAI,KAAA,KAAU,OAAA,IAAW,KAAA,KAAU,MAAA,SAAe,IAAA,YAAgB,UAAA;AAClE,EAAA,OAAO,KAAA;AACT;AAwCO,SAAS,MAAA,CACd,IAAA,EACA,IAAA,GAA4B,EAAC,EACrB;AACR,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,MAAA,CAAO,aAAA;AAErC,EAAA,IAAI,YAAA,CAAa,IAAI,CAAA,EAAG;AACtB,IAAA,MAAMC,SAAAA,GAAW,yBAAyB,IAAI,CAAA;AAC9C,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,IAAa,CAAC,gCAAgC,IAAA,EAAM,IAAA,CAAK,KAAK,CAAA,EAAG;AAClF,MAAA,MAAM,IAAI,UAAA;AAAA,QACR,cAAc,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,8BAAA,EAAiC,KAAK,KAAK,CAAA;AAAA,OAChF;AAAA,IACF;AACA,IAAA,MAAMC,MAAAA,GAAQ,KAAK,KAAA,IAASD,SAAAA;AAC5B,IAAA,MAAME,aAAAA,GAAeH,mBAAAA,CAAmBE,MAAAA,EAAO,QAAQ,CAAA;AACvD,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA;AAAA,MACA,KAAA,EAAO,CAAC,IAAA,CAAK,MAAM,CAAA;AAAA,MACnB,KAAA,EAAOC,aAAAA;AAAA,MACP;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,WAAW,IAAA,CAAK,KAAA,KAAU,MAAA,GAAY,mBAAA,CAAoB,IAAI,CAAA,GAAI,MAAA;AACxE,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,QAAA,IAAY,MAAA,CAAO,YAAA;AAE/C,EAAA,IAAI,UAAU,QAAA,EAAU;AACtB,IAAA,MAAMC,MAAAA,GAAQ,gCAAgC,IAAI,CAAA;AAClD,IAAA,aAAA,CAAcA,MAAK,CAAA;AACnB,IAAA,gCAAA,CAAiC,MAAMA,MAAK,CAAA;AAE5C,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,wBAAA,CAAyB,MAAM,IAAI,CAAA;AAEnC,IAAA,IAAI,WAAA,CAAYA,MAAK,CAAA,KAAM,IAAA,CAAK,MAAA,EAAQ;AACtC,MAAA,MAAM,IAAI,aAAa,yCAAyC,CAAA;AAAA,IAClE;AAEA,IAAA,OAAO,MAAA,CAAO,gBAAgB,EAAE,IAAA,EAAM,MAAM,KAAA,EAAAA,MAAAA,EAAO,QAAQ,CAAA;AAAA,EAC7D;AAEA,EAAA,MAAM,YAAA,GAAeJ,mBAAAA,CAAmB,KAAA,EAAO,QAAQ,CAAA;AACvD,EAAA,MAAM,KAAA,GAAQ,0BAA0B,IAAI,CAAA;AAC5C,EAAA,aAAA,CAAc,KAAK,CAAA;AACnB,EAAA,0BAAA,CAA2B,MAAM,KAAK,CAAA;AAEtC,EAAA,MAAM,IAAA,GAAO,YAAY,KAAK,CAAA;AAC9B,EAAA,MAAM,IAAA,GAAO,sBAAsB,YAAY,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,IAAI,CAAA;AAG3B,EAAA,IAAI,EAAE,KAAA,YAAiB,aAAA,CAAA,IAAkB,YAAA,KAAiB,OAAA,IAAW,iBAAiB,MAAA,EAAQ;AAC5F,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,MAAM,aAAA,GAAgB,CAAC,GAAA,KAAuB;AAC5C,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,UAAA,aAAA,CAAc,GAAA,CAAI,CAAC,CAAC,CAAA;AAAA,QACtB;AAAA,MACF,CAAA,MAAA,IAAW,OAAO,GAAA,KAAQ,QAAA,EAAU;AAClC,QAAA,KAAA,CAAM,KAAK,CAAA,GAAI,GAAA;AAAA,MACjB,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,oBAAoB,iBAAiB,CAAA;AAAA,MACjD;AAAA,IACF,CAAA;AACA,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,EACpB,CAAA,MAAO;AACL,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,kBAAA,CAAmB,MAAM,IAAI,CAAA;AAE7B,IAAA,IAAI,iBAAiB,aAAA,EAAe;AAClC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,QAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,QAAA,IAAI,MAAM,MAAA,EAAW;AACnB,UAAA,MAAM,IAAI,aAAa,yCAAyC,CAAA;AAAA,QAClE;AACA,QAAA,MAAM,OAAA,GAAU,6BAAA,CAA8B,YAAA,EAAc,CAAC,CAAA;AAC7D,QAAA,KAAA,CAAM,CAAC,CAAA,GAAI,OAAO,YAAY,QAAA,GAAW,OAAA,GAAU,OAAO,OAAO,CAAA;AAAA,MACnE;AAAA,IACF,CAAA,MAAO;AACL,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,QAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,QAAA,IAAI,MAAM,MAAA,EAAW;AACnB,UAAA,MAAM,IAAI,aAAa,yCAAyC,CAAA;AAAA,QAClE;AACA,QAAA,MAAM,OAAA,GAAU,6BAAA,CAA8B,YAAA,EAAc,CAAC,CAAA;AAC7D,QAAA,KAAA,CAAM,CAAC,CAAA,GAAI,OAAO,YAAY,QAAA,GAAW,OAAA,GAAU,OAAO,OAAO,CAAA;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,KAAA;AAAA,IACN,KAAA;AAAA,IACA,KAAA,EAAO,YAAA;AAAA,IACP;AAAA,GACD,CAAA;AACH;AAKO,SAAS,KAAA,CAAM,KAAA,EAAc,IAAA,GAA4B,EAAC,EAAW;AAC1E,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,MAAA,CAAO,YAAA;AACnC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,MAAA,CAAO,aAAA;AACrC,EAAA,IAAI,UAAU,QAAA,EAAU;AACtB,IAAA,OAAO,OAAO,KAAA,CAAM,KAAA,EAAO,EAAE,KAAA,EAAO,QAAQ,CAAA;AAAA,EAC9C;AACA,EAAA,MAAM,YAAA,GAAeA,mBAAAA,CAAmB,KAAA,EAAO,OAAO,CAAA;AACtD,EAAA,OAAO,OAAO,KAAA,CAAM,KAAA,EAAO,EAAE,KAAA,EAAO,YAAA,EAAc,QAAQ,CAAA;AAC5D;AAKO,SAAS,IAAA,CAAK,KAAA,EAAc,IAAA,GAA4B,EAAC,EAAW;AACzE,EAAA,aAAA,CAAc,KAAK,CAAA;AACnB,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,MAAA,CAAO,YAAA;AACnC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,MAAA,CAAO,aAAA;AAErC,EAAA,MAAM,IAAA,GAAO,YAAY,KAAK,CAAA;AAE9B,EAAA,IAAI,UAAU,QAAA,EAAU;AACtB,IAAA,MAAM7B,QAAO,IAAI,KAAA,CAAc,IAAI,CAAA,CAAE,KAAK,GAAG,CAAA;AAC7C,IAAA,OAAO,OAAO,eAAA,CAAgB,EAAE,MAAAA,KAAAA,EAAM,KAAA,EAAO,QAAQ,CAAA;AAAA,EACvD;AAEA,EAAA,MAAM,YAAA,GAAe6B,mBAAAA,CAAmB,KAAA,EAAO,MAAM,CAAA;AACrD,EAAA,MAAM,IAAA,GAAO,sBAAsB,YAAY,CAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,IAAI,CAAA;AAC1B,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,EACd,CAAA,MAAO;AACL,IAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,EACb;AACA,EAAA,OAAO,MAAA,CAAO,eAAe,EAAE,IAAA,EAAM,OAAO,KAAA,EAAO,YAAA,EAAc,QAAQ,CAAA;AAC3E;AAKO,SAAS,KAAA,CAAM,KAAA,EAAc,IAAA,GAA4B,EAAC,EAAW;AAC1E,EAAA,aAAA,CAAc,KAAK,CAAA;AACnB,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,MAAA,CAAO,YAAA;AACnC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,MAAA,CAAO,aAAA;AAErC,EAAA,MAAM,IAAA,GAAO,YAAY,KAAK,CAAA;AAC9B,EAAA,IAAI,UAAU,QAAA,EAAU;AACtB,IAAA,MAAM7B,KAAAA,GAAO,IAAI,KAAA,CAAc,IAAI,CAAA;AACnC,IAAA,OAAO,OAAO,eAAA,CAAgB,EAAE,MAAAA,KAAAA,EAAM,KAAA,EAAO,QAAQ,CAAA;AAAA,EACvD;AACA,EAAA,MAAM,YAAA,GAAe6B,mBAAAA,CAAmB,KAAA,EAAO,OAAO,CAAA;AACtD,EAAA,MAAM,IAAA,GAAO,sBAAsB,YAAY,CAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,IAAI,CAAA;AAE1B,EAAA,OAAO,MAAA,CAAO,eAAe,EAAE,IAAA,EAAM,OAAO,KAAA,EAAO,YAAA,EAAc,QAAQ,CAAA;AAC3E;AAEO,SAAS,IAAA,CAAK,KAAA,EAAc,KAAA,EAAwB,IAAA,GAA4B,EAAC,EAAW;AACjG,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,KAAA,EAAO,IAAI,CAAA;AAE3B,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,sDAAA,EAAyD,OAAO,KAAK,CAAA,CAAE,CAAA;AAAA,IAC9F;AACA,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAI,WAAW,6CAA6C,CAAA;AAAA,IACpE;AACA,IAAA,CAAA,CAAE,IAAA,CAAK,KAAK,KAAK,CAAA;AACjB,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,IAAI,UAAA;AAAA,MACR,CAAA,qCAAA,EAAwC,CAAA,CAAE,KAAK,CAAA,WAAA,EAAc,OAAO,KAAK,CAAA;AAAA,KAC3E;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA,EAAG;AACzB,IAAA,MAAM,IAAI,WAAW,gDAAgD,CAAA;AAAA,EACvE;AACA,EAAA,IAAI,CAAA,CAAE,gBAAgB,aAAA,EAAe;AACnC,IAAA,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EAC3B,CAAA,MAAO;AACL,IAAA,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EAC3B;AAEA,EAAA,OAAO,CAAA;AACT;AAKO,SAAS,OACd,KAAA,EACA,IAAA,EACA,OAAO,CAAA,EACP,IAAA,GAA4B,EAAC,EACrB;AACR,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,MAAA,CAAO,YAAA;AACnC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,MAAA,CAAO,aAAA;AACrC,EAAA,MAAM,YAAA,GAAeA,mBAAAA,CAAmB,KAAA,EAAO,QAAQ,CAAA;AAEvD,EAAA,MAAM,aAAa,IAAA,IAAQ,KAAA;AAC3B,EAAA,MAAM,WAAA,GAAc,IAAA,KAAS,MAAA,GAAY,CAAA,GAAI,KAAA;AAE7C,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,MAAM,IAAI,qBAAA,CAAsB,uBAAA,EAAyB,MAAA,EAAQ,IAAI,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,IAAA,IAAI,CAAC,OAAO,QAAA,CAAS,WAAW,KAAK,CAAC,MAAA,CAAO,SAAA,CAAU,WAAW,CAAA,EAAG;AACnE,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,6DAA6D,WAAW,CAAA,CAAA;AAAA,QACxE,OAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,OAAO,QAAA,CAAS,UAAU,KAAK,CAAC,MAAA,CAAO,SAAA,CAAU,UAAU,CAAA,EAAG;AACjE,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,4DAA4D,UAAU,CAAA,CAAA;AAAA,QACtE,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,OAAO,QAAA,CAAS,IAAI,KAAK,CAAC,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA,EAAG;AACrD,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,4DAA4D,IAAI,CAAA,CAAA;AAAA,QAChE,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAA,CAAM,UAAA,GAAa,WAAA,IAAe,IAAI,CAAC,CAAA;AACvE,EAAA,MAAM,IAAA,GAAO,sBAAsB,YAAY,CAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAE5B,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,MAAA,IAAA,CAAK,CAAC,IAAI,MAAA,CAAO,IAAA,CAAK,MAAM,WAAA,GAAc,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,IACrD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,MAAA,IAAA,CAAK,CAAC,CAAA,GAAI,WAAA,GAAc,CAAA,GAAI,IAAA;AAAA,IAC9B;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA;AAAA,IACA,KAAA,EAAO,CAAC,MAAM,CAAA;AAAA,IACd,KAAA,EAAO,YAAA;AAAA,IACP;AAAA,GACD,CAAA;AACH;AAiCO,SAAS,QAAA,CACd,OACA,IAAA,EACA,GAAA,GAAM,IACN,QAAA,GAAW,IAAA,EACX,IAAA,GAA4B,EAAC,EACrB;AACR,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,MAAM,IAAI,qBAAA,CAAsB,0BAAA,EAA4B,KAAA,EAAO,GAAG,CAAA;AAAA,EACxE;AAEA,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,OAAO,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG,IAAI,CAAA;AAAA,EACxB;AAEA,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,OAAO,MAAA,CAAO,CAAC,KAAK,CAAA,EAAG,IAAI,CAAA;AAAA,EAC7B;AAEA,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,MAAA,CAAO,YAAA;AACnC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,MAAA,CAAO,aAAA;AACrC,EAAA,MAAM,YAAA,GAAeA,mBAAAA,CAAmB,KAAA,EAAO,UAAU,CAAA;AAKzD,EAAA,MAAM,OAAO,QAAA,GAAA,CAAY,IAAA,GAAO,UAAU,GAAA,GAAM,CAAA,CAAA,GAAA,CAAM,OAAO,KAAA,IAAS,GAAA;AAEtE,EAAA,MAAM,IAAA,GAAO,sBAAsB,YAAY,CAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,GAAG,CAAA;AAEzB,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,MAAA,IAAA,CAAK,CAAC,IAAI,MAAA,CAAO,IAAA,CAAK,MAAM,KAAA,GAAQ,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,IAC/C;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,MAAA,IAAA,CAAK,CAAC,CAAA,GAAI,KAAA,GAAQ,CAAA,GAAI,IAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA;AAAA,IACA,KAAA,EAAO,CAAC,GAAG,CAAA;AAAA,IACX,KAAA,EAAO,YAAA;AAAA,IACP;AAAA,GACD,CAAA;AACH;AA2BO,SAAS,QAAA,CACd,KAAA,EACA,IAAA,EACA,GAAA,GAAM,EAAA,EACN,IAAA,GAAO,EAAA,EACP,QAAA,GAAW,IAAA,EACX,IAAA,GAA4B,EAAC,EACrB;AAER,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,KAAA,EAAO,IAAA,EAAM,KAAK,QAAA,EAAU;AAAA,IACrD,GAAG,IAAA;AAAA,IACH,KAAA,EAAO;AAAA,GACR,CAAA;AAED,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,MAAA,CAAO,YAAA;AACnC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,MAAA,CAAO,aAAA;AACrC,EAAA,MAAM,YAAA,GAAeA,mBAAAA,CAAmB,KAAA,EAAO,UAAU,CAAA;AAEzD,EAAA,MAAM,IAAA,GAAO,sBAAsB,YAAY,CAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,GAAG,CAAA;AAGzB,EAAA,MAAM,UAAU,SAAA,CAAU,IAAA;AAC1B,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,IAAK,mBAAmB,aAAA,EAAe;AAC9D,IAAA,MAAM,IAAI,aAAa,uEAAuE,CAAA;AAAA,EAChG;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAE5B,MAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,OAAA,EAAS,SAAA,CAAU,SAAS,CAAC,CAAA;AAEhE,MAAA,MAAM,QAAQ,IAAA,IAAQ,QAAA;AACtB,MAAA,IAAA,CAAK,CAAC,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IACpC;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAE5B,MAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,OAAA,EAAS,SAAA,CAAU,SAAS,CAAC,CAAA;AAEhE,MAAA,IAAA,CAAK,CAAC,IAAI,IAAA,IAAQ,QAAA;AAAA,IACpB;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA;AAAA,IACA,KAAA,EAAO,CAAC,GAAG,CAAA;AAAA,IACX,KAAA,EAAO,YAAA;AAAA,IACP;AAAA,GACD,CAAA;AACH;AA0BO,SAAS,SAAA,CACd,OACA,IAAA,EACA,GAAA,GAAM,IACN,QAAA,GAAW,IAAA,EACX,IAAA,GAA4B,EAAC,EACrB;AACR,EAAA,IAAI,KAAA,KAAU,CAAA,IAAK,IAAA,KAAS,CAAA,EAAG;AAC7B,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,kDAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAK,QAAQ,CAAA,IAAK,IAAA,GAAO,KAAO,KAAA,GAAQ,CAAA,IAAK,OAAO,CAAA,EAAI;AACtD,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,yDAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAIA,EAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAA;AACzC,EAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAC,CAAA;AAGvC,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,QAAA,EAAU,OAAA,EAAS,KAAK,QAAA,EAAU;AAAA,IAC3D,GAAG,IAAA;AAAA,IACH,KAAA,EAAO;AAAA,GACR,CAAA;AAED,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,MAAA,CAAO,YAAA;AACnC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,MAAA,CAAO,aAAA;AACrC,EAAA,MAAM,YAAA,GAAeA,mBAAAA,CAAmB,KAAA,EAAO,WAAW,CAAA;AAE1D,EAAA,MAAM,IAAA,GAAO,sBAAsB,YAAY,CAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,GAAG,CAAA;AAEzB,EAAA,MAAMK,KAAAA,GAAO,KAAA,GAAQ,CAAA,GAAI,EAAA,GAAK,CAAA;AAG9B,EAAA,MAAM,UAAU,SAAA,CAAU,IAAA;AAC1B,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,IAAK,mBAAmB,aAAA,EAAe;AAC9D,IAAA,MAAM,IAAI,YAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,MAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,OAAA,EAAS,SAAA,CAAU,SAAS,CAAC,CAAA;AAC9D,MAAA,IAAA,CAAK,CAAC,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,KAAA,CAAMA,QAAO,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAC,CAAA;AAAA,IACtD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,MAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,OAAA,EAAS,SAAA,CAAU,SAAS,CAAC,CAAA;AAC9D,MAAA,IAAA,CAAK,CAAC,CAAA,GAAIA,KAAAA,GAAO,IAAA,CAAK,IAAI,MAAM,CAAA;AAAA,IAClC;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA;AAAA,IACA,KAAA,EAAO,CAAC,GAAG,CAAA;AAAA,IACX,KAAA,EAAO,YAAA;AAAA,IACP;AAAA,GACD,CAAA;AACH;AAgCO,SAAS,IAAI,CAAA,EAAW,CAAA,EAAY,IAAI,CAAA,EAAG,IAAA,GAA4B,EAAC,EAAW;AACxF,EAAA,MAAM,OAAO,CAAA,IAAK,CAAA;AAClB,EAAA,MAAM,SAAS,KAAA,CAAM,CAAC,CAAA,EAAG,IAAI,GAAG,IAAI,CAAA;AAGpC,EAAA,IAAI,MAAA,CAAO,gBAAgB,aAAA,EAAe;AACxC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,MAAA,IAAI,CAAA,IAAK,CAAA,IAAK,CAAA,GAAI,IAAA,EAAM;AAGtB,QAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,GAAO,CAAA;AACzB,QAAA,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,GAAI,EAAA;AAAA,MACvB;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,MAAA,IAAI,CAAA,IAAK,CAAA,IAAK,CAAA,GAAI,IAAA,EAAM;AAGtB,QAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,GAAO,CAAA;AACzB,QAAA,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,GAAI,CAAA;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAkBO,SAAS,KAAA,CAAM,KAAA,EAAc,IAAA,GAA4B,EAAC,EAAW;AAC1E,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,MAAA,CAAO,YAAA;AACnC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,MAAA,CAAO,aAAA;AACrC,EAAA,MAAM,YAAA,GAAeL,mBAAAA,CAAmB,KAAA,EAAO,OAAO,CAAA;AAEtD,EAAA,MAAM,WAAW,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AACtD,EAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,EAAA,MAAM,IAAA,GAAO,SAAS,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAE/C,EAAA,MAAM,IAAA,GAAO,sBAAsB,YAAY,CAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,IAAI,CAAA;AAE1B,EAAA,MAAM,iBAAiB,MAAc;AACnC,IAAA,MAAM,CAAA,GAAI,KAAK,MAAA,EAAO;AACtB,IAAA,OAAO,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,MAAA,CAAO,SAAA;AAAA,EAC5B,CAAA;AAGA,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,KAAK,CAAA,EAAG;AAChC,MAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,MAAA,MAAM,EAAA,GAAK,KAAK,MAAA,EAAO;AAEvB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,KAAK,GAAA,CAAI,EAAE,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,KAAK,EAAE,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,KAAK,GAAA,CAAI,EAAE,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,KAAK,EAAE,CAAA;AAEnE,MAAA,IAAA,CAAK,CAAC,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,EAAE,CAAC,CAAA;AAC/B,MAAA,IAAI,CAAA,GAAI,IAAI,IAAA,EAAM;AAChB,QAAA,IAAA,CAAK,IAAI,CAAC,CAAA,GAAI,OAAO,IAAA,CAAK,KAAA,CAAM,EAAE,CAAC,CAAA;AAAA,MACrC;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,KAAK,CAAA,EAAG;AAGhC,MAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,MAAA,MAAM,EAAA,GAAK,KAAK,MAAA,EAAO;AAIvB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,KAAK,GAAA,CAAI,EAAE,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,KAAK,EAAE,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,KAAK,GAAA,CAAI,EAAE,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,KAAK,EAAE,CAAA;AAEnE,MAAA,IAAA,CAAK,CAAC,CAAA,GAAI,EAAA;AACV,MAAA,IAAI,CAAA,GAAI,IAAI,IAAA,EAAM;AAChB,QAAA,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,GAAI,EAAA;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA;AAAA,IACA,KAAA,EAAO,QAAA;AAAA,IACP,KAAA,EAAO,YAAA;AAAA,IACP;AAAA,GACD,CAAA;AACH;;;ACl1BA,SAAS,cAAA,CAAe,OAAe,GAAA,EAAqB;AAC1D,EAAA,MAAM,GAAA,GAAM,KAAA,GAAQ,CAAA,GAAI,GAAA,GAAM,KAAA,GAAQ,KAAA;AACtC,EAAA,IAAI,GAAA,GAAM,CAAA,IAAK,GAAA,IAAO,GAAA,EAAK;AACzB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,MAAA,EAAS,KAAK,CAAA,wCAAA,EAA2C,GAAG,CAAA,CAAE,CAAA;AAAA,EACrF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,cAAA,CACP,OACA,GAAA,EAC8C;AAC9C,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,GAAA,GAAM,cAAA,CAAe,KAAA,EAAO,GAAG,CAAA;AACrC,IAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,KAAK,GAAA,GAAM,CAAA,EAAG,MAAM,CAAA,EAAE;AAAA,EAC7C;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,CAAA;AAC3B,EAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA,IAAK,SAAS,CAAA,EAAG;AACzC,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,mDAAmD,IAAI,CAAA,CAAA;AAAA,MACvD,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,CAAA,EAAG;AACZ,IAAA,MAAMM,SAAAA,GAAW,MAAM,KAAA,IAAS,CAAA;AAChC,IAAA,MAAMC,OAAAA,GAAS,MAAM,GAAA,IAAO,GAAA;AAE5B,IAAA,MAAMC,MAAAA,GAAQF,SAAAA,GAAW,CAAA,GAAI,GAAA,GAAMA,SAAAA,GAAWA,SAAAA;AAC9C,IAAA,MAAMG,IAAAA,GAAMF,OAAAA,GAAS,CAAA,GAAI,GAAA,GAAMA,OAAAA,GAASA,OAAAA;AAExC,IAAA,MAAM,YAAA,GAAe,KAAK,GAAA,CAAI,IAAA,CAAK,IAAIC,MAAAA,EAAO,CAAC,GAAG,GAAG,CAAA;AACrD,IAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,IAAA,CAAK,IAAIC,IAAAA,EAAK,CAAC,GAAG,GAAG,CAAA;AAEjD,IAAA,OAAO,EAAE,KAAA,EAAO,YAAA,EAAc,GAAA,EAAK,YAAY,IAAA,EAAK;AAAA,EACtD;AAEA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,IAAS,GAAA,GAAM,CAAA;AACtC,EAAA,MAAM,MAAA,GAAS,MAAM,GAAA,IAAO,EAAA;AAE5B,EAAA,IAAI,KAAA,GAAQ,QAAA,GAAW,CAAA,GAAI,GAAA,GAAM,QAAA,GAAW,QAAA;AAC5C,EAAA,IAAI,KAAA,IAAS,GAAA,EAAK,KAAA,GAAQ,GAAA,GAAM,CAAA;AAChC,EAAA,IAAI,KAAA,GAAQ,IAAI,KAAA,GAAQ,EAAA;AAExB,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI,WAAW,EAAA,EAAI;AACjB,IAAA,GAAA,GAAM,EAAA;AAAA,EACR,CAAA,MAAA,IAAW,SAAS,CAAA,EAAG;AACrB,IAAA,GAAA,GAAM,GAAA,GAAM,MAAA;AACZ,IAAA,IAAI,GAAA,GAAM,IAAI,GAAA,GAAM,EAAA;AAAA,EACtB,CAAA,MAAO;AACL,IAAA,GAAA,GAAM,MAAA;AACN,IAAA,IAAI,GAAA,IAAO,GAAA,EAAK,GAAA,GAAM,GAAA,GAAM,CAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,IAAA,EAAK;AAC5B;AASO,SAAS,KAAA,CAAM,MAAc,MAAA,EAA8B;AAChE,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AAEf,EAAA,IAAI,MAAA,CAAO,SAAS,IAAA,EAAM;AACxB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,iCAAA,EAAoC,OAAO,MAAM,CAAA,cAAA,EAAiB,IAAI,CAAA,CAAE,CAAA;AAAA,EAC/F;AAEA,EAAA,MAAM,UAAA,GAAa,IAAI,KAAA,CAAoD,IAAI,CAAA;AAC/E,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,IAAA,EAAM,IAAA,EAAA,EAAQ;AACtC,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,IAAI,CAAA,IAAK,CAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAI,CAAA,IAAK,EAAE,OAAO,CAAA,EAAG,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,CAAA,EAAE;AAC5D,IAAA,MAAM,EAAA,GAAK,cAAA,CAAe,KAAA,EAAO,GAAG,CAAA;AACpC,IAAA,UAAA,CAAW,IAAI,CAAA,GAAI,EAAA;AAGnB,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,MAAM,GAAA,GACJ,EAAA,CAAG,IAAA,GAAO,CAAA,GACN,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAA,CAAM,EAAA,CAAG,GAAA,GAAM,EAAA,CAAG,KAAA,IAAS,EAAA,CAAG,IAAI,CAAC,CAAA,GACpD,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAA,CAAM,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,GAAA,IAAO,CAAC,EAAA,CAAG,IAAI,CAAC,CAAA;AAC3D,MAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AAAA,IACnB;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,MAAA,KAAW,CAAA,GAAI,CAAA,GAAI,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AAC9E,EAAA,MAAM,GAAA,GACJ,CAAA,CAAE,KAAA,KAAU,QAAA,GACR,IAAI,KAAA,CAAc,OAAO,CAAA,GACzB,KAAK,qBAAA,CAAsB,CAAA,CAAE,KAAK,GAAG,OAAO,CAAA;AAGlD,EAAA,MAAM,UAAA,GAAa,IAAI,KAAA,CAAc,QAAA,CAAS,MAAM,CAAA;AACpD,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,IAAS,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC7C,IAAA,UAAA,CAAW,CAAC,CAAA,GAAI,MAAA;AAChB,IAAA,MAAA,IAAU,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,UAAU,QAAA,CAAS,MAAA;AAEzB,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,OAAA,EAAS,OAAA,EAAA,EAAW;AAElD,IAAA,IAAI,GAAA,GAAM,OAAA;AACV,IAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAc,OAAO,CAAA;AACxC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,MAAA,MAAM,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAC3B,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAC9B,MAAA,GAAA,IAAO,CAAA;AAAA,IACT;AAGA,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAc,IAAI,CAAA;AACpC,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,IAAA,EAAM,IAAA,EAAA,EAAQ;AACtC,MAAA,MAAM,CAAA,GAAI,OAAO,IAAI,CAAA;AACrB,MAAA,MAAM,EAAA,GAAK,WAAW,IAAI,CAAA;AAC1B,MAAA,IAAI,OAAO,MAAA,EAAW;AACpB,QAAA,MAAM,IAAI,aAAa,gDAAgD,CAAA;AAAA,MACzE;AAEA,MAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AACzB,QAAA,KAAA,CAAM,IAAI,IAAI,EAAA,CAAG,KAAA;AAAA,MACnB,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,IAAI,IAAI,EAAA,CAAG,KAAA,GAAA,CAAS,OAAO,OAAO,CAAA,IAAK,KAAK,EAAA,CAAG,IAAA;AACrD,QAAA,OAAA,EAAA;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,SAAS,CAAA,CAAE,MAAA;AACf,IAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,IAAA,EAAM,IAAA,EAAA,EAAQ;AACtC,MAAA,MAAA,IAAA,CAAW,MAAM,IAAI,CAAA,IAAK,MAAM,CAAA,CAAE,OAAA,CAAQ,IAAI,CAAA,IAAK,CAAA,CAAA;AAAA,IACrD;AAEA,IAAA,IAAI,KAAA,CAAM,QAAQ,GAAG,CAAA,IAAK,MAAM,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA,EAAG;AAC/C,MAAA,GAAA,CAAI,OAAO,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,IAAK,EAAA;AAAA,IACnC,CAAA,MAAA,IAAW,GAAA,YAAe,aAAA,IAAiB,CAAA,CAAE,gBAAgB,aAAA,EAAe;AAC1E,MAAA,GAAA,CAAI,OAAO,CAAA,GAAI,gBAAA,CAAiB,CAAA,CAAE,MAAM,MAAM,CAAA;AAAA,IAChD,WACE,CAAC,KAAA,CAAM,QAAQ,GAAG,CAAA,IAClB,EAAE,GAAA,YAAe,aAAA,CAAA,IACjB,CAAC,KAAA,CAAM,QAAQ,CAAA,CAAE,IAAI,KACrB,EAAE,CAAA,CAAE,gBAAgB,aAAA,CAAA,EACpB;AACA,MAAA,GAAA,CAAI,OAAO,CAAA,GAAI,iBAAA,CAAkB,CAAA,CAAE,MAAM,MAAM,CAAA;AAAA,IACjD;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,IAAA,OAAO,OAAO,eAAA,CAAgB;AAAA,MAC5B,IAAA,EAAM,GAAA;AAAA,MACN,KAAA,EAAO,QAAA,CAAS,MAAA,KAAW,CAAA,GAAI,EAAC,GAAI,QAAA;AAAA,MACpC,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,aAAa,iDAAiD,CAAA;AAAA,EAC1E;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,QAAA,CAAS,MAAA,KAAW,CAAA,GAAI,EAAC,GAAI,QAAA;AAAA,IACpC,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAiBO,SAAS,MAAA,CAAO,CAAA,EAAW,OAAA,EAAiB,IAAA,EAAoB;AACrE,EAAA,MAAM,EAAA,GAAK,aAAA,CAAc,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AAErC,EAAA,IAAI,OAAA,CAAQ,UAAU,QAAA,EAAU;AAC9B,IAAA,MAAM,IAAI,WAAW,0CAA0C,CAAA;AAAA,EACjE;AACA,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,uCAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA,CAAQ;AAAA,KACV;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,GAAG,CAAA,CAAE,KAAK,CAAA;AAC5B,EAAA,QAAA,CAAS,EAAE,IAAI,OAAA,CAAQ,IAAA;AAEvB,EAAA,MAAM,OAAA,GAAU,YAAY,QAAQ,CAAA;AACpC,EAAA,MAAM,QAAA,GAAW,CAAA,CAAE,KAAA,CAAM,EAAE,CAAA,IAAK,CAAA;AAEhC,EAAA,MAAM,UAAA,GAAa,IAAI,KAAA,CAAc,QAAA,CAAS,MAAM,CAAA;AACpD,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,IAAS,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC7C,IAAA,UAAA,CAAW,CAAC,CAAA,GAAI,MAAA;AAChB,IAAA,MAAA,IAAU,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,qBAAA,GAAwB,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AAE1D,EAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,KAAyB;AAC/C,IAAA,MAAM,SAAA,GAAY,mBAAA;AAAA,MAChB,IAAA;AAAA,MACA,qBAAA;AAAA,MACA,OAAA,CAAQ,OAAA;AAAA,MACR,OAAA,CAAQ;AAAA,KACV;AACA,IAAA,IAAI,OAAA,CAAQ,gBAAgB,aAAA,EAAe;AACzC,MAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,OAAA,CAAQ,IAAA,EAAM,SAAS,CAAA;AACtD,MAAA,MAAM,GAAA,GAAM,OAAO,KAAK,CAAA;AACxB,MAAA,IAAI,CAAC,MAAA,CAAO,aAAA,CAAc,GAAG,CAAA,EAAG;AAC9B,QAAA,MAAM,IAAI,qBAAA;AAAA,UACR,kBAAkB,KAAK,CAAA,2BAAA,CAAA;AAAA,UACvB,SAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AACA,MAAA,OAAO,GAAA;AAAA,IACT;AACA,IAAA,MAAM,cAAc,OAAA,CAAQ,IAAA;AAC5B,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAI,WAAW,0CAA0C,CAAA;AAAA,IACjE;AACA,IAAA,OAAO,iBAAA,CAAkB,aAAa,SAAS,CAAA;AAAA,EACjD,CAAA;AAEA,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM/B,IAAAA,GAAM,IAAI,KAAA,CAAc,OAAO,CAAA;AACrC,IAAA,MAAMgC,SAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQA,MAAK,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,aAAa,kDAAkD,CAAA;AAAA,IAC3E;AAEA,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,OAAA,EAAS,OAAA,EAAA,EAAW;AAClD,MAAA,IAAI,GAAA,GAAM,OAAA;AACV,MAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAc,QAAA,CAAS,MAAM,CAAA;AAChD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,QAAA,MAAM,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAC3B,QAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAC9B,QAAA,GAAA,IAAO,CAAA;AAAA,MACT;AAEA,MAAA,MAAM,MAAA,GAAS,cAAA,CAAe,MAAA,CAAO,EAAE,KAAK,CAAC,CAAA;AAC7C,MAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA,EAAG;AAC7B,QAAA,MAAM,IAAI,qBAAA;AAAA,UACR,kBAAkB,MAAM,CAAA,kBAAA,CAAA;AAAA,UACxB,SAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,MAAA,GAAS,CAAA,IAAK,MAAA,IAAU,QAAA,EAAU;AACpC,QAAA,MAAM,IAAI,UAAA;AAAA,UACR,CAAA,MAAA,EAAS,MAAM,CAAA,2BAAA,EAA8B,IAAI,cAAc,QAAQ,CAAA;AAAA,SACzE;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,EAAM;AAC3B,MAAA,KAAA,CAAM,EAAE,CAAA,GAAI,MAAA;AAEZ,MAAA,IAAI,WAAW,CAAA,CAAE,MAAA;AACjB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,QAAA,IAAA,CAAa,MAAM,CAAC,CAAA,IAAK,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAA;AAAA,MACjD;AACA,MAAAhC,IAAAA,CAAI,OAAO,CAAA,GAAIgC,MAAAA,CAAM,QAAQ,CAAA,IAAK,EAAA;AAAA,IACpC;AAEA,IAAA,OAAO,OAAO,eAAA,CAAgB;AAAA,MAC5B,IAAA,EAAMhC,IAAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,CAAA,CAAE,KAAK,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,OAAO,CAAA;AAC5B,EAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,MAAM,IAAI,aAAa,+CAA+C,CAAA;AAAA,EACxE;AAEA,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,OAAA,EAAS,OAAA,EAAA,EAAW;AAClD,IAAA,IAAI,GAAA,GAAM,OAAA;AACV,IAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAc,QAAA,CAAS,MAAM,CAAA;AAChD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAC3B,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAC9B,MAAA,GAAA,IAAO,CAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,MAAA,CAAO,EAAE,KAAK,CAAC,CAAA;AAC7C,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,kBAAkB,MAAM,CAAA,kBAAA,CAAA;AAAA,QACxB,SAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,MAAA,GAAS,CAAA,IAAK,MAAA,IAAU,QAAA,EAAU;AACpC,MAAA,MAAM,IAAI,UAAA;AAAA,QACR,CAAA,MAAA,EAAS,MAAM,CAAA,2BAAA,EAA8B,IAAI,cAAc,QAAQ,CAAA;AAAA,OACzE;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,EAAM;AAC3B,IAAA,KAAA,CAAM,EAAE,CAAA,GAAI,MAAA;AACZ,IAAA,IAAI,WAAW,CAAA,CAAE,MAAA;AACjB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,QAAA,IAAA,CAAa,MAAM,CAAC,CAAA,IAAK,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAA;AAAA,IACjD;AACA,IAAA,IAAI,CAAA,CAAE,gBAAgB,aAAA,EAAe;AACnC,MAAA,IAAI,eAAe,aAAA,EAAe;AAChC,QAAA,GAAA,CAAI,OAAO,CAAA,GAAI,gBAAA,CAAiB,CAAA,CAAE,MAAM,QAAQ,CAAA;AAAA,MAClD;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IACE,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAG,KAClB,EAAE,GAAA,YAAe,aAAA,CAAA,IACjB,CAAC,MAAM,OAAA,CAAQ,KAAK,CAAA,IACpB,EAAE,iBAAiB,aAAA,CAAA,EACnB;AACA,QAAA,GAAA,CAAI,OAAO,CAAA,GAAI,iBAAA,CAAkB,KAAA,EAAO,QAAQ,CAAA;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;;;AC7SA,IAAI,WAAA,GAAc,IAAA;AAIlB,SAASsB,mBAAAA,CAAmB,OAAc,OAAA,EAA+B;AACvE,EAAA,IAAI,UAAU,QAAA,EAAU;AACtB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,EAAG,OAAO,CAAA,8BAAA,CAAgC,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAASW,oBAAAA,CAAoB,GAAW,OAAA,EAA2D;AACjG,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,EAAG,OAAO,CAAA,8BAAA,CAAgC,CAAA;AAAA,EACjE;AACF;AAEA,SAAS,qBAAqB,KAAA,EAA6B;AACzD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,QAAA,GAAW,OAAO,KAAK,CAAA;AAC7B,IAAA,IAAI,CAAC,MAAA,CAAO,aAAA,CAAc,QAAQ,CAAA,EAAG;AACnC,MAAA,MAAM,IAAI,oBAAoB,sDAAsD,CAAA;AAAA,IACtF;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA,CAAM,IAAI,oBAAoB,CAAA;AAAA,EACvC;AACA,EAAA,MAAM,IAAI,WAAW,8BAA8B,CAAA;AACrD;AAEA,SAAS,SAAS,CAAA,EAAmB;AACnC,EAAAA,oBAAAA,CAAoB,GAAG,UAAU,CAAA;AACjC,EAAA,MAAM,QAAQ,CAAA,CAAE,KAAA;AAChB,EAAA,MAAM,IAAA,GAAO,sBAAsB,KAAK,CAAA;AACxC,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA;AAC3B,EAAA,IAAI,eAAe,aAAA,EAAe;AAChC,IAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AAAA,EACb,CAAA,MAAO;AACL,IAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EACZ;AACA,EAAA,OAAO,OAAY,cAAA,CAAe;AAAA,IAChC,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA;AAAA,IACA,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAEA,SAAS,cAAA,CAAe,CAAA,EAAW,CAAA,EAAW,OAAA,EAAuB;AACnE,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,CAAA,CAAE,IAAA,EAAM;AACrB,IAAA,MAAM,WAAW,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,EACrD;AACF;AAEA,SAAS,WAAA,CAAY,GAAU,CAAA,EAAmB;AAChD,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,KAAA;AAClC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,IAAI,EAAE,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,GAAG,OAAO,KAAA;AAAA,EAC5B;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,UAAA,CAAW,GAAW,KAAA,EAAyC;AACtE,EAAA,IAAI,CAAA,CAAE,KAAA,KAAU,KAAA,EAAO,OAAO,CAAA;AAC9B,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,wCAAwC,CAAA;AAAA,EAC/D;AACA,EAAA,MAAM,IAAA,GAAO,sBAAsB,KAAK,CAAA;AACxC,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA;AAC3B,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAClD,EAAA,MAAM,SAAS,KAAA,KAAU,MAAA;AAEzB,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,wCAAwC,CAAA;AAAA,EAC/D;AAEA,EAAA,IAAI,eAAe,aAAA,EAAe;AAChC,IAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,MAAA,GAAS,UAAA,GACX,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,QAAA,GAAA,CAAI,CAAC,CAAA,GAAI,gBAAA,CAAiB,IAAA,EAAM,MAAM,CAAA;AAAA,MACxC;AAAA,IACF,CAAA,MAAO;AACL,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,MAAA,GAAS,UAAA,GACX,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,QAAA,GAAA,CAAI,CAAC,IAAI,MAAA,CAAO,IAAA,CAAK,MAAM,iBAAA,CAAkB,IAAA,EAAM,MAAM,CAAC,CAAC,CAAA;AAAA,MAC7D;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,MAAA,GAAS,UAAA,GACX,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,QAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,IAAA,EAAM,MAAM,CAAA;AAC3C,QAAA,GAAA,CAAI,CAAC,IAAI,MAAA,GAAU,KAAA,KAAU,KAAK,CAAA,GAAI,CAAA,GAAK,OAAO,KAAK,CAAA;AAAA,MACzD;AAAA,IACF,CAAA,MAAO;AACL,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,MAAA,GAAS,UAAA,GACX,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,QAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,IAAA,EAAM,MAAM,CAAA;AAC5C,QAAA,GAAA,CAAI,CAAC,CAAA,GAAI,MAAA,GAAU,KAAA,KAAU,CAAA,GAAI,IAAI,CAAA,GAAK,KAAA;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAY,cAAA,CAAe;AAAA,IAChC,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA;AAAA,IACA,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAEA,SAAS,mBAAA,CAAoB,MAAc,WAAA,EAA4B;AACrE,EAAA,IAAI,IAAA,CAAK,UAAU,QAAA,EAAU;AAC3B,IAAA,MAAM,IAAI,WAAW,wCAAwC,CAAA;AAAA,EAC/D;AACA,EAAA,IAAI,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,WAAW,CAAA,EAAG;AACxC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,WAAA,CAAY,KAAK,KAAK,CAAA,KAAM,KAAK,WAAA,CAAY,WAAW,MAAM,CAAA,EAAG;AACnE,IAAA,OAAO,KAAA,CAAM,aAAa,EAAE,KAAA,EAAO,KAAK,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,EACtE;AAEA,EAAA,MAAM,YAAY,IAAA,CAAK,KAAA;AACvB,EAAA,MAAM,WAAW,SAAA,CAAU,MAAA;AAC3B,EAAA,MAAM,aAAa,WAAA,CAAY,MAAA;AAC/B,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,MAAM,UAAA,CAAW,QAAA,CAAS,WAAA,EAAa,SAAA,EAAW,WAAW,CAAA;AAAA,EAC/D;AAEA,EAAA,MAAM,cAAA,GAAiB,IAAI,KAAA,CAAc,QAAQ,CAAA;AACjD,EAAA,MAAM,UAAU,QAAA,GAAW,UAAA;AAC3B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,YAAY,CAAA,GAAI,OAAA,GAAU,IAAK,WAAA,CAAY,CAAA,GAAI,OAAO,CAAA,IAAK,CAAA;AACjE,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,CAAC,CAAA,IAAK,CAAA;AAChC,IAAA,IAAI,SAAA,KAAc,OAAA,IAAW,SAAA,KAAc,CAAA,EAAG;AAC5C,MAAA,MAAM,UAAA,CAAW,QAAA,CAAS,WAAA,EAAa,SAAA,EAAW,WAAW,CAAA;AAAA,IAC/D;AACA,IAAA,cAAA,CAAe,CAAC,CAAA,GAAI,SAAA;AAAA,EACtB;AAEA,EAAA,IAAI,MAAA,GAAS,IAAA;AACb,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,QAAA,EAAU,IAAA,EAAA,EAAQ;AAC1C,IAAA,MAAM,SAAA,GAAY,cAAA,CAAe,IAAI,CAAA,IAAK,CAAA;AAC1C,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,IAAI,CAAA,IAAK,CAAA;AACnC,IAAA,IAAI,SAAA,KAAc,CAAA,IAAK,OAAA,KAAY,CAAA,EAAG;AACpC,MAAA,MAAA,GAAS,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,IAAI,CAAA;AAAA,IACjC;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,WAAA,CAAY,MAAA,CAAO,KAAA,EAAO,WAAW,CAAA,EAAG;AAC3C,IAAA,MAAA,GAAS,OAAA,CAAQ,QAAQ,WAAW,CAAA;AAAA,EACtC;AAEA,EAAA,MAAM,YAAY,IAAA,CAAK,KAAA;AACvB,EAAA,IAAI,MAAA,CAAO,UAAU,SAAA,EAAW;AAC9B,IAAA,MAAA,GAAS,UAAA,CAAW,QAAQ,SAAS,CAAA;AAAA,EACvC;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAe,CAAA,EAAyB;AAC/C,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,wCAAwC,CAAA;AAAA,EAC/D;AACA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAClD,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AAEf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,wCAAwC,CAAA;AAAA,EAC/D;AAEA,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,CAAA,CAAE,MAAM,IAAA,EAAA,EAAQ;AACxC,IAAA,MAAM,MAAA,GAAS,UAAA,GACX,CAAA,CAAE,MAAA,GAAS,IAAA,GACX,mBAAA,CAAoB,IAAA,EAAM,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AACjE,IAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,MAAA,GAAA,CAAI,IAAI,CAAA,GAAI,MAAA,CAAO,gBAAA,CAAiB,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,IACnD,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,IAAI,CAAA,GAAI,iBAAA,CAAkB,IAAA,EAAM,MAAM,CAAA;AAAA,IAC5C;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,aAAa,CAAA,EAAmB;AACvC,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,wCAAwC,CAAA;AAAA,EAC/D;AACA,EAAA,IAAI,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,OAAO,CAAA,EAAG;AACpC,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,CAAA,CAAE,KAAK,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA;AAC3B,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAE7C,EAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,wCAAwC,CAAA;AAAA,EAC/D;AAEA,EAAA,IAAI,eAAe,aAAA,EAAe;AAChC,IAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,SAAS,mBAAA,CAAoB,CAAA,EAAG,gBAAgB,CAAA,CAAE,OAAA,EAAS,EAAE,MAAM,CAAA;AACzE,QAAA,GAAA,CAAI,CAAC,CAAA,GAAI,gBAAA,CAAiB,IAAA,EAAM,MAAM,CAAA;AAAA,MACxC;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAM,IAAI,WAAW,gDAAgD,CAAA;AAAA,IACvE;AAAA,EACF,CAAA,MAAO;AACL,IAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,MAAA,MAAM,IAAI,WAAW,gDAAgD,CAAA;AAAA,IACvE;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAS,mBAAA,CAAoB,CAAA,EAAG,gBAAgB,CAAA,CAAE,OAAA,EAAS,EAAE,MAAM,CAAA;AACzE,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,iBAAA,CAAkB,IAAA,EAAM,MAAM,CAAA;AAAA,IACzC;AAAA,EACF;AACA,EAAA,OAAO,OAAY,cAAA,CAAe;AAAA,IAChC,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAEA,SAAS,gBAAA,CAAiB,KAAA,EAAc,MAAA,EAA0B,IAAA,EAA4B;AAC5F,EAAA,IAAI,WAAA,CAAY,KAAK,CAAA,KAAM,IAAA,CAAK,MAAA,EAAQ;AACtC,IAAA,MAAM,IAAI,WAAW,mDAAmD,CAAA;AAAA,EAC1E;AACA,EAAA,OAAO,OAAY,cAAA,CAAe;AAAA,IAChC,IAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA,EAAO,SAAA;AAAA,IACP;AAAA,GACD,CAAA;AACH;AAKO,IAAM,UAAA,GAAN,MAAM,WAAA,CAAW;AAAA,EACb,MAAA;AAAA,EACT,YAAA;AAAA,EAEQ,KAAA;AAAA,EACS,KAAA;AAAA,EACA,SAAA;AAAA,EAET,YAAY,IAAA,EAKjB;AACD,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,YAAA;AACzB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,IAAA;AAClB,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,QAAA;AACtB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,EACf;AAAA,EAEA,OAAO,OAAO,IAAA,EAKC;AACb,IAAA,OAAO,IAAI,YAAW,IAAI,CAAA;AAAA,EAC5B;AAAA,EAEA,OAAO,UAAA,CAAW,CAAA,EAAW,OAAA,GAA6B,EAAC,EAAe;AACxE,IAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,MAAA,MAAM,IAAI,WAAW,wCAAwC,CAAA;AAAA,IAC/D;AACA,IAAA,IAAI,QAAQ,KAAA,KAAU,MAAA,IAAa,OAAA,CAAQ,KAAA,KAAU,EAAE,KAAA,EAAO;AAC5D,MAAA,MAAM,IAAI,UAAA;AAAA,QACR,CAAA,oCAAA,EAAuC,OAAA,CAAQ,KAAK,CAAA,WAAA,EAAc,EAAE,KAAK,CAAA;AAAA,OAC3E;AAAA,IACF;AACA,IAAA,MAAM,YAAA,GAAA,CAAgB,OAAA,CAAQ,YAAA,IAAgB,KAAA,KAAU,WAAA;AACxD,IAAA,OAAO,IAAI,WAAA,CAAW;AAAA,MACpB,MAAA,EAAQ,CAAA;AAAA,MACR,YAAA;AAAA,MACA,MAAM,EAAC;AAAA,MACP,UAAU,MAAM;AAAA,MAAC;AAAA,KAClB,CAAA;AAAA,EACH;AAAA,EAEA,OAAO,MAAA,CAAO,KAAA,EAAe,OAAA,GAA6B,EAAC,EAAe;AACxE,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,SAAA;AAC/B,IAAA,MAAM,IAAA,GAAO,sBAAsB,KAAK,CAAA;AACxC,IAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,CAAC,CAAA;AACtB,IAAA,IAAI,eAAe,aAAA,EAAe;AAChC,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,KAAA;AAAA,IACX;AACA,IAAA,MAAM,CAAA,GAAI,OAAY,cAAA,CAAe;AAAA,MACnC,IAAA,EAAM,GAAA;AAAA,MACN,OAAO,EAAC;AAAA,MACR,KAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,OAAO,WAAA,CAAW,UAAA,CAAW,CAAA,EAAG,OAAO,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,KAAA,GAAe;AACjB,IAAA,OAAO,KAAK,MAAA,CAAO,KAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,KAAA,GAAe;AACjB,IAAA,OAAO,KAAK,MAAA,CAAO,KAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,MAAA,GAA2B;AAC7B,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,OAAA,GAA6B;AAC/B,IAAA,OAAO,KAAK,MAAA,CAAO,OAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,IAAA,GAAmB;AACrB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,KAAA,KAAU,QAAA,EAAU;AAClC,MAAA,MAAM,IAAI,WAAW,4CAA4C,CAAA;AAAA,IACnE;AACA,IAAA,MAAM,IAAA,GAAO,KAAK,MAAA,CAAO,IAAA;AACzB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,MAAA,MAAM,IAAI,WAAW,4CAA4C,CAAA;AAAA,IACnE;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,IAAA,GAAsB;AACxB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,QAAQ,IAAA,EAAoB;AAC1B,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,uDAAA;AAAA,QACA,cAAA;AAAA,QACA,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,cAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAM,SAAS,CAAA;AAC3C,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,EACf;AAAA,EAEA,QAAA,GAAiB;AACf,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACxB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO;AAAA,MACpC,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,MACnB,MAAA,EAAQ,KAAK,MAAA,CAAO;AAAA,KACrB,CAAA;AAAA,EACH;AAAA,EAEA,MAAA,GAAqB;AACnB,IAAA,OAAO,YAAW,UAAA,CAAW,IAAA,CAAK,QAAQ,EAAE,YAAA,EAAc,OAAO,CAAA;AAAA,EACnE;AAAA,EAEA,gBAAgB,KAAA,EAAsB;AACpC,IAAA,IAAA,CAAK,eAAe,KAAA,IAAS,WAAA;AAC7B,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,IACf;AAAA,EACF;AAAA,EAEA,OAAA,GAAmB;AACjB,IAAA,OAAO,KAAK,KAAA,KAAU,IAAA;AAAA,EACxB;AAAA;AAAA,EAGA,eAAe,IAAA,EAAoB;AACjC,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AAExB,IAAA,MAAM,cAAA,GAAiB,aAAa,IAAI,CAAA;AAExC,IAAA,IAAI,IAAA,CAAK,UAAU,IAAA,EAAM;AACvB,MAAA,IAAA,CAAK,KAAA,GAAQ,cAAA;AACb,MAAA;AAAA,IACF;AAEA,IAAA,cAAA,CAAe,IAAA,CAAK,KAAA,EAAO,cAAA,EAAgB,gBAAgB,CAAA;AAC3D,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,KAAA,KAAU,cAAA,CAAe,KAAA,EAAO;AAC7C,MAAA,MAAM,IAAI,UAAA;AAAA,QACR,kCAAkC,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,IAAA,EAAO,eAAe,KAAK,CAAA;AAAA,OAC/E;AAAA,IACF;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,cAAc,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,IAAA,EAAqB;AAC5B,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,IAAQ,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA;AAC7C,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAA;AAEb,IAAA,MAAM,OAAqB,EAAC;AAC5B,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAgB;AAEpC,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAwB;AACrC,MAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG;AACpB,MAAA,OAAA,CAAQ,IAAI,CAAC,CAAA;AACb,MAAA,KAAA,MAAW,KAAA,IAAS,CAAA,CAAE,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA;AACxC,MAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,IACb,CAAA;AAEA,IAAA,KAAA,CAAM,IAAI,CAAA;AACV,IAAA,IAAA,CAAK,OAAA,EAAQ;AAEb,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,MAAA,CAAA,CAAE,SAAA,EAAU;AAAA,IACd;AAAA,EACF;AAAA,EAEA,IAAI,KAAA,EAA+B;AACjC,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,MAAM,MAAM,CAAA;AAC/C,IAAA,MAAM,YAAA,GAAe,WAAA,KAAgB,IAAA,CAAK,YAAA,IAAgB,KAAA,CAAM,YAAA,CAAA;AAEhE,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA;AAAA,MACA,MAAM,YAAA,GAAe,CAAC,IAAA,EAAM,KAAK,IAAI,EAAC;AAAA,MACtC,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,mDAAmD,CAAA;AAAA,QAC5E;AACA,QAAA,IAAI,IAAA,CAAK,cAAc,IAAA,CAAK,cAAA,CAAe,oBAAoB,EAAA,EAAI,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AACrF,QAAA,IAAI,KAAA,CAAM,cAAc,KAAA,CAAM,cAAA,CAAe,oBAAoB,EAAA,EAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MAC1F;AAAA,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,IAAI,KAAA,EAA+B;AACjC,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,MAAM,MAAM,CAAA;AAC/C,IAAA,MAAM,YAAA,GAAe,WAAA,KAAgB,IAAA,CAAK,YAAA,IAAgB,KAAA,CAAM,YAAA,CAAA;AAEhE,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA;AAAA,MACA,MAAM,YAAA,GAAe,CAAC,IAAA,EAAM,KAAK,IAAI,EAAC;AAAA,MACtC,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,mDAAmD,CAAA;AAAA,QAC5E;AACA,QAAA,IAAI,IAAA,CAAK,cAAc,IAAA,CAAK,cAAA,CAAe,oBAAoB,EAAA,EAAI,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AACrF,QAAA,IAAI,MAAM,YAAA,EAAc;AACtB,UAAA,MAAM,OAAO,mBAAA,CAAoB,GAAA,CAAI,EAAE,CAAA,EAAG,KAAA,CAAM,OAAO,KAAK,CAAA;AAC5D,UAAA,KAAA,CAAM,eAAe,IAAI,CAAA;AAAA,QAC3B;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,IAAI,KAAA,EAA+B;AACjC,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,MAAM,MAAM,CAAA;AAC/C,IAAA,MAAM,YAAA,GAAe,WAAA,KAAgB,IAAA,CAAK,YAAA,IAAgB,KAAA,CAAM,YAAA,CAAA;AAEhE,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA;AAAA,MACA,MAAM,YAAA,GAAe,CAAC,IAAA,EAAM,KAAK,IAAI,EAAC;AAAA,MACtC,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,mDAAmD,CAAA;AAAA,QAC5E;AACA,QAAA,IAAI,KAAK,YAAA,EAAc;AACrB,UAAA,MAAM,IAAA,GAAO,oBAAoB,GAAA,CAAI,EAAA,EAAI,MAAM,MAAM,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AACzE,UAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,QAC1B;AACA,QAAA,IAAI,MAAM,YAAA,EAAc;AACtB,UAAA,MAAM,IAAA,GAAO,oBAAoB,GAAA,CAAI,EAAA,EAAI,KAAK,MAAM,CAAA,EAAG,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AACzE,UAAA,KAAA,CAAM,eAAe,IAAI,CAAA;AAAA,QAC3B;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,GAAA,GAAkB;AAChB,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AACjC,IAAA,MAAM,YAAA,GAAe,eAAe,IAAA,CAAK,YAAA;AAEzC,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA;AAAA,MACA,IAAA,EAAM,YAAA,GAAe,CAAC,IAAI,IAAI,EAAC;AAAA,MAC/B,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,mDAAmD,CAAA;AAAA,QAC5E;AACA,QAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,EAAE,CAAC,CAAA;AAAA,MAC7B;AAAA,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,GAAA,CAAI,IAAA,EAAa,QAAA,GAAW,KAAA,EAAmB;AAC7C,IAAA,IAAI,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAC/C,IAAA,MAAM,WAAA,GAAcX,mBAAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,OAAO,KAAK,CAAA;AAC/D,IAAA,IAAI,SAAA,CAAU,UAAU,WAAA,EAAa;AACnC,MAAA,SAAA,GAAY,UAAA,CAAW,WAAW,WAAW,CAAA;AAAA,IAC/C;AACA,IAAA,MAAM,YAAA,GAAe,eAAe,IAAA,CAAK,YAAA;AAEzC,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA;AAAA,MACA,IAAA,EAAM,YAAA,GAAe,CAAC,IAAI,IAAI,EAAC;AAAA,MAC/B,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,mDAAmD,CAAA;AAAA,QAC5E;AAIA,QAAA,IAAI,SAAS,MAAA,EAAW;AACtB,UAAA,MAAM,SAAS,EAAA,CAAG,IAAA;AAClB,UAAA,IAAI,EAAA;AACJ,UAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,YAAA,MAAM,IAAI,WAAW,wCAAwC,CAAA;AAAA,UAC/D,CAAA,MAAA,IAAW,kBAAkB,aAAA,EAAe;AAC1C,YAAA,EAAA,GAAK,MAAA,CAAO,gBAAA,CAAiB,MAAA,EAAQ,EAAA,CAAG,MAAM,CAAC,CAAA;AAAA,UACjD,CAAA,MAAO;AACL,YAAA,EAAA,GAAK,iBAAA,CAAkB,MAAA,EAAQ,EAAA,CAAG,MAAM,CAAA;AAAA,UAC1C;AACA,UAAA,MAAMY,KAAAA,GAAO,IAAI,YAAA,CAAa,IAAA,CAAK,OAAO,IAAI,CAAA;AAC9C,UAAAA,KAAAA,CAAK,KAAK,EAAE,CAAA;AACZ,UAAA,MAAM,UAAA,GAAa,iBAAiB,IAAA,CAAK,MAAA,CAAO,OAAO,IAAA,CAAK,MAAA,CAAO,QAAQA,KAAI,CAAA;AAC/E,UAAA,MAAMC,KAAAA,GACJ,UAAA,CAAW,KAAA,KAAU,IAAA,CAAK,OAAO,KAAA,GAC7B,UAAA,GACA,UAAA,CAAW,UAAA,EAAYb,mBAAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,KAAK,CAAC,CAAA;AACzE,UAAA,IAAA,CAAK,eAAea,KAAI,CAAA;AACxB,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,EAAA,GAAK,aAAA,CAAc,IAAA,EAAM,IAAA,CAAK,OAAO,IAAI,CAAA;AAI/C,QAAA,MAAM,WAAW,EAAA,CAAG,KAAA;AAEpB,QAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,IAAA,CAAK,OAAO,IAAI,CAAA;AACjD,QAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AACzD,QAAA,MAAM,iBAAA,GAAoB,eAAe,QAAQ,CAAA;AACjD,QAAA,MAAM,YAAA,GAAe,YAAA,CAAa,EAAA,CAAG,KAAA,EAAO,GAAG,OAAO,CAAA;AAEtD,QAAA,KAAA,IAAS,SAAS,CAAA,EAAG,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAM,MAAA,EAAA,EAAU;AAExD,UAAA,IAAI,GAAA,GAAM,MAAA;AACV,UAAA,MAAM,OAAA,GAAU,IAAI,KAAA,CAAc,IAAA,CAAK,OAAO,IAAI,CAAA;AAClD,UAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,EAAA,EAAK;AACzC,YAAA,MAAM,CAAA,GAAI,gBAAA,CAAiB,CAAC,CAAA,IAAK,CAAA;AACjC,YAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA;AAC5B,YAAA,GAAA,IAAO,CAAA,GAAI,CAAA;AACX,YAAA,OAAA,CAAQ,CAAC,CAAA,GAAI,CAAA;AAAA,UACf;AAGA,UAAA,MAAM,WAAqB,EAAC;AAC5B,UAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,EAAA,EAAK;AACzC,YAAA,IAAI,MAAM,EAAA,EAAI;AACZ,cAAA,IAAI,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA;AAC7B,cAAA;AAAA,YACF;AACA,YAAA,QAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAC,CAAA;AAAA,UAC/B;AAGA,UAAA,IAAI,OAAA,GAAU,CAAA;AACd,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,YAAA,OAAA,IAAA,CAAY,SAAS,CAAC,CAAA,IAAK,CAAA,KAAM,iBAAA,CAAkB,CAAC,CAAA,IAAK,CAAA,CAAA;AAAA,UAC3D;AAEA,UAAA,MAAM,QAAA,GAAW,YAAA,GACb,EAAA,CAAG,MAAA,GAAS,OAAA,GACZ,mBAAA,CAAoB,OAAA,EAAS,iBAAA,EAAmB,EAAA,CAAG,OAAA,EAAS,EAAA,CAAG,MAAM,CAAA;AACzE,UAAA,MAAM,YAAY,EAAA,CAAG,IAAA;AACrB,UAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC5B,YAAA,MAAM,IAAI,WAAW,wCAAwC,CAAA;AAAA,UAC/D;AACA,UAAA,OAAA,CAAQ,MAAM,CAAA,GACZ,SAAA,YAAqB,aAAA,GACjB,MAAA,CAAO,gBAAA,CAAiB,SAAA,EAAW,QAAQ,CAAC,CAAA,GAC5C,iBAAA,CAAkB,SAAA,EAAW,QAAQ,CAAA;AAAA,QAC7C;AAEA,QAAA,MAAM,aAAA,GAAgB,iBAAiB,IAAA,CAAK,MAAA,CAAO,OAAO,IAAA,CAAK,MAAA,CAAO,QAAQ,OAAO,CAAA;AACrF,QAAA,MAAM,IAAA,GACJ,aAAA,CAAc,KAAA,KAAU,IAAA,CAAK,OAAO,KAAA,GAChC,aAAA,GACA,UAAA,CAAW,aAAA,EAAeb,mBAAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,KAAK,CAAC,CAAA;AAC5E,QAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,MAC1B;AAAA,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,IAAI,KAAA,EAA+B;AACjC,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,MAAM,MAAM,CAAA;AAC/C,IAAA,MAAM,YAAA,GAAe,WAAA,KAAgB,IAAA,CAAK,YAAA,IAAgB,KAAA,CAAM,YAAA,CAAA;AAEhE,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA;AAAA,MACA,MAAM,YAAA,GAAe,CAAC,IAAA,EAAM,KAAK,IAAI,EAAC;AAAA,MACtC,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,mDAAmD,CAAA;AAAA,QAC5E;AACA,QAAA,MAAM,SAAA,GAAYA,mBAAAA,CAAmB,EAAA,CAAG,KAAA,EAAO,KAAK,CAAA;AACpD,QAAA,MAAM,KAAA,GACJ,IAAA,CAAK,MAAA,CAAO,KAAA,KAAU,SAAA,GAAY,KAAK,MAAA,GAAS,UAAA,CAAW,IAAA,CAAK,MAAA,EAAQ,SAAS,CAAA;AACnF,QAAA,MAAM,KAAA,GACJ,KAAA,CAAM,MAAA,CAAO,KAAA,KAAU,SAAA,GAAY,MAAM,MAAA,GAAS,UAAA,CAAW,KAAA,CAAM,MAAA,EAAQ,SAAS,CAAA;AACtF,QAAA,IAAI,KAAK,YAAA,EAAc;AACrB,UAAA,MAAM,IAAA,GAAO,oBAAoB,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA,EAAG,IAAA,CAAK,OAAO,KAAK,CAAA;AAClE,UAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,QAC1B;AACA,QAAA,IAAI,MAAM,YAAA,EAAc;AACtB,UAAA,MAAM,IAAA,GAAO,mBAAA;AAAA,YACX,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,GAAA,CAAI,KAAA,EAAO,KAAK,CAAC,CAAA,EAAG,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,YAC1C,MAAM,MAAA,CAAO;AAAA,WACf;AACA,UAAA,KAAA,CAAM,eAAe,IAAI,CAAA;AAAA,QAC3B;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,IAAI,QAAA,EAA8B;AAChC,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,YAAgB,aAAA,EAAe;AAC7C,MAAA,MAAM,IAAI,UAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AACA,IAAA,MAAM,cAAA,GAAiB,OAAO,QAAA,EAAU,EAAE,OAAO,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACpE,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,cAAc,CAAA;AACjD,IAAA,MAAM,YAAA,GAAe,eAAe,IAAA,CAAK,YAAA;AAEzC,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA;AAAA,MACA,IAAA,EAAM,YAAA,GAAe,CAAC,IAAI,IAAI,EAAC;AAAA,MAC/B,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,mDAAmD,CAAA;AAAA,QAC5E;AACA,QAAA,MAAM,WAAA,GAAc,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,MAAA,CAAO,QAAA,GAAW,CAAA,EAAG,EAAE,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AACvF,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,MAAA,CAAO,QAAA,EAAU,EAAE,KAAA,EAAO,SAAA,CAAU,KAAA,EAAO,CAAC,GAAG,WAAW,CAAA;AACnF,QAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,MAC1B;AAAA,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,IAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,IAAI,GAAG,CAAA;AAAA,EACrB;AAAA,EAEA,OAAO,KAAA,EAA+B;AACpC,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,MAAM,MAAM,CAAA;AAC/C,IAAA,MAAM,YAAA,GAAe,WAAA,KAAgB,IAAA,CAAK,YAAA,IAAgB,KAAA,CAAM,YAAA,CAAA;AAChE,IAAA,MAAM,gBAAgB,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,MAAA,CAAO,OAAO,CAAC,CAAA;AACtD,IAAA,MAAM,iBAAiB,IAAA,CAAK,GAAA,CAAI,GAAG,KAAA,CAAM,MAAA,CAAO,OAAO,CAAC,CAAA;AACxD,IAAA,MAAM,eAAA,GAAkB,aAAA,KAAkB,CAAA,IAAK,cAAA,GAAiB,CAAA;AAChE,IAAA,MAAM,gBAAA,GAAmB,cAAA,KAAmB,CAAA,IAAK,aAAA,GAAgB,CAAA;AACjE,IAAA,MAAM,SAAA,GAAYA,mBAAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,OAAO,QAAQ,CAAA;AAChE,IAAA,MAAM,UAAA,GAAaA,mBAAAA,CAAmB,KAAA,CAAM,MAAA,CAAO,OAAO,QAAQ,CAAA;AAElE,IAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAsB;AACzC,MAAA,IAAI,CAAA,CAAE,IAAA,GAAO,CAAA,EAAG,OAAO,CAAA;AACvB,MAAA,MAAM,OAAiB,EAAC;AACxB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,MACb;AACA,MAAA,MAAM,IAAA,GAAO,EAAE,IAAA,GAAO,CAAA;AACtB,MAAA,MAAM,UAAA,GAAa,EAAE,IAAA,GAAO,CAAA;AAC5B,MAAA,MAAM,GAAA,GAAM,KAAK,IAAI,CAAA;AACrB,MAAA,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,UAAU,CAAA,IAAK,IAAA;AACjC,MAAA,IAAA,CAAK,UAAU,IAAI,GAAA,IAAO,UAAA;AAC1B,MAAA,OAAO,SAAA,CAAU,GAAG,IAAI,CAAA;AAAA,IAC1B,CAAA;AAEA,IAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,EAAW,SAAA,EAAmB,WAAA,KAAsC;AAC3F,MAAA,IAAItB,IAAAA,GAAM,CAAA;AACV,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAClC,QAAAA,IAAAA,GAAM,GAAA,CAAIA,IAAAA,EAAK,CAAC,CAAA;AAAA,MAClB;AACA,MAAA,OAAO,UAAA,CAAWA,MAAK,WAAW,CAAA;AAAA,IACpC,CAAA;AAEA,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA;AAAA,MACA,MAAM,YAAA,GAAe,CAAC,IAAA,EAAM,KAAK,IAAI,EAAC;AAAA,MACtC,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,sDAAsD,CAAA;AAAA,QAC/E;AACA,QAAA,IAAI,KAAK,YAAA,EAAc;AACrB,UAAA,IAAI,OAAO,GAAA,CAAI,EAAA,EAAI,WAAA,CAAY,KAAA,CAAM,MAAM,CAAC,CAAA;AAC5C,UAAA,IAAI,eAAA,EAAiB;AACnB,YAAA,IAAA,GAAO,eAAA,CAAgB,IAAA,EAAM,cAAA,EAAgB,SAAS,CAAA;AAAA,UACxD,CAAA,MAAO;AACL,YAAA,IAAA,GAAO,UAAA,CAAW,MAAM,SAAS,CAAA;AAAA,UACnC;AACA,UAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,QAC1B;AACA,QAAA,IAAI,MAAM,YAAA,EAAc;AACtB,UAAA,IAAI,OAAO,GAAA,CAAI,WAAA,CAAY,IAAA,CAAK,MAAM,GAAG,EAAE,CAAA;AAC3C,UAAA,IAAI,gBAAA,EAAkB;AACpB,YAAA,IAAA,GAAO,eAAA,CAAgB,IAAA,EAAM,aAAA,EAAe,UAAU,CAAA;AAAA,UACxD,CAAA,MAAO;AACL,YAAA,IAAA,GAAO,UAAA,CAAW,MAAM,UAAU,CAAA;AAAA,UACpC;AACA,UAAA,KAAA,CAAM,eAAe,IAAI,CAAA;AAAA,QAC3B;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,IAAA,GAAmB;AACjB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,YAAgB,aAAA,EAAe;AAC7C,MAAA,MAAMA,IAAAA,GAAM,IAAI,aAAA,CAAc,IAAA,CAAK,OAAO,IAAI,CAAA;AAC9C,MAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AACvD,MAAA,MAAM,aAAa,YAAA,CAAa,IAAA,CAAK,OAAO,KAAA,EAAO,IAAA,CAAK,OAAO,OAAO,CAAA;AACtE,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,EAAA,EAAK;AACzC,QAAA,MAAM,MAAA,GAAS,UAAA,GACX,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,GACrB,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,IAAA,CAAK,OAAO,MAAM,CAAA;AAClF,QAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AACrD,QAAAA,IAAAA,CAAI,CAAC,CAAA,GAAI,GAAA,GAAM,KAAK,GAAA,GAAM,EAAA;AAAA,MAC5B;AACA,MAAA,MAAMoC,UAAAA,GAAY,OAAY,cAAA,CAAe;AAAA,QAC3C,IAAA,EAAMpC,IAAAA;AAAA,QACN,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,QACnB,KAAA,EAAO,OAAA;AAAA,QACP,MAAA,EAAQ,KAAK,MAAA,CAAO;AAAA,OACrB,CAAA;AACD,MAAA,OAAO,YAAW,UAAA,CAAWoC,UAAAA,EAAW,EAAE,YAAA,EAAc,OAAO,CAAA;AAAA,IACjE;AACA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAClC,IAAA,MAAM,QAAA,GAAWd,mBAAAA,CAAmB,SAAA,CAAU,KAAA,EAAO,MAAM,CAAA;AAC3D,IAAA,MAAM,YAAA,GAAe,eAAe,IAAA,CAAK,YAAA;AAEzC,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA;AAAA,MACA,IAAA,EAAM,YAAA,GAAe,CAAC,IAAI,IAAI,EAAC;AAAA,MAC/B,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,oDAAoD,CAAA;AAAA,QAC7E;AACA,QAAA,MAAM,WAAW,KAAK,qBAAA,CAAsB,QAAQ,CAAA,EAAG,IAAA,CAAK,OAAO,IAAI,CAAA;AACvE,QAAA,MAAM,UAAA,GAAa,cAAA,CAAe,IAAA,CAAK,MAAM,CAAA;AAC7C,QAAA,IAAI,oBAAoB,aAAA,EAAe;AACrC,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC1C,YAAA,MAAM,GAAA,GAAM,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAC7B,YAAA,QAAA,CAAS,CAAC,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,EAAA,GAAK,EAAA;AAAA,UAC/B;AAAA,QACF,CAAA,MAAO;AAEL,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC1C,YAAA,MAAM,GAAA,GAAM,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAC7B,YAAA,QAAA,CAAS,CAAC,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,UAC9B;AAAA,QACF;AACA,QAAA,MAAM,UAAA,GAAa,OAAY,cAAA,CAAe;AAAA,UAC5C,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,UACnB,KAAA,EAAO,QAAA;AAAA,UACP,MAAA,EAAQ,KAAK,MAAA,CAAO;AAAA,SACrB,CAAA;AACD,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,EAAA,EAAI,UAAU,CAAA;AAC/B,QAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,MAC1B;AAAA,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,OAAA,GAAsB;AACpB,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AACrC,IAAA,MAAM,YAAA,GAAe,eAAe,IAAA,CAAK,YAAA;AAEzC,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA;AAAA,MACA,IAAA,EAAM,YAAA,GAAe,CAAC,IAAI,IAAI,EAAC;AAAA,MAC/B,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,uDAAuD,CAAA;AAAA,QAChF;AACA,QAAA,MAAM,MAAM,MAAA,CAAO,CAAA,EAAG,EAAE,KAAA,EAAO,SAAA,CAAU,OAAO,CAAA;AAChD,QAAA,MAAM,cAAc,GAAA,CAAI,SAAA,EAAW,GAAA,CAAI,GAAA,EAAK,SAAS,CAAC,CAAA;AACtD,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,EAAA,EAAI,WAAW,CAAA;AAChC,QAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,MAC1B;AAAA,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EACnB;AAAA,EAEA,GAAA,GAAkB;AAChB,IAAA,IAAI,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAC/B,IAAA,MAAM,WAAA,GAAcA,mBAAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,OAAO,KAAK,CAAA;AAC/D,IAAA,IAAI,SAAA,CAAU,UAAU,WAAA,EAAa;AACnC,MAAA,SAAA,GAAY,UAAA,CAAW,WAAW,WAAW,CAAA;AAAA,IAC/C;AACA,IAAA,MAAM,YAAA,GAAe,eAAe,IAAA,CAAK,YAAA;AAEzC,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA;AAAA,MACA,IAAA,EAAM,YAAA,GAAe,CAAC,IAAI,IAAI,EAAC;AAAA,MAC/B,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,mDAAmD,CAAA;AAAA,QAC5E;AAEA,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,EAAA,EAAI,SAAS,CAAA;AAC9B,QAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,MAC1B;AAAA,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,GAAA,GAAkB;AAChB,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AACjC,IAAA,MAAM,YAAA,GAAe,eAAe,IAAA,CAAK,YAAA;AAEzC,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA;AAAA,MACA,IAAA,EAAM,YAAA,GAAe,CAAC,IAAI,IAAI,EAAC;AAAA,MAC/B,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,mDAAmD,CAAA;AAAA,QAC5E;AAEA,QAAA,MAAM,KAAA,GACJ,IAAA,CAAK,MAAA,CAAO,KAAA,KAAU,GAAG,KAAA,GACrB,IAAA,CAAK,MAAA,GACL,UAAA,CAAW,KAAK,MAAA,EAAQA,mBAAAA,CAAmB,EAAA,CAAG,KAAA,EAAO,KAAK,CAAC,CAAA;AACjE,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA;AAC1B,QAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,MAC1B;AAAA,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,IAAA,GAAmB;AACjB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAClC,IAAA,MAAM,YAAA,GAAe,eAAe,IAAA,CAAK,YAAA;AAEzC,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA;AAAA,MACA,IAAA,EAAM,YAAA,GAAe,CAAC,IAAI,IAAI,EAAC;AAAA,MAC/B,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,oDAAoD,CAAA;AAAA,QAC7E;AAEA,QAAA,MAAM,MAAA,GAAS,GAAA,CAAI,SAAA,EAAW,SAAS,CAAA;AACvC,QAAA,MAAM,MAAM,MAAA,CAAO,CAAA,EAAG,EAAE,KAAA,EAAO,SAAA,CAAU,OAAO,CAAA;AAChD,QAAA,MAAM,OAAO,GAAA,CAAI,EAAA,EAAI,GAAA,CAAI,GAAA,EAAK,MAAM,CAAC,CAAA;AACrC,QAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,MAC1B;AAAA,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,SAAS,IAAA,EAAgC;AACvC,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,MAAA,EAAQ,GAAG,IAAI,CAAA;AAC5C,IAAA,MAAM,YAAA,GAAe,eAAe,IAAA,CAAK,YAAA;AAGzC,IAAA,MAAM,UAAA,GAAa,KAAK,MAAA,CAAO,KAAA;AAC/B,IAAA,MAAM,IAAA,GAAO,KAAK,MAAA,CAAO,IAAA;AAEzB,IAAA,MAAM,SAAe,EAAC;AACtB,IAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,IAAA,EAAM,IAAA,EAAA,EAAQ;AACtC,MAAA,MAAM,GAAA,GAAM,UAAA,CAAW,IAAI,CAAA,IAAK,CAAA;AAChC,MAAA,MAAM,CAAA,GAAI,KAAK,IAAI,CAAA;AACnB,MAAA,IAAI,MAAM,MAAA,EAAW;AACnB,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,GAAA,EAAK,KAAK,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,MAC7D,CAAA,MAAA,IAAW,OAAO,CAAA,KAAM,QAAA,EAAU;AAChC,QAAA,MAAM,GAAA,GAAM,CAAA,GAAI,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,CAAA;AAC9B,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,GAAA,EAAK,GAAA,GAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,MAClE,CAAA,MAAO;AACL,QAAA,MAAM,IAAA,GAAO,EAAE,IAAA,IAAQ,CAAA;AACvB,QAAA,IAAI,OAAO,CAAA,EAAG;AACZ,UAAA,MAAM,IAAI,IAAA,CAAK,GAAA;AAAA,YACb,IAAA,CAAK,GAAA,CAAA,CAAK,CAAA,CAAE,KAAA,IAAS,CAAA,IAAK,CAAA,GAAI,GAAA,IAAO,CAAA,CAAE,KAAA,IAAS,CAAA,CAAA,GAAM,CAAA,CAAE,KAAA,IAAS,GAAI,CAAC,CAAA;AAAA,YACtE;AAAA,WACF;AACA,UAAA,MAAM,IAAI,IAAA,CAAK,GAAA;AAAA,YACb,IAAA,CAAK,GAAA,CAAA,CAAK,CAAA,CAAE,GAAA,IAAO,GAAA,IAAO,CAAA,GAAI,GAAA,IAAO,CAAA,CAAE,GAAA,IAAO,GAAA,CAAA,GAAQ,CAAA,CAAE,GAAA,IAAO,KAAM,CAAC,CAAA;AAAA,YACtE;AAAA,WACF;AACA,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAK,CAAA,EAAG,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,QACxD,CAAA,MAAO;AACL,UAAA,IAAI,CAAA,GAAA,CAAK,CAAA,CAAE,KAAA,IAAS,GAAA,GAAM,CAAA,IAAK,CAAA,GAAI,GAAA,IAAO,CAAA,CAAE,KAAA,IAAS,GAAA,GAAM,CAAA,CAAA,GAAM,CAAA,CAAE,SAAS,GAAA,GAAM,CAAA;AAClF,UAAA,IAAI,CAAA,IAAK,GAAA,EAAK,CAAA,GAAI,GAAA,GAAM,CAAA;AACxB,UAAA,IAAI,CAAA,GAAI,IAAI,CAAA,GAAI,EAAA;AAChB,UAAA,MAAM,MAAA,GAAS,EAAE,GAAA,IAAO,EAAA;AACxB,UAAA,IAAI,CAAA;AACJ,UAAA,IAAI,WAAW,EAAA,EAAI;AACjB,YAAA,CAAA,GAAI,EAAA;AAAA,UACN,CAAA,MAAA,IAAW,SAAS,CAAA,EAAG;AACrB,YAAA,CAAA,GAAI,GAAA,GAAM,MAAA;AACV,YAAA,IAAI,CAAA,GAAI,IAAI,CAAA,GAAI,EAAA;AAAA,UAClB,CAAA,MAAO;AACL,YAAA,CAAA,GAAI,MAAA;AACJ,YAAA,IAAI,CAAA,IAAK,GAAA,EAAK,CAAA,GAAI,GAAA,GAAM,CAAA;AAAA,UAC1B;AACA,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAK,CAAA,EAAG,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA;AAAA,MACA,IAAA,EAAM,YAAA,GAAe,CAAC,IAAI,IAAI,EAAC;AAAA,MAC/B,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,qDAAqD,CAAA;AAAA,QAC9E;AAEA,QAAA,MAAM,KAAA,GAAQA,mBAAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,OAAO,OAAO,CAAA;AAC3D,QAAA,MAAM,WAAW,KAAK,qBAAA,CAAsB,KAAK,CAAA,EAAG,IAAA,CAAK,OAAO,IAAI,CAAA;AACpE,QAAA,MAAM,OAAA,GAAU,eAAe,EAAE,CAAA;AAGjC,QAAA,MAAM,WAAqB,EAAC;AAC5B,QAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,UAAA,IAAI,CAAC,GAAG,OAAA,EAAS;AACf,YAAA,MAAM,GAAA,GACJ,EAAA,CAAG,IAAA,GAAO,CAAA,GACN,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAA,CAAM,EAAA,CAAG,GAAA,GAAM,EAAA,CAAG,KAAA,IAAS,EAAA,CAAG,IAAI,CAAC,CAAA,GACpD,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAA,CAAM,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,GAAA,IAAO,CAAC,EAAA,CAAG,IAAI,CAAC,CAAA;AAC3D,YAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AAAA,UACnB;AAAA,QACF;AACA,QAAA,MAAM,OAAA,GAAU,QAAA,CAAS,MAAA,KAAW,CAAA,GAAI,CAAA,GAAI,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AAC9E,QAAA,MAAM,UAAA,GAAa,eAAe,QAAQ,CAAA;AAC1C,QAAA,MAAM,SAAA,GAAY,eAAe,UAAU,CAAA;AAE3C,QAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,OAAA,EAAS,OAAA,EAAA,EAAW;AAElD,UAAA,IAAI,GAAA,GAAM,OAAA;AACV,UAAA,MAAM,MAAA,GAAmB,IAAI,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA;AAClD,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,YAAA,MAAM,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAC3B,YAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAC9B,YAAA,GAAA,IAAO,CAAA;AAAA,UACT;AAGA,UAAA,IAAI,MAAA,GAAS,CAAA;AACb,UAAA,IAAI,OAAA,GAAU,CAAA;AACd,UAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,IAAA,EAAM,IAAA,EAAA,EAAQ;AACtC,YAAA,MAAM,EAAA,GAAK,OAAO,IAAI,CAAA;AACtB,YAAA,IAAI,CAAC,EAAA,EAAI,MAAM,IAAI,aAAa,gDAAgD,CAAA;AAChF,YAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,OAAA,GAAU,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,KAAA,GAAA,CAAS,MAAA,CAAO,OAAA,EAAS,CAAA,IAAK,CAAA,IAAK,EAAA,CAAG,IAAA;AAC/E,YAAA,MAAA,IAAU,KAAA,IAAS,SAAA,CAAU,IAAI,CAAA,IAAK,CAAA,CAAA;AAAA,UACxC;AAEA,UAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAO,CAAA,IAAK,CAAA;AAChC,UAAA,IAAI,oBAAoB,aAAA,EAAe;AACrC,YAAA,QAAA,CAAS,MAAM,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,UAC3C,CAAA,MAAO;AACL,YAAA,QAAA,CAAS,MAAM,CAAA,GAAI,GAAA;AAAA,UACrB;AAAA,QACF;AAEA,QAAA,MAAM,UAAA,GAAa,OAAY,cAAA,CAAe;AAAA,UAC5C,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,UAAA;AAAA,UACP,KAAA;AAAA,UACA,MAAA,EAAQ,KAAK,MAAA,CAAO;AAAA,SACrB,CAAA;AACD,QAAA,IAAA,CAAK,eAAe,UAAU,CAAA;AAAA,MAChC;AAAA,KACD,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAA,CAAO,SAAqB,IAAA,EAAwB;AAClD,IAAA,MAAM,YAAY,MAAA,CAAO,IAAA,CAAK,MAAA,EAAQ,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAC1D,IAAA,MAAM,EAAA,GAAK,aAAA,CAAc,IAAA,EAAM,IAAA,CAAK,OAAO,IAAI,CAAA;AAC/C,IAAA,MAAM,YAAA,GAAe,WAAA,KAAgB,IAAA,CAAK,YAAA,IAAgB,OAAA,CAAQ,YAAA,CAAA;AAElE,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA;AAAA,MACA,MAAM,YAAA,GAAe,CAAC,IAAA,EAAM,OAAO,IAAI,EAAC;AAAA,MACxC,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,sDAAsD,CAAA;AAAA,QAC/E;AAEA,QAAA,IAAI,KAAK,YAAA,EAAc;AACrB,UAAA,MAAM,KAAA,GAAQA,mBAAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,OAAO,QAAQ,CAAA;AAC5D,UAAA,MAAM,WAAW,KAAK,qBAAA,CAAsB,KAAK,CAAA,EAAG,IAAA,CAAK,OAAO,IAAI,CAAA;AACpE,UAAA,MAAM,OAAA,GAAU,eAAe,EAAE,CAAA;AAEjC,UAAA,MAAM,WAAW,SAAA,CAAU,KAAA;AAC3B,UAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAO,KAAA;AAC5B,UAAA,MAAM,UAAA,GAAa,eAAe,QAAQ,CAAA;AAC1C,UAAA,MAAM,SAAA,GAAY,eAAe,OAAO,CAAA;AACxC,UAAA,MAAM,QAAA,GAAW,cAAA,CAAe,OAAA,CAAQ,MAAM,CAAA;AAE9C,UAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,SAAA,CAAU,MAAM,OAAA,EAAA,EAAW;AAEzD,YAAA,IAAI,GAAA,GAAM,OAAA;AACV,YAAA,MAAM,MAAA,GAAmB,IAAI,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA;AAClD,YAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,cAAA,MAAM,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAC3B,cAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAC9B,cAAA,GAAA,IAAO,CAAA;AAAA,YACT;AAIA,YAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAM,QAAA,CAAS,OAAO,EAAE,CAAA,IAAK,CAAC,CAAA,IAAK,CAAC,CAAA;AACxD,YAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,EAAM;AAC3B,YAAA,KAAA,CAAM,EAAE,CAAA,GAAI,MAAA;AAEZ,YAAA,IAAI,MAAA,GAAS,CAAA;AACb,YAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,cAAA,MAAA,IAAA,CAAW,MAAM,CAAC,CAAA,IAAK,CAAA,KAAM,SAAA,CAAU,CAAC,CAAA,IAAK,CAAA,CAAA;AAAA,YAC/C;AAEA,YAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAO,CAAA,IAAK,CAAA;AAChC,YAAA,IAAI,oBAAoB,aAAA,EAAe;AACrC,cAAA,QAAA,CAAS,MAAM,CAAA,GAAA,CAAK,QAAA,CAAS,MAAM,CAAA,IAAK,MAAM,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,YACtE,CAAA,MAAO;AACL,cAAA,QAAA,CAAS,MAAM,CAAA,GAAA,CAAK,QAAA,CAAS,MAAM,KAAK,CAAA,IAAK,GAAA;AAAA,YAC/C;AAAA,UACF;AAEA,UAAA,MAAM,UAAA,GAAa,OAAY,cAAA,CAAe;AAAA,YAC5C,IAAA,EAAM,QAAA;AAAA,YACN,KAAA,EAAO,OAAA;AAAA,YACP,KAAA;AAAA,YACA,MAAA,EAAQ,KAAK,MAAA,CAAO;AAAA,WACrB,CAAA;AACD,UAAA,IAAA,CAAK,eAAe,UAAU,CAAA;AAAA,QAChC;AAAA,MAEF;AAAA,KACD,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,IAAA,CAAK,IAAA,EAAa,QAAA,GAAW,KAAA,EAAmB;AAC9C,IAAA,IAAI,CAAA;AACJ,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,CAAA,GAAI,KAAK,MAAA,CAAO,IAAA;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,MAAM,EAAA,GAAK,aAAA,CAAc,IAAA,EAAM,IAAA,CAAK,OAAO,IAAI,CAAA;AAC/C,MAAA,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,IAAK,CAAA;AAAA,IAC/B;AACA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,QAAQ,CAAA;AAEtC,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAW,MAAA,CAAO,CAAA,EAAG;AAAA,MACjC,KAAA,EAAOA,mBAAAA,CAAmB,MAAA,CAAO,MAAA,CAAO,OAAO,MAAM;AAAA,KACtD,CAAA;AACD,IAAA,OAAO,MAAA,CAAO,IAAI,KAAK,CAAA;AAAA,EACzB;AAAA,EAEA,GAAA,CAAI,IAAA,EAAa,QAAA,GAAW,KAAA,EAAmB;AAC7C,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACjD,IAAA,MAAM,YAAA,GAAe,eAAe,IAAA,CAAK,YAAA;AAEzC,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA;AAAA,MACA,IAAA,EAAM,YAAA,GAAe,CAAC,IAAI,IAAI,EAAC;AAAA,MAC/B,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,mDAAmD,CAAA;AAAA,QAC5E;AAEA,QAAA,IAAI,WAAA,GAAc,SAAA;AAClB,QAAA,IAAI,YAAA,GAAe,EAAA;AAEnB,QAAA,IAAI,SAAS,MAAA,EAAW;AAEtB,UAAA,MAAM,OAAA,GAAU,IAAI,KAAA,CAAM,IAAA,CAAK,OAAO,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAClD,UAAA,WAAA,GAAc,SAAA,CAAU,QAAQ,OAAO,CAAA;AACvC,UAAA,YAAA,GAAe,EAAA,CAAG,QAAQ,OAAO,CAAA;AAAA,QACnC,CAAA,MAAA,IAAW,CAAC,QAAA,EAAU;AAEpB,UAAA,MAAM,EAAA,GAAK,aAAA,CAAc,IAAA,EAAM,IAAA,CAAK,OAAO,IAAI,CAAA;AAC/C,UAAA,MAAM,WAAA,GAAc,CAAC,GAAG,IAAA,CAAK,OAAO,KAAK,CAAA;AACzC,UAAA,WAAA,CAAY,EAAE,CAAA,GAAI,CAAA;AAClB,UAAA,WAAA,GAAc,SAAA,CAAU,QAAQ,WAAW,CAAA;AAC3C,UAAA,YAAA,GAAe,EAAA,CAAG,QAAQ,WAAW,CAAA;AAAA,QACvC;AAEA,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,MAAA,EAAQ,WAAW,CAAA;AAC/C,QAAA,MAAM,IAAA,GAAO,WAAW,QAAA,EAAUA,mBAAAA,CAAmB,KAAK,MAAA,CAAO,KAAA,EAAO,KAAK,CAAC,CAAA;AAC9E,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,EAAM,YAAY,CAAA;AACnC,QAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,MAC1B;AAAA,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,QAAQ,QAAA,EAA6B;AACnC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA;AACnD,IAAA,MAAM,YAAA,GAAe,eAAe,IAAA,CAAK,YAAA;AAEzC,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,cAAA;AAAA,MACR,YAAA;AAAA,MACA,IAAA,EAAM,YAAA,GAAe,CAAC,IAAI,IAAI,EAAC;AAAA,MAC/B,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,uDAAuD,CAAA;AAAA,QAChF;AAEA,QAAA,MAAM,YAAA,GAAe,EAAA,CAAG,OAAA,CAAQ,IAAA,CAAK,OAAO,KAAK,CAAA;AACjD,QAAA,IAAA,CAAK,eAAe,YAAY,CAAA;AAAA,MAClC;AAAA,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,OAAA,GAAsB;AACpB,IAAA,OAAO,KAAK,OAAA,CAAQ,CAAC,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,IAAA,CAAK,KAAA,EAAc,OAAA,EAA6B,MAAA,EAA6B;AAC3E,IAAA,MAAM,aAAa,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,SAAS,MAAM,CAAA;AAC1D,IAAA,MAAM,YAAA,GAAe,eAAe,IAAA,CAAK,YAAA;AAEzC,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,UAAA;AAAA,MACR,YAAA;AAAA,MACA,IAAA,EAAM,YAAA,GAAe,CAAC,IAAI,IAAI,EAAC;AAAA,MAC/B,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,oDAAoD,CAAA;AAAA,QAC7E;AAEA,QAAA,MAAM,YAAA,GAAe,EAAA,CAAG,OAAA,CAAQ,IAAA,CAAK,OAAO,KAAK,CAAA;AACjD,QAAA,IAAA,CAAK,eAAe,YAAY,CAAA;AAAA,MAClC;AAAA,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EACA,UAAU,IAAA,EAAsC;AAC9C,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAA;AAC7C,IAAA,MAAM,YAAA,GAAe,eAAe,IAAA,CAAK,YAAA;AAEzC,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA;AAAA,MACA,IAAA,EAAM,YAAA,GAAe,CAAC,IAAI,IAAI,EAAC;AAAA,MAC/B,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,yDAAyD,CAAA;AAAA,QAClF;AAIA,QAAA,IAAI,SAAS,MAAA,EAAW;AACtB,UAAA,MAAM,IAAA,GAAO,UAAU,EAAE,CAAA;AACzB,UAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,QAC1B,CAAA,MAAO;AAEL,UAAA,MAAM,OAAA,GAAU,IAAI,KAAA,CAAc,IAAA,CAAK,MAAM,CAAA;AAC7C,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,YAAA,MAAM,IAAA,GAAO,KAAK,CAAC,CAAA;AACnB,YAAA,IAAI,SAAS,MAAA,EAAW;AACtB,cAAA,OAAA,CAAQ,IAAI,CAAA,GAAI,CAAA;AAAA,YAClB;AAAA,UACF;AACA,UAAA,MAAM,IAAA,GAAO,SAAA,CAAU,EAAA,EAAI,OAAO,CAAA;AAClC,UAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,QAC1B;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,GAAA,CAAI,IAAA,EAAa,QAAA,GAAW,KAAA,EAAmB;AAC7C,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACjD,IAAA,MAAM,YAAA,GAAe,eAAe,IAAA,CAAK,YAAA;AAEzC,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA;AAAA,MACA,IAAA,EAAM,YAAA,GAAe,CAAC,IAAI,IAAI,EAAC;AAAA,MAC/B,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,mDAAmD,CAAA;AAAA,QAC5E;AAEA,QAAA,IAAI,WAAA,GAAc,SAAA;AAClB,QAAA,IAAI,YAAA,GAAe,EAAA;AAEnB,QAAA,IAAI,SAAS,MAAA,EAAW;AACtB,UAAA,MAAM,OAAA,GAAU,IAAI,KAAA,CAAM,IAAA,CAAK,OAAO,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAClD,UAAA,WAAA,GAAc,SAAA,CAAU,QAAQ,OAAO,CAAA;AACvC,UAAA,YAAA,GAAe,EAAA,CAAG,QAAQ,OAAO,CAAA;AAAA,QACnC,CAAA,MAAA,IAAW,CAAC,QAAA,EAAU;AACpB,UAAA,MAAM,EAAA,GAAK,aAAA,CAAc,IAAA,EAAM,IAAA,CAAK,OAAO,IAAI,CAAA;AAC/C,UAAA,MAAM,WAAA,GAAc,CAAC,GAAG,IAAA,CAAK,OAAO,KAAK,CAAA;AACzC,UAAA,WAAA,CAAY,EAAE,CAAA,GAAI,CAAA;AAClB,UAAA,WAAA,GAAc,SAAA,CAAU,QAAQ,WAAW,CAAA;AAC3C,UAAA,YAAA,GAAe,EAAA,CAAG,QAAQ,WAAW,CAAA;AAAA,QACvC;AAEA,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,MAAA,EAAQ,WAAW,CAAA;AAC/C,QAAA,MAAM,IAAA,GAAO,WAAW,QAAA,EAAUA,mBAAAA,CAAmB,KAAK,MAAA,CAAO,KAAA,EAAO,KAAK,CAAC,CAAA;AAC9E,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,EAAM,YAAY,CAAA;AACnC,QAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,MAC1B;AAAA,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,GAAA,GAAkB;AAChB,IAAA,MAAM,SAAA,GAAY,GAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AACnC,IAAA,MAAM,YAAA,GAAe,eAAe,IAAA,CAAK,YAAA;AAEzC,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA;AAAA,MACA,IAAA,EAAM,YAAA,GAAe,CAAC,IAAI,IAAI,EAAC;AAAA,MAC/B,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,mDAAmD,CAAA;AAAA,QAC5E;AAEA,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO;AAAA,UACrC,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,UACnB,MAAA,EAAQ,KAAK,MAAA,CAAO;AAAA,SACrB,CAAA;AACD,QAAA,MAAM,OAAA,GAAU,UAAA;AAAA,UACd,OAAA,CAAQ,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AAAA,UAC1BA,mBAAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,KAAK;AAAA,SAC7C;AACA,QAAA,MAAM,OAAA,GAAU,UAAA;AAAA,UACd,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AAAA,UACvBA,mBAAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,KAAK;AAAA,SAC7C;AACA,QAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AAClC,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA;AAC1B,QAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,MAC1B;AAAA,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,IAAA,CAAK,QAAgB,MAAA,EAA4B;AAC/C,IAAA,MAAM,SAAA,GAAY,IAAA,CAAO,IAAA,CAAK,MAAA,EAAQ,QAAQ,MAAM,CAAA;AACpD,IAAA,MAAM,YAAA,GAAe,eAAe,IAAA,CAAK,YAAA;AAEzC,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA;AAAA,MACA,IAAA,EAAM,YAAA,GAAe,CAAC,IAAI,IAAI,EAAC;AAAA,MAC/B,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,oDAAoD,CAAA;AAAA,QAC7E;AAEA,QAAA,MAAM,KAAA,GAAQA,mBAAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,OAAO,MAAM,CAAA;AAC1D,QAAA,MAAM,IAAA,GAAO,OAAO,MAAA,EAAQ,EAAE,OAAO,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACxD,QAAA,MAAM,KAAA,GAAQ,OAAO,MAAA,EAAQ,EAAE,OAAO,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACzD,QAAA,MAAM,WAAW,UAAA,CAAW,OAAA,CAAQ,KAAK,MAAA,EAAQ,IAAI,GAAG,KAAK,CAAA;AAC7D,QAAA,MAAM,WAAW,UAAA,CAAW,KAAA,CAAM,KAAK,MAAA,EAAQ,IAAI,GAAG,KAAK,CAAA;AAC3D,QAAA,MAAM,YAAY,UAAA,CAAW,IAAA,CAAK,KAAK,MAAA,EAAQ,KAAK,GAAG,KAAK,CAAA;AAC5D,QAAA,MAAM,YAAY,UAAA,CAAW,KAAA,CAAM,KAAK,MAAA,EAAQ,KAAK,GAAG,KAAK,CAAA;AAG7D,QAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,QAAA,EAAU,QAAQ,CAAA;AACpC,QAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,EAAW,SAAS,CAAA;AACtC,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,EAAO,KAAK,CAAA;AAC7B,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,EAAA,EAAI,IAAI,CAAA;AACzB,QAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,MAC1B;AAAA,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,SAAA,CAAU,gBAAgB,IAAA,EAAkB;AAC1C,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,IAAA,CAAK,MAAA,EAAQ,aAAa,CAAA;AACtD,IAAA,MAAM,YAAA,GAAe,eAAe,IAAA,CAAK,YAAA;AAEzC,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA;AAAA,MACA,IAAA,EAAM,YAAA,GAAe,CAAC,IAAI,IAAI,EAAC;AAAA,MAC/B,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,yDAAyD,CAAA;AAAA,QAClF;AAEA,QAAA,MAAM,KAAA,GAAQA,mBAAAA,CAAmB,SAAA,CAAU,KAAA,EAAO,WAAW,CAAA;AAC7D,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO;AAAA,UACrC,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,UACnB,MAAA,EAAQ,KAAK,MAAA,CAAO;AAAA,SACrB,CAAA;AACD,QAAA,MAAM,UAAU,UAAA,CAAW,OAAA,CAAQ,KAAK,MAAA,EAAQ,KAAK,GAAG,KAAK,CAAA;AAE7D,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,aAAA,EAAe,EAAE,OAAO,CAAA;AAC9C,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAA,EAAG,EAAE,OAAO,CAAA;AAChC,QAAA,MAAM,OAAA,GAAU,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AACjC,QAAA,MAAM,YAAY,GAAA,CAAI,OAAA,EAAS,GAAA,CAAI,OAAA,EAAS,MAAM,CAAC,CAAA;AACnD,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,EAAA,EAAI,SAAS,CAAA;AAC9B,QAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,MAC1B;AAAA,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,GAAA,CAAI,QAAQ,CAAA,EAAiB;AAC3B,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AACxC,IAAA,MAAM,YAAA,GAAe,eAAe,IAAA,CAAK,YAAA;AAEzC,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA;AAAA,MACA,IAAA,EAAM,YAAA,GAAe,CAAC,IAAI,IAAI,EAAC;AAAA,MAC/B,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,mDAAmD,CAAA;AAAA,QAC5E;AAGA,QAAA,MAAM,KAAA,GAAQA,mBAAAA,CAAmB,SAAA,CAAU,KAAA,EAAO,KAAK,CAAA;AACvD,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO;AAAA,UACrC,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,UACnB,MAAA,EAAQ,KAAK,MAAA,CAAO;AAAA,SACrB,CAAA;AACD,QAAA,MAAM,UAAU,UAAA,CAAW,OAAA,CAAQ,KAAK,MAAA,EAAQ,KAAK,GAAG,KAAK,CAAA;AAC7D,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAA,EAAG,EAAE,OAAO,CAAA;AAChC,QAAA,MAAM,OAAA,GAAU,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AACjC,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,EAAO,EAAE,OAAO,CAAA;AAEtC,QAAA,MAAM,QAAA,GAAW,GAAA,CAAI,SAAA,EAAW,MAAM,CAAA;AACtC,QAAA,MAAM,YAAY,GAAA,CAAI,OAAA,EAAS,GAAA,CAAI,OAAA,EAAS,QAAQ,CAAC,CAAA;AACrD,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,EAAA,EAAI,SAAS,CAAA;AAC9B,QAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,MAC1B;AAAA,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,IAAA,GAAmB;AACjB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAClC,IAAA,MAAM,YAAA,GAAe,eAAe,IAAA,CAAK,YAAA;AAEzC,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW;AAAA,MACzB,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA;AAAA,MACA,IAAA,EAAM,YAAA,GAAe,CAAC,IAAI,IAAI,EAAC;AAAA,MAC/B,UAAU,MAAM;AACd,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,KAAK,GAAA,CAAI,KAAA;AACf,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAI,aAAa,oDAAoD,CAAA;AAAA,QAC7E;AAMA,QAAA,MAAM,KAAA,GAAQA,mBAAAA,CAAmB,SAAA,CAAU,KAAA,EAAO,MAAM,CAAA;AACxD,QAAA,MAAM,UAAA,GAAa,cAAA,CAAe,IAAA,CAAK,MAAM,CAAA;AAC7C,QAAA,MAAM,SAAA,GAAY,IAAI,YAAA,CAAa,IAAA,CAAK,OAAO,IAAI,CAAA;AACnD,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,KAAK,EAAE,CAAA;AAC/B,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC1C,UAAA,MAAM,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAC3B,UAAA,MAAM,KAAA,GAAQ,CAAA,IAAK,CAAA,GAAI,QAAA,GAAW,IAAI,CAAA,GAAI,CAAA,CAAA;AAC1C,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAC/B,UAAA,MAAM,GAAA,GAAM,OAAO,CAAA,GAAI,OAAA,CAAA;AACvB,UAAA,MAAM,MAAM,CAAA,IAAK,CAAA,GAAI,WAAW,CAAA,GAAI,CAAA,CAAA,IAAM,IAAI,OAAA,GAAU,OAAA,CAAA;AACxD,UAAA,SAAA,CAAU,CAAC,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,GAAA,GAAM,GAAA;AAAA,QACjC;AACA,QAAA,MAAM,WAAA,GAAc,OAAY,cAAA,CAAe;AAAA,UAC7C,IAAA,EAAM,SAAA;AAAA,UACN,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,UACnB,KAAA,EAAO,SAAA;AAAA,UACP,MAAA,EAAQ,KAAK,MAAA,CAAO;AAAA,SACrB,CAAA;AACD,QAAA,MAAM,QAAQ,WAAA,CAAY,KAAA,KAAU,QAAQ,WAAA,GAAc,UAAA,CAAW,aAAa,KAAK,CAAA;AACvF,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA;AAC1B,QAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,MAC1B;AAAA,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,QAAA,CAAS,cAAc,CAAA,EAAW;AAChC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,WAAW,CAAA;AAC7C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,GAAe,qBAAA,GAAwB,EAAA;AAC7D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAG,CAAA;AAAA,EAC3C;AACF;AAKO,SAAS,SAAA,CACd,IAAA,EACA,OAAA,GAA6B,EAAC,EAClB;AACZ,EAAA,MAAM,CAAA,GACJ,IAAA,YAAgB,MAAA,GACZ,IAAA,GACA,MAAA,CAAO,IAAA,EAAM,OAAA,CAAQ,KAAA,GAAQ,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,KAAU,MAAS,CAAA;AACvE,EAAA,OAAO,UAAA,CAAW,WAAW,CAAA,EAAG,EAAE,GAAG,OAAA,EAAS,YAAA,EAAc,MAAM,CAAA;AACpE;AAWO,SAAS,OAAU,EAAA,EAAgB;AACxC,EAAA,MAAM,IAAA,GAAO,WAAA;AACb,EAAA,WAAA,GAAc,KAAA;AACd,EAAA,IAAI;AACF,IAAA,MAAM,SAAS,EAAA,EAAG;AAClB,IAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,MAAA,MAAM,IAAI,YAAA;AAAA,QACR;AAAA,OAGF;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,SAAE;AACA,IAAA,WAAA,GAAc,IAAA;AAAA,EAChB;AACF;AAKO,SAASjC,OAAAA,CACd,KAAA,EACA,UAAA,EACA,MAAA,EACA,OAAA,EACY;AACZ,EAAA,MAAM,YAAY,MAAA,CAAS,KAAA,CAAM,MAAA,EAAQ,UAAA,EAAY,QAAQ,OAAO,CAAA;AACpE,EAAA,MAAM,YAAA,GAAe,eAAe,KAAA,CAAM,YAAA;AAE1C,EAAA,IAAI,MAAA;AAEJ,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,IAAI,CAAC,YAAA,EAAc;AACnB,IAAA,MAAM,KAAK,MAAA,CAAO,IAAA;AAClB,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,MAAM,IAAI,aAAa,sDAAsD,CAAA;AAAA,IAC/E;AAEA,IAAA,MAAM,YAAY,MAAA,CAAO,EAAA,EAAI,MAAM,KAAA,EAAO,UAAA,EAAY,QAAQ,OAAO,CAAA;AACrE,IAAA,KAAA,CAAM,eAAe,SAAS,CAAA;AAAA,EAChC,CAAA;AAEA,EAAA,MAAA,GAAS,WAAW,MAAA,CAAO;AAAA,IACzB,MAAA,EAAQ,SAAA;AAAA,IACR,YAAA;AAAA,IACA,IAAA,EAAM,YAAA,GAAe,CAAC,KAAK,IAAI,EAAC;AAAA,IAChC;AAAA,GACD,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAEO,SAASE,QAAAA,CAAQ,KAAA,EAAmB,IAAA,GAAO,EAAA,EAAgB;AAEhE,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,MAAM,IAAI,CAAA;AAC3C,EAAA,MAAM,OAAO,UAAA,CAAW,UAAA,CAAW,QAAQ,EAAE,YAAA,EAAc,OAAO,CAAA;AAClE,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAC9B,EAAA,MAAM,IAAA,GAAO,QAAQ,GAAA,EAAI;AACzB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AAChC,EAAA,OAAO,IAAA,CAAK,IAAI,IAAI,CAAA;AACtB;AAEO,SAASD,WAAAA,CAAW,KAAA,EAAmB,IAAA,GAAO,EAAA,EAAgB;AACnE,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,MAAM,IAAI,CAAA;AAC3C,EAAA,MAAM,YACJ,MAAA,CAAO,KAAA,KAAU,KAAA,CAAM,KAAA,GACnB,SACA,MAAA,CAAO,oBAAA,CAAqB,MAAA,CAAO,OAAA,EAAS,CAAA,EAAG,EAAE,KAAA,EAAO,KAAA,CAAM,OAAO,CAAA;AAC3E,EAAA,MAAM,OAAO,UAAA,CAAW,UAAA,CAAW,WAAW,EAAE,YAAA,EAAc,OAAO,CAAA;AACrE,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAC9B,EAAA,MAAM,IAAA,GAAO,QAAQ,GAAA,EAAI;AACzB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AAChC,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,OAAO,OAAA,CAAQ,IAAI,SAAS,CAAA;AAC9B;AAEO,SAASE,SAAAA,CAAS,KAAA,EAAmB,IAAA,EAAe,UAAA,GAAa,CAAA,EAAe;AACrF,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA;AAClC,EAAA,MAAM,EAAA,GAAK,SAAS,MAAA,EAAO;AAC3B,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AAEhC,EAAA,IAAI,CAAA;AACJ,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,CAAA,GAAI,KAAA,CAAM,IAAA;AAAA,EACZ,CAAA,MAAO;AACL,IAAA,MAAM,EAAA,GAAK,IAAA,GAAO,CAAA,GAAI,KAAA,CAAM,OAAO,IAAA,GAAO,IAAA;AAC1C,IAAA,IAAI,EAAA,GAAK,CAAA,IAAK,EAAA,IAAM,KAAA,CAAM,IAAA,EAAM;AAC9B,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,CAAA,mCAAA,EAAsC,MAAM,IAAI,CAAA,CAAA,CAAA;AAAA,QAChD,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,EAAE,CAAA,IAAK,CAAA;AAAA,EACzB;AACA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,UAAU,CAAA;AACxC,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO;AAAA,IACtC,KAAA,EAAO8B,mBAAAA,CAAmB,KAAA,CAAM,KAAA,EAAO,UAAU;AAAA,GAClD,CAAA;AAED,EAAA,OAAO,KAAA,CAAM,IAAI,MAAM,CAAA;AACzB;AAEO,SAAS,OAAA,CAAQ,KAAA,EAAmB,CAAA,GAAI,GAAA,EAAK,WAAW,IAAA,EAAkB;AAC/E,EAAA,IAAI,CAAC,QAAA,IAAY,CAAA,KAAM,CAAA,EAAG,OAAO,KAAA;AAEjC,EAAA,MAAM,KAAA,GAAQA,mBAAAA,CAAmB,KAAA,CAAM,KAAA,EAAO,SAAS,CAAA;AACvD,EAAA,MAAM,KAAA,GAAQ,KAAK,CAAA,GAAI,CAAA,CAAA;AACvB,EAAA,MAAM,IAAA,GAAO,YAAY,KAAA,CAAM,KAAA,EAAO,GAAG,KAAA,EAAO,KAAA,EAAO,MAAM,MAAM,CAAA;AACnE,EAAA,MAAM,WAAW,UAAA,CAAW,UAAA,CAAW,MAAM,EAAE,YAAA,EAAc,OAAO,CAAA;AACpE,EAAA,OAAO,KAAA,CAAM,IAAI,QAAQ,CAAA;AAC3B;;;ACjxDA,SAAS,kBAAkB,CAAA,EAAuB;AAChD,EAAA,IAAI,EAAE,KAAA,KAAU,QAAA,IAAY,MAAM,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA,EAAG;AACjD,IAAA,MAAM,IAAI,WAAW,yDAAyD,CAAA;AAAA,EAChF;AACA,EAAA,OAAO,CAAA,CAAE,IAAA;AACX;AAEA,SAAS,QAAA,CAAS,MAAkB,MAAA,EAAyB;AAC3D,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,gBAAA,CAAiB,IAAA,EAAM,MAAM,CAAA,KAAM,EAAA;AAAA,EAC5C;AACA,EAAA,OAAO,iBAAA,CAAkB,IAAA,EAAM,MAAM,CAAA,KAAM,CAAA;AAC7C;AAoBO,SAAS,UAAA,CAAW,GAAW,CAAA,EAAmB;AACvD,EAAA,IAAI,CAAA,CAAE,KAAA,KAAU,QAAA,IAAY,CAAA,CAAE,UAAU,QAAA,EAAU;AAChD,IAAA,MAAM,IAAI,WAAW,yDAAyD,CAAA;AAAA,EAChF;AACA,EAAA,yBAAA,CAA0B,GAAG,CAAC,CAAA;AAE9B,EAAA,MAAM,QAAA,GAAkB,QAAA,CAAS,CAAC,CAAA,GAC9B,EAAE,KAAA,GACF,QAAA,CAAS,CAAC,CAAA,GACR,EAAE,KAAA,GACF,iBAAA,CAAkB,CAAA,CAAE,KAAA,EAAO,EAAE,KAAK,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,KAAK,CAAC,CAAA;AAE1D,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,OAAO,CAAA;AAClC,EAAA,MAAM,MAAA,GAAS,OAAO,cAAA,CAAe;AAAA,IACnC,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AAED,EAAA,MAAM,KAAA,GAAQ,kBAAkB,CAAC,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,kBAAkB,CAAC,CAAA;AAEjC,EAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,KAAA,EAAO,IAAI,CAAA;AAC/B,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,KAAA,EAAO,IAAI,CAAA;AAC/B,IAAA,GAAA,CAAI,MAAM,CAAA,GAAI,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,CAAA;AAAA,EAC/B,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAoBO,SAAS,SAAA,CAAU,GAAW,CAAA,EAAmB;AACtD,EAAA,IAAI,CAAA,CAAE,KAAA,KAAU,QAAA,IAAY,CAAA,CAAE,UAAU,QAAA,EAAU;AAChD,IAAA,MAAM,IAAI,WAAW,yDAAyD,CAAA;AAAA,EAChF;AAEA,EAAA,yBAAA,CAA0B,GAAG,CAAC,CAAA;AAG9B,EAAA,MAAM,QAAA,GAAkB,QAAA,CAAS,CAAC,CAAA,GAC9B,EAAE,KAAA,GACF,QAAA,CAAS,CAAC,CAAA,GACR,EAAE,KAAA,GACF,iBAAA,CAAkB,CAAA,CAAE,KAAA,EAAO,EAAE,KAAK,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,KAAK,CAAC,CAAA;AAG1D,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,OAAO,CAAA;AAClC,EAAA,MAAM,MAAA,GAAS,OAAO,cAAA,CAAe;AAAA,IACnC,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AAED,EAAA,MAAM,KAAA,GAAQ,kBAAkB,CAAC,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,kBAAkB,CAAC,CAAA;AAGjC,EAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,KAAA,EAAO,IAAI,CAAA;AAC/B,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,KAAA,EAAO,IAAI,CAAA;AAC/B,IAAA,GAAA,CAAI,MAAM,CAAA,GAAI,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,CAAA;AAAA,EAC/B,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAoBO,SAAS,UAAA,CAAW,GAAW,CAAA,EAAmB;AACvD,EAAA,IAAI,CAAA,CAAE,KAAA,KAAU,QAAA,IAAY,CAAA,CAAE,UAAU,QAAA,EAAU;AAChD,IAAA,MAAM,IAAI,WAAW,yDAAyD,CAAA;AAAA,EAChF;AACA,EAAA,yBAAA,CAA0B,GAAG,CAAC,CAAA;AAE9B,EAAA,MAAM,QAAA,GAAkB,QAAA,CAAS,CAAC,CAAA,GAC9B,EAAE,KAAA,GACF,QAAA,CAAS,CAAC,CAAA,GACR,EAAE,KAAA,GACF,iBAAA,CAAkB,CAAA,CAAE,KAAA,EAAO,EAAE,KAAK,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,KAAK,CAAC,CAAA;AAE1D,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,OAAO,CAAA;AAClC,EAAA,MAAM,MAAA,GAAS,OAAO,cAAA,CAAe;AAAA,IACnC,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AAED,EAAA,MAAM,KAAA,GAAQ,kBAAkB,CAAC,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,kBAAkB,CAAC,CAAA;AAGjC,EAAA,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACnD,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,KAAA,EAAO,IAAI,CAAA;AAC/B,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,KAAA,EAAO,IAAI,CAAA;AAC/B,IAAA,GAAA,CAAI,MAAM,IAAK,EAAA,IAAM,CAAC,MAAQ,CAAC,EAAA,IAAM,KAAM,CAAA,GAAI,CAAA;AAAA,EACjD,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAmBO,SAAS,WAAW,CAAA,EAAmB;AAC5C,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,gDAAgD,CAAA;AAAA,EACvE;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,CAAA,CAAE,IAAI,CAAA;AACjC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAClD,EAAA,MAAM,IAAA,GAAO,kBAAkB,CAAC,CAAA;AAGhC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAE/B,IAAA,MAAM,SAAA,GAAY,WAAW,CAAA,EAAG,CAAA,CAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAO,CAAA;AAC/E,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,QAAA,CAAS,IAAA,EAAM,SAAS,IAAI,CAAA,GAAI,CAAA;AAAA,EAC3C;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,MAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;;;AClLO,SAAS,WAAA,CAAY,OAAA,EAAmB,IAAA,GAAa,CAAA,EAAW;AAErE,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,MAAM,IAAI,qBAAA,CAAsB,0CAAA,EAA4C,SAAS,CAAA;AAAA,EACvF;AAGA,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,IAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,aAAa,4CAA4C,CAAA;AAC3E,IAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,MAAA,MAAM7B,QAAO,CAAA,CAAE,IAAA;AACf,MAAA,IAAI,CAAC,MAAM,OAAA,CAAQA,KAAI,GAAG,MAAM,IAAI,aAAa,uCAAuC,CAAA;AACxF,MAAA,OAAO,OAAO,eAAA,CAAgB;AAAA,QAC5B,IAAA,EAAM,CAAC,GAAGA,KAAI,CAAA;AAAA,QACd,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,QAAQ,CAAA,CAAE;AAAA,OACX,CAAA;AAAA,IACH;AACA,IAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,IAAA,IAAI,MAAM,OAAA,CAAQ,IAAI,GAAG,MAAM,IAAI,aAAa,sCAAsC,CAAA;AACtF,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAM,KAAK,KAAA,EAAM;AAAA,MACjB,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,EAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,aAAa,uCAAuC,CAAA;AAC1E,EAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,EAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AAGpB,EAAA,MAAM,EAAA,GAAK,aAAA,CAAc,IAAA,EAAM,IAAI,CAAA;AAGnC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,IAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,YAAA,CAAa,CAAA,4BAAA,EAA+B,CAAC,CAAA,aAAA,CAAe,CAAA;AAC9E,IAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AACnB,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,qCAAA,EAAwC,IAAI,CAAA,KAAA,EAAQ,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AAAA,IACnF;AACA,IAAA,IAAI,CAAA,CAAE,UAAU,KAAA,EAAO;AACrB,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,sCAAA,EAAyC,KAAK,CAAA,KAAA,EAAQ,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,IACtF;AAAA,EACF;AAGA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,IAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,YAAA,CAAa,CAAA,4BAAA,EAA+B,CAAC,CAAA,aAAA,CAAe,CAAA;AAC9E,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,IAAI,CAAA,KAAM,MAAM,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,EAAG;AAC7C,QAAA,MAAM,UAAA,CAAW,QAAA;AAAA,UACf,KAAA,CAAM,KAAA;AAAA,UACN,CAAA,CAAE,KAAA;AAAA,UACF,iDAAiD,IAAI,CAAA;AAAA,SACvD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,CAAC,GAAG,KAAA,CAAM,KAAK,CAAA;AAChC,EAAA,IAAI,cAAA,GAAiB,KAAA,CAAM,KAAA,CAAM,EAAE,CAAA,IAAK,CAAA;AACxC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,IAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,YAAA,CAAa,CAAA,4BAAA,EAA+B,CAAC,CAAA,aAAA,CAAe,CAAA;AAC9E,IAAA,cAAA,IAAkB,CAAA,CAAE,KAAA,CAAM,EAAE,CAAA,IAAK,CAAA;AAAA,EACnC;AACA,EAAA,QAAA,CAAS,EAAE,CAAA,GAAI,cAAA;AAGf,EAAA,MAAM,OAAA,GAAU,YAAY,QAAQ,CAAA;AACpC,EAAA,MAAM,WAAW,KAAA,KAAU,QAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,QAAA,GACZ,IAAI,KAAA,CAAc,OAAO,IACzB,KAAK,qBAAA,CAAsB,KAAK,CAAA,EAAG,OAAO,CAAA;AAG9C,EAAA,MAAM,UAAA,GAAa,eAAe,QAAQ,CAAA;AAG1C,EAAA,IAAI,eAAA,GAAkB,CAAA;AAGtB,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,UAAA;AAEJ,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,SAAA,GAAY,OAAA;AAAA,EACd,CAAA,MAAA,IAAW,mBAAmB,aAAA,EAAe;AAC3C,IAAA,SAAA,GAAY,OAAA;AAAA,EACd,CAAA,MAAO;AACL,IAAA,UAAA,GAAa,OAAA;AAAA,EACf;AAEA,EAAA,KAAA,MAAW4C,WAAU,OAAA,EAAS;AAC5B,IAAA,MAAM,CAAA,GAAIA,OAAAA;AACV,IAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,aAAa,iCAAiC,CAAA;AAChE,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,IAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAG9C,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,UAAA;AAEJ,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA,EAAG;AACzB,MAAA,SAAA,GAAY,CAAA,CAAE,IAAA;AAAA,IAChB,CAAA,MAAA,IAAW,EAAE,CAAA,CAAE,IAAA,YAAgB,aAAA,CAAA,EAAgB;AAC7C,MAAA,UAAA,GAAa,CAAA,CAAE,IAAA;AAAA,IACjB;AAGA,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,KAAA,EAAO,OAAA,EAAA,EAAW;AAEhD,MAAA,IAAI,GAAA,GAAM,OAAA;AACV,MAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAc,IAAI,CAAA;AACrC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,QAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,CAAC,CAAA,IAAK,CAAA;AACrC,QAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAM,MAAM,CAAA;AACnC,QAAA,GAAA,IAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA,IAAK,MAAA;AAAA,MAC5B;AAGA,MAAA,IAAI,YAAY,CAAA,CAAE,MAAA;AAClB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,QAAA,SAAA,IAAA,CAAc,OAAO,CAAC,CAAA,IAAK,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAA;AAAA,MACnD;AAGA,MAAA,MAAA,CAAO,EAAE,CAAA,GAAA,CAAK,MAAA,CAAO,EAAE,KAAK,CAAA,IAAK,eAAA;AAGjC,MAAA,IAAI,MAAA,GAAS,CAAA;AACb,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,QAAA,MAAA,IAAA,CAAW,OAAO,CAAC,CAAA,IAAK,CAAA,KAAM,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA,CAAA;AAAA,MACjD;AAGA,MAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,QAAA,SAAA,CAAU,MAAM,CAAA,GAAI,SAAA,CAAU,SAAS,CAAA,IAAK,EAAA;AAAA,MAC9C,CAAA,MAAA,IAAW,SAAA,IAAa,CAAA,CAAE,IAAA,YAAgB,aAAA,EAAe;AACvD,QAAA,SAAA,CAAU,MAAM,CAAA,GAAI,gBAAA,CAAiB,CAAA,CAAE,MAAM,SAAS,CAAA;AAAA,MACxD,CAAA,MAAA,IAAW,cAAc,UAAA,EAAY;AACnC,QAAA,UAAA,CAAW,MAAM,CAAA,GAAI,iBAAA,CAAkB,UAAA,EAAY,SAAS,CAAA;AAAA,MAC9D;AAAA,IACF;AAGA,IAAA,eAAA,IAAmB,CAAA,CAAE,KAAA,CAAM,EAAE,CAAA,IAAK,CAAA;AAAA,EACpC;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,OAAO,OAAO,eAAA,CAAgB;AAAA,MAC5B,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,QAAQ,KAAA,CAAM;AAAA,KACf,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,UAAU,QAAA,EAAU;AACtB,IAAA,MAAM,IAAI,aAAa,iDAAiD,CAAA;AAAA,EAC1E;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,KAAA;AAAA,IACA,QAAQ,KAAA,CAAM;AAAA,GACf,CAAA;AACH;AAwBO,SAAS,KAAA,CAAM,OAAA,EAAmB,IAAA,GAAa,CAAA,EAAW;AAE/D,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,MAAM,IAAI,qBAAA,CAAsB,oCAAA,EAAsC,SAAS,CAAA;AAAA,EACjF;AAEA,EAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,aAAa,uCAAuC,CAAA;AAAA,EAChE;AACA,EAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,EAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AAIpB,EAAA,MAAM,EAAA,GAAK,aAAA,CAAc,IAAA,EAAM,IAAA,GAAO,CAAC,CAAA;AAGvC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,IAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,YAAA,CAAa,CAAA,4BAAA,EAA+B,CAAC,CAAA,aAAA,CAAe,CAAA;AAC9E,IAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AACnB,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,qCAAA,EAAwC,IAAI,CAAA,KAAA,EAAQ,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AAAA,IACnF;AACA,IAAA,IAAI,CAAA,CAAE,UAAU,KAAA,EAAO;AACrB,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,sCAAA,EAAyC,KAAK,CAAA,KAAA,EAAQ,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,IACtF;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,IAAI,MAAM,KAAA,CAAM,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,EAAG;AACjC,QAAA,MAAM,WAAW,QAAA,CAAS,KAAA,CAAM,KAAA,EAAO,CAAA,CAAE,OAAO,yCAAyC,CAAA;AAAA,MAC3F;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,IAAA,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,CAAC,KAAK,CAAC,CAAA;AAAA,EACnC;AACA,EAAA,QAAA,CAAS,IAAA,CAAK,QAAQ,MAAM,CAAA;AAC5B,EAAA,KAAA,IAAS,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC9B,IAAA,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,CAAC,KAAK,CAAC,CAAA;AAAA,EACnC;AAGA,EAAA,MAAM,OAAA,GAAU,YAAY,QAAQ,CAAA;AACpC,EAAA,MAAM,WAAW,KAAA,KAAU,QAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,QAAA,GACZ,IAAI,KAAA,CAAc,OAAO,IACzB,KAAK,qBAAA,CAAsB,KAAK,CAAA,EAAG,OAAO,CAAA;AAG9C,EAAA,MAAM,UAAA,GAAa,eAAe,QAAQ,CAAA;AAC1C,EAAA,MAAM,WAAW,KAAA,CAAM,IAAA;AAGvB,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,UAAA;AAEJ,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,SAAA,GAAY,OAAA;AAAA,EACd,CAAA,MAAA,IAAW,mBAAmB,aAAA,EAAe;AAC3C,IAAA,SAAA,GAAY,OAAA;AAAA,EACd,CAAA,MAAO;AACL,IAAA,UAAA,GAAa,OAAA;AAAA,EACf;AAGA,EAAA,KAAA,IAAS,SAAA,GAAY,CAAA,EAAG,SAAA,GAAY,OAAA,CAAQ,QAAQ,SAAA,EAAA,EAAa;AAC/D,IAAA,MAAM,CAAA,GAAI,QAAQ,SAAS,CAAA;AAC3B,IAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,YAAA,CAAa,CAAA,4BAAA,EAA+B,SAAS,CAAA,aAAA,CAAe,CAAA;AAEtF,IAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAE9C,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA,EAAG;AACzB,MAAA,SAAA,GAAY,CAAA,CAAE,IAAA;AAAA,IAChB,CAAA,MAAA,IAAW,EAAE,CAAA,CAAE,IAAA,YAAgB,aAAA,CAAA,EAAgB;AAC7C,MAAA,UAAA,GAAa,CAAA,CAAE,IAAA;AAAA,IACjB;AAGA,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,QAAA,EAAU,OAAA,EAAA,EAAW;AAEnD,MAAA,IAAI,GAAA,GAAM,OAAA;AACV,MAAA,MAAM,SAAA,GAAY,IAAI,KAAA,CAAc,IAAI,CAAA;AACxC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,QAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,CAAC,CAAA,IAAK,CAAA;AACrC,QAAA,SAAA,CAAU,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAM,MAAM,CAAA;AACtC,QAAA,GAAA,IAAA,CAAQ,SAAA,CAAU,CAAC,CAAA,IAAK,CAAA,IAAK,MAAA;AAAA,MAC/B;AAGA,MAAA,IAAI,YAAY,CAAA,CAAE,MAAA;AAClB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,QAAA,SAAA,IAAA,CAAc,UAAU,CAAC,CAAA,IAAK,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAA;AAAA,MACtD;AAGA,MAAA,IAAI,MAAA,GAAS,CAAA;AACb,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,QAAA,MAAA,IAAA,CAAW,UAAU,CAAC,CAAA,IAAK,CAAA,KAAM,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA,CAAA;AAAA,MACpD;AACA,MAAA,MAAA,IAAU,SAAA,IAAa,UAAA,CAAW,EAAE,CAAA,IAAK,CAAA,CAAA;AACzC,MAAA,KAAA,IAAS,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC9B,QAAA,MAAA,IAAA,CAAW,UAAU,CAAC,CAAA,IAAK,MAAM,UAAA,CAAW,CAAA,GAAI,CAAC,CAAA,IAAK,CAAA,CAAA;AAAA,MACxD;AAGA,MAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,QAAA,SAAA,CAAU,MAAM,CAAA,GAAI,SAAA,CAAU,SAAS,CAAA,IAAK,EAAA;AAAA,MAC9C,CAAA,MAAA,IAAW,SAAA,IAAa,CAAA,CAAE,IAAA,YAAgB,aAAA,EAAe;AACvD,QAAA,SAAA,CAAU,MAAM,CAAA,GAAI,gBAAA,CAAiB,CAAA,CAAE,MAAM,SAAS,CAAA;AAAA,MACxD,CAAA,MAAA,IAAW,cAAc,UAAA,EAAY;AACnC,QAAA,UAAA,CAAW,MAAM,CAAA,GAAI,iBAAA,CAAkB,UAAA,EAAY,SAAS,CAAA;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,OAAO,OAAO,eAAA,CAAgB;AAAA,MAC5B,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,QAAQ,KAAA,CAAM;AAAA,KACf,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,UAAU,QAAA,EAAU;AACtB,IAAA,MAAM,IAAI,aAAa,iDAAiD,CAAA;AAAA,EAC1E;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,KAAA;AAAA,IACA,QAAQ,KAAA,CAAM;AAAA,GACf,CAAA;AACH;AAyBO,SAAS,KAAA,CAAM,CAAA,EAAW,mBAAA,EAAwC,IAAA,GAAa,CAAA,EAAa;AAEjG,EAAA,MAAM,EAAA,GAAK,aAAA,CAAc,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AAErC,EAAA,MAAM,QAAA,GAAW,CAAA,CAAE,KAAA,CAAM,EAAE,CAAA,IAAK,CAAA;AAGhC,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,OAAO,wBAAwB,QAAA,EAAU;AAE3C,IAAA,MAAM,WAAA,GAAc,mBAAA;AACpB,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,WAAW,CAAA,IAAK,eAAe,CAAA,EAAG;AACtD,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,4DAA4D,WAAW,CAAA,CAAA;AAAA,QACvE,qBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,QAAA,GAAW,gBAAgB,CAAA,EAAG;AAChC,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,CAAA,eAAA,EAAkB,QAAQ,CAAA,kBAAA,EAAqB,WAAW,CAAA,eAAA,CAAA;AAAA,QAC1D,qBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,cAAc,QAAA,GAAW,WAAA;AAC/B,IAAA,WAAA,GAAc,EAAC;AACf,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,EAAa,CAAA,EAAA,EAAK;AACpC,MAAA,WAAA,CAAY,IAAA,CAAK,IAAI,WAAW,CAAA;AAAA,IAClC;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,WAAA,GAAc,CAAC,GAAG,mBAAmB,CAAA;AACrC,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AAC3C,MAAA,MAAM,GAAA,GAAM,YAAY,CAAC,CAAA;AACzB,MAAA,IAAI,QAAQ,MAAA,IAAa,CAAC,MAAA,CAAO,SAAA,CAAU,GAAG,CAAA,EAAG;AAC/C,QAAA,MAAM,IAAI,qBAAA;AAAA,UACR,CAAA,yCAAA,EAA4C,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAAA,UACvD,qBAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,GAAA,GAAM,CAAA,IAAK,GAAA,GAAM,QAAA,EAAU;AAC7B,QAAA,MAAM,IAAI,qBAAA;AAAA,UACR,CAAA,YAAA,EAAe,GAAG,CAAA,gCAAA,EAAmC,QAAQ,CAAA,CAAA;AAAA,UAC7D,qBAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,CAAA,GAAI,CAAA,IAAK,GAAA,GAAM,IAAA,EAAM;AACvB,QAAA,MAAM,IAAI,qBAAA;AAAA,UACR,sCAAA;AAAA,UACA,qBAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAA,GAAO,GAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,EAAG,GAAG,aAAa,QAAQ,CAAA;AAG/C,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA,EAAG;AACzB,IAAA,SAAA,GAAY,CAAA,CAAE,IAAA;AAAA,EAChB,CAAA,MAAA,IAAW,EAAE,CAAA,CAAE,IAAA,YAAgB,aAAA,CAAA,EAAgB;AAC7C,IAAA,UAAA,GAAa,CAAA,CAAE,IAAA;AAAA,EACjB;AAGA,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC9C,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAC/B,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,CAAA,GAAI,CAAC,CAAA,IAAK,QAAA;AACjC,IAAA,MAAM,OAAO,GAAA,GAAM,KAAA;AAGnB,IAAA,MAAM,QAAA,GAAW,CAAC,GAAG,CAAA,CAAE,KAAK,CAAA;AAC5B,IAAA,QAAA,CAAS,EAAE,CAAA,GAAI,IAAA;AAGf,IAAA,MAAM,OAAA,GAAU,YAAY,QAAQ,CAAA;AACpC,IAAA,MAAM,QAAA,GAAW,EAAE,KAAA,KAAU,QAAA;AAC7B,IAAA,MAAM,OAAA,GAAU,QAAA,GACZ,IAAI,KAAA,CAAc,OAAO,CAAA,GACzB,KAAK,qBAAA,CAAsB,CAAA,CAAE,KAAK,CAAA,EAAG,OAAO,CAAA;AAGhD,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,UAAA;AAEJ,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,MAAA,SAAA,GAAY,OAAA;AAAA,IACd,CAAA,MAAA,IAAW,mBAAmB,aAAA,EAAe;AAC3C,MAAA,SAAA,GAAY,OAAA;AAAA,IACd,CAAA,MAAO;AACL,MAAA,UAAA,GAAa,OAAA;AAAA,IACf;AAGA,IAAA,MAAM,UAAA,GAAa,eAAe,QAAQ,CAAA;AAE1C,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,OAAA,EAAS,OAAA,EAAA,EAAW;AAElD,MAAA,IAAI,GAAA,GAAM,OAAA;AACV,MAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AACvC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,MAAA,GAAS,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAChC,QAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAM,MAAM,CAAA;AACnC,QAAA,GAAA,IAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA,IAAK,MAAA;AAAA,MAC5B;AAGA,MAAA,MAAA,CAAO,EAAE,CAAA,GAAA,CAAK,MAAA,CAAO,EAAE,KAAK,CAAA,IAAK,KAAA;AAGjC,MAAA,IAAI,SAAS,CAAA,CAAE,MAAA;AACf,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAA,IAAA,CAAW,OAAO,CAAC,CAAA,IAAK,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAA;AAAA,MAChD;AAGA,MAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,QAAA,SAAA,CAAU,OAAO,CAAA,GAAI,SAAA,CAAU,MAAM,CAAA,IAAK,EAAA;AAAA,MAC5C,CAAA,MAAA,IAAW,SAAA,IAAa,CAAA,CAAE,IAAA,YAAgB,aAAA,EAAe;AACvD,QAAA,SAAA,CAAU,OAAO,CAAA,GAAI,gBAAA,CAAiB,CAAA,CAAE,MAAM,MAAM,CAAA;AAAA,MACtD,CAAA,MAAA,IAAW,cAAc,UAAA,EAAY;AACnC,QAAA,UAAA,CAAW,OAAO,CAAA,GAAI,iBAAA,CAAkB,UAAA,EAAY,MAAM,CAAA;AAAA,MAC5D;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,OAAO,eAAA,CAAgB;AAAA,UACrB,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO,QAAA;AAAA,UACP,QAAQ,CAAA,CAAE;AAAA,SACX;AAAA,OACH;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,QAAA,MAAM,IAAI,aAAa,iDAAiD,CAAA;AAAA,MAC1E;AACA,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,OAAO,cAAA,CAAe;AAAA,UACpB,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO,QAAA;AAAA,UACP,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,QAAQ,CAAA,CAAE;AAAA,SACX;AAAA,OACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AA0BO,SAAS,IAAA,CAAK,GAAW,IAAA,EAAwB;AAEtD,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,MAAM,IAAI,qBAAA,CAAsB,qCAAA,EAAuC,MAAM,CAAA;AAAA,EAC/E;AACA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,GAAA,KAAQ,UAAa,CAAC,MAAA,CAAO,UAAU,GAAG,CAAA,IAAK,MAAM,CAAA,EAAG;AAC1D,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,CAAA,KAAA,EAAQ,CAAC,CAAA,2CAAA,EAA8C,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAAA,QAClE,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,IAAA,EAAM,KAAK,MAAM,CAAA;AACzC,EAAA,MAAM,UAAU,IAAI,KAAA,CAAc,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAC9C,EAAA,MAAM,YAAY,IAAI,KAAA,CAAc,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAGhD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,IAAA,OAAA,CAAQ,IAAA,GAAO,EAAE,IAAA,GAAO,CAAC,IAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAAA,EAC7C;AACA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,SAAA,CAAU,OAAO,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA;AAAA,EACjD;AAGA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,CAAA,IAAK,SAAA,CAAU,CAAC,CAAA,IAAK,CAAA,CAAE,CAAA;AAG9D,EAAA,MAAM,OAAA,GAAU,YAAY,QAAQ,CAAA;AACpC,EAAA,MAAM,OAAA,GACJ,CAAA,CAAE,KAAA,KAAU,QAAA,GACR,IAAI,KAAA,CAAc,OAAO,CAAA,GACzB,KAAK,qBAAA,CAAsB,CAAA,CAAE,KAAK,GAAG,OAAO,CAAA;AAGlD,EAAA,MAAM,UAAA,GAAa,eAAe,QAAQ,CAAA;AAG1C,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,UAAA;AAEJ,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,SAAA,GAAY,OAAA;AAAA,EACd,CAAA,MAAA,IAAW,mBAAmB,aAAA,EAAe;AAC3C,IAAA,SAAA,GAAY,OAAA;AAAA,EACd,CAAA,MAAO;AACL,IAAA,UAAA,GAAa,OAAA;AAAA,EACf;AAEA,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA,EAAG;AACzB,IAAA,SAAA,GAAY,CAAA,CAAE,IAAA;AAAA,EAChB,CAAA,MAAA,IAAW,EAAE,CAAA,CAAE,IAAA,YAAgB,aAAA,CAAA,EAAgB;AAC7C,IAAA,UAAA,GAAa,CAAA,CAAE,IAAA;AAAA,EACjB;AAGA,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,OAAA,EAAS,OAAA,EAAA,EAAW;AAElD,IAAA,IAAI,GAAA,GAAM,OAAA;AACV,IAAA,MAAM,SAAA,GAAY,IAAI,KAAA,CAAc,IAAI,CAAA;AACxC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAChC,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAM,MAAM,CAAA;AACtC,MAAA,GAAA,IAAA,CAAQ,SAAA,CAAU,CAAC,CAAA,IAAK,CAAA,IAAK,MAAA;AAAA,IAC/B;AAGA,IAAA,MAAM,QAAA,GAAW,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,CAAA,IAAK,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAE,CAAA;AAG9D,IAAA,IAAI,SAAS,CAAA,CAAE,MAAA;AACf,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,UAAU,QAAA,CAAS,IAAA,GAAO,CAAA,CAAE,IAAA,GAAO,CAAC,CAAA,IAAK,CAAA;AAC/C,MAAA,MAAA,IAAU,OAAA,IAAW,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAA;AAAA,IACvC;AAGA,IAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,MAAA,SAAA,CAAU,OAAO,CAAA,GAAI,SAAA,CAAU,MAAM,CAAA,IAAK,EAAA;AAAA,IAC5C,CAAA,MAAA,IAAW,SAAA,IAAa,CAAA,CAAE,IAAA,YAAgB,aAAA,EAAe;AACvD,MAAA,SAAA,CAAU,OAAO,CAAA,GAAI,gBAAA,CAAiB,CAAA,CAAE,MAAM,MAAM,CAAA;AAAA,IACtD,CAAA,MAAA,IAAW,cAAc,UAAA,EAAY;AACnC,MAAA,UAAA,CAAW,OAAO,CAAA,GAAI,iBAAA,CAAkB,UAAA,EAAY,MAAM,CAAA;AAAA,IAC5D;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,OAAO,OAAO,eAAA,CAAgB;AAAA,MAC5B,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,aAAa,iDAAiD,CAAA;AAAA,EAC1E;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAsBO,SAAS,MAAA,CAAO,CAAA,EAAW,OAAA,EAAiB,IAAA,EAAqB;AACtE,EAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,OAAO,CAAA,IAAK,UAAU,CAAA,EAAG;AAC7C,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,oDAAoD,OAAO,CAAA,CAAA;AAAA,MAC3D,SAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,MAAM,QAAA,GAAW,EAAE,IAAA,GAAO,OAAA;AAC1B,IAAA,MAAMnB,QAAAA,GACJ,CAAA,CAAE,KAAA,KAAU,QAAA,GACR,IAAI,KAAA,CAAc,QAAQ,CAAA,GAC1B,KAAK,qBAAA,CAAsB,CAAA,CAAE,KAAK,GAAG,QAAQ,CAAA;AAGnD,IAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAC7C,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAA,EAAO,EAAE,OAAO,CAAA;AAClD,IAAA,IAAI,MAAA,GAAS,CAAA;AAGb,IAAA,IAAIoB,UAAAA;AACJ,IAAA,IAAIC,UAAAA;AACJ,IAAA,IAAIC,WAAAA;AAEJ,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQtB,QAAO,CAAA,EAAG;AAC1B,MAAAoB,UAAAA,GAAYpB,QAAAA;AAAA,IACd,CAAA,MAAA,IAAWA,oBAAmB,aAAA,EAAe;AAC3C,MAAAqB,UAAAA,GAAYrB,QAAAA;AAAA,IACd,CAAA,MAAO;AACL,MAAAsB,WAAAA,GAAatB,QAAAA;AAAA,IACf;AAEA,IAAA,IAAIuB,UAAAA;AACJ,IAAA,IAAIC,WAAAA;AACJ,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA,EAAG;AACzB,MAAAD,aAAY,CAAA,CAAE,IAAA;AAAA,IAChB,CAAA,MAAA,IAAW,EAAE,CAAA,CAAE,IAAA,YAAgB,aAAA,CAAA,EAAgB;AAC7C,MAAAC,cAAa,CAAA,CAAE,IAAA;AAAA,IACjB;AAEA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,MAAA,GAAS,UAAA,GACX,CAAA,CAAE,MAAA,GAAS,CAAA,GACX,mBAAA,CAAoB,CAAA,EAAG,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC9D,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,QAAA,IAAIJ,cAAaG,UAAAA,EAAW;AAC1B,UAAAH,UAAAA,CAAU,MAAA,EAAQ,CAAA,GAAIG,UAAAA,CAAU,MAAM,CAAA,IAAK,EAAA;AAAA,QAC7C,CAAA,MAAA,IAAWF,UAAAA,IAAa,CAAA,CAAE,IAAA,YAAgB,aAAA,EAAe;AACvD,UAAAA,WAAU,MAAA,EAAQ,CAAA,GAAI,gBAAA,CAAiB,CAAA,CAAE,MAAM,MAAM,CAAA;AAAA,QACvD,CAAA,MAAA,IAAWC,eAAcE,WAAAA,EAAY;AACnC,UAAAF,WAAAA,CAAW,MAAA,EAAQ,CAAA,GAAI,iBAAA,CAAkBE,aAAY,MAAM,CAAA;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQxB,QAAO,CAAA,EAAG;AAC1B,MAAA,OAAO,OAAO,eAAA,CAAgB;AAAA,QAC5B,IAAA,EAAMA,QAAAA;AAAA,QACN,KAAA,EAAO,CAAC,QAAQ,CAAA;AAAA,QAChB,QAAQ,CAAA,CAAE;AAAA,OACX,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,MAAA,MAAM,IAAI,aAAa,iDAAiD,CAAA;AAAA,IAC1E;AAEA,IAAA,OAAO,OAAO,cAAA,CAAe;AAAA,MAC3B,IAAA,EAAMA,QAAAA;AAAA,MACN,KAAA,EAAO,CAAC,QAAQ,CAAA;AAAA,MAChB,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,EAAA,GAAK,aAAA,CAAc,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AAGrC,EAAA,MAAM,QAAA,GAAW,CAAC,GAAG,CAAA,CAAE,KAAK,CAAA;AAC5B,EAAA,QAAA,CAAS,EAAE,CAAA,GAAA,CAAK,CAAA,CAAE,KAAA,CAAM,EAAE,KAAK,CAAA,IAAK,OAAA;AAGpC,EAAA,MAAM,OAAA,GAAU,YAAY,QAAQ,CAAA;AACpC,EAAA,MAAM,OAAA,GACJ,CAAA,CAAE,KAAA,KAAU,QAAA,GACR,IAAI,KAAA,CAAc,OAAO,CAAA,GACzB,KAAK,qBAAA,CAAsB,CAAA,CAAE,KAAK,GAAG,OAAO,CAAA;AAGlD,EAAA,MAAM,UAAA,GAAa,eAAe,QAAQ,CAAA;AAG1C,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,UAAA;AAEJ,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,SAAA,GAAY,OAAA;AAAA,EACd,CAAA,MAAA,IAAW,mBAAmB,aAAA,EAAe;AAC3C,IAAA,SAAA,GAAY,OAAA;AAAA,EACd,CAAA,MAAO;AACL,IAAA,UAAA,GAAa,OAAA;AAAA,EACf;AAEA,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA,EAAG;AACzB,IAAA,SAAA,GAAY,CAAA,CAAE,IAAA;AAAA,EAChB,CAAA,MAAA,IAAW,EAAE,CAAA,CAAE,IAAA,YAAgB,aAAA,CAAA,EAAgB;AAC7C,IAAA,UAAA,GAAa,CAAA,CAAE,IAAA;AAAA,EACjB;AAGA,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,OAAA,EAAS,OAAA,EAAA,EAAW;AAElD,IAAA,IAAI,GAAA,GAAM,OAAA;AACV,IAAA,MAAM,SAAA,GAAY,IAAI,KAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AAC1C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAChC,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAM,MAAM,CAAA;AACtC,MAAA,GAAA,IAAA,CAAQ,SAAA,CAAU,CAAC,CAAA,IAAK,CAAA,IAAK,MAAA;AAAA,IAC/B;AAGA,IAAA,MAAM,QAAA,GAAW,CAAC,GAAG,SAAS,CAAA;AAC9B,IAAA,QAAA,CAAS,EAAE,IAAI,IAAA,CAAK,KAAA,CAAA,CAAO,UAAU,EAAE,CAAA,IAAK,KAAK,OAAO,CAAA;AAGxD,IAAA,IAAI,SAAS,CAAA,CAAE,MAAA;AACf,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAA,IAAA,CAAW,SAAS,CAAC,CAAA,IAAK,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAA;AAAA,IAClD;AAGA,IAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,MAAA,SAAA,CAAU,OAAO,CAAA,GAAI,SAAA,CAAU,MAAM,CAAA,IAAK,EAAA;AAAA,IAC5C,CAAA,MAAA,IAAW,SAAA,IAAa,CAAA,CAAE,IAAA,YAAgB,aAAA,EAAe;AACvD,MAAA,SAAA,CAAU,OAAO,CAAA,GAAI,gBAAA,CAAiB,CAAA,CAAE,MAAM,MAAM,CAAA;AAAA,IACtD,CAAA,MAAA,IAAW,cAAc,UAAA,EAAY;AACnC,MAAA,UAAA,CAAW,OAAO,CAAA,GAAI,iBAAA,CAAkB,UAAA,EAAY,MAAM,CAAA;AAAA,IAC5D;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,OAAO,OAAO,eAAA,CAAgB;AAAA,MAC5B,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,aAAa,iDAAiD,CAAA;AAAA,EAC1E;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;;;ACr3BA,SAAS,cAAA,CAAe,KAAA,EAAiB,OAAA,EAA4B,MAAA,EAAwB;AAC3F,EAAA,IAAI,GAAA,GAAM,MAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,GAAA,IAAA,CAAQ,MAAM,CAAC,CAAA,IAAK,CAAA,KAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,GAAA;AACT;AAOA,UAAU,WAAA,CAAY,OAA0B,IAAA,EAAmC;AACjF,EAAA,MAAM,OAAO,KAAA,CAAM,MAAA;AACnB,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,MAAM,EAAC;AACP,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,IAAI,CAAA,KAAM,IAAA,EAAM,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA;AAAA,EAClC;AAEA,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA,CAAA,EAAI,CAAC,CAAA;AAC/D,EAAA,MAAM,QAAQ,IAAI,KAAA,CAAc,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAE5C,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,KAAA,EAAO,IAAA,EAAA,EAAQ;AAEvC,IAAA,IAAI,GAAA,GAAM,IAAA;AACV,IAAA,KAAA,IAAS,IAAI,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC9C,MAAA,MAAM,CAAA,GAAI,SAAA,CAAU,CAAC,CAAA,IAAK,CAAA;AAC1B,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AACxB,MAAA,KAAA,CAAM,CAAC,IAAI,GAAA,GAAM,GAAA;AACjB,MAAA,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,GAAG,CAAA;AAAA,IAC5B;AACA,IAAA,KAAA,CAAM,IAAI,CAAA,GAAI,CAAA;AACd,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAUO,SAAS,IAAA,CAAK,CAAA,EAAW,IAAA,GAAyB,EAAA,EAAI,aAAa,KAAA,EAAe;AACvF,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,0CAA0C,CAAA;AAAA,EACjE;AAEA,EAAA,MAAM,EAAA,GAAK,aAAA,CAAc,IAAA,IAAQ,EAAA,EAAI,EAAE,IAAI,CAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,CAAA,CAAE,KAAA,CAAM,EAAE,CAAA,IAAK,CAAA;AAC/B,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAE7C,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,CAAA,CAAE,KAAK,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA;AAE3B,EAAA,IAAI,CAAA,CAAE,gBAAgB,aAAA,EAAe;AACnC,IAAA,MAAM,aAAa,CAAA,CAAE,IAAA;AACrB,IAAA,MAAMyB,MAAAA,GAAQ,IAAI,KAAA,CAAc,OAAO,CAAA;AAEvC,IAAA,KAAA,MAAW,SAAA,IAAa,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,EAAE,CAAA,EAAG;AAEhD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,QAAA,SAAA,CAAU,EAAE,CAAA,GAAI,CAAA;AAChB,QAAA,MAAM,MAAM,cAAA,CAAe,SAAA,EAAW,CAAA,CAAE,OAAA,EAAS,EAAE,MAAM,CAAA;AACzD,QAAAA,MAAAA,CAAM,CAAC,CAAA,GAAI,gBAAA,CAAiB,YAAY,GAAG,CAAA;AAAA,MAC7C;AACA,MAAAA,MAAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAE,CAAA;AACjD,MAAA,IAAI,UAAA,EAAYA,MAAAA,CAAM,OAAA,EAAQ;AAG9B,MAAA,IAAI,EAAE,eAAe,aAAA,CAAA,EAAgB;AACrC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,QAAA,SAAA,CAAU,EAAE,CAAA,GAAI,CAAA;AAChB,QAAA,MAAM,OAAA,GAAU,aAAA,CAAc,SAAA,EAAW,cAAc,CAAA;AACvD,QAAA,GAAA,CAAI,OAAO,CAAA,GAAIA,MAAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAAA,MAC7B;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,cAAc,CAAA,CAAE,IAAA;AACtB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAI,WAAW,0CAA0C,CAAA;AAAA,IACjE;AACA,IAAA,MAAMA,MAAAA,GAAQ,IAAI,KAAA,CAAc,OAAO,CAAA;AAEvC,IAAA,KAAA,MAAW,SAAA,IAAa,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,EAAE,CAAA,EAAG;AAChD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,QAAA,SAAA,CAAU,EAAE,CAAA,GAAI,CAAA;AAChB,QAAA,MAAM,MAAM,cAAA,CAAe,SAAA,EAAW,CAAA,CAAE,OAAA,EAAS,EAAE,MAAM,CAAA;AACzD,QAAAA,MAAAA,CAAM,CAAC,CAAA,GAAI,iBAAA,CAAkB,aAAa,GAAG,CAAA;AAAA,MAC/C;AACA,MAAAA,OAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAC1B,MAAA,IAAI,UAAA,EAAYA,MAAAA,CAAM,OAAA,EAAQ;AAE9B,MAAA,IAAI,eAAe,aAAA,EAAe;AAClC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,QAAA,SAAA,CAAU,EAAE,CAAA,GAAI,CAAA;AAChB,QAAA,MAAM,OAAA,GAAU,aAAA,CAAc,SAAA,EAAW,cAAc,CAAA;AACvD,QAAA,GAAA,CAAI,OAAO,CAAA,GAAIA,MAAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAUO,SAAS,OAAA,CAAQ,CAAA,EAAW,IAAA,GAAyB,EAAA,EAAI,aAAa,KAAA,EAAe;AAC1F,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,WAAW,6CAA6C,CAAA;AAAA,EACpE;AAEA,EAAA,MAAM,EAAA,GAAK,aAAA,CAAc,IAAA,IAAQ,EAAA,EAAI,EAAE,IAAI,CAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,CAAA,CAAE,KAAA,CAAM,EAAE,CAAA,IAAK,CAAA;AAC/B,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AAE7C,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,CAAA,CAAE,IAAI,CAAA;AACjC,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,SAAQ,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,CAAA;AAE1D,EAAA,IAAI,CAAA,CAAE,gBAAgB,aAAA,EAAe;AACnC,IAAA,MAAM,aAAa,CAAA,CAAE,IAAA;AACrB,IAAA,MAAM,IAAA,GAAO,IAAI,KAAA,CAAc,OAAO,CAAA;AAEtC,IAAA,KAAA,MAAW,SAAA,IAAa,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,EAAE,CAAA,EAAG;AAChD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,QAAA,SAAA,CAAU,EAAE,CAAA,GAAI,CAAA;AAChB,QAAA,MAAM,MAAM,cAAA,CAAe,SAAA,EAAW,CAAA,CAAE,OAAA,EAAS,EAAE,MAAM,CAAA;AACzD,QAAA,IAAA,CAAK,CAAC,CAAA,GAAI,gBAAA,CAAiB,UAAA,EAAY,GAAG,CAAA;AAAA,MAC5C;AAEA,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,SAAS,CAAA,EAAA,EAAK,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA;AAC9C,MAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACpB,QAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA,IAAK,IACpB,EAAA,GAAK,IAAA,CAAK,CAAC,CAAA,IAAK,EAAA;AAClB,QAAA,OAAO,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,KAAK,CAAA,GAAI,CAAA;AAAA,MACtC,CAAC,CAAA;AACD,MAAA,IAAI,UAAA,SAAmB,OAAA,EAAQ;AAE/B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,QAAA,SAAA,CAAU,EAAE,CAAA,GAAI,CAAA;AAChB,QAAA,MAAM,OAAA,GAAU,aAAA,CAAc,SAAA,EAAW,cAAc,CAAA;AACvD,QAAA,GAAA,CAAI,OAAO,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA;AAAA,MAC9B;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,cAAc,CAAA,CAAE,IAAA;AACtB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAI,WAAW,6CAA6C,CAAA;AAAA,IACpE;AACA,IAAA,MAAM,IAAA,GAAO,IAAI,KAAA,CAAc,OAAO,CAAA;AAEtC,IAAA,KAAA,MAAW,SAAA,IAAa,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,EAAE,CAAA,EAAG;AAChD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,QAAA,SAAA,CAAU,EAAE,CAAA,GAAI,CAAA;AAChB,QAAA,MAAM,MAAM,cAAA,CAAe,SAAA,EAAW,CAAA,CAAE,OAAA,EAAS,EAAE,MAAM,CAAA;AACzD,QAAA,IAAA,CAAK,CAAC,CAAA,GAAI,iBAAA,CAAkB,WAAA,EAAa,GAAG,CAAA;AAAA,MAC9C;AACA,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,SAAS,CAAA,EAAA,EAAK,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA;AAC9C,MAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA,KAAM,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA,CAAE,CAAA;AACrD,MAAA,IAAI,UAAA,SAAmB,OAAA,EAAQ;AAE/B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,QAAA,SAAA,CAAU,EAAE,CAAA,GAAI,CAAA;AAChB,QAAA,MAAM,OAAA,GAAU,aAAA,CAAc,SAAA,EAAW,cAAc,CAAA;AACvD,QAAA,GAAA,CAAI,OAAO,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,IAAA,EAAM,GAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAA,EAAO,OAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACX,CAAA;AACH;AAGA,SAAS,aAAA,CAAc,OAAiB,OAAA,EAAoC;AAC1E,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,IAAA,IAAA,CAAS,MAAM,CAAC,CAAA,IAAK,CAAA,KAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAA;AAAA,EAC3C;AACA,EAAA,OAAO,IAAA;AACT;;;ACxKO,IAAM,SAAA,GAAN,MAAM,UAAA,CAAU;AAAA,EACZ,IAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EAET,YAAY,IAAA,EAAqB;AAC/B,IAAA,MAAM,CAAC,IAAA,EAAM,IAAI,CAAA,GAAI,IAAA,CAAK,KAAA;AAC1B,IAAA,IAAI,SAAS,MAAA,IAAa,IAAA,KAAS,UAAa,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA,EAAG;AACvE,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,sCAAA,EAAyC,IAAA,CAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAC7E;AACA,IAAA,IAAI,IAAA,GAAO,CAAA,IAAK,IAAA,GAAO,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,gDAAA,EAAmD,IAAA,CAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IACvF;AACA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,IAAA,GAAO,CAAA,EAAG;AACnC,MAAA,MAAM,IAAI,UAAA;AAAA,QACR,2CAA2C,IAAA,GAAO,CAAC,CAAA,YAAA,EAAe,IAAA,CAAK,OAAO,MAAM,CAAA;AAAA,OACtF;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,MAAA,KAAW,IAAA,CAAK,QAAQ,MAAA,EAAQ;AAC5C,MAAA,MAAM,IAAI,UAAA;AAAA,QACR,2CAA2C,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA,IAAA,EAAO,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,OACvF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,IAAK,OAAO,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,WAAW,+BAA+B,CAAA;AAAA,IACtD;AACA,IAAA,MAAM,GAAA,GAAM,KAAK,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,IAAK,CAAA;AACrC,IAAA,IAAI,YAAY,GAAA,EAAK;AACnB,MAAA,MAAM,IAAI,UAAA;AAAA,QACR,CAAA,4CAAA,EAA+C,GAAG,CAAA,YAAA,EAAe,OAAO,CAAA;AAAA,OAC1E;AAAA,IACF;AACA,IAAA,IAAI,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA;AAChC,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AAC3C,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA;AAC9B,MAAA,IAAI,MAAM,OAAA,EAAS;AACjB,QAAA,MAAM,IAAI,WAAW,yCAAyC,CAAA;AAAA,MAChE;AACA,MAAA,IAAI,GAAA,GAAM,CAAA,IAAK,GAAA,GAAM,GAAA,EAAK;AACxB,QAAA,MAAM,IAAI,UAAA;AAAA,UACR,CAAA,oDAAA,EAAuD,GAAG,CAAA,YAAA,EAAe,GAAG,CAAA;AAAA,SAC9E;AAAA,MACF;AACA,MAAA,OAAA,GAAU,GAAA;AAAA,IACZ;AACA,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AAC5C,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAC/B,MAAA,IAAI,GAAA,GAAM,CAAA,IAAK,GAAA,IAAO,IAAA,EAAM;AAC1B,QAAA,MAAM,IAAI,UAAA,CAAW,CAAA,uBAAA,EAA0B,GAAG,CAAA,iBAAA,CAAA,EAAqB;AAAA,UACrE,KAAA,EAAO,GAAA;AAAA,UACP,YAAY,CAAC,CAAA,EAAG,SAAS,CAAA,GAAI,EAAA,GAAK,OAAO,CAAC;AAAA,SAC3C,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AACpB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAAA,EACpB;AAAA;AAAA,EAGA,IAAI,GAAA,GAAc;AAChB,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA;AAAA,EACnB;AAAA;AAAA,EAGA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAAA,EAC1B;AAAA;AAAA,EAGA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,OAAA,GAAkB;AAChB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAC9B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAC9B,IAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,IAAA,GAAO,IAAI,CAAA;AAExC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA;AAChC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,IAAK,KAAA;AAClC,MAAA,KAAA,IAAS,CAAA,GAAI,KAAA,EAAO,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAChC,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAC7B,QAAA,GAAA,CAAI,IAAI,IAAA,GAAO,CAAC,IAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA;AAAA,MACtC;AAAA,IACF;AAEA,IAAA,OAAO,OAAW,cAAA,CAAe;AAAA,MAC/B,IAAA,EAAM,GAAA;AAAA,MACN,KAAA,EAAO,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA,MAClB,KAAA,EAAO,SAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,IAAI,KAAA,EAA6B;AAC/B,IAAA,IAAI,KAAK,IAAA,KAAS,KAAA,CAAM,QAAQ,IAAA,CAAK,IAAA,KAAS,MAAM,IAAA,EAAM;AACxD,MAAA,MAAM,IAAI,WAAW,CAAA,iCAAA,EAAoC,IAAA,CAAK,KAAK,CAAA,OAAA,EAAU,KAAA,CAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAC7F;AAGA,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,MAAM,gBAA0B,EAAC;AACjC,IAAA,MAAM,YAAA,GAAyB,CAAC,CAAC,CAAA;AAEjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAM,CAAA,EAAA,EAAK;AAElC,MAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAG1C,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA;AACpC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,IAAK,SAAA;AACtC,MAAA,KAAA,IAAS,CAAA,GAAI,SAAA,EAAW,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AACxC,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAC7B,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA;AAC1B,QAAA,SAAA,CAAU,IAAI,CAAA,EAAA,CAAI,SAAA,CAAU,IAAI,CAAC,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,MAC9C;AAGA,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA;AACtC,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,IAAK,UAAA;AACxC,MAAA,KAAA,IAAS,CAAA,GAAI,UAAA,EAAY,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AAC1C,QAAA,MAAM,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAC9B,QAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA;AAC3B,QAAA,SAAA,CAAU,IAAI,CAAA,EAAA,CAAI,SAAA,CAAU,IAAI,CAAC,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,MAC9C;AAGA,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACpE,MAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,QAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AAC9B,QAAA,IAAI,MAAM,CAAA,EAAG;AACX,UAAA,aAAA,CAAc,KAAK,CAAC,CAAA;AACpB,UAAA,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,QACnB;AAAA,MACF;AACA,MAAA,YAAA,CAAa,IAAA,CAAK,WAAW,MAAM,CAAA;AAAA,IACrC;AAEA,IAAA,OAAO,IAAI,UAAA,CAAU;AAAA,MACnB,IAAA,EAAM,IAAI,YAAA,CAAa,UAAU,CAAA;AAAA,MACjC,OAAA,EAAS,IAAI,UAAA,CAAW,aAAa,CAAA;AAAA,MACrC,MAAA,EAAQ,IAAI,UAAA,CAAW,YAAY,CAAA;AAAA,MACnC,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,IAAI,KAAA,EAA6B;AAC/B,IAAA,IAAI,KAAK,IAAA,KAAS,KAAA,CAAM,QAAQ,IAAA,CAAK,IAAA,KAAS,MAAM,IAAA,EAAM;AACxD,MAAA,MAAM,IAAI,UAAA;AAAA,QACR,CAAA,sCAAA,EAAyC,IAAA,CAAK,KAAK,CAAA,OAAA,EAAU,MAAM,KAAK,CAAA,CAAA;AAAA,OAC1E;AAAA,IACF;AAGA,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,MAAM,gBAA0B,EAAC;AACjC,IAAA,MAAM,YAAA,GAAyB,CAAC,CAAC,CAAA;AAEjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAM,CAAA,EAAA,EAAK;AAClC,MAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAG1C,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA;AACpC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,IAAK,SAAA;AACtC,MAAA,KAAA,IAAS,CAAA,GAAI,SAAA,EAAW,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AACxC,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAC7B,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA;AAC1B,QAAA,SAAA,CAAU,IAAI,CAAA,EAAA,CAAI,SAAA,CAAU,IAAI,CAAC,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,MAC9C;AAGA,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA;AACtC,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,IAAK,UAAA;AACxC,MAAA,KAAA,IAAS,CAAA,GAAI,UAAA,EAAY,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AAC1C,QAAA,MAAM,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAC9B,QAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA;AAC3B,QAAA,SAAA,CAAU,IAAI,CAAA,EAAA,CAAI,SAAA,CAAU,IAAI,CAAC,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,MAC9C;AAGA,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACpE,MAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,QAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AAC9B,QAAA,IAAI,MAAM,CAAA,EAAG;AACX,UAAA,aAAA,CAAc,KAAK,CAAC,CAAA;AACpB,UAAA,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,QACnB;AAAA,MACF;AACA,MAAA,YAAA,CAAa,IAAA,CAAK,WAAW,MAAM,CAAA;AAAA,IACrC;AAEA,IAAA,OAAO,IAAI,UAAA,CAAU;AAAA,MACnB,IAAA,EAAM,IAAI,YAAA,CAAa,UAAU,CAAA;AAAA,MACjC,OAAA,EAAS,IAAI,UAAA,CAAW,aAAa,CAAA;AAAA,MACrC,MAAA,EAAQ,IAAI,UAAA,CAAW,YAAY,CAAA;AAAA,MACnC,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,MAAA,EAA2B;AAC/B,IAAA,IAAI,WAAW,CAAA,EAAG;AAEhB,MAAA,OAAO,IAAI,UAAA,CAAU;AAAA,QACnB,IAAA,EAAM,IAAI,YAAA,CAAa,CAAC,CAAA;AAAA,QACxB,OAAA,EAAS,IAAI,UAAA,CAAW,CAAC,CAAA;AAAA,QACzB,MAAA,EAAQ,IAAI,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,QACpC,OAAO,IAAA,CAAK;AAAA,OACb,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,IAAA,CAAK,KAAK,MAAM,CAAA;AACjD,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,OAAA,CAAQ,CAAC,CAAA,GAAA,CAAK,IAAA,CAAK,IAAA,CAAK,CAAC,KAAK,CAAA,IAAK,MAAA;AAAA,IACrC;AAEA,IAAA,OAAO,IAAI,UAAA,CAAU;AAAA,MACnB,IAAA,EAAM,OAAA;AAAA,MACN,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAM;AAAA,MAC5B,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,EAAM;AAAA,MAC1B,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,SAAS,KAAA,EAA6B;AACpC,IAAA,IAAI,KAAK,IAAA,KAAS,KAAA,CAAM,QAAQ,IAAA,CAAK,IAAA,KAAS,MAAM,IAAA,EAAM;AACxD,MAAA,MAAM,IAAI,UAAA;AAAA,QACR,CAAA,sCAAA,EAAyC,IAAA,CAAK,KAAK,CAAA,OAAA,EAAU,MAAM,KAAK,CAAA,CAAA;AAAA,OAC1E;AAAA,IACF;AAEA,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,MAAM,gBAA0B,EAAC;AACjC,IAAA,MAAM,YAAA,GAAyB,CAAC,CAAC,CAAA;AAEjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAM,CAAA,EAAA,EAAK;AAElC,MAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA;AACtC,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,IAAK,UAAA;AACxC,MAAA,KAAA,IAAS,CAAA,GAAI,UAAA,EAAY,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AAC1C,QAAA,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,GAAG,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IAAK,CAAC,CAAA;AAAA,MACxD;AAGA,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA;AACpC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,IAAK,SAAA;AACtC,MAAA,KAAA,IAAS,CAAA,GAAI,SAAA,EAAW,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AACxC,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAC7B,QAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA;AAC/B,QAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,UAAA,MAAM,OAAA,GAAA,CAAW,IAAA,CAAK,IAAA,CAAK,CAAC,KAAK,CAAA,IAAK,QAAA;AACtC,UAAA,IAAI,YAAY,CAAA,EAAG;AACjB,YAAA,aAAA,CAAc,KAAK,CAAC,CAAA;AACpB,YAAA,UAAA,CAAW,KAAK,OAAO,CAAA;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AACA,MAAA,YAAA,CAAa,IAAA,CAAK,WAAW,MAAM,CAAA;AAAA,IACrC;AAEA,IAAA,OAAO,IAAI,UAAA,CAAU;AAAA,MACnB,IAAA,EAAM,IAAI,YAAA,CAAa,UAAU,CAAA;AAAA,MACjC,OAAA,EAAS,IAAI,UAAA,CAAW,aAAa,CAAA;AAAA,MACrC,MAAA,EAAQ,IAAI,UAAA,CAAW,YAAY,CAAA;AAAA,MACnC,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,OAAO,MAAA,EAAuC;AAC5C,IAAA,MAAM,UAAU,MAAA,YAAkB,YAAA,GAAe,MAAA,GAAS,IAAA,CAAK,gBAAgB,MAAM,CAAA;AACrF,IAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AAEvB,IAAA,IAAI,MAAA,KAAW,KAAK,IAAA,EAAM;AACxB,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,cAAA,EAAiB,MAAM,CAAA,8BAAA,EAAiC,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAAA,IAC1F;AAEA,IAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAEzC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAM,CAAA,EAAA,EAAK;AAClC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA;AAChC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,IAAK,KAAA;AAClC,MAAA,IAAIjD,IAAAA,GAAM,CAAA;AACV,MAAA,KAAA,IAAS,CAAA,GAAI,KAAA,EAAO,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAChC,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAC7B,QAAAA,IAAAA,IAAAA,CAAQ,KAAK,IAAA,CAAK,CAAC,KAAK,CAAA,KAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAA;AAAA,MAC9C;AACA,MAAA,MAAA,CAAO,CAAC,CAAA,GAAIA,IAAAA;AAAA,IACd;AAEA,IAAA,OAAO,OAAW,cAAA,CAAe;AAAA,MAC/B,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,CAAC,IAAA,CAAK,IAAI,CAAA;AAAA,MACjB,KAAA,EAAO,SAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,OAAO,KAAA,EAAuB;AAC5B,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,wBAAA,EAA2B,KAAA,CAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/D;AAEA,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AACpC,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAEpC,IAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AAC3B,MAAA,MAAM,IAAI,UAAA;AAAA,QACR,CAAA,wCAAA,EAA2C,IAAA,CAAK,IAAI,CAAA,wBAAA,EAA2B,SAAS,CAAA,CAAA;AAAA,OAC1F;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAC5C,IAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,IAAA,CAAK,OAAO,SAAS,CAAA;AAErD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAM,CAAA,EAAA,EAAK;AAClC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA;AAChC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,IAAK,KAAA;AAElC,MAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,SAAA,EAAW,EAAA,EAAA,EAAM;AACrC,QAAA,IAAIA,IAAAA,GAAM,CAAA;AACV,QAAA,KAAA,IAAS,CAAA,GAAI,KAAA,EAAO,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAChC,UAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAC7B,UAAAA,IAAAA,IAAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,IAAK,MAAM,SAAA,CAAU,CAAA,GAAI,SAAA,GAAY,EAAE,CAAA,IAAK,CAAA,CAAA;AAAA,QACjE;AACA,QAAA,MAAA,CAAO,CAAA,GAAI,SAAA,GAAY,EAAE,CAAA,GAAIA,IAAAA;AAAA,MAC/B;AAAA,IACF;AAEA,IAAA,OAAO,OAAW,cAAA,CAAe;AAAA,MAC/B,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,CAAC,IAAA,CAAK,IAAA,EAAM,SAAS,CAAA;AAAA,MAC5B,KAAA,EAAO,SAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,SAAA,GAAuB;AACrB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAC9B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAG9B,IAAA,MAAM,SAAA,GAAY,IAAI,UAAA,CAAW,IAAI,CAAA;AACrC,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AAC5C,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAClC,MAAA,SAAA,CAAU,MAAM,CAAA,GAAA,CAAK,SAAA,CAAU,MAAM,KAAK,CAAA,IAAK,CAAA;AAAA,IACjD;AAGA,IAAA,MAAM,SAAA,GAAY,IAAI,UAAA,CAAW,IAAA,GAAO,CAAC,CAAA;AACzC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,SAAA,CAAU,CAAA,GAAI,CAAC,CAAA,GAAA,CAAK,SAAA,CAAU,CAAC,CAAA,IAAK,CAAA,KAAM,SAAA,CAAU,CAAC,CAAA,IAAK,CAAA,CAAA;AAAA,IAC5D;AAGA,IAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA;AACzC,IAAA,MAAM,UAAA,GAAa,IAAI,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAC1C,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA;AAEvC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA;AAChC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,IAAK,KAAA;AAClC,MAAA,KAAA,IAAS,CAAA,GAAI,KAAA,EAAO,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAChC,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAC7B,QAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AAC1B,QAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA;AAC/B,QAAA,UAAA,CAAW,GAAG,CAAA,GAAI,CAAA;AAClB,QAAA,OAAA,CAAQ,CAAC,IAAI,GAAA,GAAM,CAAA;AAAA,MACrB;AAAA,IACF;AAEA,IAAA,OAAO,IAAI,UAAA,CAAU;AAAA,MACnB,IAAA,EAAM,OAAA;AAAA,MACN,OAAA,EAAS,UAAA;AAAA,MACT,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO,CAAC,IAAA,EAAM,IAAI;AAAA,KACnB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,GAAA,CAAI,KAAa,GAAA,EAAqB;AACpC,IAAA,IAAI,GAAA,GAAM,KAAK,GAAA,IAAO,IAAA,CAAK,QAAQ,GAAA,GAAM,CAAA,IAAK,GAAA,IAAO,IAAA,CAAK,IAAA,EAAM;AAC9D,MAAA,MAAM,IAAI,WAAW,CAAA,OAAA,EAAU,GAAG,KAAK,GAAG,CAAA,2BAAA,EAA8B,IAAA,CAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IACvF;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA,IAAK,CAAA;AAClC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,GAAA,GAAM,CAAC,CAAA,IAAK,KAAA;AAGpC,IAAA,IAAI,EAAA,GAAK,KAAA;AACT,IAAA,IAAI,EAAA,GAAK,GAAA;AACT,IAAA,OAAO,KAAK,EAAA,EAAI;AACd,MAAA,MAAM,GAAA,GAAO,KAAK,EAAA,KAAQ,CAAA;AAC1B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,IAAK,CAAA;AACpC,MAAA,IAAI,SAAS,GAAA,EAAK;AAChB,QAAA,EAAA,GAAK,GAAA,GAAM,CAAA;AAAA,MACb,CAAA,MAAA,IAAW,SAAS,GAAA,EAAK;AACvB,QAAA,EAAA,GAAK,GAAA;AAAA,MACP,CAAA,MAAO;AACL,QAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,IAAK,CAAA;AAAA,MAC3B;AAAA,IACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAA,GAAkB;AAChB,IAAA,OAAO,IAAI,UAAA,CAAU;AAAA,MACnB,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,KAAA,EAAM;AAAA,MACtB,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAM;AAAA,MAC5B,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,EAAM;AAAA,MAC1B,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAAA,EACH;AAAA;AAAA,EAGQ,gBAAgB,CAAA,EAAyB;AAC/C,IAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,MAAA,MAAM,IAAI,WAAW,+CAA+C,CAAA;AAAA,IACtE;AACA,IAAA,IACE,CAAA,CAAE,IAAA,YAAgB,YAAA,IAClB,CAAA,CAAE,MAAA,KAAW,CAAA,IACb,CAAA,CAAE,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,EAAG,CAAA,KAAM;AACxB,MAAA,IAAI,QAAA,GAAW,CAAA;AACf,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,IAAA,EAAM,CAAA,EAAA,EAAK,QAAA,IAAY,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAC/D,MAAA,OAAO,CAAA,KAAM,QAAA;AAAA,IACf,CAAC,CAAA,EACD;AACA,MAAA,OAAO,CAAA,CAAE,IAAA;AAAA,IACX;AAEA,IAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AACnC,IAAA,MAAM,UAAU,CAAA,CAAE,OAAA;AAClB,IAAA,MAAM,QAAQ,CAAA,CAAE,KAAA;AAChB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,IAAI,SAAS,CAAA,CAAE,MAAA;AACf,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,KAAA,IAAS,IAAI,CAAA,CAAE,IAAA,GAAO,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACpC,QAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AACxB,QAAA,MAAA,IAAW,GAAA,GAAM,GAAA,IAAQ,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAA;AACvC,QAAA,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,GAAG,CAAA;AAAA,MAC5B;AACA,MAAA,MAAM,QAAQ,CAAA,CAAE,IAAA;AAChB,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,QAAA,MAAM,IAAI,WAAW,+CAA+C,CAAA;AAAA,MACtE;AACA,MAAA,GAAA,CAAI,CAAC,CAAA,GACH,KAAA,YAAiB,aAAA,GACb,MAAA,CAAO,gBAAA,CAAiB,KAAA,EAAO,MAAM,CAAC,CAAA,GACtC,iBAAA,CAAkB,KAAA,EAAO,MAAM,CAAA;AAAA,IACvC;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,OAAO,QAAQ,IAAA,EAOD;AACZ,IAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,UAAA,EAAY,UAAA,EAAY,QAAO,GAAI,IAAA;AACvD,IAAA,IAAI,WAAW,MAAA,KAAW,UAAA,CAAW,UAAU,UAAA,CAAW,MAAA,KAAW,OAAO,MAAA,EAAQ;AAClF,MAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,IAC7D;AAEA,IAAA,MAAM,MAAM,MAAA,CAAO,MAAA;AACnB,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,GAAG,CAAA;AAChC,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAK,CAAA,EAAA,EAAK,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AAEzC,IAAA,MAAM,UAAA,GAAa,KAAK,IAAA,IAAQ,IAAA;AAChC,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACnB,QAAA,MAAM,EAAA,GAAK,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAC5B,QAAA,MAAM,EAAA,GAAK,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAC5B,QAAA,IAAI,EAAA,KAAO,EAAA,EAAI,OAAO,EAAA,GAAK,EAAA;AAC3B,QAAA,OAAA,CAAQ,WAAW,CAAC,CAAA,IAAK,CAAA,KAAM,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA,CAAA;AAAA,MAClD,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,IAAA,GAAO,CAAC,CAAA;AACtC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AACtB,MAAA,MAAM,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAC3B,MAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,IAAK,IAAA,EAAM;AACtB,QAAA,MAAM,IAAI,UAAA,CAAW,CAAA,yBAAA,EAA4B,CAAC,CAAA,CAAE,CAAA;AAAA,MACtD;AACA,MAAA,MAAA,CAAO,IAAI,CAAC,CAAA,GAAA,CAAK,OAAO,CAAA,GAAI,CAAC,KAAK,CAAA,IAAK,CAAA;AAAA,IACzC;AAEA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,GAAA,CAAK,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,IAAK,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,UAAA,CAAW,GAAG,CAAA;AAClC,IAAA,MAAM,IAAA,GAAO,IAAI,YAAA,CAAa,GAAG,CAAA;AACjC,IAAA,MAAM,IAAA,GAAO,OAAO,KAAA,EAAM;AAE1B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AACtB,MAAA,MAAM,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAC3B,MAAA,MAAM,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAC3B,MAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,IAAK,IAAA,EAAM;AACtB,QAAA,MAAM,IAAI,UAAA,CAAW,CAAA,yBAAA,EAA4B,CAAC,CAAA,CAAE,CAAA;AAAA,MACtD;AACA,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA;AACvB,MAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,CAAA;AACf,MAAA,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA;AACzB,MAAA,IAAA,CAAK,CAAC,IAAI,GAAA,GAAM,CAAA;AAAA,IAClB;AAEA,IAAA,OAAO,IAAI,UAAA,CAAU,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAO,CAAC,IAAA,EAAM,IAAI,CAAA,EAAG,CAAA;AAAA,EACrE;AACF;;;ACvrBA,SAASkD,gBAAe,CAAA,EAAyC;AAC/D,EAAA,OAAO,EAAE,KAAA,KAAU,QAAA;AACrB;AAEA,SAASC,iBAAgB,CAAA,EAA6C;AACpE,EAAA,OAAO,EAAE,KAAA,KAAU,QAAA;AACrB;AA8BO,SAAS,OAAA,CAAQ,GAAW,IAAA,EAA8B;AAC/D,EAAA,IAAI,aAAA;AAEJ,EAAA,IAAI,SAAS,MAAA,EAAW;AAEtB,IAAA,aAAA,uBAAoB,GAAA,EAAI;AACxB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,MAAA,IAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,EAAG;AACpB,QAAA,aAAA,CAAc,IAAI,CAAC,CAAA;AAAA,MACrB;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AACvC,IAAA,aAAA,uBAAoB,GAAA,EAAI;AAExB,IAAA,KAAA,MAAW,MAAM,IAAA,EAAM;AAErB,MAAA,IAAI,CAAA,CAAE,KAAA,CAAM,EAAE,CAAA,KAAM,CAAA,EAAG;AACrB,QAAA,MAAM,IAAI,WAAW,CAAA,oBAAA,EAAuB,EAAE,mBAAmB,CAAA,CAAE,KAAA,CAAM,EAAE,CAAC,CAAA,YAAA,CAAc,CAAA;AAAA,MAC5F;AAEA,MAAA,aAAA,CAAc,IAAI,EAAE,CAAA;AAAA,IACtB;AAAA,EACF;AAGA,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,aAAuB,EAAC;AAE9B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,IAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,EAAG;AACzB,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACrB,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAC1B,MAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,MAAA,KAAW,MAAA,EAAW;AAC7C,QAAA,MAAM,IAAI,WAAW,6CAA6C,CAAA;AAAA,MACpE;AACA,MAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AACjB,MAAA,UAAA,CAAW,KAAK,MAAM,CAAA;AAAA,IACxB;AAAA,EACF;AAIA,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,aAAA,CAAc,QAAQ,CAAA;AAAA,EACxB;AAGA,EAAA,IAAID,eAAAA,CAAe,CAAC,CAAA,EAAG;AACrB,IAAA,OAAO,OAAO,eAAA,CAAgB;AAAA,MAC5B,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,KAAA,EAAO,QAAA;AAAA,MACP,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,CAACC,gBAAAA,CAAgB,CAAC,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,yCAAyC,CAAA;AAAA,EAChE;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,KAAA,EAAO,QAAA;AAAA,IACP,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,OAAA,EAAS;AAAA,GACV,CAAA;AACH;AA4BO,SAAS,SAAA,CAAU,GAAW,IAAA,EAAsB;AAEzD,EAAA,MAAM,OAAA,GAAU,EAAE,IAAA,GAAO,CAAA;AAIzB,EAAA,MAAM,cAAA,GAAiB,IAAA,GAAO,CAAA,GAAI,OAAA,GAAU,IAAA,GAAO,IAAA;AAGnD,EAAA,IAAI,cAAA,GAAiB,CAAA,IAAK,cAAA,GAAiB,OAAA,EAAS;AAClD,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,CAAA,KAAA,EAAQ,IAAI,CAAA,kCAAA,EAAqC,OAAO,CAAA,WAAA,CAAA;AAAA,MACxD,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,aAAuB,EAAC;AAG9B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,EAAgB,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACrB,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAC1B,IAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,MAAA,KAAW,MAAA,EAAW;AAC7C,MAAA,MAAM,IAAI,WAAW,6CAA6C,CAAA;AAAA,IACpE;AACA,IAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AACjB,IAAA,UAAA,CAAW,KAAK,MAAM,CAAA;AAAA,EACxB;AAIA,EAAA,QAAA,CAAS,KAAK,CAAC,CAAA;AAGf,EAAA,MAAM,cAAA,GACJ,cAAA,GAAiB,CAAA,CAAE,IAAA,GAAA,CAAQ,CAAA,CAAE,OAAA,CAAQ,cAAc,CAAA,IAAK,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,cAAc,KAAK,CAAA,CAAA,GAAK,CAAA;AAChG,EAAA,UAAA,CAAW,KAAK,cAAc,CAAA;AAG9B,EAAA,KAAA,IAAS,CAAA,GAAI,cAAA,EAAgB,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC5C,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACrB,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAC1B,IAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,MAAA,KAAW,MAAA,EAAW;AAC7C,MAAA,MAAM,IAAI,WAAW,6CAA6C,CAAA;AAAA,IACpE;AACA,IAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AACjB,IAAA,UAAA,CAAW,KAAK,MAAM,CAAA;AAAA,EACxB;AAEA,EAAA,aAAA,CAAc,QAAQ,CAAA;AAGtB,EAAA,IAAID,eAAAA,CAAe,CAAC,CAAA,EAAG;AACrB,IAAA,OAAO,OAAO,eAAA,CAAgB;AAAA,MAC5B,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,KAAA,EAAO,QAAA;AAAA,MACP,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,CAACC,gBAAAA,CAAgB,CAAC,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,WAAW,2CAA2C,CAAA;AAAA,EAClE;AAEA,EAAA,OAAO,OAAO,cAAA,CAAe;AAAA,IAC3B,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,KAAA,EAAO,QAAA;AAAA,IACP,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,OAAA,EAAS;AAAA,GACV,CAAA;AACH;AAKO,IAAM,UAAA,GAAa","file":"chunk-BCR7G3A6.js","sourcesContent":["export type { Device, DType, Shape, TensorLike, TypedArray } from \"../core\";\nexport type { GradTensorOptions } from \"./autograd/index\";\n// Autograd - gradient tracking and automatic differentiation\nexport {\n dropout as dropoutGrad,\n GradTensor,\n im2col as im2colGrad,\n logSoftmax as logSoftmaxGrad,\n noGrad,\n parameter,\n softmax as softmaxGrad,\n variance as varianceGrad,\n} from \"./autograd/index\";\n\n// Re-export Tensor class for the union type below\nimport type { GradTensor as GradTensorClass } from \"./autograd/index\";\nimport type { Tensor as TensorClass } from \"./tensor/index\";\n\n/**\n * Union type representing either a Tensor or GradTensor.\n *\n * This type enables functions to accept both regular tensors and\n * differentiable tensors interchangeably, improving API flexibility.\n *\n * Use this type when a function should work with either tensor type:\n * - `Tensor`: For pure numerical operations without gradient tracking\n * - `GradTensor`: For operations that need automatic differentiation\n *\n * @example\n * ```ts\n * import type { AnyTensor } from 'deepbox/ndarray';\n *\n * function processData(input: AnyTensor): void {\n * console.log(input.shape); // Works with both Tensor and GradTensor\n * console.log(input.dtype);\n * }\n * ```\n */\nexport type AnyTensor = TensorClass | GradTensorClass;\nexport { dot } from \"./linalg/index\";\nexport {\n elu,\n gelu,\n leakyRelu,\n logSoftmax,\n mish,\n relu,\n sigmoid,\n softmax,\n softplus,\n swish,\n} from \"./ops/activation\";\nexport { col2im, im2col } from \"./ops/conv\";\nexport {\n abs,\n acos,\n acosh,\n add,\n addScalar,\n all,\n allclose,\n any,\n argsort,\n arrayEqual,\n asin,\n asinh,\n atan,\n atan2,\n atanh,\n cbrt,\n ceil,\n clip,\n concatenate,\n cos,\n cosh,\n cumprod,\n cumsum,\n diff,\n div,\n equal,\n exp,\n exp2,\n expm1,\n floor,\n floorDiv,\n greater,\n greaterEqual,\n isclose,\n isfinite,\n isinf,\n isnan,\n less,\n lessEqual,\n log,\n log1p,\n log2,\n log10,\n logicalAnd,\n logicalNot,\n logicalOr,\n logicalXor,\n max,\n maximum,\n mean,\n median,\n min,\n minimum,\n mod,\n mul,\n mulScalar,\n neg,\n notEqual,\n pow,\n prod,\n reciprocal,\n repeat,\n round,\n rsqrt,\n sign,\n sin,\n sinh,\n sort,\n split,\n sqrt,\n square,\n stack,\n std,\n sub,\n sum,\n tan,\n tanh,\n tile,\n trunc,\n variance,\n} from \"./ops/index\";\nexport { dropoutMask } from \"./ops/random\";\nexport type { CSRMatrixInit } from \"./sparse\";\n\nexport { CSRMatrix } from \"./sparse\";\nexport type {\n NestedArray,\n SliceRange,\n TensorCreateOptions,\n TensorOptions,\n} from \"./tensor/index\";\nexport {\n arange,\n empty,\n eye,\n flatten,\n full,\n gather,\n geomspace,\n linspace,\n logspace,\n ones,\n randn,\n reshape,\n slice,\n Tensor,\n tensor,\n transpose,\n zeros,\n} from \"./tensor/index\";\nexport { expandDims, squeeze, unsqueeze } from \"./tensor/shapeOps\";\n","import type { Shape } from \"../../core\";\n\nexport function isContiguous(shape: Shape, strides: readonly number[]): boolean {\n if (shape.length !== strides.length) return false;\n // Check strides match row-major layout without allocating computeStrides\n let expected = 1;\n for (let i = shape.length - 1; i >= 0; i--) {\n if (strides[i] !== expected) return false;\n expected *= shape[i] ?? 1;\n }\n return true;\n}\n\nexport function offsetFromFlatIndex(\n flat: number,\n logicalStrides: readonly number[],\n strides: readonly number[],\n offset: number\n): number {\n let rem = flat;\n let out = offset;\n for (let axis = 0; axis < logicalStrides.length; axis++) {\n const stride = logicalStrides[axis] ?? 1;\n const coord = Math.floor(rem / stride);\n rem -= coord * stride;\n out += coord * (strides[axis] ?? 0);\n }\n return out;\n}\n\nexport function broadcastOffsetFromFlatIndex(\n flat: number,\n outShape: Shape,\n outStrides: readonly number[],\n inShape: Shape,\n inStrides: readonly number[],\n inOffset: number\n): number {\n if (inShape.length === 0) {\n return inOffset;\n }\n\n const rankDiff = outShape.length - inShape.length;\n let rem = flat;\n let offset = inOffset;\n\n for (let axis = 0; axis < outShape.length; axis++) {\n const stride = outStrides[axis] ?? 1;\n const coord = Math.floor(rem / stride);\n rem -= coord * stride;\n\n if (axis >= rankDiff) {\n const inDim = inShape[axis - rankDiff] ?? 1;\n if (inDim !== 1) {\n offset += coord * (inStrides[axis - rankDiff] ?? 0);\n }\n }\n }\n\n return offset;\n}\n","import type { Device, DType, Shape, TensorLike, TypedArray } from \"../../core\";\nimport {\n DeepboxError,\n DTypeError,\n dtypeToTypedArrayCtor,\n IndexError,\n InvalidParameterError,\n ShapeError,\n shapeToSize,\n validateShape,\n} from \"../../core\";\nimport { isContiguous } from \"./strides\";\n\nexport type TensorOptions = {\n readonly dtype: DType;\n readonly device: Device;\n};\n\ntype TensorData<D extends DType> = D extends \"string\" ? string[] : TypedArray;\n\nfunction isTypedArrayForDType(data: TypedArray, dtype: DType): boolean {\n if (dtype === \"string\") return false;\n if (dtype === \"float32\") return data instanceof Float32Array;\n if (dtype === \"float64\") return data instanceof Float64Array;\n if (dtype === \"int32\") return data instanceof Int32Array;\n if (dtype === \"int64\") return data instanceof BigInt64Array;\n if (dtype === \"uint8\" || dtype === \"bool\") return data instanceof Uint8Array;\n return false;\n}\n\nfunction assertTypedArrayForDType(data: TypedArray, dtype: DType): void {\n if (!isTypedArrayForDType(data, dtype)) {\n throw new DTypeError(\n `TypedArray ${data.constructor.name} does not match dtype ${dtype}; ` +\n \"provide matching dtype or convert the data first.\"\n );\n }\n}\n\nfunction validateStrides(\n shape: Shape,\n strides: readonly number[],\n offset: number,\n dataLength: number\n): void {\n if (strides.length !== shape.length) {\n throw new ShapeError(\n `strides length ${strides.length} does not match shape length ${shape.length}`\n );\n }\n\n for (const stride of strides) {\n if (!Number.isInteger(stride)) {\n throw new InvalidParameterError(\n `stride must be an integer; received ${String(stride)}`,\n \"strides\",\n stride\n );\n }\n if (stride < 0) {\n throw new InvalidParameterError(\n `stride must be >= 0; received ${String(stride)}`,\n \"strides\",\n stride\n );\n }\n }\n\n if (offset < 0) {\n throw new InvalidParameterError(`offset must be >= 0; received ${offset}`, \"offset\", offset);\n }\n\n if (shapeToSize(shape) === 0) {\n if (offset > dataLength) {\n throw new ShapeError(`offset ${offset} is out of bounds for buffer length ${dataLength}`);\n }\n return;\n }\n\n let maxOffset = offset;\n for (let i = 0; i < shape.length; i++) {\n const dim = shape[i] ?? 0;\n const stride = strides[i] ?? 0;\n if (dim > 0) {\n maxOffset += (dim - 1) * stride;\n }\n }\n\n if (maxOffset >= dataLength) {\n throw new ShapeError(\n `Data length ${dataLength} is too small for shape [${shape}] with strides [${strides}] and offset ${offset}`\n );\n }\n}\n\n/**\n * Compute memory strides for row-major layout.\n *\n * Strides determine the step size in the underlying buffer for each dimension.\n * For row-major (C-order), the last dimension has stride 1.\n *\n * Time complexity: O(n) where n is number of dimensions.\n *\n * @param shape - Tensor shape\n * @returns Array of stride values\n *\n * @example\n * ```ts\n * computeStrides([2, 3, 4]); // [12, 4, 1]\n * // To access element [i, j, k]: offset + i*12 + j*4 + k*1\n * ```\n */\nexport function computeStrides(shape: Shape): readonly number[] {\n const strides = new Array<number>(shape.length);\n let stride = 1;\n for (let i = shape.length - 1; i >= 0; i--) {\n strides[i] = stride;\n stride *= shape[i] ?? 0;\n }\n return strides;\n}\n\nexport { dtypeToTypedArrayCtor } from \"../../core\";\n\n/**\n * Type guard to check if TypedArray is BigInt64Array.\n *\n * @param arr - TypedArray to check\n * @returns True if array is BigInt64Array\n */\nexport function isBigIntArray(arr: TypedArray): arr is BigInt64Array {\n return arr instanceof BigInt64Array;\n}\n\n/**\n * Multi-dimensional array (tensor) with typed storage.\n *\n * Core data structure for numerical computing. Supports:\n * - N-dimensional arrays with any shape\n * - Multiple data types (float32, float64, int32, etc.)\n * - Memory-efficient strided views\n * - Device abstraction (CPU, WebGPU, WASM)\n *\n * Inspired by NumPy ndarray and PyTorch Tensor.\n *\n * @typeParam S - Shape type (readonly number array)\n * @typeParam D - Data type (DType literal)\n *\n * @example\n * ```ts\n * import { tensor } from 'deepbox/ndarray';\n *\n * // Create from nested arrays\n * const t = tensor([[1, 2, 3], [4, 5, 6]]);\n * console.log(t.shape); // [2, 3]\n * console.log(t.dtype); // 'float32'\n *\n * // Access properties\n * console.log(t.size); // 6\n * console.log(t.ndim); // 2\n * ```\n */\nexport class Tensor<S extends Shape = Shape, D extends DType = DType> implements TensorLike<S, D> {\n readonly shape: S;\n readonly dtype: D;\n readonly device: Device;\n readonly data: TensorData<D>;\n readonly strides: readonly number[];\n readonly offset: number;\n readonly size: number;\n readonly ndim: number;\n\n private constructor(args: {\n readonly data: TensorData<D>;\n readonly shape: S;\n readonly dtype: D;\n readonly device: Device;\n readonly strides: readonly number[];\n readonly offset: number;\n }) {\n this.data = args.data;\n this.shape = args.shape;\n this.dtype = args.dtype;\n this.device = args.device;\n this.strides = args.strides;\n this.offset = args.offset;\n\n this.ndim = this.shape.length;\n this.size = shapeToSize(this.shape);\n }\n\n private isStringTensor(): this is Tensor<S, \"string\"> {\n return this.dtype === \"string\";\n }\n\n private isNumericTensor(): this is Tensor<S, Exclude<DType, \"string\">> {\n return this.dtype !== \"string\";\n }\n\n static fromTypedArray<S extends Shape, D extends Exclude<DType, \"string\">>(args: {\n readonly data: TensorData<D>;\n readonly shape: S;\n readonly dtype: D;\n readonly device: Device;\n readonly offset?: number;\n readonly strides?: readonly number[];\n }): Tensor<S, D> {\n validateShape(args.shape);\n const offset = args.offset ?? 0;\n const strides = args.strides ?? computeStrides(args.shape);\n assertTypedArrayForDType(args.data, args.dtype);\n validateStrides(args.shape, strides, offset, args.data.length);\n\n return new Tensor<S, D>({\n data: args.data,\n shape: args.shape,\n dtype: args.dtype,\n device: args.device,\n offset,\n strides,\n });\n }\n\n static fromStringArray<S extends Shape>(args: {\n readonly data: string[];\n readonly shape: S;\n readonly device?: Device;\n readonly offset?: number;\n readonly strides?: readonly number[];\n }): Tensor<S, \"string\"> {\n validateShape(args.shape);\n const offset = args.offset ?? 0;\n const strides = args.strides ?? computeStrides(args.shape);\n validateStrides(args.shape, strides, offset, args.data.length);\n\n return new Tensor({\n data: args.data,\n shape: args.shape,\n dtype: \"string\",\n device: args.device ?? \"cpu\",\n offset,\n strides,\n });\n }\n\n static zeros<S extends Shape>(\n shape: S,\n opts: TensorOptions & { readonly dtype: \"string\" }\n ): Tensor<S, \"string\">;\n static zeros<S extends Shape, D extends Exclude<DType, \"string\">>(\n shape: S,\n opts: TensorOptions & { readonly dtype: D }\n ): Tensor<S, D>;\n static zeros<S extends Shape>(\n shape: S,\n opts: TensorOptions & { readonly dtype: DType }\n ): Tensor<S, DType> {\n validateShape(shape);\n const size = shapeToSize(shape);\n if (opts.dtype === \"string\") {\n const data = new Array<string>(size);\n data.fill(\"\");\n return Tensor.fromStringArray({\n data,\n shape,\n device: opts.device,\n });\n }\n\n const Ctor = dtypeToTypedArrayCtor(opts.dtype);\n const data = new Ctor(size);\n return Tensor.fromTypedArray({\n data,\n shape,\n dtype: opts.dtype,\n device: opts.device,\n });\n }\n\n /**\n * Create a view sharing the same underlying data.\n *\n * Note: This does not copy data. Mutations (if exposed in the future) would be shared.\n */\n view<S2 extends Shape>(\n this: Tensor<S, \"string\">,\n shape: S2,\n strides?: readonly number[],\n offset?: number\n ): Tensor<S2, \"string\">;\n view<S2 extends Shape>(\n this: Tensor<S, Exclude<DType, \"string\">>,\n shape: S2,\n strides?: readonly number[],\n offset?: number\n ): Tensor<S2, Exclude<DType, \"string\">>;\n view<S2 extends Shape>(\n this: Tensor<S, DType>,\n shape: S2,\n strides?: readonly number[],\n offset?: number\n ): Tensor<S2, DType>;\n view<S2 extends Shape>(\n shape: S2,\n strides?: readonly number[],\n offset = this.offset\n ): Tensor<S2, DType> {\n validateShape(shape);\n if (shapeToSize(shape) !== this.size) {\n throw ShapeError.mismatch([this.size], [shapeToSize(shape)], \"view\");\n }\n if (this.isStringTensor()) {\n // Safe: this branch only executes when dtype is string, so D is \"string\".\n return Tensor.fromStringArray({\n data: this.data,\n shape,\n device: this.device,\n offset,\n strides: strides ?? computeStrides(shape),\n });\n }\n\n if (!this.isNumericTensor()) {\n throw new DTypeError(\"view is not defined for string dtype\");\n }\n\n return Tensor.fromTypedArray({\n data: this.data,\n shape,\n dtype: this.dtype,\n device: this.device,\n offset,\n strides: strides ?? computeStrides(shape),\n });\n }\n\n /**\n * Reshape the tensor to a new shape without copying data.\n *\n * Returns a new tensor with the specified shape, sharing the same underlying data.\n * The total number of elements must remain the same.\n * Requires a contiguous tensor; non-contiguous views will throw.\n *\n * This is a convenience method that wraps the standalone `reshape` function,\n * providing a more intuitive API similar to NumPy and PyTorch.\n *\n * @param newShape - The desired shape for the tensor\n * @returns A new tensor with the specified shape\n * @throws {ShapeError} If the new shape is incompatible with the tensor's size\n *\n * @example\n * ```ts\n * const t = tensor([1, 2, 3, 4, 5, 6]);\n * const reshaped = t.reshape([2, 3]);\n * console.log(reshaped.shape); // [2, 3]\n *\n * const matrix = tensor([[1, 2], [3, 4]]);\n * const flat = matrix.reshape([4]);\n * console.log(flat.shape); // [4]\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.reshape.html | NumPy reshape}\n * @see {@link https://pytorch.org/docs/stable/generated/torch.reshape.html | PyTorch reshape}\n */\n reshape<S2 extends Shape>(this: Tensor<S, \"string\">, newShape: S2): Tensor<S2, \"string\">;\n reshape<S2 extends Shape>(\n this: Tensor<S, Exclude<DType, \"string\">>,\n newShape: S2\n ): Tensor<S2, Exclude<DType, \"string\">>;\n reshape<S2 extends Shape>(this: Tensor<S, DType>, newShape: S2): Tensor<S2, DType>;\n reshape<S2 extends Shape>(newShape: S2): Tensor<S2, DType> {\n validateShape(newShape);\n const newSize = shapeToSize(newShape);\n if (newSize !== this.size) {\n throw new ShapeError(`Cannot reshape tensor of size ${this.size} to shape [${newShape}]`);\n }\n if (!isContiguous(this.shape, this.strides)) {\n throw new ShapeError(\"reshape requires a contiguous tensor\");\n }\n\n if (this.isStringTensor()) {\n // Safe: this branch only executes when dtype is string, so D is \"string\".\n return Tensor.fromStringArray({\n data: this.data,\n shape: newShape,\n device: this.device,\n offset: this.offset,\n strides: computeStrides(newShape),\n });\n }\n\n if (!this.isNumericTensor()) {\n throw new DTypeError(\"reshape is not defined for string dtype\");\n }\n\n return Tensor.fromTypedArray({\n data: this.data,\n shape: newShape,\n dtype: this.dtype,\n device: this.device,\n offset: this.offset,\n strides: computeStrides(newShape),\n });\n }\n\n /**\n * Flatten the tensor to a 1-dimensional array.\n *\n * Returns a new 1D tensor containing all elements, sharing the same underlying data.\n *\n * @returns A 1D tensor with shape [size]\n *\n * @example\n * ```ts\n * const matrix = tensor([[1, 2, 3], [4, 5, 6]]);\n * const flat = matrix.flatten();\n * console.log(flat.shape); // [6]\n * ```\n */\n flatten(this: Tensor<S, \"string\">): Tensor<[number], \"string\">;\n flatten(this: Tensor<S, Exclude<DType, \"string\">>): Tensor<[number], Exclude<DType, \"string\">>;\n flatten(this: Tensor<S, DType>): Tensor<[number], DType>;\n flatten(): Tensor<[number], DType> {\n return this.reshape([this.size]);\n }\n\n at(...indices: number[]): unknown {\n if (indices.length !== this.ndim) {\n throw new ShapeError(\n `Expected ${this.ndim} indices for a ${this.ndim}D tensor; received ${indices.length}`\n );\n }\n\n let flat = this.offset;\n for (let axis = 0; axis < this.ndim; axis++) {\n const dim = this.shape[axis] ?? 0;\n const stride = this.strides[axis] ?? 0;\n const raw = indices[axis] ?? 0;\n const idx = raw < 0 ? dim + raw : raw;\n\n if (!Number.isInteger(idx)) {\n throw new InvalidParameterError(\n `index for axis ${axis} must be an integer; received ${String(raw)}`,\n `indices[${axis}]`,\n raw\n );\n }\n if (idx < 0 || idx >= dim) {\n throw new IndexError(`index ${raw} is out of bounds for dimension of size ${dim}`);\n }\n\n flat += idx * stride;\n }\n\n const v = this.data[flat];\n if (v === undefined) {\n throw new DeepboxError(\"Internal error: computed flat index is out of bounds\");\n }\n return v;\n }\n\n toArray(): unknown {\n const recur = (axis: number, baseOffset: number): unknown => {\n if (axis === this.ndim) {\n const v = this.data[baseOffset];\n if (v === undefined) {\n throw new DeepboxError(\"Internal error: computed flat index is out of bounds\");\n }\n return v;\n }\n\n const dim = this.shape[axis] ?? 0;\n const stride = this.strides[axis] ?? 0;\n const out = new Array<unknown>(dim);\n for (let i = 0; i < dim; i++) {\n out[i] = recur(axis + 1, baseOffset + i * stride);\n }\n return out;\n };\n\n return recur(0, this.offset);\n }\n\n /**\n * Return a human-readable string representation of this tensor.\n *\n * Scalars print as a bare value, 1-D tensors as a bracketed list, and\n * higher-rank tensors use nested brackets with newline separators.\n * Large dimensions are summarized with an ellipsis.\n *\n * @param maxElements - Maximum number of elements to display per\n * dimension before summarizing (default: 6).\n * @returns Formatted string representation\n *\n * @example\n * ```ts\n * const t = tensor([1, 2, 3]);\n * t.toString(); // \"tensor([1, 2, 3], dtype=float32)\"\n * ```\n */\n toString(maxElements = 6): string {\n const formatValue = (v: unknown): string => {\n if (typeof v === \"bigint\") return v.toString();\n if (typeof v === \"number\") {\n if (Number.isInteger(v) && Math.abs(v) < 1e15) return v.toString();\n return v.toPrecision(4);\n }\n if (typeof v === \"string\") return JSON.stringify(v);\n return String(v);\n };\n\n const formatArray = (arr: unknown, depth: number): string => {\n if (!Array.isArray(arr)) return formatValue(arr);\n\n const len = arr.length;\n if (len === 0) return \"[]\";\n\n const half = Math.floor(maxElements / 2);\n const pad = \" \".repeat(depth + 7);\n\n let items: string[];\n if (len <= maxElements) {\n items = arr.map((el) => formatArray(el, depth + 1));\n } else {\n const head = arr.slice(0, half).map((el) => formatArray(el, depth + 1));\n const tail = arr.slice(len - half).map((el) => formatArray(el, depth + 1));\n items = [...head, \"...\", ...tail];\n }\n\n if (depth === 0 && this.ndim === 1) {\n return `[${items.join(\", \")}]`;\n }\n if (!Array.isArray(arr[0])) {\n return `[${items.join(\", \")}]`;\n }\n return `[${items.join(`\\n${pad}`)}]`;\n };\n\n // Scalar (0-D)\n if (this.ndim === 0) {\n const v = this.data[this.offset];\n return `tensor(${formatValue(v)}, dtype=${this.dtype})`;\n }\n\n const nested = this.toArray();\n const body = formatArray(nested, 0);\n return `tensor(${body}, dtype=${this.dtype})`;\n }\n}\n","import {\n type DType,\n InvalidParameterError,\n type Shape,\n ShapeError,\n shapeToSize,\n validateShape,\n} from \"../../core\";\nimport { isContiguous } from \"./strides\";\nimport { computeStrides, Tensor } from \"./Tensor\";\n\ntype NumericDType = Exclude<DType, \"string\">;\n\nfunction isStringTensor(t: Tensor): t is Tensor<Shape, \"string\"> {\n return t.dtype === \"string\";\n}\n\nfunction isNumericTensor(t: Tensor): t is Tensor<Shape, NumericDType> {\n return t.dtype !== \"string\";\n}\n\n/**\n * Change shape (view) without copying.\n *\n * Notes:\n * - Currently only supports contiguous tensors.\n * - In the future, reshape should support more view cases using strides.\n */\nexport function reshape(t: Tensor, newShape: Shape): Tensor {\n validateShape(newShape);\n const newSize = shapeToSize(newShape);\n if (newSize !== t.size) {\n throw new ShapeError(`Cannot reshape tensor of size ${t.size} to shape [${newShape}]`);\n }\n if (!isContiguous(t.shape, t.strides)) {\n throw new ShapeError(\"reshape requires a contiguous tensor\");\n }\n\n if (isStringTensor(t)) {\n return Tensor.fromStringArray({\n data: t.data,\n shape: newShape,\n device: t.device,\n offset: t.offset,\n strides: computeStrides(newShape),\n });\n }\n\n if (!isNumericTensor(t)) {\n throw new ShapeError(\"reshape is not defined for string dtype\");\n }\n\n return Tensor.fromTypedArray({\n data: t.data,\n shape: newShape,\n dtype: t.dtype,\n device: t.device,\n offset: t.offset,\n strides: computeStrides(newShape),\n });\n}\n\n/**\n * Flatten to 1D.\n */\nexport function flatten(t: Tensor): Tensor {\n return reshape(t, [t.size]);\n}\n\n/**\n * Transpose tensor dimensions.\n *\n * Reverses or permutes the axes of a tensor.\n *\n * @param t - Input tensor\n * @param axes - Permutation of axes. If undefined, reverses all axes\n * @returns Transposed tensor\n *\n * @example\n * ```ts\n * import { transpose, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([[1, 2], [3, 4]]); // shape: (2, 2)\n * const y = transpose(x); // shape: (2, 2), values: [[1, 3], [2, 4]]\n *\n * const z = tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]); // shape: (2, 2, 2)\n * const w = transpose(z, [2, 0, 1]); // shape: (2, 2, 2), axes permuted\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.transpose.html | NumPy transpose}\n */\nexport function transpose(t: Tensor, axes?: readonly number[]): Tensor {\n let axesArr: number[];\n\n if (axes === undefined) {\n // Reverse the axes order for default transpose\n // Create array [ndim-1, ndim-2, ..., 1, 0]\n // Example: for ndim=3, creates [2, 1, 0]\n axesArr = [];\n for (let i = t.ndim - 1; i >= 0; i--) {\n axesArr.push(i);\n }\n } else {\n axesArr = [...axes];\n\n // Validate axes\n if (axesArr.length !== t.ndim) {\n throw new ShapeError(`axes must have length ${t.ndim}, got ${axesArr.length}`);\n }\n\n const seen = new Set<number>();\n const normalized: number[] = [];\n for (const axis of axesArr) {\n const norm = axis < 0 ? t.ndim + axis : axis;\n if (norm < 0 || norm >= t.ndim) {\n throw new InvalidParameterError(\n `axis ${axis} out of range for ${t.ndim}D tensor`,\n \"axes\",\n axis\n );\n }\n if (seen.has(norm)) {\n throw new InvalidParameterError(`duplicate axis ${axis}`, \"axes\", axis);\n }\n seen.add(norm);\n normalized.push(norm);\n }\n axesArr = normalized;\n }\n\n // Compute new shape and strides\n const newShape: number[] = new Array<number>(t.ndim);\n const newStrides: number[] = new Array<number>(t.ndim);\n\n for (let i = 0; i < t.ndim; i++) {\n const axis = axesArr[i];\n if (axis === undefined) {\n throw new ShapeError(\"Internal error: missing axis\");\n }\n const dim = t.shape[axis];\n const stride = t.strides[axis];\n if (dim === undefined || stride === undefined) {\n throw new ShapeError(\"Internal error: missing dimension or stride\");\n }\n newShape[i] = dim;\n newStrides[i] = stride;\n }\n\n validateShape(newShape);\n\n if (isStringTensor(t)) {\n return Tensor.fromStringArray({\n data: t.data,\n shape: newShape,\n device: t.device,\n offset: t.offset,\n strides: newStrides,\n });\n }\n\n if (!isNumericTensor(t)) {\n throw new ShapeError(\"transpose is not defined for string dtype\");\n }\n\n return Tensor.fromTypedArray({\n data: t.data,\n shape: newShape,\n dtype: t.dtype,\n device: t.device,\n offset: t.offset,\n strides: newStrides,\n });\n}\n","import {\n DataValidationError,\n type DType,\n DTypeError,\n dtypeToTypedArrayCtor,\n getBigIntElement,\n getNumericElement,\n type Shape,\n ShapeError,\n} from \"../../core\";\nimport { transpose as tensorTranspose } from \"../tensor/shape\";\nimport { type Tensor, Tensor as TensorClass } from \"../tensor/Tensor\";\n\nconst INT64_MIN = -(1n << 63n);\nconst INT64_MAX = (1n << 63n) - 1n;\n\nfunction isFloatDType(dtype: DType): boolean {\n return dtype === \"float32\" || dtype === \"float64\";\n}\n\ntype NumericDType = Exclude<DType, \"string\">;\n\nfunction resolveDotDtype(a: DType, b: DType): NumericDType {\n if (a === \"string\" || b === \"string\") {\n throw new DTypeError(\"dot is not defined for string dtype\");\n }\n if (a === \"int64\" || b === \"int64\") {\n if (a !== b) {\n throw new DTypeError(`dot requires matching dtypes; received ${a} and ${b}`);\n }\n return \"int64\";\n }\n if (a === b) {\n return a;\n }\n if (isFloatDType(a) && isFloatDType(b)) {\n return \"float64\";\n }\n throw new DTypeError(`dot requires matching dtypes; received ${a} and ${b}`);\n}\n\n/**\n * Compute dot product or matrix multiplication.\n *\n * Supported cases:\n * - Both 1-D (vector, vector): inner product, returns a scalar tensor\n * - Both 2-D (matrix, matrix): standard matrix multiplication (m,k) x (k,n) -> (m,n)\n * - 2-D x 1-D (matrix, vector): matrix-vector product (m,k) x (k,) -> (m,)\n * - Both 3-D: batch matrix multiplication (b,m,k) x (b,k,n) -> (b,m,n)\n *\n * Other combinations (e.g., 1-D x 2-D, mixed dimensionalities above 3-D)\n * are not yet implemented and will throw a ShapeError.\n *\n * @param a - First tensor\n * @param b - Second tensor\n * @returns Dot product result\n */\nexport function dot(a: Tensor, b: Tensor): Tensor {\n const outDtype = resolveDotDtype(a.dtype, b.dtype);\n const isBigInt = outDtype === \"int64\";\n\n if (Array.isArray(a.data) || Array.isArray(b.data)) {\n throw new DTypeError(\"dot is not defined for string dtype\");\n }\n const aData = a.data;\n const bData = b.data;\n\n // Case 1: Both are 1-D vectors (inner product)\n if (a.ndim === 1 && b.ndim === 1) {\n if (a.shape[0] !== b.shape[0]) {\n throw new ShapeError(`shapes ${a.shape} and ${b.shape} not aligned`);\n }\n const size = a.shape[0] ?? 0;\n const aStride = a.strides[0] ?? 0;\n const bStride = b.strides[0] ?? 0;\n if (isBigInt) {\n if (!(aData instanceof BigInt64Array) || !(bData instanceof BigInt64Array)) {\n throw new DTypeError(\"dot requires int64 dtype\");\n }\n const bigA = aData;\n const bigB = bData;\n let sum = 0n;\n for (let i = 0; i < size; i++) {\n sum +=\n getBigIntElement(bigA, a.offset + i * aStride) *\n getBigIntElement(bigB, b.offset + i * bStride);\n }\n if (sum < INT64_MIN || sum > INT64_MAX) {\n throw new DataValidationError(\"int64 dot overflow\");\n }\n const result = new BigInt64Array(1);\n result[0] = sum;\n const scalarShape: Shape = [];\n return TensorClass.fromTypedArray({\n data: result,\n shape: scalarShape,\n dtype: \"int64\",\n device: a.device,\n });\n }\n if (aData instanceof BigInt64Array || bData instanceof BigInt64Array) {\n throw new DTypeError(\"dot requires non-int64 dtype\");\n }\n const numA = aData;\n const numB = bData;\n let sum = 0;\n for (let i = 0; i < size; i++) {\n sum +=\n getNumericElement(numA, a.offset + i * aStride) *\n getNumericElement(numB, b.offset + i * bStride);\n }\n const Ctor = dtypeToTypedArrayCtor(outDtype);\n const result = new Ctor(1);\n result[0] = sum;\n const scalarShape: Shape = [];\n return TensorClass.fromTypedArray({\n data: result,\n shape: scalarShape,\n dtype: outDtype,\n device: a.device,\n });\n }\n\n // Case 2: Both are 2-D matrices (matrix multiplication)\n if (a.ndim === 2 && b.ndim === 2) {\n const m = a.shape[0] ?? 0;\n const k1 = a.shape[1] ?? 0;\n const k2 = b.shape[0] ?? 0;\n const n = b.shape[1] ?? 0;\n\n if (k1 !== k2) {\n throw new ShapeError(\n `shapes ${a.shape} and ${b.shape} not aligned: ${k1} (dim 1) != ${k2} (dim 0)`\n );\n }\n\n const outSize = m * n;\n const Ctor = dtypeToTypedArrayCtor(outDtype);\n const result = new Ctor(outSize);\n\n if (isBigInt) {\n if (!(aData instanceof BigInt64Array) || !(bData instanceof BigInt64Array)) {\n throw new DTypeError(\"dot requires int64 dtype\");\n }\n if (!(result instanceof BigInt64Array)) {\n throw new DTypeError(\"Internal error: expected int64 output buffer\");\n }\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n let sum = 0n;\n for (let k = 0; k < k1; k++) {\n const aVal = getBigIntElement(\n aData,\n a.offset + i * (a.strides[0] ?? 0) + k * (a.strides[1] ?? 0)\n );\n const bVal = getBigIntElement(\n bData,\n b.offset + k * (b.strides[0] ?? 0) + j * (b.strides[1] ?? 0)\n );\n sum += aVal * bVal;\n }\n if (sum < INT64_MIN || sum > INT64_MAX) {\n throw new DataValidationError(\"int64 dot overflow\");\n }\n result[i * n + j] = sum;\n }\n }\n } else {\n if (aData instanceof BigInt64Array || bData instanceof BigInt64Array) {\n throw new DTypeError(\"dot requires non-int64 dtype\");\n }\n if (result instanceof BigInt64Array) {\n throw new DTypeError(\"Internal error: unexpected int64 output buffer\");\n }\n // Fast path: contiguous row-major layout — tiled i-k-j loop for cache locality\n const aS0 = a.strides[0] ?? 0;\n const aS1 = a.strides[1] ?? 0;\n const bS0 = b.strides[0] ?? 0;\n const bS1 = b.strides[1] ?? 0;\n const aOff = a.offset;\n const bOff = b.offset;\n const numA = aData;\n const numB = bData;\n const TILE = 32;\n for (let ii = 0; ii < m; ii += TILE) {\n const iEnd = ii + TILE < m ? ii + TILE : m;\n for (let kk = 0; kk < k1; kk += TILE) {\n const kEnd = kk + TILE < k1 ? kk + TILE : k1;\n for (let jj = 0; jj < n; jj += TILE) {\n const jEnd = jj + TILE < n ? jj + TILE : n;\n for (let i = ii; i < iEnd; i++) {\n const aBase = aOff + i * aS0;\n const rBase = i * n;\n for (let k = kk; k < kEnd; k++) {\n const aVal = numA[aBase + k * aS1] as number;\n const bBase = bOff + k * bS0;\n for (let j = jj; j < jEnd; j++) {\n result[rBase + j] =\n (result[rBase + j] as number) + aVal * (numB[bBase + j * bS1] as number);\n }\n }\n }\n }\n }\n }\n }\n\n return TensorClass.fromTypedArray({\n data: result,\n shape: [m, n],\n dtype: outDtype,\n device: a.device,\n });\n }\n\n // Case 3: Matrix-vector multiplication (2-D x 1-D)\n if (a.ndim === 2 && b.ndim === 1) {\n const m = a.shape[0] ?? 0;\n const k1 = a.shape[1] ?? 0;\n const k2 = b.shape[0] ?? 0;\n\n if (k1 !== k2) {\n throw new ShapeError(`shapes ${a.shape} and ${b.shape} not aligned`);\n }\n\n const Ctor = dtypeToTypedArrayCtor(outDtype);\n const result = new Ctor(m);\n\n if (isBigInt) {\n if (!(aData instanceof BigInt64Array) || !(bData instanceof BigInt64Array)) {\n throw new DTypeError(\"dot requires int64 dtype\");\n }\n if (!(result instanceof BigInt64Array)) {\n throw new DTypeError(\"Internal error: expected int64 output buffer\");\n }\n for (let i = 0; i < m; i++) {\n let sum = 0n;\n for (let k = 0; k < k1; k++) {\n const aVal = getBigIntElement(\n aData,\n a.offset + i * (a.strides[0] ?? 0) + k * (a.strides[1] ?? 0)\n );\n const bVal = getBigIntElement(bData, b.offset + k * (b.strides[0] ?? 0));\n sum += aVal * bVal;\n }\n if (sum < INT64_MIN || sum > INT64_MAX) {\n throw new DataValidationError(\"int64 dot overflow\");\n }\n result[i] = sum;\n }\n } else {\n if (aData instanceof BigInt64Array || bData instanceof BigInt64Array) {\n throw new DTypeError(\"dot requires non-int64 dtype\");\n }\n if (result instanceof BigInt64Array) {\n throw new DTypeError(\"Internal error: unexpected int64 output buffer\");\n }\n for (let i = 0; i < m; i++) {\n let sum = 0;\n for (let k = 0; k < k1; k++) {\n const aVal = getNumericElement(\n aData,\n a.offset + i * (a.strides[0] ?? 0) + k * (a.strides[1] ?? 0)\n );\n const bVal = getNumericElement(bData, b.offset + k * (b.strides[0] ?? 0));\n sum += aVal * bVal;\n }\n result[i] = sum;\n }\n }\n\n return TensorClass.fromTypedArray({\n data: result,\n shape: [m],\n dtype: outDtype,\n device: a.device,\n });\n }\n\n // Case 4: Higher dimensional tensors (batched matmul)\n if (a.ndim >= 3 || b.ndim >= 3) {\n if (a.ndim < 2 || b.ndim < 2) {\n throw new ShapeError(`dot not implemented for shapes ${a.shape} and ${b.shape}`);\n }\n\n const aBatchRank = Math.max(0, a.ndim - 2);\n const bBatchRank = Math.max(0, b.ndim - 2);\n const aBatchShape = a.shape.slice(0, aBatchRank);\n const bBatchShape = b.shape.slice(0, bBatchRank);\n\n let batchShape: number[];\n if (aBatchRank > 0 && bBatchRank > 0) {\n if (aBatchRank !== bBatchRank) {\n throw new ShapeError(`batch dimensions don't match: [${aBatchShape}] vs [${bBatchShape}]`);\n }\n for (let i = 0; i < aBatchRank; i++) {\n if (aBatchShape[i] !== bBatchShape[i]) {\n throw new ShapeError(\n `batch dimensions don't match: [${aBatchShape}] vs [${bBatchShape}]`\n );\n }\n }\n batchShape = aBatchShape;\n } else if (aBatchRank > 0) {\n batchShape = aBatchShape;\n } else if (bBatchRank > 0) {\n batchShape = bBatchShape;\n } else {\n throw new ShapeError(`dot not implemented for shapes ${a.shape} and ${b.shape}`);\n }\n\n const m = a.shape[a.ndim - 2] ?? 0;\n const k1 = a.shape[a.ndim - 1] ?? 0;\n const k2 = b.shape[b.ndim - 2] ?? 0;\n const n = b.shape[b.ndim - 1] ?? 0;\n\n if (k1 !== k2) {\n throw new ShapeError(`shapes not aligned for matmul`);\n }\n\n let batchSize = 1;\n for (const dim of batchShape) {\n batchSize *= dim;\n }\n\n const outShape = batchShape.length === 0 ? [m, n] : [...batchShape, m, n];\n const outSize = batchSize * m * n;\n const Ctor = dtypeToTypedArrayCtor(outDtype);\n const result = new Ctor(outSize);\n\n const aStrideM = a.strides[a.ndim - 2];\n const aStrideK = a.strides[a.ndim - 1];\n const bStrideK = b.strides[b.ndim - 2];\n const bStrideN = b.strides[b.ndim - 1];\n\n if (aStrideM === undefined || aStrideK === undefined) {\n throw new ShapeError(\"Internal error: missing strides for left operand\");\n }\n if (bStrideK === undefined || bStrideN === undefined) {\n throw new ShapeError(\"Internal error: missing strides for right operand\");\n }\n\n const aBatchStrides = aBatchRank > 0 ? a.strides.slice(0, aBatchRank) : [];\n const bBatchStrides = bBatchRank > 0 ? b.strides.slice(0, bBatchRank) : [];\n\n const batchOffset = (\n index: number,\n shape: readonly number[],\n strides: readonly number[],\n baseOffset: number\n ): number => {\n if (shape.length === 0) return baseOffset;\n let offset = baseOffset;\n let remaining = index;\n for (let d = shape.length - 1; d >= 0; d--) {\n const dim = shape[d] ?? 0;\n const stride = strides[d];\n if (stride === undefined) {\n throw new ShapeError(\"Internal error: missing batch stride\");\n }\n if (dim === 0) {\n return baseOffset;\n }\n const idx = remaining % dim;\n remaining = Math.floor(remaining / dim);\n offset += idx * stride;\n }\n return offset;\n };\n\n for (let b_idx = 0; b_idx < batchSize; b_idx++) {\n const aOffset =\n aBatchRank > 0 ? batchOffset(b_idx, batchShape, aBatchStrides, a.offset) : a.offset;\n const bOffset =\n bBatchRank > 0 ? batchOffset(b_idx, batchShape, bBatchStrides, b.offset) : b.offset;\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n if (isBigInt) {\n if (!(aData instanceof BigInt64Array) || !(bData instanceof BigInt64Array)) {\n throw new DTypeError(\"dot requires int64 dtype\");\n }\n if (!(result instanceof BigInt64Array)) {\n throw new DTypeError(\"Internal error: expected int64 output buffer\");\n }\n let sum = 0n;\n for (let k = 0; k < k1; k++) {\n const aVal = getBigIntElement(aData, aOffset + i * aStrideM + k * aStrideK);\n const bVal = getBigIntElement(bData, bOffset + k * bStrideK + j * bStrideN);\n sum += aVal * bVal;\n }\n const outIndex = b_idx * (m * n) + i * n + j;\n if (sum < INT64_MIN || sum > INT64_MAX) {\n throw new DataValidationError(\"int64 dot overflow\");\n }\n result[outIndex] = sum;\n } else {\n if (aData instanceof BigInt64Array || bData instanceof BigInt64Array) {\n throw new DTypeError(\"dot requires non-int64 dtype\");\n }\n if (result instanceof BigInt64Array) {\n throw new DTypeError(\"Internal error: unexpected int64 output buffer\");\n }\n let sum = 0;\n for (let k = 0; k < k1; k++) {\n const aVal = getNumericElement(aData, aOffset + i * aStrideM + k * aStrideK);\n const bVal = getNumericElement(bData, bOffset + k * bStrideK + j * bStrideN);\n sum += aVal * bVal;\n }\n const outIndex = b_idx * (m * n) + i * n + j;\n result[outIndex] = sum;\n }\n }\n }\n }\n\n return TensorClass.fromTypedArray({\n data: result,\n shape: outShape,\n dtype: outDtype,\n device: a.device,\n });\n }\n\n throw new ShapeError(`dot not implemented for shapes ${a.shape} and ${b.shape}`);\n}\n\n/**\n * Transpose a tensor by reversing or permuting its axes.\n *\n * @param t - Input tensor\n * @param axes - Permutation of axes (optional, defaults to reversing all axes)\n * @returns Transposed tensor\n *\n * @example\n * ```ts\n * const t = tensor([[1, 2], [3, 4]]);\n * const tT = transpose(t); // [[1, 3], [2, 4]]\n * ```\n */\nexport function transpose(t: Tensor, axes?: number[]): Tensor {\n return tensorTranspose(t, axes);\n}\n","/**\n * Shared internal helpers for ndarray/ops.\n *\n * These utilities are used across multiple ops modules (arithmetic, comparison,\n * logical, math, activation, trigonometry, reduction). Centralising them here\n * eliminates the ~30+ copy-pasted copies that previously lived in each file.\n *\n * @internal\n */\n\nimport {\n DataValidationError,\n DTypeError,\n getBigIntElement,\n getNumericElement,\n type TypedArray,\n} from \"../../core\";\nimport { offsetFromFlatIndex } from \"../tensor/strides\";\nimport { isBigIntArray } from \"../tensor/Tensor\";\n\n/**\n * Resolve the physical buffer offset for a logical flat index.\n *\n * For contiguous tensors this is a simple addition; for strided views it\n * falls back to the general `offsetFromFlatIndex` computation.\n */\nexport function flatOffset(\n flat: number,\n offset: number,\n contiguous: boolean,\n logicalStrides: readonly number[],\n strides: readonly number[]\n): number {\n return contiguous ? offset + flat : offsetFromFlatIndex(flat, logicalStrides, strides, offset);\n}\n\n/**\n * Convert a BigInt to a Number, throwing if the value exceeds\n * `Number.MAX_SAFE_INTEGER`.\n */\nexport function bigintToNumberSafe(v: bigint): number {\n const max = BigInt(Number.MAX_SAFE_INTEGER);\n const min = -max;\n if (v > max || v < min) {\n throw new DataValidationError(\"int64 value is too large to safely convert to number\");\n }\n return Number(v);\n}\n\n/**\n * Read an element from a TypedArray as a `number`, converting BigInt\n * values via `bigintToNumberSafe`.\n */\nexport function readAsNumberSafe(data: TypedArray, idx: number): number {\n if (isBigIntArray(data)) {\n return bigintToNumberSafe(getBigIntElement(data, idx));\n }\n return getNumericElement(data, idx);\n}\n\n/**\n * Read an element from a TypedArray, preserving its original type\n * (`bigint` or `number`).\n */\nexport function readElement(data: TypedArray, idx: number): bigint | number {\n if (isBigIntArray(data)) {\n return getBigIntElement(data, idx);\n }\n return getNumericElement(data, idx);\n}\n\n/**\n * Read an element as `number`, converting BigInt via `Number()` without\n * the safe-integer check. Use when the caller tolerates precision loss\n * (e.g. comparison ops that only need ordering).\n */\nexport function readAsNumber(data: TypedArray, idx: number): number {\n if (isBigIntArray(data)) {\n return Number(getBigIntElement(data, idx));\n }\n return getNumericElement(data, idx);\n}\n\n/**\n * Assert that tensor data is a numeric TypedArray (not string[]).\n *\n * @param opName - Operation name for the error message\n */\nexport function requireNumericData(data: TypedArray | string[], opName: string): TypedArray {\n if (Array.isArray(data)) {\n throw new DTypeError(`${opName} is not implemented for string dtype`);\n }\n return data;\n}\n","import {\n type Axis,\n DTypeError,\n dtypeToTypedArrayCtor,\n getBigIntElement,\n getNumericElement,\n normalizeAxis,\n} from \"../../core\";\nimport { isContiguous } from \"../tensor/strides\";\nimport { computeStrides, Tensor } from \"../tensor/Tensor\";\nimport { bigintToNumberSafe, flatOffset } from \"./_internal\";\n\nfunction floatOutputDType(dtype: Tensor[\"dtype\"]): \"float32\" | \"float64\" {\n // Preserve float32 precision, promote all other types to float64\n if (dtype === \"float32\") return \"float32\";\n return \"float64\";\n}\n\nfunction softplusScalar(x: number): number {\n if (x > 0) {\n return x + Math.log1p(Math.exp(-x));\n }\n return Math.log1p(Math.exp(x));\n}\n\nfunction toFloat64Dense(t: Tensor): Float64Array {\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"Tensor must have numeric data\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = bigintToNumberSafe(getBigIntElement(data, srcOffset));\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = getNumericElement(data, srcOffset);\n }\n }\n return out;\n}\n\n/**\n * Sigmoid activation function.\n *\n * Applies element-wise: sigmoid(x) = 1 / (1 + exp(-x))\n *\n * **Properties**:\n * - Output range: (0, 1)\n * - Smooth gradient\n * - Can suffer from vanishing gradients\n *\n * @example\n * ```ts\n * import { sigmoid, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([-1, 0, 1]);\n * const result = sigmoid(x); // [0.268..., 0.5, 0.731...]\n * ```\n *\n * @see {@link https://en.wikipedia.org/wiki/Sigmoid_function | Wikipedia: Sigmoid}\n */\nexport function sigmoid(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"sigmoid is not defined for string dtype\");\n }\n\n const dtype = floatOutputDType(t.dtype);\n const Ctor = dtypeToTypedArrayCtor(dtype);\n const out = new Ctor(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"sigmoid is not defined for string dtype\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const val = bigintToNumberSafe(getBigIntElement(data, srcOffset));\n out[i] = 1 / (1 + Math.exp(-val));\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const val = getNumericElement(data, srcOffset);\n out[i] = 1 / (1 + Math.exp(-val));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype,\n device: t.device,\n });\n}\n\n/**\n * Rectified Linear Unit activation.\n *\n * Applies element-wise: relu(x) = max(0, x)\n *\n * **Properties**:\n * - Output range: [0, ∞)\n * - Non-linear but simple\n * - Can suffer from dying ReLU problem\n *\n * @example\n * ```ts\n * import { relu, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([-1, 0, 1]);\n * const result = relu(x); // [0, 0, 1]\n * ```\n *\n * @see {@link https://en.wikipedia.org/wiki/Rectifier_(neural_networks) | Wikipedia: ReLU}\n */\nexport function relu(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"relu is not defined for string dtype\");\n }\n\n const dtype = floatOutputDType(t.dtype);\n const Ctor = dtypeToTypedArrayCtor(dtype);\n const out = new Ctor(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"relu is not defined for string dtype\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const val = bigintToNumberSafe(getBigIntElement(data, srcOffset));\n out[i] = Math.max(0, val);\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const val = getNumericElement(data, srcOffset);\n out[i] = Math.max(0, val);\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype,\n device: t.device,\n });\n}\n\n/**\n * Leaky ReLU activation.\n *\n * Applies element-wise: leaky_relu(x) = max(alpha * x, x)\n *\n * **Parameters**:\n * @param t - Input tensor\n * @param alpha - Slope for negative values (default: 0.01)\n *\n * @example\n * ```ts\n * import { leakyRelu, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([-1, 0, 1]);\n * const result = leakyRelu(x, 0.1); // [-0.1, 0, 1]\n * ```\n */\nexport function leakyRelu(t: Tensor, alpha = 0.01): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"leakyRelu is not defined for string dtype\");\n }\n\n const dtype = floatOutputDType(t.dtype);\n const Ctor = dtypeToTypedArrayCtor(dtype);\n const out = new Ctor(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"leakyRelu is not defined for string dtype\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const val = bigintToNumberSafe(getBigIntElement(data, srcOffset));\n out[i] = val > 0 ? val : alpha * val;\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const val = getNumericElement(data, srcOffset);\n out[i] = val > 0 ? val : alpha * val;\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype,\n device: t.device,\n });\n}\n\n/**\n * Exponential Linear Unit activation.\n *\n * Applies element-wise:\n * - elu(x) = x if x > 0\n * - elu(x) = alpha * (exp(x) - 1) if x <= 0\n *\n * **Parameters**:\n * @param t - Input tensor\n * @param alpha - Scale for negative values (default: 1.0)\n *\n * @example\n * ```ts\n * import { elu, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([-1, 0, 1]);\n * const result = elu(x);\n * ```\n */\nexport function elu(t: Tensor, alpha: number = 1.0): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"elu is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"elu is not defined for string dtype\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const val = bigintToNumberSafe(getBigIntElement(data, srcOffset));\n out[i] = val > 0 ? val : alpha * (Math.exp(val) - 1);\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const val = getNumericElement(data, srcOffset);\n out[i] = val > 0 ? val : alpha * (Math.exp(val) - 1);\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Gaussian Error Linear Unit activation.\n *\n * Applies element-wise: gelu(x) = x * Φ(x)\n * where Φ(x) is the cumulative distribution function of the standard normal distribution.\n *\n * **Algorithm**: Can use tanh approximation or erf function\n *\n * @example\n * ```ts\n * import { gelu, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([-1, 0, 1]);\n * const result = gelu(x);\n * ```\n *\n * @see Hendrycks & Gimpel (2016) \"Gaussian Error Linear Units (GELUs)\"\n */\nexport function gelu(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"gelu is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const sqrt2OverPi = Math.sqrt(2 / Math.PI);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"gelu is not defined for string dtype\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const x = bigintToNumberSafe(getBigIntElement(data, srcOffset));\n const x3 = x * x * x;\n out[i] = 0.5 * x * (1 + Math.tanh(sqrt2OverPi * (x + 0.044715 * x3)));\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const x = getNumericElement(data, srcOffset);\n const x3 = x * x * x;\n out[i] = 0.5 * x * (1 + Math.tanh(sqrt2OverPi * (x + 0.044715 * x3)));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Softmax activation function.\n *\n * Normalizes input to probability distribution over classes.\n * Applies along specified axis: softmax(x)_i = exp(x_i - max(x)) / sum(exp(x - max(x)))\n *\n * Uses numerically stable computation by subtracting the maximum value\n * along the axis before exponentiating.\n *\n * **Parameters**:\n * @param t - Input tensor of any dimensionality\n * @param axis - Axis along which to compute softmax (default: -1, i.e., last axis)\n *\n * **Properties**:\n * - Output sums to 1 along the specified axis\n * - Output values in (0, 1)\n * - Supports tensors of any dimensionality\n *\n * Output dtype:\n * - `float64`\n *\n * @example\n * ```ts\n * import { softmax, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([[1, 2, 3], [1, 2, 3]]);\n * const result = softmax(x, 1); // Each row sums to 1\n *\n * const x3d = tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]);\n * const result3d = softmax(x3d, -1); // Softmax along last axis\n * ```\n *\n * @see {@link https://en.wikipedia.org/wiki/Softmax_function | Wikipedia: Softmax}\n */\nexport function softmax(t: Tensor, axis: Axis = -1): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"softmax is not defined for string dtype\");\n }\n\n // Normalize negative axis\n const actualAxis = normalizeAxis(axis, t.ndim);\n\n const out = new Float64Array(t.size);\n\n // Convert data to contiguous float64 values in logical order\n const data = toFloat64Dense(t);\n\n // Compute the size of dimensions before, at, and after the softmax axis\n let outerSize = 1;\n for (let i = 0; i < actualAxis; i++) {\n outerSize *= t.shape[i] ?? 1;\n }\n const axisSize = t.shape[actualAxis] ?? 1;\n let innerSize = 1;\n for (let i = actualAxis + 1; i < t.ndim; i++) {\n innerSize *= t.shape[i] ?? 1;\n }\n\n // Reuse expBuffer across all slices to minimize allocations\n // This reduces memory allocations from O(outerSize * innerSize) to O(1)\n const expBuffer = new Float64Array(axisSize);\n\n // For each \"slice\" perpendicular to the softmax axis\n for (let outer = 0; outer < outerSize; outer++) {\n for (let inner = 0; inner < innerSize; inner++) {\n // Compute base offset for this slice\n // baseOffset = outer * (axisSize * innerSize) + inner\n const baseOffset = outer * axisSize * innerSize + inner;\n\n // Step 1: Find max along axis for numerical stability\n let maxVal = -Infinity;\n for (let k = 0; k < axisSize; k++) {\n const idx = baseOffset + k * innerSize;\n const val = data[idx] ?? 0;\n if (val > maxVal) maxVal = val;\n }\n\n // Step 2: Compute exp(x - max) and sum\n let sumExp = 0;\n for (let k = 0; k < axisSize; k++) {\n const idx = baseOffset + k * innerSize;\n const expVal = Math.exp((data[idx] ?? 0) - maxVal);\n expBuffer[k] = expVal;\n sumExp += expVal;\n }\n\n // Step 3: Normalize by sum\n for (let k = 0; k < axisSize; k++) {\n const idx = baseOffset + k * innerSize;\n out[idx] = (expBuffer[k] ?? 0) / sumExp;\n }\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Log-Softmax activation function.\n *\n * Computes log(softmax(x)) in a numerically stable way.\n * Uses the identity: log_softmax(x) = x - max(x) - log(sum(exp(x - max(x))))\n *\n * **Parameters**:\n * @param t - Input tensor of any dimensionality\n * @param axis - Axis along which to compute log-softmax (default: -1, i.e., last axis)\n *\n * **Properties**:\n * - More numerically stable than computing log(softmax(x)) directly\n * - Output values are log probabilities (negative values, sum to 0 when exp'd)\n * - Supports tensors of any dimensionality\n *\n * Output dtype:\n * - `float64`\n *\n * **Performance**:\n * - Time complexity: O(n) where n is the tensor size\n * - Space complexity: O(axisSize) for temporary buffer (reused across slices)\n * - More efficient than computing log(softmax(x)) separately\n *\n * @example\n * ```ts\n * import { logSoftmax, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([[1, 2, 3]]);\n * const result = logSoftmax(x, 1);\n *\n * const x3d = tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]);\n * const result3d = logSoftmax(x3d, -1); // Log-softmax along last axis\n * ```\n */\nexport function logSoftmax(t: Tensor, axis: Axis = -1): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"logSoftmax is not defined for string dtype\");\n }\n\n // Normalize negative axis\n const actualAxis = normalizeAxis(axis, t.ndim);\n\n const out = new Float64Array(t.size);\n\n // Convert data to contiguous float64 values in logical order\n const data = toFloat64Dense(t);\n\n // Compute the size of dimensions before, at, and after the softmax axis\n let outerSize = 1;\n for (let i = 0; i < actualAxis; i++) {\n outerSize *= t.shape[i] ?? 1;\n }\n const axisSize = t.shape[actualAxis] ?? 1;\n let innerSize = 1;\n for (let i = actualAxis + 1; i < t.ndim; i++) {\n innerSize *= t.shape[i] ?? 1;\n }\n\n // For each \"slice\" perpendicular to the softmax axis\n for (let outer = 0; outer < outerSize; outer++) {\n for (let inner = 0; inner < innerSize; inner++) {\n // Compute base offset for this slice\n const baseOffset = outer * axisSize * innerSize + inner;\n\n // Step 1: Find max along axis for numerical stability\n let maxVal = -Infinity;\n for (let k = 0; k < axisSize; k++) {\n const idx = baseOffset + k * innerSize;\n const val = data[idx] ?? 0;\n if (val > maxVal) maxVal = val;\n }\n\n // Step 2: Compute log(sum(exp(x - max)))\n let sumExp = 0;\n for (let k = 0; k < axisSize; k++) {\n const idx = baseOffset + k * innerSize;\n sumExp += Math.exp((data[idx] ?? 0) - maxVal);\n }\n const logSumExp = maxVal + Math.log(sumExp);\n\n // Step 3: Compute log_softmax = x - log_sum_exp\n for (let k = 0; k < axisSize; k++) {\n const idx = baseOffset + k * innerSize;\n out[idx] = (data[idx] ?? 0) - logSumExp;\n }\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Swish activation function (also known as SiLU).\n *\n * Applies element-wise: swish(x) = x * sigmoid(x)\n *\n * @example\n * ```ts\n * import { swish, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([-1, 0, 1]);\n * const result = swish(x);\n * ```\n *\n * @see Ramachandran et al. (2017) \"Searching for Activation Functions\"\n */\nexport function swish(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"swish is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"swish is not defined for string dtype\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const val = bigintToNumberSafe(getBigIntElement(data, srcOffset));\n out[i] = val / (1 + Math.exp(-val));\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const val = getNumericElement(data, srcOffset);\n out[i] = val / (1 + Math.exp(-val));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Mish activation function.\n *\n * Applies element-wise: mish(x) = x * tanh(softplus(x))\n * where softplus(x) = log(1 + exp(x))\n *\n * @example\n * ```ts\n * import { mish, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([-1, 0, 1]);\n * const result = mish(x);\n * ```\n *\n * @see Misra (2019) \"Mish: A Self Regularized Non-Monotonic Activation Function\"\n */\nexport function mish(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"mish is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"mish is not defined for string dtype\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const x = bigintToNumberSafe(getBigIntElement(data, srcOffset));\n out[i] = x * Math.tanh(softplusScalar(x));\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const x = getNumericElement(data, srcOffset);\n out[i] = x * Math.tanh(softplusScalar(x));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Softplus activation function.\n *\n * Smooth approximation of ReLU: softplus(x) = log(1 + exp(x))\n *\n * @example\n * ```ts\n * import { softplus, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([-1, 0, 1]);\n * const result = softplus(x);\n * ```\n */\nexport function softplus(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"softplus is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"softplus is not defined for string dtype\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const val = bigintToNumberSafe(getBigIntElement(data, srcOffset));\n out[i] = softplusScalar(val);\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const val = getNumericElement(data, srcOffset);\n out[i] = softplusScalar(val);\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n","import { type DType, DTypeError, getArrayElement, type Shape, ShapeError } from \"../../core\";\nimport type { Tensor } from \"../tensor/Tensor\";\n\nexport function isScalar(t: Tensor): boolean {\n return t.ndim === 0 && t.size === 1;\n}\n\nexport function ensureNumericDType(\n t: Tensor,\n op: string\n): asserts t is Tensor<Shape, Exclude<DType, \"string\">> {\n if (t.dtype === \"string\") {\n throw new DTypeError(`${op} is not defined for string dtype`);\n }\n}\n\nexport function ensureSameDType(a: Tensor, b: Tensor): void {\n if (a.dtype !== b.dtype) {\n throw new DTypeError(`DType mismatch: ${a.dtype} vs ${b.dtype}`);\n }\n}\n\nexport function ensureBroadcastableScalar(a: Tensor, b: Tensor): void {\n if (!isScalar(a) && !isScalar(b) && !canBroadcast(a.shape, b.shape)) {\n throw ShapeError.mismatch(a.shape, b.shape, \"broadcast\");\n }\n}\n\nexport function canBroadcast(shapeA: Shape, shapeB: Shape): boolean {\n const maxLen = Math.max(shapeA.length, shapeB.length);\n for (let i = 0; i < maxLen; i++) {\n const dimA = getArrayElement(shapeA, shapeA.length - 1 - i, 1);\n const dimB = getArrayElement(shapeB, shapeB.length - 1 - i, 1);\n if (dimA === dimB || dimA === 1 || dimB === 1) {\n continue;\n }\n // Explicitly reject broadcasting 0 with anything other than 1 or 0,\n // which is covered by the condition above.\n if (dimA === 0 || dimB === 0) {\n return false;\n }\n return false;\n }\n return true;\n}\n\nexport function getBroadcastShape(shapeA: Shape, shapeB: Shape): Shape {\n const maxLen = Math.max(shapeA.length, shapeB.length);\n const result: number[] = [];\n for (let i = 0; i < maxLen; i++) {\n const dimA = getArrayElement(shapeA, shapeA.length - 1 - i, 1);\n const dimB = getArrayElement(shapeB, shapeB.length - 1 - i, 1);\n if (dimA === dimB) {\n result.unshift(dimA);\n } else if (dimA === 1) {\n result.unshift(dimB);\n } else if (dimB === 1) {\n result.unshift(dimA);\n } else if (dimA === 0 || dimB === 0) {\n // If one dimension is 0, the broadcasted dimension is 0.\n // This is only allowed if the other is 1 (handled above) or they are equal.\n // If we are here, it's an invalid broadcast like (0, 2), which should fail.\n throw ShapeError.mismatch(shapeA, shapeB, \"broadcast\");\n } else {\n throw ShapeError.mismatch(shapeA, shapeB, \"broadcast\");\n }\n }\n return result;\n}\n\n/**\n * Iterates over two broadcasted tensors and an output tensor efficiently.\n *\n * This avoids expensive index calculations (division/modulo) inside the inner loop\n * by maintaining running offsets for all tensors.\n *\n * @param a - First input tensor\n * @param b - Second input tensor\n * @param out - Output tensor (must have broadcasted shape)\n * @param op - Callback to execute for each element: (offsetA, offsetB, offsetOut)\n */\nexport function broadcastApply(\n a: Tensor,\n b: Tensor,\n out: Tensor,\n op: (offA: number, offB: number, offOut: number) => void\n): void {\n if (out.size === 0) return;\n\n // Handle scalar case (rank 0)\n if (out.ndim === 0) {\n op(a.offset, b.offset, out.offset);\n return;\n }\n\n // Pre-compute strides for A and B relative to Output shape\n const outShape = out.shape;\n const outStrides = out.strides;\n const rank = outShape.length;\n\n const stridesA = new Array<number>(rank).fill(0);\n const stridesB = new Array<number>(rank).fill(0);\n\n const rankDiffA = rank - a.ndim;\n for (let i = 0; i < rank; i++) {\n if (i >= rankDiffA) {\n const dim = a.shape[i - rankDiffA] ?? 1;\n // If dim is 1, stride is 0 (broadcast). Otherwise, use actual stride.\n if (dim > 1) {\n stridesA[i] = a.strides[i - rankDiffA] ?? 0;\n }\n }\n }\n\n const rankDiffB = rank - b.ndim;\n for (let i = 0; i < rank; i++) {\n if (i >= rankDiffB) {\n const dim = b.shape[i - rankDiffB] ?? 1;\n if (dim > 1) {\n stridesB[i] = b.strides[i - rankDiffB] ?? 0;\n }\n }\n }\n\n // Loop state\n const idx = new Array<number>(rank).fill(0);\n let offA = a.offset;\n let offB = b.offset;\n let offOut = out.offset;\n\n while (true) {\n op(offA, offB, offOut);\n\n // Odometer increment\n let axis = rank - 1;\n for (;;) {\n const currentIdx = idx[axis];\n if (currentIdx === undefined) {\n // Should never happen if rank matches idx length\n return;\n }\n const nextIdx = currentIdx + 1;\n idx[axis] = nextIdx;\n\n const strideA = stridesA[axis];\n const strideB = stridesB[axis];\n const strideOut = outStrides[axis];\n const dimOut = outShape[axis];\n\n if (strideA === undefined || strideB === undefined || dimOut === undefined) {\n // Should never happen if shapes/strides are valid\n return;\n }\n\n offA += strideA;\n offB += strideB;\n offOut += strideOut ?? 0;\n\n if (nextIdx < dimOut) {\n break;\n }\n\n // Carry: reset index and offset for this axis\n // nextIdx is now dimOut\n const count = nextIdx;\n offA -= strideA * count;\n offB -= strideB * count;\n offOut -= (strideOut ?? 0) * count;\n idx[axis] = 0;\n axis--;\n\n if (axis < 0) return;\n }\n }\n}\n","import {\n type DType,\n DTypeError,\n dtypeToTypedArrayCtor,\n getBigIntElement,\n getNumericElement,\n InvalidParameterError,\n type Shape,\n} from \"../../core\";\nimport type { NumericTypedArray } from \"../../core/utils/typedArrayAccess\";\nimport { isContiguous } from \"../tensor/strides\";\nimport { computeStrides, isBigIntArray, Tensor } from \"../tensor/Tensor\";\nimport { flatOffset } from \"./_internal\";\nimport {\n broadcastApply,\n ensureBroadcastableScalar,\n ensureNumericDType,\n ensureSameDType,\n getBroadcastShape,\n isScalar,\n} from \"./broadcast\";\n\n/**\n * Check if two tensors are eligible for the contiguous fast path:\n * same shape, both contiguous, both at offset 0, both non-BigInt numeric.\n * Returns the raw numeric typed arrays if eligible, or null otherwise.\n */\nfunction fastPathArrays(\n a: Tensor,\n b: Tensor\n): { aArr: NumericTypedArray; bArr: NumericTypedArray; size: number } | null {\n if (a.size === 0) return null;\n if (a.dtype === \"int64\" || b.dtype === \"int64\") return null;\n const aData = a.data;\n const bData = b.data;\n if (Array.isArray(aData) || Array.isArray(bData)) return null;\n if (aData instanceof BigInt64Array || bData instanceof BigInt64Array) return null;\n // Same shape check\n if (a.ndim !== b.ndim) return null;\n for (let i = 0; i < a.ndim; i++) {\n if (a.shape[i] !== b.shape[i]) return null;\n }\n // Contiguous with zero offset\n if (a.offset !== 0 || b.offset !== 0) return null;\n if (!isContiguous(a.shape, a.strides) || !isContiguous(b.shape, b.strides)) return null;\n return { aArr: aData, bArr: bData, size: a.size };\n}\n\nfunction outDtypeForTrueDiv(dtype: Exclude<DType, \"string\">): Exclude<DType, \"string\"> {\n if (dtype === \"float32\" || dtype === \"float64\") return dtype;\n return \"float64\";\n}\n\n/**\n * Floor division for bigint values (Python/NumPy semantics).\n *\n * JavaScript bigint division truncates toward zero. NumPy floor division\n * rounds toward -Infinity, so negative values with a remainder need\n * an additional decrement.\n */\nfunction floorDivBigInt(a: bigint, b: bigint): bigint {\n const q = a / b;\n const r = a % b;\n const rPositive = r > 0n;\n const bPositive = b > 0n;\n if (r !== 0n && rPositive !== bPositive) {\n return q - 1n;\n }\n return q;\n}\n\nfunction floorDivNumber(a: number, b: number): number {\n return Math.floor(a / b);\n}\n\n/**\n * NumPy-compatible modulo: remainder has the same sign as divisor.\n */\nfunction modNumber(a: number, b: number): number {\n return a - floorDivNumber(a, b) * b;\n}\n\nfunction modBigInt(a: bigint, b: bigint): bigint {\n return a - floorDivBigInt(a, b) * b;\n}\n\nfunction hasNegativeExponent(t: Tensor): boolean {\n if (t.size === 0) return false;\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n if (t.data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const offset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n if (getBigIntElement(t.data, offset) < 0n) return true;\n }\n return false;\n }\n const numericData = t.data;\n if (Array.isArray(numericData)) {\n // String tensor, effectively no negative numeric exponents\n return false;\n }\n for (let i = 0; i < t.size; i++) {\n const offset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n if (getNumericElement(numericData, offset) < 0) return true;\n }\n return false;\n}\n\n/**\n * Element-wise addition.\n *\n * Supported:\n * - Standard broadcasting semantics (including scalar and dimension-1 broadcast)\n */\nexport function add(a: Tensor, b: Tensor): Tensor {\n ensureNumericDType(a, \"add\");\n ensureNumericDType(b, \"add\");\n ensureSameDType(a, b);\n ensureBroadcastableScalar(a, b);\n\n // Fast path: contiguous same-shape numeric tensors\n const fp = fastPathArrays(a, b);\n if (fp) {\n const Ctor = dtypeToTypedArrayCtor(a.dtype);\n const out = new Ctor(fp.size);\n const aArr = fp.aArr;\n const bArr = fp.bArr;\n for (let i = 0; i < fp.size; i++) {\n out[i] = (aArr[i] as number) + (bArr[i] as number);\n }\n return Tensor.fromTypedArray({\n data: out,\n shape: a.shape,\n dtype: a.dtype,\n device: a.device,\n });\n }\n\n // Handle broadcasting\n const aIsScalar = isScalar(a);\n const bIsScalar = isScalar(b);\n const outShape: Shape = aIsScalar\n ? b.shape\n : bIsScalar\n ? a.shape\n : getBroadcastShape(a.shape, b.shape);\n const outSize = outShape.reduce((acc, dim) => acc * dim, 1);\n\n const Ctor = dtypeToTypedArrayCtor(a.dtype);\n const out = new Ctor(outSize);\n const result = Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: a.dtype,\n device: a.device,\n });\n\n if (isBigIntArray(out) && isBigIntArray(a.data) && isBigIntArray(b.data)) {\n const aData = a.data;\n const bData = b.data;\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n out[offOut] = getBigIntElement(aData, offA) + getBigIntElement(bData, offB);\n });\n } else if (!isBigIntArray(out) && !isBigIntArray(a.data) && !isBigIntArray(b.data)) {\n const aData = a.data;\n const bData = b.data;\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n out[offOut] = getNumericElement(aData, offA) + getNumericElement(bData, offB);\n });\n }\n\n return result;\n}\n\nfunction getOutShape(a: Tensor, b: Tensor): Shape {\n if (isScalar(a)) return b.shape;\n if (isScalar(b)) return a.shape;\n return getBroadcastShape(a.shape, b.shape);\n}\n\n/**\n * Element-wise subtraction.\n *\n * Computes a - b element by element.\n *\n * Broadcasting: supports standard numpy-style broadcasting.\n *\n * @param a - First tensor\n * @param b - Second tensor\n * @returns Tensor containing element-wise difference\n *\n * @example\n * ```ts\n * import { sub, tensor } from 'deepbox/ndarray';\n *\n * const a = tensor([5, 6, 7]);\n * const b = tensor([1, 2, 3]);\n * const result = sub(a, b); // [4, 4, 4]\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.subtract.html | NumPy subtract}\n */\nexport function sub(a: Tensor, b: Tensor): Tensor {\n ensureNumericDType(a, \"sub\");\n ensureNumericDType(b, \"sub\");\n ensureSameDType(a, b);\n ensureBroadcastableScalar(a, b);\n\n // Fast path: contiguous same-shape numeric tensors\n const fp = fastPathArrays(a, b);\n if (fp) {\n const Ctor = dtypeToTypedArrayCtor(a.dtype);\n const out = new Ctor(fp.size);\n const aArr = fp.aArr;\n const bArr = fp.bArr;\n for (let i = 0; i < fp.size; i++) {\n out[i] = (aArr[i] as number) - (bArr[i] as number);\n }\n return Tensor.fromTypedArray({\n data: out,\n shape: a.shape,\n dtype: a.dtype,\n device: a.device,\n });\n }\n\n const outShape = getOutShape(a, b);\n const outSize = outShape.reduce((acc, dim) => acc * dim, 1);\n\n const Ctor = dtypeToTypedArrayCtor(a.dtype);\n const out = new Ctor(outSize);\n const result = Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: a.dtype,\n device: a.device,\n });\n\n if (isBigIntArray(out) && isBigIntArray(a.data) && isBigIntArray(b.data)) {\n const aData = a.data;\n const bData = b.data;\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n out[offOut] = getBigIntElement(aData, offA) - getBigIntElement(bData, offB);\n });\n } else if (!isBigIntArray(out) && !isBigIntArray(a.data) && !isBigIntArray(b.data)) {\n const aData = a.data;\n const bData = b.data;\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n out[offOut] = getNumericElement(aData, offA) - getNumericElement(bData, offB);\n });\n }\n\n return result;\n}\n\n/**\n * Element-wise multiplication.\n *\n * Computes a * b element by element.\n *\n * Broadcasting: supports standard numpy-style broadcasting.\n *\n * @param a - First tensor\n * @param b - Second tensor\n * @returns Tensor containing element-wise product\n *\n * @example\n * ```ts\n * import { mul, tensor } from 'deepbox/ndarray';\n *\n * const a = tensor([2, 3, 4]);\n * const b = tensor([5, 6, 7]);\n * const result = mul(a, b); // [10, 18, 28]\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.multiply.html | NumPy multiply}\n */\nexport function mul(a: Tensor, b: Tensor): Tensor {\n ensureNumericDType(a, \"mul\");\n ensureNumericDType(b, \"mul\");\n ensureSameDType(a, b);\n ensureBroadcastableScalar(a, b);\n\n // Fast path: contiguous same-shape numeric tensors\n const fp = fastPathArrays(a, b);\n if (fp) {\n const Ctor = dtypeToTypedArrayCtor(a.dtype);\n const out = new Ctor(fp.size);\n const aArr = fp.aArr;\n const bArr = fp.bArr;\n for (let i = 0; i < fp.size; i++) {\n out[i] = (aArr[i] as number) * (bArr[i] as number);\n }\n return Tensor.fromTypedArray({\n data: out,\n shape: a.shape,\n dtype: a.dtype,\n device: a.device,\n });\n }\n\n const outShape = getOutShape(a, b);\n const outSize = outShape.reduce((acc, dim) => acc * dim, 1);\n\n const Ctor = dtypeToTypedArrayCtor(a.dtype);\n const out = new Ctor(outSize);\n const result = Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: a.dtype,\n device: a.device,\n });\n\n if (isBigIntArray(out) && isBigIntArray(a.data) && isBigIntArray(b.data)) {\n const aData = a.data;\n const bData = b.data;\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n out[offOut] = getBigIntElement(aData, offA) * getBigIntElement(bData, offB);\n });\n } else if (!isBigIntArray(out) && !isBigIntArray(a.data) && !isBigIntArray(b.data)) {\n const aData = a.data;\n const bData = b.data;\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n out[offOut] = getNumericElement(aData, offA) * getNumericElement(bData, offB);\n });\n }\n\n return result;\n}\n\n/**\n * Element-wise division.\n *\n * Computes a / b element by element.\n *\n * Broadcasting: supports standard numpy-style broadcasting.\n *\n * @param a - Numerator tensor\n * @param b - Denominator tensor\n * @returns Tensor containing element-wise quotient\n *\n * @example\n * ```ts\n * import { div, tensor } from 'deepbox/ndarray';\n *\n * const a = tensor([10, 20, 30]);\n * const b = tensor([2, 4, 5]);\n * const result = div(a, b); // [5, 5, 6]\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.divide.html | NumPy divide}\n */\nexport function div(a: Tensor, b: Tensor): Tensor {\n ensureNumericDType(a, \"div\");\n ensureNumericDType(b, \"div\");\n ensureSameDType(a, b);\n ensureBroadcastableScalar(a, b);\n\n // Fast path: contiguous same-shape float tensors (no dtype promotion needed)\n const outDtype = outDtypeForTrueDiv(a.dtype);\n const fp = fastPathArrays(a, b);\n if (fp && outDtype === a.dtype) {\n const Ctor = dtypeToTypedArrayCtor(outDtype);\n const out = new Ctor(fp.size);\n const aArr = fp.aArr;\n const bArr = fp.bArr;\n for (let i = 0; i < fp.size; i++) {\n out[i] = (aArr[i] as number) / (bArr[i] as number);\n }\n return Tensor.fromTypedArray({\n data: out,\n shape: a.shape,\n dtype: outDtype,\n device: a.device,\n });\n }\n\n const outShape = getOutShape(a, b);\n const outSize = outShape.reduce((acc, dim) => acc * dim, 1);\n\n const Ctor = dtypeToTypedArrayCtor(outDtype);\n const out = new Ctor(outSize);\n const result = Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: outDtype,\n device: a.device,\n });\n\n if (isBigIntArray(out) && isBigIntArray(a.data) && isBigIntArray(b.data)) {\n const aData = a.data;\n const bData = b.data;\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n out[offOut] = getBigIntElement(aData, offA) / getBigIntElement(bData, offB);\n });\n } else if (!isBigIntArray(out) && isBigIntArray(a.data) && isBigIntArray(b.data)) {\n const aData = a.data;\n const bData = b.data;\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n out[offOut] = Number(getBigIntElement(aData, offA)) / Number(getBigIntElement(bData, offB));\n });\n } else if (!isBigIntArray(out) && !isBigIntArray(a.data) && !isBigIntArray(b.data)) {\n const aData = a.data;\n const bData = b.data;\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n out[offOut] = getNumericElement(aData, offA) / getNumericElement(bData, offB);\n });\n }\n\n return result;\n}\n\n/**\n * Add a scalar value to all elements of a tensor.\n *\n * @param t - Input tensor\n * @param s - Scalar value to add\n * @returns New tensor with scalar added to all elements\n *\n * @example\n * ```ts\n * import { addScalar, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([1, 2, 3]);\n * const result = addScalar(x, 10); // [11, 12, 13]\n * ```\n */\nexport function addScalar(t: Tensor, s: number): Tensor {\n ensureNumericDType(t, \"addScalar\");\n const Ctor = dtypeToTypedArrayCtor(t.dtype);\n const out = new Ctor(t.size);\n const contiguous = isContiguous(t.shape, t.strides);\n\n if (isBigIntArray(out) && isBigIntArray(t.data)) {\n const scalar = BigInt(Math.trunc(s));\n const logicalStrides = computeStrides(t.shape);\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = getBigIntElement(t.data, srcOffset) + scalar;\n }\n } else if (!isBigIntArray(out) && !isBigIntArray(t.data)) {\n const numData = t.data;\n if (!Array.isArray(numData)) {\n // Fast path: contiguous zero-offset\n if (contiguous && t.offset === 0) {\n for (let i = 0; i < t.size; i++) {\n out[i] = (numData[i] as number) + s;\n }\n } else {\n const logicalStrides = computeStrides(t.shape);\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = getNumericElement(numData, srcOffset) + s;\n }\n }\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: t.dtype,\n device: t.device,\n });\n}\n\n/**\n * Multiply all elements of a tensor by a scalar value.\n *\n * @param t - Input tensor\n * @param s - Scalar multiplier\n * @returns New tensor with all elements multiplied by scalar\n *\n * @example\n * ```ts\n * import { mulScalar, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([1, 2, 3]);\n * const result = mulScalar(x, 10); // [10, 20, 30]\n * ```\n */\nexport function mulScalar(t: Tensor, s: number): Tensor {\n ensureNumericDType(t, \"mulScalar\");\n const Ctor = dtypeToTypedArrayCtor(t.dtype);\n const out = new Ctor(t.size);\n const contiguous = isContiguous(t.shape, t.strides);\n\n if (isBigIntArray(out) && isBigIntArray(t.data)) {\n const scalar = BigInt(Math.trunc(s));\n const logicalStrides = computeStrides(t.shape);\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = getBigIntElement(t.data, srcOffset) * scalar;\n }\n } else if (!isBigIntArray(out) && !isBigIntArray(t.data)) {\n const numData = t.data;\n if (!Array.isArray(numData)) {\n // Fast path: contiguous zero-offset\n if (contiguous && t.offset === 0) {\n for (let i = 0; i < t.size; i++) {\n out[i] = (numData[i] as number) * s;\n }\n } else {\n const logicalStrides = computeStrides(t.shape);\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = getNumericElement(numData, srcOffset) * s;\n }\n }\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: t.dtype,\n device: t.device,\n });\n}\n\n/**\n * Element-wise floor division.\n *\n * Computes the largest integer less than or equal to the quotient.\n *\n * @example\n * ```ts\n * import { floorDiv, tensor } from 'deepbox/ndarray';\n *\n * const a = tensor([7, 8, 9]);\n * const b = tensor([3, 3, 3]);\n * const result = floorDiv(a, b); // [2, 2, 3]\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.floor_divide.html | NumPy floor_divide}\n */\nexport function floorDiv(a: Tensor, b: Tensor): Tensor {\n ensureNumericDType(a, \"floorDiv\");\n ensureNumericDType(b, \"floorDiv\");\n ensureSameDType(a, b);\n ensureBroadcastableScalar(a, b);\n\n const outShape = getOutShape(a, b);\n const outSize = outShape.reduce((acc, dim) => acc * dim, 1);\n\n const Ctor = dtypeToTypedArrayCtor(a.dtype);\n const out = new Ctor(outSize);\n const result = Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: a.dtype,\n device: a.device,\n });\n\n if (isBigIntArray(out) && isBigIntArray(a.data) && isBigIntArray(b.data)) {\n const aData = a.data;\n const bData = b.data;\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n out[offOut] = floorDivBigInt(getBigIntElement(aData, offA), getBigIntElement(bData, offB));\n });\n } else if (!isBigIntArray(out) && !isBigIntArray(a.data) && !isBigIntArray(b.data)) {\n const aData = a.data;\n const bData = b.data;\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n out[offOut] = floorDivNumber(getNumericElement(aData, offA), getNumericElement(bData, offB));\n });\n }\n\n return result;\n}\n\n/**\n * Element-wise modulo operation.\n *\n * Returns remainder of division.\n *\n * @example\n * ```ts\n * import { mod, tensor } from 'deepbox/ndarray';\n *\n * const a = tensor([7, 8, 9]);\n * const b = tensor([3, 3, 3]);\n * const result = mod(a, b); // [1, 2, 0]\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.mod.html | NumPy mod}\n */\nexport function mod(a: Tensor, b: Tensor): Tensor {\n ensureNumericDType(a, \"mod\");\n ensureNumericDType(b, \"mod\");\n ensureSameDType(a, b);\n ensureBroadcastableScalar(a, b);\n\n const outShape = getOutShape(a, b);\n const outSize = outShape.reduce((acc, dim) => acc * dim, 1);\n\n const Ctor = dtypeToTypedArrayCtor(a.dtype);\n const out = new Ctor(outSize);\n const result = Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: a.dtype,\n device: a.device,\n });\n\n if (isBigIntArray(out) && isBigIntArray(a.data) && isBigIntArray(b.data)) {\n const aData = a.data;\n const bData = b.data;\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n out[offOut] = modBigInt(getBigIntElement(aData, offA), getBigIntElement(bData, offB));\n });\n } else if (!isBigIntArray(out) && !isBigIntArray(a.data) && !isBigIntArray(b.data)) {\n const aData = a.data;\n const bData = b.data;\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n out[offOut] = modNumber(getNumericElement(aData, offA), getNumericElement(bData, offB));\n });\n }\n\n return result;\n}\n\n/**\n * Element-wise power.\n *\n * Raises elements of first tensor to powers from second tensor.\n *\n * @example\n * ```ts\n * import { pow, tensor } from 'deepbox/ndarray';\n *\n * const a = tensor([2, 3, 4]);\n * const b = tensor([2, 3, 2]);\n * const result = pow(a, b); // [4, 27, 16]\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.power.html | NumPy power}\n */\nexport function pow(a: Tensor, b: Tensor): Tensor {\n ensureNumericDType(a, \"pow\");\n ensureNumericDType(b, \"pow\");\n ensureSameDType(a, b);\n ensureBroadcastableScalar(a, b);\n\n const outShape = getOutShape(a, b);\n const outSize = outShape.reduce((acc, dim) => acc * dim, 1);\n\n const promoteToFloat = (a.dtype === \"int32\" || a.dtype === \"int64\") && hasNegativeExponent(b);\n const outDtype = promoteToFloat ? \"float64\" : a.dtype;\n const Ctor = dtypeToTypedArrayCtor(outDtype);\n const out = new Ctor(outSize);\n const result = Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: outDtype,\n device: a.device,\n });\n\n if (outDtype === \"float64\" || outDtype === \"float32\") {\n const aData = a.data;\n const bData = b.data;\n\n // Use specific branches for best performance to avoid repeated checks\n if (isBigIntArray(aData)) {\n if (isBigIntArray(bData)) {\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n out[offOut] =\n Number(getBigIntElement(aData, offA)) ** Number(getBigIntElement(bData, offB));\n });\n } else {\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n out[offOut] = Number(getBigIntElement(aData, offA)) ** getNumericElement(bData, offB);\n });\n }\n } else {\n if (isBigIntArray(bData)) {\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n out[offOut] = getNumericElement(aData, offA) ** Number(getBigIntElement(bData, offB));\n });\n } else {\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n out[offOut] = getNumericElement(aData, offA) ** getNumericElement(bData, offB);\n });\n }\n }\n } else if (isBigIntArray(out) && isBigIntArray(a.data) && isBigIntArray(b.data)) {\n const aData = a.data;\n const bData = b.data;\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n out[offOut] = getBigIntElement(aData, offA) ** getBigIntElement(bData, offB);\n });\n } else if (!isBigIntArray(out) && !isBigIntArray(a.data) && !isBigIntArray(b.data)) {\n const aData = a.data;\n const bData = b.data;\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n out[offOut] = getNumericElement(aData, offA) ** getNumericElement(bData, offB);\n });\n }\n\n return result;\n}\n\n/**\n * Element-wise negation.\n *\n * Returns -x for each element.\n *\n * @example\n * ```ts\n * import { neg, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([1, -2, 3]);\n * const result = neg(x); // [-1, 2, -3]\n * ```\n */\nexport function neg(t: Tensor): Tensor {\n ensureNumericDType(t, \"neg\");\n const Ctor = dtypeToTypedArrayCtor(t.dtype);\n const out = new Ctor(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n if (isBigIntArray(out) && isBigIntArray(t.data)) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = -getBigIntElement(t.data, srcOffset);\n }\n } else if (!isBigIntArray(out) && !isBigIntArray(t.data)) {\n const numData = t.data;\n if (!Array.isArray(numData) && contiguous && t.offset === 0) {\n for (let i = 0; i < t.size; i++) {\n out[i] = -(numData[i] as number);\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = -getNumericElement(t.data, srcOffset);\n }\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: t.dtype,\n device: t.device,\n });\n}\n\n/**\n * Element-wise absolute value.\n *\n * Returns |x| for each element.\n *\n * @example\n * ```ts\n * import { abs, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([-1, 2, -3]);\n * const result = abs(x); // [1, 2, 3]\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.absolute.html | NumPy absolute}\n */\nexport function abs(t: Tensor): Tensor {\n ensureNumericDType(t, \"abs\");\n const Ctor = dtypeToTypedArrayCtor(t.dtype);\n const out = new Ctor(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n if (isBigIntArray(out) && isBigIntArray(t.data)) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const val = getBigIntElement(t.data, srcOffset);\n out[i] = val < 0n ? -val : val;\n }\n } else if (!isBigIntArray(out) && !isBigIntArray(t.data)) {\n const numData = t.data;\n if (!Array.isArray(numData)) {\n // Fast path: contiguous zero-offset — direct TypedArray loop\n if (contiguous && t.offset === 0) {\n for (let i = 0; i < t.size; i++) {\n out[i] = Math.abs(numData[i] as number);\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.abs(getNumericElement(numData, srcOffset));\n }\n }\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: t.dtype,\n device: t.device,\n });\n}\n\n/**\n * Element-wise sign function.\n *\n * Returns -1, 0, or 1 depending on sign of each element.\n *\n * @example\n * ```ts\n * import { sign, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([-5, 0, 3]);\n * const result = sign(x); // [-1, 0, 1]\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.sign.html | NumPy sign}\n */\nexport function sign(t: Tensor): Tensor {\n ensureNumericDType(t, \"sign\");\n const Ctor = dtypeToTypedArrayCtor(t.dtype);\n const out = new Ctor(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n if (isBigIntArray(out) && isBigIntArray(t.data)) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const val = getBigIntElement(t.data, srcOffset);\n out[i] = val < 0n ? -1n : val > 0n ? 1n : 0n;\n }\n } else if (!isBigIntArray(out) && !isBigIntArray(t.data)) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.sign(getNumericElement(t.data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: t.dtype,\n device: t.device,\n });\n}\n\n/**\n * Element-wise reciprocal.\n *\n * Returns 1/x for each element.\n *\n * @example\n * ```ts\n * import { reciprocal, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([2, 4, 8]);\n * const result = reciprocal(x); // [0.5, 0.25, 0.125]\n * ```\n */\nexport function reciprocal(t: Tensor): Tensor {\n ensureNumericDType(t, \"reciprocal\");\n const outDtype = outDtypeForTrueDiv(t.dtype);\n const Ctor = dtypeToTypedArrayCtor(outDtype);\n const out = new Ctor(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n if (isBigIntArray(out) && isBigIntArray(t.data)) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const val = getBigIntElement(t.data, srcOffset);\n out[i] = val === 0n ? 0n : 1n / val;\n }\n } else if (!isBigIntArray(out) && isBigIntArray(t.data)) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = 1 / Number(getBigIntElement(t.data, srcOffset));\n }\n } else if (!isBigIntArray(out) && !isBigIntArray(t.data)) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = 1 / getNumericElement(t.data, srcOffset);\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: outDtype,\n device: t.device,\n });\n}\n\n/**\n * Element-wise maximum of two tensors.\n *\n * @example\n * ```ts\n * import { maximum, tensor } from 'deepbox/ndarray';\n *\n * const a = tensor([1, 5, 3]);\n * const b = tensor([4, 2, 6]);\n * const result = maximum(a, b); // [4, 5, 6]\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.maximum.html | NumPy maximum}\n */\nexport function maximum(a: Tensor, b: Tensor): Tensor {\n ensureNumericDType(a, \"maximum\");\n ensureNumericDType(b, \"maximum\");\n ensureSameDType(a, b);\n ensureBroadcastableScalar(a, b);\n\n const outShape = getOutShape(a, b);\n const outSize = outShape.reduce((acc, dim) => acc * dim, 1);\n\n const Ctor = dtypeToTypedArrayCtor(a.dtype);\n const out = new Ctor(outSize);\n const result = Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: a.dtype,\n device: a.device,\n });\n\n if (isBigIntArray(out) && isBigIntArray(a.data) && isBigIntArray(b.data)) {\n const aData = a.data;\n const bData = b.data;\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n const ax = getBigIntElement(aData, offA);\n const bx = getBigIntElement(bData, offB);\n out[offOut] = ax > bx ? ax : bx;\n });\n } else if (!isBigIntArray(out) && !isBigIntArray(a.data) && !isBigIntArray(b.data)) {\n const aData = a.data;\n const bData = b.data;\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n out[offOut] = Math.max(getNumericElement(aData, offA), getNumericElement(bData, offB));\n });\n }\n\n return result;\n}\n\n/**\n * Element-wise minimum of two tensors.\n *\n * @example\n * ```ts\n * import { minimum, tensor } from 'deepbox/ndarray';\n *\n * const a = tensor([1, 5, 3]);\n * const b = tensor([4, 2, 6]);\n * const result = minimum(a, b); // [1, 2, 3]\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.minimum.html | NumPy minimum}\n */\nexport function minimum(a: Tensor, b: Tensor): Tensor {\n ensureNumericDType(a, \"minimum\");\n ensureNumericDType(b, \"minimum\");\n ensureSameDType(a, b);\n ensureBroadcastableScalar(a, b);\n\n const outShape = getOutShape(a, b);\n const outSize = outShape.reduce((acc, dim) => acc * dim, 1);\n\n const Ctor = dtypeToTypedArrayCtor(a.dtype);\n const out = new Ctor(outSize);\n const result = Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: a.dtype,\n device: a.device,\n });\n\n if (isBigIntArray(out) && isBigIntArray(a.data) && isBigIntArray(b.data)) {\n const aData = a.data;\n const bData = b.data;\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n const ax = getBigIntElement(aData, offA);\n const bx = getBigIntElement(bData, offB);\n out[offOut] = ax < bx ? ax : bx;\n });\n } else if (!isBigIntArray(out) && !isBigIntArray(a.data) && !isBigIntArray(b.data)) {\n const aData = a.data;\n const bData = b.data;\n if (Array.isArray(aData) || Array.isArray(bData)) {\n throw new DTypeError(\"String tensors not supported in minimum\");\n }\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n out[offOut] = Math.min(getNumericElement(aData, offA), getNumericElement(bData, offB));\n });\n }\n\n return result;\n}\n\n/**\n * Clip (limit) values in tensor.\n *\n * Given an interval, values outside the interval are clipped to interval edges.\n *\n * **Parameters**:\n * @param t - Input tensor\n * @param min - Minimum value. If undefined, no lower clipping\n * @param max - Maximum value. If undefined, no upper clipping\n *\n * @example\n * ```ts\n * import { clip, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([1, 2, 3, 4, 5]);\n * const result = clip(x, 2, 4); // [2, 2, 3, 4, 4]\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.clip.html | NumPy clip}\n */\nexport function clip(t: Tensor, min?: number, max?: number): Tensor {\n ensureNumericDType(t, \"clip\");\n if (min !== undefined && max !== undefined && min > max) {\n throw new InvalidParameterError(`clip: min (${min}) must be <= max (${max})`, \"min/max\", {\n min,\n max,\n });\n }\n\n const Ctor = dtypeToTypedArrayCtor(t.dtype);\n const out = new Ctor(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n if (isBigIntArray(out) && isBigIntArray(t.data)) {\n const minVal = min !== undefined ? BigInt(Math.trunc(min)) : undefined;\n const maxVal = max !== undefined ? BigInt(Math.trunc(max)) : undefined;\n\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n let val = getBigIntElement(t.data, srcOffset);\n if (minVal !== undefined && val < minVal) val = minVal;\n if (maxVal !== undefined && val > maxVal) val = maxVal;\n out[i] = val;\n }\n } else if (!isBigIntArray(out) && !isBigIntArray(t.data)) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n let val = getNumericElement(t.data, srcOffset);\n if (min !== undefined && val < min) val = min;\n if (max !== undefined && val > max) val = max;\n out[i] = val;\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: t.dtype,\n device: t.device,\n });\n}\n","import {\n DeepboxError,\n DTypeError,\n getBigIntElement,\n getNumericElement,\n type Shape,\n} from \"../../core\";\nimport { isContiguous } from \"../tensor/strides\";\nimport { computeStrides, isBigIntArray, Tensor } from \"../tensor/Tensor\";\nimport { flatOffset, readAsNumber, readElement, requireNumericData } from \"./_internal\";\nimport {\n broadcastApply,\n ensureBroadcastableScalar,\n getBroadcastShape,\n isScalar,\n} from \"./broadcast\";\n\nfunction compareMixed(\n a: bigint | number,\n b: bigint | number,\n op: \"eq\" | \"neq\" | \"gt\" | \"ge\" | \"lt\" | \"le\"\n): boolean {\n if (typeof a === \"bigint\" && typeof b === \"bigint\") {\n switch (op) {\n case \"eq\":\n return a === b;\n case \"neq\":\n return a !== b;\n case \"gt\":\n return a > b;\n case \"ge\":\n return a >= b;\n case \"lt\":\n return a < b;\n case \"le\":\n return a <= b;\n }\n }\n\n if (typeof a === \"number\" && typeof b === \"number\") {\n switch (op) {\n case \"eq\":\n return a === b;\n case \"neq\":\n return a !== b;\n case \"gt\":\n return a > b;\n case \"ge\":\n return a >= b;\n case \"lt\":\n return a < b;\n case \"le\":\n return a <= b;\n }\n }\n\n // Mixed\n let big: bigint;\n let num: number;\n let bigIsA: boolean;\n\n if (typeof a === \"bigint\") {\n big = a;\n if (typeof b !== \"number\") throw new DeepboxError(\"Internal error: expected number\");\n num = b;\n bigIsA = true;\n } else {\n num = a;\n if (typeof b !== \"bigint\") throw new DeepboxError(\"Internal error: expected bigint\");\n big = b;\n bigIsA = false;\n }\n\n if (Number.isNaN(num)) return op === \"neq\";\n if (num === Infinity) {\n if (op === \"eq\") return false;\n if (op === \"neq\") return true;\n // big < Inf -> True\n if (bigIsA) return op === \"lt\" || op === \"le\";\n return op === \"gt\" || op === \"ge\";\n }\n if (num === -Infinity) {\n if (op === \"eq\") return false;\n if (op === \"neq\") return true;\n // big > -Inf -> True\n if (bigIsA) return op === \"gt\" || op === \"ge\";\n return op === \"lt\" || op === \"le\";\n }\n\n if (Number.isInteger(num)) {\n const numBig = BigInt(num);\n const A = bigIsA ? big : numBig;\n const B = bigIsA ? numBig : big;\n switch (op) {\n case \"eq\":\n return A === B;\n case \"neq\":\n return A !== B;\n case \"gt\":\n return A > B;\n case \"ge\":\n return A >= B;\n case \"lt\":\n return A < B;\n case \"le\":\n return A <= B;\n }\n }\n\n // Non-integer number\n if (op === \"eq\") return false;\n if (op === \"neq\") return true;\n\n const floorVal = BigInt(Math.floor(num));\n // big > num <-> big > floorVal\n // big < num <-> big <= floorVal\n\n if (bigIsA) {\n // A=big, B=num\n if (op === \"gt\" || op === \"ge\") return big > floorVal;\n return big <= floorVal;\n } else {\n // A=num, B=big\n // num > big <-> floorVal >= big\n // num < big <-> floorVal < big\n if (op === \"gt\" || op === \"ge\") return floorVal >= big;\n return floorVal < big;\n }\n}\n\nfunction runComparison(a: Tensor, b: Tensor, op: \"eq\" | \"neq\" | \"gt\" | \"ge\" | \"lt\" | \"le\"): Tensor {\n if (a.dtype === \"string\" || b.dtype === \"string\") {\n throw new DTypeError(`${op} for string dtype is not implemented`);\n }\n\n ensureBroadcastableScalar(a, b);\n\n const aData = requireNumericData(a.data, op);\n const bData = requireNumericData(b.data, op);\n\n const aIsScalar = isScalar(a);\n const bIsScalar = isScalar(b);\n const outShape: Shape = aIsScalar\n ? b.shape\n : bIsScalar\n ? a.shape\n : getBroadcastShape(a.shape, b.shape);\n const outSize = outShape.reduce((acc, dim) => acc * dim, 1);\n\n const out = new Uint8Array(outSize);\n const result = Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: \"bool\",\n device: a.device,\n });\n\n // compareMixed handles mixed types (BigInt/Number).\n // We rely on broadcastApply to handle iteration.\n // Note: aData and bData are TypedArrays. Accessing by index returns number or bigint.\n\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n // Direct access. TS doesn't know exact type but compareMixed accepts bigint|number.\n const valA = readElement(aData, offA);\n const valB = readElement(bData, offB);\n out[offOut] = compareMixed(valA, valB, op) ? 1 : 0;\n });\n\n return result;\n}\n\n/**\n * Element-wise equality.\n *\n * Output dtype:\n * - `bool`\n */\nexport function equal(a: Tensor, b: Tensor): Tensor {\n return runComparison(a, b, \"eq\");\n}\n\n/**\n * Element-wise inequality (not equal) comparison.\n *\n * Returns a boolean tensor where each element is true (1) if the\n * corresponding elements in a and b are not equal, false (0) otherwise.\n *\n * @param a - First input tensor\n * @param b - Second input tensor\n * @returns Boolean tensor of same shape as inputs\n */\nexport function notEqual(a: Tensor, b: Tensor): Tensor {\n return runComparison(a, b, \"neq\");\n}\n\n/**\n * Element-wise greater than comparison (a > b).\n *\n * Returns a boolean tensor where each element is true (1) if the\n * corresponding element in a is greater than the element in b.\n *\n * @param a - First input tensor\n * @param b - Second input tensor\n * @returns Boolean tensor with comparison results\n */\nexport function greater(a: Tensor, b: Tensor): Tensor {\n return runComparison(a, b, \"gt\");\n}\n\n/**\n * Element-wise greater than or equal comparison (a >= b).\n *\n * @param a - First input tensor\n * @param b - Second input tensor\n * @returns Boolean tensor with comparison results\n */\nexport function greaterEqual(a: Tensor, b: Tensor): Tensor {\n return runComparison(a, b, \"ge\");\n}\n\n/**\n * Element-wise less than comparison (a < b).\n *\n * @param a - First input tensor\n * @param b - Second input tensor\n * @returns Boolean tensor with comparison results\n */\nexport function less(a: Tensor, b: Tensor): Tensor {\n return runComparison(a, b, \"lt\");\n}\n\n/**\n * Element-wise less than or equal comparison (a <= b).\n *\n * @param a - First input tensor\n * @param b - Second input tensor\n * @returns Boolean tensor with comparison results\n */\nexport function lessEqual(a: Tensor, b: Tensor): Tensor {\n return runComparison(a, b, \"le\");\n}\n\n/**\n * Element-wise test for approximate equality within tolerance.\n *\n * Returns true where: |a - b| <= (atol + rtol * |b|)\n *\n * Useful for floating-point comparisons where exact equality is unreliable.\n *\n * @param a - First input tensor\n * @param b - Second input tensor\n * @param rtol - Relative tolerance (default: 1e-5)\n * @param atol - Absolute tolerance (default: 1e-8)\n * @returns Boolean tensor with closeness test results\n */\nexport function isclose(a: Tensor, b: Tensor, rtol: number = 1e-5, atol: number = 1e-8): Tensor {\n if (a.dtype === \"string\" || b.dtype === \"string\") {\n throw new DTypeError(\"isclose for string dtype is not implemented\");\n }\n\n ensureBroadcastableScalar(a, b);\n\n const aIsScalar = isScalar(a);\n const bIsScalar = isScalar(b);\n const outShape: Shape = aIsScalar\n ? b.shape\n : bIsScalar\n ? a.shape\n : getBroadcastShape(a.shape, b.shape);\n const outSize = outShape.reduce((acc, dim) => acc * dim, 1);\n\n const out = new Uint8Array(outSize);\n const result = Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: \"bool\",\n device: a.device,\n });\n\n // Only handle numeric types (not BigInt for floating-point comparison)\n const aData = requireNumericData(a.data, \"isclose\");\n const bData = requireNumericData(b.data, \"isclose\");\n\n if (isBigIntArray(aData) || isBigIntArray(bData)) {\n throw new DTypeError(\"isclose not supported for BigInt tensors\");\n }\n\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n // We know it's numeric\n const ax = readAsNumber(aData, offA);\n const bx = readAsNumber(bData, offB);\n\n // Check if within tolerance: |a - b| <= atol + rtol * |b|\n const diff = Math.abs(ax - bx);\n const threshold = atol + rtol * Math.abs(bx);\n out[offOut] = diff <= threshold ? 1 : 0;\n });\n\n return result;\n}\n\n/**\n * Test whether all corresponding elements are close within tolerance.\n *\n * Returns a single boolean (not a tensor) indicating if ALL elements pass\n * the closeness test.\n *\n * @param a - First input tensor\n * @param b - Second input tensor\n * @param rtol - Relative tolerance (default: 1e-5)\n * @param atol - Absolute tolerance (default: 1e-8)\n * @returns True if all elements are close, false otherwise\n */\nexport function allclose(a: Tensor, b: Tensor, rtol: number = 1e-5, atol: number = 1e-8): boolean {\n if (a.dtype === \"string\" || b.dtype === \"string\") {\n throw new DTypeError(\"allclose is not defined for string dtype\");\n }\n\n const aData = requireNumericData(a.data, \"allclose\");\n const bData = requireNumericData(b.data, \"allclose\");\n\n if (isBigIntArray(aData) || isBigIntArray(bData)) {\n throw new DTypeError(\"allclose not supported for BigInt tensors\");\n }\n\n const aIsScalar = isScalar(a);\n const bIsScalar = isScalar(b);\n let outShape: Shape;\n if (aIsScalar) {\n outShape = b.shape;\n } else if (bIsScalar) {\n outShape = a.shape;\n } else {\n try {\n outShape = getBroadcastShape(a.shape, b.shape);\n } catch {\n return false;\n }\n }\n\n const outSize = outShape.reduce((acc, dim) => acc * dim, 1);\n if (outSize === 0) {\n return true;\n }\n\n // Handle scalar case efficiently\n if (outShape.length === 0) {\n const ax = readAsNumber(aData, a.offset);\n const bx = readAsNumber(bData, b.offset);\n const diff = Math.abs(ax - bx);\n const threshold = atol + rtol * Math.abs(bx);\n return diff <= threshold;\n }\n\n // Setup broadcast strides\n const rank = outShape.length;\n const stridesA = new Array<number>(rank).fill(0);\n const stridesB = new Array<number>(rank).fill(0);\n\n const rankDiffA = rank - a.ndim;\n for (let i = 0; i < rank; i++) {\n if (i >= rankDiffA) {\n const dim = a.shape[i - rankDiffA] ?? 1;\n if (dim > 1) {\n stridesA[i] = a.strides[i - rankDiffA] ?? 0;\n }\n }\n }\n\n const rankDiffB = rank - b.ndim;\n for (let i = 0; i < rank; i++) {\n if (i >= rankDiffB) {\n const dim = b.shape[i - rankDiffB] ?? 1;\n if (dim > 1) {\n stridesB[i] = b.strides[i - rankDiffB] ?? 0;\n }\n }\n }\n\n // Iterate\n const idx = new Array<number>(rank).fill(0);\n let offA = a.offset;\n let offB = b.offset;\n\n while (true) {\n // Check element\n // Direct access as number\n const ax = readAsNumber(aData, offA);\n const bx = readAsNumber(bData, offB);\n\n const diff = Math.abs(ax - bx);\n const threshold = atol + rtol * Math.abs(bx);\n if (diff > threshold) {\n return false;\n }\n\n // Odometer increment\n let axis = rank - 1;\n for (;;) {\n const currentIdx = idx[axis] ?? 0;\n const nextIdx = currentIdx + 1;\n idx[axis] = nextIdx;\n\n const strideA = stridesA[axis];\n const strideB = stridesB[axis];\n const dim = outShape[axis];\n\n if (strideA === undefined || strideB === undefined || dim === undefined) {\n // Should not happen\n return true;\n }\n\n offA += strideA;\n offB += strideB;\n\n if (nextIdx < dim) {\n break;\n }\n\n // Carry\n const count = nextIdx;\n offA -= strideA * count;\n offB -= strideB * count;\n idx[axis] = 0;\n axis--;\n\n if (axis < 0) return true; // All passed\n }\n }\n}\n\n/**\n * Test for exact array equality (shape, dtype, and all values).\n *\n * Returns a single boolean indicating if tensors are identical.\n *\n * @param a - First input tensor\n * @param b - Second input tensor\n * @returns True if arrays are exactly equal, false otherwise\n */\nexport function arrayEqual(a: Tensor, b: Tensor): boolean {\n // Check shape match\n if (a.ndim !== b.ndim || a.size !== b.size) {\n return false;\n }\n\n for (let i = 0; i < a.ndim; i++) {\n if (a.shape[i] !== b.shape[i]) {\n return false;\n }\n }\n\n // Check dtype match\n if (a.dtype !== b.dtype) {\n return false;\n }\n\n if (a.dtype === \"string\") {\n if (Array.isArray(a.data) && Array.isArray(b.data)) {\n const aLogicalStrides = computeStrides(a.shape);\n const bLogicalStrides = computeStrides(b.shape);\n const aContiguous = isContiguous(a.shape, a.strides);\n const bContiguous = isContiguous(b.shape, b.strides);\n for (let i = 0; i < a.size; i++) {\n const aOffset = flatOffset(i, a.offset, aContiguous, aLogicalStrides, a.strides);\n const bOffset = flatOffset(i, b.offset, bContiguous, bLogicalStrides, b.strides);\n if (a.data[aOffset] !== b.data[bOffset]) {\n return false;\n }\n }\n }\n return true;\n }\n\n const aData = requireNumericData(a.data, \"arrayEqual\");\n const bData = requireNumericData(b.data, \"arrayEqual\");\n const aLogicalStrides = computeStrides(a.shape);\n const bLogicalStrides = computeStrides(b.shape);\n const aContiguous = isContiguous(a.shape, a.strides);\n const bContiguous = isContiguous(b.shape, b.strides);\n\n // Check all values\n if (isBigIntArray(aData) && isBigIntArray(bData)) {\n for (let i = 0; i < a.size; i++) {\n const aOffset = flatOffset(i, a.offset, aContiguous, aLogicalStrides, a.strides);\n const bOffset = flatOffset(i, b.offset, bContiguous, bLogicalStrides, b.strides);\n if (getBigIntElement(aData, aOffset) !== getBigIntElement(bData, bOffset)) {\n return false;\n }\n }\n } else if (!isBigIntArray(aData) && !isBigIntArray(bData)) {\n for (let i = 0; i < a.size; i++) {\n const aOffset = flatOffset(i, a.offset, aContiguous, aLogicalStrides, a.strides);\n const bOffset = flatOffset(i, b.offset, bContiguous, bLogicalStrides, b.strides);\n if (getNumericElement(aData, aOffset) !== getNumericElement(bData, bOffset)) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * Element-wise test for NaN (Not a Number) values.\n *\n * Returns true (1) for NaN elements, false (0) otherwise.\n *\n * @param t - Input tensor\n * @returns Boolean tensor with NaN test results\n */\nexport function isnan(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"isnan for string dtype is not supported\");\n }\n\n const out = new Uint8Array(t.size);\n\n const data = requireNumericData(t.data, \"isnan\");\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n // BigInt cannot be NaN\n if (isBigIntArray(data)) {\n // All zeros for BigInt\n out.fill(0);\n } else {\n // Check each element for NaN\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const val = getNumericElement(data, srcOffset);\n out[i] = Number.isNaN(val) ? 1 : 0;\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"bool\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise test for infinity (+Inf or -Inf).\n *\n * Returns true (1) for infinite elements, false (0) otherwise.\n * Note: NaN is NOT considered infinite.\n *\n * @param t - Input tensor\n * @returns Boolean tensor with infinity test results\n */\nexport function isinf(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"isinf for string dtype is not supported\");\n }\n\n const out = new Uint8Array(t.size);\n\n const data = requireNumericData(t.data, \"isinf\");\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n // BigInt cannot be infinite\n if (isBigIntArray(data)) {\n out.fill(0);\n } else {\n // Check each element for infinity (not NaN)\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const val = getNumericElement(data, srcOffset);\n // Infinite if not finite and not NaN\n out[i] = !Number.isFinite(val) && !Number.isNaN(val) ? 1 : 0;\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"bool\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise test for finite values (not NaN, not Inf).\n *\n * Returns true (1) for finite elements, false (0) for NaN or Inf.\n *\n * @param t - Input tensor\n * @returns Boolean tensor with finite test results\n */\nexport function isfinite(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"isfinite for string dtype is not supported\");\n }\n\n const out = new Uint8Array(t.size);\n\n const data = requireNumericData(t.data, \"isfinite\");\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n // BigInt is always finite\n if (isBigIntArray(data)) {\n out.fill(1);\n } else {\n // Check each element for finiteness\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const val = getNumericElement(data, srcOffset);\n out[i] = Number.isFinite(val) ? 1 : 0;\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"bool\",\n device: t.device,\n });\n}\n","import type { Shape } from \"../../core\";\nimport {\n DTypeError,\n dtypeToTypedArrayCtor,\n getBigIntElement,\n getNumericElement,\n InvalidParameterError,\n ShapeError,\n} from \"../../core\";\nimport { computeStrides, Tensor } from \"../tensor/Tensor\";\n\nfunction validateConvPair(\n name: \"kernelSize\" | \"stride\" | \"padding\",\n pair: [number, number],\n minValue: number\n): void {\n for (const [i, v] of pair.entries()) {\n if (!Number.isFinite(v) || !Number.isInteger(v) || v < minValue) {\n throw new InvalidParameterError(\n `${name}[${i}] must be an integer >= ${minValue}; received ${String(v)}`,\n name,\n pair\n );\n }\n }\n}\n\n/**\n * Image to Column operation (im2col).\n *\n * Rearranges image blocks into columns.\n *\n * @param input - Input tensor of shape (batch, channels, height, width)\n * @param kernelSize - Size of the kernel [kH, kW]\n * @param stride - Stride [sH, sW]\n * @param padding - Padding [pH, pW]\n * @returns Output tensor of shape (batch, outH * outW, channels * kH * kW)\n */\nexport function im2col(\n input: Tensor,\n kernelSize: [number, number],\n stride: [number, number],\n padding: [number, number]\n): Tensor {\n if (input.ndim !== 4) {\n throw new ShapeError(`im2col expects 4D input, got ${input.ndim}D`);\n }\n if (input.dtype === \"string\") {\n throw new DTypeError(\"im2col does not support string tensors\");\n }\n\n validateConvPair(\"kernelSize\", kernelSize, 1);\n validateConvPair(\"stride\", stride, 1);\n validateConvPair(\"padding\", padding, 0);\n\n const batch = input.shape[0] ?? 0;\n const channels = input.shape[1] ?? 0;\n const height = input.shape[2] ?? 0;\n const width = input.shape[3] ?? 0;\n\n const [kH, kW] = kernelSize;\n const [sH, sW] = stride;\n const [pH, pW] = padding;\n\n const outH = Math.floor((height + 2 * pH - kH) / sH) + 1;\n const outW = Math.floor((width + 2 * pW - kW) / sW) + 1;\n\n if (outH <= 0 || outW <= 0) {\n throw new InvalidParameterError(\n `Invalid output dimensions: ${outH}x${outW}`,\n \"output_dimensions\",\n { outH, outW }\n );\n }\n\n // Output shape: (batch, outH * outW, channels * kH * kW)\n // This shape allows matmul with weight matrix (channels * kH * kW, out_channels)\n const colSize = channels * kH * kW;\n const outPixels = outH * outW;\n const outShape: Shape = [batch, outPixels, colSize];\n\n const Ctor = dtypeToTypedArrayCtor(input.dtype);\n const outData = new Ctor(batch * outPixels * colSize);\n\n const inputData = input.data;\n if (Array.isArray(inputData)) {\n throw new DTypeError(\"im2col does not support string tensors\");\n }\n\n const iStride0 = input.strides[0] ?? 0;\n const iStride1 = input.strides[1] ?? 0;\n const iStride2 = input.strides[2] ?? 0;\n const iStride3 = input.strides[3] ?? 0;\n\n // Optimized loop structure\n // We want to fill the output row by row\n // Each row in output corresponds to one sliding window position\n // The row contains flattened channel, kH, kW data\n\n // To match typical matmul convention:\n // Input unfolded: (batch, out_pixels, in_features)\n // Weight: (in_features, out_channels)\n // Result: (batch, out_pixels, out_channels)\n\n if (inputData instanceof BigInt64Array) {\n if (!(outData instanceof BigInt64Array)) {\n throw new DTypeError(\"im2col expected int64 output buffer\");\n }\n const outBig = outData;\n\n for (let b = 0; b < batch; b++) {\n const batchOffset = b * outPixels * colSize;\n const inputBatchOffset = input.offset + b * iStride0;\n\n for (let oh = 0; oh < outH; oh++) {\n for (let ow = 0; ow < outW; ow++) {\n const outRowIdx = oh * outW + ow;\n const rowOffset = batchOffset + outRowIdx * colSize;\n let colIdx = 0;\n\n for (let c = 0; c < channels; c++) {\n const inputChannelOffset = inputBatchOffset + c * iStride1;\n\n for (let kh = 0; kh < kH; kh++) {\n const ih = oh * sH - pH + kh;\n\n for (let kw = 0; kw < kW; kw++) {\n const iw = ow * sW - pW + kw;\n\n let val = 0n;\n if (ih >= 0 && ih < height && iw >= 0 && iw < width) {\n const inputOffset = inputChannelOffset + ih * iStride2 + iw * iStride3;\n val = getBigIntElement(inputData, inputOffset);\n }\n\n outBig[rowOffset + colIdx] = val;\n colIdx++;\n }\n }\n }\n }\n }\n }\n } else {\n if (outData instanceof BigInt64Array) {\n throw new DTypeError(\"im2col unexpected int64 output buffer\");\n }\n const outNum = outData;\n\n for (let b = 0; b < batch; b++) {\n const batchOffset = b * outPixels * colSize;\n const inputBatchOffset = input.offset + b * iStride0;\n\n for (let oh = 0; oh < outH; oh++) {\n for (let ow = 0; ow < outW; ow++) {\n const outRowIdx = oh * outW + ow;\n const rowOffset = batchOffset + outRowIdx * colSize;\n let colIdx = 0;\n\n for (let c = 0; c < channels; c++) {\n const inputChannelOffset = inputBatchOffset + c * iStride1;\n\n for (let kh = 0; kh < kH; kh++) {\n const ih = oh * sH - pH + kh;\n\n for (let kw = 0; kw < kW; kw++) {\n const iw = ow * sW - pW + kw;\n\n let val = 0;\n if (ih >= 0 && ih < height && iw >= 0 && iw < width) {\n const inputOffset = inputChannelOffset + ih * iStride2 + iw * iStride3;\n val = getNumericElement(inputData, inputOffset);\n }\n\n outNum[rowOffset + colIdx] = val;\n colIdx++;\n }\n }\n }\n }\n }\n }\n }\n\n return Tensor.fromTypedArray({\n data: outData,\n shape: outShape,\n dtype: input.dtype,\n device: input.device,\n });\n}\n\n/**\n * Column to Image operation (col2im).\n *\n * Rearranges columns back into image blocks (accumulating values).\n * Used for gradient computation.\n *\n * @param cols - Column tensor of shape (batch, outH * outW, channels * kH * kW)\n * @param inputShape - Shape of the original image (batch, channels, height, width)\n * @param kernelSize - Size of the kernel [kH, kW]\n * @param stride - Stride [sH, sW]\n * @param padding - Padding [pH, pW]\n * @returns Gradient tensor of shape inputShape\n */\nexport function col2im(\n cols: Tensor,\n inputShape: Shape,\n kernelSize: [number, number],\n stride: [number, number],\n padding: [number, number]\n): Tensor {\n if (cols.ndim !== 3) {\n throw new ShapeError(`col2im expects 3D input, got ${cols.ndim}D`);\n }\n if (cols.dtype === \"string\") {\n throw new DTypeError(\"col2im does not support string tensors\");\n }\n if (inputShape.length !== 4) {\n throw new ShapeError(`col2im expects inputShape of length 4, got ${inputShape.length}`);\n }\n\n validateConvPair(\"kernelSize\", kernelSize, 1);\n validateConvPair(\"stride\", stride, 1);\n validateConvPair(\"padding\", padding, 0);\n\n const batch = inputShape[0] ?? 0;\n const channels = inputShape[1] ?? 0;\n const height = inputShape[2] ?? 0;\n const width = inputShape[3] ?? 0;\n\n const [kH, kW] = kernelSize;\n const [sH, sW] = stride;\n const [pH, pW] = padding;\n\n const outH = Math.floor((height + 2 * pH - kH) / sH) + 1;\n const outW = Math.floor((width + 2 * pW - kW) / sW) + 1;\n if (outH <= 0 || outW <= 0) {\n throw new InvalidParameterError(\n `Invalid output dimensions: ${outH}x${outW}`,\n \"output_dimensions\",\n { outH, outW }\n );\n }\n\n const colSize = channels * kH * kW;\n const outPixels = outH * outW;\n\n // Validate cols shape\n if (\n (cols.shape[0] ?? 0) !== batch ||\n (cols.shape[1] ?? 0) !== outPixels ||\n (cols.shape[2] ?? 0) !== colSize\n ) {\n throw new ShapeError(\n `col2im input shape mismatch: expected [${batch}, ${outPixels}, ${colSize}], got [${cols.shape}]`\n );\n }\n\n const Ctor = dtypeToTypedArrayCtor(cols.dtype);\n const outData = new Ctor(batch * channels * height * width);\n\n const colsData = cols.data;\n if (Array.isArray(colsData)) {\n throw new DTypeError(\"col2im does not support string tensors\");\n }\n\n // Calculate strides for the output tensor (which we are filling)\n const outStrides = computeStrides(inputShape);\n const oStride0 = outStrides[0] ?? 0;\n const oStride1 = outStrides[1] ?? 0;\n const oStride2 = outStrides[2] ?? 0;\n const oStride3 = outStrides[3] ?? 0;\n\n const cStride0 = cols.strides[0] ?? 0;\n const cStride1 = cols.strides[1] ?? 0;\n const cStride2 = cols.strides[2] ?? 0;\n\n if (colsData instanceof BigInt64Array) {\n if (!(outData instanceof BigInt64Array)) {\n throw new DTypeError(\"col2im expected int64 output buffer\");\n }\n const outBig = outData;\n\n for (let b = 0; b < batch; b++) {\n const colsBatchOffset = cols.offset + b * cStride0;\n const outBatchOffset = b * oStride0;\n\n for (let oh = 0; oh < outH; oh++) {\n for (let ow = 0; ow < outW; ow++) {\n const rowIdx = oh * outW + ow;\n const colsRowOffset = colsBatchOffset + rowIdx * cStride1;\n\n let colIdx = 0;\n for (let c = 0; c < channels; c++) {\n const outChannelOffset = outBatchOffset + c * oStride1;\n\n for (let kh = 0; kh < kH; kh++) {\n const ih = oh * sH - pH + kh;\n for (let kw = 0; kw < kW; kw++) {\n const iw = ow * sW - pW + kw;\n\n if (ih >= 0 && ih < height && iw >= 0 && iw < width) {\n const val = getBigIntElement(colsData, colsRowOffset + colIdx * cStride2);\n const outOffset = outChannelOffset + ih * oStride2 + iw * oStride3;\n const prev = outBig[outOffset];\n outBig[outOffset] = (prev === undefined ? 0n : prev) + val;\n }\n colIdx++;\n }\n }\n }\n }\n }\n }\n } else {\n if (outData instanceof BigInt64Array) {\n throw new DTypeError(\"col2im unexpected int64 output buffer\");\n }\n const outNum = outData;\n\n for (let b = 0; b < batch; b++) {\n const colsBatchOffset = cols.offset + b * cStride0;\n const outBatchOffset = b * oStride0;\n\n for (let oh = 0; oh < outH; oh++) {\n for (let ow = 0; ow < outW; ow++) {\n const rowIdx = oh * outW + ow;\n const colsRowOffset = colsBatchOffset + rowIdx * cStride1;\n\n let colIdx = 0;\n for (let c = 0; c < channels; c++) {\n const outChannelOffset = outBatchOffset + c * oStride1;\n\n for (let kh = 0; kh < kH; kh++) {\n const ih = oh * sH - pH + kh;\n for (let kw = 0; kw < kW; kw++) {\n const iw = ow * sW - pW + kw;\n\n if (ih >= 0 && ih < height && iw >= 0 && iw < width) {\n const val = getNumericElement(colsData, colsRowOffset + colIdx * cStride2);\n const outOffset = outChannelOffset + ih * oStride2 + iw * oStride3;\n const prev = outNum[outOffset];\n outNum[outOffset] = (prev === undefined ? 0 : prev) + val;\n }\n colIdx++;\n }\n }\n }\n }\n }\n }\n }\n\n return Tensor.fromTypedArray({\n data: outData,\n shape: inputShape,\n dtype: cols.dtype,\n device: cols.device,\n });\n}\n","import { DTypeError, getBigIntElement, getNumericElement } from \"../../core\";\nimport { isContiguous, offsetFromFlatIndex } from \"../tensor/strides\";\nimport { computeStrides, dtypeToTypedArrayCtor, Tensor } from \"../tensor/Tensor\";\nimport { bigintToNumberSafe } from \"./_internal\";\n\n/**\n * Element-wise exponential.\n *\n * Output dtype:\n * - Always `float64` for now.\n */\nexport function exp(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"exp is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"exp is not defined for string dtype\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = Math.exp(bigintToNumberSafe(getBigIntElement(data, srcOffset)));\n }\n } else if (contiguous && t.offset === 0) {\n for (let i = 0; i < t.size; i++) {\n out[i] = Math.exp(data[i] as number);\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = Math.exp(getNumericElement(data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise natural logarithm.\n *\n * @param t - Input tensor\n * @returns Tensor with log(x) for each element\n *\n * @example\n * ```ts\n * import { log, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([1, 2.71828, 7.389]);\n * const result = log(x); // [0, 1, 2]\n * ```\n */\nexport function log(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"log is not defined for string dtype\");\n }\n\n const dtype = t.dtype === \"float32\" ? \"float32\" : \"float64\";\n const Ctor = dtypeToTypedArrayCtor(dtype);\n const out = new Ctor(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"log is not defined for string dtype\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = Math.log(bigintToNumberSafe(getBigIntElement(data, srcOffset)));\n }\n } else if (contiguous && t.offset === 0) {\n for (let i = 0; i < t.size; i++) {\n out[i] = Math.log(data[i] as number);\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = Math.log(getNumericElement(data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype,\n device: t.device,\n });\n}\n\n/**\n * Element-wise square root.\n *\n * @param t - Input tensor\n * @returns Tensor with sqrt(x) for each element\n *\n * @example\n * ```ts\n * import { sqrt, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([4, 9, 16]);\n * const result = sqrt(x); // [2, 3, 4]\n * ```\n */\nexport function sqrt(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"sqrt is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"sqrt is not defined for string dtype\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = Math.sqrt(bigintToNumberSafe(getBigIntElement(data, srcOffset)));\n }\n } else if (contiguous && t.offset === 0) {\n for (let i = 0; i < t.size; i++) {\n out[i] = Math.sqrt(data[i] as number);\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = Math.sqrt(getNumericElement(data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise square.\n *\n * @example\n * ```ts\n * import { square, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([1, 2, 3]);\n * const result = square(x); // [1, 4, 9]\n * ```\n */\nexport function square(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"square is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"square is not defined for string dtype\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n const val = bigintToNumberSafe(getBigIntElement(data, srcOffset));\n out[i] = val * val;\n }\n } else if (contiguous && t.offset === 0) {\n for (let i = 0; i < t.size; i++) {\n const val = data[i] as number;\n out[i] = val * val;\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n const val = getNumericElement(data, srcOffset);\n out[i] = val * val;\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise reciprocal square root.\n *\n * Returns 1/sqrt(x) for each element.\n *\n * @example\n * ```ts\n * import { rsqrt, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([4, 9, 16]);\n * const result = rsqrt(x); // [0.5, 0.333..., 0.25]\n * ```\n */\nexport function rsqrt(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"rsqrt is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"rsqrt is not defined for string dtype\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n const val = bigintToNumberSafe(getBigIntElement(data, srcOffset));\n out[i] = 1 / Math.sqrt(val);\n }\n } else if (contiguous && t.offset === 0) {\n for (let i = 0; i < t.size; i++) {\n out[i] = 1 / Math.sqrt(data[i] as number);\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n const val = getNumericElement(data, srcOffset);\n out[i] = 1 / Math.sqrt(val);\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise cube root.\n *\n * @example\n * ```ts\n * import { cbrt, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([8, 27, 64]);\n * const result = cbrt(x); // [2, 3, 4]\n * ```\n */\nexport function cbrt(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"cbrt is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"cbrt is not defined for string dtype\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = Math.cbrt(bigintToNumberSafe(getBigIntElement(data, srcOffset)));\n }\n } else if (contiguous && t.offset === 0) {\n for (let i = 0; i < t.size; i++) {\n out[i] = Math.cbrt(data[i] as number);\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = Math.cbrt(getNumericElement(data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise exp(x) - 1.\n *\n * More accurate than exp(x) - 1 for small x.\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.expm1.html | NumPy expm1}\n */\nexport function expm1(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"expm1 is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"expm1 is not defined for string dtype\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = Math.expm1(bigintToNumberSafe(getBigIntElement(data, srcOffset)));\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = Math.expm1(getNumericElement(data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise base-2 exponential.\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.exp2.html | NumPy exp2}\n */\nexport function exp2(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"exp2 is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"exp2 is not defined for string dtype\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n const val = bigintToNumberSafe(getBigIntElement(data, srcOffset));\n out[i] = 2 ** val;\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n const val = getNumericElement(data, srcOffset);\n out[i] = 2 ** val;\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise log(1 + x).\n *\n * More accurate than log(1 + x) for small x.\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.log1p.html | NumPy log1p}\n */\nexport function log1p(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"log1p is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"log1p is not defined for string dtype\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = Math.log1p(bigintToNumberSafe(getBigIntElement(data, srcOffset)));\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = Math.log1p(getNumericElement(data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise base-2 logarithm.\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.log2.html | NumPy log2}\n */\nexport function log2(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"log2 is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"log2 is not defined for string dtype\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = Math.log2(bigintToNumberSafe(getBigIntElement(data, srcOffset)));\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = Math.log2(getNumericElement(data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise base-10 logarithm.\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.log10.html | NumPy log10}\n */\nexport function log10(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"log10 is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"log10 is not defined for string dtype\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = Math.log10(bigintToNumberSafe(getBigIntElement(data, srcOffset)));\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = Math.log10(getNumericElement(data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise floor (round down).\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.floor.html | NumPy floor}\n */\nexport function floor(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"floor is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"floor is not defined for string dtype\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = Math.floor(bigintToNumberSafe(getBigIntElement(data, srcOffset)));\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = Math.floor(getNumericElement(data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise ceil (round up).\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.ceil.html | NumPy ceil}\n */\nexport function ceil(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"ceil is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"ceil is not defined for string dtype\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = Math.ceil(bigintToNumberSafe(getBigIntElement(data, srcOffset)));\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = Math.ceil(getNumericElement(data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise round to nearest integer.\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.round.html | NumPy round}\n */\nexport function round(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"round is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"round is not defined for string dtype\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = Math.round(bigintToNumberSafe(getBigIntElement(data, srcOffset)));\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = Math.round(getNumericElement(data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise truncate (round toward zero).\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.trunc.html | NumPy trunc}\n */\nexport function trunc(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"trunc is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"trunc is not defined for string dtype\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = Math.trunc(bigintToNumberSafe(getBigIntElement(data, srcOffset)));\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = Math.trunc(getNumericElement(data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n","import {\n type Device,\n type DType,\n dtypeToTypedArrayCtor,\n InvalidParameterError,\n type Shape,\n shapeToSize,\n} from \"../../core\";\nimport { Tensor } from \"../tensor/Tensor\";\n\ntype NumericDType = Exclude<DType, \"string\">;\n\n/**\n * Generate a tensor of Bernoulli samples scaled by a constant.\n *\n * Each element is independently drawn: it equals `scale` with probability\n * `(1 - p)` and `0` with probability `p`. This is the mask used by inverted\n * dropout: non-dropped elements are pre-scaled by `1 / (1 - p)`.\n *\n * @param shape - Output tensor shape\n * @param p - Probability of an element being zero (drop probability)\n * @param scale - Value assigned to kept elements (typically `1 / (1 - p)`)\n * @param dtype - Numeric dtype for the output tensor\n * @param device - Target device\n * @returns Tensor of the given shape filled with `0` or `scale`\n *\n * @internal\n */\nexport function dropoutMask(\n shape: Shape,\n p: number,\n scale: number,\n dtype: NumericDType,\n device: Device\n): Tensor {\n if (!Number.isFinite(p) || p < 0 || p >= 1) {\n throw new InvalidParameterError(\"p must be in [0, 1)\", \"p\", p);\n }\n\n const size = shapeToSize(shape);\n const Ctor = dtypeToTypedArrayCtor(dtype);\n const data = new Ctor(size);\n\n if (data instanceof BigInt64Array) {\n const scaleBig = BigInt(Math.round(scale));\n for (let i = 0; i < size; i++) {\n data[i] = Math.random() > p ? scaleBig : 0n;\n }\n } else {\n for (let i = 0; i < size; i++) {\n data[i] = Math.random() > p ? scale : 0;\n }\n }\n\n return Tensor.fromTypedArray({\n data,\n shape,\n dtype,\n device,\n });\n}\n","import type { Axis, DType, Shape, TypedArray } from \"../../core\";\nimport {\n DataValidationError,\n DTypeError,\n dtypeToTypedArrayCtor,\n getArrayElement,\n getBigIntElement,\n getNumericElement,\n getShapeDim,\n InvalidParameterError,\n normalizeAxes,\n normalizeAxis,\n ShapeError,\n validateShape,\n} from \"../../core\";\nimport { isContiguous } from \"../tensor/strides\";\nimport { computeStrides, Tensor } from \"../tensor/Tensor\";\nimport { bigintToNumberSafe, flatOffset } from \"./_internal\";\nimport { mulScalar } from \"./arithmetic\";\n\nconst INT64_MIN = -(1n << 63n);\nconst INT64_MAX = (1n << 63n) - 1n;\ntype NumericDType = Exclude<DType, \"string\">;\n\nfunction ensureNumericTensor(t: Tensor, op: string): asserts t is Tensor<Shape, NumericDType> {\n if (t.dtype === \"string\") {\n throw new DTypeError(`${op}() not supported for string dtype`);\n }\n}\n\nfunction expectBigIntData(data: Tensor[\"data\"], op: string): BigInt64Array {\n if (Array.isArray(data)) {\n throw new DTypeError(`${op} not supported for string dtype`);\n }\n if (!(data instanceof BigInt64Array)) {\n throw new DTypeError(`${op} requires int64 dtype`);\n }\n return data;\n}\n\nfunction expectNumericData(data: Tensor[\"data\"], op: string): Exclude<TypedArray, BigInt64Array> {\n if (Array.isArray(data)) {\n throw new DTypeError(`${op} not supported for string dtype`);\n }\n if (data instanceof BigInt64Array) {\n throw new DTypeError(`${op} requires non-int64 dtype`);\n }\n return data;\n}\n\nfunction outDtypeForSum(inDtype: Tensor[\"dtype\"]): NumericDType {\n if (inDtype === \"int64\") return \"int64\";\n if (inDtype === \"float32\" || inDtype === \"float64\") return \"float64\";\n if (inDtype === \"string\") throw new DTypeError(\"sum is not defined for string dtype\");\n return \"int32\";\n}\n\n/**\n * Sum reduction.\n *\n * Supported (initial foundation):\n * - `axis` omitted: sum all elements to a scalar tensor\n * - `axis` provided: supports any axis\n *\n * Output dtype:\n * - `int64` stays `int64`\n * - `float32` and `float64` promote to `float64`\n * - `int32`/`uint8`/`bool` promote to `int32`\n * - `string` is unsupported\n */\nexport function sum(t: Tensor, axis?: Axis, keepdims = false): Tensor {\n ensureNumericTensor(t, \"sum\");\n\n const outDtype = outDtypeForSum(t.dtype);\n\n if (axis === undefined) {\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n if (t.dtype === \"int64\") {\n const bigIntData = expectBigIntData(t.data, \"sum\");\n let acc = 0n;\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n acc += getBigIntElement(bigIntData, srcOffset);\n }\n if (acc < INT64_MIN || acc > INT64_MAX) {\n throw new DataValidationError(\"int64 sum overflow\");\n }\n const out = new BigInt64Array(1);\n out[0] = acc;\n const outShape: Shape = keepdims ? new Array<number>(t.ndim).fill(1) : [];\n return Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: \"int64\",\n device: t.device,\n });\n }\n\n let acc = 0;\n if (t.data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n acc += Number(getBigIntElement(t.data, srcOffset));\n }\n } else {\n const numericData = t.data;\n if (Array.isArray(numericData)) {\n throw new DTypeError(\"sum not supported for string dtype\");\n }\n // Fast path: contiguous zero-offset — direct TypedArray loop\n if (contiguous && t.offset === 0) {\n for (let i = 0; i < t.size; i++) {\n acc += numericData[i] as number;\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n acc += getNumericElement(numericData, srcOffset);\n }\n }\n }\n\n const out = outDtype === \"float64\" ? new Float64Array(1) : new Int32Array(1);\n out[0] = acc;\n const outShape: Shape = keepdims ? new Array<number>(t.ndim).fill(1) : [];\n\n return Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: outDtype,\n device: t.device,\n });\n }\n\n const ax = normalizeAxis(axis, t.ndim);\n const axisDim = getShapeDim(t.shape, ax);\n\n // Empty-axis reduction: return zeros (additive identity) with correct output shape\n if (axisDim === 0) {\n const outShapeArr: number[] = [];\n for (let i = 0; i < t.ndim; i++) {\n if (i === ax) {\n if (keepdims) outShapeArr.push(1);\n } else {\n outShapeArr.push(getShapeDim(t.shape, i));\n }\n }\n validateShape(outShapeArr);\n const outSize = outShapeArr.reduce((a, b) => a * b, 1);\n const OutCtor = dtypeToTypedArrayCtor(outDtype);\n const out = new OutCtor(outSize);\n // Typed arrays are zero-initialized, which is the additive identity\n return Tensor.fromTypedArray({\n data: out,\n shape: outShapeArr,\n dtype: outDtype,\n device: t.device,\n });\n }\n\n const outShapeArr: number[] = [];\n for (let i = 0; i < t.ndim; i++) {\n if (i === ax) {\n if (keepdims) outShapeArr.push(1);\n } else {\n outShapeArr.push(getShapeDim(t.shape, i));\n }\n }\n validateShape(outShapeArr);\n\n const outSize = outShapeArr.reduce((a, b) => a * b, 1);\n const OutCtor = dtypeToTypedArrayCtor(outDtype);\n const out = new OutCtor(outSize);\n\n // Precompute output strides for converting outFlat -> outIdx\n const outStrides = new Array<number>(outShapeArr.length);\n let stride = 1;\n for (let i = outShapeArr.length - 1; i >= 0; i--) {\n outStrides[i] = stride;\n stride *= getArrayElement(outShapeArr, i);\n }\n\n for (let outFlat = 0; outFlat < outSize; outFlat++) {\n let rem = outFlat;\n const outIdx = new Array<number>(outShapeArr.length);\n for (let i = 0; i < outShapeArr.length; i++) {\n const s = getArrayElement(outStrides, i, 1);\n outIdx[i] = Math.floor(rem / s);\n rem %= s;\n }\n\n // Map outIdx back to an input base index (with reduced axis set to 0).\n const inIdx = new Array<number>(t.ndim);\n if (keepdims) {\n for (let i = 0; i < t.ndim; i++) {\n if (i === ax) {\n inIdx[i] = 0;\n } else {\n inIdx[i] = getArrayElement(outIdx, i);\n }\n }\n } else {\n let outAxis = 0;\n for (let i = 0; i < t.ndim; i++) {\n if (i === ax) {\n inIdx[i] = 0;\n } else {\n inIdx[i] = getArrayElement(outIdx, outAxis);\n outAxis++;\n }\n }\n }\n\n let baseOffset = t.offset;\n for (let i = 0; i < t.ndim; i++) {\n baseOffset += getArrayElement(inIdx, i) * getArrayElement(t.strides, i);\n }\n\n const axisStride = getArrayElement(t.strides, ax);\n if (outDtype === \"int64\") {\n const bigIntData = expectBigIntData(t.data, \"sum\");\n if (!(out instanceof BigInt64Array)) {\n throw new DTypeError(\"sum output dtype mismatch\");\n }\n const bigIntOut = out;\n let acc = 0n;\n for (let k = 0; k < axisDim; k++) {\n acc += getBigIntElement(bigIntData, baseOffset + k * axisStride);\n }\n if (acc < INT64_MIN || acc > INT64_MAX) {\n throw new DataValidationError(\"int64 sum overflow\");\n }\n bigIntOut[outFlat] = acc;\n } else {\n let acc = 0;\n if (t.data instanceof BigInt64Array) {\n for (let k = 0; k < axisDim; k++) {\n acc += Number(getBigIntElement(t.data, baseOffset + k * axisStride));\n }\n } else {\n const numericData = expectNumericData(t.data, \"sum\");\n for (let k = 0; k < axisDim; k++) {\n acc += getNumericElement(numericData, baseOffset + k * axisStride);\n }\n }\n\n if (out instanceof BigInt64Array) {\n throw new DTypeError(\"sum output dtype mismatch\");\n }\n const numericOut = out;\n numericOut[outFlat] = acc;\n }\n }\n\n const finalShape: Shape = outShapeArr;\n return Tensor.fromTypedArray({\n data: out,\n shape: finalShape,\n dtype: outDtype,\n device: t.device,\n });\n}\n\n/**\n * Compute the arithmetic mean along the specified axis.\n *\n * Returns NaN for empty reductions (when the number of elements along the\n * reduction axis is 0), matching NumPy's behavior of returning NaN with a\n * \"mean of empty slice\" warning.\n *\n * @param t - Input tensor\n * @param axis - Axis along which to compute mean. If undefined, compute over all elements\n * @param keepdims - If true, keep reduced dimensions as size 1\n * @returns Tensor containing mean values. NaN for empty reductions.\n *\n * @example\n * ```ts\n * import { mean, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([[1, 2], [3, 4]]);\n * const m1 = mean(x); // 2.5\n * const m2 = mean(x, 0); // [2, 3]\n * const m3 = mean(x, 1); // [1.5, 3.5]\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.mean.html | NumPy mean}\n */\nexport function mean(t: Tensor, axis?: Axis, keepdims = false): Tensor {\n ensureNumericTensor(t, \"mean\");\n\n // Empty full-reduction: return NaN scalar (matches NumPy behavior)\n if (axis === undefined && t.size === 0) {\n const out = new Float64Array(1);\n out[0] = NaN;\n const outShape: Shape = keepdims ? new Array<number>(t.ndim).fill(1) : [];\n return Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: \"float64\",\n device: t.device,\n });\n }\n\n // Empty axis-reduction: return NaN-filled tensor (matches NumPy behavior)\n if (axis !== undefined) {\n const ax = normalizeAxis(axis, t.ndim);\n const axisDim = getShapeDim(t.shape, ax);\n if (axisDim === 0) {\n const outShapeArr: number[] = [];\n for (let i = 0; i < t.ndim; i++) {\n if (i === ax) {\n if (keepdims) outShapeArr.push(1);\n } else {\n outShapeArr.push(getShapeDim(t.shape, i));\n }\n }\n validateShape(outShapeArr);\n const outSize = outShapeArr.reduce((a, b) => a * b, 1);\n const out = new Float64Array(outSize);\n out.fill(NaN);\n return Tensor.fromTypedArray({\n data: out,\n shape: outShapeArr,\n dtype: \"float64\",\n device: t.device,\n });\n }\n }\n\n // Compute the sum along the specified axis (or all elements if axis is undefined)\n const total = sum(t, axis, keepdims);\n\n // Ensure floating output for integer/bool/uint8 inputs to avoid truncation.\n let totalFloat = total;\n if (total.dtype !== \"float32\" && total.dtype !== \"float64\") {\n const data = new Float64Array(total.size);\n const totalData = total.data;\n if (Array.isArray(totalData)) {\n throw new DTypeError(\"mean not supported for string dtype\");\n }\n if (totalData instanceof BigInt64Array) {\n for (let i = 0; i < total.size; i++) {\n data[i] = bigintToNumberSafe(getBigIntElement(totalData, total.offset + i));\n }\n } else {\n for (let i = 0; i < total.size; i++) {\n data[i] = getNumericElement(totalData, total.offset + i);\n }\n }\n totalFloat = Tensor.fromTypedArray({\n data,\n shape: total.shape,\n dtype: \"float64\",\n device: total.device,\n });\n }\n\n if (axis === undefined) {\n // Divide total by the total number of elements to get the mean\n return mulScalar(totalFloat, 1 / t.size);\n }\n\n // Normalize negative axis indices to positive\n const ax = normalizeAxis(axis, t.ndim);\n const axisDim = getShapeDim(t.shape, ax);\n\n // Divide total by the size of the reduced axis to get the mean\n return mulScalar(totalFloat, 1 / axisDim);\n}\n\n/**\n * Product of array elements along axis.\n *\n * Multiplies all elements together. Returns 1 for empty arrays.\n * Supports full reduction and reduction over one or more axes.\n *\n * **Complexity**: O(n) where n is the number of elements\n *\n * Output dtype:\n * - Same as input dtype (int32, float64, int64)\n * - Potential for overflow with large products\n *\n * @param t - Input tensor\n * @param axis - Axis or axes along which to compute the product\n * @param keepdims - If true, keep reduced dimensions as size 1\n * @returns Scalar tensor containing the product\n *\n * @example\n * ```ts\n * import { tensor, prod } from 'deepbox/ndarray';\n *\n * const t = tensor([1, 2, 3, 4]);\n * prod(t); // tensor(24) - 1*2*3*4\n *\n * const t2 = tensor([2.5, 4.0]);\n * prod(t2); // tensor(10.0)\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.prod.html | NumPy prod}\n */\nexport function prod(t: Tensor, axis?: Axis | Axis[], keepdims = false): Tensor {\n ensureNumericTensor(t, \"prod\");\n\n const prodAxis = (\n input: Tensor<Shape, NumericDType>,\n ax: number,\n keep: boolean\n ): Tensor<Shape, NumericDType> => {\n const axisDim = getShapeDim(input.shape, ax);\n\n const outShapeArr: number[] = [];\n for (let i = 0; i < input.ndim; i++) {\n if (i === ax) {\n if (keep) outShapeArr.push(1);\n } else {\n outShapeArr.push(getShapeDim(input.shape, i));\n }\n }\n validateShape(outShapeArr);\n\n const outSize = outShapeArr.reduce((a, b) => a * b, 1);\n\n let outData: TypedArray | BigInt64Array;\n if (input.data instanceof BigInt64Array) {\n outData = new BigInt64Array(outSize);\n } else {\n const Ctor = dtypeToTypedArrayCtor(input.dtype);\n outData = new Ctor(outSize);\n }\n\n const outStrides = new Array<number>(outShapeArr.length);\n let stride = 1;\n for (let i = outShapeArr.length - 1; i >= 0; i--) {\n outStrides[i] = stride;\n stride *= getArrayElement(outShapeArr, i);\n }\n\n for (let outFlat = 0; outFlat < outSize; outFlat++) {\n let rem = outFlat;\n const outIdx = new Array<number>(outShapeArr.length);\n for (let i = 0; i < outShapeArr.length; i++) {\n const s = getArrayElement(outStrides, i, 1);\n outIdx[i] = Math.floor(rem / s);\n rem %= s;\n }\n\n const inIdx = new Array<number>(input.ndim);\n if (keep) {\n for (let i = 0; i < input.ndim; i++) {\n inIdx[i] = i === ax ? 0 : getArrayElement(outIdx, i);\n }\n } else {\n let outAxis = 0;\n for (let i = 0; i < input.ndim; i++) {\n if (i === ax) {\n inIdx[i] = 0;\n } else {\n inIdx[i] = getArrayElement(outIdx, outAxis);\n outAxis++;\n }\n }\n }\n\n let baseOffset = input.offset;\n for (let i = 0; i < input.ndim; i++) {\n baseOffset += getArrayElement(inIdx, i) * getArrayElement(input.strides, i);\n }\n\n const axisStride = getArrayElement(input.strides, ax);\n if (input.data instanceof BigInt64Array) {\n let acc = 1n;\n if (axisDim > 0) {\n for (let k = 0; k < axisDim; k++) {\n acc *= getBigIntElement(input.data, baseOffset + k * axisStride);\n }\n }\n if (acc < INT64_MIN || acc > INT64_MAX) {\n throw new DataValidationError(\"int64 prod overflow\");\n }\n if (!(outData instanceof BigInt64Array)) {\n throw new DTypeError(\"prod output dtype mismatch\");\n }\n outData[outFlat] = acc;\n } else {\n let acc = 1;\n if (axisDim > 0) {\n const numericData = input.data;\n if (Array.isArray(numericData)) {\n throw new DTypeError(\"prod not supported for string dtype\");\n }\n for (let k = 0; k < axisDim; k++) {\n acc *= getNumericElement(numericData, baseOffset + k * axisStride);\n }\n }\n if (outData instanceof BigInt64Array) {\n throw new DTypeError(\"prod output dtype mismatch\");\n }\n outData[outFlat] = acc;\n }\n }\n\n if (outData instanceof BigInt64Array) {\n return Tensor.fromTypedArray({\n data: outData,\n shape: outShapeArr,\n dtype: \"int64\",\n device: input.device,\n });\n }\n return Tensor.fromTypedArray({\n data: outData,\n shape: outShapeArr,\n dtype: input.dtype,\n device: input.device,\n });\n };\n\n if (axis !== undefined) {\n const axes = normalizeAxes(axis, t.ndim);\n const sorted = keepdims\n ? axes.slice().sort((a, b) => a - b)\n : axes.slice().sort((a, b) => b - a);\n let result: Tensor<Shape, NumericDType> = t;\n for (const ax of sorted) {\n result = prodAxis(result, ax, keepdims);\n }\n return result;\n }\n\n // Handle empty tensor - return 1 (multiplicative identity)\n if (t.size === 0) {\n const emptyShape: Shape = [];\n if (t.dtype === \"int64\") {\n const out = new BigInt64Array(1);\n out[0] = 1n;\n return Tensor.fromTypedArray({\n data: out,\n shape: emptyShape,\n dtype: \"int64\",\n device: t.device,\n });\n }\n const Ctor = dtypeToTypedArrayCtor(t.dtype);\n const out = new Ctor(1);\n out[0] = 1;\n return Tensor.fromTypedArray({\n data: out,\n shape: emptyShape,\n dtype: t.dtype,\n device: t.device,\n });\n }\n\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n // Handle BigInt separately (int64 dtype)\n if (t.data instanceof BigInt64Array) {\n let acc = 1n;\n\n // Multiply all elements\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n acc *= getBigIntElement(t.data, srcOffset);\n }\n\n // Check for overflow (simplified check)\n if (acc < INT64_MIN || acc > INT64_MAX) {\n throw new DataValidationError(\"int64 prod overflow\");\n }\n\n const out = new BigInt64Array(1);\n out[0] = acc;\n const outShape: Shape = keepdims ? new Array<number>(t.ndim).fill(1) : [];\n\n return Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: \"int64\",\n device: t.device,\n });\n }\n\n // Handle numeric types (float64, int32, etc.)\n const numericData = t.data;\n if (Array.isArray(numericData)) {\n throw new DTypeError(\"prod not supported for string dtype\");\n }\n let acc = 1;\n\n // Multiply all elements\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n acc *= getNumericElement(numericData, srcOffset);\n }\n\n // Create output array based on input dtype\n const Ctor = dtypeToTypedArrayCtor(t.dtype);\n const out = new Ctor(1);\n if (t.dtype === \"int32\") {\n out[0] = Math.floor(acc);\n } else {\n out[0] = acc;\n }\n\n const outShape: Shape = keepdims ? new Array<number>(t.ndim).fill(1) : [];\n return Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: t.dtype,\n device: t.device,\n });\n}\n\n/**\n * Standard deviation along axis.\n *\n * Computes the standard deviation, a measure of the spread of a distribution.\n * Uses the formula: sqrt(variance)\n *\n * **Complexity**: O(n) where n is the number of elements (requires 2 passes)\n *\n * @param t - Input tensor\n * @param axis - Axis or axes along which to compute std. If undefined, compute over all elements\n * @param keepdims - If true, keep reduced dimensions as size 1\n * @param ddof - Delta degrees of freedom (default 0 for population, 1 for sample)\n * @returns Tensor containing the standard deviation values\n *\n * @example\n * ```ts\n * import { tensor, std } from 'deepbox/ndarray';\n *\n * const t = tensor([1, 2, 3, 4, 5]);\n * std(t); // tensor(1.414...) - population std\n * std(t, undefined, false, 1); // sample std\n *\n * const t2 = tensor([[1, 2], [3, 4]]);\n * std(t2, 0); // [1, 1] - std along rows\n * std(t2, 1); // [0.5, 0.5] - std along columns\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.std.html | NumPy std}\n */\nexport function std(t: Tensor, axis?: Axis, keepdims = false, ddof = 0): Tensor {\n // Compute variance first, then take square root\n const varianceTensor = variance(t, axis, keepdims, ddof);\n\n // Apply sqrt element-wise to variance\n const varianceData = expectNumericData(varianceTensor.data, \"std\");\n const out = new Float64Array(varianceTensor.size);\n\n for (let i = 0; i < varianceTensor.size; i++) {\n out[i] = Math.sqrt(getNumericElement(varianceData, varianceTensor.offset + i));\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: varianceTensor.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Variance along axis.\n *\n * Computes the variance, the average of squared deviations from the mean.\n * Formula: Σ(x - mean)² / (N - ddof)\n *\n * **Complexity**: O(n) where n is the number of elements (requires 2 passes: one for mean, one for variance)\n *\n * @param t - Input tensor\n * @param axis - Axis along which to compute variance. If undefined, compute over all elements\n * @param keepdims - If true, keep reduced dimensions as size 1\n * @param ddof - Delta degrees of freedom (default 0 for population, 1 for sample)\n * @returns Tensor containing the variance values\n *\n * @example\n * ```ts\n * import { tensor, variance } from 'deepbox/ndarray';\n *\n * const t = tensor([1, 2, 3, 4, 5]);\n * variance(t); // tensor(2.0) - population variance\n * variance(t, undefined, false, 1); // tensor(2.5) - sample variance\n *\n * const t2 = tensor([[1, 2], [3, 4]]);\n * variance(t2, 0); // [1, 1] - variance along rows\n * variance(t2, 1); // [0.25, 0.25] - variance along columns\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.var.html | NumPy var}\n */\nexport function variance(t: Tensor, axis?: Axis, keepdims = false, ddof = 0): Tensor {\n ensureNumericTensor(t, \"variance\");\n\n if (ddof < 0) {\n throw new InvalidParameterError(\"ddof must be non-negative\", \"ddof\", ddof);\n }\n\n // Need at least one element\n if (t.size === 0) {\n throw new InvalidParameterError(\"variance() requires at least one element\", \"t\");\n }\n\n // Full reduction case\n if (axis === undefined) {\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n // Check ddof validity\n if (t.size <= ddof) {\n throw new InvalidParameterError(\n `ddof=${ddof} >= size=${t.size}, variance undefined`,\n \"ddof\",\n ddof\n );\n }\n\n // Pass 1: Compute mean\n let meanValue = 0;\n if (t.data instanceof BigInt64Array) {\n let sum = 0;\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n sum += bigintToNumberSafe(getBigIntElement(t.data, srcOffset));\n }\n meanValue = sum / t.size;\n } else {\n const numericData = t.data;\n if (Array.isArray(numericData)) {\n throw new DTypeError(\"variance not supported for string dtype\");\n }\n let sum = 0;\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n sum += getNumericElement(numericData, srcOffset);\n }\n meanValue = sum / t.size;\n }\n\n // Pass 2: Compute sum of squared deviations\n let sumSquaredDev = 0;\n if (t.data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const val = bigintToNumberSafe(getBigIntElement(t.data, srcOffset));\n const deviation = val - meanValue;\n sumSquaredDev += deviation * deviation;\n }\n } else {\n const numericData = t.data;\n if (Array.isArray(numericData)) {\n throw new DTypeError(\"variance not supported for string dtype\");\n }\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const val = getNumericElement(numericData, srcOffset);\n const deviation = val - meanValue;\n sumSquaredDev += deviation * deviation;\n }\n }\n\n // Compute variance: divide by (N - ddof)\n const varianceValue = sumSquaredDev / (t.size - ddof);\n\n const out = new Float64Array(1);\n out[0] = varianceValue;\n const outShape: Shape = keepdims ? new Array<number>(t.ndim).fill(1) : [];\n\n return Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: \"float64\",\n device: t.device,\n });\n }\n\n // Axis-wise reduction\n const ax = normalizeAxis(axis, t.ndim);\n const axisDim = getShapeDim(t.shape, ax);\n\n if (axisDim === 0) {\n const outShapeArr: number[] = [];\n for (let i = 0; i < t.ndim; i++) {\n if (i === ax) {\n if (keepdims) outShapeArr.push(1);\n } else {\n outShapeArr.push(getShapeDim(t.shape, i));\n }\n }\n validateShape(outShapeArr);\n const outSize = outShapeArr.reduce((a, b) => a * b, 1);\n const out = new Float64Array(outSize);\n out.fill(NaN);\n return Tensor.fromTypedArray({\n data: out,\n shape: outShapeArr,\n dtype: \"float64\",\n device: t.device,\n });\n }\n\n // Check ddof validity for axis reduction\n if (axisDim <= ddof) {\n throw new InvalidParameterError(\n `ddof=${ddof} >= axis size=${axisDim}, variance undefined`,\n \"ddof\",\n ddof\n );\n }\n\n // Build output shape\n const outShapeArr: number[] = [];\n for (let i = 0; i < t.ndim; i++) {\n if (i === ax) {\n if (keepdims) outShapeArr.push(1);\n } else {\n outShapeArr.push(getShapeDim(t.shape, i));\n }\n }\n validateShape(outShapeArr);\n\n const outSize = outShapeArr.reduce((a, b) => a * b, 1);\n const out = new Float64Array(outSize);\n\n // Precompute output strides\n const outStrides = new Array<number>(outShapeArr.length);\n let stride = 1;\n for (let i = outShapeArr.length - 1; i >= 0; i--) {\n outStrides[i] = stride;\n stride *= getArrayElement(outShapeArr, i);\n }\n\n // For each output position, compute variance along the axis\n for (let outFlat = 0; outFlat < outSize; outFlat++) {\n // Convert flat to multi-index\n let rem = outFlat;\n const outIdx = new Array<number>(outShapeArr.length);\n for (let i = 0; i < outShapeArr.length; i++) {\n const s = getArrayElement(outStrides, i, 1);\n outIdx[i] = Math.floor(rem / s);\n rem %= s;\n }\n\n // Map outIdx back to an input base index (with reduced axis set to 0)\n const inIdx = new Array<number>(t.ndim);\n if (keepdims) {\n for (let i = 0; i < t.ndim; i++) {\n inIdx[i] = i === ax ? 0 : getArrayElement(outIdx, i);\n }\n } else {\n let outAxis = 0;\n for (let i = 0; i < t.ndim; i++) {\n if (i === ax) {\n inIdx[i] = 0;\n } else {\n inIdx[i] = getArrayElement(outIdx, outAxis);\n outAxis++;\n }\n }\n }\n\n let baseOffset = t.offset;\n for (let i = 0; i < t.ndim; i++) {\n baseOffset += getArrayElement(inIdx, i) * getArrayElement(t.strides, i);\n }\n\n const axisStride = getArrayElement(t.strides, ax);\n\n // Pass 1: Compute mean along axis\n let meanValue = 0;\n if (t.data instanceof BigInt64Array) {\n let sum = 0;\n for (let k = 0; k < axisDim; k++) {\n sum += bigintToNumberSafe(getBigIntElement(t.data, baseOffset + k * axisStride));\n }\n meanValue = sum / axisDim;\n } else {\n const numericData = t.data;\n if (Array.isArray(numericData)) {\n throw new DTypeError(\"variance not supported for string dtype\");\n }\n let sum = 0;\n for (let k = 0; k < axisDim; k++) {\n sum += getNumericElement(numericData, baseOffset + k * axisStride);\n }\n meanValue = sum / axisDim;\n }\n\n // Pass 2: Compute sum of squared deviations\n let sumSquaredDev = 0;\n if (t.data instanceof BigInt64Array) {\n for (let k = 0; k < axisDim; k++) {\n const val = bigintToNumberSafe(getBigIntElement(t.data, baseOffset + k * axisStride));\n const deviation = val - meanValue;\n sumSquaredDev += deviation * deviation;\n }\n } else {\n const numericData = t.data;\n if (Array.isArray(numericData)) {\n throw new DTypeError(\"variance not supported for string dtype\");\n }\n for (let k = 0; k < axisDim; k++) {\n const val = getNumericElement(numericData, baseOffset + k * axisStride);\n const deviation = val - meanValue;\n sumSquaredDev += deviation * deviation;\n }\n }\n\n // Compute variance: divide by (axisDim - ddof)\n out[outFlat] = sumSquaredDev / (axisDim - ddof);\n }\n\n const finalShape: Shape = outShapeArr;\n return Tensor.fromTypedArray({\n data: out,\n shape: finalShape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Minimum value along axis.\n *\n * Finds the smallest element in the tensor, optionally along one or more axes.\n *\n * **Complexity**: O(n) where n is the number of elements\n *\n * @param t - Input tensor\n * @param axis - Axis or axes along which to compute the minimum\n * @param keepdims - If true, keep reduced dimensions as size 1\n * @returns Scalar tensor containing the minimum value\n *\n * @example\n * ```ts\n * import { tensor, min } from 'deepbox/ndarray';\n *\n * const t = tensor([3, 1, 4, 1, 5]);\n * min(t); // tensor(1)\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.amin.html | NumPy amin}\n */\nexport function min(t: Tensor, axis?: Axis | Axis[], keepdims = false): Tensor {\n ensureNumericTensor(t, \"min\");\n\n const minAxis = (\n input: Tensor<Shape, NumericDType>,\n ax: number,\n keep: boolean\n ): Tensor<Shape, NumericDType> => {\n const axisDim = getShapeDim(input.shape, ax);\n if (axisDim === 0) {\n throw new InvalidParameterError(\"min() requires at least one element\", \"t\");\n }\n\n const outShapeArr: number[] = [];\n for (let i = 0; i < input.ndim; i++) {\n if (i === ax) {\n if (keep) outShapeArr.push(1);\n } else {\n outShapeArr.push(getShapeDim(input.shape, i));\n }\n }\n validateShape(outShapeArr);\n\n const outSize = outShapeArr.reduce((a, b) => a * b, 1);\n let outData: TypedArray | BigInt64Array;\n if (input.data instanceof BigInt64Array) {\n outData = new BigInt64Array(outSize);\n } else {\n const Ctor = dtypeToTypedArrayCtor(input.dtype);\n outData = new Ctor(outSize);\n }\n\n const outStrides = new Array<number>(outShapeArr.length);\n let stride = 1;\n for (let i = outShapeArr.length - 1; i >= 0; i--) {\n outStrides[i] = stride;\n stride *= getArrayElement(outShapeArr, i);\n }\n\n for (let outFlat = 0; outFlat < outSize; outFlat++) {\n let rem = outFlat;\n const outIdx = new Array<number>(outShapeArr.length);\n for (let i = 0; i < outShapeArr.length; i++) {\n const s = getArrayElement(outStrides, i, 1);\n outIdx[i] = Math.floor(rem / s);\n rem %= s;\n }\n\n const inIdx = new Array<number>(input.ndim);\n if (keep) {\n for (let i = 0; i < input.ndim; i++) {\n inIdx[i] = i === ax ? 0 : getArrayElement(outIdx, i);\n }\n } else {\n let outAxis = 0;\n for (let i = 0; i < input.ndim; i++) {\n if (i === ax) {\n inIdx[i] = 0;\n } else {\n inIdx[i] = getArrayElement(outIdx, outAxis);\n outAxis++;\n }\n }\n }\n\n let baseOffset = input.offset;\n for (let i = 0; i < input.ndim; i++) {\n baseOffset += getArrayElement(inIdx, i) * getArrayElement(input.strides, i);\n }\n\n const axisStride = getArrayElement(input.strides, ax);\n if (input.data instanceof BigInt64Array) {\n let minVal = getBigIntElement(input.data, baseOffset);\n for (let k = 1; k < axisDim; k++) {\n const val = getBigIntElement(input.data, baseOffset + k * axisStride);\n if (val < minVal) minVal = val;\n }\n if (!(outData instanceof BigInt64Array)) {\n throw new DTypeError(\"min output dtype mismatch\");\n }\n outData[outFlat] = minVal;\n } else {\n const numericData = input.data;\n if (Array.isArray(numericData)) {\n throw new DTypeError(\"min not supported for string dtype\");\n }\n let minVal = getNumericElement(numericData, baseOffset);\n for (let k = 1; k < axisDim; k++) {\n const val = getNumericElement(numericData, baseOffset + k * axisStride);\n if (val < minVal || Number.isNaN(val)) minVal = val;\n }\n if (outData instanceof BigInt64Array) {\n throw new DTypeError(\"min output dtype mismatch\");\n }\n outData[outFlat] = minVal;\n }\n }\n\n if (outData instanceof BigInt64Array) {\n return Tensor.fromTypedArray({\n data: outData,\n shape: outShapeArr,\n dtype: \"int64\",\n device: input.device,\n });\n }\n return Tensor.fromTypedArray({\n data: outData,\n shape: outShapeArr,\n dtype: input.dtype,\n device: input.device,\n });\n };\n\n if (axis !== undefined) {\n const axes = normalizeAxes(axis, t.ndim);\n const sorted = keepdims\n ? axes.slice().sort((a, b) => a - b)\n : axes.slice().sort((a, b) => b - a);\n let result: Tensor<Shape, NumericDType> = t;\n for (const ax of sorted) {\n result = minAxis(result, ax, keepdims);\n }\n return result;\n }\n\n // Need at least one element\n if (t.size === 0) {\n throw new InvalidParameterError(\"min() requires at least one element\", \"t\");\n }\n\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n // Handle BigInt separately (int64 dtype)\n if (t.data instanceof BigInt64Array) {\n let minVal = getBigIntElement(\n t.data,\n flatOffset(0, t.offset, contiguous, logicalStrides, t.strides)\n );\n\n // Find minimum value\n for (let i = 1; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const val = getBigIntElement(t.data, srcOffset);\n if (val < minVal) {\n minVal = val;\n }\n }\n\n const out = new BigInt64Array(1);\n out[0] = minVal;\n const outShape: Shape = keepdims ? new Array<number>(t.ndim).fill(1) : [];\n\n return Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: \"int64\",\n device: t.device,\n });\n }\n\n // Handle numeric types (float64, int32, etc.)\n const numericData = expectNumericData(t.data, \"min\");\n\n let minVal: number;\n // Fast path: contiguous zero-offset — direct TypedArray loop\n if (contiguous && t.offset === 0) {\n minVal = numericData[0] as number;\n for (let i = 1; i < t.size; i++) {\n const val = numericData[i] as number;\n if (val < minVal || Number.isNaN(val)) {\n minVal = val;\n }\n }\n } else {\n minVal = getNumericElement(\n numericData,\n flatOffset(0, t.offset, contiguous, logicalStrides, t.strides)\n );\n // Find minimum value (propagate NaN to match NumPy amin behavior)\n for (let i = 1; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const val = getNumericElement(numericData, srcOffset);\n if (val < minVal || Number.isNaN(val)) {\n minVal = val;\n }\n }\n }\n\n // Create output array based on input dtype\n const Ctor = dtypeToTypedArrayCtor(t.dtype);\n const out = new Ctor(1);\n out[0] = minVal;\n\n const outShape: Shape = keepdims ? new Array<number>(t.ndim).fill(1) : [];\n return Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: t.dtype,\n device: t.device,\n });\n}\n\n/**\n * Maximum value along axis.\n *\n * Finds the largest element in the tensor, optionally along one or more axes.\n *\n * **Complexity**: O(n) where n is the number of elements\n *\n * @param t - Input tensor\n * @param axis - Axis or axes along which to compute the maximum\n * @param keepdims - If true, keep reduced dimensions as size 1\n * @returns Scalar tensor containing the maximum value\n *\n * @example\n * ```ts\n * import { tensor, max } from 'deepbox/ndarray';\n *\n * const t = tensor([3, 1, 4, 1, 5]);\n * max(t); // tensor(5)\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.amax.html | NumPy amax}\n */\nexport function max(t: Tensor, axis?: Axis | Axis[], keepdims = false): Tensor {\n ensureNumericTensor(t, \"max\");\n\n const maxAxis = (\n input: Tensor<Shape, NumericDType>,\n ax: number,\n keep: boolean\n ): Tensor<Shape, NumericDType> => {\n const axisDim = getShapeDim(input.shape, ax);\n if (axisDim === 0) {\n throw new InvalidParameterError(\"max() requires at least one element\", \"t\");\n }\n\n const outShapeArr: number[] = [];\n for (let i = 0; i < input.ndim; i++) {\n if (i === ax) {\n if (keep) outShapeArr.push(1);\n } else {\n outShapeArr.push(getShapeDim(input.shape, i));\n }\n }\n validateShape(outShapeArr);\n\n const outSize = outShapeArr.reduce((a, b) => a * b, 1);\n let outData: TypedArray | BigInt64Array;\n if (input.data instanceof BigInt64Array) {\n outData = new BigInt64Array(outSize);\n } else {\n const Ctor = dtypeToTypedArrayCtor(input.dtype);\n outData = new Ctor(outSize);\n }\n\n const outStrides = new Array<number>(outShapeArr.length);\n let stride = 1;\n for (let i = outShapeArr.length - 1; i >= 0; i--) {\n outStrides[i] = stride;\n stride *= getArrayElement(outShapeArr, i);\n }\n\n for (let outFlat = 0; outFlat < outSize; outFlat++) {\n let rem = outFlat;\n const outIdx = new Array<number>(outShapeArr.length);\n for (let i = 0; i < outShapeArr.length; i++) {\n const s = getArrayElement(outStrides, i, 1);\n outIdx[i] = Math.floor(rem / s);\n rem %= s;\n }\n\n const inIdx = new Array<number>(input.ndim);\n if (keep) {\n for (let i = 0; i < input.ndim; i++) {\n inIdx[i] = i === ax ? 0 : getArrayElement(outIdx, i);\n }\n } else {\n let outAxis = 0;\n for (let i = 0; i < input.ndim; i++) {\n if (i === ax) {\n inIdx[i] = 0;\n } else {\n inIdx[i] = getArrayElement(outIdx, outAxis);\n outAxis++;\n }\n }\n }\n\n let baseOffset = input.offset;\n for (let i = 0; i < input.ndim; i++) {\n baseOffset += getArrayElement(inIdx, i) * getArrayElement(input.strides, i);\n }\n\n const axisStride = getArrayElement(input.strides, ax);\n if (input.data instanceof BigInt64Array) {\n let maxVal = getBigIntElement(input.data, baseOffset);\n for (let k = 1; k < axisDim; k++) {\n const val = getBigIntElement(input.data, baseOffset + k * axisStride);\n if (val > maxVal) maxVal = val;\n }\n if (!(outData instanceof BigInt64Array)) {\n throw new DTypeError(\"max output dtype mismatch\");\n }\n outData[outFlat] = maxVal;\n } else {\n const numericData = expectNumericData(input.data, \"max\");\n let maxVal = getNumericElement(numericData, baseOffset);\n for (let k = 1; k < axisDim; k++) {\n const val = getNumericElement(numericData, baseOffset + k * axisStride);\n if (val > maxVal || Number.isNaN(val)) maxVal = val;\n }\n if (outData instanceof BigInt64Array) {\n throw new DTypeError(\"max output dtype mismatch\");\n }\n outData[outFlat] = maxVal;\n }\n }\n\n if (outData instanceof BigInt64Array) {\n return Tensor.fromTypedArray({\n data: outData,\n shape: outShapeArr,\n dtype: \"int64\",\n device: input.device,\n });\n }\n return Tensor.fromTypedArray({\n data: outData,\n shape: outShapeArr,\n dtype: input.dtype,\n device: input.device,\n });\n };\n\n if (axis !== undefined) {\n const axes = normalizeAxes(axis, t.ndim);\n const sorted = keepdims\n ? axes.slice().sort((a, b) => a - b)\n : axes.slice().sort((a, b) => b - a);\n let result: Tensor<Shape, NumericDType> = t;\n for (const ax of sorted) {\n result = maxAxis(result, ax, keepdims);\n }\n return result;\n }\n\n // Need at least one element\n if (t.size === 0) {\n throw new InvalidParameterError(\"max() requires at least one element\", \"t\");\n }\n\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n // Handle BigInt separately (int64 dtype)\n if (t.data instanceof BigInt64Array) {\n let maxVal = getBigIntElement(\n t.data,\n flatOffset(0, t.offset, contiguous, logicalStrides, t.strides)\n );\n\n // Find maximum value\n for (let i = 1; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const val = getBigIntElement(t.data, srcOffset);\n if (val > maxVal) {\n maxVal = val;\n }\n }\n\n const out = new BigInt64Array(1);\n out[0] = maxVal;\n const outShape: Shape = keepdims ? new Array<number>(t.ndim).fill(1) : [];\n\n return Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: \"int64\",\n device: t.device,\n });\n }\n\n // Handle numeric types (float64, int32, etc.)\n const numericData = expectNumericData(t.data, \"max\");\n\n let maxVal: number;\n // Fast path: contiguous zero-offset — direct TypedArray loop\n if (contiguous && t.offset === 0) {\n maxVal = numericData[0] as number;\n for (let i = 1; i < t.size; i++) {\n const val = numericData[i] as number;\n if (val > maxVal || Number.isNaN(val)) {\n maxVal = val;\n }\n }\n } else {\n maxVal = getNumericElement(\n numericData,\n flatOffset(0, t.offset, contiguous, logicalStrides, t.strides)\n );\n // Find maximum value (propagate NaN to match NumPy amax behavior)\n for (let i = 1; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n const val = getNumericElement(numericData, srcOffset);\n if (val > maxVal || Number.isNaN(val)) {\n maxVal = val;\n }\n }\n }\n\n // Create output array based on input dtype\n const Ctor = dtypeToTypedArrayCtor(t.dtype);\n const out = new Ctor(1);\n out[0] = maxVal;\n\n const outShape: Shape = keepdims ? new Array<number>(t.ndim).fill(1) : [];\n return Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: t.dtype,\n device: t.device,\n });\n}\n\n/**\n * Median value along axis.\n *\n * Computes the median (middle value) of the data.\n * For even-sized arrays, returns the average of the two middle values.\n *\n * **Complexity**: O(n log n) due to sorting per output element\n *\n * @param t - Input tensor\n * @param axis - Axis along which to compute median. If undefined, compute over all elements\n * @param keepdims - If true, keep reduced dimensions as size 1\n * @returns Tensor containing the median values\n *\n * @example\n * ```ts\n * import { tensor, median } from 'deepbox/ndarray';\n *\n * const t = tensor([1, 3, 5, 7, 9]);\n * median(t); // tensor(5) - middle value\n *\n * const t2 = tensor([1, 2, 3, 4]);\n * median(t2); // tensor(2.5) - average of 2 and 3\n *\n * const t3 = tensor([[1, 3], [2, 4]]);\n * median(t3, 0); // [1.5, 3.5] - median along rows\n * median(t3, 1); // [2, 3] - median along columns\n * ```\n *\n * Performance:\n * - This implementation copies and sorts values (O(n log n) time, O(n) memory).\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.median.html | NumPy median}\n */\nexport function median(t: Tensor, axis?: Axis, keepdims = false): Tensor {\n ensureNumericTensor(t, \"median\");\n\n // Need at least one element\n if (t.size === 0) {\n throw new InvalidParameterError(\"median() requires at least one element\", \"t\");\n }\n\n // Full reduction case\n if (axis === undefined) {\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n // Copy data to avoid mutating original (must not use in-place sort)\n const sorted: number[] = [];\n\n if (t.data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n sorted.push(Number(getBigIntElement(t.data, srcOffset)));\n }\n } else {\n const numericData = expectNumericData(t.data, \"median\");\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n sorted.push(getNumericElement(numericData, srcOffset));\n }\n }\n\n sorted.sort((a, b) => a - b);\n\n let medianValue: number;\n const mid = Math.floor(sorted.length / 2);\n\n if (sorted.length % 2 === 0) {\n medianValue = (getArrayElement(sorted, mid - 1) + getArrayElement(sorted, mid)) / 2;\n } else {\n medianValue = getArrayElement(sorted, mid);\n }\n\n const out = new Float64Array(1);\n out[0] = medianValue;\n const outShape: Shape = keepdims ? new Array<number>(t.ndim).fill(1) : [];\n\n return Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: \"float64\",\n device: t.device,\n });\n }\n\n // Axis-wise reduction\n const ax = normalizeAxis(axis, t.ndim);\n const axisDim = getShapeDim(t.shape, ax);\n\n if (axisDim === 0) {\n throw new ShapeError(\"Internal error: missing axis dimension\");\n }\n\n // Build output shape\n const outShapeArr: number[] = [];\n for (let i = 0; i < t.ndim; i++) {\n if (i === ax) {\n if (keepdims) outShapeArr.push(1);\n } else {\n outShapeArr.push(getShapeDim(t.shape, i));\n }\n }\n validateShape(outShapeArr);\n\n const outSize = outShapeArr.reduce((a, b) => a * b, 1);\n const out = new Float64Array(outSize);\n\n // Precompute output strides\n const outStrides = new Array<number>(outShapeArr.length);\n let stride = 1;\n for (let i = outShapeArr.length - 1; i >= 0; i--) {\n outStrides[i] = stride;\n stride *= getArrayElement(outShapeArr, i);\n }\n\n // For each output position, compute median along the axis\n for (let outFlat = 0; outFlat < outSize; outFlat++) {\n // Convert flat to multi-index\n let rem = outFlat;\n const outIdx = new Array<number>(outShapeArr.length);\n for (let i = 0; i < outShapeArr.length; i++) {\n const s = getArrayElement(outStrides, i, 1);\n outIdx[i] = Math.floor(rem / s);\n rem %= s;\n }\n\n // Map outIdx back to an input base index (with reduced axis set to 0)\n const inIdx = new Array<number>(t.ndim);\n if (keepdims) {\n for (let i = 0; i < t.ndim; i++) {\n inIdx[i] = i === ax ? 0 : getArrayElement(outIdx, i);\n }\n } else {\n let outAxis = 0;\n for (let i = 0; i < t.ndim; i++) {\n if (i === ax) {\n inIdx[i] = 0;\n } else {\n inIdx[i] = getArrayElement(outIdx, outAxis);\n outAxis++;\n }\n }\n }\n\n let baseOffset = t.offset;\n for (let i = 0; i < t.ndim; i++) {\n baseOffset += getArrayElement(inIdx, i) * getArrayElement(t.strides, i);\n }\n\n const axisStride = getArrayElement(t.strides, ax);\n\n // Collect values along axis\n const sorted: number[] = [];\n if (t.data instanceof BigInt64Array) {\n for (let k = 0; k < axisDim; k++) {\n sorted.push(Number(getBigIntElement(t.data, baseOffset + k * axisStride)));\n }\n } else {\n const numericData = expectNumericData(t.data, \"median\");\n for (let k = 0; k < axisDim; k++) {\n sorted.push(getNumericElement(numericData, baseOffset + k * axisStride));\n }\n }\n\n // Sort and compute median\n sorted.sort((a, b) => a - b);\n const mid = Math.floor(sorted.length / 2);\n\n if (sorted.length % 2 === 0) {\n out[outFlat] = (getArrayElement(sorted, mid - 1) + getArrayElement(sorted, mid)) / 2;\n } else {\n out[outFlat] = getArrayElement(sorted, mid);\n }\n }\n\n const finalShape: Shape = outShapeArr;\n return Tensor.fromTypedArray({\n data: out,\n shape: finalShape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Cumulative sum along axis.\n *\n * Returns an array of the same shape where each element is the sum of all\n * previous elements (inclusive) along the specified axis.\n *\n * **Complexity**: O(n) where n is the number of elements\n *\n * @param t - Input tensor\n * @param axis - Axis along which to compute cumulative sum. If undefined, operates on the flattened array.\n * @returns Tensor of same shape with cumulative sums\n *\n * @example\n * ```ts\n * import { tensor, cumsum } from 'deepbox/ndarray';\n *\n * const t = tensor([1, 2, 3, 4]);\n * cumsum(t); // tensor([1, 3, 6, 10])\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.cumsum.html | NumPy cumsum}\n */\nexport function cumsum(t: Tensor, axis?: Axis): Tensor {\n // String dtype not supported\n if (t.dtype === \"string\") {\n throw new DTypeError(\"cumsum() not supported for string dtype\");\n }\n\n if (axis !== undefined) {\n const ax = normalizeAxis(axis, t.ndim);\n const axisDim = getShapeDim(t.shape, ax);\n\n const outStrides = new Array<number>(t.ndim);\n let stride = 1;\n for (let i = t.ndim - 1; i >= 0; i--) {\n outStrides[i] = stride;\n stride *= getShapeDim(t.shape, i);\n }\n\n const baseShape: number[] = [];\n for (let i = 0; i < t.ndim; i++) {\n if (i !== ax) baseShape.push(getShapeDim(t.shape, i));\n }\n const baseSize = baseShape.reduce((a, b) => a * b, 1);\n\n if (t.data instanceof BigInt64Array) {\n const out = new BigInt64Array(t.size);\n for (let baseFlat = 0; baseFlat < baseSize; baseFlat++) {\n let rem = baseFlat;\n const baseIdx = new Array<number>(baseShape.length);\n for (let i = 0; i < baseShape.length; i++) {\n const s = baseShape.slice(i + 1).reduce((a, b) => a * b, 1);\n baseIdx[i] = baseShape.length === 0 ? 0 : Math.floor(rem / s);\n rem = baseShape.length === 0 ? 0 : rem % s;\n }\n\n const inIdx = new Array<number>(t.ndim);\n let outAxis = 0;\n for (let i = 0; i < t.ndim; i++) {\n if (i === ax) {\n inIdx[i] = 0;\n } else {\n inIdx[i] = baseIdx[outAxis] ?? 0;\n outAxis++;\n }\n }\n\n let inBaseOffset = t.offset;\n let outBaseOffset = 0;\n for (let i = 0; i < t.ndim; i++) {\n inBaseOffset += getArrayElement(inIdx, i) * getArrayElement(t.strides, i);\n outBaseOffset += getArrayElement(inIdx, i) * getArrayElement(outStrides, i);\n }\n\n const axisStride = getArrayElement(t.strides, ax);\n const outAxisStride = getArrayElement(outStrides, ax);\n let acc = 0n;\n for (let k = 0; k < axisDim; k++) {\n acc += getBigIntElement(t.data, inBaseOffset + k * axisStride);\n out[outBaseOffset + k * outAxisStride] = acc;\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"int64\",\n device: t.device,\n });\n }\n\n const numericData = expectNumericData(t.data, \"cumsum\");\n const out = new Float64Array(t.size);\n for (let baseFlat = 0; baseFlat < baseSize; baseFlat++) {\n let rem = baseFlat;\n const baseIdx = new Array<number>(baseShape.length);\n for (let i = 0; i < baseShape.length; i++) {\n const s = baseShape.slice(i + 1).reduce((a, b) => a * b, 1);\n baseIdx[i] = baseShape.length === 0 ? 0 : Math.floor(rem / s);\n rem = baseShape.length === 0 ? 0 : rem % s;\n }\n\n const inIdx = new Array<number>(t.ndim);\n let outAxis = 0;\n for (let i = 0; i < t.ndim; i++) {\n if (i === ax) {\n inIdx[i] = 0;\n } else {\n inIdx[i] = baseIdx[outAxis] ?? 0;\n outAxis++;\n }\n }\n\n let inBaseOffset = t.offset;\n let outBaseOffset = 0;\n for (let i = 0; i < t.ndim; i++) {\n inBaseOffset += getArrayElement(inIdx, i) * getArrayElement(t.strides, i);\n outBaseOffset += getArrayElement(inIdx, i) * getArrayElement(outStrides, i);\n }\n\n const axisStride = getArrayElement(t.strides, ax);\n const outAxisStride = getArrayElement(outStrides, ax);\n let acc = 0;\n for (let k = 0; k < axisDim; k++) {\n acc += getNumericElement(numericData, inBaseOffset + k * axisStride);\n out[outBaseOffset + k * outAxisStride] = acc;\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n }\n\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n // Handle BigInt separately (int64 dtype)\n if (t.data instanceof BigInt64Array) {\n const out = new BigInt64Array(t.size);\n let acc = 0n;\n\n // Compute cumulative sum\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n acc += getBigIntElement(t.data, srcOffset);\n out[i] = acc;\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"int64\",\n device: t.device,\n });\n }\n\n // Handle numeric types (float64, int32, etc.)\n // Always use float64 for cumsum to avoid overflow\n const numericData = expectNumericData(t.data, \"cumsum\");\n const out = new Float64Array(t.size);\n let acc = 0;\n\n // Compute cumulative sum\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n acc += getNumericElement(numericData, srcOffset);\n out[i] = acc;\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Cumulative product along axis.\n *\n * Returns an array of the same shape where each element is the product of all\n * previous elements (inclusive) along the specified axis.\n *\n * **Complexity**: O(n) where n is the number of elements\n *\n * @param t - Input tensor\n * @param axis - Axis along which to compute cumulative product. If undefined, operates on the flattened array.\n * @returns Tensor of same shape with cumulative products\n *\n * @example\n * ```ts\n * import { tensor, cumprod } from 'deepbox/ndarray';\n *\n * const t = tensor([1, 2, 3, 4]);\n * cumprod(t); // tensor([1, 2, 6, 24])\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.cumprod.html | NumPy cumprod}\n */\nexport function cumprod(t: Tensor, axis?: Axis): Tensor {\n // String dtype not supported\n if (t.dtype === \"string\") {\n throw new DTypeError(\"cumprod() not supported for string dtype\");\n }\n\n if (axis !== undefined) {\n const ax = normalizeAxis(axis, t.ndim);\n const axisDim = getShapeDim(t.shape, ax);\n\n const outStrides = new Array<number>(t.ndim);\n let stride = 1;\n for (let i = t.ndim - 1; i >= 0; i--) {\n outStrides[i] = stride;\n stride *= getShapeDim(t.shape, i);\n }\n\n const baseShape: number[] = [];\n for (let i = 0; i < t.ndim; i++) {\n if (i !== ax) baseShape.push(getShapeDim(t.shape, i));\n }\n const baseSize = baseShape.reduce((a, b) => a * b, 1);\n\n if (t.data instanceof BigInt64Array) {\n const out = new BigInt64Array(t.size);\n for (let baseFlat = 0; baseFlat < baseSize; baseFlat++) {\n let rem = baseFlat;\n const baseIdx = new Array<number>(baseShape.length);\n for (let i = 0; i < baseShape.length; i++) {\n const s = baseShape.slice(i + 1).reduce((a, b) => a * b, 1);\n baseIdx[i] = baseShape.length === 0 ? 0 : Math.floor(rem / s);\n rem = baseShape.length === 0 ? 0 : rem % s;\n }\n\n const inIdx = new Array<number>(t.ndim);\n let outAxis = 0;\n for (let i = 0; i < t.ndim; i++) {\n if (i === ax) {\n inIdx[i] = 0;\n } else {\n inIdx[i] = baseIdx[outAxis] ?? 0;\n outAxis++;\n }\n }\n\n let inBaseOffset = t.offset;\n let outBaseOffset = 0;\n for (let i = 0; i < t.ndim; i++) {\n inBaseOffset += getArrayElement(inIdx, i) * getArrayElement(t.strides, i);\n outBaseOffset += getArrayElement(inIdx, i) * getArrayElement(outStrides, i);\n }\n\n const axisStride = getArrayElement(t.strides, ax);\n const outAxisStride = getArrayElement(outStrides, ax);\n let acc = 1n;\n for (let k = 0; k < axisDim; k++) {\n acc *= getBigIntElement(t.data, inBaseOffset + k * axisStride);\n out[outBaseOffset + k * outAxisStride] = acc;\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"int64\",\n device: t.device,\n });\n }\n\n const numericData = expectNumericData(t.data, \"cumprod\");\n const out = new Float64Array(t.size);\n for (let baseFlat = 0; baseFlat < baseSize; baseFlat++) {\n let rem = baseFlat;\n const baseIdx = new Array<number>(baseShape.length);\n for (let i = 0; i < baseShape.length; i++) {\n const s = baseShape.slice(i + 1).reduce((a, b) => a * b, 1);\n baseIdx[i] = baseShape.length === 0 ? 0 : Math.floor(rem / s);\n rem = baseShape.length === 0 ? 0 : rem % s;\n }\n\n const inIdx = new Array<number>(t.ndim);\n let outAxis = 0;\n for (let i = 0; i < t.ndim; i++) {\n if (i === ax) {\n inIdx[i] = 0;\n } else {\n inIdx[i] = baseIdx[outAxis] ?? 0;\n outAxis++;\n }\n }\n\n let inBaseOffset = t.offset;\n let outBaseOffset = 0;\n for (let i = 0; i < t.ndim; i++) {\n inBaseOffset += getArrayElement(inIdx, i) * getArrayElement(t.strides, i);\n outBaseOffset += getArrayElement(inIdx, i) * getArrayElement(outStrides, i);\n }\n\n const axisStride = getArrayElement(t.strides, ax);\n const outAxisStride = getArrayElement(outStrides, ax);\n let acc = 1;\n for (let k = 0; k < axisDim; k++) {\n acc *= getNumericElement(numericData, inBaseOffset + k * axisStride);\n out[outBaseOffset + k * outAxisStride] = acc;\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n }\n\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n // Handle BigInt separately (int64 dtype)\n if (t.data instanceof BigInt64Array) {\n const out = new BigInt64Array(t.size);\n let acc = 1n;\n\n // Compute cumulative product\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n acc *= getBigIntElement(t.data, srcOffset);\n out[i] = acc;\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"int64\",\n device: t.device,\n });\n }\n\n // Handle numeric types (float64, int32, etc.)\n // Always use float64 for cumprod to avoid overflow\n const numericData = expectNumericData(t.data, \"cumprod\");\n const out = new Float64Array(t.size);\n let acc = 1;\n\n // Compute cumulative product\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n acc *= getNumericElement(numericData, srcOffset);\n out[i] = acc;\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Calculate differences along axis.\n *\n * Computes the n-th discrete difference along the given axis.\n * The first difference is given by out[i] = a[i+1] - a[i] along the flattened array.\n * Computes differences along the specified axis (default: last axis).\n *\n * **Complexity**: O(n) where n is the number of elements\n *\n * @param t - Input tensor\n * @param n - Number of times to take difference (default 1)\n * @param axis - Axis along which to compute differences (default: last axis)\n * @returns Tensor with differences (size reduced by n along the given axis)\n *\n * @example\n * ```ts\n * import { tensor, diff } from 'deepbox/ndarray';\n *\n * const t = tensor([1, 3, 6, 10]);\n * diff(t); // tensor([2, 3, 4]) - differences between consecutive elements\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.diff.html | NumPy diff}\n */\nexport function diff(t: Tensor, n = 1, axis = -1): Tensor {\n // String dtype not supported\n if (t.dtype === \"string\") {\n throw new DTypeError(\"diff() not supported for string dtype\");\n }\n\n if (n < 0) {\n throw new InvalidParameterError(\"n must be >= 0\", \"n\", n);\n }\n\n if (n === 0) {\n return t;\n }\n\n const ax = normalizeAxis(axis, t.ndim);\n\n const diffOnce = (input: Tensor, axisIdx: number): Tensor => {\n const axisDim = getShapeDim(input.shape, axisIdx);\n const outShape = [...input.shape];\n outShape[axisIdx] = Math.max(axisDim - 1, 0);\n validateShape(outShape);\n const outSize = outShape.reduce((a, b) => a * b, 1);\n\n if (input.data instanceof BigInt64Array) {\n const outData = new BigInt64Array(outSize);\n if (outSize === 0) {\n return Tensor.fromTypedArray({\n data: outData,\n shape: outShape,\n dtype: \"int64\",\n device: input.device,\n });\n }\n\n const outStrides = new Array<number>(outShape.length);\n let stride = 1;\n for (let i = outShape.length - 1; i >= 0; i--) {\n outStrides[i] = stride;\n stride *= outShape[i] ?? 1;\n }\n const inStrides = input.strides;\n\n for (let outFlat = 0; outFlat < outSize; outFlat++) {\n let rem = outFlat;\n const outIdx = new Array<number>(input.ndim);\n for (let i = 0; i < input.ndim; i++) {\n const stride = outStrides[i] ?? 1;\n outIdx[i] = Math.floor(rem / stride);\n rem -= (outIdx[i] ?? 0) * stride;\n }\n\n const currIdx = outIdx[axisIdx] ?? 0;\n const nextIdx = currIdx + 1;\n let baseOffset = input.offset;\n for (let i = 0; i < input.ndim; i++) {\n baseOffset += (outIdx[i] ?? 0) * (inStrides[i] ?? 1);\n }\n\n const axisStride = inStrides[axisIdx] ?? 1;\n const curr = getBigIntElement(input.data, baseOffset);\n const next = getBigIntElement(input.data, baseOffset + (nextIdx - currIdx) * axisStride);\n outData[outFlat] = next - curr;\n }\n\n return Tensor.fromTypedArray({\n data: outData,\n shape: outShape,\n dtype: \"int64\",\n device: input.device,\n });\n }\n\n const outData = new Float64Array(outSize);\n if (outSize === 0) {\n return Tensor.fromTypedArray({\n data: outData,\n shape: outShape,\n dtype: \"float64\",\n device: input.device,\n });\n }\n\n const outStrides = new Array<number>(outShape.length);\n let stride = 1;\n for (let i = outShape.length - 1; i >= 0; i--) {\n outStrides[i] = stride;\n stride *= outShape[i] ?? 1;\n }\n const inStrides = input.strides;\n const numericData = expectNumericData(input.data, \"diff\");\n\n for (let outFlat = 0; outFlat < outSize; outFlat++) {\n let rem = outFlat;\n const outIdx = new Array<number>(input.ndim);\n for (let i = 0; i < input.ndim; i++) {\n const stride = outStrides[i] ?? 1;\n outIdx[i] = Math.floor(rem / stride);\n rem -= (outIdx[i] ?? 0) * stride;\n }\n\n const currIdx = outIdx[axisIdx] ?? 0;\n const nextIdx = currIdx + 1;\n let baseOffset = input.offset;\n for (let i = 0; i < input.ndim; i++) {\n baseOffset += (outIdx[i] ?? 0) * (inStrides[i] ?? 1);\n }\n\n const axisStride = inStrides[axisIdx] ?? 1;\n const curr = getNumericElement(numericData, baseOffset);\n const next = getNumericElement(numericData, baseOffset + (nextIdx - currIdx) * axisStride);\n outData[outFlat] = next - curr;\n }\n\n return Tensor.fromTypedArray({\n data: outData,\n shape: outShape,\n dtype: \"float64\",\n device: input.device,\n });\n };\n\n let result = t;\n for (let i = 0; i < n; i++) {\n result = diffOnce(result, ax);\n }\n return result;\n}\n\n/**\n * Test whether any array element evaluates to True (non-zero).\n *\n * Returns true if at least one element is non-zero, false if all are zero.\n * Supports reduction over one or more axes.\n *\n * **Complexity**: O(n) - checks each element until finding non-zero or reaching end\n *\n * @param t - Input tensor\n * @param axis - Axis or axes along which to compute the reduction\n * @param keepdims - If true, keep reduced dimensions as size 1\n * @returns Scalar tensor (true=1, false=0)\n *\n * @example\n * ```ts\n * const t = tensor([0, 0, 1, 0]);\n * any(t); // tensor(1) - at least one non-zero\n *\n * const t2 = tensor([0, 0, 0]);\n * any(t2); // tensor(0) - all zeros\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.any.html | NumPy any}\n */\nexport function any(t: Tensor, axis?: number | number[], keepdims = false): Tensor {\n ensureNumericTensor(t, \"any\");\n\n const anyAxis = (input: Tensor, ax: number, keep: boolean): Tensor => {\n const axisDim = getShapeDim(input.shape, ax);\n const outShapeArr: number[] = [];\n for (let i = 0; i < input.ndim; i++) {\n if (i === ax) {\n if (keep) outShapeArr.push(1);\n } else {\n outShapeArr.push(getShapeDim(input.shape, i));\n }\n }\n validateShape(outShapeArr);\n\n const outSize = outShapeArr.reduce((a, b) => a * b, 1);\n const outData = new Uint8Array(outSize);\n\n const outStrides = new Array<number>(outShapeArr.length);\n let stride = 1;\n for (let i = outShapeArr.length - 1; i >= 0; i--) {\n outStrides[i] = stride;\n stride *= getArrayElement(outShapeArr, i);\n }\n\n for (let outFlat = 0; outFlat < outSize; outFlat++) {\n let rem = outFlat;\n const outIdx = new Array<number>(outShapeArr.length);\n for (let i = 0; i < outShapeArr.length; i++) {\n const s = getArrayElement(outStrides, i, 1);\n outIdx[i] = Math.floor(rem / s);\n rem %= s;\n }\n\n const inIdx = new Array<number>(input.ndim);\n if (keep) {\n for (let i = 0; i < input.ndim; i++) {\n inIdx[i] = i === ax ? 0 : getArrayElement(outIdx, i);\n }\n } else {\n let outAxis = 0;\n for (let i = 0; i < input.ndim; i++) {\n if (i === ax) {\n inIdx[i] = 0;\n } else {\n inIdx[i] = getArrayElement(outIdx, outAxis);\n outAxis++;\n }\n }\n }\n\n if (axisDim === 0) {\n outData[outFlat] = 0;\n continue;\n }\n\n let baseOffset = input.offset;\n for (let i = 0; i < input.ndim; i++) {\n baseOffset += getArrayElement(inIdx, i) * getArrayElement(input.strides, i);\n }\n\n const axisStride = getArrayElement(input.strides, ax);\n let result = 0;\n if (input.data instanceof BigInt64Array) {\n for (let k = 0; k < axisDim; k++) {\n if (getBigIntElement(input.data, baseOffset + k * axisStride) !== 0n) {\n result = 1;\n break;\n }\n }\n } else {\n const numericData = expectNumericData(input.data, \"any\");\n for (let k = 0; k < axisDim; k++) {\n if (getNumericElement(numericData, baseOffset + k * axisStride) !== 0) {\n result = 1;\n break;\n }\n }\n }\n outData[outFlat] = result;\n }\n\n return Tensor.fromTypedArray({\n data: outData,\n shape: outShapeArr,\n dtype: \"bool\",\n device: input.device,\n });\n };\n\n if (axis !== undefined) {\n const axes = normalizeAxes(axis, t.ndim);\n const sorted = keepdims\n ? axes.slice().sort((a, b) => a - b)\n : axes.slice().sort((a, b) => b - a);\n let result: Tensor = t;\n for (const ax of sorted) {\n result = anyAxis(result, ax, keepdims);\n }\n return result;\n }\n\n // Check if any element is non-zero (truthy)\n let result = false;\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n if (t.data instanceof BigInt64Array) {\n // BigInt path: check for any non-zero bigint\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n if (getBigIntElement(t.data, srcOffset) !== 0n) {\n result = true;\n break; // Early exit optimization - found non-zero\n }\n }\n } else {\n // Number path: check for any non-zero number\n const numericData = expectNumericData(t.data, \"any\");\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n if (getNumericElement(numericData, srcOffset) !== 0) {\n result = true;\n break; // Early exit optimization\n }\n }\n }\n\n // Return scalar boolean tensor (0 or 1)\n const out = new Uint8Array(1);\n out[0] = result ? 1 : 0;\n const outShape: Shape = keepdims ? new Array<number>(t.ndim).fill(1) : [];\n\n return Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: \"bool\",\n device: t.device,\n });\n}\n\n/**\n * Test whether all array elements evaluate to True (non-zero).\n *\n * Returns true only if all elements are non-zero, false if any are zero.\n * Supports reduction over one or more axes.\n *\n * **Complexity**: O(n) - checks each element until finding zero or reaching end\n *\n * @param t - Input tensor\n * @param axis - Axis or axes along which to compute the reduction\n * @param keepdims - If true, keep reduced dimensions as size 1\n * @returns Scalar tensor (true=1, false=0)\n *\n * @example\n * ```ts\n * const t = tensor([1, 2, 3]);\n * all(t); // tensor(1) - all non-zero\n *\n * const t2 = tensor([1, 0, 3]);\n * all(t2); // tensor(0) - has a zero\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.all.html | NumPy all}\n */\nexport function all(t: Tensor, axis?: number | number[], keepdims = false): Tensor {\n ensureNumericTensor(t, \"all\");\n\n const allAxis = (input: Tensor, ax: number, keep: boolean): Tensor => {\n const axisDim = getShapeDim(input.shape, ax);\n const outShapeArr: number[] = [];\n for (let i = 0; i < input.ndim; i++) {\n if (i === ax) {\n if (keep) outShapeArr.push(1);\n } else {\n outShapeArr.push(getShapeDim(input.shape, i));\n }\n }\n validateShape(outShapeArr);\n\n const outSize = outShapeArr.reduce((a, b) => a * b, 1);\n const outData = new Uint8Array(outSize);\n\n const outStrides = new Array<number>(outShapeArr.length);\n let stride = 1;\n for (let i = outShapeArr.length - 1; i >= 0; i--) {\n outStrides[i] = stride;\n stride *= getArrayElement(outShapeArr, i);\n }\n\n for (let outFlat = 0; outFlat < outSize; outFlat++) {\n let rem = outFlat;\n const outIdx = new Array<number>(outShapeArr.length);\n for (let i = 0; i < outShapeArr.length; i++) {\n const s = getArrayElement(outStrides, i, 1);\n outIdx[i] = Math.floor(rem / s);\n rem %= s;\n }\n\n const inIdx = new Array<number>(input.ndim);\n if (keep) {\n for (let i = 0; i < input.ndim; i++) {\n inIdx[i] = i === ax ? 0 : getArrayElement(outIdx, i);\n }\n } else {\n let outAxis = 0;\n for (let i = 0; i < input.ndim; i++) {\n if (i === ax) {\n inIdx[i] = 0;\n } else {\n inIdx[i] = getArrayElement(outIdx, outAxis);\n outAxis++;\n }\n }\n }\n\n if (axisDim === 0) {\n outData[outFlat] = 1;\n continue;\n }\n\n let baseOffset = input.offset;\n for (let i = 0; i < input.ndim; i++) {\n baseOffset += getArrayElement(inIdx, i) * getArrayElement(input.strides, i);\n }\n\n const axisStride = getArrayElement(input.strides, ax);\n let result = 1;\n if (input.data instanceof BigInt64Array) {\n for (let k = 0; k < axisDim; k++) {\n if (getBigIntElement(input.data, baseOffset + k * axisStride) === 0n) {\n result = 0;\n break;\n }\n }\n } else {\n const numericData = expectNumericData(input.data, \"all\");\n for (let k = 0; k < axisDim; k++) {\n if (getNumericElement(numericData, baseOffset + k * axisStride) === 0) {\n result = 0;\n break;\n }\n }\n }\n outData[outFlat] = result;\n }\n\n return Tensor.fromTypedArray({\n data: outData,\n shape: outShapeArr,\n dtype: \"bool\",\n device: input.device,\n });\n };\n\n if (axis !== undefined) {\n const axes = normalizeAxes(axis, t.ndim);\n const sorted = keepdims\n ? axes.slice().sort((a, b) => a - b)\n : axes.slice().sort((a, b) => b - a);\n let result: Tensor = t;\n for (const ax of sorted) {\n result = allAxis(result, ax, keepdims);\n }\n return result;\n }\n\n // Check if all elements are non-zero (truthy)\n let result = true;\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n if (t.data instanceof BigInt64Array) {\n // BigInt path: check for any zero bigint\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n if (getBigIntElement(t.data, srcOffset) === 0n) {\n result = false;\n break; // Early exit optimization - found zero\n }\n }\n } else {\n // Number path: check for any zero number\n const numericData = expectNumericData(t.data, \"all\");\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n if (getNumericElement(numericData, srcOffset) === 0) {\n result = false;\n break; // Early exit optimization\n }\n }\n }\n\n // Return scalar boolean tensor (0 or 1)\n const out = new Uint8Array(1);\n out[0] = result ? 1 : 0;\n const outShape: Shape = keepdims ? new Array<number>(t.ndim).fill(1) : [];\n\n return Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: \"bool\",\n device: t.device,\n });\n}\n","import { DTypeError, getNumericElement, type Shape } from \"../../core\";\nimport { isContiguous } from \"../tensor/strides\";\nimport { computeStrides, isBigIntArray, Tensor } from \"../tensor/Tensor\";\nimport { flatOffset, readAsNumberSafe } from \"./_internal\";\nimport {\n broadcastApply,\n ensureBroadcastableScalar,\n getBroadcastShape,\n isScalar,\n} from \"./broadcast\";\n\n/**\n * Element-wise sine.\n *\n * Output dtype:\n * - Always `float64` for now.\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.sin.html | NumPy sin}\n */\nexport function sin(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"sin is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"sin is not defined for string dtype\");\n }\n\n if (isBigIntArray(data)) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.sin(readAsNumberSafe(data, srcOffset));\n }\n } else if (contiguous && t.offset === 0) {\n for (let i = 0; i < t.size; i++) {\n out[i] = Math.sin(data[i] as number);\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.sin(getNumericElement(data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise cosine.\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.cos.html | NumPy cos}\n */\nexport function cos(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"cos is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"cos is not defined for string dtype\");\n }\n\n if (isBigIntArray(data)) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.cos(readAsNumberSafe(data, srcOffset));\n }\n } else if (contiguous && t.offset === 0) {\n for (let i = 0; i < t.size; i++) {\n out[i] = Math.cos(data[i] as number);\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.cos(getNumericElement(data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise tangent.\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.tan.html | NumPy tan}\n */\nexport function tan(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"tan is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"tan is not defined for string dtype\");\n }\n\n if (isBigIntArray(data)) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.tan(readAsNumberSafe(data, srcOffset));\n }\n } else if (contiguous && t.offset === 0) {\n for (let i = 0; i < t.size; i++) {\n out[i] = Math.tan(data[i] as number);\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.tan(getNumericElement(data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise inverse sine.\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.arcsin.html | NumPy arcsin}\n */\nexport function asin(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"asin is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"asin is not defined for string dtype\");\n }\n\n if (isBigIntArray(data)) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.asin(readAsNumberSafe(data, srcOffset));\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.asin(getNumericElement(data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise inverse cosine.\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.arccos.html | NumPy arccos}\n */\nexport function acos(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"acos is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"acos is not defined for string dtype\");\n }\n\n if (isBigIntArray(data)) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.acos(readAsNumberSafe(data, srcOffset));\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.acos(getNumericElement(data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise inverse tangent.\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.arctan.html | NumPy arctan}\n */\nexport function atan(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"atan is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"atan is not defined for string dtype\");\n }\n\n if (isBigIntArray(data)) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.atan(readAsNumberSafe(data, srcOffset));\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.atan(getNumericElement(data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise arctangent of y/x with correct quadrant.\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.arctan2.html | NumPy arctan2}\n */\nexport function atan2(y: Tensor, x: Tensor): Tensor {\n if (y.dtype === \"string\" || x.dtype === \"string\") {\n throw new DTypeError(\"atan2 is not defined for string dtype\");\n }\n\n ensureBroadcastableScalar(y, x);\n\n const yIsScalar = isScalar(y);\n const xIsScalar = isScalar(x);\n const outShape: Shape = yIsScalar\n ? x.shape\n : xIsScalar\n ? y.shape\n : getBroadcastShape(y.shape, x.shape);\n const outSize = outShape.reduce((acc, dim) => acc * dim, 1);\n\n const out = new Float64Array(outSize);\n const result = Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: \"float64\",\n device: y.device,\n });\n\n const yData = y.data;\n const xData = x.data;\n\n if (Array.isArray(yData) || Array.isArray(xData)) {\n throw new DTypeError(\"atan2 is not defined for string dtype\");\n }\n\n broadcastApply(y, x, result, (offY, offX, offOut) => {\n // We need to read as number\n const yVal = readAsNumberSafe(yData, offY);\n const xVal = readAsNumberSafe(xData, offX);\n out[offOut] = Math.atan2(yVal, xVal);\n });\n\n return result;\n}\n\n/**\n * Element-wise hyperbolic sine.\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.sinh.html | NumPy sinh}\n */\nexport function sinh(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"sinh is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"sinh is not defined for string dtype\");\n }\n\n if (isBigIntArray(data)) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.sinh(readAsNumberSafe(data, srcOffset));\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.sinh(getNumericElement(data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise hyperbolic cosine.\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.cosh.html | NumPy cosh}\n */\nexport function cosh(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"cosh is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"cosh is not defined for string dtype\");\n }\n\n if (isBigIntArray(data)) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.cosh(readAsNumberSafe(data, srcOffset));\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.cosh(getNumericElement(data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise hyperbolic tangent.\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.tanh.html | NumPy tanh}\n */\nexport function tanh(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"tanh is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"tanh is not defined for string dtype\");\n }\n\n if (isBigIntArray(data)) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.tanh(readAsNumberSafe(data, srcOffset));\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.tanh(getNumericElement(data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise inverse hyperbolic sine.\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.arcsinh.html | NumPy arcsinh}\n */\nexport function asinh(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"asinh is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"asinh is not defined for string dtype\");\n }\n\n if (isBigIntArray(data)) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.asinh(readAsNumberSafe(data, srcOffset));\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.asinh(getNumericElement(data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise inverse hyperbolic cosine.\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.arccosh.html | NumPy arccosh}\n */\nexport function acosh(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"acosh is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"acosh is not defined for string dtype\");\n }\n\n if (isBigIntArray(data)) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.acosh(readAsNumberSafe(data, srcOffset));\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.acosh(getNumericElement(data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n\n/**\n * Element-wise inverse hyperbolic tangent.\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.arctanh.html | NumPy arctanh}\n */\nexport function atanh(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"atanh is not defined for string dtype\");\n }\n\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"atanh is not defined for string dtype\");\n }\n\n if (isBigIntArray(data)) {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.atanh(readAsNumberSafe(data, srcOffset));\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = Math.atanh(getNumericElement(data, srcOffset));\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"float64\",\n device: t.device,\n });\n}\n","import type { Device, DType, Shape, TypedArray } from \"../../core\";\nimport {\n DataValidationError,\n DeepboxError,\n DTypeError,\n getConfig,\n getNumericElement,\n InvalidParameterError,\n isTypedArray,\n shapeToSize,\n validateShape,\n} from \"../../core\";\n\nimport { dtypeToTypedArrayCtor, Tensor } from \"./Tensor\";\n\n/**\n * Recursive type for nested number arrays.\n *\n * Used to represent multi-dimensional data in JavaScript arrays.\n *\n * @example\n * ```ts\n * const scalar: NestedArray = 5;\n * const vector: NestedArray = [1, 2, 3];\n * const matrix: NestedArray = [[1, 2], [3, 4]];\n * const tensor3d: NestedArray = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]];\n * ```\n */\nexport type NestedArray = number | NestedArray[];\n\nexport type StringNestedArray = string | StringNestedArray[];\n\nexport type TensorCreateOptions = {\n readonly dtype?: DType;\n readonly device?: Device;\n};\n\ntype NumericDType = Exclude<DType, \"string\">;\n\nfunction ensureNumericDType(dtype: DType, op: string): NumericDType {\n if (dtype === \"string\") {\n throw new DTypeError(`${op} does not support string dtype`);\n }\n return dtype;\n}\n\nfunction inferShapeFromNestedArray(data: unknown): Shape {\n const shape: number[] = [];\n\n let cursor: unknown = data;\n while (Array.isArray(cursor)) {\n shape.push(cursor.length);\n if (cursor.length === 0) {\n return shape;\n }\n cursor = cursor[0];\n }\n\n return shape;\n}\n\nfunction validateRegularStringNestedArray(data: unknown, shape: Shape, depth = 0): void {\n if (depth === shape.length) {\n if (typeof data !== \"string\") {\n throw new DataValidationError(\"string tensor data leaf values must be strings\");\n }\n return;\n }\n\n if (!Array.isArray(data)) {\n throw new DataValidationError(\n \"string tensor data must be a nested array with consistent shape\"\n );\n }\n\n const expectedLen = shape[depth] ?? 0;\n if (data.length !== expectedLen) {\n throw new DataValidationError(\n `Ragged tensor: expected length ${expectedLen} at depth ${depth}, got ${data.length}`\n );\n }\n\n for (const item of data) {\n validateRegularStringNestedArray(item, shape, depth + 1);\n }\n}\n\nfunction inferShapeFromStringNestedArray(data: unknown): Shape {\n return inferShapeFromNestedArray(data);\n}\n\nfunction validateRegularNestedArray(data: unknown, shape: Shape, depth = 0): void {\n if (depth === shape.length) {\n if (typeof data !== \"number\") {\n throw new DataValidationError(\"tensor data leaf values must be numbers\");\n }\n return;\n }\n\n if (!Array.isArray(data)) {\n throw new DataValidationError(\"tensor data must be a nested array with consistent shape\");\n }\n\n const expectedLen = shape[depth] ?? 0;\n if (data.length !== expectedLen) {\n throw new DataValidationError(\n `Ragged tensor: expected length ${expectedLen} at depth ${depth}, got ${data.length}`\n );\n }\n\n for (const item of data) {\n validateRegularNestedArray(item, shape, depth + 1);\n }\n}\n\nfunction flattenNestedArray(data: unknown, out: number[]): void {\n if (Array.isArray(data)) {\n for (const item of data) {\n flattenNestedArray(item, out);\n }\n return;\n }\n\n if (typeof data !== \"number\") {\n throw new DataValidationError(\"Expected number\");\n }\n\n out.push(data);\n}\n\nfunction flattenStringNestedArray(data: unknown, out: string[]): void {\n if (Array.isArray(data)) {\n for (const item of data) {\n flattenStringNestedArray(item, out);\n }\n return;\n }\n\n if (typeof data !== \"string\") {\n throw new DataValidationError(\"Expected string\");\n }\n\n out.push(data);\n}\n\nfunction coerceNumberToTypedArrayValue(dtype: DType, value: number): number | bigint {\n switch (dtype) {\n case \"int64\":\n if (!Number.isFinite(value) || !Number.isInteger(value)) {\n throw new DTypeError(`int64 tensor values must be finite integers; received ${value}`);\n }\n return BigInt(value);\n case \"bool\":\n return value ? 1 : 0;\n default:\n return value;\n }\n}\n\nfunction inferDTypeFromInput(data: NestedArray | StringNestedArray): DType {\n let cursor: NestedArray | StringNestedArray | undefined = data;\n while (Array.isArray(cursor)) {\n if (cursor.length === 0) {\n return \"float32\";\n }\n cursor = cursor[0];\n }\n return typeof cursor === \"string\" ? \"string\" : \"float32\";\n}\n\nfunction inferDTypeFromTypedArray(data: TypedArray): DType {\n if (data instanceof Float32Array) return \"float32\";\n if (data instanceof Float64Array) return \"float64\";\n if (data instanceof Int32Array) return \"int32\";\n if (data instanceof BigInt64Array) return \"int64\";\n return \"uint8\";\n}\n\nfunction isTypedArrayCompatibleWithDType(data: TypedArray, dtype: DType): boolean {\n if (dtype === \"string\") return false;\n if (dtype === \"float32\") return data instanceof Float32Array;\n if (dtype === \"float64\") return data instanceof Float64Array;\n if (dtype === \"int32\") return data instanceof Int32Array;\n if (dtype === \"int64\") return data instanceof BigInt64Array;\n if (dtype === \"uint8\" || dtype === \"bool\") return data instanceof Uint8Array;\n return false;\n}\n\n/**\n * Create a tensor from nested arrays or TypedArray.\n *\n * This is the primary function for creating tensors. It accepts:\n * - Nested JavaScript arrays (e.g., [[1, 2], [3, 4]])\n * - TypedArrays (e.g., Float32Array)\n * - Scalars (single numbers)\n *\n * Time complexity: O(n) where n is total number of elements.\n * Space complexity: O(n) for data storage.\n *\n * @param data - Input data as nested array or TypedArray\n * @param opts - Creation options (dtype, device)\n * @returns New tensor\n *\n * @throws {TypeError} If data has inconsistent shape (ragged arrays)\n * @throws {DTypeError} If dtype is incompatible with data\n *\n * @example\n * ```ts\n * import { tensor } from 'deepbox/ndarray';\n *\n * // From nested arrays\n * const t1 = tensor([[1, 2, 3], [4, 5, 6]]);\n *\n * // Specify dtype\n * const t2 = tensor([1, 2, 3], { dtype: 'int32' });\n *\n * // From TypedArray\n * const data = new Float32Array([1, 2, 3, 4]);\n * const t3 = tensor(data);\n *\n * // Scalar\n * const t4 = tensor(42);\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.array.html | NumPy array}\n */\nexport function tensor(\n data: NestedArray | StringNestedArray | TypedArray,\n opts: TensorCreateOptions = {}\n): Tensor {\n const config = getConfig();\n const device = opts.device ?? config.defaultDevice;\n\n if (isTypedArray(data)) {\n const inferred = inferDTypeFromTypedArray(data);\n if (opts.dtype !== undefined && !isTypedArrayCompatibleWithDType(data, opts.dtype)) {\n throw new DTypeError(\n `TypedArray ${data.constructor.name} is not compatible with dtype ${opts.dtype}`\n );\n }\n const dtype = opts.dtype ?? inferred;\n const numericDtype = ensureNumericDType(dtype, \"tensor\");\n return Tensor.fromTypedArray({\n data,\n shape: [data.length],\n dtype: numericDtype,\n device,\n });\n }\n\n const inferred = opts.dtype === undefined ? inferDTypeFromInput(data) : undefined;\n const dtype = opts.dtype ?? inferred ?? config.defaultDtype;\n\n if (dtype === \"string\") {\n const shape = inferShapeFromStringNestedArray(data);\n validateShape(shape);\n validateRegularStringNestedArray(data, shape);\n\n const flat: string[] = [];\n flattenStringNestedArray(data, flat);\n\n if (shapeToSize(shape) !== flat.length) {\n throw new DeepboxError(\"Internal error: flattened size mismatch\");\n }\n\n return Tensor.fromStringArray({ data: flat, shape, device });\n }\n\n const numericDtype = ensureNumericDType(dtype, \"tensor\");\n const shape = inferShapeFromNestedArray(data);\n validateShape(shape);\n validateRegularNestedArray(data, shape);\n\n const size = shapeToSize(shape);\n const Ctor = dtypeToTypedArrayCtor(numericDtype);\n const typed = new Ctor(size);\n\n // Fast path: flatten directly into TypedArray for non-BigInt dtypes\n if (!(typed instanceof BigInt64Array) && numericDtype !== \"int64\" && numericDtype !== \"bool\") {\n let idx = 0;\n const flattenDirect = (arr: unknown): void => {\n if (Array.isArray(arr)) {\n for (let i = 0; i < arr.length; i++) {\n flattenDirect(arr[i]);\n }\n } else if (typeof arr === \"number\") {\n typed[idx++] = arr;\n } else {\n throw new DataValidationError(\"Expected number\");\n }\n };\n flattenDirect(data);\n } else {\n const flat: number[] = [];\n flattenNestedArray(data, flat);\n\n if (typed instanceof BigInt64Array) {\n for (let i = 0; i < flat.length; i++) {\n const v = flat[i];\n if (v === undefined) {\n throw new DeepboxError(\"Internal error: missing flattened value\");\n }\n const coerced = coerceNumberToTypedArrayValue(numericDtype, v);\n typed[i] = typeof coerced === \"bigint\" ? coerced : BigInt(coerced);\n }\n } else {\n for (let i = 0; i < flat.length; i++) {\n const v = flat[i];\n if (v === undefined) {\n throw new DeepboxError(\"Internal error: missing flattened value\");\n }\n const coerced = coerceNumberToTypedArrayValue(numericDtype, v);\n typed[i] = typeof coerced === \"number\" ? coerced : Number(coerced);\n }\n }\n }\n\n return Tensor.fromTypedArray({\n data: typed,\n shape,\n dtype: numericDtype,\n device,\n });\n}\n\n/**\n * All zeros.\n */\nexport function zeros(shape: Shape, opts: TensorCreateOptions = {}): Tensor {\n const config = getConfig();\n const dtype = opts.dtype ?? config.defaultDtype;\n const device = opts.device ?? config.defaultDevice;\n if (dtype === \"string\") {\n return Tensor.zeros(shape, { dtype, device });\n }\n const numericDtype = ensureNumericDType(dtype, \"zeros\");\n return Tensor.zeros(shape, { dtype: numericDtype, device });\n}\n\n/**\n * All ones.\n */\nexport function ones(shape: Shape, opts: TensorCreateOptions = {}): Tensor {\n validateShape(shape);\n const config = getConfig();\n const dtype = opts.dtype ?? config.defaultDtype;\n const device = opts.device ?? config.defaultDevice;\n\n const size = shapeToSize(shape);\n\n if (dtype === \"string\") {\n const data = new Array<string>(size).fill(\"1\");\n return Tensor.fromStringArray({ data, shape, device });\n }\n\n const numericDtype = ensureNumericDType(dtype, \"ones\");\n const Ctor = dtypeToTypedArrayCtor(numericDtype);\n const data = new Ctor(size);\n if (data instanceof BigInt64Array) {\n data.fill(1n);\n } else {\n data.fill(1);\n }\n return Tensor.fromTypedArray({ data, shape, dtype: numericDtype, device });\n}\n\n/**\n * Fill with a scalar value.\n */\nexport function empty(shape: Shape, opts: TensorCreateOptions = {}): Tensor {\n validateShape(shape);\n const config = getConfig();\n const dtype = opts.dtype ?? config.defaultDtype;\n const device = opts.device ?? config.defaultDevice;\n\n const size = shapeToSize(shape);\n if (dtype === \"string\") {\n const data = new Array<string>(size);\n return Tensor.fromStringArray({ data, shape, device });\n }\n const numericDtype = ensureNumericDType(dtype, \"empty\");\n const Ctor = dtypeToTypedArrayCtor(numericDtype);\n const data = new Ctor(size);\n\n return Tensor.fromTypedArray({ data, shape, dtype: numericDtype, device });\n}\n\nexport function full(shape: Shape, value: number | string, opts: TensorCreateOptions = {}): Tensor {\n const t = zeros(shape, opts);\n\n if (t.dtype === \"string\") {\n if (typeof value !== \"string\") {\n throw new DTypeError(`Expected string fill value for dtype string; received ${typeof value}`);\n }\n if (!Array.isArray(t.data)) {\n throw new DTypeError(\"string dtype requires string[] backing data\");\n }\n t.data.fill(value);\n return t;\n }\n\n if (typeof value !== \"number\") {\n throw new DTypeError(\n `Expected number fill value for dtype ${t.dtype}; received ${typeof value}`\n );\n }\n\n if (!isTypedArray(t.data)) {\n throw new DTypeError(\"numeric dtype requires TypedArray backing data\");\n }\n if (t.data instanceof BigInt64Array) {\n t.data.fill(BigInt(value));\n } else {\n t.data.fill(Number(value));\n }\n\n return t;\n}\n\n/**\n * Range.\n */\nexport function arange(\n start: number,\n stop?: number,\n step = 1,\n opts: TensorCreateOptions = {}\n): Tensor {\n const config = getConfig();\n const dtype = opts.dtype ?? config.defaultDtype;\n const device = opts.device ?? config.defaultDevice;\n const numericDtype = ensureNumericDType(dtype, \"arange\");\n\n const actualStop = stop ?? start;\n const actualStart = stop === undefined ? 0 : start;\n\n if (step === 0) {\n throw new InvalidParameterError(\"step must be non-zero\", \"step\", step);\n }\n\n if (numericDtype === \"int64\") {\n if (!Number.isFinite(actualStart) || !Number.isInteger(actualStart)) {\n throw new InvalidParameterError(\n `start must be a finite integer for int64 arange; received ${actualStart}`,\n \"start\",\n actualStart\n );\n }\n if (!Number.isFinite(actualStop) || !Number.isInteger(actualStop)) {\n throw new InvalidParameterError(\n `stop must be a finite integer for int64 arange; received ${actualStop}`,\n \"stop\",\n actualStop\n );\n }\n if (!Number.isFinite(step) || !Number.isInteger(step)) {\n throw new InvalidParameterError(\n `step must be a finite integer for int64 arange; received ${step}`,\n \"step\",\n step\n );\n }\n }\n\n const length = Math.max(0, Math.ceil((actualStop - actualStart) / step));\n const Ctor = dtypeToTypedArrayCtor(numericDtype);\n const data = new Ctor(length);\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < length; i++) {\n data[i] = BigInt(Math.trunc(actualStart + i * step));\n }\n } else {\n for (let i = 0; i < length; i++) {\n data[i] = actualStart + i * step;\n }\n }\n\n return Tensor.fromTypedArray({\n data,\n shape: [length],\n dtype: numericDtype,\n device,\n });\n}\n\n/**\n * Evenly spaced numbers over a specified interval.\n *\n * Returns `num` evenly spaced samples, calculated over the interval [start, stop].\n *\n * **Algorithm**: Linear interpolation\n *\n * **Parameters**:\n * @param start - Starting value of the sequence\n * @param stop - End value of the sequence\n * @param num - Number of samples to generate (default: 50)\n * @param endpoint - If true, stop is the last sample. Otherwise, it is not included (default: true)\n * @param opts - Tensor options (dtype, device)\n *\n * **Returns**: Tensor of shape (num,)\n *\n * @example\n * ```ts\n * import { linspace } from 'deepbox/ndarray';\n *\n * const x = linspace(0, 10, 5);\n * // [0, 2.5, 5, 7.5, 10]\n *\n * const y = linspace(0, 10, 5, false);\n * // [0, 2, 4, 6, 8]\n * ```\n *\n * @throws {RangeError} If num < 0\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.linspace.html | NumPy linspace}\n */\nexport function linspace(\n start: number,\n stop: number,\n num = 50,\n endpoint = true,\n opts: TensorCreateOptions = {}\n): Tensor {\n if (num < 0) {\n throw new InvalidParameterError(\"num must be non-negative\", \"num\", num);\n }\n\n if (num === 0) {\n return zeros([0], opts);\n }\n\n if (num === 1) {\n return tensor([start], opts);\n }\n\n const config = getConfig();\n const dtype = opts.dtype ?? config.defaultDtype;\n const device = opts.device ?? config.defaultDevice;\n const numericDtype = ensureNumericDType(dtype, \"linspace\");\n\n // Calculate the step size based on endpoint flag\n // If endpoint=true, divide range by (num-1) to include stop value\n // If endpoint=false, divide range by num to exclude stop value\n const step = endpoint ? (stop - start) / (num - 1) : (stop - start) / num;\n\n const Ctor = dtypeToTypedArrayCtor(numericDtype);\n const data = new Ctor(num);\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < num; i++) {\n data[i] = BigInt(Math.trunc(start + i * step));\n }\n } else {\n for (let i = 0; i < num; i++) {\n data[i] = start + i * step;\n }\n }\n\n return Tensor.fromTypedArray({\n data,\n shape: [num],\n dtype: numericDtype,\n device,\n });\n}\n\n/**\n * Numbers spaced evenly on a log scale.\n *\n * In linear space, the sequence starts at base^start and ends with base^stop.\n *\n * **Parameters**:\n * @param start - base^start is the starting value\n * @param stop - base^stop is the final value\n * @param num - Number of samples to generate (default: 50)\n * @param base - The base of the log space (default: 10)\n * @param endpoint - If true, stop is the last sample (default: true)\n * @param opts - Tensor options\n *\n * **Returns**: Tensor of shape (num,)\n *\n * @example\n * ```ts\n * import { logspace } from 'deepbox/ndarray';\n *\n * const x = logspace(0, 3, 4);\n * // [1, 10, 100, 1000]\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.logspace.html | NumPy logspace}\n */\nexport function logspace(\n start: number,\n stop: number,\n num = 50,\n base = 10,\n endpoint = true,\n opts: TensorCreateOptions = {}\n): Tensor {\n // Generate evenly spaced exponents\n const exponents = linspace(start, stop, num, endpoint, {\n ...opts,\n dtype: \"float64\",\n });\n\n const config = getConfig();\n const dtype = opts.dtype ?? config.defaultDtype;\n const device = opts.device ?? config.defaultDevice;\n const numericDtype = ensureNumericDType(dtype, \"logspace\");\n\n const Ctor = dtypeToTypedArrayCtor(numericDtype);\n const data = new Ctor(num);\n\n // exponents is always numeric (not BigInt64Array)\n const expData = exponents.data;\n if (Array.isArray(expData) || expData instanceof BigInt64Array) {\n throw new DeepboxError(\"Internal error: logspace exponents expected to be numeric typed array\");\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < num; i++) {\n // Get exponent from linspace result\n const exponent = getNumericElement(expData, exponents.offset + i);\n // Calculate base^exponent and convert to BigInt\n const value = base ** exponent;\n data[i] = BigInt(Math.round(value));\n }\n } else {\n for (let i = 0; i < num; i++) {\n // Get exponent from linspace result\n const exponent = getNumericElement(expData, exponents.offset + i);\n // Calculate base^exponent\n data[i] = base ** exponent;\n }\n }\n\n return Tensor.fromTypedArray({\n data,\n shape: [num],\n dtype: numericDtype,\n device,\n });\n}\n\n/**\n * Numbers spaced evenly on a log scale (geometric progression).\n *\n * Each output value is a constant multiple of the previous.\n *\n * **Parameters**:\n * @param start - Starting value of the sequence\n * @param stop - Final value of the sequence\n * @param num - Number of samples (default: 50)\n * @param endpoint - If true, stop is the last sample (default: true)\n * @param opts - Tensor options\n *\n * **Returns**: Tensor of shape (num,)\n *\n * @example\n * ```ts\n * import { geomspace } from 'deepbox/ndarray';\n *\n * const x = geomspace(1, 1000, 4);\n * // [1, 10, 100, 1000]\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.geomspace.html | NumPy geomspace}\n */\nexport function geomspace(\n start: number,\n stop: number,\n num = 50,\n endpoint = true,\n opts: TensorCreateOptions = {}\n): Tensor {\n if (start === 0 || stop === 0) {\n throw new InvalidParameterError(\n \"geomspace requires start and stop to be non-zero\",\n \"start\",\n start\n );\n }\n\n if ((start > 0 && stop < 0) || (start < 0 && stop > 0)) {\n throw new InvalidParameterError(\n \"geomspace requires start and stop to have the same sign\",\n \"start\",\n start\n );\n }\n\n // Convert start and stop to log scale (natural logarithm)\n // Use absolute values to handle negative numbers properly\n const logStart = Math.log(Math.abs(start));\n const logStop = Math.log(Math.abs(stop));\n\n // Generate evenly spaced values in log scale (force float intermediates)\n const logValues = linspace(logStart, logStop, num, endpoint, {\n ...opts,\n dtype: \"float64\",\n });\n\n const config = getConfig();\n const dtype = opts.dtype ?? config.defaultDtype;\n const device = opts.device ?? config.defaultDevice;\n const numericDtype = ensureNumericDType(dtype, \"geomspace\");\n\n const Ctor = dtypeToTypedArrayCtor(numericDtype);\n const data = new Ctor(num);\n\n const sign = start < 0 ? -1 : 1;\n\n // logValues is always numeric (not BigInt64Array)\n const logData = logValues.data;\n if (Array.isArray(logData) || logData instanceof BigInt64Array) {\n throw new DeepboxError(\n \"Internal error: geomspace logValues expected to be numeric typed array\"\n );\n }\n\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < num; i++) {\n const logVal = getNumericElement(logData, logValues.offset + i);\n data[i] = BigInt(Math.trunc(sign * Math.exp(logVal)));\n }\n } else {\n for (let i = 0; i < num; i++) {\n const logVal = getNumericElement(logData, logValues.offset + i);\n data[i] = sign * Math.exp(logVal);\n }\n }\n\n return Tensor.fromTypedArray({\n data,\n shape: [num],\n dtype: numericDtype,\n device,\n });\n}\n\n/**\n * Identity matrix.\n *\n * Returns a 2D tensor with ones on the diagonal and zeros elsewhere.\n *\n * **Parameters**:\n * @param n - Number of rows\n * @param m - Number of columns (default: n, making it square)\n * @param k - Index of the diagonal (default: 0, main diagonal)\n * @param opts - Tensor options\n *\n * **Returns**: Tensor of shape (n, m)\n *\n * @example\n * ```ts\n * import { eye } from 'deepbox/ndarray';\n *\n * const I = eye(3);\n * // [[1, 0, 0],\n * // [0, 1, 0],\n * // [0, 0, 1]]\n *\n * const A = eye(3, 4, 1);\n * // [[0, 1, 0, 0],\n * // [0, 0, 1, 0],\n * // [0, 0, 0, 1]]\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.eye.html | NumPy eye}\n */\nexport function eye(n: number, m?: number, k = 0, opts: TensorCreateOptions = {}): Tensor {\n const cols = m ?? n;\n const matrix = zeros([n, cols], opts);\n\n // Set diagonal elements to 1\n if (matrix.data instanceof BigInt64Array) {\n for (let i = 0; i < n; i++) {\n const j = i + k; // Column index, offset by k\n if (j >= 0 && j < cols) {\n // Calculate flat index for row i, column j\n // In row-major order: index = row * num_cols + col\n const index = i * cols + j;\n matrix.data[index] = 1n;\n }\n }\n } else {\n for (let i = 0; i < n; i++) {\n const j = i + k; // Column index, offset by k\n if (j >= 0 && j < cols) {\n // Calculate flat index for row i, column j\n // In row-major order: index = row * num_cols + col\n const index = i * cols + j;\n matrix.data[index] = 1;\n }\n }\n }\n\n return matrix;\n}\n\n/**\n * Return a tensor filled with random samples from a standard normal distribution.\n *\n * @param shape - Shape of the output tensor\n * @param opts - Additional tensor options\n *\n * @example\n * ```ts\n * import { randn } from 'deepbox/ndarray';\n *\n * const x = randn([2, 3]);\n * // Random values from N(0, 1)\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/random/generated/numpy.random.randn.html | NumPy randn}\n */\nexport function randn(shape: Shape, opts: TensorCreateOptions = {}): Tensor {\n const config = getConfig();\n const dtype = opts.dtype ?? config.defaultDtype;\n const device = opts.device ?? config.defaultDevice;\n const numericDtype = ensureNumericDType(dtype, \"randn\");\n\n const shapeArr = Array.isArray(shape) ? shape : [shape];\n validateShape(shapeArr);\n const size = shapeArr.reduce((a, b) => a * b, 1);\n\n const Ctor = dtypeToTypedArrayCtor(numericDtype);\n const data = new Ctor(size);\n\n const sampleUnitOpen = (): number => {\n const u = Math.random();\n return u > 0 ? u : Number.MIN_VALUE;\n };\n\n // Box-Muller transform for generating normal distribution\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < size; i += 2) {\n const u1 = sampleUnitOpen();\n const u2 = Math.random();\n\n const z0 = Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);\n const z1 = Math.sqrt(-2 * Math.log(u1)) * Math.sin(2 * Math.PI * u2);\n\n data[i] = BigInt(Math.trunc(z0));\n if (i + 1 < size) {\n data[i + 1] = BigInt(Math.trunc(z1));\n }\n }\n } else {\n for (let i = 0; i < size; i += 2) {\n // Generate two uniform random numbers between 0 and 1\n // These will be transformed using Box-Muller algorithm\n const u1 = sampleUnitOpen();\n const u2 = Math.random();\n\n // Box-Muller transform to convert uniform to normal distribution\n // z0 and z1 are independent standard normal random variables\n const z0 = Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);\n const z1 = Math.sqrt(-2 * Math.log(u1)) * Math.sin(2 * Math.PI * u2);\n\n data[i] = z0;\n if (i + 1 < size) {\n data[i + 1] = z1;\n }\n }\n }\n\n return Tensor.fromTypedArray({\n data,\n shape: shapeArr,\n dtype: numericDtype,\n device,\n });\n}\n","import {\n type Axis,\n DeepboxError,\n DTypeError,\n dtypeToTypedArrayCtor,\n getBigIntElement,\n getNumericElement,\n IndexError,\n InvalidParameterError,\n normalizeAxis,\n ShapeError,\n shapeToSize,\n} from \"../../core\";\nimport { offsetFromFlatIndex } from \"./strides\";\nimport { computeStrides, Tensor } from \"./Tensor\";\n\nexport type SliceRange =\n | number\n | {\n readonly start?: number;\n readonly end?: number;\n readonly step?: number;\n };\n\nfunction normalizeIndex(index: number, dim: number): number {\n const idx = index < 0 ? dim + index : index;\n if (idx < 0 || idx >= dim) {\n throw new IndexError(`index ${index} is out of bounds for dimension of size ${dim}`);\n }\n return idx;\n}\n\nfunction normalizeRange(\n range: SliceRange,\n dim: number\n): { start: number; end: number; step: number } {\n if (typeof range === \"number\") {\n const idx = normalizeIndex(range, dim);\n return { start: idx, end: idx + 1, step: 1 };\n }\n\n const step = range.step ?? 1;\n if (!Number.isInteger(step) || step === 0) {\n throw new InvalidParameterError(\n `slice step must be a non-zero integer; received ${step}`,\n \"step\",\n step\n );\n }\n\n if (step > 0) {\n const startRaw = range.start ?? 0;\n const endRaw = range.end ?? dim;\n\n const start = startRaw < 0 ? dim + startRaw : startRaw;\n const end = endRaw < 0 ? dim + endRaw : endRaw;\n\n const clampedStart = Math.min(Math.max(start, 0), dim);\n const clampedEnd = Math.min(Math.max(end, 0), dim);\n\n return { start: clampedStart, end: clampedEnd, step };\n }\n\n const startRaw = range.start ?? dim - 1;\n const endRaw = range.end ?? -1;\n\n let start = startRaw < 0 ? dim + startRaw : startRaw;\n if (start >= dim) start = dim - 1;\n if (start < -1) start = -1;\n\n let end: number;\n if (endRaw === -1) {\n end = -1;\n } else if (endRaw < 0) {\n end = dim + endRaw;\n if (end < -1) end = -1;\n } else {\n end = endRaw;\n if (end >= dim) end = dim - 1;\n }\n\n return { start, end, step };\n}\n\n/**\n * Slice a tensor.\n *\n * Examples:\n * - `slice(t, { start: 0, end: 2 })` on a 1D tensor keeps the first 2 elements.\n * - `slice(t, 0, { start: 1 })` on a 2D tensor selects row 0 and columns from 1.\n */\nexport function slice(t: Tensor, ...ranges: SliceRange[]): Tensor {\n const ndim = t.ndim;\n\n if (ranges.length > ndim) {\n throw new ShapeError(`Too many indices for tensor: got ${ranges.length}, expected <= ${ndim}`);\n }\n\n const normalized = new Array<{ start: number; end: number; step: number }>(ndim);\n const outShape: number[] = [];\n\n for (let axis = 0; axis < ndim; axis++) {\n const dim = t.shape[axis] ?? 0;\n const range = ranges[axis] ?? { start: 0, end: dim, step: 1 };\n const nr = normalizeRange(range, dim);\n normalized[axis] = nr;\n\n // If the user passed a number, that dimension is squeezed out.\n if (typeof range !== \"number\") {\n const len =\n nr.step > 0\n ? Math.max(0, Math.ceil((nr.end - nr.start) / nr.step))\n : Math.max(0, Math.ceil((nr.start - nr.end) / -nr.step));\n outShape.push(len);\n }\n }\n\n // If all axes were indexed by numbers, the result is a scalar (0D) tensor.\n const outSize = outShape.length === 0 ? 1 : outShape.reduce((a, b) => a * b, 1);\n const out =\n t.dtype === \"string\"\n ? new Array<string>(outSize)\n : new (dtypeToTypedArrayCtor(t.dtype))(outSize);\n\n // Iterate over output indices and map back to input indices.\n const outStrides = new Array<number>(outShape.length);\n let stride = 1;\n for (let i = outShape.length - 1; i >= 0; i--) {\n outStrides[i] = stride;\n stride *= outShape[i] ?? 0;\n }\n\n const outNdim = outShape.length;\n\n for (let outFlat = 0; outFlat < outSize; outFlat++) {\n // Convert flat to multi-index.\n let rem = outFlat;\n const outIdx = new Array<number>(outNdim);\n for (let i = 0; i < outNdim; i++) {\n const s = outStrides[i] ?? 1;\n outIdx[i] = Math.floor(rem / s);\n rem %= s;\n }\n\n // Map to input multi-index.\n const inIdx = new Array<number>(ndim);\n let outAxis = 0;\n for (let axis = 0; axis < ndim; axis++) {\n const r = ranges[axis];\n const nr = normalized[axis];\n if (nr === undefined) {\n throw new DeepboxError(\"Internal error: missing normalized slice range\");\n }\n\n if (typeof r === \"number\") {\n inIdx[axis] = nr.start;\n } else {\n inIdx[axis] = nr.start + (outIdx[outAxis] ?? 0) * nr.step;\n outAxis++;\n }\n }\n\n // Compute input flat offset.\n let inFlat = t.offset;\n for (let axis = 0; axis < ndim; axis++) {\n inFlat += (inIdx[axis] ?? 0) * (t.strides[axis] ?? 0);\n }\n\n if (Array.isArray(out) && Array.isArray(t.data)) {\n out[outFlat] = t.data[inFlat] ?? \"\";\n } else if (out instanceof BigInt64Array && t.data instanceof BigInt64Array) {\n out[outFlat] = getBigIntElement(t.data, inFlat);\n } else if (\n !Array.isArray(out) &&\n !(out instanceof BigInt64Array) &&\n !Array.isArray(t.data) &&\n !(t.data instanceof BigInt64Array)\n ) {\n out[outFlat] = getNumericElement(t.data, inFlat);\n }\n }\n\n if (Array.isArray(out)) {\n return Tensor.fromStringArray({\n data: out,\n shape: outShape.length === 0 ? [] : outShape,\n device: t.device,\n });\n }\n\n if (t.dtype === \"string\") {\n throw new DeepboxError(\"Internal error: string dtype but non-array data\");\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: outShape.length === 0 ? [] : outShape,\n dtype: t.dtype,\n device: t.device,\n });\n}\n\n/**\n * Gather values along an axis specified by indices.\n *\n * @param t - Input tensor\n * @param indices - Indices to gather\n * @param axis - Axis along which to gather\n * @returns Gathered tensor\n *\n * @example\n * ```ts\n * const t = tensor([[1, 2], [3, 4], [5, 6]]);\n * const indices = tensor([0, 2]);\n * const result = gather(t, indices, 0); // [[1, 2], [5, 6]]\n * ```\n */\nexport function gather(t: Tensor, indices: Tensor, axis: Axis): Tensor {\n const ax = normalizeAxis(axis, t.ndim);\n\n if (indices.dtype === \"string\") {\n throw new DTypeError(\"gather() requires numeric indices tensor\");\n }\n if (indices.ndim !== 1) {\n throw new InvalidParameterError(\n \"gather() requires a 1D indices tensor\",\n \"indices\",\n indices.shape\n );\n }\n\n const outShape = [...t.shape];\n outShape[ax] = indices.size;\n\n const outSize = shapeToSize(outShape);\n const axisSize = t.shape[ax] ?? 1;\n\n const outStrides = new Array<number>(outShape.length);\n let stride = 1;\n for (let i = outShape.length - 1; i >= 0; i--) {\n outStrides[i] = stride;\n stride *= outShape[i] ?? 1;\n }\n\n const indicesLogicalStrides = computeStrides(indices.shape);\n\n const readIndexValue = (flat: number): number => {\n const idxOffset = offsetFromFlatIndex(\n flat,\n indicesLogicalStrides,\n indices.strides,\n indices.offset\n );\n if (indices.data instanceof BigInt64Array) {\n const value = getBigIntElement(indices.data, idxOffset);\n const num = Number(value);\n if (!Number.isSafeInteger(num)) {\n throw new InvalidParameterError(\n `gather() index ${value} exceeds safe integer range`,\n \"indices\",\n value\n );\n }\n return num;\n }\n const numericData = indices.data;\n if (Array.isArray(numericData)) {\n throw new DTypeError(\"gather() requires numeric indices tensor\");\n }\n return getNumericElement(numericData, idxOffset);\n };\n\n if (t.dtype === \"string\") {\n const out = new Array<string>(outSize);\n const tData = t.data;\n if (!Array.isArray(tData)) {\n throw new DeepboxError(\"Internal error: string tensor has non-array data\");\n }\n\n for (let outFlat = 0; outFlat < outSize; outFlat++) {\n let rem = outFlat;\n const outIdx = new Array<number>(outShape.length);\n for (let i = 0; i < outShape.length; i++) {\n const s = outStrides[i] ?? 1;\n outIdx[i] = Math.floor(rem / s);\n rem %= s;\n }\n\n const idxVal = readIndexValue(outIdx[ax] ?? 0);\n if (!Number.isInteger(idxVal)) {\n throw new InvalidParameterError(\n `gather() index ${idxVal} is not an integer`,\n \"indices\",\n idxVal\n );\n }\n if (idxVal < 0 || idxVal >= axisSize) {\n throw new IndexError(\n `index ${idxVal} is out of bounds for axis ${axis} with size ${axisSize}`\n );\n }\n\n const inIdx = outIdx.slice();\n inIdx[ax] = idxVal;\n\n let inOffset = t.offset;\n for (let i = 0; i < t.ndim; i++) {\n inOffset += (inIdx[i] ?? 0) * (t.strides[i] ?? 0);\n }\n out[outFlat] = tData[inOffset] ?? \"\";\n }\n\n return Tensor.fromStringArray({\n data: out,\n shape: outShape,\n device: t.device,\n });\n }\n\n const Ctor = dtypeToTypedArrayCtor(t.dtype);\n const out = new Ctor(outSize);\n const tData = t.data;\n if (Array.isArray(tData)) {\n throw new DeepboxError(\"Internal error: numeric tensor has array data\");\n }\n\n for (let outFlat = 0; outFlat < outSize; outFlat++) {\n let rem = outFlat;\n const outIdx = new Array<number>(outShape.length);\n for (let i = 0; i < outShape.length; i++) {\n const s = outStrides[i] ?? 1;\n outIdx[i] = Math.floor(rem / s);\n rem %= s;\n }\n\n const idxVal = readIndexValue(outIdx[ax] ?? 0);\n if (!Number.isInteger(idxVal)) {\n throw new InvalidParameterError(\n `gather() index ${idxVal} is not an integer`,\n \"indices\",\n idxVal\n );\n }\n if (idxVal < 0 || idxVal >= axisSize) {\n throw new IndexError(\n `index ${idxVal} is out of bounds for axis ${axis} with size ${axisSize}`\n );\n }\n\n const inIdx = outIdx.slice();\n inIdx[ax] = idxVal;\n let inOffset = t.offset;\n for (let i = 0; i < t.ndim; i++) {\n inOffset += (inIdx[i] ?? 0) * (t.strides[i] ?? 0);\n }\n if (t.data instanceof BigInt64Array) {\n if (out instanceof BigInt64Array) {\n out[outFlat] = getBigIntElement(t.data, inOffset);\n }\n } else {\n if (\n !Array.isArray(out) &&\n !(out instanceof BigInt64Array) &&\n !Array.isArray(tData) &&\n !(tData instanceof BigInt64Array)\n ) {\n out[outFlat] = getNumericElement(tData, inOffset);\n }\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: t.dtype,\n device: t.device,\n });\n}\n","/**\n * Autograd module for automatic differentiation.\n *\n * Implements reverse-mode automatic differentiation (backpropagation)\n * for `Tensor` operations.\n *\n * ## Gradient state\n *\n * A **module-level singleton** `gradEnabled` controls whether new\n * operations record their backward graph. Use {@link noGrad} to\n * temporarily disable gradient tracking (e.g. during inference).\n * `noGrad` only accepts **synchronous** callbacks — passing an async\n * function will throw, because the flag would be restored before the\n * async work completes.\n *\n * ## max / min backward — tie-breaking\n *\n * When multiple elements share the maximum (or minimum) value along the\n * reduced axis, **all** tied positions receive gradient. This means the\n * gradient is *not* divided among ties — each tied element gets the full\n * upstream gradient. This matches PyTorch's behaviour and avoids the\n * cost of counting ties, but callers should be aware that the\n * \"effective\" gradient magnitude is multiplied by the tie count.\n */\n\nimport type { Axis, DType, Shape, TypedArray } from \"../../core\";\nimport {\n DataValidationError,\n DeepboxError,\n DTypeError,\n getBigIntElement,\n getNumericElement,\n InvalidParameterError,\n normalizeAxis,\n ShapeError,\n shapeToSize,\n} from \"../../core\";\nimport { dot } from \"../linalg\";\nimport { elu, gelu, leakyRelu, relu, sigmoid } from \"../ops/activation\";\nimport { abs as absOp, add, clip as clipOp, div, mul, neg, pow, sub } from \"../ops/arithmetic\";\nimport { equal, greater, less } from \"../ops/comparison\";\nimport { col2im, im2col as im2colOp } from \"../ops/conv\";\nimport { exp, log } from \"../ops/math\";\nimport { dropoutMask } from \"../ops/random\";\nimport { max, min, sum } from \"../ops/reduction\";\nimport { tanh } from \"../ops/trigonometry\";\nimport { type NestedArray, tensor, zeros } from \"../tensor/creation\";\nimport { gather, type SliceRange, slice } from \"../tensor/indexing\";\nimport { reshape, transpose } from \"../tensor/shape\";\nimport { isContiguous, offsetFromFlatIndex } from \"../tensor/strides\";\nimport {\n computeStrides,\n dtypeToTypedArrayCtor,\n type Tensor,\n Tensor as TensorClass,\n} from \"../tensor/Tensor\";\n\nexport type GradTensorOptions = {\n readonly requiresGrad?: boolean;\n readonly dtype?: Exclude<DType, \"string\">;\n};\n\ntype BackwardFn = () => void;\n\n/**\n * Module-level singleton that controls gradient tracking.\n *\n * When `false`, newly created `GradTensor` operations will not record\n * backward functions regardless of the `requiresGrad` flag on their\n * inputs. Toggled by {@link noGrad}.\n *\n * **Thread-safety note**: because JavaScript is single-threaded this\n * global flag is safe in synchronous code, but it must **never** be\n * relied upon across async boundaries — hence `noGrad` rejects async\n * callbacks.\n */\nlet gradEnabled = true;\n\ntype NumericDType = Exclude<DType, \"string\">;\n\nfunction ensureNumericDType(dtype: DType, context: string): NumericDType {\n if (dtype === \"string\") {\n throw new DTypeError(`${context} does not support string dtype`);\n }\n return dtype;\n}\n\nfunction ensureNumericTensor(t: Tensor, context: string): asserts t is Tensor<Shape, NumericDType> {\n if (t.dtype === \"string\") {\n throw new DTypeError(`${context} does not support string dtype`);\n }\n}\n\nfunction toNumericNestedArray(value: unknown): NestedArray {\n if (typeof value === \"number\") {\n return value;\n }\n if (typeof value === \"bigint\") {\n const asNumber = Number(value);\n if (!Number.isSafeInteger(asNumber)) {\n throw new DataValidationError(\"int64 value is too large to safely convert to number\");\n }\n return asNumber;\n }\n if (Array.isArray(value)) {\n return value.map(toNumericNestedArray);\n }\n throw new DTypeError(\"Expected numeric tensor data\");\n}\n\nfunction onesLike(t: Tensor): Tensor {\n ensureNumericTensor(t, \"autograd\");\n const dtype = t.dtype;\n const Ctor = dtypeToTypedArrayCtor(dtype);\n const out = new Ctor(t.size);\n if (out instanceof BigInt64Array) {\n out.fill(1n);\n } else {\n out.fill(1);\n }\n return TensorClass.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype,\n device: t.device,\n });\n}\n\nfunction ensureSameSize(a: Tensor, b: Tensor, context: string): void {\n if (a.size !== b.size) {\n throw ShapeError.mismatch(a.shape, b.shape, context);\n }\n}\n\nfunction shapesEqual(a: Shape, b: Shape): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\nfunction castTensor(t: Tensor, dtype: Exclude<DType, \"string\">): Tensor {\n if (t.dtype === dtype) return t;\n if (t.dtype === \"string\") {\n throw new DTypeError(\"autograd does not support string dtype\");\n }\n const Ctor = dtypeToTypedArrayCtor(dtype);\n const out = new Ctor(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n const toBool = dtype === \"bool\";\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"autograd does not support string dtype\");\n }\n\n if (out instanceof BigInt64Array) {\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const offset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = getBigIntElement(data, offset);\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const offset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = BigInt(Math.trunc(getNumericElement(data, offset)));\n }\n }\n } else {\n // out is Numeric TypedArray\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const offset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n const value = getBigIntElement(data, offset);\n out[i] = toBool ? (value !== 0n ? 1 : 0) : Number(value);\n }\n } else {\n for (let i = 0; i < t.size; i++) {\n const offset = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n const value = getNumericElement(data, offset);\n out[i] = toBool ? (value !== 0 ? 1 : 0) : value;\n }\n }\n }\n\n return TensorClass.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype,\n device: t.device,\n });\n}\n\nfunction reduceBroadcastGrad(grad: Tensor, targetShape: Shape): Tensor {\n if (grad.dtype === \"string\") {\n throw new DTypeError(\"autograd does not support string dtype\");\n }\n if (shapesEqual(grad.shape, targetShape)) {\n return grad;\n }\n if (shapeToSize(grad.shape) === 0 || shapeToSize(targetShape) === 0) {\n return zeros(targetShape, { dtype: grad.dtype, device: grad.device });\n }\n\n const gradShape = grad.shape;\n const gradNdim = gradShape.length;\n const targetNdim = targetShape.length;\n if (gradNdim < targetNdim) {\n throw ShapeError.mismatch(targetShape, gradShape, \"broadcast\");\n }\n\n const expandedTarget = new Array<number>(gradNdim);\n const leading = gradNdim - targetNdim;\n for (let i = 0; i < gradNdim; i++) {\n const targetDim = i < leading ? 1 : (targetShape[i - leading] ?? 1);\n const gradDim = gradShape[i] ?? 1;\n if (targetDim !== gradDim && targetDim !== 1) {\n throw ShapeError.mismatch(targetShape, gradShape, \"broadcast\");\n }\n expandedTarget[i] = targetDim;\n }\n\n let result = grad;\n for (let axis = 0; axis < gradNdim; axis++) {\n const targetDim = expandedTarget[axis] ?? 1;\n const gradDim = gradShape[axis] ?? 1;\n if (targetDim === 1 && gradDim !== 1) {\n result = sum(result, axis, true);\n }\n }\n\n if (!shapesEqual(result.shape, targetShape)) {\n result = reshape(result, targetShape);\n }\n\n const gradDtype = grad.dtype;\n if (result.dtype !== gradDtype) {\n result = castTensor(result, gradDtype);\n }\n\n return result;\n}\n\nfunction asFloat64Dense(t: Tensor): Float64Array {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"autograd does not support string dtype\");\n }\n const out = new Float64Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n const data = t.data;\n\n if (Array.isArray(data)) {\n throw new DTypeError(\"autograd does not support string dtype\");\n }\n\n for (let flat = 0; flat < t.size; flat++) {\n const offset = contiguous\n ? t.offset + flat\n : offsetFromFlatIndex(flat, logicalStrides, t.strides, t.offset);\n if (data instanceof BigInt64Array) {\n out[flat] = Number(getBigIntElement(data, offset));\n } else {\n out[flat] = getNumericElement(data, offset);\n }\n }\n return out;\n}\n\nfunction toContiguous(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"autograd does not support string dtype\");\n }\n if (isContiguous(t.shape, t.strides)) {\n return t;\n }\n const Ctor = dtypeToTypedArrayCtor(t.dtype);\n const out = new Ctor(t.size);\n const logicalStrides = computeStrides(t.shape);\n\n const data = t.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"autograd does not support string dtype\");\n }\n\n if (out instanceof BigInt64Array) {\n if (data instanceof BigInt64Array) {\n for (let i = 0; i < t.size; i++) {\n const offset = offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = getBigIntElement(data, offset);\n }\n } else {\n // Should not happen if dtype matches\n throw new DTypeError(\"Internal error: dtype mismatch in toContiguous\");\n }\n } else {\n if (data instanceof BigInt64Array) {\n throw new DTypeError(\"Internal error: dtype mismatch in toContiguous\");\n }\n for (let i = 0; i < t.size; i++) {\n const offset = offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n out[i] = getNumericElement(data, offset);\n }\n }\n return TensorClass.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: t.dtype,\n device: t.device,\n });\n}\n\nfunction fromFloat64Dense(shape: Shape, device: Tensor[\"device\"], data: Float64Array): Tensor {\n if (shapeToSize(shape) !== data.length) {\n throw new ShapeError(\"Internal error: dense buffer does not match shape\");\n }\n return TensorClass.fromTypedArray({\n data,\n shape,\n dtype: \"float64\",\n device,\n });\n}\n\n/**\n * Tensor wrapper that records a computation graph for reverse-mode autodiff.\n */\nexport class GradTensor {\n readonly tensor: Tensor;\n requiresGrad: boolean;\n\n private _grad: Tensor | null;\n private readonly _prev: readonly GradTensor[];\n private readonly _backward: BackwardFn;\n\n private constructor(args: {\n readonly tensor: Tensor;\n readonly requiresGrad: boolean;\n readonly prev: readonly GradTensor[];\n readonly backward: BackwardFn;\n }) {\n this.tensor = args.tensor;\n this.requiresGrad = args.requiresGrad;\n this._prev = args.prev;\n this._backward = args.backward;\n this._grad = null;\n }\n\n static create(args: {\n readonly tensor: Tensor;\n readonly requiresGrad: boolean;\n readonly prev: readonly GradTensor[];\n readonly backward: BackwardFn;\n }): GradTensor {\n return new GradTensor(args);\n }\n\n static fromTensor(t: Tensor, options: GradTensorOptions = {}): GradTensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"autograd does not support string dtype\");\n }\n if (options.dtype !== undefined && options.dtype !== t.dtype) {\n throw new DTypeError(\n `GradTensor dtype mismatch: expected ${options.dtype}, received ${t.dtype}`\n );\n }\n const requiresGrad = (options.requiresGrad ?? false) && gradEnabled;\n return new GradTensor({\n tensor: t,\n requiresGrad,\n prev: [],\n backward: () => {},\n });\n }\n\n static scalar(value: number, options: GradTensorOptions = {}): GradTensor {\n const dtype = options.dtype ?? \"float32\";\n const Ctor = dtypeToTypedArrayCtor(dtype);\n const out = new Ctor(1);\n if (out instanceof BigInt64Array) {\n out[0] = BigInt(Math.round(value));\n } else {\n out[0] = value;\n }\n const t = TensorClass.fromTypedArray({\n data: out,\n shape: [],\n dtype,\n device: \"cpu\",\n });\n return GradTensor.fromTensor(t, options);\n }\n\n /**\n * Get the shape of the underlying tensor.\n * Implements TensorLike interface for compatibility with Tensor.\n */\n get shape(): Shape {\n return this.tensor.shape;\n }\n\n /**\n * Get the total number of elements.\n * Implements TensorLike interface for compatibility with Tensor.\n */\n get size(): number {\n return this.tensor.size;\n }\n\n /**\n * Get the number of dimensions.\n * Implements TensorLike interface for compatibility with Tensor.\n */\n get ndim(): number {\n return this.tensor.ndim;\n }\n\n /**\n * Get the data type of the underlying tensor.\n * Implements TensorLike interface for compatibility with Tensor.\n */\n get dtype(): DType {\n return this.tensor.dtype;\n }\n\n /**\n * Get the device where the tensor resides.\n * Implements TensorLike interface for compatibility with Tensor.\n */\n get device(): Tensor[\"device\"] {\n return this.tensor.device;\n }\n\n /**\n * Get the memory strides of the underlying tensor.\n * Implements TensorLike interface for compatibility with Tensor.\n */\n get strides(): readonly number[] {\n return this.tensor.strides;\n }\n\n /**\n * Get the offset into the underlying data buffer.\n * Implements TensorLike interface for compatibility with Tensor.\n */\n get offset(): number {\n return this.tensor.offset;\n }\n\n /**\n * Get the underlying data buffer.\n * Implements TensorLike interface for compatibility with Tensor.\n */\n get data(): TypedArray {\n if (this.tensor.dtype === \"string\") {\n throw new DTypeError(\"GradTensor does not support string tensors\");\n }\n const data = this.tensor.data;\n if (Array.isArray(data)) {\n throw new DTypeError(\"GradTensor does not support string tensors\");\n }\n return data;\n }\n\n /**\n * Get the accumulated gradient for this tensor.\n * Returns null if no gradient has been computed yet.\n */\n get grad(): Tensor | null {\n return this._grad;\n }\n\n setGrad(grad: Tensor): void {\n if (!this.requiresGrad) {\n throw new InvalidParameterError(\n \"Cannot set gradient on tensor with requiresGrad=false\",\n \"requiresGrad\",\n this.requiresGrad\n );\n }\n ensureSameSize(this.tensor, grad, \"setGrad\");\n this._grad = grad;\n }\n\n zeroGrad(): void {\n if (!this.requiresGrad) return;\n this._grad = zeros(this.tensor.shape, {\n dtype: this.tensor.dtype,\n device: this.tensor.device,\n });\n }\n\n detach(): GradTensor {\n return GradTensor.fromTensor(this.tensor, { requiresGrad: false });\n }\n\n setRequiresGrad(value: boolean): void {\n this.requiresGrad = value && gradEnabled;\n if (!this.requiresGrad) {\n this._grad = null;\n }\n }\n\n hasGrad(): boolean {\n return this._grad !== null;\n }\n\n /** @internal */\n accumulateGrad(grad: Tensor): void {\n if (!this.requiresGrad) return;\n\n const normalizedGrad = toContiguous(grad);\n\n if (this._grad === null) {\n this._grad = normalizedGrad;\n return;\n }\n\n ensureSameSize(this._grad, normalizedGrad, \"accumulateGrad\");\n if (this._grad.dtype !== normalizedGrad.dtype) {\n throw new DTypeError(\n `accumulateGrad dtype mismatch: ${this._grad.dtype} vs ${normalizedGrad.dtype}`\n );\n }\n this._grad = add(this._grad, normalizedGrad);\n }\n\n /**\n * Backpropagate gradients from this node through the recorded graph.\n */\n backward(grad?: Tensor): void {\n if (!this.requiresGrad) {\n return;\n }\n\n const seedGrad = grad ?? onesLike(this.tensor);\n this._grad = seedGrad;\n\n const topo: GradTensor[] = [];\n const visited = new Set<GradTensor>();\n\n const build = (v: GradTensor): void => {\n if (visited.has(v)) return;\n visited.add(v);\n for (const child of v._prev) build(child);\n topo.push(v);\n };\n\n build(this);\n topo.reverse();\n\n for (const v of topo) {\n v._backward();\n }\n }\n\n add(other: GradTensor): GradTensor {\n const outTensor = add(this.tensor, other.tensor);\n const requiresGrad = gradEnabled && (this.requiresGrad || other.requiresGrad);\n\n const out = new GradTensor({\n tensor: outTensor,\n requiresGrad,\n prev: requiresGrad ? [this, other] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for add backward\");\n }\n if (this.requiresGrad) this.accumulateGrad(reduceBroadcastGrad(go, this.tensor.shape));\n if (other.requiresGrad) other.accumulateGrad(reduceBroadcastGrad(go, other.tensor.shape));\n },\n });\n\n return out;\n }\n\n sub(other: GradTensor): GradTensor {\n const outTensor = sub(this.tensor, other.tensor);\n const requiresGrad = gradEnabled && (this.requiresGrad || other.requiresGrad);\n\n const out = new GradTensor({\n tensor: outTensor,\n requiresGrad,\n prev: requiresGrad ? [this, other] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for sub backward\");\n }\n if (this.requiresGrad) this.accumulateGrad(reduceBroadcastGrad(go, this.tensor.shape));\n if (other.requiresGrad) {\n const grad = reduceBroadcastGrad(neg(go), other.tensor.shape);\n other.accumulateGrad(grad);\n }\n },\n });\n\n return out;\n }\n\n mul(other: GradTensor): GradTensor {\n const outTensor = mul(this.tensor, other.tensor);\n const requiresGrad = gradEnabled && (this.requiresGrad || other.requiresGrad);\n\n const out = new GradTensor({\n tensor: outTensor,\n requiresGrad,\n prev: requiresGrad ? [this, other] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for mul backward\");\n }\n if (this.requiresGrad) {\n const grad = reduceBroadcastGrad(mul(go, other.tensor), this.tensor.shape);\n this.accumulateGrad(grad);\n }\n if (other.requiresGrad) {\n const grad = reduceBroadcastGrad(mul(go, this.tensor), other.tensor.shape);\n other.accumulateGrad(grad);\n }\n },\n });\n\n return out;\n }\n\n neg(): GradTensor {\n const outTensor = neg(this.tensor);\n const requiresGrad = gradEnabled && this.requiresGrad;\n\n const out = new GradTensor({\n tensor: outTensor,\n requiresGrad,\n prev: requiresGrad ? [this] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for neg backward\");\n }\n this.accumulateGrad(neg(go));\n },\n });\n\n return out;\n }\n\n sum(axis?: Axis, keepdims = false): GradTensor {\n let outTensor = sum(this.tensor, axis, keepdims);\n const targetDtype = ensureNumericDType(this.tensor.dtype, \"sum\");\n if (outTensor.dtype !== targetDtype) {\n outTensor = castTensor(outTensor, targetDtype);\n }\n const requiresGrad = gradEnabled && this.requiresGrad;\n\n const out = new GradTensor({\n tensor: outTensor,\n requiresGrad,\n prev: requiresGrad ? [this] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for sum backward\");\n }\n\n // d/dx sum(x) = 1, so the input gradient is the upstream gradient broadcast\n // to the input shape.\n if (axis === undefined) {\n const goData = go.data;\n let g0: number;\n if (Array.isArray(goData)) {\n throw new DTypeError(\"autograd does not support string dtype\");\n } else if (goData instanceof BigInt64Array) {\n g0 = Number(getBigIntElement(goData, go.offset));\n } else {\n g0 = getNumericElement(goData, go.offset);\n }\n const ones = new Float64Array(this.tensor.size);\n ones.fill(g0);\n const onesTensor = fromFloat64Dense(this.tensor.shape, this.tensor.device, ones);\n const grad =\n onesTensor.dtype === this.tensor.dtype\n ? onesTensor\n : castTensor(onesTensor, ensureNumericDType(this.tensor.dtype, \"sum\"));\n this.accumulateGrad(grad);\n return;\n }\n\n const ax = normalizeAxis(axis, this.tensor.ndim);\n\n // If keepdims=false, output shape is input shape with the reduced axis removed.\n // If keepdims=true, output shape matches input ndim with that axis set to 1.\n const outShape = go.shape;\n\n const inDense = new Float64Array(this.tensor.size);\n const inLogicalStrides = computeStrides(this.tensor.shape);\n const outLogicalStrides = computeStrides(outShape);\n const goContiguous = isContiguous(go.shape, go.strides);\n\n for (let inFlat = 0; inFlat < this.tensor.size; inFlat++) {\n // Convert input flat -> input coordinates\n let rem = inFlat;\n const inCoord = new Array<number>(this.tensor.ndim);\n for (let d = 0; d < this.tensor.ndim; d++) {\n const s = inLogicalStrides[d] ?? 1;\n const c = Math.floor(rem / s);\n rem -= c * s;\n inCoord[d] = c;\n }\n\n // Map to output coordinates by removing or zeroing the reduced axis\n const outCoord: number[] = [];\n for (let d = 0; d < this.tensor.ndim; d++) {\n if (d === ax) {\n if (keepdims) outCoord.push(0);\n continue;\n }\n outCoord.push(inCoord[d] ?? 0);\n }\n\n // Convert output coordinates -> output flat\n let outFlat = 0;\n for (let d = 0; d < outCoord.length; d++) {\n outFlat += (outCoord[d] ?? 0) * (outLogicalStrides[d] ?? 1);\n }\n\n const goOffset = goContiguous\n ? go.offset + outFlat\n : offsetFromFlatIndex(outFlat, outLogicalStrides, go.strides, go.offset);\n const goDataBuf = go.data;\n if (Array.isArray(goDataBuf)) {\n throw new DTypeError(\"autograd does not support string dtype\");\n }\n inDense[inFlat] =\n goDataBuf instanceof BigInt64Array\n ? Number(getBigIntElement(goDataBuf, goOffset))\n : getNumericElement(goDataBuf, goOffset);\n }\n\n const inDenseTensor = fromFloat64Dense(this.tensor.shape, this.tensor.device, inDense);\n const grad =\n inDenseTensor.dtype === this.tensor.dtype\n ? inDenseTensor\n : castTensor(inDenseTensor, ensureNumericDType(this.tensor.dtype, \"sum\"));\n this.accumulateGrad(grad);\n },\n });\n\n return out;\n }\n\n div(other: GradTensor): GradTensor {\n const outTensor = div(this.tensor, other.tensor);\n const requiresGrad = gradEnabled && (this.requiresGrad || other.requiresGrad);\n\n const out = new GradTensor({\n tensor: outTensor,\n requiresGrad,\n prev: requiresGrad ? [this, other] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for div backward\");\n }\n const gradDtype = ensureNumericDType(go.dtype, \"div\");\n const numer =\n this.tensor.dtype === gradDtype ? this.tensor : castTensor(this.tensor, gradDtype);\n const denom =\n other.tensor.dtype === gradDtype ? other.tensor : castTensor(other.tensor, gradDtype);\n if (this.requiresGrad) {\n const grad = reduceBroadcastGrad(div(go, denom), this.tensor.shape);\n this.accumulateGrad(grad);\n }\n if (other.requiresGrad) {\n const grad = reduceBroadcastGrad(\n mul(div(go, mul(denom, denom)), neg(numer)),\n other.tensor.shape\n );\n other.accumulateGrad(grad);\n }\n },\n });\n\n return out;\n }\n\n pow(exponent: number): GradTensor {\n if (this.tensor.data instanceof BigInt64Array) {\n throw new DTypeError(\n \"pow() backward is not supported for int64 tensors. \" +\n \"Cast to float32/float64 before calling pow() if gradients are needed.\"\n );\n }\n const exponentTensor = tensor(exponent, { dtype: this.tensor.dtype });\n const outTensor = pow(this.tensor, exponentTensor);\n const requiresGrad = gradEnabled && this.requiresGrad;\n\n const out = new GradTensor({\n tensor: outTensor,\n requiresGrad,\n prev: requiresGrad ? [this] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for pow backward\");\n }\n const powMinusOne = pow(this.tensor, tensor(exponent - 1, { dtype: this.tensor.dtype }));\n const grad = mul(mul(go, tensor(exponent, { dtype: outTensor.dtype })), powMinusOne);\n this.accumulateGrad(grad);\n },\n });\n\n return out;\n }\n\n sqrt(): GradTensor {\n return this.pow(0.5);\n }\n\n matmul(other: GradTensor): GradTensor {\n const outTensor = dot(this.tensor, other.tensor);\n const requiresGrad = gradEnabled && (this.requiresGrad || other.requiresGrad);\n const leftBatchRank = Math.max(0, this.tensor.ndim - 2);\n const rightBatchRank = Math.max(0, other.tensor.ndim - 2);\n const leftBroadcasted = leftBatchRank === 0 && rightBatchRank > 0;\n const rightBroadcasted = rightBatchRank === 0 && leftBatchRank > 0;\n const leftDtype = ensureNumericDType(this.tensor.dtype, \"matmul\");\n const rightDtype = ensureNumericDType(other.tensor.dtype, \"matmul\");\n\n const swapLastTwo = (t: Tensor): Tensor => {\n if (t.ndim < 2) return t;\n const axes: number[] = [];\n for (let i = 0; i < t.ndim; i++) {\n axes.push(i);\n }\n const last = t.ndim - 1;\n const secondLast = t.ndim - 2;\n const tmp = axes[last];\n axes[last] = axes[secondLast] ?? last;\n axes[secondLast] = tmp ?? secondLast;\n return transpose(t, axes);\n };\n\n const reduceBatchDims = (t: Tensor, batchRank: number, targetDtype: NumericDType): Tensor => {\n let out = t;\n for (let i = 0; i < batchRank; i++) {\n out = sum(out, 0);\n }\n return castTensor(out, targetDtype);\n };\n\n const out = new GradTensor({\n tensor: outTensor,\n requiresGrad,\n prev: requiresGrad ? [this, other] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for matmul backward\");\n }\n if (this.requiresGrad) {\n let grad = dot(go, swapLastTwo(other.tensor));\n if (leftBroadcasted) {\n grad = reduceBatchDims(grad, rightBatchRank, leftDtype);\n } else {\n grad = castTensor(grad, leftDtype);\n }\n this.accumulateGrad(grad);\n }\n if (other.requiresGrad) {\n let grad = dot(swapLastTwo(this.tensor), go);\n if (rightBroadcasted) {\n grad = reduceBatchDims(grad, leftBatchRank, rightDtype);\n } else {\n grad = castTensor(grad, rightDtype);\n }\n other.accumulateGrad(grad);\n }\n },\n });\n\n return out;\n }\n\n relu(): GradTensor {\n if (this.tensor.data instanceof BigInt64Array) {\n const out = new BigInt64Array(this.tensor.size);\n const logicalStrides = computeStrides(this.tensor.shape);\n const contiguous = isContiguous(this.tensor.shape, this.tensor.strides);\n for (let i = 0; i < this.tensor.size; i++) {\n const offset = contiguous\n ? this.tensor.offset + i\n : offsetFromFlatIndex(i, logicalStrides, this.tensor.strides, this.tensor.offset);\n const val = getBigIntElement(this.tensor.data, offset);\n out[i] = val > 0n ? val : 0n;\n }\n const outTensor = TensorClass.fromTypedArray({\n data: out,\n shape: this.tensor.shape,\n dtype: \"int64\",\n device: this.tensor.device,\n });\n return GradTensor.fromTensor(outTensor, { requiresGrad: false });\n }\n const outTensor = relu(this.tensor);\n const outDtype = ensureNumericDType(outTensor.dtype, \"relu\");\n const requiresGrad = gradEnabled && this.requiresGrad;\n\n const out = new GradTensor({\n tensor: outTensor,\n requiresGrad,\n prev: requiresGrad ? [this] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for relu backward\");\n }\n const maskData = new (dtypeToTypedArrayCtor(outDtype))(this.tensor.size);\n const inputDense = asFloat64Dense(this.tensor);\n if (maskData instanceof BigInt64Array) {\n for (let i = 0; i < inputDense.length; i++) {\n const val = inputDense[i] ?? 0;\n maskData[i] = val > 0 ? 1n : 0n;\n }\n } else {\n // maskData is numeric typed array\n for (let i = 0; i < inputDense.length; i++) {\n const val = inputDense[i] ?? 0;\n maskData[i] = val > 0 ? 1 : 0;\n }\n }\n const maskTensor = TensorClass.fromTypedArray({\n data: maskData,\n shape: this.tensor.shape,\n dtype: outDtype,\n device: this.tensor.device,\n });\n const grad = mul(go, maskTensor);\n this.accumulateGrad(grad);\n },\n });\n\n return out;\n }\n\n sigmoid(): GradTensor {\n const outTensor = sigmoid(this.tensor);\n const requiresGrad = gradEnabled && this.requiresGrad;\n\n const out = new GradTensor({\n tensor: outTensor,\n requiresGrad,\n prev: requiresGrad ? [this] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for sigmoid backward\");\n }\n const one = tensor(1, { dtype: outTensor.dtype });\n const sigmoidGrad = mul(outTensor, sub(one, outTensor));\n const grad = mul(go, sigmoidGrad);\n this.accumulateGrad(grad);\n },\n });\n\n return out;\n }\n\n square(): GradTensor {\n return this.pow(2);\n }\n\n exp(): GradTensor {\n let outTensor = exp(this.tensor);\n const targetDtype = ensureNumericDType(this.tensor.dtype, \"exp\");\n if (outTensor.dtype !== targetDtype) {\n outTensor = castTensor(outTensor, targetDtype);\n }\n const requiresGrad = gradEnabled && this.requiresGrad;\n\n const out = new GradTensor({\n tensor: outTensor,\n requiresGrad,\n prev: requiresGrad ? [this] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for exp backward\");\n }\n // d/dx exp(x) = exp(x)\n const grad = mul(go, outTensor);\n this.accumulateGrad(grad);\n },\n });\n\n return out;\n }\n\n log(): GradTensor {\n const outTensor = log(this.tensor);\n const requiresGrad = gradEnabled && this.requiresGrad;\n\n const out = new GradTensor({\n tensor: outTensor,\n requiresGrad,\n prev: requiresGrad ? [this] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for log backward\");\n }\n // d/dx log(x) = 1/x\n const denom =\n this.tensor.dtype === go.dtype\n ? this.tensor\n : castTensor(this.tensor, ensureNumericDType(go.dtype, \"log\"));\n const grad = div(go, denom);\n this.accumulateGrad(grad);\n },\n });\n\n return out;\n }\n\n tanh(): GradTensor {\n const outTensor = tanh(this.tensor);\n const requiresGrad = gradEnabled && this.requiresGrad;\n\n const out = new GradTensor({\n tensor: outTensor,\n requiresGrad,\n prev: requiresGrad ? [this] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for tanh backward\");\n }\n // d/dx tanh(x) = 1 - tanh(x)^2\n const tanhSq = mul(outTensor, outTensor);\n const one = tensor(1, { dtype: outTensor.dtype });\n const grad = mul(go, sub(one, tanhSq));\n this.accumulateGrad(grad);\n },\n });\n\n return out;\n }\n\n slice(...args: SliceRange[]): GradTensor {\n const outTensor = slice(this.tensor, ...args);\n const requiresGrad = gradEnabled && this.requiresGrad;\n\n // Pre-compute normalized ranges for backward scatter\n const inputShape = this.tensor.shape;\n const ndim = this.tensor.ndim;\n type NR = { start: number; end: number; step: number; isIndex: boolean };\n const nrList: NR[] = [];\n for (let axis = 0; axis < ndim; axis++) {\n const dim = inputShape[axis] ?? 0;\n const r = args[axis];\n if (r === undefined) {\n nrList.push({ start: 0, end: dim, step: 1, isIndex: false });\n } else if (typeof r === \"number\") {\n const idx = r < 0 ? dim + r : r;\n nrList.push({ start: idx, end: idx + 1, step: 1, isIndex: true });\n } else {\n const step = r.step ?? 1;\n if (step > 0) {\n const s = Math.min(\n Math.max((r.start ?? 0) < 0 ? dim + (r.start ?? 0) : (r.start ?? 0), 0),\n dim\n );\n const e = Math.min(\n Math.max((r.end ?? dim) < 0 ? dim + (r.end ?? dim) : (r.end ?? dim), 0),\n dim\n );\n nrList.push({ start: s, end: e, step, isIndex: false });\n } else {\n let s = (r.start ?? dim - 1) < 0 ? dim + (r.start ?? dim - 1) : (r.start ?? dim - 1);\n if (s >= dim) s = dim - 1;\n if (s < -1) s = -1;\n const endRaw = r.end ?? -1;\n let e: number;\n if (endRaw === -1) {\n e = -1;\n } else if (endRaw < 0) {\n e = dim + endRaw;\n if (e < -1) e = -1;\n } else {\n e = endRaw;\n if (e >= dim) e = dim - 1;\n }\n nrList.push({ start: s, end: e, step, isIndex: false });\n }\n }\n }\n\n const out = new GradTensor({\n tensor: outTensor,\n requiresGrad,\n prev: requiresGrad ? [this] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for slice backward\");\n }\n // Scatter gradient back into a zero tensor of the original shape\n const dtype = ensureNumericDType(this.tensor.dtype, \"slice\");\n const gradData = new (dtypeToTypedArrayCtor(dtype))(this.tensor.size);\n const goDense = asFloat64Dense(go);\n\n // Build output shape (non-index axes)\n const outShape: number[] = [];\n for (const nr of nrList) {\n if (!nr.isIndex) {\n const len =\n nr.step > 0\n ? Math.max(0, Math.ceil((nr.end - nr.start) / nr.step))\n : Math.max(0, Math.ceil((nr.start - nr.end) / -nr.step));\n outShape.push(len);\n }\n }\n const outSize = outShape.length === 0 ? 1 : outShape.reduce((a, b) => a * b, 1);\n const outStrides = computeStrides(outShape);\n const inStrides = computeStrides(inputShape);\n\n for (let outFlat = 0; outFlat < outSize; outFlat++) {\n // Unravel output flat index\n let rem = outFlat;\n const outIdx: number[] = new Array(outShape.length);\n for (let i = 0; i < outShape.length; i++) {\n const s = outStrides[i] ?? 1;\n outIdx[i] = Math.floor(rem / s);\n rem %= s;\n }\n\n // Map to input flat index\n let inFlat = 0;\n let outAxis = 0;\n for (let axis = 0; axis < ndim; axis++) {\n const nr = nrList[axis];\n if (!nr) throw new DeepboxError(\"Internal error: missing normalized slice range\");\n const inIdx = nr.isIndex ? nr.start : nr.start + (outIdx[outAxis++] ?? 0) * nr.step;\n inFlat += inIdx * (inStrides[axis] ?? 0);\n }\n\n const val = goDense[outFlat] ?? 0;\n if (gradData instanceof BigInt64Array) {\n gradData[inFlat] = BigInt(Math.round(val));\n } else {\n gradData[inFlat] = val;\n }\n }\n\n const gradTensor = TensorClass.fromTypedArray({\n data: gradData,\n shape: inputShape,\n dtype,\n device: this.tensor.device,\n });\n this.accumulateGrad(gradTensor);\n },\n });\n return out;\n }\n\n gather(indices: GradTensor, axis: Axis): GradTensor {\n const outTensor = gather(this.tensor, indices.tensor, axis);\n const ax = normalizeAxis(axis, this.tensor.ndim);\n const requiresGrad = gradEnabled && (this.requiresGrad || indices.requiresGrad);\n\n const out = new GradTensor({\n tensor: outTensor,\n requiresGrad,\n prev: requiresGrad ? [this, indices] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for gather backward\");\n }\n // scatter_add: accumulate gradient into positions that were gathered from\n if (this.requiresGrad) {\n const dtype = ensureNumericDType(this.tensor.dtype, \"gather\");\n const gradData = new (dtypeToTypedArrayCtor(dtype))(this.tensor.size);\n const goDense = asFloat64Dense(go);\n\n const outShape = outTensor.shape;\n const inShape = this.tensor.shape;\n const outStrides = computeStrides(outShape);\n const inStrides = computeStrides(inShape);\n const idxDense = asFloat64Dense(indices.tensor);\n\n for (let outFlat = 0; outFlat < outTensor.size; outFlat++) {\n // Unravel output flat index\n let rem = outFlat;\n const outIdx: number[] = new Array(outShape.length);\n for (let i = 0; i < outShape.length; i++) {\n const s = outStrides[i] ?? 1;\n outIdx[i] = Math.floor(rem / s);\n rem %= s;\n }\n\n // The input index is the same as outIdx except along the gather axis,\n // where we use the original index value\n const idxVal = Math.round(idxDense[outIdx[ax] ?? 0] ?? 0);\n const inIdx = outIdx.slice();\n inIdx[ax] = idxVal;\n\n let inFlat = 0;\n for (let i = 0; i < inShape.length; i++) {\n inFlat += (inIdx[i] ?? 0) * (inStrides[i] ?? 0);\n }\n\n const val = goDense[outFlat] ?? 0;\n if (gradData instanceof BigInt64Array) {\n gradData[inFlat] = (gradData[inFlat] ?? 0n) + BigInt(Math.round(val));\n } else {\n gradData[inFlat] = (gradData[inFlat] ?? 0) + val;\n }\n }\n\n const gradTensor = TensorClass.fromTypedArray({\n data: gradData,\n shape: inShape,\n dtype,\n device: this.tensor.device,\n });\n this.accumulateGrad(gradTensor);\n }\n // indices gradient is not meaningful (discrete), so we skip it\n },\n });\n return out;\n }\n\n mean(axis?: Axis, keepdims = false): GradTensor {\n let n: number;\n if (axis === undefined) {\n n = this.tensor.size;\n } else {\n const ax = normalizeAxis(axis, this.tensor.ndim);\n n = this.tensor.shape[ax] ?? 1;\n }\n const summed = this.sum(axis, keepdims);\n // Use summed tensor's dtype (which may be promoted by sum) to avoid dtype mismatch in div\n const denom = GradTensor.scalar(n, {\n dtype: ensureNumericDType(summed.tensor.dtype, \"mean\"),\n });\n return summed.div(denom);\n }\n\n max(axis?: Axis, keepdims = false): GradTensor {\n const outTensor = max(this.tensor, axis, keepdims);\n const requiresGrad = gradEnabled && this.requiresGrad;\n\n const out = new GradTensor({\n tensor: outTensor,\n requiresGrad,\n prev: requiresGrad ? [this] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for max backward\");\n }\n\n let maxReshaped = outTensor;\n let gradReshaped = go;\n\n if (axis === undefined) {\n // Full reduction\n const allOnes = new Array(this.tensor.ndim).fill(1);\n maxReshaped = outTensor.reshape(allOnes);\n gradReshaped = go.reshape(allOnes);\n } else if (!keepdims) {\n // Axis reduction without keepdims\n const ax = normalizeAxis(axis, this.tensor.ndim);\n const targetShape = [...this.tensor.shape];\n targetShape[ax] = 1;\n maxReshaped = outTensor.reshape(targetShape);\n gradReshaped = go.reshape(targetShape);\n }\n\n const maskBool = equal(this.tensor, maxReshaped);\n const mask = castTensor(maskBool, ensureNumericDType(this.tensor.dtype, \"max\"));\n const grad = mul(mask, gradReshaped);\n this.accumulateGrad(grad);\n },\n });\n\n return out;\n }\n\n /**\n * Reshape the GradTensor to a new shape without copying data.\n *\n * Returns a new GradTensor with the specified shape. The underlying tensor\n * is reshaped, and gradient computation is preserved through the reshape operation.\n *\n * @param newShape - The desired shape for the tensor\n * @returns A new GradTensor with the specified shape\n * @throws {ShapeError} If the new shape is incompatible with the tensor's size\n *\n * @example\n * ```ts\n * const t = parameter([1, 2, 3, 4, 5, 6]);\n * const reshaped = t.reshape([2, 3]);\n * console.log(reshaped.shape); // [2, 3]\n * ```\n */\n reshape(newShape: Shape): GradTensor {\n const reshapedTensor = this.tensor.reshape(newShape);\n const requiresGrad = gradEnabled && this.requiresGrad;\n\n const out = new GradTensor({\n tensor: reshapedTensor,\n requiresGrad,\n prev: requiresGrad ? [this] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for reshape backward\");\n }\n // Reshape gradient back to original shape\n const reshapedGrad = go.reshape(this.tensor.shape);\n this.accumulateGrad(reshapedGrad);\n },\n });\n\n return out;\n }\n\n /**\n * Flatten the GradTensor to a 1-dimensional array.\n *\n * Returns a new 1D GradTensor containing all elements.\n *\n * @returns A 1D GradTensor with shape [size]\n *\n * @example\n * ```ts\n * const matrix = parameter([[1, 2, 3], [4, 5, 6]]);\n * const flat = matrix.flatten();\n * console.log(flat.shape); // [6]\n * ```\n */\n flatten(): GradTensor {\n return this.reshape([this.tensor.size]);\n }\n\n /**\n * Create a view of the GradTensor with a different shape.\n *\n * Similar to reshape but uses the underlying tensor's view method.\n *\n * @param shape - The desired shape for the view\n * @param strides - Optional custom strides\n * @param offset - Optional offset into the data buffer\n * @returns A new GradTensor view with the specified shape\n */\n view(shape: Shape, strides?: readonly number[], offset?: number): GradTensor {\n const viewTensor = this.tensor.view(shape, strides, offset);\n const requiresGrad = gradEnabled && this.requiresGrad;\n\n const out = new GradTensor({\n tensor: viewTensor,\n requiresGrad,\n prev: requiresGrad ? [this] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for view backward\");\n }\n // view preserves total element count; reshape gradient back to original shape\n const gradReshaped = go.reshape(this.tensor.shape);\n this.accumulateGrad(gradReshaped);\n },\n });\n\n return out;\n }\n transpose(axes?: readonly number[]): GradTensor {\n const outTensor = transpose(this.tensor, axes);\n const requiresGrad = gradEnabled && this.requiresGrad;\n\n const out = new GradTensor({\n tensor: outTensor,\n requiresGrad,\n prev: requiresGrad ? [this] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for transpose backward\");\n }\n // Transpose gradient back to original shape\n // For default transpose (reverse axes), we just apply it again\n // For custom axes, we need inverse permutation\n if (axes === undefined) {\n const grad = transpose(go);\n this.accumulateGrad(grad);\n } else {\n // Inverse permutation\n const invAxes = new Array<number>(axes.length);\n for (let i = 0; i < axes.length; i++) {\n const axis = axes[i];\n if (axis !== undefined) {\n invAxes[axis] = i;\n }\n }\n const grad = transpose(go, invAxes);\n this.accumulateGrad(grad);\n }\n },\n });\n\n return out;\n }\n\n min(axis?: Axis, keepdims = false): GradTensor {\n const outTensor = min(this.tensor, axis, keepdims);\n const requiresGrad = gradEnabled && this.requiresGrad;\n\n const out = new GradTensor({\n tensor: outTensor,\n requiresGrad,\n prev: requiresGrad ? [this] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for min backward\");\n }\n\n let minReshaped = outTensor;\n let gradReshaped = go;\n\n if (axis === undefined) {\n const allOnes = new Array(this.tensor.ndim).fill(1);\n minReshaped = outTensor.reshape(allOnes);\n gradReshaped = go.reshape(allOnes);\n } else if (!keepdims) {\n const ax = normalizeAxis(axis, this.tensor.ndim);\n const targetShape = [...this.tensor.shape];\n targetShape[ax] = 1;\n minReshaped = outTensor.reshape(targetShape);\n gradReshaped = go.reshape(targetShape);\n }\n\n const maskBool = equal(this.tensor, minReshaped);\n const mask = castTensor(maskBool, ensureNumericDType(this.tensor.dtype, \"min\"));\n const grad = mul(mask, gradReshaped);\n this.accumulateGrad(grad);\n },\n });\n\n return out;\n }\n\n abs(): GradTensor {\n const outTensor = absOp(this.tensor);\n const requiresGrad = gradEnabled && this.requiresGrad;\n\n const out = new GradTensor({\n tensor: outTensor,\n requiresGrad,\n prev: requiresGrad ? [this] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for abs backward\");\n }\n // d/dx |x| = sign(x), but sign(0) = 0 so gradient is 0 at x=0\n const zeroT = zeros(this.tensor.shape, {\n dtype: this.tensor.dtype,\n device: this.tensor.device,\n });\n const posMask = castTensor(\n greater(this.tensor, zeroT),\n ensureNumericDType(this.tensor.dtype, \"abs\")\n );\n const negMask = castTensor(\n less(this.tensor, zeroT),\n ensureNumericDType(this.tensor.dtype, \"abs\")\n );\n const signT = sub(posMask, negMask);\n const grad = mul(go, signT);\n this.accumulateGrad(grad);\n },\n });\n\n return out;\n }\n\n clip(minVal: number, maxVal: number): GradTensor {\n const outTensor = clipOp(this.tensor, minVal, maxVal);\n const requiresGrad = gradEnabled && this.requiresGrad;\n\n const out = new GradTensor({\n tensor: outTensor,\n requiresGrad,\n prev: requiresGrad ? [this] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for clip backward\");\n }\n // Gradient passes through where input is within [min, max], zero elsewhere\n const dtype = ensureNumericDType(this.tensor.dtype, \"clip\");\n const lowT = tensor(minVal, { dtype: this.tensor.dtype });\n const highT = tensor(maxVal, { dtype: this.tensor.dtype });\n const aboveLow = castTensor(greater(this.tensor, lowT), dtype);\n const equalLow = castTensor(equal(this.tensor, lowT), dtype);\n const belowHigh = castTensor(less(this.tensor, highT), dtype);\n const equalHigh = castTensor(equal(this.tensor, highT), dtype);\n // mask = (x > min || x == min) && (x < max || x == max)\n // = (x >= min) && (x <= max)\n const geMin = add(aboveLow, equalLow);\n const leMax = add(belowHigh, equalHigh);\n const mask = mul(geMin, leMax);\n const grad = mul(go, mask);\n this.accumulateGrad(grad);\n },\n });\n\n return out;\n }\n\n leakyRelu(negativeSlope = 0.01): GradTensor {\n const outTensor = leakyRelu(this.tensor, negativeSlope);\n const requiresGrad = gradEnabled && this.requiresGrad;\n\n const out = new GradTensor({\n tensor: outTensor,\n requiresGrad,\n prev: requiresGrad ? [this] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for leakyRelu backward\");\n }\n // d/dx leakyRelu(x) = 1 if x > 0, negativeSlope if x <= 0\n const dtype = ensureNumericDType(outTensor.dtype, \"leakyRelu\");\n const zeroT = zeros(this.tensor.shape, {\n dtype: this.tensor.dtype,\n device: this.tensor.device,\n });\n const posMask = castTensor(greater(this.tensor, zeroT), dtype);\n // slopeVals = negativeSlope * (1 - posMask) + 1 * posMask\n const slopeT = tensor(negativeSlope, { dtype });\n const oneT = tensor(1, { dtype });\n const negMask = sub(oneT, posMask);\n const slopeVals = add(posMask, mul(negMask, slopeT));\n const grad = mul(go, slopeVals);\n this.accumulateGrad(grad);\n },\n });\n\n return out;\n }\n\n elu(alpha = 1.0): GradTensor {\n const outTensor = elu(this.tensor, alpha);\n const requiresGrad = gradEnabled && this.requiresGrad;\n\n const out = new GradTensor({\n tensor: outTensor,\n requiresGrad,\n prev: requiresGrad ? [this] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for elu backward\");\n }\n // d/dx elu(x) = 1 if x > 0, alpha * exp(x) if x <= 0\n // = 1 if x > 0, elu(x) + alpha if x <= 0\n const dtype = ensureNumericDType(outTensor.dtype, \"elu\");\n const zeroT = zeros(this.tensor.shape, {\n dtype: this.tensor.dtype,\n device: this.tensor.device,\n });\n const posMask = castTensor(greater(this.tensor, zeroT), dtype);\n const oneT = tensor(1, { dtype });\n const negMask = sub(oneT, posMask);\n const alphaT = tensor(alpha, { dtype });\n // For x <= 0: derivative = elu(x) + alpha\n const negDeriv = add(outTensor, alphaT);\n const derivVals = add(posMask, mul(negMask, negDeriv));\n const grad = mul(go, derivVals);\n this.accumulateGrad(grad);\n },\n });\n\n return out;\n }\n\n gelu(): GradTensor {\n const outTensor = gelu(this.tensor);\n const requiresGrad = gradEnabled && this.requiresGrad;\n\n const out = new GradTensor({\n tensor: outTensor,\n requiresGrad,\n prev: requiresGrad ? [this] : [],\n backward: () => {\n if (!requiresGrad) return;\n const go = out._grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for gelu backward\");\n }\n // GELU(x) = x * Φ(x), where Φ is the standard normal CDF\n // d/dx GELU(x) ≈ Φ(x) + x * φ(x), where φ is the standard normal PDF\n // Approximate with tanh form:\n // GELU(x) ≈ 0.5 * x * (1 + tanh(sqrt(2/π) * (x + 0.044715 * x^3)))\n // Derivative: use numerical approach via the output\n const dtype = ensureNumericDType(outTensor.dtype, \"gelu\");\n const inputDense = asFloat64Dense(this.tensor);\n const derivData = new Float64Array(this.tensor.size);\n const k = Math.sqrt(2 / Math.PI);\n for (let i = 0; i < inputDense.length; i++) {\n const x = inputDense[i] ?? 0;\n const inner = k * (x + 0.044715 * x * x * x);\n const tanhVal = Math.tanh(inner);\n const cdf = 0.5 * (1 + tanhVal);\n const pdf = k * (1 + 0.134145 * x * x) * (1 - tanhVal * tanhVal);\n derivData[i] = cdf + x * 0.5 * pdf;\n }\n const derivTensor = TensorClass.fromTypedArray({\n data: derivData,\n shape: this.tensor.shape,\n dtype: \"float64\",\n device: this.tensor.device,\n });\n const deriv = derivTensor.dtype === dtype ? derivTensor : castTensor(derivTensor, dtype);\n const grad = mul(go, deriv);\n this.accumulateGrad(grad);\n },\n });\n\n return out;\n }\n\n /**\n * Return a human-readable string representation of this GradTensor.\n *\n * Delegates to the underlying {@link Tensor.toString} and appends\n * gradient metadata.\n *\n * @param maxElements - Maximum elements per dimension before summarizing (default: 6).\n * @returns Formatted string representation\n */\n toString(maxElements = 6): string {\n const base = this.tensor.toString(maxElements);\n const gradInfo = this.requiresGrad ? \", requiresGrad=true\" : \"\";\n return base.replace(/\\)$/, `${gradInfo})`);\n }\n}\n\n/**\n * Create a GradTensor with requiresGrad=true.\n */\nexport function parameter(\n data: number | number[] | number[][] | number[][][] | Tensor,\n options: GradTensorOptions = {}\n): GradTensor {\n const t =\n data instanceof TensorClass\n ? data\n : tensor(data, options.dtype ? { dtype: options.dtype } : undefined);\n return GradTensor.fromTensor(t, { ...options, requiresGrad: true });\n}\n\n/**\n * Context manager to disable gradient calculation.\n *\n * **Important:** The callback must be synchronous. Passing an async function\n * will cause `gradEnabled` to be restored before the awaited work finishes,\n * silently breaking gradient tracking inside the async continuation.\n *\n * @throws {DeepboxError} If the callback returns a Promise (async function detected)\n */\nexport function noGrad<T>(fn: () => T): T {\n const prev = gradEnabled;\n gradEnabled = false;\n try {\n const result = fn();\n if (result instanceof Promise) {\n throw new DeepboxError(\n \"noGrad() does not support async callbacks. \" +\n \"The gradient state would be restored before the async work completes. \" +\n \"Wrap your async logic so that only the synchronous tensor operations are inside noGrad().\"\n );\n }\n return result;\n } finally {\n gradEnabled = prev;\n }\n}\n\n/**\n * Image to Column operation for GradTensor.\n */\nexport function im2col(\n input: GradTensor,\n kernelSize: [number, number],\n stride: [number, number],\n padding: [number, number]\n): GradTensor {\n const outTensor = im2colOp(input.tensor, kernelSize, stride, padding);\n const requiresGrad = gradEnabled && input.requiresGrad;\n\n let result: GradTensor;\n\n const backward = () => {\n if (!requiresGrad) return;\n const go = result.grad;\n if (go === null) {\n throw new DeepboxError(\"Internal error: missing gradient for im2col backward\");\n }\n // Backward of im2col is col2im\n const gradInput = col2im(go, input.shape, kernelSize, stride, padding);\n input.accumulateGrad(gradInput);\n };\n\n result = GradTensor.create({\n tensor: outTensor,\n requiresGrad,\n prev: requiresGrad ? [input] : [],\n backward,\n });\n\n return result;\n}\n\nexport function softmax(input: GradTensor, axis = -1): GradTensor {\n // Detach max for numerical stability (softmax is shift-invariant)\n const maxVal = max(input.tensor, axis, true);\n const maxT = GradTensor.fromTensor(maxVal, { requiresGrad: false });\n const shifted = input.sub(maxT);\n const expT = shifted.exp();\n const sumT = expT.sum(axis, true);\n return expT.div(sumT);\n}\n\nexport function logSoftmax(input: GradTensor, axis = -1): GradTensor {\n const maxVal = max(input.tensor, axis, true);\n const maxTensor =\n maxVal.dtype === input.dtype\n ? maxVal\n : tensor(toNumericNestedArray(maxVal.toArray()), { dtype: input.dtype });\n const maxT = GradTensor.fromTensor(maxTensor, { requiresGrad: false });\n const shifted = input.sub(maxT);\n const expT = shifted.exp();\n const sumT = expT.sum(axis, true);\n const logSumExp = sumT.log();\n return shifted.sub(logSumExp);\n}\n\nexport function variance(input: GradTensor, axis?: number, correction = 1): GradTensor {\n const meanVal = input.mean(axis, true);\n const centered = input.sub(meanVal);\n const sq = centered.square();\n const sumSq = sq.sum(axis, false); // Reduce dims\n\n let n: number;\n if (axis === undefined) {\n n = input.size;\n } else {\n const ax = axis < 0 ? input.ndim + axis : axis;\n if (ax < 0 || ax >= input.ndim) {\n throw new InvalidParameterError(\n `variance axis must be in range [0, ${input.ndim})`,\n \"axis\",\n axis\n );\n }\n n = input.shape[ax] ?? 1;\n }\n const denom = Math.max(0, n - correction);\n const denomT = GradTensor.scalar(denom, {\n dtype: ensureNumericDType(input.dtype, \"variance\"),\n });\n\n return sumSq.div(denomT);\n}\n\nexport function dropout(input: GradTensor, p = 0.5, training = true): GradTensor {\n if (!training || p === 0) return input;\n\n const dtype = ensureNumericDType(input.dtype, \"dropout\");\n const scale = 1 / (1 - p);\n const mask = dropoutMask(input.shape, p, scale, dtype, input.device);\n const maskGrad = GradTensor.fromTensor(mask, { requiresGrad: false });\n return input.mul(maskGrad);\n}\n","import {\n DTypeError,\n getBigIntElement,\n getNumericElement,\n type Shape,\n type TypedArray,\n} from \"../../core\";\nimport { isContiguous } from \"../tensor/strides\";\nimport { computeStrides, isBigIntArray, Tensor } from \"../tensor/Tensor\";\nimport { flatOffset } from \"./_internal\";\nimport {\n broadcastApply,\n ensureBroadcastableScalar,\n getBroadcastShape,\n isScalar,\n} from \"./broadcast\";\n\nfunction requireTypedArray(t: Tensor): TypedArray {\n if (t.dtype === \"string\" || Array.isArray(t.data)) {\n throw new DTypeError(\"logical operations are not implemented for string dtype\");\n }\n return t.data;\n}\n\nfunction isTruthy(data: TypedArray, offset: number): boolean {\n if (isBigIntArray(data)) {\n return getBigIntElement(data, offset) !== 0n;\n }\n return getNumericElement(data, offset) !== 0;\n}\n\n/**\n * Element-wise logical AND.\n *\n * Returns true (1) where both inputs are non-zero (truthy), false (0) otherwise.\n *\n * @param a - First input tensor\n * @param b - Second input tensor\n * @returns Boolean tensor with AND results\n *\n * @example\n * ```ts\n * const a = tensor([1, 0, 1]);\n * const b = tensor([1, 1, 0]);\n * logicalAnd(a, b); // tensor([1, 0, 0])\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.logical_and.html | NumPy logical_and}\n */\nexport function logicalAnd(a: Tensor, b: Tensor): Tensor {\n if (a.dtype === \"string\" || b.dtype === \"string\") {\n throw new DTypeError(\"logical operations are not implemented for string dtype\");\n }\n ensureBroadcastableScalar(a, b);\n\n const outShape: Shape = isScalar(a)\n ? b.shape\n : isScalar(b)\n ? a.shape\n : getBroadcastShape(a.shape, b.shape);\n const outSize = outShape.reduce((acc, dim) => acc * dim, 1);\n\n const out = new Uint8Array(outSize);\n const result = Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: \"bool\",\n device: a.device,\n });\n\n const aData = requireTypedArray(a);\n const bData = requireTypedArray(b);\n\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n const ax = isTruthy(aData, offA);\n const bx = isTruthy(bData, offB);\n out[offOut] = ax && bx ? 1 : 0;\n });\n\n return result;\n}\n\n/**\n * Element-wise logical OR.\n *\n * Returns true (1) where at least one input is non-zero (truthy).\n *\n * @param a - First input tensor\n * @param b - Second input tensor\n * @returns Boolean tensor with OR results\n *\n * @example\n * ```ts\n * const a = tensor([1, 0, 0]);\n * const b = tensor([1, 1, 0]);\n * logicalOr(a, b); // tensor([1, 1, 0])\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.logical_or.html | NumPy logical_or}\n */\nexport function logicalOr(a: Tensor, b: Tensor): Tensor {\n if (a.dtype === \"string\" || b.dtype === \"string\") {\n throw new DTypeError(\"logical operations are not implemented for string dtype\");\n }\n // Ensure tensors are compatible (same size or one is scalar)\n ensureBroadcastableScalar(a, b);\n\n // Determine output shape (use non-scalar shape)\n const outShape: Shape = isScalar(a)\n ? b.shape\n : isScalar(b)\n ? a.shape\n : getBroadcastShape(a.shape, b.shape);\n const outSize = outShape.reduce((acc, dim) => acc * dim, 1);\n\n // Create output array for boolean results\n const out = new Uint8Array(outSize);\n const result = Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: \"bool\",\n device: a.device,\n });\n\n const aData = requireTypedArray(a);\n const bData = requireTypedArray(b);\n\n // Element-wise OR operation\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n const ax = isTruthy(aData, offA);\n const bx = isTruthy(bData, offB);\n out[offOut] = ax || bx ? 1 : 0;\n });\n\n return result;\n}\n\n/**\n * Element-wise logical XOR (exclusive OR).\n *\n * Returns true (1) where exactly one input is non-zero (true but not both).\n *\n * @param a - First input tensor\n * @param b - Second input tensor\n * @returns Boolean tensor with XOR results\n *\n * @example\n * ```ts\n * const a = tensor([1, 0, 1, 0]);\n * const b = tensor([1, 1, 0, 0]);\n * logicalXor(a, b); // tensor([0, 1, 1, 0])\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.logical_xor.html | NumPy logical_xor}\n */\nexport function logicalXor(a: Tensor, b: Tensor): Tensor {\n if (a.dtype === \"string\" || b.dtype === \"string\") {\n throw new DTypeError(\"logical operations are not implemented for string dtype\");\n }\n ensureBroadcastableScalar(a, b);\n\n const outShape: Shape = isScalar(a)\n ? b.shape\n : isScalar(b)\n ? a.shape\n : getBroadcastShape(a.shape, b.shape);\n const outSize = outShape.reduce((acc, dim) => acc * dim, 1);\n\n const out = new Uint8Array(outSize);\n const result = Tensor.fromTypedArray({\n data: out,\n shape: outShape,\n dtype: \"bool\",\n device: a.device,\n });\n\n const aData = requireTypedArray(a);\n const bData = requireTypedArray(b);\n\n // Element-wise XOR: true if exactly one is true\n broadcastApply(a, b, result, (offA, offB, offOut) => {\n const ax = isTruthy(aData, offA);\n const bx = isTruthy(bData, offB);\n out[offOut] = (ax && !bx) || (!ax && bx) ? 1 : 0;\n });\n\n return result;\n}\n\n/**\n * Element-wise logical NOT.\n *\n * Returns true (1) for zero elements, false (0) for non-zero elements.\n * Inverts the truthiness of each element.\n *\n * @param t - Input tensor\n * @returns Boolean tensor with NOT results\n *\n * @example\n * ```ts\n * const t = tensor([1, 0, 5, 0]);\n * logicalNot(t); // tensor([0, 1, 0, 1])\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.logical_not.html | NumPy logical_not}\n */\nexport function logicalNot(t: Tensor): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"logicalNot is not implemented for string dtype\");\n }\n\n const out = new Uint8Array(t.size);\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n const data = requireTypedArray(t);\n\n // Element-wise NOT operation\n for (let i = 0; i < t.size; i++) {\n // Invert: 0 becomes 1, non-zero becomes 0\n const srcOffset = flatOffset(i, t.offset, contiguous, logicalStrides, t.strides);\n out[i] = isTruthy(data, srcOffset) ? 0 : 1;\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"bool\",\n device: t.device,\n });\n}\n","/**\n * Tensor manipulation operations.\n *\n * This module provides functions for manipulating tensor structure and content:\n * - concatenate: Join tensors along an axis\n * - stack: Stack tensors along a new axis\n * - split: Split tensor into multiple sub-tensors\n * - tile: Repeat tensor along axes\n * - repeat: Repeat elements along an axis\n * - pad: Add padding to tensor\n * - flip: Reverse tensor along axes\n *\n * All operations maintain type safety and proper error handling.\n */\n\nimport type { Axis, TypedArray } from \"../../core\";\nimport {\n DeepboxError,\n DTypeError,\n dtypeToTypedArrayCtor,\n getBigIntElement,\n getNumericElement,\n InvalidParameterError,\n normalizeAxis,\n ShapeError,\n shapeToSize,\n} from \"../../core\";\nimport { isContiguous, offsetFromFlatIndex } from \"../tensor/strides\";\nimport { computeStrides, Tensor } from \"../tensor/Tensor\";\n\n/**\n * Concatenate tensors along an existing axis.\n *\n * All tensors must have the same shape except in the concatenation dimension.\n * The output dtype is determined by the first tensor.\n *\n * **Complexity**: O(n) where n is total number of elements\n *\n * @param tensors - Array of tensors to concatenate\n * @param axis - Axis along which to concatenate (default: 0)\n * @returns Concatenated tensor\n *\n * @example\n * ```ts\n * const a = tensor([[1, 2], [3, 4]]);\n * const b = tensor([[5, 6]]);\n * const c = concatenate([a, b], 0); // [[1, 2], [3, 4], [5, 6]]\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.concatenate.html | NumPy concatenate}\n */\nexport function concatenate(tensors: Tensor[], axis: Axis = 0): Tensor {\n // Validate input: need at least one tensor\n if (tensors.length === 0) {\n throw new InvalidParameterError(\"concatenate requires at least one tensor\", \"tensors\");\n }\n\n // Single tensor: return copy\n if (tensors.length === 1) {\n const t = tensors[0];\n if (!t) throw new DeepboxError(\"Unexpected: tensor at index 0 is undefined\");\n if (t.dtype === \"string\") {\n const data = t.data;\n if (!Array.isArray(data)) throw new DeepboxError(\"Internal error: expected string array\");\n return Tensor.fromStringArray({\n data: [...data],\n shape: t.shape,\n device: t.device,\n });\n }\n const data = t.data;\n if (Array.isArray(data)) throw new DeepboxError(\"Internal error: expected typed array\");\n return Tensor.fromTypedArray({\n data: data.slice(),\n shape: t.shape,\n dtype: t.dtype,\n device: t.device,\n });\n }\n\n // Get reference tensor for validation\n const first = tensors[0];\n if (!first) throw new DeepboxError(\"Unexpected: first tensor is undefined\");\n const ndim = first.ndim;\n const dtype = first.dtype;\n\n // Normalize axis to positive index\n const ax = normalizeAxis(axis, ndim);\n\n // Validate all tensors have same ndim and dtype\n for (let i = 1; i < tensors.length; i++) {\n const t = tensors[i];\n if (!t) throw new DeepboxError(`Unexpected: tensor at index ${i} is undefined`);\n if (t.ndim !== ndim) {\n throw new ShapeError(`All tensors must have same ndim; got ${ndim} and ${t.ndim}`);\n }\n if (t.dtype !== dtype) {\n throw new DTypeError(`All tensors must have same dtype; got ${dtype} and ${t.dtype}`);\n }\n }\n\n // Validate shapes match except on concatenation axis\n for (let i = 1; i < tensors.length; i++) {\n const t = tensors[i];\n if (!t) throw new DeepboxError(`Unexpected: tensor at index ${i} is undefined`);\n for (let d = 0; d < ndim; d++) {\n if (d !== ax && first.shape[d] !== t.shape[d]) {\n throw ShapeError.mismatch(\n first.shape,\n t.shape,\n `concatenate: shapes must match except on axis ${axis}`\n );\n }\n }\n }\n\n // Calculate output shape: sum along concatenation axis\n const outShape = [...first.shape];\n let totalAlongAxis = first.shape[ax] ?? 0;\n for (let i = 1; i < tensors.length; i++) {\n const t = tensors[i];\n if (!t) throw new DeepboxError(`Unexpected: tensor at index ${i} is undefined`);\n totalAlongAxis += t.shape[ax] ?? 0;\n }\n outShape[ax] = totalAlongAxis;\n\n // Allocate output buffer\n const outSize = shapeToSize(outShape);\n const isString = dtype === \"string\";\n const outData = isString\n ? new Array<string>(outSize)\n : new (dtypeToTypedArrayCtor(dtype))(outSize);\n\n // Compute output strides for efficient indexing\n const outStrides = computeStrides(outShape);\n\n // Copy data from each tensor\n let offsetAlongAxis = 0;\n\n // Prepare output buffers\n let stringOut: string[] | undefined;\n let bigIntOut: BigInt64Array | undefined;\n let numericOut: Exclude<TypedArray, BigInt64Array> | undefined;\n\n if (Array.isArray(outData)) {\n stringOut = outData;\n } else if (outData instanceof BigInt64Array) {\n bigIntOut = outData;\n } else {\n numericOut = outData;\n }\n\n for (const tensor of tensors) {\n const t = tensor;\n if (!t) throw new DeepboxError(\"Unexpected: tensor is undefined\");\n const tSize = t.size;\n const tLogicalStrides = computeStrides(t.shape);\n\n // Prepare source buffers\n let stringSrc: readonly string[] | undefined;\n let numericSrc: Exclude<TypedArray, BigInt64Array> | undefined;\n\n if (Array.isArray(t.data)) {\n stringSrc = t.data;\n } else if (!(t.data instanceof BigInt64Array)) {\n numericSrc = t.data;\n }\n\n // Iterate through all elements in current tensor\n for (let flatIdx = 0; flatIdx < tSize; flatIdx++) {\n // Convert flat index to coordinates in source tensor\n let rem = flatIdx;\n const coords = new Array<number>(ndim);\n for (let d = 0; d < ndim; d++) {\n const stride = tLogicalStrides[d] ?? 1;\n coords[d] = Math.floor(rem / stride);\n rem -= (coords[d] ?? 0) * stride;\n }\n\n // Compute source offset using actual strides\n let srcOffset = t.offset;\n for (let d = 0; d < ndim; d++) {\n srcOffset += (coords[d] ?? 0) * (t.strides[d] ?? 0);\n }\n\n // Adjust coordinate along concatenation axis\n coords[ax] = (coords[ax] ?? 0) + offsetAlongAxis;\n\n // Convert coordinates to flat index in output\n let outIdx = 0;\n for (let d = 0; d < ndim; d++) {\n outIdx += (coords[d] ?? 0) * (outStrides[d] ?? 1);\n }\n\n // Copy element\n if (stringOut && stringSrc) {\n stringOut[outIdx] = stringSrc[srcOffset] ?? \"\";\n } else if (bigIntOut && t.data instanceof BigInt64Array) {\n bigIntOut[outIdx] = getBigIntElement(t.data, srcOffset);\n } else if (numericOut && numericSrc) {\n numericOut[outIdx] = getNumericElement(numericSrc, srcOffset);\n }\n }\n\n // Update offset for next tensor\n offsetAlongAxis += t.shape[ax] ?? 0;\n }\n\n if (Array.isArray(outData)) {\n return Tensor.fromStringArray({\n data: outData,\n shape: outShape,\n device: first.device,\n });\n }\n\n if (dtype === \"string\") {\n throw new DeepboxError(\"Internal error: string dtype but non-array data\");\n }\n\n return Tensor.fromTypedArray({\n data: outData,\n shape: outShape,\n dtype,\n device: first.device,\n });\n}\n\n/**\n * Stack tensors along a new axis.\n *\n * All tensors must have exactly the same shape.\n * Creates a new dimension at the specified axis.\n *\n * **Complexity**: O(n) where n is total number of elements\n *\n * @param tensors - Array of tensors to stack\n * @param axis - Axis along which to stack (default: 0)\n * @returns Stacked tensor\n *\n * @example\n * ```ts\n * const a = tensor([1, 2, 3]);\n * const b = tensor([4, 5, 6]);\n * const c = stack([a, b], 0); // [[1, 2, 3], [4, 5, 6]]\n * const d = stack([a, b], 1); // [[1, 4], [2, 5], [3, 6]]\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.stack.html | NumPy stack}\n */\nexport function stack(tensors: Tensor[], axis: Axis = 0): Tensor {\n // Validate input\n if (tensors.length === 0) {\n throw new InvalidParameterError(\"stack requires at least one tensor\", \"tensors\");\n }\n\n const first = tensors[0];\n if (!first) {\n throw new DeepboxError(\"Unexpected: first tensor is undefined\");\n }\n const ndim = first.ndim;\n const dtype = first.dtype;\n\n // Normalize axis: can be from -ndim-1 to ndim (inclusive)\n // We use ndim + 1 because the output tensor has one more dimension\n const ax = normalizeAxis(axis, ndim + 1);\n\n // Validate all tensors have identical shape and dtype\n for (let i = 1; i < tensors.length; i++) {\n const t = tensors[i];\n if (!t) throw new DeepboxError(`Unexpected: tensor at index ${i} is undefined`);\n if (t.ndim !== ndim) {\n throw new ShapeError(`All tensors must have same ndim; got ${ndim} and ${t.ndim}`);\n }\n if (t.dtype !== dtype) {\n throw new DTypeError(`All tensors must have same dtype; got ${dtype} and ${t.dtype}`);\n }\n for (let d = 0; d < ndim; d++) {\n if (first.shape[d] !== t.shape[d]) {\n throw ShapeError.mismatch(first.shape, t.shape, \"stack: all tensors must have same shape\");\n }\n }\n }\n\n // Build output shape: insert new dimension at axis\n const outShape: number[] = [];\n for (let d = 0; d < ax; d++) {\n outShape.push(first.shape[d] ?? 0);\n }\n outShape.push(tensors.length); // New dimension with size = number of tensors\n for (let d = ax; d < ndim; d++) {\n outShape.push(first.shape[d] ?? 0);\n }\n\n // Allocate output buffer\n const outSize = shapeToSize(outShape);\n const isString = dtype === \"string\";\n const outData = isString\n ? new Array<string>(outSize)\n : new (dtypeToTypedArrayCtor(dtype))(outSize);\n\n // Compute strides\n const outStrides = computeStrides(outShape);\n const elemSize = first.size;\n\n // Prepare output buffers\n let stringOut: string[] | undefined;\n let bigIntOut: BigInt64Array | undefined;\n let numericOut: Exclude<TypedArray, BigInt64Array> | undefined;\n\n if (Array.isArray(outData)) {\n stringOut = outData;\n } else if (outData instanceof BigInt64Array) {\n bigIntOut = outData;\n } else {\n numericOut = outData;\n }\n\n // Copy each tensor into the output\n for (let tensorIdx = 0; tensorIdx < tensors.length; tensorIdx++) {\n const t = tensors[tensorIdx];\n if (!t) throw new DeepboxError(`Unexpected: tensor at index ${tensorIdx} is undefined`);\n\n const tLogicalStrides = computeStrides(t.shape);\n\n let stringSrc: readonly string[] | undefined;\n let numericSrc: Exclude<TypedArray, BigInt64Array> | undefined;\n if (Array.isArray(t.data)) {\n stringSrc = t.data;\n } else if (!(t.data instanceof BigInt64Array)) {\n numericSrc = t.data;\n }\n\n // Iterate through all elements in current tensor\n for (let flatIdx = 0; flatIdx < elemSize; flatIdx++) {\n // Convert flat index to coordinates in source tensor\n let rem = flatIdx;\n const srcCoords = new Array<number>(ndim);\n for (let d = 0; d < ndim; d++) {\n const stride = tLogicalStrides[d] ?? 1;\n srcCoords[d] = Math.floor(rem / stride);\n rem -= (srcCoords[d] ?? 0) * stride;\n }\n\n // Compute source offset using actual strides\n let srcOffset = t.offset;\n for (let d = 0; d < ndim; d++) {\n srcOffset += (srcCoords[d] ?? 0) * (t.strides[d] ?? 0);\n }\n\n // Convert to flat index in output (insert tensorIdx at axis)\n let outIdx = 0;\n for (let d = 0; d < ax; d++) {\n outIdx += (srcCoords[d] ?? 0) * (outStrides[d] ?? 1);\n }\n outIdx += tensorIdx * (outStrides[ax] ?? 1);\n for (let d = ax; d < ndim; d++) {\n outIdx += (srcCoords[d] ?? 0) * (outStrides[d + 1] ?? 1);\n }\n\n // Copy element\n if (stringOut && stringSrc) {\n stringOut[outIdx] = stringSrc[srcOffset] ?? \"\";\n } else if (bigIntOut && t.data instanceof BigInt64Array) {\n bigIntOut[outIdx] = getBigIntElement(t.data, srcOffset);\n } else if (numericOut && numericSrc) {\n numericOut[outIdx] = getNumericElement(numericSrc, srcOffset);\n }\n }\n }\n\n if (Array.isArray(outData)) {\n return Tensor.fromStringArray({\n data: outData,\n shape: outShape,\n device: first.device,\n });\n }\n\n if (dtype === \"string\") {\n throw new DeepboxError(\"Internal error: string dtype but non-array data\");\n }\n\n return Tensor.fromTypedArray({\n data: outData,\n shape: outShape,\n dtype,\n device: first.device,\n });\n}\n\n/**\n * Split tensor into multiple sub-tensors along an axis.\n *\n * If indices_or_sections is an integer, the tensor is split into that many\n * equal parts (axis dimension must be divisible).\n * If it's an array, it specifies the indices where to split.\n *\n * **Complexity**: O(n) where n is total number of elements\n *\n * @param t - Input tensor\n * @param indices_or_sections - Number of sections or array of split indices\n * @param axis - Axis along which to split (default: 0)\n * @returns Array of sub-tensors\n *\n * @example\n * ```ts\n * const t = tensor([1, 2, 3, 4, 5, 6]);\n * const parts = split(t, 3); // [tensor([1, 2]), tensor([3, 4]), tensor([5, 6])]\n * const parts2 = split(t, [2, 4]); // [tensor([1, 2]), tensor([3, 4]), tensor([5, 6])]\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.split.html | NumPy split}\n */\nexport function split(t: Tensor, indices_or_sections: number | number[], axis: Axis = 0): Tensor[] {\n // Normalize axis\n const ax = normalizeAxis(axis, t.ndim);\n\n const axisSize = t.shape[ax] ?? 0;\n\n // Determine split points\n let splitPoints: number[];\n if (typeof indices_or_sections === \"number\") {\n // Equal splits\n const numSections = indices_or_sections;\n if (!Number.isInteger(numSections) || numSections <= 0) {\n throw new InvalidParameterError(\n `indices_or_sections must be a positive integer; received ${numSections}`,\n \"indices_or_sections\",\n numSections\n );\n }\n if (axisSize % numSections !== 0) {\n throw new InvalidParameterError(\n `axis dimension ${axisSize} not divisible by ${numSections} equal sections`,\n \"indices_or_sections\",\n numSections\n );\n }\n const sectionSize = axisSize / numSections;\n splitPoints = [];\n for (let i = 1; i < numSections; i++) {\n splitPoints.push(i * sectionSize);\n }\n } else {\n // Split at specified indices\n splitPoints = [...indices_or_sections];\n let prev = 0;\n for (let i = 0; i < splitPoints.length; i++) {\n const idx = splitPoints[i];\n if (idx === undefined || !Number.isInteger(idx)) {\n throw new InvalidParameterError(\n `split index must be an integer; received ${String(idx)}`,\n \"indices_or_sections\",\n indices_or_sections\n );\n }\n if (idx < 0 || idx > axisSize) {\n throw new InvalidParameterError(\n `split index ${idx} is out of bounds for axis size ${axisSize}`,\n \"indices_or_sections\",\n indices_or_sections\n );\n }\n if (i > 0 && idx < prev) {\n throw new InvalidParameterError(\n \"split indices must be non-decreasing\",\n \"indices_or_sections\",\n indices_or_sections\n );\n }\n prev = idx;\n }\n }\n\n // Add boundaries\n const boundaries = [0, ...splitPoints, axisSize];\n\n // Prepare source buffers\n let stringSrc: readonly string[] | undefined;\n let numericSrc: Exclude<TypedArray, BigInt64Array> | undefined;\n if (Array.isArray(t.data)) {\n stringSrc = t.data;\n } else if (!(t.data instanceof BigInt64Array)) {\n numericSrc = t.data;\n }\n\n // Create sub-tensors\n const result: Tensor[] = [];\n for (let i = 0; i < boundaries.length - 1; i++) {\n const start = boundaries[i] ?? 0;\n const end = boundaries[i + 1] ?? axisSize;\n const size = end - start;\n\n // Build shape for this sub-tensor\n const subShape = [...t.shape];\n subShape[ax] = size;\n\n // Allocate buffer\n const subSize = shapeToSize(subShape);\n const isString = t.dtype === \"string\";\n const subData = isString\n ? new Array<string>(subSize)\n : new (dtypeToTypedArrayCtor(t.dtype))(subSize);\n\n // Prepare output buffers\n let stringOut: string[] | undefined;\n let bigIntOut: BigInt64Array | undefined;\n let numericOut: Exclude<TypedArray, BigInt64Array> | undefined;\n\n if (Array.isArray(subData)) {\n stringOut = subData;\n } else if (subData instanceof BigInt64Array) {\n bigIntOut = subData;\n } else {\n numericOut = subData;\n }\n\n // Copy elements\n const subStrides = computeStrides(subShape);\n\n for (let flatIdx = 0; flatIdx < subSize; flatIdx++) {\n // Convert flat index to coordinates in sub-tensor\n let rem = flatIdx;\n const coords = new Array<number>(t.ndim);\n for (let d = 0; d < t.ndim; d++) {\n const stride = subStrides[d] ?? 1;\n coords[d] = Math.floor(rem / stride);\n rem -= (coords[d] ?? 0) * stride;\n }\n\n // Adjust coordinate along split axis\n coords[ax] = (coords[ax] ?? 0) + start;\n\n // Convert to flat index in source tensor\n let srcIdx = t.offset;\n for (let d = 0; d < t.ndim; d++) {\n srcIdx += (coords[d] ?? 0) * (t.strides[d] ?? 0);\n }\n\n // Copy element\n if (stringOut && stringSrc) {\n stringOut[flatIdx] = stringSrc[srcIdx] ?? \"\";\n } else if (bigIntOut && t.data instanceof BigInt64Array) {\n bigIntOut[flatIdx] = getBigIntElement(t.data, srcIdx);\n } else if (numericOut && numericSrc) {\n numericOut[flatIdx] = getNumericElement(numericSrc, srcIdx);\n }\n }\n\n if (Array.isArray(subData)) {\n result.push(\n Tensor.fromStringArray({\n data: subData,\n shape: subShape,\n device: t.device,\n })\n );\n } else {\n if (t.dtype === \"string\") {\n throw new DeepboxError(\"Internal error: string dtype but non-array data\");\n }\n result.push(\n Tensor.fromTypedArray({\n data: subData,\n shape: subShape,\n dtype: t.dtype,\n device: t.device,\n })\n );\n }\n }\n\n return result;\n}\n\n/**\n * Repeat tensor along axes by tiling.\n *\n * Constructs a tensor by repeating the input tensor the specified number\n * of times along each axis.\n *\n * **Complexity**: O(n * product(reps)) where n is input size\n *\n * @param t - Input tensor\n * @param reps - Number of repetitions along each axis\n * @returns Tiled tensor\n *\n * @example\n * ```ts\n * const t = tensor([[1, 2], [3, 4]]);\n * const tiled = tile(t, [2, 3]);\n * // [[1, 2, 1, 2, 1, 2],\n * // [3, 4, 3, 4, 3, 4],\n * // [1, 2, 1, 2, 1, 2],\n * // [3, 4, 3, 4, 3, 4]]\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.tile.html | NumPy tile}\n */\nexport function tile(t: Tensor, reps: number[]): Tensor {\n // Validate reps\n if (reps.length === 0) {\n throw new InvalidParameterError(\"reps must have at least one element\", \"reps\");\n }\n for (let i = 0; i < reps.length; i++) {\n const rep = reps[i];\n if (rep === undefined || !Number.isInteger(rep) || rep < 0) {\n throw new InvalidParameterError(\n `reps[${i}] must be a non-negative integer; received ${String(rep)}`,\n \"reps\",\n reps\n );\n }\n }\n\n // Adjust dimensions if needed\n const ndim = Math.max(t.ndim, reps.length);\n const inShape = new Array<number>(ndim).fill(1);\n const repCounts = new Array<number>(ndim).fill(1);\n\n // Fill from the right (trailing dimensions)\n for (let i = 0; i < t.ndim; i++) {\n inShape[ndim - t.ndim + i] = t.shape[i] ?? 1;\n }\n for (let i = 0; i < reps.length; i++) {\n repCounts[ndim - reps.length + i] = reps[i] ?? 1;\n }\n\n // Calculate output shape\n const outShape = inShape.map((s, i) => s * (repCounts[i] ?? 1));\n\n // Allocate output\n const outSize = shapeToSize(outShape);\n const outData =\n t.dtype === \"string\"\n ? new Array<string>(outSize)\n : new (dtypeToTypedArrayCtor(t.dtype))(outSize);\n\n // Compute strides\n const outStrides = computeStrides(outShape);\n\n // Prepare buffers\n let stringOut: string[] | undefined;\n let bigIntOut: BigInt64Array | undefined;\n let numericOut: Exclude<TypedArray, BigInt64Array> | undefined;\n\n if (Array.isArray(outData)) {\n stringOut = outData;\n } else if (outData instanceof BigInt64Array) {\n bigIntOut = outData;\n } else {\n numericOut = outData;\n }\n\n let stringSrc: readonly string[] | undefined;\n let numericSrc: Exclude<TypedArray, BigInt64Array> | undefined;\n if (Array.isArray(t.data)) {\n stringSrc = t.data;\n } else if (!(t.data instanceof BigInt64Array)) {\n numericSrc = t.data;\n }\n\n // Fill output by repeating input\n for (let flatIdx = 0; flatIdx < outSize; flatIdx++) {\n // Convert flat index to coordinates in output\n let rem = flatIdx;\n const outCoords = new Array<number>(ndim);\n for (let d = 0; d < ndim; d++) {\n const stride = outStrides[d] ?? 1;\n outCoords[d] = Math.floor(rem / stride);\n rem -= (outCoords[d] ?? 0) * stride;\n }\n\n // Map to input coordinates using modulo\n const inCoords = outCoords.map((c, i) => c % (inShape[i] ?? 1));\n\n // Convert to flat index in input (accounting for original shape)\n let srcIdx = t.offset;\n for (let d = 0; d < t.ndim; d++) {\n const inCoord = inCoords[ndim - t.ndim + d] ?? 0;\n srcIdx += inCoord * (t.strides[d] ?? 0);\n }\n\n // Copy element\n if (stringOut && stringSrc) {\n stringOut[flatIdx] = stringSrc[srcIdx] ?? \"\";\n } else if (bigIntOut && t.data instanceof BigInt64Array) {\n bigIntOut[flatIdx] = getBigIntElement(t.data, srcIdx);\n } else if (numericOut && numericSrc) {\n numericOut[flatIdx] = getNumericElement(numericSrc, srcIdx);\n }\n }\n\n if (Array.isArray(outData)) {\n return Tensor.fromStringArray({\n data: outData,\n shape: outShape,\n device: t.device,\n });\n }\n\n if (t.dtype === \"string\") {\n throw new DeepboxError(\"Internal error: string dtype but non-array data\");\n }\n\n return Tensor.fromTypedArray({\n data: outData,\n shape: outShape,\n dtype: t.dtype,\n device: t.device,\n });\n}\n\n/**\n * Repeat elements of a tensor along an axis.\n *\n * Each element is repeated the specified number of times.\n *\n * **Complexity**: O(n * repeats) where n is input size\n *\n * @param t - Input tensor\n * @param repeats - Number of times to repeat each element\n * @param axis - Axis along which to repeat (default: flatten first)\n * @returns Tensor with repeated elements\n *\n * @example\n * ```ts\n * const t = tensor([1, 2, 3]);\n * const r = repeat(t, 2); // [1, 1, 2, 2, 3, 3]\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.repeat.html | NumPy repeat}\n */\nexport function repeat(t: Tensor, repeats: number, axis?: Axis): Tensor {\n if (!Number.isInteger(repeats) || repeats < 0) {\n throw new InvalidParameterError(\n `repeats must be a non-negative integer; received ${repeats}`,\n \"repeats\",\n repeats\n );\n }\n // If no axis specified, flatten and repeat\n if (axis === undefined) {\n const flatSize = t.size * repeats;\n const outData =\n t.dtype === \"string\"\n ? new Array<string>(flatSize)\n : new (dtypeToTypedArrayCtor(t.dtype))(flatSize);\n\n // Copy each element 'repeats' times\n const logicalStrides = computeStrides(t.shape);\n const contiguous = isContiguous(t.shape, t.strides);\n let outIdx = 0;\n\n // Prepare buffers\n let stringOut: string[] | undefined;\n let bigIntOut: BigInt64Array | undefined;\n let numericOut: Exclude<TypedArray, BigInt64Array> | undefined;\n\n if (Array.isArray(outData)) {\n stringOut = outData;\n } else if (outData instanceof BigInt64Array) {\n bigIntOut = outData;\n } else {\n numericOut = outData;\n }\n\n let stringSrc: readonly string[] | undefined;\n let numericSrc: Exclude<TypedArray, BigInt64Array> | undefined;\n if (Array.isArray(t.data)) {\n stringSrc = t.data;\n } else if (!(t.data instanceof BigInt64Array)) {\n numericSrc = t.data;\n }\n\n for (let i = 0; i < t.size; i++) {\n const srcIdx = contiguous\n ? t.offset + i\n : offsetFromFlatIndex(i, logicalStrides, t.strides, t.offset);\n for (let r = 0; r < repeats; r++) {\n if (stringOut && stringSrc) {\n stringOut[outIdx++] = stringSrc[srcIdx] ?? \"\";\n } else if (bigIntOut && t.data instanceof BigInt64Array) {\n bigIntOut[outIdx++] = getBigIntElement(t.data, srcIdx);\n } else if (numericOut && numericSrc) {\n numericOut[outIdx++] = getNumericElement(numericSrc, srcIdx);\n }\n }\n }\n\n if (Array.isArray(outData)) {\n return Tensor.fromStringArray({\n data: outData,\n shape: [flatSize],\n device: t.device,\n });\n }\n\n if (t.dtype === \"string\") {\n throw new DeepboxError(\"Internal error: string dtype but non-array data\");\n }\n\n return Tensor.fromTypedArray({\n data: outData,\n shape: [flatSize],\n dtype: t.dtype,\n device: t.device,\n });\n }\n\n // Repeat along specified axis\n const ax = normalizeAxis(axis, t.ndim);\n\n // Calculate output shape\n const outShape = [...t.shape];\n outShape[ax] = (t.shape[ax] ?? 0) * repeats;\n\n // Allocate output\n const outSize = shapeToSize(outShape);\n const outData =\n t.dtype === \"string\"\n ? new Array<string>(outSize)\n : new (dtypeToTypedArrayCtor(t.dtype))(outSize);\n\n // Compute strides\n const outStrides = computeStrides(outShape);\n\n // Prepare buffers\n let stringOut: string[] | undefined;\n let bigIntOut: BigInt64Array | undefined;\n let numericOut: Exclude<TypedArray, BigInt64Array> | undefined;\n\n if (Array.isArray(outData)) {\n stringOut = outData;\n } else if (outData instanceof BigInt64Array) {\n bigIntOut = outData;\n } else {\n numericOut = outData;\n }\n\n let stringSrc: readonly string[] | undefined;\n let numericSrc: Exclude<TypedArray, BigInt64Array> | undefined;\n if (Array.isArray(t.data)) {\n stringSrc = t.data;\n } else if (!(t.data instanceof BigInt64Array)) {\n numericSrc = t.data;\n }\n\n // Fill output\n for (let flatIdx = 0; flatIdx < outSize; flatIdx++) {\n // Convert to coordinates in output\n let rem = flatIdx;\n const outCoords = new Array<number>(t.ndim);\n for (let d = 0; d < t.ndim; d++) {\n const stride = outStrides[d] ?? 1;\n outCoords[d] = Math.floor(rem / stride);\n rem -= (outCoords[d] ?? 0) * stride;\n }\n\n // Map to input coordinates: divide by repeats on the repeat axis\n const inCoords = [...outCoords];\n inCoords[ax] = Math.floor((outCoords[ax] ?? 0) / repeats);\n\n // Convert to flat index in input\n let srcIdx = t.offset;\n for (let d = 0; d < t.ndim; d++) {\n srcIdx += (inCoords[d] ?? 0) * (t.strides[d] ?? 0);\n }\n\n // Copy element\n if (stringOut && stringSrc) {\n stringOut[flatIdx] = stringSrc[srcIdx] ?? \"\";\n } else if (bigIntOut && t.data instanceof BigInt64Array) {\n bigIntOut[flatIdx] = getBigIntElement(t.data, srcIdx);\n } else if (numericOut && numericSrc) {\n numericOut[flatIdx] = getNumericElement(numericSrc, srcIdx);\n }\n }\n\n if (Array.isArray(outData)) {\n return Tensor.fromStringArray({\n data: outData,\n shape: outShape,\n device: t.device,\n });\n }\n\n if (t.dtype === \"string\") {\n throw new DeepboxError(\"Internal error: string dtype but non-array data\");\n }\n\n return Tensor.fromTypedArray({\n data: outData,\n shape: outShape,\n dtype: t.dtype,\n device: t.device,\n });\n}\n","import {\n type Axis,\n DTypeError,\n dtypeToTypedArrayCtor,\n getBigIntElement,\n getNumericElement,\n normalizeAxis,\n} from \"../../core\";\nimport { computeStrides, Tensor } from \"../tensor/Tensor\";\n\n/**\n * Compute the physical buffer offset for a multi-dimensional coordinate.\n */\nfunction physicalOffset(coord: number[], strides: readonly number[], offset: number): number {\n let out = offset;\n for (let i = 0; i < coord.length; i++) {\n out += (coord[i] ?? 0) * (strides[i] ?? 0);\n }\n return out;\n}\n\n/**\n * Iterate over all \"outer\" coordinate tuples — every combination of indices\n * for all dimensions *except* the sort axis. For each tuple we yield a\n * coordinate array whose `axis` element is 0 (caller will vary it).\n */\nfunction* outerCoords(shape: readonly number[], axis: number): Generator<number[]> {\n const rank = shape.length;\n if (rank === 0) {\n yield [];\n return;\n }\n // Build the list of dims to iterate (everything except axis)\n const outerDims: number[] = [];\n for (let d = 0; d < rank; d++) {\n if (d !== axis) outerDims.push(d);\n }\n\n const total = outerDims.reduce((n, d) => n * (shape[d] ?? 1), 1);\n const coord = new Array<number>(rank).fill(0);\n\n for (let flat = 0; flat < total; flat++) {\n // Unravel `flat` into outer coordinates\n let rem = flat;\n for (let i = outerDims.length - 1; i >= 0; i--) {\n const d = outerDims[i] ?? 0;\n const dim = shape[d] ?? 1;\n coord[d] = rem % dim;\n rem = Math.floor(rem / dim);\n }\n coord[axis] = 0;\n yield coord;\n }\n}\n\n/**\n * Sort values along a given axis.\n *\n * Supports tensors of any dimensionality. Default axis is -1 (last).\n *\n * Performance:\n * - O(N log N) where N is the total number of elements.\n */\nexport function sort(t: Tensor, axis: Axis | undefined = -1, descending = false): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"sort is not implemented for string dtype\");\n }\n\n const ax = normalizeAxis(axis ?? -1, t.ndim);\n const axisLen = t.shape[ax] ?? 1;\n const logicalStrides = computeStrides(t.shape);\n\n const Ctor = dtypeToTypedArrayCtor(t.dtype);\n const out = new Ctor(t.size);\n\n if (t.data instanceof BigInt64Array) {\n const bigintData = t.data;\n const slice = new Array<bigint>(axisLen);\n\n for (const baseCoord of outerCoords(t.shape, ax)) {\n // Extract 1D slice along axis\n for (let k = 0; k < axisLen; k++) {\n baseCoord[ax] = k;\n const off = physicalOffset(baseCoord, t.strides, t.offset);\n slice[k] = getBigIntElement(bigintData, off);\n }\n slice.sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n if (descending) slice.reverse();\n\n // Write back\n if (!(out instanceof BigInt64Array)) break; // type guard\n for (let k = 0; k < axisLen; k++) {\n baseCoord[ax] = k;\n const outFlat = flatFromCoord(baseCoord, logicalStrides);\n out[outFlat] = slice[k] ?? 0n;\n }\n }\n } else {\n const numericData = t.data;\n if (Array.isArray(numericData)) {\n throw new DTypeError(\"sort is not implemented for string dtype\");\n }\n const slice = new Array<number>(axisLen);\n\n for (const baseCoord of outerCoords(t.shape, ax)) {\n for (let k = 0; k < axisLen; k++) {\n baseCoord[ax] = k;\n const off = physicalOffset(baseCoord, t.strides, t.offset);\n slice[k] = getNumericElement(numericData, off);\n }\n slice.sort((a, b) => a - b);\n if (descending) slice.reverse();\n\n if (out instanceof BigInt64Array) break; // type guard\n for (let k = 0; k < axisLen; k++) {\n baseCoord[ax] = k;\n const outFlat = flatFromCoord(baseCoord, logicalStrides);\n out[outFlat] = slice[k] ?? 0;\n }\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: t.dtype,\n device: t.device,\n });\n}\n\n/**\n * Return indices that would sort the tensor along a given axis.\n *\n * Supports tensors of any dimensionality. Default axis is -1 (last).\n *\n * Performance:\n * - O(N log N) where N is the total number of elements.\n */\nexport function argsort(t: Tensor, axis: Axis | undefined = -1, descending = false): Tensor {\n if (t.dtype === \"string\") {\n throw new DTypeError(\"argsort is not implemented for string dtype\");\n }\n\n const ax = normalizeAxis(axis ?? -1, t.ndim);\n const axisLen = t.shape[ax] ?? 1;\n const logicalStrides = computeStrides(t.shape);\n\n const out = new Int32Array(t.size);\n const idxBuf = Array.from({ length: axisLen }, (_, i) => i);\n\n if (t.data instanceof BigInt64Array) {\n const bigintData = t.data;\n const vals = new Array<bigint>(axisLen);\n\n for (const baseCoord of outerCoords(t.shape, ax)) {\n for (let k = 0; k < axisLen; k++) {\n baseCoord[ax] = k;\n const off = physicalOffset(baseCoord, t.strides, t.offset);\n vals[k] = getBigIntElement(bigintData, off);\n }\n // Reset indices\n for (let k = 0; k < axisLen; k++) idxBuf[k] = k;\n idxBuf.sort((a, b) => {\n const va = vals[a] ?? 0n,\n vb = vals[b] ?? 0n;\n return va < vb ? -1 : va > vb ? 1 : 0;\n });\n if (descending) idxBuf.reverse();\n\n for (let k = 0; k < axisLen; k++) {\n baseCoord[ax] = k;\n const outFlat = flatFromCoord(baseCoord, logicalStrides);\n out[outFlat] = idxBuf[k] ?? 0;\n }\n }\n } else {\n const numericData = t.data;\n if (Array.isArray(numericData)) {\n throw new DTypeError(\"argsort is not implemented for string dtype\");\n }\n const vals = new Array<number>(axisLen);\n\n for (const baseCoord of outerCoords(t.shape, ax)) {\n for (let k = 0; k < axisLen; k++) {\n baseCoord[ax] = k;\n const off = physicalOffset(baseCoord, t.strides, t.offset);\n vals[k] = getNumericElement(numericData, off);\n }\n for (let k = 0; k < axisLen; k++) idxBuf[k] = k;\n idxBuf.sort((a, b) => (vals[a] ?? 0) - (vals[b] ?? 0));\n if (descending) idxBuf.reverse();\n\n for (let k = 0; k < axisLen; k++) {\n baseCoord[ax] = k;\n const outFlat = flatFromCoord(baseCoord, logicalStrides);\n out[outFlat] = idxBuf[k] ?? 0;\n }\n }\n }\n\n return Tensor.fromTypedArray({\n data: out,\n shape: t.shape,\n dtype: \"int32\",\n device: t.device,\n });\n}\n\n/** Convert a coordinate array to a flat index using logical (row-major) strides. */\nfunction flatFromCoord(coord: number[], strides: readonly number[]): number {\n let flat = 0;\n for (let i = 0; i < coord.length; i++) {\n flat += (coord[i] ?? 0) * (strides[i] ?? 0);\n }\n return flat;\n}\n","import {\n getBigIntElement,\n getNumericElement,\n IndexError,\n type Shape,\n ShapeError,\n} from \"../../core\";\nimport { type Tensor, Tensor as TensorImpl } from \"../tensor/Tensor\";\n\nexport type CSRMatrixInit = {\n readonly data: Float64Array;\n readonly indices: Int32Array;\n readonly indptr: Int32Array;\n readonly shape: Shape;\n};\n\n/**\n * Compressed Sparse Row (CSR) matrix representation.\n *\n * CSR format stores a sparse matrix using three arrays:\n * - `data`: Non-zero values in row-major order\n * - `indices`: Column indices of non-zero values\n * - `indptr`: Row pointers (indptr[i] to indptr[i+1] gives the range of data/indices for row i)\n *\n * This format is efficient for:\n * - Row slicing\n * - Matrix-vector products\n * - Arithmetic operations\n *\n * @example\n * ```ts\n * import { CSRMatrix } from 'deepbox/ndarray';\n *\n * // Create a 3x3 sparse matrix with values at (0,0)=1, (1,2)=2, (2,1)=3\n * const sparse = CSRMatrix.fromCOO({\n * rows: 3, cols: 3,\n * rowIndices: new Int32Array([0, 1, 2]),\n * colIndices: new Int32Array([0, 2, 1]),\n * values: new Float64Array([1, 2, 3])\n * });\n *\n * // Convert to dense for operations\n * const dense = sparse.toDense();\n * ```\n *\n * @see {@link https://en.wikipedia.org/wiki/Sparse_matrix#Compressed_sparse_row_(CSR,_CRS_or_Yale_format) | Wikipedia: CSR}\n */\nexport class CSRMatrix {\n readonly data: Float64Array;\n readonly indices: Int32Array;\n readonly indptr: Int32Array;\n readonly shape: Shape;\n\n constructor(init: CSRMatrixInit) {\n const [rows, cols] = init.shape;\n if (rows === undefined || cols === undefined || init.shape.length !== 2) {\n throw new ShapeError(`CSRMatrix shape must be 2D; received [${init.shape}]`);\n }\n if (rows < 0 || cols < 0) {\n throw new ShapeError(`CSRMatrix shape must be non-negative; received [${init.shape}]`);\n }\n if (init.indptr.length !== rows + 1) {\n throw new ShapeError(\n `CSRMatrix indptr length must be rows+1 (${rows + 1}); received ${init.indptr.length}`\n );\n }\n if (init.data.length !== init.indices.length) {\n throw new ShapeError(\n `CSRMatrix data/indices length mismatch: ${init.data.length} vs ${init.indices.length}`\n );\n }\n if ((init.indptr[0] ?? 0) !== 0) {\n throw new ShapeError(\"CSRMatrix indptr[0] must be 0\");\n }\n const nnz = init.data.length;\n const lastPtr = init.indptr[rows] ?? 0;\n if (lastPtr !== nnz) {\n throw new ShapeError(\n `CSRMatrix indptr last value must equal nnz (${nnz}); received ${lastPtr}`\n );\n }\n let prevPtr = init.indptr[0] ?? 0;\n for (let i = 1; i < init.indptr.length; i++) {\n const ptr = init.indptr[i] ?? 0;\n if (ptr < prevPtr) {\n throw new ShapeError(\"CSRMatrix indptr must be non-decreasing\");\n }\n if (ptr < 0 || ptr > nnz) {\n throw new ShapeError(\n `CSRMatrix indptr entries must be between 0 and nnz (${nnz}); received ${ptr}`\n );\n }\n prevPtr = ptr;\n }\n for (let i = 0; i < init.indices.length; i++) {\n const col = init.indices[i] ?? 0;\n if (col < 0 || col >= cols) {\n throw new IndexError(`CSRMatrix column index ${col} is out of bounds`, {\n index: col,\n validRange: [0, cols === 0 ? -1 : cols - 1],\n });\n }\n }\n\n this.data = init.data;\n this.indices = init.indices;\n this.indptr = init.indptr;\n this.shape = init.shape;\n }\n\n /** Number of non-zero elements in the matrix */\n get nnz(): number {\n return this.data.length;\n }\n\n /** Number of rows in the matrix */\n get rows(): number {\n return this.shape[0] ?? 0;\n }\n\n /** Number of columns in the matrix */\n get cols(): number {\n return this.shape[1] ?? 0;\n }\n\n /**\n * Convert the sparse matrix to a dense Tensor.\n *\n * @returns Dense 2D Tensor representation\n *\n * @example\n * ```ts\n * const dense = sparse.toDense();\n * console.log(dense.shape); // [rows, cols]\n * ```\n */\n toDense(): Tensor {\n const rows = this.shape[0] ?? 0;\n const cols = this.shape[1] ?? 0;\n const out = new Float64Array(rows * cols);\n\n for (let r = 0; r < rows; r++) {\n const start = this.indptr[r] ?? 0;\n const end = this.indptr[r + 1] ?? start;\n for (let p = start; p < end; p++) {\n const c = this.indices[p] ?? 0;\n out[r * cols + c] = this.data[p] ?? 0;\n }\n }\n\n return TensorImpl.fromTypedArray({\n data: out,\n shape: [rows, cols],\n dtype: \"float64\",\n device: \"cpu\",\n });\n }\n\n /**\n * Add two sparse matrices element-wise.\n *\n * Both matrices must have the same shape.\n *\n * @param other - Matrix to add\n * @returns New CSRMatrix containing the sum\n * @throws {ShapeError} If shapes don't match\n *\n * @example\n * ```ts\n * const c = a.add(b); // c = a + b\n * ```\n */\n add(other: CSRMatrix): CSRMatrix {\n if (this.rows !== other.rows || this.cols !== other.cols) {\n throw new ShapeError(`Cannot add matrices with shapes [${this.shape}] and [${other.shape}]`);\n }\n\n // Use a map-based approach to handle overlapping indices\n const resultData: number[] = [];\n const resultIndices: number[] = [];\n const resultIndptr: number[] = [0];\n\n for (let r = 0; r < this.rows; r++) {\n // Collect values from both matrices for this row\n const rowValues = new Map<number, number>();\n\n // Add values from this matrix\n const thisStart = this.indptr[r] ?? 0;\n const thisEnd = this.indptr[r + 1] ?? thisStart;\n for (let p = thisStart; p < thisEnd; p++) {\n const c = this.indices[p] ?? 0;\n const v = this.data[p] ?? 0;\n rowValues.set(c, (rowValues.get(c) ?? 0) + v);\n }\n\n // Add values from other matrix\n const otherStart = other.indptr[r] ?? 0;\n const otherEnd = other.indptr[r + 1] ?? otherStart;\n for (let p = otherStart; p < otherEnd; p++) {\n const c = other.indices[p] ?? 0;\n const v = other.data[p] ?? 0;\n rowValues.set(c, (rowValues.get(c) ?? 0) + v);\n }\n\n // Sort by column index and add non-zero values\n const sortedCols = Array.from(rowValues.keys()).sort((a, b) => a - b);\n for (const c of sortedCols) {\n const v = rowValues.get(c) ?? 0;\n if (v !== 0) {\n resultIndices.push(c);\n resultData.push(v);\n }\n }\n resultIndptr.push(resultData.length);\n }\n\n return new CSRMatrix({\n data: new Float64Array(resultData),\n indices: new Int32Array(resultIndices),\n indptr: new Int32Array(resultIndptr),\n shape: this.shape,\n });\n }\n\n /**\n * Subtract another sparse matrix element-wise.\n *\n * Both matrices must have the same shape.\n *\n * @param other - Matrix to subtract\n * @returns New CSRMatrix containing the difference\n * @throws {ShapeError} If shapes don't match\n *\n * @example\n * ```ts\n * const c = a.sub(b); // c = a - b\n * ```\n */\n sub(other: CSRMatrix): CSRMatrix {\n if (this.rows !== other.rows || this.cols !== other.cols) {\n throw new ShapeError(\n `Cannot subtract matrices with shapes [${this.shape}] and [${other.shape}]`\n );\n }\n\n // Use a map-based approach to handle overlapping indices\n const resultData: number[] = [];\n const resultIndices: number[] = [];\n const resultIndptr: number[] = [0];\n\n for (let r = 0; r < this.rows; r++) {\n const rowValues = new Map<number, number>();\n\n // Add values from this matrix\n const thisStart = this.indptr[r] ?? 0;\n const thisEnd = this.indptr[r + 1] ?? thisStart;\n for (let p = thisStart; p < thisEnd; p++) {\n const c = this.indices[p] ?? 0;\n const v = this.data[p] ?? 0;\n rowValues.set(c, (rowValues.get(c) ?? 0) + v);\n }\n\n // Subtract values from other matrix\n const otherStart = other.indptr[r] ?? 0;\n const otherEnd = other.indptr[r + 1] ?? otherStart;\n for (let p = otherStart; p < otherEnd; p++) {\n const c = other.indices[p] ?? 0;\n const v = other.data[p] ?? 0;\n rowValues.set(c, (rowValues.get(c) ?? 0) - v);\n }\n\n // Sort by column index and add non-zero values\n const sortedCols = Array.from(rowValues.keys()).sort((a, b) => a - b);\n for (const c of sortedCols) {\n const v = rowValues.get(c) ?? 0;\n if (v !== 0) {\n resultIndices.push(c);\n resultData.push(v);\n }\n }\n resultIndptr.push(resultData.length);\n }\n\n return new CSRMatrix({\n data: new Float64Array(resultData),\n indices: new Int32Array(resultIndices),\n indptr: new Int32Array(resultIndptr),\n shape: this.shape,\n });\n }\n\n /**\n * Multiply all elements by a scalar value.\n *\n * @param scalar - Value to multiply by\n * @returns New CSRMatrix with scaled values\n *\n * @example\n * ```ts\n * const scaled = matrix.scale(2.0); // Double all values\n * ```\n */\n scale(scalar: number): CSRMatrix {\n if (scalar === 0) {\n // Return empty sparse matrix\n return new CSRMatrix({\n data: new Float64Array(0),\n indices: new Int32Array(0),\n indptr: new Int32Array(this.rows + 1),\n shape: this.shape,\n });\n }\n\n const newData = new Float64Array(this.data.length);\n for (let i = 0; i < this.data.length; i++) {\n newData[i] = (this.data[i] ?? 0) * scalar;\n }\n\n return new CSRMatrix({\n data: newData,\n indices: this.indices.slice(),\n indptr: this.indptr.slice(),\n shape: this.shape,\n });\n }\n\n /**\n * Element-wise multiplication (Hadamard product) with another sparse matrix.\n *\n * Both matrices must have the same shape.\n *\n * @param other - Matrix to multiply with\n * @returns New CSRMatrix containing the element-wise product\n * @throws {ShapeError} If shapes don't match\n *\n * @example\n * ```ts\n * const c = a.multiply(b); // c[i,j] = a[i,j] * b[i,j]\n * ```\n */\n multiply(other: CSRMatrix): CSRMatrix {\n if (this.rows !== other.rows || this.cols !== other.cols) {\n throw new ShapeError(\n `Cannot multiply matrices with shapes [${this.shape}] and [${other.shape}]`\n );\n }\n\n const resultData: number[] = [];\n const resultIndices: number[] = [];\n const resultIndptr: number[] = [0];\n\n for (let r = 0; r < this.rows; r++) {\n // Build a map of column -> value for the other matrix's row\n const otherRow = new Map<number, number>();\n const otherStart = other.indptr[r] ?? 0;\n const otherEnd = other.indptr[r + 1] ?? otherStart;\n for (let p = otherStart; p < otherEnd; p++) {\n otherRow.set(other.indices[p] ?? 0, other.data[p] ?? 0);\n }\n\n // Multiply matching elements\n const thisStart = this.indptr[r] ?? 0;\n const thisEnd = this.indptr[r + 1] ?? thisStart;\n for (let p = thisStart; p < thisEnd; p++) {\n const c = this.indices[p] ?? 0;\n const otherVal = otherRow.get(c);\n if (otherVal !== undefined) {\n const product = (this.data[p] ?? 0) * otherVal;\n if (product !== 0) {\n resultIndices.push(c);\n resultData.push(product);\n }\n }\n }\n resultIndptr.push(resultData.length);\n }\n\n return new CSRMatrix({\n data: new Float64Array(resultData),\n indices: new Int32Array(resultIndices),\n indptr: new Int32Array(resultIndptr),\n shape: this.shape,\n });\n }\n\n /**\n * Matrix multiplication with a dense vector.\n *\n * Computes y = A * x where A is this sparse matrix and x is a dense vector.\n *\n * @param vector - Dense vector (1D Tensor or Float64Array)\n * @returns Dense result vector as Tensor\n * @throws {ShapeError} If vector length doesn't match matrix columns\n *\n * @example\n * ```ts\n * const x = tensor([1, 2, 3]);\n * const y = sparse.matvec(x); // y = A * x\n * ```\n */\n matvec(vector: Tensor | Float64Array): Tensor {\n const vecData = vector instanceof Float64Array ? vector : this.tensorToFloat64(vector);\n const vecLen = vecData.length;\n\n if (vecLen !== this.cols) {\n throw new ShapeError(`Vector length ${vecLen} doesn't match matrix columns ${this.cols}`);\n }\n\n const result = new Float64Array(this.rows);\n\n for (let r = 0; r < this.rows; r++) {\n const start = this.indptr[r] ?? 0;\n const end = this.indptr[r + 1] ?? start;\n let sum = 0;\n for (let p = start; p < end; p++) {\n const c = this.indices[p] ?? 0;\n sum += (this.data[p] ?? 0) * (vecData[c] ?? 0);\n }\n result[r] = sum;\n }\n\n return TensorImpl.fromTypedArray({\n data: result,\n shape: [this.rows],\n dtype: \"float64\",\n device: \"cpu\",\n });\n }\n\n /**\n * Matrix multiplication with a dense matrix.\n *\n * Computes C = A * B where A is this sparse matrix and B is a dense matrix.\n *\n * @param dense - Dense matrix (2D Tensor)\n * @returns Dense result matrix as Tensor\n * @throws {ShapeError} If inner dimensions don't match\n *\n * @example\n * ```ts\n * const B = tensor([[1, 2], [3, 4], [5, 6]]);\n * const C = sparse.matmul(B); // C = A * B\n * ```\n */\n matmul(dense: Tensor): Tensor {\n if (dense.ndim !== 2) {\n throw new ShapeError(`Expected 2D tensor, got ${dense.ndim}D`);\n }\n\n const denseRows = dense.shape[0] ?? 0;\n const denseCols = dense.shape[1] ?? 0;\n\n if (this.cols !== denseRows) {\n throw new ShapeError(\n `Cannot multiply: sparse matrix columns (${this.cols}) != dense matrix rows (${denseRows})`\n );\n }\n\n const denseData = this.tensorToFloat64(dense);\n const result = new Float64Array(this.rows * denseCols);\n\n for (let r = 0; r < this.rows; r++) {\n const start = this.indptr[r] ?? 0;\n const end = this.indptr[r + 1] ?? start;\n\n for (let dc = 0; dc < denseCols; dc++) {\n let sum = 0;\n for (let p = start; p < end; p++) {\n const c = this.indices[p] ?? 0;\n sum += (this.data[p] ?? 0) * (denseData[c * denseCols + dc] ?? 0);\n }\n result[r * denseCols + dc] = sum;\n }\n }\n\n return TensorImpl.fromTypedArray({\n data: result,\n shape: [this.rows, denseCols],\n dtype: \"float64\",\n device: \"cpu\",\n });\n }\n\n /**\n * Transpose the sparse matrix.\n *\n * @returns New CSRMatrix representing the transpose\n *\n * @example\n * ```ts\n * const At = A.transpose(); // At[i,j] = A[j,i]\n * ```\n */\n transpose(): CSRMatrix {\n const rows = this.shape[0] ?? 0;\n const cols = this.shape[1] ?? 0;\n\n // Count non-zeros per column (which become rows in transpose)\n const colCounts = new Int32Array(cols);\n for (let i = 0; i < this.indices.length; i++) {\n const colIdx = this.indices[i] ?? 0;\n colCounts[colIdx] = (colCounts[colIdx] ?? 0) + 1;\n }\n\n // Build indptr for transpose\n const newIndptr = new Int32Array(cols + 1);\n for (let c = 0; c < cols; c++) {\n newIndptr[c + 1] = (newIndptr[c] ?? 0) + (colCounts[c] ?? 0);\n }\n\n // Build data and indices\n const newData = new Float64Array(this.nnz);\n const newIndices = new Int32Array(this.nnz);\n const colNext = newIndptr.slice(0, cols);\n\n for (let r = 0; r < rows; r++) {\n const start = this.indptr[r] ?? 0;\n const end = this.indptr[r + 1] ?? start;\n for (let p = start; p < end; p++) {\n const c = this.indices[p] ?? 0;\n const pos = colNext[c] ?? 0;\n newData[pos] = this.data[p] ?? 0;\n newIndices[pos] = r;\n colNext[c] = pos + 1;\n }\n }\n\n return new CSRMatrix({\n data: newData,\n indices: newIndices,\n indptr: newIndptr,\n shape: [cols, rows],\n });\n }\n\n /**\n * Get a specific element from the matrix.\n *\n * @param row - Row index\n * @param col - Column index\n * @returns Value at the specified position (0 if not stored)\n * @throws {RangeError} If indices are out of bounds\n *\n * @example\n * ```ts\n * const value = matrix.get(1, 2);\n * ```\n */\n get(row: number, col: number): number {\n if (row < 0 || row >= this.rows || col < 0 || col >= this.cols) {\n throw new IndexError(`Index (${row}, ${col}) out of bounds for shape [${this.shape}]`);\n }\n\n const start = this.indptr[row] ?? 0;\n const end = this.indptr[row + 1] ?? start;\n\n // Binary search for the column\n let lo = start;\n let hi = end;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n const midCol = this.indices[mid] ?? 0;\n if (midCol < col) {\n lo = mid + 1;\n } else if (midCol > col) {\n hi = mid;\n } else {\n return this.data[mid] ?? 0;\n }\n }\n return 0;\n }\n\n /**\n * Create a copy of this matrix.\n *\n * @returns New CSRMatrix with copied data\n */\n copy(): CSRMatrix {\n return new CSRMatrix({\n data: this.data.slice(),\n indices: this.indices.slice(),\n indptr: this.indptr.slice(),\n shape: this.shape,\n });\n }\n\n /** Helper to convert Tensor to Float64Array */\n private tensorToFloat64(t: Tensor): Float64Array {\n if (t.dtype === \"string\") {\n throw new ShapeError(\"Cannot convert string tensor to numeric array\");\n }\n if (\n t.data instanceof Float64Array &&\n t.offset === 0 &&\n t.strides.every((s, i) => {\n let expected = 1;\n for (let j = i + 1; j < t.ndim; j++) expected *= t.shape[j] ?? 1;\n return s === expected;\n })\n ) {\n return t.data;\n }\n // Copy with stride handling\n const out = new Float64Array(t.size);\n const strides = t.strides;\n const shape = t.shape;\n for (let i = 0; i < t.size; i++) {\n let offset = t.offset;\n let rem = i;\n for (let d = t.ndim - 1; d >= 0; d--) {\n const dim = shape[d] ?? 1;\n offset += (rem % dim) * (strides[d] ?? 0);\n rem = Math.floor(rem / dim);\n }\n const tData = t.data;\n if (Array.isArray(tData)) {\n throw new ShapeError(\"Cannot convert string tensor to numeric array\");\n }\n out[i] =\n tData instanceof BigInt64Array\n ? Number(getBigIntElement(tData, offset))\n : getNumericElement(tData, offset);\n }\n return out;\n }\n\n /**\n * Create a sparse matrix from COO (Coordinate List) format.\n *\n * @param args - COO format specification\n * @param args.rows - Number of rows\n * @param args.cols - Number of columns\n * @param args.rowIndices - Row indices of non-zero values\n * @param args.colIndices - Column indices of non-zero values\n * @param args.values - Non-zero values\n * @param args.sort - Whether to sort entries (default: true)\n * @returns New CSRMatrix\n *\n * @example\n * ```ts\n * const sparse = CSRMatrix.fromCOO({\n * rows: 3, cols: 3,\n * rowIndices: new Int32Array([0, 1, 2]),\n * colIndices: new Int32Array([0, 2, 1]),\n * values: new Float64Array([1, 2, 3])\n * });\n * ```\n */\n static fromCOO(args: {\n readonly rows: number;\n readonly cols: number;\n readonly rowIndices: Int32Array;\n readonly colIndices: Int32Array;\n readonly values: Float64Array;\n readonly sort?: boolean;\n }): CSRMatrix {\n const { rows, cols, rowIndices, colIndices, values } = args;\n if (rowIndices.length !== colIndices.length || rowIndices.length !== values.length) {\n throw new ShapeError(\"COO arrays must have the same length\");\n }\n\n const nnz = values.length;\n const order = new Int32Array(nnz);\n for (let i = 0; i < nnz; i++) order[i] = i;\n\n const shouldSort = args.sort ?? true;\n if (shouldSort) {\n order.sort((a, b) => {\n const ra = rowIndices[a] ?? 0;\n const rb = rowIndices[b] ?? 0;\n if (ra !== rb) return ra - rb;\n return (colIndices[a] ?? 0) - (colIndices[b] ?? 0);\n });\n }\n\n const indptr = new Int32Array(rows + 1);\n for (let k = 0; k < nnz; k++) {\n const i = order[k] ?? 0;\n const r = rowIndices[i] ?? 0;\n if (r < 0 || r >= rows) {\n throw new IndexError(`row index out of bounds: ${r}`);\n }\n indptr[r + 1] = (indptr[r + 1] ?? 0) + 1;\n }\n\n for (let r = 0; r < rows; r++) {\n indptr[r + 1] = (indptr[r + 1] ?? 0) + (indptr[r] ?? 0);\n }\n\n const indices = new Int32Array(nnz);\n const data = new Float64Array(nnz);\n const next = indptr.slice();\n\n for (let k = 0; k < nnz; k++) {\n const i = order[k] ?? 0;\n const r = rowIndices[i] ?? 0;\n const c = colIndices[i] ?? 0;\n if (c < 0 || c >= cols) {\n throw new IndexError(`col index out of bounds: ${c}`);\n }\n const pos = next[r] ?? 0;\n indices[pos] = c;\n data[pos] = values[i] ?? 0;\n next[r] = pos + 1;\n }\n\n return new CSRMatrix({ data, indices, indptr, shape: [rows, cols] });\n }\n}\n","import {\n type Axis,\n type DType,\n InvalidParameterError,\n normalizeAxes,\n type Shape,\n ShapeError,\n validateShape,\n} from \"../../core\";\n\nimport { Tensor } from \"./Tensor\";\n\ntype NumericDType = Exclude<DType, \"string\">;\n\nfunction isStringTensor(t: Tensor): t is Tensor<Shape, \"string\"> {\n return t.dtype === \"string\";\n}\n\nfunction isNumericTensor(t: Tensor): t is Tensor<Shape, NumericDType> {\n return t.dtype !== \"string\";\n}\n\n/**\n * Remove single-dimensional entries from the shape.\n *\n * Returns a view of the tensor with all dimensions of size 1 removed.\n * If axis is specified, only removes dimensions at those positions.\n *\n * **Complexity**: O(ndim) - only manipulates shape metadata, no data copy\n *\n * **Parameters**:\n * @param t - Input tensor\n * @param axis - Axis to squeeze. If undefined, squeeze all axes of size 1\n *\n * **Returns**: Tensor with squeezed dimensions (view, no copy)\n *\n * @example\n * ```ts\n * import { squeeze, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([[[1], [2], [3]]]);\n // shape: (1, 3, 1)\n * const y = squeeze(x); // shape: (3,)\n * const z = squeeze(x, 2); // shape: (1, 3)\n * ```\n *\n * @throws {Error} If axis is specified and dimension is not 1\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.squeeze.html | NumPy squeeze}\n */\nexport function squeeze(t: Tensor, axis?: Axis | Axis[]): Tensor {\n let axesToSqueeze: Set<number>;\n\n if (axis === undefined) {\n // Squeeze all dimensions of size 1\n axesToSqueeze = new Set();\n for (let i = 0; i < t.ndim; i++) {\n if (t.shape[i] === 1) {\n axesToSqueeze.add(i);\n }\n }\n } else {\n // Squeeze only specified axes\n const axes = normalizeAxes(axis, t.ndim);\n axesToSqueeze = new Set();\n\n for (const ax of axes) {\n // Validate dimension is 1\n if (t.shape[ax] !== 1) {\n throw new ShapeError(`Cannot squeeze axis ${ax} with dimension ${t.shape[ax]} (must be 1)`);\n }\n\n axesToSqueeze.add(ax);\n }\n }\n\n // Build new shape and strides, excluding squeezed dimensions\n const newShape: number[] = [];\n const newStrides: number[] = [];\n\n for (let i = 0; i < t.ndim; i++) {\n if (!axesToSqueeze.has(i)) {\n const dim = t.shape[i];\n const stride = t.strides[i];\n if (dim === undefined || stride === undefined) {\n throw new ShapeError(\"Internal error: missing dimension or stride\");\n }\n newShape.push(dim);\n newStrides.push(stride);\n }\n }\n\n // If all dimensions are squeezed, the result is a scalar (0D) tensor.\n // Represent scalars with shape [] (ndim=0), consistent with the rest of ndarray.\n if (newShape.length > 0) {\n validateShape(newShape);\n }\n\n // Return view with new shape\n if (isStringTensor(t)) {\n return Tensor.fromStringArray({\n data: t.data,\n shape: newShape,\n device: t.device,\n offset: t.offset,\n strides: newStrides,\n });\n }\n\n if (!isNumericTensor(t)) {\n throw new ShapeError(\"squeeze is not defined for string dtype\");\n }\n\n return Tensor.fromTypedArray({\n data: t.data,\n shape: newShape,\n dtype: t.dtype,\n device: t.device,\n offset: t.offset,\n strides: newStrides,\n });\n}\n\n/**\n * Expand the shape by inserting a new axis.\n *\n * Returns a view of the tensor with a new dimension of size 1 inserted\n * at the specified position.\n *\n * **Complexity**: O(ndim) - only manipulates shape metadata, no data copy\n *\n * **Parameters**:\n * @param t - Input tensor\n * @param axis - Position where new axis is placed (can be negative)\n *\n * **Returns**: Tensor with expanded dimensions (view, no copy)\n *\n * @example\n * ```ts\n * import { unsqueeze, tensor } from 'deepbox/ndarray';\n *\n * const x = tensor([1, 2, 3]); // shape: (3,)\n * const y = unsqueeze(x, 0); // shape: (1, 3)\n * const z = unsqueeze(x, 1); // shape: (3, 1)\n * const w = unsqueeze(x, -1); // shape: (3, 1)\n * ```\n *\n * @see {@link https://numpy.org/doc/stable/reference/generated/numpy.expand_dims.html | NumPy expand_dims}\n */\nexport function unsqueeze(t: Tensor, axis: number): Tensor {\n // New ndim will be one more than current\n const newNdim = t.ndim + 1;\n\n // Normalize negative axis\n // Allow axis from -newNdim to newNdim (inclusive)\n const normalizedAxis = axis < 0 ? newNdim + axis : axis;\n\n // Validate axis is in valid range [0, newNdim]\n if (normalizedAxis < 0 || normalizedAxis > newNdim) {\n throw new InvalidParameterError(\n `axis ${axis} is out of bounds for result with ${newNdim} dimensions`,\n \"axis\",\n axis\n );\n }\n\n // Build new shape and strides with dimension of size 1 inserted\n const newShape: number[] = [];\n const newStrides: number[] = [];\n\n // Copy dimensions before insertion point\n for (let i = 0; i < normalizedAxis; i++) {\n const dim = t.shape[i];\n const stride = t.strides[i];\n if (dim === undefined || stride === undefined) {\n throw new ShapeError(\"Internal error: missing dimension or stride\");\n }\n newShape.push(dim);\n newStrides.push(stride);\n }\n\n // Insert new dimension of size 1\n // Stride can be any value since dimension is 1 (no effect)\n newShape.push(1);\n // Use a stride that preserves contiguity when the source is contiguous.\n // For size-1 dims, any stride is valid, but this avoids breaking reshape/isContiguous.\n const insertedStride =\n normalizedAxis < t.ndim ? (t.strides[normalizedAxis] ?? 0) * (t.shape[normalizedAxis] ?? 1) : 1;\n newStrides.push(insertedStride);\n\n // Copy remaining dimensions after insertion point\n for (let i = normalizedAxis; i < t.ndim; i++) {\n const dim = t.shape[i];\n const stride = t.strides[i];\n if (dim === undefined || stride === undefined) {\n throw new ShapeError(\"Internal error: missing dimension or stride\");\n }\n newShape.push(dim);\n newStrides.push(stride);\n }\n\n validateShape(newShape);\n\n // Return view with new shape\n if (isStringTensor(t)) {\n return Tensor.fromStringArray({\n data: t.data,\n shape: newShape,\n device: t.device,\n offset: t.offset,\n strides: newStrides,\n });\n }\n\n if (!isNumericTensor(t)) {\n throw new ShapeError(\"unsqueeze is not defined for string dtype\");\n }\n\n return Tensor.fromTypedArray({\n data: t.data,\n shape: newShape,\n dtype: t.dtype,\n device: t.device,\n offset: t.offset,\n strides: newStrides,\n });\n}\n\n/**\n * Alias for unsqueeze.\n */\nexport const expandDims = unsqueeze;\n"]}