{"version":3,"sources":["../../../src/collections/config/sanitize.ts"],"sourcesContent":["import type { Config, SanitizedConfig } from '../../config/types.js'\nimport type { OrderableJoinInfo } from '../../fields/config/sanitizeJoinField.js'\nimport type {\n  CollectionConfig,\n  SanitizedCollectionConfig,\n  SanitizedJoin,\n  SanitizedJoins,\n} from './types.js'\n\nimport { authCollectionEndpoints } from '../../auth/endpoints/index.js'\nimport { getBaseAuthFields } from '../../auth/getAuthFields.js'\nimport { TimestampsRequired } from '../../errors/TimestampsRequired.js'\nimport { sanitizeFields } from '../../fields/config/sanitize.js'\nimport { fieldAffectsData } from '../../fields/config/types.js'\nimport { mergeBaseFields } from '../../fields/mergeBaseFields.js'\nimport { uploadCollectionEndpoints } from '../../uploads/endpoints/index.js'\nimport { getBaseUploadFields } from '../../uploads/getBaseFields.js'\nimport { flattenAllFields } from '../../utilities/flattenAllFields.js'\nimport { formatLabels } from '../../utilities/formatLabels.js'\nimport { miniChalk } from '../../utilities/miniChalk.js'\nimport { traverseForLocalizedFields } from '../../utilities/traverseForLocalizedFields.js'\nimport { baseVersionFields } from '../../versions/baseFields.js'\nimport { versionDefaults } from '../../versions/defaults.js'\nimport { defaultCollectionEndpoints } from '../endpoints/index.js'\nimport {\n  addDefaultsToAuthConfig,\n  addDefaultsToCollectionConfig,\n  addDefaultsToLoginWithUsernameConfig,\n} from './defaults.js'\nimport { sanitizeCompoundIndexes } from './sanitizeCompoundIndexes.js'\nimport { validateUseAsTitle } from './useAsTitle.js'\n\n/**\n * Warns at startup when custom collection views are misconfigured with a missing `path`.\n * Views without `path` will never be matched by the router and are silently ignored.\n */\nexport const warnOnInvalidCustomViews = (collection: CollectionConfig): void => {\n  const views = collection.admin?.components?.views\n  if (!views || typeof views !== 'object') {\n    return\n  }\n\n  for (const [key, view] of Object.entries(views)) {\n    if (key === 'edit' || key === 'list') {\n      continue\n    }\n\n    if (view && typeof view === 'object' && 'Component' in view && !('path' in view)) {\n      console.warn(\n        `[Payload] Custom collection view \"${key}\" in collection \"${collection.slug}\" is missing a \"path\" property. The view will never be rendered.`,\n      )\n    }\n\n    if (view && typeof view === 'object' && 'path' in view && !('Component' in view)) {\n      console.warn(\n        `[Payload] Custom collection view \"${key}\" in collection \"${collection.slug}\" has a \"path\" but is missing a \"Component\". The view will never be rendered.`,\n      )\n    }\n  }\n}\n\nexport const sanitizeCollection = async (\n  config: Config,\n  collection: CollectionConfig,\n  /**\n   * If this property is set, RichText fields won't be sanitized immediately. Instead, they will be added to this array as promises\n   * so that you can sanitize them together, after the config has been sanitized.\n   */\n  richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>,\n  _validRelationships?: string[],\n  /**\n   * Tracker for orderable join fields - populated during sanitization\n   */\n  orderableJoins?: OrderableJoinInfo[],\n): Promise<SanitizedCollectionConfig> => {\n  if (collection._sanitized) {\n    return collection as SanitizedCollectionConfig\n  }\n\n  collection._sanitized = true\n\n  warnOnInvalidCustomViews(collection)\n\n  // /////////////////////////////////\n  // Make copy of collection config\n  // /////////////////////////////////\n\n  const sanitized: CollectionConfig = addDefaultsToCollectionConfig(collection)\n\n  // /////////////////////////////////\n  // Sanitize fields\n  // /////////////////////////////////\n\n  const validRelationships = _validRelationships ?? config.collections!.map((c) => c.slug) ?? []\n\n  const joins: SanitizedJoins = {}\n\n  const polymorphicJoins: SanitizedJoin[] = []\n\n  sanitized.fields = await sanitizeFields({\n    collectionConfig: sanitized,\n    config,\n    fields: sanitized.fields,\n    joinPath: '',\n    joins,\n    orderableJoins,\n    parentIsLocalized: false,\n    polymorphicJoins,\n    richTextSanitizationPromises,\n    validRelationships,\n  })\n\n  if (sanitized.endpoints !== false) {\n    if (!sanitized.endpoints) {\n      sanitized.endpoints = []\n    }\n\n    if (sanitized.auth) {\n      for (const endpoint of authCollectionEndpoints) {\n        sanitized.endpoints.push(endpoint)\n      }\n    }\n\n    if (sanitized.upload) {\n      for (const endpoint of uploadCollectionEndpoints) {\n        sanitized.endpoints.push(endpoint)\n      }\n    }\n\n    for (const endpoint of defaultCollectionEndpoints) {\n      sanitized.endpoints.push(endpoint)\n    }\n  }\n\n  if (sanitized.timestamps !== false) {\n    // add default timestamps fields only as needed\n    let hasUpdatedAt: boolean | null = null\n    let hasCreatedAt: boolean | null = null\n    let hasDeletedAt: boolean | null = null\n\n    sanitized.fields.some((field) => {\n      if (fieldAffectsData(field)) {\n        if (field.name === 'updatedAt') {\n          hasUpdatedAt = true\n        }\n\n        if (field.name === 'createdAt') {\n          hasCreatedAt = true\n        }\n\n        if (field.name === 'deletedAt') {\n          hasDeletedAt = true\n        }\n      }\n\n      return hasCreatedAt && hasUpdatedAt && (!sanitized.trash || hasDeletedAt)\n    })\n\n    if (!hasUpdatedAt) {\n      sanitized.fields.push({\n        name: 'updatedAt',\n        type: 'date',\n        admin: {\n          disableBulkEdit: true,\n          hidden: true,\n        },\n        index: true,\n        label: ({ t }) => t('general:updatedAt'),\n      })\n    }\n\n    if (!hasCreatedAt) {\n      sanitized.fields.push({\n        name: 'createdAt',\n        admin: {\n          disableBulkEdit: true,\n          hidden: true,\n        },\n        // The default sort for list view is createdAt. Thus, enabling indexing by default, is a major performance improvement, especially for large or a large amount of collections.\n        type: 'date',\n        index: true,\n        label: ({ t }) => t('general:createdAt'),\n      })\n    }\n\n    if (sanitized.trash && !hasDeletedAt) {\n      sanitized.fields.push({\n        name: 'deletedAt',\n        type: 'date',\n        admin: {\n          disableBulkEdit: true,\n          hidden: true,\n        },\n        index: true,\n        label: ({ t }) => t('general:deletedAt'),\n      })\n    }\n  }\n\n  const defaultLabels = formatLabels(sanitized.slug)\n\n  sanitized.labels = {\n    plural: sanitized.labels?.plural || defaultLabels.plural,\n    singular: sanitized.labels?.singular || defaultLabels.singular,\n  }\n\n  if (sanitized.versions) {\n    if (sanitized.timestamps === false) {\n      throw new TimestampsRequired(collection)\n    }\n\n    if (sanitized.versions === true) {\n      sanitized.versions = {\n        drafts: false,\n        maxPerDoc: 100,\n      }\n    }\n\n    sanitized.versions.maxPerDoc =\n      typeof sanitized.versions.maxPerDoc === 'number' ? sanitized.versions.maxPerDoc : 100\n\n    if (sanitized.versions.drafts) {\n      if (sanitized.versions.drafts === true) {\n        sanitized.versions.drafts = {\n          autosave: false,\n          validate: false,\n        }\n      }\n\n      const hasLocalizedFields = traverseForLocalizedFields(sanitized.fields)\n\n      if (config.localization) {\n        if (hasLocalizedFields && sanitized.versions.drafts.localizeStatus === undefined) {\n          sanitized.versions.drafts.localizeStatus = false\n        }\n      }\n\n      // TODO v4: remove this sanitization check, should not need to enable the experimental flag\n      if (sanitized.versions.drafts.localizeStatus && !config.experimental?.localizeStatus) {\n        sanitized.versions.drafts.localizeStatus = false\n        console.log(\n          miniChalk.yellowBold(\n            `Warning: \"localizeStatus\" for drafts is an experimental feature. To enable, set \"experimental.localizeStatus\" to true in your Payload config.`,\n          ),\n        )\n      }\n\n      if (sanitized.versions.drafts.autosave === true) {\n        sanitized.versions.drafts.autosave = {\n          interval: versionDefaults.autosaveInterval,\n        }\n      }\n\n      if (sanitized.versions.drafts.validate === undefined) {\n        sanitized.versions.drafts.validate = false\n      }\n\n      sanitized.fields = mergeBaseFields(\n        sanitized.fields,\n        baseVersionFields({\n          localized: sanitized.versions.drafts.localizeStatus ?? false,\n        }),\n      )\n    }\n  } else {\n    delete sanitized.versions\n  }\n\n  if (sanitized.folders === true) {\n    sanitized.folders = {\n      browseByFolder: true,\n    }\n  } else if (sanitized.folders) {\n    sanitized.folders.browseByFolder = sanitized.folders.browseByFolder ?? true\n  }\n\n  if (sanitized.upload) {\n    if (sanitized.upload === true) {\n      sanitized.upload = {}\n    }\n\n    sanitized.upload.cacheTags = sanitized.upload?.cacheTags ?? true\n    sanitized.upload.bulkUpload = sanitized.upload?.bulkUpload ?? true\n    sanitized.upload.staticDir = sanitized.upload.staticDir || sanitized.slug\n    sanitized.admin!.useAsTitle =\n      sanitized.admin?.useAsTitle && sanitized.admin.useAsTitle !== 'id'\n        ? sanitized.admin.useAsTitle\n        : 'filename'\n\n    const uploadFields = getBaseUploadFields({\n      collection: sanitized,\n      config,\n    })\n\n    sanitized.fields = mergeBaseFields(sanitized.fields, uploadFields)\n  }\n\n  if (sanitized.auth) {\n    sanitized.auth = addDefaultsToAuthConfig(\n      typeof sanitized.auth === 'boolean' ? {} : sanitized.auth,\n    )\n\n    // disable duplicate for auth enabled collections by default\n    sanitized.disableDuplicate = sanitized.disableDuplicate ?? true\n\n    if (sanitized.auth.loginWithUsername) {\n      if (sanitized.auth.loginWithUsername === true) {\n        sanitized.auth.loginWithUsername = addDefaultsToLoginWithUsernameConfig({})\n      } else {\n        const loginWithUsernameWithDefaults = addDefaultsToLoginWithUsernameConfig(\n          sanitized.auth.loginWithUsername,\n        )\n\n        // if allowEmailLogin is false, requireUsername must be true\n        if (loginWithUsernameWithDefaults.allowEmailLogin === false) {\n          loginWithUsernameWithDefaults.requireUsername = true\n        }\n        sanitized.auth.loginWithUsername = loginWithUsernameWithDefaults\n      }\n    } else {\n      sanitized.auth.loginWithUsername = false\n    }\n\n    if (!collection?.admin?.useAsTitle) {\n      sanitized.admin!.useAsTitle = sanitized.auth.loginWithUsername ? 'username' : 'email'\n    }\n\n    sanitized.fields = mergeBaseFields(sanitized.fields, getBaseAuthFields(sanitized.auth))\n  }\n\n  if (collection?.admin?.pagination?.limits?.length) {\n    sanitized.admin!.pagination!.limits = collection.admin.pagination.limits\n  }\n\n  validateUseAsTitle(sanitized)\n\n  const sanitizedConfig = sanitized as SanitizedCollectionConfig\n\n  sanitizedConfig.joins = joins\n  sanitizedConfig.polymorphicJoins = polymorphicJoins\n\n  sanitizedConfig.flattenedFields = flattenAllFields({ fields: sanitizedConfig.fields })\n\n  sanitizedConfig.sanitizedIndexes = sanitizeCompoundIndexes({\n    fields: sanitizedConfig.flattenedFields,\n    indexes: sanitizedConfig.indexes,\n  })\n\n  return sanitizedConfig\n}\n"],"names":["authCollectionEndpoints","getBaseAuthFields","TimestampsRequired","sanitizeFields","fieldAffectsData","mergeBaseFields","uploadCollectionEndpoints","getBaseUploadFields","flattenAllFields","formatLabels","miniChalk","traverseForLocalizedFields","baseVersionFields","versionDefaults","defaultCollectionEndpoints","addDefaultsToAuthConfig","addDefaultsToCollectionConfig","addDefaultsToLoginWithUsernameConfig","sanitizeCompoundIndexes","validateUseAsTitle","warnOnInvalidCustomViews","collection","views","admin","components","key","view","Object","entries","console","warn","slug","sanitizeCollection","config","richTextSanitizationPromises","_validRelationships","orderableJoins","_sanitized","sanitized","validRelationships","collections","map","c","joins","polymorphicJoins","fields","collectionConfig","joinPath","parentIsLocalized","endpoints","auth","endpoint","push","upload","timestamps","hasUpdatedAt","hasCreatedAt","hasDeletedAt","some","field","name","trash","type","disableBulkEdit","hidden","index","label","t","defaultLabels","labels","plural","singular","versions","drafts","maxPerDoc","autosave","validate","hasLocalizedFields","localization","localizeStatus","undefined","experimental","log","yellowBold","interval","autosaveInterval","localized","folders","browseByFolder","cacheTags","bulkUpload","staticDir","useAsTitle","uploadFields","disableDuplicate","loginWithUsername","loginWithUsernameWithDefaults","allowEmailLogin","requireUsername","pagination","limits","length","sanitizedConfig","flattenedFields","sanitizedIndexes","indexes"],"mappings":"AASA,SAASA,uBAAuB,QAAQ,gCAA+B;AACvE,SAASC,iBAAiB,QAAQ,8BAA6B;AAC/D,SAASC,kBAAkB,QAAQ,qCAAoC;AACvE,SAASC,cAAc,QAAQ,kCAAiC;AAChE,SAASC,gBAAgB,QAAQ,+BAA8B;AAC/D,SAASC,eAAe,QAAQ,kCAAiC;AACjE,SAASC,yBAAyB,QAAQ,mCAAkC;AAC5E,SAASC,mBAAmB,QAAQ,iCAAgC;AACpE,SAASC,gBAAgB,QAAQ,sCAAqC;AACtE,SAASC,YAAY,QAAQ,kCAAiC;AAC9D,SAASC,SAAS,QAAQ,+BAA8B;AACxD,SAASC,0BAA0B,QAAQ,gDAA+C;AAC1F,SAASC,iBAAiB,QAAQ,+BAA8B;AAChE,SAASC,eAAe,QAAQ,6BAA4B;AAC5D,SAASC,0BAA0B,QAAQ,wBAAuB;AAClE,SACEC,uBAAuB,EACvBC,6BAA6B,EAC7BC,oCAAoC,QAC/B,gBAAe;AACtB,SAASC,uBAAuB,QAAQ,+BAA8B;AACtE,SAASC,kBAAkB,QAAQ,kBAAiB;AAEpD;;;CAGC,GACD,OAAO,MAAMC,2BAA2B,CAACC;IACvC,MAAMC,QAAQD,WAAWE,KAAK,EAAEC,YAAYF;IAC5C,IAAI,CAACA,SAAS,OAAOA,UAAU,UAAU;QACvC;IACF;IAEA,KAAK,MAAM,CAACG,KAAKC,KAAK,IAAIC,OAAOC,OAAO,CAACN,OAAQ;QAC/C,IAAIG,QAAQ,UAAUA,QAAQ,QAAQ;YACpC;QACF;QAEA,IAAIC,QAAQ,OAAOA,SAAS,YAAY,eAAeA,QAAQ,CAAE,CAAA,UAAUA,IAAG,GAAI;YAChFG,QAAQC,IAAI,CACV,CAAC,kCAAkC,EAAEL,IAAI,iBAAiB,EAAEJ,WAAWU,IAAI,CAAC,gEAAgE,CAAC;QAEjJ;QAEA,IAAIL,QAAQ,OAAOA,SAAS,YAAY,UAAUA,QAAQ,CAAE,CAAA,eAAeA,IAAG,GAAI;YAChFG,QAAQC,IAAI,CACV,CAAC,kCAAkC,EAAEL,IAAI,iBAAiB,EAAEJ,WAAWU,IAAI,CAAC,6EAA6E,CAAC;QAE9J;IACF;AACF,EAAC;AAED,OAAO,MAAMC,qBAAqB,OAChCC,QACAZ,YACA;;;GAGC,GACDa,8BACAC,qBACA;;GAEC,GACDC;IAEA,IAAIf,WAAWgB,UAAU,EAAE;QACzB,OAAOhB;IACT;IAEAA,WAAWgB,UAAU,GAAG;IAExBjB,yBAAyBC;IAEzB,oCAAoC;IACpC,iCAAiC;IACjC,oCAAoC;IAEpC,MAAMiB,YAA8BtB,8BAA8BK;IAElE,oCAAoC;IACpC,kBAAkB;IAClB,oCAAoC;IAEpC,MAAMkB,qBAAqBJ,uBAAuBF,OAAOO,WAAW,CAAEC,GAAG,CAAC,CAACC,IAAMA,EAAEX,IAAI,KAAK,EAAE;IAE9F,MAAMY,QAAwB,CAAC;IAE/B,MAAMC,mBAAoC,EAAE;IAE5CN,UAAUO,MAAM,GAAG,MAAM1C,eAAe;QACtC2C,kBAAkBR;QAClBL;QACAY,QAAQP,UAAUO,MAAM;QACxBE,UAAU;QACVJ;QACAP;QACAY,mBAAmB;QACnBJ;QACAV;QACAK;IACF;IAEA,IAAID,UAAUW,SAAS,KAAK,OAAO;QACjC,IAAI,CAACX,UAAUW,SAAS,EAAE;YACxBX,UAAUW,SAAS,GAAG,EAAE;QAC1B;QAEA,IAAIX,UAAUY,IAAI,EAAE;YAClB,KAAK,MAAMC,YAAYnD,wBAAyB;gBAC9CsC,UAAUW,SAAS,CAACG,IAAI,CAACD;YAC3B;QACF;QAEA,IAAIb,UAAUe,MAAM,EAAE;YACpB,KAAK,MAAMF,YAAY7C,0BAA2B;gBAChDgC,UAAUW,SAAS,CAACG,IAAI,CAACD;YAC3B;QACF;QAEA,KAAK,MAAMA,YAAYrC,2BAA4B;YACjDwB,UAAUW,SAAS,CAACG,IAAI,CAACD;QAC3B;IACF;IAEA,IAAIb,UAAUgB,UAAU,KAAK,OAAO;QAClC,+CAA+C;QAC/C,IAAIC,eAA+B;QACnC,IAAIC,eAA+B;QACnC,IAAIC,eAA+B;QAEnCnB,UAAUO,MAAM,CAACa,IAAI,CAAC,CAACC;YACrB,IAAIvD,iBAAiBuD,QAAQ;gBAC3B,IAAIA,MAAMC,IAAI,KAAK,aAAa;oBAC9BL,eAAe;gBACjB;gBAEA,IAAII,MAAMC,IAAI,KAAK,aAAa;oBAC9BJ,eAAe;gBACjB;gBAEA,IAAIG,MAAMC,IAAI,KAAK,aAAa;oBAC9BH,eAAe;gBACjB;YACF;YAEA,OAAOD,gBAAgBD,gBAAiB,CAAA,CAACjB,UAAUuB,KAAK,IAAIJ,YAAW;QACzE;QAEA,IAAI,CAACF,cAAc;YACjBjB,UAAUO,MAAM,CAACO,IAAI,CAAC;gBACpBQ,MAAM;gBACNE,MAAM;gBACNvC,OAAO;oBACLwC,iBAAiB;oBACjBC,QAAQ;gBACV;gBACAC,OAAO;gBACPC,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;YACtB;QACF;QAEA,IAAI,CAACX,cAAc;YACjBlB,UAAUO,MAAM,CAACO,IAAI,CAAC;gBACpBQ,MAAM;gBACNrC,OAAO;oBACLwC,iBAAiB;oBACjBC,QAAQ;gBACV;gBACA,8KAA8K;gBAC9KF,MAAM;gBACNG,OAAO;gBACPC,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;YACtB;QACF;QAEA,IAAI7B,UAAUuB,KAAK,IAAI,CAACJ,cAAc;YACpCnB,UAAUO,MAAM,CAACO,IAAI,CAAC;gBACpBQ,MAAM;gBACNE,MAAM;gBACNvC,OAAO;oBACLwC,iBAAiB;oBACjBC,QAAQ;gBACV;gBACAC,OAAO;gBACPC,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;YACtB;QACF;IACF;IAEA,MAAMC,gBAAgB3D,aAAa6B,UAAUP,IAAI;IAEjDO,UAAU+B,MAAM,GAAG;QACjBC,QAAQhC,UAAU+B,MAAM,EAAEC,UAAUF,cAAcE,MAAM;QACxDC,UAAUjC,UAAU+B,MAAM,EAAEE,YAAYH,cAAcG,QAAQ;IAChE;IAEA,IAAIjC,UAAUkC,QAAQ,EAAE;QACtB,IAAIlC,UAAUgB,UAAU,KAAK,OAAO;YAClC,MAAM,IAAIpD,mBAAmBmB;QAC/B;QAEA,IAAIiB,UAAUkC,QAAQ,KAAK,MAAM;YAC/BlC,UAAUkC,QAAQ,GAAG;gBACnBC,QAAQ;gBACRC,WAAW;YACb;QACF;QAEApC,UAAUkC,QAAQ,CAACE,SAAS,GAC1B,OAAOpC,UAAUkC,QAAQ,CAACE,SAAS,KAAK,WAAWpC,UAAUkC,QAAQ,CAACE,SAAS,GAAG;QAEpF,IAAIpC,UAAUkC,QAAQ,CAACC,MAAM,EAAE;YAC7B,IAAInC,UAAUkC,QAAQ,CAACC,MAAM,KAAK,MAAM;gBACtCnC,UAAUkC,QAAQ,CAACC,MAAM,GAAG;oBAC1BE,UAAU;oBACVC,UAAU;gBACZ;YACF;YAEA,MAAMC,qBAAqBlE,2BAA2B2B,UAAUO,MAAM;YAEtE,IAAIZ,OAAO6C,YAAY,EAAE;gBACvB,IAAID,sBAAsBvC,UAAUkC,QAAQ,CAACC,MAAM,CAACM,cAAc,KAAKC,WAAW;oBAChF1C,UAAUkC,QAAQ,CAACC,MAAM,CAACM,cAAc,GAAG;gBAC7C;YACF;YAEA,2FAA2F;YAC3F,IAAIzC,UAAUkC,QAAQ,CAACC,MAAM,CAACM,cAAc,IAAI,CAAC9C,OAAOgD,YAAY,EAAEF,gBAAgB;gBACpFzC,UAAUkC,QAAQ,CAACC,MAAM,CAACM,cAAc,GAAG;gBAC3ClD,QAAQqD,GAAG,CACTxE,UAAUyE,UAAU,CAClB,CAAC,6IAA6I,CAAC;YAGrJ;YAEA,IAAI7C,UAAUkC,QAAQ,CAACC,MAAM,CAACE,QAAQ,KAAK,MAAM;gBAC/CrC,UAAUkC,QAAQ,CAACC,MAAM,CAACE,QAAQ,GAAG;oBACnCS,UAAUvE,gBAAgBwE,gBAAgB;gBAC5C;YACF;YAEA,IAAI/C,UAAUkC,QAAQ,CAACC,MAAM,CAACG,QAAQ,KAAKI,WAAW;gBACpD1C,UAAUkC,QAAQ,CAACC,MAAM,CAACG,QAAQ,GAAG;YACvC;YAEAtC,UAAUO,MAAM,GAAGxC,gBACjBiC,UAAUO,MAAM,EAChBjC,kBAAkB;gBAChB0E,WAAWhD,UAAUkC,QAAQ,CAACC,MAAM,CAACM,cAAc,IAAI;YACzD;QAEJ;IACF,OAAO;QACL,OAAOzC,UAAUkC,QAAQ;IAC3B;IAEA,IAAIlC,UAAUiD,OAAO,KAAK,MAAM;QAC9BjD,UAAUiD,OAAO,GAAG;YAClBC,gBAAgB;QAClB;IACF,OAAO,IAAIlD,UAAUiD,OAAO,EAAE;QAC5BjD,UAAUiD,OAAO,CAACC,cAAc,GAAGlD,UAAUiD,OAAO,CAACC,cAAc,IAAI;IACzE;IAEA,IAAIlD,UAAUe,MAAM,EAAE;QACpB,IAAIf,UAAUe,MAAM,KAAK,MAAM;YAC7Bf,UAAUe,MAAM,GAAG,CAAC;QACtB;QAEAf,UAAUe,MAAM,CAACoC,SAAS,GAAGnD,UAAUe,MAAM,EAAEoC,aAAa;QAC5DnD,UAAUe,MAAM,CAACqC,UAAU,GAAGpD,UAAUe,MAAM,EAAEqC,cAAc;QAC9DpD,UAAUe,MAAM,CAACsC,SAAS,GAAGrD,UAAUe,MAAM,CAACsC,SAAS,IAAIrD,UAAUP,IAAI;QACzEO,UAAUf,KAAK,CAAEqE,UAAU,GACzBtD,UAAUf,KAAK,EAAEqE,cAActD,UAAUf,KAAK,CAACqE,UAAU,KAAK,OAC1DtD,UAAUf,KAAK,CAACqE,UAAU,GAC1B;QAEN,MAAMC,eAAetF,oBAAoB;YACvCc,YAAYiB;YACZL;QACF;QAEAK,UAAUO,MAAM,GAAGxC,gBAAgBiC,UAAUO,MAAM,EAAEgD;IACvD;IAEA,IAAIvD,UAAUY,IAAI,EAAE;QAClBZ,UAAUY,IAAI,GAAGnC,wBACf,OAAOuB,UAAUY,IAAI,KAAK,YAAY,CAAC,IAAIZ,UAAUY,IAAI;QAG3D,4DAA4D;QAC5DZ,UAAUwD,gBAAgB,GAAGxD,UAAUwD,gBAAgB,IAAI;QAE3D,IAAIxD,UAAUY,IAAI,CAAC6C,iBAAiB,EAAE;YACpC,IAAIzD,UAAUY,IAAI,CAAC6C,iBAAiB,KAAK,MAAM;gBAC7CzD,UAAUY,IAAI,CAAC6C,iBAAiB,GAAG9E,qCAAqC,CAAC;YAC3E,OAAO;gBACL,MAAM+E,gCAAgC/E,qCACpCqB,UAAUY,IAAI,CAAC6C,iBAAiB;gBAGlC,4DAA4D;gBAC5D,IAAIC,8BAA8BC,eAAe,KAAK,OAAO;oBAC3DD,8BAA8BE,eAAe,GAAG;gBAClD;gBACA5D,UAAUY,IAAI,CAAC6C,iBAAiB,GAAGC;YACrC;QACF,OAAO;YACL1D,UAAUY,IAAI,CAAC6C,iBAAiB,GAAG;QACrC;QAEA,IAAI,CAAC1E,YAAYE,OAAOqE,YAAY;YAClCtD,UAAUf,KAAK,CAAEqE,UAAU,GAAGtD,UAAUY,IAAI,CAAC6C,iBAAiB,GAAG,aAAa;QAChF;QAEAzD,UAAUO,MAAM,GAAGxC,gBAAgBiC,UAAUO,MAAM,EAAE5C,kBAAkBqC,UAAUY,IAAI;IACvF;IAEA,IAAI7B,YAAYE,OAAO4E,YAAYC,QAAQC,QAAQ;QACjD/D,UAAUf,KAAK,CAAE4E,UAAU,CAAEC,MAAM,GAAG/E,WAAWE,KAAK,CAAC4E,UAAU,CAACC,MAAM;IAC1E;IAEAjF,mBAAmBmB;IAEnB,MAAMgE,kBAAkBhE;IAExBgE,gBAAgB3D,KAAK,GAAGA;IACxB2D,gBAAgB1D,gBAAgB,GAAGA;IAEnC0D,gBAAgBC,eAAe,GAAG/F,iBAAiB;QAAEqC,QAAQyD,gBAAgBzD,MAAM;IAAC;IAEpFyD,gBAAgBE,gBAAgB,GAAGtF,wBAAwB;QACzD2B,QAAQyD,gBAAgBC,eAAe;QACvCE,SAASH,gBAAgBG,OAAO;IAClC;IAEA,OAAOH;AACT,EAAC"}