{"version":3,"file":"file-utils-Ct8PiWkV.mjs","names":["asString","generateCsv","mkConfig"],"sources":["../../../node_modules/.pnpm/csv-parser@3.2.1/node_modules/csv-parser/index.js","../../../node_modules/.pnpm/export-to-csv@1.4.0/node_modules/export-to-csv/output/index.js","../src/cli/file-utils.ts"],"sourcesContent":["const { Transform } = require('stream')\n\nconst [cr] = Buffer.from('\\r')\nconst [nl] = Buffer.from('\\n')\nconst defaults = {\n  escape: '\"',\n  headers: null,\n  mapHeaders: ({ header }) => header,\n  mapValues: ({ value }) => value,\n  newline: '\\n',\n  quote: '\"',\n  raw: false,\n  separator: ',',\n  skipComments: false,\n  skipLines: null,\n  maxRowBytes: Number.MAX_SAFE_INTEGER,\n  strict: false,\n  outputByteOffset: false\n}\n\nconst DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype'])\n\nfunction sanitizeHeader(header) {\n  if (typeof header !== 'string') {\n    return null\n  }\n\n  if (DANGEROUS_KEYS.has(header)) {\n    return null\n  }\n\n  return header\n}\n\nclass CsvParser extends Transform {\n  constructor (opts = {}) {\n    super({ objectMode: true, highWaterMark: 16 })\n\n    if (Array.isArray(opts)) opts = { headers: opts }\n\n    const options = Object.assign({}, defaults, opts)\n\n    options.customNewline = options.newline !== defaults.newline\n\n    for (const key of ['newline', 'quote', 'separator']) {\n      if (typeof options[key] !== 'undefined') {\n        ([options[key]] = Buffer.from(options[key]))\n      }\n    }\n\n    // if escape is not defined on the passed options, use the end value of quote\n    options.escape = (opts || {}).escape ? Buffer.from(options.escape)[0] : options.quote\n\n    this.state = {\n      empty: options.raw ? Buffer.alloc(0) : '',\n      escaped: false,\n      first: true,\n      lineNumber: 0,\n      previousEnd: 0,\n      rowLength: 0,\n      quoted: false\n    }\n\n    this._prev = null\n\n    if (options.headers === false) {\n      // enforce, as the column length check will fail if headers:false\n      options.strict = false\n    }\n\n    if (options.headers || options.headers === false) {\n      this.state.first = false\n    }\n\n    this.options = options\n    this.headers = options.headers\n    this.bytesRead = 0\n  }\n\n  parseCell (buffer, start, end) {\n    const { escape, quote } = this.options\n    // remove quotes from quoted cells\n    if (buffer[start] === quote && buffer[end - 1] === quote) {\n      start++\n      end--\n    }\n\n    let y = start\n\n    for (let i = start; i < end; i++) {\n      // check for escape characters and skip them\n      if (buffer[i] === escape && i + 1 < end && buffer[i + 1] === quote) {\n        i++\n      }\n\n      if (y !== i) {\n        buffer[y] = buffer[i]\n      }\n      y++\n    }\n\n    return this.parseValue(buffer, start, y)\n  }\n\n  parseLine (buffer, start, end) {\n    const { customNewline, escape, mapHeaders, mapValues, quote, separator, skipComments, skipLines } = this.options\n\n    end-- // trim newline\n    if (!customNewline && buffer.length && buffer[end - 1] === cr) {\n      end--\n    }\n\n    const comma = separator\n    const cells = []\n    let isQuoted = false\n    let offset = start\n\n    if (skipComments) {\n      const char = typeof skipComments === 'string' ? skipComments : '#'\n      if (buffer[start] === Buffer.from(char)[0]) {\n        return\n      }\n    }\n\n    const mapValue = (value) => {\n      if (this.state.first) {\n        return value\n      }\n\n      const index = cells.length\n      const header = this.headers[index]\n\n      return mapValues({ header, index, value })\n    }\n\n    for (let i = start; i < end; i++) {\n      const isStartingQuote = !isQuoted && buffer[i] === quote\n      const isEndingQuote = isQuoted && buffer[i] === quote && i + 1 <= end && buffer[i + 1] === comma\n      const isEscape = isQuoted && buffer[i] === escape && i + 1 < end && buffer[i + 1] === quote\n\n      if (isStartingQuote || isEndingQuote) {\n        isQuoted = !isQuoted\n        continue\n      } else if (isEscape) {\n        i++\n        continue\n      }\n\n      if (buffer[i] === comma && !isQuoted) {\n        let value = this.parseCell(buffer, offset, i)\n        value = mapValue(value)\n        cells.push(value)\n        offset = i + 1\n      }\n    }\n\n    if (offset < end) {\n      let value = this.parseCell(buffer, offset, end)\n      value = mapValue(value)\n      cells.push(value)\n    }\n\n    if (buffer[end - 1] === comma) {\n      cells.push(mapValue(this.state.empty))\n    }\n\n    const skip = skipLines && skipLines > this.state.lineNumber\n    this.state.lineNumber++\n\n    if (this.state.first && !skip) {\n      this.state.first = false\n      this.headers = cells.map((header, index) => {\n        const mapped = mapHeaders({ header, index })\n\n        if (mapped === null) {\n          return null\n        }\n\n        return sanitizeHeader(mapped)\n      })\n\n      this.emit('headers', this.headers)\n      return\n    }\n\n    if (!skip && this.options.strict && cells.length !== this.headers.length) {\n      const e = new RangeError('Row length does not match headers')\n      this.emit('error', e)\n    } else {\n      if (!skip) {\n        const byteOffset = this.bytesRead - buffer.length + start\n        this.writeRow(cells, byteOffset)\n      }\n    }\n  }\n\n  parseValue (buffer, start, end) {\n    if (this.options.raw) {\n      return buffer.slice(start, end)\n    }\n\n    return buffer.toString('utf-8', start, end)\n  }\n\n  writeRow (cells, byteOffset) {\n    const headers = (this.headers === false) ? cells.map((value, index) => index) : this.headers\n\n    const row = cells.reduce((o, cell, index) => {\n      const header = headers[index]\n      if (header === null) return o // skip columns\n      if (header !== undefined) {\n        o[header] = cell\n      } else {\n        o[`_${index}`] = cell\n      }\n      return o\n    }, {})\n\n    if (this.options.outputByteOffset) {\n      this.push({ row, byteOffset })\n    } else {\n      this.push(row)\n    }\n  }\n\n  _flush (cb) {\n    if (this.state.escaped || !this._prev) return cb()\n    this.parseLine(this._prev, this.state.previousEnd, this._prev.length + 1) // plus since online -1s\n    cb()\n  }\n\n  _transform (data, enc, cb) {\n    if (typeof data === 'string') {\n      data = Buffer.from(data)\n    }\n\n    const { escape, quote } = this.options\n    let start = 0\n    let buffer = data\n    this.bytesRead += data.byteLength\n\n    if (this._prev) {\n      start = this._prev.length\n      buffer = Buffer.concat([this._prev, data])\n      this._prev = null\n    }\n\n    const bufferLength = buffer.length\n\n    for (let i = start; i < bufferLength; i++) {\n      const chr = buffer[i]\n      const nextChr = i + 1 < bufferLength ? buffer[i + 1] : null\n\n      this.state.rowLength++\n      if (this.state.rowLength > this.options.maxRowBytes) {\n        return cb(new Error('Row exceeds the maximum size'))\n      }\n\n      if (!this.state.escaped && chr === escape && nextChr === quote && i !== start) {\n        this.state.escaped = true\n        continue\n      } else if (chr === quote) {\n        if (this.state.escaped) {\n          this.state.escaped = false\n          // non-escaped quote (quoting the cell)\n        } else {\n          this.state.quoted = !this.state.quoted\n        }\n        continue\n      }\n\n      if (!this.state.quoted) {\n        if (this.state.first && !this.options.customNewline) {\n          if (chr === nl) {\n            this.options.newline = nl\n          } else if (chr === cr) {\n            if (nextChr !== nl) {\n              this.options.newline = cr\n            }\n          }\n        }\n\n        if (chr === this.options.newline) {\n          this.parseLine(buffer, this.state.previousEnd, i + 1)\n          this.state.previousEnd = i + 1\n          this.state.rowLength = 0\n        }\n      }\n    }\n\n    if (this.state.previousEnd === bufferLength) {\n      this.state.previousEnd = 0\n      return cb()\n    }\n\n    if (bufferLength - this.state.previousEnd < data.length) {\n      this._prev = data\n      this.state.previousEnd -= (bufferLength - data.length)\n      return cb()\n    }\n\n    this._prev = buffer\n    cb()\n  }\n}\n\nmodule.exports = (opts) => new CsvParser(opts)\n","var q;(function(x){x[\"csv\"]=\"text/csv\";x[\"tsv\"]=\"text/tab-separated-values\";x[\"plain\"]=\"text/plain\"})(q||(q={}));var X=(W)=>W,z=(W)=>W,Z=X,_=X,Y=X,N=X,V=X;var h={fieldSeparator:\",\",decimalSeparator:\".\",quoteStrings:!0,quoteCharacter:'\"',showTitle:!1,title:\"My Generated Report\",filename:\"generated\",showColumnHeaders:!0,useTextFile:!1,fileExtension:\"csv\",mediaType:q.csv,useBom:!0,columnHeaders:[],useKeysAsHeaders:!1,boolDisplay:{true:\"TRUE\",false:\"FALSE\"},replaceUndefinedWith:\"\"},F=\"\\r\\n\",R=\"\\uFEFF\",G=(W)=>Object.assign({},h,W);class K extends Error{constructor(W){super(W);this.name=\"CsvGenerationError\"}}class B extends Error{constructor(W){super(W);this.name=\"EmptyHeadersError\"}}class L extends Error{constructor(W){super(W);this.name=\"CsvDownloadEnvironmentError\"}}class P extends Error{constructor(W){super(W);this.name=\"UnsupportedDataFormatError\"}}var s=function(W,$){if($=='\"'&&W.indexOf('\"')>-1)return W.replace(/\"/g,'\"\"');return W},w=(W)=>typeof W===\"object\"?N(W.key):N(W),y=(W)=>typeof W===\"object\"?V(W.displayLabel):V(W),T=(W,...$)=>$.reduce((j,x)=>x(j),W),E=(W)=>($)=>W.useBom?_(z($)+R):$,M=(W)=>($)=>W.showTitle?S(_(z($)+W.title))(Y(\"\")):$,S=(W)=>($)=>_(z(W)+z($)+F),O=(W)=>($,j)=>l(W)(Y(z($)+z(j))),l=(W)=>($)=>X(z($)+W.fieldSeparator),b=(W,$)=>(j)=>{if(!W.showColumnHeaders)return j;if($.length<1)throw new B(\"Option to show headers but none supplied. Make sure there are keys in your collection or that you've supplied headers through the config options.\");let x=Y(\"\");for(let A=0;A<$.length;A++){const J=y($[A]);x=O(W)(x,v(W,z(J)))}return x=Y(z(x).slice(0,-1)),S(j)(x)},C=(W,$,j)=>(x)=>{let A=x;for(var J=0;J<j.length;J++){let I=Y(\"\");for(let U=0;U<$.length;U++){const H=w($[U]),D=j[J][z(H)];I=O(W)(I,v(W,D))}I=Y(z(I).slice(0,-1)),A=S(A)(I)}return A},k=z,m=(W)=>+W===W&&(!isFinite(W)||Boolean(W%1)),p=(W,$)=>{if(m($)){if(W.decimalSeparator===\"locale\")return Z($.toLocaleString());if(W.decimalSeparator)return Z($.toString().replace(\".\",W.decimalSeparator))}return Z($.toString())},Q=(W,$)=>{let j=$;if(W.quoteStrings||W.fieldSeparator&&$.indexOf(W.fieldSeparator)>-1||W.quoteCharacter&&$.indexOf(W.quoteCharacter)>-1||$.indexOf(\"\\n\")>-1||$.indexOf(\"\\r\")>-1)j=W.quoteCharacter+s($,W.quoteCharacter)+W.quoteCharacter;return Z(j)},g=(W,$)=>{const j=$?\"true\":\"false\";return Z(W.boolDisplay[j])},r=(W,$)=>{if(typeof $===\"undefined\"&&W.replaceUndefinedWith!==void 0)return Q(W,W.replaceUndefinedWith+\"\");if($===null)return Q(W,\"null\");return Q(W,\"\")},v=(W,$)=>{if(typeof $===\"number\")return p(W,$);if(typeof $===\"string\")return Q(W,$);if(typeof $===\"boolean\"&&W.boolDisplay)return g(W,$);if($===null||typeof $===\"undefined\")return r(W,$);throw new P(`\n    typeof ${typeof $} isn't supported. Only number, string, boolean, null and undefined are supported.\n    Please convert the data in your object to one of those before generating the CSV.\n    `)};var BW=(W)=>($)=>{const j=G(W),x=j.useKeysAsHeaders?Object.keys($[0]):j.columnHeaders;let A=T(_(\"\"),E(j),M(j),b(j,x),C(j,x,$));if(z(A).length<1)throw new K(\"Output is empty. Is your data formatted correctly?\");return A},f=(W)=>($)=>{const j=G(W),x=z($),A=j.useTextFile?\"text/plain\":j.mediaType;return new Blob([x],{type:`${A};charset=utf8;`})},LW=(W)=>($)=>{if(!window)throw new L(\"Downloading only supported in a browser environment.\");const j=f(W)($),x=G(W),A=x.useTextFile?\"txt\":x.fileExtension,J=`${x.filename}.${A}`,I=document.createElement(\"a\");I.download=J,I.href=URL.createObjectURL(j),I.setAttribute(\"visibility\",\"hidden\"),document.body.appendChild(I),I.click(),document.body.removeChild(I)};export{G as mkConfig,BW as generateCsv,LW as download,k as asString,f as asBlob,q as MediaType};\n","import { errorMessage } from \"@lmnr-ai/types\";\nimport csv from \"csv-parser\";\nimport { asString, generateCsv, mkConfig } from \"export-to-csv\";\nimport { createReadStream } from \"fs\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\n\nimport { Datapoint } from \"../evaluations\";\nimport { initializeLogger } from \"../utils\";\n\nconst logger = initializeLogger();\n\n/**\n * Check if a file has a supported extension.\n */\nconst isSupportedFile = (file: string): boolean => {\n  const ext = path.extname(file).toLowerCase();\n  return [\".json\", \".csv\", \".jsonl\"].includes(ext);\n};\n\n/**\n * Collect all supported files from the given paths.\n * Handles both files and directories.\n */\nexport const collectFiles = async (\n  paths: string[],\n  recursive: boolean = false,\n): Promise<string[]> => {\n  const collectedFiles: string[] = [];\n\n  for (const filepath of paths) {\n    try {\n      const stats = await fs.stat(filepath);\n\n      if (stats.isFile()) {\n        if (isSupportedFile(filepath)) {\n          collectedFiles.push(filepath);\n        } else {\n          logger.warn(`Skipping unsupported file type: ${filepath}`);\n        }\n      } else if (stats.isDirectory()) {\n        const entries = await fs.readdir(filepath);\n\n        for (const entry of entries) {\n          const fullPath = path.join(filepath, entry);\n          const entryStats = await fs.stat(fullPath);\n\n          if (entryStats.isFile() && isSupportedFile(fullPath)) {\n            collectedFiles.push(fullPath);\n          } else if (recursive && entryStats.isDirectory()) {\n            const subFiles = await collectFiles([fullPath], true);\n            collectedFiles.push(...subFiles);\n          }\n        }\n      }\n    } catch (error) {\n      logger.warn(\n        `Path does not exist or is not accessible: ${filepath}. ` +\n          `Error: ${errorMessage(error)}`,\n      );\n    }\n  }\n\n  return collectedFiles;\n};\n\n/**\n * Read a JSON file and return its contents.\n */\nconst readJsonFile = async (filepath: string): Promise<any[]> => {\n  const content = await fs.readFile(filepath, \"utf-8\");\n  const parsed = JSON.parse(content);\n  return Array.isArray(parsed) ? parsed : [parsed];\n};\n\n/**\n * Try to parse a string as JSON. If it fails, return the original string.\n */\nconst tryParseJson = (content: string): any => {\n  // Don't try to parse if it's not a string or doesn't look like JSON\n  if (typeof content !== \"string\") {\n    return content;\n  }\n\n  // If it doesn't start with { or [, it's probably not JSON\n  const trimmed = content.trim();\n  if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\")) {\n    return content;\n  }\n\n  try {\n    return JSON.parse(content);\n  } catch (error) {\n    logger.debug(`Error parsing JSON: ${errorMessage(error)}`);\n    return content;\n  }\n};\n\n/**\n * Parse each field in a CSV row, attempting to convert JSON strings back to objects.\n */\nconst parseCsvRow = (row: Record<string, string>): any => {\n  const parsed: any = {};\n  for (const [key, value] of Object.entries(row)) {\n    parsed[key] = tryParseJson(value);\n  }\n  return parsed;\n};\n\n/**\n * Read a CSV file and return its contents as an array of objects.\n */\nconst readCsvFile = async (filepath: string): Promise<any[]> =>\n  new Promise((resolve, reject) => {\n    const results: any[] = [];\n    createReadStream(filepath)\n      .pipe(csv())\n      .on(\"data\", (data) => results.push(parseCsvRow(data)))\n      .on(\"end\", () => resolve(results))\n      .on(\"error\", reject);\n  });\n\n/**\n * Read a JSONL file and return its contents as an array of objects.\n */\nasync function readJsonlFile(filepath: string): Promise<any[]> {\n  const content = await fs.readFile(filepath, \"utf-8\");\n  const lines = content.split(\"\\n\").filter((line) => line.trim());\n  return lines.map((line) => JSON.parse(line));\n}\n\n/**\n * Read a single file and return its contents.\n */\nasync function readFile(filepath: string): Promise<any[]> {\n  const ext = path.extname(filepath).toLowerCase();\n\n  if (ext === \".json\") {\n    return readJsonFile(filepath);\n  } else if (ext === \".csv\") {\n    return readCsvFile(filepath);\n  } else if (ext === \".jsonl\") {\n    return readJsonlFile(filepath);\n  } else {\n    throw new Error(`Unsupported file type: ${ext}`);\n  }\n}\n\n/**\n * Load data from all files in the specified paths.\n */\nexport const loadFromPaths = async <D = any, T = any>(\n  paths: string[],\n  recursive: boolean = false,\n): Promise<Datapoint<D, T>[]> => {\n  const files = await collectFiles(paths, recursive);\n\n  if (files.length === 0) {\n    logger.warn(\"No supported files found in the specified paths\");\n    return [];\n  }\n\n  logger.info(`Found ${files.length} file(s) to read`);\n\n  const result: Datapoint<D, T>[] = [];\n\n  for (const file of files) {\n    try {\n      const data = await readFile(file);\n      result.push(...data);\n      logger.info(`Read ${data.length} record(s) from ${file}`);\n    } catch (error) {\n      logger.error(`Error reading file ${file}: ${errorMessage(error)}`);\n      throw error;\n    }\n  }\n\n  return result;\n};\n\n/**\n * Write data to a JSON file.\n */\nconst writeJsonFile = async <D, T>(\n  filepath: string,\n  data: Datapoint<D, T>[],\n): Promise<void> => {\n  const content = JSON.stringify(data, null, 2);\n  await fs.writeFile(filepath, content, \"utf-8\");\n};\n\n/**\n * Write data to a CSV file.\n */\nconst writeCsvFile = async <D, T>(\n  filepath: string,\n  data: Datapoint<D, T>[],\n): Promise<void> => {\n  if (data.length === 0) {\n    throw new Error(\"No data to write to CSV\");\n  }\n\n  const formattedData = data.map((item) =>\n    Object.fromEntries(\n      Object.entries(item).map(([key, value]) => [key, stringifyForCsv(value)]),\n    ),\n  );\n\n  const csvConfig = mkConfig({ useKeysAsHeaders: true });\n\n  const csvOutput = generateCsv(csvConfig)(formattedData);\n  const csvString = asString(csvOutput);\n\n  await fs.writeFile(filepath, csvString, \"utf-8\");\n};\n\n/**\n * Write data to a JSONL file.\n */\nconst writeJsonlFile = async <D, T>(\n  filepath: string,\n  data: Datapoint<D, T>[],\n): Promise<void> => {\n  const lines = data.map((item) => JSON.stringify(item)).join(\"\\n\");\n  await fs.writeFile(filepath, lines + \"\\n\", \"utf-8\");\n};\n\n/**\n * Write data to a file based on the file extension.\n */\nexport const writeToFile = async <D, T>(\n  filepath: string,\n  data: Datapoint<D, T>[],\n  format?: \"json\" | \"csv\" | \"jsonl\",\n): Promise<void> => {\n  // Create parent directories if they don't exist\n  const dir = path.dirname(filepath);\n  await fs.mkdir(dir, { recursive: true });\n\n  // Determine the format\n  const ext = format ?? path.extname(filepath).slice(1);\n\n  if (format && format !== path.extname(filepath).slice(1)) {\n    logger.warn(\n      `Output format ${format} does not match file extension ${path.extname(filepath).slice(1)}`,\n    );\n  }\n\n  if (ext === \"json\") {\n    await writeJsonFile(filepath, data);\n  } else if (ext === \"csv\") {\n    await writeCsvFile(filepath, data);\n  } else if (ext === \"jsonl\") {\n    await writeJsonlFile(filepath, data);\n  } else {\n    throw new Error(`Unsupported output format: ${ext}`);\n  }\n};\n\n/**\n * Convert a value to a CSV-safe string.\n * - Strings and numbers pass through\n * - null/undefined become empty strings\n * - Objects and arrays are stringified to JSON\n */\nconst stringifyForCsv = (value: any): string => {\n  if (value === null || value === undefined) {\n    return \"\";\n  }\n  if (typeof value === \"string\") {\n    return value;\n  }\n  if (typeof value === \"number\" || typeof value === \"boolean\") {\n    return String(value);\n  }\n  // For objects and arrays, stringify to JSON\n  return JSON.stringify(value);\n};\n\n/**\n * Print data to console in the specified format.\n */\nexport const printToConsole = <D, T>(\n  data: Datapoint<D, T>[],\n  format: \"json\" | \"csv\" | \"jsonl\" = \"json\",\n) => {\n  if (format === \"json\") {\n    console.log(JSON.stringify(data, null, 2));\n  } else if (format === \"csv\") {\n    if (data.length === 0) {\n      logger.error(\"No data to print\");\n      return;\n    }\n\n    const formattedData = data.map((item) =>\n      Object.fromEntries(\n        Object.entries(item).map(([key, value]) => [\n          key,\n          stringifyForCsv(value),\n        ]),\n      ),\n    );\n\n    const csvConfig = mkConfig({ useKeysAsHeaders: true });\n\n    const csvOutput = generateCsv(csvConfig)(formattedData);\n    const csvString = asString(csvOutput);\n    console.log(csvString);\n  } else if (format === \"jsonl\") {\n    data.forEach((item) => console.log(JSON.stringify(item)));\n  } else {\n    throw new Error(\n      `Unsupported output format: ${String(format)}. ` +\n        \"(supported formats: json, csv, jsonl)\",\n    );\n  }\n};\n"],"x_google_ignoreList":[0,1],"mappings":";;;;;;;;CAAA,MAAM,EAAE,cAAA,UAAsB,QAAQ;CAEtC,MAAM,CAAC,MAAM,OAAO,KAAK,IAAI;CAC7B,MAAM,CAAC,MAAM,OAAO,KAAK,IAAI;CAC7B,MAAM,WAAW;EACf,QAAQ;EACR,SAAS;EACT,aAAa,EAAE,aAAa;EAC5B,YAAY,EAAE,YAAY;EAC1B,SAAS;EACT,OAAO;EACP,KAAK;EACL,WAAW;EACX,cAAc;EACd,WAAW;EACX,aAAa,OAAO;EACpB,QAAQ;EACR,kBAAkB;CACpB;CAEA,MAAM,iBAAiB,IAAI,IAAI;EAAC;EAAa;EAAe;CAAW,CAAC;CAExE,SAAS,eAAe,QAAQ;EAC9B,IAAI,OAAO,WAAW,UACpB,OAAO;EAGT,IAAI,eAAe,IAAI,MAAM,GAC3B,OAAO;EAGT,OAAO;CACT;CAEA,IAAM,YAAN,cAAwB,UAAU;EAChC,YAAa,OAAO,CAAC,GAAG;GACtB,MAAM;IAAE,YAAY;IAAM,eAAe;GAAG,CAAC;GAE7C,IAAI,MAAM,QAAQ,IAAI,GAAG,OAAO,EAAE,SAAS,KAAK;GAEhD,MAAM,UAAU,OAAO,OAAO,CAAC,GAAG,UAAU,IAAI;GAEhD,QAAQ,gBAAgB,QAAQ,YAAY,SAAS;GAErD,KAAK,MAAM,OAAO;IAAC;IAAW;IAAS;GAAW,GAChD,IAAI,OAAO,QAAQ,SAAS,aAC1B,CAAE,QAAQ,QAAQ,OAAO,KAAK,QAAQ,IAAI;GAK9C,QAAQ,UAAU,QAAQ,CAAC,EAAA,CAAG,SAAS,OAAO,KAAK,QAAQ,MAAM,CAAC,CAAC,KAAK,QAAQ;GAEhF,KAAK,QAAQ;IACX,OAAO,QAAQ,MAAM,OAAO,MAAM,CAAC,IAAI;IACvC,SAAS;IACT,OAAO;IACP,YAAY;IACZ,aAAa;IACb,WAAW;IACX,QAAQ;GACV;GAEA,KAAK,QAAQ;GAEb,IAAI,QAAQ,YAAY,OAEtB,QAAQ,SAAS;GAGnB,IAAI,QAAQ,WAAW,QAAQ,YAAY,OACzC,KAAK,MAAM,QAAQ;GAGrB,KAAK,UAAU;GACf,KAAK,UAAU,QAAQ;GACvB,KAAK,YAAY;EACnB;EAEA,UAAW,QAAQ,OAAO,KAAK;GAC7B,MAAM,EAAE,QAAQ,UAAU,KAAK;GAE/B,IAAI,OAAO,WAAW,SAAS,OAAO,MAAM,OAAO,OAAO;IACxD;IACA;GACF;GAEA,IAAI,IAAI;GAER,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,KAAK;IAEhC,IAAI,OAAO,OAAO,UAAU,IAAI,IAAI,OAAO,OAAO,IAAI,OAAO,OAC3D;IAGF,IAAI,MAAM,GACR,OAAO,KAAK,OAAO;IAErB;GACF;GAEA,OAAO,KAAK,WAAW,QAAQ,OAAO,CAAC;EACzC;EAEA,UAAW,QAAQ,OAAO,KAAK;GAC7B,MAAM,EAAE,eAAe,QAAQ,YAAY,WAAW,OAAO,WAAW,cAAc,cAAc,KAAK;GAEzG;GACA,IAAI,CAAC,iBAAiB,OAAO,UAAU,OAAO,MAAM,OAAO,IACzD;GAGF,MAAM,QAAQ;GACd,MAAM,QAAQ,CAAC;GACf,IAAI,WAAW;GACf,IAAI,SAAS;GAEb,IAAI,cAAc;IAChB,MAAM,OAAO,OAAO,iBAAiB,WAAW,eAAe;IAC/D,IAAI,OAAO,WAAW,OAAO,KAAK,IAAI,CAAC,CAAC,IACtC;GAEJ;GAEA,MAAM,YAAY,UAAU;IAC1B,IAAI,KAAK,MAAM,OACb,OAAO;IAGT,MAAM,QAAQ,MAAM;IACpB,MAAM,SAAS,KAAK,QAAQ;IAE5B,OAAO,UAAU;KAAE;KAAQ;KAAO;IAAM,CAAC;GAC3C;GAEA,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,KAAK;IAChC,MAAM,kBAAkB,CAAC,YAAY,OAAO,OAAO;IACnD,MAAM,gBAAgB,YAAY,OAAO,OAAO,SAAS,IAAI,KAAK,OAAO,OAAO,IAAI,OAAO;IAC3F,MAAM,WAAW,YAAY,OAAO,OAAO,UAAU,IAAI,IAAI,OAAO,OAAO,IAAI,OAAO;IAEtF,IAAI,mBAAmB,eAAe;KACpC,WAAW,CAAC;KACZ;IACF,OAAO,IAAI,UAAU;KACnB;KACA;IACF;IAEA,IAAI,OAAO,OAAO,SAAS,CAAC,UAAU;KACpC,IAAI,QAAQ,KAAK,UAAU,QAAQ,QAAQ,CAAC;KAC5C,QAAQ,SAAS,KAAK;KACtB,MAAM,KAAK,KAAK;KAChB,SAAS,IAAI;IACf;GACF;GAEA,IAAI,SAAS,KAAK;IAChB,IAAI,QAAQ,KAAK,UAAU,QAAQ,QAAQ,GAAG;IAC9C,QAAQ,SAAS,KAAK;IACtB,MAAM,KAAK,KAAK;GAClB;GAEA,IAAI,OAAO,MAAM,OAAO,OACtB,MAAM,KAAK,SAAS,KAAK,MAAM,KAAK,CAAC;GAGvC,MAAM,OAAO,aAAa,YAAY,KAAK,MAAM;GACjD,KAAK,MAAM;GAEX,IAAI,KAAK,MAAM,SAAS,CAAC,MAAM;IAC7B,KAAK,MAAM,QAAQ;IACnB,KAAK,UAAU,MAAM,KAAK,QAAQ,UAAU;KAC1C,MAAM,SAAS,WAAW;MAAE;MAAQ;KAAM,CAAC;KAE3C,IAAI,WAAW,MACb,OAAO;KAGT,OAAO,eAAe,MAAM;IAC9B,CAAC;IAED,KAAK,KAAK,WAAW,KAAK,OAAO;IACjC;GACF;GAEA,IAAI,CAAC,QAAQ,KAAK,QAAQ,UAAU,MAAM,WAAW,KAAK,QAAQ,QAAQ;IACxE,MAAM,oBAAI,IAAI,WAAW,mCAAmC;IAC5D,KAAK,KAAK,SAAS,CAAC;GACtB,OACE,IAAI,CAAC,MAAM;IACT,MAAM,aAAa,KAAK,YAAY,OAAO,SAAS;IACpD,KAAK,SAAS,OAAO,UAAU;GACjC;EAEJ;EAEA,WAAY,QAAQ,OAAO,KAAK;GAC9B,IAAI,KAAK,QAAQ,KACf,OAAO,OAAO,MAAM,OAAO,GAAG;GAGhC,OAAO,OAAO,SAAS,SAAS,OAAO,GAAG;EAC5C;EAEA,SAAU,OAAO,YAAY;GAC3B,MAAM,UAAW,KAAK,YAAY,QAAS,MAAM,KAAK,OAAO,UAAU,KAAK,IAAI,KAAK;GAErF,MAAM,MAAM,MAAM,QAAQ,GAAG,MAAM,UAAU;IAC3C,MAAM,SAAS,QAAQ;IACvB,IAAI,WAAW,MAAM,OAAO;IAC5B,IAAI,WAAW,KAAA,GACb,EAAE,UAAU;SAEZ,EAAE,IAAI,WAAW;IAEnB,OAAO;GACT,GAAG,CAAC,CAAC;GAEL,IAAI,KAAK,QAAQ,kBACf,KAAK,KAAK;IAAE;IAAK;GAAW,CAAC;QAE7B,KAAK,KAAK,GAAG;EAEjB;EAEA,OAAQ,IAAI;GACV,IAAI,KAAK,MAAM,WAAW,CAAC,KAAK,OAAO,OAAO,GAAG;GACjD,KAAK,UAAU,KAAK,OAAO,KAAK,MAAM,aAAa,KAAK,MAAM,SAAS,CAAC;GACxE,GAAG;EACL;EAEA,WAAY,MAAM,KAAK,IAAI;GACzB,IAAI,OAAO,SAAS,UAClB,OAAO,OAAO,KAAK,IAAI;GAGzB,MAAM,EAAE,QAAQ,UAAU,KAAK;GAC/B,IAAI,QAAQ;GACZ,IAAI,SAAS;GACb,KAAK,aAAa,KAAK;GAEvB,IAAI,KAAK,OAAO;IACd,QAAQ,KAAK,MAAM;IACnB,SAAS,OAAO,OAAO,CAAC,KAAK,OAAO,IAAI,CAAC;IACzC,KAAK,QAAQ;GACf;GAEA,MAAM,eAAe,OAAO;GAE5B,KAAK,IAAI,IAAI,OAAO,IAAI,cAAc,KAAK;IACzC,MAAM,MAAM,OAAO;IACnB,MAAM,UAAU,IAAI,IAAI,eAAe,OAAO,IAAI,KAAK;IAEvD,KAAK,MAAM;IACX,IAAI,KAAK,MAAM,YAAY,KAAK,QAAQ,aACtC,OAAO,mBAAG,IAAI,MAAM,8BAA8B,CAAC;IAGrD,IAAI,CAAC,KAAK,MAAM,WAAW,QAAQ,UAAU,YAAY,SAAS,MAAM,OAAO;KAC7E,KAAK,MAAM,UAAU;KACrB;IACF,OAAO,IAAI,QAAQ,OAAO;KACxB,IAAI,KAAK,MAAM,SACb,KAAK,MAAM,UAAU;UAGrB,KAAK,MAAM,SAAS,CAAC,KAAK,MAAM;KAElC;IACF;IAEA,IAAI,CAAC,KAAK,MAAM,QAAQ;KACtB,IAAI,KAAK,MAAM,SAAS,CAAC,KAAK,QAAQ;UAChC,QAAQ,IACV,KAAK,QAAQ,UAAU;WAClB,IAAI,QAAQ;WACb,YAAY,IACd,KAAK,QAAQ,UAAU;MAAA;KACzB;KAIJ,IAAI,QAAQ,KAAK,QAAQ,SAAS;MAChC,KAAK,UAAU,QAAQ,KAAK,MAAM,aAAa,IAAI,CAAC;MACpD,KAAK,MAAM,cAAc,IAAI;MAC7B,KAAK,MAAM,YAAY;KACzB;IACF;GACF;GAEA,IAAI,KAAK,MAAM,gBAAgB,cAAc;IAC3C,KAAK,MAAM,cAAc;IACzB,OAAO,GAAG;GACZ;GAEA,IAAI,eAAe,KAAK,MAAM,cAAc,KAAK,QAAQ;IACvD,KAAK,QAAQ;IACb,KAAK,MAAM,eAAgB,eAAe,KAAK;IAC/C,OAAO,GAAG;GACZ;GAEA,KAAK,QAAQ;GACb,GAAG;EACL;CACF;CAEA,OAAO,WAAW,SAAS,IAAI,UAAU,IAAI;;AClT7C,IAAA;;;;;AAAmG,EAAA,CAAA,MAAA,IAAA,CAAA,EAAA;AAAc,IAAA,KAAA,MAAA,GAAA,KAAA,MAAA,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA;AAA0C,IAAA,IAAA;;;;;;;;;;;;;;;;;;;;AAAsU,GAAA,IAAA,QAAA,IAAA,KAAA,KAAA,MAAA,OAAA,OAAA,CAAA,GAAA,GAAA,CAAA;AAAmD,IAAA,IAAA,cAAA,MAAA;;;;;AAA6E;AAAC,IAAA,IAAA,cAAA,MAAA;;;;;AAA4E;AAAwF,IAAA,IAAA,cAAA,MAAA;;;;;AAAqF,GAAC,IAAA,SAAA,GAAA,GAAA;;;AAAqF,GAAA,KAAA,MAAA,OAAA,MAAA,WAAA,EAAA,EAAA,GAAA,IAAA,EAAA,CAAA,GAAA,KAAA,MAAA,OAAA,MAAA,WAAA,EAAA,EAAA,YAAA,IAAA,EAAA,CAAA,GAAA,KAAA,GAAA,GAAA,MAAA,EAAA,QAAA,GAAA,MAAA,EAAA,CAAA,GAAA,CAAA,GAAA,KAAA,OAAA,MAAA,EAAA,SAAA,EAAA,EAAA,CAAA,IAAA,CAAA,IAAA,GAAA,KAAA,OAAA,MAAA,EAAA,YAAA,EAAA,EAAA,EAAA,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,IAAA,GAAA,KAAA,OAAA,MAAA,EAAA,EAAA,CAAA,IAAA,EAAA,CAAA,IAAA,CAAA,GAAA,KAAA,OAAA,GAAA,MAAA,EAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,IAAA,EAAA,CAAA,CAAA,CAAA,GAAA,KAAA,OAAA,MAAA,EAAA,EAAA,CAAA,IAAA,EAAA,cAAA,GAAA,KAAA,GAAA,OAAA,MAAA;;;;;;;;;AAAsoB,GAAA,KAAA,GAAA,GAAA,OAAA,MAAA;;;;;;;;;;;AAAqL,GAAA,IAAA,GAAA,KAAA,MAAA,CAAA,MAAA,MAAA,CAAA,SAAA,CAAA,KAAA,QAAA,IAAA,CAAA,IAAA,KAAA,GAAA,MAAA;;;;;;AAAsO,GAAA,KAAA,GAAA,MAAA;;;;AAAuP,GAAA,KAAA,GAAA,MAAA;;;AAA+D,GAAA,KAAA,GAAA,MAAA;;;;AAA0J,GAAA,KAAA,GAAA,MAAA;;;;;;;;;AAG55E,GAAE,MAAA,OAAA,MAAA;;;;;AAA0N;;;;;;;;;ACOlO,MAAM,SAAS,iBAAiB;;;;AAKhC,MAAM,mBAAmB,SAA0B;CACjD,MAAM,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,YAAY;CAC3C,OAAO;EAAC;EAAS;EAAQ;CAAQ,CAAC,CAAC,SAAS,GAAG;AACjD;;;;;AAMA,MAAa,eAAe,OAC1B,OACA,YAAqB,UACC;CACtB,MAAM,iBAA2B,CAAC;CAElC,KAAK,MAAM,YAAY,OACrB,IAAI;EACF,MAAM,QAAQ,MAAM,GAAG,KAAK,QAAQ;EAEpC,IAAI,MAAM,OAAO,GACf,IAAI,gBAAgB,QAAQ,GAC1B,eAAe,KAAK,QAAQ;OAE5B,OAAO,KAAK,mCAAmC,UAAU;OAEtD,IAAI,MAAM,YAAY,GAAG;GAC9B,MAAM,UAAU,MAAM,GAAG,QAAQ,QAAQ;GAEzC,KAAK,MAAM,SAAS,SAAS;IAC3B,MAAM,WAAW,KAAK,KAAK,UAAU,KAAK;IAC1C,MAAM,aAAa,MAAM,GAAG,KAAK,QAAQ;IAEzC,IAAI,WAAW,OAAO,KAAK,gBAAgB,QAAQ,GACjD,eAAe,KAAK,QAAQ;SACvB,IAAI,aAAa,WAAW,YAAY,GAAG;KAChD,MAAM,WAAW,MAAM,aAAa,CAAC,QAAQ,GAAG,IAAI;KACpD,eAAe,KAAK,GAAG,QAAQ;IACjC;GACF;EACF;CACF,SAAS,OAAO;EACd,OAAO,KACL,6CAA6C,SAAS,WAC1C,aAAa,KAAK,GAChC;CACF;CAGF,OAAO;AACT;;;;AAKA,MAAM,eAAe,OAAO,aAAqC;CAC/D,MAAM,UAAU,MAAM,GAAG,SAAS,UAAU,OAAO;CACnD,MAAM,SAAS,KAAK,MAAM,OAAO;CACjC,OAAO,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;AACjD;;;;AAKA,MAAM,gBAAgB,YAAyB;CAE7C,IAAI,OAAO,YAAY,UACrB,OAAO;CAIT,MAAM,UAAU,QAAQ,KAAK;CAC7B,IAAI,CAAC,QAAQ,WAAW,GAAG,KAAK,CAAC,QAAQ,WAAW,GAAG,GACrD,OAAO;CAGT,IAAI;EACF,OAAO,KAAK,MAAM,OAAO;CAC3B,SAAS,OAAO;EACd,OAAO,MAAM,uBAAuB,aAAa,KAAK,GAAG;EACzD,OAAO;CACT;AACF;;;;AAKA,MAAM,eAAe,QAAqC;CACxD,MAAM,SAAc,CAAC;CACrB,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,GAAG,GAC3C,OAAO,OAAO,aAAa,KAAK;CAElC,OAAO;AACT;;;;AAKA,MAAM,cAAc,OAAO,aACzB,IAAI,SAAS,SAAS,WAAW;CAC/B,MAAM,UAAiB,CAAC;CACxB,iBAAiB,QAAQ,CAAC,CACvB,MAAA,GAAA,kBAAA,QAAA,CAAS,CAAC,CAAC,CACX,GAAG,SAAS,SAAS,QAAQ,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,CACrD,GAAG,aAAa,QAAQ,OAAO,CAAC,CAAC,CACjC,GAAG,SAAS,MAAM;AACvB,CAAC;;;;AAKH,eAAe,cAAc,UAAkC;CAG7D,QADc,MADQ,GAAG,SAAS,UAAU,OAAO,EAAA,CAC7B,MAAM,IAAI,CAAC,CAAC,QAAQ,SAAS,KAAK,KAAK,CAClD,CAAC,CAAC,KAAK,SAAS,KAAK,MAAM,IAAI,CAAC;AAC7C;;;;AAKA,eAAe,SAAS,UAAkC;CACxD,MAAM,MAAM,KAAK,QAAQ,QAAQ,CAAC,CAAC,YAAY;CAE/C,IAAI,QAAQ,SACV,OAAO,aAAa,QAAQ;MACvB,IAAI,QAAQ,QACjB,OAAO,YAAY,QAAQ;MACtB,IAAI,QAAQ,UACjB,OAAO,cAAc,QAAQ;MAE7B,MAAM,IAAI,MAAM,0BAA0B,KAAK;AAEnD;;;;AAKA,MAAa,gBAAgB,OAC3B,OACA,YAAqB,UACU;CAC/B,MAAM,QAAQ,MAAM,aAAa,OAAO,SAAS;CAEjD,IAAI,MAAM,WAAW,GAAG;EACtB,OAAO,KAAK,iDAAiD;EAC7D,OAAO,CAAC;CACV;CAEA,OAAO,KAAK,SAAS,MAAM,OAAO,iBAAiB;CAEnD,MAAM,SAA4B,CAAC;CAEnC,KAAK,MAAM,QAAQ,OACjB,IAAI;EACF,MAAM,OAAO,MAAM,SAAS,IAAI;EAChC,OAAO,KAAK,GAAG,IAAI;EACnB,OAAO,KAAK,QAAQ,KAAK,OAAO,kBAAkB,MAAM;CAC1D,SAAS,OAAO;EACd,OAAO,MAAM,sBAAsB,KAAK,IAAI,aAAa,KAAK,GAAG;EACjE,MAAM;CACR;CAGF,OAAO;AACT;;;;AAKA,MAAM,gBAAgB,OACpB,UACA,SACkB;CAClB,MAAM,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC;CAC5C,MAAM,GAAG,UAAU,UAAU,SAAS,OAAO;AAC/C;;;;AAKA,MAAM,eAAe,OACnB,UACA,SACkB;CAClB,IAAI,KAAK,WAAW,GAClB,MAAM,IAAI,MAAM,yBAAyB;CAG3C,MAAM,gBAAgB,KAAK,KAAK,SAC9B,OAAO,YACL,OAAO,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,gBAAgB,KAAK,CAAC,CAAC,CAC1E,CACF;CAKA,MAAM,YAAYA,EADAC,GAFAC,EAAS,EAAE,kBAAkB,KAAK,CAEd,CAAC,CAAC,CAAC,aACN,CAAC;CAEpC,MAAM,GAAG,UAAU,UAAU,WAAW,OAAO;AACjD;;;;AAKA,MAAM,iBAAiB,OACrB,UACA,SACkB;CAClB,MAAM,QAAQ,KAAK,KAAK,SAAS,KAAK,UAAU,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;CAChE,MAAM,GAAG,UAAU,UAAU,QAAQ,MAAM,OAAO;AACpD;;;;AAKA,MAAa,cAAc,OACzB,UACA,MACA,WACkB;CAElB,MAAM,MAAM,KAAK,QAAQ,QAAQ;CACjC,MAAM,GAAG,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;CAGvC,MAAM,MAAM,UAAU,KAAK,QAAQ,QAAQ,CAAC,CAAC,MAAM,CAAC;CAEpD,IAAI,UAAU,WAAW,KAAK,QAAQ,QAAQ,CAAC,CAAC,MAAM,CAAC,GACrD,OAAO,KACL,iBAAiB,OAAO,iCAAiC,KAAK,QAAQ,QAAQ,CAAC,CAAC,MAAM,CAAC,GACzF;CAGF,IAAI,QAAQ,QACV,MAAM,cAAc,UAAU,IAAI;MAC7B,IAAI,QAAQ,OACjB,MAAM,aAAa,UAAU,IAAI;MAC5B,IAAI,QAAQ,SACjB,MAAM,eAAe,UAAU,IAAI;MAEnC,MAAM,IAAI,MAAM,8BAA8B,KAAK;AAEvD;;;;;;;AAQA,MAAM,mBAAmB,UAAuB;CAC9C,IAAI,UAAU,QAAQ,UAAU,KAAA,GAC9B,OAAO;CAET,IAAI,OAAO,UAAU,UACnB,OAAO;CAET,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,WAChD,OAAO,OAAO,KAAK;CAGrB,OAAO,KAAK,UAAU,KAAK;AAC7B;;;;AAKA,MAAa,kBACX,MACA,SAAmC,WAChC;CACH,IAAI,WAAW,QACb,QAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;MACpC,IAAI,WAAW,OAAO;EAC3B,IAAI,KAAK,WAAW,GAAG;GACrB,OAAO,MAAM,kBAAkB;GAC/B;EACF;EAEA,MAAM,gBAAgB,KAAK,KAAK,SAC9B,OAAO,YACL,OAAO,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW,CACzC,KACA,gBAAgB,KAAK,CACvB,CAAC,CACH,CACF;EAKA,MAAM,YAAYF,EADAC,GAFAC,EAAS,EAAE,kBAAkB,KAAK,CAEd,CAAC,CAAC,CAAC,aACN,CAAC;EACpC,QAAQ,IAAI,SAAS;CACvB,OAAO,IAAI,WAAW,SACpB,KAAK,SAAS,SAAS,QAAQ,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC;MAExD,MAAM,IAAI,MACR,8BAA8B,OAAO,MAAM,EAAE,wCAE/C;AAEJ"}