@plasius/schema 1.3.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +188 -1
- package/THIRD_PARTY_NOTICES.md +75 -0
- package/dist/chunk-6FE4FLKF.js +254 -0
- package/dist/chunk-6FE4FLKF.js.map +1 -0
- package/dist/chunk-AG2NAPDC.js +117 -0
- package/dist/chunk-AG2NAPDC.js.map +1 -0
- package/dist/chunk-UQHPDQZX.js +2606 -0
- package/dist/chunk-UQHPDQZX.js.map +1 -0
- package/dist/feedback-diagnostics-BaniQAFS.d.cts +353 -0
- package/dist/feedback-diagnostics-CnsI0B9-.d.ts +353 -0
- package/dist/feedback-diagnostics-vocabulary.cjs +156 -0
- package/dist/feedback-diagnostics-vocabulary.cjs.map +1 -0
- package/dist/feedback-diagnostics-vocabulary.d.cts +70 -0
- package/dist/feedback-diagnostics-vocabulary.d.ts +70 -0
- package/dist/feedback-diagnostics-vocabulary.js +33 -0
- package/dist/feedback-diagnostics-vocabulary.js.map +1 -0
- package/dist/feedback-diagnostics.cjs +2696 -0
- package/dist/feedback-diagnostics.cjs.map +1 -0
- package/dist/feedback-diagnostics.d.cts +2 -0
- package/dist/feedback-diagnostics.d.ts +2 -0
- package/dist/feedback-diagnostics.js +39 -0
- package/dist/feedback-diagnostics.js.map +1 -0
- package/dist/feedback-unicode-profile.cjs +283 -0
- package/dist/feedback-unicode-profile.cjs.map +1 -0
- package/dist/feedback-unicode-profile.d.cts +28 -0
- package/dist/feedback-unicode-profile.d.ts +28 -0
- package/dist/feedback-unicode-profile.js +13 -0
- package/dist/feedback-unicode-profile.js.map +1 -0
- package/dist/index.cjs +2133 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +879 -286
- package/dist/index.d.ts +879 -286
- package/dist/index.js +1516 -2300
- package/dist/index.js.map +1 -1
- package/package.json +36 -12
- package/unicode/feedback-unicode-15.1.0-unassigned.json +13 -0
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/field.builder.ts","../src/validation/email.RFC5322.ts","../src/validation/phone.E.164.ts","../src/validation/url.WHATWG.ts","../src/validation/uuid.RFC4122.ts","../src/validation/dateTime.ISO8601.ts","../src/validation/countryCode.ISO3166.ts","../src/validation/currencyCode.ISO4217.ts","../src/validation/generalText.OWASP.ts","../src/validation/version.SEMVER2.0.0.ts","../src/validation/percentage.ISO80000-1.ts","../src/validation/richtext.OWASP.ts","../src/validation/name.OWASP.ts","../src/validation/user.MS-GOOGLE-APPLE.ts","../src/validation/languageCode.BCP47.ts","../src/field.ts","../src/pii.ts","../src/schema.ts","../src/components.ts","../src/player-system-events.ts"],"sourcesContent":["export type { Infer } from \"./infer.js\";\nexport { field } from \"./field.js\";\nexport {\n createSchema,\n getSchemaForType,\n getAllSchemas,\n renderSchemaDescription,\n} from \"./schema.js\";\nexport type * from \"./types.js\";\nexport type * from \"./validation.types.js\";\nexport * from \"./components.js\";\nexport * from \"./validation/index.js\";\nexport * from \"./field.builder.js\";\nexport * from \"./player-system-events.js\";\n","type FieldType = \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\" | \"ref\";\n\nimport { type PII } from \"./pii.js\";\nimport { getSchemaForType } from \"./schema.js\";\nimport type { FieldValidator } from \"./validation.types.js\";\n\nexport type FieldExposure = \"public\" | \"internal\";\n\nfunction mergeValidatorResult(\n previousResult: ReturnType<FieldValidator>,\n nextValid: boolean,\n): ReturnType<FieldValidator> {\n if (previousResult !== true) {\n return previousResult;\n }\n\n return nextValid;\n}\n\nexport class FieldBuilder<TExternal = unknown, TInternal = TExternal> {\n _type!: TExternal;\n _storageType!: TInternal;\n isSystem = false;\n isImmutable = false;\n isRequired = true;\n _validator?: FieldValidator<TInternal>;\n _description: string = \"\";\n _version: string = \"1.0.0\";\n _default?: TInternal | (() => TInternal);\n _upgrade?: (\n value: any,\n ctx: {\n entityFrom: string;\n entityTo: string;\n fieldTo: string;\n fieldName: string;\n }\n ) => { ok: boolean; value?: any; error?: string };\n _shape?: Record<string, FieldBuilder<any>>;\n itemType?: FieldBuilder<any>;\n refType?: string;\n _pii: PII = {\n classification: \"none\",\n action: \"none\",\n logHandling: \"plain\",\n purpose: \"an ordinary value\",\n };\n _exposure: FieldExposure = \"public\";\n enumValues?: readonly TInternal[];\n\n constructor(\n public type: FieldType,\n options: {\n shape?: Record<string, FieldBuilder<any>>;\n itemType?: FieldBuilder<any>;\n refType?: string;\n } = {}\n ) {\n this._shape = options.shape;\n this.itemType = options.itemType;\n this.refType = options.refType;\n }\n\n immutable(): FieldBuilder<TExternal, TInternal> {\n this.isImmutable = true;\n return this;\n }\n\n system(): FieldBuilder<TExternal, TInternal> {\n this.isSystem = true;\n return this;\n }\n\n exposure(exposure: FieldExposure): FieldBuilder<TExternal, TInternal> {\n this._exposure = exposure;\n return this;\n }\n\n internal(): FieldBuilder<TExternal, TInternal> {\n return this.exposure(\"internal\");\n }\n\n public(): FieldBuilder<TExternal, TInternal> {\n return this.exposure(\"public\");\n }\n\n required(): FieldBuilder<TExternal, TInternal> {\n this.isRequired = true;\n return this;\n }\n\n optional(): FieldBuilder<TExternal, TInternal> {\n this.isRequired = false;\n return this;\n }\n\n validator(\n fn: FieldValidator<TInternal>\n ): FieldBuilder<TExternal, TInternal> {\n this._validator = fn;\n return this;\n }\n\n description(desc: string): FieldBuilder<TExternal, TInternal> {\n this._description = desc;\n return this;\n }\n\n default(\n value: TInternal | (() => TInternal)\n ): FieldBuilder<TExternal, TInternal> {\n this._default = value;\n // Supplying a default implies the value may be omitted at input time.\n // Do not couple defaulting with validation.\n this.isRequired = false;\n return this;\n }\n\n /**\n * Configure an upgrader used when validating older entities against a newer schema.\n * The upgrader receives the current field value and version context, and should\n * return { ok: true, value } with the upgraded value, or { ok: false, error }.\n */\n upgrade(\n fn: (\n value: any,\n ctx: {\n entityFrom: string;\n entityTo: string;\n fieldTo: string;\n fieldName: string;\n }\n ) => { ok: boolean; value?: any; error?: string }\n ): FieldBuilder<TExternal, TInternal> {\n this._upgrade = fn;\n return this;\n }\n\n getDefault(): TInternal | undefined {\n const v = this._default;\n return typeof v === \"function\" ? (v as () => TInternal)() : v;\n }\n\n version(ver: string): FieldBuilder<TExternal, TInternal> {\n this._version = ver;\n return this;\n }\n\n /// PID informs the schema PII handling of the manner in\n /// which to handle data relating to this field.\n PID(pii: PII): FieldBuilder<TExternal, TInternal> {\n this._pii = pii;\n return this;\n }\n\n min(min: number): FieldBuilder<TExternal, TInternal> {\n if (this.type === \"number\") {\n const prevValidator = this._validator;\n this._validator = (value: any) => {\n const valid = typeof value === \"number\" && value >= min;\n return prevValidator ? mergeValidatorResult(prevValidator(value), valid) : valid;\n };\n } else if (this.type === \"string\") {\n const prevValidator = this._validator;\n this._validator = (value: any) => {\n const valid = typeof value === \"string\" && value.length >= min;\n return prevValidator ? mergeValidatorResult(prevValidator(value), valid) : valid;\n };\n } else if (this.type === \"array\") {\n const prevValidator = this._validator;\n this._validator = (value: any) => {\n const valid = Array.isArray(value) && value.length >= min;\n return prevValidator ? mergeValidatorResult(prevValidator(value), valid) : valid;\n };\n } else {\n throw new Error(\n \"Min is only supported on number, string, or array fields.\"\n );\n }\n return this;\n }\n\n max(max: number): FieldBuilder<TExternal, TInternal> {\n if (this.type === \"number\") {\n const prevValidator = this._validator;\n this._validator = (value: any) => {\n const valid = typeof value === \"number\" && value <= max;\n return prevValidator ? mergeValidatorResult(prevValidator(value), valid) : valid;\n };\n } else if (this.type === \"string\") {\n const prevValidator = this._validator;\n this._validator = (value: any) => {\n const valid = typeof value === \"string\" && value.length <= max;\n return prevValidator ? mergeValidatorResult(prevValidator(value), valid) : valid;\n };\n } else if (this.type === \"array\") {\n const prevValidator = this._validator;\n this._validator = (value: any) => {\n const valid = Array.isArray(value) && value.length <= max;\n return prevValidator ? mergeValidatorResult(prevValidator(value), valid) : valid;\n };\n } else {\n throw new Error(\n \"Max is only supported on number, string, or array fields.\"\n );\n }\n return this;\n }\n\n pattern(regex: RegExp): FieldBuilder<TExternal, TInternal> {\n if (this.type !== \"string\") {\n throw new Error(\"Pattern is only supported on string fields.\");\n }\n const prevValidator = this._validator;\n this._validator = (value: any) => {\n const valid = typeof value === \"string\" && regex.test(value);\n return prevValidator ? mergeValidatorResult(prevValidator(value), valid) : valid;\n };\n return this;\n }\n\n enum<const U extends readonly TInternal[]>(\n values: U\n ): FieldBuilder<U[number]> {\n if (\n this.type !== \"string\" &&\n this.type !== \"number\" &&\n !(\n this.type === \"array\" &&\n (this.itemType?.type === \"string\" || this.itemType?.type === \"number\")\n )\n ) {\n throw new Error(\n \"Enums are only supported on string or number fields or arrays of strings or numbers.\"\n );\n }\n this.enumValues = values;\n return this as any;\n }\n\n /**\n * Create a shallow clone with a different external type parameter.\n * Note: shape and itemType are passed by reference (shallow). If you need\n * deep isolation of nested FieldBuilders, clone them explicitly.\n */\n as<U>(): FieldBuilder<U, TInternal> {\n const clone = new FieldBuilder<U, TInternal>(this.type, {\n shape: this._shape,\n itemType: this.itemType,\n refType: this.refType,\n });\n clone.enumValues = this.enumValues;\n clone.isImmutable = this.isImmutable;\n clone.isSystem = this.isSystem;\n clone.isRequired = this.isRequired;\n clone._description = this._description;\n clone._version = this._version;\n clone._pii = this._pii;\n clone._exposure = this._exposure;\n clone._validator = this._validator as any;\n clone._default = this._default as any;\n clone._upgrade = this._upgrade;\n // refType already provided in constructor options above\n return clone;\n }\n}\n\nexport default FieldBuilder;\n","/**\n * Validates the package's pragmatic dot-domain mailbox subset.\n *\n * This intentionally does not claim full RFC 5322 mailbox support (for\n * example, quoted local parts and address literals are outside the product\n * contract). The legacy filename is retained for import compatibility.\n */\nexport const validateEmail = (value: unknown): boolean => {\n if (typeof value !== \"string\") return false;\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(value);\n};\n","/**\n * Validates a phone number string in strict E.164 format.\n * Returns true for strings like \"+441632960960\" (max 15 digits, starting with a '+').\n */\nexport const validatePhone = (value: unknown): boolean => {\n if (typeof value !== \"string\") return false;\n const phoneRegex = /^\\+[1-9]\\d{1,14}$/; // E.164 format\n return phoneRegex.test(value);\n};\n","/**\n * Validates a URL string using the WHATWG URL API.\n * Accepts only 'http' or 'https' protocols.\n * Returns true if the URL is syntactically valid.\n */\nexport const validateUrl = (value: unknown): boolean => {\n if (typeof value !== \"string\") return false;\n try {\n const url = new URL(value);\n // Enforce scheme:\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") return false;\n return true;\n } catch {\n return false;\n }\n};\n","/** \n * Validates the RFC 9562 UUID text format, including versions 1-8 plus Nil and\n * Max UUIDs. The legacy filename is retained for import compatibility.\n */ \nexport const validateUUID = (value: unknown): boolean => {\n if (typeof value !== \"string\") return false;\n const standard = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n return standard.test(value)\n || value.toLowerCase() === \"00000000-0000-0000-0000-000000000000\"\n || value.toLowerCase() === \"ffffffff-ffff-ffff-ffff-ffffffffffff\";\n};\n","/**\n * Validates whether a string is a properly formatted ISO 8601 datetime, date, or time.\n * \n * @param value - The value to validate.\n * @param options - Optional settings for validation mode.\n * @param options.mode - The mode of validation:\n * - \"datetime\" (default): Checks full ISO 8601 datetime and equality with toISOString().\n * - \"date\": Validates that the string is in YYYY-MM-DD format and represents a valid date.\n * - \"time\": Validates that the string matches a valid HH:MM:SS(.sss)?Z? ISO 8601 time pattern.\n * @returns True if the value is valid according to the specified mode; otherwise, false.\n */\nexport const validateDateTimeISO = (\n value: unknown,\n options?: { mode?: \"datetime\" | \"date\" | \"time\" }\n): boolean => {\n const mode = options?.mode ?? \"datetime\";\n\n if (typeof value !== \"string\") return false;\n\n if (mode === \"datetime\") {\n // Strict ISO 8601 date-time: YYYY-MM-DDTHH:mm:ss(.fraction)?(Z|±HH:MM)\n const isoDateTimeRegex =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,9})?(?:Z|[+-]\\d{2}:\\d{2})$/;\n\n if (!isoDateTimeRegex.test(value)) return false;\n\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return false;\n\n // We purposely do NOT require `value === date.toISOString()` because\n // valid ISO8601 inputs may include offsets (e.g., \"+01:00\") or omit\n // milliseconds, both of which produce a different canonical ISO string.\n // The regex ensures strict shape; Date parsing ensures it is a real moment.\n return true;\n }\n\n if (mode === \"date\") {\n // YYYY-MM-DD format\n const dateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\n if (!dateRegex.test(value)) return false;\n const date = new Date(value);\n if (isNaN(date.getTime())) return false;\n // Ensure the date parts match exactly (to avoid 2023-02-30 being accepted)\n const [year, month, day] = value.split(\"-\").map(Number);\n return (\n date.getUTCFullYear() === year &&\n date.getUTCMonth() + 1 === month &&\n date.getUTCDate() === day\n );\n }\n\n if (mode === \"time\") {\n // HH:MM:SS(.sss)?Z?\n // Hours: 00-23, Minutes: 00-59, Seconds: 00-59, optional fractional seconds, optional Z\n const timeRegex = /^([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(\\.\\d+)?Z?$/;\n return timeRegex.test(value);\n }\n\n return false;\n};\n","export const isoCountryCodes = new Set([\n \"AD\",\n \"AE\",\n \"AF\",\n \"AG\",\n \"AI\",\n \"AL\",\n \"AM\",\n \"AO\",\n \"AQ\",\n \"AR\",\n \"AS\",\n \"AT\",\n \"AU\",\n \"AW\",\n \"AX\",\n \"AZ\",\n \"BA\",\n \"BB\",\n \"BD\",\n \"BE\",\n \"BF\",\n \"BG\",\n \"BH\",\n \"BI\",\n \"BJ\",\n \"BL\",\n \"BM\",\n \"BN\",\n \"BO\",\n \"BQ\",\n \"BR\",\n \"BS\",\n \"BT\",\n \"BV\",\n \"BW\",\n \"BY\",\n \"BZ\",\n \"CA\",\n \"CC\",\n \"CD\",\n \"CF\",\n \"CG\",\n \"CH\",\n \"CI\",\n \"CK\",\n \"CL\",\n \"CM\",\n \"CN\",\n \"CO\",\n \"CR\",\n \"CU\",\n \"CV\",\n \"CW\",\n \"CX\",\n \"CY\",\n \"CZ\",\n \"DE\",\n \"DJ\",\n \"DK\",\n \"DM\",\n \"DO\",\n \"DZ\",\n \"EC\",\n \"EE\",\n \"EG\",\n \"EH\",\n \"ER\",\n \"ES\",\n \"ET\",\n \"FI\",\n \"FJ\",\n \"FM\",\n \"FO\",\n \"FR\",\n \"GA\",\n \"GB\",\n \"GD\",\n \"GE\",\n \"GF\",\n \"GG\",\n \"GH\",\n \"GI\",\n \"GL\",\n \"GM\",\n \"GN\",\n \"GP\",\n \"GQ\",\n \"GR\",\n \"GT\",\n \"GU\",\n \"GW\",\n \"GY\",\n \"HK\",\n \"HM\",\n \"HN\",\n \"HR\",\n \"HT\",\n \"HU\",\n \"ID\",\n \"IE\",\n \"IL\",\n \"IM\",\n \"IN\",\n \"IO\",\n \"IQ\",\n \"IR\",\n \"IS\",\n \"IT\",\n \"JE\",\n \"JM\",\n \"JO\",\n \"JP\",\n \"KE\",\n \"KG\",\n \"KH\",\n \"KI\",\n \"KM\",\n \"KN\",\n \"KP\",\n \"KR\",\n \"KW\",\n \"KY\",\n \"KZ\",\n \"LA\",\n \"LB\",\n \"LC\",\n \"LI\",\n \"LK\",\n \"LR\",\n \"LS\",\n \"LT\",\n \"LU\",\n \"LV\",\n \"LY\",\n \"MA\",\n \"MC\",\n \"MD\",\n \"ME\",\n \"MF\",\n \"MG\",\n \"MH\",\n \"MK\",\n \"ML\",\n \"MM\",\n \"MN\",\n \"MO\",\n \"MP\",\n \"MQ\",\n \"MR\",\n \"MS\",\n \"MT\",\n \"MU\",\n \"MV\",\n \"MW\",\n \"MX\",\n \"MY\",\n \"MZ\",\n \"NA\",\n \"NC\",\n \"NE\",\n \"NF\",\n \"NG\",\n \"NI\",\n \"NL\",\n \"NO\",\n \"NP\",\n \"NR\",\n \"NU\",\n \"NZ\",\n \"OM\",\n \"PA\",\n \"PE\",\n \"PF\",\n \"PG\",\n \"PH\",\n \"PK\",\n \"PL\",\n \"PM\",\n \"PN\",\n \"PR\",\n \"PS\",\n \"PT\",\n \"PW\",\n \"PY\",\n \"QA\",\n \"RE\",\n \"RO\",\n \"RS\",\n \"RU\",\n \"RW\",\n \"SA\",\n \"SB\",\n \"SC\",\n \"SD\",\n \"SE\",\n \"SG\",\n \"SH\",\n \"SI\",\n \"SJ\",\n \"SK\",\n \"SL\",\n \"SM\",\n \"SN\",\n \"SO\",\n \"SR\",\n \"SS\",\n \"ST\",\n \"SV\",\n \"SX\",\n \"SY\",\n \"SZ\",\n \"TC\",\n \"TD\",\n \"TF\",\n \"TG\",\n \"TH\",\n \"TJ\",\n \"TK\",\n \"TL\",\n \"TM\",\n \"TN\",\n \"TO\",\n \"TR\",\n \"TT\",\n \"TV\",\n \"TZ\",\n \"UA\",\n \"UG\",\n \"UM\",\n \"US\",\n \"UY\",\n \"UZ\",\n \"VA\",\n \"VC\",\n \"VE\",\n \"VG\",\n \"VI\",\n \"VN\",\n \"VU\",\n \"WF\",\n \"WS\",\n \"YE\",\n \"YT\",\n \"ZA\",\n \"ZM\",\n \"ZW\",\n]);\n\n/**\n * Validates whether a string is a valid ISO 3166-1 alpha-2 country code. \n * Performs a case-insensitive lookup against a predefined set of known codes.\n */\nexport const validateCountryCode = (value: unknown): boolean => {\n if (typeof value !== \"string\") return false;\n return isoCountryCodes.has(value.toUpperCase());\n};\n","export const isoCurrencyCodes = new Set([\n \"AED\",\n \"AFN\",\n \"ALL\",\n \"AMD\",\n \"ANG\",\n \"AOA\",\n \"ARS\",\n \"AUD\",\n \"AWG\",\n \"AZN\",\n \"BAM\",\n \"BBD\",\n \"BDT\",\n \"BGN\",\n \"BHD\",\n \"BIF\",\n \"BMD\",\n \"BND\",\n \"BOB\",\n \"BOV\",\n \"BRL\",\n \"BSD\",\n \"BTN\",\n \"BWP\",\n \"BYN\",\n \"BZD\",\n \"CAD\",\n \"CDF\",\n \"CHE\",\n \"CHF\",\n \"CHW\",\n \"CLF\",\n \"CLP\",\n \"CNY\",\n \"COP\",\n \"COU\",\n \"CRC\",\n \"CUC\",\n \"CUP\",\n \"CVE\",\n \"CZK\",\n \"DJF\",\n \"DKK\",\n \"DOP\",\n \"DZD\",\n \"EGP\",\n \"ERN\",\n \"ETB\",\n \"EUR\",\n \"FJD\",\n \"FKP\",\n \"GBP\",\n \"GEL\",\n \"GHS\",\n \"GIP\",\n \"GMD\",\n \"GNF\",\n \"GTQ\",\n \"GYD\",\n \"HKD\",\n \"HNL\",\n \"HRK\",\n \"HTG\",\n \"HUF\",\n \"IDR\",\n \"ILS\",\n \"INR\",\n \"IQD\",\n \"IRR\",\n \"ISK\",\n \"JMD\",\n \"JOD\",\n \"JPY\",\n \"KES\",\n \"KGS\",\n \"KHR\",\n \"KMF\",\n \"KPW\",\n \"KRW\",\n \"KWD\",\n \"KYD\",\n \"KZT\",\n \"LAK\",\n \"LBP\",\n \"LKR\",\n \"LRD\",\n \"LSL\",\n \"LYD\",\n \"MAD\",\n \"MDL\",\n \"MGA\",\n \"MKD\",\n \"MMK\",\n \"MNT\",\n \"MOP\",\n \"MRU\",\n \"MUR\",\n \"MVR\",\n \"MWK\",\n \"MXN\",\n \"MXV\",\n \"MYR\",\n \"MZN\",\n \"NAD\",\n \"NGN\",\n \"NIO\",\n \"NOK\",\n \"NPR\",\n \"NZD\",\n \"OMR\",\n \"PAB\",\n \"PEN\",\n \"PGK\",\n \"PHP\",\n \"PKR\",\n \"PLN\",\n \"PYG\",\n \"QAR\",\n \"RON\",\n \"RSD\",\n \"RUB\",\n \"RWF\",\n \"SAR\",\n \"SBD\",\n \"SCR\",\n \"SDG\",\n \"SEK\",\n \"SGD\",\n \"SHP\",\n \"SLE\",\n \"SLL\",\n \"SOS\",\n \"SRD\",\n \"SSP\",\n \"STN\",\n \"SVC\",\n \"SYP\",\n \"SZL\",\n \"THB\",\n \"TJS\",\n \"TMT\",\n \"TND\",\n \"TOP\",\n \"TRY\",\n \"TTD\",\n \"TWD\",\n \"TZS\",\n \"UAH\",\n \"UGX\",\n \"USD\",\n \"USN\",\n \"UYI\",\n \"UYU\",\n \"UYW\",\n \"UZS\",\n \"VES\",\n \"VND\",\n \"VUV\",\n \"WST\",\n \"XAF\",\n \"XAG\",\n \"XAU\",\n \"XBA\",\n \"XBB\",\n \"XBC\",\n \"XBD\",\n \"XCD\",\n \"XDR\",\n \"XOF\",\n \"XPD\",\n \"XPF\",\n \"XPT\",\n \"XSU\",\n \"XTS\",\n \"XUA\",\n \"XXX\",\n \"YER\",\n \"ZAR\",\n \"ZMW\",\n \"ZWL\",\n]);\n\n\n/** \n * Validates whether a string is a valid ISO 4217 currency code. \n * Performs a case-insensitive lookup against a predefined set of known codes.\n */\nexport const validateCurrencyCode = (value: unknown): boolean => {\n if (typeof value !== \"string\") return false;\n return isoCurrencyCodes.has(value.toUpperCase());\n};\n","/**\n * Validates that a text field is safe for storage (per OWASP guidelines).\n * Applies to general text fields: names, descriptions, titles, etc.\n * Global Standard: OWASP Input Validation Cheat Sheet (2024)\n */\nexport function validateSafeText(value: unknown): boolean {\n if (typeof value !== \"string\") return false;\n\n // Trimmed version should not be empty\n const trimmed = value.trim();\n if (trimmed.length === 0) return false;\n\n // Reject control chars\n for (let i = 0; i < trimmed.length; i++) {\n const code = trimmed.codePointAt(i);\n if (code !== undefined && (code >= 0x00 && code <= 0x1F || code === 0x7F)) {\n return false;\n }\n }\n\n // Reject dangerous characters\n if (/['\"<>\\\\{}();]/.test(trimmed)) return false;\n\n // Reject SQL-style injection patterns\n if (\n /(--|\\b(SELECT|UPDATE|DELETE|INSERT|DROP|ALTER|EXEC|UNION|GRANT|REVOKE)\\b|\\/\\*|\\*\\/|@@)/i.test(\n trimmed\n )\n )\n return false;\n\n // Reject null char\n if (trimmed.includes(\"\\u0000\")) return false;\n\n // Optional: limit length\n if (trimmed.length > 1024) return false;\n\n return true;\n}\n","/**\n * Validates that a version string conforms to Semantic Versioning (SemVer 2.0.0).\n * Global Standard: https://semver.org/\n */\nexport function validateSemVer(value: unknown): boolean {\n if (typeof value !== \"string\") return false;\n return /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/.test(\n value\n );\n}\n","/**\n * Validates that a number is a percentage value (0 to 100 inclusive).\n * Global Standard: ISO 80000-1 percentage definition.\n */\nexport function validatePercentage(value: unknown): boolean {\n if (typeof value !== \"number\") return false;\n return value >= 0 && value <= 100;\n}\n","/**\n * Validates rich text input to ensure it contains only safe HTML/Markdown.\n * Global Standard: OWASP HTML Sanitization Guidelines (2024).\n * This validator checks for dangerous patterns — does not sanitize — assumes text will be sanitized downstream.\n */\nexport function validateRichText(value: unknown): boolean {\n if (typeof value !== \"string\") return false;\n const trimmed = value.trim();\n if (trimmed.length === 0) return true; // Allow empty rich text\n\n // Reject known dangerous tags\n if (\n /<(script|iframe|object|embed|style|link|meta|base|form|input|button|textarea|select)\\b/i.test(\n trimmed\n )\n ) {\n return false;\n }\n\n // Reject javascript: links\n if (/javascript:/i.test(trimmed)) {\n return false;\n }\n\n // Reject event handlers (onload, onclick, etc)\n if (/on\\w+=[\"']?/i.test(trimmed)) {\n return false;\n }\n\n // Optionally: limit max length (e.g. 10,000 chars)\n if (trimmed.length > 10000) return false;\n\n return true;\n}\n","/**\n * Validates that a name is safe, culturally inclusive, and matches global best practice.\n * Global Standard: OWASP Input Validation Cheat Sheet + ICAO Doc 9303 + IETF PRECIS\n */\nexport function validateName(value: unknown): boolean {\n if (typeof value !== \"string\") return false;\n\n const trimmed = value.trim();\n if (trimmed.length === 0) return false;\n\n // Limit length (ISO guidance: max 256 is typical)\n if (trimmed.length > 256) return false;\n\n // Reject ASCII control chars (U+0000–U+001F and U+007F)\n for (const ch of trimmed) {\n const cp = ch.codePointAt(0)!;\n if ((cp >= 0x00 && cp <= 0x1F) || cp === 0x7F) return false;\n }\n\n // Core pattern\n const namePattern = /^[\\p{L}\\p{M}'\\-. ]+$/u;\n if (!namePattern.test(trimmed)) return false;\n\n return true;\n}\n","/**\n * Validates that a user ID is a valid `sub` from one of the supported identity providers.\n * Global Standard: OpenID Connect Core 1.0 `sub` claim.\n */\nexport function validateUserId(value: unknown): boolean {\n if (typeof value !== \"string\") return false;\n\n const trimmed = value.trim();\n if (trimmed.length === 0) return false;\n\n // Google: all digits\n const googlePattern = /^\\d{21,22}$/;\n\n // Microsoft: UUID v4\n const microsoftPattern =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n // Apple: opaque, usually UUID but allow any printable string up to 255 chars\n const applePattern = /^[\\w\\-.]{6,255}$/; // Alphanumeric + - . _ (common safe characters)\n\n return (\n googlePattern.test(trimmed) ||\n microsoftPattern.test(trimmed) ||\n applePattern.test(trimmed)\n );\n}\n\nexport function validateUserIdArray(value: unknown): boolean {\n if (!Array.isArray(value)) return false;\n return value.every(validateUserId);\n}","/**\n * ISO 639-1 language codes (two-letter).\n * Tip: Keep this list as source of truth for supported languages in your app.\n */\nexport enum IsoLanguageCode {\n Afar = \"aa\",\n Abkhazian = \"ab\",\n Afrikaans = \"af\",\n Akan = \"ak\",\n Albanian = \"sq\",\n Amharic = \"am\",\n Arabic = \"ar\",\n Aragonese = \"an\",\n Armenian = \"hy\",\n Assamese = \"as\",\n Avaric = \"av\",\n Aymara = \"ay\",\n Azerbaijani = \"az\",\n Bashkir = \"ba\",\n Bambara = \"bm\",\n Basque = \"eu\",\n Belarusian = \"be\",\n Bengali = \"bn\",\n Bislama = \"bi\",\n Bosnian = \"bs\",\n Breton = \"br\",\n Bulgarian = \"bg\",\n Burmese = \"my\",\n Catalan = \"ca\",\n Chamorro = \"ch\",\n Chechen = \"ce\",\n Chinese = \"zh\",\n ChurchSlavic = \"cu\",\n Chuvash = \"cv\",\n Cornish = \"kw\",\n Corsican = \"co\",\n Cree = \"cr\",\n Croatian = \"hr\",\n Czech = \"cs\",\n Danish = \"da\",\n Divehi = \"dv\",\n Dutch = \"nl\",\n Dzongkha = \"dz\",\n English = \"en\",\n Esperanto = \"eo\",\n Estonian = \"et\",\n Ewe = \"ee\",\n Faroese = \"fo\",\n Fijian = \"fj\",\n Finnish = \"fi\",\n French = \"fr\",\n WesternFrisian = \"fy\",\n Fulah = \"ff\",\n Gaelic = \"gd\",\n Galician = \"gl\",\n Ganda = \"lg\",\n Georgian = \"ka\",\n German = \"de\",\n Greek = \"el\",\n Kalaallisut = \"kl\",\n Guarani = \"gn\",\n Gujarati = \"gu\",\n Haitian = \"ht\",\n Hausa = \"ha\",\n Hebrew = \"he\",\n Herero = \"hz\",\n Hindi = \"hi\",\n HiriMotu = \"ho\",\n Hungarian = \"hu\",\n Icelandic = \"is\",\n Ido = \"io\",\n Igbo = \"ig\",\n Indonesian = \"id\",\n Interlingua = \"ia\",\n Interlingue = \"ie\",\n Inuktitut = \"iu\",\n Inupiaq = \"ik\",\n Irish = \"ga\",\n Italian = \"it\",\n Japanese = \"ja\",\n Javanese = \"jv\",\n Kannada = \"kn\",\n Kanuri = \"kr\",\n Kashmiri = \"ks\",\n Kazakh = \"kk\",\n CentralKhmer = \"km\",\n Kikuyu = \"ki\",\n Kinyarwanda = \"rw\",\n Kyrgyz = \"ky\",\n Komi = \"kv\",\n Kongo = \"kg\",\n Korean = \"ko\",\n Kuanyama = \"kj\",\n Kurdish = \"ku\",\n Lao = \"lo\",\n Latin = \"la\",\n Latvian = \"lv\",\n Limburgan = \"li\",\n Lingala = \"ln\",\n Lithuanian = \"lt\",\n LubaKatanga = \"lu\",\n Luxembourgish = \"lb\",\n Macedonian = \"mk\",\n Malagasy = \"mg\",\n Malay = \"ms\",\n Malayalam = \"ml\",\n Maltese = \"mt\",\n Manx = \"gv\",\n Maori = \"mi\",\n Marathi = \"mr\",\n Marshallese = \"mh\",\n Mongolian = \"mn\",\n Nauru = \"na\",\n Navajo = \"nv\",\n NorthNdebele = \"nd\",\n SouthNdebele = \"nr\",\n Ndonga = \"ng\",\n Nepali = \"ne\",\n Norwegian = \"no\",\n NorwegianBokmal = \"nb\",\n NorwegianNynorsk = \"nn\",\n SichuanYi = \"ii\",\n Occitan = \"oc\",\n Ojibwa = \"oj\",\n Oriya = \"or\",\n Oromo = \"om\",\n Ossetian = \"os\",\n Pali = \"pi\",\n Pashto = \"ps\",\n Persian = \"fa\",\n Polish = \"pl\",\n Portuguese = \"pt\",\n Punjabi = \"pa\",\n Quechua = \"qu\",\n Romansh = \"rm\",\n Romanian = \"ro\",\n Rundi = \"rn\",\n Russian = \"ru\",\n Samoan = \"sm\",\n Sango = \"sg\",\n Sanskrit = \"sa\",\n Sardinian = \"sc\",\n Serbian = \"sr\",\n Shona = \"sn\",\n Sindhi = \"sd\",\n Sinhala = \"si\",\n Slovak = \"sk\",\n Slovenian = \"sl\",\n Somali = \"so\",\n SouthernSotho = \"st\",\n Spanish = \"es\",\n Sundanese = \"su\",\n Swahili = \"sw\",\n Swati = \"ss\",\n Swedish = \"sv\",\n Tagalog = \"tl\",\n Tahitian = \"ty\",\n Tajik = \"tg\",\n Tamil = \"ta\",\n Tatar = \"tt\",\n Telugu = \"te\",\n Thai = \"th\",\n Tibetan = \"bo\",\n Tigrinya = \"ti\",\n Tonga = \"to\",\n Tsonga = \"ts\",\n Tswana = \"tn\",\n Turkish = \"tr\",\n Turkmen = \"tk\",\n Twi = \"tw\",\n Uighur = \"ug\",\n Ukrainian = \"uk\",\n Urdu = \"ur\",\n Uzbek = \"uz\",\n Venda = \"ve\",\n Vietnamese = \"vi\",\n Volapuk = \"vo\",\n Walloon = \"wa\",\n Welsh = \"cy\",\n Wolof = \"wo\",\n Xhosa = \"xh\",\n Yiddish = \"yi\",\n Yoruba = \"yo\",\n Zhuang = \"za\",\n Zulu = \"zu\",\n}\n\n/** Fast lookup set for enum values (lowercase 2-letter codes). */\nconst ISO_LANGUAGE_SET: ReadonlySet<string> = new Set<string>(\n Object.values(IsoLanguageCode)\n);\n\n/** Type guard: primary language must be one of the enum values. */\nexport function isIsoLanguageCode(value: unknown): value is IsoLanguageCode {\n return typeof value === \"string\" && ISO_LANGUAGE_SET.has(value.toLowerCase());\n}\n\n/**\n * Region validator per BCP 47:\n * - ISO 3166-1 alpha-2: 2 uppercase letters (e.g., GB, US)\n * - UN M.49 numeric: 3 digits (e.g., 419 for Latin America)\n *\n * NOTE: This validates *shape* not membership against the 3166 list.\n * If you want hard membership, we can add a Set of all alpha-2 regions.\n */\nexport function isRegionSubtag(value: string): boolean {\n return /^[A-Za-z]{2}$/.test(value) || /^\\d{3}$/.test(value);\n}\n\n/** Script subtag per ISO 15924: one capital + three lowercase (e.g., Latn, Cyrl, Hans). */\nexport function isScriptSubtag(value: string): boolean {\n return /^[A-Za-z]{4}$/.test(value);\n}\n\n/** Variant subtag per BCP 47: 5–8 alnum, or 4 starting with a digit. */\nexport function isVariantSubtag(value: string): boolean {\n return /^([0-9][A-Za-z0-9]{3}|[A-Za-z0-9]{5,8})$/.test(value);\n}\n\n/** Extension sequence: singleton (alnum except 'x') + one or more 2–8 alnum subtags. */\nexport function isExtensionSingleton(value: string): boolean {\n return /^[0-9A-WY-Za-wy-z]$/.test(value); // any alnum except 'x' (private-use)\n}\nexport function isExtensionSubtag(value: string): boolean {\n return /^[A-Za-z0-9]{2,8}$/.test(value);\n}\n\n/** Private-use subtag: 'x' then one or more 1–8 alnum subtags. */\nexport function isPrivateUseSingleton(value: string): boolean {\n return value.toLowerCase() === \"x\";\n}\nexport function isPrivateUseSubtag(value: string): boolean {\n return /^[A-Za-z0-9]{1,8}$/.test(value);\n}\n\n/**\n * Validates:\n * - plain language: \"en\"\n * - language + region: \"en-GB\"\n * - language + script + region: \"sr-Cyrl-RS\"\n * - language + variants: \"sl-rozaj-biske\", \"de-CH-1996\"\n * - extensions: \"en-GB-u-ca-gregory\"\n * - private-use: \"en-x-klingon\" or just \"x-piglatin\"\n *\n * Returns true only if the primary language is in IsoLanguageCode\n * and the rest of the tag conforms to BCP 47 structure.\n */\nexport function validateLanguage(value: unknown): boolean {\n if (typeof value !== \"string\" || value.length === 0) return false;\n\n const parts = value.split(\"-\");\n if (parts.some(part => part.length === 0)) return false;\n const lowerTag = value.toLowerCase();\n if (GRANDFATHERED_TAGS.has(lowerTag)) return true;\n if (parts[0]?.toLowerCase() === \"x\") {\n return parts.length > 1 && parts.slice(1).every(isPrivateUseSubtag);\n }\n let i = 0;\n\n // Supported RFC 5646 §2.2.1 subset: registered ISO 639-1 primaries and\n // three-letter primary shapes. Longer registered primaries require an IANA\n // registry dependency and are deliberately not claimed by this validator.\n const lang = parts[i];\n if (!lang || !/^[A-Za-z]{2,3}$/.test(lang)) return false;\n if (lang.length === 2 && !isIsoLanguageCode(lang)) return false;\n i += 1;\n\n // Up to three extlang subtags may follow a 2-3 letter primary.\n if (lang.length <= 3) {\n let extlangCount = 0;\n while (i < parts.length && extlangCount < 3 && /^[A-Za-z]{3}$/.test(parts[i]!)) {\n i += 1;\n extlangCount += 1;\n }\n }\n\n // 2) optional script\n if (i < parts.length && isScriptSubtag(parts[i] as string)) {\n i += 1;\n }\n\n // 3) optional region\n if (i < parts.length && isRegionSubtag((parts[i] as string).toUpperCase())) {\n // region must be uppercase if alpha; we normalize for check only\n i += 1;\n }\n\n // 4) zero or more variants\n const variants = new Set<string>();\n while (i < parts.length && isVariantSubtag((parts[i] as string))) {\n const variant = parts[i]!.toLowerCase();\n if (variants.has(variant)) return false;\n variants.add(variant);\n i += 1;\n }\n\n // 5) zero or more extensions\n // extension = singleton ; 2–8 ; ( ; 2–8 )*\n const extensionSingletons = new Set<string>();\n while (i < parts.length && isExtensionSingleton((parts[i] as string))) {\n const singleton = parts[i]!.toLowerCase();\n if (extensionSingletons.has(singleton)) return false;\n extensionSingletons.add(singleton);\n i += 1;\n // must have at least one following subtag of length 2–8\n if (!(i < parts.length && isExtensionSubtag(parts[i]!))) return false;\n while (i < parts.length && isExtensionSubtag(parts[i]!)) {\n i += 1;\n }\n }\n\n // 6) optional private-use: 'x' 1*('-' (1*8alnum))\n if (i < parts.length && isPrivateUseSingleton(parts[i]!)) {\n i += 1;\n if (!(i < parts.length && isPrivateUseSubtag(parts[i]!))) return false;\n while (i < parts.length && isPrivateUseSubtag(parts[i]!)) {\n i += 1;\n }\n }\n\n // no leftovers\n return i === parts.length;\n}\n\n/** RFC 5646 §2.1 grandfathered tags, matched case-insensitively. */\nconst GRANDFATHERED_TAGS: ReadonlySet<string> = new Set([\n \"art-lojban\", \"cel-gaulish\", \"en-gb-oed\", \"i-ami\", \"i-bnn\", \"i-default\",\n \"i-enochian\", \"i-hak\", \"i-klingon\", \"i-lux\", \"i-mingo\", \"i-navajo\",\n \"i-pwn\", \"i-tao\", \"i-tay\", \"i-tsu\", \"no-bok\", \"no-nyn\", \"sgn-be-fr\",\n \"sgn-be-nl\", \"sgn-ch-de\", \"zh-guoyu\", \"zh-hakka\", \"zh-min\", \"zh-min-nan\",\n \"zh-xiang\",\n]);\n","import { version } from \"os\";\nimport { FieldBuilder } from \"./field.builder.js\";\nimport { Infer } from \"./infer.js\";\nimport { SchemaShape } from \"./types.js\";\nimport {\n validateCountryCode,\n validateDateTimeISO,\n validateEmail,\n validatePhone,\n validateRichText,\n validateSafeText,\n validateSemVer,\n validateUrl,\n validateUUID,\n} from \"./validation/index.js\";\nimport { validateLanguage } from \"./validation/languageCode.BCP47.js\";\n\nexport const field = {\n string: () => new FieldBuilder<string>(\"string\"),\n number: () => new FieldBuilder<number>(\"number\"),\n boolean: () => new FieldBuilder<boolean>(\"boolean\"),\n object: <T extends Record<string, FieldBuilder>>(fields: T) =>\n new FieldBuilder<T>(\"object\", { shape: fields }),\n array: (itemType: FieldBuilder) => new FieldBuilder(\"array\", { itemType }),\n ref: <S extends SchemaShape>(refType: string) =>\n new FieldBuilder<Infer<S>>(\"ref\", { refType }),\n email: () =>\n new FieldBuilder<string>(\"string\")\n .validator(validateEmail)\n .PID({\n classification: \"high\",\n action: \"encrypt\",\n logHandling: \"redact\",\n purpose: \"an email address\",\n })\n .description(\"An email address\"),\n phone: () =>\n new FieldBuilder<string>(\"string\")\n .validator(validatePhone)\n .PID({\n classification: \"high\",\n action: \"encrypt\",\n logHandling: \"redact\",\n purpose: \"a phone number\",\n })\n .description(\"A phone number\"),\n url: () =>\n new FieldBuilder<string>(\"string\")\n .validator(validateUrl)\n .PID({\n classification: \"low\",\n action: \"hash\",\n logHandling: \"pseudonym\",\n purpose: \"a URL\",\n })\n .description(\"A URL\"),\n uuid: () =>\n new FieldBuilder<string>(\"string\")\n .PID({\n classification: \"low\",\n action: \"hash\",\n logHandling: \"pseudonym\",\n purpose: \"a UUID\",\n })\n .validator(validateUUID)\n .description(\"A UUID\"),\n dateTimeISO: () =>\n new FieldBuilder<string>(\"string\")\n .PID({\n classification: \"none\",\n action: \"none\",\n logHandling: \"plain\",\n purpose: \"a date string\",\n })\n .validator(validateDateTimeISO)\n .description(\"A date string in ISO 8601 format\"),\n dateISO: () =>\n new FieldBuilder<string>(\"string\")\n .PID({\n classification: \"none\",\n action: \"none\",\n logHandling: \"plain\",\n purpose: \"a date string\",\n })\n .validator((s) => validateDateTimeISO(s, { mode: \"date\" }))\n .description(\"A date string in ISO 8601 format (date only)\"),\n timeISO: () =>\n new FieldBuilder<string>(\"string\")\n .PID({\n classification: \"none\",\n action: \"none\",\n logHandling: \"plain\",\n purpose: \"a time string\",\n })\n .validator((s) => validateDateTimeISO(s, { mode: \"time\" }))\n .description(\"A time string in ISO 8601 format (time only)\"),\n richText: () =>\n new FieldBuilder<string>(\"string\")\n .PID({\n classification: \"low\",\n action: \"clear\",\n logHandling: \"omit\",\n purpose: \"rich text content\",\n })\n .validator(validateRichText)\n .description(\"Rich text content, may include basic HTML formatting\"),\n generalText: () =>\n new FieldBuilder<string>(\"string\")\n .PID({\n classification: \"none\",\n action: \"none\",\n logHandling: \"plain\",\n purpose: \"Plain text content\",\n })\n .validator(validateSafeText)\n .description(\"Standard text content, no HTML allowed\"),\n latitude: () =>\n new FieldBuilder<number>(\"number\")\n .PID({\n classification: \"low\",\n action: \"clear\",\n logHandling: \"omit\",\n purpose: \"Latitude in decimal degrees, WGS 84 (ISO 6709)\",\n })\n .min(-90)\n .max(90)\n .description(\"Latitude in decimal degrees, WGS 84 (ISO 6709)\"),\n longitude: () =>\n new FieldBuilder<number>(\"number\")\n .PID({\n classification: \"low\",\n action: \"clear\",\n logHandling: \"omit\",\n purpose: \"Longitude in decimal degrees, WGS 84 (ISO 6709)\",\n })\n .min(-180)\n .max(180)\n .description(\"Longitude in decimal degrees, WGS 84 (ISO 6709)\"),\n version: () =>\n new FieldBuilder<string>(\"string\")\n .validator(validateSemVer)\n .description(\"A semantic version string, e.g. '1.0.0'\"),\n countryCode: () =>\n new FieldBuilder<string>(\"string\")\n .validator(validateCountryCode)\n .description(\"An ISO 3166 country code, e.g. 'US', 'GB', 'FR'\"),\n languageCode: () =>\n new FieldBuilder<string>(\"string\")\n .validator(validateLanguage)\n .description(\n \"An BCP 47 structured language code, primarily ISO 639-1 and optionally with ISO 3166-1 alpha-2 country code, e.g. 'en', 'en-US', 'fr', 'fr-FR'\"\n ),\n};\n","export type PIIClassification = \"none\" | \"low\" | \"high\";\n\nexport type PIIAction = \"encrypt\" | \"hash\" | \"clear\" | \"none\";\n\nexport type PIILogHandling = \"redact\" | \"omit\" | \"pseudonym\" | \"plain\";\n\nexport type PiiEnforcement = \"strict\" | \"warn\" | \"none\";\n\nexport interface PII {\n classification: PIIClassification;\n action: PIIAction;\n logHandling?: PIILogHandling; // How should this PII be handled in logs?\n purpose?: string; // optional, for audit: e.g. \"user contact\", \"analytics\"\n}\n\n/**\n * Centralized PII enforcement for field-level validation.\n * Returns { shortCircuit: true } when in strict mode and value is missing for high PII.\n */\nexport function enforcePIIField(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n enforcement: PiiEnforcement = \"none\",\n errors?: string[],\n logger?: { warn: (msg: string) => void }\n): { shortCircuit: boolean } {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (def?._pii?.classification === \"high\" && (def?.isRequired ?? true)) {\n const missing = value === undefined || value === null || value === \"\";\n if (missing) {\n const msg = `High PII field must not be empty: ${path}`;\n if (enforcement === \"strict\") {\n errors?.push(msg);\n return { shortCircuit: true };\n }\n if (enforcement === \"warn\") {\n logger?.warn?.(`WARN (PII Enforcement): ${msg}`);\n }\n }\n }\n return { shortCircuit: false };\n}\n\n/**\n * Apply storage-time PII transforms based on field definitions in shape.\n */\nexport function prepareForStorage(\n shape: Record<string, any>,\n input: Record<string, any>,\n encryptFn: (value: any) => string,\n hashFn: (value: any) => string\n): Record<string, any> {\n const build = (\n def: any,\n value: any,\n key: string,\n out: any,\n ctx: { parentKey?: string; isArrayItem?: boolean } = {}\n ) => {\n if (!def) return;\n const isMissing = value === undefined || value === null;\n\n // Leaf handling with PII transforms\n if (def._pii?.action === \"encrypt\") {\n if (!isMissing) out[key + \"Encrypted\"] = encryptFn(value);\n return;\n }\n if (def._pii?.action === \"hash\") {\n if (!isMissing) out[key + \"Hash\"] = hashFn(value);\n return;\n }\n if (def._pii?.action === \"clear\") {\n if (!isMissing) out[key] = null;\n return;\n }\n\n if (def.type === \"object\" && def._shape) {\n const obj: any = {};\n for (const [childKey, childDef] of Object.entries(def._shape)) {\n build(childDef, value?.[childKey], childKey, obj, { parentKey: key });\n }\n out[key] = obj;\n return;\n }\n\n if (def.type === \"array\" && def.itemType && Array.isArray(value)) {\n out[key] = value.map((item: any) => {\n const obj: any = {};\n // Use the array field name for primitive items; unwrap object items\n build(def.itemType, item, key, obj, {\n parentKey: key,\n isArrayItem: true,\n });\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n return obj[key];\n }\n return Object.keys(obj).length > 0 ? obj : item;\n });\n return;\n }\n\n if (def.type === \"ref\") {\n const ref: any = { ...value };\n const refShape = def._shape;\n if (refShape && value) {\n for (const [childKey, childDef] of Object.entries(refShape)) {\n build(childDef, value[childKey], childKey, ref, { parentKey: key });\n }\n }\n out[key] = ref;\n return;\n }\n\n out[key] = value;\n };\n\n const result: any = {};\n for (const key in shape) {\n build(shape[key], input?.[key], key, result);\n }\n return result;\n}\n\n/**\n * Apply read-time PII transforms (e.g., decrypt) based on field definitions in shape.\n */\nexport function prepareForRead(\n shape: Record<string, any>,\n stored: Record<string, any>,\n decryptFn: (value: string) => any\n): Record<string, any> {\n const readValue = (\n def: any,\n key: string,\n container: any,\n ctx: { parentKey?: string; isArrayItem?: boolean } = {}\n ): any => {\n if (!def) return container?.[key];\n const action = def._pii?.action;\n if (action === \"encrypt\") {\n const enc =\n container?.[key + \"Encrypted\"] ??\n container?.[`${ctx.parentKey ?? key}Encrypted`];\n return enc === undefined ? undefined : decryptFn(enc);\n }\n if (action === \"hash\") {\n const h =\n container?.[key + \"Hash\"] ?? container?.[`${ctx.parentKey ?? key}Hash`];\n return h === undefined ? undefined : h;\n }\n if (action === \"clear\")\n return container?.hasOwnProperty(key) ? null : undefined;\n\n if (def.type === \"object\" && def._shape) {\n const obj: any = {};\n const source =\n container && Object.prototype.hasOwnProperty.call(container, key)\n ? container[key]\n : container ?? {};\n for (const [childKey, childDef] of Object.entries(def._shape)) {\n obj[childKey] = readValue(childDef, childKey, source);\n }\n return obj;\n }\n\n if (def.type === \"array\" && def.itemType) {\n const arr = container?.[key];\n if (!Array.isArray(arr)) return arr;\n return arr.map((item: any) =>\n readValue(def.itemType, key, item, { parentKey: key, isArrayItem: true })\n );\n }\n\n if (def.type === \"ref\") {\n const ref = { ...(container?.[key] ?? {}) };\n const refShape = def._shape;\n if (refShape) {\n for (const [childKey, childDef] of Object.entries(refShape)) {\n ref[childKey] = readValue(childDef, childKey, ref);\n }\n }\n return ref;\n }\n\n return container?.[key];\n };\n\n const result: any = {};\n for (const key in shape) {\n result[key] = readValue(shape[key], key, stored);\n }\n return result;\n}\n\n/**\n * Sanitize data for logging according to PII logHandling.\n */\nexport function sanitizeForLog(\n shape: Record<string, any>,\n data: Record<string, any>,\n pseudonymFn: (value: any) => string\n): Record<string, any> {\n const visit = (\n def: any,\n value: any,\n ctx: { parentKey?: string } = {}\n ): any => {\n if (!def) return undefined;\n const handling = def._pii?.logHandling as PIILogHandling | undefined;\n if (handling === \"omit\") return undefined;\n if (handling === \"redact\") return \"[REDACTED]\";\n if (handling === \"pseudonym\") return pseudonymFn(value);\n\n if (def.type === \"object\" && def._shape) {\n const obj: any = {};\n const src = value ?? {};\n for (const [k, childDef] of Object.entries(def._shape)) {\n const child = visit(childDef, src[k], { parentKey: k });\n if (child !== undefined) obj[k] = child;\n }\n return obj;\n }\n\n if (def.type === \"array\" && def.itemType) {\n if (!Array.isArray(value)) return undefined;\n const arr = value\n .map((v: any) => visit(def.itemType, v, { parentKey: ctx.parentKey }))\n .filter((v) => v !== undefined);\n return arr;\n }\n\n if (def.type === \"ref\") {\n const ref: any = value ? { type: value.type, id: value.id } : {};\n const refShape = def._shape;\n const src = value ?? {};\n if (refShape) {\n for (const [k, childDef] of Object.entries(refShape)) {\n const child = visit(childDef, src[k]);\n if (child !== undefined) ref[k] = child;\n }\n } else if (value) {\n // no nested shape: keep original ref fields\n ref.type = value.type;\n ref.id = value.id;\n }\n return ref;\n }\n\n return value;\n };\n\n const output: any = {};\n for (const key in shape) {\n const child = visit(shape[key], data?.[key]);\n if (child !== undefined) output[key] = child;\n }\n return output;\n}\n\n/**\n * Produce a PII audit list for the given shape.\n */\nexport function getPiiAudit(shape: Record<string, any>): Array<{\n field: string;\n classification: PIIClassification;\n action: PIIAction;\n logHandling?: PIILogHandling;\n purpose?: string;\n}> {\n const piiFields: Array<any> = [];\n for (const key in shape) {\n const def = shape[key];\n if (!def) continue;\n if (def._pii && def._pii.classification !== \"none\") {\n piiFields.push({\n field: key,\n classification: def._pii.classification,\n action: def._pii.action,\n logHandling: def._pii.logHandling,\n purpose: def._pii.purpose,\n });\n }\n }\n return piiFields;\n}\n\n/**\n * Scrub PII fields for delete/retention workflows.\n */\nexport function scrubPiiForDelete(\n shape: Record<string, any>,\n stored: Record<string, any>\n): Record<string, any> {\n const result: any = Array.isArray(stored) ? [...stored] : { ...stored };\n\n const setAtPath = (target: any, path: Array<string | number>, val: any) => {\n let cur = target;\n for (let i = 0; i < path.length - 1; i++) {\n const p = path[i];\n if (p === undefined) return;\n if (cur[p] === undefined) {\n const next = path[i + 1];\n cur[p] = typeof next === \"number\" ? [] : {};\n }\n cur = cur[p];\n }\n const last = path[path.length - 1];\n if (last === undefined) return;\n cur[last] = val;\n };\n\n const visit = (\n def: any,\n host: any,\n path: Array<string | number>,\n keyName: string | number\n ) => {\n if (!def) return;\n\n const applyPath = (targetKey: string) => {\n const last = path[path.length - 1];\n if (last === undefined) return;\n if (typeof last === \"number\") {\n setAtPath(result, [...path, targetKey], null);\n } else {\n setAtPath(result, [...path.slice(0, -1), targetKey], null);\n }\n };\n\n if (def._pii?.action === \"encrypt\") {\n const targetKey = `${keyName}Encrypted`;\n if (host && Object.prototype.hasOwnProperty.call(host, targetKey)) {\n applyPath(targetKey);\n }\n return;\n }\n if (def._pii?.action === \"hash\") {\n const targetKey = `${keyName}Hash`;\n if (host && Object.prototype.hasOwnProperty.call(host, targetKey)) {\n applyPath(targetKey);\n }\n return;\n }\n if (def._pii?.action === \"clear\") {\n if (host && Object.prototype.hasOwnProperty.call(host, keyName)) {\n setAtPath(result, path, null);\n }\n return;\n }\n\n if (def.type === \"object\" && def._shape) {\n const obj =\n host && Object.prototype.hasOwnProperty.call(host, keyName)\n ? host[keyName]\n : host;\n for (const [k, childDef] of Object.entries(def._shape)) {\n visit(childDef, obj, [...path, k], k);\n }\n return;\n }\n\n if (def.type === \"array\" && def.itemType) {\n const arr = host?.[keyName];\n if (Array.isArray(arr)) {\n arr.forEach((item, idx) =>\n visit(def.itemType, item, [...path, idx], keyName)\n );\n }\n return;\n }\n\n if (def.type === \"ref\") {\n const refShape = def._shape;\n const ref = host?.[keyName];\n if (refShape && ref) {\n for (const [k, childDef] of Object.entries(refShape)) {\n visit(childDef, ref, [...path, k], k);\n }\n }\n }\n };\n\n for (const key in shape) {\n visit(shape[key], stored, [key], key);\n }\n\n return result;\n}\n","import { Infer } from \"./infer.js\";\nimport {\n FieldType,\n Schema,\n SchemaOptions,\n SchemaShape,\n PIIEnforcement,\n SchemaUpgradeResult,\n SchemaUpgradeSpec,\n SerializeOptions,\n} from \"./types.js\";\nimport type {\n FieldValidatorResult,\n ValidationIssue,\n ValidationIssueInput,\n} from \"./validation.types.js\";\nimport { field } from \"./field.js\";\nimport { PIIAction, PIIClassification, PIILogHandling } from \"./pii.js\";\nimport {\n enforcePIIField,\n prepareForStorage as piiPrepareForStorage,\n prepareForRead as piiPrepareForRead,\n sanitizeForLog as piiSanitizeForLog,\n getPiiAudit as piiGetPiiAudit,\n scrubPiiForDelete as piiScrubPiiForDelete,\n} from \"./pii.js\";\nimport { FieldBuilder } from \"./field.builder.js\";\nimport { validateSemVer } from \"./validation/version.SEMVER2.0.0.js\";\n\nconst globalSchemaRegistry = new Map<string, Schema<any>>();\n\nfunction deepClone<T>(value: T): T {\n const seen = new WeakMap();\n const cloneAny = (val: any): any => {\n if (val === null || typeof val !== \"object\") return val;\n if (seen.has(val)) throw new TypeError(\"Cannot clone circular structures\");\n if (val instanceof Date) return new Date(val.getTime());\n if (Array.isArray(val)) {\n const arr: any[] = [];\n seen.set(val, arr);\n val.forEach((item) => arr.push(cloneAny(item)));\n return arr;\n }\n const out: any = {};\n seen.set(val, out);\n for (const [k, v] of Object.entries(val)) out[k] = cloneAny(v);\n return out;\n };\n return cloneAny(value);\n}\n\nfunction shouldIncludeField(def: any, options: SerializeOptions): boolean {\n return options.includeInternal === true || (def?._exposure ?? \"public\") !== \"internal\";\n}\n\nfunction serializeFieldValue(\n def: any,\n value: any,\n options: SerializeOptions\n): any {\n if (value === undefined) {\n return undefined;\n }\n\n if (value === null) {\n return null;\n }\n\n switch (def?.type) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n return deepClone(value);\n case \"ref\": {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return deepClone(value);\n }\n\n const shape = getShape(def);\n if (!shape || Object.keys(shape).length === 0) {\n return deepClone(value);\n }\n\n const serializedRef: Record<string, any> = {};\n if (typeof value.type === \"string\") {\n serializedRef.type = value.type;\n }\n if (typeof value.id === \"string\") {\n serializedRef.id = value.id;\n }\n\n for (const [childKey, childDef] of Object.entries(shape)) {\n if (!shouldIncludeField(childDef, options)) {\n continue;\n }\n if (!Object.prototype.hasOwnProperty.call(value, childKey)) {\n continue;\n }\n\n const serializedChild = serializeFieldValue(\n childDef,\n value[childKey],\n options\n );\n if (serializedChild !== undefined) {\n serializedRef[childKey] = serializedChild;\n }\n }\n\n return serializedRef;\n }\n case \"object\": {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return deepClone(value);\n }\n\n const shape = getShape(def);\n if (!shape || Object.keys(shape).length === 0) {\n return deepClone(value);\n }\n\n const serializedObject: Record<string, any> = {};\n for (const [childKey, childDef] of Object.entries(shape)) {\n if (!shouldIncludeField(childDef, options)) {\n continue;\n }\n if (!Object.prototype.hasOwnProperty.call(value, childKey)) {\n continue;\n }\n\n const serializedChild = serializeFieldValue(\n childDef,\n value[childKey],\n options\n );\n if (serializedChild !== undefined) {\n serializedObject[childKey] = serializedChild;\n }\n }\n\n return serializedObject;\n }\n case \"array\": {\n if (!Array.isArray(value)) {\n return deepClone(value);\n }\n\n if (!def.itemType) {\n return deepClone(value);\n }\n\n return value.map((item) => serializeFieldValue(def.itemType, item, options));\n }\n default:\n return deepClone(value);\n }\n}\n\nfunction cmpSemver(a: string, b: string): number {\n const pa = a.split(\".\").map((n) => parseInt(n, 10));\n const pb = b.split(\".\").map((n) => parseInt(n, 10));\n for (let i = 0; i < 3; i++) {\n const ai = pa[i] ?? 0;\n const bi = pb[i] ?? 0;\n if (ai > bi) return 1;\n if (ai < bi) return -1;\n }\n return 0;\n}\n\n// ──────────────────────────────────────────────────────────────────────────────\n// Helper: apply schema upgrade using SchemaUpgradeSpec (function or cascading steps)\n// ──────────────────────────────────────────────────────────────────────────────\nfunction applySchemaUpgrade(\n spec: SchemaUpgradeSpec,\n input: Record<string, any>,\n ctx: {\n from: string;\n to: string;\n entityType: string;\n describe: () => { entityType: string; version: string; shape: Record<string, any> };\n log?: (msg: string) => void;\n }\n): SchemaUpgradeResult {\n // Single universal upgrader\n if (typeof spec === \"function\") {\n return spec(input, ctx);\n }\n\n // Cascading steps: sort by target version, then apply those between from..to\n const steps = [...spec].sort((s1, s2) => cmpSemver(s1.to, s2.to));\n let working: Record<string, any> = { ...input };\n let fromVersion = ctx.from;\n\n for (const step of steps) {\n // Apply step if it advances beyond current `from` and does not exceed target `to`\n if (cmpSemver(fromVersion, step.to) < 0 && cmpSemver(step.to, ctx.to) <= 0) {\n ctx.log?.(`Upgrading entity from v${fromVersion} → v${step.to}`);\n const res = step.run(working, { ...ctx, from: fromVersion, to: step.to });\n if (!res || res.ok !== true || !res.value) {\n return {\n ok: false,\n errors: res?.errors?.length\n ? res.errors\n : [`Failed to upgrade entity from v${fromVersion} to v${step.to}`],\n };\n }\n working = res.value;\n fromVersion = step.to;\n }\n }\n\n // If no steps applied or we stopped before ctx.to, the caller will normalize type/version.\n return { ok: true, value: working };\n}\n\nfunction validateEnum(\n parentKey: string,\n value: any,\n enumValues?: Array<string | number>\n): string | undefined {\n if (!enumValues) return;\n\n const values = Array.isArray(enumValues)\n ? enumValues\n : Array.from(enumValues);\n\n if (Array.isArray(value)) {\n const invalid = value.filter((v) => !values.includes(v));\n if (invalid.length > 0) {\n return `Field ${parentKey} contains invalid enum values: ${invalid.join(\n \", \"\n )}`;\n }\n } else {\n if (!values.includes(value)) {\n return `Field ${parentKey} must be one of: ${values.join(\", \")}`;\n }\n }\n}\n\n// Helper: some builders may store enum/optional/validator under different keys\n// schema.ts\nfunction getEnumValues(def: any): Array<string | number> | undefined {\n const src = Array.isArray(def?.enum)\n ? def.enum\n : Array.isArray(def?.enumValues)\n ? def.enumValues\n : Array.isArray(def?._enum)\n ? def._enum\n : Array.isArray(def?._enumValues)\n ? def._enumValues\n : def?._enumSet instanceof Set\n ? Array.from(def._enumSet)\n : undefined;\n\n if (!src) return undefined;\n const ok = src.every(\n (v: unknown) => typeof v === \"string\" || typeof v === \"number\"\n );\n return ok ? (src as Array<string | number>) : undefined;\n}\n\n// Apply default value when provided and input is nullish\nfunction applyDefault(\n def: any,\n current: any\n): { value: any; applied: boolean } {\n if (\n (current === undefined || current === null) &&\n typeof def?.getDefault === \"function\"\n ) {\n const next = def.getDefault();\n if (next !== undefined) {\n return { value: next, applied: true };\n }\n }\n return { value: current, applied: false };\n}\n\nfunction isOptional(def: any): boolean {\n return def?.isRequired === false;\n}\n\nfunction getValidator(def: any): ((v: any) => FieldValidatorResult) | undefined {\n return def?._validator ?? undefined;\n}\n\nfunction getShape(def: any): Record<string, any> | undefined {\n return def?._shape ?? def?.shape ?? undefined;\n}\n\nfunction normalizeValidationIssue(\n path: string,\n issue: string | ValidationIssueInput,\n defaultCode: string\n): ValidationIssue {\n if (typeof issue === \"string\") {\n return {\n path,\n code: defaultCode,\n message: issue,\n };\n }\n\n return {\n path: issue.path ?? path,\n code: issue.code || defaultCode,\n message: issue.message,\n };\n}\n\nfunction normalizeValidatorIssues(\n path: string,\n result: FieldValidatorResult,\n defaultCode: string\n): ValidationIssue[] {\n if (result === true) {\n return [];\n }\n\n if (result === false) {\n return [\n {\n path,\n code: defaultCode,\n message: `Invalid value for field: ${path}`,\n },\n ];\n }\n\n if (Array.isArray(result)) {\n return result.map((issue) => normalizeValidationIssue(path, issue, defaultCode));\n }\n\n return [normalizeValidationIssue(path, result, defaultCode)];\n}\n\n// ──────────────────────────────────────────────────────────────────────────────\n// Validation helpers (extracted from validate())\n// ──────────────────────────────────────────────────────────────────────────────\n\nfunction checkMissingRequired(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n errors: string[]\n): { missing: boolean } {\n if (value === undefined || value === null) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (!isOptional(def)) {\n errors.push(`Missing required field: ${path}`);\n }\n return { missing: true };\n }\n return { missing: false };\n}\n\nfunction checkImmutable(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n existing: Record<string, any> | undefined,\n errors: string[]\n): { immutableViolation: boolean } {\n if (\n def.isImmutable &&\n existing &&\n existing[key] !== undefined &&\n value !== existing[key]\n ) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n errors.push(`Field is immutable: ${path}`);\n return { immutableViolation: true };\n }\n return { immutableViolation: false };\n}\n\nfunction runCustomValidator(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n errors: string[],\n issues?: ValidationIssue[]\n): { invalid: boolean } {\n const validator = getValidator(def);\n if (validator && value !== undefined && value !== null) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n const normalizedIssues = normalizeValidatorIssues(path, validator(value), \"invalid_value\");\n if (normalizedIssues.length > 0) {\n errors.push(...normalizedIssues.map((issue) => issue.message));\n if (issues) {\n issues.push(...normalizedIssues);\n }\n return { invalid: true };\n }\n }\n return { invalid: false };\n}\n\nfunction validateStringField(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n errors: string[]\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (typeof value !== \"string\") {\n errors.push(`Field ${path} must be string`);\n return;\n }\n\n const enumValues = getEnumValues(def);\n if (Array.isArray(enumValues)) {\n const enumError = validateEnum(path, value, enumValues);\n if (enumError) {\n errors.push(enumError);\n }\n }\n}\n\nfunction validateNumberField(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n errors: string[]\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (typeof value !== \"number\") {\n errors.push(`Field ${path} must be number`);\n return;\n }\n\n const enumValues = getEnumValues(def);\n if (Array.isArray(enumValues)) {\n const enumError = validateEnum(path, value, enumValues);\n if (enumError) {\n errors.push(enumError);\n }\n }\n}\n\nfunction validateBooleanField(\n parentKey: string,\n key: string,\n value: any,\n _def: any,\n errors: string[]\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (typeof value !== \"boolean\") {\n errors.push(`Field ${path} must be boolean`);\n }\n}\n\nfunction validateObjectChildren(\n parentKey: string,\n obj: any,\n shape: Record<string, any>,\n errors: string[],\n issues: ValidationIssue[],\n existing: Record<string, any> | undefined,\n piiEnforcement: PIIEnforcement,\n logger?: { warn: (msg: string) => void }\n) {\n for (const [childKey, childDef] of Object.entries(shape) as [\n string,\n FieldBuilder<any>\n ][]) {\n let childValue = obj[childKey];\n const existingChild =\n existing && typeof existing === \"object\" ? (existing as any)[childKey] : undefined;\n\n // Apply defaults before required checks\n const { value: withDefault, applied } = applyDefault(childDef, childValue);\n if (applied) {\n obj[childKey] = withDefault;\n childValue = withDefault;\n }\n\n // Required check\n const { missing } = checkMissingRequired(\n parentKey,\n childKey,\n childValue,\n childDef,\n errors\n );\n if (missing) continue;\n\n const { immutableViolation } = checkImmutable(\n parentKey,\n childKey,\n childValue,\n childDef,\n existing,\n errors\n );\n if (immutableViolation) continue;\n\n const { shortCircuit } = enforcePIIField(\n parentKey,\n childKey,\n childValue,\n childDef,\n piiEnforcement,\n errors,\n logger\n );\n if (shortCircuit) continue;\n\n // Custom validator (per-field)\n const { invalid } = runCustomValidator(\n parentKey,\n childKey,\n childValue,\n childDef,\n errors,\n issues\n );\n if (invalid) continue;\n\n // Type-specific validation (string/number/boolean/object/array/ref)\n // This will recurse into nested objects via validateObjectField → validateObjectChildren\n validateByType(\n parentKey,\n childKey,\n childValue,\n childDef,\n errors,\n issues,\n existingChild,\n piiEnforcement,\n logger\n );\n }\n}\n\nfunction validateObjectField(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n errors: string[],\n issues: ValidationIssue[],\n existing: Record<string, any> | undefined,\n piiEnforcement: PIIEnforcement,\n logger?: { warn: (msg: string) => void }\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n errors.push(`Field ${path} must be object`);\n return;\n }\n const objShape = getShape(def);\n if (objShape)\n validateObjectChildren(path, value, objShape, errors, issues, existing, piiEnforcement, logger);\n}\n\nfunction validateArrayOfStrings(\n parentKey: string,\n key: string,\n arr: any[],\n itemDef: any,\n errors: string[]\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (!arr.every((v) => typeof v === \"string\")) {\n errors.push(`Field ${path} must be string[]`);\n return;\n }\n const enumValues = getEnumValues(itemDef);\n if (Array.isArray(enumValues)) {\n const enumError = validateEnum(path, arr, enumValues);\n if (enumError) {\n errors.push(enumError);\n }\n }\n\n const validator = getValidator(itemDef);\n if (validator) {\n arr.forEach((v, idx) => {\n if (!validator(v)) {\n errors.push(`Invalid value for field: ${path}[${idx}]`);\n }\n });\n }\n}\n\nfunction validateArrayOfNumbers(\n parentKey: string,\n key: string,\n arr: any[],\n itemDef: any,\n errors: string[]\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (!arr.every((v) => typeof v === \"number\")) {\n errors.push(`Field ${path} must be number[]`);\n }\n\n const enumValues = getEnumValues(itemDef);\n if (Array.isArray(enumValues)) {\n const enumError = validateEnum(path, arr, enumValues);\n if (enumError) {\n errors.push(enumError);\n }\n }\n\n const validator = getValidator(itemDef);\n if (validator) {\n arr.forEach((v, idx) => {\n if (!validator(v)) {\n errors.push(`Invalid value for field: ${path}[${idx}]`);\n }\n });\n }\n}\n\nfunction validateArrayOfBooleans(\n parentKey: string,\n key: string,\n arr: any[],\n _itemDef: any,\n errors: string[]\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (!arr.every((v) => typeof v === \"boolean\")) {\n errors.push(`Field ${path} must be boolean[]`);\n }\n\n const validator = getValidator(_itemDef);\n if (validator) {\n arr.forEach((v, idx) => {\n if (!validator(v)) {\n errors.push(`Invalid value for field: ${path}[${idx}]`);\n }\n });\n }\n}\n\nfunction validateArrayOfObjects(\n parentKey: string,\n key: string,\n arr: any[],\n itemDef: any,\n errors: string[],\n issues: ValidationIssue[],\n existing: any,\n piiEnforcement: PIIEnforcement,\n logger?: { warn: (msg: string) => void }\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n\n if (\n !Array.isArray(arr) ||\n !arr.every((v) => typeof v === \"object\" && v !== null && !Array.isArray(v))\n ) {\n errors.push(`Field ${path} must be object[]`);\n return;\n }\n\n const itemShape = getShape(itemDef);\n if (!itemShape) return;\n\n arr.forEach((item, idx) => {\n const itemParent = `${path}[${idx}]`;\n const existingItem = Array.isArray(existing) ? existing[idx] : undefined;\n for (const [childKey, childDef] of Object.entries(itemShape) as [\n string,\n FieldBuilder<any>\n ][]) {\n let childValue = (item as any)[childKey];\n const existingChild =\n existingItem && typeof existingItem === \"object\"\n ? (existingItem as any)[childKey]\n : undefined;\n\n const { value: withDefault, applied } = applyDefault(\n childDef,\n childValue\n );\n if (applied) {\n (item as any)[childKey] = withDefault;\n childValue = withDefault;\n }\n\n // Required check (path-aware)\n const { missing } = checkMissingRequired(\n itemParent,\n childKey,\n childValue,\n childDef,\n errors\n );\n if (missing) continue;\n\n const { immutableViolation } = checkImmutable(\n itemParent,\n childKey,\n childValue,\n childDef,\n existingItem,\n errors\n );\n if (immutableViolation) continue;\n\n const { shortCircuit } = enforcePIIField(\n itemParent,\n childKey,\n childValue,\n childDef,\n piiEnforcement,\n errors,\n logger\n );\n if (shortCircuit) continue;\n\n // Custom validator (path-aware)\n const { invalid } = runCustomValidator(\n itemParent,\n childKey,\n childValue,\n childDef,\n errors,\n issues\n );\n if (invalid) continue;\n\n // Type-specific validation (recurses into nested object/array/ref)\n validateByType(\n itemParent,\n childKey,\n childValue,\n childDef,\n errors,\n issues,\n existingChild,\n piiEnforcement,\n logger\n );\n }\n });\n}\n\nfunction validateArrayField(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n errors: string[],\n issues: ValidationIssue[],\n existing: any,\n piiEnforcement: PIIEnforcement,\n logger?: { warn: (msg: string) => void }\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (!Array.isArray(value)) {\n errors.push(`Field ${key} must be an array`);\n return;\n }\n const itemType = def.itemType?.type;\n if (itemType === \"string\")\n return validateArrayOfStrings(parentKey, key, value, def.itemType, errors);\n if (itemType === \"number\")\n return validateArrayOfNumbers(parentKey, key, value, def.itemType, errors);\n if (itemType === \"boolean\")\n return validateArrayOfBooleans(parentKey, key, value, def.itemType, errors);\n if (itemType === \"object\")\n return validateArrayOfObjects(\n parentKey,\n key,\n value,\n def.itemType,\n errors,\n issues,\n existing,\n piiEnforcement,\n logger\n );\n if (itemType === \"ref\") {\n const expectedType = (def.itemType as any).refType;\n value.forEach((ref: any, idx: number) => {\n if (\n !ref ||\n typeof ref !== \"object\" ||\n ref === null ||\n typeof ref.type !== \"string\" ||\n typeof ref.id !== \"string\" ||\n (expectedType && ref.type !== expectedType)\n ) {\n errors.push(\n `Field ${path}[${idx}] must be a reference object with type: ${expectedType}`\n );\n }\n });\n const refShape = getShape(def.itemType);\n if (refShape) {\n const existingRefs = Array.isArray(existing) ? existing : [];\n value.forEach((ref: any, idx: number) => {\n if (ref && typeof ref === \"object\" && ref !== null) {\n const existingRef = existingRefs[idx];\n for (const [childKey, childDef] of Object.entries(refShape) as [\n string,\n FieldBuilder<any>\n ][]) {\n const childPath = `${path}[${idx}].${childKey}`;\n let childValue = ref[childKey];\n const existingChild =\n existingRef && typeof existingRef === \"object\"\n ? (existingRef as any)[childKey]\n : undefined;\n const { value: withDefault, applied } = applyDefault(\n childDef,\n childValue\n );\n if (applied) {\n ref[childKey] = withDefault;\n childValue = withDefault;\n }\n if (\n (childValue === undefined || childValue === null) &&\n !isOptional(childDef)\n ) {\n errors.push(`Missing required field: ${childPath}`);\n continue;\n }\n\n const { immutableViolation } = checkImmutable(\n `${path}[${idx}]`,\n childKey,\n childValue,\n childDef,\n existingRef,\n errors\n );\n if (immutableViolation) continue;\n\n const { shortCircuit } = enforcePIIField(\n `${path}[${idx}]`,\n childKey,\n childValue,\n childDef,\n piiEnforcement,\n errors,\n logger\n );\n if (shortCircuit) continue;\n\n const childValidator = getValidator(childDef);\n if (\n childValidator &&\n childValue !== undefined &&\n childValue !== null\n ) {\n const normalizedIssues = normalizeValidatorIssues(\n childPath,\n childValidator(childValue),\n \"invalid_value\"\n );\n if (normalizedIssues.length > 0) {\n errors.push(...normalizedIssues.map((issue) => issue.message));\n issues.push(...normalizedIssues);\n continue;\n }\n }\n\n validateByType(\n `${path}[${idx}]`,\n childKey,\n childValue,\n childDef,\n errors,\n issues,\n existingChild,\n piiEnforcement,\n logger\n );\n }\n }\n });\n }\n return;\n }\n errors.push(`Field ${path} has unsupported array item type`);\n}\n\nfunction validateRefField(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n errors: string[],\n _existing: any,\n _piiEnforcement: PIIEnforcement,\n _logger?: { warn: (msg: string) => void }\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (\n typeof value !== \"object\" ||\n value === null ||\n typeof value.type !== \"string\" ||\n typeof value.id !== \"string\"\n ) {\n errors.push(`Field ${path} must be { type: string; id: string }`);\n return;\n }\n\n const expectedType = (def as any).refType;\n if (expectedType && value.type !== expectedType) {\n errors.push(\n `Field ${path} must reference type: ${expectedType} (got ${value.type})`\n );\n }\n}\n\nfunction validateByType(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n errors: string[],\n issues: ValidationIssue[],\n existing: any,\n piiEnforcement: PIIEnforcement,\n logger?: { warn: (msg: string) => void }\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n switch (def.type) {\n case \"string\":\n return validateStringField(parentKey, key, value, def, errors);\n case \"number\":\n return validateNumberField(parentKey, key, value, def, errors);\n case \"boolean\":\n return validateBooleanField(parentKey, key, value, def, errors);\n case \"object\":\n return validateObjectField(\n parentKey,\n key,\n value,\n def,\n errors,\n issues,\n existing,\n piiEnforcement,\n logger\n );\n case \"array\":\n return validateArrayField(\n parentKey,\n key,\n value,\n def,\n errors,\n issues,\n existing,\n piiEnforcement,\n logger\n );\n case \"ref\":\n return validateRefField(parentKey, key, value, def, errors, existing, piiEnforcement, logger);\n default:\n errors.push(`Unknown type for field ${path}: ${def.type}`);\n }\n}\n\nexport function createSchema<S extends SchemaShape>(\n _shape: S,\n entityType: string,\n options: SchemaOptions = {\n version: \"1.0.0\",\n table: \"\",\n schemaValidator: () => true,\n piiEnforcement: \"none\",\n schemaUpgrade: undefined,\n }\n): Schema<S> {\n const systemFields = {\n type: field.string().immutable().system(),\n version: field.string().immutable().system().validator(validateSemVer),\n };\n\n const version = options.version || \"1.0.0\";\n const store = options.table || \"\";\n\n // Optional schema-level upgrader supplied by the caller via options.schemaUpgrade\n const schemaUpgrade: SchemaUpgradeSpec | undefined = (options as any)\n .schemaUpgrade;\n\n const schema: Schema<S> = {\n // 🔗 Define the schema shape\n _shape: {\n ...systemFields,\n ..._shape,\n } as S,\n\n // 🔗 Metadata about the schema\n meta: { entityType, version },\n\n // 🔗 Validate input against the schema\n validate(input: unknown, existing?: Record<string, any>) {\n const errors: string[] = [];\n const issues: ValidationIssue[] = [];\n const result: any = {};\n const piiMode: PIIEnforcement = options.piiEnforcement ?? \"none\";\n\n if (typeof input !== \"object\" || input === null) {\n return { valid: false, errors: [\"Input must be an object\"] } as any;\n }\n // Work on a non-mutating copy that includes system defaults for first-time objects\n const working: Record<string, any> =\n typeof input === \"object\" && input !== null\n ? deepClone(input as any)\n : { ...(input as any) };\n if (working.type == null) working.type = entityType;\n if (working.version == null) working.version = version;\n\n // ── Schema-level upgrade (runs once before any field checks) ─────────────\n const fromVersion = String(working.version ?? \"0.0.0\");\n const toVersion = String(version);\n if (schemaUpgrade && cmpSemver(fromVersion, toVersion) < 0) {\n const upgradeRes = applySchemaUpgrade(schemaUpgrade, { ...working }, {\n from: fromVersion,\n to: toVersion,\n entityType,\n describe: () => schema.describe(),\n });\n if (!upgradeRes || upgradeRes.ok !== true || !upgradeRes.value) {\n const errs = upgradeRes?.errors?.length\n ? upgradeRes.errors\n : [`Failed to upgrade entity from v${fromVersion} to v${toVersion}`];\n errors.push(...errs);\n // Stop early if the schema-level migration itself failed\n return { valid: false, errors } as any;\n }\n // Use the upgraded value as our new working copy\n for (const k of Object.keys(working)) delete (working as any)[k];\n Object.assign(working, upgradeRes.value);\n // Ensure system defaults remain correct after user migration\n working.type = entityType;\n working.version = toVersion;\n }\n\n for (const key in schema._shape) {\n const def = schema._shape[key];\n let value = working[key];\n const existingField =\n existing && typeof existing === \"object\" ? (existing as any)[key] : undefined;\n\n if (!def) {\n errors.push(`Field definition missing for: ${key}`);\n continue;\n }\n\n // Apply defaults before required/validation checks\n const { value: withDefault, applied } = applyDefault(def, value);\n if (applied) {\n working[key] = withDefault;\n value = withDefault;\n }\n\n // 1) Required\n const { missing } = checkMissingRequired(\"\", key, value, def, errors);\n if (missing) continue;\n\n // 2) Immutable\n const { immutableViolation } = checkImmutable(\n \"\",\n key,\n value,\n def,\n existing,\n errors\n );\n if (immutableViolation) continue;\n\n // 3) PII enforcement (may short-circuit)\n const { shortCircuit } = enforcePIIField(\n \"\",\n key,\n value,\n def,\n piiMode,\n errors,\n console\n );\n if (shortCircuit) continue;\n\n // A local validator for this field that returns errors instead of pushing into the outer array\n const validateField = (val: any): string[] => {\n const localErrors: string[] = [];\n const localIssues: ValidationIssue[] = [];\n const { invalid } = runCustomValidator(\n \"\",\n key,\n val,\n def,\n localErrors,\n localIssues\n );\n if (!invalid) {\n validateByType(\"\", key, val, def, localErrors, localIssues, existingField, piiMode, console);\n }\n issues.push(...localIssues);\n return localErrors;\n };\n\n // First pass validation\n let fieldValue = value;\n let fieldErrors = validateField(fieldValue);\n\n // Attempt upgrade if invalid and an upgrader exists and entity is older than schema\n const entityFrom = String(working.version ?? \"0.0.0\");\n const entityTo = String(version);\n const fieldTo = String((def as any)._version ?? entityTo);\n const hasUpgrader = typeof (def as any)._upgrade === \"function\";\n\n if (\n fieldErrors.length > 0 &&\n hasUpgrader &&\n cmpSemver(entityFrom, entityTo) < 0\n ) {\n const up = (def as any)._upgrade as (\n value: any,\n ctx: {\n entityFrom: string;\n entityTo: string;\n fieldTo: string;\n fieldName: string;\n }\n ) => { ok: boolean; value?: any; error?: string };\n\n const res = up(fieldValue, {\n entityFrom,\n entityTo,\n fieldTo,\n fieldName: key,\n });\n if (res && res.ok) {\n fieldValue = res.value;\n fieldErrors = validateField(fieldValue);\n } else {\n fieldErrors.push(\n res?.error ||\n `Failed to upgrade field ${key} from v${entityFrom} to v${entityTo}`\n );\n }\n }\n\n result[key] = fieldValue;\n // Apply or record errors\n if (fieldErrors.length !== 0) {\n errors.push(...fieldErrors);\n continue;\n }\n }\n\n if (errors.length === 0 && options.schemaValidator) {\n const castValue = result as Infer<S>;\n if (!options.schemaValidator(castValue)) {\n errors.push(\"Schema-level validation failed.\");\n }\n }\n\n return {\n valid: errors.length === 0,\n value: result as Infer<S>,\n errors,\n issues,\n };\n },\n\n // specific validator for a schema to allow conditional validation\n schemaValidator: options.schemaValidator!, // <== expose it here!\n\n /**\n * Runs the optional schema-level upgrade function once, without validating.\n * Useful for offline migrations or testing migration logic.\n */\n upgrade(\n input: Record<string, any>,\n log?: (msg: string) => void\n ): {\n ok: boolean;\n value?: Record<string, any>;\n errors?: string[];\n } {\n const fromVersion = String((input as any)?.version ?? \"0.0.0\");\n const toVersion = String(version);\n if (!schemaUpgrade || cmpSemver(fromVersion, toVersion) >= 0) {\n // Nothing to do – already current or no upgrader provided.\n return {\n ok: true,\n value: { ...input, type: entityType, version: toVersion },\n };\n }\n const res = applySchemaUpgrade(\n schemaUpgrade,\n { ...(input as any) },\n {\n from: fromVersion,\n to: toVersion,\n entityType,\n describe: () => schema.describe(),\n log,\n }\n );\n if (res && res.ok && res.value) {\n const out = { ...res.value, type: entityType, version: toVersion };\n return { ok: true, value: out };\n }\n return {\n ok: false,\n errors: res?.errors?.length\n ? res.errors\n : [`Failed to upgrade entity from v${fromVersion} to v${toVersion}`],\n };\n },\n\n /**\n * Recursively validates entity references defined in this schema.\n *\n * Traverses fields of type `ref` and arrays of `ref` and resolves each target\n * entity using the provided `resolveEntity` function. When `autoValidate` is\n * enabled (default) and the field's `refPolicy` is `eager`, the referenced\n * entity's schema is fetched and validated via `validateComposition` up to\n * `maxDepth` levels.\n *\n * Skips fields not listed in `onlyFields` when provided. Prevents cycles via\n * a `visited` set in `validatorContext`.\n *\n * @param entity The root entity to validate (must include `type` and `id`).\n * @param options Options controlling traversal and resolution behavior.\n * @param options.resolveEntity Function to resolve a referenced entity by type and id.\n * @param options.validatorContext Internal context (visited set) to prevent cycles.\n * @param options.maxDepth Maximum depth for recursive validation (default: 5).\n * @param options.onlyFields Optional whitelist of field names to validate.\n * @param options.log Optional logger for traversal/debug output.\n *\n * @throws Error if a broken reference is encountered (target cannot be resolved).\n */\n async validateComposition(entity, options) {\n const {\n resolveEntity,\n validatorContext = { visited: new Set() },\n maxDepth = 5,\n log,\n } = options;\n\n const entityKey = `${(entity as any).type}:${(entity as any).id}`;\n if (validatorContext.visited.has(entityKey)) {\n log?.(`Skipping already visited entity ${entityKey}`);\n return;\n }\n validatorContext.visited.add(entityKey);\n log?.(`Validating composition for entity ${entityKey}`);\n\n for (const [key, def] of Object.entries(schema._shape)) {\n // NEW: skip if not in onlyFields\n if (options.onlyFields && !options.onlyFields.includes(key)) {\n log?.(`Skipping field ${key} (not in onlyFields)`);\n continue;\n }\n\n const autoValidate = (def as any).autoValidate !== false;\n const refPolicy = (def as any).refPolicy ?? \"eager\";\n const value = (entity as any)[key];\n if (!value) continue;\n\n if (def.type === \"ref\") {\n const refType = (def as any).refType as string;\n if (!refType)\n throw new Error(`Missing refType for reference field ${key}`);\n const ref = value as { type: string; id: string };\n if (ref.type && ref.type !== refType) {\n throw new Error(\n `Reference type mismatch for field ${key}: expected ${refType}, got ${ref.type}`\n );\n }\n const target = await options.resolveEntity(refType, ref.id);\n if (!target)\n throw new Error(\n `Broken reference: ${refType} ${ref.id} in field ${key}`\n );\n log?.(`Resolved ${refType} ${ref.id} from field ${key}`);\n\n if (autoValidate && refPolicy === \"eager\") {\n const targetSchema = getSchemaForType(refType);\n if (options.maxDepth! > 0 && targetSchema) {\n await targetSchema.validateComposition(target, {\n ...options,\n maxDepth: options.maxDepth! - 1,\n });\n }\n }\n // Handle array of refs: type === \"array\" and itemType?.type === \"ref\"\n } else if (def.type === \"array\" && def.itemType?.type === \"ref\") {\n const refType = (def.itemType as any).refType as string;\n if (!refType)\n throw new Error(`Missing refType for reference array field ${key}`);\n const refs = value as Array<{ type: string; id: string }>;\n for (const ref of refs) {\n if (ref.type && ref.type !== refType) {\n throw new Error(\n `Reference type mismatch for field ${key}: expected ${refType}, got ${ref.type}`\n );\n }\n const target = await options.resolveEntity(refType, ref.id);\n if (!target)\n throw new Error(\n `Broken reference: ${refType} ${ref.id} in field ${key}`\n );\n log?.(`Resolved ${refType} ${ref.id} from field ${key}`);\n\n if (autoValidate && refPolicy === \"eager\") {\n const targetSchema = getSchemaForType(refType);\n if (options.maxDepth! > 0 && targetSchema) {\n await targetSchema.validateComposition(target, {\n ...options,\n maxDepth: options.maxDepth! - 1,\n });\n }\n }\n }\n }\n }\n },\n\n /**\n * Returns the configured table name for this schema.\n *\n * @throws Error if no store/table name has been defined for this schema.\n */\n tableName(): string {\n if (!store || store === \"\") {\n throw new Error(\"Store is not defined for this schema\");\n }\n return store;\n },\n\n serialize(\n input: Record<string, any>,\n options: SerializeOptions = {}\n ): Record<string, any> {\n if (typeof input !== \"object\" || input === null) {\n return {};\n }\n\n const serialized: Record<string, any> = {};\n for (const [key, def] of Object.entries(schema._shape)) {\n if (!shouldIncludeField(def, options)) {\n continue;\n }\n\n if (!Object.prototype.hasOwnProperty.call(input, key)) {\n continue;\n }\n\n const value = serializeFieldValue(def, (input as any)[key], options);\n if (value !== undefined) {\n serialized[key] = value;\n }\n }\n\n return serialized;\n },\n\n /**\n * Transforms an input object for persistence by applying PII protection\n * according to field annotations (e.g., encryption and hashing).\n *\n * @param input The raw entity data.\n * @param encryptFn Function used to encrypt sensitive values.\n * @param hashFn Function used to hash sensitive values.\n * @returns A new object safe to store.\n */\n prepareForStorage(\n input: Record<string, any>,\n encryptFn: (value: any) => string,\n hashFn: (value: any) => string\n ): Record<string, any> {\n return piiPrepareForStorage(_shape, input, encryptFn, hashFn);\n },\n\n /**\n * Reverses storage transformations for read paths (e.g., decrypts values)\n * according to PII annotations, returning a consumer-friendly object.\n *\n * @param stored Data retrieved from storage.\n * @param decryptFn Function used to decrypt values that were encrypted on write.\n * @returns A new object suitable for application consumption.\n */\n prepareForRead(\n stored: Record<string, any>,\n decryptFn: (value: string) => any\n ): Record<string, any> {\n return piiPrepareForRead(_shape, stored, decryptFn);\n },\n\n /**\n * Produces a log-safe copy of the provided data by redacting or pseudonymizing\n * PII fields in accordance with field annotations.\n *\n * @param data Arbitrary data to sanitize for logging.\n * @param pseudonymFn Function producing stable pseudonyms for sensitive values.\n * @returns A copy safe to emit to logs.\n */\n sanitizeForLog(\n data: Record<string, any>,\n pseudonymFn: (value: any) => string\n ): Record<string, any> {\n return piiSanitizeForLog(_shape, data, pseudonymFn);\n },\n\n /**\n * Returns a list of fields annotated with PII metadata for auditing purposes.\n * Each entry includes classification, required action, and optional log policy.\n */\n getPiiAudit(): Array<{\n field: string;\n classification: PIIClassification;\n action: PIIAction;\n logHandling?: PIILogHandling;\n purpose?: string;\n }> {\n return piiGetPiiAudit(_shape);\n },\n\n /**\n * Produces a copy of stored data suitable for data deletion flows by scrubbing\n * or blanking PII per field annotations.\n *\n * @param stored Data as persisted.\n * @returns A copy with PII removed or neutralized for deletion.\n */\n scrubPiiForDelete(stored: Record<string, any>): Record<string, any> {\n return piiScrubPiiForDelete(_shape, stored);\n },\n\n /**\n * Returns a normalized description of the schema suitable for documentation\n * or UI rendering (type, optionality, enum values, PII flags, etc.).\n */\n describe() {\n const description: Record<string, any> = {};\n for (const [key, def] of Object.entries(schema._shape)) {\n description[key] = {\n type: def.type,\n optional: isOptional(def),\n immutable: !!def.isImmutable,\n system: !!def.isSystem,\n description: def._description ?? \"\",\n version: def._version ?? \"\",\n deprecated: (def as any).deprecated ?? false,\n deprecatedVersion:\n (def as any).deprecatedVersion === undefined\n ? null\n : (def as any).deprecatedVersion,\n enum: getEnumValues(def as any) ?? null,\n refType: (def as any).refType ?? null,\n pii:\n !def._pii || def._pii.classification === \"none\" ? null : def._pii,\n exposure: def._exposure ?? \"public\",\n };\n }\n\n return {\n entityType,\n version,\n hasSchemaUpgrade: !!schemaUpgrade,\n shape: description,\n };\n },\n };\n\n // Register the schema globally\n globalSchemaRegistry.set(entityType, schema);\n return schema;\n}\n\n/**\n * Retrieves a previously registered schema by its `entityType` from the\n * in-process global schema registry.\n */\nexport function getSchemaForType(type: string): Schema<any> | undefined {\n return globalSchemaRegistry.get(type);\n}\n\n/**\n * Returns all schemas registered in the in-process global registry.\n */\nexport function getAllSchemas(): Schema<any>[] {\n return Array.from(globalSchemaRegistry.values());\n}\n\n/**\n * Renders a schema into a simplified descriptor for front-end consumption.\n * Intended for documentation and admin tooling rather than validation.\n */\nexport function renderSchemaDescription(\n schema: Schema<any>\n): {\n title: string;\n fields: Array<{\n name: string;\n type: FieldType;\n optional: boolean;\n description: string;\n deprecated: boolean;\n pii?: string;\n exposure: \"public\" | \"internal\";\n }>;\n} {\n const meta = schema.describe();\n return {\n title: `${meta.entityType} (v${meta.version})`,\n fields: Object.entries(meta.shape).map(([name, def]) => ({\n name,\n type: def.type,\n optional: def.optional,\n description: def.description,\n deprecated: def.deprecated,\n pii: def.pii ? def.pii.classification : undefined,\n exposure: def.exposure,\n })),\n };\n}\n","import { Infer } from \"./infer.js\";\nimport { createSchema } from \"./schema.js\";\nimport { Schema, SchemaShape } from \"./types.js\";\n// This module provides a registry for component schemas, allowing components to be registered and retrieved by type.\nconst componentSchemaRegistry = new Map<string, Schema<SchemaShape>>();\n\nexport function createComponentSchema<T extends SchemaShape>(\n shape: SchemaShape,\n name: string,\n version: string,\n tableName: string = \"\",\n schemaValidator: (entity: Infer<T>) => boolean = () => true\n): Schema<SchemaShape> {\n const schema = createSchema<T>(shape as T, name, {\n version: version,\n piiEnforcement: \"strict\",\n table: tableName,\n schemaValidator,\n });\n registerComponentSchema(name, schema as Schema<SchemaShape>);\n return schema as Schema<SchemaShape>;\n}\n\nexport function registerComponentSchema(\n type: string,\n schema: Schema<SchemaShape>\n) {\n componentSchemaRegistry.set(type, schema);\n}\n\nexport function getComponentSchema(\n type: string\n): Schema<SchemaShape> | undefined {\n return componentSchemaRegistry.get(type);\n}\n\nexport function getAllComponentSchemas(): [string, Schema<SchemaShape>][] {\n return Array.from(componentSchemaRegistry.entries());\n}\n","import { field } from \"./field.js\";\nimport { createSchema } from \"./schema.js\";\n\n/** Event classes that can be observed by a player. */\nexport const PLAYER_SYSTEM_EVENT_KINDS = [\n \"combat\",\n \"social\",\n \"mission\",\n \"crafting\",\n \"world\",\n] as const;\n\nexport type PlayerSystemEventKind = (typeof PLAYER_SYSTEM_EVENT_KINDS)[number];\n\n/** Achievement tiers exposed by the curated player projection. */\nexport const PLAYER_SYSTEM_ACHIEVEMENT_TIERS = [\n \"bronze\",\n \"silver\",\n \"gold\",\n] as const;\n\nexport type PlayerSystemAchievementTier =\n (typeof PLAYER_SYSTEM_ACHIEVEMENT_TIERS)[number];\n\n/** Projection states for an achievement progress track. */\nexport const PLAYER_SYSTEM_ACHIEVEMENT_TRACK_STATUSES = [\n \"tracking\",\n \"earned\",\n] as const;\n\nexport type PlayerSystemAchievementTrackStatus =\n (typeof PLAYER_SYSTEM_ACHIEVEMENT_TRACK_STATUSES)[number];\n\nconst playerIdField = () =>\n field\n .string()\n .min(1)\n .max(128)\n .PID({\n classification: \"low\",\n action: \"none\",\n logHandling: \"pseudonym\",\n purpose: \"a stable player-scoped storage identifier\",\n })\n .description(\n \"Stable player identifier; the only personal identifier retained in event projections\",\n );\n\nconst eventIdField = () => field.string().min(1).max(128);\n\nconst eventKindField = () =>\n field.string().enum(PLAYER_SYSTEM_EVENT_KINDS);\n\nconst eventTitleField = () =>\n field\n .generalText()\n .min(1)\n .max(120)\n .description(\"Player-visible event title\");\n\nconst eventSummaryField = () =>\n field\n .generalText()\n .min(1)\n .max(320)\n .description(\"Player-visible event summary\");\n\nconst observedEventFields = (defaultHighlighted = true) => ({\n id: eventIdField(),\n playerId: playerIdField(),\n occurredAt: field.dateTimeISO(),\n kind: eventKindField(),\n title: eventTitleField(),\n summary: eventSummaryField(),\n highlighted: defaultHighlighted\n ? field.boolean().default(false)\n : field.boolean(),\n});\n\nconst eventHighlightFields = () => ({\n id: eventIdField(),\n title: eventTitleField(),\n summary: eventSummaryField(),\n occurredAt: field.dateTimeISO(),\n kind: eventKindField(),\n});\n\nconst eventEntryFields = () => ({\n id: eventIdField(),\n title: eventTitleField(),\n summary: eventSummaryField(),\n occurredAt: field.dateTimeISO(),\n kind: eventKindField(),\n highlighted: field.boolean(),\n});\n\nconst achievementFields = () => ({\n id: eventIdField(),\n title: eventTitleField(),\n tier: field.string().enum(PLAYER_SYSTEM_ACHIEVEMENT_TIERS),\n progressLabel: eventSummaryField(),\n earnedAt: field.dateTimeISO().optional(),\n});\n\nconst achievementTrackFields = () => ({\n id: eventIdField(),\n title: eventTitleField(),\n current: field.number().min(0).max(1000),\n target: field.number().min(1).max(1000),\n status: field.string().enum(PLAYER_SYSTEM_ACHIEVEMENT_TRACK_STATUSES),\n});\n\n/** A player-observable event accepted at the ingestion boundary. */\nexport interface PlayerSystemObservedEvent {\n id: string;\n playerId: string;\n occurredAt: string;\n kind: PlayerSystemEventKind;\n title: string;\n summary: string;\n highlighted: boolean;\n}\n\n/** A raw event batch written to the blob-backed ingestion zone. */\nexport interface PlayerSystemObservedEventBatch {\n source: string;\n emittedAt: string;\n events: readonly PlayerSystemObservedEvent[];\n}\n\n/** A normalized event enriched with its deterministic deduplication key. */\nexport interface PlayerSystemNormalizedObservedEvent\n extends PlayerSystemObservedEvent {\n deterministicKey: string;\n}\n\n/** A normalized event batch written by the projection processor. */\nexport interface PlayerSystemNormalizedEventBatch {\n sourceBlobName: string;\n processedAt: string;\n events: readonly PlayerSystemNormalizedObservedEvent[];\n}\n\n/** A highlighted event shown in the curated player Event Log. */\nexport interface PlayerSystemEventHighlight {\n id: string;\n title: string;\n summary: string;\n occurredAt: string;\n kind: PlayerSystemEventKind;\n}\n\n/** A recent event shown in the curated player Event Log. */\nexport interface PlayerSystemEventEntry extends PlayerSystemEventHighlight {\n highlighted: boolean;\n}\n\n/** An earned or explainable achievement projected from observed events. */\nexport interface PlayerSystemAchievementEntry {\n id: string;\n title: string;\n tier: PlayerSystemAchievementTier;\n progressLabel: string;\n earnedAt?: string;\n}\n\n/** Progress toward an achievement projected from observed events. */\nexport interface PlayerSystemAchievementTrack {\n id: string;\n title: string;\n current: number;\n target: number;\n status: PlayerSystemAchievementTrackStatus;\n}\n\n/** Curated per-player Event Log and Achievement read model. */\nexport interface PlayerSystemCuratedSnapshot {\n playerId: string;\n projectedAt: string;\n lastObservedAt: string;\n highlights: readonly PlayerSystemEventHighlight[];\n events: readonly PlayerSystemEventEntry[];\n achievements: readonly PlayerSystemAchievementEntry[];\n tracks: readonly PlayerSystemAchievementTrack[];\n}\n\n/** Schema for raw player-observable event batches. */\nexport const PlayerSystemObservedEventBatchSchema = createSchema(\n {\n source: field.string().min(1).max(120),\n emittedAt: field.dateTimeISO(),\n events: field.array(field.object(observedEventFields())),\n },\n \"player-system-observed-event-batch\",\n {\n version: \"1.0.0\",\n piiEnforcement: \"strict\",\n },\n);\n\n/** Schema for normalized event batches used by projections and gossip sourcing. */\nexport const PlayerSystemNormalizedEventBatchSchema = createSchema(\n {\n sourceBlobName: field.string().min(1).max(512),\n processedAt: field.dateTimeISO(),\n events: field.array(\n field.object({\n ...observedEventFields(false),\n deterministicKey: field.string().min(1).max(256),\n }),\n ),\n },\n \"player-system-normalized-event-batch\",\n {\n version: \"1.0.0\",\n piiEnforcement: \"strict\",\n },\n);\n\n/** Schema for curated per-player Event Log and Achievement read models. */\nexport const PlayerSystemCuratedSnapshotSchema = createSchema(\n {\n playerId: playerIdField(),\n projectedAt: field.dateTimeISO(),\n lastObservedAt: field.dateTimeISO(),\n highlights: field.array(field.object(eventHighlightFields())),\n events: field.array(field.object(eventEntryFields())),\n achievements: field.array(field.object(achievementFields())),\n tracks: field.array(field.object(achievementTrackFields())),\n },\n \"player-system-curated-snapshot\",\n {\n version: \"1.0.0\",\n piiEnforcement: \"strict\",\n },\n);\n\nexport type PlayerSystemObservedEventBatchEntity =\n PlayerSystemObservedEventBatch & {\n type: \"player-system-observed-event-batch\";\n version: \"1.0.0\";\n };\n\nexport type PlayerSystemNormalizedEventBatchEntity =\n PlayerSystemNormalizedEventBatch & {\n type: \"player-system-normalized-event-batch\";\n version: \"1.0.0\";\n };\n\nexport type PlayerSystemCuratedSnapshotEntity = PlayerSystemCuratedSnapshot & {\n type: \"player-system-curated-snapshot\";\n version: \"1.0.0\";\n};\n"],"mappings":"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CA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EA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","names":["IsoLanguageCode","options"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/field.builder.ts","../src/validation/email.RFC5322.ts","../src/validation/phone.E.164.ts","../src/validation/url.WHATWG.ts","../src/validation/uuid.RFC4122.ts","../src/validation/dateTime.ISO8601.ts","../src/validation/countryCode.ISO3166.ts","../src/validation/currencyCode.ISO4217.ts","../src/validation/generalText.OWASP.ts","../src/validation/version.SEMVER2.0.0.ts","../src/validation/percentage.ISO80000-1.ts","../src/validation/richtext.OWASP.ts","../src/validation/name.OWASP.ts","../src/validation/user.MS-GOOGLE-APPLE.ts","../src/validation/languageCode.BCP47.ts","../src/field.ts","../src/types.ts","../src/pii.ts","../src/schema.ts","../src/components.ts","../src/player-system-events.ts","../src/feedback-contract-version.ts","../src/feedback-diagnostics-vocabulary.ts","../src/feedback-diagnostics.contract.ts","../unicode/feedback-unicode-15.1.0-unassigned.json","../src/feedback-unicode-profile.codec.ts","../src/feedback-unicode-profile.ts","../src/feedback.ts"],"sourcesContent":["export type { Infer } from \"./infer.js\";\nexport { field } from \"./field.js\";\nexport {\n createSchema,\n getSchemaForType,\n getAllSchemas,\n renderSchemaDescription,\n} from \"./schema.js\";\nexport type * from \"./types.js\";\nexport {\n SCHEMA_IDENTITY_POLICIES,\n SCHEMA_UNKNOWN_FIELDS_POLICIES,\n} from \"./types.js\";\nexport type * from \"./validation.types.js\";\nexport * from \"./components.js\";\nexport * from \"./validation/index.js\";\nexport * from \"./field.builder.js\";\nexport * from \"./player-system-events.js\";\nexport * from \"./feedback.js\";\n","type FieldType = \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\" | \"ref\";\n\nimport { type PII } from \"./pii.js\";\nimport { getSchemaForType } from \"./schema.js\";\nimport type { FieldValidator } from \"./validation.types.js\";\n\nexport type FieldExposure = \"public\" | \"internal\";\n\nfunction mergeValidatorResult(\n previousResult: ReturnType<FieldValidator>,\n nextValid: boolean,\n): ReturnType<FieldValidator> {\n if (previousResult !== true) {\n return previousResult;\n }\n\n return nextValid;\n}\n\nexport class FieldBuilder<TExternal = unknown, TInternal = TExternal> {\n _type!: TExternal;\n _storageType!: TInternal;\n isSystem = false;\n isImmutable = false;\n isRequired = true;\n _validator?: FieldValidator<TInternal>;\n _description: string = \"\";\n _version: string = \"1.0.0\";\n _default?: TInternal | (() => TInternal);\n _upgrade?: (\n value: any,\n ctx: {\n entityFrom: string;\n entityTo: string;\n fieldTo: string;\n fieldName: string;\n }\n ) => { ok: boolean; value?: any; error?: string };\n _shape?: Record<string, FieldBuilder<any>>;\n itemType?: FieldBuilder<any>;\n refType?: string;\n _pii: PII = {\n classification: \"none\",\n action: \"none\",\n logHandling: \"plain\",\n purpose: \"an ordinary value\",\n };\n _exposure: FieldExposure = \"public\";\n enumValues?: readonly TInternal[];\n\n constructor(\n public type: FieldType,\n options: {\n shape?: Record<string, FieldBuilder<any>>;\n itemType?: FieldBuilder<any>;\n refType?: string;\n } = {}\n ) {\n this._shape = options.shape;\n this.itemType = options.itemType;\n this.refType = options.refType;\n }\n\n immutable(): FieldBuilder<TExternal, TInternal> {\n this.isImmutable = true;\n return this;\n }\n\n system(): FieldBuilder<TExternal, TInternal> {\n this.isSystem = true;\n return this;\n }\n\n exposure(exposure: FieldExposure): FieldBuilder<TExternal, TInternal> {\n this._exposure = exposure;\n return this;\n }\n\n internal(): FieldBuilder<TExternal, TInternal> {\n return this.exposure(\"internal\");\n }\n\n public(): FieldBuilder<TExternal, TInternal> {\n return this.exposure(\"public\");\n }\n\n required(): FieldBuilder<TExternal, TInternal> {\n this.isRequired = true;\n return this;\n }\n\n optional(): FieldBuilder<TExternal, TInternal> {\n this.isRequired = false;\n return this;\n }\n\n validator(\n fn: FieldValidator<TInternal>\n ): FieldBuilder<TExternal, TInternal> {\n this._validator = fn;\n return this;\n }\n\n description(desc: string): FieldBuilder<TExternal, TInternal> {\n this._description = desc;\n return this;\n }\n\n default(\n value: TInternal | (() => TInternal)\n ): FieldBuilder<TExternal, TInternal> {\n this._default = value;\n // Supplying a default implies the value may be omitted at input time.\n // Do not couple defaulting with validation.\n this.isRequired = false;\n return this;\n }\n\n /**\n * Configure an upgrader used when validating older entities against a newer schema.\n * The upgrader receives the current field value and version context, and should\n * return { ok: true, value } with the upgraded value, or { ok: false, error }.\n */\n upgrade(\n fn: (\n value: any,\n ctx: {\n entityFrom: string;\n entityTo: string;\n fieldTo: string;\n fieldName: string;\n }\n ) => { ok: boolean; value?: any; error?: string }\n ): FieldBuilder<TExternal, TInternal> {\n this._upgrade = fn;\n return this;\n }\n\n getDefault(): TInternal | undefined {\n const v = this._default;\n return typeof v === \"function\" ? (v as () => TInternal)() : v;\n }\n\n version(ver: string): FieldBuilder<TExternal, TInternal> {\n this._version = ver;\n return this;\n }\n\n /// PID informs the schema PII handling of the manner in\n /// which to handle data relating to this field.\n PID(pii: PII): FieldBuilder<TExternal, TInternal> {\n this._pii = pii;\n return this;\n }\n\n min(min: number): FieldBuilder<TExternal, TInternal> {\n if (this.type === \"number\") {\n const prevValidator = this._validator;\n this._validator = (value: any) => {\n const valid = typeof value === \"number\" && value >= min;\n return prevValidator ? mergeValidatorResult(prevValidator(value), valid) : valid;\n };\n } else if (this.type === \"string\") {\n const prevValidator = this._validator;\n this._validator = (value: any) => {\n const valid = typeof value === \"string\" && value.length >= min;\n return prevValidator ? mergeValidatorResult(prevValidator(value), valid) : valid;\n };\n } else if (this.type === \"array\") {\n const prevValidator = this._validator;\n this._validator = (value: any) => {\n const valid = Array.isArray(value) && value.length >= min;\n return prevValidator ? mergeValidatorResult(prevValidator(value), valid) : valid;\n };\n } else {\n throw new Error(\n \"Min is only supported on number, string, or array fields.\"\n );\n }\n return this;\n }\n\n max(max: number): FieldBuilder<TExternal, TInternal> {\n if (this.type === \"number\") {\n const prevValidator = this._validator;\n this._validator = (value: any) => {\n const valid = typeof value === \"number\" && value <= max;\n return prevValidator ? mergeValidatorResult(prevValidator(value), valid) : valid;\n };\n } else if (this.type === \"string\") {\n const prevValidator = this._validator;\n this._validator = (value: any) => {\n const valid = typeof value === \"string\" && value.length <= max;\n return prevValidator ? mergeValidatorResult(prevValidator(value), valid) : valid;\n };\n } else if (this.type === \"array\") {\n const prevValidator = this._validator;\n this._validator = (value: any) => {\n const valid = Array.isArray(value) && value.length <= max;\n return prevValidator ? mergeValidatorResult(prevValidator(value), valid) : valid;\n };\n } else {\n throw new Error(\n \"Max is only supported on number, string, or array fields.\"\n );\n }\n return this;\n }\n\n pattern(regex: RegExp): FieldBuilder<TExternal, TInternal> {\n if (this.type !== \"string\") {\n throw new Error(\"Pattern is only supported on string fields.\");\n }\n const prevValidator = this._validator;\n this._validator = (value: any) => {\n const valid = typeof value === \"string\" && regex.test(value);\n return prevValidator ? mergeValidatorResult(prevValidator(value), valid) : valid;\n };\n return this;\n }\n\n enum<const U extends readonly TInternal[]>(\n values: U\n ): FieldBuilder<U[number]> {\n if (\n this.type !== \"string\" &&\n this.type !== \"number\" &&\n !(\n this.type === \"array\" &&\n (this.itemType?.type === \"string\" || this.itemType?.type === \"number\")\n )\n ) {\n throw new Error(\n \"Enums are only supported on string or number fields or arrays of strings or numbers.\"\n );\n }\n this.enumValues = values;\n return this as any;\n }\n\n /**\n * Create a shallow clone with a different external type parameter.\n * Note: shape and itemType are passed by reference (shallow). If you need\n * deep isolation of nested FieldBuilders, clone them explicitly.\n */\n as<U>(): FieldBuilder<U, TInternal> {\n const clone = new FieldBuilder<U, TInternal>(this.type, {\n shape: this._shape,\n itemType: this.itemType,\n refType: this.refType,\n });\n clone.enumValues = this.enumValues;\n clone.isImmutable = this.isImmutable;\n clone.isSystem = this.isSystem;\n clone.isRequired = this.isRequired;\n clone._description = this._description;\n clone._version = this._version;\n clone._pii = this._pii;\n clone._exposure = this._exposure;\n clone._validator = this._validator as any;\n clone._default = this._default as any;\n clone._upgrade = this._upgrade;\n // refType already provided in constructor options above\n return clone;\n }\n}\n\nexport default FieldBuilder;\n","/**\n * Validates the package's pragmatic dot-domain mailbox subset.\n *\n * This intentionally does not claim full RFC 5322 mailbox support (for\n * example, quoted local parts and address literals are outside the product\n * contract). The legacy filename is retained for import compatibility.\n */\nexport const validateEmail = (value: unknown): boolean => {\n if (typeof value !== \"string\") return false;\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(value);\n};\n","/**\n * Validates a phone number string in strict E.164 format.\n * Returns true for strings like \"+441632960960\" (max 15 digits, starting with a '+').\n */\nexport const validatePhone = (value: unknown): boolean => {\n if (typeof value !== \"string\") return false;\n const phoneRegex = /^\\+[1-9]\\d{1,14}$/; // E.164 format\n return phoneRegex.test(value);\n};\n","/**\n * Validates a URL string using the WHATWG URL API.\n * Accepts only 'http' or 'https' protocols.\n * Returns true if the URL is syntactically valid.\n */\nexport const validateUrl = (value: unknown): boolean => {\n if (typeof value !== \"string\") return false;\n try {\n const url = new URL(value);\n // Enforce scheme:\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") return false;\n return true;\n } catch {\n return false;\n }\n};\n","/** \n * Validates the RFC 9562 UUID text format, including versions 1-8 plus Nil and\n * Max UUIDs. The legacy filename is retained for import compatibility.\n */ \nexport const validateUUID = (value: unknown): boolean => {\n if (typeof value !== \"string\") return false;\n const standard = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n return standard.test(value)\n || value.toLowerCase() === \"00000000-0000-0000-0000-000000000000\"\n || value.toLowerCase() === \"ffffffff-ffff-ffff-ffff-ffffffffffff\";\n};\n","/**\n * Validates whether a string is a properly formatted ISO 8601 datetime, date, or time.\n * \n * @param value - The value to validate.\n * @param options - Optional settings for validation mode.\n * @param options.mode - The mode of validation:\n * - \"datetime\" (default): Checks full ISO 8601 datetime and equality with toISOString().\n * - \"date\": Validates that the string is in YYYY-MM-DD format and represents a valid date.\n * - \"time\": Validates that the string matches a valid HH:MM:SS(.sss)?Z? ISO 8601 time pattern.\n * @returns True if the value is valid according to the specified mode; otherwise, false.\n */\nexport const validateDateTimeISO = (\n value: unknown,\n options?: { mode?: \"datetime\" | \"date\" | \"time\" }\n): boolean => {\n const mode = options?.mode ?? \"datetime\";\n\n if (typeof value !== \"string\") return false;\n\n if (mode === \"datetime\") {\n // Strict ISO 8601 date-time: YYYY-MM-DDTHH:mm:ss(.fraction)?(Z|±HH:MM)\n const isoDateTimeRegex =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,9})?(?:Z|[+-]\\d{2}:\\d{2})$/;\n\n if (!isoDateTimeRegex.test(value)) return false;\n\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return false;\n\n // We purposely do NOT require `value === date.toISOString()` because\n // valid ISO8601 inputs may include offsets (e.g., \"+01:00\") or omit\n // milliseconds, both of which produce a different canonical ISO string.\n // The regex ensures strict shape; Date parsing ensures it is a real moment.\n return true;\n }\n\n if (mode === \"date\") {\n // YYYY-MM-DD format\n const dateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\n if (!dateRegex.test(value)) return false;\n const date = new Date(value);\n if (isNaN(date.getTime())) return false;\n // Ensure the date parts match exactly (to avoid 2023-02-30 being accepted)\n const [year, month, day] = value.split(\"-\").map(Number);\n return (\n date.getUTCFullYear() === year &&\n date.getUTCMonth() + 1 === month &&\n date.getUTCDate() === day\n );\n }\n\n if (mode === \"time\") {\n // HH:MM:SS(.sss)?Z?\n // Hours: 00-23, Minutes: 00-59, Seconds: 00-59, optional fractional seconds, optional Z\n const timeRegex = /^([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(\\.\\d+)?Z?$/;\n return timeRegex.test(value);\n }\n\n return false;\n};\n","export const isoCountryCodes = new Set([\n \"AD\",\n \"AE\",\n \"AF\",\n \"AG\",\n \"AI\",\n \"AL\",\n \"AM\",\n \"AO\",\n \"AQ\",\n \"AR\",\n \"AS\",\n \"AT\",\n \"AU\",\n \"AW\",\n \"AX\",\n \"AZ\",\n \"BA\",\n \"BB\",\n \"BD\",\n \"BE\",\n \"BF\",\n \"BG\",\n \"BH\",\n \"BI\",\n \"BJ\",\n \"BL\",\n \"BM\",\n \"BN\",\n \"BO\",\n \"BQ\",\n \"BR\",\n \"BS\",\n \"BT\",\n \"BV\",\n \"BW\",\n \"BY\",\n \"BZ\",\n \"CA\",\n \"CC\",\n \"CD\",\n \"CF\",\n \"CG\",\n \"CH\",\n \"CI\",\n \"CK\",\n \"CL\",\n \"CM\",\n \"CN\",\n \"CO\",\n \"CR\",\n \"CU\",\n \"CV\",\n \"CW\",\n \"CX\",\n \"CY\",\n \"CZ\",\n \"DE\",\n \"DJ\",\n \"DK\",\n \"DM\",\n \"DO\",\n \"DZ\",\n \"EC\",\n \"EE\",\n \"EG\",\n \"EH\",\n \"ER\",\n \"ES\",\n \"ET\",\n \"FI\",\n \"FJ\",\n \"FM\",\n \"FO\",\n \"FR\",\n \"GA\",\n \"GB\",\n \"GD\",\n \"GE\",\n \"GF\",\n \"GG\",\n \"GH\",\n \"GI\",\n \"GL\",\n \"GM\",\n \"GN\",\n \"GP\",\n \"GQ\",\n \"GR\",\n \"GT\",\n \"GU\",\n \"GW\",\n \"GY\",\n \"HK\",\n \"HM\",\n \"HN\",\n \"HR\",\n \"HT\",\n \"HU\",\n \"ID\",\n \"IE\",\n \"IL\",\n \"IM\",\n \"IN\",\n \"IO\",\n \"IQ\",\n \"IR\",\n \"IS\",\n \"IT\",\n \"JE\",\n \"JM\",\n \"JO\",\n \"JP\",\n \"KE\",\n \"KG\",\n \"KH\",\n \"KI\",\n \"KM\",\n \"KN\",\n \"KP\",\n \"KR\",\n \"KW\",\n \"KY\",\n \"KZ\",\n \"LA\",\n \"LB\",\n \"LC\",\n \"LI\",\n \"LK\",\n \"LR\",\n \"LS\",\n \"LT\",\n \"LU\",\n \"LV\",\n \"LY\",\n \"MA\",\n \"MC\",\n \"MD\",\n \"ME\",\n \"MF\",\n \"MG\",\n \"MH\",\n \"MK\",\n \"ML\",\n \"MM\",\n \"MN\",\n \"MO\",\n \"MP\",\n \"MQ\",\n \"MR\",\n \"MS\",\n \"MT\",\n \"MU\",\n \"MV\",\n \"MW\",\n \"MX\",\n \"MY\",\n \"MZ\",\n \"NA\",\n \"NC\",\n \"NE\",\n \"NF\",\n \"NG\",\n \"NI\",\n \"NL\",\n \"NO\",\n \"NP\",\n \"NR\",\n \"NU\",\n \"NZ\",\n \"OM\",\n \"PA\",\n \"PE\",\n \"PF\",\n \"PG\",\n \"PH\",\n \"PK\",\n \"PL\",\n \"PM\",\n \"PN\",\n \"PR\",\n \"PS\",\n \"PT\",\n \"PW\",\n \"PY\",\n \"QA\",\n \"RE\",\n \"RO\",\n \"RS\",\n \"RU\",\n \"RW\",\n \"SA\",\n \"SB\",\n \"SC\",\n \"SD\",\n \"SE\",\n \"SG\",\n \"SH\",\n \"SI\",\n \"SJ\",\n \"SK\",\n \"SL\",\n \"SM\",\n \"SN\",\n \"SO\",\n \"SR\",\n \"SS\",\n \"ST\",\n \"SV\",\n \"SX\",\n \"SY\",\n \"SZ\",\n \"TC\",\n \"TD\",\n \"TF\",\n \"TG\",\n \"TH\",\n \"TJ\",\n \"TK\",\n \"TL\",\n \"TM\",\n \"TN\",\n \"TO\",\n \"TR\",\n \"TT\",\n \"TV\",\n \"TZ\",\n \"UA\",\n \"UG\",\n \"UM\",\n \"US\",\n \"UY\",\n \"UZ\",\n \"VA\",\n \"VC\",\n \"VE\",\n \"VG\",\n \"VI\",\n \"VN\",\n \"VU\",\n \"WF\",\n \"WS\",\n \"YE\",\n \"YT\",\n \"ZA\",\n \"ZM\",\n \"ZW\",\n]);\n\n/**\n * Validates whether a string is a valid ISO 3166-1 alpha-2 country code. \n * Performs a case-insensitive lookup against a predefined set of known codes.\n */\nexport const validateCountryCode = (value: unknown): boolean => {\n if (typeof value !== \"string\") return false;\n return isoCountryCodes.has(value.toUpperCase());\n};\n","export const isoCurrencyCodes = new Set([\n \"AED\",\n \"AFN\",\n \"ALL\",\n \"AMD\",\n \"ANG\",\n \"AOA\",\n \"ARS\",\n \"AUD\",\n \"AWG\",\n \"AZN\",\n \"BAM\",\n \"BBD\",\n \"BDT\",\n \"BGN\",\n \"BHD\",\n \"BIF\",\n \"BMD\",\n \"BND\",\n \"BOB\",\n \"BOV\",\n \"BRL\",\n \"BSD\",\n \"BTN\",\n \"BWP\",\n \"BYN\",\n \"BZD\",\n \"CAD\",\n \"CDF\",\n \"CHE\",\n \"CHF\",\n \"CHW\",\n \"CLF\",\n \"CLP\",\n \"CNY\",\n \"COP\",\n \"COU\",\n \"CRC\",\n \"CUC\",\n \"CUP\",\n \"CVE\",\n \"CZK\",\n \"DJF\",\n \"DKK\",\n \"DOP\",\n \"DZD\",\n \"EGP\",\n \"ERN\",\n \"ETB\",\n \"EUR\",\n \"FJD\",\n \"FKP\",\n \"GBP\",\n \"GEL\",\n \"GHS\",\n \"GIP\",\n \"GMD\",\n \"GNF\",\n \"GTQ\",\n \"GYD\",\n \"HKD\",\n \"HNL\",\n \"HRK\",\n \"HTG\",\n \"HUF\",\n \"IDR\",\n \"ILS\",\n \"INR\",\n \"IQD\",\n \"IRR\",\n \"ISK\",\n \"JMD\",\n \"JOD\",\n \"JPY\",\n \"KES\",\n \"KGS\",\n \"KHR\",\n \"KMF\",\n \"KPW\",\n \"KRW\",\n \"KWD\",\n \"KYD\",\n \"KZT\",\n \"LAK\",\n \"LBP\",\n \"LKR\",\n \"LRD\",\n \"LSL\",\n \"LYD\",\n \"MAD\",\n \"MDL\",\n \"MGA\",\n \"MKD\",\n \"MMK\",\n \"MNT\",\n \"MOP\",\n \"MRU\",\n \"MUR\",\n \"MVR\",\n \"MWK\",\n \"MXN\",\n \"MXV\",\n \"MYR\",\n \"MZN\",\n \"NAD\",\n \"NGN\",\n \"NIO\",\n \"NOK\",\n \"NPR\",\n \"NZD\",\n \"OMR\",\n \"PAB\",\n \"PEN\",\n \"PGK\",\n \"PHP\",\n \"PKR\",\n \"PLN\",\n \"PYG\",\n \"QAR\",\n \"RON\",\n \"RSD\",\n \"RUB\",\n \"RWF\",\n \"SAR\",\n \"SBD\",\n \"SCR\",\n \"SDG\",\n \"SEK\",\n \"SGD\",\n \"SHP\",\n \"SLE\",\n \"SLL\",\n \"SOS\",\n \"SRD\",\n \"SSP\",\n \"STN\",\n \"SVC\",\n \"SYP\",\n \"SZL\",\n \"THB\",\n \"TJS\",\n \"TMT\",\n \"TND\",\n \"TOP\",\n \"TRY\",\n \"TTD\",\n \"TWD\",\n \"TZS\",\n \"UAH\",\n \"UGX\",\n \"USD\",\n \"USN\",\n \"UYI\",\n \"UYU\",\n \"UYW\",\n \"UZS\",\n \"VES\",\n \"VND\",\n \"VUV\",\n \"WST\",\n \"XAF\",\n \"XAG\",\n \"XAU\",\n \"XBA\",\n \"XBB\",\n \"XBC\",\n \"XBD\",\n \"XCD\",\n \"XDR\",\n \"XOF\",\n \"XPD\",\n \"XPF\",\n \"XPT\",\n \"XSU\",\n \"XTS\",\n \"XUA\",\n \"XXX\",\n \"YER\",\n \"ZAR\",\n \"ZMW\",\n \"ZWL\",\n]);\n\n\n/** \n * Validates whether a string is a valid ISO 4217 currency code. \n * Performs a case-insensitive lookup against a predefined set of known codes.\n */\nexport const validateCurrencyCode = (value: unknown): boolean => {\n if (typeof value !== \"string\") return false;\n return isoCurrencyCodes.has(value.toUpperCase());\n};\n","/**\n * Validates that a text field is safe for storage (per OWASP guidelines).\n * Applies to general text fields: names, descriptions, titles, etc.\n * Global Standard: OWASP Input Validation Cheat Sheet (2024)\n */\nexport function validateSafeText(value: unknown): boolean {\n if (typeof value !== \"string\") return false;\n\n // Trimmed version should not be empty\n const trimmed = value.trim();\n if (trimmed.length === 0) return false;\n\n // Reject control chars\n for (let i = 0; i < trimmed.length; i++) {\n const code = trimmed.codePointAt(i);\n if (code !== undefined && (code >= 0x00 && code <= 0x1F || code === 0x7F)) {\n return false;\n }\n }\n\n // Reject dangerous characters\n if (/['\"<>\\\\{}();]/.test(trimmed)) return false;\n\n // Reject SQL-style injection patterns\n if (\n /(--|\\b(SELECT|UPDATE|DELETE|INSERT|DROP|ALTER|EXEC|UNION|GRANT|REVOKE)\\b|\\/\\*|\\*\\/|@@)/i.test(\n trimmed\n )\n )\n return false;\n\n // Reject null char\n if (trimmed.includes(\"\\u0000\")) return false;\n\n // Optional: limit length\n if (trimmed.length > 1024) return false;\n\n return true;\n}\n","/**\n * Validates that a version string conforms to Semantic Versioning (SemVer 2.0.0).\n * Global Standard: https://semver.org/\n */\nexport function validateSemVer(value: unknown): boolean {\n if (typeof value !== \"string\") return false;\n return /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/.test(\n value\n );\n}\n","/**\n * Validates that a number is a percentage value (0 to 100 inclusive).\n * Global Standard: ISO 80000-1 percentage definition.\n */\nexport function validatePercentage(value: unknown): boolean {\n if (typeof value !== \"number\") return false;\n return value >= 0 && value <= 100;\n}\n","/**\n * Validates rich text input to ensure it contains only safe HTML/Markdown.\n * Global Standard: OWASP HTML Sanitization Guidelines (2024).\n * This validator checks for dangerous patterns — does not sanitize — assumes text will be sanitized downstream.\n */\nexport function validateRichText(value: unknown): boolean {\n if (typeof value !== \"string\") return false;\n const trimmed = value.trim();\n if (trimmed.length === 0) return true; // Allow empty rich text\n\n // Reject known dangerous tags\n if (\n /<(script|iframe|object|embed|style|link|meta|base|form|input|button|textarea|select)\\b/i.test(\n trimmed\n )\n ) {\n return false;\n }\n\n // Reject javascript: links\n if (/javascript:/i.test(trimmed)) {\n return false;\n }\n\n // Reject event handlers (onload, onclick, etc)\n if (/on\\w+=[\"']?/i.test(trimmed)) {\n return false;\n }\n\n // Optionally: limit max length (e.g. 10,000 chars)\n if (trimmed.length > 10000) return false;\n\n return true;\n}\n","function validateNameLike(value: unknown, pattern: RegExp): boolean {\n if (typeof value !== \"string\") return false;\n\n const trimmed = value.trim();\n if (trimmed.length === 0) return false;\n\n // Limit length (ISO guidance: max 256 is typical)\n if (trimmed.length > 256) return false;\n\n // Reject ASCII control chars (U+0000–U+001F and U+007F)\n for (const ch of trimmed) {\n const cp = ch.codePointAt(0)!;\n if ((cp >= 0x00 && cp <= 0x1F) || cp === 0x7F) return false;\n }\n\n if (!pattern.test(trimmed)) return false;\n\n return true;\n}\n\n/**\n * Validates that a personal name is safe and culturally inclusive.\n *\n * Decimal digits remain unsupported because first, middle, and last names are\n * personal-name components rather than public display identifiers.\n *\n * Global Standard: OWASP Input Validation Cheat Sheet + ICAO Doc 9303 + IETF PRECIS\n */\nexport function validateName(value: unknown): boolean {\n return validateNameLike(value, /^[\\p{L}\\p{M}'\\-. ]+$/u);\n}\n\n/**\n * Validates a public display name independently from personal-name fields.\n *\n * Unicode decimal digits are supported alongside letters and combining marks\n * so legitimate display names such as `Player 2` remain representable without\n * relaxing first, middle, or last-name validation.\n *\n * Global Standard: OWASP Input Validation Cheat Sheet + IETF PRECIS\n */\nexport function validateDisplayName(value: unknown): boolean {\n return validateNameLike(value, /^[\\p{L}\\p{M}\\p{Nd}'\\-. ]+$/u);\n}\n","/**\n * Validates that a user ID is a valid `sub` from one of the supported identity providers.\n * Global Standard: OpenID Connect Core 1.0 `sub` claim.\n */\nexport function validateUserId(value: unknown): boolean {\n if (typeof value !== \"string\") return false;\n\n const trimmed = value.trim();\n if (trimmed.length === 0) return false;\n\n // Google: all digits\n const googlePattern = /^\\d{21,22}$/;\n\n // Microsoft: UUID v4\n const microsoftPattern =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n // Apple: opaque, usually UUID but allow any printable string up to 255 chars\n const applePattern = /^[\\w\\-.]{6,255}$/; // Alphanumeric + - . _ (common safe characters)\n\n return (\n googlePattern.test(trimmed) ||\n microsoftPattern.test(trimmed) ||\n applePattern.test(trimmed)\n );\n}\n\nexport function validateUserIdArray(value: unknown): boolean {\n if (!Array.isArray(value)) return false;\n return value.every(validateUserId);\n}","/**\n * ISO 639-1 language codes (two-letter).\n * Tip: Keep this list as source of truth for supported languages in your app.\n */\nexport enum IsoLanguageCode {\n Afar = \"aa\",\n Abkhazian = \"ab\",\n Afrikaans = \"af\",\n Akan = \"ak\",\n Albanian = \"sq\",\n Amharic = \"am\",\n Arabic = \"ar\",\n Aragonese = \"an\",\n Armenian = \"hy\",\n Assamese = \"as\",\n Avaric = \"av\",\n Aymara = \"ay\",\n Azerbaijani = \"az\",\n Bashkir = \"ba\",\n Bambara = \"bm\",\n Basque = \"eu\",\n Belarusian = \"be\",\n Bengali = \"bn\",\n Bislama = \"bi\",\n Bosnian = \"bs\",\n Breton = \"br\",\n Bulgarian = \"bg\",\n Burmese = \"my\",\n Catalan = \"ca\",\n Chamorro = \"ch\",\n Chechen = \"ce\",\n Chinese = \"zh\",\n ChurchSlavic = \"cu\",\n Chuvash = \"cv\",\n Cornish = \"kw\",\n Corsican = \"co\",\n Cree = \"cr\",\n Croatian = \"hr\",\n Czech = \"cs\",\n Danish = \"da\",\n Divehi = \"dv\",\n Dutch = \"nl\",\n Dzongkha = \"dz\",\n English = \"en\",\n Esperanto = \"eo\",\n Estonian = \"et\",\n Ewe = \"ee\",\n Faroese = \"fo\",\n Fijian = \"fj\",\n Finnish = \"fi\",\n French = \"fr\",\n WesternFrisian = \"fy\",\n Fulah = \"ff\",\n Gaelic = \"gd\",\n Galician = \"gl\",\n Ganda = \"lg\",\n Georgian = \"ka\",\n German = \"de\",\n Greek = \"el\",\n Kalaallisut = \"kl\",\n Guarani = \"gn\",\n Gujarati = \"gu\",\n Haitian = \"ht\",\n Hausa = \"ha\",\n Hebrew = \"he\",\n Herero = \"hz\",\n Hindi = \"hi\",\n HiriMotu = \"ho\",\n Hungarian = \"hu\",\n Icelandic = \"is\",\n Ido = \"io\",\n Igbo = \"ig\",\n Indonesian = \"id\",\n Interlingua = \"ia\",\n Interlingue = \"ie\",\n Inuktitut = \"iu\",\n Inupiaq = \"ik\",\n Irish = \"ga\",\n Italian = \"it\",\n Japanese = \"ja\",\n Javanese = \"jv\",\n Kannada = \"kn\",\n Kanuri = \"kr\",\n Kashmiri = \"ks\",\n Kazakh = \"kk\",\n CentralKhmer = \"km\",\n Kikuyu = \"ki\",\n Kinyarwanda = \"rw\",\n Kyrgyz = \"ky\",\n Komi = \"kv\",\n Kongo = \"kg\",\n Korean = \"ko\",\n Kuanyama = \"kj\",\n Kurdish = \"ku\",\n Lao = \"lo\",\n Latin = \"la\",\n Latvian = \"lv\",\n Limburgan = \"li\",\n Lingala = \"ln\",\n Lithuanian = \"lt\",\n LubaKatanga = \"lu\",\n Luxembourgish = \"lb\",\n Macedonian = \"mk\",\n Malagasy = \"mg\",\n Malay = \"ms\",\n Malayalam = \"ml\",\n Maltese = \"mt\",\n Manx = \"gv\",\n Maori = \"mi\",\n Marathi = \"mr\",\n Marshallese = \"mh\",\n Mongolian = \"mn\",\n Nauru = \"na\",\n Navajo = \"nv\",\n NorthNdebele = \"nd\",\n SouthNdebele = \"nr\",\n Ndonga = \"ng\",\n Nepali = \"ne\",\n Norwegian = \"no\",\n NorwegianBokmal = \"nb\",\n NorwegianNynorsk = \"nn\",\n SichuanYi = \"ii\",\n Occitan = \"oc\",\n Ojibwa = \"oj\",\n Oriya = \"or\",\n Oromo = \"om\",\n Ossetian = \"os\",\n Pali = \"pi\",\n Pashto = \"ps\",\n Persian = \"fa\",\n Polish = \"pl\",\n Portuguese = \"pt\",\n Punjabi = \"pa\",\n Quechua = \"qu\",\n Romansh = \"rm\",\n Romanian = \"ro\",\n Rundi = \"rn\",\n Russian = \"ru\",\n Samoan = \"sm\",\n Sango = \"sg\",\n Sanskrit = \"sa\",\n Sardinian = \"sc\",\n Serbian = \"sr\",\n Shona = \"sn\",\n Sindhi = \"sd\",\n Sinhala = \"si\",\n Slovak = \"sk\",\n Slovenian = \"sl\",\n Somali = \"so\",\n SouthernSotho = \"st\",\n Spanish = \"es\",\n Sundanese = \"su\",\n Swahili = \"sw\",\n Swati = \"ss\",\n Swedish = \"sv\",\n Tagalog = \"tl\",\n Tahitian = \"ty\",\n Tajik = \"tg\",\n Tamil = \"ta\",\n Tatar = \"tt\",\n Telugu = \"te\",\n Thai = \"th\",\n Tibetan = \"bo\",\n Tigrinya = \"ti\",\n Tonga = \"to\",\n Tsonga = \"ts\",\n Tswana = \"tn\",\n Turkish = \"tr\",\n Turkmen = \"tk\",\n Twi = \"tw\",\n Uighur = \"ug\",\n Ukrainian = \"uk\",\n Urdu = \"ur\",\n Uzbek = \"uz\",\n Venda = \"ve\",\n Vietnamese = \"vi\",\n Volapuk = \"vo\",\n Walloon = \"wa\",\n Welsh = \"cy\",\n Wolof = \"wo\",\n Xhosa = \"xh\",\n Yiddish = \"yi\",\n Yoruba = \"yo\",\n Zhuang = \"za\",\n Zulu = \"zu\",\n}\n\n/** Fast lookup set for enum values (lowercase 2-letter codes). */\nconst ISO_LANGUAGE_SET: ReadonlySet<string> = new Set<string>(\n Object.values(IsoLanguageCode)\n);\n\n/** Type guard: primary language must be one of the enum values. */\nexport function isIsoLanguageCode(value: unknown): value is IsoLanguageCode {\n return typeof value === \"string\" && ISO_LANGUAGE_SET.has(value.toLowerCase());\n}\n\n/**\n * Region validator per BCP 47:\n * - ISO 3166-1 alpha-2: 2 uppercase letters (e.g., GB, US)\n * - UN M.49 numeric: 3 digits (e.g., 419 for Latin America)\n *\n * NOTE: This validates *shape* not membership against the 3166 list.\n * If you want hard membership, we can add a Set of all alpha-2 regions.\n */\nexport function isRegionSubtag(value: string): boolean {\n return /^[A-Za-z]{2}$/.test(value) || /^\\d{3}$/.test(value);\n}\n\n/** Script subtag per ISO 15924: one capital + three lowercase (e.g., Latn, Cyrl, Hans). */\nexport function isScriptSubtag(value: string): boolean {\n return /^[A-Za-z]{4}$/.test(value);\n}\n\n/** Variant subtag per BCP 47: 5–8 alnum, or 4 starting with a digit. */\nexport function isVariantSubtag(value: string): boolean {\n return /^([0-9][A-Za-z0-9]{3}|[A-Za-z0-9]{5,8})$/.test(value);\n}\n\n/** Extension sequence: singleton (alnum except 'x') + one or more 2–8 alnum subtags. */\nexport function isExtensionSingleton(value: string): boolean {\n return /^[0-9A-WY-Za-wy-z]$/.test(value); // any alnum except 'x' (private-use)\n}\nexport function isExtensionSubtag(value: string): boolean {\n return /^[A-Za-z0-9]{2,8}$/.test(value);\n}\n\n/** Private-use subtag: 'x' then one or more 1–8 alnum subtags. */\nexport function isPrivateUseSingleton(value: string): boolean {\n return value.toLowerCase() === \"x\";\n}\nexport function isPrivateUseSubtag(value: string): boolean {\n return /^[A-Za-z0-9]{1,8}$/.test(value);\n}\n\n/**\n * Validates:\n * - plain language: \"en\"\n * - language + region: \"en-GB\"\n * - language + script + region: \"sr-Cyrl-RS\"\n * - language + variants: \"sl-rozaj-biske\", \"de-CH-1996\"\n * - extensions: \"en-GB-u-ca-gregory\"\n * - private-use: \"en-x-klingon\" or just \"x-piglatin\"\n *\n * Returns true only if the primary language is in IsoLanguageCode\n * and the rest of the tag conforms to BCP 47 structure.\n */\nexport function validateLanguage(value: unknown): boolean {\n if (typeof value !== \"string\" || value.length === 0) return false;\n\n const parts = value.split(\"-\");\n if (parts.some(part => part.length === 0)) return false;\n const lowerTag = value.toLowerCase();\n if (GRANDFATHERED_TAGS.has(lowerTag)) return true;\n if (parts[0]?.toLowerCase() === \"x\") {\n return parts.length > 1 && parts.slice(1).every(isPrivateUseSubtag);\n }\n let i = 0;\n\n // Supported RFC 5646 §2.2.1 subset: registered ISO 639-1 primaries and\n // three-letter primary shapes. Longer registered primaries require an IANA\n // registry dependency and are deliberately not claimed by this validator.\n const lang = parts[i];\n if (!lang || !/^[A-Za-z]{2,3}$/.test(lang)) return false;\n if (lang.length === 2 && !isIsoLanguageCode(lang)) return false;\n i += 1;\n\n // Up to three extlang subtags may follow a 2-3 letter primary.\n if (lang.length <= 3) {\n let extlangCount = 0;\n while (i < parts.length && extlangCount < 3 && /^[A-Za-z]{3}$/.test(parts[i]!)) {\n i += 1;\n extlangCount += 1;\n }\n }\n\n // 2) optional script\n if (i < parts.length && isScriptSubtag(parts[i] as string)) {\n i += 1;\n }\n\n // 3) optional region\n if (i < parts.length && isRegionSubtag((parts[i] as string).toUpperCase())) {\n // region must be uppercase if alpha; we normalize for check only\n i += 1;\n }\n\n // 4) zero or more variants\n const variants = new Set<string>();\n while (i < parts.length && isVariantSubtag((parts[i] as string))) {\n const variant = parts[i]!.toLowerCase();\n if (variants.has(variant)) return false;\n variants.add(variant);\n i += 1;\n }\n\n // 5) zero or more extensions\n // extension = singleton ; 2–8 ; ( ; 2–8 )*\n const extensionSingletons = new Set<string>();\n while (i < parts.length && isExtensionSingleton((parts[i] as string))) {\n const singleton = parts[i]!.toLowerCase();\n if (extensionSingletons.has(singleton)) return false;\n extensionSingletons.add(singleton);\n i += 1;\n // must have at least one following subtag of length 2–8\n if (!(i < parts.length && isExtensionSubtag(parts[i]!))) return false;\n while (i < parts.length && isExtensionSubtag(parts[i]!)) {\n i += 1;\n }\n }\n\n // 6) optional private-use: 'x' 1*('-' (1*8alnum))\n if (i < parts.length && isPrivateUseSingleton(parts[i]!)) {\n i += 1;\n if (!(i < parts.length && isPrivateUseSubtag(parts[i]!))) return false;\n while (i < parts.length && isPrivateUseSubtag(parts[i]!)) {\n i += 1;\n }\n }\n\n // no leftovers\n return i === parts.length;\n}\n\n/** RFC 5646 §2.1 grandfathered tags, matched case-insensitively. */\nconst GRANDFATHERED_TAGS: ReadonlySet<string> = new Set([\n \"art-lojban\", \"cel-gaulish\", \"en-gb-oed\", \"i-ami\", \"i-bnn\", \"i-default\",\n \"i-enochian\", \"i-hak\", \"i-klingon\", \"i-lux\", \"i-mingo\", \"i-navajo\",\n \"i-pwn\", \"i-tao\", \"i-tay\", \"i-tsu\", \"no-bok\", \"no-nyn\", \"sgn-be-fr\",\n \"sgn-be-nl\", \"sgn-ch-de\", \"zh-guoyu\", \"zh-hakka\", \"zh-min\", \"zh-min-nan\",\n \"zh-xiang\",\n]);\n","import { version } from \"os\";\nimport { FieldBuilder } from \"./field.builder.js\";\nimport { Infer } from \"./infer.js\";\nimport { SchemaShape } from \"./types.js\";\nimport {\n validateCountryCode,\n validateDateTimeISO,\n validateEmail,\n validatePhone,\n validateRichText,\n validateSafeText,\n validateSemVer,\n validateUrl,\n validateUUID,\n} from \"./validation/index.js\";\nimport { validateLanguage } from \"./validation/languageCode.BCP47.js\";\n\nexport const field = {\n string: () => new FieldBuilder<string>(\"string\"),\n number: () => new FieldBuilder<number>(\"number\"),\n boolean: () => new FieldBuilder<boolean>(\"boolean\"),\n object: <T extends Record<string, FieldBuilder>>(fields: T) =>\n new FieldBuilder<T>(\"object\", { shape: fields }),\n array: (itemType: FieldBuilder) => new FieldBuilder(\"array\", { itemType }),\n ref: <S extends SchemaShape>(refType: string) =>\n new FieldBuilder<Infer<S>>(\"ref\", { refType }),\n email: () =>\n new FieldBuilder<string>(\"string\")\n .validator(validateEmail)\n .PID({\n classification: \"high\",\n action: \"encrypt\",\n logHandling: \"redact\",\n purpose: \"an email address\",\n })\n .description(\"An email address\"),\n phone: () =>\n new FieldBuilder<string>(\"string\")\n .validator(validatePhone)\n .PID({\n classification: \"high\",\n action: \"encrypt\",\n logHandling: \"redact\",\n purpose: \"a phone number\",\n })\n .description(\"A phone number\"),\n url: () =>\n new FieldBuilder<string>(\"string\")\n .validator(validateUrl)\n .PID({\n classification: \"low\",\n action: \"hash\",\n logHandling: \"pseudonym\",\n purpose: \"a URL\",\n })\n .description(\"A URL\"),\n uuid: () =>\n new FieldBuilder<string>(\"string\")\n .PID({\n classification: \"low\",\n action: \"hash\",\n logHandling: \"pseudonym\",\n purpose: \"a UUID\",\n })\n .validator(validateUUID)\n .description(\"A UUID\"),\n dateTimeISO: () =>\n new FieldBuilder<string>(\"string\")\n .PID({\n classification: \"none\",\n action: \"none\",\n logHandling: \"plain\",\n purpose: \"a date string\",\n })\n .validator(validateDateTimeISO)\n .description(\"A date string in ISO 8601 format\"),\n dateISO: () =>\n new FieldBuilder<string>(\"string\")\n .PID({\n classification: \"none\",\n action: \"none\",\n logHandling: \"plain\",\n purpose: \"a date string\",\n })\n .validator((s) => validateDateTimeISO(s, { mode: \"date\" }))\n .description(\"A date string in ISO 8601 format (date only)\"),\n timeISO: () =>\n new FieldBuilder<string>(\"string\")\n .PID({\n classification: \"none\",\n action: \"none\",\n logHandling: \"plain\",\n purpose: \"a time string\",\n })\n .validator((s) => validateDateTimeISO(s, { mode: \"time\" }))\n .description(\"A time string in ISO 8601 format (time only)\"),\n richText: () =>\n new FieldBuilder<string>(\"string\")\n .PID({\n classification: \"low\",\n action: \"clear\",\n logHandling: \"omit\",\n purpose: \"rich text content\",\n })\n .validator(validateRichText)\n .description(\"Rich text content, may include basic HTML formatting\"),\n generalText: () =>\n new FieldBuilder<string>(\"string\")\n .PID({\n classification: \"none\",\n action: \"none\",\n logHandling: \"plain\",\n purpose: \"Plain text content\",\n })\n .validator(validateSafeText)\n .description(\"Standard text content, no HTML allowed\"),\n latitude: () =>\n new FieldBuilder<number>(\"number\")\n .PID({\n classification: \"low\",\n action: \"clear\",\n logHandling: \"omit\",\n purpose: \"Latitude in decimal degrees, WGS 84 (ISO 6709)\",\n })\n .min(-90)\n .max(90)\n .description(\"Latitude in decimal degrees, WGS 84 (ISO 6709)\"),\n longitude: () =>\n new FieldBuilder<number>(\"number\")\n .PID({\n classification: \"low\",\n action: \"clear\",\n logHandling: \"omit\",\n purpose: \"Longitude in decimal degrees, WGS 84 (ISO 6709)\",\n })\n .min(-180)\n .max(180)\n .description(\"Longitude in decimal degrees, WGS 84 (ISO 6709)\"),\n version: () =>\n new FieldBuilder<string>(\"string\")\n .validator(validateSemVer)\n .description(\"A semantic version string, e.g. '1.0.0'\"),\n countryCode: () =>\n new FieldBuilder<string>(\"string\")\n .validator(validateCountryCode)\n .description(\"An ISO 3166 country code, e.g. 'US', 'GB', 'FR'\"),\n languageCode: () =>\n new FieldBuilder<string>(\"string\")\n .validator(validateLanguage)\n .description(\n \"An BCP 47 structured language code, primarily ISO 639-1 and optionally with ISO 3166-1 alpha-2 country code, e.g. 'en', 'en-US', 'fr', 'fr-FR'\"\n ),\n};\n","import FieldBuilder, { type FieldExposure } from \"./field.builder.js\";\nimport { Infer } from \"./infer.js\";\nimport { PII, PIIAction, PIIClassification, PIILogHandling } from \"./pii.js\";\nimport type { FieldValidator, ValidationIssue } from \"./validation.types.js\";\n\nexport type FieldTypeMap = {\n string: string;\n number: number;\n boolean: boolean;\n object: Record<string, unknown>;\n \"string[]\": string[];\n \"number[]\": number[];\n \"boolean[]\": boolean[];\n \"object[]\": Record<string, unknown>[];\n ref: RefEntityId;\n \"ref[]\": RefEntityId[];\n};\n\nexport type FieldType = keyof FieldTypeMap;\n\nexport type PIIEnforcement = \"strict\" | \"warn\" | \"none\";\n\n/** Supported unknown-field policies in backwards-compatible order. */\nexport const SCHEMA_UNKNOWN_FIELDS_POLICIES = Object.freeze([\n \"strip\",\n \"reject\",\n] as const);\n\n/** Controls whether fields outside a schema shape are stripped or rejected. */\nexport type UnknownFieldsPolicy =\n (typeof SCHEMA_UNKNOWN_FIELDS_POLICIES)[number];\n\n/** Supported schema-identity policies in backwards-compatible order. */\nexport const SCHEMA_IDENTITY_POLICIES = Object.freeze([\n \"compatible\",\n \"exact\",\n] as const);\n\n/** Controls exact enforcement of a schema's declared type and version. */\nexport type SchemaIdentityPolicy =\n (typeof SCHEMA_IDENTITY_POLICIES)[number];\n\n// Schema-level upgrade support\n/** Result returned by a schema upgrade function. */\nexport type SchemaUpgradeResult = {\n ok: boolean;\n /** Upgraded entity (must include all required fields for the new schema). */\n value?: Record<string, any>;\n /** Optional human-readable errors if upgrade fails. */\n errors?: string[];\n};\n\n/**\n * A function that upgrades an entity from an older schema version to a newer one.\n * It should be **pure** and not mutate its arguments.\n */\nexport type SchemaUpgradeFunction = (\n input: Record<string, any>,\n ctx: {\n from: string; // entity.version (or 0.0.0 if missing)\n to: string; // schema.meta.version\n entityType: string;\n /** Describe function for the target schema – useful for dynamic migrations. */\n describe: () => {\n entityType: string;\n version: string;\n shape: Record<string, any>;\n };\n log?: (msg: string) => void;\n }\n) => SchemaUpgradeResult;\n\n// Support for cascading (multi-step) upgrades\nexport type SchemaUpgradeStep = {\n /** The target version this step upgrades to (e.g., \"1.1.0\"). */\n to: string;\n /** The migration function that upgrades from the previous step's version to `to`. */\n run: SchemaUpgradeFunction;\n};\n\n/**\n * Schema-level upgrade specification can be either:\n * - a single `SchemaUpgradeFunction` that handles any from->to, OR\n * - an ordered array of steps, each targeting a specific `to` version, which\n * will be applied sequentially to cascade from the oldest known version to the latest.\n */\nexport type SchemaUpgradeSpec = SchemaUpgradeFunction | SchemaUpgradeStep[];\n\n/**\n * Presence-only metadata supplied to a schema-level validator.\n *\n * Raw input values are intentionally withheld. `wasProvided` distinguishes\n * an omitted optional field from an explicitly supplied `null`/`undefined`.\n */\nexport interface SchemaValidationContext {\n readonly wasProvided: (fieldName: string) => boolean;\n}\n\nexport interface SchemaOptions {\n version?: string;\n table?: string;\n schemaValidator?: (\n value: any,\n context?: SchemaValidationContext,\n ) => boolean;\n piiEnforcement?: PIIEnforcement; // How should PII be enforced?\n /**\n * How validation handles properties not declared by the schema.\n *\n * `strip` preserves the historical behaviour. `reject` is intended for\n * trust boundaries where silently accepting extra data would be unsafe.\n */\n unknownFields?: UnknownFieldsPolicy;\n /**\n * `exact` rejects a mismatched `type` or `version` after any configured\n * upgrade. The backwards-compatible default validates only their field\n * shapes.\n */\n identity?: SchemaIdentityPolicy;\n schemaUpgrade?: SchemaUpgradeStep[] | SchemaUpgradeFunction | undefined; // Optional schema-level upgrader (single function or cascade steps)\n}\n\nexport interface SerializeOptions {\n includeInternal?: boolean;\n}\n\nexport type SchemaShape = Record<string, FieldBuilder<any>>;\n\nexport interface FieldDefinition<T = unknown> {\n type: FieldType;\n __valueType?: T;\n optional?: boolean;\n immutable?: boolean;\n description?: string;\n refType?: string;\n version?: string;\n deprecated?: boolean;\n deprecatedVersion?: string;\n system?: boolean;\n autoValidate?: boolean;\n refPolicy?: \"eager\" | \"lazy\";\n enum?: string[];\n _shape?: SchemaShape;\n pii?: PII;\n exposure?: FieldExposure;\n validator?: FieldValidator<T>;\n}\n\nexport interface ValidateCompositionOptions {\n resolveEntity: (type: string, id: string) => Promise<any | null>;\n validatorContext?: { visited: Set<string> };\n maxDepth?: number;\n log?: (msg: string) => void; // Optional for trace/debug\n onlyFields?: string[]; // NEW\n}\n\n\n\nexport interface Schema<T extends SchemaShape> {\n //// The shape of the schema.\n _shape: T;\n\n //// System metadata about the schema\n meta: { entityType: string; version: string };\n\n //// Methods for schema validation\n schemaValidator: (\n entity: Infer<T>,\n context?: SchemaValidationContext,\n ) => boolean;\n\n /**\n * Runs the optional schema-level upgrade function once, without validating.\n * Useful for offline migrations or testing migration logic.\n */\n upgrade(\n input: Record<string, any>,\n log?: (msg: string) => void\n ): {\n ok: boolean;\n value?: Record<string, any>;\n errors?: string[];\n };\n\n // Validate an input object against the schema\n validate: (\n input: unknown,\n existing?: Record<string, any>\n ) => ValidationResult<Infer<T>>;\n\n // Validate an input object against the schema, with options for composition validation\n validateComposition: (\n entity: Infer<T>,\n options: ValidateCompositionOptions\n ) => Promise<void>;\n\n serialize: (\n input: Record<string, any>,\n options?: SerializeOptions\n ) => Record<string, any>;\n\n //// Optional methods for schema metadata\n\n // Get the tableName for this schema\n tableName?: () => string | undefined; // Optional method to get the table name\n\n //// 🔒 Optional methods for PII handling\n\n // 🔒 Auto-prepare for read (decrypt PII)\n prepareForRead(\n stored: Record<string, any>,\n decryptFn: (value: string) => any | null\n ): Record<string, any>;\n\n // 🔒 Auto-prepare for storage (encrypt/hash PII)\n prepareForStorage(\n input: Record<string, any>,\n encryptFn: (value: any) => string,\n hashFn: (value: any) => string\n ): Record<string, any>;\n\n // 🔒 Sanitize data for logging (e.g., redact PII)\n sanitizeForLog(\n data: Record<string, any>,\n pseudonymFn: (value: any) => string\n ): Record<string, any>;\n\n // 🔒 Get PII audit information\n getPiiAudit(): Array<{\n field: string;\n classification: PIIClassification;\n action: PIIAction;\n logHandling?: PIILogHandling;\n purpose?: string;\n }> | null;\n\n // 🔒 Scrub PII for deletion (e.g., clear or hash sensitive data)\n scrubPiiForDelete(stored: Record<string, any>): Record<string, any>;\n\n describe(): {\n entityType: string;\n version: string;\n shape: Record<\n string,\n {\n type: FieldType;\n optional: boolean;\n immutable: boolean;\n description: string;\n version: string;\n deprecated: boolean;\n deprecatedVersion: string | null;\n system: boolean;\n enum: string[] | null;\n refType: string | null;\n pii: PII | null;\n exposure: FieldExposure;\n }\n >;\n };\n}\n\nexport type DeepReadonly<T> = {\n readonly [K in keyof T]: T[K] extends object\n ? T[K] extends (...args: any[]) => any\n ? T[K]\n : DeepReadonly<T[K]>\n : T[K];\n};\n\nexport interface ValidationResult<T> {\n valid: boolean;\n value?: DeepReadonly<T>;\n errors?: string[];\n issues?: ValidationIssue[];\n}\n\nexport type RefEntityId<T extends string = string> = {\n type: T;\n id: string;\n};\n","export type PIIClassification = \"none\" | \"low\" | \"high\";\n\nexport type PIIAction = \"encrypt\" | \"hash\" | \"clear\" | \"none\";\n\nexport type PIILogHandling = \"redact\" | \"omit\" | \"pseudonym\" | \"plain\";\n\nexport type PiiEnforcement = \"strict\" | \"warn\" | \"none\";\n\nexport interface PII {\n classification: PIIClassification;\n action: PIIAction;\n logHandling?: PIILogHandling; // How should this PII be handled in logs?\n purpose?: string; // optional, for audit: e.g. \"user contact\", \"analytics\"\n}\n\n/**\n * Centralized PII enforcement for field-level validation.\n * Returns { shortCircuit: true } when in strict mode and value is missing for high PII.\n */\nexport function enforcePIIField(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n enforcement: PiiEnforcement = \"none\",\n errors?: string[],\n logger?: { warn: (msg: string) => void }\n): { shortCircuit: boolean } {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (def?._pii?.classification === \"high\" && (def?.isRequired ?? true)) {\n const missing = value === undefined || value === null || value === \"\";\n if (missing) {\n const msg = `High PII field must not be empty: ${path}`;\n if (enforcement === \"strict\") {\n errors?.push(msg);\n return { shortCircuit: true };\n }\n if (enforcement === \"warn\") {\n logger?.warn?.(`WARN (PII Enforcement): ${msg}`);\n }\n }\n }\n return { shortCircuit: false };\n}\n\n/**\n * Apply storage-time PII transforms based on field definitions in shape.\n */\nexport function prepareForStorage(\n shape: Record<string, any>,\n input: Record<string, any>,\n encryptFn: (value: any) => string,\n hashFn: (value: any) => string\n): Record<string, any> {\n const build = (\n def: any,\n value: any,\n key: string,\n out: any,\n ctx: { parentKey?: string; isArrayItem?: boolean } = {}\n ) => {\n if (!def) return;\n const isMissing = value === undefined || value === null;\n\n // Leaf handling with PII transforms\n if (def._pii?.action === \"encrypt\") {\n if (!isMissing) out[key + \"Encrypted\"] = encryptFn(value);\n return;\n }\n if (def._pii?.action === \"hash\") {\n if (!isMissing) out[key + \"Hash\"] = hashFn(value);\n return;\n }\n if (def._pii?.action === \"clear\") {\n if (!isMissing) out[key] = null;\n return;\n }\n\n if (isMissing && def.isRequired === false) {\n return;\n }\n\n if (def.type === \"object\" && def._shape) {\n const obj: any = {};\n for (const [childKey, childDef] of Object.entries(def._shape)) {\n build(childDef, value?.[childKey], childKey, obj, { parentKey: key });\n }\n out[key] = obj;\n return;\n }\n\n if (def.type === \"array\" && def.itemType && Array.isArray(value)) {\n out[key] = value.map((item: any) => {\n const obj: any = {};\n // Use the array field name for primitive items; unwrap object items\n build(def.itemType, item, key, obj, {\n parentKey: key,\n isArrayItem: true,\n });\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n return obj[key];\n }\n return Object.keys(obj).length > 0 ? obj : item;\n });\n return;\n }\n\n if (def.type === \"ref\") {\n const ref: any = { ...value };\n const refShape = def._shape;\n if (refShape && value) {\n for (const [childKey, childDef] of Object.entries(refShape)) {\n build(childDef, value[childKey], childKey, ref, { parentKey: key });\n }\n }\n out[key] = ref;\n return;\n }\n\n out[key] = value;\n };\n\n const result: any = {};\n for (const key in shape) {\n build(shape[key], input?.[key], key, result);\n }\n return result;\n}\n\n/**\n * Apply read-time PII transforms (e.g., decrypt) based on field definitions in shape.\n */\nexport function prepareForRead(\n shape: Record<string, any>,\n stored: Record<string, any>,\n decryptFn: (value: string) => any\n): Record<string, any> {\n const readValue = (\n def: any,\n key: string,\n container: any,\n ctx: { parentKey?: string; isArrayItem?: boolean } = {}\n ): any => {\n if (!def) return container?.[key];\n const action = def._pii?.action;\n const hasValue =\n container !== undefined &&\n container !== null &&\n Object.prototype.hasOwnProperty.call(container, key);\n if (action === \"encrypt\") {\n const enc =\n container?.[key + \"Encrypted\"] ??\n container?.[`${ctx.parentKey ?? key}Encrypted`];\n return enc === undefined ? undefined : decryptFn(enc);\n }\n if (action === \"hash\") {\n const h =\n container?.[key + \"Hash\"] ?? container?.[`${ctx.parentKey ?? key}Hash`];\n return h === undefined ? undefined : h;\n }\n if (action === \"clear\")\n return container?.hasOwnProperty(key) ? null : undefined;\n if (!hasValue && def.isRequired === false) {\n return undefined;\n }\n\n if (def.type === \"object\" && def._shape) {\n const obj: any = {};\n const source =\n container && Object.prototype.hasOwnProperty.call(container, key)\n ? container[key]\n : container ?? {};\n for (const [childKey, childDef] of Object.entries(def._shape)) {\n const child = readValue(childDef, childKey, source);\n if (child !== undefined) {\n obj[childKey] = child;\n }\n }\n return obj;\n }\n\n if (def.type === \"array\" && def.itemType) {\n const arr = container?.[key];\n if (!Array.isArray(arr)) return arr;\n return arr.map((item: any) =>\n readValue(def.itemType, key, item, { parentKey: key, isArrayItem: true })\n );\n }\n\n if (def.type === \"ref\") {\n const ref = { ...(container?.[key] ?? {}) };\n const refShape = def._shape;\n if (refShape) {\n for (const [childKey, childDef] of Object.entries(refShape)) {\n const child = readValue(childDef, childKey, ref);\n if (child !== undefined) {\n ref[childKey] = child;\n }\n }\n }\n return ref;\n }\n\n return container?.[key];\n };\n\n const result: any = {};\n for (const key in shape) {\n const value = readValue(shape[key], key, stored);\n if (value !== undefined) {\n result[key] = value;\n }\n }\n return result;\n}\n\n/**\n * Sanitize data for logging according to PII logHandling.\n */\nexport function sanitizeForLog(\n shape: Record<string, any>,\n data: Record<string, any>,\n pseudonymFn: (value: any) => string\n): Record<string, any> {\n const visit = (\n def: any,\n value: any,\n ctx: { parentKey?: string } = {}\n ): any => {\n if (!def) return undefined;\n if (\n (value === undefined || value === null) &&\n def.isRequired === false\n ) {\n return undefined;\n }\n const handling = def._pii?.logHandling as PIILogHandling | undefined;\n if (handling === \"omit\") return undefined;\n if (handling === \"redact\") return \"[REDACTED]\";\n if (handling === \"pseudonym\") return pseudonymFn(value);\n\n if (def.type === \"object\" && def._shape) {\n const obj: any = {};\n const src = value ?? {};\n for (const [k, childDef] of Object.entries(def._shape)) {\n const child = visit(childDef, src[k], { parentKey: k });\n if (child !== undefined) obj[k] = child;\n }\n return obj;\n }\n\n if (def.type === \"array\" && def.itemType) {\n if (!Array.isArray(value)) return undefined;\n const arr = value\n .map((v: any) => visit(def.itemType, v, { parentKey: ctx.parentKey }))\n .filter((v) => v !== undefined);\n return arr;\n }\n\n if (def.type === \"ref\") {\n const ref: any = value ? { type: value.type, id: value.id } : {};\n const refShape = def._shape;\n const src = value ?? {};\n if (refShape) {\n for (const [k, childDef] of Object.entries(refShape)) {\n const child = visit(childDef, src[k]);\n if (child !== undefined) ref[k] = child;\n }\n } else if (value) {\n // no nested shape: keep original ref fields\n ref.type = value.type;\n ref.id = value.id;\n }\n return ref;\n }\n\n return value;\n };\n\n const output: any = {};\n for (const key in shape) {\n const child = visit(shape[key], data?.[key]);\n if (child !== undefined) output[key] = child;\n }\n return output;\n}\n\n/**\n * Produce a PII audit list for the given shape.\n */\nexport function getPiiAudit(shape: Record<string, any>): Array<{\n field: string;\n classification: PIIClassification;\n action: PIIAction;\n logHandling?: PIILogHandling;\n purpose?: string;\n}> {\n const piiFields: Array<any> = [];\n const visit = (def: any, path: string) => {\n if (!def) return;\n if (def._pii && def._pii.classification !== \"none\") {\n piiFields.push({\n field: path,\n classification: def._pii.classification,\n action: def._pii.action,\n logHandling: def._pii.logHandling,\n purpose: def._pii.purpose,\n });\n }\n\n if ((def.type === \"object\" || def.type === \"ref\") && def._shape) {\n for (const [childKey, childDef] of Object.entries(def._shape)) {\n visit(childDef, `${path}.${childKey}`);\n }\n }\n\n if (def.type === \"array\" && def.itemType) {\n const itemPath = `${path}[]`;\n if (\n (def.itemType.type === \"object\" || def.itemType.type === \"ref\") &&\n def.itemType._shape\n ) {\n for (const [childKey, childDef] of Object.entries(\n def.itemType._shape,\n )) {\n visit(childDef, `${itemPath}.${childKey}`);\n }\n } else {\n visit(def.itemType, itemPath);\n }\n }\n };\n\n for (const key in shape) {\n visit(shape[key], key);\n }\n return piiFields;\n}\n\n/**\n * Scrub PII fields for delete/retention workflows.\n */\nexport function scrubPiiForDelete(\n shape: Record<string, any>,\n stored: Record<string, any>\n): Record<string, any> {\n const result: any = Array.isArray(stored) ? [...stored] : { ...stored };\n\n const setAtPath = (target: any, path: Array<string | number>, val: any) => {\n let cur = target;\n for (let i = 0; i < path.length - 1; i++) {\n const p = path[i];\n if (p === undefined) return;\n if (cur[p] === undefined) {\n const next = path[i + 1];\n cur[p] = typeof next === \"number\" ? [] : {};\n }\n cur = cur[p];\n }\n const last = path[path.length - 1];\n if (last === undefined) return;\n cur[last] = val;\n };\n\n const visit = (\n def: any,\n host: any,\n path: Array<string | number>,\n keyName: string | number\n ) => {\n if (!def) return;\n\n const applyPath = (targetKey: string) => {\n const last = path[path.length - 1];\n if (last === undefined) return;\n if (typeof last === \"number\") {\n setAtPath(result, [...path, targetKey], null);\n } else {\n setAtPath(result, [...path.slice(0, -1), targetKey], null);\n }\n };\n\n if (def._pii?.action === \"encrypt\") {\n const targetKey = `${keyName}Encrypted`;\n if (host && Object.prototype.hasOwnProperty.call(host, targetKey)) {\n applyPath(targetKey);\n }\n return;\n }\n if (def._pii?.action === \"hash\") {\n const targetKey = `${keyName}Hash`;\n if (host && Object.prototype.hasOwnProperty.call(host, targetKey)) {\n applyPath(targetKey);\n }\n return;\n }\n if (def._pii?.action === \"clear\") {\n if (host && Object.prototype.hasOwnProperty.call(host, keyName)) {\n setAtPath(result, path, null);\n }\n return;\n }\n\n if (def.type === \"object\" && def._shape) {\n const obj =\n host && Object.prototype.hasOwnProperty.call(host, keyName)\n ? host[keyName]\n : host;\n for (const [k, childDef] of Object.entries(def._shape)) {\n visit(childDef, obj, [...path, k], k);\n }\n return;\n }\n\n if (def.type === \"array\" && def.itemType) {\n const arr = host?.[keyName];\n if (Array.isArray(arr)) {\n arr.forEach((item, idx) =>\n visit(def.itemType, item, [...path, idx], keyName)\n );\n }\n return;\n }\n\n if (def.type === \"ref\") {\n const refShape = def._shape;\n const ref = host?.[keyName];\n if (refShape && ref) {\n for (const [k, childDef] of Object.entries(refShape)) {\n visit(childDef, ref, [...path, k], k);\n }\n }\n }\n };\n\n for (const key in shape) {\n visit(shape[key], stored, [key], key);\n }\n\n return result;\n}\n","import { Infer } from \"./infer.js\";\nimport {\n FieldType,\n Schema,\n SchemaOptions,\n SchemaShape,\n PIIEnforcement,\n SchemaValidationContext,\n SchemaUpgradeResult,\n SchemaUpgradeSpec,\n SCHEMA_IDENTITY_POLICIES,\n SCHEMA_UNKNOWN_FIELDS_POLICIES,\n SerializeOptions,\n} from \"./types.js\";\nimport type {\n FieldValidatorResult,\n ValidationIssue,\n ValidationIssueInput,\n} from \"./validation.types.js\";\nimport { field } from \"./field.js\";\nimport { PIIAction, PIIClassification, PIILogHandling } from \"./pii.js\";\nimport {\n enforcePIIField,\n prepareForStorage as piiPrepareForStorage,\n prepareForRead as piiPrepareForRead,\n sanitizeForLog as piiSanitizeForLog,\n getPiiAudit as piiGetPiiAudit,\n scrubPiiForDelete as piiScrubPiiForDelete,\n} from \"./pii.js\";\nimport { FieldBuilder } from \"./field.builder.js\";\nimport { validateSemVer } from \"./validation/version.SEMVER2.0.0.js\";\n\nconst globalSchemaRegistry = new Map<string, Schema<any>>();\n\nfunction deepClone<T>(value: T): T {\n const seen = new WeakMap();\n const cloneAny = (val: any): any => {\n if (val === null || typeof val !== \"object\") return val;\n if (seen.has(val)) throw new TypeError(\"Cannot clone circular structures\");\n if (val instanceof Date) return new Date(val.getTime());\n if (Array.isArray(val)) {\n const arr: any[] = [];\n seen.set(val, arr);\n val.forEach((item) => arr.push(cloneAny(item)));\n return arr;\n }\n const out: any = {};\n seen.set(val, out);\n for (const [k, v] of Object.entries(val)) out[k] = cloneAny(v);\n return out;\n };\n return cloneAny(value);\n}\n\nfunction shouldIncludeField(def: any, options: SerializeOptions): boolean {\n return options.includeInternal === true || (def?._exposure ?? \"public\") !== \"internal\";\n}\n\nfunction serializeFieldValue(\n def: any,\n value: any,\n options: SerializeOptions\n): any {\n if (value === undefined) {\n return undefined;\n }\n\n if (value === null) {\n return null;\n }\n\n switch (def?.type) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n return deepClone(value);\n case \"ref\": {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return deepClone(value);\n }\n\n const shape = getShape(def);\n if (!shape || Object.keys(shape).length === 0) {\n return deepClone(value);\n }\n\n const serializedRef: Record<string, any> = {};\n if (typeof value.type === \"string\") {\n serializedRef.type = value.type;\n }\n if (typeof value.id === \"string\") {\n serializedRef.id = value.id;\n }\n\n for (const [childKey, childDef] of Object.entries(shape)) {\n if (!shouldIncludeField(childDef, options)) {\n continue;\n }\n if (!Object.prototype.hasOwnProperty.call(value, childKey)) {\n continue;\n }\n\n const serializedChild = serializeFieldValue(\n childDef,\n value[childKey],\n options\n );\n if (serializedChild !== undefined) {\n serializedRef[childKey] = serializedChild;\n }\n }\n\n return serializedRef;\n }\n case \"object\": {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return deepClone(value);\n }\n\n const shape = getShape(def);\n if (!shape || Object.keys(shape).length === 0) {\n return deepClone(value);\n }\n\n const serializedObject: Record<string, any> = {};\n for (const [childKey, childDef] of Object.entries(shape)) {\n if (!shouldIncludeField(childDef, options)) {\n continue;\n }\n if (!Object.prototype.hasOwnProperty.call(value, childKey)) {\n continue;\n }\n\n const serializedChild = serializeFieldValue(\n childDef,\n value[childKey],\n options\n );\n if (serializedChild !== undefined) {\n serializedObject[childKey] = serializedChild;\n }\n }\n\n return serializedObject;\n }\n case \"array\": {\n if (!Array.isArray(value)) {\n return deepClone(value);\n }\n\n if (!def.itemType) {\n return deepClone(value);\n }\n\n return value.map((item) => serializeFieldValue(def.itemType, item, options));\n }\n default:\n return deepClone(value);\n }\n}\n\nfunction cmpSemver(a: string, b: string): number {\n const pa = a.split(\".\").map((n) => parseInt(n, 10));\n const pb = b.split(\".\").map((n) => parseInt(n, 10));\n for (let i = 0; i < 3; i++) {\n const ai = pa[i] ?? 0;\n const bi = pb[i] ?? 0;\n if (ai > bi) return 1;\n if (ai < bi) return -1;\n }\n return 0;\n}\n\n// ──────────────────────────────────────────────────────────────────────────────\n// Helper: apply schema upgrade using SchemaUpgradeSpec (function or cascading steps)\n// ──────────────────────────────────────────────────────────────────────────────\nfunction applySchemaUpgrade(\n spec: SchemaUpgradeSpec,\n input: Record<string, any>,\n ctx: {\n from: string;\n to: string;\n entityType: string;\n describe: () => { entityType: string; version: string; shape: Record<string, any> };\n log?: (msg: string) => void;\n }\n): SchemaUpgradeResult {\n // Single universal upgrader\n if (typeof spec === \"function\") {\n return spec(input, ctx);\n }\n\n // Cascading steps: sort by target version, then apply those between from..to\n const steps = [...spec].sort((s1, s2) => cmpSemver(s1.to, s2.to));\n let working: Record<string, any> = { ...input };\n let fromVersion = ctx.from;\n\n for (const step of steps) {\n // Apply step if it advances beyond current `from` and does not exceed target `to`\n if (cmpSemver(fromVersion, step.to) < 0 && cmpSemver(step.to, ctx.to) <= 0) {\n ctx.log?.(`Upgrading entity from v${fromVersion} → v${step.to}`);\n const res = step.run(working, { ...ctx, from: fromVersion, to: step.to });\n if (!res || res.ok !== true || !res.value) {\n return {\n ok: false,\n errors: res?.errors?.length\n ? res.errors\n : [`Failed to upgrade entity from v${fromVersion} to v${step.to}`],\n };\n }\n working = res.value;\n fromVersion = step.to;\n }\n }\n\n // If no steps applied or we stopped before ctx.to, the caller will normalize type/version.\n return { ok: true, value: working };\n}\n\nfunction validateEnum(\n parentKey: string,\n value: any,\n enumValues?: Array<string | number>\n): string | undefined {\n if (!enumValues) return;\n\n const values = Array.isArray(enumValues)\n ? enumValues\n : Array.from(enumValues);\n\n if (Array.isArray(value)) {\n const invalid = value.filter((v) => !values.includes(v));\n if (invalid.length > 0) {\n return `Field ${parentKey} must contain only: ${values.join(\", \")}`;\n }\n } else {\n if (!values.includes(value)) {\n return `Field ${parentKey} must be one of: ${values.join(\", \")}`;\n }\n }\n}\n\n// Helper: some builders may store enum/optional/validator under different keys\n// schema.ts\nfunction getEnumValues(def: any): Array<string | number> | undefined {\n const src = Array.isArray(def?.enum)\n ? def.enum\n : Array.isArray(def?.enumValues)\n ? def.enumValues\n : Array.isArray(def?._enum)\n ? def._enum\n : Array.isArray(def?._enumValues)\n ? def._enumValues\n : def?._enumSet instanceof Set\n ? Array.from(def._enumSet)\n : undefined;\n\n if (!src) return undefined;\n const ok = src.every(\n (v: unknown) => typeof v === \"string\" || typeof v === \"number\"\n );\n return ok ? (src as Array<string | number>) : undefined;\n}\n\n// Apply default value when provided and input is nullish\nfunction applyDefault(\n def: any,\n current: any\n): { value: any; applied: boolean } {\n if (\n (current === undefined || current === null) &&\n typeof def?.getDefault === \"function\"\n ) {\n const next = def.getDefault();\n if (next !== undefined) {\n return { value: next, applied: true };\n }\n }\n return { value: current, applied: false };\n}\n\nfunction isOptional(def: any): boolean {\n return def?.isRequired === false;\n}\n\nfunction getValidator(def: any): ((v: any) => FieldValidatorResult) | undefined {\n return def?._validator ?? undefined;\n}\n\nfunction getShape(def: any): Record<string, any> | undefined {\n return def?._shape ?? def?.shape ?? undefined;\n}\n\nconst MAX_STRICT_VALIDATION_NODES = 10_000;\nconst MAX_STRICT_VALIDATION_DEPTH = 256;\nconst MAX_STRICT_VALIDATION_OBJECTS = MAX_STRICT_VALIDATION_NODES;\n\nfunction strictInputIsWithinComplexityLimit(input: unknown): boolean {\n const pending: Array<{ value: unknown; depth: number }> = [\n { value: input, depth: 0 },\n ];\n const seen = new WeakSet<object>();\n let visitedNodes = 0;\n\n try {\n while (pending.length > 0) {\n const current = pending.pop();\n if (!current) {\n continue;\n }\n visitedNodes += 1;\n if (\n visitedNodes > MAX_STRICT_VALIDATION_NODES ||\n current.depth > MAX_STRICT_VALIDATION_DEPTH\n ) {\n return false;\n }\n if (\n typeof current.value !== \"object\" ||\n current.value === null\n ) {\n continue;\n }\n if (seen.has(current.value)) {\n return false;\n }\n seen.add(current.value);\n\n const keys = Object.keys(current.value);\n if (\n visitedNodes + pending.length + keys.length >\n MAX_STRICT_VALIDATION_NODES\n ) {\n return false;\n }\n const record = current.value as Record<string, unknown>;\n for (const key of keys) {\n pending.push({\n value: record[key],\n depth: current.depth + 1,\n });\n }\n }\n } catch {\n return false;\n }\n\n return true;\n}\n\ninterface UnknownFieldScanState {\n remainingObjects: number;\n limitExceeded: boolean;\n}\n\nfunction strictReferenceShape(def: any): Record<string, any> {\n return {\n type: { type: \"string\" },\n id: { type: \"string\" },\n ...(getShape(def) ?? {}),\n };\n}\n\nfunction unknownFieldLocations(\n value: unknown,\n shape: Record<string, any>,\n location = \"root\",\n state: UnknownFieldScanState = {\n remainingObjects: MAX_STRICT_VALIDATION_OBJECTS,\n limitExceeded: false,\n },\n): string[] {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return [];\n }\n if (state.remainingObjects <= 0) {\n state.limitExceeded = true;\n return [];\n }\n state.remainingObjects -= 1;\n\n const record = value as Record<string, unknown>;\n const knownKeys = new Set(Object.keys(shape));\n const locations = new Set<string>();\n\n if (Object.keys(record).some((key) => !knownKeys.has(key))) {\n locations.add(location);\n }\n\n for (const [key, def] of Object.entries(shape)) {\n const child = record[key];\n if (child === undefined || child === null) {\n continue;\n }\n\n const childLocation = location === \"root\" ? key : `${location}.${key}`;\n const childShape = getShape(def);\n if ((def as any)?.type === \"object\" && childShape) {\n for (const nestedLocation of unknownFieldLocations(\n child,\n childShape,\n childLocation,\n state,\n )) {\n locations.add(nestedLocation);\n }\n continue;\n }\n\n const itemType = (def as any)?.itemType;\n if (\n (def as any)?.type === \"array\" &&\n (itemType?.type === \"object\" || itemType?.type === \"ref\") &&\n Array.isArray(child)\n ) {\n const itemShape =\n itemType.type === \"ref\"\n ? strictReferenceShape(itemType)\n : getShape(itemType);\n if (!itemShape) {\n continue;\n }\n for (const [index, item] of child.entries()) {\n if (state.limitExceeded) {\n break;\n }\n for (const nestedLocation of unknownFieldLocations(\n item,\n itemShape,\n `${childLocation}[${index}]`,\n state,\n )) {\n locations.add(nestedLocation);\n }\n }\n continue;\n }\n\n if ((def as any)?.type === \"ref\") {\n for (const nestedLocation of unknownFieldLocations(\n child,\n strictReferenceShape(def),\n childLocation,\n state,\n )) {\n locations.add(nestedLocation);\n }\n }\n }\n\n return [...locations];\n}\n\nfunction normalizeValidationIssue(\n path: string,\n issue: string | ValidationIssueInput,\n defaultCode: string\n): ValidationIssue {\n if (typeof issue === \"string\") {\n return {\n path,\n code: defaultCode,\n message: issue,\n };\n }\n\n return {\n path: issue.path ?? path,\n code: issue.code || defaultCode,\n message: issue.message,\n };\n}\n\nfunction normalizeValidatorIssues(\n path: string,\n result: FieldValidatorResult,\n defaultCode: string\n): ValidationIssue[] {\n if (result === true) {\n return [];\n }\n\n if (result === false) {\n return [\n {\n path,\n code: defaultCode,\n message: `Invalid value for field: ${path}`,\n },\n ];\n }\n\n if (Array.isArray(result)) {\n return result.map((issue) => normalizeValidationIssue(path, issue, defaultCode));\n }\n\n return [normalizeValidationIssue(path, result, defaultCode)];\n}\n\n// ──────────────────────────────────────────────────────────────────────────────\n// Validation helpers (extracted from validate())\n// ──────────────────────────────────────────────────────────────────────────────\n\nfunction checkMissingRequired(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n errors: string[]\n): { missing: boolean } {\n if (value === undefined || value === null) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (!isOptional(def)) {\n errors.push(`Missing required field: ${path}`);\n }\n return { missing: true };\n }\n return { missing: false };\n}\n\nfunction checkImmutable(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n existing: Record<string, any> | undefined,\n errors: string[]\n): { immutableViolation: boolean } {\n if (\n def.isImmutable &&\n existing &&\n existing[key] !== undefined &&\n value !== existing[key]\n ) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n errors.push(`Field is immutable: ${path}`);\n return { immutableViolation: true };\n }\n return { immutableViolation: false };\n}\n\nfunction runCustomValidator(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n errors: string[],\n issues?: ValidationIssue[]\n): { invalid: boolean } {\n const validator = getValidator(def);\n if (validator && value !== undefined && value !== null) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n const normalizedIssues = normalizeValidatorIssues(path, validator(value), \"invalid_value\");\n if (normalizedIssues.length > 0) {\n errors.push(...normalizedIssues.map((issue) => issue.message));\n if (issues) {\n issues.push(...normalizedIssues);\n }\n return { invalid: true };\n }\n }\n return { invalid: false };\n}\n\nfunction validateStringField(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n errors: string[]\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (typeof value !== \"string\") {\n errors.push(`Field ${path} must be string`);\n return;\n }\n\n const enumValues = getEnumValues(def);\n if (Array.isArray(enumValues)) {\n const enumError = validateEnum(path, value, enumValues);\n if (enumError) {\n errors.push(enumError);\n }\n }\n}\n\nfunction validateNumberField(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n errors: string[]\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (typeof value !== \"number\") {\n errors.push(`Field ${path} must be number`);\n return;\n }\n\n const enumValues = getEnumValues(def);\n if (Array.isArray(enumValues)) {\n const enumError = validateEnum(path, value, enumValues);\n if (enumError) {\n errors.push(enumError);\n }\n }\n}\n\nfunction validateBooleanField(\n parentKey: string,\n key: string,\n value: any,\n _def: any,\n errors: string[]\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (typeof value !== \"boolean\") {\n errors.push(`Field ${path} must be boolean`);\n }\n}\n\nfunction validateObjectChildren(\n parentKey: string,\n obj: any,\n shape: Record<string, any>,\n errors: string[],\n issues: ValidationIssue[],\n existing: Record<string, any> | undefined,\n piiEnforcement: PIIEnforcement,\n logger?: { warn: (msg: string) => void }\n) {\n for (const [childKey, childDef] of Object.entries(shape) as [\n string,\n FieldBuilder<any>\n ][]) {\n let childValue = obj[childKey];\n const existingChild =\n existing && typeof existing === \"object\" ? (existing as any)[childKey] : undefined;\n\n // Apply defaults before required checks\n const { value: withDefault, applied } = applyDefault(childDef, childValue);\n if (applied) {\n obj[childKey] = withDefault;\n childValue = withDefault;\n }\n\n // Required check\n const { missing } = checkMissingRequired(\n parentKey,\n childKey,\n childValue,\n childDef,\n errors\n );\n if (missing) continue;\n\n const { immutableViolation } = checkImmutable(\n parentKey,\n childKey,\n childValue,\n childDef,\n existing,\n errors\n );\n if (immutableViolation) continue;\n\n const { shortCircuit } = enforcePIIField(\n parentKey,\n childKey,\n childValue,\n childDef,\n piiEnforcement,\n errors,\n logger\n );\n if (shortCircuit) continue;\n\n // Custom validator (per-field)\n const { invalid } = runCustomValidator(\n parentKey,\n childKey,\n childValue,\n childDef,\n errors,\n issues\n );\n if (invalid) continue;\n\n // Type-specific validation (string/number/boolean/object/array/ref)\n // This will recurse into nested objects via validateObjectField → validateObjectChildren\n validateByType(\n parentKey,\n childKey,\n childValue,\n childDef,\n errors,\n issues,\n existingChild,\n piiEnforcement,\n logger\n );\n }\n}\n\nfunction validateObjectField(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n errors: string[],\n issues: ValidationIssue[],\n existing: Record<string, any> | undefined,\n piiEnforcement: PIIEnforcement,\n logger?: { warn: (msg: string) => void }\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n errors.push(`Field ${path} must be object`);\n return;\n }\n const objShape = getShape(def);\n if (objShape)\n validateObjectChildren(path, value, objShape, errors, issues, existing, piiEnforcement, logger);\n}\n\nfunction validateArrayOfStrings(\n parentKey: string,\n key: string,\n arr: any[],\n itemDef: any,\n errors: string[]\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (!arr.every((v) => typeof v === \"string\")) {\n errors.push(`Field ${path} must be string[]`);\n return;\n }\n const enumValues = getEnumValues(itemDef);\n if (Array.isArray(enumValues)) {\n const enumError = validateEnum(path, arr, enumValues);\n if (enumError) {\n errors.push(enumError);\n }\n }\n\n const validator = getValidator(itemDef);\n if (validator) {\n arr.forEach((v, idx) => {\n if (!validator(v)) {\n errors.push(`Invalid value for field: ${path}[${idx}]`);\n }\n });\n }\n}\n\nfunction validateArrayOfNumbers(\n parentKey: string,\n key: string,\n arr: any[],\n itemDef: any,\n errors: string[]\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (!arr.every((v) => typeof v === \"number\")) {\n errors.push(`Field ${path} must be number[]`);\n }\n\n const enumValues = getEnumValues(itemDef);\n if (Array.isArray(enumValues)) {\n const enumError = validateEnum(path, arr, enumValues);\n if (enumError) {\n errors.push(enumError);\n }\n }\n\n const validator = getValidator(itemDef);\n if (validator) {\n arr.forEach((v, idx) => {\n if (!validator(v)) {\n errors.push(`Invalid value for field: ${path}[${idx}]`);\n }\n });\n }\n}\n\nfunction validateArrayOfBooleans(\n parentKey: string,\n key: string,\n arr: any[],\n _itemDef: any,\n errors: string[]\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (!arr.every((v) => typeof v === \"boolean\")) {\n errors.push(`Field ${path} must be boolean[]`);\n }\n\n const validator = getValidator(_itemDef);\n if (validator) {\n arr.forEach((v, idx) => {\n if (!validator(v)) {\n errors.push(`Invalid value for field: ${path}[${idx}]`);\n }\n });\n }\n}\n\nfunction validateArrayOfObjects(\n parentKey: string,\n key: string,\n arr: any[],\n itemDef: any,\n errors: string[],\n issues: ValidationIssue[],\n existing: any,\n piiEnforcement: PIIEnforcement,\n logger?: { warn: (msg: string) => void }\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n\n if (\n !Array.isArray(arr) ||\n !arr.every((v) => typeof v === \"object\" && v !== null && !Array.isArray(v))\n ) {\n errors.push(`Field ${path} must be object[]`);\n return;\n }\n\n const itemShape = getShape(itemDef);\n if (!itemShape) return;\n\n arr.forEach((item, idx) => {\n const itemParent = `${path}[${idx}]`;\n const existingItem = Array.isArray(existing) ? existing[idx] : undefined;\n for (const [childKey, childDef] of Object.entries(itemShape) as [\n string,\n FieldBuilder<any>\n ][]) {\n let childValue = (item as any)[childKey];\n const existingChild =\n existingItem && typeof existingItem === \"object\"\n ? (existingItem as any)[childKey]\n : undefined;\n\n const { value: withDefault, applied } = applyDefault(\n childDef,\n childValue\n );\n if (applied) {\n (item as any)[childKey] = withDefault;\n childValue = withDefault;\n }\n\n // Required check (path-aware)\n const { missing } = checkMissingRequired(\n itemParent,\n childKey,\n childValue,\n childDef,\n errors\n );\n if (missing) continue;\n\n const { immutableViolation } = checkImmutable(\n itemParent,\n childKey,\n childValue,\n childDef,\n existingItem,\n errors\n );\n if (immutableViolation) continue;\n\n const { shortCircuit } = enforcePIIField(\n itemParent,\n childKey,\n childValue,\n childDef,\n piiEnforcement,\n errors,\n logger\n );\n if (shortCircuit) continue;\n\n // Custom validator (path-aware)\n const { invalid } = runCustomValidator(\n itemParent,\n childKey,\n childValue,\n childDef,\n errors,\n issues\n );\n if (invalid) continue;\n\n // Type-specific validation (recurses into nested object/array/ref)\n validateByType(\n itemParent,\n childKey,\n childValue,\n childDef,\n errors,\n issues,\n existingChild,\n piiEnforcement,\n logger\n );\n }\n });\n}\n\nfunction validateArrayField(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n errors: string[],\n issues: ValidationIssue[],\n existing: any,\n piiEnforcement: PIIEnforcement,\n logger?: { warn: (msg: string) => void }\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (!Array.isArray(value)) {\n errors.push(`Field ${key} must be an array`);\n return;\n }\n const itemType = def.itemType?.type;\n if (itemType === \"string\")\n return validateArrayOfStrings(parentKey, key, value, def.itemType, errors);\n if (itemType === \"number\")\n return validateArrayOfNumbers(parentKey, key, value, def.itemType, errors);\n if (itemType === \"boolean\")\n return validateArrayOfBooleans(parentKey, key, value, def.itemType, errors);\n if (itemType === \"object\")\n return validateArrayOfObjects(\n parentKey,\n key,\n value,\n def.itemType,\n errors,\n issues,\n existing,\n piiEnforcement,\n logger\n );\n if (itemType === \"ref\") {\n const expectedType = (def.itemType as any).refType;\n value.forEach((ref: any, idx: number) => {\n if (\n !ref ||\n typeof ref !== \"object\" ||\n ref === null ||\n typeof ref.type !== \"string\" ||\n typeof ref.id !== \"string\" ||\n (expectedType && ref.type !== expectedType)\n ) {\n errors.push(\n `Field ${path}[${idx}] must be a reference object with type: ${expectedType}`\n );\n }\n });\n const refShape = getShape(def.itemType);\n if (refShape) {\n const existingRefs = Array.isArray(existing) ? existing : [];\n value.forEach((ref: any, idx: number) => {\n if (ref && typeof ref === \"object\" && ref !== null) {\n const existingRef = existingRefs[idx];\n for (const [childKey, childDef] of Object.entries(refShape) as [\n string,\n FieldBuilder<any>\n ][]) {\n const childPath = `${path}[${idx}].${childKey}`;\n let childValue = ref[childKey];\n const existingChild =\n existingRef && typeof existingRef === \"object\"\n ? (existingRef as any)[childKey]\n : undefined;\n const { value: withDefault, applied } = applyDefault(\n childDef,\n childValue\n );\n if (applied) {\n ref[childKey] = withDefault;\n childValue = withDefault;\n }\n if (\n (childValue === undefined || childValue === null) &&\n !isOptional(childDef)\n ) {\n errors.push(`Missing required field: ${childPath}`);\n continue;\n }\n\n const { immutableViolation } = checkImmutable(\n `${path}[${idx}]`,\n childKey,\n childValue,\n childDef,\n existingRef,\n errors\n );\n if (immutableViolation) continue;\n\n const { shortCircuit } = enforcePIIField(\n `${path}[${idx}]`,\n childKey,\n childValue,\n childDef,\n piiEnforcement,\n errors,\n logger\n );\n if (shortCircuit) continue;\n\n const childValidator = getValidator(childDef);\n if (\n childValidator &&\n childValue !== undefined &&\n childValue !== null\n ) {\n const normalizedIssues = normalizeValidatorIssues(\n childPath,\n childValidator(childValue),\n \"invalid_value\"\n );\n if (normalizedIssues.length > 0) {\n errors.push(...normalizedIssues.map((issue) => issue.message));\n issues.push(...normalizedIssues);\n continue;\n }\n }\n\n validateByType(\n `${path}[${idx}]`,\n childKey,\n childValue,\n childDef,\n errors,\n issues,\n existingChild,\n piiEnforcement,\n logger\n );\n }\n }\n });\n }\n return;\n }\n errors.push(`Field ${path} has unsupported array item type`);\n}\n\nfunction validateRefField(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n errors: string[],\n _existing: any,\n _piiEnforcement: PIIEnforcement,\n _logger?: { warn: (msg: string) => void }\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n if (\n typeof value !== \"object\" ||\n value === null ||\n typeof value.type !== \"string\" ||\n typeof value.id !== \"string\"\n ) {\n errors.push(`Field ${path} must be { type: string; id: string }`);\n return;\n }\n\n const expectedType = (def as any).refType;\n if (expectedType && value.type !== expectedType) {\n errors.push(\n `Field ${path} must reference type: ${expectedType} (got ${value.type})`\n );\n }\n}\n\nfunction validateByType(\n parentKey: string,\n key: string,\n value: any,\n def: any,\n errors: string[],\n issues: ValidationIssue[],\n existing: any,\n piiEnforcement: PIIEnforcement,\n logger?: { warn: (msg: string) => void }\n) {\n const path = parentKey ? `${parentKey}.${key}` : key;\n switch (def.type) {\n case \"string\":\n return validateStringField(parentKey, key, value, def, errors);\n case \"number\":\n return validateNumberField(parentKey, key, value, def, errors);\n case \"boolean\":\n return validateBooleanField(parentKey, key, value, def, errors);\n case \"object\":\n return validateObjectField(\n parentKey,\n key,\n value,\n def,\n errors,\n issues,\n existing,\n piiEnforcement,\n logger\n );\n case \"array\":\n return validateArrayField(\n parentKey,\n key,\n value,\n def,\n errors,\n issues,\n existing,\n piiEnforcement,\n logger\n );\n case \"ref\":\n return validateRefField(parentKey, key, value, def, errors, existing, piiEnforcement, logger);\n default:\n errors.push(`Unknown type for field ${path}: ${def.type}`);\n }\n}\n\nexport function createSchema<S extends SchemaShape>(\n _shape: S,\n entityType: string,\n options: SchemaOptions = {\n version: \"1.0.0\",\n table: \"\",\n schemaValidator: () => true,\n piiEnforcement: \"none\",\n unknownFields: SCHEMA_UNKNOWN_FIELDS_POLICIES[0],\n identity: SCHEMA_IDENTITY_POLICIES[0],\n schemaUpgrade: undefined,\n }\n): Schema<S> {\n const systemFields = {\n type: field.string().immutable().system(),\n version: field.string().immutable().system().validator(validateSemVer),\n };\n\n const version = options.version || \"1.0.0\";\n const store = options.table || \"\";\n\n // Optional schema-level upgrader supplied by the caller via options.schemaUpgrade\n const schemaUpgrade: SchemaUpgradeSpec | undefined = (options as any)\n .schemaUpgrade;\n\n const schema: Schema<S> = {\n // 🔗 Define the schema shape\n _shape: {\n ...systemFields,\n ..._shape,\n } as S,\n\n // 🔗 Metadata about the schema\n meta: { entityType, version },\n\n // 🔗 Validate input against the schema\n validate(input: unknown, existing?: Record<string, any>) {\n const errors: string[] = [];\n const issues: ValidationIssue[] = [];\n const result: any = {};\n const piiMode: PIIEnforcement = options.piiEnforcement ?? \"none\";\n\n if (typeof input !== \"object\" || input === null) {\n return { valid: false, errors: [\"Input must be an object\"] } as any;\n }\n if (options.unknownFields === \"reject\") {\n if (!strictInputIsWithinComplexityLimit(input)) {\n return {\n valid: false,\n errors: [\"Strict validation complexity limit exceeded.\"],\n issues: [\n {\n path: \"root\",\n code: \"validation_complexity_limit\",\n message: \"Strict validation complexity limit exceeded.\",\n },\n ],\n } as any;\n }\n const scanState: UnknownFieldScanState = {\n remainingObjects: MAX_STRICT_VALIDATION_OBJECTS,\n limitExceeded: false,\n };\n const locations = unknownFieldLocations(\n input,\n schema._shape,\n \"root\",\n scanState,\n );\n if (scanState.limitExceeded) {\n return {\n valid: false,\n errors: [\"Strict validation complexity limit exceeded.\"],\n issues: [\n {\n path: \"root\",\n code: \"validation_complexity_limit\",\n message: \"Strict validation complexity limit exceeded.\",\n },\n ],\n } as any;\n }\n if (locations.length > 0) {\n return {\n valid: false,\n errors: locations.map(\n (location) => `Unknown fields are not allowed at ${location}.`,\n ),\n issues: locations.map((location) => ({\n path: location,\n code: \"unknown_fields\",\n message: `Unknown fields are not allowed at ${location}.`,\n })),\n } as any;\n }\n }\n // Work on a non-mutating copy that includes system defaults for first-time objects\n const working: Record<string, any> =\n typeof input === \"object\" && input !== null\n ? deepClone(input as any)\n : { ...(input as any) };\n if (working.type == null) working.type = entityType;\n if (working.version == null) working.version = version;\n\n // ── Schema-level upgrade (runs once before any field checks) ─────────────\n const fromVersion = String(working.version ?? \"0.0.0\");\n const toVersion = String(version);\n if (schemaUpgrade && cmpSemver(fromVersion, toVersion) < 0) {\n const upgradeRes = applySchemaUpgrade(schemaUpgrade, { ...working }, {\n from: fromVersion,\n to: toVersion,\n entityType,\n describe: () => schema.describe(),\n });\n if (!upgradeRes || upgradeRes.ok !== true || !upgradeRes.value) {\n const errs = upgradeRes?.errors?.length\n ? upgradeRes.errors\n : [`Failed to upgrade entity from v${fromVersion} to v${toVersion}`];\n errors.push(...errs);\n // Stop early if the schema-level migration itself failed\n return { valid: false, errors } as any;\n }\n // Use the upgraded value as our new working copy\n for (const k of Object.keys(working)) delete (working as any)[k];\n Object.assign(working, upgradeRes.value);\n // Ensure system defaults remain correct after user migration\n working.type = entityType;\n working.version = toVersion;\n }\n\n if (\n options.identity === \"exact\" &&\n (working.type !== entityType || working.version !== version)\n ) {\n return {\n valid: false,\n errors: [\"Schema type or version does not match the contract.\"],\n issues: [\n {\n path: \"root\",\n code: \"schema_identity_mismatch\",\n message: \"Schema type or version does not match the contract.\",\n },\n ],\n } as any;\n }\n\n for (const key in schema._shape) {\n const def = schema._shape[key];\n let value = working[key];\n const existingField =\n existing && typeof existing === \"object\" ? (existing as any)[key] : undefined;\n\n if (!def) {\n errors.push(`Field definition missing for: ${key}`);\n continue;\n }\n\n // Apply defaults before required/validation checks\n const { value: withDefault, applied } = applyDefault(def, value);\n if (applied) {\n working[key] = withDefault;\n value = withDefault;\n }\n\n // 1) Required\n const { missing } = checkMissingRequired(\"\", key, value, def, errors);\n if (missing) continue;\n\n // 2) Immutable\n const { immutableViolation } = checkImmutable(\n \"\",\n key,\n value,\n def,\n existing,\n errors\n );\n if (immutableViolation) continue;\n\n // 3) PII enforcement (may short-circuit)\n const { shortCircuit } = enforcePIIField(\n \"\",\n key,\n value,\n def,\n piiMode,\n errors,\n console\n );\n if (shortCircuit) continue;\n\n // A local validator for this field that returns errors instead of pushing into the outer array\n const validateField = (val: any): string[] => {\n const localErrors: string[] = [];\n const localIssues: ValidationIssue[] = [];\n const { invalid } = runCustomValidator(\n \"\",\n key,\n val,\n def,\n localErrors,\n localIssues\n );\n if (!invalid) {\n validateByType(\"\", key, val, def, localErrors, localIssues, existingField, piiMode, console);\n }\n issues.push(...localIssues);\n return localErrors;\n };\n\n // First pass validation\n let fieldValue = value;\n let fieldErrors = validateField(fieldValue);\n\n // Attempt upgrade if invalid and an upgrader exists and entity is older than schema\n const entityFrom = String(working.version ?? \"0.0.0\");\n const entityTo = String(version);\n const fieldTo = String((def as any)._version ?? entityTo);\n const hasUpgrader = typeof (def as any)._upgrade === \"function\";\n\n if (\n fieldErrors.length > 0 &&\n hasUpgrader &&\n cmpSemver(entityFrom, entityTo) < 0\n ) {\n const up = (def as any)._upgrade as (\n value: any,\n ctx: {\n entityFrom: string;\n entityTo: string;\n fieldTo: string;\n fieldName: string;\n }\n ) => { ok: boolean; value?: any; error?: string };\n\n const res = up(fieldValue, {\n entityFrom,\n entityTo,\n fieldTo,\n fieldName: key,\n });\n if (res && res.ok) {\n fieldValue = res.value;\n fieldErrors = validateField(fieldValue);\n } else {\n fieldErrors.push(\n res?.error ||\n `Failed to upgrade field ${key} from v${entityFrom} to v${entityTo}`\n );\n }\n }\n\n result[key] = fieldValue;\n // Apply or record errors\n if (fieldErrors.length !== 0) {\n errors.push(...fieldErrors);\n continue;\n }\n }\n\n if (errors.length === 0 && options.schemaValidator) {\n const castValue = result as Infer<S>;\n const source = input as Record<string, unknown>;\n const validationContext: SchemaValidationContext = Object.freeze({\n wasProvided: (fieldName: string) =>\n Object.prototype.hasOwnProperty.call(source, fieldName),\n });\n if (!options.schemaValidator(castValue, validationContext)) {\n errors.push(\"Schema-level validation failed.\");\n }\n }\n\n return {\n valid: errors.length === 0,\n value: result as Infer<S>,\n errors,\n issues,\n };\n },\n\n // specific validator for a schema to allow conditional validation\n schemaValidator: options.schemaValidator!, // <== expose it here!\n\n /**\n * Runs the optional schema-level upgrade function once, without validating.\n * Useful for offline migrations or testing migration logic.\n */\n upgrade(\n input: Record<string, any>,\n log?: (msg: string) => void\n ): {\n ok: boolean;\n value?: Record<string, any>;\n errors?: string[];\n } {\n const fromVersion = String((input as any)?.version ?? \"0.0.0\");\n const toVersion = String(version);\n if (!schemaUpgrade || cmpSemver(fromVersion, toVersion) >= 0) {\n // Nothing to do – already current or no upgrader provided.\n return {\n ok: true,\n value: { ...input, type: entityType, version: toVersion },\n };\n }\n const res = applySchemaUpgrade(\n schemaUpgrade,\n { ...(input as any) },\n {\n from: fromVersion,\n to: toVersion,\n entityType,\n describe: () => schema.describe(),\n log,\n }\n );\n if (res && res.ok && res.value) {\n const out = { ...res.value, type: entityType, version: toVersion };\n return { ok: true, value: out };\n }\n return {\n ok: false,\n errors: res?.errors?.length\n ? res.errors\n : [`Failed to upgrade entity from v${fromVersion} to v${toVersion}`],\n };\n },\n\n /**\n * Recursively validates entity references defined in this schema.\n *\n * Traverses fields of type `ref` and arrays of `ref` and resolves each target\n * entity using the provided `resolveEntity` function. When `autoValidate` is\n * enabled (default) and the field's `refPolicy` is `eager`, the referenced\n * entity's schema is fetched and validated via `validateComposition` up to\n * `maxDepth` levels.\n *\n * Skips fields not listed in `onlyFields` when provided. Prevents cycles via\n * a `visited` set in `validatorContext`.\n *\n * @param entity The root entity to validate (must include `type` and `id`).\n * @param options Options controlling traversal and resolution behavior.\n * @param options.resolveEntity Function to resolve a referenced entity by type and id.\n * @param options.validatorContext Internal context (visited set) to prevent cycles.\n * @param options.maxDepth Maximum depth for recursive validation (default: 5).\n * @param options.onlyFields Optional whitelist of field names to validate.\n * @param options.log Optional logger for traversal/debug output.\n *\n * @throws Error if a broken reference is encountered (target cannot be resolved).\n */\n async validateComposition(entity, options) {\n const {\n resolveEntity,\n validatorContext = { visited: new Set() },\n maxDepth = 5,\n log,\n } = options;\n\n const entityKey = `${(entity as any).type}:${(entity as any).id}`;\n if (validatorContext.visited.has(entityKey)) {\n log?.(`Skipping already visited entity ${entityKey}`);\n return;\n }\n validatorContext.visited.add(entityKey);\n log?.(`Validating composition for entity ${entityKey}`);\n\n for (const [key, def] of Object.entries(schema._shape)) {\n // NEW: skip if not in onlyFields\n if (options.onlyFields && !options.onlyFields.includes(key)) {\n log?.(`Skipping field ${key} (not in onlyFields)`);\n continue;\n }\n\n const autoValidate = (def as any).autoValidate !== false;\n const refPolicy = (def as any).refPolicy ?? \"eager\";\n const value = (entity as any)[key];\n if (!value) continue;\n\n if (def.type === \"ref\") {\n const refType = (def as any).refType as string;\n if (!refType)\n throw new Error(`Missing refType for reference field ${key}`);\n const ref = value as { type: string; id: string };\n if (ref.type && ref.type !== refType) {\n throw new Error(\n `Reference type mismatch for field ${key}: expected ${refType}, got ${ref.type}`\n );\n }\n const target = await options.resolveEntity(refType, ref.id);\n if (!target)\n throw new Error(\n `Broken reference: ${refType} ${ref.id} in field ${key}`\n );\n log?.(`Resolved ${refType} ${ref.id} from field ${key}`);\n\n if (autoValidate && refPolicy === \"eager\") {\n const targetSchema = getSchemaForType(refType);\n if (options.maxDepth! > 0 && targetSchema) {\n await targetSchema.validateComposition(target, {\n ...options,\n maxDepth: options.maxDepth! - 1,\n });\n }\n }\n // Handle array of refs: type === \"array\" and itemType?.type === \"ref\"\n } else if (def.type === \"array\" && def.itemType?.type === \"ref\") {\n const refType = (def.itemType as any).refType as string;\n if (!refType)\n throw new Error(`Missing refType for reference array field ${key}`);\n const refs = value as Array<{ type: string; id: string }>;\n for (const ref of refs) {\n if (ref.type && ref.type !== refType) {\n throw new Error(\n `Reference type mismatch for field ${key}: expected ${refType}, got ${ref.type}`\n );\n }\n const target = await options.resolveEntity(refType, ref.id);\n if (!target)\n throw new Error(\n `Broken reference: ${refType} ${ref.id} in field ${key}`\n );\n log?.(`Resolved ${refType} ${ref.id} from field ${key}`);\n\n if (autoValidate && refPolicy === \"eager\") {\n const targetSchema = getSchemaForType(refType);\n if (options.maxDepth! > 0 && targetSchema) {\n await targetSchema.validateComposition(target, {\n ...options,\n maxDepth: options.maxDepth! - 1,\n });\n }\n }\n }\n }\n }\n },\n\n /**\n * Returns the configured table name for this schema.\n *\n * @throws Error if no store/table name has been defined for this schema.\n */\n tableName(): string {\n if (!store || store === \"\") {\n throw new Error(\"Store is not defined for this schema\");\n }\n return store;\n },\n\n serialize(\n input: Record<string, any>,\n options: SerializeOptions = {}\n ): Record<string, any> {\n if (typeof input !== \"object\" || input === null) {\n return {};\n }\n\n const serialized: Record<string, any> = {};\n for (const [key, def] of Object.entries(schema._shape)) {\n if (!shouldIncludeField(def, options)) {\n continue;\n }\n\n if (!Object.prototype.hasOwnProperty.call(input, key)) {\n continue;\n }\n\n const value = serializeFieldValue(def, (input as any)[key], options);\n if (value !== undefined) {\n serialized[key] = value;\n }\n }\n\n return serialized;\n },\n\n /**\n * Transforms an input object for persistence by applying PII protection\n * according to field annotations (e.g., encryption and hashing).\n *\n * @param input The raw entity data.\n * @param encryptFn Function used to encrypt sensitive values.\n * @param hashFn Function used to hash sensitive values.\n * @returns A new object safe to store.\n */\n prepareForStorage(\n input: Record<string, any>,\n encryptFn: (value: any) => string,\n hashFn: (value: any) => string\n ): Record<string, any> {\n return piiPrepareForStorage(_shape, input, encryptFn, hashFn);\n },\n\n /**\n * Reverses storage transformations for read paths (e.g., decrypts values)\n * according to PII annotations, returning a consumer-friendly object.\n *\n * @param stored Data retrieved from storage.\n * @param decryptFn Function used to decrypt values that were encrypted on write.\n * @returns A new object suitable for application consumption.\n */\n prepareForRead(\n stored: Record<string, any>,\n decryptFn: (value: string) => any\n ): Record<string, any> {\n return piiPrepareForRead(_shape, stored, decryptFn);\n },\n\n /**\n * Produces a log-safe copy of the provided data by redacting or pseudonymizing\n * PII fields in accordance with field annotations.\n *\n * @param data Arbitrary data to sanitize for logging.\n * @param pseudonymFn Function producing stable pseudonyms for sensitive values.\n * @returns A copy safe to emit to logs.\n */\n sanitizeForLog(\n data: Record<string, any>,\n pseudonymFn: (value: any) => string\n ): Record<string, any> {\n return piiSanitizeForLog(_shape, data, pseudonymFn);\n },\n\n /**\n * Returns a list of fields annotated with PII metadata for auditing purposes.\n * Each entry includes classification, required action, and optional log policy.\n */\n getPiiAudit(): Array<{\n field: string;\n classification: PIIClassification;\n action: PIIAction;\n logHandling?: PIILogHandling;\n purpose?: string;\n }> {\n return piiGetPiiAudit(_shape);\n },\n\n /**\n * Produces a copy of stored data suitable for data deletion flows by scrubbing\n * or blanking PII per field annotations.\n *\n * @param stored Data as persisted.\n * @returns A copy with PII removed or neutralized for deletion.\n */\n scrubPiiForDelete(stored: Record<string, any>): Record<string, any> {\n return piiScrubPiiForDelete(_shape, stored);\n },\n\n /**\n * Returns a normalized description of the schema suitable for documentation\n * or UI rendering (type, optionality, enum values, PII flags, etc.).\n */\n describe() {\n const description: Record<string, any> = {};\n for (const [key, def] of Object.entries(schema._shape)) {\n description[key] = {\n type: def.type,\n optional: isOptional(def),\n immutable: !!def.isImmutable,\n system: !!def.isSystem,\n description: def._description ?? \"\",\n version: def._version ?? \"\",\n deprecated: (def as any).deprecated ?? false,\n deprecatedVersion:\n (def as any).deprecatedVersion === undefined\n ? null\n : (def as any).deprecatedVersion,\n enum: getEnumValues(def as any) ?? null,\n refType: (def as any).refType ?? null,\n pii:\n !def._pii || def._pii.classification === \"none\" ? null : def._pii,\n exposure: def._exposure ?? \"public\",\n };\n }\n\n return {\n entityType,\n version,\n hasSchemaUpgrade: !!schemaUpgrade,\n shape: description,\n };\n },\n };\n\n // Register the schema globally\n globalSchemaRegistry.set(entityType, schema);\n return schema;\n}\n\n/**\n * Retrieves a previously registered schema by its `entityType` from the\n * in-process global schema registry.\n */\nexport function getSchemaForType(type: string): Schema<any> | undefined {\n return globalSchemaRegistry.get(type);\n}\n\n/**\n * Returns all schemas registered in the in-process global registry.\n */\nexport function getAllSchemas(): Schema<any>[] {\n return Array.from(globalSchemaRegistry.values());\n}\n\n/**\n * Renders a schema into a simplified descriptor for front-end consumption.\n * Intended for documentation and admin tooling rather than validation.\n */\nexport function renderSchemaDescription(\n schema: Schema<any>\n): {\n title: string;\n fields: Array<{\n name: string;\n type: FieldType;\n optional: boolean;\n description: string;\n deprecated: boolean;\n pii?: string;\n exposure: \"public\" | \"internal\";\n }>;\n} {\n const meta = schema.describe();\n return {\n title: `${meta.entityType} (v${meta.version})`,\n fields: Object.entries(meta.shape).map(([name, def]) => ({\n name,\n type: def.type,\n optional: def.optional,\n description: def.description,\n deprecated: def.deprecated,\n pii: def.pii ? def.pii.classification : undefined,\n exposure: def.exposure,\n })),\n };\n}\n","import { Infer } from \"./infer.js\";\nimport { createSchema } from \"./schema.js\";\nimport { Schema, SchemaShape } from \"./types.js\";\n// This module provides a registry for component schemas, allowing components to be registered and retrieved by type.\nconst componentSchemaRegistry = new Map<string, Schema<SchemaShape>>();\n\nexport function createComponentSchema<T extends SchemaShape>(\n shape: SchemaShape,\n name: string,\n version: string,\n tableName: string = \"\",\n schemaValidator: (entity: Infer<T>) => boolean = () => true\n): Schema<SchemaShape> {\n const schema = createSchema<T>(shape as T, name, {\n version: version,\n piiEnforcement: \"strict\",\n table: tableName,\n schemaValidator,\n });\n registerComponentSchema(name, schema as Schema<SchemaShape>);\n return schema as Schema<SchemaShape>;\n}\n\nexport function registerComponentSchema(\n type: string,\n schema: Schema<SchemaShape>\n) {\n componentSchemaRegistry.set(type, schema);\n}\n\nexport function getComponentSchema(\n type: string\n): Schema<SchemaShape> | undefined {\n return componentSchemaRegistry.get(type);\n}\n\nexport function getAllComponentSchemas(): [string, Schema<SchemaShape>][] {\n return Array.from(componentSchemaRegistry.entries());\n}\n","import { field } from \"./field.js\";\nimport { createSchema } from \"./schema.js\";\n\n/** Event classes that can be observed by a player. */\nexport const PLAYER_SYSTEM_EVENT_KINDS = [\n \"combat\",\n \"social\",\n \"mission\",\n \"crafting\",\n \"world\",\n] as const;\n\nexport type PlayerSystemEventKind = (typeof PLAYER_SYSTEM_EVENT_KINDS)[number];\n\n/** Achievement tiers exposed by the curated player projection. */\nexport const PLAYER_SYSTEM_ACHIEVEMENT_TIERS = [\n \"bronze\",\n \"silver\",\n \"gold\",\n] as const;\n\nexport type PlayerSystemAchievementTier =\n (typeof PLAYER_SYSTEM_ACHIEVEMENT_TIERS)[number];\n\n/** Projection states for an achievement progress track. */\nexport const PLAYER_SYSTEM_ACHIEVEMENT_TRACK_STATUSES = [\n \"tracking\",\n \"earned\",\n] as const;\n\nexport type PlayerSystemAchievementTrackStatus =\n (typeof PLAYER_SYSTEM_ACHIEVEMENT_TRACK_STATUSES)[number];\n\nconst playerIdField = () =>\n field\n .string()\n .min(1)\n .max(128)\n .PID({\n classification: \"low\",\n action: \"none\",\n logHandling: \"pseudonym\",\n purpose: \"a stable player-scoped storage identifier\",\n })\n .description(\n \"Stable player identifier; the only personal identifier retained in event projections\",\n );\n\nconst eventIdField = () => field.string().min(1).max(128);\n\nconst eventKindField = () =>\n field.string().enum(PLAYER_SYSTEM_EVENT_KINDS);\n\nconst eventTitleField = () =>\n field\n .generalText()\n .min(1)\n .max(120)\n .description(\"Player-visible event title\");\n\nconst eventSummaryField = () =>\n field\n .generalText()\n .min(1)\n .max(320)\n .description(\"Player-visible event summary\");\n\nconst observedEventFields = (defaultHighlighted = true) => ({\n id: eventIdField(),\n playerId: playerIdField(),\n occurredAt: field.dateTimeISO(),\n kind: eventKindField(),\n title: eventTitleField(),\n summary: eventSummaryField(),\n highlighted: defaultHighlighted\n ? field.boolean().default(false)\n : field.boolean(),\n});\n\nconst eventHighlightFields = () => ({\n id: eventIdField(),\n title: eventTitleField(),\n summary: eventSummaryField(),\n occurredAt: field.dateTimeISO(),\n kind: eventKindField(),\n});\n\nconst eventEntryFields = () => ({\n id: eventIdField(),\n title: eventTitleField(),\n summary: eventSummaryField(),\n occurredAt: field.dateTimeISO(),\n kind: eventKindField(),\n highlighted: field.boolean(),\n});\n\nconst achievementFields = () => ({\n id: eventIdField(),\n title: eventTitleField(),\n tier: field.string().enum(PLAYER_SYSTEM_ACHIEVEMENT_TIERS),\n progressLabel: eventSummaryField(),\n earnedAt: field.dateTimeISO().optional(),\n});\n\nconst achievementTrackFields = () => ({\n id: eventIdField(),\n title: eventTitleField(),\n current: field.number().min(0).max(1000),\n target: field.number().min(1).max(1000),\n status: field.string().enum(PLAYER_SYSTEM_ACHIEVEMENT_TRACK_STATUSES),\n});\n\n/** A player-observable event accepted at the ingestion boundary. */\nexport interface PlayerSystemObservedEvent {\n id: string;\n playerId: string;\n occurredAt: string;\n kind: PlayerSystemEventKind;\n title: string;\n summary: string;\n highlighted: boolean;\n}\n\n/** A raw event batch written to the blob-backed ingestion zone. */\nexport interface PlayerSystemObservedEventBatch {\n source: string;\n emittedAt: string;\n events: readonly PlayerSystemObservedEvent[];\n}\n\n/** A normalized event enriched with its deterministic deduplication key. */\nexport interface PlayerSystemNormalizedObservedEvent\n extends PlayerSystemObservedEvent {\n deterministicKey: string;\n}\n\n/** A normalized event batch written by the projection processor. */\nexport interface PlayerSystemNormalizedEventBatch {\n sourceBlobName: string;\n processedAt: string;\n events: readonly PlayerSystemNormalizedObservedEvent[];\n}\n\n/** A highlighted event shown in the curated player Event Log. */\nexport interface PlayerSystemEventHighlight {\n id: string;\n title: string;\n summary: string;\n occurredAt: string;\n kind: PlayerSystemEventKind;\n}\n\n/** A recent event shown in the curated player Event Log. */\nexport interface PlayerSystemEventEntry extends PlayerSystemEventHighlight {\n highlighted: boolean;\n}\n\n/** An earned or explainable achievement projected from observed events. */\nexport interface PlayerSystemAchievementEntry {\n id: string;\n title: string;\n tier: PlayerSystemAchievementTier;\n progressLabel: string;\n earnedAt?: string;\n}\n\n/** Progress toward an achievement projected from observed events. */\nexport interface PlayerSystemAchievementTrack {\n id: string;\n title: string;\n current: number;\n target: number;\n status: PlayerSystemAchievementTrackStatus;\n}\n\n/** Curated per-player Event Log and Achievement read model. */\nexport interface PlayerSystemCuratedSnapshot {\n playerId: string;\n projectedAt: string;\n lastObservedAt: string;\n highlights: readonly PlayerSystemEventHighlight[];\n events: readonly PlayerSystemEventEntry[];\n achievements: readonly PlayerSystemAchievementEntry[];\n tracks: readonly PlayerSystemAchievementTrack[];\n}\n\n/** Schema for raw player-observable event batches. */\nexport const PlayerSystemObservedEventBatchSchema = createSchema(\n {\n source: field.string().min(1).max(120),\n emittedAt: field.dateTimeISO(),\n events: field.array(field.object(observedEventFields())),\n },\n \"player-system-observed-event-batch\",\n {\n version: \"1.0.0\",\n piiEnforcement: \"strict\",\n },\n);\n\n/** Schema for normalized event batches used by projections and gossip sourcing. */\nexport const PlayerSystemNormalizedEventBatchSchema = createSchema(\n {\n sourceBlobName: field.string().min(1).max(512),\n processedAt: field.dateTimeISO(),\n events: field.array(\n field.object({\n ...observedEventFields(false),\n deterministicKey: field.string().min(1).max(256),\n }),\n ),\n },\n \"player-system-normalized-event-batch\",\n {\n version: \"1.0.0\",\n piiEnforcement: \"strict\",\n },\n);\n\n/** Schema for curated per-player Event Log and Achievement read models. */\nexport const PlayerSystemCuratedSnapshotSchema = createSchema(\n {\n playerId: playerIdField(),\n projectedAt: field.dateTimeISO(),\n lastObservedAt: field.dateTimeISO(),\n highlights: field.array(field.object(eventHighlightFields())),\n events: field.array(field.object(eventEntryFields())),\n achievements: field.array(field.object(achievementFields())),\n tracks: field.array(field.object(achievementTrackFields())),\n },\n \"player-system-curated-snapshot\",\n {\n version: \"1.0.0\",\n piiEnforcement: \"strict\",\n },\n);\n\nexport type PlayerSystemObservedEventBatchEntity =\n PlayerSystemObservedEventBatch & {\n type: \"player-system-observed-event-batch\";\n version: \"1.0.0\";\n };\n\nexport type PlayerSystemNormalizedEventBatchEntity =\n PlayerSystemNormalizedEventBatch & {\n type: \"player-system-normalized-event-batch\";\n version: \"1.0.0\";\n };\n\nexport type PlayerSystemCuratedSnapshotEntity = PlayerSystemCuratedSnapshot & {\n type: \"player-system-curated-snapshot\";\n version: \"1.0.0\";\n};\n","/** Version shared by the first privacy-safe feedback contracts. */\nexport const FEEDBACK_CONTRACT_VERSION = \"1.0.0\";\n","import { FEEDBACK_CONTRACT_VERSION } from \"./feedback-contract-version.js\";\n\nexport { FEEDBACK_CONTRACT_VERSION };\n\n/** Coarse renderer buckets permitted in privacy-safe game diagnostics. */\nexport const FEEDBACK_RENDERER_BUCKETS = [\n \"webgl2\",\n \"webgpu\",\n \"canvas2d\",\n \"unknown\",\n] as const;\n\n/** Coarse execution-backend buckets permitted in game diagnostics. */\nexport const FEEDBACK_BACKEND_BUCKETS = [\n \"browser\",\n \"worker\",\n \"unknown\",\n] as const;\n\n/** Renderer surfaces approved to carry diagnostics in the first contract. */\nexport const FEEDBACK_GAME_SURFACE_IDS = [\n \"site.generator\",\n \"site.gpu-demo\",\n] as const;\n\n/** Exact renderer-owned provenance contracts for approved game surfaces. */\nexport const FEEDBACK_GAME_PROVENANCE_CONTRACTS = [\n {\n surfaceId: \"site.generator\",\n contractId: \"generator.renderer-diagnostics.v1\",\n },\n {\n surfaceId: \"site.gpu-demo\",\n contractId: \"gpu-demo.renderer-diagnostics.v1\",\n },\n] as const;\n\n/** Closed provenance identifiers accepted from the browser. */\nexport const FEEDBACK_GAME_PROVENANCE_CONTRACT_IDS = [\n \"generator.renderer-diagnostics.v1\",\n \"gpu-demo.renderer-diagnostics.v1\",\n] as const;\n\n/** Closed renderer feature identifiers accepted from the browser. */\nexport const FEEDBACK_GAME_FEATURE_IDS = [\n \"renderer.initialisation\",\n \"renderer.frame-loop\",\n \"renderer.asset-loading\",\n \"renderer.input\",\n \"renderer.scene-generation\",\n \"renderer.post-processing\",\n] as const;\n\n/** Closed renderer counter identifiers accepted from the browser. */\nexport const FEEDBACK_GAME_COUNTER_CODES = [\n \"frame-drop\",\n \"device-loss\",\n \"asset-load-failure\",\n \"shader-failure\",\n \"fallback-activation\",\n] as const;\n\n/** Maximum number of distinct coarse counters in one diagnostics packet. */\nexport const FEEDBACK_GAME_COUNTER_MAX_ITEMS = 32;\n\n/** Maximum value accepted for one coarse diagnostics counter. */\nexport const FEEDBACK_GAME_COUNTER_MAX_COUNT = 10_000;\n\n/** Closed renderer error identifiers accepted from the browser. */\nexport const FEEDBACK_GAME_ERROR_CODES = [\n \"renderer.initialisation-failed\",\n \"renderer.device-lost\",\n \"renderer.asset-load-failed\",\n \"renderer.frame-budget-exceeded\",\n \"renderer.shader-failed\",\n \"renderer.unknown\",\n] as const;\n\n/** Coarse viewport buckets; exact dimensions are deliberately excluded. */\nexport const FEEDBACK_VIEWPORT_BUCKETS = [\n \"small-portrait\",\n \"small-landscape\",\n \"medium-portrait\",\n \"medium-landscape\",\n \"large-portrait\",\n \"large-landscape\",\n \"unknown\",\n] as const;\n\n/** Coarse frame-rate buckets permitted in game diagnostics. */\nexport const FEEDBACK_FRAME_RATE_BUCKETS = [\n \"under-15\",\n \"15-29\",\n \"30-59\",\n \"60-plus\",\n \"unknown\",\n] as const;\n\n/** Coarse frame-time buckets permitted in game diagnostics. */\nexport const FEEDBACK_FRAME_TIME_BUCKETS = [\n \"under-17ms\",\n \"17-33ms\",\n \"34-66ms\",\n \"over-66ms\",\n \"unknown\",\n] as const;\n\nfor (const vocabulary of [\n FEEDBACK_RENDERER_BUCKETS,\n FEEDBACK_BACKEND_BUCKETS,\n FEEDBACK_GAME_SURFACE_IDS,\n FEEDBACK_GAME_PROVENANCE_CONTRACTS,\n FEEDBACK_GAME_PROVENANCE_CONTRACT_IDS,\n FEEDBACK_GAME_FEATURE_IDS,\n FEEDBACK_GAME_COUNTER_CODES,\n FEEDBACK_GAME_ERROR_CODES,\n FEEDBACK_VIEWPORT_BUCKETS,\n FEEDBACK_FRAME_RATE_BUCKETS,\n FEEDBACK_FRAME_TIME_BUCKETS,\n]) {\n Object.freeze(vocabulary);\n}\nfor (const entry of FEEDBACK_GAME_PROVENANCE_CONTRACTS) {\n Object.freeze(entry);\n}\n\n/** Fields shared by every coarse, consented game-diagnostics packet. */\ninterface FeedbackGameDiagnosticsBase {\n type: \"feedback-game-diagnostics\";\n version: typeof FEEDBACK_CONTRACT_VERSION;\n consentConfirmed: true;\n renderer: (typeof FEEDBACK_RENDERER_BUCKETS)[number];\n backend: (typeof FEEDBACK_BACKEND_BUCKETS)[number];\n viewportBucket: (typeof FEEDBACK_VIEWPORT_BUCKETS)[number];\n frameRateBucket: (typeof FEEDBACK_FRAME_RATE_BUCKETS)[number];\n frameTimeBucket: (typeof FEEDBACK_FRAME_TIME_BUCKETS)[number];\n featureIds: readonly (typeof FEEDBACK_GAME_FEATURE_IDS)[number][];\n counters: readonly {\n code: (typeof FEEDBACK_GAME_COUNTER_CODES)[number];\n count: number;\n }[];\n errorCodes: readonly (typeof FEEDBACK_GAME_ERROR_CODES)[number][];\n}\n\ntype FeedbackGameProvenanceContract =\n (typeof FEEDBACK_GAME_PROVENANCE_CONTRACTS)[number];\n\ntype FeedbackGameProvenancePair = {\n [SurfaceId in FeedbackGameProvenanceContract[\"surfaceId\"]]: {\n surfaceId: SurfaceId;\n provenanceContractId: Extract<\n FeedbackGameProvenanceContract,\n { surfaceId: SurfaceId }\n >[\"contractId\"];\n };\n}[FeedbackGameProvenanceContract[\"surfaceId\"]];\n\n/**\n * Coarse, consented game facts that cannot express captured pixels.\n *\n * The discriminated union prevents a renderer from pairing one approved\n * surface with another surface's provenance contract at compile time.\n */\nexport type FeedbackGameDiagnostics = FeedbackGameDiagnosticsBase &\n FeedbackGameProvenancePair;\n","import { field } from \"./field.js\";\nimport { FEEDBACK_CONTRACT_VERSION } from \"./feedback-contract-version.js\";\nimport {\n FEEDBACK_BACKEND_BUCKETS,\n FEEDBACK_FRAME_RATE_BUCKETS,\n FEEDBACK_FRAME_TIME_BUCKETS,\n FEEDBACK_GAME_COUNTER_CODES,\n FEEDBACK_GAME_COUNTER_MAX_COUNT,\n FEEDBACK_GAME_COUNTER_MAX_ITEMS,\n FEEDBACK_GAME_ERROR_CODES,\n FEEDBACK_GAME_FEATURE_IDS,\n FEEDBACK_GAME_PROVENANCE_CONTRACT_IDS,\n FEEDBACK_GAME_PROVENANCE_CONTRACTS,\n FEEDBACK_GAME_SURFACE_IDS,\n FEEDBACK_RENDERER_BUCKETS,\n FEEDBACK_VIEWPORT_BUCKETS,\n} from \"./feedback-diagnostics-vocabulary.js\";\nimport type {\n FeedbackGameDiagnostics,\n} from \"./feedback-diagnostics-vocabulary.js\";\nimport { createSchema } from \"./schema.js\";\nimport type { ValidationIssue } from \"./validation.types.js\";\n\nexport {\n FEEDBACK_BACKEND_BUCKETS,\n FEEDBACK_FRAME_RATE_BUCKETS,\n FEEDBACK_FRAME_TIME_BUCKETS,\n FEEDBACK_GAME_COUNTER_CODES,\n FEEDBACK_GAME_COUNTER_MAX_COUNT,\n FEEDBACK_GAME_COUNTER_MAX_ITEMS,\n FEEDBACK_GAME_ERROR_CODES,\n FEEDBACK_GAME_FEATURE_IDS,\n FEEDBACK_GAME_PROVENANCE_CONTRACT_IDS,\n FEEDBACK_GAME_PROVENANCE_CONTRACTS,\n FEEDBACK_GAME_SURFACE_IDS,\n FEEDBACK_RENDERER_BUCKETS,\n FEEDBACK_VIEWPORT_BUCKETS,\n};\nexport type { FeedbackGameDiagnostics };\n\nconst positiveCountField = (maximum: number) =>\n field\n .number()\n .validator((value) => Number.isSafeInteger(value))\n .min(1)\n .max(maximum);\n\nconst nestedIdentityShape = () => ({\n type: field.string().enum([\"feedback-game-diagnostics\"] as const),\n version: field.string().enum([FEEDBACK_CONTRACT_VERSION] as const),\n});\n\nconst gameCounterShape = () => ({\n code: field.string().enum(FEEDBACK_GAME_COUNTER_CODES),\n count: positiveCountField(FEEDBACK_GAME_COUNTER_MAX_COUNT),\n});\n\nexport const feedbackGameDiagnosticsShape = (includeIdentity = false) => ({\n ...(includeIdentity ? nestedIdentityShape() : {}),\n surfaceId: field.string().enum(FEEDBACK_GAME_SURFACE_IDS),\n consentConfirmed: field.boolean(),\n provenanceContractId: field\n .string()\n .enum(FEEDBACK_GAME_PROVENANCE_CONTRACT_IDS),\n renderer: field.string().enum(FEEDBACK_RENDERER_BUCKETS),\n backend: field.string().enum(FEEDBACK_BACKEND_BUCKETS),\n viewportBucket: field.string().enum(FEEDBACK_VIEWPORT_BUCKETS),\n frameRateBucket: field.string().enum(FEEDBACK_FRAME_RATE_BUCKETS),\n frameTimeBucket: field.string().enum(FEEDBACK_FRAME_TIME_BUCKETS),\n featureIds: field\n .array(field.string().enum(FEEDBACK_GAME_FEATURE_IDS))\n .max(FEEDBACK_GAME_FEATURE_IDS.length),\n counters: field\n .array(field.object(gameCounterShape()))\n .max(FEEDBACK_GAME_COUNTER_MAX_ITEMS),\n errorCodes: field\n .array(field.string().enum(FEEDBACK_GAME_ERROR_CODES))\n .max(FEEDBACK_GAME_ERROR_CODES.length),\n});\n\nexport const isFeedbackGameDiagnosticsConsistent = (\n value: Record<string, unknown>,\n): boolean => {\n const featureIds = Array.isArray(value.featureIds) ? value.featureIds : [];\n const errorCodes = Array.isArray(value.errorCodes) ? value.errorCodes : [];\n const counters = Array.isArray(value.counters) ? value.counters : [];\n const provenance = FEEDBACK_GAME_PROVENANCE_CONTRACTS.find(\n ({ surfaceId }) => surfaceId === value.surfaceId,\n );\n return (\n value.consentConfirmed === true &&\n provenance !== undefined &&\n provenance.contractId === value.provenanceContractId &&\n new Set(featureIds).size === featureIds.length &&\n new Set(errorCodes).size === errorCodes.length &&\n new Set(\n counters.map((counter) =>\n typeof counter === \"object\" && counter !== null\n ? (counter as { code?: unknown }).code\n : undefined,\n ),\n ).size === counters.length\n );\n};\n\n/** Bucketed, consented renderer diagnostics; it cannot express pixels or DOM. */\nexport const FeedbackGameDiagnosticsSchema = createSchema(\n feedbackGameDiagnosticsShape(),\n \"feedback-game-diagnostics\",\n {\n version: FEEDBACK_CONTRACT_VERSION,\n piiEnforcement: \"strict\",\n unknownFields: \"reject\",\n identity: \"exact\",\n schemaValidator: isFeedbackGameDiagnosticsConsistent,\n },\n);\n\nexport type FeedbackGameDiagnosticsValidationResult =\n | {\n readonly valid: true;\n readonly value: FeedbackGameDiagnostics;\n readonly errors?: never;\n readonly issues?: never;\n }\n | {\n readonly valid: false;\n readonly value?: never;\n readonly errors: readonly string[];\n readonly issues?: readonly ValidationIssue[];\n };\n\n/**\n * Validate and clone diagnostics while preserving the correlated public type.\n *\n * `createSchema` intentionally exposes its generic inferred shape; this\n * domain wrapper is the typed boundary consumers should use.\n */\nexport const validateFeedbackGameDiagnostics = (\n input: unknown,\n): FeedbackGameDiagnosticsValidationResult => {\n const result = FeedbackGameDiagnosticsSchema.validate(input);\n if (!result.valid || result.value === undefined) {\n return {\n valid: false,\n errors: result.errors ?? [\"Game diagnostics validation failed.\"],\n ...(result.issues === undefined ? {} : { issues: result.issues }),\n };\n }\n return {\n valid: true,\n value: result.value as unknown as FeedbackGameDiagnostics,\n };\n};\n","{\n \"profileId\": \"unicode-15.1.0-nfkc-v1\",\n \"unicodeVersion\": \"15.1.0\",\n \"sourcePackage\": \"@unicode/unicode-15.1.0\",\n \"sourcePackageVersion\": \"1.6.17\",\n \"sourceProperty\": \"General_Category/Unassigned\",\n \"rangeEncoding\": \"flat-half-open-delta-uleb128-base64url-v1\",\n \"rangeCount\": 707,\n \"endpointCount\": 1414,\n \"codePointCount\": 824718,\n \"endpointSha256\": \"591e457524d6b4b988aa7c7687e76c95a78370fea38bbd1b09085be7fd935ef3\",\n \"payload\": \"-AYCBgQHAQEBFAGNAwEmAjICAwE3CBsEBguOAgE8AmUOOwIxAg8BHAIBAQsFHwECBuwBAQgCAgIWAQcBAQMEAgkCAgIECAEEAgEFAhkCAwEGBAICFgEHAQIBAgECAgEBBQQCAgMDAQcEAQEHEQoDAQkBAwEWAQcBAgEFAgoBAwEDAgEPBAIMBwcBAwEIAgICFgEHAQIBBQIJAgICAwcDBAIBBQISCgIBBgMDAQQDAgEBAQIDAgMDAwwEBQMDAQQCAQYBDhUFDQEDARcBEAIJAQMBBAcCAQMCAQIEAgoHFgEDARcBCgEFAgkBAwEEBwIGAgEEAgoBAwwNAQMBMwEDAQYEEAIaAQMBEgMYAQkBAQIHAwEEBgEBAQgGCgIDDDoEHSUCAQEBBQEYAQEBFwIFAQEBBwEKAgQgSAEkBCcBJAEPAQ0lxgEBAQUBAvkCAQQCBwEBAQQCKQEEAiEBBAIHAQEBBAIPATkBBAJDAiADGgZWAgYCnQUDWQcWCRgJFAwNAQMBAgxeAgoGCgYaBlkHKwVGCh8BDAQMBAEDKgIFCywEGgYLAz4CQQEdAgsGCgYOAh8xTQMvAXQIPAMPAzwHKwILCCsFlgQCBgImAgYCCAEBAQEBAQEfAjUBDwEOAgYBEwIDAQkBZQEMAhsBDQMhDyEPjAEElwUZCxWUDgIgAd0CBS0BAQUBAjgHAg4YCQcBBwEHAQcBBwEHAQcBBwF-IhoBWQzWARpQAVYCZwUrAV4BVAswAe3kAQM3CdwCFLgBCMsBBQIBAQEFGDsDCgY4CEYIDAZ0Cx4DTgELBCEBNwkOAgoCZxgcCgYCBgIGCQcBBwE8BH4CCgakVwwXBDEE7kQCaiYHDAUFGgEFAQEBAgECAX0QvQMCNgcBICoGMwETAQQEBQGHAQIBAb4BAwYCBgIGAgMDBwEHCgUCDAEaARMBAgEPAg4iewUDBC0DWAENAwEvLoIBHQMxDxwEJAkeBSsFHgElBA4qngECCgYkBCQEKAg0CwwBDwEHAQIBCwEPAQcBAkO3AgkWCggYBgEqAQlFBgIBASwBAgMBAhcBSAgJMBMBAgUhAxsFAUA4BBQCMgECBQgBAwEdAgMECgcJB0AgJwQMCTYDHQIbBRoHBAwHUEk3Mw0zBy4ICqYCHwEqAQMCAksrCCoWGiYcFBcJTgQkCUQKAQIZBwoGNQESCCcJYAEUCxIBLz4HAQEBBAEPAQsGOwUKBgQBCAICAhYBBwECAQUBCgICAgMCAQYBBQcCBwMFiwFcAQUeSAgKpgE2AiYiRQsKBg0TOgYKNhsCDwQXuQE8ZFMMCAIBAggBAgEeAQICDAkKRggCLgILG0gIUw1JBwr2AQkBLQEOCh0DIAIWAQ5JBwECASwDAQECAQkICgYGAQIBJQECAQYHCrYCGQcRASkDHFYBDzINmwdmbwEFC8QBzBRjDdYIqh_HBLlDuQQHHwEKBFEBCgYeAgYKRgoKAQcBFQUTsAVbZUsEOQcRQAULAg74LwjWCSoJ50UEAQcBAgGjAg8BHQMCAQ4ECIwDhBJrBQ0DCQcKAgjcJC4CFwl0PPYBCicCwgEVRnoUDBQMVwkZhwFVAUcBAgIBAgICBAEMAQEBBwFBAQQCCAEHARwBBAEFAQEDBwHUAgKkAgK-BQ8FAQ_QCB8GBtUBBwERAgcBAgEFBT4hAXAtAw4CCgQCwAIfEToFAdADKuYFBwEEAQIBDwHFAQIQKUwECgQCkQZETD3CAQQBGwECAQECAQEKAQQBAQEBBgEEAQEBAQEBAwECAQECAQEBAQEBAQEBAQIBAQIEAQcBBAEEAQEBCgERBQMBBQERNAKOAiwEZAwPAg8BDwElCq4BOB0NLAQJBwIOBpoB2AcEEQMNA3cEXwYMBAEPDAQ4CAoGKAgeAgJO1AIMDgINAwkHLgEHCA4ECQcJB5MBATclCoYI4M0CILogBt4BAoItDrE6D-4EohOeBOILyyYF4CDRuCsBHmCAAfABkPwD_v8DAv7_AwI\"\n}\n","const BASE64URL_ALPHABET =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\nconst BASE64URL_PATTERN = /^[A-Za-z0-9_-]+$/;\nconst MAX_UNICODE_ENDPOINT = 0x110000;\nconst MAX_ENCODED_PAYLOAD_CHARACTERS = 8_192;\nconst MAX_ULEB128_BYTES = 5;\nconst MAX_PROFILE_RANGE_COUNT = 707;\nconst MAX_PROFILE_ENDPOINT_COUNT = MAX_PROFILE_RANGE_COUNT * 2;\nconst MAX_PROFILE_CODE_POINT_COUNT = MAX_UNICODE_ENDPOINT;\nconst ARTIFACT_KEYS = new Set([\n \"profileId\",\n \"unicodeVersion\",\n \"sourcePackage\",\n \"sourcePackageVersion\",\n \"sourceProperty\",\n \"rangeEncoding\",\n \"rangeCount\",\n \"endpointCount\",\n \"codePointCount\",\n \"endpointSha256\",\n \"payload\",\n]);\n\nexport interface FeedbackUnicodeProfileExpectation {\n readonly profileId: string;\n readonly unicodeVersion: string;\n readonly sourcePackage: string;\n readonly sourcePackageVersion: string;\n readonly sourceProperty: string;\n readonly rangeEncoding: string;\n readonly rangeCount: number;\n readonly endpointCount: number;\n readonly codePointCount: number;\n readonly endpointSha256: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasExpectedMetadata(\n artifact: Record<string, unknown>,\n expected: FeedbackUnicodeProfileExpectation,\n): boolean {\n return (\n Object.keys(artifact).length === ARTIFACT_KEYS.size &&\n Object.keys(artifact).every((key) => ARTIFACT_KEYS.has(key)) &&\n artifact.profileId === expected.profileId &&\n artifact.unicodeVersion === expected.unicodeVersion &&\n artifact.sourcePackage === expected.sourcePackage &&\n artifact.sourcePackageVersion === expected.sourcePackageVersion &&\n artifact.sourceProperty === expected.sourceProperty &&\n artifact.rangeEncoding === expected.rangeEncoding &&\n artifact.rangeCount === expected.rangeCount &&\n artifact.endpointCount === expected.endpointCount &&\n artifact.codePointCount === expected.codePointCount &&\n artifact.endpointSha256 === expected.endpointSha256\n );\n}\n\nfunction isBoundedPositiveInteger(\n value: unknown,\n maximum: number,\n): value is number {\n return (\n typeof value === \"number\" &&\n Number.isSafeInteger(value) &&\n value > 0 &&\n value <= maximum\n );\n}\n\nfunction hasBoundedCounts(\n artifact: Record<string, unknown>,\n expected: FeedbackUnicodeProfileExpectation,\n): boolean {\n return (\n isBoundedPositiveInteger(\n artifact.rangeCount,\n MAX_PROFILE_RANGE_COUNT,\n ) &&\n isBoundedPositiveInteger(\n expected.rangeCount,\n MAX_PROFILE_RANGE_COUNT,\n ) &&\n isBoundedPositiveInteger(\n artifact.endpointCount,\n MAX_PROFILE_ENDPOINT_COUNT,\n ) &&\n isBoundedPositiveInteger(\n expected.endpointCount,\n MAX_PROFILE_ENDPOINT_COUNT,\n ) &&\n artifact.endpointCount === artifact.rangeCount * 2 &&\n expected.endpointCount === expected.rangeCount * 2 &&\n isBoundedPositiveInteger(\n artifact.codePointCount,\n MAX_PROFILE_CODE_POINT_COUNT,\n ) &&\n isBoundedPositiveInteger(\n expected.codePointCount,\n MAX_PROFILE_CODE_POINT_COUNT,\n )\n );\n}\n\nfunction decodeCanonicalBase64Url(value: string): Uint8Array | undefined {\n if (\n value.length === 0 ||\n value.length > MAX_ENCODED_PAYLOAD_CHARACTERS ||\n value.length % 4 === 1 ||\n !BASE64URL_PATTERN.test(value)\n ) {\n return undefined;\n }\n\n const finalSextet = BASE64URL_ALPHABET.indexOf(value.at(-1) ?? \"\");\n if (\n finalSextet < 0 ||\n (value.length % 4 === 2 && (finalSextet & 0b1111) !== 0) ||\n (value.length % 4 === 3 && (finalSextet & 0b11) !== 0)\n ) {\n return undefined;\n }\n\n const expectedByteCount = Math.floor((value.length * 6) / 8);\n const output = new Uint8Array(expectedByteCount);\n let outputIndex = 0;\n let accumulator = 0;\n let bitCount = 0;\n\n for (const character of value) {\n const sextet = BASE64URL_ALPHABET.indexOf(character);\n if (sextet < 0) {\n return undefined;\n }\n accumulator = (accumulator << 6) | sextet;\n bitCount += 6;\n while (bitCount >= 8) {\n bitCount -= 8;\n output[outputIndex] = (accumulator >> bitCount) & 0xff;\n outputIndex += 1;\n accumulator &= (1 << bitCount) - 1;\n }\n }\n\n if (\n outputIndex !== expectedByteCount ||\n (bitCount > 0 && accumulator !== 0)\n ) {\n return undefined;\n }\n return output;\n}\n\nfunction decodeCanonicalEndpointDeltas(\n bytes: Uint8Array,\n endpointCount: number,\n): Uint32Array | undefined {\n if (\n !isBoundedPositiveInteger(\n endpointCount,\n MAX_PROFILE_ENDPOINT_COUNT,\n ) ||\n endpointCount % 2 !== 0\n ) {\n return undefined;\n }\n const endpoints = new Uint32Array(endpointCount);\n let byteOffset = 0;\n let previousEndpoint = 0;\n\n for (let endpointIndex = 0; endpointIndex < endpointCount; endpointIndex += 1) {\n let delta = 0;\n let multiplier = 1;\n let byteCount = 0;\n\n while (true) {\n if (byteOffset >= bytes.length || byteCount >= MAX_ULEB128_BYTES) {\n return undefined;\n }\n const byte = bytes[byteOffset];\n if (byte === undefined) {\n return undefined;\n }\n byteOffset += 1;\n byteCount += 1;\n\n const payload = byte & 0x7f;\n delta += payload * multiplier;\n if (!Number.isSafeInteger(delta)) {\n return undefined;\n }\n\n if ((byte & 0x80) === 0) {\n if (byteCount > 1 && payload === 0) {\n return undefined;\n }\n break;\n }\n multiplier *= 128;\n }\n\n const endpoint = previousEndpoint + delta;\n if (\n delta <= 0 ||\n !Number.isSafeInteger(endpoint) ||\n endpoint > MAX_UNICODE_ENDPOINT\n ) {\n return undefined;\n }\n endpoints[endpointIndex] = endpoint;\n previousEndpoint = endpoint;\n }\n\n if (byteOffset !== bytes.length) {\n return undefined;\n }\n return endpoints;\n}\n\nfunction hasExpectedRanges(\n endpoints: Uint32Array,\n expected: FeedbackUnicodeProfileExpectation,\n): boolean {\n let previousEnd = -1;\n let codePointCount = 0;\n\n for (let index = 0; index < endpoints.length; index += 2) {\n const start = endpoints[index];\n const end = endpoints[index + 1];\n if (\n start === undefined ||\n end === undefined ||\n start <= previousEnd ||\n end <= start ||\n end > MAX_UNICODE_ENDPOINT\n ) {\n return false;\n }\n codePointCount += end - start;\n previousEnd = end;\n }\n\n return codePointCount === expected.codePointCount;\n}\n\n/**\n * Decodes and validates the checked-in Unicode profile artifact.\n *\n * This is an internal supply-boundary helper. It deliberately returns no\n * partial data: malformed base64url, non-shortest ULEB128, overflow, range\n * disorder, count mismatch, trailing bytes, or metadata drift all fail\n * closed.\n */\nexport function decodeFeedbackUnicodeProfileArtifact(\n value: unknown,\n expected: FeedbackUnicodeProfileExpectation,\n): Uint32Array | undefined {\n if (\n !isRecord(value) ||\n !hasBoundedCounts(value, expected) ||\n !hasExpectedMetadata(value, expected) ||\n typeof value.payload !== \"string\"\n ) {\n return undefined;\n }\n\n const bytes = decodeCanonicalBase64Url(value.payload);\n if (bytes === undefined) {\n return undefined;\n }\n const endpoints = decodeCanonicalEndpointDeltas(\n bytes,\n expected.endpointCount,\n );\n return endpoints !== undefined && hasExpectedRanges(endpoints, expected)\n ? endpoints\n : undefined;\n}\n","import profileArtifact from \"../unicode/feedback-unicode-15.1.0-unassigned.json\" with {\n type: \"json\",\n};\nimport { decodeFeedbackUnicodeProfileArtifact } from \"./feedback-unicode-profile.codec.js\";\n\n/** Canonical Unicode and normalization profile for transient feedback text. */\nexport const FEEDBACK_UNICODE_PROFILE_ID =\n \"unicode-15.1.0-nfkc-v1\" as const;\n\n/**\n * SHA-256 of the flattened half-open range endpoints encoded as unsigned\n * 32-bit big-endian integers.\n */\nexport const FEEDBACK_UNICODE_PROFILE_ENDPOINT_SHA256 =\n \"591e457524d6b4b988aa7c7687e76c95a78370fea38bbd1b09085be7fd935ef3\" as const;\n\nconst MAX_UNICODE_CODE_POINT = 0x10ffff;\nconst HIGH_SURROGATE_START = 0xd800;\nconst HIGH_SURROGATE_END = 0xdbff;\nconst LOW_SURROGATE_START = 0xdc00;\nconst LOW_SURROGATE_END = 0xdfff;\n\nconst UNASSIGNED_RANGE_ENDPOINTS = decodeFeedbackUnicodeProfileArtifact(\n profileArtifact,\n {\n profileId: FEEDBACK_UNICODE_PROFILE_ID,\n unicodeVersion: \"15.1.0\",\n sourcePackage: \"@unicode/unicode-15.1.0\",\n sourcePackageVersion: \"1.6.17\",\n sourceProperty: \"General_Category/Unassigned\",\n rangeEncoding: \"flat-half-open-delta-uleb128-base64url-v1\",\n rangeCount: 707,\n endpointCount: 1_414,\n codePointCount: 824_718,\n endpointSha256: FEEDBACK_UNICODE_PROFILE_ENDPOINT_SHA256,\n },\n);\n\n/**\n * Reports whether a numeric code point is unsupported by the pinned feedback\n * profile.\n *\n * Unicode 15.1 `General_Category=Unassigned` values return `true`. Invalid\n * numeric values and surrogate code points also return `true` so validation\n * callers fail closed.\n */\nexport function isFeedbackUnicodeProfileUnassigned(\n codePoint: number,\n): boolean {\n if (\n UNASSIGNED_RANGE_ENDPOINTS === undefined ||\n !Number.isInteger(codePoint) ||\n codePoint < 0 ||\n codePoint > MAX_UNICODE_CODE_POINT ||\n (codePoint >= HIGH_SURROGATE_START &&\n codePoint <= LOW_SURROGATE_END)\n ) {\n return true;\n }\n\n let lowerRange = 0;\n let upperRange = UNASSIGNED_RANGE_ENDPOINTS.length / 2 - 1;\n\n while (lowerRange <= upperRange) {\n const rangeIndex = Math.floor((lowerRange + upperRange) / 2);\n const start = UNASSIGNED_RANGE_ENDPOINTS[rangeIndex * 2];\n const end = UNASSIGNED_RANGE_ENDPOINTS[rangeIndex * 2 + 1];\n\n if (start === undefined || end === undefined) {\n return true;\n }\n if (codePoint < start) {\n upperRange = rangeIndex - 1;\n } else if (codePoint >= end) {\n lowerRange = rangeIndex + 1;\n } else {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Reports whether text contains a Unicode 15.1-unassigned code point or a\n * lone UTF-16 surrogate.\n *\n * The scan uses code units deliberately so malformed strings cannot be\n * silently replaced or normalized before profile enforcement. Callers must\n * apply their own UTF-16 length bound before passing untrusted text; this\n * generic helper intentionally does not impose a product-specific limit.\n */\nexport function containsFeedbackUnicodeProfileUnsupportedText(\n text: string,\n): boolean {\n if (typeof text !== \"string\") {\n return true;\n }\n\n for (let index = 0; index < text.length; index += 1) {\n const first = text.charCodeAt(index);\n let codePoint = first;\n\n if (first >= HIGH_SURROGATE_START && first <= HIGH_SURROGATE_END) {\n const second = text.charCodeAt(index + 1);\n if (\n !Number.isInteger(second) ||\n second < LOW_SURROGATE_START ||\n second > LOW_SURROGATE_END\n ) {\n return true;\n }\n codePoint =\n 0x10000 +\n ((first - HIGH_SURROGATE_START) << 10) +\n (second - LOW_SURROGATE_START);\n index += 1;\n } else if (first >= LOW_SURROGATE_START && first <= LOW_SURROGATE_END) {\n return true;\n }\n\n if (isFeedbackUnicodeProfileUnassigned(codePoint)) {\n return true;\n }\n }\n\n return false;\n}\n","import { field } from \"./field.js\";\nimport { FEEDBACK_CONTRACT_VERSION } from \"./feedback-contract-version.js\";\nimport {\n FEEDBACK_BACKEND_BUCKETS,\n FEEDBACK_FRAME_RATE_BUCKETS,\n FEEDBACK_FRAME_TIME_BUCKETS,\n FEEDBACK_GAME_COUNTER_CODES,\n FEEDBACK_GAME_COUNTER_MAX_COUNT,\n FEEDBACK_GAME_COUNTER_MAX_ITEMS,\n FEEDBACK_GAME_ERROR_CODES,\n FEEDBACK_GAME_FEATURE_IDS,\n FEEDBACK_GAME_PROVENANCE_CONTRACT_IDS,\n FEEDBACK_GAME_PROVENANCE_CONTRACTS,\n FEEDBACK_GAME_SURFACE_IDS,\n FEEDBACK_RENDERER_BUCKETS,\n FEEDBACK_VIEWPORT_BUCKETS,\n FeedbackGameDiagnosticsSchema,\n feedbackGameDiagnosticsShape as gameDiagnosticsShape,\n isFeedbackGameDiagnosticsConsistent as isGameDiagnosticsConsistent,\n validateFeedbackGameDiagnostics,\n} from \"./feedback-diagnostics.contract.js\";\nimport type {\n FeedbackGameDiagnostics,\n FeedbackGameDiagnosticsValidationResult,\n} from \"./feedback-diagnostics.contract.js\";\nimport {\n FEEDBACK_UNICODE_PROFILE_ID,\n containsFeedbackUnicodeProfileUnsupportedText,\n} from \"./feedback-unicode-profile.js\";\nimport { createSchema } from \"./schema.js\";\nimport type { ValidationIssue } from \"./validation.types.js\";\n\nexport { FEEDBACK_CONTRACT_VERSION };\nexport {\n FEEDBACK_BACKEND_BUCKETS,\n FEEDBACK_FRAME_RATE_BUCKETS,\n FEEDBACK_FRAME_TIME_BUCKETS,\n FEEDBACK_GAME_COUNTER_CODES,\n FEEDBACK_GAME_COUNTER_MAX_COUNT,\n FEEDBACK_GAME_COUNTER_MAX_ITEMS,\n FEEDBACK_GAME_ERROR_CODES,\n FEEDBACK_GAME_FEATURE_IDS,\n FEEDBACK_GAME_PROVENANCE_CONTRACT_IDS,\n FEEDBACK_GAME_PROVENANCE_CONTRACTS,\n FEEDBACK_GAME_SURFACE_IDS,\n FEEDBACK_RENDERER_BUCKETS,\n FEEDBACK_VIEWPORT_BUCKETS,\n FeedbackGameDiagnosticsSchema,\n validateFeedbackGameDiagnostics,\n};\nexport type {\n FeedbackGameDiagnostics,\n FeedbackGameDiagnosticsValidationResult,\n};\n\n/**\n * Canonical Unicode normalization data shared by every v1 narrative\n * processor.\n */\nexport const FEEDBACK_UNICODE_NORMALIZATION_PROFILE =\n FEEDBACK_UNICODE_PROFILE_ID;\n\n/** Exact progressive bug cooldown ladder, in seconds. */\nexport const FEEDBACK_BUG_COOLDOWN_SECONDS = Object.freeze([\n 5 * 60,\n 15 * 60,\n 60 * 60,\n 6 * 60 * 60,\n 24 * 60 * 60,\n] as const);\n\n/** Exact post-review suppression period, in seconds. */\nexport const FEEDBACK_REVIEW_COOLDOWN_SECONDS = 30 * 24 * 60 * 60;\n\n/** Stable issue types accepted by bug-report intake. */\nexport const FEEDBACK_ISSUE_TYPES = [\n \"visual-layout\",\n \"functionality\",\n \"gameplay\",\n \"performance-stability\",\n \"accessibility\",\n \"content-localisation\",\n \"account-access\",\n \"privacy-security\",\n \"other\",\n] as const;\n\n/** Issue types that may be persisted after intake routing. */\nexport const FEEDBACK_PERSISTABLE_ISSUE_TYPES = FEEDBACK_ISSUE_TYPES.filter(\n (issueType) => issueType !== \"privacy-security\",\n);\n\n/** Stable severity scale and translation keys for accessible star controls. */\nexport const FEEDBACK_SEVERITY_LEVELS = [\n { value: 1, id: \"cosmetic\", labelKey: \"feedback.severity.cosmetic\" },\n { value: 2, id: \"minor\", labelKey: \"feedback.severity.minor\" },\n { value: 3, id: \"disruptive\", labelKey: \"feedback.severity.disruptive\" },\n { value: 4, id: \"blocking\", labelKey: \"feedback.severity.blocking\" },\n { value: 5, id: \"critical\", labelKey: \"feedback.severity.critical\" },\n] as const;\n\n/** Stable satisfaction scale and translation keys for accessible stars. */\nexport const FEEDBACK_SATISFACTION_LEVELS = [\n { value: 1, id: \"very-poor\", labelKey: \"feedback.satisfaction.very-poor\" },\n { value: 2, id: \"poor\", labelKey: \"feedback.satisfaction.poor\" },\n { value: 3, id: \"fair\", labelKey: \"feedback.satisfaction.fair\" },\n { value: 4, id: \"good\", labelKey: \"feedback.satisfaction.good\" },\n { value: 5, id: \"excellent\", labelKey: \"feedback.satisfaction.excellent\" },\n] as const;\n\n/** Closed sentiment output from the transient English classifier. */\nexport const FEEDBACK_SENTIMENT_BUCKETS = [\n \"very-negative\",\n \"negative\",\n \"mixed\",\n \"neutral\",\n \"positive\",\n \"very-positive\",\n \"not-detected\",\n] as const;\n\n/** Closed intent output from the transient classifier. */\nexport const FEEDBACK_INTENT_IDS = [\n \"visual-layout\",\n \"functionality\",\n \"gameplay\",\n \"performance-stability\",\n \"accessibility\",\n \"content-localisation\",\n \"account-access\",\n \"other\",\n \"praise\",\n \"suggestion\",\n \"confusion\",\n \"frustration\",\n] as const;\n\n/** Closed theme output from the transient classifier. */\nexport const FEEDBACK_THEME_IDS = [\n \"navigation\",\n \"visual-design\",\n \"game-controls\",\n \"rendering\",\n \"responsiveness\",\n \"stability\",\n \"accessibility\",\n \"localisation\",\n \"account-access\",\n \"overall-experience\",\n \"other\",\n] as const;\n\n/** Closed site-section identifiers; arbitrary routes and URLs are forbidden. */\nexport const FEEDBACK_SURFACE_IDS = [\n \"site.about\",\n \"admin.analytics\",\n \"admin.capabilities\",\n \"admin.feature-flags\",\n \"admin.feedback\",\n \"admin.moderation\",\n \"admin.users\",\n \"site.chatbot\",\n \"site.generator\",\n \"site.gpu-demo\",\n \"site.home\",\n \"game.player-system\",\n \"account.profile\",\n \"site.video\",\n] as const;\n\n/** Canonical capability-projection metadata for every feedback surface. */\nexport const FEEDBACK_SURFACE_DEFINITIONS = [\n {\n id: \"site.about\",\n labelKey: \"feedback.surface.about\",\n kind: \"public\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"admin.analytics\",\n labelKey: \"feedback.surface.adminAnalytics\",\n kind: \"admin\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"admin.capabilities\",\n labelKey: \"feedback.surface.adminCapabilities\",\n kind: \"admin\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"admin.feature-flags\",\n labelKey: \"feedback.surface.adminFeatureFlags\",\n kind: \"admin\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"admin.feedback\",\n labelKey: \"feedback.surface.adminFeedback\",\n kind: \"admin\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"admin.moderation\",\n labelKey: \"feedback.surface.adminModeration\",\n kind: \"admin\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"admin.users\",\n labelKey: \"feedback.surface.adminUsers\",\n kind: \"admin\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"site.chatbot\",\n labelKey: \"feedback.surface.chatbot\",\n kind: \"public\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"site.generator\",\n labelKey: \"feedback.surface.generator\",\n kind: \"game\",\n gameDiagnosticsEligible: true,\n },\n {\n id: \"site.gpu-demo\",\n labelKey: \"feedback.surface.gpuDemo\",\n kind: \"game\",\n gameDiagnosticsEligible: true,\n },\n {\n id: \"site.home\",\n labelKey: \"feedback.surface.home\",\n kind: \"public\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"game.player-system\",\n labelKey: \"feedback.surface.playerSystem\",\n kind: \"game\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"account.profile\",\n labelKey: \"feedback.surface.profile\",\n kind: \"authenticated\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"site.video\",\n labelKey: \"feedback.surface.video\",\n kind: \"public\",\n gameDiagnosticsEligible: false,\n },\n] as const;\n\n/** Closed reasons for falling back to explicit structured-only submission. */\nexport const FEEDBACK_STRUCTURED_ONLY_REASON_CODES = [\n \"analysis-unavailable\",\n \"invalid-envelope\",\n \"invalid-sensitive-payload\",\n \"language-not-enabled\",\n \"request-too-large\",\n \"length-required\",\n] as const;\n\n/** Pinned privacy policy versions permitted in retained analysis. */\nexport const FEEDBACK_PRIVACY_POLICY_VERSIONS = [\n \"feedback-privacy-en-v1\",\n] as const;\n\n/** Pinned local model versions permitted in retained analysis. */\nexport const FEEDBACK_ANALYSIS_MODEL_VERSIONS = [\n \"feedback-en-rules-v1\",\n] as const;\n\nfor (const vocabulary of [\n FEEDBACK_BUG_COOLDOWN_SECONDS,\n FEEDBACK_ISSUE_TYPES,\n FEEDBACK_PERSISTABLE_ISSUE_TYPES,\n FEEDBACK_SEVERITY_LEVELS,\n FEEDBACK_SATISFACTION_LEVELS,\n FEEDBACK_SENTIMENT_BUCKETS,\n FEEDBACK_INTENT_IDS,\n FEEDBACK_THEME_IDS,\n FEEDBACK_SURFACE_IDS,\n FEEDBACK_SURFACE_DEFINITIONS,\n FEEDBACK_STRUCTURED_ONLY_REASON_CODES,\n FEEDBACK_PRIVACY_POLICY_VERSIONS,\n FEEDBACK_ANALYSIS_MODEL_VERSIONS,\n]) {\n Object.freeze(vocabulary);\n}\nfor (const entry of [\n ...FEEDBACK_SEVERITY_LEVELS,\n ...FEEDBACK_SATISFACTION_LEVELS,\n ...FEEDBACK_SURFACE_DEFINITIONS,\n]) {\n Object.freeze(entry);\n}\n\n/** Bug issue-type identifier. */\nexport type FeedbackIssueType = (typeof FEEDBACK_ISSUE_TYPES)[number];\n\n/** Persistable issue type after confidential security routing. */\nexport type FeedbackPersistableIssueType =\n (typeof FEEDBACK_PERSISTABLE_ISSUE_TYPES)[number];\n\n/** One-to-five bug severity. */\nexport type FeedbackSeverity =\n (typeof FEEDBACK_SEVERITY_LEVELS)[number][\"value\"];\n\n/** One-to-five satisfaction score. */\nexport type FeedbackSatisfaction =\n (typeof FEEDBACK_SATISFACTION_LEVELS)[number][\"value\"];\n\n/** Closed transient sentiment bucket. */\nexport type FeedbackSentiment =\n (typeof FEEDBACK_SENTIMENT_BUCKETS)[number];\n\n/** Closed transient intent identifier. */\nexport type FeedbackIntentId = (typeof FEEDBACK_INTENT_IDS)[number];\n\n/** Closed transient theme identifier. */\nexport type FeedbackThemeId = (typeof FEEDBACK_THEME_IDS)[number];\n\n/** Closed site-section identifier eligible for capability projection. */\nexport type FeedbackSurfaceId = (typeof FEEDBACK_SURFACE_IDS)[number];\n\n/** Supported rich-text mark. */\nexport type FeedbackRichTextMark = \"bold\" | \"italic\" | \"underline\";\n\n/** Text leaf in the transient rich-text AST. */\nexport interface FeedbackRichTextNode {\n type: \"text\";\n text: string;\n marks?: readonly FeedbackRichTextMark[];\n}\n\n/** Paragraph or bullet-list item in the transient rich-text AST. */\nexport type FeedbackRichTextBlock =\n | {\n type: \"paragraph\";\n depth: number;\n children: readonly FeedbackRichTextNode[];\n }\n | {\n type: \"listItem\";\n listType: \"bullet\";\n depth: number;\n children: readonly FeedbackRichTextNode[];\n };\n\n/** Browser/scanner interoperable transient document. */\nexport interface FeedbackRichTextDocument {\n type: \"doc\";\n schemaVersion: \"1\";\n children: readonly FeedbackRichTextBlock[];\n version: typeof FEEDBACK_CONTRACT_VERSION;\n}\n\n/** Browser/scanner interoperable encrypted narrative envelope. */\nexport interface FeedbackEncryptedNarrativeEnvelope {\n type: \"feedback-encrypted-narrative-envelope\";\n version: typeof FEEDBACK_CONTRACT_VERSION;\n schemaVersion: \"1\";\n keyId: string;\n algorithm: \"RSA-OAEP-256+A256GCM\";\n wrappedKey: string;\n iv: string;\n ciphertext: string;\n authenticationTag: string;\n}\n\ninterface FeedbackTransientAnalysisRequestBase {\n type: \"feedback-transient-analysis-request\";\n version: typeof FEEDBACK_CONTRACT_VERSION;\n schemaVersion: \"1\";\n requestId: string;\n deterministicRedactionCount: number;\n envelope: FeedbackEncryptedNarrativeEnvelope;\n}\n\n/**\n * One-use bug analysis request bound to a closed surface that the service\n * must authorise before handing ciphertext to the private scanner.\n */\nexport interface FeedbackBugTransientAnalysisRequest\n extends FeedbackTransientAnalysisRequestBase {\n purpose: \"bug\";\n surfaceId: FeedbackSurfaceId;\n}\n\n/** One-use satisfaction-review analysis request with no site surface. */\nexport interface FeedbackReviewTransientAnalysisRequest\n extends FeedbackTransientAnalysisRequestBase {\n purpose: \"review\";\n surfaceId?: never;\n}\n\n/** Closed purpose-discriminated request that must never be persisted or logged. */\nexport type FeedbackTransientAnalysisRequest =\n | FeedbackBugTransientAnalysisRequest\n | FeedbackReviewTransientAnalysisRequest;\n\n/** Typed result for the purpose-discriminated transient request validator. */\nexport type FeedbackTransientAnalysisRequestValidationResult =\n | {\n readonly valid: true;\n readonly value: FeedbackTransientAnalysisRequest;\n readonly errors?: never;\n readonly issues?: never;\n }\n | {\n readonly valid: false;\n readonly value?: never;\n readonly errors: readonly string[];\n readonly issues?: readonly ValidationIssue[];\n };\n\n/** Closed classifier fields that may be persisted. */\nexport interface FeedbackDerivedAnalysis {\n type: \"feedback-derived-analysis\";\n version: typeof FEEDBACK_CONTRACT_VERSION;\n status: \"analyzed\" | \"structured-only\";\n sentiment?: FeedbackSentiment;\n intentIds: readonly FeedbackIntentId[];\n themeIds: readonly FeedbackThemeId[];\n confidence?: \"low\" | \"medium\" | \"high\";\n policyVersion: string;\n modelVersion: string;\n deterministicRedactionCount: number;\n scannerRedactionCount: number;\n}\n\n/** Ephemeral one-use scanner receipt. */\nexport interface FeedbackAnalysisReceipt\n extends Omit<FeedbackDerivedAnalysis, \"type\" | \"status\"> {\n type: \"feedback-analysis-receipt\";\n status: \"analyzed\";\n receiptId: string;\n analyzedAt: string;\n}\n\n/** Identifier-free immutable bug packet. */\nexport interface FeedbackBugPacket {\n type: \"feedback-bug-packet\";\n version: typeof FEEDBACK_CONTRACT_VERSION;\n packetId: string;\n acceptedAt: string;\n surfaceId: string;\n issueType: FeedbackPersistableIssueType;\n severity: FeedbackSeverity;\n releaseId: string;\n buildId: string;\n analysis?: FeedbackDerivedAnalysis;\n gameDiagnostics?: FeedbackGameDiagnostics;\n}\n\n/** Identifier-free immutable satisfaction packet. */\nexport interface FeedbackReviewPacket {\n type: \"feedback-review-packet\";\n version: typeof FEEDBACK_CONTRACT_VERSION;\n packetId: string;\n acceptedAt: string;\n satisfaction: FeedbackSatisfaction;\n analysis?: FeedbackDerivedAnalysis;\n}\n\n/** Count bucket used by materialized feedback reports. */\nexport interface FeedbackCountBucket {\n id: string;\n count: number;\n}\n\n/** A weekly public point that reveals nothing when the privacy threshold fails. */\nexport type FeedbackPublicWeeklyPoint =\n | {\n weekStart: string;\n state: \"suppressed\";\n }\n | {\n weekStart: string;\n state: \"published\";\n acceptedReviewCount: number;\n averageStars: number;\n };\n\n/** Thresholded preceding-window facts used to derive the public trend. */\nexport interface FeedbackPublicComparison {\n previousAcceptedReviewCount: number;\n previousAverageStars: number;\n deltaStars: number;\n}\n\ninterface FeedbackPublicSummaryBase {\n type: \"feedback-public-summary\";\n version: typeof FEEDBACK_CONTRACT_VERSION;\n snapshotId: string;\n generatedAt: string;\n asOf: string;\n freshness: \"fresh\" | \"stale\";\n reportAgeSeconds: number;\n rollingWindowDays: 90;\n weeklyPoints: readonly FeedbackPublicWeeklyPoint[];\n}\n\n/** Daily read model that omits every public metric below ten reviews. */\nexport type FeedbackPublicSummary =\n | (FeedbackPublicSummaryBase & {\n state: \"suppressed\";\n })\n | (FeedbackPublicSummaryBase & {\n state: \"published\";\n acceptedReviewCount: number;\n averageStars: number;\n comparison?: FeedbackPublicComparison;\n trend?: \"up\" | \"flat\" | \"down\";\n });\n\nconst SAFE_ID_PATTERN = /^[a-z0-9][a-z0-9._:-]*$/i;\nconst INGESTION_KEY_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\nconst BASE64URL_PATTERN = /^[A-Za-z0-9_-]+$/;\nconst OPAQUE_UUID_V4_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;\nconst DISALLOWED_NARRATIVE_SYNTAX_PATTERN =\n /<|>|(?:https?|ftp|mailto|javascript|data|blob|file):|\\/\\/|www\\.|\\]\\s*\\(/i;\nconst DISALLOWED_UNICODE_FORMAT_PATTERN = /\\p{Cf}/u;\nconst MAX_NARRATIVE_CHARACTERS = 4_000;\nconst MAX_NARRATIVE_UTF16_CODE_UNITS = 8_000;\nconst MAX_COUNT = 1_000_000_000;\nconst BASE64URL_ALPHABET =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\nconst BUG_HOUR_WINDOW_PATTERN =\n /^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])T(?:[01]\\d|2[0-3])$/;\nconst REVIEW_DAY_WINDOW_PATTERN =\n /^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$/;\nconst RECONCILIATION_WINDOW_PATTERN =\n /^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])T(?:[01]\\d|2[0-3]):(?:[0-5]\\d)$/;\n\nconst strictOptions = {\n version: FEEDBACK_CONTRACT_VERSION,\n piiEnforcement: \"strict\" as const,\n unknownFields: \"reject\" as const,\n identity: \"exact\" as const,\n};\n\nconst uuidField = () =>\n field\n .string()\n .validator((value) => OPAQUE_UUID_V4_PATTERN.test(value))\n .description(\"Opaque UUID generated for the feedback workflow\");\n\nconst draftIdField = () =>\n field\n .string()\n .validator((value) => OPAQUE_UUID_V4_PATTERN.test(value))\n .description(\"Opaque identifier for one short-lived structured draft\")\n .PID({\n classification: \"low\",\n action: \"none\",\n logHandling: \"omit\",\n purpose: \"short-lived feedback draft lookup that must never enter logs\",\n });\n\nconst safeIdField = (maximum = 128) =>\n field.string().min(1).max(maximum).pattern(SAFE_ID_PATTERN);\n\nconst ingestionKeyIdField = () =>\n field\n .string()\n .min(1)\n .max(80)\n .pattern(INGESTION_KEY_ID_PATTERN);\n\nconst decodeCanonicalBase64Url = (value: string): Uint8Array | undefined => {\n if (\n !BASE64URL_PATTERN.test(value) ||\n value.length % 4 === 1\n ) {\n return undefined;\n }\n const finalValue = BASE64URL_ALPHABET.indexOf(value.at(-1) ?? \"\");\n if (\n finalValue < 0 ||\n (value.length % 4 === 2 && (finalValue & 0b1111) !== 0) ||\n (value.length % 4 === 3 && (finalValue & 0b11) !== 0)\n ) {\n return undefined;\n }\n\n const output: number[] = [];\n let accumulator = 0;\n let bitCount = 0;\n for (const character of value) {\n const sextet = BASE64URL_ALPHABET.indexOf(character);\n if (sextet < 0) {\n return undefined;\n }\n accumulator = (accumulator << 6) | sextet;\n bitCount += 6;\n while (bitCount >= 8) {\n bitCount -= 8;\n output.push((accumulator >> bitCount) & 0xff);\n accumulator &= (1 << bitCount) - 1;\n }\n }\n return Uint8Array.from(output);\n};\n\nconst isCanonicalRsaModulus = (value: string): boolean => {\n const bytes = decodeCanonicalBase64Url(value);\n return (\n bytes !== undefined &&\n (bytes.length === 256 ||\n bytes.length === 384 ||\n bytes.length === 512) &&\n (bytes[0] ?? 0) >= 0x80 &&\n ((bytes.at(-1) ?? 0) & 1) === 1\n );\n};\n\nconst isCanonicalRsaExponent = (value: string): boolean => {\n const bytes = decodeCanonicalBase64Url(value);\n if (\n bytes === undefined ||\n bytes.length < 1 ||\n bytes.length > 4 ||\n bytes[0] === 0\n ) {\n return false;\n }\n const exponent = bytes.reduce(\n (total, byte) => total * 256 + byte,\n 0,\n );\n return exponent >= 3 && exponent % 2 === 1;\n};\n\nconst surfaceIdField = () =>\n field.string().enum(FEEDBACK_SURFACE_IDS);\n\nconst countField = () =>\n field\n .number()\n .validator((value) => Number.isSafeInteger(value))\n .min(0)\n .max(MAX_COUNT);\n\nconst positiveCountField = (maximum = MAX_COUNT) =>\n field\n .number()\n .validator((value) => Number.isSafeInteger(value))\n .min(1)\n .max(maximum);\n\nconst redactionCountField = () =>\n field\n .number()\n .validator((value) => Number.isSafeInteger(value))\n .min(0)\n .max(MAX_NARRATIVE_CHARACTERS);\n\nconst revisionField = () =>\n field\n .number()\n .validator((value) => Number.isSafeInteger(value))\n .min(0)\n .max(1_000_000);\n\nconst ratingField = () =>\n field\n .number()\n .validator((value) => Number.isInteger(value))\n .min(1)\n .max(5);\n\nconst narrativeTextField = () =>\n field\n .string()\n .validator(\n (value) =>\n typeof value === \"string\" &&\n value.length >= 1 &&\n value.length <= MAX_NARRATIVE_UTF16_CODE_UNITS &&\n !containsFeedbackUnicodeProfileUnsupportedText(value) &&\n value.normalize(\"NFKC\") === value &&\n [...value].length <= MAX_NARRATIVE_CHARACTERS &&\n !DISALLOWED_NARRATIVE_SYNTAX_PATTERN.test(value) &&\n !DISALLOWED_UNICODE_FORMAT_PATTERN.test(value) &&\n ![...value].some((character) => {\n const codePoint = character.codePointAt(0);\n return (\n codePoint !== undefined &&\n (codePoint < 32 || codePoint === 127)\n );\n }),\n )\n .min(1)\n .max(MAX_NARRATIVE_UTF16_CODE_UNITS)\n .PID({\n classification: \"high\",\n action: \"clear\",\n logHandling: \"omit\",\n purpose:\n \"transient feedback narrative that must be discarded after classification\",\n });\n\nconst transientCorrelationIdField = () =>\n field\n .string()\n .validator((value) => OPAQUE_UUID_V4_PATTERN.test(value))\n .PID({\n classification: \"low\",\n action: \"clear\",\n logHandling: \"omit\",\n purpose: \"one-use transient feedback correlation\",\n });\n\nconst transientEncryptedField = (\n minimum: number,\n maximum: number,\n allowedLengths?: readonly number[],\n) =>\n field\n .string()\n .min(minimum)\n .max(maximum)\n .pattern(BASE64URL_PATTERN)\n .validator(\n (value) => {\n const decoded = decodeCanonicalBase64Url(value);\n return (\n decoded !== undefined &&\n decoded.length > 0 &&\n (allowedLengths === undefined ||\n allowedLengths.includes(value.length))\n );\n },\n )\n .PID({\n classification: \"high\",\n action: \"clear\",\n logHandling: \"omit\",\n purpose: \"encrypted transient feedback narrative material\",\n });\n\nconst richTextNodeShape = () => ({\n type: field.string().enum([\"text\"] as const),\n text: narrativeTextField(),\n marks: field\n .array(\n field.string().enum([\"bold\", \"italic\", \"underline\"] as const),\n )\n .max(3)\n .optional(),\n});\n\nconst richTextBlockShape = () => ({\n type: field.string().enum([\"paragraph\", \"listItem\"] as const),\n depth: field\n .number()\n .validator((value) => Number.isInteger(value))\n .min(0)\n .max(4),\n listType: field.string().enum([\"bullet\"] as const).optional(),\n children: field\n .array(field.object(richTextNodeShape()))\n .min(1)\n .max(128),\n});\n\nconst nestedIdentityShape = <T extends string>(type: T) => ({\n type: field.string().enum([type] as const),\n version: field.string().enum([FEEDBACK_CONTRACT_VERSION] as const),\n});\n\nconst envelopeShape = (includeIdentity = false) => ({\n ...(includeIdentity\n ? nestedIdentityShape(\"feedback-encrypted-narrative-envelope\")\n : {}),\n schemaVersion: field.string().enum([\"1\"] as const),\n keyId: ingestionKeyIdField(),\n algorithm: field\n .string()\n .enum([\"RSA-OAEP-256+A256GCM\"] as const),\n wrappedKey: transientEncryptedField(342, 683, [342, 512, 683]),\n iv: transientEncryptedField(16, 16, [16]),\n ciphertext: transientEncryptedField(2, 49_152),\n authenticationTag: transientEncryptedField(22, 22, [22]),\n});\n\nconst analysisProjectionShape = (includeIdentity = false) => ({\n ...(includeIdentity\n ? nestedIdentityShape(\"feedback-derived-analysis\")\n : {}),\n status: field.string().enum([\"analyzed\", \"structured-only\"] as const),\n sentiment: field.string().enum(FEEDBACK_SENTIMENT_BUCKETS).optional(),\n intentIds: field\n .array(field.string().enum(FEEDBACK_INTENT_IDS))\n .max(8),\n themeIds: field\n .array(field.string().enum(FEEDBACK_THEME_IDS))\n .max(8),\n confidence: field\n .string()\n .enum([\"low\", \"medium\", \"high\"] as const)\n .optional(),\n policyVersion: field.string().enum(FEEDBACK_PRIVACY_POLICY_VERSIONS),\n modelVersion: field.string().enum(FEEDBACK_ANALYSIS_MODEL_VERSIONS),\n deterministicRedactionCount: redactionCountField(),\n scannerRedactionCount: redactionCountField(),\n});\n\nconst analysisReceiptShape = () => ({\n receiptId: transientCorrelationIdField(),\n ...analysisProjectionShape(),\n analyzedAt: field.dateTimeISO(),\n});\n\nconst isAnalysisProjectionConsistent = (\n value: Record<string, unknown>,\n): boolean => {\n const status = value.status;\n const intentIds = value.intentIds;\n const themeIds = value.themeIds;\n if (!Array.isArray(intentIds) || !Array.isArray(themeIds)) {\n return false;\n }\n if (\n new Set(intentIds).size !== intentIds.length ||\n new Set(themeIds).size !== themeIds.length\n ) {\n return false;\n }\n if (status === \"structured-only\") {\n return (\n value.sentiment === undefined &&\n value.confidence === undefined &&\n intentIds.length === 0 &&\n themeIds.length === 0\n );\n }\n return (\n status === \"analyzed\" &&\n value.sentiment !== undefined &&\n value.confidence !== undefined\n );\n};\n\nconst optionalDraftFields = () => ({\n surfaceId: surfaceIdField().optional(),\n issueType: field.string().enum(FEEDBACK_ISSUE_TYPES).optional(),\n severity: ratingField().optional(),\n satisfaction: ratingField().optional(),\n analysisReceiptId: transientCorrelationIdField().optional(),\n});\n\nconst surfaceEntryShape = () => ({\n id: surfaceIdField(),\n labelKey: safeIdField(160),\n kind: field\n .string()\n .enum([\"public\", \"authenticated\", \"admin\", \"game\"] as const),\n gameDiagnosticsEligible: field.boolean(),\n});\n\nconst areSurfacesConsistent = (surfaces: unknown): boolean => {\n if (!Array.isArray(surfaces)) {\n return false;\n }\n const surfaceIds = surfaces.map(\n (surface: { id?: unknown }) => surface.id,\n );\n return (\n new Set(surfaceIds).size === surfaceIds.length &&\n surfaces.every(\n (surface: {\n id?: unknown;\n labelKey?: unknown;\n kind?: unknown;\n gameDiagnosticsEligible?: unknown;\n }) => {\n const definition = FEEDBACK_SURFACE_DEFINITIONS.find(\n ({ id }) => id === surface.id,\n );\n return (\n definition !== undefined &&\n surface.labelKey === definition.labelKey &&\n surface.kind === definition.kind &&\n surface.gameDiagnosticsEligible ===\n definition.gameDiagnosticsEligible\n );\n },\n )\n );\n};\n\nconst isDraftShapeConsistent = (value: Record<string, unknown>): boolean => {\n const hasDirtyField =\n value.surfaceId !== undefined ||\n value.issueType !== undefined ||\n value.severity !== undefined ||\n value.satisfaction !== undefined ||\n value.analysisReceiptId !== undefined ||\n value.analysis !== undefined;\n if (!hasDirtyField) {\n return false;\n }\n if (value.kind === \"bug\") {\n return value.satisfaction === undefined;\n }\n if (value.kind === \"review\") {\n return (\n value.surfaceId === undefined &&\n value.issueType === undefined &&\n value.severity === undefined\n );\n }\n return false;\n};\n\nconst isContextConsistent = (value: Record<string, any>): boolean => {\n if (!areSurfacesConsistent(value.surfaces)) {\n return false;\n }\n if (\n value.selectedSurfaceId !== undefined &&\n !value.surfaces.some(\n (surface: { id?: unknown }) => surface.id === value.selectedSurfaceId,\n )\n ) {\n return false;\n }\n const hasProjectedSurface = value.surfaces.length > 0;\n const hasDiagnosticsSurface = value.surfaces.some(\n (surface: { gameDiagnosticsEligible?: unknown }) =>\n surface.gameDiagnosticsEligible === true,\n );\n if (\n (value.eligibility.bugReport && !hasProjectedSurface) ||\n (value.eligibility.gameDiagnostics &&\n (!value.eligibility.bugReport || !hasDiagnosticsSurface))\n ) {\n return false;\n }\n\n const generatedAt = Date.parse(String(value.generatedAt));\n if (!Number.isFinite(generatedAt)) {\n return false;\n }\n const boundedFutureAvailabilityIsValid = (\n candidate: unknown,\n maximumSeconds: number,\n ): boolean => {\n if (candidate === undefined) {\n return true;\n }\n const availableAt = Date.parse(String(candidate));\n return (\n Number.isFinite(availableAt) &&\n availableAt > generatedAt &&\n availableAt - generatedAt <= maximumSeconds * 1_000\n );\n };\n const maximumBugCooldownSeconds =\n FEEDBACK_BUG_COOLDOWN_SECONDS[\n FEEDBACK_BUG_COOLDOWN_SECONDS.length - 1\n ] ?? 0;\n if (\n !boundedFutureAvailabilityIsValid(\n value.eligibility.bugAvailableAt,\n maximumBugCooldownSeconds,\n ) ||\n !boundedFutureAvailabilityIsValid(\n value.eligibility.reviewAvailableAt,\n FEEDBACK_REVIEW_COOLDOWN_SECONDS,\n )\n ) {\n return false;\n }\n const bugAvailableAt =\n value.eligibility.bugAvailableAt === undefined\n ? undefined\n : Date.parse(String(value.eligibility.bugAvailableAt));\n const bugRetryAfterSeconds =\n value.eligibility.bugRetryAfterSeconds;\n const bugCooldownIsConsistent =\n (bugAvailableAt === undefined &&\n bugRetryAfterSeconds === undefined) ||\n (bugAvailableAt !== undefined &&\n typeof bugRetryAfterSeconds === \"number\" &&\n bugRetryAfterSeconds ===\n Math.ceil((bugAvailableAt - generatedAt) / 1_000));\n if (\n !bugCooldownIsConsistent ||\n (value.eligibility.bugReport &&\n (value.eligibility.bugAvailableAt !== undefined ||\n value.eligibility.bugRetryAfterSeconds !== undefined)) ||\n (value.eligibility.review &&\n value.eligibility.reviewAvailableAt !== undefined) ||\n (value.eligibility.bugReport && !value.flags.bugReport) ||\n (value.eligibility.review && !value.flags.review) ||\n (value.eligibility.gameDiagnostics && !value.flags.gameDiagnostics)\n ) {\n return false;\n }\n\n if (!value.flags.transientAnalysis) {\n return value.ingestionKey === undefined;\n }\n if (value.ingestionKey === undefined) {\n return false;\n }\n const expiresAt = Date.parse(String(value.ingestionKey.expiresAt));\n return (\n Number.isFinite(expiresAt) &&\n expiresAt > generatedAt &&\n expiresAt - generatedAt <= 10 * 60 * 1_000\n );\n};\n\nconst distributionShape = (\n idField: () => ReturnType<typeof safeIdField> = () => safeIdField(128),\n) => ({\n id: idField(),\n count: countField(),\n});\n\nconst hasUniqueIds = (values: unknown): boolean =>\n Array.isArray(values) &&\n new Set(\n values.map((value) =>\n typeof value === \"object\" && value !== null\n ? (value as { id?: unknown }).id\n : undefined,\n ),\n ).size === values.length;\n\nconst distributionTotal = (values: unknown): number =>\n Array.isArray(values)\n ? values.reduce(\n (total, value) =>\n total +\n (typeof value === \"object\" &&\n value !== null &&\n typeof (value as { count?: unknown }).count === \"number\"\n ? (value as { count: number }).count\n : 0),\n 0,\n )\n : 0;\n\nconst distributionCountsAtMost = (\n values: unknown,\n maximum: number,\n): boolean =>\n Array.isArray(values) &&\n values.every(\n (value) =>\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { count?: unknown }).count === \"number\" &&\n (value as { count: number }).count <= maximum,\n );\n\nconst advisoryShape = () => ({\n code: field\n .string()\n .enum(\n [\n \"severity-five\",\n \"critical-regression\",\n \"satisfaction-drop\",\n \"processor-stale\",\n ] as const,\n ),\n level: field.string().enum([\"advisory\", \"critical\"] as const),\n triggerCount: positiveCountField(),\n recommendationIds: field\n .array(\n field\n .string()\n .enum(\n [\n \"inspect-release\",\n \"verify-renderer-health\",\n \"review-top-intents\",\n \"verify-processor-health\",\n ] as const,\n ),\n )\n .min(1)\n .max(8),\n});\n\nconst orderedWindow = (\n value: Record<string, unknown>,\n durationMilliseconds: number,\n): boolean => {\n const start = Date.parse(String(value.windowStart));\n const end = Date.parse(String(value.windowEnd));\n const generatedAt = Date.parse(String(value.generatedAt));\n return (\n Number.isFinite(start) &&\n Number.isFinite(end) &&\n Number.isFinite(generatedAt) &&\n new Date(start).toISOString() === value.windowStart &&\n new Date(end).toISOString() === value.windowEnd &&\n start % durationMilliseconds === 0 &&\n end - start === durationMilliseconds &&\n generatedAt >= end\n );\n};\n\ntype FeedbackProcessor =\n | \"bug-hourly\"\n | \"review-daily\"\n | \"commit-reconciliation\";\n\nconst processorWindow = (\n processor: FeedbackProcessor,\n windowKey: string,\n): { start: number; duration: number } | undefined => {\n let iso: string;\n let expectedLength: number;\n let duration: number;\n if (processor === \"bug-hourly\") {\n if (!BUG_HOUR_WINDOW_PATTERN.test(windowKey)) {\n return undefined;\n }\n iso = `${windowKey}:00:00.000Z`;\n expectedLength = 13;\n duration = 60 * 60 * 1_000;\n } else if (processor === \"review-daily\") {\n if (!REVIEW_DAY_WINDOW_PATTERN.test(windowKey)) {\n return undefined;\n }\n iso = `${windowKey}T00:00:00.000Z`;\n expectedLength = 10;\n duration = 24 * 60 * 60 * 1_000;\n } else {\n if (!RECONCILIATION_WINDOW_PATTERN.test(windowKey)) {\n return undefined;\n }\n const minute = Number(windowKey.slice(-2));\n if (minute % 5 !== 0) {\n return undefined;\n }\n iso = `${windowKey}:00.000Z`;\n expectedLength = 16;\n duration = 5 * 60 * 1_000;\n }\n const start = Date.parse(iso);\n if (\n !Number.isFinite(start) ||\n new Date(start).toISOString().slice(0, expectedLength) !== windowKey\n ) {\n return undefined;\n }\n return { start, duration };\n};\n\nconst isProcessorArtifactConsistent = (\n value: Record<string, unknown>,\n artifact: \"checkpoint\" | \"manifest\",\n): boolean => {\n const processor = value.processor as FeedbackProcessor;\n const windowKey = String(value.windowKey);\n const window = processorWindow(processor, windowKey);\n if (window === undefined) {\n return false;\n }\n const completedAt = Date.parse(\n String(\n artifact === \"checkpoint\" ? value.completedAt : value.generatedAt,\n ),\n );\n if (\n !Number.isFinite(completedAt) ||\n completedAt < window.start + window.duration\n ) {\n return false;\n }\n if (\n artifact === \"checkpoint\" &&\n value.checkpointId !==\n `checkpoint:${processor}:${windowKey}`\n ) {\n return false;\n }\n return true;\n};\n\nconst roundRate = (value: number): number =>\n Math.round((value + Number.EPSILON) * 1_000_000) / 1_000_000;\n\nconst rateMatches = (actual: unknown, expected: number): boolean =>\n typeof actual === \"number\" && actual === roundRate(expected);\n\nconst distributionCountFor = (values: unknown, id: string): number => {\n if (!Array.isArray(values)) {\n return 0;\n }\n const entry = values.find(\n (value) =>\n typeof value === \"object\" &&\n value !== null &&\n (value as { id?: unknown }).id === id,\n );\n return typeof entry === \"object\" &&\n entry !== null &&\n typeof (entry as { count?: unknown }).count === \"number\"\n ? (entry as { count: number }).count\n : 0;\n};\n\ntype FeedbackAdvisoryCode =\n | \"severity-five\"\n | \"critical-regression\"\n | \"satisfaction-drop\"\n | \"processor-stale\";\n\ninterface FeedbackAdvisoryExpectation {\n level: \"advisory\" | \"critical\";\n triggerCount: number;\n recommendationIds: readonly (\n | \"inspect-release\"\n | \"verify-renderer-health\"\n | \"review-top-intents\"\n | \"verify-processor-health\"\n )[];\n}\n\nconst advisoryCodesAreConsistent = (\n advisories: unknown,\n expected: Readonly<\n Partial<Record<FeedbackAdvisoryCode, FeedbackAdvisoryExpectation>>\n >,\n): boolean => {\n if (!Array.isArray(advisories)) {\n return false;\n }\n const expectedCodes = Object.entries(expected)\n .filter((entry): entry is [string, FeedbackAdvisoryExpectation] =>\n entry[1] !== undefined,\n )\n .map(([code]) => code);\n const codes = advisories.map(\n (advisory) =>\n (advisory as { code?: unknown } | null)?.code,\n );\n return (\n new Set(codes).size === codes.length &&\n codes.every(\n (code) =>\n typeof code === \"string\" &&\n expectedCodes.includes(code),\n ) &&\n codes.length === expectedCodes.length &&\n expectedCodes.every((code) => codes.includes(code)) &&\n advisories.every((advisory) => {\n const value = advisory as {\n code?: unknown;\n level?: unknown;\n triggerCount?: unknown;\n recommendationIds?: unknown;\n };\n const code =\n typeof value.code === \"string\"\n ? (value.code as FeedbackAdvisoryCode)\n : undefined;\n const expectation = code === undefined ? undefined : expected[code];\n if (\n expectation === undefined ||\n value.level !== expectation.level ||\n value.triggerCount !== expectation.triggerCount ||\n !Array.isArray(value.recommendationIds) ||\n value.recommendationIds.length !==\n expectation.recommendationIds.length\n ) {\n return false;\n }\n return value.recommendationIds.every(\n (recommendation, index) =>\n recommendation === expectation.recommendationIds[index],\n );\n })\n );\n};\n\n/** AST used only inside the transient no-retention narrative scanner. */\nexport const FeedbackRichTextAstSchema = createSchema(\n {\n schemaVersion: field.string().enum([\"1\"] as const),\n children: field\n .array(field.object(richTextBlockShape()))\n .min(1)\n .max(128),\n },\n \"doc\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n const blocks = Array.isArray(value.children) ? value.children : [];\n const blocksAreConsistent = blocks.every(\n (block: {\n type?: unknown;\n listType?: unknown;\n children?: Array<{ marks?: unknown }>;\n }) => {\n const listShapeIsValid =\n (block.type === \"paragraph\" && block.listType === undefined) ||\n (block.type === \"listItem\" && block.listType === \"bullet\");\n const marksAreUnique =\n Array.isArray(block.children) &&\n block.children.every(\n (child) =>\n child.marks === undefined ||\n (Array.isArray(child.marks) &&\n new Set(child.marks).size === child.marks.length),\n );\n return listShapeIsValid && marksAreUnique;\n },\n );\n const characterCount = blocks.reduce(\n (blockTotal: number, block: { children?: unknown }) =>\n blockTotal +\n (Array.isArray(block.children)\n ? block.children.reduce(\n (nodeTotal: number, node: { text?: unknown }) =>\n nodeTotal +\n (typeof node.text === \"string\"\n ? [...node.text].length\n : 0),\n 0,\n )\n : 0),\n 0,\n );\n const extractedCharacterCount =\n characterCount + Math.max(0, blocks.length - 1);\n const nodeCount = blocks.reduce(\n (total: number, block: { children?: unknown }) =>\n total + (Array.isArray(block.children) ? block.children.length : 0),\n 0,\n );\n return (\n value.type === \"doc\" &&\n value.schemaVersion === \"1\" &&\n blocksAreConsistent &&\n nodeCount <= 256 &&\n extractedCharacterCount > 0 &&\n extractedCharacterCount <= MAX_NARRATIVE_CHARACTERS\n );\n },\n },\n);\n\n/** Encrypted outer envelope accepted by privacy-specific middleware. */\nexport const FeedbackEncryptedNarrativeEnvelopeSchema = createSchema(\n envelopeShape(),\n \"feedback-encrypted-narrative-envelope\",\n strictOptions,\n);\n\n/** Transient scanner request; this contract must never be stored or logged. */\nexport const FeedbackTransientAnalysisRequestSchema = createSchema(\n {\n schemaVersion: field.string().enum([\"1\"] as const),\n requestId: transientCorrelationIdField(),\n purpose: field.string().enum([\"bug\", \"review\"] as const),\n surfaceId: surfaceIdField().optional(),\n deterministicRedactionCount: redactionCountField(),\n envelope: field.object(envelopeShape(true)),\n },\n \"feedback-transient-analysis-request\",\n {\n ...strictOptions,\n schemaValidator: (value, context) => {\n const surfaceWasProvided =\n context?.wasProvided(\"surfaceId\") ??\n Object.prototype.hasOwnProperty.call(value, \"surfaceId\");\n return (\n (value.purpose === \"bug\" && value.surfaceId !== undefined) ||\n (value.purpose === \"review\" && !surfaceWasProvided)\n );\n },\n },\n);\n\n/**\n * Validate and clone a transient request while preserving its purpose\n * discriminator for TypeScript consumers.\n */\nexport const validateFeedbackTransientAnalysisRequest = (\n input: unknown,\n): FeedbackTransientAnalysisRequestValidationResult => {\n const result = FeedbackTransientAnalysisRequestSchema.validate(input);\n if (!result.valid || result.value === undefined) {\n return {\n valid: false,\n errors: result.errors ?? [\"Transient analysis validation failed.\"],\n ...(result.issues === undefined ? {} : { issues: result.issues }),\n };\n }\n return {\n valid: true,\n value: result.value as unknown as FeedbackTransientAnalysisRequest,\n };\n};\n\n/** Identifier-free, closed classifier output safe to copy into a packet. */\nexport const FeedbackAnalysisReceiptSchema = createSchema(\n analysisReceiptShape(),\n \"feedback-analysis-receipt\",\n {\n ...strictOptions,\n schemaValidator: (value) =>\n value.status === \"analyzed\" &&\n isAnalysisProjectionConsistent(value),\n },\n);\n\n/**\n * Persistable classifier projection. Unlike the transient receipt it contains\n * no receipt identifier or scanner timestamp that could enable cross-boundary\n * joining.\n */\nexport const FeedbackDerivedAnalysisSchema = createSchema(\n analysisProjectionShape(),\n \"feedback-derived-analysis\",\n {\n ...strictOptions,\n schemaValidator: isAnalysisProjectionConsistent,\n },\n);\n\n/** Capability-filtered surface catalog with no hidden entitlement metadata. */\nexport const FeedbackSurfaceCatalogSchema = createSchema(\n {\n generatedAt: field.dateTimeISO(),\n catalogVersion: safeIdField(64),\n surfaces: field\n .array(field.object(surfaceEntryShape()))\n .max(256),\n },\n \"feedback-surface-catalog\",\n {\n ...strictOptions,\n schemaValidator: (value) => areSurfacesConsistent(value.surfaces),\n },\n);\n\n/** Capability-filtered surface catalog and effective feedback eligibility. */\nexport const FeedbackContextSchema = createSchema(\n {\n generatedAt: field.dateTimeISO(),\n catalogVersion: safeIdField(64),\n surfaces: field\n .array(field.object(surfaceEntryShape()))\n .max(256),\n selectedSurfaceId: surfaceIdField().optional(),\n flags: field.object({\n bugReport: field.boolean(),\n review: field.boolean(),\n transientAnalysis: field.boolean(),\n reporting: field.boolean(),\n admin: field.boolean(),\n mcp: field.boolean(),\n publicHonesty: field.boolean(),\n gameDiagnostics: field.boolean(),\n anonymous: field.boolean(),\n }),\n eligibility: field.object({\n bugReport: field.boolean(),\n review: field.boolean(),\n gameDiagnostics: field.boolean(),\n bugAvailableAt: field.dateTimeISO().optional(),\n reviewAvailableAt: field.dateTimeISO().optional(),\n bugRetryAfterSeconds: positiveCountField().optional(),\n }),\n ingestionKey: field\n .object({\n keyId: ingestionKeyIdField(),\n algorithm: field.string().enum([\"RSA-OAEP-256\"] as const),\n publicJwk: field.object({\n kty: field.string().enum([\"RSA\"] as const),\n alg: field.string().enum([\"RSA-OAEP-256\"] as const),\n use: field.string().enum([\"enc\"] as const),\n key_ops: field\n .array(field.string().enum([\"wrapKey\"] as const))\n .min(1)\n .max(1),\n n: field\n .string()\n .min(342)\n .max(683)\n .pattern(BASE64URL_PATTERN)\n .validator(isCanonicalRsaModulus),\n e: field\n .string()\n .min(2)\n .max(6)\n .pattern(BASE64URL_PATTERN)\n .validator(isCanonicalRsaExponent),\n ext: field.boolean().validator((value) => value === true),\n }),\n expiresAt: field.dateTimeISO(),\n })\n .optional(),\n },\n \"feedback-context\",\n {\n ...strictOptions,\n schemaValidator: isContextConsistent,\n },\n);\n\n/** Dirty structured fields sent by focus-loss autosave. */\nexport const FeedbackDraftUpsertRequestSchema = createSchema(\n {\n draftId: draftIdField(),\n kind: field.string().enum([\"bug\", \"review\"] as const),\n revision: revisionField(),\n ...optionalDraftFields(),\n },\n \"feedback-draft-upsert-request\",\n {\n ...strictOptions,\n schemaValidator: isDraftShapeConsistent,\n },\n);\n\n/** Short-lived structured draft packet; narrative and ciphertext are excluded. */\nexport const FeedbackDraftPacketSchema = createSchema(\n {\n draftId: draftIdField(),\n kind: field.string().enum([\"bug\", \"review\"] as const),\n revision: revisionField(),\n surfaceId: surfaceIdField().optional(),\n issueType: field.string().enum(FEEDBACK_ISSUE_TYPES).optional(),\n severity: ratingField().optional(),\n satisfaction: ratingField().optional(),\n analysis: field.object(analysisProjectionShape(true)).optional(),\n serverUpdatedAt: field.dateTimeISO(),\n expiresAt: field.dateTimeISO(),\n },\n \"feedback-draft-packet\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n if (!isDraftShapeConsistent(value)) {\n return false;\n }\n if (\n value.analysis !== undefined &&\n !isAnalysisProjectionConsistent(value.analysis)\n ) {\n return false;\n }\n const updatedAt = Date.parse(String(value.serverUpdatedAt));\n const expiresAt = Date.parse(String(value.expiresAt));\n return (\n Number.isFinite(updatedAt) &&\n Number.isFinite(expiresAt) &&\n expiresAt > updatedAt &&\n expiresAt - updatedAt <= 24 * 60 * 60 * 1_000\n );\n },\n },\n);\n\n/** ETag-external response after a structured draft is durably saved. */\nexport const FeedbackDraftReceiptSchema = createSchema(\n {\n draftId: draftIdField(),\n revision: revisionField(),\n savedAt: field.dateTimeISO(),\n expiresAt: field.dateTimeISO(),\n },\n \"feedback-draft-receipt\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n const savedAt = Date.parse(String(value.savedAt));\n const expiresAt = Date.parse(String(value.expiresAt));\n return (\n Number.isFinite(savedAt) &&\n Number.isFinite(expiresAt) &&\n expiresAt > savedAt &&\n expiresAt - savedAt <= 24 * 60 * 60 * 1_000\n );\n },\n },\n);\n\n/**\n * Explicit final bug submission request. Transport idempotency belongs only\n * in the HTTP Idempotency-Key header and is not part of this JSON contract.\n */\nexport const FeedbackBugSubmissionRequestSchema = createSchema(\n {\n draftId: draftIdField().optional(),\n surfaceId: surfaceIdField(),\n issueType: field.string().enum(FEEDBACK_ISSUE_TYPES),\n severity: ratingField(),\n analysisReceiptId: transientCorrelationIdField().optional(),\n gameDiagnostics: field.object(gameDiagnosticsShape(true)).optional(),\n },\n \"feedback-bug-submission-request\",\n {\n ...strictOptions,\n schemaValidator: (value) =>\n value.issueType !== \"privacy-security\" &&\n (value.gameDiagnostics === undefined ||\n (isGameDiagnosticsConsistent(value.gameDiagnostics) &&\n value.gameDiagnostics.surfaceId === value.surfaceId)),\n },\n);\n\n/**\n * Explicit authenticated satisfaction-review submission request. Transport\n * idempotency belongs only in the HTTP Idempotency-Key header.\n */\nexport const FeedbackReviewSubmissionRequestSchema = createSchema(\n {\n draftId: draftIdField().optional(),\n satisfaction: ratingField(),\n analysisReceiptId: transientCorrelationIdField().optional(),\n },\n \"feedback-review-submission-request\",\n strictOptions,\n);\n\n/** Identifier-free response after an immutable packet is accepted. */\nexport const FeedbackAcceptanceReceiptSchema = createSchema(\n {\n packetId: uuidField(),\n kind: field.string().enum([\"bug\", \"review\"] as const),\n acceptedAt: field.dateTimeISO(),\n nextEligibleAt: field.dateTimeISO(),\n },\n \"feedback-acceptance-receipt\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n const acceptedAt = Date.parse(String(value.acceptedAt));\n const nextEligibleAt = Date.parse(String(value.nextEligibleAt));\n const cooldownMilliseconds = nextEligibleAt - acceptedAt;\n if (\n !Number.isFinite(acceptedAt) ||\n !Number.isFinite(nextEligibleAt) ||\n cooldownMilliseconds <= 0 ||\n cooldownMilliseconds % 1_000 !== 0\n ) {\n return false;\n }\n const cooldownSeconds = cooldownMilliseconds / 1_000;\n return value.kind === \"review\"\n ? cooldownSeconds === FEEDBACK_REVIEW_COOLDOWN_SECONDS\n : (FEEDBACK_BUG_COOLDOWN_SECONDS as readonly number[]).includes(\n cooldownSeconds,\n );\n },\n },\n);\n\n/** Safe analysis fallback; it contains neither a receipt nor narrative. */\nexport const FeedbackStructuredOnlyAnalysisResultSchema = createSchema(\n {\n status: field.string().enum([\"structured-only-required\"] as const),\n reasonCode: field.string().enum(FEEDBACK_STRUCTURED_ONLY_REASON_CODES),\n },\n \"feedback-structured-only-analysis-result\",\n strictOptions,\n);\n\n/** Immutable structured bug packet for private blob storage. */\nexport const FeedbackBugPacketSchema = createSchema(\n {\n packetId: uuidField(),\n acceptedAt: field.dateTimeISO(),\n surfaceId: surfaceIdField(),\n issueType: field.string().enum(FEEDBACK_PERSISTABLE_ISSUE_TYPES),\n severity: ratingField(),\n releaseId: safeIdField(128),\n buildId: safeIdField(128),\n analysis: field.object(analysisProjectionShape(true)).optional(),\n gameDiagnostics: field.object(gameDiagnosticsShape(true)).optional(),\n },\n \"feedback-bug-packet\",\n {\n ...strictOptions,\n schemaValidator: (value) =>\n (value.analysis === undefined ||\n isAnalysisProjectionConsistent(value.analysis)) &&\n (value.gameDiagnostics === undefined ||\n (isGameDiagnosticsConsistent(value.gameDiagnostics) &&\n value.gameDiagnostics.surfaceId === value.surfaceId)),\n },\n);\n\n/** Immutable structured review packet for private blob storage. */\nexport const FeedbackReviewPacketSchema = createSchema(\n {\n packetId: uuidField(),\n acceptedAt: field.dateTimeISO(),\n satisfaction: ratingField(),\n analysis: field.object(analysisProjectionShape(true)).optional(),\n },\n \"feedback-review-packet\",\n {\n ...strictOptions,\n schemaValidator: (value) =>\n value.analysis === undefined ||\n isAnalysisProjectionConsistent(value.analysis),\n },\n);\n\n/** Safe facts used to reconstruct a representative in-game view server-side. */\nexport const FeedbackGameReconstructionManifestSchema = createSchema(\n {\n reconstructionId: uuidField(),\n bugPacketId: uuidField(),\n createdAt: field.dateTimeISO(),\n expiresAt: field.dateTimeISO(),\n curatedAssetSetId: safeIdField(128),\n noticeKey: safeIdField(160),\n diagnostics: field.object(gameDiagnosticsShape(true)),\n },\n \"feedback-game-reconstruction-manifest\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n const createdAt = Date.parse(String(value.createdAt));\n const expiresAt = Date.parse(String(value.expiresAt));\n return (\n isGameDiagnosticsConsistent(value.diagnostics) &&\n Number.isFinite(createdAt) &&\n Number.isFinite(expiresAt) &&\n expiresAt > createdAt &&\n expiresAt - createdAt <= 30 * 24 * 60 * 60 * 1_000\n );\n },\n },\n);\n\n/** Materialized report for one previous UTC bug-health hour. */\nexport const FeedbackHourlyBugReportSchema = createSchema(\n {\n reportId: uuidField(),\n windowStart: field.dateTimeISO(),\n windowEnd: field.dateTimeISO(),\n revision: revisionField(),\n generatedAt: field.dateTimeISO(),\n acceptedCount: countField(),\n rejectedCount: countField(),\n diagnosticsAttachedCount: countField(),\n deterministicRedactionCount: countField(),\n scannerRedactionCount: countField(),\n processorLagSeconds: countField(),\n rates: field.object({\n rejectionRate: field.number().min(0).max(1),\n deterministicRedactionsPerAccepted: field.number().min(0).max(4_000),\n scannerRedactionsPerAccepted: field.number().min(0).max(4_000),\n }),\n traffic: field.object({\n denominator: countField(),\n acceptedPerTenThousand: field\n .number()\n .min(0)\n .max(MAX_COUNT)\n .optional(),\n }),\n targetDistribution: field\n .array(field.object(distributionShape(surfaceIdField)))\n .max(256),\n issueTypeDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_PERSISTABLE_ISSUE_TYPES),\n ),\n ),\n )\n .max(FEEDBACK_ISSUE_TYPES.length),\n severityDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum([\"1\", \"2\", \"3\", \"4\", \"5\"] as const),\n ),\n ),\n )\n .max(5),\n intentDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_INTENT_IDS),\n ),\n ),\n )\n .max(FEEDBACK_INTENT_IDS.length),\n buildDistribution: field\n .array(field.object(distributionShape()))\n .max(128),\n rendererDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_RENDERER_BUCKETS),\n ),\n ),\n )\n .max(FEEDBACK_RENDERER_BUCKETS.length),\n backendDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_BACKEND_BUCKETS),\n ),\n ),\n )\n .max(FEEDBACK_BACKEND_BUCKETS.length),\n viewportDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_VIEWPORT_BUCKETS),\n ),\n ),\n )\n .max(FEEDBACK_VIEWPORT_BUCKETS.length),\n frameRateDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_FRAME_RATE_BUCKETS),\n ),\n ),\n )\n .max(FEEDBACK_FRAME_RATE_BUCKETS.length),\n frameTimeDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_FRAME_TIME_BUCKETS),\n ),\n ),\n )\n .max(FEEDBACK_FRAME_TIME_BUCKETS.length),\n diagnosticFeatureDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_GAME_FEATURE_IDS),\n ),\n ),\n )\n .max(FEEDBACK_GAME_FEATURE_IDS.length),\n diagnosticCounterDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_GAME_COUNTER_CODES),\n ),\n ),\n )\n .max(FEEDBACK_GAME_COUNTER_CODES.length),\n diagnosticErrorDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_GAME_ERROR_CODES),\n ),\n ),\n )\n .max(FEEDBACK_GAME_ERROR_CODES.length),\n abuseBlockBands: field\n .array(\n field.object(\n distributionShape(() =>\n field\n .string()\n .enum(\n [\n \"five-minutes\",\n \"fifteen-minutes\",\n \"one-hour\",\n \"six-hours\",\n \"twenty-four-hours\",\n \"fail-closed\",\n \"edge-blocked\",\n ] as const,\n ),\n ),\n ),\n )\n .max(16),\n comparison: field.object({\n previousHourRatio: field.number().min(0).max(1_000),\n sevenDaySameHourRatio: field.number().min(0).max(1_000),\n }),\n advisories: field.array(field.object(advisoryShape())).max(32),\n },\n \"feedback-hourly-bug-report\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n const distributions = [\n value.targetDistribution,\n value.issueTypeDistribution,\n value.severityDistribution,\n value.intentDistribution,\n value.buildDistribution,\n value.rendererDistribution,\n value.backendDistribution,\n value.viewportDistribution,\n value.frameRateDistribution,\n value.frameTimeDistribution,\n value.diagnosticFeatureDistribution,\n value.diagnosticCounterDistribution,\n value.diagnosticErrorDistribution,\n value.abuseBlockBands,\n ];\n const submittedCount = value.acceptedCount + value.rejectedCount;\n const expectedRejectionRate =\n submittedCount === 0 ? 0 : value.rejectedCount / submittedCount;\n const expectedDeterministicRate =\n value.acceptedCount === 0\n ? 0\n : value.deterministicRedactionCount / value.acceptedCount;\n const expectedScannerRate =\n value.acceptedCount === 0\n ? 0\n : value.scannerRedactionCount / value.acceptedCount;\n const trafficIsConsistent =\n (value.traffic.denominator === 0 &&\n value.traffic.acceptedPerTenThousand === undefined) ||\n (value.traffic.denominator > 0 &&\n rateMatches(\n value.traffic.acceptedPerTenThousand,\n (value.acceptedCount * 10_000) / value.traffic.denominator,\n ));\n const severityFiveCount = distributionCountFor(\n value.severityDistribution,\n \"5\",\n );\n const criticalRegression =\n severityFiveCount >= 3 ||\n (value.acceptedCount >= 5 &&\n value.comparison.sevenDaySameHourRatio >= 3);\n const lagSeconds = Math.floor(\n (Date.parse(String(value.generatedAt)) -\n Date.parse(String(value.windowEnd))) /\n 1_000,\n );\n return (\n orderedWindow(value, 60 * 60 * 1_000) &&\n value.revision >= 1 &&\n value.processorLagSeconds === lagSeconds &&\n value.diagnosticsAttachedCount <= value.acceptedCount &&\n (value.acceptedCount > 0 ||\n (value.deterministicRedactionCount === 0 &&\n value.scannerRedactionCount === 0)) &&\n rateMatches(value.rates.rejectionRate, expectedRejectionRate) &&\n rateMatches(\n value.rates.deterministicRedactionsPerAccepted,\n expectedDeterministicRate,\n ) &&\n rateMatches(\n value.rates.scannerRedactionsPerAccepted,\n expectedScannerRate,\n ) &&\n trafficIsConsistent &&\n distributions.every(hasUniqueIds) &&\n advisoryCodesAreConsistent(value.advisories, {\n \"severity-five\":\n severityFiveCount > 0\n ? {\n level: \"advisory\",\n triggerCount: severityFiveCount,\n recommendationIds: [\"inspect-release\"],\n }\n : undefined,\n \"critical-regression\": criticalRegression\n ? {\n level: \"critical\",\n triggerCount:\n severityFiveCount >= 3\n ? severityFiveCount\n : value.acceptedCount,\n recommendationIds: [\n \"inspect-release\",\n \"verify-renderer-health\",\n ],\n }\n : undefined,\n \"processor-stale\":\n lagSeconds > 10 * 60\n ? {\n level: \"critical\",\n triggerCount: lagSeconds,\n recommendationIds: [\"verify-processor-health\"],\n }\n : undefined,\n }) &&\n distributionTotal(value.targetDistribution) === value.acceptedCount &&\n distributionTotal(value.issueTypeDistribution) ===\n value.acceptedCount &&\n distributionTotal(value.severityDistribution) ===\n value.acceptedCount &&\n distributionCountsAtMost(\n value.intentDistribution,\n value.acceptedCount,\n ) &&\n distributionTotal(value.intentDistribution) <=\n value.acceptedCount * 8 &&\n distributionTotal(value.buildDistribution) === value.acceptedCount &&\n distributionTotal(value.rendererDistribution) ===\n value.diagnosticsAttachedCount &&\n distributionTotal(value.backendDistribution) ===\n value.diagnosticsAttachedCount &&\n distributionTotal(value.viewportDistribution) ===\n value.diagnosticsAttachedCount &&\n distributionTotal(value.frameRateDistribution) ===\n value.diagnosticsAttachedCount &&\n distributionTotal(value.frameTimeDistribution) ===\n value.diagnosticsAttachedCount &&\n distributionTotal(value.diagnosticFeatureDistribution) <=\n value.diagnosticsAttachedCount * FEEDBACK_GAME_FEATURE_IDS.length &&\n distributionCountsAtMost(\n value.diagnosticFeatureDistribution,\n value.diagnosticsAttachedCount,\n ) &&\n distributionTotal(value.diagnosticCounterDistribution) <=\n value.diagnosticsAttachedCount *\n FEEDBACK_GAME_COUNTER_CODES.length *\n 10_000 &&\n distributionCountsAtMost(\n value.diagnosticCounterDistribution,\n value.diagnosticsAttachedCount * 10_000,\n ) &&\n distributionTotal(value.diagnosticErrorDistribution) <=\n value.diagnosticsAttachedCount *\n FEEDBACK_GAME_ERROR_CODES.length &&\n distributionCountsAtMost(\n value.diagnosticErrorDistribution,\n value.diagnosticsAttachedCount,\n )\n );\n },\n },\n);\n\nconst rollingSatisfactionShape = () => ({\n period: field.string().enum([\"7-days\", \"30-days\", \"90-days\"] as const),\n reviewCount: countField(),\n meanStars: field.number().min(1).max(5).optional(),\n});\n\nconst satisfactionStatistics = (\n distribution: unknown,\n total: number,\n): { mean: number; median: number } | undefined => {\n if (!Array.isArray(distribution) || total <= 0) {\n return undefined;\n }\n const counts = [1, 2, 3, 4, 5].map((star) =>\n distributionCountFor(distribution, String(star)),\n );\n const weightedTotal = counts.reduce(\n (sum, count, index) => sum + count * (index + 1),\n 0,\n );\n const valueAtPosition = (position: number): number => {\n let cumulative = 0;\n for (let index = 0; index < counts.length; index += 1) {\n cumulative += counts[index] ?? 0;\n if (cumulative >= position) {\n return index + 1;\n }\n }\n return 5;\n };\n const lower = valueAtPosition(Math.ceil(total / 2));\n const upper = valueAtPosition(Math.floor(total / 2) + 1);\n return {\n mean: Math.round((weightedTotal / total) * 10) / 10,\n median: (lower + upper) / 2,\n };\n};\n\n/** Materialized daily satisfaction report. */\nexport const FeedbackDailySatisfactionReportSchema = createSchema(\n {\n reportId: uuidField(),\n windowStart: field.dateTimeISO(),\n windowEnd: field.dateTimeISO(),\n revision: revisionField(),\n generatedAt: field.dateTimeISO(),\n processorLagSeconds: countField(),\n acceptedReviewCount: countField(),\n meanStars: field.number().min(1).max(5).optional(),\n medianStars: field.number().min(1).max(5).optional(),\n starDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum([\"1\", \"2\", \"3\", \"4\", \"5\"] as const),\n ),\n ),\n )\n .max(5),\n sentimentDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_SENTIMENT_BUCKETS),\n ),\n ),\n )\n .max(FEEDBACK_SENTIMENT_BUCKETS.length),\n intentDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_INTENT_IDS),\n ),\n ),\n )\n .max(FEEDBACK_INTENT_IDS.length),\n rollingWindows: field\n .array(field.object(rollingSatisfactionShape()))\n .max(3),\n previousPeriodDeltaStars: field.number().min(-4).max(4).optional(),\n advisories: field.array(field.object(advisoryShape())).max(32),\n },\n \"feedback-daily-satisfaction-report\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n if (!orderedWindow(value, 24 * 60 * 60 * 1_000)) {\n return false;\n }\n if (\n value.acceptedReviewCount === 0 &&\n (value.meanStars !== undefined || value.medianStars !== undefined)\n ) {\n return false;\n }\n if (\n value.acceptedReviewCount > 0 &&\n (value.meanStars === undefined || value.medianStars === undefined)\n ) {\n return false;\n }\n const distributions = [\n value.starDistribution,\n value.sentimentDistribution,\n value.intentDistribution,\n ];\n const periods = value.rollingWindows.map(\n (window: { period: string }) => window.period,\n );\n const sevenDayWindow = value.rollingWindows.find(\n (window: { period: string }) => window.period === \"7-days\",\n );\n const thirtyDayWindow = value.rollingWindows.find(\n (window: { period: string }) => window.period === \"30-days\",\n );\n const ninetyDayWindow = value.rollingWindows.find(\n (window: { period: string }) => window.period === \"90-days\",\n );\n if (\n sevenDayWindow === undefined ||\n thirtyDayWindow === undefined ||\n ninetyDayWindow === undefined\n ) {\n return false;\n }\n const statistics = satisfactionStatistics(\n value.starDistribution,\n value.acceptedReviewCount,\n );\n const lagSeconds = Math.floor(\n (Date.parse(String(value.generatedAt)) -\n Date.parse(String(value.windowEnd))) /\n 1_000,\n );\n const satisfactionDrop =\n sevenDayWindow.reviewCount >= 20 &&\n typeof value.previousPeriodDeltaStars === \"number\" &&\n value.previousPeriodDeltaStars <= -0.3;\n return (\n value.revision >= 1 &&\n value.processorLagSeconds === lagSeconds &&\n distributions.every(hasUniqueIds) &&\n distributionTotal(value.starDistribution) ===\n value.acceptedReviewCount &&\n distributionTotal(value.sentimentDistribution) <=\n value.acceptedReviewCount &&\n distributionCountsAtMost(\n value.sentimentDistribution,\n value.acceptedReviewCount,\n ) &&\n distributionTotal(value.intentDistribution) <=\n value.acceptedReviewCount * 8 &&\n distributionCountsAtMost(\n value.intentDistribution,\n value.acceptedReviewCount,\n ) &&\n periods.length === 3 &&\n new Set(periods).size === 3 &&\n ((statistics === undefined &&\n value.meanStars === undefined &&\n value.medianStars === undefined) ||\n (statistics !== undefined &&\n value.meanStars === statistics.mean &&\n value.medianStars === statistics.median)) &&\n advisoryCodesAreConsistent(value.advisories, {\n \"satisfaction-drop\": satisfactionDrop\n ? {\n level: \"advisory\",\n triggerCount: sevenDayWindow.reviewCount,\n recommendationIds: [\"review-top-intents\"],\n }\n : undefined,\n \"processor-stale\":\n lagSeconds > 2.5 * 60 * 60\n ? {\n level: \"critical\",\n triggerCount: lagSeconds,\n recommendationIds: [\"verify-processor-health\"],\n }\n : undefined,\n }) &&\n value.rollingWindows.every(\n (window: { reviewCount: number; meanStars?: number }) =>\n (window.reviewCount === 0 && window.meanStars === undefined) ||\n (window.reviewCount > 0 && window.meanStars !== undefined),\n ) &&\n value.acceptedReviewCount <= sevenDayWindow.reviewCount &&\n sevenDayWindow.reviewCount <= thirtyDayWindow.reviewCount &&\n thirtyDayWindow.reviewCount <= ninetyDayWindow.reviewCount\n );\n },\n },\n);\n\nconst publicWeeklyPointShape = () => ({\n weekStart: field.dateTimeISO(),\n state: field.string().enum([\"published\", \"suppressed\"] as const),\n acceptedReviewCount: positiveCountField().optional(),\n averageStars: field.number().min(1).max(5).optional(),\n});\n\nconst publicComparisonShape = () => ({\n previousAcceptedReviewCount: positiveCountField(),\n previousAverageStars: field.number().min(1).max(5),\n deltaStars: field.number().min(-4).max(4),\n});\n\n/** Privacy-thresholded public honesty snapshot materialized once per day. */\nexport const FeedbackPublicSummarySchema = createSchema(\n {\n snapshotId: uuidField(),\n generatedAt: field.dateTimeISO(),\n asOf: field.dateTimeISO(),\n freshness: field.string().enum([\"fresh\", \"stale\"] as const),\n reportAgeSeconds: countField(),\n rollingWindowDays: field.number().enum([90] as const),\n state: field.string().enum([\"published\", \"suppressed\"] as const),\n acceptedReviewCount: positiveCountField().optional(),\n averageStars: field.number().min(1).max(5).optional(),\n trend: field.string().enum([\"up\", \"flat\", \"down\"] as const).optional(),\n comparison: field.object(publicComparisonShape()).optional(),\n weeklyPoints: field\n .array(field.object(publicWeeklyPointShape()))\n .min(13)\n .max(13),\n },\n \"feedback-public-summary\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n const summaryIsSuppressed =\n value.state === \"suppressed\" &&\n value.acceptedReviewCount === undefined &&\n value.averageStars === undefined &&\n value.trend === undefined &&\n value.comparison === undefined;\n const comparisonDelta =\n value.comparison === undefined\n ? undefined\n : roundRate(\n value.averageStars -\n value.comparison.previousAverageStars,\n );\n const expectedTrend =\n comparisonDelta === undefined\n ? undefined\n : comparisonDelta >= 0.1\n ? \"up\"\n : comparisonDelta <= -0.1\n ? \"down\"\n : \"flat\";\n const comparisonIsConsistent =\n (value.comparison === undefined && value.trend === undefined) ||\n (value.comparison !== undefined &&\n value.comparison.previousAcceptedReviewCount >= 10 &&\n value.comparison.deltaStars === comparisonDelta &&\n value.trend === expectedTrend);\n const summaryIsPublished =\n value.state === \"published\" &&\n typeof value.acceptedReviewCount === \"number\" &&\n value.acceptedReviewCount >= 10 &&\n typeof value.averageStars === \"number\" &&\n comparisonIsConsistent;\n if (!summaryIsSuppressed && !summaryIsPublished) {\n return false;\n }\n const weekStarts = value.weeklyPoints.map(\n (point: { weekStart: string }) => point.weekStart,\n );\n const asOf = Date.parse(String(value.asOf));\n const generatedAt = Date.parse(String(value.generatedAt));\n if (\n !Number.isFinite(asOf) ||\n !Number.isFinite(generatedAt) ||\n new Date(asOf).toISOString() !== value.asOf ||\n new Date(asOf).getUTCHours() !== 0 ||\n new Date(asOf).getUTCMinutes() !== 0 ||\n new Date(asOf).getUTCSeconds() !== 0 ||\n new Date(asOf).getUTCMilliseconds() !== 0 ||\n generatedAt < asOf ||\n value.reportAgeSeconds !== Math.floor((generatedAt - asOf) / 1_000)\n ) {\n return false;\n }\n const daysSinceMonday = (new Date(asOf).getUTCDay() + 6) % 7;\n const lastWeekStart = asOf - daysSinceMonday * 24 * 60 * 60 * 1_000;\n const weeksAreCanonical = weekStarts.every(\n (weekStart: string, index: number) =>\n Date.parse(weekStart) ===\n lastWeekStart - (12 - index) * 7 * 24 * 60 * 60 * 1_000,\n );\n return (\n new Set(weekStarts).size === weekStarts.length &&\n weeksAreCanonical &&\n (value.state !== \"suppressed\" ||\n value.weeklyPoints.every(\n (point: { state: string }) => point.state === \"suppressed\",\n )) &&\n value.weeklyPoints.every(\n (point: {\n state: \"published\" | \"suppressed\";\n acceptedReviewCount?: number;\n averageStars?: number;\n }) =>\n (point.state === \"suppressed\" &&\n point.acceptedReviewCount === undefined &&\n point.averageStars === undefined) ||\n (point.state === \"published\" &&\n typeof point.acceptedReviewCount === \"number\" &&\n point.acceptedReviewCount >= 10 &&\n typeof point.averageStars === \"number\" &&\n (value.state !== \"published\" ||\n point.acceptedReviewCount <= value.acceptedReviewCount)),\n )\n );\n },\n },\n);\n\n/** Conditional-write checkpoint for replay-safe timer processors. */\nexport const FeedbackProcessorCheckpointSchema = createSchema(\n {\n checkpointId: safeIdField(160),\n processor: field\n .string()\n .enum([\"bug-hourly\", \"review-daily\", \"commit-reconciliation\"] as const),\n windowKey: safeIdField(160),\n revision: revisionField(),\n completedAt: field.dateTimeISO(),\n reportId: uuidField().optional(),\n },\n \"feedback-processor-checkpoint\",\n {\n ...strictOptions,\n schemaValidator: (value) =>\n isProcessorArtifactConsistent(value, \"checkpoint\") &&\n value.revision >= 1 &&\n ((value.processor === \"commit-reconciliation\" &&\n value.reportId === undefined) ||\n (value.processor !== \"commit-reconciliation\" &&\n value.reportId !== undefined)),\n },\n);\n\n/** Immutable manifest describing one bounded materialization attempt. */\nexport const FeedbackMaterializationManifestSchema = createSchema(\n {\n manifestId: uuidField(),\n processor: field\n .string()\n .enum([\"bug-hourly\", \"review-daily\", \"commit-reconciliation\"] as const),\n windowKey: safeIdField(160),\n revision: revisionField(),\n generatedAt: field.dateTimeISO(),\n sourcePacketCount: countField(),\n lateArrivalCount: countField(),\n outputReportId: uuidField().optional(),\n status: field\n .string()\n .enum([\"published\", \"corrected\", \"no-op\"] as const),\n },\n \"feedback-materialization-manifest\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n if (\n !isProcessorArtifactConsistent(value, \"manifest\") ||\n value.lateArrivalCount > value.sourcePacketCount\n ) {\n return false;\n }\n if (value.processor === \"commit-reconciliation\") {\n return (\n value.status === \"no-op\" &&\n value.revision >= 1 &&\n value.outputReportId === undefined &&\n value.lateArrivalCount === 0\n );\n }\n return (\n (value.status === \"published\" &&\n value.revision === 1 &&\n value.lateArrivalCount === 0 &&\n value.outputReportId !== undefined) ||\n (value.status === \"corrected\" &&\n value.revision >= 2 &&\n value.lateArrivalCount > 0 &&\n value.outputReportId !== undefined)\n );\n },\n },\n);\n"],"mappings":"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AA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,sBAAsB,CAAC,UAA4B;AAC9D,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,SAAO,gBAAgB,IAAI,MAAM,YAAY,CAAC;AAChD;;;AChQO,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAOM,IAAM,uBAAuB,CAAC,UAA4B;AAC/D,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,SAAO,iBAAiB,IAAI,MAAM,YAAY,CAAC;AACjD;;;AC1LO,SAAS,iBAAiB,OAAyB;AACxD,MAAI,OAAO,UAAU,SAAU,QAAO;AAGtC,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,QAAQ,WAAW,EAAG,QAAO;AAGjC,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,OAAO,QAAQ,YAAY,CAAC;AAClC,QAAI,SAAS,WAAc,QAAQ,KAAQ,QAAQ,MAAQ,SAAS,MAAO;AACzE,aAAO;AAAA,IACT;AAAA,EACF;AAGA,MAAI,gBAAgB,KAAK,OAAO,EAAG,QAAO;AAG1C,MACE,0FAA0F;AAAA,IACxF;AAAA,EACF;AAEA,WAAO;AAGT,MAAI,QAAQ,SAAS,IAAQ,EAAG,QAAO;AAGvC,MAAI,QAAQ,SAAS,KAAM,QAAO;AAElC,SAAO;AACT;;;AClCO,SAAS,eAAe,OAAyB;AACtD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,SAAO,sLAAsL;AAAA,IAC3L;AAAA,EACF;AACF;;;ACLO,SAAS,mBAAmB,OAAyB;AAC1D,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,SAAO,SAAS,KAAK,SAAS;AAChC;;;ACFO,SAAS,iBAAiB,OAAyB;AACxD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,QAAQ,WAAW,EAAG,QAAO;AAGjC,MACE,0FAA0F;AAAA,IACxF;AAAA,EACF,GACA;AACA,WAAO;AAAA,EACT;AAGA,MAAI,eAAe,KAAK,OAAO,GAAG;AAChC,WAAO;AAAA,EACT;AAGA,MAAI,eAAe,KAAK,OAAO,GAAG;AAChC,WAAO;AAAA,EACT;AAGA,MAAI,QAAQ,SAAS,IAAO,QAAO;AAEnC,SAAO;AACT;;;ACjCA,SAAS,iBAAiB,OAAgB,SAA0B;AAClE,MAAI,OAAO,UAAU,SAAU,QAAO;AAEtC,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,QAAQ,WAAW,EAAG,QAAO;AAGjC,MAAI,QAAQ,SAAS,IAAK,QAAO;AAGjC,aAAW,MAAM,SAAS;AACxB,UAAM,KAAK,GAAG,YAAY,CAAC;AAC3B,QAAK,MAAM,KAAQ,MAAM,MAAS,OAAO,IAAM,QAAO;AAAA,EACxD;AAEA,MAAI,CAAC,QAAQ,KAAK,OAAO,EAAG,QAAO;AAEnC,SAAO;AACT;AAUO,SAAS,aAAa,OAAyB;AACpD,SAAO,iBAAiB,OAAO,uBAAuB;AACxD;AAWO,SAAS,oBAAoB,OAAyB;AAC3D,SAAO,iBAAiB,OAAO,6BAA6B;AAC9D;;;ACvCO,SAAS,eAAe,OAAyB;AACtD,MAAI,OAAO,UAAU,SAAU,QAAO;AAEtC,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,QAAQ,WAAW,EAAG,QAAO;AAGjC,QAAM,gBAAgB;AAGtB,QAAM,mBACJ;AAGF,QAAM,eAAe;AAErB,SACE,cAAc,KAAK,OAAO,KAC1B,iBAAiB,KAAK,OAAO,KAC7B,aAAa,KAAK,OAAO;AAE7B;AAEO,SAAS,oBAAoB,OAAyB;AAC3D,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO;AAClC,SAAO,MAAM,MAAM,cAAc;AACnC;;;AC1BO,IAAK,kBAAL,kBAAKA,qBAAL;AACL,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,iBAAc;AACd,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,gBAAa;AACb,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,kBAAe;AACf,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,SAAM;AACN,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,oBAAiB;AACjB,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,iBAAc;AACd,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,SAAM;AACN,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,gBAAa;AACb,EAAAA,iBAAA,iBAAc;AACd,EAAAA,iBAAA,iBAAc;AACd,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,kBAAe;AACf,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,iBAAc;AACd,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,SAAM;AACN,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,gBAAa;AACb,EAAAA,iBAAA,iBAAc;AACd,EAAAA,iBAAA,mBAAgB;AAChB,EAAAA,iBAAA,gBAAa;AACb,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,iBAAc;AACd,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,kBAAe;AACf,EAAAA,iBAAA,kBAAe;AACf,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,qBAAkB;AAClB,EAAAA,iBAAA,sBAAmB;AACnB,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,gBAAa;AACb,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,mBAAgB;AAChB,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,SAAM;AACN,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,eAAY;AACZ,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,gBAAa;AACb,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,WAAQ;AACR,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,UAAO;AApLG,SAAAA;AAAA,GAAA;AAwLZ,IAAM,mBAAwC,IAAI;AAAA,EAChD,OAAO,OAAO,eAAe;AAC/B;AAGO,SAAS,kBAAkB,OAA0C;AAC1E,SAAO,OAAO,UAAU,YAAY,iBAAiB,IAAI,MAAM,YAAY,CAAC;AAC9E;AAUO,SAAS,eAAe,OAAwB;AACrD,SAAO,gBAAgB,KAAK,KAAK,KAAK,UAAU,KAAK,KAAK;AAC5D;AAGO,SAAS,eAAe,OAAwB;AACrD,SAAO,gBAAgB,KAAK,KAAK;AACnC;AAGO,SAAS,gBAAgB,OAAwB;AACtD,SAAO,2CAA2C,KAAK,KAAK;AAC9D;AAGO,SAAS,qBAAqB,OAAwB;AAC3D,SAAO,sBAAsB,KAAK,KAAK;AACzC;AACO,SAAS,kBAAkB,OAAwB;AACxD,SAAO,qBAAqB,KAAK,KAAK;AACxC;AAGO,SAAS,sBAAsB,OAAwB;AAC5D,SAAO,MAAM,YAAY,MAAM;AACjC;AACO,SAAS,mBAAmB,OAAwB;AACzD,SAAO,qBAAqB,KAAK,KAAK;AACxC;AAcO,SAAS,iBAAiB,OAAyB;AACxD,MAAI,OAAO,UAAU,YAAY,MAAM,WAAW,EAAG,QAAO;AAE5D,QAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,MAAI,MAAM,KAAK,UAAQ,KAAK,WAAW,CAAC,EAAG,QAAO;AAClD,QAAM,WAAW,MAAM,YAAY;AACnC,MAAI,mBAAmB,IAAI,QAAQ,EAAG,QAAO;AAC7C,MAAI,MAAM,CAAC,GAAG,YAAY,MAAM,KAAK;AACnC,WAAO,MAAM,SAAS,KAAK,MAAM,MAAM,CAAC,EAAE,MAAM,kBAAkB;AAAA,EACpE;AACA,MAAI,IAAI;AAKR,QAAM,OAAO,MAAM,CAAC;AACpB,MAAI,CAAC,QAAQ,CAAC,kBAAkB,KAAK,IAAI,EAAG,QAAO;AACnD,MAAI,KAAK,WAAW,KAAK,CAAC,kBAAkB,IAAI,EAAG,QAAO;AAC1D,OAAK;AAGL,MAAI,KAAK,UAAU,GAAG;AACpB,QAAI,eAAe;AACnB,WAAO,IAAI,MAAM,UAAU,eAAe,KAAK,gBAAgB,KAAK,MAAM,CAAC,CAAE,GAAG;AAC9E,WAAK;AACL,sBAAgB;AAAA,IAClB;AAAA,EACF;AAGA,MAAI,IAAI,MAAM,UAAU,eAAe,MAAM,CAAC,CAAW,GAAG;AAC1D,SAAK;AAAA,EACP;AAGA,MAAI,IAAI,MAAM,UAAU,eAAgB,MAAM,CAAC,EAAa,YAAY,CAAC,GAAG;AAE1E,SAAK;AAAA,EACP;AAGA,QAAM,WAAW,oBAAI,IAAY;AACjC,SAAO,IAAI,MAAM,UAAU,gBAAiB,MAAM,CAAC,CAAY,GAAG;AAChE,UAAM,UAAU,MAAM,CAAC,EAAG,YAAY;AACtC,QAAI,SAAS,IAAI,OAAO,EAAG,QAAO;AAClC,aAAS,IAAI,OAAO;AACpB,SAAK;AAAA,EACP;AAIA,QAAM,sBAAsB,oBAAI,IAAY;AAC5C,SAAO,IAAI,MAAM,UAAU,qBAAsB,MAAM,CAAC,CAAY,GAAG;AACrE,UAAM,YAAY,MAAM,CAAC,EAAG,YAAY;AACxC,QAAI,oBAAoB,IAAI,SAAS,EAAG,QAAO;AAC/C,wBAAoB,IAAI,SAAS;AACjC,SAAK;AAEL,QAAI,EAAE,IAAI,MAAM,UAAU,kBAAkB,MAAM,CAAC,CAAE,GAAI,QAAO;AAChE,WAAO,IAAI,MAAM,UAAU,kBAAkB,MAAM,CAAC,CAAE,GAAG;AACvD,WAAK;AAAA,IACP;AAAA,EACF;AAGA,MAAI,IAAI,MAAM,UAAU,sBAAsB,MAAM,CAAC,CAAE,GAAG;AACxD,SAAK;AACL,QAAI,EAAE,IAAI,MAAM,UAAU,mBAAmB,MAAM,CAAC,CAAE,GAAI,QAAO;AACjE,WAAO,IAAI,MAAM,UAAU,mBAAmB,MAAM,CAAC,CAAE,GAAG;AACxD,WAAK;AAAA,IACP;AAAA,EACF;AAGA,SAAO,MAAM,MAAM;AACrB;AAGA,IAAM,qBAA0C,oBAAI,IAAI;AAAA,EACtD;AAAA,EAAc;AAAA,EAAe;AAAA,EAAa;AAAA,EAAS;AAAA,EAAS;AAAA,EAC5D;AAAA,EAAc;AAAA,EAAS;AAAA,EAAa;AAAA,EAAS;AAAA,EAAW;AAAA,EACxD;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAU;AAAA,EAAU;AAAA,EACxD;AAAA,EAAa;AAAA,EAAa;AAAA,EAAY;AAAA,EAAY;AAAA,EAAU;AAAA,EAC5D;AACF,CAAC;;;AC1TM,IAAM,QAAQ;AAAA,EACnB,QAAQ,MAAM,IAAI,aAAqB,QAAQ;AAAA,EAC/C,QAAQ,MAAM,IAAI,aAAqB,QAAQ;AAAA,EAC/C,SAAS,MAAM,IAAI,aAAsB,SAAS;AAAA,EAClD,QAAQ,CAAyC,WAC/C,IAAI,aAAgB,UAAU,EAAE,OAAO,OAAO,CAAC;AAAA,EACjD,OAAO,CAAC,aAA2B,IAAI,aAAa,SAAS,EAAE,SAAS,CAAC;AAAA,EACzE,KAAK,CAAwB,YAC3B,IAAI,aAAuB,OAAO,EAAE,QAAQ,CAAC;AAAA,EAC/C,OAAO,MACL,IAAI,aAAqB,QAAQ,EAC9B,UAAU,aAAa,EACvB,IAAI;AAAA,IACH,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC,EACA,YAAY,kBAAkB;AAAA,EACnC,OAAO,MACL,IAAI,aAAqB,QAAQ,EAC9B,UAAU,aAAa,EACvB,IAAI;AAAA,IACH,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC,EACA,YAAY,gBAAgB;AAAA,EACjC,KAAK,MACH,IAAI,aAAqB,QAAQ,EAC9B,UAAU,WAAW,EACrB,IAAI;AAAA,IACH,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC,EACA,YAAY,OAAO;AAAA,EACxB,MAAM,MACJ,IAAI,aAAqB,QAAQ,EAC9B,IAAI;AAAA,IACH,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC,EACA,UAAU,YAAY,EACtB,YAAY,QAAQ;AAAA,EACzB,aAAa,MACX,IAAI,aAAqB,QAAQ,EAC9B,IAAI;AAAA,IACH,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC,EACA,UAAU,mBAAmB,EAC7B,YAAY,kCAAkC;AAAA,EACnD,SAAS,MACP,IAAI,aAAqB,QAAQ,EAC9B,IAAI;AAAA,IACH,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC,EACA,UAAU,CAAC,MAAM,oBAAoB,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,EACzD,YAAY,8CAA8C;AAAA,EAC/D,SAAS,MACP,IAAI,aAAqB,QAAQ,EAC9B,IAAI;AAAA,IACH,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC,EACA,UAAU,CAAC,MAAM,oBAAoB,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,EACzD,YAAY,8CAA8C;AAAA,EAC/D,UAAU,MACR,IAAI,aAAqB,QAAQ,EAC9B,IAAI;AAAA,IACH,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC,EACA,UAAU,gBAAgB,EAC1B,YAAY,sDAAsD;AAAA,EACvE,aAAa,MACX,IAAI,aAAqB,QAAQ,EAC9B,IAAI;AAAA,IACH,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC,EACA,UAAU,gBAAgB,EAC1B,YAAY,wCAAwC;AAAA,EACzD,UAAU,MACR,IAAI,aAAqB,QAAQ,EAC9B,IAAI;AAAA,IACH,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC,EACA,IAAI,GAAG,EACP,IAAI,EAAE,EACN,YAAY,gDAAgD;AAAA,EACjE,WAAW,MACT,IAAI,aAAqB,QAAQ,EAC9B,IAAI;AAAA,IACH,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC,EACA,IAAI,IAAI,EACR,IAAI,GAAG,EACP,YAAY,iDAAiD;AAAA,EAClE,SAAS,MACP,IAAI,aAAqB,QAAQ,EAC9B,UAAU,cAAc,EACxB,YAAY,yCAAyC;AAAA,EAC1D,aAAa,MACX,IAAI,aAAqB,QAAQ,EAC9B,UAAU,mBAAmB,EAC7B,YAAY,iDAAiD;AAAA,EAClE,cAAc,MACZ,IAAI,aAAqB,QAAQ,EAC9B,UAAU,gBAAgB,EAC1B;AAAA,IACC;AAAA,EACF;AACN;;;ACjIO,IAAM,iCAAiC,OAAO,OAAO;AAAA,EAC1D;AAAA,EACA;AACF,CAAU;AAOH,IAAM,2BAA2B,OAAO,OAAO;AAAA,EACpD;AAAA,EACA;AACF,CAAU;;;ACjBH,SAAS,gBACd,WACA,KACA,OACA,KACA,cAA8B,QAC9B,QACA,QAC2B;AAC3B,QAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,MAAI,KAAK,MAAM,mBAAmB,WAAW,KAAK,cAAc,OAAO;AACrE,UAAM,UAAU,UAAU,UAAa,UAAU,QAAQ,UAAU;AACnE,QAAI,SAAS;AACX,YAAM,MAAM,qCAAqC,IAAI;AACrD,UAAI,gBAAgB,UAAU;AAC5B,gBAAQ,KAAK,GAAG;AAChB,eAAO,EAAE,cAAc,KAAK;AAAA,MAC9B;AACA,UAAI,gBAAgB,QAAQ;AAC1B,gBAAQ,OAAO,2BAA2B,GAAG,EAAE;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,cAAc,MAAM;AAC/B;AAKO,SAAS,kBACd,OACA,OACA,WACA,QACqB;AACrB,QAAM,QAAQ,CACZ,KACA,OACA,KACA,KACA,MAAqD,CAAC,MACnD;AACH,QAAI,CAAC,IAAK;AACV,UAAM,YAAY,UAAU,UAAa,UAAU;AAGnD,QAAI,IAAI,MAAM,WAAW,WAAW;AAClC,UAAI,CAAC,UAAW,KAAI,MAAM,WAAW,IAAI,UAAU,KAAK;AACxD;AAAA,IACF;AACA,QAAI,IAAI,MAAM,WAAW,QAAQ;AAC/B,UAAI,CAAC,UAAW,KAAI,MAAM,MAAM,IAAI,OAAO,KAAK;AAChD;AAAA,IACF;AACA,QAAI,IAAI,MAAM,WAAW,SAAS;AAChC,UAAI,CAAC,UAAW,KAAI,GAAG,IAAI;AAC3B;AAAA,IACF;AAEA,QAAI,aAAa,IAAI,eAAe,OAAO;AACzC;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,YAAY,IAAI,QAAQ;AACvC,YAAM,MAAW,CAAC;AAClB,iBAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAQ,IAAI,MAAM,GAAG;AAC7D,cAAM,UAAU,QAAQ,QAAQ,GAAG,UAAU,KAAK,EAAE,WAAW,IAAI,CAAC;AAAA,MACtE;AACA,UAAI,GAAG,IAAI;AACX;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,WAAW,IAAI,YAAY,MAAM,QAAQ,KAAK,GAAG;AAChE,UAAI,GAAG,IAAI,MAAM,IAAI,CAAC,SAAc;AAClC,cAAM,MAAW,CAAC;AAElB,cAAM,IAAI,UAAU,MAAM,KAAK,KAAK;AAAA,UAClC,WAAW;AAAA,UACX,aAAa;AAAA,QACf,CAAC;AACD,YAAI,OAAO,UAAU,eAAe,KAAK,KAAK,GAAG,GAAG;AAClD,iBAAO,IAAI,GAAG;AAAA,QAChB;AACA,eAAO,OAAO,KAAK,GAAG,EAAE,SAAS,IAAI,MAAM;AAAA,MAC7C,CAAC;AACD;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,OAAO;AACtB,YAAM,MAAW,EAAE,GAAG,MAAM;AAC5B,YAAM,WAAW,IAAI;AACrB,UAAI,YAAY,OAAO;AACrB,mBAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC3D,gBAAM,UAAU,MAAM,QAAQ,GAAG,UAAU,KAAK,EAAE,WAAW,IAAI,CAAC;AAAA,QACpE;AAAA,MACF;AACA,UAAI,GAAG,IAAI;AACX;AAAA,IACF;AAEA,QAAI,GAAG,IAAI;AAAA,EACb;AAEA,QAAM,SAAc,CAAC;AACrB,aAAW,OAAO,OAAO;AACvB,UAAM,MAAM,GAAG,GAAG,QAAQ,GAAG,GAAG,KAAK,MAAM;AAAA,EAC7C;AACA,SAAO;AACT;AAKO,SAAS,eACd,OACA,QACA,WACqB;AACrB,QAAM,YAAY,CAChB,KACA,KACA,WACA,MAAqD,CAAC,MAC9C;AACR,QAAI,CAAC,IAAK,QAAO,YAAY,GAAG;AAChC,UAAM,SAAS,IAAI,MAAM;AACzB,UAAM,WACJ,cAAc,UACd,cAAc,QACd,OAAO,UAAU,eAAe,KAAK,WAAW,GAAG;AACrD,QAAI,WAAW,WAAW;AACxB,YAAM,MACJ,YAAY,MAAM,WAAW,KAC7B,YAAY,GAAG,IAAI,aAAa,GAAG,WAAW;AAChD,aAAO,QAAQ,SAAY,SAAY,UAAU,GAAG;AAAA,IACtD;AACA,QAAI,WAAW,QAAQ;AACrB,YAAM,IACJ,YAAY,MAAM,MAAM,KAAK,YAAY,GAAG,IAAI,aAAa,GAAG,MAAM;AACxE,aAAO,MAAM,SAAY,SAAY;AAAA,IACvC;AACA,QAAI,WAAW;AACb,aAAO,WAAW,eAAe,GAAG,IAAI,OAAO;AACjD,QAAI,CAAC,YAAY,IAAI,eAAe,OAAO;AACzC,aAAO;AAAA,IACT;AAEA,QAAI,IAAI,SAAS,YAAY,IAAI,QAAQ;AACvC,YAAM,MAAW,CAAC;AAClB,YAAM,SACJ,aAAa,OAAO,UAAU,eAAe,KAAK,WAAW,GAAG,IAC5D,UAAU,GAAG,IACb,aAAa,CAAC;AACpB,iBAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAQ,IAAI,MAAM,GAAG;AAC7D,cAAM,QAAQ,UAAU,UAAU,UAAU,MAAM;AAClD,YAAI,UAAU,QAAW;AACvB,cAAI,QAAQ,IAAI;AAAA,QAClB;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,QAAI,IAAI,SAAS,WAAW,IAAI,UAAU;AACxC,YAAM,MAAM,YAAY,GAAG;AAC3B,UAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,QAAO;AAChC,aAAO,IAAI;AAAA,QAAI,CAAC,SACd,UAAU,IAAI,UAAU,KAAK,MAAM,EAAE,WAAW,KAAK,aAAa,KAAK,CAAC;AAAA,MAC1E;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,OAAO;AACtB,YAAM,MAAM,EAAE,GAAI,YAAY,GAAG,KAAK,CAAC,EAAG;AAC1C,YAAM,WAAW,IAAI;AACrB,UAAI,UAAU;AACZ,mBAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC3D,gBAAM,QAAQ,UAAU,UAAU,UAAU,GAAG;AAC/C,cAAI,UAAU,QAAW;AACvB,gBAAI,QAAQ,IAAI;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,WAAO,YAAY,GAAG;AAAA,EACxB;AAEA,QAAM,SAAc,CAAC;AACrB,aAAW,OAAO,OAAO;AACvB,UAAM,QAAQ,UAAU,MAAM,GAAG,GAAG,KAAK,MAAM;AAC/C,QAAI,UAAU,QAAW;AACvB,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AACA,SAAO;AACT;AAKO,SAAS,eACd,OACA,MACA,aACqB;AACrB,QAAM,QAAQ,CACZ,KACA,OACA,MAA8B,CAAC,MACvB;AACR,QAAI,CAAC,IAAK,QAAO;AACjB,SACG,UAAU,UAAa,UAAU,SAClC,IAAI,eAAe,OACnB;AACA,aAAO;AAAA,IACT;AACA,UAAM,WAAW,IAAI,MAAM;AAC3B,QAAI,aAAa,OAAQ,QAAO;AAChC,QAAI,aAAa,SAAU,QAAO;AAClC,QAAI,aAAa,YAAa,QAAO,YAAY,KAAK;AAEtD,QAAI,IAAI,SAAS,YAAY,IAAI,QAAQ;AACvC,YAAM,MAAW,CAAC;AAClB,YAAM,MAAM,SAAS,CAAC;AACtB,iBAAW,CAAC,GAAG,QAAQ,KAAK,OAAO,QAAQ,IAAI,MAAM,GAAG;AACtD,cAAM,QAAQ,MAAM,UAAU,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC;AACtD,YAAI,UAAU,OAAW,KAAI,CAAC,IAAI;AAAA,MACpC;AACA,aAAO;AAAA,IACT;AAEA,QAAI,IAAI,SAAS,WAAW,IAAI,UAAU;AACxC,UAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO;AAClC,YAAM,MAAM,MACT,IAAI,CAAC,MAAW,MAAM,IAAI,UAAU,GAAG,EAAE,WAAW,IAAI,UAAU,CAAC,CAAC,EACpE,OAAO,CAAC,MAAM,MAAM,MAAS;AAChC,aAAO;AAAA,IACT;AAEA,QAAI,IAAI,SAAS,OAAO;AACtB,YAAM,MAAW,QAAQ,EAAE,MAAM,MAAM,MAAM,IAAI,MAAM,GAAG,IAAI,CAAC;AAC/D,YAAM,WAAW,IAAI;AACrB,YAAM,MAAM,SAAS,CAAC;AACtB,UAAI,UAAU;AACZ,mBAAW,CAAC,GAAG,QAAQ,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACpD,gBAAM,QAAQ,MAAM,UAAU,IAAI,CAAC,CAAC;AACpC,cAAI,UAAU,OAAW,KAAI,CAAC,IAAI;AAAA,QACpC;AAAA,MACF,WAAW,OAAO;AAEhB,YAAI,OAAO,MAAM;AACjB,YAAI,KAAK,MAAM;AAAA,MACjB;AACA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,SAAc,CAAC;AACrB,aAAW,OAAO,OAAO;AACvB,UAAM,QAAQ,MAAM,MAAM,GAAG,GAAG,OAAO,GAAG,CAAC;AAC3C,QAAI,UAAU,OAAW,QAAO,GAAG,IAAI;AAAA,EACzC;AACA,SAAO;AACT;AAKO,SAAS,YAAY,OAMzB;AACD,QAAM,YAAwB,CAAC;AAC/B,QAAM,QAAQ,CAAC,KAAU,SAAiB;AACxC,QAAI,CAAC,IAAK;AACV,QAAI,IAAI,QAAQ,IAAI,KAAK,mBAAmB,QAAQ;AAClD,gBAAU,KAAK;AAAA,QACb,OAAO;AAAA,QACP,gBAAgB,IAAI,KAAK;AAAA,QACzB,QAAQ,IAAI,KAAK;AAAA,QACjB,aAAa,IAAI,KAAK;AAAA,QACtB,SAAS,IAAI,KAAK;AAAA,MACpB,CAAC;AAAA,IACH;AAEA,SAAK,IAAI,SAAS,YAAY,IAAI,SAAS,UAAU,IAAI,QAAQ;AAC/D,iBAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAQ,IAAI,MAAM,GAAG;AAC7D,cAAM,UAAU,GAAG,IAAI,IAAI,QAAQ,EAAE;AAAA,MACvC;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,WAAW,IAAI,UAAU;AACxC,YAAM,WAAW,GAAG,IAAI;AACxB,WACG,IAAI,SAAS,SAAS,YAAY,IAAI,SAAS,SAAS,UACzD,IAAI,SAAS,QACb;AACA,mBAAW,CAAC,UAAU,QAAQ,KAAK,OAAO;AAAA,UACxC,IAAI,SAAS;AAAA,QACf,GAAG;AACD,gBAAM,UAAU,GAAG,QAAQ,IAAI,QAAQ,EAAE;AAAA,QAC3C;AAAA,MACF,OAAO;AACL,cAAM,IAAI,UAAU,QAAQ;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAEA,aAAW,OAAO,OAAO;AACvB,UAAM,MAAM,GAAG,GAAG,GAAG;AAAA,EACvB;AACA,SAAO;AACT;AAKO,SAAS,kBACd,OACA,QACqB;AACrB,QAAM,SAAc,MAAM,QAAQ,MAAM,IAAI,CAAC,GAAG,MAAM,IAAI,EAAE,GAAG,OAAO;AAEtE,QAAM,YAAY,CAAC,QAAa,MAA8B,QAAa;AACzE,QAAI,MAAM;AACV,aAAS,IAAI,GAAG,IAAI,KAAK,SAAS,GAAG,KAAK;AACxC,YAAM,IAAI,KAAK,CAAC;AAChB,UAAI,MAAM,OAAW;AACrB,UAAI,IAAI,CAAC,MAAM,QAAW;AACxB,cAAM,OAAO,KAAK,IAAI,CAAC;AACvB,YAAI,CAAC,IAAI,OAAO,SAAS,WAAW,CAAC,IAAI,CAAC;AAAA,MAC5C;AACA,YAAM,IAAI,CAAC;AAAA,IACb;AACA,UAAM,OAAO,KAAK,KAAK,SAAS,CAAC;AACjC,QAAI,SAAS,OAAW;AACxB,QAAI,IAAI,IAAI;AAAA,EACd;AAEA,QAAM,QAAQ,CACZ,KACA,MACA,MACA,YACG;AACH,QAAI,CAAC,IAAK;AAEV,UAAM,YAAY,CAAC,cAAsB;AACvC,YAAM,OAAO,KAAK,KAAK,SAAS,CAAC;AACjC,UAAI,SAAS,OAAW;AACxB,UAAI,OAAO,SAAS,UAAU;AAC5B,kBAAU,QAAQ,CAAC,GAAG,MAAM,SAAS,GAAG,IAAI;AAAA,MAC9C,OAAO;AACL,kBAAU,QAAQ,CAAC,GAAG,KAAK,MAAM,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI;AAAA,MAC3D;AAAA,IACF;AAEA,QAAI,IAAI,MAAM,WAAW,WAAW;AAClC,YAAM,YAAY,GAAG,OAAO;AAC5B,UAAI,QAAQ,OAAO,UAAU,eAAe,KAAK,MAAM,SAAS,GAAG;AACjE,kBAAU,SAAS;AAAA,MACrB;AACA;AAAA,IACF;AACA,QAAI,IAAI,MAAM,WAAW,QAAQ;AAC/B,YAAM,YAAY,GAAG,OAAO;AAC5B,UAAI,QAAQ,OAAO,UAAU,eAAe,KAAK,MAAM,SAAS,GAAG;AACjE,kBAAU,SAAS;AAAA,MACrB;AACA;AAAA,IACF;AACA,QAAI,IAAI,MAAM,WAAW,SAAS;AAChC,UAAI,QAAQ,OAAO,UAAU,eAAe,KAAK,MAAM,OAAO,GAAG;AAC/D,kBAAU,QAAQ,MAAM,IAAI;AAAA,MAC9B;AACA;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,YAAY,IAAI,QAAQ;AACvC,YAAM,MACJ,QAAQ,OAAO,UAAU,eAAe,KAAK,MAAM,OAAO,IACtD,KAAK,OAAO,IACZ;AACN,iBAAW,CAAC,GAAG,QAAQ,KAAK,OAAO,QAAQ,IAAI,MAAM,GAAG;AACtD,cAAM,UAAU,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC;AAAA,MACtC;AACA;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,WAAW,IAAI,UAAU;AACxC,YAAM,MAAM,OAAO,OAAO;AAC1B,UAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,YAAI;AAAA,UAAQ,CAAC,MAAM,QACjB,MAAM,IAAI,UAAU,MAAM,CAAC,GAAG,MAAM,GAAG,GAAG,OAAO;AAAA,QACnD;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,OAAO;AACtB,YAAM,WAAW,IAAI;AACrB,YAAM,MAAM,OAAO,OAAO;AAC1B,UAAI,YAAY,KAAK;AACnB,mBAAW,CAAC,GAAG,QAAQ,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACpD,gBAAM,UAAU,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,aAAW,OAAO,OAAO;AACvB,UAAM,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,GAAG,GAAG;AAAA,EACtC;AAEA,SAAO;AACT;;;ACxZA,IAAM,uBAAuB,oBAAI,IAAyB;AAE1D,SAAS,UAAa,OAAa;AACjC,QAAM,OAAO,oBAAI,QAAQ;AACzB,QAAM,WAAW,CAAC,QAAkB;AAClC,QAAI,QAAQ,QAAQ,OAAO,QAAQ,SAAU,QAAO;AACpD,QAAI,KAAK,IAAI,GAAG,EAAG,OAAM,IAAI,UAAU,kCAAkC;AACzE,QAAI,eAAe,KAAM,QAAO,IAAI,KAAK,IAAI,QAAQ,CAAC;AACtD,QAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,YAAM,MAAa,CAAC;AACpB,WAAK,IAAI,KAAK,GAAG;AACjB,UAAI,QAAQ,CAAC,SAAS,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC;AAC9C,aAAO;AAAA,IACT;AACA,UAAM,MAAW,CAAC;AAClB,SAAK,IAAI,KAAK,GAAG;AACjB,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,EAAG,KAAI,CAAC,IAAI,SAAS,CAAC;AAC7D,WAAO;AAAA,EACT;AACA,SAAO,SAAS,KAAK;AACvB;AAEA,SAAS,mBAAmB,KAAU,SAAoC;AACxE,SAAO,QAAQ,oBAAoB,SAAS,KAAK,aAAa,cAAc;AAC9E;AAEA,SAAS,oBACP,KACA,OACA,SACK;AACL,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AAEA,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,UAAU,KAAK;AAAA,IACxB,KAAK,OAAO;AACV,UAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG;AACvE,eAAO,UAAU,KAAK;AAAA,MACxB;AAEA,YAAM,QAAQ,SAAS,GAAG;AAC1B,UAAI,CAAC,SAAS,OAAO,KAAK,KAAK,EAAE,WAAW,GAAG;AAC7C,eAAO,UAAU,KAAK;AAAA,MACxB;AAEA,YAAM,gBAAqC,CAAC;AAC5C,UAAI,OAAO,MAAM,SAAS,UAAU;AAClC,sBAAc,OAAO,MAAM;AAAA,MAC7B;AACA,UAAI,OAAO,MAAM,OAAO,UAAU;AAChC,sBAAc,KAAK,MAAM;AAAA,MAC3B;AAEA,iBAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAQ,KAAK,GAAG;AACxD,YAAI,CAAC,mBAAmB,UAAU,OAAO,GAAG;AAC1C;AAAA,QACF;AACA,YAAI,CAAC,OAAO,UAAU,eAAe,KAAK,OAAO,QAAQ,GAAG;AAC1D;AAAA,QACF;AAEA,cAAM,kBAAkB;AAAA,UACtB;AAAA,UACA,MAAM,QAAQ;AAAA,UACd;AAAA,QACF;AACA,YAAI,oBAAoB,QAAW;AACjC,wBAAc,QAAQ,IAAI;AAAA,QAC5B;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,IACA,KAAK,UAAU;AACb,UAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG;AACvE,eAAO,UAAU,KAAK;AAAA,MACxB;AAEA,YAAM,QAAQ,SAAS,GAAG;AAC1B,UAAI,CAAC,SAAS,OAAO,KAAK,KAAK,EAAE,WAAW,GAAG;AAC7C,eAAO,UAAU,KAAK;AAAA,MACxB;AAEA,YAAM,mBAAwC,CAAC;AAC/C,iBAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAQ,KAAK,GAAG;AACxD,YAAI,CAAC,mBAAmB,UAAU,OAAO,GAAG;AAC1C;AAAA,QACF;AACA,YAAI,CAAC,OAAO,UAAU,eAAe,KAAK,OAAO,QAAQ,GAAG;AAC1D;AAAA,QACF;AAEA,cAAM,kBAAkB;AAAA,UACtB;AAAA,UACA,MAAM,QAAQ;AAAA,UACd;AAAA,QACF;AACA,YAAI,oBAAoB,QAAW;AACjC,2BAAiB,QAAQ,IAAI;AAAA,QAC/B;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,IACA,KAAK,SAAS;AACZ,UAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,eAAO,UAAU,KAAK;AAAA,MACxB;AAEA,UAAI,CAAC,IAAI,UAAU;AACjB,eAAO,UAAU,KAAK;AAAA,MACxB;AAEA,aAAO,MAAM,IAAI,CAAC,SAAS,oBAAoB,IAAI,UAAU,MAAM,OAAO,CAAC;AAAA,IAC7E;AAAA,IACA;AACE,aAAO,UAAU,KAAK;AAAA,EAC1B;AACF;AAEA,SAAS,UAAU,GAAW,GAAmB;AAC/C,QAAM,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AAClD,QAAM,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AAClD,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,KAAK,GAAG,CAAC,KAAK;AACpB,UAAM,KAAK,GAAG,CAAC,KAAK;AACpB,QAAI,KAAK,GAAI,QAAO;AACpB,QAAI,KAAK,GAAI,QAAO;AAAA,EACtB;AACA,SAAO;AACT;AAKA,SAAS,mBACP,MACA,OACA,KAOqB;AAErB,MAAI,OAAO,SAAS,YAAY;AAC9B,WAAO,KAAK,OAAO,GAAG;AAAA,EACxB;AAGA,QAAM,QAAQ,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,IAAI,OAAO,UAAU,GAAG,IAAI,GAAG,EAAE,CAAC;AAChE,MAAI,UAA+B,EAAE,GAAG,MAAM;AAC9C,MAAI,cAAc,IAAI;AAEtB,aAAW,QAAQ,OAAO;AAExB,QAAI,UAAU,aAAa,KAAK,EAAE,IAAI,KAAK,UAAU,KAAK,IAAI,IAAI,EAAE,KAAK,GAAG;AAC1E,UAAI,MAAM,0BAA0B,WAAW,YAAO,KAAK,EAAE,EAAE;AAC/D,YAAM,MAAM,KAAK,IAAI,SAAS,EAAE,GAAG,KAAK,MAAM,aAAa,IAAI,KAAK,GAAG,CAAC;AACxE,UAAI,CAAC,OAAO,IAAI,OAAO,QAAQ,CAAC,IAAI,OAAO;AACzC,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,QAAQ,KAAK,QAAQ,SACjB,IAAI,SACJ,CAAC,kCAAkC,WAAW,QAAQ,KAAK,EAAE,EAAE;AAAA,QACrE;AAAA,MACF;AACA,gBAAU,IAAI;AACd,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF;AAGA,SAAO,EAAE,IAAI,MAAM,OAAO,QAAQ;AACpC;AAEA,SAAS,aACP,WACA,OACA,YACoB;AACpB,MAAI,CAAC,WAAY;AAEjB,QAAM,SAAS,MAAM,QAAQ,UAAU,IACnC,aACA,MAAM,KAAK,UAAU;AAEzB,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,UAAU,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,SAAS,CAAC,CAAC;AACvD,QAAI,QAAQ,SAAS,GAAG;AACtB,aAAO,SAAS,SAAS,uBAAuB,OAAO,KAAK,IAAI,CAAC;AAAA,IACnE;AAAA,EACF,OAAO;AACL,QAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,aAAO,SAAS,SAAS,oBAAoB,OAAO,KAAK,IAAI,CAAC;AAAA,IAChE;AAAA,EACF;AACF;AAIA,SAAS,cAAc,KAA8C;AACnE,QAAM,MAAM,MAAM,QAAQ,KAAK,IAAI,IAC/B,IAAI,OACJ,MAAM,QAAQ,KAAK,UAAU,IAC7B,IAAI,aACJ,MAAM,QAAQ,KAAK,KAAK,IACxB,IAAI,QACJ,MAAM,QAAQ,KAAK,WAAW,IAC9B,IAAI,cACJ,KAAK,oBAAoB,MACzB,MAAM,KAAK,IAAI,QAAQ,IACvB;AAEJ,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,KAAK,IAAI;AAAA,IACb,CAAC,MAAe,OAAO,MAAM,YAAY,OAAO,MAAM;AAAA,EACxD;AACA,SAAO,KAAM,MAAiC;AAChD;AAGA,SAAS,aACP,KACA,SACkC;AAClC,OACG,YAAY,UAAa,YAAY,SACtC,OAAO,KAAK,eAAe,YAC3B;AACA,UAAM,OAAO,IAAI,WAAW;AAC5B,QAAI,SAAS,QAAW;AACtB,aAAO,EAAE,OAAO,MAAM,SAAS,KAAK;AAAA,IACtC;AAAA,EACF;AACA,SAAO,EAAE,OAAO,SAAS,SAAS,MAAM;AAC1C;AAEA,SAAS,WAAW,KAAmB;AACrC,SAAO,KAAK,eAAe;AAC7B;AAEA,SAAS,aAAa,KAA0D;AAC9E,SAAO,KAAK,cAAc;AAC5B;AAEA,SAAS,SAAS,KAA2C;AAC3D,SAAO,KAAK,UAAU,KAAK,SAAS;AACtC;AAEA,IAAM,8BAA8B;AACpC,IAAM,8BAA8B;AACpC,IAAM,gCAAgC;AAEtC,SAAS,mCAAmC,OAAyB;AACnE,QAAM,UAAoD;AAAA,IACxD,EAAE,OAAO,OAAO,OAAO,EAAE;AAAA,EAC3B;AACA,QAAM,OAAO,oBAAI,QAAgB;AACjC,MAAI,eAAe;AAEnB,MAAI;AACF,WAAO,QAAQ,SAAS,GAAG;AACzB,YAAM,UAAU,QAAQ,IAAI;AAC5B,UAAI,CAAC,SAAS;AACZ;AAAA,MACF;AACA,sBAAgB;AAChB,UACE,eAAe,+BACf,QAAQ,QAAQ,6BAChB;AACA,eAAO;AAAA,MACT;AACA,UACE,OAAO,QAAQ,UAAU,YACzB,QAAQ,UAAU,MAClB;AACA;AAAA,MACF;AACA,UAAI,KAAK,IAAI,QAAQ,KAAK,GAAG;AAC3B,eAAO;AAAA,MACT;AACA,WAAK,IAAI,QAAQ,KAAK;AAEtB,YAAM,OAAO,OAAO,KAAK,QAAQ,KAAK;AACtC,UACE,eAAe,QAAQ,SAAS,KAAK,SACrC,6BACA;AACA,eAAO;AAAA,MACT;AACA,YAAM,SAAS,QAAQ;AACvB,iBAAW,OAAO,MAAM;AACtB,gBAAQ,KAAK;AAAA,UACX,OAAO,OAAO,GAAG;AAAA,UACjB,OAAO,QAAQ,QAAQ;AAAA,QACzB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAOA,SAAS,qBAAqB,KAA+B;AAC3D,SAAO;AAAA,IACL,MAAM,EAAE,MAAM,SAAS;AAAA,IACvB,IAAI,EAAE,MAAM,SAAS;AAAA,IACrB,GAAI,SAAS,GAAG,KAAK,CAAC;AAAA,EACxB;AACF;AAEA,SAAS,sBACP,OACA,OACA,WAAW,QACX,QAA+B;AAAA,EAC7B,kBAAkB;AAAA,EAClB,eAAe;AACjB,GACU;AACV,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG;AACvE,WAAO,CAAC;AAAA,EACV;AACA,MAAI,MAAM,oBAAoB,GAAG;AAC/B,UAAM,gBAAgB;AACtB,WAAO,CAAC;AAAA,EACV;AACA,QAAM,oBAAoB;AAE1B,QAAM,SAAS;AACf,QAAM,YAAY,IAAI,IAAI,OAAO,KAAK,KAAK,CAAC;AAC5C,QAAM,YAAY,oBAAI,IAAY;AAElC,MAAI,OAAO,KAAK,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,UAAU,IAAI,GAAG,CAAC,GAAG;AAC1D,cAAU,IAAI,QAAQ;AAAA,EACxB;AAEA,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC9C,UAAM,QAAQ,OAAO,GAAG;AACxB,QAAI,UAAU,UAAa,UAAU,MAAM;AACzC;AAAA,IACF;AAEA,UAAM,gBAAgB,aAAa,SAAS,MAAM,GAAG,QAAQ,IAAI,GAAG;AACpE,UAAM,aAAa,SAAS,GAAG;AAC/B,QAAK,KAAa,SAAS,YAAY,YAAY;AACjD,iBAAW,kBAAkB;AAAA,QAC3B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,GAAG;AACD,kBAAU,IAAI,cAAc;AAAA,MAC9B;AACA;AAAA,IACF;AAEA,UAAM,WAAY,KAAa;AAC/B,QACG,KAAa,SAAS,YACtB,UAAU,SAAS,YAAY,UAAU,SAAS,UACnD,MAAM,QAAQ,KAAK,GACnB;AACA,YAAM,YACJ,SAAS,SAAS,QACd,qBAAqB,QAAQ,IAC7B,SAAS,QAAQ;AACvB,UAAI,CAAC,WAAW;AACd;AAAA,MACF;AACA,iBAAW,CAAC,OAAO,IAAI,KAAK,MAAM,QAAQ,GAAG;AAC3C,YAAI,MAAM,eAAe;AACvB;AAAA,QACF;AACA,mBAAW,kBAAkB;AAAA,UAC3B;AAAA,UACA;AAAA,UACA,GAAG,aAAa,IAAI,KAAK;AAAA,UACzB;AAAA,QACF,GAAG;AACD,oBAAU,IAAI,cAAc;AAAA,QAC9B;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAK,KAAa,SAAS,OAAO;AAChC,iBAAW,kBAAkB;AAAA,QAC3B;AAAA,QACA,qBAAqB,GAAG;AAAA,QACxB;AAAA,QACA;AAAA,MACF,GAAG;AACD,kBAAU,IAAI,cAAc;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,SAAS;AACtB;AAEA,SAAS,yBACP,MACA,OACA,aACiB;AACjB,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM,MAAM,QAAQ;AAAA,IACpB,MAAM,MAAM,QAAQ;AAAA,IACpB,SAAS,MAAM;AAAA,EACjB;AACF;AAEA,SAAS,yBACP,MACA,QACA,aACmB;AACnB,MAAI,WAAW,MAAM;AACnB,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,WAAW,OAAO;AACpB,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA,MAAM;AAAA,QACN,SAAS,4BAA4B,IAAI;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,WAAO,OAAO,IAAI,CAAC,UAAU,yBAAyB,MAAM,OAAO,WAAW,CAAC;AAAA,EACjF;AAEA,SAAO,CAAC,yBAAyB,MAAM,QAAQ,WAAW,CAAC;AAC7D;AAMA,SAAS,qBACP,WACA,KACA,OACA,KACA,QACsB;AACtB,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,UAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,QAAI,CAAC,WAAW,GAAG,GAAG;AACpB,aAAO,KAAK,2BAA2B,IAAI,EAAE;AAAA,IAC/C;AACA,WAAO,EAAE,SAAS,KAAK;AAAA,EACzB;AACA,SAAO,EAAE,SAAS,MAAM;AAC1B;AAEA,SAAS,eACP,WACA,KACA,OACA,KACA,UACA,QACiC;AACjC,MACE,IAAI,eACJ,YACA,SAAS,GAAG,MAAM,UAClB,UAAU,SAAS,GAAG,GACtB;AACA,UAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,WAAO,KAAK,uBAAuB,IAAI,EAAE;AACzC,WAAO,EAAE,oBAAoB,KAAK;AAAA,EACpC;AACA,SAAO,EAAE,oBAAoB,MAAM;AACrC;AAEA,SAAS,mBACP,WACA,KACA,OACA,KACA,QACA,QACsB;AACtB,QAAM,YAAY,aAAa,GAAG;AAClC,MAAI,aAAa,UAAU,UAAa,UAAU,MAAM;AACtD,UAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,UAAM,mBAAmB,yBAAyB,MAAM,UAAU,KAAK,GAAG,eAAe;AACzF,QAAI,iBAAiB,SAAS,GAAG;AAC/B,aAAO,KAAK,GAAG,iBAAiB,IAAI,CAAC,UAAU,MAAM,OAAO,CAAC;AAC7D,UAAI,QAAQ;AACV,eAAO,KAAK,GAAG,gBAAgB;AAAA,MACjC;AACA,aAAO,EAAE,SAAS,KAAK;AAAA,IACzB;AAAA,EACF;AACA,SAAO,EAAE,SAAS,MAAM;AAC1B;AAEA,SAAS,oBACP,WACA,KACA,OACA,KACA,QACA;AACA,QAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,KAAK,SAAS,IAAI,iBAAiB;AAC1C;AAAA,EACF;AAEA,QAAM,aAAa,cAAc,GAAG;AACpC,MAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,UAAM,YAAY,aAAa,MAAM,OAAO,UAAU;AACtD,QAAI,WAAW;AACb,aAAO,KAAK,SAAS;AAAA,IACvB;AAAA,EACF;AACF;AAEA,SAAS,oBACP,WACA,KACA,OACA,KACA,QACA;AACA,QAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,KAAK,SAAS,IAAI,iBAAiB;AAC1C;AAAA,EACF;AAEA,QAAM,aAAa,cAAc,GAAG;AACpC,MAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,UAAM,YAAY,aAAa,MAAM,OAAO,UAAU;AACtD,QAAI,WAAW;AACb,aAAO,KAAK,SAAS;AAAA,IACvB;AAAA,EACF;AACF;AAEA,SAAS,qBACP,WACA,KACA,OACA,MACA,QACA;AACA,QAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,MAAI,OAAO,UAAU,WAAW;AAC9B,WAAO,KAAK,SAAS,IAAI,kBAAkB;AAAA,EAC7C;AACF;AAEA,SAAS,uBACP,WACA,KACA,OACA,QACA,QACA,UACA,gBACA,QACA;AACA,aAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAQ,KAAK,GAGlD;AACH,QAAI,aAAa,IAAI,QAAQ;AAC7B,UAAM,gBACJ,YAAY,OAAO,aAAa,WAAY,SAAiB,QAAQ,IAAI;AAG3E,UAAM,EAAE,OAAO,aAAa,QAAQ,IAAI,aAAa,UAAU,UAAU;AACzE,QAAI,SAAS;AACX,UAAI,QAAQ,IAAI;AAChB,mBAAa;AAAA,IACf;AAGA,UAAM,EAAE,QAAQ,IAAI;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,QAAS;AAEb,UAAM,EAAE,mBAAmB,IAAI;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,mBAAoB;AAExB,UAAM,EAAE,aAAa,IAAI;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,aAAc;AAGlB,UAAM,EAAE,QAAQ,IAAI;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,QAAS;AAIb;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,oBACP,WACA,KACA,OACA,KACA,QACA,QACA,UACA,gBACA,QACA;AACA,QAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG;AACvE,WAAO,KAAK,SAAS,IAAI,iBAAiB;AAC1C;AAAA,EACF;AACA,QAAM,WAAW,SAAS,GAAG;AAC7B,MAAI;AACF,2BAAuB,MAAM,OAAO,UAAU,QAAQ,QAAQ,UAAU,gBAAgB,MAAM;AAClG;AAEA,SAAS,uBACP,WACA,KACA,KACA,SACA,QACA;AACA,QAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,MAAI,CAAC,IAAI,MAAM,CAAC,MAAM,OAAO,MAAM,QAAQ,GAAG;AAC5C,WAAO,KAAK,SAAS,IAAI,mBAAmB;AAC5C;AAAA,EACF;AACA,QAAM,aAAa,cAAc,OAAO;AACxC,MAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,UAAM,YAAY,aAAa,MAAM,KAAK,UAAU;AACpD,QAAI,WAAW;AACb,aAAO,KAAK,SAAS;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,YAAY,aAAa,OAAO;AACtC,MAAI,WAAW;AACb,QAAI,QAAQ,CAAC,GAAG,QAAQ;AACtB,UAAI,CAAC,UAAU,CAAC,GAAG;AACjB,eAAO,KAAK,4BAA4B,IAAI,IAAI,GAAG,GAAG;AAAA,MACxD;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,uBACP,WACA,KACA,KACA,SACA,QACA;AACA,QAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,MAAI,CAAC,IAAI,MAAM,CAAC,MAAM,OAAO,MAAM,QAAQ,GAAG;AAC5C,WAAO,KAAK,SAAS,IAAI,mBAAmB;AAAA,EAC9C;AAEA,QAAM,aAAa,cAAc,OAAO;AACxC,MAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,UAAM,YAAY,aAAa,MAAM,KAAK,UAAU;AACpD,QAAI,WAAW;AACb,aAAO,KAAK,SAAS;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,YAAY,aAAa,OAAO;AACtC,MAAI,WAAW;AACb,QAAI,QAAQ,CAAC,GAAG,QAAQ;AACtB,UAAI,CAAC,UAAU,CAAC,GAAG;AACjB,eAAO,KAAK,4BAA4B,IAAI,IAAI,GAAG,GAAG;AAAA,MACxD;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,wBACP,WACA,KACA,KACA,UACA,QACA;AACA,QAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,MAAI,CAAC,IAAI,MAAM,CAAC,MAAM,OAAO,MAAM,SAAS,GAAG;AAC7C,WAAO,KAAK,SAAS,IAAI,oBAAoB;AAAA,EAC/C;AAEA,QAAM,YAAY,aAAa,QAAQ;AACvC,MAAI,WAAW;AACb,QAAI,QAAQ,CAAC,GAAG,QAAQ;AACtB,UAAI,CAAC,UAAU,CAAC,GAAG;AACjB,eAAO,KAAK,4BAA4B,IAAI,IAAI,GAAG,GAAG;AAAA,MACxD;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,uBACP,WACA,KACA,KACA,SACA,QACA,QACA,UACA,gBACA,QACA;AACA,QAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AAEjD,MACE,CAAC,MAAM,QAAQ,GAAG,KAClB,CAAC,IAAI,MAAM,CAAC,MAAM,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,CAAC,CAAC,GAC1E;AACA,WAAO,KAAK,SAAS,IAAI,mBAAmB;AAC5C;AAAA,EACF;AAEA,QAAM,YAAY,SAAS,OAAO;AAClC,MAAI,CAAC,UAAW;AAEhB,MAAI,QAAQ,CAAC,MAAM,QAAQ;AACzB,UAAM,aAAa,GAAG,IAAI,IAAI,GAAG;AACjC,UAAM,eAAe,MAAM,QAAQ,QAAQ,IAAI,SAAS,GAAG,IAAI;AAC/D,eAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAQ,SAAS,GAGtD;AACH,UAAI,aAAc,KAAa,QAAQ;AACvC,YAAM,gBACJ,gBAAgB,OAAO,iBAAiB,WACnC,aAAqB,QAAQ,IAC9B;AAEN,YAAM,EAAE,OAAO,aAAa,QAAQ,IAAI;AAAA,QACtC;AAAA,QACA;AAAA,MACF;AACA,UAAI,SAAS;AACX,QAAC,KAAa,QAAQ,IAAI;AAC1B,qBAAa;AAAA,MACf;AAGA,YAAM,EAAE,QAAQ,IAAI;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,QAAS;AAEb,YAAM,EAAE,mBAAmB,IAAI;AAAA,QAC7B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,mBAAoB;AAExB,YAAM,EAAE,aAAa,IAAI;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,aAAc;AAGlB,YAAM,EAAE,QAAQ,IAAI;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,QAAS;AAGb;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,mBACP,WACA,KACA,OACA,KACA,QACA,QACA,UACA,gBACA,QACA;AACA,QAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO,KAAK,SAAS,GAAG,mBAAmB;AAC3C;AAAA,EACF;AACA,QAAM,WAAW,IAAI,UAAU;AAC/B,MAAI,aAAa;AACf,WAAO,uBAAuB,WAAW,KAAK,OAAO,IAAI,UAAU,MAAM;AAC3E,MAAI,aAAa;AACf,WAAO,uBAAuB,WAAW,KAAK,OAAO,IAAI,UAAU,MAAM;AAC3E,MAAI,aAAa;AACf,WAAO,wBAAwB,WAAW,KAAK,OAAO,IAAI,UAAU,MAAM;AAC5E,MAAI,aAAa;AACf,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACF,MAAI,aAAa,OAAO;AACtB,UAAM,eAAgB,IAAI,SAAiB;AAC3C,UAAM,QAAQ,CAAC,KAAU,QAAgB;AACvC,UACE,CAAC,OACD,OAAO,QAAQ,YACf,QAAQ,QACR,OAAO,IAAI,SAAS,YACpB,OAAO,IAAI,OAAO,YACjB,gBAAgB,IAAI,SAAS,cAC9B;AACA,eAAO;AAAA,UACL,SAAS,IAAI,IAAI,GAAG,2CAA2C,YAAY;AAAA,QAC7E;AAAA,MACF;AAAA,IACF,CAAC;AACD,UAAM,WAAW,SAAS,IAAI,QAAQ;AACtC,QAAI,UAAU;AACZ,YAAM,eAAe,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC;AAC3D,YAAM,QAAQ,CAAC,KAAU,QAAgB;AACvC,YAAI,OAAO,OAAO,QAAQ,YAAY,QAAQ,MAAM;AAClD,gBAAM,cAAc,aAAa,GAAG;AACpC,qBAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAQ,QAAQ,GAGrD;AACH,kBAAM,YAAY,GAAG,IAAI,IAAI,GAAG,KAAK,QAAQ;AAC7C,gBAAI,aAAa,IAAI,QAAQ;AAC7B,kBAAM,gBACJ,eAAe,OAAO,gBAAgB,WACjC,YAAoB,QAAQ,IAC7B;AACN,kBAAM,EAAE,OAAO,aAAa,QAAQ,IAAI;AAAA,cACtC;AAAA,cACA;AAAA,YACF;AACA,gBAAI,SAAS;AACX,kBAAI,QAAQ,IAAI;AAChB,2BAAa;AAAA,YACf;AACA,iBACG,eAAe,UAAa,eAAe,SAC5C,CAAC,WAAW,QAAQ,GACpB;AACA,qBAAO,KAAK,2BAA2B,SAAS,EAAE;AAClD;AAAA,YACF;AAEA,kBAAM,EAAE,mBAAmB,IAAI;AAAA,cAC7B,GAAG,IAAI,IAAI,GAAG;AAAA,cACd;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AACA,gBAAI,mBAAoB;AAExB,kBAAM,EAAE,aAAa,IAAI;AAAA,cACvB,GAAG,IAAI,IAAI,GAAG;AAAA,cACd;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AACA,gBAAI,aAAc;AAElB,kBAAM,iBAAiB,aAAa,QAAQ;AAC5C,gBACE,kBACA,eAAe,UACf,eAAe,MACf;AACA,oBAAM,mBAAmB;AAAA,gBACvB;AAAA,gBACA,eAAe,UAAU;AAAA,gBACzB;AAAA,cACF;AACA,kBAAI,iBAAiB,SAAS,GAAG;AAC/B,uBAAO,KAAK,GAAG,iBAAiB,IAAI,CAAC,UAAU,MAAM,OAAO,CAAC;AAC7D,uBAAO,KAAK,GAAG,gBAAgB;AAC/B;AAAA,cACF;AAAA,YACF;AAEA;AAAA,cACE,GAAG,IAAI,IAAI,GAAG;AAAA,cACd;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AACA;AAAA,EACF;AACA,SAAO,KAAK,SAAS,IAAI,kCAAkC;AAC7D;AAEA,SAAS,iBACP,WACA,KACA,OACA,KACA,QACA,WACA,iBACA,SACA;AACA,QAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,MACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAO,MAAM,SAAS,YACtB,OAAO,MAAM,OAAO,UACpB;AACA,WAAO,KAAK,SAAS,IAAI,uCAAuC;AAChE;AAAA,EACF;AAEA,QAAM,eAAgB,IAAY;AAClC,MAAI,gBAAgB,MAAM,SAAS,cAAc;AAC/C,WAAO;AAAA,MACL,SAAS,IAAI,yBAAyB,YAAY,SAAS,MAAM,IAAI;AAAA,IACvE;AAAA,EACF;AACF;AAEA,SAAS,eACP,WACA,KACA,OACA,KACA,QACA,QACA,UACA,gBACA,QACA;AACA,QAAM,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACjD,UAAQ,IAAI,MAAM;AAAA,IAChB,KAAK;AACH,aAAO,oBAAoB,WAAW,KAAK,OAAO,KAAK,MAAM;AAAA,IAC/D,KAAK;AACH,aAAO,oBAAoB,WAAW,KAAK,OAAO,KAAK,MAAM;AAAA,IAC/D,KAAK;AACH,aAAO,qBAAqB,WAAW,KAAK,OAAO,KAAK,MAAM;AAAA,IAChE,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO,iBAAiB,WAAW,KAAK,OAAO,KAAK,QAAQ,UAAU,gBAAgB,MAAM;AAAA,IAC9F;AACE,aAAO,KAAK,0BAA0B,IAAI,KAAK,IAAI,IAAI,EAAE;AAAA,EAC7D;AACF;AAEO,SAAS,aACd,QACA,YACA,UAAyB;AAAA,EACvB,SAAS;AAAA,EACT,OAAO;AAAA,EACP,iBAAiB,MAAM;AAAA,EACvB,gBAAgB;AAAA,EAChB,eAAe,+BAA+B,CAAC;AAAA,EAC/C,UAAU,yBAAyB,CAAC;AAAA,EACpC,eAAe;AACjB,GACW;AACX,QAAM,eAAe;AAAA,IACnB,MAAM,MAAM,OAAO,EAAE,UAAU,EAAE,OAAO;AAAA,IACxC,SAAS,MAAM,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,cAAc;AAAA,EACvE;AAEA,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,QAAQ,QAAQ,SAAS;AAG/B,QAAM,gBAAgD,QACnD;AAEH,QAAM,SAAoB;AAAA;AAAA,IAExB,QAAQ;AAAA,MACN,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAAA;AAAA,IAGA,MAAM,EAAE,YAAY,QAAQ;AAAA;AAAA,IAG5B,SAAS,OAAgB,UAAgC;AACvD,YAAM,SAAmB,CAAC;AAC1B,YAAM,SAA4B,CAAC;AACnC,YAAM,SAAc,CAAC;AACrB,YAAM,UAA0B,QAAQ,kBAAkB;AAE1D,UAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,eAAO,EAAE,OAAO,OAAO,QAAQ,CAAC,yBAAyB,EAAE;AAAA,MAC7D;AACA,UAAI,QAAQ,kBAAkB,UAAU;AACtC,YAAI,CAAC,mCAAmC,KAAK,GAAG;AAC9C,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,QAAQ,CAAC,8CAA8C;AAAA,YACvD,QAAQ;AAAA,cACN;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,gBACN,SAAS;AAAA,cACX;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,cAAM,YAAmC;AAAA,UACvC,kBAAkB;AAAA,UAClB,eAAe;AAAA,QACjB;AACA,cAAM,YAAY;AAAA,UAChB;AAAA,UACA,OAAO;AAAA,UACP;AAAA,UACA;AAAA,QACF;AACA,YAAI,UAAU,eAAe;AAC3B,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,QAAQ,CAAC,8CAA8C;AAAA,YACvD,QAAQ;AAAA,cACN;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,gBACN,SAAS;AAAA,cACX;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,YAAI,UAAU,SAAS,GAAG;AACxB,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,QAAQ,UAAU;AAAA,cAChB,CAAC,aAAa,qCAAqC,QAAQ;AAAA,YAC7D;AAAA,YACA,QAAQ,UAAU,IAAI,CAAC,cAAc;AAAA,cACnC,MAAM;AAAA,cACN,MAAM;AAAA,cACN,SAAS,qCAAqC,QAAQ;AAAA,YACxD,EAAE;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UACJ,OAAO,UAAU,YAAY,UAAU,OACnC,UAAU,KAAY,IACtB,EAAE,GAAI,MAAc;AAC1B,UAAI,QAAQ,QAAQ,KAAM,SAAQ,OAAO;AACzC,UAAI,QAAQ,WAAW,KAAM,SAAQ,UAAU;AAG/C,YAAM,cAAc,OAAO,QAAQ,WAAW,OAAO;AACrD,YAAM,YAAY,OAAO,OAAO;AAChC,UAAI,iBAAiB,UAAU,aAAa,SAAS,IAAI,GAAG;AAC1D,cAAM,aAAa,mBAAmB,eAAe,EAAE,GAAG,QAAQ,GAAG;AAAA,UACnE,MAAM;AAAA,UACN,IAAI;AAAA,UACJ;AAAA,UACA,UAAU,MAAM,OAAO,SAAS;AAAA,QAClC,CAAC;AACD,YAAI,CAAC,cAAc,WAAW,OAAO,QAAQ,CAAC,WAAW,OAAO;AAC9D,gBAAM,OAAO,YAAY,QAAQ,SAC7B,WAAW,SACX,CAAC,kCAAkC,WAAW,QAAQ,SAAS,EAAE;AACrE,iBAAO,KAAK,GAAG,IAAI;AAEnB,iBAAO,EAAE,OAAO,OAAO,OAAO;AAAA,QAChC;AAEA,mBAAW,KAAK,OAAO,KAAK,OAAO,EAAG,QAAQ,QAAgB,CAAC;AAC/D,eAAO,OAAO,SAAS,WAAW,KAAK;AAEvC,gBAAQ,OAAO;AACf,gBAAQ,UAAU;AAAA,MACpB;AAEA,UACE,QAAQ,aAAa,YACpB,QAAQ,SAAS,cAAc,QAAQ,YAAY,UACpD;AACA,eAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ,CAAC,qDAAqD;AAAA,UAC9D,QAAQ;AAAA,YACN;AAAA,cACE,MAAM;AAAA,cACN,MAAM;AAAA,cACN,SAAS;AAAA,YACX;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,iBAAW,OAAO,OAAO,QAAQ;AAC/B,cAAM,MAAM,OAAO,OAAO,GAAG;AAC7B,YAAI,QAAQ,QAAQ,GAAG;AACvB,cAAM,gBACJ,YAAY,OAAO,aAAa,WAAY,SAAiB,GAAG,IAAI;AAEtE,YAAI,CAAC,KAAK;AACR,iBAAO,KAAK,iCAAiC,GAAG,EAAE;AAClD;AAAA,QACF;AAGA,cAAM,EAAE,OAAO,aAAa,QAAQ,IAAI,aAAa,KAAK,KAAK;AAC/D,YAAI,SAAS;AACX,kBAAQ,GAAG,IAAI;AACf,kBAAQ;AAAA,QACV;AAGA,cAAM,EAAE,QAAQ,IAAI,qBAAqB,IAAI,KAAK,OAAO,KAAK,MAAM;AACpE,YAAI,QAAS;AAGb,cAAM,EAAE,mBAAmB,IAAI;AAAA,UAC7B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,YAAI,mBAAoB;AAGxB,cAAM,EAAE,aAAa,IAAI;AAAA,UACvB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,YAAI,aAAc;AAGlB,cAAM,gBAAgB,CAAC,QAAuB;AAC5C,gBAAM,cAAwB,CAAC;AAC/B,gBAAM,cAAiC,CAAC;AACxC,gBAAM,EAAE,QAAQ,IAAI;AAAA,YAClB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,cAAI,CAAC,SAAS;AACZ,2BAAe,IAAI,KAAK,KAAK,KAAK,aAAa,aAAa,eAAe,SAAS,OAAO;AAAA,UAC7F;AACA,iBAAO,KAAK,GAAG,WAAW;AAC1B,iBAAO;AAAA,QACT;AAGA,YAAI,aAAa;AACjB,YAAI,cAAc,cAAc,UAAU;AAG1C,cAAM,aAAa,OAAO,QAAQ,WAAW,OAAO;AACpD,cAAM,WAAW,OAAO,OAAO;AAC/B,cAAM,UAAU,OAAQ,IAAY,YAAY,QAAQ;AACxD,cAAM,cAAc,OAAQ,IAAY,aAAa;AAErD,YACE,YAAY,SAAS,KACrB,eACA,UAAU,YAAY,QAAQ,IAAI,GAClC;AACA,gBAAM,KAAM,IAAY;AAUxB,gBAAM,MAAM,GAAG,YAAY;AAAA,YACzB;AAAA,YACA;AAAA,YACA;AAAA,YACA,WAAW;AAAA,UACb,CAAC;AACD,cAAI,OAAO,IAAI,IAAI;AACjB,yBAAa,IAAI;AACjB,0BAAc,cAAc,UAAU;AAAA,UACxC,OAAO;AACL,wBAAY;AAAA,cACV,KAAK,SACH,2BAA2B,GAAG,UAAU,UAAU,QAAQ,QAAQ;AAAA,YACtE;AAAA,UACF;AAAA,QACF;AAEA,eAAO,GAAG,IAAI;AAEd,YAAI,YAAY,WAAW,GAAG;AAC5B,iBAAO,KAAK,GAAG,WAAW;AAC1B;AAAA,QACF;AAAA,MACF;AAEA,UAAI,OAAO,WAAW,KAAK,QAAQ,iBAAiB;AAClD,cAAM,YAAY;AAClB,cAAM,SAAS;AACf,cAAM,oBAA6C,OAAO,OAAO;AAAA,UAC/D,aAAa,CAAC,cACZ,OAAO,UAAU,eAAe,KAAK,QAAQ,SAAS;AAAA,QAC1D,CAAC;AACD,YAAI,CAAC,QAAQ,gBAAgB,WAAW,iBAAiB,GAAG;AAC1D,iBAAO,KAAK,iCAAiC;AAAA,QAC/C;AAAA,MACF;AAEA,aAAO;AAAA,QACL,OAAO,OAAO,WAAW;AAAA,QACzB,OAAO;AAAA,QACP;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA;AAAA,IAGA,iBAAiB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMzB,QACE,OACA,KAKA;AACA,YAAM,cAAc,OAAQ,OAAe,WAAW,OAAO;AAC7D,YAAM,YAAY,OAAO,OAAO;AAChC,UAAI,CAAC,iBAAiB,UAAU,aAAa,SAAS,KAAK,GAAG;AAE5D,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,OAAO,EAAE,GAAG,OAAO,MAAM,YAAY,SAAS,UAAU;AAAA,QAC1D;AAAA,MACF;AACA,YAAM,MAAM;AAAA,QACV;AAAA,QACA,EAAE,GAAI,MAAc;AAAA,QACpB;AAAA,UACE,MAAM;AAAA,UACN,IAAI;AAAA,UACJ;AAAA,UACA,UAAU,MAAM,OAAO,SAAS;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AACA,UAAI,OAAO,IAAI,MAAM,IAAI,OAAO;AAC9B,cAAM,MAAM,EAAE,GAAG,IAAI,OAAO,MAAM,YAAY,SAAS,UAAU;AACjE,eAAO,EAAE,IAAI,MAAM,OAAO,IAAI;AAAA,MAChC;AACA,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ,KAAK,QAAQ,SACjB,IAAI,SACJ,CAAC,kCAAkC,WAAW,QAAQ,SAAS,EAAE;AAAA,MACvE;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAwBA,MAAM,oBAAoB,QAAQC,UAAS;AACzC,YAAM;AAAA,QACJ;AAAA,QACA,mBAAmB,EAAE,SAAS,oBAAI,IAAI,EAAE;AAAA,QACxC,WAAW;AAAA,QACX;AAAA,MACF,IAAIA;AAEJ,YAAM,YAAY,GAAI,OAAe,IAAI,IAAK,OAAe,EAAE;AAC/D,UAAI,iBAAiB,QAAQ,IAAI,SAAS,GAAG;AAC3C,cAAM,mCAAmC,SAAS,EAAE;AACpD;AAAA,MACF;AACA,uBAAiB,QAAQ,IAAI,SAAS;AACtC,YAAM,qCAAqC,SAAS,EAAE;AAEtD,iBAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,OAAO,MAAM,GAAG;AAEtD,YAAIA,SAAQ,cAAc,CAACA,SAAQ,WAAW,SAAS,GAAG,GAAG;AAC3D,gBAAM,kBAAkB,GAAG,sBAAsB;AACjD;AAAA,QACF;AAEA,cAAM,eAAgB,IAAY,iBAAiB;AACnD,cAAM,YAAa,IAAY,aAAa;AAC5C,cAAM,QAAS,OAAe,GAAG;AACjC,YAAI,CAAC,MAAO;AAEZ,YAAI,IAAI,SAAS,OAAO;AACtB,gBAAM,UAAW,IAAY;AAC7B,cAAI,CAAC;AACH,kBAAM,IAAI,MAAM,uCAAuC,GAAG,EAAE;AAC9D,gBAAM,MAAM;AACZ,cAAI,IAAI,QAAQ,IAAI,SAAS,SAAS;AACpC,kBAAM,IAAI;AAAA,cACR,qCAAqC,GAAG,cAAc,OAAO,SAAS,IAAI,IAAI;AAAA,YAChF;AAAA,UACF;AACA,gBAAM,SAAS,MAAMA,SAAQ,cAAc,SAAS,IAAI,EAAE;AAC1D,cAAI,CAAC;AACH,kBAAM,IAAI;AAAA,cACR,qBAAqB,OAAO,IAAI,IAAI,EAAE,aAAa,GAAG;AAAA,YACxD;AACF,gBAAM,YAAY,OAAO,IAAI,IAAI,EAAE,eAAe,GAAG,EAAE;AAEvD,cAAI,gBAAgB,cAAc,SAAS;AACzC,kBAAM,eAAe,iBAAiB,OAAO;AAC7C,gBAAIA,SAAQ,WAAY,KAAK,cAAc;AACzC,oBAAM,aAAa,oBAAoB,QAAQ;AAAA,gBAC7C,GAAGA;AAAA,gBACH,UAAUA,SAAQ,WAAY;AAAA,cAChC,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QAEF,WAAW,IAAI,SAAS,WAAW,IAAI,UAAU,SAAS,OAAO;AAC/D,gBAAM,UAAW,IAAI,SAAiB;AACtC,cAAI,CAAC;AACH,kBAAM,IAAI,MAAM,6CAA6C,GAAG,EAAE;AACpE,gBAAM,OAAO;AACb,qBAAW,OAAO,MAAM;AACtB,gBAAI,IAAI,QAAQ,IAAI,SAAS,SAAS;AACpC,oBAAM,IAAI;AAAA,gBACR,qCAAqC,GAAG,cAAc,OAAO,SAAS,IAAI,IAAI;AAAA,cAChF;AAAA,YACF;AACA,kBAAM,SAAS,MAAMA,SAAQ,cAAc,SAAS,IAAI,EAAE;AAC1D,gBAAI,CAAC;AACH,oBAAM,IAAI;AAAA,gBACR,qBAAqB,OAAO,IAAI,IAAI,EAAE,aAAa,GAAG;AAAA,cACxD;AACF,kBAAM,YAAY,OAAO,IAAI,IAAI,EAAE,eAAe,GAAG,EAAE;AAEvD,gBAAI,gBAAgB,cAAc,SAAS;AACzC,oBAAM,eAAe,iBAAiB,OAAO;AAC7C,kBAAIA,SAAQ,WAAY,KAAK,cAAc;AACzC,sBAAM,aAAa,oBAAoB,QAAQ;AAAA,kBAC7C,GAAGA;AAAA,kBACH,UAAUA,SAAQ,WAAY;AAAA,gBAChC,CAAC;AAAA,cACH;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,YAAoB;AAClB,UAAI,CAAC,SAAS,UAAU,IAAI;AAC1B,cAAM,IAAI,MAAM,sCAAsC;AAAA,MACxD;AACA,aAAO;AAAA,IACT;AAAA,IAEA,UACE,OACAA,WAA4B,CAAC,GACR;AACrB,UAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,eAAO,CAAC;AAAA,MACV;AAEA,YAAM,aAAkC,CAAC;AACzC,iBAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,OAAO,MAAM,GAAG;AACtD,YAAI,CAAC,mBAAmB,KAAKA,QAAO,GAAG;AACrC;AAAA,QACF;AAEA,YAAI,CAAC,OAAO,UAAU,eAAe,KAAK,OAAO,GAAG,GAAG;AACrD;AAAA,QACF;AAEA,cAAM,QAAQ,oBAAoB,KAAM,MAAc,GAAG,GAAGA,QAAO;AACnE,YAAI,UAAU,QAAW;AACvB,qBAAW,GAAG,IAAI;AAAA,QACpB;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWA,kBACE,OACA,WACA,QACqB;AACrB,aAAO,kBAAqB,QAAQ,OAAO,WAAW,MAAM;AAAA,IAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUA,eACE,QACA,WACqB;AACrB,aAAO,eAAkB,QAAQ,QAAQ,SAAS;AAAA,IACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUA,eACE,MACA,aACqB;AACrB,aAAO,eAAkB,QAAQ,MAAM,WAAW;AAAA,IACpD;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,cAMG;AACD,aAAO,YAAe,MAAM;AAAA,IAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,kBAAkB,QAAkD;AAClE,aAAO,kBAAqB,QAAQ,MAAM;AAAA,IAC5C;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,WAAW;AACT,YAAM,cAAmC,CAAC;AAC1C,iBAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,OAAO,MAAM,GAAG;AACtD,oBAAY,GAAG,IAAI;AAAA,UACjB,MAAM,IAAI;AAAA,UACV,UAAU,WAAW,GAAG;AAAA,UACxB,WAAW,CAAC,CAAC,IAAI;AAAA,UACjB,QAAQ,CAAC,CAAC,IAAI;AAAA,UACd,aAAa,IAAI,gBAAgB;AAAA,UACjC,SAAS,IAAI,YAAY;AAAA,UACzB,YAAa,IAAY,cAAc;AAAA,UACvC,mBACG,IAAY,sBAAsB,SAC/B,OACC,IAAY;AAAA,UACnB,MAAM,cAAc,GAAU,KAAK;AAAA,UACnC,SAAU,IAAY,WAAW;AAAA,UACjC,KACE,CAAC,IAAI,QAAQ,IAAI,KAAK,mBAAmB,SAAS,OAAO,IAAI;AAAA,UAC/D,UAAU,IAAI,aAAa;AAAA,QAC7B;AAAA,MACF;AAEA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,kBAAkB,CAAC,CAAC;AAAA,QACpB,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAGA,uBAAqB,IAAI,YAAY,MAAM;AAC3C,SAAO;AACT;AAMO,SAAS,iBAAiB,MAAuC;AACtE,SAAO,qBAAqB,IAAI,IAAI;AACtC;AAKO,SAAS,gBAA+B;AAC7C,SAAO,MAAM,KAAK,qBAAqB,OAAO,CAAC;AACjD;AAMO,SAAS,wBACd,QAYA;AACA,QAAM,OAAO,OAAO,SAAS;AAC7B,SAAO;AAAA,IACL,OAAO,GAAG,KAAK,UAAU,MAAM,KAAK,OAAO;AAAA,IAC3C,QAAQ,OAAO,QAAQ,KAAK,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,GAAG,OAAO;AAAA,MACvD;AAAA,MACA,MAAM,IAAI;AAAA,MACV,UAAU,IAAI;AAAA,MACd,aAAa,IAAI;AAAA,MACjB,YAAY,IAAI;AAAA,MAChB,KAAK,IAAI,MAAM,IAAI,IAAI,iBAAiB;AAAA,MACxC,UAAU,IAAI;AAAA,IAChB,EAAE;AAAA,EACJ;AACF;;;ACnuDA,IAAM,0BAA0B,oBAAI,IAAiC;AAE9D,SAAS,sBACd,OACA,MACA,SACA,YAAoB,IACpB,kBAAiD,MAAM,MAClC;AACrB,QAAM,SAAS,aAAgB,OAAY,MAAM;AAAA,IAC/C;AAAA,IACA,gBAAgB;AAAA,IAChB,OAAO;AAAA,IACP;AAAA,EACF,CAAC;AACD,0BAAwB,MAAM,MAA6B;AAC3D,SAAO;AACT;AAEO,SAAS,wBACd,MACA,QACA;AACA,0BAAwB,IAAI,MAAM,MAAM;AAC1C;AAEO,SAAS,mBACd,MACiC;AACjC,SAAO,wBAAwB,IAAI,IAAI;AACzC;AAEO,SAAS,yBAA0D;AACxE,SAAO,MAAM,KAAK,wBAAwB,QAAQ,CAAC;AACrD;;;AClCO,IAAM,4BAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKO,IAAM,kCAAkC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AACF;AAMO,IAAM,2CAA2C;AAAA,EACtD;AAAA,EACA;AACF;AAKA,IAAM,gBAAgB,MACpB,MACG,OAAO,EACP,IAAI,CAAC,EACL,IAAI,GAAG,EACP,IAAI;AAAA,EACH,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,SAAS;AACX,CAAC,EACA;AAAA,EACC;AACF;AAEJ,IAAM,eAAe,MAAM,MAAM,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAExD,IAAM,iBAAiB,MACrB,MAAM,OAAO,EAAE,KAAK,yBAAyB;AAE/C,IAAM,kBAAkB,MACtB,MACG,YAAY,EACZ,IAAI,CAAC,EACL,IAAI,GAAG,EACP,YAAY,4BAA4B;AAE7C,IAAM,oBAAoB,MACxB,MACG,YAAY,EACZ,IAAI,CAAC,EACL,IAAI,GAAG,EACP,YAAY,8BAA8B;AAE/C,IAAM,sBAAsB,CAAC,qBAAqB,UAAU;AAAA,EAC1D,IAAI,aAAa;AAAA,EACjB,UAAU,cAAc;AAAA,EACxB,YAAY,MAAM,YAAY;AAAA,EAC9B,MAAM,eAAe;AAAA,EACrB,OAAO,gBAAgB;AAAA,EACvB,SAAS,kBAAkB;AAAA,EAC3B,aAAa,qBACT,MAAM,QAAQ,EAAE,QAAQ,KAAK,IAC7B,MAAM,QAAQ;AACpB;AAEA,IAAM,uBAAuB,OAAO;AAAA,EAClC,IAAI,aAAa;AAAA,EACjB,OAAO,gBAAgB;AAAA,EACvB,SAAS,kBAAkB;AAAA,EAC3B,YAAY,MAAM,YAAY;AAAA,EAC9B,MAAM,eAAe;AACvB;AAEA,IAAM,mBAAmB,OAAO;AAAA,EAC9B,IAAI,aAAa;AAAA,EACjB,OAAO,gBAAgB;AAAA,EACvB,SAAS,kBAAkB;AAAA,EAC3B,YAAY,MAAM,YAAY;AAAA,EAC9B,MAAM,eAAe;AAAA,EACrB,aAAa,MAAM,QAAQ;AAC7B;AAEA,IAAM,oBAAoB,OAAO;AAAA,EAC/B,IAAI,aAAa;AAAA,EACjB,OAAO,gBAAgB;AAAA,EACvB,MAAM,MAAM,OAAO,EAAE,KAAK,+BAA+B;AAAA,EACzD,eAAe,kBAAkB;AAAA,EACjC,UAAU,MAAM,YAAY,EAAE,SAAS;AACzC;AAEA,IAAM,yBAAyB,OAAO;AAAA,EACpC,IAAI,aAAa;AAAA,EACjB,OAAO,gBAAgB;AAAA,EACvB,SAAS,MAAM,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAI;AAAA,EACvC,QAAQ,MAAM,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAI;AAAA,EACtC,QAAQ,MAAM,OAAO,EAAE,KAAK,wCAAwC;AACtE;AA6EO,IAAM,uCAAuC;AAAA,EAClD;AAAA,IACE,QAAQ,MAAM,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IACrC,WAAW,MAAM,YAAY;AAAA,IAC7B,QAAQ,MAAM,MAAM,MAAM,OAAO,oBAAoB,CAAC,CAAC;AAAA,EACzD;AAAA,EACA;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,gBAAgB;AAAA,EAClB;AACF;AAGO,IAAM,yCAAyC;AAAA,EACpD;AAAA,IACE,gBAAgB,MAAM,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IAC7C,aAAa,MAAM,YAAY;AAAA,IAC/B,QAAQ,MAAM;AAAA,MACZ,MAAM,OAAO;AAAA,QACX,GAAG,oBAAoB,KAAK;AAAA,QAC5B,kBAAkB,MAAM,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,MACjD,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EACA;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,gBAAgB;AAAA,EAClB;AACF;AAGO,IAAM,oCAAoC;AAAA,EAC/C;AAAA,IACE,UAAU,cAAc;AAAA,IACxB,aAAa,MAAM,YAAY;AAAA,IAC/B,gBAAgB,MAAM,YAAY;AAAA,IAClC,YAAY,MAAM,MAAM,MAAM,OAAO,qBAAqB,CAAC,CAAC;AAAA,IAC5D,QAAQ,MAAM,MAAM,MAAM,OAAO,iBAAiB,CAAC,CAAC;AAAA,IACpD,cAAc,MAAM,MAAM,MAAM,OAAO,kBAAkB,CAAC,CAAC;AAAA,IAC3D,QAAQ,MAAM,MAAM,MAAM,OAAO,uBAAuB,CAAC,CAAC;AAAA,EAC5D;AAAA,EACA;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,gBAAgB;AAAA,EAClB;AACF;;;AC1OO,IAAM,4BAA4B;;;ACIlC,IAAM,4BAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,2BAA2B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,4BAA4B;AAAA,EACvC;AAAA,EACA;AACF;AAGO,IAAM,qCAAqC;AAAA,EAChD;AAAA,IACE,WAAW;AAAA,IACX,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,WAAW;AAAA,IACX,YAAY;AAAA,EACd;AACF;AAGO,IAAM,wCAAwC;AAAA,EACnD;AAAA,EACA;AACF;AAGO,IAAM,4BAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,8BAA8B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,kCAAkC;AAGxC,IAAM,kCAAkC;AAGxC,IAAM,4BAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,4BAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,8BAA8B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,8BAA8B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,WAAW,cAAc;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAG;AACD,SAAO,OAAO,UAAU;AAC1B;AACA,WAAW,SAAS,oCAAoC;AACtD,SAAO,OAAO,KAAK;AACrB;;;ACpFA,IAAM,qBAAqB,CAAC,YAC1B,MACG,OAAO,EACP,UAAU,CAAC,UAAU,OAAO,cAAc,KAAK,CAAC,EAChD,IAAI,CAAC,EACL,IAAI,OAAO;AAEhB,IAAM,sBAAsB,OAAO;AAAA,EACjC,MAAM,MAAM,OAAO,EAAE,KAAK,CAAC,2BAA2B,CAAU;AAAA,EAChE,SAAS,MAAM,OAAO,EAAE,KAAK,CAAC,yBAAyB,CAAU;AACnE;AAEA,IAAM,mBAAmB,OAAO;AAAA,EAC9B,MAAM,MAAM,OAAO,EAAE,KAAK,2BAA2B;AAAA,EACrD,OAAO,mBAAmB,+BAA+B;AAC3D;AAEO,IAAM,+BAA+B,CAAC,kBAAkB,WAAW;AAAA,EACxE,GAAI,kBAAkB,oBAAoB,IAAI,CAAC;AAAA,EAC/C,WAAW,MAAM,OAAO,EAAE,KAAK,yBAAyB;AAAA,EACxD,kBAAkB,MAAM,QAAQ;AAAA,EAChC,sBAAsB,MACnB,OAAO,EACP,KAAK,qCAAqC;AAAA,EAC7C,UAAU,MAAM,OAAO,EAAE,KAAK,yBAAyB;AAAA,EACvD,SAAS,MAAM,OAAO,EAAE,KAAK,wBAAwB;AAAA,EACrD,gBAAgB,MAAM,OAAO,EAAE,KAAK,yBAAyB;AAAA,EAC7D,iBAAiB,MAAM,OAAO,EAAE,KAAK,2BAA2B;AAAA,EAChE,iBAAiB,MAAM,OAAO,EAAE,KAAK,2BAA2B;AAAA,EAChE,YAAY,MACT,MAAM,MAAM,OAAO,EAAE,KAAK,yBAAyB,CAAC,EACpD,IAAI,0BAA0B,MAAM;AAAA,EACvC,UAAU,MACP,MAAM,MAAM,OAAO,iBAAiB,CAAC,CAAC,EACtC,IAAI,+BAA+B;AAAA,EACtC,YAAY,MACT,MAAM,MAAM,OAAO,EAAE,KAAK,yBAAyB,CAAC,EACpD,IAAI,0BAA0B,MAAM;AACzC;AAEO,IAAM,sCAAsC,CACjD,UACY;AACZ,QAAM,aAAa,MAAM,QAAQ,MAAM,UAAU,IAAI,MAAM,aAAa,CAAC;AACzE,QAAM,aAAa,MAAM,QAAQ,MAAM,UAAU,IAAI,MAAM,aAAa,CAAC;AACzE,QAAM,WAAW,MAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,WAAW,CAAC;AACnE,QAAM,aAAa,mCAAmC;AAAA,IACpD,CAAC,EAAE,UAAU,MAAM,cAAc,MAAM;AAAA,EACzC;AACA,SACE,MAAM,qBAAqB,QAC3B,eAAe,UACf,WAAW,eAAe,MAAM,wBAChC,IAAI,IAAI,UAAU,EAAE,SAAS,WAAW,UACxC,IAAI,IAAI,UAAU,EAAE,SAAS,WAAW,UACxC,IAAI;AAAA,IACF,SAAS;AAAA,MAAI,CAAC,YACZ,OAAO,YAAY,YAAY,YAAY,OACtC,QAA+B,OAChC;AAAA,IACN;AAAA,EACF,EAAE,SAAS,SAAS;AAExB;AAGO,IAAM,gCAAgC;AAAA,EAC3C,6BAA6B;AAAA,EAC7B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AACF;AAsBO,IAAM,kCAAkC,CAC7C,UAC4C;AAC5C,QAAM,SAAS,8BAA8B,SAAS,KAAK;AAC3D,MAAI,CAAC,OAAO,SAAS,OAAO,UAAU,QAAW;AAC/C,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ,OAAO,UAAU,CAAC,qCAAqC;AAAA,MAC/D,GAAI,OAAO,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,OAAO,OAAO;AAAA,IACjE;AAAA,EACF;AACA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,OAAO,OAAO;AAAA,EAChB;AACF;;;ACzJA;AAAA,EACE,WAAa;AAAA,EACb,gBAAkB;AAAA,EAClB,eAAiB;AAAA,EACjB,sBAAwB;AAAA,EACxB,gBAAkB;AAAA,EAClB,eAAiB;AAAA,EACjB,YAAc;AAAA,EACd,eAAiB;AAAA,EACjB,gBAAkB;AAAA,EAClB,gBAAkB;AAAA,EAClB,SAAW;AACb;;;ACZA,IAAM,qBACJ;AACF,IAAM,oBAAoB;AAC1B,IAAM,uBAAuB;AAC7B,IAAM,iCAAiC;AACvC,IAAM,oBAAoB;AAC1B,IAAM,0BAA0B;AAChC,IAAM,6BAA6B,0BAA0B;AAC7D,IAAM,+BAA+B;AACrC,IAAM,gBAAgB,oBAAI,IAAI;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAeD,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,oBACP,UACA,UACS;AACT,SACE,OAAO,KAAK,QAAQ,EAAE,WAAW,cAAc,QAC/C,OAAO,KAAK,QAAQ,EAAE,MAAM,CAAC,QAAQ,cAAc,IAAI,GAAG,CAAC,KAC3D,SAAS,cAAc,SAAS,aAChC,SAAS,mBAAmB,SAAS,kBACrC,SAAS,kBAAkB,SAAS,iBACpC,SAAS,yBAAyB,SAAS,wBAC3C,SAAS,mBAAmB,SAAS,kBACrC,SAAS,kBAAkB,SAAS,iBACpC,SAAS,eAAe,SAAS,cACjC,SAAS,kBAAkB,SAAS,iBACpC,SAAS,mBAAmB,SAAS,kBACrC,SAAS,mBAAmB,SAAS;AAEzC;AAEA,SAAS,yBACP,OACA,SACiB;AACjB,SACE,OAAO,UAAU,YACjB,OAAO,cAAc,KAAK,KAC1B,QAAQ,KACR,SAAS;AAEb;AAEA,SAAS,iBACP,UACA,UACS;AACT,SACE;AAAA,IACE,SAAS;AAAA,IACT;AAAA,EACF,KACA;AAAA,IACE,SAAS;AAAA,IACT;AAAA,EACF,KACA;AAAA,IACE,SAAS;AAAA,IACT;AAAA,EACF,KACA;AAAA,IACE,SAAS;AAAA,IACT;AAAA,EACF,KACA,SAAS,kBAAkB,SAAS,aAAa,KACjD,SAAS,kBAAkB,SAAS,aAAa,KACjD;AAAA,IACE,SAAS;AAAA,IACT;AAAA,EACF,KACA;AAAA,IACE,SAAS;AAAA,IACT;AAAA,EACF;AAEJ;AAEA,SAAS,yBAAyB,OAAuC;AACvE,MACE,MAAM,WAAW,KACjB,MAAM,SAAS,kCACf,MAAM,SAAS,MAAM,KACrB,CAAC,kBAAkB,KAAK,KAAK,GAC7B;AACA,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,mBAAmB,QAAQ,MAAM,GAAG,EAAE,KAAK,EAAE;AACjE,MACE,cAAc,KACb,MAAM,SAAS,MAAM,MAAM,cAAc,QAAY,KACrD,MAAM,SAAS,MAAM,MAAM,cAAc,OAAU,GACpD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,oBAAoB,KAAK,MAAO,MAAM,SAAS,IAAK,CAAC;AAC3D,QAAM,SAAS,IAAI,WAAW,iBAAiB;AAC/C,MAAI,cAAc;AAClB,MAAI,cAAc;AAClB,MAAI,WAAW;AAEf,aAAW,aAAa,OAAO;AAC7B,UAAM,SAAS,mBAAmB,QAAQ,SAAS;AACnD,QAAI,SAAS,GAAG;AACd,aAAO;AAAA,IACT;AACA,kBAAe,eAAe,IAAK;AACnC,gBAAY;AACZ,WAAO,YAAY,GAAG;AACpB,kBAAY;AACZ,aAAO,WAAW,IAAK,eAAe,WAAY;AAClD,qBAAe;AACf,sBAAgB,KAAK,YAAY;AAAA,IACnC;AAAA,EACF;AAEA,MACE,gBAAgB,qBACf,WAAW,KAAK,gBAAgB,GACjC;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,8BACP,OACA,eACyB;AACzB,MACE,CAAC;AAAA,IACC;AAAA,IACA;AAAA,EACF,KACA,gBAAgB,MAAM,GACtB;AACA,WAAO;AAAA,EACT;AACA,QAAM,YAAY,IAAI,YAAY,aAAa;AAC/C,MAAI,aAAa;AACjB,MAAI,mBAAmB;AAEvB,WAAS,gBAAgB,GAAG,gBAAgB,eAAe,iBAAiB,GAAG;AAC7E,QAAI,QAAQ;AACZ,QAAI,aAAa;AACjB,QAAI,YAAY;AAEhB,WAAO,MAAM;AACX,UAAI,cAAc,MAAM,UAAU,aAAa,mBAAmB;AAChE,eAAO;AAAA,MACT;AACA,YAAM,OAAO,MAAM,UAAU;AAC7B,UAAI,SAAS,QAAW;AACtB,eAAO;AAAA,MACT;AACA,oBAAc;AACd,mBAAa;AAEb,YAAM,UAAU,OAAO;AACvB,eAAS,UAAU;AACnB,UAAI,CAAC,OAAO,cAAc,KAAK,GAAG;AAChC,eAAO;AAAA,MACT;AAEA,WAAK,OAAO,SAAU,GAAG;AACvB,YAAI,YAAY,KAAK,YAAY,GAAG;AAClC,iBAAO;AAAA,QACT;AACA;AAAA,MACF;AACA,oBAAc;AAAA,IAChB;AAEA,UAAM,WAAW,mBAAmB;AACpC,QACE,SAAS,KACT,CAAC,OAAO,cAAc,QAAQ,KAC9B,WAAW,sBACX;AACA,aAAO;AAAA,IACT;AACA,cAAU,aAAa,IAAI;AAC3B,uBAAmB;AAAA,EACrB;AAEA,MAAI,eAAe,MAAM,QAAQ;AAC/B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,kBACP,WACA,UACS;AACT,MAAI,cAAc;AAClB,MAAI,iBAAiB;AAErB,WAAS,QAAQ,GAAG,QAAQ,UAAU,QAAQ,SAAS,GAAG;AACxD,UAAM,QAAQ,UAAU,KAAK;AAC7B,UAAM,MAAM,UAAU,QAAQ,CAAC;AAC/B,QACE,UAAU,UACV,QAAQ,UACR,SAAS,eACT,OAAO,SACP,MAAM,sBACN;AACA,aAAO;AAAA,IACT;AACA,sBAAkB,MAAM;AACxB,kBAAc;AAAA,EAChB;AAEA,SAAO,mBAAmB,SAAS;AACrC;AAUO,SAAS,qCACd,OACA,UACyB;AACzB,MACE,CAAC,SAAS,KAAK,KACf,CAAC,iBAAiB,OAAO,QAAQ,KACjC,CAAC,oBAAoB,OAAO,QAAQ,KACpC,OAAO,MAAM,YAAY,UACzB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,yBAAyB,MAAM,OAAO;AACpD,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AACA,QAAM,YAAY;AAAA,IAChB;AAAA,IACA,SAAS;AAAA,EACX;AACA,SAAO,cAAc,UAAa,kBAAkB,WAAW,QAAQ,IACnE,YACA;AACN;;;ACjRO,IAAM,8BACX;AAMK,IAAM,2CACX;AAEF,IAAM,yBAAyB;AAC/B,IAAM,uBAAuB;AAC7B,IAAM,qBAAqB;AAC3B,IAAM,sBAAsB;AAC5B,IAAM,oBAAoB;AAE1B,IAAM,6BAA6B;AAAA,EACjC;AAAA,EACA;AAAA,IACE,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,sBAAsB;AAAA,IACtB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EAClB;AACF;AAUO,SAAS,mCACd,WACS;AACT,MACE,+BAA+B,UAC/B,CAAC,OAAO,UAAU,SAAS,KAC3B,YAAY,KACZ,YAAY,0BACX,aAAa,wBACZ,aAAa,mBACf;AACA,WAAO;AAAA,EACT;AAEA,MAAI,aAAa;AACjB,MAAI,aAAa,2BAA2B,SAAS,IAAI;AAEzD,SAAO,cAAc,YAAY;AAC/B,UAAM,aAAa,KAAK,OAAO,aAAa,cAAc,CAAC;AAC3D,UAAM,QAAQ,2BAA2B,aAAa,CAAC;AACvD,UAAM,MAAM,2BAA2B,aAAa,IAAI,CAAC;AAEzD,QAAI,UAAU,UAAa,QAAQ,QAAW;AAC5C,aAAO;AAAA,IACT;AACA,QAAI,YAAY,OAAO;AACrB,mBAAa,aAAa;AAAA,IAC5B,WAAW,aAAa,KAAK;AAC3B,mBAAa,aAAa;AAAA,IAC5B,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAWO,SAAS,8CACd,MACS;AACT,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,QAAQ,KAAK,WAAW,KAAK;AACnC,QAAI,YAAY;AAEhB,QAAI,SAAS,wBAAwB,SAAS,oBAAoB;AAChE,YAAM,SAAS,KAAK,WAAW,QAAQ,CAAC;AACxC,UACE,CAAC,OAAO,UAAU,MAAM,KACxB,SAAS,uBACT,SAAS,mBACT;AACA,eAAO;AAAA,MACT;AACA,kBACE,SACE,QAAQ,wBAAyB,OAClC,SAAS;AACZ,eAAS;AAAA,IACX,WAAW,SAAS,uBAAuB,SAAS,mBAAmB;AACrE,aAAO;AAAA,IACT;AAEA,QAAI,mCAAmC,SAAS,GAAG;AACjD,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;;;ACpEO,IAAM,yCACX;AAGK,IAAM,gCAAgC,OAAO,OAAO;AAAA,EACzD,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,IAAI,KAAK;AAAA,EACT,KAAK,KAAK;AACZ,CAAU;AAGH,IAAM,mCAAmC,KAAK,KAAK,KAAK;AAGxD,IAAM,uBAAuB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,mCAAmC,qBAAqB;AAAA,EACnE,CAAC,cAAc,cAAc;AAC/B;AAGO,IAAM,2BAA2B;AAAA,EACtC,EAAE,OAAO,GAAG,IAAI,YAAY,UAAU,6BAA6B;AAAA,EACnE,EAAE,OAAO,GAAG,IAAI,SAAS,UAAU,0BAA0B;AAAA,EAC7D,EAAE,OAAO,GAAG,IAAI,cAAc,UAAU,+BAA+B;AAAA,EACvE,EAAE,OAAO,GAAG,IAAI,YAAY,UAAU,6BAA6B;AAAA,EACnE,EAAE,OAAO,GAAG,IAAI,YAAY,UAAU,6BAA6B;AACrE;AAGO,IAAM,+BAA+B;AAAA,EAC1C,EAAE,OAAO,GAAG,IAAI,aAAa,UAAU,kCAAkC;AAAA,EACzE,EAAE,OAAO,GAAG,IAAI,QAAQ,UAAU,6BAA6B;AAAA,EAC/D,EAAE,OAAO,GAAG,IAAI,QAAQ,UAAU,6BAA6B;AAAA,EAC/D,EAAE,OAAO,GAAG,IAAI,QAAQ,UAAU,6BAA6B;AAAA,EAC/D,EAAE,OAAO,GAAG,IAAI,aAAa,UAAU,kCAAkC;AAC3E;AAGO,IAAM,6BAA6B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,uBAAuB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,+BAA+B;AAAA,EAC1C;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,yBAAyB;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,yBAAyB;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,yBAAyB;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,yBAAyB;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,yBAAyB;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,yBAAyB;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,yBAAyB;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,yBAAyB;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,yBAAyB;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,yBAAyB;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,yBAAyB;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,yBAAyB;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,yBAAyB;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,yBAAyB;AAAA,EAC3B;AACF;AAGO,IAAM,wCAAwC;AAAA,EACnD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,mCAAmC;AAAA,EAC9C;AACF;AAGO,IAAM,mCAAmC;AAAA,EAC9C;AACF;AAEA,WAAW,cAAc;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAG;AACD,SAAO,OAAO,UAAU;AAC1B;AACA,WAAW,SAAS;AAAA,EAClB,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL,GAAG;AACD,SAAO,OAAO,KAAK;AACrB;AA6NA,IAAM,kBAAkB;AACxB,IAAM,2BAA2B;AACjC,IAAMC,qBAAoB;AAC1B,IAAM,yBACJ;AACF,IAAM,sCACJ;AACF,IAAM,oCAAoC;AAC1C,IAAM,2BAA2B;AACjC,IAAM,iCAAiC;AACvC,IAAM,YAAY;AAClB,IAAMC,sBACJ;AACF,IAAM,0BACJ;AACF,IAAM,4BACJ;AACF,IAAM,gCACJ;AAEF,IAAM,gBAAgB;AAAA,EACpB,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,UAAU;AACZ;AAEA,IAAM,YAAY,MAChB,MACG,OAAO,EACP,UAAU,CAAC,UAAU,uBAAuB,KAAK,KAAK,CAAC,EACvD,YAAY,iDAAiD;AAElE,IAAM,eAAe,MACnB,MACG,OAAO,EACP,UAAU,CAAC,UAAU,uBAAuB,KAAK,KAAK,CAAC,EACvD,YAAY,wDAAwD,EACpE,IAAI;AAAA,EACH,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,SAAS;AACX,CAAC;AAEL,IAAM,cAAc,CAAC,UAAU,QAC7B,MAAM,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,QAAQ,eAAe;AAE5D,IAAM,sBAAsB,MAC1B,MACG,OAAO,EACP,IAAI,CAAC,EACL,IAAI,EAAE,EACN,QAAQ,wBAAwB;AAErC,IAAMC,4BAA2B,CAAC,UAA0C;AAC1E,MACE,CAACF,mBAAkB,KAAK,KAAK,KAC7B,MAAM,SAAS,MAAM,GACrB;AACA,WAAO;AAAA,EACT;AACA,QAAM,aAAaC,oBAAmB,QAAQ,MAAM,GAAG,EAAE,KAAK,EAAE;AAChE,MACE,aAAa,KACZ,MAAM,SAAS,MAAM,MAAM,aAAa,QAAY,KACpD,MAAM,SAAS,MAAM,MAAM,aAAa,OAAU,GACnD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,SAAmB,CAAC;AAC1B,MAAI,cAAc;AAClB,MAAI,WAAW;AACf,aAAW,aAAa,OAAO;AAC7B,UAAM,SAASA,oBAAmB,QAAQ,SAAS;AACnD,QAAI,SAAS,GAAG;AACd,aAAO;AAAA,IACT;AACA,kBAAe,eAAe,IAAK;AACnC,gBAAY;AACZ,WAAO,YAAY,GAAG;AACpB,kBAAY;AACZ,aAAO,KAAM,eAAe,WAAY,GAAI;AAC5C,sBAAgB,KAAK,YAAY;AAAA,IACnC;AAAA,EACF;AACA,SAAO,WAAW,KAAK,MAAM;AAC/B;AAEA,IAAM,wBAAwB,CAAC,UAA2B;AACxD,QAAM,QAAQC,0BAAyB,KAAK;AAC5C,SACE,UAAU,WACT,MAAM,WAAW,OAChB,MAAM,WAAW,OACjB,MAAM,WAAW,SAClB,MAAM,CAAC,KAAK,MAAM,SACjB,MAAM,GAAG,EAAE,KAAK,KAAK,OAAO;AAElC;AAEA,IAAM,yBAAyB,CAAC,UAA2B;AACzD,QAAM,QAAQA,0BAAyB,KAAK;AAC5C,MACE,UAAU,UACV,MAAM,SAAS,KACf,MAAM,SAAS,KACf,MAAM,CAAC,MAAM,GACb;AACA,WAAO;AAAA,EACT;AACA,QAAM,WAAW,MAAM;AAAA,IACrB,CAAC,OAAO,SAAS,QAAQ,MAAM;AAAA,IAC/B;AAAA,EACF;AACA,SAAO,YAAY,KAAK,WAAW,MAAM;AAC3C;AAEA,IAAM,iBAAiB,MACrB,MAAM,OAAO,EAAE,KAAK,oBAAoB;AAE1C,IAAM,aAAa,MACjB,MACG,OAAO,EACP,UAAU,CAAC,UAAU,OAAO,cAAc,KAAK,CAAC,EAChD,IAAI,CAAC,EACL,IAAI,SAAS;AAElB,IAAMC,sBAAqB,CAAC,UAAU,cACpC,MACG,OAAO,EACP,UAAU,CAAC,UAAU,OAAO,cAAc,KAAK,CAAC,EAChD,IAAI,CAAC,EACL,IAAI,OAAO;AAEhB,IAAM,sBAAsB,MAC1B,MACG,OAAO,EACP,UAAU,CAAC,UAAU,OAAO,cAAc,KAAK,CAAC,EAChD,IAAI,CAAC,EACL,IAAI,wBAAwB;AAEjC,IAAM,gBAAgB,MACpB,MACG,OAAO,EACP,UAAU,CAAC,UAAU,OAAO,cAAc,KAAK,CAAC,EAChD,IAAI,CAAC,EACL,IAAI,GAAS;AAElB,IAAM,cAAc,MAClB,MACG,OAAO,EACP,UAAU,CAAC,UAAU,OAAO,UAAU,KAAK,CAAC,EAC5C,IAAI,CAAC,EACL,IAAI,CAAC;AAEV,IAAM,qBAAqB,MACzB,MACG,OAAO,EACP;AAAA,EACC,CAAC,UACC,OAAO,UAAU,YACjB,MAAM,UAAU,KAChB,MAAM,UAAU,kCAChB,CAAC,8CAA8C,KAAK,KACpD,MAAM,UAAU,MAAM,MAAM,SAC5B,CAAC,GAAG,KAAK,EAAE,UAAU,4BACrB,CAAC,oCAAoC,KAAK,KAAK,KAC/C,CAAC,kCAAkC,KAAK,KAAK,KAC7C,CAAC,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,cAAc;AAC9B,UAAM,YAAY,UAAU,YAAY,CAAC;AACzC,WACE,cAAc,WACb,YAAY,MAAM,cAAc;AAAA,EAErC,CAAC;AACL,EACC,IAAI,CAAC,EACL,IAAI,8BAA8B,EAClC,IAAI;AAAA,EACH,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,SACE;AACJ,CAAC;AAEL,IAAM,8BAA8B,MAClC,MACG,OAAO,EACP,UAAU,CAAC,UAAU,uBAAuB,KAAK,KAAK,CAAC,EACvD,IAAI;AAAA,EACH,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,SAAS;AACX,CAAC;AAEL,IAAM,0BAA0B,CAC9B,SACA,SACA,mBAEA,MACG,OAAO,EACP,IAAI,OAAO,EACX,IAAI,OAAO,EACX,QAAQH,kBAAiB,EACzB;AAAA,EACC,CAAC,UAAU;AACT,UAAM,UAAUE,0BAAyB,KAAK;AAC9C,WACE,YAAY,UACZ,QAAQ,SAAS,MAChB,mBAAmB,UAClB,eAAe,SAAS,MAAM,MAAM;AAAA,EAE1C;AACF,EACC,IAAI;AAAA,EACH,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,SAAS;AACX,CAAC;AAEL,IAAM,oBAAoB,OAAO;AAAA,EAC/B,MAAM,MAAM,OAAO,EAAE,KAAK,CAAC,MAAM,CAAU;AAAA,EAC3C,MAAM,mBAAmB;AAAA,EACzB,OAAO,MACJ;AAAA,IACC,MAAM,OAAO,EAAE,KAAK,CAAC,QAAQ,UAAU,WAAW,CAAU;AAAA,EAC9D,EACC,IAAI,CAAC,EACL,SAAS;AACd;AAEA,IAAM,qBAAqB,OAAO;AAAA,EAChC,MAAM,MAAM,OAAO,EAAE,KAAK,CAAC,aAAa,UAAU,CAAU;AAAA,EAC5D,OAAO,MACJ,OAAO,EACP,UAAU,CAAC,UAAU,OAAO,UAAU,KAAK,CAAC,EAC5C,IAAI,CAAC,EACL,IAAI,CAAC;AAAA,EACR,UAAU,MAAM,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAU,EAAE,SAAS;AAAA,EAC5D,UAAU,MACP,MAAM,MAAM,OAAO,kBAAkB,CAAC,CAAC,EACvC,IAAI,CAAC,EACL,IAAI,GAAG;AACZ;AAEA,IAAME,uBAAsB,CAAmB,UAAa;AAAA,EAC1D,MAAM,MAAM,OAAO,EAAE,KAAK,CAAC,IAAI,CAAU;AAAA,EACzC,SAAS,MAAM,OAAO,EAAE,KAAK,CAAC,yBAAyB,CAAU;AACnE;AAEA,IAAM,gBAAgB,CAAC,kBAAkB,WAAW;AAAA,EAClD,GAAI,kBACAA,qBAAoB,uCAAuC,IAC3D,CAAC;AAAA,EACL,eAAe,MAAM,OAAO,EAAE,KAAK,CAAC,GAAG,CAAU;AAAA,EACjD,OAAO,oBAAoB;AAAA,EAC3B,WAAW,MACR,OAAO,EACP,KAAK,CAAC,sBAAsB,CAAU;AAAA,EACzC,YAAY,wBAAwB,KAAK,KAAK,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC7D,IAAI,wBAAwB,IAAI,IAAI,CAAC,EAAE,CAAC;AAAA,EACxC,YAAY,wBAAwB,GAAG,KAAM;AAAA,EAC7C,mBAAmB,wBAAwB,IAAI,IAAI,CAAC,EAAE,CAAC;AACzD;AAEA,IAAM,0BAA0B,CAAC,kBAAkB,WAAW;AAAA,EAC5D,GAAI,kBACAA,qBAAoB,2BAA2B,IAC/C,CAAC;AAAA,EACL,QAAQ,MAAM,OAAO,EAAE,KAAK,CAAC,YAAY,iBAAiB,CAAU;AAAA,EACpE,WAAW,MAAM,OAAO,EAAE,KAAK,0BAA0B,EAAE,SAAS;AAAA,EACpE,WAAW,MACR,MAAM,MAAM,OAAO,EAAE,KAAK,mBAAmB,CAAC,EAC9C,IAAI,CAAC;AAAA,EACR,UAAU,MACP,MAAM,MAAM,OAAO,EAAE,KAAK,kBAAkB,CAAC,EAC7C,IAAI,CAAC;AAAA,EACR,YAAY,MACT,OAAO,EACP,KAAK,CAAC,OAAO,UAAU,MAAM,CAAU,EACvC,SAAS;AAAA,EACZ,eAAe,MAAM,OAAO,EAAE,KAAK,gCAAgC;AAAA,EACnE,cAAc,MAAM,OAAO,EAAE,KAAK,gCAAgC;AAAA,EAClE,6BAA6B,oBAAoB;AAAA,EACjD,uBAAuB,oBAAoB;AAC7C;AAEA,IAAM,uBAAuB,OAAO;AAAA,EAClC,WAAW,4BAA4B;AAAA,EACvC,GAAG,wBAAwB;AAAA,EAC3B,YAAY,MAAM,YAAY;AAChC;AAEA,IAAM,iCAAiC,CACrC,UACY;AACZ,QAAM,SAAS,MAAM;AACrB,QAAM,YAAY,MAAM;AACxB,QAAM,WAAW,MAAM;AACvB,MAAI,CAAC,MAAM,QAAQ,SAAS,KAAK,CAAC,MAAM,QAAQ,QAAQ,GAAG;AACzD,WAAO;AAAA,EACT;AACA,MACE,IAAI,IAAI,SAAS,EAAE,SAAS,UAAU,UACtC,IAAI,IAAI,QAAQ,EAAE,SAAS,SAAS,QACpC;AACA,WAAO;AAAA,EACT;AACA,MAAI,WAAW,mBAAmB;AAChC,WACE,MAAM,cAAc,UACpB,MAAM,eAAe,UACrB,UAAU,WAAW,KACrB,SAAS,WAAW;AAAA,EAExB;AACA,SACE,WAAW,cACX,MAAM,cAAc,UACpB,MAAM,eAAe;AAEzB;AAEA,IAAM,sBAAsB,OAAO;AAAA,EACjC,WAAW,eAAe,EAAE,SAAS;AAAA,EACrC,WAAW,MAAM,OAAO,EAAE,KAAK,oBAAoB,EAAE,SAAS;AAAA,EAC9D,UAAU,YAAY,EAAE,SAAS;AAAA,EACjC,cAAc,YAAY,EAAE,SAAS;AAAA,EACrC,mBAAmB,4BAA4B,EAAE,SAAS;AAC5D;AAEA,IAAM,oBAAoB,OAAO;AAAA,EAC/B,IAAI,eAAe;AAAA,EACnB,UAAU,YAAY,GAAG;AAAA,EACzB,MAAM,MACH,OAAO,EACP,KAAK,CAAC,UAAU,iBAAiB,SAAS,MAAM,CAAU;AAAA,EAC7D,yBAAyB,MAAM,QAAQ;AACzC;AAEA,IAAM,wBAAwB,CAAC,aAA+B;AAC5D,MAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,QAAM,aAAa,SAAS;AAAA,IAC1B,CAAC,YAA8B,QAAQ;AAAA,EACzC;AACA,SACE,IAAI,IAAI,UAAU,EAAE,SAAS,WAAW,UACxC,SAAS;AAAA,IACP,CAAC,YAKK;AACJ,YAAM,aAAa,6BAA6B;AAAA,QAC9C,CAAC,EAAE,GAAG,MAAM,OAAO,QAAQ;AAAA,MAC7B;AACA,aACE,eAAe,UACf,QAAQ,aAAa,WAAW,YAChC,QAAQ,SAAS,WAAW,QAC5B,QAAQ,4BACN,WAAW;AAAA,IAEjB;AAAA,EACF;AAEJ;AAEA,IAAM,yBAAyB,CAAC,UAA4C;AAC1E,QAAM,gBACJ,MAAM,cAAc,UACpB,MAAM,cAAc,UACpB,MAAM,aAAa,UACnB,MAAM,iBAAiB,UACvB,MAAM,sBAAsB,UAC5B,MAAM,aAAa;AACrB,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AACA,MAAI,MAAM,SAAS,OAAO;AACxB,WAAO,MAAM,iBAAiB;AAAA,EAChC;AACA,MAAI,MAAM,SAAS,UAAU;AAC3B,WACE,MAAM,cAAc,UACpB,MAAM,cAAc,UACpB,MAAM,aAAa;AAAA,EAEvB;AACA,SAAO;AACT;AAEA,IAAM,sBAAsB,CAAC,UAAwC;AACnE,MAAI,CAAC,sBAAsB,MAAM,QAAQ,GAAG;AAC1C,WAAO;AAAA,EACT;AACA,MACE,MAAM,sBAAsB,UAC5B,CAAC,MAAM,SAAS;AAAA,IACd,CAAC,YAA8B,QAAQ,OAAO,MAAM;AAAA,EACtD,GACA;AACA,WAAO;AAAA,EACT;AACA,QAAM,sBAAsB,MAAM,SAAS,SAAS;AACpD,QAAM,wBAAwB,MAAM,SAAS;AAAA,IAC3C,CAAC,YACC,QAAQ,4BAA4B;AAAA,EACxC;AACA,MACG,MAAM,YAAY,aAAa,CAAC,uBAChC,MAAM,YAAY,oBAChB,CAAC,MAAM,YAAY,aAAa,CAAC,wBACpC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,KAAK,MAAM,OAAO,MAAM,WAAW,CAAC;AACxD,MAAI,CAAC,OAAO,SAAS,WAAW,GAAG;AACjC,WAAO;AAAA,EACT;AACA,QAAM,mCAAmC,CACvC,WACA,mBACY;AACZ,QAAI,cAAc,QAAW;AAC3B,aAAO;AAAA,IACT;AACA,UAAM,cAAc,KAAK,MAAM,OAAO,SAAS,CAAC;AAChD,WACE,OAAO,SAAS,WAAW,KAC3B,cAAc,eACd,cAAc,eAAe,iBAAiB;AAAA,EAElD;AACA,QAAM,4BACJ,8BACE,8BAA8B,SAAS,CACzC,KAAK;AACP,MACE,CAAC;AAAA,IACC,MAAM,YAAY;AAAA,IAClB;AAAA,EACF,KACA,CAAC;AAAA,IACC,MAAM,YAAY;AAAA,IAClB;AAAA,EACF,GACA;AACA,WAAO;AAAA,EACT;AACA,QAAM,iBACJ,MAAM,YAAY,mBAAmB,SACjC,SACA,KAAK,MAAM,OAAO,MAAM,YAAY,cAAc,CAAC;AACzD,QAAM,uBACJ,MAAM,YAAY;AACpB,QAAM,0BACH,mBAAmB,UAClB,yBAAyB,UAC1B,mBAAmB,UAClB,OAAO,yBAAyB,YAChC,yBACE,KAAK,MAAM,iBAAiB,eAAe,GAAK;AACtD,MACE,CAAC,2BACA,MAAM,YAAY,cAChB,MAAM,YAAY,mBAAmB,UACpC,MAAM,YAAY,yBAAyB,WAC9C,MAAM,YAAY,UACjB,MAAM,YAAY,sBAAsB,UACzC,MAAM,YAAY,aAAa,CAAC,MAAM,MAAM,aAC5C,MAAM,YAAY,UAAU,CAAC,MAAM,MAAM,UACzC,MAAM,YAAY,mBAAmB,CAAC,MAAM,MAAM,iBACnD;AACA,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,MAAM,mBAAmB;AAClC,WAAO,MAAM,iBAAiB;AAAA,EAChC;AACA,MAAI,MAAM,iBAAiB,QAAW;AACpC,WAAO;AAAA,EACT;AACA,QAAM,YAAY,KAAK,MAAM,OAAO,MAAM,aAAa,SAAS,CAAC;AACjE,SACE,OAAO,SAAS,SAAS,KACzB,YAAY,eACZ,YAAY,eAAe,KAAK,KAAK;AAEzC;AAEA,IAAM,oBAAoB,CACxB,UAAgD,MAAM,YAAY,GAAG,OACjE;AAAA,EACJ,IAAI,QAAQ;AAAA,EACZ,OAAO,WAAW;AACpB;AAEA,IAAM,eAAe,CAAC,WACpB,MAAM,QAAQ,MAAM,KACpB,IAAI;AAAA,EACF,OAAO;AAAA,IAAI,CAAC,UACV,OAAO,UAAU,YAAY,UAAU,OAClC,MAA2B,KAC5B;AAAA,EACN;AACF,EAAE,SAAS,OAAO;AAEpB,IAAM,oBAAoB,CAAC,WACzB,MAAM,QAAQ,MAAM,IAChB,OAAO;AAAA,EACL,CAAC,OAAO,UACN,SACC,OAAO,UAAU,YAClB,UAAU,QACV,OAAQ,MAA8B,UAAU,WAC3C,MAA4B,QAC7B;AAAA,EACN;AACF,IACA;AAEN,IAAM,2BAA2B,CAC/B,QACA,YAEA,MAAM,QAAQ,MAAM,KACpB,OAAO;AAAA,EACL,CAAC,UACC,OAAO,UAAU,YACjB,UAAU,QACV,OAAQ,MAA8B,UAAU,YAC/C,MAA4B,SAAS;AAC1C;AAEF,IAAM,gBAAgB,OAAO;AAAA,EAC3B,MAAM,MACH,OAAO,EACP;AAAA,IACC;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACF,OAAO,MAAM,OAAO,EAAE,KAAK,CAAC,YAAY,UAAU,CAAU;AAAA,EAC5D,cAAcD,oBAAmB;AAAA,EACjC,mBAAmB,MAChB;AAAA,IACC,MACG,OAAO,EACP;AAAA,MACC;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACJ,EACC,IAAI,CAAC,EACL,IAAI,CAAC;AACV;AAEA,IAAM,gBAAgB,CACpB,OACA,yBACY;AACZ,QAAM,QAAQ,KAAK,MAAM,OAAO,MAAM,WAAW,CAAC;AAClD,QAAM,MAAM,KAAK,MAAM,OAAO,MAAM,SAAS,CAAC;AAC9C,QAAM,cAAc,KAAK,MAAM,OAAO,MAAM,WAAW,CAAC;AACxD,SACE,OAAO,SAAS,KAAK,KACrB,OAAO,SAAS,GAAG,KACnB,OAAO,SAAS,WAAW,KAC3B,IAAI,KAAK,KAAK,EAAE,YAAY,MAAM,MAAM,eACxC,IAAI,KAAK,GAAG,EAAE,YAAY,MAAM,MAAM,aACtC,QAAQ,yBAAyB,KACjC,MAAM,UAAU,wBAChB,eAAe;AAEnB;AAOA,IAAM,kBAAkB,CACtB,WACA,cACoD;AACpD,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,cAAc,cAAc;AAC9B,QAAI,CAAC,wBAAwB,KAAK,SAAS,GAAG;AAC5C,aAAO;AAAA,IACT;AACA,UAAM,GAAG,SAAS;AAClB,qBAAiB;AACjB,eAAW,KAAK,KAAK;AAAA,EACvB,WAAW,cAAc,gBAAgB;AACvC,QAAI,CAAC,0BAA0B,KAAK,SAAS,GAAG;AAC9C,aAAO;AAAA,IACT;AACA,UAAM,GAAG,SAAS;AAClB,qBAAiB;AACjB,eAAW,KAAK,KAAK,KAAK;AAAA,EAC5B,OAAO;AACL,QAAI,CAAC,8BAA8B,KAAK,SAAS,GAAG;AAClD,aAAO;AAAA,IACT;AACA,UAAM,SAAS,OAAO,UAAU,MAAM,EAAE,CAAC;AACzC,QAAI,SAAS,MAAM,GAAG;AACpB,aAAO;AAAA,IACT;AACA,UAAM,GAAG,SAAS;AAClB,qBAAiB;AACjB,eAAW,IAAI,KAAK;AAAA,EACtB;AACA,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,MACE,CAAC,OAAO,SAAS,KAAK,KACtB,IAAI,KAAK,KAAK,EAAE,YAAY,EAAE,MAAM,GAAG,cAAc,MAAM,WAC3D;AACA,WAAO;AAAA,EACT;AACA,SAAO,EAAE,OAAO,SAAS;AAC3B;AAEA,IAAM,gCAAgC,CACpC,OACA,aACY;AACZ,QAAM,YAAY,MAAM;AACxB,QAAM,YAAY,OAAO,MAAM,SAAS;AACxC,QAAM,SAAS,gBAAgB,WAAW,SAAS;AACnD,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,EACT;AACA,QAAM,cAAc,KAAK;AAAA,IACvB;AAAA,MACE,aAAa,eAAe,MAAM,cAAc,MAAM;AAAA,IACxD;AAAA,EACF;AACA,MACE,CAAC,OAAO,SAAS,WAAW,KAC5B,cAAc,OAAO,QAAQ,OAAO,UACpC;AACA,WAAO;AAAA,EACT;AACA,MACE,aAAa,gBACb,MAAM,iBACJ,cAAc,SAAS,IAAI,SAAS,IACtC;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,IAAM,YAAY,CAAC,UACjB,KAAK,OAAO,QAAQ,OAAO,WAAW,GAAS,IAAI;AAErD,IAAM,cAAc,CAAC,QAAiB,aACpC,OAAO,WAAW,YAAY,WAAW,UAAU,QAAQ;AAE7D,IAAM,uBAAuB,CAAC,QAAiB,OAAuB;AACpE,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,OAAO;AAAA,IACnB,CAAC,UACC,OAAO,UAAU,YACjB,UAAU,QACT,MAA2B,OAAO;AAAA,EACvC;AACA,SAAO,OAAO,UAAU,YACtB,UAAU,QACV,OAAQ,MAA8B,UAAU,WAC7C,MAA4B,QAC7B;AACN;AAmBA,IAAM,6BAA6B,CACjC,YACA,aAGY;AACZ,MAAI,CAAC,MAAM,QAAQ,UAAU,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,QAAM,gBAAgB,OAAO,QAAQ,QAAQ,EAC1C;AAAA,IAAO,CAAC,UACP,MAAM,CAAC,MAAM;AAAA,EACf,EACC,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI;AACvB,QAAM,QAAQ,WAAW;AAAA,IACvB,CAAC,aACE,UAAwC;AAAA,EAC7C;AACA,SACE,IAAI,IAAI,KAAK,EAAE,SAAS,MAAM,UAC9B,MAAM;AAAA,IACJ,CAAC,SACC,OAAO,SAAS,YAChB,cAAc,SAAS,IAAI;AAAA,EAC/B,KACA,MAAM,WAAW,cAAc,UAC/B,cAAc,MAAM,CAAC,SAAS,MAAM,SAAS,IAAI,CAAC,KAClD,WAAW,MAAM,CAAC,aAAa;AAC7B,UAAM,QAAQ;AAMd,UAAM,OACJ,OAAO,MAAM,SAAS,WACjB,MAAM,OACP;AACN,UAAM,cAAc,SAAS,SAAY,SAAY,SAAS,IAAI;AAClE,QACE,gBAAgB,UAChB,MAAM,UAAU,YAAY,SAC5B,MAAM,iBAAiB,YAAY,gBACnC,CAAC,MAAM,QAAQ,MAAM,iBAAiB,KACtC,MAAM,kBAAkB,WACtB,YAAY,kBAAkB,QAChC;AACA,aAAO;AAAA,IACT;AACA,WAAO,MAAM,kBAAkB;AAAA,MAC7B,CAAC,gBAAgB,UACf,mBAAmB,YAAY,kBAAkB,KAAK;AAAA,IAC1D;AAAA,EACF,CAAC;AAEL;AAGO,IAAM,4BAA4B;AAAA,EACvC;AAAA,IACE,eAAe,MAAM,OAAO,EAAE,KAAK,CAAC,GAAG,CAAU;AAAA,IACjD,UAAU,MACP,MAAM,MAAM,OAAO,mBAAmB,CAAC,CAAC,EACxC,IAAI,CAAC,EACL,IAAI,GAAG;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,IACE,GAAG;AAAA,IACH,iBAAiB,CAAC,UAAU;AAC1B,YAAM,SAAS,MAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,WAAW,CAAC;AACjE,YAAM,sBAAsB,OAAO;AAAA,QACjC,CAAC,UAIK;AACJ,gBAAM,mBACH,MAAM,SAAS,eAAe,MAAM,aAAa,UACjD,MAAM,SAAS,cAAc,MAAM,aAAa;AACnD,gBAAM,iBACJ,MAAM,QAAQ,MAAM,QAAQ,KAC5B,MAAM,SAAS;AAAA,YACb,CAAC,UACC,MAAM,UAAU,UACf,MAAM,QAAQ,MAAM,KAAK,KACxB,IAAI,IAAI,MAAM,KAAK,EAAE,SAAS,MAAM,MAAM;AAAA,UAChD;AACF,iBAAO,oBAAoB;AAAA,QAC7B;AAAA,MACF;AACA,YAAM,iBAAiB,OAAO;AAAA,QAC5B,CAAC,YAAoB,UACnB,cACC,MAAM,QAAQ,MAAM,QAAQ,IACzB,MAAM,SAAS;AAAA,UACb,CAAC,WAAmB,SAClB,aACC,OAAO,KAAK,SAAS,WAClB,CAAC,GAAG,KAAK,IAAI,EAAE,SACf;AAAA,UACN;AAAA,QACF,IACA;AAAA,QACN;AAAA,MACF;AACA,YAAM,0BACJ,iBAAiB,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC;AAChD,YAAM,YAAY,OAAO;AAAA,QACvB,CAAC,OAAe,UACd,SAAS,MAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,SAAS,SAAS;AAAA,QACnE;AAAA,MACF;AACA,aACE,MAAM,SAAS,SACf,MAAM,kBAAkB,OACxB,uBACA,aAAa,OACb,0BAA0B,KAC1B,2BAA2B;AAAA,IAE/B;AAAA,EACF;AACF;AAGO,IAAM,2CAA2C;AAAA,EACtD,cAAc;AAAA,EACd;AAAA,EACA;AACF;AAGO,IAAM,yCAAyC;AAAA,EACpD;AAAA,IACE,eAAe,MAAM,OAAO,EAAE,KAAK,CAAC,GAAG,CAAU;AAAA,IACjD,WAAW,4BAA4B;AAAA,IACvC,SAAS,MAAM,OAAO,EAAE,KAAK,CAAC,OAAO,QAAQ,CAAU;AAAA,IACvD,WAAW,eAAe,EAAE,SAAS;AAAA,IACrC,6BAA6B,oBAAoB;AAAA,IACjD,UAAU,MAAM,OAAO,cAAc,IAAI,CAAC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,IACE,GAAG;AAAA,IACH,iBAAiB,CAAC,OAAO,YAAY;AACnC,YAAM,qBACJ,SAAS,YAAY,WAAW,KAChC,OAAO,UAAU,eAAe,KAAK,OAAO,WAAW;AACzD,aACG,MAAM,YAAY,SAAS,MAAM,cAAc,UAC/C,MAAM,YAAY,YAAY,CAAC;AAAA,IAEpC;AAAA,EACF;AACF;AAMO,IAAM,2CAA2C,CACtD,UACqD;AACrD,QAAM,SAAS,uCAAuC,SAAS,KAAK;AACpE,MAAI,CAAC,OAAO,SAAS,OAAO,UAAU,QAAW;AAC/C,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ,OAAO,UAAU,CAAC,uCAAuC;AAAA,MACjE,GAAI,OAAO,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,OAAO,OAAO;AAAA,IACjE;AAAA,EACF;AACA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,OAAO,OAAO;AAAA,EAChB;AACF;AAGO,IAAM,gCAAgC;AAAA,EAC3C,qBAAqB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,GAAG;AAAA,IACH,iBAAiB,CAAC,UAChB,MAAM,WAAW,cACjB,+BAA+B,KAAK;AAAA,EACxC;AACF;AAOO,IAAM,gCAAgC;AAAA,EAC3C,wBAAwB;AAAA,EACxB;AAAA,EACA;AAAA,IACE,GAAG;AAAA,IACH,iBAAiB;AAAA,EACnB;AACF;AAGO,IAAM,+BAA+B;AAAA,EAC1C;AAAA,IACE,aAAa,MAAM,YAAY;AAAA,IAC/B,gBAAgB,YAAY,EAAE;AAAA,IAC9B,UAAU,MACP,MAAM,MAAM,OAAO,kBAAkB,CAAC,CAAC,EACvC,IAAI,GAAG;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,IACE,GAAG;AAAA,IACH,iBAAiB,CAAC,UAAU,sBAAsB,MAAM,QAAQ;AAAA,EAClE;AACF;AAGO,IAAM,wBAAwB;AAAA,EACnC;AAAA,IACE,aAAa,MAAM,YAAY;AAAA,IAC/B,gBAAgB,YAAY,EAAE;AAAA,IAC9B,UAAU,MACP,MAAM,MAAM,OAAO,kBAAkB,CAAC,CAAC,EACvC,IAAI,GAAG;AAAA,IACV,mBAAmB,eAAe,EAAE,SAAS;AAAA,IAC7C,OAAO,MAAM,OAAO;AAAA,MAClB,WAAW,MAAM,QAAQ;AAAA,MACzB,QAAQ,MAAM,QAAQ;AAAA,MACtB,mBAAmB,MAAM,QAAQ;AAAA,MACjC,WAAW,MAAM,QAAQ;AAAA,MACzB,OAAO,MAAM,QAAQ;AAAA,MACrB,KAAK,MAAM,QAAQ;AAAA,MACnB,eAAe,MAAM,QAAQ;AAAA,MAC7B,iBAAiB,MAAM,QAAQ;AAAA,MAC/B,WAAW,MAAM,QAAQ;AAAA,IAC3B,CAAC;AAAA,IACD,aAAa,MAAM,OAAO;AAAA,MACxB,WAAW,MAAM,QAAQ;AAAA,MACzB,QAAQ,MAAM,QAAQ;AAAA,MACtB,iBAAiB,MAAM,QAAQ;AAAA,MAC/B,gBAAgB,MAAM,YAAY,EAAE,SAAS;AAAA,MAC7C,mBAAmB,MAAM,YAAY,EAAE,SAAS;AAAA,MAChD,sBAAsBA,oBAAmB,EAAE,SAAS;AAAA,IACtD,CAAC;AAAA,IACD,cAAc,MACX,OAAO;AAAA,MACN,OAAO,oBAAoB;AAAA,MAC3B,WAAW,MAAM,OAAO,EAAE,KAAK,CAAC,cAAc,CAAU;AAAA,MACxD,WAAW,MAAM,OAAO;AAAA,QACtB,KAAK,MAAM,OAAO,EAAE,KAAK,CAAC,KAAK,CAAU;AAAA,QACzC,KAAK,MAAM,OAAO,EAAE,KAAK,CAAC,cAAc,CAAU;AAAA,QAClD,KAAK,MAAM,OAAO,EAAE,KAAK,CAAC,KAAK,CAAU;AAAA,QACzC,SAAS,MACN,MAAM,MAAM,OAAO,EAAE,KAAK,CAAC,SAAS,CAAU,CAAC,EAC/C,IAAI,CAAC,EACL,IAAI,CAAC;AAAA,QACR,GAAG,MACA,OAAO,EACP,IAAI,GAAG,EACP,IAAI,GAAG,EACP,QAAQH,kBAAiB,EACzB,UAAU,qBAAqB;AAAA,QAClC,GAAG,MACA,OAAO,EACP,IAAI,CAAC,EACL,IAAI,CAAC,EACL,QAAQA,kBAAiB,EACzB,UAAU,sBAAsB;AAAA,QACnC,KAAK,MAAM,QAAQ,EAAE,UAAU,CAAC,UAAU,UAAU,IAAI;AAAA,MAC1D,CAAC;AAAA,MACD,WAAW,MAAM,YAAY;AAAA,IAC/B,CAAC,EACA,SAAS;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,IACE,GAAG;AAAA,IACH,iBAAiB;AAAA,EACnB;AACF;AAGO,IAAM,mCAAmC;AAAA,EAC9C;AAAA,IACE,SAAS,aAAa;AAAA,IACtB,MAAM,MAAM,OAAO,EAAE,KAAK,CAAC,OAAO,QAAQ,CAAU;AAAA,IACpD,UAAU,cAAc;AAAA,IACxB,GAAG,oBAAoB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,IACE,GAAG;AAAA,IACH,iBAAiB;AAAA,EACnB;AACF;AAGO,IAAM,4BAA4B;AAAA,EACvC;AAAA,IACE,SAAS,aAAa;AAAA,IACtB,MAAM,MAAM,OAAO,EAAE,KAAK,CAAC,OAAO,QAAQ,CAAU;AAAA,IACpD,UAAU,cAAc;AAAA,IACxB,WAAW,eAAe,EAAE,SAAS;AAAA,IACrC,WAAW,MAAM,OAAO,EAAE,KAAK,oBAAoB,EAAE,SAAS;AAAA,IAC9D,UAAU,YAAY,EAAE,SAAS;AAAA,IACjC,cAAc,YAAY,EAAE,SAAS;AAAA,IACrC,UAAU,MAAM,OAAO,wBAAwB,IAAI,CAAC,EAAE,SAAS;AAAA,IAC/D,iBAAiB,MAAM,YAAY;AAAA,IACnC,WAAW,MAAM,YAAY;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,IACE,GAAG;AAAA,IACH,iBAAiB,CAAC,UAAU;AAC1B,UAAI,CAAC,uBAAuB,KAAK,GAAG;AAClC,eAAO;AAAA,MACT;AACA,UACE,MAAM,aAAa,UACnB,CAAC,+BAA+B,MAAM,QAAQ,GAC9C;AACA,eAAO;AAAA,MACT;AACA,YAAM,YAAY,KAAK,MAAM,OAAO,MAAM,eAAe,CAAC;AAC1D,YAAM,YAAY,KAAK,MAAM,OAAO,MAAM,SAAS,CAAC;AACpD,aACE,OAAO,SAAS,SAAS,KACzB,OAAO,SAAS,SAAS,KACzB,YAAY,aACZ,YAAY,aAAa,KAAK,KAAK,KAAK;AAAA,IAE5C;AAAA,EACF;AACF;AAGO,IAAM,6BAA6B;AAAA,EACxC;AAAA,IACE,SAAS,aAAa;AAAA,IACtB,UAAU,cAAc;AAAA,IACxB,SAAS,MAAM,YAAY;AAAA,IAC3B,WAAW,MAAM,YAAY;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,IACE,GAAG;AAAA,IACH,iBAAiB,CAAC,UAAU;AAC1B,YAAM,UAAU,KAAK,MAAM,OAAO,MAAM,OAAO,CAAC;AAChD,YAAM,YAAY,KAAK,MAAM,OAAO,MAAM,SAAS,CAAC;AACpD,aACE,OAAO,SAAS,OAAO,KACvB,OAAO,SAAS,SAAS,KACzB,YAAY,WACZ,YAAY,WAAW,KAAK,KAAK,KAAK;AAAA,IAE1C;AAAA,EACF;AACF;AAMO,IAAM,qCAAqC;AAAA,EAChD;AAAA,IACE,SAAS,aAAa,EAAE,SAAS;AAAA,IACjC,WAAW,eAAe;AAAA,IAC1B,WAAW,MAAM,OAAO,EAAE,KAAK,oBAAoB;AAAA,IACnD,UAAU,YAAY;AAAA,IACtB,mBAAmB,4BAA4B,EAAE,SAAS;AAAA,IAC1D,iBAAiB,MAAM,OAAO,6BAAqB,IAAI,CAAC,EAAE,SAAS;AAAA,EACrE;AAAA,EACA;AAAA,EACA;AAAA,IACE,GAAG;AAAA,IACH,iBAAiB,CAAC,UAChB,MAAM,cAAc,uBACnB,MAAM,oBAAoB,UACxB,oCAA4B,MAAM,eAAe,KAChD,MAAM,gBAAgB,cAAc,MAAM;AAAA,EAClD;AACF;AAMO,IAAM,wCAAwC;AAAA,EACnD;AAAA,IACE,SAAS,aAAa,EAAE,SAAS;AAAA,IACjC,cAAc,YAAY;AAAA,IAC1B,mBAAmB,4BAA4B,EAAE,SAAS;AAAA,EAC5D;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,kCAAkC;AAAA,EAC7C;AAAA,IACE,UAAU,UAAU;AAAA,IACpB,MAAM,MAAM,OAAO,EAAE,KAAK,CAAC,OAAO,QAAQ,CAAU;AAAA,IACpD,YAAY,MAAM,YAAY;AAAA,IAC9B,gBAAgB,MAAM,YAAY;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,IACE,GAAG;AAAA,IACH,iBAAiB,CAAC,UAAU;AAC1B,YAAM,aAAa,KAAK,MAAM,OAAO,MAAM,UAAU,CAAC;AACtD,YAAM,iBAAiB,KAAK,MAAM,OAAO,MAAM,cAAc,CAAC;AAC9D,YAAM,uBAAuB,iBAAiB;AAC9C,UACE,CAAC,OAAO,SAAS,UAAU,KAC3B,CAAC,OAAO,SAAS,cAAc,KAC/B,wBAAwB,KACxB,uBAAuB,QAAU,GACjC;AACA,eAAO;AAAA,MACT;AACA,YAAM,kBAAkB,uBAAuB;AAC/C,aAAO,MAAM,SAAS,WAClB,oBAAoB,mCACnB,8BAAoD;AAAA,QACnD;AAAA,MACF;AAAA,IACN;AAAA,EACF;AACF;AAGO,IAAM,6CAA6C;AAAA,EACxD;AAAA,IACE,QAAQ,MAAM,OAAO,EAAE,KAAK,CAAC,0BAA0B,CAAU;AAAA,IACjE,YAAY,MAAM,OAAO,EAAE,KAAK,qCAAqC;AAAA,EACvE;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,0BAA0B;AAAA,EACrC;AAAA,IACE,UAAU,UAAU;AAAA,IACpB,YAAY,MAAM,YAAY;AAAA,IAC9B,WAAW,eAAe;AAAA,IAC1B,WAAW,MAAM,OAAO,EAAE,KAAK,gCAAgC;AAAA,IAC/D,UAAU,YAAY;AAAA,IACtB,WAAW,YAAY,GAAG;AAAA,IAC1B,SAAS,YAAY,GAAG;AAAA,IACxB,UAAU,MAAM,OAAO,wBAAwB,IAAI,CAAC,EAAE,SAAS;AAAA,IAC/D,iBAAiB,MAAM,OAAO,6BAAqB,IAAI,CAAC,EAAE,SAAS;AAAA,EACrE;AAAA,EACA;AAAA,EACA;AAAA,IACE,GAAG;AAAA,IACH,iBAAiB,CAAC,WACf,MAAM,aAAa,UAClB,+BAA+B,MAAM,QAAQ,OAC9C,MAAM,oBAAoB,UACxB,oCAA4B,MAAM,eAAe,KAChD,MAAM,gBAAgB,cAAc,MAAM;AAAA,EAClD;AACF;AAGO,IAAM,6BAA6B;AAAA,EACxC;AAAA,IACE,UAAU,UAAU;AAAA,IACpB,YAAY,MAAM,YAAY;AAAA,IAC9B,cAAc,YAAY;AAAA,IAC1B,UAAU,MAAM,OAAO,wBAAwB,IAAI,CAAC,EAAE,SAAS;AAAA,EACjE;AAAA,EACA;AAAA,EACA;AAAA,IACE,GAAG;AAAA,IACH,iBAAiB,CAAC,UAChB,MAAM,aAAa,UACnB,+BAA+B,MAAM,QAAQ;AAAA,EACjD;AACF;AAGO,IAAM,2CAA2C;AAAA,EACtD;AAAA,IACE,kBAAkB,UAAU;AAAA,IAC5B,aAAa,UAAU;AAAA,IACvB,WAAW,MAAM,YAAY;AAAA,IAC7B,WAAW,MAAM,YAAY;AAAA,IAC7B,mBAAmB,YAAY,GAAG;AAAA,IAClC,WAAW,YAAY,GAAG;AAAA,IAC1B,aAAa,MAAM,OAAO,6BAAqB,IAAI,CAAC;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,IACE,GAAG;AAAA,IACH,iBAAiB,CAAC,UAAU;AAC1B,YAAM,YAAY,KAAK,MAAM,OAAO,MAAM,SAAS,CAAC;AACpD,YAAM,YAAY,KAAK,MAAM,OAAO,MAAM,SAAS,CAAC;AACpD,aACE,oCAA4B,MAAM,WAAW,KAC7C,OAAO,SAAS,SAAS,KACzB,OAAO,SAAS,SAAS,KACzB,YAAY,aACZ,YAAY,aAAa,KAAK,KAAK,KAAK,KAAK;AAAA,IAEjD;AAAA,EACF;AACF;AAGO,IAAM,gCAAgC;AAAA,EAC3C;AAAA,IACE,UAAU,UAAU;AAAA,IACpB,aAAa,MAAM,YAAY;AAAA,IAC/B,WAAW,MAAM,YAAY;AAAA,IAC7B,UAAU,cAAc;AAAA,IACxB,aAAa,MAAM,YAAY;AAAA,IAC/B,eAAe,WAAW;AAAA,IAC1B,eAAe,WAAW;AAAA,IAC1B,0BAA0B,WAAW;AAAA,IACrC,6BAA6B,WAAW;AAAA,IACxC,uBAAuB,WAAW;AAAA,IAClC,qBAAqB,WAAW;AAAA,IAChC,OAAO,MAAM,OAAO;AAAA,MAClB,eAAe,MAAM,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,MAC1C,oCAAoC,MAAM,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAK;AAAA,MACnE,8BAA8B,MAAM,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAK;AAAA,IAC/D,CAAC;AAAA,IACD,SAAS,MAAM,OAAO;AAAA,MACpB,aAAa,WAAW;AAAA,MACxB,wBAAwB,MACrB,OAAO,EACP,IAAI,CAAC,EACL,IAAI,SAAS,EACb,SAAS;AAAA,IACd,CAAC;AAAA,IACD,oBAAoB,MACjB,MAAM,MAAM,OAAO,kBAAkB,cAAc,CAAC,CAAC,EACrD,IAAI,GAAG;AAAA,IACV,uBAAuB,MACpB;AAAA,MACC,MAAM;AAAA,QACJ;AAAA,UAAkB,MAChB,MAAM,OAAO,EAAE,KAAK,gCAAgC;AAAA,QACtD;AAAA,MACF;AAAA,IACF,EACC,IAAI,qBAAqB,MAAM;AAAA,IAClC,sBAAsB,MACnB;AAAA,MACC,MAAM;AAAA,QACJ;AAAA,UAAkB,MAChB,MAAM,OAAO,EAAE,KAAK,CAAC,KAAK,KAAK,KAAK,KAAK,GAAG,CAAU;AAAA,QACxD;AAAA,MACF;AAAA,IACF,EACC,IAAI,CAAC;AAAA,IACR,oBAAoB,MACjB;AAAA,MACC,MAAM;AAAA,QACJ;AAAA,UAAkB,MAChB,MAAM,OAAO,EAAE,KAAK,mBAAmB;AAAA,QACzC;AAAA,MACF;AAAA,IACF,EACC,IAAI,oBAAoB,MAAM;AAAA,IACjC,mBAAmB,MAChB,MAAM,MAAM,OAAO,kBAAkB,CAAC,CAAC,EACvC,IAAI,GAAG;AAAA,IACV,sBAAsB,MACnB;AAAA,MACC,MAAM;AAAA,QACJ;AAAA,UAAkB,MAChB,MAAM,OAAO,EAAE,KAAK,yBAAyB;AAAA,QAC/C;AAAA,MACF;AAAA,IACF,EACC,IAAI,0BAA0B,MAAM;AAAA,IACvC,qBAAqB,MAClB;AAAA,MACC,MAAM;AAAA,QACJ;AAAA,UAAkB,MAChB,MAAM,OAAO,EAAE,KAAK,wBAAwB;AAAA,QAC9C;AAAA,MACF;AAAA,IACF,EACC,IAAI,yBAAyB,MAAM;AAAA,IACtC,sBAAsB,MACnB;AAAA,MACC,MAAM;AAAA,QACJ;AAAA,UAAkB,MAChB,MAAM,OAAO,EAAE,KAAK,yBAAyB;AAAA,QAC/C;AAAA,MACF;AAAA,IACF,EACC,IAAI,0BAA0B,MAAM;AAAA,IACvC,uBAAuB,MACpB;AAAA,MACC,MAAM;AAAA,QACJ;AAAA,UAAkB,MAChB,MAAM,OAAO,EAAE,KAAK,2BAA2B;AAAA,QACjD;AAAA,MACF;AAAA,IACF,EACC,IAAI,4BAA4B,MAAM;AAAA,IACzC,uBAAuB,MACpB;AAAA,MACC,MAAM;AAAA,QACJ;AAAA,UAAkB,MAChB,MAAM,OAAO,EAAE,KAAK,2BAA2B;AAAA,QACjD;AAAA,MACF;AAAA,IACF,EACC,IAAI,4BAA4B,MAAM;AAAA,IACzC,+BAA+B,MAC5B;AAAA,MACC,MAAM;AAAA,QACJ;AAAA,UAAkB,MAChB,MAAM,OAAO,EAAE,KAAK,yBAAyB;AAAA,QAC/C;AAAA,MACF;AAAA,IACF,EACC,IAAI,0BAA0B,MAAM;AAAA,IACvC,+BAA+B,MAC5B;AAAA,MACC,MAAM;AAAA,QACJ;AAAA,UAAkB,MAChB,MAAM,OAAO,EAAE,KAAK,2BAA2B;AAAA,QACjD;AAAA,MACF;AAAA,IACF,EACC,IAAI,4BAA4B,MAAM;AAAA,IACzC,6BAA6B,MAC1B;AAAA,MACC,MAAM;AAAA,QACJ;AAAA,UAAkB,MAChB,MAAM,OAAO,EAAE,KAAK,yBAAyB;AAAA,QAC/C;AAAA,MACF;AAAA,IACF,EACC,IAAI,0BAA0B,MAAM;AAAA,IACvC,iBAAiB,MACd;AAAA,MACC,MAAM;AAAA,QACJ;AAAA,UAAkB,MAChB,MACG,OAAO,EACP;AAAA,YACC;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACJ;AAAA,MACF;AAAA,IACF,EACC,IAAI,EAAE;AAAA,IACT,YAAY,MAAM,OAAO;AAAA,MACvB,mBAAmB,MAAM,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAK;AAAA,MAClD,uBAAuB,MAAM,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAK;AAAA,IACxD,CAAC;AAAA,IACD,YAAY,MAAM,MAAM,MAAM,OAAO,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,IACE,GAAG;AAAA,IACH,iBAAiB,CAAC,UAAU;AAC1B,YAAM,gBAAgB;AAAA,QACpB,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AACA,YAAM,iBAAiB,MAAM,gBAAgB,MAAM;AACnD,YAAM,wBACJ,mBAAmB,IAAI,IAAI,MAAM,gBAAgB;AACnD,YAAM,4BACJ,MAAM,kBAAkB,IACpB,IACA,MAAM,8BAA8B,MAAM;AAChD,YAAM,sBACJ,MAAM,kBAAkB,IACpB,IACA,MAAM,wBAAwB,MAAM;AAC1C,YAAM,sBACH,MAAM,QAAQ,gBAAgB,KAC7B,MAAM,QAAQ,2BAA2B,UAC1C,MAAM,QAAQ,cAAc,KAC3B;AAAA,QACE,MAAM,QAAQ;AAAA,QACb,MAAM,gBAAgB,MAAU,MAAM,QAAQ;AAAA,MACjD;AACJ,YAAM,oBAAoB;AAAA,QACxB,MAAM;AAAA,QACN;AAAA,MACF;AACA,YAAM,qBACJ,qBAAqB,KACpB,MAAM,iBAAiB,KACtB,MAAM,WAAW,yBAAyB;AAC9C,YAAM,aAAa,KAAK;AAAA,SACrB,KAAK,MAAM,OAAO,MAAM,WAAW,CAAC,IACnC,KAAK,MAAM,OAAO,MAAM,SAAS,CAAC,KAClC;AAAA,MACJ;AACA,aACE,cAAc,OAAO,KAAK,KAAK,GAAK,KACpC,MAAM,YAAY,KAClB,MAAM,wBAAwB,cAC9B,MAAM,4BAA4B,MAAM,kBACvC,MAAM,gBAAgB,KACpB,MAAM,gCAAgC,KACrC,MAAM,0BAA0B,MACpC,YAAY,MAAM,MAAM,eAAe,qBAAqB,KAC5D;AAAA,QACE,MAAM,MAAM;AAAA,QACZ;AAAA,MACF,KACA;AAAA,QACE,MAAM,MAAM;AAAA,QACZ;AAAA,MACF,KACA,uBACA,cAAc,MAAM,YAAY,KAChC,2BAA2B,MAAM,YAAY;AAAA,QAC3C,iBACE,oBAAoB,IAChB;AAAA,UACE,OAAO;AAAA,UACP,cAAc;AAAA,UACd,mBAAmB,CAAC,iBAAiB;AAAA,QACvC,IACA;AAAA,QACN,uBAAuB,qBACnB;AAAA,UACE,OAAO;AAAA,UACP,cACE,qBAAqB,IACjB,oBACA,MAAM;AAAA,UACZ,mBAAmB;AAAA,YACjB;AAAA,YACA;AAAA,UACF;AAAA,QACF,IACA;AAAA,QACJ,mBACE,aAAa,KAAK,KACd;AAAA,UACE,OAAO;AAAA,UACP,cAAc;AAAA,UACd,mBAAmB,CAAC,yBAAyB;AAAA,QAC/C,IACA;AAAA,MACR,CAAC,KACD,kBAAkB,MAAM,kBAAkB,MAAM,MAAM,iBACtD,kBAAkB,MAAM,qBAAqB,MAC3C,MAAM,iBACR,kBAAkB,MAAM,oBAAoB,MAC1C,MAAM,iBACR;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR,KACA,kBAAkB,MAAM,kBAAkB,KACxC,MAAM,gBAAgB,KACxB,kBAAkB,MAAM,iBAAiB,MAAM,MAAM,iBACrD,kBAAkB,MAAM,oBAAoB,MAC1C,MAAM,4BACR,kBAAkB,MAAM,mBAAmB,MACzC,MAAM,4BACR,kBAAkB,MAAM,oBAAoB,MAC1C,MAAM,4BACR,kBAAkB,MAAM,qBAAqB,MAC3C,MAAM,4BACR,kBAAkB,MAAM,qBAAqB,MAC3C,MAAM,4BACR,kBAAkB,MAAM,6BAA6B,KACnD,MAAM,2BAA2B,0BAA0B,UAC7D;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR,KACA,kBAAkB,MAAM,6BAA6B,KACnD,MAAM,2BACJ,4BAA4B,SAC5B,OACJ;AAAA,QACE,MAAM;AAAA,QACN,MAAM,2BAA2B;AAAA,MACnC,KACA,kBAAkB,MAAM,2BAA2B,KACjD,MAAM,2BACJ,0BAA0B,UAC9B;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IAEJ;AAAA,EACF;AACF;AAEA,IAAM,2BAA2B,OAAO;AAAA,EACtC,QAAQ,MAAM,OAAO,EAAE,KAAK,CAAC,UAAU,WAAW,SAAS,CAAU;AAAA,EACrE,aAAa,WAAW;AAAA,EACxB,WAAW,MAAM,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AACnD;AAEA,IAAM,yBAAyB,CAC7B,cACA,UACiD;AACjD,MAAI,CAAC,MAAM,QAAQ,YAAY,KAAK,SAAS,GAAG;AAC9C,WAAO;AAAA,EACT;AACA,QAAM,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE;AAAA,IAAI,CAAC,SAClC,qBAAqB,cAAc,OAAO,IAAI,CAAC;AAAA,EACjD;AACA,QAAM,gBAAgB,OAAO;AAAA,IAC3B,CAAC,KAAK,OAAO,UAAU,MAAM,SAAS,QAAQ;AAAA,IAC9C;AAAA,EACF;AACA,QAAM,kBAAkB,CAAC,aAA6B;AACpD,QAAI,aAAa;AACjB,aAAS,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS,GAAG;AACrD,oBAAc,OAAO,KAAK,KAAK;AAC/B,UAAI,cAAc,UAAU;AAC1B,eAAO,QAAQ;AAAA,MACjB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,gBAAgB,KAAK,KAAK,QAAQ,CAAC,CAAC;AAClD,QAAM,QAAQ,gBAAgB,KAAK,MAAM,QAAQ,CAAC,IAAI,CAAC;AACvD,SAAO;AAAA,IACL,MAAM,KAAK,MAAO,gBAAgB,QAAS,EAAE,IAAI;AAAA,IACjD,SAAS,QAAQ,SAAS;AAAA,EAC5B;AACF;AAGO,IAAM,wCAAwC;AAAA,EACnD;AAAA,IACE,UAAU,UAAU;AAAA,IACpB,aAAa,MAAM,YAAY;AAAA,IAC/B,WAAW,MAAM,YAAY;AAAA,IAC7B,UAAU,cAAc;AAAA,IACxB,aAAa,MAAM,YAAY;AAAA,IAC/B,qBAAqB,WAAW;AAAA,IAChC,qBAAqB,WAAW;AAAA,IAChC,WAAW,MAAM,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IACjD,aAAa,MAAM,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IACnD,kBAAkB,MACf;AAAA,MACC,MAAM;AAAA,QACJ;AAAA,UAAkB,MAChB,MAAM,OAAO,EAAE,KAAK,CAAC,KAAK,KAAK,KAAK,KAAK,GAAG,CAAU;AAAA,QACxD;AAAA,MACF;AAAA,IACF,EACC,IAAI,CAAC;AAAA,IACR,uBAAuB,MACpB;AAAA,MACC,MAAM;AAAA,QACJ;AAAA,UAAkB,MAChB,MAAM,OAAO,EAAE,KAAK,0BAA0B;AAAA,QAChD;AAAA,MACF;AAAA,IACF,EACC,IAAI,2BAA2B,MAAM;AAAA,IACxC,oBAAoB,MACjB;AAAA,MACC,MAAM;AAAA,QACJ;AAAA,UAAkB,MAChB,MAAM,OAAO,EAAE,KAAK,mBAAmB;AAAA,QACzC;AAAA,MACF;AAAA,IACF,EACC,IAAI,oBAAoB,MAAM;AAAA,IACjC,gBAAgB,MACb,MAAM,MAAM,OAAO,yBAAyB,CAAC,CAAC,EAC9C,IAAI,CAAC;AAAA,IACR,0BAA0B,MAAM,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IACjE,YAAY,MAAM,MAAM,MAAM,OAAO,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,IACE,GAAG;AAAA,IACH,iBAAiB,CAAC,UAAU;AAC1B,UAAI,CAAC,cAAc,OAAO,KAAK,KAAK,KAAK,GAAK,GAAG;AAC/C,eAAO;AAAA,MACT;AACA,UACE,MAAM,wBAAwB,MAC7B,MAAM,cAAc,UAAa,MAAM,gBAAgB,SACxD;AACA,eAAO;AAAA,MACT;AACA,UACE,MAAM,sBAAsB,MAC3B,MAAM,cAAc,UAAa,MAAM,gBAAgB,SACxD;AACA,eAAO;AAAA,MACT;AACA,YAAM,gBAAgB;AAAA,QACpB,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AACA,YAAM,UAAU,MAAM,eAAe;AAAA,QACnC,CAAC,WAA+B,OAAO;AAAA,MACzC;AACA,YAAM,iBAAiB,MAAM,eAAe;AAAA,QAC1C,CAAC,WAA+B,OAAO,WAAW;AAAA,MACpD;AACA,YAAM,kBAAkB,MAAM,eAAe;AAAA,QAC3C,CAAC,WAA+B,OAAO,WAAW;AAAA,MACpD;AACA,YAAM,kBAAkB,MAAM,eAAe;AAAA,QAC3C,CAAC,WAA+B,OAAO,WAAW;AAAA,MACpD;AACA,UACE,mBAAmB,UACnB,oBAAoB,UACpB,oBAAoB,QACpB;AACA,eAAO;AAAA,MACT;AACA,YAAM,aAAa;AAAA,QACjB,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AACA,YAAM,aAAa,KAAK;AAAA,SACrB,KAAK,MAAM,OAAO,MAAM,WAAW,CAAC,IACnC,KAAK,MAAM,OAAO,MAAM,SAAS,CAAC,KAClC;AAAA,MACJ;AACA,YAAM,mBACJ,eAAe,eAAe,MAC9B,OAAO,MAAM,6BAA6B,YAC1C,MAAM,4BAA4B;AACpC,aACE,MAAM,YAAY,KAClB,MAAM,wBAAwB,cAC9B,cAAc,MAAM,YAAY,KAChC,kBAAkB,MAAM,gBAAgB,MACtC,MAAM,uBACR,kBAAkB,MAAM,qBAAqB,KAC3C,MAAM,uBACR;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR,KACA,kBAAkB,MAAM,kBAAkB,KACxC,MAAM,sBAAsB,KAC9B;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR,KACA,QAAQ,WAAW,KACnB,IAAI,IAAI,OAAO,EAAE,SAAS,MACxB,eAAe,UACf,MAAM,cAAc,UACpB,MAAM,gBAAgB,UACrB,eAAe,UACd,MAAM,cAAc,WAAW,QAC/B,MAAM,gBAAgB,WAAW,WACrC,2BAA2B,MAAM,YAAY;AAAA,QAC3C,qBAAqB,mBACjB;AAAA,UACE,OAAO;AAAA,UACP,cAAc,eAAe;AAAA,UAC7B,mBAAmB,CAAC,oBAAoB;AAAA,QAC1C,IACA;AAAA,QACJ,mBACE,aAAa,MAAM,KAAK,KACpB;AAAA,UACE,OAAO;AAAA,UACP,cAAc;AAAA,UACd,mBAAmB,CAAC,yBAAyB;AAAA,QAC/C,IACA;AAAA,MACR,CAAC,KACD,MAAM,eAAe;AAAA,QACnB,CAAC,WACE,OAAO,gBAAgB,KAAK,OAAO,cAAc,UACjD,OAAO,cAAc,KAAK,OAAO,cAAc;AAAA,MACpD,KACA,MAAM,uBAAuB,eAAe,eAC5C,eAAe,eAAe,gBAAgB,eAC9C,gBAAgB,eAAe,gBAAgB;AAAA,IAEnD;AAAA,EACF;AACF;AAEA,IAAM,yBAAyB,OAAO;AAAA,EACpC,WAAW,MAAM,YAAY;AAAA,EAC7B,OAAO,MAAM,OAAO,EAAE,KAAK,CAAC,aAAa,YAAY,CAAU;AAAA,EAC/D,qBAAqBG,oBAAmB,EAAE,SAAS;AAAA,EACnD,cAAc,MAAM,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AACtD;AAEA,IAAM,wBAAwB,OAAO;AAAA,EACnC,6BAA6BA,oBAAmB;AAAA,EAChD,sBAAsB,MAAM,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EACjD,YAAY,MAAM,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC;AAC1C;AAGO,IAAM,8BAA8B;AAAA,EACzC;AAAA,IACE,YAAY,UAAU;AAAA,IACtB,aAAa,MAAM,YAAY;AAAA,IAC/B,MAAM,MAAM,YAAY;AAAA,IACxB,WAAW,MAAM,OAAO,EAAE,KAAK,CAAC,SAAS,OAAO,CAAU;AAAA,IAC1D,kBAAkB,WAAW;AAAA,IAC7B,mBAAmB,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAU;AAAA,IACpD,OAAO,MAAM,OAAO,EAAE,KAAK,CAAC,aAAa,YAAY,CAAU;AAAA,IAC/D,qBAAqBA,oBAAmB,EAAE,SAAS;AAAA,IACnD,cAAc,MAAM,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IACpD,OAAO,MAAM,OAAO,EAAE,KAAK,CAAC,MAAM,QAAQ,MAAM,CAAU,EAAE,SAAS;AAAA,IACrE,YAAY,MAAM,OAAO,sBAAsB,CAAC,EAAE,SAAS;AAAA,IAC3D,cAAc,MACX,MAAM,MAAM,OAAO,uBAAuB,CAAC,CAAC,EAC5C,IAAI,EAAE,EACN,IAAI,EAAE;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,IACE,GAAG;AAAA,IACH,iBAAiB,CAAC,UAAU;AAC1B,YAAM,sBACJ,MAAM,UAAU,gBAChB,MAAM,wBAAwB,UAC9B,MAAM,iBAAiB,UACvB,MAAM,UAAU,UAChB,MAAM,eAAe;AACvB,YAAM,kBACJ,MAAM,eAAe,SACjB,SACA;AAAA,QACE,MAAM,eACJ,MAAM,WAAW;AAAA,MACrB;AACN,YAAM,gBACJ,oBAAoB,SAChB,SACA,mBAAmB,MACjB,OACA,mBAAmB,OACjB,SACA;AACV,YAAM,yBACH,MAAM,eAAe,UAAa,MAAM,UAAU,UAClD,MAAM,eAAe,UACpB,MAAM,WAAW,+BAA+B,MAChD,MAAM,WAAW,eAAe,mBAChC,MAAM,UAAU;AACpB,YAAM,qBACJ,MAAM,UAAU,eAChB,OAAO,MAAM,wBAAwB,YACrC,MAAM,uBAAuB,MAC7B,OAAO,MAAM,iBAAiB,YAC9B;AACF,UAAI,CAAC,uBAAuB,CAAC,oBAAoB;AAC/C,eAAO;AAAA,MACT;AACA,YAAM,aAAa,MAAM,aAAa;AAAA,QACpC,CAAC,UAAiC,MAAM;AAAA,MAC1C;AACA,YAAM,OAAO,KAAK,MAAM,OAAO,MAAM,IAAI,CAAC;AAC1C,YAAM,cAAc,KAAK,MAAM,OAAO,MAAM,WAAW,CAAC;AACxD,UACE,CAAC,OAAO,SAAS,IAAI,KACrB,CAAC,OAAO,SAAS,WAAW,KAC5B,IAAI,KAAK,IAAI,EAAE,YAAY,MAAM,MAAM,QACvC,IAAI,KAAK,IAAI,EAAE,YAAY,MAAM,KACjC,IAAI,KAAK,IAAI,EAAE,cAAc,MAAM,KACnC,IAAI,KAAK,IAAI,EAAE,cAAc,MAAM,KACnC,IAAI,KAAK,IAAI,EAAE,mBAAmB,MAAM,KACxC,cAAc,QACd,MAAM,qBAAqB,KAAK,OAAO,cAAc,QAAQ,GAAK,GAClE;AACA,eAAO;AAAA,MACT;AACA,YAAM,mBAAmB,IAAI,KAAK,IAAI,EAAE,UAAU,IAAI,KAAK;AAC3D,YAAM,gBAAgB,OAAO,kBAAkB,KAAK,KAAK,KAAK;AAC9D,YAAM,oBAAoB,WAAW;AAAA,QACnC,CAAC,WAAmB,UAClB,KAAK,MAAM,SAAS,MACpB,iBAAiB,KAAK,SAAS,IAAI,KAAK,KAAK,KAAK;AAAA,MACtD;AACA,aACE,IAAI,IAAI,UAAU,EAAE,SAAS,WAAW,UACxC,sBACC,MAAM,UAAU,gBACf,MAAM,aAAa;AAAA,QACjB,CAAC,UAA6B,MAAM,UAAU;AAAA,MAChD,MACF,MAAM,aAAa;AAAA,QACjB,CAAC,UAKE,MAAM,UAAU,gBACf,MAAM,wBAAwB,UAC9B,MAAM,iBAAiB,UACxB,MAAM,UAAU,eACf,OAAO,MAAM,wBAAwB,YACrC,MAAM,uBAAuB,MAC7B,OAAO,MAAM,iBAAiB,aAC7B,MAAM,UAAU,eACf,MAAM,uBAAuB,MAAM;AAAA,MAC3C;AAAA,IAEJ;AAAA,EACF;AACF;AAGO,IAAM,oCAAoC;AAAA,EAC/C;AAAA,IACE,cAAc,YAAY,GAAG;AAAA,IAC7B,WAAW,MACR,OAAO,EACP,KAAK,CAAC,cAAc,gBAAgB,uBAAuB,CAAU;AAAA,IACxE,WAAW,YAAY,GAAG;AAAA,IAC1B,UAAU,cAAc;AAAA,IACxB,aAAa,MAAM,YAAY;AAAA,IAC/B,UAAU,UAAU,EAAE,SAAS;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,IACE,GAAG;AAAA,IACH,iBAAiB,CAAC,UAChB,8BAA8B,OAAO,YAAY,KACjD,MAAM,YAAY,MAChB,MAAM,cAAc,2BACpB,MAAM,aAAa,UAClB,MAAM,cAAc,2BACnB,MAAM,aAAa;AAAA,EAC3B;AACF;AAGO,IAAM,wCAAwC;AAAA,EACnD;AAAA,IACE,YAAY,UAAU;AAAA,IACtB,WAAW,MACR,OAAO,EACP,KAAK,CAAC,cAAc,gBAAgB,uBAAuB,CAAU;AAAA,IACxE,WAAW,YAAY,GAAG;AAAA,IAC1B,UAAU,cAAc;AAAA,IACxB,aAAa,MAAM,YAAY;AAAA,IAC/B,mBAAmB,WAAW;AAAA,IAC9B,kBAAkB,WAAW;AAAA,IAC7B,gBAAgB,UAAU,EAAE,SAAS;AAAA,IACrC,QAAQ,MACL,OAAO,EACP,KAAK,CAAC,aAAa,aAAa,OAAO,CAAU;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,IACE,GAAG;AAAA,IACH,iBAAiB,CAAC,UAAU;AAC1B,UACE,CAAC,8BAA8B,OAAO,UAAU,KAChD,MAAM,mBAAmB,MAAM,mBAC/B;AACA,eAAO;AAAA,MACT;AACA,UAAI,MAAM,cAAc,yBAAyB;AAC/C,eACE,MAAM,WAAW,WACjB,MAAM,YAAY,KAClB,MAAM,mBAAmB,UACzB,MAAM,qBAAqB;AAAA,MAE/B;AACA,aACG,MAAM,WAAW,eAChB,MAAM,aAAa,KACnB,MAAM,qBAAqB,KAC3B,MAAM,mBAAmB,UAC1B,MAAM,WAAW,eAChB,MAAM,YAAY,KAClB,MAAM,mBAAmB,KACzB,MAAM,mBAAmB;AAAA,IAE/B;AAAA,EACF;AACF;","names":["IsoLanguageCode","options","BASE64URL_PATTERN","BASE64URL_ALPHABET","decodeCanonicalBase64Url","positiveCountField","nestedIdentityShape"]}
|