{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/config.ts","../src/errors.ts","../src/transport.ts","../src/utils.ts","../src/validators.ts","../src/voucherRules.ts","../src/client.ts"],"sourcesContent":["export { TmnVoucherClient, createTmnVoucherClient } from \"./client\";\nexport {\n  DEFAULT_BASE_API_URL,\n  DEFAULT_TIMEOUT_MS,\n  DEFAULT_USER_AGENT,\n} from \"./constants\";\nexport { extractVoucherCode, validateInput } from \"./validators\";\nexport type {\n  ConfigurationData,\n  FetchLike,\n  MaintenanceInfo,\n  MyTicket,\n  Profile,\n  RedeemVoucherData,\n  RedeemVoucherOptions,\n  RedeemVoucherResult,\n  RedeemerProfile,\n  ResolvedTmnVoucherClientConfig,\n  SdkFailure,\n  SdkResult,\n  SdkStatusCode,\n  SdkSuccess,\n  ServerStatusResult,\n  StatusCode,\n  TmnVoucherClientConfig,\n  TrueMoneyResponse,\n  TrueMoneyStatusCode,\n  ValidateInputParams,\n  ValidateInputResult,\n  ValidationIssue,\n  VerifyVoucherData,\n  VerifyVoucherOptions,\n  VerifyVoucherResult,\n  Voucher,\n  VoucherData,\n  VoucherStatus,\n} from \"./types\";\n","export const DEFAULT_BASE_API_URL = \"https://gift.truemoney.com\";\n\nexport const DEFAULT_USER_AGENT =\n  \"@prakrit_m/tmn-voucher/2.0.0 (third-party-sdk; +https://github.com/PrakritManStudio/tmn-voucher)\";\n\nexport const DEFAULT_TIMEOUT_MS = 15000;\n","import {\n  DEFAULT_BASE_API_URL,\n  DEFAULT_TIMEOUT_MS,\n  DEFAULT_USER_AGENT,\n} from \"./constants\";\nimport type {\n  FetchLike,\n  ResolvedTmnVoucherClientConfig,\n  TmnVoucherClientConfig,\n} from \"./types\";\n\nfunction getDefaultFetch(): FetchLike {\n  if (typeof fetch !== \"function\") {\n    return async () => {\n      throw new Error(\n        \"Fetch API is not available. Pass a custom fetch implementation in TmnVoucherClient config.\",\n      );\n    };\n  }\n\n  return fetch.bind(globalThis) as FetchLike;\n}\n\nfunction normalizeBaseApiUrl(baseApiUrl: string): string {\n  return baseApiUrl.replace(/\\/+$/, \"\");\n}\n\nexport function resolveConfig(\n  config: TmnVoucherClientConfig = {},\n): ResolvedTmnVoucherClientConfig {\n  return {\n    baseApiUrl: normalizeBaseApiUrl(\n      config.baseApiUrl ?? DEFAULT_BASE_API_URL,\n    ),\n    userAgent: config.userAgent ?? DEFAULT_USER_AGENT,\n    headers: config.headers ?? {},\n    fetch: config.fetch ?? getDefaultFetch(),\n    timeoutMs: config.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n  };\n}\n","import type { SdkFailure, StatusCode } from \"./types\";\n\nexport function failure<TCode extends Exclude<StatusCode, \"SUCCESS\">>(\n  code: TCode,\n  message: string,\n  data?: unknown,\n): SdkFailure<TCode> {\n  return {\n    success: false,\n    code,\n    message,\n    ...(data !== undefined ? { data } : {}),\n  };\n}\n","import { failure } from \"./errors\";\nimport type {\n  ResolvedTmnVoucherClientConfig,\n  SdkFailure,\n  StatusCode,\n  TrueMoneyResponse,\n} from \"./types\";\n\nexport type TransportResult<TData> =\n  | {\n      success: true;\n      data: TData;\n    }\n  | SdkFailure<\"NETWORK_ERROR\" | \"TIMEOUT\" | \"INVALID_RESPONSE\">;\n\nfunction mergeHeaders(\n  config: ResolvedTmnVoucherClientConfig,\n  headers?: HeadersInit,\n): Headers {\n  const mergedHeaders = new Headers(config.headers);\n\n  if (config.userAgent) {\n    mergedHeaders.set(\"User-Agent\", config.userAgent);\n  }\n\n  if (headers) {\n    new Headers(headers).forEach((value, key) => {\n      mergedHeaders.set(key, value);\n    });\n  }\n\n  return mergedHeaders;\n}\n\nexport async function requestJson<TData>(\n  config: ResolvedTmnVoucherClientConfig,\n  url: string,\n  init: RequestInit = {},\n): Promise<TransportResult<TData>> {\n  const controller = new AbortController();\n  const timeout = setTimeout(() => controller.abort(), config.timeoutMs);\n\n  try {\n    const response = await config.fetch(url, {\n      ...init,\n      headers: mergeHeaders(config, init.headers),\n      signal: controller.signal,\n    });\n\n    if (!response.ok) {\n      return failure(\n        \"INVALID_RESPONSE\",\n        `HTTP ${response.status}: ${response.statusText || \"Request failed\"}`,\n      );\n    }\n\n    let json: unknown;\n\n    try {\n      json = (await response.json()) as unknown;\n    } catch (error) {\n      return failure(\n        \"INVALID_RESPONSE\",\n        error instanceof Error\n          ? error.message\n          : \"API ไม่ได้ส่งข้อมูลกลับมาเป็น JSON\",\n      );\n    }\n\n    if (!json || typeof json !== \"object\") {\n      return failure(\"INVALID_RESPONSE\", \"รูปแบบข้อมูลที่ได้รับจาก API ไม่ถูกต้อง\");\n    }\n\n    return {\n      success: true,\n      data: json as TData,\n    };\n  } catch (error) {\n    if (error instanceof Error && error.name === \"AbortError\") {\n      return failure(\"TIMEOUT\", \"เชื่อมต่อ API เกินเวลาที่กำหนด\");\n    }\n\n    return failure(\n      \"NETWORK_ERROR\",\n      error instanceof Error ? error.message : \"ไม่สามารถเชื่อมต่อ API ได้\",\n    );\n  } finally {\n    clearTimeout(timeout);\n  }\n}\n\nexport function parseTrueMoneyResponse<TData>(\n  response: TrueMoneyResponse<TData>,\n) {\n  const code = response.status?.code as StatusCode | undefined;\n  const message = response.status?.message;\n\n  if (!code || !message) {\n    return failure(\"INVALID_RESPONSE\", \"รูปแบบสถานะจาก API ไม่ถูกต้อง\");\n  }\n\n  return {\n    success: true as const,\n    code,\n    message,\n    data: response.data,\n  };\n}\n","export function satangToBaht(satang: number): string {\n  return (satang / 100).toFixed(2);\n}\n\nexport function bahtToSatang(baht: string | number): number {\n  const numericBaht = typeof baht === \"number\" ? baht : Number.parseFloat(baht);\n  return Math.round(numericBaht * 100);\n}\n\nexport function buildUrl(baseApiUrl: string, path: string): string {\n  return `${baseApiUrl}${path.startsWith(\"/\") ? path : `/${path}`}`;\n}\n","import z from \"zod\";\nimport { failure } from \"./errors\";\nimport type {\n  RedeemVoucherOptions,\n  ValidateInputParams,\n  ValidateInputResult,\n  ValidationIssue,\n  VerifyVoucherOptions,\n} from \"./types\";\n\nconst phoneNumberSchema = z\n  .string()\n  .length(10, \"หมายเลขโทรศัพท์ต้องมี 10 หลัก\")\n  .refine((value) => /^\\d+$/.test(value), \"หมายเลขโทรศัพท์ต้องเป็นตัวเลข\")\n  .refine((value) => value.startsWith(\"0\"), \"หมายเลขโทรศัพท์ต้องขึ้นต้นด้วย 0\");\n\nconst voucherCodeSchema = z\n  .string()\n  .min(1, \"กรุณาระบุรหัสหรือ URL Voucher\")\n  .regex(/^[A-Za-z0-9]+$/, \"รูปแบบรหัส Voucher ไม่ถูกต้อง\");\n\nconst optionsSchema = z.object({\n  amount: z\n    .number()\n    .int(\"amount: ต้องเป็นจำนวนเต็มหน่วยสตางค์\")\n    .positive(\"amount: ต้องมากกว่า 0\")\n    .min(100, \"amount: จำนวนเงินขั้นต่ำ 100 สตางค์\")\n    .max(20000000, \"amount: จำนวนเงินต้องไม่เกิน 200000 บาท\")\n    .optional(),\n});\n\nconst inputSchema = z\n  .object({\n    phoneNumber: phoneNumberSchema.optional(),\n    voucherUrlOrCode: z.string().min(1, \"กรุณาระบุรหัสหรือ URL Voucher\"),\n    options: optionsSchema.optional(),\n    requirePhoneNumber: z.boolean().optional(),\n  })\n  .superRefine((value, context) => {\n    if (value.requirePhoneNumber && !value.phoneNumber) {\n      context.addIssue({\n        code: z.ZodIssueCode.custom,\n        path: [\"phoneNumber\"],\n        message: \"กรุณาระบุหมายเลขโทรศัพท์\",\n      });\n    }\n\n    if (!extractVoucherCode(value.voucherUrlOrCode)) {\n      context.addIssue({\n        code: z.ZodIssueCode.custom,\n        path: [\"voucherUrlOrCode\"],\n        message: \"รูปแบบรหัสหรือ URL Voucher ไม่ถูกต้อง\",\n      });\n    }\n  });\n\nexport function extractVoucherCode(voucherUrlOrCode: string): string | null {\n  const input = voucherUrlOrCode.trim();\n\n  if (!input) {\n    return null;\n  }\n\n  if (/^[A-Za-z0-9]+$/.test(input)) {\n    return input;\n  }\n\n  try {\n    const parsedUrl = new URL(input);\n    const voucherCode = parsedUrl.searchParams.get(\"v\");\n    return voucherCode && /^[A-Za-z0-9]+$/.test(voucherCode)\n      ? voucherCode\n      : null;\n  } catch {\n    return null;\n  }\n}\n\nexport function validateVoucherCode(voucherUrlOrCode: string) {\n  const voucherCode = extractVoucherCode(voucherUrlOrCode);\n  const result = voucherCodeSchema.safeParse(voucherCode);\n\n  if (!result.success) {\n    return failure(\"INVALID_INPUT\", result.error.errors[0].message);\n  }\n\n  return {\n    success: true as const,\n    code: \"SUCCESS\" as const,\n    voucherCode: result.data,\n  };\n}\n\nexport function validateInput(\n  input: ValidateInputParams,\n): ValidateInputResult {\n  const result = inputSchema.safeParse(input);\n\n  if (!result.success) {\n    const issues = toValidationIssues(result.error.errors);\n\n    return {\n      success: false,\n      code: \"INVALID_INPUT\",\n      message: issues.map((issue) => issue.message).join(\", \"),\n      issues,\n    };\n  }\n\n  return {\n    success: true,\n    code: \"SUCCESS\",\n    data: {\n      ...(result.data.phoneNumber ? { phoneNumber: result.data.phoneNumber } : {}),\n      voucherCode: extractVoucherCode(result.data.voucherUrlOrCode) as string,\n      options: result.data.options ?? {},\n    },\n  };\n}\n\nexport function validatePhoneNumber(phoneNumber: string) {\n  const result = phoneNumberSchema.safeParse(phoneNumber);\n\n  if (!result.success) {\n    return failure(\"INVALID_INPUT\", result.error.errors[0].message);\n  }\n\n  return {\n    success: true as const,\n    code: \"SUCCESS\" as const,\n    phoneNumber: result.data,\n  };\n}\n\nexport function validateOptions(\n  options?: RedeemVoucherOptions | VerifyVoucherOptions,\n) {\n  const result = optionsSchema.safeParse(options ?? {});\n\n  if (!result.success) {\n    return failure(\"INVALID_INPUT\", result.error.errors[0].message);\n  }\n\n  return {\n    success: true as const,\n    code: \"SUCCESS\" as const,\n    options: result.data,\n  };\n}\n\nfunction toValidationIssues(issues: z.ZodIssue[]): ValidationIssue[] {\n  return issues.map((issue) => ({\n    path: issue.path.join(\".\"),\n    code: issue.code,\n    message: issue.message,\n  }));\n}\n","import { bahtToSatang } from \"./utils\";\nimport type { VerifyVoucherOptions, Voucher } from \"./types\";\n\nexport function matchesVoucherConditions(\n  voucher: Voucher,\n  options: VerifyVoucherOptions,\n): boolean {\n  if (options.amount === undefined) {\n    return true;\n  }\n\n  const amountInSatang = bahtToSatang(voucher.amount_baht);\n\n  if (voucher.member === 1) {\n    return options.amount === amountInSatang;\n  }\n\n  if (voucher.member > 1 && voucher.type === \"R\") {\n    const balance =\n      amountInSatang - bahtToSatang(voucher.redeemed_amount_baht);\n    return voucher.available === 1 && options.amount === balance;\n  }\n\n  if (voucher.member > 1 && voucher.type === \"F\") {\n    const balance = amountInSatang / voucher.member;\n    return options.amount === balance;\n  }\n\n  return false;\n}\n","import { resolveConfig } from \"./config\";\nimport { failure } from \"./errors\";\nimport { requestJson, parseTrueMoneyResponse } from \"./transport\";\nimport { bahtToSatang, buildUrl } from \"./utils\";\nimport {\n  validateInput,\n  validateOptions,\n  validatePhoneNumber,\n  validateVoucherCode,\n} from \"./validators\";\nimport { matchesVoucherConditions } from \"./voucherRules\";\nimport type {\n  ConfigurationData,\n  RedeemVoucherOptions,\n  RedeemVoucherResult,\n  ResolvedTmnVoucherClientConfig,\n  ServerStatusResult,\n  TmnVoucherClientConfig,\n  TrueMoneyResponse,\n  ValidateInputParams,\n  ValidateInputResult,\n  VerifyVoucherOptions,\n  VerifyVoucherResult,\n  VoucherData,\n} from \"./types\";\n\n/**\n * Client สำหรับตรวจสอบและแลกคูปองอั่งเปา TrueMoney Wallet\n *\n * SDK นี้เป็น third-party ไม่ใช่ผลิตภัณฑ์อย่างเป็นทางการจาก TrueMoney\n * ทุก method คืนผลลัพธ์แบบ result object (`success: true | false`) ไม่ throw\n *\n * @example\n * ```typescript\n * const client = new TmnVoucherClient();\n *\n * const result = await client.redeemVoucher(\n *   \"0812345678\",\n *   \"https://gift.truemoney.com/campaign/?v=YOUR_CODE\",\n *   { amount: 10000 },\n * );\n *\n * if (result.success) {\n *   console.log(result.data.amount);\n * }\n * ```\n */\nexport class TmnVoucherClient {\n  private readonly config: ResolvedTmnVoucherClientConfig;\n\n  /**\n   * @param config - ตั้งค่า base URL, fetch, timeout และ headers\n   */\n  constructor(config: TmnVoucherClientConfig = {}) {\n    this.config = resolveConfig(config);\n  }\n\n  /**\n   * ตรวจสอบ input โดยไม่เรียก API\n   *\n   * เหมาะสำหรับ validate form ก่อนเรียก {@link verifyVoucher} หรือ {@link redeemVoucher}\n   *\n   * @param input - เบอร์โทร, voucher URL/code และ options\n   * @returns ผลลัพธ์ validation พร้อม `issues` ถ้าไม่ผ่าน\n   */\n  validateInput(input: ValidateInputParams): ValidateInputResult {\n    return validateInput(input);\n  }\n\n  /**\n   * ตรวจสอบว่า TrueMoney voucher server พร้อมใช้งานหรืออยู่ในช่วง maintenance\n   *\n   * คืน `MAINTENANCE` เมื่อ `status.code` เป็น `MAINTENANCE`\n   * หรือ `data.ma` มีข้อความแจ้งปิดปรับปรุง\n   *\n   * @returns `SUCCESS` ถ้า server พร้อมใช้งาน\n   */\n  async checkServerStatus(): Promise<ServerStatusResult> {\n    const response = await requestJson<TrueMoneyResponse<ConfigurationData>>(\n      this.config,\n      buildUrl(this.config.baseApiUrl, \"/campaign/vouchers/configuration\"),\n    );\n\n    if (!response.success) {\n      return response;\n    }\n\n    const parsed = parseTrueMoneyResponse(response.data);\n\n    if (!parsed.success) {\n      return parsed;\n    }\n\n    const isMaintenance =\n      parsed.code === \"MAINTENANCE\" || hasMaintenance(response.data.data?.ma);\n\n    if (!isMaintenance) {\n      return {\n        success: true,\n        code: \"SUCCESS\",\n        message: parsed.message,\n      };\n    }\n\n    return failure(\n      \"MAINTENANCE\",\n      extractMaintenanceMessage(response.data.data?.ma) ?? parsed.message,\n    );\n  }\n\n  /**\n   * ตรวจสอบข้อมูล voucher โดยไม่ redeem\n   *\n   * รองรับทั้ง voucher URL และ voucher code ตรง ๆ\n   * ถ้าระบุ `options.amount` (หน่วยสตางค์) จะตรวจว่า voucher ตรงเงื่อนไขก่อนคืน `SUCCESS`\n   *\n   * @param voucherUrlOrCode - URL หรือรหัส voucher\n   * @param options - เงื่อนไขเพิ่มเติม เช่น `amount` หน่วยสตางค์\n   * @returns ข้อมูล voucher จาก API (type ตาม TrueMoney) หรือ error code\n   */\n  async verifyVoucher(\n    voucherUrlOrCode: string,\n    options?: VerifyVoucherOptions,\n  ): Promise<VerifyVoucherResult> {\n    const voucherValidation = validateVoucherCode(voucherUrlOrCode);\n    if (!voucherValidation.success) {\n      return voucherValidation;\n    }\n\n    const optionsValidation = validateOptions(options);\n    if (!optionsValidation.success) {\n      return optionsValidation;\n    }\n\n    const response = await requestJson<TrueMoneyResponse<VoucherData | null>>(\n      this.config,\n      buildUrl(\n        this.config.baseApiUrl,\n        `/campaign/vouchers/${voucherValidation.voucherCode}/verify`,\n      ),\n    );\n\n    if (!response.success) {\n      return response;\n    }\n\n    const parsed = parseTrueMoneyResponse(response.data);\n\n    if (!parsed.success) {\n      return parsed;\n    }\n\n    if (parsed.code !== \"SUCCESS\") {\n      return failure(parsed.code, parsed.message, parsed.data);\n    }\n\n    if (!isVoucherData(parsed.data)) {\n      return failure(\"INVALID_RESPONSE\", \"ไม่พบข้อมูล Voucher จาก API\");\n    }\n\n    if (!matchesVoucherConditions(parsed.data.voucher, optionsValidation.options)) {\n      return failure(\"CONDITION_NOT_MET\", \"ไม่ตรงเงื่อนไข\", parsed.data);\n    }\n\n    return {\n      success: true,\n      code: \"SUCCESS\",\n      message: parsed.message,\n      data: {\n        voucherCode: voucherValidation.voucherCode,\n        voucher: parsed.data.voucher,\n        ownerProfile: parsed.data.owner_profile,\n        tickets: parsed.data.tickets ?? [],\n        raw: parsed.data,\n      },\n    };\n  }\n\n  /**\n   * แลกคูปองอั่งเปาเข้ากระเป๋า TrueMoney ของเบอร์ที่ระบุ\n   *\n   * Flow: validate input → {@link checkServerStatus} → (optional) {@link verifyVoucher} → redeem\n   *\n   * ถ้าระบุ `options.amount` แล้วไม่ตรงเงื่อนไข จะไม่เรียก redeem endpoint\n   * และคืน `CONDITION_NOT_MET`\n   *\n   * @param phoneNumber - เบอร์โทรผู้รับ 10 หลัก ขึ้นต้นด้วย 0\n   * @param voucherUrlOrCode - URL หรือรหัส voucher\n   * @param options - เงื่อนไขเพิ่มเติม เช่น `amount` หน่วยสตางค์\n   * @returns `data.amount` เป็นจำนวนเงินที่ได้รับ (สตางค์) และ `data.raw` จาก API\n   */\n  async redeemVoucher(\n    phoneNumber: string,\n    voucherUrlOrCode: string,\n    options?: RedeemVoucherOptions,\n  ): Promise<RedeemVoucherResult> {\n    const phoneValidation = validatePhoneNumber(phoneNumber);\n    if (!phoneValidation.success) {\n      return phoneValidation;\n    }\n\n    const voucherValidation = validateVoucherCode(voucherUrlOrCode);\n    if (!voucherValidation.success) {\n      return voucherValidation;\n    }\n\n    const optionsValidation = validateOptions(options);\n    if (!optionsValidation.success) {\n      return optionsValidation;\n    }\n\n    const serverStatus = await this.checkServerStatus();\n    if (!serverStatus.success) {\n      return serverStatus;\n    }\n\n    if (optionsValidation.options.amount !== undefined) {\n      const verifyResult = await this.verifyVoucher(\n        voucherValidation.voucherCode,\n        optionsValidation.options,\n      );\n\n      if (!verifyResult.success) {\n        return verifyResult;\n      }\n    }\n\n    const response = await requestJson<TrueMoneyResponse<VoucherData | null>>(\n      this.config,\n      buildUrl(\n        this.config.baseApiUrl,\n        `/campaign/vouchers/${voucherValidation.voucherCode}/redeem`,\n      ),\n      {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n        },\n        body: JSON.stringify({\n          mobile: phoneValidation.phoneNumber,\n          voucher_hash: voucherValidation.voucherCode,\n        }),\n      },\n    );\n\n    if (!response.success) {\n      return response;\n    }\n\n    const parsed = parseTrueMoneyResponse(response.data);\n\n    if (!parsed.success) {\n      return parsed;\n    }\n\n    if (parsed.code !== \"SUCCESS\") {\n      return failure(parsed.code, parsed.message, parsed.data);\n    }\n\n    if (!isVoucherData(parsed.data) || !parsed.data.my_ticket) {\n      return failure(\"INVALID_RESPONSE\", \"ไม่พบข้อมูลการแลก Voucher จาก API\");\n    }\n\n    return {\n      success: true,\n      code: \"SUCCESS\",\n      message: parsed.message,\n      data: {\n        voucherCode: voucherValidation.voucherCode,\n        amount: bahtToSatang(parsed.data.my_ticket.amount_baht),\n        raw: parsed.data,\n      },\n    };\n  }\n}\n\n/**\n * สร้าง {@link TmnVoucherClient} instance\n *\n * @param config - ตั้งค่า client เช่น `fetch`, `timeoutMs`, `baseApiUrl`\n */\nexport function createTmnVoucherClient(\n  config?: TmnVoucherClientConfig,\n): TmnVoucherClient {\n  return new TmnVoucherClient(config);\n}\n\nfunction isVoucherData(data: unknown): data is VoucherData {\n  if (!data || typeof data !== \"object\") {\n    return false;\n  }\n\n  return \"voucher\" in data && \"owner_profile\" in data;\n}\n\nfunction hasMaintenance(ma: ConfigurationData[\"ma\"]): boolean {\n  if (!ma) {\n    return false;\n  }\n\n  return [\n    ma.title_th,\n    ma.title_en,\n    ma.message_th,\n    ma.message_en,\n  ].some((value) => !isEmptyMaintenanceValue(value));\n}\n\nfunction isEmptyMaintenanceValue(value: unknown): boolean {\n  return value === null || value === undefined || value === \"\";\n}\n\nfunction extractMaintenanceMessage(ma: ConfigurationData[\"ma\"]): string | null {\n  if (!ma) {\n    return null;\n  }\n\n  for (const value of [ma.title_th, ma.message_th, ma.title_en, ma.message_en]) {\n    if (!isEmptyMaintenanceValue(value)) {\n      return String(value);\n    }\n  }\n\n  return null;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,uBAAuB;AAE7B,IAAM,qBACX;AAEK,IAAM,qBAAqB;;;ACMlC,SAAS,kBAA6B;AACpC,MAAI,OAAO,UAAU,YAAY;AAC/B,WAAO,YAAY;AACjB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,UAAU;AAC9B;AAEA,SAAS,oBAAoB,YAA4B;AACvD,SAAO,WAAW,QAAQ,QAAQ,EAAE;AACtC;AAEO,SAAS,cACd,SAAiC,CAAC,GACF;AAChC,SAAO;AAAA,IACL,YAAY;AAAA,MACV,OAAO,cAAc;AAAA,IACvB;AAAA,IACA,WAAW,OAAO,aAAa;AAAA,IAC/B,SAAS,OAAO,WAAW,CAAC;AAAA,IAC5B,OAAO,OAAO,SAAS,gBAAgB;AAAA,IACvC,WAAW,OAAO,aAAa;AAAA,EACjC;AACF;;;ACrCO,SAAS,QACd,MACA,SACA,MACmB;AACnB,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC;AAAA,EACvC;AACF;;;ACEA,SAAS,aACP,QACA,SACS;AACT,QAAM,gBAAgB,IAAI,QAAQ,OAAO,OAAO;AAEhD,MAAI,OAAO,WAAW;AACpB,kBAAc,IAAI,cAAc,OAAO,SAAS;AAAA,EAClD;AAEA,MAAI,SAAS;AACX,QAAI,QAAQ,OAAO,EAAE,QAAQ,CAAC,OAAO,QAAQ;AAC3C,oBAAc,IAAI,KAAK,KAAK;AAAA,IAC9B,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,eAAsB,YACpB,QACA,KACA,OAAoB,CAAC,GACY;AACjC,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,OAAO,SAAS;AAErE,MAAI;AACF,UAAM,WAAW,MAAM,OAAO,MAAM,KAAK;AAAA,MACvC,GAAG;AAAA,MACH,SAAS,aAAa,QAAQ,KAAK,OAAO;AAAA,MAC1C,QAAQ,WAAW;AAAA,IACrB,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,aAAO;AAAA,QACL;AAAA,QACA,QAAQ,SAAS,MAAM,KAAK,SAAS,cAAc,gBAAgB;AAAA,MACrE;AAAA,IACF;AAEA,QAAI;AAEJ,QAAI;AACF,aAAQ,MAAM,SAAS,KAAK;AAAA,IAC9B,SAAS,OAAO;AACd,aAAO;AAAA,QACL;AAAA,QACA,iBAAiB,QACb,MAAM,UACN;AAAA,MACN;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,aAAO,QAAQ,oBAAoB,mNAAyC;AAAA,IAC9E;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF,SAAS,OAAO;AACd,QAAI,iBAAiB,SAAS,MAAM,SAAS,cAAc;AACzD,aAAO,QAAQ,WAAW,6JAAgC;AAAA,IAC5D;AAEA,WAAO;AAAA,MACL;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAC3C;AAAA,EACF,UAAE;AACA,iBAAa,OAAO;AAAA,EACtB;AACF;AAEO,SAAS,uBACd,UACA;AACA,QAAM,OAAO,SAAS,QAAQ;AAC9B,QAAM,UAAU,SAAS,QAAQ;AAEjC,MAAI,CAAC,QAAQ,CAAC,SAAS;AACrB,WAAO,QAAQ,oBAAoB,uJAA+B;AAAA,EACpE;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,MAAM,SAAS;AAAA,EACjB;AACF;;;ACvGO,SAAS,aAAa,MAA+B;AAC1D,QAAM,cAAc,OAAO,SAAS,WAAW,OAAO,OAAO,WAAW,IAAI;AAC5E,SAAO,KAAK,MAAM,cAAc,GAAG;AACrC;AAEO,SAAS,SAAS,YAAoB,MAAsB;AACjE,SAAO,GAAG,UAAU,GAAG,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI,EAAE;AACjE;;;ACXA,iBAAc;AAUd,IAAM,oBAAoB,WAAAA,QACvB,OAAO,EACP,OAAO,IAAI,4JAA+B,EAC1C,OAAO,CAAC,UAAU,QAAQ,KAAK,KAAK,GAAG,gLAA+B,EACtE,OAAO,CAAC,UAAU,MAAM,WAAW,GAAG,GAAG,wLAAkC;AAE9E,IAAM,oBAAoB,WAAAA,QACvB,OAAO,EACP,IAAI,GAAG,oHAA+B,EACtC,MAAM,kBAAkB,mIAA+B;AAE1D,IAAM,gBAAgB,WAAAA,QAAE,OAAO;AAAA,EAC7B,QAAQ,WAAAA,QACL,OAAO,EACP,IAAI,kLAAsC,EAC1C,SAAS,8EAAuB,EAChC,IAAI,KAAK,mJAAqC,EAC9C,IAAI,KAAU,4JAAyC,EACvD,SAAS;AACd,CAAC;AAED,IAAM,cAAc,WAAAA,QACjB,OAAO;AAAA,EACN,aAAa,kBAAkB,SAAS;AAAA,EACxC,kBAAkB,WAAAA,QAAE,OAAO,EAAE,IAAI,GAAG,oHAA+B;AAAA,EACnE,SAAS,cAAc,SAAS;AAAA,EAChC,oBAAoB,WAAAA,QAAE,QAAQ,EAAE,SAAS;AAC3C,CAAC,EACA,YAAY,CAAC,OAAO,YAAY;AAC/B,MAAI,MAAM,sBAAsB,CAAC,MAAM,aAAa;AAClD,YAAQ,SAAS;AAAA,MACf,MAAM,WAAAA,QAAE,aAAa;AAAA,MACrB,MAAM,CAAC,aAAa;AAAA,MACpB,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,mBAAmB,MAAM,gBAAgB,GAAG;AAC/C,YAAQ,SAAS;AAAA,MACf,MAAM,WAAAA,QAAE,aAAa;AAAA,MACrB,MAAM,CAAC,kBAAkB;AAAA,MACzB,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF,CAAC;AAEI,SAAS,mBAAmB,kBAAyC;AAC1E,QAAM,QAAQ,iBAAiB,KAAK;AAEpC,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,KAAK,KAAK,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,YAAY,IAAI,IAAI,KAAK;AAC/B,UAAM,cAAc,UAAU,aAAa,IAAI,GAAG;AAClD,WAAO,eAAe,iBAAiB,KAAK,WAAW,IACnD,cACA;AAAA,EACN,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,oBAAoB,kBAA0B;AAC5D,QAAM,cAAc,mBAAmB,gBAAgB;AACvD,QAAM,SAAS,kBAAkB,UAAU,WAAW;AAEtD,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,QAAQ,iBAAiB,OAAO,MAAM,OAAO,CAAC,EAAE,OAAO;AAAA,EAChE;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,IACN,aAAa,OAAO;AAAA,EACtB;AACF;AAEO,SAAS,cACd,OACqB;AACrB,QAAM,SAAS,YAAY,UAAU,KAAK;AAE1C,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,SAAS,mBAAmB,OAAO,MAAM,MAAM;AAErD,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,SAAS,OAAO,IAAI,CAAC,UAAU,MAAM,OAAO,EAAE,KAAK,IAAI;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,MACJ,GAAI,OAAO,KAAK,cAAc,EAAE,aAAa,OAAO,KAAK,YAAY,IAAI,CAAC;AAAA,MAC1E,aAAa,mBAAmB,OAAO,KAAK,gBAAgB;AAAA,MAC5D,SAAS,OAAO,KAAK,WAAW,CAAC;AAAA,IACnC;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,aAAqB;AACvD,QAAM,SAAS,kBAAkB,UAAU,WAAW;AAEtD,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,QAAQ,iBAAiB,OAAO,MAAM,OAAO,CAAC,EAAE,OAAO;AAAA,EAChE;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,IACN,aAAa,OAAO;AAAA,EACtB;AACF;AAEO,SAAS,gBACd,SACA;AACA,QAAM,SAAS,cAAc,UAAU,WAAW,CAAC,CAAC;AAEpD,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,QAAQ,iBAAiB,OAAO,MAAM,OAAO,CAAC,EAAE,OAAO;AAAA,EAChE;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AACF;AAEA,SAAS,mBAAmB,QAAyC;AACnE,SAAO,OAAO,IAAI,CAAC,WAAW;AAAA,IAC5B,MAAM,MAAM,KAAK,KAAK,GAAG;AAAA,IACzB,MAAM,MAAM;AAAA,IACZ,SAAS,MAAM;AAAA,EACjB,EAAE;AACJ;;;ACzJO,SAAS,yBACd,SACA,SACS;AACT,MAAI,QAAQ,WAAW,QAAW;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,aAAa,QAAQ,WAAW;AAEvD,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,QAAQ,WAAW;AAAA,EAC5B;AAEA,MAAI,QAAQ,SAAS,KAAK,QAAQ,SAAS,KAAK;AAC9C,UAAM,UACJ,iBAAiB,aAAa,QAAQ,oBAAoB;AAC5D,WAAO,QAAQ,cAAc,KAAK,QAAQ,WAAW;AAAA,EACvD;AAEA,MAAI,QAAQ,SAAS,KAAK,QAAQ,SAAS,KAAK;AAC9C,UAAM,UAAU,iBAAiB,QAAQ;AACzC,WAAO,QAAQ,WAAW;AAAA,EAC5B;AAEA,SAAO;AACT;;;ACkBO,IAAM,mBAAN,MAAuB;AAAA;AAAA;AAAA;AAAA,EAM5B,YAAY,SAAiC,CAAC,GAAG;AAC/C,SAAK,SAAS,cAAc,MAAM;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,cAAc,OAAiD;AAC7D,WAAO,cAAc,KAAK;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,oBAAiD;AACrD,UAAM,WAAW,MAAM;AAAA,MACrB,KAAK;AAAA,MACL,SAAS,KAAK,OAAO,YAAY,kCAAkC;AAAA,IACrE;AAEA,QAAI,CAAC,SAAS,SAAS;AACrB,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,uBAAuB,SAAS,IAAI;AAEnD,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO;AAAA,IACT;AAEA,UAAM,gBACJ,OAAO,SAAS,iBAAiB,eAAe,SAAS,KAAK,MAAM,EAAE;AAExE,QAAI,CAAC,eAAe;AAClB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,QACN,SAAS,OAAO;AAAA,MAClB;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,0BAA0B,SAAS,KAAK,MAAM,EAAE,KAAK,OAAO;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,cACJ,kBACA,SAC8B;AAC9B,UAAM,oBAAoB,oBAAoB,gBAAgB;AAC9D,QAAI,CAAC,kBAAkB,SAAS;AAC9B,aAAO;AAAA,IACT;AAEA,UAAM,oBAAoB,gBAAgB,OAAO;AACjD,QAAI,CAAC,kBAAkB,SAAS;AAC9B,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,MAAM;AAAA,MACrB,KAAK;AAAA,MACL;AAAA,QACE,KAAK,OAAO;AAAA,QACZ,sBAAsB,kBAAkB,WAAW;AAAA,MACrD;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,SAAS;AACrB,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,uBAAuB,SAAS,IAAI;AAEnD,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,SAAS,WAAW;AAC7B,aAAO,QAAQ,OAAO,MAAM,OAAO,SAAS,OAAO,IAAI;AAAA,IACzD;AAEA,QAAI,CAAC,cAAc,OAAO,IAAI,GAAG;AAC/B,aAAO,QAAQ,oBAAoB,mGAA6B;AAAA,IAClE;AAEA,QAAI,CAAC,yBAAyB,OAAO,KAAK,SAAS,kBAAkB,OAAO,GAAG;AAC7E,aAAO,QAAQ,qBAAqB,wFAAkB,OAAO,IAAI;AAAA,IACnE;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,SAAS,OAAO;AAAA,MAChB,MAAM;AAAA,QACJ,aAAa,kBAAkB;AAAA,QAC/B,SAAS,OAAO,KAAK;AAAA,QACrB,cAAc,OAAO,KAAK;AAAA,QAC1B,SAAS,OAAO,KAAK,WAAW,CAAC;AAAA,QACjC,KAAK,OAAO;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,cACJ,aACA,kBACA,SAC8B;AAC9B,UAAM,kBAAkB,oBAAoB,WAAW;AACvD,QAAI,CAAC,gBAAgB,SAAS;AAC5B,aAAO;AAAA,IACT;AAEA,UAAM,oBAAoB,oBAAoB,gBAAgB;AAC9D,QAAI,CAAC,kBAAkB,SAAS;AAC9B,aAAO;AAAA,IACT;AAEA,UAAM,oBAAoB,gBAAgB,OAAO;AACjD,QAAI,CAAC,kBAAkB,SAAS;AAC9B,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,MAAM,KAAK,kBAAkB;AAClD,QAAI,CAAC,aAAa,SAAS;AACzB,aAAO;AAAA,IACT;AAEA,QAAI,kBAAkB,QAAQ,WAAW,QAAW;AAClD,YAAM,eAAe,MAAM,KAAK;AAAA,QAC9B,kBAAkB;AAAA,QAClB,kBAAkB;AAAA,MACpB;AAEA,UAAI,CAAC,aAAa,SAAS;AACzB,eAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,WAAW,MAAM;AAAA,MACrB,KAAK;AAAA,MACL;AAAA,QACE,KAAK,OAAO;AAAA,QACZ,sBAAsB,kBAAkB,WAAW;AAAA,MACrD;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,QAAQ,gBAAgB;AAAA,UACxB,cAAc,kBAAkB;AAAA,QAClC,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,SAAS;AACrB,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,uBAAuB,SAAS,IAAI;AAEnD,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,SAAS,WAAW;AAC7B,aAAO,QAAQ,OAAO,MAAM,OAAO,SAAS,OAAO,IAAI;AAAA,IACzD;AAEA,QAAI,CAAC,cAAc,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,WAAW;AACzD,aAAO,QAAQ,oBAAoB,uIAAmC;AAAA,IACxE;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,SAAS,OAAO;AAAA,MAChB,MAAM;AAAA,QACJ,aAAa,kBAAkB;AAAA,QAC/B,QAAQ,aAAa,OAAO,KAAK,UAAU,WAAW;AAAA,QACtD,KAAK,OAAO;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACF;AAOO,SAAS,uBACd,QACkB;AAClB,SAAO,IAAI,iBAAiB,MAAM;AACpC;AAEA,SAAS,cAAc,MAAoC;AACzD,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,WAAO;AAAA,EACT;AAEA,SAAO,aAAa,QAAQ,mBAAmB;AACjD;AAEA,SAAS,eAAe,IAAsC;AAC5D,MAAI,CAAC,IAAI;AACP,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL,EAAE,KAAK,CAAC,UAAU,CAAC,wBAAwB,KAAK,CAAC;AACnD;AAEA,SAAS,wBAAwB,OAAyB;AACxD,SAAO,UAAU,QAAQ,UAAU,UAAa,UAAU;AAC5D;AAEA,SAAS,0BAA0B,IAA4C;AAC7E,MAAI,CAAC,IAAI;AACP,WAAO;AAAA,EACT;AAEA,aAAW,SAAS,CAAC,GAAG,UAAU,GAAG,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG;AAC5E,QAAI,CAAC,wBAAwB,KAAK,GAAG;AACnC,aAAO,OAAO,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;","names":["z"]}