HEX
Server: nginx/1.18.0
System: Linux test-ipsremont 5.4.0-214-generic #234-Ubuntu SMP Fri Mar 14 23:50:27 UTC 2025 x86_64
User: ips (1000)
PHP: 8.0.30
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/elite/node_modules/imask/dist/imask.es.js.map
{"version":3,"file":"imask.es.js","sources":["../src/core/utils.js","../src/core/action-details.js","../src/core/change-details.js","../src/core/continuous-tail-details.js","../src/masked/base.js","../src/masked/factory.js","../src/masked/pattern/input-definition.js","../src/masked/pattern/fixed-definition.js","../src/masked/pattern/chunk-tail-details.js","../src/masked/pattern.js","../src/masked/range.js","../src/masked/date.js","../src/controls/mask-element.js","../src/controls/html-mask-element.js","../src/controls/input.js","../src/masked/enum.js","../src/masked/number.js","../src/masked/regexp.js","../src/masked/function.js","../src/masked/dynamic.js","../src/imask.js"],"sourcesContent":["// @flow\r\n\r\n\r\n/** Checks if value is string */\r\nexport\r\nfunction isString (str: mixed): boolean %checks {\r\n  return typeof str === 'string' || str instanceof String;\r\n}\r\n\r\n/**\r\n  Direction\r\n  @prop {string} NONE\r\n  @prop {string} LEFT\r\n  @prop {string} FORCE_LEFT\r\n  @prop {string} RIGHT\r\n  @prop {string} FORCE_RIGHT\r\n*/\r\nexport\r\nconst DIRECTION = {\r\n  NONE: 'NONE',\r\n  LEFT: 'LEFT',\r\n  FORCE_LEFT: 'FORCE_LEFT',\r\n  RIGHT: 'RIGHT',\r\n  FORCE_RIGHT: 'FORCE_RIGHT',\r\n}\r\n/**\r\n  Direction\r\n  @enum {string}\r\n*/\r\nexport\r\ntype Direction = $Values<typeof DIRECTION>;\r\n\r\n/** Returns next char index in direction */\r\nexport\r\nfunction indexInDirection (pos: number, direction: Direction): number {\r\n  if (direction === DIRECTION.LEFT) --pos;\r\n  return pos;\r\n}\r\n\r\n/** Returns next char position in direction */\r\nexport\r\nfunction posInDirection (pos: number, direction: Direction): number {\r\n  switch (direction) {\r\n    case DIRECTION.LEFT:\r\n    case DIRECTION.FORCE_LEFT:\r\n      return --pos;\r\n    case DIRECTION.RIGHT:\r\n    case DIRECTION.FORCE_RIGHT:\r\n      return ++pos;\r\n    default:\r\n      return pos;\r\n  }\r\n}\r\n\r\n/** */\r\nexport\r\nfunction forceDirection (direction: Direction): Direction {\r\n  switch (direction) {\r\n    case DIRECTION.LEFT:\r\n      return DIRECTION.FORCE_LEFT;\r\n    case DIRECTION.RIGHT:\r\n      return DIRECTION.FORCE_RIGHT;\r\n    default:\r\n      return direction;\r\n  }\r\n}\r\n\r\n/** Escapes regular expression control chars */\r\nexport\r\nfunction escapeRegExp (str: string): string {\r\n  return str.replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1');\r\n}\r\n\r\n\r\n// cloned from https://github.com/epoberezkin/fast-deep-equal with small changes\r\nexport\r\nfunction objectIncludes (b: any, a: any): boolean {\r\n  if (a === b) return true;\r\n\r\n  var arrA = Array.isArray(a)\r\n    , arrB = Array.isArray(b)\r\n    , i;\r\n\r\n  if (arrA && arrB) {\r\n    if (a.length != b.length) return false;\r\n    for (i = 0; i < a.length; i++)\r\n      if (!objectIncludes(a[i], b[i])) return false;\r\n    return true;\r\n  }\r\n\r\n  if (arrA != arrB) return false;\r\n\r\n  if (a && b && typeof a === 'object' && typeof b === 'object') {\r\n    var dateA = a instanceof Date\r\n      , dateB = b instanceof Date;\r\n    if (dateA && dateB) return a.getTime() == b.getTime();\r\n    if (dateA != dateB) return false;\r\n\r\n    var regexpA = a instanceof RegExp\r\n      , regexpB = b instanceof RegExp;\r\n    if (regexpA && regexpB) return a.toString() == b.toString();\r\n    if (regexpA != regexpB) return false;\r\n\r\n    var keys = Object.keys(a);\r\n    // if (keys.length !== Object.keys(b).length) return false;\r\n\r\n    for (i = 0; i < keys.length; i++)\r\n      if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\r\n\r\n    for (i = 0; i < keys.length; i++)\r\n      if(!objectIncludes(b[keys[i]], a[keys[i]])) return false;\r\n\r\n    return true;\r\n  } else if (a && b && typeof a === 'function' && typeof b === 'function') {\r\n      return a.toString() === b.toString()\r\n  }\r\n\r\n  return false;\r\n}\r\n\r\n/* eslint-disable no-undef */\r\nexport\r\nconst g: any = typeof window !== 'undefined' && window ||\r\n  typeof global !== 'undefined' && global.global === global && global ||\r\n  typeof self !== 'undefined' && self.self === self && self ||\r\n  {};\r\n/* eslint-enable no-undef */\r\n\r\n/** Selection range */\r\nexport\r\ntype Selection = {\r\n  start: number;\r\n  end: number;\r\n};\r\n","// @flow\r\nimport {type Direction, type Selection, DIRECTION} from './utils.js';\r\n\r\n\r\n/** Provides details of changing input */\r\nexport default\r\nclass ActionDetails {\r\n  /** Current input value */\r\n  value: string;\r\n  /** Current cursor position */\r\n  cursorPos: number;\r\n  /** Old input value */\r\n  oldValue: string;\r\n  /** Old selection */\r\n  oldSelection: Selection;\r\n\r\n  constructor (\r\n    value: string,\r\n    cursorPos: number,\r\n    oldValue: string,\r\n    oldSelection: Selection\r\n  ) {\r\n    this.value = value;\r\n    this.cursorPos = cursorPos;\r\n    this.oldValue = oldValue;\r\n    this.oldSelection = oldSelection;\r\n\r\n    // double check if left part was changed (autofilling, other non-standard input triggers)\r\n    while (this.value.slice(0, this.startChangePos) !== this.oldValue.slice(0, this.startChangePos)) {\r\n      --this.oldSelection.start;\r\n    }\r\n  }\r\n\r\n  /**\r\n    Start changing position\r\n    @readonly\r\n  */\r\n  get startChangePos (): number {\r\n    return Math.min(this.cursorPos, this.oldSelection.start);\r\n  }\r\n\r\n  /**\r\n    Inserted symbols count\r\n    @readonly\r\n  */\r\n  get insertedCount (): number {\r\n    return this.cursorPos - this.startChangePos;\r\n  }\r\n\r\n  /**\r\n    Inserted symbols\r\n    @readonly\r\n  */\r\n  get inserted (): string {\r\n    return this.value.substr(this.startChangePos, this.insertedCount);\r\n  }\r\n\r\n  /**\r\n    Removed symbols count\r\n    @readonly\r\n  */\r\n  get removedCount (): number {\r\n    // Math.max for opposite operation\r\n    return Math.max((this.oldSelection.end - this.startChangePos) ||\r\n      // for Delete\r\n      this.oldValue.length - this.value.length, 0);\r\n  }\r\n\r\n  /**\r\n    Removed symbols\r\n    @readonly\r\n  */\r\n  get removed (): string {\r\n    return this.oldValue.substr(this.startChangePos, this.removedCount);\r\n  }\r\n\r\n  /**\r\n    Unchanged head symbols\r\n    @readonly\r\n  */\r\n  get head (): string {\r\n    return this.value.substring(0, this.startChangePos);\r\n  }\r\n\r\n  /**\r\n    Unchanged tail symbols\r\n    @readonly\r\n  */\r\n  get tail (): string {\r\n    return this.value.substring(this.startChangePos + this.insertedCount);\r\n  }\r\n\r\n  /**\r\n    Remove direction\r\n    @readonly\r\n  */\r\n  get removeDirection (): Direction {\r\n    if (!this.removedCount || this.insertedCount) return DIRECTION.NONE;\r\n\r\n    // align right if delete at right or if range removed (event with backspace)\r\n    return (this.oldSelection.end === this.cursorPos || this.oldSelection.start === this.cursorPos) ?\r\n      DIRECTION.RIGHT :\r\n      DIRECTION.LEFT;\r\n  }\r\n}\r\n","// @flow\r\n\r\n\r\n/**\r\n  Provides details of changing model value\r\n  @param {Object} [details]\r\n  @param {string} [details.inserted] - Inserted symbols\r\n  @param {boolean} [details.skip] - Can skip chars\r\n  @param {number} [details.removeCount] - Removed symbols count\r\n  @param {number} [details.tailShift] - Additional offset if any changes occurred before tail\r\n*/\r\nexport default\r\nclass ChangeDetails {\r\n  /** Inserted symbols */\r\n  inserted: string;\r\n  /** Can skip chars */\r\n  skip: boolean;\r\n  /** Additional offset if any changes occurred before tail */\r\n  tailShift: number;\r\n  /** Raw inserted is used by dynamic mask */\r\n  rawInserted: string;\r\n\r\n  constructor (details?: {\r\n    inserted?: $PropertyType<ChangeDetails, 'inserted'>,\r\n    rawInserted?: $PropertyType<ChangeDetails, 'rawInserted'>,\r\n    skip?: $PropertyType<ChangeDetails, 'skip'>,\r\n    tailShift?: $PropertyType<ChangeDetails, 'tailShift'>,\r\n  }) {\r\n    Object.assign(this, {\r\n      inserted: '',\r\n      rawInserted: '',\r\n      skip: false,\r\n      tailShift: 0,\r\n    }, details);\r\n  }\r\n\r\n  /**\r\n    Aggregate changes\r\n    @returns {ChangeDetails} `this`\r\n  */\r\n  aggregate (details: ChangeDetails): ChangeDetails {\r\n    this.rawInserted += details.rawInserted;\r\n    this.skip = this.skip || details.skip;\r\n    this.inserted += details.inserted;\r\n    this.tailShift += details.tailShift;\r\n    return this;\r\n  }\r\n\r\n  /** Total offset considering all changes */\r\n  get offset (): number {\r\n    return this.tailShift + this.inserted.length;\r\n  }\r\n}\r\n","// @flow\r\nimport type { TailDetails, AppendTail } from './tail-details.js';\r\nimport type ChangeDetails from './change-details.js';\r\n\r\n\r\ntype ContinuousTailState = {\r\n  value: $PropertyType<ContinuousTailDetails, 'value'>,\r\n  from: $PropertyType<ContinuousTailDetails, 'from'>,\r\n  stop?: $PropertyType<ContinuousTailDetails, 'stop'>,\r\n};\r\n\r\n/** Provides details of continuous extracted tail */\r\nexport default\r\nclass ContinuousTailDetails implements TailDetails {\r\n  /** Tail value as string */\r\n  value: string;\r\n  /** Tail start position */\r\n  from: number;\r\n  /** Start position */\r\n  stop: ?number;\r\n\r\n  constructor (value?: string='', from?: number=0, stop?: number) {\r\n    this.value = value;\r\n    this.from = from;\r\n    this.stop = stop;\r\n  }\r\n\r\n  toString (): string { return this.value; }\r\n\r\n  extend (tail: string | TailDetails): void {\r\n    this.value += String(tail);\r\n  }\r\n\r\n  appendTo (masked: AppendTail): ChangeDetails {\r\n    return masked.append(this.toString(), { tail: true })\r\n      .aggregate(masked._appendPlaceholder());\r\n  }\r\n\r\n  get state (): ContinuousTailState {\r\n    return {\r\n      value: this.value,\r\n      from: this.from,\r\n      stop: this.stop,\r\n    };\r\n  }\r\n\r\n  set state (state: ContinuousTailState) {\r\n    Object.assign(this, state);\r\n  }\r\n\r\n  shiftBefore (pos: number): string {\r\n    if (this.from >= pos || !this.value.length) return '';\r\n\r\n    const shiftChar = this.value[0];\r\n    this.value = this.value.slice(1);\r\n    return shiftChar;\r\n  }\r\n}\r\n","// @flow\r\nimport ChangeDetails from '../core/change-details.js';\r\nimport ContinuousTailDetails from '../core/continuous-tail-details.js';\r\nimport { type Direction, DIRECTION, isString } from '../core/utils.js';\r\nimport { type TailDetails } from '../core/tail-details.js';\r\n\r\n\r\n/** Supported mask type */\r\nexport\r\ntype Mask =\r\n  string |\r\n  String |\r\n  RegExp |\r\n  Class<Number> |\r\n  Class<Date> |\r\n  Array<any> |\r\n  $PropertyType<Masked<*>, 'validate'> |\r\n  Masked<*> |\r\n  Class<Masked<*>>;\r\n\r\nexport\r\ntype MaskedState = {|\r\n  _value: string,\r\n|};\r\n\r\n/** Append flags */\r\nexport\r\ntype AppendFlags = {\r\n  input?: boolean,\r\n  tail?: boolean,\r\n  raw?: boolean,\r\n  _beforeTailState?: any,  // TODO types...\r\n};\r\n\r\n/** Extract flags */\r\nexport\r\ntype ExtractFlags = {\r\n  raw?: boolean\r\n};\r\n\r\nexport\r\ntype MaskedOptions<MaskType> = {\r\n  mask: $PropertyType<Masked<MaskType>, 'mask'>,\r\n  parent?: $PropertyType<Masked<*>, 'parent'>,\r\n  prepare?: $PropertyType<Masked<MaskType>, 'prepare'>,\r\n  validate?: $PropertyType<Masked<MaskType>, 'validate'>,\r\n  commit?: $PropertyType<Masked<MaskType>, 'commit'>,\r\n  overwrite?: $PropertyType<Masked<MaskType>, 'overwrite'>,\r\n};\r\n\r\n\r\n/** Provides common masking stuff */\r\nexport default\r\nclass Masked<MaskType> {\r\n  static DEFAULTS: any; // $Shape<MaskedOptions>; TODO after fix https://github.com/facebook/flow/issues/4773\r\n\r\n  /** @type {Mask} */\r\n  mask: MaskType;\r\n  /** */ // $FlowFixMe no ideas\r\n  parent: ?Masked<*>;\r\n  /** Transforms value before mask processing */\r\n  prepare: (string, Masked<MaskType>, AppendFlags) => string;\r\n  /** Validates if value is acceptable */\r\n  validate: (string, Masked<MaskType>, AppendFlags) => boolean;\r\n  /** Does additional processing in the end of editing */\r\n  commit: (string, Masked<MaskType>) => void;\r\n  /** Enable characters overwriting */\r\n  overwrite: ?boolean;\r\n  /** */\r\n  isInitialized: boolean;\r\n  _value: string;\r\n  _refreshing: boolean;\r\n\r\n  constructor (opts: {[string]: any}) {\r\n    this._value = '';\r\n    this._update(opts);\r\n    this.isInitialized = true;\r\n  }\r\n\r\n  /** Sets and applies new options */\r\n  updateOptions (opts: {[string]: any}) {\r\n    if (!Object.keys(opts).length) return;\r\n    this.withValueRefresh(this._update.bind(this, opts));\r\n  }\r\n\r\n  /**\r\n    Sets new options\r\n    @protected\r\n  */\r\n  _update (opts: {[string]: any}) {\r\n    Object.assign(this, opts);\r\n  }\r\n\r\n  /** Mask state */\r\n  get state (): any {\r\n    return {\r\n      _value: this.value,\r\n    };\r\n  }\r\n\r\n  set state (state: any) {\r\n    this._value = state._value;\r\n  }\r\n\r\n  /** Resets value */\r\n  reset () {\r\n    this._value = '';\r\n  }\r\n\r\n  /** */\r\n  get value (): string {\r\n    return this._value;\r\n  }\r\n\r\n  set value (value: string) {\r\n    this.resolve(value);\r\n  }\r\n\r\n  /** Resolve new value */\r\n  resolve (value: string): string {\r\n    this.reset();\r\n    this.append(value, {input: true}, '');\r\n    this.doCommit();\r\n    return this.value;\r\n  }\r\n\r\n  /** */\r\n  get unmaskedValue (): string {\r\n    return this.value;\r\n  }\r\n\r\n  set unmaskedValue (value: string) {\r\n    this.reset();\r\n    this.append(value, {}, '');\r\n    this.doCommit();\r\n  }\r\n\r\n  /** */\r\n  get typedValue (): any {\r\n    return this.unmaskedValue;\r\n  }\r\n\r\n  set typedValue (value: any) {\r\n    this.unmaskedValue = value;\r\n  }\r\n\r\n  /** Value that includes raw user input */\r\n  get rawInputValue (): string {\r\n    return this.extractInput(0, this.value.length, {raw: true});\r\n  }\r\n\r\n  set rawInputValue (value: string) {\r\n    this.reset();\r\n    this.append(value, {raw: true}, '');\r\n    this.doCommit();\r\n  }\r\n\r\n  /** */\r\n  get isComplete (): boolean {\r\n    return true;\r\n  }\r\n\r\n  /** Finds nearest input position in direction */\r\n  nearestInputPos (cursorPos: number, direction?: Direction): number {\r\n    return cursorPos;\r\n  }\r\n\r\n  /** Extracts value in range considering flags */\r\n  extractInput (fromPos?: number=0, toPos?: number=this.value.length, flags?: ExtractFlags): string {\r\n    return this.value.slice(fromPos, toPos);\r\n  }\r\n\r\n  /** Extracts tail in range */\r\n  extractTail (fromPos?: number=0, toPos?: number=this.value.length): TailDetails {\r\n    return new ContinuousTailDetails(this.extractInput(fromPos, toPos), fromPos);\r\n  }\r\n\r\n  /** Appends tail */\r\n  // $FlowFixMe no ideas\r\n  appendTail (tail: string | TailDetails): ChangeDetails {\r\n    if (isString(tail)) tail = new ContinuousTailDetails(String(tail));\r\n\r\n    return tail.appendTo(this);\r\n  }\r\n\r\n  /** Appends char */\r\n  _appendCharRaw (ch: string, flags: AppendFlags={}): ChangeDetails {\r\n    ch = this.doPrepare(ch, flags);\r\n    if (!ch) return new ChangeDetails();\r\n\r\n    this._value += ch;\r\n    return new ChangeDetails({\r\n      inserted: ch,\r\n      rawInserted: ch,\r\n    });\r\n  }\r\n\r\n  /** Appends char */\r\n  _appendChar (ch: string, flags: AppendFlags={}, checkTail?: TailDetails): ChangeDetails {\r\n    const consistentState: MaskedState = this.state;\r\n    const details: ChangeDetails = this._appendCharRaw(ch, flags);\r\n\r\n    if (details.inserted) {\r\n      let consistentTail;\r\n      let appended = this.doValidate(flags) !== false;\r\n\r\n      if (appended && checkTail != null) {\r\n        // validation ok, check tail\r\n        const beforeTailState = this.state;\r\n        if (this.overwrite) {\r\n          consistentTail = checkTail.state;\r\n          checkTail.shiftBefore(this.value.length);\r\n        }\r\n\r\n        const tailDetails = this.appendTail(checkTail);\r\n\r\n        appended = tailDetails.rawInserted === checkTail.toString();\r\n\r\n        // if ok, rollback state after tail\r\n        if (appended && tailDetails.inserted) this.state = beforeTailState;\r\n      }\r\n\r\n      // revert all if something went wrong\r\n      if (!appended) {\r\n        details.rawInserted = details.inserted = '';\r\n        this.state = consistentState;\r\n        if (checkTail && consistentTail) checkTail.state = consistentTail;\r\n      }\r\n    }\r\n    return details;\r\n  }\r\n\r\n  /** Appends optional placeholder at end */\r\n  _appendPlaceholder (): ChangeDetails {\r\n    return new ChangeDetails();\r\n  }\r\n\r\n  /** Appends symbols considering flags */\r\n  // $FlowFixMe no ideas\r\n  append (str: string, flags?: AppendFlags, tail?: string | TailDetails): ChangeDetails {\r\n    if (!isString(str)) throw new Error('value should be string');\r\n    const details = new ChangeDetails();\r\n    const checkTail = isString(tail) ? new ContinuousTailDetails(String(tail)) : tail;\r\n    if (flags.tail) flags._beforeTailState = this.state;\r\n\r\n    for (let ci=0; ci<str.length; ++ci) {\r\n      details.aggregate(this._appendChar(str[ci], flags, checkTail));\r\n    }\r\n\r\n    // append tail but aggregate only tailShift\r\n    if (checkTail != null) {\r\n      details.tailShift += this.appendTail(checkTail).tailShift;\r\n      // TODO it's a good idea to clear state after appending ends\r\n      // but it causes bugs when one append calls another (when dynamic dispatch set rawInputValue)\r\n      // this._resetBeforeTailState();\r\n    }\r\n\r\n    return details;\r\n  }\r\n\r\n  /** */\r\n  remove (fromPos?: number=0, toPos?: number=this.value.length): ChangeDetails {\r\n    this._value = this.value.slice(0, fromPos) + this.value.slice(toPos);\r\n    return new ChangeDetails();\r\n  }\r\n\r\n  /** Calls function and reapplies current value */\r\n  withValueRefresh<T>(fn: () => T): T {\r\n    if (this._refreshing || !this.isInitialized) return fn();\r\n    this._refreshing = true;\r\n\r\n    const unmasked = this.unmaskedValue;\r\n    const value = this.value;\r\n\r\n    const ret = fn();\r\n\r\n    // try to update with raw value first to keep fixed chars\r\n    if (this.resolve(value) !== value) {\r\n      // or fallback to unmasked\r\n      this.unmaskedValue = unmasked;\r\n    }\r\n\r\n    delete this._refreshing;\r\n    return ret;\r\n  }\r\n\r\n  /**\r\n    Prepares string before mask processing\r\n    @protected\r\n  */\r\n  doPrepare (str: string, flags: AppendFlags={}): string {\r\n    return this.prepare ?\r\n      this.prepare(str, this, flags) :\r\n      str;\r\n  }\r\n\r\n  /**\r\n    Validates if value is acceptable\r\n    @protected\r\n  */\r\n  doValidate (flags: AppendFlags): boolean {\r\n    return (!this.validate || this.validate(this.value, this, flags)) &&\r\n      (!this.parent || this.parent.doValidate(flags));\r\n  }\r\n\r\n  /**\r\n    Does additional processing in the end of editing\r\n    @protected\r\n  */\r\n  doCommit () {\r\n    if (this.commit) this.commit(this.value, this);\r\n  }\r\n\r\n  /** */\r\n  splice (start: number, deleteCount: number, inserted: string, removeDirection: Direction): ChangeDetails {\r\n    const tailPos: number = start + deleteCount;\r\n    const tail: TailDetails = this.extractTail(tailPos);\r\n\r\n    let startChangePos: number = this.nearestInputPos(start, removeDirection);\r\n    const changeDetails: ChangeDetails = new ChangeDetails({\r\n      tailShift: startChangePos - start  // adjust tailShift if start was aligned\r\n    }).aggregate(this.remove(startChangePos))\r\n      .aggregate(this.append(inserted, {input: true}, tail));\r\n\r\n    return changeDetails;\r\n  }\r\n}\r\n","// @flow\r\nimport {g, isString} from '../core/utils.js';\r\nimport type Masked from './base.js';\r\nimport {type Mask} from './base.js';\r\n\r\n\r\n/** Get Masked class by mask type */\r\nexport\r\nfunction maskedClass (mask: Mask): Class<Masked<*>> {\r\n  if (mask == null) {\r\n    throw new Error('mask property should be defined');\r\n  }\r\n\r\n  if (mask instanceof RegExp) return g.IMask.MaskedRegExp;\r\n  if (isString(mask)) return g.IMask.MaskedPattern;\r\n  if (mask instanceof Date || mask === Date) return g.IMask.MaskedDate;\r\n  if (mask instanceof Number || typeof mask === 'number' || mask === Number) return g.IMask.MaskedNumber;\r\n  if (Array.isArray(mask) || mask === Array) return g.IMask.MaskedDynamic;\r\n  // $FlowFixMe\r\n  if (mask.prototype instanceof g.IMask.Masked) return mask;\r\n  // $FlowFixMe\r\n  if (mask instanceof Function) return g.IMask.MaskedFunction;\r\n\r\n  console.warn('Mask not found for mask', mask);  // eslint-disable-line no-console\r\n  return g.IMask.Masked;\r\n}\r\n\r\n/** Creates new {@link Masked} depending on mask type */\r\nexport default\r\nfunction createMask (opts: {mask: Mask}): Masked<*> {\r\n  opts = {...opts};\r\n  const mask = opts.mask;\r\n\r\n  if (mask instanceof g.IMask.Masked) return mask;\r\n\r\n  const MaskedClass = maskedClass(mask);\r\n  return new MaskedClass(opts);\r\n}\r\n","// @flow\r\nimport createMask from '../factory.js';\r\nimport type Masked from '../base.js';\r\nimport type MaskedPattern from '../pattern.js';\r\nimport {type TailDetails} from '../../core/tail-details.js';\r\nimport {type Mask, type ExtractFlags, type AppendFlags} from '../base.js';\r\nimport ChangeDetails from '../../core/change-details.js';\r\nimport {DIRECTION, type Direction} from '../../core/utils.js';\r\nimport {type PatternBlock} from './block.js';\r\n\r\n\r\nexport\r\ntype Definitions = {[string]: Mask};\r\n\r\n/** */\r\ntype PatternInputDefinitionOptions = {\r\n  parent: $PropertyType<PatternInputDefinition, 'parent'>,\r\n  mask: Mask,\r\n  isOptional: $PropertyType<PatternInputDefinition, 'isOptional'>,\r\n  lazy: $PropertyType<PatternInputDefinition, 'lazy'>,\r\n  placeholderChar: $PropertyType<PatternInputDefinition, 'placeholderChar'>,\r\n};\r\n\r\ntype PatternInputDefinitionState = {\r\n  masked: *,\r\n  _isFilled: boolean,\r\n};\r\n\r\nexport\r\nconst DEFAULT_INPUT_DEFINITIONS = {\r\n  '0': /\\d/,\r\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\r\n  '*': /./\r\n};\r\n\r\n\r\n/** */\r\nexport default\r\nclass PatternInputDefinition implements PatternBlock {\r\n  /** */\r\n  +masked: Masked<*>;\r\n  /** */\r\n  parent: Masked<*>;\r\n  /** */\r\n  isOptional: boolean;\r\n  /** */\r\n  _isFilled: boolean;\r\n  /** */\r\n  lazy: $PropertyType<MaskedPattern, 'lazy'>;\r\n  /** */\r\n  placeholderChar: $PropertyType<MaskedPattern, 'placeholderChar'>;\r\n\r\n\r\n  constructor(opts: PatternInputDefinitionOptions) {\r\n    const {mask, ...blockOpts} = opts;\r\n\r\n    this.masked = createMask({mask});\r\n    Object.assign(this, blockOpts);\r\n  }\r\n\r\n  reset () {\r\n    this._isFilled = false;\r\n    this.masked.reset();\r\n  }\r\n\r\n  remove (fromPos?: number=0, toPos?: number=this.value.length): ChangeDetails {\r\n    if (fromPos === 0 && toPos >= 1) {\r\n      this._isFilled = false;\r\n      return this.masked.remove(fromPos, toPos);\r\n    }\r\n\r\n    return new ChangeDetails();\r\n  }\r\n\r\n  get value (): string {\r\n    return this.masked.value ||\r\n      (this._isFilled && !this.isOptional ?\r\n        this.placeholderChar :\r\n        '');\r\n  }\r\n\r\n  get unmaskedValue (): string {\r\n    return this.masked.unmaskedValue;\r\n  }\r\n\r\n  get isComplete (): boolean {\r\n    return Boolean(this.masked.value) || this.isOptional;\r\n  }\r\n\r\n  _appendChar (str: string, flags: AppendFlags={}): ChangeDetails {\r\n    if (this._isFilled) return new ChangeDetails();\r\n\r\n    const state = this.masked.state;\r\n    // simulate input\r\n    const details = this.masked._appendChar(str, flags);\r\n\r\n    if (details.inserted && this.doValidate(flags) === false) {\r\n      details.inserted = details.rawInserted = '';\r\n      this.masked.state = state;\r\n    }\r\n\r\n    if (!details.inserted && !this.isOptional && !this.lazy && !flags.input) {\r\n      details.inserted = this.placeholderChar;\r\n    }\r\n    details.skip = !details.inserted && !this.isOptional;\r\n    this._isFilled = Boolean(details.inserted);\r\n\r\n    return details;\r\n  }\r\n\r\n  append (...args: *): ChangeDetails {\r\n    return this.masked.append(...args);\r\n  }\r\n\r\n  _appendPlaceholder (): ChangeDetails {\r\n    const details = new ChangeDetails();\r\n\r\n    if (this._isFilled || this.isOptional) return details;\r\n\r\n    this._isFilled = true;\r\n    details.inserted = this.placeholderChar;\r\n    return details;\r\n  }\r\n\r\n  extractTail (...args: *): TailDetails {\r\n    return this.masked.extractTail(...args);\r\n  }\r\n\r\n  appendTail (...args: *): ChangeDetails {\r\n    return this.masked.appendTail(...args);\r\n  }\r\n\r\n  extractInput (fromPos?: number=0, toPos?: number=this.value.length, flags?: ExtractFlags): string {\r\n    return this.masked.extractInput(fromPos, toPos, flags);\r\n  }\r\n\r\n  nearestInputPos (cursorPos: number, direction: Direction=DIRECTION.NONE): number {\r\n    const minPos = 0;\r\n    const maxPos = this.value.length;\r\n    const boundPos = Math.min(Math.max(cursorPos, minPos), maxPos);\r\n\r\n    switch (direction) {\r\n      case DIRECTION.LEFT:\r\n      case DIRECTION.FORCE_LEFT:\r\n        return this.isComplete ? boundPos : minPos;\r\n      case DIRECTION.RIGHT:\r\n      case DIRECTION.FORCE_RIGHT:\r\n        return this.isComplete ? boundPos : maxPos;\r\n      case DIRECTION.NONE:\r\n      default: return boundPos;\r\n    }\r\n  }\r\n\r\n  doValidate (...args: *) {\r\n    return this.masked.doValidate(...args) && (\r\n      !this.parent || this.parent.doValidate(...args));\r\n  }\r\n\r\n  doCommit () {\r\n    this.masked.doCommit();\r\n  }\r\n\r\n  get state (): PatternInputDefinitionState {\r\n    return {\r\n      masked: this.masked.state,\r\n      _isFilled: this._isFilled,\r\n    };\r\n  }\r\n\r\n  set state (state: PatternInputDefinitionState) {\r\n    this.masked.state = state.masked;\r\n    this._isFilled = state._isFilled;\r\n  }\r\n}\r\n","// @flow\r\nimport ChangeDetails from '../../core/change-details.js';\r\nimport { DIRECTION, type Direction, isString } from '../../core/utils.js';\r\nimport { type TailDetails } from '../../core/tail-details.js';\r\nimport ContinuousTailDetails from '../../core/continuous-tail-details.js';\r\nimport { type ExtractFlags, type AppendFlags, type MaskedState } from '../base.js';\r\nimport { type PatternBlock } from './block.js';\r\n\r\n\r\n/** */\r\ntype PatternFixedDefinitionOptions = {\r\n  char: $PropertyType<PatternFixedDefinition, 'char'>,\r\n  isUnmasking?: $PropertyType<PatternFixedDefinition, 'isUnmasking'>,\r\n};\r\n\r\ntype PatternFixedDefinitionState = {|\r\n  ...MaskedState,\r\n  _isRawInput: ?boolean,\r\n|};\r\n\r\nexport default\r\nclass PatternFixedDefinition implements PatternBlock {\r\n  /** */\r\n  _value: string;\r\n  /** */\r\n  char: string;\r\n  /** */\r\n  isUnmasking: ?boolean;\r\n  /** */\r\n  _isRawInput: ?boolean;\r\n\r\n  constructor(opts: PatternFixedDefinitionOptions) {\r\n    Object.assign(this, opts);\r\n    this._value = '';\r\n  }\r\n\r\n  get value (): string {\r\n    return this._value;\r\n  }\r\n\r\n  get unmaskedValue (): string {\r\n    return this.isUnmasking ? this.value : '';\r\n  }\r\n\r\n  reset () {\r\n    this._isRawInput = false;\r\n    this._value = '';\r\n  }\r\n\r\n  remove (fromPos?: number=0, toPos?: number=this._value.length): ChangeDetails {\r\n    this._value = this._value.slice(0, fromPos) + this._value.slice(toPos);\r\n    if (!this._value) this._isRawInput = false;\r\n\r\n    return new ChangeDetails();\r\n  }\r\n\r\n  nearestInputPos (cursorPos: number, direction: Direction=DIRECTION.NONE): number {\r\n    const minPos = 0;\r\n    const maxPos = this._value.length;\r\n\r\n    switch (direction) {\r\n      case DIRECTION.LEFT:\r\n      case DIRECTION.FORCE_LEFT:\r\n        return minPos;\r\n      case DIRECTION.NONE:\r\n      case DIRECTION.RIGHT:\r\n      case DIRECTION.FORCE_RIGHT:\r\n      default: return maxPos;\r\n    }\r\n  }\r\n\r\n  extractInput (fromPos?: number=0, toPos?: number=this._value.length, flags?: ExtractFlags={}) {\r\n    return flags.raw && this._isRawInput && this._value.slice(fromPos, toPos) || '';\r\n  }\r\n\r\n  get isComplete (): boolean {\r\n    return true;\r\n  }\r\n\r\n  _appendChar (str: string, flags?: AppendFlags={}) {\r\n    const details = new ChangeDetails();\r\n\r\n    if (this._value) return details;\r\n\r\n    const appended = this.char === str[0];\r\n    const isResolved = appended && (this.isUnmasking || flags.input || flags.raw) && !flags.tail;\r\n    if (isResolved) details.rawInserted = this.char;\r\n    this._value = details.inserted = this.char;\r\n    this._isRawInput = isResolved && (flags.raw || flags.input);\r\n\r\n    return details;\r\n  }\r\n\r\n  _appendPlaceholder (): ChangeDetails {\r\n    const details = new ChangeDetails();\r\n    if (this._value) return details;\r\n\r\n    this._value = details.inserted = this.char;\r\n    return details;\r\n  }\r\n\r\n  extractTail (fromPos?: number=0, toPos?: number=this.value.length): TailDetails {\r\n    return new ContinuousTailDetails('');\r\n  }\r\n\r\n  // $FlowFixMe no ideas\r\n  appendTail (tail: string | TailDetails): ChangeDetails {\r\n    if (isString(tail)) tail = new ContinuousTailDetails(String(tail));\r\n\r\n    return tail.appendTo(this);\r\n  }\r\n\r\n  append (str: string, flags?: AppendFlags, tail?: TailDetails): ChangeDetails {\r\n    const details = this._appendChar(str, flags);\r\n\r\n    if (tail != null) {\r\n      details.tailShift += this.appendTail(tail).tailShift;\r\n    }\r\n\r\n    return details;\r\n  }\r\n\r\n  doCommit () {}\r\n\r\n  get state (): PatternFixedDefinitionState {\r\n    return {\r\n      _value: this._value,\r\n      _isRawInput: this._isRawInput,\r\n    };\r\n  }\r\n\r\n  set state (state: PatternFixedDefinitionState) {\r\n    Object.assign(this, state);\r\n  }\r\n}\r\n","// @flow\r\nimport { g } from '../../core/utils.js';\r\nimport type { TailDetails, AppendTail } from '../../core/tail-details.js';\r\nimport ChangeDetails from '../../core/change-details.js';\r\nimport { isString } from '../../core/utils.js';\r\nimport ContinuousTailDetails from '../../core/continuous-tail-details.js';\r\n\r\n\r\ntype ChunksTailState = {\r\n  chunks: $PropertyType<ChunksTailDetails, 'chunks'>,\r\n  from: $PropertyType<ChunksTailDetails, 'from'>,\r\n  stop?: $PropertyType<ChunksTailDetails, 'stop'>,\r\n  blockIndex?: $PropertyType<ChunksTailDetails, 'blockIndex'>,\r\n};\r\n\r\nexport default\r\nclass ChunksTailDetails implements TailDetails {\r\n  chunks: Array<TailDetails>;\r\n  from: number;\r\n  stop: ?number;\r\n  /** */\r\n  blockIndex: ?number;\r\n\r\n  constructor (chunks?: Array<TailDetails>=[], from?: number=0) {\r\n    this.chunks = chunks;\r\n    this.from = from;\r\n  }\r\n\r\n  toString (): string {\r\n    return this.chunks.map(String).join('');\r\n  }\r\n\r\n  // $FlowFixMe no ideas\r\n  extend (tailChunk: string | TailDetails): void {\r\n    if (!String(tailChunk)) return;\r\n    if (isString(tailChunk)) tailChunk = new ContinuousTailDetails(String(tailChunk));\r\n\r\n    const lastChunk = this.chunks[this.chunks.length-1];\r\n    const extendLast = lastChunk &&\r\n      // if stops are same or tail has no stop\r\n      (lastChunk.stop === tailChunk.stop || tailChunk.stop == null) &&\r\n      // if tail chunk goes just after last chunk\r\n      tailChunk.from === (lastChunk.from + lastChunk.toString().length);\r\n\r\n    if (tailChunk instanceof ContinuousTailDetails) {\r\n      // check the ability to extend previous chunk\r\n      if (extendLast) {\r\n        // extend previous chunk\r\n        lastChunk.extend(tailChunk.toString());\r\n      } else {\r\n        // append new chunk\r\n        this.chunks.push(tailChunk);\r\n      }\r\n    } else if (tailChunk instanceof ChunksTailDetails) {\r\n      if (tailChunk.stop == null) {\r\n        // unwrap floating chunks to parent, keeping `from` pos\r\n        let firstTailChunk;\r\n        while (tailChunk.chunks.length && tailChunk.chunks[0].stop == null) {\r\n          firstTailChunk = tailChunk.chunks.shift();\r\n          firstTailChunk.from += tailChunk.from;\r\n          this.extend(firstTailChunk);\r\n        }\r\n      }\r\n\r\n      // if tail chunk still has value\r\n      if (tailChunk.toString()) {\r\n        // if chunks contains stops, then popup stop to container\r\n        tailChunk.stop = tailChunk.blockIndex;\r\n        this.chunks.push(tailChunk);\r\n      }\r\n    }\r\n  }\r\n\r\n  appendTo (masked: AppendTail): ChangeDetails {\r\n    if (!(masked instanceof g.IMask.MaskedPattern)) {\r\n      const tail = new ContinuousTailDetails(this.toString());\r\n      return tail.appendTo(masked);\r\n    }\r\n\r\n    const details = new ChangeDetails();\r\n\r\n    for (let ci=0; ci < this.chunks.length && !details.skip; ++ci) {\r\n      const chunk = this.chunks[ci];\r\n\r\n      const lastBlockIter = masked._mapPosToBlock(masked.value.length);\r\n      const stop = chunk.stop;\r\n      let chunkBlock;\r\n      if (stop &&\r\n        // if block not found or stop is behind lastBlock\r\n        (!lastBlockIter || lastBlockIter.index <= stop)\r\n      ) {\r\n        if (\r\n          chunk instanceof ChunksTailDetails ||\r\n          // for continuous block also check if stop is exist\r\n          masked._stops.indexOf(stop) >= 0\r\n        ) {\r\n          details.aggregate(masked._appendPlaceholder(stop));\r\n        }\r\n        chunkBlock = chunk instanceof ChunksTailDetails && masked._blocks[stop];\r\n      }\r\n\r\n      if (chunkBlock) {\r\n        const tailDetails = chunkBlock.appendTail(chunk);\r\n        tailDetails.skip = false; // always ignore skip, it will be set on last\r\n        details.aggregate(tailDetails);\r\n        masked._value += tailDetails.inserted;\r\n\r\n        // get not inserted chars\r\n        const remainChars = chunk.toString().slice(tailDetails.rawInserted.length);\r\n        if (remainChars) details.aggregate(masked.append(remainChars, { tail: true }));\r\n      } else {\r\n        details.aggregate(masked.append(chunk.toString(), { tail: true }));\r\n      }\r\n    };\r\n\r\n    return details;\r\n  }\r\n\r\n  get state (): ChunksTailState {\r\n    return {\r\n      chunks: this.chunks.map(c => c.state),\r\n      from: this.from,\r\n      stop: this.stop,\r\n      blockIndex: this.blockIndex,\r\n    };\r\n  }\r\n\r\n  set state (state: ChunksTailState) {\r\n    const { chunks, ...props } = state;\r\n    Object.assign(this, props);\r\n    this.chunks = chunks.map(cstate => {\r\n      const chunk = \"chunks\" in cstate ?\r\n        new ChunksTailDetails() :\r\n        new ContinuousTailDetails();\r\n      // $FlowFixMe already checked above\r\n      chunk.state = cstate;\r\n      return chunk;\r\n    });\r\n  }\r\n\r\n  shiftBefore (pos: number): string {\r\n    if (this.from >= pos || !this.chunks.length) return '';\r\n\r\n    const chunkShiftPos = pos - this.from;\r\n    let ci=0;\r\n    while (ci < this.chunks.length) {\r\n      const chunk = this.chunks[ci];\r\n      const shiftChar = chunk.shiftBefore(chunkShiftPos);\r\n\r\n      if (chunk.toString()) {\r\n        // chunk still contains value\r\n        // but not shifted - means no more available chars to shift\r\n        if (!shiftChar) break;\r\n        ++ci;\r\n      } else {\r\n        // clean if chunk has no value\r\n        this.chunks.splice(ci, 1);\r\n      }\r\n\r\n      if (shiftChar) return shiftChar;\r\n    }\r\n\r\n    return '';\r\n  }\r\n}\r\n","// @flow\r\nimport {DIRECTION, type Direction, forceDirection} from '../core/utils.js';\r\nimport ChangeDetails from '../core/change-details.js';\r\nimport Masked, {type AppendFlags, type ExtractFlags, type MaskedOptions, type MaskedState} from './base.js';\r\nimport PatternInputDefinition, {DEFAULT_INPUT_DEFINITIONS, type Definitions} from './pattern/input-definition.js';\r\nimport PatternFixedDefinition from './pattern/fixed-definition.js';\r\nimport { type TailDetails } from '../core/tail-details.js';\r\nimport ChunksTailDetails from './pattern/chunk-tail-details.js';\r\nimport ContinuousTailDetails from '../core/continuous-tail-details.js';\r\nimport {type PatternBlock} from './pattern/block.js';\r\nimport createMask from './factory.js';\r\n\r\n\r\ntype MaskedPatternOptions = {\r\n  ...MaskedOptions<string>,\r\n  definitions?: $PropertyType<MaskedPattern, 'definitions'>,\r\n  blocks?: $PropertyType<MaskedPattern, 'blocks'>,\r\n  placeholderChar?: $PropertyType<MaskedPattern, 'placeholderChar'>,\r\n  lazy?: $PropertyType<MaskedPattern, 'lazy'>,\r\n};\r\n\r\ntype MaskedPatternState = {|\r\n  ...MaskedState,\r\n  _blocks: Array<*>,\r\n|};\r\n\r\ntype BlockPosData = {\r\n  index: number,\r\n  offset: number,\r\n};\r\n\r\n/**\r\n  Pattern mask\r\n  @param {Object} opts\r\n  @param {Object} opts.blocks\r\n  @param {Object} opts.definitions\r\n  @param {string} opts.placeholderChar\r\n  @param {boolean} opts.lazy\r\n*/\r\nexport default\r\nclass MaskedPattern extends Masked<string> {\r\n  static DEFAULTS: any;\r\n  static STOP_CHAR: string;\r\n  static ESCAPE_CHAR: string;\r\n  static InputDefinition: Class<PatternInputDefinition>;\r\n  static FixedDefinition: Class<PatternFixedDefinition>;\r\n\r\n  /** */\r\n  blocks: {[string]: Masked<*>};\r\n  /** */\r\n  definitions: Definitions;\r\n  /** Single char for empty input */\r\n  placeholderChar: string;\r\n  /** Show placeholder only when needed */\r\n  lazy: boolean;\r\n  _blocks: Array<PatternBlock>;\r\n  _maskedBlocks: {[string]: Array<number>};\r\n  _stops: Array<number>;\r\n\r\n  constructor (opts: any={}) {  // TODO type $Shape<MaskedPatternOptions>={} does not work\r\n    opts.definitions = Object.assign({}, DEFAULT_INPUT_DEFINITIONS, opts.definitions);\r\n    super({\r\n      ...MaskedPattern.DEFAULTS,\r\n      ...opts,\r\n    });\r\n  }\r\n\r\n  /**\r\n    @override\r\n    @param {Object} opts\r\n  */\r\n  _update (opts: $Shape<MaskedPatternOptions>={}) {\r\n    opts.definitions = Object.assign({}, this.definitions, opts.definitions);\r\n    super._update(opts);\r\n    this._rebuildMask();\r\n  }\r\n\r\n  /** */\r\n  _rebuildMask () {\r\n    const defs = this.definitions;\r\n    this._blocks = [];\r\n    this._stops = [];\r\n    this._maskedBlocks = {};\r\n\r\n    let pattern = this.mask;\r\n    if (!pattern || !defs) return;\r\n\r\n    let unmaskingBlock = false;\r\n    let optionalBlock = false;\r\n\r\n    for (let i=0; i<pattern.length; ++i) {\r\n      if (this.blocks) {\r\n        const p = pattern.slice(i);\r\n        const bNames = Object.keys(this.blocks).filter(bName => p.indexOf(bName) === 0);\r\n        // order by key length\r\n        bNames.sort((a, b) => b.length - a.length);\r\n        // use block name with max length\r\n        const bName = bNames[0];\r\n        if (bName) {\r\n          const maskedBlock = createMask({\r\n            parent: this,\r\n            lazy: this.lazy,\r\n            placeholderChar: this.placeholderChar,\r\n            overwrite: this.overwrite,\r\n            ...this.blocks[bName]\r\n          });\r\n\r\n          if (maskedBlock) {\r\n            this._blocks.push(maskedBlock);\r\n\r\n            // store block index\r\n            if (!this._maskedBlocks[bName]) this._maskedBlocks[bName] = [];\r\n            this._maskedBlocks[bName].push(this._blocks.length - 1);\r\n          }\r\n\r\n          i += bName.length - 1;\r\n          continue;\r\n        }\r\n      }\r\n\r\n      let char = pattern[i];\r\n      let isInput = char in defs;\r\n\r\n      if (char === MaskedPattern.STOP_CHAR) {\r\n        this._stops.push(this._blocks.length);\r\n        continue;\r\n      }\r\n\r\n      if (char === '{' || char === '}') {\r\n        unmaskingBlock = !unmaskingBlock;\r\n        continue;\r\n      }\r\n\r\n      if (char === '[' || char === ']') {\r\n        optionalBlock = !optionalBlock;\r\n        continue;\r\n      }\r\n\r\n      if (char === MaskedPattern.ESCAPE_CHAR) {\r\n        ++i;\r\n        char = pattern[i];\r\n        if (!char) break;\r\n        isInput = false;\r\n      }\r\n\r\n      const def = isInput ?\r\n        new PatternInputDefinition({\r\n          parent: this,\r\n          lazy: this.lazy,\r\n          placeholderChar: this.placeholderChar,\r\n          mask: defs[char],\r\n          isOptional: optionalBlock,\r\n        }) :\r\n        new PatternFixedDefinition({\r\n          char,\r\n          isUnmasking: unmaskingBlock,\r\n        });\r\n\r\n      this._blocks.push(def);\r\n    }\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  get state (): MaskedPatternState {\r\n    return {\r\n      ...super.state,\r\n      _blocks: this._blocks.map(b => b.state),\r\n    };\r\n  }\r\n\r\n  set state (state: MaskedPatternState) {\r\n    const {_blocks, ...maskedState} = state;\r\n    this._blocks.forEach((b, bi) => b.state = _blocks[bi]);\r\n    super.state = maskedState;\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  reset () {\r\n    super.reset();\r\n    this._blocks.forEach(b => b.reset());\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  get isComplete (): boolean {\r\n    return this._blocks.every(b => b.isComplete);\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  doCommit () {\r\n    this._blocks.forEach(b => b.doCommit());\r\n    super.doCommit();\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  get unmaskedValue (): string {\r\n    return this._blocks.reduce((str, b) => str += b.unmaskedValue, '');\r\n  }\r\n\r\n  set unmaskedValue (unmaskedValue: string) {\r\n    super.unmaskedValue = unmaskedValue;\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  get value (): string {\r\n    // TODO return _value when not in change?\r\n    return this._blocks.reduce((str, b) => str += b.value, '');\r\n  }\r\n\r\n  set value (value: string) {\r\n    super.value = value;\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  appendTail (tail: string | TailDetails): ChangeDetails {\r\n    return super.appendTail(tail).aggregate(this._appendPlaceholder());\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  _appendCharRaw (ch: string, flags: AppendFlags={}): ChangeDetails {\r\n    ch = this.doPrepare(ch, flags);\r\n    const blockIter = this._mapPosToBlock(this.value.length);\r\n    const details = new ChangeDetails();\r\n    if (!blockIter) return details;\r\n\r\n    for (let bi=blockIter.index; ; ++bi) {\r\n      const block = this._blocks[bi];\r\n      if (!block) break;\r\n\r\n      const blockDetails = block._appendChar(ch, flags);\r\n\r\n      const skip = blockDetails.skip;\r\n      details.aggregate(blockDetails);\r\n\r\n      if (skip || blockDetails.rawInserted) break; // go next char\r\n    }\r\n\r\n    return details;\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  extractTail (fromPos?: number=0, toPos?: number=this.value.length): ChunksTailDetails {\r\n    const chunkTail = new ChunksTailDetails();\r\n    if (fromPos === toPos) return chunkTail;\r\n\r\n    this._forEachBlocksInRange(fromPos, toPos, (b, bi, bFromPos, bToPos) => {\r\n      const blockChunk = b.extractTail(bFromPos, bToPos);\r\n      blockChunk.stop = this._findStopBefore(bi);\r\n      blockChunk.from = this._blockStartPos(bi);\r\n      if (blockChunk instanceof ChunksTailDetails) blockChunk.blockIndex = bi;\r\n\r\n      chunkTail.extend(blockChunk);\r\n    });\r\n\r\n    return chunkTail;\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  extractInput (fromPos?: number=0, toPos?: number=this.value.length, flags: ExtractFlags={}): string {\r\n    if (fromPos === toPos) return '';\r\n\r\n    let input = '';\r\n\r\n    this._forEachBlocksInRange(fromPos, toPos, (b, _, fromPos, toPos) => {\r\n      input += b.extractInput(fromPos, toPos, flags);\r\n    });\r\n\r\n    return input;\r\n  }\r\n\r\n  _findStopBefore (blockIndex: number): ?number {\r\n    let stopBefore;\r\n    for (let si=0; si<this._stops.length; ++si) {\r\n      const stop = this._stops[si];\r\n      if (stop <= blockIndex) stopBefore = stop;\r\n      else break;\r\n    }\r\n    return stopBefore;\r\n  }\r\n\r\n  /** Appends placeholder depending on laziness */\r\n  _appendPlaceholder (toBlockIndex: ?number): ChangeDetails {\r\n    const details = new ChangeDetails();\r\n    if (this.lazy && toBlockIndex == null) return details;\r\n\r\n    const startBlockIter = this._mapPosToBlock(this.value.length);\r\n    if (!startBlockIter) return details;\r\n\r\n    const startBlockIndex = startBlockIter.index;\r\n    const endBlockIndex = toBlockIndex != null ? toBlockIndex : this._blocks.length;\r\n\r\n    this._blocks.slice(startBlockIndex, endBlockIndex)\r\n      .forEach(b => {\r\n        if (!b.lazy || toBlockIndex != null) {\r\n          // $FlowFixMe `_blocks` may not be present\r\n          const args = b._blocks != null ? [b._blocks.length] : [];\r\n          const bDetails = b._appendPlaceholder(...args);\r\n          this._value += bDetails.inserted;\r\n          details.aggregate(bDetails);\r\n        }\r\n      });\r\n\r\n    return details;\r\n  }\r\n\r\n  /** Finds block in pos */\r\n  _mapPosToBlock (pos: number): ?BlockPosData {\r\n    let accVal = '';\r\n    for (let bi=0; bi<this._blocks.length; ++bi) {\r\n      const block = this._blocks[bi];\r\n      const blockStartPos = accVal.length;\r\n\r\n      accVal += block.value;\r\n\r\n      if (pos <= accVal.length) {\r\n        return {\r\n          index: bi,\r\n          offset: pos - blockStartPos,\r\n        };\r\n      }\r\n    }\r\n  }\r\n\r\n  /** */\r\n  _blockStartPos (blockIndex: number): number {\r\n    return this._blocks\r\n      .slice(0, blockIndex)\r\n      .reduce((pos, b) => pos += b.value.length, 0);\r\n  }\r\n\r\n  /** */\r\n  _forEachBlocksInRange (fromPos: number, toPos: number=this.value.length, fn: (block: PatternBlock, blockIndex: number, fromPos: number, toPos: number) => void) {\r\n    const fromBlockIter = this._mapPosToBlock(fromPos);\r\n\r\n    if (fromBlockIter) {\r\n      const toBlockIter = this._mapPosToBlock(toPos);\r\n      // process first block\r\n      const isSameBlock = toBlockIter && fromBlockIter.index === toBlockIter.index;\r\n      const fromBlockStartPos = fromBlockIter.offset;\r\n      const fromBlockEndPos = toBlockIter && isSameBlock ?\r\n        toBlockIter.offset :\r\n        this._blocks[fromBlockIter.index].value.length;\r\n      fn(this._blocks[fromBlockIter.index], fromBlockIter.index, fromBlockStartPos, fromBlockEndPos);\r\n\r\n      if (toBlockIter && !isSameBlock) {\r\n        // process intermediate blocks\r\n        for (let bi=fromBlockIter.index+1; bi<toBlockIter.index; ++bi) {\r\n          fn(this._blocks[bi], bi, 0, this._blocks[bi].value.length);\r\n        }\r\n\r\n        // process last block\r\n        fn(this._blocks[toBlockIter.index], toBlockIter.index, 0, toBlockIter.offset);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  remove (fromPos: number=0, toPos: number=this.value.length): ChangeDetails {\r\n    const removeDetails = super.remove(fromPos, toPos);\r\n    this._forEachBlocksInRange(fromPos, toPos, (b, _, bFromPos, bToPos) => {\r\n      removeDetails.aggregate(b.remove(bFromPos, bToPos));\r\n    });\r\n    return removeDetails;\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  nearestInputPos (cursorPos: number, direction: Direction=DIRECTION.NONE): number {\r\n    // TODO refactor - extract alignblock\r\n\r\n    const beginBlockData = this._mapPosToBlock(cursorPos) || {index: 0, offset: 0};\r\n    const {\r\n      offset: beginBlockOffset,\r\n      index: beginBlockIndex,\r\n    } = beginBlockData;\r\n    const beginBlock = this._blocks[beginBlockIndex];\r\n\r\n    if (!beginBlock) return cursorPos;\r\n\r\n    let beginBlockCursorPos = beginBlockOffset;\r\n    // if position inside block - try to adjust it\r\n    if (beginBlockCursorPos !== 0 && beginBlockCursorPos < beginBlock.value.length) {\r\n      beginBlockCursorPos = beginBlock.nearestInputPos(beginBlockOffset, forceDirection(direction));\r\n    }\r\n\r\n    const cursorAtRight = beginBlockCursorPos === beginBlock.value.length;\r\n    const cursorAtLeft = beginBlockCursorPos === 0;\r\n\r\n    //  cursor is INSIDE first block (not at bounds)\r\n    if (!cursorAtLeft && !cursorAtRight) return this._blockStartPos(beginBlockIndex) + beginBlockCursorPos;\r\n\r\n    const searchBlockIndex = cursorAtRight ? beginBlockIndex + 1 : beginBlockIndex;\r\n\r\n    if (direction === DIRECTION.NONE) {\r\n      // NONE direction used to calculate start input position if no chars were removed\r\n      // FOR NONE:\r\n      // -\r\n      // input|any\r\n      // ->\r\n      //  any|input\r\n      // <-\r\n      //  filled-input|any\r\n\r\n      // check if first block at left is input\r\n      if (searchBlockIndex > 0) {\r\n        const blockIndexAtLeft = searchBlockIndex-1;\r\n        const blockAtLeft = this._blocks[blockIndexAtLeft];\r\n        const blockInputPos = blockAtLeft.nearestInputPos(0, DIRECTION.NONE);\r\n        // is input\r\n        if (!blockAtLeft.value.length || blockInputPos !== blockAtLeft.value.length) {\r\n          return this._blockStartPos(searchBlockIndex);\r\n        }\r\n      }\r\n\r\n      // ->\r\n      let firstInputAtRight = searchBlockIndex;\r\n      for (let bi=firstInputAtRight; bi < this._blocks.length; ++bi) {\r\n        const blockAtRight = this._blocks[bi];\r\n        const blockInputPos = blockAtRight.nearestInputPos(0, DIRECTION.NONE);\r\n        if (!blockAtRight.value.length || blockInputPos !== blockAtRight.value.length) {\r\n          return this._blockStartPos(bi) + blockInputPos;\r\n        }\r\n      }\r\n\r\n      // <-\r\n      // find first non-fixed symbol\r\n      for (let bi=searchBlockIndex-1; bi >= 0; --bi) {\r\n        const block = this._blocks[bi];\r\n        const blockInputPos = block.nearestInputPos(0, DIRECTION.NONE);\r\n        // is input\r\n        if (!block.value.length || blockInputPos !== block.value.length) {\r\n          return this._blockStartPos(bi) + block.value.length;\r\n        }\r\n      }\r\n\r\n      return cursorPos;\r\n    }\r\n\r\n    if (direction === DIRECTION.LEFT || direction === DIRECTION.FORCE_LEFT) {\r\n      // -\r\n      //  any|filled-input\r\n      // <-\r\n      //  any|first not empty is not-len-aligned\r\n      //  not-0-aligned|any\r\n      // ->\r\n      //  any|not-len-aligned or end\r\n\r\n      // check if first block at right is filled input\r\n      let firstFilledBlockIndexAtRight;\r\n      for (let bi=searchBlockIndex; bi < this._blocks.length; ++bi) {\r\n        if (this._blocks[bi].value) {\r\n          firstFilledBlockIndexAtRight = bi;\r\n          break;\r\n        }\r\n      }\r\n      if (firstFilledBlockIndexAtRight != null) {\r\n        const filledBlock = this._blocks[firstFilledBlockIndexAtRight];\r\n        const blockInputPos = filledBlock.nearestInputPos(0, DIRECTION.RIGHT);\r\n        if (blockInputPos === 0 && filledBlock.unmaskedValue.length) {\r\n          // filled block is input\r\n          return this._blockStartPos(firstFilledBlockIndexAtRight) + blockInputPos;\r\n        }\r\n      }\r\n\r\n      // <-\r\n      // find this vars\r\n      let firstFilledInputBlockIndex = -1;\r\n      let firstEmptyInputBlockIndex;  // TODO consider nested empty inputs\r\n      for (let bi=searchBlockIndex-1; bi >= 0; --bi) {\r\n        const block = this._blocks[bi];\r\n        const blockInputPos = block.nearestInputPos(block.value.length, DIRECTION.FORCE_LEFT);\r\n        if (!block.value || blockInputPos !== 0) firstEmptyInputBlockIndex = bi;\r\n        if (blockInputPos !== 0) {\r\n          if (blockInputPos !== block.value.length) {\r\n            // aligned inside block - return immediately\r\n            return this._blockStartPos(bi) + blockInputPos;\r\n          } else {\r\n            // found filled\r\n            firstFilledInputBlockIndex = bi;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n\r\n      if (direction === DIRECTION.LEFT) {\r\n        // try find first empty input before start searching position only when not forced\r\n        for (let bi=firstFilledInputBlockIndex+1; bi <= Math.min(searchBlockIndex, this._blocks.length-1); ++bi) {\r\n          const block = this._blocks[bi];\r\n          const blockInputPos = block.nearestInputPos(0, DIRECTION.NONE);\r\n          const blockAlignedPos = this._blockStartPos(bi) + blockInputPos;\r\n\r\n          if (blockAlignedPos > cursorPos) break;\r\n          // if block is not lazy input\r\n          if (blockInputPos !== block.value.length) return blockAlignedPos;\r\n        }\r\n      }\r\n\r\n      // process overflow\r\n      if (firstFilledInputBlockIndex >= 0) {\r\n        return this._blockStartPos(firstFilledInputBlockIndex) + this._blocks[firstFilledInputBlockIndex].value.length;\r\n      }\r\n\r\n      // for lazy if has aligned left inside fixed and has came to the start - use start position\r\n      if (\r\n        direction === DIRECTION.FORCE_LEFT ||\r\n        this.lazy && !this.extractInput() && !isInput(this._blocks[searchBlockIndex])\r\n      ) {\r\n        return 0;\r\n      }\r\n\r\n      if (firstEmptyInputBlockIndex != null) {\r\n        return this._blockStartPos(firstEmptyInputBlockIndex);\r\n      }\r\n\r\n      // find first input\r\n      for (let bi=searchBlockIndex; bi < this._blocks.length; ++bi) {\r\n        const block = this._blocks[bi];\r\n        const blockInputPos = block.nearestInputPos(0, DIRECTION.NONE);\r\n        // is input\r\n        if (!block.value.length || blockInputPos !== block.value.length) {\r\n          return this._blockStartPos(bi) + blockInputPos;\r\n        }\r\n      }\r\n\r\n      return 0;\r\n    }\r\n\r\n    if (direction === DIRECTION.RIGHT || direction === DIRECTION.FORCE_RIGHT) {\r\n      // ->\r\n      //  any|not-len-aligned and filled\r\n      //  any|not-len-aligned\r\n      // <-\r\n      //  not-0-aligned or start|any\r\n      let firstInputBlockAlignedIndex: ?number;\r\n      let firstInputBlockAlignedPos: ?number;\r\n      for (let bi=searchBlockIndex; bi < this._blocks.length; ++bi) {\r\n        const block = this._blocks[bi];\r\n        const blockInputPos = block.nearestInputPos(0, DIRECTION.NONE);\r\n        if (blockInputPos !== block.value.length) {\r\n          firstInputBlockAlignedPos = this._blockStartPos(bi) + blockInputPos;\r\n          firstInputBlockAlignedIndex = bi;\r\n          break;\r\n        }\r\n      }\r\n\r\n      if (firstInputBlockAlignedIndex != null && firstInputBlockAlignedPos != null) {\r\n        for (let bi=firstInputBlockAlignedIndex; bi < this._blocks.length; ++bi) {\r\n          const block = this._blocks[bi];\r\n          const blockInputPos = block.nearestInputPos(0, DIRECTION.FORCE_RIGHT);\r\n          if (blockInputPos !== block.value.length) {\r\n            return this._blockStartPos(bi) + blockInputPos;\r\n          }\r\n        }\r\n        return direction === DIRECTION.FORCE_RIGHT ?\r\n          this.value.length :\r\n          firstInputBlockAlignedPos;\r\n      }\r\n\r\n      for (let bi=Math.min(searchBlockIndex, this._blocks.length-1); bi >= 0; --bi) {\r\n        const block = this._blocks[bi];\r\n        const blockInputPos = block.nearestInputPos(block.value.length, DIRECTION.LEFT);\r\n        if (blockInputPos !== 0) {\r\n          const alignedPos = this._blockStartPos(bi) + blockInputPos;\r\n          if (alignedPos >= cursorPos) return alignedPos;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n\r\n    return cursorPos;\r\n  }\r\n\r\n  /** Get block by name */\r\n  maskedBlock (name: string): ?PatternBlock {\r\n    return this.maskedBlocks(name)[0];\r\n  }\r\n\r\n  /** Get all blocks by name */\r\n  maskedBlocks (name: string): Array<PatternBlock> {\r\n    const indices = this._maskedBlocks[name];\r\n    if (!indices) return [];\r\n    return indices.map(gi => this._blocks[gi]);\r\n  }\r\n}\r\nMaskedPattern.DEFAULTS = {\r\n  lazy: true,\r\n  placeholderChar: '_'\r\n};\r\nMaskedPattern.STOP_CHAR = '`';\r\nMaskedPattern.ESCAPE_CHAR = '\\\\';\r\nMaskedPattern.InputDefinition = PatternInputDefinition;\r\nMaskedPattern.FixedDefinition = PatternFixedDefinition;\r\n\r\nfunction isInput (block: PatternBlock): boolean {\r\n  if (!block) return false;\r\n\r\n  const value = block.value;\r\n  return !value || block.nearestInputPos(0, DIRECTION.NONE) !== value.length;\r\n}\r\n","// @flow\r\nimport MaskedPattern from './pattern.js';\r\nimport { type AppendFlags } from './base.js';\r\n\r\n\r\n/** Pattern which accepts ranges */\r\nexport default\r\nclass MaskedRange extends MaskedPattern {\r\n  /**\r\n    Optionally sets max length of pattern.\r\n    Used when pattern length is longer then `to` param length. Pads zeros at start in this case.\r\n  */\r\n  maxLength: number;\r\n  /** Min bound */\r\n  from: number;\r\n  /** Max bound */\r\n  to: number;\r\n  /** */\r\n  autofix: boolean;\r\n\r\n  get _matchFrom (): number {\r\n    return this.maxLength - String(this.from).length;\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  _update (opts: any) {  // TODO type\r\n    opts = {\r\n      to: this.to || 0,\r\n      from: this.from || 0,\r\n      ...opts,\r\n    };\r\n\r\n    let maxLength = String(opts.to).length;\r\n    if (opts.maxLength != null) maxLength = Math.max(maxLength, opts.maxLength);\r\n    opts.maxLength = maxLength;\r\n\r\n    const fromStr = String(opts.from).padStart(maxLength, '0');\r\n    const toStr = String(opts.to).padStart(maxLength, '0');\r\n    let sameCharsCount = 0;\r\n    while (sameCharsCount < toStr.length && toStr[sameCharsCount] === fromStr[sameCharsCount]) ++sameCharsCount;\r\n    opts.mask = toStr.slice(0, sameCharsCount).replace(/0/g, '\\\\0') + '0'.repeat(maxLength - sameCharsCount);\r\n\r\n    super._update(opts);\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  get isComplete (): boolean {\r\n    return super.isComplete && Boolean(this.value);\r\n  }\r\n\r\n  boundaries (str: string): [string, string] {\r\n    let minstr = '';\r\n    let maxstr = '';\r\n\r\n    const [, placeholder, num] = str.match(/^(\\D*)(\\d*)(\\D*)/) || [];\r\n    if (num) {\r\n      minstr = '0'.repeat(placeholder.length) + num;\r\n      maxstr = '9'.repeat(placeholder.length) + num;\r\n    }\r\n    minstr = minstr.padEnd(this.maxLength, '0');\r\n    maxstr = maxstr.padEnd(this.maxLength, '9');\r\n\r\n    return [minstr, maxstr];\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  doPrepare (str: string, flags: AppendFlags={}): string {\r\n    str = super.doPrepare(str, flags).replace(/\\D/g, '');\r\n    if (!this.autofix) return str;\r\n\r\n    const fromStr = String(this.from).padStart(this.maxLength, '0');\r\n    const toStr = String(this.to).padStart(this.maxLength, '0');\r\n\r\n    const val = this.value;\r\n    let prepStr = '';\r\n    for (let ci=0; ci<str.length; ++ci) {\r\n      const nextVal = val + prepStr + str[ci];\r\n      const [minstr, maxstr] = this.boundaries(nextVal);\r\n\r\n      if (Number(maxstr) < this.from) prepStr += fromStr[nextVal.length - 1];\r\n      else if (Number(minstr) > this.to) prepStr += toStr[nextVal.length - 1];\r\n      else prepStr += str[ci];\r\n    }\r\n\r\n    return prepStr;\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  doValidate (...args: *): boolean {\r\n    const str = this.value;\r\n\r\n    const firstNonZero = str.search(/[^0]/);\r\n    if (firstNonZero === -1 && str.length <= this._matchFrom) return true;\r\n\r\n    const [minstr, maxstr] = this.boundaries(str);\r\n\r\n    return this.from <= Number(maxstr) && Number(minstr) <= this.to &&\r\n      super.doValidate(...args);\r\n  }\r\n}\r\n","// @flow\r\nimport MaskedPattern from './pattern.js';\r\nimport MaskedRange from './range.js';\r\n\r\n\r\n/** Date mask */\r\nexport default\r\nclass MaskedDate extends MaskedPattern {\r\n  static GET_DEFAULT_BLOCKS: () => {[string]: any};\r\n  static DEFAULTS: any;\r\n\r\n  /** Parse string to Date */\r\n  parse: (string) => Date;\r\n  /** Format Date to string */\r\n  format: (Date) => string;\r\n  /** Pattern mask for date according to {@link MaskedDate#format} */\r\n  pattern: string;\r\n  /** Start date */\r\n  min: ?Date;\r\n  /** End date */\r\n  max: ?Date;\r\n  /** */\r\n  autofix: boolean;\r\n\r\n  /**\r\n    @param {Object} opts\r\n  */\r\n  constructor (opts: any) {\r\n    super({\r\n      ...MaskedDate.DEFAULTS,\r\n      ...opts\r\n    });\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  _update (opts: any) {\r\n    if (opts.mask === Date) delete opts.mask;\r\n    if (opts.pattern) opts.mask = opts.pattern;\r\n\r\n    const blocks = opts.blocks;\r\n    opts.blocks = Object.assign({}, MaskedDate.GET_DEFAULT_BLOCKS());\r\n    // adjust year block\r\n    if (opts.min) opts.blocks.Y.from = opts.min.getFullYear();\r\n    if (opts.max) opts.blocks.Y.to = opts.max.getFullYear();\r\n    if (opts.min && opts.max && opts.blocks.Y.from === opts.blocks.Y.to\r\n    ) {\r\n      opts.blocks.m.from = opts.min.getMonth() + 1;\r\n      opts.blocks.m.to = opts.max.getMonth() + 1;\r\n\r\n      if (opts.blocks.m.from === opts.blocks.m.to) {\r\n        opts.blocks.d.from = opts.min.getDate();\r\n        opts.blocks.d.to = opts.max.getDate();\r\n      }\r\n    }\r\n    Object.assign(opts.blocks, blocks);\r\n\r\n    // add autofix\r\n    Object.keys(opts.blocks).forEach(bk => {\r\n      const b = opts.blocks[bk];\r\n      if (!('autofix' in b)) b.autofix = opts.autofix;\r\n    });\r\n\r\n    super._update(opts);\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  doValidate (...args: *): boolean {\r\n    const date = this.date;\r\n\r\n    return super.doValidate(...args) &&\r\n      (!this.isComplete ||\r\n        this.isDateExist(this.value) && date != null &&\r\n        (this.min == null || this.min <= date) &&\r\n        (this.max == null || date <= this.max));\r\n  }\r\n\r\n  /** Checks if date is exists */\r\n  isDateExist (str: string): boolean {\r\n    return this.format(this.parse(str)) === str;\r\n  }\r\n\r\n  /** Parsed Date */\r\n  get date (): ?Date {\r\n    return this.isComplete ?\r\n      this.parse(this.value) :\r\n      null;\r\n  }\r\n  set date (date: Date) {\r\n    this.value = this.format(date);\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  get typedValue (): ?Date {\r\n    return this.date;\r\n  }\r\n  set typedValue (value: Date) {\r\n    this.date = value;\r\n  }\r\n}\r\nMaskedDate.DEFAULTS = {\r\n  pattern: 'd{.}`m{.}`Y',\r\n  format: date => {\r\n    const day = String(date.getDate()).padStart(2, '0');\r\n    const month = String(date.getMonth() + 1).padStart(2, '0');\r\n    const year = date.getFullYear();\r\n\r\n    return [day, month, year].join('.');\r\n  },\r\n  parse: str => {\r\n    const [day, month, year] = str.split('.');\r\n    return new Date(year, month - 1, day);\r\n  },\r\n};\r\nMaskedDate.GET_DEFAULT_BLOCKS = () => ({\r\n  d: {\r\n    mask: MaskedRange,\r\n    from: 1,\r\n    to: 31,\r\n    maxLength: 2,\r\n  },\r\n  m: {\r\n    mask: MaskedRange,\r\n    from: 1,\r\n    to: 12,\r\n    maxLength: 2,\r\n  },\r\n  Y: {\r\n    mask: MaskedRange,\r\n    from: 1900,\r\n    to: 9999,\r\n  }\r\n});\r\n","// @flow\r\n\r\nexport\r\ntype ElementEvent =\r\n  'selectionChange' |\r\n  'input' |\r\n  'drop' |\r\n  'click' |\r\n  'focus' |\r\n  'commit';\r\n\r\n/**\r\n  Generic element API to use with mask\r\n  @interface\r\n*/\r\nexport default\r\nclass MaskElement {\r\n  /** */\r\n  +_unsafeSelectionStart: number;\r\n  /** */\r\n  +_unsafeSelectionEnd: number;\r\n  /** */\r\n  value: string;\r\n\r\n  /** Safely returns selection start */\r\n  get selectionStart (): number {\r\n    let start;\r\n    try {\r\n      start = this._unsafeSelectionStart;\r\n    } catch (e) {}\r\n\r\n    return start != null ?\r\n      start :\r\n      this.value.length;\r\n  }\r\n\r\n  /** Safely returns selection end */\r\n  get selectionEnd (): number {\r\n    let end;\r\n    try {\r\n      end = this._unsafeSelectionEnd;\r\n    } catch (e) {}\r\n\r\n    return end != null ?\r\n      end :\r\n      this.value.length;\r\n  }\r\n\r\n  /** Safely sets element selection */\r\n  select (start: number, end: number) {\r\n    if (start == null || end == null ||\r\n      start === this.selectionStart && end === this.selectionEnd) return;\r\n\r\n    try {\r\n      this._unsafeSelect(start, end);\r\n    } catch (e) {}\r\n  }\r\n\r\n  /** Should be overriden in subclasses */\r\n  _unsafeSelect (start: number, end: number): void {}\r\n  /** Should be overriden in subclasses */\r\n  get isActive (): boolean { return false; }\r\n  /** Should be overriden in subclasses */\r\n  bindEvents (handlers: {[ElementEvent]: Function}) {}\r\n  /** Should be overriden in subclasses */\r\n  unbindEvents (): void {}\r\n}\r\n","// @flow\r\nimport MaskElement, {type ElementEvent} from './mask-element.js';\r\n\r\n\r\n/** Bridge between HTMLElement and {@link Masked} */\r\nexport default\r\nclass HTMLMaskElement extends MaskElement {\r\n  /** Mapping between HTMLElement events and mask internal events */\r\n  static EVENTS_MAP: {[ElementEvent]: string};\r\n  /** HTMLElement to use mask on */\r\n  input: HTMLTextAreaElement | HTMLInputElement;\r\n  _handlers: {[string]: Function};\r\n\r\n  /**\r\n    @param {HTMLInputElement|HTMLTextAreaElement} input\r\n  */\r\n  constructor (input: HTMLTextAreaElement | HTMLInputElement) {\r\n    super();\r\n    this.input = input;\r\n    this._handlers = {};\r\n  }\r\n\r\n  /**\r\n    Is element in focus\r\n    @readonly\r\n  */\r\n  get isActive (): boolean {\r\n    return this.input === document.activeElement;\r\n  }\r\n\r\n  /**\r\n    Returns HTMLElement selection start\r\n    @override\r\n  */\r\n  get _unsafeSelectionStart (): number {\r\n    return this.input.selectionStart;\r\n  }\r\n\r\n  /**\r\n    Returns HTMLElement selection end\r\n    @override\r\n  */\r\n  get _unsafeSelectionEnd (): number {\r\n    return this.input.selectionEnd;\r\n  }\r\n\r\n  /**\r\n    Sets HTMLElement selection\r\n    @override\r\n  */\r\n  _unsafeSelect (start: number, end: number) {\r\n    this.input.setSelectionRange(start, end);\r\n  }\r\n\r\n  /**\r\n    HTMLElement value\r\n    @override\r\n  */\r\n  get value (): string {\r\n    return this.input.value;\r\n  }\r\n  set value (value: string) {\r\n    this.input.value = value;\r\n  }\r\n\r\n  /**\r\n    Binds HTMLElement events to mask internal events\r\n    @override\r\n  */\r\n  bindEvents (handlers: {[ElementEvent]: Function}) {\r\n    Object.keys(handlers)\r\n      .forEach(event => this._toggleEventHandler(HTMLMaskElement.EVENTS_MAP[event], handlers[event]));\r\n  }\r\n\r\n  /**\r\n    Unbinds HTMLElement events to mask internal events\r\n    @override\r\n  */\r\n  unbindEvents () {\r\n    Object.keys(this._handlers)\r\n      .forEach(event => this._toggleEventHandler(event));\r\n  }\r\n\r\n  /** */\r\n  _toggleEventHandler (event: string, handler?: Function): void {\r\n    if (this._handlers[event]) {\r\n      this.input.removeEventListener(event, this._handlers[event]);\r\n      delete this._handlers[event];\r\n    }\r\n\r\n    if (handler) {\r\n      this.input.addEventListener(event, handler);\r\n      this._handlers[event] = handler;\r\n    }\r\n  }\r\n}\r\nHTMLMaskElement.EVENTS_MAP = {\r\n  selectionChange: 'keydown',\r\n  input: 'input',\r\n  drop: 'drop',\r\n  click: 'click',\r\n  focus: 'focus',\r\n  commit: 'blur',\r\n};\r\n","// @flow\r\nimport {objectIncludes, DIRECTION, type Selection} from '../core/utils.js';\r\nimport ActionDetails from '../core/action-details.js';\r\nimport MaskedDate from '../masked/date.js';\r\nimport createMask, {maskedClass} from '../masked/factory.js';\r\nimport type Masked from '../masked/base.js';\r\nimport {type Mask} from '../masked/base.js';\r\nimport MaskElement from './mask-element.js';\r\nimport HTMLMaskElement from './html-mask-element.js';\r\n\r\n\r\n/** Listens to element events and controls changes between element and {@link Masked} */\r\nexport default\r\nclass InputMask {\r\n  /**\r\n    View element\r\n    @readonly\r\n  */\r\n  el: MaskElement;\r\n\r\n  /**\r\n    Internal {@link Masked} model\r\n    @readonly\r\n  */\r\n  masked: Masked<*>;\r\n  alignCursor: () => void;\r\n  alignCursorFriendly: () => void;\r\n\r\n  _listeners: {[string]: Array<Function>};\r\n  _value: string;\r\n  _changingCursorPos: number;\r\n  _unmaskedValue: string;\r\n  _saveSelection: (?Event) => void;\r\n  _selection: Selection;\r\n  _onInput: () => void;\r\n  _onChange: () => void;\r\n  _onDrop: (Event) => void;\r\n  _onFocus: (Event) => void;\r\n  _cursorChanging: TimeoutID;\r\n\r\n  /**\r\n    @param {MaskElement|HTMLInputElement|HTMLTextAreaElement} el\r\n    @param {Object} opts\r\n  */\r\n  constructor (el: MaskElement | HTMLTextAreaElement | HTMLInputElement, opts: {[string]: any}) {\r\n    this.el = (el instanceof MaskElement) ?\r\n      el :\r\n      new HTMLMaskElement(el);\r\n    this.masked = createMask(opts);\r\n\r\n    this._listeners = {};\r\n    this._value = '';\r\n    this._unmaskedValue = '';\r\n\r\n    this._saveSelection = this._saveSelection.bind(this);\r\n    this._onInput = this._onInput.bind(this);\r\n    this._onChange = this._onChange.bind(this);\r\n    this._onDrop = this._onDrop.bind(this);\r\n    this._onFocus = this._onFocus.bind(this);\r\n    this.alignCursor = this.alignCursor.bind(this);\r\n    this.alignCursorFriendly = this.alignCursorFriendly.bind(this);\r\n\r\n    this._bindEvents();\r\n\r\n    // refresh\r\n    this.updateValue();\r\n    this._onChange();\r\n  }\r\n\r\n  /** Read or update mask */\r\n  get mask (): Mask {\r\n    return this.masked.mask;\r\n  }\r\n\r\n  maskEquals (mask: Mask) {\r\n    return mask == null ||\r\n      mask === this.masked.mask ||\r\n      mask === Date && this.masked instanceof MaskedDate;\r\n  }\r\n\r\n  set mask (mask: Mask) {\r\n    if (this.maskEquals(mask)) return;\r\n\r\n    if (this.masked.constructor === maskedClass(mask)) {\r\n      this.masked.updateOptions({mask});\r\n      return;\r\n    }\r\n\r\n    const masked = createMask({mask});\r\n    masked.unmaskedValue = this.masked.unmaskedValue;\r\n    this.masked = masked;\r\n  }\r\n\r\n  /** Raw value */\r\n  get value (): string {\r\n    return this._value;\r\n  }\r\n\r\n  set value (str: string) {\r\n    this.masked.value = str;\r\n    this.updateControl();\r\n    this.alignCursor();\r\n  }\r\n\r\n  /** Unmasked value */\r\n  get unmaskedValue (): string {\r\n    return this._unmaskedValue;\r\n  }\r\n\r\n  set unmaskedValue (str: string) {\r\n    this.masked.unmaskedValue = str;\r\n    this.updateControl();\r\n    this.alignCursor();\r\n  }\r\n\r\n  /** Typed unmasked value */\r\n  get typedValue (): any {\r\n    return this.masked.typedValue;\r\n  }\r\n\r\n  set typedValue (val: any) {\r\n    this.masked.typedValue = val;\r\n    this.updateControl();\r\n    this.alignCursor();\r\n  }\r\n\r\n  /**\r\n    Starts listening to element events\r\n    @protected\r\n  */\r\n  _bindEvents () {\r\n    this.el.bindEvents({\r\n      selectionChange: this._saveSelection,\r\n      input: this._onInput,\r\n      drop: this._onDrop,\r\n      click: this.alignCursorFriendly,\r\n      focus: this._onFocus,\r\n      commit: this._onChange,\r\n    });\r\n  }\r\n\r\n  /**\r\n    Stops listening to element events\r\n    @protected\r\n   */\r\n  _unbindEvents () {\r\n    this.el.unbindEvents();\r\n  }\r\n\r\n  /**\r\n    Fires custom event\r\n    @protected\r\n   */\r\n  _fireEvent (ev: string) {\r\n    const listeners = this._listeners[ev];\r\n    if (!listeners) return;\r\n\r\n    listeners.forEach(l => l());\r\n  }\r\n\r\n  /**\r\n    Current selection start\r\n    @readonly\r\n  */\r\n  get selectionStart (): number {\r\n    return this._cursorChanging ?\r\n      this._changingCursorPos :\r\n\r\n      this.el.selectionStart;\r\n  }\r\n\r\n  /** Current cursor position */\r\n  get cursorPos (): number {\r\n    return this._cursorChanging ?\r\n      this._changingCursorPos :\r\n\r\n      this.el.selectionEnd;\r\n  }\r\n  set cursorPos (pos: number) {\r\n    if (!this.el.isActive) return;\r\n\r\n    this.el.select(pos, pos);\r\n    this._saveSelection();\r\n  }\r\n\r\n  /**\r\n    Stores current selection\r\n    @protected\r\n  */\r\n  _saveSelection (/* ev */) {\r\n    if (this.value !== this.el.value) {\r\n      console.warn('Element value was changed outside of mask. Syncronize mask using `mask.updateValue()` to work properly.'); // eslint-disable-line no-console\r\n    }\r\n    this._selection = {\r\n      start: this.selectionStart,\r\n      end: this.cursorPos\r\n    };\r\n  }\r\n\r\n  /** Syncronizes model value from view */\r\n  updateValue () {\r\n    this.masked.value = this.el.value;\r\n    this._value = this.masked.value;\r\n  }\r\n\r\n  /** Syncronizes view from model value, fires change events */\r\n  updateControl () {\r\n    const newUnmaskedValue = this.masked.unmaskedValue;\r\n    const newValue = this.masked.value;\r\n    const isChanged = (this.unmaskedValue !== newUnmaskedValue ||\r\n      this.value !== newValue);\r\n\r\n    this._unmaskedValue = newUnmaskedValue;\r\n    this._value = newValue;\r\n\r\n    if (this.el.value !== newValue) this.el.value = newValue;\r\n    if (isChanged) this._fireChangeEvents();\r\n  }\r\n\r\n  /** Updates options with deep equal check, recreates @{link Masked} model if mask type changes */\r\n  updateOptions (opts: {[string]: any}) {\r\n    const { mask, ...restOpts } = opts;\r\n\r\n    const updateMask = !this.maskEquals(mask);\r\n    const updateOpts = !objectIncludes(this.masked, restOpts);\r\n\r\n    if (updateMask) this.mask = mask;\r\n    if (updateOpts) this.masked.updateOptions(restOpts);\r\n\r\n    if (updateMask || updateOpts) this.updateControl();\r\n  }\r\n\r\n  /** Updates cursor */\r\n  updateCursor (cursorPos: number) {\r\n    if (cursorPos == null) return;\r\n    this.cursorPos = cursorPos;\r\n\r\n    // also queue change cursor for mobile browsers\r\n    this._delayUpdateCursor(cursorPos);\r\n  }\r\n\r\n  /**\r\n    Delays cursor update to support mobile browsers\r\n    @private\r\n  */\r\n  _delayUpdateCursor (cursorPos: number) {\r\n    this._abortUpdateCursor();\r\n    this._changingCursorPos = cursorPos;\r\n    this._cursorChanging = setTimeout(() => {\r\n      if (!this.el) return; // if was destroyed\r\n      this.cursorPos = this._changingCursorPos;\r\n      this._abortUpdateCursor();\r\n    }, 10);\r\n  }\r\n\r\n  /**\r\n    Fires custom events\r\n    @protected\r\n  */\r\n  _fireChangeEvents () {\r\n    this._fireEvent('accept');\r\n    if (this.masked.isComplete) this._fireEvent('complete');\r\n  }\r\n\r\n  /**\r\n    Aborts delayed cursor update\r\n    @private\r\n  */\r\n  _abortUpdateCursor () {\r\n    if (this._cursorChanging) {\r\n      clearTimeout(this._cursorChanging);\r\n      delete this._cursorChanging;\r\n    }\r\n  }\r\n\r\n  /** Aligns cursor to nearest available position */\r\n  alignCursor () {\r\n    this.cursorPos = this.masked.nearestInputPos(this.cursorPos, DIRECTION.LEFT);\r\n  }\r\n\r\n  /** Aligns cursor only if selection is empty */\r\n  alignCursorFriendly () {\r\n    if (this.selectionStart !== this.cursorPos) return;  // skip if range is selected\r\n    this.alignCursor();\r\n  }\r\n\r\n  /** Adds listener on custom event */\r\n  on (ev: string, handler: Function) {\r\n    if (!this._listeners[ev]) this._listeners[ev] = [];\r\n    this._listeners[ev].push(handler);\r\n    return this;\r\n  }\r\n\r\n  /** Removes custom event listener */\r\n  off (ev: string, handler: Function) {\r\n    if (!this._listeners[ev]) return this;\r\n    if (!handler) {\r\n      delete this._listeners[ev];\r\n      return this;\r\n    }\r\n    const hIndex = this._listeners[ev].indexOf(handler);\r\n    if (hIndex >= 0) this._listeners[ev].splice(hIndex, 1);\r\n    return this;\r\n  }\r\n\r\n  /** Handles view input event */\r\n  _onInput () {\r\n    this._abortUpdateCursor();\r\n\r\n    // fix strange IE behavior\r\n    if (!this._selection) return this.updateValue();\r\n\r\n    const details = new ActionDetails(\r\n      // new state\r\n      this.el.value, this.cursorPos,\r\n      // old state\r\n      this.value, this._selection);\r\n\r\n    const oldRawValue = this.masked.rawInputValue;\r\n\r\n    const offset = this.masked.splice(\r\n      details.startChangePos,\r\n      details.removed.length,\r\n      details.inserted,\r\n      details.removeDirection).offset;\r\n\r\n    // force align in remove direction only if no input chars were removed\r\n    // otherwise we still need to align with NONE (to get out from fixed symbols for instance)\r\n    const removeDirection = oldRawValue === this.masked.rawInputValue ?\r\n      details.removeDirection :\r\n      DIRECTION.NONE;\r\n\r\n    const cursorPos = this.masked.nearestInputPos(\r\n      details.startChangePos + offset,\r\n      removeDirection,\r\n    );\r\n\r\n    this.updateControl();\r\n    this.updateCursor(cursorPos);\r\n  }\r\n\r\n  /** Handles view change event and commits model value */\r\n  _onChange () {\r\n    if (this.value !== this.el.value) {\r\n      this.updateValue();\r\n    }\r\n    this.masked.doCommit();\r\n    this.updateControl();\r\n    this._saveSelection();\r\n  }\r\n\r\n  /** Handles view drop event, prevents by default */\r\n  _onDrop (ev: Event) {\r\n    ev.preventDefault();\r\n    ev.stopPropagation();\r\n  }\r\n\r\n  /** Restore last selection on focus */\r\n  _onFocus (ev: Event) {\r\n    if (this.selectionStart !== this.cursorPos) return;  // skip if range is selected\r\n    if (this._selection) this.cursorPos = this._selection.end;\r\n    this.alignCursorFriendly();\r\n  }\r\n\r\n  /** Unbind view events and removes element reference */\r\n  destroy () {\r\n    this._unbindEvents();\r\n    // $FlowFixMe why not do so?\r\n    this._listeners.length = 0;\r\n    delete this.el;\r\n  }\r\n}\r\n","// @flow\r\nimport MaskedPattern from './pattern.js';\r\n\r\n\r\n/** Pattern which validates enum values */\r\nexport default\r\nclass MaskedEnum extends MaskedPattern {\r\n  enum: Array<string>;\r\n\r\n  /**\r\n    @override\r\n    @param {Object} opts\r\n  */\r\n  _update (opts: any) {  // TODO type\r\n    if (opts.enum) opts.mask = '*'.repeat(opts.enum[0].length);\r\n\r\n    super._update(opts);\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  doValidate (...args: *): boolean {\r\n    return this.enum.some(e => e.indexOf(this.unmaskedValue) >= 0) &&\r\n      super.doValidate(...args);\r\n  }\r\n}\r\n","// @flow\r\nimport {escapeRegExp, indexInDirection, posInDirection, type Direction, DIRECTION} from '../core/utils.js';\r\nimport ChangeDetails from '../core/change-details.js';\r\n\r\nimport Masked, {type MaskedOptions, type ExtractFlags, type AppendFlags} from './base.js';\r\n\r\n\r\ntype MaskedNumberOptions = {\r\n  ...MaskedOptions<Number>,\r\n  radix: $PropertyType<MaskedNumber, 'radix'>,\r\n  thousandsSeparator: $PropertyType<MaskedNumber, 'thousandsSeparator'>,\r\n  mapToRadix: $PropertyType<MaskedNumber, 'mapToRadix'>,\r\n  scale: $PropertyType<MaskedNumber, 'scale'>,\r\n  signed: $PropertyType<MaskedNumber, 'signed'>,\r\n  normalizeZeros: $PropertyType<MaskedNumber, 'normalizeZeros'>,\r\n  padFractionalZeros: $PropertyType<MaskedNumber, 'padFractionalZeros'>,\r\n};\r\n\r\n/**\r\n  Number mask\r\n  @param {Object} opts\r\n  @param {string} opts.radix - Single char\r\n  @param {string} opts.thousandsSeparator - Single char\r\n  @param {Array<string>} opts.mapToRadix - Array of single chars\r\n  @param {number} opts.min\r\n  @param {number} opts.max\r\n  @param {number} opts.scale - Digits after point\r\n  @param {boolean} opts.signed - Allow negative\r\n  @param {boolean} opts.normalizeZeros - Flag to remove leading and trailing zeros in the end of editing\r\n  @param {boolean} opts.padFractionalZeros - Flag to pad trailing zeros after point in the end of editing\r\n*/\r\nexport default\r\nclass MaskedNumber extends Masked<Class<Number>> {\r\n  static DEFAULTS: $Shape<MaskedNumberOptions>;\r\n\r\n  /** Single char */\r\n  radix: string;\r\n  /** Single char */\r\n  thousandsSeparator: string;\r\n  /** Array of single chars */\r\n  mapToRadix: Array<string>;\r\n  /** */\r\n  min: number;\r\n  /** */\r\n  max: number;\r\n  /** Digits after point */\r\n  scale: number;\r\n  /** */\r\n  signed: boolean;\r\n  /** Flag to remove leading and trailing zeros in the end of editing */\r\n  normalizeZeros: boolean;\r\n  /** Flag to pad trailing zeros after point in the end of editing */\r\n  padFractionalZeros: boolean;\r\n  _numberRegExp: RegExp;\r\n  _numberRegExpInput: RegExp;\r\n  _thousandsSeparatorRegExp: RegExp;\r\n  _mapToRadixRegExp: RegExp;\r\n  _separatorsProcessed: boolean;\r\n\r\n  constructor (opts: $Shape<MaskedNumberOptions>) {\r\n    super({\r\n      ...MaskedNumber.DEFAULTS,\r\n      ...opts\r\n    });\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  _update (opts: MaskedNumberOptions) {\r\n    super._update(opts);\r\n    this._updateRegExps();\r\n  }\r\n\r\n  /** */\r\n  _updateRegExps () {\r\n    // use different regexp to process user input (more strict, input suffix) and tail shifting\r\n    let start = '^' + (this.allowNegative ? '[+|\\\\-]?' : '');\r\n    let midInput = '(0|([1-9]+\\\\d*))?';\r\n    let mid = '\\\\d*';\r\n\r\n    let end = (this.scale ?\r\n      '(' + escapeRegExp(this.radix) + '\\\\d{0,' + this.scale + '})?' :\r\n      '') + '$';\r\n\r\n    this._numberRegExpInput = new RegExp(start + midInput + end);\r\n    this._numberRegExp = new RegExp(start + mid + end);\r\n    this._mapToRadixRegExp = new RegExp('[' +\r\n      this.mapToRadix.map(escapeRegExp).join('') +\r\n    ']', 'g');\r\n    this._thousandsSeparatorRegExp = new RegExp(escapeRegExp(this.thousandsSeparator), 'g');\r\n  }\r\n\r\n  /** */\r\n  _removeThousandsSeparators (value: string): string {\r\n    return value.replace(this._thousandsSeparatorRegExp, '');\r\n  }\r\n\r\n  /** */\r\n  _insertThousandsSeparators (value: string): string {\r\n    // https://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript\r\n    const parts = value.split(this.radix);\r\n    parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, this.thousandsSeparator);\r\n    return parts.join(this.radix);\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  doPrepare (str: string, ...args: *) {\r\n    return super.doPrepare(this._removeThousandsSeparators(str.replace(this._mapToRadixRegExp, this.radix)), ...args);\r\n  }\r\n\r\n  /** */\r\n  _separatorsCount (to: number, extendOnSeparators: boolean=false): number {\r\n    let count = 0;\r\n\r\n    for (let pos = 0; pos < to; ++pos) {\r\n      if (this._value.indexOf(this.thousandsSeparator, pos) === pos) {\r\n        ++count;\r\n        if (extendOnSeparators) to += this.thousandsSeparator.length;\r\n      }\r\n    }\r\n\r\n    return count;\r\n  }\r\n\r\n  /** */\r\n  _separatorsCountFromSlice (slice: string=this._value): number {\r\n    return this._separatorsCount(this._removeThousandsSeparators(slice).length, true);\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  extractInput (fromPos?: number=0, toPos?: number=this.value.length, flags?: ExtractFlags): string {\r\n    [fromPos, toPos] = this._adjustRangeWithSeparators(fromPos, toPos);\r\n\r\n    return this._removeThousandsSeparators(super.extractInput(fromPos, toPos, flags));\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  _appendCharRaw (ch: string, flags: AppendFlags={}): ChangeDetails {\r\n    if (!this.thousandsSeparator) return super._appendCharRaw(ch, flags);\r\n\r\n    const prevBeforeTailValue = flags.tail && flags._beforeTailState ?\r\n      flags._beforeTailState._value :\r\n      this._value;\r\n    const prevBeforeTailSeparatorsCount = this._separatorsCountFromSlice(prevBeforeTailValue);\r\n    this._value = this._removeThousandsSeparators(this.value);\r\n\r\n    const appendDetails = super._appendCharRaw(ch, flags);\r\n\r\n    this._value = this._insertThousandsSeparators(this._value);\r\n    const beforeTailValue = flags.tail && flags._beforeTailState ?\r\n      flags._beforeTailState._value :\r\n      this._value;\r\n    const beforeTailSeparatorsCount = this._separatorsCountFromSlice(beforeTailValue);\r\n\r\n    appendDetails.tailShift += (beforeTailSeparatorsCount - prevBeforeTailSeparatorsCount) * this.thousandsSeparator.length;\r\n    return appendDetails;\r\n  }\r\n\r\n  /** */\r\n  _findSeparatorAround (pos: number): number {\r\n    if (this.thousandsSeparator) {\r\n      const searchFrom = pos - this.thousandsSeparator.length + 1;\r\n      const separatorPos = this.value.indexOf(this.thousandsSeparator, searchFrom);\r\n      if (separatorPos <= pos) return separatorPos;\r\n    }\r\n\r\n    return -1;\r\n  }\r\n\r\n  _adjustRangeWithSeparators (from: number, to: number): [number, number] {\r\n    const separatorAroundFromPos = this._findSeparatorAround(from);\r\n    if (separatorAroundFromPos >= 0) from = separatorAroundFromPos;\r\n\r\n    const separatorAroundToPos = this._findSeparatorAround(to);\r\n    if (separatorAroundToPos >= 0) to = separatorAroundToPos + this.thousandsSeparator.length;\r\n    return [from, to];\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  remove (fromPos?: number=0, toPos?: number=this.value.length): ChangeDetails {\r\n    [fromPos, toPos] = this._adjustRangeWithSeparators(fromPos, toPos);\r\n\r\n    const valueBeforePos = this.value.slice(0, fromPos);\r\n    const valueAfterPos = this.value.slice(toPos);\r\n\r\n    const prevBeforeTailSeparatorsCount = this._separatorsCount(valueBeforePos.length);\r\n    this._value = this._insertThousandsSeparators(this._removeThousandsSeparators(valueBeforePos + valueAfterPos));\r\n    const beforeTailSeparatorsCount = this._separatorsCountFromSlice(valueBeforePos);\r\n\r\n    return new ChangeDetails({\r\n      tailShift: (beforeTailSeparatorsCount - prevBeforeTailSeparatorsCount) * this.thousandsSeparator.length,\r\n    });\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  nearestInputPos (cursorPos: number, direction?: Direction): number {\r\n    if (!this.thousandsSeparator) return cursorPos;\r\n\r\n    switch (direction) {\r\n      case DIRECTION.NONE:\r\n      case DIRECTION.LEFT:\r\n      case DIRECTION.FORCE_LEFT: {\r\n        const separatorAtLeftPos = this._findSeparatorAround(cursorPos - 1);\r\n        if (separatorAtLeftPos >= 0) {\r\n          const separatorAtLeftEndPos = separatorAtLeftPos + this.thousandsSeparator.length;\r\n          if (cursorPos < separatorAtLeftEndPos ||\r\n            this.value.length <= separatorAtLeftEndPos ||\r\n            direction === DIRECTION.FORCE_LEFT\r\n          ) {\r\n            return separatorAtLeftPos;\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case DIRECTION.RIGHT:\r\n      case DIRECTION.FORCE_RIGHT: {\r\n        const separatorAtRightPos = this._findSeparatorAround(cursorPos);\r\n        if (separatorAtRightPos >= 0) {\r\n          return separatorAtRightPos + this.thousandsSeparator.length;\r\n        }\r\n      }\r\n    }\r\n\r\n    return cursorPos;\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  doValidate (flags: AppendFlags) {\r\n    const regexp = flags.input ? this._numberRegExpInput : this._numberRegExp;\r\n\r\n    // validate as string\r\n    let valid = regexp.test(this._removeThousandsSeparators(this.value));\r\n\r\n    if (valid) {\r\n      // validate as number\r\n      const number = this.number;\r\n      valid = valid && !isNaN(number) &&\r\n        // check min bound for negative values\r\n        (this.min == null || this.min >= 0 || this.min <= this.number) &&\r\n        // check max bound for positive values\r\n        (this.max == null || this.max <= 0 || this.number <= this.max);\r\n    }\r\n\r\n    return valid && super.doValidate(flags);\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  doCommit () {\r\n    if (this.value) {\r\n      const number = this.number;\r\n      let validnum = number;\r\n\r\n      // check bounds\r\n      if (this.min != null) validnum = Math.max(validnum, this.min);\r\n      if (this.max != null) validnum = Math.min(validnum, this.max);\r\n\r\n      if (validnum !== number) this.unmaskedValue = String(validnum);\r\n\r\n      let formatted = this.value;\r\n\r\n      if (this.normalizeZeros) formatted = this._normalizeZeros(formatted);\r\n      if (this.padFractionalZeros) formatted = this._padFractionalZeros(formatted);\r\n\r\n      this._value = formatted;\r\n    }\r\n\r\n    super.doCommit();\r\n  }\r\n\r\n  /** */\r\n  _normalizeZeros (value: string): string {\r\n    const parts = this._removeThousandsSeparators(value).split(this.radix);\r\n\r\n    // remove leading zeros\r\n    parts[0] = parts[0].replace(/^(\\D*)(0*)(\\d*)/, (match, sign, zeros, num) => sign + num);\r\n    // add leading zero\r\n    if (value.length && !/\\d$/.test(parts[0])) parts[0] = parts[0] + '0';\r\n\r\n    if (parts.length > 1) {\r\n      parts[1] = parts[1].replace(/0*$/, '');  // remove trailing zeros\r\n      if (!parts[1].length) parts.length = 1;  // remove fractional\r\n    }\r\n\r\n    return this._insertThousandsSeparators(parts.join(this.radix));\r\n  }\r\n\r\n  /** */\r\n  _padFractionalZeros (value: string): string {\r\n    if (!value) return value;\r\n\r\n    const parts = value.split(this.radix);\r\n    if (parts.length < 2) parts.push('');\r\n    parts[1] = parts[1].padEnd(this.scale, '0');\r\n    return parts.join(this.radix);\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  get unmaskedValue (): string {\r\n    return this._removeThousandsSeparators(\r\n      this._normalizeZeros(\r\n        this.value))\r\n      .replace(this.radix, '.');\r\n  }\r\n\r\n  set unmaskedValue (unmaskedValue: string) {\r\n    super.unmaskedValue = unmaskedValue.replace('.', this.radix);\r\n  }\r\n\r\n  /** Parsed Number */\r\n  get number (): number {\r\n    return Number(this.unmaskedValue);\r\n  }\r\n\r\n  set number (number: number) {\r\n    this.unmaskedValue = String(number);\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  get typedValue (): number {\r\n    return this.number;\r\n  }\r\n\r\n  set typedValue (value: number) {\r\n    this.number = value;\r\n  }\r\n\r\n  /**\r\n    Is negative allowed\r\n    @readonly\r\n  */\r\n  get allowNegative (): boolean {\r\n    return this.signed ||\r\n      (this.min != null && this.min < 0) ||\r\n      (this.max != null && this.max < 0);\r\n  }\r\n}\r\nMaskedNumber.DEFAULTS = {\r\n  radix: ',',\r\n  thousandsSeparator: '',\r\n  mapToRadix: ['.'],\r\n  scale: 2,\r\n  signed: false,\r\n  normalizeZeros: true,\r\n  padFractionalZeros: false,\r\n};\r\n","// @flow\r\nimport Masked, {type MaskedOptions} from './base.js';\r\n\r\n\r\n/** Masking by RegExp */\r\nexport default\r\nclass MaskedRegExp extends Masked<RegExp> {\r\n  /**\r\n    @override\r\n    @param {Object} opts\r\n  */\r\n  _update (opts: $Shape<MaskedOptions<RegExp>>) {\r\n    if (opts.mask) opts.validate = (value) => value.search(opts.mask) >= 0;\r\n    super._update(opts);\r\n  }\r\n}\r\n","// @flow\r\nimport Masked, {type MaskedOptions} from './base.js';\r\n\r\n\r\n/** Masking by custom Function */\r\nexport default\r\nclass MaskedFunction extends Masked<Function> {\r\n  /**\r\n    @override\r\n    @param {Object} opts\r\n  */\r\n  _update (opts: MaskedOptions<Function>) {\r\n    if (opts.mask) opts.validate = opts.mask;\r\n    super._update(opts);\r\n  }\r\n}\r\n","// @flow\r\nimport ChangeDetails from '../core/change-details.js';\r\nimport createMask from './factory.js';\r\nimport Masked, {type AppendFlags, type MaskedState} from './base.js';\r\nimport { type TailDetails } from '../core/tail-details.js';\r\n\r\n\r\ntype MaskedDynamicState = {|\r\n  ...MaskedState,\r\n  _rawInputValue: string,\r\n  compiledMasks: Array<*>,\r\n  currentMaskRef: ?Masked<*>,\r\n  currentMask: *,\r\n|};\r\n\r\ntype DynamicMaskType = Array<{[string]: any}>;\r\n/** Dynamic mask for choosing apropriate mask in run-time */\r\nexport default\r\nclass MaskedDynamic extends Masked<DynamicMaskType> {\r\n  /** Currently chosen mask */\r\n  currentMask: ?Masked<*>;\r\n  /** Compliled {@link Masked} options */\r\n  compiledMasks: Array<Masked<*>>;\r\n  /** Chooses {@link Masked} depending on input value */\r\n  dispatch: (string, Masked<*>, AppendFlags) => Masked<*>;\r\n\r\n  /**\r\n    @param {Object} opts\r\n  */\r\n  constructor (opts: any) {\r\n    super({\r\n      ...MaskedDynamic.DEFAULTS,\r\n      ...opts\r\n    });\r\n\r\n    this.currentMask = null;\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  _update (opts: any) {\r\n    super._update(opts);\r\n    if ('mask' in opts) {\r\n      // mask could be totally dynamic with only `dispatch` option\r\n      this.compiledMasks = Array.isArray(opts.mask) ?\r\n        opts.mask.map(m => createMask(m)) :\r\n        [];\r\n    }\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  _appendCharRaw (...args: *): ChangeDetails {\r\n    const details = this._applyDispatch(...args);\r\n\r\n    if (this.currentMask) {\r\n      details.aggregate(this.currentMask._appendChar(...args));\r\n    }\r\n\r\n    return details;\r\n  }\r\n\r\n  _applyDispatch (appended: string='', flags: AppendFlags={}) {\r\n    const prevValueBeforeTail = flags.tail && flags._beforeTailState != null ?\r\n      flags._beforeTailState._value :\r\n      this.value;\r\n    const inputValue = this.rawInputValue;\r\n    const insertValue = flags.tail && flags._beforeTailState != null ?\r\n      // $FlowFixMe - tired to fight with type system\r\n      flags._beforeTailState._rawInputValue :\r\n      inputValue;\r\n    const tailValue = inputValue.slice(insertValue.length);\r\n    const prevMask = this.currentMask;\r\n    const details = new ChangeDetails();\r\n\r\n    const prevMaskState = prevMask && prevMask.state;\r\n\r\n    // clone flags to prevent overwriting `_beforeTailState`\r\n    this.currentMask = this.doDispatch(appended, { ...flags });\r\n\r\n    // restore state after dispatch\r\n    if (this.currentMask) {\r\n      if (this.currentMask !== prevMask) {\r\n        // if mask changed reapply input\r\n        this.currentMask.reset();\r\n\r\n        // $FlowFixMe - it's ok, we don't change current mask above\r\n        const d = this.currentMask.append(insertValue, {raw: true});\r\n        details.tailShift = d.inserted.length - prevValueBeforeTail.length;\r\n\r\n        if (tailValue) {\r\n          // $FlowFixMe - it's ok, we don't change current mask above\r\n          details.tailShift += this.currentMask.append(tailValue, {raw: true, tail: true}).tailShift;\r\n        }\r\n      } else {\r\n        // Dispatch can do something bad with state, so\r\n        // restore prev mask state\r\n        this.currentMask.state = prevMaskState;\r\n      }\r\n    }\r\n\r\n    return details;\r\n  }\r\n\r\n  _appendPlaceholder (...args: *) {\r\n    const details = this._applyDispatch(...args);\r\n\r\n    if (this.currentMask) {\r\n      details.aggregate(this.currentMask._appendPlaceholder());\r\n    }\r\n\r\n    return details;\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  doDispatch(appended: string, flags: AppendFlags={}) {\r\n    return this.dispatch(appended, this, flags);\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  doValidate (...args: *): boolean {\r\n    return super.doValidate(...args) && (\r\n      !this.currentMask || this.currentMask.doValidate(...args));\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  reset () {\r\n    if (this.currentMask) this.currentMask.reset();\r\n    this.compiledMasks.forEach(m => m.reset());\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  get value (): string {\r\n    return this.currentMask ? this.currentMask.value : '';\r\n  }\r\n\r\n  set value (value: string) {\r\n    super.value = value;\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  get unmaskedValue (): string {\r\n    return this.currentMask ? this.currentMask.unmaskedValue : '';\r\n  }\r\n\r\n  set unmaskedValue (unmaskedValue: string) {\r\n    super.unmaskedValue = unmaskedValue;\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  get typedValue (): any {\r\n    return this.currentMask ? this.currentMask.typedValue : '';\r\n  }\r\n\r\n  // probably typedValue should not be used with dynamic\r\n  set typedValue (value: any) {\r\n    let unmaskedValue = String(value);\r\n\r\n    // double check it\r\n    if (this.currentMask) {\r\n      this.currentMask.typedValue = value;\r\n      unmaskedValue = this.currentMask.unmaskedValue;\r\n    }\r\n    this.unmaskedValue = unmaskedValue;\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  get isComplete (): boolean {\r\n    return !!this.currentMask && this.currentMask.isComplete;\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  remove (...args: *): ChangeDetails {\r\n    const details: ChangeDetails = new ChangeDetails();\r\n    if (this.currentMask) {\r\n      details.aggregate(this.currentMask.remove(...args))\r\n        // update with dispatch\r\n        .aggregate(this._applyDispatch());\r\n    }\r\n\r\n    return details;\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  get state (): MaskedDynamicState {\r\n    return {\r\n      ...super.state,\r\n      _rawInputValue: this.rawInputValue,\r\n      compiledMasks: this.compiledMasks.map(m => m.state),\r\n      currentMaskRef: this.currentMask,\r\n      currentMask: this.currentMask && this.currentMask.state,\r\n    };\r\n  }\r\n\r\n  set state (state: MaskedDynamicState) {\r\n    const {compiledMasks, currentMaskRef, currentMask, ...maskedState} = state;\r\n    this.compiledMasks.forEach((m, mi) => m.state = compiledMasks[mi]);\r\n    if (currentMaskRef != null) {\r\n      this.currentMask = currentMaskRef;\r\n      this.currentMask.state = currentMask;\r\n    }\r\n    super.state = maskedState;\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  extractInput (...args: *): string {\r\n    return this.currentMask ?\r\n      this.currentMask.extractInput(...args) :\r\n      '';\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  extractTail (...args: *): TailDetails {\r\n    return this.currentMask ?\r\n      this.currentMask.extractTail(...args) :\r\n      super.extractTail(...args);\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  doCommit () {\r\n    if (this.currentMask) this.currentMask.doCommit();\r\n    super.doCommit();\r\n  }\r\n\r\n  /**\r\n    @override\r\n  */\r\n  nearestInputPos(...args: *): number {\r\n    return this.currentMask ?\r\n      this.currentMask.nearestInputPos(...args) :\r\n      super.nearestInputPos(...args);\r\n  }\r\n\r\n  get overwrite () {\r\n    return this.currentMask ?\r\n      this.currentMask.overwrite :\r\n      super.overwrite;\r\n  }\r\n\r\n  set overwrite (overwrite: *) {\r\n    console.warn('\"overwrite\" option is not available in dynamic mask, use this option in siblings');\r\n  }\r\n}\r\n\r\nMaskedDynamic.DEFAULTS = {\r\n  dispatch: (appended, masked, flags) => {\r\n    if (!masked.compiledMasks.length) return;\r\n\r\n    const inputValue = masked.rawInputValue;\r\n\r\n    // simulate input\r\n    const inputs = masked.compiledMasks.map((m, index) => {\r\n      m.reset();\r\n      m.append(inputValue, { raw: true });\r\n      m.append(appended, flags);\r\n      const weight = m.rawInputValue.length;\r\n\r\n      return {weight, index};\r\n    });\r\n\r\n    // pop masks with longer values first\r\n    inputs.sort((i1, i2) => i2.weight - i1.weight);\r\n\r\n    return masked.compiledMasks[inputs[0].index];\r\n  }\r\n};\r\n","import {g} from './core/utils.js';\r\n\r\nimport InputMask from './controls/input.js';\r\n\r\nimport Masked from './masked/base.js';\r\nimport MaskedPattern from './masked/pattern.js';\r\nimport MaskedEnum from './masked/enum.js';\r\nimport MaskedRange from './masked/range.js';\r\nimport MaskedNumber from './masked/number.js';\r\nimport MaskedDate from './masked/date.js';\r\nimport MaskedRegExp from './masked/regexp.js';\r\nimport MaskedFunction from './masked/function.js';\r\nimport MaskedDynamic from './masked/dynamic.js';\r\nimport createMask from './masked/factory.js';\r\nimport MaskElement from './controls/mask-element.js';\r\nimport HTMLMaskElement from './controls/html-mask-element.js';\r\n\r\n\r\n/**\r\n * Applies mask on element.\r\n * @constructor\r\n * @param {HTMLInputElement|HTMLTextAreaElement|MaskElement} el - Element to apply mask\r\n * @param {Object} opts - Custom mask options\r\n * @return {InputMask}\r\n */\r\nfunction IMask (el, opts={}) {\r\n\t// currently available only for input-like elements\r\n  return new InputMask(el, opts);\r\n}\r\n\r\n/** {@link InputMask} */\r\nIMask.InputMask = InputMask;\r\n\r\n/** {@link Masked} */\r\nIMask.Masked = Masked;\r\n/** {@link MaskedPattern} */\r\nIMask.MaskedPattern = MaskedPattern;\r\n/** {@link MaskedEnum} */\r\nIMask.MaskedEnum = MaskedEnum;\r\n/** {@link MaskedRange} */\r\nIMask.MaskedRange = MaskedRange;\r\n/** {@link MaskedNumber} */\r\nIMask.MaskedNumber = MaskedNumber;\r\n/** {@link MaskedDate} */\r\nIMask.MaskedDate = MaskedDate;\r\n/** {@link MaskedRegExp} */\r\nIMask.MaskedRegExp = MaskedRegExp;\r\n/** {@link MaskedFunction} */\r\nIMask.MaskedFunction = MaskedFunction;\r\n/** {@link MaskedDynamic} */\r\nIMask.MaskedDynamic = MaskedDynamic;\r\n/** {@link createMask} */\r\nIMask.createMask = createMask;\r\n/** {@link MaskElement} */\r\nIMask.MaskElement = MaskElement;\r\n/** {@link HTMLMaskElement} */\r\nIMask.HTMLMaskElement = HTMLMaskElement;\r\n\r\ng.IMask = IMask;\r\n\r\nexport default IMask;\r\nexport {\r\n  InputMask,\r\n  Masked,\r\n  MaskedPattern,\r\n  MaskedEnum,\r\n  MaskedRange,\r\n  MaskedNumber,\r\n  MaskedDate,\r\n  MaskedRegExp,\r\n  MaskedFunction,\r\n  MaskedDynamic,\r\n  createMask,\r\n  MaskElement,\r\n  HTMLMaskElement,\r\n};\r\n"],"names":["isString","str","String","DIRECTION","NONE","LEFT","FORCE_LEFT","RIGHT","FORCE_RIGHT","forceDirection","direction","escapeRegExp","replace","objectIncludes","b","a","arrA","Array","isArray","arrB","i","length","dateA","Date","dateB","getTime","regexpA","RegExp","regexpB","toString","keys","Object","prototype","hasOwnProperty","call","g","window","global","self","ActionDetails","constructor","value","cursorPos","oldValue","oldSelection","slice","startChangePos","start","Math","min","insertedCount","inserted","substr","removedCount","max","end","removed","head","substring","tail","removeDirection","ChangeDetails","details","assign","rawInserted","skip","tailShift","aggregate","offset","ContinuousTailDetails","from","stop","extend","appendTo","masked","append","_appendPlaceholder","state","shiftBefore","pos","shiftChar","Masked","opts","_value","_update","isInitialized","updateOptions","withValueRefresh","bind","reset","resolve","input","doCommit","unmaskedValue","typedValue","rawInputValue","extractInput","raw","isComplete","nearestInputPos","fromPos","toPos","extractTail","appendTail","_appendCharRaw","ch","flags","doPrepare","_appendChar","checkTail","consistentState","consistentTail","appended","doValidate","beforeTailState","overwrite","tailDetails","Error","_beforeTailState","ci","remove","fn","_refreshing","unmasked","ret","prepare","validate","parent","commit","splice","deleteCount","tailPos","changeDetails","maskedClass","mask","IMask","MaskedRegExp","MaskedPattern","MaskedDate","Number","MaskedNumber","MaskedDynamic","Function","MaskedFunction","console","warn","createMask","MaskedClass","DEFAULT_INPUT_DEFINITIONS","PatternInputDefinition","blockOpts","_isFilled","isOptional","placeholderChar","Boolean","lazy","minPos","maxPos","boundPos","PatternFixedDefinition","isUnmasking","_isRawInput","char","isResolved","ChunksTailDetails","chunks","map","join","tailChunk","lastChunk","extendLast","push","firstTailChunk","shift","blockIndex","chunk","lastBlockIter","_mapPosToBlock","chunkBlock","index","_stops","indexOf","_blocks","remainChars","c","props","cstate","chunkShiftPos","definitions","DEFAULTS","_rebuildMask","defs","_maskedBlocks","pattern","unmaskingBlock","optionalBlock","blocks","p","bNames","filter","bName","sort","maskedBlock","isInput","STOP_CHAR","ESCAPE_CHAR","def","maskedState","forEach","bi","every","reduce","blockIter","block","blockDetails","chunkTail","_forEachBlocksInRange","bFromPos","bToPos","blockChunk","_findStopBefore","_blockStartPos","_","stopBefore","si","toBlockIndex","startBlockIter","startBlockIndex","endBlockIndex","args","bDetails","accVal","blockStartPos","fromBlockIter","toBlockIter","isSameBlock","fromBlockStartPos","fromBlockEndPos","removeDetails","beginBlockData","beginBlockOffset","beginBlockIndex","beginBlock","beginBlockCursorPos","cursorAtRight","cursorAtLeft","searchBlockIndex","blockIndexAtLeft","blockAtLeft","blockInputPos","firstInputAtRight","blockAtRight","firstFilledBlockIndexAtRight","filledBlock","firstFilledInputBlockIndex","firstEmptyInputBlockIndex","blockAlignedPos","firstInputBlockAlignedIndex","firstInputBlockAlignedPos","alignedPos","name","maskedBlocks","indices","gi","InputDefinition","FixedDefinition","MaskedRange","_matchFrom","maxLength","to","fromStr","padStart","toStr","sameCharsCount","repeat","boundaries","minstr","maxstr","placeholder","num","match","padEnd","autofix","val","prepStr","nextVal","firstNonZero","search","GET_DEFAULT_BLOCKS","Y","getFullYear","m","getMonth","d","getDate","bk","date","isDateExist","format","parse","day","month","year","split","MaskElement","selectionStart","_unsafeSelectionStart","e","selectionEnd","_unsafeSelectionEnd","select","_unsafeSelect","isActive","bindEvents","handlers","unbindEvents","HTMLMaskElement","_handlers","document","activeElement","setSelectionRange","event","_toggleEventHandler","EVENTS_MAP","handler","removeEventListener","addEventListener","selectionChange","drop","click","focus","InputMask","el","_listeners","_unmaskedValue","_saveSelection","_onInput","_onChange","_onDrop","_onFocus","alignCursor","alignCursorFriendly","_bindEvents","updateValue","maskEquals","updateControl","_unbindEvents","_fireEvent","ev","listeners","l","_cursorChanging","_changingCursorPos","_selection","newUnmaskedValue","newValue","isChanged","_fireChangeEvents","restOpts","updateMask","updateOpts","updateCursor","_delayUpdateCursor","_abortUpdateCursor","setTimeout","clearTimeout","on","off","hIndex","oldRawValue","preventDefault","stopPropagation","destroy","MaskedEnum","enum","some","_updateRegExps","allowNegative","midInput","mid","scale","radix","_numberRegExpInput","_numberRegExp","_mapToRadixRegExp","mapToRadix","_thousandsSeparatorRegExp","thousandsSeparator","_removeThousandsSeparators","_insertThousandsSeparators","parts","_separatorsCount","extendOnSeparators","count","_separatorsCountFromSlice","_adjustRangeWithSeparators","prevBeforeTailValue","prevBeforeTailSeparatorsCount","appendDetails","beforeTailValue","beforeTailSeparatorsCount","_findSeparatorAround","searchFrom","separatorPos","separatorAroundFromPos","separatorAroundToPos","valueBeforePos","valueAfterPos","separatorAtLeftPos","separatorAtLeftEndPos","separatorAtRightPos","regexp","valid","test","number","isNaN","validnum","formatted","normalizeZeros","_normalizeZeros","padFractionalZeros","_padFractionalZeros","sign","zeros","signed","currentMask","compiledMasks","_applyDispatch","prevValueBeforeTail","inputValue","insertValue","_rawInputValue","tailValue","prevMask","prevMaskState","doDispatch","dispatch","currentMaskRef","mi","inputs","weight","i1","i2"],"mappings":"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"}