From e7e17d3f0d784065d6dd74304e710ddb9c1cb6d3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 14:12:53 +0000 Subject: [PATCH 01/27] Update dependency com.squareup.leakcanary:leakcanary-android to v2.14 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index b1d8a054b0..5985eb3257 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -363,7 +363,7 @@ dependencies { } if (perfAnalysis) { - debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.13' + debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.14' } // dependencies for local unit tests From 962c50eecc1e34c6f21806e36b06eb44a812156d Mon Sep 17 00:00:00 2001 From: alperozturk Date: Tue, 25 Jun 2024 10:25:57 +0200 Subject: [PATCH 02/27] Fix DEFAULT_LIMIT and limit Signed-off-by: alperozturk --- .../owncloud/android/ui/unifiedsearch/SearchOnProviderTask.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/owncloud/android/ui/unifiedsearch/SearchOnProviderTask.kt b/app/src/main/java/com/owncloud/android/ui/unifiedsearch/SearchOnProviderTask.kt index 5cbf6d0b34..37ed654348 100644 --- a/app/src/main/java/com/owncloud/android/ui/unifiedsearch/SearchOnProviderTask.kt +++ b/app/src/main/java/com/owncloud/android/ui/unifiedsearch/SearchOnProviderTask.kt @@ -16,7 +16,7 @@ class SearchOnProviderTask( private val provider: String, private val client: NextcloudClient, private val cursor: Int? = null, - private val limit: Int = 5 + private val limit: Int = 6 ) : () -> SearchOnProviderTask.Result { companion object { private const val TAG = "SearchOnProviderTask" From 30b255b43d9d27415c45b382b2a2ec148d82d9c0 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Tue, 25 Jun 2024 10:26:04 +0200 Subject: [PATCH 03/27] Refactor adapter Signed-off-by: alperozturk --- .../ui/adapter/UnifiedSearchListAdapter.kt | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchListAdapter.kt b/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchListAdapter.kt index 07f4842422..d88e47c73c 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchListAdapter.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchListAdapter.kt @@ -103,14 +103,16 @@ class UnifiedSearchListAdapter( } override fun onBindHeaderViewHolder(holder: SectionedViewHolder, section: Int, expanded: Boolean) { - val headerViewHolder = holder as UnifiedSearchHeaderViewHolder - headerViewHolder.bind(sections[section]) + (holder as UnifiedSearchHeaderViewHolder).run { + bind(sections[section]) + } } override fun onBindFooterViewHolder(holder: SectionedViewHolder, section: Int) { if (sections[section].hasMoreResults) { - val footerViewHolder = holder as UnifiedSearchFooterViewHolder - footerViewHolder.bind(sections[section]) + (holder as UnifiedSearchFooterViewHolder).run { + bind(sections[section]) + } } } @@ -126,17 +128,19 @@ class UnifiedSearchListAdapter( absolutePosition: Int ) { // TODO different binding (and also maybe diff UI) for non-file results - val itemViewHolder = holder as UnifiedSearchItemViewHolder - val entry = sections[section].entries[relativePosition] - itemViewHolder.bind(entry) + (holder as UnifiedSearchItemViewHolder).run { + val entry = sections[section].entries[relativePosition] + bind(entry) + } } override fun onViewAttachedToWindow(holder: SectionedViewHolder) { if (holder is UnifiedSearchItemViewHolder) { - val thumbnailShimmer = holder.binding.thumbnailShimmer - if (thumbnailShimmer.visibility == View.VISIBLE) { - thumbnailShimmer.setImageResource(R.drawable.background) - thumbnailShimmer.resetLoader() + holder.binding.thumbnailShimmer.run { + if (visibility == View.VISIBLE) { + setImageResource(R.drawable.background) + resetLoader() + } } } } From 46525cc350840006b66e1535bf03ef2cedf778b3 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Tue, 25 Jun 2024 10:26:55 +0200 Subject: [PATCH 04/27] Delete unused functions Signed-off-by: alperozturk --- .../ui/unifiedsearch/UnifiedSearchViewModel.kt | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/unifiedsearch/UnifiedSearchViewModel.kt b/app/src/main/java/com/owncloud/android/ui/unifiedsearch/UnifiedSearchViewModel.kt index 0a3a3f6d27..b348290833 100644 --- a/app/src/main/java/com/owncloud/android/ui/unifiedsearch/UnifiedSearchViewModel.kt +++ b/app/src/main/java/com/owncloud/android/ui/unifiedsearch/UnifiedSearchViewModel.kt @@ -94,14 +94,6 @@ class UnifiedSearchViewModel(application: Application) : AndroidViewModel(applic ) } - open fun startLoading(query: String) { - if (!loadingStarted) { - loadingStarted = true - this.query.value = query - initialQuery() - } - } - /** * Clears data and queries all available providers */ @@ -185,10 +177,6 @@ class UnifiedSearchViewModel(application: Application) : AndroidViewModel(applic } } - open fun clearError() { - error.value = "" - } - fun onError(error: Throwable) { Log_OC.e(TAG, "Error: " + error.stackTrace) } From 55555e7159626827cead51a1c67c0a502cf4a6ff Mon Sep 17 00:00:00 2001 From: alperozturk Date: Tue, 25 Jun 2024 10:58:44 +0200 Subject: [PATCH 05/27] Fix Signed-off-by: alperozturk --- .../ui/unifiedsearch/SearchOnProviderTask.kt | 2 +- .../ui/unifiedsearch/UnifiedSearchViewModel.kt | 17 +++-------------- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/unifiedsearch/SearchOnProviderTask.kt b/app/src/main/java/com/owncloud/android/ui/unifiedsearch/SearchOnProviderTask.kt index 37ed654348..5cbf6d0b34 100644 --- a/app/src/main/java/com/owncloud/android/ui/unifiedsearch/SearchOnProviderTask.kt +++ b/app/src/main/java/com/owncloud/android/ui/unifiedsearch/SearchOnProviderTask.kt @@ -16,7 +16,7 @@ class SearchOnProviderTask( private val provider: String, private val client: NextcloudClient, private val cursor: Int? = null, - private val limit: Int = 6 + private val limit: Int = 5 ) : () -> SearchOnProviderTask.Result { companion object { private const val TAG = "SearchOnProviderTask" diff --git a/app/src/main/java/com/owncloud/android/ui/unifiedsearch/UnifiedSearchViewModel.kt b/app/src/main/java/com/owncloud/android/ui/unifiedsearch/UnifiedSearchViewModel.kt index b348290833..2503aafa7c 100644 --- a/app/src/main/java/com/owncloud/android/ui/unifiedsearch/UnifiedSearchViewModel.kt +++ b/app/src/main/java/com/owncloud/android/ui/unifiedsearch/UnifiedSearchViewModel.kt @@ -30,7 +30,6 @@ import javax.inject.Inject class UnifiedSearchViewModel(application: Application) : AndroidViewModel(application), IUnifiedSearchViewModel { companion object { private const val TAG = "UnifiedSearchViewModel" - private const val DEFAULT_LIMIT = 5 private const val FILES_PROVIDER_ID = "files" } @@ -39,17 +38,6 @@ class UnifiedSearchViewModel(application: Application) : AndroidViewModel(applic ) { fun nextCursor(): Int? = results.lastOrNull()?.cursor?.toInt() fun name(): String? = results.lastOrNull()?.name - fun isFinished(): Boolean { - if (results.isEmpty()) { - return false - } - val lastResult = results.last() - return when { - !lastResult.isPaginated -> true - lastResult.entries.size < DEFAULT_LIMIT -> true - else -> false - } - } } private lateinit var currentAccountProvider: CurrentAccountProvider @@ -62,7 +50,6 @@ class UnifiedSearchViewModel(application: Application) : AndroidViewModel(applic get() = getApplication().applicationContext private lateinit var repository: IUnifiedSearchRepository - private var loadingStarted: Boolean = false private var results: MutableMap = mutableMapOf() override val isLoading = MutableLiveData(false) @@ -201,11 +188,13 @@ class UnifiedSearchViewModel(application: Application) : AndroidViewModel(applic searchResults.value = results .filter { it.value.results.isNotEmpty() } .map { (key, value) -> + val hasMoreResults = results.isNotEmpty() && results[key]?.nextCursor() != null + UnifiedSearchSection( providerID = key, name = value.name()!!, entries = value.results.flatMap { it.entries }, - hasMoreResults = !value.isFinished() + hasMoreResults = hasMoreResults ) } .sortedWith { o1, o2 -> From 62e8f1934d2d59706778087975658e2d963d141d Mon Sep 17 00:00:00 2001 From: alperozturk Date: Tue, 25 Jun 2024 10:25:57 +0200 Subject: [PATCH 06/27] Fix DEFAULT_LIMIT and limit Signed-off-by: alperozturk --- .../owncloud/android/ui/unifiedsearch/SearchOnProviderTask.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/owncloud/android/ui/unifiedsearch/SearchOnProviderTask.kt b/app/src/main/java/com/owncloud/android/ui/unifiedsearch/SearchOnProviderTask.kt index 5cbf6d0b34..37ed654348 100644 --- a/app/src/main/java/com/owncloud/android/ui/unifiedsearch/SearchOnProviderTask.kt +++ b/app/src/main/java/com/owncloud/android/ui/unifiedsearch/SearchOnProviderTask.kt @@ -16,7 +16,7 @@ class SearchOnProviderTask( private val provider: String, private val client: NextcloudClient, private val cursor: Int? = null, - private val limit: Int = 5 + private val limit: Int = 6 ) : () -> SearchOnProviderTask.Result { companion object { private const val TAG = "SearchOnProviderTask" From a180ec39629509de995ec3df3578054889c67cb6 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Tue, 25 Jun 2024 10:58:44 +0200 Subject: [PATCH 07/27] Fix Signed-off-by: alperozturk --- .../owncloud/android/ui/unifiedsearch/SearchOnProviderTask.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/owncloud/android/ui/unifiedsearch/SearchOnProviderTask.kt b/app/src/main/java/com/owncloud/android/ui/unifiedsearch/SearchOnProviderTask.kt index 37ed654348..5cbf6d0b34 100644 --- a/app/src/main/java/com/owncloud/android/ui/unifiedsearch/SearchOnProviderTask.kt +++ b/app/src/main/java/com/owncloud/android/ui/unifiedsearch/SearchOnProviderTask.kt @@ -16,7 +16,7 @@ class SearchOnProviderTask( private val provider: String, private val client: NextcloudClient, private val cursor: Int? = null, - private val limit: Int = 6 + private val limit: Int = 5 ) : () -> SearchOnProviderTask.Result { companion object { private const val TAG = "SearchOnProviderTask" From cd40af590ad05d4e6186e4b28984e6e3059cfca6 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Tue, 25 Jun 2024 12:54:34 +0200 Subject: [PATCH 08/27] Fix NumberFormatException for test Signed-off-by: alperozturk --- .../android/ui/unifiedsearch/UnifiedSearchViewModel.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/owncloud/android/ui/unifiedsearch/UnifiedSearchViewModel.kt b/app/src/main/java/com/owncloud/android/ui/unifiedsearch/UnifiedSearchViewModel.kt index 2503aafa7c..16430ad221 100644 --- a/app/src/main/java/com/owncloud/android/ui/unifiedsearch/UnifiedSearchViewModel.kt +++ b/app/src/main/java/com/owncloud/android/ui/unifiedsearch/UnifiedSearchViewModel.kt @@ -36,7 +36,13 @@ class UnifiedSearchViewModel(application: Application) : AndroidViewModel(applic private data class UnifiedSearchMetadata( var results: MutableList = mutableListOf() ) { - fun nextCursor(): Int? = results.lastOrNull()?.cursor?.toInt() + fun nextCursor(): Int? { + return try { + results.lastOrNull()?.cursor?.toInt() + } catch (e: NumberFormatException) { + null + } + } fun name(): String? = results.lastOrNull()?.name } From 59e721c405ce4752cfde1a3443f2ad190da88268 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Wed, 26 Jun 2024 13:57:02 +0200 Subject: [PATCH 09/27] Remove statement Signed-off-by: alperozturk --- .../android/ui/unifiedsearch/UnifiedSearchViewModel.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/unifiedsearch/UnifiedSearchViewModel.kt b/app/src/main/java/com/owncloud/android/ui/unifiedsearch/UnifiedSearchViewModel.kt index 16430ad221..d8a363f926 100644 --- a/app/src/main/java/com/owncloud/android/ui/unifiedsearch/UnifiedSearchViewModel.kt +++ b/app/src/main/java/com/owncloud/android/ui/unifiedsearch/UnifiedSearchViewModel.kt @@ -43,6 +43,7 @@ class UnifiedSearchViewModel(application: Application) : AndroidViewModel(applic null } } + fun name(): String? = results.lastOrNull()?.name } @@ -131,6 +132,7 @@ class UnifiedSearchViewModel(application: Application) : AndroidViewModel(applic isLoading.value = false } } + else -> block() } } @@ -151,6 +153,7 @@ class UnifiedSearchViewModel(application: Application) : AndroidViewModel(applic val fullUrl = serverUrl + result.resourceUrl Uri.parse(fullUrl) } + else -> uri } } @@ -194,13 +197,11 @@ class UnifiedSearchViewModel(application: Application) : AndroidViewModel(applic searchResults.value = results .filter { it.value.results.isNotEmpty() } .map { (key, value) -> - val hasMoreResults = results.isNotEmpty() && results[key]?.nextCursor() != null - UnifiedSearchSection( providerID = key, name = value.name()!!, entries = value.results.flatMap { it.entries }, - hasMoreResults = hasMoreResults + hasMoreResults = results.isNotEmpty() && results[key]?.nextCursor() != null ) } .sortedWith { o1, o2 -> From a971dbd5d2286a388cb752697bb5fa2cad9506b0 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Wed, 26 Jun 2024 14:36:01 +0200 Subject: [PATCH 10/27] Check last entry Signed-off-by: alperozturk --- .../android/ui/unifiedsearch/UnifiedSearchViewModel.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/unifiedsearch/UnifiedSearchViewModel.kt b/app/src/main/java/com/owncloud/android/ui/unifiedsearch/UnifiedSearchViewModel.kt index d8a363f926..10f0239c02 100644 --- a/app/src/main/java/com/owncloud/android/ui/unifiedsearch/UnifiedSearchViewModel.kt +++ b/app/src/main/java/com/owncloud/android/ui/unifiedsearch/UnifiedSearchViewModel.kt @@ -43,7 +43,6 @@ class UnifiedSearchViewModel(application: Application) : AndroidViewModel(applic null } } - fun name(): String? = results.lastOrNull()?.name } @@ -197,11 +196,13 @@ class UnifiedSearchViewModel(application: Application) : AndroidViewModel(applic searchResults.value = results .filter { it.value.results.isNotEmpty() } .map { (key, value) -> + val isLastEntryHaveValue = results[key]?.results?.last()?.entries?.isEmpty() != true + UnifiedSearchSection( providerID = key, name = value.name()!!, entries = value.results.flatMap { it.entries }, - hasMoreResults = results.isNotEmpty() && results[key]?.nextCursor() != null + hasMoreResults = isLastEntryHaveValue && results[key]?.nextCursor() != null ) } .sortedWith { o1, o2 -> From dc2217784e93a3e873de16c86417170f403c082a Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Thu, 27 Jun 2024 02:40:46 +0000 Subject: [PATCH 11/27] Fix(l10n): Update translations from Transifex Signed-off-by: Nextcloud bot --- app/src/main/res/values-ast/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-ast/strings.xml b/app/src/main/res/values-ast/strings.xml index 96cd987da8..7d42b8e62d 100644 --- a/app/src/main/res/values-ast/strings.xml +++ b/app/src/main/res/values-ast/strings.xml @@ -574,6 +574,7 @@ Posar toles descargues Siguir con toles descargues Nun se pue crear el ficheru llocal + Videu Nome de ficheru Triba de ficheru Toles descargues tán posaes From 8d6a0997708cc2abb64fd55a15657bdaad4b5669 Mon Sep 17 00:00:00 2001 From: camillo-positano Date: Thu, 20 Jun 2024 14:20:56 +0200 Subject: [PATCH 12/27] fix for media tab not showing thumbnails when image is on server only and not in the cache manager. Signed-off-by: camillo-positano --- .../owncloud/android/datamodel/ThumbnailsCacheManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java b/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java index 5ab930d041..c4bd1d9a83 100644 --- a/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java +++ b/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java @@ -289,7 +289,7 @@ public final class ThumbnailsCacheManager { file = (OCFile) params[0]; - if (file.getRemoteId() != null && file.isPreviewAvailable()) { + if (file.getRemoteId() != null || file.isPreviewAvailable()) { // Thumbnail in cache? thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache( ThumbnailsCacheManager.PREFIX_RESIZED_IMAGE + file.getRemoteId() @@ -1423,7 +1423,7 @@ public final class ThumbnailsCacheManager { } } - // resized dimensions + // resized dimensions and set update thumbnail needed to false to prevent rendering loop if (thumbnail != null) { file.setImageDimension(new ImageDimension(thumbnail.getWidth(), thumbnail.getHeight())); storageManager.saveFile(file); From 32fc7c5ae26ecc7f28e6fe8e20d035df3f6f1bcd Mon Sep 17 00:00:00 2001 From: camillo-positano Date: Thu, 20 Jun 2024 15:33:00 +0200 Subject: [PATCH 13/27] fix for update loop Signed-off-by: camillo-positano --- .../com/owncloud/android/datamodel/ThumbnailsCacheManager.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java b/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java index c4bd1d9a83..ba42813133 100644 --- a/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java +++ b/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java @@ -1426,6 +1426,7 @@ public final class ThumbnailsCacheManager { // resized dimensions and set update thumbnail needed to false to prevent rendering loop if (thumbnail != null) { file.setImageDimension(new ImageDimension(thumbnail.getWidth(), thumbnail.getHeight())); + file.setUpdateThumbnailNeeded(false); storageManager.saveFile(file); } } From d42198a96fd2d3449cd1e77b1219ccd1aba50063 Mon Sep 17 00:00:00 2001 From: camillo-positano Date: Thu, 20 Jun 2024 17:05:20 +0200 Subject: [PATCH 14/27] added logic to check that params is populated and is an instance of OCFile. Added log when there is no preview and no remote id. Signed-off-by: camillo-positano --- .../owncloud/android/datamodel/ThumbnailsCacheManager.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java b/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java index ba42813133..7a321f232f 100644 --- a/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java +++ b/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java @@ -286,8 +286,12 @@ public final class ThumbnailsCacheManager { protected Bitmap doInBackground(Object... params) { Bitmap thumbnail; - file = (OCFile) params[0]; + if (params == null || params.length == 0 || !(params[0] instanceof OCFile)) { + Log_OC.d(TAG, "Downloaded file is null or is not an instance of OCFile"); + return null; + } + file = (OCFile) params[0]; if (file.getRemoteId() != null || file.isPreviewAvailable()) { // Thumbnail in cache? @@ -335,6 +339,7 @@ public final class ThumbnailsCacheManager { } } + Log_OC.d(TAG, "File cannot be previewed"); return null; } From 92d641eabcfebb242799c8e176fa72d95e26dd49 Mon Sep 17 00:00:00 2001 From: camillo-positano Date: Thu, 20 Jun 2024 17:51:53 +0200 Subject: [PATCH 15/27] extracted method and improved code Signed-off-by: camillo-positano --- .../datamodel/ThumbnailsCacheManager.java | 85 ++++++++++--------- 1 file changed, 46 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java b/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java index 7a321f232f..d080a626ac 100644 --- a/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java +++ b/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java @@ -296,53 +296,60 @@ public final class ThumbnailsCacheManager { if (file.getRemoteId() != null || file.isPreviewAvailable()) { // Thumbnail in cache? thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache( - ThumbnailsCacheManager.PREFIX_RESIZED_IMAGE + file.getRemoteId() - ); + ThumbnailsCacheManager.PREFIX_RESIZED_IMAGE + file.getRemoteId()); - if (thumbnail != null && !file.isUpdateThumbnailNeeded()) { - Float size = (float) ThumbnailsCacheManager.getThumbnailDimension(); + if (thumbnail != null && !file.isUpdateThumbnailNeeded()) + return getThumbnailFromCache(thumbnail); - // resized dimensions - ImageDimension imageDimension = file.getImageDimension(); - if (imageDimension == null || - imageDimension.getWidth() != size || - imageDimension.getHeight() != size) { - file.setImageDimension(new ImageDimension(thumbnail.getWidth(), thumbnail.getHeight())); - storageManager.saveFile(file); - } - - if (MimeTypeUtil.isVideo(file)) { - return ThumbnailsCacheManager.addVideoOverlay(thumbnail, MainApp.getAppContext()); - } else { - return thumbnail; - } - } else { - try { - mClient = OwnCloudClientManagerFactory.getDefaultSingleton().getClientFor(user.toOwnCloudAccount(), - MainApp.getAppContext()); - - thumbnail = doResizedImageInBackground(file, storageManager); - newImage = true; - - if (MimeTypeUtil.isVideo(file) && thumbnail != null) { - thumbnail = addVideoOverlay(thumbnail, MainApp.getAppContext()); - } - - } catch (OutOfMemoryError oome) { - Log_OC.e(TAG, "Out of memory"); - } catch (Throwable t) { - // the app should never break due to a problem with thumbnails - Log_OC.e(TAG, "Generation of gallery image for " + file + " failed", t); - } - - return thumbnail; - } + return getThumbnailFromServerAndAddToCache(thumbnail); } Log_OC.d(TAG, "File cannot be previewed"); return null; } + @Nullable + private Bitmap getThumbnailFromServerAndAddToCache(Bitmap thumbnail) { + try { + mClient = OwnCloudClientManagerFactory.getDefaultSingleton().getClientFor(user.toOwnCloudAccount(), + MainApp.getAppContext()); + + thumbnail = doResizedImageInBackground(file, storageManager); + newImage = true; + + if (MimeTypeUtil.isVideo(file) && thumbnail != null) { + thumbnail = addVideoOverlay(thumbnail, MainApp.getAppContext()); + } + + } catch (OutOfMemoryError oome) { + Log_OC.e(TAG, "Out of memory"); + } catch (Throwable t) { + // the app should never break due to a problem with thumbnails + Log_OC.e(TAG, "Generation of gallery image for " + file + " failed", t); + } + + return thumbnail; + } + + private Bitmap getThumbnailFromCache(Bitmap thumbnail) { + float size = (float) ThumbnailsCacheManager.getThumbnailDimension(); + + // resized dimensions + ImageDimension imageDimension = file.getImageDimension(); + if (imageDimension == null || + imageDimension.getWidth() != size || + imageDimension.getHeight() != size) { + file.setImageDimension(new ImageDimension(thumbnail.getWidth(), thumbnail.getHeight())); + storageManager.saveFile(file); + } + + if (MimeTypeUtil.isVideo(file)) { + return ThumbnailsCacheManager.addVideoOverlay(thumbnail, MainApp.getAppContext()); + } else { + return thumbnail; + } + } + protected void onPostExecute(Bitmap bitmap) { if (bitmap != null && imageViewReference != null) { final ImageView imageView = imageViewReference.get(); From 68c8b21b3e2c8ce86654c0978ace0b5f6c231453 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Fri, 21 Jun 2024 17:05:23 +0200 Subject: [PATCH 16/27] Rename .java to .kt Signed-off-by: alperozturk --- .../adapter/{SyncedFolderAdapter.java => SyncedFolderAdapter.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename app/src/main/java/com/owncloud/android/ui/adapter/{SyncedFolderAdapter.java => SyncedFolderAdapter.kt} (100%) diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/SyncedFolderAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/SyncedFolderAdapter.kt similarity index 100% rename from app/src/main/java/com/owncloud/android/ui/adapter/SyncedFolderAdapter.java rename to app/src/main/java/com/owncloud/android/ui/adapter/SyncedFolderAdapter.kt From c19c2156d1ad5deb1d8bab9ad353162073ee47a7 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Wed, 26 Jun 2024 12:36:21 +0200 Subject: [PATCH 17/27] Fix git conflict Signed-off-by: alperozturk --- .../ui/activity/SyncedFoldersActivity.kt | 22 +- .../android/ui/adapter/SyncedFolderAdapter.kt | 598 +++++++++--------- 2 files changed, 315 insertions(+), 305 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt index 92b17dfb2c..ed301b3075 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt @@ -222,11 +222,12 @@ class SyncedFoldersActivity : private fun showPowerCheckDialog() { val alertDialog = AlertDialog.Builder(this) - .setView(findViewById(R.id.root_layout)) + .setView(R.id.root_layout) .setPositiveButton(R.string.common_ok) { dialog, _ -> dialog.dismiss() } .setTitle(R.string.autoupload_disable_power_save_check) .setMessage(getString(R.string.power_save_check_dialog_message)) .show() + viewThemeUtils.platform.colorTextButtons(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE)) } @@ -307,7 +308,8 @@ class SyncedFoldersActivity : } val syncFolderItems = sortSyncedFolderItems( mergeFolderData(currentAccountSyncedFoldersList, mediaFolders) - ) + ).filterNotNull() + CoroutineScope(Dispatchers.Main).launch { adapter.setSyncFolderItems(syncFolderItems) adapter.notifyDataSetChanged() @@ -315,7 +317,9 @@ class SyncedFoldersActivity : if (!TextUtils.isEmpty(path)) { val section = adapter.getSectionByLocalPathAndType(path, type) if (section >= 0) { - onSyncFolderSettingsClick(section, adapter[section]) + adapter.get(section)?.let { + onSyncFolderSettingsClick(section, it) + } } } loadJob = null @@ -559,7 +563,9 @@ class SyncedFoldersActivity : return result } - override fun onSyncStatusToggleClick(section: Int, syncedFolderDisplayItem: SyncedFolderDisplayItem) { + override fun onSyncStatusToggleClick(section: Int, syncedFolderDisplayItem: SyncedFolderDisplayItem?) { + if (syncedFolderDisplayItem == null) return + if (syncedFolderDisplayItem.id > SyncedFolder.UNPERSISTED_ID) { syncedFolderProvider.updateSyncedFolderEnabled( syncedFolderDisplayItem.id, @@ -577,7 +583,7 @@ class SyncedFoldersActivity : } } - override fun onSyncFolderSettingsClick(section: Int, syncedFolderDisplayItem: SyncedFolderDisplayItem) { + override fun onSyncFolderSettingsClick(section: Int, syncedFolderDisplayItem: SyncedFolderDisplayItem?) { val fragmentTransaction = supportFragmentManager.beginTransaction().apply { addToBackStack(null) } @@ -596,7 +602,9 @@ class SyncedFoldersActivity : } } - override fun onVisibilityToggleClick(section: Int, syncedFolder: SyncedFolderDisplayItem) { + override fun onVisibilityToggleClick(section: Int, syncedFolder: SyncedFolderDisplayItem?) { + if (syncedFolder == null) return + syncedFolder.isHidden = !syncedFolder.isHidden saveOrUpdateSyncedFolder(syncedFolder) adapter.setSyncFolderItem(section, syncedFolder) @@ -676,7 +684,7 @@ class SyncedFoldersActivity : saveOrUpdateSyncedFolder(newCustomFolder) adapter.addSyncFolderItem(newCustomFolder) } else { - val item = adapter[syncedFolder.section] + val item = adapter.get(syncedFolder.section) ?: return updateSyncedFolderItem( item, syncedFolder.id, diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/SyncedFolderAdapter.kt b/app/src/main/java/com/owncloud/android/ui/adapter/SyncedFolderAdapter.kt index 026f9e2351..215f23f1f4 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/SyncedFolderAdapter.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/SyncedFolderAdapter.kt @@ -5,134 +5,123 @@ * SPDX-FileCopyrightText: 2016 Nextcloud * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only */ -package com.owncloud.android.ui.adapter; +package com.owncloud.android.ui.adapter -import android.content.Context; -import android.view.LayoutInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageButton; -import android.widget.PopupMenu; - -import com.afollestad.sectionedrecyclerview.SectionedRecyclerViewAdapter; -import com.afollestad.sectionedrecyclerview.SectionedViewHolder; -import com.nextcloud.client.core.Clock; -import com.owncloud.android.R; -import com.owncloud.android.databinding.GridSyncItemBinding; -import com.owncloud.android.databinding.SyncedFoldersEmptyBinding; -import com.owncloud.android.databinding.SyncedFoldersFooterBinding; -import com.owncloud.android.databinding.SyncedFoldersItemHeaderBinding; -import com.owncloud.android.datamodel.MediaFolderType; -import com.owncloud.android.datamodel.SyncedFolderDisplayItem; -import com.owncloud.android.datamodel.ThumbnailsCacheManager; -import com.owncloud.android.utils.theme.ViewThemeUtils; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; - -import androidx.annotation.NonNull; -import androidx.annotation.VisibleForTesting; +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup +import android.widget.ImageButton +import android.widget.PopupMenu +import androidx.annotation.VisibleForTesting +import com.afollestad.sectionedrecyclerview.SectionedRecyclerViewAdapter +import com.afollestad.sectionedrecyclerview.SectionedViewHolder +import com.nextcloud.android.common.ui.theme.utils.ColorRole +import com.nextcloud.client.core.Clock +import com.owncloud.android.R +import com.owncloud.android.databinding.GridSyncItemBinding +import com.owncloud.android.databinding.SyncedFoldersEmptyBinding +import com.owncloud.android.databinding.SyncedFoldersFooterBinding +import com.owncloud.android.databinding.SyncedFoldersItemHeaderBinding +import com.owncloud.android.datamodel.MediaFolderType +import com.owncloud.android.datamodel.SyncedFolderDisplayItem +import com.owncloud.android.datamodel.ThumbnailsCacheManager +import com.owncloud.android.datamodel.ThumbnailsCacheManager.AsyncMediaThumbnailDrawable +import com.owncloud.android.datamodel.ThumbnailsCacheManager.MediaThumbnailGenerationTask +import com.owncloud.android.utils.theme.ViewThemeUtils +import java.io.File +import java.util.Locale +import java.util.concurrent.Executor +import java.util.concurrent.Executors /** * Adapter to display all auto-synced folders and/or instant upload media folders. */ -public class SyncedFolderAdapter extends SectionedRecyclerViewAdapter { +@Suppress("LongParameterList") +class SyncedFolderAdapter( + private val context: Context, + private val clock: Clock, + private val gridWidth: Int, + private val clickListener: ClickListener, + private val light: Boolean, + private val viewThemeUtils: ViewThemeUtils +) : SectionedRecyclerViewAdapter() { - private final Context context; - private final Clock clock; - private final int gridWidth; - private final int gridTotal; - private final ClickListener clickListener; - private final List syncFolderItems; - private final List filteredSyncFolderItems; - private final boolean light; - private static final int VIEW_TYPE_EMPTY = Integer.MAX_VALUE; - private static final int VIEW_TYPE_ITEM = 1; - private static final int VIEW_TYPE_HEADER = 2; - private static final int VIEW_TYPE_FOOTER = 3; - private boolean hideItems; - private final ViewThemeUtils viewThemeUtils; - private final Executor thumbnailThreadPool; + private val gridTotal = gridWidth * 2 + private val syncFolderItems: MutableList = ArrayList() + private val filteredSyncFolderItems: MutableList = ArrayList() + private var hideItems = true + private val thumbnailThreadPool: Executor = Executors.newCachedThreadPool() - public SyncedFolderAdapter(Context context, - Clock clock, - int gridWidth, - ClickListener listener, - boolean light, - ViewThemeUtils viewThemeUtils) { - this.context = context; - this.clock = clock; - this.gridWidth = gridWidth; - gridTotal = gridWidth * 2; - clickListener = listener; - syncFolderItems = new ArrayList<>(); - filteredSyncFolderItems = new ArrayList<>(); - this.light = light; - this.hideItems = true; - this.viewThemeUtils = viewThemeUtils; - this.thumbnailThreadPool = Executors.newCachedThreadPool(); - - shouldShowHeadersForEmptySections(true); - shouldShowFooters(true); + init { + shouldShowHeadersForEmptySections(true) + shouldShowFooters(true) } - public void toggleHiddenItemsVisibility() { - hideItems = !hideItems; - filteredSyncFolderItems.clear(); - filteredSyncFolderItems.addAll(filterHiddenItems(syncFolderItems, hideItems)); - notifyDataSetChanged(); + @SuppressLint("NotifyDataSetChanged") + fun toggleHiddenItemsVisibility() { + hideItems = !hideItems + + filterHiddenItems(syncFolderItems, hideItems)?.let { + filteredSyncFolderItems.clear() + filteredSyncFolderItems.addAll(it) + notifyDataSetChanged() + } } - public void setSyncFolderItems(List syncFolderItems) { - this.syncFolderItems.clear(); - this.syncFolderItems.addAll(syncFolderItems); + fun setSyncFolderItems(syncFolderItems: List) { + this.syncFolderItems.clear() + this.syncFolderItems.addAll(syncFolderItems) - this.filteredSyncFolderItems.clear(); - this.filteredSyncFolderItems.addAll(filterHiddenItems(this.syncFolderItems, hideItems)); + filterHiddenItems(this.syncFolderItems, hideItems)?.let { + filteredSyncFolderItems.clear() + filteredSyncFolderItems.addAll(it) + } } - public void setSyncFolderItem(int location, SyncedFolderDisplayItem syncFolderItem) { - if (hideItems && syncFolderItem.isHidden() && filteredSyncFolderItems.contains(syncFolderItem)) { - filteredSyncFolderItems.remove(location); + @SuppressLint("NotifyDataSetChanged") + fun setSyncFolderItem(location: Int, syncFolderItem: SyncedFolderDisplayItem) { + if (hideItems && syncFolderItem.isHidden && filteredSyncFolderItems.contains(syncFolderItem)) { + filteredSyncFolderItems.removeAt(location) } else { if (filteredSyncFolderItems.contains(syncFolderItem)) { - filteredSyncFolderItems.set(filteredSyncFolderItems.indexOf(syncFolderItem), syncFolderItem); + filteredSyncFolderItems[filteredSyncFolderItems.indexOf(syncFolderItem)] = syncFolderItem } else { - filteredSyncFolderItems.add(syncFolderItem); + filteredSyncFolderItems.add(syncFolderItem) } } if (syncFolderItems.contains(syncFolderItem)) { - syncFolderItems.set(syncFolderItems.indexOf(syncFolderItem), syncFolderItem); + syncFolderItems[syncFolderItems.indexOf(syncFolderItem)] = syncFolderItem } else { - syncFolderItems.add(syncFolderItem); + syncFolderItems.add(syncFolderItem) } - notifyDataSetChanged(); + notifyDataSetChanged() } - public void addSyncFolderItem(SyncedFolderDisplayItem syncFolderItem) { - syncFolderItems.add(syncFolderItem); + @SuppressLint("NotifyDataSetChanged") + fun addSyncFolderItem(syncFolderItem: SyncedFolderDisplayItem) { + syncFolderItems.add(syncFolderItem) // add item for display when either all items should be shown (!hideItems) // or if item should be shown (!.isHidden()) - if (!hideItems || !syncFolderItem.isHidden()) { - filteredSyncFolderItems.add(syncFolderItem); - notifyDataSetChanged(); + if (!hideItems || !syncFolderItem.isHidden) { + filteredSyncFolderItems.add(syncFolderItem) + notifyDataSetChanged() } } - public void removeItem(int section) { - if (filteredSyncFolderItems.contains(syncFolderItems.get(section))) { - filteredSyncFolderItems.remove(syncFolderItems.get(section)); - notifyDataSetChanged(); + @SuppressLint("NotifyDataSetChanged") + fun removeItem(section: Int) { + if (filteredSyncFolderItems.contains(syncFolderItems[section])) { + filteredSyncFolderItems.remove(syncFolderItems[section]) + notifyDataSetChanged() } - syncFolderItems.remove(section); + + syncFolderItems.removeAt(section) } /** @@ -141,94 +130,95 @@ public class SyncedFolderAdapter extends SectionedRecyclerViewAdapter filterHiddenItems(List items, boolean hide) { + private fun filterHiddenItems( + items: List?, + hide: Boolean + ): List? { if (!hide) { - return items; + return items } else { - List result = new ArrayList<>(); + val result: MutableList = ArrayList() - for (SyncedFolderDisplayItem item : items) { - if (!item.isHidden() && !result.contains(item)) { - result.add(item); + for (item in items!!) { + if (!item.isHidden && !result.contains(item)) { + result.add(item) } } - return result; + return result } } - @Override - public int getSectionCount() { - if (filteredSyncFolderItems.size() > 0) { - return filteredSyncFolderItems.size() + 1; + override fun getSectionCount(): Int { + return if (filteredSyncFolderItems.size > 0) { + filteredSyncFolderItems.size + 1 } else { - return 0; + 0 } } @VisibleForTesting - public void clear() { - filteredSyncFolderItems.clear(); - syncFolderItems.clear(); + fun clear() { + filteredSyncFolderItems.clear() + syncFolderItems.clear() } - public int getUnfilteredSectionCount() { - if (syncFolderItems.size() > 0) { - return syncFolderItems.size() + 1; + val unfilteredSectionCount: Int + get() = if (syncFolderItems.size > 0) { + syncFolderItems.size + 1 } else { - return 0; + 0 } - } - @Override - public int getItemCount(int section) { - if (section < filteredSyncFolderItems.size()) { - List filePaths = filteredSyncFolderItems.get(section).getFilePaths(); + override fun getItemCount(section: Int): Int { + if (section < filteredSyncFolderItems.size) { + val filePaths = filteredSyncFolderItems[section].filePaths - if (filePaths != null) { - return filteredSyncFolderItems.get(section).getFilePaths().size(); + return if (filePaths != null) { + filteredSyncFolderItems[section].filePaths.size } else { - return 1; + 1 } } else { - return 1; + return 1 } } - public SyncedFolderDisplayItem get(int section) { - return filteredSyncFolderItems.get(section); - } - - @Override - public int getItemViewType(int section, int relativePosition, int absolutePosition) { - if (isLastSection(section)) { - return VIEW_TYPE_EMPTY; + fun get(section: Int): SyncedFolderDisplayItem? { + return if (section in filteredSyncFolderItems.indices) { + filteredSyncFolderItems[section] } else { - return VIEW_TYPE_ITEM; + null } } - @Override - public int getHeaderViewType(int section) { - if (isLastSection(section)) { - return VIEW_TYPE_EMPTY; + override fun getItemViewType(section: Int, relativePosition: Int, absolutePosition: Int): Int { + return if (isLastSection(section)) { + VIEW_TYPE_EMPTY } else { - return VIEW_TYPE_HEADER; + VIEW_TYPE_ITEM } } - @Override - public int getFooterViewType(int section) { - if (isLastSection(section) && showFooter()) { - return VIEW_TYPE_FOOTER; + override fun getHeaderViewType(section: Int): Int { + return if (isLastSection(section)) { + VIEW_TYPE_EMPTY + } else { + VIEW_TYPE_HEADER + } + } + + override fun getFooterViewType(section: Int): Int { + return if (isLastSection(section) && showFooter()) { + VIEW_TYPE_FOOTER } else { // only show footer after last item and only if folders have been hidden - return VIEW_TYPE_EMPTY; + VIEW_TYPE_EMPTY } } - private boolean showFooter() { - return syncFolderItems.size() > filteredSyncFolderItems.size(); + private fun showFooter(): Boolean { + return syncFolderItems.size > filteredSyncFolderItems.size } /** @@ -236,219 +226,231 @@ public class SyncedFolderAdapter extends SectionedRecyclerViewAdapter-1 if not present + * @return the section index of the looked up synced folder, `-1` if not present */ - public int getSectionByLocalPathAndType(String localPath, int type) { - for (int i = 0; i < filteredSyncFolderItems.size(); i++) { - if (filteredSyncFolderItems.get(i).getLocalPath().equalsIgnoreCase(localPath) && - filteredSyncFolderItems.get(i).getType().id == type) { - return i; + fun getSectionByLocalPathAndType(localPath: String?, type: Int): Int { + for (i in filteredSyncFolderItems.indices) { + if (filteredSyncFolderItems[i].localPath.equals(localPath, ignoreCase = true) && + filteredSyncFolderItems[i].type.id == type + ) { + return i } } - return -1; + return -1 } - @Override - public void onBindHeaderViewHolder(SectionedViewHolder commonHolder, final int section, boolean expanded) { - if (section < filteredSyncFolderItems.size()) { - HeaderViewHolder holder = (HeaderViewHolder) commonHolder; - holder.binding.headerContainer.setVisibility(View.VISIBLE); + override fun onBindHeaderViewHolder(commonHolder: SectionedViewHolder, section: Int, expanded: Boolean) { + if (section < filteredSyncFolderItems.size) { + val holder = commonHolder as HeaderViewHolder + holder.binding.headerContainer.visibility = View.VISIBLE - holder.binding.title.setText(filteredSyncFolderItems.get(section).getFolderName()); + holder.binding.title.text = filteredSyncFolderItems[section].folderName - if (MediaFolderType.VIDEO == filteredSyncFolderItems.get(section).getType()) { - holder.binding.type.setImageResource(R.drawable.video_32dp); - } else if (MediaFolderType.IMAGE == filteredSyncFolderItems.get(section).getType()) { - holder.binding.type.setImageResource(R.drawable.image_32dp); + if (MediaFolderType.VIDEO == filteredSyncFolderItems[section].type) { + holder.binding.type.setImageResource(R.drawable.video_32dp) + } else if (MediaFolderType.IMAGE == filteredSyncFolderItems[section].type) { + holder.binding.type.setImageResource(R.drawable.image_32dp) } else { - holder.binding.type.setImageResource(R.drawable.folder_star_32dp); + holder.binding.type.setImageResource(R.drawable.folder_star_32dp) } - holder.binding.syncStatusButton.setVisibility(View.VISIBLE); - holder.binding.syncStatusButton.setTag(section); - holder.binding.syncStatusButton.setOnClickListener(v -> { - filteredSyncFolderItems.get(section).setEnabled( - !filteredSyncFolderItems.get(section).isEnabled(), - clock.getCurrentTime() - ); + holder.binding.syncStatusButton.visibility = View.VISIBLE + holder.binding.syncStatusButton.tag = section + holder.binding.syncStatusButton.setOnClickListener { + filteredSyncFolderItems[section].setEnabled( + !filteredSyncFolderItems[section].isEnabled, + clock.currentTime + ) setSyncButtonActiveIcon( holder.binding.syncStatusButton, - filteredSyncFolderItems.get(section).isEnabled()); - clickListener.onSyncStatusToggleClick(section, filteredSyncFolderItems.get(section)); - }); - setSyncButtonActiveIcon(holder.binding.syncStatusButton, filteredSyncFolderItems.get(section).isEnabled()); + filteredSyncFolderItems[section].isEnabled + ) + clickListener.onSyncStatusToggleClick(section, filteredSyncFolderItems[section]) + } + setSyncButtonActiveIcon(holder.binding.syncStatusButton, filteredSyncFolderItems[section].isEnabled) if (light) { - holder.binding.settingsButton.setVisibility(View.GONE); + holder.binding.settingsButton.visibility = View.GONE } else { - holder.binding.settingsButton.setVisibility(View.VISIBLE); - holder.binding.settingsButton.setTag(section); - holder.binding.settingsButton.setOnClickListener( - v -> onOverflowIconClicked(section, filteredSyncFolderItems.get(section), v)); + holder.binding.settingsButton.visibility = View.VISIBLE + holder.binding.settingsButton.tag = section + holder.binding.settingsButton.setOnClickListener { v: View -> + onOverflowIconClicked( + section, + filteredSyncFolderItems[section], + v + ) + } } } } - private void onOverflowIconClicked(int section, SyncedFolderDisplayItem item, View view) { - PopupMenu popup = new PopupMenu(context, view); - popup.inflate(R.menu.synced_folders_adapter); - popup.setOnMenuItemClickListener(i -> optionsItemSelected(i, section, item)); - popup.getMenu() - .findItem(R.id.action_auto_upload_folder_toggle_visibility) - .setChecked(item.isHidden()); + private fun onOverflowIconClicked(section: Int, item: SyncedFolderDisplayItem, view: View) { + val popup = PopupMenu(context, view).apply { + inflate(R.menu.synced_folders_adapter) + setOnMenuItemClickListener { i: MenuItem -> optionsItemSelected(i, section, item) } + menu + .findItem(R.id.action_auto_upload_folder_toggle_visibility) + .setChecked(item.isHidden) + } - popup.show(); + popup.show() } - private boolean optionsItemSelected(MenuItem menuItem, int section, SyncedFolderDisplayItem item) { - if (menuItem.getItemId() == R.id.action_auto_upload_folder_toggle_visibility) { - clickListener.onVisibilityToggleClick(section, item); + private fun optionsItemSelected(menuItem: MenuItem, section: Int, item: SyncedFolderDisplayItem): Boolean { + if (menuItem.itemId == R.id.action_auto_upload_folder_toggle_visibility) { + clickListener.onVisibilityToggleClick(section, item) } else { // default: R.id.action_create_custom_folder - clickListener.onSyncFolderSettingsClick(section, item); + clickListener.onSyncFolderSettingsClick(section, item) } - return true; + return true } - @Override - public void onBindFooterViewHolder(SectionedViewHolder holder, int section) { + override fun onBindFooterViewHolder(holder: SectionedViewHolder, section: Int) { if (isLastSection(section) && showFooter()) { - FooterViewHolder footerHolder = (FooterViewHolder) holder; - footerHolder.binding.footerText.setOnClickListener(v -> toggleHiddenItemsVisibility()); - footerHolder.binding.footerText.setText( - context.getResources().getQuantityString( - R.plurals.synced_folders_show_hidden_folders, - getHiddenFolderCount(), - getHiddenFolderCount() - ) - ); + val footerHolder = holder as FooterViewHolder + footerHolder.binding.footerText.setOnClickListener { toggleHiddenItemsVisibility() } + footerHolder.binding.footerText.text = context.resources.getQuantityString( + R.plurals.synced_folders_show_hidden_folders, + hiddenFolderCount, + hiddenFolderCount + ) } } - @Override - public void onBindViewHolder(SectionedViewHolder commonHolder, int section, int relativePosition, - int absolutePosition) { - if (section < filteredSyncFolderItems.size() && filteredSyncFolderItems.get(section).getFilePaths() != null) { - MainViewHolder holder = (MainViewHolder) commonHolder; + override fun onBindViewHolder( + commonHolder: SectionedViewHolder, + section: Int, + relativePosition: Int, + absolutePosition: Int + ) { + if (section < filteredSyncFolderItems.size && filteredSyncFolderItems[section].filePaths != null) { + val holder = commonHolder as MainViewHolder - File file = new File(filteredSyncFolderItems.get(section).getFilePaths().get(relativePosition)); + val file = File(filteredSyncFolderItems[section].filePaths[relativePosition]) - ThumbnailsCacheManager.MediaThumbnailGenerationTask task = - new ThumbnailsCacheManager.MediaThumbnailGenerationTask(holder.binding.thumbnail, - context, - viewThemeUtils); + val task = + MediaThumbnailGenerationTask( + holder.binding.thumbnail, + context, + viewThemeUtils + ) - ThumbnailsCacheManager.AsyncMediaThumbnailDrawable asyncDrawable = - new ThumbnailsCacheManager.AsyncMediaThumbnailDrawable( - context.getResources(), - ThumbnailsCacheManager.mDefaultImg - ); - holder.binding.thumbnail.setImageDrawable(asyncDrawable); + val asyncDrawable = + AsyncMediaThumbnailDrawable( + context.resources, + ThumbnailsCacheManager.mDefaultImg + ) + holder.binding.thumbnail.setImageDrawable(asyncDrawable) - task.executeOnExecutor(thumbnailThreadPool, file); + task.executeOnExecutor(thumbnailThreadPool, file) // set proper tag - holder.binding.thumbnail.setTag(file.hashCode()); + holder.binding.thumbnail.tag = file.hashCode() - holder.itemView.setTag(relativePosition % gridWidth); + holder.itemView.tag = relativePosition % gridWidth - if (filteredSyncFolderItems.get(section).getNumberOfFiles() > gridTotal && - relativePosition >= gridTotal - 1) { - holder.binding.counter.setText( - String.format( - Locale.US, - "%d", - filteredSyncFolderItems.get(section).getNumberOfFiles() - gridTotal)); - holder.binding.counterLayout.setVisibility(View.VISIBLE); - holder.binding.thumbnailDarkener.setVisibility(View.VISIBLE); + if (filteredSyncFolderItems[section].numberOfFiles > gridTotal && + relativePosition >= gridTotal - 1 + ) { + holder.binding.counter.text = String.format( + Locale.US, + "%d", + filteredSyncFolderItems[section].numberOfFiles - gridTotal + ) + holder.binding.counterLayout.visibility = View.VISIBLE + holder.binding.thumbnailDarkener.visibility = View.VISIBLE } else { - holder.binding.counterLayout.setVisibility(View.GONE); - holder.binding.thumbnailDarkener.setVisibility(View.GONE); + holder.binding.counterLayout.visibility = View.GONE + holder.binding.thumbnailDarkener.visibility = View.GONE } } } - @NonNull - @Override - public SectionedViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - if (viewType == VIEW_TYPE_HEADER) { - return new HeaderViewHolder( - SyncedFoldersItemHeaderBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false) - ); - } else if (viewType == VIEW_TYPE_FOOTER) { - return new FooterViewHolder( - SyncedFoldersFooterBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false) - ); - } else if (viewType == VIEW_TYPE_EMPTY) { - return new EmptyViewHolder( - SyncedFoldersEmptyBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false) - ); - } else { - return new MainViewHolder( - GridSyncItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false) - ); + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SectionedViewHolder { + return when (viewType) { + VIEW_TYPE_HEADER -> { + HeaderViewHolder( + SyncedFoldersItemHeaderBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + VIEW_TYPE_FOOTER -> { + FooterViewHolder( + SyncedFoldersFooterBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + VIEW_TYPE_EMPTY -> { + EmptyViewHolder( + SyncedFoldersEmptyBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + else -> { + MainViewHolder( + GridSyncItemBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } } } - private boolean isLastSection(int section) { - return section >= getSectionCount() - 1; + private fun isLastSection(section: Int): Boolean { + return section >= sectionCount - 1 } - public int getHiddenFolderCount() { - if (syncFolderItems != null && filteredSyncFolderItems != null) { - return syncFolderItems.size() - filteredSyncFolderItems.size(); - } else { - return 0; - } + val hiddenFolderCount: Int + get() = syncFolderItems.size - filteredSyncFolderItems.size + + interface ClickListener { + fun onSyncStatusToggleClick(section: Int, syncedFolderDisplayItem: SyncedFolderDisplayItem?) + fun onSyncFolderSettingsClick(section: Int, syncedFolderDisplayItem: SyncedFolderDisplayItem?) + fun onVisibilityToggleClick(section: Int, item: SyncedFolderDisplayItem?) } - public interface ClickListener { - void onSyncStatusToggleClick(int section, SyncedFolderDisplayItem syncedFolderDisplayItem); - void onSyncFolderSettingsClick(int section, SyncedFolderDisplayItem syncedFolderDisplayItem); - void onVisibilityToggleClick(int section, SyncedFolderDisplayItem item); - } + internal class HeaderViewHolder(var binding: SyncedFoldersItemHeaderBinding) : SectionedViewHolder( + binding.root + ) - static class HeaderViewHolder extends SectionedViewHolder { - protected SyncedFoldersItemHeaderBinding binding; + internal class FooterViewHolder(var binding: SyncedFoldersFooterBinding) : SectionedViewHolder( + binding.root + ) - private HeaderViewHolder(SyncedFoldersItemHeaderBinding binding) { - super(binding.getRoot()); - this.binding = binding; - } - } + internal class EmptyViewHolder(binding: SyncedFoldersEmptyBinding) : SectionedViewHolder(binding.root) - static class FooterViewHolder extends SectionedViewHolder { - protected SyncedFoldersFooterBinding binding; + internal class MainViewHolder(var binding: GridSyncItemBinding) : SectionedViewHolder( + binding.root + ) - private FooterViewHolder(SyncedFoldersFooterBinding binding) { - super(binding.getRoot()); - this.binding = binding; - } - } - - static class EmptyViewHolder extends SectionedViewHolder { - private EmptyViewHolder(SyncedFoldersEmptyBinding binding) { - super(binding.getRoot()); - } - } - - static class MainViewHolder extends SectionedViewHolder { - protected GridSyncItemBinding binding; - - private MainViewHolder(GridSyncItemBinding binding) { - super(binding.getRoot()); - this.binding = binding; - } - } - - private void setSyncButtonActiveIcon(ImageButton syncStatusButton, boolean enabled) { + private fun setSyncButtonActiveIcon(syncStatusButton: ImageButton, enabled: Boolean) { if (enabled) { syncStatusButton.setImageDrawable( - viewThemeUtils.platform.tintPrimaryDrawable(context, R.drawable.ic_cloud_sync_on) - ); + viewThemeUtils.platform.tintDrawable(context, R.drawable.ic_cloud_sync_on, ColorRole.PRIMARY) + ) } else { - syncStatusButton.setImageResource(R.drawable.ic_cloud_sync_off); + syncStatusButton.setImageResource(R.drawable.ic_cloud_sync_off) } } + + companion object { + private const val VIEW_TYPE_EMPTY = Int.MAX_VALUE + private const val VIEW_TYPE_ITEM = 1 + private const val VIEW_TYPE_HEADER = 2 + private const val VIEW_TYPE_FOOTER = 3 + } } From 037b095b3c0679d6889cafc14d7630d8ee4f775d Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 26 Jun 2024 10:44:13 +0000 Subject: [PATCH 18/27] Analysis: update lint results to reflect reduced error/warning count Signed-off-by: github-actions --- scripts/analysis/lint-results.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/analysis/lint-results.txt b/scripts/analysis/lint-results.txt index 9906cedffc..2506a05799 100644 --- a/scripts/analysis/lint-results.txt +++ b/scripts/analysis/lint-results.txt @@ -1,2 +1,2 @@ DO NOT TOUCH; GENERATED BY DRONE - Lint Report: 3 errors and 68 warnings + Lint Report: 3 errors and 64 warnings From 46be7c943c1aaabbf825f89a5b900f7a45907a44 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 07:18:44 +0000 Subject: [PATCH 19/27] Update dependency com.google.firebase:firebase-messaging to v24 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- app/build.gradle | 2 +- gradle/verification-keyring.keys | 571 +++++++++++++++---------------- gradle/verification-metadata.xml | 80 +++++ 3 files changed, 351 insertions(+), 302 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e4caae5ceb..d12d6392fe 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -411,7 +411,7 @@ dependencies { implementation "com.github.stateless4j:stateless4j:2.6.0" // upon each update first test: new registration, receive push - gplayImplementation "com.google.firebase:firebase-messaging:23.4.1" + gplayImplementation "com.google.firebase:firebase-messaging:24.0.0" gplayImplementation 'com.google.android.play:review-ktx:2.0.1' implementation 'com.github.nextcloud.android-common:ui:0.17.0' diff --git a/gradle/verification-keyring.keys b/gradle/verification-keyring.keys index 80a501c48b..7bf1b71672 100644 --- a/gradle/verification-keyring.keys +++ b/gradle/verification-keyring.keys @@ -3,7 +3,7 @@ uid Jake Wharton sub CF771F914C2A4A73 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGiBE2fCWARBAC3v9wYo5kmynmVP+43ccamidflSLQjjpsXpSDLPFokGxeuw0OC QJy46m8b5ACoCqRlfwnRRcEHxiSlaBATJA6hi7NRO41R39C62JXsIxNJR16JNQ5k @@ -35,7 +35,7 @@ pub 84E913A8E3A748C0 uid The Legion of the Bouncy Castle Inc. (Maven Repository Artifact Signer) -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBGR/8HUBDADJ+V5VgTXFG4xVI/1r07a/pTXoAQhHyJMkVdFScGARsps07VXI IsYgPsifOFU55E7uRMZPTLAx5F1uxoZAWGtXIz0d4ISKhobFquH8jZe7TnsJBJNV @@ -56,7 +56,7 @@ uid J. Daniel Kulp sub 594E23256A36A392 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBEqQOcwBEACdPSfBAkHm1b2GdOjB3gGerx/JDn3zYNnNpcQrM8Do0bxDwlfT qwLA0P9ju4mzTfHU5kEvm2lrXz8QCZPLe9eY6GxzzSbeXtt+4fP84/YGmsK6DQTy @@ -101,7 +101,7 @@ uid Marc Philipp sub 8B2A34A7D4A9B8B3 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFrKW9IBEACkqUvM7hU1WqOOeb1gZ7pUsRliHuoUvYIrd+hdp+qhPmJ0NG0W YhZK5UtJBmqvtHKRkbwYxUuya9zlBmCfQFf0GpFKJ65JSrPSkZADI3aZ4aUkxIUw @@ -146,7 +146,7 @@ uid Jesse Wilson sub 51F5B36C761AA122 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFoQh54BEADOuivAfgGKc4/zDwx+AwJdctjTT0znL9knRTYG6ediv2Eq+CXm gBM9m5twl+qhUB1NtrdHb4BH49VY9/gHr3JDyo5ewu96qkbeQl4pxW0zmHg/yJx7 @@ -191,7 +191,7 @@ uid Gary David Gregory (Code signing key) sub 59BA7BFEAD3D7F94 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBE2kzuwBCACYV+G9yxNkSjAKSji0B5ipMGM74JAL1Ogtcu+993pLHHYsdXri WWXi37x9PLjeHxw63mN26SFyrbMJ4A8erLB03PDjw0DEzAwiu9P2vSvL/RFxGBbk @@ -221,7 +221,7 @@ uid Olivier Lamy sub 1AFEC329B615D06C -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGiBEdddbQRBADRgstdUZq7ceq3NYcR5kpoU2tN2Zvg1vptE9FxpDbL73gdLWnI C7IAx+NNjdG7Ncdg+u10UZv6OSmhWAd8ubWcD9JxKtS4UXkNPHxhHFHqVPHuCwsQ @@ -254,7 +254,7 @@ uid Andrea Del Bene (Personal mail) sub 2E0CD2C28269837F -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFp4P+YBEACyLq9dzdho/YkwYzodniQbH4rgUSABTriC3kZtM/IzufAjQ84a HM9QxnHc0Y4OliblGi52wHBjb1dTNEbOxGxQceUasxt7PC0xOyKE749lViU9NA8U @@ -299,7 +299,7 @@ uid Thomas Broyer sub FF59C22B07640A16 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBE//SjoBCADao3lh/I96fWIY2ZU49ljtHR4Vnzmifm3URFNuv/c8McWGxxCy Y1+oolgVuJcy4hCqcgbkwTiAfBhjZSmsC1QK/2Vs1awFzGccPcgTBakFw/TUav12 @@ -328,7 +328,7 @@ uid Emarc Magtanong sub C3D943BC53597F2A -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBGA1qK8BEADamq/2E4d37YWRv0UmEbH/0e5Jnd429RpUbyCzY8ykHevHxQm4 LMYmKJeZC9HLrMRY5BQWCz0p5B+nkViPfZ0I4QWMx+Xp8hobGIKJfMpeH7KyTmsZ @@ -371,7 +371,7 @@ rxDjYowkreQonnnp11fCDViZukKXb+OVYcprQLx0FfI9XQ== pub 8D7F1BEC1E2ECAE7 sub E98008460EB9BB34 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBF8kuOUBCACo8/VYVfmglgTgmai5FvmNzKi9XIJIK4fHCA1r+t47aGkGy36E dSOlApDjqbtuodnyH4jiyBvT599yeMA0O/Pr+zL+dOwdT1kYL/owvT0U9oczvwUj @@ -397,7 +397,7 @@ YEfib2tDM60p8ZyAhgza4geUBMLQgu3uAZwBaYSPttcTPL0mqD1iKucdyuVgXSs= pub 8EDF241183415AF1 sub 3FDCB1CB0A41BA5B -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFOa5CoBCACz9M7mWkDozLoaO0ZehhRx19ZhoPCOmtdAWsqJCIrrN4KBSkP/ +rkIub+CTiSUkcMkYQgkRAgcsS5aQZt2bkUa/fpcOlGmEiyUQaU5VwGq+PtVkCdI @@ -424,7 +424,7 @@ pub 928FBF39003C0425 uid Spring Builds (JAR Signing) -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBGPF4agBEADsWnQn3m/dMw1Q6FLALQCEucRkRLw4wcmtzXuuYb2M17aHvEb5 +OnXDdgQ2QcnnjK4S3zQp/Jt4ZQnnLORqx919+c+1gT24U06VxeGPW/TLRn/hnKA @@ -447,7 +447,7 @@ uid Cedric Beust sub 7F4529E1F5892F2A -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFQxa9kBCADj7kogDwfm5weg9hIE10vt9ZO6IGSPTeTLkL1Al5GL9luzJfs9 y/n3vBMTbD2Sn4Mn2IzEi1xVFGQxhKZSIPCLbNzHot3dgjQcIe5fMVHT2ZFo2WUU @@ -476,7 +476,7 @@ uid Stephen Samuel sub 8C536895DD0A1F66 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFBMY3sBCAC+Py3/YxtcnjoW9vgqTpL3hTEJvfywu2lwe/WvEDaETHAnOB6q jRcYefFvGbEuNb+MIACYnB2gDuS5USmFxI9YKv9d0aoIAxvuzHiITSqmrI+Oyeta @@ -505,7 +505,7 @@ uid ReactiveX Admin sub 9D149DAC4AC24632 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFPzzfABCADK/wEIRhUCUTj00TcBOxGTPs5ad8jn5D01P7P5ILpLOgmnUp1I E3EYy54PQYjDIeOFvEmEywvwMRV8yCVhhYGpOPqbegKwcebXoiMGhJjuRf2nPbdZ @@ -531,7 +531,7 @@ wFrnxlbehImNdKa+M8n6XXmkksmKDvIjFicU pub 98AD2E19BFF4106D -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFv3+7oBEADXMQXwYMxs45ePjno3XcOouM5NMCYsKk6qmrCBr2ffLLTPER6M 9KtyYAqCqe1DQmB0BRau1GuBRN6mydzILjVaJ6B1S+SsDGHOTDpTVyKUKSkQ292X @@ -554,7 +554,7 @@ sub D6E960E7DE84EF5B sub 30D28CA4CCC665C6 sub 90B98B0770B15EDD -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFB8bq8BEAD0BtSpC/+2T3+WXYoFPr4oJ7xqOkCkS0FRC/kJ7z1UCJRzvQN3 Lxpgo9jUHY/nLNU8kuR3L6e/buoifGxsTabvNasgFhn144BiuKZDhR8M2lmnS4a2 @@ -656,7 +656,7 @@ uid Antoine Mottier sub C327DD2B96A50E1C -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBF6WyHgBEADOrbvGGDYVckFcUofqKiYrBneClFJH1ANheF+KIekmnFV2SH1Z RS2rw12IbpCjwqjhFTMWH2UTLF6pAsSGIufTrSVUAF2WxHw84Y60KmwuYayJCVd3 @@ -699,7 +699,7 @@ ld2takfefAHfookOb0HbBH7aOiIx4D0GgGqmYtjme81xWF4n pub 995EFBF4A3D20BEB sub B89991D171A02F5C -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBF9amNkBEADKyJj5snYd8bZpONpu1QHf7c/TK9HxcMzGZaIv9QzViX6CtEHb 2Q2x6ejXQ2frECMrvns5JAJd21B6215EhlOqrHSMkTrQ6fvOIfWd0huZ0QHr4FME @@ -743,7 +743,7 @@ uid Liam Miller-Cushon sub D66472CF54179CC4 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFKD+PgBEAC8IkWujQlmU0/7+QPZFsc/z/rXgg7BQyo330QK4HeMzeCK6WHa SWzVDM9h6nFDs6Xln6YexbZUjLsxS/a/Ox2i26Qg8B+NghgiratbdJsByRrU/3la @@ -788,7 +788,7 @@ uid Benson Margulies sub 32E3DF6FC5E91334 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBEzDDl0BEADHvJW2uff8vfxbfy0IvNOK4aytU+HVEvKEmuSqYEzC8i3BF6RT LOxTeRFlu92rYz5ypD0mdNCzQaH0xbkcjialP6FpPCByrM9fFv6hmxZFSY71rvqz @@ -833,7 +833,7 @@ uid Benedikt Ritter (CODE SIGNING KEY) sub 923C08F9417B222D -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFKws7QBEADEy9+PqF0cjeS1yG4xMRBV+teFNsS+WZW1ATDBl5ETASqMZT7R zFWjMWq8Kf3iTMfmPlKVCPIFH1FG+SgMvWpQEEcLCOmUkJR7UYtn2y3vaXXYqawz @@ -878,7 +878,7 @@ uid Slawomir Jaranowski sub E3F6790A5A167F5A -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBGHDIagBEADpzdCwVjVlHuo8qpu9HtmqNpEW4TB7y6+NX7Q39mj8w+iVskE1 sL0+BOCdP6ZMiQziWbOQ2FxCd3mD0ixZ7v1i7+0jowySPacJbVNaPPECP38gDte4 @@ -923,7 +923,7 @@ uid Paul Hammant sub 801EFE954C6C9621 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBEv+jyIBCADUnTU2KkNpxh/ZGWEVZyTLRiGglTLBqeoD2SIA6MfJs7p1BSnm DlB5231i/unaLPiSYU3ZS4GmZFGnFB3XICoJYw7m3rWemUJ8y7HUvLOHaGEKY9OK @@ -952,7 +952,7 @@ uid DiffPlug LLC sub 030DD9087C31C9AF -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBGPAYVUBDADCs9PkY8zzhzE38bRZX+vTrr3LdChGNBmObV858NGRrXeZtyLu U7YwYVF7w2vHUI/JQWrlPZc5tBFicefucfUtKt790WzAk3NBjGtX4IWpG57C1Z5t @@ -989,7 +989,7 @@ uid Stefan Bodewig sub 6366592024774157 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGiBDsSIk4RBADSCj6rUjV64tYCGT1DYKYR7GthyWpNdGHSYLbETBcDatAe1dzQ 5NsCgfrlybfyeY+y1lxr3T9bqf6zJWDw/718wff96qmmv1qzexSYtmIrj+h53V82 @@ -1018,7 +1018,7 @@ uid Thomas Neidhart sub 8183E80D264EE073 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBE8YNGIBEADEgcfvs8TL3X2Ql62HJ6SrXWAOoHw5CquJxUQkvBGesIT1Hk24 exiPwrlNE1qUjbVlef1Cwk9ZfwMOpJdfP2MQQbx0nxxqv+JtsoeXUy9bTSvZYBUL @@ -1063,7 +1063,7 @@ uid Kengo TODA (GitHub) sub B15AD8EFBD28D3CB -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBF09IUABEAC2p2RNMRu3DgovIw/OuG4BL101EzTepeoPzRbKll+/xtNiN270 ekSio9Of9nn7ZV0n4AH1nFM4iQqAC4KFZ74NrgJ+EeHoh3eZr7hyQ/TW7p0z4097 @@ -1108,7 +1108,7 @@ uid Tom Denley (scarytom) sub 9C4C23E6FFE405BD -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBE+xZxIBCACzKctn4ez8xOC0pGThhAwjYWGkzcwK4HNaC1usHThBFz3/t8JN OqUXRixLyi5wELN6GHlsGVUQS3IfB4JtuhScsieSB8PTree68/knMq6JI08mJqZr @@ -1137,7 +1137,7 @@ uid Jukka Zitting sub D5A25EF82542C54A -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGiBEUQYOcRBADsCu4zTVaB4TOhV7NyTvHhG1bqN+3Va5t4vpGQJg4M4U0Yu0ut 4bCZP8I6rlXGj+TqDKVUx9kfGpIKX6Kw2TvZUYbHIDWh3UhQO1hD4xy4b8rOak1w @@ -1170,7 +1170,7 @@ uid Jisi Liu sub F20DB7FEF61CE1E8 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFc7oMQBCADaIPEUzMrwF9gnEC+PRn2cSPG8OV4RxXxa88TZm0L7NF7D+F5N MNUAZ58oVqFUW+ytgb5iey3X7KjlJXZnuqES4m2Id4N7FlnvrmpeOg7MUc9VmNkt @@ -1200,7 +1200,7 @@ uid Scala Project sub C03EF1D7D692BCFF sub A74B04E5C92DDE1E -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFqDA6IBEADibOHbRh1m6RQ7FhhYMHCx1wjhpXhdcILJGUtMXoA/R6hqzzSb 5OiUrK95iZ2QaAWyKfdbnRXgbalz2AxQ8I8nwSrlTpJaIhhxLZET80IyIUeyoRw6 @@ -1278,7 +1278,7 @@ toyJtlNyqSh1L5zc55SkOMKb3Vjg2H+vlSYVlD8= pub A929EA2321FDBF8F sub A0F7D9615B3A5E42 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFjw3rkBCADI29PsG4+jXT0KajnjFSb9jQynKlHeMmp59e/88goWICaTK7JA lM2YB5vpjBeQjA+MCv/1wRyD4defs/cXoNAAsdTeJkh6Qx2C4TyL2dKROJK2DixA @@ -1306,7 +1306,7 @@ uid Egor Andreevici sub 1A94B14C6A03458D -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBGI8r9sBEACZJBV2TNUSsLRo89uC4lfmQxfNDqkE0uZghfFY/p0fr6fkBybO WDkPFskAPD32fzrWxZd2kkyCRyUrOmAUC22q8hw96t28+RqZymvetIa0f8GQGgkO @@ -1351,7 +1351,7 @@ uid ?amonn McManus sub 7892707E9657EBD4 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFdbSfIBCACrFI0ai/abnV2U2Wa9QQZwGk3Fegc8laiuTKc0GoYdyptd83/H hD5S61ppdkOugBjVTHdgda3xJ7zBZdnwjZvV/TyayQltbh6hU+BMlEolzXLgyvY7 @@ -1380,7 +1380,7 @@ uid Checker Framework (Official Release) sub 090039B6C9C71454 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBGCB5LkBDADAWu7S6aG5RguiHcmMKt1xKF01ZQyDvdQjQ91tE4IwMkNqU9JI rlQc3tVXovF0DXBX4o/iXB/iM0QmOjZilVW94ryDVmQT/i6ocuFnk4eAzwl1zsp0 @@ -1558,7 +1558,7 @@ uid IntelliJ IDEA Sign Key sub C9F04E6E2DC4F7F8 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFKneXIBCACtnX3ZQmPujf6ocvdnhsBheze71DSl34TfebyW2Qt+g9NhMxo4 DaJy+iFNnsaMwLZRr6k/qf+ISE3A4opWAQlbk+Wb5s6DPPA2cHH6W4GdkxtuJzqt @@ -1587,7 +1587,7 @@ uid Joe Schmetzer sub 4BE257B370130000 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBFv1EEwBDAC61jyEM99KH18hI3zlfuqvGoNjTLIh0wge5vXAH8VxMR0ndOID HYSBT2+L6OeiqKlyhCgF1km48F/dMzyJdTASkNO1Ni+B2Ric1sBxjsSPufkjl4en @@ -1624,7 +1624,7 @@ uid Karl Heinz Marbaise (ASF Key) sub C163B490C5CDC967 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQQNBFT3VuYBIADPQxdM6fJajMSyeiKbfpSjllBkGA16DE9IFJ76B6281k8sfya2 k6UOAKNIprxY3JCRulbnkn3BcdbY1vZDhaf/fbdkvJ+o/XVzrxojq1jS3tvSq95L @@ -1699,7 +1699,7 @@ VNzF1FVYsoxk6SP2Etdg+f5qaSsqiAmAHL+6tEDuwQ== pub BF984B4145EA13F7 sub 84761D363E7B0FC4 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBF7rgogBCADU9OwoEFdIgN5U0JU5pI7s3T1T1LeDMzAQ8l2Hq4jFrhnrjcEA ieDSut1YIv5NTBoZv4CrklaKvvQNUXPvKrFImA4OKhBodKV3wsq2efCATDGa1JAw @@ -1727,7 +1727,7 @@ uid Bernd Eckenfels sub 788E173C196BC673 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBFRRGVMBDADAQcmG+x0mHZwJ3uKgODjUZXkGRkuz7aP/qRmuQVn93tl8DmA1 lgvXndvChUjzYt4DJnQhRsapAXEmP5/YYIkWOzuk9EpXGtqUieocylvNXP9eDF9y @@ -1762,7 +1762,7 @@ u8veAZEXwuJGYHE= pub C4C8CB73B1435348 sub EA2A558279B36E6B -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFSwGboBEADoHgtdw+OVEAIF1SiRju8QDuhePZbpSgRLrt25AmowHJhOQUI1 EP7+RWoCWW9gWAGas5mGDBxhPw8NgFv1nMUWFAsj0rkViuRD4qpJbChvlqw7YkOq @@ -1804,7 +1804,7 @@ Pn5Vct+ePgERiEjouAIKInn7+YOf9AFRs29KT63Ajy/6mpYI1t0YGD7INcqEZ97B pub C4FAC33068AAEE7C sub 40B05ED965649A07 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFBjJk8BCAC8qTIUyNtbgIU7v7ytuchxwLozeq4h0CgvTE8uVbsyESJF+4Eg 3vjaq+uP2bUDdauhtLeT08bEiy0pjBl3WoYdHaSDLbNDSFOXBqcl4dqDNjo498wJ @@ -1832,7 +1832,7 @@ uid Ron Shapiro sub 4006CBA6D352F1FC -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFbgSbABCADGGENSy3oWLjW7zfYMSsR0pm3l3eMA7ptyU5C0U/MoIYjbXwyX XtlGwKnNgngATh1SMpX4WDbD8tn6vdeP4uHQsDb40t0XN7/HISFcLhV5pCgz2wNR @@ -1859,7 +1859,7 @@ Mpx6qXA6Zg== pub C6FC46EB51CF569C sub 92BF193AD552C6F4 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFwrYN4BCAComkN3DymSPvTeAV7G/vBEYFKEANL49MeQttSZRzHmGAIAF9Iq fUN9Iwp2Ii40sdUV1+03SVnprf5M2xdxO42AB1qgHdKcyQnbUM9oV/i+iwSWZOjU @@ -1887,7 +1887,7 @@ uid TFLite Support sub 29E792953D515FC5 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBF8pVB0BDADcwRGpJUDe8eVSlJ0yPQl/CyeYc0RWq2f1seUMQO0xFW1xPIeL IE68D9VdgarA88qDLYesfBqzn57/r/ztj2aLEKt8IRunJzd0w0G2rrgSCZQ8RmzL @@ -1925,7 +1925,7 @@ uid Drew Noakes sub E65E513CDB317A0C -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFSEZy0BEADpxMFmKfWrbbc/opWOe1WbONuUBKzVuP5MhFJkAcxa6d8qSZOa UO9thbEeWI8HYCUMMVoofUUITWqHn/ZGNQu/wIo1sZxM+pRXg8TW2v2P3qOw3vI5 @@ -1968,7 +1968,7 @@ m2ZpZwxq pub C7CA19B7B620D787 sub 7679164AA2590985 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGiBErg1IARBACVbmwMwp4p0ldolUYSkGl7XFJHwtEWmuikGcM4lp72h/YhAXpf RVsKE3aCy6HSTt7KJrcUuOL8BB67riZXLOIZtA9kDyC+0EUbnW2EbVfJXskPLP5X @@ -2011,7 +2011,7 @@ yAlcAKCTwRo6LpahA0hXIR/dwnekHH7Faw== pub C92C5FEC70161C62 sub 64863FF4D1BF1809 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGiBEdUhrIRBADCU9cuKc92CWQlZxwtRuSIV/36Qmj264YD+Lix+r1Qe1PqRr1I /MObOo83ulorWigSkx1k81Mnr56NwmIeo2bMhjmgRgf7EG6XEbKdRKfJcJRR1lDV @@ -2043,7 +2043,7 @@ uid Tatu Saloranta (cowtowncoder) sub AFF3E378166B1F0F -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFeWvEwBCAC7oSQ7XqcGDc6YL4KAGvDVZYigcJmv0y5hWT4wv9ABP4Jhzr1H NDmmGyWzhzTeMxwuZnc9vhxCQRwyxj3gGI5lYPEARswbi2fWk//78/3Wk+YMHJw3 @@ -2070,7 +2070,7 @@ Ett6PX9Hrvc1MTy/UUdb3s08C0wD0x+ZzFzqUXKTZg== pub CB43338E060CF9FA sub C59D5D06CF8D0E01 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBE0NT+kBEAD1hzO+dXStXYJj8M6FBn9fxw+grddjM9rqaEgJ2omSdpZZOPBs DRor7v0Rm23Ec17y/7Dd6oR1CvyAeQwhJvNBaAW4LQmUcvvqep4hfkWDhlRvh/QS @@ -2114,7 +2114,7 @@ uid Eclipse Implementation of JAXB Project sub 7ECBD740FF06AEB5 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFuX5CkBEADkTgn4nzuq0lWR+7kFGYLKvmPLjes4j2nmygIafUjVbNmD70gY DPpbSP02HxgicM6xSSqzZuBVxpbcffqjMPXf8LkVX4iWKZtyzLpf34yaojigU3qF @@ -2194,7 +2194,7 @@ uid Deanna sub 5199F3DAE89C332D -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBGCtdhoBDADdopjDt4eUNEqLJSw1ZICSR0oq09SOVtJSaSYdF8UiXjBfL1Ds fhTDqSv5pT2a2gLj0OU3tFhWHvINLaKKCjQnHVcFXi2LTxt+XBOjRYkFjHVisbaZ @@ -2231,7 +2231,7 @@ uid PMD Release Signing Key sub 1DAA314BF520D0A8 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBF33gFcBEADCuu0xy33sjaa+H+lSFeFNualM1Zmqf6/qPBEDhNnflgTfIpf6 TUkgkTGLbqUwgN8mxWIWlhNmv6qSPAJfApw33ltub07fQ1vhbPr3XswqAJNsM3Mt @@ -2322,7 +2322,7 @@ MK7w6DCYREpitjRIPUKfWdjd5iNis6nQ5W/009a8Q/TQKQeUrUupq1QEXpA= pub D364ABAA39A47320 sub 3F606403DCA455C8 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBGH0NlsBEACnLJ3vl/aV+4ytkJ6QSfDFHrwzSo1eEXyuFZ85mLijvgGuaKRr c9/lKed0MuyhLJ7YD752kcFCEIyPbjeqEFsBcgU/RWa1AEfaay4eMLBzLSOwCvhD @@ -2366,7 +2366,7 @@ uid Harald Kuhr sub 82889D6A1813F02D -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBF+242IBCADRO5E77O+3zYLz2iYkOuIfmnrx31GjdLHGzWpX5WDin/PlTGnD uUk2JoNwFCmHgAh6waBYVnjsaRTaAaj4W/22APeEQLK1Bfi8sBn1PPKsGDf/4f6s @@ -2402,7 +2402,7 @@ uid Matthew Sicker (Signing Key) sub B4C70893B62BABE8 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFMvQKsBEAC3/wuVMv4ia132SA1Y/KnuZYkSNDaRH/Ie1WTAX9X0KrWA5fx2 WmzKfaLNyBHU5aI0BjoE9DW3zkZcLEcL/cxRzoXoavUGRhRsaHbj4PhQkEqV35L1 @@ -2510,7 +2510,7 @@ uid Josef Raska sub A19C7F7AB68FA320 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBGCr+7IBEADOJX+ZMDPUvaJQizaWi1lyiWxXfj2aWNWCPdx7gO/xqC0WxIMa J0rbg/qHABc28XzMflZB2YwhEptQJj4Oa3hkcYVZuIPOsoha42XBp0yKTa8R2FLT @@ -2555,7 +2555,7 @@ uid grpc-java-team-sonatype sub 9121AD263441EEDD -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBFrjUQUBDADTMQL/4d9EyVhsO4XBH9wbGWxcEJvsu/HvppN5fY8hpMV0+Cr9 wjAeJ7d9zdFJVB8vPLN7bb5dm6SNyK3KiOugqVgZrQ+ZPTvCCgFbFyEXuZwDiOa1 @@ -2592,7 +2592,7 @@ pub DE61FB98F06CE8AE uid xuwei-k <6b656e6a69@gmail.com> -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFLdXSgBCACUQwbfEg81l2RwU3kGOI/NcpoKsDIliivttszDnEC0twnlbpft fiW8d/JAV39BsFbNTUaziRKeyhFTKXfygxEQ7tkb3camzT/v7zbWvPWrEyZDjZWk @@ -2609,7 +2609,7 @@ uid Dexmaker Team sub E8D0C72FC5A02B28 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBGAlt80BEACftpFzUCGm2u5sV4UgAysobdqZywkUKP147toek4ULQRYpADig AI9J3BCmHbcApLek1U7vj8geB6T7V0c4ELLFPQ+4lQlCPC8Siv5c2gDaZvoMzTlw @@ -2654,7 +2654,7 @@ uid Jake Wharton sub F3DBCE882C3A01AA -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFsNoY0BCADIvRrJEX3k7UeuT6zt+F4++xH+5Qo7QzdicjFhhyb22PLPyIsI Ema+T4QqiPDegUv8yKKTTBmHNw/vSUHTPX9ZUpglckopuOgdfnuQjTKEOEzrN7V/ @@ -2681,7 +2681,7 @@ u4awI7kDfdqz1V5s5prLGlkoPhACUxRZeznT3Js7NVE= pub E16AB52D79FD224F sub 5A34A5E06B936F93 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFF/4bYBCADTeOLZiVGNbjlPrwG7UcMl+yXmEqpf9dB1A9cuicH3PWXj0WOb LSzHjzoRvRekEqSUmgoveey1lPuA2qjOUkXY6Kiyx+oLiG0/ObJHUQW2O+tjSQ0R @@ -2709,7 +2709,7 @@ sub 9351716690874F25 sub 60EB70DDAAC2EC21 sub 3D5839A2262CBBFB -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBF/RX/MBDADSqelDQKobURExWUKALq86yTPMxMasxmDlccKFpk5xjWrryL7z qg4Fnb7IK5fKDtcnTANtOv2hlIli1h131+SmjJdD3qhfly7QoszOpr5izDS+FOCj @@ -2825,7 +2825,7 @@ HQflbMW74dKTLoW6+aNn4F9nqCJ88A== pub E6039456D5BBD4F8 sub 4697DFC8F2696A57 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBEzdTPIBEADki1HMFzssqhU2l3jJr0zNE/gyPohjzI5ugw1dNWUd/ht6oUnm 2StYcsRnFHlY7aIp56v6cZtAKYDZTlEArIurH5xyQXQ3PLfxQZPVS6HDUghaa0rJ @@ -2868,7 +2868,7 @@ pub E93671C7272B7B3F uid Rolf Lear (JDOM) (Used to sign JDOM Packages) -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFCPD00BCAC4tY8wMQTsCKyII/mMkUDAkXA2cLM47fY1Wn+iohtgtalUdA0v AhGvTdFU6/St35rOKNoyLC7Sy30FBYpAEfMB/x9j/CaQtdtGhaQU0hCvtWGhhS3J @@ -2885,7 +2885,7 @@ uid Niklas Baudy sub 24219A5BAF207160 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFYUO6UBEADL4uFy2EQM2JiXtHPGBjrJpPaXiYpQkDXLvBR4kbUak/xXCpc4 zdewia48wZZ3jH1JOB+p1FBojz4dZFM7EowBS4FGO9jM8xpwxSz3g+gBGlIXYuFz @@ -2930,7 +2930,7 @@ uid Mark Vedder sub BB09D73166EEF1AD -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFEqVnEBEADZhnnAV62dwYvq5CxvEO9N7m7vrYMosc8PCEafxJqrDMbWWfv2 tD3EaHAERt/UFVEo2U5FV1hELUvFISPhh/DpOWYuc7pwA75do7ul6dhwgi5FcyjR @@ -2986,7 +2986,7 @@ uid Zetra (Sonatype Key) sub 7DC504A668D7781F -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBGBXNr4BEADWk850MlqKUha9ZHXs6aCXV7xx797N8vCYWuPp2B7Di/b14o9M Ni/FAKbQE4o1kAKwiKeJOVmCJiu4cfXelrq2qNHUt65ItXm1mxnHUDaz4rjq+/Zk @@ -3031,7 +3031,7 @@ uid Priyanka sub 33BA5E7DBAA319CC -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBF+zYT4BDADOvqnDCp47DHqAxbJ5DmnKetnYyhJwNo4S5l+Wlx6x5lVJPR+7 w6KfHXPDlBgoHJp3j0w6zWijHzGX1eK4Z4c95pE6S+7v/qM4otItJte+bYMNd+Lm @@ -3068,7 +3068,7 @@ uid Thomas Ball sub E68665C8F91BDE69 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBGO91akBCADDDpIrW/IohUSJNDu9VOUlnfEOm5VS49uqM0uucLi0BeAhy1Fo P6Yg1cJkcK66DtnUoTM/JJLyDzJRlKnniLrYCkw8ScvtPdA5cQKJTY5ecn+9ouR2 @@ -3097,7 +3097,7 @@ uid Eddie Aftandilian sub 3B7272A25F20140F -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBE/oyDcBCACgYsHtmWmtUzqyr/JN+orfJaTl2363qiS+NJ1lt2CNxUWOqldc VcIGyjmzokxTRpGdCFmT1Lh/hzZhcDPLjrtxf+f6njIibt80OiEbX39gjwZRIikd @@ -3124,7 +3124,7 @@ zvokolnfxsAb pub F067A2FD751AE3E4 sub 28CFDE1EB61BB6AA -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mDMEYknmAxYJKwYBBAHaRw8BAQdA/xS5rgP6lF5fl8l+rJB1UiF+7KKDse0PmKYp TNBH7si4OARiSeYDEgorBgEEAZdVAQUBAQdA+9/L4P4Yhd5EIOE/I428Wqk+ljCs @@ -3139,7 +3139,7 @@ uid abosch (bintray) sub 504F10B64E007C78 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFsRgCkBEADaI8lsWsDCfPfT1Vj4h/oY8EoZst/fG9wnMyLvfemLJWGVb20h uRe7vwBHhtczlAeRYtfNzQ1xLKXWNpMfiJNr8PeZVhZyTN7My3JYJZnmQm1MN53l @@ -3182,7 +3182,7 @@ b4Hd5Y4JunWGyPr8uYmpyzRL/Kufbhgal3FTJRTnpQ== pub F13D3E721D56BD54 sub EFD4147F269A813F -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBGFKrJsBDAC1UjHBJhbtkcSQdZSM4sC88QLamu7CTgEpzNfhO4QT7T2P37FU dITcwHUOjrp0blADnBRvmTGyPgQnljTIfdeW9DX5sDyiOdMtJ/qFP1SmZ7/2XiSe @@ -3218,7 +3218,7 @@ uid Netty Project Bot sub 1C9F436B883DCCF6 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBGAhOxEBEADdB5Jy2sSOndOMCTyk8IFIJYPogjXtN7CnyIlqr4jEB5G87TJf m7OxB95aIVS1vSA5ghCm88N1mKtW6jyYjgLFQbbyD9/X3ShVZjh8B2R4atL93SSK @@ -3264,7 +3264,7 @@ uid Jonathan Hedley sub 6064B04A9DC688E0 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGiBEtsF2oRBACcai1CJgjBfgteTh61OuTg4dxFwvLSxXy8uM1ouJw5sMx+OKR9 Uq6pAZ1+NAUckUrha9J6qhQ+WQtaO5PI1Cz2f9rY+FBRx3O+jeTaCgGxM8mGUM5e @@ -3297,7 +3297,7 @@ uid Sean Owen (ZXing) sub 811B3B85BC31841F -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFHW7ksBCADGzo3LGVyWpBWqxRQlGhpQ9YNav7jiR5WSLnatr8chZx+ldy5j KquO7GHO0qaHGXyc/CKeKH9Eey0mH4EcvOvEhBOE27Fnuw2NppxQjxXyhYTfvr6q @@ -3324,7 +3324,7 @@ lkXgEU5D+DY= pub F6D4A1D411E9D1AE sub B5CB27F94F97173B -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBE89LqsBCAC/C7QToaRF8eZgGOxcvp9aG+mFFCMjaRAb4Mh59OYdmUb6ZjfO 9388HPebGbPNR8SHYs0dBIuWY4ZJ7oUTYPswasL8vB0iPFdyHhvkCca+yk0b8ZBM @@ -3352,7 +3352,7 @@ uid potato sub 28ECAB16140A23E5 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFv8rqkBCAC8J4YBW1ZjXpovURQJcMd0kYgEjVzV0GHHVp9/NJwQ7NrhqGeE ktSZV4ctxWoPXYqAMbCjqyRfXQw28olj7L55m1VUIT10i20uDixdeDmAPcI5d1z9 @@ -3381,7 +3381,7 @@ uid Sean Leary sub 012F07EDD27CB2E2 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mDMEZI8otBYJKwYBBAHaRw8BAQdAL5VNS8O2NJbsTZaMphHGdxsSaLUj0tZLI6+R /pve51q0HlNlYW4gTGVhcnkgPHN0bGVhcnlAZ21haWwuY29tPrg4BGSPKLQSCisG @@ -3395,7 +3395,7 @@ MGwYCAJDgXPx5vc1B0y9XtKm3mQS0zNQjv6ffStsCg== pub FD5DEA07FCB690A8 sub 5F68B9B2F1725F16 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFFCLwoBCADxtcGi0nfolr1kGWe3jQ7n18roJFwBs4Q52nx0h4+a8ZGr7/1E 1brakrz3t/cTSZIrhfru8kirP8cJtXBxpd/nCeRrB/4ZtXPUJiGwKx6sVGr0ix6U @@ -3423,7 +3423,7 @@ uid Mattia Tommasone sub C3720DDC2E713B7C -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBF+y5lsBDAC5h0qk+OBAscHc/ac3A9C8ZPohXcTVpsOjds73soUAH+QCKO0y gAUuG/hUUU9xkm9PgTwWOEl2qDDcOFXY+9ykeYNUUcCWfs+JmVRfRod4W5pntaT4 @@ -3458,7 +3458,7 @@ Shma5nGIB6R1N366OBlUvjTs0ggfYypbVA+6WqpzParu/r7S8VozcUwcNZt4Cw== pub 012579464D01C06A sub CB6D56B72FDDF8AA -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFgnlA8BCACVtx3oLXcanfvwtMRwal6pLQ8IVMG9+fr4xGdbSHXCRNbosDa5 agU7WeQMPhusSxJGaA3w7NOdjAwD/LeHADhDPeI6llJg1Fb3EyqH0NZaODKU/Or/ @@ -3486,7 +3486,7 @@ uid Chao Zhang sub 8C40458A5F28CF7B -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBGADx6IBDADoHin1LGQ8dhnlhfNCBZ3IyXS2NpR1VjmYtHSlh1hGsPcmHuwo 1mLA6JzXF7NuK3Y52pbTr6vz9bAap8Ysjq/3UJeiDbf7FvmO5xAEVUhrpc7AEY7G @@ -3521,7 +3521,7 @@ MbU9XDznDl/pQNmUnTWAa+1PzUkWuLOG9L23Qeg9sNwOEbmJUQ== pub 02499A5DAEC7ADA9 sub B076344473492834 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFQrtgIBCADfs7sY6zr1rRvo5WwfOPr2lfhMkaQDWJ8noB+mLUBGMfWPWrCq xhN5gGYxBzbOnS4FY11/c0yIuKeTjHWdXBb+a9ovvG1XwTKqgrSnqaHzuqBfnlsL @@ -3556,7 +3556,7 @@ uid Drew Noakes sub FCF369F756EF6105 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBF0gmvMBCADCD96pOjHwsBOztrn7Vy22JMbGIK9LVTk0VC2HLNW/jcl0tTNi wAIZ7F5Nat9H/fL20dlwvS81W5OlrFImY77HH9qzg+S+WuXlU5ze55kU6RaDWtee @@ -3583,7 +3583,7 @@ i+e239pgHg1ROFTbISLcgj+kLpKT/eb8cdbtzrx3q7CP pub 0374CF2E8DD1BDFD sub F2E4DE8FA750E060 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGiBEmoKU8RBADEN0Q6AuEWEeddjARAzNXcjEx1WfTbLxW5abiiy7zLEht63mhF kBlbyxEIRnHCSrPLUqY5ROWdyey8MJw+bsQn005RZmSvq2rniXz3MpcyAcYPVPWx @@ -3615,7 +3615,7 @@ uid Eclipse Jakarta EE Platform sub 953E02E4F573B46F -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFxlMc4BEADbWFmOqHBqUUAcO9nPRSqtrmIdjBCzqsRosPk80n3Nd+jWc44T /O5TObVbn4NxCmbLxklWpIU7eTEo3u5LnwhkgcsxMykWYdq6DqyzENO9PeE/McrN @@ -3673,7 +3673,7 @@ uid ElyeProj sub 694C56B594A809CB -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBGCFThMBEAClfKbo3lJGy18/G+SlApBJO74WI37yEsVQLo/XPbo7cH5GeSa7 B42/VXuyD082BrajytQ02TxvXUQmW6Xqg2oIdNorX26cKKSmMVN5kgInCCXJwuuF @@ -3718,7 +3718,7 @@ uid Norman Maurer sub DECB4AA7ECD68C0E -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGiBEoo3BYRBACXE2oGRA58Ml6s+kvfk6n/AJ+5OFeRT/Xelco/cpdxOVF5LkRk yd+vR2+F9ldBlH7CSTCmrdZIN3M3zrcWndrk/OQkCxNWVnE/a1li7L3G9nYr011k @@ -3745,7 +3745,7 @@ uid Karol Wr?tniak sub 88518C11ADAEFC68 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBGARpnQBEAC0nT81zNDYKRAy3Ydiuat6PAajJxhjAjHyrRerOIYsdR2Spzpe iyczRTqD8xYKTiHxUt4OmvThutaSALRXFHd0jlzJgyn6nqD88dWu9QcKILqgEGw5 @@ -3792,7 +3792,7 @@ sub 6005789E24E5AD1E sub 6A0975F8B1127B83 sub 3FF44D37464BBB7E -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBFzy4ngBDAC4mz6ELMWjfJ8GZtolq3E96T7qjfp4J9FxGVxdbJxkEDnn6MTg V8zhD7yeSZcUSvwzPiDlB/b4RYnh+5LjzKHTsrtr9ja0SupuCkVGkMGWeHhpIGV9 @@ -3985,7 +3985,7 @@ uid Zhang Hai sub 81BBB32F3472C748 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFV5A8gBEADau5RoDVKJOtRj/Ww/4Whdjwn+GMPfFOD4KaHfco5vPtxkgCDm jHqC9FvLElNSPYqnrw2xfRPGYUAtVHSkBWOtZTknEm+S/HKuXwkAlKzEvR/drplR @@ -4028,7 +4028,7 @@ nRKcOypIrvfzqeXhsQ== pub 083891AD4774845A sub 8118B3BCDB1A5000 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFu1EwUBEADAXapH49L1Lwt28iK737X/+4bRDE+lkMxehnUZ7QJs5zkFz5Sh 9K2rQO0PpvoMSdadGplFyhKdDP/iEUpzxTTbqMs5UjbJr0MoFfE957Vz59mNf9WY @@ -4084,7 +4084,7 @@ uid sksamuel sub 54EB00732104EF7A -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBF7ByYMBEADHxAxXj4u914xQb5fJ+sBvk0rKpqOZPFMIiuyNMD72Dk2jZbvW ESuRlzp9MObyylGTsxeX+f+Fq+piqqgAAFWyXx+JNV4UkDLSt8g6n0phW97Wj89b @@ -4129,7 +4129,7 @@ uid Josh Holtz (For maven) sub 39577B69ABBC82BF -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBGFppTkBDADTsnm4r5keP4D9ZHepNV9fjQ0hxxMXZcQPWkKOMEmsihkySppF Rst+7fVcWX+PO/xs7bpbklEsTLS+HvunTRZVPAvzuCBgVGVyAwYxKylAOzvdMEbr @@ -4166,7 +4166,7 @@ uid Markus Junginger (artifact signing) sub 0BD96E9C45AFAF0E -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGiBFEhRX0RBAC9Fi/D2LPh2K3BAqLQLf2T9uQDimZFWSj0SzRN36ha6yRjCKO/ yRQ5RgtY0E+ZMHl56sfvSSO9Kvkd+IWYAn4MJeMA2aAoXGwJ44JQNgvAizY9eZO1 @@ -4199,7 +4199,7 @@ uid Paul Holser sub 71499A87DC1FF84B -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGiBE3LMfMRBAD90h69D8yyPWaSoAyh2mOOOZ/XH0isuBpDZCWptemlMHgImqdQ 2sXLXYT1bJKmSaMw+yKjp8J/NYk69EbmSK1C2nypLQtWhUmXXd3XVYw6hrG/dGvi @@ -4232,7 +4232,7 @@ uid Peter Palaga sub 83552A552A0D431C -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFBIm/wBCACgqvegptBhfKbyBXZiW+7XchIJCOpwq0/9QgSehKMwELbUKqNM sIVrywANqYn32S9hNRvBiKGm/KY7VwN9p1Cr6Ey3XuGSbRo/xN6tqfV/rV5YClL5 @@ -4261,7 +4261,7 @@ uid Brad Corso sub BF6D15D3F1BF7BCF -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBGGNmd8BDADSpbdIfqzkUNAeYlP0nUw/HFU/v+/aydtjUioAi/KxYt2FOMi6 gk1LOJzHBubv8bF79mlN6sXrnq2lV/MuqvN9DrTAQ4u4Dh0pgbLK6jbxDWPGrYIo @@ -4307,7 +4307,7 @@ uid Roman Ivanov sub 25A93B1970C22A7F -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFOpAXABCACsTEEMlNJ65WN4hGR+y3Dy80YQoI6oFivmf2kjOz5JqsBkoDaA vKl+OqLNIeYu4YXBFBe6t9YZvcBKAU660bTVuiiC50PNL2z9ZU6GrLNP34uKvyhP @@ -4336,7 +4336,7 @@ uid Matthias Bl?sing sub 891E4C2D471515FE -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFcyNOoBEACj0zTN3GkRNAY3jihHZdGvi70i4R8mUfcQUwWGRsGGlzSwyJfe 20qNOHqwHaxVCAIp4e5paNf9cEKepOv5IqMkmaRdiC2W+BHDxcJgBot/IrC81ube @@ -4381,7 +4381,7 @@ uid Shigeru Chiba (Javassist Developer) sub 0E26A79FFE07A3A7 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBGCVaCABEADgQA8+JfcQ6dEzNpWGi66IFUrH1CQyqrwl6/CD6vI9O1lw9LpK IhWvo6832Kf1G+9WQxgUj2Ur/TNA+dAGwIQs4OpIE4HIPQnohdWpO8DF0DQKByD2 @@ -4427,7 +4427,7 @@ uid Marc Philipp (JUnit Development, 2014) sub EFE8086F9E93774E -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFPU8TIBCADGNvExYTJpVuNGCF9NuWw+IkitjAD7WzF7QkvFCSw9VftzgTUZ 3PYrThRiaDdmHQAke4Sp+nYyAJ7iUcQqg/5/ONiMdzXEv5Kwy5WJN8+o2aXSunIT @@ -4462,7 +4462,7 @@ uid Emily Johnston sub 5F6BA89D4B0869B9 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBF3TQCcBDAD177B+Btl8XBEkBQ5jFSezFrpEl4arwCEa7htCp6T3h55HvYwz P7Y9zWYXfhAC8XJlPQJYpqaQiiYtdlmOrOS4wbp5Lr+z/0XpFlJFzdKglxKYcdfP @@ -4499,7 +4499,7 @@ uid Lukhnos Liu sub 0433AFA915028B02 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFAE85IBCAC5mX3pJvQPtKbrbBwZ0H8HUyjJfEYWORWVHXQR071eD9Qf8ZCH 3i6k0HnVBrYUl5XiBQmyolemnigGTpdMWZyirDPQmyzkPZcrdBrzcfU12QrJJtiZ @@ -4558,7 +4558,7 @@ uid Daniel Dekany sub D068F0D7B6A63980 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFHNxM8BCADYmt+HKkEwu89KQbwV7XIbgwZSfWc7y1HvA2YJpJRXJQsU/Pzv BhsHnm9ZIScBLIlgE5OUnMNz8ktPDdsFg3j/L0HREXOAqkOFxWx2kANsRo2HmkM3 @@ -4585,7 +4585,7 @@ T7dK1Uyb pub 1A2A1C94BDE89688 sub A3F393B5D034A0A3 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBEzxj6sBCADGV4szLvjBwrAOKYWw3efASDI2yo5Aq4oevm9cUB4G9G/D/fuR XhodLaG2smZLd8sNafWTSbPHswsZtMAjHGzka9Uj4Ow0etl3+kTh0DE6Loezkj7s @@ -4642,7 +4642,7 @@ zTU22/559YQ9Bb9kRR9Rqg== pub 1AE999FF489B55CB sub 8905EB7D0913BFB2 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBEzPUkkBEADGrE4DcfRs4ET0zZMmWku3CgfFtB/lumbiPUhFo73hBTZIyRK7 BlOixTWYyHXv8lLhJTiYHSwWLwmGPDAJXag7RDk7b1P9QzUio7PAvjyBnPMJHvO0 @@ -4687,7 +4687,7 @@ uid Rafael Winterhalter sub 7999BEFBA1039E8B sub A7E989B0634097AC -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBF3Ep5QBEADZfs6o1IpZbZ1qlBkoJ7oWL0vFCcdPUgF/PRFXWKlsuFHVVV/N oZF9SDiCJxfvsVXmI+IHTVMR2SszU2xDF2SlScRfZQwrLhBsDP9nv9N1eGIoA5Ny @@ -4764,7 +4764,7 @@ pIXjPlQ0i6kV0h8KapE1Uo005JYgeg== pub 1DE461528F1F1B2A sub D4569BDF799A59AB -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFd7wYcBEAC1jmtowY8q/BXHFr4bOvA4WtniUcECC36dHmQzd3LrG8zdDPK4 DgO/5w8xdilEe7BRD9etCV/uKXVM3KsKjFDHgh2puge4JElbePQL5l1oMmDUIGpK @@ -4808,7 +4808,7 @@ uid Hernan J Gonzalez sub 24E86B8F7B66511E -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFIDA20BCADMep/wCKREt6NsQ+r7rqgIhlHazBndaS955izID79etP6DsE0W YhguJrLGyuD8Ro4U8HMS+R09qdfYC4kp8WKC1Iky+tSzJ4WrUcvvA9i0U6DMVZDj @@ -4839,7 +4839,7 @@ sub 7D1BE4480B61E2A7 sub C2148900BCD3C2AF sub CFF46EE3C17E53E9 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBGBP58sBDADYRZmxLOkqrz0QZ/yESRpv7IeHGLqDE1a8QfFtFb14MJCLSAAS 3nMD6Szi9mEjEqYdJURRcMjbUBhePgbhzGa3FYkjAB8lj6IKbu+ogCwVm1S8+caZ @@ -4956,7 +4956,7 @@ a3HXnE2l2ony pub 205C8673DC742C7C sub AD9CEBA0521B1945 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBEry8yoBEADnhvT3m/zzzuiUKyAeIfnN9CeN0ilQx4P0kFMhyZchRR4Ekb41 iKw7tDL9q+g7xSo3yUT9dKjDWJ3yhDpdAhp6d4y8GAuWqlOu8CQdEHJOKK0yxTzX @@ -4998,7 +4998,7 @@ k2jL7nGs2D66/qmjgmO2J1/D pub 2148325ADD28A1AD sub 2D4537C5AFEEBF9B -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFFCZsIBCADQOqjBEfLoBf7L+CCIqlJRZEMi81HgFJA1Gy3/4fXe9E3OtMAJ dSkiQYPIzDqbNagYCpsMBSSduJ7EnXNPJoWHIAEn1q+FJcFMvTo4nIC5eKFu7eF9 @@ -5024,7 +5024,7 @@ KL63dnDfxqDAN5pdHJbzl7oE pub 21939FF0CA2A6567 sub A98BD25BE464EA45 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFxmwqABEADNTTxqFiBcLLQwARbc0bmPUlxFl0A0Di9dTycUEjn0wTGS2xgF dFxWomZd8R4b/lVb9jHf0r+AEul7U7sBoKinjwk0EuPDAZK5PEy3P8ILcAulwQqW @@ -5068,7 +5068,7 @@ uid Karl Heinz Marbaise (Apache Software Foundation) sub D658968EFD5E9F85 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQQNBFMPOkYBIACdXZi+34dvl+8q0IGIjLzFP7JvUH8ail4vrf2zwliW/QZskB/7 pFXCpV2/hX+0n+kJz0eqenl1l/+lT6p0MQ1TMCtiMccnX7WseQM+xSv4ug82nAwa @@ -5146,7 +5146,7 @@ uid Cedric Beust sub BFE9E301CD277BAF -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFpqN94BCACaAb8Afmng1QPu5k5uzLoA1FJnF6Wf31ZU1FzDxHFHLNUYSWN2 Bg6k95QH5ruZ+Z/QOJSoIB+b3htDklyxd8m+G2KsMIqnQs0BaTN18hb3PFyMIknM @@ -5175,7 +5175,7 @@ uid Sam Judd sub B4E75C15C3C701AE -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFPsGJIBCADOxQoTLxpZVRIbLaRfsHa2y/TEIGvxLP7TgqTwspZYnwBd0cOW OHAvF8yGfdk5gvkGTlQ/xchwu2Ix05FO2c+fBoOgIG1Gn2Q+PwheZklS7S+V+GFk @@ -5201,7 +5201,7 @@ Ar8c pub 280D66A55F5316C5 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFOOGVgBCACiDwUZOc6943aBGUrxikkfUnsyZfHtF9jihYmA1pSgfsye+JxR oG9QWW9+3qx4L/d4ZEqBftTWpsjyrY7NyMaeXtJEjE0vhiWNehgXB1z4XTJ66zCX @@ -5217,7 +5217,7 @@ uid Seth Tisue sub B293A312CEB2E9F6 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mDMEYVOgzRYJKwYBBAHaRw8BAQdAPnTbK24vDd1YxFLwAmpdoemwlJMKH7PyGSe/ ab65sry0JVNldGggVGlzdWUgPHNldGgudGlzdWVAbGlnaHRiZW5kLmNvbT64OARh @@ -5231,7 +5231,7 @@ li442QEAp72J6Hz7p0Vyu1u05NZvb+jLBwWyI0P7Hq2pfR3qFg0= pub 29579F18FA8FD93B sub 9DF7F2349731D55B -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFYFiMABCADYpblWssqGxbjTwsyroPh48BwdSKl59zbFKoEHDw87NeWq7fik h95RkbdeWsQSvduXWgQZsUDq9cLOkuS/ChAMkAAd3MPp1NMdFmAqS7BX5wU5s5I7 @@ -5259,7 +5259,7 @@ uid Charles Lee sub D95ECEC170500D9F -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBFsHC7gBDADlkoJglNVbX9MShcAm6jvS5atCZwWT63gSasObXFxswsJQd1NK qryHNcj9tKBfLbSpMOoHeyyIKDdwdxN+6+N9Hi4hf0j1Ub6deJyI8ace8VERWaxF @@ -5296,7 +5296,7 @@ uid Ceki Gulcu sub 10DA72CD7FBFA159 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBE+ZO+EBCAC3fZOOuYKthr0GcUge0PH2bh18sbM9XUmPKQz/W15l1NA/2ARS 2gUXM0R+SunMlun9KsqjnojJ2ObVPvbm1Hg/66JSRgR3JWfIpSlJxLicpfu8rCfN @@ -5324,7 +5324,7 @@ uid Joakim Erdfelt sub FCF74AFDF5947ABA -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFYVT4EBEACqm1qKc6Twp2Iw0tjUqr3hrZ7mjZMWg5MemH9ZiQ9iVIqV4Lee KmgjVWk5jnTslriymDilDIMk0YaT67JokhgSdqMIavI29tJ6quOp0K7Rj/rNBc6p @@ -5369,7 +5369,7 @@ uid Maven Central Java.net import (Used to sign artifacts imported from Java. sub 376179DC810188ED -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGiBEvHiBERBACWsrXr/oU5TYqCoX2pGlKVop38NX9/klFswZue0YMrAlEP3cid nQS7TYgEbUUIe25FFX7EsaiLoBDO0xKDcbO21vddThcBwF/cTwVrBvHThMECI1jX @@ -5403,7 +5403,7 @@ uid Eric Vergnaud sub C1D2A95A576A4144 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFhntCUBCAD4TyvpNK/pLusYgw2TdhDxX0v3wk5V18XeVIs2l+Ijj64xfU2A DR8Md1QPOZYFWbTJZ0T17CJ5jbPtGLu9ZJWR2s4lxcwtGK7n5y9ANeMjoG38dSyp @@ -5432,7 +5432,7 @@ uid Brad Corso sub 5CE9BCD2ED28F793 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBF0vfHYBDADEDPY9ub98c7jQe4yMbPke3A/sxNHnn0WuA9JN880DPs3L7lrv 9VHTOlFXslDNBPYSbgFXH5YlMGg8ZY8bhngjc+Z3dtrCX1cAjUXOnibi7fBFomLB @@ -5469,7 +5469,7 @@ uid Ralph Goers (CODE SIGNING KEY) sub FE694B892910DD22 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBErygmoBEADbs8zVUn5ZwbsG3tqT4x6U7SZYOtd3WXOtHjuu9Cyp74rZ19Pi XNbYwIAoCgOI/nXVWwuOrNJH0pHaQ73slbNzLxo2ahQIkw9PbK4V3YXLai1r/W6T @@ -5512,7 +5512,7 @@ E4MKxXh0DGLPEPiyStLVF41310m6rA== pub 36D4E9618F3ADAB5 sub C4935FA8AC763C70 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBGGiftwBDAC94Yhhh/5yO8jYFkg01MPnooXKZEPwxAbAg9wn5iM0tHxhEpkU zJVYZ+JYq013+Ldp8Of7A/d6hKTtZ0xwSeY7S/WFykIk6tc0P5j0sfFS3pGPDk+W @@ -5550,7 +5550,7 @@ sub AA1C6859520DE0B7 sub D137C32FD6897607 sub 4F91D100EB1F597B -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFpLCbkBEACk79tGWBbIoD+A7IZv4UE3+I9i9EhEGn7yzx+XwGbKwyBIMYrs cqzGaIwjid1tXz9wc7G4lXbzH0jgnCW26r0e4u0sBSziF+UKSAPZC2qduARGmlr8 @@ -5653,7 +5653,7 @@ uid Bintray (by JFrog) sub 0CFE993CDBE1D0A2 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFTi8JIBEACcN1ucQ1uCOZ1owTELQV/6i4q7NbYdJ5wf7yPYfEugSo3yfbo3 Pw/XEvlnpDZmT155sGNOkteZtZMdcm5XhFbdtquLlrkjAcUGatq5rAt3eLAlvU7u @@ -5696,7 +5696,7 @@ E/XhP4QkRJrZI1F/ pub 38EE757D69184620 sub 5923A9D358ADF744 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBEzEOZIBEACxg/IuXERlDB48JBWmF4NxNUuuup1IhJAJyFGFSKh3OGAO2Ard sNuRLjANsFXA7m7P5eTFcG+BoHHuAVYmKnI3PPZtHVLnUt4pGItPczQZ2BE1WpcI @@ -5798,7 +5798,7 @@ kYGSRLp1SxkBXtp7FajZkMabS2k87ctWb9nQjhJuVv6UnpCwiz3gyuipl/GVUWiz pub 3A1959EEF8726006 sub D908A43FB7EC07AC -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFu07rsBEADYizNlY0FYNZ6q2wx7AmWLw6PHje55uFhYM8Saqtwg/rm1tl78 j28E/coP2zMFf/ec+zqKsfYi4DMmLZ9ESIngMUOIE7mY0Pp4WN7oYFRtvU0ARWyp @@ -5854,7 +5854,7 @@ uid Carl Mastrangelo sub 9B2A1B698A113AAD -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFzwo60BEACg1rgL5jUtKkFE5DiwqJwxzJyJDH00TBSN6ZT+nXh1UxgC9q2h olF9V+2+LV1Jcmnc946xzIMiWLG33QB0NKVCdU5jNuLahOcViQQjNfGXwNzYoNCR @@ -5899,7 +5899,7 @@ uid Alan Malloy sub 4BC7B9A81C39EBA0 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBGEdX1MBDACuRDzoPMh3CyUHQydFo363R6OdXqMZ8mJQMdysIJCXOXZGRwUC uyPOUfH6uSG24RU2zvD72D2SGAehQKLXLQeN6XCt9PRAszP18dJADm10xgkXJm+G @@ -5936,7 +5936,7 @@ uid Drew Hamilton sub 91FCCDE555C64A9F -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBF42lroBEACWa+RCajazimveyzyVwzq+1Kj8eiJ1XPJXqvIerGOQ6Tx2qeSM 9AkMcfW7HeN6YW3BR/u2s7xe07D6p6c7UjTmiH1v23ELSk0Ou/BNxiTMdTSly77O @@ -5981,7 +5981,7 @@ uid Tatu Saloranta (cowtowncoder) sub 575D6C921D84AC76 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBGL4BxIBEAC+lX44fd/zrVQPzdKygarBd/X0bBpGakT++Kfk4UBGl3q+wd2G R9puB9R377ds8hU7U3To8sHguUZo6DbD9Gb/is/WajSb9g92z+rMow3KbqfCYqWr @@ -6027,7 +6027,7 @@ uid Pete Bentley sub 6B7EF7B18190F4A9 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBF2KLsIBEADgVw/j0Loslv+pBDEfYemeObeKCWBhEdAiGznT23XFb4eOa4oL Yk8FTL5SYV+Ylm5Pv4zUGV1JUggzb4mS5+/k0kl2OHzZpJTLz45E9Qe4KI5vk6jT @@ -6072,7 +6072,7 @@ uid Rob Tompkins sub 3260CB2DEF74135B -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFhqdSMBEACmveOOsQrTky8b5M+Cq6lbhqRB4+INnfigxr7+EMpswo4AxYuA Op/YG+G7NU5h6EK6Tj2dVfXga90GYFkehtFRZgOUJUGKPU/53upsbnsWS8qjJD8g @@ -6117,7 +6117,7 @@ uid Michael Schierl (Maven Project Release Key) sub 8A57131A07E0911E -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBGB980QBEADLBOfY981RbUf7zI9AoXcxGignXkYbeSvxIMML9vAbnhmuHwa6 h+81ZTY2XK7Rz211y129YidPykkiLX9mY+OWvJsj7dTyVTcIm6MU5ETDvovfmKWg @@ -6191,7 +6191,7 @@ uid Viktor Klang sub 1364C5E2DF3E99C5 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBF1Vn08BEADgfOupXhJxyb3t1kzDNa595spJptjF5ViyXuEJtlMQlmobPP9L 2gZH83gNe7Ro1TsLesgWTtin3hGANSKITdi/wVH4ET6lPInv1k/8hXe0zlF11Zmi @@ -6236,7 +6236,7 @@ uid Sebastian Sampaoli sub D94994D14B55169B -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mDMEY4fp+xYJKwYBBAHaRw8BAQdArb04PVwQKvEhtUEmEu7/aASZivOWgEkZBqX0 Tovwvq+0J1NlYmFzdGlhbiBTYW1wYW9saSA8c3NhbXBhb2xpQGVxdW8uZGV2Prg4 @@ -6252,7 +6252,7 @@ uid Giorgio Antonioli (GPG key added manually) sub 8C8D68AF389810C4 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBGQSS3oBDACzF8yjumbMujh5LRH4c+AaUkaVfMv/tiSCWXANtlJrU+XRPeKw Sm/jmT3g/W1cTbbTOt9I7329jrqbISHYSzmG4Q5f+KlHl2Mine6mUl6ipuIKmwhk @@ -6333,7 +6333,7 @@ vzqZL9WH1qfOB26bczhzqYBdpE3HRRqvOaFo2o7Rm9biGIJ/QqTk9C0xcI1/5BNv pub 47B25FE8A3702A09 sub 9FF026BD8292D6AD -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBEtjCpwBCADQHyrvtDB65xrmji7m37r3nyJwgSQbs5quzjAKl2H0xfpkIhmT IZESNqTMquwlz2wBlLZ4i80ydsDO3awm8nwhs9Q84pYFNYcfeQa+H3Y/uRMzaSiL @@ -6361,7 +6361,7 @@ uid Adam Cozzette sub 726F4E5C34CFD750 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBF8QwXwBDADKNLAHhjWUqnLYiO+ws3Hy1du6tMvkR3nfsnIDqpCvSjb+3/rI OHSyq8TbaGLLuHOM4K/KvrKgjhTbXQxvx1WR5IpoylcINzI959yAbaywBj6gVQB3 @@ -6398,7 +6398,7 @@ uid Colin White sub 5686B45C142551D3 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBF1EtnUBCAChtyYd/4eMAxTz5DVmO+8QOrTA1cf9bprQhtXD5pVbw8/IGKN+ EqXmvt7AGy+4O633g7ec5iyirwCfEP+4YDv8k1LOvY9C5+tOwfK+FxAPRVc1AAB5 @@ -6427,7 +6427,7 @@ uid Philippe Arteau sub 7569B5DA31ECF7BB -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFGP/FABEAC+7JFR/qhFujSJzNooyM1Zrc3Qmreadn8K3/7xZ8QpG0MF/UlT TvlUFnjOnlXIpEaFJ0pHnZmpqYXoQqwMNW+qVspFqYa86gMKy8L2VgWWVuBFLMf4 @@ -6472,7 +6472,7 @@ uid Seth Tisue sub 6DAC12FEF3928B80 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mDMEYVTpMBYJKwYBBAHaRw8BAQdAgCkGHxDJ2ObI6x5cwp6Cl85hJQ5vIZFH/0+1 wnaiXA20JVNldGggVGlzdWUgPHNldGgudGlzdWVAbGlnaHRiZW5kLmNvbT64OARh @@ -6485,7 +6485,7 @@ A8JnAAAKCRBTZaimkpKvGlyYAQC0bd1I8QbHqLzhkSv7NyKCh8SDTj/xb9DXPF24 pub 55C7E5E701832382 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mI0EVdDLQQEEAJMtYCaTA56YsP5RzQzPvqVTaR2nZ27qRk36blHB9WmXK+NHpGeH PHgq59mLPVueo2/M5k/fFrCe36jHePP31gYpFtueeYDfsofHwod0WhsHyC7JfG8d @@ -6495,7 +6495,7 @@ jEnSczTCmOHRZ3ed9ef6SeWUozYCQAX/tAbpoCthe0lTDYhFhkzVCe/FABEBAAE= pub 56E73BA9A0B592D0 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBGO9IPgBEADHCB2evKGSjQutTtIjODtaYUoU634Tl4Iv4DYsOR+MyOQBJ3Eo 9okST4azX6r9Fspgmc4LxpFnGm9OSEGn4NZ9ZxiTrmKaGsoXzj2w4JKtgAip4F5h @@ -6513,7 +6513,7 @@ LeoZAT6kdngSzr2WvXWs6xJbWIXJc5FivUorfkhaiaBWam1R4o+8kSuxSwARAQAB pub 571A5291E827E1C7 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGiBE9iFawRBACJb4OMk3zqMDNvSJKYZ8fGYrPq7yCcf/ykKDkGb2dtPnAZGkSp 3mmNlTsU6s9ARn7BtkhIuM5TdbLs+z+okX62h3F0WW3h+CpfIXyKSgl7uWbhZ5G8 @@ -6532,7 +6532,7 @@ uid Eclipse EE4J Project sub 153E7A3C2B4E5118 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFri3Q8BEAC90D8TTu6C05m/eq6HbU8gOHFc+2VJriVmnoyODTlEk/LAsT6h BRok7nzY0LpNUzUREjJy/w80YTOjLs25IFhnqA6mq8BGLjFwjhBPA4piCyhW/Elh @@ -6586,7 +6586,7 @@ DmlBBHiPyQWUgkZrTrJGzpzKLFowpWUoy49YiGUZw983YoHw pub 586654072EAD6677 sub 2E74CACB6918A897 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGiBE1VSkkRBACkCgvt26sMi+0X+EOJDMqdK0Sziy06k47LJf1jOg4tTZ2T9QtP OZ8fD+va/O5+q8Kna993jzcO5n0Nv+R/K3+MvUqSmdITshCIjBt3cC0n6FWndGyl @@ -6616,7 +6616,7 @@ CDJEYrz4EqbscOdx6H3uwA== pub 597852B0B140F0BC sub E0A468B5546CD437 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFFDPRgBCAC7Z/0fkdEkWVCD5BCDrIj/YOZBFOLHAZWLiVhyX0iDO1fhJcj7 8PKGiv+tnLz/FC2gk6ZJCbwbAlxb5hXLvPWe1SAn6KjOvqNKx+qZ9LNMo4dCqlBp @@ -6642,7 +6642,7 @@ c7/hvC5COsGvtYPqHtHFSXU= pub 59A252FB1199D873 sub 92BD2D0B5B21ABA2 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFUBG7QBCADRWXf0Fw05qRhM4cRnGKlOW1ecue1DCxHAtFwoqmAXyTCO+tI0 MEW5SyXUkX6FsWLl6A2y+KgOs669ogzfQ0rnZMEt4HisRp8wpgk3GWR1/9aKYz/c @@ -6670,7 +6670,7 @@ uid Taro L. Saito (For GitHub Actions) sub 8857595B73BFD468 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mDMEYuRVGhYJKwYBBAHaRw8BAQdA2Dp4m1Yhtb1g94pQzzL24FuP6b9KXF8lP9Dh hZnynhe0M1Rhcm8gTC4gU2FpdG8gKEZvciBHaXRIdWIgQWN0aW9ucykgPGxlb0B4 @@ -6684,7 +6684,7 @@ MGPPLXVyY8Kr6dYFAP9wYLu7nsDZCOXkAgS+et4Pk1WZCggoYUkxsX1o0KZXBQ== pub 5B05CCDE140C2876 sub 9D29AE4A6B50E01F -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQMuBEwVZOURCADNnKQzSjFuI9/IGj3WTJcPU2B/H8NbZaTsz5WE91WumgZulK2q YeD4u6zdOyFK7DEScgxk7dicox9cNEgYKQnQXctDhfqER9bnvA2iJ+AFxjRAWyvs @@ -6725,7 +6725,7 @@ uid David P. Baker sub A7CC6488427379A4 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFgRFtYBCADud9fmvTI8Dbs+9GcZUIVzxkL84QYHSDxI9fF+sxfAviq1U+YJ a+ZLIW7HsXx8vpn3hqIqAbDxHjrb6MEJ3OWD5Ks7O9Lq7HOhtqAT/mpV3fZmf6pF @@ -6754,7 +6754,7 @@ uid Eric Bruneton sub 0440006D577EAE4B -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBE7JURcBCADO+9Dc4/JnB+wX+fq+Fr2zUGSPOT6/qjE5kXL4FEbJKsqDSAKG VnbtRrsIUdmNIFQmz71bBDFhRBbrSrkz927k8eUPhYtxE2NmmWSuKgrjF4qviPQv @@ -6783,7 +6783,7 @@ uid Ting-Yuan Huang sub 73F7734B17EC71F4 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBGEVsM0BEADiZwFLiyjeOLeGS0jAso0pOwUigT9PpwQq7JFAuJP2i9C4Eunc J2HWRdMhnAY12C2MVetSwhI/4QID+rIreB7ooC4xv8sz1PIC30t2oSYtXF4w5DYh @@ -6828,7 +6828,7 @@ uid pedro_karumi (Pedro's key) sub 365D826E84B11B58 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBF7D95MBCADKhJjqI9jckLUSJDyuS3ury2a6CUy4M5Ak/AzFBB6PdBJWuZuB WLU1A2Pae/ADkqoQWv/TATsi8eHcQzLhL+TmdqDXiojdxn0Wk9krtO5u20O8WbYo @@ -6857,7 +6857,7 @@ uid scala-parallel-collections bot sub 92AEAA033EDCFC13 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBF14+1IBCADMFJyazFt4gCmOWzVO5LU0WoRVzH0PuRtIV267uZtBqgknQWvU RzQz4bijv4+Eg+QmEJuCKpLs1MXgSh3wCqHNwLg1+UX0pbqxQPz+XeP07A4F+tN2 @@ -6885,7 +6885,7 @@ G9e86vW0gwWqerOXyCYXpc6P pub 6425559C47CC79C4 sub D547B4A01F74AC1E -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBE3XFIUBCADcj1zw8m1evCgEMqxgOfl6L8y1tsYWsX7tVPvHEkYlXHrdcpkB fGuWPrauvhBmB9sBkFfxzU98Ilz3Xk9pfISYiaMUk9Mk1ZxsCoYPVhxvOSvk5LgS @@ -6913,7 +6913,7 @@ uid Jukka Zitting (CODE SIGNING KEY) sub 6A73B16B42B5977B -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBE+8uJ8BEADXU857F2gw46XOYN4VZxFCuRec/7Zib+yTFwnolNkma4cBYMyB AdH7i7OlQdPVEV3vpWTUUM/fo0zFHIWsENT6Hk8SM6kTutYatDoOmjOIWzz/iXkz @@ -6958,7 +6958,7 @@ uid Popma Remko sub 0AC07D0BBD11498C -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBGBVUWMBDACXALXWXSrB2V95lR1L+i+sQsTQt8tCIgX0iX9UZ7Vw2K/lLnLw WYtM3oTxYox4OdgkK9tK6771EdCH5wQtRdUQJjlsBfZDPMiGqmh1jrAxAugEkFyC @@ -6992,7 +6992,7 @@ AA4fEAfsK22q/zZWGn1aDs1RyzdSprcN2g== pub 66B50994442D2D40 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBGDoYisBEACqUDZnT4h6ma6XIzdC6KR++uDbR2VKdhCuv0Og/sHEKkm6ZbG0 OFB8tAaQx/WlsoQyf3DlLfUEOGDai875Aqor3fbM+E1hrZbQNfsOySKEE52k7PYe @@ -7013,7 +7013,7 @@ uid Ceki Gulcu sub A1766BE5F812AC2E -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mJMEYvEGpBMFK4EEACMEIwQA6knc/2gtbqDhPh5EzrymR4Hwi1Xf2S0aqMopA1zg IeZzBgSfL+4fEfpXL4eAzvrk29jIXSizDEOgFpw3PW3Om1gASxub4Jo6EQrRgOdd @@ -7034,7 +7034,7 @@ uid Szczepan Faber sub C0058C509A81C102 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBGAofm8BDADhvXfCdHebhi2I1nd+n+1cTk0Kfv8bq4BQ1T2O85XlFpp1jaIR 70GAm2MOt8+eEXt/TuPkVBWnJovDpBbkUfYWxSIpPxJzcxWV+4WJi/25fBOq2EuP @@ -7070,7 +7070,7 @@ pub 6A65176A0FB1CD0B sub EA8543C570FAF804 sub CA890A5FA09CFD80 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFgMcBMBEAC/xcIVVOOh+F7S0OTzBlFH34s5fDbi6Zto469tZyW1peyWtXAZ m+2jzFfeTCHaUQO3YjoTy2fPygS4tVD+ew4EAzMG5Uti4kwWZw0PYKz2JO/gl1JY @@ -7136,7 +7136,7 @@ pjR9iVjH1oML0H5i1H4= pub 6B1B008864323B92 sub FA6831EE37606774 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFTDM4oBCAC9cUMAjkP1dD7tt0JUI5kVORKagn4/zG6+Y2MUwGgJs481xsFC jXPuNZMucAVtXmw5Sl7FbsfSxR/9jJ2pnbXL918eRFbUqY4LnuOTZjcgNWo8PWPc @@ -7164,7 +7164,7 @@ uid Daniel Lemire sub 1723844CF9A045EC -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBE7+huMBCADW9rfqKBXOqUSLCK5Klag5WqLFxAOddqEM7wTx/42XaIKjDiAW gmFnV4XBKm/7Z4fwWq7+ku6NDYUjBpI4vcQ2hYJJ4SRWZHT5wWzOmqgznf+/Qwug @@ -7193,7 +7193,7 @@ uid Colin Decker sub ABE9F3126BB741C1 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFIXyRQBCADe285y3Pu7KzoKyP6wqeNXtvvuwMatAmPm5x/i+S8MlryqzsYa x6twUmXV1yKjjtGrO+9fHvTOWBfSSP+fP9KTaTQYSasoJq2Mw4cQDy1i0zrxNZUw @@ -7226,7 +7226,7 @@ BzoVWrw= pub 760F395DC40D55A7 sub 9BBDD59B9EC621AF -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFSf+Z8BCAClJRKO/dDl1k55cP9BKpobsJEI6SInE7RDmR3NDsF4G2Hefo3z UZl90EYkT1aYw5tE5c/SLsUE5LO3EmrGK91HFpYDdAajg+WEyS8UDPA/npFPvoRY @@ -7256,7 +7256,7 @@ sub 78BD65473CB3BD13 sub 6494C6D6997C215E sub E88979FB9B30ACF2 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBFcMjNMBEAC6Wr5QuLIFgz1V1EFPlg8ty2TsjQEl4VWftUAqWlMevJFWvYEx BOsOZ6kNFfBfjAxgJNWTkxZrHzDl74R7KW/nUx6X57bpFjUyRaB8F3/NpWKSeIGS @@ -7449,7 +7449,7 @@ uid Rob Manning sub AC9F6F1991913E30 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGiBEqXMWkRBACnsxVroe9ojc2AnRn/85KJi/Ntsbku5iJ5z72B6I+VGn/b1Xln kuvRJ41RLG13lKVmHtSTq2pajjmAr9jY5gS8nJ3JUES9bG3yKNN1IDswXExfAUJp @@ -7492,7 +7492,7 @@ uid Filip Jirs?k sub 9F7335D63326E7F9 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFWdcSoBCADK8j+0eVZKUGctZo/VaJ/K2Wppx4jEFgih8xiIWREQ9B3QEugJ mJMWZHhrnHB+sjVx5No482ch6sVhYmC+VMyTdzepItZ8beYa0pnNGJnrFT+HcTOS @@ -7519,7 +7519,7 @@ wGvbF5c4rF4iVtgbCH+PcCwrQ6m6pQl9nnC8ANt2Zyj7o+JqefWrRa+F+ZFqJ7sg pub 7A01B0F236E5430F sub C3E640F38D845FA2 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFZUsiQBCADGmoidvh3VvXWGdwbAtHPtDPKEebE/MfFVO+QTRbjJxphzKwAt mxHruikafaSTnC9FWizj99e/Yc45YZHcnt5Htmy0a7DSOQXL37rrnieZxg86tYmC @@ -7547,7 +7547,7 @@ uid Sebastian Bazley (ASF CODE SIGNING KEY) sub C189C86B813330C4 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQINBEvxja8BEADAzZOup1X0B12zJsNsDvXVIwmM6bB+uhEsUHoFTvmsEVwRoZtn i7Q0WSFoY+LDxbvC4Bg1+urCrUrstRJYRyF/pMqPYq/HokRlPjtrli/i3mUSd0zN @@ -7592,7 +7592,7 @@ uid Oleg Kalnichevski sub 926DFB2EDB329089 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGiBEPonucRBACtbhYckAoyz1tuSXYX4XiqGa5390gIMcxe2hJ+Ncx9o3zX09Im f8PW27BnMrz7EIydgB2wphhjfK4vkNNtm5ZDWH/zJStsk1Fe7lNuuxs8XorX1+8D @@ -7614,52 +7614,18 @@ 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 -iQCfdH3+RPBbKSQofz2bGx7/niTd9qg= -=Bc+4 +jX+NTR/p0O+L90b6T+xFin/RXxLRaa8= +=t151 -----END PGP PUBLIC KEY BLOCK----- pub 7C30F7B1329DBA87 uid Ktor Release -sub 72FF58594F983302 -sub 3967D4EDA591B991 sub 0588BC69A286FF16 +sub 3967D4EDA591B991 +sub 72FF58594F983302 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGNBF+TCd4BDACbIA94MfIWL0SpvZwBddXgx36Lp9GYOWNgGoQCWSvk9vaMrLaI rEll0xnoP98CfBQYrVSAmHDMhSLBCjNB3V1Sdz8GRdOG7HUffF7Cqwbm3Fxo3H/h @@ -7670,34 +7636,34 @@ Rf9A2r45DBbPfvwTL+ZbrGtCssUpCneWhPl79UsMxeY+vJjEggqqqRqbHRn6nOQd 1JUAHNEFtuJQKGWNuwWO58Yun1EBtOdUEvnIIoQ+CIN/XeKrnEIXE3LSblB8BR3H bqX54BMe9AzsmDQtc5pUOm2pfvCoiv8xFXQznBg24dGqo2A/jMoUnGj6oRj7k8mt i9AdPLigldr0S0sAEQEAAbQhS3RvciBSZWxlYXNlIDxrdG9yQGpldGJyYWlucy5j -b20+uQGNBF+TCpABDADRarOqvERlpMCJjNXGZpK5sV7Umndyu1rwVOfEBhINkRX1 -vzzFJFciIfWEZ2c+vSNnXZC+vFuAYtwnHqTWwyodHU+/jwHeEWQ9WcD2buSwJvps -kSei7ZMSWx7zAGWM4ae0FmjJrVHEQhM1CgeDwrxIzJqoOhrC26IorT7bGB5M2Z2n -NStGz9fen71jNeyo0fHvvy9xkcEWsfDd9A5V0odRb5y1yKiHH4Puz+o6Gys43/PQ -Gzf2NBx1sjzQjmJrrufvMIzRWrJwySYJQZkr/qdJyqbKZgbA/BWTmpN9POranNd0 -YO2/lbD7eiDkBflNGnWcb305VVzyZSD1kXXeLAc+y4cQugj+FkA/9Tv2c75sIhXP -QAlZAG3ldj8WSiAlyyVuuWZh3eyxxH8J9LKDXJpBqvNvzucso1PQS2HzKhT98GxX -45LRTsZo6yM5XAFgqw42KqTmcOy97mzluVCos090d25zYwCYsFoSaIX06wYz1GuS -sW/JHXyUwsG6BWScgqMAEQEAAYkBvAQYAQoAJgIbIBYhBDlMtDbFaRb8Ae6kp3ww -97EynbqHBQJjUcQsBQkHgSCcAAoJEHww97EynbqHUwEL/1F9/YVb44+iEUpwTS14 -ZGHlDvZKem5Ti1sG/kws9kPHvp8LLOwpqxqi6RneT/hyNCY8HRh1A9BhFrGp7Vxr -4lMTeCOqvqqLw+uzVsBx9w9Rr4EYvo7yXvi6pBxR2KOlvK/A5vFfTLoNOjgGqtGi -XB4B0VSmJBM6iSiOeHj+hZZw6i87dpRS4KBhE3VIL3OBkr7TLqX5e33V8CJlMeQ+ -bTbQlCfxG+FJyURSrQ4CJVZq0/pbs4OXGqjWJ5sTlQmZNEGNijNAHV9Ttocl8ADC -yjgYDe3VVYvvtgVSwqVKdhd1RGBedm+8zeTKdfIO8ybr71rZMWwumnst599txqTP -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 @@ -7742,41 +7708,43 @@ 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 -bsFtKMUFPmME -=SjRY +qnpm3HfWKkmMwiG5AY0EX5MKkAEMANFqs6q8RGWkwImM1cZmkrmxXtSad3K7WvBU +58QGEg2RFfW/PMUkVyIh9YRnZz69I2ddkL68W4Bi3CcepNbDKh0dT7+PAd4RZD1Z +wPZu5LAm+myRJ6LtkxJbHvMAZYzhp7QWaMmtUcRCEzUKB4PCvEjMmqg6GsLboiit +PtsYHkzZnac1K0bP196fvWM17KjR8e+/L3GRwRax8N30DlXSh1FvnLXIqIcfg+7P +6jobKzjf89AbN/Y0HHWyPNCOYmuu5+8wjNFasnDJJglBmSv+p0nKpspmBsD8FZOa +k3086tqc13Rg7b+VsPt6IOQF+U0adZxvfTlVXPJlIPWRdd4sBz7LhxC6CP4WQD/1 +O/ZzvmwiFc9ACVkAbeV2PxZKICXLJW65ZmHd7LHEfwn0soNcmkGq82/O5yyjU9BL +YfMqFP3wbFfjktFOxmjrIzlcAWCrDjYqpOZw7L3ubOW5UKizT3R3bnNjAJiwWhJo +hfTrBjPUa5Kxb8kdfJTCwboFZJyCowARAQABiQG8BBgBCgAmAhsgFiEEOUy0NsVp +FvwB7qSnfDD3sTKduocFAmNRxCwFCQeBIJwACgkQfDD3sTKduodTAQv/UX39hVvj +j6IRSnBNLXhkYeUO9kp6blOLWwb+TCz2Q8e+nwss7CmrGqLpGd5P+HI0JjwdGHUD +0GEWsantXGviUxN4I6q+qovD67NWwHH3D1GvgRi+jvJe+LqkHFHYo6W8r8Dm8V9M +ug06OAaq0aJcHgHRVKYkEzqJKI54eP6FlnDqLzt2lFLgoGETdUgvc4GSvtMupfl7 +fdXwImUx5D5tNtCUJ/Eb4UnJRFKtDgIlVmrT+luzg5caqNYnmxOVCZk0QY2KM0Ad +X1O2hyXwAMLKOBgN7dVVi++2BVLCpUp2F3VEYF52b7zN5Mp18g7zJuvvWtkxbC6a +ey3n323GpM9EpgYhlXiWxa6FDv+fOzQolGYajQCMPTW3hRWElQwRZfpQHg9nbvos +DbOMNEZsZmo57u2SKYKeucFemUc8pY3Y0pb9rdyipDjVjL2QiP4rmG4XIEXWCI4l +Yf1rF7dw4B2LaKuggDzbZQIew78sWcZrlUnSFtSGnqiPAp5D1Gzbwtu9iQG8BBgB +CgAmFiEEOUy0NsVpFvwB7qSnfDD3sTKduocFAl+TCpACGyAFCQPCZwAACgkQfDD3 +sTKduoct9wwAljmcSNiDm7eX2EFwQVOyqmVDO5wc5rKvy1yQ5WvSEMLW3BBCld+l +/Hb7GW21F8MjzEP78r1/7LqsNTYg0MWLAJTIcREmmBMIbjDv9pl/KiFgJjMJ6C62 +KZh5cxcUz8Z8bm7w8pwUthGYXN05Wbcf8uzVU7cmYDQMJzCcyKRwBFo6Nmk6otx7 +ssaf2fChZolGEbcnekHQMaAz33tXexsFiPOCPwNA+gVrtvq6UOaNcNI7+pLsQ7wY +/zyWvVjKFTeKnJjNvyV4URopUEMg5Ps6JajDe3gFG8ekAOtdEwtWc8gDN9LaXr8l +SrQevRLv+RS9x67Li2YA9y+wIuYP/GQylxtOrnneBCpOL10CK8ApIQCdP3Vw85Qz +i0yUbC0RyCaORKgGTase+Igz6wyj/3NaX4ezoV/yexjNyXL2pZlrjEjPHEQIPZ2C +giePKawfrBup2GpJPcffD1y2+mYNaueVZTxDSWx6XUptDcZefzgumGAvevPI/llp +XwCWdYzvSwRp +=Hi5G -----END PGP PUBLIC KEY BLOCK----- pub 7C7D8456294423BA +uid Henri Tremblay + sub 9842FE565AA0601E -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQGiBEvsZw4RBADH20nX+H1xvMBYmXRj1Aae4dRr6Y6qI7QRWHO6Z7/dxr9bk/NN Yjq5KsVOQxZzloVdtqx75rznT7fZq98g7Nq9IeEtB6k4tnh6XQLhljJMk0a3mzdt @@ -7786,21 +7754,22 @@ ODStcE6WlHFKi7YzcYNLzYMebSGYn6bj65b3qNf6rybWD1hGUFK4122Q7+HCH9Ic J+rr8HwjGFo/yxI0/mkyaF0BthXYPy4WtdsdTM2kgx8Zr3Q2rSt1jBPuV3q8d27z FZMiA/9cWPkRx0RfAJmBPKmKkbBkEtBbNau3G7MY1OEAkEkRnzmnyyjr5IP84A7K RdjTCvkbiQrOQH00Ki4sHIg+9Xv1gDg1XLkFDzRARKA1TxjL0OeS4RWF3iia7Swk -MOnTdhR50pjb18W8kB4mEMZY7duP4nwDfQwHMwbFZGHrjImaurkCDQRL7GcQEAgA -thrbFDDbIGq97dbX1ZEwNGpjILdeumxZzaCc5PgldHGA86TL2V9iPpONJtv7/Csr -1c/rvH0IA/BFu+0Kde9UP+z9JycmfJpIsd2Qtxfhn9R4+Td0VtN9NNkpt1+JcThb -zyQq4UU82uBKwSG/wzubOI4Fn+7ypIuNgDkqK0STIL3ucKF/RV77PsOBeLHkCGKI -VhUUfY1D51BWZKKB1efaVK7PLdnsi64lAhbaexA43dwUUtVwQOvDzJVtkycV2IMw -XwyHonlK+4vbcwIH2BAU46LIZy+VFaI+lNNmR9+xeWH49oJYnMWIXif4RzvO1ag2 -KKwlG2sacuVTtpWVqKayBwADBQf7BGl4POKtluAbX3a/KGnX1YyibPT2e4pdOxqb -KTwuRc7ILIK/LVcejVuLd+eOF1QmjToI7Y3qjlzvtaxSemfkxbIQpdus0SyHEEAG -H/qjNuTs8ZwEl9tPPrKaJHbJ9kQrlDPwkufA0NDAXTE76UhcHPY0DeykAKEw2rav -EqI7Y0nXR2WSmRLFChmQ+aNTm/9UGI/IoRdS/dgo1eaLD/7RLFeL5tGDe+2nj+B6 -j+52nZEmaRCWWU7O9jYL1cQu5WTurtneCLtIqehLsjuVz9ihBysYuUcTOV/6W0AI -clQoMEiFR9Kyv0owDk6LtX2DgibJuAvvLlnajsiGm5nyVh3G1IhJBBgRAgAJBQJL -7GcQAhsMAAoJEHx9hFYpRCO6iXUAnRcLw17lBhe/WcKFRkzETSxaJcjIAJ4/P1NN -On/eScLdx27sje7q3sBENw== -=TzHJ +MOnTdhR50pjb18W8kB4mEMZY7duP4nwDfQwHMwbFZGHrjImaurQpSGVucmkgVHJl +bWJsYXkgPGhlbnJpLnRyZW1ibGF5QGdtYWlsLmNvbT65Ag0ES+xnEBAIALYa2xQw +2yBqve3W19WRMDRqYyC3XrpsWc2gnOT4JXRxgPOky9lfYj6TjSbb+/wrK9XP67x9 +CAPwRbvtCnXvVD/s/ScnJnyaSLHdkLcX4Z/UePk3dFbTfTTZKbdfiXE4W88kKuFF +PNrgSsEhv8M7mziOBZ/u8qSLjYA5KitEkyC97nChf0Ve+z7DgXix5AhiiFYVFH2N +Q+dQVmSigdXn2lSuzy3Z7IuuJQIW2nsQON3cFFLVcEDrw8yVbZMnFdiDMF8Mh6J5 +SvuL23MCB9gQFOOiyGcvlRWiPpTTZkffsXlh+PaCWJzFiF4n+Ec7ztWoNiisJRtr +GnLlU7aVlaimsgcAAwUH+wRpeDzirZbgG192vyhp19WMomz09nuKXTsamyk8LkXO +yCyCvy1XHo1bi3fnjhdUJo06CO2N6o5c77WsUnpn5MWyEKXbrNEshxBABh/6ozbk +7PGcBJfbTz6ymiR2yfZEK5Qz8JLnwNDQwF0xO+lIXBz2NA3spAChMNq2rxKiO2NJ +10dlkpkSxQoZkPmjU5v/VBiPyKEXUv3YKNXmiw/+0SxXi+bRg3vtp4/geo/udp2R +JmkQlllOzvY2C9XELuVk7q7Z3gi7SKnoS7I7lc/YoQcrGLlHEzlf+ltACHJUKDBI +hUfSsr9KMA5Oi7V9g4ImybgL7y5Z2o7IhpuZ8lYdxtSISQQYEQIACQUCS+xnEAIb +DAAKCRB8fYRWKUQjuol1AJ0XC8Ne5QYXv1nChUZMxE0sWiXIyACePz9TTTp/3knC +3cdu7I3u6t7ARDc= +=xYLL -----END PGP PUBLIC KEY BLOCK----- pub 7EB97D110DFADD60 @@ -7808,7 +7777,7 @@ uid Niall Gallagher (www.npgall.com) sub DC0B7E986BD7398F -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBE9/RAsBCADI/pVIFcoLmbq4LCKkqeN4i5xgGKsuQsDAf/ndFkILDUA2FaPN 7cI3EvZacWnWUA0QkkKNKpajU2OjjQlu4IyBosJht3VMtD0BJ2nL8eIDvwO6L8TS @@ -7844,7 +7813,7 @@ uid Wouter van Oortmerssen sub AE6B5325E74ED034 -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.68 +Version: BCPG v1.77.00 mQENBFnyVlkBCACe8zGkIlDV0dUKmk9PWe2Hw8qM9DdPbtpUOpmUOidGY5svQDL3 eqvHk85TbxqFEe3Qbjjt+R+iApFuXy5kmueXTvwCm7nAU+k/pZtPuzHyhDs3iFFH diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 1927ff9a80..8ed8519cc0 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -6204,6 +6204,14 @@ + + + + + + + + @@ -6212,6 +6220,14 @@ + + + + + + + + @@ -6236,6 +6252,14 @@ + + + + + + + + @@ -6252,6 +6276,14 @@ + + + + + + + + @@ -6273,6 +6305,14 @@ + + + + + + + + @@ -6800,6 +6840,14 @@ + + + + + + + + @@ -6808,6 +6856,14 @@ + + + + + + + + @@ -6824,6 +6880,14 @@ + + + + + + + + @@ -6832,6 +6896,14 @@ + + + + + + + + @@ -6920,6 +6992,14 @@ + + + + + + + + From 610f32c7f1c1cd81616c1708f03203c074d73d11 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 27 Jun 2024 10:56:04 +0200 Subject: [PATCH 20/27] chore(deps): Add base gms dependency due to messaging lib update Signed-off-by: Andy Scherzinger --- app/build.gradle | 1 + gradle/verification-metadata.xml | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index d12d6392fe..a336704b8a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -412,6 +412,7 @@ dependencies { // upon each update first test: new registration, receive push gplayImplementation "com.google.firebase:firebase-messaging:24.0.0" + gplayImplementation 'com.google.android.gms:play-services-base:18.5.0' gplayImplementation 'com.google.android.play:review-ktx:2.0.1' implementation 'com.github.nextcloud.android-common:ui:0.17.0' diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 8ed8519cc0..17e203aab8 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -6244,6 +6244,14 @@ + + + + + + + + @@ -6260,6 +6268,14 @@ + + + + + + + + @@ -6313,6 +6329,14 @@ + + + + + + + + From eaa41df3c0d187a265b1ee2e9a128eda714ab4d8 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Thu, 27 Jun 2024 11:29:32 +0200 Subject: [PATCH 21/27] Add changelog for 3.29.1 Signed-off-by: tobiasKaminsky --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9dfc2e760c..70d1944d18 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## 3.29.1 (June 27, 2024) + +- Bugfixes + +Minimum: NC 16 Server, Android 7.0 Nougat + +For a full list, please see https://github.com/nextcloud/android/milestone/93 +