{"version":3,"file":"index.js","names":[],"sources":["../error.ts","../types.ts","../../../node_modules/.aspect_rules_js/@formatjs_generated+unicode@0.0.0/node_modules/@formatjs_generated/unicode/icu-messageformat-parser-regex.js","../../../node_modules/.aspect_rules_js/@formatjs_generated+cldr.core@0.0.0/node_modules/@formatjs_generated/cldr.core/time-data.js","../date-time-pattern-generator.ts","../parser.ts","../manipulator.ts","../index.ts"],"sourcesContent":["import {type Location} from '#packages/icu-messageformat-parser/types.js'\n\nexport interface ParserError {\n  kind: ErrorKind\n  message: string\n  location: Location\n}\n\nexport enum ErrorKind {\n  /** Argument is unclosed (e.g. `{0`) */\n  EXPECT_ARGUMENT_CLOSING_BRACE = 1,\n  /** Argument is empty (e.g. `{}`). */\n  EMPTY_ARGUMENT = 2,\n  /** Argument is malformed (e.g. `{foo!}``) */\n  MALFORMED_ARGUMENT = 3,\n  /** Expect an argument type (e.g. `{foo,}`) */\n  EXPECT_ARGUMENT_TYPE = 4,\n  /** Unsupported argument type (e.g. `{foo,foo}`) */\n  INVALID_ARGUMENT_TYPE = 5,\n  /** Expect an argument style (e.g. `{foo, number, }`) */\n  EXPECT_ARGUMENT_STYLE = 6,\n  /** The number skeleton is invalid. */\n  INVALID_NUMBER_SKELETON = 7,\n  /** The date time skeleton is invalid. */\n  INVALID_DATE_TIME_SKELETON = 8,\n  /** Exepct a number skeleton following the `::` (e.g. `{foo, number, ::}`) */\n  EXPECT_NUMBER_SKELETON = 9,\n  /** Exepct a date time skeleton following the `::` (e.g. `{foo, date, ::}`) */\n  EXPECT_DATE_TIME_SKELETON = 10,\n  /** Unmatched apostrophes in the argument style (e.g. `{foo, number, 'test`) */\n  UNCLOSED_QUOTE_IN_ARGUMENT_STYLE = 11,\n  /** Missing select argument options (e.g. `{foo, select}`) */\n  EXPECT_SELECT_ARGUMENT_OPTIONS = 12,\n\n  /** Expecting an offset value in `plural` or `selectordinal` argument (e.g `{foo, plural, offset}`) */\n  EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE = 13,\n  /** Offset value in `plural` or `selectordinal` is invalid (e.g. `{foo, plural, offset: x}`) */\n  INVALID_PLURAL_ARGUMENT_OFFSET_VALUE = 14,\n\n  /** Expecting a selector in `select` argument (e.g `{foo, select}`) */\n  EXPECT_SELECT_ARGUMENT_SELECTOR = 15,\n  /** Expecting a selector in `plural` or `selectordinal` argument (e.g `{foo, plural}`) */\n  EXPECT_PLURAL_ARGUMENT_SELECTOR = 16,\n\n  /** Expecting a message fragment after the `select` selector (e.g. `{foo, select, apple}`) */\n  EXPECT_SELECT_ARGUMENT_SELECTOR_FRAGMENT = 17,\n  /**\n   * Expecting a message fragment after the `plural` or `selectordinal` selector\n   * (e.g. `{foo, plural, one}`)\n   */\n  EXPECT_PLURAL_ARGUMENT_SELECTOR_FRAGMENT = 18,\n\n  /** Selector in `plural` or `selectordinal` is malformed (e.g. `{foo, plural, =x {#}}`) */\n  INVALID_PLURAL_ARGUMENT_SELECTOR = 19,\n\n  /**\n   * Duplicate selectors in `plural` or `selectordinal` argument.\n   * (e.g. {foo, plural, one {#} one {#}})\n   */\n  DUPLICATE_PLURAL_ARGUMENT_SELECTOR = 20,\n  /** Duplicate selectors in `select` argument.\n   * (e.g. {foo, select, apple {apple} apple {apple}})\n   */\n  DUPLICATE_SELECT_ARGUMENT_SELECTOR = 21,\n\n  /** Plural or select argument option must have `other` clause. */\n  MISSING_OTHER_CLAUSE = 22,\n\n  /** The tag is malformed. (e.g. `<bold!>foo</bold!>) */\n  INVALID_TAG = 23,\n  /** The tag name is invalid. (e.g. `<123>foo</123>`) */\n  INVALID_TAG_NAME = 25,\n  /** The closing tag does not match the opening tag. (e.g. `<bold>foo</italic>`) */\n  UNMATCHED_CLOSING_TAG = 26,\n  /** The opening tag has unmatched closing tag. (e.g. `<bold>foo`) */\n  UNCLOSED_TAG = 27,\n}\n","import type {NumberFormatOptions} from '#packages/ecma402-abstract/types/number.js'\nimport {type NumberSkeletonToken} from '@formatjs/icu-skeleton-parser'\n\nexport interface ExtendedNumberFormatOptions extends NumberFormatOptions {\n  scale?: number\n}\n\nexport enum TYPE {\n  /**\n   * Raw text\n   */\n  literal,\n  /**\n   * Variable w/o any format, e.g `var` in `this is a {var}`\n   */\n  argument,\n  /**\n   * Variable w/ number format\n   */\n  number,\n  /**\n   * Variable w/ date format\n   */\n  date,\n  /**\n   * Variable w/ time format\n   */\n  time,\n  /**\n   * Variable w/ select format\n   */\n  select,\n  /**\n   * Variable w/ plural format\n   */\n  plural,\n  /**\n   * Only possible within plural argument.\n   * This is the `#` symbol that will be substituted with the count.\n   */\n  pound,\n  /**\n   * XML-like tag\n   */\n  tag,\n}\n\nexport enum SKELETON_TYPE {\n  number,\n  dateTime,\n}\n\nexport interface LocationDetails {\n  offset: number\n  line: number\n  column: number\n}\nexport interface Location {\n  start: LocationDetails\n  end: LocationDetails\n}\n\nexport interface BaseElement<T extends TYPE> {\n  type: T\n  value: string\n  location?: Location\n}\n\nexport type LiteralElement = BaseElement<TYPE.literal>\nexport type ArgumentElement = BaseElement<TYPE.argument>\nexport interface TagElement extends BaseElement<TYPE.tag> {\n  children: MessageFormatElement[]\n}\n\nexport interface SimpleFormatElement<\n  T extends TYPE,\n  S extends Skeleton,\n> extends BaseElement<T> {\n  style?: string | S | null\n}\n\nexport type NumberElement = SimpleFormatElement<TYPE.number, NumberSkeleton>\nexport type DateElement = SimpleFormatElement<TYPE.date, DateTimeSkeleton>\nexport type TimeElement = SimpleFormatElement<TYPE.time, DateTimeSkeleton>\n\nexport type ValidPluralRule =\n  | 'zero'\n  | 'one'\n  | 'two'\n  | 'few'\n  | 'many'\n  | 'other'\n  | string\n\nexport interface PluralOrSelectOption {\n  value: MessageFormatElement[]\n  location?: Location\n}\n\nexport interface SelectElement extends BaseElement<TYPE.select> {\n  options: Record<string, PluralOrSelectOption>\n}\n\nexport interface PluralElement extends BaseElement<TYPE.plural> {\n  options: Record<ValidPluralRule, PluralOrSelectOption>\n  offset: number\n  pluralType: Intl.PluralRulesOptions['type']\n}\n\nexport interface PoundElement {\n  type: TYPE.pound\n  location?: Location\n}\n\nexport type MessageFormatElement =\n  | ArgumentElement\n  | DateElement\n  | LiteralElement\n  | NumberElement\n  | PluralElement\n  | PoundElement\n  | SelectElement\n  | TagElement\n  | TimeElement\n\nexport interface NumberSkeleton {\n  type: SKELETON_TYPE.number\n  tokens: NumberSkeletonToken[]\n  location?: Location\n  parsedOptions: ExtendedNumberFormatOptions\n}\n\nexport interface DateTimeSkeleton {\n  type: SKELETON_TYPE.dateTime\n  pattern: string\n  location?: Location\n  parsedOptions: Intl.DateTimeFormatOptions\n}\n\nexport type Skeleton = NumberSkeleton | DateTimeSkeleton\n\n/**\n * Type Guards\n */\nexport function isLiteralElement(\n  el: MessageFormatElement\n): el is LiteralElement {\n  return el.type === TYPE.literal\n}\nexport function isArgumentElement(\n  el: MessageFormatElement\n): el is ArgumentElement {\n  return el.type === TYPE.argument\n}\nexport function isNumberElement(el: MessageFormatElement): el is NumberElement {\n  return el.type === TYPE.number\n}\nexport function isDateElement(el: MessageFormatElement): el is DateElement {\n  return el.type === TYPE.date\n}\nexport function isTimeElement(el: MessageFormatElement): el is TimeElement {\n  return el.type === TYPE.time\n}\nexport function isSelectElement(el: MessageFormatElement): el is SelectElement {\n  return el.type === TYPE.select\n}\nexport function isPluralElement(el: MessageFormatElement): el is PluralElement {\n  return el.type === TYPE.plural\n}\nexport function isPoundElement(el: MessageFormatElement): el is PoundElement {\n  return el.type === TYPE.pound\n}\nexport function isTagElement(el: MessageFormatElement): el is TagElement {\n  return el.type === TYPE.tag\n}\nexport function isNumberSkeleton(\n  el: NumberElement['style'] | Skeleton\n): el is NumberSkeleton {\n  return !!(el && typeof el === 'object' && el.type === SKELETON_TYPE.number)\n}\nexport function isDateTimeSkeleton(\n  el?: DateElement['style'] | TimeElement['style'] | Skeleton\n): el is DateTimeSkeleton {\n  return !!(el && typeof el === 'object' && el.type === SKELETON_TYPE.dateTime)\n}\n\nexport function createLiteralElement(value: string): LiteralElement {\n  return {\n    type: TYPE.literal,\n    value,\n  }\n}\n\nexport function createNumberElement(\n  value: string,\n  style?: string | null\n): NumberElement {\n  return {\n    type: TYPE.number,\n    value,\n    style,\n  }\n}\n","// @generated from regex-gen.ts\nexport const SPACE_SEPARATOR_REGEX = /[ \\xA0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000]/;\nexport const WHITE_SPACE_REGEX = /[\\t-\\r \\x85\\u200E\\u200F\\u2028\\u2029]/;\n","// @generated from time-data-gen.ts\n// prettier-ignore\nexport const timeData = {\n\t\"001\": [\"H\", \"h\"],\n\t\"419\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"AC\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"AD\": [\"H\", \"hB\"],\n\t\"AE\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\"\n\t],\n\t\"AF\": [\n\t\t\"H\",\n\t\t\"hb\",\n\t\t\"hB\",\n\t\t\"h\"\n\t],\n\t\"AG\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"AI\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"AL\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"AM\": [\"H\", \"hB\"],\n\t\"AO\": [\"H\", \"hB\"],\n\t\"AR\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"AS\": [\"h\", \"H\"],\n\t\"AT\": [\"H\", \"hB\"],\n\t\"AU\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"AW\": [\"H\", \"hB\"],\n\t\"AX\": [\"H\"],\n\t\"AZ\": [\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"h\"\n\t],\n\t\"BA\": [\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"h\"\n\t],\n\t\"BB\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"BD\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"H\"\n\t],\n\t\"BE\": [\"H\", \"hB\"],\n\t\"BF\": [\"H\", \"hB\"],\n\t\"BG\": [\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"h\"\n\t],\n\t\"BH\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\"\n\t],\n\t\"BI\": [\"H\", \"h\"],\n\t\"BJ\": [\"H\", \"hB\"],\n\t\"BL\": [\"H\", \"hB\"],\n\t\"BM\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"BN\": [\n\t\t\"hb\",\n\t\t\"hB\",\n\t\t\"h\",\n\t\t\"H\"\n\t],\n\t\"BO\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"BQ\": [\"H\"],\n\t\"BR\": [\"H\", \"hB\"],\n\t\"BS\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"BT\": [\"h\", \"H\"],\n\t\"BW\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"BY\": [\"H\", \"h\"],\n\t\"BZ\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"CA\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"CC\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"CD\": [\"hB\", \"H\"],\n\t\"CF\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\"\n\t],\n\t\"CG\": [\"H\", \"hB\"],\n\t\"CH\": [\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"h\"\n\t],\n\t\"CI\": [\"H\", \"hB\"],\n\t\"CK\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"CL\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"CM\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\"\n\t],\n\t\"CN\": [\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"h\"\n\t],\n\t\"CO\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"CP\": [\"H\"],\n\t\"CR\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"CU\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"CV\": [\"H\", \"hB\"],\n\t\"CW\": [\"H\", \"hB\"],\n\t\"CX\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"CY\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"CZ\": [\"H\"],\n\t\"DE\": [\"H\", \"hB\"],\n\t\"DG\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"DJ\": [\"h\", \"H\"],\n\t\"DK\": [\"H\"],\n\t\"DM\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"DO\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"DZ\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\"\n\t],\n\t\"EA\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"EC\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"EE\": [\"H\", \"hB\"],\n\t\"EG\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\"\n\t],\n\t\"EH\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\"\n\t],\n\t\"ER\": [\"h\", \"H\"],\n\t\"ES\": [\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"h\",\n\t\t\"hb\"\n\t],\n\t\"ET\": [\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"h\",\n\t\t\"H\"\n\t],\n\t\"FI\": [\"H\"],\n\t\"FJ\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"FK\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"FM\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"FO\": [\"H\", \"h\"],\n\t\"FR\": [\"H\", \"hB\"],\n\t\"GA\": [\"H\", \"hB\"],\n\t\"GB\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"GD\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"GE\": [\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"h\"\n\t],\n\t\"GF\": [\"H\", \"hB\"],\n\t\"GG\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"GH\": [\"h\", \"H\"],\n\t\"GI\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"GL\": [\"H\", \"h\"],\n\t\"GM\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"GN\": [\"H\", \"hB\"],\n\t\"GP\": [\"H\", \"hB\"],\n\t\"GQ\": [\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"h\",\n\t\t\"hb\"\n\t],\n\t\"GR\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"GS\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"GT\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"GU\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"GW\": [\"H\", \"hB\"],\n\t\"GY\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"HK\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\"\n\t],\n\t\"HN\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"HR\": [\"H\", \"hB\"],\n\t\"HU\": [\"H\", \"h\"],\n\t\"IC\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"ID\": [\"H\"],\n\t\"IE\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"IL\": [\"H\", \"hB\"],\n\t\"IM\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"IN\": [\"h\", \"H\"],\n\t\"IO\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"IQ\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\"\n\t],\n\t\"IR\": [\"hB\", \"H\"],\n\t\"IS\": [\"H\"],\n\t\"IT\": [\"H\", \"hB\"],\n\t\"JE\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"JM\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"JO\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\"\n\t],\n\t\"JP\": [\n\t\t\"H\",\n\t\t\"K\",\n\t\t\"h\"\n\t],\n\t\"KE\": [\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"h\"\n\t],\n\t\"KG\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"KH\": [\n\t\t\"hB\",\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hb\"\n\t],\n\t\"KI\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"KM\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"KN\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"KP\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"KR\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"KW\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\"\n\t],\n\t\"KY\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"KZ\": [\"H\", \"hB\"],\n\t\"LA\": [\n\t\t\"H\",\n\t\t\"hb\",\n\t\t\"hB\",\n\t\t\"h\"\n\t],\n\t\"LB\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\"\n\t],\n\t\"LC\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"LI\": [\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"h\"\n\t],\n\t\"LK\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"LR\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"LS\": [\"h\", \"H\"],\n\t\"LT\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"LU\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\"\n\t],\n\t\"LV\": [\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"h\"\n\t],\n\t\"LY\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\"\n\t],\n\t\"MA\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"MC\": [\"H\", \"hB\"],\n\t\"MD\": [\"H\", \"hB\"],\n\t\"ME\": [\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"h\"\n\t],\n\t\"MF\": [\"H\", \"hB\"],\n\t\"MG\": [\"H\", \"h\"],\n\t\"MH\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"MK\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"ML\": [\"H\"],\n\t\"MM\": [\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"h\"\n\t],\n\t\"MN\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"MO\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\"\n\t],\n\t\"MP\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"MQ\": [\"H\", \"hB\"],\n\t\"MR\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\"\n\t],\n\t\"MS\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"MT\": [\"H\", \"h\"],\n\t\"MU\": [\"H\", \"h\"],\n\t\"MV\": [\"H\", \"h\"],\n\t\"MW\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"MX\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"MY\": [\n\t\t\"hb\",\n\t\t\"hB\",\n\t\t\"h\",\n\t\t\"H\"\n\t],\n\t\"MZ\": [\"H\", \"hB\"],\n\t\"NA\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"NC\": [\"H\", \"hB\"],\n\t\"NE\": [\"H\"],\n\t\"NF\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"NG\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"NI\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"NL\": [\"H\", \"hB\"],\n\t\"NO\": [\"H\", \"h\"],\n\t\"NP\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\"\n\t],\n\t\"NR\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"NU\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"NZ\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"OM\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\"\n\t],\n\t\"PA\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"PE\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"PF\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\"\n\t],\n\t\"PG\": [\"h\", \"H\"],\n\t\"PH\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\"\n\t],\n\t\"PK\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"H\"\n\t],\n\t\"PL\": [\"H\", \"h\"],\n\t\"PM\": [\"H\", \"hB\"],\n\t\"PN\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"PR\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"PS\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\"\n\t],\n\t\"PT\": [\"H\", \"hB\"],\n\t\"PW\": [\"h\", \"H\"],\n\t\"PY\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"QA\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\"\n\t],\n\t\"RE\": [\"H\", \"hB\"],\n\t\"RO\": [\"H\", \"hB\"],\n\t\"RS\": [\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"h\"\n\t],\n\t\"RU\": [\"H\"],\n\t\"RW\": [\"H\", \"h\"],\n\t\"SA\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\"\n\t],\n\t\"SB\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"SC\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\"\n\t],\n\t\"SD\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\"\n\t],\n\t\"SE\": [\"H\"],\n\t\"SG\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"SH\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"SI\": [\"H\", \"hB\"],\n\t\"SJ\": [\"H\"],\n\t\"SK\": [\"H\"],\n\t\"SL\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"SM\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\"\n\t],\n\t\"SN\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\"\n\t],\n\t\"SO\": [\"h\", \"H\"],\n\t\"SR\": [\"H\", \"hB\"],\n\t\"SS\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"ST\": [\"H\", \"hB\"],\n\t\"SV\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"SX\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"SY\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\"\n\t],\n\t\"SZ\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"TA\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"TC\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"TD\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"TF\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\"\n\t],\n\t\"TG\": [\"H\", \"hB\"],\n\t\"TH\": [\"H\", \"h\"],\n\t\"TJ\": [\"H\", \"h\"],\n\t\"TL\": [\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"h\"\n\t],\n\t\"TM\": [\"H\", \"h\"],\n\t\"TN\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\"\n\t],\n\t\"TO\": [\"h\", \"H\"],\n\t\"TR\": [\"H\", \"hB\"],\n\t\"TT\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"TW\": [\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"h\",\n\t\t\"H\"\n\t],\n\t\"TZ\": [\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"h\"\n\t],\n\t\"UA\": [\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"h\"\n\t],\n\t\"UG\": [\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"h\"\n\t],\n\t\"UM\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"US\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"UY\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"UZ\": [\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"h\"\n\t],\n\t\"VA\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\"\n\t],\n\t\"VC\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"VE\": [\n\t\t\"h\",\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"VG\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"VI\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"VN\": [\"H\", \"h\"],\n\t\"VU\": [\"h\", \"H\"],\n\t\"WF\": [\"H\", \"hB\"],\n\t\"WS\": [\"h\", \"H\"],\n\t\"XK\": [\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"h\"\n\t],\n\t\"YE\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\"\n\t],\n\t\"YT\": [\"H\", \"hB\"],\n\t\"ZA\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"ZM\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"ZW\": [\"H\", \"h\"],\n\t\"af-ZA\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"ar-001\": [\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"H\"\n\t],\n\t\"ca-ES\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\"\n\t],\n\t\"en-001\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"en-HK\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"en-IL\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"hB\"\n\t],\n\t\"en-MY\": [\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\",\n\t\t\"hB\"\n\t],\n\t\"es-BR\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"es-ES\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"es-GQ\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\",\n\t\t\"hb\"\n\t],\n\t\"fr-CA\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\"\n\t],\n\t\"gl-ES\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\"\n\t],\n\t\"gu-IN\": [\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"h\",\n\t\t\"H\"\n\t],\n\t\"hi-IN\": [\n\t\t\"hB\",\n\t\t\"h\",\n\t\t\"H\"\n\t],\n\t\"it-CH\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\"\n\t],\n\t\"it-IT\": [\n\t\t\"H\",\n\t\t\"h\",\n\t\t\"hB\"\n\t],\n\t\"kn-IN\": [\n\t\t\"hB\",\n\t\t\"h\",\n\t\t\"H\"\n\t],\n\t\"ku-SY\": [\"H\", \"hB\"],\n\t\"ml-IN\": [\n\t\t\"hB\",\n\t\t\"h\",\n\t\t\"H\"\n\t],\n\t\"mr-IN\": [\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"h\",\n\t\t\"H\"\n\t],\n\t\"pa-IN\": [\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"h\",\n\t\t\"H\"\n\t],\n\t\"ta-IN\": [\n\t\t\"hB\",\n\t\t\"h\",\n\t\t\"hb\",\n\t\t\"H\"\n\t],\n\t\"te-IN\": [\n\t\t\"hB\",\n\t\t\"h\",\n\t\t\"H\"\n\t],\n\t\"zu-ZA\": [\n\t\t\"H\",\n\t\t\"hB\",\n\t\t\"hb\",\n\t\t\"h\"\n\t]\n};\n","import {timeData} from '@formatjs_generated/cldr.core/time-data.js'\n\n/**\n * Returns the best matching date time pattern if a date time skeleton\n * pattern is provided with a locale. Follows the Unicode specification:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#table-mapping-requested-time-skeletons-to-patterns\n * @param skeleton date time skeleton pattern that possibly includes j, J or C\n * @param locale\n */\nexport function getBestPattern(skeleton: string, locale: Intl.Locale): string {\n  let skeletonCopy = ''\n  for (let patternPos = 0; patternPos < skeleton.length; patternPos++) {\n    const patternChar = skeleton.charAt(patternPos)\n\n    if (patternChar === 'j') {\n      let extraLength = 0\n      while (\n        patternPos + 1 < skeleton.length &&\n        skeleton.charAt(patternPos + 1) === patternChar\n      ) {\n        extraLength++\n        patternPos++\n      }\n\n      let hourLen = 1 + (extraLength & 1)\n      let dayPeriodLen = extraLength < 2 ? 1 : 3 + (extraLength >> 1)\n      let dayPeriodChar = 'a'\n      let hourChar = getDefaultHourSymbolFromLocale(locale)\n\n      if (hourChar == 'H' || hourChar == 'k') {\n        dayPeriodLen = 0\n      }\n\n      while (dayPeriodLen-- > 0) {\n        skeletonCopy += dayPeriodChar\n      }\n      while (hourLen-- > 0) {\n        skeletonCopy = hourChar + skeletonCopy\n      }\n    } else if (patternChar === 'J') {\n      skeletonCopy += 'H'\n    } else {\n      skeletonCopy += patternChar\n    }\n  }\n\n  return skeletonCopy\n}\n\n/**\n * Maps the [hour cycle type](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle)\n * of the given `locale` to the corresponding time pattern.\n * @param locale\n */\nfunction getDefaultHourSymbolFromLocale(locale: Intl.Locale): string {\n  let hourCycle = locale.hourCycle\n\n  if (\n    hourCycle === undefined &&\n    // @ts-ignore hourCycle(s) is not identified yet\n    locale.hourCycles &&\n    // @ts-ignore\n    locale.hourCycles.length\n  ) {\n    // @ts-ignore\n    hourCycle = locale.hourCycles[0]\n  }\n\n  if (hourCycle) {\n    switch (hourCycle) {\n      case 'h24':\n        return 'k'\n      case 'h23':\n        return 'H'\n      case 'h12':\n        return 'h'\n      case 'h11':\n        return 'K'\n      default:\n        throw new Error('Invalid hourCycle')\n    }\n  }\n\n  // TODO: Once hourCycle is fully supported remove the following with data generation\n  const languageTag = locale.language\n  let regionTag: string | undefined\n  if (languageTag !== 'root') {\n    regionTag = locale.maximize().region\n  }\n  const hourCycles =\n    timeData[regionTag || ''] ||\n    timeData[languageTag || ''] ||\n    timeData[`${languageTag}-001`] ||\n    timeData['001']\n  return hourCycles[0]\n}\n","import {\n  ErrorKind,\n  type ParserError,\n} from '#packages/icu-messageformat-parser/error.js'\nimport {\n  type DateTimeSkeleton,\n  type LiteralElement,\n  type Location,\n  type MessageFormatElement,\n  type NumberSkeleton,\n  type PluralOrSelectOption,\n  SKELETON_TYPE,\n  type TagElement,\n  TYPE,\n} from '#packages/icu-messageformat-parser/types.js'\nimport {SPACE_SEPARATOR_REGEX} from '@formatjs_generated/unicode/icu-messageformat-parser-regex.js'\nimport {\n  type NumberSkeletonToken,\n  parseNumberSkeleton,\n  parseNumberSkeletonFromString,\n  parseDateTimeSkeleton,\n} from '@formatjs/icu-skeleton-parser'\nimport {getBestPattern} from '#packages/icu-messageformat-parser/date-time-pattern-generator.js'\n\nconst SPACE_SEPARATOR_START_REGEX = new RegExp(\n  `^${SPACE_SEPARATOR_REGEX.source}*`\n)\nconst SPACE_SEPARATOR_END_REGEX = new RegExp(\n  `${SPACE_SEPARATOR_REGEX.source}*$`\n)\n\nexport interface Position {\n  /** Offset in terms of UTF-16 *code unit*. */\n  offset: number\n  line: number\n  /** Column offset in terms of unicode *code point*. */\n  column: number\n}\n\nexport interface ParserOptions {\n  /**\n   * Whether to treat HTML/XML tags as string literal\n   * instead of parsing them as tag token.\n   * When this is false we only allow simple tags without\n   * any attributes\n   */\n  ignoreTag?: boolean\n  /**\n   * Should `select`, `selectordinal`, and `plural` arguments always include\n   * the `other` case clause.\n   */\n  requiresOtherClause?: boolean\n  /**\n   * Whether to parse number/datetime skeleton\n   * into Intl.NumberFormatOptions and Intl.DateTimeFormatOptions, respectively.\n   */\n  shouldParseSkeletons?: boolean\n  /**\n   * Capture location info in AST\n   * Default is false\n   */\n  captureLocation?: boolean\n  /**\n   * Instance of Intl.Locale to resolve locale-dependent skeleton\n   */\n  locale?: Intl.Locale\n}\n\nexport type Result<T, E> = {val: T; err: null} | {val: null; err: E}\ntype ArgType =\n  | 'number'\n  | 'date'\n  | 'time'\n  | 'select'\n  | 'plural'\n  | 'selectordinal'\n  | ''\n\nfunction createLocation(start: Position, end: Position): Location {\n  return {start, end}\n}\n\n// #region Ponyfills\n// Consolidate these variables up top for easier toggling during debugging\nconst hasNativeFromEntries = !!(Object as any).fromEntries\nconst hasTrimStart = !!(String.prototype as any).trimStart\nconst hasTrimEnd = !!(String.prototype as any).trimEnd\n\nconst fromEntries: <T = any>(\n  entries: readonly (readonly [string, T])[]\n) => {[k: string]: T} =\n  // native\n  hasNativeFromEntries\n    ? (Object as any).fromEntries\n    : // Ponyfill\n      function fromEntries(entries) {\n        const obj: Record<string, any> = {}\n        for (const [k, v] of entries) {\n          obj[k] = v\n        }\n        return obj\n      }\n\nconst trimStart: (s: string) => string = hasTrimStart\n  ? // Native\n    function trimStart(s) {\n      return (s as any).trimStart()\n    }\n  : // Ponyfill\n    function trimStart(s) {\n      return s.replace(SPACE_SEPARATOR_START_REGEX, '')\n    }\n\nconst trimEnd: (s: string) => string = hasTrimEnd\n  ? // Native\n    function trimEnd(s) {\n      return (s as any).trimEnd()\n    }\n  : // Ponyfill\n    function trimEnd(s) {\n      return s.replace(SPACE_SEPARATOR_END_REGEX, '')\n    }\n\n// #endregion\n\nconst IDENTIFIER_PREFIX_RE = new RegExp(\n  '([^\\\\p{White_Space}\\\\p{Pattern_Syntax}]*)',\n  'yu'\n)\n\nfunction matchIdentifierAtIndex(s: string, index: number): string {\n  IDENTIFIER_PREFIX_RE.lastIndex = index\n  const match = IDENTIFIER_PREFIX_RE.exec(s)!\n  return match[1] ?? ''\n}\n\nfunction plainTopLevelEndPosition(message: string): Position | null {\n  if (message.length === 0) {\n    return null\n  }\n  let line = 1\n  let column = 1\n  for (let offset = 0; offset < message.length;) {\n    const code = message.charCodeAt(offset)\n    switch (code) {\n      case 35: // #\n      case 39: // '\n      case 60: // <\n      case 123: // {\n      case 125: // }\n        return null\n    }\n    if (code === 10 /* '\\n' */) {\n      line++\n      column = 1\n      offset++\n    } else {\n      column++\n      if (code >= 0xd800 && code <= 0xdbff && offset + 1 < message.length) {\n        const next = message.charCodeAt(offset + 1)\n        offset += next >= 0xdc00 && next <= 0xdfff ? 2 : 1\n      } else {\n        offset++\n      }\n    }\n  }\n  return {offset: message.length, line, column}\n}\n\nexport class Parser {\n  private message: string\n  private position: Position\n  private locale?: Intl.Locale\n\n  private ignoreTag: boolean\n  private requiresOtherClause: boolean\n  private shouldParseSkeletons?: boolean\n\n  constructor(message: string, options: ParserOptions = {}) {\n    this.message = message\n    this.position = {offset: 0, line: 1, column: 1}\n    this.ignoreTag = !!options.ignoreTag\n    this.locale = options.locale\n    this.requiresOtherClause = !!options.requiresOtherClause\n    this.shouldParseSkeletons = !!options.shouldParseSkeletons\n  }\n\n  parse(): Result<MessageFormatElement[], ParserError> {\n    if (this.offset() !== 0) {\n      throw Error('parser can only be used once')\n    }\n    if (this.message.length > 0) {\n      const firstCode = this.message.charCodeAt(0)\n      if (\n        firstCode !== 35 /* # */ &&\n        firstCode !== 39 /* ' */ &&\n        firstCode !== 60 /* < */ &&\n        firstCode !== 123 /* { */ &&\n        firstCode !== 125 /* } */\n      ) {\n        const plainEndPosition = plainTopLevelEndPosition(this.message)\n        if (plainEndPosition) {\n          const start = this.clonePosition()\n          this.position = plainEndPosition\n          return {\n            val: [\n              {\n                type: TYPE.literal,\n                value: this.message,\n                location: createLocation(start, this.clonePosition()),\n              },\n            ],\n            err: null,\n          }\n        }\n      }\n    }\n    return this.parseMessage(0, '', false)\n  }\n\n  private parseMessage(\n    nestingLevel: number,\n    parentArgType: ArgType,\n    expectingCloseTag: boolean\n  ): Result<MessageFormatElement[], ParserError> {\n    let elements: MessageFormatElement[] = []\n\n    while (!this.isEOF()) {\n      const char = this.char()\n      if (char === 123 /* `{` */) {\n        const result = this.parseArgument(nestingLevel, expectingCloseTag)\n        if (result.err) {\n          return result\n        }\n        elements.push(result.val)\n      } else if (char === 125 /* `}` */ && nestingLevel > 0) {\n        break\n      } else if (\n        char === 35 /* `#` */ &&\n        (parentArgType === 'plural' || parentArgType === 'selectordinal')\n      ) {\n        const position = this.clonePosition()\n        this.bump()\n        elements.push({\n          type: TYPE.pound,\n          location: createLocation(position, this.clonePosition()),\n        })\n      } else if (\n        char === 60 /* `<` */ &&\n        !this.ignoreTag &&\n        this.peek() === 47 // char code for '/'\n      ) {\n        if (expectingCloseTag) {\n          break\n        } else {\n          return this.error(\n            ErrorKind.UNMATCHED_CLOSING_TAG,\n            createLocation(this.clonePosition(), this.clonePosition())\n          )\n        }\n      } else if (\n        char === 60 /* `<` */ &&\n        !this.ignoreTag &&\n        _isAlpha(this.peek() || 0)\n      ) {\n        const result = this.parseTag(nestingLevel, parentArgType)\n        if (result.err) {\n          return result\n        }\n        elements.push(result.val)\n      } else {\n        const result = this.parseLiteral(nestingLevel, parentArgType)\n        if (result.err) {\n          return result\n        }\n        elements.push(result.val)\n      }\n    }\n\n    return {val: elements, err: null}\n  }\n  /**\n   * A tag name must start with an ASCII lower/upper case letter. The grammar is based on the\n   * [custom element name][] except that a dash is NOT always mandatory and uppercase letters\n   * are accepted:\n   *\n   * ```\n   * tag ::= \"<\" tagName (whitespace)* \"/>\" | \"<\" tagName (whitespace)* \">\" message \"</\" tagName (whitespace)* \">\"\n   * tagName ::= [a-z] (PENChar)*\n   * PENChar ::=\n   *     \"-\" | \".\" | [0-9] | \"_\" | [a-z] | [A-Z] | #xB7 | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x37D] |\n   *     [#x37F-#x1FFF] | [#x200C-#x200D] | [#x203F-#x2040] | [#x2070-#x218F] | [#x2C00-#x2FEF] |\n   *     [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]\n   * ```\n   *\n   * [custom element name]: https://html.spec.whatwg.org/multipage/custom-elements.html#valid-custom-element-name\n   * NOTE: We're a bit more lax here since HTML technically does not allow uppercase HTML element but we do\n   * since other tag-based engines like React allow it\n   */\n  private parseTag(\n    nestingLevel: number,\n    parentArgType: ArgType\n  ): Result<TagElement | LiteralElement, ParserError> {\n    const startPosition = this.clonePosition()\n    this.bump() // `<`\n\n    const tagName = this.parseTagName()\n    this.bumpSpace()\n\n    if (this.bumpIf('/>')) {\n      // Self closing tag\n      return {\n        val: {\n          type: TYPE.literal,\n          value: `<${tagName}/>`,\n          location: createLocation(startPosition, this.clonePosition()),\n        } as LiteralElement,\n        err: null,\n      }\n    } else if (this.bumpIf('>')) {\n      const childrenResult = this.parseMessage(\n        nestingLevel + 1,\n        parentArgType,\n        true\n      )\n      if (childrenResult.err) {\n        return childrenResult\n      }\n      const children = childrenResult.val\n\n      // Expecting a close tag\n      const endTagStartPosition = this.clonePosition()\n\n      if (this.bumpIf('</')) {\n        if (this.isEOF() || !_isAlpha(this.char())) {\n          return this.error(\n            ErrorKind.INVALID_TAG,\n            createLocation(endTagStartPosition, this.clonePosition())\n          )\n        }\n\n        const closingTagNameStartPosition = this.clonePosition()\n        const closingTagName = this.parseTagName()\n        if (tagName !== closingTagName) {\n          return this.error(\n            ErrorKind.UNMATCHED_CLOSING_TAG,\n            createLocation(closingTagNameStartPosition, this.clonePosition())\n          )\n        }\n\n        this.bumpSpace()\n        if (!this.bumpIf('>')) {\n          return this.error(\n            ErrorKind.INVALID_TAG,\n            createLocation(endTagStartPosition, this.clonePosition())\n          )\n        }\n\n        return {\n          val: {\n            type: TYPE.tag,\n            value: tagName,\n            children,\n            location: createLocation(startPosition, this.clonePosition()),\n          },\n          err: null,\n        }\n      } else {\n        return this.error(\n          ErrorKind.UNCLOSED_TAG,\n          createLocation(startPosition, this.clonePosition())\n        )\n      }\n    } else {\n      return this.error(\n        ErrorKind.INVALID_TAG,\n        createLocation(startPosition, this.clonePosition())\n      )\n    }\n  }\n\n  /**\n   * This method assumes that the caller has peeked ahead for the first tag character.\n   */\n  private parseTagName(): string {\n    const startOffset = this.offset()\n\n    this.bump() // the first tag name character\n    while (!this.isEOF() && _isPotentialElementNameChar(this.char())) {\n      this.bump()\n    }\n    return this.message.slice(startOffset, this.offset())\n  }\n\n  private parseLiteral(\n    nestingLevel: number,\n    parentArgType: ArgType\n  ): Result<LiteralElement, ParserError> {\n    const start = this.clonePosition()\n\n    let value = ''\n    while (true) {\n      const parseQuoteResult = this.tryParseQuote(parentArgType)\n      if (parseQuoteResult) {\n        value += parseQuoteResult\n        continue\n      }\n\n      const parseUnquotedResult = this.tryParseUnquoted(\n        nestingLevel,\n        parentArgType\n      )\n      if (parseUnquotedResult) {\n        value += parseUnquotedResult\n        continue\n      }\n\n      const parseLeftAngleResult = this.tryParseLeftAngleBracket()\n      if (parseLeftAngleResult) {\n        value += parseLeftAngleResult\n        continue\n      }\n\n      break\n    }\n\n    const location = createLocation(start, this.clonePosition())\n    return {\n      val: {type: TYPE.literal, value, location},\n      err: null,\n    }\n  }\n\n  tryParseLeftAngleBracket(): string | null {\n    if (\n      !this.isEOF() &&\n      this.char() === 60 /* `<` */ &&\n      (this.ignoreTag ||\n        // If at the opening tag or closing tag position, bail.\n        !_isAlphaOrSlash(this.peek() || 0))\n    ) {\n      this.bump() // `<`\n      return '<'\n    }\n    return null\n  }\n\n  /**\n   * Starting with ICU 4.8, an ASCII apostrophe only starts quoted text if it immediately precedes\n   * a character that requires quoting (that is, \"only where needed\"), and works the same in\n   * nested messages as on the top level of the pattern. The new behavior is otherwise compatible.\n   */\n  private tryParseQuote(parentArgType: ArgType): string | null {\n    if (this.isEOF() || this.char() !== 39 /* `'` */) {\n      return null\n    }\n\n    // Parse escaped char following the apostrophe, or early return if there is no escaped char.\n    // Check if is valid escaped character\n    switch (this.peek()) {\n      case 39 /* `'` */:\n        // double quote, should return as a single quote.\n        this.bump()\n        this.bump()\n        return \"'\"\n      // '{', '<', '>', '}'\n      case 123:\n      case 60:\n      case 62:\n      case 125:\n        break\n      case 35: // '#'\n        if (parentArgType === 'plural' || parentArgType === 'selectordinal') {\n          break\n        }\n        return null\n      default:\n        return null\n    }\n\n    this.bump() // apostrophe\n    const codePoints = [this.char()] // escaped char\n    this.bump()\n\n    // read chars until the optional closing apostrophe is found\n    while (!this.isEOF()) {\n      const ch = this.char()\n      if (ch === 39 /* `'` */) {\n        if (this.peek() === 39 /* `'` */) {\n          codePoints.push(39)\n          // Bump one more time because we need to skip 2 characters.\n          this.bump()\n        } else {\n          // Optional closing apostrophe.\n          this.bump()\n          break\n        }\n      } else {\n        codePoints.push(ch)\n      }\n      this.bump()\n    }\n\n    return String.fromCodePoint(...codePoints)\n  }\n\n  private tryParseUnquoted(\n    nestingLevel: number,\n    parentArgType: ArgType\n  ): string | null {\n    if (this.isEOF()) {\n      return null\n    }\n    const ch = this.char()\n\n    if (\n      ch === 60 /* `<` */ ||\n      ch === 123 /* `{` */ ||\n      (ch === 35 /* `#` */ &&\n        (parentArgType === 'plural' || parentArgType === 'selectordinal')) ||\n      (ch === 125 /* `}` */ && nestingLevel > 0)\n    ) {\n      return null\n    } else {\n      this.bump()\n      return String.fromCodePoint(ch)\n    }\n  }\n\n  private parseArgument(\n    nestingLevel: number,\n    expectingCloseTag: boolean\n  ): Result<MessageFormatElement, ParserError> {\n    const openingBracePosition = this.clonePosition()\n    this.bump() // `{`\n\n    this.bumpSpace()\n\n    if (this.isEOF()) {\n      return this.error(\n        ErrorKind.EXPECT_ARGUMENT_CLOSING_BRACE,\n        createLocation(openingBracePosition, this.clonePosition())\n      )\n    }\n\n    if (this.char() === 125 /* `}` */) {\n      this.bump()\n      return this.error(\n        ErrorKind.EMPTY_ARGUMENT,\n        createLocation(openingBracePosition, this.clonePosition())\n      )\n    }\n\n    // argument name\n    let value = this.parseIdentifierIfPossible().value\n    if (!value) {\n      return this.error(\n        ErrorKind.MALFORMED_ARGUMENT,\n        createLocation(openingBracePosition, this.clonePosition())\n      )\n    }\n\n    this.bumpSpace()\n\n    if (this.isEOF()) {\n      return this.error(\n        ErrorKind.EXPECT_ARGUMENT_CLOSING_BRACE,\n        createLocation(openingBracePosition, this.clonePosition())\n      )\n    }\n\n    switch (this.char()) {\n      // Simple argument: `{name}`\n      case 125 /* `}` */: {\n        this.bump() // `}`\n        return {\n          val: {\n            type: TYPE.argument,\n            // value does not include the opening and closing braces.\n            value,\n            location: createLocation(\n              openingBracePosition,\n              this.clonePosition()\n            ),\n          },\n          err: null,\n        }\n      }\n      // Argument with options: `{name, format, ...}`\n      case 44 /* `,` */: {\n        this.bump() // `,`\n        this.bumpSpace()\n\n        if (this.isEOF()) {\n          return this.error(\n            ErrorKind.EXPECT_ARGUMENT_CLOSING_BRACE,\n            createLocation(openingBracePosition, this.clonePosition())\n          )\n        }\n\n        return this.parseArgumentOptions(\n          nestingLevel,\n          expectingCloseTag,\n          value,\n          openingBracePosition\n        )\n      }\n      default:\n        return this.error(\n          ErrorKind.MALFORMED_ARGUMENT,\n          createLocation(openingBracePosition, this.clonePosition())\n        )\n    }\n  }\n\n  /**\n   * Advance the parser until the end of the identifier, if it is currently on\n   * an identifier character. Return an empty string otherwise.\n   */\n  private parseIdentifierIfPossible(): {value: string; location: Location} {\n    const startingPosition = this.clonePosition()\n\n    const startOffset = this.offset()\n    const value = matchIdentifierAtIndex(this.message, startOffset)\n    const endOffset = startOffset + value.length\n\n    this.bumpTo(endOffset)\n\n    const endPosition = this.clonePosition()\n    const location = createLocation(startingPosition, endPosition)\n\n    return {value, location}\n  }\n\n  private parseArgumentOptions(\n    nestingLevel: number,\n    expectingCloseTag: boolean,\n    value: string,\n    openingBracePosition: Position\n  ): Result<MessageFormatElement, ParserError> {\n    // Parse this range:\n    // {name, type, style}\n    //        ^---^\n    let typeStartPosition = this.clonePosition()\n    let argType = this.parseIdentifierIfPossible().value\n    let typeEndPosition = this.clonePosition()\n\n    switch (argType) {\n      case '':\n        // Expecting a style string number, date, time, plural, selectordinal, or select.\n        return this.error(\n          ErrorKind.EXPECT_ARGUMENT_TYPE,\n          createLocation(typeStartPosition, typeEndPosition)\n        )\n      case 'number':\n      case 'date':\n      case 'time': {\n        // Parse this range:\n        // {name, number, style}\n        //              ^-------^\n        this.bumpSpace()\n        let styleAndLocation: {\n          style: string\n          styleLocation: Location\n        } | null = null\n\n        if (this.bumpIf(',')) {\n          this.bumpSpace()\n\n          const styleStartPosition = this.clonePosition()\n          const result = this.parseSimpleArgStyleIfPossible()\n          if (result.err) {\n            return result\n          }\n          const style = trimEnd(result.val)\n\n          if (style.length === 0) {\n            return this.error(\n              ErrorKind.EXPECT_ARGUMENT_STYLE,\n              createLocation(this.clonePosition(), this.clonePosition())\n            )\n          }\n\n          const styleLocation = createLocation(\n            styleStartPosition,\n            this.clonePosition()\n          )\n          styleAndLocation = {style, styleLocation}\n        }\n\n        const argCloseResult = this.tryParseArgumentClose(openingBracePosition)\n        if (argCloseResult.err) {\n          return argCloseResult\n        }\n\n        const location = createLocation(\n          openingBracePosition,\n          this.clonePosition()\n        )\n\n        // Extract style or skeleton\n        if (styleAndLocation && styleAndLocation.style.startsWith('::')) {\n          // Skeleton starts with `::`.\n          let skeleton = trimStart(styleAndLocation.style.slice(2))\n\n          if (argType === 'number') {\n            const result = this.parseNumberSkeletonFromString(\n              skeleton,\n              styleAndLocation.styleLocation\n            )\n            if (result.err) {\n              return result\n            }\n            return {\n              val: {type: TYPE.number, value, location, style: result.val},\n              err: null,\n            }\n          } else {\n            if (skeleton.length === 0) {\n              return this.error(ErrorKind.EXPECT_DATE_TIME_SKELETON, location)\n            }\n\n            let dateTimePattern = skeleton\n\n            // Get \"best match\" pattern only if locale is passed, if not, let it\n            // pass as-is where `parseDateTimeSkeleton()` will throw an error\n            // for unsupported patterns.\n            if (this.locale) {\n              dateTimePattern = getBestPattern(skeleton, this.locale)\n            }\n\n            const style: DateTimeSkeleton = {\n              type: SKELETON_TYPE.dateTime,\n              pattern: dateTimePattern,\n              location: styleAndLocation.styleLocation,\n              parsedOptions: this.shouldParseSkeletons\n                ? parseDateTimeSkeleton(dateTimePattern)\n                : {},\n            }\n\n            const type = argType === 'date' ? TYPE.date : TYPE.time\n            return {\n              val: {type, value, location, style},\n              err: null,\n            }\n          }\n        }\n\n        // Regular style or no style.\n        return {\n          val: {\n            type:\n              argType === 'number'\n                ? TYPE.number\n                : argType === 'date'\n                  ? TYPE.date\n                  : TYPE.time,\n            value,\n            location,\n            style: styleAndLocation?.style ?? null,\n          },\n          err: null,\n        }\n      }\n      case 'plural':\n      case 'selectordinal':\n      case 'select': {\n        // Parse this range:\n        // {name, plural, options}\n        //              ^---------^\n        const typeEndPosition = this.clonePosition()\n        this.bumpSpace()\n\n        if (!this.bumpIf(',')) {\n          return this.error(\n            ErrorKind.EXPECT_SELECT_ARGUMENT_OPTIONS,\n            createLocation(typeEndPosition, {...typeEndPosition})\n          )\n        }\n        this.bumpSpace()\n\n        // Parse offset:\n        // {name, plural, offset:1, options}\n        //                ^-----^\n        //\n        // or the first option:\n        //\n        // {name, plural, one {...} other {...}}\n        //                ^--^\n        let identifierAndLocation = this.parseIdentifierIfPossible()\n\n        let pluralOffset = 0\n        if (argType !== 'select' && identifierAndLocation.value === 'offset') {\n          if (!this.bumpIf(':')) {\n            return this.error(\n              ErrorKind.EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE,\n              createLocation(this.clonePosition(), this.clonePosition())\n            )\n          }\n          this.bumpSpace()\n          const result = this.tryParseDecimalInteger(\n            ErrorKind.EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE,\n            ErrorKind.INVALID_PLURAL_ARGUMENT_OFFSET_VALUE\n          )\n          if (result.err) {\n            return result\n          }\n\n          // Parse another identifier for option parsing\n          this.bumpSpace()\n          identifierAndLocation = this.parseIdentifierIfPossible()\n\n          pluralOffset = result.val\n        }\n\n        const optionsResult = this.tryParsePluralOrSelectOptions(\n          nestingLevel,\n          argType,\n          expectingCloseTag,\n          identifierAndLocation\n        )\n        if (optionsResult.err) {\n          return optionsResult\n        }\n\n        const argCloseResult = this.tryParseArgumentClose(openingBracePosition)\n        if (argCloseResult.err) {\n          return argCloseResult\n        }\n\n        const location = createLocation(\n          openingBracePosition,\n          this.clonePosition()\n        )\n\n        if (argType === 'select') {\n          return {\n            val: {\n              type: TYPE.select,\n              value,\n              options: fromEntries(optionsResult.val),\n              location,\n            },\n            err: null,\n          }\n        } else {\n          return {\n            val: {\n              type: TYPE.plural,\n              value,\n              options: fromEntries(optionsResult.val),\n              offset: pluralOffset,\n              pluralType: argType === 'plural' ? 'cardinal' : 'ordinal',\n              location,\n            },\n            err: null,\n          }\n        }\n      }\n      default:\n        return this.error(\n          ErrorKind.INVALID_ARGUMENT_TYPE,\n          createLocation(typeStartPosition, typeEndPosition)\n        )\n    }\n  }\n\n  private tryParseArgumentClose(\n    openingBracePosition: Position\n  ): Result<true, ParserError> {\n    // Parse: {value, number, ::currency/GBP }\n    //\n    if (this.isEOF() || this.char() !== 125 /* `}` */) {\n      return this.error(\n        ErrorKind.EXPECT_ARGUMENT_CLOSING_BRACE,\n        createLocation(openingBracePosition, this.clonePosition())\n      )\n    }\n    this.bump() // `}`\n    return {val: true, err: null}\n  }\n\n  /**\n   * See: https://github.com/unicode-org/icu/blob/af7ed1f6d2298013dc303628438ec4abe1f16479/icu4c/source/common/messagepattern.cpp#L659\n   */\n  private parseSimpleArgStyleIfPossible(): Result<string, ParserError> {\n    let nestedBraces = 0\n\n    const startPosition = this.clonePosition()\n    while (!this.isEOF()) {\n      const ch = this.char()\n      switch (ch) {\n        case 39 /* `'` */: {\n          // Treat apostrophe as quoting but include it in the style part.\n          // Find the end of the quoted literal text.\n          this.bump()\n          let apostrophePosition = this.clonePosition()\n\n          if (!this.bumpUntil(\"'\")) {\n            return this.error(\n              ErrorKind.UNCLOSED_QUOTE_IN_ARGUMENT_STYLE,\n              createLocation(apostrophePosition, this.clonePosition())\n            )\n          }\n          this.bump()\n          break\n        }\n        case 123 /* `{` */: {\n          nestedBraces += 1\n          this.bump()\n          break\n        }\n        case 125 /* `}` */: {\n          if (nestedBraces > 0) {\n            nestedBraces -= 1\n          } else {\n            return {\n              val: this.message.slice(startPosition.offset, this.offset()),\n              err: null,\n            }\n          }\n          break\n        }\n        default:\n          this.bump()\n          break\n      }\n    }\n    return {\n      val: this.message.slice(startPosition.offset, this.offset()),\n      err: null,\n    }\n  }\n\n  private parseNumberSkeletonFromString(\n    skeleton: string,\n    location: Location\n  ): Result<NumberSkeleton, ParserError> {\n    let tokens: NumberSkeletonToken[] = []\n    try {\n      tokens = parseNumberSkeletonFromString(skeleton)\n    } catch {\n      return this.error(ErrorKind.INVALID_NUMBER_SKELETON, location)\n    }\n\n    return {\n      val: {\n        type: SKELETON_TYPE.number,\n        tokens,\n        location,\n        parsedOptions: this.shouldParseSkeletons\n          ? parseNumberSkeleton(tokens)\n          : {},\n      },\n      err: null,\n    }\n  }\n\n  /**\n   * @param nesting_level The current nesting level of messages.\n   *     This can be positive when parsing message fragment in select or plural argument options.\n   * @param parent_arg_type The parent argument's type.\n   * @param parsed_first_identifier If provided, this is the first identifier-like selector of\n   *     the argument. It is a by-product of a previous parsing attempt.\n   * @param expecting_close_tag If true, this message is directly or indirectly nested inside\n   *     between a pair of opening and closing tags. The nested message will not parse beyond\n   *     the closing tag boundary.\n   */\n  private tryParsePluralOrSelectOptions(\n    nestingLevel: number,\n    parentArgType: ArgType,\n    expectCloseTag: boolean,\n    parsedFirstIdentifier: {value: string; location: Location}\n  ): Result<[string, PluralOrSelectOption][], ParserError> {\n    let hasOtherClause = false\n    const options: [string, PluralOrSelectOption][] = []\n    const parsedSelectors = new Set<string>()\n    let {value: selector, location: selectorLocation} = parsedFirstIdentifier\n\n    // Parse:\n    // one {one apple}\n    // ^--^\n    while (true) {\n      if (selector.length === 0) {\n        const startPosition = this.clonePosition()\n        if (parentArgType !== 'select' && this.bumpIf('=')) {\n          // Try parse `={number}` selector\n          const result = this.tryParseDecimalInteger(\n            ErrorKind.EXPECT_PLURAL_ARGUMENT_SELECTOR,\n            ErrorKind.INVALID_PLURAL_ARGUMENT_SELECTOR\n          )\n          if (result.err) {\n            return result\n          }\n          selectorLocation = createLocation(startPosition, this.clonePosition())\n          selector = this.message.slice(startPosition.offset, this.offset())\n        } else {\n          break\n        }\n      }\n\n      // Duplicate selector clauses\n      if (parsedSelectors.has(selector)) {\n        return this.error(\n          parentArgType === 'select'\n            ? ErrorKind.DUPLICATE_SELECT_ARGUMENT_SELECTOR\n            : ErrorKind.DUPLICATE_PLURAL_ARGUMENT_SELECTOR,\n          selectorLocation\n        )\n      }\n\n      if (selector === 'other') {\n        hasOtherClause = true\n      }\n\n      // Parse:\n      // one {one apple}\n      //     ^----------^\n      this.bumpSpace()\n      const openingBracePosition = this.clonePosition()\n      if (!this.bumpIf('{')) {\n        return this.error(\n          parentArgType === 'select'\n            ? ErrorKind.EXPECT_SELECT_ARGUMENT_SELECTOR_FRAGMENT\n            : ErrorKind.EXPECT_PLURAL_ARGUMENT_SELECTOR_FRAGMENT,\n          createLocation(this.clonePosition(), this.clonePosition())\n        )\n      }\n\n      const fragmentResult = this.parseMessage(\n        nestingLevel + 1,\n        parentArgType,\n        expectCloseTag\n      )\n      if (fragmentResult.err) {\n        return fragmentResult\n      }\n      const argCloseResult = this.tryParseArgumentClose(openingBracePosition)\n      if (argCloseResult.err) {\n        return argCloseResult\n      }\n\n      options.push([\n        selector,\n        {\n          value: fragmentResult.val,\n          location: createLocation(openingBracePosition, this.clonePosition()),\n        },\n      ])\n      // Keep track of the existing selectors\n      parsedSelectors.add(selector)\n\n      // Prep next selector clause.\n      this.bumpSpace()\n      ;({value: selector, location: selectorLocation} =\n        this.parseIdentifierIfPossible())\n    }\n\n    if (options.length === 0) {\n      return this.error(\n        parentArgType === 'select'\n          ? ErrorKind.EXPECT_SELECT_ARGUMENT_SELECTOR\n          : ErrorKind.EXPECT_PLURAL_ARGUMENT_SELECTOR,\n        createLocation(this.clonePosition(), this.clonePosition())\n      )\n    }\n\n    if (this.requiresOtherClause && !hasOtherClause) {\n      return this.error(\n        ErrorKind.MISSING_OTHER_CLAUSE,\n        createLocation(this.clonePosition(), this.clonePosition())\n      )\n    }\n\n    return {val: options, err: null}\n  }\n\n  private tryParseDecimalInteger(\n    expectNumberError: ErrorKind,\n    invalidNumberError: ErrorKind\n  ): Result<number, ParserError> {\n    let sign = 1\n    const startingPosition = this.clonePosition()\n\n    if (this.bumpIf('+')) {\n    } else if (this.bumpIf('-')) {\n      sign = -1\n    }\n\n    let hasDigits = false\n    let decimal = 0\n    while (!this.isEOF()) {\n      const ch = this.char()\n      if (ch >= 48 /* `0` */ && ch <= 57 /* `9` */) {\n        hasDigits = true\n        decimal = decimal * 10 + (ch - 48)\n        this.bump()\n      } else {\n        break\n      }\n    }\n\n    const location = createLocation(startingPosition, this.clonePosition())\n\n    if (!hasDigits) {\n      return this.error(expectNumberError, location)\n    }\n\n    decimal *= sign\n    if (!Number.isSafeInteger(decimal)) {\n      return this.error(invalidNumberError, location)\n    }\n\n    return {val: decimal, err: null}\n  }\n\n  private offset(): number {\n    return this.position.offset\n  }\n\n  private isEOF(): boolean {\n    return this.offset() === this.message.length\n  }\n\n  private clonePosition(): Position {\n    // This is much faster than `Object.assign` or spread.\n    return {\n      offset: this.position.offset,\n      line: this.position.line,\n      column: this.position.column,\n    }\n  }\n\n  /**\n   * Return the code point at the current position of the parser.\n   * Throws if the index is out of bound.\n   */\n  private char(): number {\n    const offset = this.position.offset\n    if (offset >= this.message.length) {\n      throw Error('out of bound')\n    }\n    const code = this.message.codePointAt(offset)\n    if (code === undefined) {\n      throw Error(`Offset ${offset} is at invalid UTF-16 code unit boundary`)\n    }\n    return code\n  }\n\n  private error(\n    kind: ErrorKind,\n    location: Location\n  ): Result<never, ParserError> {\n    return {\n      val: null,\n      err: {\n        kind,\n        message: this.message,\n        location,\n      },\n    }\n  }\n\n  /** Bump the parser to the next UTF-16 code unit. */\n  private bump(): void {\n    if (this.isEOF()) {\n      return\n    }\n    const code = this.char()\n    if (code === 10 /* '\\n' */) {\n      this.position.line += 1\n      this.position.column = 1\n      this.position.offset += 1\n    } else {\n      this.position.column += 1\n      // 0 ~ 0x10000 -> unicode BMP, otherwise skip the surrogate pair.\n      this.position.offset += code < 0x10000 ? 1 : 2\n    }\n  }\n\n  /**\n   * If the substring starting at the current position of the parser has\n   * the given prefix, then bump the parser to the character immediately\n   * following the prefix and return true. Otherwise, don't bump the parser\n   * and return false.\n   */\n  private bumpIf(prefix: string): boolean {\n    if (this.message.startsWith(prefix, this.offset())) {\n      for (let i = 0; i < prefix.length; i++) {\n        this.bump()\n      }\n      return true\n    }\n    return false\n  }\n\n  /**\n   * Bump the parser until the pattern character is found and return `true`.\n   * Otherwise bump to the end of the file and return `false`.\n   */\n  private bumpUntil(pattern: string): boolean {\n    const currentOffset = this.offset()\n    const index = this.message.indexOf(pattern, currentOffset)\n    if (index >= 0) {\n      this.bumpTo(index)\n      return true\n    } else {\n      this.bumpTo(this.message.length)\n      return false\n    }\n  }\n\n  /**\n   * Bump the parser to the target offset.\n   * If target offset is beyond the end of the input, bump the parser to the end of the input.\n   */\n  private bumpTo(targetOffset: number) {\n    if (this.offset() > targetOffset) {\n      throw Error(\n        `targetOffset ${targetOffset} must be greater than or equal to the current offset ${this.offset()}`\n      )\n    }\n\n    targetOffset = Math.min(targetOffset, this.message.length)\n    while (true) {\n      const offset = this.offset()\n      if (offset === targetOffset) {\n        break\n      }\n      if (offset > targetOffset) {\n        throw Error(\n          `targetOffset ${targetOffset} is at invalid UTF-16 code unit boundary`\n        )\n      }\n\n      this.bump()\n      if (this.isEOF()) {\n        break\n      }\n    }\n  }\n\n  /** advance the parser through all whitespace to the next non-whitespace code unit. */\n  private bumpSpace() {\n    while (!this.isEOF() && _isWhiteSpace(this.char())) {\n      this.bump()\n    }\n  }\n\n  /**\n   * Peek at the *next* Unicode codepoint in the input without advancing the parser.\n   * If the input has been exhausted, then this returns null.\n   */\n  private peek(): number | null {\n    if (this.isEOF()) {\n      return null\n    }\n    const code = this.char()\n    const offset = this.offset()\n    const nextCode = this.message.charCodeAt(offset + (code >= 0x10000 ? 2 : 1))\n    return nextCode ?? null\n  }\n}\n\n/**\n * This check if codepoint is alphabet (lower & uppercase)\n * @param codepoint\n * @returns\n */\nfunction _isAlpha(codepoint: number): boolean {\n  return (\n    (codepoint >= 97 && codepoint <= 122) ||\n    (codepoint >= 65 && codepoint <= 90)\n  )\n}\n\nfunction _isAlphaOrSlash(codepoint: number): boolean {\n  return _isAlpha(codepoint) || codepoint === 47 /* '/' */\n}\n\n/** See `parseTag` function docs. */\nfunction _isPotentialElementNameChar(c: number): boolean {\n  return (\n    c === 45 /* '-' */ ||\n    c === 46 /* '.' */ ||\n    (c >= 48 && c <= 57) /* 0..9 */ ||\n    c === 95 /* '_' */ ||\n    (c >= 97 && c <= 122) /** a..z */ ||\n    (c >= 65 && c <= 90) /* A..Z */ ||\n    c == 0xb7 ||\n    (c >= 0xc0 && c <= 0xd6) ||\n    (c >= 0xd8 && c <= 0xf6) ||\n    (c >= 0xf8 && c <= 0x37d) ||\n    (c >= 0x37f && c <= 0x1fff) ||\n    (c >= 0x200c && c <= 0x200d) ||\n    (c >= 0x203f && c <= 0x2040) ||\n    (c >= 0x2070 && c <= 0x218f) ||\n    (c >= 0x2c00 && c <= 0x2fef) ||\n    (c >= 0x3001 && c <= 0xd7ff) ||\n    (c >= 0xf900 && c <= 0xfdcf) ||\n    (c >= 0xfdf0 && c <= 0xfffd) ||\n    (c >= 0x10000 && c <= 0xeffff)\n  )\n}\n\n/**\n * Code point equivalent of regex `\\p{White_Space}`.\n * From: https://www.unicode.org/Public/UCD/latest/ucd/PropList.txt\n */\nfunction _isWhiteSpace(c: number) {\n  return (\n    (c >= 0x0009 && c <= 0x000d) ||\n    c === 0x0020 ||\n    c === 0x0085 ||\n    (c >= 0x200e && c <= 0x200f) ||\n    c === 0x2028 ||\n    c === 0x2029\n  )\n}\n","import {\n  isArgumentElement,\n  isDateElement,\n  isNumberElement,\n  isPluralElement,\n  isPoundElement,\n  isSelectElement,\n  isTagElement,\n  isTimeElement,\n  type MessageFormatElement,\n  type PluralElement,\n  type PluralOrSelectOption,\n  type SelectElement,\n  TYPE,\n} from '#packages/icu-messageformat-parser/types.js'\n\nfunction cloneDeep<T>(obj: T): T {\n  if (Array.isArray(obj)) {\n    // @ts-expect-error meh\n    return obj.map(cloneDeep)\n  }\n  if (obj !== null && typeof obj === 'object') {\n    // @ts-expect-error meh\n    return Object.keys(obj).reduce((cloned, k) => {\n      // @ts-expect-error meh\n      cloned[k] = cloneDeep(obj[k])\n      return cloned\n    }, {})\n  }\n  return obj\n}\n\n/**\n * Replace pound elements with number elements referencing the given variable.\n * This is needed when nesting plurals - the # in the outer plural should become\n * an explicit variable reference when nested inside another plural.\n * GH #4202\n */\nfunction replacePoundWithArgument(\n  ast: MessageFormatElement[],\n  variableName: string\n): MessageFormatElement[] {\n  return ast.map(el => {\n    if (isPoundElement(el)) {\n      // Replace # with {variableName, number}\n      return {\n        type: TYPE.number,\n        value: variableName,\n        style: null,\n        location: el.location,\n      }\n    }\n    if (isPluralElement(el) || isSelectElement(el)) {\n      // Recursively process options\n      const newOptions: Record<string, PluralOrSelectOption> = {}\n      for (const key of Object.keys(el.options)) {\n        newOptions[key] = {\n          value: replacePoundWithArgument(el.options[key].value, variableName),\n        }\n      }\n      return {...el, options: newOptions}\n    }\n    if (isTagElement(el)) {\n      return {\n        ...el,\n        children: replacePoundWithArgument(el.children, variableName),\n      }\n    }\n    return el\n  })\n}\n\nfunction hoistPluralOrSelectElement(\n  ast: MessageFormatElement[],\n  el: PluralElement | SelectElement,\n  positionToInject: number\n) {\n  // pull this out of the ast and move it to the top\n  const cloned = cloneDeep(el)\n  const {options} = cloned\n\n  // GH #4202: Check if there are other plural/select elements after this one\n  const afterElements = ast.slice(positionToInject + 1)\n  const hasSubsequentPluralOrSelect = afterElements.some(\n    isPluralOrSelectElement\n  )\n\n  cloned.options = Object.keys(options).reduce(\n    (all: Record<string, PluralOrSelectOption>, k) => {\n      let optionValue = options[k].value\n\n      // GH #4202: If there are subsequent plurals/selects and this is a plural,\n      // replace # with explicit variable reference to avoid ambiguity\n      if (hasSubsequentPluralOrSelect && isPluralElement(el)) {\n        optionValue = replacePoundWithArgument(optionValue, el.value)\n      }\n\n      const newValue = hoistSelectors([\n        ...ast.slice(0, positionToInject),\n        ...optionValue,\n        ...afterElements,\n      ])\n      all[k] = {\n        value: newValue,\n      }\n      return all\n    },\n    {}\n  )\n  return cloned\n}\n\nfunction isPluralOrSelectElement(\n  el: MessageFormatElement\n): el is PluralElement | SelectElement {\n  return isPluralElement(el) || isSelectElement(el)\n}\n\nfunction findPluralOrSelectElement(ast: MessageFormatElement[]): boolean {\n  return !!ast.find(el => {\n    if (isPluralOrSelectElement(el)) {\n      return true\n    }\n    if (isTagElement(el)) {\n      return findPluralOrSelectElement(el.children)\n    }\n    return false\n  })\n}\n\n/**\n * Hoist all selectors to the beginning of the AST & flatten the\n * resulting options. E.g:\n * \"I have {count, plural, one{a dog} other{many dogs}}\"\n * becomes \"{count, plural, one{I have a dog} other{I have many dogs}}\".\n * If there are multiple selectors, the order of which one is hoisted 1st\n * is non-deterministic.\n * The goal is to provide as many full sentences as possible since fragmented\n * sentences are not translator-friendly\n * @param ast AST\n */\nexport function hoistSelectors(\n  ast: MessageFormatElement[]\n): MessageFormatElement[] {\n  for (let i = 0; i < ast.length; i++) {\n    const el = ast[i]\n    if (isPluralOrSelectElement(el)) {\n      return [hoistPluralOrSelectElement(ast, el, i)]\n    }\n    if (isTagElement(el) && findPluralOrSelectElement([el])) {\n      throw new Error(\n        'Cannot hoist plural/select within a tag element. Please put the tag element inside each plural/select option'\n      )\n    }\n  }\n  return ast\n}\n\n/**\n * Collect all variables in an AST to Record<string, TYPE>\n * @param ast AST to collect variables from\n * @param vars Record of variable name to variable type\n */\nfunction collectVariables(\n  ast: MessageFormatElement[],\n  vars: Map<string, TYPE> = new Map<string, TYPE>()\n): void {\n  ast.forEach(el => {\n    if (\n      isArgumentElement(el) ||\n      isDateElement(el) ||\n      isTimeElement(el) ||\n      isNumberElement(el)\n    ) {\n      // If the variable was already registered as a plural/select, it's normal\n      // for it to also appear inside as number/date/time/argument — not a conflict.\n      if (vars.has(el.value)) {\n        const existingType = vars.get(el.value)!\n        if (\n          existingType !== el.type &&\n          existingType !== TYPE.plural &&\n          existingType !== TYPE.select\n        ) {\n          throw new Error(`Variable ${el.value} has conflicting types`)\n        }\n      } else {\n        vars.set(el.value, el.type)\n      }\n    }\n\n    if (isPluralElement(el) || isSelectElement(el)) {\n      vars.set(el.value, el.type)\n      Object.keys(el.options).forEach(k => {\n        collectVariables(el.options[k].value, vars)\n      })\n    }\n\n    if (isTagElement(el)) {\n      vars.set(el.value, el.type)\n      collectVariables(el.children, vars)\n    }\n  })\n}\n\ninterface IsStructurallySameResult {\n  error?: Error\n  success: boolean\n}\n\n/**\n * Check if 2 ASTs are structurally the same. This primarily means that\n * they have the same variables with the same type\n * @param a\n * @param b\n * @returns\n */\nexport function isStructurallySame(\n  a: MessageFormatElement[],\n  b: MessageFormatElement[]\n): IsStructurallySameResult {\n  const aVars = new Map<string, TYPE>()\n  const bVars = new Map<string, TYPE>()\n  collectVariables(a, aVars)\n  collectVariables(b, bVars)\n\n  if (aVars.size !== bVars.size) {\n    return {\n      success: false,\n      error: new Error(\n        `Different number of variables: [${Array.from(aVars.keys()).join(', ')}] vs [${Array.from(bVars.keys()).join(', ')}]`\n      ),\n    }\n  }\n\n  return Array.from(aVars.entries()).reduce<IsStructurallySameResult>(\n    (result, [key, type]) => {\n      if (!result.success) {\n        return result\n      }\n      const bType = bVars.get(key)\n      if (bType == null) {\n        return {\n          success: false,\n          error: new Error(`Missing variable ${key} in message`),\n        }\n      }\n      if (bType !== type) {\n        return {\n          success: false,\n          error: new Error(\n            `Variable ${key} has conflicting types: ${TYPE[type]} vs ${TYPE[bType]}`\n          ),\n        }\n      }\n      return result\n    },\n    {success: true}\n  )\n}\n","import {ErrorKind} from '#packages/icu-messageformat-parser/error.js'\nimport {\n  Parser,\n  type ParserOptions,\n} from '#packages/icu-messageformat-parser/parser.js'\nimport {\n  isDateElement,\n  isDateTimeSkeleton,\n  isNumberElement,\n  isNumberSkeleton,\n  isPluralElement,\n  isSelectElement,\n  isTagElement,\n  isTimeElement,\n  type MessageFormatElement,\n} from '#packages/icu-messageformat-parser/types.js'\n\nfunction pruneLocation(els: MessageFormatElement[]): void {\n  els.forEach(el => {\n    delete el.location\n    if (isSelectElement(el) || isPluralElement(el)) {\n      for (const k in el.options) {\n        delete el.options[k].location\n        pruneLocation(el.options[k].value)\n      }\n    } else if (isNumberElement(el) && isNumberSkeleton(el.style)) {\n      delete el.style.location\n    } else if (\n      (isDateElement(el) || isTimeElement(el)) &&\n      isDateTimeSkeleton(el.style)\n    ) {\n      delete el.style.location\n    } else if (isTagElement(el)) {\n      pruneLocation(el.children)\n    }\n  })\n}\n\nexport function parse(\n  message: string,\n  opts: ParserOptions = {}\n): MessageFormatElement[] {\n  opts = {\n    shouldParseSkeletons: true,\n    requiresOtherClause: true,\n    ...opts,\n  }\n  const result = new Parser(message, opts).parse()\n  if (result.err) {\n    const error = SyntaxError(ErrorKind[result.err.kind])\n    // @ts-expect-error Assign to error object\n    error.location = result.err.location\n    // @ts-expect-error Assign to error object\n    error.originalMessage = result.err.message\n    throw error\n  }\n\n  if (!opts?.captureLocation) {\n    pruneLocation(result.val)\n  }\n  return result.val\n}\nexport * from '#packages/icu-messageformat-parser/types.js'\nexport type {ParserOptions}\n// only for testing\nexport const _Parser: typeof Parser = Parser\nexport {isStructurallySame} from '#packages/icu-messageformat-parser/manipulator.js'\n"],"x_google_ignoreList":[2,3],"mappings":"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MAAM,CAAC,KAAK,IAAI;CAChB,MAAM,CAAC,GAAG;CACV,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,GAAG;CACf,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,GAAG;CACV,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,GAAG;CACf,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,GAAG;CACf,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,MAAM,GAAG;CAChB,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,GAAG;CACV,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,GAAG;CACV,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,GAAG;CACf,MAAM,CAAC,GAAG;CACV,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,GAAG;CACf,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,GAAG;CACV,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,GAAG;CACf,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,GAAG;CACf,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,GAAG;CACf,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM,CAAC,KAAK,GAAG;CACf,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,GAAG;CACV,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,GAAG;CACf,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,MAAM,GAAG;CAChB,MAAM,CAAC,GAAG;CACV,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,GAAG;CACf,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM,CAAC,KAAK,GAAG;CACf,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,GAAG;CACV,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,GAAG;CACf,MAAM,CAAC,KAAK,GAAG;CACf,MAAM,CAAC,KAAK,GAAG;CACf,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM,CAAC,GAAG;CACV,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM,CAAC,KAAK,GAAG;CACf,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,GAAG;CACf,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,GAAG;CACf,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM,CAAC,KAAK,GAAG;CACf,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM,CAAC,GAAG;CACV,MAAM,CAAC,KAAK,GAAG;CACf,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,GAAG;CACV,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM,CAAC,GAAG;CACV,MAAM,CAAC,GAAG;CACV,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,GAAG;CACf,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM,CAAC,KAAK,GAAG;CACf,MAAM,CAAC,KAAK,GAAG;CACf,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,GAAG;CACf,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,GAAG;CACf,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,GAAG;CACf,MAAM,CAAC,KAAK,GAAG;CACf,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM,CAAC,KAAK,GAAG;CACf,MAAM;EACL;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,IAAI;CAChB,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;CACD;CACA,MAAM,CAAC,KAAK,GAAG;CACf,SAAS;EACR;EACA;EACA;EACA;CACD;CACA,UAAU;EACT;EACA;EACA;EACA;CACD;CACA,SAAS;EACR;EACA;EACA;CACD;CACA,UAAU;EACT;EACA;EACA;EACA;CACD;CACA,SAAS;EACR;EACA;EACA;EACA;CACD;CACA,SAAS;EACR;EACA;EACA;EACA;CACD;CACA,SAAS;EACR;EACA;EACA;EACA;CACD;CACA,SAAS;EACR;EACA;EACA;EACA;CACD;CACA,SAAS;EACR;EACA;EACA;EACA;CACD;CACA,SAAS;EACR;EACA;EACA;EACA;CACD;CACA,SAAS;EACR;EACA;EACA;CACD;CACA,SAAS;EACR;EACA;EACA;CACD;CACA,SAAS;EACR;EACA;EACA;EACA;CACD;CACA,SAAS;EACR;EACA;EACA;CACD;CACA,SAAS;EACR;EACA;EACA;CACD;CACA,SAAS;EACR;EACA;EACA;CACD;CACA,SAAS;EACR;EACA;EACA;CACD;CACA,SAAS,CAAC,KAAK,IAAI;CACnB,SAAS;EACR;EACA;EACA;CACD;CACA,SAAS;EACR;EACA;EACA;EACA;CACD;CACA,SAAS;EACR;EACA;EACA;EACA;CACD;CACA,SAAS;EACR;EACA;EACA;EACA;CACD;CACA,SAAS;EACR;EACA;EACA;CACD;CACA,SAAS;EACR;EACA;EACA;EACA;CACD;AACD;;;;;;;;;;ACnoCA,SAAgB,eAAe,UAAkB,QAA6B;CAC5E,IAAI,eAAe;CACnB,KAAK,IAAI,aAAa,GAAG,aAAa,SAAS,QAAQ,cAAc;EACnE,MAAM,cAAc,SAAS,OAAO,UAAU;EAE9C,IAAI,gBAAgB,KAAK;GACvB,IAAI,cAAc;GAClB,OACE,aAAa,IAAI,SAAS,UAC1B,SAAS,OAAO,aAAa,CAAC,MAAM,aACpC;IACA;IACA;GACF;GAEA,IAAI,UAAU,KAAK,cAAc;GACjC,IAAI,eAAe,cAAc,IAAI,IAAI,KAAK,eAAe;GAC7D,I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"}