@smartico/public-api 0.0.386 → 0.0.387

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +1 -1
  2. package/dist/Avatars/AvatarCustomizeErrorCode.d.ts +7 -1
  3. package/dist/Avatars/AvatarCustomizeResponse.d.ts +16 -0
  4. package/dist/Avatars/index.d.ts +1 -0
  5. package/dist/Missions/UserAchievementTask.d.ts +4 -0
  6. package/dist/SmarticoAPI.d.ts +11 -0
  7. package/dist/WSAPI/WSAPIAvatars.d.ts +103 -0
  8. package/dist/WSAPI/WSAPITypes.d.ts +6 -2
  9. package/dist/index.js +260 -78
  10. package/dist/index.js.map +1 -1
  11. package/dist/index.modern.mjs +168 -6
  12. package/dist/index.modern.mjs.map +1 -1
  13. package/docs/SmarticoObject.md +15 -0
  14. package/docs/api/README.md +2 -0
  15. package/docs/api/classes/WSAPIAvatars.md +135 -0
  16. package/docs/api/classes/WSAPIClans.md +3 -5
  17. package/docs/api/documents/SmarticoObject.md +15 -0
  18. package/docs/api/enumerations/AvatarCustomizeErrorCode.md +21 -0
  19. package/docs/api/enumerations/JoinClanErrorCode.md +16 -17
  20. package/docs/api/interfaces/AvatarCustomizeResponse.md +31 -0
  21. package/docs/api/interfaces/TAvatarPrompt.md +2 -2
  22. package/docs/api/interfaces/TMissionOrBadgeTask.md +16 -0
  23. package/docs/api/interfaces/UserAchievementTask.md +16 -0
  24. package/docs/native/PROTOCOL.md +3 -1
  25. package/docs/ui/avatars/UIGuide_avatarsCustomize.md +69 -0
  26. package/package.json +1 -1
  27. package/src/Avatars/AvatarCustomizeErrorCode.ts +7 -5
  28. package/src/Avatars/AvatarCustomizeResponse.ts +17 -0
  29. package/src/Avatars/index.ts +1 -0
  30. package/src/Missions/UserAchievement.ts +2 -0
  31. package/src/Missions/UserAchievementTask.ts +4 -0
  32. package/src/SmarticoAPI.ts +53 -0
  33. package/src/WSAPI/WSAPIAvatars.ts +121 -0
  34. package/src/WSAPI/WSAPITypes.ts +6 -2
  35. package/tsconfig.json +3 -1
@@ -1616,6 +1616,8 @@ const UserAchievementTransform = items => {
1616
1616
  id: t.task_id,
1617
1617
  name: (_t$task_public_meta = t.task_public_meta) == null ? void 0 : _t$task_public_meta.name,
1618
1618
  points_reward: t.points_reward,
1619
+ gems_reward: t.gems_reward,
1620
+ diamonds_reward: t.diamonds_reward,
1619
1621
  is_completed: t.isCompleted,
1620
1622
  progress: t.userProgress,
1621
1623
  execution_count_expected: t.executionCount,
@@ -7531,6 +7533,116 @@ class WSAPIAvatars extends WSAPIMiniGames {
7531
7533
  err_message: r.errMsg
7532
7534
  };
7533
7535
  }
