{"version":3,"file":"fieldState.cjs","sources":["../../../src/field/fieldState.ts"],"sourcesContent":["import { getFieldMatcher } from '../transformations/matchers';\nimport {\n  DataFrame,\n  FieldType,\n  Field,\n  TIME_SERIES_TIME_FIELD_NAME,\n  TIME_SERIES_VALUE_FIELD_NAME,\n} from '../types/dataFrame';\nimport { FieldConfigSource } from '../types/fieldOverrides';\nimport { formatLabels } from '../utils/labels';\n\n/**\n * Get an appropriate display title\n */\nexport function getFrameDisplayName(frame: DataFrame, index?: number) {\n  if (frame.name) {\n    return frame.name;\n  }\n\n  const valueFieldNames: string[] = [];\n  for (const field of frame.fields) {\n    if (field.type === FieldType.time) {\n      continue;\n    }\n\n    // No point in doing more\n    if (valueFieldNames.length > 1) {\n      break;\n    }\n\n    valueFieldNames.push(getFieldDisplayName(field, frame));\n  }\n\n  // If the frame has a single value field then use the name of that field as the frame name\n  if (valueFieldNames.length === 1) {\n    return valueFieldNames[0];\n  }\n\n  // list all the\n  if (index === undefined && frame.fields.length > 0) {\n    return frame.fields\n      .filter((f) => f.type !== FieldType.time)\n      .map((f) => getFieldDisplayName(f, frame))\n      .join(', ');\n  }\n\n  if (frame.refId) {\n    return `Series (${frame.refId})`;\n  }\n\n  return `Series (${index})`;\n}\n\nexport function cacheFieldDisplayNames(frames: DataFrame[]) {\n  frames.forEach((frame) => {\n    frame.fields.forEach((field) => {\n      getFieldDisplayName(field, frame, frames);\n    });\n  });\n}\n\n/**\n *\n * moves each field's config.custom.hideFrom to field.state.hideFrom\n * and mutates original field.config.custom.hideFrom to one with explicit overrides only, (without the ad-hoc stateful __system override from legend toggle)\n */\nexport function decoupleHideFromState(frames: DataFrame[], fieldConfig: FieldConfigSource) {\n  frames.forEach((frame) => {\n    frame.fields.forEach((field) => {\n      const hideFrom = {\n        legend: false,\n        tooltip: false,\n        viz: false,\n        ...fieldConfig.defaults.custom?.hideFrom,\n      };\n\n      // with ad hoc __system override applied\n      const hideFromState = field.config.custom?.hideFrom;\n\n      fieldConfig.overrides.forEach((o) => {\n        if ('__systemRef' in o) {\n          return;\n        }\n\n        const m = getFieldMatcher(o.matcher);\n\n        if (m(field, frame, frames)) {\n          for (const p of o.properties) {\n            if (p.id === 'custom.hideFrom') {\n              Object.assign(hideFrom, p.value);\n            }\n          }\n        }\n      });\n\n      field.state = {\n        ...field.state,\n        hideFrom: {\n          ...hideFromState,\n        },\n      };\n\n      // original with perm overrides\n      field.config.custom = field.config.custom ?? {};\n      field.config.custom.hideFrom = hideFrom;\n    });\n  });\n}\n\nexport function getFieldDisplayName(field: Field, frame?: DataFrame, allFrames?: DataFrame[]): string {\n  const existingTitle = field.state?.displayName;\n  const multipleFrames = Boolean(allFrames && allFrames.length > 1);\n\n  if (existingTitle && multipleFrames === field.state?.multipleFrames) {\n    return existingTitle;\n  }\n\n  const displayName = calculateFieldDisplayName(field, frame, allFrames);\n  field.state = field.state || {};\n  field.state.displayName = displayName;\n  field.state.multipleFrames = multipleFrames;\n\n  return displayName;\n}\n\n/**\n * Get an appropriate display name. If the 'displayName' field config is set, use that.\n */\nexport function calculateFieldDisplayName(field: Field, frame?: DataFrame, allFrames?: DataFrame[]): string {\n  const hasConfigTitle = field.config?.displayName && field.config?.displayName.length;\n  const isComparisonSeries = Boolean(frame?.meta?.timeCompare?.isTimeShiftQuery);\n  let displayName = hasConfigTitle ? field.config!.displayName! : field.name;\n\n  if (hasConfigTitle) {\n    return isComparisonSeries ? `${displayName} (comparison)` : displayName;\n  }\n\n  if (frame && field.config?.displayNameFromDS) {\n    return isComparisonSeries ? `${field.config.displayNameFromDS} (comparison)` : field.config.displayNameFromDS;\n  }\n\n  // This is an ugly exception for time field\n  // For time series we should normally treat time field with same name\n  // But in case it has a join source we should handle it as normal field\n  if (field.type === FieldType.time && !field.labels) {\n    return displayName ?? TIME_SERIES_TIME_FIELD_NAME;\n  }\n\n  let parts: string[] = [];\n  let frameNamesDiffer = false;\n\n  if (allFrames && allFrames.length > 1) {\n    for (let i = 1; i < allFrames.length; i++) {\n      const frame = allFrames[i];\n      if (frame.name !== allFrames[i - 1].name) {\n        frameNamesDiffer = true;\n        break;\n      }\n    }\n  }\n\n  let frameNameAdded = false;\n  let labelsAdded = false;\n\n  if (frameNamesDiffer && frame?.name) {\n    parts.push(frame.name);\n    frameNameAdded = true;\n  }\n\n  if (field.name && field.name !== TIME_SERIES_VALUE_FIELD_NAME) {\n    parts.push(field.name);\n  }\n\n  if (field.labels && frame) {\n    let singleLabelName = getSingleLabelName(allFrames ?? [frame]);\n\n    if (!singleLabelName) {\n      let allLabels = formatLabels(field.labels);\n      if (allLabels) {\n        parts.push(allLabels);\n        labelsAdded = true;\n      }\n    } else if (field.labels[singleLabelName]) {\n      parts.push(field.labels[singleLabelName]);\n      labelsAdded = true;\n    }\n  }\n\n  // if we have not added frame name and no labels, and field name = Value, we should add frame name\n  if (frame && !frameNameAdded && !labelsAdded && field.name === TIME_SERIES_VALUE_FIELD_NAME) {\n    if (frame.name && frame.name.length > 0) {\n      parts.push(frame.name);\n      frameNameAdded = true;\n    }\n  }\n\n  if (parts.length) {\n    displayName = parts.join(' ');\n  } else if (field.name) {\n    displayName = field.name;\n  } else {\n    displayName = TIME_SERIES_VALUE_FIELD_NAME;\n  }\n\n  // Ensure unique field name\n  if (displayName === field.name) {\n    displayName = getUniqueFieldName(field, frame);\n  }\n\n  if (isComparisonSeries) {\n    displayName = `${displayName} (comparison)`;\n  }\n  return displayName;\n}\n\nexport function getUniqueFieldName(field: Field, frame?: DataFrame) {\n  let dupeCount = 0;\n  let foundSelf = false;\n\n  if (frame) {\n    for (let i = 0; i < frame.fields.length; i++) {\n      const otherField = frame.fields[i];\n\n      if (field === otherField) {\n        foundSelf = true;\n\n        if (dupeCount > 0) {\n          dupeCount++;\n          break;\n        }\n      } else if (field.name === otherField.name) {\n        dupeCount++;\n\n        if (foundSelf) {\n          break;\n        }\n      }\n    }\n  }\n\n  if (dupeCount) {\n    return `${field.name} ${dupeCount}`;\n  }\n\n  return field.name;\n}\n\n/**\n * Checks all data frames and return name of label if there is only one label name in all frames\n */\nfunction getSingleLabelName(frames: DataFrame[]): string | null {\n  let singleName: string | null = null;\n\n  for (let i = 0; i < frames.length; i++) {\n    const frame = frames[i];\n\n    for (const field of frame.fields) {\n      if (!field.labels) {\n        continue;\n      }\n\n      // yes this should be in!\n      for (const labelKey in field.labels) {\n        if (singleName === null) {\n          singleName = labelKey;\n        } else if (labelKey !== singleName) {\n          return null;\n        }\n      }\n    }\n  }\n\n  return singleName;\n}\n"],"names":["FieldType","getFieldMatcher","TIME_SERIES_TIME_FIELD_NAME","frame","TIME_SERIES_VALUE_FIELD_NAME","formatLabels"],"mappings":";;;;;;;;;AAcO,SAAS,mBAAA,CAAoB,OAAkB,KAAA,EAAgB;AACpE,EAAA,IAAI,MAAM,IAAA,EAAM;AACd,IAAA,OAAO,KAAA,CAAM,IAAA;AAAA,EACf;AAEA,EAAA,MAAM,kBAA4B,EAAC;AACnC,EAAA,KAAA,MAAW,KAAA,IAAS,MAAM,MAAA,EAAQ;AAChC,IAAA,IAAI,KAAA,CAAM,IAAA,KAASA,mBAAA,CAAU,IAAA,EAAM;AACjC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,MAAA;AAAA,IACF;AAEA,IAAA,eAAA,CAAgB,IAAA,CAAK,mBAAA,CAAoB,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,EACxD;AAGA,EAAA,IAAI,eAAA,CAAgB,WAAW,CAAA,EAAG;AAChC,IAAA,OAAO,gBAAgB,CAAC,CAAA;AAAA,EAC1B;AAGA,EAAA,IAAI,KAAA,KAAU,KAAA,CAAA,IAAa,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA,EAAG;AAClD,IAAA,OAAO,MAAM,MAAA,CACV,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAASA,mBAAA,CAAU,IAAI,EACvC,GAAA,CAAI,CAAC,MAAM,mBAAA,CAAoB,CAAA,EAAG,KAAK,CAAC,CAAA,CACxC,KAAK,IAAI,CAAA;AAAA,EACd;AAEA,EAAA,IAAI,MAAM,KAAA,EAAO;AACf,IAAA,OAAO,CAAA,QAAA,EAAW,MAAM,KAAK,CAAA,CAAA,CAAA;AAAA,EAC/B;AAEA,EAAA,OAAO,WAAW,KAAK,CAAA,CAAA,CAAA;AACzB;AAEO,SAAS,uBAAuB,MAAA,EAAqB;AAC1D,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AACxB,IAAA,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC9B,MAAA,mBAAA,CAAoB,KAAA,EAAO,OAAO,MAAM,CAAA;AAAA,IAC1C,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAOO,SAAS,qBAAA,CAAsB,QAAqB,WAAA,EAAgC;AACzF,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AACxB,IAAA,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AApEpC,MAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAqEM,MAAA,MAAM,QAAA,GAAW;AAAA,QACf,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS,KAAA;AAAA,QACT,GAAA,EAAK,KAAA;AAAA,QACL,GAAA,CAAG,EAAA,GAAA,WAAA,CAAY,QAAA,CAAS,MAAA,KAArB,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA6B;AAAA,OAClC;AAGA,MAAA,MAAM,aAAA,GAAA,CAAgB,EAAA,GAAA,KAAA,CAAM,MAAA,CAAO,MAAA,KAAb,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAqB,QAAA;AAE3C,MAAA,WAAA,CAAY,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAA,KAAM;AACnC,QAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,CAAA,GAAIC,wBAAA,CAAgB,CAAA,CAAE,OAAO,CAAA;AAEnC,QAAA,IAAI,CAAA,CAAE,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA,EAAG;AAC3B,UAAA,KAAA,MAAW,CAAA,IAAK,EAAE,UAAA,EAAY;AAC5B,YAAA,IAAI,CAAA,CAAE,OAAO,iBAAA,EAAmB;AAC9B,cAAA,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,CAAA,CAAE,KAAK,CAAA;AAAA,YACjC;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAED,MAAA,KAAA,CAAM,KAAA,GAAQ;AAAA,QACZ,GAAG,KAAA,CAAM,KAAA;AAAA,QACT,QAAA,EAAU;AAAA,UACR,GAAG;AAAA;AACL,OACF;AAGA,MAAA,KAAA,CAAM,OAAO,MAAA,GAAA,CAAS,EAAA,GAAA,KAAA,CAAM,MAAA,CAAO,MAAA,KAAb,YAAuB,EAAC;AAC9C,MAAA,KAAA,CAAM,MAAA,CAAO,OAAO,QAAA,GAAW,QAAA;AAAA,IACjC,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAEO,SAAS,mBAAA,CAAoB,KAAA,EAAc,KAAA,EAAmB,SAAA,EAAiC;AA7GtG,EAAA,IAAA,EAAA,EAAA,EAAA;AA8GE,EAAA,MAAM,aAAA,GAAA,CAAgB,EAAA,GAAA,KAAA,CAAM,KAAA,KAAN,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAa,WAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,SAAA,IAAa,SAAA,CAAU,SAAS,CAAC,CAAA;AAEhE,EAAA,IAAI,aAAA,IAAiB,cAAA,MAAA,CAAmB,EAAA,GAAA,KAAA,CAAM,KAAA,KAAN,mBAAa,cAAA,CAAA,EAAgB;AACnE,IAAA,OAAO,aAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,yBAAA,CAA0B,KAAA,EAAO,KAAA,EAAO,SAAS,CAAA;AACrE,EAAA,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,IAAS,EAAC;AAC9B,EAAA,KAAA,CAAM,MAAM,WAAA,GAAc,WAAA;AAC1B,EAAA,KAAA,CAAM,MAAM,cAAA,GAAiB,cAAA;AAE7B,EAAA,OAAO,WAAA;AACT;AAKO,SAAS,yBAAA,CAA0B,KAAA,EAAc,KAAA,EAAmB,SAAA,EAAiC;AAhI5G,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAiIE,EAAA,MAAM,cAAA,GAAA,CAAA,CAAiB,WAAM,MAAA,KAAN,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,kBAAe,EAAA,GAAA,KAAA,CAAM,MAAA,KAAN,mBAAc,WAAA,CAAY,MAAA,CAAA;AAC9E,EAAA,MAAM,qBAAqB,OAAA,CAAA,CAAQ,EAAA,GAAA,CAAA,EAAA,GAAA,KAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,KAAA,CAAO,SAAP,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAa,WAAA,KAAb,mBAA0B,gBAAgB,CAAA;AAC7E,EAAA,IAAI,WAAA,GAAc,cAAA,GAAiB,KAAA,CAAM,MAAA,CAAQ,cAAe,KAAA,CAAM,IAAA;AAEtE,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,OAAO,kBAAA,GAAqB,CAAA,EAAG,WAAW,CAAA,aAAA,CAAA,GAAkB,WAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,KAAA,KAAA,CAAS,EAAA,GAAA,KAAA,CAAM,MAAA,KAAN,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,iBAAA,CAAA,EAAmB;AAC5C,IAAA,OAAO,qBAAqB,CAAA,EAAG,KAAA,CAAM,OAAO,iBAAiB,CAAA,aAAA,CAAA,GAAkB,MAAM,MAAA,CAAO,iBAAA;AAAA,EAC9F;AAKA,EAAA,IAAI,MAAM,IAAA,KAASD,mBAAA,CAAU,IAAA,IAAQ,CAAC,MAAM,MAAA,EAAQ;AAClD,IAAA,OAAO,WAAA,IAAA,IAAA,GAAA,WAAA,GAAeE,qCAAA;AAAA,EACxB;AAEA,EAAA,IAAI,QAAkB,EAAC;AACvB,EAAA,IAAI,gBAAA,GAAmB,KAAA;AAEvB,EAAA,IAAI,SAAA,IAAa,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AACrC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAMC,MAAAA,GAAQ,UAAU,CAAC,CAAA;AACzB,MAAA,IAAIA,OAAM,IAAA,KAAS,SAAA,CAAU,CAAA,GAAI,CAAC,EAAE,IAAA,EAAM;AACxC,QAAA,gBAAA,GAAmB,IAAA;AACnB,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,cAAA,GAAiB,KAAA;AACrB,EAAA,IAAI,WAAA,GAAc,KAAA;AAElB,EAAA,IAAI,gBAAA,KAAoB,+BAAO,IAAA,CAAA,EAAM;AACnC,IAAA,KAAA,CAAM,IAAA,CAAK,MAAM,IAAI,CAAA;AACrB,IAAA,cAAA,GAAiB,IAAA;AAAA,EACnB;AAEA,EAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,IAAA,KAASC,sCAAA,EAA8B;AAC7D,IAAA,KAAA,CAAM,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACvB;AAEA,EAAA,IAAI,KAAA,CAAM,UAAU,KAAA,EAAO;AACzB,IAAA,IAAI,eAAA,GAAkB,kBAAA,CAAmB,SAAA,IAAA,IAAA,GAAA,SAAA,GAAa,CAAC,KAAK,CAAC,CAAA;AAE7D,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,IAAI,SAAA,GAAYC,mBAAA,CAAa,KAAA,CAAM,MAAM,CAAA;AACzC,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AACpB,QAAA,WAAA,GAAc,IAAA;AAAA,MAChB;AAAA,IACF,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,CAAO,eAAe,CAAA,EAAG;AACxC,MAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,eAAe,CAAC,CAAA;AACxC,MAAA,WAAA,GAAc,IAAA;AAAA,IAChB;AAAA,EACF;AAGA,EAAA,IAAI,SAAS,CAAC,cAAA,IAAkB,CAAC,WAAA,IAAe,KAAA,CAAM,SAASD,sCAAA,EAA8B;AAC3F,IAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,EAAG;AACvC,MAAA,KAAA,CAAM,IAAA,CAAK,MAAM,IAAI,CAAA;AACrB,MAAA,cAAA,GAAiB,IAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,WAAA,GAAc,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EAC9B,CAAA,MAAA,IAAW,MAAM,IAAA,EAAM;AACrB,IAAA,WAAA,GAAc,KAAA,CAAM,IAAA;AAAA,EACtB,CAAA,MAAO;AACL,IAAA,WAAA,GAAcA,sCAAA;AAAA,EAChB;AAGA,EAAA,IAAI,WAAA,KAAgB,MAAM,IAAA,EAAM;AAC9B,IAAA,WAAA,GAAc,kBAAA,CAAmB,OAAO,KAAK,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,WAAA,GAAc,GAAG,WAAW,CAAA,aAAA,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,WAAA;AACT;AAEO,SAAS,kBAAA,CAAmB,OAAc,KAAA,EAAmB;AAClE,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AAC5C,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA;AAEjC,MAAA,IAAI,UAAU,UAAA,EAAY;AACxB,QAAA,SAAA,GAAY,IAAA;AAEZ,QAAA,IAAI,YAAY,CAAA,EAAG;AACjB,UAAA,SAAA,EAAA;AACA,UAAA;AAAA,QACF;AAAA,MACF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,UAAA,CAAW,IAAA,EAAM;AACzC,QAAA,SAAA,EAAA;AAEA,QAAA,IAAI,SAAA,EAAW;AACb,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,EACnC;AAEA,EAAA,OAAO,KAAA,CAAM,IAAA;AACf;AAKA,SAAS,mBAAmB,MAAA,EAAoC;AAC9D,EAAA,IAAI,UAAA,GAA4B,IAAA;AAEhC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AAEtB,IAAA,KAAA,MAAW,KAAA,IAAS,MAAM,MAAA,EAAQ;AAChC,MAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,QAAA;AAAA,MACF;AAGA,MAAA,KAAA,MAAW,QAAA,IAAY,MAAM,MAAA,EAAQ;AACnC,QAAA,IAAI,eAAe,IAAA,EAAM;AACvB,UAAA,UAAA,GAAa,QAAA;AAAA,QACf,CAAA,MAAA,IAAW,aAAa,UAAA,EAAY;AAClC,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,UAAA;AACT;;;;;;;;;"}