@frictionless-ts/table 1.0.1

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 (317) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +3 -0
  3. package/build/assets/geojson.json +216 -0
  4. package/build/assets/topojson.json +259 -0
  5. package/build/data/index.d.ts +2 -0
  6. package/build/data/index.js +2 -0
  7. package/build/data/record.d.ts +4 -0
  8. package/build/data/record.js +84 -0
  9. package/build/data/record.spec.d.ts +1 -0
  10. package/build/data/record.spec.js +269 -0
  11. package/build/dialect/Options.d.ts +3 -0
  12. package/build/dialect/Options.js +3 -0
  13. package/build/dialect/index.d.ts +2 -0
  14. package/build/dialect/index.js +2 -0
  15. package/build/dialect/infer.d.ts +4 -0
  16. package/build/dialect/infer.js +2 -0
  17. package/build/field/Field.d.ts +5 -0
  18. package/build/field/Field.js +2 -0
  19. package/build/field/Mapping.d.ts +11 -0
  20. package/build/field/Mapping.js +2 -0
  21. package/build/field/checks/enum.d.ts +8 -0
  22. package/build/field/checks/enum.js +71 -0
  23. package/build/field/checks/enum.spec.d.ts +1 -0
  24. package/build/field/checks/enum.spec.js +327 -0
  25. package/build/field/checks/maxLength.d.ts +7 -0
  26. package/build/field/checks/maxLength.js +17 -0
  27. package/build/field/checks/maxLength.spec.d.ts +1 -0
  28. package/build/field/checks/maxLength.spec.js +49 -0
  29. package/build/field/checks/maximum.d.ts +11 -0
  30. package/build/field/checks/maximum.js +73 -0
  31. package/build/field/checks/maximum.spec.d.ts +1 -0
  32. package/build/field/checks/maximum.spec.js +476 -0
  33. package/build/field/checks/minLength.d.ts +7 -0
  34. package/build/field/checks/minLength.js +17 -0
  35. package/build/field/checks/minLength.spec.d.ts +1 -0
  36. package/build/field/checks/minLength.spec.js +56 -0
  37. package/build/field/checks/minimum.d.ts +11 -0
  38. package/build/field/checks/minimum.js +73 -0
  39. package/build/field/checks/minimum.spec.d.ts +1 -0
  40. package/build/field/checks/minimum.spec.js +476 -0
  41. package/build/field/checks/pattern.d.ts +7 -0
  42. package/build/field/checks/pattern.js +17 -0
  43. package/build/field/checks/pattern.spec.d.ts +1 -0
  44. package/build/field/checks/pattern.spec.js +66 -0
  45. package/build/field/checks/required.d.ts +7 -0
  46. package/build/field/checks/required.js +14 -0
  47. package/build/field/checks/required.spec.d.ts +1 -0
  48. package/build/field/checks/required.spec.js +24 -0
  49. package/build/field/checks/type.d.ts +7 -0
  50. package/build/field/checks/type.js +14 -0
  51. package/build/field/checks/type.spec.d.ts +1 -0
  52. package/build/field/checks/type.spec.js +255 -0
  53. package/build/field/checks/unique.d.ts +7 -0
  54. package/build/field/checks/unique.js +17 -0
  55. package/build/field/checks/unique.spec.d.ts +1 -0
  56. package/build/field/checks/unique.spec.js +97 -0
  57. package/build/field/denormalize.d.ts +6 -0
  58. package/build/field/denormalize.js +13 -0
  59. package/build/field/desubstitute.d.ts +3 -0
  60. package/build/field/desubstitute.js +13 -0
  61. package/build/field/index.d.ts +8 -0
  62. package/build/field/index.js +6 -0
  63. package/build/field/inspect.d.ts +6 -0
  64. package/build/field/inspect.js +131 -0
  65. package/build/field/inspect.spec.d.ts +1 -0
  66. package/build/field/inspect.spec.js +385 -0
  67. package/build/field/narrow.d.ts +3 -0
  68. package/build/field/narrow.js +14 -0
  69. package/build/field/narrow.spec.d.ts +1 -0
  70. package/build/field/narrow.spec.js +52 -0
  71. package/build/field/normalize.d.ts +5 -0
  72. package/build/field/normalize.js +14 -0
  73. package/build/field/parse.d.ts +3 -0
  74. package/build/field/parse.js +47 -0
  75. package/build/field/parse.spec.d.ts +1 -0
  76. package/build/field/parse.spec.js +33 -0
  77. package/build/field/stringify.d.ts +3 -0
  78. package/build/field/stringify.js +43 -0
  79. package/build/field/stringify.spec.d.ts +1 -0
  80. package/build/field/stringify.spec.js +41 -0
  81. package/build/field/substitute.d.ts +3 -0
  82. package/build/field/substitute.js +16 -0
  83. package/build/field/types/array.d.ts +3 -0
  84. package/build/field/types/array.js +5 -0
  85. package/build/field/types/array.spec.d.ts +1 -0
  86. package/build/field/types/array.spec.js +358 -0
  87. package/build/field/types/boolean.d.ts +4 -0
  88. package/build/field/types/boolean.js +31 -0
  89. package/build/field/types/boolean.spec.d.ts +1 -0
  90. package/build/field/types/boolean.spec.js +76 -0
  91. package/build/field/types/date.d.ts +4 -0
  92. package/build/field/types/date.js +14 -0
  93. package/build/field/types/date.spec.d.ts +1 -0
  94. package/build/field/types/date.spec.js +52 -0
  95. package/build/field/types/datetime.d.ts +4 -0
  96. package/build/field/types/datetime.js +15 -0
  97. package/build/field/types/datetime.spec.d.ts +1 -0
  98. package/build/field/types/datetime.spec.js +62 -0
  99. package/build/field/types/duration.d.ts +4 -0
  100. package/build/field/types/duration.js +9 -0
  101. package/build/field/types/duration.spec.d.ts +1 -0
  102. package/build/field/types/duration.spec.js +37 -0
  103. package/build/field/types/geojson.d.ts +3 -0
  104. package/build/field/types/geojson.js +9 -0
  105. package/build/field/types/geojson.spec.d.ts +1 -0
  106. package/build/field/types/geojson.spec.js +522 -0
  107. package/build/field/types/geopoint.d.ts +4 -0
  108. package/build/field/types/geopoint.js +59 -0
  109. package/build/field/types/geopoint.spec.d.ts +1 -0
  110. package/build/field/types/geopoint.spec.js +173 -0
  111. package/build/field/types/integer.d.ts +4 -0
  112. package/build/field/types/integer.js +41 -0
  113. package/build/field/types/integer.spec.d.ts +1 -0
  114. package/build/field/types/integer.spec.js +102 -0
  115. package/build/field/types/json.d.ts +6 -0
  116. package/build/field/types/json.js +68 -0
  117. package/build/field/types/list.d.ts +4 -0
  118. package/build/field/types/list.js +30 -0
  119. package/build/field/types/list.spec.d.ts +1 -0
  120. package/build/field/types/list.spec.js +230 -0
  121. package/build/field/types/number.d.ts +4 -0
  122. package/build/field/types/number.js +50 -0
  123. package/build/field/types/number.spec.d.ts +1 -0
  124. package/build/field/types/number.spec.js +101 -0
  125. package/build/field/types/object.d.ts +3 -0
  126. package/build/field/types/object.js +5 -0
  127. package/build/field/types/object.spec.d.ts +1 -0
  128. package/build/field/types/object.spec.js +393 -0
  129. package/build/field/types/string.d.ts +4 -0
  130. package/build/field/types/string.js +32 -0
  131. package/build/field/types/string.spec.d.ts +1 -0
  132. package/build/field/types/string.spec.js +162 -0
  133. package/build/field/types/time.d.ts +4 -0
  134. package/build/field/types/time.js +18 -0
  135. package/build/field/types/time.spec.d.ts +1 -0
  136. package/build/field/types/time.spec.js +53 -0
  137. package/build/field/types/year.d.ts +4 -0
  138. package/build/field/types/year.js +16 -0
  139. package/build/field/types/year.spec.d.ts +1 -0
  140. package/build/field/types/year.spec.js +50 -0
  141. package/build/field/types/yearmonth.d.ts +4 -0
  142. package/build/field/types/yearmonth.js +14 -0
  143. package/build/field/types/yearmonth.spec.d.ts +1 -0
  144. package/build/field/types/yearmonth.spec.js +36 -0
  145. package/build/helpers.d.ts +4 -0
  146. package/build/helpers.js +12 -0
  147. package/build/index.d.ts +40 -0
  148. package/build/index.js +27 -0
  149. package/build/plugin.d.ts +27 -0
  150. package/build/plugin.js +2 -0
  151. package/build/plugins/arrow/index.d.ts +2 -0
  152. package/build/plugins/arrow/index.js +3 -0
  153. package/build/plugins/arrow/plugin.d.ts +7 -0
  154. package/build/plugins/arrow/plugin.js +22 -0
  155. package/build/plugins/arrow/plugin.spec.d.ts +1 -0
  156. package/build/plugins/arrow/plugin.spec.js +161 -0
  157. package/build/plugins/arrow/table/index.d.ts +2 -0
  158. package/build/plugins/arrow/table/index.js +3 -0
  159. package/build/plugins/arrow/table/load.d.ts +4 -0
  160. package/build/plugins/arrow/table/load.js +23 -0
  161. package/build/plugins/arrow/table/load.spec.d.ts +1 -0
  162. package/build/plugins/arrow/table/load.spec.js +56 -0
  163. package/build/plugins/arrow/table/save.d.ts +3 -0
  164. package/build/plugins/arrow/table/save.js +31 -0
  165. package/build/plugins/arrow/table/save.spec.d.ts +1 -0
  166. package/build/plugins/arrow/table/save.spec.js +81 -0
  167. package/build/plugins/csv/dialect/index.d.ts +1 -0
  168. package/build/plugins/csv/dialect/index.js +2 -0
  169. package/build/plugins/csv/dialect/infer.d.ts +4 -0
  170. package/build/plugins/csv/dialect/infer.js +44 -0
  171. package/build/plugins/csv/dialect/infer.spec.d.ts +1 -0
  172. package/build/plugins/csv/dialect/infer.spec.js +54 -0
  173. package/build/plugins/csv/index.d.ts +2 -0
  174. package/build/plugins/csv/index.js +3 -0
  175. package/build/plugins/csv/plugin.d.ts +8 -0
  176. package/build/plugins/csv/plugin.js +22 -0
  177. package/build/plugins/csv/plugin.spec.d.ts +1 -0
  178. package/build/plugins/csv/plugin.spec.js +161 -0
  179. package/build/plugins/csv/table/index.d.ts +2 -0
  180. package/build/plugins/csv/table/index.js +3 -0
  181. package/build/plugins/csv/table/load.d.ts +6 -0
  182. package/build/plugins/csv/table/load.js +86 -0
  183. package/build/plugins/csv/table/load.spec.d.ts +1 -0
  184. package/build/plugins/csv/table/load.spec.js +293 -0
  185. package/build/plugins/csv/table/save.d.ts +5 -0
  186. package/build/plugins/csv/table/save.js +29 -0
  187. package/build/plugins/csv/table/save.spec.d.ts +1 -0
  188. package/build/plugins/csv/table/save.spec.js +137 -0
  189. package/build/plugins/inline/index.d.ts +2 -0
  190. package/build/plugins/inline/index.js +3 -0
  191. package/build/plugins/inline/plugin.d.ts +7 -0
  192. package/build/plugins/inline/plugin.js +14 -0
  193. package/build/plugins/inline/table/index.d.ts +1 -0
  194. package/build/plugins/inline/table/index.js +2 -0
  195. package/build/plugins/inline/table/load.d.ts +6 -0
  196. package/build/plugins/inline/table/load.js +24 -0
  197. package/build/plugins/inline/table/load.spec.d.ts +1 -0
  198. package/build/plugins/inline/table/load.spec.js +160 -0
  199. package/build/plugins/json/buffer/decode.d.ts +4 -0
  200. package/build/plugins/json/buffer/decode.js +10 -0
  201. package/build/plugins/json/buffer/encode.d.ts +4 -0
  202. package/build/plugins/json/buffer/encode.js +8 -0
  203. package/build/plugins/json/buffer/index.d.ts +2 -0
  204. package/build/plugins/json/buffer/index.js +3 -0
  205. package/build/plugins/json/index.d.ts +2 -0
  206. package/build/plugins/json/index.js +3 -0
  207. package/build/plugins/json/plugin.d.ts +7 -0
  208. package/build/plugins/json/plugin.js +25 -0
  209. package/build/plugins/json/plugin.spec.d.ts +1 -0
  210. package/build/plugins/json/plugin.spec.js +163 -0
  211. package/build/plugins/json/table/index.d.ts +2 -0
  212. package/build/plugins/json/table/index.js +3 -0
  213. package/build/plugins/json/table/load.d.ts +6 -0
  214. package/build/plugins/json/table/load.js +55 -0
  215. package/build/plugins/json/table/load.spec.d.ts +1 -0
  216. package/build/plugins/json/table/load.spec.js +200 -0
  217. package/build/plugins/json/table/parse.d.ts +3 -0
  218. package/build/plugins/json/table/parse.js +6 -0
  219. package/build/plugins/json/table/save.d.ts +5 -0
  220. package/build/plugins/json/table/save.js +45 -0
  221. package/build/plugins/json/table/save.spec.d.ts +1 -0
  222. package/build/plugins/json/table/save.spec.js +147 -0
  223. package/build/plugins/ods/index.d.ts +2 -0
  224. package/build/plugins/ods/index.js +3 -0
  225. package/build/plugins/ods/plugin.d.ts +7 -0
  226. package/build/plugins/ods/plugin.js +23 -0
  227. package/build/plugins/ods/plugin.spec.d.ts +1 -0
  228. package/build/plugins/ods/plugin.spec.js +142 -0
  229. package/build/plugins/ods/table/index.d.ts +2 -0
  230. package/build/plugins/ods/table/index.js +3 -0
  231. package/build/plugins/ods/table/load.d.ts +4 -0
  232. package/build/plugins/ods/table/load.js +41 -0
  233. package/build/plugins/ods/table/load.spec.d.ts +1 -0
  234. package/build/plugins/ods/table/load.spec.js +167 -0
  235. package/build/plugins/ods/table/save.d.ts +3 -0
  236. package/build/plugins/ods/table/save.js +26 -0
  237. package/build/plugins/ods/table/save.spec.d.ts +1 -0
  238. package/build/plugins/ods/table/save.spec.js +75 -0
  239. package/build/plugins/ods/table/test.d.ts +5 -0
  240. package/build/plugins/ods/table/test.js +23 -0
  241. package/build/plugins/parquet/index.d.ts +2 -0
  242. package/build/plugins/parquet/index.js +3 -0
  243. package/build/plugins/parquet/plugin.d.ts +7 -0
  244. package/build/plugins/parquet/plugin.js +23 -0
  245. package/build/plugins/parquet/plugin.spec.d.ts +1 -0
  246. package/build/plugins/parquet/plugin.spec.js +142 -0
  247. package/build/plugins/parquet/table/index.d.ts +2 -0
  248. package/build/plugins/parquet/table/index.js +3 -0
  249. package/build/plugins/parquet/table/load.d.ts +4 -0
  250. package/build/plugins/parquet/table/load.js +23 -0
  251. package/build/plugins/parquet/table/load.spec.d.ts +1 -0
  252. package/build/plugins/parquet/table/load.spec.js +56 -0
  253. package/build/plugins/parquet/table/save.d.ts +3 -0
  254. package/build/plugins/parquet/table/save.js +32 -0
  255. package/build/plugins/parquet/table/save.spec.d.ts +1 -0
  256. package/build/plugins/parquet/table/save.spec.js +81 -0
  257. package/build/plugins/xlxs/index.d.ts +2 -0
  258. package/build/plugins/xlxs/index.js +3 -0
  259. package/build/plugins/xlxs/plugin.d.ts +7 -0
  260. package/build/plugins/xlxs/plugin.js +23 -0
  261. package/build/plugins/xlxs/plugin.spec.d.ts +1 -0
  262. package/build/plugins/xlxs/plugin.spec.js +142 -0
  263. package/build/plugins/xlxs/table/index.d.ts +2 -0
  264. package/build/plugins/xlxs/table/index.js +3 -0
  265. package/build/plugins/xlxs/table/load.d.ts +4 -0
  266. package/build/plugins/xlxs/table/load.js +43 -0
  267. package/build/plugins/xlxs/table/load.spec.d.ts +1 -0
  268. package/build/plugins/xlxs/table/load.spec.js +167 -0
  269. package/build/plugins/xlxs/table/save.d.ts +3 -0
  270. package/build/plugins/xlxs/table/save.js +28 -0
  271. package/build/plugins/xlxs/table/save.spec.d.ts +1 -0
  272. package/build/plugins/xlxs/table/save.spec.js +75 -0
  273. package/build/plugins/xlxs/table/test.d.ts +5 -0
  274. package/build/plugins/xlxs/table/test.js +23 -0
  275. package/build/schema/Mapping.d.ts +6 -0
  276. package/build/schema/Mapping.js +2 -0
  277. package/build/schema/Options.d.ts +22 -0
  278. package/build/schema/Options.js +2 -0
  279. package/build/schema/Schema.d.ts +4 -0
  280. package/build/schema/Schema.js +2 -0
  281. package/build/schema/helpers.d.ts +3 -0
  282. package/build/schema/helpers.js +6 -0
  283. package/build/schema/index.d.ts +8 -0
  284. package/build/schema/index.js +5 -0
  285. package/build/schema/infer.d.ts +13 -0
  286. package/build/schema/infer.js +199 -0
  287. package/build/schema/infer.spec.d.ts +1 -0
  288. package/build/schema/infer.spec.js +304 -0
  289. package/build/schema/match.d.ts +6 -0
  290. package/build/schema/match.js +8 -0
  291. package/build/table/Frame.d.ts +2 -0
  292. package/build/table/Frame.js +2 -0
  293. package/build/table/Table.d.ts +2 -0
  294. package/build/table/Table.js +2 -0
  295. package/build/table/checks/unique.d.ts +7 -0
  296. package/build/table/checks/unique.js +23 -0
  297. package/build/table/checks/unique.spec.d.ts +1 -0
  298. package/build/table/checks/unique.spec.js +187 -0
  299. package/build/table/denormalize.d.ts +6 -0
  300. package/build/table/denormalize.js +15 -0
  301. package/build/table/helpers.d.ts +19 -0
  302. package/build/table/helpers.js +62 -0
  303. package/build/table/helpers.spec.d.ts +1 -0
  304. package/build/table/helpers.spec.js +352 -0
  305. package/build/table/index.d.ts +9 -0
  306. package/build/table/index.js +8 -0
  307. package/build/table/inspect.d.ts +8 -0
  308. package/build/table/inspect.js +165 -0
  309. package/build/table/inspect.spec.d.ts +1 -0
  310. package/build/table/inspect.spec.js +335 -0
  311. package/build/table/normalize.d.ts +6 -0
  312. package/build/table/normalize.js +27 -0
  313. package/build/table/normalize.spec.d.ts +1 -0
  314. package/build/table/normalize.spec.js +222 -0
  315. package/build/table/query.d.ts +3 -0
  316. package/build/table/query.js +6 -0
  317. package/package.json +45 -0