7536
+ /**
7537
+ * Generates an AI-customized variant of a base avatar by applying an
7538
+ * operator-defined style prompt, returning the CDN URL of the result.
7539
+ * This is a paid, generate-only step: it does NOT change the user's
7540
+ * active avatar — pass the returned `cdn_url` to {@link setAvatar} to
7541
+ * activate it.
7542
+ *
7543
+ * @remarks
7544
+ * **Preconditions**
7545
+ * - Authenticated session required; not available in visitor mode (throws).
7546
+ * - All five fields are mandatory — the SDK throws synchronously
7547
+ * (`Error("<field> is required")`) if any is missing or zero.
7548
+ * - `prompt_id` must be one of the prompts from {@link getAvatarPrompts};
7549
+ * `avatar_url` / `avatar_real_id` identify the base avatar to style.
7550
+ *
7551
+ * **Cost**
7552
+ * Each generation costs the currency the operator configured on the
7553
+ * chosen prompt (points, gems, or diamonds — some prompts are free; read
7554
+ * `cost_currency_type_id` / `cost_value` from the {@link getAvatarPrompts}
7555
+ * entry to gate the UI before calling). The cost is charged only on
7556
+ * success; if the user can't afford it the call fails with `errCode -1`
7557
+ * and nothing is generated or charged.
7558
+ *
7559
+ * **Latency**
7560
+ * Generation runs server-side AI image synthesis and is synchronous from
7561
+ * the caller's side — expect several seconds (roughly 5–20 s) before the
7562
+ * promise resolves. There is no SDK cache and no push/subscription; show
7563
+ * a loading state for the full duration and disable the trigger to
7564
+ * prevent duplicate submissions.
7565
+ *
7566
+ * **Result & error codes**
7567
+ * On success the result has `cdn_url` set; on failure it has `errCode` /
7568
+ * `errMessage` set and no `cdn_url`. Branch on `errCode` — the generic
7569
+ * message is fixed text, not cause-specific:
7570
+ * - `12001` (`AvatarCustomizeErrorCode.AVATAR_USER_LIMIT`) — the user hit
7571
+ * their monthly per-user generation cap. Nothing is generated or charged.
7572
+ * - `12002` (`AvatarCustomizeErrorCode.AVATAR_LABEL_LIMIT`) — the brand's
7573
+ * shared monthly pool is exhausted. Nothing is generated or charged;
7574
+ * surface a "try again later" message.
7575
+ * - `-1` — generic failure: insufficient balance, an unavailable prompt,
7576
+ * or a generation error. Nothing is charged. Allow the user to retry.
7577
+ *
7578
+ * Both monthly caps are operator-configured and reset at the start of
7579
+ * each calendar month.
7580
+ *
7581
+ * **Side effects (on success)**
7582
+ * The generated variant is persisted to the user's customization history
7583
+ * and counts toward the monthly caps **whether or not** it is later
7584
+ * activated — generation is not reversible. The SDK clears the
7585
+ * {@link getAvatarsCustomized} cache so the next call surfaces the new
7586
+ * variant. The user's active avatar is unchanged until you call
7587
+ * {@link setAvatar} with the returned `cdn_url`.
7588
+ *
7589
+ * **Idempotency**: not idempotent — each successful call generates (and
7590
+ * charges for) a new variant. Guard the call site against double-clicks.
7591
+ *
7592
+ * **UI guidance**: see [UI Guide — `avatarsCustomize`](../../docs/ui/avatars/UIGuide_avatarsCustomize.md).
7593
+ *
7594
+ * **Visitor mode**: not supported (throws).
7595
+ *
7596
+ * @param props.label_id Numeric Smartico label (brand) ID the user belongs to.
7597
+ * @param props.user_id Numeric Smartico user ID.
7598
+ * @param props.prompt_id Style-prompt ID (`prompt_id`) from {@link getAvatarPrompts}.
7599
+ * @param props.avatar_url CDN URL of the base avatar to customize.
7600
+ * @param props.avatar_real_id `avatar_real_id` of the base avatar.
7601
+ * @returns {@link AvatarCustomizeResponse} — `cdn_url` set on success;
7602
+ * `errCode` / `errMessage` set on failure.
7603
+ *
7604
+ * @example
7605
+ * ```ts
7606
+ * // label_id / user_id identify the Smartico user being customized.
7607
+ * const prompts = await window._smartico.api.getAvatarPrompts();
7608
+ * const prompt = prompts[0];
7609
+ *
7610
+ * console.log('[smartico] generating avatar — show a spinner for ~5-20s and disable the Generate button');
7611
+ * const result = await window._smartico.api.avatarsCustomize({
7612
+ * label_id,
7613
+ * user_id,
7614
+ * prompt_id: prompt.prompt_id,
7615
+ * avatar_url: baseAvatar.avatar_url,
7616
+ * avatar_real_id: baseAvatar.avatar_real_id,
7617
+ * });
7618
+ *
7619
+ * if (result.cdn_url) {
7620
+ * console.log('[smartico] generation succeeded — preview this URL, then call setAvatar to apply it:', result.cdn_url);
7621
+ * // await window._smartico.api.setAvatar({ avatar_url: result.cdn_url, avatar_real_id: baseAvatar.avatar_real_id });
7622
+ * } else if (result.errCode === 12001) {
7623
+ * console.error('[smartico] user monthly limit reached — show "you have used all your custom avatars this month"');
7624
+ * } else if (result.errCode === 12002) {
7625
+ * console.error('[smartico] brand monthly pool exhausted — show "custom avatars are unavailable right now, try later"');
7626
+ * } else {
7627
+ * console.error('[smartico] generation failed (e.g. not enough balance) — let the user retry:', result.errMessage);
7628
+ * }
7629
+ * ```
7630
+ */
7631
+ async avatarsCustomize(props) {
7632
+ const required = ['label_id', 'user_id', 'prompt_id', 'avatar_url', 'avatar_real_id'];
7633
+ for (const field of required) {
7634
+ if (!props[field]) {
7635
+ throw new Error(`${field} is required`);
7636
+ }
7637
+ }
7638
+ const r = await this.api.avatarsCustomize(props);
7639
+ // On success a new variant is persisted server-side — drop the cached
7640
+ // list so the next getAvatarsCustomized() surfaces it.
7641
+ if (r.cdn_url) {
7642
+ OCache.clear(ECacheContext.WSAPI, onUpdateContextKey.AvatarsCustomized);
7643
+ }
7644
+ return r;
7645
+ }
7534
7646
  }
