// Signature format: 4.0
package androidx.paging {

  public final class CachedPagingDataKt {
    method @CheckResult public static <T> kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>> cachedIn(kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
  }

  public final class CancelableChannelFlowKt {
  }

  public final class CombinedLoadStates {
    ctor public CombinedLoadStates(androidx.paging.LoadState refresh, androidx.paging.LoadState prepend, androidx.paging.LoadState append, androidx.paging.LoadStates source, optional androidx.paging.LoadStates? mediator);
    method public androidx.paging.LoadState getAppend();
    method public androidx.paging.LoadStates? getMediator();
    method public androidx.paging.LoadState getPrepend();
    method public androidx.paging.LoadState getRefresh();
    method public androidx.paging.LoadStates getSource();
    property public final androidx.paging.LoadState append;
    property public final androidx.paging.LoadStates? mediator;
    property public final androidx.paging.LoadState prepend;
    property public final androidx.paging.LoadState refresh;
    property public final androidx.paging.LoadStates source;
  }

  public abstract class DataSource<Key, Value> {
    method @AnyThread public void addInvalidatedCallback(androidx.paging.DataSource.InvalidatedCallback onInvalidatedCallback);
    method @AnyThread public void invalidate();
    method @WorkerThread public boolean isInvalid();
    method public <ToValue> androidx.paging.DataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
    method public <ToValue> androidx.paging.DataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
    method @AnyThread public void removeInvalidatedCallback(androidx.paging.DataSource.InvalidatedCallback onInvalidatedCallback);
    property @WorkerThread public boolean isInvalid;
  }

  public abstract static class DataSource.Factory<Key, Value> {
    ctor public DataSource.Factory();
    method public final kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> asPagingSourceFactory(optional kotlinx.coroutines.CoroutineDispatcher fetchDispatcher);
    method public final kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> asPagingSourceFactory();
    method public abstract androidx.paging.DataSource<Key,Value> create();
    method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
    method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
  }

  public static fun interface DataSource.InvalidatedCallback {
    method @AnyThread public void onInvalidated();
  }

  @kotlin.RequiresOptIn public @interface ExperimentalPagingApi {
  }

  public final class FlowExtKt {
  }

  public final class InvalidatingPagingSourceFactory<Key, Value> implements kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> {
    ctor public InvalidatingPagingSourceFactory(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
    method public void invalidate();
    method public androidx.paging.PagingSource<Key,Value> invoke();
  }

  @Deprecated public abstract class ItemKeyedDataSource<Key, Value> extends androidx.paging.DataSource<Key,Value> {
    ctor @Deprecated public ItemKeyedDataSource();
    method @Deprecated public abstract Key getKey(Value item);
    method @Deprecated public abstract void loadAfter(androidx.paging.ItemKeyedDataSource.LoadParams<Key> params, androidx.paging.ItemKeyedDataSource.LoadCallback<Value> callback);
    method @Deprecated public abstract void loadBefore(androidx.paging.ItemKeyedDataSource.LoadParams<Key> params, androidx.paging.ItemKeyedDataSource.LoadCallback<Value> callback);
    method @Deprecated public abstract void loadInitial(androidx.paging.ItemKeyedDataSource.LoadInitialParams<Key> params, androidx.paging.ItemKeyedDataSource.LoadInitialCallback<Value> callback);
    method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
    method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
    method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
    method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
  }

  @Deprecated public abstract static class ItemKeyedDataSource.LoadCallback<Value> {
    ctor @Deprecated public ItemKeyedDataSource.LoadCallback();
    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data);
  }

  @Deprecated public abstract static class ItemKeyedDataSource.LoadInitialCallback<Value> extends androidx.paging.ItemKeyedDataSource.LoadCallback<Value> {
    ctor @Deprecated public ItemKeyedDataSource.LoadInitialCallback();
    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, int position, int totalCount);
  }

  @Deprecated public static class ItemKeyedDataSource.LoadInitialParams<Key> {
    ctor @Deprecated public ItemKeyedDataSource.LoadInitialParams(Key? requestedInitialKey, int requestedLoadSize, boolean placeholdersEnabled);
    field @Deprecated public final boolean placeholdersEnabled;
    field @Deprecated public final Key? requestedInitialKey;
    field @Deprecated public final int requestedLoadSize;
  }

  @Deprecated public static class ItemKeyedDataSource.LoadParams<Key> {
    ctor @Deprecated public ItemKeyedDataSource.LoadParams(Key key, int requestedLoadSize);
    field @Deprecated public final Key key;
    field @Deprecated public final int requestedLoadSize;
  }

  public final class ItemSnapshotList<T> extends kotlin.collections.AbstractList<T> {
    ctor public ItemSnapshotList(@IntRange(from=0) int placeholdersBefore, @IntRange(from=0) int placeholdersAfter, java.util.List<? extends T> items);
    method public T? get(int index);
    method public java.util.List<T> getItems();
    method public int getPlaceholdersAfter();
    method public int getPlaceholdersBefore();
    method public int getSize();
    property public final java.util.List<T> items;
    property public final int placeholdersAfter;
    property public final int placeholdersBefore;
    property public int size;
  }

  public abstract sealed class LoadState {
    method public final boolean getEndOfPaginationReached();
    property public final boolean endOfPaginationReached;
  }

  public static final class LoadState.Error extends androidx.paging.LoadState {
    ctor public LoadState.Error(Throwable error);
    method public Throwable getError();
    property public final Throwable error;
  }

  public static final class LoadState.Loading extends androidx.paging.LoadState {
    field public static final androidx.paging.LoadState.Loading INSTANCE;
  }

  public static final class LoadState.NotLoading extends androidx.paging.LoadState {
    ctor public LoadState.NotLoading(boolean endOfPaginationReached);
  }

  public final class LoadStates {
    ctor public LoadStates(androidx.paging.LoadState refresh, androidx.paging.LoadState prepend, androidx.paging.LoadState append);
    method public androidx.paging.LoadState component1();
    method public androidx.paging.LoadState component2();
    method public androidx.paging.LoadState component3();
    method public androidx.paging.LoadStates copy(androidx.paging.LoadState refresh, androidx.paging.LoadState prepend, androidx.paging.LoadState append);
    method public androidx.paging.LoadState getAppend();
    method public androidx.paging.LoadState getPrepend();
    method public androidx.paging.LoadState getRefresh();
    property public final androidx.paging.LoadState append;
    property public final androidx.paging.LoadState prepend;
    property public final androidx.paging.LoadState refresh;
  }

  public enum LoadType {
    enum_constant public static final androidx.paging.LoadType APPEND;
    enum_constant public static final androidx.paging.LoadType PREPEND;
    enum_constant public static final androidx.paging.LoadType REFRESH;
  }

  public final class PageFetcherSnapshotKt {
  }

  @Deprecated public abstract class PageKeyedDataSource<Key, Value> extends androidx.paging.DataSource<Key,Value> {
    ctor @Deprecated public PageKeyedDataSource();
    method @Deprecated public abstract void loadAfter(androidx.paging.PageKeyedDataSource.LoadParams<Key> params, androidx.paging.PageKeyedDataSource.LoadCallback<Key,Value> callback);
    method @Deprecated public abstract void loadBefore(androidx.paging.PageKeyedDataSource.LoadParams<Key> params, androidx.paging.PageKeyedDataSource.LoadCallback<Key,Value> callback);
    method @Deprecated public abstract void loadInitial(androidx.paging.PageKeyedDataSource.LoadInitialParams<Key> params, androidx.paging.PageKeyedDataSource.LoadInitialCallback<Key,Value> callback);
    method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
    method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
    method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
    method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
  }

  @Deprecated public abstract static class PageKeyedDataSource.LoadCallback<Key, Value> {
    ctor @Deprecated public PageKeyedDataSource.LoadCallback();
    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, Key? adjacentPageKey);
  }

  @Deprecated public abstract static class PageKeyedDataSource.LoadInitialCallback<Key, Value> {
    ctor @Deprecated public PageKeyedDataSource.LoadInitialCallback();
    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, int position, int totalCount, Key? previousPageKey, Key? nextPageKey);
    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, Key? previousPageKey, Key? nextPageKey);
  }

  @Deprecated public static class PageKeyedDataSource.LoadInitialParams<Key> {
    ctor @Deprecated public PageKeyedDataSource.LoadInitialParams(int requestedLoadSize, boolean placeholdersEnabled);
    field @Deprecated public final boolean placeholdersEnabled;
    field @Deprecated public final int requestedLoadSize;
  }

  @Deprecated public static class PageKeyedDataSource.LoadParams<Key> {
    ctor @Deprecated public PageKeyedDataSource.LoadParams(Key key, int requestedLoadSize);
    field @Deprecated public final Key key;
    field @Deprecated public final int requestedLoadSize;
  }

  @Deprecated public abstract class PagedList<T> extends java.util.AbstractList<T> {
    method @Deprecated public final void addWeakCallback(java.util.List<? extends T>? previousSnapshot, androidx.paging.PagedList.Callback callback);
    method @Deprecated public final void addWeakCallback(androidx.paging.PagedList.Callback callback);
    method @Deprecated public final void addWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
    method @Deprecated public abstract void detach();
    method @Deprecated public T? get(int index);
    method @Deprecated public final androidx.paging.PagedList.Config getConfig();
    method @Deprecated public final androidx.paging.DataSource<?,T> getDataSource();
    method @Deprecated public abstract Object? getLastKey();
    method @Deprecated public final int getLoadedCount();
    method @Deprecated public final int getPositionOffset();
    method @Deprecated public int getSize();
    method @Deprecated public abstract boolean isDetached();
    method @Deprecated public boolean isImmutable();
    method @Deprecated public final void loadAround(int index);
    method @Deprecated public final void removeWeakCallback(androidx.paging.PagedList.Callback callback);
    method @Deprecated public final void removeWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
    method @Deprecated public void retry();
    method @Deprecated public final java.util.List<T> snapshot();
    property public final androidx.paging.PagedList.Config config;
    property @Deprecated public final androidx.paging.DataSource<?,T> dataSource;
    property public abstract boolean isDetached;
    property public boolean isImmutable;
    property public abstract Object? lastKey;
    property public final int loadedCount;
    property public final int positionOffset;
    property public int size;
  }

  @Deprecated @MainThread public abstract static class PagedList.BoundaryCallback<T> {
    ctor @Deprecated public PagedList.BoundaryCallback();
    method @Deprecated public void onItemAtEndLoaded(T itemAtEnd);
    method @Deprecated public void onItemAtFrontLoaded(T itemAtFront);
    method @Deprecated public void onZeroItemsLoaded();
  }

  @Deprecated public static final class PagedList.Builder<Key, Value> {
    ctor @Deprecated public PagedList.Builder(androidx.paging.DataSource<Key,Value> dataSource, androidx.paging.PagedList.Config config);
    ctor @Deprecated public PagedList.Builder(androidx.paging.DataSource<Key,Value> dataSource, int pageSize);
    ctor @Deprecated public PagedList.Builder(androidx.paging.PagingSource<Key,Value> pagingSource, androidx.paging.PagingSource.LoadResult.Page<Key,Value> initialPage, androidx.paging.PagedList.Config config);
    ctor @Deprecated public PagedList.Builder(androidx.paging.PagingSource<Key,Value> pagingSource, androidx.paging.PagingSource.LoadResult.Page<Key,Value> initialPage, int pageSize);
    method @Deprecated public androidx.paging.PagedList<Value> build();
    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setCoroutineScope(kotlinx.coroutines.CoroutineScope coroutineScope);
    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setFetchDispatcher(kotlinx.coroutines.CoroutineDispatcher fetchDispatcher);
    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setFetchExecutor(java.util.concurrent.Executor fetchExecutor);
    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setInitialKey(Key? initialKey);
    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setNotifyDispatcher(kotlinx.coroutines.CoroutineDispatcher notifyDispatcher);
    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setNotifyExecutor(java.util.concurrent.Executor notifyExecutor);
  }

  @Deprecated public abstract static class PagedList.Callback {
    ctor @Deprecated public PagedList.Callback();
    method @Deprecated public abstract void onChanged(int position, int count);
    method @Deprecated public abstract void onInserted(int position, int count);
    method @Deprecated public abstract void onRemoved(int position, int count);
  }

  @Deprecated public static final class PagedList.Config {
    field @Deprecated public static final int MAX_SIZE_UNBOUNDED = 2147483647; // 0x7fffffff
    field @Deprecated public final boolean enablePlaceholders;
    field @Deprecated public final int initialLoadSizeHint;
    field @Deprecated public final int maxSize;
    field @Deprecated public final int pageSize;
    field @Deprecated public final int prefetchDistance;
  }

  @Deprecated public static final class PagedList.Config.Builder {
    ctor @Deprecated public PagedList.Config.Builder();
    method @Deprecated public androidx.paging.PagedList.Config build();
    method @Deprecated public androidx.paging.PagedList.Config.Builder setEnablePlaceholders(boolean enablePlaceholders);
    method @Deprecated public androidx.paging.PagedList.Config.Builder setInitialLoadSizeHint(@IntRange(from=1) int initialLoadSizeHint);
    method @Deprecated public androidx.paging.PagedList.Config.Builder setMaxSize(@IntRange(from=2) int maxSize);
    method @Deprecated public androidx.paging.PagedList.Config.Builder setPageSize(@IntRange(from=1) int pageSize);
    method @Deprecated public androidx.paging.PagedList.Config.Builder setPrefetchDistance(@IntRange(from=0) int prefetchDistance);
  }

  public final class PagedListConfigKt {
  }

  public final class PagedListKt {
  }

  public final class Pager<Key, Value> {
    ctor @androidx.paging.ExperimentalPagingApi public Pager(androidx.paging.PagingConfig config, optional Key? initialKey, androidx.paging.RemoteMediator<Key,Value>? remoteMediator, kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
    ctor public Pager(androidx.paging.PagingConfig config, optional Key? initialKey, kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
    ctor public Pager(androidx.paging.PagingConfig config, kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
    method public kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<Value>> getFlow();
    property public final kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<Value>> flow;
  }

  public final class PagingConfig {
    ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance, optional boolean enablePlaceholders, optional @IntRange(from=1) int initialLoadSize, optional @IntRange(from=2) int maxSize, optional int jumpThreshold);
    ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance, optional boolean enablePlaceholders, optional @IntRange(from=1) int initialLoadSize, optional @IntRange(from=2) int maxSize);
    ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance, optional boolean enablePlaceholders, optional @IntRange(from=1) int initialLoadSize);
    ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance, optional boolean enablePlaceholders);
    ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance);
    ctor public PagingConfig(int pageSize);
    field public static final androidx.paging.PagingConfig.Companion Companion;
    field public static final int MAX_SIZE_UNBOUNDED = 2147483647; // 0x7fffffff
    field public final boolean enablePlaceholders;
    field public final int initialLoadSize;
    field public final int jumpThreshold;
    field public final int maxSize;
    field public final int pageSize;
    field public final int prefetchDistance;
  }

  public static final class PagingConfig.Companion {
  }

  public final class PagingData<T> {
    method public static <T> androidx.paging.PagingData<T> empty();
    method public static <T> androidx.paging.PagingData<T> from(java.util.List<? extends T> data);
    field public static final androidx.paging.PagingData.Companion Companion;
  }

  public static final class PagingData.Companion {
    method public <T> androidx.paging.PagingData<T> empty();
    method public <T> androidx.paging.PagingData<T> from(java.util.List<? extends T> data);
  }

  public final class PagingDataTransforms {
    method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
    method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,? extends java.lang.Iterable<? extends R>> transform);
    method @CheckResult public static <T> androidx.paging.PagingData<T> insertFooterItem(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, T item);
    method @CheckResult public static <T> androidx.paging.PagingData<T> insertFooterItem(androidx.paging.PagingData<T>, T item);
    method @CheckResult public static <T> androidx.paging.PagingData<T> insertHeaderItem(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, T item);
    method @CheckResult public static <T> androidx.paging.PagingData<T> insertHeaderItem(androidx.paging.PagingData<T>, T item);
    method @CheckResult public static <R, T extends R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
    method @CheckResult public static <R, T extends R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
    method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,? extends R> transform);
  }

  public abstract class PagingSource<Key, Value> {
    ctor public PagingSource();
    method public final boolean getInvalid();
    method public boolean getJumpingSupported();
    method public boolean getKeyReuseSupported();
    method public abstract Key? getRefreshKey(androidx.paging.PagingState<Key,Value> state);
    method public final void invalidate();
    method public abstract suspend Object? load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
    method public final void registerInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
    method public final void unregisterInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
    property public final boolean invalid;
    property public boolean jumpingSupported;
    property public boolean keyReuseSupported;
  }

  public abstract static sealed class PagingSource.LoadParams<Key> {
    method public abstract Key? getKey();
    method public final int getLoadSize();
    method public final boolean getPlaceholdersEnabled();
    property public abstract Key? key;
    property public final int loadSize;
    property public final boolean placeholdersEnabled;
  }

  public static final class PagingSource.LoadParams.Append<Key> extends androidx.paging.PagingSource.LoadParams<Key> {
    ctor public PagingSource.LoadParams.Append(Key key, int loadSize, boolean placeholdersEnabled);
    method public Key getKey();
    property public Key key;
  }

  public static final class PagingSource.LoadParams.Prepend<Key> extends androidx.paging.PagingSource.LoadParams<Key> {
    ctor public PagingSource.LoadParams.Prepend(Key key, int loadSize, boolean placeholdersEnabled);
    method public Key getKey();
    property public Key key;
  }

  public static final class PagingSource.LoadParams.Refresh<Key> extends androidx.paging.PagingSource.LoadParams<Key> {
    ctor public PagingSource.LoadParams.Refresh(Key? key, int loadSize, boolean placeholdersEnabled);
    method public Key? getKey();
    property public Key? key;
  }

  public abstract static sealed class PagingSource.LoadResult<Key, Value> {
  }

  public static final class PagingSource.LoadResult.Error<Key, Value> extends androidx.paging.PagingSource.LoadResult<Key,Value> {
    ctor public PagingSource.LoadResult.Error(Throwable throwable);
    method public Throwable component1();
    method public androidx.paging.PagingSource.LoadResult.Error<Key,Value> copy(Throwable throwable);
    method public Throwable getThrowable();
    property public final Throwable throwable;
  }

  public static final class PagingSource.LoadResult.Page<Key, Value> extends androidx.paging.PagingSource.LoadResult<Key,Value> {
    ctor public PagingSource.LoadResult.Page(java.util.List<? extends Value> data, Key? prevKey, Key? nextKey, optional @IntRange(from=COUNT_UNDEFINED.toLong()) int itemsBefore, optional @IntRange(from=COUNT_UNDEFINED.toLong()) int itemsAfter);
    ctor public PagingSource.LoadResult.Page(java.util.List<? extends Value> data, Key? prevKey, Key? nextKey);
    method public java.util.List<Value> component1();
    method public Key? component2();
    method public Key? component3();
    method public int component4();
    method public int component5();
    method public androidx.paging.PagingSource.LoadResult.Page<Key,Value> copy(java.util.List<? extends Value> data, Key? prevKey, Key? nextKey, int itemsBefore, int itemsAfter);
    method public java.util.List<Value> getData();
    method public int getItemsAfter();
    method public int getItemsBefore();
    method public Key? getNextKey();
    method public Key? getPrevKey();
    property public final java.util.List<Value> data;
    property public final int itemsAfter;
    property public final int itemsBefore;
    property public final Key? nextKey;
    property public final Key? prevKey;
    field public static final int COUNT_UNDEFINED = -2147483648; // 0x80000000
    field public static final androidx.paging.PagingSource.LoadResult.Page.Companion Companion;
  }

  public static final class PagingSource.LoadResult.Page.Companion {
  }

  public final class PagingSourceKt {
  }

  public final class PagingState<Key, Value> {
    ctor public PagingState(java.util.List<androidx.paging.PagingSource.LoadResult.Page<Key,Value>> pages, Integer? anchorPosition, androidx.paging.PagingConfig config, @IntRange(from=0) int leadingPlaceholderCount);
    method public Value? closestItemToPosition(int anchorPosition);
    method public androidx.paging.PagingSource.LoadResult.Page<Key,Value>? closestPageToPosition(int anchorPosition);
    method public Value? firstItemOrNull();
    method public Integer? getAnchorPosition();
    method public androidx.paging.PagingConfig getConfig();
    method public java.util.List<androidx.paging.PagingSource.LoadResult.Page<Key,Value>> getPages();
    method public boolean isEmpty();
    method public Value? lastItemOrNull();
    property public final Integer? anchorPosition;
    property public final androidx.paging.PagingConfig config;
    property public final java.util.List<androidx.paging.PagingSource.LoadResult.Page<Key,Value>> pages;
  }

  @Deprecated public abstract class PositionalDataSource<T> extends androidx.paging.DataSource<java.lang.Integer,T> {
    ctor @Deprecated public PositionalDataSource();
    method @Deprecated public static final int computeInitialLoadPosition(androidx.paging.PositionalDataSource.LoadInitialParams params, int totalCount);
    method @Deprecated public static final int computeInitialLoadSize(androidx.paging.PositionalDataSource.LoadInitialParams params, int initialLoadPosition, int totalCount);
    method @Deprecated @WorkerThread public abstract void loadInitial(androidx.paging.PositionalDataSource.LoadInitialParams params, androidx.paging.PositionalDataSource.LoadInitialCallback<T> callback);
    method @Deprecated @WorkerThread public abstract void loadRange(androidx.paging.PositionalDataSource.LoadRangeParams params, androidx.paging.PositionalDataSource.LoadRangeCallback<T> callback);
    method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> map(androidx.arch.core.util.Function<T,V> function);
    method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> map(kotlin.jvm.functions.Function1<? super T,? extends V> function);
    method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> mapByPage(androidx.arch.core.util.Function<java.util.List<T>,java.util.List<V>> function);
    method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends T>,? extends java.util.List<? extends V>> function);
  }

  @Deprecated public abstract static class PositionalDataSource.LoadInitialCallback<T> {
    ctor @Deprecated public PositionalDataSource.LoadInitialCallback();
    method @Deprecated public abstract void onResult(java.util.List<? extends T> data, int position, int totalCount);
    method @Deprecated public abstract void onResult(java.util.List<? extends T> data, int position);
  }

  @Deprecated public static class PositionalDataSource.LoadInitialParams {
    ctor @Deprecated public PositionalDataSource.LoadInitialParams(int requestedStartPosition, int requestedLoadSize, int pageSize, boolean placeholdersEnabled);
    field @Deprecated public final int pageSize;
    field @Deprecated public final boolean placeholdersEnabled;
    field @Deprecated public final int requestedLoadSize;
    field @Deprecated public final int requestedStartPosition;
  }

  @Deprecated public abstract static class PositionalDataSource.LoadRangeCallback<T> {
    ctor @Deprecated public PositionalDataSource.LoadRangeCallback();
    method @Deprecated public abstract void onResult(java.util.List<? extends T> data);
  }

  @Deprecated public static class PositionalDataSource.LoadRangeParams {
    ctor @Deprecated public PositionalDataSource.LoadRangeParams(int startPosition, int loadSize);
    field @Deprecated public final int loadSize;
    field @Deprecated public final int startPosition;
  }

  @androidx.paging.ExperimentalPagingApi public abstract class RemoteMediator<Key, Value> {
    ctor public RemoteMediator();
    method public suspend Object? initialize(kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.InitializeAction> $completion);
    method public abstract suspend Object? load(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value> state, kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.MediatorResult> p);
  }

  public enum RemoteMediator.InitializeAction {
    enum_constant public static final androidx.paging.RemoteMediator.InitializeAction LAUNCH_INITIAL_REFRESH;
    enum_constant public static final androidx.paging.RemoteMediator.InitializeAction SKIP_INITIAL_REFRESH;
  }

  public abstract static sealed class RemoteMediator.MediatorResult {
  }

  public static final class RemoteMediator.MediatorResult.Error extends androidx.paging.RemoteMediator.MediatorResult {
    ctor public RemoteMediator.MediatorResult.Error(Throwable throwable);
    method public Throwable getThrowable();
    property public final Throwable throwable;
  }

  public static final class RemoteMediator.MediatorResult.Success extends androidx.paging.RemoteMediator.MediatorResult {
    ctor public RemoteMediator.MediatorResult.Success(boolean endOfPaginationReached);
    method public boolean endOfPaginationReached();
    property public final boolean endOfPaginationReached;
  }

  public final class RemoteMediatorAccessorKt {
  }

  public final class SeparatorsKt {
  }

  public final class SimpleChannelFlowKt {
  }

  public enum TerminalSeparatorType {
    enum_constant public static final androidx.paging.TerminalSeparatorType FULLY_COMPLETE;
    enum_constant public static final androidx.paging.TerminalSeparatorType SOURCE_COMPLETE;
  }

}

package androidx.paging.multicast {

  public final class ChannelManagerKt {
  }

}