@@ -0,0 +1,6 @@
1
+ import type { Schema } from "@frictionless-ts/metadata";
2
+ import type * as pl from "nodejs-polars";
3
+ import type { DenormalizeFieldOptions } from "../field/index.ts";
4
+ import type { Table } from "./Table.ts";
5
+ export declare function denormalizeTable(table: Table, schema: Schema, options?: DenormalizeFieldOptions): Promise<pl.LazyDataFrame<any>>;
6
+ export declare function denormalizeFields(schema: Schema, options?: DenormalizeFieldOptions): Record<string, pl.Expr>;
@@ -0,0 +1,15 @@
1
+ import { denormalizeField } from "../field/index.js";
2
+ export async function denormalizeTable(table, schema, options) {
3
+ return table.select(...Object.values(denormalizeFields(schema, options)));
4
+ }
5
+ export function denormalizeFields(schema, options) {
6
+ const exprs = {};
7
+ for (const field of schema.fields) {
8
+ const missingValues = field.missingValues ?? schema.missingValues;
9
+ const mergedField = { ...field, missingValues };
10
+ const expr = denormalizeField(mergedField, options);
11
+ exprs[field.name] = expr;
12
+ }
13
+ return exprs;
14
+ }
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVub3JtYWxpemUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90YWJsZS9kZW5vcm1hbGl6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUlwRCxNQUFNLENBQUMsS0FBSyxVQUFVLGdCQUFnQixDQUNwQyxLQUFZLEVBQ1osTUFBYyxFQUNkLE9BQWlDO0lBRWpDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUMzRSxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixNQUFjLEVBQ2QsT0FBaUM7SUFFakMsTUFBTSxLQUFLLEdBQTRCLEVBQUUsQ0FBQTtJQUV6QyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUE7UUFDakUsTUFBTSxXQUFXLEdBQUcsRUFBRSxHQUFHLEtBQUssRUFBRSxhQUFhLEVBQUUsQ0FBQTtRQUUvQyxNQUFNLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDbkQsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUE7SUFDMUIsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2NoZW1hIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHR5cGUgKiBhcyBwbCBmcm9tIFwibm9kZWpzLXBvbGFyc1wiXG5pbXBvcnQgeyBkZW5vcm1hbGl6ZUZpZWxkIH0gZnJvbSBcIi4uL2ZpZWxkL2luZGV4LnRzXCJcbmltcG9ydCB0eXBlIHsgRGVub3JtYWxpemVGaWVsZE9wdGlvbnMgfSBmcm9tIFwiLi4vZmllbGQvaW5kZXgudHNcIlxuaW1wb3J0IHR5cGUgeyBUYWJsZSB9IGZyb20gXCIuL1RhYmxlLnRzXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbm9ybWFsaXplVGFibGUoXG4gIHRhYmxlOiBUYWJsZSxcbiAgc2NoZW1hOiBTY2hlbWEsXG4gIG9wdGlvbnM/OiBEZW5vcm1hbGl6ZUZpZWxkT3B0aW9ucyxcbikge1xuICByZXR1cm4gdGFibGUuc2VsZWN0KC4uLk9iamVjdC52YWx1ZXMoZGVub3JtYWxpemVGaWVsZHMoc2NoZW1hLCBvcHRpb25zKSkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZW5vcm1hbGl6ZUZpZWxkcyhcbiAgc2NoZW1hOiBTY2hlbWEsXG4gIG9wdGlvbnM/OiBEZW5vcm1hbGl6ZUZpZWxkT3B0aW9ucyxcbikge1xuICBjb25zdCBleHByczogUmVjb3JkPHN0cmluZywgcGwuRXhwcj4gPSB7fVxuXG4gIGZvciAoY29uc3QgZmllbGQgb2Ygc2NoZW1hLmZpZWxkcykge1xuICAgIGNvbnN0IG1pc3NpbmdWYWx1ZXMgPSBmaWVsZC5taXNzaW5nVmFsdWVzID8/IHNjaGVtYS5taXNzaW5nVmFsdWVzXG4gICAgY29uc3QgbWVyZ2VkRmllbGQgPSB7IC4uLmZpZWxkLCBtaXNzaW5nVmFsdWVzIH1cblxuICAgIGNvbnN0IGV4cHIgPSBkZW5vcm1hbGl6ZUZpZWxkKG1lcmdlZEZpZWxkLCBvcHRpb25zKVxuICAgIGV4cHJzW2ZpZWxkLm5hbWVdID0gZXhwclxuICB9XG5cbiAgcmV0dXJuIGV4cHJzXG59XG4iXX0=
@@ -0,0 +1,19 @@
1
+ import type { Dialect } from "@frictionless-ts/metadata";
2
+ import * as pl from "nodejs-polars";
3
+ import type { Table } from "../table/index.ts";
4
+ export declare function joinHeaderRows(table: Table, options: {
5
+ dialect: Dialect;
6
+ }): Promise<Table | pl.LazyDataFrame<{
7
+ [x: string]: any;
8
+ [x: number]: any;
9
+ }>>;
10
+ export declare function skipCommentRows(table: Table, options: {
11
+ dialect: Dialect;
12
+ }): Table | pl.LazyDataFrame<{
13
+ [x: string]: any;
14
+ [x: number]: any;
15
+ [x: symbol]: any;
16
+ }>;
17
+ export declare function stripInitialSpace(table: Table, options: {
18
+ dialect: Dialect;
19
+ }): Table;
@@ -0,0 +1,62 @@
1
+ import * as pl from "nodejs-polars";
2
+ export async function joinHeaderRows(table, options) {
3
+ const { dialect } = options;
4
+ const headerOffset = getHeaderOffset(dialect);
5
+ const headerRows = getHeaderRows(dialect);
6
+ const headerJoin = dialect?.headerJoin ?? " ";
7
+ if (headerRows.length < 2) {
8
+ return table;
9
+ }
10
+ const extraLabelsFrame = await table
11
+ .withRowCount()
12
+ .withColumn(pl.col("row_nr").add(1))
13
+ .filter(pl.col("row_nr").add(headerOffset).isIn(headerRows))
14
+ .select(...table.columns.map(name => pl.col(name).str.concat(headerJoin)))
15
+ .collect();
16
+ const labels = table.columns;
17
+ const extraLabels = extraLabelsFrame.row(0);
18
+ const mapping = Object.fromEntries(labels.map((label, index) => [
19
+ label,
20
+ [label, extraLabels[index]].join(headerJoin),
21
+ ]));
22
+ return table
23
+ .withRowCount()
24
+ .withColumn(pl.col("row_nr").add(1))
25
+ .filter(pl.col("row_nr").add(headerOffset).isIn(headerRows).not())
26
+ .rename(mapping)
27
+ .drop("row_nr");
28
+ }
29
+ export function skipCommentRows(table, options) {
30
+ const { dialect } = options;
31
+ const commentOffset = getCommentOffset(dialect);
32
+ if (!dialect?.commentRows) {
33
+ return table;
34
+ }
35
+ return table
36
+ .withRowCount()
37
+ .withColumn(pl.col("row_nr").add(1))
38
+ .filter(pl.col("row_nr").add(commentOffset).isIn(dialect.commentRows).not())
39
+ .drop("row_nr");
40
+ }
41
+ export function stripInitialSpace(table, options) {
42
+ const { dialect } = options;
43
+ if (!dialect?.skipInitialSpace) {
44
+ return table;
45
+ }
46
+ return table.select(
47
+ // TODO: rebase on stripCharsStart when it's fixed in polars
48
+ // https://github.com/pola-rs/nodejs-polars/issues/336
49
+ table.columns.map(name => pl.col(name).str.strip().as(name)));
50
+ }
51
+ function getHeaderOffset(dialect) {
52
+ const headerRows = getHeaderRows(dialect);
53
+ return headerRows.at(0) ?? 0;
54
+ }
55
+ function getHeaderRows(dialect) {
56
+ return dialect?.header !== false ? (dialect?.headerRows ?? [1]) : [];
57
+ }
58
+ function getCommentOffset(dialect) {
59
+ const headerRows = getHeaderRows(dialect);
60
+ return headerRows.at(-1) ?? 0;
61
+ }
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RhYmxlL2hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFHbkMsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQ2xDLEtBQVksRUFDWixPQUE2QjtJQUU3QixNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFBO0lBRTNCLE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUM3QyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDekMsTUFBTSxVQUFVLEdBQUcsT0FBTyxFQUFFLFVBQVUsSUFBSSxHQUFHLENBQUE7SUFDN0MsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxLQUFLO1NBQ2pDLFlBQVksRUFBRTtTQUNkLFVBQVUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzNELE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7U0FDekUsT0FBTyxFQUFFLENBQUE7SUFFWixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFBO0lBQzVCLE1BQU0s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SSxDQUFDLENBQUE7QUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRGlhbGVjdCB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCAqIGFzIHBsIGZyb20gXCJub2RlanMtcG9sYXJzXCJcbmltcG9ydCB0eXBlIHsgVGFibGUgfSBmcm9tIFwiLi4vdGFibGUvaW5kZXgudHNcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gam9pbkhlYWRlclJvd3MoXG4gIHRhYmxlOiBUYWJsZSxcbiAgb3B0aW9uczogeyBkaWFsZWN0OiBEaWFsZWN0IH0sXG4pIHtcbiAgY29uc3QgeyBkaWFsZWN0IH0gPSBvcHRpb25zXG5cbiAgY29uc3QgaGVhZGVyT2Zmc2V0ID0gZ2V0SGVhZGVyT2Zmc2V0KGRpYWxlY3QpXG4gIGNvbnN0IGhlYWRlclJvd3MgPSBnZXRIZWFkZXJSb3dzKGRpYWxlY3QpXG4gIGNvbnN0IGhlYWRlckpvaW4gPSBkaWFsZWN0Py5oZWFkZXJKb2luID8/IFwiIFwiXG4gIGlmIChoZWFkZXJSb3dzLmxlbmd0aCA8IDIpIHtcbiAgICByZXR1cm4gdGFibGVcbiAgfVxuXG4gIGNvbnN0IGV4dHJhTGFiZWxzRnJhbWUgPSBhd2FpdCB0YWJsZVxuICAgIC53aXRoUm93Q291bnQoKVxuICAgIC53aXRoQ29sdW1uKHBsLmNvbChcInJvd19uclwiKS5hZGQoMSkpXG4gICAgLmZpbHRlcihwbC5jb2woXCJyb3dfbnJcIikuYWRkKGhlYWRlck9mZnNldCkuaXNJbihoZWFkZXJSb3dzKSlcbiAgICAuc2VsZWN0KC4uLnRhYmxlLmNvbHVtbnMubWFwKG5hbWUgPT4gcGwuY29sKG5hbWUpLnN0ci5jb25jYXQoaGVhZGVySm9pbikpKVxuICAgIC5jb2xsZWN0KClcblxuICBjb25zdCBsYWJlbHMgPSB0YWJsZS5jb2x1bW5zXG4gIGNvbnN0IGV4dHJhTGFiZWxzID0gZXh0cmFMYWJlbHNGcmFtZS5yb3coMClcblxuICBjb25zdCBtYXBwaW5nID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIGxhYmVscy5tYXAoKGxhYmVsLCBpbmRleCkgPT4gW1xuICAgICAgbGFiZWwsXG4gICAgICBbbGFiZWwsIGV4dHJhTGFiZWxzW2luZGV4XV0uam9pbihoZWFkZXJKb2luKSxcbiAgICBdKSxcbiAgKVxuXG4gIHJldHVybiB0YWJsZVxuICAgIC53aXRoUm93Q291bnQoKVxuICAgIC53aXRoQ29sdW1uKHBsLmNvbChcInJvd19uclwiKS5hZGQoMSkpXG4gICAgLmZpbHRlcihwbC5jb2woXCJyb3dfbnJcIikuYWRkKGhlYWRlck9mZnNldCkuaXNJbihoZWFkZXJSb3dzKS5ub3QoKSlcbiAgICAucmVuYW1lKG1hcHBpbmcpXG4gICAgLmRyb3AoXCJyb3dfbnJcIilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNraXBDb21tZW50Um93cyh0YWJsZTogVGFibGUsIG9wdGlvbnM6IHsgZGlhbGVjdDogRGlhbGVjdCB9KSB7XG4gIGNvbnN0IHsgZGlhbGVjdCB9ID0gb3B0aW9uc1xuXG4gIGNvbnN0IGNvbW1lbnRPZmZzZXQgPSBnZXRDb21tZW50T2Zmc2V0KGRpYWxlY3QpXG4gIGlmICghZGlhbGVjdD8uY29tbWVudFJvd3MpIHtcbiAgICByZXR1cm4gdGFibGVcbiAgfVxuXG4gIHJldHVybiB0YWJsZVxuICAgIC53aXRoUm93Q291bnQoKVxuICAgIC53aXRoQ29sdW1uKHBsLmNvbChcInJvd19uclwiKS5hZGQoMSkpXG4gICAgLmZpbHRlcihwbC5jb2woXCJyb3dfbnJcIikuYWRkKGNvbW1lbnRPZmZzZXQpLmlzSW4oZGlhbGVjdC5jb21tZW50Um93cykubm90KCkpXG4gICAgLmRyb3AoXCJyb3dfbnJcIilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwSW5pdGlhbFNwYWNlKHRhYmxlOiBUYWJsZSwgb3B0aW9uczogeyBkaWFsZWN0OiBEaWFsZWN0IH0pIHtcbiAgY29uc3QgeyBkaWFsZWN0IH0gPSBvcHRpb25zXG5cbiAgaWYgKCFkaWFsZWN0Py5za2lwSW5pdGlhbFNwYWNlKSB7XG4gICAgcmV0dXJuIHRhYmxlXG4gIH1cblxuICByZXR1cm4gdGFibGUuc2VsZWN0KFxuICAgIC8vIFRPRE86IHJlYmFzZSBvbiBzdHJpcENoYXJzU3RhcnQgd2hlbiBpdCdzIGZpeGVkIGluIHBvbGFyc1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb2xhLXJzL25vZGVqcy1wb2xhcnMvaXNzdWVzLzMzNlxuICAgIHRhYmxlLmNvbHVtbnMubWFwKG5hbWUgPT4gcGwuY29sKG5hbWUpLnN0ci5zdHJpcCgpLmFzKG5hbWUpKSxcbiAgKVxufVxuXG5mdW5jdGlvbiBnZXRIZWFkZXJPZmZzZXQoZGlhbGVjdD86IERpYWxlY3QpIHtcbiAgY29uc3QgaGVhZGVyUm93cyA9IGdldEhlYWRlclJvd3MoZGlhbGVjdClcbiAgcmV0dXJuIGhlYWRlclJvd3MuYXQoMCkgPz8gMFxufVxuXG5mdW5jdGlvbiBnZXRIZWFkZXJSb3dzKGRpYWxlY3Q/OiBEaWFsZWN0KSB7XG4gIHJldHVybiBkaWFsZWN0Py5oZWFkZXIgIT09IGZhbHNlID8gKGRpYWxlY3Q/LmhlYWRlclJvd3MgPz8gWzFdKSA6IFtdXG59XG5cbmZ1bmN0aW9uIGdldENvbW1lbnRPZmZzZXQoZGlhbGVjdD86IERpYWxlY3QpIHtcbiAgY29uc3QgaGVhZGVyUm93cyA9IGdldEhlYWRlclJvd3MoZGlhbGVjdClcbiAgcmV0dXJuIGhlYWRlclJvd3MuYXQoLTEpID8/IDBcbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,352 @@
1
+ import * as pl from "nodejs-polars";
2
+ import { describe, expect, it } from "vitest";
3
+ import { joinHeaderRows, skipCommentRows, stripInitialSpace, } from "./helpers.js";
4
+ describe("joinHeaderRows", () => {
5
+ it("should join two header rows with default space separator", async () => {
6
+ const table = pl
7
+ .DataFrame({
8
+ col1: ["first", "name", "header3", "Alice", "Bob"],
9
+ col2: ["last", "name", "header3", "Smith", "Jones"],
10
+ col3: [
11
+ "contact",
12
+ "email",
13
+ "header3",
14
+ "alice@example.com",
15
+ "bob@example.com",
16
+ ],
17
+ })
18
+ .lazy();
19
+ const result = await joinHeaderRows(table, {
20
+ dialect: { headerRows: [2, 3] },
21
+ });
22
+ const collected = await result.collect();
23
+ expect(collected.columns).toEqual([
24
+ "col1 first",
25
+ "col2 last",
26
+ "col3 contact",
27
+ ]);
28
+ expect(collected.height).toBe(4);
29
+ expect(collected.row(0)).toEqual(["name", "name", "email"]);
30
+ expect(collected.row(1)).toEqual(["header3", "header3", "header3"]);
31
+ expect(collected.row(2)).toEqual(["Alice", "Smith", "alice@example.com"]);
32
+ expect(collected.row(3)).toEqual(["Bob", "Jones", "bob@example.com"]);
33
+ });
34
+ it("should join two header rows with custom separator", async () => {
35
+ const table = pl
36
+ .DataFrame({
37
+ col1: ["user", "first", "header3", "Alice", "Bob"],
38
+ col2: ["user", "last", "header3", "Smith", "Jones"],
39
+ col3: ["meta", "created", "header3", "2023-01-01", "2023-01-02"],
40
+ })
41
+ .lazy();
42
+ const result = await joinHeaderRows(table, {
43
+ dialect: { headerRows: [2, 3], headerJoin: "_" },
44
+ });
45
+ const collected = await result.collect();
46
+ expect(collected.columns).toEqual(["col1_user", "col2_user", "col3_meta"]);
47
+ expect(collected.height).toBe(4);
48
+ expect(collected.row(0)).toEqual(["first", "last", "created"]);
49
+ expect(collected.row(1)).toEqual(["header3", "header3", "header3"]);
50
+ expect(collected.row(2)).toEqual(["Alice", "Smith", "2023-01-01"]);
51
+ expect(collected.row(3)).toEqual(["Bob", "Jones", "2023-01-02"]);
52
+ });
53
+ it("should return table unchanged when only one header row", async () => {
54
+ const table = pl
55
+ .DataFrame({
56
+ name: ["Alice", "Bob"],
57
+ age: [30, 25],
58
+ city: ["NYC", "LA"],
59
+ })
60
+ .lazy();
61
+ const result = await joinHeaderRows(table, {
62
+ dialect: { headerRows: [1] },
63
+ });
64
+ const collected = await result.collect();
65
+ expect(collected.columns).toEqual(["name", "age", "city"]);
66
+ expect(collected.height).toBe(2);
67
+ });
68
+ it("should return table unchanged when no header rows", async () => {
69
+ const table = pl
70
+ .DataFrame({
71
+ field1: ["Alice", "Bob"],
72
+ field2: [30, 25],
73
+ field3: ["NYC", "LA"],
74
+ })
75
+ .lazy();
76
+ const result = await joinHeaderRows(table, {
77
+ dialect: { header: false },
78
+ });
79
+ const collected = await result.collect();
80
+ expect(collected.columns).toEqual(["field1", "field2", "field3"]);
81
+ expect(collected.height).toBe(2);
82
+ });
83
+ it("should join three header rows", async () => {
84
+ const table = pl
85
+ .DataFrame({
86
+ col1: ["person", "user", "first", "header4", "Alice", "Bob"],
87
+ col2: ["person", "user", "last", "header4", "Smith", "Jones"],
88
+ col3: ["location", "address", "city", "header4", "NYC", "LA"],
89
+ })
90
+ .lazy();
91
+ const result = await joinHeaderRows(table, {
92
+ dialect: { headerRows: [2, 3, 4] },
93
+ });
94
+ const collected = await result.collect();
95
+ expect(collected.columns).toEqual([
96
+ "col1 person user",
97
+ "col2 person user",
98
+ "col3 location address",
99
+ ]);
100
+ expect(collected.height).toBe(4);
101
+ expect(collected.row(0)).toEqual(["first", "last", "city"]);
102
+ expect(collected.row(1)).toEqual(["header4", "header4", "header4"]);
103
+ expect(collected.row(2)).toEqual(["Alice", "Smith", "NYC"]);
104
+ expect(collected.row(3)).toEqual(["Bob", "Jones", "LA"]);
105
+ });
106
+ it("should handle empty strings in header rows", async () => {
107
+ const table = pl
108
+ .DataFrame({
109
+ col1: ["person", "", "header3", "Alice", "Bob"],
110
+ col2: ["", "name", "header3", "Smith", "Jones"],
111
+ col3: ["location", "city", "header3", "NYC", "LA"],
112
+ })
113
+ .lazy();
114
+ const result = await joinHeaderRows(table, {
115
+ dialect: { headerRows: [2, 3] },
116
+ });
117
+ const collected = await result.collect();
118
+ expect(collected.columns).toEqual(["col1 person", "col2 ", "col3 location"]);
119
+ expect(collected.height).toBe(4);
120
+ expect(collected.row(0)).toEqual(["", "name", "city"]);
121
+ expect(collected.row(1)).toEqual(["header3", "header3", "header3"]);
122
+ expect(collected.row(2)).toEqual(["Alice", "Smith", "NYC"]);
123
+ expect(collected.row(3)).toEqual(["Bob", "Jones", "LA"]);
124
+ });
125
+ });
126
+ describe("skipCommentRows", () => {
127
+ it("should skip comment rows by row number", async () => {
128
+ const table = pl
129
+ .DataFrame({
130
+ name: ["Alice", "# Comment", "Bob", "Charlie"],
131
+ age: [30, 0, 25, 35],
132
+ city: ["NYC", "ignored", "LA", "SF"],
133
+ })
134
+ .lazy();
135
+ const result = skipCommentRows(table, {
136
+ dialect: { commentRows: [2], header: false },
137
+ });
138
+ const collected = await result.collect();
139
+ expect(collected.height).toBe(3);
140
+ expect(collected.row(0)).toEqual(["Alice", 30, "NYC"]);
141
+ expect(collected.row(1)).toEqual(["Bob", 25, "LA"]);
142
+ expect(collected.row(2)).toEqual(["Charlie", 35, "SF"]);
143
+ });
144
+ it("should skip multiple comment rows", async () => {
145
+ const table = pl
146
+ .DataFrame({
147
+ name: ["Alice", "# Comment 1", "Bob", "# Comment 2", "Charlie"],
148
+ age: [30, 0, 25, 0, 35],
149
+ city: ["NYC", "ignored", "LA", "ignored", "SF"],
150
+ })
151
+ .lazy();
152
+ const result = skipCommentRows(table, {
153
+ dialect: { commentRows: [2, 4], header: false },
154
+ });
155
+ const collected = await result.collect();
156
+ expect(collected.height).toBe(3);
157
+ expect(collected.row(0)).toEqual(["Alice", 30, "NYC"]);
158
+ expect(collected.row(1)).toEqual(["Bob", 25, "LA"]);
159
+ expect(collected.row(2)).toEqual(["Charlie", 35, "SF"]);
160
+ });
161
+ it("should return table unchanged when no commentRows specified", async () => {
162
+ const table = pl
163
+ .DataFrame({
164
+ name: ["Alice", "Bob", "Charlie"],
165
+ age: [30, 25, 35],
166
+ city: ["NYC", "LA", "SF"],
167
+ })
168
+ .lazy();
169
+ const result = skipCommentRows(table, {
170
+ dialect: {},
171
+ });
172
+ const collected = await result.collect();
173
+ expect(collected.height).toBe(3);
174
+ expect(collected.columns).toEqual(["name", "age", "city"]);
175
+ });
176
+ it("should skip rows after header when headerRows specified", async () => {
177
+ const table = pl
178
+ .DataFrame({
179
+ col1: ["name", "Alice", "# Comment", "Bob"],
180
+ col2: ["age", "30", "-1", "25"],
181
+ col3: ["city", "NYC", "ignored", "LA"],
182
+ })
183
+ .lazy();
184
+ const result = skipCommentRows(table, {
185
+ dialect: { headerRows: [2], commentRows: [5] },
186
+ });
187
+ const collected = await result.collect();
188
+ expect(collected.height).toBe(3);
189
+ expect(collected.row(0)).toEqual(["name", "age", "city"]);
190
+ expect(collected.row(1)).toEqual(["Alice", "30", "NYC"]);
191
+ expect(collected.row(2)).toEqual(["Bob", "25", "LA"]);
192
+ });
193
+ it("should handle commentRows at the beginning", async () => {
194
+ const table = pl
195
+ .DataFrame({
196
+ name: ["# Skip this", "Alice", "Bob"],
197
+ age: [0, 30, 25],
198
+ city: ["ignored", "NYC", "LA"],
199
+ })
200
+ .lazy();
201
+ const result = skipCommentRows(table, {
202
+ dialect: { commentRows: [1], header: false },
203
+ });
204
+ const collected = await result.collect();
205
+ expect(collected.height).toBe(2);
206
+ expect(collected.row(0)).toEqual(["Alice", 30, "NYC"]);
207
+ expect(collected.row(1)).toEqual(["Bob", 25, "LA"]);
208
+ });
209
+ it("should handle commentRows at the end", async () => {
210
+ const table = pl
211
+ .DataFrame({
212
+ name: ["Alice", "Bob", "# Footer comment"],
213
+ age: [30, 25, 0],
214
+ city: ["NYC", "LA", "ignored"],
215
+ })
216
+ .lazy();
217
+ const result = skipCommentRows(table, {
218
+ dialect: { commentRows: [3], header: false },
219
+ });
220
+ const collected = await result.collect();
221
+ expect(collected.height).toBe(2);
222
+ expect(collected.row(0)).toEqual(["Alice", 30, "NYC"]);
223
+ expect(collected.row(1)).toEqual(["Bob", 25, "LA"]);
224
+ });
225
+ it("should handle multiple header rows with commentRows", async () => {
226
+ const table = pl
227
+ .DataFrame({
228
+ col1: ["person", "first", "Alice", "# Comment", "Bob"],
229
+ col2: ["person", "last", "Smith", "ignored", "Jones"],
230
+ col3: ["location", "city", "NYC", "ignored", "LA"],
231
+ })
232
+ .lazy();
233
+ const result = skipCommentRows(table, {
234
+ dialect: { headerRows: [2, 3], commentRows: [7] },
235
+ });
236
+ const collected = await result.collect();
237
+ expect(collected.height).toBe(4);
238
+ expect(collected.row(0)).toEqual(["person", "person", "location"]);
239
+ expect(collected.row(1)).toEqual(["first", "last", "city"]);
240
+ expect(collected.row(2)).toEqual(["Alice", "Smith", "NYC"]);
241
+ expect(collected.row(3)).toEqual(["Bob", "Jones", "LA"]);
242
+ });
243
+ });
244
+ describe("stripInitialSpace", () => {
245
+ it("should strip leading and trailing spaces from all columns", async () => {
246
+ const table = pl
247
+ .DataFrame({
248
+ name: [" Alice ", " Bob", "Charlie "],
249
+ age: ["30", " 25 ", "35"],
250
+ city: [" NYC", "LA ", " SF "],
251
+ })
252
+ .lazy();
253
+ const result = stripInitialSpace(table, {
254
+ dialect: { skipInitialSpace: true },
255
+ });
256
+ const collected = await result.collect();
257
+ expect(collected.row(0)).toEqual(["Alice", "30", "NYC"]);
258
+ expect(collected.row(1)).toEqual(["Bob", "25", "LA"]);
259
+ expect(collected.row(2)).toEqual(["Charlie", "35", "SF"]);
260
+ });
261
+ it("should return table unchanged when skipInitialSpace is false", async () => {
262
+ const table = pl
263
+ .DataFrame({
264
+ name: [" Alice ", " Bob"],
265
+ age: ["30", " 25 "],
266
+ city: [" NYC", "LA "],
267
+ })
268
+ .lazy();
269
+ const result = stripInitialSpace(table, {
270
+ dialect: { skipInitialSpace: false },
271
+ });
272
+ const collected = await result.collect();
273
+ expect(collected.row(0)).toEqual([" Alice ", "30", " NYC"]);
274
+ expect(collected.row(1)).toEqual([" Bob", " 25 ", "LA "]);
275
+ });
276
+ it("should return table unchanged when skipInitialSpace is not specified", async () => {
277
+ const table = pl
278
+ .DataFrame({
279
+ name: [" Alice ", " Bob"],
280
+ age: ["30", " 25 "],
281
+ city: [" NYC", "LA "],
282
+ })
283
+ .lazy();
284
+ const result = stripInitialSpace(table, {
285
+ dialect: {},
286
+ });
287
+ const collected = await result.collect();
288
+ expect(collected.row(0)).toEqual([" Alice ", "30", " NYC"]);
289
+ expect(collected.row(1)).toEqual([" Bob", " 25 ", "LA "]);
290
+ });
291
+ it("should handle strings with no spaces", async () => {
292
+ const table = pl
293
+ .DataFrame({
294
+ name: ["Alice", "Bob"],
295
+ age: ["30", "25"],
296
+ city: ["NYC", "LA"],
297
+ })
298
+ .lazy();
299
+ const result = stripInitialSpace(table, {
300
+ dialect: { skipInitialSpace: true },
301
+ });
302
+ const collected = await result.collect();
303
+ expect(collected.row(0)).toEqual(["Alice", "30", "NYC"]);
304
+ expect(collected.row(1)).toEqual(["Bob", "25", "LA"]);
305
+ });
306
+ it("should handle empty strings", async () => {
307
+ const table = pl
308
+ .DataFrame({
309
+ name: ["Alice", ""],
310
+ age: ["30", " "],
311
+ city: ["", "LA"],
312
+ })
313
+ .lazy();
314
+ const result = stripInitialSpace(table, {
315
+ dialect: { skipInitialSpace: true },
316
+ });
317
+ const collected = await result.collect();
318
+ expect(collected.row(0)).toEqual(["Alice", "30", ""]);
319
+ expect(collected.row(1)).toEqual(["", "", "LA"]);
320
+ });
321
+ it("should handle strings with multiple spaces", async () => {
322
+ const table = pl
323
+ .DataFrame({
324
+ name: [" Alice ", " Bob"],
325
+ age: ["30 ", " 25 "],
326
+ city: [" NYC ", " LA "],
327
+ })
328
+ .lazy();
329
+ const result = stripInitialSpace(table, {
330
+ dialect: { skipInitialSpace: true },
331
+ });
332
+ const collected = await result.collect();
333
+ expect(collected.row(0)).toEqual(["Alice", "30", "NYC"]);
334
+ expect(collected.row(1)).toEqual(["Bob", "25", "LA"]);
335
+ });
336
+ it("should handle tabs and other whitespace", async () => {
337
+ const table = pl
338
+ .DataFrame({
339
+ name: ["\tAlice\t", "\nBob"],
340
+ age: ["30\n", "\t25\t"],
341
+ city: ["\tNYC", "LA\n"],
342
+ })
343
+ .lazy();
344
+ const result = stripInitialSpace(table, {
345
+ dialect: { skipInitialSpace: true },
346
+ });
347
+ const collected = await result.collect();
348
+ expect(collected.row(0)).toEqual(["Alice", "30", "NYC"]);
349
+ expect(collected.row(1)).toEqual(["Bob", "25", "LA"]);
350
+ });
351
+ });
352
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGFibGUvaGVscGVycy5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQ0wsY0FBYyxFQUNkLGVBQWUsRUFDZixpQkFBaUIsR0FDbEIsTUFBTSxjQUFjLENBQUE7QUFFckIsUUFBUSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRTtJQUM5QixFQUFFLENBQUMsMERBQTBELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDeEUsTUFBTSxLQUFLLEdBQUcsRUFBRTthQUNiLFNBQVMsQ0FBQztZQUNULElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUM7WUFDbEQsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQztZQUNuRCxJQUFJLEVBQUU7Z0JBQ0osU0FBUztnQkFDVCxPQUFPO2dCQUNQLFNBQVM7Z0JBQ1QsbUJBQW1CO2dCQUNuQixpQkFBaUI7YUFDbEI7U0FDRixDQUFDO2FBQ0QsSUFBSSxFQUFFLENBQUE7UUFFVCxNQUFNLE1BQU0sR0FBRyxNQUFNLGNBQWMsQ0FBQyxLQUFLLEVBQUU7WUFDekMsT0FBTyxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO1NBQ2hDLENBQUMsQ0FBQTtRQUVGLE1BQU0sU0FBUyxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ3hDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ2hDLFlBQVk7WUFDWixXQUFXO1lB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QUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBQzNELE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFBO1FBQ25FLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQzNELE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQzFELENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzFELE1BQU0sS0FBSyxHQUFHLEVBQUU7YUFDYixTQUFTLENBQUM7WUFDVCxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDO1lBQy9DLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUM7WUFDL0MsSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQztTQUNuRCxDQUFDO2FBQ0QsSUFBSSxFQUFFLENBQUE7UUFFVCxNQUFNLE1BQU0sR0FBRyxNQUFNLGNBQWMsQ0FBQyxLQUFLLEVBQUU7WUFDekMsT0FBTyxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO1NBQ2hDLENBQUMsQ0FBQTtRQUVGLE1BQU0sU0FBUyxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ3hDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFBO1FBQzVFLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2hDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBQ3RELE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFBO1FBQ25FLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQzNELE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQzFELENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUE7QUFFRixRQUFRLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFO0lBQy9CLEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN0RCxNQUFNLEtBQUssR0FBRyxFQUFFO2FBQ2IsU0FBUyxDQUFDO1lBQ1QsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDO1lBQzlDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUNwQixJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7U0FDckMsQ0FBQzthQUNELElBQUksRUFBRSxDQUFBO1FBRVQsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRTtZQUNwQyxPQUFPLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO1NBQzdDLENBQUMsQ0FBQTtRQUVGLE1BQU0sU0FBUyxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ3hDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2hDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQ3RELE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ25ELE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQ3pELENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2pELE1BQU0sS0FBSyxHQUFHLEVBQUU7YUFDYixTQUFTLENBQUM7WUFDVCxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsU0FBUyxDQUFDO1lBQy9ELEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdkIsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQztTQUNoRCxDQUFDO2FBQ0QsSUFBSSxFQUFFLENBQUE7UUFFVCxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFO1lBQ3BDLE9BQU8sRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO1NBQ2hELENBQUMsQ0FBQTtRQUVGLE1BQU0sU0FBUyxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ3hDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2hDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQ3RELE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ25ELE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQ3pELENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLDZEQUE2RCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzNFLE1BQU0sS0FBSyxHQUFHLEVBQUU7YUFDYixTQUFTLENBQUM7WUFDVCxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQztZQUNqQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUNqQixJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztTQUMxQixDQUFDO2FBQ0QsSUFBSSxFQUFFLENBQUE7UUFFVCxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFO1lBQ3BDLE9BQU8sRUFBRSxFQUFFO1NBQ1osQ0FBQyxDQUFBO1FBRUYsTUFBTSxTQUFTLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDeEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDaEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFDNUQsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMseURBQXlELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDdkUsTUFBTSxLQUFLLEdBQUcsRUFBRTthQUNiLFNBQVMsQ0FBQztZQUNULElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQztZQUMzQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7WUFDL0IsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDO1NBQ3ZDLENBQUM7YUFDRCxJQUFJLEVBQUUsQ0FBQTtRQUVULE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUU7WUFDcEMsT0FBTyxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7U0FDL0MsQ0FBQyxDQUFBO1FBRUYsTUFBTSxTQUFTLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDeEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDaEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUE7UUFDekQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDeEQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDdkQsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsNENBQTRDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDMUQsTUFBTSxLQUFLLEdBQUcsRUFBRTthQUNiLFNBQVMsQ0FBQztZQUNULElBQUksRUFBRSxDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDO1lBQ3JDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO1lBQ2hCLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDO1NBQy9CLENBQUM7YUFDRCxJQUFJLEVBQUUsQ0FBQTtRQUVULE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUU7WUFDcEMsT0FBTyxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtTQUM3QyxDQUFDLENBQUE7UUFFRixNQUFNLFNBQVMsR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUN4QyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNoQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUN0RCxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUNyRCxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyxzQ0FBc0MsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNwRCxNQUFNLEtBQUssR0FBRyxFQUFFO2FBQ2IsU0FBUyxDQUFDO1lBQ1QsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsQ0FBQztZQUMxQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoQixJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQztTQUMvQixDQUFDO2FBQ0QsSUFBSSxFQUFFLENBQUE7UUFFVCxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFO1lBQ3BDLE9BQU8sRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7U0FDN0MsQ0FBQyxDQUFBO1FBRUYsTUFBTSxTQUFTLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDeEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDaEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDdEQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDckQsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMscURBQXFELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbkUsTUFBTSxLQUFLLEdBQUcsRUFBRTthQUNiLFNBQVMsQ0FBQztZQUNULElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUM7WUFDdEQsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQztZQUNyRCxJQUFJLEVBQUUsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDO1NBQ25ELENBQUM7YUFDRCxJQUFJLEVBQUUsQ0FBQTtRQUVULE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUU7WUFDcEMsT0FBTyxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFO1NBQ2xELENBQUMsQ0FBQTtRQUVGLE1BQU0sU0FBUyxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ3hDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2hDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFBO1FBQ2xFLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBQzNELE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQzNELE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQzFELENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUE7QUFFRixRQUFRLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxFQUFFO0lBQ2pDLEVBQUUsQ0FBQywyREFBMkQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN6RSxNQUFNLEtBQUssR0FBRyxFQUFFO2FBQ2IsU0FBUyxDQUFDO1lBQ1QsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUM7WUFDckMsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUM7WUFDekIsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUM7U0FDOUIsQ0FBQzthQUNELElBQUksRUFBRSxDQUFBO1FBRVQsTUFBTSxNQUFNLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxFQUFFO1lBQ3RDLE9BQU8sRUFBRSxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRTtTQUNwQyxDQUFDLENBQUE7UUFFRixNQUFNLFNBQVMsR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUN4QyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUN4RCxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUNyRCxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUMzRCxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyw4REFBOEQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUM1RSxNQUFNLEtBQUssR0FBRyxFQUFFO2FBQ2IsU0FBUyxDQUFDO1lBQ1QsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQztZQUN6QixHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO1lBQ25CLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUM7U0FDdEIsQ0FBQzthQUNELElBQUksRUFBRSxDQUFBO1FBRVQsTUFBTSxNQUFNLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxFQUFFO1lBQ3RDLE9BQU8sRUFBRSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRTtTQUNyQyxDQUFDLENBQUE7UUFFRixNQUFNLFNBQVMsR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUN4QyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQTtRQUMzRCxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUMzRCxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyxzRUFBc0UsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNwRixNQUFNLEtBQUssR0FBRyxFQUFFO2FBQ2IsU0FBUyxDQUFDO1lBQ1QsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQztZQUN6QixHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO1lBQ25CLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUM7U0FDdEIsQ0FBQzthQUNELElBQUksRUFBRSxDQUFBO1FBRVQsTUFBTSxNQUFNLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxFQUFFO1lBQ3RDLE9BQU8sRUFBRSxFQUFFO1NBQ1osQ0FBQyxDQUFBO1FBRUYsTUFBTSxTQUFTLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDeEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUE7UUFDM0QsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDM0QsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsc0NBQXNDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDcEQsTUFBTSxLQUFLLEdBQUcsRUFBRTthQUNiLFNBQVMsQ0FBQztZQUNULElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUM7WUFDdEIsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztZQUNqQixJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO1NBQ3BCLENBQUM7YUFDRCxJQUFJLEVBQUUsQ0FBQTtRQUVULE1BQU0sTUFBTSxHQUFHLGlCQUFpQixDQUFDLEtBQUssRUFBRTtZQUN0QyxPQUFPLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUU7U0FDcEMsQ0FBQyxDQUFBO1FBRUYsTUFBTSxTQUFTLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDeEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDeEQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDdkQsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsNkJBQTZCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDM0MsTUFBTSxLQUFLLEdBQUcsRUFBRTthQUNiLFNBQVMsQ0FBQztZQUNULElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDbkIsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztZQUNoQixJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDO1NBQ2pCLENBQUM7YUFDRCxJQUFJLEVBQUUsQ0FBQTtRQUVULE1BQU0sTUFBTSxHQUFHLGlCQUFpQixDQUFDLEtBQUssRUFBRTtZQUN0QyxPQUFPLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUU7U0FDcEMsQ0FBQyxDQUFBO1FBRUYsTUFBTSxTQUFTLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDeEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDckQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDbEQsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsNENBQTRDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDMUQsTUFBTSxLQUFLLEdBQUcsRUFBRTthQUNiLFNBQVMsQ0FBQztZQUNULElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUM7WUFDN0IsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQztZQUN4QixJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDO1NBQzlCLENBQUM7YUFDRCxJQUFJLEVBQUUsQ0FBQTtRQUVULE1BQU0sTUFBTSxHQUFHLGlCQUFpQixDQUFDLEtBQUssRUFBRTtZQUN0QyxPQUFPLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUU7U0FDcEMsQ0FBQyxDQUFBO1FBRUYsTUFBTSxTQUFTLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDeEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDeEQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDdkQsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMseUNBQXlDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDdkQsTUFBTSxLQUFLLEdBQUcsRUFBRTthQUNiLFNBQVMsQ0FBQztZQUNULElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUM7WUFDNUIsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQztZQUN2QixJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDO1NBQ3hCLENBQUM7YUFDRCxJQUFJLEVBQUUsQ0FBQTtRQUVULE1BQU0sTUFBTSxHQUFHLGlCQUFpQixDQUFDLEtBQUssRUFBRTtZQUN0QyxPQUFPLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUU7U0FDcEMsQ0FBQyxDQUFBO1FBRUYsTUFBTSxTQUFTLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDeEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDeEQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDdkQsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBsIGZyb20gXCJub2RlanMtcG9sYXJzXCJcbmltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQge1xuICBqb2luSGVhZGVyUm93cyxcbiAgc2tpcENvbW1lbnRSb3dzLFxuICBzdHJpcEluaXRpYWxTcGFjZSxcbn0gZnJvbSBcIi4vaGVscGVycy50c1wiXG5cbmRlc2NyaWJlKFwiam9pbkhlYWRlclJvd3NcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCBqb2luIHR3byBoZWFkZXIgcm93cyB3aXRoIGRlZmF1bHQgc3BhY2Ugc2VwYXJhdG9yXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgY29sMTogW1wiZmlyc3RcIiwgXCJuYW1lXCIsIFwiaGVhZGVyM1wiLCBcIkFsaWNlXCIsIFwiQm9iXCJdLFxuICAgICAgICBjb2wyOiBbXCJsYXN0XCIsIFwibmFtZVwiLCBcImhlYWRlcjNcIiwgXCJTbWl0aFwiLCBcIkpvbmVzXCJdLFxuICAgICAgICBjb2wzOiBbXG4gICAgICAgICAgXCJjb250YWN0XCIsXG4gICAgICAgICAgXCJlbWFpbFwiLFxuICAgICAgICAgIFwiaGVhZGVyM1wiLFxuICAgICAgICAgIFwiYWxpY2VAZXhhbXBsZS5jb21cIixcbiAgICAgICAgICBcImJvYkBleGFtcGxlLmNvbVwiLFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGpvaW5IZWFkZXJSb3dzKHRhYmxlLCB7XG4gICAgICBkaWFsZWN0OiB7IGhlYWRlclJvd3M6IFsyLCAzXSB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBjb2xsZWN0ZWQgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5jb2x1bW5zKS50b0VxdWFsKFtcbiAgICAgIFwiY29sMSBmaXJzdFwiLFxuICAgICAgXCJjb2wyIGxhc3RcIixcbiAgICAgIFwiY29sMyBjb250YWN0XCIsXG4gICAgXSlcbiAgICBleHBlY3QoY29sbGVjdGVkLmhlaWdodCkudG9CZSg0KVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDApKS50b0VxdWFsKFtcIm5hbWVcIiwgXCJuYW1lXCIsIFwiZW1haWxcIl0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMSkpLnRvRXF1YWwoW1wiaGVhZGVyM1wiLCBcImhlYWRlcjNcIiwgXCJoZWFkZXIzXCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDIpKS50b0VxdWFsKFtcIkFsaWNlXCIsIFwiU21pdGhcIiwgXCJhbGljZUBleGFtcGxlLmNvbVwiXSlcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygzKSkudG9FcXVhbChbXCJCb2JcIiwgXCJKb25lc1wiLCBcImJvYkBleGFtcGxlLmNvbVwiXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBqb2luIHR3byBoZWFkZXIgcm93cyB3aXRoIGN1c3RvbSBzZXBhcmF0b3JcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBjb2wxOiBbXCJ1c2VyXCIsIFwiZmlyc3RcIiwgXCJoZWFkZXIzXCIsIFwiQWxpY2VcIiwgXCJCb2JcIl0sXG4gICAgICAgIGNvbDI6IFtcInVzZXJcIiwgXCJsYXN0XCIsIFwiaGVhZGVyM1wiLCBcIlNtaXRoXCIsIFwiSm9uZXNcIl0sXG4gICAgICAgIGNvbDM6IFtcIm1ldGFcIiwgXCJjcmVhdGVkXCIsIFwiaGVhZGVyM1wiLCBcIjIwMjMtMDEtMDFcIiwgXCIyMDIzLTAxLTAyXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGpvaW5IZWFkZXJSb3dzKHRhYmxlLCB7XG4gICAgICBkaWFsZWN0OiB7IGhlYWRlclJvd3M6IFsyLCAzXSwgaGVhZGVySm9pbjogXCJfXCIgfSxcbiAgICB9KVxuXG4gICAgY29uc3QgY29sbGVjdGVkID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQuY29sdW1ucykudG9FcXVhbChbXCJjb2wxX3VzZXJcIiwgXCJjb2wyX3VzZXJcIiwgXCJjb2wzX21ldGFcIl0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5oZWlnaHQpLnRvQmUoNClcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygwKSkudG9FcXVhbChbXCJmaXJzdFwiLCBcImxhc3RcIiwgXCJjcmVhdGVkXCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDEpKS50b0VxdWFsKFtcImhlYWRlcjNcIiwgXCJoZWFkZXIzXCIsIFwiaGVhZGVyM1wiXSlcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygyKSkudG9FcXVhbChbXCJBbGljZVwiLCBcIlNtaXRoXCIsIFwiMjAyMy0wMS0wMVwiXSlcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygzKSkudG9FcXVhbChbXCJCb2JcIiwgXCJKb25lc1wiLCBcIjIwMjMtMDEtMDJcIl0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgcmV0dXJuIHRhYmxlIHVuY2hhbmdlZCB3aGVuIG9ubHkgb25lIGhlYWRlciByb3dcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBuYW1lOiBbXCJBbGljZVwiLCBcIkJvYlwiXSxcbiAgICAgICAgYWdlOiBbMzAsIDI1XSxcbiAgICAgICAgY2l0eTogW1wiTllDXCIsIFwiTEFcIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgam9pbkhlYWRlclJvd3ModGFibGUsIHtcbiAgICAgIGRpYWxlY3Q6IHsgaGVhZGVyUm93czogWzFdIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbGxlY3RlZCA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcbiAgICBleHBlY3QoY29sbGVjdGVkLmNvbHVtbnMpLnRvRXF1YWwoW1wibmFtZVwiLCBcImFnZVwiLCBcImNpdHlcIl0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5oZWlnaHQpLnRvQmUoMilcbiAgfSlcblxuICBpdChcInNob3VsZCByZXR1cm4gdGFibGUgdW5jaGFuZ2VkIHdoZW4gbm8gaGVhZGVyIHJvd3NcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBmaWVsZDE6IFtcIkFsaWNlXCIsIFwiQm9iXCJdLFxuICAgICAgICBmaWVsZDI6IFszMCwgMjVdLFxuICAgICAgICBmaWVsZDM6IFtcIk5ZQ1wiLCBcIkxBXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGpvaW5IZWFkZXJSb3dzKHRhYmxlLCB7XG4gICAgICBkaWFsZWN0OiB7IGhlYWRlcjogZmFsc2UgfSxcbiAgICB9KVxuXG4gICAgY29uc3QgY29sbGVjdGVkID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQuY29sdW1ucykudG9FcXVhbChbXCJmaWVsZDFcIiwgXCJmaWVsZDJcIiwgXCJmaWVsZDNcIl0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5oZWlnaHQpLnRvQmUoMilcbiAgfSlcblxuICBpdChcInNob3VsZCBqb2luIHRocmVlIGhlYWRlciByb3dzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgY29sMTogW1wicGVyc29uXCIsIFwidXNlclwiLCBcImZpcnN0XCIsIFwiaGVhZGVyNFwiLCBcIkFsaWNlXCIsIFwiQm9iXCJdLFxuICAgICAgICBjb2wyOiBbXCJwZXJzb25cIiwgXCJ1c2VyXCIsIFwibGFzdFwiLCBcImhlYWRlcjRcIiwgXCJTbWl0aFwiLCBcIkpvbmVzXCJdLFxuICAgICAgICBjb2wzOiBbXCJsb2NhdGlvblwiLCBcImFkZHJlc3NcIiwgXCJjaXR5XCIsIFwiaGVhZGVyNFwiLCBcIk5ZQ1wiLCBcIkxBXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGpvaW5IZWFkZXJSb3dzKHRhYmxlLCB7XG4gICAgICBkaWFsZWN0OiB7IGhlYWRlclJvd3M6IFsyLCAzLCA0XSB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBjb2xsZWN0ZWQgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5jb2x1bW5zKS50b0VxdWFsKFtcbiAgICAgIFwiY29sMSBwZXJzb24gdXNlclwiLFxuICAgICAgXCJjb2wyIHBlcnNvbiB1c2VyXCIsXG4gICAgICBcImNvbDMgbG9jYXRpb24gYWRkcmVzc1wiLFxuICAgIF0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5oZWlnaHQpLnRvQmUoNClcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygwKSkudG9FcXVhbChbXCJmaXJzdFwiLCBcImxhc3RcIiwgXCJjaXR5XCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDEpKS50b0VxdWFsKFtcImhlYWRlcjRcIiwgXCJoZWFkZXI0XCIsIFwiaGVhZGVyNFwiXSlcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygyKSkudG9FcXVhbChbXCJBbGljZVwiLCBcIlNtaXRoXCIsIFwiTllDXCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDMpKS50b0VxdWFsKFtcIkJvYlwiLCBcIkpvbmVzXCIsIFwiTEFcIl0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIGVtcHR5IHN0cmluZ3MgaW4gaGVhZGVyIHJvd3NcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBjb2wxOiBbXCJwZXJzb25cIiwgXCJcIiwgXCJoZWFkZXIzXCIsIFwiQWxpY2VcIiwgXCJCb2JcIl0sXG4gICAgICAgIGNvbDI6IFtcIlwiLCBcIm5hbWVcIiwgXCJoZWFkZXIzXCIsIFwiU21pdGhcIiwgXCJKb25lc1wiXSxcbiAgICAgICAgY29sMzogW1wibG9jYXRpb25cIiwgXCJjaXR5XCIsIFwiaGVhZGVyM1wiLCBcIk5ZQ1wiLCBcIkxBXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGpvaW5IZWFkZXJSb3dzKHRhYmxlLCB7XG4gICAgICBkaWFsZWN0OiB7IGhlYWRlclJvd3M6IFsyLCAzXSB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBjb2xsZWN0ZWQgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5jb2x1bW5zKS50b0VxdWFsKFtcImNvbDEgcGVyc29uXCIsIFwiY29sMiBcIiwgXCJjb2wzIGxvY2F0aW9uXCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQuaGVpZ2h0KS50b0JlKDQpXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMCkpLnRvRXF1YWwoW1wiXCIsIFwibmFtZVwiLCBcImNpdHlcIl0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMSkpLnRvRXF1YWwoW1wiaGVhZGVyM1wiLCBcImhlYWRlcjNcIiwgXCJoZWFkZXIzXCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDIpKS50b0VxdWFsKFtcIkFsaWNlXCIsIFwiU21pdGhcIiwgXCJOWUNcIl0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMykpLnRvRXF1YWwoW1wiQm9iXCIsIFwiSm9uZXNcIiwgXCJMQVwiXSlcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKFwic2tpcENvbW1lbnRSb3dzXCIsICgpID0+IHtcbiAgaXQoXCJzaG91bGQgc2tpcCBjb21tZW50IHJvd3MgYnkgcm93IG51bWJlclwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIG5hbWU6IFtcIkFsaWNlXCIsIFwiIyBDb21tZW50XCIsIFwiQm9iXCIsIFwiQ2hhcmxpZVwiXSxcbiAgICAgICAgYWdlOiBbMzAsIDAsIDI1LCAzNV0sXG4gICAgICAgIGNpdHk6IFtcIk5ZQ1wiLCBcImlnbm9yZWRcIiwgXCJMQVwiLCBcIlNGXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHJlc3VsdCA9IHNraXBDb21tZW50Um93cyh0YWJsZSwge1xuICAgICAgZGlhbGVjdDogeyBjb21tZW50Um93czogWzJdLCBoZWFkZXI6IGZhbHNlIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbGxlY3RlZCA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcbiAgICBleHBlY3QoY29sbGVjdGVkLmhlaWdodCkudG9CZSgzKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDApKS50b0VxdWFsKFtcIkFsaWNlXCIsIDMwLCBcIk5ZQ1wiXSlcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygxKSkudG9FcXVhbChbXCJCb2JcIiwgMjUsIFwiTEFcIl0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMikpLnRvRXF1YWwoW1wiQ2hhcmxpZVwiLCAzNSwgXCJTRlwiXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBza2lwIG11bHRpcGxlIGNvbW1lbnQgcm93c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIG5hbWU6IFtcIkFsaWNlXCIsIFwiIyBDb21tZW50IDFcIiwgXCJCb2JcIiwgXCIjIENvbW1lbnQgMlwiLCBcIkNoYXJsaWVcIl0sXG4gICAgICAgIGFnZTogWzMwLCAwLCAyNSwgMCwgMzVdLFxuICAgICAgICBjaXR5OiBbXCJOWUNcIiwgXCJpZ25vcmVkXCIsIFwiTEFcIiwgXCJpZ25vcmVkXCIsIFwiU0ZcIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gc2tpcENvbW1lbnRSb3dzKHRhYmxlLCB7XG4gICAgICBkaWFsZWN0OiB7IGNvbW1lbnRSb3dzOiBbMiwgNF0sIGhlYWRlcjogZmFsc2UgfSxcbiAgICB9KVxuXG4gICAgY29uc3QgY29sbGVjdGVkID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQuaGVpZ2h0KS50b0JlKDMpXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMCkpLnRvRXF1YWwoW1wiQWxpY2VcIiwgMzAsIFwiTllDXCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDEpKS50b0VxdWFsKFtcIkJvYlwiLCAyNSwgXCJMQVwiXSlcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygyKSkudG9FcXVhbChbXCJDaGFybGllXCIsIDM1LCBcIlNGXCJdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHJldHVybiB0YWJsZSB1bmNoYW5nZWQgd2hlbiBubyBjb21tZW50Um93cyBzcGVjaWZpZWRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBuYW1lOiBbXCJBbGljZVwiLCBcIkJvYlwiLCBcIkNoYXJsaWVcIl0sXG4gICAgICAgIGFnZTogWzMwLCAyNSwgMzVdLFxuICAgICAgICBjaXR5OiBbXCJOWUNcIiwgXCJMQVwiLCBcIlNGXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHJlc3VsdCA9IHNraXBDb21tZW50Um93cyh0YWJsZSwge1xuICAgICAgZGlhbGVjdDoge30sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbGxlY3RlZCA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcbiAgICBleHBlY3QoY29sbGVjdGVkLmhlaWdodCkudG9CZSgzKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQuY29sdW1ucykudG9FcXVhbChbXCJuYW1lXCIsIFwiYWdlXCIsIFwiY2l0eVwiXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBza2lwIHJvd3MgYWZ0ZXIgaGVhZGVyIHdoZW4gaGVhZGVyUm93cyBzcGVjaWZpZWRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBjb2wxOiBbXCJuYW1lXCIsIFwiQWxpY2VcIiwgXCIjIENvbW1lbnRcIiwgXCJCb2JcIl0sXG4gICAgICAgIGNvbDI6IFtcImFnZVwiLCBcIjMwXCIsIFwiLTFcIiwgXCIyNVwiXSxcbiAgICAgICAgY29sMzogW1wiY2l0eVwiLCBcIk5ZQ1wiLCBcImlnbm9yZWRcIiwgXCJMQVwiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCByZXN1bHQgPSBza2lwQ29tbWVudFJvd3ModGFibGUsIHtcbiAgICAgIGRpYWxlY3Q6IHsgaGVhZGVyUm93czogWzJdLCBjb21tZW50Um93czogWzVdIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbGxlY3RlZCA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcbiAgICBleHBlY3QoY29sbGVjdGVkLmhlaWdodCkudG9CZSgzKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDApKS50b0VxdWFsKFtcIm5hbWVcIiwgXCJhZ2VcIiwgXCJjaXR5XCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDEpKS50b0VxdWFsKFtcIkFsaWNlXCIsIFwiMzBcIiwgXCJOWUNcIl0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMikpLnRvRXF1YWwoW1wiQm9iXCIsIFwiMjVcIiwgXCJMQVwiXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgY29tbWVudFJvd3MgYXQgdGhlIGJlZ2lubmluZ1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIG5hbWU6IFtcIiMgU2tpcCB0aGlzXCIsIFwiQWxpY2VcIiwgXCJCb2JcIl0sXG4gICAgICAgIGFnZTogWzAsIDMwLCAyNV0sXG4gICAgICAgIGNpdHk6IFtcImlnbm9yZWRcIiwgXCJOWUNcIiwgXCJMQVwiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCByZXN1bHQgPSBza2lwQ29tbWVudFJvd3ModGFibGUsIHtcbiAgICAgIGRpYWxlY3Q6IHsgY29tbWVudFJvd3M6IFsxXSwgaGVhZGVyOiBmYWxzZSB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBjb2xsZWN0ZWQgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5oZWlnaHQpLnRvQmUoMilcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygwKSkudG9FcXVhbChbXCJBbGljZVwiLCAzMCwgXCJOWUNcIl0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMSkpLnRvRXF1YWwoW1wiQm9iXCIsIDI1LCBcIkxBXCJdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBjb21tZW50Um93cyBhdCB0aGUgZW5kXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgbmFtZTogW1wiQWxpY2VcIiwgXCJCb2JcIiwgXCIjIEZvb3RlciBjb21tZW50XCJdLFxuICAgICAgICBhZ2U6IFszMCwgMjUsIDBdLFxuICAgICAgICBjaXR5OiBbXCJOWUNcIiwgXCJMQVwiLCBcImlnbm9yZWRcIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gc2tpcENvbW1lbnRSb3dzKHRhYmxlLCB7XG4gICAgICBkaWFsZWN0OiB7IGNvbW1lbnRSb3dzOiBbM10sIGhlYWRlcjogZmFsc2UgfSxcbiAgICB9KVxuXG4gICAgY29uc3QgY29sbGVjdGVkID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQuaGVpZ2h0KS50b0JlKDIpXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMCkpLnRvRXF1YWwoW1wiQWxpY2VcIiwgMzAsIFwiTllDXCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDEpKS50b0VxdWFsKFtcIkJvYlwiLCAyNSwgXCJMQVwiXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgbXVsdGlwbGUgaGVhZGVyIHJvd3Mgd2l0aCBjb21tZW50Um93c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGNvbDE6IFtcInBlcnNvblwiLCBcImZpcnN0XCIsIFwiQWxpY2VcIiwgXCIjIENvbW1lbnRcIiwgXCJCb2JcIl0sXG4gICAgICAgIGNvbDI6IFtcInBlcnNvblwiLCBcImxhc3RcIiwgXCJTbWl0aFwiLCBcImlnbm9yZWRcIiwgXCJKb25lc1wiXSxcbiAgICAgICAgY29sMzogW1wibG9jYXRpb25cIiwgXCJjaXR5XCIsIFwiTllDXCIsIFwiaWdub3JlZFwiLCBcIkxBXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHJlc3VsdCA9IHNraXBDb21tZW50Um93cyh0YWJsZSwge1xuICAgICAgZGlhbGVjdDogeyBoZWFkZXJSb3dzOiBbMiwgM10sIGNvbW1lbnRSb3dzOiBbN10gfSxcbiAgICB9KVxuXG4gICAgY29uc3QgY29sbGVjdGVkID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQuaGVpZ2h0KS50b0JlKDQpXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMCkpLnRvRXF1YWwoW1wicGVyc29uXCIsIFwicGVyc29uXCIsIFwibG9jYXRpb25cIl0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMSkpLnRvRXF1YWwoW1wiZmlyc3RcIiwgXCJsYXN0XCIsIFwiY2l0eVwiXSlcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygyKSkudG9FcXVhbChbXCJBbGljZVwiLCBcIlNtaXRoXCIsIFwiTllDXCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDMpKS50b0VxdWFsKFtcIkJvYlwiLCBcIkpvbmVzXCIsIFwiTEFcIl0pXG4gIH0pXG59KVxuXG5kZXNjcmliZShcInN0cmlwSW5pdGlhbFNwYWNlXCIsICgpID0+IHtcbiAgaXQoXCJzaG91bGQgc3RyaXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzIGZyb20gYWxsIGNvbHVtbnNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBuYW1lOiBbXCIgQWxpY2UgXCIsIFwiIEJvYlwiLCBcIkNoYXJsaWUgXCJdLFxuICAgICAgICBhZ2U6IFtcIjMwXCIsIFwiIDI1IFwiLCBcIjM1XCJdLFxuICAgICAgICBjaXR5OiBbXCIgTllDXCIsIFwiTEEgXCIsIFwiIFNGIFwiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCByZXN1bHQgPSBzdHJpcEluaXRpYWxTcGFjZSh0YWJsZSwge1xuICAgICAgZGlhbGVjdDogeyBza2lwSW5pdGlhbFNwYWNlOiB0cnVlIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbGxlY3RlZCA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygwKSkudG9FcXVhbChbXCJBbGljZVwiLCBcIjMwXCIsIFwiTllDXCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDEpKS50b0VxdWFsKFtcIkJvYlwiLCBcIjI1XCIsIFwiTEFcIl0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMikpLnRvRXF1YWwoW1wiQ2hhcmxpZVwiLCBcIjM1XCIsIFwiU0ZcIl0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgcmV0dXJuIHRhYmxlIHVuY2hhbmdlZCB3aGVuIHNraXBJbml0aWFsU3BhY2UgaXMgZmFsc2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBuYW1lOiBbXCIgQWxpY2UgXCIsIFwiIEJvYlwiXSxcbiAgICAgICAgYWdlOiBbXCIzMFwiLCBcIiAyNSBcIl0sXG4gICAgICAgIGNpdHk6IFtcIiBOWUNcIiwgXCJMQSBcIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gc3RyaXBJbml0aWFsU3BhY2UodGFibGUsIHtcbiAgICAgIGRpYWxlY3Q6IHsgc2tpcEluaXRpYWxTcGFjZTogZmFsc2UgfSxcbiAgICB9KVxuXG4gICAgY29uc3QgY29sbGVjdGVkID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDApKS50b0VxdWFsKFtcIiBBbGljZSBcIiwgXCIzMFwiLCBcIiBOWUNcIl0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMSkpLnRvRXF1YWwoW1wiIEJvYlwiLCBcIiAyNSBcIiwgXCJMQSBcIl0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgcmV0dXJuIHRhYmxlIHVuY2hhbmdlZCB3aGVuIHNraXBJbml0aWFsU3BhY2UgaXMgbm90IHNwZWNpZmllZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIG5hbWU6IFtcIiBBbGljZSBcIiwgXCIgQm9iXCJdLFxuICAgICAgICBhZ2U6IFtcIjMwXCIsIFwiIDI1IFwiXSxcbiAgICAgICAgY2l0eTogW1wiIE5ZQ1wiLCBcIkxBIFwiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCByZXN1bHQgPSBzdHJpcEluaXRpYWxTcGFjZSh0YWJsZSwge1xuICAgICAgZGlhbGVjdDoge30sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbGxlY3RlZCA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygwKSkudG9FcXVhbChbXCIgQWxpY2UgXCIsIFwiMzBcIiwgXCIgTllDXCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDEpKS50b0VxdWFsKFtcIiBCb2JcIiwgXCIgMjUgXCIsIFwiTEEgXCJdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBzdHJpbmdzIHdpdGggbm8gc3BhY2VzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgbmFtZTogW1wiQWxpY2VcIiwgXCJCb2JcIl0sXG4gICAgICAgIGFnZTogW1wiMzBcIiwgXCIyNVwiXSxcbiAgICAgICAgY2l0eTogW1wiTllDXCIsIFwiTEFcIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gc3RyaXBJbml0aWFsU3BhY2UodGFibGUsIHtcbiAgICAgIGRpYWxlY3Q6IHsgc2tpcEluaXRpYWxTcGFjZTogdHJ1ZSB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBjb2xsZWN0ZWQgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMCkpLnRvRXF1YWwoW1wiQWxpY2VcIiwgXCIzMFwiLCBcIk5ZQ1wiXSlcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygxKSkudG9FcXVhbChbXCJCb2JcIiwgXCIyNVwiLCBcIkxBXCJdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBlbXB0eSBzdHJpbmdzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgbmFtZTogW1wiQWxpY2VcIiwgXCJcIl0sXG4gICAgICAgIGFnZTogW1wiMzBcIiwgXCIgXCJdLFxuICAgICAgICBjaXR5OiBbXCJcIiwgXCJMQVwiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCByZXN1bHQgPSBzdHJpcEluaXRpYWxTcGFjZSh0YWJsZSwge1xuICAgICAgZGlhbGVjdDogeyBza2lwSW5pdGlhbFNwYWNlOiB0cnVlIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbGxlY3RlZCA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygwKSkudG9FcXVhbChbXCJBbGljZVwiLCBcIjMwXCIsIFwiXCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDEpKS50b0VxdWFsKFtcIlwiLCBcIlwiLCBcIkxBXCJdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBzdHJpbmdzIHdpdGggbXVsdGlwbGUgc3BhY2VzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgbmFtZTogW1wiICBBbGljZSAgXCIsIFwiICAgQm9iXCJdLFxuICAgICAgICBhZ2U6IFtcIjMwICAgXCIsIFwiICAyNSAgXCJdLFxuICAgICAgICBjaXR5OiBbXCIgIE5ZQyAgXCIsIFwiICAgTEEgICBcIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gc3RyaXBJbml0aWFsU3BhY2UodGFibGUsIHtcbiAgICAgIGRpYWxlY3Q6IHsgc2tpcEluaXRpYWxTcGFjZTogdHJ1ZSB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBjb2xsZWN0ZWQgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMCkpLnRvRXF1YWwoW1wiQWxpY2VcIiwgXCIzMFwiLCBcIk5ZQ1wiXSlcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygxKSkudG9FcXVhbChbXCJCb2JcIiwgXCIyNVwiLCBcIkxBXCJdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSB0YWJzIGFuZCBvdGhlciB3aGl0ZXNwYWNlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgbmFtZTogW1wiXFx0QWxpY2VcXHRcIiwgXCJcXG5Cb2JcIl0sXG4gICAgICAgIGFnZTogW1wiMzBcXG5cIiwgXCJcXHQyNVxcdFwiXSxcbiAgICAgICAgY2l0eTogW1wiXFx0TllDXCIsIFwiTEFcXG5cIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gc3RyaXBJbml0aWFsU3BhY2UodGFibGUsIHtcbiAgICAgIGRpYWxlY3Q6IHsgc2tpcEluaXRpYWxTcGFjZTogdHJ1ZSB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBjb2xsZWN0ZWQgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMCkpLnRvRXF1YWwoW1wiQWxpY2VcIiwgXCIzMFwiLCBcIk5ZQ1wiXSlcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygxKSkudG9FcXVhbChbXCJCb2JcIiwgXCIyNVwiLCBcIkxBXCJdKVxuICB9KVxufSlcbiJdfQ==
@@ -0,0 +1,9 @@
1
+ export { normalizeTable } from "./normalize.ts";
2
+ export { denormalizeTable } from "./denormalize.ts";
3
+ export { inspectTable } from "./inspect.ts";
4
+ export type { Frame } from "./Frame.ts";
5
+ export type { Table } from "./Table.ts";
6
+ export { skipCommentRows } from "./helpers.ts";
7
+ export { joinHeaderRows } from "./helpers.ts";
8
+ export { stripInitialSpace } from "./helpers.ts";
9
+ export { queryTable } from "./query.ts";
@@ -0,0 +1,8 @@
1
+ export { normalizeTable } from "./normalize.js";
2
+ export { denormalizeTable } from "./denormalize.js";
3
+ export { inspectTable } from "./inspect.js";
4
+ export { skipCommentRows } from "./helpers.js";
5
+ export { joinHeaderRows } from "./helpers.js";
6
+ export { stripInitialSpace } from "./helpers.js";
7
+ export { queryTable } from "./query.js";
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90YWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUczQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQzlDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDN0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBub3JtYWxpemVUYWJsZSB9IGZyb20gXCIuL25vcm1hbGl6ZS50c1wiXG5leHBvcnQgeyBkZW5vcm1hbGl6ZVRhYmxlIH0gZnJvbSBcIi4vZGVub3JtYWxpemUudHNcIlxuZXhwb3J0IHsgaW5zcGVjdFRhYmxlIH0gZnJvbSBcIi4vaW5zcGVjdC50c1wiXG5leHBvcnQgdHlwZSB7IEZyYW1lIH0gZnJvbSBcIi4vRnJhbWUudHNcIlxuZXhwb3J0IHR5cGUgeyBUYWJsZSB9IGZyb20gXCIuL1RhYmxlLnRzXCJcbmV4cG9ydCB7IHNraXBDb21tZW50Um93cyB9IGZyb20gXCIuL2hlbHBlcnMudHNcIlxuZXhwb3J0IHsgam9pbkhlYWRlclJvd3MgfSBmcm9tIFwiLi9oZWxwZXJzLnRzXCJcbmV4cG9ydCB7IHN0cmlwSW5pdGlhbFNwYWNlIH0gZnJvbSBcIi4vaGVscGVycy50c1wiXG5leHBvcnQgeyBxdWVyeVRhYmxlIH0gZnJvbSBcIi4vcXVlcnkudHNcIlxuIl19
@@ -0,0 +1,8 @@
1
+ import type { Schema } from "@frictionless-ts/metadata";
2
+ import type { TableError } from "@frictionless-ts/metadata";
3
+ import type { Table } from "./Table.ts";
4
+ export declare function inspectTable(table: Table, options?: {
5
+ schema?: Schema;
6
+ sampleRows?: number;
7
+ maxErrors?: number;
8
+ }): Promise<TableError[]>;