@zipbul/baker 0.1.1 → 1.0.0
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.ko.md +368 -280
- package/README.md +369 -281
- package/dist/index-57gr0v18.js +6 -0
- package/dist/index-aegrb1kn.js +6 -0
- package/dist/index-xdn55cz3.js +4 -0
- package/dist/index.d.ts +6 -5
- package/dist/index.js +168 -2
- package/dist/src/configure.d.ts +33 -0
- package/dist/src/create-rule.d.ts +6 -15
- package/dist/src/decorators/field.d.ts +74 -0
- package/dist/src/decorators/index.d.ts +2 -14
- package/dist/src/decorators/index.js +2 -2
- package/dist/src/functions/deserialize.d.ts +2 -1
- package/dist/src/functions/serialize.d.ts +2 -2
- package/dist/src/functions/to-json-schema.d.ts +6 -0
- package/dist/src/interfaces.d.ts +5 -26
- package/dist/src/registry.d.ts +0 -8
- package/dist/src/rules/index.d.ts +2 -0
- package/dist/src/rules/index.js +11 -2
- package/dist/src/seal/circular-analyzer.d.ts +2 -6
- package/dist/src/seal/index.d.ts +1 -1
- package/dist/src/seal/seal.d.ts +21 -6
- package/dist/src/symbols.js +2 -2
- package/dist/src/types.d.ts +7 -7
- package/dist/src/utils.d.ts +2 -0
- package/package.json +10 -4
- package/dist/index-jzjz61tg.js +0 -14
- package/dist/index-jzjz61tg.js.map +0 -31
- package/dist/index-txxjqhgc.js +0 -6
- package/dist/index-txxjqhgc.js.map +0 -10
- package/dist/index.js.map +0 -9
- package/dist/src/decorators/array.d.ts +0 -13
- package/dist/src/decorators/common.d.ts +0 -39
- package/dist/src/decorators/date.d.ts +0 -5
- package/dist/src/decorators/index.js.map +0 -9
- package/dist/src/decorators/locales.d.ts +0 -9
- package/dist/src/decorators/nested.d.ts +0 -17
- package/dist/src/decorators/number.d.ts +0 -15
- package/dist/src/decorators/object.d.ts +0 -9
- package/dist/src/decorators/schema.d.ts +0 -13
- package/dist/src/decorators/string.d.ts +0 -72
- package/dist/src/decorators/transform.d.ts +0 -68
- package/dist/src/decorators/typechecker.d.ts +0 -18
- package/dist/src/rules/index.js.map +0 -9
- package/dist/src/symbols.js.map +0 -9
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/registry.ts", "../src/collect.ts", "../src/rules/common.ts", "../src/decorators/common.ts", "../src/errors.ts", "../src/decorators/nested.ts", "../src/rules/typechecker.ts", "../src/decorators/typechecker.ts", "../src/rules/number.ts", "../src/decorators/number.ts", "../src/rules/date.ts", "../src/decorators/date.ts", "../src/rules/string.ts", "../src/decorators/string.ts", "../src/rules/array.ts", "../src/decorators/array.ts", "../src/rules/object.ts", "../src/decorators/object.ts", "../src/decorators/transform.ts", "../src/decorators/schema.ts", "../src/rules/locales.ts", "../src/decorators/locales.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/**\n * 전역 레지스트리 — 데코레이터가 1개라도 부착된 클래스를 자동 등록\n *\n * - ensureMeta()에서 자동 호출\n * - seal()이 이 Set을 순회하여 모든 DTO를 봉인\n * - 메타데이터는 여기에 저장되지 않음 — 인덱스(어떤 클래스가 등록되었는지)로만 사용\n */\nexport const globalRegistry = new Set<Function>();\n\n/**\n * 클래스를 레지스트리에서 제거한다.\n * seal() 후 더 이상 필요 없는 DTO를 GC 대상으로 돌린다 (§L1).\n *\n * @param cls 제거할 클래스 생성자\n * @returns 세트에 존재했는지 여부\n */\nexport function unregister(cls: Function): boolean {\n return globalRegistry.delete(cls);\n}\n",
|
|
6
|
-
"import { RAW, RAW_CLASS_SCHEMA } from './symbols';\nimport { globalRegistry } from './registry';\nimport type { RawPropertyMeta, RuleDef, TransformDef, ExposeDef, ExcludeDef, TypeDef } from './types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ensureMeta — 내부 유틸 (§3.1)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * ctor에 대한 propertyKey의 RawPropertyMeta를 반환한다.\n * - 존재하지 않으면 기본값으로 생성한다.\n * - 전역 레지스트리에 ctor를 자동 등록한다 (데코레이터가 1개라도 있으면 등록).\n */\nexport function ensureMeta(ctor: Function, key: string): RawPropertyMeta {\n // 전역 레지스트리에 자동 등록\n globalRegistry.add(ctor);\n\n // Class[RAW] 없으면 생성 (null prototype 사용 — 프로토타입 체인 간섭 0)\n // 주의: hasOwnProperty 체크 필수 — 클래스 상속 시 ctor.__proto__ === ParentClass 이므로\n // ??= 연산자가 부모의 [RAW]를 찾아 자식의 필드를 부모 RAW에 저장하는 오염 발생 방지\n if (!Object.prototype.hasOwnProperty.call(ctor, RAW)) {\n (ctor as any)[RAW] = Object.create(null) as Record<string, RawPropertyMeta>;\n }\n const raw = (ctor as any)[RAW] as Record<string, RawPropertyMeta>;\n\n // key 없으면 기본 meta 생성\n return (raw[key] ??= {\n validation: [],\n transform: [],\n expose: [],\n exclude: null,\n type: null,\n flags: {},\n schema: null,\n });\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// collect* — 카테고리별 수집 함수 (§3.1)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function collectValidation(target: object, key: string, ruleDef: RuleDef): void {\n const meta = ensureMeta((target as any).constructor, key);\n meta.validation.push(ruleDef);\n}\n\nexport function collectTransform(target: object, key: string, transformDef: TransformDef): void {\n const meta = ensureMeta((target as any).constructor, key);\n meta.transform.push(transformDef);\n}\n\nexport function collectExpose(target: object, key: string, exposeDef: ExposeDef): void {\n const meta = ensureMeta((target as any).constructor, key);\n meta.expose.push(exposeDef);\n}\n\nexport function collectExclude(target: object, key: string, excludeDef: ExcludeDef): void {\n const meta = ensureMeta((target as any).constructor, key);\n meta.exclude = excludeDef;\n}\n\nexport function collectType(target: object, key: string, typeDef: TypeDef): void {\n const meta = ensureMeta((target as any).constructor, key);\n meta.type = typeDef;\n}\n\nexport function collectSchema(\n target: object, key: string,\n schemaDef: Record<string, unknown> | ((auto: Record<string, unknown>) => Record<string, unknown>),\n): void {\n const meta = ensureMeta((target as any).constructor, key);\n // 함수형은 항상 덮어씌움 (마지막 선언 우선)\n if (typeof schemaDef === 'function' || typeof meta.schema === 'function') {\n meta.schema = schemaDef;\n } else {\n meta.schema = { ...(meta.schema ?? {}), ...schemaDef } as Record<string, unknown>;\n }\n}\n\nexport function collectClassSchema(target: Function, schema: Record<string, unknown>): void {\n globalRegistry.add(target);\n const existing = (target as any)[RAW_CLASS_SCHEMA] as Record<string, unknown> | undefined;\n (target as any)[RAW_CLASS_SCHEMA] = { ...(existing ?? {}), ...schema };\n}\n",
|
|
7
|
-
"import type { EmitContext, EmittableRule } from '../types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// equals — strict equality (===). refs로 비교값 전달 (§4.8 C)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function equals(comparison: unknown): EmittableRule {\n const fn = (value: unknown): boolean => value === comparison;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(comparison);\n return `if (${varName} !== _refs[${i}]) ${ctx.fail('equals')};`;\n };\n\n (fn as any).ruleName = 'equals';\n (fn as any).constraints = { value: comparison };\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// notEquals — strict inequality (!==). refs로 비교값 전달\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function notEquals(comparison: unknown): EmittableRule {\n const fn = (value: unknown): boolean => value !== comparison;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(comparison);\n return `if (${varName} === _refs[${i}]) ${ctx.fail('notEquals')};`;\n };\n\n (fn as any).ruleName = 'notEquals';\n (fn as any).constraints = { value: comparison };\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isEmpty — undefined | null | '' 만 empty로 취급 (§4.8 A)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst _isEmpty = (value: unknown): boolean =>\n value === undefined || value === null || value === '';\n\n(_isEmpty as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName} !== undefined && ${varName} !== null && ${varName} !== '') ${ctx.fail('isEmpty')};`;\n\n(_isEmpty as any).ruleName = 'isEmpty';\n(_isEmpty as any).constraints = {};\n\nexport const isEmpty = _isEmpty as EmittableRule;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isNotEmpty — undefined | null | '' 이외의 값 (§4.8 A)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst _isNotEmpty = (value: unknown): boolean =>\n value !== undefined && value !== null && value !== '';\n\n(_isNotEmpty as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName} === undefined || ${varName} === null || ${varName} === '') ${ctx.fail('isNotEmpty')};`;\n\n(_isNotEmpty as any).ruleName = 'isNotEmpty';\n(_isNotEmpty as any).constraints = {};\n\nexport const isNotEmpty = _isNotEmpty as EmittableRule;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isIn — 배열 내 포함 여부. refs로 배열 전달 (§4.8 C)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function isIn(array: unknown[]): EmittableRule {\n const fn = (value: unknown): boolean => array.indexOf(value) !== -1;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(array);\n return `if (_refs[${i}].indexOf(${varName}) === -1) ${ctx.fail('isIn')};`;\n };\n\n (fn as any).ruleName = 'isIn';\n (fn as any).constraints = { values: array };\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isNotIn — 배열 외 여부. refs로 배열 전달 (§4.8 C)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function isNotIn(array: unknown[]): EmittableRule {\n const fn = (value: unknown): boolean => array.indexOf(value) === -1;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(array);\n return `if (_refs[${i}].indexOf(${varName}) !== -1) ${ctx.fail('isNotIn')};`;\n };\n\n (fn as any).ruleName = 'isNotIn';\n (fn as any).constraints = { values: array };\n\n return fn as EmittableRule;\n}\n",
|
|
8
|
-
"import { collectValidation, ensureMeta } from '../collect';\nimport { equals, notEquals, isEmpty, isNotEmpty, isIn, isNotIn } from '../rules/common';\nimport type { ValidationOptions } from '../interfaces';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Flag-based decorators — flags에 직접 저장 (§3.2, §2.1 PropertyFlags)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * undefined/null 불허. groups를 무시하고 항상 적용.\n * @IsDefined와 @IsOptional 동시 선언 시 @IsDefined 우선 (optional 가드 생략).\n */\nexport function IsDefined(_options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n const meta = ensureMeta((target as any).constructor, key as string);\n meta.flags.isDefined = true;\n };\n}\n\n/**\n * undefined/null 허용 — 해당 필드의 전체 validation을 skip.\n * @IsDefined와 동시 선언 시 @IsDefined 우선.\n */\nexport function IsOptional(_options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n const meta = ensureMeta((target as any).constructor, key as string);\n meta.flags.isOptional = true;\n };\n}\n\n/**\n * 조건이 false일 때 해당 필드의 전체 검증을 skip.\n * 조건 함수는 원본 input 객체를 인자로 받는다.\n */\nexport function ValidateIf(condition: (obj: any) => boolean): PropertyDecorator {\n return (target, key) => {\n const meta = ensureMeta((target as any).constructor, key as string);\n meta.flags.validateIf = condition;\n };\n}\n\n/**\n * 중첩 DTO 재귀 검증 트리거. @Type과 함께 사용해야 한다.\n * builder 트리거 조건: meta.type !== null && meta.flags.validateNested === true\n */\nexport function ValidateNested(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n const meta = ensureMeta((target as any).constructor, key as string);\n meta.flags.validateNested = true;\n if (options?.each) meta.flags.validateNestedEach = true;\n };\n}\n\n/**\n * null 허용+할당. undefined는 거부.\n * @IsOptional과 조합 시: null은 할당, undefined는 skip.\n * @IsDefined와 조합 시: Case 3과 동일 (추가 효과 없음).\n */\nexport function IsNullable(_options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n const meta = ensureMeta((target as any).constructor, key as string);\n meta.flags.isNullable = true;\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Rule-based decorators — collectValidation으로 등록 (§3.2)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** value === comparison (strict equality) */\nexport function Equals(comparison: unknown, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: equals(comparison),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** value !== comparison (strict inequality) */\nexport function NotEquals(comparison: unknown, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: notEquals(comparison),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** value === undefined | null | '' */\nexport function IsEmpty(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isEmpty,\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** value !== undefined && value !== null && value !== '' */\nexport function IsNotEmpty(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isNotEmpty,\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** array.indexOf(value) !== -1 */\nexport function IsIn(array: readonly unknown[], options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isIn(array as unknown[]),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** array.indexOf(value) === -1 */\nexport function IsNotIn(array: readonly unknown[], options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isNotIn(array as unknown[]),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n",
|
|
9
|
-
"// ─────────────────────────────────────────────────────────────────────────────\n// BakerError — 개별 필드 에러 (§12.2)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 개별 필드 에러 — 최소 계약(minimum contract).\n *\n * 예약 에러 코드:\n * - 'invalidInput': input이 null, 비객체, 배열일 때 (path='')\n * - 'isObject': 중첩 @Type 필드의 값이 객체가 아닐 때\n * - 'isArray': 배열 중첩 (each:true) 필드의 값이 배열이 아닐 때\n * - 'invalidDiscriminator': discriminator 값이 subTypes에 없을 때\n * - 'conversionFailed': enableImplicitConversion에서 타입 변환 실패 시\n * - 'whitelistViolation': whitelist: true에서 미선언 필드가 input에 존재할 때\n *\n * 향후 확장 필드(message, expected, actual 등)는 반드시 Optional로 추가.\n */\nexport interface BakerError {\n readonly path: string;\n readonly code: string;\n /** 사용자 정의 에러 메시지 — 데코레이터 message 옵션이 설정된 경우에만 포함 */\n readonly message?: string;\n /** 사용자 정의 컨텍스트 — 데코레이터 context 옵션이 설정된 경우에만 포함 */\n readonly context?: unknown;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// BakerValidationError — Public API throw 에러 (§12.2)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * deserialize() 검증 실패 시 throw되는 에러.\n * errors 배열에 모든 필드 에러가 담겨 있다.\n */\nexport class BakerValidationError extends Error {\n readonly errors: BakerError[];\n /** 검증 대상 DTO 클래스명 (DX-2) */\n readonly className?: string;\n\n constructor(errors: BakerError[], className?: string) {\n const prefix = className ? `Validation failed for ${className}` : 'Validation failed';\n super(`${prefix}: ${errors.length} error(s)`);\n this.name = 'BakerValidationError';\n this.errors = errors;\n this.className = className;\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SealError — 봉인 관련 에러 (§12.2)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 봉인 관련 에러:\n * - seal() 2회 이상 호출 시\n * - 미봉인 클래스에 deserialize()/serialize() 호출 시\n */\nexport class SealError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'SealError';\n }\n}\n",
|
|
10
|
-
"import { ensureMeta, collectType } from '../collect';\nimport { SealError } from '../errors';\nimport type { ValidationOptions } from '../interfaces';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// @Nested — @Type + @ValidateNested 통합 데코레이터 (§Phase4)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface NestedOptions {\n discriminator?: { property: string; subTypes: { value: Function; name: string }[] };\n keepDiscriminatorProperty?: boolean;\n each?: boolean;\n}\n\n/**\n * @Type(() => X) + @ValidateNested() 통합.\n *\n * discriminator + each 동시 사용 시 SealError throw.\n */\nexport function Nested(\n typeFn: () => new (...args: any[]) => any,\n options?: NestedOptions,\n): PropertyDecorator {\n if (options?.discriminator && options?.each) {\n throw new SealError('@Nested: discriminator + each 동시 사용 불가');\n }\n\n return (target, key) => {\n // Type 메타데이터 저장\n collectType(target as object, key as string, {\n fn: typeFn,\n discriminator: options?.discriminator,\n keepDiscriminatorProperty: options?.keepDiscriminatorProperty,\n });\n\n // ValidateNested 플래그 저장\n const meta = ensureMeta((target as any).constructor, key as string);\n meta.flags.validateNested = true;\n if (options?.each) meta.flags.validateNestedEach = true;\n };\n}\n",
|
|
11
|
-
"import type { EmitContext, EmittableRule } from '../types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isString — typeof 체크 (§4.8 A: 연산자 인라인)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst _isString = (value: unknown): boolean => typeof value === 'string';\n\n(_isString as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (typeof ${varName} !== 'string') ${ctx.fail('isString')};`;\n\n(_isString as any).ruleName = 'isString';\n(_isString as any).constraints = {};\n// requiresType은 undefined — 자체 typeof 포함 (§4.7)\n\nexport const isString = _isString as EmittableRule;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isNumber — typeof + NaN/Infinity/maxDecimalPlaces 옵션 (§4.8 A)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface IsNumberOptions {\n allowNaN?: boolean;\n allowInfinity?: boolean;\n maxDecimalPlaces?: number;\n}\n\nexport function isNumber(options?: IsNumberOptions): EmittableRule {\n const allowNaN = options?.allowNaN ?? false;\n const allowInfinity = options?.allowInfinity ?? false;\n const maxDecimalPlaces = options?.maxDecimalPlaces;\n\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'number') return false;\n // NaN 먼저 체크 — isFinite(NaN)도 false이므로 순서가 중요\n if (isNaN(value)) return allowNaN;\n // NaN이 아닌 비유한수 (Infinity / -Infinity)\n if (!isFinite(value)) return allowInfinity;\n if (maxDecimalPlaces !== undefined) {\n const str = value.toString();\n const dotIdx = str.indexOf('.');\n if (dotIdx !== -1 && str.length - dotIdx - 1 > maxDecimalPlaces) return false;\n }\n return true;\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n let code = `if (typeof ${varName} !== 'number') ${ctx.fail('isNumber')};`;\n if (!allowNaN) {\n code += `\\nelse if (isNaN(${varName})) ${ctx.fail('isNumber')};`;\n }\n if (!allowInfinity) {\n // !isFinite 대신 명시적 Infinity 체크 — isNaN(NaN)=false지만 !isFinite(NaN)=true이므로 분리 필요\n code += `\\nelse if (${varName} === Infinity || ${varName} === -Infinity) ${ctx.fail('isNumber')};`;\n }\n if (maxDecimalPlaces !== undefined) {\n code += `\\nelse { var _s=${varName}.toString(); var _d=_s.indexOf('.'); if(_d!==-1&&_s.length-_d-1>${maxDecimalPlaces}) ${ctx.fail('isNumber')}; }`;\n }\n return code;\n };\n\n (fn as any).ruleName = 'isNumber';\n (fn as any).constraints = { allowNaN: options?.allowNaN, allowInfinity: options?.allowInfinity, maxDecimalPlaces: options?.maxDecimalPlaces };\n // requiresType은 undefined — 자체 typeof 포함\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isBoolean — typeof 체크 (§4.8 A)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst _isBoolean = (value: unknown): boolean => typeof value === 'boolean';\n\n(_isBoolean as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (typeof ${varName} !== 'boolean') ${ctx.fail('isBoolean')};`;\n\n(_isBoolean as any).ruleName = 'isBoolean';\n(_isBoolean as any).constraints = {};\n\nexport const isBoolean = _isBoolean as EmittableRule;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isDate — instanceof Date + getTime() NaN 체크 (§4.8 A)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst _isDate = (value: unknown): boolean =>\n value instanceof Date && !isNaN((value as Date).getTime());\n\n(_isDate as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (!(${varName} instanceof Date) || isNaN(${varName}.getTime())) ${ctx.fail('isDate')};`;\n\n(_isDate as any).ruleName = 'isDate';\n(_isDate as any).constraints = {};\n\nexport const isDate = _isDate as EmittableRule;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isEnum — factory: Object.values 배열로 indexOf 검사 (§4.8 C)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function isEnum(entity: object): EmittableRule {\n const values = Object.values(entity);\n\n const fn = (value: unknown): boolean => values.indexOf(value) !== -1;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(values);\n return `if (_refs[${i}].indexOf(${varName}) === -1) ${ctx.fail('isEnum')};`;\n };\n\n (fn as any).ruleName = 'isEnum';\n (fn as any).constraints = { values: Object.values(entity) };\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isInt — typeof + Number.isInteger 체크 (§4.8 A)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst _isInt = (value: unknown): boolean =>\n typeof value === 'number' && Number.isInteger(value);\n\n(_isInt as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (typeof ${varName} !== 'number' || !Number.isInteger(${varName})) ${ctx.fail('isInt')};`;\n\n(_isInt as any).ruleName = 'isInt';\n(_isInt as any).requiresType = 'number';\n(_isInt as any).constraints = {};\n\nexport const isInt = _isInt as EmittableRule;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isArray — Array.isArray 체크 (§4.8 A: 연산자 인라인)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst _isArray = (value: unknown): boolean => Array.isArray(value);\n\n(_isArray as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (!Array.isArray(${varName})) ${ctx.fail('isArray')};`;\n\n(_isArray as any).ruleName = 'isArray';\n(_isArray as any).constraints = {};\n// requiresType은 undefined — 자체 Array.isArray 체크 포함\n\nexport const isArray = _isArray as EmittableRule;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isObject — typeof object + non-null + non-array (§4.8 A)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst _isObject = (value: unknown): boolean =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\n(_isObject as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (typeof ${varName} !== 'object' || ${varName} === null || Array.isArray(${varName})) ${ctx.fail('isObject')};`;\n\n(_isObject as any).ruleName = 'isObject';\n(_isObject as any).constraints = {};\n// requiresType은 undefined — 자체 typeof + null + Array.isArray 체크 포함\n\nexport const isObject = _isObject as EmittableRule;\n",
|
|
12
|
-
"import { collectValidation } from '../collect';\nimport { isString, isNumber, isBoolean, isDate, isEnum, isInt, isArray, isObject } from '../rules/typechecker';\nimport type { IsNumberOptions } from '../rules/typechecker';\nimport type { ValidationOptions } from '../interfaces';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Type Checker Decorators (§1.1 Type Checkers)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** typeof value === 'string' */\nexport function IsString(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isString,\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** typeof value === 'number' + NaN/Infinity/maxDecimalPlaces 옵션 */\nexport function IsNumber(numberOptions?: IsNumberOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isNumber(numberOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** typeof value === 'boolean' */\nexport function IsBoolean(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isBoolean,\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** value instanceof Date && !isNaN(getTime()) */\nexport function IsDate(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isDate,\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** Object.values(entity).indexOf(value) !== -1 */\nexport function IsEnum(entity: object, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isEnum(entity),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** typeof value === 'number' && Number.isInteger(value) */\nexport function IsInt(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isInt,\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** Array.isArray(value) */\nexport function IsArray(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isArray,\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** typeof value === 'object' && value !== null && !Array.isArray(value) */\nexport function IsObject(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isObject,\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n",
|
|
13
|
-
"import type { EmitContext, EmittableRule } from '../types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// min — v >= n 검사. requiresType='number' (§4.7, §4.8 A)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function min(n: number, opts?: { exclusive?: boolean }): EmittableRule {\n const exclusive = opts?.exclusive ?? false;\n\n const fn = exclusive\n ? (value: unknown): boolean => (value as number) > n\n : (value: unknown): boolean => (value as number) >= n;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string =>\n exclusive\n ? `if (${varName} <= ${n}) ${ctx.fail('min')};`\n : `if (${varName} < ${n}) ${ctx.fail('min')};`;\n\n (fn as any).ruleName = 'min';\n (fn as any).requiresType = 'number';\n (fn as any).constraints = exclusive ? { min: n, exclusive: true } : { min: n };\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// max — v <= n 검사. requiresType='number' (§4.7, §4.8 A)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function max(n: number, opts?: { exclusive?: boolean }): EmittableRule {\n const exclusive = opts?.exclusive ?? false;\n\n const fn = exclusive\n ? (value: unknown): boolean => (value as number) < n\n : (value: unknown): boolean => (value as number) <= n;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string =>\n exclusive\n ? `if (${varName} >= ${n}) ${ctx.fail('max')};`\n : `if (${varName} > ${n}) ${ctx.fail('max')};`;\n\n (fn as any).ruleName = 'max';\n (fn as any).requiresType = 'number';\n (fn as any).constraints = exclusive ? { max: n, exclusive: true } : { max: n };\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isPositive — v > 0 (0 포함 불가). requiresType='number' (§4.8 A)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst _isPositive = (value: unknown): boolean => (value as number) > 0;\n\n(_isPositive as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName} <= 0) ${ctx.fail('isPositive')};`;\n\n(_isPositive as any).ruleName = 'isPositive';\n(_isPositive as any).requiresType = 'number';\n(_isPositive as any).constraints = { min: 0, exclusive: true };\n\nexport const isPositive = _isPositive as EmittableRule;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isNegative — v < 0 (0 포함 불가). requiresType='number' (§4.8 A)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst _isNegative = (value: unknown): boolean => (value as number) < 0;\n\n(_isNegative as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName} >= 0) ${ctx.fail('isNegative')};`;\n\n(_isNegative as any).ruleName = 'isNegative';\n(_isNegative as any).requiresType = 'number';\n(_isNegative as any).constraints = { max: 0, exclusive: true };\n\nexport const isNegative = _isNegative as EmittableRule;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isDivisibleBy — v % n === 0 검사. requiresType='number' (§4.8 A)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function isDivisibleBy(n: number): EmittableRule {\n const fn = (value: unknown): boolean => (value as number) % n === 0;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName} % ${n} !== 0) ${ctx.fail('isDivisibleBy')};`;\n\n (fn as any).ruleName = 'isDivisibleBy';\n (fn as any).requiresType = 'number';\n (fn as any).constraints = { divisor: n };\n\n return fn as EmittableRule;\n}\n",
|
|
14
|
-
"import { collectValidation } from '../collect';\nimport { min, max, isPositive, isNegative, isDivisibleBy } from '../rules/number';\nimport type { ValidationOptions } from '../interfaces';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Number Decorators (§1.1 Number)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** value >= n (exclusive: true → value > n) */\nexport function Min(n: number, options?: ValidationOptions & { exclusive?: boolean }): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: min(n, options?.exclusive ? { exclusive: true } : undefined),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** value <= n (exclusive: true → value < n) */\nexport function Max(n: number, options?: ValidationOptions & { exclusive?: boolean }): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: max(n, options?.exclusive ? { exclusive: true } : undefined),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** value > 0 */\nexport function IsPositive(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isPositive,\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** value < 0 */\nexport function IsNegative(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isNegative,\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** value % n === 0 */\nexport function IsDivisibleBy(n: number, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isDivisibleBy(n),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n",
|
|
15
|
-
"import type { EmitContext, EmittableRule } from '../types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// minDate — v >= date (inclusive, getTime 비교). (§4.8 C — refs 함수 호출)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function minDate(date: Date): EmittableRule {\n const timestamp = date.getTime();\n\n const fn = (value: unknown): boolean =>\n value instanceof Date && value.getTime() >= timestamp;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(timestamp);\n return `if (!(${varName} instanceof Date) || ${varName}.getTime() < _refs[${i}]) ${ctx.fail('minDate')};`;\n };\n\n (fn as any).ruleName = 'minDate';\n (fn as any).requiresType = 'date';\n (fn as any).constraints = { min: date.toISOString() };\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// maxDate — v <= date (inclusive, getTime 비교). (§4.8 C — refs 함수 호출)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function maxDate(date: Date): EmittableRule {\n const timestamp = date.getTime();\n\n const fn = (value: unknown): boolean =>\n value instanceof Date && value.getTime() <= timestamp;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(timestamp);\n return `if (!(${varName} instanceof Date) || ${varName}.getTime() > _refs[${i}]) ${ctx.fail('maxDate')};`;\n };\n\n (fn as any).ruleName = 'maxDate';\n (fn as any).requiresType = 'date';\n (fn as any).constraints = { max: date.toISOString() };\n\n return fn as EmittableRule;\n}\n",
|
|
16
|
-
"import { collectValidation } from '../collect';\nimport { minDate, maxDate } from '../rules/date';\nimport type { ValidationOptions } from '../interfaces';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Date Decorators (§1.1 Date)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** value >= date (inclusive, getTime 비교) */\nexport function MinDate(date: Date, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: minDate(date),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** value <= date (inclusive, getTime 비교) */\nexport function MaxDate(date: Date, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: maxDate(date),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n",
|
|
17
|
-
"import type { EmitContext, EmittableRule } from '../types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction makeStringRule(\n name: string,\n validate: (v: string) => boolean,\n buildEmit: (varName: string, ctx: EmitContext) => string,\n requiresType: 'string' | undefined = 'string',\n): EmittableRule {\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n return validate(value);\n };\n (fn as any).emit = buildEmit;\n (fn as any).ruleName = name;\n if (requiresType !== undefined) (fn as any).requiresType = requiresType;\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Group A: Length / Range\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function minLength(min: number): EmittableRule {\n const fn = (value: unknown): boolean =>\n typeof value === 'string' && value.length >= min;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName}.length < ${min}) ${ctx.fail('minLength')};`;\n (fn as any).ruleName = 'minLength';\n (fn as any).requiresType = 'string';\n (fn as any).constraints = { min };\n\n return fn as EmittableRule;\n}\n\nexport function maxLength(max: number): EmittableRule {\n const fn = (value: unknown): boolean =>\n typeof value === 'string' && value.length <= max;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName}.length > ${max}) ${ctx.fail('maxLength')};`;\n (fn as any).ruleName = 'maxLength';\n (fn as any).requiresType = 'string';\n (fn as any).constraints = { max };\n\n return fn as EmittableRule;\n}\n\nexport function length(minLen: number, maxLen: number): EmittableRule {\n const fn = (value: unknown): boolean =>\n typeof value === 'string' && value.length >= minLen && value.length <= maxLen;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName}.length < ${minLen} || ${varName}.length > ${maxLen}) ${ctx.fail('length')};`;\n (fn as any).ruleName = 'length';\n (fn as any).requiresType = 'string';\n (fn as any).constraints = { min: minLen, max: maxLen };\n\n return fn as EmittableRule;\n}\n\nexport function contains(seed: string): EmittableRule {\n const fn = (value: unknown): boolean =>\n typeof value === 'string' && value.includes(seed);\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(seed);\n return `if (${varName}.indexOf(_refs[${i}]) === -1) ${ctx.fail('contains')};`;\n };\n (fn as any).ruleName = 'contains';\n (fn as any).requiresType = 'string';\n (fn as any).constraints = { seed };\n\n return fn as EmittableRule;\n}\n\nexport function notContains(seed: string): EmittableRule {\n const fn = (value: unknown): boolean =>\n typeof value === 'string' && !value.includes(seed);\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(seed);\n return `if (${varName}.indexOf(_refs[${i}]) !== -1) ${ctx.fail('notContains')};`;\n };\n (fn as any).ruleName = 'notContains';\n (fn as any).requiresType = 'string';\n (fn as any).constraints = { seed };\n\n return fn as EmittableRule;\n}\n\nexport function matches(pattern: string | RegExp, modifiers?: string): EmittableRule {\n const re = pattern instanceof RegExp ? pattern : new RegExp(pattern, modifiers);\n\n const fn = (value: unknown): boolean =>\n typeof value === 'string' && re.test(value);\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRegex(re);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('matches')};`;\n };\n (fn as any).ruleName = 'matches';\n (fn as any).requiresType = 'string';\n (fn as any).constraints = { pattern: re.source };\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Group B: Simple Boolean Checks\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst _isLowercase = (value: unknown): boolean =>\n typeof value === 'string' && value === value.toLowerCase();\n\n(_isLowercase as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName} !== ${varName}.toLowerCase()) ${ctx.fail('isLowercase')};`;\n(_isLowercase as any).ruleName = 'isLowercase';\n(_isLowercase as any).requiresType = 'string';\n(_isLowercase as any).constraints = {};\nexport const isLowercase = _isLowercase as EmittableRule;\n\nconst _isUppercase = (value: unknown): boolean =>\n typeof value === 'string' && value === value.toUpperCase();\n\n(_isUppercase as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName} !== ${varName}.toUpperCase()) ${ctx.fail('isUppercase')};`;\n(_isUppercase as any).ruleName = 'isUppercase';\n(_isUppercase as any).requiresType = 'string';\n(_isUppercase as any).constraints = {};\nexport const isUppercase = _isUppercase as EmittableRule;\n\n// ASCII: all code points in [0x00, 0x7F]\nconst ASCII_RE = /^[\\x00-\\x7F]*$/;\nexport const isAscii = makeStringRule(\n 'isAscii',\n (v) => ASCII_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(ASCII_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isAscii')};`;\n },\n);\n(isAscii as any).constraints = {};\n\n// Alpha — default en-US locale singleton that also acts as factory\n// Usage: isAlpha('HelloWorld') → boolean OR isAlpha() → EmittableRule\nconst ALPHA_DEFAULT_RE = /^[a-zA-Z]+$/;\n\nfunction _alphaValidate(value: unknown): boolean {\n return typeof value === 'string' && value.length > 0 && ALPHA_DEFAULT_RE.test(value);\n}\n\n// The exported symbol is itself an EmittableRule (validates with default en-US)\n// but when called with no arguments returns itself (for factory-like usage)\nconst _isAlpha = function isAlpha(value?: unknown): boolean | EmittableRule {\n if (value === undefined) return isAlpha as unknown as EmittableRule;\n return _alphaValidate(value);\n} as unknown as EmittableRule;\n\n(_isAlpha as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRegex(ALPHA_DEFAULT_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isAlpha')};`;\n};\n(_isAlpha as any).ruleName = 'isAlpha';\n(_isAlpha as any).requiresType = 'string';\n(_isAlpha as any).constraints = {};\nexport const isAlpha = _isAlpha;\n\n// Alphanumeric — same dual pattern\nconst ALNUM_DEFAULT_RE = /^[a-zA-Z0-9]+$/;\n\nfunction _alnumValidate(value: unknown): boolean {\n return typeof value === 'string' && value.length > 0 && ALNUM_DEFAULT_RE.test(value);\n}\n\nconst _isAlphanumeric = function isAlphanumeric(value?: unknown): boolean | EmittableRule {\n if (value === undefined) return isAlphanumeric as unknown as EmittableRule;\n return _alnumValidate(value);\n} as unknown as EmittableRule;\n\n(_isAlphanumeric as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRegex(ALNUM_DEFAULT_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isAlphanumeric')};`;\n};\n(_isAlphanumeric as any).ruleName = 'isAlphanumeric';\n(_isAlphanumeric as any).requiresType = 'string';\n(_isAlphanumeric as any).constraints = {};\nexport const isAlphanumeric = _isAlphanumeric;\n\n// BooleanString: 'true' | 'false' | '1' | '0'\nconst _isBooleanString = (value: unknown): boolean =>\n value === 'true' || value === 'false' || value === '1' || value === '0';\n\n(_isBooleanString as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName} !== 'true' && ${varName} !== 'false' && ${varName} !== '1' && ${varName} !== '0') ${ctx.fail('isBooleanString')};`;\n(_isBooleanString as any).ruleName = 'isBooleanString';\n(_isBooleanString as any).requiresType = 'string';\n(_isBooleanString as any).constraints = {};\nexport const isBooleanString = _isBooleanString as EmittableRule;\n\nexport interface IsNumberStringOptions {\n no_symbols?: boolean;\n}\n\nexport function isNumberString(options?: IsNumberStringOptions): EmittableRule {\n const fn = makeStringRule(\n 'isNumberString',\n (v) => {\n if (v.length === 0) return false;\n const n = Number(v);\n return !isNaN(n) && isFinite(n);\n },\n (varName, ctx) => {\n // emit: ref-based (Number() conversion + NaN/Infinity check)\n const checkFn = (s: string): boolean => {\n if (s.length === 0) return false;\n const n = Number(s);\n return !isNaN(n) && isFinite(n);\n };\n const i = ctx.addRef(checkFn);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isNumberString')};`;\n },\n );\n (fn as any).constraints = {};\n return fn;\n}\n\nexport interface IsDecimalOptions {\n decimal_digits?: string;\n force_decimal?: boolean;\n locale?: string;\n}\n\nexport function isDecimal(options?: IsDecimalOptions): EmittableRule {\n const decimalRe = /^[-+]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)$/;\n const fn = makeStringRule(\n 'isDecimal',\n (v) => decimalRe.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(decimalRe);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isDecimal')};`;\n },\n );\n (fn as any).constraints = {};\n return fn;\n}\n\n// Full-width characters (Unicode fullwidth forms)\nconst FULLWIDTH_RE = /[^\\u0020-\\u007E\\uFF61-\\uFF9F]/;\nexport const isFullWidth = makeStringRule(\n 'isFullWidth',\n (v) => v.length > 0 && FULLWIDTH_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(FULLWIDTH_RE);\n return `if (${varName}.length === 0 || !_re[${i}].test(${varName})) ${ctx.fail('isFullWidth')};`;\n },\n);\n(isFullWidth as any).constraints = {};\n\n// Half-width characters\nconst HALFWIDTH_RE = /[\\u0020-\\u007E\\uFF61-\\uFF9F]/;\nexport const isHalfWidth = makeStringRule(\n 'isHalfWidth',\n (v) => v.length > 0 && HALFWIDTH_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(HALFWIDTH_RE);\n return `if (${varName}.length === 0 || !_re[${i}].test(${varName})) ${ctx.fail('isHalfWidth')};`;\n },\n);\n(isHalfWidth as any).constraints = {};\n\n// Variable-width: must contain both full-width AND half-width\nexport const isVariableWidth = makeStringRule(\n 'isVariableWidth',\n (v) => FULLWIDTH_RE.test(v) && HALFWIDTH_RE.test(v),\n (varName, ctx) => {\n const i1 = ctx.addRegex(FULLWIDTH_RE);\n const i2 = ctx.addRegex(HALFWIDTH_RE);\n return `if (!_re[${i1}].test(${varName}) || !_re[${i2}].test(${varName})) ${ctx.fail('isVariableWidth')};`;\n },\n);\n(isVariableWidth as any).constraints = {};\n\n// Multibyte: any character outside Latin-1 / half-width range\nconst MULTIBYTE_RE = /[^\\x00-\\xFF]/;\nexport const isMultibyte = makeStringRule(\n 'isMultibyte',\n (v) => v.length > 0 && MULTIBYTE_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(MULTIBYTE_RE);\n return `if (${varName}.length === 0 || !_re[${i}].test(${varName})) ${ctx.fail('isMultibyte')};`;\n },\n);\n(isMultibyte as any).constraints = {};\n\n// Surrogate pairs\nconst SURROGATE_RE = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/;\nexport const isSurrogatePair = makeStringRule(\n 'isSurrogatePair',\n (v) => v.length > 0 && SURROGATE_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(SURROGATE_RE);\n return `if (${varName}.length === 0 || !_re[${i}].test(${varName})) ${ctx.fail('isSurrogatePair')};`;\n },\n);\n(isSurrogatePair as any).constraints = {};\n\n// Hexadecimal\nconst HEX_RE = /^[0-9a-fA-F]+$/;\nexport const isHexadecimal = makeStringRule(\n 'isHexadecimal',\n (v) => HEX_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(HEX_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isHexadecimal')};`;\n },\n);\n(isHexadecimal as any).constraints = {};\n\n// Octal\nconst OCTAL_RE = /^(0[oO])?[0-7]+$/;\nexport const isOctal = makeStringRule(\n 'isOctal',\n (v) => v.length > 0 && OCTAL_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(OCTAL_RE);\n return `if (${varName}.length === 0 || !_re[${i}].test(${varName})) ${ctx.fail('isOctal')};`;\n },\n);\n(isOctal as any).constraints = {};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Group C: Regex-based\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Email — RFC 5322 simplified\nexport interface IsEmailOptions {\n allow_display_name?: boolean;\n allow_utf8_local_part?: boolean;\n require_tld?: boolean;\n}\n\nconst EMAIL_RE = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\\.[a-zA-Z]{2,}$/;\n\nexport function isEmail(_options?: IsEmailOptions): EmittableRule {\n const fn = makeStringRule(\n 'isEmail',\n (v) => EMAIL_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(EMAIL_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isEmail')};`;\n },\n );\n (fn as any).constraints = { format: 'email' };\n return fn;\n}\n\n// URL — RFC 3986 simplified\nexport interface IsURLOptions {\n protocols?: string[];\n require_tld?: boolean;\n require_protocol?: boolean;\n allow_underscores?: boolean;\n allow_trailing_dot?: boolean;\n allow_protocol_relative_urls?: boolean;\n}\n\nconst URL_PROTOCOLS_DEFAULT = ['http', 'https', 'ftp'];\n\nexport function isURL(options?: IsURLOptions): EmittableRule {\n const protocols = options?.protocols ?? URL_PROTOCOLS_DEFAULT;\n const protocolPattern = protocols.map(p => p.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('|');\n const re = new RegExp(\n `^(?:${protocolPattern}):\\\\/\\\\/(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)(?::\\\\d{1,5})?(?:\\\\/[^\\\\s]*)?$`,\n );\n\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string' || value.length === 0) return false;\n return re.test(value);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRegex(re);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isURL')};`;\n };\n (fn as any).ruleName = 'isURL';\n (fn as any).requiresType = 'string';\n (fn as any).constraints = { format: 'uri' };\n\n return fn as EmittableRule;\n}\n\n// UUID\nconst UUID_RE: Record<string | number, RegExp> = {\n all: /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/,\n 1: /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-1[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/,\n 2: /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-2[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/,\n 3: /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-3[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/,\n 4: /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/,\n 5: /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-5[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/,\n};\n\nexport function isUUID(version?: 1 | 2 | 3 | 4 | 5 | 'all'): EmittableRule {\n const re = (version != null ? (UUID_RE[version] ?? UUID_RE.all) : UUID_RE.all)!;\n const fn = makeStringRule(\n 'isUUID',\n (v) => re.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(re);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isUUID')};`;\n },\n );\n (fn as any).constraints = { format: 'uuid' };\n return fn;\n}\n\n// IP\nconst IPV4_RE = /^(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\.(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\.(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\.(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)$/;\nconst IPV6_RE = /^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|^::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,7}:$|^(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,5}(?::[0-9a-fA-F]{1,4}){1,2}$|^(?:[0-9a-fA-F]{1,4}:){1,4}(?::[0-9a-fA-F]{1,4}){1,3}$|^(?:[0-9a-fA-F]{1,4}:){1,3}(?::[0-9a-fA-F]{1,4}){1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,2}(?::[0-9a-fA-F]{1,4}){1,5}$|^[0-9a-fA-F]{1,4}:(?::[0-9a-fA-F]{1,4}){1,6}$|^::$|^::1$|^::(?:ffff(?::0{1,4})?:)?(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$|^(?:[0-9a-fA-F]{1,4}:){1,4}:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$/;\n\nexport function isIP(version?: 4 | 6): EmittableRule {\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n if (version === 4) return IPV4_RE.test(value);\n if (version === 6) return IPV6_RE.test(value);\n return IPV4_RE.test(value) || IPV6_RE.test(value);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n if (version === 4) {\n const i = ctx.addRegex(IPV4_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isIP')};`;\n }\n if (version === 6) {\n const i = ctx.addRegex(IPV6_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isIP')};`;\n }\n const i4 = ctx.addRegex(IPV4_RE);\n const i6 = ctx.addRegex(IPV6_RE);\n return `if (!_re[${i4}].test(${varName}) && !_re[${i6}].test(${varName})) ${ctx.fail('isIP')};`;\n };\n (fn as any).ruleName = 'isIP';\n (fn as any).requiresType = 'string';\n (fn as any).constraints = { version };\n\n return fn as EmittableRule;\n}\n\n// HexColor: #RGB or #RRGGBB\nconst HEX_COLOR_RE = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;\nexport const isHexColor = makeStringRule(\n 'isHexColor',\n (v) => HEX_COLOR_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(HEX_COLOR_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isHexColor')};`;\n },\n);\n(isHexColor as any).constraints = {};\n\n// RgbColor\nconst RGB_RE = /^rgb\\(\\s*(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\s*,\\s*(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\s*,\\s*(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\s*\\)$/;\nconst RGBA_RE = /^rgba\\(\\s*(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\s*,\\s*(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\s*,\\s*(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\s*,\\s*(0|0?\\.\\d+|1(\\.0+)?)\\s*\\)$/;\nconst RGB_PERCENT_RE = /^rgba?\\(\\s*(\\d{1,2}|100)%\\s*,\\s*(\\d{1,2}|100)%\\s*,\\s*(\\d{1,2}|100)%(?:\\s*,\\s*(0|0?\\.\\d+|1(?:\\.0+)?))?\\s*\\)$/;\n\nexport function isRgbColor(includePercentValues: boolean = false): EmittableRule {\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n if (includePercentValues) return RGB_PERCENT_RE.test(value);\n return RGB_RE.test(value) || RGBA_RE.test(value);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n if (includePercentValues) {\n const i = ctx.addRegex(RGB_PERCENT_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isRgbColor')};`;\n }\n const i1 = ctx.addRegex(RGB_RE);\n const i2 = ctx.addRegex(RGBA_RE);\n return `if (!_re[${i1}].test(${varName}) && !_re[${i2}].test(${varName})) ${ctx.fail('isRgbColor')};`;\n };\n (fn as any).ruleName = 'isRgbColor';\n (fn as any).requiresType = 'string';\n (fn as any).constraints = {};\n\n return fn as EmittableRule;\n}\n\n// HSL: hsl(H, S%, L%) or hsla(H, S%, L%, A)\nconst HSL_RE = /^hsla?\\(\\s*(360|3[0-5]\\d|[12]\\d{2}|[1-9]\\d|\\d)\\s*,\\s*(100|[1-9]\\d|\\d)%\\s*,\\s*(100|[1-9]\\d|\\d)%(?:\\s*,\\s*(0|0?\\.\\d+|1(?:\\.0+)?))?\\s*\\)$/;\nexport const isHSL = makeStringRule(\n 'isHSL',\n (v) => HSL_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(HSL_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isHSL')};`;\n },\n);\n(isHSL as any).constraints = {};\n\n// MAC Address\nexport interface IsMACAddressOptions {\n no_separators?: boolean;\n}\n\nconst MAC_COLON_RE = /^[0-9a-fA-F]{2}(?::[0-9a-fA-F]{2}){5}$/;\nconst MAC_HYPHEN_RE = /^[0-9a-fA-F]{2}(?:-[0-9a-fA-F]{2}){5}$/;\nconst MAC_NO_SEP_RE = /^[0-9a-fA-F]{12}$/;\n\nexport function isMACAddress(options?: IsMACAddressOptions): EmittableRule {\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n if (options?.no_separators) return MAC_NO_SEP_RE.test(value);\n return MAC_COLON_RE.test(value) || MAC_HYPHEN_RE.test(value);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n if (options?.no_separators) {\n const i = ctx.addRegex(MAC_NO_SEP_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isMACAddress')};`;\n }\n const i1 = ctx.addRegex(MAC_COLON_RE);\n const i2 = ctx.addRegex(MAC_HYPHEN_RE);\n return `if (!_re[${i1}].test(${varName}) && !_re[${i2}].test(${varName})) ${ctx.fail('isMACAddress')};`;\n };\n (fn as any).ruleName = 'isMACAddress';\n (fn as any).requiresType = 'string';\n (fn as any).constraints = {};\n\n return fn as EmittableRule;\n}\n\n// ISBN\nfunction _validateISBN10(str: string): boolean {\n const s = str.replace(/[-\\s]/g, '');\n if (!/^\\d{9}[\\dX]$/.test(s)) return false;\n let sum = 0;\n for (let i = 0; i < 9; i++) sum += (10 - i) * (s.charCodeAt(i) - 48);\n const last = s[9] === 'X' ? 10 : (s.charCodeAt(9) - 48);\n sum += last;\n return sum % 11 === 0;\n}\n\nfunction _validateISBN13(str: string): boolean {\n const s = str.replace(/[-\\s]/g, '');\n if (!/^\\d{13}$/.test(s)) return false;\n let sum = 0;\n for (let i = 0; i < 12; i++) {\n sum += (s.charCodeAt(i) - 48) * (i % 2 === 0 ? 1 : 3);\n }\n const check = (10 - (sum % 10)) % 10;\n return check === (s.charCodeAt(12) - 48);\n}\n\nexport function isISBN(version?: 10 | 13): EmittableRule {\n const validateFn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n if (version === 10) return _validateISBN10(value);\n if (version === 13) return _validateISBN13(value);\n return _validateISBN10(value) || _validateISBN13(value);\n };\n\n (validateFn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(validateFn);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isISBN')};`;\n };\n (validateFn as any).ruleName = 'isISBN';\n (validateFn as any).requiresType = 'string';\n (validateFn as any).constraints = {};\n\n return validateFn as EmittableRule;\n}\n\n// ISIN — ISO 6166\nconst ISIN_RE = /^[A-Z]{2}[A-Z0-9]{9}[0-9]$/;\n\nfunction _validateISINStr(v: string): boolean {\n if (!ISIN_RE.test(v)) return false;\n // Luhn mod10 on expanded digits\n const expanded = v\n .split('')\n .map((c) => {\n const code = c.charCodeAt(0);\n return code >= 65 ? String(code - 55) : c;\n })\n .join('');\n let sum = 0;\n let alternate = false;\n for (let i = expanded.length - 1; i >= 0; i--) {\n let n = parseInt(expanded[i]!, 10);\n if (alternate) {\n n *= 2;\n if (n > 9) n -= 9;\n }\n sum += n;\n alternate = !alternate;\n }\n return sum % 10 === 0;\n}\n\nexport const isISIN = makeStringRule(\n 'isISIN',\n _validateISINStr,\n (varName, ctx) => {\n const i = ctx.addRef(_validateISINStr);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isISIN')};`;\n },\n);\n(isISIN as any).constraints = {};\n\n// ISO 8601\nconst ISO8601_RE = /^\\d{4}(?:-\\d{2}(?:-\\d{2}(?:T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:?\\d{2})?)?)?)?$/;\n\nexport interface IsISO8601Options {\n strict?: boolean;\n}\n\n// Strict ISO8601: requires month/day to be valid values\nfunction _validateISO8601Strict(v: string): boolean {\n if (!ISO8601_RE.test(v)) return false;\n // Extract date components if present\n const m = v.match(/^(\\d{4})-(\\d{2})-(\\d{2})/);\n if (!m) return true; // year-only or year-month partial — still ok per regex\n const month = Number(m[2]);\n const day = Number(m[3]);\n if (month < 1 || month > 12) return false;\n const maxDay = new Date(Number(m[1]), month, 0).getDate();\n return day >= 1 && day <= maxDay;\n}\n\nexport function isISO8601(options?: IsISO8601Options): EmittableRule {\n if (options?.strict) {\n // strict: validate and emit use the same function ref to stay in sync\n const fn = (v: unknown): boolean => {\n if (typeof v !== 'string') return false;\n return _validateISO8601Strict(v);\n };\n (fn as any).ruleName = 'isISO8601';\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(fn);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isISO8601')};`;\n };\n (fn as any).constraints = { format: 'date-time' };\n return fn as unknown as EmittableRule;\n }\n // non-strict: both validate and emit use same ISO8601_RE\n const fn = makeStringRule(\n 'isISO8601',\n (v) => ISO8601_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(ISO8601_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isISO8601')};`;\n },\n );\n (fn as any).constraints = { format: 'date-time' };\n return fn;\n}\n\n// ISRC — ISO 3901\nconst ISRC_RE = /^[A-Z]{2}-[A-Z0-9]{3}-\\d{2}-\\d{5}$|^[A-Z]{2}[A-Z0-9]{3}\\d{7}$/;\nexport const isISRC = makeStringRule(\n 'isISRC',\n (v) => ISRC_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(ISRC_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isISRC')};`;\n },\n);\n(isISRC as any).constraints = {};\n\n// ISSN\nexport interface IsISSNOptions {\n case_sensitive?: boolean;\n requireHyphen?: boolean;\n}\n\nfunction _validateISSN(value: string, options?: IsISSNOptions): boolean {\n const requireHyphen = options?.requireHyphen !== false;\n const s = requireHyphen ? value : value.replace(/-/g, '');\n // Format with hyphen: NNNN-NNNX, without: NNNNNNXX\n const re = requireHyphen ? /^\\d{4}-\\d{3}[\\dX]$/ : /^\\d{7}[\\dX]$/;\n if (!re.test(s)) return false;\n const digits = s.replace(/-/g, '');\n let sum = 0;\n for (let i = 0; i < 7; i++) {\n sum += (8 - i) * (digits.charCodeAt(i) - 48);\n }\n const last = digits[7] === 'X' ? 10 : (digits.charCodeAt(7) - 48);\n sum += last;\n return sum % 11 === 0;\n}\n\nexport function isISSN(options?: IsISSNOptions): EmittableRule {\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n return _validateISSN(value, options);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(fn);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isISSN')};`;\n };\n (fn as any).ruleName = 'isISSN';\n (fn as any).requiresType = 'string';\n (fn as any).constraints = {};\n\n return fn as EmittableRule;\n}\n\n// JWT — 3-part dot-separated base64url\nconst JWT_RE = /^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+$/;\nexport const isJWT = makeStringRule(\n 'isJWT',\n (v) => JWT_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(JWT_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isJWT')};`;\n },\n);\n(isJWT as any).constraints = {};\n\n// LatLong\nexport interface IsLatLongOptions {\n checkDMS?: boolean;\n}\n\nconst LAT_LONG_RE = /^[-+]?([1-8]?\\d(?:\\.\\d+)?|90(?:\\.0+)?),\\s*[-+]?(180(?:\\.0+)?|1[0-7]\\d(?:\\.\\d+)?|\\d{1,2}(?:\\.\\d+)?)$/;\n\nexport function isLatLong(options?: IsLatLongOptions): EmittableRule {\n const fn = makeStringRule(\n 'isLatLong',\n (v) => LAT_LONG_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(LAT_LONG_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isLatLong')};`;\n },\n );\n (fn as any).constraints = {};\n return fn;\n}\n\n// Locale — BCP 47 simplified\nconst LOCALE_RE = /^[a-zA-Z]{2,3}(?:-[a-zA-Z]{4})?(?:-(?:[a-zA-Z]{2}|\\d{3}))?(?:-[a-zA-Z\\d]{5,8})*$/;\nexport const isLocale = makeStringRule(\n 'isLocale',\n (v) => LOCALE_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(LOCALE_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isLocale')};`;\n },\n);\n(isLocale as any).constraints = {};\n\n// DataURI\nconst DATA_URI_RE = /^data:([a-zA-Z0-9!#$&\\-^_]+\\/[a-zA-Z0-9!#$&\\-^_]+)(?:;[a-zA-Z0-9\\-]+=[a-zA-Z0-9\\-]+)*(?:;base64)?,[\\s\\S]*$/;\nexport const isDataURI = makeStringRule(\n 'isDataURI',\n (v) => DATA_URI_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(DATA_URI_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isDataURI')};`;\n },\n);\n(isDataURI as any).constraints = {};\n\n// FQDN\nexport interface IsFQDNOptions {\n require_tld?: boolean;\n allow_underscores?: boolean;\n allow_trailing_dot?: boolean;\n}\n\nexport function isFQDN(options?: IsFQDNOptions): EmittableRule {\n const requireTld = options?.require_tld !== false;\n\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n let str = value;\n if (options?.allow_trailing_dot && str.endsWith('.')) str = str.slice(0, -1);\n if (str.length === 0) return false;\n const parts = str.split('.');\n // Must have at least 2 parts (host + tld) when requireTld is true\n if (requireTld && parts.length < 2) return false;\n if (requireTld) {\n const tld = parts[parts.length - 1];\n if (!tld || tld.length < 2 || !/^[a-zA-Z]{2,}$/.test(tld)) return false;\n }\n return parts.every((part) => {\n if (part.length === 0 || part.length > 63) return false;\n if (options?.allow_underscores) return /^[a-zA-Z0-9_-]+$/.test(part);\n return /^[a-zA-Z0-9-]+$/.test(part) && !part.startsWith('-') && !part.endsWith('-');\n });\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(fn);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isFQDN')};`;\n };\n (fn as any).ruleName = 'isFQDN';\n (fn as any).requiresType = 'string';\n (fn as any).constraints = {};\n\n return fn as EmittableRule;\n}\n\n// Port — 0 to 65535\nconst PORT_RE = /^(?:6553[0-5]|655[0-2]\\d|65[0-4]\\d{2}|6[0-4]\\d{3}|[1-5]\\d{4}|[1-9]\\d{1,3}|\\d)$/;\nexport const isPort = makeStringRule(\n 'isPort',\n (v) => PORT_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(PORT_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isPort')};`;\n },\n);\n(isPort as any).constraints = {};\n\n// EAN (EAN-8 and EAN-13 with checksum)\nfunction _validateEAN(value: string): boolean {\n if (!/^\\d{8}$/.test(value) && !/^\\d{13}$/.test(value)) return false;\n const digits = value.split('').map(Number);\n const len = digits.length;\n let sum = 0;\n for (let i = 0; i < len - 1; i++) {\n sum += digits[i]! * (len === 8 ? (i % 2 === 0 ? 3 : 1) : (i % 2 === 0 ? 1 : 3));\n }\n const check = (10 - (sum % 10)) % 10;\n return check === digits[len - 1]!;\n}\n\nexport const isEAN = makeStringRule(\n 'isEAN',\n _validateEAN,\n (varName, ctx) => {\n const i = ctx.addRef(_validateEAN);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isEAN')};`;\n },\n);\n(isEAN as any).constraints = {};\n\n// ISO 3166-1 Alpha-2\nconst ISO31661A2_CODES = new Set([\n 'AD','AE','AF','AG','AI','AL','AM','AO','AQ','AR','AS','AT','AU','AW','AX','AZ',\n 'BA','BB','BD','BE','BF','BG','BH','BI','BJ','BL','BM','BN','BO','BQ','BR','BS','BT','BV','BW','BY','BZ',\n 'CA','CC','CD','CF','CG','CH','CI','CK','CL','CM','CN','CO','CR','CU','CV','CW','CX','CY','CZ',\n 'DE','DJ','DK','DM','DO','DZ','EC','EE','EG','EH','ER','ES','ET',\n 'FI','FJ','FK','FM','FO','FR','GA','GB','GD','GE','GF','GG','GH','GI','GL','GM','GN','GP','GQ','GR','GS','GT','GU','GW','GY',\n 'HK','HM','HN','HR','HT','HU','ID','IE','IL','IM','IN','IO','IQ','IR','IS','IT',\n 'JE','JM','JO','JP','KE','KG','KH','KI','KM','KN','KP','KR','KW','KY','KZ',\n 'LA','LB','LC','LI','LK','LR','LS','LT','LU','LV','LY',\n 'MA','MC','MD','ME','MF','MG','MH','MK','ML','MM','MN','MO','MP','MQ','MR','MS','MT','MU','MV','MW','MX','MY','MZ',\n 'NA','NC','NE','NF','NG','NI','NL','NO','NP','NR','NU','NZ',\n 'OM','PA','PE','PF','PG','PH','PK','PL','PM','PN','PR','PS','PT','PW','PY',\n 'QA','RE','RO','RS','RU','RW',\n 'SA','SB','SC','SD','SE','SG','SH','SI','SJ','SK','SL','SM','SN','SO','SR','SS','ST','SV','SX','SY','SZ',\n 'TC','TD','TF','TG','TH','TJ','TK','TL','TM','TN','TO','TR','TT','TV','TW','TZ',\n 'UA','UG','UM','US','UY','UZ','VA','VC','VE','VG','VI','VN','VU',\n 'WF','WS','YE','YT','ZA','ZM','ZW',\n]);\n\nconst _isISO31661Alpha2 = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n return ISO31661A2_CODES.has(value.toUpperCase());\n};\n\n(_isISO31661Alpha2 as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(ISO31661A2_CODES);\n return `if (!_refs[${i}].has(${varName}.toUpperCase())) ${ctx.fail('isISO31661Alpha2')};`;\n};\n(_isISO31661Alpha2 as any).ruleName = 'isISO31661Alpha2';\n(_isISO31661Alpha2 as any).requiresType = 'string';\n(_isISO31661Alpha2 as any).constraints = {};\nexport const isISO31661Alpha2 = _isISO31661Alpha2 as EmittableRule;\n\n// ISO 3166-1 Alpha-3\nconst ISO31661A3_CODES = new Set([\n 'ABW','AFG','AGO','AIA','ALA','ALB','AND','ANT','ARE','ARG','ARM','ASM','ATA','ATF','ATG','AUS','AUT','AZE',\n 'BDI','BEL','BEN','BES','BFA','BGD','BGR','BHR','BHS','BIH','BLM','BLR','BLZ','BMU','BOL','BRA','BRB','BRN','BTN','BVT','BWA',\n 'CAF','CAN','CCK','CHE','CHL','CHN','CIV','CMR','COD','COG','COK','COL','COM','CPV','CRI','CUB','CUW','CXR','CYM','CYP','CZE',\n 'DEU','DJI','DMA','DNK','DOM','DZA','ECU','EGY','ERI','ESH','ESP','EST','ETH',\n 'FIN','FJI','FLK','FRA','FRO','FSM','GAB','GBR','GEO','GGY','GHA','GIB','GIN','GLP','GMB','GNB','GNQ','GRC','GRD','GRL','GTM','GUF','GUM','GUY',\n 'HKG','HMD','HND','HRV','HTI','HUN','IDN','IMN','IND','IOT','IRL','IRN','IRQ','ISL','ISR','ITA',\n 'JAM','JEY','JOR','JPN','KAZ','KEN','KGZ','KHM','KIR','KNA','KOR','KWT',\n 'LAO','LBN','LBR','LBY','LCA','LIE','LKA','LSO','LTU','LUX','LVA',\n 'MAC','MAF','MAR','MCO','MDA','MDG','MDV','MEX','MHL','MKD','MLI','MLT','MMR','MNE','MNG','MNP','MOZ','MRT','MSR','MTQ','MUS','MWI','MYS','MYT',\n 'NAM','NCL','NER','NFK','NGA','NIC','NIU','NLD','NOR','NPL','NRU','NZL',\n 'OMN','PAK','PAN','PCN','PER','PHL','PLW','PNG','POL','PRI','PRK','PRT','PRY','PSE','PYF',\n 'QAT','REU','ROU','RUS','RWA',\n 'SAU','SDN','SEN','SGP','SGS','SHN','SJM','SLB','SLE','SLV','SMR','SOM','SPM','SRB','SSD','STP','SUR','SVK','SVN','SWE','SWZ','SXM','SYC','SYR',\n 'TCA','TCD','TGO','THA','TJK','TKL','TKM','TLS','TON','TTO','TUN','TUR','TUV','TWN','TZA',\n 'UGA','UKR','UMI','URY','USA','UZB','VAT','VCT','VEN','VGB','VIR','VNM','VUT',\n 'WLF','WSM','YEM','ZAF','ZMB','ZWE',\n]);\n\nconst _isISO31661Alpha3 = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n return ISO31661A3_CODES.has(value.toUpperCase());\n};\n\n(_isISO31661Alpha3 as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(ISO31661A3_CODES);\n return `if (!_refs[${i}].has(${varName}.toUpperCase())) ${ctx.fail('isISO31661Alpha3')};`;\n};\n(_isISO31661Alpha3 as any).ruleName = 'isISO31661Alpha3';\n(_isISO31661Alpha3 as any).requiresType = 'string';\n(_isISO31661Alpha3 as any).constraints = {};\nexport const isISO31661Alpha3 = _isISO31661Alpha3 as EmittableRule;\n\n// BIC / SWIFT code\nconst BIC_RE = /^[A-Z]{6}[A-Z0-9]{2}(?:[A-Z0-9]{3})?$/;\nexport const isBIC = makeStringRule(\n 'isBIC',\n (v) => BIC_RE.test(v.toUpperCase()),\n (varName, ctx) => {\n const i = ctx.addRegex(BIC_RE);\n return `if (!_re[${i}].test(${varName}.toUpperCase())) ${ctx.fail('isBIC')};`;\n },\n);\n(isBIC as any).constraints = {};\n\n// Firebase Push ID — 20 chars, base64url charset (-0-9A-Za-z_)\nconst FIREBASE_RE = /^[a-zA-Z0-9_-]{20}$/;\nexport const isFirebasePushId = makeStringRule(\n 'isFirebasePushId',\n (v) => FIREBASE_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(FIREBASE_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isFirebasePushId')};`;\n },\n);\n(isFirebasePushId as any).constraints = {};\n\n// SemVer — Semantic Versioning 2.0\nconst SEMVER_RE = /^(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-]+)*))?$/;\nexport const isSemVer = makeStringRule(\n 'isSemVer',\n (v) => SEMVER_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(SEMVER_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isSemVer')};`;\n },\n);\n(isSemVer as any).constraints = {};\n\n// MongoDB ObjectId — 24-char hex\nconst MONGO_ID_RE = /^[0-9a-fA-F]{24}$/;\nexport const isMongoId = makeStringRule(\n 'isMongoId',\n (v) => MONGO_ID_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(MONGO_ID_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isMongoId')};`;\n },\n);\n(isMongoId as any).constraints = {};\n\n// JSON\nconst _isJSON = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n try {\n JSON.parse(value);\n return true;\n } catch {\n return false;\n }\n};\n\n(_isJSON as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef((s: string) => {\n try { JSON.parse(s); return true; } catch { return false; }\n });\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isJSON')};`;\n};\n(_isJSON as any).ruleName = 'isJSON';\n(_isJSON as any).requiresType = 'string';\n(_isJSON as any).constraints = {};\nexport const isJSON = _isJSON as EmittableRule;\n\n// Base32\nconst BASE32_RE = /^[A-Z2-7]+=*$/i;\nconst BASE32_HEX_RE = /^[0-9A-V]+=*$/i;\n\nexport interface IsBase32Options {\n crockford?: boolean;\n}\n\nexport function isBase32(options?: IsBase32Options): EmittableRule {\n const re = BASE32_RE;\n const fn = makeStringRule(\n 'isBase32',\n (v) => {\n if (v.length === 0) return false;\n if (v.length % 8 !== 0) return false;\n return re.test(v);\n },\n (varName, ctx) => {\n const i = ctx.addRegex(re);\n return `if (${varName}.length === 0 || ${varName}.length % 8 !== 0 || !_re[${i}].test(${varName})) ${ctx.fail('isBase32')};`;\n },\n );\n (fn as any).constraints = {};\n return fn;\n}\n\n// Base58\nconst BASE58_RE = /^[1-9A-HJ-NP-Za-km-z]+$/;\nexport const isBase58 = makeStringRule(\n 'isBase58',\n (v) => BASE58_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(BASE58_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isBase58')};`;\n },\n);\n(isBase58 as any).constraints = {};\n\n// Base64\nconst BASE64_RE = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/;\nconst BASE64_URL_RE = /^[A-Za-z0-9_-]+={0,2}$/;\n\nexport interface IsBase64Options {\n urlSafe?: boolean;\n}\n\nexport function isBase64(options?: IsBase64Options): EmittableRule {\n const re = options?.urlSafe ? BASE64_URL_RE : BASE64_RE;\n const fn = makeStringRule(\n 'isBase64',\n (v) => {\n if (v.length === 0) return false;\n return re.test(v);\n },\n (varName, ctx) => {\n const i = ctx.addRegex(re);\n return `if (${varName}.length === 0 || !_re[${i}].test(${varName})) ${ctx.fail('isBase64')};`;\n },\n );\n (fn as any).constraints = {};\n return fn;\n}\n\n// DateString — ISO 8601 date only (YYYY-MM-DD)\nconst DATE_STRING_RE = /^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$/;\n\nexport interface IsDateStringOptions {\n strictMode?: boolean;\n}\n\nexport function isDateString(options?: IsDateStringOptions): EmittableRule {\n const fn = makeStringRule(\n 'isDateString',\n (v) => DATE_STRING_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(DATE_STRING_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isDateString')};`;\n },\n );\n (fn as any).constraints = {};\n return fn;\n}\n\n// MimeType\nconst MIME_TYPE_RE = /^(application|audio|font|image|message|model|multipart|text|video)\\/[a-zA-Z0-9][a-zA-Z0-9!#$&\\-^_.+]*(?:;.+)?$/;\nexport const isMimeType = makeStringRule(\n 'isMimeType',\n (v) => MIME_TYPE_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(MIME_TYPE_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isMimeType')};`;\n },\n);\n(isMimeType as any).constraints = {};\n\n// Currency\nexport interface IsCurrencyOptions {\n symbol?: string;\n require_symbol?: boolean;\n allow_space_after_symbol?: boolean;\n symbol_after_digits?: boolean;\n allow_negatives?: boolean;\n parens_for_negatives?: boolean;\n negative_sign_before_digits?: boolean;\n negative_sign_after_digits?: boolean;\n allow_negative_sign_placeholder?: boolean;\n thousands_separator?: string;\n decimal_separator?: string;\n allow_decimal?: boolean;\n require_decimal?: boolean;\n digits_after_decimal?: number[];\n allow_space_after_digits?: boolean;\n}\n\nconst CURRENCY_RE = /^[-+]?(?:[,.\\d]+)(?:[.,]\\d{2})?$|^\\$?-?(?:\\d+|\\d{1,3}(?:,\\d{3})*)(?:\\.\\d{1,2})?$/;\n\nexport function isCurrency(options?: IsCurrencyOptions): EmittableRule {\n const fn = makeStringRule(\n 'isCurrency',\n (v) => {\n if (v.length === 0) return false;\n return CURRENCY_RE.test(v);\n },\n (varName, ctx) => {\n const i = ctx.addRegex(CURRENCY_RE);\n return `if (${varName}.length === 0 || !_re[${i}].test(${varName})) ${ctx.fail('isCurrency')};`;\n },\n );\n (fn as any).constraints = {};\n return fn;\n}\n\n// Magnet URI\nconst MAGNET_URI_RE = /^magnet:\\?xt=urn:[a-z0-9]+:[a-z0-9]{32,40}/i;\nexport const isMagnetURI = makeStringRule(\n 'isMagnetURI',\n (v) => MAGNET_URI_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(MAGNET_URI_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isMagnetURI')};`;\n },\n);\n(isMagnetURI as any).constraints = {};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Group D: Algorithm-based\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Credit Card — Luhn algorithm (§4.8 C)\nfunction _luhn(str: string): boolean {\n const s = str.replace(/[\\s-]/g, '');\n if (s.length === 0 || !/^\\d+$/.test(s)) return false;\n let sum = 0;\n let alternate = false;\n for (let i = s.length - 1; i >= 0; i--) {\n let n = s.charCodeAt(i) - 48;\n if (alternate) {\n n *= 2;\n if (n > 9) n -= 9;\n }\n sum += n;\n alternate = !alternate;\n }\n return sum % 10 === 0;\n}\n\nconst _isCreditCard = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n return _luhn(value);\n};\n\n// emit: Luhn algorithm펼침 (§4.8 C 패턴)\n(_isCreditCard as any).emit = (varName: string, ctx: EmitContext): string => `{\n var _cs=${varName}.replace(/[\\\\s-]/g,'');\n if(_cs.length===0||!/^\\\\d+$/.test(_cs)){${ctx.fail('isCreditCard')}}\n else{var _sum=0,_alt=false;\n for(var _ci=_cs.length-1;_ci>=0;_ci--){var _cn=_cs.charCodeAt(_ci)-48;if(_alt){_cn*=2;if(_cn>9)_cn-=9;}_sum+=_cn;_alt=!_alt;}\n if(_sum%10!==0)${ctx.fail('isCreditCard')};}\n}`;\n(_isCreditCard as any).ruleName = 'isCreditCard';\n(_isCreditCard as any).requiresType = 'string';\n(_isCreditCard as any).constraints = {};\nexport const isCreditCard = _isCreditCard as EmittableRule;\n\n// IBAN — ISO 13616 mod-97\nexport interface IsIBANOptions {\n allowSpaces?: boolean;\n}\n\nconst IBAN_COUNTRY_LENGTH: Record<string, number> = {\n 'AD': 24, 'AE': 23, 'AL': 28, 'AT': 20, 'AZ': 28, 'BA': 20, 'BE': 16, 'BG': 22, 'BH': 22,\n 'BR': 29, 'CH': 21, 'CR': 22, 'CY': 28, 'CZ': 24, 'DE': 22, 'DK': 18, 'DO': 28, 'EE': 20,\n 'ES': 24, 'FI': 18, 'FO': 18, 'FR': 27, 'GB': 22, 'GE': 22, 'GI': 23, 'GL': 18, 'GR': 27,\n 'GT': 28, 'HR': 21, 'HU': 28, 'IE': 22, 'IL': 23, 'IS': 26, 'IT': 27, 'JO': 30, 'KW': 30,\n 'KZ': 20, 'LB': 28, 'LC': 32, 'LI': 21, 'LT': 20, 'LU': 20, 'LV': 21, 'MC': 27, 'MD': 24,\n 'ME': 22, 'MK': 19, 'MR': 27, 'MT': 31, 'MU': 30, 'NL': 18, 'NO': 15, 'PK': 24, 'PL': 28,\n 'PS': 29, 'PT': 25, 'QA': 29, 'RO': 24, 'RS': 22, 'SA': 24, 'SC': 31, 'SE': 24, 'SI': 19,\n 'SK': 24, 'SM': 27, 'ST': 25, 'SV': 28, 'TL': 23, 'TN': 24, 'TR': 26, 'UA': 29, 'VA': 22,\n 'VG': 24, 'XK': 20,\n};\n\nfunction _validateIBAN(value: string, options?: IsIBANOptions): boolean {\n let s = options?.allowSpaces ? value.replace(/\\s/g, '') : value;\n s = s.toUpperCase();\n if (!/^[A-Z]{2}\\d{2}[A-Z0-9]+$/.test(s)) return false;\n const country = s.slice(0, 2);\n const expectedLength = IBAN_COUNTRY_LENGTH[country];\n if (expectedLength !== undefined && s.length !== expectedLength) return false;\n // Rearrange: move first 4 chars to end\n const rearranged = s.slice(4) + s.slice(0, 4);\n // Convert letters to digits (A=10, B=11, ...)\n const numeric = rearranged.replace(/[A-Z]/g, (ch) => String(ch.charCodeAt(0) - 55));\n // Compute mod 97 on large number in chunks\n let remainder = 0;\n for (let i = 0; i < numeric.length; i += 7) {\n const chunk = String(remainder) + numeric.slice(i, i + 7);\n remainder = parseInt(chunk, 10) % 97;\n }\n return remainder === 1;\n}\n\nexport function isIBAN(options?: IsIBANOptions): EmittableRule {\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n return _validateIBAN(value, options);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(fn);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isIBAN')};`;\n };\n (fn as any).ruleName = 'isIBAN';\n (fn as any).requiresType = 'string';\n (fn as any).constraints = {};\n\n return fn as EmittableRule;\n}\n\n// ByteLength — counts UTF-8 bytes via Buffer.byteLength\nexport function isByteLength(min: number, max?: number): EmittableRule {\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n const byteLen = Buffer.byteLength(value, 'utf8');\n if (byteLen < min) return false;\n if (max !== undefined && byteLen > max) return false;\n return true;\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n // emit: ref-based (Buffer.byteLength is available in Bun and Node)\n const checkFn = (s: string): boolean => {\n const byteLen = Buffer.byteLength(s, 'utf8');\n if (byteLen < min) return false;\n if (max !== undefined && byteLen > max) return false;\n return true;\n };\n const i = ctx.addRef(checkFn);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isByteLength')};`;\n };\n (fn as any).ruleName = 'isByteLength';\n (fn as any).requiresType = 'string';\n (fn as any).constraints = {};\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Group E: New Validators\n// ─────────────────────────────────────────────────────────────────────────────\n\n// isHash — hash algorithm별 hex 정규식 (§4.8 B: 정규식 인라인)\n\nconst HASH_REGEXES: Record<string, RegExp> = {\n md5: /^[a-f0-9]{32}$/i,\n md4: /^[a-f0-9]{32}$/i,\n md2: /^[a-f0-9]{32}$/i,\n sha1: /^[a-f0-9]{40}$/i,\n sha256: /^[a-f0-9]{64}$/i,\n sha384: /^[a-f0-9]{96}$/i,\n sha512: /^[a-f0-9]{128}$/i,\n ripemd128: /^[a-f0-9]{32}$/i,\n ripemd160: /^[a-f0-9]{40}$/i,\n 'tiger128,3': /^[a-f0-9]{32}$/i,\n 'tiger128,4': /^[a-f0-9]{32}$/i,\n 'tiger160,3': /^[a-f0-9]{40}$/i,\n 'tiger160,4': /^[a-f0-9]{40}$/i,\n 'tiger192,3': /^[a-f0-9]{48}$/i,\n 'tiger192,4': /^[a-f0-9]{48}$/i,\n crc32: /^[a-f0-9]{8}$/i,\n crc32b: /^[a-f0-9]{8}$/i,\n};\n\nexport function isHash(algorithm: string): EmittableRule {\n const re = HASH_REGEXES[algorithm];\n\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n if (!re) return false;\n return re.test(value);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n if (!re) {\n // 알 수 없는 알고리즘 → 항상 실패\n return ctx.fail('isHash') + ';';\n }\n const i = ctx.addRegex(re);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isHash')};`;\n };\n (fn as any).ruleName = 'isHash';\n (fn as any).requiresType = 'string';\n (fn as any).constraints = {};\n\n return fn as EmittableRule;\n}\n\n// isRFC3339 — RFC 3339 datetime (§4.8 B)\n\nconst RFC3339_RE = /^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})$/i;\n\nexport const isRFC3339 = makeStringRule(\n 'isRFC3339',\n (v) => RFC3339_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(RFC3339_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isRFC3339')};`;\n },\n);\n(isRFC3339 as any).constraints = {};\n\n// isMilitaryTime — HH:MM 24시간 형식 (§4.8 B)\n\nconst MILITARY_TIME_RE = /^([01]\\d|2[0-3]):[0-5]\\d$/;\n\nexport const isMilitaryTime = makeStringRule(\n 'isMilitaryTime',\n (v) => MILITARY_TIME_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(MILITARY_TIME_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isMilitaryTime')};`;\n },\n);\n(isMilitaryTime as any).constraints = {};\n\n// isLatitude — string 또는 number, -90 ~ 90 (requiresType none)\n\nfunction _checkLatitude(value: unknown): boolean {\n if (typeof value === 'number') {\n return value >= -90 && value <= 90;\n }\n if (typeof value === 'string') {\n const n = parseFloat(value);\n if (isNaN(n)) return false;\n if (String(n) !== value && value !== String(n)) {\n // extra chars check — parseFloat('90abc') = 90 but should fail\n if (!/^-?\\d+(\\.\\d+)?$/.test(value)) return false;\n }\n return n >= -90 && n <= 90;\n }\n return false;\n}\n\nconst _isLatitude = (value: unknown): boolean => _checkLatitude(value);\n\n(_isLatitude as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(_checkLatitude);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isLatitude')};`;\n};\n(_isLatitude as any).ruleName = 'isLatitude';\n(_isLatitude as any).constraints = {};\n// requiresType = undefined — string|number 모두 처리\n\nexport const isLatitude = _isLatitude as EmittableRule;\n\n// isLongitude — string 또는 number, -180 ~ 180 (requiresType none)\n\nfunction _checkLongitude(value: unknown): boolean {\n if (typeof value === 'number') {\n return value >= -180 && value <= 180;\n }\n if (typeof value === 'string') {\n const n = parseFloat(value);\n if (isNaN(n)) return false;\n if (!/^-?\\d+(\\.\\d+)?$/.test(value)) return false;\n return n >= -180 && n <= 180;\n }\n return false;\n}\n\nconst _isLongitude = (value: unknown): boolean => _checkLongitude(value);\n\n(_isLongitude as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(_checkLongitude);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isLongitude')};`;\n};\n(_isLongitude as any).ruleName = 'isLongitude';\n(_isLongitude as any).constraints = {};\n// requiresType = undefined — string|number 모두 처리\n\nexport const isLongitude = _isLongitude as EmittableRule;\n\n// isEthereumAddress — 0x + 40 hex chars (§4.8 B)\n\nconst ETH_ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/;\n\nexport const isEthereumAddress = makeStringRule(\n 'isEthereumAddress',\n (v) => ETH_ADDRESS_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(ETH_ADDRESS_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isEthereumAddress')};`;\n },\n);\n(isEthereumAddress as any).constraints = {};\n\n// isBtcAddress — P2PKH (1...), P2SH (3...), bech32 (bc1...) (§4.8 B)\n\nconst BTC_P2PKH_RE = /^1[a-km-zA-HJ-NP-Z1-9]{25,34}$/;\nconst BTC_P2SH_RE = /^3[a-km-zA-HJ-NP-Z1-9]{25,34}$/;\nconst BTC_BECH32_RE = /^(bc1)[a-z0-9]{6,87}$/;\n\nexport const isBtcAddress = makeStringRule(\n 'isBtcAddress',\n (v) => BTC_P2PKH_RE.test(v) || BTC_P2SH_RE.test(v) || BTC_BECH32_RE.test(v),\n (varName, ctx) => {\n const i1 = ctx.addRegex(BTC_P2PKH_RE);\n const i2 = ctx.addRegex(BTC_P2SH_RE);\n const i3 = ctx.addRegex(BTC_BECH32_RE);\n return `if (!_re[${i1}].test(${varName}) && !_re[${i2}].test(${varName}) && !_re[${i3}].test(${varName})) ${ctx.fail('isBtcAddress')};`;\n },\n);\n(isBtcAddress as any).constraints = {};\n\n// isISO4217CurrencyCode — ISO 4217 통화 코드 집합 (§4.8 C: ref 기반)\n\nconst ISO4217_CODES = new Set([\n 'AED','AFN','ALL','AMD','ANG','AOA','ARS','AUD','AWG','AZN',\n 'BAM','BBD','BDT','BGN','BHD','BIF','BMD','BND','BOB','BOV',\n 'BRL','BSD','BTN','BWP','BYN','BZD','CAD','CDF','CHE','CHF',\n 'CHW','CLF','CLP','CNY','COP','COU','CRC','CUC','CUP','CVE',\n 'CZK','DJF','DKK','DOP','DZD','EGP','ERN','ETB','EUR','FJD',\n 'FKP','GBP','GEL','GHS','GIP','GMD','GNF','GTQ','GYD','HKD',\n 'HNL','HRK','HTG','HUF','IDR','ILS','INR','IQD','IRR','ISK',\n 'JMD','JOD','JPY','KES','KGS','KHR','KMF','KPW','KRW','KWD',\n 'KYD','KZT','LAK','LBP','LKR','LRD','LSL','LYD','MAD','MDL',\n 'MGA','MKD','MMK','MNT','MOP','MRU','MUR','MVR','MWK','MXN',\n 'MXV','MYR','MZN','NAD','NGN','NIO','NOK','NPR','NZD','OMR',\n 'PAB','PEN','PGK','PHP','PKR','PLN','PYG','QAR','RON','RSD',\n 'RUB','RWF','SAR','SBD','SCR','SDG','SEK','SGD','SHP','SLE',\n 'SLL','SOS','SRD','SSP','STN','SVC','SYP','SZL','THB','TJS',\n 'TMT','TND','TOP','TRY','TTD','TWD','TZS','UAH','UGX','USD',\n 'USN','UYI','UYU','UYW','UZS','VED','VES','VND','VUV','WST',\n 'XAF','XAG','XAU','XBA','XBB','XBC','XBD','XCD','XDR','XOF',\n 'XPD','XPF','XPT','XSU','XTS','XUA','YER','ZAR','ZMW','ZWL',\n]);\n\nexport const isISO4217CurrencyCode = makeStringRule(\n 'isISO4217CurrencyCode',\n (v) => ISO4217_CODES.has(v),\n (varName, ctx) => {\n const i = ctx.addRef(ISO4217_CODES);\n return `if (!_refs[${i}].has(${varName})) ${ctx.fail('isISO4217CurrencyCode')};`;\n },\n);\n(isISO4217CurrencyCode as any).constraints = {};\n\n// isPhoneNumber — E.164 국제 전화번호 (§4.8 B)\n\nconst PHONE_E164_RE = /^\\+[1-9]\\d{6,14}$/;\n\nexport const isPhoneNumber = makeStringRule(\n 'isPhoneNumber',\n (v) => PHONE_E164_RE.test(v),\n (varName, ctx) => {\n const i = ctx.addRegex(PHONE_E164_RE);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isPhoneNumber')};`;\n },\n);\n(isPhoneNumber as any).constraints = {};\n\n// isStrongPassword — 강력한 비밀번호 체크 (§4.8 C: factory)\n\nexport interface IsStrongPasswordOptions {\n minLength?: number;\n minLowercase?: number;\n minUppercase?: number;\n minNumbers?: number;\n minSymbols?: number;\n}\n\nexport function isStrongPassword(options?: IsStrongPasswordOptions): EmittableRule {\n const minLength = options?.minLength ?? 8;\n const minLower = options?.minLowercase ?? 1;\n const minUpper = options?.minUppercase ?? 1;\n const minNums = options?.minNumbers ?? 1;\n const minSymbols = options?.minSymbols ?? 1;\n\n const validate = (v: string): boolean => {\n if (v.length < minLength) return false;\n if (minLower > 0) {\n const cnt = (v.match(/[a-z]/g) || []).length;\n if (cnt < minLower) return false;\n }\n if (minUpper > 0) {\n const cnt = (v.match(/[A-Z]/g) || []).length;\n if (cnt < minUpper) return false;\n }\n if (minNums > 0) {\n const cnt = (v.match(/[0-9]/g) || []).length;\n if (cnt < minNums) return false;\n }\n if (minSymbols > 0) {\n const cnt = (v.match(/[^a-zA-Z0-9]/g) || []).length;\n if (cnt < minSymbols) return false;\n }\n return true;\n };\n\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n return validate(value);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(validate);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isStrongPassword')};`;\n };\n (fn as any).ruleName = 'isStrongPassword';\n (fn as any).requiresType = 'string';\n (fn as any).constraints = {};\n\n return fn as EmittableRule;\n}\n\n// isTaxId — 로케일별 세금 식별자 (§4.8 C: factory)\n\nconst TAX_ID_REGEXES: Record<string, RegExp> = {\n US: /^\\d{2}-\\d{7}$/, // EIN format: XX-XXXXXXX\n KR: /^\\d{3}-\\d{2}-\\d{5}$/, // 사업자등록번호: XXX-XX-XXXXX\n DE: /^\\d{11}$/, // Steuernummer: 11자리\n FR: /^[0-9]{13}$/, // SIRET: 13자리\n GB: /^\\d{10}$/, // UTR: 10자리\n IT: /^[A-Z]{6}\\d{2}[A-Z]\\d{2}[A-Z]\\d{3}[A-Z]$/i, // Codice Fiscale\n ES: /^[0-9A-Z]\\d{7}[0-9A-Z]$/i, // NIF/NIE/CIF\n AU: /^\\d{11}$/, // ABN: 11자리\n CA: /^\\d{9}$/, // BN: 9자리\n IN: /^[A-Z]{5}\\d{4}[A-Z]$/i, // PAN: XXXXX9999X\n};\n\nexport function isTaxId(locale: string): EmittableRule {\n const re = TAX_ID_REGEXES[locale];\n\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n if (!re) return false;\n return re.test(value);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n if (!re) {\n return ctx.fail('isTaxId') + ';';\n }\n const i = ctx.addRegex(re);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isTaxId')};`;\n };\n (fn as any).ruleName = 'isTaxId';\n (fn as any).requiresType = 'string';\n (fn as any).constraints = {};\n\n return fn as EmittableRule;\n}\n",
|
|
18
|
-
"import { collectValidation } from '../collect';\nimport {\n minLength, maxLength, length, contains, notContains, matches,\n isLowercase, isUppercase, isAscii, isAlpha, isAlphanumeric,\n isBooleanString, isNumberString, isDecimal, isFullWidth, isHalfWidth,\n isVariableWidth, isMultibyte, isSurrogatePair, isHexadecimal, isOctal,\n isEmail, isURL, isUUID, isIP, isHexColor, isRgbColor, isHSL, isMACAddress,\n isISBN, isISIN, isISO8601, isISRC, isISSN, isJWT, isLatLong, isLocale,\n isDataURI, isFQDN, isPort, isEAN, isISO31661Alpha2, isISO31661Alpha3,\n isBIC, isFirebasePushId, isSemVer, isMongoId, isJSON,\n isBase32, isBase58, isBase64, isDateString, isMimeType, isCurrency, isMagnetURI,\n isCreditCard, isIBAN, isByteLength,\n isHash, isRFC3339, isMilitaryTime, isLatitude, isLongitude,\n isEthereumAddress, isBtcAddress, isISO4217CurrencyCode, isPhoneNumber,\n isStrongPassword, isTaxId,\n} from '../rules/string';\nimport type {\n IsEmailOptions, IsURLOptions, IsBase32Options, IsBase64Options,\n IsDateStringOptions, IsCurrencyOptions, IsMACAddressOptions,\n IsIBANOptions, IsISSNOptions, IsFQDNOptions, IsLatLongOptions,\n IsISO8601Options, IsNumberStringOptions, IsDecimalOptions,\n IsStrongPasswordOptions,\n} from '../rules/string';\nimport type { ValidationOptions } from '../interfaces';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Re-export option types for decorator consumer convenience\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type {\n IsEmailOptions, IsURLOptions, IsBase32Options, IsBase64Options,\n IsDateStringOptions, IsCurrencyOptions, IsMACAddressOptions,\n IsIBANOptions, IsISSNOptions, IsFQDNOptions, IsLatLongOptions,\n IsISO8601Options, IsNumberStringOptions, IsDecimalOptions,\n IsStrongPasswordOptions,\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Group A: Length / Range\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function MinLength(min: number, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: minLength(min),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function MaxLength(max: number, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: maxLength(max),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function Length(min: number, max: number, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: length(min, max),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function Contains(seed: string, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: contains(seed),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function NotContains(seed: string, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: notContains(seed),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function Matches(pattern: string | RegExp, modifiers?: string, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: matches(pattern, modifiers),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Group B: Simple Boolean Checks\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function IsLowercase(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isLowercase, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsUppercase(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isUppercase, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsAscii(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isAscii, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsAlpha(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isAlpha, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsAlphanumeric(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isAlphanumeric, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsBooleanString(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isBooleanString, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsNumberString(numberOptions?: IsNumberStringOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isNumberString(numberOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsDecimal(decimalOptions?: IsDecimalOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isDecimal(decimalOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsFullWidth(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isFullWidth, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsHalfWidth(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isHalfWidth, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsVariableWidth(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isVariableWidth, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsMultibyte(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isMultibyte, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsSurrogatePair(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isSurrogatePair, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsHexadecimal(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isHexadecimal, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsOctal(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isOctal, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Group C: Internet / Format (options 있는 것들)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function IsEmail(emailOptions?: IsEmailOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isEmail(emailOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsURL(urlOptions?: IsURLOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isURL(urlOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsUUID(version?: 1 | 2 | 3 | 4 | 5 | 'all', options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isUUID(version),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsIP(version?: 4 | 6, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isIP(version),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsHexColor(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isHexColor, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsRgbColor(includePercentValues?: boolean, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isRgbColor(includePercentValues ?? false), each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsHSL(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isHSL, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsMACAddress(macOptions?: IsMACAddressOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isMACAddress(macOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsISBN(version?: 10 | 13, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isISBN(version),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsISIN(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isISIN, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsISO8601(isoOptions?: IsISO8601Options, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isISO8601(isoOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsISRC(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isISRC, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsISSN(issnOptions?: IsISSNOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isISSN(issnOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsJWT(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isJWT, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsLatLong(latLongOptions?: IsLatLongOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isLatLong(latLongOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsLocale(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isLocale, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsDataURI(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isDataURI, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsFQDN(fqdnOptions?: IsFQDNOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isFQDN(fqdnOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsPort(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isPort, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsEAN(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isEAN, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsISO31661Alpha2(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isISO31661Alpha2, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsISO31661Alpha3(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isISO31661Alpha3, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsBIC(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isBIC, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsFirebasePushId(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isFirebasePushId, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsSemVer(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isSemVer, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsMongoId(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isMongoId, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsJSON(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isJSON, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsBase32(base32Options?: IsBase32Options, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isBase32(base32Options),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsBase58(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isBase58, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsBase64(base64Options?: IsBase64Options, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isBase64(base64Options),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsDateString(dateOptions?: IsDateStringOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isDateString(dateOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsMimeType(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isMimeType, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsCurrency(currencyOptions?: IsCurrencyOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isCurrency(currencyOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsMagnetURI(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isMagnetURI, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsCreditCard(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isCreditCard, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsIBAN(ibanOptions?: IsIBANOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isIBAN(ibanOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsByteLength(min: number, max?: number, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isByteLength(min, max),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Group E: New Validators\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function IsHash(algorithm: string, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isHash(algorithm),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsRFC3339(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isRFC3339, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsMilitaryTime(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isMilitaryTime, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsLatitude(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isLatitude, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsLongitude(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isLongitude, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsEthereumAddress(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isEthereumAddress, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsBtcAddress(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isBtcAddress, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsISO4217CurrencyCode(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isISO4217CurrencyCode, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsPhoneNumber(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, { rule: isPhoneNumber, each: options?.each, groups: options?.groups, message: options?.message, context: options?.context });\n };\n}\n\nexport function IsStrongPassword(pwOptions?: IsStrongPasswordOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isStrongPassword(pwOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\nexport function IsTaxId(locale: string, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isTaxId(locale),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n",
|
|
19
|
-
"import type { EmitContext, EmittableRule } from '../types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// arrayContains(values) — 배열이 지정한 모든 값을 포함\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function arrayContains(values: unknown[]): EmittableRule {\n const fn = (value: unknown): boolean => {\n if (!Array.isArray(value)) return false;\n return values.every((v) => value.includes(v));\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(values);\n return `if (!_refs[${i}].every(function(v){return ${varName}.indexOf(v)!==-1;})) ${ctx.fail('arrayContains')};`;\n };\n (fn as any).ruleName = 'arrayContains';\n (fn as any).constraints = { values: values };\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// arrayNotContains(values) — 배열이 지정한 값을 포함하지 않음\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function arrayNotContains(values: unknown[]): EmittableRule {\n const fn = (value: unknown): boolean => {\n if (!Array.isArray(value)) return false;\n return values.every((v) => !value.includes(v));\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(values);\n return `if (_refs[${i}].some(function(v){return ${varName}.indexOf(v)!==-1;})) ${ctx.fail('arrayNotContains')};`;\n };\n (fn as any).ruleName = 'arrayNotContains';\n (fn as any).constraints = { values: values };\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// arrayMinSize(min) — 배열 최소 길이\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function arrayMinSize(min: number): EmittableRule {\n const fn = (value: unknown): boolean =>\n Array.isArray(value) && value.length >= min;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName}.length < ${min}) ${ctx.fail('arrayMinSize')};`;\n (fn as any).ruleName = 'arrayMinSize';\n (fn as any).constraints = { min: min };\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// arrayMaxSize(max) — 배열 최대 길이\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function arrayMaxSize(max: number): EmittableRule {\n const fn = (value: unknown): boolean =>\n Array.isArray(value) && value.length <= max;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName}.length > ${max}) ${ctx.fail('arrayMaxSize')};`;\n (fn as any).ruleName = 'arrayMaxSize';\n (fn as any).constraints = { max: max };\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// arrayUnique(identifier?) — 배열 내 중복 없음\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function arrayUnique(identifier?: (val: unknown) => unknown): EmittableRule {\n const fn = (value: unknown): boolean => {\n if (!Array.isArray(value)) return false;\n if (identifier) {\n const keys = value.map(identifier);\n return new Set(keys).size === keys.length;\n }\n return new Set(value).size === value.length;\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n if (identifier) {\n const i = ctx.addRef(identifier);\n return `{var _keys=${varName}.map(_refs[${i}]);if(new Set(_keys).size!==_keys.length)${ctx.fail('arrayUnique')};}`;\n }\n return `if(new Set(${varName}).size!==${varName}.length)${ctx.fail('arrayUnique')};`;\n };\n (fn as any).ruleName = 'arrayUnique';\n (fn as any).constraints = {};\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// arrayNotEmpty — 배열이 비어있지 않음 (singleton)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst _arrayNotEmpty = (value: unknown): boolean =>\n Array.isArray(value) && value.length > 0;\n\n(_arrayNotEmpty as any).emit = (varName: string, ctx: EmitContext): string =>\n `if (${varName}.length === 0) ${ctx.fail('arrayNotEmpty')};`;\n(_arrayNotEmpty as any).ruleName = 'arrayNotEmpty';\n(_arrayNotEmpty as any).constraints = {};\nexport const arrayNotEmpty = _arrayNotEmpty as EmittableRule;\n",
|
|
20
|
-
"import { collectValidation } from '../collect';\nimport {\n arrayContains, arrayNotContains, arrayMinSize, arrayMaxSize,\n arrayUnique, arrayNotEmpty,\n} from '../rules/array';\nimport type { ValidationOptions } from '../interfaces';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Array Decorators (§1.1 Array)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** 배열이 지정한 모든 값을 포함 */\nexport function ArrayContains(values: unknown[], options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: arrayContains(values),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** 배열이 지정한 값을 포함하지 않음 */\nexport function ArrayNotContains(values: unknown[], options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: arrayNotContains(values),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** 배열 최소 길이 */\nexport function ArrayMinSize(min: number, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: arrayMinSize(min),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** 배열 최대 길이 */\nexport function ArrayMaxSize(max: number, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: arrayMaxSize(max),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** 배열에 중복 값 없음 */\nexport function ArrayUnique(identifier?: (o: unknown) => unknown, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: arrayUnique(identifier),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** 배열이 비어있지 않음 */\nexport function ArrayNotEmpty(options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: arrayNotEmpty,\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n",
|
|
21
|
-
"import type { EmitContext, EmittableRule } from '../types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isNotEmptyObject(options?) — 빈 객체가 아님 (최소 1개의 key)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface IsNotEmptyObjectOptions {\n /** null/undefined 값을 가진 키를 무시할지 여부 (기본: false → 무시하지 않음) */\n nullable?: boolean;\n}\n\nexport function isNotEmptyObject(options?: IsNotEmptyObjectOptions): EmittableRule {\n const fn = (value: unknown): boolean => {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return false;\n const keys = Object.keys(value as object);\n if (options?.nullable) {\n return keys.some((k) => (value as Record<string, unknown>)[k] != null);\n }\n return keys.length > 0;\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n if (options?.nullable) {\n const i = ctx.addRef(fn);\n return `if (!_refs[${i}](${varName})) ${ctx.fail('isNotEmptyObject')};`;\n }\n return `if (Object.keys(${varName}).length === 0) ${ctx.fail('isNotEmptyObject')};`;\n };\n (fn as any).ruleName = 'isNotEmptyObject';\n (fn as any).constraints = { nullable: options?.nullable };\n\n return fn as EmittableRule;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// isInstance(targetType) — 특정 클래스 인스턴스인지 확인\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function isInstance(targetType: new (...args: any[]) => any): EmittableRule {\n const fn = (value: unknown): boolean => value instanceof targetType;\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n const i = ctx.addRef(targetType);\n return `if (!(${varName} instanceof _refs[${i}])) ${ctx.fail('isInstance')};`;\n };\n (fn as any).ruleName = 'isInstance';\n (fn as any).constraints = { type: targetType.name };\n\n return fn as EmittableRule;\n}\n",
|
|
22
|
-
"import { collectValidation } from '../collect';\nimport { isNotEmptyObject, isInstance } from '../rules/object';\nimport type { IsNotEmptyObjectOptions } from '../rules/object';\nimport type { ValidationOptions } from '../interfaces';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Object Decorators (§1.1 Object)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 빈 객체가 아님 (최소 1개의 key).\n * nullable: true이면 null/undefined 값을 가진 키를 무시.\n */\nexport function IsNotEmptyObject(objectOptions?: IsNotEmptyObjectOptions, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isNotEmptyObject(objectOptions),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** value instanceof targetType */\nexport function IsInstance(targetType: new (...args: any[]) => any, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isInstance(targetType),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n",
|
|
23
|
-
"import { collectExpose, collectExclude, collectTransform, collectType } from '../collect';\nimport type { ExcludeDef, ExposeDef, TransformFunction, TypeDef } from '../types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Option Types (§1.2, §1.5 방향 옵션)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface ExposeOptions {\n /** 출력 측 키 매핑 이름. deserialize/serialize 방향에 따라 다르게 설정 가능. */\n name?: string;\n /** 이 @Expose가 적용되는 groups. */\n groups?: string[];\n /** true: deserialize 방향에만 적용 (class-transformer toClassOnly 대응) */\n deserializeOnly?: boolean;\n /** true: serialize 방향에만 적용 (class-transformer toPlainOnly 대응) */\n serializeOnly?: boolean;\n}\n\nexport interface ExcludeOptions {\n /** true: deserialize 방향에만 제외 */\n deserializeOnly?: boolean;\n /** true: serialize 방향에만 제외 */\n serializeOnly?: boolean;\n}\n\nexport interface TransformOptions {\n /** 이 @Transform이 적용되는 groups */\n groups?: string[];\n /** true: deserialize 방향에만 적용 */\n deserializeOnly?: boolean;\n /** true: serialize 방향에만 적용 */\n serializeOnly?: boolean;\n}\n\nexport interface TypeOptions {\n /** discriminator 설정 — 다형성 지원 (§8) */\n discriminator?: {\n property: string;\n subTypes: { value: Function; name: string }[];\n };\n /** discriminator 프로퍼티를 결과 객체에 유지할지 여부 */\n keepDiscriminatorProperty?: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Transform Decorators (§1.2)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 필드를 baker에 등록하고 선택적으로 name 매핑/groups/방향 제어를 수행.\n *\n * 복수 @Expose 스택 지원 — 방향별 다른 name 매핑에 활용:\n * @Expose({ name: 'user_name', deserializeOnly: true })\n * @Expose({ name: 'userName', serializeOnly: true })\n *\n * @Expose와 @Exclude 동시 적용 시 @Exclude 우선 (§1.2).\n */\nexport function Expose(options?: ExposeOptions): PropertyDecorator {\n return (target, key) => {\n collectExpose(target as object, key as string, (options ?? {}) as ExposeDef);\n };\n}\n\n/**\n * 필드를 serialize/deserialize 결과에서 제외.\n * @Exclude({ deserializeOnly: true }) — deserialize 방향만 제외\n * @Exclude({ serializeOnly: true }) — serialize 방향만 제외\n * @Exclude() — 양방향 제외\n *\n * @Expose와 동시 적용 시 @Exclude 우선 (§1.2).\n */\nexport function Exclude(options?: ExcludeOptions): PropertyDecorator {\n return (target, key) => {\n collectExclude(target as object, key as string, (options ?? {}) as ExcludeDef);\n };\n}\n\n/**\n * 커스텀 변환 함수 적용.\n * - TransformParams.type === 'deserialize' | 'serialize'로 방향 구분 가능\n * - 명시적 @Transform이 있으면 enableImplicitConversion 건너뜀 (§4.3 ⑤)\n */\nexport function Transform(fn: TransformFunction, options?: TransformOptions): PropertyDecorator {\n return (target, key) => {\n collectTransform(target as object, key as string, {\n fn,\n options: options ? {\n groups: options.groups,\n deserializeOnly: options.deserializeOnly,\n serializeOnly: options.serializeOnly,\n } : undefined,\n });\n };\n}\n\n/**\n * 중첩 객체의 타입을 지정. discriminator 다형성 지원.\n * @ValidateNested와 함께 사용 시 중첩 DTO 재귀 검증 활성화.\n * builder 트리거 조건: meta.type !== null && meta.flags.validateNested === true\n */\nexport function Type(fn: () => Function, options?: TypeOptions): PropertyDecorator {\n return (target, key) => {\n collectType(target as object, key as string, {\n fn: fn as TypeDef['fn'],\n discriminator: options?.discriminator,\n keepDiscriminatorProperty: options?.keepDiscriminatorProperty,\n });\n };\n}\n",
|
|
24
|
-
"import { collectSchema, collectClassSchema } from '../collect';\nimport type { JsonSchema202012 } from '../types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// @Schema() — JSON Schema 메타데이터 데코레이터 (§6.5, §6.6, §6.8)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 객체 리터럴: ClassDecorator & PropertyDecorator.\n * 프로퍼티 레벨에서는 자동 매핑 결과를 오버라이드/보충.\n * 클래스 레벨에서는 루트 스키마에 title, description, $id 등 병합.\n */\nexport function Schema(schema: JsonSchema202012): ClassDecorator & PropertyDecorator;\n/**\n * 함수형: PropertyDecorator 전용.\n * `auto` 파라미터로 자동 매핑 결과를 받아 완전한 제어 가능.\n * toJsonSchema() 호출 시점에 실행된다 (데코레이터 시점이 아님).\n */\nexport function Schema(fn: (auto: JsonSchema202012) => JsonSchema202012): PropertyDecorator;\nexport function Schema(\n schemaOrFn: JsonSchema202012 | ((auto: JsonSchema202012) => JsonSchema202012),\n): any {\n return (target: any, key?: string | symbol) => {\n if (key !== undefined) {\n // Property decorator\n collectSchema(target as object, key as string, schemaOrFn as any);\n } else {\n // Class decorator — 함수형 불허\n if (typeof schemaOrFn === 'function') {\n throw new Error('@Schema(fn) function form is not supported at class level');\n }\n collectClassSchema(target as Function, schemaOrFn as Record<string, unknown>);\n }\n };\n}\n",
|
|
25
|
-
"import type { EmitContext, EmittableRule } from '../types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Locale-specific Validators\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ─── isMobilePhone ────────────────────────────────────────────────────────────\n\nconst MOBILE_PHONE_REGEXES: Record<string, RegExp> = {\n 'ko-KR': /^(\\+?82|0)1[016789]\\d{7,8}$/,\n 'en-US': /^\\+?1?[2-9]\\d{2}[2-9]\\d{6}$/,\n 'zh-CN': /^(\\+?86)?1[3-9]\\d{9}$/,\n 'zh-TW': /^(\\+?886)?9\\d{8}$/,\n 'ja-JP': /^(\\+?81)?0?[789]0[0-9]{8}$/,\n 'de-DE': /^(\\+?49)?1(5\\d|6[0-9]|7[0-9])\\d{8}$/,\n 'fr-FR': /^(\\+?33)?[67]\\d{8}$/,\n 'en-GB': /^(\\+?44)?7[1-9]\\d{8}$/,\n 'ru-RU': /^(\\+?7)?9\\d{9}$/,\n 'pt-BR': /^(\\+?55)?[1-9]{2}9?\\d{8}$/,\n 'in-IN': /^(\\+?91)?[6-9]\\d{9}$/,\n 'ar-SA': /^(\\+?966)?5\\d{8}$/,\n 'ar-EG': /^(\\+?20)?1[0125]\\d{8}$/,\n 'vi-VN': /^(\\+?84)?[35789]\\d{8}$/,\n 'th-TH': /^(\\+?66)?[689]\\d{8}$/,\n 'id-ID': /^(\\+?62)?8\\d{9,11}$/,\n 'ms-MY': /^(\\+?60)?1\\d{8,9}$/,\n 'nl-NL': /^(\\+?31)?6\\d{8}$/,\n 'it-IT': /^(\\+?39)?3\\d{9}$/,\n 'es-ES': /^(\\+?34)?[67]\\d{8}$/,\n 'pl-PL': /^(\\+?48)?[45789]\\d{8}$/,\n};\n\nexport function isMobilePhone(locale: string): EmittableRule {\n const re = MOBILE_PHONE_REGEXES[locale];\n\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n if (!re) return false;\n return re.test(value);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n if (!re) {\n return ctx.fail('isMobilePhone') + ';';\n }\n const i = ctx.addRegex(re);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isMobilePhone')};`;\n };\n (fn as any).ruleName = 'isMobilePhone';\n (fn as any).requiresType = 'string';\n (fn as any).constraints = { locale };\n\n return fn as EmittableRule;\n}\n\n// ─── isPostalCode ─────────────────────────────────────────────────────────────\n\nconst POSTAL_CODE_REGEXES: Record<string, RegExp> = {\n AD: /^AD\\d{3}$/,\n AT: /^\\d{4}$/,\n AU: /^\\d{4}$/,\n AZ: /^\\d{4}$/,\n BE: /^\\d{4}$/,\n BG: /^\\d{4}$/,\n BR: /^\\d{5}-?\\d{3}$/,\n BY: /^\\d{6}$/,\n CA: /^[ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJ-NPRSTV-Z] ?\\d[ABCEGHJ-NPRSTV-Z]\\d$/i,\n CH: /^\\d{4}$/,\n CN: /^\\d{6}$/,\n CZ: /^\\d{3} ?\\d{2}$/,\n DE: /^\\d{5}$/,\n DK: /^\\d{4}$/,\n EE: /^\\d{5}$/,\n ES: /^\\d{5}$/,\n FI: /^\\d{5}$/,\n FR: /^\\d{2} ?\\d{3}$/,\n GB: /^(GIR ?0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]([0-9ABEHMNPRV-Y])?)|[0-9][A-HJKPSTUW]) ?[0-9][ABD-HJLNP-UW-Z]{2})$/i,\n GR: /^\\d{3} ?\\d{2}$/,\n HR: /^\\d{5}$/,\n HU: /^\\d{4}$/,\n ID: /^\\d{5}$/,\n IL: /^\\d{5}(\\d{2})?$/,\n IN: /^\\d{6}$/,\n IS: /^\\d{3}$/,\n IT: /^\\d{5}$/,\n JP: /^\\d{3}-?\\d{4}$/,\n KR: /^\\d{5}$/,\n LI: /^(948[5-9]|949[0-7])$/,\n LT: /^LT-\\d{5}$/,\n LU: /^\\d{4}$/,\n LV: /^LV-\\d{4}$/,\n MX: /^\\d{5}$/,\n MT: /^[A-Z]{3} ?\\d{4}$/i,\n MZ: /^\\d{4}$/,\n NL: /^\\d{4} ?[A-Z]{2}$/i,\n NO: /^\\d{4}$/,\n NP: /^\\d{5}$/,\n NZ: /^\\d{4}$/,\n PH: /^\\d{4}$/,\n PK: /^\\d{5}$/,\n PL: /^\\d{2}-\\d{3}$/,\n PR: /^009\\d{2}([ -]\\d{4})?$/,\n PT: /^\\d{4}-\\d{3}$/,\n RO: /^\\d{6}$/,\n RU: /^\\d{6}$/,\n SE: /^\\d{3} ?\\d{2}$/,\n SG: /^\\d{6}$/,\n SI: /^\\d{4}$/,\n SK: /^\\d{3} ?\\d{2}$/,\n TH: /^\\d{5}$/,\n TN: /^\\d{4}$/,\n TW: /^\\d{3}(\\d{2})?$/,\n UA: /^\\d{5}$/,\n US: /^\\d{5}(-\\d{4})?$/,\n ZA: /^\\d{4}$/,\n ZM: /^\\d{5}$/,\n};\n\nexport function isPostalCode(locale: string): EmittableRule {\n const re = POSTAL_CODE_REGEXES[locale];\n\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n if (!re) return false;\n return re.test(value);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n if (!re) {\n return ctx.fail('isPostalCode') + ';';\n }\n const i = ctx.addRegex(re);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isPostalCode')};`;\n };\n (fn as any).ruleName = 'isPostalCode';\n (fn as any).requiresType = 'string';\n (fn as any).constraints = { locale };\n\n return fn as EmittableRule;\n}\n\n// ─── isIdentityCard ───────────────────────────────────────────────────────────\n\nconst IDENTITY_CARD_REGEXES: Record<string, RegExp> = {\n AF: /^\\d{8}$/,\n AL: /^[A-Z]\\d{8}[A-Z]$/i,\n AR: /^\\d{7,8}$/,\n AZ: /^AZE\\d{8}$/,\n BE: /^\\d{11}$/,\n BG: /^\\d{10}$/,\n BR: /^\\d{9}$/,\n BY: /^[A-Z]{2}\\d{7}$/i,\n CA: /^\\d{9}$/,\n CH: /^756\\d{10}$/,\n CN: /^\\d{15}(\\d{2}[0-9xX])?$/,\n CY: /^\\d{7}[A-Z]$/i,\n CZ: /^\\d{9,10}$/,\n DE: /^[LI TOUAEVBMNPRSZDFGHCK]{9}$/i,\n DK: /^\\d{10}$/,\n EE: /^\\d{11}$/,\n ES: /^[0-9X-Z]\\d{7}[TRWAGMYFPDXBNJZSQVHLCKE]$/i,\n FI: /^\\d{6}[+-A]\\d{3}[0-9A-FHJ-NPR-Y]$/,\n FR: /^\\d{8,9}[0-9Á-ÿ]{1}$/i,\n GB: /^[A-Z]{2}\\d{6}[A-Z]$/i,\n GR: /^[A-Z]{2}\\d{6}$/i,\n HR: /^\\d{11}$/,\n HU: /^\\d{8}[A-Z]{2}$/i,\n ID: /^\\d{16}$/,\n IE: /^\\d{7}[A-W][A-W]?$/, \n IL: /^\\d{9}$/,\n IN: /^\\d{12}$/,\n IR: /^\\d{10}$/,\n IS: /^\\d{10}$/,\n IT: /^[A-Z]{6}\\d{2}[A-Z]\\d{2}[A-Z]\\d{3}[A-Z]$/i,\n JP: /^\\d{12}$/,\n KR: /^\\d{6}-\\d{7}$/,\n LT: /^\\d{11}$/,\n LU: /^\\d{13}$/,\n LV: /^\\d{6}-\\d{5}$/,\n MK: /^\\d{13}$/,\n MX: /^[A-Z]{4}\\d{6}[HM][A-Z]{2}[B-DF-HJ-NP-TV-Z]{3}[A-Z0-9]\\d$/i,\n MT: /^\\d{7}[A-Z]$/i,\n NL: /^\\d{9}$/,\n NO: /^\\d{11}$/,\n PL: /^\\d{11}$/,\n PT: /^[1-9]\\d{7}[0-9TV]$/i,\n RO: /^\\d{13}$/,\n RS: /^\\d{13}$/,\n RU: /^\\d{10}$/,\n SE: /^\\d{10,12}$/,\n SI: /^\\d{13}$/,\n SK: /^\\d{9,10}$/,\n TH: /^\\d{13}$/,\n TR: /^\\d{11}$/,\n TW: /^[A-Z]\\d{9}$/i,\n UA: /^\\d{9}$/,\n US: /^\\d{3}-\\d{2}-\\d{4}$/,\n ZA: /^\\d{13}$/,\n};\n\nexport function isIdentityCard(locale: string): EmittableRule {\n const re = IDENTITY_CARD_REGEXES[locale];\n\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n if (!re) return false;\n return re.test(value);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n if (!re) {\n return ctx.fail('isIdentityCard') + ';';\n }\n const i = ctx.addRegex(re);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isIdentityCard')};`;\n };\n (fn as any).ruleName = 'isIdentityCard';\n (fn as any).requiresType = 'string';\n (fn as any).constraints = { locale };\n\n return fn as EmittableRule;\n}\n\n// ─── isPassportNumber ─────────────────────────────────────────────────────────\n\nconst PASSPORT_REGEXES: Record<string, RegExp> = {\n AM: /^[A-Z]{2}\\d{7}$/i,\n AR: /^[A-Z]{3}\\d{6}$/i,\n AT: /^[A-Z]\\d{7}$/i,\n AU: /^[A-Z]\\d{7}$/i,\n AZ: /^[Aa]\\d{8}$/,\n BE: /^[A-Z]{2}\\d{6}$/i,\n BG: /^\\d{9}$/,\n BH: /^[A-Z]{2}\\d{6}$/i,\n BR: /^[A-Z]{2}\\d{6}$/i,\n BY: /^[A-Z]{2}\\d{7}$/i,\n CA: /^[A-Z]{2}\\d{6}$/i,\n CH: /^[A-Z]\\d{7}$/i,\n CN: /^G\\d{8}$/,\n CY: /^[A-Z](\\d{6}|\\d{8})$/i,\n CZ: /^\\d{8}$/,\n DE: /^[CFGHJKLMNPRTVWXYZ0-9]{9}$/i,\n DK: /^\\d{9}$/,\n EE: /^([A-Z]\\d{7}|[A-Z]{2}\\d{7})$/i,\n ES: /^[A-Z0-9]{2}([A-Z0-9]?)\\d{6}$/i,\n FI: /^[A-Z]{2}\\d{7}$/i,\n FR: /[A-Z0-9]{9}/i,\n GB: /^\\d{9}$/,\n GR: /^[A-Z]{2}\\d{7}$/i,\n HR: /^\\d{9}$/,\n HU: /^[A-Z]{2}(\\d{6}|\\d{7})$/i,\n ID: /^[A-C]\\d{7}$/i,\n IE: /^[A-Z0-9]{2}\\d{7}$/i,\n IL: /^\\d{9}$/,\n IN: /^[A-Z]\\d{7}$/i,\n IR: /^[A-Z]\\d{8}$/i,\n IS: /^(A)\\d{7}$/i,\n IT: /^[A-Z0-9]{9}$/i,\n JO: /^[A-Z]{2}\\d{7}$/i,\n JP: /^[A-Z]{2}\\d{7}$/i,\n KR: /^[A-Z][A-Z0-9]\\d{7}$/i,\n KW: /^\\d{8}$/,\n KZ: /^[A-Z]\\d{8}$/i,\n LI: /^[A-Z]\\d{6}X$/i,\n LT: /^[A-Z0-9]{8}$/i,\n LU: /^[A-Z0-9]{8}$/i,\n LV: /^[A-Z0-9]{2}\\d{7}$/i,\n LY: /^[A-Z]{2}\\d{7}$/i,\n MA: /^[A-Z0-9]{2}\\d{7}$/i,\n MD: /^[A-Z]{2}\\d{7}$/i,\n ME: /^[A-Z]{2}\\d{7}$/i,\n MK: /^[A-Z]\\d{7}$/i,\n MT: /^\\d{7}$/,\n MX: /^[A-Z]\\d{8}$/i,\n MY: /^[AHK]\\d{8}[A-Z]$/i,\n NL: /^[A-NP-Z]{2}[A-NP-Z0-9]{6}\\d$/i,\n NO: /^\\d{9}$/,\n NZ: /^[A-Z]{2}\\d{6}$/i,\n PH: /^[A-Z]\\d{7}[A-Z]$/i,\n PK: /^[A-Z]{2}\\d{7}$/i,\n PL: /^[A-Z]{2}\\d{7}$/i,\n PT: /^[A-Z]\\d{6}$/i,\n RO: /^\\d{8}$/,\n RS: /^\\d{9}$/,\n RU: /^\\d{9}$/,\n SA: /^[A-Z]\\d{8}$/i,\n SE: /^\\d{8}$/,\n SL: /^(P)[A-Z]\\d{7}$/i,\n SK: /^[0-9A-Z]\\d{7}$/i,\n TH: /^[A-Z]{1,2}\\d{6,7}$/i,\n TN: /^\\d{8}$/,\n TR: /^[A-Z]\\d{8}$/i,\n TW: /^[A-Z]\\d{9}$/i,\n UA: /^[A-Z]{2}\\d{6}$/i,\n US: /^\\d{9}$/,\n ZA: /^[A-Z]\\d{8}$/i,\n};\n\nexport function isPassportNumber(locale: string): EmittableRule {\n const re = PASSPORT_REGEXES[locale];\n\n const fn = (value: unknown): boolean => {\n if (typeof value !== 'string') return false;\n if (!re) return false;\n return re.test(value);\n };\n\n (fn as any).emit = (varName: string, ctx: EmitContext): string => {\n if (!re) {\n return ctx.fail('isPassportNumber') + ';';\n }\n const i = ctx.addRegex(re);\n return `if (!_re[${i}].test(${varName})) ${ctx.fail('isPassportNumber')};`;\n };\n (fn as any).ruleName = 'isPassportNumber';\n (fn as any).requiresType = 'string';\n (fn as any).constraints = { locale };\n\n return fn as EmittableRule;\n}\n",
|
|
26
|
-
"import { collectValidation } from '../collect';\nimport {\n isMobilePhone,\n isPostalCode,\n isIdentityCard,\n isPassportNumber,\n} from '../rules/locales';\nimport type { ValidationOptions } from '../interfaces';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Locale Decorators (§1.1 Phase 6)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** 로케일별 모바일 전화번호 */\nexport function IsMobilePhone(locale: string, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isMobilePhone(locale),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** 로케일별 우편번호 */\nexport function IsPostalCode(locale: string, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isPostalCode(locale),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** 로케일별 신분증 번호 */\nexport function IsIdentityCard(locale: string, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isIdentityCard(locale),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n\n/** 로케일별 여권 번호 */\nexport function IsPassportNumber(locale: string, options?: ValidationOptions): PropertyDecorator {\n return (target, key) => {\n collectValidation(target as object, key as string, {\n rule: isPassportNumber(locale),\n each: options?.each,\n groups: options?.groups,\n message: options?.message,\n context: options?.context,\n });\n };\n}\n"
|
|
27
|
-
],
|
|
28
|
-
"mappings": ";iDAOO,IAAM,EAAiB,IAAI,ICM3B,SAAS,CAAU,CAAC,EAAgB,EAA8B,CAOvE,GALA,EAAe,IAAI,CAAI,EAKnB,CAAC,OAAO,UAAU,eAAe,KAAK,EAAM,CAAG,EAChD,EAAa,GAAO,OAAO,OAAO,IAAI,EAEzC,IAAM,EAAO,EAAa,GAG1B,OAAQ,EAAI,KAAS,CACnB,WAAY,CAAC,EACb,UAAW,CAAC,EACZ,OAAQ,CAAC,EACT,QAAS,KACT,KAAM,KACN,MAAO,CAAC,EACR,OAAQ,IACV,EAOK,SAAS,CAAiB,CAAC,EAAgB,EAAa,EAAwB,CACxE,EAAY,EAAe,YAAa,CAAG,EACnD,WAAW,KAAK,CAAO,EAGvB,SAAS,EAAgB,CAAC,EAAgB,EAAa,EAAkC,CACjF,EAAY,EAAe,YAAa,CAAG,EACnD,UAAU,KAAK,CAAY,EAG3B,SAAS,EAAa,CAAC,EAAgB,EAAa,EAA4B,CACxE,EAAY,EAAe,YAAa,CAAG,EACnD,OAAO,KAAK,CAAS,EAGrB,SAAS,EAAc,CAAC,EAAgB,EAAa,EAA8B,CACxF,IAAM,EAAO,EAAY,EAAe,YAAa,CAAG,EACxD,EAAK,QAAU,EAGV,SAAS,CAAW,CAAC,EAAgB,EAAa,EAAwB,CAC/E,IAAM,EAAO,EAAY,EAAe,YAAa,CAAG,EACxD,EAAK,KAAO,EAGP,SAAS,EAAa,CAC3B,EAAgB,EAChB,EACM,CACN,IAAM,EAAO,EAAY,EAAe,YAAa,CAAG,EAExD,GAAI,OAAO,IAAc,YAAc,OAAO,EAAK,SAAW,WAC5D,EAAK,OAAS,EAEd,OAAK,OAAS,IAAM,EAAK,QAAU,CAAC,KAAO,CAAU,EAIlD,SAAS,EAAkB,CAAC,EAAkB,EAAuC,CAC1F,EAAe,IAAI,CAAM,EACzB,IAAM,EAAY,EAAe,GAChC,EAAe,GAAoB,IAAM,GAAY,CAAC,KAAO,CAAO,EC5EhE,SAAS,EAAM,CAAC,EAAoC,CACzD,IAAM,EAAK,CAAC,IAA4B,IAAU,EAUlD,OARC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAChE,IAAM,EAAI,EAAI,OAAO,CAAU,EAC/B,MAAO,OAAO,eAAqB,OAAO,EAAI,KAAK,QAAQ,MAG5D,EAAW,SAAW,SACtB,EAAW,YAAc,CAAE,MAAO,CAAW,EAEvC,EAOF,SAAS,EAAS,CAAC,EAAoC,CAC5D,IAAM,EAAK,CAAC,IAA4B,IAAU,EAUlD,OARC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAChE,IAAM,EAAI,EAAI,OAAO,CAAU,EAC/B,MAAO,OAAO,eAAqB,OAAO,EAAI,KAAK,WAAW,MAG/D,EAAW,SAAW,YACtB,EAAW,YAAc,CAAE,MAAO,CAAW,EAEvC,EAOT,IAAM,EAAW,CAAC,IAChB,IAAU,QAAa,IAAU,MAAQ,IAAU,GAEpD,EAAiB,KAAO,CAAC,EAAiB,IACzC,OAAO,sBAA4B,iBAAuB,aAAmB,EAAI,KAAK,SAAS,KAEhG,EAAiB,SAAW,UAC5B,EAAiB,YAAc,CAAC,EAE1B,IAAM,GAAU,EAMjB,EAAc,CAAC,IACnB,IAAU,QAAa,IAAU,MAAQ,IAAU,GAEpD,EAAoB,KAAO,CAAC,EAAiB,IAC5C,OAAO,sBAA4B,iBAAuB,aAAmB,EAAI,KAAK,YAAY,KAEnG,EAAoB,SAAW,aAC/B,EAAoB,YAAc,CAAC,EAE7B,IAAM,GAAa,EAMnB,SAAS,EAAI,CAAC,EAAiC,CACpD,IAAM,EAAK,CAAC,IAA4B,EAAM,QAAQ,CAAK,IAAM,GAUjE,OARC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAEhE,MAAO,aADG,EAAI,OAAO,CAAK,cACQ,cAAoB,EAAI,KAAK,MAAM,MAGtE,EAAW,SAAW,OACtB,EAAW,YAAc,CAAE,OAAQ,CAAM,EAEnC,EAOF,SAAS,EAAO,CAAC,EAAiC,CACvD,IAAM,EAAK,CAAC,IAA4B,EAAM,QAAQ,CAAK,IAAM,GAUjE,OARC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAEhE,MAAO,aADG,EAAI,OAAO,CAAK,cACQ,cAAoB,EAAI,KAAK,SAAS,MAGzE,EAAW,SAAW,UACtB,EAAW,YAAc,CAAE,OAAQ,CAAM,EAEnC,ECzFF,SAAS,EAAS,CAAC,EAAiD,CACzE,MAAO,CAAC,EAAQ,IAAQ,CACtB,IAAM,EAAO,EAAY,EAAe,YAAa,CAAa,EAClE,EAAK,MAAM,UAAY,IAQpB,SAAS,EAAU,CAAC,EAAiD,CAC1E,MAAO,CAAC,EAAQ,IAAQ,CACtB,IAAM,EAAO,EAAY,EAAe,YAAa,CAAa,EAClE,EAAK,MAAM,WAAa,IAQrB,SAAS,EAAU,CAAC,EAAqD,CAC9E,MAAO,CAAC,EAAQ,IAAQ,CACtB,IAAM,EAAO,EAAY,EAAe,YAAa,CAAa,EAClE,EAAK,MAAM,WAAa,GAQrB,SAAS,EAAc,CAAC,EAAgD,CAC7E,MAAO,CAAC,EAAQ,IAAQ,CACtB,IAAM,EAAO,EAAY,EAAe,YAAa,CAAa,EAElE,GADA,EAAK,MAAM,eAAiB,GACxB,GAAS,KAAM,EAAK,MAAM,mBAAqB,IAShD,SAAS,EAAU,CAAC,EAAiD,CAC1E,MAAO,CAAC,EAAQ,IAAQ,CACtB,IAAM,EAAO,EAAY,EAAe,YAAa,CAAa,EAClE,EAAK,MAAM,WAAa,IASrB,SAAS,EAAM,CAAC,EAAqB,EAAgD,CAC1F,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAO,CAAU,EACvB,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAS,CAAC,EAAqB,EAAgD,CAC7F,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAU,CAAU,EAC1B,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAO,CAAC,EAAgD,CACtE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GACN,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAU,CAAC,EAAgD,CACzE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GACN,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAI,CAAC,EAA2B,EAAgD,CAC9F,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAK,CAAkB,EAC7B,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAO,CAAC,EAA2B,EAAgD,CACjG,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAQ,CAAkB,EAChC,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GCtFE,MAAM,UAAkB,KAAM,CACnC,WAAW,CAAC,EAAiB,CAC3B,MAAM,CAAO,EACb,KAAK,KAAO,YAEhB,CC3CO,SAAS,EAAM,CACpB,EACA,EACmB,CACnB,GAAI,GAAS,eAAiB,GAAS,KACrC,MAAM,IAAI,EAAU,sEAAuC,EAG7D,MAAO,CAAC,EAAQ,IAAQ,CAEtB,EAAY,EAAkB,EAAe,CAC3C,GAAI,EACJ,cAAe,GAAS,cACxB,0BAA2B,GAAS,yBACtC,CAAC,EAGD,IAAM,EAAO,EAAY,EAAe,YAAa,CAAa,EAElE,GADA,EAAK,MAAM,eAAiB,GACxB,GAAS,KAAM,EAAK,MAAM,mBAAqB,IChCvD,IAAM,EAAY,CAAC,IAA4B,OAAO,IAAU,SAE/D,EAAkB,KAAO,CAAC,EAAiB,IAC1C,cAAc,mBAAyB,EAAI,KAAK,UAAU,KAE3D,EAAkB,SAAW,WAC7B,EAAkB,YAAc,CAAC,EAG3B,IAAM,GAAW,EAYjB,SAAS,EAAQ,CAAC,EAA0C,CACjE,IAAM,EAAW,GAAS,UAAY,GAChC,EAAgB,GAAS,eAAiB,GAC1C,EAAmB,GAAS,iBAE5B,EAAK,CAAC,IAA4B,CACtC,GAAI,OAAO,IAAU,SAAU,MAAO,GAEtC,GAAI,MAAM,CAAK,EAAG,OAAO,EAEzB,GAAI,CAAC,SAAS,CAAK,EAAG,OAAO,EAC7B,GAAI,IAAqB,OAAW,CAClC,IAAM,EAAM,EAAM,SAAS,EACrB,EAAS,EAAI,QAAQ,GAAG,EAC9B,GAAI,IAAW,IAAM,EAAI,OAAS,EAAS,EAAI,EAAkB,MAAO,GAE1E,MAAO,IAsBT,OAnBC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAChE,IAAI,EAAO,cAAc,mBAAyB,EAAI,KAAK,UAAU,KACrE,GAAI,CAAC,EACH,GAAQ;AAAA,iBAAoB,OAAa,EAAI,KAAK,UAAU,KAE9D,GAAI,CAAC,EAEH,GAAQ;AAAA,WAAc,qBAA2B,oBAA0B,EAAI,KAAK,UAAU,KAEhG,GAAI,IAAqB,OACvB,GAAQ;AAAA,gBAAmB,oEAA0E,MAAqB,EAAI,KAAK,UAAU,OAE/I,OAAO,GAGR,EAAW,SAAW,WACtB,EAAW,YAAc,CAAE,SAAU,GAAS,SAAU,cAAe,GAAS,cAAe,iBAAkB,GAAS,gBAAiB,EAGrI,EAOT,IAAM,EAAa,CAAC,IAA4B,OAAO,IAAU,UAEhE,EAAmB,KAAO,CAAC,EAAiB,IAC3C,cAAc,oBAA0B,EAAI,KAAK,WAAW,KAE7D,EAAmB,SAAW,YAC9B,EAAmB,YAAc,CAAC,EAE5B,IAAM,GAAY,EAMnB,EAAU,CAAC,IACf,aAAiB,MAAQ,CAAC,MAAO,EAAe,QAAQ,CAAC,EAE1D,EAAgB,KAAO,CAAC,EAAiB,IACxC,SAAS,+BAAqC,iBAAuB,EAAI,KAAK,QAAQ,KAEvF,EAAgB,SAAW,SAC3B,EAAgB,YAAc,CAAC,EAEzB,IAAM,GAAS,EAMf,SAAS,EAAM,CAAC,EAA+B,CACpD,IAAM,EAAS,OAAO,OAAO,CAAM,EAE7B,EAAK,CAAC,IAA4B,EAAO,QAAQ,CAAK,IAAM,GAUlE,OARC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAEhE,MAAO,aADG,EAAI,OAAO,CAAM,cACO,cAAoB,EAAI,KAAK,QAAQ,MAGxE,EAAW,SAAW,SACtB,EAAW,YAAc,CAAE,OAAQ,OAAO,OAAO,CAAM,CAAE,EAEnD,EAOT,IAAM,EAAS,CAAC,IACd,OAAO,IAAU,UAAY,OAAO,UAAU,CAAK,EAEpD,EAAe,KAAO,CAAC,EAAiB,IACvC,cAAc,uCAA6C,OAAa,EAAI,KAAK,OAAO,KAEzF,EAAe,SAAW,QAC1B,EAAe,aAAe,SAC9B,EAAe,YAAc,CAAC,EAExB,IAAM,GAAQ,EAMf,EAAW,CAAC,IAA4B,MAAM,QAAQ,CAAK,EAEhE,EAAiB,KAAO,CAAC,EAAiB,IACzC,sBAAsB,OAAa,EAAI,KAAK,SAAS,KAEtD,EAAiB,SAAW,UAC5B,EAAiB,YAAc,CAAC,EAG1B,IAAM,GAAU,EAMjB,EAAY,CAAC,IACjB,OAAO,IAAU,UAAY,IAAU,MAAQ,CAAC,MAAM,QAAQ,CAAK,EAEpE,EAAkB,KAAO,CAAC,EAAiB,IAC1C,cAAc,qBAA2B,+BAAqC,OAAa,EAAI,KAAK,UAAU,KAE/G,EAAkB,SAAW,WAC7B,EAAkB,YAAc,CAAC,EAG3B,IAAM,GAAW,ECxJjB,SAAS,EAAQ,CAAC,EAAgD,CACvE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GACN,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAQ,CAAC,EAAiC,EAAgD,CACxG,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAS,CAAa,EAC5B,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAS,CAAC,EAAgD,CACxE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GACN,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAM,CAAC,EAAgD,CACrE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GACN,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAM,CAAC,EAAgB,EAAgD,CACrF,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAO,CAAM,EACnB,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAK,CAAC,EAAgD,CACpE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GACN,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAO,CAAC,EAAgD,CACtE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GACN,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAQ,CAAC,EAAgD,CACvE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GACN,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GCvGE,SAAS,EAAG,CAAC,EAAW,EAA+C,CAC5E,IAAM,EAAY,GAAM,WAAa,GAE/B,EAAK,EACP,CAAC,IAA6B,EAAmB,EACjD,CAAC,IAA6B,GAAoB,EAWtD,OATC,EAAW,KAAO,CAAC,EAAiB,IACnC,EACI,OAAO,QAAc,MAAM,EAAI,KAAK,KAAK,KACzC,OAAO,OAAa,MAAM,EAAI,KAAK,KAAK,KAE7C,EAAW,SAAW,MACtB,EAAW,aAAe,SAC1B,EAAW,YAAc,EAAY,CAAE,IAAK,EAAG,UAAW,EAAK,EAAI,CAAE,IAAK,CAAE,EAEtE,EAOF,SAAS,EAAG,CAAC,EAAW,EAA+C,CAC5E,IAAM,EAAY,GAAM,WAAa,GAE/B,EAAK,EACP,CAAC,IAA6B,EAAmB,EACjD,CAAC,IAA6B,GAAoB,EAWtD,OATC,EAAW,KAAO,CAAC,EAAiB,IACnC,EACI,OAAO,QAAc,MAAM,EAAI,KAAK,KAAK,KACzC,OAAO,OAAa,MAAM,EAAI,KAAK,KAAK,KAE7C,EAAW,SAAW,MACtB,EAAW,aAAe,SAC1B,EAAW,YAAc,EAAY,CAAE,IAAK,EAAG,UAAW,EAAK,EAAI,CAAE,IAAK,CAAE,EAEtE,EAOT,IAAM,EAAc,CAAC,IAA6B,EAAmB,EAEpE,EAAoB,KAAO,CAAC,EAAiB,IAC5C,OAAO,WAAiB,EAAI,KAAK,YAAY,KAE9C,EAAoB,SAAW,aAC/B,EAAoB,aAAe,SACnC,EAAoB,YAAc,CAAE,IAAK,EAAG,UAAW,EAAK,EAEtD,IAAM,GAAa,EAMpB,EAAc,CAAC,IAA6B,EAAmB,EAEpE,EAAoB,KAAO,CAAC,EAAiB,IAC5C,OAAO,WAAiB,EAAI,KAAK,YAAY,KAE9C,EAAoB,SAAW,aAC/B,EAAoB,aAAe,SACnC,EAAoB,YAAc,CAAE,IAAK,EAAG,UAAW,EAAK,EAEtD,IAAM,GAAa,EAMnB,SAAS,EAAa,CAAC,EAA0B,CACtD,IAAM,EAAK,CAAC,IAA6B,EAAmB,IAAM,EASlE,OAPC,EAAW,KAAO,CAAC,EAAiB,IACnC,OAAO,OAAa,YAAY,EAAI,KAAK,eAAe,KAEzD,EAAW,SAAW,gBACtB,EAAW,aAAe,SAC1B,EAAW,YAAc,CAAE,QAAS,CAAE,EAEhC,ECnFF,SAAS,EAAG,CAAC,EAAW,EAA0E,CACvG,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAI,EAAG,GAAS,UAAY,CAAE,UAAW,EAAK,EAAI,MAAS,EACjE,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAG,CAAC,EAAW,EAA0E,CACvG,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAI,EAAG,GAAS,UAAY,CAAE,UAAW,EAAK,EAAI,MAAS,EACjE,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAU,CAAC,EAAgD,CACzE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GACN,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAU,CAAC,EAAgD,CACzE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GACN,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAa,CAAC,EAAW,EAAgD,CACvF,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAc,CAAC,EACrB,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GC/DE,SAAS,EAAO,CAAC,EAA2B,CACjD,IAAM,EAAY,EAAK,QAAQ,EAEzB,EAAK,CAAC,IACV,aAAiB,MAAQ,EAAM,QAAQ,GAAK,EAW9C,OATC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAChE,IAAM,EAAI,EAAI,OAAO,CAAS,EAC9B,MAAO,SAAS,yBAA+B,uBAA6B,OAAO,EAAI,KAAK,SAAS,MAGtG,EAAW,SAAW,UACtB,EAAW,aAAe,OAC1B,EAAW,YAAc,CAAE,IAAK,EAAK,YAAY,CAAE,EAE7C,EAOF,SAAS,EAAO,CAAC,EAA2B,CACjD,IAAM,EAAY,EAAK,QAAQ,EAEzB,EAAK,CAAC,IACV,aAAiB,MAAQ,EAAM,QAAQ,GAAK,EAW9C,OATC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAChE,IAAM,EAAI,EAAI,OAAO,CAAS,EAC9B,MAAO,SAAS,yBAA+B,uBAA6B,OAAO,EAAI,KAAK,SAAS,MAGtG,EAAW,SAAW,UACtB,EAAW,aAAe,OAC1B,EAAW,YAAc,CAAE,IAAK,EAAK,YAAY,CAAE,EAE7C,EClCF,SAAS,EAAO,CAAC,EAAY,EAAgD,CAClF,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAQ,CAAI,EAClB,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAO,CAAC,EAAY,EAAgD,CAClF,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAQ,CAAI,EAClB,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GCxBL,SAAS,CAAc,CACrB,EACA,EACA,EACA,EAAqC,SACtB,CACf,IAAM,EAAK,CAAC,IAA4B,CACtC,GAAI,OAAO,IAAU,SAAU,MAAO,GACtC,OAAO,EAAS,CAAK,GAIvB,GAFC,EAAW,KAAO,EAClB,EAAW,SAAW,EACnB,IAAiB,OAAY,EAAW,aAAe,EAC3D,OAAO,EAOF,SAAS,EAAS,CAAC,EAA4B,CACpD,IAAM,EAAK,CAAC,IACV,OAAO,IAAU,UAAY,EAAM,QAAU,EAQ/C,OANC,EAAW,KAAO,CAAC,EAAiB,IACnC,OAAO,cAAoB,MAAQ,EAAI,KAAK,WAAW,KACxD,EAAW,SAAW,YACtB,EAAW,aAAe,SAC1B,EAAW,YAAc,CAAE,KAAI,EAEzB,EAGF,SAAS,EAAS,CAAC,EAA4B,CACpD,IAAM,EAAK,CAAC,IACV,OAAO,IAAU,UAAY,EAAM,QAAU,EAQ/C,OANC,EAAW,KAAO,CAAC,EAAiB,IACnC,OAAO,cAAoB,MAAQ,EAAI,KAAK,WAAW,KACxD,EAAW,SAAW,YACtB,EAAW,aAAe,SAC1B,EAAW,YAAc,CAAE,KAAI,EAEzB,EAGF,SAAS,EAAM,CAAC,EAAgB,EAA+B,CACpE,IAAM,EAAK,CAAC,IACV,OAAO,IAAU,UAAY,EAAM,QAAU,GAAU,EAAM,QAAU,EAQzE,OANC,EAAW,KAAO,CAAC,EAAiB,IACnC,OAAO,cAAoB,QAAa,cAAoB,MAAW,EAAI,KAAK,QAAQ,KACzF,EAAW,SAAW,SACtB,EAAW,aAAe,SAC1B,EAAW,YAAc,CAAE,IAAK,EAAQ,IAAK,CAAO,EAE9C,EAGF,SAAS,EAAQ,CAAC,EAA6B,CACpD,IAAM,EAAK,CAAC,IACV,OAAO,IAAU,UAAY,EAAM,SAAS,CAAI,EAUlD,OARC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAChE,IAAM,EAAI,EAAI,OAAO,CAAI,EACzB,MAAO,OAAO,mBAAyB,eAAe,EAAI,KAAK,UAAU,MAE1E,EAAW,SAAW,WACtB,EAAW,aAAe,SAC1B,EAAW,YAAc,CAAE,MAAK,EAE1B,EAGF,SAAS,EAAW,CAAC,EAA6B,CACvD,IAAM,EAAK,CAAC,IACV,OAAO,IAAU,UAAY,CAAC,EAAM,SAAS,CAAI,EAUnD,OARC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAChE,IAAM,EAAI,EAAI,OAAO,CAAI,EACzB,MAAO,OAAO,mBAAyB,eAAe,EAAI,KAAK,aAAa,MAE7E,EAAW,SAAW,cACtB,EAAW,aAAe,SAC1B,EAAW,YAAc,CAAE,MAAK,EAE1B,EAGF,SAAS,EAAO,CAAC,EAA0B,EAAmC,CACnF,IAAM,EAAK,aAAmB,OAAS,EAAU,IAAI,OAAO,EAAS,CAAS,EAExE,EAAK,CAAC,IACV,OAAO,IAAU,UAAY,EAAG,KAAK,CAAK,EAU5C,OARC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAEhE,MAAO,YADG,EAAI,SAAS,CAAE,WACK,OAAa,EAAI,KAAK,SAAS,MAE9D,EAAW,SAAW,UACtB,EAAW,aAAe,SAC1B,EAAW,YAAc,CAAE,QAAS,EAAG,MAAO,EAExC,EAOT,IAAM,EAAe,CAAC,IACpB,OAAO,IAAU,UAAY,IAAU,EAAM,YAAY,EAE1D,EAAqB,KAAO,CAAC,EAAiB,IAC7C,OAAO,SAAe,oBAA0B,EAAI,KAAK,aAAa,KACvE,EAAqB,SAAW,cAChC,EAAqB,aAAe,SACpC,EAAqB,YAAc,CAAC,EAC9B,IAAM,GAAc,EAErB,EAAe,CAAC,IACpB,OAAO,IAAU,UAAY,IAAU,EAAM,YAAY,EAE1D,EAAqB,KAAO,CAAC,EAAiB,IAC7C,OAAO,SAAe,oBAA0B,EAAI,KAAK,aAAa,KACvE,EAAqB,SAAW,cAChC,EAAqB,aAAe,SACpC,EAAqB,YAAc,CAAC,EAC9B,IAAM,GAAc,EAGrB,GAAW,iBACJ,EAAU,EACrB,UACA,CAAC,IAAM,GAAS,KAAK,CAAC,EACtB,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,EAAQ,WACD,OAAa,EAAI,KAAK,SAAS,KAEjE,EACC,EAAgB,YAAc,CAAC,EAIhC,IAAM,GAAmB,cAEzB,SAAS,EAAc,CAAC,EAAyB,CAC/C,OAAO,OAAO,IAAU,UAAY,EAAM,OAAS,GAAK,GAAiB,KAAK,CAAK,EAKrF,IAAM,EAAW,SAAS,CAAO,CAAC,EAA0C,CAC1E,GAAI,IAAU,OAAW,OAAO,EAChC,OAAO,GAAe,CAAK,GAG5B,EAAiB,KAAO,CAAC,EAAiB,IAA6B,CAEtE,MAAO,YADG,EAAI,SAAS,EAAgB,WACT,OAAa,EAAI,KAAK,SAAS,MAE9D,EAAiB,SAAW,UAC5B,EAAiB,aAAe,SAChC,EAAiB,YAAc,CAAC,EAC1B,IAAM,GAAU,EAGjB,GAAmB,iBAEzB,SAAS,EAAc,CAAC,EAAyB,CAC/C,OAAO,OAAO,IAAU,UAAY,EAAM,OAAS,GAAK,GAAiB,KAAK,CAAK,EAGrF,IAAM,EAAkB,SAAS,CAAc,CAAC,EAA0C,CACxF,GAAI,IAAU,OAAW,OAAO,EAChC,OAAO,GAAe,CAAK,GAG5B,EAAwB,KAAO,CAAC,EAAiB,IAA6B,CAE7E,MAAO,YADG,EAAI,SAAS,EAAgB,WACT,OAAa,EAAI,KAAK,gBAAgB,MAErE,EAAwB,SAAW,iBACnC,EAAwB,aAAe,SACvC,EAAwB,YAAc,CAAC,EACjC,IAAM,GAAiB,EAGxB,EAAmB,CAAC,IACxB,IAAU,QAAU,IAAU,SAAW,IAAU,KAAO,IAAU,IAErE,EAAyB,KAAO,CAAC,EAAiB,IACjD,OAAO,mBAAyB,oBAA0B,gBAAsB,cAAoB,EAAI,KAAK,iBAAiB,KAC/H,EAAyB,SAAW,kBACpC,EAAyB,aAAe,SACxC,EAAyB,YAAc,CAAC,EAClC,IAAM,GAAkB,EAMxB,SAAS,EAAc,CAAC,EAAgD,CAC7E,IAAM,EAAK,EACT,iBACA,CAAC,IAAM,CACL,GAAI,EAAE,SAAW,EAAG,MAAO,GAC3B,IAAM,EAAI,OAAO,CAAC,EAClB,MAAO,CAAC,MAAM,CAAC,GAAK,SAAS,CAAC,GAEhC,CAAC,EAAS,IAAQ,CAEhB,IAAM,EAAU,CAAC,IAAuB,CACtC,GAAI,EAAE,SAAW,EAAG,MAAO,GAC3B,IAAM,EAAI,OAAO,CAAC,EAClB,MAAO,CAAC,MAAM,CAAC,GAAK,SAAS,CAAC,GAGhC,MAAO,cADG,EAAI,OAAO,CAAO,MACD,OAAa,EAAI,KAAK,gBAAgB,KAErE,EAEA,OADC,EAAW,YAAc,CAAC,EACpB,EASF,SAAS,EAAS,CAAC,EAA2C,CACnE,IAAM,EAAY,iCACZ,EAAK,EACT,YACA,CAAC,IAAM,EAAU,KAAK,CAAC,EACvB,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,CAAS,WACF,OAAa,EAAI,KAAK,WAAW,KAEnE,EAEA,OADC,EAAW,YAAc,CAAC,EACpB,EAIT,IAAM,EAAe,gCACR,EAAc,EACzB,cACA,CAAC,IAAM,EAAE,OAAS,GAAK,EAAa,KAAK,CAAC,EAC1C,CAAC,EAAS,IAAQ,CAChB,IAAM,EAAI,EAAI,SAAS,CAAY,EACnC,MAAO,OAAO,0BAAgC,WAAW,OAAa,EAAI,KAAK,aAAa,KAEhG,EACC,EAAoB,YAAc,CAAC,EAGpC,IAAM,EAAe,+BACR,EAAc,EACzB,cACA,CAAC,IAAM,EAAE,OAAS,GAAK,EAAa,KAAK,CAAC,EAC1C,CAAC,EAAS,IAAQ,CAChB,IAAM,EAAI,EAAI,SAAS,CAAY,EACnC,MAAO,OAAO,0BAAgC,WAAW,OAAa,EAAI,KAAK,aAAa,KAEhG,EACC,EAAoB,YAAc,CAAC,EAG7B,IAAM,EAAkB,EAC7B,kBACA,CAAC,IAAM,EAAa,KAAK,CAAC,GAAK,EAAa,KAAK,CAAC,EAClD,CAAC,EAAS,IAAQ,CAChB,IAAM,EAAK,EAAI,SAAS,CAAY,EAC9B,EAAK,EAAI,SAAS,CAAY,EACpC,MAAO,YAAY,WAAY,cAAoB,WAAY,OAAa,EAAI,KAAK,iBAAiB,KAE1G,EACC,EAAwB,YAAc,CAAC,EAGxC,IAAM,GAAe,eACR,EAAc,EACzB,cACA,CAAC,IAAM,EAAE,OAAS,GAAK,GAAa,KAAK,CAAC,EAC1C,CAAC,EAAS,IAAQ,CAChB,IAAM,EAAI,EAAI,SAAS,EAAY,EACnC,MAAO,OAAO,0BAAgC,WAAW,OAAa,EAAI,KAAK,aAAa,KAEhG,EACC,EAAoB,YAAc,CAAC,EAGpC,IAAM,GAAe,iCACR,EAAkB,EAC7B,kBACA,CAAC,IAAM,EAAE,OAAS,GAAK,GAAa,KAAK,CAAC,EAC1C,CAAC,EAAS,IAAQ,CAChB,IAAM,EAAI,EAAI,SAAS,EAAY,EACnC,MAAO,OAAO,0BAAgC,WAAW,OAAa,EAAI,KAAK,iBAAiB,KAEpG,EACC,EAAwB,YAAc,CAAC,EAGxC,IAAM,GAAS,iBACF,EAAgB,EAC3B,gBACA,CAAC,IAAM,GAAO,KAAK,CAAC,EACpB,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,EAAM,WACC,OAAa,EAAI,KAAK,eAAe,KAEvE,EACC,EAAsB,YAAc,CAAC,EAGtC,IAAM,GAAW,mBACJ,EAAU,EACrB,UACA,CAAC,IAAM,EAAE,OAAS,GAAK,GAAS,KAAK,CAAC,EACtC,CAAC,EAAS,IAAQ,CAChB,IAAM,EAAI,EAAI,SAAS,EAAQ,EAC/B,MAAO,OAAO,0BAAgC,WAAW,OAAa,EAAI,KAAK,SAAS,KAE5F,EACC,EAAgB,YAAc,CAAC,EAahC,IAAM,GAAW,qJAEV,SAAS,EAAO,CAAC,EAA0C,CAChE,IAAM,EAAK,EACT,UACA,CAAC,IAAM,GAAS,KAAK,CAAC,EACtB,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,EAAQ,WACD,OAAa,EAAI,KAAK,SAAS,KAEjE,EAEA,OADC,EAAW,YAAc,CAAE,OAAQ,OAAQ,EACrC,EAaT,IAAM,GAAwB,CAAC,OAAQ,QAAS,KAAK,EAE9C,SAAS,EAAK,CAAC,EAAuC,CAE3D,IAAM,GADY,GAAS,WAAa,IACN,IAAI,KAAK,EAAE,QAAQ,sBAAuB,MAAM,CAAC,EAAE,KAAK,GAAG,EACvF,EAAK,IAAI,OACb,OAAO,+IACT,EAEM,EAAK,CAAC,IAA4B,CACtC,GAAI,OAAO,IAAU,UAAY,EAAM,SAAW,EAAG,MAAO,GAC5D,OAAO,EAAG,KAAK,CAAK,GAWtB,OARC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAEhE,MAAO,YADG,EAAI,SAAS,CAAE,WACK,OAAa,EAAI,KAAK,OAAO,MAE5D,EAAW,SAAW,QACtB,EAAW,aAAe,SAC1B,EAAW,YAAc,CAAE,OAAQ,KAAM,EAEnC,EAIT,IAAM,EAA2C,CAC/C,IAAK,gFACL,EAAG,yFACH,EAAG,yFACH,EAAG,yFACH,EAAG,yFACH,EAAG,wFACL,EAEO,SAAS,EAAM,CAAC,EAAoD,CACzE,IAAM,EAAM,GAAW,KAAQ,EAAQ,IAAY,EAAQ,IAAO,EAAQ,IACpE,EAAK,EACT,SACA,CAAC,IAAM,EAAG,KAAK,CAAC,EAChB,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,CAAE,WACK,OAAa,EAAI,KAAK,QAAQ,KAEhE,EAEA,OADC,EAAW,YAAc,CAAE,OAAQ,MAAO,EACpC,EAIT,IAAM,EAAU,2JACV,EAAU,0vBAET,SAAS,EAAI,CAAC,EAAgC,CACnD,IAAM,EAAK,CAAC,IAA4B,CACtC,GAAI,OAAO,IAAU,SAAU,MAAO,GACtC,GAAI,IAAY,EAAG,OAAO,EAAQ,KAAK,CAAK,EAC5C,GAAI,IAAY,EAAG,OAAO,EAAQ,KAAK,CAAK,EAC5C,OAAO,EAAQ,KAAK,CAAK,GAAK,EAAQ,KAAK,CAAK,GAoBlD,OAjBC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAChE,GAAI,IAAY,EAEd,MAAO,YADG,EAAI,SAAS,CAAO,WACA,OAAa,EAAI,KAAK,MAAM,KAE5D,GAAI,IAAY,EAEd,MAAO,YADG,EAAI,SAAS,CAAO,WACA,OAAa,EAAI,KAAK,MAAM,KAE5D,IAAM,EAAK,EAAI,SAAS,CAAO,EACzB,EAAK,EAAI,SAAS,CAAO,EAC/B,MAAO,YAAY,WAAY,cAAoB,WAAY,OAAa,EAAI,KAAK,MAAM,MAE5F,EAAW,SAAW,OACtB,EAAW,aAAe,SAC1B,EAAW,YAAc,CAAE,SAAQ,EAE7B,EAIT,IAAM,GAAe,mEACR,GAAa,EACxB,aACA,CAAC,IAAM,GAAa,KAAK,CAAC,EAC1B,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,EAAY,WACL,OAAa,EAAI,KAAK,YAAY,KAEpE,EACC,GAAmB,YAAc,CAAC,EAGnC,IAAM,GAAS,4IACT,GAAU,wKACV,GAAiB,8GAEhB,SAAS,EAAU,CAAC,EAAgC,GAAsB,CAC/E,IAAM,EAAK,CAAC,IAA4B,CACtC,GAAI,OAAO,IAAU,SAAU,MAAO,GACtC,GAAI,EAAsB,OAAO,GAAe,KAAK,CAAK,EAC1D,OAAO,GAAO,KAAK,CAAK,GAAK,GAAQ,KAAK,CAAK,GAgBjD,OAbC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAChE,GAAI,EAEF,MAAO,YADG,EAAI,SAAS,EAAc,WACP,OAAa,EAAI,KAAK,YAAY,KAElE,IAAM,EAAK,EAAI,SAAS,EAAM,EACxB,EAAK,EAAI,SAAS,EAAO,EAC/B,MAAO,YAAY,WAAY,cAAoB,WAAY,OAAa,EAAI,KAAK,YAAY,MAElG,EAAW,SAAW,aACtB,EAAW,aAAe,SAC1B,EAAW,YAAc,CAAC,EAEpB,EAIT,IAAM,GAAS,yIACF,GAAQ,EACnB,QACA,CAAC,IAAM,GAAO,KAAK,CAAC,EACpB,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,EAAM,WACC,OAAa,EAAI,KAAK,OAAO,KAE/D,EACC,GAAc,YAAc,CAAC,EAO9B,IAAM,GAAe,yCACf,GAAgB,yCAChB,GAAgB,oBAEf,SAAS,EAAY,CAAC,EAA8C,CACzE,IAAM,EAAK,CAAC,IAA4B,CACtC,GAAI,OAAO,IAAU,SAAU,MAAO,GACtC,GAAI,GAAS,cAAe,OAAO,GAAc,KAAK,CAAK,EAC3D,OAAO,GAAa,KAAK,CAAK,GAAK,GAAc,KAAK,CAAK,GAgB7D,OAbC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAChE,GAAI,GAAS,cAEX,MAAO,YADG,EAAI,SAAS,EAAa,WACN,OAAa,EAAI,KAAK,cAAc,KAEpE,IAAM,EAAK,EAAI,SAAS,EAAY,EAC9B,EAAK,EAAI,SAAS,EAAa,EACrC,MAAO,YAAY,WAAY,cAAoB,WAAY,OAAa,EAAI,KAAK,cAAc,MAEpG,EAAW,SAAW,eACtB,EAAW,aAAe,SAC1B,EAAW,YAAc,CAAC,EAEpB,EAIT,SAAS,EAAe,CAAC,EAAsB,CAC7C,IAAM,EAAI,EAAI,QAAQ,SAAU,EAAE,EAClC,GAAI,CAAC,eAAe,KAAK,CAAC,EAAG,MAAO,GACpC,IAAI,EAAM,EACV,QAAS,EAAI,EAAG,EAAI,EAAG,IAAK,IAAQ,GAAK,IAAM,EAAE,WAAW,CAAC,EAAI,IACjE,IAAM,EAAO,EAAE,KAAO,IAAM,GAAM,EAAE,WAAW,CAAC,EAAI,GAEpD,OADA,GAAO,EACA,EAAM,KAAO,EAGtB,SAAS,EAAe,CAAC,EAAsB,CAC7C,IAAM,EAAI,EAAI,QAAQ,SAAU,EAAE,EAClC,GAAI,CAAC,WAAW,KAAK,CAAC,EAAG,MAAO,GAChC,IAAI,EAAM,EACV,QAAS,EAAI,EAAG,EAAI,GAAI,IACtB,IAAQ,EAAE,WAAW,CAAC,EAAI,KAAO,EAAI,IAAM,EAAI,EAAI,GAGrD,OADe,GAAM,EAAM,IAAO,KAChB,EAAE,WAAW,EAAE,EAAI,GAGhC,SAAS,EAAM,CAAC,EAAkC,CACvD,IAAM,EAAa,CAAC,IAA4B,CAC9C,GAAI,OAAO,IAAU,SAAU,MAAO,GACtC,GAAI,IAAY,GAAI,OAAO,GAAgB,CAAK,EAChD,GAAI,IAAY,GAAI,OAAO,GAAgB,CAAK,EAChD,OAAO,GAAgB,CAAK,GAAK,GAAgB,CAAK,GAWxD,OARC,EAAmB,KAAO,CAAC,EAAiB,IAA6B,CAExE,MAAO,cADG,EAAI,OAAO,CAAU,MACJ,OAAa,EAAI,KAAK,QAAQ,MAE1D,EAAmB,SAAW,SAC9B,EAAmB,aAAe,SAClC,EAAmB,YAAc,CAAC,EAE5B,EAIT,IAAM,GAAU,6BAEhB,SAAS,EAAgB,CAAC,EAAoB,CAC5C,GAAI,CAAC,GAAQ,KAAK,CAAC,EAAG,MAAO,GAE7B,IAAM,EAAW,EACd,MAAM,EAAE,EACR,IAAI,CAAC,IAAM,CACV,IAAM,EAAO,EAAE,WAAW,CAAC,EAC3B,OAAO,GAAQ,GAAK,OAAO,EAAO,EAAE,EAAI,EACzC,EACA,KAAK,EAAE,EACN,EAAM,EACN,EAAY,GAChB,QAAS,EAAI,EAAS,OAAS,EAAG,GAAK,EAAG,IAAK,CAC7C,IAAI,EAAI,SAAS,EAAS,GAAK,EAAE,EACjC,GAAI,GAEF,GADA,GAAK,EACD,EAAI,EAAG,GAAK,EAElB,GAAO,EACP,EAAY,CAAC,EAEf,OAAO,EAAM,KAAO,EAGf,IAAM,GAAS,EACpB,SACA,GACA,CAAC,EAAS,IAAQ,CAEhB,MAAO,cADG,EAAI,OAAO,EAAgB,MACV,OAAa,EAAI,KAAK,QAAQ,KAE7D,EACC,GAAe,YAAc,CAAC,EAG/B,IAAM,EAAa,wFAOnB,SAAS,EAAsB,CAAC,EAAoB,CAClD,GAAI,CAAC,EAAW,KAAK,CAAC,EAAG,MAAO,GAEhC,IAAM,EAAI,EAAE,MAAM,0BAA0B,EAC5C,GAAI,CAAC,EAAG,MAAO,GACf,IAAM,EAAQ,OAAO,EAAE,EAAE,EACnB,EAAM,OAAO,EAAE,EAAE,EACvB,GAAI,EAAQ,GAAK,EAAQ,GAAI,MAAO,GACpC,IAAM,EAAS,IAAI,KAAK,OAAO,EAAE,EAAE,EAAG,EAAO,CAAC,EAAE,QAAQ,EACxD,OAAO,GAAO,GAAK,GAAO,EAGrB,SAAS,EAAS,CAAC,EAA2C,CACnE,GAAI,GAAS,OAAQ,CAEnB,IAAM,EAAK,CAAC,IAAwB,CAClC,GAAI,OAAO,IAAM,SAAU,MAAO,GAClC,OAAO,GAAuB,CAAC,GAQjC,OANC,EAAW,SAAW,YACtB,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAEhE,MAAO,cADG,EAAI,OAAO,CAAE,MACI,OAAa,EAAI,KAAK,WAAW,MAE7D,EAAW,YAAc,CAAE,OAAQ,WAAY,EACzC,EAGT,IAAM,EAAK,EACT,YACA,CAAC,IAAM,EAAW,KAAK,CAAC,EACxB,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,CAAU,WACH,OAAa,EAAI,KAAK,WAAW,KAEnE,EAEA,OADC,EAAW,YAAc,CAAE,OAAQ,WAAY,EACzC,EAIT,IAAM,GAAU,gEACH,GAAS,EACpB,SACA,CAAC,IAAM,GAAQ,KAAK,CAAC,EACrB,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,EAAO,WACA,OAAa,EAAI,KAAK,QAAQ,KAEhE,EACC,GAAe,YAAc,CAAC,EAQ/B,SAAS,EAAa,CAAC,EAAe,EAAkC,CACtE,IAAM,EAAgB,GAAS,gBAAkB,GAC3C,EAAI,EAAgB,EAAQ,EAAM,QAAQ,KAAM,EAAE,EAGxD,GAAI,EADO,EAAgB,qBAAuB,gBAC1C,KAAK,CAAC,EAAG,MAAO,GACxB,IAAM,EAAS,EAAE,QAAQ,KAAM,EAAE,EAC7B,EAAM,EACV,QAAS,EAAI,EAAG,EAAI,EAAG,IACrB,IAAQ,EAAI,IAAM,EAAO,WAAW,CAAC,EAAI,IAE3C,IAAM,EAAO,EAAO,KAAO,IAAM,GAAM,EAAO,WAAW,CAAC,EAAI,GAE9D,OADA,GAAO,EACA,EAAM,KAAO,EAGf,SAAS,EAAM,CAAC,EAAwC,CAC7D,IAAM,EAAK,CAAC,IAA4B,CACtC,GAAI,OAAO,IAAU,SAAU,MAAO,GACtC,OAAO,GAAc,EAAO,CAAO,GAWrC,OARC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAEhE,MAAO,cADG,EAAI,OAAO,CAAE,MACI,OAAa,EAAI,KAAK,QAAQ,MAE1D,EAAW,SAAW,SACtB,EAAW,aAAe,SAC1B,EAAW,YAAc,CAAC,EAEpB,EAIT,IAAM,GAAS,mDACF,GAAQ,EACnB,QACA,CAAC,IAAM,GAAO,KAAK,CAAC,EACpB,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,EAAM,WACC,OAAa,EAAI,KAAK,OAAO,KAE/D,EACC,GAAc,YAAc,CAAC,EAO9B,IAAM,GAAc,sGAEb,SAAS,EAAS,CAAC,EAA2C,CACnE,IAAM,EAAK,EACT,YACA,CAAC,IAAM,GAAY,KAAK,CAAC,EACzB,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,EAAW,WACJ,OAAa,EAAI,KAAK,WAAW,KAEnE,EAEA,OADC,EAAW,YAAc,CAAC,EACpB,EAIT,IAAM,GAAY,mFACL,GAAW,EACtB,WACA,CAAC,IAAM,GAAU,KAAK,CAAC,EACvB,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,EAAS,WACF,OAAa,EAAI,KAAK,UAAU,KAElE,EACC,GAAiB,YAAc,CAAC,EAGjC,IAAM,GAAc,6GACP,GAAY,EACvB,YACA,CAAC,IAAM,GAAY,KAAK,CAAC,EACzB,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,EAAW,WACJ,OAAa,EAAI,KAAK,WAAW,KAEnE,EACC,GAAkB,YAAc,CAAC,EAS3B,SAAS,EAAM,CAAC,EAAwC,CAC7D,IAAM,EAAa,GAAS,cAAgB,GAEtC,EAAK,CAAC,IAA4B,CACtC,GAAI,OAAO,IAAU,SAAU,MAAO,GACtC,IAAI,EAAM,EACV,GAAI,GAAS,oBAAsB,EAAI,SAAS,GAAG,EAAG,EAAM,EAAI,MAAM,EAAG,EAAE,EAC3E,GAAI,EAAI,SAAW,EAAG,MAAO,GAC7B,IAAM,EAAQ,EAAI,MAAM,GAAG,EAE3B,GAAI,GAAc,EAAM,OAAS,EAAG,MAAO,GAC3C,GAAI,EAAY,CACd,IAAM,EAAM,EAAM,EAAM,OAAS,GACjC,GAAI,CAAC,GAAO,EAAI,OAAS,GAAK,CAAC,iBAAiB,KAAK,CAAG,EAAG,MAAO,GAEpE,OAAO,EAAM,MAAM,CAAC,IAAS,CAC3B,GAAI,EAAK,SAAW,GAAK,EAAK,OAAS,GAAI,MAAO,GAClD,GAAI,GAAS,kBAAmB,MAAO,mBAAmB,KAAK,CAAI,EACnE,MAAO,kBAAkB,KAAK,CAAI,GAAK,CAAC,EAAK,WAAW,GAAG,GAAK,CAAC,EAAK,SAAS,GAAG,EACnF,GAWH,OARC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAEhE,MAAO,cADG,EAAI,OAAO,CAAE,MACI,OAAa,EAAI,KAAK,QAAQ,MAE1D,EAAW,SAAW,SACtB,EAAW,aAAe,SAC1B,EAAW,YAAc,CAAC,EAEpB,EAIT,IAAM,GAAU,iFACH,GAAS,EACpB,SACA,CAAC,IAAM,GAAQ,KAAK,CAAC,EACrB,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,EAAO,WACA,OAAa,EAAI,KAAK,QAAQ,KAEhE,EACC,GAAe,YAAc,CAAC,EAG/B,SAAS,EAAY,CAAC,EAAwB,CAC5C,GAAI,CAAC,UAAU,KAAK,CAAK,GAAK,CAAC,WAAW,KAAK,CAAK,EAAG,MAAO,GAC9D,IAAM,EAAS,EAAM,MAAM,EAAE,EAAE,IAAI,MAAM,EACnC,EAAM,EAAO,OACf,EAAM,EACV,QAAS,EAAI,EAAG,EAAI,EAAM,EAAG,IAC3B,GAAO,EAAO,IAAO,IAAQ,EAAK,EAAI,IAAM,EAAI,EAAI,EAAM,EAAI,IAAM,EAAI,EAAI,GAG9E,OADe,GAAM,EAAM,IAAO,KACjB,EAAO,EAAM,GAGzB,IAAM,GAAQ,EACnB,QACA,GACA,CAAC,EAAS,IAAQ,CAEhB,MAAO,cADG,EAAI,OAAO,EAAY,MACN,OAAa,EAAI,KAAK,OAAO,KAE5D,EACC,GAAc,YAAc,CAAC,EAG9B,IAAM,GAAmB,IAAI,IAAI,CAC/B,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAC3E,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KACpG,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAC1F,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAC5D,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KACxH,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAC3E,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KACtE,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAClD,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAC9G,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KACvD,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KACtE,KAAK,KAAK,KAAK,KAAK,KAAK,KACzB,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KACpG,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAC3E,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAC5D,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAChC,CAAC,EAEK,EAAoB,CAAC,IAA4B,CACrD,GAAI,OAAO,IAAU,SAAU,MAAO,GACtC,OAAO,GAAiB,IAAI,EAAM,YAAY,CAAC,GAGhD,EAA0B,KAAO,CAAC,EAAiB,IAA6B,CAE/E,MAAO,cADG,EAAI,OAAO,EAAgB,UACN,qBAA2B,EAAI,KAAK,kBAAkB,MAEtF,EAA0B,SAAW,mBACrC,EAA0B,aAAe,SACzC,EAA0B,YAAc,CAAC,EACnC,IAAM,GAAmB,EAG1B,GAAmB,IAAI,IAAI,CAC/B,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACtG,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACxH,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACxH,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACxE,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAC1I,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAC1F,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAClE,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAC5D,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAC1I,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAClE,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACpF,MAAM,MAAM,MAAM,MAAM,MACxB,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAC1I,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACpF,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACxE,MAAM,MAAM,MAAM,MAAM,MAAM,KAChC,CAAC,EAEK,EAAoB,CAAC,IAA4B,CACrD,GAAI,OAAO,IAAU,SAAU,MAAO,GACtC,OAAO,GAAiB,IAAI,EAAM,YAAY,CAAC,GAGhD,EAA0B,KAAO,CAAC,EAAiB,IAA6B,CAE/E,MAAO,cADG,EAAI,OAAO,EAAgB,UACN,qBAA2B,EAAI,KAAK,kBAAkB,MAEtF,EAA0B,SAAW,mBACrC,EAA0B,aAAe,SACzC,EAA0B,YAAc,CAAC,EACnC,IAAM,GAAmB,EAG1B,GAAS,wCACF,GAAQ,EACnB,QACA,CAAC,IAAM,GAAO,KAAK,EAAE,YAAY,CAAC,EAClC,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,EAAM,WACC,qBAA2B,EAAI,KAAK,OAAO,KAE7E,EACC,GAAc,YAAc,CAAC,EAG9B,IAAM,GAAc,sBACP,GAAmB,EAC9B,mBACA,CAAC,IAAM,GAAY,KAAK,CAAC,EACzB,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,EAAW,WACJ,OAAa,EAAI,KAAK,kBAAkB,KAE1E,EACC,GAAyB,YAAc,CAAC,EAGzC,IAAM,GAAY,sLACL,GAAW,EACtB,WACA,CAAC,IAAM,GAAU,KAAK,CAAC,EACvB,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,EAAS,WACF,OAAa,EAAI,KAAK,UAAU,KAElE,EACC,GAAiB,YAAc,CAAC,EAGjC,IAAM,GAAc,oBACP,GAAY,EACvB,YACA,CAAC,IAAM,GAAY,KAAK,CAAC,EACzB,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,EAAW,WACJ,OAAa,EAAI,KAAK,WAAW,KAEnE,EACC,GAAkB,YAAc,CAAC,EAGlC,IAAM,EAAU,CAAC,IAA4B,CAC3C,GAAI,OAAO,IAAU,SAAU,MAAO,GACtC,GAAI,CAEF,OADA,KAAK,MAAM,CAAK,EACT,GACP,KAAM,CACN,MAAO,KAIV,EAAgB,KAAO,CAAC,EAAiB,IAA6B,CAIrE,MAAO,cAHG,EAAI,OAAO,CAAC,IAAc,CAClC,GAAI,CAAiB,OAAf,KAAK,MAAM,CAAC,EAAU,GAAQ,KAAM,CAAE,MAAO,IACpD,MAC0B,OAAa,EAAI,KAAK,QAAQ,MAE1D,EAAgB,SAAW,SAC3B,EAAgB,aAAe,SAC/B,EAAgB,YAAc,CAAC,EACzB,IAAM,GAAS,EAGhB,GAAY,iBAOX,SAAS,EAAQ,CAAC,EAA0C,CACjE,IAAM,EAAK,GACL,EAAK,EACT,WACA,CAAC,IAAM,CACL,GAAI,EAAE,SAAW,EAAG,MAAO,GAC3B,GAAI,EAAE,OAAS,IAAM,EAAG,MAAO,GAC/B,OAAO,EAAG,KAAK,CAAC,GAElB,CAAC,EAAS,IAAQ,CAChB,IAAM,EAAI,EAAI,SAAS,CAAE,EACzB,MAAO,OAAO,qBAA2B,8BAAoC,WAAW,OAAa,EAAI,KAAK,UAAU,KAE5H,EAEA,OADC,EAAW,YAAc,CAAC,EACpB,EAIT,IAAM,GAAY,0BACL,GAAW,EACtB,WACA,CAAC,IAAM,GAAU,KAAK,CAAC,EACvB,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,EAAS,WACF,OAAa,EAAI,KAAK,UAAU,KAElE,EACC,GAAiB,YAAc,CAAC,EAGjC,IAAM,GAAY,mFACZ,GAAgB,yBAMf,SAAS,EAAQ,CAAC,EAA0C,CACjE,IAAM,EAAK,GAAS,QAAU,GAAgB,GACxC,EAAK,EACT,WACA,CAAC,IAAM,CACL,GAAI,EAAE,SAAW,EAAG,MAAO,GAC3B,OAAO,EAAG,KAAK,CAAC,GAElB,CAAC,EAAS,IAAQ,CAChB,IAAM,EAAI,EAAI,SAAS,CAAE,EACzB,MAAO,OAAO,0BAAgC,WAAW,OAAa,EAAI,KAAK,UAAU,KAE7F,EAEA,OADC,EAAW,YAAc,CAAC,EACpB,EAIT,IAAM,GAAiB,oDAMhB,SAAS,EAAY,CAAC,EAA8C,CACzE,IAAM,EAAK,EACT,eACA,CAAC,IAAM,GAAe,KAAK,CAAC,EAC5B,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,EAAc,WACP,OAAa,EAAI,KAAK,cAAc,KAEtE,EAEA,OADC,EAAW,YAAc,CAAC,EACpB,EAIT,IAAM,GAAe,iHACR,GAAa,EACxB,aACA,CAAC,IAAM,GAAa,KAAK,CAAC,EAC1B,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,EAAY,WACL,OAAa,EAAI,KAAK,YAAY,KAEpE,EACC,GAAmB,YAAc,CAAC,EAqBnC,IAAM,GAAc,mFAEb,SAAS,EAAU,CAAC,EAA4C,CACrE,IAAM,EAAK,EACT,aACA,CAAC,IAAM,CACL,GAAI,EAAE,SAAW,EAAG,MAAO,GAC3B,OAAO,GAAY,KAAK,CAAC,GAE3B,CAAC,EAAS,IAAQ,CAChB,IAAM,EAAI,EAAI,SAAS,EAAW,EAClC,MAAO,OAAO,0BAAgC,WAAW,OAAa,EAAI,KAAK,YAAY,KAE/F,EAEA,OADC,EAAW,YAAc,CAAC,EACpB,EAIT,IAAM,GAAgB,8CACT,GAAc,EACzB,cACA,CAAC,IAAM,GAAc,KAAK,CAAC,EAC3B,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,EAAa,WACN,OAAa,EAAI,KAAK,aAAa,KAErE,EACC,GAAoB,YAAc,CAAC,EAOpC,SAAS,EAAK,CAAC,EAAsB,CACnC,IAAM,EAAI,EAAI,QAAQ,SAAU,EAAE,EAClC,GAAI,EAAE,SAAW,GAAK,CAAC,QAAQ,KAAK,CAAC,EAAG,MAAO,GAC/C,IAAI,EAAM,EACN,EAAY,GAChB,QAAS,EAAI,EAAE,OAAS,EAAG,GAAK,EAAG,IAAK,CACtC,IAAI,EAAI,EAAE,WAAW,CAAC,EAAI,GAC1B,GAAI,GAEF,GADA,GAAK,EACD,EAAI,EAAG,GAAK,EAElB,GAAO,EACP,EAAY,CAAC,EAEf,OAAO,EAAM,KAAO,EAGtB,IAAM,EAAgB,CAAC,IAA4B,CACjD,GAAI,OAAO,IAAU,SAAU,MAAO,GACtC,OAAO,GAAM,CAAK,GAInB,EAAsB,KAAO,CAAC,EAAiB,IAA6B;AAAA,YACjE;AAAA,4CACgC,EAAI,KAAK,cAAc;AAAA;AAAA;AAAA,mBAGhD,EAAI,KAAK,cAAc;AAAA,GAEzC,EAAsB,SAAW,eACjC,EAAsB,aAAe,SACrC,EAAsB,YAAc,CAAC,EAC/B,IAAM,GAAe,EAOtB,GAA8C,CAClD,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GACtF,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GACtF,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GACtF,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GACtF,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GACtF,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GACtF,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GACtF,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GAAI,GAAM,GACtF,GAAM,GAAI,GAAM,EAClB,EAEA,SAAS,EAAa,CAAC,EAAe,EAAkC,CACtE,IAAI,EAAI,GAAS,YAAc,EAAM,QAAQ,MAAO,EAAE,EAAI,EAE1D,GADA,EAAI,EAAE,YAAY,EACd,CAAC,2BAA2B,KAAK,CAAC,EAAG,MAAO,GAChD,IAAM,EAAU,EAAE,MAAM,EAAG,CAAC,EACtB,EAAiB,GAAoB,GAC3C,GAAI,IAAmB,QAAa,EAAE,SAAW,EAAgB,MAAO,GAIxE,IAAM,GAFa,EAAE,MAAM,CAAC,EAAI,EAAE,MAAM,EAAG,CAAC,GAEjB,QAAQ,SAAU,CAAC,IAAO,OAAO,EAAG,WAAW,CAAC,EAAI,EAAE,CAAC,EAE9E,EAAY,EAChB,QAAS,EAAI,EAAG,EAAI,EAAQ,OAAQ,GAAK,EAAG,CAC1C,IAAM,EAAQ,OAAO,CAAS,EAAI,EAAQ,MAAM,EAAG,EAAI,CAAC,EACxD,EAAY,SAAS,EAAO,EAAE,EAAI,GAEpC,OAAO,IAAc,EAGhB,SAAS,EAAM,CAAC,EAAwC,CAC7D,IAAM,EAAK,CAAC,IAA4B,CACtC,GAAI,OAAO,IAAU,SAAU,MAAO,GACtC,OAAO,GAAc,EAAO,CAAO,GAWrC,OARC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAEhE,MAAO,cADG,EAAI,OAAO,CAAE,MACI,OAAa,EAAI,KAAK,QAAQ,MAE1D,EAAW,SAAW,SACtB,EAAW,aAAe,SAC1B,EAAW,YAAc,CAAC,EAEpB,EAIF,SAAS,EAAY,CAAC,EAAa,EAA6B,CACrE,IAAM,EAAK,CAAC,IAA4B,CACtC,GAAI,OAAO,IAAU,SAAU,MAAO,GACtC,IAAM,EAAU,OAAO,WAAW,EAAO,MAAM,EAC/C,GAAI,EAAU,EAAK,MAAO,GAC1B,GAAI,IAAQ,QAAa,EAAU,EAAK,MAAO,GAC/C,MAAO,IAkBT,OAfC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAEhE,IAAM,EAAU,CAAC,IAAuB,CACtC,IAAM,EAAU,OAAO,WAAW,EAAG,MAAM,EAC3C,GAAI,EAAU,EAAK,MAAO,GAC1B,GAAI,IAAQ,QAAa,EAAU,EAAK,MAAO,GAC/C,MAAO,IAGT,MAAO,cADG,EAAI,OAAO,CAAO,MACD,OAAa,EAAI,KAAK,cAAc,MAEhE,EAAW,SAAW,eACtB,EAAW,aAAe,SAC1B,EAAW,YAAc,CAAC,EAEpB,EAST,IAAM,GAAuC,CAC3C,IAAY,kBACZ,IAAY,kBACZ,IAAY,kBACZ,KAAY,kBACZ,OAAY,kBACZ,OAAY,kBACZ,OAAY,mBACZ,UAAY,kBACZ,UAAY,kBACZ,aAAc,kBACd,aAAc,kBACd,aAAc,kBACd,aAAc,kBACd,aAAc,kBACd,aAAc,kBACd,MAAY,iBACZ,OAAY,gBACd,EAEO,SAAS,EAAM,CAAC,EAAkC,CACvD,IAAM,EAAK,GAAa,GAElB,EAAK,CAAC,IAA4B,CACtC,GAAI,OAAO,IAAU,SAAU,MAAO,GACtC,GAAI,CAAC,EAAI,MAAO,GAChB,OAAO,EAAG,KAAK,CAAK,GAetB,OAZC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAChE,GAAI,CAAC,EAEH,OAAO,EAAI,KAAK,QAAQ,EAAI,IAG9B,MAAO,YADG,EAAI,SAAS,CAAE,WACK,OAAa,EAAI,KAAK,QAAQ,MAE7D,EAAW,SAAW,SACtB,EAAW,aAAe,SAC1B,EAAW,YAAc,CAAC,EAEpB,EAKT,IAAM,GAAa,uEAEN,GAAY,EACvB,YACA,CAAC,IAAM,GAAW,KAAK,CAAC,EACxB,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,EAAU,WACH,OAAa,EAAI,KAAK,WAAW,KAEnE,EACC,GAAkB,YAAc,CAAC,EAIlC,IAAM,GAAmB,4BAEZ,GAAiB,EAC5B,iBACA,CAAC,IAAM,GAAiB,KAAK,CAAC,EAC9B,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,EAAgB,WACT,OAAa,EAAI,KAAK,gBAAgB,KAExE,EACC,GAAuB,YAAc,CAAC,EAIvC,SAAS,EAAc,CAAC,EAAyB,CAC/C,GAAI,OAAO,IAAU,SACnB,OAAO,GAAS,KAAO,GAAS,GAElC,GAAI,OAAO,IAAU,SAAU,CAC7B,IAAM,EAAI,WAAW,CAAK,EAC1B,GAAI,MAAM,CAAC,EAAG,MAAO,GACrB,GAAI,OAAO,CAAC,IAAM,GAAS,IAAU,OAAO,CAAC,GAE3C,GAAI,CAAC,kBAAkB,KAAK,CAAK,EAAG,MAAO,GAE7C,OAAO,GAAK,KAAO,GAAK,GAE1B,MAAO,GAGT,IAAM,EAAc,CAAC,IAA4B,GAAe,CAAK,EAEpE,EAAoB,KAAO,CAAC,EAAiB,IAA6B,CAEzE,MAAO,cADG,EAAI,OAAO,EAAc,MACR,OAAa,EAAI,KAAK,YAAY,MAE9D,EAAoB,SAAW,aAC/B,EAAoB,YAAc,CAAC,EAG7B,IAAM,GAAa,EAI1B,SAAS,EAAe,CAAC,EAAyB,CAChD,GAAI,OAAO,IAAU,SACnB,OAAO,GAAS,MAAQ,GAAS,IAEnC,GAAI,OAAO,IAAU,SAAU,CAC7B,IAAM,EAAI,WAAW,CAAK,EAC1B,GAAI,MAAM,CAAC,EAAG,MAAO,GACrB,GAAI,CAAC,kBAAkB,KAAK,CAAK,EAAG,MAAO,GAC3C,OAAO,GAAK,MAAQ,GAAK,IAE3B,MAAO,GAGT,IAAM,EAAe,CAAC,IAA4B,GAAgB,CAAK,EAEtE,EAAqB,KAAO,CAAC,EAAiB,IAA6B,CAE1E,MAAO,cADG,EAAI,OAAO,EAAe,MACT,OAAa,EAAI,KAAK,aAAa,MAE/D,EAAqB,SAAW,cAChC,EAAqB,YAAc,CAAC,EAG9B,IAAM,GAAc,EAIrB,GAAiB,sBAEV,GAAoB,EAC/B,oBACA,CAAC,IAAM,GAAe,KAAK,CAAC,EAC5B,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,EAAc,WACP,OAAa,EAAI,KAAK,mBAAmB,KAE3E,EACC,GAA0B,YAAc,CAAC,EAI1C,IAAM,GAAe,iCACf,GAAe,iCACf,GAAgB,wBAET,GAAe,EAC1B,eACA,CAAC,IAAM,GAAa,KAAK,CAAC,GAAK,GAAY,KAAK,CAAC,GAAK,GAAc,KAAK,CAAC,EAC1E,CAAC,EAAS,IAAQ,CAChB,IAAM,EAAK,EAAI,SAAS,EAAY,EAC9B,EAAK,EAAI,SAAS,EAAW,EAC7B,EAAK,EAAI,SAAS,EAAa,EACrC,MAAO,YAAY,WAAY,cAAoB,WAAY,cAAoB,WAAY,OAAa,EAAI,KAAK,cAAc,KAEvI,EACC,GAAqB,YAAc,CAAC,EAIrC,IAAM,GAAgB,IAAI,IAAI,CAC5B,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACtD,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACtD,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACtD,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACtD,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACtD,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACtD,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACtD,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACtD,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACtD,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACtD,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACtD,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACtD,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACtD,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACtD,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACtD,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACtD,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACtD,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KACxD,CAAC,EAEY,GAAwB,EACnC,wBACA,CAAC,IAAM,GAAc,IAAI,CAAC,EAC1B,CAAC,EAAS,IAAQ,CAEhB,MAAO,cADG,EAAI,OAAO,EAAa,UACH,OAAa,EAAI,KAAK,uBAAuB,KAEhF,EACC,GAA8B,YAAc,CAAC,EAI9C,IAAM,GAAgB,oBAET,GAAgB,EAC3B,gBACA,CAAC,IAAM,GAAc,KAAK,CAAC,EAC3B,CAAC,EAAS,IAAQ,CAEhB,MAAO,YADG,EAAI,SAAS,EAAa,WACN,OAAa,EAAI,KAAK,eAAe,KAEvE,EACC,GAAsB,YAAc,CAAC,EAY/B,SAAS,EAAgB,CAAC,EAAkD,CACjF,IAAM,EAAc,GAAS,WAAe,EACtC,EAAc,GAAS,cAAgB,EACvC,EAAc,GAAS,cAAgB,EACvC,EAAc,GAAS,YAAgB,EACvC,EAAc,GAAS,YAAgB,EAEvC,EAAW,CAAC,IAAuB,CACvC,GAAI,EAAE,OAAS,EAAW,MAAO,GACjC,GAAI,EAAW,GAEb,IADa,EAAE,MAAM,QAAQ,GAAK,CAAC,GAAG,OAC5B,EAAU,MAAO,GAE7B,GAAI,EAAW,GAEb,IADa,EAAE,MAAM,QAAQ,GAAK,CAAC,GAAG,OAC5B,EAAU,MAAO,GAE7B,GAAI,EAAU,GAEZ,IADa,EAAE,MAAM,QAAQ,GAAK,CAAC,GAAG,OAC5B,EAAS,MAAO,GAE5B,GAAI,EAAa,GAEf,IADa,EAAE,MAAM,eAAe,GAAK,CAAC,GAAG,OACnC,EAAY,MAAO,GAE/B,MAAO,IAGH,EAAK,CAAC,IAA4B,CACtC,GAAI,OAAO,IAAU,SAAU,MAAO,GACtC,OAAO,EAAS,CAAK,GAWvB,OARC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAEhE,MAAO,cADG,EAAI,OAAO,CAAQ,MACF,OAAa,EAAI,KAAK,kBAAkB,MAEpE,EAAW,SAAW,mBACtB,EAAW,aAAe,SAC1B,EAAW,YAAc,CAAC,EAEpB,EAKT,IAAM,GAAyC,CAC7C,GAAI,gBACJ,GAAI,sBACJ,GAAI,WACJ,GAAI,cACJ,GAAI,WACJ,GAAI,4CACJ,GAAI,2BACJ,GAAI,WACJ,GAAI,UACJ,GAAI,uBACN,EAEO,SAAS,EAAO,CAAC,EAA+B,CACrD,IAAM,EAAK,GAAe,GAEpB,EAAK,CAAC,IAA4B,CACtC,GAAI,OAAO,IAAU,SAAU,MAAO,GACtC,GAAI,CAAC,EAAI,MAAO,GAChB,OAAO,EAAG,KAAK,CAAK,GActB,OAXC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAChE,GAAI,CAAC,EACH,OAAO,EAAI,KAAK,SAAS,EAAI,IAG/B,MAAO,YADG,EAAI,SAAS,CAAE,WACK,OAAa,EAAI,KAAK,SAAS,MAE9D,EAAW,SAAW,UACtB,EAAW,aAAe,SAC1B,EAAW,YAAc,CAAC,EAEpB,ECt+CF,SAAS,EAAS,CAAC,EAAa,EAAgD,CACrF,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAU,CAAG,EACnB,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAIE,SAAS,EAAS,CAAC,EAAa,EAAgD,CACrF,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAU,CAAG,EACnB,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAIE,SAAS,EAAM,CAAC,EAAa,EAAa,EAAgD,CAC/F,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAO,EAAK,CAAG,EACrB,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAIE,SAAS,EAAQ,CAAC,EAAc,EAAgD,CACrF,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAS,CAAI,EACnB,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAIE,SAAS,EAAW,CAAC,EAAc,EAAgD,CACxF,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAY,CAAI,EACtB,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAIE,SAAS,EAAO,CAAC,EAA0B,EAAoB,EAAgD,CACpH,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAQ,EAAS,CAAS,EAChC,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAQE,SAAS,EAAW,CAAC,EAAgD,CAC1E,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAa,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAIzK,SAAS,EAAW,CAAC,EAAgD,CAC1E,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAa,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAIzK,SAAS,EAAO,CAAC,EAAgD,CACtE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,EAAS,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAIrK,SAAS,EAAO,CAAC,EAAgD,CACtE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAS,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAIrK,SAAS,EAAc,CAAC,EAAgD,CAC7E,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAgB,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAI5K,SAAS,EAAe,CAAC,EAAgD,CAC9E,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAiB,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAI7K,SAAS,EAAc,CAAC,EAAuC,EAAgD,CACpH,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAe,CAAa,EAClC,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAIE,SAAS,EAAS,CAAC,EAAmC,EAAgD,CAC3G,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAU,CAAc,EAC9B,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAIE,SAAS,EAAW,CAAC,EAAgD,CAC1E,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,EAAa,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAIzK,SAAS,EAAW,CAAC,EAAgD,CAC1E,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,EAAa,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAIzK,SAAS,EAAe,CAAC,EAAgD,CAC9E,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,EAAiB,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAI7K,SAAS,EAAW,CAAC,EAAgD,CAC1E,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,EAAa,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAIzK,SAAS,EAAe,CAAC,EAAgD,CAC9E,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,EAAiB,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAI7K,SAAS,EAAa,CAAC,EAAgD,CAC5E,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,EAAe,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAI3K,SAAS,EAAO,CAAC,EAAgD,CACtE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,EAAS,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAQrK,SAAS,EAAO,CAAC,EAA+B,EAAgD,CACrG,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAQ,CAAY,EAC1B,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAIE,SAAS,EAAK,CAAC,EAA2B,EAAgD,CAC/F,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAM,CAAU,EACtB,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAIE,SAAS,EAAM,CAAC,EAAqC,EAAgD,CAC1G,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAO,CAAO,EACpB,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAIE,SAAS,EAAI,CAAC,EAAiB,EAAgD,CACpF,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAK,CAAO,EAClB,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAIE,SAAS,EAAU,CAAC,EAAgD,CACzE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAY,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAIxK,SAAS,EAAU,CAAC,EAAgC,EAAgD,CACzG,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAW,GAAwB,EAAK,EAAG,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAIvM,SAAS,EAAK,CAAC,EAAgD,CACpE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAO,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAInK,SAAS,EAAY,CAAC,EAAkC,EAAgD,CAC7G,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAa,CAAU,EAC7B,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAIE,SAAS,EAAM,CAAC,EAAmB,EAAgD,CACxF,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAO,CAAO,EACpB,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAIE,SAAS,EAAM,CAAC,EAAgD,CACrE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAQ,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAIpK,SAAS,EAAS,CAAC,EAA+B,EAAgD,CACvG,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAU,CAAU,EAC1B,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAIE,SAAS,EAAM,CAAC,EAAgD,CACrE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAQ,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAIpK,SAAS,EAAM,CAAC,EAA6B,EAAgD,CAClG,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAO,CAAW,EACxB,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAIE,SAAS,EAAK,CAAC,EAAgD,CACpE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAO,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAInK,SAAS,EAAS,CAAC,EAAmC,EAAgD,CAC3G,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAU,CAAc,EAC9B,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAIE,SAAS,EAAQ,CAAC,EAAgD,CACvE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAU,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAItK,SAAS,EAAS,CAAC,EAAgD,CACxE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAW,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAIvK,SAAS,EAAM,CAAC,EAA6B,EAAgD,CAClG,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAO,CAAW,EACxB,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAIE,SAAS,EAAM,CAAC,EAAgD,CACrE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAQ,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAIpK,SAAS,EAAK,CAAC,EAAgD,CACpE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAO,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAInK,SAAS,EAAgB,CAAC,EAAgD,CAC/E,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAkB,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAI9K,SAAS,EAAgB,CAAC,EAAgD,CAC/E,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAkB,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAI9K,SAAS,EAAK,CAAC,EAAgD,CACpE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAO,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAInK,SAAS,EAAgB,CAAC,EAAgD,CAC/E,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAkB,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAI9K,SAAS,EAAQ,CAAC,EAAgD,CACvE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAU,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAItK,SAAS,EAAS,CAAC,EAAgD,CACxE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAW,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAIvK,SAAS,EAAM,CAAC,EAAgD,CACrE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAQ,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAIpK,SAAS,EAAQ,CAAC,EAAiC,EAAgD,CACxG,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAS,CAAa,EAC5B,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAIE,SAAS,EAAQ,CAAC,EAAgD,CACvE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAU,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAItK,SAAS,EAAQ,CAAC,EAAiC,EAAgD,CACxG,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAS,CAAa,EAC5B,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAIE,SAAS,EAAY,CAAC,EAAmC,EAAgD,CAC9G,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAa,CAAW,EAC9B,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAIE,SAAS,EAAU,CAAC,EAAgD,CACzE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAY,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAIxK,SAAS,EAAU,CAAC,EAAqC,EAAgD,CAC9G,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAW,CAAe,EAChC,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAIE,SAAS,EAAW,CAAC,EAAgD,CAC1E,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAa,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAIzK,SAAS,EAAY,CAAC,EAAgD,CAC3E,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAc,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAI1K,SAAS,EAAM,CAAC,EAA6B,EAAgD,CAClG,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAO,CAAW,EACxB,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAIE,SAAS,EAAY,CAAC,EAAa,EAAc,EAAgD,CACtG,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAa,EAAK,CAAG,EAC3B,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAQE,SAAS,EAAM,CAAC,EAAmB,EAAgD,CACxF,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAO,CAAS,EACtB,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAIE,SAAS,EAAS,CAAC,EAAgD,CACxE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAW,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAIvK,SAAS,EAAc,CAAC,EAAgD,CAC7E,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAgB,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAI5K,SAAS,EAAU,CAAC,EAAgD,CACzE,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAY,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAIxK,SAAS,EAAW,CAAC,EAAgD,CAC1E,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAa,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAIzK,SAAS,EAAiB,CAAC,EAAgD,CAChF,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAmB,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAI/K,SAAS,EAAY,CAAC,EAAgD,CAC3E,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAc,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAI1K,SAAS,EAAqB,CAAC,EAAgD,CACpF,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAuB,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAInL,SAAS,EAAa,CAAC,EAAgD,CAC5E,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CAAE,KAAM,GAAe,KAAM,GAAS,KAAM,OAAQ,GAAS,OAAQ,QAAS,GAAS,QAAS,QAAS,GAAS,OAAQ,CAAC,GAI3K,SAAS,EAAgB,CAAC,EAAqC,EAAgD,CACpH,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAiB,CAAS,EAChC,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAIE,SAAS,EAAO,CAAC,EAAgB,EAAgD,CACtF,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAQ,CAAM,EACpB,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GC3mBE,SAAS,EAAa,CAAC,EAAkC,CAC9D,IAAM,EAAK,CAAC,IAA4B,CACtC,GAAI,CAAC,MAAM,QAAQ,CAAK,EAAG,MAAO,GAClC,OAAO,EAAO,MAAM,CAAC,IAAM,EAAM,SAAS,CAAC,CAAC,GAU9C,OAPC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAEhE,MAAO,cADG,EAAI,OAAO,CAAM,+BACyB,yBAA+B,EAAI,KAAK,eAAe,MAE5G,EAAW,SAAW,gBACtB,EAAW,YAAc,CAAE,OAAQ,CAAO,EAEpC,EAOF,SAAS,EAAgB,CAAC,EAAkC,CACjE,IAAM,EAAK,CAAC,IAA4B,CACtC,GAAI,CAAC,MAAM,QAAQ,CAAK,EAAG,MAAO,GAClC,OAAO,EAAO,MAAM,CAAC,IAAM,CAAC,EAAM,SAAS,CAAC,CAAC,GAU/C,OAPC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAEhE,MAAO,aADG,EAAI,OAAO,CAAM,8BACuB,yBAA+B,EAAI,KAAK,kBAAkB,MAE7G,EAAW,SAAW,mBACtB,EAAW,YAAc,CAAE,OAAQ,CAAO,EAEpC,EAOF,SAAS,EAAY,CAAC,EAA4B,CACvD,IAAM,EAAK,CAAC,IACV,MAAM,QAAQ,CAAK,GAAK,EAAM,QAAU,EAO1C,OALC,EAAW,KAAO,CAAC,EAAiB,IACnC,OAAO,cAAoB,MAAQ,EAAI,KAAK,cAAc,KAC3D,EAAW,SAAW,eACtB,EAAW,YAAc,CAAE,IAAK,CAAI,EAE9B,EAOF,SAAS,EAAY,CAAC,EAA4B,CACvD,IAAM,EAAK,CAAC,IACV,MAAM,QAAQ,CAAK,GAAK,EAAM,QAAU,EAO1C,OALC,EAAW,KAAO,CAAC,EAAiB,IACnC,OAAO,cAAoB,MAAQ,EAAI,KAAK,cAAc,KAC3D,EAAW,SAAW,eACtB,EAAW,YAAc,CAAE,IAAK,CAAI,EAE9B,EAOF,SAAS,EAAW,CAAC,EAAuD,CACjF,IAAM,EAAK,CAAC,IAA4B,CACtC,GAAI,CAAC,MAAM,QAAQ,CAAK,EAAG,MAAO,GAClC,GAAI,EAAY,CACd,IAAM,EAAO,EAAM,IAAI,CAAU,EACjC,OAAO,IAAI,IAAI,CAAI,EAAE,OAAS,EAAK,OAErC,OAAO,IAAI,IAAI,CAAK,EAAE,OAAS,EAAM,QAavC,OAVC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAChE,GAAI,EAAY,CACd,IAAM,EAAI,EAAI,OAAO,CAAU,EAC/B,MAAO,cAAc,eAAqB,6CAA6C,EAAI,KAAK,aAAa,MAE/G,MAAO,cAAc,aAAmB,YAAkB,EAAI,KAAK,aAAa,MAEjF,EAAW,SAAW,cACtB,EAAW,YAAc,CAAC,EAEpB,EAOT,IAAM,EAAiB,CAAC,IACtB,MAAM,QAAQ,CAAK,GAAK,EAAM,OAAS,EAExC,EAAuB,KAAO,CAAC,EAAiB,IAC/C,OAAO,mBAAyB,EAAI,KAAK,eAAe,KACzD,EAAuB,SAAW,gBAClC,EAAuB,YAAc,CAAC,EAChC,IAAM,GAAgB,ECpGtB,SAAS,EAAa,CAAC,EAAmB,EAAgD,CAC/F,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAc,CAAM,EAC1B,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAgB,CAAC,EAAmB,EAAgD,CAClG,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAiB,CAAM,EAC7B,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAY,CAAC,EAAa,EAAgD,CACxF,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAa,CAAG,EACtB,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAY,CAAC,EAAa,EAAgD,CACxF,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAa,CAAG,EACtB,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAW,CAAC,EAAsC,EAAgD,CAChH,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAY,CAAU,EAC5B,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAa,CAAC,EAAgD,CAC5E,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GACN,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GC1EE,SAAS,EAAgB,CAAC,EAAkD,CACjF,IAAM,EAAK,CAAC,IAA4B,CACtC,GAAI,IAAU,MAAQ,OAAO,IAAU,UAAY,MAAM,QAAQ,CAAK,EAAG,MAAO,GAChF,IAAM,EAAO,OAAO,KAAK,CAAe,EACxC,GAAI,GAAS,SACX,OAAO,EAAK,KAAK,CAAC,IAAO,EAAkC,IAAM,IAAI,EAEvE,OAAO,EAAK,OAAS,GAavB,OAVC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAChE,GAAI,GAAS,SAEX,MAAO,cADG,EAAI,OAAO,CAAE,MACI,OAAa,EAAI,KAAK,kBAAkB,KAErE,MAAO,mBAAmB,oBAA0B,EAAI,KAAK,kBAAkB,MAEhF,EAAW,SAAW,mBACtB,EAAW,YAAc,CAAE,SAAU,GAAS,QAAS,EAEjD,EAOF,SAAS,EAAU,CAAC,EAAwD,CACjF,IAAM,EAAK,CAAC,IAA4B,aAAiB,EASzD,OAPC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAChE,IAAM,EAAI,EAAI,OAAO,CAAU,EAC/B,MAAO,SAAS,sBAA4B,QAAQ,EAAI,KAAK,YAAY,MAE1E,EAAW,SAAW,aACtB,EAAW,YAAc,CAAE,KAAM,EAAW,IAAK,EAE3C,ECnCF,SAAS,EAAgB,CAAC,EAAyC,EAAgD,CACxH,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAiB,CAAa,EACpC,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAU,CAAC,EAAyC,EAAgD,CAClH,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAW,CAAU,EAC3B,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GCuBE,SAAS,EAAM,CAAC,EAA4C,CACjE,MAAO,CAAC,EAAQ,IAAQ,CACtB,GAAc,EAAkB,EAAgB,GAAW,CAAC,CAAe,GAYxE,SAAS,EAAO,CAAC,EAA6C,CACnE,MAAO,CAAC,EAAQ,IAAQ,CACtB,GAAe,EAAkB,EAAgB,GAAW,CAAC,CAAgB,GAS1E,SAAS,EAAS,CAAC,EAAuB,EAA+C,CAC9F,MAAO,CAAC,EAAQ,IAAQ,CACtB,GAAiB,EAAkB,EAAe,CAChD,KACA,QAAS,EAAU,CACjB,OAAQ,EAAQ,OAChB,gBAAiB,EAAQ,gBACzB,cAAe,EAAQ,aACzB,EAAI,MACN,CAAC,GASE,SAAS,EAAI,CAAC,EAAoB,EAA0C,CACjF,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAY,EAAkB,EAAe,CAC3C,GAAI,EACJ,cAAe,GAAS,cACxB,0BAA2B,GAAS,yBACtC,CAAC,GCvFE,SAAS,EAAM,CACpB,EACK,CACL,MAAO,CAAC,EAAa,IAA0B,CAC7C,GAAI,IAAQ,OAEV,GAAc,EAAkB,EAAe,CAAiB,EAC3D,KAEL,GAAI,OAAO,IAAe,WACxB,MAAU,MAAM,2DAA2D,EAE7E,GAAmB,EAAoB,CAAqC,ICvBlF,IAAM,GAA+C,CACnD,QAAS,8BACT,QAAS,8BACT,QAAS,wBACT,QAAS,oBACT,QAAS,6BACT,QAAS,sCACT,QAAS,sBACT,QAAS,wBACT,QAAS,kBACT,QAAS,4BACT,QAAS,uBACT,QAAS,oBACT,QAAS,yBACT,QAAS,yBACT,QAAS,uBACT,QAAS,sBACT,QAAS,qBACT,QAAS,mBACT,QAAS,mBACT,QAAS,sBACT,QAAS,wBACX,EAEO,SAAS,EAAa,CAAC,EAA+B,CAC3D,IAAM,EAAK,GAAqB,GAE1B,EAAK,CAAC,IAA4B,CACtC,GAAI,OAAO,IAAU,SAAU,MAAO,GACtC,GAAI,CAAC,EAAI,MAAO,GAChB,OAAO,EAAG,KAAK,CAAK,GActB,OAXC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAChE,GAAI,CAAC,EACH,OAAO,EAAI,KAAK,eAAe,EAAI,IAGrC,MAAO,YADG,EAAI,SAAS,CAAE,WACK,OAAa,EAAI,KAAK,eAAe,MAEpE,EAAW,SAAW,gBACtB,EAAW,aAAe,SAC1B,EAAW,YAAc,CAAE,QAAO,EAE5B,EAKT,IAAM,GAA8C,CAClD,GAAI,YACJ,GAAI,UACJ,GAAI,UACJ,GAAI,UACJ,GAAI,UACJ,GAAI,UACJ,GAAI,iBACJ,GAAI,UACJ,GAAI,sEACJ,GAAI,UACJ,GAAI,UACJ,GAAI,iBACJ,GAAI,UACJ,GAAI,UACJ,GAAI,UACJ,GAAI,UACJ,GAAI,UACJ,GAAI,iBACJ,GAAI,uHACJ,GAAI,iBACJ,GAAI,UACJ,GAAI,UACJ,GAAI,UACJ,GAAI,kBACJ,GAAI,UACJ,GAAI,UACJ,GAAI,UACJ,GAAI,iBACJ,GAAI,UACJ,GAAI,wBACJ,GAAI,aACJ,GAAI,UACJ,GAAI,aACJ,GAAI,UACJ,GAAI,qBACJ,GAAI,UACJ,GAAI,qBACJ,GAAI,UACJ,GAAI,UACJ,GAAI,UACJ,GAAI,UACJ,GAAI,UACJ,GAAI,gBACJ,GAAI,yBACJ,GAAI,gBACJ,GAAI,UACJ,GAAI,UACJ,GAAI,iBACJ,GAAI,UACJ,GAAI,UACJ,GAAI,iBACJ,GAAI,UACJ,GAAI,UACJ,GAAI,kBACJ,GAAI,UACJ,GAAI,mBACJ,GAAI,UACJ,GAAI,SACN,EAEO,SAAS,EAAY,CAAC,EAA+B,CAC1D,IAAM,EAAK,GAAoB,GAEzB,EAAK,CAAC,IAA4B,CACtC,GAAI,OAAO,IAAU,SAAU,MAAO,GACtC,GAAI,CAAC,EAAI,MAAO,GAChB,OAAO,EAAG,KAAK,CAAK,GActB,OAXC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAChE,GAAI,CAAC,EACH,OAAO,EAAI,KAAK,cAAc,EAAI,IAGpC,MAAO,YADG,EAAI,SAAS,CAAE,WACK,OAAa,EAAI,KAAK,cAAc,MAEnE,EAAW,SAAW,eACtB,EAAW,aAAe,SAC1B,EAAW,YAAc,CAAE,QAAO,EAE5B,EAKT,IAAM,GAAgD,CACpD,GAAK,UACL,GAAK,qBACL,GAAK,YACL,GAAK,aACL,GAAK,WACL,GAAK,WACL,GAAK,UACL,GAAK,mBACL,GAAK,UACL,GAAK,cACL,GAAK,0BACL,GAAK,gBACL,GAAK,aACL,GAAK,iCACL,GAAK,WACL,GAAK,WACL,GAAK,4CACL,GAAK,oCACL,GAAK,kCACL,GAAK,wBACL,GAAK,mBACL,GAAK,WACL,GAAK,mBACL,GAAK,WACL,GAAK,qBACL,GAAK,UACL,GAAK,WACL,GAAK,WACL,GAAK,WACL,GAAK,4CACL,GAAK,WACL,GAAK,gBACL,GAAK,WACL,GAAK,WACL,GAAK,gBACL,GAAK,WACL,GAAK,6DACL,GAAK,gBACL,GAAK,UACL,GAAK,WACL,GAAK,WACL,GAAK,uBACL,GAAK,WACL,GAAK,WACL,GAAK,WACL,GAAK,cACL,GAAK,WACL,GAAK,aACL,GAAK,WACL,GAAK,WACL,GAAK,gBACL,GAAK,UACL,GAAK,sBACL,GAAK,UACP,EAEO,SAAS,EAAc,CAAC,EAA+B,CAC5D,IAAM,EAAK,GAAsB,GAE3B,EAAK,CAAC,IAA4B,CACtC,GAAI,OAAO,IAAU,SAAU,MAAO,GACtC,GAAI,CAAC,EAAI,MAAO,GAChB,OAAO,EAAG,KAAK,CAAK,GActB,OAXC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAChE,GAAI,CAAC,EACH,OAAO,EAAI,KAAK,gBAAgB,EAAI,IAGtC,MAAO,YADG,EAAI,SAAS,CAAE,WACK,OAAa,EAAI,KAAK,gBAAgB,MAErE,EAAW,SAAW,iBACtB,EAAW,aAAe,SAC1B,EAAW,YAAc,CAAE,QAAO,EAE5B,EAKT,IAAM,GAA2C,CAC/C,GAAK,mBACL,GAAK,mBACL,GAAK,gBACL,GAAK,gBACL,GAAK,cACL,GAAK,mBACL,GAAK,UACL,GAAK,mBACL,GAAK,mBACL,GAAK,mBACL,GAAK,mBACL,GAAK,gBACL,GAAK,WACL,GAAK,wBACL,GAAK,UACL,GAAK,+BACL,GAAK,UACL,GAAK,gCACL,GAAK,iCACL,GAAK,mBACL,GAAK,eACL,GAAK,UACL,GAAK,mBACL,GAAK,UACL,GAAK,2BACL,GAAK,gBACL,GAAK,sBACL,GAAK,UACL,GAAK,gBACL,GAAK,gBACL,GAAK,cACL,GAAK,iBACL,GAAK,mBACL,GAAK,mBACL,GAAK,wBACL,GAAK,UACL,GAAK,gBACL,GAAK,iBACL,GAAK,iBACL,GAAK,iBACL,GAAK,sBACL,GAAK,mBACL,GAAK,sBACL,GAAK,mBACL,GAAK,mBACL,GAAK,gBACL,GAAK,UACL,GAAK,gBACL,GAAK,qBACL,GAAK,iCACL,GAAK,UACL,GAAK,mBACL,GAAK,qBACL,GAAK,mBACL,GAAK,mBACL,GAAK,gBACL,GAAK,UACL,GAAK,UACL,GAAK,UACL,GAAK,gBACL,GAAK,UACL,GAAK,mBACL,GAAK,mBACL,GAAK,uBACL,GAAK,UACL,GAAK,gBACL,GAAK,gBACL,GAAK,mBACL,GAAK,UACL,GAAK,eACP,EAEO,SAAS,EAAgB,CAAC,EAA+B,CAC9D,IAAM,EAAK,GAAiB,GAEtB,EAAK,CAAC,IAA4B,CACtC,GAAI,OAAO,IAAU,SAAU,MAAO,GACtC,GAAI,CAAC,EAAI,MAAO,GAChB,OAAO,EAAG,KAAK,CAAK,GActB,OAXC,EAAW,KAAO,CAAC,EAAiB,IAA6B,CAChE,GAAI,CAAC,EACH,OAAO,EAAI,KAAK,kBAAkB,EAAI,IAGxC,MAAO,YADG,EAAI,SAAS,CAAE,WACK,OAAa,EAAI,KAAK,kBAAkB,MAEvE,EAAW,SAAW,mBACtB,EAAW,aAAe,SAC1B,EAAW,YAAc,CAAE,QAAO,EAE5B,EChTF,SAAS,EAAa,CAAC,EAAgB,EAAgD,CAC5F,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAc,CAAM,EAC1B,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAY,CAAC,EAAgB,EAAgD,CAC3F,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAa,CAAM,EACzB,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAc,CAAC,EAAgB,EAAgD,CAC7F,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAe,CAAM,EAC3B,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC,GAKE,SAAS,EAAgB,CAAC,EAAgB,EAAgD,CAC/F,MAAO,CAAC,EAAQ,IAAQ,CACtB,EAAkB,EAAkB,EAAe,CACjD,KAAM,GAAiB,CAAM,EAC7B,KAAM,GAAS,KACf,OAAQ,GAAS,OACjB,QAAS,GAAS,QAClB,QAAS,GAAS,OACpB,CAAC",
|
|
29
|
-
"debugId": "AA223C1C9EEBEA8B64756E2164756E21",
|
|
30
|
-
"names": []
|
|
31
|
-
}
|
package/dist/index-txxjqhgc.js
DELETED