7535
7647
 
7536
7648
  /** @group GamePick */
@@ -9297,7 +9409,7 @@ const AVATAR_DOMAIN = 'https://img{ENV_ID}.smr.vc';
9297
9409
  const DEFAULT_LANG_EN = 'EN';
9298
9410
  class SmarticoAPI {
9299
9411
  constructor(label_api_key, brand_api_key, messageSender, options = {}) {
9300
- var _options$tracker;
9412
+ var _options$tracker, _options$tracker2;
9301
9413
  this.label_api_key = void 0;
9302
9414
  this.brand_api_key = void 0;
9303
9415
  this.messageSender = void 0;
@@ -9308,6 +9420,7 @@ class SmarticoAPI {
9308
9420
  this.gamesApiUrl = void 0;
9309
9421
  this.baseRgApiParams = void 0;
9310
9422
  this.avatarDomain = void 0;
9423
+ this.avatarOriginDomain = void 0;
9311
9424
  this.envId = void 0;
9312
9425
  this.logger = void 0;
9313
9426
  this.logCIDs = void 0;
@@ -9335,6 +9448,7 @@ class SmarticoAPI {
9335
9448
  };
9336
9449
  }
9337
9450
  this.avatarDomain = SmarticoAPI.getAvatarUrl(label_api_key || ((_options$tracker = options.tracker) == null ? void 0 : _options$tracker.label_api_key));
9451
+ this.avatarOriginDomain = SmarticoAPI.getAvatarOriginUrl(label_api_key || ((_options$tracker2 = options.tracker) == null ? void 0 : _options$tracker2.label_api_key));
9338
9452
  this.label_api_key = SmarticoAPI.getCleanLabelApiKey(label_api_key);
9339
9453
  }
9340
9454
  static getEnvDnsSuffix(label_api_key) {
@@ -9391,6 +9505,9 @@ class SmarticoAPI {
9391
9505
  const avatarUrl = AVATAR_DOMAIN.replace('{ENV_ID}', SmarticoAPI.getEnvDnsSuffix(label_api_key));
9392
9506
  return SmarticoAPI.replaceSmrDomainsWithCloudfront(avatarUrl);
9393
9507
  }
9508
+ static getAvatarOriginUrl(label_api_key) {
9509
+ return AVATAR_DOMAIN.replace('{ENV_ID}', SmarticoAPI.getEnvDnsSuffix(label_api_key));
9510
+ }
9394
9511
  async send(message, expectCID, force_language) {
9395
9512
  if (this.logCIDs.includes(message.cid)) {
9396
9513
  this.logger.info('REQ', message);
@@ -10145,6 +10262,33 @@ class SmarticoAPI {
10145
10262
  throw new Error(`Failed to call games API: ${method}. ${e.message}`);
10146
10263
  }
10147
10264
  }
10265
+ async sendAvatarApi({
10266
+ method,
10267
+ body
10268
+ }) {
10269
+ if (!this.tracker) {
10270
+ throw new Error(`Avatar APIs are not available in the visitor mode`);
10271
+ }
10272
+ const url = `${this.avatarOriginDomain}/${method}`;
10273
+ try {
10274
+ const response = await fetch(url, {
10275
+ method: 'POST',
10276
+ headers: {
10277
+ 'Accept': 'application/json',
10278
+ 'Content-Type': 'application/json'
10279
+ },
10280
+ body: JSON.stringify(body)
10281
+ });
10282
+ const data = await response.json();
10283
+ return SmarticoAPI.replaceSmrDomainsWithCloudfront(data);
10284
+ } catch (e) {
10285
+ this.logger.error(`Failed to call avatar API: ${method}`, {
10286
+ url,
10287
+ error: e.message
10288
+ });
10289
+ throw new Error(`Failed to call avatar API: ${method}. ${e.message}`);
10290
+ }
10291
+ }
10148
10292
  async gpGetActiveRounds(saw_template_id) {
10149
10293
  const params = {
10150
10294
  ext_game_id: saw_template_id
@@ -10252,6 +10396,21 @@ class SmarticoAPI {
10252
10396
  });
10253
10397
  return await this.send(message, ClassId.CLIENT_SET_AVATAR_RESPONSE);
10254
10398
  }
10399
+ async avatarsCustomize(params) {
10400
+ var _this$tracker, _this$tracker2;
10401
+ return this.sendAvatarApi({
10402
+ method: 'avatar-customize',
10403
+ body: {
10404
+ label_id: params.label_id,
10405
+ user_id: params.user_id,
10406
+ user_ext_id: (_this$tracker = this.tracker) == null ? void 0 : _this$tracker.getExtUserId(),
10407
+ brand_key: this.brand_api_key || ((_this$tracker2 = this.tracker) == null || (_this$tracker2 = _this$tracker2.params) == null ? void 0 : _this$tracker2.brand_key),
10408
+ prompt_id: params.prompt_id,
10409
+ avatar_url: params.avatar_url,
10410
+ avatar_real_id: params.avatar_real_id
10411
+ }
10412
+ });
10413
+ }
10255
10414
  async avatarsGetListT(user_ext_id) {
10256
10415
  var _await$this$avatarsGe;
10257
10416
  return avatarDefinitionTransform((_await$this$avatarsGe = (await this.avatarsGetList(user_ext_id)).avatars) != null ? _await$this$avatarsGe : [], this.avatarDomain);
@@ -10925,15 +11084,18 @@ var JackpotType;
10925
11084
  JackpotType[JackpotType["Personal"] = 2] = "Personal";
10926
11085
  })(JackpotType || (JackpotType = {}));
10927
11086
 
11087
+ /**
11088
+ * Limit error codes returned in `errCode` by the `avatarsCustomize` method.
11089
+ * See the `avatarsCustomize` TSDoc for the full table (including the generic
11090
+ * `-1` failure, which has no named member here).
11091
+ */
10928
11092
  var AvatarCustomizeErrorCode;
10929
11093
  (function (AvatarCustomizeErrorCode) {
11094
+ /** The user has reached the operator-configured per-user monthly cap on custom-avatar generations. */
10930
11095
  AvatarCustomizeErrorCode[AvatarCustomizeErrorCode["AVATAR_USER_LIMIT"] = 12001] = "AVATAR_USER_LIMIT";
11096
+ /** The brand's operator-configured shared monthly pool of custom-avatar generations is exhausted. */
10931
11097
  AvatarCustomizeErrorCode[AvatarCustomizeErrorCode["AVATAR_LABEL_LIMIT"] = 12002] = "AVATAR_LABEL_LIMIT";
10932
11098
  })(AvatarCustomizeErrorCode || (AvatarCustomizeErrorCode = {}));
10933
- const AvatarCustomizeErrorMessage = {
10934
- [AvatarCustomizeErrorCode.AVATAR_USER_LIMIT]: 'You have exceeded number of custom avatars creation, please try later',
10935
- [AvatarCustomizeErrorCode.AVATAR_LABEL_LIMIT]: 'The custom avatars are not available, please try again later'
10936
- };
10937
11099
 
10938
11100
  /**
10939
11101
  * Error codes returned in `errCode` by the `joinClan` method (also carried
@@ -10969,5 +11131,5 @@ var JoinClanErrorCode;
10969
11131
  JoinClanErrorCode[JoinClanErrorCode["JOIN_CLAN_JOINED_AFTER_TOURNAMENT_START"] = 1011] = "JOIN_CLAN_JOINED_AFTER_TOURNAMENT_START";
10970
11132
  })(JoinClanErrorCode || (JoinClanErrorCode = {}));
10971
11133
 
10972
- export { AchCategoryTransform, AchCustomLayoutTheme, AchCustomSectionType, AchMissionsTabsOptions, AchOverviewMissionsFilter, AchievementAvailabilityStatus, AchievementClaimPeriodTypeId, AchievementStatus, AchievementTaskType, AchievementType, ActivityLogTransform, ActivityTypeLimited, AllRoundsGameBoardID, AnalyticsInboxSubScreenNameId, AnalyticsInterfaceType, AnalyticsScreenNameId, AnalyticsTournamentsLobbySubScreenNameId, AttemptPeriodType, AvatarCustomizeErrorCode, AvatarCustomizeErrorMessage, BadgesTimeLimitStates, BonusItemsTransform, BonusStatus, BuyStoreItemErrorCode, ClassId, CookieStore, CoreUtils, ECacheContext, GPRoundStatus, GamePickMarketType, GamePickResolutionType, GamePickScoreType, GamePickSportType, GameRoundOrderType, GetJackpotEligibleGamesResponseTransform, GetJackpotWinnersResponseTransform, GetLevelMapResponseTransform, InboxCategories, InboxMessageBodyTransform, InboxMessageType, InboxMessagesTransform, InboxReadStatus, JackPotTemparature, JackpotContributionType, JackpotType, JoinClanErrorCode, LeaderBoardPeriodType, LiquidEntityData, MiniGamePrizeTypeName, MiniGamePrizeTypeNamed, MissionCategory, MissionUtils, OCache, OpenLinksType, PointChangeSourceType, PrizeModifiers, PrizeModifiersKeysNames, PublicLabelSettings, QuizAnswersValueType, QuizMarketPerSport, QuizSportType, RaffleDrawInstanceState, RaffleDrawTypeExecution, RaffleTicketCapVisualization, SAWAcknowledgeType, SAWAcknowledgeTypeName, SAWAcknowledgeTypeNamed, SAWAskForUsername, SAWBuyInType, SAWBuyInTypeName, SAWBuyInTypeNamed, SAWExposeUserSpinId, SAWExposeUserSpinIdName, SAWExposeUserSpinIdNamed, SAWGPMarketType, SAWGameDifficultyType, SAWGameDifficultyTypeName, SAWGameLayout, SAWGameLayoutName, SAWGameLayoutNamed, SAWGameType, SAWGameTypeName, SAWGameTypeNamed, SAWHistoryTransform, SAWPrizeType, SAWSpinErrorCode, SAWTemplatesTransform, SAWUtils, SAWWheelLayout, SAWWinSoundFiles, SAWWinSoundType, SawGameDifficultyTypeNamed, ScheduledMissionType, SmarticoAPI, StoreCategoryTransform, StoreItemPurchaseType, StoreItemPurchasedTransform, StoreItemTransform, StoreItemType, StoreItemTypeName, StoreItemTypeNamed, TournamentInstanceStatus, TournamentInstanceStatusName, TournamentItemsTransform, TournamentRegistrationError, TournamentRegistrationStatus, TournamentRegistrationStatusName, TournamentRegistrationStatusNamed, TournamentRegistrationType, TournamentRegistrationTypeGetName, TournamentType, TournamentUtils, TranslationArea, UICustomSectionTransform, UserAchievementTransform, UserBalanceType, WSAPI, avatarCustomizedTransform, avatarDefinitionTransform, avatarPromptTransform, clanTournamentPlayersTransform, drawRunHistoryTransform, drawRunTransform, drawTransform, enrichUserAchievementsWithBadgeState, getLeaderBoardTransform, marketsInfo, prizeTransform, quizAnswerAwayTeamReplacementText, quizAnswerHomeTeamReplacementText, quizAnswersTrKeys, quizDrawReplacementText, quizEvenReplacementText, quizNoGoalsReplacementText, quizNoReplacementText, quizOddReplacementText, quizOrReplacementText, quizSupportedSports, quizYesReplacementText, raffleClaimPrizeResponseTransform, raffleTransform, ticketsTransform, tournamentInfoItemTransform, winnersTransform };
11134
+ export { AchCategoryTransform, AchCustomLayoutTheme, AchCustomSectionType, AchMissionsTabsOptions, AchOverviewMissionsFilter, AchievementAvailabilityStatus, AchievementClaimPeriodTypeId, AchievementStatus, AchievementTaskType, AchievementType, ActivityLogTransform, ActivityTypeLimited, AllRoundsGameBoardID, AnalyticsInboxSubScreenNameId, AnalyticsInterfaceType, AnalyticsScreenNameId, AnalyticsTournamentsLobbySubScreenNameId, AttemptPeriodType, AvatarCustomizeErrorCode, BadgesTimeLimitStates, BonusItemsTransform, BonusStatus, BuyStoreItemErrorCode, ClassId, CookieStore, CoreUtils, ECacheContext, GPRoundStatus, GamePickMarketType, GamePickResolutionType, GamePickScoreType, GamePickSportType, GameRoundOrderType, GetJackpotEligibleGamesResponseTransform, GetJackpotWinnersResponseTransform, GetLevelMapResponseTransform, InboxCategories, InboxMessageBodyTransform, InboxMessageType, InboxMessagesTransform, InboxReadStatus, JackPotTemparature, JackpotContributionType, JackpotType, JoinClanErrorCode, LeaderBoardPeriodType, LiquidEntityData, MiniGamePrizeTypeName, MiniGamePrizeTypeNamed, MissionCategory, MissionUtils, OCache, OpenLinksType, PointChangeSourceType, PrizeModifiers, PrizeModifiersKeysNames, PublicLabelSettings, QuizAnswersValueType, QuizMarketPerSport, QuizSportType, RaffleDrawInstanceState, RaffleDrawTypeExecution, RaffleTicketCapVisualization, SAWAcknowledgeType, SAWAcknowledgeTypeName, SAWAcknowledgeTypeNamed, SAWAskForUsername, SAWBuyInType, SAWBuyInTypeName, SAWBuyInTypeNamed, SAWExposeUserSpinId, SAWExposeUserSpinIdName, SAWExposeUserSpinIdNamed, SAWGPMarketType, SAWGameDifficultyType, SAWGameDifficultyTypeName, SAWGameLayout, SAWGameLayoutName, SAWGameLayoutNamed, SAWGameType, SAWGameTypeName, SAWGameTypeNamed, SAWHistoryTransform, SAWPrizeType, SAWSpinErrorCode, SAWTemplatesTransform, SAWUtils, SAWWheelLayout, SAWWinSoundFiles, SAWWinSoundType, SawGameDifficultyTypeNamed, ScheduledMissionType, SmarticoAPI, StoreCategoryTransform, StoreItemPurchaseType, StoreItemPurchasedTransform, StoreItemTransform, StoreItemType, StoreItemTypeName, StoreItemTypeNamed, TournamentInstanceStatus, TournamentInstanceStatusName, TournamentItemsTransform, TournamentRegistrationError, TournamentRegistrationStatus, TournamentRegistrationStatusName, TournamentRegistrationStatusNamed, TournamentRegistrationType, TournamentRegistrationTypeGetName, TournamentType, TournamentUtils, TranslationArea, UICustomSectionTransform, UserAchievementTransform, UserBalanceType, WSAPI, avatarCustomizedTransform, avatarDefinitionTransform, avatarPromptTransform, clanTournamentPlayersTransform, drawRunHistoryTransform, drawRunTransform, drawTransform, enrichUserAchievementsWithBadgeState, getLeaderBoardTransform, marketsInfo, prizeTransform, quizAnswerAwayTeamReplacementText, quizAnswerHomeTeamReplacementText, quizAnswersTrKeys, quizDrawReplacementText, quizEvenReplacementText, quizNoGoalsReplacementText, quizNoReplacementText, quizOddReplacementText, quizOrReplacementText, quizSupportedSports, quizYesReplacementText, raffleClaimPrizeResponseTransform, raffleTransform, ticketsTransform, tournamentInfoItemTransform, winnersTransform };
10973
11135
  //# sourceMappingURL=index.modern.mjs.map