{"version":3,"file":"main.mjs","names":["mapError","flatMap","max","Stdlib_Int.fromString","Primitive_int.div","Primitive_int.max","parse","TemplateParser.parseErrorToMessage","Primitive_option.some","message","Primitive_option.valFromOption","Stdlib_JsExn.fromException","Stdlib_Option.getOr","Stdlib_JsExn.message","Primitive_option.valFromOption","querySelector","querySelectorAll","getAttribute","Primitive_exceptions.internalToException","ExnUtils.message","Primitive_option.some","NodeUtil.jsonParse","ImportMetaBinding.candidatePackagePaths","Stdlib_Option.isNone","Stdlib_Option.getOr","parse","Stdlib_JsExn.message","Primitive_exceptions.internalToException","Stdlib_JsExn.fromException","Stdlib_Option.getOr","Primitive_option.valFromOption","JsonUtils.dictGet","JsonUtils.dictGet","Primitive_option.valFromOption","OptionFields.parseText","Stdlib_Option.getOr","OptionsParser.parseTextOptions","OptionsParser.parseHtmlOptions","OptionsParser.parseNumberOptions","OptionsParser.parseBooleanOptions","OptionsParser.parseCountOptions","OptionsParser.parseUrlOptions","OptionsParser.parseJsonOptions","OptionsParser.parseDateOptions","OptionsParser.parseListOptions","OptionsParser.parseTableOptions","OptionsParser.parseAttributeConfig","JsonUtils.dictGet","Primitive_option.valFromOption","Stdlib_Option.getOr","JsonUtils.dictGet","OptionsParser.parseErrorPolicy","Primitive_option.valFromOption","OptionsParser.parseBooleanUnknownPolicy","OptionFields.parseText","Stdlib_Option.getOr","Stdlib_Option.flatMap","Primitive_option.some","JsonUtils.dictGet","FieldParser.parseField","Primitive_option.valFromOption","ObjectBinding.toFieldsObject","ConfigParser.parseConfig","Primitive_option.some","Primitive_option.valFromOption","FieldTypeVisitor.visitFieldType","Primitive_option.fromNullable","NodeHtmlParserBinding.getAttribute","extract","Stdlib_Option.getOr","Stdlib_Option.isSome","Primitive_object.equal","RegexBinding.compileSafePattern","Primitive_option.valFromOption","extract","Primitive_object.equal","StringUtils.trimStr","Primitive_option.fromNullable","NodeHtmlParserBinding.getAttribute","extract","NodeUtil.jsonParse","extract","Primitive_object.equal","StringUtils.normalizeWhitespace","Primitive_object.notequal","StringUtils.trimStr","StringUtils.extractPattern","StringUtils.toLower","StringUtils.toUpper","extract","Primitive_option.fromNullable","NodeHtmlParserBinding.getAttribute","Stdlib_Option.getOr","Stdlib_Option.flatMap","AttributeExtractor.extract","TextExtractor.extract","UrlExtractor.extract","extract","StringUtils.matchesPattern","extract","StringUtils.extractPattern","StringUtils.stripNonNumeric","Primitive_object.equal","extract","StringUtils.trimStr","NumberUtils.parseWithOptions","StringUtils.toLower","NodeHtmlParserBinding.getAttribute","extract","StringUtils.trimStr","MONTHS_FULL","MONTHS_ABBR","formatDate","ParseDateMjs","Stdlib_Option.getOr","FormatDateMjs","extract","Stdlib_Option.getOr","Primitive_option.fromNullable","NodeHtmlParserBinding.getAttribute","DateUtils.parseDate","DateUtils.formatDate","Primitive_option.valFromOption","NodeHtmlParserBinding.querySelectorAll","NodeHtmlParserBinding.querySelector","FieldTypeVisitor.visitColumnFieldType","DefaultsMerger.resolveDefaults","extract","TableUtils.resolveRows","NodeHtmlParserBinding.querySelectorAll","NodeHtmlParserBinding.querySelector","match","Stdlib_Option.getOr","ListExtractor.extract","DefaultsMerger.resolveDefaults","TextExtractor.extract","Primitive_option.valFromOption","AttributeExtractor.extract","HtmlExtractor.extract","NumberExtractor.extract","BooleanExtractor.extract","UrlExtractor.extract","JsonExtractor.extract","DateTimeExtractor.extract","TableFieldExtractor.extract","FieldTypeVisitor.visitFieldType","CountExtractor.extract","ListExtractor.extract","run","NodeHtmlParserBinding.querySelectorAll","DefaultsMerger.resolveDefaults","FieldTypes.isMultiElementType","NodeHtmlParserBinding.querySelector","match","Stdlib_Option.getOr","ExtractorRegistry.extractValueList","ExtractorRegistry.extractValueOrAbsent","canHandle","Stdlib_Option.isSome","Strategy","ExtractionStrategy.Make","DefaultsMerger.resolveDefaults","NodeHtmlParserBinding.querySelectorAll","FieldTypes.isMultiElementType","ExtractorRegistry.extractValueList","ExtractorRegistry.extractValue","ExtractionStrategy.Make","applySchema","NodeUtil.jsonParse","SchemaParser.parseSchema","loadSchema","Primitive_exceptions.internalToException","Stdlib_JsExn.fromException","Stdlib_Option.getOr","Stdlib_JsExn.message","Primitive_option.valFromOption","applySchema","SchemaExecutor.applySchema","loadSchema","SchemaV2.loadSchema","SchemaV2.applySchema","make","delay","Primitive_float.max","Primitive_exceptions.internalToException","Primitive_int.max","NodeUndiciBinding.createEnvProxyDispatcher","Primitive_option.some","Primitive_option.valFromOption","Primitive_exceptions.internalToException","Stdlib_JsExn.fromException","Stdlib_Option.getOr","Stdlib_JsExn.message","Primitive_int.min","Semaphore.make","StartLimiter.make","Semaphore.acquire","StartLimiter.acquireStartSlot","Stdlib_Promise.$$catch","ExnUtils.message","Stdlib_Option.getOr","Stdlib_Int.fromString","Stdlib_Option.isSome","Belt_Array.reduce","Stdlib_Result.map","ResultX.flatMap","NodeHtmlParserBinding.querySelector","TableUtils.resolveHeaders","TableUtils.resolveRows","NodeHtmlParserBinding.querySelectorAll","Primitive_option.fromNullable","NodeHtmlParserBinding.querySelector","NodeHtmlParserBinding.getAttribute","NodeHtmlParserBinding.parse","NodeHtmlParserBinding.querySelectorAll","AppError.toMessage","Cli.parse","ParseCli.runArgsValidation","StdIn.readFromStdin","Cli.getCliVersion","NodeHtmlDocument.operations","TableExtractor.extract","TemplateParser.parse","Schema.loadSchema","Schema.applySchema","Fetcher.fetchAll","NodeProcess.setExitCode","NodeUtil.jsonParse","ExnUtils.message","Primitive_exceptions.internalToException","AppError.toMessage","ResultX.mapError","AppError.mapSchemaError","AppContext.exitWithError","OutputWriter.writeOutput","ExnUtils.message","Primitive_exceptions.internalToException","recordSuccess","recordFailure","setDuration","printReport","Stdlib_List.reverse","Reporter.empty","Reporter.recordSuccess","Reporter.recordFailure","Reporter.setDuration","Stdlib_Option.getOr","Document.getAttribute","Document.outerHTML","Document.innerHTML","Document.textContent","Document.querySelectorAll","Document.querySelector","OutputWriter.writeOutput","AppContext.exitWithError","AppError.toMessage","AppError.mapSchemaError","Stdlib_Result.map","Stdlib_Result.mapError","SelectorExtractor.extractElements","UrlOutputWriter.writeStdoutNdjson","UrlOutputWriter.beginJsonArraySync","UrlOutputWriter.appendJsonRowAsync","UrlOutputWriter.appendNdjsonToFile","ExtractionMode.fromOptions","SchemaRunner.loadSchema","Document.parseDocumentSafely","FetchStatsManager.recordFailure","ResultX.mapError","AppError.mapTemplateError","Stdlib_Option.getOr","FetchStatsManager.create","Belt_Array.get","UrlOutputWriter.endJsonArraySync","FetchStatsManager.shouldExitWithError","OutputWriter.writeOutput","AppContext.exitWithError","ResultX.mapError","AppError.mapParseError","Primitive_exceptions.internalToException","ExnUtils.message","AppContext.exitWithError","UrlRunner.runUrlMode","AppError.mapStdInError","Document.parseDocumentSafely","ExtractionMode.fromOptions","TableRunner.runTableMode","SchemaRunner.runSchemaMode","SelectorExtractor.runSelectorMode","AppContext.production","ImportMetaBinding.isExecutedAsScript","NodeProcess.setExitCode"],"sources":["../src/core/ResultX.res.mjs","../node_modules/.pnpm/@rescript+runtime@12.3.0/node_modules/@rescript/runtime/lib/es6/Primitive_int.js","../node_modules/.pnpm/@rescript+runtime@12.3.0/node_modules/@rescript/runtime/lib/es6/Primitive_option.js","../node_modules/.pnpm/@rescript+runtime@12.3.0/node_modules/@rescript/runtime/lib/es6/Stdlib_Int.js","../src/url/TemplateParser.res.mjs","../src/core/AppError.res.mjs","../node_modules/.pnpm/@rescript+runtime@12.3.0/node_modules/@rescript/runtime/lib/es6/Stdlib_JsExn.js","../node_modules/.pnpm/@rescript+runtime@12.3.0/node_modules/@rescript/runtime/lib/es6/Stdlib_Option.js","../src/core/ExnUtils.res.mjs","../node_modules/.pnpm/@rescript+runtime@12.3.0/node_modules/@rescript/runtime/lib/es6/Primitive_exceptions.js","../src/core/Document.res.mjs","../node_modules/.pnpm/@rescript+runtime@12.3.0/node_modules/@rescript/runtime/lib/es6/Belt_Array.js","../src/bindings/NodeUtil.res.mjs","../src/bindings/ImportMetaBinding.res.mjs","../src/cli/Cli.res.mjs","../src/stdio/StdIn.res.mjs","../src/schema/v2/utils/JsonUtils.res.mjs","../src/schema/v2/parser/OptionFields.res.mjs","../src/schema/v2/parser/OptionsParser.res.mjs","../src/schema/v2/parser/FieldParser.res.mjs","../src/schema/v2/parser/ConfigParser.res.mjs","../src/bindings/ObjectBinding.res.mjs","../src/schema/v2/parser/SchemaParser.res.mjs","../src/schema/v2/types/FieldTypes.res.mjs","../src/schema/v2/FieldTypeVisitor.res.mjs","../src/schema/v2/extractors/DefaultsMerger.res.mjs","../node_modules/.pnpm/@rescript+runtime@12.3.0/node_modules/@rescript/runtime/lib/es6/Primitive_float.js","../node_modules/.pnpm/@rescript+runtime@12.3.0/node_modules/@rescript/runtime/lib/es6/Primitive_object.js","../src/bindings/NodeHtmlParserBinding.res.mjs","../src/schema/v2/extractors/UrlExtractor.res.mjs","../src/bindings/RegexBinding.res.mjs","../src/schema/v2/utils/StringUtils.res.mjs","../src/schema/v2/extractors/HtmlExtractor.res.mjs","../src/schema/v2/extractors/JsonExtractor.res.mjs","../src/schema/v2/extractors/TextExtractor.res.mjs","../src/schema/v2/extractors/AttributeExtractor.res.mjs","../src/schema/v2/extractors/ListExtractor.res.mjs","../src/schema/v2/extractors/CountExtractor.res.mjs","../src/schema/v2/utils/NumberUtils.res.mjs","../src/schema/v2/extractors/NumberExtractor.res.mjs","../src/schema/v2/extractors/BooleanExtractor.res.mjs","../src/schema/v2/utils/date/parseDate.mjs","../src/schema/v2/utils/date/formatDate.mjs","../src/schema/v2/utils/DateUtils.res.mjs","../src/schema/v2/extractors/DateTimeExtractor.res.mjs","../src/table/TableUtils.res.mjs","../src/schema/v2/extractors/TableFieldExtractor.res.mjs","../src/schema/v2/extractors/ExtractorRegistry.res.mjs","../src/schema/v2/executor/ExtractionStrategy.res.mjs","../src/schema/v2/executor/RowExtractor.res.mjs","../src/schema/v2/executor/ZipExtractor.res.mjs","../src/schema/v2/executor/SchemaExecutor.res.mjs","../src/schema/v2/SchemaV2.res.mjs","../src/schema/Schema.res.mjs","../src/core/Semaphore.res.mjs","../src/core/StartLimiter.res.mjs","../node_modules/.pnpm/@rescript+runtime@12.3.0/node_modules/@rescript/runtime/lib/es6/Stdlib_Promise.js","../src/bindings/NodeUndiciBinding.res.mjs","../src/url/Fetcher.res.mjs","../node_modules/.pnpm/@rescript+runtime@12.3.0/node_modules/@rescript/runtime/lib/es6/Stdlib_Result.js","../src/cli/ParseCli.res.mjs","../src/bindings/NodeProcess.res.mjs","../src/table/TableExtractor.res.mjs","../src/core/NodeHtmlDocument.res.mjs","../src/core/AppContext.res.mjs","../src/core/OutputWriter.res.mjs","../src/schema/SchemaRunner.res.mjs","../src/extraction/ExtractionMode.res.mjs","../src/url/UrlOutputWriter.res.mjs","../node_modules/.pnpm/@rescript+runtime@12.3.0/node_modules/@rescript/runtime/lib/es6/Stdlib_List.js","../src/url/Reporter.res.mjs","../src/url/FetchStatsManager.res.mjs","../src/extraction/SelectorExtractor.res.mjs","../src/url/UrlRunner.res.mjs","../src/table/TableRunner.res.mjs","../src/Main.res.mjs"],"sourcesContent":["// Generated by ReScript, PLEASE EDIT WITH CARE\n\n\nfunction mapError(value, mapFn) {\n  if (value.TAG === \"Ok\") {\n    return {\n      TAG: \"Ok\",\n      _0: value._0\n    };\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: mapFn(value._0)\n    };\n  }\n}\n\nfunction flatMap(value, mapFn) {\n  if (value.TAG === \"Ok\") {\n    return mapFn(value._0);\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: value._0\n    };\n  }\n}\n\nfunction flatten(value) {\n  if (value.TAG === \"Ok\") {\n    return value._0;\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: value._0\n    };\n  }\n}\n\nfunction bimap(value, okMap, errMap) {\n  if (value.TAG === \"Ok\") {\n    return {\n      TAG: \"Ok\",\n      _0: okMap(value._0)\n    };\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: errMap(value._0)\n    };\n  }\n}\n\nexport {\n  mapError,\n  flatMap,\n  flatten,\n  bimap,\n}\n/* No side effect */\n","\n\n\nfunction compare(x, y) {\n  if (x < y) {\n    return -1;\n  } else if (x === y) {\n    return 0;\n  } else {\n    return 1;\n  }\n}\n\nfunction min(x, y) {\n  if (x < y) {\n    return x;\n  } else {\n    return y;\n  }\n}\n\nfunction max(x, y) {\n  if (x > y) {\n    return x;\n  } else {\n    return y;\n  }\n}\n\nfunction div(x, y) {\n  if (y === 0) {\n    throw {\n      RE_EXN_ID: \"Division_by_zero\",\n      Error: new Error()\n    };\n  }\n  return x / y | 0;\n}\n\nfunction mod_(x, y) {\n  if (y === 0) {\n    throw {\n      RE_EXN_ID: \"Division_by_zero\",\n      Error: new Error()\n    };\n  }\n  return x % y;\n}\n\nexport {\n  compare,\n  min,\n  max,\n  div,\n  mod_,\n}\n/* No side effect */\n","\n\n\nfunction isNested(x) {\n  return x.BS_PRIVATE_NESTED_SOME_NONE !== undefined;\n}\n\nfunction some(x) {\n  if (x === undefined) {\n    return {\n      BS_PRIVATE_NESTED_SOME_NONE: 0\n    };\n  } else if (x !== null && x.BS_PRIVATE_NESTED_SOME_NONE !== undefined) {\n    return {\n      BS_PRIVATE_NESTED_SOME_NONE: x.BS_PRIVATE_NESTED_SOME_NONE + 1 | 0\n    };\n  } else {\n    return x;\n  }\n}\n\nfunction fromNullable(x) {\n  if (x == null) {\n    return;\n  } else {\n    return some(x);\n  }\n}\n\nfunction fromUndefined(x) {\n  if (x === undefined) {\n    return;\n  } else {\n    return some(x);\n  }\n}\n\nfunction fromNull(x) {\n  if (x === null) {\n    return;\n  } else {\n    return some(x);\n  }\n}\n\nfunction valFromOption(x) {\n  if (x === null || x.BS_PRIVATE_NESTED_SOME_NONE === undefined) {\n    return x;\n  }\n  let depth = x.BS_PRIVATE_NESTED_SOME_NONE;\n  if (depth === 0) {\n    return;\n  } else {\n    return {\n      BS_PRIVATE_NESTED_SOME_NONE: depth - 1 | 0\n    };\n  }\n}\n\nfunction toUndefined(x) {\n  if (x === undefined) {\n    return;\n  } else {\n    return valFromOption(x);\n  }\n}\n\nfunction unwrapPolyVar(x) {\n  if (x !== undefined) {\n    return x.VAL;\n  } else {\n    return x;\n  }\n}\n\nexport {\n  fromNullable,\n  fromUndefined,\n  fromNull,\n  valFromOption,\n  some,\n  isNested,\n  toUndefined,\n  unwrapPolyVar,\n}\n/* No side effect */\n","\n\nimport * as Stdlib_Array from \"./Stdlib_Array.js\";\n\nfunction fromString(x, radix) {\n  let maybeInt = radix !== undefined ? parseInt(x, radix) : parseInt(x);\n  if (Number.isNaN(maybeInt) || maybeInt > 2147483647 || maybeInt < -2147483648) {\n    return;\n  } else {\n    return maybeInt | 0;\n  }\n}\n\nfunction abs(x) {\n  if (x >= 0) {\n    return x;\n  } else {\n    return -x | 0;\n  }\n}\n\nfunction range(start, end, optionsOpt) {\n  let options = optionsOpt !== undefined ? optionsOpt : ({});\n  let isInverted = start > end;\n  let n = options.step;\n  let step;\n  if (n !== undefined) {\n    if (n !== 0) {\n      step = n;\n    } else {\n      if (start !== end) {\n        throw new RangeError(\"Incorrect range arguments\");\n      }\n      step = n;\n    }\n  } else {\n    step = isInverted ? -1 : 1;\n  }\n  let length;\n  if (isInverted === step >= 0) {\n    length = 0;\n  } else if (step === 0) {\n    length = options.inclusive === true ? 1 : 0;\n  } else {\n    let range$1 = isInverted ? start - end | 0 : end - start | 0;\n    let range$2 = options.inclusive === true ? range$1 + 1 | 0 : range$1;\n    length = Math.ceil(range$2 / abs(step)) | 0;\n  }\n  return Stdlib_Array.fromInitializer(length, i => start + (i * step | 0) | 0);\n}\n\nfunction rangeWithOptions(start, end, options) {\n  return range(start, end, options);\n}\n\nfunction clamp(min, max, value) {\n  let value$1 = max !== undefined && max < value ? max : value;\n  if (min !== undefined && min > value$1) {\n    return min;\n  } else {\n    return value$1;\n  }\n}\n\nfunction lnot(x) {\n  return x ^ -1;\n}\n\nlet Bitwise = {\n  lnot: lnot\n};\n\nlet Ref = {};\n\nlet Constants = {\n  minValue: -2147483648,\n  maxValue: 2147483647\n};\n\nexport {\n  Constants,\n  fromString,\n  range,\n  rangeWithOptions,\n  clamp,\n  Bitwise,\n  Ref,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as Stdlib_Int from \"@rescript/runtime/lib/es6/Stdlib_Int.js\";\nimport * as Primitive_int from \"@rescript/runtime/lib/es6/Primitive_int.js\";\n\nfunction extractTemplate(url) {\n  let openIndex = url.indexOf(\"{\");\n  let closeIndex = url.indexOf(\"}\");\n  if (openIndex === -1 || closeIndex === -1) {\n    return;\n  }\n  if (closeIndex < openIndex) {\n    return;\n  }\n  let afterClose = url.slice(closeIndex + 1 | 0, url.length);\n  if (afterClose.includes(\"{\") || afterClose.includes(\"}\")) {\n    return;\n  }\n  let prefix = url.slice(0, openIndex);\n  let content = url.slice(openIndex + 1 | 0, closeIndex);\n  let suffix = url.slice(closeIndex + 1 | 0, url.length);\n  return [\n    prefix,\n    content,\n    suffix\n  ];\n}\n\nfunction parseRange(content) {\n  let parts = content.split(\"..\");\n  let len = parts.length;\n  if (len !== 2) {\n    if (len !== 3) {\n      return {\n        TAG: \"Error\",\n        _0: {\n          TAG: \"InvalidSyntax\",\n          _0: `Invalid range syntax: \"` + content + `\"`\n        }\n      };\n    }\n    let startStr = parts[0];\n    let endStr = parts[1];\n    let stepStr = parts[2];\n    let startOpt = Stdlib_Int.fromString(startStr, undefined);\n    let endOpt = Stdlib_Int.fromString(endStr, undefined);\n    let stepOpt = Stdlib_Int.fromString(stepStr, undefined);\n    if (startOpt !== undefined && endOpt !== undefined && stepOpt !== undefined) {\n      if (startOpt <= endOpt && stepOpt > 0) {\n        let zeroPad = startStr.startsWith(\"0\") && startStr.length > 1 ? startStr.length : 0;\n        return {\n          TAG: \"Ok\",\n          _0: [\n            startOpt,\n            endOpt,\n            stepOpt,\n            zeroPad\n          ]\n        };\n      }\n      if (stepOpt <= 0) {\n        return {\n          TAG: \"Error\",\n          _0: {\n            TAG: \"InvalidRange\",\n            _0: `Step must be > 0, got ` + stepOpt.toString()\n          }\n        };\n      }\n      if (startOpt > endOpt) {\n        return {\n          TAG: \"Error\",\n          _0: {\n            TAG: \"InvalidRange\",\n            _0: `Range start (` + startOpt.toString() + `) must be <= end (` + endOpt.toString() + `)`\n          }\n        };\n      }\n    }\n    return {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"InvalidSyntax\",\n        _0: `Invalid range syntax: \"` + content + `\"`\n      }\n    };\n  }\n  let startStr$1 = parts[0];\n  let endStr$1 = parts[1];\n  let startOpt$1 = Stdlib_Int.fromString(startStr$1, undefined);\n  let endOpt$1 = Stdlib_Int.fromString(endStr$1, undefined);\n  if (startOpt$1 !== undefined && endOpt$1 !== undefined) {\n    if (startOpt$1 <= endOpt$1) {\n      let zeroPad$1 = startStr$1.startsWith(\"0\") && startStr$1.length > 1 ? startStr$1.length : 0;\n      return {\n        TAG: \"Ok\",\n        _0: [\n          startOpt$1,\n          endOpt$1,\n          1,\n          zeroPad$1\n        ]\n      };\n    }\n    if (startOpt$1 > endOpt$1) {\n      return {\n        TAG: \"Error\",\n        _0: {\n          TAG: \"InvalidRange\",\n          _0: `Range start (` + startOpt$1.toString() + `) must be <= end (` + endOpt$1.toString() + `)`\n        }\n      };\n    }\n  }\n  return {\n    TAG: \"Error\",\n    _0: {\n      TAG: \"InvalidSyntax\",\n      _0: `Invalid range syntax: \"` + content + `\"`\n    }\n  };\n}\n\nfunction generateSequence(start, end_, step) {\n  let count = Primitive_int.div(end_ - start | 0, step) + 1 | 0;\n  if (count > 100000) {\n    return {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"UrlCountExceeded\",\n        _0: count\n      }\n    };\n  }\n  let current = start;\n  let acc = [];\n  while (current <= end_) {\n    acc.push(current);\n    current = current + step | 0;\n  };\n  return {\n    TAG: \"Ok\",\n    _0: acc\n  };\n}\n\nfunction padZero(num, width) {\n  if (width <= 0) {\n    return num.toString();\n  }\n  let str = num.toString();\n  let padding = Primitive_int.max(0, width - str.length | 0);\n  return \"0\".repeat(padding) + str;\n}\n\nfunction parse(url) {\n  let match = extractTemplate(url);\n  if (match === undefined) {\n    if (url.includes(\"{\") || url.includes(\"}\")) {\n      return {\n        TAG: \"Error\",\n        _0: {\n          TAG: \"InvalidSyntax\",\n          _0: \"URL contains unmatched or multiple template braces\"\n        }\n      };\n    } else {\n      return {\n        TAG: \"Ok\",\n        _0: [url]\n      };\n    }\n  }\n  let suffix = match[2];\n  let prefix = match[0];\n  let e = parseRange(match[1]);\n  if (e.TAG !== \"Ok\") {\n    return {\n      TAG: \"Error\",\n      _0: e._0\n    };\n  }\n  let match$1 = e._0;\n  let zeroPad = match$1[3];\n  let e$1 = generateSequence(match$1[0], match$1[1], match$1[2]);\n  if (e$1.TAG !== \"Ok\") {\n    return {\n      TAG: \"Error\",\n      _0: e$1._0\n    };\n  }\n  let urls = e$1._0.map(num => {\n    let numStr = padZero(num, zeroPad);\n    return prefix + numStr + suffix;\n  });\n  return {\n    TAG: \"Ok\",\n    _0: urls\n  };\n}\n\nfunction parseErrorToMessage(err) {\n  switch (err.TAG) {\n    case \"InvalidSyntax\" :\n      return `Invalid template syntax: ` + err._0;\n    case \"InvalidRange\" :\n      return `Invalid range: ` + err._0;\n    case \"UrlCountExceeded\" :\n      return `URL template would generate ` + err._0.toString() + ` URLs, which exceeds the maximum of ` + (100000).toString() + `. Reduce the range or split into multiple templates.`;\n  }\n}\n\nexport {\n  parse,\n  parseErrorToMessage,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as TemplateParser from \"../url/TemplateParser.res.mjs\";\n\nfunction mapStdInError(err) {\n  return {\n    TAG: \"InputError\",\n    _0: err._0\n  };\n}\n\nfunction mapParseError(err) {\n  switch (err.TAG) {\n    case \"ParseError\" :\n    case \"NoMatches\" :\n      return {\n        TAG: \"CliError\",\n        _0: err.message\n      };\n    default:\n      return {\n        TAG: \"CliError\",\n        _0: err._0\n      };\n  }\n}\n\nfunction mapSchemaError(err) {\n  switch (err.TAG) {\n    case \"InvalidFieldType\" :\n      return {\n        TAG: \"SchemaError\",\n        _0: `Invalid field type \"` + err.got + `\" for field \"` + err.field + `\"`\n      };\n    case \"FileReadError\" :\n      return {\n        TAG: \"FileError\",\n        _0: err._0\n      };\n    case \"RequiredFieldMissing\" :\n      return {\n        TAG: \"ExtractionError\",\n        _0: `Required field \"` + err.fieldName + `\" not found for selector \"` + err.selector + `\"`\n      };\n    case \"ExtractionError\" :\n      return {\n        TAG: \"ExtractionError\",\n        _0: err._0\n      };\n    default:\n      return {\n        TAG: \"SchemaError\",\n        _0: err._0\n      };\n  }\n}\n\nfunction mapTemplateError(err) {\n  switch (err.TAG) {\n    case \"InvalidSyntax\" :\n    case \"InvalidRange\" :\n      return {\n        TAG: \"TemplateError\",\n        _0: err._0\n      };\n    case \"UrlCountExceeded\" :\n      return {\n        TAG: \"TemplateError\",\n        _0: TemplateParser.parseErrorToMessage(err)\n      };\n  }\n}\n\nfunction toMessage(err) {\n  return err._0;\n}\n\nexport {\n  mapStdInError,\n  mapParseError,\n  mapSchemaError,\n  mapTemplateError,\n  toMessage,\n}\n/* No side effect */\n","\n\nimport * as Primitive_option from \"./Primitive_option.js\";\n\nfunction fromException(exn) {\n  if (exn.RE_EXN_ID === \"JsExn\") {\n    return Primitive_option.some(exn._1);\n  }\n}\n\nlet getOrUndefined = (fieldName => t => (t && typeof t[fieldName] === \"string\" ? t[fieldName] : undefined));\n\nlet stack = getOrUndefined(\"stack\");\n\nlet message = getOrUndefined(\"message\");\n\nlet name = getOrUndefined(\"name\");\n\nlet fileName = getOrUndefined(\"fileName\");\n\nexport {\n  fromException,\n  stack,\n  message,\n  name,\n  fileName,\n}\n/* stack Not a pure module */\n","\n\nimport * as Stdlib_JsError from \"./Stdlib_JsError.js\";\nimport * as Primitive_option from \"./Primitive_option.js\";\n\nfunction filter(opt, p) {\n  if (opt !== undefined && p(Primitive_option.valFromOption(opt))) {\n    return opt;\n  }\n}\n\nfunction forEach(opt, f) {\n  if (opt !== undefined) {\n    return f(Primitive_option.valFromOption(opt));\n  }\n}\n\nfunction getOrThrow(x, message) {\n  if (x !== undefined) {\n    return Primitive_option.valFromOption(x);\n  } else {\n    return Stdlib_JsError.panic(message !== undefined ? message : \"Option.getOrThrow called for None value\");\n  }\n}\n\nfunction mapOr(opt, $$default, f) {\n  if (opt !== undefined) {\n    return f(Primitive_option.valFromOption(opt));\n  } else {\n    return $$default;\n  }\n}\n\nfunction map(opt, f) {\n  if (opt !== undefined) {\n    return Primitive_option.some(f(Primitive_option.valFromOption(opt)));\n  }\n}\n\nfunction flatMap(opt, f) {\n  if (opt !== undefined) {\n    return f(Primitive_option.valFromOption(opt));\n  }\n}\n\nfunction getOr(opt, $$default) {\n  if (opt !== undefined) {\n    return Primitive_option.valFromOption(opt);\n  } else {\n    return $$default;\n  }\n}\n\nfunction orElse(opt, other) {\n  if (opt !== undefined) {\n    return opt;\n  } else {\n    return other;\n  }\n}\n\nfunction isSome(x) {\n  return x !== undefined;\n}\n\nfunction isNone(x) {\n  return x === undefined;\n}\n\nfunction equal(a, b, eq) {\n  if (a !== undefined) {\n    if (b !== undefined) {\n      return eq(Primitive_option.valFromOption(a), Primitive_option.valFromOption(b));\n    } else {\n      return false;\n    }\n  } else {\n    return b === undefined;\n  }\n}\n\nfunction compare(a, b, cmp) {\n  if (a !== undefined) {\n    if (b !== undefined) {\n      return cmp(Primitive_option.valFromOption(a), Primitive_option.valFromOption(b));\n    } else {\n      return 1;\n    }\n  } else if (b !== undefined) {\n    return -1;\n  } else {\n    return 0;\n  }\n}\n\nfunction all(options) {\n  let acc = [];\n  let hasNone = false;\n  let index = 0;\n  while (hasNone === false && index < options.length) {\n    let value = options[index];\n    if (value !== undefined) {\n      acc.push(Primitive_option.valFromOption(value));\n      index = index + 1 | 0;\n    } else {\n      hasNone = true;\n    }\n  };\n  if (hasNone) {\n    return;\n  } else {\n    return acc;\n  }\n}\n\nfunction all2(param) {\n  let b = param[1];\n  let a = param[0];\n  if (a !== undefined && b !== undefined) {\n    return [\n      Primitive_option.valFromOption(a),\n      Primitive_option.valFromOption(b)\n    ];\n  }\n}\n\nfunction all3(param) {\n  let c = param[2];\n  let b = param[1];\n  let a = param[0];\n  if (a !== undefined && b !== undefined && c !== undefined) {\n    return [\n      Primitive_option.valFromOption(a),\n      Primitive_option.valFromOption(b),\n      Primitive_option.valFromOption(c)\n    ];\n  }\n}\n\nfunction all4(param) {\n  let d = param[3];\n  let c = param[2];\n  let b = param[1];\n  let a = param[0];\n  if (a !== undefined && b !== undefined && c !== undefined && d !== undefined) {\n    return [\n      Primitive_option.valFromOption(a),\n      Primitive_option.valFromOption(b),\n      Primitive_option.valFromOption(c),\n      Primitive_option.valFromOption(d)\n    ];\n  }\n}\n\nfunction all5(param) {\n  let e = param[4];\n  let d = param[3];\n  let c = param[2];\n  let b = param[1];\n  let a = param[0];\n  if (a !== undefined && b !== undefined && c !== undefined && d !== undefined && e !== undefined) {\n    return [\n      Primitive_option.valFromOption(a),\n      Primitive_option.valFromOption(b),\n      Primitive_option.valFromOption(c),\n      Primitive_option.valFromOption(d),\n      Primitive_option.valFromOption(e)\n    ];\n  }\n}\n\nfunction all6(param) {\n  let f = param[5];\n  let e = param[4];\n  let d = param[3];\n  let c = param[2];\n  let b = param[1];\n  let a = param[0];\n  if (a !== undefined && b !== undefined && c !== undefined && d !== undefined && e !== undefined && f !== undefined) {\n    return [\n      Primitive_option.valFromOption(a),\n      Primitive_option.valFromOption(b),\n      Primitive_option.valFromOption(c),\n      Primitive_option.valFromOption(d),\n      Primitive_option.valFromOption(e),\n      Primitive_option.valFromOption(f)\n    ];\n  }\n}\n\nlet getExn = getOrThrow;\n\nlet mapWithDefault = mapOr;\n\nlet getWithDefault = getOr;\n\nexport {\n  filter,\n  forEach,\n  getExn,\n  getOrThrow,\n  mapOr,\n  mapWithDefault,\n  map,\n  flatMap,\n  getOr,\n  getWithDefault,\n  orElse,\n  isSome,\n  isNone,\n  equal,\n  compare,\n  all,\n  all2,\n  all3,\n  all4,\n  all5,\n  all6,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as Stdlib_JsExn from \"@rescript/runtime/lib/es6/Stdlib_JsExn.js\";\nimport * as Stdlib_Option from \"@rescript/runtime/lib/es6/Stdlib_Option.js\";\nimport * as Primitive_option from \"@rescript/runtime/lib/es6/Primitive_option.js\";\n\nfunction message(exn) {\n  let jsExn = Stdlib_JsExn.fromException(exn);\n  if (jsExn !== undefined) {\n    return Stdlib_Option.getOr(Stdlib_JsExn.message(Primitive_option.valFromOption(jsExn)), \"Unknown error\");\n  } else {\n    return \"Unknown error\";\n  }\n}\n\nfunction stack(prim) {\n  return prim.stack;\n}\n\nlet fromExn = Stdlib_JsExn.fromException;\n\nfunction fullMessage(exn) {\n  let jsExn = Stdlib_JsExn.fromException(exn);\n  if (jsExn === undefined) {\n    return \"Unknown error\";\n  }\n  let jsExn$1 = Primitive_option.valFromOption(jsExn);\n  let m = Stdlib_Option.getOr(Stdlib_JsExn.message(jsExn$1), \"Unknown error\");\n  let s = jsExn$1.stack;\n  if (s !== undefined && s !== \"\") {\n    return m + `\\n` + s;\n  } else {\n    return m;\n  }\n}\n\nexport {\n  message,\n  stack,\n  fromExn,\n  fullMessage,\n}\n/* Stdlib_JsExn Not a pure module */\n","\n\n\nfunction isExtension(e) {\n  if (e == null) {\n    return false;\n  } else {\n    return typeof e.RE_EXN_ID === \"string\";\n  }\n}\n\nfunction internalToException(e) {\n  if (isExtension(e)) {\n    return e;\n  } else {\n    return {\n      RE_EXN_ID: \"JsExn\",\n      _1: e\n    };\n  }\n}\n\nlet idMap = {};\n\nfunction create(str) {\n  let v = idMap[str];\n  if (v !== undefined) {\n    let id = v + 1 | 0;\n    idMap[str] = id;\n    return str + (\"/\" + id);\n  }\n  idMap[str] = 1;\n  return str;\n}\n\nlet $$Error = \"JsExn\";\n\nexport {\n  $$Error,\n  create,\n  internalToException,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as ExnUtils from \"./ExnUtils.res.mjs\";\nimport * as Primitive_exceptions from \"@rescript/runtime/lib/es6/Primitive_exceptions.js\";\n\nfunction parse(ops, html) {\n  return ops.parse(html);\n}\n\nfunction querySelector(ops, doc, selector) {\n  return ops.querySelector(doc, selector);\n}\n\nfunction querySelectorAll(ops, doc, selector) {\n  return ops.querySelectorAll(doc, selector);\n}\n\nfunction getAttribute(ops, el, name) {\n  return ops.getAttribute(el, name);\n}\n\nfunction textContent(ops, el) {\n  return ops.textContent(el);\n}\n\nfunction innerHTML(ops, el) {\n  return ops.innerHTML(el);\n}\n\nfunction outerHTML(ops, el) {\n  return ops.outerHTML(el);\n}\n\nfunction tagName(ops, el) {\n  return ops.tagName(el);\n}\n\nfunction parseDocumentSafely(ops, html) {\n  try {\n    return {\n      TAG: \"Ok\",\n      _0: ops.parse(html)\n    };\n  } catch (raw_exn) {\n    let exn = Primitive_exceptions.internalToException(raw_exn);\n    return {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"InputError\",\n        _0: `Failed to parse HTML input: ` + ExnUtils.message(exn)\n      }\n    };\n  }\n}\n\nexport {\n  parse,\n  querySelector,\n  querySelectorAll,\n  getAttribute,\n  textContent,\n  innerHTML,\n  outerHTML,\n  tagName,\n  parseDocumentSafely,\n}\n/* ExnUtils Not a pure module */\n","\n\nimport * as Primitive_int from \"./Primitive_int.js\";\nimport * as Primitive_option from \"./Primitive_option.js\";\n\nfunction get(arr, i) {\n  if (i >= 0 && i < arr.length) {\n    return Primitive_option.some(arr[i]);\n  }\n}\n\nfunction getOrThrow(arr, i) {\n  if (!(i >= 0 && i < arr.length)) {\n    throw {\n      RE_EXN_ID: \"Assert_failure\",\n      _1: [\n        \"Belt_Array.res\",\n        29,\n        2\n      ],\n      Error: new Error()\n    };\n  }\n  return arr[i];\n}\n\nfunction set(arr, i, v) {\n  if (i >= 0 && i < arr.length) {\n    arr[i] = v;\n    return true;\n  } else {\n    return false;\n  }\n}\n\nfunction setOrThrow(arr, i, v) {\n  if (!(i >= 0 && i < arr.length)) {\n    throw {\n      RE_EXN_ID: \"Assert_failure\",\n      _1: [\n        \"Belt_Array.res\",\n        44,\n        2\n      ],\n      Error: new Error()\n    };\n  }\n  arr[i] = v;\n}\n\nfunction swapUnsafe(xs, i, j) {\n  let tmp = xs[i];\n  xs[i] = xs[j];\n  xs[j] = tmp;\n}\n\nfunction shuffleInPlace(xs) {\n  let len = xs.length;\n  let random_int = (min, max) => Math.floor(Math.random() * (max - min | 0)) + min | 0;\n  for (let i = 0; i < len; ++i) {\n    swapUnsafe(xs, i, random_int(i, len));\n  }\n}\n\nfunction shuffle(xs) {\n  let result = xs.slice(0);\n  shuffleInPlace(result);\n  return result;\n}\n\nfunction reverseInPlace(xs) {\n  let len = xs.length;\n  let ofs = 0;\n  for (let i = 0, i_finish = len / 2 | 0; i < i_finish; ++i) {\n    swapUnsafe(xs, ofs + i | 0, ((ofs + len | 0) - i | 0) - 1 | 0);\n  }\n}\n\nfunction reverse(xs) {\n  let len = xs.length;\n  let result = new Array(len);\n  for (let i = 0; i < len; ++i) {\n    result[i] = xs[(len - 1 | 0) - i | 0];\n  }\n  return result;\n}\n\nfunction make(l, f) {\n  if (l <= 0) {\n    return [];\n  }\n  let res = new Array(l);\n  for (let i = 0; i < l; ++i) {\n    res[i] = f;\n  }\n  return res;\n}\n\nfunction makeBy(l, f) {\n  if (l <= 0) {\n    return [];\n  }\n  let res = new Array(l);\n  for (let i = 0; i < l; ++i) {\n    res[i] = f(i);\n  }\n  return res;\n}\n\nfunction makeByAndShuffle(l, f) {\n  let u = makeBy(l, f);\n  shuffleInPlace(u);\n  return u;\n}\n\nfunction range(start, finish) {\n  let cut = finish - start | 0;\n  if (cut < 0) {\n    return [];\n  }\n  let arr = new Array(cut + 1 | 0);\n  for (let i = 0; i <= cut; ++i) {\n    arr[i] = start + i | 0;\n  }\n  return arr;\n}\n\nfunction rangeBy(start, finish, step) {\n  let cut = finish - start | 0;\n  if (cut < 0 || step <= 0) {\n    return [];\n  }\n  let nb = (cut / step | 0) + 1 | 0;\n  let arr = new Array(nb);\n  let cur = start;\n  for (let i = 0; i < nb; ++i) {\n    arr[i] = cur;\n    cur = cur + step | 0;\n  }\n  return arr;\n}\n\nfunction zip(xs, ys) {\n  let lenx = xs.length;\n  let leny = ys.length;\n  let len = Primitive_int.min(lenx, leny);\n  let s = new Array(len);\n  for (let i = 0; i < len; ++i) {\n    s[i] = [\n      xs[i],\n      ys[i]\n    ];\n  }\n  return s;\n}\n\nfunction zipBy(xs, ys, f) {\n  let lenx = xs.length;\n  let leny = ys.length;\n  let len = Primitive_int.min(lenx, leny);\n  let s = new Array(len);\n  for (let i = 0; i < len; ++i) {\n    s[i] = f(xs[i], ys[i]);\n  }\n  return s;\n}\n\nfunction concat(a1, a2) {\n  let l1 = a1.length;\n  let l2 = a2.length;\n  let a1a2 = new Array(l1 + l2 | 0);\n  for (let i = 0; i < l1; ++i) {\n    a1a2[i] = a1[i];\n  }\n  for (let i$1 = 0; i$1 < l2; ++i$1) {\n    a1a2[l1 + i$1 | 0] = a2[i$1];\n  }\n  return a1a2;\n}\n\nfunction concatMany(arrs) {\n  let lenArrs = arrs.length;\n  let totalLen = 0;\n  for (let i = 0; i < lenArrs; ++i) {\n    totalLen = totalLen + arrs[i].length | 0;\n  }\n  let result = new Array(totalLen);\n  totalLen = 0;\n  for (let j = 0; j < lenArrs; ++j) {\n    let cur = arrs[j];\n    for (let k = 0, k_finish = cur.length; k < k_finish; ++k) {\n      result[totalLen] = cur[k];\n      totalLen = totalLen + 1 | 0;\n    }\n  }\n  return result;\n}\n\nfunction slice(a, offset, len) {\n  if (len <= 0) {\n    return [];\n  }\n  let lena = a.length;\n  let ofs = offset < 0 ? Primitive_int.max(lena + offset | 0, 0) : offset;\n  let hasLen = lena - ofs | 0;\n  let copyLength = Primitive_int.min(hasLen, len);\n  if (copyLength <= 0) {\n    return [];\n  }\n  let result = new Array(copyLength);\n  for (let i = 0; i < copyLength; ++i) {\n    result[i] = a[ofs + i | 0];\n  }\n  return result;\n}\n\nfunction sliceToEnd(a, offset) {\n  let lena = a.length;\n  let ofs = offset < 0 ? Primitive_int.max(lena + offset | 0, 0) : offset;\n  let len = lena > ofs ? lena - ofs | 0 : 0;\n  let result = new Array(len);\n  for (let i = 0; i < len; ++i) {\n    result[i] = a[ofs + i | 0];\n  }\n  return result;\n}\n\nfunction fill(a, offset, len, v) {\n  if (len <= 0) {\n    return;\n  }\n  let lena = a.length;\n  let ofs = offset < 0 ? Primitive_int.max(lena + offset | 0, 0) : offset;\n  let hasLen = lena - ofs | 0;\n  let fillLength = Primitive_int.min(hasLen, len);\n  if (fillLength <= 0) {\n    return;\n  }\n  for (let i = ofs, i_finish = ofs + fillLength | 0; i < i_finish; ++i) {\n    a[i] = v;\n  }\n}\n\nfunction blitUnsafe(a1, srcofs1, a2, srcofs2, blitLength) {\n  if (srcofs2 <= srcofs1) {\n    for (let j = 0; j < blitLength; ++j) {\n      a2[j + srcofs2 | 0] = a1[j + srcofs1 | 0];\n    }\n    return;\n  }\n  for (let j$1 = blitLength - 1 | 0; j$1 >= 0; --j$1) {\n    a2[j$1 + srcofs2 | 0] = a1[j$1 + srcofs1 | 0];\n  }\n}\n\nfunction blit(a1, ofs1, a2, ofs2, len) {\n  let lena1 = a1.length;\n  let lena2 = a2.length;\n  let srcofs1 = ofs1 < 0 ? Primitive_int.max(lena1 + ofs1 | 0, 0) : ofs1;\n  let srcofs2 = ofs2 < 0 ? Primitive_int.max(lena2 + ofs2 | 0, 0) : ofs2;\n  let blitLength = Primitive_int.min(len, Primitive_int.min(lena1 - srcofs1 | 0, lena2 - srcofs2 | 0));\n  if (srcofs2 <= srcofs1) {\n    for (let j = 0; j < blitLength; ++j) {\n      a2[j + srcofs2 | 0] = a1[j + srcofs1 | 0];\n    }\n    return;\n  }\n  for (let j$1 = blitLength - 1 | 0; j$1 >= 0; --j$1) {\n    a2[j$1 + srcofs2 | 0] = a1[j$1 + srcofs1 | 0];\n  }\n}\n\nfunction forEach(a, f) {\n  for (let i = 0, i_finish = a.length; i < i_finish; ++i) {\n    f(a[i]);\n  }\n}\n\nfunction map(a, f) {\n  let l = a.length;\n  let r = new Array(l);\n  for (let i = 0; i < l; ++i) {\n    r[i] = f(a[i]);\n  }\n  return r;\n}\n\nfunction flatMap(a, f) {\n  return concatMany(map(a, f));\n}\n\nfunction getBy(a, p) {\n  let l = a.length;\n  let i = 0;\n  let r;\n  while (r === undefined && i < l) {\n    let v = a[i];\n    if (p(v)) {\n      r = Primitive_option.some(v);\n    }\n    i = i + 1 | 0;\n  };\n  return r;\n}\n\nfunction getIndexBy(a, p) {\n  let l = a.length;\n  let i = 0;\n  let r;\n  while (r === undefined && i < l) {\n    let v = a[i];\n    if (p(v)) {\n      r = i;\n    }\n    i = i + 1 | 0;\n  };\n  return r;\n}\n\nfunction keep(a, f) {\n  let l = a.length;\n  let r = new Array(l);\n  let j = 0;\n  for (let i = 0; i < l; ++i) {\n    let v = a[i];\n    if (f(v)) {\n      r[j] = v;\n      j = j + 1 | 0;\n    }\n  }\n  r.length = j;\n  return r;\n}\n\nfunction keepWithIndex(a, f) {\n  let l = a.length;\n  let r = new Array(l);\n  let j = 0;\n  for (let i = 0; i < l; ++i) {\n    let v = a[i];\n    if (f(v, i)) {\n      r[j] = v;\n      j = j + 1 | 0;\n    }\n  }\n  r.length = j;\n  return r;\n}\n\nfunction keepMap(a, f) {\n  let l = a.length;\n  let r = new Array(l);\n  let j = 0;\n  for (let i = 0; i < l; ++i) {\n    let v = a[i];\n    let v$1 = f(v);\n    if (v$1 !== undefined) {\n      r[j] = Primitive_option.valFromOption(v$1);\n      j = j + 1 | 0;\n    }\n  }\n  r.length = j;\n  return r;\n}\n\nfunction forEachWithIndex(a, f) {\n  for (let i = 0, i_finish = a.length; i < i_finish; ++i) {\n    f(i, a[i]);\n  }\n}\n\nfunction mapWithIndex(a, f) {\n  let l = a.length;\n  let r = new Array(l);\n  for (let i = 0; i < l; ++i) {\n    r[i] = f(i, a[i]);\n  }\n  return r;\n}\n\nfunction reduce(a, x, f) {\n  let r = x;\n  for (let i = 0, i_finish = a.length; i < i_finish; ++i) {\n    r = f(r, a[i]);\n  }\n  return r;\n}\n\nfunction reduceReverse(a, x, f) {\n  let r = x;\n  for (let i = a.length - 1 | 0; i >= 0; --i) {\n    r = f(r, a[i]);\n  }\n  return r;\n}\n\nfunction reduceReverse2(a, b, x, f) {\n  let r = x;\n  let len = Primitive_int.min(a.length, b.length);\n  for (let i = len - 1 | 0; i >= 0; --i) {\n    r = f(r, a[i], b[i]);\n  }\n  return r;\n}\n\nfunction reduceWithIndex(a, x, f) {\n  let r = x;\n  for (let i = 0, i_finish = a.length; i < i_finish; ++i) {\n    r = f(r, a[i], i);\n  }\n  return r;\n}\n\nfunction every(arr, b) {\n  let len = arr.length;\n  let _i = 0;\n  while (true) {\n    let i = _i;\n    if (i === len) {\n      return true;\n    }\n    if (!b(arr[i])) {\n      return false;\n    }\n    _i = i + 1 | 0;\n    continue;\n  };\n}\n\nfunction some(arr, b) {\n  let len = arr.length;\n  let _i = 0;\n  while (true) {\n    let i = _i;\n    if (i === len) {\n      return false;\n    }\n    if (b(arr[i])) {\n      return true;\n    }\n    _i = i + 1 | 0;\n    continue;\n  };\n}\n\nfunction everyAux2(arr1, arr2, _i, b, len) {\n  while (true) {\n    let i = _i;\n    if (i === len) {\n      return true;\n    }\n    if (!b(arr1[i], arr2[i])) {\n      return false;\n    }\n    _i = i + 1 | 0;\n    continue;\n  };\n}\n\nfunction every2(a, b, p) {\n  return everyAux2(a, b, 0, p, Primitive_int.min(a.length, b.length));\n}\n\nfunction some2(a, b, p) {\n  let _i = 0;\n  let len = Primitive_int.min(a.length, b.length);\n  while (true) {\n    let i = _i;\n    if (i === len) {\n      return false;\n    }\n    if (p(a[i], b[i])) {\n      return true;\n    }\n    _i = i + 1 | 0;\n    continue;\n  };\n}\n\nfunction eq(a, b, p) {\n  let lena = a.length;\n  let lenb = b.length;\n  if (lena === lenb) {\n    return everyAux2(a, b, 0, p, lena);\n  } else {\n    return false;\n  }\n}\n\nfunction cmp(a, b, p) {\n  let lena = a.length;\n  let lenb = b.length;\n  if (lena > lenb) {\n    return 1;\n  } else if (lena < lenb) {\n    return -1;\n  } else {\n    let _i = 0;\n    while (true) {\n      let i = _i;\n      if (i === lena) {\n        return 0;\n      }\n      let c = p(a[i], b[i]);\n      if (c !== 0) {\n        return c;\n      }\n      _i = i + 1 | 0;\n      continue;\n    };\n  }\n}\n\nfunction partition(a, f) {\n  let l = a.length;\n  let i = 0;\n  let j = 0;\n  let a1 = new Array(l);\n  let a2 = new Array(l);\n  for (let ii = 0; ii < l; ++ii) {\n    let v = a[ii];\n    if (f(v)) {\n      a1[i] = v;\n      i = i + 1 | 0;\n    } else {\n      a2[j] = v;\n      j = j + 1 | 0;\n    }\n  }\n  a1.length = i;\n  a2.length = j;\n  return [\n    a1,\n    a2\n  ];\n}\n\nfunction unzip(a) {\n  let l = a.length;\n  let a1 = new Array(l);\n  let a2 = new Array(l);\n  for (let i = 0; i < l; ++i) {\n    let match = a[i];\n    a1[i] = match[0];\n    a2[i] = match[1];\n  }\n  return [\n    a1,\n    a2\n  ];\n}\n\nfunction joinWith(a, sep, toString) {\n  let l = a.length;\n  if (l === 0) {\n    return \"\";\n  }\n  let lastIndex = l - 1 | 0;\n  let _i = 0;\n  let _res = \"\";\n  while (true) {\n    let res = _res;\n    let i = _i;\n    if (i === lastIndex) {\n      return res + toString(a[i]);\n    }\n    _res = res + (toString(a[i]) + sep);\n    _i = i + 1 | 0;\n    continue;\n  };\n}\n\nfunction init(n, f) {\n  let v = new Array(n);\n  for (let i = 0; i < n; ++i) {\n    v[i] = f(i);\n  }\n  return v;\n}\n\nlet getExn = getOrThrow;\n\nlet setExn = setOrThrow;\n\nlet makeByU = makeBy;\n\nlet makeByAndShuffleU = makeByAndShuffle;\n\nlet zipByU = zipBy;\n\nlet forEachU = forEach;\n\nlet mapU = map;\n\nlet flatMapU = flatMap;\n\nlet getByU = getBy;\n\nlet getIndexByU = getIndexBy;\n\nlet keepU = keep;\n\nlet keepWithIndexU = keepWithIndex;\n\nlet keepMapU = keepMap;\n\nlet forEachWithIndexU = forEachWithIndex;\n\nlet mapWithIndexU = mapWithIndex;\n\nlet partitionU = partition;\n\nlet reduceU = reduce;\n\nlet reduceReverseU = reduceReverse;\n\nlet reduceReverse2U = reduceReverse2;\n\nlet reduceWithIndexU = reduceWithIndex;\n\nlet joinWithU = joinWith;\n\nlet someU = some;\n\nlet everyU = every;\n\nlet every2U = every2;\n\nlet some2U = some2;\n\nlet cmpU = cmp;\n\nlet eqU = eq;\n\nlet initU = init;\n\nexport {\n  get,\n  getExn,\n  getOrThrow,\n  set,\n  setExn,\n  setOrThrow,\n  shuffleInPlace,\n  shuffle,\n  reverseInPlace,\n  reverse,\n  make,\n  range,\n  rangeBy,\n  makeByU,\n  makeBy,\n  makeByAndShuffleU,\n  makeByAndShuffle,\n  zip,\n  zipByU,\n  zipBy,\n  unzip,\n  concat,\n  concatMany,\n  slice,\n  sliceToEnd,\n  fill,\n  blit,\n  blitUnsafe,\n  forEachU,\n  forEach,\n  mapU,\n  map,\n  flatMapU,\n  flatMap,\n  getByU,\n  getBy,\n  getIndexByU,\n  getIndexBy,\n  keepU,\n  keep,\n  keepWithIndexU,\n  keepWithIndex,\n  keepMapU,\n  keepMap,\n  forEachWithIndexU,\n  forEachWithIndex,\n  mapWithIndexU,\n  mapWithIndex,\n  partitionU,\n  partition,\n  reduceU,\n  reduce,\n  reduceReverseU,\n  reduceReverse,\n  reduceReverse2U,\n  reduceReverse2,\n  reduceWithIndexU,\n  reduceWithIndex,\n  joinWithU,\n  joinWith,\n  someU,\n  some,\n  everyU,\n  every,\n  every2U,\n  every2,\n  some2U,\n  some2,\n  cmpU,\n  cmp,\n  eqU,\n  eq,\n  initU,\n  init,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\n\nfunction jsonParse(raw) {\n  try {\n    return JSON.parse(raw);\n  } catch (exn) {\n    return;\n  }\n}\n\nexport {\n  jsonParse,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\n\nlet isExecutedAsScript = (function() {\n  try {\n    if (typeof process === \"undefined\" || !process.argv || process.argv.length < 2) {\n      return false;\n    }\n    var url = process.getBuiltinModule('node:url');\n    var fs = process.getBuiltinModule('node:fs');\n    var currentPath = url.fileURLToPath(import.meta.url);\n    var invokedPath = process.argv[1];\n    // Resolve npm .bin symlinks before comparing the invoked CLI path.\n    var resolvedCurrent;\n    var resolvedInvoked;\n    try {\n      resolvedCurrent = fs.realpathSync(currentPath);\n      resolvedInvoked = fs.realpathSync(invokedPath);\n    } catch (e) {\n      resolvedCurrent = currentPath;\n      resolvedInvoked = invokedPath;\n    }\n    return resolvedCurrent === resolvedInvoked;\n  } catch (e) {\n    return false;\n  }\n});\n\nlet candidatePackagePaths = (function() {\n  try {\n    return [\n      decodeURIComponent(new URL('../package.json', import.meta.url).pathname),\n      decodeURIComponent(new URL('../../package.json', import.meta.url).pathname),\n    ];\n  } catch (e) {\n    return [];\n  }\n});\n\nexport {\n  isExecutedAsScript,\n  candidatePackagePaths,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as Nodefs from \"node:fs\";\nimport * as NodeUtil from \"../bindings/NodeUtil.res.mjs\";\nimport * as Nodeutil from \"node:util\";\nimport * as Stdlib_Option from \"@rescript/runtime/lib/es6/Stdlib_Option.js\";\nimport * as ImportMetaBinding from \"../bindings/ImportMetaBinding.res.mjs\";\n\nfunction parseVersionFromPath(path) {\n  try {\n    let raw = Nodefs.readFileSync(path, \"utf8\");\n    let json = NodeUtil.jsonParse(raw);\n    if (json !== undefined) {\n      return json[\"version\"];\n    } else {\n      return;\n    }\n  } catch (exn) {\n    return;\n  }\n}\n\nfunction getCliVersion() {\n  let paths = ImportMetaBinding.candidatePackagePaths();\n  let found = {\n    contents: undefined\n  };\n  paths.values().forEach(path => {\n    if (Stdlib_Option.isNone(found.contents)) {\n      found.contents = parseVersionFromPath(path);\n      return;\n    }\n  });\n  return Stdlib_Option.getOr(found.contents, \"unknown\");\n}\n\nfunction showHelp() {\n  console.log(`\n  Usage: res-scrapy [options]\n    -v, --version      Display CLI version\n    -h, --help         Display this help message\n    -s, --selector     Specify a CSS selector to extract data\n    -m, --mode         Extract multiple results (single by default)\n    -e, --extract      What to extract: outerHtml (default), innerHtml, text, or attr:<name>\n    -c, --schema       Specify the schema to use\n    -p, --schemaPath   Specify the path to the schema\n    -t, --table        Extract a table as JSON; pair with --selector to target a specific table (defaults to \"table\")\n    -o, --output       Write output to a file instead of stdout\n    -f, --format       Output format for file writes: json (default) or ndjson\n    -u, --url          URL or URL template (e.g., https://site.com/page={1..10})\n    -j, --concurrency  Max concurrent fetches (default: 5, max: 20)\n    --user-agent       Override the HTTP User-Agent header for URL mode\n    --timeout          Request timeout in seconds for URL mode (default: 30)\n    --retry            Max retry attempts for URL mode (default: 3)\n    --delay            Delay in milliseconds between URL request starts (default: 0)\n    --header           Add request header for URL mode; repeatable (e.g. --header 'Accept: text/html')\n    --cookie           Add Cookie header value for URL mode; repeatable\n  `);\n  process.exit(0);\n}\n\nfunction parse() {\n  let options = Object.fromEntries([\n    [\n      \"version\",\n      {\n        type: \"boolean\",\n        short: \"v\",\n        default: false\n      }\n    ],\n    [\n      \"mode\",\n      {\n        type: \"boolean\",\n        short: \"m\",\n        default: false\n      }\n    ],\n    [\n      \"selector\",\n      {\n        type: \"string\",\n        short: \"s\"\n      }\n    ],\n    [\n      \"extract\",\n      {\n        type: \"string\",\n        short: \"e\",\n        default: \"outerHtml\"\n      }\n    ],\n    [\n      \"schema\",\n      {\n        type: \"string\",\n        short: \"c\"\n      }\n    ],\n    [\n      \"schemaPath\",\n      {\n        type: \"string\",\n        short: \"p\"\n      }\n    ],\n    [\n      \"table\",\n      {\n        type: \"boolean\",\n        short: \"t\",\n        default: false\n      }\n    ],\n    [\n      \"output\",\n      {\n        type: \"string\",\n        short: \"o\"\n      }\n    ],\n    [\n      \"format\",\n      {\n        type: \"string\",\n        short: \"f\",\n        default: \"json\"\n      }\n    ],\n    [\n      \"url\",\n      {\n        type: \"string\",\n        short: \"u\"\n      }\n    ],\n    [\n      \"concurrency\",\n      {\n        type: \"string\",\n        short: \"j\",\n        default: \"5\"\n      }\n    ],\n    [\n      \"userAgent\",\n      {\n        type: \"string\"\n      }\n    ],\n    [\n      \"timeout\",\n      {\n        type: \"string\",\n        default: \"30\"\n      }\n    ],\n    [\n      \"retry\",\n      {\n        type: \"string\",\n        default: \"3\"\n      }\n    ],\n    [\n      \"delay\",\n      {\n        type: \"string\",\n        default: \"0\"\n      }\n    ],\n    [\n      \"header\",\n      {\n        type: \"string\",\n        multiple: true\n      }\n    ],\n    [\n      \"cookie\",\n      {\n        type: \"string\",\n        multiple: true\n      }\n    ],\n    [\n      \"help\",\n      {\n        type: \"boolean\",\n        short: \"h\"\n      }\n    ]\n  ]);\n  let args = Nodeutil.parseArgs({\n    args: process.argv.slice(2),\n    options: options,\n    strict: true,\n    allowPositionals: false,\n    tokens: true\n  });\n  let values = args.values;\n  let match = values.help;\n  if (match !== undefined && match) {\n    showHelp();\n  }\n  let match$1 = values.version;\n  if (match$1 !== undefined && match$1) {\n    console.log(getCliVersion());\n    process.exit(0);\n  }\n  return values;\n}\n\nexport {\n  getCliVersion,\n  parse,\n}\n/* node:fs Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as Stdlib_JsExn from \"@rescript/runtime/lib/es6/Stdlib_JsExn.js\";\nimport * as Stdlib_Option from \"@rescript/runtime/lib/es6/Stdlib_Option.js\";\nimport * as Primitive_option from \"@rescript/runtime/lib/es6/Primitive_option.js\";\nimport * as Primitive_exceptions from \"@rescript/runtime/lib/es6/Primitive_exceptions.js\";\n\nfunction hasStdinData() {\n  let match = process.stdin.isTTY;\n  if (match !== undefined) {\n    return !match;\n  } else {\n    return true;\n  }\n}\n\nfunction readFromStdin() {\n  return new Promise((resolve, reject) => {\n    let chunks = {\n      contents: []\n    };\n    let totalBytes = {\n      contents: 0\n    };\n    let settled = {\n      contents: false\n    };\n    let complete = result => {\n      if (!settled.contents) {\n        settled.contents = true;\n        return resolve(result);\n      }\n    };\n    if (!hasStdinData()) {\n      return complete({\n        TAG: \"Error\",\n        _0: {\n          TAG: \"NoInput\",\n          _0: \"No HTML input provided via stdin\"\n        }\n      });\n    }\n    try {\n      process.stdin.setEncoding(\"utf8\");\n      let timer = setTimeout(() => complete({\n        TAG: \"Error\",\n        _0: {\n          TAG: \"ReadError\",\n          _0: `Timed out after ` + (30).toString() + ` seconds while reading stdin`\n        }\n      }), 30000);\n      let completeWithCleanup = result => {\n        clearTimeout(timer);\n        complete(result);\n      };\n      process.stdin.on(\"data\", chunk => {\n        if (settled.contents) {\n          return;\n        }\n        let nextSize = totalBytes.contents + chunk.length | 0;\n        if (nextSize > 52428800) {\n          return completeWithCleanup({\n            TAG: \"Error\",\n            _0: {\n              TAG: \"ReadError\",\n              _0: `Stdin exceeds maximum size of ` + (50).toString() + ` MB`\n            }\n          });\n        } else {\n          totalBytes.contents = nextSize;\n          chunks.contents.push(chunk);\n          return;\n        }\n      });\n      process.stdin.on(\"end\", () => {\n        if (settled.contents) {\n          return;\n        }\n        let content = chunks.contents.join(\"\").trim();\n        let match = content.length;\n        if (match !== 0) {\n          return completeWithCleanup({\n            TAG: \"Ok\",\n            _0: content\n          });\n        } else {\n          return completeWithCleanup({\n            TAG: \"Error\",\n            _0: {\n              TAG: \"EmptyContent\",\n              _0: \"Empty HTML content received from stdin\"\n            }\n          });\n        }\n      });\n      process.stdin.on(\"error\", error => {\n        if (!settled.contents) {\n          let msg = Stdlib_JsExn.message(error);\n          let errorMessage = msg !== undefined ? msg : \"Unknown error\";\n          completeWithCleanup({\n            TAG: \"Error\",\n            _0: {\n              TAG: \"ReadError\",\n              _0: `Error reading stdin: ` + errorMessage\n            }\n          });\n        }\n      });\n      process.stdin.resume();\n      return;\n    } catch (raw_exn) {\n      let exn = Primitive_exceptions.internalToException(raw_exn);\n      if (settled.contents) {\n        return;\n      }\n      let jsExn = Stdlib_JsExn.fromException(exn);\n      let errorMessage = jsExn !== undefined ? Stdlib_Option.getOr(Stdlib_JsExn.message(Primitive_option.valFromOption(jsExn)), \"Unknown error\") : \"Unknown error\";\n      settled.contents = true;\n      return reject(new Error(`Error initializing stdin read: ` + errorMessage));\n    }\n  });\n}\n\nexport {\n  hasStdinData,\n  readFromStdin,\n}\n/* Stdlib_JsExn Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\n\nfunction dictGet(prim0, prim1) {\n  return prim0[prim1];\n}\n\nexport {\n  dictGet,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as JsonUtils from \"../utils/JsonUtils.res.mjs\";\n\nfunction parseText(raw) {\n  let trim = JsonUtils.dictGet(raw, \"trim\");\n  let normalizeWhitespace = JsonUtils.dictGet(raw, \"normalizeWhitespace\");\n  let lowercase = JsonUtils.dictGet(raw, \"lowercase\");\n  let uppercase = JsonUtils.dictGet(raw, \"uppercase\");\n  let pattern = JsonUtils.dictGet(raw, \"pattern\");\n  let join = JsonUtils.dictGet(raw, \"join\");\n  return {\n    trim: trim,\n    normalizeWhitespace: normalizeWhitespace,\n    lowercase: lowercase,\n    uppercase: uppercase,\n    pattern: pattern,\n    join: join\n  };\n}\n\nexport {\n  parseText,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as JsonUtils from \"../utils/JsonUtils.res.mjs\";\nimport * as OptionFields from \"./OptionFields.res.mjs\";\nimport * as Stdlib_Option from \"@rescript/runtime/lib/es6/Stdlib_Option.js\";\nimport * as Primitive_option from \"@rescript/runtime/lib/es6/Primitive_option.js\";\n\nfunction dictGetField(raw, key) {\n  if (raw !== undefined) {\n    return JsonUtils.dictGet(Primitive_option.valFromOption(raw), key);\n  }\n}\n\nfunction parseTextOptions(fieldJson) {\n  let raw = JsonUtils.dictGet(fieldJson, \"textOptions\");\n  if (raw !== undefined) {\n    return OptionFields.parseText(Primitive_option.valFromOption(raw));\n  }\n}\n\nfunction parseHtmlOptions(fieldJson) {\n  let raw = JsonUtils.dictGet(fieldJson, \"htmlOptions\");\n  if (raw === undefined) {\n    return;\n  }\n  let raw$1 = Primitive_option.valFromOption(raw);\n  let match = JsonUtils.dictGet(raw$1, \"mode\");\n  let mode;\n  if (match !== undefined) {\n    switch (match) {\n      case \"inner\" :\n        mode = \"Inner\";\n        break;\n      case \"outer\" :\n        mode = \"Outer\";\n        break;\n      default:\n        mode = undefined;\n    }\n  } else {\n    mode = undefined;\n  }\n  let stripScripts = JsonUtils.dictGet(raw$1, \"stripScripts\");\n  let stripStyles = JsonUtils.dictGet(raw$1, \"stripStyles\");\n  if (mode === undefined && stripScripts === undefined && stripStyles === undefined) {\n    return;\n  }\n  return {\n    mode: mode,\n    stripScripts: stripScripts,\n    stripStyles: stripStyles\n  };\n}\n\nfunction parseAttributeConfig(fieldJson) {\n  let arr = JsonUtils.dictGet(fieldJson, \"attributes\");\n  if (arr !== undefined) {\n    let m = JsonUtils.dictGet(fieldJson, \"attrMode\");\n    let rawMode;\n    if (m !== undefined) {\n      rawMode = Primitive_option.valFromOption(m);\n    } else {\n      let opts = JsonUtils.dictGet(fieldJson, \"attributeOptions\");\n      rawMode = opts !== undefined ? JsonUtils.dictGet(Primitive_option.valFromOption(opts), \"mode\") : undefined;\n    }\n    let mode;\n    if (rawMode !== undefined) {\n      switch (rawMode) {\n        case \"all\" :\n          mode = \"All\";\n          break;\n        case \"firstNonEmpty\" :\n          mode = \"FirstNonEmpty\";\n          break;\n        case \"join\" :\n          mode = \"Join\";\n          break;\n        default:\n          mode = \"First\";\n      }\n    } else {\n      mode = \"First\";\n    }\n    let opts$1 = JsonUtils.dictGet(fieldJson, \"attributeOptions\");\n    let joinSep = opts$1 !== undefined ? JsonUtils.dictGet(Primitive_option.valFromOption(opts$1), \"joinSep\") : undefined;\n    return {\n      names: Primitive_option.valFromOption(arr),\n      mode: mode,\n      joinSep: joinSep\n    };\n  }\n  let name = JsonUtils.dictGet(fieldJson, \"attribute\");\n  if (name !== undefined) {\n    return {\n      names: [Primitive_option.valFromOption(name)],\n      mode: \"First\"\n    };\n  }\n}\n\nfunction parseErrorPolicy(s) {\n  switch (s) {\n    case \"returnDefault\" :\n      return \"ReturnDefault\";\n    case \"returnText\" :\n      return \"ReturnText\";\n    default:\n      return \"ReturnNull\";\n  }\n}\n\nfunction parseNumberOptions(fieldJson) {\n  let raw = JsonUtils.dictGet(fieldJson, \"numberOptions\");\n  if (raw === undefined) {\n    return;\n  }\n  let raw$1 = Primitive_option.valFromOption(raw);\n  let stripNonNumeric = JsonUtils.dictGet(raw$1, \"stripNonNumeric\");\n  let pattern = JsonUtils.dictGet(raw$1, \"pattern\");\n  let thousandsSeparator = JsonUtils.dictGet(raw$1, \"thousandsSeparator\");\n  let decimalSeparator = JsonUtils.dictGet(raw$1, \"decimalSeparator\");\n  let precision = JsonUtils.dictGet(raw$1, \"precision\");\n  let allowNegative = JsonUtils.dictGet(raw$1, \"allowNegative\");\n  let s = JsonUtils.dictGet(raw$1, \"onError\");\n  let onError = s !== undefined ? parseErrorPolicy(Primitive_option.valFromOption(s)) : undefined;\n  return {\n    stripNonNumeric: stripNonNumeric,\n    pattern: pattern,\n    thousandsSeparator: thousandsSeparator,\n    decimalSeparator: decimalSeparator,\n    precision: precision,\n    allowNegative: allowNegative,\n    onError: onError\n  };\n}\n\nfunction parseCountOptions(param) {\n  \n}\n\nfunction parseUrlOptions(fieldJson) {\n  let raw = JsonUtils.dictGet(fieldJson, \"urlOptions\");\n  if (raw === undefined) {\n    return;\n  }\n  let raw$1 = Primitive_option.valFromOption(raw);\n  let base = JsonUtils.dictGet(raw$1, \"base\");\n  let resolve = JsonUtils.dictGet(raw$1, \"resolve\");\n  let validate = JsonUtils.dictGet(raw$1, \"validate\");\n  let protocol = JsonUtils.dictGet(raw$1, \"protocol\");\n  let stripQuery = JsonUtils.dictGet(raw$1, \"stripQuery\");\n  let stripHash = JsonUtils.dictGet(raw$1, \"stripHash\");\n  let attribute = JsonUtils.dictGet(raw$1, \"attribute\");\n  return {\n    base: base,\n    resolve: resolve,\n    validate: validate,\n    protocol: protocol,\n    stripQuery: stripQuery,\n    stripHash: stripHash,\n    attribute: attribute\n  };\n}\n\nfunction parseJsonOptions(fieldJson) {\n  let raw = JsonUtils.dictGet(fieldJson, \"jsonOptions\");\n  if (raw === undefined) {\n    return;\n  }\n  let raw$1 = Primitive_option.valFromOption(raw);\n  let source = JsonUtils.dictGet(raw$1, \"source\");\n  let attribute = JsonUtils.dictGet(raw$1, \"attribute\");\n  let path = JsonUtils.dictGet(raw$1, \"path\");\n  let s = JsonUtils.dictGet(raw$1, \"onError\");\n  let onError = s !== undefined ? parseErrorPolicy(Primitive_option.valFromOption(s)) : undefined;\n  return {\n    source: source,\n    attribute: attribute,\n    path: path,\n    onError: onError\n  };\n}\n\nfunction parseDateOutput(raw, maybeKey) {\n  let key = Stdlib_Option.getOr(maybeKey, \"output\");\n  let match = JsonUtils.dictGet(raw, key);\n  if (match === undefined) {\n    return;\n  }\n  switch (match) {\n    case \"custom\" :\n      let f = JsonUtils.dictGet(raw, \"outputFormat\");\n      let fmt = f !== undefined ? Primitive_option.valFromOption(f) : \"yyyy-MM-dd\";\n      return {\n        TAG: \"Custom\",\n        _0: fmt\n      };\n    case \"epoch\" :\n      return \"Epoch\";\n    case \"epochMillis\" :\n      return \"EpochMillis\";\n    case \"iso8601\" :\n      return \"Iso8601\";\n    default:\n      return;\n  }\n}\n\nfunction parseDateOptions(fieldJson) {\n  let raw = JsonUtils.dictGet(fieldJson, \"dateOptions\");\n  if (raw === undefined) {\n    return;\n  }\n  let raw$1 = Primitive_option.valFromOption(raw);\n  let formats = JsonUtils.dictGet(raw$1, \"formats\");\n  let timezone = JsonUtils.dictGet(raw$1, \"timezone\");\n  let output = parseDateOutput(raw$1, \"output\");\n  let strict = JsonUtils.dictGet(raw$1, \"strict\");\n  let source = JsonUtils.dictGet(raw$1, \"source\");\n  let attribute = JsonUtils.dictGet(raw$1, \"attribute\");\n  return {\n    formats: formats,\n    timezone: timezone,\n    output: output,\n    strict: strict,\n    source: source,\n    attribute: attribute\n  };\n}\n\nfunction parseListItemType(s) {\n  if (s.startsWith(\"attr:\")) {\n    let attrName = s.slice(5, s.length);\n    return {\n      TAG: \"ListAttribute\",\n      _0: attrName\n    };\n  }\n  switch (s) {\n    case \"html\" :\n      return \"ListHtml\";\n    case \"url\" :\n      return \"ListUrl\";\n    default:\n      return \"ListText\";\n  }\n}\n\nfunction parseListOptions(fieldJson) {\n  let raw = JsonUtils.dictGet(fieldJson, \"listOptions\");\n  let s = dictGetField(raw, \"itemType\");\n  let itemType = s !== undefined ? parseListItemType(Primitive_option.valFromOption(s)) : \"ListText\";\n  let unique = dictGetField(raw, \"unique\");\n  let filter = dictGetField(raw, \"filter\");\n  let limit = dictGetField(raw, \"limit\");\n  let join = dictGetField(raw, \"join\");\n  return {\n    itemType: itemType,\n    unique: unique,\n    filter: filter,\n    limit: limit,\n    join: join\n  };\n}\n\nfunction parseBooleanMode(s) {\n  switch (s) {\n    case \"attributeCheck\" :\n      return \"AttributeCheck\";\n    case \"presence\" :\n      return \"Presence\";\n    default:\n      return \"Mapping\";\n  }\n}\n\nfunction parseBooleanUnknownPolicy(s) {\n  switch (s) {\n    case \"error\" :\n      return \"UnknownError\";\n    case \"null\" :\n      return \"UnknownNull\";\n    default:\n      return \"UnknownFalse\";\n  }\n}\n\nfunction parseBooleanOptions(fieldJson) {\n  let raw = JsonUtils.dictGet(fieldJson, \"booleanOptions\");\n  if (raw === undefined) {\n    return;\n  }\n  let raw$1 = Primitive_option.valFromOption(raw);\n  let m = JsonUtils.dictGet(raw$1, \"mode\");\n  let mode = m !== undefined ? parseBooleanMode(Primitive_option.valFromOption(m)) : undefined;\n  let trueValues = JsonUtils.dictGet(raw$1, \"trueValues\");\n  let falseValues = JsonUtils.dictGet(raw$1, \"falseValues\");\n  let attribute = JsonUtils.dictGet(raw$1, \"attribute\");\n  let s = JsonUtils.dictGet(raw$1, \"onUnknown\");\n  let onUnknown = s !== undefined ? parseBooleanUnknownPolicy(Primitive_option.valFromOption(s)) : undefined;\n  return {\n    mode: mode,\n    trueValues: trueValues,\n    falseValues: falseValues,\n    attribute: attribute,\n    onUnknown: onUnknown\n  };\n}\n\nfunction parseColumnFieldTypeVisitor_text(columnJson) {\n  return {\n    TAG: \"Ok\",\n    _0: {\n      TAG: \"ColumnText\",\n      _0: parseTextOptions(columnJson)\n    }\n  };\n}\n\nfunction parseColumnFieldTypeVisitor_html(columnJson) {\n  return {\n    TAG: \"Ok\",\n    _0: {\n      TAG: \"ColumnHtml\",\n      _0: parseHtmlOptions(columnJson)\n    }\n  };\n}\n\nfunction parseColumnFieldTypeVisitor_number(columnJson) {\n  return {\n    TAG: \"Ok\",\n    _0: {\n      TAG: \"ColumnNumber\",\n      _0: parseNumberOptions(columnJson)\n    }\n  };\n}\n\nfunction parseColumnFieldTypeVisitor_boolean(columnJson) {\n  return {\n    TAG: \"Ok\",\n    _0: {\n      TAG: \"ColumnBoolean\",\n      _0: parseBooleanOptions(columnJson)\n    }\n  };\n}\n\nfunction parseColumnFieldTypeVisitor_url(columnJson) {\n  return {\n    TAG: \"Ok\",\n    _0: {\n      TAG: \"ColumnUrl\",\n      _0: parseUrlOptions(columnJson)\n    }\n  };\n}\n\nfunction parseColumnFieldTypeVisitor_json(columnJson) {\n  return {\n    TAG: \"Ok\",\n    _0: {\n      TAG: \"ColumnJson\",\n      _0: parseJsonOptions(columnJson)\n    }\n  };\n}\n\nfunction parseColumnFieldTypeVisitor_datetime(columnJson) {\n  return {\n    TAG: \"Ok\",\n    _0: {\n      TAG: \"ColumnDateTime\",\n      _0: parseDateOptions(columnJson)\n    }\n  };\n}\n\nfunction parseColumnFieldTypeVisitor_list(columnJson) {\n  return {\n    TAG: \"Ok\",\n    _0: {\n      TAG: \"ColumnList\",\n      _0: parseListOptions(columnJson)\n    }\n  };\n}\n\nfunction parseColumnFieldTypeVisitor_attribute(columnJson) {\n  let cfg = parseAttributeConfig(columnJson);\n  if (cfg !== undefined) {\n    return {\n      TAG: \"Ok\",\n      _0: {\n        TAG: \"ColumnAttribute\",\n        _0: cfg\n      }\n    };\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: \"attribute column requires an \\\"attribute\\\" or \\\"attributes\\\" key\"\n    };\n  }\n}\n\nfunction parseColumnFieldTypeDispatch(columnJson, typeName) {\n  switch (typeName) {\n    case \"attribute\" :\n      return parseColumnFieldTypeVisitor_attribute(columnJson);\n    case \"bool\" :\n    case \"boolean\" :\n      return parseColumnFieldTypeVisitor_boolean(columnJson);\n    case \"count\" :\n      return {\n        TAG: \"Error\",\n        _0: \"table column type \\\"count\\\" is not supported\"\n      };\n    case \"datetime\" :\n      return parseColumnFieldTypeVisitor_datetime(columnJson);\n    case \"html\" :\n      return parseColumnFieldTypeVisitor_html(columnJson);\n    case \"json\" :\n      return parseColumnFieldTypeVisitor_json(columnJson);\n    case \"list\" :\n      return parseColumnFieldTypeVisitor_list(columnJson);\n    case \"number\" :\n      return parseColumnFieldTypeVisitor_number(columnJson);\n    case \"table\" :\n      return {\n        TAG: \"Error\",\n        _0: \"nested table columns are not supported\"\n      };\n    case \"text\" :\n      return parseColumnFieldTypeVisitor_text(columnJson);\n    case \"url\" :\n      return parseColumnFieldTypeVisitor_url(columnJson);\n    default:\n      return {\n        TAG: \"Error\",\n        _0: `Unknown column type: \"` + typeName + `\"`\n      };\n  }\n}\n\nfunction parseColumnField(columnJson) {\n  let match = JsonUtils.dictGet(columnJson, \"name\");\n  let match$1 = JsonUtils.dictGet(columnJson, \"selector\");\n  if (match === undefined) {\n    return {\n      TAG: \"Error\",\n      _0: \"table column is missing required key \\\"name\\\"\"\n    };\n  }\n  if (match$1 === undefined) {\n    return {\n      TAG: \"Error\",\n      _0: \"table column is missing required key \\\"selector\\\"\"\n    };\n  }\n  let t = JsonUtils.dictGet(columnJson, \"type\");\n  let rawType = t !== undefined ? Primitive_option.valFromOption(t) : \"text\";\n  let msg = parseColumnFieldTypeDispatch(columnJson, rawType);\n  if (msg.TAG !== \"Ok\") {\n    return {\n      TAG: \"Error\",\n      _0: msg._0\n    };\n  }\n  let required = Stdlib_Option.getOr(JsonUtils.dictGet(columnJson, \"required\"), false);\n  let $$default = JsonUtils.dictGet(columnJson, \"default\");\n  return {\n    TAG: \"Ok\",\n    _0: {\n      name: Primitive_option.valFromOption(match),\n      selector: Primitive_option.valFromOption(match$1),\n      columnType: msg._0,\n      required: required,\n      default: $$default\n    }\n  };\n}\n\nfunction parseTableOptions(fieldJson) {\n  let raw = JsonUtils.dictGet(fieldJson, \"tableOptions\");\n  if (raw === undefined) {\n    return {\n      TAG: \"Error\",\n      _0: \"table field requires a \\\"tableOptions\\\" object\"\n    };\n  }\n  let raw$1 = Primitive_option.valFromOption(raw);\n  let rowSelector = JsonUtils.dictGet(raw$1, \"rowSelector\");\n  let columnsRaw = JsonUtils.dictGet(raw$1, \"columns\");\n  if (columnsRaw === undefined) {\n    return {\n      TAG: \"Error\",\n      _0: \"table field requires \\\"tableOptions.columns\\\"\"\n    };\n  }\n  if (columnsRaw.length === 0) {\n    return {\n      TAG: \"Error\",\n      _0: \"table field requires at least one column in \\\"tableOptions.columns\\\"\"\n    };\n  }\n  let parsedColumnsResult = columnsRaw.values().reduce((acc, colJson) => {\n    if (acc.TAG !== \"Ok\") {\n      return {\n        TAG: \"Error\",\n        _0: acc._0\n      };\n    }\n    let parsedCols = acc._0;\n    let e = parseColumnField(colJson);\n    if (e.TAG !== \"Ok\") {\n      return {\n        TAG: \"Error\",\n        _0: e._0\n      };\n    }\n    parsedCols.push(e._0);\n    return {\n      TAG: \"Ok\",\n      _0: parsedCols\n    };\n  }, {\n    TAG: \"Ok\",\n    _0: []\n  });\n  if (parsedColumnsResult.TAG === \"Ok\") {\n    return {\n      TAG: \"Ok\",\n      _0: {\n        rowSelector: rowSelector,\n        columns: parsedColumnsResult._0\n      }\n    };\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: parsedColumnsResult._0\n    };\n  }\n}\n\nexport {\n  parseTextOptions,\n  parseHtmlOptions,\n  parseAttributeConfig,\n  parseErrorPolicy,\n  parseBooleanUnknownPolicy,\n  parseNumberOptions,\n  parseBooleanOptions,\n  parseCountOptions,\n  parseUrlOptions,\n  parseJsonOptions,\n  parseDateOptions,\n  parseListOptions,\n  parseTableOptions,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as JsonUtils from \"../utils/JsonUtils.res.mjs\";\nimport * as OptionsParser from \"./OptionsParser.res.mjs\";\nimport * as Stdlib_Option from \"@rescript/runtime/lib/es6/Stdlib_Option.js\";\nimport * as Primitive_option from \"@rescript/runtime/lib/es6/Primitive_option.js\";\n\nfunction parseFieldTypeVisitor_text(fieldJson) {\n  return {\n    TAG: \"Ok\",\n    _0: {\n      TAG: \"Text\",\n      _0: OptionsParser.parseTextOptions(fieldJson)\n    }\n  };\n}\n\nfunction parseFieldTypeVisitor_html(fieldJson) {\n  return {\n    TAG: \"Ok\",\n    _0: {\n      TAG: \"Html\",\n      _0: OptionsParser.parseHtmlOptions(fieldJson)\n    }\n  };\n}\n\nfunction parseFieldTypeVisitor_number(fieldJson) {\n  return {\n    TAG: \"Ok\",\n    _0: {\n      TAG: \"Number\",\n      _0: OptionsParser.parseNumberOptions(fieldJson)\n    }\n  };\n}\n\nfunction parseFieldTypeVisitor_boolean(fieldJson) {\n  return {\n    TAG: \"Ok\",\n    _0: {\n      TAG: \"Boolean\",\n      _0: OptionsParser.parseBooleanOptions(fieldJson)\n    }\n  };\n}\n\nfunction parseFieldTypeVisitor_count(fieldJson) {\n  return {\n    TAG: \"Ok\",\n    _0: {\n      TAG: \"Count\",\n      _0: OptionsParser.parseCountOptions(fieldJson)\n    }\n  };\n}\n\nfunction parseFieldTypeVisitor_url(fieldJson) {\n  return {\n    TAG: \"Ok\",\n    _0: {\n      TAG: \"Url\",\n      _0: OptionsParser.parseUrlOptions(fieldJson)\n    }\n  };\n}\n\nfunction parseFieldTypeVisitor_json(fieldJson) {\n  return {\n    TAG: \"Ok\",\n    _0: {\n      TAG: \"Json\",\n      _0: OptionsParser.parseJsonOptions(fieldJson)\n    }\n  };\n}\n\nfunction parseFieldTypeVisitor_datetime(fieldJson) {\n  return {\n    TAG: \"Ok\",\n    _0: {\n      TAG: \"DateTime\",\n      _0: OptionsParser.parseDateOptions(fieldJson)\n    }\n  };\n}\n\nfunction parseFieldTypeVisitor_list(fieldJson) {\n  return {\n    TAG: \"Ok\",\n    _0: {\n      TAG: \"List\",\n      _0: OptionsParser.parseListOptions(fieldJson)\n    }\n  };\n}\n\nfunction parseFieldTypeVisitor_table(fieldJson) {\n  let opts = OptionsParser.parseTableOptions(fieldJson);\n  if (opts.TAG === \"Ok\") {\n    return {\n      TAG: \"Ok\",\n      _0: {\n        TAG: \"Table\",\n        _0: opts._0\n      }\n    };\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: opts._0\n    };\n  }\n}\n\nfunction parseFieldTypeVisitor_attribute(fieldJson) {\n  let cfg = OptionsParser.parseAttributeConfig(fieldJson);\n  if (cfg !== undefined) {\n    return {\n      TAG: \"Ok\",\n      _0: {\n        TAG: \"Attribute\",\n        _0: cfg\n      }\n    };\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: \"attribute field requires an \\\"attribute\\\" or \\\"attributes\\\" key\"\n    };\n  }\n}\n\nfunction parseFieldType(fieldJson, typeName) {\n  switch (typeName) {\n    case \"attribute\" :\n      return parseFieldTypeVisitor_attribute(fieldJson);\n    case \"bool\" :\n    case \"boolean\" :\n      return parseFieldTypeVisitor_boolean(fieldJson);\n    case \"count\" :\n      return parseFieldTypeVisitor_count(fieldJson);\n    case \"datetime\" :\n      return parseFieldTypeVisitor_datetime(fieldJson);\n    case \"html\" :\n      return parseFieldTypeVisitor_html(fieldJson);\n    case \"json\" :\n      return parseFieldTypeVisitor_json(fieldJson);\n    case \"list\" :\n      return parseFieldTypeVisitor_list(fieldJson);\n    case \"number\" :\n      return parseFieldTypeVisitor_number(fieldJson);\n    case \"table\" :\n      return parseFieldTypeVisitor_table(fieldJson);\n    case \"text\" :\n      return parseFieldTypeVisitor_text(fieldJson);\n    case \"url\" :\n      return parseFieldTypeVisitor_url(fieldJson);\n    default:\n      return {\n        TAG: \"Error\",\n        _0: `Unknown type: \"` + typeName + `\"`\n      };\n  }\n}\n\nfunction parseField(fieldJson, fieldName) {\n  let selector = JsonUtils.dictGet(fieldJson, \"selector\");\n  if (selector === undefined) {\n    return {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"MissingFields\",\n        _0: `Field \"` + fieldName + `\" is missing required key \"selector\"`\n      }\n    };\n  }\n  let t = JsonUtils.dictGet(fieldJson, \"type\");\n  let rawType = t !== undefined ? Primitive_option.valFromOption(t) : \"text\";\n  let msg = parseFieldType(fieldJson, rawType);\n  if (msg.TAG !== \"Ok\") {\n    return {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"InvalidFieldType\",\n        field: fieldName,\n        got: msg._0\n      }\n    };\n  }\n  let required = Stdlib_Option.getOr(JsonUtils.dictGet(fieldJson, \"required\"), false);\n  let $$default = JsonUtils.dictGet(fieldJson, \"default\");\n  return {\n    TAG: \"Ok\",\n    _0: {\n      selector: Primitive_option.valFromOption(selector),\n      fieldType: msg._0,\n      required: required,\n      default: $$default\n    }\n  };\n}\n\nexport {\n  parseFieldType,\n  parseField,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as JsonUtils from \"../utils/JsonUtils.res.mjs\";\nimport * as OptionFields from \"./OptionFields.res.mjs\";\nimport * as OptionsParser from \"./OptionsParser.res.mjs\";\nimport * as Stdlib_Option from \"@rescript/runtime/lib/es6/Stdlib_Option.js\";\nimport * as Primitive_option from \"@rescript/runtime/lib/es6/Primitive_option.js\";\n\nfunction parseHtmlDefaults(raw) {\n  let match = JsonUtils.dictGet(raw, \"mode\");\n  let mode;\n  if (match !== undefined) {\n    switch (match) {\n      case \"inner\" :\n        mode = \"Inner\";\n        break;\n      case \"outer\" :\n        mode = \"Outer\";\n        break;\n      default:\n        mode = undefined;\n    }\n  } else {\n    mode = undefined;\n  }\n  let stripScripts = JsonUtils.dictGet(raw, \"stripScripts\");\n  let stripStyles = JsonUtils.dictGet(raw, \"stripStyles\");\n  return {\n    mode: mode,\n    stripScripts: stripScripts,\n    stripStyles: stripStyles\n  };\n}\n\nfunction parseNumberDefaults(raw) {\n  let stripNonNumeric = JsonUtils.dictGet(raw, \"stripNonNumeric\");\n  let pattern = JsonUtils.dictGet(raw, \"pattern\");\n  let thousandsSeparator = JsonUtils.dictGet(raw, \"thousandsSeparator\");\n  let decimalSeparator = JsonUtils.dictGet(raw, \"decimalSeparator\");\n  let precision = JsonUtils.dictGet(raw, \"precision\");\n  let allowNegative = JsonUtils.dictGet(raw, \"allowNegative\");\n  let s = JsonUtils.dictGet(raw, \"onError\");\n  let onError = s !== undefined ? OptionsParser.parseErrorPolicy(Primitive_option.valFromOption(s)) : undefined;\n  return {\n    stripNonNumeric: stripNonNumeric,\n    pattern: pattern,\n    thousandsSeparator: thousandsSeparator,\n    decimalSeparator: decimalSeparator,\n    precision: precision,\n    allowNegative: allowNegative,\n    onError: onError\n  };\n}\n\nfunction parseBooleanDefaults(raw) {\n  let match = JsonUtils.dictGet(raw, \"mode\");\n  let mode;\n  if (match !== undefined) {\n    switch (match) {\n      case \"attributeCheck\" :\n        mode = \"AttributeCheck\";\n        break;\n      case \"presence\" :\n        mode = \"Presence\";\n        break;\n      default:\n        mode = \"Mapping\";\n    }\n  } else {\n    mode = undefined;\n  }\n  let trueValues = JsonUtils.dictGet(raw, \"trueValues\");\n  let falseValues = JsonUtils.dictGet(raw, \"falseValues\");\n  let attribute = JsonUtils.dictGet(raw, \"attribute\");\n  let s = JsonUtils.dictGet(raw, \"onUnknown\");\n  let onUnknown = s !== undefined ? OptionsParser.parseBooleanUnknownPolicy(Primitive_option.valFromOption(s)) : undefined;\n  return {\n    mode: mode,\n    trueValues: trueValues,\n    falseValues: falseValues,\n    attribute: attribute,\n    onUnknown: onUnknown\n  };\n}\n\nfunction parseDateDefaults(raw) {\n  let formats = JsonUtils.dictGet(raw, \"formats\");\n  let timezone = JsonUtils.dictGet(raw, \"timezone\");\n  let match = JsonUtils.dictGet(raw, \"output\");\n  let output;\n  if (match !== undefined) {\n    switch (match) {\n      case \"custom\" :\n        let f = JsonUtils.dictGet(raw, \"outputFormat\");\n        let fmt = f !== undefined ? Primitive_option.valFromOption(f) : \"yyyy-MM-dd\";\n        output = {\n          TAG: \"Custom\",\n          _0: fmt\n        };\n        break;\n      case \"epoch\" :\n        output = \"Epoch\";\n        break;\n      case \"epochMillis\" :\n        output = \"EpochMillis\";\n        break;\n      case \"iso8601\" :\n        output = \"Iso8601\";\n        break;\n      default:\n        output = undefined;\n    }\n  } else {\n    output = undefined;\n  }\n  let strict = JsonUtils.dictGet(raw, \"strict\");\n  let source = JsonUtils.dictGet(raw, \"source\");\n  let attribute = JsonUtils.dictGet(raw, \"attribute\");\n  return {\n    formats: formats,\n    timezone: timezone,\n    output: output,\n    strict: strict,\n    source: source,\n    attribute: attribute\n  };\n}\n\nfunction parseUrlDefaults(raw) {\n  let base = JsonUtils.dictGet(raw, \"base\");\n  let resolve = JsonUtils.dictGet(raw, \"resolve\");\n  let validate = JsonUtils.dictGet(raw, \"validate\");\n  let protocol = JsonUtils.dictGet(raw, \"protocol\");\n  let stripQuery = JsonUtils.dictGet(raw, \"stripQuery\");\n  let stripHash = JsonUtils.dictGet(raw, \"stripHash\");\n  let attribute = JsonUtils.dictGet(raw, \"attribute\");\n  return {\n    base: base,\n    resolve: resolve,\n    validate: validate,\n    protocol: protocol,\n    stripQuery: stripQuery,\n    stripHash: stripHash,\n    attribute: attribute\n  };\n}\n\nfunction parseJsonDefaults(raw) {\n  let source = JsonUtils.dictGet(raw, \"source\");\n  let attribute = JsonUtils.dictGet(raw, \"attribute\");\n  let path = JsonUtils.dictGet(raw, \"path\");\n  let s = JsonUtils.dictGet(raw, \"onError\");\n  let onError = s !== undefined ? OptionsParser.parseErrorPolicy(Primitive_option.valFromOption(s)) : undefined;\n  return {\n    source: source,\n    attribute: attribute,\n    path: path,\n    onError: onError\n  };\n}\n\nfunction parseDefaults(schemaJson) {\n  let raw = JsonUtils.dictGet(schemaJson, \"defaults\");\n  if (raw === undefined) {\n    return;\n  }\n  let raw$1 = Primitive_option.valFromOption(raw);\n  let textRaw = JsonUtils.dictGet(raw$1, \"text\");\n  let text = textRaw !== undefined ? OptionFields.parseText(Primitive_option.valFromOption(textRaw)) : undefined;\n  let htmlRaw = JsonUtils.dictGet(raw$1, \"html\");\n  let html = htmlRaw !== undefined ? parseHtmlDefaults(Primitive_option.valFromOption(htmlRaw)) : undefined;\n  let numberRaw = JsonUtils.dictGet(raw$1, \"number\");\n  let number = numberRaw !== undefined ? parseNumberDefaults(Primitive_option.valFromOption(numberRaw)) : undefined;\n  let booleanRaw = JsonUtils.dictGet(raw$1, \"boolean\");\n  let boolean = booleanRaw !== undefined ? parseBooleanDefaults(Primitive_option.valFromOption(booleanRaw)) : undefined;\n  let countRaw = JsonUtils.dictGet(raw$1, \"count\");\n  let count = countRaw !== undefined ? ({}) : undefined;\n  let jsonRaw = JsonUtils.dictGet(raw$1, \"json\");\n  let json = jsonRaw !== undefined ? parseJsonDefaults(Primitive_option.valFromOption(jsonRaw)) : undefined;\n  let dateRaw = JsonUtils.dictGet(raw$1, \"datetime\");\n  let datetime = dateRaw !== undefined ? parseDateDefaults(Primitive_option.valFromOption(dateRaw)) : undefined;\n  let urlRaw = JsonUtils.dictGet(raw$1, \"url\");\n  let url = urlRaw !== undefined ? parseUrlDefaults(Primitive_option.valFromOption(urlRaw)) : undefined;\n  return {\n    text: text,\n    html: html,\n    number: number,\n    boolean: boolean,\n    count: count,\n    json: json,\n    datetime: datetime,\n    url: url\n  };\n}\n\nfunction parseConfig(schemaJson) {\n  let raw = JsonUtils.dictGet(schemaJson, \"config\");\n  if (raw === undefined) {\n    return {\n      ignoreErrors: false,\n      limit: 0\n    };\n  }\n  let raw$1 = Primitive_option.valFromOption(raw);\n  let match = JsonUtils.dictGet(raw$1, \"ignoreErrors\");\n  let ignoreErrors = match !== undefined ? match : false;\n  let limit = Stdlib_Option.getOr(Stdlib_Option.flatMap(JsonUtils.dictGet(raw$1, \"limit\"), n => {\n    if (n == null) {\n      return;\n    } else {\n      return Primitive_option.some(n);\n    }\n  }), 0);\n  let rowSelector = JsonUtils.dictGet(raw$1, \"rowSelector\");\n  let defaults = parseDefaults(raw$1);\n  if (defaults !== undefined) {\n    return {\n      ignoreErrors: ignoreErrors,\n      limit: limit,\n      rowSelector: rowSelector,\n      defaults: defaults\n    };\n  } else {\n    return {\n      ignoreErrors: ignoreErrors,\n      limit: limit,\n      rowSelector: rowSelector\n    };\n  }\n}\n\nexport {\n  parseConfig,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\n\nlet toFieldsObject = (function(rawFields) {\n  if (Array.isArray(rawFields)) {\n    return Object.fromEntries(\n      rawFields\n        .filter(function(f) { return f && typeof f === 'object' && typeof f.name === 'string'; })\n        .map(function(f) { return [f.name, f]; })\n    );\n  }\n  return rawFields;\n});\n\nexport {\n  toFieldsObject,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as JsonUtils from \"../utils/JsonUtils.res.mjs\";\nimport * as FieldParser from \"./FieldParser.res.mjs\";\nimport * as ConfigParser from \"./ConfigParser.res.mjs\";\nimport * as ObjectBinding from \"../../../bindings/ObjectBinding.res.mjs\";\nimport * as Primitive_option from \"@rescript/runtime/lib/es6/Primitive_option.js\";\n\nfunction normalizeFields(fieldsObj) {\n  let keys = Object.keys(fieldsObj);\n  return keys.values().reduce((acc, key) => {\n    if (acc.TAG !== \"Ok\") {\n      return acc;\n    }\n    let pairs = acc._0;\n    let fieldJson = JsonUtils.dictGet(fieldsObj, key);\n    if (fieldJson === undefined) {\n      return {\n        TAG: \"Ok\",\n        _0: pairs\n      };\n    }\n    let e = FieldParser.parseField(Primitive_option.valFromOption(fieldJson), key);\n    if (e.TAG === \"Ok\") {\n      return {\n        TAG: \"Ok\",\n        _0: pairs.concat([[\n            key,\n            e._0\n          ]])\n      };\n    } else {\n      return {\n        TAG: \"Error\",\n        _0: e._0\n      };\n    }\n  }, {\n    TAG: \"Ok\",\n    _0: []\n  });\n}\n\nfunction parseSchema(jsonValue) {\n  let fieldsRaw = JsonUtils.dictGet(jsonValue, \"fields\");\n  if (fieldsRaw === undefined) {\n    return {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"MissingFields\",\n        _0: \"Schema JSON is missing the \\\"fields\\\" key\"\n      }\n    };\n  }\n  let fieldsObj = ObjectBinding.toFieldsObject(Primitive_option.valFromOption(fieldsRaw));\n  let e = normalizeFields(fieldsObj);\n  if (e.TAG !== \"Ok\") {\n    return {\n      TAG: \"Error\",\n      _0: e._0\n    };\n  }\n  let config = ConfigParser.parseConfig(jsonValue);\n  let version = JsonUtils.dictGet(jsonValue, \"version\");\n  let name = JsonUtils.dictGet(jsonValue, \"name\");\n  let description = JsonUtils.dictGet(jsonValue, \"description\");\n  return {\n    TAG: \"Ok\",\n    _0: {\n      version: version,\n      name: name,\n      description: description,\n      fields: e._0,\n      config: config\n    }\n  };\n}\n\nexport {\n  parseSchema,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\n\nfunction isMultiElementType(ft) {\n  switch (ft.TAG) {\n    case \"Count\" :\n    case \"List\" :\n      return true;\n    default:\n      return false;\n  }\n}\n\nexport {\n  isMultiElementType,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\n\nfunction visitFieldType(v, ft) {\n  switch (ft.TAG) {\n    case \"Text\" :\n      return v.text(ft._0);\n    case \"Attribute\" :\n      return v.attribute(ft._0);\n    case \"Html\" :\n      return v.html(ft._0);\n    case \"Number\" :\n      return v.number(ft._0);\n    case \"Boolean\" :\n      return v.boolean(ft._0);\n    case \"Count\" :\n      return v.count(ft._0);\n    case \"Url\" :\n      return v.url(ft._0);\n    case \"Json\" :\n      return v.json(ft._0);\n    case \"DateTime\" :\n      return v.datetime(ft._0);\n    case \"List\" :\n      return v.list(ft._0);\n    case \"Table\" :\n      return v.table(ft._0);\n  }\n}\n\nfunction visitColumnFieldType(v, cft) {\n  switch (cft.TAG) {\n    case \"ColumnText\" :\n      return v.columnText(cft._0);\n    case \"ColumnAttribute\" :\n      return v.columnAttribute(cft._0);\n    case \"ColumnHtml\" :\n      return v.columnHtml(cft._0);\n    case \"ColumnNumber\" :\n      return v.columnNumber(cft._0);\n    case \"ColumnBoolean\" :\n      return v.columnBoolean(cft._0);\n    case \"ColumnUrl\" :\n      return v.columnUrl(cft._0);\n    case \"ColumnJson\" :\n      return v.columnJson(cft._0);\n    case \"ColumnDateTime\" :\n      return v.columnDateTime(cft._0);\n    case \"ColumnList\" :\n      return v.columnList(cft._0);\n  }\n}\n\nexport {\n  visitFieldType,\n  visitColumnFieldType,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as FieldTypeVisitor from \"../FieldTypeVisitor.res.mjs\";\nimport * as Primitive_option from \"@rescript/runtime/lib/es6/Primitive_option.js\";\n\nfunction pickOption(current, fallback) {\n  if (current !== undefined) {\n    return Primitive_option.some(Primitive_option.valFromOption(current));\n  } else {\n    return fallback;\n  }\n}\n\nfunction applyDefaults(fieldOpts, defaultOpts, mergeFn) {\n  if (defaultOpts === undefined) {\n    return fieldOpts;\n  }\n  let def = Primitive_option.valFromOption(defaultOpts);\n  if (fieldOpts !== undefined) {\n    return Primitive_option.some(mergeFn(Primitive_option.valFromOption(fieldOpts), def));\n  } else {\n    return Primitive_option.some(def);\n  }\n}\n\nfunction mergeTextOptions(fieldOpts, defaultOpts) {\n  return applyDefaults(fieldOpts, defaultOpts, (opts, def) => ({\n    trim: pickOption(opts.trim, def.trim),\n    normalizeWhitespace: pickOption(opts.normalizeWhitespace, def.normalizeWhitespace),\n    lowercase: pickOption(opts.lowercase, def.lowercase),\n    uppercase: pickOption(opts.uppercase, def.uppercase),\n    pattern: pickOption(opts.pattern, def.pattern),\n    join: pickOption(opts.join, def.join)\n  }));\n}\n\nfunction mergeHtmlOptions(fieldOpts, defaultOpts) {\n  return applyDefaults(fieldOpts, defaultOpts, (opts, def) => ({\n    mode: pickOption(opts.mode, def.mode),\n    stripScripts: pickOption(opts.stripScripts, def.stripScripts),\n    stripStyles: pickOption(opts.stripStyles, def.stripStyles)\n  }));\n}\n\nfunction mergeNumberOptions(fieldOpts, defaultOpts) {\n  return applyDefaults(fieldOpts, defaultOpts, (opts, def) => ({\n    stripNonNumeric: pickOption(opts.stripNonNumeric, def.stripNonNumeric),\n    pattern: pickOption(opts.pattern, def.pattern),\n    thousandsSeparator: pickOption(opts.thousandsSeparator, def.thousandsSeparator),\n    decimalSeparator: pickOption(opts.decimalSeparator, def.decimalSeparator),\n    precision: pickOption(opts.precision, def.precision),\n    allowNegative: pickOption(opts.allowNegative, def.allowNegative),\n    onError: pickOption(opts.onError, def.onError)\n  }));\n}\n\nfunction mergeBooleanOptions(fieldOpts, defaultOpts) {\n  return applyDefaults(fieldOpts, defaultOpts, (opts, def) => ({\n    mode: pickOption(opts.mode, def.mode),\n    trueValues: pickOption(opts.trueValues, def.trueValues),\n    falseValues: pickOption(opts.falseValues, def.falseValues),\n    attribute: pickOption(opts.attribute, def.attribute),\n    onUnknown: pickOption(opts.onUnknown, def.onUnknown)\n  }));\n}\n\nfunction mergeCountOptions(fieldOpts, defaultOpts) {\n  if (fieldOpts !== undefined) {\n    return fieldOpts;\n  } else {\n    return defaultOpts;\n  }\n}\n\nfunction mergeDateOptions(fieldOpts, defaultOpts) {\n  return applyDefaults(fieldOpts, defaultOpts, (opts, def) => ({\n    formats: pickOption(opts.formats, def.formats),\n    timezone: pickOption(opts.timezone, def.timezone),\n    output: pickOption(opts.output, def.output),\n    strict: pickOption(opts.strict, def.strict),\n    source: pickOption(opts.source, def.source),\n    attribute: pickOption(opts.attribute, def.attribute)\n  }));\n}\n\nfunction mergeUrlOptions(fieldOpts, defaultOpts) {\n  return applyDefaults(fieldOpts, defaultOpts, (opts, def) => ({\n    base: pickOption(opts.base, def.base),\n    resolve: pickOption(opts.resolve, def.resolve),\n    validate: pickOption(opts.validate, def.validate),\n    protocol: pickOption(opts.protocol, def.protocol),\n    stripQuery: pickOption(opts.stripQuery, def.stripQuery),\n    stripHash: pickOption(opts.stripHash, def.stripHash),\n    attribute: pickOption(opts.attribute, def.attribute)\n  }));\n}\n\nfunction mergeJsonOptions(fieldOpts, defaultOpts) {\n  return applyDefaults(fieldOpts, defaultOpts, (opts, def) => ({\n    source: pickOption(opts.source, def.source),\n    attribute: pickOption(opts.attribute, def.attribute),\n    path: pickOption(opts.path, def.path),\n    onError: pickOption(opts.onError, def.onError)\n  }));\n}\n\nfunction resolveDefaults(defaults, fieldType) {\n  let lookup = extract => {\n    if (defaults !== undefined) {\n      return extract(defaults);\n    }\n  };\n  let visitor_text = opts => ({\n    TAG: \"Text\",\n    _0: mergeTextOptions(opts, lookup(d => d.text))\n  });\n  let visitor_attribute = cfg => ({\n    TAG: \"Attribute\",\n    _0: cfg\n  });\n  let visitor_html = opts => ({\n    TAG: \"Html\",\n    _0: mergeHtmlOptions(opts, lookup(d => d.html))\n  });\n  let visitor_number = opts => ({\n    TAG: \"Number\",\n    _0: mergeNumberOptions(opts, lookup(d => d.number))\n  });\n  let visitor_boolean = opts => ({\n    TAG: \"Boolean\",\n    _0: mergeBooleanOptions(opts, lookup(d => d.boolean))\n  });\n  let visitor_count = opts => ({\n    TAG: \"Count\",\n    _0: mergeCountOptions(opts, lookup(d => d.count))\n  });\n  let visitor_url = opts => ({\n    TAG: \"Url\",\n    _0: mergeUrlOptions(opts, lookup(d => d.url))\n  });\n  let visitor_json = opts => ({\n    TAG: \"Json\",\n    _0: mergeJsonOptions(opts, lookup(d => d.json))\n  });\n  let visitor_datetime = opts => ({\n    TAG: \"DateTime\",\n    _0: mergeDateOptions(opts, lookup(d => d.datetime))\n  });\n  let visitor_list = opts => ({\n    TAG: \"List\",\n    _0: opts\n  });\n  let visitor_table = opts => ({\n    TAG: \"Table\",\n    _0: opts\n  });\n  let visitor = {\n    text: visitor_text,\n    attribute: visitor_attribute,\n    html: visitor_html,\n    number: visitor_number,\n    boolean: visitor_boolean,\n    count: visitor_count,\n    url: visitor_url,\n    json: visitor_json,\n    datetime: visitor_datetime,\n    list: visitor_list,\n    table: visitor_table\n  };\n  return FieldTypeVisitor.visitFieldType(visitor, fieldType);\n}\n\nexport {\n  mergeTextOptions,\n  mergeHtmlOptions,\n  mergeNumberOptions,\n  mergeBooleanOptions,\n  mergeCountOptions,\n  mergeDateOptions,\n  mergeUrlOptions,\n  mergeJsonOptions,\n  resolveDefaults,\n}\n/* No side effect */\n","\n\n\nfunction compare(x, y) {\n  if (x === y) {\n    return 0;\n  } else if (x < y) {\n    return -1;\n  } else if (x > y || x === x) {\n    return 1;\n  } else if (y === y) {\n    return -1;\n  } else {\n    return 0;\n  }\n}\n\nfunction min(x, y) {\n  if (x < y) {\n    return x;\n  } else {\n    return y;\n  }\n}\n\nfunction max(x, y) {\n  if (x > y) {\n    return x;\n  } else {\n    return y;\n  }\n}\n\nexport {\n  compare,\n  min,\n  max,\n}\n/* No side effect */\n","\n\nimport * as Primitive_bool from \"./Primitive_bool.js\";\nimport * as Primitive_float from \"./Primitive_float.js\";\nimport * as Primitive_string from \"./Primitive_string.js\";\n\nlet for_in = (function(o,foo){\n        for (var x in o) { foo(x) }});\n\nfunction updateDummy(prim0, prim1) {\n  Object.assign(prim0, prim1);\n}\n\nfunction compare(a, b) {\n  if (a === b) {\n    return 0;\n  }\n  let a_type = typeof a;\n  let b_type = typeof b;\n  switch (a_type) {\n    case \"bigint\" :\n      if (b_type === \"bigint\") {\n        return Primitive_float.compare(a, b);\n      }\n      break;\n    case \"boolean\" :\n      if (b_type === \"boolean\") {\n        return Primitive_bool.compare(a, b);\n      }\n      break;\n    case \"function\" :\n      if (b_type === \"function\") {\n        throw {\n          RE_EXN_ID: \"Invalid_argument\",\n          _1: \"compare: functional value\",\n          Error: new Error()\n        };\n      }\n      break;\n    case \"number\" :\n      if (b_type === \"number\") {\n        return Primitive_float.compare(a, b);\n      }\n      break;\n    case \"string\" :\n      if (b_type === \"string\") {\n        return Primitive_string.compare(a, b);\n      } else {\n        return 1;\n      }\n    case \"undefined\" :\n      return -1;\n  }\n  switch (b_type) {\n    case \"string\" :\n      return -1;\n    case \"undefined\" :\n      return 1;\n    default:\n      if (a_type === \"boolean\") {\n        return 1;\n      }\n      if (b_type === \"boolean\") {\n        return -1;\n      }\n      if (a_type === \"function\") {\n        return 1;\n      }\n      if (b_type === \"function\") {\n        return -1;\n      }\n      if (a_type === \"number\") {\n        if (b === null || b.BS_PRIVATE_NESTED_SOME_NONE !== undefined) {\n          return 1;\n        } else {\n          return -1;\n        }\n      }\n      if (b_type === \"number\") {\n        if (a === null || a.BS_PRIVATE_NESTED_SOME_NONE !== undefined) {\n          return -1;\n        } else {\n          return 1;\n        }\n      }\n      if (a === null) {\n        if (b.BS_PRIVATE_NESTED_SOME_NONE !== undefined) {\n          return 1;\n        } else {\n          return -1;\n        }\n      }\n      if (b === null) {\n        if (a.BS_PRIVATE_NESTED_SOME_NONE !== undefined) {\n          return -1;\n        } else {\n          return 1;\n        }\n      }\n      if (a.BS_PRIVATE_NESTED_SOME_NONE !== undefined) {\n        if (b.BS_PRIVATE_NESTED_SOME_NONE !== undefined) {\n          return aux_obj_compare(a, b);\n        } else {\n          return -1;\n        }\n      }\n      let tag_a = a.TAG;\n      let tag_b = b.TAG;\n      if (tag_a !== tag_b) {\n        if (tag_a < tag_b) {\n          return -1;\n        } else {\n          return 1;\n        }\n      }\n      let len_a = a.length | 0;\n      let len_b = b.length | 0;\n      if (len_a === len_b) {\n        if (Array.isArray(a)) {\n          let _i = 0;\n          while (true) {\n            let i = _i;\n            if (i === len_a) {\n              return 0;\n            }\n            let res = compare(a[i], b[i]);\n            if (res !== 0) {\n              return res;\n            }\n            _i = i + 1 | 0;\n            continue;\n          };\n        } else if ((a instanceof Date && b instanceof Date)) {\n          return (a - b);\n        } else {\n          return aux_obj_compare(a, b);\n        }\n      } else if (len_a < len_b) {\n        let _i$1 = 0;\n        while (true) {\n          let i$1 = _i$1;\n          if (i$1 === len_a) {\n            return -1;\n          }\n          let res$1 = compare(a[i$1], b[i$1]);\n          if (res$1 !== 0) {\n            return res$1;\n          }\n          _i$1 = i$1 + 1 | 0;\n          continue;\n        };\n      } else {\n        let _i$2 = 0;\n        while (true) {\n          let i$2 = _i$2;\n          if (i$2 === len_b) {\n            return 1;\n          }\n          let res$2 = compare(a[i$2], b[i$2]);\n          if (res$2 !== 0) {\n            return res$2;\n          }\n          _i$2 = i$2 + 1 | 0;\n          continue;\n        };\n      }\n  }\n}\n\nfunction aux_obj_compare(a, b) {\n  let min_key_lhs = {\n    contents: undefined\n  };\n  let min_key_rhs = {\n    contents: undefined\n  };\n  let do_key = (param, key) => {\n    let min_key = param[2];\n    let b = param[1];\n    if (!(!Object.prototype.hasOwnProperty.call(b, key) || compare(param[0][key], b[key]) > 0)) {\n      return;\n    }\n    let mk = min_key.contents;\n    if (mk !== undefined && key >= mk) {\n      return;\n    } else {\n      min_key.contents = key;\n      return;\n    }\n  };\n  let do_key_a = key => do_key([\n    a,\n    b,\n    min_key_rhs\n  ], key);\n  let do_key_b = key => do_key([\n    b,\n    a,\n    min_key_lhs\n  ], key);\n  for_in(a, do_key_a);\n  for_in(b, do_key_b);\n  let match = min_key_lhs.contents;\n  let match$1 = min_key_rhs.contents;\n  if (match !== undefined) {\n    if (match$1 !== undefined) {\n      return Primitive_string.compare(match, match$1);\n    } else {\n      return -1;\n    }\n  } else if (match$1 !== undefined) {\n    return 1;\n  } else {\n    return 0;\n  }\n}\n\nfunction equal(a, b) {\n  if (a === b) {\n    return true;\n  }\n  let a_type = typeof a;\n  if (a_type === \"string\" || a_type === \"number\" || a_type === \"bigint\" || a_type === \"boolean\" || a_type === \"undefined\" || a === null) {\n    return false;\n  }\n  let b_type = typeof b;\n  if (a_type === \"function\" || b_type === \"function\") {\n    throw {\n      RE_EXN_ID: \"Invalid_argument\",\n      _1: \"equal: functional value\",\n      Error: new Error()\n    };\n  }\n  if (b_type === \"number\" || b_type === \"bigint\" || b_type === \"undefined\" || b === null) {\n    return false;\n  }\n  let tag_a = a.TAG;\n  let tag_b = b.TAG;\n  if (tag_a !== tag_b) {\n    return false;\n  }\n  let len_a = a.length | 0;\n  let len_b = b.length | 0;\n  if (len_a === len_b) {\n    if (Array.isArray(a)) {\n      let _i = 0;\n      while (true) {\n        let i = _i;\n        if (i === len_a) {\n          return true;\n        }\n        if (!equal(a[i], b[i])) {\n          return false;\n        }\n        _i = i + 1 | 0;\n        continue;\n      };\n    } else if ((a instanceof Date && b instanceof Date)) {\n      return !(a > b || a < b);\n    } else {\n      let result = {\n        contents: true\n      };\n      let do_key_a = key => {\n        if (!Object.prototype.hasOwnProperty.call(b, key)) {\n          result.contents = false;\n          return;\n        }\n      };\n      let do_key_b = key => {\n        if (!Object.prototype.hasOwnProperty.call(a, key) || !equal(b[key], a[key])) {\n          result.contents = false;\n          return;\n        }\n      };\n      for_in(a, do_key_a);\n      if (result.contents) {\n        for_in(b, do_key_b);\n      }\n      return result.contents;\n    }\n  } else {\n    return false;\n  }\n}\n\nfunction notequal(a, b) {\n  if ((typeof a === \"number\" || typeof a === \"bigint\") && (typeof b === \"number\" || typeof b === \"bigint\")) {\n    return a !== b;\n  } else {\n    return !equal(a, b);\n  }\n}\n\nfunction greaterequal(a, b) {\n  if ((typeof a === \"number\" || typeof a === \"bigint\") && (typeof b === \"number\" || typeof b === \"bigint\")) {\n    return a >= b;\n  } else {\n    return compare(a, b) >= 0;\n  }\n}\n\nfunction greaterthan(a, b) {\n  if ((typeof a === \"number\" || typeof a === \"bigint\") && (typeof b === \"number\" || typeof b === \"bigint\")) {\n    return a > b;\n  } else {\n    return compare(a, b) > 0;\n  }\n}\n\nfunction lessequal(a, b) {\n  if ((typeof a === \"number\" || typeof a === \"bigint\") && (typeof b === \"number\" || typeof b === \"bigint\")) {\n    return a <= b;\n  } else {\n    return compare(a, b) <= 0;\n  }\n}\n\nfunction lessthan(a, b) {\n  if ((typeof a === \"number\" || typeof a === \"bigint\") && (typeof b === \"number\" || typeof b === \"bigint\")) {\n    return a < b;\n  } else {\n    return compare(a, b) < 0;\n  }\n}\n\nfunction min(x, y) {\n  if (compare(x, y) <= 0) {\n    return x;\n  } else {\n    return y;\n  }\n}\n\nfunction max(x, y) {\n  if (compare(x, y) >= 0) {\n    return x;\n  } else {\n    return y;\n  }\n}\n\nexport {\n  updateDummy,\n  compare,\n  equal,\n  notequal,\n  greaterequal,\n  greaterthan,\n  lessthan,\n  lessequal,\n  min,\n  max,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as NodeHtmlParser from \"node-html-parser\";\n\nfunction parse(prim) {\n  return NodeHtmlParser.parse(prim);\n}\n\nfunction querySelectorAll(prim0, prim1) {\n  return prim0.querySelectorAll(prim1);\n}\n\nfunction querySelector(prim0, prim1) {\n  return prim0.querySelector(prim1);\n}\n\nfunction getAttribute(prim0, prim1) {\n  return prim0.getAttribute(prim1);\n}\n\nexport {\n  parse,\n  querySelectorAll,\n  querySelector,\n  getAttribute,\n}\n/* node-html-parser Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as Nodeurl from \"node:url\";\nimport * as Stdlib_Option from \"@rescript/runtime/lib/es6/Stdlib_Option.js\";\nimport * as Primitive_object from \"@rescript/runtime/lib/es6/Primitive_object.js\";\nimport * as Primitive_option from \"@rescript/runtime/lib/es6/Primitive_option.js\";\nimport * as NodeHtmlParserBinding from \"../../../bindings/NodeHtmlParserBinding.res.mjs\";\n\nfunction defaultAttribute(tagName) {\n  switch (tagName) {\n    case \"IFRAME\" :\n    case \"IMG\" :\n    case \"SOURCE\" :\n      return \"src\";\n    default:\n      return \"href\";\n  }\n}\n\nfunction isSafeProtocol(protocol) {\n  switch (protocol) {\n    case \"http:\" :\n    case \"https:\" :\n      return true;\n    default:\n      return false;\n  }\n}\n\nfunction getUrlAttribute(el, explicitAttr) {\n  let attrName = explicitAttr !== undefined ? explicitAttr : defaultAttribute(el.tagName);\n  return Primitive_option.fromNullable(NodeHtmlParserBinding.getAttribute(el, attrName));\n}\n\nfunction extract(el, opts) {\n  let raw = getUrlAttribute(el, opts !== undefined ? opts.attribute : undefined);\n  if (raw === undefined) {\n    return;\n  }\n  if (raw === \"\") {\n    return;\n  }\n  let shouldResolve = opts !== undefined ? Stdlib_Option.getOr(opts.resolve, true) : true;\n  opts !== undefined ? Stdlib_Option.getOr(opts.validate, true) : true;\n  let baseUrl = opts !== undefined ? opts.base : undefined;\n  let resolvedUrl;\n  if (shouldResolve && Stdlib_Option.isSome(baseUrl)) {\n    try {\n      resolvedUrl = new Nodeurl.URL(raw, baseUrl);\n    } catch (exn) {\n      resolvedUrl = undefined;\n    }\n  } else {\n    try {\n      resolvedUrl = new Nodeurl.URL(raw, undefined);\n    } catch (exn$1) {\n      resolvedUrl = undefined;\n    }\n  }\n  if (resolvedUrl === undefined) {\n    return;\n  }\n  let protoOk;\n  if (opts !== undefined) {\n    let p = opts.protocol;\n    if (p !== undefined) {\n      let expected = p.endsWith(\":\") ? p : p + \":\";\n      protoOk = resolvedUrl.protocol === expected;\n    } else {\n      protoOk = true;\n    }\n  } else {\n    protoOk = true;\n  }\n  if (!protoOk) {\n    return;\n  }\n  if (!isSafeProtocol(resolvedUrl.protocol)) {\n    return;\n  }\n  let final = resolvedUrl.href;\n  if (opts !== undefined ? Primitive_object.equal(opts.stripQuery, true) : false) {\n    final = Stdlib_Option.getOr(resolvedUrl.href.split(\"?\")[0], final);\n  }\n  if (opts !== undefined ? Primitive_object.equal(opts.stripHash, true) : false) {\n    final = Stdlib_Option.getOr(final.split(\"#\")[0], final);\n  }\n  return final;\n}\n\nexport {\n  extract,\n}\n/* node:url Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\n\nlet compileSafePattern = (function(pattern) {\n  if (!pattern || typeof pattern !== \"string\") return undefined;\n  if (pattern.length > 200) return undefined;\n\n  // Disallow backreferences: \\1, \\2, ...\n  if (/\\\\[1-9][0-9]*/.test(pattern)) return undefined;\n\n  // Disallow lookaheads/lookbehinds\n  if (/\\(\\?[:=!<]/.test(pattern)) return undefined;\n\n  // Disallow nested quantified groups (e.g. (a+)+, (a*)+, (a{1,3})*)\n  if (/\\([^)]*[+*?][^)]*\\)\\s*[+*?]/.test(pattern)) return undefined;\n  if (/\\([^)]*\\{[^}]+\\}[^)]*\\)\\s*[+*?]/.test(pattern)) return undefined;\n\n  // Disallow quantified alternation groups (often expensive)\n  if (/\\((?:[^()]*\\|){1,}[^()]*\\)\\s*[+*{]/.test(pattern)) return undefined;\n\n  // Disallow very large explicit quantifiers\n  if (/\\{(?:\\d{4,}|\\d+,\\d{4,}|\\d{4,},)\\}/.test(pattern)) return undefined;\n\n  try {\n    return new RegExp(pattern);\n  } catch (e) {\n    return undefined;\n  }\n});\n\nexport {\n  compileSafePattern,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as RegexBinding from \"../../../bindings/RegexBinding.res.mjs\";\nimport * as Primitive_option from \"@rescript/runtime/lib/es6/Primitive_option.js\";\n\nfunction trimStr(text) {\n  return text.trim();\n}\n\nfunction normalizeWhitespace(text) {\n  return text.replace(/\\s+/g, \" \").trim();\n}\n\nfunction toLower(text) {\n  return text.toLowerCase();\n}\n\nfunction toUpper(text) {\n  return text.toUpperCase();\n}\n\nfunction extractPattern(text, pattern) {\n  let re = RegexBinding.compileSafePattern(pattern);\n  if (re === undefined) {\n    return;\n  }\n  let matches = Primitive_option.valFromOption(re).exec(text);\n  if (matches === null) {\n    return;\n  }\n  let m = matches[0];\n  if (m !== undefined && m !== \"\") {\n    return m;\n  }\n}\n\nfunction matchesPattern(text, pattern) {\n  let re = RegexBinding.compileSafePattern(pattern);\n  if (re !== undefined) {\n    return Primitive_option.valFromOption(re).test(text);\n  } else {\n    return false;\n  }\n}\n\nfunction stripNonNumeric(text) {\n  return text.replace(/[^0-9.\\-]/g, \"\");\n}\n\nexport {\n  trimStr,\n  normalizeWhitespace,\n  toLower,\n  toUpper,\n  extractPattern,\n  matchesPattern,\n  stripNonNumeric,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as StringUtils from \"../utils/StringUtils.res.mjs\";\nimport * as Primitive_object from \"@rescript/runtime/lib/es6/Primitive_object.js\";\n\nfunction stripTagBlocks(html, tagName) {\n  try {\n    let pattern = \"<\" + tagName + \"\\\\b[^>]*>[\\\\s\\\\S]*?<\\/\" + tagName + \">\";\n    let re = new RegExp(pattern, \"gi\");\n    return html.replace(re, \"\");\n  } catch (exn) {\n    return html;\n  }\n}\n\nfunction extract(el, opts) {\n  let html;\n  if (opts !== undefined) {\n    let match = opts.mode;\n    html = match !== undefined && match !== \"Inner\" ? el.outerHTML : el.innerHTML;\n  } else {\n    html = el.innerHTML;\n  }\n  let stripped;\n  if (opts !== undefined) {\n    let acc = html;\n    if (Primitive_object.equal(opts.stripScripts, true)) {\n      acc = stripTagBlocks(acc, \"script\");\n    }\n    if (Primitive_object.equal(opts.stripStyles, true)) {\n      acc = stripTagBlocks(acc, \"style\");\n    }\n    stripped = acc;\n  } else {\n    stripped = html;\n  }\n  let trimmed = StringUtils.trimStr(stripped);\n  if (trimmed === \"\") {\n    return;\n  } else {\n    return trimmed;\n  }\n}\n\nexport {\n  extract,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as NodeUtil from \"../../../bindings/NodeUtil.res.mjs\";\nimport * as Primitive_option from \"@rescript/runtime/lib/es6/Primitive_option.js\";\nimport * as NodeHtmlParserBinding from \"../../../bindings/NodeHtmlParserBinding.res.mjs\";\n\nfunction getJsonSource(el, opts) {\n  let source = opts !== undefined ? opts.source : undefined;\n  if (source === undefined) {\n    return el.textContent;\n  }\n  if (source !== \"attribute\") {\n    return el.textContent;\n  }\n  let attrName = opts !== undefined ? opts.attribute : undefined;\n  let attr = attrName !== undefined ? attrName : \"data-json\";\n  return Primitive_option.fromNullable(NodeHtmlParserBinding.getAttribute(el, attr));\n}\n\nfunction getPath(obj, path) {\n  if (path === \"\") {\n    return obj;\n  }\n  let keys = path.split(\".\");\n  let current = {\n    contents: obj\n  };\n  keys.values().forEach(key => {\n    let cur = current.contents;\n    if (cur === undefined) {\n      return;\n    }\n    let val = cur[key];\n    if (val !== undefined && !(val == null)) {\n      current.contents = val;\n    } else {\n      current.contents = undefined;\n    }\n  });\n  return current.contents;\n}\n\nfunction extract(el, opts) {\n  let raw = getJsonSource(el, opts);\n  if (raw === undefined) {\n    return;\n  }\n  let parsed = NodeUtil.jsonParse(raw);\n  if (parsed !== undefined) {\n    let path = opts !== undefined ? opts.path : undefined;\n    if (path === undefined) {\n      return parsed;\n    }\n    let extracted = getPath(parsed, path);\n    if (extracted !== undefined) {\n      return extracted;\n    }\n    let onErr = opts !== undefined ? opts.onError : undefined;\n    if (onErr === undefined) {\n      return;\n    }\n    switch (onErr) {\n      case \"ReturnText\" :\n        return raw;\n      case \"ReturnNull\" :\n      case \"ReturnDefault\" :\n        return;\n    }\n  } else {\n    let onErr$1 = opts !== undefined ? opts.onError : undefined;\n    if (onErr$1 === undefined) {\n      return;\n    }\n    switch (onErr$1) {\n      case \"ReturnText\" :\n        return raw;\n      case \"ReturnNull\" :\n      case \"ReturnDefault\" :\n        return;\n    }\n  }\n}\n\nexport {\n  extract,\n}\n/* NodeHtmlParserBinding Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as StringUtils from \"../utils/StringUtils.res.mjs\";\nimport * as Primitive_object from \"@rescript/runtime/lib/es6/Primitive_object.js\";\n\nfunction extract(el, opts) {\n  let base = el.textContent;\n  let s = base;\n  if (opts !== undefined) {\n    if (Primitive_object.equal(opts.normalizeWhitespace, true)) {\n      s = StringUtils.normalizeWhitespace(s);\n    } else if (Primitive_object.notequal(opts.trim, false)) {\n      s = StringUtils.trimStr(s);\n    }\n    let pat = opts.pattern;\n    if (pat !== undefined) {\n      let extracted = StringUtils.extractPattern(s, pat);\n      s = extracted !== undefined ? extracted : \"\";\n    }\n    if (Primitive_object.equal(opts.lowercase, true)) {\n      s = StringUtils.toLower(s);\n    }\n    if (Primitive_object.equal(opts.uppercase, true)) {\n      s = StringUtils.toUpper(s);\n    }\n  } else {\n    s = StringUtils.trimStr(s);\n  }\n  if (s === \"\") {\n    return;\n  } else {\n    return s;\n  }\n}\n\nfunction extractJoined(els, sep, opts) {\n  let parts = els.values().reduce((acc, el) => {\n    let value = extract(el, opts);\n    if (value !== undefined) {\n      acc.push(value);\n      return acc;\n    } else {\n      return acc;\n    }\n  }, []);\n  if (parts.length === 0) {\n    return;\n  } else {\n    return parts.join(sep);\n  }\n}\n\nexport {\n  extract,\n  extractJoined,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as Stdlib_Option from \"@rescript/runtime/lib/es6/Stdlib_Option.js\";\nimport * as Primitive_option from \"@rescript/runtime/lib/es6/Primitive_option.js\";\nimport * as NodeHtmlParserBinding from \"../../../bindings/NodeHtmlParserBinding.res.mjs\";\n\nfunction extract(el, cfg) {\n  let match = cfg.mode;\n  switch (match) {\n    case \"First\" :\n      let name = cfg.names[0];\n      if (name !== undefined) {\n        return Primitive_option.fromNullable(NodeHtmlParserBinding.getAttribute(el, name));\n      } else {\n        return;\n      }\n    case \"FirstNonEmpty\" :\n      return cfg.names.values().reduce((acc, name) => {\n        if (acc !== undefined) {\n          return acc;\n        } else {\n          let v = NodeHtmlParserBinding.getAttribute(el, name);\n          if (!(v == null) && v !== \"\") {\n            return v;\n          } else {\n            return;\n          }\n        }\n      }, undefined);\n    case \"All\" :\n    case \"Join\" :\n      break;\n  }\n  let sep = Stdlib_Option.getOr(cfg.joinSep, \" \");\n  let vals = cfg.names.values().reduce((acc, name) => {\n    let v = Primitive_option.fromNullable(NodeHtmlParserBinding.getAttribute(el, name));\n    if (v !== undefined) {\n      acc.push(v);\n      return acc;\n    } else {\n      return acc;\n    }\n  }, []);\n  if (vals.length === 0) {\n    return;\n  } else {\n    return vals.join(sep);\n  }\n}\n\nexport {\n  extract,\n}\n/* NodeHtmlParserBinding Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as StringUtils from \"../utils/StringUtils.res.mjs\";\nimport * as UrlExtractor from \"./UrlExtractor.res.mjs\";\nimport * as Stdlib_Option from \"@rescript/runtime/lib/es6/Stdlib_Option.js\";\nimport * as TextExtractor from \"./TextExtractor.res.mjs\";\nimport * as AttributeExtractor from \"./AttributeExtractor.res.mjs\";\n\nfunction listTrim(s) {\n  let t = s.trim();\n  if (t.length === 0) {\n    return;\n  } else {\n    return t;\n  }\n}\n\nfunction extractItemValue(el, itemType) {\n  if (typeof itemType === \"object\") {\n    return Stdlib_Option.flatMap(AttributeExtractor.extract(el, {\n      names: [itemType._0],\n      mode: \"First\"\n    }), listTrim);\n  }\n  switch (itemType) {\n    case \"ListText\" :\n      return TextExtractor.extract(el, undefined);\n    case \"ListHtml\" :\n      let h = el.innerHTML;\n      if (h.length === 0) {\n        return;\n      } else {\n        return h;\n      }\n    case \"ListUrl\" :\n      return UrlExtractor.extract(el, undefined);\n  }\n}\n\nfunction extract(els, opts) {\n  let values = els.values().reduce((acc, el) => {\n    let v = extractItemValue(el, opts.itemType);\n    if (v !== undefined) {\n      acc.push(v);\n      return acc;\n    } else {\n      return acc;\n    }\n  }, []);\n  let pat = opts.filter;\n  let filtered = pat !== undefined ? values.values().filter(v => StringUtils.matchesPattern(v, pat)).toArray() : values;\n  let match = opts.unique;\n  let deduped;\n  if (match !== undefined && match) {\n    let seen = {};\n    deduped = filtered.values().filter(v => {\n      if (v in seen) {\n        return false;\n      } else {\n        seen[v] = true;\n        return true;\n      }\n    }).toArray();\n  } else {\n    deduped = filtered;\n  }\n  let n = opts.limit;\n  let limited = n !== undefined && n < deduped.length ? deduped.slice(0, n) : deduped;\n  let sep = opts.join;\n  if (sep !== undefined) {\n    return limited.join(sep);\n  } else {\n    return limited.values().map(prim => prim).toArray();\n  }\n}\n\nexport {\n  extract,\n}\n/* UrlExtractor Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\n\nfunction extract(els) {\n  return els.length;\n}\n\nexport {\n  extract,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as StringUtils from \"./StringUtils.res.mjs\";\nimport * as Primitive_object from \"@rescript/runtime/lib/es6/Primitive_object.js\";\n\nfunction applyPrecision(num, exponent) {\n  let factor = 10.0 ** exponent;\n  return Math.round(num * factor) / factor;\n}\n\nfunction parseWithOptions(raw, opts) {\n  let s = raw.trim();\n  if (opts !== undefined) {\n    let pat = opts.pattern;\n    if (pat !== undefined) {\n      let extracted = StringUtils.extractPattern(s, pat);\n      if (extracted !== undefined) {\n        s = extracted;\n      }\n    }\n  }\n  let shouldStrip;\n  if (opts !== undefined) {\n    let match = opts.stripNonNumeric;\n    shouldStrip = match !== undefined ? match : true;\n  } else {\n    shouldStrip = true;\n  }\n  if (shouldStrip) {\n    s = StringUtils.stripNonNumeric(s);\n  }\n  if (opts !== undefined) {\n    let sep = opts.thousandsSeparator;\n    if (sep !== undefined && sep !== \"\") {\n      s = s.replaceAll(sep, \"\");\n    }\n  }\n  if (opts !== undefined) {\n    let dec = opts.decimalSeparator;\n    if (dec !== undefined && dec !== \"\" && dec !== \".\") {\n      s = s.replaceAll(dec, \".\");\n    }\n  }\n  if (s === \"\") {\n    return;\n  }\n  let n = parseFloat(s);\n  if (Number.isNaN(n)) {\n    return;\n  }\n  let result;\n  if (opts !== undefined) {\n    let p = opts.precision;\n    result = p !== undefined ? applyPrecision(n, p) : n;\n  } else {\n    result = n;\n  }\n  if (opts !== undefined && Primitive_object.equal(opts.allowNegative, false) && result < 0.0) {\n    return;\n  } else {\n    return result;\n  }\n}\n\nexport {\n  applyPrecision,\n  parseWithOptions,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as NumberUtils from \"../utils/NumberUtils.res.mjs\";\nimport * as StringUtils from \"../utils/StringUtils.res.mjs\";\n\nfunction extract(el, opts) {\n  let raw = StringUtils.trimStr(el.textContent);\n  return NumberUtils.parseWithOptions(raw, opts);\n}\n\nexport {\n  extract,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as StringUtils from \"../utils/StringUtils.res.mjs\";\nimport * as NodeHtmlParserBinding from \"../../../bindings/NodeHtmlParserBinding.res.mjs\";\n\nlet defaultTrueValues = [\n  \"true\",\n  \"yes\",\n  \"1\",\n  \"on\",\n  \"in stock\"\n];\n\nlet defaultFalseValues = [\n  \"false\",\n  \"no\",\n  \"0\",\n  \"off\",\n  \"out of stock\"\n];\n\nfunction matchesAny(s, arr) {\n  let lower = StringUtils.toLower(s);\n  return arr.values().some(v => StringUtils.toLower(v) === lower);\n}\n\nfunction extractPresence(found) {\n  return found;\n}\n\nfunction extractAttributeCheck(el, opts) {\n  let attrName;\n  if (opts !== undefined) {\n    let a = opts.attribute;\n    attrName = a !== undefined ? a : \"data-value\";\n  } else {\n    attrName = \"data-value\";\n  }\n  let v = NodeHtmlParserBinding.getAttribute(el, attrName);\n  if (!(v == null) && v !== \"\") {\n    return true;\n  } else {\n    return false;\n  }\n}\n\nfunction extract(el, opts) {\n  let mode;\n  if (opts !== undefined) {\n    let m = opts.mode;\n    mode = m !== undefined ? m : \"Mapping\";\n  } else {\n    mode = \"Mapping\";\n  }\n  switch (mode) {\n    case \"Mapping\" :\n      let text = StringUtils.trimStr(el.textContent);\n      let trueVals;\n      if (opts !== undefined) {\n        let tv = opts.trueValues;\n        trueVals = tv !== undefined && tv.length !== 0 ? tv : defaultTrueValues;\n      } else {\n        trueVals = defaultTrueValues;\n      }\n      let falseVals;\n      if (opts !== undefined) {\n        let fv = opts.falseValues;\n        falseVals = fv !== undefined && fv.length !== 0 ? fv : defaultFalseValues;\n      } else {\n        falseVals = defaultFalseValues;\n      }\n      if (matchesAny(text, trueVals)) {\n        return {\n          TAG: \"Ok\",\n          _0: true\n        };\n      }\n      if (matchesAny(text, falseVals)) {\n        return {\n          TAG: \"Ok\",\n          _0: false\n        };\n      }\n      if (opts === undefined) {\n        return {\n          TAG: \"Ok\",\n          _0: false\n        };\n      }\n      let match = opts.onUnknown;\n      if (match === undefined) {\n        return {\n          TAG: \"Ok\",\n          _0: false\n        };\n      }\n      switch (match) {\n        case \"UnknownFalse\" :\n          return {\n            TAG: \"Ok\",\n            _0: false\n          };\n        case \"UnknownNull\" :\n          return {\n            TAG: \"Ok\",\n            _0: undefined\n          };\n        case \"UnknownError\" :\n          return {\n            TAG: \"Error\",\n            _0: {\n              TAG: \"ExtractionError\",\n              _0: `Unknown boolean value \"` + text + `\"`\n            }\n          };\n      }\n    case \"Presence\" :\n      return {\n        TAG: \"Ok\",\n        _0: true\n      };\n    case \"AttributeCheck\" :\n      return {\n        TAG: \"Ok\",\n        _0: extractAttributeCheck(el, opts)\n      };\n  }\n}\n\nexport {\n  extract,\n  extractPresence,\n  extractAttributeCheck,\n}\n/* NodeHtmlParserBinding Not a pure module */\n","const parseISO = (input) => {\n    const parsedDate = new Date(input);\n    return Number.isNaN(parsedDate.getTime()) ? undefined : parsedDate;\n};\nconst parseEpochSeconds = (secondsInput) => {\n    const seconds = typeof secondsInput === \"number\"\n        ? Math.trunc(secondsInput)\n        : parseInt(String(secondsInput), 10);\n    if (Number.isNaN(seconds))\n        return undefined;\n    const milliseconds = seconds * 1000;\n    const parsedDate = new Date(milliseconds);\n    return Number.isNaN(parsedDate.getTime()) ? undefined : parsedDate;\n};\nconst parseEpochMilliseconds = (millisInput) => {\n    const milliseconds = typeof millisInput === \"number\"\n        ? Math.trunc(millisInput)\n        : parseInt(String(millisInput), 10);\n    if (Number.isNaN(milliseconds))\n        return undefined;\n    const parsedDate = new Date(milliseconds);\n    return Number.isNaN(parsedDate.getTime()) ? undefined : parsedDate;\n};\nconst parseEpochMillis = (millisInput) => parseEpochMilliseconds(millisInput);\nconst MONTHS_FULL = [\n    \"january\",\n    \"february\",\n    \"march\",\n    \"april\",\n    \"may\",\n    \"june\",\n    \"july\",\n    \"august\",\n    \"september\",\n    \"october\",\n    \"november\",\n    \"december\",\n];\nconst MONTHS_ABBR = [\n    \"jan\",\n    \"feb\",\n    \"mar\",\n    \"apr\",\n    \"may\",\n    \"jun\",\n    \"jul\",\n    \"aug\",\n    \"sep\",\n    \"oct\",\n    \"nov\",\n    \"dec\",\n];\nconst BASE_TOKENS = [\n    { token: \"yyyy\", regex: \"(\\\\d{4})\", group: \"year4\" },\n    { token: \"yy\", regex: \"(\\\\d{2})\", group: \"year2\" },\n    { token: \"MMMM\", regex: \"([A-Za-z]+)\", group: \"monthFull\" },\n    { token: \"MMM\", regex: \"([A-Za-z]{3})\", group: \"monthAbbr\" },\n    { token: \"MM\", regex: \"(\\\\d{1,2})\", group: \"month2\" },\n    { token: \"M\", regex: \"(\\\\d{1,2})\", group: \"month1\" },\n    { token: \"dd\", regex: \"(\\\\d{1,2})\", group: \"day2\" },\n    { token: \"d\", regex: \"(\\\\d{1,2})\", group: \"day1\" },\n    { token: \"HH\", regex: \"(\\\\d{1,2})\", group: \"hour24_2\" },\n    { token: \"H\", regex: \"(\\\\d{1,2})\", group: \"hour24_1\" },\n    { token: \"hh\", regex: \"(\\\\d{1,2})\", group: \"hour12_2\" },\n    { token: \"h\", regex: \"(\\\\d{1,2})\", group: \"hour12_1\" },\n    { token: \"mm\", regex: \"(\\\\d{1,2})\", group: \"min2\" },\n    { token: \"m\", regex: \"(\\\\d{1,2})\", group: \"min1\" },\n    { token: \"ss\", regex: \"(\\\\d{1,2})\", group: \"sec2\" },\n    { token: \"s\", regex: \"(\\\\d{1,2})\", group: \"sec1\" },\n    { token: \"a\", regex: \"(am|pm|AM|PM)\", group: \"ampm\" },\n];\nconst SORTED_TOKENS = BASE_TOKENS.slice().sort((a, b) => b.token.length - a.token.length);\nconst regexCache = new Map();\nconst buildRegexFromFormat = (format) => {\n    const cached = regexCache.get(format);\n    if (cached !== undefined)\n        return cached;\n    let remaining = format;\n    let pattern = \"\";\n    const groupNames = [];\n    while (remaining.length > 0) {\n        const matchedToken = SORTED_TOKENS.find(({ token }) => remaining.startsWith(token));\n        if (matchedToken) {\n            pattern += matchedToken.regex;\n            groupNames.push(matchedToken.group);\n            remaining = remaining.slice(matchedToken.token.length);\n            continue;\n        }\n        pattern += escapeRegexCharacter(remaining[0]);\n        remaining = remaining.slice(1);\n    }\n    let result;\n    try {\n        const compiledRegex = new RegExp(`^${pattern}$`, \"i\");\n        result = { regex: compiledRegex, groupNames };\n    }\n    catch {\n        result = { regex: null, groupNames: [] };\n    }\n    regexCache.set(format, result);\n    return result;\n};\nconst escapeRegexCharacter = (text) => text.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\nconst mapMatchToGroupValues = (groupNames, matches) => groupNames.reduce((mapper, groupName, i) => {\n    mapper[groupName] = matches[i + 1];\n    return mapper;\n}, {});\nconst parseInteger = (rawNumber) => {\n    if (rawNumber === undefined)\n        return undefined;\n    const n = parseInt(String(rawNumber), 10);\n    return Number.isNaN(n) ? undefined : n;\n};\nconst convert12HourTo24 = (hourValue, meridiem) => {\n    const num = parseInteger(hourValue);\n    if (num === undefined)\n        return undefined;\n    let hour = num % 12;\n    if (meridiem && meridiem.toLowerCase() === \"pm\")\n        hour += 12;\n    return hour;\n};\nconst normalizeDateParts = (tokenValues) => {\n    let year = 1970;\n    let month = 0;\n    let day = 1;\n    let hour = 0;\n    let minute = 0;\n    let second = 0;\n    if (tokenValues.year4) {\n        const n = parseInteger(tokenValues.year4);\n        if (n === undefined)\n            return invalidDateParts();\n        year = n;\n    }\n    else if (tokenValues.year2) {\n        const y2 = parseInteger(tokenValues.year2);\n        if (y2 === undefined)\n            return invalidDateParts();\n        year = y2 <= 49 ? 2000 + y2 : 1900 + y2;\n    }\n    if (tokenValues.monthFull) {\n        const idx = MONTHS_FULL.indexOf(tokenValues.monthFull.toLowerCase());\n        if (idx === -1)\n            return invalidDateParts();\n        month = idx;\n    }\n    else if (tokenValues.monthAbbr) {\n        const idx = MONTHS_ABBR.indexOf(tokenValues.monthAbbr.toLowerCase());\n        if (idx === -1)\n            return invalidDateParts();\n        month = idx;\n    }\n    else if (tokenValues.month2 !== undefined) {\n        const n = parseInteger(tokenValues.month2);\n        if (n === undefined)\n            return invalidDateParts();\n        month = n - 1;\n    }\n    else if (tokenValues.month1 !== undefined) {\n        const n = parseInteger(tokenValues.month1);\n        if (n === undefined)\n            return invalidDateParts();\n        month = n - 1;\n    }\n    if (tokenValues.day2 !== undefined) {\n        const n = parseInteger(tokenValues.day2);\n        if (n === undefined)\n            return invalidDateParts();\n        day = n;\n    }\n    else if (tokenValues.day1 !== undefined) {\n        const n = parseInteger(tokenValues.day1);\n        if (n === undefined)\n            return invalidDateParts();\n        day = n;\n    }\n    if (tokenValues.hour24_2 !== undefined) {\n        const n = parseInteger(tokenValues.hour24_2);\n        if (n === undefined)\n            return invalidDateParts();\n        hour = n;\n    }\n    else if (tokenValues.hour24_1 !== undefined) {\n        const n = parseInteger(tokenValues.hour24_1);\n        if (n === undefined)\n            return invalidDateParts();\n        hour = n;\n    }\n    else if (tokenValues.hour12_2 !== undefined) {\n        const h = convert12HourTo24(tokenValues.hour12_2, tokenValues.ampm);\n        if (h === undefined)\n            return invalidDateParts();\n        hour = h;\n    }\n    else if (tokenValues.hour12_1 !== undefined) {\n        const h = convert12HourTo24(tokenValues.hour12_1, tokenValues.ampm);\n        if (h === undefined)\n            return invalidDateParts();\n        hour = h;\n    }\n    if (tokenValues.min2 !== undefined) {\n        const n = parseInteger(tokenValues.min2);\n        if (n === undefined)\n            return invalidDateParts();\n        minute = n;\n    }\n    else if (tokenValues.min1 !== undefined) {\n        const n = parseInteger(tokenValues.min1);\n        if (n === undefined)\n            return invalidDateParts();\n        minute = n;\n    }\n    if (tokenValues.sec2 !== undefined) {\n        const n = parseInteger(tokenValues.sec2);\n        if (n === undefined)\n            return invalidDateParts();\n        second = n;\n    }\n    else if (tokenValues.sec1 !== undefined) {\n        const n = parseInteger(tokenValues.sec1);\n        if (n === undefined)\n            return invalidDateParts();\n        second = n;\n    }\n    return { year, month, day, hour, minute, second };\n};\nconst invalidDateParts = () => ({\n    year: Number.NaN,\n    month: 0,\n    day: 1,\n    hour: 0,\n    minute: 0,\n    second: 0,\n});\nexport default function tryParseWithFormat(datetime, format) {\n    if (!datetime)\n        return undefined;\n    if (format === \"ISO\")\n        return parseISO(datetime);\n    if (format === \"epoch\")\n        return parseEpochSeconds(datetime);\n    if (format === \"epochMillis\")\n        return parseEpochMillis(datetime);\n    if (typeof format !== \"string\")\n        return undefined;\n    const { regex, groupNames } = buildRegexFromFormat(format);\n    if (!regex)\n        return undefined;\n    const matchResult = datetime.match(regex);\n    if (!matchResult)\n        return undefined;\n    const tokenMap = mapMatchToGroupValues(groupNames, matchResult);\n    const { year, month, day, hour, minute, second } = normalizeDateParts(tokenMap);\n    const resultDate = new Date(Date.UTC(year, month, day, hour, minute, second));\n    return Number.isNaN(resultDate.getTime()) ? undefined : resultDate;\n}\n","const MONTHS_FULL = [\n    \"January\",\n    \"February\",\n    \"March\",\n    \"April\",\n    \"May\",\n    \"June\",\n    \"July\",\n    \"August\",\n    \"September\",\n    \"October\",\n    \"November\",\n    \"December\",\n];\nconst MONTHS_ABBR = [\n    \"Jan\",\n    \"Feb\",\n    \"Mar\",\n    \"Apr\",\n    \"May\",\n    \"Jun\",\n    \"Jul\",\n    \"Aug\",\n    \"Sep\",\n    \"Oct\",\n    \"Nov\",\n    \"Dec\",\n];\nconst padToTwoDigits = (value) => String(value).padStart(2, \"0\");\nconst padToFourDigits = (value) => String(value).padStart(4, \"0\");\nconst parseTimeZoneOffsetMinutes = (timeZoneName) => {\n    if (!timeZoneName)\n        return 0;\n    const match = timeZoneName.match(/GMT([+-])(\\d+)(?::(\\d+))?/);\n    if (!match)\n        return 0;\n    const sign = match[1] === \"+\" ? 1 : -1;\n    const hours = parseInt(match[2], 10) || 0;\n    const minutes = parseInt(match[3] || \"0\", 10);\n    return sign * (hours * 60 + minutes);\n};\nconst getUtcDateComponents = (date) => ({\n    year: date.getUTCFullYear(),\n    month: date.getUTCMonth(),\n    day: date.getUTCDate(),\n    hour: date.getUTCHours(),\n    min: date.getUTCMinutes(),\n    sec: date.getUTCSeconds(),\n    offset: 0,\n});\nconst getTimeZoneDateComponents = (date, timeZone) => {\n    const dateTimeFormatter = new Intl.DateTimeFormat(\"en-US\", {\n        timeZone,\n        year: \"numeric\",\n        month: \"2-digit\",\n        day: \"2-digit\",\n        hour: \"2-digit\",\n        minute: \"2-digit\",\n        second: \"2-digit\",\n        hour12: false,\n        timeZoneName: \"shortOffset\",\n    });\n    const dateParts = Object.fromEntries(dateTimeFormatter\n        .formatToParts(date)\n        .map(({ type, value }) => [type, value]));\n    let hour = parseInt(dateParts.hour, 10);\n    if (hour === 24)\n        hour = 0;\n    return {\n        year: parseInt(dateParts.year, 10),\n        month: parseInt(dateParts.month, 10) - 1,\n        day: parseInt(dateParts.day, 10),\n        hour,\n        min: parseInt(dateParts.minute, 10),\n        sec: parseInt(dateParts.second, 10),\n        offset: parseTimeZoneOffsetMinutes(dateParts.timeZoneName || \"\"),\n    };\n};\nconst getDateComponents = (date, timeZone) => !timeZone || timeZone === \"UTC\"\n    ? getUtcDateComponents(date)\n    : getTimeZoneDateComponents(date, timeZone);\nconst formatTimeZoneOffset = (offsetMinutes) => {\n    if (offsetMinutes === 0)\n        return \"Z\";\n    const sign = offsetMinutes > 0 ? \"+\" : \"-\";\n    const absoluteOffset = Math.abs(offsetMinutes);\n    return `${sign}${padToTwoDigits(Math.floor(absoluteOffset / 60))}:${padToTwoDigits(absoluteOffset % 60)}`;\n};\nconst createTokenDefinitions = (components) => [\n    { token: \"yyyy\", value: padToFourDigits(components.year) },\n    { token: \"yy\", value: padToTwoDigits(components.year % 100) },\n    { token: \"MMMM\", value: MONTHS_FULL[components.month] },\n    { token: \"MMM\", value: MONTHS_ABBR[components.month] },\n    { token: \"MM\", value: padToTwoDigits(components.month + 1) },\n    { token: \"M\", value: String(components.month + 1) },\n    { token: \"dd\", value: padToTwoDigits(components.day) },\n    { token: \"d\", value: String(components.day) },\n    { token: \"HH\", value: padToTwoDigits(components.hour) },\n    { token: \"H\", value: String(components.hour) },\n    { token: \"hh\", value: padToTwoDigits(components.hour % 12 || 12) },\n    { token: \"h\", value: String(components.hour % 12 || 12) },\n    { token: \"mm\", value: padToTwoDigits(components.min) },\n    { token: \"m\", value: String(components.min) },\n    { token: \"ss\", value: padToTwoDigits(components.sec) },\n    { token: \"s\", value: String(components.sec) },\n    { token: \"a\", value: components.hour < 12 ? \"am\" : \"pm\" },\n];\nexport default function formatDate(date, outputFormat, timeZone) {\n    if (outputFormat === \"epoch\")\n        return String(Math.floor(date.getTime() / 1000));\n    if (outputFormat === \"epochMillis\")\n        return String(date.getTime());\n    const components = getDateComponents(date, timeZone || \"UTC\");\n    if (outputFormat === \"iso8601\") {\n        return `${padToFourDigits(components.year)}-${padToTwoDigits(components.month + 1)}-${padToTwoDigits(components.day)}T${padToTwoDigits(components.hour)}:${padToTwoDigits(components.min)}:${padToTwoDigits(components.sec)}${formatTimeZoneOffset(components.offset)}`;\n    }\n    const tokenDefinitions = createTokenDefinitions(components);\n    let formattedOutput = \"\";\n    let remainingFormat = outputFormat || \"\";\n    while (remainingFormat.length > 0) {\n        let matched = false;\n        for (const tokenDefinition of tokenDefinitions) {\n            if (remainingFormat.startsWith(tokenDefinition.token)) {\n                formattedOutput += tokenDefinition.value;\n                remainingFormat = remainingFormat.slice(tokenDefinition.token.length);\n                matched = true;\n                break;\n            }\n        }\n        if (!matched) {\n            formattedOutput += remainingFormat[0];\n            remainingFormat = remainingFormat.slice(1);\n        }\n    }\n    return formattedOutput;\n}\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as Stdlib_Option from \"@rescript/runtime/lib/es6/Stdlib_Option.js\";\nimport ParseDateMjs from \"./date/parseDate.mjs\";\nimport FormatDateMjs from \"./date/formatDate.mjs\";\n\nfunction tryParseWithFormat(prim0, prim1) {\n  return ParseDateMjs(prim0, prim1);\n}\n\nfunction parseDate(str, formats) {\n  let fmts = formats.length === 0 ? [\"ISO\"] : formats;\n  return fmts.values().reduce((acc, fmt) => {\n    if (acc !== undefined) {\n      return acc;\n    } else {\n      return ParseDateMjs(str, fmt);\n    }\n  }, undefined);\n}\n\nfunction formatDate(date, output, timezone) {\n  let tz = Stdlib_Option.getOr(timezone, \"UTC\");\n  let spec;\n  if (typeof output !== \"object\") {\n    switch (output) {\n      case \"Iso8601\" :\n        spec = \"iso8601\";\n        break;\n      case \"Epoch\" :\n        spec = \"epoch\";\n        break;\n      case \"EpochMillis\" :\n        spec = \"epochMillis\";\n        break;\n    }\n  } else {\n    spec = output._0;\n  }\n  return FormatDateMjs(date, spec, tz);\n}\n\nexport {\n  tryParseWithFormat,\n  parseDate,\n  formatDate,\n}\n/* ./date/parseDate.mjs Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as DateUtils from \"../utils/DateUtils.res.mjs\";\nimport * as Stdlib_Option from \"@rescript/runtime/lib/es6/Stdlib_Option.js\";\nimport * as Primitive_option from \"@rescript/runtime/lib/es6/Primitive_option.js\";\nimport * as NodeHtmlParserBinding from \"../../../bindings/NodeHtmlParserBinding.res.mjs\";\n\nfunction extract(el, opts) {\n  let source = opts !== undefined ? Stdlib_Option.getOr(opts.source, \"text\") : \"text\";\n  let attrName = opts !== undefined ? Stdlib_Option.getOr(opts.attribute, \"datetime\") : \"datetime\";\n  let raw = source === \"attribute\" ? Primitive_option.fromNullable(NodeHtmlParserBinding.getAttribute(el, attrName)) : el.textContent;\n  let trimmed = raw !== undefined ? raw.trim() : \"\";\n  if (trimmed.length === 0) {\n    return;\n  }\n  let formats;\n  if (opts !== undefined) {\n    let fmts = opts.formats;\n    formats = fmts !== undefined ? (\n        fmts.length !== 0 ? fmts : [\"ISO\"]\n      ) : [\"ISO\"];\n  } else {\n    formats = [\"ISO\"];\n  }\n  let output = opts !== undefined ? Stdlib_Option.getOr(opts.output, \"Iso8601\") : \"Iso8601\";\n  let timezone = opts !== undefined ? opts.timezone : undefined;\n  let date = DateUtils.parseDate(trimmed, formats);\n  if (date !== undefined) {\n    return DateUtils.formatDate(Primitive_option.valFromOption(date), output, timezone);\n  }\n}\n\nexport {\n  extract,\n}\n/* DateUtils Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as NodeHtmlParserBinding from \"../bindings/NodeHtmlParserBinding.res.mjs\";\n\nfunction resolveHeaders(table) {\n  let fromThead = NodeHtmlParserBinding.querySelectorAll(table, \"thead th\");\n  if (fromThead.length !== 0) {\n    return fromThead;\n  }\n  let firstRow = NodeHtmlParserBinding.querySelector(table, \"tr\");\n  if (firstRow == null) {\n    return [];\n  } else {\n    return NodeHtmlParserBinding.querySelectorAll(firstRow, \"th\");\n  }\n}\n\nfunction isFirstRowHeader(table) {\n  let firstRow = NodeHtmlParserBinding.querySelector(table, \"tr\");\n  if (firstRow == null) {\n    return false;\n  } else {\n    return NodeHtmlParserBinding.querySelectorAll(firstRow, \"th\").length !== 0;\n  }\n}\n\nfunction resolveRows(table, rowSelector) {\n  if (rowSelector !== undefined) {\n    return NodeHtmlParserBinding.querySelectorAll(table, rowSelector);\n  }\n  let fromTbody = NodeHtmlParserBinding.querySelectorAll(table, \"tbody tr\");\n  if (fromTbody.length !== 0) {\n    return fromTbody;\n  }\n  let allRows = NodeHtmlParserBinding.querySelectorAll(table, \"tr\");\n  if (allRows.length <= 1) {\n    return [];\n  } else if (isFirstRowHeader(table)) {\n    return allRows.slice(1, allRows.length);\n  } else {\n    return allRows;\n  }\n}\n\nexport {\n  resolveHeaders,\n  isFirstRowHeader,\n  resolveRows,\n}\n/* NodeHtmlParserBinding Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as TableUtils from \"../../../table/TableUtils.res.mjs\";\nimport * as ListExtractor from \"./ListExtractor.res.mjs\";\nimport * as Stdlib_Option from \"@rescript/runtime/lib/es6/Stdlib_Option.js\";\nimport * as DefaultsMerger from \"./DefaultsMerger.res.mjs\";\nimport * as FieldTypeVisitor from \"../FieldTypeVisitor.res.mjs\";\nimport * as NodeHtmlParserBinding from \"../../../bindings/NodeHtmlParserBinding.res.mjs\";\n\nfunction columnTypeToFieldType(columnType) {\n  let visitor_columnText = opts => ({\n    TAG: \"Text\",\n    _0: opts\n  });\n  let visitor_columnAttribute = cfg => ({\n    TAG: \"Attribute\",\n    _0: cfg\n  });\n  let visitor_columnHtml = opts => ({\n    TAG: \"Html\",\n    _0: opts\n  });\n  let visitor_columnNumber = opts => ({\n    TAG: \"Number\",\n    _0: opts\n  });\n  let visitor_columnBoolean = opts => ({\n    TAG: \"Boolean\",\n    _0: opts\n  });\n  let visitor_columnUrl = opts => ({\n    TAG: \"Url\",\n    _0: opts\n  });\n  let visitor_columnJson = opts => ({\n    TAG: \"Json\",\n    _0: opts\n  });\n  let visitor_columnDateTime = opts => ({\n    TAG: \"DateTime\",\n    _0: opts\n  });\n  let visitor_columnList = opts => ({\n    TAG: \"List\",\n    _0: opts\n  });\n  let visitor = {\n    columnText: visitor_columnText,\n    columnAttribute: visitor_columnAttribute,\n    columnHtml: visitor_columnHtml,\n    columnNumber: visitor_columnNumber,\n    columnBoolean: visitor_columnBoolean,\n    columnUrl: visitor_columnUrl,\n    columnJson: visitor_columnJson,\n    columnDateTime: visitor_columnDateTime,\n    columnList: visitor_columnList\n  };\n  return FieldTypeVisitor.visitColumnFieldType(visitor, columnType);\n}\n\nfunction resolveColumnDefaults(col, defaults) {\n  let opts = col.columnType;\n  let resolvedFieldType;\n  resolvedFieldType = opts.TAG === \"ColumnList\" ? ({\n      TAG: \"List\",\n      _0: opts._0\n    }) : DefaultsMerger.resolveDefaults(defaults, columnTypeToFieldType(col.columnType));\n  let nestedDefaults;\n  nestedDefaults = resolvedFieldType.TAG === \"Table\" ? defaults : undefined;\n  return [\n    resolvedFieldType,\n    nestedDefaults\n  ];\n}\n\nfunction extract(el, tableOpts, ctx, extractCell) {\n  let defaults = ctx.defaults;\n  let ignoreErrors = ctx.ignoreErrors;\n  let resolvedColumns = tableOpts.columns.values().map(col => {\n    let match = resolveColumnDefaults(col, defaults);\n    return [\n      col,\n      match[0],\n      match[1]\n    ];\n  }).toArray();\n  let rows = TableUtils.resolveRows(el, tableOpts.rowSelector);\n  let preQueriedCols = resolvedColumns.map(param => {\n    let resolvedFieldType = param[1];\n    let col = param[0];\n    let isList;\n    isList = resolvedFieldType.TAG === \"List\";\n    let perRowEls = rows.map(rowEl => {\n      if (isList) {\n        return NodeHtmlParserBinding.querySelectorAll(rowEl, col.selector);\n      }\n      let el = NodeHtmlParserBinding.querySelector(rowEl, col.selector);\n      if (el == null) {\n        return [];\n      } else {\n        return [el];\n      }\n    });\n    return [\n      col,\n      resolvedFieldType,\n      param[2],\n      perRowEls\n    ];\n  });\n  let outputRows = [];\n  let rowCount = rows.length;\n  let rowIdx = {\n    contents: 0\n  };\n  let loopResult = {\n    TAG: \"Ok\",\n    _0: undefined\n  };\n  while (rowIdx.contents < rowCount) {\n    let match = loopResult;\n    if (match.TAG === \"Ok\") {\n      let pairs = [];\n      let pairsError = {\n        contents: undefined\n      };\n      preQueriedCols.forEach(param => {\n        let resolvedFieldType = param[1];\n        let col = param[0];\n        let match = pairsError.contents;\n        if (match !== undefined) {\n          return;\n        }\n        let rowEls = Stdlib_Option.getOr(param[3][rowIdx.contents], []);\n        let value;\n        if (resolvedFieldType.TAG === \"List\") {\n          let json = ListExtractor.extract(rowEls, resolvedFieldType._0);\n          value = json !== undefined ? ({\n              TAG: \"Ok\",\n              _0: json\n            }) : ({\n              TAG: \"Ok\",\n              _0: null\n            });\n        } else {\n          let maybeEl = rowEls[0];\n          if (maybeEl !== undefined) {\n            value = extractCell(maybeEl, resolvedFieldType, {\n              defaults: param[2],\n              ignoreErrors: ignoreErrors,\n              required: col.required,\n              fieldName: col.name,\n              selector: col.selector\n            });\n          } else if (col.required && ignoreErrors === false) {\n            value = {\n              TAG: \"Error\",\n              _0: {\n                TAG: \"RequiredFieldMissing\",\n                fieldName: col.name,\n                selector: col.selector\n              }\n            };\n          } else {\n            let d = col.default;\n            value = {\n              TAG: \"Ok\",\n              _0: d !== undefined ? d : null\n            };\n          }\n        }\n        if (value.TAG === \"Ok\") {\n          pairs.push([\n            col.name,\n            value._0\n          ]);\n          return;\n        }\n        if (!ignoreErrors) {\n          pairsError.contents = value._0;\n          return;\n        }\n        let d$1 = col.default;\n        let fallback = d$1 !== undefined ? d$1 : null;\n        pairs.push([\n          col.name,\n          fallback\n        ]);\n      });\n      let e = pairsError.contents;\n      let pairsResult = e !== undefined ? ({\n          TAG: \"Error\",\n          _0: e\n        }) : ({\n          TAG: \"Ok\",\n          _0: pairs\n        });\n      if (pairsResult.TAG === \"Ok\") {\n        outputRows.push(Object.fromEntries(pairsResult._0));\n      } else {\n        loopResult = {\n          TAG: \"Error\",\n          _0: pairsResult._0\n        };\n      }\n      rowIdx.contents = rowIdx.contents + 1 | 0;\n    } else {\n      rowIdx.contents = rowCount;\n    }\n  };\n  let e$1 = loopResult;\n  let rowsResult;\n  rowsResult = e$1.TAG === \"Ok\" ? ({\n      TAG: \"Ok\",\n      _0: outputRows\n    }) : ({\n      TAG: \"Error\",\n      _0: e$1._0\n    });\n  if (rowsResult.TAG === \"Ok\") {\n    return {\n      TAG: \"Ok\",\n      _0: rowsResult._0\n    };\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: rowsResult._0\n    };\n  }\n}\n\nlet Iter;\n\nexport {\n  Iter,\n  columnTypeToFieldType,\n  resolveColumnDefaults,\n  extract,\n}\n/* TableUtils Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as UrlExtractor from \"./UrlExtractor.res.mjs\";\nimport * as HtmlExtractor from \"./HtmlExtractor.res.mjs\";\nimport * as JsonExtractor from \"./JsonExtractor.res.mjs\";\nimport * as ListExtractor from \"./ListExtractor.res.mjs\";\nimport * as TextExtractor from \"./TextExtractor.res.mjs\";\nimport * as CountExtractor from \"./CountExtractor.res.mjs\";\nimport * as DefaultsMerger from \"./DefaultsMerger.res.mjs\";\nimport * as NumberExtractor from \"./NumberExtractor.res.mjs\";\nimport * as BooleanExtractor from \"./BooleanExtractor.res.mjs\";\nimport * as FieldTypeVisitor from \"../FieldTypeVisitor.res.mjs\";\nimport * as Primitive_option from \"@rescript/runtime/lib/es6/Primitive_option.js\";\nimport * as DateTimeExtractor from \"./DateTimeExtractor.res.mjs\";\nimport * as AttributeExtractor from \"./AttributeExtractor.res.mjs\";\nimport * as TableFieldExtractor from \"./TableFieldExtractor.res.mjs\";\n\nfunction extractValue(el, ft, ctx) {\n  let resolved = DefaultsMerger.resolveDefaults(ctx.defaults, ft);\n  let extractVisitor_text = opts => {\n    let value = TextExtractor.extract(el, opts);\n    if (value !== undefined) {\n      return {\n        TAG: \"Ok\",\n        _0: Primitive_option.valFromOption(value)\n      };\n    } else {\n      return {\n        TAG: \"Ok\",\n        _0: null\n      };\n    }\n  };\n  let extractVisitor_attribute = cfg => {\n    let value = AttributeExtractor.extract(el, cfg);\n    if (value !== undefined) {\n      return {\n        TAG: \"Ok\",\n        _0: value\n      };\n    } else {\n      return {\n        TAG: \"Ok\",\n        _0: null\n      };\n    }\n  };\n  let extractVisitor_html = opts => {\n    let value = HtmlExtractor.extract(el, opts);\n    if (value !== undefined) {\n      return {\n        TAG: \"Ok\",\n        _0: Primitive_option.valFromOption(value)\n      };\n    } else {\n      return {\n        TAG: \"Ok\",\n        _0: null\n      };\n    }\n  };\n  let extractVisitor_number = opts => {\n    let value = NumberExtractor.extract(el, opts);\n    if (value !== undefined) {\n      return {\n        TAG: \"Ok\",\n        _0: Primitive_option.valFromOption(value)\n      };\n    } else {\n      return {\n        TAG: \"Ok\",\n        _0: null\n      };\n    }\n  };\n  let extractVisitor_boolean = opts => {\n    let e = BooleanExtractor.extract(el, opts);\n    if (e.TAG !== \"Ok\") {\n      return {\n        TAG: \"Error\",\n        _0: e._0\n      };\n    }\n    let b = e._0;\n    if (b !== undefined) {\n      return {\n        TAG: \"Ok\",\n        _0: b\n      };\n    } else {\n      return {\n        TAG: \"Ok\",\n        _0: null\n      };\n    }\n  };\n  let extractVisitor_count = param => ({\n    TAG: \"Ok\",\n    _0: 1\n  });\n  let extractVisitor_url = opts => {\n    let value = UrlExtractor.extract(el, opts);\n    if (value !== undefined) {\n      return {\n        TAG: \"Ok\",\n        _0: Primitive_option.valFromOption(value)\n      };\n    } else {\n      return {\n        TAG: \"Ok\",\n        _0: null\n      };\n    }\n  };\n  let extractVisitor_json = opts => {\n    let value = JsonExtractor.extract(el, opts);\n    if (value !== undefined) {\n      return {\n        TAG: \"Ok\",\n        _0: value\n      };\n    } else {\n      return {\n        TAG: \"Ok\",\n        _0: null\n      };\n    }\n  };\n  let extractVisitor_datetime = opts => {\n    let value = DateTimeExtractor.extract(el, opts);\n    if (value !== undefined) {\n      return {\n        TAG: \"Ok\",\n        _0: Primitive_option.valFromOption(value)\n      };\n    } else {\n      return {\n        TAG: \"Ok\",\n        _0: null\n      };\n    }\n  };\n  let extractVisitor_list = param => ({\n    TAG: \"Ok\",\n    _0: null\n  });\n  let extractVisitor_table = tableOpts => TableFieldExtractor.extract(el, tableOpts, ctx, extractValue);\n  let extractVisitor = {\n    text: extractVisitor_text,\n    attribute: extractVisitor_attribute,\n    html: extractVisitor_html,\n    number: extractVisitor_number,\n    boolean: extractVisitor_boolean,\n    count: extractVisitor_count,\n    url: extractVisitor_url,\n    json: extractVisitor_json,\n    datetime: extractVisitor_datetime,\n    list: extractVisitor_list,\n    table: extractVisitor_table\n  };\n  return FieldTypeVisitor.visitFieldType(extractVisitor, resolved);\n}\n\nfunction extractValueList(els, ft, ctx) {\n  if (els.length === 0 && ctx.required && ctx.ignoreErrors === false) {\n    return {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"RequiredFieldMissing\",\n        fieldName: ctx.fieldName,\n        selector: ctx.selector\n      }\n    };\n  }\n  let opts = DefaultsMerger.resolveDefaults(ctx.defaults, ft);\n  switch (opts.TAG) {\n    case \"Count\" :\n      let n = CountExtractor.extract(els);\n      if (n !== undefined) {\n        return {\n          TAG: \"Ok\",\n          _0: n\n        };\n      } else {\n        return {\n          TAG: \"Ok\",\n          _0: null\n        };\n      }\n    case \"List\" :\n      let json = ListExtractor.extract(els, opts._0);\n      if (json !== undefined) {\n        return {\n          TAG: \"Ok\",\n          _0: json\n        };\n      } else {\n        return {\n          TAG: \"Ok\",\n          _0: null\n        };\n      }\n    default:\n      let el = els[0];\n      if (el !== undefined) {\n        return extractValue(el, ft, ctx);\n      } else {\n        return {\n          TAG: \"Ok\",\n          _0: null\n        };\n      }\n  }\n}\n\nfunction extractValueOrAbsent(maybeEl, ft, defaultValue, ctx) {\n  if (maybeEl !== undefined) {\n    return extractValue(maybeEl, ft, ctx);\n  }\n  if (ft.TAG === \"Boolean\") {\n    let opts = ft._0;\n    let tmp;\n    if (opts !== undefined) {\n      let match = opts.mode;\n      if (match !== undefined) {\n        switch (match) {\n          case \"Presence\" :\n            tmp = true;\n            break;\n          case \"Mapping\" :\n          case \"AttributeCheck\" :\n            tmp = false;\n            break;\n        }\n      } else {\n        tmp = false;\n      }\n    } else {\n      tmp = false;\n    }\n    if (tmp) {\n      return {\n        TAG: \"Ok\",\n        _0: false\n      };\n    }\n  }\n  if (ctx.required && ctx.ignoreErrors === false) {\n    return {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"RequiredFieldMissing\",\n        fieldName: ctx.fieldName,\n        selector: ctx.selector\n      }\n    };\n  } else {\n    return {\n      TAG: \"Ok\",\n      _0: defaultValue !== undefined ? defaultValue : null\n    };\n  }\n}\n\nexport {\n  extractValue,\n  extractValueList,\n  extractValueOrAbsent,\n}\n/* UrlExtractor Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\n\nfunction Make(Impl) {\n  return {\n    name: Impl.name,\n    canHandle: Impl.canHandle,\n    execute: Impl.run\n  };\n}\n\nexport {\n  Make,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as FieldTypes from \"../types/FieldTypes.res.mjs\";\nimport * as Stdlib_Option from \"@rescript/runtime/lib/es6/Stdlib_Option.js\";\nimport * as DefaultsMerger from \"../extractors/DefaultsMerger.res.mjs\";\nimport * as ExtractorRegistry from \"../extractors/ExtractorRegistry.res.mjs\";\nimport * as ExtractionStrategy from \"./ExtractionStrategy.res.mjs\";\nimport * as NodeHtmlParserBinding from \"../../../bindings/NodeHtmlParserBinding.res.mjs\";\n\nfunction run(document, schema) {\n  let s = schema.config.rowSelector;\n  let rowSelector = s !== undefined ? s : \"*\";\n  let rows = NodeHtmlParserBinding.querySelectorAll(document, rowSelector);\n  let n = schema.config.limit;\n  let limitedRows = n !== 0 && n < rows.length ? rows.slice(0, n) : rows;\n  let resolvedFields = schema.fields.values().map(param => {\n    let field = param[1];\n    let resolvedFieldType = DefaultsMerger.resolveDefaults(schema.config.defaults, field.fieldType);\n    let nestedDefaults;\n    nestedDefaults = resolvedFieldType.TAG === \"Table\" ? schema.config.defaults : undefined;\n    return [\n      param[0],\n      field,\n      resolvedFieldType,\n      nestedDefaults\n    ];\n  }).toArray();\n  let preQueriedFields = resolvedFields.map(param => {\n    let resolvedFieldType = param[2];\n    let field = param[1];\n    let isMulti = FieldTypes.isMultiElementType(resolvedFieldType);\n    let perRowEls = limitedRows.map(rowEl => {\n      if (isMulti) {\n        return NodeHtmlParserBinding.querySelectorAll(rowEl, field.selector);\n      }\n      let el = NodeHtmlParserBinding.querySelector(rowEl, field.selector);\n      if (el == null) {\n        return [];\n      } else {\n        return [el];\n      }\n    });\n    return [\n      param[0],\n      field,\n      resolvedFieldType,\n      param[3],\n      isMulti,\n      perRowEls\n    ];\n  });\n  let outputRows = [];\n  let rowCount = limitedRows.length;\n  let rowIdx = {\n    contents: 0\n  };\n  let loopResult = {\n    TAG: \"Ok\",\n    _0: undefined\n  };\n  while (rowIdx.contents < rowCount) {\n    let match = loopResult;\n    if (match.TAG === \"Ok\") {\n      let pairs = [];\n      let fieldError = {\n        contents: undefined\n      };\n      preQueriedFields.forEach(param => {\n        let resolvedFieldType = param[2];\n        let field = param[1];\n        let name = param[0];\n        let match = fieldError.contents;\n        if (match !== undefined) {\n          return;\n        }\n        let rowEls = Stdlib_Option.getOr(param[5][rowIdx.contents], []);\n        let value;\n        if (param[4]) {\n          value = ExtractorRegistry.extractValueList(rowEls, resolvedFieldType, {\n            defaults: undefined,\n            ignoreErrors: schema.config.ignoreErrors,\n            required: field.required,\n            fieldName: name,\n            selector: field.selector\n          });\n        } else {\n          let maybeEl = rowEls[0];\n          value = ExtractorRegistry.extractValueOrAbsent(maybeEl, resolvedFieldType, field.default, {\n            defaults: param[3],\n            ignoreErrors: schema.config.ignoreErrors,\n            required: field.required,\n            fieldName: name,\n            selector: field.selector\n          });\n        }\n        if (value.TAG !== \"Ok\") {\n          fieldError.contents = value._0;\n          return;\n        }\n        pairs.push([\n          name,\n          value._0\n        ]);\n      });\n      let e = fieldError.contents;\n      let pairsResult = e !== undefined ? ({\n          TAG: \"Error\",\n          _0: e\n        }) : ({\n          TAG: \"Ok\",\n          _0: pairs\n        });\n      if (pairsResult.TAG === \"Ok\") {\n        let rowObj = {};\n        pairsResult._0.forEach(param => {\n          rowObj[param[0]] = param[1];\n        });\n        outputRows.push(rowObj);\n      } else {\n        loopResult = {\n          TAG: \"Error\",\n          _0: pairsResult._0\n        };\n      }\n      rowIdx.contents = rowIdx.contents + 1 | 0;\n    } else {\n      rowIdx.contents = rowCount;\n    }\n  };\n  let e$1 = loopResult;\n  let results;\n  results = e$1.TAG === \"Ok\" ? ({\n      TAG: \"Ok\",\n      _0: outputRows\n    }) : ({\n      TAG: \"Error\",\n      _0: e$1._0\n    });\n  if (results.TAG === \"Ok\") {\n    return {\n      TAG: \"Ok\",\n      _0: results._0\n    };\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: results._0\n    };\n  }\n}\n\nfunction canHandle(schema) {\n  return Stdlib_Option.isSome(schema.config.rowSelector);\n}\n\nlet Strategy = ExtractionStrategy.Make({\n  name: \"row\",\n  canHandle: canHandle,\n  run: run\n});\n\nexport {\n  run,\n  Strategy,\n}\n/* Strategy Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as FieldTypes from \"../types/FieldTypes.res.mjs\";\nimport * as DefaultsMerger from \"../extractors/DefaultsMerger.res.mjs\";\nimport * as ExtractorRegistry from \"../extractors/ExtractorRegistry.res.mjs\";\nimport * as ExtractionStrategy from \"./ExtractionStrategy.res.mjs\";\nimport * as NodeHtmlParserBinding from \"../../../bindings/NodeHtmlParserBinding.res.mjs\";\n\nfunction run(document, schema) {\n  let fieldLists = schema.fields.values().map(param => {\n    let field = param[1];\n    let resolvedFieldType = DefaultsMerger.resolveDefaults(schema.config.defaults, field.fieldType);\n    let nestedDefaults;\n    nestedDefaults = resolvedFieldType.TAG === \"Table\" ? schema.config.defaults : undefined;\n    let els = NodeHtmlParserBinding.querySelectorAll(document, field.selector);\n    return [\n      param[0],\n      field,\n      resolvedFieldType,\n      nestedDefaults,\n      els\n    ];\n  }).toArray();\n  let aggregateValues = {};\n  fieldLists.values().forEach(param => {\n    let resolvedFieldType = param[2];\n    let field = param[1];\n    let name = param[0];\n    if (!FieldTypes.isMultiElementType(resolvedFieldType)) {\n      return;\n    }\n    let value = ExtractorRegistry.extractValueList(param[4], resolvedFieldType, {\n      defaults: undefined,\n      ignoreErrors: schema.config.ignoreErrors,\n      required: field.required,\n      fieldName: name,\n      selector: field.selector\n    });\n    aggregateValues[name] = value;\n  });\n  let match = fieldLists.values().find(param => !FieldTypes.isMultiElementType(param[2]));\n  let rowCount = !(match == null) ? match[4].length : 0;\n  let n = schema.config.limit;\n  let limitedCount = n !== 0 && n < rowCount ? n : rowCount;\n  let buildRows = () => {\n    let rows = [];\n    let idx = {\n      contents: 0\n    };\n    let loopResult = {\n      TAG: \"Ok\",\n      _0: undefined\n    };\n    while ((() => {\n        let tmp = false;\n        if (idx.contents < limitedCount) {\n          let match = loopResult;\n          let tmp$1;\n          tmp$1 = match.TAG === \"Ok\";\n          tmp = tmp$1;\n        }\n        return tmp;\n      })()) {\n      let fieldResult = fieldLists.values().reduce((fAcc, param) => {\n        let resolvedFieldType = param[2];\n        let field = param[1];\n        let name = param[0];\n        if (fAcc.TAG !== \"Ok\") {\n          return {\n            TAG: \"Error\",\n            _0: fAcc._0\n          };\n        }\n        let pairs = fAcc._0;\n        let value;\n        if (FieldTypes.isMultiElementType(resolvedFieldType)) {\n          let v = aggregateValues[name];\n          value = v !== undefined ? v : ({\n              TAG: \"Ok\",\n              _0: null\n            });\n        } else {\n          let el = param[4][idx.contents];\n          if (el !== undefined) {\n            value = ExtractorRegistry.extractValue(el, resolvedFieldType, {\n              defaults: param[3],\n              ignoreErrors: schema.config.ignoreErrors,\n              required: field.required,\n              fieldName: name,\n              selector: field.selector\n            });\n          } else if (field.required && schema.config.ignoreErrors === false) {\n            value = {\n              TAG: \"Error\",\n              _0: {\n                TAG: \"RequiredFieldMissing\",\n                fieldName: name,\n                selector: field.selector\n              }\n            };\n          } else {\n            let d = field.default;\n            value = {\n              TAG: \"Ok\",\n              _0: d !== undefined ? d : null\n            };\n          }\n        }\n        if (value.TAG !== \"Ok\") {\n          return {\n            TAG: \"Error\",\n            _0: value._0\n          };\n        }\n        pairs.push([\n          name,\n          value._0\n        ]);\n        return {\n          TAG: \"Ok\",\n          _0: pairs\n        };\n      }, {\n        TAG: \"Ok\",\n        _0: []\n      });\n      if (fieldResult.TAG === \"Ok\") {\n        let rowObj = {};\n        fieldResult._0.forEach(param => {\n          rowObj[param[0]] = param[1];\n        });\n        rows.push(rowObj);\n        idx.contents = idx.contents + 1 | 0;\n      } else {\n        loopResult = {\n          TAG: \"Error\",\n          _0: fieldResult._0\n        };\n      }\n    };\n    let e = loopResult;\n    if (e.TAG === \"Ok\") {\n      return {\n        TAG: \"Ok\",\n        _0: rows\n      };\n    } else {\n      return {\n        TAG: \"Error\",\n        _0: e._0\n      };\n    }\n  };\n  let results = buildRows();\n  if (results.TAG === \"Ok\") {\n    return {\n      TAG: \"Ok\",\n      _0: results._0\n    };\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: results._0\n    };\n  }\n}\n\nfunction canHandle(_schema) {\n  return true;\n}\n\nlet Strategy = ExtractionStrategy.Make({\n  name: \"zip\",\n  canHandle: canHandle,\n  run: run\n});\n\nexport {\n  run,\n  Strategy,\n}\n/* Strategy Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as RowExtractor from \"./RowExtractor.res.mjs\";\nimport * as ZipExtractor from \"./ZipExtractor.res.mjs\";\n\nfunction applySchema(document, schema) {\n  if (RowExtractor.Strategy.canHandle(schema)) {\n    return RowExtractor.Strategy.execute(document, schema);\n  } else if (ZipExtractor.Strategy.canHandle(schema)) {\n    return ZipExtractor.Strategy.execute(document, schema);\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"ExtractionError\",\n        _0: \"No extraction strategy matched schema\"\n      }\n    };\n  }\n}\n\nexport {\n  applySchema,\n}\n/* RowExtractor Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as Nodefs from \"node:fs\";\nimport * as NodeUtil from \"../../bindings/NodeUtil.res.mjs\";\nimport * as SchemaParser from \"./parser/SchemaParser.res.mjs\";\nimport * as Stdlib_JsExn from \"@rescript/runtime/lib/es6/Stdlib_JsExn.js\";\nimport * as Stdlib_Option from \"@rescript/runtime/lib/es6/Stdlib_Option.js\";\nimport * as SchemaExecutor from \"./executor/SchemaExecutor.res.mjs\";\nimport * as Primitive_option from \"@rescript/runtime/lib/es6/Primitive_option.js\";\nimport * as Primitive_exceptions from \"@rescript/runtime/lib/es6/Primitive_exceptions.js\";\n\nfunction loadSchemaFromString(raw) {\n  let json = NodeUtil.jsonParse(raw);\n  if (json !== undefined) {\n    return SchemaParser.parseSchema(json);\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"InvalidJson\",\n        _0: \"Schema is not valid JSON\"\n      }\n    };\n  }\n}\n\nfunction loadSchema(isInline, source) {\n  if (isInline) {\n    return loadSchemaFromString(source);\n  }\n  try {\n    return loadSchemaFromString(Nodefs.readFileSync(source, \"utf8\"));\n  } catch (raw_exn) {\n    let exn = Primitive_exceptions.internalToException(raw_exn);\n    let jsExn = Stdlib_JsExn.fromException(exn);\n    let msg = jsExn !== undefined ? Stdlib_Option.getOr(Stdlib_JsExn.message(Primitive_option.valFromOption(jsExn)), \"Unknown error\") : \"Unknown error\";\n    return {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"FileReadError\",\n        _0: `Could not read schema file \"` + source + `\": ` + msg\n      }\n    };\n  }\n}\n\nlet applySchema = SchemaExecutor.applySchema;\n\nexport {\n  loadSchema,\n  applySchema,\n}\n/* node:fs Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as SchemaV2 from \"./v2/SchemaV2.res.mjs\";\n\nlet loadSchema = SchemaV2.loadSchema;\n\nlet applySchema = SchemaV2.applySchema;\n\nexport {\n  loadSchema,\n  applySchema,\n}\n/* SchemaV2 Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\n\nfunction make(max) {\n  return {\n    available: max,\n    waiting: []\n  };\n}\n\nfunction acquire(sem) {\n  return new Promise((resolve, _reject) => {\n    if (sem.available > 0) {\n      sem.available = sem.available - 1 | 0;\n      return resolve();\n    } else {\n      sem.waiting.push(() => resolve());\n      return;\n    }\n  });\n}\n\nfunction release(sem) {\n  let resolver = sem.waiting.shift();\n  if (resolver !== undefined) {\n    return resolver();\n  } else {\n    sem.available = sem.available + 1 | 0;\n    return;\n  }\n}\n\nlet Iter;\n\nexport {\n  Iter,\n  make,\n  acquire,\n  release,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as Primitive_float from \"@rescript/runtime/lib/es6/Primitive_float.js\";\n\nfunction make(delayMs) {\n  return {\n    nextStartAt: 0.0,\n    delayMs: delayMs\n  };\n}\n\nfunction delay(ms) {\n  return new Promise((resolve, _reject) => {\n    setTimeout(() => resolve(), ms);\n  });\n}\n\nasync function acquireStartSlot(limiter) {\n  if (limiter.delayMs <= 0) {\n    return Promise.resolve();\n  }\n  let now = performance.now();\n  let scheduledStart = Primitive_float.max(limiter.nextStartAt, now);\n  let waitMs = scheduledStart - now;\n  limiter.nextStartAt = scheduledStart + limiter.delayMs;\n  if (waitMs > 0.0) {\n    await delay(waitMs | 0);\n  }\n  return Promise.resolve();\n}\n\nexport {\n  make,\n  delay,\n  acquireStartSlot,\n}\n/* No side effect */\n","\n\nimport * as Primitive_exceptions from \"./Primitive_exceptions.js\";\n\nfunction $$catch(promise, callback) {\n  return promise.catch(err => callback(Primitive_exceptions.internalToException(err)));\n}\n\nexport {\n  $$catch,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\n\nlet createEnvProxyDispatcher = (async function() {\n  var hasProxy = Boolean(\n    process.env.HTTP_PROXY ||\n    process.env.HTTPS_PROXY ||\n    process.env.ALL_PROXY\n  );\n  if (!hasProxy) return undefined;\n  try {\n    var undici = await import('undici');\n    return new undici.EnvHttpProxyAgent();\n  } catch (e) {\n    console.error(\"Warning: HTTP_PROXY/HTTPS_PROXY/ALL_PROXY is set but undici is unavailable — proxy will be ignored. Install undici with: npm install undici\");\n    return undefined;\n  }\n});\n\nexport {\n  createEnvProxyDispatcher,\n}\n/* createEnvProxyDispatcher Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as ExnUtils from \"../core/ExnUtils.res.mjs\";\nimport * as Semaphore from \"../core/Semaphore.res.mjs\";\nimport * as StartLimiter from \"../core/StartLimiter.res.mjs\";\nimport * as Stdlib_JsExn from \"@rescript/runtime/lib/es6/Stdlib_JsExn.js\";\nimport * as Primitive_int from \"@rescript/runtime/lib/es6/Primitive_int.js\";\nimport * as Stdlib_Option from \"@rescript/runtime/lib/es6/Stdlib_Option.js\";\nimport * as Stdlib_Promise from \"@rescript/runtime/lib/es6/Stdlib_Promise.js\";\nimport * as Primitive_option from \"@rescript/runtime/lib/es6/Primitive_option.js\";\nimport * as NodeUndiciBinding from \"../bindings/NodeUndiciBinding.res.mjs\";\nimport * as Primitive_exceptions from \"@rescript/runtime/lib/es6/Primitive_exceptions.js\";\n\nfunction randomJitter() {\n  let random = Math.random();\n  let range = 1000;\n  return (random * range | 0) - 500 | 0;\n}\n\nfunction backoffDelay(attempt) {\n  let multiplier = Math.pow(2.0, attempt);\n  let delay = 1000 * multiplier | 0;\n  return Primitive_int.max(0, delay + randomJitter() | 0);\n}\n\nfunction isRetryable(err) {\n  switch (err.TAG) {\n    case \"NetworkError\" :\n    case \"Timeout\" :\n      return true;\n    case \"HttpError\" :\n      let status = err._0;\n      if (status !== 429) {\n        return status >= 500;\n      } else {\n        return true;\n      }\n    case \"ParseError\" :\n      return false;\n  }\n}\n\nfunction classifyError(message, isAborted, timeoutSeconds) {\n  if (isAborted) {\n    return {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"Timeout\",\n        _0: `timeout after ` + timeoutSeconds.toString() + `s`\n      }\n    };\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"NetworkError\",\n        _0: message\n      }\n    };\n  }\n}\n\nfunction delay(ms) {\n  return new Promise((resolve, _reject) => {\n    setTimeout(() => resolve(), ms);\n  });\n}\n\nlet proxyDispatcherPromise = {\n  contents: undefined\n};\n\nfunction getEnvProxyDispatcher() {\n  let promise = proxyDispatcherPromise.contents;\n  if (promise !== undefined) {\n    return promise;\n  }\n  let promise$1 = NodeUndiciBinding.createEnvProxyDispatcher();\n  proxyDispatcherPromise.contents = promise$1;\n  return promise$1;\n}\n\nasync function fetchOnce(url, userAgent, timeoutSeconds, headers) {\n  let timeoutMs = timeoutSeconds * 1000 | 0;\n  let controller = new AbortController();\n  let timeoutId = setTimeout(() => {\n    controller.abort();\n  }, timeoutMs);\n  let headerPairs = [[\n      \"User-Agent\",\n      userAgent\n    ]].concat(headers);\n  let dispatcher = await getEnvProxyDispatcher();\n  let baseOptions_method = \"GET\";\n  let baseOptions_headers = Object.fromEntries(headerPairs);\n  let baseOptions_signal = Primitive_option.some(controller.signal);\n  let baseOptions = {\n    method: baseOptions_method,\n    headers: baseOptions_headers,\n    signal: baseOptions_signal\n  };\n  let options;\n  if (dispatcher !== undefined) {\n    let newrecord = {...baseOptions};\n    newrecord.dispatcher = Primitive_option.some(Primitive_option.valFromOption(dispatcher));\n    options = newrecord;\n  } else {\n    options = baseOptions;\n  }\n  try {\n    let response = await fetch(url, options);\n    if (response.ok) {\n      let html = await response.text();\n      clearTimeout(timeoutId);\n      return {\n        TAG: \"Ok\",\n        _0: html\n      };\n    }\n    clearTimeout(timeoutId);\n    return {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"HttpError\",\n        _0: response.status,\n        _1: response.statusText\n      }\n    };\n  } catch (raw_exn) {\n    let exn = Primitive_exceptions.internalToException(raw_exn);\n    clearTimeout(timeoutId);\n    let jsExn = Stdlib_JsExn.fromException(exn);\n    let message = jsExn !== undefined ? Stdlib_Option.getOr(Stdlib_JsExn.message(Primitive_option.valFromOption(jsExn)), \"Unknown error\") : \"Unknown error\";\n    let isAborted = controller.signal.aborted;\n    return classifyError(message, isAborted, timeoutSeconds);\n  }\n}\n\nasync function fetchWithRetry(url, userAgent, timeoutSeconds, retryCount, headers) {\n  let tryFetch = async (attempt, maxAttempts) => {\n    let result = await fetchOnce(url, userAgent, timeoutSeconds, headers);\n    if (result.TAG === \"Ok\") {\n      return result;\n    }\n    if (!(attempt < maxAttempts && isRetryable(result._0))) {\n      return result;\n    }\n    let delayMs = backoffDelay(attempt);\n    await delay(delayMs);\n    return await tryFetch(attempt + 1 | 0, maxAttempts);\n  };\n  return await tryFetch(1, retryCount);\n}\n\nasync function fetchAll(urls, options) {\n  let concurrency = Primitive_int.min(options.concurrency, 20);\n  let sem = Semaphore.make(concurrency);\n  let limiter = StartLimiter.make(options.delayMs);\n  let fetchWithSemaphore = async url => {\n    await Semaphore.acquire(sem);\n    let outcome;\n    try {\n      let result = await StartLimiter.acquireStartSlot(limiter).then(param => fetchWithRetry(url, options.userAgent, options.timeoutSeconds, options.retryCount, options.headers));\n      outcome = {\n        TAG: \"Ok\",\n        _0: {\n          url: url,\n          result: result\n        }\n      };\n    } catch (raw_exn) {\n      let exn = Primitive_exceptions.internalToException(raw_exn);\n      outcome = {\n        TAG: \"Error\",\n        _0: exn\n      };\n    }\n    Semaphore.release(sem);\n    if (outcome.TAG === \"Ok\") {\n      return outcome._0;\n    }\n    throw outcome._0;\n  };\n  let promises = urls.map(url => Stdlib_Promise.$$catch(fetchWithSemaphore(url), exn => Promise.resolve({\n    url: url,\n    result: {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"NetworkError\",\n        _0: `Unexpected rejection: ` + ExnUtils.message(exn)\n      }\n    }\n  })));\n  return await Promise.all(promises);\n}\n\nfunction fetchErrorToMessage(err) {\n  switch (err.TAG) {\n    case \"NetworkError\" :\n      return `Network error: ` + err._0;\n    case \"Timeout\" :\n      return `Timeout: ` + err._0;\n    case \"HttpError\" :\n      return `HTTP ` + err._0.toString() + `: ` + err._1;\n    case \"ParseError\" :\n      return `Parse error: ` + err._0;\n  }\n}\n\nexport {\n  isRetryable,\n  classifyError,\n  backoffDelay,\n  fetchAll,\n  fetchErrorToMessage,\n}\n/* ExnUtils Not a pure module */\n","\n\nimport * as Stdlib_JsError from \"./Stdlib_JsError.js\";\n\nfunction getOrThrow(x, message) {\n  if (x.TAG === \"Ok\") {\n    return x._0;\n  } else {\n    return Stdlib_JsError.panic(message !== undefined ? message : \"Result.getOrThrow called for Error value\");\n  }\n}\n\nfunction mapOr(opt, $$default, f) {\n  if (opt.TAG === \"Ok\") {\n    return f(opt._0);\n  } else {\n    return $$default;\n  }\n}\n\nfunction map(opt, f) {\n  if (opt.TAG === \"Ok\") {\n    return {\n      TAG: \"Ok\",\n      _0: f(opt._0)\n    };\n  } else {\n    return opt;\n  }\n}\n\nfunction flatMap(opt, f) {\n  if (opt.TAG === \"Ok\") {\n    return f(opt._0);\n  } else {\n    return opt;\n  }\n}\n\nfunction getOr(opt, $$default) {\n  if (opt.TAG === \"Ok\") {\n    return opt._0;\n  } else {\n    return $$default;\n  }\n}\n\nfunction isOk(x) {\n  return x.TAG === \"Ok\";\n}\n\nfunction isError(x) {\n  return x.TAG !== \"Ok\";\n}\n\nfunction equal(a, b, eqOk, eqError) {\n  if (a.TAG === \"Ok\") {\n    if (b.TAG === \"Ok\") {\n      return eqOk(a._0, b._0);\n    } else {\n      return false;\n    }\n  } else if (b.TAG === \"Ok\") {\n    return false;\n  } else {\n    return eqError(a._0, b._0);\n  }\n}\n\nfunction compare(a, b, cmpOk, cmpError) {\n  if (a.TAG === \"Ok\") {\n    if (b.TAG === \"Ok\") {\n      return cmpOk(a._0, b._0);\n    } else {\n      return 1;\n    }\n  } else if (b.TAG === \"Ok\") {\n    return -1;\n  } else {\n    return cmpError(a._0, b._0);\n  }\n}\n\nfunction forEach(r, f) {\n  if (r.TAG === \"Ok\") {\n    return f(r._0);\n  }\n}\n\nfunction mapError(r, f) {\n  if (r.TAG === \"Ok\") {\n    return r;\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: f(r._0)\n    };\n  }\n}\n\nfunction all(results) {\n  let acc = [];\n  let returnValue;\n  let index = 0;\n  while (returnValue === undefined && index < results.length) {\n    let err = results[index];\n    if (err.TAG === \"Ok\") {\n      acc.push(err._0);\n      index = index + 1 | 0;\n    } else {\n      returnValue = err;\n    }\n  };\n  let error = returnValue;\n  if (error !== undefined) {\n    return error;\n  } else {\n    return {\n      TAG: \"Ok\",\n      _0: acc\n    };\n  }\n}\n\nfunction all2(param) {\n  let b = param[1];\n  let a = param[0];\n  if (a.TAG === \"Ok\") {\n    if (b.TAG === \"Ok\") {\n      return {\n        TAG: \"Ok\",\n        _0: [\n          a._0,\n          b._0\n        ]\n      };\n    } else {\n      return {\n        TAG: \"Error\",\n        _0: b._0\n      };\n    }\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: a._0\n    };\n  }\n}\n\nfunction all3(param) {\n  let c = param[2];\n  let b = param[1];\n  let a = param[0];\n  if (a.TAG === \"Ok\") {\n    if (b.TAG === \"Ok\") {\n      if (c.TAG === \"Ok\") {\n        return {\n          TAG: \"Ok\",\n          _0: [\n            a._0,\n            b._0,\n            c._0\n          ]\n        };\n      } else {\n        return {\n          TAG: \"Error\",\n          _0: c._0\n        };\n      }\n    } else {\n      return {\n        TAG: \"Error\",\n        _0: b._0\n      };\n    }\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: a._0\n    };\n  }\n}\n\nfunction all4(param) {\n  let d = param[3];\n  let c = param[2];\n  let b = param[1];\n  let a = param[0];\n  if (a.TAG === \"Ok\") {\n    if (b.TAG === \"Ok\") {\n      if (c.TAG === \"Ok\") {\n        if (d.TAG === \"Ok\") {\n          return {\n            TAG: \"Ok\",\n            _0: [\n              a._0,\n              b._0,\n              c._0,\n              d._0\n            ]\n          };\n        } else {\n          return {\n            TAG: \"Error\",\n            _0: d._0\n          };\n        }\n      } else {\n        return {\n          TAG: \"Error\",\n          _0: c._0\n        };\n      }\n    } else {\n      return {\n        TAG: \"Error\",\n        _0: b._0\n      };\n    }\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: a._0\n    };\n  }\n}\n\nfunction all5(param) {\n  let e = param[4];\n  let d = param[3];\n  let c = param[2];\n  let b = param[1];\n  let a = param[0];\n  if (a.TAG === \"Ok\") {\n    if (b.TAG === \"Ok\") {\n      if (c.TAG === \"Ok\") {\n        if (d.TAG === \"Ok\") {\n          if (e.TAG === \"Ok\") {\n            return {\n              TAG: \"Ok\",\n              _0: [\n                a._0,\n                b._0,\n                c._0,\n                d._0,\n                e._0\n              ]\n            };\n          } else {\n            return {\n              TAG: \"Error\",\n              _0: e._0\n            };\n          }\n        } else {\n          return {\n            TAG: \"Error\",\n            _0: d._0\n          };\n        }\n      } else {\n        return {\n          TAG: \"Error\",\n          _0: c._0\n        };\n      }\n    } else {\n      return {\n        TAG: \"Error\",\n        _0: b._0\n      };\n    }\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: a._0\n    };\n  }\n}\n\nfunction all6(param) {\n  let f = param[5];\n  let e = param[4];\n  let d = param[3];\n  let c = param[2];\n  let b = param[1];\n  let a = param[0];\n  if (a.TAG === \"Ok\") {\n    if (b.TAG === \"Ok\") {\n      if (c.TAG === \"Ok\") {\n        if (d.TAG === \"Ok\") {\n          if (e.TAG === \"Ok\") {\n            if (f.TAG === \"Ok\") {\n              return {\n                TAG: \"Ok\",\n                _0: [\n                  a._0,\n                  b._0,\n                  c._0,\n                  d._0,\n                  e._0,\n                  f._0\n                ]\n              };\n            } else {\n              return {\n                TAG: \"Error\",\n                _0: f._0\n              };\n            }\n          } else {\n            return {\n              TAG: \"Error\",\n              _0: e._0\n            };\n          }\n        } else {\n          return {\n            TAG: \"Error\",\n            _0: d._0\n          };\n        }\n      } else {\n        return {\n          TAG: \"Error\",\n          _0: c._0\n        };\n      }\n    } else {\n      return {\n        TAG: \"Error\",\n        _0: b._0\n      };\n    }\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: a._0\n    };\n  }\n}\n\nasync function mapOkAsync(res, f) {\n  let value = await res;\n  if (value.TAG === \"Ok\") {\n    return {\n      TAG: \"Ok\",\n      _0: f(value._0)\n    };\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: value._0\n    };\n  }\n}\n\nasync function mapErrorAsync(res, f) {\n  let value = await res;\n  if (value.TAG === \"Ok\") {\n    return {\n      TAG: \"Ok\",\n      _0: value._0\n    };\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: f(value._0)\n    };\n  }\n}\n\nasync function flatMapOkAsync(res, f) {\n  let value = await res;\n  if (value.TAG === \"Ok\") {\n    return await f(value._0);\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: value._0\n    };\n  }\n}\n\nasync function flatMapErrorAsync(res, f) {\n  let value = await res;\n  if (value.TAG === \"Ok\") {\n    return {\n      TAG: \"Ok\",\n      _0: value._0\n    };\n  } else {\n    return await f(value._0);\n  }\n}\n\nlet getExn = getOrThrow;\n\nlet mapWithDefault = mapOr;\n\nlet getWithDefault = getOr;\n\nexport {\n  getExn,\n  getOrThrow,\n  mapOr,\n  mapWithDefault,\n  map,\n  flatMap,\n  getOr,\n  getWithDefault,\n  isOk,\n  isError,\n  equal,\n  compare,\n  forEach,\n  mapError,\n  all,\n  all2,\n  all3,\n  all4,\n  all5,\n  all6,\n  mapOkAsync,\n  mapErrorAsync,\n  flatMapOkAsync,\n  flatMapErrorAsync,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as ResultX from \"../core/ResultX.res.mjs\";\nimport * as Belt_Array from \"@rescript/runtime/lib/es6/Belt_Array.js\";\nimport * as Stdlib_Int from \"@rescript/runtime/lib/es6/Stdlib_Int.js\";\nimport * as Stdlib_Option from \"@rescript/runtime/lib/es6/Stdlib_Option.js\";\nimport * as Stdlib_Result from \"@rescript/runtime/lib/es6/Stdlib_Result.js\";\n\nfunction trimHeaderPart(value) {\n  return value.trim();\n}\n\nfunction parseHeaderLine(raw) {\n  let line = raw.trim();\n  if (line === \"\") {\n    return {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"InvalidHeader\",\n        _0: \"Invalid --header value \\\"\\\". Expected format: Name: Value\"\n      }\n    };\n  }\n  let idx = line.indexOf(\":\");\n  if (idx <= 0) {\n    return {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"InvalidHeader\",\n        _0: `Invalid --header value \"` + raw + `\". Expected format: Name: Value`\n      }\n    };\n  }\n  let name = line.slice(0, idx).trim();\n  let value = line.slice(idx + 1 | 0, line.length).trim();\n  if (name === \"\" || value === \"\") {\n    return {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"InvalidHeader\",\n        _0: `Invalid --header value \"` + raw + `\". Header name and value must be non-empty`\n      }\n    };\n  } else {\n    return {\n      TAG: \"Ok\",\n      _0: {\n        name: name.toLowerCase(),\n        value: value\n      }\n    };\n  }\n}\n\nfunction upsertHeader(acc, entry) {\n  let idx = acc.findIndex(h => h.name === entry.name);\n  if (idx === -1) {\n    return acc.concat([entry]);\n  }\n  let withoutExisting = acc.filter(h => h.name !== entry.name);\n  return withoutExisting.concat([entry]);\n}\n\nfunction parseRequestHeaders(headersOpt, cookiesOpt) {\n  let headerInputs = Stdlib_Option.getOr(headersOpt, []);\n  let cookieInputs = Stdlib_Option.getOr(cookiesOpt, []);\n  let baseResultRef = {\n    contents: {\n      TAG: \"Ok\",\n      _0: []\n    }\n  };\n  headerInputs.forEach(raw => {\n    let acc = baseResultRef.contents;\n    if (acc.TAG !== \"Ok\") {\n      return;\n    }\n    let e = parseHeaderLine(raw);\n    if (e.TAG === \"Ok\") {\n      baseResultRef.contents = {\n        TAG: \"Ok\",\n        _0: upsertHeader(acc._0, e._0)\n      };\n    } else {\n      baseResultRef.contents = {\n        TAG: \"Error\",\n        _0: e._0\n      };\n    }\n  });\n  let baseResult = baseResultRef.contents;\n  if (baseResult.TAG !== \"Ok\") {\n    return baseResult;\n  }\n  let acc = baseResult._0;\n  let cookieValue = cookieInputs.map(trimHeaderPart).filter(v => v !== \"\").join(\"; \");\n  if (cookieValue === \"\") {\n    return {\n      TAG: \"Ok\",\n      _0: acc\n    };\n  } else {\n    return {\n      TAG: \"Ok\",\n      _0: upsertHeader(acc, {\n        name: \"cookie\",\n        value: cookieValue\n      })\n    };\n  }\n}\n\nfunction validateUserAgent(ua) {\n  if (ua !== undefined) {\n    if (ua === \"\") {\n      return {\n        TAG: \"Error\",\n        _0: {\n          TAG: \"ParseError\",\n          message: \"Invalid --user-agent value \\\"\\\". Expected a non-empty string.\",\n          details: undefined\n        }\n      };\n    } else {\n      return {\n        TAG: \"Ok\",\n        _0: ua\n      };\n    }\n  } else {\n    return {\n      TAG: \"Ok\",\n      _0: undefined\n    };\n  }\n}\n\nfunction validateUrl(url) {\n  if (url !== undefined && url !== \"\") {\n    return {\n      TAG: \"Ok\",\n      _0: url\n    };\n  } else {\n    return {\n      TAG: \"Ok\",\n      _0: undefined\n    };\n  }\n}\n\nfunction validateConcurrency(input) {\n  if (input === undefined) {\n    return {\n      TAG: \"Ok\",\n      _0: 5\n    };\n  }\n  let n = Stdlib_Int.fromString(input, undefined);\n  if (n !== undefined) {\n    if (n >= 1 && n <= 20) {\n      return {\n        TAG: \"Ok\",\n        _0: n\n      };\n    } else {\n      return {\n        TAG: \"Error\",\n        _0: {\n          TAG: \"InvalidConcurrency\",\n          _0: `Concurrency must be between 1 and 20, got ` + n.toString()\n        }\n      };\n    }\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"InvalidConcurrency\",\n        _0: `Invalid concurrency value \"` + input + `\". Expected a number between 1 and 20`\n      }\n    };\n  }\n}\n\nfunction validateTimeout(input) {\n  if (input === undefined) {\n    return {\n      TAG: \"Ok\",\n      _0: 30\n    };\n  }\n  let n = Stdlib_Int.fromString(input, undefined);\n  if (n !== undefined) {\n    if (n >= 1) {\n      return {\n        TAG: \"Ok\",\n        _0: n\n      };\n    } else {\n      return {\n        TAG: \"Error\",\n        _0: {\n          TAG: \"InvalidTimeout\",\n          _0: `Timeout must be >= 1 second, got ` + n.toString()\n        }\n      };\n    }\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"InvalidTimeout\",\n        _0: `Invalid timeout value \"` + input + `\". Expected a number of seconds (>= 1)`\n      }\n    };\n  }\n}\n\nfunction validateRetry(input) {\n  if (input === undefined) {\n    return {\n      TAG: \"Ok\",\n      _0: 3\n    };\n  }\n  let n = Stdlib_Int.fromString(input, undefined);\n  if (n !== undefined) {\n    if (n >= 1) {\n      return {\n        TAG: \"Ok\",\n        _0: n\n      };\n    } else {\n      return {\n        TAG: \"Error\",\n        _0: {\n          TAG: \"InvalidRetry\",\n          _0: `Retry count must be >= 1, got ` + n.toString()\n        }\n      };\n    }\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"InvalidRetry\",\n        _0: `Invalid retry value \"` + input + `\". Expected a number (>= 1)`\n      }\n    };\n  }\n}\n\nfunction validateDelay(input) {\n  if (input === undefined) {\n    return {\n      TAG: \"Ok\",\n      _0: 0\n    };\n  }\n  let n = Stdlib_Int.fromString(input, undefined);\n  if (n !== undefined) {\n    if (n >= 0) {\n      return {\n        TAG: \"Ok\",\n        _0: n\n      };\n    } else {\n      return {\n        TAG: \"Error\",\n        _0: {\n          TAG: \"InvalidDelay\",\n          _0: `Delay must be >= 0 ms, got ` + n.toString()\n        }\n      };\n    }\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"InvalidDelay\",\n        _0: `Invalid delay value \"` + input + `\". Expected milliseconds (>= 0)`\n      }\n    };\n  }\n}\n\nfunction validateTableSelector(selector, tableOpt) {\n  if (!tableOpt) {\n    return;\n  }\n  let sel = Stdlib_Option.getOr(selector, \"table\");\n  return {\n    TAG: \"TableSelector\",\n    _0: sel === \"\" ? \"table\" : sel\n  };\n}\n\nfunction validateSchemaSource(schemaOpt, schemaPathOpt, tableSource) {\n  if (tableSource !== undefined) {\n    return {\n      TAG: \"Ok\",\n      _0: tableSource\n    };\n  }\n  if (schemaOpt !== undefined && schemaOpt !== \"\") {\n    return {\n      TAG: \"Ok\",\n      _0: {\n        TAG: \"InlineJson\",\n        _0: schemaOpt\n      }\n    };\n  }\n  if (schemaPathOpt !== undefined && schemaPathOpt !== \"\") {\n    return {\n      TAG: \"Ok\",\n      _0: {\n        TAG: \"FilePath\",\n        _0: schemaPathOpt\n      }\n    };\n  } else {\n    return {\n      TAG: \"Ok\",\n      _0: undefined\n    };\n  }\n}\n\nfunction validateOutputPath(outputOpt) {\n  if (outputOpt !== undefined && outputOpt !== \"\") {\n    return outputOpt;\n  }\n}\n\nfunction formatWarning(outputOpt, formatOpt) {\n  if (outputOpt !== undefined) {\n    return [];\n  } else if (formatOpt !== undefined) {\n    if (formatOpt !== \"json\") {\n      return [\"Warning: --format is ignored unless --output is provided; stdout always uses JSON array format.\"];\n    } else {\n      return [];\n    }\n  } else {\n    return [];\n  }\n}\n\nfunction fetchFlagNames(values) {\n  let entries = [\n    [\n      \"--user-agent\",\n      Stdlib_Option.isSome(values.userAgent)\n    ],\n    [\n      \"--timeout\",\n      Stdlib_Option.isSome(values.timeout)\n    ],\n    [\n      \"--retry\",\n      Stdlib_Option.isSome(values.retry)\n    ],\n    [\n      \"--delay\",\n      Stdlib_Option.isSome(values.delay)\n    ],\n    [\n      \"--header\",\n      Stdlib_Option.isSome(values.header)\n    ],\n    [\n      \"--cookie\",\n      Stdlib_Option.isSome(values.cookie)\n    ]\n  ];\n  return entries.filter(param => param[1]).map(param => param[0]);\n}\n\nfunction fetchWarning(urlOpt, flags) {\n  let match = flags.length;\n  if (urlOpt !== undefined) {\n    return [];\n  } else if (match > 0) {\n    return [`Warning: ` + flags.join(\", \") + ` is ignored in stdin mode (no --url provided).`];\n  } else {\n    return [];\n  }\n}\n\nfunction validateOutputFormat(outputOpt, formatOpt) {\n  if (outputOpt === undefined) {\n    return {\n      TAG: \"Ok\",\n      _0: \"Json\"\n    };\n  }\n  if (formatOpt === undefined) {\n    return {\n      TAG: \"Ok\",\n      _0: \"Json\"\n    };\n  }\n  switch (formatOpt) {\n    case \"json\" :\n      return {\n        TAG: \"Ok\",\n        _0: \"Json\"\n      };\n    case \"ndjson\" :\n      return {\n        TAG: \"Ok\",\n        _0: \"Ndjson\"\n      };\n    default:\n      return {\n        TAG: \"Error\",\n        _0: {\n          TAG: \"ParseError\",\n          message: `Invalid --format value \"` + formatOpt + `\". Valid values are: json, ndjson`,\n          details: undefined\n        }\n      };\n  }\n}\n\nfunction validateSelector(urlOpt, selectorOpt, schemaSrc) {\n  if (urlOpt !== undefined) {\n    if (schemaSrc !== undefined) {\n      return {\n        TAG: \"Ok\",\n        _0: Stdlib_Option.getOr(selectorOpt, \"\")\n      };\n    } else if (selectorOpt !== undefined && selectorOpt !== \"\") {\n      return {\n        TAG: \"Ok\",\n        _0: selectorOpt\n      };\n    } else {\n      return {\n        TAG: \"Error\",\n        _0: {\n          TAG: \"InvalidUrlMode\",\n          _0: \"When using --url, an extraction flag is required (--selector/-s, --schemaPath/-p, or --table/-t)\"\n        }\n      };\n    }\n  } else if (schemaSrc !== undefined) {\n    return {\n      TAG: \"Ok\",\n      _0: Stdlib_Option.getOr(selectorOpt, \"\")\n    };\n  } else if (selectorOpt !== undefined && selectorOpt !== \"\") {\n    return {\n      TAG: \"Ok\",\n      _0: selectorOpt\n    };\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"MissingSelector\",\n        _0: \"Selector is required (--selector/-s)\"\n      }\n    };\n  }\n}\n\nfunction validateExtract(extractOpt) {\n  let s = Stdlib_Option.getOr(extractOpt, \"outerHtml\");\n  switch (s) {\n    case \"innerHtml\" :\n      return {\n        TAG: \"Ok\",\n        _0: \"InnerHtml\"\n      };\n    case \"outerHtml\" :\n      return {\n        TAG: \"Ok\",\n        _0: \"OuterHtml\"\n      };\n    case \"text\" :\n      return {\n        TAG: \"Ok\",\n        _0: \"Text\"\n      };\n    default:\n      if (!s.startsWith(\"attr:\")) {\n        return {\n          TAG: \"Error\",\n          _0: {\n            TAG: \"ParseError\",\n            message: `Invalid --extract value \"` + s + `\". Valid values are: outerHtml, innerHtml, text, attr:<name>`,\n            details: undefined\n          }\n        };\n      }\n      let attr = s.slice(5, s.length);\n      if (attr === \"\") {\n        return {\n          TAG: \"Error\",\n          _0: {\n            TAG: \"ParseError\",\n            message: \"Invalid --extract value \\\"attr:\\\". Expected format: attr:<name>\",\n            details: undefined\n          }\n        };\n      } else {\n        return {\n          TAG: \"Ok\",\n          _0: {\n            TAG: \"Attribute\",\n            _0: attr\n          }\n        };\n      }\n  }\n}\n\nfunction validateScalars(values) {\n  let steps = [\n    acc => Stdlib_Result.map(validateUserAgent(values.userAgent), userAgent => ({\n      userAgent: userAgent,\n      url: acc.url,\n      concurrency: acc.concurrency,\n      timeoutSeconds: acc.timeoutSeconds,\n      retryCount: acc.retryCount,\n      delayMs: acc.delayMs\n    })),\n    acc => Stdlib_Result.map(validateUrl(values.url), url => ({\n      userAgent: acc.userAgent,\n      url: url,\n      concurrency: acc.concurrency,\n      timeoutSeconds: acc.timeoutSeconds,\n      retryCount: acc.retryCount,\n      delayMs: acc.delayMs\n    })),\n    acc => Stdlib_Result.map(validateConcurrency(values.concurrency), concurrency => ({\n      userAgent: acc.userAgent,\n      url: acc.url,\n      concurrency: concurrency,\n      timeoutSeconds: acc.timeoutSeconds,\n      retryCount: acc.retryCount,\n      delayMs: acc.delayMs\n    })),\n    acc => Stdlib_Result.map(validateTimeout(values.timeout), timeoutSeconds => ({\n      userAgent: acc.userAgent,\n      url: acc.url,\n      concurrency: acc.concurrency,\n      timeoutSeconds: timeoutSeconds,\n      retryCount: acc.retryCount,\n      delayMs: acc.delayMs\n    })),\n    acc => Stdlib_Result.map(validateRetry(values.retry), retryCount => ({\n      userAgent: acc.userAgent,\n      url: acc.url,\n      concurrency: acc.concurrency,\n      timeoutSeconds: acc.timeoutSeconds,\n      retryCount: retryCount,\n      delayMs: acc.delayMs\n    })),\n    acc => Stdlib_Result.map(validateDelay(values.delay), delayMs => ({\n      userAgent: acc.userAgent,\n      url: acc.url,\n      concurrency: acc.concurrency,\n      timeoutSeconds: acc.timeoutSeconds,\n      retryCount: acc.retryCount,\n      delayMs: delayMs\n    }))\n  ];\n  return Belt_Array.reduce(steps, {\n    TAG: \"Ok\",\n    _0: {\n      userAgent: undefined,\n      url: undefined,\n      concurrency: 5,\n      timeoutSeconds: 30,\n      retryCount: 3,\n      delayMs: 0\n    }\n  }, ResultX.flatMap);\n}\n\nfunction validateHeadersAndWarnings(values, urlOpt, fetchFlags) {\n  return Stdlib_Result.map(parseRequestHeaders(values.header, values.cookie), requestHeaders => {\n    let formatWarnings = formatWarning(values.output, values.format);\n    let fetchWarnings = fetchWarning(urlOpt, fetchFlags);\n    return [\n      requestHeaders,\n      formatWarnings.concat(fetchWarnings)\n    ];\n  });\n}\n\nfunction runArgsValidation(values) {\n  let fetchFlags = fetchFlagNames(values);\n  let initial_scalars = {\n    userAgent: undefined,\n    url: undefined,\n    concurrency: 5,\n    timeoutSeconds: 30,\n    retryCount: 3,\n    delayMs: 0\n  };\n  let initial_requestHeaders = [];\n  let initial_warnings = [];\n  let initial = {\n    scalars: initial_scalars,\n    schemaSource: undefined,\n    requestHeaders: initial_requestHeaders,\n    warnings: initial_warnings,\n    output: undefined,\n    outputFormat: undefined,\n    selector: \"\",\n    extract: \"OuterHtml\"\n  };\n  let tableSource = validateTableSelector(values.selector, Stdlib_Option.getOr(values.table, false));\n  let steps = [\n    acc => Stdlib_Result.map(validateScalars(values), scalars => ({\n      scalars: scalars,\n      schemaSource: acc.schemaSource,\n      requestHeaders: acc.requestHeaders,\n      warnings: acc.warnings,\n      output: acc.output,\n      outputFormat: acc.outputFormat,\n      selector: acc.selector,\n      extract: acc.extract\n    })),\n    acc => Stdlib_Result.map(validateSchemaSource(values.schema, values.schemaPath, tableSource), schemaSource => ({\n      scalars: acc.scalars,\n      schemaSource: schemaSource,\n      requestHeaders: acc.requestHeaders,\n      warnings: acc.warnings,\n      output: acc.output,\n      outputFormat: acc.outputFormat,\n      selector: acc.selector,\n      extract: acc.extract\n    })),\n    acc => Stdlib_Result.map(validateHeadersAndWarnings(values, acc.scalars.url, fetchFlags), param => ({\n      scalars: acc.scalars,\n      schemaSource: acc.schemaSource,\n      requestHeaders: param[0],\n      warnings: param[1],\n      output: acc.output,\n      outputFormat: acc.outputFormat,\n      selector: acc.selector,\n      extract: acc.extract\n    })),\n    acc => ({\n      TAG: \"Ok\",\n      _0: {\n        scalars: acc.scalars,\n        schemaSource: acc.schemaSource,\n        requestHeaders: acc.requestHeaders,\n        warnings: acc.warnings,\n        output: validateOutputPath(values.output),\n        outputFormat: acc.outputFormat,\n        selector: acc.selector,\n        extract: acc.extract\n      }\n    }),\n    acc => Stdlib_Result.map(validateOutputFormat(acc.output, values.format), outputFormat => ({\n      scalars: acc.scalars,\n      schemaSource: acc.schemaSource,\n      requestHeaders: acc.requestHeaders,\n      warnings: acc.warnings,\n      output: acc.output,\n      outputFormat: outputFormat,\n      selector: acc.selector,\n      extract: acc.extract\n    })),\n    acc => Stdlib_Result.map(validateSelector(acc.scalars.url, values.selector, acc.schemaSource), selector => ({\n      scalars: acc.scalars,\n      schemaSource: acc.schemaSource,\n      requestHeaders: acc.requestHeaders,\n      warnings: acc.warnings,\n      output: acc.output,\n      outputFormat: acc.outputFormat,\n      selector: selector,\n      extract: acc.extract\n    })),\n    acc => Stdlib_Result.map(validateExtract(values.extract), extract => ({\n      scalars: acc.scalars,\n      schemaSource: acc.schemaSource,\n      requestHeaders: acc.requestHeaders,\n      warnings: acc.warnings,\n      output: acc.output,\n      outputFormat: acc.outputFormat,\n      selector: acc.selector,\n      extract: extract\n    }))\n  ];\n  return ResultX.flatMap(Belt_Array.reduce(steps, {\n    TAG: \"Ok\",\n    _0: initial\n  }, ResultX.flatMap), state => {\n    let match = state.scalars;\n    let isMultiple = Stdlib_Option.getOr(values.mode, false);\n    let mode = isMultiple ? \"Multiple\" : \"Single\";\n    return {\n      TAG: \"Ok\",\n      _0: {\n        selector: state.selector,\n        extract: state.extract,\n        mode: mode,\n        schemaSource: state.schemaSource,\n        output: state.output,\n        outputFormat: Stdlib_Option.getOr(state.outputFormat, \"Json\"),\n        warnings: state.warnings,\n        url: match.url,\n        concurrency: match.concurrency,\n        userAgent: match.userAgent,\n        timeoutSeconds: match.timeoutSeconds,\n        retryCount: match.retryCount,\n        delayMs: match.delayMs,\n        requestHeaders: state.requestHeaders\n      }\n    };\n  });\n}\n\nexport {\n  runArgsValidation,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\n\nlet setExitCode = (code => { process.exitCode = code; });\n\nlet registerGlobalRuntimeHandlers = (function(report, exitFn) {\n  if (globalThis.__resScrapyRuntimeHandlersRegistered) {\n    return;\n  }\n  globalThis.__resScrapyRuntimeHandlersRegistered = true;\n\n  var formatError = function(value) {\n    if (value && typeof value === \"object\") {\n      if (typeof value.stack === \"string\") return value.stack;\n      if (typeof value.message === \"string\") return value.message;\n    }\n    return String(value);\n  };\n\n  process.on(\"uncaughtException\", function(err) {\n    report(\"Unexpected runtime error:\");\n    report(formatError(err));\n    exitFn(1);\n  });\n\n  process.on(\"unhandledRejection\", function(reason) {\n    report(\"Unhandled promise rejection:\");\n    report(formatError(reason));\n    exitFn(1);\n  });\n\n  process.on(\"SIGINT\", function() {\n    report(\"Interrupted (SIGINT)\");\n    exitFn(130);\n  });\n\n  process.on(\"SIGTERM\", function() {\n    report(\"Terminated (SIGTERM)\");\n    exitFn(143);\n  });\n});\n\nexport {\n  setExitCode,\n  registerGlobalRuntimeHandlers,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as TableUtils from \"./TableUtils.res.mjs\";\nimport * as NodeHtmlParserBinding from \"../bindings/NodeHtmlParserBinding.res.mjs\";\n\nfunction extract(document, selector) {\n  let table = NodeHtmlParserBinding.querySelector(document, selector);\n  if (table == null) {\n    return {\n      TAG: \"Error\",\n      _0: `No element found for table selector \"` + selector + `\"`\n    };\n  }\n  let headerEls = TableUtils.resolveHeaders(table);\n  let headers = headerEls.entries().map(param => {\n    let text = param[1].textContent.trim();\n    if (text === \"\") {\n      return `col_` + param[0].toString();\n    } else {\n      return text;\n    }\n  }).toArray();\n  let rowEls = TableUtils.resolveRows(table, undefined);\n  let rows = rowEls.values().map(row => {\n    let cells = NodeHtmlParserBinding.querySelectorAll(row, \"td\");\n    let obj = {};\n    headers.entries().forEach(param => {\n      let cell = cells[param[0]];\n      let value = cell !== undefined ? cell.textContent.trim() : \"\";\n      obj[param[1]] = value;\n    });\n    return obj;\n  }).toArray();\n  return {\n    TAG: \"Ok\",\n    _0: rows\n  };\n}\n\nexport {\n  extract,\n}\n/* TableUtils Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as Primitive_option from \"@rescript/runtime/lib/es6/Primitive_option.js\";\nimport * as NodeHtmlParserBinding from \"../bindings/NodeHtmlParserBinding.res.mjs\";\n\nfunction operations_querySelector(doc, selector) {\n  return Primitive_option.fromNullable(NodeHtmlParserBinding.querySelector(doc, selector));\n}\n\nfunction operations_getAttribute(el, name) {\n  return Primitive_option.fromNullable(NodeHtmlParserBinding.getAttribute(el, name));\n}\n\nfunction operations_textContent(el) {\n  return el.textContent;\n}\n\nfunction operations_innerHTML(el) {\n  return el.innerHTML;\n}\n\nfunction operations_outerHTML(el) {\n  return el.outerHTML;\n}\n\nfunction operations_tagName(el) {\n  return el.tagName;\n}\n\nlet operations = {\n  parse: NodeHtmlParserBinding.parse,\n  querySelector: operations_querySelector,\n  querySelectorAll: NodeHtmlParserBinding.querySelectorAll,\n  getAttribute: operations_getAttribute,\n  textContent: operations_textContent,\n  innerHTML: operations_innerHTML,\n  outerHTML: operations_outerHTML,\n  tagName: operations_tagName\n};\n\nexport {\n  operations,\n}\n/* NodeHtmlParserBinding Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as Cli from \"../cli/Cli.res.mjs\";\nimport * as StdIn from \"../stdio/StdIn.res.mjs\";\nimport * as Schema from \"../schema/Schema.res.mjs\";\nimport * as Fetcher from \"../url/Fetcher.res.mjs\";\nimport * as Nodefs from \"node:fs\";\nimport * as AppError from \"./AppError.res.mjs\";\nimport * as ParseCli from \"../cli/ParseCli.res.mjs\";\nimport * as NodeProcess from \"../bindings/NodeProcess.res.mjs\";\nimport * as TableExtractor from \"../table/TableExtractor.res.mjs\";\nimport * as TemplateParser from \"../url/TemplateParser.res.mjs\";\nimport * as NodeHtmlDocument from \"./NodeHtmlDocument.res.mjs\";\nimport * as Promises from \"node:fs/promises\";\n\nfunction exitWithError(ctx, err) {\n  ctx.io.err(AppError.toMessage(err));\n  ctx.io.exit(1);\n}\n\nlet production_deps = {\n  cli: {\n    parseCli: Cli.parse,\n    validateArgs: ParseCli.runArgsValidation,\n    readStdin: StdIn.readFromStdin,\n    getCliVersion: Cli.getCliVersion\n  },\n  fs: {\n    writeFile: (prim0, prim1) => Promises.writeFile(prim0, prim1),\n    appendFile: (prim0, prim1) => Promises.appendFile(prim0, prim1),\n    writeFileSync: (prim0, prim1) => {\n      Nodefs.writeFileSync(prim0, prim1);\n    },\n    appendFileSync: (prim0, prim1) => {\n      Nodefs.appendFileSync(prim0, prim1);\n    }\n  },\n  serialize: {\n    stringifyJson: prim => JSON.stringify(prim),\n    stringifyTableRows: prim => JSON.stringify(prim),\n    stringifyStrings: prim => JSON.stringify(prim)\n  },\n  doc: {\n    documentOps: NodeHtmlDocument.operations,\n    extractTable: TableExtractor.extract,\n    parseTemplate: TemplateParser.parse\n  },\n  schema: {\n    loadSchema: Schema.loadSchema,\n    applySchema: Schema.applySchema\n  },\n  fetch: {\n    fetchAll: Fetcher.fetchAll\n  },\n  perf: {\n    performanceNow: prim => performance.now()\n  }\n};\n\nlet production_io = {\n  out: prim => {\n    console.log(prim);\n  },\n  err: prim => {\n    console.error(prim);\n  },\n  warn: prim => {\n    console.error(prim);\n  },\n  exit: NodeProcess.setExitCode\n};\n\nlet production = {\n  deps: production_deps,\n  io: production_io\n};\n\nexport {\n  exitWithError,\n  production,\n}\n/* Cli Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as AppError from \"./AppError.res.mjs\";\nimport * as ExnUtils from \"./ExnUtils.res.mjs\";\nimport * as NodeUtil from \"../bindings/NodeUtil.res.mjs\";\nimport * as Stdlib_Promise from \"@rescript/runtime/lib/es6/Stdlib_Promise.js\";\nimport * as Primitive_exceptions from \"@rescript/runtime/lib/es6/Primitive_exceptions.js\";\n\nfunction jsonArrayToNdjson(raw) {\n  let match = NodeUtil.jsonParse(raw);\n  if (Array.isArray(match)) {\n    return match.map(prim => JSON.stringify(prim)).join(\"\\n\");\n  }\n}\n\nfunction computeOutputText(target, jsonText, format) {\n  if (typeof target !== \"object\") {\n    return {\n      TAG: \"Ok\",\n      _0: jsonText\n    };\n  }\n  if (format === \"Json\") {\n    return {\n      TAG: \"Ok\",\n      _0: jsonText\n    };\n  }\n  let ndjson = jsonArrayToNdjson(jsonText);\n  if (ndjson !== undefined) {\n    return {\n      TAG: \"Ok\",\n      _0: ndjson\n    };\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"WriteError\",\n        _0: \"Cannot write NDJSON output: expected extraction result to be a JSON array\"\n      }\n    };\n  }\n}\n\nfunction writeError(path, exn) {\n  return {\n    TAG: \"WriteError\",\n    _0: \"Failed to write output file \\\"\" + path + \"\\\": \" + ExnUtils.message(exn)\n  };\n}\n\nfunction writeText(target, text, writeFile, out) {\n  if (typeof target !== \"object\") {\n    out(text);\n    return {\n      TAG: \"Ok\",\n      _0: undefined\n    };\n  }\n  let path = target._0;\n  try {\n    writeFile(path, text);\n    return {\n      TAG: \"Ok\",\n      _0: undefined\n    };\n  } catch (raw_exn) {\n    let exn = Primitive_exceptions.internalToException(raw_exn);\n    return {\n      TAG: \"Error\",\n      _0: writeError(path, exn)\n    };\n  }\n}\n\nfunction write(target, format, jsonText, writeFile, out) {\n  let e = computeOutputText(target, jsonText, format);\n  if (e.TAG === \"Ok\") {\n    return writeText(target, e._0, writeFile, out);\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: e._0\n    };\n  }\n}\n\nfunction writeTextAsync(target, text, writeFile, out) {\n  if (typeof target !== \"object\") {\n    out(text);\n    return Promise.resolve({\n      TAG: \"Ok\",\n      _0: undefined\n    });\n  }\n  let path = target._0;\n  return Stdlib_Promise.$$catch(writeFile(path, text).then(() => Promise.resolve({\n    TAG: \"Ok\",\n    _0: undefined\n  })), exn => Promise.resolve({\n    TAG: \"Error\",\n    _0: writeError(path, exn)\n  }));\n}\n\nfunction writeAsync(target, format, jsonText, writeFile, out) {\n  let e = computeOutputText(target, jsonText, format);\n  if (e.TAG === \"Ok\") {\n    return writeTextAsync(target, e._0, writeFile, out);\n  } else {\n    return Promise.resolve({\n      TAG: \"Error\",\n      _0: e._0\n    });\n  }\n}\n\nfunction outputTargetFromOptions(options) {\n  let path = options.output;\n  if (path !== undefined) {\n    return {\n      TAG: \"File\",\n      _0: path\n    };\n  } else {\n    return \"Stdout\";\n  }\n}\n\nfunction writeOutput(ctx, options, jsonText) {\n  let err = write(outputTargetFromOptions(options), options.outputFormat, jsonText, ctx.deps.fs.writeFileSync, ctx.io.out);\n  if (err.TAG === \"Ok\") {\n    return;\n  }\n  ctx.io.err(AppError.toMessage(err._0));\n  ctx.io.exit(1);\n}\n\nexport {\n  jsonArrayToNdjson,\n  computeOutputText,\n  writeError,\n  writeText,\n  write,\n  writeTextAsync,\n  writeAsync,\n  outputTargetFromOptions,\n  writeOutput,\n}\n/* ExnUtils Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as ResultX from \"../core/ResultX.res.mjs\";\nimport * as AppError from \"../core/AppError.res.mjs\";\nimport * as AppContext from \"../core/AppContext.res.mjs\";\nimport * as OutputWriter from \"../core/OutputWriter.res.mjs\";\n\nfunction hasOnlyAggregateFields(schema) {\n  return schema.fields.values().every(param => {\n    let match = param[1].fieldType;\n    switch (match.TAG) {\n      case \"Count\" :\n      case \"List\" :\n        return true;\n      default:\n        return false;\n    }\n  });\n}\n\nfunction warnIfZipAggregateOnly(ctx, schema) {\n  let match = schema.config.rowSelector;\n  let isZipMode = match === undefined;\n  if (isZipMode && hasOnlyAggregateFields(schema)) {\n    return ctx.io.warn(\"Warning: schema uses zip mode (no config.rowSelector) with only aggregate fields (count/list), so no rows can be produced. Add config.rowSelector for row-based extraction.\");\n  }\n}\n\nfunction loadSchema(ctx, source) {\n  switch (source.TAG) {\n    case \"InlineJson\" :\n      return ctx.deps.schema.loadSchema(true, source._0);\n    case \"FilePath\" :\n      return ctx.deps.schema.loadSchema(false, source._0);\n    case \"TableSelector\" :\n      return {\n        TAG: \"Error\",\n        _0: {\n          TAG: \"ExtractionError\",\n          _0: \"Unreachable: table mode schema load\"\n        }\n      };\n  }\n}\n\nfunction runSchemaMode(ctx, document, source, options) {\n  let err = ResultX.mapError(loadSchema(ctx, source), AppError.mapSchemaError);\n  if (err.TAG !== \"Ok\") {\n    return AppContext.exitWithError(ctx, err._0);\n  }\n  let schema = err._0;\n  warnIfZipAggregateOnly(ctx, schema);\n  let err$1 = ResultX.mapError(ctx.deps.schema.applySchema(document, schema), AppError.mapSchemaError);\n  if (err$1.TAG === \"Ok\") {\n    return OutputWriter.writeOutput(ctx, options, ctx.deps.serialize.stringifyJson(err$1._0));\n  } else {\n    return AppContext.exitWithError(ctx, err$1._0);\n  }\n}\n\nlet Iter;\n\nexport {\n  Iter,\n  hasOnlyAggregateFields,\n  warnIfZipAggregateOnly,\n  loadSchema,\n  runSchemaMode,\n}\n/* AppContext Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\n\nfunction fromOptions(options) {\n  let source = options.schemaSource;\n  if (source === undefined) {\n    return {\n      TAG: \"SelectorMode\",\n      selector: options.selector,\n      extract: options.extract,\n      mode: options.mode\n    };\n  }\n  switch (source.TAG) {\n    case \"InlineJson\" :\n    case \"FilePath\" :\n      return {\n        TAG: \"SchemaMode\",\n        _0: source\n      };\n    case \"TableSelector\" :\n      return {\n        TAG: \"TableMode\",\n        _0: source._0\n      };\n  }\n}\n\nexport {\n  fromOptions,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as ExnUtils from \"../core/ExnUtils.res.mjs\";\nimport * as OutputWriter from \"../core/OutputWriter.res.mjs\";\nimport * as Primitive_exceptions from \"@rescript/runtime/lib/es6/Primitive_exceptions.js\";\n\nfunction extractJsonArray(json) {\n  if (Array.isArray(json)) {\n    return json;\n  } else {\n    return [json];\n  }\n}\n\nfunction emitWriteError(err, path, operation, exn) {\n  let msg = operation + ` \"` + path + `\": ` + ExnUtils.message(exn);\n  err(`Warning: ` + msg);\n  return {\n    TAG: \"Error\",\n    _0: {\n      TAG: \"WriteError\",\n      _0: msg\n    }\n  };\n}\n\nfunction writeStdoutNdjson(out, stringifyJson, json) {\n  let rows = extractJsonArray(json);\n  rows.forEach(row => out(stringifyJson(row)));\n}\n\nasync function appendNdjsonToFile(appendFile, err, stringifyJson, path, json) {\n  let rows = extractJsonArray(json);\n  let content = rows.map(stringifyJson).join(\"\\n\") + \"\\n\";\n  try {\n    await appendFile(path, content);\n    return {\n      TAG: \"Ok\",\n      _0: undefined\n    };\n  } catch (raw_exn) {\n    let exn = Primitive_exceptions.internalToException(raw_exn);\n    return emitWriteError(err, path, \"Failed to append to output file\", exn);\n  }\n}\n\nfunction beginJsonArraySync(writeFileSync, err, path) {\n  try {\n    writeFileSync(path, \"[\");\n    return {\n      TAG: \"Ok\",\n      _0: undefined\n    };\n  } catch (raw_exn) {\n    let exn = Primitive_exceptions.internalToException(raw_exn);\n    return emitWriteError(err, path, \"Failed to open JSON output file\", exn);\n  }\n}\n\nasync function appendJsonRowAsync(appendFile, err, stringifyJson, path, isFirstRow, json) {\n  let rows = extractJsonArray(json);\n  let joined = rows.map(stringifyJson).join(\",\");\n  let content = isFirstRow ? joined : \",\" + joined;\n  try {\n    await appendFile(path, content);\n    return {\n      TAG: \"Ok\",\n      _0: undefined\n    };\n  } catch (raw_exn) {\n    let exn = Primitive_exceptions.internalToException(raw_exn);\n    return emitWriteError(err, path, \"Failed to append to JSON output file\", exn);\n  }\n}\n\nfunction endJsonArraySync(appendFileSync, err, path) {\n  try {\n    appendFileSync(path, \"]\");\n    return {\n      TAG: \"Ok\",\n      _0: undefined\n    };\n  } catch (raw_exn) {\n    let exn = Primitive_exceptions.internalToException(raw_exn);\n    return emitWriteError(err, path, \"Failed to close JSON output file\", exn);\n  }\n}\n\nfunction writeFileJsonSync(writeFileSync, err, stringifyJson, path, rows) {\n  let jsonText = stringifyJson(rows);\n  let e = OutputWriter.computeOutputText({\n    TAG: \"File\",\n    _0: path\n  }, jsonText, \"Json\");\n  if (e.TAG === \"Ok\") {\n    return OutputWriter.writeText({\n      TAG: \"File\",\n      _0: path\n    }, e._0, writeFileSync, err);\n  } else {\n    return {\n      TAG: \"Error\",\n      _0: e._0\n    };\n  }\n}\n\nexport {\n  extractJsonArray,\n  emitWriteError,\n  writeStdoutNdjson,\n  appendNdjsonToFile,\n  beginJsonArraySync,\n  appendJsonRowAsync,\n  endJsonArraySync,\n  writeFileJsonSync,\n}\n/* ExnUtils Not a pure module */\n","\n\nimport * as Stdlib_Array from \"./Stdlib_Array.js\";\nimport * as Primitive_int from \"./Primitive_int.js\";\nimport * as Primitive_option from \"./Primitive_option.js\";\n\nfunction head(x) {\n  if (x !== 0) {\n    return Primitive_option.some(x.hd);\n  }\n}\n\nfunction headOrThrow(x) {\n  if (x !== 0) {\n    return x.hd;\n  }\n  throw {\n    RE_EXN_ID: \"Not_found\",\n    Error: new Error()\n  };\n}\n\nfunction tail(x) {\n  if (x !== 0) {\n    return x.tl;\n  }\n}\n\nfunction tailOrThrow(x) {\n  if (x !== 0) {\n    return x.tl;\n  }\n  throw {\n    RE_EXN_ID: \"Not_found\",\n    Error: new Error()\n  };\n}\n\nfunction add(xs, x) {\n  return {\n    hd: x,\n    tl: xs\n  };\n}\n\nfunction get(x, n) {\n  if (n < 0) {\n    return;\n  } else {\n    let _x = x;\n    let _n = n;\n    while (true) {\n      let n$1 = _n;\n      let x$1 = _x;\n      if (x$1 === 0) {\n        return;\n      }\n      if (n$1 === 0) {\n        return Primitive_option.some(x$1.hd);\n      }\n      _n = n$1 - 1 | 0;\n      _x = x$1.tl;\n      continue;\n    };\n  }\n}\n\nfunction getOrThrow(x, n) {\n  if (n < 0) {\n    throw {\n      RE_EXN_ID: \"Not_found\",\n      Error: new Error()\n    };\n  }\n  let _x = x;\n  let _n = n;\n  while (true) {\n    let n$1 = _n;\n    let x$1 = _x;\n    if (x$1 !== 0) {\n      if (n$1 === 0) {\n        return x$1.hd;\n      }\n      _n = n$1 - 1 | 0;\n      _x = x$1.tl;\n      continue;\n    }\n    throw {\n      RE_EXN_ID: \"Not_found\",\n      Error: new Error()\n    };\n  };\n}\n\nfunction partitionAux(p, _cell, _precX, _precY) {\n  while (true) {\n    let precY = _precY;\n    let precX = _precX;\n    let cell = _cell;\n    if (cell === 0) {\n      return;\n    }\n    let t = cell.tl;\n    let h = cell.hd;\n    let next = {\n      hd: h,\n      tl: /* [] */0\n    };\n    if (p(h)) {\n      precX.tl = next;\n      _precX = next;\n      _cell = t;\n      continue;\n    }\n    precY.tl = next;\n    _precY = next;\n    _cell = t;\n    continue;\n  };\n}\n\nfunction splitAux(_cell, _precX, _precY) {\n  while (true) {\n    let precY = _precY;\n    let precX = _precX;\n    let cell = _cell;\n    if (cell === 0) {\n      return;\n    }\n    let match = cell.hd;\n    let nextA = {\n      hd: match[0],\n      tl: /* [] */0\n    };\n    let nextB = {\n      hd: match[1],\n      tl: /* [] */0\n    };\n    precX.tl = nextA;\n    precY.tl = nextB;\n    _precY = nextB;\n    _precX = nextA;\n    _cell = cell.tl;\n    continue;\n  };\n}\n\nfunction copyAuxCont(_cellX, _prec) {\n  while (true) {\n    let prec = _prec;\n    let cellX = _cellX;\n    if (cellX === 0) {\n      return prec;\n    }\n    let next = {\n      hd: cellX.hd,\n      tl: /* [] */0\n    };\n    prec.tl = next;\n    _prec = next;\n    _cellX = cellX.tl;\n    continue;\n  };\n}\n\nfunction copyAuxWitFilter(f, _cellX, _prec) {\n  while (true) {\n    let prec = _prec;\n    let cellX = _cellX;\n    if (cellX === 0) {\n      return;\n    }\n    let t = cellX.tl;\n    let h = cellX.hd;\n    if (f(h)) {\n      let next = {\n        hd: h,\n        tl: /* [] */0\n      };\n      prec.tl = next;\n      _prec = next;\n      _cellX = t;\n      continue;\n    }\n    _cellX = t;\n    continue;\n  };\n}\n\nfunction copyAuxWithFilterIndex(f, _cellX, _prec, _i) {\n  while (true) {\n    let i = _i;\n    let prec = _prec;\n    let cellX = _cellX;\n    if (cellX === 0) {\n      return;\n    }\n    let t = cellX.tl;\n    let h = cellX.hd;\n    if (f(h, i)) {\n      let next = {\n        hd: h,\n        tl: /* [] */0\n      };\n      prec.tl = next;\n      _i = i + 1 | 0;\n      _prec = next;\n      _cellX = t;\n      continue;\n    }\n    _i = i + 1 | 0;\n    _cellX = t;\n    continue;\n  };\n}\n\nfunction copyAuxWitFilterMap(f, _cellX, _prec) {\n  while (true) {\n    let prec = _prec;\n    let cellX = _cellX;\n    if (cellX === 0) {\n      return;\n    }\n    let t = cellX.tl;\n    let h = f(cellX.hd);\n    if (h !== undefined) {\n      let next = {\n        hd: Primitive_option.valFromOption(h),\n        tl: /* [] */0\n      };\n      prec.tl = next;\n      _prec = next;\n      _cellX = t;\n      continue;\n    }\n    _cellX = t;\n    continue;\n  };\n}\n\nfunction removeAssocAuxWithMap(_cellX, x, _prec, f) {\n  while (true) {\n    let prec = _prec;\n    let cellX = _cellX;\n    if (cellX === 0) {\n      return false;\n    }\n    let t = cellX.tl;\n    let h = cellX.hd;\n    if (f(h[0], x)) {\n      prec.tl = t;\n      return true;\n    }\n    let next = {\n      hd: h,\n      tl: /* [] */0\n    };\n    prec.tl = next;\n    _prec = next;\n    _cellX = t;\n    continue;\n  };\n}\n\nfunction setAssocAuxWithMap(_cellX, x, k, _prec, eq) {\n  while (true) {\n    let prec = _prec;\n    let cellX = _cellX;\n    if (cellX === 0) {\n      return false;\n    }\n    let t = cellX.tl;\n    let h = cellX.hd;\n    if (eq(h[0], x)) {\n      prec.tl = {\n        hd: [\n          x,\n          k\n        ],\n        tl: t\n      };\n      return true;\n    }\n    let next = {\n      hd: h,\n      tl: /* [] */0\n    };\n    prec.tl = next;\n    _prec = next;\n    _cellX = t;\n    continue;\n  };\n}\n\nfunction copyAuxWithMap(_cellX, _prec, f) {\n  while (true) {\n    let prec = _prec;\n    let cellX = _cellX;\n    if (cellX === 0) {\n      return;\n    }\n    let next = {\n      hd: f(cellX.hd),\n      tl: /* [] */0\n    };\n    prec.tl = next;\n    _prec = next;\n    _cellX = cellX.tl;\n    continue;\n  };\n}\n\nfunction zipAux(_cellX, _cellY, _prec) {\n  while (true) {\n    let prec = _prec;\n    let cellY = _cellY;\n    let cellX = _cellX;\n    if (cellX === 0) {\n      return;\n    }\n    if (cellY === 0) {\n      return;\n    }\n    let next = {\n      hd: [\n        cellX.hd,\n        cellY.hd\n      ],\n      tl: /* [] */0\n    };\n    prec.tl = next;\n    _prec = next;\n    _cellY = cellY.tl;\n    _cellX = cellX.tl;\n    continue;\n  };\n}\n\nfunction copyAuxWithMap2(f, _cellX, _cellY, _prec) {\n  while (true) {\n    let prec = _prec;\n    let cellY = _cellY;\n    let cellX = _cellX;\n    if (cellX === 0) {\n      return;\n    }\n    if (cellY === 0) {\n      return;\n    }\n    let next = {\n      hd: f(cellX.hd, cellY.hd),\n      tl: /* [] */0\n    };\n    prec.tl = next;\n    _prec = next;\n    _cellY = cellY.tl;\n    _cellX = cellX.tl;\n    continue;\n  };\n}\n\nfunction copyAuxWithMapI(f, _i, _cellX, _prec) {\n  while (true) {\n    let prec = _prec;\n    let cellX = _cellX;\n    let i = _i;\n    if (cellX === 0) {\n      return;\n    }\n    let next = {\n      hd: f(cellX.hd, i),\n      tl: /* [] */0\n    };\n    prec.tl = next;\n    _prec = next;\n    _cellX = cellX.tl;\n    _i = i + 1 | 0;\n    continue;\n  };\n}\n\nfunction takeAux(_n, _cell, _prec) {\n  while (true) {\n    let prec = _prec;\n    let cell = _cell;\n    let n = _n;\n    if (n === 0) {\n      return true;\n    }\n    if (cell === 0) {\n      return false;\n    }\n    let cell$1 = {\n      hd: cell.hd,\n      tl: /* [] */0\n    };\n    prec.tl = cell$1;\n    _prec = cell$1;\n    _cell = cell.tl;\n    _n = n - 1 | 0;\n    continue;\n  };\n}\n\nfunction splitAtAux(_n, _cell, _prec) {\n  while (true) {\n    let prec = _prec;\n    let cell = _cell;\n    let n = _n;\n    if (n === 0) {\n      return cell;\n    }\n    if (cell === 0) {\n      return;\n    }\n    let cell$1 = {\n      hd: cell.hd,\n      tl: /* [] */0\n    };\n    prec.tl = cell$1;\n    _prec = cell$1;\n    _cell = cell.tl;\n    _n = n - 1 | 0;\n    continue;\n  };\n}\n\nfunction take(lst, n) {\n  if (n < 0) {\n    return;\n  }\n  if (n === 0) {\n    return /* [] */0;\n  }\n  if (lst === 0) {\n    return;\n  }\n  let cell = {\n    hd: lst.hd,\n    tl: /* [] */0\n  };\n  let has = takeAux(n - 1 | 0, lst.tl, cell);\n  if (has) {\n    return cell;\n  }\n}\n\nfunction drop(lst, n) {\n  if (n < 0) {\n    return;\n  } else {\n    let _l = lst;\n    let _n = n;\n    while (true) {\n      let n$1 = _n;\n      let l = _l;\n      if (n$1 === 0) {\n        return l;\n      }\n      if (l === 0) {\n        return;\n      }\n      _n = n$1 - 1 | 0;\n      _l = l.tl;\n      continue;\n    };\n  }\n}\n\nfunction splitAt(lst, n) {\n  if (n < 0) {\n    return;\n  }\n  if (n === 0) {\n    return [\n      /* [] */0,\n      lst\n    ];\n  }\n  if (lst === 0) {\n    return;\n  }\n  let cell = {\n    hd: lst.hd,\n    tl: /* [] */0\n  };\n  let rest = splitAtAux(n - 1 | 0, lst.tl, cell);\n  if (rest !== undefined) {\n    return [\n      cell,\n      rest\n    ];\n  }\n}\n\nfunction concat(xs, ys) {\n  if (xs === 0) {\n    return ys;\n  }\n  let cell = {\n    hd: xs.hd,\n    tl: /* [] */0\n  };\n  copyAuxCont(xs.tl, cell).tl = ys;\n  return cell;\n}\n\nfunction map(xs, f) {\n  if (xs === 0) {\n    return /* [] */0;\n  }\n  let cell = {\n    hd: f(xs.hd),\n    tl: /* [] */0\n  };\n  copyAuxWithMap(xs.tl, cell, f);\n  return cell;\n}\n\nfunction zipBy(l1, l2, f) {\n  if (l1 === 0) {\n    return /* [] */0;\n  }\n  if (l2 === 0) {\n    return /* [] */0;\n  }\n  let cell = {\n    hd: f(l1.hd, l2.hd),\n    tl: /* [] */0\n  };\n  copyAuxWithMap2(f, l1.tl, l2.tl, cell);\n  return cell;\n}\n\nfunction mapWithIndex(xs, f) {\n  if (xs === 0) {\n    return /* [] */0;\n  }\n  let cell = {\n    hd: f(xs.hd, 0),\n    tl: /* [] */0\n  };\n  copyAuxWithMapI(f, 1, xs.tl, cell);\n  return cell;\n}\n\nfunction fromInitializer(n, f) {\n  if (n <= 0) {\n    return /* [] */0;\n  }\n  let headX = {\n    hd: f(0),\n    tl: /* [] */0\n  };\n  let cur = headX;\n  let i = 1;\n  while (i < n) {\n    let v = {\n      hd: f(i),\n      tl: /* [] */0\n    };\n    cur.tl = v;\n    cur = v;\n    i = i + 1 | 0;\n  };\n  return headX;\n}\n\nfunction make(n, v) {\n  if (n <= 0) {\n    return /* [] */0;\n  }\n  let headX = {\n    hd: v,\n    tl: /* [] */0\n  };\n  let cur = headX;\n  let i = 1;\n  while (i < n) {\n    let v$1 = {\n      hd: v,\n      tl: /* [] */0\n    };\n    cur.tl = v$1;\n    cur = v$1;\n    i = i + 1 | 0;\n  };\n  return headX;\n}\n\nfunction length(xs) {\n  let _x = xs;\n  let _acc = 0;\n  while (true) {\n    let acc = _acc;\n    let x = _x;\n    if (x === 0) {\n      return acc;\n    }\n    _acc = acc + 1 | 0;\n    _x = x.tl;\n    continue;\n  };\n}\n\nfunction fillAux(arr, _i, _x) {\n  while (true) {\n    let x = _x;\n    let i = _i;\n    if (x === 0) {\n      return;\n    }\n    arr[i] = x.hd;\n    _x = x.tl;\n    _i = i + 1 | 0;\n    continue;\n  };\n}\n\nfunction fromArray(a) {\n  let _i = a.length - 1 | 0;\n  let _res = /* [] */0;\n  while (true) {\n    let res = _res;\n    let i = _i;\n    if (i < 0) {\n      return res;\n    }\n    _res = {\n      hd: a[i],\n      tl: res\n    };\n    _i = i - 1 | 0;\n    continue;\n  };\n}\n\nfunction toArray(x) {\n  let len = length(x);\n  let arr = new Array(len);\n  fillAux(arr, 0, x);\n  return arr;\n}\n\nfunction shuffle(xs) {\n  let v = toArray(xs);\n  Stdlib_Array.shuffle(v);\n  return fromArray(v);\n}\n\nfunction reverseConcat(_l1, _l2) {\n  while (true) {\n    let l2 = _l2;\n    let l1 = _l1;\n    if (l1 === 0) {\n      return l2;\n    }\n    _l2 = {\n      hd: l1.hd,\n      tl: l2\n    };\n    _l1 = l1.tl;\n    continue;\n  };\n}\n\nfunction reverse(l) {\n  return reverseConcat(l, /* [] */0);\n}\n\nfunction flatAux(_prec, _xs) {\n  while (true) {\n    let xs = _xs;\n    let prec = _prec;\n    if (xs !== 0) {\n      _xs = xs.tl;\n      _prec = copyAuxCont(xs.hd, prec);\n      continue;\n    }\n    prec.tl = /* [] */0;\n    return;\n  };\n}\n\nfunction flat(_xs) {\n  while (true) {\n    let xs = _xs;\n    if (xs === 0) {\n      return /* [] */0;\n    }\n    let match = xs.hd;\n    if (match !== 0) {\n      let cell = {\n        hd: match.hd,\n        tl: /* [] */0\n      };\n      flatAux(copyAuxCont(match.tl, cell), xs.tl);\n      return cell;\n    }\n    _xs = xs.tl;\n    continue;\n  };\n}\n\nfunction concatMany(xs) {\n  let len = xs.length;\n  if (len === 1) {\n    return xs[0];\n  }\n  if (len === 0) {\n    return /* [] */0;\n  }\n  let len$1 = xs.length;\n  let v = xs[len$1 - 1 | 0];\n  for (let i = len$1 - 2 | 0; i >= 0; --i) {\n    v = concat(xs[i], v);\n  }\n  return v;\n}\n\nfunction mapReverse(l, f) {\n  let _accu = /* [] */0;\n  let _xs = l;\n  while (true) {\n    let xs = _xs;\n    let accu = _accu;\n    if (xs === 0) {\n      return accu;\n    }\n    _xs = xs.tl;\n    _accu = {\n      hd: f(xs.hd),\n      tl: accu\n    };\n    continue;\n  };\n}\n\nfunction forEach(_xs, f) {\n  while (true) {\n    let xs = _xs;\n    if (xs === 0) {\n      return;\n    }\n    f(xs.hd);\n    _xs = xs.tl;\n    continue;\n  };\n}\n\nfunction forEachWithIndex(l, f) {\n  let _xs = l;\n  let _i = 0;\n  while (true) {\n    let i = _i;\n    let xs = _xs;\n    if (xs === 0) {\n      return;\n    }\n    f(xs.hd, i);\n    _i = i + 1 | 0;\n    _xs = xs.tl;\n    continue;\n  };\n}\n\nfunction reduce(_l, _accu, f) {\n  while (true) {\n    let accu = _accu;\n    let l = _l;\n    if (l === 0) {\n      return accu;\n    }\n    _accu = f(accu, l.hd);\n    _l = l.tl;\n    continue;\n  };\n}\n\nfunction reduceReverseUnsafe(l, accu, f) {\n  if (l !== 0) {\n    return f(reduceReverseUnsafe(l.tl, accu, f), l.hd);\n  } else {\n    return accu;\n  }\n}\n\nfunction reduceReverse(l, acc, f) {\n  let len = length(l);\n  if (len < 1000) {\n    return reduceReverseUnsafe(l, acc, f);\n  } else {\n    let a = toArray(l);\n    let r = acc;\n    for (let i = a.length - 1 | 0; i >= 0; --i) {\n      r = f(r, a[i]);\n    }\n    return r;\n  }\n}\n\nfunction reduceWithIndex(l, acc, f) {\n  let _l = l;\n  let _acc = acc;\n  let _i = 0;\n  while (true) {\n    let i = _i;\n    let acc$1 = _acc;\n    let l$1 = _l;\n    if (l$1 === 0) {\n      return acc$1;\n    }\n    _i = i + 1 | 0;\n    _acc = f(acc$1, l$1.hd, i);\n    _l = l$1.tl;\n    continue;\n  };\n}\n\nfunction mapReverse2(l1, l2, f) {\n  let _l1 = l1;\n  let _l2 = l2;\n  let _accu = /* [] */0;\n  while (true) {\n    let accu = _accu;\n    let l2$1 = _l2;\n    let l1$1 = _l1;\n    if (l1$1 === 0) {\n      return accu;\n    }\n    if (l2$1 === 0) {\n      return accu;\n    }\n    _accu = {\n      hd: f(l1$1.hd, l2$1.hd),\n      tl: accu\n    };\n    _l2 = l2$1.tl;\n    _l1 = l1$1.tl;\n    continue;\n  };\n}\n\nfunction forEach2(_l1, _l2, f) {\n  while (true) {\n    let l2 = _l2;\n    let l1 = _l1;\n    if (l1 === 0) {\n      return;\n    }\n    if (l2 === 0) {\n      return;\n    }\n    f(l1.hd, l2.hd);\n    _l2 = l2.tl;\n    _l1 = l1.tl;\n    continue;\n  };\n}\n\nfunction reduce2(_l1, _l2, _accu, f) {\n  while (true) {\n    let accu = _accu;\n    let l2 = _l2;\n    let l1 = _l1;\n    if (l1 === 0) {\n      return accu;\n    }\n    if (l2 === 0) {\n      return accu;\n    }\n    _accu = f(accu, l1.hd, l2.hd);\n    _l2 = l2.tl;\n    _l1 = l1.tl;\n    continue;\n  };\n}\n\nfunction reduceReverse2Unsafe(l1, l2, accu, f) {\n  if (l1 !== 0 && l2 !== 0) {\n    return f(reduceReverse2Unsafe(l1.tl, l2.tl, accu, f), l1.hd, l2.hd);\n  } else {\n    return accu;\n  }\n}\n\nfunction reduceReverse2(l1, l2, acc, f) {\n  let len = length(l1);\n  if (len < 1000) {\n    return reduceReverse2Unsafe(l1, l2, acc, f);\n  } else {\n    let a = toArray(l1);\n    let b = toArray(l2);\n    let r = acc;\n    let len$1 = Primitive_int.min(a.length, b.length);\n    for (let i = len$1 - 1 | 0; i >= 0; --i) {\n      r = f(r, a[i], b[i]);\n    }\n    return r;\n  }\n}\n\nfunction every(_xs, p) {\n  while (true) {\n    let xs = _xs;\n    if (xs === 0) {\n      return true;\n    }\n    if (!p(xs.hd)) {\n      return false;\n    }\n    _xs = xs.tl;\n    continue;\n  };\n}\n\nfunction some(_xs, p) {\n  while (true) {\n    let xs = _xs;\n    if (xs === 0) {\n      return false;\n    }\n    if (p(xs.hd)) {\n      return true;\n    }\n    _xs = xs.tl;\n    continue;\n  };\n}\n\nfunction every2(_l1, _l2, p) {\n  while (true) {\n    let l2 = _l2;\n    let l1 = _l1;\n    if (l1 === 0) {\n      return true;\n    }\n    if (l2 === 0) {\n      return true;\n    }\n    if (!p(l1.hd, l2.hd)) {\n      return false;\n    }\n    _l2 = l2.tl;\n    _l1 = l1.tl;\n    continue;\n  };\n}\n\nfunction compareLength(_l1, _l2) {\n  while (true) {\n    let l2 = _l2;\n    let l1 = _l1;\n    if (l1 === 0) {\n      if (l2 !== 0) {\n        return -1;\n      } else {\n        return 0;\n      }\n    }\n    if (l2 === 0) {\n      return 1;\n    }\n    _l2 = l2.tl;\n    _l1 = l1.tl;\n    continue;\n  };\n}\n\nfunction compare(_l1, _l2, p) {\n  while (true) {\n    let l2 = _l2;\n    let l1 = _l1;\n    if (l1 === 0) {\n      if (l2 !== 0) {\n        return -1;\n      } else {\n        return 0;\n      }\n    }\n    if (l2 === 0) {\n      return 1;\n    }\n    let c = p(l1.hd, l2.hd);\n    if (c !== 0) {\n      return c;\n    }\n    _l2 = l2.tl;\n    _l1 = l1.tl;\n    continue;\n  };\n}\n\nfunction equal(_l1, _l2, p) {\n  while (true) {\n    let l2 = _l2;\n    let l1 = _l1;\n    if (l1 === 0) {\n      return l2 === 0;\n    }\n    if (l2 === 0) {\n      return false;\n    }\n    if (!p(l1.hd, l2.hd)) {\n      return false;\n    }\n    _l2 = l2.tl;\n    _l1 = l1.tl;\n    continue;\n  };\n}\n\nfunction some2(_l1, _l2, p) {\n  while (true) {\n    let l2 = _l2;\n    let l1 = _l1;\n    if (l1 === 0) {\n      return false;\n    }\n    if (l2 === 0) {\n      return false;\n    }\n    if (p(l1.hd, l2.hd)) {\n      return true;\n    }\n    _l2 = l2.tl;\n    _l1 = l1.tl;\n    continue;\n  };\n}\n\nfunction has(_xs, x, eq) {\n  while (true) {\n    let xs = _xs;\n    if (xs === 0) {\n      return false;\n    }\n    if (eq(xs.hd, x)) {\n      return true;\n    }\n    _xs = xs.tl;\n    continue;\n  };\n}\n\nfunction getAssoc(_xs, x, eq) {\n  while (true) {\n    let xs = _xs;\n    if (xs === 0) {\n      return;\n    }\n    let match = xs.hd;\n    if (eq(match[0], x)) {\n      return Primitive_option.some(match[1]);\n    }\n    _xs = xs.tl;\n    continue;\n  };\n}\n\nfunction hasAssoc(_xs, x, eq) {\n  while (true) {\n    let xs = _xs;\n    if (xs === 0) {\n      return false;\n    }\n    if (eq(xs.hd[0], x)) {\n      return true;\n    }\n    _xs = xs.tl;\n    continue;\n  };\n}\n\nfunction removeAssoc(xs, x, eq) {\n  if (xs === 0) {\n    return /* [] */0;\n  }\n  let l = xs.tl;\n  let pair = xs.hd;\n  if (eq(pair[0], x)) {\n    return l;\n  }\n  let cell = {\n    hd: pair,\n    tl: /* [] */0\n  };\n  let removed = removeAssocAuxWithMap(l, x, cell, eq);\n  if (removed) {\n    return cell;\n  } else {\n    return xs;\n  }\n}\n\nfunction setAssoc(xs, x, k, eq) {\n  if (xs === 0) {\n    return {\n      hd: [\n        x,\n        k\n      ],\n      tl: /* [] */0\n    };\n  }\n  let l = xs.tl;\n  let pair = xs.hd;\n  if (eq(pair[0], x)) {\n    return {\n      hd: [\n        x,\n        k\n      ],\n      tl: l\n    };\n  }\n  let cell = {\n    hd: pair,\n    tl: /* [] */0\n  };\n  let replaced = setAssocAuxWithMap(l, x, k, cell, eq);\n  if (replaced) {\n    return cell;\n  } else {\n    return {\n      hd: [\n        x,\n        k\n      ],\n      tl: xs\n    };\n  }\n}\n\nfunction sort(xs, cmp) {\n  let arr = toArray(xs);\n  arr.sort(cmp);\n  return fromArray(arr);\n}\n\nfunction find(_xs, p) {\n  while (true) {\n    let xs = _xs;\n    if (xs === 0) {\n      return;\n    }\n    let x = xs.hd;\n    if (p(x)) {\n      return Primitive_option.some(x);\n    }\n    _xs = xs.tl;\n    continue;\n  };\n}\n\nfunction filter(_xs, p) {\n  while (true) {\n    let xs = _xs;\n    if (xs === 0) {\n      return /* [] */0;\n    }\n    let t = xs.tl;\n    let h = xs.hd;\n    if (p(h)) {\n      let cell = {\n        hd: h,\n        tl: /* [] */0\n      };\n      copyAuxWitFilter(p, t, cell);\n      return cell;\n    }\n    _xs = t;\n    continue;\n  };\n}\n\nfunction filterWithIndex(xs, p) {\n  let _xs = xs;\n  let _i = 0;\n  while (true) {\n    let i = _i;\n    let xs$1 = _xs;\n    if (xs$1 === 0) {\n      return /* [] */0;\n    }\n    let t = xs$1.tl;\n    let h = xs$1.hd;\n    if (p(h, i)) {\n      let cell = {\n        hd: h,\n        tl: /* [] */0\n      };\n      copyAuxWithFilterIndex(p, t, cell, i + 1 | 0);\n      return cell;\n    }\n    _i = i + 1 | 0;\n    _xs = t;\n    continue;\n  };\n}\n\nfunction filterMap(_xs, p) {\n  while (true) {\n    let xs = _xs;\n    if (xs === 0) {\n      return /* [] */0;\n    }\n    let t = xs.tl;\n    let h = p(xs.hd);\n    if (h !== undefined) {\n      let cell = {\n        hd: Primitive_option.valFromOption(h),\n        tl: /* [] */0\n      };\n      copyAuxWitFilterMap(p, t, cell);\n      return cell;\n    }\n    _xs = t;\n    continue;\n  };\n}\n\nfunction partition(l, p) {\n  if (l === 0) {\n    return [\n      /* [] */0,\n      /* [] */0\n    ];\n  }\n  let h = l.hd;\n  let nextX = {\n    hd: h,\n    tl: /* [] */0\n  };\n  let nextY = {\n    hd: h,\n    tl: /* [] */0\n  };\n  let b = p(h);\n  partitionAux(p, l.tl, nextX, nextY);\n  if (b) {\n    return [\n      nextX,\n      nextY.tl\n    ];\n  } else {\n    return [\n      nextX.tl,\n      nextY\n    ];\n  }\n}\n\nfunction unzip(xs) {\n  if (xs === 0) {\n    return [\n      /* [] */0,\n      /* [] */0\n    ];\n  }\n  let match = xs.hd;\n  let cellX = {\n    hd: match[0],\n    tl: /* [] */0\n  };\n  let cellY = {\n    hd: match[1],\n    tl: /* [] */0\n  };\n  splitAux(xs.tl, cellX, cellY);\n  return [\n    cellX,\n    cellY\n  ];\n}\n\nfunction zip(l1, l2) {\n  if (l1 === 0) {\n    return /* [] */0;\n  }\n  if (l2 === 0) {\n    return /* [] */0;\n  }\n  let cell = {\n    hd: [\n      l1.hd,\n      l2.hd\n    ],\n    tl: /* [] */0\n  };\n  zipAux(l1.tl, l2.tl, cell);\n  return cell;\n}\n\nlet size = length;\n\nlet headExn = headOrThrow;\n\nlet tailExn = tailOrThrow;\n\nlet getExn = getOrThrow;\n\nlet toShuffled = shuffle;\n\nexport {\n  length,\n  size,\n  head,\n  headExn,\n  headOrThrow,\n  tail,\n  tailExn,\n  tailOrThrow,\n  add,\n  get,\n  getExn,\n  getOrThrow,\n  make,\n  fromInitializer,\n  shuffle,\n  toShuffled,\n  drop,\n  take,\n  splitAt,\n  concat,\n  concatMany,\n  reverseConcat,\n  flat,\n  map,\n  zip,\n  zipBy,\n  mapWithIndex,\n  fromArray,\n  toArray,\n  reverse,\n  mapReverse,\n  forEach,\n  forEachWithIndex,\n  reduce,\n  reduceWithIndex,\n  reduceReverse,\n  mapReverse2,\n  forEach2,\n  reduce2,\n  reduceReverse2,\n  every,\n  some,\n  every2,\n  some2,\n  compareLength,\n  compare,\n  equal,\n  has,\n  find,\n  filter,\n  filterWithIndex,\n  filterMap,\n  partition,\n  unzip,\n  getAssoc,\n  hasAssoc,\n  removeAssoc,\n  setAssoc,\n  sort,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as Stdlib_List from \"@rescript/runtime/lib/es6/Stdlib_List.js\";\n\nfunction empty() {\n  return {\n    attempted: 0,\n    succeeded: 0,\n    failed: 0,\n    rowsExtracted: 0,\n    durationMs: 0.0,\n    failedUrls: /* [] */0\n  };\n}\n\nfunction recordSuccess(stats, rowCount) {\n  return {\n    attempted: stats.attempted + 1 | 0,\n    succeeded: stats.succeeded + 1 | 0,\n    failed: stats.failed,\n    rowsExtracted: stats.rowsExtracted + rowCount | 0,\n    durationMs: stats.durationMs,\n    failedUrls: stats.failedUrls\n  };\n}\n\nfunction recordFailure(stats, url, reason) {\n  return {\n    attempted: stats.attempted + 1 | 0,\n    succeeded: stats.succeeded,\n    failed: stats.failed + 1 | 0,\n    rowsExtracted: stats.rowsExtracted,\n    durationMs: stats.durationMs,\n    failedUrls: {\n      hd: {\n        url: url,\n        reason: reason\n      },\n      tl: stats.failedUrls\n    }\n  };\n}\n\nfunction setDuration(stats, durationMs) {\n  return {\n    attempted: stats.attempted,\n    succeeded: stats.succeeded,\n    failed: stats.failed,\n    rowsExtracted: stats.rowsExtracted,\n    durationMs: durationMs,\n    failedUrls: stats.failedUrls\n  };\n}\n\nfunction printReport(stats, err) {\n  err(\"---\");\n  err(\"res-scrapy report\");\n  err(`  URLs attempted:  ` + stats.attempted.toString());\n  err(`  URLs succeeded:  ` + stats.succeeded.toString());\n  err(`  URLs failed:     ` + stats.failed.toString());\n  err(`  Rows extracted:  ` + stats.rowsExtracted.toString());\n  let durationSec = stats.durationMs / 1000.0;\n  err(`  Duration:        ` + durationSec.toString() + `s`);\n  if (stats.failed > 0) {\n    err(\"\");\n    err(\"  Failed URLs:\");\n    Stdlib_List.forEach(Stdlib_List.reverse(stats.failedUrls), failed => err(`    ` + failed.url + `  → ` + failed.reason));\n  }\n  err(\"\");\n}\n\nexport {\n  empty,\n  recordSuccess,\n  recordFailure,\n  setDuration,\n  printReport,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as Reporter from \"./Reporter.res.mjs\";\n\nfunction create() {\n  return {\n    stats: Reporter.empty()\n  };\n}\n\nfunction current(mgr) {\n  return mgr.stats;\n}\n\nfunction recordSuccess(mgr, rowCount) {\n  mgr.stats = Reporter.recordSuccess(mgr.stats, rowCount);\n}\n\nfunction recordFailure(mgr, url, reason) {\n  mgr.stats = Reporter.recordFailure(mgr.stats, url, reason);\n}\n\nfunction setDuration(mgr, durationMs) {\n  mgr.stats = Reporter.setDuration(mgr.stats, durationMs);\n}\n\nfunction printReport(mgr, err) {\n  Reporter.printReport(mgr.stats, err);\n}\n\nfunction shouldExitWithError(mgr) {\n  if (mgr.stats.succeeded === 0) {\n    return mgr.stats.failed > 0;\n  } else {\n    return false;\n  }\n}\n\nfunction attempted(mgr) {\n  return mgr.stats.attempted;\n}\n\nfunction succeeded(mgr) {\n  return mgr.stats.succeeded;\n}\n\nfunction failed(mgr) {\n  return mgr.stats.failed;\n}\n\nfunction rowsExtracted(mgr) {\n  return mgr.stats.rowsExtracted;\n}\n\nexport {\n  create,\n  current,\n  recordSuccess,\n  recordFailure,\n  setDuration,\n  printReport,\n  shouldExitWithError,\n  attempted,\n  succeeded,\n  failed,\n  rowsExtracted,\n}\n/* No side effect */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as Document from \"../core/Document.res.mjs\";\nimport * as AppContext from \"../core/AppContext.res.mjs\";\nimport * as OutputWriter from \"../core/OutputWriter.res.mjs\";\nimport * as Stdlib_Option from \"@rescript/runtime/lib/es6/Stdlib_Option.js\";\n\nfunction extractElements(ctx, document, selector, extractMode, mode) {\n  let extract = el => {\n    if (typeof extractMode === \"object\") {\n      return Stdlib_Option.getOr(Document.getAttribute(ctx.deps.doc.documentOps, el, extractMode._0), \"\");\n    }\n    switch (extractMode) {\n      case \"OuterHtml\" :\n        return Document.outerHTML(ctx.deps.doc.documentOps, el);\n      case \"InnerHtml\" :\n        return Document.innerHTML(ctx.deps.doc.documentOps, el);\n      case \"Text\" :\n        return Document.textContent(ctx.deps.doc.documentOps, el);\n    }\n  };\n  if (mode !== \"Single\") {\n    return {\n      TAG: \"Ok\",\n      _0: Document.querySelectorAll(ctx.deps.doc.documentOps, document, selector).values().map(extract).toArray()\n    };\n  }\n  let el = Document.querySelector(ctx.deps.doc.documentOps, document, selector);\n  if (el !== undefined) {\n    return {\n      TAG: \"Ok\",\n      _0: [extract(el)]\n    };\n  } else {\n    return {\n      TAG: \"Ok\",\n      _0: []\n    };\n  }\n}\n\nfunction runSelectorMode(ctx, document, selector, extractMode, mode, options) {\n  let msg = extractElements(ctx, document, selector, extractMode, mode);\n  if (msg.TAG === \"Ok\") {\n    return OutputWriter.writeOutput(ctx, options, ctx.deps.serialize.stringifyStrings(msg._0));\n  } else {\n    return AppContext.exitWithError(ctx, {\n      TAG: \"ExtractionError\",\n      _0: msg._0\n    });\n  }\n}\n\nlet Iter;\n\nexport {\n  Iter,\n  extractElements,\n  runSelectorMode,\n}\n/* Document Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as ResultX from \"../core/ResultX.res.mjs\";\nimport * as AppError from \"../core/AppError.res.mjs\";\nimport * as Document from \"../core/Document.res.mjs\";\nimport * as Belt_Array from \"@rescript/runtime/lib/es6/Belt_Array.js\";\nimport * as SchemaRunner from \"../schema/SchemaRunner.res.mjs\";\nimport * as Stdlib_Option from \"@rescript/runtime/lib/es6/Stdlib_Option.js\";\nimport * as Stdlib_Result from \"@rescript/runtime/lib/es6/Stdlib_Result.js\";\nimport * as ExtractionMode from \"../extraction/ExtractionMode.res.mjs\";\nimport * as UrlOutputWriter from \"./UrlOutputWriter.res.mjs\";\nimport * as FetchStatsManager from \"./FetchStatsManager.res.mjs\";\nimport * as SelectorExtractor from \"../extraction/SelectorExtractor.res.mjs\";\n\nfunction countRows(json) {\n  if (Array.isArray(json)) {\n    return json.length;\n  } else {\n    return 1;\n  }\n}\n\nfunction formatSchemaFailureReason(err) {\n  return AppError.toMessage(AppError.mapSchemaError(err));\n}\n\nfunction extractFromDocument(setup, document, ctx) {\n  switch (setup.TAG) {\n    case \"TableSetup\" :\n      return Stdlib_Result.map(ctx.deps.doc.extractTable(document, setup._0), rows => rows.map(row => Object.fromEntries(Object.entries(row).map(param => [\n        param[0],\n        param[1]\n      ]))));\n    case \"SchemaSetup\" :\n      return Stdlib_Result.mapError(ctx.deps.schema.applySchema(document, setup._0), formatSchemaFailureReason);\n    case \"SelectorSetup\" :\n      let msg = SelectorExtractor.extractElements(ctx, document, setup.selector, setup.extract, setup.mode);\n      if (msg.TAG === \"Ok\") {\n        return {\n          TAG: \"Ok\",\n          _0: msg._0.map(prim => prim)\n        };\n      } else {\n        return {\n          TAG: \"Error\",\n          _0: msg._0\n        };\n      }\n  }\n}\n\nasync function routeOutput(options, json, ctx, state) {\n  let match = options.output;\n  let match$1 = options.outputFormat;\n  if (match === undefined) {\n    return UrlOutputWriter.writeStdoutNdjson(ctx.io.out, ctx.deps.serialize.stringifyJson, json);\n  }\n  if (match$1 === \"Json\") {\n    if (!state.jsonFileStarted) {\n      state.jsonFileStarted = true;\n      let match$2 = UrlOutputWriter.beginJsonArraySync(ctx.deps.fs.writeFileSync, ctx.io.err, match);\n      if (match$2.TAG !== \"Ok\") {\n        state.writeFailures = state.writeFailures + 1 | 0;\n      }\n    }\n    let isFirstRow = state.jsonRowsWritten === 0;\n    state.jsonRowsWritten = state.jsonRowsWritten + countRows(json) | 0;\n    let result = await UrlOutputWriter.appendJsonRowAsync(ctx.deps.fs.appendFile, ctx.io.err, ctx.deps.serialize.stringifyJson, match, isFirstRow, json);\n    if (result.TAG === \"Ok\") {\n      return;\n    } else {\n      state.writeFailures = state.writeFailures + 1 | 0;\n      return;\n    }\n  }\n  let result$1 = await UrlOutputWriter.appendNdjsonToFile(ctx.deps.fs.appendFile, ctx.io.err, ctx.deps.serialize.stringifyJson, match, json);\n  if (result$1.TAG === \"Ok\") {\n    return;\n  } else {\n    state.writeFailures = state.writeFailures + 1 | 0;\n    return;\n  }\n}\n\nlet formatParseFailureReason = AppError.toMessage;\n\nfunction formatExtractionFailureReason(err) {\n  return err;\n}\n\nfunction resolveExtractionSetup(ctx, options) {\n  let selector = ExtractionMode.fromOptions(options);\n  switch (selector.TAG) {\n    case \"TableMode\" :\n      return {\n        TAG: \"Ok\",\n        _0: {\n          TAG: \"TableSetup\",\n          _0: selector._0\n        }\n      };\n    case \"SchemaMode\" :\n      return Stdlib_Result.mapError(Stdlib_Result.map(SchemaRunner.loadSchema(ctx, selector._0), schema => ({\n        TAG: \"SchemaSetup\",\n        _0: schema\n      })), formatSchemaFailureReason);\n    case \"SelectorMode\" :\n      return {\n        TAG: \"Ok\",\n        _0: {\n          TAG: \"SelectorSetup\",\n          selector: selector.selector,\n          extract: selector.extract,\n          mode: selector.mode\n        }\n      };\n  }\n}\n\nasync function processOne(setup, item, ctx, options, mgr, state) {\n  let result = item.result;\n  let url = item.url;\n  if (result.TAG === \"Ok\") {\n    let parseErr = Document.parseDocumentSafely(ctx.deps.doc.documentOps, result._0);\n    if (parseErr.TAG !== \"Ok\") {\n      return FetchStatsManager.recordFailure(mgr, url, AppError.toMessage(parseErr._0));\n    }\n    let extractErr = extractFromDocument(setup, parseErr._0, ctx);\n    if (extractErr.TAG !== \"Ok\") {\n      return FetchStatsManager.recordFailure(mgr, url, extractErr._0);\n    }\n    let json = extractErr._0;\n    FetchStatsManager.recordSuccess(mgr, countRows(json));\n    return await routeOutput(options, json, ctx, state);\n  }\n  let fetchErr = result._0;\n  let reason;\n  reason = fetchErr.TAG === \"HttpError\" ? `HTTP ` + fetchErr._0.toString() + `: ` + fetchErr._1 : fetchErr._0;\n  return FetchStatsManager.recordFailure(mgr, url, reason);\n}\n\nasync function runUrlMode(ctx, urlTemplate, options) {\n  let err = ResultX.mapError(ctx.deps.doc.parseTemplate(urlTemplate), AppError.mapTemplateError);\n  let urls;\n  if (err.TAG === \"Ok\") {\n    urls = err._0;\n  } else {\n    ctx.io.err(AppError.toMessage(err._0));\n    ctx.io.exit(1);\n    urls = [];\n  }\n  if (urls.length === 0) {\n    ctx.io.err(AppError.toMessage({\n      TAG: \"CliError\",\n      _0: \"URL template produced no URLs\"\n    }));\n    return ctx.io.exit(1);\n  }\n  let err$1 = resolveExtractionSetup(ctx, options);\n  if (err$1.TAG === \"Ok\") {\n    let startTime = ctx.deps.perf.performanceNow();\n    let userAgent = Stdlib_Option.getOr(options.userAgent, `res-scrapy/` + ctx.deps.cli.getCliVersion());\n    let fetchOptions_concurrency = options.concurrency;\n    let fetchOptions_timeoutSeconds = options.timeoutSeconds;\n    let fetchOptions_retryCount = options.retryCount;\n    let fetchOptions_delayMs = options.delayMs;\n    let fetchOptions_headers = options.requestHeaders.map(h => [\n      h.name,\n      h.value\n    ]);\n    let fetchOptions = {\n      concurrency: fetchOptions_concurrency,\n      userAgent: userAgent,\n      timeoutSeconds: fetchOptions_timeoutSeconds,\n      retryCount: fetchOptions_retryCount,\n      delayMs: fetchOptions_delayMs,\n      headers: fetchOptions_headers\n    };\n    let fetchResults = await ctx.deps.fetch.fetchAll(urls, fetchOptions);\n    let mgr = FetchStatsManager.create();\n    let state = {\n      jsonFileStarted: false,\n      jsonRowsWritten: 0,\n      writeFailures: 0\n    };\n    let processAll = async (setup, idx) => {\n      if (idx >= fetchResults.length) {\n        return;\n      }\n      let item = Belt_Array.get(fetchResults, idx);\n      if (item !== undefined) {\n        await processOne(setup, item, ctx, options, mgr, state);\n        return await processAll(setup, idx + 1 | 0);\n      }\n    };\n    await processAll(err$1._0, 0);\n    let endTime = ctx.deps.perf.performanceNow();\n    let duration = endTime - startTime;\n    FetchStatsManager.setDuration(mgr, duration);\n    let match = options.output;\n    let match$1 = options.outputFormat;\n    if (match !== undefined && match$1 === \"Json\") {\n      if (!state.jsonFileStarted) {\n        state.jsonFileStarted = true;\n        let match$2 = UrlOutputWriter.beginJsonArraySync(ctx.deps.fs.writeFileSync, ctx.io.err, match);\n        if (match$2.TAG !== \"Ok\") {\n          state.writeFailures = state.writeFailures + 1 | 0;\n        }\n      }\n      let match$3 = UrlOutputWriter.endJsonArraySync(ctx.deps.fs.appendFileSync, ctx.io.err, match);\n      if (match$3.TAG !== \"Ok\") {\n        state.writeFailures = state.writeFailures + 1 | 0;\n      }\n    }\n    FetchStatsManager.printReport(mgr, ctx.io.err);\n    if (FetchStatsManager.shouldExitWithError(mgr) || state.writeFailures > 0) {\n      if (state.writeFailures > 0) {\n        ctx.io.err(`Warning: ` + state.writeFailures.toString() + ` output write(s) failed`);\n      }\n      return ctx.io.exit(1);\n    } else {\n      return;\n    }\n  }\n  ctx.io.err(err$1._0);\n  return ctx.io.exit(1);\n}\n\nlet Iter;\n\nexport {\n  Iter,\n  countRows,\n  formatSchemaFailureReason,\n  extractFromDocument,\n  routeOutput,\n  formatParseFailureReason,\n  formatExtractionFailureReason,\n  resolveExtractionSetup,\n  processOne,\n  runUrlMode,\n}\n/* Document Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as AppContext from \"../core/AppContext.res.mjs\";\nimport * as OutputWriter from \"../core/OutputWriter.res.mjs\";\n\nfunction runTableMode(ctx, document, selector, options) {\n  let msg = ctx.deps.doc.extractTable(document, selector);\n  if (msg.TAG === \"Ok\") {\n    return OutputWriter.writeOutput(ctx, options, ctx.deps.serialize.stringifyTableRows(msg._0));\n  } else {\n    return AppContext.exitWithError(ctx, {\n      TAG: \"ExtractionError\",\n      _0: msg._0\n    });\n  }\n}\n\nexport {\n  runTableMode,\n}\n/* AppContext Not a pure module */\n","// Generated by ReScript, PLEASE EDIT WITH CARE\n\nimport * as ResultX from \"./core/ResultX.res.mjs\";\nimport * as AppError from \"./core/AppError.res.mjs\";\nimport * as Document from \"./core/Document.res.mjs\";\nimport * as ExnUtils from \"./core/ExnUtils.res.mjs\";\nimport * as UrlRunner from \"./url/UrlRunner.res.mjs\";\nimport * as AppContext from \"./core/AppContext.res.mjs\";\nimport * as NodeProcess from \"./bindings/NodeProcess.res.mjs\";\nimport * as TableRunner from \"./table/TableRunner.res.mjs\";\nimport * as SchemaRunner from \"./schema/SchemaRunner.res.mjs\";\nimport * as ExtractionMode from \"./extraction/ExtractionMode.res.mjs\";\nimport * as ImportMetaBinding from \"./bindings/ImportMetaBinding.res.mjs\";\nimport * as SelectorExtractor from \"./extraction/SelectorExtractor.res.mjs\";\nimport * as Primitive_exceptions from \"@rescript/runtime/lib/es6/Primitive_exceptions.js\";\n\nfunction parseCliSafely(ctx) {\n  try {\n    return ResultX.mapError(ctx.deps.cli.validateArgs(ctx.deps.cli.parseCli()), AppError.mapParseError);\n  } catch (raw_exn) {\n    let exn = Primitive_exceptions.internalToException(raw_exn);\n    return {\n      TAG: \"Error\",\n      _0: {\n        TAG: \"CliError\",\n        _0: `Invalid CLI arguments: ` + ExnUtils.message(exn)\n      }\n    };\n  }\n}\n\nfunction emitWarnings(ctx, options) {\n  options.warnings.forEach(ctx.io.warn);\n}\n\nasync function mainWithContext(ctx) {\n  try {\n    let parsed = parseCliSafely(ctx);\n    if (parsed.TAG !== \"Ok\") {\n      return AppContext.exitWithError(ctx, parsed._0);\n    }\n    let options = parsed._0;\n    emitWarnings(ctx, options);\n    let urlTemplate = options.url;\n    if (urlTemplate !== undefined) {\n      return await UrlRunner.runUrlMode(ctx, urlTemplate, options);\n    }\n    let stdinResult = await ctx.deps.cli.readStdin();\n    let err = ResultX.mapError(stdinResult, AppError.mapStdInError);\n    if (err.TAG !== \"Ok\") {\n      return AppContext.exitWithError(ctx, err._0);\n    }\n    let err$1 = Document.parseDocumentSafely(ctx.deps.doc.documentOps, err._0);\n    if (err$1.TAG !== \"Ok\") {\n      return AppContext.exitWithError(ctx, err$1._0);\n    }\n    let document = err$1._0;\n    let selector = ExtractionMode.fromOptions(options);\n    switch (selector.TAG) {\n      case \"TableMode\" :\n        return TableRunner.runTableMode(ctx, document, selector._0, options);\n      case \"SchemaMode\" :\n        return SchemaRunner.runSchemaMode(ctx, document, selector._0, options);\n      case \"SelectorMode\" :\n        return SelectorExtractor.runSelectorMode(ctx, document, selector.selector, selector.extract, selector.mode, options);\n    }\n  } catch (raw_exn) {\n    let exn = Primitive_exceptions.internalToException(raw_exn);\n    return AppContext.exitWithError(ctx, {\n      TAG: \"ExtractionError\",\n      _0: `Unexpected error: ` + ExnUtils.message(exn)\n    });\n  }\n}\n\nfunction main() {\n  return mainWithContext(AppContext.production);\n}\n\nif (ImportMetaBinding.isExecutedAsScript()) {\n  NodeProcess.registerGlobalRuntimeHandlers(prim => {\n    console.error(prim);\n  }, NodeProcess.setExitCode);\n  await mainWithContext(AppContext.production);\n}\n\nexport {\n  mainWithContext,\n  main,\n}\n/*  Not a pure module */\n"],"x_google_ignoreList":[1,2,3,6,7,9,11,26,27,56,59,69],"mappings":"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CMC,EAAoB,EAAM,UAAU,SAAS;AACtD;AAEA,SAAS,KAAW;CAClB,QAAQ,IAAI;;;;;;;;;;;;;;;;;;;;GAoBX,GACD,QAAQ,KAAK,CAAC;AAChB;AAEA,SAASC,KAAQ;CACf,IAAI,IAAU,OAAO,YAAY;EAC/B,CACE,WACA;GACE,MAAM;GACN,OAAO;GACP,SAAS,CAAA;EACX,CACF;EACA,CACE,QACA;GACE,MAAM;GACN,OAAO;GACP,SAAS,CAAA;EACX,CACF;EACA,CACE,YACA;GACE,MAAM;GACN,OAAO;EACT,CACF;EACA,CACE,WACA;GACE,MAAM;GACN,OAAO;GACP,SAAS;EACX,CACF;EACA,CACE,UACA;GACE,MAAM;GACN,OAAO;EACT,CACF;EACA,CACE,cACA;GACE,MAAM;GACN,OAAO;EACT,CACF;EACA,CACE,SACA;GACE,MAAM;GACN,OAAO;GACP,SAAS,CAAA;EACX,CACF;EACA,CACE,UACA;GACE,MAAM;GACN,OAAO;EACT,CACF;EACA,CACE,UACA;GACE,MAAM;GACN,OAAO;GACP,SAAS;EACX,CACF;EACA,CACE,OACA;GACE,MAAM;GACN,OAAO;EACT,CACF;EACA,CACE,eACA;GACE,MAAM;GACN,OAAO;GACP,SAAS;EACX,CACF;EACA,CACE,aACA,EACE,MAAM,SACR,CACF;EACA,CACE,WACA;GACE,MAAM;GACN,SAAS;EACX,CACF;EACA,CACE,SACA;GACE,MAAM;GACN,SAAS;EACX,CACF;EACA,CACE,SACA;GACE,MAAM;GACN,SAAS;EACX,CACF;EACA,CACE,UACA;GACE,MAAM;GACN,UAAU,CAAA;EACZ,CACF;EACA,CACE,UACA;GACE,MAAM;GACN,UAAU,CAAA;EACZ,CACF;EACA,CACE,QACA;GACE,MAAM;GACN,OAAO;EACT,CACF;CACF,CAAC,GAQG,IAPO,GAAS,UAAU;EAC5B,MAAM,QAAQ,KAAK,MAAM,CAAC;EACjB,SAAA;EACT,QAAQ,CAAA;EACR,kBAAkB,CAAA;EAClB,QAAQ,CAAA;CACV,CACgB,CAAA,CAAE,QACd,IAAQ,EAAO;CACf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"}