diff --git a/core/designsystem/build.gradle.kts b/core/designsystem/build.gradle.kts index f4b3ed22..589e2760 100644 --- a/core/designsystem/build.gradle.kts +++ b/core/designsystem/build.gradle.kts @@ -52,4 +52,6 @@ dependencies { androidTestImplementation(platform(libs.androidx.compose.bom)) debugImplementation(libs.androidx.ui.tooling) debugImplementation(libs.androidx.ui.test.manifest) + + implementation(libs.lottie.compose) } \ No newline at end of file diff --git a/core/designsystem/src/main/java/com/goalpanzi/mission_mate/core/designsystem/component/LottieImage.kt b/core/designsystem/src/main/java/com/goalpanzi/mission_mate/core/designsystem/component/LottieImage.kt new file mode 100644 index 00000000..ac109415 --- /dev/null +++ b/core/designsystem/src/main/java/com/goalpanzi/mission_mate/core/designsystem/component/LottieImage.kt @@ -0,0 +1,24 @@ +package com.goalpanzi.mission_mate.core.designsystem.component + +import androidx.annotation.RawRes +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import com.airbnb.lottie.compose.LottieAnimation +import com.airbnb.lottie.compose.LottieCompositionSpec +import com.airbnb.lottie.compose.animateLottieCompositionAsState +import com.airbnb.lottie.compose.rememberLottieComposition + +@Composable +fun LottieImage( + @RawRes lottieRes : Int, + modifier: Modifier = Modifier +) { + val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(lottieRes)) + val progress by animateLottieCompositionAsState(composition) + LottieAnimation( + modifier = modifier, + composition = composition, + progress = { progress }, + ) +} \ No newline at end of file diff --git a/core/designsystem/src/main/res/raw/animation_celebration.json b/core/designsystem/src/main/res/raw/animation_celebration.json new file mode 100644 index 00000000..23444f15 --- /dev/null +++ b/core/designsystem/src/main/res/raw/animation_celebration.json @@ -0,0 +1 @@ +{"v":"5.6.6","fr":60,"ip":0,"op":141,"w":940,"h":752,"nm":"Explode_Export","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 6","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[187.5,368,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":1500,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Fill 94","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[-5.546,-348.328,0],"to":[0,15.417,0],"ti":[0,-30.417,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":34.15,"s":[-5.546,-255.828,0],"to":[0,30.417,0],"ti":[0,-25,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":70.928,"s":[-5.546,-165.828,0],"to":[0,25,0],"ti":[0,-30,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":102.451,"s":[-5.546,-105.828,0],"to":[0,30,0],"ti":[0,-61.667,0]},{"i":{"x":0.667,"y":0.407},"o":{"x":0.333,"y":0},"t":135.727,"s":[-5.546,14.172,0],"to":[0,40.458,0],"ti":[0,-59.475,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0.775},"t":153,"s":[-5.546,135.369,0],"to":[0,31.177,0],"ti":[0,-26.94,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":177,"s":[-5.546,264.172,0],"to":[0,78.333,0],"ti":[0,-53.333,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":204.027,"s":[-5.546,484.172,0],"to":[0,53.333,0],"ti":[13.333,-30,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":230.297,"s":[-5.546,584.172,0],"to":[-13.333,30,0],"ti":[13.333,-31.667,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":257.441,"s":[-85.546,664.172,0],"to":[-13.333,31.667,0],"ti":[0,-46.667,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":294.219,"s":[-85.546,774.172,0],"to":[0,46.667,0],"ti":[0,-46.667,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":348.51,"s":[-85.546,944.172,0],"to":[0,46.667,0],"ti":[0,-46.667,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":387.039,"s":[-85.546,1054.172,0],"to":[0,46.667,0],"ti":[0,-50,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":423.816,"s":[-85.546,1224.172,0],"to":[0,50,0],"ti":[0,-43.333,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":467.598,"s":[-85.546,1354.172,0],"to":[0,43.333,0],"ti":[0,-55,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":508.754,"s":[-85.546,1484.172,0],"to":[0,55,0],"ti":[0,-40,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":539.402,"s":[-85.546,1684.172,0],"to":[0,40,0],"ti":[0,-33.333,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":569.174,"s":[-85.546,1724.172,0],"to":[0,33.333,0],"ti":[15,-33.333,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":621.713,"s":[-85.546,1884.172,0],"to":[-15,33.333,0],"ti":[15,-21.667,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":661.992,"s":[-175.546,1924.172,0],"to":[-15,21.667,0],"ti":[0,-46.667,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":688.264,"s":[-175.546,2014.172,0],"to":[0,46.667,0],"ti":[0,-51.667,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":727.668,"s":[-175.546,2204.172,0],"to":[0,51.667,0],"ti":[0,-48.333,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":751.311,"s":[-175.546,2324.172,0],"to":[0,48.333,0],"ti":[0,-45,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":785.461,"s":[-175.546,2494.172,0],"to":[0,45,0],"ti":[-10,-28.333,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":809.979,"s":[-175.546,2594.172,0],"to":[10,28.333,0],"ti":[-10,-11.667,0]},{"t":838,"s":[-115.546,2664.172,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[65,65,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.01,0]],"o":[[0,0]],"v":[[4.118,-8.704]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-0.18,0.47],[0,0],[0,0],[0.41,0.34],[0,0],[0,0],[0.41,-0.29],[0,0],[0,0],[-0.13,-0.51],[0,0],[0,0],[-0.52,-0.01],[0,0]],"o":[[-0.29,-0.42],[0,0],[0,0],[-0.5,0.16],[0,0],[0,0],[-0.01,0.5],[0,0],[0,0],[0.5,0.17],[0,0],[0,0],[0.3,-0.41],[0,0],[0,0]],"v":[[11.007,-1.504],[10.837,-2.924],[15.087,-14.204],[3.887,-10.584],[2.427,-10.864],[-6.643,-18.204],[-7.023,-6.144],[-7.703,-4.894],[-17.643,1.886],[-6.603,5.666],[-5.593,6.756],[-2.633,18.206],[4.547,8.566],[5.847,7.936],[17.647,8.326]],"c":true},"ix":2},"nm":"Path 7","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.97647100687,0.776471018791,0.02352900058,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":0,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":38.527,"s":[-101,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":84.062,"s":[-101,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":137.477,"s":[100,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":181.26,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":226.793,"s":[104,0]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":261.82,"s":[104,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":295.971,"s":[104,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":329.246,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":363.396,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":404.551,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":441.328,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":480.734,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":510.506,"s":[-100,0]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":538.525,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":573.553,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":603.324,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":636.6,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":662.869,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":692.641,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":725.916,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":753.061,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":783.709,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":816.107,"s":[100,-100]},{"t":838,"s":[-100,-100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":236.428,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":431.697,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":612.957,"s":[15]},{"t":838,"s":[25]}],"ix":4},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":838,"s":[5760]}],"ix":5},"nm":"Transform"}],"nm":"Fill 17","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":3,"nm":"Null 3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[0,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":98.949,"s":[120,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":183.887,"s":[0,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":259.193,"s":[240,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":339.754,"s":[40,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":373.029,"s":[160,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":416.811,"s":[0,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":491.242,"s":[160,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":514.883,"s":[80,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":573.553,"s":[240,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":629.594,"s":[160,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":661.994,"s":[280,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":710.154,"s":[0,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":753.938,"s":[200,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":784.586,"s":[280,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"t":838,"s":[-40,-14,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":1549,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 6","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[187.5,368,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":1500,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Fill 97","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.562,"y":1},"o":{"x":0.198,"y":0},"t":0,"s":[-148.874,-341.028,0],"to":[0,24.201,0],"ti":[0,-48.268,0]},{"i":{"x":0.653,"y":1},"o":{"x":0.31,"y":0},"t":34,"s":[-178.874,-229.131,0],"to":[0,26.371,0],"ti":[0,-30.606,0]},{"i":{"x":0.676,"y":1},"o":{"x":0.335,"y":0},"t":67.422,"s":[-208.874,-143.145,0],"to":[0,30.58,0],"ti":[0,-32.729,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.356,"y":0},"t":96.736,"s":[-208.874,-47.662,0],"to":[0,47.125,0],"ti":[0,-46.326,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.44,"y":0},"t":131.211,"s":[-208.874,94.065,0],"to":[0,111.388,0],"ti":[0,-45.734,0]},{"i":{"x":0.544,"y":0.637},"o":{"x":0.196,"y":0},"t":185,"s":[-178.874,351.302,0],"to":[0,14.751,0],"ti":[7.083,-74.622,0]},{"i":{"x":0.636,"y":1},"o":{"x":0.3,"y":0.265},"t":215,"s":[-116.508,489.887,0],"to":[-1.475,15.536,0],"ti":[0,-17.658,0]},{"i":{"x":0.488,"y":1},"o":{"x":0.167,"y":0},"t":237.93,"s":[-208.874,539.719,0],"to":[0,40.921,0],"ti":[0,-50.858,0]},{"i":{"x":0.595,"y":1},"o":{"x":0.372,"y":0},"t":276.418,"s":[-208.874,677.896,0],"to":[0,57.581,0],"ti":[0,-67.539,0]},{"i":{"x":0.68,"y":1},"o":{"x":0.366,"y":0},"t":328.902,"s":[-208.874,866.313,0],"to":[0,52.132,0],"ti":[0,-56.507,0]},{"i":{"x":0.737,"y":1},"o":{"x":0.292,"y":0},"t":377.889,"s":[-208.874,1029.61,0],"to":[0,56.974,0],"ti":[0,-60.036,0]},{"i":{"x":0.614,"y":0.63},"o":{"x":0.206,"y":0},"t":428.621,"s":[-208.874,1205.472,0],"to":[0,44.588,0],"ti":[0,-45.608,0]},{"i":{"x":0.76,"y":1},"o":{"x":0.388,"y":0.423},"t":465,"s":[-118.874,1340.909,0],"to":[0,26.971,0],"ti":[0,-27.169,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.522,"y":0},"t":490.729,"s":[-178.874,1422.148,0],"to":[0,54.309,0],"ti":[0,-54.395,0]},{"i":{"x":0.586,"y":1},"o":{"x":0.167,"y":0},"t":533.592,"s":[-208.874,1585.44,0],"to":[0,65.449,0],"ti":[0,-64.072,0]},{"i":{"x":0.236,"y":1},"o":{"x":0.167,"y":0},"t":586.949,"s":[-208.874,1780.132,0],"to":[0,58.702,0],"ti":[0,-56.228,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":641.184,"s":[-208.874,1952.841,0],"to":[0,69.785,0],"ti":[0,-63.798,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.685,"y":0},"t":689.295,"s":[-208.874,2153.817,0],"to":[0,55.302,0],"ti":[0,-49.112,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":735.654,"s":[-208.874,2310.83,0],"to":[0,57.546,0],"ti":[0,-46.707,0]},{"i":{"x":0.511,"y":1},"o":{"x":0.281,"y":0},"t":781,"s":[-148.874,2467.84,0],"to":[0,28.636,0],"ti":[0,-13.385,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":809,"s":[-178.874,2590.308,0],"to":[0,63.954,0],"ti":[0,0,0]},{"t":838,"s":[-208.874,2690.802,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[65,65,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.722,-2.013],[-0.688,5.385],[3.87,2.274],[0.581,-5.397]],"o":[[3.92,1.671],[0.662,-5.187],[-4.388,-2.579],[-0.514,4.772]],"v":[[-5.961,4.675],[3.474,-2.806],[-2.929,-16.147],[-13.338,-9.733]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9176470588235294,0,0.2627450980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":0,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":34,"s":[-100,0]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":66,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":106,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":140,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":178,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":208,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":242,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":280,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":311,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":346,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":383,"s":[100,-100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":408,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":453,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":497,"s":[-101,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":549,"s":[-101,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":610,"s":[100,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":660,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":712,"s":[104,0]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":752,"s":[104,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":791,"s":[104,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":829,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":868,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":915,"s":[100,-100]},{"t":957,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":102,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":750,"s":[25]},{"t":957,"s":[25]}],"ix":4},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":957,"s":[5760]}],"ix":5},"nm":"Transform"}],"nm":"Fill 91","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":982,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":3,"nm":"Null 3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[0,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":111.229,"s":[120,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":206.707,"s":[0,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":291.361,"s":[240,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":381.92,"s":[40,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":419.324,"s":[160,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":468.539,"s":[0,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":552.207,"s":[160,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":578.783,"s":[80,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":644.734,"s":[240,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":707.729,"s":[160,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":744.15,"s":[280,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":798.287,"s":[0,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":847.506,"s":[200,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":881.957,"s":[280,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"t":942,"s":[-40,-14,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":1549,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":3,"nm":"Null 3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[0,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":98.949,"s":[120,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":183.887,"s":[0,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":259.193,"s":[240,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":339.754,"s":[40,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":373.029,"s":[160,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":416.811,"s":[0,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":491.242,"s":[160,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":514.883,"s":[80,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":573.553,"s":[240,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":629.594,"s":[160,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":661.994,"s":[280,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":710.154,"s":[0,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":753.938,"s":[200,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":784.586,"s":[280,-14,0],"to":[0,0,0],"ti":[0,0,0]},{"t":838,"s":[-40,-14,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":1549,"st":0,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Fill 96","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.562,"y":1},"o":{"x":0.198,"y":0},"t":0,"s":[202.626,13.222,0],"to":[0,24.201,0],"ti":[0,-48.268,0]},{"i":{"x":0.653,"y":1},"o":{"x":0.31,"y":0},"t":34,"s":[172.626,125.119,0],"to":[0,26.371,0],"ti":[0,-30.606,0]},{"i":{"x":0.676,"y":1},"o":{"x":0.335,"y":0},"t":67.422,"s":[142.626,211.105,0],"to":[0,30.58,0],"ti":[0,-32.729,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.356,"y":0},"t":96.736,"s":[142.626,306.588,0],"to":[0,47.125,0],"ti":[0,-46.326,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.44,"y":0},"t":131.211,"s":[142.626,448.315,0],"to":[0,111.388,0],"ti":[0,-45.734,0]},{"i":{"x":0.544,"y":0.637},"o":{"x":0.196,"y":0},"t":185,"s":[172.626,705.552,0],"to":[0,14.751,0],"ti":[7.083,-74.622,0]},{"i":{"x":0.636,"y":1},"o":{"x":0.3,"y":0.265},"t":215,"s":[234.992,844.137,0],"to":[-1.475,15.536,0],"ti":[0,-17.658,0]},{"i":{"x":0.488,"y":1},"o":{"x":0.167,"y":0},"t":237.93,"s":[142.626,893.969,0],"to":[0,40.921,0],"ti":[0,-50.858,0]},{"i":{"x":0.595,"y":1},"o":{"x":0.372,"y":0},"t":276.418,"s":[142.626,1032.146,0],"to":[0,57.581,0],"ti":[0,-67.539,0]},{"i":{"x":0.68,"y":1},"o":{"x":0.366,"y":0},"t":328.902,"s":[142.626,1220.563,0],"to":[0,52.132,0],"ti":[0,-56.507,0]},{"i":{"x":0.737,"y":1},"o":{"x":0.292,"y":0},"t":377.889,"s":[142.626,1383.86,0],"to":[0,56.974,0],"ti":[0,-60.036,0]},{"i":{"x":0.614,"y":0.63},"o":{"x":0.206,"y":0},"t":428.621,"s":[142.626,1559.722,0],"to":[0,44.588,0],"ti":[0,-45.608,0]},{"i":{"x":0.76,"y":1},"o":{"x":0.388,"y":0.423},"t":465,"s":[232.626,1695.159,0],"to":[0,26.971,0],"ti":[0,-27.169,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.522,"y":0},"t":490.729,"s":[172.626,1776.398,0],"to":[0,54.309,0],"ti":[0,-54.395,0]},{"i":{"x":0.586,"y":1},"o":{"x":0.167,"y":0},"t":533.592,"s":[142.626,1939.69,0],"to":[0,65.449,0],"ti":[0,-64.072,0]},{"i":{"x":0.236,"y":1},"o":{"x":0.167,"y":0},"t":586.949,"s":[142.626,2134.382,0],"to":[0,58.702,0],"ti":[0,-56.228,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":641.184,"s":[142.626,2307.091,0],"to":[0,69.785,0],"ti":[0,-63.798,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.685,"y":0},"t":689.295,"s":[142.626,2508.067,0],"to":[0,55.302,0],"ti":[0,-49.112,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":735.654,"s":[142.626,2665.08,0],"to":[0,57.546,0],"ti":[0,-46.707,0]},{"i":{"x":0.511,"y":1},"o":{"x":0.281,"y":0},"t":781,"s":[202.626,2822.09,0],"to":[0,28.636,0],"ti":[0,-13.385,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":809,"s":[172.626,2944.558,0],"to":[0,63.954,0],"ti":[0,0,0]},{"t":838,"s":[142.626,3045.052,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[65,65,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-9.584,3.802],[9.734,-6.562],[5.318,-19.023],[-14.005,-8.222]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9176470588235294,0,0.2627450980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":0,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":34,"s":[-100,0]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":66,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":106,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":140,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":178,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":208,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":242,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":280,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":311,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":346,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":383,"s":[100,-100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":408,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":453,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":497,"s":[-101,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":549,"s":[-101,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":610,"s":[100,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":660,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":712,"s":[104,0]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":752,"s":[104,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":791,"s":[104,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":829,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":868,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":915,"s":[100,-100]},{"t":957,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":102,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":750,"s":[25]},{"t":957,"s":[25]}],"ix":4},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":957,"s":[5760]}],"ix":5},"nm":"Transform"}],"nm":"Fill 91","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":982,"st":0,"bm":0}]},{"id":"comp_3","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Fill 95","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.562,"y":1},"o":{"x":0.198,"y":0},"t":0,"s":[202.626,13.222,0],"to":[0,24.201,0],"ti":[0,-48.268,0]},{"i":{"x":0.653,"y":1},"o":{"x":0.31,"y":0},"t":34,"s":[172.626,125.119,0],"to":[0,26.371,0],"ti":[0,-30.606,0]},{"i":{"x":0.676,"y":1},"o":{"x":0.335,"y":0},"t":67.422,"s":[142.626,211.105,0],"to":[0,30.58,0],"ti":[0,-32.729,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.356,"y":0},"t":96.736,"s":[142.626,306.588,0],"to":[0,47.125,0],"ti":[0,-46.326,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.44,"y":0},"t":131.211,"s":[142.626,448.315,0],"to":[0,111.388,0],"ti":[0,-45.734,0]},{"i":{"x":0.544,"y":0.637},"o":{"x":0.196,"y":0},"t":185,"s":[172.626,705.552,0],"to":[0,14.751,0],"ti":[7.083,-74.622,0]},{"i":{"x":0.636,"y":1},"o":{"x":0.3,"y":0.265},"t":215,"s":[234.992,844.137,0],"to":[-1.475,15.536,0],"ti":[0,-17.658,0]},{"i":{"x":0.488,"y":1},"o":{"x":0.167,"y":0},"t":237.93,"s":[142.626,893.969,0],"to":[0,40.921,0],"ti":[0,-50.858,0]},{"i":{"x":0.595,"y":1},"o":{"x":0.372,"y":0},"t":276.418,"s":[142.626,1032.146,0],"to":[0,57.581,0],"ti":[0,-67.539,0]},{"i":{"x":0.68,"y":1},"o":{"x":0.366,"y":0},"t":328.902,"s":[142.626,1220.563,0],"to":[0,52.132,0],"ti":[0,-56.507,0]},{"i":{"x":0.737,"y":1},"o":{"x":0.292,"y":0},"t":377.889,"s":[142.626,1383.86,0],"to":[0,56.974,0],"ti":[0,-60.036,0]},{"i":{"x":0.614,"y":0.63},"o":{"x":0.206,"y":0},"t":428.621,"s":[142.626,1559.722,0],"to":[0,44.588,0],"ti":[0,-45.608,0]},{"i":{"x":0.76,"y":1},"o":{"x":0.388,"y":0.423},"t":465,"s":[232.626,1695.159,0],"to":[0,26.971,0],"ti":[0,-27.169,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.522,"y":0},"t":490.729,"s":[172.626,1776.398,0],"to":[0,54.309,0],"ti":[0,-54.395,0]},{"i":{"x":0.586,"y":1},"o":{"x":0.167,"y":0},"t":533.592,"s":[142.626,1939.69,0],"to":[0,65.449,0],"ti":[0,-64.072,0]},{"i":{"x":0.236,"y":1},"o":{"x":0.167,"y":0},"t":586.949,"s":[142.626,2134.382,0],"to":[0,58.702,0],"ti":[0,-56.228,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":641.184,"s":[142.626,2307.091,0],"to":[0,69.785,0],"ti":[0,-63.798,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.685,"y":0},"t":689.295,"s":[142.626,2508.067,0],"to":[0,55.302,0],"ti":[0,-49.112,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":735.654,"s":[142.626,2665.08,0],"to":[0,57.546,0],"ti":[0,-46.707,0]},{"i":{"x":0.511,"y":1},"o":{"x":0.281,"y":0},"t":781,"s":[202.626,2822.09,0],"to":[0,28.636,0],"ti":[0,-13.385,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":809,"s":[172.626,2944.558,0],"to":[0,63.954,0],"ti":[0,0,0]},{"t":838,"s":[142.626,3045.052,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[65,65,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.155,7.985],[11.583,-1.952],[5.318,-19.023],[-10.536,-10.298]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.8274509803921568,0.5725490196078431,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":0,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":34,"s":[-100,0]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":66,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":106,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":140,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":178,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":208,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":242,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":280,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":311,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":346,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":383,"s":[100,-100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":408,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":453,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":497,"s":[-101,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":549,"s":[-101,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":610,"s":[100,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":660,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":712,"s":[104,0]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":752,"s":[104,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":791,"s":[104,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":829,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":868,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":915,"s":[100,-100]},{"t":957,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":102,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":750,"s":[25]},{"t":957,"s":[25]}],"ix":4},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":957,"s":[5760]}],"ix":5},"nm":"Transform"}],"nm":"Fill 91","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":982,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Null 3","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[187.5,354,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":111.229,"s":[307.5,354,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":206.707,"s":[187.5,354,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":291.361,"s":[427.5,354,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":381.92,"s":[227.5,354,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":419.324,"s":[347.5,354,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":468.539,"s":[187.5,354,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":552.207,"s":[347.5,354,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":578.783,"s":[267.5,354,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":644.734,"s":[427.5,354,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":707.729,"s":[347.5,354,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":744.15,"s":[467.5,354,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":798.287,"s":[187.5,354,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":847.506,"s":[387.5,354,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":881.957,"s":[467.5,354,0],"to":[0,0,0],"ti":[0,0,0]},{"t":942,"s":[147.5,354,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":1549,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"Star 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":-2,"s":[468.954,392.843,0],"to":[24.333,-78.833,0],"ti":[-100.333,-67.167,0]},{"t":55,"s":[782.954,309.843,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[65,65,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.18,0.47],[0,0],[0,0],[0.41,0.34],[0,0],[0,0],[0.41,-0.29],[0,0],[0,0],[-0.13,-0.51],[0,0],[0,0],[-0.52,-0.01],[0,0]],"o":[[-0.29,-0.42],[0,0],[0,0],[-0.5,0.16],[0,0],[0,0],[-0.01,0.5],[0,0],[0,0],[0.5,0.17],[0,0],[0,0],[0.3,-0.41],[0,0],[0,0]],"v":[[11.007,-1.504],[10.837,-2.924],[15.087,-14.204],[3.887,-10.584],[2.427,-10.864],[-6.643,-18.204],[-7.023,-6.144],[-7.703,-4.894],[-17.643,1.886],[-6.603,5.666],[-5.593,6.756],[-2.633,18.206],[4.547,8.566],[5.847,7.936],[17.647,8.326]],"c":true},"ix":2},"nm":"Path 7","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.97647100687,0.776471018791,0.02352900058,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-99,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-55,"s":[-101,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-3,"s":[-101,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":58,"s":[100,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":108,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":160,"s":[104,0]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":200,"s":[104,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":239,"s":[104,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":277,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":316,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":363,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":405,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":450,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":484,"s":[-100,0]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":516,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":556,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":590,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":628,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":658,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":692,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":730,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":761,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":796,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":833,"s":[100,-100]},{"t":858,"s":[-100,-100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-99,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":171,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":394,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":601,"s":[15]},{"t":858,"s":[25]}],"ix":4},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-99,"s":[0]},{"t":858,"s":[5760]}],"ix":5},"nm":"Transform"}],"nm":"Fill 17","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":8,"st":-6,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"Star","refId":"comp_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":110,"s":[100]},{"t":140,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[538,662,0],"to":[35,0,0],"ti":[-35,0,0]},{"t":27,"s":[748,662,0]}],"ix":2},"a":{"a":0,"k":[187.5,1500,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":375,"h":3000,"ip":8,"op":141,"st":-284,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Star 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":-2,"s":[466.954,395.843,0],"to":[-15.333,-186.5,0],"ti":[2.333,-186.5,0]},{"t":55,"s":[125.954,342.843,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[65,65,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.18,0.47],[0,0],[0,0],[0.41,0.34],[0,0],[0,0],[0.41,-0.29],[0,0],[0,0],[-0.13,-0.51],[0,0],[0,0],[-0.52,-0.01],[0,0]],"o":[[-0.29,-0.42],[0,0],[0,0],[-0.5,0.16],[0,0],[0,0],[-0.01,0.5],[0,0],[0,0],[0.5,0.17],[0,0],[0,0],[0.3,-0.41],[0,0],[0,0]],"v":[[11.007,-1.504],[10.837,-2.924],[15.087,-14.204],[3.887,-10.584],[2.427,-10.864],[-6.643,-18.204],[-7.023,-6.144],[-7.703,-4.894],[-17.643,1.886],[-6.603,5.666],[-5.593,6.756],[-2.633,18.206],[4.547,8.566],[5.847,7.936],[17.647,8.326]],"c":true},"ix":2},"nm":"Path 7","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.97647100687,0.776471018791,0.02352900058,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-346,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-302,"s":[-101,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-250,"s":[-101,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":-189,"s":[100,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":-139,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-87,"s":[104,0]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-47,"s":[104,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-8,"s":[104,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":30,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":69,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":116,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":158,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":203,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":237,"s":[-100,0]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":269,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":309,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":343,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":381,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":411,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":445,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":483,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":514,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":549,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":586,"s":[100,-100]},{"t":611,"s":[-100,-100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-346,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-76,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":147,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":354,"s":[15]},{"t":611,"s":[25]}],"ix":4},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-346,"s":[0]},{"t":611,"s":[5760]}],"ix":5},"nm":"Transform"}],"nm":"Fill 17","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":14,"st":-6,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Star","refId":"comp_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":110,"s":[100]},{"t":140,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[204.818,543,0],"ix":2},"a":{"a":0,"k":[187.5,1500,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":375,"h":3000,"ip":14,"op":141,"st":-303,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Star 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":-2,"s":[464.954,392.843,0],"to":[8.5,-240.5,0],"ti":[-5.5,-140.5,0]},{"t":55,"s":[551.954,233.843,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[65,65,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.18,0.47],[0,0],[0,0],[0.41,0.34],[0,0],[0,0],[0.41,-0.29],[0,0],[0,0],[-0.13,-0.51],[0,0],[0,0],[-0.52,-0.01],[0,0]],"o":[[-0.29,-0.42],[0,0],[0,0],[-0.5,0.16],[0,0],[0,0],[-0.01,0.5],[0,0],[0,0],[0.5,0.17],[0,0],[0,0],[0.3,-0.41],[0,0],[0,0]],"v":[[11.007,-1.504],[10.837,-2.924],[15.087,-14.204],[3.887,-10.584],[2.427,-10.864],[-6.643,-18.204],[-7.023,-6.144],[-7.703,-4.894],[-17.643,1.886],[-6.603,5.666],[-5.593,6.756],[-2.633,18.206],[4.547,8.566],[5.847,7.936],[17.647,8.326]],"c":true},"ix":2},"nm":"Path 7","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.97647100687,0.776471018791,0.02352900058,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-421,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-377,"s":[-101,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-325,"s":[-101,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":-264,"s":[100,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":-214,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-162,"s":[104,0]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-122,"s":[104,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-83,"s":[104,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-45,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":-6,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":41,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":83,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":128,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":162,"s":[-100,0]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":194,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":234,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":268,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":306,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":336,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":370,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":408,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":439,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":474,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":511,"s":[100,-100]},{"t":536,"s":[-100,-100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-421,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-151,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":72,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":279,"s":[15]},{"t":536,"s":[25]}],"ix":4},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-421,"s":[0]},{"t":536,"s":[5760]}],"ix":5},"nm":"Transform"}],"nm":"Fill 17","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":36,"st":-6,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Star","refId":"comp_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":110,"s":[100]},{"t":140,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[518.5,-301,0],"to":[-10,0,0],"ti":[10,0,0]},{"t":61,"s":[458.5,-301,0]}],"ix":2},"a":{"a":0,"k":[187.5,1500,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":375,"h":3000,"ip":36,"op":141,"st":-499,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":-2,"s":[466.954,395.843,0],"to":[-12.833,-251.833,0],"ti":[1.833,-151.167,0]},{"t":55,"s":[251.954,192.843,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[65,65,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.18,0.47],[0,0],[0,0],[0.41,0.34],[0,0],[0,0],[0.41,-0.29],[0,0],[0,0],[-0.13,-0.51],[0,0],[0,0],[-0.52,-0.01],[0,0]],"o":[[-0.29,-0.42],[0,0],[0,0],[-0.5,0.16],[0,0],[0,0],[-0.01,0.5],[0,0],[0,0],[0.5,0.17],[0,0],[0,0],[0.3,-0.41],[0,0],[0,0]],"v":[[11.007,-1.504],[10.837,-2.924],[15.087,-14.204],[3.887,-10.584],[2.427,-10.864],[-6.643,-18.204],[-7.023,-6.144],[-7.703,-4.894],[-17.643,1.886],[-6.603,5.666],[-5.593,6.756],[-2.633,18.206],[4.547,8.566],[5.847,7.936],[17.647,8.326]],"c":true},"ix":2},"nm":"Path 7","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.97647100687,0.776471018791,0.02352900058,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-142,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-98,"s":[-101,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-46,"s":[-101,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":15,"s":[100,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":65,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":117,"s":[104,0]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":157,"s":[104,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":196,"s":[104,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":234,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":273,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":320,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":362,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":407,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":441,"s":[-100,0]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":473,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":513,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":547,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":585,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":615,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":649,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":687,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":718,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":753,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":790,"s":[100,-100]},{"t":815,"s":[-100,-100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-142,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":128,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":351,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":558,"s":[15]},{"t":815,"s":[25]}],"ix":4},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-142,"s":[0]},{"t":815,"s":[5760]}],"ix":5},"nm":"Transform"}],"nm":"Fill 17","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":29,"st":-6,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"Star","refId":"comp_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":110,"s":[100]},{"t":140,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[170,1319,0],"ix":2},"a":{"a":0,"k":[187.5,1500,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":375,"h":3000,"ip":29,"op":141,"st":-96,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Circle 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":-2,"s":[461.681,401.958,0],"to":[12.333,-218.667,0],"ti":[-2.333,-103.333,0]},{"t":55,"s":[680.681,240.958,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[65,65,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.722,-2.013],[-0.688,5.385],[3.87,2.274],[0.581,-5.397]],"o":[[3.92,1.671],[0.662,-5.187],[-4.388,-2.579],[-0.514,4.772]],"v":[[-5.961,4.675],[3.474,-2.806],[-2.929,-16.147],[-13.338,-9.733]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9176470588235294,0,0.2627450980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-600,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-566,"s":[-100,0]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-534,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-494,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-460,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-422,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-392,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-358,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-320,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-289,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-254,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-217,"s":[100,-100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":-192,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-147,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-103,"s":[-101,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-51,"s":[-101,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":10,"s":[100,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":60,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":112,"s":[104,0]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":152,"s":[104,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":191,"s":[104,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":229,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":268,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":315,"s":[100,-100]},{"t":357,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-600,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-498,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-217,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":150,"s":[25]},{"t":357,"s":[25]}],"ix":4},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-600,"s":[0]},{"t":357,"s":[5760]}],"ix":5},"nm":"Transform"}],"nm":"Fill 91","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":28,"st":-6,"bm":0},{"ddd":0,"ind":11,"ty":0,"nm":"Dot","refId":"comp_1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":110,"s":[100]},{"t":140,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[796.5,1218.75,0],"ix":2},"a":{"a":0,"k":[187.5,1500,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":375,"h":3000,"ip":28,"op":141,"st":-123,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Circle 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":-2,"s":[465.681,404.958,0],"to":[-3.667,-183.333,0],"ti":[4.667,-176.667,0]},{"t":55,"s":[230.681,260.958,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[65,65,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.722,-2.013],[-0.688,5.385],[3.87,2.274],[0.581,-5.397]],"o":[[3.92,1.671],[0.662,-5.187],[-4.388,-2.579],[-0.514,4.772]],"v":[[-5.961,4.675],[3.474,-2.806],[-2.929,-16.147],[-13.338,-9.733]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9176470588235294,0,0.2627450980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-353,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-319,"s":[-100,0]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-287,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-247,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-213,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-175,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-145,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-111,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-73,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-42,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-7,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":30,"s":[100,-100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":55,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":100,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":144,"s":[-101,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":196,"s":[-101,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":257,"s":[100,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":307,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":359,"s":[104,0]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":399,"s":[104,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":438,"s":[104,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":476,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":515,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":562,"s":[100,-100]},{"t":604,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-353,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-251,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":397,"s":[25]},{"t":604,"s":[25]}],"ix":4},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-353,"s":[0]},{"t":604,"s":[5760]}],"ix":5},"nm":"Transform"}],"nm":"Fill 91","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":31,"st":-6,"bm":0},{"ddd":0,"ind":13,"ty":0,"nm":"Dot","refId":"comp_1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":110,"s":[100]},{"t":140,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[384,844,0],"ix":2},"a":{"a":0,"k":[187.5,1500,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":375,"h":3000,"ip":30,"op":141,"st":-203,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Circle","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":-2,"s":[466.681,399.958,0],"to":[-12.833,-34.833,0],"ti":[20.667,-158,0]},{"t":55,"s":[389.681,190.958,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[65,65,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.722,-2.013],[-0.688,5.385],[3.87,2.274],[0.581,-5.397]],"o":[[3.92,1.671],[0.662,-5.187],[-4.388,-2.579],[-0.514,4.772]],"v":[[-5.961,4.675],[3.474,-2.806],[-2.929,-16.147],[-13.338,-9.733]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9176470588235294,0,0.2627450980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-368,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-334,"s":[-100,0]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-302,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-262,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-228,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-190,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-160,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-126,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-88,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-57,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-22,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":15,"s":[100,-100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":40,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":85,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":129,"s":[-101,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":181,"s":[-101,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":242,"s":[100,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":292,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":344,"s":[104,0]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":384,"s":[104,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":423,"s":[104,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":461,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":500,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":547,"s":[100,-100]},{"t":589,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-368,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-266,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":382,"s":[25]},{"t":589,"s":[25]}],"ix":4},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-368,"s":[0]},{"t":589,"s":[5760]}],"ix":5},"nm":"Transform"}],"nm":"Fill 91","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":-6,"bm":0},{"ddd":0,"ind":15,"ty":0,"nm":"Dot","refId":"comp_1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":110,"s":[100]},{"t":140,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[529.5,1448,0],"ix":2},"a":{"a":0,"k":[187.5,1500,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":375,"h":3000,"ip":25,"op":141,"st":-38,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Rectangle 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":-2,"s":[457.681,392.958,0],"to":[4.5,-184.833,0],"ti":[-1.5,-100.167,0]},{"t":55,"s":[616.681,165.958,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[65,65,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-9.584,3.802],[9.734,-6.562],[5.318,-19.023],[-14.005,-8.222]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9176470588235294,0,0.2627450980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-199,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-165,"s":[-100,0]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-133,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-93,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-59,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-21,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":9,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":43,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":81,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":112,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":147,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":184,"s":[100,-100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":209,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":254,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":298,"s":[-101,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":350,"s":[-101,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":411,"s":[100,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":461,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":513,"s":[104,0]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":553,"s":[104,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":592,"s":[104,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":630,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":669,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":716,"s":[100,-100]},{"t":758,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-199,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-97,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":184,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":551,"s":[25]},{"t":758,"s":[25]}],"ix":4},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-199,"s":[0]},{"t":758,"s":[5760]}],"ix":5},"nm":"Transform"}],"nm":"Fill 91","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42,"st":-6,"bm":0},{"ddd":0,"ind":17,"ty":0,"nm":"Rectangle","refId":"comp_2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":110,"s":[100]},{"t":140,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[625.5,971.75,0],"ix":2},"a":{"a":0,"k":[187.5,1500,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":375,"h":3000,"ip":42,"op":141,"st":-140,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Rectangle 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":-2,"s":[461.681,401.958,0],"to":[-3,-192.5,0],"ti":[8,-141.5,0]},{"t":55,"s":[191.681,218.958,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[65,65,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-9.584,3.802],[9.734,-6.562],[5.318,-19.023],[-14.005,-8.222]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9176470588235294,0,0.2627450980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-167,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-133,"s":[-100,0]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-101,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-61,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-27,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":11,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":41,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":75,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":113,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":144,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":179,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":216,"s":[100,-100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":241,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":286,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":330,"s":[-101,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":382,"s":[-101,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":443,"s":[100,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":493,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":545,"s":[104,0]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":585,"s":[104,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":624,"s":[104,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":662,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":701,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":748,"s":[100,-100]},{"t":790,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-167,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-65,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":216,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":583,"s":[25]},{"t":790,"s":[25]}],"ix":4},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-167,"s":[0]},{"t":790,"s":[5760]}],"ix":5},"nm":"Transform"}],"nm":"Fill 91","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":33,"st":-6,"bm":0},{"ddd":0,"ind":19,"ty":0,"nm":"Rectangle","refId":"comp_2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":110,"s":[100]},{"t":140,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[241.5,1235.25,0],"ix":2},"a":{"a":0,"k":[187.5,1500,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":375,"h":3000,"ip":33,"op":141,"st":-107,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Rectangle 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":-2,"s":[462.681,406.958,0],"to":[5.833,-282.167,0],"ti":[-3.833,-109.833,0]},{"t":55,"s":[491.681,165.958,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[65,65,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-9.584,3.802],[9.734,-6.562],[5.318,-19.023],[-14.005,-8.222]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9176470588235294,0,0.2627450980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-6,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":28,"s":[-100,0]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":60,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":100,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":134,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":172,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":202,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":236,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":274,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":305,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":340,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":377,"s":[100,-100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":402,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":447,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":491,"s":[-101,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":543,"s":[-101,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":604,"s":[100,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":654,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":706,"s":[104,0]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":746,"s":[104,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":785,"s":[104,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":823,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":862,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":909,"s":[100,-100]},{"t":951,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-6,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":96,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":377,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":744,"s":[25]},{"t":951,"s":[25]}],"ix":4},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-6,"s":[0]},{"t":951,"s":[5760]}],"ix":5},"nm":"Transform"}],"nm":"Fill 91","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":26,"st":-6,"bm":0},{"ddd":0,"ind":21,"ty":0,"nm":"Rectangle","refId":"comp_2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":110,"s":[100]},{"t":140,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[537,1208.25,0],"ix":2},"a":{"a":0,"k":[187.5,1500,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":375,"h":3000,"ip":26,"op":141,"st":-96,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"Rectangle","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":-2,"s":[462.681,407.958,0],"to":[7.333,-130.667,0],"ti":[-0.333,-144.333,0]},{"t":55,"s":[722.681,211.958,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[65,65,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-9.584,3.802],[9.734,-6.562],[5.318,-19.023],[-14.005,-8.222]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9176470588235294,0,0.2627450980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-60,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-26,"s":[-100,0]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":6,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":46,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":80,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":118,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":148,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":182,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":220,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":251,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":286,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":323,"s":[100,-100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":348,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":393,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":437,"s":[-101,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":489,"s":[-101,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":550,"s":[100,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":600,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":652,"s":[104,0]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":692,"s":[104,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":731,"s":[104,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":769,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":808,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":855,"s":[100,-100]},{"t":897,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-60,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":323,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":690,"s":[25]},{"t":897,"s":[25]}],"ix":4},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-60,"s":[0]},{"t":897,"s":[5760]}],"ix":5},"nm":"Transform"}],"nm":"Fill 91","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":26,"st":-6,"bm":0},{"ddd":0,"ind":23,"ty":0,"nm":"Rectangle","refId":"comp_2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":110,"s":[100]},{"t":140,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[754,1398.75,0],"ix":2},"a":{"a":0,"k":[187.5,1500,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":375,"h":3000,"ip":26,"op":141,"st":-59,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"Square 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":-2,"s":[464.681,409.958,0],"to":[-3.167,-234.5,0],"ti":[3.167,-135.5,0]},{"t":55,"s":[331.681,274.958,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[65,65,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.155,7.985],[11.583,-1.952],[5.318,-19.023],[-10.536,-10.298]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.8274509803921568,0.5725490196078431,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-24,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":10,"s":[-100,0]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":42,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":82,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":116,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":154,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":184,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":218,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":256,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":287,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":322,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":359,"s":[100,-100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":384,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":429,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":473,"s":[-101,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":525,"s":[-101,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":586,"s":[100,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":636,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":688,"s":[104,0]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":728,"s":[104,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":767,"s":[104,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":805,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":844,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":891,"s":[100,-100]},{"t":933,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-24,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":78,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":359,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":726,"s":[25]},{"t":933,"s":[25]}],"ix":4},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-24,"s":[0]},{"t":933,"s":[5760]}],"ix":5},"nm":"Transform"}],"nm":"Fill 91","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":27,"st":-6,"bm":0},{"ddd":0,"ind":25,"ty":0,"nm":"Square","refId":"comp_3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":110,"s":[100]},{"t":140,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[310.317,985.151,0],"ix":2},"a":{"a":0,"k":[187.5,1500,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":375,"h":3000,"ip":27,"op":141,"st":-172,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":"Square 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":-2,"s":[466.681,408.958,0],"to":[5.333,-269,0],"ti":[-6.333,-197,0]},{"t":55,"s":[642.681,294.958,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[65,65,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.155,7.985],[11.583,-1.952],[5.318,-19.023],[-10.536,-10.298]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.8274509803921568,0.5725490196078431,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-475,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-441,"s":[-100,0]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-409,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-369,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-335,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-297,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-267,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-233,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-195,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-164,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-129,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-92,"s":[100,-100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":-67,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-22,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":22,"s":[-101,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":74,"s":[-101,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":135,"s":[100,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":185,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":237,"s":[104,0]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":277,"s":[104,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":316,"s":[104,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":354,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":393,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":440,"s":[100,-100]},{"t":482,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-475,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-373,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-92,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":275,"s":[25]},{"t":482,"s":[25]}],"ix":4},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-475,"s":[0]},{"t":482,"s":[5760]}],"ix":5},"nm":"Transform"}],"nm":"Fill 91","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":18,"st":-6,"bm":0},{"ddd":0,"ind":27,"ty":0,"nm":"Square","refId":"comp_3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":110,"s":[100]},{"t":140,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[656.317,1122.151,0],"ix":2},"a":{"a":0,"k":[187.5,1500,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":375,"h":3000,"ip":18,"op":141,"st":-147,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":"Square 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":-2,"s":[465.681,408.958,0],"to":[-2,-270.833,0],"ti":[5,-82.167,0]},{"t":55,"s":[321.681,181.958,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[65,65,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.155,7.985],[11.583,-1.952],[5.318,-19.023],[-10.536,-10.298]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.8274509803921568,0.5725490196078431,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-138,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-104,"s":[-100,0]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-72,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-32,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":2,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":40,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":70,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":104,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":142,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":173,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":208,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":245,"s":[100,-100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":270,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":315,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":359,"s":[-101,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":411,"s":[-101,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":472,"s":[100,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":522,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":574,"s":[104,0]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":614,"s":[104,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":653,"s":[104,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":691,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":730,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":777,"s":[100,-100]},{"t":819,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-138,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-36,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":245,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":612,"s":[25]},{"t":819,"s":[25]}],"ix":4},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-138,"s":[0]},{"t":819,"s":[5760]}],"ix":5},"nm":"Transform"}],"nm":"Fill 91","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":32,"st":-6,"bm":0},{"ddd":0,"ind":29,"ty":0,"nm":"Square","refId":"comp_3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":110,"s":[100]},{"t":140,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[371.317,1320.151,0],"ix":2},"a":{"a":0,"k":[187.5,1500,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":375,"h":3000,"ip":32,"op":141,"st":-75,"bm":0},{"ddd":0,"ind":30,"ty":4,"nm":"Square","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":-2,"s":[464.681,410.958,0],"to":[9.333,-292.667,0],"ti":[-18.333,-191.333,0]},{"t":55,"s":[706.681,298.958,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[65,65,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.155,7.985],[11.583,-1.952],[5.318,-19.023],[-10.536,-10.298]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.8274509803921568,0.5725490196078431,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-332,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-298,"s":[-100,0]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-266,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-226,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-192,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-154,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-124,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-90,"s":[100,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":-52,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":-21,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":14,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":51,"s":[100,-100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":76,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":121,"s":[100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":165,"s":[-101,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":217,"s":[-101,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":278,"s":[100,-106]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":328,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":380,"s":[104,0]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":420,"s":[104,100]},{"i":{"x":[0.27,0.27],"y":[1.55,1]},"o":{"x":[0.68,0.68],"y":[-0.55,0]},"t":459,"s":[104,-100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":497,"s":[-100,-100]},{"i":{"x":[0.27,0.27],"y":[1.55,1.55]},"o":{"x":[0.68,0.68],"y":[-0.55,-0.55]},"t":536,"s":[-100,100]},{"i":{"x":[0.27,0.27],"y":[1,1.55]},"o":{"x":[0.68,0.68],"y":[0,-0.55]},"t":583,"s":[100,-100]},{"t":625,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-332,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-230,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":51,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":418,"s":[25]},{"t":625,"s":[25]}],"ix":4},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-332,"s":[0]},{"t":625,"s":[5760]}],"ix":5},"nm":"Transform"}],"nm":"Fill 91","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":27,"st":-6,"bm":0},{"ddd":0,"ind":31,"ty":0,"nm":"Square","refId":"comp_3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":110,"s":[100]},{"t":140,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.469,"y":1},"o":{"x":0.167,"y":0.167},"t":27,"s":[742,1554,0],"to":[1.833,1.667,0],"ti":[-1.833,-1.667,0]},{"t":34,"s":[753,1564,0]}],"ix":2},"a":{"a":0,"k":[187.5,1500,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":375,"h":3000,"ip":27,"op":141,"st":-30,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/core/model/src/main/java/com/luckyoct/core/model/response/MissionBoardResponse.kt b/core/model/src/main/java/com/luckyoct/core/model/response/MissionBoardResponse.kt index bb8f3d55..2f4a3ada 100644 --- a/core/model/src/main/java/com/luckyoct/core/model/response/MissionBoardResponse.kt +++ b/core/model/src/main/java/com/luckyoct/core/model/response/MissionBoardResponse.kt @@ -6,6 +6,7 @@ import kotlinx.serialization.Serializable data class MissionBoardResponse( val number : Int, val reward : BoardReward = BoardReward.NONE, + val isMyPosition : Boolean = false, val missionBoardMembers : List ) diff --git a/core/model/src/main/java/com/luckyoct/core/model/response/MissionBoardsResponse.kt b/core/model/src/main/java/com/luckyoct/core/model/response/MissionBoardsResponse.kt index c6847726..ba42e28d 100644 --- a/core/model/src/main/java/com/luckyoct/core/model/response/MissionBoardsResponse.kt +++ b/core/model/src/main/java/com/luckyoct/core/model/response/MissionBoardsResponse.kt @@ -4,5 +4,16 @@ import kotlinx.serialization.Serializable @Serializable data class MissionBoardsResponse( - val missionBoards : List -) \ No newline at end of file + val missionBoards : List, + val progressCount : Int, + val rank : Int +){ + val boardRewardList : List by lazy { + missionBoards.filter { it.reward != BoardReward.NONE } + } + + val passedCountByMe : Int + get() { + return missionBoards.find { it.isMyPosition }?.number ?: 0 + } +} \ No newline at end of file diff --git a/core/model/src/main/java/com/luckyoct/core/model/response/MissionDetailResponse.kt b/core/model/src/main/java/com/luckyoct/core/model/response/MissionDetailResponse.kt index 10b3dd6e..ed4f25c0 100644 --- a/core/model/src/main/java/com/luckyoct/core/model/response/MissionDetailResponse.kt +++ b/core/model/src/main/java/com/luckyoct/core/model/response/MissionDetailResponse.kt @@ -25,6 +25,11 @@ data class MissionDetailResponse( LocalDate.parse(missionStartDate, formatter) } + val missionEndLocalDateTime : LocalDateTime by lazy { + val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss") + LocalDateTime.parse(missionEndDate, formatter) + } + val missionPeriod : String by lazy { try { val inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss") @@ -39,7 +44,7 @@ data class MissionDetailResponse( } } - val missionDaysOfWeek : List by lazy { + val missionDaysOfWeekTextLocale : List by lazy { try { missionDays.map { DayOfWeek.valueOf(it).getDisplayName(TextStyle.SHORT, Locale.getDefault()) @@ -49,6 +54,16 @@ data class MissionDetailResponse( } } + val missionDaysOfWeek : List by lazy { + try { + missionDays.map { + DayOfWeek.valueOf(it) + } + }catch (e: Exception){ + emptyList() + } + } + fun isStartedMission() : Boolean { val currentDate = LocalDate.now() return currentDate.isEqual(missionStartLocalDate) || currentDate.isAfter(missionStartLocalDate) diff --git a/feature/board/build.gradle.kts b/feature/board/build.gradle.kts index a1e4d2ca..2642920e 100644 --- a/feature/board/build.gradle.kts +++ b/feature/board/build.gradle.kts @@ -61,6 +61,8 @@ dependencies { implementation(libs.hilt.android) ksp(libs.hilt.compiler) + implementation(libs.balloon) + implementation(project(":core:designsystem")) implementation(project(":core:navigation")) implementation(project(":core:domain")) diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/Block.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/Block.kt index cc15fa27..cdef295c 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/Block.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/Block.kt @@ -22,7 +22,7 @@ import com.goalpanzi.mission_mate.feature.onboarding.component.StableImage fun Block( index: Int, type: BlockType, - eventType: BlockEventType, + eventType: BlockEventType?, numberOfColumns: Int, modifier: Modifier = Modifier, isPassed: Boolean = false, @@ -41,7 +41,7 @@ fun Block( if (type == BlockType.START) R.drawable.img_board_start else if (isStartedMission && isPassed) { if (eventType is BlockEventType.Item) { - eventType.boardEventItem.eventType.imageId + eventType.boardEventItem.eventType?.imageId ?: 0 } else { when (type) { BlockType.CENTER -> R.drawable.img_board_center_jeju diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/Board.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/Board.kt new file mode 100644 index 00000000..f15bf0f1 --- /dev/null +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/Board.kt @@ -0,0 +1,235 @@ +package com.goalpanzi.mission_mate.feature.board.component + +import android.annotation.SuppressLint +import androidx.compose.foundation.ScrollState +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.navigationBars +import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.statusBars +import androidx.compose.foundation.layout.statusBarsPadding +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.blur +import androidx.compose.ui.draw.drawWithContent +import androidx.compose.ui.graphics.drawscope.clipRect +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.goalpanzi.mission_mate.core.designsystem.theme.ColorGray1_FF404249 +import com.goalpanzi.mission_mate.core.designsystem.theme.ColorGray2_FF4F505C +import com.goalpanzi.mission_mate.core.designsystem.theme.MissionMateTypography +import com.goalpanzi.mission_mate.feature.board.R +import com.goalpanzi.mission_mate.feature.board.model.BoardEventItem +import com.goalpanzi.mission_mate.feature.board.model.MissionState +import com.goalpanzi.mission_mate.feature.board.model.toCharacter +import com.goalpanzi.mission_mate.feature.board.model.toEventType +import com.goalpanzi.mission_mate.feature.board.util.BoardGenerator +import com.luckyoct.core.model.response.MissionBoardsResponse +import com.luckyoct.core.model.response.MissionVerificationResponse +import kotlin.math.absoluteValue + + +@Composable +fun Board( + scrollState: ScrollState, + boardCount: Int, + passedCount: Int, + startDateText: String, + missionBoards: MissionBoardsResponse, + numberOfColumns: Int, + profile: MissionVerificationResponse, + missionState: MissionState, + modifier: Modifier = Modifier, +) { + val statusBar = WindowInsets.statusBars + val navigationBar = WindowInsets.navigationBars + val localDensity = LocalDensity.current + val statusBarHeight = remember { (statusBar.getTop(localDensity) - statusBar.getBottom(localDensity)).absoluteValue } + val navigationBarHeight = remember { (navigationBar.getTop(localDensity) - navigationBar.getBottom(localDensity)).absoluteValue } + Box( + modifier = modifier + .fillMaxSize() + ) { + Column( + modifier = modifier.modifierWithClipRect( + scrollState = scrollState, + missionState = missionState, + innerModifier = Modifier + .drawWithContent { + clipRect(bottom = statusBarHeight + 178.dp.toPx()) { + this@drawWithContent.drawContent() + } + } + .blur(10.dp, 10.dp), + ) + ) { + BoardContent( + boardCount, + passedCount, + startDateText, + missionBoards, + numberOfColumns, + profile, + missionState, + modifier + ) + } + Column( + modifier = modifier.modifierWithClipRect( + scrollState = scrollState, + missionState = missionState, + innerModifier = Modifier + .drawWithContent { + clipRect( + top = statusBarHeight + 178.dp.toPx() - 1, + bottom = size.height + navigationBarHeight - (if (missionState.isVisiblePiece()) 188.dp else 46.dp).toPx() + ) { + this@drawWithContent.drawContent() + } + } + ) + ) { + BoardContent( + boardCount, + passedCount, + startDateText, + missionBoards, + numberOfColumns, + profile, + missionState, + modifier + ) + } + + Column( + modifier = modifier.modifierWithClipRect( + scrollState = scrollState, + missionState = missionState, + innerModifier = Modifier + .drawWithContent { + clipRect(top = (size.height + navigationBarHeight - (if (missionState.isVisiblePiece()) 188.dp else 46.dp).toPx())) { + this@drawWithContent.drawContent() + } + }.blur(10.dp,10.dp) + ) + ) { + BoardContent( + boardCount, + passedCount, + startDateText, + missionBoards, + numberOfColumns, + profile, + missionState, + modifier + ) + } + + + } + +} + +@Composable +fun ColumnScope.BoardContent( + boardCount: Int, + passedCount: Int, + startDateText: String, + missionBoards: MissionBoardsResponse, + numberOfColumns: Int, + profile: MissionVerificationResponse, + missionState: MissionState, + modifier: Modifier = Modifier, +) { + Text( + modifier = Modifier.padding(top = 28.dp), + text = startDateText, + style = MissionMateTypography.heading_md_bold, + color = ColorGray1_FF404249 + ) + Text( + modifier = Modifier.padding(top = 2.dp, bottom = 20.dp), + text = stringResource(id = R.string.board_before_start_description), + style = MissionMateTypography.body_lg_bold, + color = ColorGray2_FF4F505C + ) + BoxWithConstraints { + val width = maxWidth + Column { + BoardGenerator.getBlockListByBoardCount( + boardCount, + numberOfColumns, + passedCount, + missionBoards.boardRewardList.map { + BoardEventItem( + index = it.number, + eventType = it.reward.toEventType() + ) + } + ).chunked(numberOfColumns).forEach { + Row() { + it.forEach { + Block( + index = it.index, + eventType = it.blockEventType, + type = it.blockType, modifier = Modifier + .weight(1f) + .aspectRatio(1f), + numberOfColumns = numberOfColumns, + isPassed = it.isPassed, + isStartedMission = missionState.isVisiblePiece() + ) + } + } + } + } + if (missionState.isVisiblePiece()) { + missionBoards.missionBoards.forEach { block -> + if (block.missionBoardMembers.isNotEmpty()) { + Piece( + index = block.number, + count = block.missionBoardMembers.size, + nickname = if (block.isMyPosition) profile.nickname else block.missionBoardMembers.first().nickname, + sizePerBlock = width / numberOfColumns, + numberOfColumn = numberOfColumns, + isMe = block.isMyPosition, + imageId = if (block.isMyPosition) profile.characterType.toCharacter().imageId else block.missionBoardMembers.first().characterType.toCharacter().imageId, + imageIdForCount = if (block.isMyPosition) profile.characterType.toCharacter().imageId else block.missionBoardMembers.first().characterType.toCharacter().imageId + ) + } + } + } + } +} + +@SuppressLint("ModifierFactoryUnreferencedReceiver") +fun Modifier.modifierWithClipRect( + scrollState: ScrollState, + missionState: MissionState, + innerModifier: Modifier, + modifier: Modifier = Modifier, +): Modifier { + return modifier + .fillMaxSize() + .navigationBarsPadding() + .then(innerModifier) + .verticalScroll(scrollState) + .statusBarsPadding() + .padding( + top = 180.dp, + start = 24.dp, + end = 24.dp, + bottom = if (missionState.isVisiblePiece()) 188.dp else 46.dp + ) +} \ No newline at end of file diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/BoardBottomView.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/BoardBottomView.kt index 7013f659..1b8038c3 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/BoardBottomView.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/BoardBottomView.kt @@ -17,16 +17,19 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.goalpanzi.mission_mate.core.designsystem.component.MissionMateButtonType import com.goalpanzi.mission_mate.core.designsystem.component.MissionMateTextButton import com.goalpanzi.mission_mate.core.designsystem.theme.ColorGray2_FF4F505C import com.goalpanzi.mission_mate.core.designsystem.theme.ColorWhite_FFFFFFFF import com.goalpanzi.mission_mate.core.designsystem.theme.MissionMateTypography import com.goalpanzi.mission_mate.feature.board.R +import com.goalpanzi.mission_mate.feature.board.model.MissionState import com.goalpanzi.mission_mate.feature.onboarding.component.StableImage @Composable fun BoardBottomView( - onClickButton : () -> Unit, + onClickButton: () -> Unit, + missionState: MissionState, modifier: Modifier = Modifier ) { Column( @@ -42,7 +45,7 @@ fun BoardBottomView( modifier = Modifier.wrapContentWidth(), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(8.dp) - ){ + ) { StableImage(drawableResId = com.goalpanzi.mission_mate.core.designsystem.R.drawable.ic_time) Text( text = stringResource(id = R.string.board_verification_am_time_limit), @@ -52,7 +55,11 @@ fun BoardBottomView( } MissionMateTextButton( modifier = Modifier.fillMaxWidth(), - textId = R.string.board_verification, + textId = when(missionState){ + MissionState.IN_PROGRESS_NON_MISSION_DAY -> R.string.board_verification_not + else -> R.string.board_verification + }, + buttonType = if (missionState.enabledVerification()) MissionMateButtonType.ACTIVE else MissionMateButtonType.DISABLED, onClick = onClickButton ) } @@ -60,8 +67,9 @@ fun BoardBottomView( @Preview(showBackground = true, backgroundColor = 0xFF000000) @Composable -fun PreviewBoardBottomView(){ +fun PreviewBoardBottomView() { BoardBottomView( + missionState = MissionState.POST_END, onClickButton = {} ) } \ No newline at end of file diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/BoardTopView.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/BoardTopView.kt index 3e8fd718..db3bad98 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/BoardTopView.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/BoardTopView.kt @@ -17,30 +17,31 @@ import com.goalpanzi.mission_mate.core.designsystem.theme.ColorGray1_FF404249 import com.goalpanzi.mission_mate.core.designsystem.theme.ColorWhite_FFFFFFFF import com.goalpanzi.mission_mate.core.designsystem.theme.component.MissionMateTopAppBar import com.goalpanzi.mission_mate.core.designsystem.theme.component.NavigationType -import com.goalpanzi.mission_mate.feature.board.model.Character import com.goalpanzi.mission_mate.feature.board.model.UserStory @Composable fun BoardTopView( - title : String, - isAddingUserEnabled : Boolean, - userList : List, - onClickFlag : () -> Unit, - onClickAddUser : () -> Unit, - onClickSetting : () -> Unit, + title: String, + isAddingUserEnabled: Boolean, + userList: List, + onClickFlag: () -> Unit, + onClickAddUser: () -> Unit, + onClickSetting: () -> Unit, modifier: Modifier = Modifier, - isVisibleFlagButton : Boolean = false -){ + isVisibleFlagButton: Boolean = false +) { Column( - modifier = modifier.background(ColorWhite_FFFFFFFF.copy(alpha = 0.5f)).statusBarsPadding() + modifier = modifier + .background(ColorWhite_FFFFFFFF.copy(alpha = 0.5f)) + .statusBarsPadding() ) { MissionMateTopAppBar( modifier = modifier, navigationType = NavigationType.NONE, title = title, leftActionButtons = { - if(isVisibleFlagButton){ + if (isVisibleFlagButton) { IconButton( onClick = onClickFlag, modifier = Modifier.wrapContentSize() @@ -70,16 +71,16 @@ fun BoardTopView( @Composable fun BoardTopViewRightActionButtons( - isAddingUserEnabled : Boolean, - onClickAddUser : () -> Unit, - onClickSetting : () -> Unit, + isAddingUserEnabled: Boolean, + onClickAddUser: () -> Unit, + onClickSetting: () -> Unit, modifier: Modifier = Modifier -){ +) { Row( modifier = modifier, verticalAlignment = Alignment.CenterVertically - ){ - if(isAddingUserEnabled){ + ) { + if (isAddingUserEnabled) { IconButton( onClick = onClickAddUser, modifier = Modifier.wrapContentSize() diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/Piece.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/Piece.kt index f0c8a727..52a1e5ff 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/Piece.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/Piece.kt @@ -1,11 +1,14 @@ package com.goalpanzi.mission_mate.feature.board.component import androidx.annotation.DrawableRes +import androidx.compose.animation.core.LinearOutSlowInEasing import androidx.compose.animation.core.animateDpAsState -import androidx.compose.animation.core.animateOffsetAsState +import androidx.compose.animation.core.tween import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxScope +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.absoluteOffset import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxWidth @@ -13,7 +16,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.Card import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -24,7 +26,6 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.geometry.Offset import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp @@ -32,34 +33,46 @@ import com.goalpanzi.mission_mate.core.designsystem.theme.ColorGray1_FF404249 import com.goalpanzi.mission_mate.core.designsystem.theme.ColorOrange_FFFF5732 import com.goalpanzi.mission_mate.core.designsystem.theme.ColorWhite_FFFFFFFF import com.goalpanzi.mission_mate.core.designsystem.theme.MissionMateTypography -import com.goalpanzi.mission_mate.feature.board.model.PieceOffset -import com.goalpanzi.mission_mate.feature.board.util.PieceUtil +import com.goalpanzi.mission_mate.feature.board.util.PieceGenerator +import com.goalpanzi.mission_mate.feature.onboarding.component.OutlinedBox import com.goalpanzi.mission_mate.feature.onboarding.component.StableImage @Composable fun BoxScope.Piece( index: Int, + count : Int, + nickname : String, numberOfColumn: Int, sizePerBlock: Dp, + isMe : Boolean, @DrawableRes imageId: Int, + @DrawableRes imageIdForCount: Int, modifier: Modifier = Modifier ) { var needMoving by remember { mutableStateOf(false) } val x = animateDpAsState( - targetValue = if (needMoving) PieceUtil.getXOffset( + targetValue = if (needMoving) PieceGenerator.getXOffset( index, numberOfColumn, sizePerBlock - ) else PieceUtil.getXOffset(index-1, numberOfColumn, sizePerBlock) + ) else PieceGenerator.getXOffset(index-1, numberOfColumn, sizePerBlock), + animationSpec = tween( + durationMillis = 500, + easing = LinearOutSlowInEasing + ) ) val y = animateDpAsState( - targetValue = if (needMoving) PieceUtil.getYOffset( + targetValue = if (needMoving) PieceGenerator.getYOffset( index , numberOfColumn, sizePerBlock - ) else PieceUtil.getYOffset(index-1, numberOfColumn, sizePerBlock) + ) else PieceGenerator.getYOffset(index-1, numberOfColumn, sizePerBlock), + animationSpec = tween( + durationMillis = 500, + easing = LinearOutSlowInEasing + ) ) @@ -77,18 +90,28 @@ fun BoxScope.Piece( sizePerBlock ) ) { + StableImage( modifier = Modifier + .padding(top = 4.dp) .fillMaxWidth(88f / 114f) .aspectRatio(1f) .align(Alignment.TopCenter), drawableResId = imageId, ) + if(count > 1){ + PieceCountChip( + modifier = Modifier.align(Alignment.TopEnd), + count = count, + imageId = imageIdForCount + ) + } PieceNameChip( modifier = Modifier.align( Alignment. BottomCenter ).padding(bottom = 7.dp), - name = "토끼는깡총깡" + name = nickname, + isMe = isMe ) } @@ -106,7 +129,6 @@ fun PieceNameChip( modifier = modifier .wrapContentSize() .clip(RoundedCornerShape(20.dp)) - .background( if(isMe) ColorOrange_FFFF5732 else ColorWhite_FFFFFFFF ).padding(horizontal = 8.5.dp, 0.85.dp) @@ -115,4 +137,33 @@ fun PieceNameChip( style = textStyle, color = if(isMe) ColorWhite_FFFFFFFF else ColorGray1_FF404249 ) +} + +@Composable +fun PieceCountChip( + @DrawableRes imageId: Int, + count : Int, + modifier: Modifier = Modifier, + textStyle : TextStyle = MissionMateTypography.body_md_bold +){ + OutlinedBox( + modifier = modifier + ){ + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(5.dp) + ){ + StableImage( + modifier = Modifier.size(22.dp), + drawableResId = imageId, + ) + Text( + modifier = Modifier.padding(end = 4.dp), + text = "$count", + style = textStyle, + color = ColorWhite_FFFFFFFF + ) + } + } + } \ No newline at end of file diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/dialog/BoardEventDialog.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/dialog/BoardEventDialog.kt new file mode 100644 index 00000000..4b275403 --- /dev/null +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/dialog/BoardEventDialog.kt @@ -0,0 +1,155 @@ +package com.goalpanzi.mission_mate.feature.board.component.dialog + +import android.annotation.SuppressLint +import androidx.annotation.StringRes +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogProperties +import com.goalpanzi.mission_mate.core.designsystem.component.LottieImage +import com.goalpanzi.mission_mate.core.designsystem.component.MissionMateTextButton +import com.goalpanzi.mission_mate.core.designsystem.theme.ColorGray1_FF404249 +import com.goalpanzi.mission_mate.core.designsystem.theme.ColorGray2_FF4F505C +import com.goalpanzi.mission_mate.core.designsystem.theme.ColorGray3_FF727484 +import com.goalpanzi.mission_mate.core.designsystem.theme.ColorWhite_FFFFFFFF +import com.goalpanzi.mission_mate.core.designsystem.theme.MissionMateTypography +import com.goalpanzi.mission_mate.feature.board.R +import com.goalpanzi.mission_mate.feature.board.model.toEventType +import com.goalpanzi.mission_mate.feature.onboarding.component.StableImage +import com.luckyoct.core.model.response.BoardReward + +@SuppressLint("UnrememberedMutableInteractionSource") +@Composable +fun BoardEventDialog( + reward: BoardReward, + onDismissRequest: () -> Unit, + onClickOk: () -> Unit, + modifier: Modifier = Modifier, + titleStyle: TextStyle = MissionMateTypography.title_xl_bold, + descriptionStyle: TextStyle = MissionMateTypography.body_lg_regular, + @StringRes okTextId: Int? = R.string.ok, + @StringRes cancelTextId: Int? = null, + okTextStyle: TextStyle = MissionMateTypography.body_lg_bold, + cancelTextStyle: TextStyle = MissionMateTypography.body_lg_bold, + shape: Shape = RoundedCornerShape(20.dp), + dialogInnerPadding: PaddingValues = PaddingValues( + top = 40.dp, + bottom = 34.dp, + start = 24.dp, + end = 24.dp + ), + dialogProperties: DialogProperties = DialogProperties( + usePlatformDefaultWidth = false + ) +) { + val event = reward.toEventType() + Dialog( + properties = dialogProperties, + onDismissRequest = onDismissRequest, + ) { + Box( + modifier = Modifier.fillMaxSize().clickable( + interactionSource = MutableInteractionSource(), + indication = null, + onClick = onDismissRequest + ), + contentAlignment = Alignment.Center + ){ + Column( + modifier = modifier + .padding(horizontal = 20.dp) + .clip(shape) + .background(ColorWhite_FFFFFFFF) + .padding(dialogInnerPadding) + .clickable( + interactionSource = MutableInteractionSource(), + indication = null, + onClick = {} + ), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = if (event != null) { + stringResource( + id = R.string.board_mission_verification_success_dialog_reward_title, + stringResource(id = event.stringRes) + ) + } else { + stringResource(id = R.string.board_mission_verification_success_dialog_title) + }, + style = titleStyle, + textAlign = TextAlign.Center, + color = ColorGray1_FF404249 + ) + Text( + modifier = Modifier.padding(top = 12.dp, bottom = 32.dp), + text = if (event != null) stringResource(id = R.string.board_mission_verification_success_dialog_reward_description) + else stringResource(id = R.string.board_mission_verification_success_dialog_description), + style = descriptionStyle, + textAlign = TextAlign.Center, + color = ColorGray2_FF4F505C + ) + StableImage( + drawableResId = event?.fullImageId ?: R.drawable.img_default_move, + modifier = Modifier + .padding(bottom = 32.dp) + .size(180.dp) + ) + + Column( + horizontalAlignment = Alignment.CenterHorizontally + ) { + if (okTextId != null) { + MissionMateTextButton( + modifier = Modifier + .fillMaxWidth(), + textId = okTextId, + textStyle = okTextStyle, + onClick = onClickOk + ) + } + + if (cancelTextId != null) { + Text( + modifier = Modifier + .padding(top = 20.dp) + .clickable( + interactionSource = MutableInteractionSource(), + indication = null, + onClick = onDismissRequest + ), + text = stringResource(id = cancelTextId), + style = cancelTextStyle, + textAlign = TextAlign.Center, + color = ColorGray3_FF727484 + ) + } + } + + } + LottieImage( + modifier = Modifier.align(Alignment.Center), + lottieRes = com.goalpanzi.mission_mate.core.designsystem.R.raw.animation_celebration) + } + + } +} \ No newline at end of file diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/DeleteMissionDialog.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/dialog/DeleteMissionDialog.kt similarity index 92% rename from feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/DeleteMissionDialog.kt rename to feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/dialog/DeleteMissionDialog.kt index 77086f4f..fdcef368 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/DeleteMissionDialog.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/dialog/DeleteMissionDialog.kt @@ -1,4 +1,4 @@ -package com.goalpanzi.mission_mate.feature.board.component +package com.goalpanzi.mission_mate.feature.board.component.dialog import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/BoardEventItem.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/BoardEventItem.kt index 95a94975..a7f131e6 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/BoardEventItem.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/BoardEventItem.kt @@ -1,24 +1,73 @@ package com.goalpanzi.mission_mate.feature.board.model import androidx.annotation.DrawableRes +import androidx.annotation.StringRes import com.goalpanzi.mission_mate.feature.board.R +import com.luckyoct.core.model.response.BoardReward data class BoardEventItem( val index: Int, - val eventType: EventType + val eventType: EventType? ) enum class EventType( - @DrawableRes val imageId: Int + @DrawableRes val imageId: Int, + @StringRes val stringRes: Int, + @DrawableRes val fullImageId: Int, ) { - Orange(imageId = R.drawable.img_orange), - Flower(imageId = R.drawable.img_flower), - Stone(imageId = R.drawable.img_stone), - Horse(imageId = R.drawable.img_horse), - Mountain(imageId = R.drawable.img_mountain), - Waterfall(imageId = R.drawable.img_waterfall), - Pig(imageId = R.drawable.img_pig), - Bong(imageId = R.drawable.img_bong), - GreenTea(imageId = R.drawable.img_green_tea), - Sea(imageId = R.drawable.img_sea) -} \ No newline at end of file + ORANGE( + imageId = R.drawable.img_orange, + stringRes = R.string.board_mission_event_orange, + fullImageId = R.drawable.img_orange_full + ), + CANOLA_FLOWER( + imageId = R.drawable.img_flower, + stringRes = R.string.board_mission_event_canola_flower, + fullImageId = R.drawable.img_canola_flower_full + ), + DOLHARUBANG( + imageId = R.drawable.img_stone, + stringRes = R.string.board_mission_event_dolharubang, + fullImageId = R.drawable.img_dolharubang_full + ), + HORSE_RIDING( + imageId = R.drawable.img_horse, + stringRes = R.string.board_mission_event_horse_riding, + fullImageId = R.drawable.img_horse_riding_full + ), + HALLA_MOUNTAIN( + imageId = R.drawable.img_mountain, + stringRes = R.string.board_mission_event_halla_mountain, + fullImageId = R.drawable.img_halla_mountain_full + ), + WATERFALL( + imageId = R.drawable.img_waterfall, + stringRes = R.string.board_mission_event_waterfall, + fullImageId = R.drawable.img_waterfall_full + ), + BLACK_PIG( + imageId = R.drawable.img_pig, + stringRes = R.string.board_mission_event_black_pig, + fullImageId = R.drawable.img_black_pig_full + ), + SUNRISE( + imageId = R.drawable.img_bong, + stringRes = R.string.board_mission_event_sunrise, + fullImageId = R.drawable.img_sunrise_full + ), + GREEN_TEA_FIELD( + imageId = R.drawable.img_green_tea, + stringRes = R.string.board_mission_event_green_tea_field, + fullImageId = R.drawable.img_green_tea_field_full + ), + BEACH( + imageId = R.drawable.img_sea, + stringRes = R.string.board_mission_event_beach, + fullImageId = R.drawable.img_beach_full + ) +} + + +fun BoardReward.toEventType(): EventType? { + return EventType.entries.find { it.name == this.name } +} diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/MissionState.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/MissionState.kt new file mode 100644 index 00000000..9fabd410 --- /dev/null +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/MissionState.kt @@ -0,0 +1,153 @@ +package com.goalpanzi.mission_mate.feature.board.model + +import com.goalpanzi.mission_mate.feature.board.model.uimodel.MissionBoardUiModel +import com.goalpanzi.mission_mate.feature.board.model.uimodel.MissionUiModel +import com.goalpanzi.mission_mate.feature.board.model.uimodel.MissionVerificationUiModel +import com.goalpanzi.mission_mate.feature.onboarding.model.VerificationTimeType +import com.luckyoct.core.model.response.MissionVerificationResponse +import java.time.DayOfWeek +import java.time.LocalDate +import java.time.LocalDateTime + +enum class MissionState { + LOADING, + + DELETABLE, // 삭제_가능 + + PRE_START_SOLO, // 시작_전_혼자 + PRE_START_MULTI, // 시작_전_2명_이상 + + IN_PROGRESS_MISSION_DAY_BEFORE_CONFIRM, // 진행_중_미션일_인증_전 + IN_PROGRESS_MISSION_DAY_AFTER_CONFIRM, // 진행_중_미션일_인증_후 + IN_PROGRESS_MISSION_DAY_CLOSED, // 진행_중_미션일_인증_마감 + IN_PROGRESS_NON_MISSION_DAY, // 진행_중_미션일_아님 + IN_PROGRESS_MISSION_DAY_NON_MISSION_TIME, // 진행_중_미션일O_미션시간X + + POST_END; // 종료_후 + + fun isVisiblePiece() : Boolean { + return this in setOf( + IN_PROGRESS_MISSION_DAY_BEFORE_CONFIRM, + IN_PROGRESS_MISSION_DAY_AFTER_CONFIRM, + IN_PROGRESS_MISSION_DAY_CLOSED, + IN_PROGRESS_NON_MISSION_DAY, + IN_PROGRESS_MISSION_DAY_NON_MISSION_TIME, + POST_END + ) + } + + fun enabledVerification() : Boolean { + return this == IN_PROGRESS_MISSION_DAY_BEFORE_CONFIRM + } + + companion object { + fun getMissionState( + missionBoardUiModel: MissionBoardUiModel, + missionUiModel: MissionUiModel, + missionVerificationUiModel: MissionVerificationUiModel + ): MissionState { + if (missionBoardUiModel !is MissionBoardUiModel.Success) return LOADING + if (missionUiModel !is MissionUiModel.Success) return LOADING + if (missionVerificationUiModel !is MissionVerificationUiModel.Success) return LOADING + + val todayLocalDateTime = LocalDateTime.now() + + return getMissionState( + todayLocalDateTime = todayLocalDateTime, + startDate = missionUiModel.missionDetailResponse.missionStartLocalDate, + endDateTime = missionUiModel.missionDetailResponse.missionEndLocalDateTime, + memberList = missionVerificationUiModel.missionVerificationsResponse.missionVerifications, + verificationTimeType = VerificationTimeType.valueOf(missionUiModel.missionDetailResponse.timeOfDay), + daysOfWeek = missionUiModel.missionDetailResponse.missionDaysOfWeek + ) + } + + internal fun getMissionState( + todayLocalDateTime : LocalDateTime, + startDate : LocalDate, + endDateTime: LocalDateTime, + memberList: List, + verificationTimeType: VerificationTimeType, + daysOfWeek : List + ) : MissionState { + val todayLocalDate = todayLocalDateTime.toLocalDate() + + return if (!startDate.isAfter(todayLocalDate)) { + if (memberList.isEmpty()) + DELETABLE + else { + if (isPassedEndTime(todayLocalDateTime, endDateTime, verificationTimeType)) { + POST_END + } else { + getMissionStateAsInProgress( + todayLocalDate, + todayLocalDateTime, + daysOfWeek, + verificationTimeType, + memberList + ) + } + } + } else { + getMissionStateAsPreStart(memberList.size > 1) + } + } + + private fun getMissionStateAsPreStart( + isMultipleMembers: Boolean + ): MissionState { + return if (isMultipleMembers) PRE_START_MULTI else PRE_START_SOLO + } + + internal fun isPassedEndTime( + todayLocalDateTime: LocalDateTime, + endDateTime: LocalDateTime, + verificationTimeType: VerificationTimeType + ): Boolean { + val targetTime = verificationTimeType.getVerificationEndTime(endDateTime) + return todayLocalDateTime.isAfter(targetTime) + } + + internal fun getMissionStateAsInProgress( + todayLocalDate: LocalDate, + todayLocalDateTime: LocalDateTime, + daysOfWeek: List, + verificationTimeType: VerificationTimeType, + memberList : List + ): MissionState { + val endTime = verificationTimeType.getVerificationEndTime(todayLocalDateTime) + if (isTodayMissionDay(todayLocalDate, daysOfWeek)) { + when (verificationTimeType) { + VerificationTimeType.AFTERNOON -> { + if(endTime.isAfter(VerificationTimeType.MORNING.getVerificationEndTime(todayLocalDateTime))){ + return IN_PROGRESS_MISSION_DAY_NON_MISSION_TIME + } + } + else -> { + if(todayLocalDateTime.isAfter(endTime)){ + return IN_PROGRESS_MISSION_DAY_CLOSED + } + } + } + return if(isVerifiedInMissionTime(memberList)) IN_PROGRESS_MISSION_DAY_AFTER_CONFIRM + else IN_PROGRESS_MISSION_DAY_BEFORE_CONFIRM + } else { + return IN_PROGRESS_NON_MISSION_DAY + } + } + + internal fun isTodayMissionDay( + todayLocalDate: LocalDate, + missionDaysOfWeek: List + ): Boolean { + return missionDaysOfWeek.contains(todayLocalDate.dayOfWeek) + } + + internal fun isVerifiedInMissionTime( + memberList : List + ) : Boolean { + if(memberList.isEmpty()) return false + return memberList.first().image.isNotEmpty() + } + } +} diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/PieceUiModel.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/PieceUiModel.kt deleted file mode 100644 index 10157c50..00000000 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/PieceUiModel.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.goalpanzi.mission_mate.feature.board.model - -import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.dp - -data class PieceUiModel( - val index : Int -) - -data class PieceOffset( - val x : Dp = 0.dp, - val y : Dp = 0.dp -) \ No newline at end of file diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/BlockUiModel.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/uimodel/BlockUiModel.kt similarity index 51% rename from feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/BlockUiModel.kt rename to feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/uimodel/BlockUiModel.kt index 816fe58e..abff85f7 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/BlockUiModel.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/uimodel/BlockUiModel.kt @@ -1,4 +1,7 @@ -package com.goalpanzi.mission_mate.feature.board.model +package com.goalpanzi.mission_mate.feature.board.model.uimodel + +import com.goalpanzi.mission_mate.feature.board.model.BlockEventType +import com.goalpanzi.mission_mate.feature.board.model.BlockType data class BlockUiModel( val index : Int, diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/MissionBoardUiModel.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/uimodel/MissionBoardUiModel.kt similarity index 82% rename from feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/MissionBoardUiModel.kt rename to feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/uimodel/MissionBoardUiModel.kt index 22c6c68f..60b7edf9 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/MissionBoardUiModel.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/uimodel/MissionBoardUiModel.kt @@ -1,4 +1,4 @@ -package com.goalpanzi.mission_mate.feature.board.model +package com.goalpanzi.mission_mate.feature.board.model.uimodel import com.luckyoct.core.model.response.MissionBoardsResponse diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/MissionUiModel.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/uimodel/MissionUiModel.kt similarity index 81% rename from feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/MissionUiModel.kt rename to feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/uimodel/MissionUiModel.kt index d836e166..d507ac8f 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/MissionUiModel.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/uimodel/MissionUiModel.kt @@ -1,4 +1,4 @@ -package com.goalpanzi.mission_mate.feature.board.model +package com.goalpanzi.mission_mate.feature.board.model.uimodel import com.luckyoct.core.model.response.MissionDetailResponse diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/MissionVerificationUiModel.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/uimodel/MissionVerificationUiModel.kt similarity index 84% rename from feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/MissionVerificationUiModel.kt rename to feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/uimodel/MissionVerificationUiModel.kt index b0d55a65..877bd9ed 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/MissionVerificationUiModel.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/uimodel/MissionVerificationUiModel.kt @@ -1,4 +1,4 @@ -package com.goalpanzi.mission_mate.feature.board.model +package com.goalpanzi.mission_mate.feature.board.model.uimodel import com.luckyoct.core.model.response.MissionVerificationsResponse diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardScreen.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardScreen.kt index 543eb290..a7cc9a4b 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardScreen.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardScreen.kt @@ -3,26 +3,16 @@ package com.goalpanzi.mission_mate.feature.board.screen import androidx.compose.foundation.Image import androidx.compose.foundation.ScrollState import androidx.compose.foundation.background -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.gestures.animateScrollBy import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.BoxWithConstraints -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll import androidx.compose.material3.CircularProgressIndicator -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -34,46 +24,41 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.goalpanzi.mission_mate.core.designsystem.theme.ColorGray1_FF404249 -import com.goalpanzi.mission_mate.core.designsystem.theme.ColorGray2_FF4F505C -import com.goalpanzi.mission_mate.core.designsystem.theme.ColorGray5_80F5F6F9 import com.goalpanzi.mission_mate.core.designsystem.theme.ColorWhite_FFFFFFFF -import com.goalpanzi.mission_mate.core.designsystem.theme.MissionMateTypography import com.goalpanzi.mission_mate.feature.board.R -import com.goalpanzi.mission_mate.feature.board.component.Block +import com.goalpanzi.mission_mate.feature.board.component.Board import com.goalpanzi.mission_mate.feature.board.component.BoardBottomView import com.goalpanzi.mission_mate.feature.board.component.BoardTopView -import com.goalpanzi.mission_mate.feature.board.component.DeleteMissionDialog -import com.goalpanzi.mission_mate.feature.board.component.Piece -import com.goalpanzi.mission_mate.feature.board.model.Character -import com.goalpanzi.mission_mate.feature.board.model.MissionBoardUiModel -import com.goalpanzi.mission_mate.feature.board.model.MissionUiModel -import com.goalpanzi.mission_mate.feature.board.model.MissionVerificationUiModel +import com.goalpanzi.mission_mate.feature.board.component.dialog.BoardEventDialog +import com.goalpanzi.mission_mate.feature.board.component.dialog.DeleteMissionDialog +import com.goalpanzi.mission_mate.feature.board.model.MissionState import com.goalpanzi.mission_mate.feature.board.model.toCharacter import com.goalpanzi.mission_mate.feature.board.model.toUserStory -import com.goalpanzi.mission_mate.feature.board.util.BoardUtil +import com.goalpanzi.mission_mate.feature.board.model.uimodel.MissionBoardUiModel +import com.goalpanzi.mission_mate.feature.board.model.uimodel.MissionUiModel +import com.goalpanzi.mission_mate.feature.board.model.uimodel.MissionVerificationUiModel import com.goalpanzi.mission_mate.feature.onboarding.component.StableImage -import com.luckyoct.core.model.response.MissionBoardResponse +import com.luckyoct.core.model.response.BoardReward import kotlinx.coroutines.delay import kotlinx.coroutines.launch @Composable fun BoardRoute( - onNavigateOnboarding : () -> Unit, - onClickSetting : () -> Unit, + onNavigateOnboarding: () -> Unit, + onClickSetting: () -> Unit, modifier: Modifier = Modifier, viewModel: BoardViewModel = hiltViewModel() ) { val missionBoardUiModel by viewModel.missionBoardUiModel.collectAsStateWithLifecycle() val missionUiModel by viewModel.missionUiModel.collectAsStateWithLifecycle() val missionVerificationUiModel by viewModel.missionVerificationUiModel.collectAsStateWithLifecycle() - var isShownDeleteMissionDialog by remember { - mutableStateOf(false) - } + val missionState by viewModel.missionState.collectAsStateWithLifecycle() + val scrollState = rememberScrollState() + var isShownDeleteMissionDialog by remember { mutableStateOf(false) } + var isShownBoardRewardDialog by remember { mutableStateOf(null) } LaunchedEffect(key1 = Unit) { viewModel.getMissionBoards() @@ -82,24 +67,28 @@ fun BoardRoute( launch { viewModel.deleteMissionResultEvent.collect { - if(it){ + if (it) { isShownDeleteMissionDialog = false onNavigateOnboarding() } } } - } - LaunchedEffect(missionUiModel,missionVerificationUiModel) { - if(missionUiModel is MissionUiModel.Success && missionVerificationUiModel is MissionVerificationUiModel.Success){ - if((missionUiModel as MissionUiModel.Success).missionDetailResponse.isStartedMission() && - (missionVerificationUiModel as MissionVerificationUiModel.Success).missionVerificationsResponse.missionVerifications.size == 1){ - isShownDeleteMissionDialog = true + launch { + viewModel.boardRewardEvent.collect { + delay(500L) + isShownBoardRewardDialog = it } } } - if(isShownDeleteMissionDialog){ + LaunchedEffect(missionState) { + if (missionState == MissionState.DELETABLE) { + isShownDeleteMissionDialog = true + } + } + + if (isShownDeleteMissionDialog) { DeleteMissionDialog( onDismissRequest = { isShownDeleteMissionDialog = false @@ -109,24 +98,44 @@ fun BoardRoute( } ) } + if(isShownBoardRewardDialog != null){ + BoardEventDialog( + reward = isShownBoardRewardDialog!!, + onDismissRequest = { + isShownBoardRewardDialog = null + }, + onClickOk = { + isShownBoardRewardDialog = null + } + ) + } BoardScreen( + modifier = modifier, + scrollState = scrollState, missionBoardUiModel = missionBoardUiModel, missionUiModel = missionUiModel, missionVerificationUiModel = missionVerificationUiModel, - onClickSetting = onClickSetting + missionState = missionState, + onClickSetting = onClickSetting, + onClickVerification = { + viewModel.verify() + } ) } @Composable fun BoardScreen( + scrollState: ScrollState, missionBoardUiModel: MissionBoardUiModel, missionUiModel: MissionUiModel, - missionVerificationUiModel : MissionVerificationUiModel, - onClickSetting : () -> Unit, + missionVerificationUiModel: MissionVerificationUiModel, + missionState : MissionState, + onClickSetting: () -> Unit, + onClickVerification : () -> Unit, modifier: Modifier = Modifier ) { - val scrollState = rememberScrollState() + Box( modifier = modifier @@ -145,17 +154,17 @@ fun BoardScreen( ) Board( boardCount = missionBoardUiModel.missionBoardsResponse.missionBoards.size, - missionBoards = missionBoardUiModel.missionBoardsResponse.missionBoards, + missionBoards = missionBoardUiModel.missionBoardsResponse, numberOfColumns = 3, - passedCount = 0, + passedCount = missionBoardUiModel.missionBoardsResponse.passedCountByMe, startDateText = stringResource( id = R.string.board_before_start_title, missionUiModel.missionDetailResponse.missionStartLocalDate.monthValue, missionUiModel.missionDetailResponse.missionStartLocalDate.dayOfMonth ), scrollState = scrollState, - isStartedMission = missionUiModel.missionDetailResponse.isStartedMission(), - hasEnoughPeople = missionVerificationUiModel.missionVerificationsResponse.missionVerifications.size != 1 + profile = missionVerificationUiModel.missionVerificationsResponse.missionVerifications.first(), + missionState = missionState ) BoardTopView( title = missionUiModel.missionDetailResponse.description, @@ -171,15 +180,15 @@ fun BoardScreen( ) - if (!(missionUiModel.missionDetailResponse.isStartedMission() - && missionVerificationUiModel.missionVerificationsResponse.missionVerifications.size != 1)) { + if (!missionState.enabledVerification()) { Box( modifier = Modifier .wrapContentSize() .padding( top = 180.dp, bottom = if (missionUiModel.missionDetailResponse.isStartedMission() - && missionVerificationUiModel.missionVerificationsResponse.missionVerifications.size != 1) 188.dp else 46.dp + && missionVerificationUiModel.missionVerificationsResponse.missionVerifications.size != 1 + ) 188.dp else 46.dp ) .align(Alignment.Center), contentAlignment = Alignment.TopCenter, @@ -203,94 +212,14 @@ fun BoardScreen( } else { BoardBottomView( modifier = Modifier.align(Alignment.BottomCenter), - onClickButton = { - - } + missionState = missionState, + onClickButton = onClickVerification ) } - }else { + } else { CircularProgressIndicator( modifier = Modifier.align(Alignment.Center) ) } } } - -@Composable -fun Board( - scrollState: ScrollState, - boardCount: Int, - passedCount: Int, - isStartedMission: Boolean, - startDateText: String, - missionBoards: List, - modifier: Modifier = Modifier, - numberOfColumns: Int, - hasEnoughPeople : Boolean -) { - Column( - modifier = Modifier - .fillMaxSize() - .navigationBarsPadding() - .verticalScroll(scrollState) - .statusBarsPadding() - .padding( - top = 180.dp, - start = 24.dp, - end = 24.dp, - bottom = if (hasEnoughPeople && isStartedMission) 188.dp else 46.dp - ) - - ) { - - Text( - modifier = Modifier.padding(top = 28.dp), - text = startDateText, - style = MissionMateTypography.heading_md_bold, - color = ColorGray1_FF404249 - ) - Text( - modifier = Modifier.padding(top = 2.dp, bottom = 20.dp), - text = stringResource(id = R.string.board_before_start_description), - style = MissionMateTypography.body_lg_bold, - color = ColorGray2_FF4F505C - ) - BoxWithConstraints { - val width = maxWidth - Column { - BoardUtil.getBlockListByBoardCount( - boardCount, - numberOfColumns, - passedCount - ).chunked(numberOfColumns).forEach { - Row() { - it.forEach { - Block( - index = it.index, - eventType = it.blockEventType, - type = it.blockType, modifier = Modifier - .weight(1f) - .aspectRatio(1f), - numberOfColumns = numberOfColumns, - isPassed = it.isPassed, - isStartedMission = isStartedMission - ) - } - } - } - } - if (hasEnoughPeople) { - missionBoards.forEach { block -> - if (block.missionBoardMembers.isNotEmpty()) { - Piece( - index = block.number, - sizePerBlock = width / numberOfColumns, - numberOfColumn = numberOfColumns, - imageId = block.missionBoardMembers.first().characterType.toCharacter().imageId - ) - } - } - } - } - } -} \ No newline at end of file diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardViewModel.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardViewModel.kt index ce3b7ca7..3687e09c 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardViewModel.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardViewModel.kt @@ -7,18 +7,28 @@ import com.goalpanzi.mission_mate.core.domain.usecase.DeleteMissionUseCase import com.goalpanzi.mission_mate.core.domain.usecase.GetMissionBoardsUseCase import com.goalpanzi.mission_mate.core.domain.usecase.GetMissionUseCase import com.goalpanzi.mission_mate.core.domain.usecase.GetMissionVerificationsUseCase -import com.goalpanzi.mission_mate.feature.board.model.MissionBoardUiModel -import com.goalpanzi.mission_mate.feature.board.model.MissionUiModel -import com.goalpanzi.mission_mate.feature.board.model.MissionVerificationUiModel +import com.goalpanzi.mission_mate.feature.board.model.MissionState +import com.goalpanzi.mission_mate.feature.board.model.MissionState.Companion.getMissionState +import com.goalpanzi.mission_mate.feature.board.model.uimodel.MissionBoardUiModel +import com.goalpanzi.mission_mate.feature.board.model.uimodel.MissionUiModel +import com.goalpanzi.mission_mate.feature.board.model.uimodel.MissionVerificationUiModel import com.luckyoct.core.model.base.NetworkResult +import com.luckyoct.core.model.response.BoardReward +import com.luckyoct.core.model.response.MissionBoardsResponse import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.shareIn +import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import javax.inject.Inject @@ -31,8 +41,8 @@ class BoardViewModel @Inject constructor( savedStateHandle: SavedStateHandle ) : ViewModel() { - private val missionId : Long = savedStateHandle.get("missionId")!! - + private val missionId: Long = savedStateHandle.get("missionId")!! + private val _deleteMissionResultEvent = MutableSharedFlow() val deleteMissionResultEvent: SharedFlow = _deleteMissionResultEvent.asSharedFlow() @@ -49,7 +59,38 @@ class BoardViewModel @Inject constructor( val missionVerificationUiModel: StateFlow = _missionVerificationUiModel.asStateFlow() + val missionState: StateFlow = + combine( + missionBoardUiModel.filter { it is MissionBoardUiModel.Success }, + missionUiModel.filter { it is MissionUiModel.Success }, + missionVerificationUiModel.filter { it is MissionVerificationUiModel.Success } + ) { missionBoard, mission, missionVerification -> + getMissionState(missionBoard, mission, missionVerification) + }.stateIn( + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(500), + initialValue = MissionState.LOADING + ) + + val boardRewardEvent: SharedFlow = missionBoardUiModel.map { + when (it) { + is MissionBoardUiModel.Success -> { + it.missionBoardsResponse.missionBoards.find { result -> + result.isMyPosition && result.number != 0 && result.number != it.missionBoardsResponse.missionBoards.size + }?.reward + } + + else -> { + null + } + } + }.shareIn( + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(500) + ) + fun getMissionBoards() { + viewModelScope.launch { _missionBoardUiModel.emit(MissionBoardUiModel.Loading) @@ -59,14 +100,17 @@ class BoardViewModel @Inject constructor( }.collect { when (it) { is NetworkResult.Success -> { - _missionBoardUiModel.emit(MissionBoardUiModel.Success(it.data)) + _missionBoardUiModel.emit( + MissionBoardUiModel.Success( + it.data + ) + ) } else -> { _missionBoardUiModel.emit(MissionBoardUiModel.Error) } } - } } } @@ -117,4 +161,8 @@ class BoardViewModel @Inject constructor( } } } + + fun verify() { + + } } \ No newline at end of file diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/util/BoardUtil.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/util/BoardGenerator.kt similarity index 72% rename from feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/util/BoardUtil.kt rename to feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/util/BoardGenerator.kt index 3a39e91c..3264a598 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/util/BoardUtil.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/util/BoardGenerator.kt @@ -2,30 +2,17 @@ package com.goalpanzi.mission_mate.feature.board.util import com.goalpanzi.mission_mate.feature.board.model.BlockEventType import com.goalpanzi.mission_mate.feature.board.model.BlockType -import com.goalpanzi.mission_mate.feature.board.model.BlockUiModel +import com.goalpanzi.mission_mate.feature.board.model.uimodel.BlockUiModel import com.goalpanzi.mission_mate.feature.board.model.BoardEventItem -import com.goalpanzi.mission_mate.feature.board.model.EventType -object BoardUtil { +object BoardGenerator { - val indicesForPresent = - listOf( - BoardEventItem(1, EventType.Orange), - BoardEventItem(3, EventType.Flower), - BoardEventItem(6, EventType.Stone), - BoardEventItem(9, EventType.Horse), - BoardEventItem(13, EventType.Mountain), - BoardEventItem(17, EventType.Waterfall), - BoardEventItem(21, EventType.Pig), - BoardEventItem(25, EventType.Bong), - BoardEventItem(29, EventType.GreenTea), - BoardEventItem(31, EventType.Sea) - ) fun getBlockListByBoardCount( boardCount: Int, numberOfColumns: Int, - passedCount: Int + passedCount: Int, + eventList: List ): List { val quotient = boardCount / (numberOfColumns * 2) @@ -40,20 +27,29 @@ object BoardUtil { numberOfColumns, numberOfColumns, boardCount, - passedCount + passedCount, + eventList ) getBottomRow( blockList, - innerQuotient, numberOfColumns, numberOfColumns * 2, boardCount, passedCount + innerQuotient, numberOfColumns, numberOfColumns * 2, boardCount, passedCount, + eventList ) } if (remainder != 0) { if (remainder in 1..numberOfColumns) { - getTopRow(blockList, quotient, numberOfColumns, remainder, boardCount, passedCount) + getTopRow( + blockList, quotient, numberOfColumns, remainder, boardCount, passedCount, + eventList + ) } else { - getTopRow(blockList, quotient, numberOfColumns, remainder, boardCount, passedCount) + getTopRow( + blockList, quotient, numberOfColumns, remainder, boardCount, passedCount, + eventList + ) getBottomRow( - blockList, quotient, numberOfColumns, remainder, boardCount, passedCount + blockList, quotient, numberOfColumns, remainder, boardCount, passedCount, + eventList ) } } @@ -66,7 +62,8 @@ object BoardUtil { numberOfColumns: Int, remainder: Int, boardCount: Int, - passedCount: Int + passedCount: Int, + indicesForPresent: List ) { for (i in 1..numberOfColumns) { val index = quotient * numberOfColumns * 2 + i - 1 @@ -77,13 +74,13 @@ object BoardUtil { index = index, blockType = if (quotient * numberOfColumns * 2 + i - 1 == 0) BlockType.START - else if(index == boardCount - 1) BlockType.CENTER + else if (index == boardCount - 1) BlockType.CENTER else if (i > remainder) BlockType.EMPTY else if (i == 1) BlockType.BOTTOM_LEFT_CORNER else if (i == numberOfColumns) BlockType.TOP_RIGHT_CORNER else BlockType.CENTER, blockEventType = - if (index == boardCount-1) BlockEventType.Goal + if (index == boardCount - 1) BlockEventType.Goal else if (itemEvent != null) BlockEventType.Item(itemEvent) else BlockEventType.None, isEvenGroup = quotient % 2 == 0, @@ -99,7 +96,8 @@ object BoardUtil { numberOfColumns: Int, remainder: Int, boardCount: Int, - passedCount: Int + passedCount: Int, + indicesForPresent: List ) { for (i in numberOfColumns * 2 downTo numberOfColumns + 1) { val index = quotient * (numberOfColumns * 2) + i - 1 @@ -109,13 +107,13 @@ object BoardUtil { index = index, blockType = if (i > remainder && remainder != 0) BlockType.EMPTY - else if(index == boardCount - 1) BlockType.CENTER + else if (index == boardCount - 1) BlockType.CENTER else if (i == numberOfColumns + 1) BlockType.BOTTOM_RIGHT_CORNER else if (i == numberOfColumns * 2) BlockType.TOP_LEFT_CORNER else BlockType.CENTER, isEvenGroup = quotient % 2 == 0, blockEventType = - if (index == boardCount-1) BlockEventType.Goal + if (index == boardCount - 1) BlockEventType.Goal else if (itemEvent != null) BlockEventType.Item(itemEvent) else BlockEventType.None, isPassed = index <= passedCount diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/util/PieceUtil.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/util/PieceGenerator.kt similarity index 96% rename from feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/util/PieceUtil.kt rename to feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/util/PieceGenerator.kt index b34d0bf3..db05cf52 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/util/PieceUtil.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/util/PieceGenerator.kt @@ -2,7 +2,7 @@ package com.goalpanzi.mission_mate.feature.board.util import androidx.compose.ui.unit.Dp -object PieceUtil { +object PieceGenerator { fun getXOffset( index : Int, diff --git a/feature/board/src/main/res/drawable/img_beach_full.png b/feature/board/src/main/res/drawable/img_beach_full.png new file mode 100644 index 00000000..ecbcb227 Binary files /dev/null and b/feature/board/src/main/res/drawable/img_beach_full.png differ diff --git a/feature/board/src/main/res/drawable/img_black_pig_full.png b/feature/board/src/main/res/drawable/img_black_pig_full.png new file mode 100644 index 00000000..18d894a5 Binary files /dev/null and b/feature/board/src/main/res/drawable/img_black_pig_full.png differ diff --git a/feature/board/src/main/res/drawable/img_canola_flower_full.png b/feature/board/src/main/res/drawable/img_canola_flower_full.png new file mode 100644 index 00000000..bc6030de Binary files /dev/null and b/feature/board/src/main/res/drawable/img_canola_flower_full.png differ diff --git a/feature/board/src/main/res/drawable/img_default_move.png b/feature/board/src/main/res/drawable/img_default_move.png new file mode 100644 index 00000000..d62f7560 Binary files /dev/null and b/feature/board/src/main/res/drawable/img_default_move.png differ diff --git a/feature/board/src/main/res/drawable/img_dolharubang_full.png b/feature/board/src/main/res/drawable/img_dolharubang_full.png new file mode 100644 index 00000000..d5054a7b Binary files /dev/null and b/feature/board/src/main/res/drawable/img_dolharubang_full.png differ diff --git a/feature/board/src/main/res/drawable/img_green_tea_field_full.png b/feature/board/src/main/res/drawable/img_green_tea_field_full.png new file mode 100644 index 00000000..0b59f097 Binary files /dev/null and b/feature/board/src/main/res/drawable/img_green_tea_field_full.png differ diff --git a/feature/board/src/main/res/drawable/img_halla_mountain_full.png b/feature/board/src/main/res/drawable/img_halla_mountain_full.png new file mode 100644 index 00000000..8e68b4ed Binary files /dev/null and b/feature/board/src/main/res/drawable/img_halla_mountain_full.png differ diff --git a/feature/board/src/main/res/drawable/img_horse_riding_full.png b/feature/board/src/main/res/drawable/img_horse_riding_full.png new file mode 100644 index 00000000..8c1fe944 Binary files /dev/null and b/feature/board/src/main/res/drawable/img_horse_riding_full.png differ diff --git a/feature/board/src/main/res/drawable/img_orange_full.png b/feature/board/src/main/res/drawable/img_orange_full.png new file mode 100644 index 00000000..6bc0660e Binary files /dev/null and b/feature/board/src/main/res/drawable/img_orange_full.png differ diff --git a/feature/board/src/main/res/drawable/img_sunrise_full.png b/feature/board/src/main/res/drawable/img_sunrise_full.png new file mode 100644 index 00000000..d3390148 Binary files /dev/null and b/feature/board/src/main/res/drawable/img_sunrise_full.png differ diff --git a/feature/board/src/main/res/drawable/img_waterfall_full.png b/feature/board/src/main/res/drawable/img_waterfall_full.png new file mode 100644 index 00000000..20010e5a Binary files /dev/null and b/feature/board/src/main/res/drawable/img_waterfall_full.png differ diff --git a/feature/board/src/main/res/values/strings.xml b/feature/board/src/main/res/values/strings.xml index c6f50d5b..cceda091 100644 --- a/feature/board/src/main/res/values/strings.xml +++ b/feature/board/src/main/res/values/strings.xml @@ -15,5 +15,21 @@ 시작일까지 아무도 오지않아\n미션보드를 삭제할게요. 미션보드는 삭제되고\n초기화면으로 이동해요. + 인증완료!!\n한 칸 이동했어요. + 대단해요. 오늘도 해냈어요. + 인증완료!!\n\‘%s\’를 획득했어요! + 꾸준히 하면 재밌는 이벤트가 또 나타날걸요? + + 감귤 먹기 + 유채꽃 보기 + 돌하르방 만나기 + 승마 체험하기 + 한라산 등반하기 + 폭포 감상하기 + 흑돼지 먹기 + 성산일출봉 보기 + 녹차밭 + 바다 보기 + 확인 \ No newline at end of file diff --git a/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/BoardUtilUnitTest.kt b/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/BoardUtilUnitTest.kt deleted file mode 100644 index 69a4c14b..00000000 --- a/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/BoardUtilUnitTest.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.goalpanzi.mission_mate.feature.board - -import com.goalpanzi.mission_mate.feature.board.util.BoardUtil -import org.junit.Test - -import org.junit.Assert.* - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class BoardUtilUnitTest { - @Test - fun getBlockListByBoardCount_isCorrect() { - BoardUtil.getBlockListByBoardCount(11,3,4).let { - - } - } -} \ No newline at end of file diff --git a/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateAsInProgressTest.kt b/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateAsInProgressTest.kt new file mode 100644 index 00000000..debcdb94 --- /dev/null +++ b/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateAsInProgressTest.kt @@ -0,0 +1,94 @@ +package com.goalpanzi.mission_mate.feature.board.util.boardmanager + +import com.goalpanzi.mission_mate.feature.board.model.MissionState +import com.goalpanzi.mission_mate.feature.board.model.MissionState.Companion.getMissionStateAsInProgress +import com.goalpanzi.mission_mate.feature.onboarding.model.VerificationTimeType +import com.luckyoct.core.model.response.MissionVerificationResponse +import org.junit.Assert.assertEquals +import org.junit.Test +import java.time.DayOfWeek +import java.time.LocalDate +import java.time.LocalDateTime + +class MissionStateAsInProgressTest { + + @Test + fun 오늘이_인증_요일이고_현재_시간이_인증_시간대_이전일_때_IN_PROGRESS_MISSION_DAY_NON_MISSION_TIME를_반환한다() { + val todayLocalDate = LocalDate.of(2024, 8, 14) // 수요일 + val todayLocalDateTime = LocalDateTime.of(2024, 8, 14, 11, 59, 59) + val daysOfWeek = listOf(DayOfWeek.WEDNESDAY, DayOfWeek.FRIDAY) + val verificationTimeType = VerificationTimeType.AFTERNOON + val memberList = listOf( + MissionVerificationResponse( + nickname = "", + image = "" + ) + ) + + val result = getMissionStateAsInProgress(todayLocalDate, todayLocalDateTime, daysOfWeek, verificationTimeType, memberList) + + assertEquals(MissionState.IN_PROGRESS_MISSION_DAY_NON_MISSION_TIME, result) + } + + @Test + fun 오늘이_인증_요일이고_현재_시간이_인증_시간대_이후일_때_IN_PROGRESS_MISSION_DAY_CLOSED를_반환한다() { + val todayLocalDate = LocalDate.of(2024, 8, 14) // 수요일 + val todayLocalDateTime = LocalDateTime.of(2024, 8, 14, 12, 0, 0) + val daysOfWeek = listOf(DayOfWeek.WEDNESDAY, DayOfWeek.FRIDAY) + val verificationTimeType = VerificationTimeType.MORNING + val memberList = listOf( + MissionVerificationResponse( + nickname = "", + image = "" + ) + ) + + val result = getMissionStateAsInProgress(todayLocalDate, todayLocalDateTime, daysOfWeek, verificationTimeType, memberList) + + assertEquals(MissionState.IN_PROGRESS_MISSION_DAY_CLOSED, result) + } + + @Test + fun 오늘이_인증_요일이고_현재_시간이_인증_시간대일_때_인증한_이미지_데이터가_없으면_IN_PROGRESS_MISSION_DAY_BEFORE_CONFIRM를_반환한다() { + val todayLocalDate = LocalDate.of(2024, 8, 14) // 수요일 + val todayLocalDateTime = LocalDateTime.of(2024, 8, 14, 10, 0, 0) + val daysOfWeek = listOf(DayOfWeek.WEDNESDAY, DayOfWeek.FRIDAY) + val verificationTimeType = VerificationTimeType.MORNING + val memberList = listOf( + MissionVerificationResponse( + nickname = "", + image = "" + ) + ) + + val result = getMissionStateAsInProgress(todayLocalDate, todayLocalDateTime, daysOfWeek, verificationTimeType, memberList) + + assertEquals(MissionState.IN_PROGRESS_MISSION_DAY_BEFORE_CONFIRM, result) + } + + @Test + fun 오늘이_인증_요일이고_현재_시간이_인증_시간대일_때_인증한_이미지_데이터가_있으면_IN_PROGRESS_MISSION_DAY_AFTER_CONFIRM를_반환한다() { + val todayLocalDate = LocalDate.of(2024, 8, 14) // 수요일 + val todayLocalDateTime = LocalDateTime.of(2024, 8, 14, 10, 0, 0) + val daysOfWeek = listOf(DayOfWeek.WEDNESDAY, DayOfWeek.FRIDAY) + val verificationTimeType = VerificationTimeType.MORNING + val memberList = listOf(MissionVerificationResponse(nickname = "user", image = "image_url")) + + val result = getMissionStateAsInProgress(todayLocalDate, todayLocalDateTime, daysOfWeek, verificationTimeType, memberList) + + assertEquals(MissionState.IN_PROGRESS_MISSION_DAY_AFTER_CONFIRM, result) + } + + @Test + fun 오늘이_인증_요일이_아니면_IN_PROGRESS_NON_MISSION_DAY를_반환한다() { + val todayLocalDate = LocalDate.of(2024, 8, 13) // 화요일 + val todayLocalDateTime = LocalDateTime.of(2024, 8, 13, 10, 0, 0) + val daysOfWeek = listOf(DayOfWeek.WEDNESDAY, DayOfWeek.FRIDAY) + val verificationTimeType = VerificationTimeType.MORNING + val memberList = emptyList() + + val result = getMissionStateAsInProgress(todayLocalDate, todayLocalDateTime, daysOfWeek, verificationTimeType, memberList) + + assertEquals(MissionState.IN_PROGRESS_NON_MISSION_DAY, result) + } +} \ No newline at end of file diff --git a/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateTest.kt b/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateTest.kt new file mode 100644 index 00000000..ad32454d --- /dev/null +++ b/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateTest.kt @@ -0,0 +1,123 @@ +package com.goalpanzi.mission_mate.feature.board.util.boardmanager + +import com.goalpanzi.mission_mate.feature.board.model.MissionState +import com.goalpanzi.mission_mate.feature.board.model.MissionState.Companion.getMissionState +import com.goalpanzi.mission_mate.feature.onboarding.model.VerificationTimeType +import com.luckyoct.core.model.response.MissionVerificationResponse +import org.junit.Assert.assertEquals +import org.junit.Test +import java.time.DayOfWeek +import java.time.LocalDate +import java.time.LocalDateTime +import kotlin.test.assertNotEquals + +class MissionStateTest { + + @Test + fun 현재_날짜가_인증_시작일이고_멤버_수가_1이하_일때_DELETABLE를_반환한다() { + val todayLocalDateTime = LocalDateTime.of(2024, 8, 14, 10, 0, 0) // 오전 10시 + val startDate = LocalDate.of(2024, 8, 14) // 시작 날짜가 오늘 + val endDateTime = LocalDateTime.of(2024, 8, 15, 23, 59, 59) + val memberList = emptyList() + val verificationTimeType = VerificationTimeType.MORNING + val daysOfWeek = listOf(DayOfWeek.WEDNESDAY, DayOfWeek.FRIDAY) + + val result = getMissionState( + todayLocalDateTime, + startDate, + endDateTime, + memberList, + verificationTimeType, + daysOfWeek + ) + assertEquals(MissionState.DELETABLE, result) + } + + @Test + fun 현재_날짜가_인증_시작일_이후이고_멤버_수가_1이하_일때_DELETABLE를_반환한다() { + val todayLocalDateTime = LocalDateTime.of(2024, 8, 16, 10, 0, 0) // 오전 10시 + val startDate = LocalDate.of(2024, 8, 14) + val endDateTime = LocalDateTime.of(2024, 8, 15, 23, 59, 59) + val memberList = emptyList() + val verificationTimeType = VerificationTimeType.MORNING + val daysOfWeek = listOf(DayOfWeek.WEDNESDAY, DayOfWeek.FRIDAY) + + val result = getMissionState( + todayLocalDateTime, + startDate, + endDateTime, + memberList, + verificationTimeType, + daysOfWeek + ) + assertEquals(MissionState.DELETABLE, result) + } + + @Test + fun 현재_날짜가_인증_시작일_이전이고_멤버_수가_1이하_일때_PRE_START_SOLO를_반환한다() { + val todayLocalDateTime = LocalDateTime.of(2024, 8, 14, 10, 0, 0) + val startDate = LocalDate.of(2024, 8, 15) + val endDateTime = LocalDateTime.of(2024, 8, 20, 23, 59, 59) + val memberList = listOf(MissionVerificationResponse(nickname = "user", image = "image_url")) + val verificationTimeType = VerificationTimeType.MORNING + val daysOfWeek = listOf(DayOfWeek.WEDNESDAY, DayOfWeek.FRIDAY) + + val result = getMissionState(todayLocalDateTime, startDate, endDateTime, memberList, verificationTimeType, daysOfWeek) + assertEquals(MissionState.PRE_START_SOLO, result) + } + + @Test + fun 현재_날짜가_인증_시작일_이전이고_멤버_수가_2이상_일때_PRE_START_MULTI를_반환한다() { + val todayLocalDateTime = LocalDateTime.of(2024, 8, 14, 10, 0, 0) + val startDate = LocalDate.of(2024, 8, 15) + val endDateTime = LocalDateTime.of(2024, 8, 20, 23, 59, 59) + val memberList = listOf( + MissionVerificationResponse(nickname = "user1", image = "image_url"), + MissionVerificationResponse(nickname = "user2", image = "image_url") + ) + val verificationTimeType = VerificationTimeType.MORNING + val daysOfWeek = listOf(DayOfWeek.WEDNESDAY, DayOfWeek.FRIDAY) + + val result = getMissionState(todayLocalDateTime, startDate, endDateTime, memberList, verificationTimeType, daysOfWeek) + assertEquals(MissionState.PRE_START_MULTI, result) + } + + @Test + fun 현재_날짜가_인증_마감일_이후일_때_POST_END를_반환한다() { + val todayLocalDateTime = LocalDateTime.of(2024, 8, 16, 0, 0, 0) + val startDate = LocalDate.of(2024, 8, 13) + val endDateTime = LocalDateTime.of(2024, 8, 15, 23, 59, 59) + val memberList = listOf(MissionVerificationResponse(nickname = "user", image = "image_url")) + val verificationTimeType = VerificationTimeType.MORNING + val daysOfWeek = listOf(DayOfWeek.WEDNESDAY, DayOfWeek.FRIDAY) + + val result = getMissionState(todayLocalDateTime, startDate, endDateTime, memberList, verificationTimeType, daysOfWeek) + assertEquals(MissionState.POST_END, result) + } + + @Test + fun 인증_시간대가_오전이고_현재_날짜가_인증_마감일이고_현재_시간이_인증_마감_시간_이후일_때_POST_END를_반환한다() { + val todayLocalDateTime = LocalDateTime.of(2024, 8, 15, 12, 0, 0) + val startDate = LocalDate.of(2024, 8, 13) + val endDateTime = LocalDateTime.of(2024, 8, 15, 0, 0, 0) + val memberList = listOf(MissionVerificationResponse(nickname = "user", image = "image_url")) + val verificationTimeType = VerificationTimeType.MORNING + val daysOfWeek = listOf(DayOfWeek.WEDNESDAY, DayOfWeek.FRIDAY) + + val result = getMissionState(todayLocalDateTime, startDate, endDateTime, memberList, verificationTimeType, daysOfWeek) + assertEquals(MissionState.POST_END, result) + } + + @Test + fun 인증_시간대가_오전이_아니고_현재_날짜가_인증_마감일일_때_POST_END를_반환하지_않는다() { + val todayLocalDateTime = LocalDateTime.of(2024, 8, 15, 12, 0, 0) + val startDate = LocalDate.of(2024, 8, 13) + val endDateTime = LocalDateTime.of(2024, 8, 15, 0, 0, 0) + val memberList = listOf(MissionVerificationResponse(nickname = "user", image = "image_url")) + val verificationTimeType = VerificationTimeType.AFTERNOON + val daysOfWeek = listOf(DayOfWeek.WEDNESDAY, DayOfWeek.FRIDAY) + + val result = getMissionState(todayLocalDateTime, startDate, endDateTime, memberList, verificationTimeType, daysOfWeek) + assertNotEquals(MissionState.POST_END, result) + } +} \ No newline at end of file diff --git a/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateUtilityMethodTests.kt b/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateUtilityMethodTests.kt new file mode 100644 index 00000000..07a3cf9a --- /dev/null +++ b/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateUtilityMethodTests.kt @@ -0,0 +1,151 @@ +package com.goalpanzi.mission_mate.feature.board.util.boardmanager + +import com.goalpanzi.mission_mate.feature.board.model.MissionState.Companion.isPassedEndTime +import com.goalpanzi.mission_mate.feature.board.model.MissionState.Companion.isTodayMissionDay +import com.goalpanzi.mission_mate.feature.board.model.MissionState.Companion.isVerifiedInMissionTime +import com.goalpanzi.mission_mate.feature.onboarding.model.VerificationTimeType +import com.luckyoct.core.model.response.MissionVerificationResponse +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test +import java.time.DayOfWeek +import java.time.LocalDate +import java.time.LocalDateTime + +class MissionStateUtilityMethodTests { + + // 인증 시간대가 오전이고 현재 날짜가 인증 종료일이고 현재 시간이 인증 시간대 이내라면 false를 반환한다 + @Test + fun isPassedEndTime_MorningBeforeEnd_ReturnsFalse() { + val todayLocalDateTime = LocalDateTime.of(2024, 8, 11, 10, 0, 0) + val endDateTime = LocalDateTime.of(2024, 8, 11, 11, 59, 59) + val verificationTimeType = VerificationTimeType.MORNING + + val result = isPassedEndTime(todayLocalDateTime, endDateTime, verificationTimeType) + assertFalse(result) + } + + // 인증 시간대가 오전이고 현재 날짜가 인증 종료일이고 현재 시간이 인증 시간대 이내가 아니라면 true를 반환한다 + @Test + fun isPassedEndTime_MorningAfterEnd_ReturnsTrue() { + val todayLocalDateTime = LocalDateTime.of(2024, 8, 11, 12, 0, 0) + val endDateTime = LocalDateTime.of(2024, 8, 11, 11, 59, 59) + val verificationTimeType = VerificationTimeType.MORNING + + val result = isPassedEndTime(todayLocalDateTime, endDateTime, verificationTimeType) + assertTrue(result) + } + + // 인증 시간대가 오후이고 현재 날짜가 인증 종료일이고 현재 시간이 인증 시간대 이내라면 false를 반환한다 + @Test + fun isPassedEndTime_AfternoonBeforeEnd_ReturnsFalse() { + val todayLocalDateTime = LocalDateTime.of(2024, 8, 11, 22, 0, 0) + val endDateTime = LocalDateTime.of(2024, 8, 11, 23, 59, 59) + val verificationTimeType = VerificationTimeType.AFTERNOON + + val result = isPassedEndTime(todayLocalDateTime, endDateTime, verificationTimeType) + assertFalse(result) + } + + // 인증 시간대가 오후이고 현재 날짜가 인증 종료일이고 현재 시간이 인증 시간대 이내가 아니라면 true를 반환한다 + @Test + fun isPassedEndTime_AfternoonAfterEnd_ReturnsTrue() { + val todayLocalDateTime = LocalDateTime.of(2024, 8, 12, 0, 0, 0) + val endDateTime = LocalDateTime.of(2024, 8, 11, 23, 59, 59) + val verificationTimeType = VerificationTimeType.AFTERNOON + + val result = isPassedEndTime(todayLocalDateTime, endDateTime, verificationTimeType) + assertTrue(result) + } + + // 인증 시간대가 종일이고 현재 날짜가 인증 종료일이고 현재 시간이 인증 시간대 이내라면 false를 반환한다 + @Test + fun isPassedEndTime_EverydayBeforeEnd_ReturnsFalse() { + val todayLocalDateTime = LocalDateTime.of(2024, 8, 11, 22, 0, 0) + val endDateTime = LocalDateTime.of(2024, 8, 11, 23, 59, 59) + val verificationTimeType = VerificationTimeType.EVERYDAY + + val result = isPassedEndTime(todayLocalDateTime, endDateTime, verificationTimeType) + assertFalse(result) + } + + // 인증 시간대가 종일이고 현재 날짜가 인증 종료일 이후라면 true를 반환한다 + @Test + fun isPassedEndTime_EverydayAfterEnd_ReturnsTrue() { + val todayLocalDateTime = LocalDateTime.of(2024, 8, 12, 0, 0, 0) + val endDateTime = LocalDateTime.of(2024, 8, 11, 23, 59, 59) + val verificationTimeType = VerificationTimeType.EVERYDAY + + val result = isPassedEndTime(todayLocalDateTime, endDateTime, verificationTimeType) + assertTrue(result) + } + + // 현재 날짜가 인증 종료일 이전이라면 false를 반환한다 + @Test + fun isPassedEndTime_BeforeEndDate_ReturnsFalse() { + val todayLocalDateTime = LocalDateTime.of(2024, 8, 10, 23, 59, 59) + val endDateTime = LocalDateTime.of(2024, 8, 11, 23, 59, 59) + val verificationTimeType = VerificationTimeType.EVERYDAY + + val result = isPassedEndTime(todayLocalDateTime, endDateTime, verificationTimeType) + assertFalse(result) + } + + // 미션 인증 요일 목록에 특정 요일이 포함되어 있으면 true를 반환한다 + @Test + fun isTodayMissionDay_ContainsToday_ReturnsTrue() { + val today = LocalDate.of(2024, 8, 14) // 수요일 + val missionDaysOfWeek = listOf(DayOfWeek.WEDNESDAY, DayOfWeek.FRIDAY) + + val result = isTodayMissionDay(today, missionDaysOfWeek) + assertTrue(result) + } + + // 미션 인증 요일 목록에 특정 요일이 포함되어 있지 않으면 false를 반환한다 + @Test + fun isTodayMissionDay_DoesNotContainToday_ReturnsFalse() { + val today = LocalDate.of(2024, 8, 14) // 수요일 + val missionDaysOfWeek = listOf(DayOfWeek.MONDAY, DayOfWeek.FRIDAY) + + val result = isTodayMissionDay(today, missionDaysOfWeek) + assertFalse(result) + } + + // 미션 인증 요일 목록이 빈 리스트이면 false를 반환한다 + @Test + fun isTodayMissionDay_EmptyList_ReturnsFalse() { + val today = LocalDate.of(2024, 8, 14) // 수요일 + val missionDaysOfWeek = emptyList() + + val result = isTodayMissionDay(today, missionDaysOfWeek) + assertFalse(result) + } + + // 인증 멤버 목록이 비어있으면 false를 반환한다 + @Test + fun isVerifiedInMissionTime_EmptyList_ReturnsFalse() { + val memberList = emptyList() + val result = isVerifiedInMissionTime(memberList) + assertFalse(result) + } + + // 인증 멤버 목록이 비어있지 않고 첫 항목의 이미지가 빈 문자열이면 false를 반환한다 + @Test + fun isVerifiedInMissionTime_FirstImageEmpty_ReturnsFalse() { + val memberList = listOf( + MissionVerificationResponse(nickname = "", image = "") + ) + val result = isVerifiedInMissionTime(memberList) + assertFalse(result) + } + + // 인증 멤버 목록이 비어있지 않고 첫 항목의 이미지가 빈 문자열이 아니면 true를 반환한다 + @Test + fun isVerifiedInMissionTime_FirstImageNotEmpty_ReturnsTrue() { + val memberList = listOf( + MissionVerificationResponse(nickname = "", image = "image_url") + ) + val result = isVerifiedInMissionTime(memberList) + assertTrue(result) + } +} diff --git a/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/component/OutlinedBox.kt b/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/component/OutlinedBox.kt index 1d04ec3c..350077e4 100644 --- a/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/component/OutlinedBox.kt +++ b/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/component/OutlinedBox.kt @@ -1,6 +1,7 @@ package com.goalpanzi.mission_mate.feature.onboarding.component import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues @@ -15,30 +16,61 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shape import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.goalpanzi.mission_mate.core.designsystem.theme.ColorGray1_FF404249 import com.goalpanzi.mission_mate.core.designsystem.theme.ColorOrange_FFFF5732 +import com.goalpanzi.mission_mate.core.designsystem.theme.ColorWhite_FFFFFFFF import com.goalpanzi.mission_mate.core.designsystem.theme.MissionMateTypography @Composable fun OutlinedTextBox( - text : String, + text: String, modifier: Modifier = Modifier, borderStroke: BorderStroke = BorderStroke(1.dp, ColorOrange_FFFF5732), shape: Shape = RoundedCornerShape(50), - contentPadding : PaddingValues = PaddingValues(vertical = 1.dp, horizontal = 14.dp), + contentPadding: PaddingValues = PaddingValues(vertical = 1.dp, horizontal = 14.dp), textStyle: TextStyle = MissionMateTypography.body_xl_regular, - textColor : Color = ColorOrange_FFFF5732 -){ + textColor: Color = ColorOrange_FFFF5732 +) { Box( modifier = modifier .border(borderStroke, shape) .padding(contentPadding), contentAlignment = Alignment.Center - ){ + ) { Text( text = text, style = textStyle, color = textColor ) } +} + +@Composable +fun OutlinedBox( + modifier: Modifier = Modifier, + backgroundColor: Color = ColorGray1_FF404249, + borderStroke: BorderStroke = BorderStroke((0.5f).dp, ColorWhite_FFFFFFFF), + shape: Shape = RoundedCornerShape(16.dp), + contentPadding: PaddingValues = PaddingValues(vertical = 1.dp, horizontal = 4.dp), + content: @Composable () -> Unit +) { + Box( + modifier = modifier + .background(color = backgroundColor, shape = shape) + .border(borderStroke, shape) + .padding(contentPadding), + contentAlignment = Alignment.Center + ) { + content() + } +} + +@Preview +@Composable +private fun PreviewOutlinedBox() { + OutlinedBox { + Text("test") + } } \ No newline at end of file diff --git a/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/model/MissionUiModel.kt b/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/model/MissionUiModel.kt index a39771b3..efe5fecb 100644 --- a/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/model/MissionUiModel.kt +++ b/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/model/MissionUiModel.kt @@ -16,7 +16,7 @@ fun MissionDetailResponse.toMissionUiModel() = missionId = missionId, missionTitle = description, missionPeriod = missionPeriod, - missionDays = missionDaysOfWeek, + missionDays = missionDaysOfWeekTextLocale, missionTime = VerificationTimeType.valueOf(timeOfDay), missionBoardCount = boardCount ) \ No newline at end of file diff --git a/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/model/VerificationTimeType.kt b/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/model/VerificationTimeType.kt index 71b9ebc0..8a41cf21 100644 --- a/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/model/VerificationTimeType.kt +++ b/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/model/VerificationTimeType.kt @@ -2,11 +2,21 @@ package com.goalpanzi.mission_mate.feature.onboarding.model import androidx.annotation.StringRes import com.goalpanzi.mission_mate.feature.onboarding.R +import java.time.LocalDateTime enum class VerificationTimeType( @StringRes val titleId : Int ) { MORNING(R.string.onboarding_board_setup_verification_time_input_content_am), AFTERNOON(R.string.onboarding_board_setup_verification_time_input_content_pm), - EVERYDAY(R.string.onboarding_board_setup_verification_time_input_content_all) + EVERYDAY(R.string.onboarding_board_setup_verification_time_input_content_all); + + fun getVerificationEndTime( + targetTime : LocalDateTime + ) : LocalDateTime { + return when (this) { + MORNING -> targetTime.withHour(11) + else -> targetTime.withHour(23) + }.withMinute(59).withSecond(59).withNano(999_999_999) + } } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 827a5759..224dff18 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -52,6 +52,12 @@ material = "1.12.0" google-service = "4.4.2" firebase = "33.1.2" +## Lottie +lottie-compose = "6.5.0" + +# ETC +balloon = "1.6.6" + [libraries] ## Koitln kotlin-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" } @@ -115,6 +121,12 @@ material = { group = "com.google.android.material", name = "material", version.r ## Firebase firebase-bom = { group = "com.google.firebase", name = "firebase-bom", version.ref = "firebase" } +## Lottie +lottie-compose = { group = "com.airbnb.android", name = "lottie-compose", version.ref = "lottie-compose"} + +## ETC +balloon = { group = "com.github.skydoves", name = "balloon", version.ref = "balloon" } + [plugins] ## Android gradle plugin android-application = { id = "com.android.application", version.ref = "agp" }