diff --git a/.gitignore b/.gitignore
index 5539efd0..fc7a49f8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -234,4 +234,8 @@ msbuild.binlog
LottieGenOutput-*/
# Visual Studio debugging configuration file.
-launchSettings.json
\ No newline at end of file
+launchSettings.json
+
+# Tests
+**/FramesAll
+**/!Results
\ No newline at end of file
diff --git a/Lottie-Windows.sln b/Lottie-Windows.sln
index b30bd62e..4cbe161d 100644
--- a/Lottie-Windows.sln
+++ b/Lottie-Windows.sln
@@ -171,6 +171,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Lottie-Windows-WinUI3", "Lo
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LottieSamples", "LottieSamples\LottieSamples.csproj", "{6AB50ED0-6273-4919-9ADE-50195664EF15}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LottieTest", "LottieTest\LottieTest.csproj", "{C9DDFDED-8E1D-4161-BD5A-D7186F94798A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LottieGen.dll", "dlls\LottieGen\LottieGen.dll.csproj", "{43C57BC9-B5D0-48CE-9048-314E66D26462}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
BETA|Any CPU = BETA|Any CPU
@@ -613,6 +617,66 @@ Global
{6AB50ED0-6273-4919-9ADE-50195664EF15}.Release|x86.ActiveCfg = Release|x86
{6AB50ED0-6273-4919-9ADE-50195664EF15}.Release|x86.Build.0 = Release|x86
{6AB50ED0-6273-4919-9ADE-50195664EF15}.Release|x86.Deploy.0 = Release|x86
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.BETA|Any CPU.ActiveCfg = Debug|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.BETA|Any CPU.Build.0 = Debug|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.BETA|ARM.ActiveCfg = Debug|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.BETA|ARM.Build.0 = Debug|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.BETA|ARM64.ActiveCfg = Debug|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.BETA|ARM64.Build.0 = Debug|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.BETA|x64.ActiveCfg = Debug|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.BETA|x64.Build.0 = Debug|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.BETA|x86.ActiveCfg = Debug|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.BETA|x86.Build.0 = Debug|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Debug|Any CPU.ActiveCfg = Debug|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Debug|Any CPU.Build.0 = Debug|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Debug|ARM.ActiveCfg = Debug|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Debug|ARM.Build.0 = Debug|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Debug|ARM64.ActiveCfg = Debug|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Debug|ARM64.Build.0 = Debug|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Debug|x64.ActiveCfg = Debug|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Debug|x64.Build.0 = Debug|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Debug|x86.ActiveCfg = Debug|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Debug|x86.Build.0 = Debug|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Release|Any CPU.ActiveCfg = Release|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Release|Any CPU.Build.0 = Release|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Release|ARM.ActiveCfg = Release|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Release|ARM.Build.0 = Release|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Release|ARM64.ActiveCfg = Release|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Release|ARM64.Build.0 = Release|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Release|x64.ActiveCfg = Release|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Release|x64.Build.0 = Release|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Release|x86.ActiveCfg = Release|x64
+ {C9DDFDED-8E1D-4161-BD5A-D7186F94798A}.Release|x86.Build.0 = Release|x64
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.BETA|Any CPU.ActiveCfg = Debug|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.BETA|Any CPU.Build.0 = Debug|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.BETA|ARM.ActiveCfg = Debug|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.BETA|ARM.Build.0 = Debug|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.BETA|ARM64.ActiveCfg = Debug|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.BETA|ARM64.Build.0 = Debug|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.BETA|x64.ActiveCfg = Debug|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.BETA|x64.Build.0 = Debug|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.BETA|x86.ActiveCfg = Debug|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.BETA|x86.Build.0 = Debug|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.Debug|ARM.Build.0 = Debug|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.Debug|x64.Build.0 = Debug|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.Debug|x86.Build.0 = Debug|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.Release|Any CPU.Build.0 = Release|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.Release|ARM.ActiveCfg = Release|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.Release|ARM.Build.0 = Release|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.Release|ARM64.Build.0 = Release|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.Release|x64.ActiveCfg = Release|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.Release|x64.Build.0 = Release|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.Release|x86.ActiveCfg = Release|Any CPU
+ {43C57BC9-B5D0-48CE-9048-314E66D26462}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -651,6 +715,7 @@ Global
{FC89273A-B2DA-4625-8A73-EF02A658D65E} = {AB232F35-AAF7-4AE2-B1D2-45DD9BC2F7D7}
{7654A857-9A99-4185-9F8E-DD0CE662AF23} = {AB232F35-AAF7-4AE2-B1D2-45DD9BC2F7D7}
{DC7F7A39-B7A7-40B4-937A-601460CAE38C} = {AB232F35-AAF7-4AE2-B1D2-45DD9BC2F7D7}
+ {43C57BC9-B5D0-48CE-9048-314E66D26462} = {C75BD686-21A6-4EB3-8D4B-D5A01C019C52}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {51B9BB4C-5196-41CF-950C-12B04AD8A61C}
@@ -664,6 +729,7 @@ Global
source\LottieMetadata\LottieMetadata.projitems*{25ceb8b8-90e0-4d23-9978-0cd83889d4ac}*SharedItemsImports = 5
source\WinUIXamlMediaData\WinUIXamlMediaData.projitems*{30059ca7-0745-4eec-8d11-b14850a70c98}*SharedItemsImports = 13
source\YamlData\YamlData.projitems*{39c6b7f3-5e75-4019-82ab-00fd8a0a06e2}*SharedItemsImports = 13
+ source\LottieGen\LottieGen.projitems*{43c57bc9-b5d0-48ce-9048-314e66d26462}*SharedItemsImports = 5
source\LottieReader\LottieReader.projitems*{4e7d8957-3f5f-46e1-99a8-2012b806c9b0}*SharedItemsImports = 13
source\Animatables\Animatables.projitems*{5120efd7-a556-46bf-8d56-f65f1ef9a305}*SharedItemsImports = 4
source\CompMetadata\CompMetadata.projitems*{5120efd7-a556-46bf-8d56-f65f1ef9a305}*SharedItemsImports = 4
diff --git a/LottieTest/LottieTest.csproj b/LottieTest/LottieTest.csproj
new file mode 100644
index 00000000..4550b8ec
--- /dev/null
+++ b/LottieTest/LottieTest.csproj
@@ -0,0 +1,45 @@
+
+
+
+ Exe
+ net6.0-windows10.0.19041.0
+ 10.0.19041.0
+ 10.0.17763.0
+ enable
+ enable
+ Microsoft
+ x64
+ False
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/LottieTest/NativeMethods.txt b/LottieTest/NativeMethods.txt
new file mode 100644
index 00000000..002c4375
--- /dev/null
+++ b/LottieTest/NativeMethods.txt
@@ -0,0 +1,9 @@
+GetMessage
+TranslateMessage
+DispatchMessage
+MSG
+RECT
+SIZE
+POINT
+ID3D11Texture2D
+IDirect3DDxgiInterfaceAccess
diff --git a/LottieTest/Tests/Banana/Animation.gif b/LottieTest/Tests/Banana/Animation.gif
new file mode 100644
index 00000000..833735b7
Binary files /dev/null and b/LottieTest/Tests/Banana/Animation.gif differ
diff --git a/LottieTest/Tests/Banana/Lottie.json b/LottieTest/Tests/Banana/Lottie.json
new file mode 100644
index 00000000..e7cbf2a8
--- /dev/null
+++ b/LottieTest/Tests/Banana/Lottie.json
@@ -0,0 +1 @@
+{"v":"4.8.0","meta":{"g":"LottieFiles AE ","a":"","k":"","d":"","tc":""},"fr":60,"ip":0,"op":300,"w":500,"h":500,"nm":"banana","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"glass_banana Outlines","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.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":181,"s":[235.366,196.647,0],"to":[-1.094,5.909,0],"ti":[1.094,-5.909,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":211,"s":[228.8,232.102,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":271,"s":[228.8,232.102,0],"to":[1.094,-5.909,0],"ti":[-1.094,5.909,0]},{"t":299,"s":[235.366,196.647,0]}],"ix":2},"a":{"a":0,"k":[68.5,39.5,0],"ix":1},"s":{"a":0,"k":[91.336,91.336,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.302,0],[0,0]],"o":[[0,0],[0,5.787],[0,0],[0,0]],"v":[[-5.278,-12],[-5.278,1.523],[4.322,12],[5.278,12]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":46,"s":[0]},{"t":135,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[50]},{"i":{"x":[0.642],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":46,"s":[100]},{"i":{"x":[0.665],"y":[1]},"o":{"x":[0.356],"y":[0]},"t":90,"s":[70]},{"i":{"x":[0.819],"y":[0.71]},"o":{"x":[0.338],"y":[0]},"t":135,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":180,"s":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":211,"s":[10]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":271,"s":[10]},{"t":300,"s":[50]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[90.605,41.253],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.302,0],[0,0]],"o":[[0,0],[0,5.787],[0,0],[0,0]],"v":[[-5.278,-12],[-5.278,1.523],[4.322,12],[5.278,12]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":46,"s":[0]},{"t":135,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[50]},{"i":{"x":[0.672],"y":[1]},"o":{"x":[0.325],"y":[0]},"t":46,"s":[100]},{"i":{"x":[0.682],"y":[1]},"o":{"x":[0.327],"y":[0]},"t":90,"s":[70]},{"i":{"x":[0.804],"y":[0.704]},"o":{"x":[0.333],"y":[0]},"t":135,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":180,"s":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":211,"s":[10]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":271,"s":[10]},{"t":299,"s":[50]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[29.911,41.253],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-3.86,-2.021],[0,0],[0,0],[0,0],[3.152,-1.337],[0,0]],"o":[[0,0],[3.831,-2.093],[0,0],[0,0],[0,0],[-3.168,-1.287],[0,0],[0,0]],"v":[[-6.179,-2.064],[-6.179,-2.064],[5.963,-2.176],[6.179,-2.064],[6.179,4.197],[4.774,3.626],[-5.012,3.702],[-6.179,4.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":[71.385,28.621],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.571,0.067],[0,0],[-16.292,-1.924],[0,-0.655],[0,0],[0.619,0],[0,0],[0,0.706],[0,0]],"o":[[0,0],[16.292,-1.924],[0.571,0.067],[0,0],[0,0.706],[0,0],[-0.619,0],[0,0],[0,-0.655]],"v":[[-24.504,-4.118],[-24.504,-4.118],[24.503,-4.118],[25.509,-2.846],[25.509,4.763],[24.388,6.042],[-24.389,6.042],[-25.509,4.763],[-25.509,-2.846]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":[101.314,17.174],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8.572,0],[0,0],[0,8.572],[0,0],[0,0],[0,0]],"o":[[0,0],[-8.572,0],[0,0],[0,0],[0,0],[0,8.572]],"v":[[8.229,19.519],[-8.228,19.519],[-23.75,3.998],[-23.75,-19.519],[23.749,-19.519],[23.749,3.998]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.102000000898,0.102000000898,0.102000000898,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":[101.312,42.734],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.571,0.067],[0,0],[-16.292,-1.924],[0,-0.655],[0,0],[0.619,0],[0,0],[0,0.706],[0,0]],"o":[[0,0],[16.292,-1.924],[0.571,0.067],[0,0],[0,0.706],[0,0],[-0.619,0],[0,0],[0,-0.655]],"v":[[-24.503,-4.118],[-24.503,-4.118],[24.503,-4.118],[25.508,-2.846],[25.508,4.763],[24.389,6.042],[-24.389,6.042],[-25.508,4.763],[-25.508,-2.846]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":[41.456,17.174],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8.572,0],[0,0],[0,8.572],[0,0],[0,0],[0,0]],"o":[[0,0],[-8.572,0],[0,0],[0,0],[0,0],[0,8.572]],"v":[[8.229,19.519],[-8.228,19.519],[-23.749,3.998],[-23.749,-19.519],[23.749,-19.519],[23.749,3.998]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.102000000898,0.102000000898,0.102000000898,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":[41.456,42.734],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"eye_banana Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[307.5,261,0],"ix":2},"a":{"a":0,"k":[54,30,0],"ix":1},"s":{"a":0,"k":[78.002,78.002,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.144,4.295],[0,0],[-4.328,0]],"o":[[0,0],[0.144,4.295],[4.329,0]],"v":[[8,-3.865],[-8,-3.865],[0,3.865]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[3.446,0],[0.595,3.285]],"o":[[-0.594,3.285],[-3.446,0],[0,0]],"v":[[6.891,-2.865],[0,2.864],[-6.891,-2.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":[30.782,25.311],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.896,0],[0.385,3.813],[0,0]],"o":[[-3.896,0],[0,0],[-0.384,3.813]],"v":[[0,3.365],[-7.466,-3.365],[7.466,-3.365]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":[30.782,25.311],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.325,9.729],[0,0],[-9.804,0]],"o":[[0,0],[0.325,9.729],[9.805,0]],"v":[[18.12,-8.754],[-18.12,-8.754],[0,8.754]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[7.137,0],[1.61,6.654]],"o":[[-1.611,6.654],[-7.137,0],[0,0]],"v":[[14.702,-5.754],[0,5.754],[-14.701,-5.754]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":[26.662,27.692],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8.495,0],[1.034,8.251],[0,0]],"o":[[-8.495,0],[0,0],[-1.033,8.251]],"v":[[0.001,7.254],[-16.499,-7.254],[16.499,-7.254]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,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":[26.662,27.692],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.144,4.295],[0,0],[-4.328,0]],"o":[[0,0],[0.144,4.295],[4.329,0]],"v":[[8,-3.865],[-8,-3.865],[0,3.865]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[3.446,0],[0.594,3.285]],"o":[[-0.594,3.285],[-3.446,0],[0,0]],"v":[[6.891,-2.865],[0,2.864],[-6.891,-2.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":[86.227,25.311],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.896,0],[0.385,3.813],[0,0]],"o":[[-3.896,0],[0,0],[-0.385,3.813]],"v":[[0,3.365],[-7.466,-3.365],[7.466,-3.365]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":[86.227,25.311],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.325,9.729],[0,0],[-9.804,0]],"o":[[0,0],[0.325,9.729],[9.805,0]],"v":[[18.12,-8.754],[-18.12,-8.754],[0,8.754]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[7.138,0],[1.61,6.654]],"o":[[-1.609,6.654],[-7.137,0],[0,0]],"v":[[14.701,-5.754],[0,5.754],[-14.701,-5.754]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":[82.107,27.692],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":4,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8.494,0],[1.033,8.251],[0,0]],"o":[[-8.494,0],[0,0],[-1.033,8.251]],"v":[[0,7.254],[-16.498,-7.254],[16.498,-7.254]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,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":[82.106,27.692],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false}],"ip":180,"op":300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"banana_two_19 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":45,"s":[20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":90,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":135,"s":[20]},{"t":181,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[250,250,0],"to":[6.083,0.667,0],"ti":[-2.083,-0.083,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":45,"s":[286.5,254,0],"to":[2.083,0.083,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":90,"s":[262.5,250.5,0],"to":[0,0,0],"ti":[2.083,0.083,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":135,"s":[286.5,254,0],"to":[-2.083,-0.083,0],"ti":[6.083,0.667,0]},{"t":181,"s":[250,250,0]}],"ix":2},"a":{"a":0,"k":[161.5,184.5,0],"ix":1},"s":{"a":0,"k":[76.152,76.152,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.806,-0.048],[0,0],[0.74,-0.64],[0,0],[0,0]],"o":[[0,0],[1.008,0.06],[0,0],[0,0],[0.485,-0.603]],"v":[[3.441,-5.022],[4.51,-4.96],[5.23,-3.081],[-5.97,5.07],[1.137,-4.358]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.651000019148,0.486000001197,0.322000002394,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":[11.368,278.296],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-41.658],[79.195,0],[25.54,24.856],[-26.716,0],[0,84.64],[9,28.771]],"o":[[0,83.51],[-37.493,0],[21.725,12.525],[82.807,0],[0,-31.16],[20,31.748]],"v":[[120.285,-25.216],[-23.11,126],[-120.285,85.971],[-46.757,105.634],[103.179,-47.618],[85.285,-126]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.987999949736,0.811999990426,0.128999986836,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":[134.715,187],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.306,-0.906],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.49,-1.591]],"v":[[6.5,-4.547],[-10.5,5.453],[10.5,-0.736],[9.5,-3.547]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.651000019148,0.486000001197,0.322000002394,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":[204.5,10.547],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.942,0.689],[0,0]],"o":[[0,0],[-0.647,-0.971],[0,0],[0,0]],"v":[[10.781,19.548],[-10.134,-11.865],[-9.605,-14.832],[-1.113,-19.548]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.842999985639,0.694000004787,0.128999986836,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":[204.113,30.548],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.111,-0.868],[-2.76,-0.852],[-5.804,-3.483],[12.886,-59.922],[60.855,-15.424],[37.104,57.624],[-0.939,1.394],[0,0],[-1.904,-1.005],[-23.861,-0.624],[-0.179,84.202],[3.879,13.39],[0,0],[0,0],[0,0],[-0.19,0.899],[-1,0.6],[0,0],[0,0],[-1.15,-0.55],[0,0],[-0.37,-1.009],[0,0],[0,0],[-0.01,-0.019]],"o":[[1.137,0.839],[3.141,2.438],[6.467,1.998],[38,24],[-13.199,61.376],[-76.838,19.477],[-0.91,-1.414],[0,0],[1.202,-1.786],[19.85,10.484],[84.175,2.202],[0.03,-14.646],[0,0],[0,0],[0,0],[-0.51,-0.859],[0.189,-1.07],[0,0],[0,0],[1.19,-0.719],[0,0],[0.88,0.42],[0,0],[0,0],[0.01,0.019],[0,0]],"v":[[82.299,-124.485],[85.671,-121.925],[94.161,-117.461],[112.641,-109.225],[146.837,47.114],[26.567,173.207],[-158.73,101.584],[-158.663,96.95],[-152.515,87.822],[-147.056,86.438],[-80.871,103.722],[73.641,-46.399],[67.731,-88.605],[54.641,-128.225],[34.837,-157.586],[29.228,-167.046],[28.758,-169.775],[30.577,-172.425],[38.178,-177.015],[46.528,-182.046],[50.258,-182.225],[50.268,-182.225],[52.258,-180.046],[64.888,-144.376],[67.018,-139.315],[67.047,-139.256]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.987999949736,0.933000033509,0.128999986836,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":[163.36,186.225],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":50,"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":[162,386.883,0],"to":[5.167,0,0],"ti":[-1,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":45,"s":[193,386.883,0],"to":[1,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":90,"s":[168,386.883,0],"to":[0,0,0],"ti":[1,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":135,"s":[193,386.883,0],"to":[-1,0,0],"ti":[5.167,0,0]},{"t":181,"s":[162,386.883,0]}],"ix":2},"a":{"a":0,"k":[-86,133.883,0],"ix":1},"s":{"a":0,"k":[91,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[169.141,11.766],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.149019607843,0.149019607843,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":[-1.43,133.883],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/LottieTest/Tests/BlurOverlap/AfterEffects.aep b/LottieTest/Tests/BlurOverlap/AfterEffects.aep
new file mode 100644
index 00000000..e1092314
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/AfterEffects.aep differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame001.png b/LottieTest/Tests/BlurOverlap/Frames/frame001.png
new file mode 100644
index 00000000..63322c5b
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame001.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame006.png b/LottieTest/Tests/BlurOverlap/Frames/frame006.png
new file mode 100644
index 00000000..c6697789
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame006.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame011.png b/LottieTest/Tests/BlurOverlap/Frames/frame011.png
new file mode 100644
index 00000000..181bc17f
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame011.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame016.png b/LottieTest/Tests/BlurOverlap/Frames/frame016.png
new file mode 100644
index 00000000..80bea068
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame016.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame021.png b/LottieTest/Tests/BlurOverlap/Frames/frame021.png
new file mode 100644
index 00000000..30e3a8fa
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame021.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame026.png b/LottieTest/Tests/BlurOverlap/Frames/frame026.png
new file mode 100644
index 00000000..5f3e3844
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame026.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame031.png b/LottieTest/Tests/BlurOverlap/Frames/frame031.png
new file mode 100644
index 00000000..052de8c9
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame031.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame036.png b/LottieTest/Tests/BlurOverlap/Frames/frame036.png
new file mode 100644
index 00000000..260d64d3
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame036.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame041.png b/LottieTest/Tests/BlurOverlap/Frames/frame041.png
new file mode 100644
index 00000000..3133d6d4
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame041.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame046.png b/LottieTest/Tests/BlurOverlap/Frames/frame046.png
new file mode 100644
index 00000000..a1d32f7f
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame046.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame051.png b/LottieTest/Tests/BlurOverlap/Frames/frame051.png
new file mode 100644
index 00000000..b61c7d04
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame051.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame056.png b/LottieTest/Tests/BlurOverlap/Frames/frame056.png
new file mode 100644
index 00000000..4ce161ef
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame056.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame061.png b/LottieTest/Tests/BlurOverlap/Frames/frame061.png
new file mode 100644
index 00000000..3c3d4eb0
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame061.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame066.png b/LottieTest/Tests/BlurOverlap/Frames/frame066.png
new file mode 100644
index 00000000..236e3513
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame066.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame071.png b/LottieTest/Tests/BlurOverlap/Frames/frame071.png
new file mode 100644
index 00000000..e0b0856e
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame071.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame076.png b/LottieTest/Tests/BlurOverlap/Frames/frame076.png
new file mode 100644
index 00000000..ba543c1f
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame076.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame081.png b/LottieTest/Tests/BlurOverlap/Frames/frame081.png
new file mode 100644
index 00000000..08e1e8e6
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame081.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame086.png b/LottieTest/Tests/BlurOverlap/Frames/frame086.png
new file mode 100644
index 00000000..70344574
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame086.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame091.png b/LottieTest/Tests/BlurOverlap/Frames/frame091.png
new file mode 100644
index 00000000..fc9bf8ec
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame091.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame096.png b/LottieTest/Tests/BlurOverlap/Frames/frame096.png
new file mode 100644
index 00000000..82979e37
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame096.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame101.png b/LottieTest/Tests/BlurOverlap/Frames/frame101.png
new file mode 100644
index 00000000..f03396e0
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame101.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame106.png b/LottieTest/Tests/BlurOverlap/Frames/frame106.png
new file mode 100644
index 00000000..896fc519
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame106.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame111.png b/LottieTest/Tests/BlurOverlap/Frames/frame111.png
new file mode 100644
index 00000000..4ed2cd70
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame111.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame116.png b/LottieTest/Tests/BlurOverlap/Frames/frame116.png
new file mode 100644
index 00000000..dd7661ba
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame116.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame121.png b/LottieTest/Tests/BlurOverlap/Frames/frame121.png
new file mode 100644
index 00000000..9230ac19
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame121.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame126.png b/LottieTest/Tests/BlurOverlap/Frames/frame126.png
new file mode 100644
index 00000000..302bb19e
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame126.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame131.png b/LottieTest/Tests/BlurOverlap/Frames/frame131.png
new file mode 100644
index 00000000..c9deb45b
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame131.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame136.png b/LottieTest/Tests/BlurOverlap/Frames/frame136.png
new file mode 100644
index 00000000..56d9f1b2
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame136.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame141.png b/LottieTest/Tests/BlurOverlap/Frames/frame141.png
new file mode 100644
index 00000000..b49df0e2
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame141.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Frames/frame146.png b/LottieTest/Tests/BlurOverlap/Frames/frame146.png
new file mode 100644
index 00000000..06d421b4
Binary files /dev/null and b/LottieTest/Tests/BlurOverlap/Frames/frame146.png differ
diff --git a/LottieTest/Tests/BlurOverlap/Lottie.json b/LottieTest/Tests/BlurOverlap/Lottie.json
new file mode 100644
index 00000000..6abfe2e7
--- /dev/null
+++ b/LottieTest/Tests/BlurOverlap/Lottie.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":30,"ip":0,"op":150,"w":500,"h":500,"nm":"Main","ddd":0,"assets":[{"id":"comp_0","nm":"Shape Layer 2 Comp 1","fr":30,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[491,393,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"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":[[-42,-125],[-166,-109],[-194,9],[-91,3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.610795855522,0.419607818127,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":150,"st":0,"bm":0}]},{"id":"comp_1","nm":"Shape Layer 3 Comp 1","fr":30,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[258,402,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":29,"nm":"Gaussian Blur","np":5,"mn":"ADBE Gaussian Blur 2","ix":1,"en":1,"ef":[{"ty":0,"nm":"Blurriness","mn":"ADBE Gaussian Blur 2-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"Blur Dimensions","mn":"ADBE Gaussian Blur 2-0002","ix":2,"v":{"a":0,"k":1,"ix":2}},{"ty":7,"nm":"Repeat Edge Pixels","mn":"ADBE Gaussian Blur 2-0003","ix":3,"v":{"a":0,"k":1,"ix":3}}]}],"shapes":[{"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":[[-42,-125],[-166,-109],[-194,9],[-91,3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.108758166432,0.866666674614,0.394088506699,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":150,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Purple","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"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":0,"s":[250,250,0],"to":[-14.833,-12.333,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":58,"s":[161,176,0],"to":[0,0,0],"ti":[-14.833,-12.333,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":126,"s":[250,250,0],"to":[0,0,0],"ti":[0,0,0]},{"t":149,"s":[250,250,0]}],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":29,"nm":"Gaussian Blur","np":5,"mn":"ADBE Gaussian Blur 2","ix":1,"en":1,"ef":[{"ty":0,"nm":"Blurriness","mn":"ADBE Gaussian Blur 2-0001","ix":1,"v":{"a":0,"k":10,"ix":1}},{"ty":7,"nm":"Blur Dimensions","mn":"ADBE Gaussian Blur 2-0002","ix":2,"v":{"a":0,"k":1,"ix":2}},{"ty":7,"nm":"Repeat Edge Pixels","mn":"ADBE Gaussian Blur 2-0003","ix":3,"v":{"a":0,"k":1,"ix":3}}]}],"w":500,"h":500,"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Green","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"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":0,"s":[250,250,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[250,250,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":98,"s":[317,238,0],"to":[0,0,0],"ti":[0,0,0]},{"t":149,"s":[250,250,0]}],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":29,"nm":"Gaussian Blur","np":5,"mn":"ADBE Gaussian Blur 2","ix":1,"en":1,"ef":[{"ty":0,"nm":"Blurriness","mn":"ADBE Gaussian Blur 2-0001","ix":1,"v":{"a":0,"k":40,"ix":1}},{"ty":7,"nm":"Blur Dimensions","mn":"ADBE Gaussian Blur 2-0002","ix":2,"v":{"a":0,"k":1,"ix":2}},{"ty":7,"nm":"Repeat Edge Pixels","mn":"ADBE Gaussian Blur 2-0003","ix":3,"v":{"a":0,"k":1,"ix":3}}]}],"w":500,"h":500,"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[381,215.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":29,"nm":"Gaussian Blur","np":5,"mn":"ADBE Gaussian Blur 2","ix":1,"en":1,"ef":[{"ty":0,"nm":"Blurriness","mn":"ADBE Gaussian Blur 2-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"Blur Dimensions","mn":"ADBE Gaussian Blur 2-0002","ix":2,"v":{"a":0,"k":1,"ix":2}},{"ty":7,"nm":"Repeat Edge Pixels","mn":"ADBE Gaussian Blur 2-0003","ix":3,"v":{"a":0,"k":1,"ix":3}}]}],"shapes":[{"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":[[-42,-125],[-166,-109],[-194,9],[-91,3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.309803903103,0.488442987204,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":1,"nm":"White Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":500,"sh":500,"sc":"#ffffff","ip":0,"op":150,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/LottieTest/Tests/BlurOverlap/Test.json b/LottieTest/Tests/BlurOverlap/Test.json
new file mode 100644
index 00000000..649463b4
--- /dev/null
+++ b/LottieTest/Tests/BlurOverlap/Test.json
@@ -0,0 +1,5 @@
+{
+ "duration": 5,
+ "frames-per-second": 30,
+ "number-of-frames": 150
+}
\ No newline at end of file
diff --git a/LottieTest/Tests/BlurOverlap/Test.json.bak b/LottieTest/Tests/BlurOverlap/Test.json.bak
new file mode 100644
index 00000000..1efd2d33
--- /dev/null
+++ b/LottieTest/Tests/BlurOverlap/Test.json.bak
@@ -0,0 +1,5 @@
+{
+ "duration": "5",
+ "frames-per-second": "30",
+ "number-of-frames": "150"
+}
\ No newline at end of file
diff --git a/LottieTest/Tests/Earth/Animation.gif b/LottieTest/Tests/Earth/Animation.gif
new file mode 100644
index 00000000..52b1f859
Binary files /dev/null and b/LottieTest/Tests/Earth/Animation.gif differ
diff --git a/LottieTest/Tests/Earth/Lottie.json b/LottieTest/Tests/Earth/Lottie.json
new file mode 100644
index 00000000..e7dca040
--- /dev/null
+++ b/LottieTest/Tests/Earth/Lottie.json
@@ -0,0 +1 @@
+{"v":"4.8.0","meta":{"g":"LottieFiles AE 1.0.0","a":"","k":"","d":"","tc":"#FFFFFF"},"fr":25,"ip":0,"op":100,"w":300,"h":300,"nm":"EARTH01","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Hand1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":18,"s":[22]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":53,"s":[-6]},{"t":82,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.26,"y":1},"o":{"x":0.333,"y":0},"t":18,"s":[-78.628,85.519,0],"to":[10.333,22,0],"ti":[-42.333,-17,0]},{"t":45,"s":[26.372,160.519,0]}],"ix":2},"a":{"a":0,"k":[26.372,160.519,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.817,0],[0,0],[0,-1.626],[0,0],[0,0],[0,3.073],[0.146,0.5]],"o":[[0,0],[-1.951,0],[0,0],[0,0],[3.073,0],[0,-0.545],[-0.598,0.777]],"v":[[13.491,-2.315],[-12.363,-2.315],[-15.895,0.629],[-15.895,3.572],[10.314,3.572],[15.895,-2.009],[15.649,-3.572]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392158031,0.72549021244,0.654901981354,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":[140.669,220.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.472,0.946],[2.052,0],[0,0],[0,-1.984],[0,0],[0,0],[0,0],[-1.272,1.307],[0,1.943]],"o":[[-1.291,2.445],[0,0],[-1.984,-0.048],[0,0],[0,0],[0,0],[1.943,0],[1.307,-1.272],[0,-1.123]],"v":[[20.432,-5.091],[15.257,-1.09],[-17.576,-1.886],[-21.194,1.646],[-21.194,5.091],[11.725,5.091],[14.129,5.091],[19.109,3.007],[21.194,-1.973]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392158031,0.72549021244,0.654901981354,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":[145.968,204.457],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.393,0],[0,0],[2.224,0.553],[7.643,5.095],[7.065,3.532],[-12.082,11.781],[1.073,0.916],[-53.073,-28.173],[0,0],[0,0],[-3.462,-1.307],[-1.025,-0.318],[0,0],[-5.545,-0.035],[0,0],[0,3.144],[0.046,0.291]],"o":[[0,0],[-2.291,0],[-5.716,-1.42],[0,0],[-6.335,-3.167],[-13.828,-5.716],[-32.41,-14.855],[0.742,0.282],[0,0],[2.967,2.261],[0.989,0.353],[0,0],[5.298,1.625],[0,0],[3.144,0],[0,-0.303],[-1.278,1.821]],"v":[[60.022,40.255],[34.961,40.255],[28.183,39.432],[3.506,29.658],[-17.687,11.997],[-15.383,-23.134],[-43.47,-40.916],[-23.513,18.638],[-22.348,19.062],[-5.746,31.637],[3.897,37.111],[6.864,38.101],[16.437,41.068],[32.756,43.576],[60.272,43.788],[65.959,38.101],[65.8,37.238]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392158031,0.72549021244,0.654901981354,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":[83.541,194.019],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.272,1.307],[-0.356,0.965],[0.738,0],[0,0],[0,-1.17],[0,0],[0,0]],"o":[[0.732,-0.711],[-0.567,0.232],[0,0],[-1.951,0],[0,0],[0,0],[1.943,0]],"v":[[15.24,0.235],[16.87,-2.319],[14.92,-1.92],[-13.338,-1.92],[-16.87,0.2],[-16.87,2.319],[10.26,2.319]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392158031,0.72549021244,0.654901981354,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":[142.772,193.1],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[142.772,193.1],"ix":2},"a":{"a":0,"k":[142.772,193.1],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[142.772,193.1],"ix":2},"a":{"a":0,"k":[142.772,193.1],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.943,0],[0,0],[0,-3.885],[1.307,-1.272],[1.943,0],[0,0],[0,0],[0,-2.861],[3.073,0],[0,0],[0,0],[0,-2.826],[3.144,0],[0,0],[5.298,1.625],[0,0],[0.989,0.353],[2.967,2.261],[0,0],[0.742,0.283],[0.706,22.147],[-17.379,0],[-10.738,0],[-5.369,2.755],[-2.367,0],[0,-3.603],[2.19,-1.095],[0,0],[0,0],[0,0],[-0.459,-0.106],[0,-3.391],[1.307,-1.272]],"o":[[0,0],[3.885,0],[0,1.943],[-1.272,1.307],[0,0],[0,0],[2.826,0.318],[0,3.073],[0,0],[0,0],[2.79,0.424],[0,3.144],[0,0],[-5.546,-0.035],[0,0],[-1.024,-0.318],[-3.462,-1.307],[0,0],[0,0],[-11.974,-16.955],[1.448,1.236],[0,0],[0,0],[2.084,-1.06],[3.603,0],[0,2.508],[0,0],[0,0],[0,0],[0.495,0],[3.214,0.671],[0,1.943],[-1.272,1.307]],"v":[[49.416,-0.035],[56.481,-0.035],[63.545,7.029],[61.461,12.01],[56.481,14.094],[21.158,14.094],[47.968,17.061],[52.949,22.642],[47.368,28.223],[21.158,28.223],[41.01,31.049],[45.884,36.665],[40.197,42.352],[12.681,42.14],[-3.638,39.632],[-13.211,36.665],[-16.178,35.676],[-25.821,30.201],[-42.422,17.626],[-43.588,17.202],[-63.545,-42.352],[-21.229,-21.229],[0.954,-31.826],[14.906,-37.301],[21.688,-38.89],[28.223,-32.355],[24.62,-26.492],[7.029,-17.697],[14.094,-14.164],[49.416,-14.164],[50.829,-14.023],[56.481,-7.1],[54.397,-2.119]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392158031,0.807843148708,0.764705896378,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":[103.616,195.455],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"shadow1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":22,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[113.629,208.392,0],"ix":2},"a":{"a":0,"k":[113.629,208.392,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.245,0.747],[0.61,0],[0,0],[0,0],[0,0],[0,0],[0,-2.826],[0.272,-0.665],[0,0],[0,3.073]],"o":[[-0.55,0.182],[0,0],[0,0],[0,0],[0,0],[2.79,0.424],[0,0.764],[0,0],[3.073,0],[0,-2.461]],"v":[[12.052,-5.451],[10.314,-5.146],[4.52,-5.146],[-15.895,-5.146],[2.871,-2.474],[3.956,-2.32],[8.831,3.297],[8.403,5.451],[10.314,5.451],[15.895,-0.13]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882354081,0.172549024224,0.239215686917,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":[140.669,228.823],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.49,1.298],[1.769,0],[0,0],[0,0],[0,0],[0,0],[0,-2.861],[0.253,-0.636],[0,0],[-1.272,1.307],[0,1.943]],"o":[[-1.236,1.102],[0,0],[0,0],[0,0],[0,0],[2.826,0.318],[0,0.724],[0,0],[1.943,0],[1.307,-1.272],[0,-2.119]],"v":[[18.738,-6.184],[14.129,-4.413],[-0.193,-4.413],[-21.194,-4.413],[-0.613,-2.135],[5.616,-1.446],[10.597,4.135],[10.194,6.184],[14.129,6.184],[19.109,4.1],[21.194,-0.88]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882354081,0.172549024224,0.239215686917,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":[145.968,213.961],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.215,0.803],[0.663,0],[0,0],[0,0],[3.068,0.532],[2.306,0.707],[0,0],[0.989,0.353],[2.967,2.261],[0,0],[0.688,0.26],[-13.313,-7.883],[0,0],[-5.329,-0.094],[-0.211,-0.001],[0,0],[0,0],[0,3.144]],"o":[[-0.592,0.208],[0,0],[0,0],[-3.132,-0.02],[-2.364,-0.41],[0,0],[-1.024,-0.318],[-3.461,-1.307],[0,0],[0,0],[8.91,12.585],[0,0],[5.097,1.563],[0.211,0.004],[0,0],[0,0],[3.144,0],[0,-2.436]],"v":[[40.896,6.921],[39.015,7.264],[17.185,7.096],[11.499,7.052],[2.195,6.193],[-4.82,4.544],[-14.393,1.577],[-17.36,0.588],[-27.003,-4.887],[-43.605,-17.462],[-44.702,-17.861],[-10.992,13.228],[-4.82,15.141],[10.868,17.622],[11.499,17.649],[19.111,17.707],[39.015,17.861],[44.702,12.174]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882354081,0.172549024224,0.239215686917,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":[104.798,230.543],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.778,0],[0,0],[0.585,0.51]],"o":[[0,0],[-0.393,-0.672],[-1.238,1.112]],"v":[[-3.052,0.893],[3.052,0.893],[1.575,-0.893]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882354081,0.172549024224,0.239215686917,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":[156.084,194.526],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,2.508],[1.664,1.186],[0.31,-0.155],[0,0],[0,0]],"o":[[0,0],[2.19,-1.095],[0,-2.194],[-0.277,0.199],[0,0],[0,0],[0,0]],"v":[[3.532,6.454],[6.994,4.724],[10.597,-1.14],[7.837,-6.454],[6.994,-5.873],[-10.597,2.922],[-3.532,6.454]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882354081,0.172549024224,0.239215686917,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":[121.242,174.836],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Hand2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":18,"s":[-29]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":53,"s":[7]},{"t":92,"s":[4]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.26,"y":1},"o":{"x":0.333,"y":0},"t":18,"s":[386.258,48.033,0],"to":[-10,27.667,0],"ti":[21,-4.667,0]},{"t":45,"s":[286.258,103.033,0]}],"ix":2},"a":{"a":0,"k":[286.258,103.033,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.951,0],[0,0],[0.644,1.44],[0,-0.975],[-3.073,0],[0,0]],"o":[[0,-1.951],[0,0],[-1.16,0],[-0.442,0.804],[0,3.073],[0,0],[0,0]],"v":[[15.895,1.781],[12.363,-1.751],[-12.363,-1.751],[-15.188,-4.136],[-15.895,-1.445],[-10.314,4.136],[15.895,4.136]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392158031,0.72549021244,0.654901981354,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":[158.331,155.961],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[52.934,-23.67],[5.33,-2.284],[6.395,-3.197],[0,0],[5.716,-1.42],[2.291,0],[0,0],[1.048,2.589],[0,-0.813],[-3.108,-0.035],[-0.035,0],[0,0],[-5.298,1.625],[0,0],[0,0],[-0.989,0.353],[-2.967,2.261],[0,0],[-10.42,6.853]],"o":[[-4.414,2.913],[12.493,11.73],[-7.065,3.532],[-7.643,5.095],[-2.223,0.553],[0,0],[-2.965,0],[-0.312,0.701],[0,3.108],[0.035,0],[0,0],[5.545,-0.035],[0,0],[0,0],[1.024,-0.318],[3.462,-1.307],[0,0],[0,0],[57.625,-29.914]],"v":[[24.478,-33.791],[9.531,-25.556],[12.185,9.903],[-9.008,27.564],[-33.685,37.337],[-40.463,38.161],[-65.524,38.161],[-72.066,33.741],[-72.589,36.006],[-66.972,41.693],[-66.902,41.693],[-39.385,41.481],[-23.066,38.973],[-19.499,37.878],[-13.494,36.006],[-10.527,35.017],[-0.884,29.542],[15.718,16.967],[36.417,6.688]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392158031,0.72549021244,0.654901981354,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":[222.089,132.533],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.951,0],[0,0],[1.225,3.15],[0,-1.288],[-1.307,-1.272],[-1.943,0],[0,0]],"o":[[0,0],[0,-1.951],[0,0],[-2.606,0],[-0.608,1.042],[0,1.943],[1.272,1.307],[0,0],[0,0]],"v":[[21.194,5.294],[21.194,3.528],[17.661,-0.004],[-14.129,-0.004],[-20.211,-5.294],[-21.194,-1.77],[-19.109,3.21],[-14.129,5.294],[-10.597,5.294]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392158031,0.72549021244,0.654901981354,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":[153.032,140.673],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.943,0],[0,0],[0,0],[1.951,0],[0,0],[0.251,1.022],[-1.076,-1.046]],"o":[[0,0],[0,0],[0,-1.17],[0,0],[-1.774,0],[0.22,1.539],[1.272,1.307]],"v":[[-10.647,3.03],[17.611,3.03],[17.611,0.91],[14.079,-1.209],[-14.179,-1.209],[-17.611,-3.03],[-15.627,0.945]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392158031,0.72549021244,0.654901981354,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":[156.615,128.809],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[156.615,128.809],"ix":2},"a":{"a":0,"k":[156.615,128.809],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.025,-0.102],[0,0.344]],"o":[[0,0.106],[-0.047,-0.331],[0,0]],"v":[[-0.05,0.204],[0.05,0.503],[-0.05,-0.503]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[138.953,125.277],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[138.953,125.277],"ix":2},"a":{"a":0,"k":[138.953,125.277],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.272,1.307],[0,1.943],[-3.885,0],[0,0],[0,0],[0,0],[0,2.508],[-3.603,0],[-0.848,-0.177],[-1.307,-0.671],[0,0],[-2.79,-1.166],[0,0],[0,0],[-8.619,5.687],[-1.342,-14.518],[0,0],[0,0],[3.462,-1.307],[1.024,-0.318],[0,0],[0,0],[5.546,-0.035],[0,0],[0.035,0],[0,3.108],[-2.79,0.424],[0,0],[0,0],[0,3.073],[-2.826,0.318],[0,0],[0,0],[1.272,1.307],[0,1.943],[-3.885,0]],"o":[[-1.943,0],[-1.307,-1.272],[0,-3.885],[0,0],[0,0],[0,0],[-2.19,-1.095],[0,-3.603],[0.883,0],[1.484,0.212],[5.369,2.755],[2.896,0],[0,0],[7.453,3.073],[9.714,0],[6.429,12.292],[-10.42,6.853],[0,0],[-2.967,2.261],[-0.989,0.353],[0,0],[0,0],[-5.298,1.625],[0,0],[-0.035,0],[-3.108,-0.035],[0,-2.826],[0,0],[0,0],[-3.073,0],[0,-2.861],[0,0],[0,0],[-1.943,0],[-1.307,-1.272],[0,-3.885],[0,0]],"v":[[-49.204,-1.766],[-54.185,-3.85],[-56.269,-8.831],[-49.204,-15.895],[-13.882,-15.895],[-6.817,-19.427],[-24.408,-28.223],[-28.011,-34.086],[-21.476,-40.621],[-18.898,-40.374],[-14.694,-39.031],[-0.742,-33.556],[7.912,-31.614],[7.948,-31.614],[21.441,-22.96],[51.394,-34.863],[63.333,5.616],[42.634,15.895],[26.033,28.47],[16.39,33.945],[13.423,34.934],[7.418,36.806],[3.85,37.901],[-12.469,40.409],[-39.985,40.621],[-40.056,40.621],[-45.672,34.934],[-40.798,29.318],[-20.946,26.492],[-47.156,26.492],[-52.737,20.911],[-47.756,15.33],[-20.946,12.363],[-56.269,12.363],[-61.249,10.279],[-63.333,5.298],[-56.269,-1.766]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392158031,0.807843148708,0.764705896378,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":[195.172,133.605],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"shadow2","parent":3,"sr":1,"ks":{"o":{"a":0,"k":22,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[195.419,144.797,0],"ix":2},"a":{"a":0,"k":[195.419,144.797,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.236,1.102],[0.392,-0.67],[0,0]],"o":[[-0.583,0.507],[0,0],[-1.769,0]],"v":[[-1.57,-0.886],[-3.039,0.886],[3.039,0.886]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882354081,0.172549024224,0.239215686917,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":[142.929,130.953],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.19,-1.095],[0,0],[0,0],[0,0],[0,0],[0.277,0.199],[0,-2.194]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.31,-0.155],[-1.664,1.186],[0,2.508]],"v":[[-6.994,4.724],[-3.532,6.454],[3.532,6.454],[10.597,2.922],[-6.994,-5.873],[-7.837,-6.454],[-10.597,-1.14]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882354081,0.172549024224,0.239215686917,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":[177.758,111.255],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.185,-0.18],[-1.943,0],[0,0],[0.016,0.675],[0,0.045],[-2.826,0.318],[0,0],[0,0],[1.236,1.102],[0,-2.119],[-0.989,-1.206]],"o":[[1.272,1.307],[0,0],[-0.238,-0.597],[-0.001,-0.045],[0,-2.861],[0,0],[0,0],[-1.769,0],[-1.49,1.298],[0,1.668],[0.163,0.199]],"v":[[-19.109,4.1],[-14.129,6.184],[-10.194,6.184],[-10.583,4.268],[-10.597,4.135],[-5.616,-1.446],[21.194,-4.413],[-14.129,-4.413],[-18.738,-6.184],[-21.194,-0.88],[-19.605,3.511]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882354081,0.172549024224,0.239215686917,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":[153.032,150.38],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.79,0.424],[0,0],[0,0],[0,0],[0,0],[0.55,0.182],[0,-2.461],[-3.073,0],[0,0],[0,0.762]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.61,0],[-2.245,0.747],[0,3.073],[0,0],[-0.274,-0.666],[0,-2.826]],"v":[[-3.956,-2.32],[0.616,-2.971],[15.895,-5.146],[-1.996,-5.146],[-10.314,-5.146],[-12.052,-5.451],[-15.895,-0.13],[-10.314,5.451],[-8.403,5.451],[-8.831,3.296]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882354081,0.172549024224,0.239215686917,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":[158.331,165.242],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.322,3.374],[0,0],[0,0],[3.462,-1.307],[1.024,-0.318],[0,0],[0,0],[0,0],[5.545,-0.035],[0,0],[0,0],[0.035,0],[0.57,0.201],[0,-2.437],[-0.274,-0.666],[0,0],[-0.459,-0.106],[-3.003,-0.25],[0,0],[0,0],[-5.298,1.625],[0,0],[0,0],[0,0],[-0.989,0.353],[-2.967,2.261],[0,0],[-15.794,13.892],[0,0.724]],"o":[[-10.401,6.828],[0,0],[-2.967,2.261],[-0.989,0.353],[0,0],[0,0],[0,0],[-5.298,1.625],[0,0],[0,0],[-0.035,0],[-0.637,-0.007],[-2.217,0.802],[0,0.762],[0,0],[0.748,0.542],[1.985,0.414],[0,0],[0,0],[5.545,-0.035],[0,0],[0,0],[0,0],[1.024,-0.318],[3.462,-1.307],[0,0],[0,0],[0.014,-0.721],[0,-3.468]],"v":[[79.37,-39.072],[33.556,-12.524],[16.955,0.051],[7.312,5.526],[4.345,6.515],[-1.642,8.381],[-1.66,8.387],[-5.228,9.482],[-21.547,11.99],[-38.037,12.117],[-49.063,12.202],[-49.134,12.202],[-50.942,11.858],[-54.75,17.112],[-54.322,19.266],[-53.101,20.91],[-50.234,22.071],[-45.135,22.768],[-37.709,22.711],[-21.547,22.587],[-5.228,20.079],[-1.66,18.984],[0.442,18.328],[4.345,17.112],[7.312,16.122],[16.955,10.647],[33.556,-1.927],[79.863,-26.67],[79.919,-28.828]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882354081,0.172549024224,0.239215686917,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":[204.25,162.024],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[204.25,162.024],"ix":2},"a":{"a":0,"k":[204.25,162.024],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"circle mask 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[22]},{"t":24,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[149.51,149.51,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":2,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.8,0.8,0.8],"y":[0,0,0]},"t":14,"s":[132.3,132.3,100]},{"t":24,"s":[79.38,79.38,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.448,7.065],[52.984,0],[13.352,-5.793],[11.656,-21.194],[0,-0.035],[0,-19.074],[-60.472,0],[-19.604,18.544],[0,31.366]],"o":[[-10.102,-50.017],[-15.471,0],[-22.324,9.678],[0,0.035],[-8.583,15.613],[0,60.472],[29.106,0],[21.123,-19.957],[0,-7.488]],"v":[[107.31,-21.829],[0,-109.5],[-43.553,-100.493],[-96.042,-52.666],[-96.042,-52.595],[-109.5,0],[0,109.5],[75.166,79.617],[109.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.658823529412,0.933333333333,0.956862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.23],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"t":14,"s":[2]}],"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":113,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"circle mask 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[68]},{"t":24,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[149.51,149.51,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":2,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.8,0.8,0.8],"y":[0,0,0]},"t":14,"s":[106.82,106.82,100]},{"t":24,"s":[78.4,78.4,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.448,7.065],[52.984,0],[13.352,-5.793],[11.656,-21.194],[0,-0.035],[0,-19.074],[-60.472,0],[-19.604,18.544],[0,31.366]],"o":[[-10.102,-50.017],[-15.471,0],[-22.324,9.678],[0,0.035],[-8.583,15.613],[0,60.472],[29.106,0],[21.123,-19.957],[0,-7.488]],"v":[[107.31,-21.829],[0,-109.5],[-43.553,-100.493],[-96.042,-52.666],[-96.042,-52.595],[-109.5,0],[0,109.5],[75.166,79.617],[109.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.658823529412,0.933333333333,0.956862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.23],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"t":14,"s":[2]}],"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":113,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"circle mask","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[47]},{"t":24,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[149.51,149.51,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.8,0.8,0.8],"y":[0,0,0]},"t":14,"s":[118.58,118.58,100]},{"t":24,"s":[90.16,90.16,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.448,7.065],[52.984,0],[13.352,-5.793],[11.656,-21.194],[0,-0.035],[0,-19.074],[-60.472,0],[-19.604,18.544],[0,31.366]],"o":[[-10.102,-50.017],[-15.471,0],[-22.324,9.678],[0,0.035],[-8.583,15.613],[0,60.472],[29.106,0],[21.123,-19.957],[0,-7.488]],"v":[[107.31,-21.829],[0,-109.5],[-43.553,-100.493],[-96.042,-52.666],[-96.042,-52.595],[-109.5,0],[0,109.5],[75.166,79.617],[109.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.658823529412,0.933333333333,0.956862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.23],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[17]},{"t":24,"s":[5]}],"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":113,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"scale","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.16,0.16,0.16],"y":[1,1,1]},"o":{"x":[0.62,0.62,0.62],"y":[0,0,0]},"t":26,"s":[98,98,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":57,"s":[111,111,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":74,"s":[111,111,100]},{"t":99,"s":[106,106,100]}],"ix":6}},"ao":0,"ip":0,"op":100,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Hands","parent":1,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[150,150,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"f","pt":{"a":0,"k":{"i":[[1.448,7.064],[52.984,0],[13.352,-5.793],[11.657,-21.194],[0,-0.035],[0,-19.074],[-60.472,0],[-19.604,18.544],[0,31.367]],"o":[[-10.102,-50.017],[-15.471,0],[-22.324,9.678],[0,0.035],[-8.583,15.613],[0,60.472],[29.106,0],[21.123,-19.957],[0,-7.488]],"v":[[257.31,128.171],[150,40.5],[106.447,49.507],[53.958,97.334],[53.958,97.405],[40.5,150],[150,259.5],[225.166,229.617],[259.5,150]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"w":300,"h":300,"ip":0,"op":100,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"line glow","parent":6,"sr":1,"ks":{"o":{"a":0,"k":44,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42.387,-28.258,0],"ix":2},"a":{"a":0,"k":[191.887,121.242,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.417,0],[1.126,0.383],[-1.878,5.543],[-0.305,1.043],[-5.619,-1.64],[1.639,-5.619],[0.443,-1.307]],"o":[[-1.128,0],[-5.543,-1.878],[0.347,-1.024],[1.639,-5.619],[5.617,1.639],[-0.388,1.333],[-1.495,4.417]],"v":[[-0.553,12.366],[-3.955,11.802],[-10.591,-1.633],[-9.617,-4.735],[3.524,-11.939],[10.728,1.202],[9.481,5.165]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.658717675303,0.933783677045,0.95715379902,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":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[231.977,177.757],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[5.852,0],[0,5.852],[42.849,0],[0,5.852],[-5.852,0],[0,-54.536]],"o":[[-5.852,0],[0,-42.849],[-5.852,0],[0,-5.852],[54.536,0],[0,5.852]],"v":[[44.153,54.75],[33.556,44.153],[-44.153,-33.556],[-54.75,-44.153],[-44.153,-54.75],[54.75,44.153]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.658717675303,0.933783677045,0.95715379902,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":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[191.887,107.111],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":113,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"earth shadow","parent":6,"sr":1,"ks":{"o":{"a":0,"k":22,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-9.644,9.703,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8.29,-3.13],[13.615,0],[10.562,3.392],[10.922,9.367],[3.538,27.53],[0,4.777],[-12.065,17.597],[8.233,-14.97],[0,-0.035],[0,-19.074],[-60.472,0],[-19.604,18.544],[-4.397,6.383]],"o":[[-12.026,4.541],[-11.689,0],[-14.021,-4.503],[-20.056,-17.199],[-0.593,-4.615],[0,-22.948],[-14,9.67],[0,0.035],[-8.583,15.613],[0,60.472],[29.106,0],[5.614,-5.304],[-7.19,4.944]],"v":[[76.567,64.494],[37.902,71.538],[4.398,66.297],[-33.323,45.172],[-70.665,-23.875],[-71.598,-37.962],[-52.462,-99.797],[-86.398,-62.37],[-86.398,-62.299],[-99.856,-9.703],[9.644,99.797],[84.81,69.914],[99.856,52.317]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882354081,0.172549024224,0.239215686917,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":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":113,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"continent","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[24.269,4.356,0],"ix":2},"a":{"a":0,"k":[173.769,153.856,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"f","pt":{"a":0,"k":{"i":[[1.448,7.064],[52.984,0],[13.353,-5.789],[11.657,-21.194],[0,-0.035],[0,-19.074],[-60.472,0],[-19.615,18.533],[0,31.367]],"o":[[-10.102,-50.017],[-15.471,0],[-22.324,9.678],[0,0.035],[-8.583,15.613],[0,60.472],[29.106,0],[21.123,-19.957],[0,-7.488]],"v":[[256.81,127.171],[149.5,39.5],[105.947,48.507],[53.458,96.334],[53.458,96.405],[40,149],[149.5,258.5],[224.666,228.617],[259,149]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.318,-3.532],[4.38,-2.861],[4.592,-2.473],[6.393,-4.945],[0.106,-0.141],[3.073,-0.035],[5.334,-2.084],[-0.742,-3.991],[-2.261,-3.356],[-0.071,-4.062],[8.583,8.089],[3.144,6.817],[0.636,2.614],[-0.671,4.733],[0,0.035],[-22.324,9.678],[-23.264,-4.506],[-7.338,-8.618]],"o":[[0.459,5.298],[-4.345,2.896],[-7.1,3.815],[-0.141,0.141],[-2.508,1.907],[-5.722,0.106],[-3.744,1.448],[0.742,3.991],[2.225,3.356],[-11.515,1.943],[-5.44,-5.122],[-1.166,-2.402],[-1.201,-4.663],[0,-0.035],[11.656,-21.194],[8.293,0.645],[31.53,6.107],[2.296,2.685]],"v":[[68.435,-11.444],[60.806,1.554],[46.783,8.477],[27.602,23.242],[27.179,23.596],[18.842,27.234],[2.347,23.772],[-2.174,34.016],[3.265,44.789],[7.751,55.88],[-23.721,43.341],[-37.073,25.397],[-39.793,17.838],[-40.711,3.638],[-45.803,3.57],[-62.744,-52.43],[2.766,-54.783],[63.737,-20.77]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":0,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.46274510026,0.768627464771,0.43137255311,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":[94.169,93.266],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.331,-3.885],[2.685,-4.592],[4.875,-2.473],[3.214,0.212],[2.649,2.155],[-0.071,4.557],[-2.473,2.473],[-1.66,1.13],[-1.024,1.06],[-1.166,0.495],[-3.638,-0.389]],"o":[[2.72,4.592],[-2.685,4.627],[-2.826,1.413],[-3.462,-0.177],[-3.568,-2.932],[0.035,-3.426],[1.378,-1.413],[1.236,-0.848],[0.883,-0.883],[3.356,-1.413],[4.627,0.53]],"v":[[17.944,-10.519],[17.379,4.634],[5.298,15.09],[-3.886,17.492],[-13.175,13.359],[-19.71,1.808],[-15.365,-7.305],[-10.738,-11.049],[-7.241,-13.698],[-4.309,-15.712],[6.464,-17.407]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":0,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.46274510026,0.768627464771,0.43137255311,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":[195.49,88.173],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.177,-1.59],[2.19,-6.287],[0.918,0.777],[3.038,5.298],[-0.459,6.959],[-2.049,6.747],[0.671,2.614],[2.049,5.899],[-1.695,2.932],[-1.448,1.378],[-1.59,0.671],[-2.896,0.671],[-3.462,0.212],[-8.23,-4.592],[-1.095,-7.559],[5.652,-5.51],[3.638,-3.073],[0.495,-0.918],[-0.071,-1.342],[2.826,-3.603],[2.755,-0.424],[2.826,-0.035],[1.201,-0.812]],"o":[[-0.706,6.57],[-1.201,-0.318],[-4.627,-4.203],[-3.532,-6.181],[0.459,-6.994],[0.777,-2.579],[-1.519,-6.04],[-1.166,-3.32],[0.989,-1.695],[1.201,-1.201],[2.685,-1.166],[3.391,-0.777],[9.608,-0.636],[7.065,3.921],[1.13,7.559],[-3.426,3.32],[-0.848,0.706],[-0.636,1.201],[0.212,4.415],[-1.625,2.119],[-2.79,0.459],[-1.484,0.035],[-1.413,0.954]],"v":[[-9.959,30.804],[-8.475,50.372],[-11.513,48.43],[-23.876,34.654],[-28.009,14.308],[-23.629,-6.25],[-22.675,-14.197],[-34.579,-28.821],[-32.848,-38.428],[-29.386,-43.268],[-25.077,-45.917],[-16.706,-48.778],[-6.391,-50.12],[21.655,-45.882],[34.795,-27.443],[27.483,-6.426],[16.144,2.369],[14.025,4.736],[13.389,8.692],[12.047,21.62],[4.877,25.293],[-3.566,25.647],[-7.804,26.6]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":0,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.46274510026,0.768627464771,0.43137255311,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":[131.978,204.248],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[2.473,4.38],[-1.59,5.334],[0.071,2.473],[2.296,2.932],[1.519,3.32],[-2.437,2.896],[-2.932,3.356],[-2.119,3.78],[-3.921,3.462],[-2.155,0.989],[-2.508,0.424],[-3.674,0.212],[-6.561,-3.609],[4.774,-20.652],[8.471,-22.588],[6.949,-8.746],[1.066,-1.007]],"o":[[-4.663,-2.755],[-2.79,-4.945],[0.706,-2.402],[-0.141,-3.568],[-2.331,-2.967],[-1.554,-3.32],[2.826,-3.426],[2.967,-3.356],[2.437,-4.345],[1.695,-1.519],[2.261,-0.989],[3.674,-0.6],[14.116,3.825],[9.412,5.176],[-2.927,12.663],[-2.569,6.851],[-6.204,7.809],[0,0]],"v":[[-30.997,24.251],[-49.329,20.23],[-49.682,4.087],[-48.199,-3.225],[-52.72,-13.009],[-59.219,-22.122],[-57.029,-33.143],[-45.55,-41.196],[-38.909,-52.394],[-29.301,-64.191],[-23.579,-68.112],[-16.302,-69.984],[-5.141,-71.503],[41.003,-66.573],[58.886,-30.337],[23.592,18.604],[14.65,69.898],[-4.173,55.446]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":0,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.46274510026,0.768627464771,0.43137255311,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":[261.951,199.174],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[175.951,69.153],"to":[-4.528,0],"ti":[11.028,0]},{"t":100,"s":[124.663,61.653]}],"ix":2},"a":{"a":0,"k":[173.951,69.153],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[-9]},{"t":100,"s":[2.287]}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":113,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"earth","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-0.5,-0.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.18,0.18,0.18],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":3,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.41,0.41,0.41],"y":[0,0,0]},"t":16.895,"s":[108,108,100]},{"t":27,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.448,7.065],[52.984,0],[13.352,-5.793],[11.656,-21.194],[0,-0.035],[0,-19.074],[-60.472,0],[-19.604,18.544],[0,31.366]],"o":[[-10.102,-50.017],[-15.471,0],[-22.324,9.678],[0,0.035],[-8.583,15.613],[0,60.472],[29.106,0],[21.123,-19.957],[0,-7.488]],"v":[[107.31,-21.829],[0,-109.5],[-43.553,-100.493],[-96.042,-52.666],[-96.042,-52.595],[-109.5,0],[0,109.5],[75.166,79.617],[109.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.380392163992,0.517647087574,0.68235296011,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":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":3,"op":116,"st":3,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"circles","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2},"a":{"a":0,"k":[150,150,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":300,"h":300,"ip":0,"op":100,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/LottieTest/Tests/Gradient/AfterEffects.aep b/LottieTest/Tests/Gradient/AfterEffects.aep
new file mode 100644
index 00000000..1d6aabec
Binary files /dev/null and b/LottieTest/Tests/Gradient/AfterEffects.aep differ
diff --git a/LottieTest/Tests/Gradient/CodeGen.cs b/LottieTest/Tests/Gradient/CodeGen.cs
new file mode 100644
index 00000000..450ed4e7
--- /dev/null
+++ b/LottieTest/Tests/Gradient/CodeGen.cs
@@ -0,0 +1,1017 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+//
+// LottieGen.dll version:
+// 7.1.2-build.15+g2b49bb9edc
+//
+// Command:
+// LottieGen.dll -Language CSharp -MinimumUapVersion 13 -Public -WinUIVersion 2.7 -InputFile Lottie.json
+//
+// Input file:
+// Lottie.json (13375 bytes created 14:41-07:00 Jun. 13 2022)
+//
+// LottieGen.dll source:
+// http://aka.ms/Lottie
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+// ____________________________________
+// | Object stats | Count |
+// |__________________________|_______|
+// | All CompositionObjects | 170 |
+// |--------------------------+-------|
+// | Expression animators | 28 |
+// | KeyFrame animators | 16 |
+// | Reference parameters | 34 |
+// | Expression operations | 0 |
+// |--------------------------+-------|
+// | Animated brushes | 3 |
+// | Animated gradient stops | - |
+// | ExpressionAnimations | 13 |
+// | PathKeyFrameAnimations | - |
+// |--------------------------+-------|
+// | ContainerVisuals | 3 |
+// | ShapeVisuals | 3 |
+// |--------------------------+-------|
+// | ContainerShapes | - |
+// | CompositionSpriteShapes | 11 |
+// |--------------------------+-------|
+// | Brushes | 12 |
+// | Gradient stops | 3 |
+// | CompositionVisualSurface | - |
+// ------------------------------------
+using Microsoft.Graphics.Canvas.Geometry;
+using System;
+using System.Collections.Generic;
+using System.Numerics;
+using Windows.Graphics;
+using Windows.UI;
+using Windows.UI.Composition;
+
+namespace AnimatedVisuals
+{
+ // Name: Comp 1
+ // Frame rate: 29.9700012207031 fps
+ // Frame count: 150.000006109625
+ // Duration: 5005.0 mS
+ sealed class CodeGen
+ : Microsoft.UI.Xaml.Controls.IAnimatedVisualSource
+ , Microsoft.UI.Xaml.Controls.IAnimatedVisualSource2
+ {
+ // Animation duration: 5.005 seconds.
+ internal const long c_durationTicks = 50050050;
+
+ public Microsoft.UI.Xaml.Controls.IAnimatedVisual TryCreateAnimatedVisual(Compositor compositor)
+ {
+ object ignored = null;
+ return TryCreateAnimatedVisual(compositor, out ignored);
+ }
+
+ public Microsoft.UI.Xaml.Controls.IAnimatedVisual TryCreateAnimatedVisual(Compositor compositor, out object diagnostics)
+ {
+ diagnostics = null;
+
+ if (CodeGen_AnimatedVisual.IsRuntimeCompatible())
+ {
+ var res =
+ new CodeGen_AnimatedVisual(
+ compositor
+ );
+ res.CreateAnimations();
+ return res;
+ }
+
+ return null;
+ }
+
+ ///
+ /// Gets the number of frames in the animation.
+ ///
+ public double FrameCount => 150.000006109625;
+
+ ///
+ /// Gets the frame rate of the animation.
+ ///
+ public double Framerate => 29.9700012207031;
+
+ ///
+ /// Gets the duration of the animation.
+ ///
+ public TimeSpan Duration => TimeSpan.FromTicks(c_durationTicks);
+
+ ///
+ /// Converts a zero-based frame number to the corresponding progress value denoting the
+ /// start of the frame.
+ ///
+ public double FrameToProgress(double frameNumber)
+ {
+ return frameNumber / 150.000006109625;
+ }
+
+ ///
+ /// Returns a map from marker names to corresponding progress values.
+ ///
+ public IReadOnlyDictionary Markers =>
+ new Dictionary
+ {
+ };
+
+ ///
+ /// Sets the color property with the given name, or does nothing if no such property
+ /// exists.
+ ///
+ public void SetColorProperty(string propertyName, Color value)
+ {
+ }
+
+ ///
+ /// Sets the scalar property with the given name, or does nothing if no such property
+ /// exists.
+ ///
+ public void SetScalarProperty(string propertyName, double value)
+ {
+ }
+
+ sealed class CodeGen_AnimatedVisual : Microsoft.UI.Xaml.Controls.IAnimatedVisual2
+ {
+ const long c_durationTicks = 50050050;
+ readonly Compositor _c;
+ readonly ExpressionAnimation _reusableExpressionAnimation;
+ CompositionColorGradientStop _gradientStop_0_Red;
+ CompositionColorGradientStop _gradientStop_1_AlmostDarkBlue_FF0030AC;
+ CompositionLinearGradientBrush _linearGradientBrush_2;
+ CompositionLinearGradientBrush _linearGradientBrush_4;
+ CompositionLinearGradientBrush _linearGradientBrush_5;
+ CompositionRectangleGeometry _rectangle_0;
+ CompositionRectangleGeometry _rectangle_1;
+ CompositionRectangleGeometry _rectangle_2;
+ CompositionRectangleGeometry _rectangle_150_0;
+ CompositionRectangleGeometry _rectangle_150_1;
+ CompositionRoundedRectangleGeometry _roundedRectangle_150_0;
+ CompositionRoundedRectangleGeometry _roundedRectangle_150_1;
+ CompositionRoundedRectangleGeometry _roundedRectangle_150_2;
+ CompositionSpriteShape _spriteShape_06;
+ CompositionSpriteShape _spriteShape_07;
+ ContainerVisual _root;
+ ExpressionAnimation _rootProgress;
+ InsetClip _insetClip_0;
+ LinearEasingFunction _linearEasingFunction_0;
+ ScalarKeyFrameAnimation _rotationAngleInDegreesScalarAnimation_9_to_9;
+ StepEasingFunction _holdThenStepEasingFunction;
+ Vector2KeyFrameAnimation _endPointSourceVector2Animation;
+ Vector2KeyFrameAnimation _positionVector2Animation_3;
+ Vector2KeyFrameAnimation _sizeVector2Animation_1;
+ Vector2KeyFrameAnimation _startPointSourceVector2Animation;
+
+ static void StartProgressBoundAnimation(
+ CompositionObject target,
+ string animatedPropertyName,
+ CompositionAnimation animation,
+ ExpressionAnimation controllerProgressExpression)
+ {
+ target.StartAnimation(animatedPropertyName, animation);
+ var controller = target.TryGetAnimationController(animatedPropertyName);
+ controller.Pause();
+ controller.StartAnimation("Progress", controllerProgressExpression);
+ }
+
+ void BindProperty(
+ CompositionObject target,
+ string animatedPropertyName,
+ string expression,
+ string referenceParameterName,
+ CompositionObject referencedObject)
+ {
+ _reusableExpressionAnimation.ClearAllParameters();
+ _reusableExpressionAnimation.Expression = expression;
+ _reusableExpressionAnimation.SetReferenceParameter(referenceParameterName, referencedObject);
+ target.StartAnimation(animatedPropertyName, _reusableExpressionAnimation);
+ }
+
+ void BindProperty2(
+ CompositionObject target,
+ string animatedPropertyName,
+ string expression,
+ string referenceParameterName0,
+ CompositionObject referencedObject0,
+ string referenceParameterName1,
+ CompositionObject referencedObject1)
+ {
+ _reusableExpressionAnimation.ClearAllParameters();
+ _reusableExpressionAnimation.Expression = expression;
+ _reusableExpressionAnimation.SetReferenceParameter(referenceParameterName0, referencedObject0);
+ _reusableExpressionAnimation.SetReferenceParameter(referenceParameterName1, referencedObject1);
+ target.StartAnimation(animatedPropertyName, _reusableExpressionAnimation);
+ }
+
+ ScalarKeyFrameAnimation CreateScalarKeyFrameAnimation(float initialProgress, float initialValue, CompositionEasingFunction initialEasingFunction)
+ {
+ var result = _c.CreateScalarKeyFrameAnimation();
+ result.Duration = TimeSpan.FromTicks(c_durationTicks);
+ result.InsertKeyFrame(initialProgress, initialValue, initialEasingFunction);
+ return result;
+ }
+
+ Vector2KeyFrameAnimation CreateVector2KeyFrameAnimation(float initialProgress, Vector2 initialValue, CompositionEasingFunction initialEasingFunction)
+ {
+ var result = _c.CreateVector2KeyFrameAnimation();
+ result.Duration = TimeSpan.FromTicks(c_durationTicks);
+ result.InsertKeyFrame(initialProgress, initialValue, initialEasingFunction);
+ return result;
+ }
+
+ CompositionSpriteShape CreateSpriteShape(CompositionGeometry geometry, Matrix3x2 transformMatrix, CompositionBrush fillBrush)
+ {
+ var result = _c.CreateSpriteShape(geometry);
+ result.TransformMatrix = transformMatrix;
+ result.FillBrush = fillBrush;
+ return result;
+ }
+
+ // - - - Layer aggregator
+ // - - RotationDegrees:9, Offset:<590, 572>
+ CanvasGeometry Geometry()
+ {
+ CanvasGeometry result;
+ using (var builder = new CanvasPathBuilder(null))
+ {
+ builder.SetFilledRegionDetermination(CanvasFilledRegionDetermination.Winding);
+ builder.BeginFigure(new Vector2(-324.709991F, 225.572998F));
+ builder.AddLine(new Vector2(-439.576996F, 280.214996F));
+ builder.AddLine(new Vector2(-402.381989F, 438.342987F));
+ builder.AddLine(new Vector2(-264.516998F, 426.631989F));
+ builder.AddLine(new Vector2(-271.730988F, 342.727997F));
+ builder.AddLine(new Vector2(-197.311005F, 288.416992F));
+ builder.AddLine(new Vector2(-324.709991F, 225.572998F));
+ builder.EndFigure(CanvasFigureLoop.Closed);
+ result = CanvasGeometry.CreatePath(builder);
+ }
+ return result;
+ }
+
+ // Transforms for White Solid 1 Scale(1,1,0)
+ CompositionColorBrush ColorBrush_White()
+ {
+ return _c.CreateColorBrush(Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF));
+ }
+
+ // Stop 0
+ CompositionColorGradientStop GradientStop_0_Red()
+ {
+ return (_gradientStop_0_Red == null)
+ ? _gradientStop_0_Red = _c.CreateColorGradientStop(0F, Color.FromArgb(0xFF, 0xFF, 0x00, 0x00))
+ : _gradientStop_0_Red;
+ }
+
+ // Stop 1
+ CompositionColorGradientStop GradientStop_0p485_AlmostYellow_FFE3FF2C()
+ {
+ return _c.CreateColorGradientStop(0.485000014F, Color.FromArgb(0xFF, 0xE3, 0xFF, 0x2C));
+ }
+
+ // Stop 1
+ CompositionColorGradientStop GradientStop_1_AlmostDarkBlue_FF0030AC()
+ {
+ return (_gradientStop_1_AlmostDarkBlue_FF0030AC == null)
+ ? _gradientStop_1_AlmostDarkBlue_FF0030AC = _c.CreateColorGradientStop(1F, Color.FromArgb(0xFF, 0x00, 0x30, 0xAC))
+ : _gradientStop_1_AlmostDarkBlue_FF0030AC;
+ }
+
+ // - - PreComp layer: Static Rects
+ // - Layer aggregator
+ // RotationDegrees:9, Offset:<134, 128>
+ CompositionLinearGradientBrush LinearGradientBrush_0()
+ {
+ var result = _c.CreateLinearGradientBrush();
+ var colorStops = result.ColorStops;
+ colorStops.Add(GradientStop_0_Red());
+ colorStops.Add(GradientStop_1_AlmostDarkBlue_FF0030AC());
+ result.MappingMode = CompositionMappingMode.Absolute;
+ result.StartPoint = new Vector2(53F, 67F);
+ result.EndPoint = new Vector2(95F, 106F);
+ return result;
+ }
+
+ // - - PreComp layer: Static Rects
+ // - Layer aggregator
+ // RotationDegrees:9, Offset:<482, 129>
+ CompositionLinearGradientBrush LinearGradientBrush_1()
+ {
+ var result = _c.CreateLinearGradientBrush();
+ var colorStops = result.ColorStops;
+ colorStops.Add(GradientStop_0_Red());
+ colorStops.Add(GradientStop_1_AlmostDarkBlue_FF0030AC());
+ result.MappingMode = CompositionMappingMode.Absolute;
+ result.StartPoint = new Vector2(-22F, 12F);
+ result.EndPoint = new Vector2(20F, 51F);
+ return result;
+ }
+
+ CompositionLinearGradientBrush LinearGradientBrush_2()
+ {
+ if (_linearGradientBrush_2 != null) { return _linearGradientBrush_2; }
+ var result = _linearGradientBrush_2 = _c.CreateLinearGradientBrush();
+ var propertySet = result.Properties;
+ propertySet.InsertVector2("EndPointSource", new Vector2(20F, 51F));
+ propertySet.InsertVector2("StartPointSource", new Vector2(-22F, 12F));
+ var colorStops = result.ColorStops;
+ colorStops.Add(GradientStop_0_Red());
+ colorStops.Add(GradientStop_1_AlmostDarkBlue_FF0030AC());
+ result.MappingMode = CompositionMappingMode.Absolute;
+ BindProperty2(_linearGradientBrush_2, "StartPoint", "my.StartPointSource+(Vector2(0,0)-geometry.Offset)", "geometry", Rectangle_150_1(), "my", _linearGradientBrush_2);
+ BindProperty2(_linearGradientBrush_2, "EndPoint", "my.EndPointSource+(Vector2(0,0)-geometry.Offset)", "geometry", Rectangle_150_1(), "my", _linearGradientBrush_2);
+ return result;
+ }
+
+ // - - PreComp layer: Animated Rects
+ // - Layer aggregator
+ // Rectangle Path 1
+ CompositionLinearGradientBrush LinearGradientBrush_3()
+ {
+ var result = _c.CreateLinearGradientBrush();
+ var colorStops = result.ColorStops;
+ colorStops.Add(GradientStop_0_Red());
+ colorStops.Add(GradientStop_1_AlmostDarkBlue_FF0030AC());
+ result.MappingMode = CompositionMappingMode.Absolute;
+ result.StartPoint = new Vector2(-22F, 12F);
+ result.EndPoint = new Vector2(20F, 51F);
+ return result;
+ }
+
+ CompositionLinearGradientBrush LinearGradientBrush_4()
+ {
+ if (_linearGradientBrush_4 != null) { return _linearGradientBrush_4; }
+ var result = _linearGradientBrush_4 = _c.CreateLinearGradientBrush();
+ var propertySet = result.Properties;
+ propertySet.InsertVector2("EndPointSource", new Vector2(20F, 20F));
+ propertySet.InsertVector2("StartPointSource", new Vector2(-22F, -20F));
+ var colorStops = result.ColorStops;
+ colorStops.Add(GradientStop_0_Red());
+ colorStops.Add(GradientStop_1_AlmostDarkBlue_FF0030AC());
+ result.MappingMode = CompositionMappingMode.Absolute;
+ BindProperty2(_linearGradientBrush_4, "StartPoint", "my.StartPointSource+(Vector2(0,0)-geometry.Offset)", "geometry", Rectangle_1(), "my", _linearGradientBrush_4);
+ BindProperty2(_linearGradientBrush_4, "EndPoint", "my.EndPointSource+(Vector2(0,0)-geometry.Offset)", "geometry", Rectangle_1(), "my", _linearGradientBrush_4);
+ return result;
+ }
+
+ CompositionLinearGradientBrush LinearGradientBrush_5()
+ {
+ if (_linearGradientBrush_5 != null) { return _linearGradientBrush_5; }
+ var result = _linearGradientBrush_5 = _c.CreateLinearGradientBrush();
+ var propertySet = result.Properties;
+ propertySet.InsertVector2("EndPointSource", new Vector2(20F, 20F));
+ propertySet.InsertVector2("StartPointSource", new Vector2(-22F, -20F));
+ var colorStops = result.ColorStops;
+ colorStops.Add(GradientStop_0_Red());
+ colorStops.Add(GradientStop_0p485_AlmostYellow_FFE3FF2C());
+ colorStops.Add(GradientStop_1_AlmostDarkBlue_FF0030AC());
+ result.MappingMode = CompositionMappingMode.Absolute;
+ BindProperty2(_linearGradientBrush_5, "StartPoint", "my.StartPointSource+(Vector2(0,0)-geometry.Offset)", "geometry", Rectangle_2(), "my", _linearGradientBrush_5);
+ BindProperty2(_linearGradientBrush_5, "EndPoint", "my.EndPointSource+(Vector2(0,0)-geometry.Offset)", "geometry", Rectangle_2(), "my", _linearGradientBrush_5);
+ return result;
+ }
+
+ // - Layer aggregator
+ // RotationDegrees:9, Offset:<590, 572>
+ CompositionLinearGradientBrush LinearGradientBrush_6()
+ {
+ var result = _c.CreateLinearGradientBrush();
+ var colorStops = result.ColorStops;
+ colorStops.Add(GradientStop_0_Red());
+ colorStops.Add(GradientStop_1_AlmostDarkBlue_FF0030AC());
+ result.MappingMode = CompositionMappingMode.Absolute;
+ result.StartPoint = new Vector2(54F, 276F);
+ result.EndPoint = new Vector2(55F, 348F);
+ return result;
+ }
+
+ // - Layer aggregator
+ // RotationDegrees:9, Offset:<590, 572>
+ CompositionPathGeometry PathGeometry()
+ {
+ return _c.CreatePathGeometry(new CompositionPath(Geometry()));
+ }
+
+ // - - PreComp layer: Static Rects
+ // - Layer aggregator
+ // RotationDegrees:9, Offset:<312, 128>
+ CompositionRadialGradientBrush RadialGradientBrush_0()
+ {
+ var result = _c.CreateRadialGradientBrush();
+ var colorStops = result.ColorStops;
+ colorStops.Add(GradientStop_0_Red());
+ colorStops.Add(GradientStop_1_AlmostDarkBlue_FF0030AC());
+ result.MappingMode = CompositionMappingMode.Absolute;
+ result.EllipseCenter = new Vector2(25F, 0F);
+ result.EllipseRadius = new Vector2(50F, 50F);
+ return result;
+ }
+
+ // - - PreComp layer: Static Rects
+ // - Layer aggregator
+ // RotationDegrees:9, Offset:<660, 129>
+ CompositionRadialGradientBrush RadialGradientBrush_1()
+ {
+ var result = _c.CreateRadialGradientBrush();
+ var colorStops = result.ColorStops;
+ colorStops.Add(GradientStop_0_Red());
+ colorStops.Add(GradientStop_1_AlmostDarkBlue_FF0030AC());
+ result.MappingMode = CompositionMappingMode.Absolute;
+ result.EllipseCenter = new Vector2(25F, 0F);
+ result.EllipseRadius = new Vector2(50F, 50F);
+ return result;
+ }
+
+ // - - PreComp layer: Animated Rects
+ // - Layer aggregator
+ // RotationDegrees:9, Offset:<308, 342>
+ CompositionRadialGradientBrush RadialGradientBrush_2()
+ {
+ var result = _c.CreateRadialGradientBrush();
+ var colorStops = result.ColorStops;
+ colorStops.Add(GradientStop_0_Red());
+ colorStops.Add(GradientStop_1_AlmostDarkBlue_FF0030AC());
+ result.MappingMode = CompositionMappingMode.Absolute;
+ result.EllipseCenter = new Vector2(25F, 0F);
+ result.EllipseRadius = new Vector2(50F, 50F);
+ return result;
+ }
+
+ // - - PreComp layer: Animated Rects
+ // - Layer aggregator
+ // Rectangle Path 1
+ CompositionRadialGradientBrush RadialGradientBrush_3()
+ {
+ var result = _c.CreateRadialGradientBrush();
+ var colorStops = result.ColorStops;
+ colorStops.Add(GradientStop_0_Red());
+ colorStops.Add(GradientStop_1_AlmostDarkBlue_FF0030AC());
+ result.MappingMode = CompositionMappingMode.Absolute;
+ result.EllipseCenter = new Vector2(25F, 0F);
+ result.EllipseRadius = new Vector2(50F, 50F);
+ return result;
+ }
+
+ // Rectangle Path 1.RectangleGeometry
+ CompositionRectangleGeometry Rectangle_0()
+ {
+ if (_rectangle_0 != null) { return _rectangle_0; }
+ var result = _rectangle_0 = _c.CreateRectangleGeometry();
+ result.Offset = new Vector2(-75F, -55F);
+ BindProperty(_rectangle_0, "Offset", "Vector2(0,20)-(my.Size/Vector2(2,2))", "my", _rectangle_0);
+ return result;
+ }
+
+ // Rectangle Path 1.RectangleGeometry
+ CompositionRectangleGeometry Rectangle_1()
+ {
+ if (_rectangle_1 != null) { return _rectangle_1; }
+ var result = _rectangle_1 = _c.CreateRectangleGeometry();
+ var propertySet = result.Properties;
+ propertySet.InsertVector2("Position", new Vector2(0F, 0F));
+ result.Offset = new Vector2(-75F, -75F);
+ BindProperty(_rectangle_1, "Offset", "my.Position-(my.Size/Vector2(2,2))", "my", _rectangle_1);
+ return result;
+ }
+
+ // Rectangle Path 1.RectangleGeometry
+ CompositionRectangleGeometry Rectangle_2()
+ {
+ if (_rectangle_2 != null) { return _rectangle_2; }
+ var result = _rectangle_2 = _c.CreateRectangleGeometry();
+ var propertySet = result.Properties;
+ propertySet.InsertVector2("Position", new Vector2(0F, 0F));
+ result.Offset = new Vector2(-75F, -75F);
+ BindProperty(_rectangle_2, "Offset", "my.Position-(my.Size/Vector2(2,2))", "my", _rectangle_2);
+ return result;
+ }
+
+ // Rectangle Path 1.RectangleGeometry
+ CompositionRectangleGeometry Rectangle_150_0()
+ {
+ if (_rectangle_150_0 != null) { return _rectangle_150_0; }
+ var result = _rectangle_150_0 = _c.CreateRectangleGeometry();
+ result.Offset = new Vector2(-75F, -55F);
+ result.Size = new Vector2(150F, 150F);
+ return result;
+ }
+
+ // Rectangle Path 1.RectangleGeometry
+ CompositionRectangleGeometry Rectangle_150_1()
+ {
+ if (_rectangle_150_1 != null) { return _rectangle_150_1; }
+ var result = _rectangle_150_1 = _c.CreateRectangleGeometry();
+ var propertySet = result.Properties;
+ propertySet.InsertVector2("Position", new Vector2(0F, 20F));
+ result.Offset = new Vector2(-75F, -55F);
+ result.Size = new Vector2(150F, 150F);
+ BindProperty(_rectangle_150_1, "Offset", "my.Position-Vector2(75,75)", "my", _rectangle_150_1);
+ return result;
+ }
+
+ // Rectangle Path 1.RectangleGeometry
+ CompositionRoundedRectangleGeometry RoundedRectangle_150_0()
+ {
+ if (_roundedRectangle_150_0 != null) { return _roundedRectangle_150_0; }
+ var result = _roundedRectangle_150_0 = _c.CreateRoundedRectangleGeometry();
+ result.CornerRadius = new Vector2(25F, 25F);
+ result.Offset = new Vector2(-75F, -55F);
+ result.Size = new Vector2(150F, 150F);
+ return result;
+ }
+
+ // Rectangle Path 1.RectangleGeometry
+ CompositionRoundedRectangleGeometry RoundedRectangle_150_1()
+ {
+ if (_roundedRectangle_150_1 != null) { return _roundedRectangle_150_1; }
+ var result = _roundedRectangle_150_1 = _c.CreateRoundedRectangleGeometry();
+ var propertySet = result.Properties;
+ propertySet.InsertVector2("Position", new Vector2(0F, 20F));
+ result.CornerRadius = new Vector2(25F, 25F);
+ result.Offset = new Vector2(-75F, -55F);
+ result.Size = new Vector2(150F, 150F);
+ BindProperty(_roundedRectangle_150_1, "Offset", "my.Position-Vector2(75,75)", "my", _roundedRectangle_150_1);
+ return result;
+ }
+
+ // Rectangle Path 1.RectangleGeometry
+ CompositionRoundedRectangleGeometry RoundedRectangle_150_2()
+ {
+ if (_roundedRectangle_150_2 != null) { return _roundedRectangle_150_2; }
+ var result = _roundedRectangle_150_2 = _c.CreateRoundedRectangleGeometry();
+ var propertySet = result.Properties;
+ propertySet.InsertVector2("Position", new Vector2(0F, 20F));
+ result.CornerRadius = new Vector2(25F, 25F);
+ result.Offset = new Vector2(-75F, -55F);
+ result.Size = new Vector2(150F, 150F);
+ BindProperty(_roundedRectangle_150_2, "Offset", "my.Position-Vector2(75,75)", "my", _roundedRectangle_150_2);
+ return result;
+ }
+
+ // - PreComp layer: Static Rects
+ // Layer aggregator
+ // Rectangle Path 1
+ CompositionSpriteShape SpriteShape_00()
+ {
+ // Offset:<134, 128>, Rotation:8.999991941061564 degrees
+ var geometry = Rectangle_150_0();
+ var result = CreateSpriteShape(geometry, new Matrix3x2(0.987688363F, 0.156434476F, -0.156434476F, 0.987688363F, 134F, 128F), LinearGradientBrush_0());;
+ return result;
+ }
+
+ // - PreComp layer: Static Rects
+ // Layer aggregator
+ // Rectangle Path 1
+ CompositionSpriteShape SpriteShape_01()
+ {
+ // Offset:<312, 128>, Rotation:8.999991941061564 degrees
+ var geometry = Rectangle_150_0();
+ var result = CreateSpriteShape(geometry, new Matrix3x2(0.987688363F, 0.156434476F, -0.156434476F, 0.987688363F, 312F, 128F), RadialGradientBrush_0());;
+ return result;
+ }
+
+ // - PreComp layer: Static Rects
+ // Layer aggregator
+ // Rectangle Path 1
+ CompositionSpriteShape SpriteShape_02()
+ {
+ // Offset:<482, 129>, Rotation:8.999991941061564 degrees
+ var geometry = RoundedRectangle_150_0();
+ var result = CreateSpriteShape(geometry, new Matrix3x2(0.987688363F, 0.156434476F, -0.156434476F, 0.987688363F, 482F, 129F), LinearGradientBrush_1());;
+ return result;
+ }
+
+ // - PreComp layer: Static Rects
+ // Layer aggregator
+ // Rectangle Path 1
+ CompositionSpriteShape SpriteShape_03()
+ {
+ // Offset:<660, 129>, Rotation:8.999991941061564 degrees
+ var geometry = RoundedRectangle_150_0();
+ var result = CreateSpriteShape(geometry, new Matrix3x2(0.987688363F, 0.156434476F, -0.156434476F, 0.987688363F, 660F, 129F), RadialGradientBrush_1());;
+ return result;
+ }
+
+ // - PreComp layer: Animated Rects
+ // Layer aggregator
+ // Rectangle Path 1
+ CompositionSpriteShape SpriteShape_04()
+ {
+ // Offset:<130, 342>, Rotation:8.999991941061564 degrees
+ var geometry = Rectangle_150_1();
+ var result = CreateSpriteShape(geometry, new Matrix3x2(0.987688363F, 0.156434476F, -0.156434476F, 0.987688363F, 130F, 342F), LinearGradientBrush_2());;
+ return result;
+ }
+
+ // - PreComp layer: Animated Rects
+ // Layer aggregator
+ // Rectangle Path 1
+ CompositionSpriteShape SpriteShape_05()
+ {
+ // Offset:<308, 342>, Rotation:8.999991941061564 degrees
+ var geometry = Rectangle_0();
+ var result = CreateSpriteShape(geometry, new Matrix3x2(0.987688363F, 0.156434476F, -0.156434476F, 0.987688363F, 308F, 342F), RadialGradientBrush_2());;
+ return result;
+ }
+
+ // - PreComp layer: Animated Rects
+ // Layer aggregator
+ // Rectangle Path 1
+ CompositionSpriteShape SpriteShape_06()
+ {
+ if (_spriteShape_06 != null) { return _spriteShape_06; }
+ var result = _spriteShape_06 = _c.CreateSpriteShape(RoundedRectangle_150_1());
+ result.FillBrush = LinearGradientBrush_3();
+ return result;
+ }
+
+ // - PreComp layer: Animated Rects
+ // Layer aggregator
+ // Rectangle Path 1
+ CompositionSpriteShape SpriteShape_07()
+ {
+ if (_spriteShape_07 != null) { return _spriteShape_07; }
+ var result = _spriteShape_07 = _c.CreateSpriteShape(RoundedRectangle_150_2());
+ result.FillBrush = RadialGradientBrush_3();
+ return result;
+ }
+
+ // Layer aggregator
+ // Rectangle Path 1
+ CompositionSpriteShape SpriteShape_08()
+ {
+ // Offset:<192, 596>, Rotation:8.999991941061564 degrees
+ var geometry = Rectangle_1();
+ var result = CreateSpriteShape(geometry, new Matrix3x2(0.987688363F, 0.156434476F, -0.156434476F, 0.987688363F, 192F, 596F), LinearGradientBrush_4());;
+ return result;
+ }
+
+ // Layer aggregator
+ // Rectangle Path 1
+ CompositionSpriteShape SpriteShape_09()
+ {
+ // Offset:<628, 736>, Rotation:8.999988861798546 degrees, Scale:<1.62735, 1.6635401>,
+ // Skew:<1.12535155E-08, 0>
+ var geometry = Rectangle_2();
+ var result = CreateSpriteShape(geometry, new Matrix3x2(1.60731459F, 0.254573643F, -0.260235012F, 1.64305913F, 628F, 736F), LinearGradientBrush_5());;
+ return result;
+ }
+
+ // Layer aggregator
+ // Path 1
+ CompositionSpriteShape SpriteShape_10()
+ {
+ // Offset:<590, 572>, Rotation:8.999991941061564 degrees
+ var geometry = PathGeometry();
+ var result = CreateSpriteShape(geometry, new Matrix3x2(0.987688363F, 0.156434476F, -0.156434476F, 0.987688363F, 590F, 572F), LinearGradientBrush_6());;
+ return result;
+ }
+
+ // Transforms for Static Rects Scale(1,1,0)
+ ContainerVisual ContainerVisual_0()
+ {
+ var result = _c.CreateContainerVisual();
+ result.Clip = InsetClip_0();
+ result.Size = new Vector2(1000F, 1000F);
+ // Scale:<1, 1>
+ result.TransformMatrix = new Matrix4x4(1F, 0F, 0F, 0F, 0F, 1F, 0F, 0F, 0F, 0F, 0F, 0F, 0F, 0F, 0F, 1F);
+ // Layer aggregator
+ result.Children.InsertAtTop(ShapeVisual_0());
+ return result;
+ }
+
+ // Transforms for Animated Rects Scale(1,1,0)
+ ContainerVisual ContainerVisual_1()
+ {
+ var result = _c.CreateContainerVisual();
+ result.Clip = InsetClip_0();
+ result.Size = new Vector2(1000F, 1000F);
+ // Scale:<1, 1>
+ result.TransformMatrix = new Matrix4x4(1F, 0F, 0F, 0F, 0F, 1F, 0F, 0F, 0F, 0F, 0F, 0F, 0F, 0F, 0F, 1F);
+ // Layer aggregator
+ result.Children.InsertAtTop(ShapeVisual_1());
+ return result;
+ }
+
+ // The root of the composition.
+ ContainerVisual Root()
+ {
+ if (_root != null) { return _root; }
+ var result = _root = _c.CreateContainerVisual();
+ var propertySet = result.Properties;
+ propertySet.InsertScalar("Progress", 0F);
+ var children = result.Children;
+ // Transforms for White Solid 1 Scale(1,1,0)
+ children.InsertAtTop(SpriteVisual_0());
+ // PreComp layer: Static Rects
+ children.InsertAtTop(ContainerVisual_0());
+ // PreComp layer: Animated Rects
+ children.InsertAtTop(ContainerVisual_1());
+ // Layer aggregator
+ children.InsertAtTop(ShapeVisual_2());
+ return result;
+ }
+
+ ExpressionAnimation RootProgress()
+ {
+ if (_rootProgress != null) { return _rootProgress; }
+ var result = _rootProgress = _c.CreateExpressionAnimation("_.Progress");
+ result.SetReferenceParameter("_", _root);
+ return result;
+ }
+
+ InsetClip InsetClip_0()
+ {
+ if (_insetClip_0 != null) { return _insetClip_0; }
+ var result = _insetClip_0 = _c.CreateInsetClip();
+ return result;
+ }
+
+ LinearEasingFunction LinearEasingFunction_0()
+ {
+ return (_linearEasingFunction_0 == null)
+ ? _linearEasingFunction_0 = _c.CreateLinearEasingFunction()
+ : _linearEasingFunction_0;
+ }
+
+ // Rotation
+ ScalarKeyFrameAnimation RotationAngleInDegreesScalarAnimation_9_to_9()
+ {
+ // Frame 0.
+ if (_rotationAngleInDegreesScalarAnimation_9_to_9 != null) { return _rotationAngleInDegreesScalarAnimation_9_to_9; }
+ var result = _rotationAngleInDegreesScalarAnimation_9_to_9 = CreateScalarKeyFrameAnimation(0F, 9F, HoldThenStepEasingFunction());
+ // Frame 72.
+ result.InsertKeyFrame(0.479999989F, 20F, LinearEasingFunction_0());
+ // Frame 150.
+ result.InsertKeyFrame(1F, 9F, LinearEasingFunction_0());
+ return result;
+ }
+
+ // PreComp layer: Static Rects
+ // Layer aggregator
+ ShapeVisual ShapeVisual_0()
+ {
+ var result = _c.CreateShapeVisual();
+ result.Size = new Vector2(1000F, 1000F);
+ var shapes = result.Shapes;
+ // RotationDegrees:9, Offset:<134, 128>
+ shapes.Add(SpriteShape_00());
+ // RotationDegrees:9, Offset:<312, 128>
+ shapes.Add(SpriteShape_01());
+ // RotationDegrees:9, Offset:<482, 129>
+ shapes.Add(SpriteShape_02());
+ // RotationDegrees:9, Offset:<660, 129>
+ shapes.Add(SpriteShape_03());
+ return result;
+ }
+
+ // PreComp layer: Animated Rects
+ // Layer aggregator
+ ShapeVisual ShapeVisual_1()
+ {
+ var result = _c.CreateShapeVisual();
+ result.Size = new Vector2(1000F, 1000F);
+ var shapes = result.Shapes;
+ // RotationDegrees:9, Offset:<130, 342>
+ shapes.Add(SpriteShape_04());
+ // RotationDegrees:9, Offset:<308, 342>
+ shapes.Add(SpriteShape_05());
+ // Rectangle Path 1
+ shapes.Add(SpriteShape_06());
+ // Rectangle Path 1
+ shapes.Add(SpriteShape_07());
+ return result;
+ }
+
+ // Layer aggregator
+ ShapeVisual ShapeVisual_2()
+ {
+ var result = _c.CreateShapeVisual();
+ result.Size = new Vector2(1000F, 1000F);
+ var shapes = result.Shapes;
+ // RotationDegrees:9, Offset:<192, 596>
+ shapes.Add(SpriteShape_08());
+ // Scale:1.62735,1.66354, RotationDegrees:9, Offset:<628, 736>
+ shapes.Add(SpriteShape_09());
+ // RotationDegrees:9, Offset:<590, 572>
+ shapes.Add(SpriteShape_10());
+ return result;
+ }
+
+ // SolidLayerRectangle
+ SpriteVisual SpriteVisual_0()
+ {
+ var result = _c.CreateSpriteVisual();
+ result.Size = new Vector2(1000F, 1000F);
+ // Scale:<1, 1>
+ result.TransformMatrix = new Matrix4x4(1F, 0F, 0F, 0F, 0F, 1F, 0F, 0F, 0F, 0F, 0F, 0F, 0F, 0F, 0F, 1F);
+ result.Brush = ColorBrush_White();
+ return result;
+ }
+
+ StepEasingFunction HoldThenStepEasingFunction()
+ {
+ if (_holdThenStepEasingFunction != null) { return _holdThenStepEasingFunction; }
+ var result = _holdThenStepEasingFunction = _c.CreateStepEasingFunction();
+ result.IsFinalStepSingleFrame = true;
+ return result;
+ }
+
+ // EndPointSource
+ Vector2KeyFrameAnimation EndPointSourceVector2Animation()
+ {
+ // Frame 0.
+ if (_endPointSourceVector2Animation != null) { return _endPointSourceVector2Animation; }
+ var result = _endPointSourceVector2Animation = CreateVector2KeyFrameAnimation(0F, new Vector2(20F, 20F), HoldThenStepEasingFunction());
+ // Frame 71.
+ result.InsertKeyFrame(0.473333299F, new Vector2(20F, 106F), LinearEasingFunction_0());
+ // Frame 149.
+ result.InsertKeyFrame(0.99333334F, new Vector2(20F, 20F), LinearEasingFunction_0());
+ return result;
+ }
+
+ // - - PreComp layer: Animated Rects
+ // - Layer aggregator
+ // Rectangle Path 1
+ // Offset
+ Vector2KeyFrameAnimation OffsetVector2Animation_0()
+ {
+ // Frame 0.
+ var result = CreateVector2KeyFrameAnimation(0F, new Vector2(478F, 343F), HoldThenStepEasingFunction());
+ // Frame 72.
+ result.InsertKeyFrame(0.479999989F, new Vector2(492F, 375F), LinearEasingFunction_0());
+ // Frame 150.
+ result.InsertKeyFrame(1F, new Vector2(478F, 343F), LinearEasingFunction_0());
+ return result;
+ }
+
+ // - - PreComp layer: Animated Rects
+ // - Layer aggregator
+ // Rectangle Path 1
+ // Offset
+ Vector2KeyFrameAnimation OffsetVector2Animation_1()
+ {
+ // Frame 0.
+ var result = CreateVector2KeyFrameAnimation(0F, new Vector2(656F, 343F), HoldThenStepEasingFunction());
+ // Frame 72.
+ result.InsertKeyFrame(0.479999989F, new Vector2(675F, 343F), LinearEasingFunction_0());
+ // Frame 150.
+ result.InsertKeyFrame(1F, new Vector2(656F, 343F), LinearEasingFunction_0());
+ return result;
+ }
+
+ // Rectangle Path 1.RectangleGeometry
+ // Position
+ Vector2KeyFrameAnimation PositionVector2Animation_0()
+ {
+ // Frame 0.
+ var result = CreateVector2KeyFrameAnimation(0F, new Vector2(0F, 20F), HoldThenStepEasingFunction());
+ // Frame 72.
+ result.InsertKeyFrame(0.479999989F, new Vector2(50F, 20F), LinearEasingFunction_0());
+ // Frame 150.
+ result.InsertKeyFrame(1F, new Vector2(0F, 20F), LinearEasingFunction_0());
+ return result;
+ }
+
+ // Rectangle Path 1.RectangleGeometry
+ // Position
+ Vector2KeyFrameAnimation PositionVector2Animation_1()
+ {
+ // Frame 0.
+ var result = CreateVector2KeyFrameAnimation(0F, new Vector2(0F, 20F), HoldThenStepEasingFunction());
+ // Frame 72.
+ result.InsertKeyFrame(0.479999989F, new Vector2(-36F, 0F), LinearEasingFunction_0());
+ // Frame 150.
+ result.InsertKeyFrame(1F, new Vector2(0F, 20F), LinearEasingFunction_0());
+ return result;
+ }
+
+ // Rectangle Path 1.RectangleGeometry
+ // Position
+ Vector2KeyFrameAnimation PositionVector2Animation_2()
+ {
+ // Frame 0.
+ var result = CreateVector2KeyFrameAnimation(0F, new Vector2(0F, 20F), HoldThenStepEasingFunction());
+ // Frame 72.
+ result.InsertKeyFrame(0.479999989F, new Vector2(0F, -10F), LinearEasingFunction_0());
+ // Frame 150.
+ result.InsertKeyFrame(1F, new Vector2(0F, 20F), LinearEasingFunction_0());
+ return result;
+ }
+
+ // Position
+ Vector2KeyFrameAnimation PositionVector2Animation_3()
+ {
+ // Frame 0.
+ if (_positionVector2Animation_3 != null) { return _positionVector2Animation_3; }
+ var result = _positionVector2Animation_3 = CreateVector2KeyFrameAnimation(0F, new Vector2(0F, 0F), HoldThenStepEasingFunction());
+ // Frame 71.
+ result.InsertKeyFrame(0.473333299F, new Vector2(97F, 0F), LinearEasingFunction_0());
+ // Frame 149.
+ result.InsertKeyFrame(0.99333334F, new Vector2(0F, 0F), LinearEasingFunction_0());
+ return result;
+ }
+
+ // Rectangle Path 1.RectangleGeometry
+ // Size
+ Vector2KeyFrameAnimation SizeVector2Animation_0()
+ {
+ // Frame 0.
+ var result = CreateVector2KeyFrameAnimation(0F, new Vector2(150F, 150F), HoldThenStepEasingFunction());
+ // Frame 72.
+ result.InsertKeyFrame(0.479999989F, new Vector2(88F, 88F), LinearEasingFunction_0());
+ // Frame 150.
+ result.InsertKeyFrame(1F, new Vector2(150F, 150F), LinearEasingFunction_0());
+ return result;
+ }
+
+ // Size
+ Vector2KeyFrameAnimation SizeVector2Animation_1()
+ {
+ // Frame 0.
+ if (_sizeVector2Animation_1 != null) { return _sizeVector2Animation_1; }
+ var result = _sizeVector2Animation_1 = CreateVector2KeyFrameAnimation(0F, new Vector2(150F, 150F), HoldThenStepEasingFunction());
+ // Frame 71.
+ result.InsertKeyFrame(0.473333299F, new Vector2(228F, 228F), LinearEasingFunction_0());
+ // Frame 149.
+ result.InsertKeyFrame(0.99333334F, new Vector2(150F, 150F), LinearEasingFunction_0());
+ return result;
+ }
+
+ // StartPointSource
+ Vector2KeyFrameAnimation StartPointSourceVector2Animation()
+ {
+ // Frame 0.
+ if (_startPointSourceVector2Animation != null) { return _startPointSourceVector2Animation; }
+ var result = _startPointSourceVector2Animation = CreateVector2KeyFrameAnimation(0F, new Vector2(-22F, -20F), HoldThenStepEasingFunction());
+ // Frame 71.
+ result.InsertKeyFrame(0.473333299F, new Vector2(31F, -20F), LinearEasingFunction_0());
+ // Frame 149.
+ result.InsertKeyFrame(0.99333334F, new Vector2(-22F, -20F), LinearEasingFunction_0());
+ return result;
+ }
+
+ internal CodeGen_AnimatedVisual(
+ Compositor compositor
+ )
+ {
+ _c = compositor;
+ _reusableExpressionAnimation = compositor.CreateExpressionAnimation();
+ Root();
+ }
+
+ public Visual RootVisual => _root;
+ public TimeSpan Duration => TimeSpan.FromTicks(c_durationTicks);
+ public Vector2 Size => new Vector2(1000F, 1000F);
+ void IDisposable.Dispose() => _root?.Dispose();
+
+ public void CreateAnimations()
+ {
+ StartProgressBoundAnimation(_linearGradientBrush_4, "StartPointSource", StartPointSourceVector2Animation(), RootProgress());
+ StartProgressBoundAnimation(_linearGradientBrush_4, "EndPointSource", EndPointSourceVector2Animation(), RootProgress());
+ StartProgressBoundAnimation(_linearGradientBrush_5, "StartPointSource", StartPointSourceVector2Animation(), RootProgress());
+ StartProgressBoundAnimation(_linearGradientBrush_5, "EndPointSource", EndPointSourceVector2Animation(), RootProgress());
+ StartProgressBoundAnimation(_rectangle_0, "Size", SizeVector2Animation_0(), RootProgress());
+ StartProgressBoundAnimation(_rectangle_1, "Position", PositionVector2Animation_3(), RootProgress());
+ StartProgressBoundAnimation(_rectangle_1, "Size", SizeVector2Animation_1(), RootProgress());
+ StartProgressBoundAnimation(_rectangle_2, "Position", PositionVector2Animation_3(), RootProgress());
+ StartProgressBoundAnimation(_rectangle_2, "Size", SizeVector2Animation_1(), RootProgress());
+ StartProgressBoundAnimation(_rectangle_150_1, "Position", PositionVector2Animation_0(), RootProgress());
+ StartProgressBoundAnimation(_roundedRectangle_150_1, "Position", PositionVector2Animation_1(), RootProgress());
+ StartProgressBoundAnimation(_roundedRectangle_150_2, "Position", PositionVector2Animation_2(), RootProgress());
+ StartProgressBoundAnimation(_spriteShape_06, "RotationAngleInDegrees", RotationAngleInDegreesScalarAnimation_9_to_9(), RootProgress());
+ StartProgressBoundAnimation(_spriteShape_06, "Offset", OffsetVector2Animation_0(), RootProgress());
+ StartProgressBoundAnimation(_spriteShape_07, "RotationAngleInDegrees", RotationAngleInDegreesScalarAnimation_9_to_9(), RootProgress());
+ StartProgressBoundAnimation(_spriteShape_07, "Offset", OffsetVector2Animation_1(), RootProgress());
+ }
+
+ public void DestroyAnimations()
+ {
+ _linearGradientBrush_4.StopAnimation("StartPointSource");
+ _linearGradientBrush_4.StopAnimation("EndPointSource");
+ _linearGradientBrush_5.StopAnimation("StartPointSource");
+ _linearGradientBrush_5.StopAnimation("EndPointSource");
+ _rectangle_0.StopAnimation("Size");
+ _rectangle_1.StopAnimation("Position");
+ _rectangle_1.StopAnimation("Size");
+ _rectangle_2.StopAnimation("Position");
+ _rectangle_2.StopAnimation("Size");
+ _rectangle_150_1.StopAnimation("Position");
+ _roundedRectangle_150_1.StopAnimation("Position");
+ _roundedRectangle_150_2.StopAnimation("Position");
+ _spriteShape_06.StopAnimation("RotationAngleInDegrees");
+ _spriteShape_06.StopAnimation("Offset");
+ _spriteShape_07.StopAnimation("RotationAngleInDegrees");
+ _spriteShape_07.StopAnimation("Offset");
+ }
+
+ internal static bool IsRuntimeCompatible()
+ {
+ return Windows.Foundation.Metadata.ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 12);
+ }
+ }
+ }
+}
diff --git a/LottieTest/Tests/Gradient/Frames/frame001.png b/LottieTest/Tests/Gradient/Frames/frame001.png
new file mode 100644
index 00000000..06334aa7
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame001.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame006.png b/LottieTest/Tests/Gradient/Frames/frame006.png
new file mode 100644
index 00000000..94d3bde3
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame006.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame011.png b/LottieTest/Tests/Gradient/Frames/frame011.png
new file mode 100644
index 00000000..8f9ae012
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame011.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame016.png b/LottieTest/Tests/Gradient/Frames/frame016.png
new file mode 100644
index 00000000..f6ba1a2f
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame016.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame021.png b/LottieTest/Tests/Gradient/Frames/frame021.png
new file mode 100644
index 00000000..0857d693
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame021.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame026.png b/LottieTest/Tests/Gradient/Frames/frame026.png
new file mode 100644
index 00000000..0c57c0c9
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame026.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame031.png b/LottieTest/Tests/Gradient/Frames/frame031.png
new file mode 100644
index 00000000..57cd8f0b
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame031.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame036.png b/LottieTest/Tests/Gradient/Frames/frame036.png
new file mode 100644
index 00000000..8eb3267c
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame036.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame041.png b/LottieTest/Tests/Gradient/Frames/frame041.png
new file mode 100644
index 00000000..d2cac482
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame041.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame046.png b/LottieTest/Tests/Gradient/Frames/frame046.png
new file mode 100644
index 00000000..5f9ce459
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame046.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame051.png b/LottieTest/Tests/Gradient/Frames/frame051.png
new file mode 100644
index 00000000..a06fb022
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame051.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame056.png b/LottieTest/Tests/Gradient/Frames/frame056.png
new file mode 100644
index 00000000..d4853283
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame056.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame061.png b/LottieTest/Tests/Gradient/Frames/frame061.png
new file mode 100644
index 00000000..da595966
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame061.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame066.png b/LottieTest/Tests/Gradient/Frames/frame066.png
new file mode 100644
index 00000000..63df9cdb
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame066.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame071.png b/LottieTest/Tests/Gradient/Frames/frame071.png
new file mode 100644
index 00000000..66f6e610
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame071.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame076.png b/LottieTest/Tests/Gradient/Frames/frame076.png
new file mode 100644
index 00000000..d1aab230
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame076.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame081.png b/LottieTest/Tests/Gradient/Frames/frame081.png
new file mode 100644
index 00000000..168688b4
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame081.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame086.png b/LottieTest/Tests/Gradient/Frames/frame086.png
new file mode 100644
index 00000000..2096f87c
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame086.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame091.png b/LottieTest/Tests/Gradient/Frames/frame091.png
new file mode 100644
index 00000000..45f6e214
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame091.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame096.png b/LottieTest/Tests/Gradient/Frames/frame096.png
new file mode 100644
index 00000000..89ab24c1
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame096.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame101.png b/LottieTest/Tests/Gradient/Frames/frame101.png
new file mode 100644
index 00000000..997e4422
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame101.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame106.png b/LottieTest/Tests/Gradient/Frames/frame106.png
new file mode 100644
index 00000000..0d328944
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame106.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame111.png b/LottieTest/Tests/Gradient/Frames/frame111.png
new file mode 100644
index 00000000..e256f9e0
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame111.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame116.png b/LottieTest/Tests/Gradient/Frames/frame116.png
new file mode 100644
index 00000000..7269b052
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame116.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame121.png b/LottieTest/Tests/Gradient/Frames/frame121.png
new file mode 100644
index 00000000..59f40402
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame121.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame126.png b/LottieTest/Tests/Gradient/Frames/frame126.png
new file mode 100644
index 00000000..b0e3feaf
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame126.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame131.png b/LottieTest/Tests/Gradient/Frames/frame131.png
new file mode 100644
index 00000000..f68ef6ab
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame131.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame136.png b/LottieTest/Tests/Gradient/Frames/frame136.png
new file mode 100644
index 00000000..e0a0923a
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame136.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame141.png b/LottieTest/Tests/Gradient/Frames/frame141.png
new file mode 100644
index 00000000..218b4807
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame141.png differ
diff --git a/LottieTest/Tests/Gradient/Frames/frame146.png b/LottieTest/Tests/Gradient/Frames/frame146.png
new file mode 100644
index 00000000..47651663
Binary files /dev/null and b/LottieTest/Tests/Gradient/Frames/frame146.png differ
diff --git a/LottieTest/Tests/Gradient/Lottie.json b/LottieTest/Tests/Gradient/Lottie.json
new file mode 100644
index 00000000..45b4adcf
--- /dev/null
+++ b/LottieTest/Tests/Gradient/Lottie.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":29.9700012207031,"ip":0,"op":150.000006109625,"w":1000,"h":1000,"nm":"Comp 1","ddd":0,"assets":[{"id":"comp_0","nm":"Animated Rects","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[9]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":72,"s":[20]},{"t":150.000006109625,"s":[9]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[656,343,0],"to":[3.167,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":72,"s":[675,343,0],"to":[0,0,0],"ti":[3.167,0,0]},{"t":150.000006109625,"s":[656,343,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[150,150],"ix":2},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,20],"to":[0,-5],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":72,"s":[0,-10],"to":[0,0],"ti":[0,-5]},{"t":150.000006109625,"s":[0,20]}],"ix":3},"r":{"a":0,"k":25,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0,0,0.5,0.5,0.095,0.337,1,0,0.19,0.675],"ix":9}},"s":{"a":0,"k":[25,0],"ix":5},"e":{"a":0,"k":[75,0],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[9]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":72,"s":[20]},{"t":150.000006109625,"s":[9]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[478,343,0],"to":[2.333,5.333,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":72,"s":[492,375,0],"to":[0,0,0],"ti":[2.333,5.333,0]},{"t":150.000006109625,"s":[478,343,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[150,150],"ix":2},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,20],"to":[-6,-3.333],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":72,"s":[-36,0],"to":[0,0],"ti":[-6,-3.333]},{"t":150.000006109625,"s":[0,20]}],"ix":3},"r":{"a":0,"k":25,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0,0,0.5,0.5,0.095,0.337,1,0,0.19,0.675],"ix":9}},"s":{"a":0,"k":[-22,12],"ix":5},"e":{"a":0,"k":[20,51],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":9,"ix":10},"p":{"a":0,"k":[308,342,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[150,150]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":72,"s":[88,88]},{"t":150.000006109625,"s":[150,150]}],"ix":2},"p":{"a":0,"k":[0,20],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0,0,0.5,0.5,0.095,0.337,1,0,0.19,0.675],"ix":9}},"s":{"a":0,"k":[25,0],"ix":5},"e":{"a":0,"k":[75,0],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":9,"ix":10},"p":{"a":0,"k":[130,342,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[150,150],"ix":2},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,20],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":72,"s":[50,20],"to":[0,0],"ti":[0,0]},{"t":150.000006109625,"s":[0,20]}],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0,0,0.5,0.5,0.095,0.337,1,0,0.19,0.675],"ix":9}},"s":{"a":0,"k":[-22,12],"ix":5},"e":{"a":0,"k":[20,51],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0}]},{"id":"comp_1","nm":"Static Rects","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":9,"ix":10},"p":{"a":0,"k":[660,129,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[150,150],"ix":2},"p":{"a":0,"k":[0,20],"ix":3},"r":{"a":0,"k":25,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0,0,0.5,0.5,0.095,0.337,1,0,0.19,0.675],"ix":9}},"s":{"a":0,"k":[25,0],"ix":5},"e":{"a":0,"k":[75,0],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":9,"ix":10},"p":{"a":0,"k":[482,129,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[150,150],"ix":2},"p":{"a":0,"k":[0,20],"ix":3},"r":{"a":0,"k":25,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0,0,0.5,0.5,0.095,0.337,1,0,0.19,0.675],"ix":9}},"s":{"a":0,"k":[-22,12],"ix":5},"e":{"a":0,"k":[20,51],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":9,"ix":10},"p":{"a":0,"k":[312,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[150,150],"ix":2},"p":{"a":0,"k":[0,20],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0,0,0.5,0.5,0.095,0.337,1,0,0.19,0.675],"ix":9}},"s":{"a":0,"k":[25,0],"ix":5},"e":{"a":0,"k":[75,0],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":9,"ix":10},"p":{"a":0,"k":[134,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[150,150],"ix":2},"p":{"a":0,"k":[0,20],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0,0,0.5,0.5,0.095,0.337,1,0,0.19,0.675],"ix":9}},"s":{"a":0,"k":[-22,12],"ix":5},"e":{"a":0,"k":[20,51],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":9,"ix":10},"p":{"a":0,"k":[590,572,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-324.71,225.573],[-439.577,280.215],[-402.382,438.343],[-264.517,426.632],[-271.731,342.728],[-197.311,288.417]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0,0,0.5,0.5,0.095,0.337,1,0,0.19,0.675],"ix":9}},"s":{"a":0,"k":[54,276],"ix":5},"e":{"a":0,"k":[55,348],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Animated Gradient Linear 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":9,"ix":10},"p":{"a":0,"k":[628,736,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[162.735,166.354,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[150,150]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":71,"s":[228,228]},{"t":149.000006068894,"s":[150,150]}],"ix":2},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":71,"s":[97,0],"to":[0,0],"ti":[0,0]},{"t":149.000006068894,"s":[0,0]}],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,1,0,0,0.243,0.946,0.5,0.086,0.485,0.893,1,0.173,0.743,0.446,0.595,0.424,1,0,0.19,0.675],"ix":9}},"s":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[-22,-20],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":71,"s":[31,-20],"to":[0,0],"ti":[0,0]},{"t":149.000006068894,"s":[-22,-20]}],"ix":5},"e":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[20,20],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":71,"s":[20,106],"to":[0,0],"ti":[0,0]},{"t":149.000006068894,"s":[20,20]}],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Animated Gradient Linear","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":9,"ix":10},"p":{"a":0,"k":[192,596,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[150,150]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":71,"s":[228,228]},{"t":149.000006068894,"s":[150,150]}],"ix":2},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":71,"s":[97,0],"to":[0,0],"ti":[0,0]},{"t":149.000006068894,"s":[0,0]}],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0,0,0.5,0.5,0.095,0.337,1,0,0.19,0.675],"ix":9}},"s":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[-22,-20],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":71,"s":[31,-20],"to":[0,0],"ti":[0,0]},{"t":149.000006068894,"s":[-22,-20]}],"ix":5},"e":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[20,20],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":71,"s":[20,106],"to":[0,0],"ti":[0,0]},{"t":149.000006068894,"s":[20,20]}],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Animated Rects","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2,"l":2},"a":{"a":0,"k":[500,500,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":1000,"h":1000,"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Static Rects","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2,"l":2},"a":{"a":0,"k":[500,500,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":1000,"h":1000,"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":1,"nm":"White Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2,"l":2},"a":{"a":0,"k":[500,500,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":1000,"sh":1000,"sc":"#ffffff","ip":0,"op":900.000036657751,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/LottieTest/Tests/Gradient/Test.json b/LottieTest/Tests/Gradient/Test.json
new file mode 100644
index 00000000..649463b4
--- /dev/null
+++ b/LottieTest/Tests/Gradient/Test.json
@@ -0,0 +1,5 @@
+{
+ "duration": 5,
+ "frames-per-second": 30,
+ "number-of-frames": 150
+}
\ No newline at end of file
diff --git a/LottieTest/Tests/Gradient/Test.json.bak b/LottieTest/Tests/Gradient/Test.json.bak
new file mode 100644
index 00000000..1efd2d33
--- /dev/null
+++ b/LottieTest/Tests/Gradient/Test.json.bak
@@ -0,0 +1,5 @@
+{
+ "duration": "5",
+ "frames-per-second": "30",
+ "number-of-frames": "150"
+}
\ No newline at end of file
diff --git a/LottieTest/Tests/Logo/Animation.gif b/LottieTest/Tests/Logo/Animation.gif
new file mode 100644
index 00000000..087b44b4
Binary files /dev/null and b/LottieTest/Tests/Logo/Animation.gif differ
diff --git a/LottieTest/Tests/Logo/Lottie.json b/LottieTest/Tests/Logo/Lottie.json
new file mode 100644
index 00000000..02bc22b5
--- /dev/null
+++ b/LottieTest/Tests/Logo/Lottie.json
@@ -0,0 +1 @@
+{"v":"5.7.1","fr":60,"ip":0,"op":400,"w":1000,"h":1000,"nm":"LOTTIELOGO","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"TRACE Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[498.371,502.94,0],"ix":2},"a":{"a":0,"k":[447.459,446.918,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[32.302,-124.571],[26.403,-28.608],[34.582,17.876],[-3.936,29.805],[-36.198,2.687],[-25.818,-17.903],[-93.599,-33.983],[-61.912,17.62]],"o":[[-3.526,128.642],[-9.771,37.683],[-26.402,28.607],[-26.707,-13.806],[4.752,-35.986],[31.333,-2.325],[81.829,56.741],[61.157,22.204],[0,0]],"v":[[-51.509,-296.918],[-101.757,85.035],[-150.107,189.997],[-255.552,216.221],[-293.523,140.559],[-220.361,71.466],[-133.588,103.176],[109.281,274.714],[297.459,276.803]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":60,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[447.459,446.918],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":50,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":151,"s":[100]},{"t":250,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":151,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":250,"s":[0]},{"t":350,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":400,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 1 Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2},"a":{"a":0,"k":[500.25,500.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[14.179,-4.036],[32.865,-0.053],[0,0],[32.135,11.667],[51.155,43.278],[10.247,8.421],[12.825,-13.896],[23.342,-6.496],[22.098,11.423],[-5.523,41.832],[-18.133,17.124],[-23.606,1.752],[-25.677,-16.84],[-3.793,138.39],[-14.741,-0.407],[0.404,-14.736],[30.443,-117.402],[1.701,-5.986],[-14.817,-12.535],[-56.866,-20.646],[-62.349,17.746],[-4.036,-14.18]],"o":[[-34.576,9.84],[0,0],[-35.84,0],[-65.84,-23.905],[-9.989,-8.451],[-7.786,16.193],[-16.713,18.109],[-26.397,7.345],[-36.245,-18.735],[3.099,-23.468],[18.133,-17.125],[36.989,-2.739],[28.956,-112.666],[0.404,-14.737],[14.737,0.404],[-3.938,143.63],[-1.503,5.794],[15.546,12.372],[49.762,42.098],[51.624,18.746],[14.176,-4.032],[4.035,14.178]],"v":[[303.137,305.417],[201.501,320.326],[200.978,320.326],[98.543,302.745],[-71.349,190.811],[-101.708,165.375],[-132.12,211.04],[-194.235,249.196],[-269.438,242.873],[-321.615,140.005],[-288.69,77.059],[-223.965,47.786],[-128.494,78.447],[-79.821,-294.709],[-52.406,-320.661],[-26.454,-293.247],[-77.547,94.675],[-82.328,112.374],[-36.868,150.054],[116.762,252.563],[288.524,254.069],[321.504,272.437]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[276.143,0],[0,-276.143],[-276.142,0],[0,276.143]],"o":[[-276.142,0],[0,276.143],[276.143,0],[0,-276.143]],"v":[[0,-500],[-500,0],[0,500],[500,0]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.102000000898,0.102000000898,0.102000000898,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":[500.25,500.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[23.255,0],[1.344,-0.099],[3.114,-23.585],[-16.097,-8.321],[-17.764,19.248],[-6.564,15.918],[1.748,1.212]],"o":[[-1.349,0],[-23.725,1.761],[-2.549,19.304],[23.987,12.399],[11.252,-12.191],[-1.741,-1.241],[-18.453,-12.796]],"v":[[-7.764,-53.485],[-11.798,-53.337],[-60.473,-7.37],[-36.709,41.086],[36.863,20.47],[63.022,-22.633],[57.788,-26.311]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.102000000898,0.102000000898,0.102000000898,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":[292.035,654.613],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"TRACE Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500.031,499.827,0],"ix":2},"a":{"a":0,"k":[323.299,321.305,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[32.302,-124.571],[26.403,-28.608],[34.582,17.876],[-3.936,29.805],[-36.198,2.687],[-25.818,-17.903],[-93.599,-33.983],[-61.912,17.62]],"o":[[-3.526,128.642],[-9.771,37.683],[-26.402,28.607],[-26.707,-13.806],[4.752,-35.986],[31.333,-2.325],[81.829,56.741],[61.157,22.204],[0,0]],"v":[[-51.509,-296.918],[-101.757,85.035],[-150.107,189.997],[-255.552,216.221],[-293.523,140.559],[-220.361,71.466],[-133.588,103.176],[109.281,274.714],[297.459,276.803]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":55,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[321.639,324.418],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":50,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":151,"s":[100]},{"t":250,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":151,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":250,"s":[0]},{"t":350,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":422,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/LottieTest/Tests/Lolo/Animation.gif b/LottieTest/Tests/Lolo/Animation.gif
new file mode 100644
index 00000000..4bd637dc
Binary files /dev/null and b/LottieTest/Tests/Lolo/Animation.gif differ
diff --git a/LottieTest/Tests/Lolo/Lottie.json b/LottieTest/Tests/Lolo/Lottie.json
new file mode 100644
index 00000000..35132ca0
--- /dev/null
+++ b/LottieTest/Tests/Lolo/Lottie.json
@@ -0,0 +1 @@
+{"v":"4.8.0","meta":{"g":"LottieFiles AE 1.0.0","a":"","k":"","d":"","tc":""},"fr":24,"ip":12,"op":36,"w":1000,"h":1000,"nm":"Lolo_Walking","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Face_CTRL","parent":2,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":2,"s":[7]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":14,"s":[-7]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":26,"s":[7]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":38,"s":[-7]},{"t":50,"s":[7]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":2,"s":[20.648,-422.783,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":8,"s":[0,-384.518,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":14,"s":[-20.648,-422.783,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,-384.518,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":26,"s":[20.648,-422.783,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":32,"s":[0,-384.518,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":38,"s":[-20.648,-422.783,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[0,-384.518,0],"to":[0,0,0],"ti":[0,0,0]},{"t":50,"s":[20.648,-422.783,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":96,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Master_CTRL","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,798,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":12,"s":[95,105,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":18,"s":[105,95,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":24,"s":[95,105,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":30,"s":[105,95,100]},{"t":36,"s":[95,105,100]}],"ix":6}},"ao":0,"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Closed_Eyes 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2.007,-24.801,0],"ix":2},"a":{"a":0,"k":[397.993,289.199,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-9.517,10.423],[-16.396,-14.97]],"o":[[14.97,-16.396],[12.678,11.576]],"v":[[-29.228,5.884],[29.228,5.884]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.133333340287,0.160784319043,0.184313729405,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":20,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[536.546,289.199],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-9.517,10.423],[-16.396,-14.97]],"o":[[14.97,-16.396],[12.678,11.576]],"v":[[-29.228,5.884],[29.228,5.884]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.133333340287,0.160784319043,0.184313729405,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":20,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[259.439,289.199],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":18,"op":21,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Eyes 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2.122,-30.615,0],"ix":2},"a":{"a":0,"k":[397.878,283.385,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-13.569,0],[0,13.568],[13.566,0],[0,-13.568]],"o":[[13.566,0],[0,-13.568],[-13.569,0],[0,13.568]],"v":[[0.001,24.567],[24.566,0],[0.001,-24.567],[-24.566,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":[536.546,283.385],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-13.566,0],[0,13.568],[13.569,0],[0,-13.568]],"o":[[13.569,0],[0,-13.568],[-13.566,0],[0,13.568]],"v":[[-0.001,24.567],[24.566,0],[-0.001,-24.567],[-24.566,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":[259.21,283.385],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":21,"op":99,"st":3,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Eyes","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2.122,-30.615,0],"ix":2},"a":{"a":0,"k":[397.878,283.385,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-13.569,0],[0,13.568],[13.566,0],[0,-13.568]],"o":[[13.566,0],[0,-13.568],[-13.569,0],[0,13.568]],"v":[[0.001,24.567],[24.566,0],[0.001,-24.567],[-24.566,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":[536.546,283.385],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-13.566,0],[0,13.568],[13.569,0],[0,-13.568]],"o":[[13.569,0],[0,-13.568],[-13.566,0],[0,13.568]],"v":[[-0.001,24.567],[24.566,0],[-0.001,-24.567],[-24.566,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":[259.21,283.385],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":18,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Mouth","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0.35,38.069,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-62.348,-41.943],[-52.911,31.724]],"o":[[52.277,35.168],[65.343,-39.178]],"v":[[-83.643,-12.551],[83.643,-12.551]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":28,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"R_Arm","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":-10,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":2,"s":[-84]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":26,"s":[-84]},{"t":38,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":2,"s":[-211.135,-279.663,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[-252.431,-279.663,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":26,"s":[-211.135,-279.663,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":38,"s":[-252.431,-279.663,0],"to":[0,0,0],"ti":[0,0,0]},{"t":50,"s":[-211.135,-279.663,0]}],"ix":2},"a":{"a":0,"k":[99.445,-97.888,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[52.441,12.175],[77.703,10.693]],"o":[[-67.01,-15.558],[-97.583,-13.429]],"v":[[99.445,-97.102],[-99.445,97.511]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[{"i":[[36.388,-39.676],[77.703,10.693]],"o":[[-87.122,94.995],[-97.583,-13.429]],"v":[[99.445,-97.102],[-152.853,21.126]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[{"i":[[48.198,-23.984],[38.337,-49.273]],"o":[[-89.268,44.421],[-60.488,77.743]],"v":[[99.445,-97.102],[-99.445,97.511]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[{"i":[[48.198,-23.984],[-19.967,-98.892]],"o":[[-89.268,44.421],[19.495,96.554]],"v":[[99.445,-97.102],[-64.753,122.307]],"c":false}]},{"t":36,"s":[{"i":[[52.441,12.175],[77.703,10.693]],"o":[[-67.01,-15.558],[-97.583,-13.429]],"v":[[99.445,-97.102],[-99.445,97.511]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":48,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Outline","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-298,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[19.419,-0.031],[0,0],[13.72,13.741],[0,19.419],[4.442,55.381],[13.845,75.65],[-12.578,14.795],[-19.354,1.584],[0,0],[-14.775,-12.602],[-7.811,-29.999],[-9.887,-136.734],[0,0],[13.719,-13.744]],"o":[[0,0],[-19.419,-0.031],[-13.72,-13.744],[0,0],[-4.442,-55.38],[-4.729,-25.841],[12.578,-14.795],[0,0],[19.36,-1.522],[14.774,12.601],[8.654,33.235],[11.614,160.614],[0,19.419],[-13.721,13.741]],"v":[[219.109,295.247],[-223.715,295.247],[-275.467,273.739],[-296.894,221.952],[-302.355,24.048],[-332.792,-210.031],[-318.733,-265.27],[-265.708,-288.943],[169.383,-333.874],[222.691,-316.571],[248.189,-266.663],[278.913,-28.329],[292.289,221.952],[270.863,273.739]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":18,"s":[{"i":[[19.419,-0.031],[0,0],[13.72,13.741],[0,19.419],[0,183.938],[0,0],[-13.72,13.742],[-19.419,0.031],[0,0],[-13.721,-13.742],[0,-19.419],[0,-142],[0,0],[13.719,-13.744]],"o":[[0,0],[-19.419,-0.031],[-13.72,-13.744],[0,0],[0,-119.22],[0,-19.419],[13.72,-13.742],[0,0],[19.419,0.031],[13.719,13.742],[0,0],[0,129.579],[0,19.419],[-13.721,13.741]],"v":[[219.109,295.247],[-223.715,295.247],[-275.467,273.739],[-300.703,221.952],[-312.132,0.378],[-300.703,-222.515],[-275.467,-274.302],[-223.715,-295.811],[219.109,-295.811],[270.863,-274.302],[292.289,-222.515],[307.527,12.632],[292.289,221.952],[270.863,273.739]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":24,"s":[{"i":[[19.419,-0.031],[0,0],[13.72,13.741],[0,19.419],[-13.398,159.271],[-15.538,65.76],[-14.476,12.944],[-19.39,-1.068],[0,0],[-12.921,-14.497],[1.069,-30.981],[10.013,-136.725],[0,0],[13.719,-13.744]],"o":[[0,0],[-19.419,-0.031],[-13.72,-13.744],[0,0],[8.524,-101.335],[6.041,-25.567],[14.476,-12.944],[0,0],[19.386,1.13],[12.92,14.496],[-1.069,30.981],[-7.801,106.524],[0,19.419],[-13.721,13.741]],"v":[[219.109,295.247],[-223.715,295.247],[-275.467,273.739],[-296.894,221.952],[-301.156,-19.712],[-266.568,-261.094],[-241.193,-313.49],[-189.36,-330.133],[252.755,-295.559],[306.368,-274.013],[321.672,-218.24],[299.576,19.388],[292.289,221.952],[270.863,273.739]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[19.419,-0.031],[0,0],[13.72,13.741],[0,19.419],[0,183.938],[0,0],[-13.72,13.742],[-19.419,0.031],[0,0],[-13.721,-13.742],[0,-19.419],[0,-142],[0,0],[13.719,-13.744]],"o":[[0,0],[-19.419,-0.031],[-13.72,-13.744],[0,0],[0,-119.22],[0,-19.419],[13.72,-13.742],[0,0],[19.419,0.031],[13.719,13.742],[0,0],[0,129.579],[0,19.419],[-13.721,13.741]],"v":[[219.109,295.247],[-223.715,295.247],[-275.467,273.739],[-300.703,221.952],[-312.132,0.378],[-300.703,-222.515],[-275.467,-274.302],[-223.715,-295.811],[219.109,-295.811],[270.863,-274.302],[292.289,-222.515],[307.527,12.632],[292.289,221.952],[270.863,273.739]],"c":true}]},{"t":36,"s":[{"i":[[19.419,-0.031],[0,0],[13.72,13.741],[0,19.419],[4.442,55.381],[13.845,75.65],[-12.578,14.795],[-19.354,1.584],[0,0],[-14.775,-12.602],[-7.811,-29.999],[-9.887,-136.734],[0,0],[13.719,-13.744]],"o":[[0,0],[-19.419,-0.031],[-13.72,-13.744],[0,0],[-4.442,-55.38],[-4.729,-25.841],[12.578,-14.795],[0,0],[19.36,-1.522],[14.774,12.601],[8.654,33.235],[11.614,160.614],[0,19.419],[-13.721,13.741]],"v":[[219.109,295.247],[-223.715,295.247],[-275.467,273.739],[-296.894,221.952],[-302.355,24.048],[-332.792,-210.031],[-318.733,-265.27],[-265.708,-288.943],[169.383,-333.874],[222.691,-316.571],[248.189,-266.663],[278.913,-28.329],[292.289,221.952],[270.863,273.739]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":20,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Fill","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-298,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[19.419,-0.031],[0,0],[13.72,13.741],[0,19.419],[4.442,55.381],[13.845,75.65],[-12.578,14.795],[-19.354,1.584],[0,0],[-14.775,-12.602],[-7.811,-29.999],[-9.887,-136.734],[0,0],[13.719,-13.744]],"o":[[0,0],[-19.419,-0.031],[-13.72,-13.744],[0,0],[-4.442,-55.38],[-4.729,-25.841],[12.578,-14.795],[0,0],[19.36,-1.522],[14.774,12.601],[8.654,33.235],[11.614,160.614],[0,19.419],[-13.721,13.741]],"v":[[219.109,295.247],[-223.715,295.247],[-275.467,273.739],[-296.894,221.952],[-302.355,24.048],[-332.792,-210.031],[-318.733,-265.27],[-265.708,-288.943],[169.383,-333.874],[222.691,-316.571],[248.189,-266.663],[278.913,-28.329],[292.289,221.952],[270.863,273.739]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":18,"s":[{"i":[[19.419,-0.031],[0,0],[13.72,13.741],[0,19.419],[0,183.938],[0,0],[-13.72,13.742],[-19.419,0.031],[0,0],[-13.721,-13.742],[0,-19.419],[0,-142],[0,0],[13.719,-13.744]],"o":[[0,0],[-19.419,-0.031],[-13.72,-13.744],[0,0],[0,-119.22],[0,-19.419],[13.72,-13.742],[0,0],[19.419,0.031],[13.719,13.742],[0,0],[0,129.579],[0,19.419],[-13.721,13.741]],"v":[[219.109,295.247],[-223.715,295.247],[-275.467,273.739],[-300.703,221.952],[-312.132,0.378],[-300.703,-222.515],[-275.467,-274.302],[-223.715,-295.811],[219.109,-295.811],[270.863,-274.302],[292.289,-222.515],[307.527,12.632],[292.289,221.952],[270.863,273.739]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":24,"s":[{"i":[[19.419,-0.031],[0,0],[13.72,13.741],[0,19.419],[-13.398,159.271],[-15.538,65.76],[-14.476,12.944],[-19.39,-1.068],[0,0],[-12.921,-14.497],[1.069,-30.981],[10.013,-136.725],[0,0],[13.719,-13.744]],"o":[[0,0],[-19.419,-0.031],[-13.72,-13.744],[0,0],[8.524,-101.335],[6.041,-25.567],[14.476,-12.944],[0,0],[19.386,1.13],[12.92,14.496],[-1.069,30.981],[-7.801,106.524],[0,19.419],[-13.721,13.741]],"v":[[219.109,295.247],[-223.715,295.247],[-275.467,273.739],[-296.894,221.952],[-301.156,-19.712],[-266.568,-261.094],[-241.193,-313.49],[-189.36,-330.133],[252.755,-295.559],[306.368,-274.013],[321.672,-218.24],[299.576,19.388],[292.289,221.952],[270.863,273.739]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[19.419,-0.031],[0,0],[13.72,13.741],[0,19.419],[0,183.938],[0,0],[-13.72,13.742],[-19.419,0.031],[0,0],[-13.721,-13.742],[0,-19.419],[0,-142],[0,0],[13.719,-13.744]],"o":[[0,0],[-19.419,-0.031],[-13.72,-13.744],[0,0],[0,-119.22],[0,-19.419],[13.72,-13.742],[0,0],[19.419,0.031],[13.719,13.742],[0,0],[0,129.579],[0,19.419],[-13.721,13.741]],"v":[[219.109,295.247],[-223.715,295.247],[-275.467,273.739],[-300.703,221.952],[-312.132,0.378],[-300.703,-222.515],[-275.467,-274.302],[-223.715,-295.811],[219.109,-295.811],[270.863,-274.302],[292.289,-222.515],[307.527,12.632],[292.289,221.952],[270.863,273.739]],"c":true}]},{"t":36,"s":[{"i":[[19.419,-0.031],[0,0],[13.72,13.741],[0,19.419],[4.442,55.381],[13.845,75.65],[-12.578,14.795],[-19.354,1.584],[0,0],[-14.775,-12.602],[-7.811,-29.999],[-9.887,-136.734],[0,0],[13.719,-13.744]],"o":[[0,0],[-19.419,-0.031],[-13.72,-13.744],[0,0],[-4.442,-55.38],[-4.729,-25.841],[12.578,-14.795],[0,0],[19.36,-1.522],[14.774,12.601],[8.654,33.235],[11.614,160.614],[0,19.419],[-13.721,13.741]],"v":[[219.109,295.247],[-223.715,295.247],[-275.467,273.739],[-296.894,221.952],[-302.355,24.048],[-332.792,-210.031],[-318.733,-265.27],[-265.708,-288.943],[169.383,-333.874],[222.691,-316.571],[248.189,-266.663],[278.913,-28.329],[292.289,221.952],[270.863,273.739]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.392156862745,0.854901960784,0.709803921569,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":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"L_Arm","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":2,"s":[88]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":14,"s":[4]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":26,"s":[88]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":38,"s":[4]},{"t":50,"s":[88]}],"ix":10},"p":{"a":0,"k":[210.973,-311.929,0],"ix":2},"a":{"a":0,"k":[-99.445,-97.888,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-52.441,12.175],[-77.703,10.693]],"o":[[67.01,-15.558],[97.583,-13.429]],"v":[[-99.445,-97.102],[99.445,97.511]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":48,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/LottieTest/Tests/MoveMultiple/AfterEffects.aep b/LottieTest/Tests/MoveMultiple/AfterEffects.aep
new file mode 100644
index 00000000..0c02485f
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/AfterEffects.aep differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame001.png b/LottieTest/Tests/MoveMultiple/Frames/frame001.png
new file mode 100644
index 00000000..9f569bba
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame001.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame007.png b/LottieTest/Tests/MoveMultiple/Frames/frame007.png
new file mode 100644
index 00000000..b50b4331
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame007.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame012.png b/LottieTest/Tests/MoveMultiple/Frames/frame012.png
new file mode 100644
index 00000000..31ddf8ff
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame012.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame017.png b/LottieTest/Tests/MoveMultiple/Frames/frame017.png
new file mode 100644
index 00000000..746465a8
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame017.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame022.png b/LottieTest/Tests/MoveMultiple/Frames/frame022.png
new file mode 100644
index 00000000..1e1967bb
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame022.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame027.png b/LottieTest/Tests/MoveMultiple/Frames/frame027.png
new file mode 100644
index 00000000..d3603d10
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame027.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame032.png b/LottieTest/Tests/MoveMultiple/Frames/frame032.png
new file mode 100644
index 00000000..65dc4c57
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame032.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame037.png b/LottieTest/Tests/MoveMultiple/Frames/frame037.png
new file mode 100644
index 00000000..dd59f2a5
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame037.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame042.png b/LottieTest/Tests/MoveMultiple/Frames/frame042.png
new file mode 100644
index 00000000..a9c74f0a
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame042.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame047.png b/LottieTest/Tests/MoveMultiple/Frames/frame047.png
new file mode 100644
index 00000000..8d2f4c25
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame047.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame052.png b/LottieTest/Tests/MoveMultiple/Frames/frame052.png
new file mode 100644
index 00000000..0ba6697c
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame052.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame057.png b/LottieTest/Tests/MoveMultiple/Frames/frame057.png
new file mode 100644
index 00000000..6fe9848f
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame057.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame062.png b/LottieTest/Tests/MoveMultiple/Frames/frame062.png
new file mode 100644
index 00000000..ae631a55
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame062.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame067.png b/LottieTest/Tests/MoveMultiple/Frames/frame067.png
new file mode 100644
index 00000000..07bf476a
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame067.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame072.png b/LottieTest/Tests/MoveMultiple/Frames/frame072.png
new file mode 100644
index 00000000..d6787e4b
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame072.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame077.png b/LottieTest/Tests/MoveMultiple/Frames/frame077.png
new file mode 100644
index 00000000..fedfa77a
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame077.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame082.png b/LottieTest/Tests/MoveMultiple/Frames/frame082.png
new file mode 100644
index 00000000..8235b23d
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame082.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame087.png b/LottieTest/Tests/MoveMultiple/Frames/frame087.png
new file mode 100644
index 00000000..6ceff771
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame087.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame092.png b/LottieTest/Tests/MoveMultiple/Frames/frame092.png
new file mode 100644
index 00000000..c27e1143
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame092.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame097.png b/LottieTest/Tests/MoveMultiple/Frames/frame097.png
new file mode 100644
index 00000000..e1e38abb
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame097.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame102.png b/LottieTest/Tests/MoveMultiple/Frames/frame102.png
new file mode 100644
index 00000000..eac63071
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame102.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame107.png b/LottieTest/Tests/MoveMultiple/Frames/frame107.png
new file mode 100644
index 00000000..c4f7b2d2
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame107.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame112.png b/LottieTest/Tests/MoveMultiple/Frames/frame112.png
new file mode 100644
index 00000000..76c94d9a
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame112.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame117.png b/LottieTest/Tests/MoveMultiple/Frames/frame117.png
new file mode 100644
index 00000000..5035fedf
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame117.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame122.png b/LottieTest/Tests/MoveMultiple/Frames/frame122.png
new file mode 100644
index 00000000..00ad72f9
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame122.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame127.png b/LottieTest/Tests/MoveMultiple/Frames/frame127.png
new file mode 100644
index 00000000..7197e155
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame127.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame132.png b/LottieTest/Tests/MoveMultiple/Frames/frame132.png
new file mode 100644
index 00000000..e1e38abb
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame132.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame137.png b/LottieTest/Tests/MoveMultiple/Frames/frame137.png
new file mode 100644
index 00000000..eac63071
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame137.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame142.png b/LottieTest/Tests/MoveMultiple/Frames/frame142.png
new file mode 100644
index 00000000..bf975082
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame142.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Frames/frame147.png b/LottieTest/Tests/MoveMultiple/Frames/frame147.png
new file mode 100644
index 00000000..c47cb1c1
Binary files /dev/null and b/LottieTest/Tests/MoveMultiple/Frames/frame147.png differ
diff --git a/LottieTest/Tests/MoveMultiple/Lottie.json b/LottieTest/Tests/MoveMultiple/Lottie.json
new file mode 100644
index 00000000..fd8c9644
--- /dev/null
+++ b/LottieTest/Tests/MoveMultiple/Lottie.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":30,"ip":0,"op":150,"w":500,"h":500,"nm":"Main","ddd":0,"assets":[{"id":"comp_0","nm":"Shape Layer 1 Comp 3","fr":30,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[13]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[99]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":21,"s":[198]},{"t":43,"s":[360]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[109,66,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[78,299,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[244,410,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[409,306,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[409,403,0],"to":[0,0,0],"ti":[0,0,0]},{"t":43,"s":[109,66,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":26,"s":[100,100,100]},{"t":45,"s":[0,0,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":22,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.834509849548,0.172549009323,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":46,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[13]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":41,"s":[99]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[198]},{"t":71,"s":[360]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[109,66,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[78,299,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[244,410,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[409,306,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[409,403,0],"to":[0,0,0],"ti":[0,0,0]},{"t":71,"s":[109,66,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":22,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.172549009323,0.484059840441,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":28,"op":74,"st":28,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Shape Layer 1 Comp 3","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":500,"h":500,"ip":0,"op":46,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"Shape Layer 1 Comp 3","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":500,"h":500,"ip":39,"op":85,"st":39,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Shape Layer 1 Comp 3","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":500,"h":500,"ip":69,"op":115,"st":69,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Shape Layer 1 Comp 3","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":500,"h":500,"ip":104,"op":150,"st":104,"bm":0},{"ddd":0,"ind":6,"ty":1,"nm":"White Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":500,"sh":500,"sc":"#ffffff","ip":0,"op":150,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/LottieTest/Tests/MoveMultiple/Test.json b/LottieTest/Tests/MoveMultiple/Test.json
new file mode 100644
index 00000000..649463b4
--- /dev/null
+++ b/LottieTest/Tests/MoveMultiple/Test.json
@@ -0,0 +1,5 @@
+{
+ "duration": 5,
+ "frames-per-second": 30,
+ "number-of-frames": 150
+}
\ No newline at end of file
diff --git a/LottieTest/Tests/MoveMultiple/Test.json.bak b/LottieTest/Tests/MoveMultiple/Test.json.bak
new file mode 100644
index 00000000..1efd2d33
--- /dev/null
+++ b/LottieTest/Tests/MoveMultiple/Test.json.bak
@@ -0,0 +1,5 @@
+{
+ "duration": "5",
+ "frames-per-second": "30",
+ "number-of-frames": "150"
+}
\ No newline at end of file
diff --git a/LottieTest/Tests/RectJump/AfterEffects.aep b/LottieTest/Tests/RectJump/AfterEffects.aep
new file mode 100644
index 00000000..c2e097f6
Binary files /dev/null and b/LottieTest/Tests/RectJump/AfterEffects.aep differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame001.png b/LottieTest/Tests/RectJump/Frames/frame001.png
new file mode 100644
index 00000000..b44ff375
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame001.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame006.png b/LottieTest/Tests/RectJump/Frames/frame006.png
new file mode 100644
index 00000000..b44ff375
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame006.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame011.png b/LottieTest/Tests/RectJump/Frames/frame011.png
new file mode 100644
index 00000000..b44ff375
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame011.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame016.png b/LottieTest/Tests/RectJump/Frames/frame016.png
new file mode 100644
index 00000000..b44ff375
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame016.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame021.png b/LottieTest/Tests/RectJump/Frames/frame021.png
new file mode 100644
index 00000000..b44ff375
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame021.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame026.png b/LottieTest/Tests/RectJump/Frames/frame026.png
new file mode 100644
index 00000000..4178298b
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame026.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame031.png b/LottieTest/Tests/RectJump/Frames/frame031.png
new file mode 100644
index 00000000..23cea3e1
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame031.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame036.png b/LottieTest/Tests/RectJump/Frames/frame036.png
new file mode 100644
index 00000000..23cea3e1
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame036.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame041.png b/LottieTest/Tests/RectJump/Frames/frame041.png
new file mode 100644
index 00000000..23cea3e1
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame041.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame046.png b/LottieTest/Tests/RectJump/Frames/frame046.png
new file mode 100644
index 00000000..23cea3e1
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame046.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame051.png b/LottieTest/Tests/RectJump/Frames/frame051.png
new file mode 100644
index 00000000..23cea3e1
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame051.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame056.png b/LottieTest/Tests/RectJump/Frames/frame056.png
new file mode 100644
index 00000000..c317292d
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame056.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame061.png b/LottieTest/Tests/RectJump/Frames/frame061.png
new file mode 100644
index 00000000..c317292d
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame061.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame066.png b/LottieTest/Tests/RectJump/Frames/frame066.png
new file mode 100644
index 00000000..c317292d
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame066.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame071.png b/LottieTest/Tests/RectJump/Frames/frame071.png
new file mode 100644
index 00000000..c317292d
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame071.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame076.png b/LottieTest/Tests/RectJump/Frames/frame076.png
new file mode 100644
index 00000000..c317292d
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame076.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame081.png b/LottieTest/Tests/RectJump/Frames/frame081.png
new file mode 100644
index 00000000..c317292d
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame081.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame086.png b/LottieTest/Tests/RectJump/Frames/frame086.png
new file mode 100644
index 00000000..09a8fbac
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame086.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame091.png b/LottieTest/Tests/RectJump/Frames/frame091.png
new file mode 100644
index 00000000..2f09b113
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame091.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame096.png b/LottieTest/Tests/RectJump/Frames/frame096.png
new file mode 100644
index 00000000..902fc2ab
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame096.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame101.png b/LottieTest/Tests/RectJump/Frames/frame101.png
new file mode 100644
index 00000000..dd7ed591
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame101.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame106.png b/LottieTest/Tests/RectJump/Frames/frame106.png
new file mode 100644
index 00000000..dd7ed591
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame106.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame111.png b/LottieTest/Tests/RectJump/Frames/frame111.png
new file mode 100644
index 00000000..dd7ed591
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame111.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame116.png b/LottieTest/Tests/RectJump/Frames/frame116.png
new file mode 100644
index 00000000..7000455f
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame116.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame121.png b/LottieTest/Tests/RectJump/Frames/frame121.png
new file mode 100644
index 00000000..c9c33806
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame121.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame126.png b/LottieTest/Tests/RectJump/Frames/frame126.png
new file mode 100644
index 00000000..c9c33806
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame126.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame131.png b/LottieTest/Tests/RectJump/Frames/frame131.png
new file mode 100644
index 00000000..c9c33806
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame131.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame136.png b/LottieTest/Tests/RectJump/Frames/frame136.png
new file mode 100644
index 00000000..c9c33806
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame136.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame141.png b/LottieTest/Tests/RectJump/Frames/frame141.png
new file mode 100644
index 00000000..c9c33806
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame141.png differ
diff --git a/LottieTest/Tests/RectJump/Frames/frame146.png b/LottieTest/Tests/RectJump/Frames/frame146.png
new file mode 100644
index 00000000..c9c33806
Binary files /dev/null and b/LottieTest/Tests/RectJump/Frames/frame146.png differ
diff --git a/LottieTest/Tests/RectJump/Lottie.json b/LottieTest/Tests/RectJump/Lottie.json
new file mode 100644
index 00000000..a2f8942a
--- /dev/null
+++ b/LottieTest/Tests/RectJump/Lottie.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":30,"ip":0,"op":150,"w":500,"h":500,"nm":"Main","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 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.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[82,70,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[82,70,0],"to":[0.5,56.5,0],"ti":[-0.5,-56.5,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[85,409,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[85,409,0],"to":[52.167,-0.5,0],"ti":[-52.167,0.5,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[398,406,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":85,"s":[398,406,0],"to":[-0.333,-54.833,0],"ti":[0.333,54.833,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":100,"s":[396,77,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":115,"s":[396,77,0],"to":[-52.333,-1,0],"ti":[52.333,1,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":116,"s":[82,71,0],"to":[0,0,0],"ti":[0,0,0]},{"t":149,"s":[82,71,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.551787614822,0.901960790157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":149,"op":150,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"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":0,"s":[82,70,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[82,70,0],"to":[0.5,56.5,0],"ti":[-0.5,-56.5,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[85,409,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[85,409,0],"to":[52.167,-0.5,0],"ti":[-52.167,0.5,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[398,406,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":85,"s":[398,406,0],"to":[-0.333,-54.833,0],"ti":[0.333,54.833,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":100,"s":[396,77,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":115,"s":[396,77,0],"to":[-52.333,-1,0],"ti":[52.333,1,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":116,"s":[82,71,0],"to":[0,0,0],"ti":[0,0,0]},{"t":149,"s":[82,71,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.551787614822,0.901960790157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":149,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":1,"nm":"White Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":500,"sh":500,"sc":"#ffffff","ip":0,"op":150,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/LottieTest/Tests/RectJump/Test.json b/LottieTest/Tests/RectJump/Test.json
new file mode 100644
index 00000000..649463b4
--- /dev/null
+++ b/LottieTest/Tests/RectJump/Test.json
@@ -0,0 +1,5 @@
+{
+ "duration": 5,
+ "frames-per-second": 30,
+ "number-of-frames": 150
+}
\ No newline at end of file
diff --git a/LottieTest/Tests/RectJump/Test.json.bak b/LottieTest/Tests/RectJump/Test.json.bak
new file mode 100644
index 00000000..1efd2d33
--- /dev/null
+++ b/LottieTest/Tests/RectJump/Test.json.bak
@@ -0,0 +1,5 @@
+{
+ "duration": "5",
+ "frames-per-second": "30",
+ "number-of-frames": "150"
+}
\ No newline at end of file
diff --git a/LottieTest/Tests/RectJump2/AfterEffects.aep b/LottieTest/Tests/RectJump2/AfterEffects.aep
new file mode 100644
index 00000000..bc03cca1
Binary files /dev/null and b/LottieTest/Tests/RectJump2/AfterEffects.aep differ
diff --git a/LottieTest/Tests/RectJump2/Frames/frame001.png b/LottieTest/Tests/RectJump2/Frames/frame001.png
new file mode 100644
index 00000000..6f823b28
Binary files /dev/null and b/LottieTest/Tests/RectJump2/Frames/frame001.png differ
diff --git a/LottieTest/Tests/RectJump2/Frames/frame075.png b/LottieTest/Tests/RectJump2/Frames/frame075.png
new file mode 100644
index 00000000..33e00d01
Binary files /dev/null and b/LottieTest/Tests/RectJump2/Frames/frame075.png differ
diff --git a/LottieTest/Tests/RectJump2/Frames/frame212.png b/LottieTest/Tests/RectJump2/Frames/frame212.png
new file mode 100644
index 00000000..cc5935c8
Binary files /dev/null and b/LottieTest/Tests/RectJump2/Frames/frame212.png differ
diff --git a/LottieTest/Tests/RectJump2/Frames/frame305.png b/LottieTest/Tests/RectJump2/Frames/frame305.png
new file mode 100644
index 00000000..9986589d
Binary files /dev/null and b/LottieTest/Tests/RectJump2/Frames/frame305.png differ
diff --git a/LottieTest/Tests/RectJump2/Frames/frame374.png b/LottieTest/Tests/RectJump2/Frames/frame374.png
new file mode 100644
index 00000000..fea19da3
Binary files /dev/null and b/LottieTest/Tests/RectJump2/Frames/frame374.png differ
diff --git a/LottieTest/Tests/RectJump2/Frames/frame513.png b/LottieTest/Tests/RectJump2/Frames/frame513.png
new file mode 100644
index 00000000..d9ce5942
Binary files /dev/null and b/LottieTest/Tests/RectJump2/Frames/frame513.png differ
diff --git a/LottieTest/Tests/RectJump2/Frames/frame641.png b/LottieTest/Tests/RectJump2/Frames/frame641.png
new file mode 100644
index 00000000..949e9080
Binary files /dev/null and b/LottieTest/Tests/RectJump2/Frames/frame641.png differ
diff --git a/LottieTest/Tests/RectJump2/Frames/frame646.png b/LottieTest/Tests/RectJump2/Frames/frame646.png
new file mode 100644
index 00000000..949e9080
Binary files /dev/null and b/LottieTest/Tests/RectJump2/Frames/frame646.png differ
diff --git a/LottieTest/Tests/RectJump2/Frames/frame651.png b/LottieTest/Tests/RectJump2/Frames/frame651.png
new file mode 100644
index 00000000..949e9080
Binary files /dev/null and b/LottieTest/Tests/RectJump2/Frames/frame651.png differ
diff --git a/LottieTest/Tests/RectJump2/Frames/frame656.png b/LottieTest/Tests/RectJump2/Frames/frame656.png
new file mode 100644
index 00000000..949e9080
Binary files /dev/null and b/LottieTest/Tests/RectJump2/Frames/frame656.png differ
diff --git a/LottieTest/Tests/RectJump2/Frames/frame661.png b/LottieTest/Tests/RectJump2/Frames/frame661.png
new file mode 100644
index 00000000..949e9080
Binary files /dev/null and b/LottieTest/Tests/RectJump2/Frames/frame661.png differ
diff --git a/LottieTest/Tests/RectJump2/Lottie.json b/LottieTest/Tests/RectJump2/Lottie.json
new file mode 100644
index 00000000..de25268a
--- /dev/null
+++ b/LottieTest/Tests/RectJump2/Lottie.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":30,"ip":0,"op":750,"w":500,"h":500,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":74,"s":[0]},{"t":75,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,155,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":750,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":210,"s":[360]}],"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":750,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"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":0,"s":[60,60,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":300,"s":[60,440,0],"to":[0,0,0],"ti":[-63.333,0,0]},{"t":600,"s":[440,440,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":14,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.813471615314,0.909803926945,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":750,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":1,"nm":"White Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":500,"sh":500,"sc":"#ffffff","ip":0,"op":750,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/LottieTest/Tests/RectJump2/Test.json b/LottieTest/Tests/RectJump2/Test.json
new file mode 100644
index 00000000..2f215479
--- /dev/null
+++ b/LottieTest/Tests/RectJump2/Test.json
@@ -0,0 +1,5 @@
+{
+ "duration": 25,
+ "frames-per-second": 30,
+ "number-of-frames": 750
+}
\ No newline at end of file
diff --git a/LottieTest/Tests/RectJump2/Test.json.bak b/LottieTest/Tests/RectJump2/Test.json.bak
new file mode 100644
index 00000000..6c6abdd7
--- /dev/null
+++ b/LottieTest/Tests/RectJump2/Test.json.bak
@@ -0,0 +1,5 @@
+{
+ "duration": "25",
+ "frames-per-second": "30",
+ "number-of-frames": "750"
+}
\ No newline at end of file
diff --git a/LottieTest/Tests/Shadow/AfterEffects.aep b/LottieTest/Tests/Shadow/AfterEffects.aep
new file mode 100644
index 00000000..26aa91df
Binary files /dev/null and b/LottieTest/Tests/Shadow/AfterEffects.aep differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame001.png b/LottieTest/Tests/Shadow/Frames/frame001.png
new file mode 100644
index 00000000..4866b4bd
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame001.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame006.png b/LottieTest/Tests/Shadow/Frames/frame006.png
new file mode 100644
index 00000000..0df8c4cb
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame006.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame011.png b/LottieTest/Tests/Shadow/Frames/frame011.png
new file mode 100644
index 00000000..88553c18
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame011.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame016.png b/LottieTest/Tests/Shadow/Frames/frame016.png
new file mode 100644
index 00000000..43d50eda
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame016.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame021.png b/LottieTest/Tests/Shadow/Frames/frame021.png
new file mode 100644
index 00000000..28677c90
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame021.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame026.png b/LottieTest/Tests/Shadow/Frames/frame026.png
new file mode 100644
index 00000000..38c96da2
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame026.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame031.png b/LottieTest/Tests/Shadow/Frames/frame031.png
new file mode 100644
index 00000000..707490db
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame031.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame036.png b/LottieTest/Tests/Shadow/Frames/frame036.png
new file mode 100644
index 00000000..ce5e22ac
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame036.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame041.png b/LottieTest/Tests/Shadow/Frames/frame041.png
new file mode 100644
index 00000000..23f34831
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame041.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame046.png b/LottieTest/Tests/Shadow/Frames/frame046.png
new file mode 100644
index 00000000..67ecee46
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame046.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame051.png b/LottieTest/Tests/Shadow/Frames/frame051.png
new file mode 100644
index 00000000..12127bab
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame051.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame056.png b/LottieTest/Tests/Shadow/Frames/frame056.png
new file mode 100644
index 00000000..8df1e56e
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame056.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame061.png b/LottieTest/Tests/Shadow/Frames/frame061.png
new file mode 100644
index 00000000..3710efc0
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame061.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame066.png b/LottieTest/Tests/Shadow/Frames/frame066.png
new file mode 100644
index 00000000..04ec2f33
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame066.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame071.png b/LottieTest/Tests/Shadow/Frames/frame071.png
new file mode 100644
index 00000000..985973fc
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame071.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame076.png b/LottieTest/Tests/Shadow/Frames/frame076.png
new file mode 100644
index 00000000..51735bb5
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame076.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame081.png b/LottieTest/Tests/Shadow/Frames/frame081.png
new file mode 100644
index 00000000..9f12f8df
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame081.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame086.png b/LottieTest/Tests/Shadow/Frames/frame086.png
new file mode 100644
index 00000000..f4c8f67f
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame086.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame091.png b/LottieTest/Tests/Shadow/Frames/frame091.png
new file mode 100644
index 00000000..6852e3dd
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame091.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame096.png b/LottieTest/Tests/Shadow/Frames/frame096.png
new file mode 100644
index 00000000..d5f15b7b
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame096.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame101.png b/LottieTest/Tests/Shadow/Frames/frame101.png
new file mode 100644
index 00000000..b5f11a35
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame101.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame106.png b/LottieTest/Tests/Shadow/Frames/frame106.png
new file mode 100644
index 00000000..a702cdf3
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame106.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame111.png b/LottieTest/Tests/Shadow/Frames/frame111.png
new file mode 100644
index 00000000..9660ac12
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame111.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame116.png b/LottieTest/Tests/Shadow/Frames/frame116.png
new file mode 100644
index 00000000..782cae94
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame116.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame121.png b/LottieTest/Tests/Shadow/Frames/frame121.png
new file mode 100644
index 00000000..8d2c0f0a
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame121.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame126.png b/LottieTest/Tests/Shadow/Frames/frame126.png
new file mode 100644
index 00000000..b5d3094f
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame126.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame131.png b/LottieTest/Tests/Shadow/Frames/frame131.png
new file mode 100644
index 00000000..cf576e97
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame131.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame136.png b/LottieTest/Tests/Shadow/Frames/frame136.png
new file mode 100644
index 00000000..4c26f327
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame136.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame141.png b/LottieTest/Tests/Shadow/Frames/frame141.png
new file mode 100644
index 00000000..c75092e2
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame141.png differ
diff --git a/LottieTest/Tests/Shadow/Frames/frame146.png b/LottieTest/Tests/Shadow/Frames/frame146.png
new file mode 100644
index 00000000..aa255005
Binary files /dev/null and b/LottieTest/Tests/Shadow/Frames/frame146.png differ
diff --git a/LottieTest/Tests/Shadow/Lottie.json b/LottieTest/Tests/Shadow/Lottie.json
new file mode 100644
index 00000000..fe914cde
--- /dev/null
+++ b/LottieTest/Tests/Shadow/Lottie.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":30,"ip":0,"op":150,"w":500,"h":500,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"SimpleShadow 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[136.5,372,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[50.273,53.039,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0.061545558274,0.426726341248,0.68235296011,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":89.5,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":14,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":1,"ix":6}}]}],"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[75,-181],[-20,-75],[-76,-175],[-196,-174],[-198,15],[-35,7],[-79,181],[54,181],[36.043,64.625],[183,43],[34,-14],[158,-118]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.294117629528,0.742560505867,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"SoftShadowWithRotation","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":149,"s":[360]}],"ix":10},"p":{"a":0,"k":[352,361,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[50.273,53.039,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":127.5,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":20,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":10,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[75,-181],[-20,-75],[-76,-175],[-196,-174],[-198,15],[-35,7],[-79,181],[54,181],[36.043,64.625],[183,43],[34,-14],[158,-118]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.294117629528,0.742560505867,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"SimpleShadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[158,159,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[50.273,53.039,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":127.5,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":14,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[75,-181],[-20,-75],[-76,-175],[-196,-174],[-198,15],[-35,7],[-79,181],[54,181],[36.043,64.625],[183,43],[34,-14],[158,-118]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.294117629528,0.742560505867,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":1,"nm":"White Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":500,"sh":500,"sc":"#ffffff","ip":0,"op":150,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/LottieTest/Tests/Shadow/Test.json b/LottieTest/Tests/Shadow/Test.json
new file mode 100644
index 00000000..649463b4
--- /dev/null
+++ b/LottieTest/Tests/Shadow/Test.json
@@ -0,0 +1,5 @@
+{
+ "duration": 5,
+ "frames-per-second": 30,
+ "number-of-frames": 150
+}
\ No newline at end of file
diff --git a/LottieTest/Tests/Shadow/Test.json.bak b/LottieTest/Tests/Shadow/Test.json.bak
new file mode 100644
index 00000000..1efd2d33
--- /dev/null
+++ b/LottieTest/Tests/Shadow/Test.json.bak
@@ -0,0 +1,5 @@
+{
+ "duration": "5",
+ "frames-per-second": "30",
+ "number-of-frames": "150"
+}
\ No newline at end of file
diff --git a/LottieTest/Tests/Smile/Animation.gif b/LottieTest/Tests/Smile/Animation.gif
new file mode 100644
index 00000000..c4846cef
Binary files /dev/null and b/LottieTest/Tests/Smile/Animation.gif differ
diff --git a/LottieTest/Tests/Smile/Lottie.json b/LottieTest/Tests/Smile/Lottie.json
new file mode 100644
index 00000000..c7289b86
--- /dev/null
+++ b/LottieTest/Tests/Smile/Lottie.json
@@ -0,0 +1 @@
+{"v":"5.5.5","fr":25,"ip":0,"op":95,"w":640,"h":640,"nm":"表情test","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"“eye-l/AEtest”轮廓","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.167,"y":0.167},"t":0,"s":[237,275,0],"to":[9.583,-5,0],"ti":[-31.083,3,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":16,"s":[294.5,245,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":30,"s":[294.5,245,0],"to":[-62.833,11.667,0],"ti":[13.333,-11.667,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":45,"s":[214.5,315,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":59,"s":[214.5,315,0],"to":[3.75,-6.667,0],"ti":[-3.75,6.667,0]},{"t":85,"s":[237,275,0]}],"ix":2},"a":{"a":0,"k":[18.5,18.5,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.833]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":16,"s":[84,84,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":30,"s":[84,84,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":45,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":59,"s":[100,100,100]},{"t":85,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-9.941],[9.941,0],[0,9.941],[-9.941,0]],"o":[[0,9.941],[-9.941,0],[0,-9.941],[9.941,0]],"v":[[18,0],[0,18],[-18,0],[0,-18]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.067000003889,0.027000000898,0.008000000785,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[18.25,18.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"“eye-r/AEtest”轮廓","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.167,"y":0.167},"t":0,"s":[403,275,0],"to":[-7.083,-38.25,0],"ti":[-3.417,15.25,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":16,"s":[414.5,201.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":30,"s":[414.5,201.5,0],"to":[-70.833,13,0],"ti":[6.833,-18.5,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":45,"s":[319.5,279.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":59,"s":[319.5,279.5,0],"to":[13.917,-0.75,0],"ti":[-13.917,0.75,0]},{"t":85,"s":[403,275,0]}],"ix":2},"a":{"a":0,"k":[18.5,18.5,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,-0.417]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":16,"s":[78,78,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":30,"s":[78,78,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":45,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":59,"s":[100,100,100]},{"t":85,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-9.941],[9.941,0],[0,9.941],[-9.94,0]],"o":[[0,9.941],[-9.94,0],[0,-9.941],[9.941,0]],"v":[[18,0],[0,18],[-18,0],[0,-18]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.067000003889,0.027000000898,0.008000000785,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[18.25,18.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"“mouth/AEtest”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":16,"s":[-25.438]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":30,"s":[-25.438]},{"t":85,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[320,400,0],"to":[12.833,-11.5,0],"ti":[-12.833,11.5,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":16,"s":[397,331,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":30,"s":[397,331,0],"to":[-64.667,3.333,0],"ti":[14.667,-9.333,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":45,"s":[309,387,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":59,"s":[309,387,0],"to":[1.833,2.167,0],"ti":[-1.833,-2.167,0]},{"t":85,"s":[320,400,0]}],"ix":2},"a":{"a":0,"k":[101.5,61.5,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":16,"s":[55.098,42.752,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":30,"s":[55.098,42.752,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":45,"s":[31.249,40.03,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":59,"s":[31.249,40.03,100]},{"t":85,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[32.292,0],[17.547,-22.161],[-31.667,0],[-18.503,22.82]],"o":[[-32.292,0],[18.503,22.82],[31.667,0],[-17.547,-22.161]],"v":[[0,-37],[-78.426,-0.41],[0,37],[78.426,-0.41]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.847000002394,0.234999997008,0.187999994615,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[101.169,85.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[28.346,-6.205],[0.005,-5.486],[0,0],[-55.736,0],[0,55.736],[0,0],[5.36,1.173],[32.378,0]],"o":[[-5.36,1.173],[0,0],[0,55.736],[55.736,0],[0,0],[-0.005,-5.486],[-28.346,-6.205],[-32.377,0]],"v":[[-91.644,-51.378],[-100.919,-40.015],[-100.919,-39.919],[0,61],[100.919,-39.919],[100.919,-40.015],[91.644,-51.378],[0,-61]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.067000003889,0.027000000898,0.008000000785,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[101.169,61.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"“face/AEtest”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[320,320,0],"ix":2},"a":{"a":0,"k":[170.5,170.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-93.888],[93.889,0],[0,93.889],[-93.888,0]],"o":[[0,93.889],[-93.888,0],[0,-93.888],[93.889,0]],"v":[[170,0],[0,170],[-170,0],[0,-170]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.870999983245,0.501999978458,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[170.25,170.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/LottieTest/Tests/TestPlan.json b/LottieTest/Tests/TestPlan.json
new file mode 100644
index 00000000..f308d5b6
--- /dev/null
+++ b/LottieTest/Tests/TestPlan.json
@@ -0,0 +1,19 @@
+{
+ "image-sequence-tests": [
+ { "name": "Gradient", "threshold": 0.01, "avg-threshold": 0.005 },
+ { "name": "Shadow", "threshold": 0.01, "avg-threshold": 0.01 },
+ { "name": "MoveMultiple", "threshold": 0.01, "avg-threshold": 0.005 },
+ { "name": "BlurOverlap", "threshold": 0.01, "avg-threshold": 0.005 },
+ { "name": "RectJump2", "threshold": 0.01, "avg-threshold": 0.005 },
+ { "name": "RectJump", "threshold": 0.04, "avg-threshold": 0.005 }
+ ],
+ "lottifiles-gif-tests": [
+ { "name" : "Smile", "link": "https://lottiefiles.com/7194-smile", "threshold": 0.03, "avg-threshold": 0.01 },
+ { "name" : "Earth", "link": "https://lottiefiles.com/102030-earth-love-earth-day", "threshold": 0.20, "avg-threshold": 0.03 },
+ { "name" : "Banana", "link": "https://lottiefiles.com/106560-banana", "threshold": 0.06, "avg-threshold": 0.02 },
+ { "name" : "Logo", "link": "https://lottiefiles.com/39206-lottie-logo", "threshold": 0.01, "avg-threshold": 0.01 },
+ { "name" : "Lolo", "link": "https://lottiefiles.com/109272-lolo-new-branding", "threshold": 0.08, "avg-threshold": 0.04 }
+ ],
+ "lottiegen-tests": [
+ ]
+}
\ No newline at end of file
diff --git a/LottieTest/Tests/delete_frames.py b/LottieTest/Tests/delete_frames.py
new file mode 100644
index 00000000..74f091e9
--- /dev/null
+++ b/LottieTest/Tests/delete_frames.py
@@ -0,0 +1,26 @@
+import os, shutil, re
+
+root = "."
+
+keep_each_kth_frame = 5
+
+for directory in os.listdir("."):
+ directory = os.path.join(root, directory)
+ if not os.path.isdir(directory):
+ continue
+ for inner_directory in os.listdir(directory):
+ if inner_directory != 'FramesAll':
+ continue
+ original_directory = os.path.join(directory, inner_directory)
+ if not os.path.isdir(original_directory):
+ continue
+
+ target_directory = os.path.join(directory, 'Frames')
+
+ shutil.rmtree(target_directory)
+ os.makedirs(target_directory)
+
+ frames = list(filter(lambda x: re.match(r'frame\d+.png', x), os.listdir(original_directory)))[1::keep_each_kth_frame]
+
+ for frame in frames:
+ shutil.copyfile(os.path.join(original_directory, frame), os.path.join(target_directory, frame))
diff --git a/LottieTest/src/CanvasBitmapDiff.cs b/LottieTest/src/CanvasBitmapDiff.cs
new file mode 100644
index 00000000..e17573a4
--- /dev/null
+++ b/LottieTest/src/CanvasBitmapDiff.cs
@@ -0,0 +1,140 @@
+using Microsoft.Graphics.Canvas;
+using Microsoft.UI;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Windows.UI;
+
+namespace LottieTest
+{
+ internal class CanvasBitmapDiff
+ {
+ private Color[] diff;
+ private float diffAccumulated;
+ private float diffMax;
+ private int width;
+ private int height;
+
+ private CanvasBitmap first;
+ private CanvasBitmap second;
+
+ private static Color ColorDiff(Color p, Color q)
+ {
+ byte r = (byte)Math.Abs(p.R - q.R);
+ byte g = (byte)Math.Abs(p.G - q.G);
+ byte b = (byte)Math.Abs(p.B - q.B);
+ return Color.FromArgb(255, r, g, b);
+ }
+
+ public CanvasBitmapDiff(CanvasBitmap a, CanvasBitmap b)
+ {
+ first = a;
+ second = b;
+
+ Color[] aColors = a.GetPixelColors();
+ Color[] bColors = b.GetPixelColors();
+ diff = new Color[aColors.Length];
+
+ diffAccumulated = 0;
+ diffMax = 0;
+
+ for (int i = 0; i < diff.Length; i++)
+ {
+ diff[i] = ColorDiff(aColors[i], bColors[i]);
+
+ diffAccumulated += diff[i].R;
+ diffAccumulated += diff[i].G;
+ diffAccumulated += diff[i].B;
+
+ diffMax = Math.Max(diffMax, diff[i].R);
+ diffMax = Math.Max(diffMax, diff[i].G);
+ diffMax = Math.Max(diffMax, diff[i].B);
+ }
+
+ width = (int)a.SizeInPixels.Width;
+ height = (int)a.SizeInPixels.Height;
+ }
+
+ public float Average => diffAccumulated / diff.Length;
+
+ public float Max => diffMax;
+
+ public int GetNumberOfDifferentPixels(float maxDifference = 128)
+ {
+ int res = 0;
+
+ for (int i = 0; i < diff.Length; i++)
+ {
+ float pixelDiff = (float)Math.Sqrt(diff[i].R * diff[i].R + diff[i].G * diff[i].G + diff[i].B * diff[i].B);
+ if (pixelDiff > maxDifference)
+ {
+ res++;
+ }
+ }
+
+ return res;
+ }
+
+ public int GetNumberOfBackgroundPixels()
+ {
+ int res = 0;
+
+ var colors = first.GetPixelColors();
+ var colorsB = second.GetPixelColors();
+ Color background = colors[0];
+
+ for (int i = 0; i < colors.Length; i++)
+ {
+ var c = ColorDiff(background, colors[i]);
+ var cb = ColorDiff(background, colors[i]);
+ if ((float)Math.Sqrt(c.R * c.R + c.G * c.G + c.B * c.B) < 4.0f && (float)Math.Sqrt(cb.R * cb.R + cb.G * cb.G + cb.B * cb.B) < 4.0f)
+ {
+ res++;
+ }
+ }
+
+ return res;
+ }
+
+ public int GetNumberOfForegroundPixels()
+ {
+ return GetNumberOfPixels() - GetNumberOfBackgroundPixels();
+ }
+
+ public int GetNumberOfPixels()
+ {
+ return diff.Length;
+ }
+
+ public CanvasBitmap GetDiffCanvas()
+ {
+ return CanvasBitmap.CreateFromColors(CanvasDevice.GetSharedDevice(), diff, width, height);
+ }
+
+ public CanvasBitmap GetDiffCanvasExaggerated(float maxDifference = 128)
+ {
+ Color[] color = new Color[diff.Length];
+
+ for (int i = 0; i < diff.Length; i++)
+ {
+ float pixelDiff = (float)Math.Sqrt(diff[i].R * diff[i].R + diff[i].G * diff[i].G + diff[i].B * diff[i].B);
+ color[i] = (pixelDiff > maxDifference ? Colors.Pink : Colors.Black);
+ }
+
+ return CanvasBitmap.CreateFromColors(CanvasDevice.GetSharedDevice(), color, width, height);
+
+ }
+
+ public CanvasBitmap GetFirstCanvas()
+ {
+ return first;
+ }
+
+ public CanvasBitmap GetSecondCanvas()
+ {
+ return second;
+ }
+ }
+}
diff --git a/LottieTest/src/Comparators/LottieToGifComparator.cs b/LottieTest/src/Comparators/LottieToGifComparator.cs
new file mode 100644
index 00000000..dfeede4b
--- /dev/null
+++ b/LottieTest/src/Comparators/LottieToGifComparator.cs
@@ -0,0 +1,61 @@
+using Microsoft.Graphics.Canvas;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using LottieTest.Readers;
+using Windows.Graphics;
+using Windows.Media.Devices;
+using Windows.Storage;
+
+namespace LottieTest.Comparators
+{
+
+ static internal class LottieToGifComparator
+ {
+ private static IEnumerable FramesToCapture(int framesNumber, int samples)
+ {
+ for (int i = 0; i < framesNumber - 1; i += Math.Max(1, (framesNumber - 1) / (samples - 1)))
+ yield return i;
+ }
+
+ private static IEnumerable ProgressToCapture(int framesNumber, int samples)
+ {
+ foreach (int frameIndex in FramesToCapture(framesNumber, samples))
+ yield return (frameIndex) / (float)(framesNumber);
+ }
+
+ public static async IAsyncEnumerable<(TFirst, TSecond)> Zip(this IAsyncEnumerable first, IAsyncEnumerable second)
+ {
+ await using var e1 = first.GetAsyncEnumerator();
+ await using var e2 = second.GetAsyncEnumerator();
+
+ while (true)
+ {
+ var t1 = e1.MoveNextAsync().AsTask();
+ var t2 = e2.MoveNextAsync().AsTask();
+ await Task.WhenAll(t1, t2);
+
+ if (!t1.Result || !t2.Result)
+ yield break;
+
+ yield return (e1.Current, e2.Current);
+ }
+ }
+
+ public static async IAsyncEnumerable Compare(StorageFile lottieFile, StorageFile gifFile, int samples = 10)
+ {
+ int numberOfFrames = await GifReader.ReadNumberOfFrames(gifFile);
+ var frameSize = await GifReader.ReadFrameSize(gifFile);
+
+ var gifFrames = GifReader.ReadFrames(gifFile, FramesToCapture(numberOfFrames, samples));
+ var lottieFrames = LottieReader.ReadFrames(lottieFile, ProgressToCapture(numberOfFrames, samples), frameSize);
+
+ await foreach (var (gifFrame, lottieFrame) in Zip(gifFrames, lottieFrames))
+ {
+ yield return new CanvasBitmapDiff(gifFrame, lottieFrame);
+ }
+ }
+ }
+}
diff --git a/LottieTest/src/Comparators/LottieToImageSeqenceComparator.cs b/LottieTest/src/Comparators/LottieToImageSeqenceComparator.cs
new file mode 100644
index 00000000..6b286514
--- /dev/null
+++ b/LottieTest/src/Comparators/LottieToImageSeqenceComparator.cs
@@ -0,0 +1,51 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using LottieTest.Readers;
+using Windows.Storage;
+
+namespace LottieTest.Comparators
+{
+ static internal class LottieToImageSeqenceComparator
+ {
+
+ private static IEnumerable ProgressToCapture(IEnumerable frames, int framesNumber)
+ {
+ foreach (int frameIndex in frames)
+ yield return ((float)frameIndex) / (float)(framesNumber);
+ }
+
+ public static async IAsyncEnumerable<(TFirst, TSecond)> Zip(this IAsyncEnumerable first, IAsyncEnumerable second)
+ {
+ await using var e1 = first.GetAsyncEnumerator();
+ await using var e2 = second.GetAsyncEnumerator();
+
+ while (true)
+ {
+ var t1 = e1.MoveNextAsync().AsTask();
+ var t2 = e2.MoveNextAsync().AsTask();
+ await Task.WhenAll(t1, t2);
+
+ if (!t1.Result || !t2.Result)
+ yield break;
+
+ yield return (e1.Current, e2.Current);
+ }
+ }
+ public static async IAsyncEnumerable Compare(StorageFile lottieFile, StorageFolder sequenceFolder, int numberOfFrames)
+ {
+ var frameSize = await ImageSequenceReader.ReadFrameSize(sequenceFolder);
+
+ var frames = await ImageSequenceReader.ReadFrameIndices(sequenceFolder);
+ var gifFrames = ImageSequenceReader.ReadFrames(sequenceFolder, frames);
+ var lottieFrames = LottieReader.ReadFrames(lottieFile, ProgressToCapture(frames, numberOfFrames), frameSize);
+
+ await foreach (var (gifFrame, lottieFrame) in Zip(gifFrames, lottieFrames))
+ {
+ yield return new CanvasBitmapDiff(gifFrame, lottieFrame);
+ }
+ }
+ }
+}
diff --git a/LottieTest/src/Comparators/LottieToLottieGenComparator.cs b/LottieTest/src/Comparators/LottieToLottieGenComparator.cs
new file mode 100644
index 00000000..0327be46
--- /dev/null
+++ b/LottieTest/src/Comparators/LottieToLottieGenComparator.cs
@@ -0,0 +1,59 @@
+using Microsoft.Graphics.Canvas;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using LottieTest.Readers;
+using Windows.Graphics;
+using Windows.Media.Devices;
+using Windows.Storage;
+using CommunityToolkit.WinUI.Lottie.LottieGen;
+
+namespace LottieTest.Comparators
+{
+
+ static internal class LottieToLottieGenComparator
+ {
+ private static IEnumerable ProgressToCapture(int samples)
+ {
+ for (int i = 0; i < samples; i++)
+ yield return i / (float)(samples);
+ }
+
+ public static async IAsyncEnumerable<(TFirst, TSecond)> Zip(this IAsyncEnumerable first, IAsyncEnumerable second)
+ {
+ await using var e1 = first.GetAsyncEnumerator();
+ await using var e2 = second.GetAsyncEnumerator();
+
+ while (true)
+ {
+ var t1 = e1.MoveNextAsync().AsTask();
+ var t2 = e2.MoveNextAsync().AsTask();
+ await Task.WhenAll(t1, t2);
+
+ if (!t1.Result || !t2.Result)
+ yield break;
+
+ yield return (e1.Current, e2.Current);
+ }
+ }
+
+ public static async IAsyncEnumerable Compare(StorageFile lottieFile, string folder, int samples = 10)
+ {
+ var options = CommandLineOptions.ParseCommandLine(new string[] { "-Language", "cs", "-MinimumUapVersion", "13", "-WinUIVersion", "2.7" });
+ var reporter = new Reporter(TextWriter.Null, TextWriter.Null);
+ LottieJsonFileProcessor.ProcessLottieJsonFile(options, reporter, lottieFile.Path, lottieFile.Path, "CodeGen", File.OpenRead(lottieFile.Path), folder, DateTime.Now);
+
+ var code = await StorageFile.GetFileFromPathAsync($@"{folder}CodeGen.cs");
+
+ var lottieFrames = LottieReader.ReadFrames(lottieFile, ProgressToCapture(samples), new SizeInt32 { Width = 512, Height = 512 });
+ var lottieFrames2 = LottieReader.ReadFramesFromCode(code, ProgressToCapture(samples), new SizeInt32 { Width = 512, Height = 512 });
+
+ await foreach (var (lottieFrame, lottieFrame2) in Zip(lottieFrames, lottieFrames2))
+ {
+ yield return new CanvasBitmapDiff(lottieFrame, lottieFrame2);
+ }
+ }
+ }
+}
diff --git a/LottieTest/src/LottieTest.cs b/LottieTest/src/LottieTest.cs
new file mode 100644
index 00000000..53251eda
--- /dev/null
+++ b/LottieTest/src/LottieTest.cs
@@ -0,0 +1,248 @@
+using Microsoft.Graphics.Canvas;
+using Microsoft.Graphics.Canvas.UI.Composition;
+using Microsoft.Graphics.DirectX;
+using Microsoft.UI.Composition;
+using Microsoft.UI.Dispatching;
+using Microsoft.Windows.ApplicationModel.DynamicDependency;
+using System.Numerics;
+using System.Runtime.InteropServices;
+using Windows.Graphics;
+using Windows.UI;
+using Windows.Win32.Foundation;
+using Windows.Win32.UI.WindowsAndMessaging;
+using Windows.Win32.System.WinRT.Direct3D11;
+using Windows.Win32.Graphics.Direct3D11;
+using WinRT;
+using static Windows.Win32.PInvoke;
+using System.Runtime.CompilerServices;
+using Windows.Storage;
+using LottieTest.Comparators;
+using System.Text.Json;
+using System.Text.Json.Nodes;
+using System.Diagnostics;
+using System.Net;
+
+namespace LottieTest
+{
+ internal class LottieTest
+ {
+ static string TEST_FILES_FOLDER = @"D:\LottieDev\Lottie-Windows\LottieTest\Tests\";
+
+ static async Task Main(string[] args)
+ {
+ Bootstrap.Initialize(0x00010000);
+ await RunTests();
+ Bootstrap.Shutdown();
+ }
+
+ static async Task RunTests()
+ {
+ var workDirectory = @"D:\LottieDev\Lottie-Windows\LottieTest\Tests\";
+ var testPlanFile = await StorageFile.GetFileFromPathAsync($"{workDirectory}TestPlan.json");
+ var testPlanJson = JsonNode.Parse(new StreamReader((await testPlanFile.OpenReadAsync()).AsStreamForRead()).ReadToEnd())!;
+
+ bool allPassed = true;
+ allPassed &= await RunImageSequenceTests(testPlanJson["image-sequence-tests"]!.AsArray());
+ allPassed &= await RunLottieFilesGifTests(testPlanJson["lottifiles-gif-tests"]!.AsArray());
+ //allPassed &= await RunLottieGenTests(testPlanJson["image-sequence-tests"]!.AsArray());
+ return allPassed;
+ }
+
+ static async Task RunImageSequenceTests(JsonArray tests)
+ {
+ Console.ForegroundColor = ConsoleColor.Yellow;
+ Console.WriteLine("=======================================================");
+ Console.WriteLine("= After Effects image sequence against Lottie-Windows =");
+ Console.WriteLine("=======================================================");
+
+ bool allPassed = true;
+ foreach (var test in tests)
+ {
+ var name = test!["name"]!.AsValue().GetValue();
+ var threshold = test!["threshold"]!.AsValue().GetValue();
+ var avgThreshold = test!["avg-threshold"]!.AsValue().GetValue();
+ allPassed &= await RunImageToSequenceTest(name, threshold, avgThreshold);
+ }
+ return allPassed;
+ }
+
+ static async Task RunLottieFilesGifTests(JsonArray tests)
+ {
+ Console.ForegroundColor = ConsoleColor.Yellow;
+ Console.WriteLine("=======================================================");
+ Console.WriteLine("= LottieFiles gifs against Lottie-Windows =");
+ Console.WriteLine("=======================================================");
+
+ bool allPassed = true;
+ foreach (var test in tests)
+ {
+ var name = test!["name"]!.AsValue().GetValue();
+ var link = test!["link"]!.AsValue().GetValue();
+ var threshold = test!["threshold"]!.AsValue().GetValue();
+ var avgThreshold = test!["avg-threshold"]!.AsValue().GetValue();
+ allPassed &= await RunLottieFilesGifTest(name, link, threshold, avgThreshold);
+ }
+ return allPassed;
+ }
+
+ static async Task RunLottieGenTests(JsonArray tests)
+ {
+ Console.ForegroundColor = ConsoleColor.Yellow;
+ Console.WriteLine("=======================================================");
+ Console.WriteLine("= LottieGen against Lottie-Windows =");
+ Console.WriteLine("=======================================================");
+
+ bool allPassed = true;
+ foreach (var test in tests)
+ {
+ var name = test!["name"]!.AsValue().GetValue();
+ var threshold = test!["threshold"]!.AsValue().GetValue();
+ var avgThreshold = test!["avg-threshold"]!.AsValue().GetValue();
+ allPassed &= await RunLottieGenTest(name, threshold, avgThreshold);
+ }
+ return allPassed;
+ }
+
+ static async Task RunImageToSequenceTest(string name, float threshold, float avgThreshold)
+ {
+ Console.ForegroundColor = ConsoleColor.Blue;
+ Stopwatch stopwatch = new Stopwatch();
+ stopwatch.Start();
+ string nameFormatted = String.Format("{0, -14}", name);
+ Console.WriteLine($"[Test Started][{nameFormatted}]");
+ var test_folder = $@"{TEST_FILES_FOLDER}{name}\";
+
+ var sequenceFolder = await StorageFolder.GetFolderFromPathAsync($@"{test_folder}frames\");
+ var lottieFile = await StorageFile.GetFileFromPathAsync($@"{test_folder}Lottie.json");
+ var testFile = await StorageFile.GetFileFromPathAsync($@"{test_folder}Test.json");
+
+ var testJson = JsonNode.Parse(new StreamReader((await testFile.OpenReadAsync()).AsStreamForRead()).ReadToEnd())!;
+
+ var results_folder = $@"{TEST_FILES_FOLDER}!Results\{name}\";
+
+ System.IO.Directory.CreateDirectory(results_folder);
+
+ float maxScore = 0;
+ float averageScore = 0;
+ int i = 0;
+
+ await foreach (var diffItem in LottieToImageSeqenceComparator.Compare(lottieFile, sequenceFolder, testJson["number-of-frames"]!.GetValue()))
+ {
+ /*await diffItem.GetDiffCanvasExaggerated(64).SaveAsync(results_folder + $@"diff-{i}.png");
+ await diffItem.GetFirstCanvas().SaveAsync(results_folder + $@"f-{i}.png");
+ await diffItem.GetSecondCanvas().SaveAsync(results_folder + $@"s-{i}.png");*/
+
+ await Task.Delay(1);
+
+ float numerator = diffItem.GetNumberOfDifferentPixels(64);
+ float denumerator = diffItem.GetNumberOfForegroundPixels() + diffItem.GetNumberOfPixels() / 5;
+ float score = numerator / denumerator;
+ maxScore = (float)Math.Max(maxScore, score);
+ averageScore += score;
+ i++;
+ }
+ averageScore /= i;
+
+ bool passed = maxScore < threshold && averageScore < avgThreshold;
+
+ stopwatch.Stop();
+ Console.ForegroundColor = (passed ? ConsoleColor.Green : ConsoleColor.Red);
+ Console.WriteLine($"[{(passed ? "Test Passed" : "Test Failed")} ][{nameFormatted}] Worst diff: {maxScore * 100:0.0}% | Avg diff: {averageScore * 100:0.0}% | {stopwatch.ElapsedMilliseconds / 1e3: 0.00}s");
+
+ return passed;
+ }
+
+ static async Task RunLottieFilesGifTest(string name, string link, float threshold, float avgThreshold)
+ {
+ Console.ForegroundColor = ConsoleColor.Blue;
+ Stopwatch stopwatch = new Stopwatch();
+ stopwatch.Start();
+ string nameFormatted = String.Format("{0, -14}", name);
+ Console.WriteLine($"[Test Started][{nameFormatted}]");
+
+ var test_folder = $@"{TEST_FILES_FOLDER}{name}\";
+
+ var gifFile = await StorageFile.GetFileFromPathAsync($@"{test_folder}Animation.gif");
+ var lottieFile = await StorageFile.GetFileFromPathAsync($@"{test_folder}Lottie.json");
+
+ var results_folder = $@"{TEST_FILES_FOLDER}!Results\{name}\";
+
+ System.IO.Directory.CreateDirectory(results_folder);
+
+ float maxScore = 0;
+ float averageScore = 0;
+ int i = 0;
+
+ await foreach (var diffItem in LottieToGifComparator.Compare(lottieFile, gifFile, 30))
+ {
+ /*await diffItem.GetDiffCanvasExaggerated(64).SaveAsync(results_folder + $@"diff-{i}.png");
+ await diffItem.GetFirstCanvas().SaveAsync(results_folder + $@"f-{i}.png");
+ await diffItem.GetSecondCanvas().SaveAsync(results_folder + $@"s-{i}.png");*/
+
+ await Task.Delay(1);
+
+ float numerator = diffItem.GetNumberOfDifferentPixels(64);
+ float denumerator = diffItem.GetNumberOfForegroundPixels() + diffItem.GetNumberOfPixels() / 5;
+ float score = numerator / denumerator;
+ maxScore = (float)Math.Max(maxScore, score);
+ averageScore += score;
+ i++;
+ }
+ averageScore /= i;
+
+ bool passed = maxScore < threshold && averageScore < avgThreshold;
+
+ stopwatch.Stop();
+ Console.ForegroundColor = (passed ? ConsoleColor.Green : ConsoleColor.Red);
+ Console.WriteLine($"[{(passed ? "Test Passed" : "Test Failed")} ][{nameFormatted}] Worst diff: {maxScore * 100:0.0}% | Avg diff: {averageScore * 100:0.0}% | {stopwatch.ElapsedMilliseconds / 1e3: 0.00}s");
+
+ return passed;
+ }
+
+ static async Task RunLottieGenTest(string name, float threshold, float avgThreshold)
+ {
+ Console.ForegroundColor = ConsoleColor.Blue;
+ Stopwatch stopwatch = new Stopwatch();
+ stopwatch.Start();
+ string nameFormatted = String.Format("{0, -14}", name);
+ Console.WriteLine($"[Test Started][{nameFormatted}]");
+
+ var test_folder = $@"{TEST_FILES_FOLDER}{name}\";
+
+ var lottieFile = await StorageFile.GetFileFromPathAsync($@"{test_folder}Lottie.json");
+
+ var results_folder = $@"{TEST_FILES_FOLDER}!Results\{name}\";
+
+ System.IO.Directory.CreateDirectory(results_folder);
+
+ float maxScore = 0;
+ float averageScore = 0;
+ int i = 0;
+
+ await foreach (var diffItem in LottieToLottieGenComparator.Compare(lottieFile, test_folder, 30))
+ {
+ await diffItem.GetDiffCanvasExaggerated(64).SaveAsync(results_folder + $@"diff-{i}.png");
+ await diffItem.GetFirstCanvas().SaveAsync(results_folder + $@"f-{i}.png");
+ await diffItem.GetSecondCanvas().SaveAsync(results_folder + $@"s-{i}.png");
+
+ await Task.Delay(1);
+
+ float numerator = diffItem.GetNumberOfDifferentPixels(64);
+ float denumerator = diffItem.GetNumberOfForegroundPixels() + diffItem.GetNumberOfPixels() / 5;
+ float score = numerator / denumerator;
+ maxScore = (float)Math.Max(maxScore, score);
+ averageScore += score;
+ i++;
+ }
+ averageScore /= i;
+
+ bool passed = maxScore < threshold && averageScore < avgThreshold;
+
+ stopwatch.Stop();
+ Console.ForegroundColor = (passed ? ConsoleColor.Green : ConsoleColor.Red);
+ Console.WriteLine($"[{(passed ? "Test Passed" : "Test Failed")} ][{nameFormatted}] Worst diff: {maxScore * 100:0.0}% | Avg diff: {averageScore * 100:0.0}% | {stopwatch.ElapsedMilliseconds / 1e3: 0.00}s");
+
+ return passed;
+ }
+ }
+}
\ No newline at end of file
diff --git a/LottieTest/src/Readers/GifReader.cs b/LottieTest/src/Readers/GifReader.cs
new file mode 100644
index 00000000..ae6aa3ca
--- /dev/null
+++ b/LottieTest/src/Readers/GifReader.cs
@@ -0,0 +1,119 @@
+using Microsoft.Graphics.Canvas;
+using Microsoft.UI.Xaml;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Windows.Graphics;
+using Windows.Graphics.DirectX;
+using Windows.Graphics.Imaging;
+using Windows.Storage;
+using Windows.UI.Input.Inking;
+
+namespace LottieTest.Readers
+{
+ static internal class GifReader
+ {
+ public static async IAsyncEnumerable ReadFrames(StorageFile file, IEnumerable frameIndices)
+ {
+ CanvasDevice _canvasDevice = CanvasDevice.GetSharedDevice();
+
+ using (var stream = await file.OpenReadAsync())
+ {
+ var decoder = await BitmapDecoder.CreateAsync(BitmapDecoder.GifDecoderId, stream);
+ var width = decoder.PixelWidth;
+ var height = decoder.PixelHeight;
+
+ var numFrames = decoder.FrameCount;
+
+ var j = 0;
+ var bytes = new byte[width * height * 4];
+ for (int i = 0; i < bytes.Length; i++) bytes[i] = 255;
+ foreach (int i in frameIndices)
+ {
+ while (j < i)
+ {
+ await DecodeBitmapFrameAsync(width, height, await decoder.GetFrameAsync((uint)j++), bytes);
+ }
+ await DecodeBitmapFrameAsync(width, height, await decoder.GetFrameAsync((uint)i), bytes);
+ yield return CanvasBitmap.CreateFromBytes(_canvasDevice, bytes, (int)width, (int)height, DirectXPixelFormat.B8G8R8A8UIntNormalized);
+ }
+ }
+ }
+
+ private static async Task DecodeBitmapFrameAsync(uint width, uint height, BitmapFrame frame, byte[] bytes)
+ {
+ var properties = await frame.BitmapProperties.GetPropertiesAsync(new string[]
+ {
+ "/imgdesc/Left",
+ "/imgdesc/Top",
+ });
+
+ var frameLeft = (ushort)properties["/imgdesc/Left"].Value;
+ var frameTop = (ushort)properties["/imgdesc/Top"].Value;
+
+
+ var frameWidth = frame.PixelWidth;
+ var frameHeight = frame.PixelHeight;
+ var pixels = await frame.GetPixelDataAsync();
+ var new_bytes = pixels.DetachPixelData();
+
+ var format = frame.BitmapPixelFormat;
+ switch (format)
+ {
+ case BitmapPixelFormat.Bgra8:
+ // Do nothing, it's in a format we like
+ break;
+ case BitmapPixelFormat.Rgba8:
+ // Swizzle the bits
+ for (var i = 0; i < new_bytes.Length; i += 4)
+ {
+ var r = new_bytes[i + 0];
+ new_bytes[i + 0] = new_bytes[i + 2];
+ new_bytes[i + 2] = r;
+ }
+ break;
+ default:
+ throw new Exception($"Unknown pixel format ({format})!");
+ }
+
+ for (int i = 0; i < frameWidth; i++)
+ {
+ for (int j = 0; j < frameHeight; j++)
+ {
+ int x = i + frameLeft;
+ int y = j + frameTop;
+ int from = j * (int)frameWidth + i;
+ int to = y * (int)width + x;
+ if (new_bytes[from * 4 + 3] == 255)
+ {
+ bytes[to * 4] = new_bytes[from * 4];
+ bytes[to * 4 + 1] = new_bytes[from * 4 + 1];
+ bytes[to * 4 + 2] = new_bytes[from * 4 + 2];
+ }
+ }
+ }
+ }
+
+ public static async Task ReadFrameSize(StorageFile file)
+ {
+ var frames = new List();
+ using (var stream = await file.OpenReadAsync())
+ {
+ var decoder = await BitmapDecoder.CreateAsync(BitmapDecoder.GifDecoderId, stream);
+ return new SizeInt32 { Width = (int)decoder.PixelWidth, Height = (int)decoder.PixelHeight };
+ }
+ }
+
+ public static async Task ReadNumberOfFrames(StorageFile file)
+ {
+ var frames = new List();
+ using (var stream = await file.OpenReadAsync())
+ {
+ var decoder = await BitmapDecoder.CreateAsync(BitmapDecoder.GifDecoderId, stream);
+ return (int)decoder.FrameCount;
+ }
+ }
+ }
+}
diff --git a/LottieTest/src/Readers/ImageSequenceReader.cs b/LottieTest/src/Readers/ImageSequenceReader.cs
new file mode 100644
index 00000000..447c3246
--- /dev/null
+++ b/LottieTest/src/Readers/ImageSequenceReader.cs
@@ -0,0 +1,82 @@
+using Microsoft.Graphics.Canvas;
+using Microsoft.UI.Xaml.Media.Imaging;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+using Windows.Graphics;
+using Windows.Storage;
+using Windows.Storage.Streams;
+
+namespace LottieTest.Readers
+{
+ static internal class ImageSequenceReader
+ {
+ public static async IAsyncEnumerable ReadFrames(StorageFolder folder, IEnumerable frameIndices)
+ {
+ CanvasDevice _canvasDevice = CanvasDevice.GetSharedDevice();
+
+ int index = frameIndices.First();
+ frameIndices = frameIndices.Skip(1);
+
+ foreach (var file in await folder.GetFilesAsync())
+ {
+ if (!CheckFileName(file) || index != GetFrameIndex(file))
+ {
+ continue;
+ }
+
+ if (frameIndices.Any())
+ {
+ index = frameIndices.First();
+ frameIndices = frameIndices.Skip(1);
+ }
+
+ yield return await CanvasBitmap.LoadAsync(_canvasDevice, await file.OpenReadAsync());
+ }
+ }
+
+ public static async Task> ReadFrameIndices(StorageFolder folder)
+ {
+ var res = new List();
+ foreach (var file in await folder.GetFilesAsync())
+ {
+ if (!CheckFileName(file))
+ {
+ continue;
+ }
+
+ res.Add(GetFrameIndex(file));
+ }
+ return res;
+ }
+
+ public static async Task ReadFrameSize(StorageFolder folder)
+ {
+ CanvasDevice _canvasDevice = CanvasDevice.GetSharedDevice();
+
+ foreach (var file in await folder.GetFilesAsync())
+ {
+ if (CheckFileName(file))
+ {
+ var size = (await CanvasBitmap.LoadAsync(_canvasDevice, await file.OpenReadAsync())).SizeInPixels;
+ return new SizeInt32 { Width = (int)size.Width, Height = (int)size.Height };
+ }
+ }
+
+ return new SizeInt32 { Width = 512, Height = 512 };
+ }
+
+ private static bool CheckFileName(StorageFile file)
+ {
+ return Regex.Match(file.Name, @"frame\d+\.png").Success;
+ }
+
+ private static int GetFrameIndex(StorageFile file)
+ {
+ return Int32.Parse(Regex.Match(file.Name, @"frame(\d+)\.png").Groups[1].Value);
+ }
+ }
+}
diff --git a/LottieTest/src/Readers/LottieReader.cs b/LottieTest/src/Readers/LottieReader.cs
new file mode 100644
index 00000000..d43e6df3
--- /dev/null
+++ b/LottieTest/src/Readers/LottieReader.cs
@@ -0,0 +1,318 @@
+using Microsoft.Graphics.Canvas;
+using Microsoft.UI.Xaml.Controls;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Numerics;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Windows.Foundation;
+using Microsoft.Graphics;
+using Microsoft.Graphics.DirectX;
+using Windows.Storage;
+using Microsoft.UI;
+using Microsoft.UI.Composition;
+using Microsoft.Graphics.Canvas.UI.Composition;
+using MicrosoftToolkit.WinUI.Lottie;
+using System.Runtime.InteropServices;
+using Windows.Win32.Foundation;
+using Windows.Win32.UI.WindowsAndMessaging;
+using Windows.Win32.System.WinRT.Direct3D11;
+using Windows.Win32.Graphics.Direct3D11;
+using WinRT;
+using System.Runtime.CompilerServices;
+using Microsoft.UI.Dispatching;
+using Microsoft.Windows.ApplicationModel.DynamicDependency;
+using Windows.Graphics;
+using Windows.UI;
+using static Windows.Win32.PInvoke;
+using Windows.ApplicationModel.UserDataTasks;
+
+using System.Reflection;
+
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.Emit;
+
+namespace LottieTest.Readers
+{
+ static internal class LottieReader
+ {
+
+ public static async IAsyncEnumerable ReadFrames(StorageFile file, IEnumerable progressValues, SizeInt32 size)
+ {
+ var frames = new List();
+
+ var source = new LottieVisualSourceDetached();
+
+ await source.SetSourceAsync(file);
+
+ capture.SetSource(source, size);
+
+ foreach (var progress in progressValues)
+ {
+ yield return await capture.GetFrame(progress);
+ }
+ }
+
+ public static async IAsyncEnumerable ReadFramesFromCode(StorageFile code, IEnumerable progressValue, SizeInt32 size)
+ {
+ // define source code, then parse it (to the type used for compilation)
+ SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(File.ReadAllText(code.Path));
+
+ // define other necessary objects for compilation
+ string assemblyName = Path.GetRandomFileName();
+ MetadataReference[] references = new MetadataReference[]
+ {
+ MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
+ MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location),
+ MetadataReference.CreateFromFile(typeof(Compositor).Assembly.Location),
+ MetadataReference.CreateFromFile(typeof(Canvas).Assembly.Location),
+ MetadataReference.CreateFromFile(typeof(CompositionAnimation).Assembly.Location),
+ };
+
+ // analyse and generate IL code from syntax tree
+ CSharpCompilation compilation = CSharpCompilation.Create(
+ assemblyName,
+ syntaxTrees: new[] { syntaxTree },
+ references: references,
+ options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
+
+ using (var ms = new MemoryStream())
+ {
+ // write IL code into memory
+ EmitResult result = compilation.Emit(ms);
+
+ if (!result.Success)
+ {
+ // handle exceptions
+ IEnumerable failures = result.Diagnostics.Where(diagnostic =>
+ diagnostic.IsWarningAsError ||
+ diagnostic.Severity == DiagnosticSeverity.Error);
+
+ foreach (Diagnostic diagnostic in failures)
+ {
+ Console.Error.WriteLine("{0}: {1}", diagnostic.Id, diagnostic.GetMessage());
+ }
+ }
+ else
+ {
+ // load this 'virtual' DLL so that we can use
+ ms.Seek(0, SeekOrigin.Begin);
+ Assembly assembly = Assembly.Load(ms.ToArray());
+
+ // create instance of the desired class and call the desired function
+ Type type = assembly.GetType("AnimatedVisuals.CodeGen")!;
+ object obj = Activator.CreateInstance(type)!;
+ type.InvokeMember("TryCreateAnimatedVisual",
+ BindingFlags.Default | BindingFlags.InvokeMethod,
+ null,
+ obj,
+ new object[]{capture.compositor!,
+ new object()});
+ }
+ }
+
+ await foreach (var v in ReadFrames(code, progressValue, size))
+ {
+ yield return v;
+ }
+ }
+
+ // This interface allows us to copy the texture
+ [ComImport]
+ [Guid("D4B71A65-3052-4ABE-9183-E98DE02A41A9")]
+ [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ [ComVisible(true)]
+ interface ICompositionDrawingSurfaceInterop2
+ {
+ unsafe void BeginDraw([Optional] RECT* updateRect, global::System.Guid* iid, [MarshalAs(UnmanagedType.IUnknown)] out object updateObject, POINT* updateOffset);
+ void EndDraw();
+ void Resize(SIZE sizePixels);
+ unsafe void Scroll([Optional] RECT* scrollRect, [Optional] RECT* clipRect, int offsetX, int offsetY);
+ void ResumeDraw();
+ void SuspendDraw();
+ unsafe void CopySurface([MarshalAs(UnmanagedType.IUnknown)] object destinationResource, int destinationOffsetX, int destinationOffsetY, [Optional] RECT* sourceRectangle);
+ }
+
+ static T GetDXGIInterfaceFromObject(object obj)
+ {
+ var access = obj.As();
+ object? result = null;
+ unsafe
+ {
+ var guid = typeof(T).GUID;
+ var guidPointer = (Guid*)Unsafe.AsPointer(ref guid);
+ access.GetInterface(guidPointer, out result);
+ }
+ return result.As();
+ }
+
+ class VisualCapture : IDisposable
+ {
+ private LottieVisualSourceDetached? visualSource;
+ private SizeInt32 size = new SizeInt32 { Width = 512, Height = 512 };
+ public Compositor? compositor;
+ private bool sourceChanged = false;
+
+ public VisualCapture()
+ {
+ Task.Run(() => Loop());
+ }
+
+ void IDisposable.Dispose()
+ {
+ compositor?.Dispose();
+ }
+
+ Tuple? GetVisual()
+ {
+ if (visualSource is null || compositor is null)
+ {
+ return null;
+ }
+
+ var av = visualSource.TryCreateAnimatedVisual(compositor, out object? diag);
+
+ var visual = av!.RootVisual;
+ var sourceSize = av!.Size;
+
+ visual.BorderMode = CompositionBorderMode.Soft;
+
+ ContainerVisual v = compositor.CreateContainerVisual();
+ {
+ v.Size = new System.Numerics.Vector2(size.Width, size.Height);
+ var geometry = compositor.CreateRectangleGeometry();
+ geometry.Size = v.Size;
+ geometry.Offset = new Vector2(0, 0);
+
+ var shape = CreateSpriteShape(compositor, geometry, new Matrix3x2(1F, 0F, 0F, 1F, 0F, 0F), compositor.CreateColorBrush(Windows.UI.Color.FromArgb(255, 255, 255, 255)));
+
+ var shapeVisual = compositor.CreateShapeVisual();
+ shapeVisual.Shapes.Add(shape);
+ shapeVisual.Size = v.Size;
+
+ v.Children.InsertAtTop(shapeVisual);
+ v.Children.InsertAtTop(visual);
+
+ float scale = Math.Min(size.Width / sourceSize.X, size.Height / sourceSize.Y);
+
+ visual.TransformMatrix = Matrix4x4.CreateTranslation(-sourceSize.X / 2, -sourceSize.Y / 2, 0) * Matrix4x4.CreateScale(scale) * Matrix4x4.CreateTranslation(size.Width / 2, size.Height / 2, 0);
+ }
+
+ return Tuple.Create(v as Visual, visual);
+ }
+
+ void Loop()
+ {
+ var dispatcherQueueController = DispatcherQueueController.CreateOnCurrentThread();
+ var device = new CanvasDevice();
+ compositor = new Compositor();
+
+ var compGraphics = CanvasComposition.CreateCompositionGraphicsDevice(compositor, device);
+
+ // We can't block the thread that created the Compositor,
+ // or else the AsyncOperation will never be completed. Ask
+ // the dispatcher to enqueue this work and then pump messages.
+
+
+ while (!sourceChanged)
+ {
+ Task.Delay(1).Wait();
+ }
+
+ var res = GetVisual()!;
+ Visual lottieVisual = res.Item1;
+ Visual topVisual = res.Item2;
+ var renderTarget = new CanvasRenderTarget(device, size.Width, size.Height, 96);
+ var resultTexture = GetDXGIInterfaceFromObject(renderTarget);
+
+ while (true)
+ {
+ while (taskCompletion == null || sourceChanged)
+ {
+ if (sourceChanged)
+ {
+ res = GetVisual()!;
+ lottieVisual = res.Item1;
+ topVisual = res.Item2;
+ renderTarget = new CanvasRenderTarget(device, size.Width, size.Height, 96);
+ resultTexture = GetDXGIInterfaceFromObject(renderTarget);
+ sourceChanged = false;
+ }
+
+ Task.Delay(1).Wait();
+ }
+
+ topVisual.Properties.InsertScalar("Progress", progress);
+
+ ICompositionSurface? surface = null;
+ dispatcherQueueController.DispatcherQueue.TryEnqueue(async () =>
+ {
+ await compositor.RequestCommitAsync();
+ surface = await compGraphics.CaptureAsync(
+ lottieVisual,
+ size,
+ DirectXPixelFormat.B8G8R8A8UIntNormalized,
+ DirectXAlphaMode.Premultiplied, 1.0f);
+ });
+
+ // Pump messages until the async operation has completed.
+ var msg = new MSG();
+ while (GetMessage(out msg, new HWND(0), 0, 0) && surface == null)
+ {
+ TranslateMessage(msg);
+ DispatchMessage(msg);
+ }
+
+ // Now we need to copy the underlying texture from the surface.
+ var interop = surface.As();
+ unsafe
+ {
+ interop.CopySurface(resultTexture, 0, 0, null);
+ }
+
+ lock (mutex)
+ {
+ taskCompletion?.SetResult(CanvasBitmap.CreateFromColors(device!, renderTarget.GetPixelColors(), (int)size.Width, (int)size.Height));
+ taskCompletion = null;
+ }
+ }
+ }
+
+ private object mutex = new object();
+
+ private float progress = 0.0f;
+ private TaskCompletionSource? taskCompletion = null;
+
+
+ public async Task GetFrame(float progress)
+ {
+ lock (mutex)
+ {
+ this.progress = progress;
+ taskCompletion = new TaskCompletionSource();
+ }
+ return await taskCompletion.Task;
+ }
+
+ public void SetSource(LottieVisualSourceDetached visualSource, SizeInt32 size)
+ {
+ this.visualSource = visualSource;
+ this.size = size;
+ this.sourceChanged = true;
+ }
+ }
+
+ static VisualCapture capture = new VisualCapture();
+
+ static CompositionSpriteShape CreateSpriteShape(Compositor _c, CompositionGeometry geometry, Matrix3x2 transformMatrix, CompositionBrush fillBrush)
+ {
+ var result = _c.CreateSpriteShape(geometry);
+ result.TransformMatrix = transformMatrix;
+ result.FillBrush = fillBrush;
+ return result;
+ }
+ }
+}
diff --git a/dlls/LottieGen/LottieGen.dll.csproj b/dlls/LottieGen/LottieGen.dll.csproj
new file mode 100644
index 00000000..92f61685
--- /dev/null
+++ b/dlls/LottieGen/LottieGen.dll.csproj
@@ -0,0 +1,27 @@
+
+
+
+ netcoreapp3.1
+ Debug;Release
+ latest
+ PUBLIC_LottieGen
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/source/DotLottie/DotLottieFile.cs b/source/DotLottie/DotLottieFile.cs
index 78547193..0072a929 100644
--- a/source/DotLottie/DotLottieFile.cs
+++ b/source/DotLottie/DotLottieFile.cs
@@ -18,6 +18,9 @@ namespace CommunityToolkit.WinUI.Lottie.DotLottie
/// Provides access to the contents of a .lottie file.
/// See https://dotlottie.io.
///
+#if PUBLIC_DotLottie
+ public
+#endif
sealed class DotLottieFile : IDisposable
{
readonly Manifest _manifest;
diff --git a/source/DotLottie/DotLottieFileAnimation.cs b/source/DotLottie/DotLottieFileAnimation.cs
index 5cb7a9a4..84d2a129 100644
--- a/source/DotLottie/DotLottieFileAnimation.cs
+++ b/source/DotLottie/DotLottieFileAnimation.cs
@@ -12,6 +12,9 @@ namespace CommunityToolkit.WinUI.Lottie.DotLottie
/// Describes an animation in a .lottie file. Animations
/// are Lottie .json files.
///
+#if PUBLIC_DotLottie
+ public
+#endif
sealed class DotLottieFileAnimation
{
readonly DotLottieFile _owner;
diff --git a/source/DotLottie/InvalidLottieFileException.cs b/source/DotLottie/InvalidLottieFileException.cs
index ebc76f99..9a05b7f6 100644
--- a/source/DotLottie/InvalidLottieFileException.cs
+++ b/source/DotLottie/InvalidLottieFileException.cs
@@ -8,6 +8,9 @@
namespace CommunityToolkit.WinUI.Lottie.DotLottie
{
+#if PUBLIC_DotLottie
+ public
+#endif
sealed class InvalidLottieFileException : Exception
{
}
diff --git a/source/Lottie/Lottie.projitems b/source/Lottie/Lottie.projitems
index 3dab6596..6a9bbe26 100644
--- a/source/Lottie/Lottie.projitems
+++ b/source/Lottie/Lottie.projitems
@@ -17,6 +17,7 @@
+
diff --git a/source/Lottie/LottieVisualSourceDetached.cs b/source/Lottie/LottieVisualSourceDetached.cs
new file mode 100644
index 00000000..7c48e928
--- /dev/null
+++ b/source/Lottie/LottieVisualSourceDetached.cs
@@ -0,0 +1,202 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+#nullable enable
+
+using System;
+using System.Collections.Generic;
+using System.Runtime.InteropServices.WindowsRuntime;
+using System.Threading.Tasks;
+using CommunityToolkit.WinUI.Lottie;
+using Microsoft.UI.Xaml.Controls;
+using Windows.Foundation;
+using Windows.Foundation.Metadata;
+using Windows.Storage;
+using Windows.Storage.Streams;
+
+#if WINAPPSDK
+using Microsoft.UI.Composition;
+using Microsoft.UI.Xaml;
+#else
+using Windows.UI.Composition;
+using Windows.UI.Xaml;
+#endif
+
+#if WINAPPSDK
+namespace MicrosoftToolkit.WinUI.Lottie
+#else
+namespace Microsoft.Toolkit.Uwp.UI.Lottie
+#endif
+{
+ ///
+ /// An for a Lottie composition.
+ /// Does not inherit DependencyObject so you can use it in console applications.
+ ///
+ public sealed class LottieVisualSourceDetached : IAnimatedVisualSource
+ {
+ int _loadVersion;
+ Uri? _uriSource;
+ AnimatedVisualFactory? _animatedVisualFactory;
+ ImageAssetHandler? _imageAssetHandler;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public LottieVisualSourceDetached()
+ {
+ }
+
+ ///
+ /// Gets or sets options for how the Lottie is loaded.
+ ///
+ public LottieVisualOptions Options { get; set; }
+
+ ///
+ /// Gets or sets the Uniform Resource Identifier (URI) of the JSON source file for this .
+ ///
+ public Uri? UriSource
+ {
+ get => _uriSource;
+ set { _uriSource = value; }
+ }
+
+ ///
+ /// Called by XAML to convert a string to an .
+ ///
+ /// The for the given url.
+ public static LottieVisualSourceDetached? CreateFromString(string uri)
+ {
+ var uriUri = Uris.StringToUri(uri);
+ if (uriUri is null)
+ {
+ return null;
+ }
+
+ return new LottieVisualSourceDetached { UriSource = uriUri };
+ }
+
+ ///
+ /// Sets the source for the .
+ ///
+ /// A stream containing the text of a JSON Lottie file encoded as UTF-8.
+ /// An that completes when the load completes or fails.
+ [Overload("SetSourceStreamAsync")]
+ public IAsyncAction SetSourceAsync(IInputStream stream)
+ {
+ _uriSource = null;
+ return LoadAsync(InputStreamLoader.LoadAsync(_imageAssetHandler, stream, Options)).AsAsyncAction();
+ }
+
+ ///
+ /// Sets the source for the .
+ ///
+ /// A file that is a JSON Lottie file.
+ /// An that completes when the load completes or fails.
+ [Overload("SetSourceFileAsync")]
+ public IAsyncAction SetSourceAsync(StorageFile file)
+ {
+ _uriSource = null;
+ return LoadAsync(StorageFileLoader.LoadAsync(_imageAssetHandler, file, Options)).AsAsyncAction();
+ }
+
+ ///
+ /// Sets the source for the .
+ ///
+ /// A URI that refers to a JSON Lottie file.
+ /// An that completes when the load completes or fails.
+ [DefaultOverload]
+ [Overload("SetSourceUriAsync")]
+ public IAsyncAction SetSourceAsync(Uri sourceUri)
+ {
+ _uriSource = sourceUri;
+
+ // Update the dependency property to keep it in sync with _uriSource.
+ // This will not trigger loading because it will be seen as no change
+ // from the current (just set) _uriSource value.
+ UriSource = sourceUri;
+
+ return LoadAsync(UriLoader.LoadAsync(_imageAssetHandler, sourceUri, Options)).AsAsyncAction();
+ }
+
+ ///
+ /// Sets a delegate that returns an for the given image uri.
+ /// If this is null, no images will be loaded from references to external images.
+ ///
+ /// Most Lottie files do not reference external images, but those that do
+ /// will refer to the files via a uri. It is up to the user of
+ /// to manage the loading of the image, and return an for
+ /// that image. Alternatively the delegate may return null, and the image will not be
+ /// displayed.
+ public void SetImageAssetHandler(ImageAssetHandler? imageAssetHandler)
+ {
+ _imageAssetHandler = imageAssetHandler;
+ }
+
+ ///
+ /// Implements .
+ ///
+ /// The that can be used as a factory for the resulting .
+ /// An optional object that may provide extra information about the result.
+ /// An .
+ // TODO: currently explicitly implemented interfaces are causing a problem with .NET Native. Make them implicit for now.
+ //bool IAnimatedVisualSource.TryCreateAnimatedVisual(
+ public IAnimatedVisual? TryCreateAnimatedVisual(
+ Compositor compositor,
+ out object? diagnostics)
+ {
+ if (_animatedVisualFactory is null)
+ {
+ // No content has been loaded yet.
+ // Return an IAnimatedVisual that produces nothing.
+ diagnostics = null;
+ return null;
+ }
+ else
+ {
+ // Some content was loaded. Ask the factory to produce an
+ // IAnimatedVisual. If it returns null, the player will treat it
+ // as an error.
+ return _animatedVisualFactory.TryCreateAnimatedVisual(compositor, out diagnostics);
+ }
+ }
+
+ // Starts loading. Completes the returned task when the load completes or is replaced by another load.
+ async Task LoadAsync(Task loader)
+ {
+ var loadVersion = ++_loadVersion;
+
+ var oldFactory = _animatedVisualFactory;
+ _animatedVisualFactory = null;
+
+ // Disable the warning about the task possibly having being started in
+ // another context. There is no other context here.
+#pragma warning disable VSTHRD003
+
+ // Wait for the loader to finish.
+ var factory = await loader;
+#pragma warning restore VSTHRD003
+
+ if (loadVersion != _loadVersion)
+ {
+ // Another load request came in before this one completed.
+ return;
+ }
+
+ if (factory is null)
+ {
+ // Load didn't produce anything.
+ return;
+ }
+
+ // We are the the most recent load. Save the result.
+ _animatedVisualFactory = factory;
+
+ if (!factory.CanInstantiate)
+ {
+ // The load did not produce any content. Throw an exception so the caller knows.
+ throw new ArgumentException("Failed to load animated visual.");
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/source/LottieGen/CommandLineOptions.cs b/source/LottieGen/CommandLineOptions.cs
index 125efc44..46fa10af 100644
--- a/source/LottieGen/CommandLineOptions.cs
+++ b/source/LottieGen/CommandLineOptions.cs
@@ -9,6 +9,9 @@
namespace CommunityToolkit.WinUI.Lottie.LottieGen
{
+#if PUBLIC_LottieGen
+ public
+#endif
sealed class CommandLineOptions
{
readonly List _additionalInterfaces = new List();
@@ -202,7 +205,7 @@ enum Keyword
}
// Returns the parsed command line. If ErrorDescription is non-null, then the parse failed.
- internal static CommandLineOptions ParseCommandLine(string[] args)
+ public static CommandLineOptions ParseCommandLine(string[] args)
{
var result = new CommandLineOptions();
result.ParseCommandLineStrings(args);
diff --git a/source/LottieGen/LottieJsonFileProcessor.cs b/source/LottieGen/LottieJsonFileProcessor.cs
index 3d6db369..d83a02b5 100644
--- a/source/LottieGen/LottieJsonFileProcessor.cs
+++ b/source/LottieGen/LottieJsonFileProcessor.cs
@@ -24,6 +24,9 @@ namespace CommunityToolkit.WinUI.Lottie.LottieGen
///
/// Processes a single Lottie .json file to produce various generated outputs.
///
+#if PUBLIC_LottieGen
+ public
+#endif
sealed class LottieJsonFileProcessor
{
readonly CommandLineOptions _options;
@@ -49,7 +52,7 @@ IReadOnlyList _translationResults
IReadOnlyList<(TranslationIssue issue, UapVersionRange versionRange)> _translationIssues
= Array.Empty<(TranslationIssue, UapVersionRange)>();
- LottieJsonFileProcessor(
+ public LottieJsonFileProcessor(
CommandLineOptions options,
Reporter reporter,
string sourceFilePath,
@@ -84,7 +87,7 @@ IReadOnlyList _translationResults
/// Where the output should be written.
/// A timestamp used to indicate when the processing took place.
/// true if the processing succeeded.
- internal static bool ProcessLottieJsonFile(
+ public static bool ProcessLottieJsonFile(
CommandLineOptions options,
Reporter reporter,
string sourceFilePath,
diff --git a/source/LottieGen/Reporter.cs b/source/LottieGen/Reporter.cs
index 6b2a9b75..6e44697e 100644
--- a/source/LottieGen/Reporter.cs
+++ b/source/LottieGen/Reporter.cs
@@ -10,6 +10,9 @@
namespace CommunityToolkit.WinUI.Lottie.LottieGen
{
+#if PUBLIC_LottieGen
+ public
+#endif
sealed class Reporter
{
// Lock to protect method and object that do not support multi-threaded access. Note that the
@@ -19,7 +22,7 @@ sealed class Reporter
readonly Dictionary _dataTables =
new Dictionary(StringComparer.OrdinalIgnoreCase);
- internal Reporter(TextWriter infoStream, TextWriter errorStream)
+ public Reporter(TextWriter infoStream, TextWriter errorStream)
{
InfoStream = new Writer(infoStream);
ErrorStream = new Writer(errorStream);
diff --git a/source/LottieReader/Serialization/Animatables.cs b/source/LottieReader/Serialization/Animatables.cs
index eadbbae6..c5f4d588 100644
--- a/source/LottieReader/Serialization/Animatables.cs
+++ b/source/LottieReader/Serialization/Animatables.cs
@@ -680,7 +680,15 @@ IEnumerable> ReadKeyFrames(
var cp1s = cp1Json.Value.AsVector2Array();
var cp2s = cp2Json.Value.AsVector2Array();
var cubicBeziers = cp1s.Zip(cp2s, (cp1, cp2) => new CubicBezier(cp1, cp2));
- easing = new CubicBezierEasing(cubicBeziers);
+
+ if (cubicBeziers.All(x => x.IsLinear))
+ {
+ easing = LinearEasing.Instance;
+ }
+ else
+ {
+ easing = new CubicBezierEasing(cubicBeziers);
+ }
}
else
{
diff --git a/source/LottieReader/Serialization/LottieCompositionReader.cs b/source/LottieReader/Serialization/LottieCompositionReader.cs
index 795692b4..786bba8b 100644
--- a/source/LottieReader/Serialization/LottieCompositionReader.cs
+++ b/source/LottieReader/Serialization/LottieCompositionReader.cs
@@ -22,7 +22,7 @@ namespace CommunityToolkit.WinUI.Lottie.LottieData.Serialization
{
// See: https://github.com/airbnb/lottie-web/tree/master/docs/json for the (usually out-of-date) schema.
// See: https://helpx.adobe.com/pdf/after_effects_reference.pdf for the After Effects semantics.
-#if PUBLIC
+#if PUBLIC_LottieReader
public
#endif
#pragma warning disable SA1205 // Partial elements should declare access
diff --git a/source/LottieToWinComp/LottieToMultiVersionWinCompTranslator.cs b/source/LottieToWinComp/LottieToMultiVersionWinCompTranslator.cs
index 83e3b86b..b2ec1f58 100644
--- a/source/LottieToWinComp/LottieToMultiVersionWinCompTranslator.cs
+++ b/source/LottieToWinComp/LottieToMultiVersionWinCompTranslator.cs
@@ -9,7 +9,7 @@
namespace CommunityToolkit.WinUI.Lottie.LottieToWinComp
{
-#if PUBLIC
+#if PUBLIC_LottieToWinComp
public
#endif
sealed class LottieToMultiVersionWinCompTranslator
diff --git a/source/LottieToWinComp/MultiVersionTranslationResult.cs b/source/LottieToWinComp/MultiVersionTranslationResult.cs
index 3cfef36e..92a07159 100644
--- a/source/LottieToWinComp/MultiVersionTranslationResult.cs
+++ b/source/LottieToWinComp/MultiVersionTranslationResult.cs
@@ -7,7 +7,7 @@
namespace CommunityToolkit.WinUI.Lottie.LottieToWinComp
{
-#if PUBLIC
+#if PUBLIC_LottieToWinComp
public
#endif
sealed class MultiVersionTranslationResult
diff --git a/source/LottieToWinComp/Rectangles.cs b/source/LottieToWinComp/Rectangles.cs
index 4d7a2c86..d6675dd5 100644
--- a/source/LottieToWinComp/Rectangles.cs
+++ b/source/LottieToWinComp/Rectangles.cs
@@ -428,11 +428,16 @@ static OriginOffsetContainer GetOriginOffsetContainer(
in TrimmedAnimatable size,
in TrimmedAnimatable position)
{
+ if (geometry.IsRoundedRectangle)
+ {
+ return new OriginOffsetContainer(geometry, Sn.Vector2.Zero);
+ }
+
// Note: Current implementation of Windows Composition API behaves differently for Rounded Rectangle and regular Rectangle geometry.
// In first case we need to offset the inner content (e.g. gradient) by position only, and in second case by position and half the size (total offset).
return size.IsAnimated || position.IsAnimated ?
- new OriginOffsetContainer(geometry, -(geometry.IsRoundedRectangle ? ExpressionFactory.GeometryPosition : ExpressionFactory.GeometryOffset)) :
- new OriginOffsetContainer(geometry, -(geometry.IsRoundedRectangle ? ConvertTo.Vector2(position.InitialValue) : InitialOffset(size, position)));
+ new OriginOffsetContainer(geometry, -ExpressionFactory.GeometryOffset) :
+ new OriginOffsetContainer(geometry, -InitialOffset(size, position));
}
static OriginOffsetContainer GetOriginOffsetContainerXY(
@@ -441,11 +446,16 @@ static OriginOffsetContainer GetOriginOffsetContainerXY(
in TrimmedAnimatable height,
in TrimmedAnimatable position)
{
+ if (geometry.IsRoundedRectangle)
+ {
+ return new OriginOffsetContainer(geometry, Sn.Vector2.Zero);
+ }
+
// Note: Current implementation of Windows Composition API behaves differently for Rounded Rectangle and regular Rectangle geometry.
// In first case we need to offset the inner content (e.g. gradient) by position only, and in second case by position and half the size (total offset).
return width.IsAnimated || height.IsAnimated || position.IsAnimated ?
- new OriginOffsetContainer(geometry, -(geometry.IsRoundedRectangle ? ExpressionFactory.GeometryPosition : ExpressionFactory.GeometryOffset)) :
- new OriginOffsetContainer(geometry, -(geometry.IsRoundedRectangle ? ConvertTo.Vector2(position.InitialValue) : InitialOffset(width, height, position)));
+ new OriginOffsetContainer(geometry, -ExpressionFactory.GeometryOffset) :
+ new OriginOffsetContainer(geometry, -InitialOffset(width, height, position));
}
public static CanvasGeometry CreateWin2dRectangleGeometry(
diff --git a/source/LottieToWinComp/TranslationIssue.cs b/source/LottieToWinComp/TranslationIssue.cs
index 524364c1..567ea579 100644
--- a/source/LottieToWinComp/TranslationIssue.cs
+++ b/source/LottieToWinComp/TranslationIssue.cs
@@ -11,7 +11,7 @@ namespace CommunityToolkit.WinUI.Lottie.LottieToWinComp
/// The gives more detail about the particular
/// instance of the issue.
///
-#if PUBLIC
+#if PUBLIC_LottieToWinComp
public
#endif
struct TranslationIssue
diff --git a/source/LottieToWinComp/TranslationResult.cs b/source/LottieToWinComp/TranslationResult.cs
index 042ea87a..457b0d51 100644
--- a/source/LottieToWinComp/TranslationResult.cs
+++ b/source/LottieToWinComp/TranslationResult.cs
@@ -14,7 +14,7 @@ namespace CommunityToolkit.WinUI.Lottie.LottieToWinComp
///
/// The result of translating a Lottie animation into an equivalent WinCompData form.
///
-#if PUBLIC
+#if PUBLIC_LottieToWinComp
public
#endif
sealed class TranslationResult
@@ -52,7 +52,7 @@ internal TranslationResult(
public uint MinimumRequiredUapVersion { get; }
// Returns a TranslationResult with the same contents as this but a different root visual.
- internal TranslationResult WithDifferentRoot(Visual rootVisual)
+ public TranslationResult WithDifferentRoot(Visual rootVisual)
=> new TranslationResult(rootVisual, TranslationIssues, MinimumRequiredUapVersion, SourceMetadata);
}
}
diff --git a/source/LottieToWinComp/TranslatorConfiguration.cs b/source/LottieToWinComp/TranslatorConfiguration.cs
index ca626803..77ee7fe1 100644
--- a/source/LottieToWinComp/TranslatorConfiguration.cs
+++ b/source/LottieToWinComp/TranslatorConfiguration.cs
@@ -7,6 +7,9 @@ namespace CommunityToolkit.WinUI.Lottie.LottieToWinComp
///
/// Describes a configuration of the .
///
+#if PUBLIC_LottieToWinComp
+ public
+#endif
struct TranslatorConfiguration
{
#pragma warning disable 0649
diff --git a/source/LottieToWinComp/UapVersionRange.cs b/source/LottieToWinComp/UapVersionRange.cs
index ec3f8748..fa05e912 100644
--- a/source/LottieToWinComp/UapVersionRange.cs
+++ b/source/LottieToWinComp/UapVersionRange.cs
@@ -11,7 +11,7 @@ namespace CommunityToolkit.WinUI.Lottie.LottieToWinComp
/// than or equal to the value. Both values being null
/// indicates all versions.
///
-#if PUBLIC
+#if PUBLIC_LottieToWinComp
public
#endif
struct UapVersionRange
@@ -61,7 +61,7 @@ public override string ToString()
// that we support up to End". If we didn't do that, then (minimumVersion, n) and (null, n)
// would effectively mean the same thing but it would be confusing to express
// it in 2 different ways.
- internal void NormalizeForMinimumVersion(uint minimumVersion)
+ public void NormalizeForMinimumVersion(uint minimumVersion)
{
// A Start of minimumVersion is the same as all versions up to End.
if (Start == minimumVersion && (End is null || End > minimumVersion))
diff --git a/source/UIDataCodeGen/Serialization/CompositionObjectDgmlSerializer.cs b/source/UIDataCodeGen/Serialization/CompositionObjectDgmlSerializer.cs
index d57f924f..a90e0554 100644
--- a/source/UIDataCodeGen/Serialization/CompositionObjectDgmlSerializer.cs
+++ b/source/UIDataCodeGen/Serialization/CompositionObjectDgmlSerializer.cs
@@ -15,6 +15,9 @@ namespace CommunityToolkit.WinUI.Lottie.UIData.CodeGen
///
/// Serializes a graph into DGML format.
///
+#if PUBLIC_UIDataCodeGen
+ public
+#endif
sealed class CompositionObjectDgmlSerializer
{
// The categories of each node in the DGML graph. The category determines the appearance in the graph.