HEX
Server: nginx/1.27.1
System: Linux in-3 5.15.0-161-generic #171-Ubuntu SMP Sat Oct 11 08:17:01 UTC 2025 x86_64
User: ivenus-clone (3297)
PHP: 7.4.33
Disabled: exec,passthru,shell_exec,system,proc_open,popen,parse_ini_file,show_source
Upload Files
File: /storage/v4513/sanjivani/public_html/wp-content/plugins/booking/vendors/imask/dist/imask.min.js.map
{"version":3,"file":"imask.min.js","sources":["../src/core/utils.ts","../src/core/action-details.ts","../src/core/holder.ts","../src/masked/factory.ts","../src/controls/mask-element.ts","../src/controls/html-mask-element.ts","../src/controls/html-input-mask-element.ts","../src/controls/html-contenteditable-mask-element.ts","../src/controls/input-history.ts","../src/controls/input.ts","../src/core/change-details.ts","../src/core/continuous-tail-details.ts","../src/masked/base.ts","../src/masked/pattern/chunk-tail-details.ts","../src/masked/pattern/cursor.ts","../src/masked/pattern/fixed-definition.ts","../src/masked/pattern/input-definition.ts","../src/masked/regexp.ts","../src/masked/pattern.ts","../src/masked/range.ts","../src/masked/date.ts","../src/masked/dynamic.ts","../src/masked/enum.ts","../src/masked/function.ts","../src/masked/number.ts","../src/masked/pipe.ts","../src/masked/repeat.ts","../src/index.ts"],"sourcesContent":["/** Checks if value is string */\nexport\nfunction isString (str: unknown): str is string {\n  return typeof str === 'string' || str instanceof String;\n}\n\n/** Checks if value is object */\nexport\nfunction isObject (obj: unknown): obj is object {\n  return typeof obj === 'object' && obj != null && obj?.constructor?.name === 'Object';\n}\n\nexport\nfunction pick<T extends Record<string, any>, K extends keyof T, V extends T[keyof T]> (\n  obj: T,\n  keys: K[] | ((v: V, k: K) => boolean),\n): Pick<T, K> {\n  if (Array.isArray(keys)) return pick(obj, (_, k) => keys.includes(k));\n  return (Object.entries(obj) as unknown as Array<[K, V]>)\n    .reduce((acc, [k, v]) => {\n      if (keys(v, k)) acc[k] = v;\n      return acc;\n    }, {} as any);\n}\n\n/** Direction */\nexport\nconst DIRECTION = {\n  NONE: 'NONE',\n  LEFT: 'LEFT',\n  FORCE_LEFT: 'FORCE_LEFT',\n  RIGHT: 'RIGHT',\n  FORCE_RIGHT: 'FORCE_RIGHT',\n} as const;\n\n/** Direction */\nexport\ntype Direction = typeof DIRECTION[keyof typeof DIRECTION];\n\nexport\nfunction forceDirection (direction: Direction): Direction {\n  switch (direction) {\n    case DIRECTION.LEFT:\n      return DIRECTION.FORCE_LEFT;\n    case DIRECTION.RIGHT:\n      return DIRECTION.FORCE_RIGHT;\n    default:\n      return direction;\n  }\n}\n\n/** Escapes regular expression control chars */\nexport\nfunction escapeRegExp (str: string): string {\n  return str.replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1');\n}\n\n// cloned from https://github.com/epoberezkin/fast-deep-equal with small changes\nexport\nfunction objectIncludes (b: any, a: any): boolean {\n  if (a === b) return true;\n\n  const arrA = Array.isArray(a), arrB = Array.isArray(b);\n  let i;\n\n  if (arrA && arrB) {\n    if (a.length != b.length) return false;\n    for (i = 0; i < a.length; i++)\n      if (!objectIncludes(a[i], b[i])) return false;\n    return true;\n  }\n\n  if (arrA != arrB) return false;\n\n  if (a && b && typeof a === 'object' && typeof b === 'object') {\n    const dateA = a instanceof Date, dateB = b instanceof Date;\n    if (dateA && dateB) return a.getTime() == b.getTime();\n    if (dateA != dateB) return false;\n\n    const regexpA = a instanceof RegExp, regexpB = b instanceof RegExp;\n    if (regexpA && regexpB) return a.toString() == b.toString();\n    if (regexpA != regexpB) return false;\n\n    const keys = Object.keys(a);\n    // if (keys.length !== Object.keys(b).length) return false;\n\n    for (i = 0; i < keys.length; i++)\n      if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n    for (i = 0; i < keys.length; i++)\n      if(!objectIncludes(b[keys[i]], a[keys[i]])) return false;\n\n    return true;\n  } else if (a && b && typeof a === 'function' && typeof b === 'function') {\n      return a.toString() === b.toString()\n  }\n\n  return false;\n}\n\n/** Selection range */\nexport\ntype Selection = {\n  start: number;\n  end: number;\n};\n","import { type Direction, type Selection, DIRECTION } from './utils';\n\nexport\ntype ActionDetailsOptions = Pick<ActionDetails,\n  | 'value'\n  | 'cursorPos'\n  | 'oldValue'\n  | 'oldSelection'\n>;\n\n\n/** Provides details of changing input */\nexport default\nclass ActionDetails {\n  /** Current input value */\n  declare value: string;\n  /** Current cursor position */\n  declare cursorPos: number;\n  /** Old input value */\n  declare oldValue: string;\n  /** Old selection */\n  declare oldSelection: Selection;\n\n  constructor (opts: ActionDetailsOptions) {\n    Object.assign(this, opts);\n\n    // double check if left part was changed (autofilling, other non-standard input triggers)\n    while (this.value.slice(0, this.startChangePos) !== this.oldValue.slice(0, this.startChangePos)) {\n      --this.oldSelection.start;\n    }\n\n    if (this.insertedCount) {\n      // double check right part\n      while (this.value.slice(this.cursorPos) !== this.oldValue.slice(this.oldSelection.end)) {\n        if (this.value.length - this.cursorPos < this.oldValue.length - this.oldSelection.end) ++this.oldSelection.end;\n        else ++this.cursorPos;\n      }\n    }\n  }\n\n  /** Start changing position */\n  get startChangePos (): number {\n    return Math.min(this.cursorPos, this.oldSelection.start);\n  }\n\n  /** Inserted symbols count */\n  get insertedCount (): number {\n    return this.cursorPos - this.startChangePos;\n  }\n\n  /** Inserted symbols */\n  get inserted (): string {\n    return this.value.substr(this.startChangePos, this.insertedCount);\n  }\n\n  /** Removed symbols count */\n  get removedCount (): number {\n    // Math.max for opposite operation\n    return Math.max((this.oldSelection.end - this.startChangePos) ||\n      // for Delete\n      this.oldValue.length - this.value.length, 0);\n  }\n\n  /** Removed symbols */\n  get removed (): string {\n    return this.oldValue.substr(this.startChangePos, this.removedCount);\n  }\n\n  /** Unchanged head symbols */\n  get head (): string {\n    return this.value.substring(0, this.startChangePos);\n  }\n\n  /** Unchanged tail symbols */\n  get tail (): string {\n    return this.value.substring(this.startChangePos + this.insertedCount);\n  }\n\n  /** Remove direction */\n  get removeDirection (): Direction {\n    if (!this.removedCount || this.insertedCount) return DIRECTION.NONE;\n\n    // align right if delete at right\n    return (\n      (this.oldSelection.end === this.cursorPos || this.oldSelection.start === this.cursorPos) &&\n      // if not range removed (event with backspace)\n      this.oldSelection.end === this.oldSelection.start\n    ) ?\n      DIRECTION.RIGHT :\n      DIRECTION.LEFT;\n  }\n}\n","import type { default as _InputMask, InputMaskElement as _InputMaskElement } from '../controls/input';\nimport type { default as _Masked } from '../masked/base';\nimport type { default as _MaskedPattern } from '../masked/pattern';\nimport type { default as _RepeatBlock } from '../masked/repeat';\nimport type { default as _MaskedDate } from '../masked/date';\nimport type { default as _MaskedDynamic } from '../masked/dynamic';\nimport type { default as _MaskedEnum } from '../masked/enum';\nimport type { default as _MaskedRange } from '../masked/range';\nimport type { default as _MaskedNumber } from '../masked/number';\nimport type { default as _MaskedFunction } from '../masked/function';\nimport type { default as _MaskedRegExp } from '../masked/regexp';\nimport type {\n  default as _createMask,\n  FactoryArg,\n} from '../masked/factory';\nimport type { default as _ChangeDetails } from './change-details';\n\nimport type { default as _MaskElement } from '../controls/mask-element';\nimport type { default as _HTMLMaskElement } from '../controls/html-mask-element';\nimport type { default as _HTMLContenteditableMaskElement } from '../controls/html-contenteditable-mask-element';\nimport type {\n  createPipe as _createPipe,\n  pipe as _pipe,\n  PIPE_TYPE as _PIPE_TYPE\n} from '../masked/pipe';\n\n\n/** Applies mask on element */\nfunction IMask<Opts extends FactoryArg> (el: _InputMaskElement, opts: Opts): _InputMask<Opts> {\n  // currently available only for input-like elements\n  return new IMask.InputMask(el, opts);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\ndeclare namespace IMask {\n  export let InputMask: typeof _InputMask;\n  export let createMask: typeof _createMask;\n  export let Masked: typeof _Masked;\n  export let MaskedPattern: typeof _MaskedPattern;\n  export let RepeatBlock: typeof _RepeatBlock;\n  export let MaskedDate: typeof _MaskedDate;\n  export let MaskedDynamic: typeof _MaskedDynamic;\n  export let MaskedEnum: typeof _MaskedEnum;\n  export let MaskedRange: typeof _MaskedRange;\n  export let MaskedNumber: typeof _MaskedNumber;\n  export let MaskedFunction: typeof _MaskedFunction;\n  export let MaskedRegExp: typeof _MaskedRegExp;\n  export let ChangeDetails: typeof _ChangeDetails;\n  export let MaskElement: typeof _MaskElement;\n  export let HTMLMaskElement: typeof _HTMLMaskElement;\n  export let HTMLContenteditableMaskElement: typeof _HTMLContenteditableMaskElement;\n  export let createPipe: typeof _createPipe;\n  export let pipe: typeof _pipe;\n  export let PIPE_TYPE: typeof _PIPE_TYPE;\n}\n\nexport default IMask;\n","import { isString, pick, isObject } from '../core/utils';\nimport type Masked from './base';\nimport { type MaskedOptions } from './base';\nimport IMask from '../core/holder';\n\nimport type MaskedRegExp from './regexp';\nimport type MaskedPattern from './pattern';\nimport type MaskedFunction from './function';\nimport type MaskedDate from './date';\nimport type MaskedNumber from './number';\nimport type MaskedDynamic from './dynamic';\nimport type MaskedRange from './range';\nimport type MaskedEnum from './enum';\n\nimport { type MaskedEnumOptions } from './enum';\nimport { type MaskedRangeOptions } from './range';\nimport { type MaskedDynamicOptions } from './dynamic';\nimport { type MaskedPatternOptions } from './pattern';\nimport { type MaskedNumberOptions } from './number';\nimport { type MaskedRegExpOptions } from './regexp';\nimport { type MaskedFunctionOptions } from './function';\nimport { type MaskedDateOptions } from './date';\n\ntype MaskedDateFactoryOptions = Omit<MaskedDateOptions, 'mask'> & { mask: DateConstructor };\n\nexport\ntype FactoryStaticOpts =\n  | MaskedDateFactoryOptions\n  | MaskedNumberOptions\n  | MaskedPatternOptions\n  | MaskedDynamicOptions\n  | MaskedRegExpOptions\n  | MaskedFunctionOptions\n;\n\nexport\ntype AllFactoryStaticOpts =\n  & MaskedDateFactoryOptions\n  & MaskedNumberOptions\n  & MaskedPatternOptions\n  & MaskedDynamicOptions\n  & MaskedRegExpOptions\n  & MaskedFunctionOptions\n  & MaskedEnumOptions\n  & MaskedRangeOptions\n;\n\nexport\ntype FactoryStaticReturnMasked<Opts extends FactoryStaticOpts> =\n  Opts extends MaskedDateFactoryOptions ? MaskedDate :\n  Opts extends MaskedNumberOptions ? MaskedNumber :\n  Opts extends MaskedPatternOptions ? MaskedPattern :\n  Opts extends MaskedDynamicOptions ? MaskedDynamic :\n  Opts extends MaskedRegExpOptions ? MaskedRegExp :\n  Opts extends MaskedFunctionOptions ? MaskedFunction :\n  never\n;\n\nexport\ntype FactoryStaticMaskReturnMasked<Mask extends FactoryStaticOpts['mask']> =\n  Mask extends MaskedDateFactoryOptions['mask'] ? MaskedDate :\n  Mask extends MaskedNumberOptions['mask'] ? MaskedNumber :\n  Mask extends MaskedPatternOptions['mask'] ? MaskedPattern :\n  Mask extends MaskedDynamicOptions['mask'] ? MaskedDynamic :\n  Mask extends MaskedRegExpOptions['mask'] ? MaskedRegExp :\n  Mask extends MaskedFunctionOptions['mask'] ? MaskedFunction :\n  never\n;\n\n\nexport\ntype FactoryInstanceOpts =\n  | { mask: MaskedDate } & Omit<MaskedDateFactoryOptions, 'mask'>\n  | { mask: MaskedNumber } & Omit<MaskedNumberOptions, 'mask'>\n  | { mask: MaskedEnum } & Omit<MaskedEnumOptions, 'mask'>\n  | { mask: MaskedRange } & Omit<MaskedRangeOptions, 'mask'>\n  | { mask: MaskedRegExp } & Omit<MaskedRegExpOptions, 'mask'>\n  | { mask: MaskedFunction } & Omit<MaskedFunctionOptions, 'mask'>\n  | { mask: MaskedPattern } & Omit<MaskedPatternOptions, 'mask'>\n  | { mask: MaskedDynamic } & Omit<MaskedDynamicOptions, 'mask'>\n  | { mask: Masked } & Omit<MaskedOptions, 'mask'>\n;\n\nexport\ntype FactoryInstanceReturnMasked<Opts extends FactoryInstanceOpts> = Opts extends { mask: infer M } ? M : never;\n\nexport\ntype FactoryConstructorOpts =\n  | { mask: typeof MaskedDate } & Omit<MaskedDateFactoryOptions, 'mask'>\n  | { mask: typeof MaskedNumber } & Omit<MaskedNumberOptions, 'mask'>\n  | { mask: typeof MaskedEnum } & Omit<MaskedEnumOptions, 'mask'>\n  | { mask: typeof MaskedRange } & Omit<MaskedRangeOptions, 'mask'>\n  | { mask: typeof MaskedRegExp } & Omit<MaskedRegExpOptions, 'mask'>\n  | { mask: typeof MaskedFunction } & Omit<MaskedFunctionOptions, 'mask'>\n  | { mask: typeof MaskedPattern } & Omit<MaskedPatternOptions, 'mask'>\n  | { mask: typeof MaskedDynamic } & Omit<MaskedDynamicOptions, 'mask'>\n  | { mask: typeof Masked } & Omit<MaskedOptions, 'mask'>\n;\n \nexport\ntype FactoryConstructorReturnMasked<Opts extends FactoryConstructorOpts> =\n  Opts extends { mask: typeof MaskedDate } ? MaskedDate :\n  Opts extends { mask: typeof MaskedNumber } ? MaskedNumber :\n  Opts extends { mask: typeof MaskedEnum } ? MaskedEnum :\n  Opts extends { mask: typeof MaskedRange } ? MaskedRange :\n  Opts extends { mask: typeof MaskedRegExp } ? MaskedRegExp :\n  Opts extends { mask: typeof MaskedFunction } ? MaskedFunction :\n  Opts extends { mask: typeof MaskedPattern } ? MaskedPattern :\n  Opts extends { mask: typeof MaskedDynamic } ? MaskedDynamic :\n  Masked\n;\n\nexport\ntype FactoryOpts = FactoryConstructorOpts | FactoryInstanceOpts | FactoryStaticOpts;\n\nexport\ntype FactoryArg = Masked | FactoryOpts | FactoryStaticOpts['mask'];\n\nexport\ntype ExtendFactoryArgOptions<Opts extends { [key: string]: any }> =\n  Masked | FactoryOpts & Opts | FactoryStaticOpts['mask']\n;\n\nexport\ntype UpdateStaticOpts<Opts extends FactoryStaticOpts> =\n  Opts extends MaskedEnumOptions ? MaskedEnumOptions :\n  Opts extends MaskedRangeOptions ? MaskedRangeOptions :\n  Opts extends MaskedDynamicOptions ? MaskedDynamicOptions :\n  Opts extends MaskedPatternOptions ? MaskedPatternOptions :\n  Opts extends MaskedDateOptions ? MaskedDateOptions :\n  Opts extends MaskedNumberOptions ? MaskedNumberOptions :\n  Opts extends MaskedRegExpOptions ? MaskedRegExpOptions :\n  Opts extends MaskedFunctionOptions ? MaskedFunctionOptions :\n  never\n;\n\ntype AnyOpts = Record<string, any>;\n\nexport\ntype UpdateInstanceOpts<M extends Masked> =\n  M extends MaskedRegExp ? MaskedRegExpOptions :\n  M extends MaskedFunction ? MaskedFunctionOptions :\n  M extends MaskedDate ? MaskedDateOptions :\n  M extends MaskedNumber ? MaskedNumberOptions :\n  M extends MaskedDynamic ? MaskedDynamicOptions :\n  M extends MaskedRange ? MaskedRangeOptions :\n  M extends MaskedEnum ? MaskedEnumOptions :\n  M extends MaskedPattern ? MaskedPatternOptions :\n  AnyOpts\n;\n\nexport\ntype UpdateConstructorOpts<M extends FactoryConstructorOpts> =\n  M extends { mask: typeof MaskedDate } ? MaskedDateOptions :\n  M extends { mask: typeof MaskedNumber } ? MaskedNumberOptions :\n  M extends { mask: typeof MaskedEnum } ? MaskedEnumOptions :\n  M extends { mask: typeof MaskedRange } ? MaskedRangeOptions :\n  M extends { mask: typeof MaskedRegExp } ? MaskedRegExpOptions :\n  M extends { mask: typeof MaskedFunction } ? MaskedFunctionOptions :\n  M extends { mask: typeof MaskedPattern } ? MaskedPatternOptions :\n  M extends { mask: typeof MaskedDynamic } ? MaskedDynamicOptions :\n  AnyOpts\n;\n\nexport\ntype UpdateStaticMaskOpts<M extends FactoryStaticOpts['mask']> =\n  M extends MaskedDateFactoryOptions['mask'] ? MaskedDateOptions :\n  M extends MaskedNumberOptions['mask'] ? MaskedNumberOptions :\n  M extends MaskedPatternOptions['mask'] ? MaskedPatternOptions :\n  M extends MaskedDynamicOptions['mask'] ? MaskedDynamicOptions :\n  M extends MaskedRegExpOptions['mask'] ? MaskedRegExpOptions :\n  M extends MaskedFunctionOptions['mask'] ? MaskedFunctionOptions :\n  never\n;\n\nexport\ntype UpdateOpts<Opts extends FactoryArg> = Partial<\n  Opts extends Masked ? UpdateInstanceOpts<Opts> :\n  Opts extends FactoryStaticOpts['mask'] ? UpdateStaticMaskOpts<Opts> :\n  Opts extends FactoryStaticOpts ? UpdateStaticOpts<Opts> :\n  Opts extends FactoryInstanceOpts ? UpdateInstanceOpts<Opts['mask']> :\n  Opts extends FactoryConstructorOpts ? UpdateConstructorOpts<Opts> :\n  AnyOpts\n>;\n\nexport\ntype FactoryReturnMasked<Opts extends FactoryArg> =\n  Opts extends Masked ? Opts :\n  Opts extends FactoryStaticOpts['mask'] ? FactoryStaticMaskReturnMasked<Opts> :\n  Opts extends FactoryConstructorOpts ? FactoryConstructorReturnMasked<Opts> :\n  Opts extends FactoryInstanceOpts ? FactoryInstanceReturnMasked<Opts> :\n  Opts extends FactoryStaticOpts ? FactoryStaticReturnMasked<Opts> :\n  never\n;\n\n\n// TODO can't use overloads here because of https://github.com/microsoft/TypeScript/issues/50754\n// export function maskedClass(mask: string): typeof MaskedPattern;\n// export function maskedClass(mask: DateConstructor): typeof MaskedDate;\n// export function maskedClass(mask: NumberConstructor): typeof MaskedNumber;\n// export function maskedClass(mask: Array<any> | ArrayConstructor): typeof MaskedDynamic;\n// export function maskedClass(mask: MaskedDate): typeof MaskedDate;\n// export function maskedClass(mask: MaskedNumber): typeof MaskedNumber;\n// export function maskedClass(mask: MaskedEnum): typeof MaskedEnum;\n// export function maskedClass(mask: MaskedRange): typeof MaskedRange;\n// export function maskedClass(mask: MaskedRegExp): typeof MaskedRegExp;\n// export function maskedClass(mask: MaskedFunction): typeof MaskedFunction;\n// export function maskedClass(mask: MaskedPattern): typeof MaskedPattern;\n// export function maskedClass(mask: MaskedDynamic): typeof MaskedDynamic;\n// export function maskedClass(mask: Masked): typeof Masked;\n// export function maskedClass(mask: typeof Masked): typeof Masked;\n// export function maskedClass(mask: typeof MaskedDate): typeof MaskedDate;\n// export function maskedClass(mask: typeof MaskedNumber): typeof MaskedNumber;\n// export function maskedClass(mask: typeof MaskedEnum): typeof MaskedEnum;\n// export function maskedClass(mask: typeof MaskedRange): typeof MaskedRange;\n// export function maskedClass(mask: typeof MaskedRegExp): typeof MaskedRegExp;\n// export function maskedClass(mask: typeof MaskedFunction): typeof MaskedFunction;\n// export function maskedClass(mask: typeof MaskedPattern): typeof MaskedPattern;\n// export function maskedClass(mask: typeof MaskedDynamic): typeof MaskedDynamic;\n// export function maskedClass<Mask extends typeof Masked> (mask: Mask): Mask;\n// export function maskedClass(mask: RegExp): typeof MaskedRegExp;\n// export function maskedClass(mask: (value: string, ...args: any[]) => boolean): typeof MaskedFunction;\n\n/** Get Masked class by mask type */\nexport function maskedClass (mask: Masked | FactoryOpts['mask']): any /* TODO */ {\n  if (mask == null) throw new Error('mask property should be defined');\n\n  if (mask instanceof RegExp) return IMask.MaskedRegExp;\n  if (isString(mask)) return IMask.MaskedPattern;\n  if (mask === Date) return IMask.MaskedDate;\n  if (mask === Number) return IMask.MaskedNumber;\n  if (Array.isArray(mask) || mask === Array) return IMask.MaskedDynamic;\n  if (IMask.Masked && (mask as any).prototype instanceof IMask.Masked) return mask;\n  if (IMask.Masked && mask instanceof IMask.Masked) return mask.constructor;\n  if (mask instanceof Function) return IMask.MaskedFunction;\n\n  console.warn('Mask not found for mask', mask);  // eslint-disable-line no-console\n  return IMask.Masked;\n}\n\ntype MaskedClassOf<M extends Masked> =\n  M extends MaskedDate ? typeof MaskedDate :\n  M extends MaskedNumber ? typeof MaskedNumber :\n  M extends MaskedEnum ? typeof MaskedEnum :\n  M extends MaskedRange ? typeof MaskedRange :\n  M extends MaskedRegExp ? typeof MaskedRegExp :\n  M extends MaskedFunction ? typeof MaskedFunction :\n  M extends MaskedPattern ? typeof MaskedPattern :\n  M extends MaskedDynamic ? typeof MaskedDynamic :\n  any\n;\n\n\ntype NormalizedMaskedOpts<Opts extends Masked> = Omit<Opts, 'mask'> & {\n  _mask: Opts,\n  mask: MaskedClassOf<Opts>,\n};\n\ntype NormalizedInstanceOpts<Opts extends FactoryInstanceOpts> =\n  Omit<Opts['mask'], `_${string}` | 'mask'> &\n  NormalizedMaskedOpts<Opts['mask']>\n;\n\nexport\ntype NormalizedOpts<Opts extends FactoryArg> =\n  Opts extends FactoryStaticOpts['mask'] ? { mask: Opts } :\n  Opts extends Masked ? NormalizedMaskedOpts<Opts> :\n  Opts extends FactoryInstanceOpts ? NormalizedInstanceOpts<Opts> :\n  Opts extends FactoryStaticOpts | FactoryConstructorOpts ? Opts :\n  { mask: Opts }\n;\n\nexport\nfunction normalizeOpts<Opts extends FactoryArg> (opts: Opts): NormalizedOpts<Opts> {\n  if (!opts) throw new Error('Options in not defined');\n\n  if (IMask.Masked) {\n    if ((opts as any).prototype instanceof IMask.Masked) return { mask: opts } as NormalizedOpts<Opts>;\n\n    /*\n      handle cases like:\n      1) opts = Masked\n      2) opts = { mask: Masked, ...instanceOpts }\n    */\n    const { mask=undefined, ...instanceOpts } =\n      opts instanceof IMask.Masked ? { mask: opts } :\n      isObject(opts) && (opts as FactoryInstanceOpts).mask instanceof IMask.Masked ? (opts as FactoryInstanceOpts) : {};\n\n    if (mask) {\n      const _mask = (mask as Masked).mask;\n\n      return {\n        ...pick(mask, (_, k: string) => !k.startsWith('_')),\n        mask: mask.constructor,\n        _mask,\n        ...instanceOpts,\n      } as NormalizedOpts<Opts>;\n    }\n  }\n\n  if (!isObject(opts)) return { mask: opts } as unknown as NormalizedOpts<Opts>;\n\n  return { ...opts } as unknown as NormalizedOpts<Opts>;\n}\n\n// TODO can't use overloads here because of https://github.com/microsoft/TypeScript/issues/50754\n\n// From masked\n// export default function createMask<Opts extends Masked, ReturnMasked=Opts> (opts: Opts): ReturnMasked;\n// // From masked class\n// export default function createMask<Opts extends MaskedOptions<typeof Masked>, ReturnMasked extends Masked=InstanceType<Opts['mask']>> (opts: Opts): ReturnMasked;\n// export default function createMask<Opts extends MaskedOptions<typeof MaskedDate>, ReturnMasked extends MaskedDate=MaskedDate<Opts['parent']>> (opts: Opts): ReturnMasked;\n// export default function createMask<Opts extends MaskedOptions<typeof MaskedNumber>, ReturnMasked extends MaskedNumber=MaskedNumber<Opts['parent']>> (opts: Opts): ReturnMasked;\n// export default function createMask<Opts extends MaskedOptions<typeof MaskedEnum>, ReturnMasked extends MaskedEnum=MaskedEnum<Opts['parent']>> (opts: Opts): ReturnMasked;\n// export default function createMask<Opts extends MaskedOptions<typeof MaskedRange>, ReturnMasked extends MaskedRange=MaskedRange<Opts['parent']>> (opts: Opts): ReturnMasked;\n// export default function createMask<Opts extends MaskedOptions<typeof MaskedRegExp>, ReturnMasked extends MaskedRegExp=MaskedRegExp<Opts['parent']>> (opts: Opts): ReturnMasked;\n// export default function createMask<Opts extends MaskedOptions<typeof MaskedFunction>, ReturnMasked extends MaskedFunction=MaskedFunction<Opts['parent']>> (opts: Opts): ReturnMasked;\n// export default function createMask<Opts extends MaskedOptions<typeof MaskedPattern>, ReturnMasked extends MaskedPattern=MaskedPattern<Opts['parent']>> (opts: Opts): ReturnMasked;\n// export default function createMask<Opts extends MaskedOptions<typeof MaskedDynamic>, ReturnMasked extends MaskedDynamic=MaskedDynamic<Opts['parent']>> (opts: Opts): ReturnMasked;\n// // From mask opts\n// export default function createMask<Opts extends MaskedOptions<Masked>, ReturnMasked=Opts extends MaskedOptions<infer M> ? M : never> (opts: Opts): ReturnMasked;\n// export default function createMask<Opts extends MaskedNumberOptions, ReturnMasked extends MaskedNumber=MaskedNumber<Opts['parent']>> (opts: Opts): ReturnMasked;\n// export default function createMask<Opts extends MaskedDateFactoryOptions, ReturnMasked extends MaskedDate=MaskedDate<Opts['parent']>> (opts: Opts): ReturnMasked;\n// export default function createMask<Opts extends MaskedEnumOptions, ReturnMasked extends MaskedEnum=MaskedEnum<Opts['parent']>> (opts: Opts): ReturnMasked;\n// export default function createMask<Opts extends MaskedRangeOptions, ReturnMasked extends MaskedRange=MaskedRange<Opts['parent']>> (opts: Opts): ReturnMasked;\n// export default function createMask<Opts extends MaskedPatternOptions, ReturnMasked extends MaskedPattern=MaskedPattern<Opts['parent']>> (opts: Opts): ReturnMasked;\n// export default function createMask<Opts extends MaskedDynamicOptions, ReturnMasked extends MaskedDynamic=MaskedDynamic<Opts['parent']>> (opts: Opts): ReturnMasked;\n// export default function createMask<Opts extends MaskedOptions<RegExp>, ReturnMasked extends MaskedRegExp=MaskedRegExp<Opts['parent']>> (opts: Opts): ReturnMasked;\n// export default function createMask<Opts extends MaskedOptions<Function>, ReturnMasked extends MaskedFunction=MaskedFunction<Opts['parent']>> (opts: Opts): ReturnMasked;\n\n/** Creates new {@link Masked} depending on mask type */\nexport default\nfunction createMask<Opts extends FactoryArg> (opts: Opts): FactoryReturnMasked<Opts> {\n  if (IMask.Masked && (opts instanceof IMask.Masked)) return opts as FactoryReturnMasked<Opts>;\n  const nOpts = normalizeOpts(opts);\n\n  const MaskedClass = maskedClass(nOpts.mask);\n  if (!MaskedClass) throw new Error(`Masked class is not found for provided mask ${nOpts.mask}, appropriate module needs to be imported manually before creating mask.`);\n\n  if (nOpts.mask === MaskedClass) delete nOpts.mask;\n  if ((nOpts as any)._mask) { nOpts.mask = (nOpts as any)._mask; delete (nOpts as any)._mask; }\n  return new MaskedClass(nOpts);\n}\n\n\nIMask.createMask = createMask;\n","import IMask from '../core/holder';\n\n\nexport\ntype ElementEvent =\n  | 'selectionChange'\n  | 'input'\n  | 'drop'\n  | 'click'\n  | 'focus'\n  | 'commit'\n;\n\nexport\ntype EventHandlers = { [key in ElementEvent]: (...args: any[]) => void } & {\n  undo?: (...args: any[]) => void;\n  redo?: (...args: any[]) => void;\n}\n\n/**  Generic element API to use with mask */\nexport default\nabstract class MaskElement {\n  /** */\n  abstract _unsafeSelectionStart: number | null;\n  /** */\n  abstract _unsafeSelectionEnd: number | null;\n  /** */\n  abstract value: string;\n\n  /** Safely returns selection start */\n  get selectionStart (): number {\n    let start;\n    try {\n      start = this._unsafeSelectionStart;\n    } catch {}\n\n    return start != null ?\n      start :\n      this.value.length;\n  }\n\n  /** Safely returns selection end */\n  get selectionEnd (): number {\n    let end;\n    try {\n      end = this._unsafeSelectionEnd;\n    } catch {}\n\n    return end != null ?\n      end :\n      this.value.length;\n  }\n\n  /** Safely sets element selection */\n  select (start: number, end: number) {\n    if (start == null || end == null ||\n      start === this.selectionStart && end === this.selectionEnd) return;\n\n    try {\n      this._unsafeSelect(start, end);\n    } catch {}\n  }\n\n  /** */\n  get isActive (): boolean { return false; }\n  /** */\n  abstract _unsafeSelect (start: number, end: number): void;\n  /** */\n  abstract bindEvents (handlers: EventHandlers): void;\n  /** */\n  abstract unbindEvents (): void\n}\n\n\nIMask.MaskElement = MaskElement;\n","import MaskElement, { EventHandlers } from './mask-element';\nimport IMask from '../core/holder';\n\n\nconst KEY_Z = 90;\nconst KEY_Y = 89;\n\n/** Bridge between HTMLElement and {@link Masked} */\nexport default\nabstract class HTMLMaskElement extends MaskElement {\n  /** HTMLElement to use mask on */\n  declare input: HTMLElement;\n  declare _handlers: EventHandlers;\n  abstract value: string;\n\n  constructor (input: HTMLElement) {\n    super();\n    this.input = input;\n    this._onKeydown = this._onKeydown.bind(this);\n    this._onInput = this._onInput.bind(this);\n    this._onBeforeinput = this._onBeforeinput.bind(this);\n    this._onCompositionEnd = this._onCompositionEnd.bind(this);\n  }\n\n  get rootElement (): HTMLDocument {\n    return (this.input.getRootNode?.() ?? document) as HTMLDocument;\n  }\n\n  /** Is element in focus */\n  get isActive (): boolean {\n    return this.input === this.rootElement.activeElement;\n  }\n\n  /** Binds HTMLElement events to mask internal events */\n  override bindEvents (handlers: EventHandlers) {\n    this.input.addEventListener('keydown', this._onKeydown as EventListener);\n    this.input.addEventListener('input', this._onInput as EventListener);\n    this.input.addEventListener('beforeinput', this._onBeforeinput as EventListener);\n    this.input.addEventListener('compositionend', this._onCompositionEnd as EventListener);\n    this.input.addEventListener('drop', handlers.drop);\n    this.input.addEventListener('click', handlers.click);\n    this.input.addEventListener('focus', handlers.focus);\n    this.input.addEventListener('blur', handlers.commit);\n    this._handlers = handlers;\n  }\n\n  _onKeydown (e: KeyboardEvent) {\n    if (this._handlers.redo && (\n      (e.keyCode === KEY_Z && e.shiftKey && (e.metaKey || e.ctrlKey)) ||\n      (e.keyCode === KEY_Y && e.ctrlKey)\n    )) {\n      e.preventDefault();\n      return this._handlers.redo(e);\n    }\n\n    if (this._handlers.undo && e.keyCode === KEY_Z && (e.metaKey || e.ctrlKey)) {\n      e.preventDefault();\n      return this._handlers.undo(e);\n    }\n\n    if (!e.isComposing) this._handlers.selectionChange(e);\n  }\n\n  _onBeforeinput (e: InputEvent) {\n    if (e.inputType === 'historyUndo' && this._handlers.undo) {\n      e.preventDefault();\n      return this._handlers.undo(e);\n    }\n\n    if (e.inputType === 'historyRedo' && this._handlers.redo) {\n      e.preventDefault();\n      return this._handlers.redo(e);\n    }\n  }\n\n  _onCompositionEnd (e: CompositionEvent) {\n    this._handlers.input(e);\n  }\n\n  _onInput (e: InputEvent) {\n    if (!e.isComposing) this._handlers.input(e);\n  }\n\n  /** Unbinds HTMLElement events to mask internal events */\n  override unbindEvents () {\n    this.input.removeEventListener('keydown', this._onKeydown as EventListener);\n    this.input.removeEventListener('input', this._onInput as EventListener);\n    this.input.removeEventListener('beforeinput', this._onBeforeinput as EventListener);\n    this.input.removeEventListener('compositionend', this._onCompositionEnd as EventListener);\n    this.input.removeEventListener('drop', this._handlers.drop);\n    this.input.removeEventListener('click', this._handlers.click);\n    this.input.removeEventListener('focus', this._handlers.focus);\n    this.input.removeEventListener('blur', this._handlers.commit);\n    this._handlers = {} as EventHandlers;\n  }\n}\n\n\nIMask.HTMLMaskElement = HTMLMaskElement;\n","import HTMLMaskElement from './html-mask-element';\nimport IMask from '../core/holder';\n\nexport\ntype InputElement = HTMLTextAreaElement | HTMLInputElement;\n\n/** Bridge between InputElement and {@link Masked} */\nexport default\nclass HTMLInputMaskElement extends HTMLMaskElement {\n  /** InputElement to use mask on */\n  declare input: InputElement;\n\n  constructor (input: InputElement) {\n    super(input);\n    this.input = input;\n  }\n\n  /** Returns InputElement selection start */\n  override get _unsafeSelectionStart (): number | null {\n    return this.input.selectionStart != null ? this.input.selectionStart : this.value.length;\n  }\n\n  /** Returns InputElement selection end */\n  override get _unsafeSelectionEnd (): number | null {\n    return this.input.selectionEnd;\n  }\n\n  /** Sets InputElement selection */\n  _unsafeSelect (start: number, end: number) {\n    this.input.setSelectionRange(start, end);\n  }\n\n  override get value (): string {\n    return this.input.value;\n  }\n  override set value (value: string) {\n    this.input.value = value;\n  }\n}\n\n\nIMask.HTMLMaskElement = HTMLMaskElement;\n","import HTMLMaskElement from './html-mask-element';\nimport IMask from '../core/holder';\n\n\nexport default\nclass HTMLContenteditableMaskElement extends HTMLMaskElement {\n  declare input: HTMLElement;\n  /** Returns HTMLElement selection start */\n  override get _unsafeSelectionStart (): number | null {\n    const root = this.rootElement;\n    const selection = root.getSelection && root.getSelection();\n    const anchorOffset = selection && selection.anchorOffset;\n    const focusOffset = selection && selection.focusOffset;\n    if (focusOffset == null || anchorOffset == null || anchorOffset < focusOffset) {\n      return anchorOffset;\n    }\n    return focusOffset;\n  }\n\n  /** Returns HTMLElement selection end */\n  override get _unsafeSelectionEnd (): number | null {\n    const root = this.rootElement;\n    const selection = root.getSelection && root.getSelection();\n    const anchorOffset = selection && selection.anchorOffset;\n    const focusOffset = selection && selection.focusOffset;\n    if (focusOffset == null || anchorOffset == null || anchorOffset > focusOffset) {\n      return anchorOffset;\n    }\n    return focusOffset;\n  }\n\n  /** Sets HTMLElement selection */\n  override _unsafeSelect (start: number, end: number) {\n    if (!this.rootElement.createRange) return;\n\n    const range = this.rootElement.createRange();\n    range.setStart(this.input.firstChild || this.input, start);\n    range.setEnd(this.input.lastChild || this.input, end);\n    const root = this.rootElement;\n    const selection = root.getSelection && root.getSelection();\n    if (selection) {\n      selection.removeAllRanges();\n      selection.addRange(range);\n    }\n  }\n\n  /** HTMLElement value */\n  override get value (): string {\n    return this.input.textContent || '';\n  }\n  override set value (value: string) {\n    this.input.textContent = value;\n  }\n}\n\n\nIMask.HTMLContenteditableMaskElement = HTMLContenteditableMaskElement;\n","import { type Selection } from '../core/utils';\n\n\nexport\ntype InputHistoryState = {\n  unmaskedValue: string,\n  selection: Selection,\n};\n\n\nexport default\nclass InputHistory {\n  static MAX_LENGTH = 100;\n  states: InputHistoryState[] = [];\n  currentIndex = 0;\n\n  get currentState (): InputHistoryState | undefined {\n    return this.states[this.currentIndex];\n  }\n\n  get isEmpty (): boolean {\n    return this.states.length === 0;\n  }\n\n  push (state: InputHistoryState) {\n    // if current index points before the last element then remove the future\n    if (this.currentIndex < this.states.length - 1) this.states.length = this.currentIndex + 1;\n    this.states.push(state);\n    if (this.states.length > InputHistory.MAX_LENGTH) this.states.shift();\n    this.currentIndex = this.states.length - 1;\n  }\n\n  go (steps: number): InputHistoryState | undefined {\n    this.currentIndex = Math.min(Math.max(this.currentIndex + steps, 0), this.states.length - 1);\n    return this.currentState;\n  }\n\n  undo () {\n    return this.go(-1);\n  }\n\n  redo () {\n    return this.go(+1);\n  }\n\n  clear () {\n    this.states.length = 0;\n    this.currentIndex = 0;\n  }\n}\n","import { DIRECTION, type Selection } from '../core/utils';\nimport ActionDetails from '../core/action-details';\nimport createMask, { type UpdateOpts, maskedClass, type FactoryArg, type FactoryReturnMasked } from '../masked/factory';\nimport Masked from '../masked/base';\nimport MaskElement from './mask-element';\nimport HTMLInputMaskElement, { type InputElement } from './html-input-mask-element';\nimport HTMLContenteditableMaskElement from './html-contenteditable-mask-element';\nimport IMask from '../core/holder';\nimport InputHistory, { type InputHistoryState } from './input-history';\n\n\nexport\ntype InputMaskElement = MaskElement | InputElement | HTMLElement;\n\nexport\ntype InputMaskEventListener = (e?: InputEvent) => void;\n\n/** Listens to element events and controls changes between element and {@link Masked} */\nexport default\nclass InputMask<Opts extends FactoryArg=Record<string, unknown>> {\n  /**\n    View element\n  */\n  declare el: MaskElement;\n\n  /** Internal {@link Masked} model */\n  declare masked: FactoryReturnMasked<Opts>;\n\n  declare _listeners: Record<string, Array<InputMaskEventListener>>;\n  declare _value: string;\n  declare _changingCursorPos: number;\n  declare _unmaskedValue: string;\n  declare _rawInputValue: string;\n  declare _selection: Selection;\n  declare _cursorChanging?: ReturnType<typeof setTimeout>;\n  declare _historyChanging?: boolean;\n  declare _inputEvent?: InputEvent;\n  declare history: InputHistory;\n\n  constructor (el: InputMaskElement, opts: Opts) {\n    this.el =\n      (el instanceof MaskElement) ? el :\n      (el.isContentEditable && el.tagName !== 'INPUT' && el.tagName !== 'TEXTAREA') ? new HTMLContenteditableMaskElement(el) :\n      new HTMLInputMaskElement(el as InputElement);\n\n    this.masked = createMask(opts);\n\n    this._listeners = {};\n    this._value = '';\n    this._unmaskedValue = '';\n    this._rawInputValue = '';\n    this.history = new InputHistory();\n\n    this._saveSelection = this._saveSelection.bind(this);\n    this._onInput = this._onInput.bind(this);\n    this._onChange = this._onChange.bind(this);\n    this._onDrop = this._onDrop.bind(this);\n    this._onFocus = this._onFocus.bind(this);\n    this._onClick = this._onClick.bind(this);\n    this._onUndo = this._onUndo.bind(this);\n    this._onRedo = this._onRedo.bind(this);\n    this.alignCursor = this.alignCursor.bind(this);\n    this.alignCursorFriendly = this.alignCursorFriendly.bind(this);\n\n    this._bindEvents();\n\n    // refresh\n    this.updateValue();\n    this._onChange();\n  }\n\n  maskEquals (mask: any): boolean {\n    return mask == null || this.masked?.maskEquals(mask);\n  }\n\n  /** Masked */\n  get mask (): FactoryReturnMasked<Opts>['mask'] {\n    return this.masked.mask;\n  }\n  set mask (mask: any) {\n    if (this.maskEquals(mask)) return;\n\n    if (!((mask as Masked) instanceof IMask.Masked) && this.masked.constructor === maskedClass(mask as Masked)) {\n      // TODO \"any\" no idea\n      this.masked.updateOptions({ mask } as any);\n      return;\n    }\n\n    const masked = (mask instanceof IMask.Masked ? mask : createMask({ mask } as Opts)) as FactoryReturnMasked<Opts>;\n    masked.unmaskedValue = this.masked.unmaskedValue;\n    this.masked = masked;\n  }\n\n  /** Raw value */\n  get value (): string {\n    return this._value;\n  }\n\n  set value (str: string) {\n    if (this.value === str) return;\n\n    this.masked.value = str;\n    this.updateControl('auto');\n  }\n\n  /** Unmasked value */\n  get unmaskedValue (): string {\n    return this._unmaskedValue;\n  }\n\n  set unmaskedValue (str: string) {\n    if (this.unmaskedValue === str) return;\n\n    this.masked.unmaskedValue = str;\n    this.updateControl('auto');\n  }\n\n    /** Raw input value */\n  get rawInputValue (): string {\n    return this._rawInputValue;\n  }\n\n  set rawInputValue (str: string) {\n    if (this.rawInputValue === str) return;\n\n    this.masked.rawInputValue = str;\n    this.updateControl();\n    this.alignCursor();\n  }\n\n  /** Typed unmasked value */\n  get typedValue (): FactoryReturnMasked<Opts>['typedValue'] {\n    return this.masked.typedValue;\n  }\n\n  set typedValue (val: FactoryReturnMasked<Opts>['typedValue']) {\n    if (this.masked.typedValueEquals(val)) return;\n\n    this.masked.typedValue = val;\n    this.updateControl('auto');\n  }\n\n  /** Display value */\n  get displayValue (): string {\n    return this.masked.displayValue;\n  }\n\n  /** Starts listening to element events */\n  _bindEvents () {\n    this.el.bindEvents({\n      selectionChange: this._saveSelection,\n      input: this._onInput,\n      drop: this._onDrop,\n      click: this._onClick,\n      focus: this._onFocus,\n      commit: this._onChange,\n      undo: this._onUndo,\n      redo: this._onRedo,\n    });\n  }\n\n  /** Stops listening to element events */\n  _unbindEvents () {\n    if (this.el) this.el.unbindEvents();\n  }\n\n  /** Fires custom event */\n  _fireEvent (ev: string, e?: InputEvent) {\n    const listeners = this._listeners[ev];\n    if (!listeners) return;\n\n    listeners.forEach(l => l(e));\n  }\n\n  /** Current selection start */\n  get selectionStart (): number {\n    return this._cursorChanging ?\n      this._changingCursorPos :\n\n      this.el.selectionStart;\n  }\n\n  /** Current cursor position */\n  get cursorPos (): number {\n    return this._cursorChanging ?\n      this._changingCursorPos :\n\n      this.el.selectionEnd;\n  }\n  set cursorPos (pos: number) {\n    if (!this.el || !this.el.isActive) return;\n\n    this.el.select(pos, pos);\n    this._saveSelection();\n  }\n\n  /** Stores current selection */\n  _saveSelection (/* ev */) {\n    if (this.displayValue !== this.el.value) {\n      console.warn('Element value was changed outside of mask. Syncronize mask using `mask.updateValue()` to work properly.'); // eslint-disable-line no-console\n    }\n    this._selection = {\n      start: this.selectionStart,\n      end: this.cursorPos,\n    };\n  }\n\n  /** Syncronizes model value from view */\n  updateValue () {\n    this.masked.value = this.el.value;\n    this._value = this.masked.value;\n    this._unmaskedValue = this.masked.unmaskedValue;\n    this._rawInputValue = this.masked.rawInputValue;\n  }\n\n  /** Syncronizes view from model value, fires change events */\n  updateControl (cursorPos?: number | 'auto') {\n    const newUnmaskedValue = this.masked.unmaskedValue;\n    const newValue = this.masked.value;\n    const newRawInputValue = this.masked.rawInputValue;\n    const newDisplayValue = this.displayValue;\n\n    const isChanged =\n      this.unmaskedValue !== newUnmaskedValue ||\n      this.value !== newValue ||\n      this._rawInputValue !== newRawInputValue\n    ;\n\n    this._unmaskedValue = newUnmaskedValue;\n    this._value = newValue;\n    this._rawInputValue = newRawInputValue;\n\n    if (this.el.value !== newDisplayValue) this.el.value = newDisplayValue;\n\n    if (cursorPos === 'auto') this.alignCursor();\n    else if (cursorPos != null) this.cursorPos = cursorPos;\n\n    if (isChanged) this._fireChangeEvents();\n    if (!this._historyChanging && (isChanged || this.history.isEmpty)) this.history.push({\n      unmaskedValue: newUnmaskedValue,\n      selection: { start: this.selectionStart, end: this.cursorPos },\n    });\n  }\n\n  /** Updates options with deep equal check, recreates {@link Masked} model if mask type changes */\n  updateOptions(opts: UpdateOpts<Opts>) {\n    const { mask, ...restOpts } = opts as any; // TODO types, yes, mask is optional\n\n    const updateMask = !this.maskEquals(mask);\n    const updateOpts = this.masked.optionsIsChanged(restOpts);\n\n    if (updateMask) this.mask = mask;\n    if (updateOpts) this.masked.updateOptions(restOpts);  // TODO\n\n    if (updateMask || updateOpts) this.updateControl();\n  }\n\n  /** Updates cursor */\n  updateCursor (cursorPos: number) {\n    if (cursorPos == null) return;\n    this.cursorPos = cursorPos;\n\n    // also queue change cursor for mobile browsers\n    this._delayUpdateCursor(cursorPos);\n  }\n\n  /** Delays cursor update to support mobile browsers */\n  _delayUpdateCursor (cursorPos: number) {\n    this._abortUpdateCursor();\n    this._changingCursorPos = cursorPos;\n    this._cursorChanging = setTimeout(() => {\n      if (!this.el) return; // if was destroyed\n      this.cursorPos = this._changingCursorPos;\n      this._abortUpdateCursor();\n    }, 10);\n  }\n\n  /** Fires custom events */\n  _fireChangeEvents () {\n    this._fireEvent('accept', this._inputEvent);\n    if (this.masked.isComplete) this._fireEvent('complete', this._inputEvent);\n  }\n\n  /** Aborts delayed cursor update */\n  _abortUpdateCursor () {\n    if (this._cursorChanging) {\n      clearTimeout(this._cursorChanging);\n      delete this._cursorChanging;\n    }\n  }\n\n  /** Aligns cursor to nearest available position */\n  alignCursor () {\n    this.cursorPos = this.masked.nearestInputPos(this.masked.nearestInputPos(this.cursorPos, DIRECTION.LEFT));\n  }\n\n  /** Aligns cursor only if selection is empty */\n  alignCursorFriendly () {\n    if (this.selectionStart !== this.cursorPos) return;  // skip if range is selected\n    this.alignCursor();\n  }\n\n  /** Adds listener on custom event */\n  on (ev: string, handler: InputMaskEventListener): this {\n    if (!this._listeners[ev]) this._listeners[ev] = [];\n    this._listeners[ev].push(handler);\n    return this;\n  }\n\n  /** Removes custom event listener */\n  off (ev: string, handler: InputMaskEventListener): this {\n    if (!this._listeners[ev]) return this;\n    if (!handler) {\n      delete this._listeners[ev];\n      return this;\n    }\n    const hIndex = this._listeners[ev].indexOf(handler);\n    if (hIndex >= 0) this._listeners[ev].splice(hIndex, 1);\n    return this;\n  }\n\n  /** Handles view input event */\n  _onInput (e: InputEvent): void {\n    this._inputEvent = e;\n    this._abortUpdateCursor();\n\n    const details = new ActionDetails({\n      // new state\n      value: this.el.value,\n      cursorPos: this.cursorPos,\n\n      // old state\n      oldValue: this.displayValue,\n      oldSelection: this._selection,\n    });\n\n    const oldRawValue = this.masked.rawInputValue;\n\n    const offset = this.masked.splice(\n      details.startChangePos,\n      details.removed.length,\n      details.inserted,\n      details.removeDirection,\n      { input: true, raw: true },\n    ).offset;\n\n    // force align in remove direction only if no input chars were removed\n    // otherwise we still need to align with NONE (to get out from fixed symbols for instance)\n    const removeDirection = oldRawValue === this.masked.rawInputValue ?\n      details.removeDirection :\n      DIRECTION.NONE;\n\n    let cursorPos = this.masked.nearestInputPos(\n      details.startChangePos + offset,\n      removeDirection,\n    );\n    if (removeDirection !== DIRECTION.NONE) cursorPos = this.masked.nearestInputPos(cursorPos, DIRECTION.NONE);\n\n    this.updateControl(cursorPos);\n    delete this._inputEvent;\n  }\n\n  /** Handles view change event and commits model value */\n  _onChange () {\n    if (this.displayValue !== this.el.value) this.updateValue();\n    this.masked.doCommit();\n    this.updateControl();\n    this._saveSelection();\n  }\n\n  /** Handles view drop event, prevents by default */\n  _onDrop (ev: Event) {\n    ev.preventDefault();\n    ev.stopPropagation();\n  }\n\n  /** Restore last selection on focus */\n  _onFocus (ev: Event) {\n    this.alignCursorFriendly();\n  }\n\n  /** Restore last selection on focus */\n  _onClick (ev: Event) {\n    this.alignCursorFriendly();\n  }\n\n  _onUndo () {\n    this._applyHistoryState(this.history.undo());\n  }\n\n  _onRedo () {\n    this._applyHistoryState(this.history.redo());\n  }\n\n  _applyHistoryState (state: InputHistoryState | undefined) {\n    if (!state) return;\n\n    this._historyChanging = true;\n    this.unmaskedValue = state.unmaskedValue;\n    this.el.select(state.selection.start, state.selection.end);\n    this._saveSelection();\n    this._historyChanging = false;\n  }\n\n  /** Unbind view events and removes element reference */\n  destroy () {\n    this._unbindEvents();\n    (this._listeners as any).length = 0;\n    delete (this as any).el;\n  }\n}\n\n\nIMask.InputMask = InputMask;\n","import IMask from \"./holder\";\n\n\nexport\ntype ChangeDetailsOptions = Pick<ChangeDetails,\n  | 'inserted'\n  | 'tailShift'\n  | 'rawInserted'\n  | 'skip'\n>;\n\n/** Provides details of changing model value */\nexport default\nclass ChangeDetails {\n  /** Inserted symbols */\n  declare inserted: string;\n  /** Additional offset if any changes occurred before tail */\n  declare tailShift: number;\n  /** Raw inserted is used by dynamic mask */\n  declare rawInserted: string;\n  /** Can skip chars */\n  declare skip: boolean;\n\n\n  static normalize (prep: string | [string, ChangeDetails]): [string, ChangeDetails] {\n    return Array.isArray(prep) ? prep : [\n      prep,\n      new ChangeDetails(),\n    ];\n  }\n\n  constructor (details?: Partial<ChangeDetailsOptions>) {\n    Object.assign(this, {\n      inserted: '',\n      rawInserted: '',\n      tailShift: 0,\n      skip: false,\n    }, details);\n  }\n\n  /** Aggregate changes */\n  aggregate (details: ChangeDetails): this {\n    this.inserted += details.inserted;\n    this.rawInserted += details.rawInserted;\n    this.tailShift += details.tailShift;\n    this.skip = this.skip || details.skip;\n\n    return this;\n  }\n\n  /** Total offset considering all changes */\n  get offset (): number {\n    return this.tailShift + this.inserted.length;\n  }\n\n  get consumed (): boolean {\n    return Boolean(this.rawInserted) || this.skip;\n  }\n\n  equals (details: ChangeDetails): boolean {\n    return this.inserted === details.inserted &&\n      this.tailShift === details.tailShift &&\n      this.rawInserted === details.rawInserted &&\n      this.skip === details.skip\n    ;\n  }\n}\n\n\nIMask.ChangeDetails = ChangeDetails;\n","import type { TailDetails, AppendTail } from './tail-details';\nimport type ChangeDetails from './change-details';\n\n\ntype ContinuousTailState = Pick<ContinuousTailDetails,\n  | 'value'\n  | 'from'\n  | 'stop'\n>;\n\n/** Provides details of continuous extracted tail */\nexport default\nclass ContinuousTailDetails implements TailDetails {\n  /** Tail value as string */\n  declare value: string;\n  /** Tail start position */\n  declare from: number;\n  /** Start position */\n  declare stop?: number;\n\n  constructor (value: string='', from: number=0, stop?: number) {\n    this.value = value;\n    this.from = from;\n    this.stop = stop;\n  }\n\n  toString (): string { return this.value; }\n\n  extend (tail: string | TailDetails): void {\n    this.value += String(tail);\n  }\n\n  appendTo (masked: AppendTail): ChangeDetails {\n    return masked.append(this.toString(), { tail: true })\n      .aggregate(masked._appendPlaceholder());\n  }\n\n  get state (): ContinuousTailState {\n    return {\n      value: this.value,\n      from: this.from,\n      stop: this.stop,\n    };\n  }\n\n  set state (state: ContinuousTailState) {\n    Object.assign(this, state);\n  }\n\n  unshift (beforePos?: number): string {\n    if (!this.value.length || (beforePos != null && this.from >= beforePos)) return '';\n\n    const shiftChar = this.value[0];\n    this.value = this.value.slice(1);\n    return shiftChar;\n  }\n\n  shift (): string {\n    if (!this.value.length) return '';\n\n    const shiftChar = this.value[this.value.length-1];\n    this.value = this.value.slice(0, -1);\n    return shiftChar;\n  }\n}\n","import ChangeDetails from '../core/change-details';\nimport ContinuousTailDetails from '../core/continuous-tail-details';\nimport { type Direction, DIRECTION, isString, forceDirection, objectIncludes } from '../core/utils';\nimport { type TailDetails } from '../core/tail-details';\nimport IMask from '../core/holder';\n\n\nexport\ntype MaskedState = {\n  _value: string,\n  _rawInputValue: string,\n};\n\n/** Append flags */\nexport\ntype AppendFlags<State=MaskedState> = {\n  input?: boolean,\n  tail?: boolean,\n  raw?: boolean,\n  _beforeTailState?: State,\n};\n\n/** Extract flags */\nexport\ntype ExtractFlags = {\n  raw?: boolean\n};\n\n// see https://github.com/microsoft/TypeScript/issues/6223\n\nexport\ntype MaskedOptions<M extends Masked=Masked, Props extends keyof M=never> = Partial<Pick<M,\n  | 'mask'\n  | 'parent'\n  | 'prepare'\n  | 'prepareChar'\n  | 'validate'\n  | 'commit'\n  | 'format'\n  | 'parse'\n  | 'overwrite'\n  | 'eager'\n  | 'skipInvalid'\n  | 'autofix'\n  | Props\n>>;\n\n\n/** Provides common masking stuff */\nexport default\nabstract class Masked<Value=any> {\n  static DEFAULTS: Pick<MaskedOptions, 'skipInvalid'> = {\n    skipInvalid: true,\n  };\n  static EMPTY_VALUES: Array<any> = [undefined, null, ''];\n\n  /** */\n  declare mask: unknown;\n  /** */\n  declare parent?: Masked;\n  /** Transforms value before mask processing */\n  declare prepare?: (chars: string, masked: Masked, flags: AppendFlags) => string | [string, ChangeDetails];\n  /** Transforms each char before mask processing */\n  declare prepareChar?: (chars: string, masked: Masked, flags: AppendFlags) => string | [string, ChangeDetails];\n  /** Validates if value is acceptable */\n  declare validate?: (value: string, masked: Masked, flags: AppendFlags) => boolean;\n  /** Does additional processing at the end of editing */\n  declare commit?: (value: string, masked: Masked) => void;\n  /** Format typed value to string */\n  declare format?: (value: Value, masked: Masked) => string;\n  /** Parse string to get typed value */\n  declare parse?: (str: string, masked: Masked) => Value;\n  /** Enable characters overwriting */\n  abstract overwrite?: boolean | 'shift' | undefined;\n  /** */\n  abstract eager?: boolean | 'remove' | 'append' | undefined;\n  /** */\n  abstract skipInvalid?: boolean | undefined;\n  /** */\n  abstract autofix?: boolean | 'pad' | undefined;\n\n  /** */\n  declare _initialized: boolean;\n\n  declare _value: string;\n  declare _refreshing?: boolean;\n  declare _isolated?: boolean;\n\n  constructor (opts: MaskedOptions) {\n    this._value = '';\n    this._update({\n      ...Masked.DEFAULTS,\n      ...opts,\n    });\n    this._initialized = true;\n  }\n\n  /** Sets and applies new options */\n  updateOptions (opts: Partial<MaskedOptions>) {\n    if (!this.optionsIsChanged(opts)) return;\n\n    this.withValueRefresh(this._update.bind(this, opts));\n  }\n\n  /** Sets new options */\n  _update (opts: Partial<MaskedOptions>) {\n    Object.assign(this, opts);\n  }\n\n  /** Mask state */\n  get state (): MaskedState {\n    return {\n      _value: this.value,\n      _rawInputValue: this.rawInputValue,\n    };\n  }\n\n  set state (state: MaskedState) {\n    this._value = state._value;\n  }\n\n  /** Resets value */\n  reset () {\n    this._value = '';\n  }\n\n  get value (): string {\n    return this._value;\n  }\n\n  set value (value: string) {\n    this.resolve(value, { input: true });\n  }\n\n  /** Resolve new value */\n  resolve (value: string, flags: AppendFlags={ input: true }): void {\n    this.reset();\n    this.append(value, flags, '');\n    this.doCommit();\n  }\n\n  get unmaskedValue (): string {\n    return this.value;\n  }\n\n  set unmaskedValue (value: string) {\n    this.resolve(value, {});\n  }\n\n  get typedValue (): Value {\n    return this.parse ? this.parse(this.value, this) : this.unmaskedValue as Value;\n  }\n\n  set typedValue (value: Value) {\n    if (this.format) {\n      this.value = this.format(value, this);\n    } else {\n      this.unmaskedValue = String(value);\n    }\n  }\n\n  /** Value that includes raw user input */\n  get rawInputValue (): string {\n    return this.extractInput(0, this.displayValue.length, {raw: true});\n  }\n\n  set rawInputValue (value: string) {\n    this.resolve(value, { raw: true });\n  }\n\n  get displayValue (): string {\n    return this.value;\n  }\n\n  get isComplete (): boolean {\n    return true;\n  }\n\n  get isFilled (): boolean {\n    return this.isComplete;\n  }\n\n  /** Finds nearest input position in direction */\n  nearestInputPos (cursorPos: number, direction?: Direction): number {\n    return cursorPos;\n  }\n\n  totalInputPositions (fromPos: number=0, toPos: number=this.displayValue.length): number {\n    return Math.min(this.displayValue.length, toPos - fromPos);\n  }\n\n  /** Extracts value in range considering flags */\n  extractInput (fromPos: number=0, toPos: number=this.displayValue.length, flags?: ExtractFlags): string {\n    return this.displayValue.slice(fromPos, toPos);\n  }\n\n  /** Extracts tail in range */\n  extractTail (fromPos: number=0, toPos: number=this.displayValue.length): TailDetails {\n    return new ContinuousTailDetails(this.extractInput(fromPos, toPos), fromPos);\n  }\n\n  /** Appends tail */\n  appendTail (tail: string | String | TailDetails): ChangeDetails {\n    if (isString(tail)) tail = new ContinuousTailDetails(String(tail));\n\n    return (tail as TailDetails).appendTo(this);\n  }\n\n  /** Appends char */\n  _appendCharRaw (ch: string, flags: AppendFlags={}): ChangeDetails {\n    if (!ch) return new ChangeDetails();\n\n    this._value += ch;\n    return new ChangeDetails({\n      inserted: ch,\n      rawInserted: ch,\n    });\n  }\n\n  /** Appends char */\n  _appendChar (ch: string, flags: AppendFlags={}, checkTail?: TailDetails): ChangeDetails {\n    const consistentState = this.state;\n    let details: ChangeDetails;\n    [ch, details] = this.doPrepareChar(ch, flags);\n\n    if (ch) {\n      details = details.aggregate(this._appendCharRaw(ch, flags));\n\n      // TODO handle `skip`?\n\n      // try `autofix` lookahead\n      if (!details.rawInserted && this.autofix === 'pad') {\n        const noFixState = this.state;\n        this.state = consistentState;\n\n        let fixDetails = this.pad(flags);\n        const chDetails = this._appendCharRaw(ch, flags);\n        fixDetails = fixDetails.aggregate(chDetails);\n\n        // if fix was applied or\n        // if details are equal use skip restoring state optimization\n        if (chDetails.rawInserted || fixDetails.equals(details)) {\n          details = fixDetails;\n        } else {\n          this.state = noFixState;\n        }\n      }\n    }\n\n    if (details.inserted) {\n      let consistentTail;\n      let appended = this.doValidate(flags) !== false;\n\n      if (appended && checkTail != null) {\n        // validation ok, check tail\n        const beforeTailState = this.state;\n        if (this.overwrite === true) {\n          consistentTail = checkTail.state;\n          for (let i=0; i < details.rawInserted.length; ++i) {\n            checkTail.unshift(this.displayValue.length - details.tailShift);\n          }\n        }\n\n        let tailDetails = this.appendTail(checkTail);\n        appended = tailDetails.rawInserted.length === checkTail.toString().length;\n\n        // not ok, try shift\n        if (!(appended && tailDetails.inserted) && this.overwrite === 'shift') {\n          this.state = beforeTailState;\n          consistentTail = checkTail.state;\n          for (let i=0; i < details.rawInserted.length; ++i) {\n            checkTail.shift();\n          }\n\n          tailDetails = this.appendTail(checkTail);\n          appended = tailDetails.rawInserted.length === checkTail.toString().length;\n        }\n\n        // if ok, rollback state after tail\n        if (appended && tailDetails.inserted) this.state = beforeTailState;\n      }\n\n      // revert all if something went wrong\n      if (!appended) {\n        details = new ChangeDetails();\n        this.state = consistentState;\n        if (checkTail && consistentTail) checkTail.state = consistentTail;\n      }\n    }\n    return details;\n  }\n\n  /** Appends optional placeholder at the end */\n  _appendPlaceholder (): ChangeDetails {\n    return new ChangeDetails();\n  }\n\n  /** Appends optional eager placeholder at the end */\n  _appendEager (): ChangeDetails {\n    return new ChangeDetails();\n  }\n\n  /** Appends symbols considering flags */\n  append (str: string, flags?: AppendFlags, tail?: string | String | TailDetails): ChangeDetails {\n    if (!isString(str)) throw new Error('value should be string');\n    const checkTail = isString(tail) ? new ContinuousTailDetails(String(tail)) : tail as TailDetails;\n    if (flags?.tail) flags._beforeTailState = this.state;\n\n    let details;\n    [str, details] = this.doPrepare(str, flags);\n\n    for (let ci=0; ci<str.length; ++ci) {\n      const d = this._appendChar(str[ci], flags, checkTail);\n      if (!d.rawInserted && !this.doSkipInvalid(str[ci], flags, checkTail)) break;\n      details.aggregate(d);\n    }\n\n    if ((this.eager === true || this.eager === 'append') && flags?.input && str) {\n      details.aggregate(this._appendEager());\n    }\n\n    // append tail but aggregate only tailShift\n    if (checkTail != null) {\n      details.tailShift += this.appendTail(checkTail).tailShift;\n      // TODO it's a good idea to clear state after appending ends\n      // but it causes bugs when one append calls another (when dynamic dispatch set rawInputValue)\n      // this._resetBeforeTailState();\n    }\n\n    return details;\n  }\n\n  remove (fromPos: number=0, toPos: number=this.displayValue.length): ChangeDetails {\n    this._value = this.displayValue.slice(0, fromPos) + this.displayValue.slice(toPos);\n    return new ChangeDetails();\n  }\n\n  /** Calls function and reapplies current value */\n  withValueRefresh<T>(fn: () => T): T {\n    if (this._refreshing || !this._initialized) return fn();\n    this._refreshing = true;\n\n    const rawInput = this.rawInputValue;\n    const value = this.value;\n\n    const ret = fn();\n\n    this.rawInputValue = rawInput;\n    // append lost trailing chars at the end\n    if (this.value && this.value !== value && value.indexOf(this.value) === 0) {\n      this.append(value.slice(this.displayValue.length), {}, '');\n      this.doCommit();\n    }\n\n    delete this._refreshing;\n    return ret;\n  }\n\n  runIsolated<T>(fn: (masked: this) => T): T {\n    if (this._isolated || !this._initialized) return fn(this);\n    this._isolated = true;\n    const state = this.state;\n\n    const ret = fn(this);\n\n    this.state = state;\n    delete this._isolated;\n\n    return ret;\n  }\n\n  doSkipInvalid (ch: string, flags: AppendFlags={}, checkTail?: TailDetails): boolean {\n    return Boolean(this.skipInvalid);\n  }\n\n  /** Prepares string before mask processing */\n  doPrepare (str: string, flags: AppendFlags={}): [string, ChangeDetails] {\n    return ChangeDetails.normalize(this.prepare ?\n      this.prepare(str, this, flags) :\n      str);\n  }\n\n  /** Prepares each char before mask processing */\n  doPrepareChar (str: string, flags: AppendFlags={}): [string, ChangeDetails] {\n    return ChangeDetails.normalize(this.prepareChar ?\n      this.prepareChar(str, this, flags) :\n      str);\n  }\n\n  /** Validates if value is acceptable */\n  doValidate (flags: AppendFlags): boolean {\n    return (!this.validate || this.validate(this.value, this, flags)) &&\n      (!this.parent || this.parent.doValidate(flags));\n  }\n\n  /** Does additional processing at the end of editing */\n  doCommit () {\n    if (this.commit) this.commit(this.value, this);\n  }\n\n  splice (start: number, deleteCount: number, inserted='', removeDirection: Direction = DIRECTION.NONE, flags: AppendFlags = { input: true }): ChangeDetails {\n    const tailPos: number = start + deleteCount;\n    const tail: TailDetails = this.extractTail(tailPos);\n\n    const eagerRemove = this.eager === true || this.eager === 'remove';\n\n    let oldRawValue;\n    if (eagerRemove)  {\n      removeDirection = forceDirection(removeDirection);\n      oldRawValue = this.extractInput(0, tailPos, {raw: true});\n    }\n\n    let startChangePos: number = start;\n    const details: ChangeDetails = new ChangeDetails();\n\n    // if it is just deletion without insertion\n    if (removeDirection !== DIRECTION.NONE) {\n      startChangePos = this.nearestInputPos(start,\n        deleteCount > 1 && start !== 0 && !eagerRemove ?\n        DIRECTION.NONE :\n        removeDirection\n      );\n\n      // adjust tailShift if start was aligned\n      details.tailShift = startChangePos - start;\n    }\n\n    details.aggregate(this.remove(startChangePos));\n\n    if (eagerRemove && removeDirection !== DIRECTION.NONE && oldRawValue === this.rawInputValue) {\n      if (removeDirection === DIRECTION.FORCE_LEFT) {\n        let valLength;\n        while (oldRawValue === this.rawInputValue && (valLength = this.displayValue.length)) {\n          details\n            .aggregate(new ChangeDetails({ tailShift: -1 }))\n            .aggregate(this.remove(valLength-1));\n        }\n      } else if (removeDirection === DIRECTION.FORCE_RIGHT) {\n        tail.unshift();\n      }\n    }\n\n    return details.aggregate(this.append(inserted, flags, tail));\n  }\n\n  maskEquals (mask: any): boolean {\n    return this.mask === mask;\n  }\n\n  optionsIsChanged (opts: Partial<MaskedOptions>): boolean {\n    return !objectIncludes(this, opts);\n  }\n\n  typedValueEquals (value: any): boolean {\n    const tval = this.typedValue;\n\n    return value === tval ||\n      Masked.EMPTY_VALUES.includes(value) && Masked.EMPTY_VALUES.includes(tval) ||\n      (this.format ? this.format(value, this) === this.format(this.typedValue, this) : false);\n  }\n\n  pad (flags?: AppendFlags): ChangeDetails {\n    return new ChangeDetails();\n  }\n}\n\n\nIMask.Masked = Masked;\n","import type { TailDetails, AppendTail } from '../../core/tail-details';\nimport ChangeDetails from '../../core/change-details';\nimport { isString } from '../../core/utils';\nimport ContinuousTailDetails from '../../core/continuous-tail-details';\nimport IMask from '../../core/holder';\nimport type MaskedPattern from '../pattern';\n\n\nexport\ntype ChunksTailState = Pick<ChunksTailDetails,\n  | 'from'\n  | 'stop'\n  | 'blockIndex'\n> & { chunks: Array<TailDetails['state']> };\n\nexport default\nclass ChunksTailDetails implements TailDetails {\n  declare chunks: Array<TailDetails>;\n  declare from: number;\n  declare stop?: number;\n  /** */\n  declare blockIndex?: number;\n\n  constructor (chunks: Array<TailDetails>=[], from: number=0) {\n    this.chunks = chunks;\n    this.from = from;\n  }\n\n  toString (): string {\n    return this.chunks.map(String).join('');\n  }\n\n  extend (tailChunk: string | String | TailDetails): void {\n    if (!String(tailChunk)) return;\n    tailChunk = (isString(tailChunk) ? new ContinuousTailDetails(String(tailChunk)) : tailChunk) as TailDetails;\n\n    const lastChunk = this.chunks[this.chunks.length-1];\n    const extendLast = lastChunk &&\n      // if stops are same or tail has no stop\n      (lastChunk.stop === tailChunk.stop || tailChunk.stop == null) &&\n      // if tail chunk goes just after last chunk\n      tailChunk.from === (lastChunk.from + lastChunk.toString().length);\n\n    if (tailChunk instanceof ContinuousTailDetails) {\n      // check the ability to extend previous chunk\n      if (extendLast) {\n        // extend previous chunk\n        lastChunk.extend(tailChunk.toString());\n      } else {\n        // append new chunk\n        this.chunks.push(tailChunk);\n      }\n    } else if (tailChunk instanceof ChunksTailDetails) {\n      if (tailChunk.stop == null) {\n        // unwrap floating chunks to parent, keeping `from` pos\n        let firstTailChunk;\n        while (tailChunk.chunks.length && tailChunk.chunks[0].stop == null) {\n          firstTailChunk = tailChunk.chunks.shift() as TailDetails;  // not possible to be `undefined` because length was checked above\n          firstTailChunk.from += tailChunk.from;\n          this.extend(firstTailChunk);\n        }\n      }\n\n      // if tail chunk still has value\n      if (tailChunk.toString()) {\n        // if chunks contains stops, then popup stop to container\n        tailChunk.stop = tailChunk.blockIndex;\n        this.chunks.push(tailChunk);\n      }\n    }\n  }\n\n  appendTo (masked: AppendTail | MaskedPattern): ChangeDetails {\n    if (!(masked instanceof IMask.MaskedPattern)) {\n      const tail = new ContinuousTailDetails(this.toString());\n      return tail.appendTo(masked);\n    }\n\n    const details = new ChangeDetails();\n\n    for (let ci=0; ci < this.chunks.length; ++ci) {\n      const chunk = this.chunks[ci];\n\n      const lastBlockIter = masked._mapPosToBlock(masked.displayValue.length);\n      const stop = chunk.stop;\n      let chunkBlock;\n      if (stop != null &&\n        // if block not found or stop is behind lastBlock\n        (!lastBlockIter || lastBlockIter.index <= stop)\n      ) {\n        if (\n          chunk instanceof ChunksTailDetails ||\n          // for continuous block also check if stop is exist\n          masked._stops.indexOf(stop) >= 0\n        ) {\n          details.aggregate(masked._appendPlaceholder(stop));\n        }\n        chunkBlock = chunk instanceof ChunksTailDetails && masked._blocks[stop];\n      }\n\n      if (chunkBlock) {\n        const tailDetails = chunkBlock.appendTail(chunk);\n        details.aggregate(tailDetails);\n\n        // get not inserted chars\n        const remainChars = chunk.toString().slice(tailDetails.rawInserted.length);\n        if (remainChars) details.aggregate(masked.append(remainChars, { tail: true }));\n      } else {\n        details.aggregate(masked.append(chunk.toString(), { tail: true }));\n      }\n    }\n\n    return details;\n  }\n\n  get state (): ChunksTailState {\n    return {\n      chunks: this.chunks.map(c => c.state),\n      from: this.from,\n      stop: this.stop,\n      blockIndex: this.blockIndex,\n    };\n  }\n\n  set state (state: ChunksTailState) {\n    const { chunks, ...props } = state;\n    Object.assign(this, props);\n    this.chunks = chunks.map(cstate => {\n      const chunk = \"chunks\" in cstate ?\n        new ChunksTailDetails() :\n        new ContinuousTailDetails();\n      chunk.state = cstate;\n      return chunk;\n    });\n  }\n\n  unshift (beforePos?: number): string {\n    if (!this.chunks.length || (beforePos != null && this.from >= beforePos)) return '';\n\n    const chunkShiftPos = beforePos != null ? beforePos - this.from : beforePos;\n    let ci=0;\n    while (ci < this.chunks.length) {\n      const chunk = this.chunks[ci];\n      const shiftChar = chunk.unshift(chunkShiftPos);\n\n      if (chunk.toString()) {\n        // chunk still contains value\n        // but not shifted - means no more available chars to shift\n        if (!shiftChar) break;\n        ++ci;\n      } else {\n        // clean if chunk has no value\n        this.chunks.splice(ci, 1);\n      }\n\n      if (shiftChar) return shiftChar;\n    }\n\n    return '';\n  }\n\n  shift (): string {\n    if (!this.chunks.length) return '';\n\n    let ci=this.chunks.length-1;\n    while (0 <= ci) {\n      const chunk = this.chunks[ci];\n      const shiftChar = chunk.shift();\n\n      if (chunk.toString()) {\n        // chunk still contains value\n        // but not shifted - means no more available chars to shift\n        if (!shiftChar) break;\n        --ci;\n      } else {\n        // clean if chunk has no value\n        this.chunks.splice(ci, 1);\n      }\n\n      if (shiftChar) return shiftChar;\n    }\n\n    return '';\n  }\n}\n","import { DIRECTION } from '../../core/utils';\nimport type MaskedPattern from '../pattern';\nimport type PatternBlock from './block';\n\n\ntype PatternCursorState = { offset: number, index: number, ok: boolean };\n\nexport default\nclass PatternCursor<Value> {\n  declare masked: MaskedPattern<Value>;\n  declare offset: number;\n  declare index: number;\n  declare ok: boolean;\n  declare _log: PatternCursorState[];\n\n  constructor (masked: MaskedPattern<Value>, pos: number) {\n    this.masked = masked;\n    this._log = [];\n\n    const { offset, index } = masked._mapPosToBlock(pos) || (\n      pos < 0 ?\n        // first\n        { index: 0, offset: 0 } :\n        // last\n        { index: this.masked._blocks.length, offset: 0 }\n    );\n    this.offset = offset;\n    this.index = index;\n    this.ok = false;\n  }\n\n  get block (): PatternBlock {\n    return this.masked._blocks[this.index];\n  }\n\n  get pos (): number {\n    return this.masked._blockStartPos(this.index) + this.offset;\n  }\n\n  get state (): PatternCursorState {\n    return { index: this.index, offset: this.offset, ok: this.ok };\n  }\n\n  set state (s: PatternCursorState) {\n    Object.assign(this, s);\n  }\n\n  pushState () {\n    this._log.push(this.state);\n  }\n\n  popState (): PatternCursorState | undefined {\n    const s = this._log.pop();\n    if (s) this.state = s;\n    return s;\n  }\n\n  bindBlock () {\n    if (this.block) return;\n    if (this.index < 0) {\n      this.index = 0;\n      this.offset = 0;\n    }\n    if (this.index >= this.masked._blocks.length) {\n      this.index = this.masked._blocks.length - 1;\n      this.offset = (this.block as unknown as PatternBlock).displayValue.length; // TODO this is stupid type error, `block` depends on index that was changed above\n    }\n  }\n\n  _pushLeft(fn: () => boolean | undefined): boolean {\n    this.pushState();\n    for (this.bindBlock(); 0<=this.index; --this.index, this.offset=this.block?.displayValue.length || 0) {\n      if (fn()) return this.ok = true;\n    }\n\n    return this.ok = false;\n  }\n\n  _pushRight (fn: () => boolean | undefined): boolean {\n    this.pushState();\n    for (this.bindBlock(); this.index<this.masked._blocks.length; ++this.index, this.offset=0) {\n      if (fn()) return this.ok = true;\n    }\n\n    return this.ok = false;\n  }\n\n  pushLeftBeforeFilled (): boolean {\n    return this._pushLeft(() => {\n      if (this.block.isFixed || !this.block.value) return;\n\n      this.offset = this.block.nearestInputPos(this.offset, DIRECTION.FORCE_LEFT);\n      if (this.offset !== 0) return true;\n    });\n  }\n\n  pushLeftBeforeInput (): boolean {\n    // cases:\n    // filled input: 00|\n    // optional empty input: 00[]|\n    // nested block: XX<[]>|\n    return this._pushLeft(() => {\n      if (this.block.isFixed) return;\n\n      this.offset = this.block.nearestInputPos(this.offset, DIRECTION.LEFT);\n      return true;\n    });\n  }\n\n  pushLeftBeforeRequired (): boolean {\n    return this._pushLeft(() => {\n      if (this.block.isFixed || this.block.isOptional && !this.block.value) return;\n\n      this.offset = this.block.nearestInputPos(this.offset, DIRECTION.LEFT);\n      return true;\n    });\n  }\n\n  pushRightBeforeFilled (): boolean {\n    return this._pushRight(() => {\n      if (this.block.isFixed || !this.block.value) return;\n\n      this.offset = this.block.nearestInputPos(this.offset, DIRECTION.FORCE_RIGHT);\n      if (this.offset !== this.block.value.length) return true;\n    });\n  }\n\n  pushRightBeforeInput (): boolean {\n    return this._pushRight(() => {\n      if (this.block.isFixed) return;\n\n      // const o = this.offset;\n      this.offset = this.block.nearestInputPos(this.offset, DIRECTION.NONE);\n      // HACK cases like (STILL DOES NOT WORK FOR NESTED)\n      // aa|X\n      // aa<X|[]>X_    - this will not work\n      // if (o && o === this.offset && this.block instanceof PatternInputDefinition) continue;\n      return true;\n    });\n  }\n\n  pushRightBeforeRequired (): boolean {\n    return this._pushRight(() => {\n      if (this.block.isFixed || this.block.isOptional && !this.block.value) return;\n\n      // TODO check |[*]XX_\n      this.offset = this.block.nearestInputPos(this.offset, DIRECTION.NONE);\n      return true;\n    });\n  }\n}\n","import ChangeDetails from '../../core/change-details';\nimport { DIRECTION, type Direction, isString } from '../../core/utils';\nimport { type TailDetails } from '../../core/tail-details';\nimport ContinuousTailDetails from '../../core/continuous-tail-details';\nimport { type ExtractFlags, type AppendFlags, type MaskedState } from '../base';\nimport type PatternBlock from './block';\n\n\nexport\ntype PatternFixedDefinitionOptions = Pick<PatternFixedDefinition, 'char' | 'isUnmasking' | 'eager'>;\n\n\nexport default\nclass PatternFixedDefinition implements PatternBlock {\n  /** */\n  declare _value: string;\n  /** */\n  declare char: string;\n  /** */\n  declare isUnmasking?: boolean;\n  /** */\n  declare eager: boolean | 'remove' | 'append' | undefined;\n  /** */\n  declare _isRawInput?: boolean;\n  /** */\n  declare isFixed: boolean;\n\n  constructor(opts: PatternFixedDefinitionOptions) {\n    Object.assign(this, opts);\n    this._value = '';\n    this.isFixed = true;\n  }\n\n  get value (): string {\n    return this._value;\n  }\n\n  get unmaskedValue (): string {\n    return this.isUnmasking ? this.value : '';\n  }\n\n  get rawInputValue (): string {\n    return this._isRawInput ? this.value : '';\n  }\n\n  get displayValue (): string {\n    return this.value;\n  }\n\n  reset () {\n    this._isRawInput = false;\n    this._value = '';\n  }\n\n  remove (fromPos: number=0, toPos: number=this._value.length): ChangeDetails {\n    this._value = this._value.slice(0, fromPos) + this._value.slice(toPos);\n    if (!this._value) this._isRawInput = false;\n\n    return new ChangeDetails();\n  }\n\n  nearestInputPos (cursorPos: number, direction: Direction=DIRECTION.NONE): number {\n    const minPos = 0;\n    const maxPos = this._value.length;\n\n    switch (direction) {\n      case DIRECTION.LEFT:\n      case DIRECTION.FORCE_LEFT:\n        return minPos;\n      case DIRECTION.NONE:\n      case DIRECTION.RIGHT:\n      case DIRECTION.FORCE_RIGHT:\n      default:\n        return maxPos;\n    }\n  }\n\n  totalInputPositions (fromPos: number=0, toPos: number=this._value.length): number {\n    return this._isRawInput ? (toPos - fromPos) : 0;\n  }\n\n  extractInput (fromPos: number=0, toPos: number=this._value.length, flags: ExtractFlags={}): string {\n    return flags.raw && this._isRawInput && this._value.slice(fromPos, toPos) || '';\n  }\n\n  get isComplete (): boolean {\n    return true;\n  }\n\n  get isFilled (): boolean {\n    return Boolean(this._value);\n  }\n\n  _appendChar (ch: string, flags: AppendFlags={}): ChangeDetails {\n    if (this.isFilled) return new ChangeDetails();\n    const appendEager = this.eager === true || this.eager === 'append';\n\n    const appended = this.char === ch;\n    const isResolved = appended && (this.isUnmasking || flags.input || flags.raw) && (!flags.raw || !appendEager) && !flags.tail;\n    const details = new ChangeDetails({\n      inserted: this.char,\n      rawInserted: isResolved ? this.char: '',\n    })\n    this._value = this.char;\n    this._isRawInput = isResolved && (flags.raw || flags.input);\n\n    return details;\n  }\n\n  _appendEager (): ChangeDetails {\n    return this._appendChar(this.char, { tail: true });\n  }\n\n  _appendPlaceholder (): ChangeDetails {\n    const details = new ChangeDetails();\n    if (this.isFilled) return details;\n\n    this._value = details.inserted = this.char;\n    return details;\n  }\n\n  extractTail (): TailDetails {\n    return new ContinuousTailDetails('');\n  }\n\n  appendTail (tail: string | String | TailDetails): ChangeDetails {\n    if (isString(tail)) tail = new ContinuousTailDetails(String(tail));\n\n    return (tail as TailDetails).appendTo(this);\n  }\n\n  append (str: string, flags?: AppendFlags, tail?: TailDetails): ChangeDetails {\n    const details = this._appendChar(str[0], flags);\n\n    if (tail != null) {\n      details.tailShift += this.appendTail(tail).tailShift;\n    }\n\n    return details;\n  }\n\n  doCommit () {}\n\n  get state (): MaskedState {\n    return {\n      _value: this._value,\n      _rawInputValue: this.rawInputValue,\n    };\n  }\n\n  set state (state: MaskedState) {\n    this._value = state._value;\n    this._isRawInput = Boolean(state._rawInputValue);\n  }\n\n  pad (flags?: AppendFlags): ChangeDetails {\n    return this._appendPlaceholder();\n  }\n}\n","import createMask, { type FactoryArg, type FactoryOpts, type FactoryReturnMasked } from '../factory';\nimport type Masked from '../base';\nimport type MaskedPattern from '../pattern';\nimport { type TailDetails } from '../../core/tail-details';\nimport { type ExtractFlags, type AppendFlags, type MaskedState } from '../base';\nimport ChangeDetails from '../../core/change-details';\nimport { DIRECTION, type Direction } from '../../core/utils';\nimport type PatternBlock from './block';\n\n\nexport\ntype PatternInputDefinitionOptions<Opts extends FactoryOpts> =\n  Omit<Opts,\n  | 'parent'\n  | 'isOptional'\n  | 'lazy'\n  | 'eager'\n  | 'placeholderChar'\n  | 'displayChar'> &\n  Partial<Pick<PatternInputDefinition,\n  | 'parent'\n  | 'isOptional'\n  | 'lazy'\n  | 'eager'\n  | 'placeholderChar'\n  | 'displayChar'\n>>;\n\nexport\ntype PatternInputDefinitionState<Opts extends FactoryArg> = MaskedState & {\n  masked: FactoryReturnMasked<Opts>['state'],\n  isFilled: boolean,\n};\n\n\nexport default\nclass PatternInputDefinition<Opts extends FactoryOpts=any> implements PatternBlock<PatternInputDefinitionState<Opts>> {\n  static DEFAULT_DEFINITIONS: { [k: string]: RegExp } = {\n    '0': /\\d/,\n    'a': /[\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0\\u08A2-\\u08AC\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0977\\u0979-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA697\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7F8-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA80-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]/,  // http://stackoverflow.com/a/22075070\n    '*': /./\n  }\n\n  /** */\n  declare readonly masked: FactoryReturnMasked<Opts>;\n  /** */\n  declare parent: Masked;\n  /** */\n  declare isOptional: boolean;\n  /** */\n  declare isFilled: boolean;\n  /** */\n  declare lazy: MaskedPattern['lazy'];\n  /** */\n  declare eager: MaskedPattern['eager'];\n  /** */\n  declare placeholderChar: MaskedPattern['placeholderChar'];\n  /** */\n  declare displayChar: MaskedPattern['displayChar'];\n\n\n  constructor(opts: PatternInputDefinitionOptions<Opts>) {\n    const { parent, isOptional, placeholderChar, displayChar, lazy, eager, ...maskOpts } = opts;\n\n    this.masked = createMask(maskOpts as Opts);\n    Object.assign(this, { parent, isOptional, placeholderChar, displayChar, lazy, eager });\n  }\n\n  reset () {\n    this.isFilled = false;\n    this.masked.reset();\n  }\n\n  remove (fromPos: number=0, toPos: number=this.value.length): ChangeDetails {\n    if (fromPos === 0 && toPos >= 1) {\n      this.isFilled = false;\n      return this.masked.remove(fromPos, toPos);\n    }\n\n    return new ChangeDetails();\n  }\n\n  get value (): string {\n    return this.masked.value ||\n      (this.isFilled && !this.isOptional ?\n        this.placeholderChar :\n        '');\n  }\n\n  get unmaskedValue (): string {\n    return this.masked.unmaskedValue;\n  }\n\n  get rawInputValue (): string {\n    return this.masked.rawInputValue;\n  }\n\n  get displayValue (): string {\n    return this.masked.value && this.displayChar || this.value;\n  }\n\n  get isComplete (): boolean {\n    return Boolean(this.masked.value) || this.isOptional;\n  }\n\n  _appendChar (ch: string, flags: AppendFlags<PatternInputDefinitionState<Opts>>={}): ChangeDetails {\n    if (this.isFilled) return new ChangeDetails();\n\n    const state = this.masked.state;\n    // simulate input\n    let details = this.masked._appendChar(ch, this.currentMaskFlags(flags));\n\n    if (details.inserted && this.doValidate(flags) === false) {\n      details = new ChangeDetails();\n      this.masked.state = state;\n    }\n\n    if (!details.inserted && !this.isOptional && !this.lazy && !flags.input) {\n      details.inserted = this.placeholderChar;\n    }\n    details.skip = !details.inserted && !this.isOptional;\n    this.isFilled = Boolean(details.inserted);\n\n    return details;\n  }\n\n  append (str: string, flags?: AppendFlags<PatternInputDefinitionState<Opts>>, tail?: TailDetails): ChangeDetails {\n    // TODO probably should be done via _appendChar\n    return this.masked.append(str, this.currentMaskFlags(flags), tail);\n  }\n\n  _appendPlaceholder (): ChangeDetails {\n    if (this.isFilled || this.isOptional) return new ChangeDetails();\n\n    this.isFilled = true;\n    return new ChangeDetails({ inserted: this.placeholderChar });\n  }\n\n  _appendEager (): ChangeDetails {\n    return new ChangeDetails();\n  }\n\n  extractTail (fromPos?: number, toPos?: number): TailDetails {\n    return this.masked.extractTail(fromPos, toPos);\n  }\n\n  appendTail (tail: string | TailDetails): ChangeDetails {\n    return this.masked.appendTail(tail);\n  }\n\n  extractInput (fromPos: number=0, toPos: number=this.value.length, flags?: ExtractFlags): string {\n    return this.masked.extractInput(fromPos, toPos, flags);\n  }\n\n  nearestInputPos (cursorPos: number, direction: Direction=DIRECTION.NONE): number {\n    const minPos = 0;\n    const maxPos = this.value.length;\n    const boundPos = Math.min(Math.max(cursorPos, minPos), maxPos);\n\n    switch (direction) {\n      case DIRECTION.LEFT:\n      case DIRECTION.FORCE_LEFT:\n        return this.isComplete ? boundPos : minPos;\n      case DIRECTION.RIGHT:\n      case DIRECTION.FORCE_RIGHT:\n        return this.isComplete ? boundPos : maxPos;\n      case DIRECTION.NONE:\n      default: return boundPos;\n    }\n  }\n\n  totalInputPositions (fromPos: number=0, toPos: number=this.value.length): number {\n    return this.value.slice(fromPos, toPos).length;\n  }\n\n  doValidate (flags: AppendFlags<PatternInputDefinitionState<Opts>>): boolean {\n    return this.masked.doValidate(this.currentMaskFlags(flags)) && (\n      !this.parent || this.parent.doValidate(this.currentMaskFlags(flags)));\n  }\n\n  doCommit () {\n    this.masked.doCommit();\n  }\n\n  get state (): PatternInputDefinitionState<Opts> {\n    return {\n      _value: this.value,\n      _rawInputValue: this.rawInputValue,\n      masked: this.masked.state,\n      isFilled: this.isFilled,\n    };\n  }\n\n  set state (state: PatternInputDefinitionState<Opts>) {\n    this.masked.state = state.masked;\n    this.isFilled = state.isFilled;\n  }\n\n  currentMaskFlags (flags?: AppendFlags<PatternInputDefinitionState<Opts>>): AppendFlags {\n    return {\n      ...flags,\n      _beforeTailState: flags?._beforeTailState?.masked || flags?._beforeTailState as unknown as MaskedState,\n    };\n  }\n\n  pad (flags?: AppendFlags): ChangeDetails {\n    return new ChangeDetails();\n  }\n}\n","import Masked, { type MaskedOptions } from './base';\nimport IMask from '../core/holder';\n\n\nexport\ntype MaskedRegExpOptions = MaskedOptions<MaskedRegExp>;\n\n/** Masking by RegExp */\nexport default\nclass MaskedRegExp extends Masked<string> {\n  /** */\n  declare mask: RegExp;\n  /** Enable characters overwriting */\n  declare overwrite?: boolean | 'shift' | undefined;\n  /** */\n  declare eager?: boolean | 'remove' | 'append' | undefined;\n  /** */\n  declare skipInvalid?: boolean | undefined;\n  /** */\n  declare autofix?: boolean | 'pad' | undefined;\n\n  override updateOptions (opts: Partial<MaskedRegExpOptions>) {\n    super.updateOptions(opts);\n  }\n\n  override _update (opts: Partial<MaskedRegExpOptions>) {\n    const mask = opts.mask;\n    if (mask) opts.validate = (value) => value.search(mask) >= 0;\n    super._update(opts);\n  }\n}\n\n\nIMask.MaskedRegExp = MaskedRegExp;\n","import ChangeDetails from '../core/change-details';\nimport IMask from '../core/holder';\nimport { type TailDetails } from '../core/tail-details';\nimport { DIRECTION, type Direction } from '../core/utils';\nimport Masked, { type AppendFlags, type ExtractFlags, type MaskedOptions, type MaskedState } from './base';\nimport createMask, { type FactoryArg, normalizeOpts, type ExtendFactoryArgOptions, NormalizedOpts } from './factory';\nimport type PatternBlock from './pattern/block';\nimport ChunksTailDetails from './pattern/chunk-tail-details';\nimport PatternCursor from './pattern/cursor';\nimport PatternFixedDefinition from './pattern/fixed-definition';\nimport PatternInputDefinition from './pattern/input-definition';\nimport './regexp'; // support for default definitions which are regexp's\n\n\nexport\ntype MaskedPatternOptions<\n  Value=string,\n  M extends MaskedPattern<Value>=MaskedPattern<Value>,\n  Props extends keyof M=never,\n> = MaskedOptions<M,\n  | 'definitions'\n  | 'blocks'\n  | 'placeholderChar'\n  | 'displayChar'\n  | 'lazy'\n  | Props\n>;\n\nexport\ntype Definitions = {\n  [k: string]: FactoryArg,\n};\n\nexport\ntype MaskedPatternState = MaskedState & {\n  _blocks: Array<MaskedState>,\n};\n\nexport\ntype BlockPosData = {\n  index: number,\n  offset: number,\n};\n\nexport\ntype BlockExtraOptions = {\n  expose?: boolean,\n  repeat?: number | [number, number],\n};\n\n\n/** Pattern mask */\nexport default\nclass MaskedPattern<Value=string> extends Masked<Value> {\n  static DEFAULTS = {\n    ...Masked.DEFAULTS,\n    lazy: true,\n    placeholderChar: '_'\n  };\n  static STOP_CHAR = '`';\n  static ESCAPE_CHAR = '\\\\';\n  static InputDefinition = PatternInputDefinition;\n  static FixedDefinition = PatternFixedDefinition;\n\n  declare mask: string;\n  /** */\n  declare blocks: { [key: string]: ExtendFactoryArgOptions<BlockExtraOptions> };\n  /** */\n  declare definitions: Definitions;\n  /** Single char for empty input */\n  declare placeholderChar: string;\n  /** Single char for filled input */\n  declare displayChar: string;\n  /** Show placeholder only when needed */\n  declare lazy: boolean;\n  /** Enable characters overwriting */\n  declare overwrite?: boolean | 'shift' | undefined;\n  /** */\n  declare eager?: boolean | 'remove' | 'append' | undefined;\n  /** */\n  declare skipInvalid?: boolean | undefined;\n  /** */\n  declare autofix?: boolean | 'pad' | undefined;\n\n  declare _blocks: Array<PatternBlock>;\n  declare _maskedBlocks: {[key: string]: Array<number>};\n  declare _stops: Array<number>;\n  declare exposeBlock?: Masked;\n\n  constructor (opts: MaskedPatternOptions<Value>) {\n    super({\n      ...MaskedPattern.DEFAULTS,\n      ...opts,\n      definitions: Object.assign({}, PatternInputDefinition.DEFAULT_DEFINITIONS, opts?.definitions),\n    } as MaskedOptions);\n  }\n\n  override updateOptions (opts: Partial<MaskedPatternOptions<Value>>) {\n    super.updateOptions(opts);\n  }\n\n  override _update (opts: Partial<MaskedPatternOptions<Value>>) {\n    opts.definitions = Object.assign({}, this.definitions, opts.definitions);\n    super._update(opts);\n    this._rebuildMask();\n  }\n\n  _rebuildMask () {\n    const defs = this.definitions;\n    this._blocks = []; this.exposeBlock = undefined;\n    this._stops = [];\n    this._maskedBlocks = {};\n\n    const pattern = this.mask;\n    if (!pattern || !defs) return;\n\n    let unmaskingBlock = false;\n    let optionalBlock = false;\n\n    for (let i=0; i<pattern.length; ++i) {\n      if (this.blocks) {\n        const p = pattern.slice(i);\n        const bNames = Object.keys(this.blocks).filter(bName => p.indexOf(bName) === 0);\n        // order by key length\n        bNames.sort((a, b) => b.length - a.length);\n        // use block name with max length\n        const bName = bNames[0];\n        if (bName) {\n          const { expose, repeat, ...bOpts } = normalizeOpts(this.blocks[bName]) as NormalizedOpts<FactoryArg> & BlockExtraOptions; // TODO type Opts<Arg & Extra>\n          const blockOpts = {\n            lazy: this.lazy,\n            eager: this.eager,\n            placeholderChar: this.placeholderChar,\n            displayChar: this.displayChar,\n            overwrite: this.overwrite,\n            autofix: this.autofix,\n            ...bOpts,\n            repeat,\n            parent: this,\n          };\n          const maskedBlock = repeat != null ? new IMask.RepeatBlock(blockOpts as any /* TODO */) : createMask(blockOpts);\n\n          if (maskedBlock) {\n            this._blocks.push(maskedBlock);\n            if (expose) this.exposeBlock = maskedBlock;\n\n            // store block index\n            if (!this._maskedBlocks[bName]) this._maskedBlocks[bName] = [];\n            this._maskedBlocks[bName].push(this._blocks.length - 1);\n          }\n\n          i += bName.length - 1;\n          continue;\n        }\n      }\n\n      let char = pattern[i];\n      let isInput = char in defs;\n\n      if (char === MaskedPattern.STOP_CHAR) {\n        this._stops.push(this._blocks.length);\n        continue;\n      }\n\n      if (char === '{' || char === '}') {\n        unmaskingBlock = !unmaskingBlock;\n        continue;\n      }\n\n      if (char === '[' || char === ']') {\n        optionalBlock = !optionalBlock;\n        continue;\n      }\n\n      if (char === MaskedPattern.ESCAPE_CHAR) {\n        ++i;\n        char = pattern[i];\n        if (!char) break;\n        isInput = false;\n      }\n\n      const def = isInput ?\n        new PatternInputDefinition({\n          isOptional: optionalBlock,\n          lazy: this.lazy,\n          eager: this.eager,\n          placeholderChar: this.placeholderChar,\n          displayChar: this.displayChar,\n          ...normalizeOpts(defs[char]),\n          parent: this,\n        }) as PatternBlock :\n        new PatternFixedDefinition({\n          char,\n          eager: this.eager,\n          isUnmasking: unmaskingBlock,\n        });\n\n      this._blocks.push(def);\n    }\n  }\n\n  override get state (): MaskedPatternState {\n    return {\n      ...super.state,\n      _blocks: this._blocks.map(b => b.state),\n    };\n  }\n\n  override set state (state: MaskedPatternState) {\n    if (!state) { this.reset(); return; }\n\n    const { _blocks, ...maskedState } = state;\n    this._blocks.forEach((b, bi) => b.state = _blocks[bi]);\n    super.state = maskedState;\n  }\n\n  override reset () {\n    super.reset();\n    this._blocks.forEach(b => b.reset());\n  }\n\n  override get isComplete (): boolean {\n    return this.exposeBlock ? this.exposeBlock.isComplete :\n      this._blocks.every(b => b.isComplete);\n  }\n\n  override get isFilled (): boolean {\n    return this._blocks.every(b => b.isFilled);\n  }\n\n  get isFixed (): boolean {\n    return this._blocks.every(b => b.isFixed);\n  }\n\n  get isOptional (): boolean {\n    return this._blocks.every(b => b.isOptional);\n  }\n\n  override doCommit () {\n    this._blocks.forEach(b => b.doCommit());\n    super.doCommit();\n  }\n\n  override get unmaskedValue (): string {\n    return this.exposeBlock ? this.exposeBlock.unmaskedValue :\n      this._blocks.reduce((str, b) => str += b.unmaskedValue, '');\n  }\n\n  override set unmaskedValue (unmaskedValue: string) {\n    if (this.exposeBlock) {\n      const tail = this.extractTail(this._blockStartPos(this._blocks.indexOf(this.exposeBlock)) + this.exposeBlock.displayValue.length);\n      this.exposeBlock.unmaskedValue = unmaskedValue;\n      this.appendTail(tail);\n      this.doCommit();\n    }\n    else super.unmaskedValue = unmaskedValue;\n  }\n\n  override get value (): string {\n    return this.exposeBlock ? this.exposeBlock.value :\n      // TODO return _value when not in change?\n      this._blocks.reduce((str, b) => str += b.value, '');\n  }\n\n  override set value (value: string) {\n    if (this.exposeBlock) {\n      const tail = this.extractTail(this._blockStartPos(this._blocks.indexOf(this.exposeBlock)) + this.exposeBlock.displayValue.length);\n      this.exposeBlock.value = value;\n      this.appendTail(tail);\n      this.doCommit();\n    }\n    else super.value = value;\n  }\n\n  override get typedValue (): Value {\n    return this.exposeBlock ? this.exposeBlock.typedValue :\n      super.typedValue;\n  }\n\n  override set typedValue (value: Value) {\n    if (this.exposeBlock) {\n      const tail = this.extractTail(this._blockStartPos(this._blocks.indexOf(this.exposeBlock)) + this.exposeBlock.displayValue.length);\n      this.exposeBlock.typedValue = value;\n      this.appendTail(tail);\n      this.doCommit();\n    }\n    else super.typedValue = value;\n  }\n\n  override get displayValue (): string {\n    return this._blocks.reduce((str, b) => str += b.displayValue, '');\n  }\n\n  override appendTail (tail: string | String | TailDetails): ChangeDetails {\n    return super.appendTail(tail).aggregate(this._appendPlaceholder());\n  }\n\n  override _appendEager (): ChangeDetails {\n    const details = new ChangeDetails();\n\n    let startBlockIndex = this._mapPosToBlock(this.displayValue.length)?.index;\n    if (startBlockIndex == null) return details;\n\n    // TODO test if it works for nested pattern masks\n    if (this._blocks[startBlockIndex].isFilled) ++startBlockIndex;\n\n    for (let bi=startBlockIndex; bi<this._blocks.length; ++bi) {\n      const d = this._blocks[bi]._appendEager();\n      if (!d.inserted) break;\n\n      details.aggregate(d);\n    }\n\n    return details;\n  }\n\n  override _appendCharRaw (ch: string, flags: AppendFlags<MaskedPatternState>={}): ChangeDetails {\n    const blockIter = this._mapPosToBlock(this.displayValue.length);\n    const details = new ChangeDetails();\n    if (!blockIter) return details;\n\n    for (let bi=blockIter.index, block; (block = this._blocks[bi]); ++bi) {\n      const blockDetails = block._appendChar(ch, { ...flags, _beforeTailState: flags._beforeTailState?._blocks?.[bi] });\n\n      details.aggregate(blockDetails);\n\n      if (blockDetails.consumed) break; // go next char\n    }\n\n    return details;\n  }\n\n  override extractTail (fromPos: number=0, toPos: number=this.displayValue.length): TailDetails {\n    const chunkTail = new ChunksTailDetails();\n    if (fromPos === toPos) return chunkTail;\n\n    this._forEachBlocksInRange(fromPos, toPos, (b, bi, bFromPos, bToPos) => {\n      const blockChunk = b.extractTail(bFromPos, bToPos);\n      blockChunk.stop = this._findStopBefore(bi);\n      blockChunk.from = this._blockStartPos(bi);\n      if (blockChunk instanceof ChunksTailDetails) blockChunk.blockIndex = bi;\n\n      chunkTail.extend(blockChunk);\n    });\n\n    return chunkTail;\n  }\n\n  override extractInput (fromPos: number=0, toPos: number=this.displayValue.length, flags: ExtractFlags={}): string {\n    if (fromPos === toPos) return '';\n\n    let input = '';\n\n    this._forEachBlocksInRange(fromPos, toPos, (b, _, fromPos, toPos) => {\n      input += b.extractInput(fromPos, toPos, flags);\n    });\n\n    return input;\n  }\n\n  _findStopBefore (blockIndex: number): number | undefined {\n    let stopBefore;\n    for (let si=0; si<this._stops.length; ++si) {\n      const stop = this._stops[si];\n      if (stop <= blockIndex) stopBefore = stop;\n      else break;\n    }\n    return stopBefore;\n  }\n\n  /** Appends placeholder depending on laziness */\n  override _appendPlaceholder (toBlockIndex?: number): ChangeDetails {\n    const details = new ChangeDetails();\n    if (this.lazy && toBlockIndex == null) return details;\n\n    const startBlockIter = this._mapPosToBlock(this.displayValue.length);\n    if (!startBlockIter) return details;\n\n    const startBlockIndex = startBlockIter.index;\n    const endBlockIndex = toBlockIndex != null ? toBlockIndex : this._blocks.length;\n\n    this._blocks.slice(startBlockIndex, endBlockIndex)\n      .forEach(b => {\n        if (!b.lazy || toBlockIndex != null) {\n          details.aggregate(b._appendPlaceholder((b as MaskedPattern)._blocks?.length));\n        }\n      });\n\n    return details;\n  }\n\n  /** Finds block in pos */\n  _mapPosToBlock (pos: number): BlockPosData | undefined {\n    let accVal = '';\n    for (let bi=0; bi<this._blocks.length; ++bi) {\n      const block = this._blocks[bi];\n      const blockStartPos = accVal.length;\n\n      accVal += block.displayValue;\n\n      if (pos <= accVal.length) {\n        return {\n          index: bi,\n          offset: pos - blockStartPos,\n        };\n      }\n    }\n  }\n\n  _blockStartPos (blockIndex: number): number {\n    return this._blocks\n      .slice(0, blockIndex)\n      .reduce((pos, b) => pos += b.displayValue.length, 0);\n  }\n\n  _forEachBlocksInRange (fromPos: number, toPos: number=this.displayValue.length, fn: (block: PatternBlock, blockIndex: number, fromPos: number, toPos: number) => void) {\n    const fromBlockIter = this._mapPosToBlock(fromPos);\n\n    if (fromBlockIter) {\n      const toBlockIter = this._mapPosToBlock(toPos);\n      // process first block\n      const isSameBlock = toBlockIter && fromBlockIter.index === toBlockIter.index;\n      const fromBlockStartPos = fromBlockIter.offset;\n      const fromBlockEndPos = toBlockIter && isSameBlock ?\n        toBlockIter.offset :\n        this._blocks[fromBlockIter.index].displayValue.length;\n      fn(this._blocks[fromBlockIter.index], fromBlockIter.index, fromBlockStartPos, fromBlockEndPos);\n\n      if (toBlockIter && !isSameBlock) {\n        // process intermediate blocks\n        for (let bi=fromBlockIter.index+1; bi<toBlockIter.index; ++bi) {\n          fn(this._blocks[bi], bi, 0, this._blocks[bi].displayValue.length);\n        }\n\n        // process last block\n        fn(this._blocks[toBlockIter.index], toBlockIter.index, 0, toBlockIter.offset);\n      }\n    }\n  }\n\n  override remove (fromPos: number=0, toPos: number=this.displayValue.length): ChangeDetails {\n    const removeDetails = super.remove(fromPos, toPos);\n    this._forEachBlocksInRange(fromPos, toPos, (b, _, bFromPos, bToPos) => {\n      removeDetails.aggregate(b.remove(bFromPos, bToPos));\n    });\n    return removeDetails;\n  }\n\n  override nearestInputPos (cursorPos: number, direction: Direction=DIRECTION.NONE): number {\n    if (!this._blocks.length) return 0;\n    const cursor = new PatternCursor(this, cursorPos);\n\n    if (direction === DIRECTION.NONE) {\n      // -------------------------------------------------\n      // NONE should only go out from fixed to the right!\n      // -------------------------------------------------\n      if (cursor.pushRightBeforeInput()) return cursor.pos;\n      cursor.popState();\n      if (cursor.pushLeftBeforeInput()) return cursor.pos;\n      return this.displayValue.length;\n    }\n\n    // FORCE is only about a|* otherwise is 0\n    if (direction === DIRECTION.LEFT || direction === DIRECTION.FORCE_LEFT) {\n      // try to break fast when *|a\n      if (direction === DIRECTION.LEFT) {\n        cursor.pushRightBeforeFilled();\n        if (cursor.ok && cursor.pos === cursorPos) return cursorPos;\n        cursor.popState();\n      }\n\n      // forward flow\n      cursor.pushLeftBeforeInput();\n      cursor.pushLeftBeforeRequired();\n      cursor.pushLeftBeforeFilled();\n\n      // backward flow\n      if (direction === DIRECTION.LEFT) {\n        cursor.pushRightBeforeInput();\n        cursor.pushRightBeforeRequired();\n        if (cursor.ok && cursor.pos <= cursorPos) return cursor.pos;\n        cursor.popState();\n        if (cursor.ok && cursor.pos <= cursorPos) return cursor.pos;\n        cursor.popState();\n      }\n      if (cursor.ok) return cursor.pos;\n      if (direction === DIRECTION.FORCE_LEFT) return 0;\n\n      cursor.popState();\n      if (cursor.ok) return cursor.pos;\n\n      cursor.popState();\n      if (cursor.ok) return cursor.pos;\n\n      return 0;\n    }\n\n    if (direction === DIRECTION.RIGHT || direction === DIRECTION.FORCE_RIGHT) {\n      // forward flow\n      cursor.pushRightBeforeInput();\n      cursor.pushRightBeforeRequired();\n\n      if (cursor.pushRightBeforeFilled()) return cursor.pos;\n      if (direction === DIRECTION.FORCE_RIGHT) return this.displayValue.length;\n\n      // backward flow\n      cursor.popState();\n      if (cursor.ok) return cursor.pos;\n\n      cursor.popState();\n      if (cursor.ok) return cursor.pos;\n\n      return this.nearestInputPos(cursorPos, DIRECTION.LEFT);\n    }\n\n    return cursorPos;\n  }\n\n  override totalInputPositions (fromPos: number=0, toPos: number=this.displayValue.length): number {\n    let total = 0;\n    this._forEachBlocksInRange(fromPos, toPos, (b, _, bFromPos, bToPos) => {\n      total += b.totalInputPositions(bFromPos, bToPos);\n    });\n    return total;\n  }\n\n  /** Get block by name */\n  maskedBlock (name: string): PatternBlock | undefined {\n    return this.maskedBlocks(name)[0];\n  }\n\n  /** Get all blocks by name */\n  maskedBlocks (name: string): Array<PatternBlock> {\n    const indices = this._maskedBlocks[name];\n    if (!indices) return [];\n    return indices.map(gi => this._blocks[gi]);\n  }\n\n  override pad (flags?: AppendFlags): ChangeDetails {\n    const details = new ChangeDetails();\n    this._forEachBlocksInRange(0, this.displayValue.length, b => details.aggregate(b.pad(flags)))\n    return details;\n  }\n}\n\n\nIMask.MaskedPattern = MaskedPattern;\n","import ChangeDetails from '../core/change-details';\nimport IMask from '../core/holder';\nimport { type AppendFlags } from './base';\nimport MaskedPattern, { MaskedPatternState, type MaskedPatternOptions } from './pattern';\n\n\ntype MaskedRangePatternOptions = MaskedPatternOptions &\n  Pick<MaskedRange, 'from' | 'to'> &\n  Partial<Pick<MaskedRange, 'maxLength'>>;\n\nexport\ntype MaskedRangeOptions = Omit<MaskedRangePatternOptions, 'mask'>;\n\n\n/** Pattern which accepts ranges */\nexport default\nclass MaskedRange extends MaskedPattern {\n  /**\n    Optionally sets max length of pattern.\n    Used when pattern length is longer then `to` param length. Pads zeros at start in this case.\n  */\n  declare maxLength: number;\n  /** Min bound */\n  declare from: number;\n  /** Max bound */\n  declare to: number;\n\n  get _matchFrom (): number {\n    return this.maxLength - String(this.from).length;\n  }\n\n  constructor (opts?: MaskedRangeOptions) {\n    super(opts as MaskedPatternOptions); // mask will be created in _update\n  }\n\n  override updateOptions (opts: Partial<MaskedRangeOptions>) {\n    super.updateOptions(opts);\n  }\n\n  override _update (opts: Partial<MaskedRangeOptions>) {\n    const {\n      to=this.to || 0,\n      from=this.from || 0,\n      maxLength=this.maxLength || 0,\n      autofix=this.autofix,\n      ...patternOpts\n    }: Partial<MaskedRangePatternOptions> = opts;\n\n    this.to = to;\n    this.from = from;\n    this.maxLength = Math.max(String(to).length, maxLength);\n    this.autofix = autofix;\n\n    const fromStr = String(this.from).padStart(this.maxLength, '0');\n    const toStr = String(this.to).padStart(this.maxLength, '0');\n    let sameCharsCount = 0;\n    while (sameCharsCount < toStr.length && toStr[sameCharsCount] === fromStr[sameCharsCount]) ++sameCharsCount;\n    patternOpts.mask = toStr.slice(0, sameCharsCount).replace(/0/g, '\\\\0') + '0'.repeat(this.maxLength - sameCharsCount);\n\n    super._update(patternOpts);\n  }\n\n  override get isComplete (): boolean {\n    return super.isComplete && Boolean(this.value);\n  }\n\n  boundaries (str: string): [string, string] {\n    let minstr = '';\n    let maxstr = '';\n\n    const [, placeholder, num] = str.match(/^(\\D*)(\\d*)(\\D*)/) || [];\n    if (num) {\n      minstr = '0'.repeat(placeholder.length) + num;\n      maxstr = '9'.repeat(placeholder.length) + num;\n    }\n    minstr = minstr.padEnd(this.maxLength, '0');\n    maxstr = maxstr.padEnd(this.maxLength, '9');\n\n    return [minstr, maxstr];\n  }\n\n  override doPrepareChar (ch: string, flags: AppendFlags={}): [string, ChangeDetails] {\n    let details: ChangeDetails;\n    [ch, details] = super.doPrepareChar(ch.replace(/\\D/g, ''), flags);\n\n    if (!ch) details.skip = !this.isComplete;\n\n    return [ch, details];\n  }\n\n  override _appendCharRaw (ch: string, flags: AppendFlags<MaskedPatternState>={}): ChangeDetails {\n    if (!this.autofix || this.value.length + 1 > this.maxLength) return super._appendCharRaw(ch, flags);\n\n    const fromStr = String(this.from).padStart(this.maxLength, '0');\n    const toStr = String(this.to).padStart(this.maxLength, '0');\n\n    const [minstr, maxstr] = this.boundaries(this.value + ch);\n\n    if (Number(maxstr) < this.from) return super._appendCharRaw(fromStr[this.value.length], flags);\n\n    if (Number(minstr) > this.to) {\n      if (!flags.tail && this.autofix === 'pad' && this.value.length + 1 < this.maxLength) {\n        return super._appendCharRaw(fromStr[this.value.length], flags).aggregate(this._appendCharRaw(ch, flags));\n      }\n      return super._appendCharRaw(toStr[this.value.length], flags);\n    }\n\n    return super._appendCharRaw(ch, flags);\n  }\n\n  override doValidate (flags: AppendFlags): boolean {\n    const str = this.value;\n\n    const firstNonZero = str.search(/[^0]/);\n    if (firstNonZero === -1 && str.length <= this._matchFrom) return true;\n\n    const [minstr, maxstr] = this.boundaries(str);\n\n    return this.from <= Number(maxstr) && Number(minstr) <= this.to &&\n      super.doValidate(flags);\n  }\n\n  override pad (flags?: AppendFlags): ChangeDetails {\n    const details = new ChangeDetails();\n    if (this.value.length === this.maxLength) return details;\n\n    const value = this.value;\n    const padLength = this.maxLength - this.value.length;\n\n    if (padLength) {\n      this.reset();\n      for (let i=0; i < padLength; ++i) {\n        details.aggregate(super._appendCharRaw('0', flags as AppendFlags<MaskedPatternState>));\n      }\n\n      // append tail\n      value.split('').forEach(ch => this._appendCharRaw(ch));\n    }\n\n    return details;\n  }\n}\n\n\nIMask.MaskedRange = MaskedRange;\n","import MaskedPattern, { type MaskedPatternOptions } from './pattern';\nimport { type MaskedRangeOptions } from './range';\nimport MaskedRange from './range';\nimport IMask from '../core/holder';\nimport type Masked from './base';\nimport { type AppendFlags } from './base';\nimport { isString } from '../core/utils';\n\n\nexport\ntype DateMaskType = DateConstructor;\n\ntype DateOptionsKeys =\n  | 'pattern'\n  | 'min'\n  | 'max'\n  | 'autofix'\n;\n\nexport\ntype DateValue = Date | null;\n\nconst DefaultPattern = 'd{.}`m{.}`Y'\n\n// Make format and parse required when pattern is provided\ntype RequiredDateOptions = ({ pattern?: never |  typeof DefaultPattern; format?: MaskedDate[\"format\"]; parse?: MaskedDate[\"parse\"] } |\n  { pattern: MaskedDate[\"pattern\"]; format: MaskedDate[\"format\"]; parse: MaskedDate[\"parse\"] })\n\nexport\ntype MaskedDateOptions =\n  Omit<MaskedPatternOptions<DateValue>, 'mask'> &\n  Partial<Pick<MaskedDate, DateOptionsKeys>> &\n  { mask?: string | DateMaskType } &\n  RequiredDateOptions;\n\n/** Date mask */\nexport default\nclass MaskedDate extends MaskedPattern<DateValue> {\n  static GET_DEFAULT_BLOCKS: () => { [k: string]: MaskedRangeOptions } = () => ({\n    d: {\n      mask: MaskedRange,\n      from: 1,\n      to: 31,\n      maxLength: 2,\n    },\n    m: {\n      mask: MaskedRange,\n      from: 1,\n      to: 12,\n      maxLength: 2,\n    },\n    Y: {\n      mask: MaskedRange,\n      from: 1900,\n      to: 9999,\n    }\n  });\n  static DEFAULTS = {\n    ...MaskedPattern.DEFAULTS,\n    mask: Date,\n    pattern: DefaultPattern,\n    format: (date: DateValue, masked: Masked): string => {\n      if (!date) return '';\n\n      const day = String(date.getDate()).padStart(2, '0');\n      const month = String(date.getMonth() + 1).padStart(2, '0');\n      const year = date.getFullYear();\n\n      return [day, month, year].join('.');\n    },\n    parse: (str: string, masked: Masked): DateValue => {\n      const [day, month, year] = str.split('.').map(Number);\n      return new Date(year, month - 1, day);\n    },\n  } satisfies Partial<MaskedDateOptions>;\n\n  static extractPatternOptions (opts: Partial<MaskedDateOptions>): Partial<Omit<MaskedDateOptions, 'mask' | 'pattern'> & { mask: MaskedPatternOptions['mask'] }> {\n    const { mask, pattern, ...patternOpts } = opts;\n    return {\n      ...patternOpts,\n      mask: isString(mask) ? mask : pattern,\n    };\n  }\n\n  /** Pattern mask for date according to {@link MaskedDate#format} */\n  declare pattern: string;\n  /** Start date */\n  declare min?: Date;\n  /** End date */\n  declare max?: Date;\n  /** Format typed value to string */\n  declare format: (value: DateValue, masked: Masked) => string;\n  /** Parse string to get typed value */\n  declare parse: (str: string, masked: Masked) => DateValue;\n\n\n  constructor (opts?: MaskedDateOptions) {\n    super(MaskedDate.extractPatternOptions({\n      ...(MaskedDate.DEFAULTS as MaskedDateOptions),\n      ...opts,\n    }));\n  }\n\n  override updateOptions (opts: Partial<MaskedDateOptions> & RequiredDateOptions) {\n    super.updateOptions(opts as Partial<MaskedPatternOptions<DateValue>>);\n  }\n\n  override _update (opts: Partial<MaskedDateOptions>) {\n    const { mask, pattern, blocks, ...patternOpts } = {\n      ...MaskedDate.DEFAULTS,\n      ...opts,\n    };\n\n    const patternBlocks = Object.assign({}, MaskedDate.GET_DEFAULT_BLOCKS());\n    // adjust year block\n    if (opts.min) patternBlocks.Y.from = opts.min.getFullYear();\n    if (opts.max) patternBlocks.Y.to = opts.max.getFullYear();\n    if (opts.min && opts.max && patternBlocks.Y.from === patternBlocks.Y.to\n    ) {\n      patternBlocks.m.from = opts.min.getMonth() + 1;\n      patternBlocks.m.to = opts.max.getMonth() + 1;\n\n      if (patternBlocks.m.from === patternBlocks.m.to) {\n        patternBlocks.d.from = opts.min.getDate();\n        patternBlocks.d.to = opts.max.getDate();\n      }\n    }\n    Object.assign(patternBlocks, this.blocks, blocks);\n\n    super._update({\n      ...patternOpts,\n      mask: isString(mask) ? mask : pattern,\n      blocks: patternBlocks,\n    });\n  }\n\n  override doValidate (flags: AppendFlags): boolean {\n    const date = this.date;\n\n    return super.doValidate(flags) &&\n      (!this.isComplete ||\n        this.isDateExist(this.value) && date != null &&\n        (this.min == null || this.min <= date) &&\n        (this.max == null || date <= this.max));\n  }\n\n  /** Checks if date is exists */\n  isDateExist (str: string): boolean {\n    return this.format(this.parse(str, this), this).indexOf(str) >= 0;\n  }\n\n  /** Parsed Date */\n  get date (): DateValue {\n    return this.typedValue;\n  }\n  set date (date: DateValue) {\n    this.typedValue = date;\n  }\n\n  override get typedValue (): DateValue {\n    return this.isComplete ? super.typedValue : null;\n  }\n  override set typedValue (value: DateValue) {\n    super.typedValue = value;\n  }\n\n  override maskEquals (mask: any): boolean {\n    return mask === Date || super.maskEquals(mask);\n  }\n\n  override optionsIsChanged (opts: Partial<MaskedDateOptions>): boolean {\n    return super.optionsIsChanged(MaskedDate.extractPatternOptions(opts));\n  }\n}\n\n\nIMask.MaskedDate = MaskedDate;\n","import { objectIncludes } from '../core/utils';\nimport ChangeDetails from '../core/change-details';\nimport createMask, { type FactoryArg, type ExtendFactoryArgOptions, type NormalizedOpts, normalizeOpts } from './factory';\nimport Masked, { type AppendFlags, type MaskedState, type MaskedOptions, type ExtractFlags } from './base';\nimport { DIRECTION, type Direction } from '../core/utils';\nimport { type TailDetails } from '../core/tail-details';\nimport IMask from '../core/holder';\n\n\ntype MaskedDynamicNoRefState = MaskedState & {\n  compiledMasks: Array<MaskedState>\n};\n\ntype MaskedDynamicRefState = MaskedDynamicNoRefState & {\n  currentMaskRef: Masked,\n  currentMask: MaskedState,\n};\n\nexport\ntype MaskedDynamicState = MaskedDynamicNoRefState | MaskedDynamicRefState;\n\nexport\ntype DynamicMaskType = Array<ExtendFactoryArgOptions<{ expose?: boolean }>> | ArrayConstructor;\n\nexport\ntype MaskedDynamicOptions = MaskedOptions<MaskedDynamic, 'dispatch'>;\n\ntype HandleState = MaskedDynamicState | MaskedState;\n\n/** Dynamic mask for choosing appropriate mask in run-time */\nexport default\nclass MaskedDynamic<Value=any> extends Masked<Value> {\n  declare mask: DynamicMaskType;\n  /** Currently chosen mask */\n  declare currentMask?: Masked;\n  /** Currently chosen mask */\n  declare exposeMask?: Masked;\n  /** Compliled {@link Masked} options */\n  declare compiledMasks: Array<Masked>;\n  /** Chooses {@link Masked} depending on input value */\n  declare dispatch: (appended: string, masked: MaskedDynamic, flags: AppendFlags<HandleState>, tail: string | String | TailDetails) => (Masked | undefined);\n\n  declare _overwrite?: this['overwrite'];\n  declare _eager?: this['eager'];\n  declare _skipInvalid?: this['skipInvalid'];\n  declare _autofix?: this['autofix'];\n\n  static DEFAULTS: typeof Masked.DEFAULTS & Pick<MaskedDynamic, 'dispatch'> = {\n    ...Masked.DEFAULTS,\n    dispatch: (appended, masked, flags, tail) => {\n      if (!masked.compiledMasks.length) return;\n\n      const inputValue = masked.rawInputValue;\n\n      // simulate input\n      const inputs = masked.compiledMasks.map((m, index) => {\n        const isCurrent = masked.currentMask === m;\n        const startInputPos = isCurrent ? m.displayValue.length : m.nearestInputPos(m.displayValue.length, DIRECTION.FORCE_LEFT);\n\n        if (m.rawInputValue !== inputValue) {\n          m.reset();\n          m.append(inputValue, { raw: true });\n        } else if (!isCurrent) {\n          m.remove(startInputPos);\n        }\n        m.append(appended, masked.currentMaskFlags(flags));\n        m.appendTail(tail);\n\n        return {\n          index,\n          weight: m.rawInputValue.length,\n          totalInputPositions: m.totalInputPositions(\n            0,\n            Math.max(startInputPos, m.nearestInputPos(m.displayValue.length, DIRECTION.FORCE_LEFT)),\n          ),\n        };\n      });\n\n      // pop masks with longer values first\n      inputs.sort((i1, i2) => i2.weight - i1.weight || i2.totalInputPositions - i1.totalInputPositions);\n\n      return masked.compiledMasks[inputs[0].index];\n    }\n  };\n\n  constructor (opts?: MaskedDynamicOptions) {\n    super({\n      ...MaskedDynamic.DEFAULTS,\n      ...opts\n    });\n\n    this.currentMask = undefined;\n  }\n\n  override updateOptions (opts: Partial<MaskedDynamicOptions>) {\n    super.updateOptions(opts);\n  }\n\n  override _update (opts: Partial<MaskedDynamicOptions>) {\n    super._update(opts);\n\n    if ('mask' in opts) {\n      this.exposeMask = undefined;\n      // mask could be totally dynamic with only `dispatch` option\n      this.compiledMasks = Array.isArray(opts.mask) ?\n        opts.mask.map(m => {\n          const { expose, ...maskOpts } = normalizeOpts(m) as NormalizedOpts<FactoryArg> & { expose?: boolean };\n\n          const masked = createMask({\n            overwrite: this._overwrite,\n            eager: this._eager,\n            skipInvalid: this._skipInvalid,\n            ...maskOpts,\n          });\n\n          if (expose) this.exposeMask = masked;\n\n          return masked;\n        }) :\n        [];\n\n      // this.currentMask = this.doDispatch(''); // probably not needed but lets see\n    }\n  }\n\n  override _appendCharRaw (ch: string, flags: AppendFlags<HandleState>={}): ChangeDetails {\n    const details = this._applyDispatch(ch, flags);\n\n    if (this.currentMask) {\n      details.aggregate(this.currentMask._appendChar(ch, this.currentMaskFlags(flags)));\n    }\n\n    return details;\n  }\n\n  _applyDispatch (appended: string='', flags: AppendFlags<HandleState>={}, tail: string | String | TailDetails = ''): ChangeDetails {\n    const prevValueBeforeTail = flags.tail && flags._beforeTailState != null ?\n      flags._beforeTailState._value :\n      this.value;\n    const inputValue = this.rawInputValue;\n    const insertValue = flags.tail && flags._beforeTailState != null ?\n      flags._beforeTailState._rawInputValue :\n      inputValue;\n    const tailValue = inputValue.slice(insertValue.length);\n    const prevMask = this.currentMask;\n    const details = new ChangeDetails();\n\n    const prevMaskState = prevMask?.state;\n\n    // clone flags to prevent overwriting `_beforeTailState`\n    this.currentMask = this.doDispatch(appended, { ...flags }, tail);\n\n    // restore state after dispatch\n    if (this.currentMask) {\n      if (this.currentMask !== prevMask) {\n        // if mask changed reapply input\n        this.currentMask.reset();\n\n        if (insertValue) {\n          this.currentMask.append(insertValue, { raw: true });\n          details.tailShift = this.currentMask.value.length - prevValueBeforeTail.length;\n        }\n\n        if (tailValue) {\n          details.tailShift += this.currentMask.append(tailValue, { raw: true, tail: true }).tailShift;\n        }\n      } else if (prevMaskState) {\n        // Dispatch can do something bad with state, so\n        // restore prev mask state\n        this.currentMask.state = prevMaskState;\n      }\n    }\n\n    return details;\n  }\n\n  override _appendPlaceholder (): ChangeDetails {\n    const details = this._applyDispatch();\n\n    if (this.currentMask) {\n      details.aggregate(this.currentMask._appendPlaceholder());\n    }\n\n    return details;\n  }\n\n  override _appendEager (): ChangeDetails {\n    const details = this._applyDispatch();\n\n    if (this.currentMask) {\n      details.aggregate(this.currentMask._appendEager());\n    }\n\n    return details;\n  }\n\n  override appendTail (tail: string | String | TailDetails): ChangeDetails {\n    const details = new ChangeDetails();\n    if (tail) details.aggregate(this._applyDispatch('', {}, tail));\n\n    return details.aggregate(this.currentMask ?\n      this.currentMask.appendTail(tail) :\n      super.appendTail(tail));\n  }\n\n  currentMaskFlags (flags: AppendFlags<HandleState>): AppendFlags {\n    return {\n      ...flags,\n      _beforeTailState:\n        (flags._beforeTailState as MaskedDynamicRefState)?.currentMaskRef === this.currentMask &&\n        (flags._beforeTailState as MaskedDynamicRefState)?.currentMask ||\n        flags._beforeTailState,\n    };\n  }\n\n  doDispatch(appended: string, flags: AppendFlags<HandleState>={}, tail: string | String | TailDetails=''): Masked | undefined {\n    return this.dispatch(appended, this, flags, tail);\n  }\n\n  override doValidate (flags: AppendFlags<HandleState>): boolean {\n    return super.doValidate(flags) && (\n      !this.currentMask || this.currentMask.doValidate(this.currentMaskFlags(flags))\n    );\n  }\n\n  override doPrepare (str: string, flags: AppendFlags<HandleState>={}): [string, ChangeDetails] {\n    let [s, details] = super.doPrepare(str, flags);\n\n    if (this.currentMask) {\n      let currentDetails;\n      ([s, currentDetails] = super.doPrepare(s, this.currentMaskFlags(flags)));\n      details = details.aggregate(currentDetails);\n    }\n\n    return [s, details];\n  }\n\n  override doPrepareChar (str: string, flags: AppendFlags<HandleState>={}): [string, ChangeDetails] {\n    let [s, details] = super.doPrepareChar(str, flags);\n\n    if (this.currentMask) {\n      let currentDetails;\n      ([s, currentDetails] = super.doPrepareChar(s, this.currentMaskFlags(flags)));\n      details = details.aggregate(currentDetails);\n    }\n\n    return [s, details];\n  }\n\n  override reset () {\n    this.currentMask?.reset();\n    this.compiledMasks.forEach(m => m.reset());\n  }\n\n  override get value (): string {\n    return this.exposeMask ? this.exposeMask.value :\n      this.currentMask ? this.currentMask.value :\n      '';\n  }\n\n  override set value (value: string) {\n    if (this.exposeMask) {\n      this.exposeMask.value = value;\n      this.currentMask = this.exposeMask;\n      this._applyDispatch();\n    }\n    else super.value = value;\n  }\n\n  override get unmaskedValue (): string {\n    return this.exposeMask ? this.exposeMask.unmaskedValue :\n      this.currentMask ? this.currentMask.unmaskedValue :\n      '';\n  }\n\n  override set unmaskedValue (unmaskedValue: string) {\n    if (this.exposeMask) {\n      this.exposeMask.unmaskedValue = unmaskedValue;\n      this.currentMask = this.exposeMask;\n      this._applyDispatch();\n    }\n    else super.unmaskedValue = unmaskedValue;\n  }\n\n  override get typedValue (): Value {\n    return this.exposeMask ? this.exposeMask.typedValue :\n      this.currentMask ? this.currentMask.typedValue :\n      '';\n  }\n\n  override set typedValue (typedValue: Value) {\n    if (this.exposeMask) {\n      this.exposeMask.typedValue = typedValue;\n      this.currentMask = this.exposeMask;\n      this._applyDispatch();\n      return;\n    }\n\n    let unmaskedValue = String(typedValue);\n\n    // double check it\n    if (this.currentMask) {\n      this.currentMask.typedValue = typedValue;\n      unmaskedValue = this.currentMask.unmaskedValue;\n    }\n    this.unmaskedValue = unmaskedValue;\n  }\n\n  override get displayValue (): string {\n    return this.currentMask ? this.currentMask.displayValue : '';\n  }\n\n  override get isComplete (): boolean {\n    return Boolean(this.currentMask?.isComplete);\n  }\n\n  override get isFilled (): boolean {\n    return Boolean(this.currentMask?.isFilled);\n  }\n\n  override remove (fromPos?: number, toPos?: number): ChangeDetails {\n    const details: ChangeDetails = new ChangeDetails();\n\n    if (this.currentMask) {\n      details.aggregate(this.currentMask.remove(fromPos, toPos))\n        // update with dispatch\n        .aggregate(this._applyDispatch());\n    }\n\n    return details;\n  }\n\n  override get state (): MaskedDynamicState {\n    return {\n      ...super.state,\n      _rawInputValue: this.rawInputValue,\n      compiledMasks: this.compiledMasks.map(m => m.state),\n      currentMaskRef: this.currentMask,\n      currentMask: this.currentMask?.state,\n    };\n  }\n\n  override set state (state: HandleState) {\n    const { compiledMasks, currentMaskRef, currentMask, ...maskedState } = state as MaskedDynamicRefState;\n    if (compiledMasks) this.compiledMasks.forEach((m, mi) => m.state = compiledMasks[mi]);\n    if (currentMaskRef != null) {\n      this.currentMask = currentMaskRef;\n      this.currentMask.state = currentMask;\n    }\n    super.state = maskedState;\n  }\n\n  override extractInput (fromPos?: number, toPos?: number, flags?: ExtractFlags): string {\n    return this.currentMask ?\n      this.currentMask.extractInput(fromPos, toPos, flags) :\n      '';\n  }\n\n  override extractTail (fromPos?: number, toPos?: number): TailDetails {\n    return this.currentMask ?\n      this.currentMask.extractTail(fromPos, toPos) :\n      super.extractTail(fromPos, toPos);\n  }\n\n  override doCommit () {\n    if (this.currentMask) this.currentMask.doCommit();\n    super.doCommit();\n  }\n\n  override nearestInputPos(cursorPos: number, direction?: Direction): number {\n    return this.currentMask ?\n      this.currentMask.nearestInputPos(cursorPos, direction) :\n      super.nearestInputPos(cursorPos, direction);\n  }\n\n  override get overwrite (): boolean | 'shift' | undefined {\n    return this.currentMask ?\n      this.currentMask.overwrite :\n      this._overwrite;\n  }\n\n  override set overwrite (overwrite: boolean | 'shift' | undefined) {\n    this._overwrite = overwrite;\n  }\n\n  override get eager (): boolean | 'remove' | 'append' | undefined {\n    return this.currentMask ?\n      this.currentMask.eager :\n      this._eager;\n  }\n\n  override set eager (eager: boolean | 'remove' | 'append' | undefined) {\n    this._eager = eager;\n  }\n\n  override get skipInvalid (): boolean | undefined {\n    return this.currentMask ?\n      this.currentMask.skipInvalid :\n      this._skipInvalid;\n  }\n\n  override set skipInvalid (skipInvalid: boolean | undefined) {\n    this._skipInvalid = skipInvalid;\n  }\n\n  override get autofix (): boolean | 'pad' | undefined {\n    return this.currentMask ?\n      this.currentMask.autofix :\n      this._autofix;\n  }\n\n  override set autofix (autofix: boolean | 'pad' | undefined) {\n    this._autofix = autofix;\n  }\n\n  override maskEquals (mask: any): boolean {\n    return Array.isArray(mask) ?\n      this.compiledMasks.every((m, mi) => {\n        if (!mask[mi]) return;\n\n        const { mask: oldMask, ...restOpts } = mask[mi];\n        return objectIncludes(m, restOpts) && m.maskEquals(oldMask);\n      }) : super.maskEquals(mask);\n  }\n\n  override typedValueEquals (value: any): boolean {\n    return Boolean(this.currentMask?.typedValueEquals(value));\n  }\n}\n\n\nIMask.MaskedDynamic = MaskedDynamic;\n","import MaskedPattern, { MaskedPatternState, type MaskedPatternOptions } from './pattern';\nimport { AppendFlags } from './base';\nimport IMask from '../core/holder';\nimport ChangeDetails from '../core/change-details';\nimport { DIRECTION } from '../core/utils';\nimport { TailDetails } from '../core/tail-details';\nimport ContinuousTailDetails from '../core/continuous-tail-details';\n\n\nexport\ntype MaskedEnumOptions = Omit<MaskedPatternOptions, 'mask'> & Pick<MaskedEnum, 'enum'> & Partial<Pick<MaskedEnum, 'matchValue'>>;\n\nexport\ntype MaskedEnumPatternOptions = MaskedPatternOptions & Partial<Pick<MaskedEnum, 'enum' | 'matchValue'>>;\n\n\n/** Pattern which validates enum values */\nexport default\nclass MaskedEnum extends MaskedPattern {\n  declare enum: Array<string>;\n  /** Match enum value */\n  declare matchValue: (enumStr: string, inputStr: string, matchFrom: number) => boolean;\n\n  static DEFAULTS: typeof MaskedPattern.DEFAULTS & Pick<MaskedEnum, 'matchValue'> = {\n    ...MaskedPattern.DEFAULTS,\n    matchValue: (estr, istr, matchFrom) => estr.indexOf(istr, matchFrom) === matchFrom,\n  };\n\n  constructor (opts?: MaskedEnumOptions) {\n    super({\n      ...MaskedEnum.DEFAULTS,\n      ...opts,\n    } as MaskedPatternOptions); // mask will be created in _update\n  }\n\n  override updateOptions (opts: Partial<MaskedEnumOptions>) {\n    super.updateOptions(opts);\n  }\n\n  override _update (opts: Partial<MaskedEnumOptions>) {\n    const { enum: enum_, ...eopts }: MaskedEnumPatternOptions = opts;\n\n    if (enum_) {\n      const lengths = enum_.map(e => e.length);\n      const requiredLength = Math.min(...lengths);\n      const optionalLength = Math.max(...lengths) - requiredLength;\n\n      eopts.mask = '*'.repeat(requiredLength);\n      if (optionalLength) eopts.mask += '[' + '*'.repeat(optionalLength) + ']';\n\n      this.enum = enum_;\n    }\n\n    super._update(eopts);\n  }\n\n  override _appendCharRaw (ch: string, flags: AppendFlags<MaskedPatternState>={}): ChangeDetails {\n    const matchFrom = Math.min(this.nearestInputPos(0, DIRECTION.FORCE_RIGHT), this.value.length);\n\n    const matches = this.enum.filter(e => this.matchValue(e, this.unmaskedValue + ch, matchFrom));\n\n    if (matches.length) {\n      if (matches.length === 1) {\n        this._forEachBlocksInRange(0, this.value.length, (b, bi) => {\n          const mch = matches[0][bi];\n          if (bi >= this.value.length || mch === b.value) return;\n\n          b.reset();\n          b._appendChar(mch, flags);\n        });\n      }\n\n      const d = super._appendCharRaw(matches[0][this.value.length], flags);\n\n      if (matches.length === 1) {\n        matches[0].slice(this.unmaskedValue.length).split('').forEach(mch => d.aggregate(super._appendCharRaw(mch)));\n      }\n\n      return d;\n    }\n\n    return new ChangeDetails({ skip: !this.isComplete });\n  }\n\n  override extractTail (fromPos: number=0, toPos: number=this.displayValue.length): TailDetails {\n    // just drop tail\n    return new ContinuousTailDetails('', fromPos);\n  }\n\n  override remove (fromPos: number=0, toPos: number=this.displayValue.length): ChangeDetails {\n    if (fromPos === toPos) return new ChangeDetails();\n\n    const matchFrom = Math.min(super.nearestInputPos(0, DIRECTION.FORCE_RIGHT), this.value.length);\n\n    let pos: number;\n    for (pos = fromPos; pos >= 0; --pos) {\n      const matches = this.enum.filter(e => this.matchValue(e, this.value.slice(matchFrom, pos), matchFrom));\n      if (matches.length > 1) break;\n    }\n\n    const details = super.remove(pos, toPos);\n    details.tailShift += pos - fromPos;\n\n    return details;\n  }\n\n  override get isComplete (): boolean {\n    return this.enum.indexOf(this.value) >= 0;\n  }\n}\n\n\nIMask.MaskedEnum = MaskedEnum;\n","import Masked, { type MaskedOptions } from './base';\nimport IMask from '../core/holder';\n\n\nexport\ntype MaskedFunctionOptions = MaskedOptions<MaskedFunction>;\n\n/** Masking by custom Function */\nexport default\nclass MaskedFunction<Value=any> extends Masked<Value> {\n  /** */\n  declare mask: (value: string, masked: Masked) => boolean;\n  /** Enable characters overwriting */\n  declare overwrite?: boolean | 'shift' | undefined;\n  /** */\n  declare eager?: boolean | 'remove' | 'append' | undefined;\n  /** */\n  declare skipInvalid?: boolean | undefined;\n  /** */\n  declare autofix?: boolean | 'pad' | undefined;\n\n  override updateOptions (opts: Partial<MaskedFunctionOptions>) {\n    super.updateOptions(opts);\n  }\n\n  override _update (opts: Partial<MaskedFunctionOptions>) {\n    super._update({\n      ...opts,\n      validate: opts.mask,\n    });\n  }\n}\n\n\nIMask.MaskedFunction = MaskedFunction;\n","import { escapeRegExp, type Direction, DIRECTION } from '../core/utils';\nimport ChangeDetails from '../core/change-details';\nimport { type TailDetails } from '../core/tail-details';\n\nimport Masked, { type MaskedOptions, type ExtractFlags, type AppendFlags } from './base';\nimport IMask from '../core/holder';\n\n\nexport\ntype MaskedNumberOptions = MaskedOptions<MaskedNumber,\n  | 'radix'\n  | 'thousandsSeparator'\n  | 'mapToRadix'\n  | 'scale'\n  | 'min'\n  | 'max'\n  | 'normalizeZeros'\n  | 'padFractionalZeros'\n>;\n\n/** Number mask */\nexport default\nclass MaskedNumber extends Masked<number> {\n  static UNMASKED_RADIX = '.';\n  static EMPTY_VALUES: Array<null | undefined | string | number> = [...Masked.EMPTY_VALUES, 0];\n  static DEFAULTS = {\n    ...Masked.DEFAULTS,\n    mask: Number,\n    radix: ',',\n    thousandsSeparator: '',\n    mapToRadix: [MaskedNumber.UNMASKED_RADIX],\n    min: Number.MIN_SAFE_INTEGER,\n    max: Number.MAX_SAFE_INTEGER,\n    scale: 2,\n    normalizeZeros: true,\n    padFractionalZeros: false,\n    parse: Number,\n    format: (n: number) => n.toLocaleString('en-US', { useGrouping: false, maximumFractionDigits: 20 }),\n  };\n\n  declare mask: NumberConstructor;\n  /** Single char */\n  declare radix: string;\n  /** Single char */\n  declare thousandsSeparator: string;\n  /** Array of single chars */\n  declare mapToRadix: Array<string>;\n  /** */\n  declare min: number;\n  /** */\n  declare max: number;\n  /** Digits after point */\n  declare scale: number;\n  /** Flag to remove leading and trailing zeros in the end of editing */\n  declare normalizeZeros: boolean;\n  /** Flag to pad trailing zeros after point in the end of editing */\n  declare padFractionalZeros: boolean;\n  /** Enable characters overwriting */\n  declare overwrite?: boolean | 'shift' | undefined;\n  /** */\n  declare eager?: boolean | 'remove' | 'append' | undefined;\n  /** */\n  declare skipInvalid?: boolean | undefined;\n  /** */\n  declare autofix?: boolean | 'pad' | undefined;\n  /** Format typed value to string */\n  declare format: (value: number, masked: Masked) => string;\n  /** Parse string to get typed value */\n  declare parse: (str: string, masked: Masked) => number;\n\n  declare _numberRegExp: RegExp;\n  declare _thousandsSeparatorRegExp: RegExp;\n  declare _mapToRadixRegExp: RegExp;\n  declare _separatorsProcessed: boolean;\n\n  constructor (opts?: MaskedNumberOptions) {\n    super({\n      ...MaskedNumber.DEFAULTS,\n      ...opts,\n    });\n  }\n\n  override updateOptions (opts: Partial<MaskedNumberOptions>) {\n    super.updateOptions(opts);\n  }\n\n  override _update (opts: Partial<MaskedNumberOptions>) {\n    super._update(opts);\n    this._updateRegExps();\n  }\n\n  _updateRegExps () {\n    const start = '^' + (this.allowNegative ? '[+|\\\\-]?' : '');\n    const mid = '\\\\d*';\n    const end = (this.scale ?\n      `(${escapeRegExp(this.radix)}\\\\d{0,${this.scale}})?` :\n      '') + '$';\n\n    this._numberRegExp = new RegExp(start + mid + end);\n    this._mapToRadixRegExp = new RegExp(`[${this.mapToRadix.map(escapeRegExp).join('')}]`, 'g');\n    this._thousandsSeparatorRegExp = new RegExp(escapeRegExp(this.thousandsSeparator), 'g');\n  }\n\n  _removeThousandsSeparators (value: string): string {\n    return value.replace(this._thousandsSeparatorRegExp, '');\n  }\n\n  _insertThousandsSeparators (value: string): string {\n    // https://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript\n    const parts = value.split(this.radix);\n    parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, this.thousandsSeparator);\n    return parts.join(this.radix);\n  }\n\n  override doPrepareChar (ch: string, flags: AppendFlags={}): [string, ChangeDetails] {\n    const [prepCh, details] = super.doPrepareChar(this._removeThousandsSeparators(\n      this.scale && this.mapToRadix.length && (\n        /*\n          radix should be mapped when\n          1) input is done from keyboard = flags.input && flags.raw\n          2) unmasked value is set = !flags.input && !flags.raw\n          and should not be mapped when\n          1) value is set = flags.input && !flags.raw\n          2) raw value is set = !flags.input && flags.raw\n        */\n        flags.input && flags.raw ||\n        !flags.input && !flags.raw\n      ) ? ch.replace(this._mapToRadixRegExp, this.radix) : ch\n    ), flags);\n    if (ch && !prepCh) details.skip = true;\n\n    if (prepCh && !this.allowPositive && !this.value && prepCh !== '-') details.aggregate(this._appendChar('-'));\n\n    return [prepCh, details];\n  }\n\n  _separatorsCount (to: number, extendOnSeparators: boolean=false): number {\n    let count = 0;\n\n    for (let pos = 0; pos < to; ++pos) {\n      if (this._value.indexOf(this.thousandsSeparator, pos) === pos) {\n        ++count;\n        if (extendOnSeparators) to += this.thousandsSeparator.length;\n      }\n    }\n\n    return count;\n  }\n\n  _separatorsCountFromSlice (slice: string=this._value): number {\n    return this._separatorsCount(this._removeThousandsSeparators(slice).length, true);\n  }\n\n  override extractInput (fromPos: number=0, toPos: number=this.displayValue.length, flags?: ExtractFlags): string {\n    [fromPos, toPos] = this._adjustRangeWithSeparators(fromPos, toPos);\n\n    return this._removeThousandsSeparators(super.extractInput(fromPos, toPos, flags));\n  }\n\n  \n  override _appendCharRaw (ch: string, flags: AppendFlags={}): ChangeDetails {\n    const prevBeforeTailValue = flags.tail && flags._beforeTailState ?\n      flags._beforeTailState._value :\n      this._value;\n    const prevBeforeTailSeparatorsCount = this._separatorsCountFromSlice(prevBeforeTailValue);\n    this._value = this._removeThousandsSeparators(this.value);\n\n    const oldValue = this._value;\n\n    this._value += ch;\n\n    const num = this.number;\n    let accepted = !isNaN(num);\n    let skip = false;\n\n    if (accepted) {\n      let fixedNum;\n      if (this.min != null && this.min < 0 && this.number < this.min) fixedNum = this.min;\n      if (this.max != null && this.max > 0 && this.number > this.max) fixedNum = this.max;\n\n      if (fixedNum != null) {\n        if (this.autofix) {\n          this._value = this.format(fixedNum, this).replace(MaskedNumber.UNMASKED_RADIX, this.radix);\n          skip ||= oldValue === this._value && !flags.tail; // if not changed on tail it's still ok to proceed\n        } else {\n          accepted = false;\n        }\n      }\n      accepted &&= Boolean(this._value.match(this._numberRegExp));\n    }\n\n    let appendDetails;\n    if (!accepted) {\n      this._value = oldValue;\n      appendDetails = new ChangeDetails();\n    } else {\n      appendDetails = new ChangeDetails({\n        inserted: this._value.slice(oldValue.length),\n        rawInserted: skip ? '' : ch,\n        skip,\n      });\n    }\n\n    this._value = this._insertThousandsSeparators(this._value);\n    const beforeTailValue = flags.tail && flags._beforeTailState ?\n      flags._beforeTailState._value :\n      this._value;\n    const beforeTailSeparatorsCount = this._separatorsCountFromSlice(beforeTailValue);\n\n    appendDetails.tailShift += (beforeTailSeparatorsCount - prevBeforeTailSeparatorsCount) * this.thousandsSeparator.length;\n    return appendDetails;\n  }\n\n  _findSeparatorAround (pos: number): number {\n    if (this.thousandsSeparator) {\n      const searchFrom = pos - this.thousandsSeparator.length + 1;\n      const separatorPos = this.value.indexOf(this.thousandsSeparator, searchFrom);\n      if (separatorPos <= pos) return separatorPos;\n    }\n\n    return -1;\n  }\n\n  _adjustRangeWithSeparators (from: number, to: number): [number, number] {\n    const separatorAroundFromPos = this._findSeparatorAround(from);\n    if (separatorAroundFromPos >= 0) from = separatorAroundFromPos;\n\n    const separatorAroundToPos = this._findSeparatorAround(to);\n    if (separatorAroundToPos >= 0) to = separatorAroundToPos + this.thousandsSeparator.length;\n    return [from, to];\n  }\n\n  \n  override remove (fromPos: number=0, toPos: number=this.displayValue.length): ChangeDetails {\n    [fromPos, toPos] = this._adjustRangeWithSeparators(fromPos, toPos);\n\n    const valueBeforePos = this.value.slice(0, fromPos);\n    const valueAfterPos = this.value.slice(toPos);\n\n    const prevBeforeTailSeparatorsCount = this._separatorsCount(valueBeforePos.length);\n    this._value = this._insertThousandsSeparators(this._removeThousandsSeparators(valueBeforePos + valueAfterPos));\n    const beforeTailSeparatorsCount = this._separatorsCountFromSlice(valueBeforePos);\n\n    return new ChangeDetails({\n      tailShift: (beforeTailSeparatorsCount - prevBeforeTailSeparatorsCount) * this.thousandsSeparator.length,\n    });\n  }\n\n  override nearestInputPos (cursorPos: number, direction?: Direction): number {\n    if (!this.thousandsSeparator) return cursorPos;\n\n    switch (direction) {\n      case DIRECTION.NONE:\n      case DIRECTION.LEFT:\n      case DIRECTION.FORCE_LEFT: {\n        const separatorAtLeftPos = this._findSeparatorAround(cursorPos - 1);\n        if (separatorAtLeftPos >= 0) {\n          const separatorAtLeftEndPos = separatorAtLeftPos + this.thousandsSeparator.length;\n          if (cursorPos < separatorAtLeftEndPos ||\n            this.value.length <= separatorAtLeftEndPos ||\n            direction === DIRECTION.FORCE_LEFT\n          ) {\n            return separatorAtLeftPos;\n          }\n        }\n        break;\n      }\n      case DIRECTION.RIGHT:\n      case DIRECTION.FORCE_RIGHT: {\n        const separatorAtRightPos = this._findSeparatorAround(cursorPos);\n        if (separatorAtRightPos >= 0) {\n          return separatorAtRightPos + this.thousandsSeparator.length;\n        }\n      }\n    }\n\n    return cursorPos;\n  }\n\n  override doCommit () {\n    if (this.value) {\n      const number = this.number;\n      let validnum = number;\n\n      // check bounds\n      if (this.min != null) validnum = Math.max(validnum, this.min);\n      if (this.max != null) validnum = Math.min(validnum, this.max);\n\n      if (validnum !== number) this.unmaskedValue = this.format(validnum, this);\n\n      let formatted = this.value;\n\n      if (this.normalizeZeros) formatted = this._normalizeZeros(formatted);\n      if (this.padFractionalZeros && this.scale > 0) formatted = this._padFractionalZeros(formatted);\n\n      this._value = formatted;\n    }\n\n    super.doCommit();\n  }\n\n  _normalizeZeros (value: string): string {\n    const parts = this._removeThousandsSeparators(value).split(this.radix);\n\n    // remove leading zeros\n    parts[0] = parts[0].replace(/^(\\D*)(0*)(\\d*)/, (match, sign, zeros, num) => sign + num);\n    // add leading zero\n    if (value.length && !/\\d$/.test(parts[0])) parts[0] = parts[0] + '0';\n\n    if (parts.length > 1) {\n      parts[1] = parts[1].replace(/0*$/, '');  // remove trailing zeros\n      if (!parts[1].length) parts.length = 1;  // remove fractional\n    }\n\n    return this._insertThousandsSeparators(parts.join(this.radix));\n  }\n\n  _padFractionalZeros (value: string): string {\n    if (!value) return value;\n\n    const parts = value.split(this.radix);\n    if (parts.length < 2) parts.push('');\n    parts[1] = parts[1].padEnd(this.scale, '0');\n    return parts.join(this.radix);\n  }\n\n  override doSkipInvalid (ch: string, flags: AppendFlags={}, checkTail?: TailDetails): boolean {\n    const dropFractional = this.scale === 0 && ch !== this.thousandsSeparator && (\n      ch === this.radix ||\n      ch === MaskedNumber.UNMASKED_RADIX ||\n      this.mapToRadix.includes(ch)\n    )\n    return super.doSkipInvalid(ch, flags, checkTail) && !dropFractional;\n  }\n\n  override get unmaskedValue (): string {\n    return this._removeThousandsSeparators(this._normalizeZeros(this.value))\n      .replace(this.radix, MaskedNumber.UNMASKED_RADIX);\n  }\n\n  override set unmaskedValue (unmaskedValue: string) {\n    super.unmaskedValue = unmaskedValue;\n  }\n\n  override get typedValue (): number {\n    return this.parse(this.unmaskedValue, this);\n  }\n\n  override set typedValue (n: number) {\n    this.rawInputValue = this.format(n, this).replace(MaskedNumber.UNMASKED_RADIX, this.radix);\n  }\n\n  /** Parsed Number */\n  get number (): number {\n    return this.typedValue;\n  }\n\n  set number (number: number) {\n    this.typedValue = number;\n  }\n\n  get allowNegative (): boolean {\n    return (this.min != null && this.min < 0) || (this.max != null && this.max < 0);\n  }\n\n  get allowPositive (): boolean {\n    return (this.min != null && this.min > 0) || (this.max != null && this.max > 0);\n  }\n\n  override typedValueEquals (value: any): boolean {\n    // handle  0 -> '' case (typed = 0 even if value = '')\n    // for details see https://github.com/uNmAnNeR/imaskjs/issues/134\n    return (\n      super.typedValueEquals(value) ||\n      MaskedNumber.EMPTY_VALUES.includes(value) && MaskedNumber.EMPTY_VALUES.includes(this.typedValue)\n    ) && !(value === 0 && this.value === '');\n  }\n}\n\n\nIMask.MaskedNumber = MaskedNumber;\n","import createMask, { type FactoryArg, type FactoryReturnMasked } from './factory';\nimport IMask from '../core/holder';\n\n\n/** Mask pipe source and destination types */\nexport\nconst PIPE_TYPE = {\n  MASKED: 'value',\n  UNMASKED: 'unmaskedValue',\n  TYPED: 'typedValue',\n} as const;\n\ntype ValueOf<T> = T[keyof T];\n\ntype TypedValueOf<\n  Opts extends FactoryArg,\n  Type extends ValueOf<typeof PIPE_TYPE>\n> = Type extends (typeof PIPE_TYPE.MASKED | typeof PIPE_TYPE.UNMASKED) ?\n  string :\n  FactoryReturnMasked<Opts>['typedValue']\n;\n\n/** Creates new pipe function depending on mask type, source and destination options */\nexport\nfunction createPipe<\n  Arg extends FactoryArg,\n  From extends ValueOf<typeof PIPE_TYPE> = typeof PIPE_TYPE.MASKED,\n  To extends ValueOf<typeof PIPE_TYPE> = typeof PIPE_TYPE.MASKED,\n> (\n  arg: Arg,\n  from: From=PIPE_TYPE.MASKED as From,\n  to: To=PIPE_TYPE.MASKED as To,\n) {\n  const masked = createMask(arg);\n  return (value: TypedValueOf<Arg, From>) => masked.runIsolated(m => {\n    m[from] = value;\n    return m[to] as TypedValueOf<Arg, To>;\n  });\n}\n\n/** Pipes value through mask depending on mask type, source and destination options */\nexport\nfunction pipe<\n  Arg extends FactoryArg,\n  From extends ValueOf<typeof PIPE_TYPE> = typeof PIPE_TYPE.MASKED,\n  To extends ValueOf<typeof PIPE_TYPE> = typeof PIPE_TYPE.MASKED,\n> (\n  value: TypedValueOf<Arg, From>,\n  mask: Arg,\n  from?: From,\n  to?: To,\n) {\n  return createPipe(mask, from, to)(value);\n}\n\n\nIMask.PIPE_TYPE = PIPE_TYPE;\nIMask.createPipe = createPipe;\nIMask.pipe = pipe;\n","import ChangeDetails from '../core/change-details';\nimport IMask from '../core/holder';\nimport { type AppendFlags } from './base';\nimport createMask, { type FactoryArg, normalizeOpts, type ExtendFactoryArgOptions, type UpdateOpts } from './factory';\nimport MaskedPattern, { type BlockExtraOptions, type MaskedPatternOptions, type MaskedPatternState } from './pattern';\nimport type PatternBlock from './pattern/block';\n\n\nexport\ntype RepeatBlockExtraOptions = Pick<BlockExtraOptions, 'repeat'>;\n\nexport\ntype RepeatBlockOptions = ExtendFactoryArgOptions<RepeatBlockExtraOptions>;\n\n\n/** Pattern mask */\nexport default\nclass RepeatBlock<M extends FactoryArg> extends MaskedPattern {\n  declare _blockOpts: M & { repeat?: number };\n  declare repeat: Required<RepeatBlockExtraOptions>['repeat'];\n\n\n  get repeatFrom (): number {\n    return (\n      Array.isArray(this.repeat) ? this.repeat[0] :\n      this.repeat === Infinity ? 0 : this.repeat\n    ) ?? 0;\n  }\n\n  get repeatTo (): number {\n    return (Array.isArray(this.repeat) ? this.repeat[1] : this.repeat) ?? Infinity;\n  }\n\n  constructor (opts: RepeatBlockOptions) {\n    super(opts as MaskedPatternOptions);\n  }\n\n  override updateOptions (opts: UpdateOpts<RepeatBlockOptions>) {\n    super.updateOptions(opts as MaskedPatternOptions);\n  }\n\n  override _update (opts: UpdateOpts<M> & RepeatBlockExtraOptions) {\n    const { repeat, ...blockOpts } = normalizeOpts(opts) as any; // TODO type\n    this._blockOpts = Object.assign({}, this._blockOpts, blockOpts);\n    const block = createMask(this._blockOpts);\n    this.repeat = repeat ?? (block as any).repeat ?? this.repeat ?? Infinity; // TODO type\n\n    super._update({\n      mask: 'm'.repeat(Math.max(this.repeatTo === Infinity && this._blocks?.length || 0, this.repeatFrom)),\n      blocks: { m: block },\n      eager: block.eager,\n      overwrite: block.overwrite,\n      skipInvalid: block.skipInvalid,\n      lazy: (block as MaskedPattern).lazy,\n      placeholderChar: (block as MaskedPattern).placeholderChar,\n      displayChar: (block as MaskedPattern).displayChar,\n    });\n  }\n\n  _allocateBlock (bi: number): PatternBlock | undefined {\n    if (bi < this._blocks.length) return this._blocks[bi];\n    if (this.repeatTo === Infinity || this._blocks.length < this.repeatTo) {\n      this._blocks.push(createMask(this._blockOpts));\n      this.mask += 'm';\n      return this._blocks[this._blocks.length - 1];\n    }\n  }\n\n  override _appendCharRaw (ch: string, flags: AppendFlags<MaskedPatternState>={}): ChangeDetails {\n    const details = new ChangeDetails();\n\n    for (\n      let bi=this._mapPosToBlock(this.displayValue.length)?.index ?? Math.max(this._blocks.length - 1, 0), block, allocated;\n      // try to get a block or\n      // try to allocate a new block if not allocated already\n      (block = this._blocks[bi] ?? (allocated = !allocated && this._allocateBlock(bi)));\n      ++bi\n    ) {\n      const blockDetails = block._appendChar(ch, { ...flags, _beforeTailState: flags._beforeTailState?._blocks?.[bi] });\n\n      if (blockDetails.skip && allocated) {\n        // remove the last allocated block and break\n        this._blocks.pop();\n        this.mask = this.mask.slice(1);\n        break;\n      }\n\n      details.aggregate(blockDetails);\n\n      if (blockDetails.consumed) break; // go next char\n    }\n\n    return details;\n  }\n\n  _trimEmptyTail (fromPos: number=0, toPos?: number): void {\n    const firstBlockIndex = Math.max(this._mapPosToBlock(fromPos)?.index || 0, this.repeatFrom, 0);\n    let lastBlockIndex;\n    if (toPos != null) lastBlockIndex = this._mapPosToBlock(toPos)?.index;\n    if (lastBlockIndex == null) lastBlockIndex = this._blocks.length - 1;\n\n    let removeCount = 0;\n    for (let blockIndex = lastBlockIndex; firstBlockIndex <= blockIndex; --blockIndex, ++removeCount) {\n      if (this._blocks[blockIndex].unmaskedValue) break;\n    }\n\n    if (removeCount) {\n      this._blocks.splice(lastBlockIndex - removeCount + 1, removeCount);\n      this.mask = this.mask.slice(removeCount);\n    }\n  }\n\n  override reset () {\n    super.reset();\n    this._trimEmptyTail();\n  }\n\n  override remove (fromPos: number=0, toPos: number=this.displayValue.length): ChangeDetails {\n    const removeDetails = super.remove(fromPos, toPos);\n    this._trimEmptyTail(fromPos, toPos);\n    return removeDetails;\n  }\n\n  override totalInputPositions (fromPos: number=0, toPos?: number): number {\n    if (toPos == null && this.repeatTo === Infinity) return Infinity;\n    return super.totalInputPositions(fromPos, toPos);\n  }\n\n  override get state (): MaskedPatternState {\n    return super.state;\n  }\n\n  override set state (state: MaskedPatternState) {\n    this._blocks.length = state._blocks.length;\n    this.mask = this.mask.slice(0, this._blocks.length);\n    super.state = state;\n  }\n}\n\n\nIMask.RepeatBlock = RepeatBlock;\n","import IMask from './imask';\nexport { default as HTMLContenteditableMaskElement } from './controls/html-contenteditable-mask-element';\nexport { default as HTMLInputMaskElement, type InputElement } from './controls/html-input-mask-element';\nexport { default as HTMLMaskElement } from './controls/html-mask-element';\nexport { default as InputMask, type InputMaskElement } from './controls/input';\nexport { default as MaskElement } from './controls/mask-element';\nexport { default as ChangeDetails, type ChangeDetailsOptions } from './core/change-details';\nexport { type AppendTail, type TailDetails } from './core/tail-details';\nexport { DIRECTION, forceDirection, type Direction, type Selection } from './core/utils';\nexport { default as Masked, type AppendFlags, type ExtractFlags, type MaskedOptions, type MaskedState } from './masked/base';\nexport { default as MaskedDate, type DateMaskType, type MaskedDateOptions } from './masked/date';\nexport { default as MaskedDynamic, type DynamicMaskType, type MaskedDynamicOptions, type MaskedDynamicState } from './masked/dynamic';\nexport { default as MaskedEnum, type MaskedEnumOptions } from './masked/enum';\nexport {\n  default as createMask,\n  normalizeOpts,\n  type AllFactoryStaticOpts,\n  type FactoryArg,\n  type FactoryConstructorOpts,\n  type FactoryConstructorReturnMasked,\n  type FactoryInstanceOpts,\n  type FactoryInstanceReturnMasked,\n  type FactoryOpts,\n  type FactoryReturnMasked,\n  type FactoryStaticOpts,\n  type FactoryStaticReturnMasked,\n  type NormalizedOpts,\n  type UpdateOpts,\n} from './masked/factory';\nexport { default as MaskedFunction, type MaskedFunctionOptions } from './masked/function';\nexport { default as MaskedNumber, type MaskedNumberOptions } from './masked/number';\nexport { default as MaskedPattern, type BlockPosData, type Definitions, type MaskedPatternOptions, type MaskedPatternState } from './masked/pattern';\nexport { type default as PatternBlock } from './masked/pattern/block';\nexport { default as ChunksTailDetails, type ChunksTailState } from './masked/pattern/chunk-tail-details';\nexport { default as PatternFixedDefinition, type PatternFixedDefinitionOptions } from './masked/pattern/fixed-definition';\nexport { default as PatternInputDefinition, type PatternInputDefinitionOptions, type PatternInputDefinitionState } from './masked/pattern/input-definition';\nexport { createPipe, pipe, PIPE_TYPE } from './masked/pipe';\nexport { default as MaskedRange, type MaskedRangeOptions } from './masked/range';\nexport { default as MaskedRegExp, type MaskedRegExpOptions } from './masked/regexp';\nexport { default as RepeatBlock, type RepeatBlockOptions } from './masked/repeat';\n\ntry { (globalThis as any).IMask = IMask; } catch {}\nexport default IMask;\n"],"names":["isString","str","String","isObject","obj","_obj$constructor","constructor","name","pick","keys","Array","isArray","_","k","includes","Object","entries","reduce","acc","_ref","v","DIRECTION","NONE","LEFT","FORCE_LEFT","RIGHT","FORCE_RIGHT","forceDirection","direction","escapeRegExp","replace","objectIncludes","b","a","arrA","arrB","i","length","dateA","Date","dateB","getTime","regexpA","RegExp","regexpB","toString","prototype","hasOwnProperty","call","ActionDetails","opts","assign","this","value","slice","startChangePos","oldValue","oldSelection","start","insertedCount","cursorPos","end","Math","min","inserted","substr","removedCount","max","removed","head","substring","tail","removeDirection","IMask","el","InputMask","maskedClass","mask","Error","MaskedRegExp","MaskedPattern","MaskedDate","Number","MaskedNumber","MaskedDynamic","Masked","Function","MaskedFunction","console","warn","normalizeOpts","instanceOpts","_mask","startsWith","createMask","nOpts","MaskedClass","MaskElement","selectionStart","_unsafeSelectionStart","selectionEnd","_unsafeSelectionEnd","select","_unsafeSelect","isActive","HTMLMaskElement","input","super","_onKeydown","bind","_onInput","_onBeforeinput","_onCompositionEnd","rootElement","_this$input$getRootNo","_this$input$getRootNo2","_this$input","getRootNode","document","activeElement","bindEvents","handlers","addEventListener","drop","click","focus","commit","_handlers","e","redo","keyCode","shiftKey","metaKey","ctrlKey","preventDefault","undo","isComposing","selectionChange","inputType","unbindEvents","removeEventListener","HTMLInputMaskElement","setSelectionRange","HTMLContenteditableMaskElement","root","selection","getSelection","anchorOffset","focusOffset","createRange","range","setStart","firstChild","setEnd","lastChild","removeAllRanges","addRange","textContent","InputHistory","states","currentIndex","currentState","isEmpty","push","state","MAX_LENGTH","shift","go","steps","clear","isContentEditable","tagName","masked","_listeners","_value","_unmaskedValue","_rawInputValue","history","_saveSelection","_onChange","_onDrop","_onFocus","_onClick","_onUndo","_onRedo","alignCursor","alignCursorFriendly","_bindEvents","updateValue","maskEquals","_this$masked","updateOptions","unmaskedValue","updateControl","rawInputValue","typedValue","val","typedValueEquals","displayValue","_unbindEvents","_fireEvent","ev","listeners","forEach","l","_cursorChanging","_changingCursorPos","pos","_selection","newUnmaskedValue","newValue","newRawInputValue","newDisplayValue","isChanged","_fireChangeEvents","_historyChanging","restOpts","updateMask","updateOpts","optionsIsChanged","updateCursor","_delayUpdateCursor","_abortUpdateCursor","setTimeout","_inputEvent","isComplete","clearTimeout","nearestInputPos","on","handler","off","hIndex","indexOf","splice","details","oldRawValue","offset","raw","doCommit","stopPropagation","_applyHistoryState","destroy","ChangeDetails","normalize","prep","rawInserted","tailShift","skip","aggregate","consumed","Boolean","equals","ContinuousTailDetails","from","stop","extend","appendTo","append","_appendPlaceholder","unshift","beforePos","shiftChar","_update","DEFAULTS","_initialized","withValueRefresh","reset","resolve","flags","parse","format","extractInput","isFilled","totalInputPositions","fromPos","toPos","extractTail","appendTail","_appendCharRaw","ch","_appendChar","checkTail","consistentState","doPrepareChar","autofix","noFixState","fixDetails","pad","chDetails","consistentTail","appended","doValidate","beforeTailState","overwrite","tailDetails","_appendEager","_beforeTailState","doPrepare","ci","d","doSkipInvalid","eager","remove","fn","_refreshing","rawInput","ret","runIsolated","_isolated","skipInvalid","prepare","prepareChar","validate","parent","deleteCount","tailPos","eagerRemove","valLength","tval","EMPTY_VALUES","undefined","ChunksTailDetails","chunks","map","join","tailChunk","lastChunk","extendLast","firstTailChunk","blockIndex","chunk","lastBlockIter","_mapPosToBlock","chunkBlock","index","_stops","_blocks","remainChars","c","props","cstate","chunkShiftPos","PatternCursor","_log","ok","block","_blockStartPos","s","pushState","popState","pop","bindBlock","_pushLeft","_this$block","_pushRight","pushLeftBeforeFilled","isFixed","pushLeftBeforeInput","pushLeftBeforeRequired","isOptional","pushRightBeforeFilled","pushRightBeforeInput","pushRightBeforeRequired","PatternFixedDefinition","isUnmasking","_isRawInput","maxPos","appendEager","isResolved","char","PatternInputDefinition","placeholderChar","displayChar","lazy","maskOpts","currentMaskFlags","boundPos","_flags$_beforeTailSta","DEFAULT_DEFINITIONS","search","definitions","_rebuildMask","defs","exposeBlock","_maskedBlocks","pattern","unmaskingBlock","optionalBlock","blocks","p","bNames","filter","bName","sort","expose","repeat","bOpts","blockOpts","maskedBlock","RepeatBlock","isInput","STOP_CHAR","ESCAPE_CHAR","def","maskedState","bi","every","_this$_mapPosToBlock","startBlockIndex","blockIter","blockDetails","chunkTail","_forEachBlocksInRange","bFromPos","bToPos","blockChunk","_findStopBefore","stopBefore","si","toBlockIndex","startBlockIter","endBlockIndex","_blocks2","accVal","blockStartPos","fromBlockIter","toBlockIter","isSameBlock","fromBlockStartPos","fromBlockEndPos","removeDetails","cursor","total","maskedBlocks","indices","gi","InputDefinition","FixedDefinition","MaskedRange","_matchFrom","maxLength","to","patternOpts","fromStr","padStart","toStr","sameCharsCount","boundaries","minstr","maxstr","placeholder","num","match","padEnd","padLength","split","extractPatternOptions","patternBlocks","GET_DEFAULT_BLOCKS","Y","getFullYear","m","getMonth","getDate","date","isDateExist","day","month","year","currentMask","exposeMask","compiledMasks","_overwrite","_eager","_skipInvalid","_applyDispatch","prevValueBeforeTail","inputValue","insertValue","tailValue","prevMask","prevMaskState","doDispatch","_flags$_beforeTailSta2","currentMaskRef","dispatch","currentDetails","_this$currentMask","_this$currentMask2","_this$currentMask3","_this$currentMask4","mi","_autofix","oldMask","_this$currentMask5","inputs","isCurrent","startInputPos","weight","i1","i2","MaskedEnum","enum","enum_","eopts","lengths","requiredLength","optionalLength","matchFrom","matches","matchValue","mch","estr","istr","_updateRegExps","allowNegative","scale","radix","_numberRegExp","_mapToRadixRegExp","mapToRadix","_thousandsSeparatorRegExp","thousandsSeparator","_removeThousandsSeparators","_insertThousandsSeparators","parts","prepCh","allowPositive","_separatorsCount","extendOnSeparators","count","_separatorsCountFromSlice","_adjustRangeWithSeparators","prevBeforeTailValue","prevBeforeTailSeparatorsCount","number","appendDetails","accepted","isNaN","fixedNum","UNMASKED_RADIX","beforeTailValue","beforeTailSeparatorsCount","_findSeparatorAround","searchFrom","separatorPos","separatorAroundFromPos","separatorAroundToPos","valueBeforePos","valueAfterPos","separatorAtLeftPos","separatorAtLeftEndPos","separatorAtRightPos","validnum","formatted","normalizeZeros","_normalizeZeros","padFractionalZeros","_padFractionalZeros","sign","zeros","test","dropFractional","n","_MaskedNumber","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","toLocaleString","useGrouping","maximumFractionDigits","PIPE_TYPE","MASKED","UNMASKED","TYPED","createPipe","arg","pipe","repeatFrom","Infinity","repeatTo","_ref2","_ref3","_ref4","_this$_blocks","_blockOpts","_allocateBlock","allocated","_this$_mapPosToBlock$","_this$_blocks$bi","_trimEmptyTail","_this$_mapPosToBlock2","_this$_mapPosToBlock3","firstBlockIndex","lastBlockIndex","removeCount","globalThis"],"mappings":"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"}