{"version":3,"file":"index.cjs","sources":["../src/helpers/access.ts","../src/composables/Mountable.ts","../src/helpers/removeUndefined.ts","../src/helpers/shallowEqual.ts","../src/composables/Stateful.ts","../src/helpers/createIsSupportedSignal.ts","../src/with-checks/throwifyWithChecksFp.ts","../src/errors.ts","../src/with-checks/withChecksFp.ts","../src/composables/Button.ts","../src/features/BackButton/BackButton.ts","../src/fn-options/sharedFeatureOptions.ts","../src/fn-options/createFnOption.ts","../src/globals/signals-registry.ts","../src/globals/postEvent.ts","../src/fn-options/withPostEvent.ts","../src/helpers/component-storage.ts","../src/helpers/navigation.ts","../src/fn-options/withStateRestore.ts","../src/globals/version.ts","../src/fn-options/withVersion.ts","../src/fn-options/buttonOptions.ts","../src/features/BackButton/instance.ts","../src/composables/AsyncMountable.ts","../src/features/Biometry/Biometry.ts","../src/globals/request.ts","../src/fn-options/withRequest.ts","../src/features/Biometry/instance.ts","../src/features/ClosingBehavior/ClosingBehavior.ts","../src/features/ClosingBehavior/instance.ts","../src/features/CloudStorage/CloudStorage.ts","../src/globals/createRequestId.ts","../src/globals/invokeCustomMethod.ts","../src/fn-options/withInvokeCustomMethod.ts","../src/features/CloudStorage/instance.ts","../src/features/DeviceStorage/DeviceStorage.ts","../src/fn-options/withCreateRequestId.ts","../src/features/DeviceStorage/instance.ts","../src/features/emoji-status/requestEmojiStatusAccess.ts","../src/features/emoji-status/setEmojiStatus.ts","../src/features/HapticFeedback/HapticFeedback.ts","../src/features/HapticFeedback/instance.ts","../src/features/home-screen/addToHomeScreen.ts","../src/features/home-screen/checkHomeScreenStatus.ts","../src/features/InitData/InitData.ts","../src/features/InitData/instance.ts","../src/features/Invoice/Invoice.ts","../src/features/Invoice/instance.ts","../src/features/links/openLink.ts","../src/features/links/openTelegramLink.ts","../src/features/links/shareURL.ts","../src/features/LocationManager/LocationManager.ts","../src/features/LocationManager/instance.ts","../src/features/MainButton/MainButton.ts","../src/helpers/css-vars.ts","../src/helpers/isColorDark.ts","../src/features/ThemeParams/ThemeParams.ts","../src/globals/themeParams.ts","../src/features/ThemeParams/instance.ts","../src/fn-options/bottomButtonOptions.ts","../src/features/MainButton/instance.ts","../src/features/MiniApp/MiniApp.ts","../src/features/MiniApp/instance.ts","../src/features/Popup/prepareParams.ts","../src/features/Popup/Popup.ts","../src/features/Popup/instance.ts","../src/features/privacy/requestPhoneAccess.ts","../src/features/privacy/requestContact.ts","../src/features/privacy/requestWriteAccess.ts","../src/features/QrScanner/QrScanner.ts","../src/features/QrScanner/instance.ts","../src/features/SecondaryButton/SecondaryButton.ts","../src/features/SecondaryButton/instance.ts","../src/features/SecureStorage/SecureStorage.ts","../src/features/SecureStorage/instance.ts","../src/features/SettingsButton/SettingsButton.ts","../src/features/SettingsButton/instance.ts","../src/features/SwipeBehavior/SwipeBehavior.ts","../src/features/SwipeBehavior/instance.ts","../src/features/uncategorized/copyTextToClipboard.ts","../src/features/uncategorized/downloadFile.ts","../src/features/uncategorized/getCurrentTime.ts","../src/features/uncategorized/hideKeyboard.ts","../src/features/uncategorized/readTextFromClipboard.ts","../src/features/uncategorized/retrieveAndroidDeviceDataFrom.ts","../src/features/uncategorized/retrieveAndroidDeviceData.ts","../src/features/uncategorized/sendData.ts","../src/features/uncategorized/shareMessage.ts","../src/features/uncategorized/shareStory.ts","../src/globals/isInlineMode.ts","../src/features/uncategorized/switchInlineQuery.ts","../src/features/Viewport/Viewport.ts","../src/features/Viewport/instance.ts","../src/init.ts"],"sourcesContent":["import type { MaybeAccessor } from '@/types.js';\n\nexport function access<T>(value: MaybeAccessor<T>): T {\n  return typeof value === 'function' ? (value as any)() as T : value;\n}\n","import { batch, computed, signal } from '@tma.js/signals';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport { access } from '@/helpers/access.js';\nimport type { MaybeAccessor } from '@/types.js';\n\nexport interface MountableOptions<S, Err> {\n  /**\n   * A state to use if the `restoreState` function returned falsy value or\n   * `isPageReload` returned false.\n   */\n  initialState: S | (() => E.Either<Err, S>);\n  /**\n   * @returns True if the current page was reloaded.\n   */\n  isPageReload: MaybeAccessor<boolean>;\n  /**\n   * A function to call whenever the component was mounted.\n   * @param state - restored state.\n   */\n  onMounted?: (state: S) => void;\n  /**\n   * A function to call whenever the component was unmounted.\n   */\n  onUnmounted?: VoidFunction;\n  /**\n   * Attempts to restore previously saved component state. This function\n   * will only be called if the current page was reloaded.\n   */\n  restoreState: () => (S | undefined);\n}\n\nexport class Mountable<S extends object, Err = never> {\n  constructor({\n    onMounted,\n    restoreState,\n    initialState,\n    onUnmounted,\n    isPageReload,\n  }: MountableOptions<S, Err>) {\n    this.mount = () => {\n      if (this.isMounted()) {\n        return E.right(undefined);\n      }\n      const restored = access(isPageReload) ? restoreState() : undefined;\n      const state = restored\n        ? E.right(restored)\n        : (typeof initialState === 'function' ? initialState() : E.right(initialState));\n\n      return fn.pipe(state, E.map(s => {\n        batch(() => {\n          this._isMounted.set(true);\n          onMounted?.(s);\n        });\n      }));\n    };\n\n    this.unmount = () => {\n      if (this._isMounted()) {\n        batch(() => {\n          this._isMounted.set(false);\n          onUnmounted?.();\n        });\n      }\n    };\n  }\n\n  private readonly _isMounted = signal(false);\n\n  /**\n   * Signal indicating if the component is mounted.\n   */\n  readonly isMounted = computed(this._isMounted);\n\n  /**\n   * Mounts the component restoring its state and calling required side effects.\n   */\n  readonly mount: () => E.Either<Err, void>;\n\n  /**\n   * Unmounts the component.\n   */\n  readonly unmount: () => void;\n}\n","import type { UnionRequiredKeys } from '@tma.js/toolkit';\n\ntype RemoveUndefined<T> = {\n  [K in UnionRequiredKeys<T>]-?: T[K]\n};\n\n/**\n * @returns Object with keys having undefined values.\n * @param value - an object to remove undefined values from.\n */\nexport function removeUndefined<T extends {}>(value: T): RemoveUndefined<T> {\n  const result = {} as RemoveUndefined<T>;\n  for (const k in value) {\n    const v = value[k];\n    v !== undefined && ((result as any)[k] = v);\n  }\n  return result;\n}\n","export function shallowEqual<T extends object>(a: T, b: T): boolean {\n  const aKeys = Object.keys(a);\n  const bKeys = Object.keys(b);\n  return aKeys.length !== bKeys.length\n    ? false\n    : aKeys.every(aKey => {\n      return Object.prototype.hasOwnProperty.call(b, aKey)\n        && (a as any)[aKey] === (b as any)[aKey];\n    });\n}\n","import { type Computed, computed, type Signal, signal } from '@tma.js/signals';\n\nimport { removeUndefined } from '@/helpers/removeUndefined.js';\nimport { shallowEqual } from '@/helpers/shallowEqual.js';\n\nexport interface StatefulOptions<S> {\n  /**\n   * The initial state.\n   */\n  initialState: S;\n  /**\n   * A function to call whenever the state changes.\n   * @param state - updated state.\n   */\n  onChange: (state: S) => void;\n}\n\nexport class Stateful<S extends object> {\n  constructor({ initialState, onChange }: StatefulOptions<S>) {\n    this._state = signal(initialState, { equals: shallowEqual });\n    this.state = computed(this._state);\n    this.state.sub(onChange);\n  }\n\n  protected readonly _state: Signal<S>;\n\n  /**\n   * The current state.\n   */\n  readonly state: Computed<S>;\n\n  /**\n   * Creates a computed signal based on the state.\n   * @param key - a state key to use as a source.\n   */\n  getter<K extends keyof S>(key: K): Computed<S[K]> {\n    return computed(() => this._state()[key]);\n  }\n\n  /**\n   * Updates the state.\n   * @param state - updates to apply.\n   */\n  readonly setState = (state: Partial<S>): void => {\n    const nextState = { ...this.state(), ...removeUndefined(state) };\n    if (!shallowEqual(nextState, this.state())) {\n      this._state.set(nextState);\n    }\n  };\n\n  /**\n   * @returns True if specified payload will update the state.\n   * @param state\n   */\n  hasDiff(state: Partial<S>): boolean {\n    return !shallowEqual({ ...this.state(), ...removeUndefined(state) }, this.state());\n  }\n}\n","import { type MethodName, supports } from '@tma.js/bridge';\nimport { type Computed, computed } from '@tma.js/signals';\nimport type { Version } from '@tma.js/types';\n\nimport { access } from '@/helpers/access.js';\nimport type { MaybeAccessor } from '@/types.js';\n\nexport function createIsSupportedSignal(\n  method: MethodName,\n  version: MaybeAccessor<Version>,\n): Computed<boolean> {\n  return computed(() => supports(method, access(version)));\n}\n","import { throwifyFpFn, throwifyAnyEither, type AnyFn } from '@tma.js/toolkit';\nimport { function as fn, option as O } from 'fp-ts';\n\nimport type { WithChecksFp, WithChecks } from '@/with-checks/withChecksFp.js';\n\n// #__NO_SIDE_EFFECTS__\nexport function throwifyWithChecksFp<\n  Fn extends AnyFn,\n  HasSupportCheck extends boolean,\n  SupportsMapKeySchema extends string,\n>(\n  fn_: WithChecksFp<Fn, HasSupportCheck, SupportsMapKeySchema>,\n): WithChecks<Fn, HasSupportCheck, SupportsMapKeySchema> {\n  return Object.assign(throwifyFpFn(fn_), {\n    ifAvailable(...args: Parameters<Fn>) {\n      return fn.pipe(\n        fn_.ifAvailable(...args),\n        O.match(\n          () => ({ ok: false }),\n          data => ({\n            ok: true,\n            data: throwifyAnyEither(data),\n          }),\n        ),\n      );\n    },\n  }) as unknown as WithChecks<Fn, HasSupportCheck, SupportsMapKeySchema>;\n}\n","import { errorClass, errorClassWithData } from 'error-kid';\nimport type { BaseIssue } from 'valibot';\n\nfunction msgToTuple(message?: string): [string?] {\n  return [message];\n}\n\nexport class ValidationError extends /* #__PURE__ */ errorClassWithData<\n  { input: unknown; issues: BaseIssue<any>[] },\n  [input: unknown, issues: BaseIssue<any>[]]\n>(\n  'ValidationError',\n  (input, issues) => ({ input, issues }),\n  'Validation error',\n) {\n}\n\nexport class CSSVarsBoundError extends /* #__PURE__ */ errorClass(\n  'CSSVarsBoundError',\n  'CSS variables are already bound',\n) {\n}\n\nexport class DeviceStorageMethodError extends /* #__PURE__ */ errorClassWithData<\n  { error: string },\n  [error: string]\n>('DeviceStorageMethodError', error => ({ error }), error => [error]) {\n}\n\nexport class SecureStorageMethodError extends /* #__PURE__ */ errorClassWithData<\n  { error: string },\n  [error: string]\n>('SecureStorageMethodError', error => ({ error }), error => [error]) {\n}\n\nexport class NotAvailableError extends /* #__PURE__ */ errorClass<[message: string]>(\n  'NotAvailableError',\n  msgToTuple,\n) {\n}\n\nexport class InvalidEnvError extends /* #__PURE__ */ errorClass<[message?: string]>(\n  'InvalidEnvError',\n  msgToTuple,\n) {\n}\n\nexport class FunctionUnavailableError extends /* #__PURE__ */ errorClass<[message?: string]>(\n  'FunctionNotAvailableError',\n  msgToTuple,\n) {\n}\n\nexport class InvalidArgumentsError extends /* #__PURE__ */ errorClass<[message: string, cause?: unknown]>(\n  'InvalidArgumentsError',\n  (message, cause) => [message, { cause }],\n) {\n}\n\nexport class ConcurrentCallError extends /* #__PURE__ */ errorClass<[message: string]>(\n  'ConcurrentCallError',\n  msgToTuple,\n) {\n}\n\nexport class SetEmojiStatusError extends /* #__PURE__ */ errorClass<[error: string]>(\n  'SetEmojiStatusError',\n  error => [`Failed to set emoji status: ${error}`],\n) {\n}\n\nexport class AccessDeniedError extends /* #__PURE__ */ errorClass<[message: string]>(\n  'AccessDeniedError',\n  msgToTuple,\n) {\n}\n\nexport class FullscreenFailedError extends /* #__PURE__ */ errorClass<[message: string]>(\n  'FullscreenFailedError',\n  msgToTuple,\n) {\n}\n\nexport class ShareMessageError extends /* #__PURE__ */ errorClass<[error: string]>(\n  'ShareMessageError',\n  msgToTuple,\n) {\n}\n\nexport class UnknownThemeParamsKeyError extends /* #__PURE__ */ errorClass<[key: string]>(\n  'UnknownThemeParamsKeyError',\n  key => [`Unknown theme params key passed: ${key}`],\n) {\n}\n","import {\n  type MethodName,\n  supports,\n  type MethodNameWithVersionedParams,\n  type MethodVersionedParams,\n} from '@tma.js/bridge';\nimport { type Computed, computed } from '@tma.js/signals';\nimport type {\n  If,\n  IsNever,\n  AnyFnAnyEither,\n  RightOfReturn,\n  LeftOfReturn,\n  MaybeMonadReturnTypeToCommon,\n  MaybeCommonReturnTypeToMonad,\n  AnyFn,\n} from '@tma.js/toolkit';\nimport type { Version } from '@tma.js/types';\nimport { either as E, option as O, taskEither as TE } from 'fp-ts';\n\nimport { FunctionUnavailableError } from '@/errors.js';\nimport { access } from '@/helpers/access.js';\nimport type { MaybeAccessor } from '@/types.js';\n\ntype IfReturnsTask<Fn extends AnyFnAnyEither, A, B> =\n  ReturnType<Fn> extends TE.TaskEither<any, any> ? A : B;\n\ntype OptionsBasedRequires<O extends WithChecksOptions<any>> = O extends { requires: any }\n  ? true : false;\n\ntype OptionsBasedSupports<O extends WithChecksOptions<any>> = O extends { supports: any }\n  ? Extract<keyof O['supports'], string> : never;\n\ntype OptionsBasedFn<Opts extends WithChecksOptions<any>> = (...args: any[]) => (\n  Opts['returns'] extends 'plain'\n    ? any\n    : Opts['returns'] extends 'promise'\n      ? PromiseLike<any>\n      : Opts['returns'] extends 'task'\n        ? TE.TaskEither<any, any>\n        : E.Either<any, any>\n);\n\n/**\n * @returns Error text if something is wrong.\n */\nexport type CustomSupportFn = () => string | undefined;\n\nexport type Require =\n  | MethodName\n  | CustomSupportFn\n  | { every: (MethodName | CustomSupportFn)[] }\n  | { some: (MethodName | CustomSupportFn)[] };\n\n/**\n * A map where the key is a method name with versioned parameters, and the value is a tuple\n * containing the method and parameter names. The third tuple value is a function accepting\n * the wrapped function arguments and returning true if support check must be applied.\n */\nexport type SupportsMap<Args extends any[]> = {\n  [OptionName: string]: {\n    [M in MethodNameWithVersionedParams]: {\n      /**\n       * Method name.\n       * @example 'web_app_set_header_color'\n       */\n      method: M;\n      /**\n       * Method version-dependent parameter.\n       * @example `color`\n       */\n      param: MethodVersionedParams<M>;\n      /**\n       * @returns True if the support function should be called.\n       * @param args - function arguments.\n       */\n      shouldCheck: (...args: Args) => boolean;\n    };\n  }[MethodNameWithVersionedParams];\n};\n\ntype WrappedFnReturnType<Fn extends AnyFn> = ReturnType<Fn> extends E.Either<any, any>\n  ? E.Either<FunctionUnavailableError | LeftOfReturn<Fn>, RightOfReturn<Fn>>\n  : ReturnType<Fn> extends TE.TaskEither<any, any>\n    ? TE.TaskEither<FunctionUnavailableError | LeftOfReturn<Fn>, RightOfReturn<Fn>>\n    : ReturnType<Fn> extends PromiseLike<infer U>\n      ? TE.TaskEither<FunctionUnavailableError, U>\n      : E.Either<FunctionUnavailableError, ReturnType<Fn>>;\n\nexport type WrappedFn<Fn extends AnyFn> = (...args: Parameters<Fn>) => WrappedFnReturnType<Fn>;\n\nexport type WithChecksFp<\n  Fn extends AnyFn,\n  HasSupportCheck extends boolean,\n  SupportsMapKeySchema extends string = never,\n> =\n  & WrappedFn<Fn>\n  & {\n  /**\n   * A signal returning `true` if the function is available in the current environment and\n   * conditions.\n   *\n   * To be more accurate, the method checks the following:\n   * 1. The current environment is Telegram Mini Apps.\n   * 2. The SDK package is initialized (if this requirement is specified).\n   * 3. If passed, the `isSupported` signal returned true.\n   * 4. If passed, the `isMounted` signal returned true.\n   *\n   * *You should use this function when possible because it provides must-have code security\n   * mechanisms and makes a developer sure that he is using the package properly.*\n   *\n   * @returns True if the function is available in the current environment.\n   * @example\n   * if (backButton.show.isAvailable()) {\n   *   backButton.show();\n   * }\n   */\n    isAvailable: Computed<boolean>;\n    /**\n   * Calls the function only in case it is available.\n   *\n   * It uses the `isAvailable` internally to check if the function is available for call.\n   * @example\n   * backButton.show.ifAvailable();\n   */\n    ifAvailable(...args: Parameters<Fn>): O.Option<MaybeCommonReturnTypeToMonad<Fn>>;\n  }\n  & If<HasSupportCheck, {\n  /**\n   * The signal returning `true` if the function is supported by the Telegram client,\n   * including some possible additional conditions.\n   *\n   * It is highly recommended to use this signal only in certain narrow cases when only the\n   * function support check is required, but not its availability.\n   *\n   * This signal is not applying additional operations like checking if the current environment\n   * is Mini Apps and the SDK is initialized.\n   *\n   * To check if the function is available for use, use the `isAvailable` signal.\n   *\n   * @returns True if this function is supported.\n   * @see isAvailable\n   * @example\n   * if (backButton.show.isSupported()) {\n   *   console.log('The method is supported');\n   * }\n   */\n    isSupported: Computed<boolean>;\n  }, {}>\n  & If<IsNever<SupportsMapKeySchema>, {}, {\n  /**\n   * A map where the key is the function-specific option name and value is a signal indicating\n   * if it is supported by the current environment.\n   * @example\n   * if (miniApp.setHeaderColor.isAvailable()) {\n   *   if (miniApp.setHeaderColor.supports('rgb')) {\n   *     miniApp.setHeaderColor('#ffaabb');\n   *   } else {\n   *     miniApp.setHeaderColor('bg_color');\n   *   }\n   * }\n   */\n    supports: (key: SupportsMapKeySchema) => boolean;\n  }>;\n\nexport type WithChecks<\n  Fn extends AnyFn,\n  HasSupportCheck extends boolean,\n  SupportsMapKeySchema extends string = never,\n> =\n  & ((...args: Parameters<Fn>) => MaybeMonadReturnTypeToCommon<Fn>)\n  & Omit<WithChecksFp<Fn, HasSupportCheck, SupportsMapKeySchema>, 'ifAvailable'>\n  & {\n  /**\n   * Calls the function only in case it is available.\n   *\n   * It uses the `isAvailable` internally to check if the function is available for call.\n   * @example\n   * backButton.show.ifAvailable();\n   */\n    ifAvailable(...args: Parameters<Fn>):\n      | { ok: true; data: MaybeMonadReturnTypeToCommon<Fn> }\n      | { ok: false };\n  };\n\nexport interface WithChecksOptions<Fn extends AnyFn> {\n  /**\n   * Signal returning true if the owning component is mounted.\n   */\n  isMounted?: () => boolean;\n  /**\n   * Signal returning true if the owning component is mounting.\n   */\n  isMounting?: () => boolean;\n  /**\n   * A value determining the function requirements. This will enable additional checks for\n   * the function before being called.\n   */\n  requires?: Require;\n  /**\n   * A signal to retrieve the current Telegram Mini Apps version or the value itself.\n   */\n  isTma: MaybeAccessor<boolean>;\n  /**\n   * A map where the key is a method name with versioned parameters, and the value is a tuple\n   * containing the method and parameter names. The third tuple value is a function accepting\n   * the wrapped function arguments and returning true if support check must be applied.\n   */\n  supports?: SupportsMap<Parameters<Fn>>;\n  /**\n   * A signal to retrieve the current Telegram Mini Apps version or the value itself.\n   */\n  version?: MaybeAccessor<Version>;\n  /**\n   * Allows to determine what exactly should be returned from the function - TaskEither or Either.\n   * There is no other way to know it until the function itself is called, but we need to perform\n   * some checks before calling it and return a valid value based on the function return type.\n   */\n  returns: Fn extends AnyFnAnyEither\n    ? IfReturnsTask<Fn, 'task', 'either'>\n    : ReturnType<Fn> extends PromiseLike<any> ? 'promise' : 'plain';\n}\n\nexport function withChecksFp<Fn extends AnyFn, O extends WithChecksOptions<Fn>>(\n  fn: Fn,\n  options: O,\n): WithChecksFp<Fn, OptionsBasedRequires<O>, OptionsBasedSupports<O>> {\n  const version = computed(() => access(options.version) || '100');\n  const isTma = computed(() => access(options.isTma));\n\n  // Simplify the isSupported value to work with an array of validators or a single object.\n  const { requires: optionsIsSupported, returns } = options;\n  const isSupportedSimplified = optionsIsSupported\n    ? typeof optionsIsSupported === 'object'\n      ? optionsIsSupported\n      : { every: [optionsIsSupported] }\n    : undefined;\n\n  /**\n   * @param optionName - target option.\n   * @returns True if specified option is supported.\n   */\n  const isOptionSupported = (optionName: string): boolean => {\n    if (!options.supports) {\n      return true;\n    }\n    const optionSettings = options.supports[optionName];\n    return supports(optionSettings.method, optionSettings.param, version());\n  };\n\n  /**\n   * @returns All found errors according to the isSupported variable value.\n   */\n  const calculateSupportError = (): string | undefined => {\n    // isSupported was not specified. In this case, we assume that the function has no\n    // dependencies and is always supported.\n    if (!isSupportedSimplified) {\n      return;\n    }\n    const [mode, requirements] = 'every' in isSupportedSimplified\n      ? ['every', isSupportedSimplified.every] as const\n      : ['some', isSupportedSimplified.some] as const;\n\n    for (let i = 0; i < requirements.length; i++) {\n      const requirement = requirements[i];\n      const error = typeof requirement === 'function'\n        ? requirement()\n        : supports(requirement, version())\n          ? undefined\n          : `it is unsupported in Mini Apps version ${version()}`;\n      // Return only if there was an error and all requirements must be satisfied, or\n      // this was the last one requirement (when some of the requirements must be met).\n      if (error && (mode === 'every' || i === requirements.length - 1)) {\n        return error;\n      }\n    }\n  };\n\n  /**\n   * @returns An error related to supports.<name> check.\n   */\n  const calculateOptionSupportError = (\n    ...args: Parameters<Fn>\n  ): string | undefined => {\n    for (const k in options.supports) {\n      if (options.supports[k].shouldCheck(...args) && !isOptionSupported(k)) {\n        return `option ${k} is not supported in Mini Apps version ${version()}`;\n      }\n    }\n  };\n\n  const isSupported = computed(() => !calculateSupportError());\n  const isInitialized = computed(() => version() !== '0.0');\n  const isMounted = computed(() => (options.isMounted ? options.isMounted() : true));\n  const isAvailable = computed(\n    () => isTma()\n      && isInitialized()\n      && isSupported()\n      && isMounted(),\n  );\n\n  const wrapError = (message: string): WrappedFnReturnType<Fn> => {\n    const err = new FunctionUnavailableError(message);\n    return (['task', 'promise'].includes(options.returns)\n      ? TE.left(err)\n      : E.left(err)) as WrappedFnReturnType<Fn>;\n  };\n\n  const call = (...args: Parameters<Fn>): MaybeCommonReturnTypeToMonad<Fn> => {\n    if (returns === 'plain') {\n      return E.tryCatch(() => fn(...args), e => e) as MaybeCommonReturnTypeToMonad<Fn>;\n    }\n    if (returns === 'promise') {\n      return TE.tryCatch(() => fn(...args), e => e) as MaybeCommonReturnTypeToMonad<Fn>;\n    }\n    return fn(...args);\n  };\n\n  return Object.assign(\n    (...args: Parameters<Fn>): WrappedFnReturnType<Fn> => {\n      const errMessagePrefix = 'Unable to call function:';\n      if (!isTma()) {\n        return wrapError(`${errMessagePrefix} it can't be called outside Mini Apps`);\n      }\n      if (!isInitialized()) {\n        return wrapError(`${errMessagePrefix} the SDK was not initialized. Use the SDK init() function`);\n      }\n      const supportErr = calculateSupportError();\n      if (supportErr) {\n        return wrapError(`${errMessagePrefix} ${supportErr}`);\n      }\n      const supportsOptionErr = calculateOptionSupportError(...args);\n      if (supportsOptionErr) {\n        return wrapError(`${errMessagePrefix} ${supportsOptionErr}`);\n      }\n      if (!isMounted()) {\n        const message = options.isMounting?.()\n          ? 'mounting. Wait for the mount completion'\n          : 'unmounted. Use the mount() method';\n        return wrapError(`${errMessagePrefix} the component is ${message}`);\n      }\n      return call(...args) as WrappedFnReturnType<Fn>;\n    },\n    fn,\n    {\n      isAvailable,\n      ifAvailable(...args: Parameters<Fn>): O.Option<MaybeCommonReturnTypeToMonad<Fn>> {\n        return isAvailable() ? O.some(call(...args)) : O.none;\n      },\n    },\n    isSupportedSimplified ? { isSupported } : {},\n    options.supports ? { supports: isOptionSupported } : {},\n  );\n}\n\nexport function createWithChecksFp<O extends WithChecksOptions<any>>(options: O) {\n  return <Fn extends OptionsBasedFn<O>>(fn: Fn): WithChecksFp<\n    Fn,\n    OptionsBasedRequires<O>,\n    OptionsBasedSupports<O>\n  > => withChecksFp(fn, options);\n}\n","import type { PostEventError, MethodName, MethodParams } from '@tma.js/bridge';\nimport { computed, type Computed } from '@tma.js/signals';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport { Mountable } from '@/composables/Mountable.js';\nimport { Stateful } from '@/composables/Stateful.js';\nimport type { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport type { WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport type { WithStateRestore } from '@/fn-options/withStateRestore.js';\nimport type { WithVersion } from '@/fn-options/withVersion.js';\nimport { createIsSupportedSignal } from '@/helpers/createIsSupportedSignal.js';\nimport { removeUndefined } from '@/helpers/removeUndefined.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport {\n  type WithChecksFp,\n  type WithChecks,\n  createWithChecksFp,\n} from '@/with-checks/withChecksFp.js';\n\ntype ButtonEither = E.Either<PostEventError, void>;\n\ntype BoolFields<S> = {\n  [K in keyof S]-?: S[K] extends boolean ? K : never;\n}[keyof S];\n\nexport interface ButtonOptions<S, M extends MethodName>\n  extends SharedFeatureOptions,\n  WithStateRestore<S>,\n  WithPostEvent,\n  WithVersion {\n  /**\n   * The initial button state.\n   */\n  initialState: S;\n  /**\n   * Removes a component click listener.\n   * @param listener - a listener to remove.\n   * @param once - should the listener be called only once.\n   */\n  offClick: (listener: VoidFunction, once?: boolean) => void;\n  /**\n   * Adds a component click listener.\n   * @returns A function to remove listener.\n   * @param listener - a listener to add.\n   * @param once - should the listener be called only once.\n   */\n  onClick: (listener: VoidFunction, once?: boolean) => VoidFunction;\n  /**\n   * A Mini Apps method to commit changes.\n   */\n  method: M;\n  /**\n   * A function to create method payload.\n   * @param state\n   */\n  payload: (state: S) => MethodParams<M>;\n}\n\nexport class Button<S extends object, M extends MethodName> {\n  constructor({\n    isTma,\n    storage,\n    onClick,\n    offClick,\n    initialState,\n    isPageReload,\n    postEvent,\n    payload,\n    method,\n    version,\n  }: ButtonOptions<S, M>) {\n    const stateful = new Stateful({\n      initialState,\n      onChange(state) {\n        storage.set(state);\n      },\n    });\n    const mountable = new Mountable<S>({\n      initialState,\n      isPageReload,\n      onMounted: stateful.setState,\n      restoreState: storage.get,\n    });\n\n    const wrapOptions = { version, requires: method, isTma };\n    const wrapSupportedPlain = createWithChecksFp({\n      ...wrapOptions,\n      returns: 'plain',\n    });\n    const wrapMountedEither = createWithChecksFp({\n      ...wrapOptions,\n      returns: 'either',\n      isMounted: mountable.isMounted,\n    });\n\n    this.isMounted = mountable.isMounted;\n    this.isSupported = createIsSupportedSignal(method, version);\n    this.state = stateful.state;\n\n    this.setStateFp = wrapMountedEither(state => {\n      const nextState = { ...this.state(), ...removeUndefined(state) };\n      if (!stateful.hasDiff(nextState)) {\n        return E.right(undefined);\n      }\n      return fn.pipe(\n        postEvent(method as any, payload(nextState)),\n        E.map(() => {\n          stateful.setState(nextState);\n        }),\n      );\n    });\n    this.setState = throwifyWithChecksFp(this.setStateFp);\n    this.onClickFp = wrapSupportedPlain(onClick);\n    this.onClick = throwifyWithChecksFp(this.onClickFp);\n    this.offClickFp = wrapSupportedPlain(offClick);\n    this.offClick = throwifyWithChecksFp(this.offClickFp);\n    this.mountFp = wrapSupportedPlain(() => {\n      const nothing = () => undefined;\n      return fn.pipe(mountable.mount(), E.match(nothing, nothing));\n    });\n    this.mount = throwifyWithChecksFp(this.mountFp);\n    this.unmount = mountable.unmount;\n    this.stateSetters = key => {\n      const wrapped = wrapMountedEither(value => {\n        return this.setStateFp({ [key]: value } as unknown as Partial<S>);\n      });\n      return [throwifyWithChecksFp(wrapped), wrapped];\n    };\n    this.stateBoolSetters = <K extends keyof S>(key: K) => {\n      const [, setFp] = this.stateSetters(key);\n      const setFalse = wrapMountedEither(() => setFp(false as S[K]));\n      const setTrue = wrapMountedEither(() => setFp(true as S[K]));\n      return [\n        [throwifyWithChecksFp(setFalse), setFalse],\n        [throwifyWithChecksFp(setTrue), setTrue],\n      ];\n    };\n  }\n\n  /**\n   * Signal indicating if the component is currently mounted.\n   */\n  readonly isMounted: Computed<boolean>;\n\n  /**\n   * Signal indicating if the component is supported.\n   */\n  readonly isSupported: Computed<boolean>;\n\n  /**\n   * Complete button state.\n   */\n  readonly state: Computed<S>;\n\n  /**\n   * @returns A computed based on the specified state and its related key.\n   * @param key - a key to use.\n   */\n  stateGetter<K extends keyof S>(key: K): Computed<S[K]> {\n    return computed(() => this.state()[key]);\n  }\n\n  /**\n   * @returns A setter with checks for the specified key.\n   * @param key\n   */\n  readonly stateSetters: <K extends keyof S>(key: K) => [\n    throwing: WithChecks<(value: S[K]) => void, true>,\n    fp: WithChecksFp<(value: S[K]) => ButtonEither, true>,\n  ];\n\n  /**\n   * @returns Setters with checks to set a specified boolean key.\n   * @param key\n   */\n  readonly stateBoolSetters: <K extends BoolFields<S>>(key: K) => [\n    setFalse: [\n      throwing: WithChecks<() => void, true>,\n      fp: WithChecksFp<() => ButtonEither, true>,\n    ],\n    setTrue: [\n      throwing: WithChecks<() => void, true>,\n      fp: WithChecksFp<() => ButtonEither, true>,\n    ],\n  ];\n\n  /**\n   * Updates the button state.\n   */\n  readonly setStateFp: WithChecksFp<(state: Partial<S>) => ButtonEither, true>;\n\n  /**\n   * @see setStateFp\n   */\n  readonly setState: WithChecks<(state: Partial<S>) => void, true>;\n\n  /**\n   * Adds a new button listener.\n   * @param listener - event listener.\n   * @param once - should the listener be called only once.\n   * @returns A function to remove bound listener.\n   * @example\n   * const off = button.onClick(() => {\n   *   console.log('User clicked the button');\n   *   off();\n   * });\n   */\n  readonly onClickFp: WithChecksFp<(listener: VoidFunction, once?: boolean) => VoidFunction, true>;\n\n  /**\n   * @see onClickFp\n   */\n  readonly onClick: WithChecks<(listener: VoidFunction, once?: boolean) => VoidFunction, true>;\n\n  /**\n   * Removes the button click listener.\n   * @param listener - event listener.\n   * @param once - should the listener be called only once.\n   * @example\n   * function listener() {\n   *   console.log('User clicked the button');\n   *   button.offClick(listener);\n   * }\n   * button.onClick(listener);\n   */\n  readonly offClickFp: WithChecksFp<\n    (listener: VoidFunction, once?: boolean) => void,\n    true\n  >;\n\n  /**\n   * @see offClickFp\n   */\n  readonly offClick: WithChecks<(listener: VoidFunction, once?: boolean) => void, true>;\n\n  /**\n   * Mounts the component restoring its state.\n   * @since Mini Apps v6.1\n   */\n  readonly mountFp: WithChecksFp<() => void, true>;\n\n  /**\n   * @see mountFp\n   */\n  readonly mount: WithChecks<() => void, true>;\n\n  /**\n   * Unmounts the component.\n   *\n   * Note that this function does not remove listeners added via the `onClick`\n   * function, so you have to remove them on your own.\n   * @see onClick\n   */\n  readonly unmount: () => void;\n}\n","import type { PostEventError } from '@tma.js/bridge';\nimport type { Computed } from '@tma.js/signals';\nimport { either as E } from 'fp-ts';\n\nimport { Button, type ButtonOptions } from '@/composables/Button.js';\nimport type { WithChecksFp, WithChecks } from '@/with-checks/withChecksFp.js';\n\nexport interface BackButtonState {\n  isVisible: boolean;\n}\n\nexport type BackButtonOptions = Omit<\n  ButtonOptions<BackButtonState, 'web_app_setup_back_button'>,\n  'method' | 'payload' | 'initialState'\n>;\n\n/**\n * @since Mini Apps v6.1\n */\nexport class BackButton {\n  constructor(options: BackButtonOptions) {\n    const button = new Button({\n      ...options,\n      method: 'web_app_setup_back_button',\n      payload: state => ({ is_visible: state.isVisible }),\n      initialState: { isVisible: false },\n    });\n\n    this.isVisible = button.stateGetter('isVisible');\n    this.isMounted = button.isMounted;\n    this.isSupported = button.isSupported;\n    [[this.hide, this.hideFp], [this.show, this.showFp]] = button.stateBoolSetters('isVisible');\n    this.onClick = button.onClick;\n    this.onClickFp = button.onClickFp;\n    this.offClick = button.offClick;\n    this.offClickFp = button.offClickFp;\n    this.mount = button.mount;\n    this.mountFp = button.mountFp;\n    this.unmount = button.unmount;\n  }\n\n  /**\n   * Signal indicating if the component is currently visible.\n   */\n  readonly isVisible: Computed<boolean>;\n\n  /**\n   * Signal indicating if the component is currently mounted.\n   */\n  readonly isMounted: Computed<boolean>;\n\n  /**\n   * Signal indicating if the component is supported.\n   */\n  readonly isSupported: Computed<boolean>;\n\n  /**\n   * Hides the button.\n   * @since Mini Apps v6.1\n   */\n  readonly hideFp: WithChecksFp<() => E.Either<PostEventError, void>, true>;\n\n  /**\n   * @see hideFp\n   */\n  readonly hide: WithChecks<() => void, true>;\n\n  /**\n   * Shows the button.\n   * @since Mini Apps v6.1\n   */\n  readonly showFp: WithChecksFp<() => E.Either<PostEventError, void>, true>;\n\n  /**\n   * @see showFp\n   */\n  readonly show: WithChecks<() => void, true>;\n\n  /**\n   * Adds a new button listener.\n   * @param listener - event listener.\n   * @param once - should the listener be called only once.\n   * @returns A function to remove bound listener.\n   * @since Mini Apps v6.1\n   * @example\n   * const off = button.onClick(() => {\n   *   console.log('User clicked the button');\n   *   off();\n   * });\n   */\n  readonly onClickFp: WithChecksFp<\n    (listener: VoidFunction, once?: boolean) => VoidFunction,\n    true\n  >;\n\n  /**\n   * @see onClickFp\n   */\n  readonly onClick: WithChecks<(listener: VoidFunction, once?: boolean) => VoidFunction, true>;\n\n  /**\n   * Removes the button click listener.\n   * @param listener - event listener.\n   * @param once - should the listener be called only once.\n   * @since Mini Apps v6.1\n   * @example\n   * function listener() {\n   *   console.log('User clicked the button');\n   *   button.offClick(listener);\n   * }\n   * button.onClick(listener);\n   */\n  readonly offClickFp: WithChecksFp<\n    (listener: VoidFunction, once?: boolean) => void,\n    true\n  >;\n\n  /**\n   * @see offClickFp\n   */\n  readonly offClick: WithChecks<(listener: VoidFunction, once?: boolean) => void, true>;\n\n  /**\n   * Mounts the component restoring its state.\n   * @since Mini Apps v6.1\n   */\n  readonly mountFp: WithChecksFp<() => void, true>;\n\n  /**\n   * @see mountFp\n   */\n  readonly mount: WithChecks<() => void, true>;\n\n  /**\n   * Unmounts the component.\n   *\n   * Note that this function does not remove listeners added via the `onClick`\n   * function, so you have to remove them on your own.\n   * @see onClick\n   */\n  readonly unmount: () => void;\n}\n","import { isTMAFp } from '@tma.js/bridge';\nimport { computed } from '@tma.js/signals';\n\nimport type { MaybeAccessor } from '@/types.js';\n\nexport interface SharedFeatureOptions {\n  /**\n   * True if the current environment is Telegram Mini Apps.\n   */\n  isTma: MaybeAccessor<boolean>;\n}\n\nexport function sharedFeatureOptions(): SharedFeatureOptions {\n  return { isTma: computed(() => isTMAFp()) };\n}\n","import { access } from '@/helpers/access.js';\nimport type { MaybeAccessor } from '@/types.js';\n\nexport function createFnOption<T>(mix: MaybeAccessor<T>) {\n  return <O extends object>(obj: O) => {\n    return { ...obj, ...access(mix) };\n  };\n}\n","import {\n  computed,\n  type Computed,\n  type Signal,\n  signal,\n  type SignalOptions,\n} from '@tma.js/signals';\n\nexport type SignalsTuple<T> = [Signal<T>, Computed<T>];\n\nconst signals: (Signal<any> | Computed<any>)[] = [];\n\n/**\n * Creates a new signal with the initial value.\n * @param initialValue - the initial value.\n * @param options - additional options.\n */\nexport function createSignal<T>(\n  initialValue: T,\n  options?: SignalOptions<T>,\n): Signal<T>;\n\n/**\n * Creates a new signal without the initial value.\n * @param initialValue - the initial value.\n * @param options - additional options.\n */\nexport function createSignal<T>(\n  initialValue?: T,\n  options?: SignalOptions<T | undefined>,\n): Signal<T | undefined>;\n\n// #__NO_SIDE_EFFECTS__\nexport function createSignal<T>(\n  initialValue?: T,\n  options?: SignalOptions<T | undefined>,\n): Signal<T | undefined> {\n  const s = signal(initialValue, options);\n  signals.push(s);\n  return s;\n}\n\n/**\n * Creates a signal, which wil be automatically updated if some of its dependant signals were\n * modified.\n * @param fn - computation function.\n * @param options - additional functions.\n */\n// #__NO_SIDE_EFFECTS__\nexport function createComputed<T>(fn: (prev?: T) => T, options?: SignalOptions<T>): Computed<T> {\n  const s = computed(fn, options);\n  signals.push(s);\n  return s;\n}\n\n/**\n * Resets all signals states.\n */\nexport function resetSignals() {\n  signals.forEach(s => {\n    s.unsubAll();\n    'reset' in s && s.reset();\n  });\n}\n\n/**\n * @returns A tuple, containing a manual and computed signals. The computed signal is based on\n * the manual one.\n * @param initialValue - the initial value.\n * @param options - additional options.\n */\nexport function createSignalsTuple<T>(\n  initialValue: T,\n  options?: SignalOptions<T>,\n): SignalsTuple<T>;\n\n/**\n * @returns A tuple, containing a manual and computed signals. The computed signal is based on\n * the manual one.\n * @param initialValue - an initial value.\n * @param options - additional options.\n */\nexport function createSignalsTuple<T>(\n  initialValue?: T,\n  options?: SignalOptions<T | undefined>,\n): SignalsTuple<T | undefined>;\n\n// #__NO_SIDE_EFFECTS__\nexport function createSignalsTuple<T>(\n  initialValue?: T,\n  options?: SignalOptions<T | undefined>,\n): SignalsTuple<T | undefined> {\n  const s = createSignal(initialValue, options);\n  return [s, createComputed(s)];\n}\n","import { postEventFp as _postEventFp, type PostEventFpFn, type PostEventFn } from '@tma.js/bridge';\nimport { throwifyAnyEither } from '@tma.js/toolkit';\n\nimport { createSignal } from '@/globals/signals-registry.js';\n\nexport const postEventFpSignal = createSignal(_postEventFp);\n\nexport const postEventFp: PostEventFpFn = (...args: any[]) => {\n  return (postEventFpSignal as any)()(...args);\n};\n\nexport const postEvent: PostEventFn = (...args: any[]) => {\n  return throwifyAnyEither((postEventFp as any)(...args));\n};\n","import { type PostEventFpFn } from '@tma.js/bridge';\n\nimport { createFnOption } from '@/fn-options/createFnOption.js';\nimport { postEventFp } from '@/globals/postEvent.js';\n\nexport interface WithPostEvent {\n  /**\n   * A postEvent function to use to call Mini Apps methods.\n   */\n  postEvent: PostEventFpFn;\n}\n\nexport const withPostEvent = createFnOption<WithPostEvent>({\n  postEvent: postEventFp,\n});\n","import { getStorageValue, setStorageValue } from '@tma.js/toolkit';\n\nexport interface ComponentStorage<T> {\n  get: () => T | undefined;\n  set: (value: T) => void;\n}\n\n/**\n * Creates a new sessionStorage-based component storage.\n * @param key - session storage key to use.\n */\nexport function createComponentSessionStorage<T>(key: string): ComponentStorage<T> {\n  return {\n    get: () => getStorageValue<T>(key),\n    set(value) {\n      setStorageValue<T>(key, value);\n    },\n  };\n}\n","/**\n * Returns the first navigation entry from window.performance.\n * @returns First navigation entry or null, in case performance functionality is not supported\n * or navigation entry was not found.\n */\nfunction getFirstNavigationEntry(): PerformanceNavigationTiming | undefined {\n  return performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming | undefined;\n}\n\n/**\n * @returns True, if the current page was reloaded.\n * @see https://stackoverflow.com/a/36444134/11894710\n */\nexport function isPageReload(): boolean {\n  const entry = getFirstNavigationEntry();\n  return !!entry && entry.type === 'reload';\n}\n","import { createFnOption } from '@/fn-options/createFnOption.js';\nimport { type ComponentStorage, createComponentSessionStorage } from '@/helpers/component-storage.js';\nimport { isPageReload } from '@/helpers/navigation.js';\nimport type { MaybeAccessor } from '@/types.js';\n\nexport interface WithStateRestore<T> {\n  /**\n   * A storage the component could use to store its data.\n   */\n  storage: ComponentStorage<T>;\n  /**\n   * True if the current page is reloaded.\n   */\n  isPageReload: MaybeAccessor<boolean>;\n}\n\nexport function withStateRestore<S>(storageName: string) {\n  return createFnOption<WithStateRestore<S>>({\n    storage: createComponentSessionStorage<S>(storageName),\n    isPageReload,\n  });\n}\n","import type { Version } from '@tma.js/types';\n\nimport { createSignal } from '@/globals/signals-registry.js';\n\n/**\n * The current Mini Apps version.\n */\nexport const version = createSignal<Version>('0.0');\n","import type { Version } from '@tma.js/types';\n\nimport { createFnOption } from '@/fn-options/createFnOption.js';\nimport { version } from '@/globals/version.js';\nimport type { MaybeAccessor } from '@/types.js';\n\nexport interface WithVersion {\n  /**\n   * The currently supported Telegram Mini Apps version by the Telegram client.\n   */\n  version: MaybeAccessor<Version>;\n}\n\nexport const withVersion = createFnOption<WithVersion>({ version });\n","import { on, off, type EventName } from '@tma.js/bridge';\nimport { function as fn } from 'fp-ts';\n\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withStateRestore } from '@/fn-options/withStateRestore.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\n// @__NO_SIDE_EFFECTS__\nexport function buttonOptions<S>(storageName: string, trackedClickEvent: EventName) {\n  return {\n    ...fn.pipe(\n      sharedFeatureOptions(),\n      withPostEvent,\n      withVersion,\n      withStateRestore<S>(storageName),\n    ),\n    onClick(listener: VoidFunction, once?: boolean): VoidFunction {\n      return on(trackedClickEvent, listener, once);\n    },\n    offClick(listener: VoidFunction, once?: boolean): void {\n      off(trackedClickEvent, listener, once);\n    },\n  };\n}\n","import { BackButton } from '@/features/BackButton/BackButton.js';\nimport { buttonOptions } from '@/fn-options/buttonOptions.js';\n\nexport const backButton = /* @__PURE__*/ new BackButton(\n  buttonOptions('backButton', 'back_button_pressed'),\n);\n","import { batch, computed, signal } from '@tma.js/signals';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport { access } from '@/helpers/access.js';\nimport type { AsyncOptions, MaybeAccessor } from '@/types.js';\n\nexport interface AsyncMountableOptions<S, E> {\n  /**\n   * A function to retrieve the initial state.\n   * @param options - additional options.\n   */\n  initialState: (options?: AsyncOptions) => TE.TaskEither<E, S>;\n  /**\n   * @returns True if the current page was reloaded.\n   */\n  isPageReload: MaybeAccessor<boolean>;\n  /**\n   * A function to call whenever the component was mounted.\n   * @param state - restored state.\n   */\n  onMounted?: (state: S) => void;\n  /**\n   * A function to call whenever the component was unmounted.\n   */\n  onUnmounted?: VoidFunction;\n  /**\n   * Attempts to restore previously saved component state. This function\n   * will only be called if the current page was reloaded.\n   */\n  restoreState: () => (S | undefined);\n}\n\nexport class AsyncMountable<S extends object, E> {\n  constructor({\n    initialState,\n    onMounted,\n    restoreState,\n    onUnmounted,\n    isPageReload,\n  }: AsyncMountableOptions<S, E>) {\n    this.mount = options => {\n      if (this._isMounted()) {\n        return TE.right(undefined);\n      }\n      const restored = access(isPageReload) ? restoreState() : undefined;\n      return fn.pipe(\n        restored ? TE.right(restored) : initialState(options),\n        TE.map(state => {\n          // The user could call mount several times in a row while the\n          // component was still mounting. We should prevent calling the\n          // same hooks several times in this case.\n          if (!this._isMounted()) {\n            batch(() => {\n              this._isMounted.set(true);\n              onMounted?.(state);\n            });\n          }\n        }),\n      );\n    };\n\n    this.unmount = () => {\n      if (this._isMounted()) {\n        batch(() => {\n          this._isMounted.set(false);\n          onUnmounted?.();\n        });\n      }\n    };\n  }\n\n  private readonly _isMounted = signal(false);\n\n  /**\n   * Signal indicating if the component is mounted.\n   */\n  readonly isMounted = computed(this._isMounted);\n\n  /**\n   * Mounts the component restoring its state and calling required side effects.\n   * @param options - additional execution options.\n   */\n  readonly mount: (options?: AsyncOptions) => TE.TaskEither<E, void>;\n\n  /**\n   * Unmounts the component.\n   */\n  readonly unmount: () => void;\n}\n","import type {\n  RequestError,\n  PostEventError,\n  EventPayload,\n  BiometryAuthRequestStatus,\n  EventListener,\n  BiometryTokenUpdateStatus,\n} from '@tma.js/bridge';\nimport type { Computed } from '@tma.js/signals';\nimport { BetterPromise } from 'better-promises';\nimport { either as E, taskEither as TE, function as fn } from 'fp-ts';\n\nimport { AsyncMountable } from '@/composables/AsyncMountable.js';\nimport { Stateful } from '@/composables/Stateful.js';\nimport { NotAvailableError } from '@/errors.js';\nimport type {\n  BiometryAuthenticateOptions, BiometryOptions,\n  BiometryRequestAccessOptions,\n  BiometryState,\n  BiometryUpdateTokenOptions,\n} from '@/features/Biometry/types.js';\nimport { createIsSupportedSignal } from '@/helpers/createIsSupportedSignal.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { createWithChecksFp, WithChecks, WithChecksFp } from '@/with-checks/withChecksFp.js';\n\ntype BiometryTask<T> = TE.TaskEither<RequestError, T>;\n\ninterface AuthenticateResult {\n  /**\n   * Authentication status.\n   */\n  status: BiometryAuthRequestStatus;\n  /**\n   * Token from the local secure storage saved previously.\n   */\n  token?: string;\n}\n\nfunction createNotAvailableError() {\n  return new NotAvailableError('Biometry is not available');\n}\n\nfunction eventToState(event: EventPayload<'biometry_info_received'>): BiometryState {\n  let available = false;\n  let tokenSaved = false;\n  let deviceId = '';\n  let accessRequested = false;\n  let type = '';\n  let accessGranted = false;\n  if (event.available) {\n    available = true;\n    tokenSaved = event.token_saved;\n    deviceId = event.device_id;\n    accessRequested = event.access_requested;\n    type = event.type;\n    accessGranted = event.access_granted;\n  }\n  return { available, tokenSaved, deviceId, type, accessGranted, accessRequested };\n}\n\n/**\n * @since Mini Apps v7.2\n */\nexport class Biometry {\n  constructor({\n    version,\n    request,\n    postEvent,\n    storage,\n    onInfoReceived,\n    offInfoReceived,\n    isTma,\n    isPageReload,\n  }: BiometryOptions) {\n    const listener: EventListener<'biometry_info_received'> = event => {\n      stateful.setState(eventToState(event));\n    };\n\n    const stateful = new Stateful<BiometryState>({\n      initialState: {\n        available: false,\n        type: 'unknown',\n        accessGranted: false,\n        accessRequested: false,\n        deviceId: '',\n        tokenSaved: false,\n      },\n      onChange: storage.set,\n    });\n    const mountable = new AsyncMountable({\n      initialState(options) {\n        return fn.pipe(\n          request('web_app_biometry_get_info', 'biometry_info_received', options),\n          TE.map(eventToState),\n        );\n      },\n      isPageReload,\n      onMounted(state) {\n        stateful.setState(state);\n        onInfoReceived(listener);\n      },\n      onUnmounted() {\n        offInfoReceived(listener);\n      },\n      restoreState: storage.get,\n    });\n\n    const wrapOptions = { version, requires: 'web_app_biometry_request_auth', isTma } as const;\n    const wrapSupportedEither = createWithChecksFp({\n      ...wrapOptions,\n      returns: 'either',\n    });\n    const wrapSupportedTask = createWithChecksFp({\n      ...wrapOptions,\n      returns: 'task',\n    });\n    const wrapMountedTask = createWithChecksFp({\n      ...wrapOptions,\n      isMounted: mountable.isMounted,\n      returns: 'task',\n    });\n\n    this.isAvailable = stateful.getter('available');\n    this.isMounted = mountable.isMounted;\n    this.isSupported = createIsSupportedSignal('web_app_biometry_request_auth', version);\n    this.state = stateful.state;\n    this.unmount = mountable.unmount;\n    this.mountFp = wrapSupportedTask(mountable.mount);\n\n    this.authenticateFp = wrapMountedTask(options => {\n      return !this.isAvailable()\n        ? TE.left(createNotAvailableError())\n        : fn.pipe(\n          request('web_app_biometry_request_auth', 'biometry_auth_requested', {\n            ...options,\n            params: { reason: ((options || {}).reason || '').trim() },\n          }),\n          TE.map(response => {\n            stateful.setState({ token: response.token });\n            return response;\n          }),\n        );\n    });\n\n    this.openSettingsFp = wrapSupportedEither(() => postEvent('web_app_biometry_open_settings'));\n\n    this.requestAccessFp = wrapMountedTask(options => {\n      return fn.pipe(\n        request('web_app_biometry_request_access', 'biometry_info_received', {\n          ...options,\n          params: { reason: ((options || {}).reason || '').trim() },\n        }),\n        TE.chain(response => {\n          const state = eventToState(response);\n          if (!state.available) {\n            return TE.left(createNotAvailableError());\n          }\n          stateful.setState(state);\n          return TE.right(state.accessRequested);\n        }),\n      );\n    });\n\n    this.updateTokenFp = wrapMountedTask((options = {}) => {\n      return fn.pipe(\n        request('web_app_biometry_update_token', 'biometry_token_updated', {\n          ...options,\n          params: { token: options.token || '', reason: options.reason?.trim() },\n        }),\n        TE.map(response => response.status),\n      );\n    });\n\n    this.authenticate = throwifyWithChecksFp(this.authenticateFp);\n    this.openSettings = throwifyWithChecksFp(this.openSettingsFp);\n    this.requestAccess = throwifyWithChecksFp(this.requestAccessFp);\n    this.updateToken = throwifyWithChecksFp(this.updateTokenFp);\n    this.mount = throwifyWithChecksFp(this.mountFp);\n  }\n\n  /**\n   * Signal indicating if biometry is available.\n   */\n  readonly isAvailable: Computed<boolean>;\n\n  /**\n   * Signal indicating if the component is supported.\n   */\n  readonly isSupported: Computed<boolean>;\n\n  /**\n   * Signal indicating if the component is mounted.\n   */\n  readonly isMounted: Computed<boolean>;\n\n  /**\n   * Complete component state.\n   */\n  readonly state: Computed<BiometryState>;\n\n  /**\n   * Attempts to authenticate a user using biometrics and fetch a previously stored secure token.\n   * @param options - method options.\n   * @since Mini Apps v7.2\n   * @returns Token from the local secure storage saved previously or undefined.\n   * @example\n   * const { status, token } = await biometry.authenticate({\n   *   reason: 'Authenticate to open wallet',\n   * });\n   */\n  readonly authenticateFp: WithChecksFp<(options?: BiometryAuthenticateOptions) => BiometryTask<{\n    /**\n     * Authentication status.\n     */\n    status: BiometryAuthRequestStatus;\n    /**\n     * Token from the local secure storage saved previously.\n     */\n    token?: string;\n  }>, true>;\n\n  /**\n   * @see authenticateFp\n   */\n  readonly authenticate: WithChecks<\n    (options?: BiometryAuthenticateOptions) => BetterPromise<AuthenticateResult>,\n    true\n  >;\n\n  /**\n   * Opens the biometric access settings for bots. Useful when you need to request biometrics\n   * access to users who haven't granted it yet.\n   *\n   * _Note that this method can be called only in response to user interaction with the Mini App\n   * interface (e.g. a click inside the Mini App or on the main button)_.\n   * @since Mini Apps v7.2\n   */\n  readonly openSettingsFp: WithChecksFp<() => E.Either<PostEventError, void>, true>;\n\n  /**\n   * @see openSettingsFp\n   */\n  readonly openSettings: WithChecks<() => void, true>;\n\n  /**\n   * Requests permission to use biometrics.\n   * @since Mini Apps v7.2\n   * @returns Promise with true, if access was granted.\n   * @example\n   * const accessGranted = await biometry.requestAccess({\n   *   reason: 'Authenticate to open wallet',\n   * });\n   */\n  readonly requestAccessFp: WithChecksFp<\n    (options?: BiometryRequestAccessOptions) => BiometryTask<boolean>,\n    true\n  >;\n\n  /**\n   * @see requestAccessFp\n   */\n  readonly requestAccess: WithChecks<\n    (options?: BiometryRequestAccessOptions) => BetterPromise<boolean>,\n    true\n  >;\n\n  /**\n   * Updates the biometric token in a secure storage on the device.\n   * @since Mini Apps v7.2\n   * @returns Promise with `true`, if token was updated.\n   * @example Setting a new token\n   * biometry.updateToken({\n   *   token: 'abcdef',\n   * })\n   * @example Deleting the token\n   * biometry.updateToken();\n   */\n  readonly updateTokenFp: WithChecksFp<\n    (options?: BiometryUpdateTokenOptions) => BiometryTask<BiometryTokenUpdateStatus>,\n    true\n  >;\n\n  /**\n   * @see updateTokenFp\n   */\n  readonly updateToken: WithChecks<\n    (options?: BiometryUpdateTokenOptions) => BetterPromise<BiometryTokenUpdateStatus>,\n    true\n  >;\n\n  /**\n   * Mounts the component restoring its state.\n   * @since Mini Apps v7.2\n   */\n  readonly mountFp: WithChecksFp<(options?: AsyncOptions) => BiometryTask<void>, true>;\n\n  /**\n   * @see mountFp\n   */\n  readonly mount: WithChecks<(options?: AsyncOptions) => BetterPromise<void>, true>;\n\n  /**\n   * Unmounts the component.\n   */\n  readonly unmount: () => void;\n}\n","import {\n  requestFp as _requestFp,\n  request2Fp as _request2Fp,\n  type RequestFpFn,\n  type RequestFn,\n  type Request2FpFn,\n  type Request2Fn,\n} from '@tma.js/bridge';\nimport { throwifyFpFn } from '@tma.js/toolkit';\n\nimport { postEventFp } from '@/globals/postEvent.js';\n\n/**\n * @deprecated To be removed in the next major update. Use `request2fp` instead, it provides\n * a proper way of handling multiple events.\n */\nexport const requestFp: RequestFpFn = (method: any, events: any, options: any) => {\n  return _requestFp(method, events, {\n    postEvent: postEventFp,\n    ...options,\n  });\n};\n\nexport const request2Fp: Request2FpFn = (method: any, events: any, options: any) => {\n  return _request2Fp(method, events, {\n    postEvent: postEventFp,\n    ...options,\n  });\n};\n\n/**\n * @deprecated To be removed in the next major update. Use `request` instead, it provides\n * a proper way of handling multiple events.\n */\nexport const request = throwifyFpFn(requestFp) as RequestFn;\n\nexport const request2 = throwifyFpFn(request2Fp) as Request2Fn;\n","import type { Request2FpFn } from '@tma.js/bridge';\n\nimport { createFnOption } from '@/fn-options/createFnOption.js';\nimport { request2Fp } from '@/globals/request.js';\n\nexport interface WithRequest {\n  /**\n   * A request function to use to call Mini Apps methods.\n   */\n  request: Request2FpFn;\n}\n\nexport const withRequest = createFnOption<WithRequest>({ request: request2Fp });\n","import { on, off } from '@tma.js/bridge';\nimport { function as fn } from 'fp-ts';\n\nimport { Biometry } from '@/features/Biometry/Biometry.js';\nimport type { BiometryState } from '@/features/Biometry/types.js';\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withRequest } from '@/fn-options/withRequest.js';\nimport { withStateRestore } from '@/fn-options/withStateRestore.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\nfunction instantiate() {\n  return new Biometry({\n    ...fn.pipe(\n      sharedFeatureOptions(),\n      withPostEvent,\n      withVersion,\n      withRequest,\n      withStateRestore<BiometryState>('biometry'),\n    ),\n    offInfoReceived(listener) {\n      off('biometry_info_received', listener);\n    },\n    onInfoReceived(listener) {\n      return on('biometry_info_received', listener);\n    },\n  });\n}\n\nexport const biometry = /* @__PURE__*/ instantiate();\n","import type { PostEventError } from '@tma.js/bridge';\nimport type { Computed } from '@tma.js/signals';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport { Mountable } from '@/composables/Mountable.js';\nimport { Stateful } from '@/composables/Stateful.js';\nimport type { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport type { WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport type { WithStateRestore } from '@/fn-options/withStateRestore.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport {\n  createWithChecksFp,\n  type WithChecks,\n  type WithChecksFp,\n} from '@/with-checks/withChecksFp.js';\n\nexport interface ClosingBehaviorState {\n  isConfirmationEnabled: boolean;\n}\n\nexport interface ClosingBehaviorOptions\n  extends WithStateRestore<ClosingBehaviorState>,\n  WithPostEvent,\n  SharedFeatureOptions {\n}\n\nexport class ClosingBehavior {\n  constructor({ postEvent, storage, isTma, isPageReload }: ClosingBehaviorOptions) {\n    const stateful = new Stateful({\n      initialState: { isConfirmationEnabled: false },\n      onChange(state) {\n        storage.set(state);\n      },\n    });\n    const mountable = new Mountable({\n      onMounted: stateful.setState,\n      restoreState: storage.get,\n      initialState: { isConfirmationEnabled: false },\n      isPageReload,\n    });\n\n    const wrapOptions = { requires: 'web_app_setup_closing_behavior', isTma } as const;\n    const wrapSupportedPlain = createWithChecksFp({\n      ...wrapOptions,\n      returns: 'plain',\n    });\n    const wrapMountedEither = createWithChecksFp({\n      ...wrapOptions,\n      returns: 'either',\n      isMounted: mountable.isMounted,\n    });\n\n    const setClosingConfirmation = (isConfirmationEnabled: boolean) => {\n      if (isConfirmationEnabled === this.isConfirmationEnabled()) {\n        return E.right(undefined);\n      }\n      stateful.setState({ isConfirmationEnabled });\n      return postEvent('web_app_setup_closing_behavior', {\n        need_confirmation: isConfirmationEnabled,\n      });\n    };\n\n    this.isConfirmationEnabled = stateful.getter('isConfirmationEnabled');\n    this.isMounted = mountable.isMounted;\n\n    this.disableConfirmationFp = wrapMountedEither(() => {\n      return setClosingConfirmation(false);\n    });\n    this.enableConfirmationFp = wrapMountedEither(() => {\n      return setClosingConfirmation(true);\n    });\n    this.mountFp = wrapSupportedPlain(() => {\n      const nothing = () => undefined;\n      return fn.pipe(mountable.mount(), E.match(nothing, nothing));\n    });\n    this.unmount = mountable.unmount;\n\n    this.disableConfirmation = throwifyWithChecksFp(this.disableConfirmationFp);\n    this.enableConfirmation = throwifyWithChecksFp(this.enableConfirmationFp);\n    this.mount = throwifyWithChecksFp(this.mountFp);\n  }\n\n  /**\n   * Signal indicating if closing confirmation dialog is currently enabled.\n   */\n  readonly isConfirmationEnabled: Computed<boolean>;\n\n  /**\n   * Signal indicating if the component is currently mounted.\n   */\n  readonly isMounted: Computed<boolean>;\n\n  /**\n   * Mounts the component restoring its state.\n   */\n  readonly mountFp: WithChecksFp<() => void, false>;\n\n  /**\n   * @see mountFp\n   */\n  readonly mount: WithChecks<() => void, false>;\n\n  /**\n   * Unmounts the component.\n   */\n  readonly unmount: () => void;\n\n  /**\n   * Disables the closing confirmation dialog.\n   */\n  readonly disableConfirmationFp: WithChecksFp<() => E.Either<PostEventError, void>, false>;\n\n  /**\n   * @see disableConfirmationFp\n   */\n  readonly disableConfirmation: WithChecks<() => void, false>;\n\n  /**\n   * Enables the closing confirmation dialog.\n   */\n  readonly enableConfirmationFp: WithChecksFp<() => E.Either<PostEventError, void>, false>;\n\n  /**\n   * @see enableConfirmationFp\n   */\n  readonly enableConfirmation: WithChecks<() => void, false>;\n}\n","import { function as fn } from 'fp-ts';\n\nimport {\n  ClosingBehavior,\n  type ClosingBehaviorState,\n} from '@/features/ClosingBehavior/ClosingBehavior.js';\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withStateRestore } from '@/fn-options/withStateRestore.js';\n\nfunction instantiate() {\n  return new ClosingBehavior(fn.pipe(\n    sharedFeatureOptions(),\n    withStateRestore<ClosingBehaviorState>('closingBehavior'),\n    withPostEvent,\n  ));\n}\n\nexport const closingBehavior = /* @__PURE__*/ instantiate();\n","import type { InvokeCustomMethodFpOptions, RequestError } from '@tma.js/bridge';\nimport type { Computed } from '@tma.js/signals';\nimport { BetterPromise } from 'better-promises';\nimport { taskEither as TE, function as fn } from 'fp-ts';\nimport { array, parse, record, string } from 'valibot';\n\nimport type { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport type { WithInvokeCustomMethod } from '@/fn-options/withInvokeCustomMethod.js';\nimport type { WithVersion } from '@/fn-options/withVersion.js';\nimport { createIsSupportedSignal } from '@/helpers/createIsSupportedSignal.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { createWithChecksFp, type WithChecks, type WithChecksFp } from '@/with-checks/withChecksFp.js';\n\ntype CloudStorageTask<T> = TE.TaskEither<RequestError, T>;\n\nexport interface CloudStorageOptions extends WithVersion,\n  WithInvokeCustomMethod,\n  SharedFeatureOptions {\n}\n\n/**\n * @since Mini Apps v6.9\n */\nexport class CloudStorage {\n  constructor({ version, isTma, invokeCustomMethod }: CloudStorageOptions) {\n    const wrapSupportedTask = createWithChecksFp({\n      version,\n      requires: 'web_app_invoke_custom_method',\n      isTma,\n      returns: 'task',\n    });\n\n    this.isSupported = createIsSupportedSignal('web_app_invoke_custom_method', version);\n    this.deleteItemFp = wrapSupportedTask((keyOrKeys, options) => {\n      const keys = Array.isArray(keyOrKeys) ? keyOrKeys : [keyOrKeys];\n      return fn.pipe(\n        keys.length\n          ? invokeCustomMethod('deleteStorageValues', { keys }, options)\n          : TE.right(undefined),\n        TE.map(() => undefined),\n      );\n    });\n    this.getItemFp = wrapSupportedTask((key, options) => {\n      return fn.pipe(\n        this.getItemsFp([key], options),\n        TE.map(values => values[key] || ''),\n      );\n    });\n    this.getItemsFp = wrapSupportedTask((keys, options) => {\n      return fn.pipe(\n        keys.length ? invokeCustomMethod('getStorageValues', { keys }, options) : TE.right({}),\n        TE.map(data => {\n          return {\n            // Fulfill the response with probably missing keys.\n            ...keys.reduce<Record<string, string>>((acc, key) => {\n              acc[key] = '';\n              return acc;\n            }, {}),\n            ...parse(record(string(), string()), data),\n          };\n        }),\n      );\n    });\n    this.getKeysFp = wrapSupportedTask(options => {\n      return fn.pipe(\n        invokeCustomMethod('getStorageKeys', {}, options),\n        TE.map(data => parse(array(string()), data)),\n      );\n    });\n    this.setItemFp = wrapSupportedTask((key, value, options) => {\n      return fn.pipe(\n        invokeCustomMethod('saveStorageValue', { key, value }, options),\n        TE.map(() => undefined),\n      );\n    });\n    this.clearFp = wrapSupportedTask(options => {\n      return fn.pipe(this.getKeysFp(options), TE.chain(this.deleteItemFp));\n    });\n\n    this.deleteItem = throwifyWithChecksFp(this.deleteItemFp);\n    this.getItem = throwifyWithChecksFp(this.getItemFp);\n    this.getItems = throwifyWithChecksFp(this.getItemsFp);\n    this.getKeys = throwifyWithChecksFp(this.getKeysFp);\n    this.setItem = throwifyWithChecksFp(this.setItemFp);\n    this.clear = throwifyWithChecksFp(this.clearFp);\n  }\n\n  /**\n   * Signal indicating if the component is supported.\n   */\n  readonly isSupported: Computed<boolean>;\n\n  /**\n   * Deletes specified key or keys from the cloud storage.\n   * @param keyOrKeys - key or keys to delete.\n   * @param options - request execution options.\n   * @since Mini Apps v6.9\n   */\n  readonly deleteItemFp: WithChecksFp<\n    (keyOrKeys: string | string[], options?: InvokeCustomMethodFpOptions) => CloudStorageTask<void>,\n    true\n  >;\n\n  readonly deleteItem: WithChecks<\n    (keyOrKeys: string | string[], options?: InvokeCustomMethodFpOptions) => BetterPromise<void>,\n    true\n  >;\n\n  /**\n   * Gets a single key value from the cloud storage.\n   * @param key - a key to get.\n   * @param options - request execution options.\n   * @returns A key value as a string.\n   * @since Mini Apps v6.9\n   */\n  readonly getItemFp: WithChecksFp<\n    (key: string, options?: InvokeCustomMethodFpOptions) => CloudStorageTask<string>,\n    true\n  >;\n\n  /**\n   * @see getItemFp\n   */\n  readonly getItem: WithChecks<{\n    <K extends string>(\n      keys: K[],\n      options?: InvokeCustomMethodFpOptions,\n    ): BetterPromise<Record<K, string>>;\n    (key: string, options?: InvokeCustomMethodFpOptions): BetterPromise<string>;\n  }, true>;\n\n  /**\n   * Gets multiple keys' values from the cloud storage.\n   * @param keys - keys list.\n   * @param options - request execution options.\n   * @returns A map, where a key is one of the specified in the `keys` argument,\n   * and a value is a corresponding storage value if an array of keys was passed.\n   * @since Mini Apps v6.9\n   */\n  readonly getItemsFp: WithChecksFp<\n    <K extends string>(\n      keys: K[],\n      options?: InvokeCustomMethodFpOptions,\n    ) => CloudStorageTask<Record<K, string>>,\n    true\n  >;\n\n  /**\n   * @see getItemsFp\n   */\n  readonly getItems: WithChecks<\n    <K extends string>(\n      keys: K[],\n      options?: InvokeCustomMethodFpOptions,\n    ) => BetterPromise<Record<K, string>>,\n    true\n  >;\n\n  /**\n   * Returns a list of all keys presented in the cloud storage.\n   * @param options - request execution options.\n   * @since Mini Apps v6.9\n   */\n  readonly getKeysFp: WithChecksFp<\n    (options?: InvokeCustomMethodFpOptions) => CloudStorageTask<string[]>,\n    true\n  >;\n\n  /**\n   * @see getKeysFp\n   */\n  readonly getKeys: WithChecks<\n    (options?: InvokeCustomMethodFpOptions) => BetterPromise<string[]>,\n    true\n  >;\n\n  /**\n   * Saves the specified value by a key.\n   * @param key - storage key.\n   * @param value - storage value.\n   * @param options - request execution options.\n   * @since Mini Apps v6.9\n   */\n  readonly setItemFp: WithChecksFp<\n    (key: string, value: string, options?: InvokeCustomMethodFpOptions) => CloudStorageTask<void>,\n    true\n  >;\n\n  /**\n   * @see setItemFp\n   */\n  readonly setItem: WithChecks<\n    (key: string, value: string, options?: InvokeCustomMethodFpOptions) => BetterPromise<void>,\n    true\n  >;\n\n  /**\n   * Clears the cloud storage.\n   * @param options - additional options.\n   * @since Mini Apps v6.9\n   */\n  readonly clearFp: WithChecksFp<\n    (options?: InvokeCustomMethodFpOptions) => CloudStorageTask<void>,\n    true\n  >;\n\n  /**\n   * @see clearFp\n   */\n  readonly clear: WithChecks<(options?: InvokeCustomMethodFpOptions) => BetterPromise<void>, true>;\n}\n","import { createSignal } from '@/globals/signals-registry.js';\n\nconst lastRequestId = createSignal(0);\n\n/**\n * @returns A new request identifier.\n */\nexport function createRequestId(): string {\n  lastRequestId.set(lastRequestId() + 1);\n  return lastRequestId().toString();\n}\n","import {\n  type RequestError,\n  type CustomMethodName,\n  type CustomMethodParams,\n  type InvokeCustomMethodOptions,\n  invokeCustomMethodFp,\n} from '@tma.js/bridge';\nimport { taskEither as TE } from 'fp-ts';\n\nimport { createRequestId } from '@/globals/createRequestId.js';\nimport { postEventFp } from '@/globals/postEvent.js';\n\n/**\n * Invokes known custom method. Returns method execution result.\n * @param method - method name.\n * @param params - method parameters.\n * @param options - additional options.\n */\nexport function invokeCustomMethod<M extends CustomMethodName>(\n  method: M,\n  params: CustomMethodParams<M>,\n  options?: InvokeCustomMethodOptions,\n): TE.TaskEither<RequestError, unknown>;\n\n/**\n * Invokes unknown custom method. Returns method execution result.\n * @param method - method name.\n * @param params - method parameters.\n * @param options - additional options.\n */\nexport function invokeCustomMethod(\n  method: string,\n  params: object,\n  options?: InvokeCustomMethodOptions,\n): TE.TaskEither<RequestError, unknown>;\n\nexport function invokeCustomMethod(\n  method: string,\n  params: object,\n  options?: InvokeCustomMethodOptions,\n): TE.TaskEither<RequestError, unknown> {\n  return invokeCustomMethodFp(method, params, createRequestId(), {\n    ...options || {},\n    postEvent: postEventFp,\n  });\n}\n","import type {\n  CustomMethodParams,\n  CustomMethodName,\n  InvokeCustomMethodError,\n  InvokeCustomMethodFpOptions,\n  RequestError,\n} from '@tma.js/bridge';\nimport type * as TE from 'fp-ts/TaskEither';\n\nimport { createFnOption } from '@/fn-options/createFnOption.js';\nimport { invokeCustomMethod } from '@/globals/invokeCustomMethod.js';\n\nexport type { InvokeCustomMethodError };\n\nexport interface InvokeCustomMethodNoRequestIdFn {\n  <M extends CustomMethodName>(\n    this: void,\n    method: M,\n    params: CustomMethodParams<M>,\n    options?: InvokeCustomMethodFpOptions,\n  ): TE.TaskEither<InvokeCustomMethodError, unknown>;\n\n  (\n    this: void,\n    method: string,\n    params: object,\n    options?: InvokeCustomMethodFpOptions,\n  ): TE.TaskEither<RequestError, unknown>;\n}\n\nexport interface WithInvokeCustomMethod {\n  invokeCustomMethod: InvokeCustomMethodNoRequestIdFn;\n}\n\nexport const withInvokeCustomMethod = createFnOption<WithInvokeCustomMethod>({\n  invokeCustomMethod,\n});\n","import { function as fn } from 'fp-ts';\n\nimport { CloudStorage } from '@/features/CloudStorage/CloudStorage.js';\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withInvokeCustomMethod } from '@/fn-options/withInvokeCustomMethod.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\nfunction instantiate() {\n  return new CloudStorage(fn.pipe(\n    sharedFeatureOptions(),\n    withVersion,\n    withInvokeCustomMethod,\n  ));\n}\n\nexport const cloudStorage = /* @__PURE__*/ instantiate();\n","import { EventPayload, type MethodParams, type Request2CaptureFn, RequestError } from '@tma.js/bridge';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport { DeviceStorageMethodError } from '@/errors.js';\nimport type { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport type { WithCreateRequestId } from '@/fn-options/withCreateRequestId.js';\nimport type { WithRequest } from '@/fn-options/withRequest.js';\nimport type { WithVersion } from '@/fn-options/withVersion.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport {\n  createWithChecksFp,\n  type WithChecks,\n  type WithChecksFp,\n} from '@/with-checks/withChecksFp.js';\n\nexport type DeviceStorageError = RequestError | DeviceStorageMethodError;\n\nexport interface DeviceStorageOptions extends SharedFeatureOptions,\n  WithVersion,\n  WithRequest,\n  WithCreateRequestId {\n}\n\n/**\n * @since Mini Apps v9.0\n */\nexport class DeviceStorage {\n  constructor({ isTma, request, version, createRequestId }: DeviceStorageOptions) {\n    const wrapSupportedTask = createWithChecksFp({\n      version,\n      requires: 'web_app_device_storage_get_key',\n      isTma,\n      returns: 'task',\n    });\n\n    const invokeMethod = <\n      M extends (\n        | 'web_app_device_storage_save_key'\n        | 'web_app_device_storage_get_key'\n        | 'web_app_device_storage_save_key'\n        | 'web_app_device_storage_clear'\n      ),\n      E extends (\n        | 'device_storage_key_saved'\n        | 'device_storage_key_received'\n        | 'device_storage_cleared'\n      ),\n    >(\n      method: M,\n      event: E,\n      params: Omit<MethodParams<M>, 'req_id'>,\n    ): TE.TaskEither<DeviceStorageError, EventPayload<E>> => {\n      const requestId = createRequestId();\n      return fn.pipe(\n        request<M, ('device_storage_failed' | E)[]>(method, ['device_storage_failed', event], {\n          params: { ...params, req_id: requestId },\n          capture: (event => {\n            return 'payload' in event ? event.payload.req_id === requestId : true;\n          }) as Request2CaptureFn<('device_storage_failed' | E)[]>,\n        }),\n        TE.chain(response => (\n          response.event === 'device_storage_failed'\n            ? TE.left(new DeviceStorageMethodError(response.payload.error || 'UNKNOWN_ERROR'))\n            : TE.right(response.payload as EventPayload<E>)\n        )),\n      );\n    };\n\n    this.getItemFp = wrapSupportedTask(key => {\n      return fn.pipe(\n        invokeMethod('web_app_device_storage_get_key', 'device_storage_key_received', { key }),\n        TE.map(payload => payload.value),\n      );\n    });\n    this.setItemFp = wrapSupportedTask((key, value) => {\n      return fn.pipe(\n        invokeMethod('web_app_device_storage_save_key', 'device_storage_key_saved', { key, value }),\n        TE.map(() => undefined),\n      );\n    });\n    this.deleteItemFp = wrapSupportedTask(key => {\n      return this.setItemFp(key, null);\n    });\n    this.clearFp = wrapSupportedTask(() => {\n      return fn.pipe(\n        invokeMethod('web_app_device_storage_clear', 'device_storage_cleared', {}),\n        TE.map(() => undefined),\n      );\n    });\n\n    this.getItem = throwifyWithChecksFp(this.getItemFp);\n    this.setItem = throwifyWithChecksFp(this.setItemFp);\n    this.deleteItem = throwifyWithChecksFp(this.deleteItemFp);\n    this.clear = throwifyWithChecksFp(this.clearFp);\n  }\n\n  /**\n    * Retrieves an item using its key.\n    * @since Mini Apps v9.0\n    */\n  readonly getItemFp: WithChecksFp<\n    (key: string) => TE.TaskEither<DeviceStorageError, string | null>,\n    true\n  >;\n\n  /**\n   * @see getItemFp\n   */\n  readonly getItem: WithChecks<(key: string) => Promise<string | null>, true>;\n\n  /**\n    * Sets a new item in the storage.\n    * @since Mini Apps v9.0\n    */\n  readonly setItemFp: WithChecksFp<\n    (key: string, value: string | null) => TE.TaskEither<DeviceStorageError, void>,\n    true\n  >;\n\n  /**\n   * @see setItemFp\n   */\n  readonly setItem: WithChecks<(key: string, value: string | null) => Promise<void>, true>;\n\n  /**\n    * Removes a key from the storage.\n    * @since Mini Apps v9.0\n    */\n  readonly deleteItemFp: WithChecksFp<\n    (key: string) => TE.TaskEither<DeviceStorageError, void>,\n    true\n  >;\n\n  /**\n   * @see deleteItemFp\n   */\n  readonly deleteItem: WithChecks<(key: string) => Promise<void>, true>;\n\n  /**\n    * Removes all keys from the storage.\n    * @since Mini Apps v9.0\n    */\n  readonly clearFp: WithChecksFp<() => TE.TaskEither<DeviceStorageError, void>, true>;\n\n  /**\n   * @see clearFp\n   */\n  readonly clear: WithChecks<() => Promise<void>, true>;\n}\n","import { createFnOption } from '@/fn-options/createFnOption.js';\nimport { createRequestId } from '@/globals/createRequestId.js';\n\nexport interface WithCreateRequestId {\n  /**\n   * A function generating a request identifier.\n   */\n  createRequestId: () => string;\n}\n\nexport const withCreateRequestId = createFnOption<WithCreateRequestId>({ createRequestId });\n","import { function as fn } from 'fp-ts';\n\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withCreateRequestId } from '@/fn-options/withCreateRequestId.js';\nimport { withRequest } from '@/fn-options/withRequest.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\nimport { DeviceStorage } from './DeviceStorage.js';\n\nfunction instantiate() {\n  return new DeviceStorage(fn.pipe(\n    sharedFeatureOptions(),\n    withVersion,\n    withRequest,\n    withCreateRequestId,\n  ));\n}\n\nexport const deviceStorage = /* @__PURE__*/ instantiate();\n","import type { EmojiStatusAccessRequestedStatus, RequestError } from '@tma.js/bridge';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport {\n  sharedFeatureOptions,\n  type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withRequest, type WithRequest } from '@/fn-options/withRequest.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithVersion, WithRequest {\n}\n\nfunction create({ request, ...rest }: CreateOptions) {\n  return withChecksFp((\n    options: AsyncOptions,\n  ): TE.TaskEither<RequestError, EmojiStatusAccessRequestedStatus> => {\n    return fn.pipe(\n      request('web_app_request_emoji_status_access', 'emoji_status_access_requested', options),\n      TE.map(response => response.status),\n    );\n  }, { ...rest, requires: 'web_app_request_emoji_status_access', returns: 'task' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n  return create(fn.pipe(\n    sharedFeatureOptions(),\n    withVersion,\n    withRequest,\n  ));\n}\n\n/**\n * Shows a native popup requesting permission for the bot to manage user's emoji status.\n * @param options - additional options.\n * @returns Emoji status access status.\n * @since Mini Apps v8.0\n * @example\n * const status = await requestEmojiStatusAccess();\n */\nexport const requestEmojiStatusAccessFp = instantiate();\n\n/**\n * @see requestEmojiStatusAccessFp\n */\nexport const requestEmojiStatusAccess = throwifyWithChecksFp(requestEmojiStatusAccessFp);\n","import { RequestError } from '@tma.js/bridge';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport { SetEmojiStatusError } from '@/errors.js';\nimport {\n  type SharedFeatureOptions,\n  sharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withRequest, type WithRequest } from '@/fn-options/withRequest.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\nexport interface SetEmojiStatusOptions extends AsyncOptions {\n  duration?: number;\n}\n\ninterface CreateOptions extends SharedFeatureOptions, WithRequest, WithVersion {\n}\n\nfunction create({ request, ...rest }: CreateOptions) {\n  return withChecksFp((\n    customEmojiId: string,\n    options?: SetEmojiStatusOptions,\n  ): TE.TaskEither<RequestError | SetEmojiStatusError, void> => {\n    return fn.pipe(\n      request('web_app_set_emoji_status', ['emoji_status_set', 'emoji_status_failed'], {\n        params: {\n          custom_emoji_id: customEmojiId,\n          duration: (options || {}).duration,\n        },\n        ...options,\n      }),\n      TE.chainW(response => (\n        response.event === 'emoji_status_failed'\n          ? TE.left(new SetEmojiStatusError(response.payload.error))\n          : TE.right(undefined)\n      )),\n    );\n  }, {\n    ...rest,\n    requires: 'web_app_set_emoji_status',\n    returns: 'task',\n  });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n  return create(fn.pipe(\n    sharedFeatureOptions(),\n    withRequest,\n    withVersion,\n  ));\n}\n\n/**\n * Opens a dialog allowing the user to set the specified custom emoji as their status.\n * @returns Nothing if status set was successful.\n * @param options - additional options.\n * @since Mini Apps v8.0\n * @example\n * fn.pipe(\n *   setEmojiStatusFp('5361800828313167608'),\n *   TE.match(error => {\n *     console.error('Error occurred', error);\n *   }, () => {\n *     console.log('Status set');\n *   }),\n * );\n * const statusSet = await setEmojiStatus('5361800828313167608');\n */\nexport const setEmojiStatusFp = instantiate();\n\n/**\n * @see setEmojiStatusFp\n */\nexport const setEmojiStatus = throwifyWithChecksFp(setEmojiStatusFp);\n","import type {\n  ImpactHapticFeedbackStyle,\n  NotificationHapticFeedbackType,\n  PostEventError,\n} from '@tma.js/bridge';\nimport type { Computed } from '@tma.js/signals';\nimport { either as E } from 'fp-ts';\n\nimport type { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport type { WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport type { WithVersion } from '@/fn-options/withVersion.js';\nimport { createIsSupportedSignal } from '@/helpers/createIsSupportedSignal.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { createWithChecksFp, type WithChecksFp, type WithChecks } from '@/with-checks/withChecksFp.js';\n\ntype HapticFeedbackEither = E.Either<PostEventError, void>;\n\nexport interface HapticFeedbackOptions extends WithVersion, WithPostEvent, SharedFeatureOptions {\n}\n\n/**\n * @since Mini Apps v6.1\n */\nexport class HapticFeedback {\n  constructor({ postEvent, isTma, version }: HapticFeedbackOptions) {\n    const HAPTIC_METHOD_NAME = 'web_app_trigger_haptic_feedback';\n    const wrapSupported = createWithChecksFp({\n      requires: HAPTIC_METHOD_NAME,\n      isTma,\n      version,\n      returns: 'plain',\n    });\n\n    this.isSupported = createIsSupportedSignal(HAPTIC_METHOD_NAME, version);\n    this.impactOccurredFp = wrapSupported(style => {\n      return postEvent(HAPTIC_METHOD_NAME, { type: 'impact', impact_style: style });\n    });\n    this.notificationOccurredFp = wrapSupported(type => {\n      return postEvent(HAPTIC_METHOD_NAME, { type: 'notification', notification_type: type });\n    });\n    this.selectionChangedFp = wrapSupported(() => {\n      return postEvent(HAPTIC_METHOD_NAME, { type: 'selection_change' });\n    });\n\n    this.impactOccurred = throwifyWithChecksFp(this.impactOccurredFp);\n    this.notificationOccurred = throwifyWithChecksFp(this.notificationOccurredFp);\n    this.selectionChanged = throwifyWithChecksFp(this.selectionChangedFp);\n  }\n\n  /**\n   * Signal indicating if the component is supported.\n   */\n  readonly isSupported: Computed<boolean>;\n\n  /**\n   * A method that tells if an impact occurred. The Telegram app may play the\n   * appropriate haptics based on style value passed.\n   * @param style - impact style.\n   * @since Mini Apps v6.1\n   */\n  impactOccurredFp: WithChecksFp<(style: ImpactHapticFeedbackStyle) => HapticFeedbackEither, true>;\n\n  /**\n   * @see impactOccurredFp\n   */\n  impactOccurred: WithChecks<(style: ImpactHapticFeedbackStyle) => void, true>;\n\n  /**\n   * A method tells that a task or action has succeeded, failed, or produced\n   * a warning. The Telegram app may play the appropriate haptics based on type\n   * value passed.\n   * @param type - notification type.\n   * @since Mini Apps v6.1\n   */\n  notificationOccurredFp: WithChecksFp<\n    (type: NotificationHapticFeedbackType) => HapticFeedbackEither,\n    true\n  >;\n\n  /**\n   * @see notificationOccurredFp\n   */\n  notificationOccurred: WithChecks<(type: NotificationHapticFeedbackType) => void, true>;\n\n  /**\n   * A method tells that the user has changed a selection. The Telegram app may\n   * play the appropriate haptics.\n   *\n   * Do not use this feedback when the user makes or confirms a selection; use\n   * it only when the selection changes.\n   * @since Mini Apps v6.1\n   */\n  selectionChangedFp: WithChecksFp<() => HapticFeedbackEither, true>;\n\n  /**\n   * @see selectionChangedFp\n   */\n  selectionChanged: WithChecks<() => void, true>;\n}\n","import { function as fn } from 'fp-ts';\n\nimport { HapticFeedback } from '@/features/HapticFeedback/HapticFeedback.js';\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\nfunction instantiate() {\n  return new HapticFeedback(fn.pipe(\n    sharedFeatureOptions(),\n    withPostEvent,\n    withVersion,\n  ));\n}\n\nexport const hapticFeedback = /* @__PURE__*/ instantiate();\n","import type { PostEventError } from '@tma.js/bridge';\nimport { function as fn } from 'fp-ts';\nimport type * as E from 'fp-ts/Either';\n\nimport {\n  sharedFeatureOptions,\n  type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent, type WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithPostEvent, WithVersion {\n}\n\nfunction create({ postEvent, ...rest }: CreateOptions) {\n  return withChecksFp((): E.Either<PostEventError, void> => {\n    return postEvent('web_app_add_to_home_screen');\n  }, { ...rest, requires: 'web_app_add_to_home_screen', returns: 'either' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n  return create(fn.pipe(\n    sharedFeatureOptions(),\n    withVersion,\n    withPostEvent,\n  ));\n}\n\n/**\n * Prompts the user to add the Mini App to the home screen.\n * @since Mini Apps v8.0\n */\nexport const addToHomeScreenFp = instantiate();\n\n/**\n * @see addToHomeScreenFp\n */\nexport const addToHomeScreen = throwifyWithChecksFp(addToHomeScreenFp);\n","import type { HomeScreenStatus, RequestError } from '@tma.js/bridge';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport {\n  sharedFeatureOptions,\n  type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withRequest, type WithRequest } from '@/fn-options/withRequest.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithRequest, WithVersion {\n}\n\nfunction create({ request, ...rest }: CreateOptions) {\n  return withChecksFp((options?: AsyncOptions): TE.TaskEither<RequestError, HomeScreenStatus> => {\n    return fn.pipe(\n      request('web_app_check_home_screen', 'home_screen_checked', options),\n      TE.map(response => response.status || 'unknown'),\n    );\n  }, { ...rest, requires: 'web_app_check_home_screen', returns: 'task' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n  return create(fn.pipe(\n    sharedFeatureOptions(),\n    withVersion,\n    withRequest,\n  ));\n}\n\n/**\n * Sends a request to the native Telegram application to check if the current mini\n * application is added to the device's home screen.\n * @param options - additional options.\n * @since Mini Apps v8.0\n */\nexport const checkHomeScreenStatusFp = instantiate();\n\n/**\n * @see checkHomeScreenStatusFp\n */\nexport const checkHomeScreenStatus = throwifyWithChecksFp(checkHomeScreenStatusFp);\n","import { computed, type Computed, signal } from '@tma.js/signals';\nimport { throwifyFpFn } from '@tma.js/toolkit';\nimport type { InitData as InitDataType } from '@tma.js/types';\nimport { either as E, option as O, function as fn } from 'fp-ts';\n\nexport interface InitDataOptions<Err> {\n  /**\n   * Retrieves init data from the current environment.\n   */\n  retrieveInitData: () => E.Either<Err, O.Option<{\n    raw: string;\n    obj: InitDataType;\n  }>>;\n}\n\nexport class InitData<Err extends Error> {\n  constructor({ retrieveInitData }: InitDataOptions<Err>) {\n    this.restoreFp = () => {\n      return fn.pipe(\n        retrieveInitData(),\n        E.map(O.match(() => undefined, ({ raw, obj }) => {\n          this._state.set(obj);\n          this._raw.set(raw);\n        })),\n      );\n    };\n    this.restore = throwifyFpFn(this.restoreFp);\n  }\n\n  private fromState<K extends keyof InitDataType>(key: K): Computed<InitDataType[K] | undefined> {\n    return computed(() => {\n      const s = this._state();\n      return s ? s[key] : undefined;\n    });\n  }\n\n  private readonly _state = signal<InitDataType>();\n\n  private readonly _raw = signal<string>();\n\n  /**\n   * Complete component state.\n   */\n  readonly state = computed(this._state);\n\n  /**\n   * @see InitDataType.auth_date\n   */\n  readonly authDate = this.fromState('auth_date');\n\n  /**\n   * @see InitDataType.can_send_after\n   */\n  readonly canSendAfter = this.fromState('can_send_after');\n\n  /**\n   * Date after which it is allowed to call\n   * the [answerWebAppQuery](https://core.telegram.org/bots/api#answerwebappquery) method.\n   */\n  readonly canSendAfterDate = computed(() => {\n    const authDateValue = this.authDate();\n    const canSendAfterValue = this.canSendAfter();\n\n    return canSendAfterValue && authDateValue\n      ? new Date(authDateValue.getTime() + (canSendAfterValue * 1000))\n      : undefined;\n  });\n\n  /**\n   * @see InitDataType.chat\n   */\n  readonly chat = this.fromState('chat');\n\n  /**\n   * @see InitDataType.chat_type\n   */\n  readonly chatType = this.fromState('chat_type');\n\n  /**\n   * @see InitDataType.chat_instance\n   */\n  readonly chatInstance = this.fromState('chat_instance');\n\n  /**\n   * @see InitDataType.hash\n   */\n  readonly hash = this.fromState('hash');\n\n  /**\n   * @see InitDataType.query_id\n   */\n  readonly queryId = this.fromState('query_id');\n\n  /**\n   * Raw representation of init data.\n   */\n  readonly raw = computed(this._raw);\n\n  /**\n   * @see InitDataType.receiver\n   */\n  readonly receiver = this.fromState('receiver');\n\n  /**\n   * @see InitDataType.signature\n   */\n  readonly signature = this.fromState('signature');\n\n  /**\n   * @see InitDataType.start_param\n   */\n  readonly startParam = this.fromState('start_param');\n\n  /**\n   * @see InitDataType.user\n   */\n  readonly user = this.fromState('user');\n\n  /**\n   * Restores the component state.\n   */\n  readonly restoreFp: () => E.Either<Err, void>;\n\n  /**\n   * @see restoreFp\n   */\n  readonly restore: () => void;\n}\n","import { retrieveRawInitDataFp, retrieveLaunchParamsFp } from '@tma.js/bridge';\nimport { either as E, function as fn, option as O } from 'fp-ts';\n\nimport { InitData } from '@/features/InitData/InitData.js';\n\nfunction instantiate() {\n  return new InitData({\n    retrieveInitData() {\n      return fn.pipe(\n        E.Do,\n        E.bindW('obj', () => fn.pipe(\n          retrieveLaunchParamsFp(),\n          E.map(({ tgWebAppData }) => {\n            return tgWebAppData ? O.some(tgWebAppData) : O.none;\n          }),\n        )),\n        E.bindW('raw', retrieveRawInitDataFp),\n        E.map(({ obj, raw }) => {\n          return fn.pipe(\n            O.Do,\n            O.bind('obj', () => obj),\n            O.bind('raw', () => raw),\n          );\n        }),\n      );\n    },\n  });\n}\n\nexport const initData = /* @__PURE__*/ instantiate();\n","import type { InvoiceStatus, RequestError } from '@tma.js/bridge';\nimport { computed, type Computed, signal } from '@tma.js/signals';\nimport { BetterPromise } from 'better-promises';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport { ConcurrentCallError, InvalidArgumentsError } from '@/errors.js';\nimport type { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport type { WithRequest } from '@/fn-options/withRequest.js';\nimport type { WithVersion } from '@/fn-options/withVersion.js';\nimport { createIsSupportedSignal } from '@/helpers/createIsSupportedSignal.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { createWithChecksFp, type WithChecks, type WithChecksFp } from '@/with-checks/withChecksFp.js';\n\ntype InvoiceTask<E, T> = TE.TaskEither<RequestError | ConcurrentCallError | E, T>;\n\nexport interface InvoiceOptions extends WithVersion, WithRequest, SharedFeatureOptions {\n}\n\n/**\n * @since Mini Apps v6.1\n */\nexport class Invoice {\n  constructor({ version, request, isTma }: InvoiceOptions) {\n    const wrapSupportedTask = createWithChecksFp({\n      version,\n      isTma,\n      requires: 'web_app_open_invoice',\n      returns: 'task',\n    });\n\n    const isOpened = signal(false);\n    const toggleClosed = () => {\n      isOpened.set(false);\n    };\n\n    this.isSupported = createIsSupportedSignal('web_app_open_invoice', version);\n    this.isOpened = computed(isOpened);\n    this.openSlugFp = wrapSupportedTask((slug, options) => {\n      return fn.pipe(\n        this.isOpened()\n          ? TE.left(new ConcurrentCallError('Invoice is already opened'))\n          : TE.right(undefined as never),\n        TE.chain(() => {\n          isOpened.set(true);\n          return request('web_app_open_invoice', 'invoice_closed', {\n            ...options,\n            params: { slug },\n            capture: data => slug === data.slug,\n          });\n        }),\n        TE.mapBoth(err => {\n          toggleClosed();\n          return err;\n        }, data => {\n          toggleClosed();\n          return data.status;\n        }),\n      );\n    });\n    this.openUrlFp = wrapSupportedTask((url, options) => {\n      const { hostname, pathname } = new URL(url, window.location.href);\n      if (hostname !== 't.me') {\n        return TE.left(new InvalidArgumentsError(`Link has unexpected hostname: ${hostname}`));\n      }\n\n      // Valid examples:\n      // \"/invoice/my-slug\"\n      // \"/$my-slug\"\n      const match = pathname.match(/^\\/(\\$|invoice\\/)([A-Za-z0-9\\-_=]+)$/);\n      if (!match) {\n        return TE.left(new InvalidArgumentsError(\n          'Expected to receive a link with a pathname in format \"/invoice/{slug}\" or \"/${slug}\"',\n        ));\n      }\n      return this.openSlugFp(match[2], options);\n    });\n\n    this.openUrl = throwifyWithChecksFp(this.openUrlFp);\n    this.openSlug = throwifyWithChecksFp(this.openSlugFp);\n  }\n\n  /**\n   * Signal indicating if any invoice is currently opened.\n   */\n  readonly isOpened: Computed<boolean>;\n\n  /**\n   * Signal indicating if the component is supported.\n   */\n  readonly isSupported: Computed<boolean>;\n\n  /**\n   * Opens an invoice using its slug or URL.\n   * @param slug - invoice slug.\n   * @param options - additional options.\n   * @since Mini Apps v6.1\n   * @example\n   * const status = await invoice.openSlug('kJNFS331');\n   */\n  readonly openSlugFp: WithChecksFp<\n    (slug: string, options?: AsyncOptions) => InvoiceTask<never, InvoiceStatus>,\n    true\n  >;\n\n  /**\n   * @see openSlugFp\n   */\n  readonly openSlug: WithChecks<\n    (slug: string, options?: AsyncOptions) => BetterPromise<InvoiceStatus>,\n    true\n  >;\n\n  /**\n   * Opens an invoice using its URL.\n   * @param url - invoice URL.\n   * @param options - additional options.\n   * @since Mini Apps v6.1\n   * @example\n   * const status = await invoice.openUrl('https://t.me/$kJNFS331');\n   */\n  readonly openUrlFp: WithChecksFp<\n    (url: string, options?: AsyncOptions) => (\n      InvoiceTask<InvalidArgumentsError, InvoiceStatus>\n    ),\n    true\n  >;\n\n  /**\n   * @see openUrlFp\n   */\n  readonly openUrl: WithChecks<\n    (url: string, options?: AsyncOptions) => BetterPromise<InvoiceStatus>,\n    true\n  >;\n}\n","import { function as fn } from 'fp-ts';\n\nimport { Invoice } from '@/features/Invoice/Invoice.js';\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withRequest } from '@/fn-options/withRequest.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\nfunction instantiate() {\n  return new Invoice(fn.pipe(sharedFeatureOptions(), withRequest, withVersion));\n}\n\nexport const invoice = /* @__PURE__*/ instantiate();\n","import type { OpenLinkBrowser, PostEventError } from '@tma.js/bridge';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport { InvalidArgumentsError } from '@/errors.js';\nimport {\n  type SharedFeatureOptions,\n  sharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { type WithPostEvent, withPostEvent } from '@/fn-options/withPostEvent.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithPostEvent {\n}\n\nexport interface OpenLinkOptions {\n  /**\n   * Attempts to use the instant view mode.\n   */\n  tryInstantView?: boolean;\n  /**\n   * A preferred browser to open the link in.\n   */\n  tryBrowser?: OpenLinkBrowser;\n}\n\nexport type OpenLinkError = PostEventError | InvalidArgumentsError;\n\nfunction create({ postEvent, ...rest }: CreateOptions) {\n  return withChecksFp((\n    url: string | URL,\n    options: OpenLinkOptions = {},\n  ): E.Either<OpenLinkError, void> => {\n    if (typeof url === 'string') {\n      try {\n        url = new URL(url);\n      } catch (e) {\n        return E.left(new InvalidArgumentsError(`\"${url.toString()}\" is invalid URL`, e));\n      }\n    }\n    return postEvent('web_app_open_link', {\n      url: url.toString(),\n      try_browser: options.tryBrowser,\n      try_instant_view: options.tryInstantView,\n    });\n  }, { ...rest, returns: 'either' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n  return create(fn.pipe(sharedFeatureOptions(), withPostEvent));\n}\n\n/**\n * Opens a link.\n *\n * The Mini App will not be closed.\n *\n * Note that this method can be called only in response to the user\n * interaction with the Mini App interface (e.g. click inside the Mini App or on the main button).\n * @param url - URL to be opened.\n * @param options - additional options.\n * @example\n * openLink('https://google.com', {\n *   tryInstantView: true,\n *   tryBrowser: 'chrome',\n * });\n */\nexport const openLinkFp = instantiate();\n\nexport const openLink = throwifyWithChecksFp(openLinkFp);\n","import { supports, type PostEventError } from '@tma.js/bridge';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport { InvalidArgumentsError } from '@/errors.js';\nimport {\n  type SharedFeatureOptions,\n  sharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent, type WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport { access } from '@/helpers/access.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithPostEvent, WithVersion {\n}\n\nexport type OpenTelegramLinkError = PostEventError | InvalidArgumentsError;\n\nfunction create({ postEvent, version, ...rest }: CreateOptions) {\n  return withChecksFp((\n    url: string | URL,\n  ): E.Either<OpenTelegramLinkError, void> => {\n    const urlString = url.toString();\n    if (!urlString.match(/^https:\\/\\/t.me\\/.+/)) {\n      return E.left(new InvalidArgumentsError(`\"${urlString}\" is invalid URL`));\n    }\n\n    if (supports('web_app_open_tg_link', access(version))) {\n      url = new URL(url);\n      return postEvent('web_app_open_tg_link', { path_full: url.pathname + url.search });\n    }\n\n    window.location.href = urlString;\n    return E.right(undefined);\n  }, { ...rest, returns: 'either' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n  return create(fn.pipe(\n    sharedFeatureOptions(),\n    withPostEvent,\n    withVersion,\n  ));\n}\n\n/**\n * Opens a Telegram link inside the Telegram app. The function expects passing a link in a full\n * format using the hostname \"t.me\".\n *\n * The Mini App will be closed.\n * @param url - URL to be opened.\n * @example\n * openTelegramLink('https://t.me/heyqbnk');\n */\nexport const openTelegramLinkFp = instantiate();\n\n/**\n * @see openTelegramLinkFp\n */\nexport const openTelegramLink = throwifyWithChecksFp(openTelegramLinkFp);\n","import type { PostEventError } from '@tma.js/bridge';\nimport type { either as E } from 'fp-ts';\n\nimport { openTelegramLinkFp } from '@/features/links/openTelegramLink.js';\nimport {\n  sharedFeatureOptions,\n  type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions {\n  openTelegramLink: (url: string) => E.Either<PostEventError, void>;\n}\n\nexport type ShareURLError = PostEventError;\n\nfunction create({ openTelegramLink, ...rest }: CreateOptions) {\n  return withChecksFp((url: string, text?: string): E.Either<ShareURLError, void> => {\n    return openTelegramLink(\n      'https://t.me/share/url?' + new URLSearchParams({ url, text: text || '' })\n        .toString()\n        // By default, URL search params encode spaces with \"+\".\n        // We are replacing them with \"%20\", because plus symbols are working incorrectly\n        // in Telegram.\n        .replace(/\\+/g, '%20'),\n    );\n  }, { ...rest, returns: 'either' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n  return create({\n    ...sharedFeatureOptions(),\n    openTelegramLink: openTelegramLinkFp,\n  });\n}\n\n/**\n * Shares the specified URL with the passed to the chats, selected by user.\n * After being called, it closes the mini application.\n *\n * This method uses Telegram's Share Links.\n * @param url - URL to share.\n * @param text - text to append after the URL.\n * @see https://core.telegram.org/api/links#share-links\n * @see https://core.telegram.org/widgets/share#custom-buttons\n */\nexport const shareURLFp = instantiate();\n\n/**\n * @see shareURLFp\n */\nexport const shareURL = throwifyWithChecksFp(shareURLFp);\n","import type { EventPayload, RequestError, PostEventError } from '@tma.js/bridge';\nimport type { Computed } from '@tma.js/signals';\nimport type { Maybe } from '@tma.js/toolkit';\nimport { BetterPromise } from 'better-promises';\nimport { either as E, taskEither as TE, function as fn } from 'fp-ts';\n\nimport { AsyncMountable } from '@/composables/AsyncMountable.js';\nimport { Stateful } from '@/composables/Stateful.js';\nimport type {\n  LocationManagerOptions,\n  LocationManagerRequestLocationResponse,\n  LocationManagerState,\n} from '@/features/LocationManager/types.js';\nimport { createIsSupportedSignal } from '@/helpers/createIsSupportedSignal.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { createWithChecksFp, type WithChecks, type WithChecksFp } from '@/with-checks/withChecksFp.js';\n\nfunction eventToState(event: EventPayload<'location_checked'>): LocationManagerState {\n  let available = false;\n  let accessRequested: Maybe<boolean>;\n  let accessGranted: Maybe<boolean>;\n  if (event.available) {\n    available = true;\n    accessRequested = event.access_requested;\n    accessGranted = event.access_granted;\n  }\n  return {\n    available,\n    accessGranted: accessGranted || false,\n    accessRequested: accessRequested || false,\n  };\n}\n\n/**\n * @since Mini Apps v8.0\n */\nexport class LocationManager {\n  constructor({\n    version,\n    request,\n    postEvent,\n    storage,\n    isTma,\n    isPageReload,\n  }: LocationManagerOptions) {\n    const stateful = new Stateful({\n      initialState: {\n        available: false,\n        accessGranted: false,\n        accessRequested: false,\n      },\n      onChange: storage.set,\n    });\n    const mountable = new AsyncMountable<LocationManagerState, RequestError>({\n      isPageReload,\n      restoreState: storage.get,\n      onMounted: stateful.setState,\n      initialState(options) {\n        return fn.pipe(\n          request('web_app_check_location', 'location_checked', options),\n          TE.map(eventToState),\n        );\n      },\n    });\n\n    const wrapOptions = { version, requires: 'web_app_check_location', isTma } as const;\n    const wrapSupportedEither = createWithChecksFp({\n      ...wrapOptions,\n      returns: 'either',\n    });\n    const wrapSupportedTask = createWithChecksFp({\n      ...wrapOptions,\n      returns: 'task',\n    });\n    const wrapMountedTask = createWithChecksFp({\n      ...wrapOptions,\n      returns: 'task',\n      isMounted: mountable.isMounted,\n    });\n\n    this.isAvailable = stateful.getter('available');\n    this.isAccessRequested = stateful.getter('accessRequested');\n    this.isAccessGranted = stateful.getter('accessGranted');\n    this.isSupported = createIsSupportedSignal('web_app_check_location', version);\n    this.isMounted = mountable.isMounted;\n    this.state = stateful.state;\n\n    this.unmount = mountable.unmount;\n    this.mountFp = wrapSupportedTask(mountable.mount);\n    this.openSettingsFp = wrapSupportedEither(() => {\n      return postEvent('web_app_open_location_settings');\n    });\n    this.requestLocationFp = wrapMountedTask(options => {\n      return fn.pipe(\n        request('web_app_request_location', 'location_requested', options),\n        TE.map(response => {\n          if (!response.available) {\n            stateful.setState({ available: false });\n            return null;\n          }\n          // eslint-disable-next-line @typescript-eslint/no-unused-vars\n          const { available, ...rest } = response;\n          return rest;\n        }),\n      );\n    });\n\n    this.mount = throwifyWithChecksFp(this.mountFp);\n    this.openSettings = throwifyWithChecksFp(this.openSettingsFp);\n    this.requestLocation = throwifyWithChecksFp(this.requestLocationFp);\n  }\n\n  /**\n   * Complete location manager state.\n   */\n  readonly state: Computed<LocationManagerState>;\n\n  /**\n   * Signal indicating whether the location data tracking is currently available.\n   */\n  readonly isAvailable: Computed<boolean>;\n\n  /**\n   * Signal indicating whether the user has granted the app permission to track location data.\n   */\n  readonly isAccessGranted: Computed<boolean>;\n\n  /**\n   * Signal indicating whether the app has previously requested permission to track location data.\n   */\n  readonly isAccessRequested: Computed<boolean>;\n\n  /**\n   * Signal indicating if the component is currently mounted.\n   */\n  readonly isMounted: Computed<boolean>;\n\n  /**\n   * Signal indicating if the component is supported.\n   */\n  readonly isSupported: Computed<boolean>;\n\n  /**\n   * Opens the location access settings for bots. Useful when you need to request location access\n   * from users who haven't granted it yet.\n   *\n   * Note that this method can be called only in response to user interaction with the Mini App\n   * interface (e.g., a click inside the Mini App or on the main button).\n   * @since Mini Apps v8.0\n   */\n  readonly openSettingsFp: WithChecksFp<() => E.Either<PostEventError, void>, true>;\n\n  /**\n   * @see openSettingsFp\n   */\n  readonly openSettings: WithChecks<() => void, true>;\n\n  /**\n   * Requests location data.\n   * @since Mini Apps v8.0\n   * @returns Promise with location data or null it access was not granted.\n   */\n  readonly requestLocationFp: WithChecksFp<\n    (options?: AsyncOptions) => (\n      TE.TaskEither<RequestError, LocationManagerRequestLocationResponse | null>\n    ),\n    true\n  >;\n\n  /**\n   * @see requestLocationFp\n   */\n  readonly requestLocation: WithChecks<\n    (options?: AsyncOptions) => BetterPromise<LocationManagerRequestLocationResponse | null>,\n    true\n  >;\n\n  /**\n   * Mounts the component restoring its state.\n   * @since Mini Apps v8.0\n   */\n  readonly mountFp: WithChecksFp<\n    (options?: AsyncOptions) => TE.TaskEither<RequestError, void>,\n    true\n  >;\n\n  /**\n   * @see mountFp\n   */\n  readonly mount: WithChecks<(options?: AsyncOptions) => BetterPromise<void>, true>;\n\n  /**\n   * Unmounts the component.\n   */\n  readonly unmount: () => void;\n}\n","import { function as fn } from 'fp-ts';\n\nimport { LocationManager } from '@/features/LocationManager/LocationManager.js';\nimport type { LocationManagerState } from '@/features/LocationManager/types.js';\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withRequest } from '@/fn-options/withRequest.js';\nimport { withStateRestore } from '@/fn-options/withStateRestore.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\nfunction instantiate() {\n  return new LocationManager(fn.pipe(\n    sharedFeatureOptions(),\n    withPostEvent,\n    withVersion,\n    withRequest,\n    withStateRestore<LocationManagerState>('locationManager'),\n  ));\n}\n\nexport const locationManager = /* @__PURE__*/ instantiate();\n","import type { PostEventError } from '@tma.js/bridge';\nimport { computed, type Computed } from '@tma.js/signals';\nimport type { RGB } from '@tma.js/types';\nimport { either as E } from 'fp-ts';\n\nimport { Button, type ButtonOptions } from '@/composables/Button.js';\nimport { access } from '@/helpers/access.js';\nimport type { MaybeAccessor } from '@/types.js';\nimport type { WithChecks, WithChecksFp } from '@/with-checks/withChecksFp.js';\n\ntype MainButtonEither = E.Either<PostEventError, void>;\n\nexport interface MainButtonState {\n  isVisible: boolean;\n  bgColor?: RGB;\n  hasShineEffect: boolean;\n  isEnabled: boolean;\n  isLoaderVisible: boolean;\n  text: string;\n  textColor?: RGB;\n}\n\nexport interface MainButtonOptions extends Omit<\n  ButtonOptions<MainButtonState, 'web_app_setup_main_button'>,\n  'initialState' | 'method' | 'payload' | 'version'\n> {\n  /**\n   * Default values for different kinds of the button properties.\n   */\n  defaults: {\n    bgColor: MaybeAccessor<RGB>;\n    textColor: MaybeAccessor<RGB>;\n  };\n}\n\nexport class MainButton {\n  constructor({ defaults, ...options }: MainButtonOptions) {\n    const button = new Button({\n      ...options,\n      version: '100',\n      initialState: {\n        hasShineEffect: false,\n        isEnabled: true,\n        isLoaderVisible: false,\n        isVisible: false,\n        text: 'Continue',\n      },\n      method: 'web_app_setup_main_button',\n      payload: state => ({\n        has_shine_effect: state.hasShineEffect,\n        is_visible: state.isVisible,\n        is_active: state.isEnabled,\n        is_progress_visible: state.isLoaderVisible,\n        text: state.text,\n        color: state.bgColor,\n        text_color: state.textColor,\n      }),\n    });\n\n    const withDefault = (\n      field: 'bgColor' | 'textColor',\n      getDefault: MaybeAccessor<RGB>,\n    ) => {\n      const fromState = button.stateGetter(field);\n      return computed(() => fromState() || access(getDefault));\n    };\n\n    this.bgColor = withDefault('bgColor', defaults.bgColor);\n    this.textColor = withDefault('textColor', defaults.textColor);\n    this.hasShineEffect = button.stateGetter('hasShineEffect');\n    this.isEnabled = button.stateGetter('isEnabled');\n    this.isLoaderVisible = button.stateGetter('isLoaderVisible');\n    this.text = button.stateGetter('text');\n    this.isVisible = button.stateGetter('isVisible');\n    this.isMounted = button.isMounted;\n    this.state = button.state;\n\n    [this.setBgColor, this.setBgColorFp] = button.stateSetters('bgColor');\n    [this.setTextColor, this.setTextColorFp] = button.stateSetters('textColor');\n    [\n      [this.disableShineEffect, this.disableShineEffectFp],\n      [this.enableShineEffect, this.enableShineEffectFp],\n    ] = button.stateBoolSetters('hasShineEffect');\n    [\n      [this.disable, this.disableFp],\n      [this.enable, this.enableFp],\n    ] = button.stateBoolSetters('isEnabled');\n    [\n      [this.hideLoader, this.hideLoaderFp],\n      [this.showLoader, this.showLoaderFp],\n    ] = button.stateBoolSetters('isLoaderVisible');\n\n    [this.setText, this.setTextFp] = button.stateSetters('text');\n    [[this.hide, this.hideFp], [this.show, this.showFp]] = button.stateBoolSetters('isVisible');\n    this.setParams = button.setState;\n    this.setParamsFp = button.setStateFp;\n    this.onClick = button.onClick;\n    this.onClickFp = button.onClickFp;\n    this.offClick = button.offClick;\n    this.offClickFp = button.offClickFp;\n    this.mount = button.mount;\n    this.mountFp = button.mountFp;\n    this.unmount = button.unmount;\n  }\n\n  //#region Properties.\n  /**\n   * The button background color.\n   */\n  readonly bgColor: Computed<RGB>;\n\n  /**\n   * True if the button has a shining effect.\n   */\n  readonly hasShineEffect: Computed<boolean>;\n\n  /**\n   * True if the button is clickable.\n   */\n  readonly isEnabled: Computed<boolean>;\n\n  /**\n   * True if the button loader is visible.\n   */\n  readonly isLoaderVisible: Computed<boolean>;\n\n  /**\n   * True if the button is visible.\n   */\n  readonly isVisible: Computed<boolean>;\n\n  /**\n   * Signal indicating if the component is currently mounted.\n   */\n  readonly isMounted: Computed<boolean>;\n\n  /**\n   * The complete button state.\n   */\n  readonly state: Computed<MainButtonState>;\n\n  /**\n   * The button displayed text.\n   */\n  readonly text: Computed<string>;\n\n  /**\n   * The button text color.\n   *\n   * Note that this value is computed based on the external defaults. For\n   * example, if not explicitly set, this value may be equal to one of theme\n   * params colors.\n   */\n  readonly textColor: Computed<RGB>;\n  //#endregion\n\n  //#region Methods.\n  /**\n   * Shows the button.\n   */\n  readonly showFp: WithChecksFp<() => MainButtonEither, false>;\n\n  /**\n   * @see showFp\n   */\n  readonly show: WithChecks<() => void, false>;\n\n  /**\n   * Hides the button.\n   */\n  readonly hideFp: WithChecksFp<() => MainButtonEither, false>;\n\n  /**\n   * @see hideFp\n   */\n  readonly hide: WithChecks<() => void, false>;\n\n  /**\n   * Enables the button.\n   */\n  readonly enableFp: WithChecksFp<() => MainButtonEither, false>;\n\n  /**\n   * @see enableFp\n   */\n  readonly enable: WithChecks<() => void, false>;\n\n  /**\n   * Enables the button.\n   */\n  readonly enableShineEffectFp: WithChecksFp<() => MainButtonEither, false>;\n\n  /**\n   * @see enableShineEffectFp\n   */\n  readonly enableShineEffect: WithChecks<() => void, false>;\n\n  /**\n   * Disables the button.\n   */\n  readonly disableFp: WithChecksFp<() => MainButtonEither, false>;\n\n  /**\n   * @see disableFp\n   */\n  readonly disable: WithChecks<() => void, false>;\n\n  /**\n   * Enables the button.\n   */\n  readonly disableShineEffectFp: WithChecksFp<() => MainButtonEither, false>;\n\n  /**\n   * @see disableShineEffectFp\n   */\n  readonly disableShineEffect: WithChecks<() => void, false>;\n\n  /**\n   * Updates the button background color.\n   */\n  readonly setBgColorFp: WithChecksFp<(value: RGB) => MainButtonEither, false>;\n\n  /**\n   * @see setBgColorFp\n   */\n  readonly setBgColor: WithChecks<(value: RGB) => void, false>;\n\n  /**\n   * Updates the button text color.\n   */\n  readonly setTextColorFp: WithChecksFp<(value: RGB) => MainButtonEither, false>;\n\n  /**\n   * @see setTextColorFp\n   */\n  readonly setTextColor: WithChecks<(value: RGB) => void, false>;\n\n  /**\n   * Updates the button text.\n   */\n  readonly setTextFp: WithChecksFp<(value: string) => MainButtonEither, false>;\n\n  /**\n   * @see setTextFp\n   */\n  readonly setText: WithChecks<(value: string) => void, false>;\n\n  /**\n   * Shows the button loader.\n   */\n  readonly showLoaderFp: WithChecksFp<() => MainButtonEither, false>;\n\n  /**\n   * @see showLoaderFp\n   */\n  readonly showLoader: WithChecks<() => void, false>;\n\n  /**\n   * Hides the button loader.\n   */\n  readonly hideLoaderFp: WithChecksFp<() => MainButtonEither, false>;\n\n  /**\n   * @see hideLoaderFp\n   */\n  readonly hideLoader: WithChecks<() => void, false>;\n\n  /**\n   * Updates the button state.\n   * @param state - updates to apply.\n   * @example\n   * button.setParams({\n   *   text: 'Submit',\n   *   isEnabled: true,\n   *   hasShineEffect: true,\n   * });\n   */\n  readonly setParamsFp: WithChecksFp<(state: Partial<MainButtonState>) => MainButtonEither, false>;\n\n  readonly setParams: WithChecks<(state: Partial<MainButtonState>) => void, false>;\n\n  /**\n   * Mounts the component restoring its state.\n   */\n  readonly mountFp: WithChecksFp<() => void, false>;\n\n  /**\n   * @see mountFp\n   */\n  readonly mount: WithChecks<() => void, false>;\n\n  /**\n   * Unmounts the component.\n   */\n  readonly unmount: () => void;\n\n  /**\n   * Adds a new button listener.\n   * @param listener - event listener.\n   * @param once - should the listener be called only once.\n   * @returns A function to remove bound listener.\n   * @example\n   * const off = button.onClick(() => {\n   *   console.log('User clicked the button');\n   *   off();\n   * });\n   */\n  readonly onClickFp: WithChecksFp<(listener: VoidFunction, once?: boolean) => VoidFunction, false>;\n\n  /**\n   * @see onClickFp\n   */\n  readonly onClick: WithChecks<(listener: VoidFunction, once?: boolean) => VoidFunction, false>;\n\n  /**\n   * Removes the button click listener.\n   * @param listener - event listener.\n   * @param once - should the listener be called only once.\n   * @example\n   * function listener() {\n   *   console.log('User clicked the button');\n   *   button.offClick(listener);\n   * }\n   * button.onClick(listener);\n   */\n  readonly offClickFp: WithChecksFp<(listener: VoidFunction, once?: boolean) => void, false>;\n\n  /**\n   * @see offClickFp\n   */\n  readonly offClick: WithChecks<(listener: VoidFunction, once?: boolean) => void, false>;\n  //#endregion\n}\n","/**\n * Sets CSS variable globally.\n * @param name - variable name.\n * @param value - variable value.\n */\nexport function setCssVar(name: string, value: string | null): void {\n  document.documentElement.style.setProperty(name, value);\n}\n\n/**\n * Deletes specified CSS variable.\n * @param name - variable name.\n */\nexport function deleteCssVar(name: string): void {\n  document.documentElement.style.removeProperty(name);\n}\n","import { throwifyFpFn } from '@tma.js/toolkit';\nimport { toRGBFullFp } from '@tma.js/transformers';\nimport { either as E, function as fn } from 'fp-ts';\n\n/**\n * @param color - color in any format acceptable by the `toRGB` function.\n * @returns True if the color is recognized as dark.\n * @see toRGB\n */\nexport function isColorDarkFp(color: string): E.Either<Error, boolean> {\n  return fn.pipe(\n    toRGBFullFp(color),\n    E.map(rgb => {\n      // Actual formula: hsp = Math.sqrt(0.299 * r * r + 0.587 * g * g + 0.114 * b * b)\n      // See: https://stackoverflow.com/a/596243\n      return Math.sqrt(\n        [0.299, 0.587, 0.114].reduce<number>((acc, modifier, idx) => {\n          // Extract part of #RRGGBB pattern and convert it to DEC.\n          const dec = parseInt(rgb.slice(1 + (idx * 2), 1 + ((idx + 1) * 2)), 16);\n          return acc + (dec * dec * modifier);\n        }, 0),\n      ) < 120;\n    }),\n  );\n}\n\n/**\n * @see isColorDarkFp\n */\nexport const isColorDark = throwifyFpFn(isColorDarkFp);\n","import type { EventListener } from '@tma.js/bridge';\nimport { computed, type Computed, signal } from '@tma.js/signals';\nimport { snakeToKebab } from '@tma.js/toolkit';\nimport type { ThemeParams as ThemeParamsType, RGB } from '@tma.js/types';\nimport { either as E } from 'fp-ts';\n\nimport { Mountable } from '@/composables/Mountable.js';\nimport { Stateful } from '@/composables/Stateful.js';\nimport { CSSVarsBoundError } from '@/errors.js';\nimport type { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport type { WithStateRestore } from '@/fn-options/withStateRestore.js';\nimport { access } from '@/helpers/access.js';\nimport { deleteCssVar, setCssVar } from '@/helpers/css-vars.js';\nimport { isColorDark } from '@/helpers/isColorDark.js';\nimport type { MaybeAccessor } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport {\n  createWithChecksFp,\n  type WithChecks,\n  type WithChecksFp,\n} from '@/with-checks/withChecksFp.js';\n\nexport type ThemeParamsState = ThemeParamsType;\n\nexport interface ThemeParamsOptions extends WithStateRestore<ThemeParamsState>,\n  SharedFeatureOptions {\n  /**\n   * Removes a theme change listener.\n   * @param listener - a listener to remove.\n   */\n  offChange: (listener: EventListener<'theme_changed'>) => void;\n  /**\n   * Adds a theme change listener.\n   * @returns A function to remove listener.\n   * @param listener - a listener to add.\n   */\n  onChange: (listener: EventListener<'theme_changed'>) => void;\n  /**\n   * Theme parameters initial state.\n   */\n  initialState: MaybeAccessor<ThemeParamsType>;\n}\n\nexport interface ThemeParamsGetCssVarNameFn {\n  /**\n   * @param property - palette key.\n   * @returns Computed complete CSS variable name.\n   */\n  (property: Extract<keyof ThemeParamsType, string>): string;\n}\n\nexport class ThemeParams {\n  constructor({\n    initialState,\n    onChange,\n    offChange,\n    isTma,\n    storage,\n    isPageReload,\n  }: ThemeParamsOptions) {\n    const stateful = new Stateful<ThemeParamsState>({\n      initialState: {},\n      onChange: storage.set,\n    });\n    const listener: EventListener<'theme_changed'> = event => {\n      stateful.setState(event.theme_params);\n    };\n    const mountable = new Mountable<ThemeParamsType>({\n      initialState: () => E.right(access(initialState)),\n      isPageReload,\n      onMounted(state) {\n        stateful.setState(state);\n        onChange(listener);\n      },\n      onUnmounted() {\n        offChange(listener);\n      },\n      restoreState: storage.get,\n    });\n\n    const wrapOptions = { isTma, returns: 'either' } as const;\n    const wrapSupportedEither = createWithChecksFp(wrapOptions);\n    const wrapMountedEither = createWithChecksFp({\n      ...wrapOptions,\n      isMounted: mountable.isMounted,\n    });\n\n    // Colors.\n    this.accentTextColor = stateful.getter('accent_text_color');\n    this.bgColor = stateful.getter('bg_color');\n    this.buttonColor = stateful.getter('button_color');\n    this.buttonTextColor = stateful.getter('button_text_color');\n    this.bottomBarBgColor = stateful.getter('bottom_bar_bg_color');\n    this.destructiveTextColor = stateful.getter('destructive_text_color');\n    this.headerBgColor = stateful.getter('header_bg_color');\n    this.hintColor = stateful.getter('hint_color');\n    this.linkColor = stateful.getter('link_color');\n    this.secondaryBgColor = stateful.getter('secondary_bg_color');\n    this.sectionBgColor = stateful.getter('section_bg_color');\n    this.sectionHeaderTextColor = stateful.getter('section_header_text_color');\n    this.sectionSeparatorColor = stateful.getter('section_separator_color');\n    this.subtitleTextColor = stateful.getter('subtitle_text_color');\n    this.textColor = stateful.getter('text_color');\n\n    // Other public signals.\n    this.state = stateful.state;\n    this.isMounted = mountable.isMounted;\n    this.bindCssVarsFp = wrapMountedEither(getCSSVarName => {\n      if (this._isCssVarsBound()) {\n        return E.left(new CSSVarsBoundError());\n      }\n      getCSSVarName ||= prop => `--tg-theme-${snakeToKebab(prop)}`;\n\n      const forEachEntry = (fn: (key: string, value: RGB) => void): void => {\n        Object.entries(stateful.state()).forEach(([k, v]) => {\n          v && fn(k, v);\n        });\n      };\n\n      const actualize = (): void => {\n        forEachEntry((k, v) => {\n          setCssVar(getCSSVarName(k), v);\n        });\n      };\n\n      actualize();\n      stateful.state.sub(actualize);\n      this._isCssVarsBound.set(true);\n\n      return E.right(() => {\n        forEachEntry(deleteCssVar);\n        stateful.state.unsub(actualize);\n        this._isCssVarsBound.set(false);\n      });\n    });\n    this.mountFp = wrapSupportedEither(mountable.mount);\n    this.unmount = mountable.unmount;\n\n    this.bindCssVars = throwifyWithChecksFp(this.bindCssVarsFp);\n    this.mount = throwifyWithChecksFp(this.mountFp);\n  }\n\n  //#region Colors.\n  /**\n   * @since v6.10\n   */\n  readonly accentTextColor: Computed<RGB | undefined>;\n\n  readonly bgColor: Computed<RGB | undefined>;\n\n  readonly buttonColor: Computed<RGB | undefined>;\n\n  readonly buttonTextColor: Computed<RGB | undefined>;\n\n  /**\n   * @since v7.10\n   */\n  readonly bottomBarBgColor: Computed<RGB | undefined>;\n\n  readonly destructiveTextColor: Computed<RGB | undefined>;\n\n  /**\n   * @since v6.10\n   */\n  readonly headerBgColor: Computed<RGB | undefined>;\n\n  readonly hintColor: Computed<RGB | undefined>;\n\n  readonly linkColor: Computed<RGB | undefined>;\n\n  readonly secondaryBgColor: Computed<RGB | undefined>;\n\n  /**\n   * @since v6.10\n   */\n  readonly sectionBgColor: Computed<RGB | undefined>;\n\n  /**\n   * @since v6.10\n   */\n  readonly sectionHeaderTextColor: Computed<RGB | undefined>;\n\n  /**\n   * @since v7.6\n   */\n  readonly sectionSeparatorColor: Computed<RGB | undefined>;\n\n  /**\n   * @since v6.10\n   */\n  readonly subtitleTextColor: Computed<RGB | undefined>;\n\n  readonly textColor: Computed<RGB | undefined>;\n  //#endregion\n\n  //#region CSS variables.\n  private readonly _isCssVarsBound = signal(false);\n\n  /**\n   * True if CSS variables are currently bound.\n   */\n  readonly isCssVarsBound = computed(this._isCssVarsBound);\n\n  /**\n   * Creates CSS variables connected with the current theme parameters.\n   *\n   * By default, created CSS variables names are following the pattern \"--tg-theme-{name}\", where\n   * {name} is a theme parameters key name converted from snake case to kebab case.\n   *\n   * Default variables:\n   * - `--tg-theme-bg-color`\n   * - `--tg-theme-secondary-text-color`\n   *\n   * Variables are being automatically updated if theme parameters were changed.\n   *\n   * @param getCSSVarName - function, returning complete CSS variable name for the specified\n   * theme parameters key.\n   * @returns Function to stop updating variables.\n   * @throws {CSSVarsBoundError} CSS variables are already bound\n   * @example Using custom CSS vars generator\n   * themeParams.bindCssVars(key => `--my-prefix-${key}`);\n   */\n  readonly bindCssVarsFp: WithChecksFp<\n    (getCSSVarName?: ThemeParamsGetCssVarNameFn) => E.Either<CSSVarsBoundError, VoidFunction>,\n    false\n  >;\n\n  /**\n   * @see bindCssVarsFp\n   */\n  readonly bindCssVars: WithChecks<\n    (getCSSVarName?: ThemeParamsGetCssVarNameFn) => VoidFunction,\n    false\n  >;\n  //#endregion\n\n  //#region Other public signals.\n  /**\n   * Complete component state.\n   */\n  readonly state: Computed<ThemeParamsType>;\n\n  /**\n   * @returns True if the current color scheme is recognized as dark.\n   * This value is calculated based on the current theme's background color.\n   */\n  readonly isDark = computed(() => {\n    const color = this.bgColor();\n    return !color || isColorDark(color);\n  });\n  //#endregion\n\n  //#region Mounting.\n  /**\n   * Signal indicating if the component is currently mounted.\n   */\n  readonly isMounted: Computed<boolean>;\n\n  /**\n   * Mounts the component restoring its state.\n   */\n  readonly mountFp: WithChecksFp<() => E.Either<never, void>, false>;\n\n  /**\n   * @see mountFp\n   */\n  readonly mount: WithChecks<() => void, false>;\n\n  /**\n   * Unmounts the component.\n   */\n  readonly unmount: () => void;\n  //#endregion\n}\n","import type { ThemeParams } from '@tma.js/types';\n\nimport { createSignal } from '@/globals/signals-registry.js';\n\n/**\n * Mini application's theme parameters.\n */\nexport const themeParams = createSignal<ThemeParams>({});\n","import { on, off } from '@tma.js/bridge';\nimport { function as fn } from 'fp-ts';\n\nimport { ThemeParams, type ThemeParamsState } from '@/features/ThemeParams/ThemeParams.js';\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withStateRestore } from '@/fn-options/withStateRestore.js';\nimport { themeParams as globalThemeParams } from '@/globals/themeParams.js';\n\nfunction instantiate() {\n  return new ThemeParams({\n    ...fn.pipe(\n      sharedFeatureOptions(),\n      withStateRestore<ThemeParamsState>('themeParams'),\n    ),\n    offChange(listener) {\n      off('theme_changed', listener);\n    },\n    onChange(listener) {\n      on('theme_changed', listener);\n    },\n    initialState: globalThemeParams,\n  });\n}\n\nexport const themeParams = /* @__PURE__*/ instantiate();\n","import type { EventName } from '@tma.js/bridge';\nimport { function as fn } from 'fp-ts';\n\nimport { buttonOptions } from '@/fn-options/buttonOptions.js';\n\n// @__NO_SIDE_EFFECTS__\nexport function bottomButtonOptions<S, D>(\n  storageName: string,\n  trackedClickEvent: EventName,\n  defaults: D,\n) {\n  return fn.pipe(\n    buttonOptions<S>(storageName, trackedClickEvent),\n    obj => ({ ...obj, defaults }),\n  );\n}\n","import { computed } from '@tma.js/signals';\n\nimport { MainButton } from '@/features/MainButton/MainButton.js';\nimport { themeParams } from '@/features/ThemeParams/instance.js';\nimport { bottomButtonOptions } from '@/fn-options/bottomButtonOptions.js';\n\nexport const mainButton = /* @__PURE__*/ new MainButton(\n  bottomButtonOptions('mainButton', 'main_button_pressed', {\n    bgColor: computed(() => themeParams.buttonColor() || '#2481cc'),\n    textColor: computed(() => themeParams.buttonTextColor() || '#ffffff'),\n  }),\n);\n","import {\n  supports,\n  type PostEventError,\n  type EventPayload,\n  type EventListener,\n} from '@tma.js/bridge';\nimport { type Computed, computed } from '@tma.js/signals';\nimport { signal } from '@tma.js/signals';\nimport { createCbCollector, camelToKebab } from '@tma.js/toolkit';\nimport { isRGB } from '@tma.js/transformers';\nimport type { KnownThemeParamsKey, RGB, ThemeParams } from '@tma.js/types';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport { Mountable } from '@/composables/Mountable.js';\nimport { Stateful } from '@/composables/Stateful.js';\nimport { CSSVarsBoundError, UnknownThemeParamsKeyError } from '@/errors.js';\nimport type { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport type { WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport type { WithStateRestore } from '@/fn-options/withStateRestore.js';\nimport type { WithVersion } from '@/fn-options/withVersion.js';\nimport { access } from '@/helpers/access.js';\nimport { deleteCssVar, setCssVar } from '@/helpers/css-vars.js';\nimport { isColorDark } from '@/helpers/isColorDark.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport {\n  createWithChecksFp,\n  type WithChecks,\n  withChecksFp,\n  type WithChecksFp,\n} from '@/with-checks/withChecksFp.js';\n\ntype AnyColor = RGB | KnownThemeParamsKey | string;\n\nexport interface MiniAppState {\n  bgColor: AnyColor;\n  bottomBarColor: AnyColor;\n  headerColor: AnyColor;\n  isActive: boolean;\n}\n\nexport interface MiniAppGetCssVarNameFn {\n  /**\n   * @param property - mini app property.\n   * @returns Computed complete CSS variable name.\n   */\n  (property: 'bgColor' | 'bottomBarColor' | 'headerColor'): string;\n}\n\ntype WithListeners<Handlers extends string, Payload> = {\n  [K in Handlers]: (listener: (payload: Payload) => void) => void;\n};\n\nexport interface MiniAppOptions extends WithPostEvent,\n  WithVersion,\n  WithStateRestore<MiniAppState>,\n  WithListeners<'onVisibilityChanged' | 'offVisibilityChanged', EventPayload<'visibility_changed'>>,\n  SharedFeatureOptions {\n  /**\n   * The current theme parameters.\n   */\n  theme: Computed<ThemeParams>;\n}\n\n/**\n * @since Mini Apps v6.1\n */\nexport class MiniApp {\n  constructor({\n    storage,\n    isPageReload,\n    version,\n    postEvent,\n    isTma,\n    theme,\n    onVisibilityChanged,\n    offVisibilityChanged,\n  }: MiniAppOptions) {\n    //#region Mounting.\n    const visibilityChangedListener: EventListener<'visibility_changed'> = event => {\n      stateful.setState({ isActive: event.is_visible });\n    };\n    const themeChangedListener = (theme: ThemeParams) => {\n      // Sometimes we may have the following colors to be specified as some theme params keys.\n      // Due to the Mini Apps nature, we are not really allowed to do that, but we want to provide\n      // such an opportunity to developers.\n      //\n      // So if the developer specified some field as a reference to some theme params key, we\n      // should find an according RGB color for it and send it to the Telegram client. We have one\n      // exclusion here - the method 'web_app_set_header_color' may accept values 'bg_color'\n      // and 'secondary_bg_color'. Other methods accept only RGB values.\n      ([\n        [this.headerColor, 'web_app_set_header_color'],\n        [this.bgColor, 'web_app_set_background_color'],\n        [this.bottomBarColor, 'web_app_set_bottom_bar_color'],\n      ] as const).forEach(([signal, method]) => {\n        const color = signal();\n        // The value is already in RGB format, we have nothing to update here.\n        if (isRGB(color)) {\n          return;\n        }\n        // The real RGB value should only be extracted for the following methods:\n        // - 'web_app_set_background_color'\n        // - 'web_app_set_bottom_bar_color'\n        // We should also do it in case of the 'web_app_set_header_color' method, if the value\n        // specified is not 'bg_color' and 'secondary_bg_color' (unknown key to\n        // the Telegram client).\n        if (\n          method !== 'web_app_set_header_color'\n          || !['bg_color', 'secondary_bg_color'].includes(color)\n        ) {\n          const rgb = theme[color];\n          if (rgb) {\n            postEvent(method, { color: rgb });\n          }\n        }\n      });\n    };\n    const mountable = new Mountable({\n      initialState() {\n        return E.right({\n          bgColor: 'bg_color',\n          headerColor: 'header_bg_color',\n          bottomBarColor: 'bottom_bar_bg_color',\n          isActive: true,\n        });\n      },\n      isPageReload,\n      onMounted: state => {\n        onVisibilityChanged(visibilityChangedListener);\n        theme.sub(themeChangedListener);\n        stateful.setState(state);\n      },\n      onUnmounted() {\n        offVisibilityChanged(visibilityChangedListener);\n        theme.unsub(themeChangedListener);\n      },\n      restoreState: storage.get,\n    });\n    this.isMounted = mountable.isMounted;\n    this.mountFp = withChecksFp(() => {\n      const nothing = () => undefined;\n      return fn.pipe(mountable.mount(), E.match(nothing, nothing));\n    }, { isTma, returns: 'plain' });\n    this.mount = throwifyWithChecksFp(this.mountFp);\n    this.unmount = mountable.unmount;\n    //#endregion\n\n    //#region State.\n    const stateful = new Stateful({\n      initialState: {\n        bgColor: 'bg_color',\n        bottomBarColor: 'bottom_bar_bg_color',\n        headerColor: 'bg_color',\n        isActive: false,\n      },\n      onChange: storage.set,\n    });\n    this.state = stateful.state;\n\n    const rgbBasedOn = (color: AnyColor): RGB | undefined => {\n      return isRGB(color) ? color : access(theme)[color];\n    };\n    const computedRgbBasedOn = (signal: Computed<AnyColor>): Computed<RGB | undefined> => {\n      return computed(() => rgbBasedOn(signal()));\n    };\n    //#endregion\n\n    //#region Other properties.\n    this.isActive = stateful.getter('isActive');\n    this.isSupported = computed(() => {\n      return ([\n        'web_app_set_header_color',\n        'web_app_set_background_color',\n        'web_app_set_bottom_bar_color',\n      ] as const).some(method => supports(method, access(version)));\n    });\n    //#endregion\n\n    //#region Css vars.\n    const isCssVarsBound = signal(false);\n    this.isCssVarsBound = computed(isCssVarsBound);\n    this.bindCssVarsFp = withChecksFp(getCSSVarName => {\n      if (isCssVarsBound()) {\n        return E.left(new CSSVarsBoundError());\n      }\n      const [addCleanup, cleanup] = createCbCollector(() => {\n        isCssVarsBound.set(false);\n      });\n\n      const bind = (cssVar: string, signal: Computed<RGB | undefined>) => {\n        const update = () => {\n          setCssVar(cssVar, signal() || null);\n        };\n        update();\n        addCleanup(signal.sub(update), deleteCssVar.bind(null, cssVar));\n      };\n\n      getCSSVarName ||= prop => `--tg-${camelToKebab(prop)}`;\n      bind(getCSSVarName('bgColor'), this.bgColorRgb);\n      bind(getCSSVarName('bottomBarColor'), this.bottomBarColorRgb);\n      bind(getCSSVarName('headerColor'), this.headerColorRgb);\n\n      isCssVarsBound.set(true);\n\n      return E.right(cleanup);\n    }, { isTma, returns: 'either', isMounted: this.isMounted });\n    this.bindCssVars = throwifyWithChecksFp(this.bindCssVarsFp);\n    //#endregion\n\n    //#region Colors.\n    type GenColorToolsetResult<K extends Exclude<keyof MiniAppState, 'isActive'>> = [\n      rawColor: Computed<AnyColor>,\n      rgbColor: Computed<RGB | undefined>,\n      throwing: WithChecks<\n        (color: AnyColor) => void,\n        true,\n        K extends 'headerColor' ? 'rgb' : never\n      >,\n      fp: WithChecksFp<\n        (color: AnyColor) => E.Either<UnknownThemeParamsKeyError | PostEventError, void>,\n        true,\n        K extends 'headerColor' ? 'rgb' : never\n      >,\n    ];\n    const genColorToolset = <K extends Exclude<keyof MiniAppState, 'isActive'>>(\n      stateKey: K,\n    ): GenColorToolsetResult<K> => {\n      const rawColor = stateful.getter(stateKey);\n      const rgbColor = computedRgbBasedOn(rawColor);\n      const method = ({\n        headerColor: 'web_app_set_header_color',\n        bgColor: 'web_app_set_background_color',\n        bottomBarColor: 'web_app_set_bottom_bar_color',\n      } as const)[stateKey];\n\n      const fp = withChecksFp(\n        (color: AnyColor): E.Either<UnknownThemeParamsKeyError | PostEventError, void> => {\n          if (color === rawColor()) {\n            return E.right(undefined);\n          }\n          if (\n            method === 'web_app_set_header_color'\n            && (color === 'bg_color' || color === 'secondary_bg_color')\n          ) {\n            return fn.pipe(\n              postEvent('web_app_set_header_color', { color_key: color }),\n              E.map(() => {\n                stateful.setState({ [stateKey]: color });\n              }),\n            );\n          }\n          const rgb = rgbBasedOn(color);\n          return fn.pipe(\n            rgb\n              ? postEvent(method, { color: rgb })\n              : E.left(new UnknownThemeParamsKeyError(color)),\n            E.map(() => {\n              stateful.setState({ [stateKey]: color });\n            }),\n          );\n        },\n        {\n          isTma,\n          version,\n          requires: method,\n          isMounted: this.isMounted,\n          returns: 'either',\n          supports: stateKey === 'headerColor'\n            ? {\n              rgb: {\n                method: 'web_app_set_header_color',\n                param: 'color',\n                shouldCheck: isRGB,\n              },\n            }\n            : undefined,\n        },\n      );\n\n      return [rawColor, rgbColor, throwifyWithChecksFp(fp), fp] as GenColorToolsetResult<K>;\n    };\n    [\n      this.bgColor,\n      this.bgColorRgb,\n      this.setBgColor,\n      this.setBgColorFp,\n    ] = genColorToolset('bgColor');\n    [\n      this.headerColor,\n      this.headerColorRgb,\n      this.setHeaderColor,\n      this.setHeaderColorFp,\n    ] = genColorToolset('headerColor');\n    [\n      this.bottomBarColor,\n      this.bottomBarColorRgb,\n      this.setBottomBarColor,\n      this.setBottomBarColorFp,\n    ] = genColorToolset('bottomBarColor');\n    //#endregion\n\n    //#region Other methods.\n    const withBasicEither = createWithChecksFp({ isTma, returns: 'either' });\n    this.closeFp = withBasicEither(returnBack => {\n      return postEvent('web_app_close', { return_back: returnBack });\n    });\n    this.close = throwifyWithChecksFp(this.closeFp);\n\n    this.readyFp = withBasicEither(() => postEvent('web_app_ready'));\n    this.ready = throwifyWithChecksFp(this.readyFp);\n    //#endregion\n  }\n\n  //#region Other properties.\n  /**\n   * Signal indicating if the component is supported.\n   */\n  readonly isSupported: Computed<boolean>;\n\n  /**\n   * True if the current Mini App background color is recognized as dark.\n   */\n  readonly isDark = computed(() => {\n    const color = this.bgColorRgb();\n    return color ? isColorDark(color) : false;\n  });\n\n  /**\n   * Signal indicating if the mini app is currently active.\n   */\n  readonly isActive: Computed<boolean>;\n\n  /**\n   * Complete component state.\n   */\n  readonly state: Computed<MiniAppState>;\n  //#endregion\n\n  //#region CSS variables.\n  /**\n   * True if the CSS variables are currently bound.\n   */\n  readonly isCssVarsBound: Computed<boolean>;\n\n  /**\n   * Creates CSS variables connected with the mini app.\n   *\n   * Default variables:\n   * - `--tg-bg-color`\n   * - `--tg-header-color`\n   * - `--tg-bottom-bar-color`\n   *\n   * Variables are being automatically updated if theme parameters were changed.\n   *\n   * @param getCSSVarName - function, returning complete CSS variable name for the specified\n   * mini app key.\n   * @returns Function to stop updating variables.\n   * @example Using no arguments\n   * miniApp.bindCssVars();\n   * @example Using custom CSS vars generator\n   * miniApp.bindCssVars(key => `--my-prefix-${key}`);\n   */\n  readonly bindCssVarsFp: WithChecksFp<\n    (getCssVarName?: MiniAppGetCssVarNameFn) => E.Either<CSSVarsBoundError, VoidFunction>,\n    false\n  >;\n\n  readonly bindCssVars: WithChecks<(getCssVarName?: MiniAppGetCssVarNameFn) => VoidFunction, false>;\n  //#endregion\n\n  //#region Mounting.\n  /**\n   * Signal indicating if the component is mounted.\n   */\n  readonly isMounted: Computed<boolean>;\n\n  /**\n   * Mounts the component.\n   *\n   * This function restores the component state and is automatically saving it in the local storage\n   * if it changed.\n   * @since Mini Apps v6.1\n   */\n  readonly mountFp: WithChecksFp<() => void, false>;\n\n  /**\n   * @see mount\n   */\n  readonly mount: WithChecks<() => void, false>;\n\n  /**\n   * Unmounts the component.\n   */\n  readonly unmount: () => void;\n  //#endregion\n\n  //#region Background color.\n  /**\n   * The Mini App background color.\n   *\n   * Represents an RGB color, or theme parameters key, like \"bg_color\", \"secondary_bg_color\", etc.\n   *\n   * Note that using a theme parameters key, background color becomes bound to the current\n   * theme parameters, making it automatically being updated whenever theme parameters change.\n   * In order to remove this bind, use an explicit RGB color.\n   */\n  readonly bgColor: Computed<AnyColor>;\n\n  /**\n   * RGB representation of the background color.\n   *\n   * This value requires the Theme Params component to be mounted to extract a valid RGB value\n   * of the color key.\n   */\n  readonly bgColorRgb: Computed<RGB | undefined>;\n\n  /**\n   * Updates the mini app background color.\n   * @since Mini Apps v6.1\n   */\n  readonly setBgColorFp: WithChecksFp<\n    (color: AnyColor) => E.Either<PostEventError | UnknownThemeParamsKeyError, void>,\n    true\n  >;\n\n  /**\n   * @see setBgColorFp\n   */\n  readonly setBgColor: WithChecks<(color: AnyColor) => void, true>;\n  //#endregion\n\n  //#region Header color.\n  /**\n   * The Mini App header color.\n   */\n  readonly headerColor: Computed<AnyColor>;\n\n  /**\n   * RGB representation of the header color.\n   *\n   * This value requires the Theme Params component to be mounted to extract a valid RGB value\n   * of the color key.\n   */\n  readonly headerColorRgb: Computed<RGB | undefined>;\n\n  /**\n   * Updates the mini app header color.\n   * @since Mini Apps v6.1\n   */\n  readonly setHeaderColorFp: WithChecksFp<\n    (color: AnyColor) => E.Either<PostEventError | UnknownThemeParamsKeyError, void>,\n    true,\n    'rgb'\n  >;\n\n  /**\n   * @see setHeaderColorFp\n   */\n  readonly setHeaderColor: WithChecks<(color: AnyColor) => void, true, 'rgb'>;\n  //#endregion\n\n  //#region Bottom bar background color.\n  /**\n   * The Mini App bottom bar background color.\n   */\n  readonly bottomBarColor: Computed<AnyColor>;\n\n  /**\n   * RGB representation of the bottom bar background color.\n   *\n   * This value requires the Theme Params component to be mounted to extract a valid RGB value\n   * of the color key.\n   */\n  readonly bottomBarColorRgb: Computed<RGB | undefined>;\n\n  /**\n   * Updates the mini app bottom bar bg color.\n   * @since Mini Apps v7.10\n   */\n  readonly setBottomBarColorFp: WithChecksFp<\n    (color: AnyColor) => E.Either<PostEventError | UnknownThemeParamsKeyError, void>,\n    true\n  >;\n\n  /**\n   * @see setBottomBarColorFp\n   */\n  readonly setBottomBarColor: WithChecks<(color: AnyColor) => void, true>;\n  //#endregion\n\n  //#region Other methods.\n  /**\n   * Closes the Mini App.\n   * @param returnBack - should the client return to the previous activity.\n   */\n  readonly closeFp: WithChecksFp<(returnBack?: boolean) => E.Either<PostEventError, void>, false>;\n\n  /**\n   * @see closeFp\n   */\n  readonly close: WithChecks<(returnBack?: boolean) => void, false>;\n\n  /**\n   * Informs the Telegram app that the Mini App is ready to be displayed.\n   *\n   * It is recommended to call this method as early as possible, as soon as all\n   * essential interface elements loaded.\n   *\n   * Once this method is called, the loading placeholder is hidden and the Mini\n   * App shown.\n   *\n   * If the method is not called, the placeholder will be hidden only when the\n   * page was fully loaded.\n   */\n  readonly readyFp: WithChecksFp<() => E.Either<PostEventError, void>, false>;\n\n  /**\n   * @see readyFp\n   */\n  readonly ready: WithChecks<() => void, false>;\n  //#endregion\n}\n","import { on, off } from '@tma.js/bridge';\nimport { function as fn } from 'fp-ts';\n\nimport { MiniApp, type MiniAppState } from '@/features/MiniApp/MiniApp.js';\nimport { themeParams } from '@/features/ThemeParams/instance.js';\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withStateRestore } from '@/fn-options/withStateRestore.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\nfunction instantiate() {\n  return new MiniApp({\n    ...fn.pipe(\n      sharedFeatureOptions(),\n      withPostEvent,\n      withVersion,\n      withStateRestore<MiniAppState>('miniApp'),\n    ),\n    offVisibilityChanged(listener) {\n      off('visibility_changed', listener);\n    },\n    onVisibilityChanged(listener) {\n      on('visibility_changed', listener);\n    },\n    theme: themeParams.state,\n  });\n}\n\nexport const miniApp = /* @__PURE__*/ instantiate();\n","import type { PopupParams, PopupButton } from '@tma.js/bridge';\nimport { either as E } from 'fp-ts';\n\nimport { InvalidArgumentsError } from '@/errors.js';\nimport type { ShowOptions } from '@/features/Popup/types.js';\n\n/**\n * Prepares popup parameters before sending them to native app.\n * @param params - popup parameters.\n */\nexport function prepareParams(params: ShowOptions): E.Either<InvalidArgumentsError, PopupParams> {\n  const message = params.message.trim();\n  const title = (params.title || '').trim();\n  const paramsButtons = params.buttons || [];\n\n  if (title.length > 64) {\n    return E.left(new InvalidArgumentsError(`Invalid title: ${title}`));\n  }\n  if (!message || message.length > 256) {\n    return E.left(new InvalidArgumentsError(`Invalid message: ${message}`));\n  }\n  if (paramsButtons.length > 3) {\n    return E.left(new InvalidArgumentsError(`Invalid buttons count: ${paramsButtons.length}`));\n  }\n\n  const buttons: PopupButton[] = [];\n  if (!paramsButtons.length) {\n    buttons.push({ type: 'close', id: '' });\n  } else {\n    for (let i = 0; i < paramsButtons.length; i++) {\n      const button = paramsButtons[i];\n      const id = button.id || '';\n      if (id.length > 64) {\n        return E.left(new InvalidArgumentsError(`Button with index ${i} has invalid id: ${id}`));\n      }\n\n      if (!button.type || button.type === 'default' || button.type === 'destructive') {\n        const text = button.text.trim();\n        if (!text || text.length > 64) {\n          return E.left(new InvalidArgumentsError(`Button with index ${i} has invalid text: ${text}`));\n        }\n        buttons.push({ type: button.type, text, id });\n      } else {\n        buttons.push({ type: button.type, id });\n      }\n    }\n  }\n\n  return E.right({ title, message, buttons });\n}\n","import type { RequestError } from '@tma.js/bridge';\nimport { type Computed, signal, computed } from '@tma.js/signals';\nimport type { BetterPromise } from 'better-promises';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport { ConcurrentCallError, type InvalidArgumentsError } from '@/errors.js';\nimport { prepareParams } from '@/features/Popup/prepareParams.js';\nimport type { ShowOptions } from '@/features/Popup/types.js';\nimport type { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport type { WithRequest } from '@/fn-options/withRequest.js';\nimport type { WithVersion } from '@/fn-options/withVersion.js';\nimport { createIsSupportedSignal } from '@/helpers/createIsSupportedSignal.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { createWithChecksFp, type WithChecksFp, type WithChecks } from '@/with-checks/withChecksFp.js';\n\nexport interface PopupOptions extends SharedFeatureOptions, WithVersion, WithRequest {\n}\n\n/**\n * @since Mini Apps v6.2\n */\nexport class Popup {\n  constructor({ version, isTma, request }: PopupOptions) {\n    const isOpened = signal(false);\n    const toggleClosed = () => {\n      isOpened.set(false);\n    };\n\n    const wrapSupportedTask = createWithChecksFp({\n      version,\n      isTma,\n      requires: 'web_app_open_popup',\n      returns: 'task',\n    });\n\n    this.isSupported = createIsSupportedSignal('web_app_open_popup', version);\n    this.isOpened = computed(isOpened);\n    this.showFp = wrapSupportedTask(options => {\n      return fn.pipe(\n        this.isOpened()\n          ? TE.left(new ConcurrentCallError('A popup is already opened'))\n          : TE.right(undefined as never),\n        TE.chainW(() => TE.fromEither(prepareParams(options))),\n        TE.chain(preparedOptions => {\n          isOpened.set(true);\n          return request('web_app_open_popup', 'popup_closed', {\n            ...options,\n            params: preparedOptions,\n          });\n        }),\n        TE.mapBoth(\n          err => {\n            toggleClosed();\n            return err;\n          },\n          response => {\n            toggleClosed();\n            return response.button_id;\n          },\n        ),\n      );\n    });\n    this.show = throwifyWithChecksFp(this.showFp);\n  }\n\n  /**\n   * Signal indicating if any popup is currently opened.\n   */\n  readonly isOpened: Computed<boolean>;\n\n  /**\n   * Signal indicating if the component is supported.\n   */\n  readonly isSupported: Computed<boolean>;\n\n  /**\n   * A method that shows a native popup described by the `params` argument.\n   * The promise will be resolved when the popup is closed. Resolved value will have\n   * an identifier of the pressed button.\n   *\n   * If a user clicked outside the popup or clicked the top right popup close\n   * button, null will be resolved.\n   *\n   * @param options - popup parameters.\n   * @since Mini Apps v6.2\n   * @example\n   * fn.pipe(\n   *   popup.showFp({\n   *     title: 'Confirm action',\n   *     message: 'Do you really want to buy this burger?',\n   *     buttons: [\n   *       { id: 'yes', text: 'Yes' },\n   *       { id: 'no', type: 'destructive', text: 'No' },\n   *     ],\n   *   }),\n   *   TE.map(buttonId => {\n   *     console.log('User clicked a button with ID', buttonId);\n   *   }),\n   * );\n   */\n  readonly showFp: WithChecksFp<\n    (options: ShowOptions) => TE.TaskEither<\n      RequestError | InvalidArgumentsError | ConcurrentCallError,\n      string | undefined\n    >,\n    true\n  >;\n\n  /**\n   * @see showFp\n   */\n  readonly show: WithChecks<(options: ShowOptions) => BetterPromise<string | undefined>, true>;\n}\n","import { function as fn } from 'fp-ts';\n\nimport { Popup } from '@/features/Popup/Popup.js';\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withRequest } from '@/fn-options/withRequest.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\nfunction instantiate() {\n  return new Popup(fn.pipe(sharedFeatureOptions(), withRequest, withVersion));\n}\n\nexport const popup = /* @__PURE__*/ instantiate();\n","import type { PhoneRequestedStatus, RequestError } from '@tma.js/bridge';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport {\n  sharedFeatureOptions,\n  type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withRequest, type WithRequest } from '@/fn-options/withRequest.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithRequest, WithVersion {\n}\n\nexport type RequestPhoneAccessError = RequestError;\n\nfunction create({ request, ...rest }: CreateOptions) {\n  return withChecksFp((\n    options?: AsyncOptions,\n  ): TE.TaskEither<RequestPhoneAccessError, PhoneRequestedStatus> => {\n    return fn.pipe(\n      request('web_app_request_phone', 'phone_requested', options),\n      TE.map(response => response.status),\n    );\n  }, { ...rest, requires: 'web_app_request_phone', returns: 'task' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n  return create(fn.pipe(\n    sharedFeatureOptions(),\n    withVersion,\n    withRequest,\n  ));\n}\n\n/**\n * Requests current user phone access. Method returns promise, which resolves\n * status of the request. In case, user accepted the request, Mini App bot will receive\n * the according notification.\n *\n * To obtain the retrieved information instead, utilize the `requestContact` method.\n * @param options - additional options.\n * @since Mini Apps v6.9\n * @see requestContact\n */\nexport const requestPhoneAccessFp = instantiate();\n\n/**\n * @see requestPhoneAccessFp\n */\nexport const requestPhoneAccess = throwifyWithChecksFp(requestPhoneAccessFp);\n","import { PhoneRequestedStatus } from '@tma.js/bridge';\nimport { BetterTaskEither, type BetterTaskEitherError } from '@tma.js/toolkit';\nimport { pipeJsonToSchema, pipeQueryToSchema } from '@tma.js/transformers';\nimport { either as E, taskEither as TE, function as fn } from 'fp-ts';\nimport {\n  safeParse,\n  pipe as valiPipe,\n  date,\n  looseObject,\n  number,\n  optional,\n  string,\n  transform,\n} from 'valibot';\n\nimport { AccessDeniedError, ValidationError } from '@/errors.js';\nimport {\n  sharedFeatureOptions,\n  type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\n\nimport {\n  withInvokeCustomMethod,\n  type WithInvokeCustomMethod,\n  InvokeCustomMethodError,\n} from '@/fn-options/withInvokeCustomMethod.js';\n\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\n\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\nimport { type RequestPhoneAccessError, requestPhoneAccessFp } from './requestPhoneAccess.js';\n\n/**\n * Requested contact information.\n */\nexport interface RequestedContact {\n  contact: {\n    user_id: number;\n    phone_number: string;\n    first_name: string;\n    last_name?: string;\n    [key: string]: unknown;\n  };\n  auth_date: Date;\n  hash: string;\n  [key: string]: unknown;\n}\n\n/**\n * Requested contact complete data.\n */\nexport interface RequestedContactCompleteData {\n  /**\n   * Raw original representation of the contact data returned from the Telegram server.\n   */\n  raw: string;\n  /**\n   * Parsed representation of the contact data.\n   */\n  parsed: RequestedContact;\n}\n\ninterface CreateCompleteOptions extends SharedFeatureOptions, WithInvokeCustomMethod, WithVersion {\n  requestPhoneAccess: (options?: AsyncOptions) => (\n    TE.TaskEither<RequestPhoneAccessError, PhoneRequestedStatus>\n  );\n}\n\ninterface CreateParsedOptions extends SharedFeatureOptions, WithVersion {\n  requestContact: (options?: AsyncOptions) => TE.TaskEither<RequestContactError, RequestedContact>;\n}\n\nexport type RequestContactError =\n  | InvokeCustomMethodError\n  | AccessDeniedError\n  | ValidationError\n  | BetterTaskEitherError;\n\nfunction createComplete({\n  invokeCustomMethod,\n  requestPhoneAccess,\n  ...rest\n}: CreateCompleteOptions) {\n  type GetRequestedContactError = InvokeCustomMethodError | ValidationError;\n\n  // Attempts to get previously requested contact.\n  const getContact = (\n    options?: AsyncOptions,\n  ): TE.TaskEither<GetRequestedContactError, RequestedContactCompleteData | undefined> => {\n    return fn.pipe(\n      invokeCustomMethod('getRequestedContact', {}, {\n        ...options,\n        timeout: (options || {}).timeout || 5000,\n      }),\n      TE.chainW(response => {\n        const toStringResult = safeParse(string(), response);\n        if (!toStringResult.success) {\n          return TE.left(new ValidationError(response, toStringResult.issues));\n        }\n\n        if (!toStringResult.output) {\n          return TE.right(undefined);\n        }\n\n        const toParsedResult = safeParse(\n          pipeQueryToSchema(\n            looseObject({\n              contact: pipeJsonToSchema(looseObject({\n                user_id: number(),\n                phone_number: string(),\n                first_name: string(),\n                last_name: optional(string()),\n              })),\n              auth_date: valiPipe(\n                string(),\n                transform(input => new Date(Number(input) * 1000)),\n                date(),\n              ),\n              hash: string(),\n            }),\n          ),\n          toStringResult.output,\n        );\n        return toParsedResult.success\n          ? TE.right({ raw: toStringResult.output, parsed: toParsedResult.output })\n          : TE.left(new ValidationError(toStringResult.output, toParsedResult.issues));\n      }),\n    );\n  };\n\n  // Attempts to get previously requested contact, but ignores all errors except validation error.\n  const getContactWithErrorsIgnore = (\n    options?: AsyncOptions,\n  ): TE.TaskEither<ValidationError, RequestedContactCompleteData | undefined> => {\n    return fn.pipe(\n      getContact(options),\n      TE.match(\n        // All other errors except validation ones should be ignored. Receiving validation error\n        // means that we have some data, but we are unable to parse it properly. So, there is no\n        // need to make some more requests further, the problem is local.\n        error => (ValidationError.is(error) ? E.left(error) : E.right(undefined)),\n        contact => E.right(contact),\n      ),\n    );\n  };\n\n  // Polls previously requested contact with increasing timeout between requests.\n  const pollContact = (ctx: {\n    isRejected: boolean;\n    rejectReason: unknown;\n    abortSignal: AbortSignal;\n  }): TE.TaskEither<BetterTaskEitherError | ValidationError, RequestedContactCompleteData> => {\n    return BetterTaskEither<ValidationError, RequestedContactCompleteData>(\n      async (res, rej, context) => {\n        // Time to wait before executing the next request.\n        let sleepTime = 50;\n\n        // We are trying to retrieve the requested contact until the deadline was reached.\n        while (!context.isRejected) {\n          const result = await getContactWithErrorsIgnore(context)();\n          if (result._tag === 'Left') {\n            return rej(result.left);\n          }\n          if (result.right) {\n            return res(result.right);\n          }\n          await new Promise(resolve => setTimeout(resolve, sleepTime));\n          sleepTime += 50;\n        }\n      },\n      ctx,\n    );\n  };\n\n  return withChecksFp((\n    options?: AsyncOptions,\n  ): TE.TaskEither<RequestContactError, RequestedContactCompleteData> => {\n    return BetterTaskEither.fn(context => {\n      return fn.pipe(\n        // Try to get the requested contact. Probably, we already requested it before.\n        getContactWithErrorsIgnore(context),\n        TE.chain(contact => {\n          if (contact) {\n            return TE.right(contact);\n          }\n          return fn.pipe(\n            requestPhoneAccess(context),\n            TE.chainW(status => {\n              return status === 'sent'\n                ? pollContact(context)\n                : TE.left(new AccessDeniedError('User denied access'));\n            }),\n          );\n        }),\n      );\n    }, options);\n  }, { ...rest, returns: 'task', requires: 'web_app_request_phone' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiateComplete() {\n  return createComplete({\n    ...fn.pipe(sharedFeatureOptions(), withInvokeCustomMethod, withVersion),\n    requestPhoneAccess: requestPhoneAccessFp,\n  });\n}\n\nfunction createParsed({ requestContact, ...rest }: CreateParsedOptions) {\n  return withChecksFp(\n    requestContact,\n    { ...rest, returns: 'task', requires: 'web_app_request_phone' },\n  );\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiateParsed() {\n  return createParsed({\n    ...fn.pipe(sharedFeatureOptions(), withVersion),\n    requestContact(options) {\n      return fn.pipe(\n        requestContactCompleteFp(options),\n        TE.map(contact => contact.parsed),\n      );\n    },\n  });\n}\n\n/**\n * Requests current user contact information.\n *\n * This function returns an object, containing both raw and parsed representations of a response,\n * received from the Telegram client.\n * @param options - additional options.\n * @since Mini Apps v6.9\n */\nexport const requestContactCompleteFp = instantiateComplete();\n\n/**\n * @see requestContactCompleteFp\n */\nexport const requestContactComplete = throwifyWithChecksFp(requestContactCompleteFp);\n\n/**\n * Works the same way as the `requestContactCompleteFp` function, but returns only parsed\n * representation of the contact data.\n * @see requestContactCompleteFp\n * @param options - additional options.\n * @since Mini Apps v6.9\n */\nexport const requestContactFp = instantiateParsed();\n\n/**\n * @see requestContactFp\n */\nexport const requestContact = throwifyWithChecksFp(requestContactFp);\n","import type { WriteAccessRequestedStatus, RequestError } from '@tma.js/bridge';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport {\n  sharedFeatureOptions,\n  type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withRequest, type WithRequest } from '@/fn-options/withRequest.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithRequest, WithVersion {\n}\n\nexport type RequestWriteAccessError = RequestError;\n\nfunction create({ request, ...rest }: CreateOptions) {\n  return withChecksFp((\n    options?: AsyncOptions,\n  ): TE.TaskEither<RequestWriteAccessError, WriteAccessRequestedStatus> => {\n    return fn.pipe(\n      request('web_app_request_write_access', 'write_access_requested', options),\n      TE.map(response => response.status),\n    );\n  }, { ...rest, requires: 'web_app_request_write_access', returns: 'task' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n  return create(fn.pipe(\n    sharedFeatureOptions(),\n    withVersion,\n    withRequest,\n  ));\n}\n\n/**\n * Requests write message access to the current user.\n * @param options - additional options.\n * @since Mini Apps v6.9\n */\nexport const requestWriteAccessFp = instantiate();\n\n/**\n * @see requestWriteAccessFp\n */\nexport const requestWriteAccess = throwifyWithChecksFp(requestWriteAccessFp);\n","import type { PostEventError } from '@tma.js/bridge';\nimport { computed, type Computed, signal } from '@tma.js/signals';\nimport { createCbCollector, BetterTaskEither, type BetterTaskEitherError } from '@tma.js/toolkit';\nimport { BetterPromise } from 'better-promises';\nimport { either as E, taskEither as TE, function as fn } from 'fp-ts';\n\nimport { ConcurrentCallError } from '@/errors.js';\nimport type { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport type { WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport type { WithVersion } from '@/fn-options/withVersion.js';\nimport { createIsSupportedSignal } from '@/helpers/createIsSupportedSignal.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport {\n  createWithChecksFp,\n  type WithChecks,\n  type WithChecksFp,\n} from '@/with-checks/withChecksFp.js';\n\nexport interface QrScannerOptions extends WithVersion, WithPostEvent, SharedFeatureOptions {\n  /**\n   * A function to add a listener to the event determining if the QR scanner\n   * was closed.\n   * @param listener - a listener to add.\n   * @returns A function to remove the listener.\n   */\n  onClosed: (listener: VoidFunction) => VoidFunction;\n  /**\n   * A function to add a listener to the event containing a scanned QR content.\n   * @param listener - a listener to add.\n   * @returns A function to remove the listener.\n   */\n  onTextReceived: (listener: (data: string) => void) => VoidFunction;\n}\n\ninterface SharedOptions extends AsyncOptions {\n  /**\n   * Title to be displayed in the scanner.\n   */\n  text?: string;\n}\n\ninterface CaptureOptions extends SharedOptions {\n  /**\n   * @returns True if the passed QR code should be captured.\n   * @param qr - scanned QR content.\n   */\n  capture: (qr: string) => boolean;\n}\n\ninterface OpenOptions extends SharedOptions {\n  /**\n   * Function which will be called if a QR code was scanned.\n   * @param qr - scanned QR content.\n   */\n  onCaptured: (qr: string) => void;\n}\n\n/**\n * @since Mini Apps v6.4\n */\nexport class QrScanner {\n  constructor({\n    version,\n    onClosed,\n    onTextReceived,\n    isTma,\n    postEvent,\n  }: QrScannerOptions) {\n    const wrapOptions = { version, requires: 'web_app_open_scan_qr_popup', isTma } as const;\n    const wrapSupportedEither = createWithChecksFp({ ...wrapOptions, returns: 'either' });\n    const wrapSupportedTask = createWithChecksFp({ ...wrapOptions, returns: 'task' });\n\n    const isOpened = signal(false);\n    const setClosed = () => {\n      isOpened.set(false);\n    };\n\n    this.isSupported = createIsSupportedSignal('web_app_open_scan_qr_popup', version);\n    this.isOpened = computed(isOpened);\n\n    this.captureFp = wrapSupportedTask(options => {\n      let captured: string | undefined;\n      return fn.pipe(\n        this.openFp({\n          ...options,\n          onCaptured: qr => {\n            if (options.capture(qr)) {\n              captured = qr;\n              this.close();\n            }\n          },\n        }),\n        TE.map(() => captured),\n      );\n    });\n    this.closeFp = wrapSupportedEither(() => {\n      return fn.pipe(postEvent('web_app_close_scan_qr_popup'), E.map(setClosed));\n    });\n    this.openFp = wrapSupportedTask(options => {\n      return fn.pipe(\n        isOpened()\n          ? TE.left(new ConcurrentCallError('The QR Scanner is already opened'))\n          : async () => postEvent('web_app_open_scan_qr_popup', { text: options.text }),\n        TE.chainW(() => {\n          isOpened.set(true);\n          const [addToCleanup, cleanup] = createCbCollector();\n          const onSettled = <T>(value: T): T => {\n            cleanup();\n            isOpened.set(false);\n            return value;\n          };\n\n          return fn.pipe(\n            BetterTaskEither<never, void>(resolve => {\n              addToCleanup(\n                // The scanner was closed externally.\n                onClosed(resolve),\n                // The scanner was closed internally.\n                isOpened.sub(isOpenedValue => {\n                  if (!isOpenedValue) {\n                    resolve();\n                  }\n                }),\n                onTextReceived(options.onCaptured),\n              );\n            }, options),\n            TE.mapBoth(onSettled, onSettled),\n          );\n        }),\n      );\n    });\n\n    this.open = throwifyWithChecksFp(this.openFp);\n    this.capture = throwifyWithChecksFp(this.captureFp);\n    this.close = throwifyWithChecksFp(this.closeFp);\n  }\n\n  /**\n   * Signal indicating if the scanner is currently opened.\n   */\n  readonly isOpened: Computed<boolean>;\n\n  /**\n   * Signal indicating if the component is supported.\n   */\n  readonly isSupported: Computed<boolean>;\n\n  /**\n   * Opens the scanner and returns a task which will be completed with the QR content if the\n   * passed `capture` function returned true.\n   *\n   * Task may also be completed with undefined if the scanner was closed.\n   * @param options - method options.\n   * @returns A promise with QR content presented as string or undefined if the scanner was closed.\n   * @since Mini Apps v6.4\n   * @example\n   * fn.pipe(\n   *   qrScanner.captureFp({\n   *     capture(scannedQr) {\n   *       return scannedQr === 'any expected by me qr';\n   *     }\n   *   }),\n   *   TE.match(\n   *     error => {\n   *       console.error(error);\n   *     },\n   *     qr => {\n   *       console.log('My QR:'), qr;\n   *     }\n   *   ),\n   * );\n   */\n  readonly captureFp: WithChecksFp<\n    (options: CaptureOptions) => (\n      TE.TaskEither<PostEventError | BetterTaskEitherError, string | undefined>\n    ),\n    true\n  >;\n\n  /**\n   * @see captureFp\n   */\n  readonly capture: WithChecks<\n    (options: CaptureOptions) => BetterPromise<string | undefined>,\n    true\n  >;\n\n  /**\n   * Closes the scanner.\n   * @since Mini Apps v6.4\n   */\n  readonly closeFp: WithChecksFp<() => E.Either<PostEventError, void>, true>;\n\n  /**\n   * @see close\n   */\n  readonly close: WithChecks<() => void, true>;\n\n  /**\n   * Opens the scanner and returns a task which will be completed when the scanner was closed.\n   * @param options - method options.\n   * @since Mini Apps v6.4\n   * @example Without `capture` option\n   * if (qrScanner.open.isAvailable()) {\n   *   const qr = await qrScanner.open({ text: 'Scan any QR' });\n   * }\n   * @example\n   * fn.pipe(\n   *   qrScanner.openFp({\n   *     onCaptured(scannedQr) {\n   *       if (scannedQr === 'any expected by me qr') {\n   *         qrScanner.close();\n   *       }\n   *     }\n   *   }),\n   *   TE.match(\n   *     error => {\n   *       console.error(error);\n   *     },\n   *     () => {\n   *       console.log('The scanner was closed');\n   *     }\n   *   ),\n   * );\n   */\n  readonly openFp: WithChecksFp<\n    (options: OpenOptions) => TE.TaskEither<PostEventError, void>,\n    true\n  >;\n\n  /**\n   * @see openFp\n   */\n  readonly open: WithChecks<(options: OpenOptions) => BetterPromise<void>, true>;\n}\n","import { on } from '@tma.js/bridge';\nimport { function as fn } from 'fp-ts';\n\nimport { QrScanner } from '@/features/QrScanner/QrScanner.js';\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\nfunction instantiate() {\n  return new QrScanner({\n    ...fn.pipe(sharedFeatureOptions(), withPostEvent, withVersion),\n    onClosed(listener) {\n      return on('scan_qr_popup_closed', listener);\n    },\n    onTextReceived(listener) {\n      return on('qr_text_received', event => {\n        listener(event.data);\n      });\n    },\n  });\n}\n\nexport const qrScanner = /* @__PURE__*/ instantiate();\n","import type { PostEventError, SecondaryButtonPosition } from '@tma.js/bridge';\nimport { computed, type Computed } from '@tma.js/signals';\nimport type { RGB } from '@tma.js/types';\nimport { either as E } from 'fp-ts';\n\nimport { Button, type ButtonOptions } from '@/composables/Button.js';\nimport { access } from '@/helpers/access.js';\nimport { createIsSupportedSignal } from '@/helpers/createIsSupportedSignal.js';\nimport type { MaybeAccessor } from '@/types.js';\nimport type { WithChecks, WithChecksFp } from '@/with-checks/withChecksFp.js';\n\ntype SecondaryButtonEither = E.Either<PostEventError, void>;\n\nexport interface SecondaryButtonState {\n  isVisible: boolean;\n  bgColor?: RGB;\n  hasShineEffect: boolean;\n  isEnabled: boolean;\n  isLoaderVisible: boolean;\n  text: string;\n  textColor?: RGB;\n  position: SecondaryButtonPosition;\n}\n\nexport interface SecondaryButtonOptions extends Omit<\n  ButtonOptions<SecondaryButtonState, 'web_app_setup_secondary_button'>,\n  'initialState' | 'method' | 'payload'\n> {\n  /**\n   * Default values for different kinds of the button properties.\n   */\n  defaults: {\n    bgColor: MaybeAccessor<RGB>;\n    textColor: MaybeAccessor<RGB>;\n  };\n}\n\n/**\n * @since Mini Apps v7.10\n */\nexport class SecondaryButton {\n  constructor({ defaults, ...options }: SecondaryButtonOptions) {\n    const button = new Button({\n      ...options,\n      initialState: {\n        hasShineEffect: false,\n        isEnabled: true,\n        isLoaderVisible: false,\n        isVisible: false,\n        text: 'Cancel',\n        position: 'left',\n      },\n      method: 'web_app_setup_secondary_button',\n      payload: state => ({\n        has_shine_effect: state.hasShineEffect,\n        is_visible: state.isVisible,\n        is_active: state.isEnabled,\n        is_progress_visible: state.isLoaderVisible,\n        text: state.text,\n        color: state.bgColor,\n        text_color: state.textColor,\n        position: state.position,\n      }),\n    });\n\n    const withDefault = (\n      field: 'bgColor' | 'textColor',\n      getDefault: MaybeAccessor<RGB>,\n    ) => {\n      const fromState = button.stateGetter(field);\n      return computed(() => fromState() || access(getDefault));\n    };\n\n    this.isSupported = createIsSupportedSignal('web_app_setup_secondary_button', options.version);\n    this.bgColor = withDefault('bgColor', defaults.bgColor);\n    this.textColor = withDefault('textColor', defaults.textColor);\n    this.position = button.stateGetter('position');\n    this.hasShineEffect = button.stateGetter('hasShineEffect');\n    this.isEnabled = button.stateGetter('isEnabled');\n    this.isLoaderVisible = button.stateGetter('isLoaderVisible');\n    this.text = button.stateGetter('text');\n    this.isVisible = button.stateGetter('isVisible');\n    this.isMounted = button.isMounted;\n    this.state = button.state;\n\n    [this.setPosition, this.setPositionFp] = button.stateSetters('position');\n    [this.setBgColor, this.setBgColorFp] = button.stateSetters('bgColor');\n    [this.setTextColor, this.setTextColorFp] = button.stateSetters('textColor');\n    [\n      [this.disableShineEffect, this.disableShineEffectFp],\n      [this.enableShineEffect, this.enableShineEffectFp],\n    ] = button.stateBoolSetters('hasShineEffect');\n    [\n      [this.disable, this.disableFp],\n      [this.enable, this.enableFp],\n    ] = button.stateBoolSetters('isEnabled');\n    [\n      [this.hideLoader, this.hideLoaderFp],\n      [this.showLoader, this.showLoaderFp],\n    ] = button.stateBoolSetters('isLoaderVisible');\n\n    [this.setText, this.setTextFp] = button.stateSetters('text');\n    [[this.hide, this.hideFp], [this.show, this.showFp]] = button.stateBoolSetters('isVisible');\n    this.setParams = button.setState;\n    this.setParamsFp = button.setStateFp;\n    this.onClick = button.onClick;\n    this.onClickFp = button.onClickFp;\n    this.offClick = button.offClick;\n    this.offClickFp = button.offClickFp;\n    this.mount = button.mount;\n    this.mountFp = button.mountFp;\n    this.unmount = button.unmount;\n  }\n\n  //#region Properties.\n  /**\n   * Signal indicating if the component is supported.\n   */\n  readonly isSupported: Computed<boolean>;\n\n  /**\n   * The button position relative to the main one.\n   */\n  readonly position: Computed<SecondaryButtonPosition>;\n\n  /**\n   * The button background color.\n   */\n  readonly bgColor: Computed<RGB>;\n\n  /**\n   * True if the button has a shining effect.\n   */\n  readonly hasShineEffect: Computed<boolean>;\n\n  /**\n   * True if the button is clickable.\n   */\n  readonly isEnabled: Computed<boolean>;\n\n  /**\n   * True if the button loader is visible.\n   */\n  readonly isLoaderVisible: Computed<boolean>;\n\n  /**\n   * True if the button is visible.\n   */\n  readonly isVisible: Computed<boolean>;\n\n  /**\n   * Signal indicating if the component is currently mounted.\n   */\n  readonly isMounted: Computed<boolean>;\n\n  /**\n   * The complete button state.\n   */\n  readonly state: Computed<SecondaryButtonState>;\n\n  /**\n   * The button displayed text.\n   */\n  readonly text: Computed<string>;\n\n  /**\n   * The button text color.\n   *\n   * Note that this value is computed based on the external defaults. For\n   * example, if not explicitly set, this value may be equal to one of theme\n   * params colors.\n   */\n  readonly textColor: Computed<RGB>;\n  //#endregion\n\n  //#region Methods.\n  /**\n   * Shows the button.\n   * @since Mini Apps v7.10\n   */\n  readonly showFp: WithChecksFp<() => SecondaryButtonEither, true>;\n\n  /**\n   * @see showFp\n   */\n  readonly show: WithChecks<() => void, true>;\n\n  /**\n   * Hides the button.\n   * @since Mini Apps v7.10\n   */\n  readonly hideFp: WithChecksFp<() => SecondaryButtonEither, true>;\n\n  /**\n   * @see hideFp\n   */\n  readonly hide: WithChecks<() => void, true>;\n\n  /**\n   * Enables the button.\n   * @since Mini Apps v7.10\n   */\n  readonly enableFp: WithChecksFp<() => SecondaryButtonEither, true>;\n\n  /**\n   * @see enableFp\n   */\n  readonly enable: WithChecks<() => void, true>;\n\n  /**\n   * Enables the button.\n   * @since Mini Apps v7.10\n   */\n  readonly enableShineEffectFp: WithChecksFp<() => SecondaryButtonEither, true>;\n\n  /**\n   * @see enableShineEffectFp\n   */\n  readonly enableShineEffect: WithChecks<() => void, true>;\n\n  /**\n   * Disables the button.\n   * @since Mini Apps v7.10\n   */\n  readonly disableFp: WithChecksFp<() => SecondaryButtonEither, true>;\n\n  /**\n   * @see disableFp\n   */\n  readonly disable: WithChecks<() => void, true>;\n\n  /**\n   * Enables the button.\n   * @since Mini Apps v7.10\n   */\n  readonly disableShineEffectFp: WithChecksFp<() => SecondaryButtonEither, true>;\n\n  /**\n   * @see disableShineEffectFp\n   */\n  readonly disableShineEffect: WithChecks<() => void, true>;\n\n  /**\n   * Updates the button background color.\n   * @since Mini Apps v7.10\n   */\n  readonly setBgColorFp: WithChecksFp<(value: RGB) => SecondaryButtonEither, true>;\n\n  /**\n   * @see setBgColorFp\n   */\n  readonly setBgColor: WithChecks<(value: RGB) => void, true>;\n\n  /**\n   * Updates the button text color.\n   * @since Mini Apps v7.10\n   */\n  readonly setTextColorFp: WithChecksFp<(value: RGB) => SecondaryButtonEither, true>;\n\n  /**\n   * @see setTextColorFp\n   */\n  readonly setTextColor: WithChecks<(value: RGB) => void, true>;\n\n  /**\n   * Updates the button text.\n   * @since Mini Apps v7.10\n   */\n  readonly setTextFp: WithChecksFp<(value: string) => SecondaryButtonEither, true>;\n\n  /**\n   * @see setTextFp\n   */\n  readonly setText: WithChecks<(value: string) => void, true>;\n\n  /**\n   * Updates the button position.\n   * @since Mini Apps v7.10\n   */\n  readonly setPositionFp: WithChecksFp<\n    (position: SecondaryButtonPosition) => SecondaryButtonEither,\n    true\n  >;\n\n  /**\n   * @see setPositionFp\n   */\n  readonly setPosition: WithChecks<(position: SecondaryButtonPosition) => void, true>;\n\n  /**\n   * Shows the button loader.\n   * @since Mini Apps v7.10\n   */\n  readonly showLoaderFp: WithChecksFp<() => SecondaryButtonEither, true>;\n\n  /**\n   * @see showLoaderFp\n   */\n  readonly showLoader: WithChecks<() => void, true>;\n\n  /**\n   * Hides the button loader.\n   * @since Mini Apps v7.10\n   */\n  readonly hideLoaderFp: WithChecksFp<() => SecondaryButtonEither, true>;\n\n  /**\n   * @see hideLoaderFp\n   */\n  readonly hideLoader: WithChecks<() => void, true>;\n\n  /**\n   * Updates the button state.\n   * @param state - updates to apply.\n   * @since Mini Apps v7.10\n   * @example\n   * button.setParams({\n   *   text: 'Submit',\n   *   isEnabled: true,\n   *   hasShineEffect: true,\n   * });\n   */\n  readonly setParamsFp: WithChecksFp<\n    (state: Partial<SecondaryButtonState>) => SecondaryButtonEither,\n    true\n  >;\n\n  /**\n   * @see setParamsFp\n   */\n  readonly setParams: WithChecks<(state: Partial<SecondaryButtonState>) => void, true>;\n\n  /**\n   * Mounts the component restoring its state.\n   * @since Mini Apps v7.10\n   */\n  readonly mountFp: WithChecksFp<() => void, true>;\n\n  /**\n   * @see mountFp\n   */\n  readonly mount: WithChecks<() => void, true>;\n\n  /**\n   * Unmounts the component.\n   */\n  readonly unmount: () => void;\n\n  /**\n   * Adds a new button listener.\n   * @param listener - event listener.\n   * @param once - should the listener be called only once.\n   * @returns A function to remove bound listener.\n   * @since Mini Apps v7.10\n   * @example\n   * const off = button.onClick(() => {\n   *   console.log('User clicked the button');\n   *   off();\n   * });\n   */\n  readonly onClickFp: WithChecksFp<(listener: VoidFunction, once?: boolean) => VoidFunction, true>;\n\n  /**\n   * @see onClick\n   */\n  readonly onClick: WithChecks<(listener: VoidFunction, once?: boolean) => VoidFunction, true>;\n\n  /**\n   * Removes the button click listener.\n   * @param listener - event listener.\n   * @param once - should the listener be called only once.\n   * @since Mini Apps v7.10\n   * @example\n   * function listener() {\n   *   console.log('User clicked the button');\n   *   button.offClick(listener);\n   * }\n   * button.onClick(listener);\n   */\n  readonly offClickFp: WithChecksFp<(listener: VoidFunction, once?: boolean) => void, true>;\n\n  /**\n   * @see offClick\n   */\n  readonly offClick: WithChecks<(listener: VoidFunction, once?: boolean) => void, true>;\n  //#endregion\n}\n","import { computed } from '@tma.js/signals';\n\nimport { miniApp } from '@/features/MiniApp/instance.js';\nimport { SecondaryButton } from '@/features/SecondaryButton/SecondaryButton.js';\nimport { themeParams } from '@/features/ThemeParams/instance.js';\nimport { bottomButtonOptions } from '@/fn-options/bottomButtonOptions.js';\n\nfunction instantiate() {\n  return new SecondaryButton(\n    bottomButtonOptions('secondaryButton', 'secondary_button_pressed', {\n      bgColor: computed(() => miniApp.bottomBarColorRgb() || '#000000'),\n      textColor: computed(() => themeParams.buttonColor() || '#2481cc'),\n    }),\n  );\n}\n\nexport const secondaryButton = /* @__PURE__*/ instantiate();\n","import { EventPayload, type MethodParams, type Request2CaptureFn, RequestError } from '@tma.js/bridge';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport { SecureStorageMethodError } from '@/errors.js';\nimport type { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport type { WithCreateRequestId } from '@/fn-options/withCreateRequestId.js';\nimport type { WithRequest } from '@/fn-options/withRequest.js';\nimport type { WithVersion } from '@/fn-options/withVersion.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport {\n  createWithChecksFp,\n  type WithChecks,\n  type WithChecksFp,\n} from '@/with-checks/withChecksFp.js';\n\nexport type SecureStorageError = RequestError | SecureStorageMethodError;\n\nexport interface SecureStorageOptions extends SharedFeatureOptions,\n  WithVersion,\n  WithRequest,\n  WithCreateRequestId {\n}\n\n/**\n * @since Mini Apps v9.0\n */\nexport class SecureStorage {\n  constructor({ isTma, request, version, createRequestId }: SecureStorageOptions) {\n    const wrapSupportedTask = createWithChecksFp({\n      version,\n      requires: 'web_app_secure_storage_get_key',\n      isTma,\n      returns: 'task',\n    });\n\n    const invokeMethod = <\n      M extends (\n        | 'web_app_secure_storage_save_key'\n        | 'web_app_secure_storage_get_key'\n        | 'web_app_secure_storage_restore_key'\n        | 'web_app_secure_storage_save_key'\n        | 'web_app_secure_storage_clear'\n      ),\n      E extends (\n        | 'secure_storage_key_saved'\n        | 'secure_storage_key_received'\n        | 'secure_storage_key_restored'\n        | 'secure_storage_cleared'\n      ),\n    >(\n      method: M,\n      event: E,\n      params: Omit<MethodParams<M>, 'req_id'>,\n    ): TE.TaskEither<SecureStorageError, EventPayload<E>> => {\n      const requestId = createRequestId();\n      return fn.pipe(\n        request<M, ('secure_storage_failed' | E)[]>(method, ['secure_storage_failed', event], {\n          params: { ...params, req_id: requestId },\n          capture: (event => {\n            return 'payload' in event ? event.payload.req_id === requestId : true;\n          }) as Request2CaptureFn<('secure_storage_failed' | E)[]>,\n        }),\n        TE.chain(response => (\n          response.event === 'secure_storage_failed'\n            ? TE.left(new SecureStorageMethodError(response.payload.error || 'UNKNOWN_ERROR'))\n            : TE.right(response.payload as EventPayload<E>)\n        )),\n      );\n    };\n\n    this.getItemFp = wrapSupportedTask(key => {\n      return fn.pipe(\n        invokeMethod('web_app_secure_storage_get_key', 'secure_storage_key_received', { key }),\n        TE.map(payload => ({\n          value: payload.value,\n          canRestore: !!payload.can_restore,\n        })),\n      );\n    });\n    this.setItemFp = wrapSupportedTask((key, value) => {\n      return fn.pipe(\n        invokeMethod('web_app_secure_storage_save_key', 'secure_storage_key_saved', { key, value }),\n        TE.map(() => undefined),\n      );\n    });\n    this.deleteItemFp = wrapSupportedTask(key => {\n      return this.setItemFp(key, null);\n    });\n    this.clearFp = wrapSupportedTask(() => {\n      return fn.pipe(\n        invokeMethod('web_app_secure_storage_clear', 'secure_storage_cleared', {}),\n        TE.map(() => undefined),\n      );\n    });\n    this.restoreItemFp = wrapSupportedTask(key => {\n      return fn.pipe(\n        invokeMethod('web_app_secure_storage_restore_key', 'secure_storage_key_restored', { key }),\n        TE.map(payload => payload.value),\n      );\n    });\n\n    this.getItem = throwifyWithChecksFp(this.getItemFp);\n    this.setItem = throwifyWithChecksFp(this.setItemFp);\n    this.deleteItem = throwifyWithChecksFp(this.deleteItemFp);\n    this.clear = throwifyWithChecksFp(this.clearFp);\n    this.restoreItem = throwifyWithChecksFp(this.restoreItemFp);\n  }\n\n  /**\n    * Retrieves an item using its key.\n    * @since Mini Apps v9.0\n    */\n  readonly getItemFp: WithChecksFp<\n    (key: string) => TE.TaskEither<SecureStorageError, {\n      value: string | null;\n      canRestore: boolean;\n    }>,\n    true\n  >;\n\n  /**\n   * @see getItemFp\n   */\n  readonly getItem: WithChecks<\n    (key: string) => Promise<{ value: string | null; canRestore: boolean }>,\n    true\n  >;\n\n  /**\n   * Restores an item from the storage.\n   * @since Mini Apps v9.0\n   */\n  readonly restoreItemFp: WithChecksFp<\n    (key: string) => TE.TaskEither<SecureStorageError, string | null>,\n    true\n  >;\n\n  /**\n   * @see restoreItemFp\n   */\n  readonly restoreItem: WithChecks<(key: string) => Promise<string | null>, true>;\n\n  /**\n    * Sets a new item in the storage.\n    * @since Mini Apps v9.0\n    */\n  readonly setItemFp: WithChecksFp<\n    (key: string, value: string | null) => TE.TaskEither<SecureStorageError, void>,\n    true\n  >;\n\n  /**\n   * @see setItemFp\n   */\n  readonly setItem: WithChecks<(key: string, value: string | null) => Promise<void>, true>;\n\n  /**\n    * Removes a key from the storage.\n    * @since Mini Apps v9.0\n    */\n  readonly deleteItemFp: WithChecksFp<\n    (key: string) => TE.TaskEither<SecureStorageError, void>,\n    true\n  >;\n\n  /**\n   * @see deleteItemFp\n   */\n  readonly deleteItem: WithChecks<(key: string) => Promise<void>, true>;\n\n  /**\n    * Removes all keys from the storage.\n    * @since Mini Apps v9.0\n    */\n  readonly clearFp: WithChecksFp<() => TE.TaskEither<SecureStorageError, void>, true>;\n\n  /**\n   * @see clearFp\n   */\n  readonly clear: WithChecks<() => Promise<void>, true>;\n}\n","import { function as fn } from 'fp-ts';\n\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withCreateRequestId } from '@/fn-options/withCreateRequestId.js';\nimport { withRequest } from '@/fn-options/withRequest.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\nimport { SecureStorage } from './SecureStorage.js';\n\nfunction instantiate() {\n  return new SecureStorage(fn.pipe(\n    sharedFeatureOptions(),\n    withVersion,\n    withRequest,\n    withCreateRequestId,\n  ));\n}\n\nexport const secureStorage = /* @__PURE__*/ instantiate();\n","import type { PostEventError } from '@tma.js/bridge';\nimport type { Computed } from '@tma.js/signals';\nimport { either as E } from 'fp-ts';\n\nimport { Button, type ButtonOptions } from '@/composables/Button.js';\nimport type { WithChecksFp, WithChecks } from '@/with-checks/withChecksFp.js';\n\nexport interface SettingsButtonState {\n  isVisible: boolean;\n}\n\nexport type SettingsButtonOptions = Omit<\n  ButtonOptions<SettingsButtonState, 'web_app_setup_settings_button'>,\n  'method' | 'payload' | 'initialState'\n>;\n\n/**\n * @since Mini Apps v6.10\n */\nexport class SettingsButton {\n  constructor(options: SettingsButtonOptions) {\n    const button = new Button({\n      ...options,\n      method: 'web_app_setup_settings_button',\n      payload: state => ({ is_visible: state.isVisible }),\n      initialState: { isVisible: false },\n    });\n\n    this.isVisible = button.stateGetter('isVisible');\n    this.isMounted = button.isMounted;\n    this.isSupported = button.isSupported;\n    [[this.hide, this.hideFp], [this.show, this.showFp]] = button.stateBoolSetters('isVisible');\n    this.onClick = button.onClick;\n    this.onClickFp = button.onClickFp;\n    this.offClick = button.offClick;\n    this.offClickFp = button.offClickFp;\n    this.mount = button.mount;\n    this.mountFp = button.mountFp;\n    this.unmount = button.unmount;\n  }\n\n  /**\n   * Signal indicating if the component is currently visible.\n   */\n  readonly isVisible: Computed<boolean>;\n\n  /**\n   * Signal indicating if the component is currently mounted.\n   */\n  readonly isMounted: Computed<boolean>;\n\n  /**\n   * Signal indicating if the component is supported.\n   */\n  readonly isSupported: Computed<boolean>;\n\n  /**\n   * Hides the button.\n   * @since Mini Apps v6.10\n   */\n  readonly hideFp: WithChecksFp<() => E.Either<PostEventError, void>, true>;\n\n  /**\n   * @see hideFp\n   */\n  readonly hide: WithChecks<() => void, true>;\n\n  /**\n   * Shows the button.\n   * @since Mini Apps v6.10\n   */\n  readonly showFp: WithChecksFp<() => E.Either<PostEventError, void>, true>;\n\n  /**\n   * @see showFp\n   */\n  readonly show: WithChecks<() => void, true>;\n\n  /**\n   * Adds a new button listener.\n   * @param listener - event listener.\n   * @param once - should the listener be called only once.\n   * @returns A function to remove bound listener.\n   * @since Mini Apps v6.10\n   * @example\n   * const off = button.onClick(() => {\n   *   console.log('User clicked the button');\n   *   off();\n   * });\n   */\n  readonly onClickFp: WithChecksFp<\n    (listener: VoidFunction, once?: boolean) => VoidFunction,\n    true\n  >;\n\n  /**\n   * @see onClickFp\n   */\n  readonly onClick: WithChecks<(listener: VoidFunction, once?: boolean) => VoidFunction, true>;\n\n  /**\n   * Removes the button click listener.\n   * @param listener - event listener.\n   * @param once - should the listener be called only once.\n   * @since Mini Apps v6.10\n   * @example\n   * function listener() {\n   *   console.log('User clicked the button');\n   *   button.offClick(listener);\n   * }\n   * button.onClick(listener);\n   */\n  readonly offClickFp: WithChecksFp<\n    (listener: VoidFunction, once?: boolean) => void,\n    true\n  >;\n\n  /**\n   * @see offClickFp\n   */\n  readonly offClick: WithChecks<(listener: VoidFunction, once?: boolean) => void, true>;\n\n  /**\n   * Mounts the component restoring its state.\n   * @since Mini Apps v6.10\n   */\n  readonly mountFp: WithChecksFp<() => void, true>;\n\n  /**\n   * @see mountFp\n   */\n  readonly mount: WithChecks<() => void, true>;\n\n  /**\n   * Unmounts the component.\n   *\n   * Note that this function does not remove listeners added via the `onClick`\n   * function, so you have to remove them on your own.\n   * @see onClick\n   */\n  readonly unmount: () => void;\n}\n","import { SettingsButton } from '@/features/SettingsButton/SettingsButton.js';\nimport { buttonOptions } from '@/fn-options/buttonOptions.js';\n\nexport const settingsButton = /* @__PURE__*/ new SettingsButton(\n  buttonOptions('settingsButton', 'settings_button_pressed'),\n);\n","import type { PostEventError } from '@tma.js/bridge';\nimport type { Computed } from '@tma.js/signals';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport { Mountable } from '@/composables/Mountable.js';\nimport { Stateful } from '@/composables/Stateful.js';\nimport type { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport type { WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport type { WithStateRestore } from '@/fn-options/withStateRestore.js';\nimport type { WithVersion } from '@/fn-options/withVersion.js';\nimport { createIsSupportedSignal } from '@/helpers/createIsSupportedSignal.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { createWithChecksFp, type WithChecks, type WithChecksFp } from '@/with-checks/withChecksFp.js';\n\nexport interface SwipeBehaviorState {\n  isVerticalEnabled: boolean;\n}\n\nexport interface SwipeBehaviorOptions\n  extends WithStateRestore<SwipeBehaviorState>,\n  WithVersion,\n  WithPostEvent,\n  SharedFeatureOptions {\n}\n\n/**\n * @since Mini Apps v7.7\n */\nexport class SwipeBehavior {\n  constructor({ postEvent, storage, isTma, isPageReload, version }: SwipeBehaviorOptions) {\n    const initialState = { isVerticalEnabled: true };\n    const stateful = new Stateful({\n      initialState,\n      onChange(state) {\n        storage.set(state);\n      },\n    });\n    const mountable = new Mountable({\n      initialState,\n      isPageReload,\n      onMounted: stateful.setState,\n      restoreState: storage.get,\n    });\n\n    const wrapOptions = { requires: 'web_app_setup_swipe_behavior', isTma, version } as const;\n    const wrapSupportedPlain = createWithChecksFp({\n      ...wrapOptions,\n      returns: 'plain',\n    });\n    const wrapMountedEither = createWithChecksFp({\n      ...wrapOptions,\n      isMounted: mountable.isMounted,\n      returns: 'either',\n    });\n\n    const setVerticalEnabled = (isVerticalEnabled: boolean) => {\n      const update = { isVerticalEnabled };\n      if (!stateful.hasDiff(update)) {\n        return E.right(undefined);\n      }\n      return fn.pipe(\n        postEvent('web_app_setup_swipe_behavior', { allow_vertical_swipe: isVerticalEnabled }),\n        E.map(() => {\n          stateful.setState(update);\n        }),\n      );\n    };\n\n    this.isSupported = createIsSupportedSignal('web_app_setup_swipe_behavior', version);\n    this.isVerticalEnabled = stateful.getter('isVerticalEnabled');\n    this.isMounted = mountable.isMounted;\n    this.disableVerticalFp = wrapMountedEither(() => {\n      return setVerticalEnabled(false);\n    });\n    this.enableVerticalFp = wrapMountedEither(() => {\n      return setVerticalEnabled(true);\n    });\n    this.mountFp = wrapSupportedPlain(() => {\n      const nothing = () => undefined;\n      return fn.pipe(mountable.mount(), E.match(nothing, nothing));\n    });\n    this.unmount = mountable.unmount;\n\n    this.disableVertical = throwifyWithChecksFp(this.disableVerticalFp);\n    this.enableVertical = throwifyWithChecksFp(this.enableVerticalFp);\n    this.mount = throwifyWithChecksFp(this.mountFp);\n  }\n\n  /**\n   * Signal indicating if the component is supported.\n   */\n  readonly isSupported: Computed<boolean>;\n\n  /**\n   * Signal indicating if vertical swipes are enabled.\n   */\n  readonly isVerticalEnabled: Computed<boolean>;\n\n  /**\n   * Signal indicating if the component is currently mounted.\n   */\n  readonly isMounted: Computed<boolean>;\n\n  /**\n   * Mounts the component restoring its state.\n   * @since Mini Apps v7.7\n   */\n  readonly mountFp: WithChecksFp<() => void, true>;\n\n  /**\n   * @see mountFp\n   */\n  readonly mount: WithChecks<() => void, true>;\n\n  /**\n   * Unmounts the component.\n   */\n  readonly unmount: () => void;\n\n  /**\n   * Disables the closing confirmation dialog.\n   * @since Mini Apps v7.7\n   */\n  readonly disableVerticalFp: WithChecksFp<() => E.Either<PostEventError, void>, true>;\n\n  /**\n   * @see disableVerticalFp\n   */\n  readonly disableVertical: WithChecks<() => void, true>;\n\n  /**\n   * Enables the closing confirmation dialog.\n   * @since Mini Apps v7.7\n   */\n  readonly enableVerticalFp: WithChecksFp<() => E.Either<PostEventError, void>, true>;\n\n  /**\n   * @see enableVerticalFp\n   */\n  readonly enableVertical: WithChecks<() => void, true>;\n}\n","import { function as fn } from 'fp-ts';\n\nimport { SwipeBehavior, type SwipeBehaviorState } from '@/features/SwipeBehavior/SwipeBehavior.js';\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withStateRestore } from '@/fn-options/withStateRestore.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\nfunction instantiate() {\n  return new SwipeBehavior(fn.pipe(\n    sharedFeatureOptions(),\n    withPostEvent,\n    withVersion,\n    withStateRestore<SwipeBehaviorState>('swipeBehavior'),\n  ));\n}\n\nexport const swipeBehavior = /* @__PURE__*/ instantiate();\n","/**\n * Copies specified text to the clipboard.\n * @param text - text to copy.\n */\nexport async function copyTextToClipboard(text: string): Promise<void> {\n  try {\n    const { clipboard } = navigator;\n    if (clipboard) {\n      return await clipboard.writeText(text);\n    }\n  } catch {\n  }\n  const textArea = document.createElement('textarea');\n  textArea.value = text;\n\n  // Avoid scrolling to bottom\n  textArea.style.top = '0';\n  textArea.style.left = '0';\n  textArea.style.position = 'fixed';\n\n  document.body.appendChild(textArea);\n  textArea.focus();\n  textArea.select();\n\n  try {\n    document.execCommand('copy');\n  } finally {\n    document.body.removeChild(textArea);\n  }\n}\n","import { RequestError } from '@tma.js/bridge';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport { AccessDeniedError } from '@/errors.js';\nimport {\n  sharedFeatureOptions,\n  type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withRequest, type WithRequest } from '@/fn-options/withRequest.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithRequest, WithVersion {\n}\n\nexport type DownloadFileError = RequestError | AccessDeniedError;\n\nfunction create({ request, ...rest }: CreateOptions) {\n  return withChecksFp((\n    url: string,\n    fileName: string,\n    options?: AsyncOptions,\n  ): TE.TaskEither<DownloadFileError, void> => {\n    return fn.pipe(\n      request(\n        'web_app_request_file_download',\n        'file_download_requested',\n        { ...options, params: { url, file_name: fileName } },\n      ),\n      TE.chain(response => {\n        return response.status === 'downloading'\n          ? TE.right(undefined)\n          : TE.left(new AccessDeniedError('User denied the action'));\n      }),\n    );\n  }, { ...rest, requires: 'web_app_request_file_download', returns: 'task' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n  return create(fn.pipe(\n    sharedFeatureOptions(),\n    withRequest,\n    withVersion,\n  ));\n}\n\n/**\n * Displays a native popup prompting the user to download a file.\n * @param url - the HTTPS URL of the file to be downloaded.\n * @param file - the suggested name for the downloaded file.\n * @param options - additional request execution options.\n * @since Mini Apps v8.0\n * @example\n * fn.pipe(\n *   downloadFileFp('https://telegram.org/js/telegram-web-app.js', 'telegram-sdk.js'),\n *   TE.map(() => {\n *     console.log('Downloading');\n *   })\n * )\n */\nexport const downloadFileFp = instantiate();\n\nexport const downloadFile = throwifyWithChecksFp(downloadFileFp);\n","import { taskEither as TE, function as fn } from 'fp-ts';\nimport { date, integer, number, transform, pipe as valiPipe, safeParse } from 'valibot';\n\nimport { ValidationError } from '@/errors.js';\nimport {\n  type SharedFeatureOptions,\n  sharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport {\n  type WithInvokeCustomMethod,\n  withInvokeCustomMethod,\n  type InvokeCustomMethodError,\n} from '@/fn-options/withInvokeCustomMethod.js';\nimport { type WithVersion, withVersion } from '@/fn-options/withVersion.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithInvokeCustomMethod, WithVersion {\n}\n\nexport type GetCurrentTimeError = InvokeCustomMethodError | ValidationError;\n\nfunction create({ invokeCustomMethod, ...rest }: CreateOptions) {\n  return withChecksFp((options?: AsyncOptions): TE.TaskEither<GetCurrentTimeError, Date> => {\n    return fn.pipe(\n      invokeCustomMethod('getCurrentTime', {}, options),\n      TE.chain(response => {\n        const parsed = safeParse(\n          valiPipe(number(), integer(), transform(v => new Date(v * 1000)), date()),\n          response,\n        );\n        return parsed.success\n          ? TE.right(parsed.output)\n          : TE.left(new ValidationError(response, parsed.issues));\n      }),\n    );\n  }, { ...rest, requires: 'web_app_invoke_custom_method', returns: 'task' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n  return create(fn.pipe(\n    sharedFeatureOptions(),\n    withInvokeCustomMethod,\n    withVersion,\n  ));\n}\n\n/**\n * @returns The current time according to the Telegram server time.\n * @param options - additional options.\n * @since Mini Apps v6.9\n */\nexport const getCurrentTimeFp = instantiate();\n\n/**\n * @see getCurrentTimeFp\n */\nexport const getCurrentTime = throwifyWithChecksFp(getCurrentTimeFp);\n","import type { PostEventError } from '@tma.js/bridge';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport {\n  sharedFeatureOptions,\n  type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent, type WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithPostEvent, WithVersion {\n}\n\nexport type HideKeyboardError = PostEventError;\n\nfunction create({ postEvent, ...rest }: CreateOptions) {\n  return withChecksFp((): E.Either<HideKeyboardError, void> => {\n    return postEvent('web_app_hide_keyboard');\n  }, { ...rest, returns: 'either', requires: 'web_app_hide_keyboard' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n  return create(fn.pipe(\n    sharedFeatureOptions(),\n    withPostEvent,\n    withVersion,\n  ));\n}\n\n/**\n * Hides the on-screen keyboard, if it is currently visible. Does nothing if the keyboard is\n * not active.\n * @since Mini Apps v9.1\n */\nexport const hideKeyboardFp = instantiate();\n\n/**\n * @see hideKeyboardFp\n */\nexport const hideKeyboard = throwifyWithChecksFp(hideKeyboardFp);\n","import { captureSameReq, type RequestError } from '@tma.js/bridge';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport {\n  sharedFeatureOptions,\n  type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withRequest, type WithRequest } from '@/fn-options/withRequest.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport { createRequestId } from '@/globals/createRequestId.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithVersion, WithRequest {\n  createRequestId: () => string;\n}\n\nexport type ReadTextFromClipboardError = RequestError;\n\nfunction create({ request, createRequestId, ...rest }: CreateOptions) {\n  return withChecksFp((\n    options?: AsyncOptions,\n  ): TE.TaskEither<ReadTextFromClipboardError, string | null> => {\n    const reqId = createRequestId();\n    return fn.pipe(\n      request('web_app_read_text_from_clipboard', 'clipboard_text_received', {\n        ...options,\n        params: { req_id: reqId },\n        capture: captureSameReq(reqId),\n      }),\n      TE.map(({ data = null }) => data),\n    );\n  }, { ...rest, requires: 'web_app_read_text_from_clipboard', returns: 'task' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n  return create({\n    ...fn.pipe(\n      sharedFeatureOptions(),\n      withVersion,\n      withRequest,\n    ),\n    createRequestId,\n  });\n}\n\n/**\n * Reads a text from the clipboard and returns a `string` or `null`. `null` is returned\n * in one of the following cases:\n * - A value in the clipboard is not a text.\n * - Access to the clipboard is not granted.\n * @since Mini Apps v6.4\n */\nexport const readTextFromClipboardFp = instantiate();\n\nexport const readTextFromClipboard = throwifyWithChecksFp(readTextFromClipboardFp);\n","export interface AndroidDeviceData {\n  appVersion?: string;\n  manufacturer?: string;\n  model?: string;\n  androidVersion?: string;\n  sdkVersion?: number;\n  performanceClass?: 'LOW' | 'AVERAGE' | 'HIGH' | string;\n}\n\n/**\n * Retrieves Android device data from the specified User Agent.\n * @see https://core.telegram.org/bots/webapps#additional-data-in-user-agent\n * @param userAgent - user agent.\n */\nexport function retrieveAndroidDeviceDataFrom(userAgent: string): AndroidDeviceData {\n  const result: AndroidDeviceData = {};\n  const match = userAgent.match(/Telegram-Android(?:\\/([^ ]+))?(?: (\\([^)]+\\))?|$)/);\n  if (match) {\n    const [, appVersion, systemInfo] = match;\n    appVersion && (result.appVersion = appVersion);\n    systemInfo && systemInfo\n      .slice(1, systemInfo.length - 1)\n      .split(';')\n      .forEach(item => {\n        const [key, value] = item.trim().split(' ');\n        if (key === 'Android') {\n          result.androidVersion = value;\n        } else if (key === 'SDK') {\n          const parsed = parseInt(value, 10);\n          parsed && (result.sdkVersion = parsed);\n        } else if (value) {\n          result.manufacturer = key;\n          result.model = value;\n        } else {\n          result.performanceClass = key;\n        }\n      });\n  }\n  return result;\n}\n","import {\n  type AndroidDeviceData,\n  retrieveAndroidDeviceDataFrom,\n} from './retrieveAndroidDeviceDataFrom.js';\n\n/**\n * Retrieves Android device data from the navigator.userAgent.\n * @see https://core.telegram.org/bots/webapps#additional-data-in-user-agent\n */\nexport function retrieveAndroidDeviceData(): AndroidDeviceData {\n  return retrieveAndroidDeviceDataFrom(navigator.userAgent);\n}\n","import type { PostEventError } from '@tma.js/bridge';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport { InvalidArgumentsError } from '@/errors.js';\nimport {\n  sharedFeatureOptions,\n  type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent, type WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithPostEvent {\n}\n\nexport type SendDataError = PostEventError | InvalidArgumentsError;\n\nfunction create({ postEvent, ...rest }: CreateOptions) {\n  return withChecksFp((data: string): E.Either<SendDataError, void> => {\n    const { size } = new Blob([data]);\n    if (!size || size > 4096) {\n      return E.left(\n        new InvalidArgumentsError(size\n          ? 'Maximum size of data to send is 4096 bytes'\n          : 'Attempted to send empty data'),\n      );\n    }\n    return postEvent('web_app_data_send', { data });\n  }, { ...rest, returns: 'either' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n  return create(fn.pipe(sharedFeatureOptions(), withPostEvent));\n}\n\n/**\n * Sends data to the bot.\n *\n * When this method called, a service message sent to the bot containing the data of the length\n * up to 4096 bytes, and the Mini App closed.\n *\n * See the field `web_app_data` in the class [Message](https://core.telegram.org/bots/api#message).\n *\n * This method is only available for Mini Apps launched via a Keyboard button.\n * @param data - data to send to bot.\n */\nexport const sendDataFp = instantiate();\n\n/**\n * @see sendDataFp\n */\nexport const sendData = throwifyWithChecksFp(sendDataFp);\n","import { RequestError } from '@tma.js/bridge';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport { ShareMessageError } from '@/errors.js';\nimport {\n  sharedFeatureOptions,\n  type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withRequest, type WithRequest } from '@/fn-options/withRequest.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithRequest, WithVersion {\n}\n\nexport type ShareMessageFnError = RequestError | ShareMessageError;\n\nfunction create({ request, ...rest }: CreateOptions) {\n  return withChecksFp((\n    messageId: string,\n    options?: AsyncOptions,\n  ): TE.TaskEither<ShareMessageFnError, void> => {\n    return fn.pipe(\n      request(\n        'web_app_send_prepared_message',\n        ['prepared_message_failed', 'prepared_message_sent'],\n        {\n          ...options,\n          params: { id: messageId },\n        },\n      ),\n      TE.chain(response => (\n        response.event === 'prepared_message_failed'\n          ? TE.left(new ShareMessageError(response.payload.error))\n          : TE.right(undefined)\n      )),\n    );\n  }, { ...rest, requires: 'web_app_send_prepared_message', returns: 'task' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n  return create(fn.pipe(\n    sharedFeatureOptions(),\n    withRequest,\n    withVersion,\n  ));\n}\n\n/**\n * Opens a dialog allowing the user to share a message provided by the bot.\n * @since Mini Apps v8.0\n */\nexport const shareMessageFp = instantiate();\n\n/**\n * @see shareMessageFp\n */\nexport const shareMessage = throwifyWithChecksFp(shareMessageFp);\n","import type { PostEventError } from '@tma.js/bridge';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport {\n  sharedFeatureOptions,\n  type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent, type WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithPostEvent, WithVersion {\n}\n\nexport interface ShareStoryOptions {\n  /**\n   * The caption to be added to the media.\n   * 0-200 characters for regular users and 0-2048 characters for premium subscribers.\n   * @see https://telegram.org/faq_premium#telegram-premium\n   */\n  text?: string;\n  /**\n   * An object that describes a widget link to be included in the story.\n   * Note that only premium subscribers can post stories with links.\n   * @see https://telegram.org/faq_premium#telegram-premium\n   */\n  widgetLink?: {\n    /**\n     * The URL to be included in the story.\n     */\n    url: string;\n    /**\n     * The name to be displayed for the widget link, 0-48 characters.\n     */\n    name?: string;\n  };\n}\n\nexport type ShareStoryError = PostEventError;\n\nfunction create({ postEvent, ...rest }: CreateOptions) {\n  return withChecksFp((\n    mediaUrl: string,\n    options: ShareStoryOptions = {},\n  ): E.Either<ShareStoryError, void> => {\n    return postEvent('web_app_share_to_story', {\n      text: options.text,\n      media_url: mediaUrl,\n      widget_link: options.widgetLink,\n    });\n  }, { ...rest, requires: 'web_app_share_to_story', returns: 'either' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n  return create(fn.pipe(\n    sharedFeatureOptions(),\n    withPostEvent,\n    withVersion,\n  ));\n}\n\n/**\n * Opens the native story editor.\n * @since Mini Apps v7.8\n * @example\n * fn.pipe(\n *   shareStory('https://example.com/background.png', {\n *     text: 'Look at this cool group!',\n *     widgetLink: {\n *       url: 'https://t.me/heyqbnk',\n *       name: 'Vlad\\'s community',\n *     },\n *   }),\n *   TE.match(error => {\n *     console.error('Something went wrong', error);\n *   }, () => {\n *     console.log('Call was successful');\n *   }),\n * );\n */\nexport const shareStoryFp = instantiate();\n\n/**\n * @see shareStoryFp\n */\nexport const shareStory = throwifyWithChecksFp(shareStoryFp);\n","import { createSignal } from '@/globals/signals-registry.js';\n\n/**\n * True if the application is launched in inline mode.\n */\nexport const isInlineMode = createSignal(false);\n","import type { PostEventError, SwitchInlineQueryChatType } from '@tma.js/bridge';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport {\n  sharedFeatureOptions,\n  type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent, type WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport { isInlineMode } from '@/globals/isInlineMode.js';\nimport { access } from '@/helpers/access.js';\nimport type { MaybeAccessor } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithPostEvent, WithVersion {\n  isInlineMode: MaybeAccessor<boolean>;\n}\n\nexport type SwitchInlineQueryError = PostEventError;\n\nfunction create({ isInlineMode, postEvent, ...rest }: CreateOptions) {\n  return withChecksFp((\n    query: string,\n    chatTypes?: SwitchInlineQueryChatType[],\n  ): E.Either<SwitchInlineQueryError, void> => {\n    return postEvent('web_app_switch_inline_query', {\n      query: query,\n      chat_types: chatTypes || [],\n    });\n  }, {\n    ...rest,\n    requires: {\n      every: ['web_app_switch_inline_query', () => {\n        return access(isInlineMode)\n          ? undefined\n          : 'The application must be launched in the inline mode';\n      }],\n    },\n    returns: 'either',\n  });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n  return create({\n    ...fn.pipe(\n      sharedFeatureOptions(),\n      withPostEvent,\n      withVersion,\n    ),\n    isInlineMode,\n  });\n}\n\n/**\n * Inserts the bot's username and the specified inline query in the current chat's input field.\n * Query may be empty, in which case only the bot's username will be inserted. The client prompts\n * the user to choose a specific chat, then opens that chat and inserts the bot's username and\n * the specified inline query in the input field.\n * @param query - text which should be inserted in the input after the current bot name. Max\n * length is 256 symbols.\n * @param chatTypes - List of chat types which could be chosen to send the message. Could be an\n * empty list.\n * @since Mini Apps v6.7\n * @example\n * fn.pipe(\n *   switchInlineQuery('my query goes here', ['users']),\n *   E.match(error => {\n *     console.error('Something went wrong', error);\n *   }, () => {\n *     console.log('Call was successful');\n *   }),\n * );\n */\nexport const switchInlineQueryFp = instantiate();\n\n/**\n * @see switchInlineQueryFp\n */\nexport const switchInlineQuery = throwifyWithChecksFp(switchInlineQueryFp);\n","import {\n  type SafeAreaInsets,\n  type EventListener,\n  supports,\n  type RequestError,\n  type PostEventError,\n} from '@tma.js/bridge';\nimport { Computed, computed, signal } from '@tma.js/signals';\nimport { camelToKebab } from '@tma.js/toolkit';\nimport { BetterPromise } from 'better-promises';\nimport { either as E, taskEither as TE, function as fn } from 'fp-ts';\n\nimport { AsyncMountable } from '@/composables/AsyncMountable.js';\nimport { Stateful } from '@/composables/Stateful.js';\nimport { CSSVarsBoundError, FullscreenFailedError } from '@/errors.js';\nimport { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport { WithRequest } from '@/fn-options/withRequest.js';\nimport { WithStateRestore } from '@/fn-options/withStateRestore.js';\nimport { WithVersion } from '@/fn-options/withVersion.js';\nimport { access } from '@/helpers/access.js';\nimport { deleteCssVar, setCssVar } from '@/helpers/css-vars.js';\nimport { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { createWithChecksFp, WithChecks, WithChecksFp } from '@/with-checks/withChecksFp.js';\n\ntype FullscreenError = FullscreenFailedError | RequestError;\ntype ViewportChangedEventListener = EventListener<'viewport_changed'>;\ntype FullscreenChangedEventListener = EventListener<'fullscreen_changed'>;\ntype SafeAreaInsetsChangedEventListener = EventListener<'safe_area_changed'>;\ntype SafeAreaInsetCSSVarKey = `safeAreaInset${Capitalize<keyof SafeAreaInsets>}`;\n\nexport type GetCSSVarNameKey =\n  | 'width'\n  | 'height'\n  | 'stableHeight'\n  | SafeAreaInsetCSSVarKey\n  | `content${Capitalize<SafeAreaInsetCSSVarKey>}`;\n\nexport type GetCSSVarNameFn = (key: GetCSSVarNameKey) => string | null | undefined | false;\n\nexport interface ViewportState {\n  contentSafeAreaInsets: SafeAreaInsets;\n  height: number;\n  isExpanded: boolean;\n  isFullscreen: boolean;\n  safeAreaInsets: SafeAreaInsets;\n  stableHeight: number;\n  width: number;\n}\n\ntype WithListeners<On extends string, Off extends string, L> = {\n  [K in On | Off]: (listener: L) => void;\n};\n\nexport interface ViewportOptions<EViewportStable, EFullscreen>\n  extends WithStateRestore<ViewportState>,\n  WithVersion,\n  WithRequest,\n  WithPostEvent,\n  WithListeners<'onViewportChanged', 'offViewportChanged', ViewportChangedEventListener>,\n  WithListeners<'onFullscreenChanged', 'offFullscreenChanged', FullscreenChangedEventListener>,\n  WithListeners<'onSafeAreaInsetsChanged', 'offSafeAreaInsetsChanged', SafeAreaInsetsChangedEventListener>,\n  WithListeners<'onContentSafeAreaInsetsChanged', 'offContentSafeAreaInsetsChanged', SafeAreaInsetsChangedEventListener>,\n  SharedFeatureOptions {\n  /**\n   * True if the viewport is stable.\n   */\n  isViewportStable: boolean | (() => E.Either<EViewportStable, boolean>);\n  /**\n   * True if the application was opened in fullscreen initially.\n   */\n  isFullscreen: boolean | (() => E.Either<EFullscreen, boolean>);\n}\n\nexport class Viewport<EViewportStable, EFullscreen> {\n  constructor({\n    storage,\n    isPageReload,\n    onContentSafeAreaInsetsChanged,\n    onSafeAreaInsetsChanged,\n    onViewportChanged,\n    onFullscreenChanged,\n    offContentSafeAreaInsetsChanged,\n    offFullscreenChanged,\n    offSafeAreaInsetsChanged,\n    offViewportChanged,\n    request,\n    isViewportStable,\n    isFullscreen,\n    isTma,\n    version,\n    postEvent,\n  }: ViewportOptions<EViewportStable, EFullscreen>) {\n    const initialInsets: SafeAreaInsets = { top: 0, right: 0, left: 0, bottom: 0 };\n    const stateful = new Stateful<ViewportState>({\n      initialState: {\n        contentSafeAreaInsets: initialInsets,\n        height: 0,\n        isExpanded: false,\n        isFullscreen: false,\n        safeAreaInsets: initialInsets,\n        stableHeight: 0,\n        width: 0,\n      },\n      onChange: storage.set,\n    });\n\n    const viewportChangedListener: ViewportChangedEventListener = event => {\n      stateful.setState({\n        isExpanded: event.is_expanded,\n        height: event.height,\n        width: event.width,\n        stableHeight: event.is_state_stable ? event.height : undefined,\n      });\n    };\n    const fullscreenChangedListener: FullscreenChangedEventListener = event => {\n      stateful.setState({ isFullscreen: event.is_fullscreen });\n    };\n    const safeAreaInsetsChangedListener: SafeAreaInsetsChangedEventListener = event => {\n      stateful.setState({ safeAreaInsets: event });\n    };\n    const contentSafeAreaInsetsChangedListener: SafeAreaInsetsChangedEventListener = event => {\n      stateful.setState({ contentSafeAreaInsets: event });\n    };\n\n    const mountable = new AsyncMountable({\n      initialState(options) {\n        const genRequestInsets = (kind: 'safe-area' | 'content-safe-area') => {\n          return () => {\n            const [method, event] = kind === 'safe-area'\n              ? ['web_app_request_safe_area', 'safe_area_changed'] as const\n              : ['web_app_request_content_safe_area', 'content_safe_area_changed'] as const;\n\n            if (!supports(method, access(version))) {\n              return TE.right({ top: 0, left: 0, right: 0, bottom: 0 });\n            }\n            return request(method, event, options);\n          };\n        };\n        const genFlag = <E>(flag: boolean | (() => E.Either<E, boolean>)) => {\n          return () => (\n            typeof flag === 'boolean'\n              ? TE.right(flag)\n              : TE.fromEither(flag())\n          );\n        };\n\n        return fn.pipe(\n          TE.Do,\n          TE.bindW('safeAreaInsets', genRequestInsets('safe-area')),\n          TE.bindW('contentSafeAreaInsets', genRequestInsets('content-safe-area')),\n          TE.bindW('isFullscreen', genFlag(isFullscreen)),\n          TE.bindW('isViewportStable', genFlag(isViewportStable)),\n          TE.chainW(({ isViewportStable, ...shared }) => {\n            if (isViewportStable) {\n              return TE.right({\n                ...shared,\n                height: window.innerHeight,\n                isExpanded: true,\n                stableHeight: window.innerHeight,\n                width: window.innerWidth,\n              });\n            }\n            return fn.pipe(\n              request('web_app_request_viewport', 'viewport_changed', options),\n              TE.map(viewport => ({\n                ...shared,\n                height: viewport.height,\n                isExpanded: viewport.is_expanded,\n                stableHeight: viewport.is_state_stable ? viewport.height : 0,\n                width: viewport.width,\n              })),\n            );\n          }),\n        );\n      },\n      isPageReload,\n      onMounted(state) {\n        onViewportChanged(viewportChangedListener);\n        onFullscreenChanged(fullscreenChangedListener);\n        onSafeAreaInsetsChanged(safeAreaInsetsChangedListener);\n        onContentSafeAreaInsetsChanged(contentSafeAreaInsetsChangedListener);\n        stateful.setState(state);\n      },\n      onUnmounted() {\n        offViewportChanged(viewportChangedListener);\n        offFullscreenChanged(fullscreenChangedListener);\n        offSafeAreaInsetsChanged(safeAreaInsetsChangedListener);\n        offContentSafeAreaInsetsChanged(contentSafeAreaInsetsChangedListener);\n      },\n      restoreState: storage.get,\n    });\n\n    const saBased = <K extends keyof SafeAreaInsets>(key: K) => {\n      return computed(() => this.safeAreaInsets()[key]);\n    };\n    const csaBased = <K extends keyof SafeAreaInsets>(key: K) => {\n      return computed(() => this.contentSafeAreaInsets()[key]);\n    };\n\n    this.state = stateful.state;\n    this.height = stateful.getter('height');\n    this.stableHeight = stateful.getter('stableHeight');\n    this.width = stateful.getter('width');\n    this.isExpanded = stateful.getter('isExpanded');\n    this.safeAreaInsets = stateful.getter('safeAreaInsets');\n    this.safeAreaInsetTop = saBased('top');\n    this.safeAreaInsetBottom = saBased('bottom');\n    this.safeAreaInsetLeft = saBased('left');\n    this.safeAreaInsetRight = saBased('right');\n    this.contentSafeAreaInsets = stateful.getter('contentSafeAreaInsets');\n    this.contentSafeAreaInsetTop = csaBased('top');\n    this.contentSafeAreaInsetBottom = csaBased('bottom');\n    this.contentSafeAreaInsetLeft = csaBased('left');\n    this.contentSafeAreaInsetRight = csaBased('right');\n\n    const wrapTask = createWithChecksFp({ isTma, returns: 'task' });\n    const wrapMountedEither = createWithChecksFp({\n      isTma,\n      returns: 'either',\n    });\n    const wrapFullscreenTask = createWithChecksFp({\n      isTma,\n      requires: 'web_app_request_fullscreen',\n      version,\n      returns: 'task',\n    });\n    const genFullscreenFn = (enable: boolean) => {\n      return wrapFullscreenTask((options?: AsyncOptions) => {\n        return fn.pipe(\n          request(\n            enable ? 'web_app_request_fullscreen' : 'web_app_exit_fullscreen',\n            ['fullscreen_changed', 'fullscreen_failed'],\n            options,\n          ),\n          TE.chain(response => {\n            if (\n              response.event === 'fullscreen_failed'\n              && response.payload.error !== 'ALREADY_FULLSCREEN'\n            ) {\n              return TE.left(new FullscreenFailedError(response.payload.error));\n            }\n            stateful.setState({\n              isFullscreen: 'is_fullscreen' in response.payload\n                ? response.payload.is_fullscreen\n                : true,\n            });\n            return TE.right(undefined);\n          }),\n        );\n      });\n    };\n\n    // Mount.\n    this.isMounted = mountable.isMounted;\n    this.mountFp = wrapTask(mountable.mount);\n    this.mount = throwifyWithChecksFp(this.mountFp);\n\n    // Fullscreen.\n    this.isFullscreen = stateful.getter('isFullscreen');\n    this.requestFullscreenFp = genFullscreenFn(true);\n    this.requestFullscreen = throwifyWithChecksFp(this.requestFullscreenFp);\n    this.exitFullscreenFp = genFullscreenFn(false);\n    this.exitFullscreen = throwifyWithChecksFp(this.exitFullscreenFp);\n\n    // CSS vars.\n    const isCssVarsBound = signal(false);\n    this.isCssVarsBound = computed(isCssVarsBound);\n    this.bindCssVarsFp = wrapMountedEither(\n      (getCSSVarName?: GetCSSVarNameFn) => {\n        if (isCssVarsBound()) {\n          return E.left(new CSSVarsBoundError());\n        }\n        getCSSVarName ||= prop => `--tg-viewport-${camelToKebab(prop)}`;\n\n        const settings = ([\n          ['height', this.height],\n          ['stableHeight', this.stableHeight],\n          ['width', this.width],\n          ['safeAreaInsetTop', this.safeAreaInsetTop],\n          ['safeAreaInsetBottom', this.safeAreaInsetBottom],\n          ['safeAreaInsetLeft', this.safeAreaInsetLeft],\n          ['safeAreaInsetRight', this.safeAreaInsetRight],\n          ['contentSafeAreaInsetTop', this.contentSafeAreaInsetTop],\n          ['contentSafeAreaInsetBottom', this.contentSafeAreaInsetBottom],\n          ['contentSafeAreaInsetLeft', this.contentSafeAreaInsetLeft],\n          ['contentSafeAreaInsetRight', this.contentSafeAreaInsetRight],\n        ] as const).reduce<{\n          update: VoidFunction;\n          removeListener: VoidFunction;\n          cssVar: string;\n        }[]>((acc, [key, signal]) => {\n          const cssVar = getCSSVarName(key);\n          if (cssVar) {\n            const update = () => {\n              setCssVar(cssVar, `${signal()}px`);\n            };\n            acc.push({ update, removeListener: signal.sub(update), cssVar });\n          }\n          return acc;\n        }, []);\n\n        settings.forEach(setting => {\n          setting.update();\n        });\n        isCssVarsBound.set(true);\n\n        return E.right(() => {\n          settings.forEach(s => {\n            s.removeListener();\n            deleteCssVar(s.cssVar);\n          });\n          isCssVarsBound.set(false);\n        });\n      },\n    );\n    this.bindCssVars = throwifyWithChecksFp(this.bindCssVarsFp);\n\n    // Other methods.\n    this.expandFp = wrapMountedEither(() => postEvent('web_app_expand'));\n    this.expand = throwifyWithChecksFp(this.expandFp);\n  }\n\n  //#region Other properties.\n  /**\n   * Complete component state.\n   */\n  readonly state: Computed<ViewportState>;\n\n  /**\n   * Signal containing the current height of the **visible area** of the Mini App.\n   *\n   * The application can display just the top part of the Mini App, with its\n   * lower part remaining outside the screen area. From this position, the user\n   * can \"pull\" the Mini App to its maximum height, while the bot can do the same\n   * by calling `expand` method. As the position of the Mini App changes, the\n   * current height value of the visible area will be updated  in real time.\n   *\n   * Please note that the refresh rate of this value is not sufficient to\n   * smoothly follow the lower border of the window. It should not be used to pin\n   * interface elements to the bottom of the visible area. It's more appropriate\n   * to use the value of the `stableHeight` field for this purpose.\n   *\n   * @see stableHeight\n   */\n  readonly height: Computed<number>;\n\n  /**\n   * Signal containing the height of the visible area of the Mini App in its last stable state.\n   *\n   * The application can display just the top part of the Mini App, with its\n   * lower part remaining outside the screen area. From this position, the user\n   * can \"pull\" the Mini App to its maximum height, while the application can do\n   * the same by calling `expand` method.\n   *\n   * Unlike the value of `height`, the value of `stableHeight` does not change as\n   * the position of the Mini App changes with user gestures or during\n   * animations. The value of `stableHeight` will be updated after all gestures\n   * and animations are completed and the Mini App reaches its final size.\n   *\n   * @see height\n   */\n  readonly stableHeight: Computed<number>;\n\n  /**\n   * Signal containing the currently visible area width.\n   */\n  readonly width: Computed<number>;\n\n  /**\n   * Signal indicating if the Mini App is expanded to the maximum available height. Otherwise,\n   * if the Mini App occupies part of the screen and can be expanded to the full\n   * height using the `expand` method.\n   */\n  readonly isExpanded: Computed<boolean>;\n\n  /**\n   * Signal indicating if the current viewport height is stable and is not going to change in\n   * the next moment.\n   */\n  readonly isStable = computed(() => this.height() === this.stableHeight());\n  //#endregion\n\n  //#region Content safe area insets.\n  /**\n   * Signal containing content safe area insets.\n   */\n  readonly contentSafeAreaInsets: Computed<SafeAreaInsets>;\n\n  /**\n   * Signal containing top content safe area inset.\n   */\n  readonly contentSafeAreaInsetTop: Computed<number>;\n\n  /**\n   * Signal containing left content safe area inset.\n   */\n  readonly contentSafeAreaInsetLeft: Computed<number>;\n\n  /**\n   * Signal containing right content safe area inset.\n   */\n  readonly contentSafeAreaInsetRight: Computed<number>;\n\n  /**\n   * Signal containing bottom content safe area inset.\n   */\n  readonly contentSafeAreaInsetBottom: Computed<number>;\n  //#endregion\n\n  //#region Safe area insets.\n  /**\n   * Signal containing safe area insets.\n   */\n  readonly safeAreaInsets: Computed<SafeAreaInsets>;\n\n  /**\n   * Signal containing top safe area inset.\n   */\n  readonly safeAreaInsetTop: Computed<number>;\n\n  /**\n   * Signal containing left safe area inset.\n   */\n  readonly safeAreaInsetLeft: Computed<number>;\n\n  /**\n   * Signal containing right safe area inset.\n   */\n  readonly safeAreaInsetRight: Computed<number>;\n\n  /**\n   * Signal containing bottom safe area inset.\n   */\n  readonly safeAreaInsetBottom: Computed<number>;\n  //#endregion\n\n  //#region Fullscreen.\n  /**\n   * Signal indicating if the viewport is currently in fullscreen mode.\n   */\n  readonly isFullscreen: Computed<boolean>;\n\n  /**\n   * Requests fullscreen mode for the mini application.\n   * @since Mini Apps v8.0\n   */\n  readonly requestFullscreenFp: WithChecksFp<\n    (options?: AsyncOptions) => TE.TaskEither<FullscreenError, void>,\n    true\n  >;\n\n  /**\n   * @see requestFullscreenFp\n   */\n  readonly requestFullscreen: WithChecks<(options?: AsyncOptions) => BetterPromise<void>, true>;\n\n  /**\n   * Exits mini application from the fullscreen mode.\n   * @since Mini Apps v8.0\n   */\n  readonly exitFullscreenFp: WithChecksFp<\n    (options?: AsyncOptions) => TE.TaskEither<FullscreenError, void>,\n    true\n  >;\n\n  /**\n   * @see exitFullscreenFp\n   */\n  readonly exitFullscreen: WithChecks<(options?: AsyncOptions) => BetterPromise<void>, true>;\n  //#endregion\n\n  //#region CSS Vars.\n  /**\n   * Signal indicating if CSS variables are bound.\n   */\n  readonly isCssVarsBound: Computed<boolean>;\n\n  /**\n   * Creates CSS variables connected with the current viewport.\n   *\n   * By default, created CSS variables names are following the pattern \"--tg-theme-{name}\", where\n   * {name} is a viewport property name converted from camel case to kebab case.\n   *\n   * Default variables:\n   * - `--tg-viewport-height`\n   * - `--tg-viewport-width`\n   * - `--tg-viewport-stable-height`\n   * - `--tg-viewport-content-safe-area-inset-top`\n   * - `--tg-viewport-content-safe-area-inset-bottom`\n   * - `--tg-viewport-content-safe-area-inset-left`\n   * - `--tg-viewport-content-safe-area-inset-right`\n   * - `--tg-viewport-safe-area-inset-top`\n   * - `--tg-viewport-safe-area-inset-bottom`\n   * - `--tg-viewport-safe-area-inset-left`\n   * - `--tg-viewport-safe-area-inset-right`\n   *\n   * Variables are being automatically updated if the viewport was changed.\n   *\n   * @param getCSSVarName - function, returning computed complete CSS variable name. The CSS\n   * variable will only be defined if the function returned non-empty string value.\n   * @returns Function to stop updating variables.\n   * @example Using no arguments\n   * bindCssVarsFp();\n   * @example Using custom CSS vars generator\n   * bindCssVarsFp(key => `--my-prefix-${key}`);\n   */\n  readonly bindCssVarsFp: WithChecksFp<(getCSSVarName?: GetCSSVarNameFn) => (\n    E.Either<CSSVarsBoundError, VoidFunction>\n  ), false>;\n\n  /**\n   * @see bindCssVarsFp\n   */\n  readonly bindCssVars: WithChecks<(getCSSVarName?: GetCSSVarNameFn) => VoidFunction, false>;\n  //#endregion\n\n  //#region Mount.\n  /**\n   * Signal indicating if the component is currently mounted.\n   */\n  readonly isMounted: Computed<boolean>;\n\n  /**\n   * Mounts the component.\n   */\n  readonly mountFp: WithChecksFp<(options?: AsyncOptions) => (\n    TE.TaskEither<EFullscreen | EViewportStable | RequestError, void>\n  ), false>;\n\n  /**\n   * @see mountFp\n   */\n  readonly mount: WithChecks<(options?: AsyncOptions) => BetterPromise<void>, false>;\n  //#endregion\n\n  //#region Other methods.\n  /**\n   * A method that expands the Mini App to the maximum available height. To find\n   * out if the Mini App is expanded to the maximum height, refer to the value of\n   * the `isExpanded`.\n   */\n  readonly expandFp: WithChecksFp<() => E.Either<PostEventError, void>, false>;\n\n  /**\n   * @see expandFp\n   */\n  readonly expand: WithChecks<() => void, false>;\n  //#endregion\n}\n","import { retrieveLaunchParamsFp, on, off, type EventName, EventListener } from '@tma.js/bridge';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport { Viewport, type ViewportState } from '@/features/Viewport/Viewport.js';\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withRequest } from '@/fn-options/withRequest.js';\nimport { withStateRestore } from '@/fn-options/withStateRestore.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\nfunction create() {\n  const createListeners = <E extends EventName>(event: E) => {\n    return {\n      on: (listener: EventListener<E>) => {\n        on(event, listener);\n      },\n      off: (listener: EventListener<E>) => {\n        off(event, listener);\n      },\n    };\n  };\n  const viewportListeners = createListeners('viewport_changed');\n  const fullscreenListeners = createListeners('fullscreen_changed');\n  const safeAreaListeners = createListeners('safe_area_changed');\n  const contentSafeAreaListeners = createListeners('content_safe_area_changed');\n\n  return new Viewport({\n    ...fn.pipe(\n      sharedFeatureOptions(),\n      withStateRestore<ViewportState>('viewport'),\n      withVersion,\n      withPostEvent,\n      withRequest,\n    ),\n    isFullscreen() {\n      return fn.pipe(retrieveLaunchParamsFp(), E.map(lp => !!lp.tgWebAppFullscreen));\n    },\n    isViewportStable() {\n      return fn.pipe(retrieveLaunchParamsFp(), E.map(lp => {\n        return ['macos', 'tdesktop', 'unigram', 'webk', 'weba', 'web'].includes(lp.tgWebAppPlatform);\n      }));\n    },\n    offContentSafeAreaInsetsChanged: contentSafeAreaListeners.off,\n    offFullscreenChanged: fullscreenListeners.off,\n    offSafeAreaInsetsChanged: safeAreaListeners.off,\n    offViewportChanged: viewportListeners.off,\n    onContentSafeAreaInsetsChanged: contentSafeAreaListeners.on,\n    onFullscreenChanged: fullscreenListeners.on,\n    onSafeAreaInsetsChanged: safeAreaListeners.on,\n    onViewportChanged: viewportListeners.on,\n  });\n}\n\nexport const viewport = /* @__PURE__*/ create();\n","import {\n  on,\n  logger,\n  retrieveLaunchParamsFp,\n  type RetrieveLaunchParamsError,\n  type PostEventError,\n  type PostEventFpFn,\n} from '@tma.js/bridge';\nimport { createCbCollector, throwifyFpFn } from '@tma.js/toolkit';\nimport type { Version, ThemeParams } from '@tma.js/types';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport { isInlineMode } from '@/globals/isInlineMode.js';\nimport { postEventFpSignal, postEventFp, postEvent } from '@/globals/postEvent.js';\nimport { themeParams } from '@/globals/themeParams.js';\nimport { version } from '@/globals/version.js';\n\nexport interface InitOptions {\n  /**\n   * True if SDK should accept styles sent from the Telegram application.\n   * @default true\n   */\n  acceptCustomStyles?: boolean;\n  /**\n   * True if the application is launched in inline mode.\n   * @default Will be calculated based on the launch parameters' tgWebAppBotInline field.\n   */\n  isInlineMode?: boolean;\n  /**\n   * A custom `postEvent` function to use across the package.\n   * @default tma.js/bridge's postEventFp function will be used.\n   */\n  postEvent?: PostEventFpFn;\n  /**\n   * Mini application theme parameters.\n   * @default Will be calculated based on the launch parameters' tgWebAppThemeParams field.\n   */\n  themeParams?: ThemeParams;\n  /**\n   * Telegram Mini Apps version supported by the Telegram client.\n   * @default Will be calculated based on the launch parameters' tgWebAppVersion field.\n   */\n  version?: Version;\n}\n\n/**\n * Initializes the SDK allowing it to properly handle events, sent from the native Telegram\n * application. This function also configure the package's global dependencies (functions,\n * variables used across the package).\n * @param options - function options.\n * @returns A function, to perform a cleanup.\n */\nexport function initFp(\n  options: InitOptions = {},\n): E.Either<RetrieveLaunchParamsError | PostEventError, VoidFunction> {\n  const {\n    version: optionsVersion,\n    isInlineMode: optionsInlineMode,\n    themeParams: optionsThemeParams,\n  } = options;\n\n  if (optionsVersion && typeof optionsInlineMode === 'boolean' && optionsThemeParams) {\n    version.set(optionsVersion);\n    isInlineMode.set(optionsInlineMode);\n    themeParams.set(optionsThemeParams);\n  } else {\n    const error = fn.pipe(retrieveLaunchParamsFp(), E.matchW(\n      err => err,\n      lp => {\n        version.set(optionsVersion || lp.tgWebAppVersion);\n        isInlineMode.set(typeof optionsInlineMode === 'boolean'\n          ? optionsInlineMode\n          : !!lp.tgWebAppBotInline);\n        themeParams.set(optionsThemeParams || lp.tgWebAppThemeParams);\n      },\n    ));\n    if (error) {\n      return E.left(error);\n    }\n  }\n  if (options.postEvent) {\n    postEventFpSignal.set(options.postEvent);\n  }\n\n  const [addCleanup, cleanup] = createCbCollector(\n    on('reload_iframe', () => {\n      logger().log('Received a request to reload the page');\n      postEvent('iframe_will_reload');\n      window.location.reload();\n    }),\n  );\n\n  const { acceptCustomStyles = true } = options;\n  if (acceptCustomStyles) {\n    const style = document.createElement('style');\n    style.id = 'telegram-custom-styles';\n    document.head.appendChild(style);\n\n    addCleanup(\n      on('set_custom_style', html => {\n        // It is safe to use innerHTML here as long as style tag has a special behavior related\n        // to the specified content.\n        // In case any script will be passed here, it will not be executed, so XSS is not possible.\n        style.innerHTML = html;\n      }),\n      () => {\n        document.head.removeChild(style);\n      },\n    );\n  }\n\n  // Notify Telegram that the application is ready.\n  //\n  // This will result in sending style tag html content from the Telegram web application.\n  // We should call this method also to start receiving \"reload_iframe\" events from the Telegram\n  // application.\n  //\n  // It really has no effect outside non-Telegram web environment.\n  return fn.pipe(\n    postEventFp('iframe_ready', { reload_supported: true }),\n    E.map(() => {\n      logger().log('The package was initialized');\n      return cleanup;\n    }),\n  );\n}\n\n/**\n * @see initFp\n */\nexport const init = throwifyFpFn(initFp);\n"],"names":["access","value","Mountable","onMounted","restoreState","initialState","onUnmounted","isPageReload","__publicField","signal","computed","E","restored","state","fn","s","batch","removeUndefined","result","k","v","shallowEqual","a","b","aKeys","bKeys","aKey","Stateful","onChange","nextState","key","createIsSupportedSignal","method","version","supports","throwifyWithChecksFp","fn_","throwifyFpFn","args","O","data","throwifyAnyEither","msgToTuple","message","ValidationError","errorClassWithData","input","issues","CSSVarsBoundError","errorClass","DeviceStorageMethodError","error","SecureStorageMethodError","NotAvailableError","InvalidEnvError","FunctionUnavailableError","InvalidArgumentsError","cause","ConcurrentCallError","SetEmojiStatusError","AccessDeniedError","FullscreenFailedError","ShareMessageError","UnknownThemeParamsKeyError","withChecksFp","options","isTma","optionsIsSupported","returns","isSupportedSimplified","isOptionSupported","optionName","optionSettings","calculateSupportError","mode","requirements","i","requirement","calculateOptionSupportError","isSupported","isInitialized","isMounted","isAvailable","wrapError","err","TE","call","e","errMessagePrefix","supportErr","supportsOptionErr","_a","createWithChecksFp","Button","storage","onClick","offClick","postEvent","payload","stateful","mountable","wrapOptions","wrapSupportedPlain","wrapMountedEither","nothing","wrapped","setFp","setFalse","setTrue","BackButton","button","sharedFeatureOptions","isTMAFp","createFnOption","mix","obj","createSignal","initialValue","postEventFpSignal","_postEventFp","postEventFp","withPostEvent","createComponentSessionStorage","getStorageValue","setStorageValue","getFirstNavigationEntry","entry","withStateRestore","storageName","withVersion","buttonOptions","trackedClickEvent","listener","once","on","off","backButton","AsyncMountable","createNotAvailableError","eventToState","event","available","tokenSaved","deviceId","accessRequested","type","accessGranted","Biometry","request","onInfoReceived","offInfoReceived","wrapSupportedEither","wrapSupportedTask","wrapMountedTask","response","requestFp","events","_requestFp","request2Fp","_request2Fp","request2","withRequest","instantiate","biometry","ClosingBehavior","setClosingConfirmation","isConfirmationEnabled","closingBehavior","CloudStorage","invokeCustomMethod","keyOrKeys","keys","values","acc","parse","record","string","array","lastRequestId","createRequestId","params","invokeCustomMethodFp","withInvokeCustomMethod","cloudStorage","DeviceStorage","invokeMethod","requestId","withCreateRequestId","deviceStorage","create","rest","requestEmojiStatusAccessFp","requestEmojiStatusAccess","customEmojiId","setEmojiStatusFp","setEmojiStatus","HapticFeedback","HAPTIC_METHOD_NAME","wrapSupported","style","hapticFeedback","addToHomeScreenFp","addToHomeScreen","checkHomeScreenStatusFp","checkHomeScreenStatus","InitData","retrieveInitData","authDateValue","canSendAfterValue","raw","retrieveLaunchParamsFp","tgWebAppData","retrieveRawInitDataFp","initData","Invoice","isOpened","toggleClosed","slug","url","hostname","pathname","match","invoice","openLinkFp","openLink","urlString","openTelegramLinkFp","openTelegramLink","text","shareURLFp","shareURL","LocationManager","locationManager","MainButton","defaults","withDefault","field","getDefault","fromState","setCssVar","name","deleteCssVar","isColorDarkFp","color","toRGBFullFp","rgb","modifier","idx","dec","isColorDark","ThemeParams","offChange","getCSSVarName","prop","snakeToKebab","forEachEntry","actualize","themeParams","globalThemeParams","bottomButtonOptions","mainButton","MiniApp","theme","onVisibilityChanged","offVisibilityChanged","visibilityChangedListener","themeChangedListener","isRGB","rgbBasedOn","computedRgbBasedOn","isCssVarsBound","addCleanup","cleanup","createCbCollector","bind","cssVar","update","camelToKebab","genColorToolset","stateKey","rawColor","rgbColor","fp","withBasicEither","returnBack","miniApp","prepareParams","title","paramsButtons","buttons","id","Popup","preparedOptions","popup","requestPhoneAccessFp","requestPhoneAccess","createComplete","getContact","toStringResult","safeParse","toParsedResult","pipeQueryToSchema","looseObject","pipeJsonToSchema","number","optional","valiPipe","transform","date","getContactWithErrorsIgnore","contact","pollContact","ctx","BetterTaskEither","res","rej","context","sleepTime","resolve","status","instantiateComplete","createParsed","requestContact","instantiateParsed","requestContactCompleteFp","requestContactComplete","requestContactFp","requestWriteAccessFp","requestWriteAccess","QrScanner","onClosed","onTextReceived","setClosed","captured","qr","addToCleanup","onSettled","isOpenedValue","qrScanner","SecondaryButton","secondaryButton","SecureStorage","secureStorage","SettingsButton","settingsButton","SwipeBehavior","setVerticalEnabled","isVerticalEnabled","swipeBehavior","copyTextToClipboard","clipboard","textArea","fileName","downloadFileFp","downloadFile","parsed","integer","getCurrentTimeFp","getCurrentTime","hideKeyboardFp","hideKeyboard","reqId","captureSameReq","readTextFromClipboardFp","readTextFromClipboard","retrieveAndroidDeviceDataFrom","userAgent","appVersion","systemInfo","item","retrieveAndroidDeviceData","size","sendDataFp","sendData","messageId","shareMessageFp","shareMessage","mediaUrl","shareStoryFp","shareStory","isInlineMode","query","chatTypes","switchInlineQueryFp","switchInlineQuery","Viewport","onContentSafeAreaInsetsChanged","onSafeAreaInsetsChanged","onViewportChanged","onFullscreenChanged","offContentSafeAreaInsetsChanged","offFullscreenChanged","offSafeAreaInsetsChanged","offViewportChanged","isViewportStable","isFullscreen","initialInsets","viewportChangedListener","fullscreenChangedListener","safeAreaInsetsChangedListener","contentSafeAreaInsetsChangedListener","genRequestInsets","kind","genFlag","flag","shared","viewport","saBased","csaBased","wrapTask","wrapFullscreenTask","genFullscreenFn","enable","settings","setting","createListeners","viewportListeners","fullscreenListeners","safeAreaListeners","contentSafeAreaListeners","lp","initFp","optionsVersion","optionsInlineMode","optionsThemeParams","logger","acceptCustomStyles","html","init"],"mappings":"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"}