Merge branch 'feature/fga/update-rust-sdk-0.1.27' into feature/fga/room_detail_factory_improvement

This commit is contained in:
ganfra 2023-07-03 20:49:20 +02:00
commit bbaed2e402
46 changed files with 152 additions and 110 deletions

View file

@ -75,6 +75,7 @@ private fun LeaveRoomConfirmationDialog(
eventSink: (LeaveRoomEvent) -> Unit, eventSink: (LeaveRoomEvent) -> Unit,
) { ) {
ConfirmationDialog( ConfirmationDialog(
title = stringResource(CommonStrings.action_leave_room),
content = stringResource(text), content = stringResource(text),
submitText = stringResource(CommonStrings.action_leave), submitText = stringResource(CommonStrings.action_leave),
onSubmitClicked = { eventSink(LeaveRoomEvent.LeaveRoom(roomId)) }, onSubmitClicked = { eventSink(LeaveRoomEvent.LeaveRoom(roomId)) },

View file

@ -14,14 +14,21 @@
* limitations under the License. * limitations under the License.
*/ */
@file:OptIn(ExperimentalAnimationApi::class)
package io.element.android.features.messages.impl.timeline package io.element.android.features.messages.impl.timeline
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.animation.animateContentSize import androidx.compose.animation.animateContentSize
import androidx.compose.animation.scaleIn
import androidx.compose.animation.scaleOut
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.BoxScope
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.LazyListState
@ -30,7 +37,7 @@ import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowDownward import androidx.compose.material.icons.filled.ArrowDownward
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.FloatingActionButtonDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.derivedStateOf
@ -41,6 +48,8 @@ import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.platform.LocalInspectionMode
import androidx.compose.ui.res.pluralStringResource import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
@ -60,6 +69,7 @@ import io.element.android.libraries.designsystem.theme.components.FloatingAction
import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.Icon
import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.theme.ElementTheme
import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableList
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -230,13 +240,11 @@ internal fun BoxScope.TimelineScrollHelper(
val firstVisibleItemIndex by remember { derivedStateOf { lazyListState.firstVisibleItemIndex } } val firstVisibleItemIndex by remember { derivedStateOf { lazyListState.firstVisibleItemIndex } }
val isScrollFinished by remember { derivedStateOf { !lazyListState.isScrollInProgress } } val isScrollFinished by remember { derivedStateOf { !lazyListState.isScrollInProgress } }
val shouldAutoScrollToBottom by remember { derivedStateOf { lazyListState.firstVisibleItemIndex < 2 } } val shouldAutoScrollToBottom by remember { derivedStateOf { lazyListState.firstVisibleItemIndex < 2 } }
val showScrollToBottomButton by remember { derivedStateOf { lazyListState.firstVisibleItemIndex > 0 } }
LaunchedEffect(timelineItems, firstVisibleItemIndex, isScrollFinished) { LaunchedEffect(timelineItems, firstVisibleItemIndex) {
if (!isScrollFinished) return@LaunchedEffect if (!isScrollFinished) return@LaunchedEffect
// Notify the parent composable about the first visible item index when scrolling finishes
onScrollFinishedAt(firstVisibleItemIndex)
// Auto-scroll when new timeline items appear // Auto-scroll when new timeline items appear
if (shouldAutoScrollToBottom) { if (shouldAutoScrollToBottom) {
coroutineScope.launch { coroutineScope.launch {
@ -244,9 +252,22 @@ internal fun BoxScope.TimelineScrollHelper(
} }
} }
} }
LaunchedEffect(isScrollFinished) {
if (!isScrollFinished) return@LaunchedEffect
// Jump to bottom button // Notify the parent composable about the first visible item index when scrolling finishes
if (!shouldAutoScrollToBottom) { onScrollFinishedAt(firstVisibleItemIndex)
}
// Jump to bottom button (display also in previews)
AnimatedVisibility(
modifier = Modifier
.align(Alignment.BottomEnd)
.padding(end = 24.dp, bottom = 12.dp),
visible = showScrollToBottomButton || LocalInspectionMode.current,
enter = scaleIn(),
exit = scaleOut(),
) {
FloatingActionButton( FloatingActionButton(
onClick = { onClick = {
coroutineScope.launch { coroutineScope.launch {
@ -257,14 +278,24 @@ internal fun BoxScope.TimelineScrollHelper(
} }
} }
}, },
elevation = FloatingActionButtonDefaults.elevation(4.dp, 4.dp, 4.dp, 4.dp),
shape = CircleShape, shape = CircleShape,
modifier = Modifier modifier = Modifier
.align(Alignment.BottomCenter) .shadow(
.size(40.dp), elevation = 4.dp,
containerColor = MaterialTheme.colorScheme.surfaceVariant, shape = CircleShape,
contentColor = MaterialTheme.colorScheme.onSurfaceVariant ambientColor = ElementTheme.materialColors.primary,
spotColor = ElementTheme.materialColors.primary,
)
.size(36.dp),
containerColor = ElementTheme.colors.bgSubtleSecondary,
contentColor = ElementTheme.colors.iconSecondary
) { ) {
Icon(Icons.Default.ArrowDownward, "") Icon(
modifier = Modifier.size(24.dp),
imageVector = Icons.Filled.ArrowDownward,
contentDescription = "",
)
} }
} }
} }

View file

@ -22,9 +22,9 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import io.element.android.features.roomdetails.impl.R
import io.element.android.features.roomdetails.impl.members.details.RoomMemberDetailsEvents import io.element.android.features.roomdetails.impl.members.details.RoomMemberDetailsEvents
import io.element.android.features.roomdetails.impl.members.details.RoomMemberDetailsState import io.element.android.features.roomdetails.impl.members.details.RoomMemberDetailsState
import io.element.android.features.roomdetails.impl.R
import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
import io.element.android.libraries.designsystem.components.preferences.PreferenceCategory import io.element.android.libraries.designsystem.components.preferences.PreferenceCategory
import io.element.android.libraries.designsystem.components.preferences.PreferenceText import io.element.android.libraries.designsystem.components.preferences.PreferenceText
@ -71,6 +71,7 @@ internal fun BlockUserDialogs(state: RoomMemberDetailsState) {
@Composable @Composable
internal fun BlockConfirmationDialog(onBlockAction: () -> Unit, onDismiss: () -> Unit) { internal fun BlockConfirmationDialog(onBlockAction: () -> Unit, onDismiss: () -> Unit) {
ConfirmationDialog( ConfirmationDialog(
title = stringResource(R.string.screen_dm_details_block_user),
content = stringResource(R.string.screen_dm_details_block_alert_description), content = stringResource(R.string.screen_dm_details_block_alert_description),
submitText = stringResource(R.string.screen_dm_details_block_alert_action), submitText = stringResource(R.string.screen_dm_details_block_alert_action),
onSubmitClicked = onBlockAction, onSubmitClicked = onBlockAction,
@ -81,6 +82,7 @@ internal fun BlockConfirmationDialog(onBlockAction: () -> Unit, onDismiss: () ->
@Composable @Composable
internal fun UnblockConfirmationDialog(onUnblockAction: () -> Unit, onDismiss: () -> Unit) { internal fun UnblockConfirmationDialog(onUnblockAction: () -> Unit, onDismiss: () -> Unit) {
ConfirmationDialog( ConfirmationDialog(
title = stringResource(R.string.screen_dm_details_unblock_user),
content = stringResource(R.string.screen_dm_details_unblock_alert_description), content = stringResource(R.string.screen_dm_details_unblock_alert_description),
submitText = stringResource(R.string.screen_dm_details_unblock_alert_action), submitText = stringResource(R.string.screen_dm_details_unblock_alert_action),
onSubmitClicked = onUnblockAction, onSubmitClicked = onUnblockAction,

View file

@ -142,7 +142,7 @@ jsoup = { module = "org.jsoup:jsoup", version.ref = "jsoup" }
appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" } appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" }
molecule-runtime = { module = "app.cash.molecule:molecule-runtime", version.ref = "molecule" } molecule-runtime = { module = "app.cash.molecule:molecule-runtime", version.ref = "molecule" }
timber = "com.jakewharton.timber:timber:5.0.1" timber = "com.jakewharton.timber:timber:5.0.1"
matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.1.26" matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.1.27"
sqldelight-driver-android = { module = "com.squareup.sqldelight:android-driver", version.ref = "sqldelight" } sqldelight-driver-android = { module = "com.squareup.sqldelight:android-driver", version.ref = "sqldelight" }
sqldelight-driver-jvm = { module = "com.squareup.sqldelight:sqlite-driver", version.ref = "sqldelight" } sqldelight-driver-jvm = { module = "com.squareup.sqldelight:sqlite-driver", version.ref = "sqldelight" }
sqldelight-coroutines = { module = "com.squareup.sqldelight:coroutines-extensions", version.ref = "sqldelight" } sqldelight-coroutines = { module = "com.squareup.sqldelight:coroutines-extensions", version.ref = "sqldelight" }
@ -156,7 +156,7 @@ vanniktech_emoji = "com.vanniktech:emoji-google:0.16.0"
telephoto_zoomableimage = { module = "me.saket.telephoto:zoomable-image-coil", version.ref = "telephoto" } telephoto_zoomableimage = { module = "me.saket.telephoto:zoomable-image-coil", version.ref = "telephoto" }
statemachine = "com.freeletics.flowredux:compose:1.1.0" statemachine = "com.freeletics.flowredux:compose:1.1.0"
maplibre = "org.maplibre.gl:android-sdk:10.2.0" maplibre = "org.maplibre.gl:android-sdk:10.2.0"
maplibre_annotation = "org.maplibre.gl:android-plugin-annotation-v9:1.0.0" maplibre_annotation = "org.maplibre.gl:android-plugin-annotation-v9:2.0.0"
# Analytics # Analytics
posthog = "com.posthog.android:posthog:2.0.3" posthog = "com.posthog.android:posthog:2.0.3"

View file

@ -36,12 +36,12 @@ import io.element.android.libraries.matrix.api.timeline.MatrixTimeline
import io.element.android.libraries.matrix.api.timeline.item.event.EventType import io.element.android.libraries.matrix.api.timeline.item.event.EventType
import io.element.android.libraries.matrix.impl.core.toProgressWatcher import io.element.android.libraries.matrix.impl.core.toProgressWatcher
import io.element.android.libraries.matrix.impl.media.map import io.element.android.libraries.matrix.impl.media.map
import io.element.android.libraries.matrix.impl.media.sendAttachment
import io.element.android.libraries.matrix.impl.timeline.RustMatrixTimeline import io.element.android.libraries.matrix.impl.timeline.RustMatrixTimeline
import io.element.android.libraries.matrix.impl.timeline.timelineDiffFlow import io.element.android.libraries.matrix.impl.timeline.timelineDiffFlow
import io.element.android.services.toolbox.api.systemclock.SystemClock import io.element.android.services.toolbox.api.systemclock.SystemClock
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.cancel import kotlinx.coroutines.cancel
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow
@ -54,6 +54,7 @@ import org.matrix.rustcomponents.sdk.Room
import org.matrix.rustcomponents.sdk.RoomListItem import org.matrix.rustcomponents.sdk.RoomListItem
import org.matrix.rustcomponents.sdk.RoomMember import org.matrix.rustcomponents.sdk.RoomMember
import org.matrix.rustcomponents.sdk.RoomSubscription import org.matrix.rustcomponents.sdk.RoomSubscription
import org.matrix.rustcomponents.sdk.SendAttachmentJoinHandle
import org.matrix.rustcomponents.sdk.genTransactionId import org.matrix.rustcomponents.sdk.genTransactionId
import org.matrix.rustcomponents.sdk.messageEventContentFromMarkdown import org.matrix.rustcomponents.sdk.messageEventContentFromMarkdown
import timber.log.Timber import timber.log.Timber
@ -272,30 +273,26 @@ class RustMatrixRoom(
} }
} }
override suspend fun sendImage(file: File, thumbnailFile: File, imageInfo: ImageInfo, progressCallback: ProgressCallback?): Result<Unit> = withContext( override suspend fun sendImage(file: File, thumbnailFile: File, imageInfo: ImageInfo, progressCallback: ProgressCallback?): Result<Unit> {
coroutineDispatchers.io return sendAttachment {
) {
runCatching {
innerRoom.sendImage(file.path, thumbnailFile.path, imageInfo.map(), progressCallback?.toProgressWatcher()) innerRoom.sendImage(file.path, thumbnailFile.path, imageInfo.map(), progressCallback?.toProgressWatcher())
} }
} }
override suspend fun sendVideo(file: File, thumbnailFile: File, videoInfo: VideoInfo, progressCallback: ProgressCallback?): Result<Unit> = withContext( override suspend fun sendVideo(file: File, thumbnailFile: File, videoInfo: VideoInfo, progressCallback: ProgressCallback?): Result<Unit> {
coroutineDispatchers.io return sendAttachment {
) {
runCatching {
innerRoom.sendVideo(file.path, thumbnailFile.path, videoInfo.map(), progressCallback?.toProgressWatcher()) innerRoom.sendVideo(file.path, thumbnailFile.path, videoInfo.map(), progressCallback?.toProgressWatcher())
} }
} }
override suspend fun sendAudio(file: File, audioInfo: AudioInfo, progressCallback: ProgressCallback?): Result<Unit> = withContext(coroutineDispatchers.io) { override suspend fun sendAudio(file: File, audioInfo: AudioInfo, progressCallback: ProgressCallback?): Result<Unit> {
runCatching { return sendAttachment {
innerRoom.sendAudio(file.path, audioInfo.map(), progressCallback?.toProgressWatcher()) innerRoom.sendAudio(file.path, audioInfo.map(), progressCallback?.toProgressWatcher())
} }
} }
override suspend fun sendFile(file: File, fileInfo: FileInfo, progressCallback: ProgressCallback?): Result<Unit> = withContext(coroutineDispatchers.io) { override suspend fun sendFile(file: File, fileInfo: FileInfo, progressCallback: ProgressCallback?): Result<Unit> {
runCatching { return sendAttachment {
innerRoom.sendFile(file.path, fileInfo.map(), progressCallback?.toProgressWatcher()) innerRoom.sendFile(file.path, fileInfo.map(), progressCallback?.toProgressWatcher())
} }
} }
@ -372,12 +369,23 @@ class RustMatrixRoom(
} }
} }
//TODO expose inner parameters
override suspend fun sendLocation( override suspend fun sendLocation(
body: String, body: String,
geoUri: String geoUri: String
): Result<Unit> = withContext(coroutineDispatchers.io) { ): Result<Unit> = withContext(coroutineDispatchers.io) {
runCatching { runCatching {
innerRoom.sendLocation(body, geoUri, genTransactionId()) innerRoom.sendLocation(body, geoUri, null, null, null, genTransactionId())
} }
} }
} }
//TODO handle cancellation, need refactoring of how we are catching errors
private suspend fun sendAttachment(handle: () -> SendAttachmentJoinHandle): Result<Unit> {
return runCatching {
handle().use {
it.join()
}
}
}

View file

@ -157,7 +157,7 @@ fun TextComposer(
lineCount = it.lineCount lineCount = it.lineCount
}, },
textStyle = defaultTypography.copy(color = MaterialTheme.colorScheme.primary), textStyle = defaultTypography.copy(color = MaterialTheme.colorScheme.primary),
cursorBrush = SolidColor(ElementTheme.legacyColors.accentColor), cursorBrush = SolidColor(ElementTheme.colors.iconAccentTertiary),
decorationBox = { innerTextField -> decorationBox = { innerTextField ->
TextFieldDefaults.DecorationBox( TextFieldDefaults.DecorationBox(
value = text, value = text,

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:a6c78868580c86cf0ed3ed1a28504c15089dbf4c513d60da85fd9bc9231d71c1 oid sha256:7f83ded5e18878925de37a852facab7176d3eb399eca8c32779218ac720f1bab
size 17050 size 20577

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:34e9f585d22a81fbee6e060ad15649b6c03a765357c2eed467a28aac9f23656a oid sha256:050a3377cd74be85238b78bbe9de6afac59013c7398b5d7efc63a4d797a63e66
size 26008 size 29670

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:f875b974c7bbea2746b5482ef089a8dc8dbe95c50128a0a4dad426365a88602a oid sha256:277844f668695b4e9ddf3185bafcc02ac37f230ee03af0bdd9d97de538304e0e
size 28711 size 32227

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:b83485ac006d618b0b776ffebbbc3a9935b13667ebc3044c93cbb09a3e36f028 oid sha256:65c0df2a4f38440412c20cb65a1b59bbd8bbab73020c696cb9a974d031a95c7f
size 16482 size 20193

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:0f1aad6c1edbab3370c2b2e5f30f96815da2876ba558680234cd4cae24655351 oid sha256:a0dd6d5b32946d66729b5de3a64fb3b4e77a58c3d8ceae3d0d4843dda0cb3537
size 26009 size 29866

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:068d94d80dc5a978a4dd8fceef034cd86fc7aa14858d6f317142a58b36906652 oid sha256:d1783f7ae33151b8aed169c834225e3427bc4e1fa64ed00174a749e7431ab4ca
size 28718 size 32477

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:047cbed5744579aaf927330d8ae002bcbb0e44cd2a4f8c65a49d839d2f3fae8b oid sha256:76a516d4610c44cff470c8ed3dd4216eb4183a1eee37ddc2d1d50ac8388a6bf1
size 42712 size 44694

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:4d6247667a790a0a4189a69d78e29bb2dce28b8aeb45cad04347e09be61ccb23 oid sha256:7c68ad8932cac922061ae8579f7f5cca844370fba127de7580804b86aa365714
size 53728 size 55592

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:ca06ac3a11554302731d8c010c3f1098d19e35faa2747885d53abfb9b93e50eb oid sha256:0dc90137be2f7f1aa7b2ced587e0a539e33abe795260582ed418393aae6ec08c
size 56702 size 58578

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:420f2e78166e233502c80dd79e7ad21bee22a4fcc3146f35ed1a5f20b32c944a oid sha256:b933ae95db4865a86cac9196e91b99bb7768271a41d8bf37e69637434bb9bb4b
size 47289 size 49255

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:4fa23afdf2c26bbb6565586da3accb7d009ba208fe8ce9e8d2477e7789aef551 oid sha256:7c8b1af339d9f8c4a9e114523956688a48d3817f756f1e50cc63d4692de0336f
size 226350 size 228299

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:c7516873bcb2d770132773d1c40d7f592c343165647537e9673dece3a66f27d0 oid sha256:7c7e3c7431a8bb6c75892c0db3d5c1b61fbd233c9bb98f741a2a89c486d1f53f
size 227246 size 229208

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:d166f5d024011395077f16e6d85a3d60b19e393a469cc5273479761e4283de25 oid sha256:5233170b8312a919fbaefb43fdb1595a59d6fb044f2cbf2401ba42226bb84e7c
size 61952 size 63886

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:4ecfc99d5972e10766d0d9cecc85ca1f012450a38eafe33077ebaa2aaec65513 oid sha256:fd89b421b4bd74782f0d4c5a04df291077d5bea46b3bbf0b5962bc5c10bd0e0c
size 76993 size 78874

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:fcda324bbc41e69e5d88d35e09e527f3ad918f9c37131284e2da3b9daecb9c38 oid sha256:2812002d2aa0862b7bb71db095bde4c3a8ab5b70946609c906e253f0476489d2
size 171506 size 173384

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:7d9c2cabba5995b5bc5bfcbc9c2a081d8c2e1b8d86f24536b86c19348768e4c5 oid sha256:a7a1c89e89950526e65afa84a3ab60ff563cfee5a56977aacd2be6931bf36b40
size 44147 size 46101

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:fe9ea07c0ef2cbfb16d7735cca4872a307f370f7332c71a8fb44dfef3637a42a oid sha256:9e2b4f39df6359c7bb1d3ce8f146a13e36197f7e2303421a809c9aedf267cac7
size 55791 size 57650

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:498b25c2274b89f6421f80d6104684152480f88837bbd4844f05857240331116 oid sha256:374e99f565fa90cbd89c36081f372cf64af59341208a3ff32ca623727fdee9f2
size 40853 size 42850

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:5816e45f00625e5183fb1b0157bea4aff9e4a263c51c127a425a468dea87a23d oid sha256:49c2ab83ae91850a5047e5703e9f4f3675c551b215f2aca9bf02c3a0bde4b14a
size 43579 size 46151

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:230aaefe076912bba8cc5393db3850103a3f5fbb73dcf9b85fa2cf4700350165 oid sha256:1054f6cce57f6a5b73a9eddd819f374735b53864209f48a35fa3cb1010d5b3da
size 55763 size 58189

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:ae14fcc174d187290418462c0ea435eae75fcf60a925d5f1e17e18448bbaa92c oid sha256:b1e2e322dbb32e5f52fed4f00e50e6d97b6149f8d2b46344e07f6c1b5816dcde
size 58926 size 61344

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:9fcdf56aaddf7447f6df9d7a87773f7bc266df98fca0d9956c89d93b69eadff5 oid sha256:9c5018384f7783297a995d72c088903606b7d092407b7dbb4934b2a678271853
size 48937 size 51363

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:4c11077f0f1a7327e2362be30dd3438257639009fc2d047c81476d061c537996 oid sha256:cc0e157d9838459d7859dc8ce8e4cf85a0f83c056fd9d151ea5052145c591378
size 226283 size 228765

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:1387e65239463143a28249ac37c89c1a9dfa4cdc4e9261c0ab1e68604ddafbe4 oid sha256:e116bbf8dd5de0ab472368088bf3823010f34fe3fd5f168256365ccb983e8080
size 227235 size 229754

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:c9985113800d8789503c407df9a2eb0ca83869c432cba9014c5cfc250cfe36ec oid sha256:5844f1ef60404ba714b32294c99dd06cbdd35800ddc2758e35da654b2a2921ce
size 64239 size 66692

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:4f9ba6ae2cac88d442b4ec9ea2abbae901960275d017874b87656d5ee5525804 oid sha256:beae1875ccdce8390d3d237f5754f0aaa9fc8a0ee2e9bcc87ed9deff7602bd1e
size 81275 size 83688

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:d9434e4e7cd01ea5c241a631800348e79c1538344ee1525aba3bdd5b3dd5f300 oid sha256:b46199eec3d05a3ee13813c37dbb10bb8bf9d285a0bd349cda9f6956385fa5f5
size 359637 size 361988

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:60ef831750ebc9fd4bda3f3dc1895fe98e26def9b5aeca759a8ef26510a288e0 oid sha256:ebee6b6cf3756c5a4b861dd4fb4a142dd7a443faa8495a4b9c7dfa8cea3e3931
size 45299 size 47791

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:46ba4d82d26ecd969bdb14e36fcf27a9dff304565e092a36a603c01270a37552 oid sha256:b2403644534084159a0f4b49f3bac626927a2bc228ef8de0f94ade921202ec40
size 57772 size 60183

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:94ea618b4daaa7f6a1dda170357c31090104a3db12a675eaead30491cc9d16da oid sha256:d0a783c549f51974beebfdac4d3bf48d98de67c57e040a9120e6cb73ea4b1707
size 41599 size 44180

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:a782e808691e129bddaa202d8cbb92cb80e0021246f62fb52b272073e9a60b04 oid sha256:28894ec89a8f0d8b4ba2d4032e3f451d699c165d80cd0a6eea0367b4cde67d24
size 43595 size 45644

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:cd9cb3166a5edac332f11bf58c58e87c6c72bee0ef750376a2c076d9d87d0a33 oid sha256:f9f451aeb5991c6c89f50ac5579a5a67b731d2d0fe1378953c9f74c6ea94f186
size 45183 size 47234

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:02271b61eedc338cfae0dbc07693f24631f6f52f1d20ff34cbaff7c68c34a210 oid sha256:194f742f1ea4e15343656fad3acf25147e6fec367f14e2a0a26470df1f0b2443
size 43842 size 45838

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:66e05897e8233d39a7cb187bb3a0c962adf4eed7b287ff556567b718b5d24597 oid sha256:6e4af00485fddc3d8ecafbbdc2e08e8423816f7d5dbdfbb4fc0eba942a866a8e
size 46839 size 48659

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:74d3c9bf35257b8ae23820900cacb798e62618f78099456038b1af16d09fb908 oid sha256:977eb261b9658466904813bd6f238efb16b4a10d48a49780cc62bf15938e47d7
size 44219 size 45931

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:e9855ce12fe901460e8423de4516656bc7073055d04f57cd5be2f58ec61e932c oid sha256:6c1067095cd7f3990baf1a7018de2b5dc236bc2321c40a097a595492a501f806
size 44623 size 47221

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:a25cd3598f58c8335c344dc8e799f3dcbde880131a54da42ffc95803e8a8a431 oid sha256:52d0cc874c1ecfd6125c3666dc6f7dbf8a532a337e8a1d532e1c68a3febc3b75
size 46327 size 48870

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:fc925b7f26112db3b8bc0f9c5a1613025a5754249fa37414ca372c742341e132 oid sha256:ac63233b5b7e799cf1b393eb1225c680e07f44ad543ed545017649dfa56976a8
size 44935 size 47487

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:6ad56ce29bd30d075aa5331850452b9ef6c69512529e51c85609a7c60b850ea3 oid sha256:c832763a985e5df02c7a1071e910456639387a1edaf2074a5915310e98958ef0
size 47953 size 50294

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:3ba244c4ba15a21852caae07cb265339ace5c12f346d363c553bbdade246856d oid sha256:37597fd224de15ded08333a593a19e9b3ce20cde8a155907f9d9bfb9ecad2d07
size 45398 size 47091