new: introduce build-logic module to centralize Gradle configuration
This commit is contained in:
@@ -0,0 +1,13 @@
|
|||||||
|
plugins {
|
||||||
|
`kotlin-dsl`
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation(libs.android.gradlePlugin)
|
||||||
|
implementation(libs.kotlin.gradlePlugin)
|
||||||
|
implementation(libs.compose.gradlePlugin)
|
||||||
|
implementation(libs.composeCompiler.gradlePlugin)
|
||||||
|
// Makes the typed `libs` catalog accessors usable inside precompiled script plugins
|
||||||
|
// (workaround for https://github.com/gradle/gradle/issues/15383)
|
||||||
|
implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location))
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
rootProject.name = "build-logic"
|
||||||
|
|
||||||
|
dependencyResolutionManagement {
|
||||||
|
repositories {
|
||||||
|
google {
|
||||||
|
mavenContent {
|
||||||
|
includeGroupAndSubgroups("androidx")
|
||||||
|
includeGroupAndSubgroups("com.android")
|
||||||
|
includeGroupAndSubgroups("com.google")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mavenCentral()
|
||||||
|
gradlePluginPortal()
|
||||||
|
}
|
||||||
|
versionCatalogs {
|
||||||
|
create("libs") {
|
||||||
|
from(files("../gradle/libs.versions.toml"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
plugins {
|
||||||
|
id("org.jetbrains.compose")
|
||||||
|
id("org.jetbrains.kotlin.plugin.compose")
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
import org.gradle.accessors.dm.LibrariesForLibs
|
||||||
|
import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
|
||||||
|
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
id("org.jetbrains.kotlin.multiplatform")
|
||||||
|
id("com.android.kotlin.multiplatform.library")
|
||||||
|
}
|
||||||
|
|
||||||
|
val libs = the<LibrariesForLibs>()
|
||||||
|
|
||||||
|
kotlin {
|
||||||
|
iosArm64()
|
||||||
|
iosSimulatorArm64()
|
||||||
|
|
||||||
|
jvm()
|
||||||
|
|
||||||
|
js {
|
||||||
|
browser()
|
||||||
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalWasmDsl::class)
|
||||||
|
wasmJs {
|
||||||
|
browser()
|
||||||
|
}
|
||||||
|
|
||||||
|
androidLibrary {
|
||||||
|
// namespace is set per module in the consuming build file
|
||||||
|
compileSdk =
|
||||||
|
libs.versions.androidCompileSdk
|
||||||
|
.get()
|
||||||
|
.toInt()
|
||||||
|
minSdk =
|
||||||
|
libs.versions.androidMinSdk
|
||||||
|
.get()
|
||||||
|
.toInt()
|
||||||
|
|
||||||
|
compilerOptions {
|
||||||
|
jvmTarget = JvmTarget.JVM_11
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sourceSets {
|
||||||
|
commonTest.dependencies {
|
||||||
|
implementation(libs.kotlin.test)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,40 +1,10 @@
|
|||||||
import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
|
|
||||||
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
alias(libs.plugins.kotlinMultiplatform)
|
id("gwenedeg.kmp.library")
|
||||||
alias(libs.plugins.androidMultiplatformLibrary)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
kotlin {
|
kotlin {
|
||||||
iosArm64()
|
|
||||||
iosSimulatorArm64()
|
|
||||||
|
|
||||||
jvm()
|
|
||||||
|
|
||||||
js {
|
|
||||||
browser()
|
|
||||||
}
|
|
||||||
|
|
||||||
@OptIn(ExperimentalWasmDsl::class)
|
|
||||||
wasmJs {
|
|
||||||
browser()
|
|
||||||
}
|
|
||||||
|
|
||||||
androidLibrary {
|
androidLibrary {
|
||||||
namespace = "fr.ajaury.gwenedeg.core.audioplayer"
|
namespace = "fr.ajaury.gwenedeg.core.audioplayer"
|
||||||
compileSdk =
|
|
||||||
libs.versions.androidCompileSdk
|
|
||||||
.get()
|
|
||||||
.toInt()
|
|
||||||
minSdk =
|
|
||||||
libs.versions.androidMinSdk
|
|
||||||
.get()
|
|
||||||
.toInt()
|
|
||||||
|
|
||||||
compilerOptions {
|
|
||||||
jvmTarget = JvmTarget.JVM_11
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
@@ -67,8 +37,5 @@ kotlin {
|
|||||||
// HTMLAudioElement interop on Wasm requires this opt-in.
|
// HTMLAudioElement interop on Wasm requires this opt-in.
|
||||||
languageSettings.optIn("kotlin.js.ExperimentalWasmJsInterop")
|
languageSettings.optIn("kotlin.js.ExperimentalWasmJsInterop")
|
||||||
}
|
}
|
||||||
commonTest.dependencies {
|
|
||||||
implementation(libs.kotlin.test)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,40 +1,10 @@
|
|||||||
import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
|
|
||||||
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
alias(libs.plugins.kotlinMultiplatform)
|
id("gwenedeg.kmp.library")
|
||||||
alias(libs.plugins.androidMultiplatformLibrary)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
kotlin {
|
kotlin {
|
||||||
iosArm64()
|
|
||||||
iosSimulatorArm64()
|
|
||||||
|
|
||||||
jvm()
|
|
||||||
|
|
||||||
js {
|
|
||||||
browser()
|
|
||||||
}
|
|
||||||
|
|
||||||
@OptIn(ExperimentalWasmDsl::class)
|
|
||||||
wasmJs {
|
|
||||||
browser()
|
|
||||||
}
|
|
||||||
|
|
||||||
androidLibrary {
|
androidLibrary {
|
||||||
namespace = "fr.ajaury.gwenedeg.core.coroutines"
|
namespace = "fr.ajaury.gwenedeg.core.coroutines"
|
||||||
compileSdk =
|
|
||||||
libs.versions.androidCompileSdk
|
|
||||||
.get()
|
|
||||||
.toInt()
|
|
||||||
minSdk =
|
|
||||||
libs.versions.androidMinSdk
|
|
||||||
.get()
|
|
||||||
.toInt()
|
|
||||||
|
|
||||||
compilerOptions {
|
|
||||||
jvmTarget = JvmTarget.JVM_11
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
@@ -46,8 +16,5 @@ kotlin {
|
|||||||
implementation(project.dependencies.platform(libs.koin.bom))
|
implementation(project.dependencies.platform(libs.koin.bom))
|
||||||
implementation(libs.koin.core)
|
implementation(libs.koin.core)
|
||||||
}
|
}
|
||||||
commonTest.dependencies {
|
|
||||||
implementation(libs.kotlin.test)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,40 +1,10 @@
|
|||||||
import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
|
|
||||||
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
alias(libs.plugins.kotlinMultiplatform)
|
id("gwenedeg.kmp.library")
|
||||||
alias(libs.plugins.androidMultiplatformLibrary)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
kotlin {
|
kotlin {
|
||||||
iosArm64()
|
|
||||||
iosSimulatorArm64()
|
|
||||||
|
|
||||||
jvm()
|
|
||||||
|
|
||||||
js {
|
|
||||||
browser()
|
|
||||||
}
|
|
||||||
|
|
||||||
@OptIn(ExperimentalWasmDsl::class)
|
|
||||||
wasmJs {
|
|
||||||
browser()
|
|
||||||
}
|
|
||||||
|
|
||||||
androidLibrary {
|
androidLibrary {
|
||||||
namespace = "fr.ajaury.gwenedeg.core.logging"
|
namespace = "fr.ajaury.gwenedeg.core.logging"
|
||||||
compileSdk =
|
|
||||||
libs.versions.androidCompileSdk
|
|
||||||
.get()
|
|
||||||
.toInt()
|
|
||||||
minSdk =
|
|
||||||
libs.versions.androidMinSdk
|
|
||||||
.get()
|
|
||||||
.toInt()
|
|
||||||
|
|
||||||
compilerOptions {
|
|
||||||
jvmTarget = JvmTarget.JVM_11
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
@@ -46,8 +16,5 @@ kotlin {
|
|||||||
implementation(project.dependencies.platform(libs.koin.bom))
|
implementation(project.dependencies.platform(libs.koin.bom))
|
||||||
implementation(libs.koin.core)
|
implementation(libs.koin.core)
|
||||||
}
|
}
|
||||||
commonTest.dependencies {
|
|
||||||
implementation(libs.kotlin.test)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,45 +1,9 @@
|
|||||||
import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
|
|
||||||
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
alias(libs.plugins.kotlinMultiplatform)
|
id("gwenedeg.kmp.library")
|
||||||
alias(libs.plugins.androidMultiplatformLibrary)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
kotlin {
|
kotlin {
|
||||||
iosArm64()
|
|
||||||
iosSimulatorArm64()
|
|
||||||
|
|
||||||
jvm()
|
|
||||||
|
|
||||||
js {
|
|
||||||
browser()
|
|
||||||
}
|
|
||||||
|
|
||||||
@OptIn(ExperimentalWasmDsl::class)
|
|
||||||
wasmJs {
|
|
||||||
browser()
|
|
||||||
}
|
|
||||||
|
|
||||||
androidLibrary {
|
androidLibrary {
|
||||||
namespace = "fr.ajaury.gwenedeg.core.model"
|
namespace = "fr.ajaury.gwenedeg.core.model"
|
||||||
compileSdk =
|
|
||||||
libs.versions.androidCompileSdk
|
|
||||||
.get()
|
|
||||||
.toInt()
|
|
||||||
minSdk =
|
|
||||||
libs.versions.androidMinSdk
|
|
||||||
.get()
|
|
||||||
.toInt()
|
|
||||||
|
|
||||||
compilerOptions {
|
|
||||||
jvmTarget = JvmTarget.JVM_11
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sourceSets {
|
|
||||||
commonTest.dependencies {
|
|
||||||
implementation(libs.kotlin.test)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,40 +1,10 @@
|
|||||||
import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
|
|
||||||
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
alias(libs.plugins.kotlinMultiplatform)
|
id("gwenedeg.kmp.library")
|
||||||
alias(libs.plugins.androidMultiplatformLibrary)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
kotlin {
|
kotlin {
|
||||||
iosArm64()
|
|
||||||
iosSimulatorArm64()
|
|
||||||
|
|
||||||
jvm()
|
|
||||||
|
|
||||||
js {
|
|
||||||
browser()
|
|
||||||
}
|
|
||||||
|
|
||||||
@OptIn(ExperimentalWasmDsl::class)
|
|
||||||
wasmJs {
|
|
||||||
browser()
|
|
||||||
}
|
|
||||||
|
|
||||||
androidLibrary {
|
androidLibrary {
|
||||||
namespace = "fr.ajaury.gwenedeg.records"
|
namespace = "fr.ajaury.gwenedeg.records"
|
||||||
compileSdk =
|
|
||||||
libs.versions.androidCompileSdk
|
|
||||||
.get()
|
|
||||||
.toInt()
|
|
||||||
minSdk =
|
|
||||||
libs.versions.androidMinSdk
|
|
||||||
.get()
|
|
||||||
.toInt()
|
|
||||||
|
|
||||||
compilerOptions {
|
|
||||||
jvmTarget = JvmTarget.JVM_11
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
@@ -49,8 +19,5 @@ kotlin {
|
|||||||
implementation(project.dependencies.platform(libs.koin.bom))
|
implementation(project.dependencies.platform(libs.koin.bom))
|
||||||
implementation(libs.koin.core)
|
implementation(libs.koin.core)
|
||||||
}
|
}
|
||||||
commonTest.dependencies {
|
|
||||||
implementation(libs.kotlin.test)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,42 +1,11 @@
|
|||||||
import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
|
|
||||||
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
alias(libs.plugins.kotlinMultiplatform)
|
id("gwenedeg.kmp.library")
|
||||||
alias(libs.plugins.androidMultiplatformLibrary)
|
id("gwenedeg.compose")
|
||||||
alias(libs.plugins.composeMultiplatform)
|
|
||||||
alias(libs.plugins.composeCompiler)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
kotlin {
|
kotlin {
|
||||||
iosArm64()
|
|
||||||
iosSimulatorArm64()
|
|
||||||
|
|
||||||
jvm()
|
|
||||||
|
|
||||||
js {
|
|
||||||
browser()
|
|
||||||
}
|
|
||||||
|
|
||||||
@OptIn(ExperimentalWasmDsl::class)
|
|
||||||
wasmJs {
|
|
||||||
browser()
|
|
||||||
}
|
|
||||||
|
|
||||||
androidLibrary {
|
androidLibrary {
|
||||||
namespace = "fr.ajaury.gwenedeg.resources"
|
namespace = "fr.ajaury.gwenedeg.resources"
|
||||||
compileSdk =
|
|
||||||
libs.versions.androidCompileSdk
|
|
||||||
.get()
|
|
||||||
.toInt()
|
|
||||||
minSdk =
|
|
||||||
libs.versions.androidMinSdk
|
|
||||||
.get()
|
|
||||||
.toInt()
|
|
||||||
|
|
||||||
compilerOptions {
|
|
||||||
jvmTarget = JvmTarget.JVM_11
|
|
||||||
}
|
|
||||||
androidResources {
|
androidResources {
|
||||||
enable = true
|
enable = true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,40 +1,10 @@
|
|||||||
import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
|
|
||||||
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
alias(libs.plugins.kotlinMultiplatform)
|
id("gwenedeg.kmp.library")
|
||||||
alias(libs.plugins.androidMultiplatformLibrary)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
kotlin {
|
kotlin {
|
||||||
iosArm64()
|
|
||||||
iosSimulatorArm64()
|
|
||||||
|
|
||||||
jvm()
|
|
||||||
|
|
||||||
js {
|
|
||||||
browser()
|
|
||||||
}
|
|
||||||
|
|
||||||
@OptIn(ExperimentalWasmDsl::class)
|
|
||||||
wasmJs {
|
|
||||||
browser()
|
|
||||||
}
|
|
||||||
|
|
||||||
androidLibrary {
|
androidLibrary {
|
||||||
namespace = "fr.ajaury.gwenedeg.subtitle"
|
namespace = "fr.ajaury.gwenedeg.subtitle"
|
||||||
compileSdk =
|
|
||||||
libs.versions.androidCompileSdk
|
|
||||||
.get()
|
|
||||||
.toInt()
|
|
||||||
minSdk =
|
|
||||||
libs.versions.androidMinSdk
|
|
||||||
.get()
|
|
||||||
.toInt()
|
|
||||||
|
|
||||||
compilerOptions {
|
|
||||||
jvmTarget = JvmTarget.JVM_11
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
@@ -51,8 +21,5 @@ kotlin {
|
|||||||
implementation(project.dependencies.platform(libs.koin.bom))
|
implementation(project.dependencies.platform(libs.koin.bom))
|
||||||
implementation(libs.koin.core)
|
implementation(libs.koin.core)
|
||||||
}
|
}
|
||||||
commonTest.dependencies {
|
|
||||||
implementation(libs.kotlin.test)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,12 @@ kermit = "2.1.0"
|
|||||||
vorbisspi = "1.0.3.3"
|
vorbisspi = "1.0.3.3"
|
||||||
|
|
||||||
[libraries]
|
[libraries]
|
||||||
|
# Gradle plugin artifacts, used by build-logic convention plugins only
|
||||||
|
android-gradlePlugin = { module = "com.android.tools.build:gradle", version.ref = "agp" }
|
||||||
|
kotlin-gradlePlugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
|
||||||
|
compose-gradlePlugin = { module = "org.jetbrains.compose:compose-gradle-plugin", version.ref = "composeMultiplatform" }
|
||||||
|
composeCompiler-gradlePlugin = { module = "org.jetbrains.kotlin:compose-compiler-gradle-plugin", version.ref = "kotlin" }
|
||||||
|
|
||||||
androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidxActivity" }
|
androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidxActivity" }
|
||||||
compose-components-resources = { module = "org.jetbrains.compose.components:components-resources", version.ref = "composeMultiplatform" }
|
compose-components-resources = { module = "org.jetbrains.compose.components:components-resources", version.ref = "composeMultiplatform" }
|
||||||
compose-foundation = { module = "org.jetbrains.compose.foundation:foundation", version.ref = "composeMultiplatform" }
|
compose-foundation = { module = "org.jetbrains.compose.foundation:foundation", version.ref = "composeMultiplatform" }
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ rootProject.name = "Gwenedeg"
|
|||||||
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
|
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
|
||||||
|
|
||||||
pluginManagement {
|
pluginManagement {
|
||||||
|
includeBuild("build-logic")
|
||||||
repositories {
|
repositories {
|
||||||
google {
|
google {
|
||||||
mavenContent {
|
mavenContent {
|
||||||
|
|||||||
+4
-33
@@ -1,15 +1,12 @@
|
|||||||
import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
|
|
||||||
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
alias(libs.plugins.kotlinMultiplatform)
|
id("gwenedeg.kmp.library")
|
||||||
alias(libs.plugins.androidMultiplatformLibrary)
|
id("gwenedeg.compose")
|
||||||
alias(libs.plugins.composeMultiplatform)
|
|
||||||
alias(libs.plugins.composeCompiler)
|
|
||||||
alias(libs.plugins.kotlinSerialization)
|
alias(libs.plugins.kotlinSerialization)
|
||||||
}
|
}
|
||||||
|
|
||||||
kotlin {
|
kotlin {
|
||||||
|
// Targets are declared by the convention plugin; these calls return the
|
||||||
|
// existing targets, so this only adds the iOS framework packaging.
|
||||||
listOf(
|
listOf(
|
||||||
iosArm64(),
|
iosArm64(),
|
||||||
iosSimulatorArm64(),
|
iosSimulatorArm64(),
|
||||||
@@ -20,31 +17,8 @@ kotlin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
jvm()
|
|
||||||
|
|
||||||
js {
|
|
||||||
browser()
|
|
||||||
}
|
|
||||||
|
|
||||||
@OptIn(ExperimentalWasmDsl::class)
|
|
||||||
wasmJs {
|
|
||||||
browser()
|
|
||||||
}
|
|
||||||
|
|
||||||
androidLibrary {
|
androidLibrary {
|
||||||
namespace = "fr.ajaury.gwenedeg.shared"
|
namespace = "fr.ajaury.gwenedeg.shared"
|
||||||
compileSdk =
|
|
||||||
libs.versions.androidCompileSdk
|
|
||||||
.get()
|
|
||||||
.toInt()
|
|
||||||
minSdk =
|
|
||||||
libs.versions.androidMinSdk
|
|
||||||
.get()
|
|
||||||
.toInt()
|
|
||||||
|
|
||||||
compilerOptions {
|
|
||||||
jvmTarget = JvmTarget.JVM_11
|
|
||||||
}
|
|
||||||
androidResources {
|
androidResources {
|
||||||
enable = true
|
enable = true
|
||||||
}
|
}
|
||||||
@@ -91,9 +65,6 @@ kotlin {
|
|||||||
implementation(libs.koin.compose)
|
implementation(libs.koin.compose)
|
||||||
implementation(libs.koin.compose.viewmodel)
|
implementation(libs.koin.compose.viewmodel)
|
||||||
}
|
}
|
||||||
commonTest.dependencies {
|
|
||||||
implementation(libs.kotlin.test)
|
|
||||||
}
|
|
||||||
jvmTest.dependencies {
|
jvmTest.dependencies {
|
||||||
// Koin configuration validation
|
// Koin configuration validation
|
||||||
implementation(project.dependencies.platform(libs.koin.bom))
|
implementation(project.dependencies.platform(libs.koin.bom))
|
||||||
|
|||||||
Reference in New Issue
Block a user