@hdnax/sqlingo.js 0.0.5 → 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 (243) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.repo.md +1 -2
  3. package/dist/chunk-2YNOERAO.cjs +2 -0
  4. package/dist/chunk-2YNOERAO.cjs.map +1 -0
  5. package/dist/chunk-2Z3O2CFM.cjs +19 -0
  6. package/dist/chunk-2Z3O2CFM.cjs.map +1 -0
  7. package/dist/chunk-4ZMKB6PV.cjs +2 -0
  8. package/dist/chunk-4ZMKB6PV.cjs.map +1 -0
  9. package/dist/chunk-53OWF4GG.js +2 -0
  10. package/dist/chunk-53OWF4GG.js.map +1 -0
  11. package/dist/chunk-C4CLTVOW.cjs +2 -0
  12. package/dist/chunk-C4CLTVOW.cjs.map +1 -0
  13. package/dist/chunk-DOKMTZYO.cjs +4 -0
  14. package/dist/chunk-DOKMTZYO.cjs.map +1 -0
  15. package/dist/chunk-FCGUTI7Y.js +2 -0
  16. package/dist/chunk-FCGUTI7Y.js.map +1 -0
  17. package/dist/chunk-IPCIXWCY.js +2 -0
  18. package/dist/chunk-IPCIXWCY.js.map +1 -0
  19. package/dist/chunk-KCNOE4DZ.js +19 -0
  20. package/dist/chunk-KCNOE4DZ.js.map +1 -0
  21. package/dist/chunk-NRJHX2GZ.js +2 -0
  22. package/dist/chunk-NRJHX2GZ.js.map +1 -0
  23. package/dist/chunk-O2J5RKBN.js +2 -0
  24. package/dist/chunk-O2J5RKBN.js.map +1 -0
  25. package/dist/chunk-PXUASP5I.js +2 -0
  26. package/dist/chunk-PXUASP5I.js.map +1 -0
  27. package/dist/chunk-R7C3ZHVK.cjs +2 -0
  28. package/dist/chunk-R7C3ZHVK.cjs.map +1 -0
  29. package/dist/chunk-UHWHUDLE.cjs +2 -0
  30. package/dist/chunk-UHWHUDLE.cjs.map +1 -0
  31. package/dist/chunk-WRNYJ54A.cjs +2 -0
  32. package/dist/chunk-WRNYJ54A.cjs.map +1 -0
  33. package/dist/chunk-XZQFOICX.cjs +3 -0
  34. package/dist/chunk-XZQFOICX.cjs.map +1 -0
  35. package/dist/chunk-YLOQRUXC.js +2 -0
  36. package/dist/chunk-YLOQRUXC.js.map +1 -0
  37. package/dist/chunk-YSS2WVCM.cjs +2 -0
  38. package/dist/chunk-YSS2WVCM.cjs.map +1 -0
  39. package/dist/chunk-Z5V6VOIN.js +3 -0
  40. package/dist/chunk-Z5V6VOIN.js.map +1 -0
  41. package/dist/chunk-ZBFGQPJR.js +4 -0
  42. package/dist/chunk-ZBFGQPJR.js.map +1 -0
  43. package/dist/dialects/athena.cjs +2 -0
  44. package/dist/dialects/athena.cjs.map +1 -0
  45. package/dist/dialects/athena.d.cts +66 -0
  46. package/dist/dialects/athena.d.ts +66 -0
  47. package/dist/dialects/athena.js +2 -0
  48. package/dist/dialects/athena.js.map +1 -0
  49. package/dist/dialects/bigquery.cjs +3 -0
  50. package/dist/dialects/bigquery.cjs.map +1 -0
  51. package/dist/dialects/bigquery.d.cts +651 -0
  52. package/dist/dialects/bigquery.d.ts +651 -0
  53. package/dist/dialects/bigquery.js +3 -0
  54. package/dist/dialects/bigquery.js.map +1 -0
  55. package/dist/dialects/clickhouse.cjs +2 -0
  56. package/dist/dialects/clickhouse.cjs.map +1 -0
  57. package/dist/dialects/clickhouse.d.cts +634 -0
  58. package/dist/dialects/clickhouse.d.ts +634 -0
  59. package/dist/dialects/clickhouse.js +2 -0
  60. package/dist/dialects/clickhouse.js.map +1 -0
  61. package/dist/dialects/databricks.cjs +2 -0
  62. package/dist/dialects/databricks.cjs.map +1 -0
  63. package/dist/dialects/databricks.d.cts +484 -0
  64. package/dist/dialects/databricks.d.ts +484 -0
  65. package/dist/dialects/databricks.js +2 -0
  66. package/dist/dialects/databricks.js.map +1 -0
  67. package/dist/dialects/doris.cjs +2 -0
  68. package/dist/dialects/doris.cjs.map +1 -0
  69. package/dist/dialects/doris.d.cts +484 -0
  70. package/dist/dialects/doris.d.ts +484 -0
  71. package/dist/dialects/doris.js +2 -0
  72. package/dist/dialects/doris.js.map +1 -0
  73. package/dist/dialects/dremio.cjs +2 -0
  74. package/dist/dialects/dremio.cjs.map +1 -0
  75. package/dist/dialects/dremio.d.cts +522 -0
  76. package/dist/dialects/dremio.d.ts +522 -0
  77. package/dist/dialects/dremio.js +2 -0
  78. package/dist/dialects/dremio.js.map +1 -0
  79. package/dist/dialects/drill.cjs +2 -0
  80. package/dist/dialects/drill.cjs.map +1 -0
  81. package/dist/dialects/drill.d.cts +512 -0
  82. package/dist/dialects/drill.d.ts +512 -0
  83. package/dist/dialects/drill.js +2 -0
  84. package/dist/dialects/drill.js.map +1 -0
  85. package/dist/dialects/druid.cjs +2 -0
  86. package/dist/dialects/druid.cjs.map +1 -0
  87. package/dist/dialects/druid.d.cts +17 -0
  88. package/dist/dialects/druid.d.ts +17 -0
  89. package/dist/dialects/druid.js +2 -0
  90. package/dist/dialects/druid.js.map +1 -0
  91. package/dist/dialects/duckdb.cjs +86 -0
  92. package/dist/dialects/duckdb.cjs.map +1 -0
  93. package/dist/dialects/duckdb.d.cts +756 -0
  94. package/dist/dialects/duckdb.d.ts +756 -0
  95. package/dist/dialects/duckdb.js +86 -0
  96. package/dist/dialects/duckdb.js.map +1 -0
  97. package/dist/dialects/dune.cjs +2 -0
  98. package/dist/dialects/dune.cjs.map +1 -0
  99. package/dist/dialects/dune.d.cts +21 -0
  100. package/dist/dialects/dune.d.ts +21 -0
  101. package/dist/dialects/dune.js +2 -0
  102. package/dist/dialects/dune.js.map +1 -0
  103. package/dist/dialects/exasol.cjs +2 -0
  104. package/dist/dialects/exasol.cjs.map +1 -0
  105. package/dist/dialects/exasol.d.cts +507 -0
  106. package/dist/dialects/exasol.d.ts +507 -0
  107. package/dist/dialects/exasol.js +2 -0
  108. package/dist/dialects/exasol.js.map +1 -0
  109. package/dist/dialects/fabric.cjs +2 -0
  110. package/dist/dialects/fabric.cjs.map +1 -0
  111. package/dist/dialects/fabric.d.cts +463 -0
  112. package/dist/dialects/fabric.d.ts +463 -0
  113. package/dist/dialects/fabric.js +2 -0
  114. package/dist/dialects/fabric.js.map +1 -0
  115. package/dist/dialects/hive.cjs +2 -0
  116. package/dist/dialects/hive.cjs.map +1 -0
  117. package/dist/dialects/hive.d.cts +585 -0
  118. package/dist/dialects/hive.d.ts +585 -0
  119. package/dist/dialects/hive.js +2 -0
  120. package/dist/dialects/hive.js.map +1 -0
  121. package/dist/dialects/materialize.cjs +2 -0
  122. package/dist/dialects/materialize.cjs.map +1 -0
  123. package/dist/dialects/materialize.d.cts +890 -0
  124. package/dist/dialects/materialize.d.ts +890 -0
  125. package/dist/dialects/materialize.js +2 -0
  126. package/dist/dialects/materialize.js.map +1 -0
  127. package/dist/dialects/mysql.cjs +2 -0
  128. package/dist/dialects/mysql.cjs.map +1 -0
  129. package/dist/dialects/mysql.d.cts +292 -0
  130. package/dist/dialects/mysql.d.ts +292 -0
  131. package/dist/dialects/mysql.js +2 -0
  132. package/dist/dialects/mysql.js.map +1 -0
  133. package/dist/dialects/oracle.cjs +2 -0
  134. package/dist/dialects/oracle.cjs.map +1 -0
  135. package/dist/dialects/oracle.d.cts +539 -0
  136. package/dist/dialects/oracle.d.ts +539 -0
  137. package/dist/dialects/oracle.js +2 -0
  138. package/dist/dialects/oracle.js.map +1 -0
  139. package/dist/dialects/postgres.cjs +2 -0
  140. package/dist/dialects/postgres.cjs.map +1 -0
  141. package/dist/dialects/postgres.d.cts +587 -0
  142. package/dist/dialects/postgres.d.ts +587 -0
  143. package/dist/dialects/postgres.js +2 -0
  144. package/dist/dialects/postgres.js.map +1 -0
  145. package/dist/dialects/presto.cjs +2 -0
  146. package/dist/dialects/presto.cjs.map +1 -0
  147. package/dist/dialects/presto.d.cts +173 -0
  148. package/dist/dialects/presto.d.ts +173 -0
  149. package/dist/dialects/presto.js +2 -0
  150. package/dist/dialects/presto.js.map +1 -0
  151. package/dist/dialects/prql.cjs +2 -0
  152. package/dist/dialects/prql.cjs.map +1 -0
  153. package/dist/dialects/prql.d.cts +496 -0
  154. package/dist/dialects/prql.d.ts +496 -0
  155. package/dist/dialects/prql.js +2 -0
  156. package/dist/dialects/prql.js.map +1 -0
  157. package/dist/dialects/redshift.cjs +2 -0
  158. package/dist/dialects/redshift.cjs.map +1 -0
  159. package/dist/dialects/redshift.d.cts +132 -0
  160. package/dist/dialects/redshift.d.ts +132 -0
  161. package/dist/dialects/redshift.js +2 -0
  162. package/dist/dialects/redshift.js.map +1 -0
  163. package/dist/dialects/risingwave.cjs +2 -0
  164. package/dist/dialects/risingwave.cjs.map +1 -0
  165. package/dist/dialects/risingwave.d.cts +478 -0
  166. package/dist/dialects/risingwave.d.ts +478 -0
  167. package/dist/dialects/risingwave.js +2 -0
  168. package/dist/dialects/risingwave.js.map +1 -0
  169. package/dist/dialects/singlestore.cjs +2 -0
  170. package/dist/dialects/singlestore.cjs.map +1 -0
  171. package/dist/dialects/singlestore.d.cts +73 -0
  172. package/dist/dialects/singlestore.d.ts +73 -0
  173. package/dist/dialects/singlestore.js +2 -0
  174. package/dist/dialects/singlestore.js.map +1 -0
  175. package/dist/dialects/snowflake.cjs +3 -0
  176. package/dist/dialects/snowflake.cjs.map +1 -0
  177. package/dist/dialects/snowflake.d.cts +320 -0
  178. package/dist/dialects/snowflake.d.ts +320 -0
  179. package/dist/dialects/snowflake.js +3 -0
  180. package/dist/dialects/snowflake.js.map +1 -0
  181. package/dist/dialects/solr.cjs +2 -0
  182. package/dist/dialects/solr.cjs.map +1 -0
  183. package/dist/dialects/solr.d.cts +458 -0
  184. package/dist/dialects/solr.d.ts +458 -0
  185. package/dist/dialects/solr.js +2 -0
  186. package/dist/dialects/solr.js.map +1 -0
  187. package/dist/dialects/spark.cjs +2 -0
  188. package/dist/dialects/spark.cjs.map +1 -0
  189. package/dist/dialects/spark.d.cts +484 -0
  190. package/dist/dialects/spark.d.ts +484 -0
  191. package/dist/dialects/spark.js +2 -0
  192. package/dist/dialects/spark.js.map +1 -0
  193. package/dist/dialects/spark2.cjs +2 -0
  194. package/dist/dialects/spark2.cjs.map +1 -0
  195. package/dist/dialects/spark2.d.cts +486 -0
  196. package/dist/dialects/spark2.d.ts +486 -0
  197. package/dist/dialects/spark2.js +2 -0
  198. package/dist/dialects/spark2.js.map +1 -0
  199. package/dist/dialects/sqlite.cjs +2 -0
  200. package/dist/dialects/sqlite.cjs.map +1 -0
  201. package/dist/dialects/sqlite.d.cts +510 -0
  202. package/dist/dialects/sqlite.d.ts +510 -0
  203. package/dist/dialects/sqlite.js +2 -0
  204. package/dist/dialects/sqlite.js.map +1 -0
  205. package/dist/dialects/starrocks.cjs +2 -0
  206. package/dist/dialects/starrocks.cjs.map +1 -0
  207. package/dist/dialects/starrocks.d.cts +518 -0
  208. package/dist/dialects/starrocks.d.ts +518 -0
  209. package/dist/dialects/starrocks.js +2 -0
  210. package/dist/dialects/starrocks.js.map +1 -0
  211. package/dist/dialects/tableau.cjs +2 -0
  212. package/dist/dialects/tableau.cjs.map +1 -0
  213. package/dist/dialects/tableau.d.cts +466 -0
  214. package/dist/dialects/tableau.d.ts +466 -0
  215. package/dist/dialects/tableau.js +2 -0
  216. package/dist/dialects/tableau.js.map +1 -0
  217. package/dist/dialects/teradata.cjs +2 -0
  218. package/dist/dialects/teradata.cjs.map +1 -0
  219. package/dist/dialects/teradata.d.cts +539 -0
  220. package/dist/dialects/teradata.d.ts +539 -0
  221. package/dist/dialects/teradata.js +2 -0
  222. package/dist/dialects/teradata.js.map +1 -0
  223. package/dist/dialects/trino.cjs +2 -0
  224. package/dist/dialects/trino.cjs.map +1 -0
  225. package/dist/dialects/trino.d.cts +465 -0
  226. package/dist/dialects/trino.d.ts +465 -0
  227. package/dist/dialects/trino.js +2 -0
  228. package/dist/dialects/trino.js.map +1 -0
  229. package/dist/dialects/tsql.cjs +2 -0
  230. package/dist/dialects/tsql.cjs.map +1 -0
  231. package/dist/dialects/tsql.d.cts +703 -0
  232. package/dist/dialects/tsql.d.ts +703 -0
  233. package/dist/dialects/tsql.js +2 -0
  234. package/dist/dialects/tsql.js.map +1 -0
  235. package/dist/index.cjs +5 -25
  236. package/dist/index.cjs.map +1 -1
  237. package/dist/index.d.cts +3 -14178
  238. package/dist/index.d.ts +3 -14178
  239. package/dist/index.js +5 -25
  240. package/dist/index.js.map +1 -1
  241. package/dist/tokens-VcMD09XM.d.cts +15805 -0
  242. package/dist/tokens-VcMD09XM.d.ts +15805 -0
  243. package/package.json +171 -5
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/typing/duckdb.ts","../../src/dialects/duckdb.ts"],"sourcesContent":["import type {\n Expression,\n} from '../expressions/expressions';\nimport {\n cache,\n} from '../port_internals';\nimport {\n DataTypeExprKind,\n} from '../expressions/types';\nimport {\n BitLengthExpr,\n DayExpr,\n DayOfMonthExpr,\n DayOfWeekExpr,\n DayOfYearExpr,\n HourExpr,\n LengthExpr,\n MinuteExpr,\n MonthExpr,\n QuarterExpr,\n SecondExpr,\n WeekExpr,\n YearExpr,\n FactorialExpr,\n Atan2Expr,\n JarowinklerSimilarityExpr,\n RandExpr,\n TimeToUnixExpr,\n ToDaysExpr,\n TimeFromPartsExpr,\n} from '../expressions/expressions';\nimport type {\n ExpressionMetadata,\n} from './dialect';\nimport {\n DialectTyping,\n} from './dialect';\n\nexport class DuckDbTyping {\n @cache\n static get EXPRESSION_METADATA (): ExpressionMetadata {\n // Clone the base metadata map to avoid mutating the global definitions\n const map: ExpressionMetadata = new Map(DialectTyping.EXPRESSION_METADATA);\n\n const extend = (types: (typeof Expression)[], data: Record<string, unknown>) => {\n for (const type of types) map.set(type, data);\n };\n\n extend([\n BitLengthExpr,\n DayExpr,\n DayOfMonthExpr,\n DayOfWeekExpr,\n DayOfYearExpr,\n HourExpr,\n LengthExpr,\n MinuteExpr,\n MonthExpr,\n QuarterExpr,\n SecondExpr,\n WeekExpr,\n YearExpr,\n ], {\n returns: DataTypeExprKind.BIGINT,\n });\n\n extend([\n FactorialExpr,\n ], {\n returns: DataTypeExprKind.INT128,\n });\n\n extend([\n Atan2Expr,\n JarowinklerSimilarityExpr,\n RandExpr,\n TimeToUnixExpr,\n ], {\n returns: DataTypeExprKind.DOUBLE,\n });\n\n map.set(ToDaysExpr, {\n returns: DataTypeExprKind.INTERVAL,\n });\n map.set(TimeFromPartsExpr, {\n returns: DataTypeExprKind.TIME,\n });\n\n return map;\n }\n}\n","import {\n Generator,\n unsupportedArgs,\n} from '../generator';\nimport {\n buildArrayConcat, buildExtractJsonWithPath, Parser,\n binaryRangeParser,\n} from '../parser';\nimport type {\n TokenPair,\n} from '../tokens';\nimport {\n Tokenizer, TokenType,\n} from '../tokens';\nimport type {\n ApproxTopKExpr,\n Base64EncodeExpr,\n BitmapBitPositionExpr,\n BitmapBucketNumberExpr,\n BitmapConstructAggExpr,\n CommandExpr,\n CurrentDateExpr,\n FromIso8601TimestampExpr,\n FuncExpr,\n NormalExpr,\n RandstrExpr,\n StrToDateExpr,\n TableSampleExpr,\n TimeSliceExpr,\n ToBinaryExpr,\n TruncExpr,\n UniformExpr,\n ZipfExpr,\n CountIfExpr,\n ColumnDefExpr,\n JoinExpr,\n TimestampLtzFromPartsExpr,\n TimestampTzFromPartsExpr,\n AddMonthsExpr,\n FormatExpr,\n TimestampTruncExpr,\n BitwiseNotExpr,\n WithinGroupExpr,\n LowerExpr,\n PadExpr,\n ReverseExpr,\n ArraysZipExpr,\n ApproximateSimilarityExpr,\n MinhashExpr,\n MinhashCombineExpr,\n NumberToStrExpr,\n SpaceExpr,\n TableFromRowsExpr,\n MapCatExpr,\n ObjectInsertExpr,\n ArrayToStringExpr,\n RespectNullsExpr,\n ExpressionValue,\n} from '../expressions';\nimport {\n FirstValueExpr,\n GeneratorExpr,\n GreatestExpr,\n LeastExpr,\n TrimPosition,\n LagExpr,\n LastValueExpr,\n LeadExpr,\n LikePropertyExpr,\n NthValueExpr,\n PropertiesLocation,\n SequencePropertiesExpr,\n TemporaryPropertyExpr,\n ArrayInsertExpr,\n ArrayRemoveAtExpr,\n ArrayRemoveExpr,\n ArraySortExpr,\n ArraySumExpr,\n ArrayUniqueAggExpr,\n Base64DecodeBinaryExpr,\n Base64DecodeStringExpr,\n BitwiseAndExpr,\n BitwiseLeftShiftExpr,\n BitwiseOrExpr,\n BitwiseRightShiftExpr,\n BoolxorAggExpr,\n ByteLengthExpr,\n CeilExpr,\n CommentColumnConstraintExpr,\n CorrExpr,\n CurrentTimeExpr,\n CurrentTimestampExpr,\n DateExpr,\n DateStrToDateExpr,\n DateSubExpr,\n DatetimeAddExpr,\n DatetimeDiffExpr,\n DatetimeExpr,\n DatetimeSubExpr,\n DatetimeTruncExpr,\n DateToDiExpr,\n DaynameExpr,\n DayOfMonthExpr,\n DayOfWeekExpr,\n DayOfWeekIsoExpr,\n DayOfYearExpr,\n DistinctExpr,\n DiToDateExpr,\n EqExpr,\n EqualNullExpr,\n ExtractExpr,\n FloorExpr,\n GenerateTimestampArrayExpr,\n GroupConcatExpr,\n InitcapExpr,\n IntDivExpr,\n IsArrayExpr,\n IsInfExpr,\n IsNanExpr,\n IsNullValueExpr,\n JsonbExistsExpr,\n JsonbObjectAggExpr,\n JsonExtractArrayExpr,\n JsonFormatExpr,\n JsonObjectAggExpr,\n LastDayExpr,\n LateralExpr,\n LocaltimeExpr,\n LogicalAndExpr,\n LogicalOrExpr,\n MakeIntervalExpr,\n Md5DigestExpr,\n MonthnameExpr,\n MonthsBetweenExpr,\n NullSafeEqExpr,\n PivotExpr,\n PreviousDayExpr,\n RandExpr,\n RegexpILikeExpr,\n RegrValxExpr,\n RegrValyExpr,\n ReturnExpr,\n ReturnsPropertyExpr,\n SchemaExpr,\n Seq1Expr,\n Seq2Expr,\n Seq4Expr,\n Seq8Expr,\n Sha1DigestExpr,\n Sha2DigestExpr,\n ShaExpr,\n StrPositionExpr,\n StrToUnixExpr,\n TimeAddExpr,\n TimeDiffExpr,\n TimeExpr,\n TimestampAddExpr,\n TimestampDiffExpr,\n TimestampExpr,\n TimestampSubExpr,\n TimeStrToDateExpr,\n TimeStrToTimeExpr,\n TimeStrToUnixExpr,\n TimeSubExpr,\n ToBooleanExpr,\n TsOrDiToDiExpr,\n TsOrDsDiffExpr,\n UnixMicrosExpr,\n UnixMillisExpr,\n UnixSecondsExpr,\n UnixToStrExpr,\n UnixToTimeStrExpr,\n XorExpr,\n YearOfWeekExpr,\n YearOfWeekIsoExpr,\n AttachExpr,\n DetachExpr,\n InstallExpr,\n MapExpr,\n ToMapExpr,\n VarMapExpr,\n AnyValueExpr,\n ArrayAppendExpr,\n ArrayContainsExpr,\n ArrayFilterExpr,\n BitwiseXorAggExpr,\n BitwiseXorExpr,\n CosineDistanceExpr,\n CurrentVersionExpr,\n DateBinExpr,\n DateFromPartsExpr,\n EncodeExpr,\n EuclideanDistanceExpr,\n ExplodeExpr,\n GetbitExpr,\n JarowinklerSimilarityExpr,\n JsonExtractScalarExpr,\n LevenshteinExpr,\n ParseJsonExpr,\n PercentileContExpr,\n PercentileDiscExpr,\n RegexpExtractAllExpr,\n RegexpExtractExpr,\n RegexpLikeExpr,\n RegexpReplaceExpr,\n RegexpSplitExpr,\n Sha2Expr,\n ShowExpr,\n SplitExpr,\n StrToTimeExpr,\n StructExpr,\n TimeFromPartsExpr,\n TimeToStrExpr,\n TimeToUnixExpr,\n TransformExpr,\n RoundExpr,\n Expression,\n AddExpr,\n AnonymousExpr,\n ArrayExpr,\n ArrayPrependExpr,\n AtTimeZoneExpr,\n BitwiseAndAggExpr,\n BitwiseOrAggExpr,\n BooleanExpr,\n BinaryExpr,\n BracketExpr,\n CaseExpr,\n CastExpr,\n DataTypeExpr,\n DataTypeExprKind,\n DateAddExpr,\n DateDiffExpr,\n DateTruncExpr,\n DecodeExpr,\n DecodeCaseExpr,\n DivExpr,\n FromBase64Expr,\n GenerateDateArrayExpr,\n GenerateSeriesExpr,\n HavingExpr,\n HavingMaxExpr,\n HexStringExpr,\n IdentifierExpr,\n IfExpr,\n InExpr,\n IntervalExpr,\n IsExpr,\n isType,\n JsonExtractExpr,\n JsonValueArrayExpr,\n LengthExpr,\n LiteralExpr,\n ModExpr,\n MulExpr,\n NextDayExpr,\n NotExpr,\n OrderExpr,\n OrExpr,\n ParenExpr,\n PropertyEqExpr,\n ReplaceExpr,\n replacePlaceholders,\n SelectExpr,\n SliceExpr,\n SortArrayExpr,\n SubExpr,\n TimestampFromPartsExpr,\n UnhexExpr,\n UnixToTimeExpr,\n UpperExpr,\n VarExpr,\n WeekStartExpr,\n WhereExpr,\n WindowExpr,\n AggFuncExpr,\n null_,\n PlaceholderExpr,\n AbsExpr,\n ArrayOverlapsExpr,\n StartsWithExpr,\n RegexpFullMatchExpr,\n PowExpr,\n IgnoreNullsExpr,\n AliasExpr,\n TableAliasExpr,\n AttachOptionExpr,\n LambdaExpr,\n PositionalColumnExpr,\n ApproxDistinctExpr,\n BoolnotExpr,\n BoolandExpr,\n BoolorExpr,\n ArrayCompactExpr,\n ArrayConstructCompactExpr,\n ArrayConcatExpr,\n TsOrDsAddExpr,\n VariancePopExpr,\n WeekOfYearExpr,\n maybeParse,\n GtExpr,\n TsOrDsToTimeExpr,\n TryCastExpr,\n FilterExpr,\n AndExpr,\n UserDefinedFunctionExpr,\n UnnestExpr,\n JsonPathKeyExpr,\n JsonPathRootExpr,\n JsonPathSubscriptExpr,\n JsonPathWildcardExpr,\n FromExpr,\n ApproxQuantileExpr,\n ApproxQuantilesExpr,\n NegExpr,\n TrimExpr,\n OrderedExpr,\n ArrayAggExpr,\n ColumnExpr,\n ConcatExpr,\n DPipeExpr,\n RepeatExpr,\n StarExpr,\n SubstringExpr,\n AliasesExpr,\n FirstExpr,\n KwargExpr,\n NullifExpr,\n ChrExpr,\n TableExpr,\n ToBase64Expr,\n PosexplodeExpr,\n JoinExprKind,\n CurrentCatalogExpr,\n SessionUserExpr,\n} from '../expressions';\nimport {\n seqGet, isDateUnit, camelToScreamingSnakeCase,\n} from '../helper';\nimport {\n cache, narrowInstanceOf,\n} from '../port_internals';\nimport {\n inheritStructFieldNames, preprocess, unqualifyColumns,\n} from '../transforms';\nimport {\n annotateTypes,\n} from '../optimizer';\nimport {\n DuckDbTyping,\n} from '../typing/duckdb';\nimport {\n arrowJsonExtractSql,\n dateDeltaToBinaryIntervalOp as dateDeltaToBinaryIntervalOpBase,\n unitToStr,\n Dialect, Dialects,\n NormalizationStrategy,\n dateTruncToTime,\n buildRegexpExtract,\n buildFormattedTime,\n binaryFromFunction,\n pivotColumnNames,\n buildDefaultDecimalType,\n approxCountDistinctSql,\n inlineArrayUnlessQuery,\n arrayAppendSql,\n arrayCompactSql,\n arrayConcatSql,\n renameFunc,\n removeFromArrayUsingFilter,\n noCommentColumnConstraintSql,\n dateStrToDateSql,\n decodeToCaseSql,\n noDatetimeSql,\n encodeDecodeSql,\n getBitSql,\n groupConcatSql,\n explodeToUnnestSql,\n noMakeIntervalSql,\n monthsBetweenSql,\n regexpReplaceGlobalModifier,\n strPositionSql,\n noTimeSql,\n noTimestampSql,\n timeStrToTimeSql,\n countIfToSum,\n NullOrdering,\n strToTimeSql,\n} from './dialect';\nimport type {\n JsonExtractType,\n} from './dialect';\n\n/**\n * Regex to detect time zones in timestamps of the form [+|-]TT[:tt]\n * The pattern matches timezone offsets that appear after the time portion\n */\nexport const TIMEZONE_PATTERN = /:\\d{2}.*?[+\\-]\\d{2}(?::\\d{2})?/;\n\n/**\n * Characters that must be escaped when building regex expressions in INITCAP\n */\nexport const REGEX_ESCAPE_REPLACEMENTS: Record<string, string> = {\n '\\\\': '\\\\\\\\',\n '-': '\\\\-',\n '^': '\\\\^',\n '[': '\\\\[',\n ']': '\\\\]',\n};\n\n/**\n * Used to in RANDSTR transpilation\n */\nexport const RANDSTR_CHAR_POOL = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\nexport const RANDSTR_SEED = 123456;\n\n/**\n * Whitespace control characters that DuckDB must process with `CHR({val})` calls\n */\nexport const WS_CONTROL_CHARS_TO_DUCK: Record<string, number> = {\n '\\u000b': 11,\n '\\u001c': 28,\n '\\u001d': 29,\n '\\u001e': 30,\n '\\u001f': 31,\n};\n\n/**\n * Days of week to ISO 8601 day-of-week numbers\n * ISO 8601 standard: Monday=1, ..., Sunday=7\n */\nexport const WEEK_START_DAY_TO_DOW: Record<string, number> = {\n MONDAY: 1,\n TUESDAY: 2,\n WEDNESDAY: 3,\n THURSDAY: 4,\n FRIDAY: 5,\n SATURDAY: 6,\n SUNDAY: 7,\n};\n\nexport const MAX_BIT_POSITION = LiteralExpr.number(32768);\n\n/**\n * SEQ function constants\n */\nexport const SEQ_BASE = '(ROW_NUMBER() OVER (ORDER BY 1) - 1)';\nexport const SEQ_RESTRICTED = [\n WhereExpr,\n HavingExpr,\n AggFuncExpr,\n OrderExpr,\n SelectExpr,\n];\n\n/**\n * Apply base64 alphabet character replacements.\n *\n * Base64 alphabet can be 1-3 chars: 1st = index 62 ('+'), 2nd = index 63 ('/'), 3rd = padding ('=').\n */\nfunction applyBase64AlphabetReplacements (\n result: Expression,\n alphabet: Expression | undefined,\n options: {reverse?: boolean} = {},\n): Expression {\n const {\n reverse = false,\n } = options;\n if (alphabet instanceof LiteralExpr && alphabet.isString) {\n const defaultChars = '+/=';\n const newChars = alphabet.args.this ?? '';\n\n for (let i = 0; i < Math.min(defaultChars.length, newChars.length); i++) {\n const defaultChar = defaultChars[i];\n const newChar = newChars[i] ?? '';\n\n if (newChar !== defaultChar) {\n const [\n find,\n replace,\n ] = reverse\n ? [\n newChar,\n defaultChar,\n ]\n : [\n defaultChar,\n newChar,\n ];\n result = new ReplaceExpr({\n this: result,\n expression: LiteralExpr.string(find),\n replacement: LiteralExpr.string(replace),\n });\n }\n }\n }\n return result;\n}\n\n/**\n * Transpile Snowflake BASE64_DECODE_STRING/BINARY to DuckDB.\n */\nfunction base64DecodeSql (this: Generator, expression: Base64EncodeExpr, options: {toString?: boolean}): string {\n const {\n toString = false,\n } = options;\n\n let inputExpr = expression.args.this;\n const alphabet = expression.args.alphabet;\n\n inputExpr = applyBase64AlphabetReplacements(inputExpr ?? null_(), alphabet, {\n reverse: true,\n });\n inputExpr = new FromBase64Expr({\n this: inputExpr,\n });\n\n if (toString) {\n inputExpr = new DecodeExpr({\n this: inputExpr,\n });\n }\n\n return this.sql(inputExpr);\n}\n\n/**\n * DuckDB's LAST_DAY only supports month. Logic handles year, quarter, week.\n */\nfunction lastDaySql (this: Generator, expression: LastDayExpr): string {\n const dateExpr = expression.args.this;\n const unit = expression.text('unit').toUpperCase();\n\n if (!unit || unit === 'MONTH') {\n return this.func('LAST_DAY', [\n dateExpr,\n ]);\n }\n\n if (unit === 'YEAR') {\n const yearExpr = this.func('EXTRACT', [\n new VarExpr({\n this: 'YEAR',\n }),\n dateExpr,\n ]);\n const makeDateExpr = this.func('MAKE_DATE', [\n yearExpr,\n LiteralExpr.number(12),\n LiteralExpr.number(31),\n ]);\n return this.sql(makeDateExpr);\n }\n\n if (unit === 'QUARTER') {\n const yearExpr = this.func('EXTRACT', [\n new VarExpr({\n this: 'YEAR',\n }),\n dateExpr,\n ]);\n const quarterExpr = this.func('EXTRACT', [\n new VarExpr({\n this: 'QUARTER',\n }),\n dateExpr,\n ]);\n\n const lastMonthExpr = new MulExpr({\n this: quarterExpr,\n expression: LiteralExpr.number(3),\n });\n const firstDayLastMonthExpr = this.func('MAKE_DATE', [\n yearExpr,\n lastMonthExpr,\n LiteralExpr.number(1),\n ]);\n\n const lastDayExpr = this.func('LAST_DAY', [\n firstDayLastMonthExpr,\n ]);\n return this.sql(lastDayExpr);\n }\n\n if (unit === 'WEEK') {\n const dow = this.func('EXTRACT', [\n new VarExpr({\n this: 'DAYOFWEEK',\n }),\n dateExpr,\n ]);\n const daysToSundayExpr = new ModExpr({\n this: new ParenExpr({\n this: new SubExpr({\n this: LiteralExpr.number(7),\n expression: dow,\n }),\n }),\n expression: LiteralExpr.number(7),\n });\n const intervalExpr = new IntervalExpr({\n this: daysToSundayExpr,\n unit: new VarExpr({\n this: 'DAY',\n }),\n });\n const addExpr = new AddExpr({\n this: dateExpr,\n expression: intervalExpr,\n });\n const castExpr = new CastExpr({\n this: addExpr,\n to: new DataTypeExpr({\n this: DataTypeExprKind.DATE,\n }),\n });\n return this.sql(castExpr);\n }\n\n this.unsupported(`Unsupported date part '${unit}' in LAST_DAY function`);\n return this.functionFallbackSql(expression);\n}\n\nfunction isNanosecondUnit (unit: Expression | undefined): boolean {\n return (unit instanceof VarExpr || unit instanceof LiteralExpr) && unit.name.toUpperCase() === 'NANOSECOND';\n}\n\n/** Generate NANOSECOND diff using EPOCH_NS since DATE_DIFF doesn't support it. */\nfunction handleNanosecondDiff (this: Generator, endTime: Expression, startTime: Expression): string {\n const endNs = new CastExpr({\n this: endTime,\n to: new DataTypeExpr({\n this: DataTypeExprKind.TIMESTAMP_NS,\n }),\n });\n const startNs = new CastExpr({\n this: startTime,\n to: new DataTypeExpr({\n this: DataTypeExprKind.TIMESTAMP_NS,\n }),\n });\n\n return this.sql(\n new SubExpr({\n this: this.func('EPOCH_NS', [\n endNs,\n ]),\n expression: this.func('EPOCH_NS', [\n startNs,\n ]),\n }),\n );\n}\n\n/** Transpile TO_BOOLEAN and TRY_TO_BOOLEAN from Snowflake to DuckDB. */\nfunction toBooleanSql (this: Generator, expression: ToBooleanExpr): string {\n const arg = expression.args.this;\n const isSafe = expression.args.safe ?? false;\n\n const baseCaseExpr = new CaseExpr({})\n .when(\n new UpperExpr({\n this: new CastExpr({\n this: arg,\n to: new DataTypeExpr({\n this: DataTypeExprKind.VARCHAR,\n }),\n }),\n }).eq(\n LiteralExpr.string('ON'),\n ),\n new BooleanExpr({\n this: true,\n }),\n )\n .when(\n new UpperExpr({\n this: new CastExpr({\n this: arg,\n to: new DataTypeExpr({\n this: DataTypeExprKind.VARCHAR,\n }),\n }),\n }).eq(\n LiteralExpr.string('OFF'),\n ),\n new BooleanExpr({\n this: false,\n }),\n );\n\n if (isSafe) {\n baseCaseExpr.else(this.func('TRY_CAST', [\n arg,\n DataTypeExpr.build('BOOLEAN'),\n ]));\n } else {\n const castToReal = this.func('TRY_CAST', [\n arg,\n DataTypeExpr.build('REAL'),\n ]);\n const nanInfCheck = new OrExpr({\n this: this.func('ISNAN', [\n castToReal,\n ]),\n expression: this.func('ISINF', [\n castToReal,\n ]),\n });\n\n baseCaseExpr\n .when(\n nanInfCheck,\n this.func('ERROR', [\n LiteralExpr.string('TO_BOOLEAN: Non-numeric values NaN and INF are not supported'),\n ]),\n )\n .else(new CastExpr({\n this: arg,\n to: new DataTypeExpr({\n this: DataTypeExprKind.BOOLEAN,\n }),\n }));\n }\n\n return this.sql(baseCaseExpr);\n}\n\n/** BigQuery -> DuckDB conversion for the DATE function */\nfunction dateSql (this: Generator, expression: DateExpr): string {\n let thisNode = expression.args.this;\n const zone = this.sql(expression, 'zone');\n\n if (zone) {\n // BigQuery UTC -> specified zone -> keep DATE part\n thisNode = new CastExpr({\n this: thisNode,\n to: new DataTypeExpr({\n this: DataTypeExprKind.TIMESTAMP,\n }),\n });\n const atUtc = new AtTimeZoneExpr({\n this: thisNode,\n zone: LiteralExpr.string('UTC'),\n });\n thisNode = new AtTimeZoneExpr({\n this: atUtc,\n zone,\n });\n }\n\n return this.sql(new CastExpr({\n this: thisNode,\n to: new DataTypeExpr({\n this: DataTypeExprKind.DATE,\n }),\n }));\n}\n\n/** BigQuery -> DuckDB conversion for the TIME_DIFF function */\nfunction timeDiffSql (this: Generator, expression: TimeDiffExpr): string {\n const unit = expression.args.unit;\n\n if (isNanosecondUnit(unit)) {\n return handleNanosecondDiff.call(this, expression.args.expression ?? null_(), expression.args.this ?? null_());\n }\n\n const thisNode = new CastExpr({\n this: expression.args.this,\n to: new DataTypeExpr({\n this: DataTypeExprKind.TIME,\n }),\n });\n const exprNode = new CastExpr({\n this: expression.args.expression,\n to: new DataTypeExpr({\n this: DataTypeExprKind.TIME,\n }),\n });\n\n // BQ flips operands relative to standard DATE_DIFF\n return this.func('DATE_DIFF', [\n unitToStr(expression),\n exprNode,\n thisNode,\n ]);\n}\n\n/** Handles NANOSECOND units and float interval rounding for DuckDB */\nfunction dateDeltaToBinaryIntervalOp (options: {cast?: boolean} = {}): (this: Generator, expression: DatetimeAddExpr | DatetimeSubExpr) => string {\n const {\n cast = true,\n } = options;\n const baseImpl = dateDeltaToBinaryIntervalOpBase({\n cast,\n });\n\n return function (this: Generator, expression: DatetimeSubExpr | DatetimeAddExpr): string {\n const unit = narrowInstanceOf(expression.getArgKey('unit'), 'string', Expression);\n let intervalValue: Expression | undefined = expression.args.expression;\n\n if (isNanosecondUnit(unit instanceof Expression ? unit : undefined)) {\n if (intervalValue instanceof IntervalExpr) {\n intervalValue = intervalValue.args.this;\n }\n\n const timestampNs = new CastExpr({\n this: narrowInstanceOf(expression.args.this, 'string', Expression),\n to: new DataTypeExpr({\n this: DataTypeExprKind.TIMESTAMP_NS,\n }),\n });\n\n return this.sql(\n this.func('MAKE_TIMESTAMP_NS', [\n new AddExpr({\n this: this.func('EPOCH_NS', [\n timestampNs,\n ]),\n expression: narrowInstanceOf(intervalValue, 'string', Expression),\n }),\n ]),\n );\n }\n\n if (!intervalValue || intervalValue instanceof IntervalExpr) {\n return baseImpl.call(this, expression);\n }\n\n if (isType(intervalValue, DataTypeExpr.REAL_TYPES)) {\n expression.setArgKey('expression', new CastExpr({\n this: this.func('ROUND', [\n intervalValue,\n ]),\n to: new DataTypeExpr({\n this: DataTypeExprKind.INT,\n }),\n }));\n }\n\n return baseImpl.call(this, expression);\n };\n}\n\n/** Transpile ARRAY_INSERT using LIST_CONCAT and DuckDB 1-based slicing */\nfunction arrayInsertSql (this: Generator, expression: ArrayInsertExpr): string {\n const thisNode = expression.args.this;\n const position = expression.args.position;\n const element = expression.args.expression;\n const elementArray = new ArrayExpr({\n expressions: [\n element ?? null_(),\n ],\n });\n const indexOffset = expression.args.offset ?? 0;\n\n if (!position?.isNumber) {\n this.unsupported('ARRAY_INSERT can only be transpiled with a literal position');\n return this.func('ARRAY_INSERT', [\n thisNode,\n position,\n element,\n ]);\n }\n\n let posValue = position.toValue() as number;\n\n // Normalize 1-based to 0-based\n if (0 < posValue) posValue -= indexOffset;\n else if (posValue < 0) posValue += indexOffset;\n\n let concatExprs: Expression[];\n\n if (posValue === 0) {\n concatExprs = [\n elementArray,\n thisNode ?? null_(),\n ];\n } else if (0 < posValue) {\n const sliceStart = new BracketExpr({\n this: thisNode,\n expressions: [\n new SliceExpr({\n this: LiteralExpr.number(1),\n expression: LiteralExpr.number(posValue),\n }),\n ],\n });\n const sliceEnd = new BracketExpr({\n this: thisNode,\n expressions: [\n new SliceExpr({\n this: LiteralExpr.number(posValue + 1),\n }),\n ],\n });\n concatExprs = [\n sliceStart,\n elementArray,\n sliceEnd,\n ];\n } else {\n const arrLen = new LengthExpr({\n this: thisNode,\n });\n const sliceEndPos = new AddExpr({\n this: arrLen,\n expression: LiteralExpr.number(posValue),\n });\n const sliceStartPos = new AddExpr({\n this: sliceEndPos,\n expression: LiteralExpr.number(1),\n });\n\n const sliceStart = new BracketExpr({\n this: thisNode,\n expressions: [\n new SliceExpr({\n this: LiteralExpr.number(1),\n expression: sliceEndPos,\n }),\n ],\n });\n const sliceEnd = new BracketExpr({\n this: thisNode,\n expressions: [\n new SliceExpr({\n this: sliceStartPos,\n }),\n ],\n });\n concatExprs = [\n sliceStart,\n elementArray,\n sliceEnd,\n ];\n }\n\n return this.sql(\n new IfExpr({\n this: new IsExpr({\n this: thisNode,\n expression: null_(),\n }),\n true: null_(),\n false: this.func('LIST_CONCAT', concatExprs),\n }),\n );\n}\n\n/** Transpile ARRAY_REMOVE_AT using LIST_CONCAT and DuckDB 1-based slicing */\nfunction arrayRemoveAtSql (this: Generator, expression: ArrayRemoveAtExpr): string {\n const thisNode = expression.args.this;\n const position = expression.args.position;\n\n if (!position?.isNumber) {\n this.unsupported('ARRAY_REMOVE_AT can only be transpiled with a literal position');\n return this.func('ARRAY_REMOVE_AT', [\n thisNode,\n position,\n ]);\n }\n\n const posValue = position.toValue() as number;\n let resultExpr: string | Expression;\n\n if (posValue === 0) {\n resultExpr = new BracketExpr({\n this: thisNode,\n expressions: [\n new SliceExpr({\n this: LiteralExpr.number(2),\n }),\n ],\n });\n } else if (0 < posValue) {\n const leftSlice = new BracketExpr({\n this: thisNode,\n expressions: [\n new SliceExpr({\n this: LiteralExpr.number(1),\n expression: LiteralExpr.number(posValue),\n }),\n ],\n });\n const rightSlice = new BracketExpr({\n this: thisNode,\n expressions: [\n new SliceExpr({\n this: LiteralExpr.number(posValue + 2),\n }),\n ],\n });\n resultExpr = this.func('LIST_CONCAT', [\n leftSlice,\n rightSlice,\n ]);\n } else if (posValue === -1) {\n const arrLen = new LengthExpr({\n this: thisNode,\n });\n const sliceEnd = new AddExpr({\n this: arrLen,\n expression: LiteralExpr.number(-1),\n });\n resultExpr = new BracketExpr({\n this: thisNode,\n expressions: [\n new SliceExpr({\n this: LiteralExpr.number(1),\n expression: sliceEnd,\n }),\n ],\n });\n } else {\n const arrLen = new LengthExpr({\n this: thisNode,\n });\n const sliceEndPos = new AddExpr({\n this: arrLen,\n expression: LiteralExpr.number(posValue),\n });\n const sliceStartPos = new AddExpr({\n this: sliceEndPos,\n expression: LiteralExpr.number(2),\n });\n\n const leftSlice = new BracketExpr({\n this: thisNode,\n expressions: [\n new SliceExpr({\n this: LiteralExpr.number(1),\n expression: sliceEndPos,\n }),\n ],\n });\n const rightSlice = new BracketExpr({\n this: thisNode,\n expressions: [\n new SliceExpr({\n this: sliceStartPos,\n }),\n ],\n });\n resultExpr = this.func('LIST_CONCAT', [\n leftSlice,\n rightSlice,\n ]);\n }\n\n return this.sql(\n new IfExpr({\n this: new IsExpr({\n this: thisNode,\n expression: null_(),\n }),\n true: null_(),\n false: resultExpr,\n }),\n );\n}\n\nfunction arraySortSql (this: Generator, expression: ArraySortExpr): string {\n if (expression.args.expression) {\n this.unsupported('DuckDB\\'s ARRAY_SORT does not support a comparator.');\n }\n return this.func('ARRAY_SORT', [\n expression.args.this,\n ]);\n}\n\nfunction sortArraySql (this: Generator, expression: SortArrayExpr): string {\n const name = expression.args.asc instanceof BooleanExpr && !(expression.args.asc as BooleanExpr).args.this\n ? 'ARRAY_REVERSE_SORT'\n : 'ARRAY_SORT';\n return this.func(name, [\n expression.args.this,\n ]);\n}\n\nfunction buildSortArrayDesc (args: Expression[]): SortArrayExpr {\n return new SortArrayExpr({\n this: seqGet(args, 0),\n asc: new BooleanExpr({\n this: false,\n }),\n });\n}\n\nfunction buildArrayPrepend (args: Expression[]): ArrayPrependExpr {\n return new ArrayPrependExpr({\n this: seqGet(args, 1),\n expression: seqGet(args, 0),\n });\n}\n\nfunction buildDateDiff (args: Expression[]): DateDiffExpr {\n return new DateDiffExpr({\n this: seqGet(args, 2),\n expression: seqGet(args, 1),\n unit: seqGet(args, 0),\n });\n}\n\nfunction buildGenerateSeries (options: {endExclusive?: boolean} = {}): (args: Expression[]) => GenerateSeriesExpr {\n const {\n endExclusive = false,\n } = options;\n return (args: Expression[]): GenerateSeriesExpr => {\n if (args.length === 1) {\n args.unshift(LiteralExpr.number('0'));\n }\n\n const genSeries = GenerateSeriesExpr.fromArgList(args);\n genSeries.setArgKey('isEndExclusive', endExclusive);\n\n return genSeries;\n };\n}\n\nfunction buildMakeTimestamp (args: Expression[]): Expression {\n if (args.length === 1) {\n return new UnixToTimeExpr({\n this: seqGet(args, 0),\n scale: UnixToTimeExpr.MICROS,\n });\n }\n\n return new TimestampFromPartsExpr({\n year: seqGet(args, 0),\n month: seqGet(args, 1),\n day: seqGet(args, 2),\n hour: seqGet(args, 3),\n min: seqGet(args, 4),\n sec: seqGet(args, 5),\n });\n}\n\nfunction showParser (...args: (Expression | string)[]): (this: Parser) => ShowExpr {\n return function (this: Parser) {\n return (this as DuckDBParser).parseShowDuckdb(args[0] as string);\n };\n}\n\nfunction structSql (this: Generator, expression: StructExpr): string {\n let ancestorCast = expression.findAncestor<CastExpr | SelectExpr>(CastExpr, SelectExpr);\n ancestorCast = ancestorCast instanceof SelectExpr ? undefined : ancestorCast;\n\n // Empty struct cast works with MAP() since DuckDB can't parse {}\n if (!expression.args.expressions || expression.args.expressions.length === 0) {\n if (ancestorCast instanceof CastExpr && isType(ancestorCast.args.to, DataTypeExprKind.MAP)) {\n return 'MAP()';\n }\n }\n\n const structArgs: string[] = [\n ];\n\n const isBqInlineStruct = (\n !expression.find(PropertyEqExpr)\n && ancestorCast instanceof CastExpr\n && [\n ...ancestorCast.findAll(DataTypeExpr),\n ].some((castedType) => isType(castedType, DataTypeExprKind.STRUCT))\n );\n\n expression.args.expressions?.forEach((expr, i) => {\n const isPropertyEq = expr instanceof PropertyEqExpr;\n const thisNode = expr.args.this;\n const value = isPropertyEq ? expr.args.expression : expr;\n\n if (isBqInlineStruct) {\n structArgs.push(this.sql(value));\n } else {\n let key: string;\n if (thisNode instanceof IdentifierExpr) {\n key = this.sql(LiteralExpr.string(expr.name));\n } else if (isPropertyEq) {\n key = this.sql((expr as PropertyEqExpr).args.this);\n } else {\n key = this.sql(LiteralExpr.string(`_${i}`));\n }\n\n structArgs.push(`${key}: ${this.sql(value)}`);\n }\n });\n\n const csvArgs = structArgs.join(', ');\n return isBqInlineStruct ? `ROW(${csvArgs})` : `{${csvArgs}}`;\n}\n\nfunction dataTypeSql (this: Generator, expression: DataTypeExpr): string {\n if (isType(expression, 'array')) {\n const base = this.expressions(expression, {\n flat: true,\n });\n const values = this.expressions(expression, {\n key: 'values',\n flat: true,\n });\n return `${base}[${values}]`;\n }\n\n if (isType(expression, [\n DataTypeExprKind.TIME,\n DataTypeExprKind.TIMETZ,\n DataTypeExprKind.TIMESTAMPTZ,\n ])) {\n const typeVal = expression.args.this;\n return typeVal instanceof Expression ? typeVal.name : (typeVal ? camelToScreamingSnakeCase(typeVal) : '');\n }\n\n return Generator.prototype.dataTypeSql.call(this, expression);\n}\n\nfunction jsonFormatSql (this: Generator, expression: JsonFormatExpr): string {\n const sql = this.func('TO_JSON', [\n expression.args.this,\n expression.args.options,\n ]);\n return `CAST(${sql} AS TEXT)`;\n}\n\n/**\n * Transpile Snowflake SEQ1/SEQ2/SEQ4/SEQ8 to DuckDB.\n * Generates monotonically increasing integers starting from 0.\n */\nfunction seqSql (this: Generator, expression: FuncExpr, byteWidth: number): string {\n const ancestor = expression.findAncestor(...SEQ_RESTRICTED);\n if (\n ancestor\n && (!(ancestor instanceof OrderExpr || ancestor instanceof SelectExpr)\n || (ancestor instanceof OrderExpr && ancestor.parent instanceof WindowExpr))\n ) {\n this.unsupported('SEQ in restricted context is not supported - use CTE or subquery');\n }\n\n const bits = byteWidth * 8;\n const maxVal = LiteralExpr.number(Math.pow(2, bits));\n\n let result: Expression;\n if (expression.name === '1') {\n const half = LiteralExpr.number(Math.pow(2, bits - 1));\n result = replacePlaceholders((this._constructor as typeof DuckDBGenerator).SEQ_SIGNED.copy(), [\n maxVal,\n half,\n ]);\n } else {\n result = replacePlaceholders((this._constructor as typeof DuckDBGenerator).SEQ_UNSIGNED.copy(), [\n maxVal,\n ]);\n }\n\n return this.sql(result);\n}\n\n/** Transpile UNIX timestamps to DuckDB timestamps with scale handling. */\nfunction unixToTimeSql (this: Generator, expression: UnixToTimeExpr): string {\n const scale = expression.args.scale;\n const scaleValue = scale?.toValue();\n let timestamp = expression.args.this;\n const targetType = expression.args.targetType;\n\n const isNtz = isType(targetType, [\n DataTypeExprKind.TIMESTAMP,\n DataTypeExprKind.TIMESTAMPNTZ,\n ]);\n\n if (scaleValue === UnixToTimeExpr.MILLIS.toValue()) {\n return this.func('EPOCH_MS', [\n timestamp,\n ]);\n }\n if (scaleValue === UnixToTimeExpr.MICROS.toValue()) {\n return this.func('MAKE_TIMESTAMP', [\n timestamp,\n ]);\n }\n\n if (scaleValue !== undefined && scaleValue !== UnixToTimeExpr.SECONDS.toValue()) {\n timestamp = new DivExpr({\n this: timestamp,\n expression: this.func('POW', [\n LiteralExpr.number(10),\n scale,\n ]),\n });\n }\n\n let toTimestamp: Expression = new AnonymousExpr({\n this: 'TO_TIMESTAMP',\n expressions: [\n timestamp ?? null_(),\n ],\n });\n\n if (isNtz) {\n toTimestamp = new AtTimeZoneExpr({\n this: toTimestamp,\n zone: LiteralExpr.string('UTC'),\n });\n }\n\n return this.sql(toTimestamp);\n}\n\nconst WRAPPED_JSON_EXTRACT_EXPRESSIONS = [\n BinaryExpr,\n BracketExpr,\n InExpr,\n NotExpr,\n];\n\n/** Wraps arrow JSON extract in parens if required by parent precedence. */\nfunction arrowJsonExtractSqlDuckDB (this: Generator, expression: JsonExtractType): string {\n let arrowSql = arrowJsonExtractSql.call(this, expression);\n if (\n !expression.sameParent\n && WRAPPED_JSON_EXTRACT_EXPRESSIONS.some((cls) => expression.parent instanceof cls)\n ) {\n arrowSql = this.wrap(arrowSql);\n }\n return arrowSql;\n}\n\n/** Infers and applies casts for string literals used in datetime functions. */\nfunction implicitDatetimeCast (\n arg: Expression | undefined,\n type: DataTypeExprKind = DataTypeExprKind.DATE,\n): Expression | undefined {\n if (arg instanceof LiteralExpr && arg.isString) {\n const ts = arg.args.this ?? '';\n let targetType = type;\n if (type === DataTypeExprKind.DATE && ts.includes(':')) {\n targetType = TIMEZONE_PATTERN.test(ts) ? DataTypeExprKind.TIMESTAMPTZ : DataTypeExprKind.TIMESTAMP;\n }\n\n return new CastExpr({\n this: arg,\n to: new DataTypeExpr({\n this: targetType,\n }),\n });\n }\n\n return arg;\n}\n\n/** Compute Monday-based day shift for WEEK units. */\nfunction weekUnitToDow (unit: Expression | undefined): number | undefined {\n if (unit instanceof VarExpr && unit.name.toUpperCase() === 'ISOWEEK') {\n return 1;\n }\n\n if (unit instanceof WeekStartExpr) {\n return WEEK_START_DAY_TO_DOW[unit.name.toUpperCase()];\n }\n\n return undefined;\n}\n\n/** Custom DATE_TRUNC logic for non-Monday week starts. */\nfunction buildWeekTruncExpression (dateExpr: Expression, startDow: number): Expression {\n const shiftDays = startDow === 7 ? 1 : 1 - startDow;\n\n const shiftedDate =\n shiftDays !== 0\n ? new DateAddExpr({\n this: dateExpr,\n expression: new IntervalExpr({\n this: LiteralExpr.string(shiftDays.toString()),\n unit: new VarExpr({\n this: 'DAY',\n }),\n }),\n })\n : dateExpr;\n\n return new DateTruncExpr({\n unit: new VarExpr({\n this: 'WEEK',\n }),\n this: shiftedDate,\n });\n}\n\n/** Transpile DATE_DIFF with boundary-aware week logic. */\nfunction dateDiffSql (this: Generator, expression: DateDiffExpr): string {\n const unit = expression.args.unit;\n\n if (isNanosecondUnit(unit)) {\n return handleNanosecondDiff.call(this, expression.args.this ?? null_(), expression.args.expression ?? null_());\n }\n\n let thisNode = implicitDatetimeCast(expression.args.this);\n let exprNode = implicitDatetimeCast(expression.args.expression);\n\n const datePartBoundary = expression.args.datePartBoundary;\n const weekStart = weekUnitToDow(unit);\n\n if (datePartBoundary && weekStart !== undefined && thisNode && exprNode) {\n expression.setArgKey('unit', LiteralExpr.string('WEEK'));\n\n thisNode = buildWeekTruncExpression(thisNode, weekStart);\n exprNode = buildWeekTruncExpression(exprNode, weekStart);\n }\n\n return this.func('DATE_DIFF', [\n unitToStr(expression),\n exprNode,\n thisNode,\n ]);\n}\n\n/** BQ's GENERATE_DATE_ARRAY & GENERATE_TIMESTAMP_ARRAY transformed to DuckDB'S GENERATE_SERIES */\nfunction generateDatetimeArraySql (\n this: Generator,\n expression: GenerateDateArrayExpr | GenerateTimestampArrayExpr,\n): string {\n const isGenerateDateArray = expression instanceof GenerateDateArrayExpr;\n\n const type = isGenerateDateArray ? DataTypeExprKind.DATE : DataTypeExprKind.TIMESTAMP;\n const start = implicitDatetimeCast(expression.args.start, type);\n const end = implicitDatetimeCast(expression.args.end, type);\n\n let genSeries: Expression = new GenerateSeriesExpr({\n start: start,\n end: end,\n step: expression.args.step,\n });\n\n if (isGenerateDateArray) {\n // Cast TIMESTAMP array result back to DATE array for BQ semantics\n genSeries = new CastExpr({\n this: genSeries,\n to: DataTypeExpr.build('ARRAY<DATE>'),\n });\n }\n\n return this.sql(genSeries);\n}\n\nfunction jsonExtractValueArraySql (\n this: Generator,\n expression: JsonValueArrayExpr | JsonExtractArrayExpr,\n): string {\n const jsonExtractExpr = expression.args.expression instanceof Expression ? expression.args.expression : undefined;\n const jsonExtract = new JsonExtractExpr({\n this: expression.args.this,\n expression: jsonExtractExpr,\n });\n const dataType = expression instanceof JsonValueArrayExpr ? 'ARRAY<STRING>' : 'ARRAY<JSON>';\n return this.sql(new CastExpr({\n this: jsonExtract,\n to: DataTypeExpr.build(dataType),\n }));\n}\n\nfunction castToVarchar (arg: ExpressionValue | undefined): Expression | undefined {\n if (arg === undefined) {\n return undefined;\n }\n if (arg instanceof Expression && arg.type && !isType(arg, [\n ...DataTypeExpr.TEXT_TYPES,\n DataTypeExprKind.UNKNOWN,\n ])) {\n return new CastExpr({\n this: arg,\n to: new DataTypeExpr({\n this: DataTypeExprKind.VARCHAR,\n }),\n });\n }\n if (arg instanceof Expression) {\n return arg;\n }\n return LiteralExpr.string(arg.toString());\n}\n\nfunction castToBoolean (arg: Expression | undefined): Expression | undefined {\n if (arg && !isType(arg, DataTypeExprKind.BOOLEAN)) {\n return new CastExpr({\n this: arg,\n to: new DataTypeExpr({\n this: DataTypeExprKind.BOOLEAN,\n }),\n });\n }\n return arg;\n}\n\nfunction isBinary (arg: unknown): boolean {\n return isType(arg, [\n DataTypeExprKind.BINARY,\n DataTypeExprKind.VARBINARY,\n DataTypeExprKind.BLOB,\n ]);\n}\n\nfunction genWithCastToBlob (this: Generator, expression: Expression, resultSql: string): string {\n if (isBinary(expression)) {\n const blob = DataTypeExpr.build('BLOB', {\n dialect: 'duckdb',\n });\n resultSql = this.sql(new CastExpr({\n this: resultSql,\n to: blob,\n }));\n }\n return resultSql;\n}\n\nfunction castToBit (arg: Expression): Expression {\n if (!isBinary(arg)) return arg;\n\n let node = arg;\n if (arg instanceof HexStringExpr) {\n node = new UnhexExpr({\n this: LiteralExpr.string(arg.args.this!),\n });\n }\n\n return new CastExpr({\n this: node,\n to: new DataTypeExpr({\n this: DataTypeExprKind.BIT,\n }),\n });\n}\n\nfunction prepareBinaryBitwiseArgs (expression: BinaryExpr): void {\n if (expression.args.this instanceof Expression && isBinary(expression.args.this)) {\n expression.setArgKey('this', castToBit(expression.args.this));\n }\n if (expression.args.expression instanceof Expression && isBinary(expression.args.expression)) {\n expression.setArgKey('expression', castToBit(expression.args.expression));\n }\n}\n\n/** Transpile Snowflake's NEXT_DAY / PREVIOUS_DAY using formulas and ISODOW */\nfunction dayNavigationSql (this: Generator, expression: NextDayExpr | PreviousDayExpr): string {\n const dateExpr = expression.args.this;\n const dayNameExpr = expression.args.expression;\n const isodowCall = this.func('ISODOW', [\n dateExpr,\n ]);\n\n let targetDow: Expression;\n\n if (dayNameExpr instanceof LiteralExpr) {\n const dayNameStr = (dayNameExpr.args.this ?? '').toUpperCase();\n const matchingDay = Object.keys(WEEK_START_DAY_TO_DOW).find((day) =>\n day.startsWith(dayNameStr));\n\n if (matchingDay) {\n targetDow = LiteralExpr.number(WEEK_START_DAY_TO_DOW[matchingDay]);\n } else {\n return this.functionFallbackSql(expression);\n }\n } else {\n const upperDayName = new UpperExpr({\n this: dayNameExpr,\n });\n targetDow = new CaseExpr({\n ifs: Object.entries(WEEK_START_DAY_TO_DOW).map(\n ([\n day,\n dowNum,\n ]) =>\n new IfExpr({\n this: this.func('STARTS_WITH', [\n upperDayName.copy(),\n LiteralExpr.string(day.substring(0, 2)),\n ]),\n true: LiteralExpr.number(dowNum),\n }),\n ),\n });\n }\n\n let dateWithOffset: Expression;\n if (expression instanceof NextDayExpr) {\n // (target_dow - current_dow + 6) % 7 + 1\n const daysOffset = new ModExpr({\n this: new ParenExpr({\n this: new AddExpr({\n this: new SubExpr({\n this: targetDow,\n expression: isodowCall,\n }),\n expression: LiteralExpr.number(6),\n }),\n }),\n expression: LiteralExpr.number(7),\n }).add(1);\n dateWithOffset = new AddExpr({\n this: dateExpr,\n expression: new IntervalExpr({\n this: daysOffset,\n unit: new VarExpr({\n this: 'DAY',\n }),\n }),\n });\n } else {\n // (current_dow - target_dow + 6) % 7 + 1\n const daysOffset = new ModExpr({\n this: new ParenExpr({\n this: new AddExpr({\n this: new SubExpr({\n this: isodowCall,\n expression: targetDow,\n }),\n expression: LiteralExpr.number(6),\n }),\n }),\n expression: LiteralExpr.number(7),\n }).add(1);\n dateWithOffset = new SubExpr({\n this: dateExpr,\n expression: new IntervalExpr({\n this: daysOffset,\n unit: new VarExpr({\n this: 'DAY',\n }),\n }),\n });\n }\n\n return this.sql(new CastExpr({\n this: dateWithOffset,\n to: new DataTypeExpr({\n this: DataTypeExprKind.DATE,\n }),\n }));\n}\n\nfunction anyValueSql (this: Generator, expression: AnyValueExpr): string {\n const having = expression.args.this;\n if (having instanceof HavingMaxExpr) {\n const funcName = having.args.max ? 'ARG_MAX_NULL' : 'ARG_MIN_NULL';\n return this.func(funcName, [\n having.args.this,\n having.args.expression,\n ]);\n }\n return this.functionFallbackSql(expression);\n}\n\n/** Cast non-integer types to INT for bitwise aggregates */\nfunction bitwiseAggSql (\n this: Generator,\n expression: BitwiseOrAggExpr | BitwiseAndAggExpr | BitwiseXorAggExpr,\n): string {\n let funcName = 'BIT_XOR';\n if (expression instanceof BitwiseOrAggExpr) funcName = 'BIT_OR';\n else if (expression instanceof BitwiseAndAggExpr) funcName = 'BIT_AND';\n\n let arg = expression.args.this;\n\n if (isType(arg, [\n ...DataTypeExpr.REAL_TYPES,\n ...DataTypeExpr.TEXT_TYPES,\n ])) {\n if (isType(arg, DataTypeExpr.FLOAT_TYPES)) {\n arg = this.func('ROUND', [\n arg,\n ]);\n }\n arg = new CastExpr({\n this: arg,\n to: new DataTypeExpr({\n this: DataTypeExprKind.INT,\n }),\n });\n }\n\n return this.func(funcName, [\n arg,\n ]);\n}\n\nfunction literalSqlWithWsChr (this: Generator, literal: string): string {\n /**\n * DuckDB does not support \\uXXXX escapes.\n * Uses CHR() for control characters in WS_CONTROL_CHARS_TO_DUCK.\n */\n const chars = literal.split('');\n if (!chars.some((ch) => ch in WS_CONTROL_CHARS_TO_DUCK)) {\n return this.sql(LiteralExpr.string(literal));\n }\n\n const sqlSegments: string[] = [\n ];\n let currentGroup: string[] = [\n ];\n let isWsGroup = false;\n\n for (const ch of chars) {\n const isWs = ch in WS_CONTROL_CHARS_TO_DUCK;\n if (isWs !== isWsGroup) {\n if (0 < currentGroup.length) {\n if (isWsGroup) {\n currentGroup.forEach((c) =>\n sqlSegments.push(this.func('CHR', [\n LiteralExpr.number(WS_CONTROL_CHARS_TO_DUCK[c]),\n ])));\n } else {\n sqlSegments.push(this.sql(LiteralExpr.string(currentGroup.join(''))));\n }\n }\n currentGroup = [\n ];\n isWsGroup = isWs;\n }\n currentGroup.push(ch);\n }\n\n // Handle final group\n if (0 < currentGroup.length) {\n if (isWsGroup) {\n currentGroup.forEach((c) =>\n sqlSegments.push(this.func('CHR', [\n LiteralExpr.number(WS_CONTROL_CHARS_TO_DUCK[c]),\n ])));\n } else {\n sqlSegments.push(this.sql(LiteralExpr.string(currentGroup.join(''))));\n }\n }\n\n const sql = sqlSegments.join(' || ');\n return sqlSegments.length === 1 ? sql : `(${sql})`;\n}\n\nfunction escapeRegexMetachars (\n this: Generator,\n delimiters: Expression | undefined,\n delimitersSql: string,\n): string {\n /** Escapes regex metachars \\ - ^ [ ] for INITCAP character classes. */\n if (!delimiters) return delimitersSql;\n\n if (delimiters instanceof LiteralExpr && delimiters.isString) {\n const literalValue = delimiters.args.this ?? '';\n const escapedLiteral = literalValue\n .split('')\n .map((ch) => REGEX_ESCAPE_REPLACEMENTS[ch] ?? ch)\n .join('');\n return literalSqlWithWsChr.call(this, escapedLiteral);\n }\n\n let escapedSql = delimitersSql;\n Object.entries(REGEX_ESCAPE_REPLACEMENTS).forEach(([\n raw,\n escaped,\n ]) => {\n escapedSql = this.func('REPLACE', [\n escapedSql,\n this.sql(LiteralExpr.string(raw)),\n this.sql(LiteralExpr.string(escaped)),\n ]);\n });\n\n return escapedSql;\n}\n\nfunction buildCapitalizationSql (this: Generator, valueToSplit: string, delimitersSql: string): string {\n /** Implements custom INITCAP logic using REGEXP_EXTRACT_ALL and LIST_TRANSFORM. */\n if (delimitersSql === '\\'\\'') {\n return `UPPER(LEFT(${valueToSplit}, 1)) || LOWER(SUBSTRING(${valueToSplit}, 2))`;\n }\n\n const delimRegexSql = `CONCAT('[', ${delimitersSql}, ']')`;\n const splitRegexSql = `CONCAT('([', ${delimitersSql}, ']+|[^', ${delimitersSql}, ']+)')`;\n\n return this.func('ARRAY_TO_STRING', [\n new CaseExpr({})\n .when(\n `REGEXP_MATCHES(LEFT(${valueToSplit}, 1), ${delimRegexSql})`,\n this.func('LIST_TRANSFORM', [\n this.func('REGEXP_EXTRACT_ALL', [\n valueToSplit,\n splitRegexSql,\n ]),\n '(seg, idx) -> CASE WHEN idx % 2 = 0 THEN UPPER(LEFT(seg, 1)) || LOWER(SUBSTRING(seg, 2)) ELSE seg END',\n ]),\n )\n .else(\n this.func('LIST_TRANSFORM', [\n this.func('REGEXP_EXTRACT_ALL', [\n valueToSplit,\n splitRegexSql,\n ]),\n '(seg, idx) -> CASE WHEN idx % 2 = 1 THEN UPPER(LEFT(seg, 1)) || LOWER(SUBSTRING(seg, 2)) ELSE seg END',\n ]),\n ),\n '\\'\\'',\n ]);\n}\n\nfunction initcapSql (this: Generator, expression: InitcapExpr): string {\n const thisSql = this.sql(expression, 'this');\n let delimiters = expression.args.expression;\n if (!delimiters) {\n delimiters = LiteralExpr.string(this.dialect._constructor.INITCAP_DEFAULT_DELIMITER_CHARS);\n }\n const delimitersSql = this.sql(delimiters);\n const escapedDelimitersSql = escapeRegexMetachars.call(this, delimiters, delimitersSql);\n\n return buildCapitalizationSql.call(this, thisSql, escapedDelimitersSql);\n}\n\nfunction boolxorAggSql (this: Generator, expression: BoolxorAggExpr): string {\n /** Mimics Snowflake BOOLXOR_AGG by generating COUNT_IF(col) = 1. */\n return this.sql(\n new EqExpr({\n this: castToBoolean(expression.args.this as Expression) ?? expression.args.this,\n expression: LiteralExpr.number(1),\n }),\n );\n}\n\nfunction bitshiftSql (this: Generator, expression: BitwiseLeftShiftExpr | BitwiseRightShiftExpr): string {\n /** Transforms bitshift for DuckDB injecting BIT/INT128 casts and fixing precedence. */\n const operator = expression instanceof BitwiseLeftShiftExpr ? '<<' : '>>';\n let resultIsBlob = false;\n const thisNode = expression.args.this;\n\n if (thisNode instanceof Expression && isBinary(thisNode)) {\n resultIsBlob = true;\n expression.setArgKey('this', new CastExpr({\n this: thisNode,\n to: new DataTypeExpr({\n this: DataTypeExprKind.BIT,\n }),\n }));\n } else if (expression.args.requiresInt128 && thisNode instanceof Expression) {\n thisNode.replace(new CastExpr({\n this: thisNode,\n to: new DataTypeExpr({\n this: DataTypeExprKind.INT128,\n }),\n }));\n }\n\n let resultSql = this.binary(expression, operator);\n\n if (expression.parent instanceof BinaryExpr) {\n resultSql = `(${resultSql})`;\n }\n\n if (resultIsBlob) {\n resultSql = this.sql(new CastExpr({\n this: resultSql,\n to: DataTypeExpr.build('BLOB', {\n dialect: 'duckdb',\n }),\n }));\n }\n\n return resultSql;\n}\n\nfunction scaleRoundingSql (\n this: Generator,\n expression: CeilExpr | FloorExpr | RoundExpr | TruncExpr,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RoundingFuncClass: new (args: any) => Expression,\n): string | undefined {\n /** Handle scale parameter: FUNC(x, n) -> ROUND(FUNC(x * 10^n) / 10^n, n) */\n const decimals = expression.args.decimals;\n\n if (!decimals || expression.args.to !== undefined) {\n return undefined;\n }\n\n let thisNode = expression.args.this;\n if (thisNode instanceof BinaryExpr) {\n thisNode = new ParenExpr({\n this: thisNode,\n });\n }\n\n const nInt = decimals instanceof LiteralExpr && (decimals.isNumber || decimals.isInteger)\n ? decimals\n : new CastExpr({\n this: decimals,\n to: new DataTypeExpr({\n this: DataTypeExprKind.INT,\n }),\n });\n\n const pow = new PowExpr({\n this: LiteralExpr.number('10'),\n expression: nInt,\n });\n const rounded = new RoundingFuncClass({\n this: new MulExpr({\n this: thisNode,\n expression: pow,\n }),\n });\n const result = new DivExpr({\n this: rounded,\n expression: pow.copy(),\n });\n\n return (this as DuckDBGenerator).roundSql(\n new RoundExpr({\n this: result,\n decimals,\n castsNonIntegerDecimals: true,\n }),\n );\n}\n\nfunction ceilFloor (this: Generator, expression: FloorExpr | CeilExpr): string {\n const scaledSql = scaleRoundingSql.call(this, expression, expression._constructor);\n if (scaledSql !== undefined) {\n return scaledSql;\n }\n return this.ceilFloor(expression);\n}\n\n/**\n * Transpile Snowflake's REGR_VALX/REGR_VALY to DuckDB equivalent.\n * REGR_VALX(y, x) returns NULL if y is NULL; otherwise returns x.\n */\nfunction regrValSql (this: Generator, expression: RegrValxExpr | RegrValyExpr): string {\n const y = expression.args.this ?? null_();\n const x = expression.args.expression ?? null_();\n\n let checkForNull: Expression;\n let returnValue: Expression;\n let returnValueAttr: string;\n\n if (expression instanceof RegrValxExpr) {\n checkForNull = y;\n returnValue = x;\n returnValueAttr = 'expression';\n } else {\n checkForNull = x;\n returnValue = y;\n returnValueAttr = 'this';\n }\n\n let resultType = returnValue.type;\n\n // Infer types if unknown\n if (!resultType || typeof resultType === 'string' || resultType.args.this === DataTypeExprKind.UNKNOWN) {\n try {\n const annotated = annotateTypes(expression.copy(), {\n dialect: this.dialect,\n });\n const annotatedArg = annotated.args[returnValueAttr as keyof typeof annotated.args];\n resultType = annotatedArg instanceof Expression ? annotatedArg.type : undefined;\n } catch {\n // ignore\n }\n }\n\n // Default to DOUBLE for regression if still unknown\n if (!resultType || typeof resultType === 'string' || resultType.args.this === DataTypeExprKind.UNKNOWN) {\n resultType = DataTypeExpr.build('DOUBLE');\n }\n\n const typedNull = new CastExpr({\n this: null_(),\n to: resultType,\n });\n\n return this.sql(\n new IfExpr({\n this: new IsExpr({\n this: checkForNull.copy(),\n expression: null_(),\n }),\n true: typedNull,\n false: returnValue.copy(),\n }),\n );\n}\n\nfunction maybeCorrNullToFalse (\n expression: FilterExpr | WindowExpr | CorrExpr,\n): FilterExpr | WindowExpr | CorrExpr | undefined {\n let corr: Expression = expression;\n while (corr instanceof WindowExpr || corr instanceof FilterExpr) {\n corr = corr.args.this ?? null_();\n }\n\n if (!(corr instanceof CorrExpr) || !corr.args.nullOnZeroVariance) {\n return undefined;\n }\n\n corr.setArgKey('nullOnZeroVariance', false);\n return expression;\n}\n\nfunction dateFromPartsSql (this: Generator, expression: DateFromPartsExpr): string {\n /**\n * DuckDB's MAKE_DATE doesn't support overflow.\n * Formula: MAKE_DATE(year, 1, 1) + (month-1) MONTHS + (day-1) DAYS\n */\n const yearExpr = expression.args.year;\n const monthExpr = expression.args.month;\n const dayExpr = expression.args.day;\n\n if (expression.args.allowOverflow) {\n let baseDate: Expression = new AnonymousExpr({\n this: 'MAKE_DATE',\n expressions: [\n yearExpr ?? null_(),\n LiteralExpr.number(1),\n LiteralExpr.number(1),\n ],\n });\n\n if (monthExpr) {\n baseDate = new AddExpr({\n this: baseDate,\n expression: new IntervalExpr({\n this: new SubExpr({\n this: monthExpr,\n expression: LiteralExpr.number(1),\n }),\n unit: new VarExpr({\n this: 'MONTH',\n }),\n }),\n });\n }\n\n if (dayExpr) {\n baseDate = new AddExpr({\n this: baseDate,\n expression: new IntervalExpr({\n this: new SubExpr({\n this: dayExpr,\n expression: LiteralExpr.number(1),\n }),\n unit: new VarExpr({\n this: 'DAY',\n }),\n }),\n });\n }\n\n return this.sql(new CastExpr({\n this: baseDate,\n to: new DataTypeExpr({\n this: DataTypeExprKind.DATE,\n }),\n }));\n }\n\n return this.func('MAKE_DATE', [\n yearExpr,\n monthExpr,\n dayExpr,\n ]);\n}\n\nfunction roundArg (arg: Expression, roundInput?: Expression | boolean): Expression {\n if (roundInput) {\n return new RoundExpr({\n this: arg,\n decimals: LiteralExpr.number(0),\n });\n }\n return arg;\n}\n\nfunction boolnotSql (this: Generator, expression: BoolnotExpr): string {\n const arg = roundArg(expression.args.this ?? null_(), expression.args.roundInput);\n return this.sql(new NotExpr({\n this: new ParenExpr({\n this: arg,\n }),\n }));\n}\n\nfunction boolandSql (this: Generator, expression: BoolandExpr): string {\n const roundInput = expression.args.roundInput;\n const left = roundArg(expression.args.this ?? null_(), roundInput);\n const right = roundArg(expression.args.expression ?? null_(), roundInput);\n return this.sql(\n new ParenExpr({\n this: new AndExpr({\n this: new ParenExpr({\n this: left,\n }),\n expression: new ParenExpr({\n this: right,\n }),\n }),\n }),\n );\n}\n\nfunction boolorSql (this: Generator, expression: BoolorExpr): string {\n const roundInput = expression.args.roundInput;\n const left = roundArg(expression.args.this ?? null_(), roundInput);\n const right = roundArg(expression.args.expression ?? null_(), roundInput);\n return this.sql(\n new ParenExpr({\n this: new OrExpr({\n this: new ParenExpr({\n this: left,\n }),\n expression: new ParenExpr({\n this: right,\n }),\n }),\n }),\n );\n}\n\nfunction xorSql (this: Generator, expression: XorExpr): string {\n const roundInput = expression.args.roundInput;\n const left = expression.args.this && roundArg(expression.args.this, roundInput);\n const right = expression.args.expression && roundArg(expression.args.expression, roundInput);\n\n const leftNot = new NotExpr({\n this: new ParenExpr({\n this: left?.copy(),\n }),\n });\n const rightNot = new NotExpr({\n this: new ParenExpr({\n this: right?.copy(),\n }),\n });\n\n return this.sql(\n new OrExpr({\n this: new ParenExpr({\n this: new AndExpr({\n this: left?.copy(),\n expression: rightNot,\n }),\n }),\n expression: new ParenExpr({\n this: new AndExpr({\n this: leftNot,\n expression: right?.copy(),\n }),\n }),\n }),\n );\n}\n\nfunction shaSql (\n this: Generator,\n expression: ShaExpr,\n hashFunc: string,\n options: {isBinary?: boolean} = {},\n): string {\n const {\n isBinary: _isBinary = false,\n } = options;\n let arg = expression.args.this;\n\n if (hashFunc === 'SHA256') {\n const length = expression.text('length') || '256';\n if (length !== '256') {\n this.unsupported('DuckDB only supports SHA256 hashing algorithm.');\n }\n }\n\n if (\n arg instanceof Expression\n && arg.type\n && (!(arg.type instanceof Expression) || arg.type.args.this !== DataTypeExprKind.UNKNOWN)\n && !arg.isType(DataTypeExpr.TEXT_TYPES)\n && !isBinary(arg)\n ) {\n arg = new CastExpr({\n this: arg,\n to: new DataTypeExpr({\n this: DataTypeExprKind.VARCHAR,\n }),\n });\n }\n\n const result = this.func(hashFunc, [\n arg,\n ]);\n return _isBinary\n ? this.func('UNHEX', [\n result,\n ])\n : result;\n}\n\nclass DuckDBTokenizer extends Tokenizer {\n @cache\n static get BYTE_STRINGS (): TokenPair[] {\n return [\n [\n 'e\\'',\n '\\'',\n ],\n [\n 'E\\'',\n '\\'',\n ],\n ] as TokenPair[];\n }\n\n @cache\n static get BYTE_STRING_ESCAPES () {\n return [\n '\\'',\n '\\\\',\n ];\n }\n\n @cache\n static get HEREDOC_STRINGS () {\n return [\n '$',\n ];\n }\n\n static HEREDOC_TAG_IS_IDENTIFIER = true;\n static HEREDOC_STRING_ALTERNATIVE = TokenType.PARAMETER;\n\n @cache\n static get ORIGINAL_KEYWORDS (): Record<string, TokenType> {\n const keywords: Record<string, TokenType> = {\n ...Tokenizer.KEYWORDS,\n '//': TokenType.DIV,\n '**': TokenType.DSTAR,\n '^@': TokenType.CARET_AT,\n '@>': TokenType.AT_GT,\n '<@': TokenType.LT_AT,\n 'ATTACH': TokenType.ATTACH,\n 'BINARY': TokenType.VARBINARY,\n 'BITSTRING': TokenType.BIT,\n 'BPCHAR': TokenType.TEXT,\n 'CHAR': TokenType.TEXT,\n 'DATETIME': TokenType.TIMESTAMPNTZ,\n 'DETACH': TokenType.DETACH,\n 'FORCE': TokenType.FORCE,\n 'INSTALL': TokenType.INSTALL,\n 'INT8': TokenType.BIGINT,\n 'LOGICAL': TokenType.BOOLEAN,\n 'MACRO': TokenType.FUNCTION,\n 'ONLY': TokenType.ONLY,\n 'PIVOT_WIDER': TokenType.PIVOT,\n 'POSITIONAL': TokenType.POSITIONAL,\n 'RESET': TokenType.COMMAND,\n 'ROW': TokenType.STRUCT,\n 'SIGNED': TokenType.INT,\n 'STRING': TokenType.TEXT,\n 'SUMMARIZE': TokenType.SUMMARIZE,\n 'TIMESTAMP': TokenType.TIMESTAMPNTZ,\n 'TIMESTAMP_S': TokenType.TIMESTAMP_S,\n 'TIMESTAMP_MS': TokenType.TIMESTAMP_MS,\n 'TIMESTAMP_NS': TokenType.TIMESTAMP_NS,\n 'TIMESTAMP_US': TokenType.TIMESTAMP,\n 'UBIGINT': TokenType.UBIGINT,\n 'UINTEGER': TokenType.UINT,\n 'USMALLINT': TokenType.USMALLINT,\n 'UTINYINT': TokenType.UTINYINT,\n 'VARCHAR': TokenType.TEXT,\n };\n delete keywords['/*+'];\n return keywords;\n }\n\n @cache\n static get SINGLE_TOKENS () {\n return {\n ...Tokenizer.SINGLE_TOKENS,\n $: TokenType.PARAMETER,\n };\n }\n\n @cache\n static get COMMANDS (): Set<TokenType> {\n const commands = new Set(Tokenizer.COMMANDS);\n commands.delete(TokenType.SHOW);\n return commands;\n }\n}\n\nclass DuckDBParser extends Parser {\n // port from _Dialect metaclass logic\n @cache\n static get NO_PAREN_FUNCTIONS () {\n const noParenFunctions = {\n ...Parser.NO_PAREN_FUNCTIONS,\n };\n noParenFunctions[TokenType.SESSION_USER] = SessionUserExpr;\n noParenFunctions[TokenType.CURRENT_CATALOG] = CurrentCatalogExpr;\n return noParenFunctions;\n }\n\n static MAP_KEYS_ARE_ARBITRARY_EXPRESSIONS = true;\n\n @cache\n static get BITWISE (): Partial<Record<TokenType, typeof Expression>> {\n return (() => {\n const bitwise = {\n ...Parser.BITWISE,\n };\n delete bitwise[TokenType.CARET];\n return bitwise;\n })();\n }\n\n @cache\n static get RANGE_PARSERS (): Partial<Record<TokenType, (this: Parser, this_: Expression) => Expression | undefined>> {\n return {\n ...Parser.RANGE_PARSERS,\n [TokenType.DAMP]: binaryRangeParser(ArrayOverlapsExpr),\n [TokenType.CARET_AT]: binaryRangeParser(StartsWithExpr),\n [TokenType.TILDE]: binaryRangeParser(RegexpFullMatchExpr),\n };\n }\n\n @cache\n static get EXPONENT (): Partial<Record<TokenType, typeof Expression>> {\n return {\n ...Parser.EXPONENT,\n [TokenType.CARET]: PowExpr,\n [TokenType.DSTAR]: PowExpr,\n };\n }\n\n @cache\n static get FUNCTIONS_WITH_ALIASED_ARGS (): Set<string> {\n return new Set([\n ...Parser.FUNCTIONS_WITH_ALIASED_ARGS,\n 'STRUCT_PACK',\n ]);\n }\n\n @cache\n static get SHOW_PARSERS () {\n return {\n 'TABLES': showParser('TABLES'),\n 'ALL TABLES': showParser('ALL TABLES'),\n };\n }\n\n @cache\n static get FUNCTIONS (): Record<string, (args: Expression[], options: {dialect: Dialect}) => Expression> {\n return (() => {\n const functions: Record<string, (args: Expression[], options: {dialect: Dialect}) => Expression> = {\n ...Parser.FUNCTIONS,\n ANY_VALUE: (args: Expression[]) => new IgnoreNullsExpr({\n this: AnyValueExpr.fromArgList(args),\n }),\n APPROX_QUANTILE: (args: unknown[]) => ApproxQuantileExpr.fromArgList(args),\n ARRAY_PREPEND: buildArrayPrepend,\n ARRAY_REVERSE_SORT: buildSortArrayDesc,\n ARRAY_SORT: (args: unknown[]) => SortArrayExpr.fromArgList(args),\n BIT_AND: (args: unknown[]) => BitwiseAndAggExpr.fromArgList(args),\n BIT_OR: (args: unknown[]) => BitwiseOrAggExpr.fromArgList(args),\n BIT_XOR: (args: unknown[]) => BitwiseXorAggExpr.fromArgList(args),\n DATEDIFF: buildDateDiff,\n DATE_DIFF: buildDateDiff,\n DATE_TRUNC: (args: Expression[]) => dateTruncToTime([\n seqGet(args, 0),\n seqGet(args, 1),\n ]),\n DATETRUNC: (args: Expression[]) => dateTruncToTime([\n seqGet(args, 0),\n seqGet(args, 1),\n ]),\n DECODE: (args: Expression[]) => new DecodeExpr({\n this: seqGet(args, 0),\n charset: LiteralExpr.string('utf-8'),\n }),\n EDITDIST3: (args: unknown[]) => LevenshteinExpr.fromArgList(args),\n JARO_WINKLER_SIMILARITY: (args: unknown[]) => JarowinklerSimilarityExpr.fromArgList(args),\n ENCODE: (args: Expression[]) => new EncodeExpr({\n this: seqGet(args, 0),\n charset: LiteralExpr.string('utf-8'),\n }),\n EPOCH: (args: unknown[]) => TimeToUnixExpr.fromArgList(args),\n EPOCH_MS: (args: Expression[]) => new UnixToTimeExpr({\n this: seqGet(args, 0),\n scale: UnixToTimeExpr.MILLIS,\n }),\n GENERATE_SERIES: buildGenerateSeries(),\n GET_BIT: (args: Expression[]) => new GetbitExpr({\n this: seqGet(args, 0),\n expression: seqGet(args, 1),\n zeroIsMsb: true,\n }),\n JSON: (args: unknown[]) => ParseJsonExpr.fromArgList(args),\n JSON_EXTRACT_PATH: buildExtractJsonWithPath(JsonExtractExpr),\n JSON_EXTRACT_STRING: buildExtractJsonWithPath(JsonExtractScalarExpr),\n LIST_APPEND: (args: unknown[]) => ArrayAppendExpr.fromArgList(args),\n LIST_CONCAT: buildArrayConcat,\n LIST_CONTAINS: (args: unknown[]) => ArrayContainsExpr.fromArgList(args),\n LIST_COSINE_DISTANCE: (args: unknown[]) => CosineDistanceExpr.fromArgList(args),\n LIST_DISTANCE: (args: unknown[]) => EuclideanDistanceExpr.fromArgList(args),\n LIST_FILTER: (args: unknown[]) => ArrayFilterExpr.fromArgList(args),\n LIST_HAS: (args: unknown[]) => ArrayContainsExpr.fromArgList(args),\n LIST_HAS_ANY: (args: unknown[]) => ArrayOverlapsExpr.fromArgList(args),\n LIST_PREPEND: buildArrayPrepend,\n LIST_REVERSE_SORT: buildSortArrayDesc,\n LIST_SORT: (args: unknown[]) => SortArrayExpr.fromArgList(args),\n LIST_TRANSFORM: (args: unknown[]) => TransformExpr.fromArgList(args),\n LIST_VALUE: (args: Expression[]) => new ArrayExpr({\n expressions: args,\n }),\n MAKE_DATE: (args: unknown[]) => DateFromPartsExpr.fromArgList(args),\n MAKE_TIME: (args: unknown[]) => TimeFromPartsExpr.fromArgList(args),\n MAKE_TIMESTAMP: buildMakeTimestamp,\n QUANTILE_CONT: (args: unknown[]) => PercentileContExpr.fromArgList(args),\n QUANTILE_DISC: (args: unknown[]) => PercentileDiscExpr.fromArgList(args),\n RANGE: buildGenerateSeries({\n endExclusive: true,\n }),\n REGEXP_EXTRACT: buildRegexpExtract(RegexpExtractExpr),\n REGEXP_EXTRACT_ALL: buildRegexpExtract(RegexpExtractAllExpr),\n REGEXP_MATCHES: (args: unknown[]) => RegexpLikeExpr.fromArgList(args),\n REGEXP_REPLACE: (args: Expression[]) => new RegexpReplaceExpr({\n this: seqGet(args, 0),\n expression: seqGet(args, 1),\n replacement: seqGet(args, 2),\n modifiers: seqGet(args, 3),\n singleReplace: true,\n }),\n SHA256: (args: Expression[]) => new Sha2Expr({\n this: seqGet(args, 0),\n length: LiteralExpr.number(256),\n }),\n STRFTIME: buildFormattedTime(TimeToStrExpr, {\n dialect: 'duckdb',\n }),\n STRING_SPLIT: (args: unknown[]) => SplitExpr.fromArgList(args),\n STRING_SPLIT_REGEX: (args: unknown[]) => RegexpSplitExpr.fromArgList(args),\n STRING_TO_ARRAY: (args: unknown[]) => SplitExpr.fromArgList(args),\n STRPTIME: buildFormattedTime(StrToTimeExpr, {\n dialect: 'duckdb',\n }),\n STRUCT_PACK: (args: unknown[]) => StructExpr.fromArgList(args),\n STR_SPLIT: (args: unknown[]) => SplitExpr.fromArgList(args),\n STR_SPLIT_REGEX: (args: unknown[]) => RegexpSplitExpr.fromArgList(args),\n TIME_BUCKET: (args: unknown[]) => DateBinExpr.fromArgList(args),\n TO_TIMESTAMP: (args: unknown[]) => UnixToTimeExpr.fromArgList(args),\n UNNEST: (args: unknown[]) => ExplodeExpr.fromArgList(args),\n VERSION: (args: unknown[]) => CurrentVersionExpr.fromArgList(args),\n XOR: binaryFromFunction(BitwiseXorExpr),\n };\n\n delete functions['DATE_SUB'];\n delete functions['GLOB'];\n return functions;\n })();\n }\n\n @cache\n static get FUNCTION_PARSERS (): Partial<Record<string, (this: Parser) => Expression | undefined>> {\n return (() => {\n const parsers = {\n ...Parser.FUNCTION_PARSERS,\n ...Object.fromEntries(\n [\n 'GROUP_CONCAT',\n 'LISTAGG',\n 'STRINGAGG',\n ].map((key) => [\n key,\n function (this: Parser) {\n return (this as DuckDBParser).parseStringAgg();\n },\n ]),\n ),\n };\n delete parsers['DECODE'];\n return parsers;\n })();\n }\n\n @cache\n static get NO_PAREN_FUNCTION_PARSERS (): Partial<Record<string, (this: Parser) => Expression | undefined>> {\n return {\n ...Parser.NO_PAREN_FUNCTION_PARSERS,\n 'MAP': function (this: Parser) {\n return (this as DuckDBParser).parseMap();\n },\n '@': function (this: Parser) {\n return new AbsExpr({\n this: (this as DuckDBParser).parseBitwise(),\n });\n },\n };\n }\n\n @cache\n static get ID_VAR_TOKENS (): Set<TokenType> {\n return new Set([\n ...Parser.ID_VAR_TOKENS,\n TokenType.STRAIGHT_JOIN,\n ]);\n }\n\n @cache\n static get TABLE_ALIAS_TOKENS (): Set<TokenType> {\n return (() => {\n const tokens = new Set(Parser.TABLE_ALIAS_TOKENS);\n tokens.delete(TokenType.SEMI);\n tokens.delete(TokenType.ANTI);\n tokens.add(TokenType.STRAIGHT_JOIN);\n return tokens;\n })();\n }\n\n @cache\n static get PLACEHOLDER_PARSERS (): Partial<Record<TokenType, (this: Parser) => Expression | undefined>> {\n return {\n ...Parser.PLACEHOLDER_PARSERS,\n [TokenType.PARAMETER]: function (this: Parser) {\n return (\n (this as DuckDBParser).match(TokenType.NUMBER) || this.matchSet(this._constructor.ID_VAR_TOKENS)\n ? this.expression(PlaceholderExpr, {\n this: (this as DuckDBParser).prev?.text,\n })\n : undefined\n );\n },\n };\n }\n\n @cache\n static get TYPE_CONVERTERS () {\n return {\n [DataTypeExprKind.DECIMAL]: buildDefaultDecimalType(18, 3),\n [DataTypeExprKind.TEXT]: () => DataTypeExpr.build('TEXT') ?? new DataTypeExpr({\n this: DataTypeExprKind.TEXT,\n }),\n };\n }\n\n @cache\n static get STATEMENT_PARSERS (): Partial<Record<TokenType, (this: Parser) => Expression | undefined>> {\n return {\n ...Parser.STATEMENT_PARSERS,\n [TokenType.ATTACH]: function (this: Parser) {\n return (this as DuckDBParser).parseAttachDetach();\n },\n [TokenType.DETACH]: function (this: Parser) {\n return (this as DuckDBParser).parseAttachDetach({\n isAttach: false,\n });\n },\n [TokenType.FORCE]: function (this: Parser) {\n return (this as DuckDBParser).parseForce();\n },\n [TokenType.INSTALL]: function (this: Parser) {\n return (this as DuckDBParser).parseInstall();\n },\n [TokenType.SHOW]: function (this: Parser) {\n return (this as DuckDBParser).parseShow();\n },\n };\n }\n\n @cache\n static get SET_PARSERS (): Record<string, (this: Parser) => Expression | undefined> {\n return {\n ...Parser.SET_PARSERS,\n VARIABLE: function (this: Parser) {\n return (this as DuckDBParser).parseSetItemAssignment({\n kind: 'VARIABLE',\n });\n },\n };\n }\n\n parseLambda (options: {alias?: boolean} = {}): Expression | undefined {\n const index = this.index;\n if (!this.matchTextSeq('LAMBDA')) {\n return super.parseLambda(options);\n }\n\n const expressions = this.parseCsv(() => this.parseLambdaArg());\n if (!this.match(TokenType.COLON)) {\n this.retreat(index);\n return undefined;\n }\n\n const thisExpr = (this as DuckDBParser).replaceLambda(this.parseAssignment(), expressions);\n return this.expression(LambdaExpr, {\n this: thisExpr,\n expressions: expressions,\n colon: true,\n });\n }\n\n parseExpression (): Expression | undefined {\n // DuckDB supports prefix aliases, e.g. foo: 1\n if (this.next && this.next.tokenType === TokenType.COLON) {\n const alias = this.parseIdVar({\n tokens: this._constructor.ALIAS_TOKENS,\n });\n this.match(TokenType.COLON);\n let comments = this.prevComments ?? [\n ];\n\n const thisExpr = this.parseAssignment();\n if (thisExpr instanceof Expression) {\n // Moves the comment next to the alias in `alias: expr /* comment */`\n comments = [\n ...comments,\n ...(thisExpr.popComments() ?? [\n ]),\n ];\n }\n\n return this.expression(AliasExpr, {\n comments: comments,\n this: thisExpr,\n alias: alias,\n });\n }\n\n return super.parseExpression();\n }\n\n parseTable (options: {\n schema?: boolean;\n joins?: boolean;\n aliasTokens?: Set<TokenType>;\n parseBracket?: boolean;\n isDbReference?: boolean;\n parsePartition?: boolean;\n consumePipe?: boolean;\n } = {}): Expression | undefined {\n // DuckDB supports prefix aliases, e.g. FROM foo: bar\n let alias: Expression | undefined = undefined;\n let comments: string[] = [\n ];\n\n if (this.next && this.next.tokenType === TokenType.COLON) {\n alias = this.parseTableAlias({\n aliasTokens: options.aliasTokens ?? this._constructor.TABLE_ALIAS_TOKENS,\n });\n this.match(TokenType.COLON);\n comments = this.prevComments ?? [\n ];\n }\n\n const table = super.parseTable(options);\n\n if (table instanceof Expression && alias instanceof TableAliasExpr) {\n // Moves the comment next to the alias in `alias: table /* comment */`\n comments = [\n ...comments,\n ...(table.popComments() ?? [\n ]),\n ];\n alias.comments = [\n ...(alias.popComments() ?? [\n ]),\n ...comments,\n ];\n table.setArgKey('alias', alias);\n }\n\n return table;\n }\n\n parseTableSample (options: {asModifier?: boolean} = {}): TableSampleExpr | undefined {\n const sample = super.parseTableSample(options);\n if (sample && !sample.args.method) {\n if (sample.args.size) {\n sample.setArgKey('method', new VarExpr({\n this: 'RESERVOIR',\n }));\n } else {\n sample.setArgKey('method', new VarExpr({\n this: 'SYSTEM',\n }));\n }\n }\n\n return sample;\n }\n\n parseBracket (thisNode?: Expression): Expression | undefined {\n const bracket = super.parseBracket(thisNode);\n\n if (\n this.dialect.version.major <= 1\n && this.dialect.version.minor <= 2\n && (this.dialect.version.major !== 1 || this.dialect.version.minor !== 2)\n && bracket instanceof BracketExpr\n ) {\n bracket.setArgKey('returnsListForMaps', true);\n }\n\n return bracket;\n }\n\n parseMap (): ToMapExpr | MapExpr {\n if (this.match(TokenType.L_BRACE, {\n advance: false,\n })) {\n return this.expression(ToMapExpr, {\n this: this.parseBracket(),\n });\n }\n\n const args = this.parseWrappedCsv(() => this.parseAssignment());\n return this.expression(MapExpr, {\n keys: seqGet(args, 0),\n values: seqGet(args, 1),\n });\n }\n\n parseStructTypes (_options: {typeRequired?: boolean} = {}): Expression | undefined {\n return this.parseFieldDef();\n }\n\n pivotColumnNames (aggregations: Expression[]): string[] {\n if (aggregations.length === 1) {\n return super.pivotColumnNames(aggregations);\n }\n return pivotColumnNames(aggregations, {\n dialect: 'duckdb',\n });\n }\n\n parseAttachDetach (options: {isAttach?: boolean} = {}): AttachExpr | DetachExpr {\n const {\n isAttach = true,\n } = options;\n const parseAttachOption = () => this.expression(AttachOptionExpr, {\n this: this.parseVar({\n anyToken: true,\n }),\n expression: this.parseField({\n anyToken: true,\n }),\n });\n\n this.match(TokenType.DATABASE);\n const exists = this.parseExists({\n not: isAttach,\n });\n const thisNode = this.parseAlias(this.parsePrimaryOrVar(), {\n explicit: true,\n });\n\n let expressions: Expression[] | undefined = undefined;\n if (this.match(TokenType.L_PAREN, {\n advance: false,\n })) {\n expressions = this.parseWrappedCsv(parseAttachOption);\n }\n\n return isAttach\n ? this.expression(AttachExpr, {\n this: thisNode,\n exists: exists,\n expressions: expressions,\n })\n : this.expression(DetachExpr, {\n this: thisNode,\n exists: exists,\n });\n }\n\n parseShowDuckdb (thisStr: string): ShowExpr {\n return this.expression(ShowExpr, {\n this: thisStr,\n });\n }\n\n parseForce (): InstallExpr | CommandExpr {\n if (!this.match(TokenType.INSTALL)) {\n return (this as DuckDBParser).parseAsCommand(this.prev);\n }\n\n return this.parseInstall({\n force: true,\n });\n }\n\n parseInstall (options: {force?: boolean} = {}): InstallExpr {\n return this.expression(InstallExpr, {\n this: this.parseIdVar(),\n from: this.match(TokenType.FROM) ? this.parseVarOrString() : undefined,\n force: options.force ?? false,\n });\n }\n\n /**\n * DuckDB supports positional columns using the # syntax (e.g., #1).\n */\n parsePrimary (): Expression | undefined {\n if (this.matchPair(TokenType.HASH, TokenType.NUMBER)) {\n return new PositionalColumnExpr({\n this: LiteralExpr.number(this.prev?.text || 0),\n });\n }\n\n return super.parsePrimary();\n }\n}\n\nclass DuckDBGenerator extends Generator {\n // port from _Dialect metaclass logic\n @cache\n static get AFTER_HAVING_MODIFIER_TRANSFORMS () {\n const modifiers = new Map(super.AFTER_HAVING_MODIFIER_TRANSFORMS);\n [\n 'cluster',\n 'distribute',\n 'sort',\n ].forEach((m) => modifiers.delete(m));\n return modifiers;\n }\n\n // port from _Dialect metaclass logic\n static SUPPORTS_DECODE_CASE = false;\n // port from _Dialect metaclass logic\n static readonly SELECT_KINDS: string[] = [\n ];\n\n static PARAMETER_TOKEN = '$';\n static NAMED_PLACEHOLDER_TOKEN = '$';\n static JOIN_HINTS = false;\n static TABLE_HINTS = false;\n static QUERY_HINTS = false;\n static LIMIT_FETCH = 'LIMIT';\n\n @cache\n static get STRUCT_DELIMITER () {\n return [\n '(',\n ')',\n ];\n }\n\n static RENAME_TABLE_WITH_DB = false;\n static NVL2_SUPPORTED = false;\n static SEMI_ANTI_JOIN_WITH_SIDE = false;\n static TABLESAMPLE_KEYWORDS = 'USING SAMPLE';\n static TABLESAMPLE_SEED_KEYWORD = 'REPEATABLE';\n static LAST_DAY_SUPPORTS_DATE_PART = false;\n static JSON_KEY_VALUE_PAIR_SEP = ',';\n static IGNORE_NULLS_IN_FUNC = true;\n static JSON_PATH_BRACKETED_KEY_SUPPORTED = false;\n static SUPPORTS_CREATE_TABLE_LIKE = false;\n static MULTI_ARG_DISTINCT = false;\n static CAN_IMPLEMENT_ARRAY_ANY = true;\n static SUPPORTS_TO_NUMBER = false;\n static SUPPORTS_WINDOW_EXCLUDE = true;\n static COPY_HAS_INTO_KEYWORD = false;\n static STAR_EXCEPT = 'EXCLUDE';\n static PAD_FILL_PATTERN_IS_REQUIRED = true;\n static ARRAY_SIZE_DIM_REQUIRED = false;\n static NORMALIZE_EXTRACT_DATE_PARTS = true;\n static SUPPORTS_LIKE_QUANTIFIERS = false;\n static SET_ASSIGNMENT_REQUIRES_VARIABLE_KEYWORD = true;\n\n @cache\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static get ORIGINAL_TRANSFORMS (): Map<typeof Expression, (this: Generator, e: any) => string> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const transforms = new Map<typeof Expression, (this: Generator, e: any) => string>([\n ...Generator.TRANSFORMS,\n [\n AnyValueExpr,\n anyValueSql,\n ],\n [\n ApproxDistinctExpr,\n approxCountDistinctSql,\n ],\n [\n BoolnotExpr,\n boolnotSql,\n ],\n [\n BoolandExpr,\n boolandSql,\n ],\n [\n BoolorExpr,\n boolorSql,\n ],\n [\n ArrayExpr,\n preprocess(\n [\n inheritStructFieldNames,\n ],\n inlineArrayUnlessQuery,\n ),\n ],\n [\n ArrayAppendExpr,\n arrayAppendSql('LIST_APPEND'),\n ],\n [\n ArrayCompactExpr,\n arrayCompactSql,\n ],\n [\n ArrayConstructCompactExpr,\n function (this: Generator, e) {\n return this.sql(new ArrayCompactExpr({\n this: new ArrayExpr({\n expressions: e.args.expressions,\n }),\n }));\n },\n ],\n [\n ArrayConcatExpr,\n arrayConcatSql('LIST_CONCAT'),\n ],\n [\n ArrayFilterExpr,\n renameFunc('LIST_FILTER'),\n ],\n [\n ArrayInsertExpr,\n arrayInsertSql,\n ],\n [\n ArrayRemoveAtExpr,\n arrayRemoveAtSql,\n ],\n [\n ArrayRemoveExpr,\n removeFromArrayUsingFilter,\n ],\n [\n ArraySortExpr,\n arraySortSql,\n ],\n [\n ArrayPrependExpr,\n arrayAppendSql('LIST_PREPEND', {\n swapParams: true,\n }),\n ],\n [\n ArraySumExpr,\n renameFunc('LIST_SUM'),\n ],\n [\n ArrayUniqueAggExpr,\n function (this: Generator, e) {\n return this.func('LIST', [\n new DistinctExpr({\n expressions: [\n e.args.this,\n ],\n }),\n ]);\n },\n ],\n [\n Base64DecodeBinaryExpr,\n function (this: Generator, e) {\n return base64DecodeSql.call(this as DuckDBGenerator, e, {\n toString: false,\n });\n },\n ],\n [\n Base64DecodeStringExpr,\n function (this: Generator, e) {\n return base64DecodeSql.call(this as DuckDBGenerator, e, {\n toString: true,\n });\n },\n ],\n [\n BitwiseAndExpr,\n function (this: Generator, e) {\n return (this as DuckDBGenerator).bitwiseOp(e, '&');\n },\n ],\n [\n BitwiseAndAggExpr,\n bitwiseAggSql,\n ],\n [\n BitwiseLeftShiftExpr,\n bitshiftSql,\n ],\n [\n BitwiseOrExpr,\n function (this: Generator, e) {\n return (this as DuckDBGenerator).bitwiseOp(e, '|');\n },\n ],\n [\n BitwiseOrAggExpr,\n bitwiseAggSql,\n ],\n [\n BitwiseRightShiftExpr,\n bitshiftSql,\n ],\n [\n BitwiseXorAggExpr,\n bitwiseAggSql,\n ],\n [\n ByteLengthExpr,\n function (this: Generator, e) {\n return this.func('OCTET_LENGTH', [\n e.args.this,\n ]);\n },\n ],\n [\n CommentColumnConstraintExpr,\n noCommentColumnConstraintSql,\n ],\n [\n CorrExpr,\n function (this: Generator, e) {\n return (this as DuckDBGenerator).corrSql(e);\n },\n ],\n [\n CosineDistanceExpr,\n renameFunc('LIST_COSINE_DISTANCE'),\n ],\n [\n CurrentTimeExpr,\n () => 'CURRENT_TIME',\n ],\n [\n CurrentTimestampExpr,\n function (this: Generator, e) {\n return e.args.sysdate\n ? this.sql(new AtTimeZoneExpr({\n this: new VarExpr({\n this: 'CURRENT_TIMESTAMP',\n }),\n zone: LiteralExpr.string('UTC'),\n }))\n : 'CURRENT_TIMESTAMP';\n },\n ],\n [\n CurrentVersionExpr,\n renameFunc('version'),\n ],\n [\n LocaltimeExpr,\n function (this: Generator, e: Expression) {\n unsupportedArgs.call(this, e, 'this');\n return 'LOCALTIME';\n },\n ],\n [\n DayOfMonthExpr,\n renameFunc('DAYOFMONTH'),\n ],\n [\n DayOfWeekExpr,\n renameFunc('DAYOFWEEK'),\n ],\n [\n DayOfWeekIsoExpr,\n renameFunc('ISODOW'),\n ],\n [\n DayOfYearExpr,\n renameFunc('DAYOFYEAR'),\n ],\n [\n DaynameExpr,\n function (this: Generator, e) {\n return e.args.abbreviated\n ? this.func('STRFTIME', [\n e.args.this,\n LiteralExpr.string('%a'),\n ])\n : this.func('DAYNAME', [\n e.args.this,\n ]);\n },\n ],\n [\n MonthnameExpr,\n function (this: Generator, e) {\n return e.args.abbreviated\n ? this.func('STRFTIME', [\n e.args.this,\n LiteralExpr.string('%b'),\n ])\n : this.func('MONTHNAME', [\n e.args.this,\n ]);\n },\n ],\n [\n DataTypeExpr,\n dataTypeSql,\n ],\n [\n DateExpr,\n dateSql,\n ],\n [\n DateAddExpr,\n dateDeltaToBinaryIntervalOp(),\n ],\n [\n DateFromPartsExpr,\n dateFromPartsSql,\n ],\n [\n DateSubExpr,\n dateDeltaToBinaryIntervalOp(),\n ],\n [\n DateDiffExpr,\n dateDiffSql,\n ],\n [\n DateStrToDateExpr,\n dateStrToDateSql,\n ],\n [\n DatetimeExpr,\n noDatetimeSql,\n ],\n [\n DatetimeDiffExpr,\n dateDiffSql,\n ],\n [\n DatetimeSubExpr,\n dateDeltaToBinaryIntervalOp(),\n ],\n [\n DatetimeAddExpr,\n dateDeltaToBinaryIntervalOp(),\n ],\n [\n DateToDiExpr,\n function (this: Generator, e) {\n return `CAST(STRFTIME(${this.sql(e, 'this')}, ${DuckDB.DATEINT_FORMAT}) AS INT)`;\n },\n ],\n [\n DecodeExpr,\n function (this: Generator, e) {\n return encodeDecodeSql.call(this, e, 'DECODE', {\n replace: false,\n });\n },\n ],\n [\n DecodeCaseExpr,\n decodeToCaseSql,\n ],\n [\n DiToDateExpr,\n function (this: Generator, e) {\n return `CAST(STRPTIME(CAST(${this.sql(e, 'this')} AS TEXT), ${DuckDB.DATEINT_FORMAT}) AS DATE)`;\n },\n ],\n [\n EncodeExpr,\n function (this: Generator, e) {\n return encodeDecodeSql.call(this, e, 'ENCODE', {\n replace: false,\n });\n },\n ],\n [\n EqualNullExpr,\n function (this: Generator, e) {\n return this.sql(new NullSafeEqExpr({\n this: e.args.this,\n expression: e.args.expression,\n }));\n },\n ],\n [\n EuclideanDistanceExpr,\n renameFunc('LIST_DISTANCE'),\n ],\n [\n GenerateDateArrayExpr,\n generateDatetimeArraySql,\n ],\n [\n GenerateTimestampArrayExpr,\n generateDatetimeArraySql,\n ],\n [\n GetbitExpr,\n getBitSql,\n ],\n [\n GroupConcatExpr,\n function (this: Generator, e) {\n return groupConcatSql.call(this, e, {\n withinGroup: false,\n });\n },\n ],\n [\n ExplodeExpr,\n renameFunc('UNNEST'),\n ],\n [\n IntDivExpr,\n function (this: Generator, e) {\n return this.binary(e, '//');\n },\n ],\n [\n IsInfExpr,\n renameFunc('ISINF'),\n ],\n [\n IsNanExpr,\n renameFunc('ISNAN'),\n ],\n [\n IsNullValueExpr,\n function (this: Generator, e) {\n return this.sql(new EqExpr({\n this: this.func('JSON_TYPE', [\n e.args.this,\n ]),\n expression: LiteralExpr.string('NULL'),\n }));\n },\n ],\n [\n IsArrayExpr,\n function (this: Generator, e) {\n return this.sql(new EqExpr({\n this: this.func('JSON_TYPE', [\n e.args.this,\n ]),\n expression: LiteralExpr.string('ARRAY'),\n }));\n },\n ],\n [\n CeilExpr,\n ceilFloor,\n ],\n [\n FloorExpr,\n ceilFloor,\n ],\n [\n JarowinklerSimilarityExpr,\n renameFunc('JARO_WINKLER_SIMILARITY'),\n ],\n [\n JsonbExistsExpr,\n renameFunc('JSON_EXISTS'),\n ],\n [\n JsonExtractExpr,\n arrowJsonExtractSqlDuckDB,\n ],\n [\n JsonExtractArrayExpr,\n jsonExtractValueArraySql,\n ],\n [\n JsonFormatExpr,\n jsonFormatSql,\n ],\n [\n JsonValueArrayExpr,\n jsonExtractValueArraySql,\n ],\n [\n LateralExpr,\n explodeToUnnestSql,\n ],\n [\n LogicalOrExpr,\n function (this: Generator, e) {\n return this.func('BOOL_OR', [\n castToBoolean(e.args.this),\n ]);\n },\n ],\n [\n LogicalAndExpr,\n function (this: Generator, e) {\n return this.func('BOOL_AND', [\n castToBoolean(e.args.this),\n ]);\n },\n ],\n [\n Seq1Expr,\n function (this: Generator, e) {\n return seqSql.call(this as DuckDBGenerator, e, 1);\n },\n ],\n [\n Seq2Expr,\n function (this: Generator, e) {\n return seqSql.call(this as DuckDBGenerator, e, 2);\n },\n ],\n [\n Seq4Expr,\n function (this: Generator, e) {\n return seqSql.call(this as DuckDBGenerator, e, 4);\n },\n ],\n [\n Seq8Expr,\n function (this: Generator, e) {\n return seqSql.call(this as DuckDBGenerator, e, 8);\n },\n ],\n [\n BoolxorAggExpr,\n boolxorAggSql,\n ],\n [\n MakeIntervalExpr,\n function (this: Generator, e) {\n return noMakeIntervalSql.call(this, e, {\n sep: ' ',\n });\n },\n ],\n [\n InitcapExpr,\n initcapSql,\n ],\n [\n Md5DigestExpr,\n function (this: Generator, e) {\n return this.func('UNHEX', [\n this.func('MD5', [\n e.args.this,\n ]),\n ]);\n },\n ],\n [\n ShaExpr,\n function (this: Generator, e) {\n return shaSql.call(this as DuckDBGenerator, e, 'SHA1');\n },\n ],\n [\n Sha1DigestExpr,\n function (this: Generator, e) {\n return shaSql.call(this as DuckDBGenerator, e, 'SHA1', {\n isBinary: true,\n });\n },\n ],\n [\n Sha2Expr,\n function (this: Generator, e) {\n return shaSql.call(this as DuckDBGenerator, e, 'SHA256');\n },\n ],\n [\n Sha2DigestExpr,\n function (this: Generator, e) {\n return shaSql.call(this as DuckDBGenerator, e, 'SHA256', {\n isBinary: true,\n });\n },\n ],\n [\n MonthsBetweenExpr,\n monthsBetweenSql,\n ],\n [\n NextDayExpr,\n dayNavigationSql,\n ],\n [\n PercentileContExpr,\n renameFunc('QUANTILE_CONT'),\n ],\n [\n PercentileDiscExpr,\n renameFunc('QUANTILE_DISC'),\n ],\n [\n PivotExpr,\n preprocess([\n unqualifyColumns,\n ]),\n ],\n [\n PreviousDayExpr,\n dayNavigationSql,\n ],\n [\n RegexpReplaceExpr,\n function (this: Generator, e) {\n return this.func('REGEXP_REPLACE', [\n e.args.this,\n e.args.expression,\n e.args.replacement,\n regexpReplaceGlobalModifier(e),\n ]);\n },\n ],\n [\n RegexpLikeExpr,\n renameFunc('REGEXP_MATCHES'),\n ],\n [\n RegexpILikeExpr,\n function (this: Generator, e) {\n return this.func('REGEXP_MATCHES', [\n e.args.this,\n e.args.expression,\n LiteralExpr.string('i'),\n ]);\n },\n ],\n [\n RegexpSplitExpr,\n renameFunc('STR_SPLIT_REGEX'),\n ],\n [\n RegrValxExpr,\n regrValSql,\n ],\n [\n RegrValyExpr,\n regrValSql,\n ],\n [\n ReturnExpr,\n function (this: Generator, e) {\n return this.sql(e, 'this');\n },\n ],\n [\n ReturnsPropertyExpr,\n function (this: Generator, e) {\n return (e.args.this instanceof SchemaExpr ? 'TABLE' : '');\n },\n ],\n [\n RandExpr,\n renameFunc('RANDOM'),\n ],\n [\n SplitExpr,\n renameFunc('STR_SPLIT'),\n ],\n [\n SortArrayExpr,\n sortArraySql,\n ],\n [\n StrPositionExpr,\n strPositionSql,\n ],\n [\n StrToUnixExpr,\n function (this: Generator, e) {\n return this.func('EPOCH', [\n this.func('STRPTIME', [\n e.args.this,\n this.formatTime(e),\n ]),\n ]);\n },\n ],\n [\n StructExpr,\n structSql,\n ],\n [\n TransformExpr,\n renameFunc('LIST_TRANSFORM'),\n ],\n [\n TimeAddExpr,\n dateDeltaToBinaryIntervalOp(),\n ],\n [\n TimeSubExpr,\n dateDeltaToBinaryIntervalOp(),\n ],\n [\n TimeExpr,\n noTimeSql,\n ],\n [\n TimeDiffExpr,\n timeDiffSql,\n ],\n [\n TimestampExpr,\n noTimestampSql,\n ],\n [\n TimestampAddExpr,\n dateDeltaToBinaryIntervalOp(),\n ],\n [\n TimestampDiffExpr,\n function (this: Generator, e) {\n return this.func('DATE_DIFF', [\n LiteralExpr.string(e.args.unit),\n e.args.expression,\n e.args.this,\n ]);\n },\n ],\n [\n TimestampSubExpr,\n dateDeltaToBinaryIntervalOp(),\n ],\n [\n TimeStrToDateExpr,\n function (this: Generator, e) {\n return this.sql(new CastExpr({\n this: e.args.this,\n to: new DataTypeExpr({\n this: DataTypeExprKind.DATE,\n }),\n }));\n },\n ],\n [\n TimeStrToTimeExpr,\n timeStrToTimeSql,\n ],\n [\n TimeStrToUnixExpr,\n function (this: Generator, e) {\n return this.func('EPOCH', [\n new CastExpr({\n this: e.args.this,\n to: new DataTypeExpr({\n this: DataTypeExprKind.TIMESTAMP,\n }),\n }),\n ]);\n },\n ],\n [\n TimeToStrExpr,\n function (this: Generator, e) {\n return this.func('STRFTIME', [\n e.args.this,\n this.formatTime(e),\n ]);\n },\n ],\n [\n ToBooleanExpr,\n toBooleanSql,\n ],\n [\n TimeToUnixExpr,\n renameFunc('EPOCH'),\n ],\n [\n TsOrDiToDiExpr,\n function (this: Generator, e) {\n return `CAST(SUBSTR(REPLACE(CAST(${this.sql(e, 'this')} AS TEXT), '-', ''), 1, 8) AS INT)`;\n },\n ],\n [\n TsOrDsAddExpr,\n dateDeltaToBinaryIntervalOp(),\n ],\n [\n TsOrDsDiffExpr,\n function (this: Generator, e) {\n const unit = e.args.unit;\n const unitName = unit?.name?.toUpperCase() || 'DAY';\n return this.func('DATE_DIFF', [\n LiteralExpr.string(unitName),\n new CastExpr({\n this: e.args.expression,\n to: new DataTypeExpr({\n this: DataTypeExprKind.TIMESTAMP,\n }),\n }),\n new CastExpr({\n this: e.args.this,\n to: new DataTypeExpr({\n this: DataTypeExprKind.TIMESTAMP,\n }),\n }),\n ]);\n },\n ],\n [\n UnixMicrosExpr,\n function (this: Generator, e) {\n return this.func('EPOCH_US', [\n implicitDatetimeCast(e.args.this),\n ]);\n },\n ],\n [\n UnixMillisExpr,\n function (this: Generator, e) {\n return this.func('EPOCH_MS', [\n implicitDatetimeCast(e.args.this),\n ]);\n },\n ],\n [\n UnixSecondsExpr,\n function (this: Generator, e) {\n return this.sql(\n new CastExpr({\n this: this.func('EPOCH', [\n implicitDatetimeCast(e.args.this),\n ]),\n to: new DataTypeExpr({\n this: DataTypeExprKind.BIGINT,\n }),\n }),\n );\n },\n ],\n [\n UnixToStrExpr,\n function (this: Generator, e) {\n return this.func('STRFTIME', [\n this.func('TO_TIMESTAMP', [\n e.args.this,\n ]),\n this.formatTime(e),\n ]);\n },\n ],\n [\n DatetimeTruncExpr,\n function (this: Generator, e) {\n return this.func('DATE_TRUNC', [\n unitToStr(e),\n new CastExpr({\n this: e.args.this,\n to: new DataTypeExpr({\n this: DataTypeExprKind.DATETIME,\n }),\n }),\n ]);\n },\n ],\n [\n UnixToTimeExpr,\n unixToTimeSql,\n ],\n [\n UnixToTimeStrExpr,\n function (this: Generator, e) {\n return `CAST(TO_TIMESTAMP(${this.sql(e, 'this')}) AS TEXT)`;\n },\n ],\n [\n VarMapExpr,\n function (this: Generator, e: VarMapExpr) {\n return this.func('MAP', [\n e.args?.keys,\n e.args?.values,\n ]);\n },\n ],\n [\n VariancePopExpr,\n renameFunc('VAR_POP'),\n ],\n [\n WeekOfYearExpr,\n renameFunc('WEEKOFYEAR'),\n ],\n [\n YearOfWeekExpr,\n function (this: Generator, e) {\n return this.sql(new ExtractExpr({\n this: new VarExpr({\n this: 'ISOYEAR',\n }),\n expression: e.args.this,\n }));\n },\n ],\n [\n YearOfWeekIsoExpr,\n function (this: Generator, e) {\n return this.sql(new ExtractExpr({\n this: new VarExpr({\n this: 'ISOYEAR',\n }),\n expression: e.args.this,\n }));\n },\n ],\n [\n XorExpr,\n xorSql,\n ],\n [\n JsonObjectAggExpr,\n renameFunc('JSON_GROUP_OBJECT'),\n ],\n [\n JsonbObjectAggExpr,\n renameFunc('JSON_GROUP_OBJECT'),\n ],\n [\n DateBinExpr,\n renameFunc('TIME_BUCKET'),\n ],\n [\n LastDayExpr,\n lastDaySql,\n ],\n ]);\n return transforms;\n }\n\n @cache\n static get SUPPORTED_JSON_PATH_PARTS (): Set<typeof Expression> {\n return new Set([\n JsonPathKeyExpr,\n JsonPathRootExpr,\n JsonPathSubscriptExpr,\n JsonPathWildcardExpr,\n ]);\n }\n\n @cache\n static get TYPE_MAPPING () {\n return new Map([\n ...Generator.TYPE_MAPPING,\n [\n DataTypeExprKind.BINARY,\n 'BLOB',\n ],\n [\n DataTypeExprKind.BPCHAR,\n 'TEXT',\n ],\n [\n DataTypeExprKind.CHAR,\n 'TEXT',\n ],\n [\n DataTypeExprKind.DATETIME,\n 'TIMESTAMP',\n ],\n [\n DataTypeExprKind.DECFLOAT,\n 'DECIMAL(38, 5)',\n ],\n [\n DataTypeExprKind.FLOAT,\n 'REAL',\n ],\n [\n DataTypeExprKind.JSONB,\n 'JSON',\n ],\n [\n DataTypeExprKind.NCHAR,\n 'TEXT',\n ],\n [\n DataTypeExprKind.NVARCHAR,\n 'TEXT',\n ],\n [\n DataTypeExprKind.UINT,\n 'UINTEGER',\n ],\n [\n DataTypeExprKind.VARBINARY,\n 'BLOB',\n ],\n [\n DataTypeExprKind.ROWVERSION,\n 'BLOB',\n ],\n [\n DataTypeExprKind.VARCHAR,\n 'TEXT',\n ],\n [\n DataTypeExprKind.TIMESTAMPLTZ,\n 'TIMESTAMPTZ',\n ],\n [\n DataTypeExprKind.TIMESTAMPNTZ,\n 'TIMESTAMP',\n ],\n [\n DataTypeExprKind.TIMESTAMP_S,\n 'TIMESTAMP_S',\n ],\n [\n DataTypeExprKind.TIMESTAMP_MS,\n 'TIMESTAMP_MS',\n ],\n [\n DataTypeExprKind.TIMESTAMP_NS,\n 'TIMESTAMP_NS',\n ],\n [\n DataTypeExprKind.BIGDECIMAL,\n 'DECIMAL(38, 5)',\n ],\n ]);\n }\n\n @cache\n static get RESERVED_KEYWORDS () {\n return new Set([\n 'array',\n 'analyse',\n 'union',\n 'all',\n 'when',\n 'in_p',\n 'default',\n 'create_p',\n 'window',\n 'asymmetric',\n 'to',\n 'else',\n 'localtime',\n 'from',\n 'end_p',\n 'select',\n 'current_date',\n 'foreign',\n 'with',\n 'grant',\n 'session_user',\n 'or',\n 'except',\n 'references',\n 'fetch',\n 'limit',\n 'group_p',\n 'leading',\n 'into',\n 'collate',\n 'offset',\n 'do',\n 'then',\n 'localtimestamp',\n 'check_p',\n 'lateral_p',\n 'current_role',\n 'where',\n 'asc_p',\n 'placing',\n 'desc_p',\n 'user',\n 'unique',\n 'initially',\n 'column',\n 'both',\n 'some',\n 'as',\n 'any',\n 'only',\n 'deferrable',\n 'null_p',\n 'current_time',\n 'true_p',\n 'table',\n 'case',\n 'trailing',\n 'variadic',\n 'for',\n 'on',\n 'distinct',\n 'false_p',\n 'not',\n 'constraint',\n 'current_timestamp',\n 'returning',\n 'primary',\n 'intersect',\n 'having',\n 'analyze',\n 'current_user',\n 'and',\n 'cast',\n 'symmetric',\n 'using',\n 'order',\n 'current_catalog',\n ]);\n }\n\n @cache\n static get UNWRAPPED_INTERVAL_VALUES () {\n return new Set<typeof Expression>([\n LiteralExpr,\n ParenExpr,\n ]);\n }\n\n @cache\n static get PROPERTIES_LOCATION (): Map<typeof Expression, PropertiesLocation> {\n const locations = new Map<typeof Expression, PropertiesLocation>();\n\n // Default all existing properties to UNSUPPORTED\n [\n ...Generator.PROPERTIES_LOCATION.keys(),\n ].forEach((prop) => {\n locations.set(prop, PropertiesLocation.UNSUPPORTED);\n });\n\n // Explicit overrides for DuckDB\n locations.set(LikePropertyExpr, PropertiesLocation.POST_SCHEMA);\n locations.set(TemporaryPropertyExpr, PropertiesLocation.POST_CREATE);\n locations.set(ReturnsPropertyExpr, PropertiesLocation.POST_ALIAS);\n locations.set(SequencePropertiesExpr, PropertiesLocation.POST_EXPRESSION);\n\n return locations;\n }\n\n @cache\n static get IGNORE_RESPECT_NULLS_WINDOW_FUNCTIONS () {\n return [\n FirstValueExpr,\n LagExpr,\n LastValueExpr,\n LeadExpr,\n NthValueExpr,\n ];\n }\n\n @cache\n static get ZIPF_TEMPLATE () {\n return maybeParse(`\n WITH rand AS (SELECT :random_expr AS r),\n weights AS (\n SELECT i, 1.0 / POWER(i, :s) AS w\n FROM RANGE(1, :n + 1) AS t(i)\n ),\n cdf AS (\n SELECT i, SUM(w) OVER (ORDER BY i) / SUM(w) OVER () AS p\n FROM weights\n )\n SELECT MIN(i)\n FROM cdf\n WHERE p >= (SELECT r FROM rand)\n`);\n }\n\n @cache\n static get NORMAL_TEMPLATE () {\n return maybeParse(\n ':mean + (:stddev * SQRT(-2 * LN(GREATEST(:u1, 1e-10))) * COS(2 * PI() * :u2))',\n );\n }\n\n @cache\n static get SEEDED_RANDOM_TEMPLATE () {\n return maybeParse(\n '(ABS(HASH(:seed)) % 1000000) / 1000000.0',\n );\n }\n\n @cache\n static get SEQ_UNSIGNED () {\n return maybeParse(`${SEQ_BASE} % :max_val`);\n }\n\n @cache\n static get SEQ_SIGNED () {\n return maybeParse(`\n (CASE WHEN ${SEQ_BASE} % :max_val >= :half \n THEN ${SEQ_BASE} % :max_val - :max_val \n ELSE ${SEQ_BASE} % :max_val END)\n`);\n }\n\n @cache\n static get MAPCAT_TEMPLATE () {\n return maybeParse(`CASE\n WHEN :map1 IS NULL OR :map2 IS NULL THEN NULL\n ELSE MAP_FROM_ENTRIES(LIST_FILTER(LIST_TRANSFORM(\n LIST_DISTINCT(LIST_CONCAT(MAP_KEYS(:map1), MAP_KEYS(:map2))),\n __k -> STRUCT_PACK(key := __k, value := COALESCE(:map2[__k], :map1[__k]))\n ), __x -> __x.value IS NOT NULL))\n END\n`);\n }\n\n @cache\n static get EXTRACT_STRFTIME_MAPPINGS (): Record<string, [string, string]> {\n return {\n WEEKISO: [\n '%V',\n 'INTEGER',\n ],\n YEAROFWEEK: [\n '%G',\n 'INTEGER',\n ],\n YEAROFWEEKISO: [\n '%G',\n 'INTEGER',\n ],\n NANOSECOND: [\n '%n',\n 'BIGINT',\n ],\n };\n }\n\n @cache\n static get EXTRACT_EPOCH_MAPPINGS (): Record<string, string> {\n return {\n EPOCH_SECOND: 'EPOCH',\n EPOCH_MILLISECOND: 'EPOCH_MS',\n EPOCH_MICROSECOND: 'EPOCH_US',\n EPOCH_NANOSECOND: 'EPOCH_NS',\n };\n }\n\n /**\n * Snowflake's BITMAP_CONSTRUCT_AGG aggregates integers into a compact binary bitmap.\n * DuckDB implementation uses LIST_TRANSFORM and LIST_REDUCE to build hex strings\n * before converting to binary BLOBs.\n */\n @cache\n static get BITMAP_CONSTRUCT_AGG_TEMPLATE () {\n return maybeParse(`\n SELECT CASE\n WHEN l IS NULL OR LENGTH(l) = 0 THEN NULL\n WHEN LENGTH(l) != LENGTH(LIST_FILTER(l, __v -> __v BETWEEN 0 AND 32767)) THEN NULL\n WHEN LENGTH(l) < 5 THEN UNHEX(PRINTF('%04X', LENGTH(l)) || h || REPEAT('00', GREATEST(0, 4 - LENGTH(l)) * 2))\n ELSE UNHEX('08000000000000000000' || h)\n END\n FROM (\n SELECT l, COALESCE(LIST_REDUCE(\n LIST_TRANSFORM(l, __x -> PRINTF('%02X%02X', CAST(__x AS INT) & 255, (CAST(__x AS INT) >> 8) & 255)),\n (__a, __b) -> __a || __b, ''\n ), '') AS h\n FROM (SELECT LIST_SORT(LIST_DISTINCT(LIST(:arg) FILTER(NOT :arg IS NULL))) AS l)\n )\n`);\n }\n\n /**\n * Template for RANDSTR transpilation using a character pool and seeded hash.\n */\n @cache\n static get RANDSTR_TEMPLATE () {\n return maybeParse(`\n SELECT LISTAGG(\n SUBSTRING(\n '${RANDSTR_CHAR_POOL}',\n 1 + CAST(FLOOR(random_value * 62) AS INT),\n 1\n ),\n ''\n )\n FROM (\n SELECT (ABS(HASH(i + :seed)) % 1000) / 1000.0 AS random_value\n FROM RANGE(:length) AS t(i)\n )\n`);\n }\n\n /**\n * Template for MINHASH transpilation.\n * Returns JSON matching Snowflake format: {\"state\": [...], \"type\": \"minhash\", \"version\": 1}\n */\n @cache\n static get MINHASH_TEMPLATE () {\n return maybeParse(`\n SELECT JSON_OBJECT('state', LIST(min_h ORDER BY seed), 'type', 'minhash', 'version', 1)\n FROM (\n SELECT seed, LIST_MIN(LIST_TRANSFORM(vals, __v -> HASH(CAST(__v AS VARCHAR) || CAST(seed AS VARCHAR)))) AS min_h\n FROM (SELECT LIST(:expr) AS vals), RANGE(0, :k) AS t(seed)\n )\n`);\n }\n\n /**\n * Template for MINHASH_COMBINE transpilation.\n * Combines multiple minhash signatures by taking element-wise minimum.\n */\n @cache\n static get MINHASH_COMBINE_TEMPLATE () {\n return maybeParse(`\n SELECT JSON_OBJECT('state', LIST(min_h ORDER BY idx), 'type', 'minhash', 'version', 1)\n FROM (\n SELECT\n pos AS idx,\n MIN(val) AS min_h\n FROM\n UNNEST(LIST(:expr)) AS _(sig),\n UNNEST(CAST(sig -> 'state' AS UBIGINT[])) WITH ORDINALITY AS t(val, pos)\n GROUP BY pos\n )\n`);\n }\n\n @cache\n static get APPROXIMATE_SIMILARITY_TEMPLATE () {\n return maybeParse(`\n SELECT CAST(SUM(CASE WHEN num_distinct = 1 THEN 1 ELSE 0 END) AS DOUBLE) / COUNT(*)\n FROM (\n SELECT pos, COUNT(DISTINCT h) AS num_distinct\n FROM (\n SELECT h, pos\n FROM UNNEST(LIST(:expr)) AS _(sig),\n UNNEST(CAST(sig -> 'state' AS UBIGINT[])) WITH ORDINALITY AS s(h, pos)\n )\n GROUP BY pos\n )\n`);\n }\n\n @cache\n static get ARRAYS_ZIP_TEMPLATE () {\n return maybeParse(`\n CASE WHEN :null_check THEN NULL\n WHEN :all_empty_check THEN [:empty_struct]\n ELSE LIST_TRANSFORM(RANGE(0, :max_len), __i -> :transform_struct)\n END\n`);\n }\n\n /** Transform Snowflake's TIME_SLICE to DuckDB's time_bucket. */\n timeSliceSql (expression: TimeSliceExpr): string {\n const dateExpr = expression.args.this;\n const sliceLength = expression.args.expression;\n const unit = expression.args.unit;\n const kind = expression.text('kind').toUpperCase();\n\n const intervalExpr = new IntervalExpr({\n this: sliceLength,\n unit: unit,\n });\n const timeBucketExpr = this.func('time_bucket', [\n intervalExpr,\n dateExpr,\n ]);\n\n if (kind !== 'END') {\n return this.sql(timeBucketExpr);\n }\n\n const addExpr = new AddExpr({\n this: timeBucketExpr,\n expression: intervalExpr.copy(),\n });\n\n if (dateExpr?.isType(DataTypeExprKind.DATE)) {\n return this.sql(new CastExpr({\n this: addExpr,\n to: new DataTypeExpr({\n this: DataTypeExprKind.DATE,\n }),\n }));\n }\n\n return this.sql(addExpr);\n }\n\n /** Snowflake BITMAP_BUCKET_NUMBER to DuckDB CASE expression. */\n bitmapBucketNumberSql (this: DuckDBGenerator, expression: BitmapBucketNumberExpr): string {\n const value = expression.args.this as Expression;\n\n const positiveFormula = new AddExpr({\n this: new ParenExpr({\n this: new IntDivExpr({\n this: new ParenExpr({\n this: new SubExpr({\n this: value,\n expression: LiteralExpr.number(1),\n }),\n }),\n expression: LiteralExpr.number(32768),\n }),\n }),\n expression: LiteralExpr.number(1),\n });\n\n const nonPositiveFormula = new IntDivExpr({\n this: value,\n expression: LiteralExpr.number(32768),\n });\n\n return this.sql(\n new CaseExpr({})\n .when(new GtExpr({\n this: value,\n expression: LiteralExpr.number(0),\n }), positiveFormula)\n .else(nonPositiveFormula),\n );\n }\n\n /** Snowflake BITMAP_BIT_POSITION to DuckDB modulo CASE expression. */\n bitmapBitPositionSql (expression: BitmapBitPositionExpr): string {\n const thisNode = expression.args.this;\n\n return this.sql(\n new ModExpr({\n this: new ParenExpr({\n this: new IfExpr({\n this: new GtExpr({\n this: thisNode,\n expression: LiteralExpr.number(0),\n }),\n true: new SubExpr({\n this: thisNode,\n expression: LiteralExpr.number(1),\n }),\n false: new AbsExpr({\n this: thisNode,\n }),\n }),\n }),\n expression: MAX_BIT_POSITION,\n }),\n );\n }\n\n /** Snowflake BITMAP_CONSTRUCT_AGG using replacePlaceholders. */\n bitmapConstructAggSql (expression: BitmapConstructAggExpr): string {\n const arg = expression.args.this;\n return `(${this.sql(replacePlaceholders((this._constructor as typeof DuckDBGenerator).BITMAP_CONSTRUCT_AGG_TEMPLATE, [\n arg,\n ]))})`;\n }\n\n nthValueSql (expression: NthValueExpr): string {\n const fromFirst = expression.args.fromFirst ?? true;\n if (!fromFirst) {\n this.unsupported('DuckDB\\'s NTH_VALUE doesn\\'t support starting from the end');\n }\n\n return this.functionFallbackSql(expression);\n }\n\n /**\n * Transpile Snowflake's RANDSTR to DuckDB equivalent using deterministic hash-based random.\n * RANDSTR(length, generator) generates a random string of specified length.\n */\n randstrSql (expression: RandstrExpr): string {\n const length = expression.args.this;\n const generator = expression.args.generator;\n\n let seedValue: Expression;\n\n if (generator) {\n if (generator instanceof RandExpr) {\n // If it's RANDOM(), use its seed if available, otherwise use RANDOM() itself\n seedValue = generator.args.this ?? generator;\n } else {\n // Const/int or other expression - use as seed directly\n seedValue = generator;\n }\n } else {\n // No generator specified, use default seed (arbitrary but deterministic)\n seedValue = LiteralExpr.number(RANDSTR_SEED);\n }\n\n return `(${this.sql(replacePlaceholders((this._constructor as typeof DuckDBGenerator).RANDSTR_TEMPLATE, [\n seedValue,\n length,\n ]))})`;\n }\n\n /**\n * Transpile Snowflake's ZIPF to DuckDB using CDF-based inverse sampling.\n */\n zipfSql (expression: ZipfExpr): string {\n const s = expression.args.this;\n const n = expression.args.elementcount;\n const gen = expression.args.gen;\n\n let randomExpr: Expression;\n\n if (!(gen instanceof RandExpr)) {\n // (ABS(HASH(seed)) % 1000000) / 1000000.0\n randomExpr = new DivExpr({\n this: new ParenExpr({\n this: new ModExpr({\n this: new AbsExpr({\n this: new AnonymousExpr({\n this: 'HASH',\n expressions: [\n (gen ?? null_()).copy(),\n ],\n }),\n }),\n expression: LiteralExpr.number(1000000),\n }),\n }),\n expression: LiteralExpr.number(1000000.0),\n });\n } else {\n // Use RANDOM() for non-deterministic output\n randomExpr = new RandExpr({});\n }\n\n return `(${this.sql(replacePlaceholders((this._constructor as typeof DuckDBGenerator).ZIPF_TEMPLATE, [\n s,\n n,\n randomExpr,\n ]))})`;\n }\n\n /**\n * TO_BINARY and TRY_TO_BINARY transpilation:\n * Maps format (HEX, UTF-8, BASE64) to native DuckDB functions.\n */\n toBinarySql (expression: ToBinaryExpr): string {\n const value = expression.args.this;\n const formatArg = narrowInstanceOf(expression.args.format, Expression);\n const isSafe = expression.args.safe;\n const binaryCheck = isBinary(expression);\n\n if (!formatArg && !binaryCheck) {\n const funcName = isSafe ? 'TRY_TO_BINARY' : 'TO_BINARY';\n return this.func(funcName, [\n value,\n ]);\n }\n\n const fmt = formatArg?.name?.toUpperCase() ?? 'HEX';\n let result: string;\n\n if (fmt === 'UTF-8' || fmt === 'UTF8') {\n result = this.func('ENCODE', [\n value,\n ]);\n } else if (fmt === 'BASE64') {\n result = this.func('FROM_BASE64', [\n value,\n ]);\n } else if (fmt === 'HEX') {\n result = this.func('UNHEX', [\n value,\n ]);\n } else {\n if (isSafe) {\n return this.sql(null_());\n } else {\n this.unsupported(`format ${fmt} is not supported`);\n result = this.func('TO_BINARY', [\n value,\n ]);\n }\n }\n\n return isSafe ? `TRY(${result})` : result;\n }\n\n /**\n * Handle GREATEST/LEAST functions with dialect-aware NULL behavior.\n */\n greatestLeastSql (expression: GreatestExpr | LeastExpr): string {\n const allArgs = [\n expression.args.this,\n ...(expression.args.expressions ?? [\n ]),\n ];\n const fallbackSql = this.functionFallbackSql(expression);\n\n if (expression.args.ignoreNulls) {\n return this.sql(fallbackSql);\n }\n\n const firstArg = allArgs[0] ?? null_();\n const caseExpr = new CaseExpr({}).when(\n new OrExpr({\n this: new IsExpr({\n this: firstArg.copy(),\n expression: null_(),\n }),\n expression: allArgs.slice(1).reduce(\n (acc, arg) =>\n new OrExpr({\n this: acc,\n expression: new IsExpr({\n this: (arg ?? null_()).copy(),\n expression: null_(),\n }),\n }),\n new IsExpr({\n this: firstArg.copy(),\n expression: null_(),\n }),\n ),\n }),\n null_(),\n );\n\n caseExpr.setArgKey('default', fallbackSql);\n return this.sql(caseExpr);\n }\n\n /** Transpile Snowflake GENERATOR to DuckDB range() */\n generatorSql (expression: GeneratorExpr): string {\n const rowcount = expression.args.rowcount;\n const timeLimit = expression.args.timeLimit;\n\n if (timeLimit) {\n this.unsupported('GENERATOR TIMELIMIT parameter is not supported in DuckDB');\n }\n\n if (!rowcount) {\n this.unsupported('GENERATOR without ROWCOUNT is not supported in DuckDB');\n return this.func('range', [\n LiteralExpr.number(0),\n ]);\n }\n\n return this.func('range', [\n rowcount,\n ]);\n }\n\n greatestSql (expression: GreatestExpr): string {\n return this.greatestLeastSql(expression);\n }\n\n leastSql (expression: LeastExpr): string {\n return this.greatestLeastSql(expression);\n }\n\n lambdaSql (expression: LambdaExpr, options: {arrowSep?: string;\n wrap?: boolean;} = {}): string {\n let arrowSep = options.arrowSep ?? '->';\n let wrap = options.wrap ?? true;\n let prefix = '';\n\n if (expression.args.colon) {\n prefix = 'LAMBDA ';\n arrowSep = ':';\n wrap = false;\n }\n\n const lambdaSql = super.lambdaSql(expression, {\n arrowSep,\n wrap,\n });\n return `${prefix}${lambdaSql}`;\n }\n\n showSql (expression: ShowExpr): string {\n return `SHOW ${expression.name}`;\n }\n\n installSql (expression: InstallExpr): string {\n const force = expression.args.force ? 'FORCE ' : '';\n const thisSql = this.sql(expression, 'this');\n const fromClause = expression.args.from ? ` FROM ${expression.args.from}` : '';\n return `${force}INSTALL ${thisSql}${fromClause}`;\n }\n\n approxTopKSql (expression: ApproxTopKExpr): string {\n this.unsupported(\n 'APPROX_TOP_K cannot be transpiled to DuckDB due to incompatible return types. ',\n );\n return this.functionFallbackSql(expression);\n }\n\n fromIso8601TimestampSql (expression: FromIso8601TimestampExpr): string {\n return this.sql(\n new CastExpr({\n this: expression.args.this,\n to: new DataTypeExpr({\n this: DataTypeExprKind.TIMESTAMPTZ,\n }),\n }),\n );\n }\n\n strToTimeSql (expression: StrToTimeExpr): string {\n const targetType = expression.args.targetType;\n const needsTz =\n targetType\n && [\n DataTypeExprKind.TIMESTAMPLTZ,\n DataTypeExprKind.TIMESTAMPTZ,\n ].includes(targetType.args.this as DataTypeExprKind);\n\n if (expression.args.safe) {\n const formattedTime = this.formatTime(expression);\n const castType = needsTz ? DataTypeExprKind.TIMESTAMPTZ : DataTypeExprKind.TIMESTAMP;\n return this.sql(\n new CastExpr({\n this: this.func('TRY_STRPTIME', [\n expression.args.this,\n formattedTime,\n ]),\n to: new DataTypeExpr({\n this: castType,\n }),\n }),\n );\n }\n\n const baseSql = strToTimeSql.call(this, expression);\n if (needsTz) {\n return this.sql(\n new CastExpr({\n this: baseSql,\n to: new DataTypeExpr({\n this: DataTypeExprKind.TIMESTAMPTZ,\n }),\n }),\n );\n }\n return baseSql;\n }\n\n strToDateSql (expression: StrToDateExpr): string {\n const formattedTime = this.formatTime(expression);\n const functionName = !expression.args.safe ? 'STRPTIME' : 'TRY_STRPTIME';\n return this.sql(\n new CastExpr({\n this: this.func(functionName, [\n expression.args.this,\n formattedTime,\n ]),\n to: new DataTypeExpr({\n this: DataTypeExprKind.DATE,\n }),\n }),\n );\n }\n\n tsOrDsToTimeSql (expression: TsOrDsToTimeExpr): string {\n const thisNode = expression.args.this;\n const timeFormat = this.formatTime(expression);\n const safe = expression.args.safe;\n const timeType = DataTypeExpr.build('TIME', {\n dialect: 'duckdb',\n });\n const CastClass = safe ? TryCastExpr : CastExpr;\n\n if (timeFormat) {\n const funcName = safe ? 'TRY_STRPTIME' : 'STRPTIME';\n const strptime = new AnonymousExpr({\n this: funcName,\n expressions: [\n thisNode ?? null_(),\n timeFormat,\n ],\n });\n return this.sql(new CastClass({\n this: strptime,\n to: timeType,\n }));\n }\n\n if (thisNode instanceof TsOrDsToTimeExpr || thisNode?.isType(DataTypeExprKind.TIME)) {\n return this.sql(thisNode ?? null_());\n }\n\n return this.sql(new CastClass({\n this: thisNode,\n to: timeType,\n }));\n }\n\n currentDateSql (expression: CurrentDateExpr): string {\n if (!expression.args.this) {\n return 'CURRENT_DATE';\n }\n\n const expr = new CastExpr({\n this: new AtTimeZoneExpr({\n this: new CurrentTimestampExpr({}),\n zone: expression.args.this,\n }),\n to: new DataTypeExpr({\n this: DataTypeExprKind.DATE,\n }),\n });\n return this.sql(expr);\n }\n\n parseJsonSql (expression: ParseJsonExpr): string {\n const arg = expression.args.this;\n if (expression.args.safe) {\n return this.sql(\n new CaseExpr({})\n .when(this.func('json_valid', [\n arg ?? null_(),\n ]), (arg instanceof Expression || typeof arg === 'string') ? arg : '')\n .else(null_()),\n );\n }\n return this.func('JSON', [\n arg,\n ]);\n }\n\n truncSql (expression: TruncExpr): string {\n unsupportedArgs.call(this, expression, 'decimals');\n return this.func('TRUNC', [\n expression.args.this,\n ]);\n }\n\n normalSql (expression: NormalExpr): string {\n const mean = expression.args.this;\n const stddev = expression.args.stddev;\n const gen = expression.args.gen;\n\n let u1: Expression;\n let u2: Expression;\n\n if (gen instanceof RandExpr && !gen.args.this) {\n u1 = new RandExpr({});\n u2 = new RandExpr({});\n } else {\n const seed = (gen instanceof RandExpr ? gen.args.this : gen) ?? null_();\n u1 = replacePlaceholders((this._constructor as typeof DuckDBGenerator).SEEDED_RANDOM_TEMPLATE, [\n seed,\n ]);\n u2 = replacePlaceholders((this._constructor as typeof DuckDBGenerator).SEEDED_RANDOM_TEMPLATE, [\n new AddExpr({\n this: seed.copy(),\n expression: LiteralExpr.number(1),\n }),\n ]);\n }\n\n return this.sql(replacePlaceholders((this._constructor as typeof DuckDBGenerator).NORMAL_TEMPLATE, [\n mean,\n stddev,\n u1,\n u2,\n ]));\n }\n\n uniformSql (expression: UniformExpr): string {\n const minVal = expression.args.this;\n const maxVal = expression.args.expression;\n const gen = expression.args.gen;\n\n const isIntResult = minVal instanceof LiteralExpr && minVal.isInteger\n && maxVal instanceof LiteralExpr && maxVal.isInteger;\n\n let randomExpr: Expression;\n if (!(gen instanceof RandExpr)) {\n randomExpr = new DivExpr({\n this: new ParenExpr({\n this: new ModExpr({\n this: new AbsExpr({\n this: new AnonymousExpr({\n this: 'HASH',\n expressions: [\n gen || '',\n ],\n }),\n }),\n expression: LiteralExpr.number(1000000),\n }),\n }),\n expression: LiteralExpr.number(1000000.0),\n });\n } else {\n randomExpr = new RandExpr({});\n }\n\n let rangeExpr: Expression = new SubExpr({\n this: maxVal,\n expression: minVal,\n });\n if (isIntResult) {\n rangeExpr = new AddExpr({\n this: rangeExpr,\n expression: LiteralExpr.number(1),\n });\n }\n\n let result: Expression = new AddExpr({\n this: minVal,\n expression: new MulExpr({\n this: randomExpr,\n expression: new ParenExpr({\n this: rangeExpr,\n }),\n }),\n });\n\n if (isIntResult) {\n result = new CastExpr({\n this: new FloorExpr({\n this: result,\n }),\n to: new DataTypeExpr({\n this: DataTypeExprKind.BIGINT,\n }),\n });\n }\n\n return this.sql(result);\n }\n\n timeFromPartsSql (expression: TimeFromPartsExpr): string {\n /** Snowflake's TIME_FROM_PARTS supports overflow and nanoseconds. */\n const nano = expression.args.nano;\n const overflow = expression.args.overflow;\n\n if (overflow) {\n const hour = narrowInstanceOf(expression.args.hour, 'string', LiteralExpr);\n const minute = narrowInstanceOf(expression.args.min, 'string', LiteralExpr);\n let sec: Expression | string | undefined = narrowInstanceOf(expression.args.sec, 'string', LiteralExpr);\n\n // Efficiency path: use MAKE_TIME for standard ranges\n if (!nano && [\n hour,\n minute,\n sec,\n ].every((arg) => arg instanceof LiteralExpr && arg.isNumber)) {\n const hVal = parseInt((hour instanceof LiteralExpr ? hour.args.this : hour) ?? '0');\n const mVal = parseInt((minute instanceof LiteralExpr ? minute.args.this : minute) ?? '0');\n const sVal = parseInt((sec instanceof Expression ? sec.args.this as string : sec) ?? '0');\n if (0 <= hVal && hVal <= 23 && 0 <= mVal && mVal <= 59 && 0 <= sVal && sVal <= 59) {\n return renameFunc('MAKE_TIME').call(this, expression);\n }\n }\n\n // Overflow or nanoseconds: use INTERVAL arithmetic\n if (nano) {\n sec = new AddExpr({\n this: sec,\n expression: new DivExpr({\n this: nano.pop(),\n expression: LiteralExpr.number(1000000000.0),\n }),\n });\n }\n\n const totalSeconds = new AddExpr({\n this: new AddExpr({\n this: new MulExpr({\n this: hour,\n expression: LiteralExpr.number(3600),\n }),\n expression: new MulExpr({\n this: minute,\n expression: LiteralExpr.number(60),\n }),\n }),\n expression: sec,\n });\n\n return this.sql(\n new AddExpr({\n this: new CastExpr({\n this: LiteralExpr.string('00:00:00'),\n to: DataTypeExpr.build('TIME'),\n }),\n expression: new IntervalExpr({\n this: totalSeconds,\n unit: new VarExpr({\n this: 'SECOND',\n }),\n }),\n }),\n );\n }\n\n if (nano) {\n expression.setArgKey(\n 'sec',\n new AddExpr({\n this: expression.args.sec,\n expression: new DivExpr({\n this: nano.pop(),\n expression: LiteralExpr.number(1000000000.0),\n }),\n }),\n );\n }\n\n return renameFunc('MAKE_TIME').call(this, expression);\n }\n\n /** Transpile EXTRACT with DuckDB strftime/epoch mappings. */\n extractSql (expression: ExtractExpr): string {\n const datetimeExpr = expression.args.expression;\n\n if (datetimeExpr?.isType([\n DataTypeExprKind.TIMESTAMPTZ,\n DataTypeExprKind.TIMESTAMPLTZ,\n ])) {\n this.unsupported(\n 'EXTRACT from TIMESTAMPTZ / TIMESTAMPLTZ may produce different results due to timezone handling differences',\n );\n }\n\n const partName = narrowInstanceOf(expression.args.this, Expression)?.name.toUpperCase();\n\n if (partName !== undefined && partName in DuckDBGenerator.EXTRACT_STRFTIME_MAPPINGS) {\n const [\n fmt,\n castType,\n ] = DuckDBGenerator.EXTRACT_STRFTIME_MAPPINGS[partName];\n\n const isNanoTime =\n partName === 'NANOSECOND'\n && datetimeExpr?.isType([\n DataTypeExprKind.TIME,\n DataTypeExprKind.TIMETZ,\n ]);\n\n const datetimeExprSafe = datetimeExpr ?? null_();\n if (isNanoTime) {\n this.unsupported('Parameter NANOSECOND is not supported with TIME type in DuckDB');\n return this.sql(\n new CastExpr({\n this: new MulExpr({\n this: new ExtractExpr({\n this: new VarExpr({\n this: 'MICROSECOND',\n }),\n expression: datetimeExprSafe,\n }),\n expression: LiteralExpr.number(1000),\n }),\n to: DataTypeExpr.build(castType, {\n dialect: 'duckdb',\n }),\n }),\n );\n }\n\n let strftimeInput: Expression = datetimeExprSafe;\n if (partName === 'NANOSECOND') {\n strftimeInput = new CastExpr({\n this: datetimeExprSafe,\n to: new DataTypeExpr({\n this: DataTypeExprKind.TIMESTAMP_NS,\n }),\n });\n }\n\n return this.sql(\n new CastExpr({\n this: new AnonymousExpr({\n this: 'STRFTIME',\n expressions: [\n strftimeInput,\n LiteralExpr.string(fmt),\n ],\n }),\n to: DataTypeExpr.build(castType, {\n dialect: 'duckdb',\n }),\n }),\n );\n }\n\n if (partName !== undefined && partName in DuckDBGenerator.EXTRACT_EPOCH_MAPPINGS) {\n const funcName = DuckDBGenerator.EXTRACT_EPOCH_MAPPINGS[partName];\n let result: Expression = new AnonymousExpr({\n this: funcName,\n expressions: [\n datetimeExpr ?? null_(),\n ],\n });\n if (partName === 'EPOCH_SECOND') {\n result = new CastExpr({\n this: result,\n to: DataTypeExpr.build('BIGINT', {\n dialect: 'duckdb',\n }),\n });\n }\n return this.sql(result);\n }\n\n return super.extractSql(expression);\n }\n\n timestampFromPartsSql (expression: TimestampFromPartsExpr): string {\n const dateExpr = expression.args.this;\n const timeExpr = expression.args.expression;\n\n if (dateExpr && timeExpr) {\n return this.sql(new AddExpr({\n this: dateExpr,\n expression: timeExpr,\n }));\n }\n\n let sec = expression.args.sec;\n if (!sec) return renameFunc('MAKE_TIMESTAMP').call(this, expression);\n\n const milli = expression.args.milli;\n if (milli) {\n sec = new AddExpr({\n this: sec,\n expression: new ParenExpr({\n this: new DivExpr({\n this: milli.pop(),\n expression: LiteralExpr.number('1000.0'),\n }),\n }),\n });\n }\n\n const nano = expression.args.nano;\n if (nano) {\n sec = new AddExpr({\n this: sec,\n expression: new ParenExpr({\n this: new DivExpr({\n this: nano.pop(),\n expression: LiteralExpr.number('1000000000.0'),\n }),\n }),\n });\n }\n\n if (milli || nano) {\n expression.setArgKey('sec', sec);\n }\n\n return renameFunc('MAKE_TIMESTAMP').call(this, expression);\n }\n\n timestampLtzFromPartsSql (expression: TimestampLtzFromPartsExpr): string {\n const nano = expression.args.nano;\n if (nano) nano.pop();\n\n const timestamp = renameFunc('MAKE_TIMESTAMP').call(this, expression);\n return `CAST(${timestamp} AS TIMESTAMPTZ)`;\n }\n\n timestampTzFromPartsSql (expression: TimestampTzFromPartsExpr): string {\n let zone = expression.args.zone;\n if (zone) zone = zone.pop();\n\n const nano = expression.args.nano;\n if (nano) nano.pop();\n\n const timestamp = renameFunc('MAKE_TIMESTAMP').call(this, expression);\n\n if (zone) {\n return `${timestamp} AT TIME ZONE ${this.sql(zone)}`;\n }\n\n return timestamp;\n }\n\n tableSampleSql (expression: TableSampleExpr, options: {tablesampleKeyword?: string} = {}): string {\n let keyword = options.tablesampleKeyword;\n if (!(expression.parent instanceof SelectExpr)) {\n keyword = 'TABLESAMPLE';\n }\n\n if (expression.args.size) {\n const method = expression.args.method;\n if (method instanceof Expression && method.name?.toUpperCase() !== 'RESERVOIR') {\n this.unsupported(\n `Sampling method ${method} is not supported with a discrete sample count, defaulting to reservoir sampling`,\n );\n expression.setArgKey('method', new VarExpr({\n this: 'RESERVOIR',\n }));\n }\n }\n\n return super.tableSampleSql(expression, {\n tablesampleKeyword: keyword,\n });\n }\n\n columnDefSql (expression: ColumnDefExpr, options: {sep?: string} = {}): string {\n if (expression.parent instanceof UserDefinedFunctionExpr) {\n return this.sql(expression, 'this');\n }\n return super.columnDefSql(expression, options);\n }\n\n joinSql (expression: JoinExpr): string {\n const isInnerOuter = [\n '',\n JoinExprKind.INNER,\n JoinExprKind.OUTER,\n ].includes(expression.args.kind ?? '');\n\n if (\n !expression.args.using\n && !expression.args.on\n && !expression.args.method\n && isInnerOuter\n ) {\n /**\n * Some dialects support `LEFT/INNER JOIN UNNEST(...)` without an explicit ON clause.\n * DuckDB requires one, so we inject a dummy `ON TRUE`.\n */\n if (expression.args.this instanceof UnnestExpr) {\n return super.joinSql(expression.on(new BooleanExpr({\n this: true,\n })));\n }\n\n expression.setArgKey('side', undefined);\n expression.setArgKey('kind', undefined);\n }\n\n return super.joinSql(expression);\n }\n\n generateSeriesSql (expression: GenerateSeriesExpr): string {\n // GENERATE_SERIES(a, b) -> [a, b], RANGE(a, b) -> [a, b)\n if (expression.args.isEndExclusive) {\n return renameFunc('RANGE').call(this, expression);\n }\n\n return this.functionFallbackSql(expression);\n }\n\n countIfSql (expression: CountIfExpr): string {\n if (1 < this.dialect.version.major || (this.dialect.version.major === 1 && 2 <= this.dialect.version.minor)) {\n return this.functionFallbackSql(expression);\n }\n\n return countIfToSum.call(this, expression);\n }\n\n bracketSql (expression: BracketExpr): string {\n if (1 < this.dialect.version.major || (this.dialect.version.major === 1 && 2 <= this.dialect.version.minor)) {\n return super.bracketSql(expression);\n }\n\n /** * In DuckDB < 1.2, array literals followed by brackets often need parens: ([1, 2])[1]\n * For Maps, DuckDB returns a list of keys; we wrap to return the value.\n */\n const thisNode = expression.args.this;\n if (thisNode instanceof ArrayExpr) {\n thisNode.replace(new ParenExpr({\n this: thisNode.copy(),\n }));\n }\n\n let bracket = super.bracketSql(expression);\n\n if (!expression.args.returnsListForMaps) {\n const thisNodeExpr = narrowInstanceOf(thisNode, Expression);\n const annotated = thisNodeExpr?.type\n ? thisNodeExpr\n : thisNodeExpr && annotateTypes(thisNodeExpr, {\n dialect: this.dialect,\n });\n\n if (isType(annotated, DataTypeExprKind.MAP)) {\n bracket = `(${bracket})[1]`;\n }\n }\n\n return bracket;\n }\n\n /**\n * DuckDB requires ORDER BY inside the function for ARRAY_AGG.\n * Transform: ARRAY_AGG(x) WITHIN GROUP (ORDER BY y) -> ARRAY_AGG(x ORDER BY y)\n */\n withinGroupSql (expression: WithinGroupExpr): string {\n const func = expression.args.this;\n\n if (func instanceof ArrayAggExpr) {\n const order = expression.args.expression;\n if (!(order instanceof OrderExpr)) {\n return this.sql(func);\n }\n\n const originalThis = func.args.this;\n\n func.setArgKey(\n 'this',\n new OrderExpr({\n this: narrowInstanceOf(func.args.this, Expression)?.copy(),\n expressions: order.args.expressions,\n }),\n );\n\n const arrayAggSql = this.functionFallbackSql(func as FuncExpr);\n return originalThis instanceof Expression ? this.addArrayAggNullFilter(arrayAggSql, func, originalThis) : '';\n }\n\n const expressionSql = this.sql(expression, 'expression');\n\n if (func instanceof PercentileContExpr || func instanceof PercentileDiscExpr) {\n /**\n * Reorder arguments for DuckDB percentiles:\n * percentile_cont(fraction) WITHIN GROUP (ORDER BY col) -> percentile_cont(col, fraction)\n */\n const orderCol = expression.find(OrderedExpr);\n if (orderCol) {\n func.setArgKey('expression', func.args.this);\n func.setArgKey('this', orderCol.args.this);\n }\n }\n\n const thisSql = this.sql(expression, 'this').replace(/\\)$/, '');\n return `${thisSql}${expressionSql})`;\n }\n\n lengthSql (expression: LengthExpr): string {\n const arg = expression.args.this;\n\n if (!expression.args.binary || (arg instanceof LiteralExpr && arg.isString)) {\n return this.func('LENGTH', [\n arg,\n ]);\n }\n\n const annotated = arg?.type\n ? arg\n : arg && annotateTypes(arg, {\n dialect: this.dialect,\n });\n\n if (annotated?.isType(DataTypeExpr.TEXT_TYPES)) {\n return this.func('LENGTH', [\n arg,\n ]);\n }\n\n /** Resolve BLOB vs String length dynamically using TYPEOF */\n const blob = new CastExpr({\n this: arg,\n to: new DataTypeExpr({\n this: DataTypeExprKind.VARBINARY,\n }),\n });\n const varchar = new CastExpr({\n this: arg,\n to: new DataTypeExpr({\n this: DataTypeExprKind.VARCHAR,\n }),\n });\n\n const caseNode = new CaseExpr({\n this: new AnonymousExpr({\n this: 'TYPEOF',\n expressions: arg\n ? [\n arg,\n ]\n : [\n ],\n }),\n })\n .when(LiteralExpr.string('BLOB'), new ByteLengthExpr({\n this: blob,\n }))\n .else(new AnonymousExpr({\n this: 'LENGTH',\n expressions: [\n varchar,\n ],\n }));\n\n return this.sql(caseNode);\n }\n\n levenshteinSql (expression: LevenshteinExpr): string {\n unsupportedArgs.call(this, expression, 'insCost', 'delCost', 'subCost');\n const thisNode = expression.args.this;\n const exprNode = expression.args.expression;\n const maxDist = expression.args.maxDist;\n\n if (!maxDist) {\n return this.func('LEVENSHTEIN', [\n thisNode,\n exprNode,\n ]);\n }\n\n /** Emulate Snowflake: if distance > maxDist, return maxDist */\n const levenshtein = new LevenshteinExpr({\n this: thisNode,\n expression: exprNode,\n });\n return this.sql(new LeastExpr({\n this: levenshtein,\n expressions: [\n maxDist,\n ],\n ignoreNulls: false,\n }));\n }\n\n padSql (expression: PadExpr): string {\n const stringArg = expression.args.this;\n const fillArg = expression.args.fillPattern ?? LiteralExpr.string(' ');\n\n if (isBinary(stringArg) || isBinary(fillArg)) {\n const lengthArg = expression.args.expression;\n const isLeft = expression.args.isLeft;\n\n const inputLen = new ByteLengthExpr({\n this: stringArg,\n });\n const charsNeeded = new SubExpr({\n this: lengthArg,\n expression: inputLen,\n });\n const padCount = new GreatestExpr({\n this: LiteralExpr.number(0),\n expressions: [\n charsNeeded,\n ],\n ignoreNulls: true,\n });\n const repeatExpr = new RepeatExpr({\n this: fillArg,\n times: [\n padCount,\n ],\n });\n\n const [\n left,\n right,\n ] = isLeft\n ? [\n repeatExpr,\n stringArg,\n ]\n : [\n stringArg,\n repeatExpr,\n ];\n return this.sql(new DPipeExpr({\n this: left,\n expression: right,\n }));\n }\n\n return super.padSql(expression);\n }\n\n minhashSql (expression: MinhashExpr): string {\n const k = expression.args.this;\n const exprs = expression.args.expressions ?? [\n ];\n\n if (exprs.length !== 1 || exprs[0] instanceof StarExpr) {\n this.unsupported('MINHASH with multiple expressions or * requires manual restructuring');\n return this.func('MINHASH', [\n k,\n ...exprs,\n ]);\n }\n\n const result = replacePlaceholders(DuckDBGenerator.MINHASH_TEMPLATE.copy(), [\n exprs[0],\n k,\n ]);\n return `(${this.sql(result)})`;\n }\n\n minhashCombineSql (expression: MinhashCombineExpr): string {\n const result = replacePlaceholders(DuckDBGenerator.MINHASH_COMBINE_TEMPLATE.copy(), [\n expression.args.this,\n ]);\n return `(${this.sql(result)})`;\n }\n\n approximateSimilaritySql (expression: ApproximateSimilarityExpr): string {\n const result = replacePlaceholders(DuckDBGenerator.APPROXIMATE_SIMILARITY_TEMPLATE.copy(), [\n expression.args.this,\n ]);\n return `(${this.sql(result)})`;\n }\n\n arraysZipSql (expression: ArraysZipExpr): string {\n const args = expression.args.expressions ?? [\n ];\n\n if (args.length === 0) {\n /** Return [{}] - Represented as MAP([], []) for empty structs in DuckDB */\n return this.sql(new ArrayExpr({\n expressions: [\n new MapExpr({\n keys: new ArrayExpr(),\n values: new ArrayExpr(),\n }),\n ],\n }));\n }\n\n const lengths = args.map((arg) => new LengthExpr({\n this: arg,\n }));\n const maxLen = lengths.length === 1\n ? lengths[0]\n : new GreatestExpr({\n this: lengths[0],\n expressions: lengths.slice(1),\n ignoreNulls: false,\n });\n\n /** Snowflake pads to longest; DuckDB truncates. Logic below emulates padding. */\n const emptyStruct = this.func(\n 'STRUCT',\n args.map((_, i) => new PropertyEqExpr({\n this: LiteralExpr.string(`$${i + 1}`),\n expression: null_(),\n })),\n );\n\n const index = new AddExpr({\n this: new ColumnExpr({\n this: new IdentifierExpr({\n this: '__i',\n }),\n }),\n expression: LiteralExpr.number(1),\n });\n const transformStruct = this.func(\n 'STRUCT',\n args.map((arg, i) => new PropertyEqExpr({\n this: LiteralExpr.string(`$${i + 1}`),\n expression: new BracketExpr({\n this: new AnonymousExpr({\n this: 'COALESCE',\n expressions: [\n arg,\n new ArrayExpr({}),\n ],\n }),\n expressions: [\n index,\n ],\n }),\n })),\n );\n\n const result = replacePlaceholders(DuckDBGenerator.ARRAYS_ZIP_TEMPLATE.copy(), [\n args.reduce(\n (acc, arg) => new OrExpr({\n this: acc,\n expression: new IsExpr({\n this: arg,\n expression: null_(),\n }),\n }),\n new IsExpr({\n this: args[0],\n expression: null_(),\n }),\n ),\n args.reduce((acc, arg) => new AndExpr({\n this: acc,\n expression: new EqExpr({\n this: new LengthExpr({\n this: arg,\n }),\n expression: LiteralExpr.number(0),\n }),\n }), new EqExpr({\n this: new LengthExpr({\n this: args[0],\n }),\n expression: LiteralExpr.number(0),\n })),\n emptyStruct,\n maxLen,\n transformStruct,\n ]);\n\n return this.sql(result);\n }\n\n lowerSql (expression: LowerExpr): string {\n const resultSql = this.func('LOWER', [\n castToVarchar(expression.args.this),\n ]);\n return genWithCastToBlob.call(this, expression, resultSql);\n }\n\n upperSql (expression: UpperExpr): string {\n const resultSql = this.func('UPPER', [\n castToVarchar(expression.args.this),\n ]);\n return genWithCastToBlob.call(this, expression, resultSql);\n }\n\n reverseSql (expression: ReverseExpr): string {\n const resultSql = this.func('REVERSE', [\n castToVarchar(expression.args.this),\n ]);\n return genWithCastToBlob.call(this, expression, resultSql);\n }\n\n /**\n * DuckDB TO_BASE64 requires BLOB input.\n * Snowflake BASE64_ENCODE implicitly encodes UTF-8 bytes for VARCHAR.\n */\n base64EncodeSql (expression: Base64EncodeExpr): string {\n let result = expression.args.this;\n\n if (result?.isType(DataTypeExpr.TEXT_TYPES)) {\n result = new AnonymousExpr({\n this: 'ENCODE',\n expressions: [\n result,\n ],\n });\n }\n\n result = new ToBase64Expr({\n this: result,\n });\n\n const maxLineLength = expression.args.maxLineLength;\n const alphabet = expression.args.alphabet;\n\n // Handle custom alphabet\n result = applyBase64AlphabetReplacements(result, alphabet);\n\n // Handle max_line_length by inserting newlines every N characters using regex\n const lineLength =\n maxLineLength instanceof LiteralExpr && maxLineLength.isNumber\n ? parseInt(maxLineLength.args.this ?? '0')\n : 0;\n\n if (0 < lineLength) {\n const newline = new ChrExpr({\n expressions: [\n LiteralExpr.number(10),\n ],\n });\n result = new TrimExpr({\n this: new RegexpReplaceExpr({\n this: result,\n expression: LiteralExpr.string(`(.{${lineLength}})`),\n replacement: new ConcatExpr({\n expressions: [\n LiteralExpr.string('\\\\1'),\n newline.copy(),\n ],\n }),\n }),\n expression: newline,\n position: TrimPosition.TRAILING,\n });\n }\n\n return this.sql(result);\n }\n\n replaceSql (expression: ReplaceExpr): string {\n const resultSql = this.func('REPLACE', [\n castToVarchar(expression.args.this),\n castToVarchar(expression.args.expression),\n castToVarchar(expression.args.replacement),\n ]);\n return genWithCastToBlob.call(this, expression, resultSql);\n }\n\n bitwiseOp (expression: BinaryExpr, op: string): string {\n prepareBinaryBitwiseArgs(expression);\n const resultSql = this.binary(expression, op);\n return genWithCastToBlob.call(this, expression, resultSql);\n }\n\n bitwiseXorSql (expression: BitwiseXorExpr): string {\n prepareBinaryBitwiseArgs(expression);\n const resultSql = this.func('XOR', [\n expression.args.this,\n expression.args.expression,\n ]);\n return genWithCastToBlob.call(this, expression, resultSql);\n }\n\n objectInsertSql (expression: ObjectInsertExpr): string {\n const thisNode = expression.args.this;\n const key = expression.args.key;\n const keySql = key instanceof Expression ? key.name : '';\n const valueSql = this.sql(expression, 'value');\n\n const kvSql = `${keySql} := ${valueSql}`;\n\n /** If input is an empty struct, use STRUCT_PACK.\n * DuckDB's STRUCT_INSERT isn't valid on an empty {} literal.\n */\n if (thisNode instanceof StructExpr && (!thisNode.args.expressions || thisNode.args.expressions.length === 0)) {\n return this.func('STRUCT_PACK', [\n kvSql,\n ]);\n }\n\n return this.func('STRUCT_INSERT', [\n thisNode,\n kvSql,\n ]);\n }\n\n mapCatSql (expression: MapCatExpr): string {\n const result = replacePlaceholders(DuckDBGenerator.MAPCAT_TEMPLATE.copy(), [\n expression.args.this,\n expression.args.expression,\n ]);\n return this.sql(result);\n }\n\n startsWithSql (expression: StartsWithExpr): string {\n return this.func('STARTS_WITH', [\n castToVarchar(expression.args.this),\n castToVarchar(expression.args.expression),\n ]);\n }\n\n spaceSql (expression: SpaceExpr): string {\n /** DuckDB's REPEAT requires BIGINT for count. */\n return this.sql(\n new RepeatExpr({\n this: LiteralExpr.string(' '),\n times: [\n new CastExpr({\n this: expression.args.this,\n to: new DataTypeExpr({\n this: DataTypeExprKind.BIGINT,\n }),\n }),\n ],\n }),\n );\n }\n\n tableFromRowsSql (expression: TableFromRowsExpr): string {\n if (expression.args.this instanceof GeneratorExpr) {\n const table = new TableExpr({\n this: expression.args.this,\n alias: expression.args.alias,\n joins: expression.args.joins,\n });\n return this.sql(table);\n }\n\n return super.tableFromRowsSql(expression);\n }\n\n unnestSql (expression: UnnestExpr): string {\n const explodeArray = expression.args.explodeArray;\n if (explodeArray) {\n /** Transpile BQ nested UNNEST to DuckDB subquery with max_depth => 2.\n */\n if (!expression.args.expressions) {\n expression.setArgKey('expressions', [\n ]);\n }\n expression.args.expressions?.push(\n new KwargExpr({\n this: new VarExpr({\n this: 'max_depth',\n }),\n expression: LiteralExpr.number(2),\n }),\n );\n\n let alias = expression.args.alias;\n if (alias instanceof TableAliasExpr) {\n expression.setArgKey('alias', undefined);\n if (alias.args.columns && 0 < alias.args.columns.length) {\n alias = new TableAliasExpr({\n this: seqGet(alias.args.columns, 0),\n });\n }\n }\n\n const unnestStr = super.unnestSql(expression);\n const aliasSql = alias ? ` ${this.sql(alias)}` : '';\n return `(SELECT ${unnestStr})${aliasSql}`;\n }\n\n return super.unnestSql(expression);\n }\n\n ignoreNullsSql (expression: IgnoreNullsExpr): string {\n const thisNode = expression.args.this;\n\n if ((this._constructor as typeof DuckDBGenerator).IGNORE_RESPECT_NULLS_WINDOW_FUNCTIONS.some((cls) => thisNode instanceof cls)) {\n return super.ignoreNullsSql(expression);\n }\n\n let node = thisNode;\n if (node instanceof FirstExpr) {\n node = new AnyValueExpr({\n this: node.args.this,\n });\n }\n\n if (!(node instanceof AnyValueExpr || node instanceof ApproxQuantilesExpr)) {\n this.unsupported('IGNORE NULLS is not supported for non-window functions.');\n }\n\n return this.sql(node);\n }\n\n respectNullsSql (expression: RespectNullsExpr): string {\n if ((this._constructor as typeof DuckDBGenerator).IGNORE_RESPECT_NULLS_WINDOW_FUNCTIONS.some((cls) => expression.args.this instanceof cls)) {\n return super.respectNullsSql(expression);\n }\n\n this.unsupported('RESPECT NULLS is not supported for non-window functions.');\n return this.sql(expression, 'this');\n }\n\n arrayToStringSql (expression: ArrayToStringExpr): string {\n let thisSql = this.sql(expression, 'this');\n const nullText = this.sql(expression, 'null');\n\n if (nullText) {\n thisSql = `LIST_TRANSFORM(${thisSql}, x -> COALESCE(x, ${nullText}))`;\n }\n\n return this.func('ARRAY_TO_STRING', [\n thisSql,\n expression.args.expression,\n ]);\n }\n\n regexpExtractSql (expression: RegexpExtractExpr): string {\n let thisNode: Expression = expression.args.this as Expression;\n const group = expression.args.group;\n const params = expression.args.parameters;\n const position = expression.args.position;\n const occurrence = expression.args.occurrence;\n const nullIfPosOverflow = expression.args.nullIfPosOverflow;\n\n if (position && (!(position instanceof LiteralExpr && position.isInteger) || 1 < parseInt(position.args.this ?? '0'))) {\n thisNode = new SubstringExpr({\n this: thisNode,\n start: position,\n });\n\n if (nullIfPosOverflow) {\n thisNode = new NullifExpr({\n this: thisNode,\n expression: LiteralExpr.string(''),\n });\n }\n }\n\n let groupArg = group;\n const defaultGroup = String(this.dialect._constructor.REGEXP_EXTRACT_DEFAULT_GROUP);\n if (!params && group) {\n if (\n (group instanceof IdentifierExpr && group.name === defaultGroup)\n || (group instanceof LiteralExpr && String(group.args.this) === defaultGroup)\n ) {\n groupArg = undefined;\n }\n }\n\n if (occurrence && (!(occurrence instanceof LiteralExpr && occurrence.isInteger) || 1 < parseInt((occurrence as LiteralExpr).args.this ?? '0'))) {\n return this.func('ARRAY_EXTRACT', [\n this.func('REGEXP_EXTRACT_ALL', [\n thisNode,\n expression.args.expression,\n groupArg,\n params,\n ]),\n LiteralExpr.number(parseInt((occurrence as LiteralExpr).args.this ?? '0')),\n ]);\n }\n\n return this.func('REGEXP_EXTRACT', [\n thisNode,\n expression.args.expression,\n groupArg,\n params,\n ]);\n }\n\n numberToStrSql (expression: NumberToStrExpr): string {\n const fmt = expression.args.format?.name;\n if (fmt && /^\\d+$/.test(fmt)) {\n return this.func('FORMAT', [\n LiteralExpr.string(`{:,.${fmt}f}`),\n expression.args.this,\n ]);\n }\n\n this.unsupported('Only integer formats are supported by NumberToStr');\n return this.functionFallbackSql(expression);\n }\n\n autoIncrementColumnConstraintSql (_expression: ColumnDefExpr): string {\n this.unsupported('The AUTOINCREMENT column constraint is not supported by DuckDB');\n return '';\n }\n\n aliasesSql (expression: AliasesExpr): string {\n const thisNode = expression.args.this;\n if (thisNode instanceof PosexplodeExpr) {\n return this.posexplodeSql(thisNode);\n }\n\n return super.aliasesSql(expression);\n }\n\n posexplodeSql (expression: PosexplodeExpr): string {\n const thisNode = expression.args.this as Expression;\n const parent = expression.parent;\n\n /** The default Spark aliases are \"pos\" and \"col\" */\n let pos: Expression | undefined = new IdentifierExpr({\n this: 'pos',\n quoted: false,\n });\n let col: Expression | undefined = new IdentifierExpr({\n this: 'col',\n quoted: false,\n });\n\n if (parent instanceof AliasesExpr) {\n const aliases = parent.args.expressions;\n pos = aliases?.[0];\n col = aliases?.[1];\n } else if (parent instanceof TableExpr) {\n const alias = parent.args.alias;\n if (alias instanceof TableAliasExpr) {\n const columns = alias.args.columns;\n if (columns && 0 < columns.length) {\n pos = columns[0] as Expression;\n col = (columns[1] as Expression) ?? col;\n }\n alias.pop();\n }\n }\n\n /**\n * Translate Spark POSEXPLODE to DuckDB UNNEST + GENERATE_SUBSCRIPTS.\n * Subtract 1 from DuckDB's 1-indexed subscripts to match Spark's 0-indexed pos.\n */\n const unnestSql = this.sql(new UnnestExpr({\n expressions: [\n thisNode,\n ],\n alias: col as Expression,\n }));\n const genSubscripts = this.sql(\n new AliasExpr({\n this: new SubExpr({\n this: new AnonymousExpr({\n this: 'GENERATE_SUBSCRIPTS',\n expressions: [\n thisNode,\n LiteralExpr.number(1),\n ],\n }),\n expression: LiteralExpr.number(1),\n }),\n alias: pos,\n }),\n );\n\n const posexplodeSql = this.formatArgs([\n genSubscripts,\n unnestSql,\n ]);\n\n if (parent instanceof FromExpr || (parent && parent.parent instanceof FromExpr)) {\n return `(SELECT ${posexplodeSql})`;\n }\n\n return posexplodeSql;\n }\n\n /**\n * Handles Snowflake rounding behavior for float months and preserves\n * input types (DATE/TIMESTAMPTZ) which DuckDB usually promotes to TIMESTAMP.\n */\n addMonthsSql (expression: AddMonthsExpr): string {\n let thisNode = expression.args.this;\n if (!thisNode?.type) {\n thisNode = thisNode && annotateTypes(thisNode, {\n dialect: this.dialect,\n });\n }\n\n if (thisNode?.isType(DataTypeExpr.TEXT_TYPES)) {\n thisNode = new CastExpr({\n this: thisNode,\n to: new DataTypeExpr({\n this: DataTypeExprKind.TIMESTAMP,\n }),\n });\n }\n\n const monthsExpr = expression.args.expression;\n const annotatedMonths = monthsExpr?.type\n ? monthsExpr\n : monthsExpr && annotateTypes(monthsExpr, {\n dialect: this.dialect,\n });\n\n let intervalOrToMonths: Expression;\n if (annotatedMonths?.isType([\n DataTypeExprKind.FLOAT,\n DataTypeExprKind.DOUBLE,\n DataTypeExprKind.DECIMAL,\n ])) {\n /** Float case: Round and use TO_MONTHS */\n intervalOrToMonths = new AnonymousExpr({\n this: 'TO_MONTHS',\n expressions: [\n new CastExpr({\n this: new AnonymousExpr({\n this: 'ROUND',\n expressions: monthsExpr && [\n monthsExpr,\n ],\n }),\n to: new DataTypeExpr({\n this: DataTypeExprKind.INT,\n }),\n }),\n ],\n });\n } else {\n intervalOrToMonths = new IntervalExpr({\n this: monthsExpr,\n unit: new VarExpr({\n this: 'MONTH',\n }),\n });\n }\n\n const dateAddExpr = new AddExpr({\n this: thisNode,\n expression: intervalOrToMonths,\n });\n\n /** Apply end-of-month preservation: last day of month + 1 month = last day of next month */\n const preserveEom = expression.args.preserveEndOfMonth;\n let resultExpr: Expression = dateAddExpr;\n\n if (preserveEom) {\n resultExpr = new CaseExpr({}).when(\n new EqExpr({\n this: this.func('LAST_DAY', [\n thisNode,\n ]),\n expression: thisNode,\n }),\n this.func('LAST_DAY', [\n dateAddExpr,\n ]),\n )\n .else(dateAddExpr);\n }\n\n if (thisNode?.isType([\n DataTypeExprKind.DATE,\n DataTypeExprKind.TIMESTAMPTZ,\n ])) {\n return this.sql(new CastExpr({\n this: resultExpr,\n to: thisNode.type,\n }));\n }\n\n return this.sql(resultExpr);\n }\n\n formatSql (expression: FormatExpr): string {\n if (expression.name.toLowerCase() === '%s' && expression.args.expressions?.length === 1) {\n return this.func('FORMAT', [\n LiteralExpr.string('{}'),\n expression.args.expressions[0],\n ]);\n }\n return this.functionFallbackSql(expression);\n }\n\n dateTruncSql (expression: DateTruncExpr): string {\n const unit = unitToStr(expression);\n const dateNode = expression.args.this;\n const result = this.func('DATE_TRUNC', [\n unit,\n dateNode,\n ]);\n\n if (\n expression.args.inputTypePreserved\n && dateNode?.isType(DataTypeExpr.TEMPORAL_TYPES)\n && !(isDateUnit(unit) && dateNode.isType(DataTypeExprKind.DATE))\n ) {\n return this.sql(new CastExpr({\n this: result,\n to: dateNode.type,\n }));\n }\n\n return result;\n }\n\n timestampTruncSql (expression: TimestampTruncExpr): string {\n const unit = unitToStr(expression);\n const zone = expression.args.zone;\n let timestamp = expression.args.this;\n const isDate = isDateUnit(unit);\n\n if (isDate && zone) {\n /** BigQuery compatibility: Truncate in target TZ and return as UTC */\n timestamp = new AtTimeZoneExpr({\n this: timestamp,\n zone: zone,\n });\n const resultSql = this.func('DATE_TRUNC', [\n unit,\n timestamp,\n ]);\n return this.sql(new AtTimeZoneExpr({\n this: resultSql,\n zone: zone,\n }));\n }\n\n let result = this.func('DATE_TRUNC', [\n unit,\n timestamp,\n ]);\n if (expression.args.inputTypePreserved) {\n if (timestamp?.isType([\n DataTypeExprKind.TIME,\n DataTypeExprKind.TIMETZ,\n ])) {\n const dummyDate = new CastExpr({\n this: LiteralExpr.string('1970-01-01'),\n to: new DataTypeExpr({\n this: DataTypeExprKind.DATE,\n }),\n });\n const dateTime = new AddExpr({\n this: dummyDate,\n expression: timestamp,\n });\n result = this.func('DATE_TRUNC', [\n unit,\n dateTime,\n ]);\n return this.sql(new CastExpr({\n this: result,\n to: timestamp.type,\n }));\n }\n\n if (timestamp?.isType(DataTypeExpr.TEMPORAL_TYPES) && !(isDate && timestamp.isType(DataTypeExprKind.DATE))) {\n return this.sql(new CastExpr({\n this: result,\n to: timestamp.type,\n }));\n }\n }\n\n return result;\n }\n\n trimSql (expression: TrimExpr): string {\n expression.args.this?.replace(castToVarchar(expression.args.this));\n if (expression.args.expression instanceof Expression) {\n expression.args.expression.replace(castToVarchar(expression.args.expression));\n }\n\n const resultSql = super.trimSql(expression);\n return genWithCastToBlob.call(this, expression, resultSql);\n }\n\n roundSql (expression: RoundExpr): string {\n const thisNode = expression.args.this;\n let decimals = expression.args.decimals;\n let truncate = expression.args.truncate;\n\n if (decimals && expression.args.castsNonIntegerDecimals) {\n if (!(decimals instanceof LiteralExpr && decimals.isInteger)) {\n decimals = new CastExpr({\n this: decimals,\n to: new DataTypeExpr({\n this: DataTypeExprKind.INT,\n }),\n });\n }\n }\n\n let func = 'ROUND';\n if (truncate instanceof LiteralExpr) {\n const truncVal = truncate.args.this?.toUpperCase();\n if (truncVal !== undefined && [\n 'ROUND_HALF_EVEN',\n 'HALF_TO_EVEN',\n ].includes(truncVal)) {\n func = 'ROUND_EVEN';\n truncate = undefined;\n } else if (truncVal !== undefined && [\n 'ROUND_HALF_AWAY_FROM_ZERO',\n 'HALF_AWAY_FROM_ZERO',\n ].includes(truncVal)) {\n truncate = undefined;\n }\n }\n\n return this.func(func, [\n thisNode,\n decimals,\n truncate,\n ]);\n }\n\n approxQuantileSql (expression: ApproxQuantileExpr): string {\n let result = this.func('APPROX_QUANTILE', [\n expression.args.this,\n expression.args.quantile,\n ]);\n\n if (expression.isType(DataTypeExpr.REAL_TYPES)) {\n result = `CAST(${result} AS DOUBLE)`;\n }\n\n return result;\n }\n\n approxQuantilesSql (expression: ApproxQuantilesExpr): string {\n /** * BigQuery APPROX_QUANTILES(expr, n) divisions.\n * DuckDB requires explicit array of probabilities [0.0, ..., 1.0].\n */\n const thisNode = expression.args.this;\n let numQuantilesExpr: Expression;\n\n if (thisNode instanceof DistinctExpr) {\n if (!thisNode.args.expressions || thisNode.args.expressions.length < 2) {\n this.unsupported('APPROX_QUANTILES requires a bucket count argument');\n return this.functionFallbackSql(expression);\n }\n numQuantilesExpr = thisNode.args.expressions[1].pop();\n } else {\n numQuantilesExpr = expression.args.expression as Expression;\n }\n\n if (!(numQuantilesExpr instanceof LiteralExpr && numQuantilesExpr.isInteger)) {\n this.unsupported('APPROX_QUANTILES bucket count must be a positive integer');\n return this.functionFallbackSql(expression);\n }\n\n const numQuantiles = parseInt(numQuantilesExpr.args.this ?? '0');\n if (numQuantiles <= 0) {\n this.unsupported('APPROX_QUANTILES bucket count must be a positive integer');\n return this.functionFallbackSql(expression);\n }\n\n const quantiles = Array.from({\n length: numQuantiles + 1,\n }, (_, i) =>\n LiteralExpr.number(i / numQuantiles));\n\n return this.sql(\n new ApproxQuantileExpr({\n this: thisNode,\n quantile: new ArrayExpr({\n expressions: quantiles,\n }),\n }),\n );\n }\n\n jsonExtractScalarSql (expression: JsonExtractScalarExpr): string {\n if (expression.args.scalarOnly) {\n expression = new JsonExtractScalarExpr({\n this: new AnonymousExpr({\n this: 'JSON_VALUE',\n expressions: [\n expression.args.this,\n expression.args.expression,\n ].filter(\n (e): e is Expression => e instanceof Expression,\n ),\n }),\n expression: LiteralExpr.string('$'),\n });\n }\n return arrowJsonExtractSqlDuckDB.call(this, expression);\n }\n\n bitwiseNotSql (expression: BitwiseNotExpr): string {\n const thisNode = expression.args.this as Expression;\n if (isBinary(thisNode)) {\n expression.type = new DataTypeExpr({\n this: DataTypeExprKind.BINARY,\n });\n }\n\n let arg = castToBit(thisNode);\n if (thisNode instanceof NegExpr) {\n arg = new ParenExpr({\n this: arg,\n });\n }\n\n expression.setArgKey('this', arg);\n const resultSql = `~${this.sql(expression, 'this')}`;\n return genWithCastToBlob.call(this, expression, resultSql);\n }\n\n windowSql (expression: WindowExpr): string {\n const thisNode = expression.args.this;\n if (thisNode instanceof CorrExpr || (thisNode instanceof FilterExpr && thisNode.args.this instanceof CorrExpr)) {\n return this.corrSql(expression);\n }\n return super.windowSql(expression);\n }\n\n filterSql (expression: FilterExpr): string {\n if (expression.args.this instanceof CorrExpr) {\n return this.corrSql(expression);\n }\n return super.filterSql(expression);\n }\n\n corrSql (expression: FilterExpr | WindowExpr | CorrExpr): string {\n if (expression instanceof CorrExpr && !expression.args.nullOnZeroVariance) {\n return this.func('CORR', [\n expression.args.this,\n expression.args.expression,\n ]);\n }\n\n const corrExpr = maybeCorrNullToFalse(expression);\n if (!corrExpr) {\n if (expression instanceof WindowExpr) return super.windowSql(expression);\n if (expression instanceof FilterExpr) return super.filterSql(expression);\n return this.sql(expression);\n }\n\n /** Emulate NULL_ON_ZERO_VARIANCE using CASE + ISNAN */\n return this.sql(\n new CaseExpr({})\n .when(new IsNanExpr({\n this: corrExpr,\n }), null_())\n .else(corrExpr),\n );\n }\n}\n\nexport class DuckDB extends Dialect {\n static DIALECT_NAME = Dialects.DUCKDB;\n\n @cache\n static get NULL_ORDERING () {\n return NullOrdering.NULLS_ARE_LAST;\n }\n\n static SUPPORTS_USER_DEFINED_TYPES = true;\n static SAFE_DIVISION = true;\n static INDEX_OFFSET = 1;\n static CONCAT_COALESCE = true;\n static SUPPORTS_ORDER_BY_ALL = true;\n static SUPPORTS_FIXED_SIZE_ARRAYS = true;\n static STRICT_JSON_PATH_SYNTAX = false;\n static NUMBERS_CAN_BE_UNDERSCORE_SEPARATED = true;\n\n @cache\n static get NORMALIZATION_STRATEGY () {\n return NormalizationStrategy.CASE_INSENSITIVE;\n }\n\n @cache\n static get DATE_PART_MAPPING (): Record<string, string> {\n const mapping: Record<string, string> = {\n ...Dialect.DATE_PART_MAPPING,\n DAYOFWEEKISO: 'ISODOW',\n };\n delete mapping['WEEKDAY'];\n return mapping;\n }\n\n @cache\n static get EXPRESSION_METADATA () {\n return new Map(DuckDbTyping.EXPRESSION_METADATA);\n }\n\n @cache\n static get INVERSE_TIME_MAPPING () {\n return {\n '%e': '%-d', // BigQuery's space-padded day (%e) -> DuckDB's no-padding day (%-d)\n '%:z': '%z', // In DuckDB %z can represent ±HH:MM, ±HHMM, or ±HH.\n '%-z': '%z',\n '%f_zero': '%n',\n '%f_one': '%n',\n '%f_two': '%n',\n '%f_three': '%g',\n '%f_four': '%n',\n '%f_five': '%n',\n '%f_seven': '%n',\n '%f_eight': '%n',\n '%f_nine': '%n',\n };\n }\n\n toJsonPath (path: Expression | undefined): Expression | undefined {\n if (path instanceof LiteralExpr && path.isString) {\n /**\n * DuckDB supports JSON pointer syntax (starting with `/`) and\n * back-of-list access `[#-i]`. We return these as-is to avoid\n * invalid JSON path canonicalization.\n */\n const pathText = path.name;\n if (pathText.startsWith('/') || pathText.includes('[#')) {\n return path;\n }\n }\n\n return super.toJsonPath(path);\n }\n\n static Tokenizer = DuckDBTokenizer;\n static Parser = DuckDBParser;\n static Generator = DuckDBGenerator;\n}\n\nDialect.register(Dialects.DUCKDB, DuckDB);\n"],"mappings":"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F,EACA,CACEsH,GACAnH,EAAW,SAAS,CACtB,EACA,CACEoH,GACApH,EAAW,YAAY,CACzB,EACA,CACEqH,GACA,SAA2BxH,EAAG,CAC5B,OAAO,KAAK,IAAI,IAAIyH,GAAY,CAC9B,KAAM,IAAI1hB,EAAQ,CAChB,KAAM,SACR,CAAC,EACD,WAAYia,EAAE,KAAK,IACrB,CAAC,CAAC,CACJ,CACF,EACA,CACE0H,GACA,SAA2B1H,EAAG,CAC5B,OAAO,KAAK,IAAI,IAAIyH,GAAY,CAC9B,KAAM,IAAI1hB,EAAQ,CAChB,KAAM,SACR,CAAC,EACD,WAAYia,EAAE,KAAK,IACrB,CAAC,CAAC,CACJ,CACF,EACA,CACE2H,GACA1R,EACF,EACA,CACE2R,GACAzH,EAAW,mBAAmB,CAChC,EACA,CACE0H,GACA1H,EAAW,mBAAmB,CAChC,EACA,CACE7E,GACA6E,EAAW,aAAa,CAC1B,EACA,CACE2H,GACAniB,EACF,CACF,CAAC,CAEH,CAGA,WAAW,2BAAqD,CAC9D,OAAO,IAAI,IAAI,CACboiB,GACAC,GACAC,GACAC,EACF,CAAC,CACH,CAGA,WAAW,cAAgB,CACzB,OAAO,IAAI,IAAI,CACb,GAAGtb,GAAU,aACb,UAEE,MACF,EACA,UAEE,MACF,EACA,QAEE,MACF,EACA,YAEE,WACF,EACA,YAEE,gBACF,EACA,SAEE,MACF,EACA,SAEE,MACF,EACA,SAEE,MACF,EACA,YAEE,MACF,EACA,QAEE,UACF,EACA,aAEE,MACF,EACA,cAEE,MACF,EACA,WAEE,MACF,EACA,gBAEE,aACF,EACA,gBAEE,WACF,EACA,cAEE,aACF,EACA,eAEE,cACF,EACA,eAEE,cACF,EACA,cAEE,gBACF,CACF,CAAC,CACH,CAGA,WAAW,mBAAqB,CAC9B,OAAO,IAAI,IAAI,CACb,QACA,UACA,QACA,MACA,OACA,OACA,UACA,WACA,SACA,aACA,KACA,OACA,YACA,OACA,QACA,SACA,eACA,UACA,OACA,QACA,eACA,KACA,SACA,aACA,QACA,QACA,UACA,UACA,OACA,UACA,SACA,KACA,OACA,iBACA,UACA,YACA,eACA,QACA,QACA,UACA,SACA,OACA,SACA,YACA,SACA,OACA,OACA,KACA,MACA,OACA,aACA,SACA,eACA,SACA,QACA,OACA,WACA,WACA,MACA,KACA,WACA,UACA,MACA,aACA,oBACA,YACA,UACA,YACA,SACA,UACA,eACA,MACA,OACA,YACA,QACA,QACA,iBACF,CAAC,CACH,CAGA,WAAW,2BAA6B,CACtC,OAAO,IAAI,IAAuB,CAChC5I,EACAyC,CACF,CAAC,CACH,CAGA,WAAW,qBAAmE,CAC5E,IAAM0hB,EAAY,IAAI,IAGtB,OACE,GAAGvb,GAAU,oBAAoB,KAAK,CACxC,EAAE,QAASwb,GAAS,CAClBD,EAAU,IAAIC,eAAoC,CACpD,CAAC,EAGDD,EAAU,IAAIE,eAAgD,EAC9DF,EAAU,IAAIG,eAAqD,EACnEH,EAAU,IAAI7C,cAAkD,EAChE6C,EAAU,IAAII,mBAA0D,EAEjEJ,CACT,CAGA,WAAW,uCAAyC,CAClD,MAAO,CACLK,GACAC,GACAC,GACAC,GACAC,EACF,CACF,CAGA,WAAW,eAAiB,CAC1B,OAAOC,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAarB,CACC,CAGA,WAAW,iBAAmB,CAC5B,OAAOA,EACL,+EACF,CACF,CAGA,WAAW,wBAA0B,CACnC,OAAOA,EACL,0CACF,CACF,CAGA,WAAW,cAAgB,CACzB,OAAOA,EAAW,GAAG5kB,EAAQ,aAAa,CAC5C,CAGA,WAAW,YAAc,CACvB,OAAO4kB,EAAW;AAAA,eACP5kB,EAAQ;AAAA,UACbA,EAAQ;AAAA,UACRA,EAAQ;AAAA,CACjB,CACC,CAGA,WAAW,iBAAmB,CAC5B,OAAO4kB,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAOrB,CACC,CAGA,WAAW,2BAA+D,CACxE,MAAO,CACL,QAAS,CACP,KACA,SACF,EACA,WAAY,CACV,KACA,SACF,EACA,cAAe,CACb,KACA,SACF,EACA,WAAY,CACV,KACA,QACF,CACF,CACF,CAGA,WAAW,wBAAkD,CAC3D,MAAO,CACL,aAAc,QACd,kBAAmB,WACnB,kBAAmB,WACnB,iBAAkB,UACpB,CACF,CAQA,WAAW,+BAAiC,CAC1C,OAAOA,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAcrB,CACC,CAMA,WAAW,kBAAoB,CAC7B,OAAOA,EAAW;AAAA;AAAA;AAAA,aAGTllB,EAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAU7B,CACC,CAOA,WAAW,kBAAoB,CAC7B,OAAOklB,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAMrB,CACC,CAOA,WAAW,0BAA4B,CACrC,OAAOA,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAWrB,CACC,CAGA,WAAW,iCAAmC,CAC5C,OAAOA,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAWrB,CACC,CAGA,WAAW,qBAAuB,CAChC,OAAOA,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA,CAKrB,CACC,CAGA,aAAcxjB,EAAmC,CAC/C,IAAMO,EAAWP,EAAW,KAAK,KAC3ByjB,EAAczjB,EAAW,KAAK,WAC9BQ,EAAOR,EAAW,KAAK,KACvB0jB,EAAO1jB,EAAW,KAAK,MAAM,EAAE,YAAY,EAE3CsB,EAAe,IAAIC,EAAa,CACpC,KAAMkiB,EACN,KAAMjjB,CACR,CAAC,EACKmjB,EAAiB,KAAK,KAAK,cAAe,CAC9CriB,EACAf,CACF,CAAC,EAED,GAAImjB,IAAS,MACX,OAAO,KAAK,IAAIC,CAAc,EAGhC,IAAMniB,EAAU,IAAIC,EAAQ,CAC1B,KAAMkiB,EACN,WAAYriB,EAAa,KAAK,CAChC,CAAC,EAED,OAAIf,GAAU,aAA4B,EACjC,KAAK,IAAI,IAAIoB,EAAS,CAC3B,KAAMH,EACN,GAAI,IAAII,EAAa,CACnB,WACF,CAAC,CACH,CAAC,CAAC,EAGG,KAAK,IAAIJ,CAAO,CACzB,CAGA,sBAA8CxB,EAA4C,CACxF,IAAM8G,EAAQ9G,EAAW,KAAK,KAExB4jB,EAAkB,IAAIniB,EAAQ,CAClC,KAAM,IAAIL,EAAU,CAClB,KAAM,IAAI0c,GAAW,CACnB,KAAM,IAAI1c,EAAU,CAClB,KAAM,IAAIC,EAAQ,CAChB,KAAMyF,EACN,WAAYnI,EAAY,OAAO,CAAC,CAClC,CAAC,CACH,CAAC,EACD,WAAYA,EAAY,OAAO,KAAK,CACtC,CAAC,CACH,CAAC,EACD,WAAYA,EAAY,OAAO,CAAC,CAClC,CAAC,EAEKklB,EAAqB,IAAI/F,GAAW,CACxC,KAAMhX,EACN,WAAYnI,EAAY,OAAO,KAAK,CACtC,CAAC,EAED,OAAO,KAAK,IACV,IAAI4D,EAAS,CAAC,CAAC,EACZ,KAAK,IAAIuhB,GAAO,CACf,KAAMhd,EACN,WAAYnI,EAAY,OAAO,CAAC,CAClC,CAAC,EAAGilB,CAAe,EAClB,KAAKC,CAAkB,CAC5B,CACF,CAGA,qBAAsB7jB,EAA2C,CAC/D,IAAM8C,EAAW9C,EAAW,KAAK,KAEjC,OAAO,KAAK,IACV,IAAImB,GAAQ,CACV,KAAM,IAAIC,EAAU,CAClB,KAAM,IAAIyD,GAAO,CACf,KAAM,IAAIif,GAAO,CACf,KAAMhhB,EACN,WAAYnE,EAAY,OAAO,CAAC,CAClC,CAAC,EACD,KAAM,IAAI0C,EAAQ,CAChB,KAAMyB,EACN,WAAYnE,EAAY,OAAO,CAAC,CAClC,CAAC,EACD,MAAO,IAAI4X,GAAQ,CACjB,KAAMzT,CACR,CAAC,CACH,CAAC,CACH,CAAC,EACD,WAAYpE,EACd,CAAC,CACH,CACF,CAGA,sBAAuBsB,EAA4C,CACjE,IAAMoC,EAAMpC,EAAW,KAAK,KAC5B,MAAO,IAAI,KAAK,IAAIgI,EAAqB,KAAK,aAAwC,8BAA+B,CACnH5F,CACF,CAAC,CAAC,CAAC,GACL,CAEA,YAAapC,EAAkC,CAE7C,OADkBA,EAAW,KAAK,WAAa,KAE7C,KAAK,YAAY,0DAA4D,EAGxE,KAAK,oBAAoBA,CAAU,CAC5C,CAMA,WAAYA,EAAiC,CAC3C,IAAM+jB,EAAS/jB,EAAW,KAAK,KACzBgkB,EAAYhkB,EAAW,KAAK,UAE9BikB,EAEJ,OAAID,EACEA,aAAqB7D,EAEvB8D,EAAYD,EAAU,KAAK,MAAQA,EAGnCC,EAAYD,EAIdC,EAAYtlB,EAAY,OAAOJ,EAAY,EAGtC,IAAI,KAAK,IAAIyJ,EAAqB,KAAK,aAAwC,iBAAkB,CACtGic,EACAF,CACF,CAAC,CAAC,CAAC,GACL,CAKA,QAAS/jB,EAA8B,CACrC,IAAMkkB,EAAIlkB,EAAW,KAAK,KACpBmkB,EAAInkB,EAAW,KAAK,aACpBokB,EAAMpkB,EAAW,KAAK,IAExBqkB,EAEJ,OAAMD,aAAejE,EAoBnBkE,EAAa,IAAIlE,EAAS,CAAC,CAAC,EAlB5BkE,EAAa,IAAI9b,EAAQ,CACvB,KAAM,IAAInH,EAAU,CAClB,KAAM,IAAID,GAAQ,CAChB,KAAM,IAAIoV,GAAQ,CAChB,KAAM,IAAI9N,EAAc,CACtB,KAAM,OACN,YAAa,EACV2b,GAAOjkB,EAAM,GAAG,KAAK,CACxB,CACF,CAAC,CACH,CAAC,EACD,WAAYxB,EAAY,OAAO,GAAO,CACxC,CAAC,CACH,CAAC,EACD,WAAYA,EAAY,OAAO,GAAS,CAC1C,CAAC,EAMI,IAAI,KAAK,IAAIqJ,EAAqB,KAAK,aAAwC,cAAe,CACnGkc,EACAC,EACAE,CACF,CAAC,CAAC,CAAC,GACL,CAMA,YAAarkB,EAAkC,CAC7C,IAAM8G,EAAQ9G,EAAW,KAAK,KACxBskB,EAAY9gB,EAAiBxD,EAAW,KAAK,OAAQyD,CAAU,EAC/DpB,EAASrC,EAAW,KAAK,KACzBukB,EAAc1Z,EAAS7K,CAAU,EAEvC,GAAI,CAACskB,GAAa,CAACC,EAAa,CAC9B,IAAMlY,EAAWhK,EAAS,gBAAkB,YAC5C,OAAO,KAAK,KAAKgK,EAAU,CACzBvF,CACF,CAAC,CACH,CAEA,IAAM0d,EAAMF,GAAW,MAAM,YAAY,GAAK,MAC1CllB,EAEJ,GAAIolB,IAAQ,SAAWA,IAAQ,OAC7BplB,EAAS,KAAK,KAAK,SAAU,CAC3B0H,CACF,CAAC,UACQ0d,IAAQ,SACjBplB,EAAS,KAAK,KAAK,cAAe,CAChC0H,CACF,CAAC,UACQ0d,IAAQ,MACjBplB,EAAS,KAAK,KAAK,QAAS,CAC1B0H,CACF,CAAC,MACI,CACL,GAAIzE,EACF,OAAO,KAAK,IAAIlC,EAAM,CAAC,EAEvB,KAAK,YAAY,UAAUqkB,CAAG,mBAAmB,EACjDplB,EAAS,KAAK,KAAK,YAAa,CAC9B0H,CACF,CAAC,CAEL,CAEA,OAAOzE,EAAS,OAAOjD,CAAM,IAAMA,CACrC,CAKA,iBAAkBY,EAA8C,CAC9D,IAAMykB,EAAU,CACdzkB,EAAW,KAAK,KAChB,GAAIA,EAAW,KAAK,aAAe,CACnC,CACF,EACM0kB,EAAc,KAAK,oBAAoB1kB,CAAU,EAEvD,GAAIA,EAAW,KAAK,YAClB,OAAO,KAAK,IAAI0kB,CAAW,EAG7B,IAAMC,EAAWF,EAAQ,CAAC,GAAKtkB,EAAM,EAC/BykB,EAAW,IAAIriB,EAAS,CAAC,CAAC,EAAE,KAChC,IAAIK,GAAO,CACT,KAAM,IAAIkC,EAAO,CACf,KAAM6f,EAAS,KAAK,EACpB,WAAYxkB,EAAM,CACpB,CAAC,EACD,WAAYskB,EAAQ,MAAM,CAAC,EAAE,OAC3B,CAACI,EAAKziB,IACJ,IAAIQ,GAAO,CACT,KAAMiiB,EACN,WAAY,IAAI/f,EAAO,CACrB,MAAO1C,GAAOjC,EAAM,GAAG,KAAK,EAC5B,WAAYA,EAAM,CACpB,CAAC,CACH,CAAC,EACH,IAAI2E,EAAO,CACT,KAAM6f,EAAS,KAAK,EACpB,WAAYxkB,EAAM,CACpB,CAAC,CACH,CACF,CAAC,EACDA,EAAM,CACR,EAEA,OAAAykB,EAAS,UAAU,UAAWF,CAAW,EAClC,KAAK,IAAIE,CAAQ,CAC1B,CAGA,aAAc5kB,EAAmC,CAC/C,IAAM8kB,EAAW9kB,EAAW,KAAK,SAOjC,OANkBA,EAAW,KAAK,WAGhC,KAAK,YAAY,0DAA0D,EAGxE8kB,EAOE,KAAK,KAAK,QAAS,CACxBA,CACF,CAAC,GARC,KAAK,YAAY,uDAAuD,EACjE,KAAK,KAAK,QAAS,CACxBnmB,EAAY,OAAO,CAAC,CACtB,CAAC,EAML,CAEA,YAAaqB,EAAkC,CAC7C,OAAO,KAAK,iBAAiBA,CAAU,CACzC,CAEA,SAAUA,EAA+B,CACvC,OAAO,KAAK,iBAAiBA,CAAU,CACzC,CAEA,UAAWA,EAAwBV,EACd,CAAC,EAAW,CAC/B,IAAIylB,EAAWzlB,EAAQ,UAAY,KAC/B0lB,EAAO1lB,EAAQ,MAAQ,GACvB2lB,EAAS,GAETjlB,EAAW,KAAK,QAClBilB,EAAS,UACTF,EAAW,IACXC,EAAO,IAGT,IAAME,EAAY,MAAM,UAAUllB,EAAY,CAC5C,SAAA+kB,EACA,KAAAC,CACF,CAAC,EACD,MAAO,GAAGC,CAAM,GAAGC,CAAS,EAC9B,CAEA,QAASllB,EAA8B,CACrC,MAAO,QAAQA,EAAW,IAAI,EAChC,CAEA,WAAYA,EAAiC,CAC3C,IAAMmlB,EAAQnlB,EAAW,KAAK,MAAQ,SAAW,GAC3C+N,EAAU,KAAK,IAAI/N,EAAY,MAAM,EACrColB,EAAaplB,EAAW,KAAK,KAAO,SAASA,EAAW,KAAK,IAAI,GAAK,GAC5E,MAAO,GAAGmlB,CAAK,WAAWpX,CAAO,GAAGqX,CAAU,EAChD,CAEA,cAAeplB,EAAoC,CACjD,YAAK,YACH,gFACF,EACO,KAAK,oBAAoBA,CAAU,CAC5C,CAEA,wBAAyBA,EAA8C,CACrE,OAAO,KAAK,IACV,IAAI2B,EAAS,CACX,KAAM3B,EAAW,KAAK,KACtB,GAAI,IAAI4B,EAAa,CACnB,kBACF,CAAC,CACH,CAAC,CACH,CACF,CAEA,aAAc5B,EAAmC,CAC/C,IAAMqI,EAAarI,EAAW,KAAK,WAC7BqlB,EACJhd,GACG,6BAGH,EAAE,SAASA,EAAW,KAAK,IAAwB,EAErD,GAAIrI,EAAW,KAAK,KAAM,CACxB,IAAMslB,EAAgB,KAAK,WAAWtlB,CAAU,EAC1CulB,EAAWF,4BACjB,OAAO,KAAK,IACV,IAAI1jB,EAAS,CACX,KAAM,KAAK,KAAK,eAAgB,CAC9B3B,EAAW,KAAK,KAChBslB,CACF,CAAC,EACD,GAAI,IAAI1jB,EAAa,CACnB,KAAM2jB,CACR,CAAC,CACH,CAAC,CACH,CACF,CAEA,IAAMC,EAAUC,GAAa,KAAK,KAAMzlB,CAAU,EAClD,OAAIqlB,EACK,KAAK,IACV,IAAI1jB,EAAS,CACX,KAAM6jB,EACN,GAAI,IAAI5jB,EAAa,CACnB,kBACF,CAAC,CACH,CAAC,CACH,EAEK4jB,CACT,CAEA,aAAcxlB,EAAmC,CAC/C,IAAMslB,EAAgB,KAAK,WAAWtlB,CAAU,EAC1C0lB,EAAgB1lB,EAAW,KAAK,KAAoB,eAAb,WAC7C,OAAO,KAAK,IACV,IAAI2B,EAAS,CACX,KAAM,KAAK,KAAK+jB,EAAc,CAC5B1lB,EAAW,KAAK,KAChBslB,CACF,CAAC,EACD,GAAI,IAAI1jB,EAAa,CACnB,WACF,CAAC,CACH,CAAC,CACH,CACF,CAEA,gBAAiB5B,EAAsC,CACrD,IAAM8C,EAAW9C,EAAW,KAAK,KAC3B2lB,EAAa,KAAK,WAAW3lB,CAAU,EACvC4lB,EAAO5lB,EAAW,KAAK,KACvB6lB,EAAWjkB,EAAa,MAAM,OAAQ,CAC1C,QAAS,QACX,CAAC,EACKkkB,EAAYF,EAAOG,GAAcpkB,EAEvC,GAAIgkB,EAAY,CACd,IAAMtZ,EAAWuZ,EAAO,eAAiB,WACnCI,EAAW,IAAIvd,EAAc,CACjC,KAAM4D,EACN,YAAa,CACXvJ,GAAY3C,EAAM,EAClBwlB,CACF,CACF,CAAC,EACD,OAAO,KAAK,IAAI,IAAIG,EAAU,CAC5B,KAAME,EACN,GAAIH,CACN,CAAC,CAAC,CACJ,CAEA,OAAI/iB,aAAoBmjB,IAAoBnjB,GAAU,aAA4B,EACzE,KAAK,IAAIA,GAAY3C,EAAM,CAAC,EAG9B,KAAK,IAAI,IAAI2lB,EAAU,CAC5B,KAAMhjB,EACN,GAAI+iB,CACN,CAAC,CAAC,CACJ,CAEA,eAAgB7lB,EAAqC,CACnD,GAAI,CAACA,EAAW,KAAK,KACnB,MAAO,eAGT,IAAM4G,EAAO,IAAIjF,EAAS,CACxB,KAAM,IAAIsB,EAAe,CACvB,KAAM,IAAI+Y,GAAqB,CAAC,CAAC,EACjC,KAAMhc,EAAW,KAAK,IACxB,CAAC,EACD,GAAI,IAAI4B,EAAa,CACnB,WACF,CAAC,CACH,CAAC,EACD,OAAO,KAAK,IAAIgF,CAAI,CACtB,CAEA,aAAc5G,EAAmC,CAC/C,IAAMoC,EAAMpC,EAAW,KAAK,KAC5B,OAAIA,EAAW,KAAK,KACX,KAAK,IACV,IAAIuC,EAAS,CAAC,CAAC,EACZ,KAAK,KAAK,KAAK,aAAc,CAC5BH,GAAOjC,EAAM,CACf,CAAC,EAAIiC,aAAeqB,GAAc,OAAOrB,GAAQ,SAAYA,EAAM,EAAE,EACpE,KAAKjC,EAAM,CAAC,CACjB,EAEK,KAAK,KAAK,OAAQ,CACvBiC,CACF,CAAC,CACH,CAEA,SAAUpC,EAA+B,CACvC,OAAAkc,GAAgB,KAAK,KAAMlc,EAAY,UAAU,EAC1C,KAAK,KAAK,QAAS,CACxBA,EAAW,KAAK,IAClB,CAAC,CACH,CAEA,UAAWA,EAAgC,CACzC,IAAMkmB,EAAOlmB,EAAW,KAAK,KACvBmmB,EAASnmB,EAAW,KAAK,OACzBokB,EAAMpkB,EAAW,KAAK,IAExBomB,EACAC,EAEJ,GAAIjC,aAAejE,GAAY,CAACiE,EAAI,KAAK,KACvCgC,EAAK,IAAIjG,EAAS,CAAC,CAAC,EACpBkG,EAAK,IAAIlG,EAAS,CAAC,CAAC,MACf,CACL,IAAMmG,GAAQlC,aAAejE,EAAWiE,EAAI,KAAK,KAAOA,IAAQjkB,EAAM,EACtEimB,EAAKpe,EAAqB,KAAK,aAAwC,uBAAwB,CAC7Fse,CACF,CAAC,EACDD,EAAKre,EAAqB,KAAK,aAAwC,uBAAwB,CAC7F,IAAIvG,EAAQ,CACV,KAAM6kB,EAAK,KAAK,EAChB,WAAY3nB,EAAY,OAAO,CAAC,CAClC,CAAC,CACH,CAAC,CACH,CAEA,OAAO,KAAK,IAAIqJ,EAAqB,KAAK,aAAwC,gBAAiB,CACjGke,EACAC,EACAC,EACAC,CACF,CAAC,CAAC,CACJ,CAEA,WAAYrmB,EAAiC,CAC3C,IAAMumB,EAASvmB,EAAW,KAAK,KACzB8H,EAAS9H,EAAW,KAAK,WACzBokB,EAAMpkB,EAAW,KAAK,IAEtBwmB,EAAcD,aAAkB5nB,GAAe4nB,EAAO,WACvDze,aAAkBnJ,GAAemJ,EAAO,UAEzCuc,EACED,aAAejE,EAkBnBkE,EAAa,IAAIlE,EAAS,CAAC,CAAC,EAjB5BkE,EAAa,IAAI9b,EAAQ,CACvB,KAAM,IAAInH,EAAU,CAClB,KAAM,IAAID,GAAQ,CAChB,KAAM,IAAIoV,GAAQ,CAChB,KAAM,IAAI9N,EAAc,CACtB,KAAM,OACN,YAAa,CACX2b,GAAO,EACT,CACF,CAAC,CACH,CAAC,EACD,WAAYzlB,EAAY,OAAO,GAAO,CACxC,CAAC,CACH,CAAC,EACD,WAAYA,EAAY,OAAO,GAAS,CAC1C,CAAC,EAKH,IAAI8nB,EAAwB,IAAIplB,EAAQ,CACtC,KAAMyG,EACN,WAAYye,CACd,CAAC,EACGC,IACFC,EAAY,IAAIhlB,EAAQ,CACtB,KAAMglB,EACN,WAAY9nB,EAAY,OAAO,CAAC,CAClC,CAAC,GAGH,IAAIS,EAAqB,IAAIqC,EAAQ,CACnC,KAAM8kB,EACN,WAAY,IAAIzlB,GAAQ,CACtB,KAAMujB,EACN,WAAY,IAAIjjB,EAAU,CACxB,KAAMqlB,CACR,CAAC,CACH,CAAC,CACH,CAAC,EAED,OAAID,IACFpnB,EAAS,IAAIuC,EAAS,CACpB,KAAM,IAAIyc,GAAU,CAClB,KAAMhf,CACR,CAAC,EACD,GAAI,IAAIwC,EAAa,CACnB,aACF,CAAC,CACH,CAAC,GAGI,KAAK,IAAIxC,CAAM,CACxB,CAEA,iBAAkBY,EAAuC,CAEvD,IAAM0mB,EAAO1mB,EAAW,KAAK,KAG7B,GAFiBA,EAAW,KAAK,SAEnB,CACZ,IAAM2mB,EAAOnjB,EAAiBxD,EAAW,KAAK,KAAM,SAAUrB,CAAW,EACnEioB,EAASpjB,EAAiBxD,EAAW,KAAK,IAAK,SAAUrB,CAAW,EACtEkoB,EAAuCrjB,EAAiBxD,EAAW,KAAK,IAAK,SAAUrB,CAAW,EAGtG,GAAI,CAAC+nB,GAAQ,CACXC,EACAC,EACAC,CACF,EAAE,MAAOzkB,GAAQA,aAAezD,GAAeyD,EAAI,QAAQ,EAAG,CAC5D,IAAM0kB,EAAO,UAAUH,aAAgBhoB,EAAcgoB,EAAK,KAAK,KAAOA,IAAS,GAAG,EAC5EI,EAAO,UAAUH,aAAkBjoB,EAAcioB,EAAO,KAAK,KAAOA,IAAW,GAAG,EAClFI,EAAO,UAAUH,aAAepjB,EAAaojB,EAAI,KAAK,KAAiBA,IAAQ,GAAG,EACxF,GAAI,GAAKC,GAAQA,GAAQ,IAAM,GAAKC,GAAQA,GAAQ,IAAM,GAAKC,GAAQA,GAAQ,GAC7E,OAAOlM,EAAW,WAAW,EAAE,KAAK,KAAM9a,CAAU,CAExD,CAGI0mB,IACFG,EAAM,IAAIplB,EAAQ,CAChB,KAAMolB,EACN,WAAY,IAAIte,EAAQ,CACtB,KAAMme,EAAK,IAAI,EACf,WAAY/nB,EAAY,OAAO,GAAY,CAC7C,CAAC,CACH,CAAC,GAGH,IAAMsoB,EAAe,IAAIxlB,EAAQ,CAC/B,KAAM,IAAIA,EAAQ,CAChB,KAAM,IAAIX,GAAQ,CAChB,KAAM6lB,EACN,WAAYhoB,EAAY,OAAO,IAAI,CACrC,CAAC,EACD,WAAY,IAAImC,GAAQ,CACtB,KAAM8lB,EACN,WAAYjoB,EAAY,OAAO,EAAE,CACnC,CAAC,CACH,CAAC,EACD,WAAYkoB,CACd,CAAC,EAED,OAAO,KAAK,IACV,IAAIplB,EAAQ,CACV,KAAM,IAAIE,EAAS,CACjB,KAAMhD,EAAY,OAAO,UAAU,EACnC,GAAIiD,EAAa,MAAM,MAAM,CAC/B,CAAC,EACD,WAAY,IAAIL,EAAa,CAC3B,KAAM0lB,EACN,KAAM,IAAIvmB,EAAQ,CAChB,KAAM,QACR,CAAC,CACH,CAAC,CACH,CAAC,CACH,CACF,CAEA,OAAIgmB,GACF1mB,EAAW,UACT,MACA,IAAIyB,EAAQ,CACV,KAAMzB,EAAW,KAAK,IACtB,WAAY,IAAIuI,EAAQ,CACtB,KAAMme,EAAK,IAAI,EACf,WAAY/nB,EAAY,OAAO,GAAY,CAC7C,CAAC,CACH,CAAC,CACH,EAGKmc,EAAW,WAAW,EAAE,KAAK,KAAM9a,CAAU,CACtD,CAGA,WAAYA,EAAiC,CAC3C,IAAMknB,EAAelnB,EAAW,KAAK,WAEjCknB,GAAc,OAAO,6BAGzB,CAAC,GACC,KAAK,YACH,4GACF,EAGF,IAAMC,EAAW3jB,EAAiBxD,EAAW,KAAK,KAAMyD,CAAU,GAAG,KAAK,YAAY,EAEtF,GAAI0jB,IAAa,QAAaA,KAAYvN,EAAgB,0BAA2B,CACnF,GAAM,CACJ4K,EACAe,CACF,EAAI3L,EAAgB,0BAA0BuN,CAAQ,EAEhDC,EACJD,IAAa,cACVD,GAAc,OAAO,gBAGxB,CAAC,EAEGG,EAAmBH,GAAgB/mB,EAAM,EAC/C,GAAIinB,EACF,YAAK,YAAY,gEAAgE,EAC1E,KAAK,IACV,IAAIzlB,EAAS,CACX,KAAM,IAAIb,GAAQ,CAChB,KAAM,IAAIshB,GAAY,CACpB,KAAM,IAAI1hB,EAAQ,CAChB,KAAM,aACR,CAAC,EACD,WAAY2mB,CACd,CAAC,EACD,WAAY1oB,EAAY,OAAO,GAAI,CACrC,CAAC,EACD,GAAIiD,EAAa,MAAM2jB,EAAU,CAC/B,QAAS,QACX,CAAC,CACH,CAAC,CACH,EAGF,IAAI+B,EAA4BD,EAChC,OAAIF,IAAa,eACfG,EAAgB,IAAI3lB,EAAS,CAC3B,KAAM0lB,EACN,GAAI,IAAIzlB,EAAa,CACnB,kBACF,CAAC,CACH,CAAC,GAGI,KAAK,IACV,IAAID,EAAS,CACX,KAAM,IAAI8G,EAAc,CACtB,KAAM,WACN,YAAa,CACX6e,EACA3oB,EAAY,OAAO6lB,CAAG,CACxB,CACF,CAAC,EACD,GAAI5iB,EAAa,MAAM2jB,EAAU,CAC/B,QAAS,QACX,CAAC,CACH,CAAC,CACH,CACF,CAEA,GAAI4B,IAAa,QAAaA,KAAYvN,EAAgB,uBAAwB,CAChF,IAAMvN,EAAWuN,EAAgB,uBAAuBuN,CAAQ,EAC5D/nB,EAAqB,IAAIqJ,EAAc,CACzC,KAAM4D,EACN,YAAa,CACX6a,GAAgB/mB,EAAM,CACxB,CACF,CAAC,EACD,OAAIgnB,IAAa,iBACf/nB,EAAS,IAAIuC,EAAS,CACpB,KAAMvC,EACN,GAAIwC,EAAa,MAAM,SAAU,CAC/B,QAAS,QACX,CAAC,CACH,CAAC,GAEI,KAAK,IAAIxC,CAAM,CACxB,CAEA,OAAO,MAAM,WAAWY,CAAU,CACpC,CAEA,sBAAuBA,EAA4C,CACjE,IAAMO,EAAWP,EAAW,KAAK,KAC3BunB,EAAWvnB,EAAW,KAAK,WAEjC,GAAIO,GAAYgnB,EACd,OAAO,KAAK,IAAI,IAAI9lB,EAAQ,CAC1B,KAAMlB,EACN,WAAYgnB,CACd,CAAC,CAAC,EAGJ,IAAIV,EAAM7mB,EAAW,KAAK,IAC1B,GAAI,CAAC6mB,EAAK,OAAO/L,EAAW,gBAAgB,EAAE,KAAK,KAAM9a,CAAU,EAEnE,IAAMwnB,EAAQxnB,EAAW,KAAK,MAC1BwnB,IACFX,EAAM,IAAIplB,EAAQ,CAChB,KAAMolB,EACN,WAAY,IAAIzlB,EAAU,CACxB,KAAM,IAAImH,EAAQ,CAChB,KAAMif,EAAM,IAAI,EAChB,WAAY7oB,EAAY,OAAO,QAAQ,CACzC,CAAC,CACH,CAAC,CACH,CAAC,GAGH,IAAM+nB,EAAO1mB,EAAW,KAAK,KAC7B,OAAI0mB,IACFG,EAAM,IAAIplB,EAAQ,CAChB,KAAMolB,EACN,WAAY,IAAIzlB,EAAU,CACxB,KAAM,IAAImH,EAAQ,CAChB,KAAMme,EAAK,IAAI,EACf,WAAY/nB,EAAY,OAAO,cAAc,CAC/C,CAAC,CACH,CAAC,CACH,CAAC,IAGC6oB,GAASd,IACX1mB,EAAW,UAAU,MAAO6mB,CAAG,EAG1B/L,EAAW,gBAAgB,EAAE,KAAK,KAAM9a,CAAU,CAC3D,CAEA,yBAA0BA,EAA+C,CACvE,IAAM0mB,EAAO1mB,EAAW,KAAK,KAC7B,OAAI0mB,GAAMA,EAAK,IAAI,EAGZ,QADW5L,EAAW,gBAAgB,EAAE,KAAK,KAAM9a,CAAU,CAC5C,kBAC1B,CAEA,wBAAyBA,EAA8C,CACrE,IAAI+C,EAAO/C,EAAW,KAAK,KACvB+C,IAAMA,EAAOA,EAAK,IAAI,GAE1B,IAAM2jB,EAAO1mB,EAAW,KAAK,KACzB0mB,GAAMA,EAAK,IAAI,EAEnB,IAAMte,EAAY0S,EAAW,gBAAgB,EAAE,KAAK,KAAM9a,CAAU,EAEpE,OAAI+C,EACK,GAAGqF,CAAS,iBAAiB,KAAK,IAAIrF,CAAI,CAAC,GAG7CqF,CACT,CAEA,eAAgBpI,EAA6BV,EAAyC,CAAC,EAAW,CAChG,IAAImoB,EAAUnoB,EAAQ,mBAKtB,GAJMU,EAAW,kBAAkBd,KACjCuoB,EAAU,eAGRznB,EAAW,KAAK,KAAM,CACxB,IAAM0nB,EAAS1nB,EAAW,KAAK,OAC3B0nB,aAAkBjkB,GAAcikB,EAAO,MAAM,YAAY,IAAM,cACjE,KAAK,YACH,mBAAmBA,CAAM,kFAC3B,EACA1nB,EAAW,UAAU,SAAU,IAAIU,EAAQ,CACzC,KAAM,WACR,CAAC,CAAC,EAEN,CAEA,OAAO,MAAM,eAAeV,EAAY,CACtC,mBAAoBynB,CACtB,CAAC,CACH,CAEA,aAAcznB,EAA2BV,EAA0B,CAAC,EAAW,CAC7E,OAAIU,EAAW,kBAAkB2nB,GACxB,KAAK,IAAI3nB,EAAY,MAAM,EAE7B,MAAM,aAAaA,EAAYV,CAAO,CAC/C,CAEA,QAASU,EAA8B,CACrC,IAAM4nB,EAAe,CACnB,kBAGF,EAAE,SAAS5nB,EAAW,KAAK,MAAQ,EAAE,EAErC,GACE,CAACA,EAAW,KAAK,OACd,CAACA,EAAW,KAAK,IACjB,CAACA,EAAW,KAAK,QACjB4nB,EACH,CAKA,GAAI5nB,EAAW,KAAK,gBAAgB6nB,GAClC,OAAO,MAAM,QAAQ7nB,EAAW,GAAG,IAAIyC,GAAY,CACjD,KAAM,EACR,CAAC,CAAC,CAAC,EAGLzC,EAAW,UAAU,OAAQ,MAAS,EACtCA,EAAW,UAAU,OAAQ,MAAS,CACxC,CAEA,OAAO,MAAM,QAAQA,CAAU,CACjC,CAEA,kBAAmBA,EAAwC,CAEzD,OAAIA,EAAW,KAAK,eACX8a,EAAW,OAAO,EAAE,KAAK,KAAM9a,CAAU,EAG3C,KAAK,oBAAoBA,CAAU,CAC5C,CAEA,WAAYA,EAAiC,CAC3C,MAAI,GAAI,KAAK,QAAQ,QAAQ,OAAU,KAAK,QAAQ,QAAQ,QAAU,GAAK,GAAK,KAAK,QAAQ,QAAQ,MAC5F,KAAK,oBAAoBA,CAAU,EAGrC8nB,GAAa,KAAK,KAAM9nB,CAAU,CAC3C,CAEA,WAAYA,EAAiC,CAC3C,GAAI,EAAI,KAAK,QAAQ,QAAQ,OAAU,KAAK,QAAQ,QAAQ,QAAU,GAAK,GAAK,KAAK,QAAQ,QAAQ,MACnG,OAAO,MAAM,WAAWA,CAAU,EAMpC,IAAM8C,EAAW9C,EAAW,KAAK,KAC7B8C,aAAoBmB,GACtBnB,EAAS,QAAQ,IAAI1B,EAAU,CAC7B,KAAM0B,EAAS,KAAK,CACtB,CAAC,CAAC,EAGJ,IAAIuU,EAAU,MAAM,WAAWrX,CAAU,EAEzC,GAAI,CAACA,EAAW,KAAK,mBAAoB,CACvC,IAAM+nB,EAAevkB,EAAiBV,EAAUW,CAAU,EACpDukB,EAAYD,GAAc,KAC5BA,EACAA,GAAgBrY,GAAcqY,EAAc,CAC5C,QAAS,KAAK,OAChB,CAAC,EAECnkB,EAAOokB,OAA+B,IACxC3Q,EAAU,IAAIA,CAAO,OAEzB,CAEA,OAAOA,CACT,CAMA,eAAgBrX,EAAqC,CACnD,IAAMioB,EAAOjoB,EAAW,KAAK,KAE7B,GAAIioB,aAAgBC,GAAc,CAChC,IAAMC,EAAQnoB,EAAW,KAAK,WAC9B,GAAI,EAAEmoB,aAAiBlpB,IACrB,OAAO,KAAK,IAAIgpB,CAAI,EAGtB,IAAMG,EAAeH,EAAK,KAAK,KAE/BA,EAAK,UACH,OACA,IAAIhpB,GAAU,CACZ,KAAMuE,EAAiBykB,EAAK,KAAK,KAAMxkB,CAAU,GAAG,KAAK,EACzD,YAAa0kB,EAAM,KAAK,WAC1B,CAAC,CACH,EAEA,IAAME,EAAc,KAAK,oBAAoBJ,CAAgB,EAC7D,OAAOG,aAAwB3kB,EAAa,KAAK,sBAAsB4kB,EAAaJ,EAAMG,CAAY,EAAI,EAC5G,CAEA,IAAME,EAAgB,KAAK,IAAItoB,EAAY,YAAY,EAEvD,GAAIioB,aAAgB9S,IAAsB8S,aAAgB7S,GAAoB,CAK5E,IAAMmT,EAAWvoB,EAAW,KAAKwoB,EAAW,EACxCD,IACFN,EAAK,UAAU,aAAcA,EAAK,KAAK,IAAI,EAC3CA,EAAK,UAAU,OAAQM,EAAS,KAAK,IAAI,EAE7C,CAGA,MAAO,GADS,KAAK,IAAIvoB,EAAY,MAAM,EAAE,QAAQ,MAAO,EAAE,CAC7C,GAAGsoB,CAAa,GACnC,CAEA,UAAWtoB,EAAgC,CACzC,IAAMoC,EAAMpC,EAAW,KAAK,KAE5B,GAAI,CAACA,EAAW,KAAK,QAAWoC,aAAezD,GAAeyD,EAAI,SAChE,OAAO,KAAK,KAAK,SAAU,CACzBA,CACF,CAAC,EASH,IANkBA,GAAK,KACnBA,EACAA,GAAOsN,GAActN,EAAK,CAC1B,QAAS,KAAK,OAChB,CAAC,IAEY,OAAOR,EAAa,UAAU,EAC3C,OAAO,KAAK,KAAK,SAAU,CACzBQ,CACF,CAAC,EAIH,IAAM4I,EAAO,IAAIrJ,EAAS,CACxB,KAAMS,EACN,GAAI,IAAIR,EAAa,CACnB,gBACF,CAAC,CACH,CAAC,EACK6mB,EAAU,IAAI9mB,EAAS,CAC3B,KAAMS,EACN,GAAI,IAAIR,EAAa,CACnB,cACF,CAAC,CACH,CAAC,EAEK8mB,EAAW,IAAInmB,EAAS,CAC5B,KAAM,IAAIkG,EAAc,CACtB,KAAM,SACN,YAAarG,EACT,CACAA,CACF,EACE,CACF,CACJ,CAAC,CACH,CAAC,EACE,KAAKzD,EAAY,OAAO,MAAM,EAAG,IAAIid,GAAe,CACnD,KAAM5Q,CACR,CAAC,CAAC,EACD,KAAK,IAAIvC,EAAc,CACtB,KAAM,SACN,YAAa,CACXggB,CACF,CACF,CAAC,CAAC,EAEJ,OAAO,KAAK,IAAIC,CAAQ,CAC1B,CAEA,eAAgB1oB,EAAqC,CACnDkc,GAAgB,KAAK,KAAMlc,EAAY,UAAW,UAAW,SAAS,EACtE,IAAM8C,EAAW9C,EAAW,KAAK,KAC3BmD,EAAWnD,EAAW,KAAK,WAC3B2oB,EAAU3oB,EAAW,KAAK,QAEhC,GAAI,CAAC2oB,EACH,OAAO,KAAK,KAAK,cAAe,CAC9B7lB,EACAK,CACF,CAAC,EAIH,IAAMylB,EAAc,IAAI1U,GAAgB,CACtC,KAAMpR,EACN,WAAYK,CACd,CAAC,EACD,OAAO,KAAK,IAAI,IAAI0lB,GAAU,CAC5B,KAAMD,EACN,YAAa,CACXD,CACF,EACA,YAAa,EACf,CAAC,CAAC,CACJ,CAEA,OAAQ3oB,EAA6B,CACnC,IAAM8oB,EAAY9oB,EAAW,KAAK,KAC5B+oB,EAAU/oB,EAAW,KAAK,aAAerB,EAAY,OAAO,GAAG,EAErE,GAAIkM,EAASie,CAAS,GAAKje,EAASke,CAAO,EAAG,CAC5C,IAAMC,EAAYhpB,EAAW,KAAK,WAC5BipB,EAASjpB,EAAW,KAAK,OAEzBkpB,EAAW,IAAItN,GAAe,CAClC,KAAMkN,CACR,CAAC,EACKK,EAAc,IAAI9nB,EAAQ,CAC9B,KAAM2nB,EACN,WAAYE,CACd,CAAC,EACKE,EAAW,IAAIC,GAAa,CAChC,KAAM1qB,EAAY,OAAO,CAAC,EAC1B,YAAa,CACXwqB,CACF,EACA,YAAa,EACf,CAAC,EACKG,EAAa,IAAIC,GAAW,CAChC,KAAMR,EACN,MAAO,CACLK,CACF,CACF,CAAC,EAEK,CACJ5Y,EACAC,EACF,EAAIwY,EACA,CACAK,EACAR,CACF,EACE,CACAA,EACAQ,CACF,EACF,OAAO,KAAK,IAAI,IAAIE,GAAU,CAC5B,KAAMhZ,EACN,WAAYC,EACd,CAAC,CAAC,CACJ,CAEA,OAAO,MAAM,OAAOzQ,CAAU,CAChC,CAEA,WAAYA,EAAiC,CAC3C,IAAMypB,EAAIzpB,EAAW,KAAK,KACpB0pB,EAAQ1pB,EAAW,KAAK,aAAe,CAC7C,EAEA,GAAI0pB,EAAM,SAAW,GAAKA,EAAM,CAAC,YAAaC,GAC5C,YAAK,YAAY,sEAAsE,EAChF,KAAK,KAAK,UAAW,CAC1BF,EACA,GAAGC,CACL,CAAC,EAGH,IAAMtqB,EAAS4I,EAAoB4R,EAAgB,iBAAiB,KAAK,EAAG,CAC1E8P,EAAM,CAAC,EACPD,CACF,CAAC,EACD,MAAO,IAAI,KAAK,IAAIrqB,CAAM,CAAC,GAC7B,CAEA,kBAAmBY,EAAwC,CACzD,IAAMZ,EAAS4I,EAAoB4R,EAAgB,yBAAyB,KAAK,EAAG,CAClF5Z,EAAW,KAAK,IAClB,CAAC,EACD,MAAO,IAAI,KAAK,IAAIZ,CAAM,CAAC,GAC7B,CAEA,yBAA0BY,EAA+C,CACvE,IAAMZ,EAAS4I,EAAoB4R,EAAgB,gCAAgC,KAAK,EAAG,CACzF5Z,EAAW,KAAK,IAClB,CAAC,EACD,MAAO,IAAI,KAAK,IAAIZ,CAAM,CAAC,GAC7B,CAEA,aAAcY,EAAmC,CAC/C,IAAMuF,EAAOvF,EAAW,KAAK,aAAe,CAC5C,EAEA,GAAIuF,EAAK,SAAW,EAElB,OAAO,KAAK,IAAI,IAAItB,EAAU,CAC5B,YAAa,CACX,IAAIsT,GAAQ,CACV,KAAM,IAAItT,EACV,OAAQ,IAAIA,CACd,CAAC,CACH,CACF,CAAC,CAAC,EAGJ,IAAM2lB,EAAUrkB,EAAK,IAAKnD,GAAQ,IAAIsC,EAAW,CAC/C,KAAMtC,CACR,CAAC,CAAC,EACIynB,EAASD,EAAQ,SAAW,EAC9BA,EAAQ,CAAC,EACT,IAAIP,GAAa,CACjB,KAAMO,EAAQ,CAAC,EACf,YAAaA,EAAQ,MAAM,CAAC,EAC5B,YAAa,EACf,CAAC,EAGGE,EAAc,KAAK,KACvB,SACAvkB,EAAK,IAAI,CAACwkB,EAAGtqB,IAAM,IAAIiH,GAAe,CACpC,KAAM/H,EAAY,OAAO,IAAIc,EAAI,CAAC,EAAE,EACpC,WAAYU,EAAM,CACpB,CAAC,CAAC,CACJ,EAEMwW,EAAQ,IAAIlV,EAAQ,CACxB,KAAM,IAAIuoB,GAAW,CACnB,KAAM,IAAIhjB,GAAe,CACvB,KAAM,KACR,CAAC,CACH,CAAC,EACD,WAAYrI,EAAY,OAAO,CAAC,CAClC,CAAC,EACKsrB,EAAkB,KAAK,KAC3B,SACA1kB,EAAK,IAAI,CAACnD,EAAK3C,IAAM,IAAIiH,GAAe,CACtC,KAAM/H,EAAY,OAAO,IAAIc,EAAI,CAAC,EAAE,EACpC,WAAY,IAAI6E,EAAY,CAC1B,KAAM,IAAImE,EAAc,CACtB,KAAM,WACN,YAAa,CACXrG,EACA,IAAI6B,EAAU,CAAC,CAAC,CAClB,CACF,CAAC,EACD,YAAa,CACX0S,CACF,CACF,CAAC,CACH,CAAC,CAAC,CACJ,EAEMvX,EAAS4I,EAAoB4R,EAAgB,oBAAoB,KAAK,EAAG,CAC7ErU,EAAK,OACH,CAACsf,EAAKziB,IAAQ,IAAIQ,GAAO,CACvB,KAAMiiB,EACN,WAAY,IAAI/f,EAAO,CACrB,KAAM1C,EACN,WAAYjC,EAAM,CACpB,CAAC,CACH,CAAC,EACD,IAAI2E,EAAO,CACT,KAAMS,EAAK,CAAC,EACZ,WAAYpF,EAAM,CACpB,CAAC,CACH,EACAoF,EAAK,OAAO,CAACsf,EAAKziB,IAAQ,IAAIsO,GAAQ,CACpC,KAAMmU,EACN,WAAY,IAAI3W,GAAO,CACrB,KAAM,IAAIxJ,EAAW,CACnB,KAAMtC,CACR,CAAC,EACD,WAAYzD,EAAY,OAAO,CAAC,CAClC,CAAC,CACH,CAAC,EAAG,IAAIuP,GAAO,CACb,KAAM,IAAIxJ,EAAW,CACnB,KAAMa,EAAK,CAAC,CACd,CAAC,EACD,WAAY5G,EAAY,OAAO,CAAC,CAClC,CAAC,CAAC,EACFmrB,EACAD,EACAI,CACF,CAAC,EAED,OAAO,KAAK,IAAI7qB,CAAM,CACxB,CAEA,SAAUY,EAA+B,CACvC,IAAM+K,EAAY,KAAK,KAAK,QAAS,CACnCJ,EAAc3K,EAAW,KAAK,IAAI,CACpC,CAAC,EACD,OAAO8K,EAAkB,KAAK,KAAM9K,EAAY+K,CAAS,CAC3D,CAEA,SAAU/K,EAA+B,CACvC,IAAM+K,EAAY,KAAK,KAAK,QAAS,CACnCJ,EAAc3K,EAAW,KAAK,IAAI,CACpC,CAAC,EACD,OAAO8K,EAAkB,KAAK,KAAM9K,EAAY+K,CAAS,CAC3D,CAEA,WAAY/K,EAAiC,CAC3C,IAAM+K,EAAY,KAAK,KAAK,UAAW,CACrCJ,EAAc3K,EAAW,KAAK,IAAI,CACpC,CAAC,EACD,OAAO8K,EAAkB,KAAK,KAAM9K,EAAY+K,CAAS,CAC3D,CAMA,gBAAiB/K,EAAsC,CACrD,IAAIZ,EAASY,EAAW,KAAK,KAEzBZ,GAAQ,OAAOwC,EAAa,UAAU,IACxCxC,EAAS,IAAIqJ,EAAc,CACzB,KAAM,SACN,YAAa,CACXrJ,CACF,CACF,CAAC,GAGHA,EAAS,IAAI8qB,GAAa,CACxB,KAAM9qB,CACR,CAAC,EAED,IAAM+qB,EAAgBnqB,EAAW,KAAK,cAChCX,EAAWW,EAAW,KAAK,SAGjCZ,EAASD,GAAgCC,EAAQC,CAAQ,EAGzD,IAAM+qB,EACJD,aAAyBxrB,GAAewrB,EAAc,SAClD,SAASA,EAAc,KAAK,MAAQ,GAAG,EACvC,EAEN,GAAI,EAAIC,EAAY,CAClB,IAAMC,EAAU,IAAIC,GAAQ,CAC1B,YAAa,CACX3rB,EAAY,OAAO,EAAE,CACvB,CACF,CAAC,EACDS,EAAS,IAAImrB,GAAS,CACpB,KAAM,IAAI9U,GAAkB,CAC1B,KAAMrW,EACN,WAAYT,EAAY,OAAO,MAAMyrB,CAAU,IAAI,EACnD,YAAa,IAAII,GAAW,CAC1B,YAAa,CACX7rB,EAAY,OAAO,KAAK,EACxB0rB,EAAQ,KAAK,CACf,CACF,CAAC,CACH,CAAC,EACD,WAAYA,EACZ,mBACF,CAAC,CACH,CAEA,OAAO,KAAK,IAAIjrB,CAAM,CACxB,CAEA,WAAYY,EAAiC,CAC3C,IAAM+K,EAAY,KAAK,KAAK,UAAW,CACrCJ,EAAc3K,EAAW,KAAK,IAAI,EAClC2K,EAAc3K,EAAW,KAAK,UAAU,EACxC2K,EAAc3K,EAAW,KAAK,WAAW,CAC3C,CAAC,EACD,OAAO8K,EAAkB,KAAK,KAAM9K,EAAY+K,CAAS,CAC3D,CAEA,UAAW/K,EAAwByqB,EAAoB,CACrDpf,GAAyBrL,CAAU,EACnC,IAAM+K,EAAY,KAAK,OAAO/K,EAAYyqB,CAAE,EAC5C,OAAO3f,EAAkB,KAAK,KAAM9K,EAAY+K,CAAS,CAC3D,CAEA,cAAe/K,EAAoC,CACjDqL,GAAyBrL,CAAU,EACnC,IAAM+K,EAAY,KAAK,KAAK,MAAO,CACjC/K,EAAW,KAAK,KAChBA,EAAW,KAAK,UAClB,CAAC,EACD,OAAO8K,EAAkB,KAAK,KAAM9K,EAAY+K,CAAS,CAC3D,CAEA,gBAAiB/K,EAAsC,CACrD,IAAM8C,EAAW9C,EAAW,KAAK,KAC3B+G,EAAM/G,EAAW,KAAK,IACtB0qB,EAAS3jB,aAAetD,EAAasD,EAAI,KAAO,GAChD4jB,EAAW,KAAK,IAAI3qB,EAAY,OAAO,EAEvC4qB,EAAQ,GAAGF,CAAM,OAAOC,CAAQ,GAKtC,OAAI7nB,aAAoBkT,KAAe,CAAClT,EAAS,KAAK,aAAeA,EAAS,KAAK,YAAY,SAAW,GACjG,KAAK,KAAK,cAAe,CAC9B8nB,CACF,CAAC,EAGI,KAAK,KAAK,gBAAiB,CAChC9nB,EACA8nB,CACF,CAAC,CACH,CAEA,UAAW5qB,EAAgC,CACzC,IAAMZ,EAAS4I,EAAoB4R,EAAgB,gBAAgB,KAAK,EAAG,CACzE5Z,EAAW,KAAK,KAChBA,EAAW,KAAK,UAClB,CAAC,EACD,OAAO,KAAK,IAAIZ,CAAM,CACxB,CAEA,cAAeY,EAAoC,CACjD,OAAO,KAAK,KAAK,cAAe,CAC9B2K,EAAc3K,EAAW,KAAK,IAAI,EAClC2K,EAAc3K,EAAW,KAAK,UAAU,CAC1C,CAAC,CACH,CAEA,SAAUA,EAA+B,CAEvC,OAAO,KAAK,IACV,IAAIupB,GAAW,CACb,KAAM5qB,EAAY,OAAO,GAAG,EAC5B,MAAO,CACL,IAAIgD,EAAS,CACX,KAAM3B,EAAW,KAAK,KACtB,GAAI,IAAI4B,EAAa,CACnB,aACF,CAAC,CACH,CAAC,CACH,CACF,CAAC,CACH,CACF,CAEA,iBAAkB5B,EAAuC,CACvD,GAAIA,EAAW,KAAK,gBAAgB6qB,GAAe,CACjD,IAAM3T,EAAQ,IAAI4T,GAAU,CAC1B,KAAM9qB,EAAW,KAAK,KACtB,MAAOA,EAAW,KAAK,MACvB,MAAOA,EAAW,KAAK,KACzB,CAAC,EACD,OAAO,KAAK,IAAIkX,CAAK,CACvB,CAEA,OAAO,MAAM,iBAAiBlX,CAAU,CAC1C,CAEA,UAAWA,EAAgC,CAEzC,GADqBA,EAAW,KAAK,aACnB,CAGXA,EAAW,KAAK,aACnBA,EAAW,UAAU,cAAe,CACpC,CAAC,EAEHA,EAAW,KAAK,aAAa,KAC3B,IAAI+qB,GAAU,CACZ,KAAM,IAAIrqB,EAAQ,CAChB,KAAM,WACR,CAAC,EACD,WAAY/B,EAAY,OAAO,CAAC,CAClC,CAAC,CACH,EAEA,IAAIoY,EAAQ/W,EAAW,KAAK,MACxB+W,aAAiBI,KACnBnX,EAAW,UAAU,QAAS,MAAS,EACnC+W,EAAM,KAAK,SAAW,EAAIA,EAAM,KAAK,QAAQ,SAC/CA,EAAQ,IAAII,GAAe,CACzB,KAAM1R,EAAOsR,EAAM,KAAK,QAAS,CAAC,CACpC,CAAC,IAIL,IAAMiU,EAAY,MAAM,UAAUhrB,CAAU,EACtCirB,EAAWlU,EAAQ,IAAI,KAAK,IAAIA,CAAK,CAAC,GAAK,GACjD,MAAO,WAAWiU,CAAS,IAAIC,CAAQ,EACzC,CAEA,OAAO,MAAM,UAAUjrB,CAAU,CACnC,CAEA,eAAgBA,EAAqC,CACnD,IAAM8C,EAAW9C,EAAW,KAAK,KAEjC,GAAK,KAAK,aAAwC,sCAAsC,KAAMiJ,GAAQnG,aAAoBmG,CAAG,EAC3H,OAAO,MAAM,eAAejJ,CAAU,EAGxC,IAAIkL,EAAOpI,EACX,OAAIoI,aAAgBggB,KAClBhgB,EAAO,IAAI4I,GAAa,CACtB,KAAM5I,EAAK,KAAK,IAClB,CAAC,GAGGA,aAAgB4I,IAAgB5I,aAAgBigB,IACpD,KAAK,YAAY,yDAAyD,EAGrE,KAAK,IAAIjgB,CAAI,CACtB,CAEA,gBAAiBlL,EAAsC,CACrD,OAAK,KAAK,aAAwC,sCAAsC,KAAMiJ,GAAQjJ,EAAW,KAAK,gBAAgBiJ,CAAG,EAChI,MAAM,gBAAgBjJ,CAAU,GAGzC,KAAK,YAAY,0DAA0D,EACpE,KAAK,IAAIA,EAAY,MAAM,EACpC,CAEA,iBAAkBA,EAAuC,CACvD,IAAI+N,EAAU,KAAK,IAAI/N,EAAY,MAAM,EACnCorB,EAAW,KAAK,IAAIprB,EAAY,MAAM,EAE5C,OAAIorB,IACFrd,EAAU,kBAAkBA,CAAO,sBAAsBqd,CAAQ,MAG5D,KAAK,KAAK,kBAAmB,CAClCrd,EACA/N,EAAW,KAAK,UAClB,CAAC,CACH,CAEA,iBAAkBA,EAAuC,CACvD,IAAI8C,EAAuB9C,EAAW,KAAK,KACrCqrB,EAAQrrB,EAAW,KAAK,MACxBsrB,EAAStrB,EAAW,KAAK,WACzB8D,EAAW9D,EAAW,KAAK,SAC3BurB,EAAavrB,EAAW,KAAK,WAC7BwrB,EAAoBxrB,EAAW,KAAK,kBAEtC8D,IAAa,EAAEA,aAAoBnF,GAAemF,EAAS,YAAc,EAAI,SAASA,EAAS,KAAK,MAAQ,GAAG,KACjHhB,EAAW,IAAI2oB,GAAc,CAC3B,KAAM3oB,EACN,MAAOgB,CACT,CAAC,EAEG0nB,IACF1oB,EAAW,IAAI4oB,GAAW,CACxB,KAAM5oB,EACN,WAAYnE,EAAY,OAAO,EAAE,CACnC,CAAC,IAIL,IAAIgtB,EAAWN,EACTO,EAAe,OAAO,KAAK,QAAQ,aAAa,4BAA4B,EAUlF,MATI,CAACN,GAAUD,IAEVA,aAAiBrkB,IAAkBqkB,EAAM,OAASO,GAC/CP,aAAiB1sB,GAAe,OAAO0sB,EAAM,KAAK,IAAI,IAAMO,KAEhED,EAAW,QAIXJ,IAAe,EAAEA,aAAsB5sB,GAAe4sB,EAAW,YAAc,EAAI,SAAUA,EAA2B,KAAK,MAAQ,GAAG,GACnI,KAAK,KAAK,gBAAiB,CAChC,KAAK,KAAK,qBAAsB,CAC9BzoB,EACA9C,EAAW,KAAK,WAChB2rB,EACAL,CACF,CAAC,EACD3sB,EAAY,OAAO,SAAU4sB,EAA2B,KAAK,MAAQ,GAAG,CAAC,CAC3E,CAAC,EAGI,KAAK,KAAK,iBAAkB,CACjCzoB,EACA9C,EAAW,KAAK,WAChB2rB,EACAL,CACF,CAAC,CACH,CAEA,eAAgBtrB,EAAqC,CACnD,IAAMwkB,EAAMxkB,EAAW,KAAK,QAAQ,KACpC,OAAIwkB,GAAO,QAAQ,KAAKA,CAAG,EAClB,KAAK,KAAK,SAAU,CACzB7lB,EAAY,OAAO,OAAO6lB,CAAG,IAAI,EACjCxkB,EAAW,KAAK,IAClB,CAAC,GAGH,KAAK,YAAY,mDAAmD,EAC7D,KAAK,oBAAoBA,CAAU,EAC5C,CAEA,iCAAkC6rB,EAAoC,CACpE,YAAK,YAAY,gEAAgE,EAC1E,EACT,CAEA,WAAY7rB,EAAiC,CAC3C,IAAM8C,EAAW9C,EAAW,KAAK,KACjC,OAAI8C,aAAoBgpB,GACf,KAAK,cAAchpB,CAAQ,EAG7B,MAAM,WAAW9C,CAAU,CACpC,CAEA,cAAeA,EAAoC,CACjD,IAAM8C,EAAW9C,EAAW,KAAK,KAC3B+rB,EAAS/rB,EAAW,OAGtBgsB,EAA8B,IAAIhlB,GAAe,CACnD,KAAM,MACN,OAAQ,EACV,CAAC,EACGilB,EAA8B,IAAIjlB,GAAe,CACnD,KAAM,MACN,OAAQ,EACV,CAAC,EAED,GAAI+kB,aAAkBG,GAAa,CACjC,IAAMC,EAAUJ,EAAO,KAAK,YAC5BC,EAAMG,IAAU,CAAC,EACjBF,EAAME,IAAU,CAAC,CACnB,SAAWJ,aAAkBjB,GAAW,CACtC,IAAM/T,EAAQgV,EAAO,KAAK,MAC1B,GAAIhV,aAAiBI,GAAgB,CACnC,IAAMiV,EAAUrV,EAAM,KAAK,QACvBqV,GAAW,EAAIA,EAAQ,SACzBJ,EAAMI,EAAQ,CAAC,EACfH,EAAOG,EAAQ,CAAC,GAAoBH,GAEtClV,EAAM,IAAI,CACZ,CACF,CAMA,IAAMsV,EAAY,KAAK,IAAI,IAAIxE,GAAW,CACxC,YAAa,CACX/kB,CACF,EACA,MAAOmpB,CACT,CAAC,CAAC,EACIK,EAAgB,KAAK,IACzB,IAAIrV,GAAU,CACZ,KAAM,IAAI5V,EAAQ,CAChB,KAAM,IAAIoH,EAAc,CACtB,KAAM,sBACN,YAAa,CACX3F,EACAnE,EAAY,OAAO,CAAC,CACtB,CACF,CAAC,EACD,WAAYA,EAAY,OAAO,CAAC,CAClC,CAAC,EACD,MAAOqtB,CACT,CAAC,CACH,EAEMO,EAAgB,KAAK,WAAW,CACpCD,EACAD,CACF,CAAC,EAED,OAAIN,aAAkBS,IAAaT,GAAUA,EAAO,kBAAkBS,GAC7D,WAAWD,CAAa,IAG1BA,CACT,CAMA,aAAcvsB,EAAmC,CAC/C,IAAI8C,EAAW9C,EAAW,KAAK,KAC1B8C,GAAU,OACbA,EAAWA,GAAY4M,GAAc5M,EAAU,CAC7C,QAAS,KAAK,OAChB,CAAC,GAGCA,GAAU,OAAOlB,EAAa,UAAU,IAC1CkB,EAAW,IAAInB,EAAS,CACtB,KAAMmB,EACN,GAAI,IAAIlB,EAAa,CACnB,gBACF,CAAC,CACH,CAAC,GAGH,IAAM6qB,EAAazsB,EAAW,KAAK,WAC7B0sB,EAAkBD,GAAY,KAChCA,EACAA,GAAc/c,GAAc+c,EAAY,CACxC,QAAS,KAAK,OAChB,CAAC,EAECE,EACAD,GAAiB,OAAO,2BAI5B,CAAC,EAECC,EAAqB,IAAIlkB,EAAc,CACrC,KAAM,YACN,YAAa,CACX,IAAI9G,EAAS,CACX,KAAM,IAAI8G,EAAc,CACtB,KAAM,QACN,YAAagkB,GAAc,CACzBA,CACF,CACF,CAAC,EACD,GAAI,IAAI7qB,EAAa,CACnB,UACF,CAAC,CACH,CAAC,CACH,CACF,CAAC,EAED+qB,EAAqB,IAAIprB,EAAa,CACpC,KAAMkrB,EACN,KAAM,IAAI/rB,EAAQ,CAChB,KAAM,OACR,CAAC,CACH,CAAC,EAGH,IAAMksB,EAAc,IAAInrB,EAAQ,CAC9B,KAAMqB,EACN,WAAY6pB,CACd,CAAC,EAGKE,EAAc7sB,EAAW,KAAK,mBAChCgF,EAAyB4nB,EAiB7B,OAfIC,IACF7nB,EAAa,IAAIzC,EAAS,CAAC,CAAC,EAAE,KAC5B,IAAI2L,GAAO,CACT,KAAM,KAAK,KAAK,WAAY,CAC1BpL,CACF,CAAC,EACD,WAAYA,CACd,CAAC,EACD,KAAK,KAAK,WAAY,CACpB8pB,CACF,CAAC,CACH,EACG,KAAKA,CAAW,GAGjB9pB,GAAU,OAAO,qBAGrB,CAAC,EACQ,KAAK,IAAI,IAAInB,EAAS,CAC3B,KAAMqD,EACN,GAAIlC,EAAS,IACf,CAAC,CAAC,EAGG,KAAK,IAAIkC,CAAU,CAC5B,CAEA,UAAWhF,EAAgC,CACzC,OAAIA,EAAW,KAAK,YAAY,IAAM,MAAQA,EAAW,KAAK,aAAa,SAAW,EAC7E,KAAK,KAAK,SAAU,CACzBrB,EAAY,OAAO,IAAI,EACvBqB,EAAW,KAAK,YAAY,CAAC,CAC/B,CAAC,EAEI,KAAK,oBAAoBA,CAAU,CAC5C,CAEA,aAAcA,EAAmC,CAC/C,IAAMQ,EAAO4C,GAAUpD,CAAU,EAC3B8sB,EAAW9sB,EAAW,KAAK,KAC3BZ,EAAS,KAAK,KAAK,aAAc,CACrCoB,EACAssB,CACF,CAAC,EAED,OACE9sB,EAAW,KAAK,oBACb8sB,GAAU,OAAOlrB,EAAa,cAAc,GAC5C,EAAEmrB,GAAWvsB,CAAI,GAAKssB,EAAS,aAA4B,GAEvD,KAAK,IAAI,IAAInrB,EAAS,CAC3B,KAAMvC,EACN,GAAI0tB,EAAS,IACf,CAAC,CAAC,EAGG1tB,CACT,CAEA,kBAAmBY,EAAwC,CACzD,IAAMQ,EAAO4C,GAAUpD,CAAU,EAC3B+C,EAAO/C,EAAW,KAAK,KACzBoI,EAAYpI,EAAW,KAAK,KAC1BgtB,EAASD,GAAWvsB,CAAI,EAE9B,GAAIwsB,GAAUjqB,EAAM,CAElBqF,EAAY,IAAInF,EAAe,CAC7B,KAAMmF,EACN,KAAMrF,CACR,CAAC,EACD,IAAMgI,EAAY,KAAK,KAAK,aAAc,CACxCvK,EACA4H,CACF,CAAC,EACD,OAAO,KAAK,IAAI,IAAInF,EAAe,CACjC,KAAM8H,EACN,KAAMhI,CACR,CAAC,CAAC,CACJ,CAEA,IAAI3D,EAAS,KAAK,KAAK,aAAc,CACnCoB,EACA4H,CACF,CAAC,EACD,GAAIpI,EAAW,KAAK,mBAAoB,CACtC,GAAIoI,GAAW,OAAO,gBAGtB,CAAC,EAAG,CACF,IAAM6kB,EAAY,IAAItrB,EAAS,CAC7B,KAAMhD,EAAY,OAAO,YAAY,EACrC,GAAI,IAAIiD,EAAa,CACnB,WACF,CAAC,CACH,CAAC,EACKsrB,EAAW,IAAIzrB,EAAQ,CAC3B,KAAMwrB,EACN,WAAY7kB,CACd,CAAC,EACD,OAAAhJ,EAAS,KAAK,KAAK,aAAc,CAC/BoB,EACA0sB,CACF,CAAC,EACM,KAAK,IAAI,IAAIvrB,EAAS,CAC3B,KAAMvC,EACN,GAAIgJ,EAAU,IAChB,CAAC,CAAC,CACJ,CAEA,GAAIA,GAAW,OAAOxG,EAAa,cAAc,GAAK,EAAEorB,GAAU5kB,EAAU,aAA4B,GACtG,OAAO,KAAK,IAAI,IAAIzG,EAAS,CAC3B,KAAMvC,EACN,GAAIgJ,EAAU,IAChB,CAAC,CAAC,CAEN,CAEA,OAAOhJ,CACT,CAEA,QAASY,EAA8B,CACrCA,EAAW,KAAK,MAAM,QAAQ2K,EAAc3K,EAAW,KAAK,IAAI,CAAC,EAC7DA,EAAW,KAAK,sBAAsByD,GACxCzD,EAAW,KAAK,WAAW,QAAQ2K,EAAc3K,EAAW,KAAK,UAAU,CAAC,EAG9E,IAAM+K,EAAY,MAAM,QAAQ/K,CAAU,EAC1C,OAAO8K,EAAkB,KAAK,KAAM9K,EAAY+K,CAAS,CAC3D,CAEA,SAAU/K,EAA+B,CACvC,IAAM8C,EAAW9C,EAAW,KAAK,KAC7ByO,EAAWzO,EAAW,KAAK,SAC3BmtB,EAAWntB,EAAW,KAAK,SAE3ByO,GAAYzO,EAAW,KAAK,0BACxByO,aAAoB9P,GAAe8P,EAAS,YAChDA,EAAW,IAAI9M,EAAS,CACtB,KAAM8M,EACN,GAAI,IAAI7M,EAAa,CACnB,UACF,CAAC,CACH,CAAC,IAIL,IAAIqmB,EAAO,QACX,GAAIkF,aAAoBxuB,EAAa,CACnC,IAAMyuB,EAAWD,EAAS,KAAK,MAAM,YAAY,EAC7CC,IAAa,QAAa,CAC5B,kBACA,cACF,EAAE,SAASA,CAAQ,GACjBnF,EAAO,aACPkF,EAAW,QACFC,IAAa,QAAa,CACnC,4BACA,qBACF,EAAE,SAASA,CAAQ,IACjBD,EAAW,OAEf,CAEA,OAAO,KAAK,KAAKlF,EAAM,CACrBnlB,EACA2L,EACA0e,CACF,CAAC,CACH,CAEA,kBAAmBntB,EAAwC,CACzD,IAAIZ,EAAS,KAAK,KAAK,kBAAmB,CACxCY,EAAW,KAAK,KAChBA,EAAW,KAAK,QAClB,CAAC,EAED,OAAIA,EAAW,OAAO4B,EAAa,UAAU,IAC3CxC,EAAS,QAAQA,CAAM,eAGlBA,CACT,CAEA,mBAAoBY,EAAyC,CAI3D,IAAM8C,EAAW9C,EAAW,KAAK,KAC7BqtB,EAEJ,GAAIvqB,aAAoBwY,GAAc,CACpC,GAAI,CAACxY,EAAS,KAAK,aAAeA,EAAS,KAAK,YAAY,OAAS,EACnE,YAAK,YAAY,mDAAmD,EAC7D,KAAK,oBAAoB9C,CAAU,EAE5CqtB,EAAmBvqB,EAAS,KAAK,YAAY,CAAC,EAAE,IAAI,CACtD,MACEuqB,EAAmBrtB,EAAW,KAAK,WAGrC,GAAI,EAAEqtB,aAA4B1uB,GAAe0uB,EAAiB,WAChE,YAAK,YAAY,0DAA0D,EACpE,KAAK,oBAAoBrtB,CAAU,EAG5C,IAAMstB,EAAe,SAASD,EAAiB,KAAK,MAAQ,GAAG,EAC/D,GAAIC,GAAgB,EAClB,YAAK,YAAY,0DAA0D,EACpE,KAAK,oBAAoBttB,CAAU,EAG5C,IAAMutB,EAAY,MAAM,KAAK,CAC3B,OAAQD,EAAe,CACzB,EAAG,CAACvD,EAAGtqB,IACLd,EAAY,OAAOc,EAAI6tB,CAAY,CAAC,EAEtC,OAAO,KAAK,IACV,IAAIvZ,GAAmB,CACrB,KAAMjR,EACN,SAAU,IAAImB,EAAU,CACtB,YAAaspB,CACf,CAAC,CACH,CAAC,CACH,CACF,CAEA,qBAAsBvtB,EAA2C,CAC/D,OAAIA,EAAW,KAAK,aAClBA,EAAa,IAAIyU,GAAsB,CACrC,KAAM,IAAIhM,EAAc,CACtB,KAAM,aACN,YAAa,CACXzI,EAAW,KAAK,KAChBA,EAAW,KAAK,UAClB,EAAE,OACC2a,GAAuBA,aAAalX,CACvC,CACF,CAAC,EACD,WAAY9E,EAAY,OAAO,GAAG,CACpC,CAAC,GAEImK,GAA0B,KAAK,KAAM9I,CAAU,CACxD,CAEA,cAAeA,EAAoC,CACjD,IAAM8C,EAAW9C,EAAW,KAAK,KAC7B6K,EAAS/H,CAAQ,IACnB9C,EAAW,KAAO,IAAI4B,EAAa,CACjC,aACF,CAAC,GAGH,IAAIQ,EAAM6I,GAAUnI,CAAQ,EACxBA,aAAoB0qB,KACtBprB,EAAM,IAAIhB,EAAU,CAClB,KAAMgB,CACR,CAAC,GAGHpC,EAAW,UAAU,OAAQoC,CAAG,EAChC,IAAM2I,EAAY,IAAI,KAAK,IAAI/K,EAAY,MAAM,CAAC,GAClD,OAAO8K,EAAkB,KAAK,KAAM9K,EAAY+K,CAAS,CAC3D,CAEA,UAAW/K,EAAgC,CACzC,IAAM8C,EAAW9C,EAAW,KAAK,KACjC,OAAI8C,aAAoBiN,IAAajN,aAAoBgN,IAAchN,EAAS,KAAK,gBAAgBiN,GAC5F,KAAK,QAAQ/P,CAAU,EAEzB,MAAM,UAAUA,CAAU,CACnC,CAEA,UAAWA,EAAgC,CACzC,OAAIA,EAAW,KAAK,gBAAgB+P,GAC3B,KAAK,QAAQ/P,CAAU,EAEzB,MAAM,UAAUA,CAAU,CACnC,CAEA,QAASA,EAAwD,CAC/D,GAAIA,aAAsB+P,IAAY,CAAC/P,EAAW,KAAK,mBACrD,OAAO,KAAK,KAAK,OAAQ,CACvBA,EAAW,KAAK,KAChBA,EAAW,KAAK,UAClB,CAAC,EAGH,IAAMytB,EAAW7d,GAAqB5P,CAAU,EAChD,OAAKytB,EAOE,KAAK,IACV,IAAIlrB,EAAS,CAAC,CAAC,EACZ,KAAK,IAAIyb,GAAU,CAClB,KAAMyP,CACR,CAAC,EAAGttB,EAAM,CAAC,EACV,KAAKstB,CAAQ,CAClB,EAZMztB,aAAsB4H,GAAmB,MAAM,UAAU5H,CAAU,EACnEA,aAAsB8P,GAAmB,MAAM,UAAU9P,CAAU,EAChE,KAAK,IAAIA,CAAU,CAW9B,CACF,EAhyGAyR,EAAAM,EAAAP,IAGEQ,EAAAP,EAAA,GAAW,mCADXkI,GAFIC,GA2BJ5H,EAAAP,EAAA,GAAW,mBADXiI,GA1BIE,GA0DJ5H,EAAAP,EAAA,GAAW,sBAFXgI,GAxDIG,GAi6BJ5H,EAAAP,EAAA,GAAW,4BADX+H,GAh6BII,GA26BJ5H,EAAAP,EAAA,GAAW,eADX8H,GA16BIK,GA8/BJ5H,EAAAP,EAAA,GAAW,oBADX6H,GA7/BIM,GAilCJ5H,EAAAP,EAAA,GAAW,4BADX4H,GAhlCIO,GAylCJ5H,EAAAP,EAAA,GAAW,sBADX2H,GAxlCIQ,GA6mCJ5H,EAAAP,EAAA,GAAW,wCADX0H,GA5mCIS,GAwnCJ5H,EAAAP,EAAA,GAAW,gBADXyH,GAvnCIU,GA0oCJ5H,EAAAP,EAAA,GAAW,kBADXwH,GAzoCIW,GAipCJ5H,EAAAP,EAAA,GAAW,yBADXuH,GAhpCIY,GAwpCJ5H,EAAAP,EAAA,GAAW,eADXsH,GAvpCIa,GA6pCJ5H,EAAAP,EAAA,GAAW,aADXqH,GA5pCIc,GAsqCJ5H,EAAAP,EAAA,GAAW,kBADXoH,GArqCIe,GAkrCJ5H,EAAAP,EAAA,GAAW,4BADXmH,GAjrCIgB,GAwsCJ5H,EAAAP,EAAA,GAAW,yBADXkH,GAvsCIiB,GAutCJ5H,EAAAP,EAAA,GAAW,gCADXiH,GAttCIkB,GA6uCJ5H,EAAAP,EAAA,GAAW,mBADXgH,GA5uCImB,GAmwCJ5H,EAAAP,EAAA,GAAW,mBADX+G,GAlwCIoB,GAkxCJ5H,EAAAP,EAAA,GAAW,2BADX8G,GAjxCIqB,GAkyCJ5H,EAAAP,EAAA,GAAW,kCADX6G,GAjyCIsB,GAkzCJ5H,EAAAP,EAAA,GAAW,sBADX4G,GAjzCIuB,GAAN3H,GAAAR,EAAMmI,GAAN1H,GAAAT,EAAA,EAAMmI,KAcG,qBAAuB,GAd1BA,EAgBY,aAAyB,CACzC,EAjBIA,EAmBG,gBAAkB,IAnBrBA,EAoBG,wBAA0B,IApB7BA,EAqBG,WAAa,GArBhBA,EAsBG,YAAc,GAtBjBA,EAuBG,YAAc,GAvBjBA,EAwBG,YAAc,QAxBjBA,EAkCG,qBAAuB,GAlC1BA,EAmCG,eAAiB,GAnCpBA,EAoCG,yBAA2B,GApC9BA,EAqCG,qBAAuB,eArC1BA,EAsCG,yBAA2B,aAtC9BA,EAuCG,4BAA8B,GAvCjCA,EAwCG,wBAA0B,IAxC7BA,EAyCG,qBAAuB,GAzC1BA,EA0CG,kCAAoC,GA1CvCA,EA2CG,2BAA6B,GA3ChCA,EA4CG,mBAAqB,GA5CxBA,EA6CG,wBAA0B,GA7C7BA,EA8CG,mBAAqB,GA9CxBA,EA+CG,wBAA0B,GA/C7BA,EAgDG,sBAAwB,GAhD3BA,EAiDG,YAAc,UAjDjBA,EAkDG,6BAA+B,GAlDlCA,EAmDG,wBAA0B,GAnD7BA,EAoDG,6BAA+B,GApDlCA,EAqDG,0BAA4B,GArD/BA,EAsDG,yCAA2C,GAtDpD,IAAM8T,GAAN9T,EA3vFA+T,GAAAC,GAAAC,GAAAC,GAAAC,GAAAvc,GAAAC,GA6hMa0L,EAAN,cAAqB3L,GAAAwc,GAG1BD,GAAA,CAACnc,GAcDkc,GAAA,CAAClc,GAKDic,GAAA,CAACjc,GAUDgc,GAAA,CAAChc,GAKD+b,GAAA,CAAC/b,GArCyBJ,GAAQ,CAIlC,WAAW,eAAiB,CAC1B,sBACF,CAYA,WAAW,wBAA0B,CACnC,uBACF,CAGA,WAAW,mBAA6C,CACtD,IAAMyc,EAAkC,CACtC,GAAGD,GAAQ,kBACX,aAAc,QAChB,EACA,cAAOC,EAAQ,QACRA,CACT,CAGA,WAAW,qBAAuB,CAChC,OAAO,IAAI,IAAIC,GAAa,mBAAmB,CACjD,CAGA,WAAW,sBAAwB,CACjC,MAAO,CACL,KAAM,MACN,MAAO,KACP,MAAO,KACP,UAAW,KACX,SAAU,KACV,SAAU,KACV,WAAY,KACZ,UAAW,KACX,UAAW,KACX,WAAY,KACZ,WAAY,KACZ,UAAW,IACb,CACF,CAEA,WAAYC,EAAsD,CAChE,GAAIA,aAAgBxvB,GAAewvB,EAAK,SAAU,CAMhD,IAAMC,EAAWD,EAAK,KACtB,GAAIC,EAAS,WAAW,GAAG,GAAKA,EAAS,SAAS,IAAI,EACpD,OAAOD,CAEX,CAEA,OAAO,MAAM,WAAWA,CAAI,CAC9B,CAKF,EA1EO1c,GAAAM,EAAAP,IAILQ,EAAAP,GAAA,GAAW,gBADXsc,GAHW5Q,GAkBXnL,EAAAP,GAAA,GAAW,yBADXqc,GAjBW3Q,GAuBXnL,EAAAP,GAAA,GAAW,oBADXoc,GAtBW1Q,GAiCXnL,EAAAP,GAAA,GAAW,sBADXmc,GAhCWzQ,GAsCXnL,EAAAP,GAAA,GAAW,uBADXkc,GArCWxQ,GAANlL,GAAAR,GAAM0L,GAANjL,GAAAT,GAAA,EAAM0L,KACJ,aAAe,SADXA,EAQJ,4BAA8B,GAR1BA,EASJ,cAAgB,GATZA,EAUJ,aAAe,EAVXA,EAWJ,gBAAkB,GAXdA,EAYJ,sBAAwB,GAZpBA,EAaJ,2BAA6B,GAbzBA,EAcJ,wBAA0B,GAdtBA,EAeJ,oCAAsC,GAflCA,EAuEJ,UAAYzL,EAvERyL,EAwEJ,OAASjK,EAxELiK,EAyEJ,UAAYuQ,GAGrBM,GAAQ,kBAA0B7Q,CAAM","names":["_EXPRESSION_METADATA_dec","_init","cache","DuckDbTyping","map","DialectTyping","extend","types","data","type","BitLengthExpr","DayExpr","DayOfMonthExpr","DayOfWeekExpr","DayOfYearExpr","HourExpr","LengthExpr","MinuteExpr","MonthExpr","QuarterExpr","SecondExpr","WeekExpr","YearExpr","FactorialExpr","Atan2Expr","JarowinklerSimilarityExpr","RandExpr","TimeToUnixExpr","ToDaysExpr","TimeFromPartsExpr","__decoratorStart","__decorateElement","__decoratorMetadata","__runInitializers","TIMEZONE_PATTERN","REGEX_ESCAPE_REPLACEMENTS","RANDSTR_CHAR_POOL","RANDSTR_SEED","WS_CONTROL_CHARS_TO_DUCK","WEEK_START_DAY_TO_DOW","MAX_BIT_POSITION","LiteralExpr","SEQ_BASE","SEQ_RESTRICTED","WhereExpr","HavingExpr","AggFuncExpr","OrderExpr","SelectExpr","applyBase64AlphabetReplacements","result","alphabet","options","reverse","newChars","i","defaultChar","newChar","find","replace","ReplaceExpr","base64DecodeSql","expression","toString","inputExpr","null_","FromBase64Expr","DecodeExpr","lastDaySql","dateExpr","unit","yearExpr","VarExpr","makeDateExpr","quarterExpr","lastMonthExpr","MulExpr","firstDayLastMonthExpr","lastDayExpr","dow","daysToSundayExpr","ModExpr","ParenExpr","SubExpr","intervalExpr","IntervalExpr","addExpr","AddExpr","castExpr","CastExpr","DataTypeExpr","isNanosecondUnit","handleNanosecondDiff","endTime","startTime","endNs","startNs","toBooleanSql","arg","isSafe","baseCaseExpr","CaseExpr","UpperExpr","BooleanExpr","castToReal","nanInfCheck","OrExpr","dateSql","thisNode","zone","atUtc","AtTimeZoneExpr","timeDiffSql","exprNode","unitToStr","dateDeltaToBinaryIntervalOp","cast","baseImpl","narrowInstanceOf","Expression","intervalValue","timestampNs","isType","arrayInsertSql","position","element","elementArray","ArrayExpr","indexOffset","posValue","concatExprs","sliceStart","BracketExpr","SliceExpr","sliceEnd","arrLen","LengthExpr","sliceEndPos","sliceStartPos","IfExpr","IsExpr","arrayRemoveAtSql","resultExpr","leftSlice","rightSlice","arraySortSql","sortArraySql","name","buildSortArrayDesc","args","SortArrayExpr","seqGet","buildArrayPrepend","ArrayPrependExpr","buildDateDiff","DateDiffExpr","buildGenerateSeries","endExclusive","genSeries","GenerateSeriesExpr","buildMakeTimestamp","UnixToTimeExpr","TimestampFromPartsExpr","showParser","structSql","ancestorCast","structArgs","isBqInlineStruct","PropertyEqExpr","castedType","expr","isPropertyEq","value","key","IdentifierExpr","csvArgs","dataTypeSql","base","values","typeVal","camelToScreamingSnakeCase","Generator","jsonFormatSql","seqSql","byteWidth","ancestor","WindowExpr","bits","maxVal","half","replacePlaceholders","unixToTimeSql","scale","scaleValue","timestamp","targetType","isNtz","DivExpr","toTimestamp","AnonymousExpr","WRAPPED_JSON_EXTRACT_EXPRESSIONS","BinaryExpr","InExpr","NotExpr","arrowJsonExtractSqlDuckDB","arrowSql","arrowJsonExtractSql","cls","implicitDatetimeCast","type","ts","weekUnitToDow","WeekStartExpr","buildWeekTruncExpression","startDow","shiftDays","shiftedDate","DateAddExpr","DateTruncExpr","dateDiffSql","datePartBoundary","weekStart","generateDatetimeArraySql","isGenerateDateArray","GenerateDateArrayExpr","start","end","jsonExtractValueArraySql","jsonExtractExpr","jsonExtract","JsonExtractExpr","dataType","JsonValueArrayExpr","castToVarchar","castToBoolean","isBinary","genWithCastToBlob","resultSql","blob","castToBit","node","HexStringExpr","UnhexExpr","prepareBinaryBitwiseArgs","dayNavigationSql","dayNameExpr","isodowCall","targetDow","dayNameStr","matchingDay","day","upperDayName","dowNum","dateWithOffset","NextDayExpr","daysOffset","anyValueSql","having","HavingMaxExpr","funcName","bitwiseAggSql","BitwiseOrAggExpr","BitwiseAndAggExpr","literalSqlWithWsChr","literal","chars","ch","sqlSegments","currentGroup","isWsGroup","isWs","c","sql","escapeRegexMetachars","delimiters","delimitersSql","escapedLiteral","escapedSql","raw","escaped","buildCapitalizationSql","valueToSplit","delimRegexSql","splitRegexSql","initcapSql","thisSql","escapedDelimitersSql","boolxorAggSql","EqExpr","bitshiftSql","operator","BitwiseLeftShiftExpr","resultIsBlob","scaleRoundingSql","RoundingFuncClass","decimals","nInt","pow","PowExpr","rounded","RoundExpr","ceilFloor","scaledSql","regrValSql","y","x","checkForNull","returnValue","returnValueAttr","RegrValxExpr","resultType","annotatedArg","annotateTypes","typedNull","maybeCorrNullToFalse","corr","FilterExpr","CorrExpr","dateFromPartsSql","monthExpr","dayExpr","baseDate","roundArg","roundInput","boolnotSql","boolandSql","left","right","AndExpr","boolorSql","xorSql","leftNot","rightNot","shaSql","hashFunc","_isBinary","_COMMANDS_dec","_SINGLE_TOKENS_dec","_ORIGINAL_KEYWORDS_dec","_HEREDOC_STRINGS_dec","_BYTE_STRING_ESCAPES_dec","_BYTE_STRINGS_dec","_a","_init","DuckDBTokenizer","Tokenizer","cache","keywords","commands","__decoratorStart","__decorateElement","__decoratorMetadata","__runInitializers","_SET_PARSERS_dec","_STATEMENT_PARSERS_dec","_TYPE_CONVERTERS_dec","_PLACEHOLDER_PARSERS_dec","_TABLE_ALIAS_TOKENS_dec","_ID_VAR_TOKENS_dec","_NO_PAREN_FUNCTION_PARSERS_dec","_FUNCTION_PARSERS_dec","_FUNCTIONS_dec","_SHOW_PARSERS_dec","_FUNCTIONS_WITH_ALIASED_ARGS_dec","_EXPONENT_dec","_RANGE_PARSERS_dec","_BITWISE_dec","_NO_PAREN_FUNCTIONS_dec","DuckDBParser","Parser","noParenFunctions","SessionUserExpr","CurrentCatalogExpr","bitwise","binaryRangeParser","ArrayOverlapsExpr","StartsWithExpr","RegexpFullMatchExpr","functions","IgnoreNullsExpr","AnyValueExpr","ApproxQuantileExpr","BitwiseXorAggExpr","dateTruncToTime","LevenshteinExpr","JarowinklerSimilarityExpr","EncodeExpr","TimeToUnixExpr","GetbitExpr","ParseJsonExpr","buildExtractJsonWithPath","JsonExtractScalarExpr","ArrayAppendExpr","buildArrayConcat","ArrayContainsExpr","CosineDistanceExpr","EuclideanDistanceExpr","ArrayFilterExpr","TransformExpr","DateFromPartsExpr","TimeFromPartsExpr","PercentileContExpr","PercentileDiscExpr","buildRegexpExtract","RegexpExtractExpr","RegexpExtractAllExpr","RegexpLikeExpr","RegexpReplaceExpr","Sha2Expr","buildFormattedTime","TimeToStrExpr","SplitExpr","RegexpSplitExpr","StrToTimeExpr","StructExpr","DateBinExpr","ExplodeExpr","CurrentVersionExpr","binaryFromFunction","BitwiseXorExpr","parsers","AbsExpr","tokens","PlaceholderExpr","buildDefaultDecimalType","index","expressions","thisExpr","LambdaExpr","alias","comments","AliasExpr","table","TableAliasExpr","sample","bracket","ToMapExpr","MapExpr","_options","aggregations","pivotColumnNames","isAttach","parseAttachOption","AttachOptionExpr","exists","AttachExpr","DetachExpr","thisStr","ShowExpr","InstallExpr","PositionalColumnExpr","_ARRAYS_ZIP_TEMPLATE_dec","_APPROXIMATE_SIMILARITY_TEMPLATE_dec","_MINHASH_COMBINE_TEMPLATE_dec","_MINHASH_TEMPLATE_dec","_RANDSTR_TEMPLATE_dec","_BITMAP_CONSTRUCT_AGG_TEMPLATE_dec","_EXTRACT_EPOCH_MAPPINGS_dec","_EXTRACT_STRFTIME_MAPPINGS_dec","_MAPCAT_TEMPLATE_dec","_SEQ_SIGNED_dec","_SEQ_UNSIGNED_dec","_SEEDED_RANDOM_TEMPLATE_dec","_NORMAL_TEMPLATE_dec","_ZIPF_TEMPLATE_dec","_IGNORE_RESPECT_NULLS_WINDOW_FUNCTIONS_dec","_PROPERTIES_LOCATION_dec","_UNWRAPPED_INTERVAL_VALUES_dec","_RESERVED_KEYWORDS_dec","_TYPE_MAPPING_dec","_SUPPORTED_JSON_PATH_PARTS_dec","_ORIGINAL_TRANSFORMS_dec","_STRUCT_DELIMITER_dec","_AFTER_HAVING_MODIFIER_TRANSFORMS_dec","_DuckDBGenerator","modifiers","m","ApproxDistinctExpr","approxCountDistinctSql","BoolnotExpr","BoolandExpr","BoolorExpr","preprocess","inheritStructFieldNames","inlineArrayUnlessQuery","arrayAppendSql","ArrayCompactExpr","arrayCompactSql","ArrayConstructCompactExpr","e","ArrayConcatExpr","arrayConcatSql","renameFunc","ArrayInsertExpr","ArrayRemoveAtExpr","ArrayRemoveExpr","removeFromArrayUsingFilter","ArraySortExpr","ArraySumExpr","ArrayUniqueAggExpr","DistinctExpr","Base64DecodeBinaryExpr","Base64DecodeStringExpr","BitwiseAndExpr","BitwiseOrExpr","BitwiseRightShiftExpr","ByteLengthExpr","CommentColumnConstraintExpr","noCommentColumnConstraintSql","CurrentTimeExpr","CurrentTimestampExpr","LocaltimeExpr","unsupportedArgs","DayOfMonthExpr","DayOfWeekExpr","DayOfWeekIsoExpr","DayOfYearExpr","DaynameExpr","MonthnameExpr","DateExpr","DateSubExpr","DateStrToDateExpr","dateStrToDateSql","DatetimeExpr","noDatetimeSql","DatetimeDiffExpr","DatetimeSubExpr","DatetimeAddExpr","DateToDiExpr","DuckDB","encodeDecodeSql","DecodeCaseExpr","decodeToCaseSql","DiToDateExpr","EqualNullExpr","NullSafeEqExpr","GenerateTimestampArrayExpr","getBitSql","GroupConcatExpr","groupConcatSql","IntDivExpr","IsInfExpr","IsNanExpr","IsNullValueExpr","IsArrayExpr","CeilExpr","FloorExpr","JsonbExistsExpr","JsonExtractArrayExpr","JsonFormatExpr","LateralExpr","explodeToUnnestSql","LogicalOrExpr","LogicalAndExpr","Seq1Expr","Seq2Expr","Seq4Expr","Seq8Expr","BoolxorAggExpr","MakeIntervalExpr","noMakeIntervalSql","InitcapExpr","Md5DigestExpr","ShaExpr","Sha1DigestExpr","Sha2DigestExpr","MonthsBetweenExpr","monthsBetweenSql","PivotExpr","unqualifyColumns","PreviousDayExpr","regexpReplaceGlobalModifier","RegexpILikeExpr","RegrValyExpr","ReturnExpr","ReturnsPropertyExpr","SchemaExpr","RandExpr","StrPositionExpr","strPositionSql","StrToUnixExpr","TimeAddExpr","TimeSubExpr","TimeExpr","noTimeSql","TimeDiffExpr","TimestampExpr","noTimestampSql","TimestampAddExpr","TimestampDiffExpr","TimestampSubExpr","TimeStrToDateExpr","TimeStrToTimeExpr","timeStrToTimeSql","TimeStrToUnixExpr","ToBooleanExpr","TsOrDiToDiExpr","TsOrDsAddExpr","TsOrDsDiffExpr","unitName","UnixMicrosExpr","UnixMillisExpr","UnixSecondsExpr","UnixToStrExpr","DatetimeTruncExpr","UnixToTimeStrExpr","VarMapExpr","VariancePopExpr","WeekOfYearExpr","YearOfWeekExpr","ExtractExpr","YearOfWeekIsoExpr","XorExpr","JsonObjectAggExpr","JsonbObjectAggExpr","LastDayExpr","JsonPathKeyExpr","JsonPathRootExpr","JsonPathSubscriptExpr","JsonPathWildcardExpr","locations","prop","LikePropertyExpr","TemporaryPropertyExpr","SequencePropertiesExpr","FirstValueExpr","LagExpr","LastValueExpr","LeadExpr","NthValueExpr","maybeParse","sliceLength","kind","timeBucketExpr","positiveFormula","nonPositiveFormula","GtExpr","length","generator","seedValue","s","n","gen","randomExpr","formatArg","binaryCheck","fmt","allArgs","fallbackSql","firstArg","caseExpr","acc","rowcount","arrowSep","wrap","prefix","lambdaSql","force","fromClause","needsTz","formattedTime","castType","baseSql","strToTimeSql","functionName","timeFormat","safe","timeType","CastClass","TryCastExpr","strptime","TsOrDsToTimeExpr","mean","stddev","u1","u2","seed","minVal","isIntResult","rangeExpr","nano","hour","minute","sec","hVal","mVal","sVal","totalSeconds","datetimeExpr","partName","isNanoTime","datetimeExprSafe","strftimeInput","timeExpr","milli","keyword","method","UserDefinedFunctionExpr","isInnerOuter","UnnestExpr","countIfToSum","thisNodeExpr","annotated","func","ArrayAggExpr","order","originalThis","arrayAggSql","expressionSql","orderCol","OrderedExpr","varchar","caseNode","maxDist","levenshtein","LeastExpr","stringArg","fillArg","lengthArg","isLeft","inputLen","charsNeeded","padCount","GreatestExpr","repeatExpr","RepeatExpr","DPipeExpr","k","exprs","StarExpr","lengths","maxLen","emptyStruct","_","ColumnExpr","transformStruct","ToBase64Expr","maxLineLength","lineLength","newline","ChrExpr","TrimExpr","ConcatExpr","op","keySql","valueSql","kvSql","GeneratorExpr","TableExpr","KwargExpr","unnestStr","aliasSql","FirstExpr","ApproxQuantilesExpr","nullText","group","params","occurrence","nullIfPosOverflow","SubstringExpr","NullifExpr","groupArg","defaultGroup","_expression","PosexplodeExpr","parent","pos","col","AliasesExpr","aliases","columns","unnestSql","genSubscripts","posexplodeSql","FromExpr","monthsExpr","annotatedMonths","intervalOrToMonths","dateAddExpr","preserveEom","dateNode","isDateUnit","isDate","dummyDate","dateTime","truncate","truncVal","numQuantilesExpr","numQuantiles","quantiles","NegExpr","corrExpr","DuckDBGenerator","_INVERSE_TIME_MAPPING_dec","_EXPRESSION_METADATA_dec","_DATE_PART_MAPPING_dec","_NORMALIZATION_STRATEGY_dec","_NULL_ORDERING_dec","Dialect","mapping","DuckDbTyping","path","pathText"]}