lottie-ios 3.4.0 → 3.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (394) hide show
  1. package/.github/workflows/main.yml +10 -7
  2. package/.github/workflows/stale_issues.yml +17 -0
  3. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  4. package/Lottie.xcodeproj/project.pbxproj +33 -21
  5. package/Lottie.xcodeproj/xcshareddata/xcschemes/Lottie (macOS).xcscheme +2 -2
  6. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  7. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +5 -6
  8. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Expressions.xcexplist +114 -1
  9. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +30 -0
  10. package/Package.swift +1 -1
  11. package/README.md +5 -6
  12. package/Rakefile +52 -17
  13. package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +7 -2
  14. package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +192 -67
  15. package/Sources/Private/CoreAnimation/Animations/CombinedShapeAnimation.swift +28 -0
  16. package/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift +31 -4
  17. package/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift +98 -43
  18. package/Sources/Private/CoreAnimation/Animations/LayerProperty.swift +19 -19
  19. package/Sources/Private/CoreAnimation/Animations/RectangleAnimation.swift +34 -7
  20. package/Sources/Private/CoreAnimation/Animations/ShapeAnimation.swift +25 -14
  21. package/Sources/Private/CoreAnimation/Animations/StarAnimation.swift +61 -32
  22. package/Sources/Private/CoreAnimation/Animations/StrokeAnimation.swift +6 -2
  23. package/Sources/Private/CoreAnimation/CoreAnimationLayer.swift +29 -11
  24. package/Sources/Private/CoreAnimation/Extensions/KeyframeGroup+exactlyOneKeyframe.swift +2 -2
  25. package/Sources/Private/CoreAnimation/Extensions/Keyframes+combinedIfPossible.swift +116 -23
  26. package/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +9 -0
  27. package/Sources/Private/CoreAnimation/Layers/BaseCompositionLayer.swift +2 -1
  28. package/Sources/Private/CoreAnimation/Layers/CALayer+setupLayerHierarchy.swift +48 -12
  29. package/Sources/Private/CoreAnimation/Layers/GradientRenderLayer.swift +10 -3
  30. package/Sources/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift +5 -0
  31. package/Sources/Private/CoreAnimation/Layers/MaskCompositionLayer.swift +1 -1
  32. package/Sources/Private/CoreAnimation/Layers/PreCompLayer.swift +2 -2
  33. package/Sources/Private/CoreAnimation/Layers/RepeaterLayer.swift +85 -0
  34. package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +94 -38
  35. package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +131 -46
  36. package/Sources/Private/CoreAnimation/Layers/TextLayer.swift +16 -2
  37. package/Sources/Private/MainThread/LayerContainers/CompLayers/CompositionLayer.swift +1 -1
  38. package/Sources/Private/MainThread/LayerContainers/CompLayers/MaskContainerLayer.swift +0 -2
  39. package/Sources/Private/MainThread/LayerContainers/CompLayers/PreCompositionLayer.swift +2 -2
  40. package/Sources/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift +1 -2
  41. package/Sources/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift +30 -1
  42. package/Sources/Private/MainThread/LayerContainers/Utility/InvertedMatteLayer.swift +1 -0
  43. package/Sources/Private/MainThread/LayerContainers/Utility/LayerTransformNode.swift +0 -1
  44. package/Sources/Private/MainThread/NodeRenderSystem/Extensions/ItemsExtension.swift +5 -2
  45. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/ModifierNodes/TrimPathNode.swift +4 -7
  46. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift +5 -0
  47. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientStrokeRenderer.swift +1 -2
  48. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/LegacyGradientFillRenderer.swift +1 -1
  49. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/StrokeRenderer.swift +1 -1
  50. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/RectNode.swift +1 -1
  51. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/StarNode.swift +3 -3
  52. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/GradientFillNode.swift +3 -0
  53. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift +1 -1
  54. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +28 -1
  55. package/Sources/Private/MainThread/NodeRenderSystem/RenderLayers/ShapeContainerLayer.swift +1 -1
  56. package/Sources/Private/MainThread/NodeRenderSystem/RenderLayers/ShapeRenderLayer.swift +0 -1
  57. package/Sources/Private/Model/Animation.swift +4 -4
  58. package/Sources/Private/Model/Keyframes/KeyframeGroup.swift +25 -0
  59. package/Sources/Private/Model/ShapeItems/Ellipse.swift +0 -1
  60. package/Sources/Private/Model/ShapeItems/Fill.swift +1 -1
  61. package/Sources/Private/Model/ShapeItems/GradientFill.swift +14 -1
  62. package/Sources/Private/Model/ShapeItems/GradientStroke.swift +0 -1
  63. package/Sources/Private/Model/ShapeItems/Group.swift +6 -1
  64. package/Sources/Private/Model/ShapeItems/Merge.swift +0 -1
  65. package/Sources/Private/Model/ShapeItems/Rectangle.swift +0 -1
  66. package/Sources/Private/Model/ShapeItems/Repeater.swift +0 -1
  67. package/Sources/Private/Model/ShapeItems/ShapeTransform.swift +0 -1
  68. package/Sources/Private/Model/ShapeItems/Star.swift +0 -1
  69. package/Sources/Private/Model/ShapeItems/Stroke.swift +0 -1
  70. package/Sources/Private/Model/ShapeItems/Trim.swift +0 -1
  71. package/Sources/Private/Model/Text/TextAnimator.swift +0 -1
  72. package/Sources/Private/Utility/Debugging/LayerDebugging.swift +1 -2
  73. package/Sources/Private/Utility/Extensions/MathKit.swift +1 -2
  74. package/Sources/Private/Utility/Extensions/StringExtensions.swift +0 -1
  75. package/Sources/Private/Utility/Interpolatable/InterpolatableExtensions.swift +0 -1
  76. package/Sources/Private/{MainThread/NodeRenderSystem/NodeProperties/ValueProviders → Utility/Interpolatable}/KeyframeInterpolator.swift +1 -4
  77. package/Sources/Private/Utility/Primitives/BezierPath.swift +1 -2
  78. package/Sources/Private/Utility/Primitives/CurveVertex.swift +2 -4
  79. package/Sources/Public/Animation/AnimationPublic.swift +2 -4
  80. package/Sources/Public/Animation/AnimationView.swift +29 -7
  81. package/Sources/Public/Animation/AnimationViewInitializers.swift +13 -11
  82. package/Sources/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +0 -2
  83. package/Sources/Public/FontProvider/AnimationFontProvider.swift +1 -1
  84. package/Sources/Public/Logging/LottieLogger.swift +15 -2
  85. package/Sources/Public/TextProvider/AnimationTextProvider.swift +1 -1
  86. package/Sources/Public/iOS/AnimatedButton.swift +10 -4
  87. package/Sources/Public/iOS/AnimatedControl.swift +3 -5
  88. package/Sources/Public/iOS/AnimatedSwitch.swift +9 -6
  89. package/Sources/Public/iOS/BundleImageProvider.swift +2 -3
  90. package/Sources/Public/iOS/FilepathImageProvider.swift +1 -2
  91. package/Sources/Public/macOS/BundleImageProvider.macOS.swift +1 -2
  92. package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +1 -3
  93. package/Tests/AnimationKeypathTests.swift +10 -1
  94. package/Tests/AutomaticEngineTests.swift +1 -0
  95. package/Tests/ParsingTests.swift +2 -1
  96. package/Tests/PerformanceTests.swift +28 -29
  97. package/Tests/SnapshotConfiguration.swift +19 -0
  98. package/Tests/SnapshotTests.swift +4 -0
  99. package/Tests/Utils/HardcodedTextProvider.swift +27 -0
  100. package/lottie-ios.podspec +2 -2
  101. package/package.json +1 -1
  102. package/script/test-carthage/CarthageTest/AppDelegate.swift +6 -7
  103. package/script/test-carthage/CarthageTest/ViewController.swift +1 -1
  104. package/script/test-carthage/CarthageTest-macOS/AppDelegate.swift +7 -0
  105. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  106. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
  107. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/Contents.json +6 -0
  108. package/script/test-carthage/CarthageTest-macOS/Base.lproj/Main.storyboard +717 -0
  109. package/script/test-carthage/CarthageTest-macOS/CarthageTest_macOS.entitlements +10 -0
  110. package/script/test-carthage/CarthageTest-macOS/ViewController.swift +15 -0
  111. package/script/test-carthage/CarthageTest.xcodeproj/project.pbxproj +159 -5
  112. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  113. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
  114. package/Lottie.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +0 -23
  115. package/Mintfile +0 -3
  116. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-7Vi1RszY1XYnR2CCkEwIpKG8NwwA9zsZEz_WD7Dv6kKh4RC7N7ob8NIRVHGUJKp7eXxlpeI_gzD87Pcs_2u0g== +0 -0
  117. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-SKV2drO-SFlrlh-wrzECDMkUSr-aF1lV9h-5onOy94zSTsD-oI45s0-KpOK45L-kq3hRY7v9vm-xmh00_eheg== +0 -0
  118. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-_CU_vuaiFfObSeDFfmp7GuB20ThMSAL-P_RUMowiQLbdu-y0bU9upIm3q8g6XmXUG5hP6J1az0Ma5Hi_rhhRg== +0 -0
  119. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~03aPYP6VHJjZj5DlphGarj0xdw43qu09Onx5SReZoPvg9zh5uL212E-KWfGct9jf6JG0JFV2tdbBi7X_8bH9aw== +0 -0
  120. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~1Z82GPBBPc1VLvn4O7V5glb6lgyXteNlDREUzV_TPymM4ra4UkBMklzV90lEqoYRCDuRVzaQHaDYbmYp3-8CFw== +0 -0
  121. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~1mFDCboXpUu9pSHAiVGr1O_QgqEEtvJp_LUhickxLZo0Z5pj3fvadn1l2MzEOd4bFsVBZifUvcyPa7dzlMWF-A== +0 -0
  122. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~2_L9PUjv2JDKu1n8bDLb4XLB-yex6ZVjDDMwfuKAr7teDw-SKgLgkW6H-m_gjWChIVdB4vW6yvHP7XJxvXtRNA== +0 -0
  123. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== +0 -1
  124. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~4krT4ZMzDOu34msFUq0Xod142kw4pAeSWX4JSxlsjOI0Wanu3343qeespgFi61MTWq1DdH9XXspVKqGlGm_fyw== +0 -0
  125. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~5_aJsdP-e3dRTAUnH-y1U2plaCuUi1vyHriaZuNK0xFe8wGl9Qft6uLCX2Qt6CRBKJQluEe9o0uRWw1eb42FHQ== +0 -0
  126. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~8b0bSqV7eND54zvHvu1v2Htpm7yn-BOEFw5d3mITJrXWNykJ5BTR9WbrD80JEctNcT-rDqO2xfrQk1tFWeY6Sw== +0 -0
  127. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~9u8KAGpgtSm-mQ12Py8RZUbYbDlBhM3w1I2MQO53K2CSn6IePp7g65DBcdXTYMfG1bgoJ-6x30fjnGe-2UYsDQ== +0 -0
  128. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Bw7uMs4wqB9ahfEqGii2FkQ9pvZmG6HGe2hmbAT2wyM5hpn8Xh5dELysMcEz6hEsqmn6HdRdLOLZhC_fNaXzgA== +0 -0
  129. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~BwUq2xXQYuE8ya6HT6lfNsdtEjz5AKGf8GvLY6VBxQyIY1vgj_Gov-3NeM69OS66BQRDK0PG9H4Oyg0R48E4vg== +0 -0
  130. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~EkDVUR6dcnzxV_lYjkrJ5QGMVTCvb_upAoBF6DBu61sQkGvZN3fSRTsJ1XfJIZO-JUzdNoVA3D_CcvokL0gnQg== +0 -0
  131. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~FUkcLSJ8RAuPenM4HFG1R-sN5-cDBGcTxgR2jaVCna7xV0ZTyBHriB1Nn59mariNlJDiCoBtMUQEmauGxWtfBA== +0 -0
  132. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~FqsuZe4RVLOOVUYLTL-GTIohZ8TdSfxx7m2KJtLYFPGOdE4XorTX7Oc7kXbhghPRppXT3jW-slI37M34YNEvLQ== +0 -0
  133. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~G4F_NtyTj3i46fmKm0NorHAeq8tYWWYf6uv5yC1DwzdpWVoYbOPufmFNvdEbxZt4AMdV0gKx3HI46EAXNOQVFg== +0 -0
  134. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~GxetzGUNDgaBBXcTmLK6p9JBDX3I3QPshshbui1IaEWvJbQko-E36tCKwaJYHbleAWz9FqkAM_Tqx3YOmSVkVg== +0 -0
  135. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~H1Wjd5kKWDW4t3SDodxiHV72V8WT0xwPubw5cJTNLkPRLgaILFPh-dpy8EOUNgy1KzrDujFsm9EcTsbuqtMPLA== +0 -0
  136. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~JpI5MH4zCgebUHFpXVn4zjtsGtMNnO7BQZWfNARAB5UWa9gqz6YXHR3uLCJ_AvJ3lh53BUVkavsx9TY2FMmxbA== +0 -0
  137. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~JujNYkJtcux0Ni4QnR64zu4Wz_zYjyKvYaYZm5ypxTLPSzF3_jNE_NO4sdbDamF8wEqWoky1uf4ZE0JT3L607A== +0 -0
  138. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~KJSEA6DKnb2_FRPSqKZGh41eo-C8x448J9kEBrH012bUrZfOSDvrgmIrU0Vz7Ri3gaS9aKKmSaVMvXsHSlTJVA== +0 -0
  139. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~MStOwu3jBlJtcRnxrseVOuhI4kCj--ggFPG7sqrq5w1hjrI3bVyD-bm1Jwyx0noY3wT1rHDEvaGWnV2qsGjGwg== +0 -0
  140. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~McsJ8kFVf3IjhgXIRdw8Xx-EXgbV071bmlj2BBnk52xrWl3sEeiIyxwUsF7mIWvMRWfcFfu4VGHYyqfk2BeHXw== +0 -0
  141. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~NHt9fVe4kDdbxnglKcEwXaRK-WsYEOaD23Kbl8SJPRMYHr_Z6SJd_HmG3BROHHR_M6TgSmucONpDJdTj5tjuFw== +0 -0
  142. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Nfo2iwCPcfAcOBIVyoUAK0-PIfr5qYxIKZt-uaSaTBdrTNxAuJ1ItmeDPZ3VdJJmxD_c22No7x482bdd3_yYtw== +0 -0
  143. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~S2Qlu11xBhEd5aGSzWsnw1TR8u8PiOF93GO0j5bfNoAFCVzxKOwhRFoIXba2EpQnLQqFdIKyhWN3l70A4GPHmg== +0 -0
  144. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~W7a7M37RO9jgck2zeR0471Pm7e8K0Kqj5tXEouDjvqKZXSrWxMaWD28oqkKKYAiU4608R4S9mM11KyphljdMSw== +0 -0
  145. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~XUo1oyPCrlL7CA74wG-OzQ06VOWJYWvHGFHU7keZN1SKaIXjHX5qi_kBzjG_rBCi89-S8GVmCy7S3PHSjG8SbQ== +0 -0
  146. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Xh0VmDvFNMELHu08-vrs54pegVyUwwDRxx_nXkwyD0NjnYozyqcGAKAr_QWHmw6F8XyuWg51M9KGpJJIFzzGuw== +0 -0
  147. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Xve-wMBp_lxVUgD9qH5GwieGP9cAWtm0xULZvdGjBRUMvaevmpCB5gnbMBuIXAO6a1c9v6WUq0jNVX7ut5HvOw== +0 -0
  148. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~ZU1XkZFgnEE22CXEF-pOlcj5f10x-KM1Vw9d4IOLu-NiTZcz7koYPixhdrB1PJr8J-h9NpJmfqEastfxamA1jQ== +0 -0
  149. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~_YkNYEHTsbbtFILJpzH3HenH0t4ShI25dIMdve541CF5bl-jPF3X3F7tq-t5dvP0TEkATsOJdLQdBp1xv4Q-ag== +0 -0
  150. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~boy6mpn2jkwm60jjgQ0TG25UqRdN46LzmgTVCrpy6nBOgkLCGkGHcbceiwjU1itS_vj3-iQX0ZnrWOQrPyfHNA== +0 -0
  151. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~bwzpVZ9hAqGDHhXs2FRA82dfGfLmc7-m0uQhZDDfHHO7hQ17M_Np341BZX4WDLhYYS4cdUgaDodlNpdfpG3nXw== +0 -0
  152. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~cBxe-9PpAGFdAsYkmdN3lJVqEliLcRYlyoAov0aPZfJGwUr_cOm3XpjO7nmf_2eLf8UAx-rycjnJzw07xLrNCA== +0 -1
  153. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~dirWk6W4Pav1oyciuflfJlRu0iuxbYOmrpQapOJ0mV9C1SQ-jvDRv_7h753Cy18-SwULARUdWsyUy3yNNvxF7w== +0 -0
  154. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~ebwZVjSEHroc9jtIm4jd_h_YAqEBcOkAZ4HPNJT8pLCldjRcTq-obQLakxXOhfuoOBlYBoZLuO-Y0lskeZRYKw== +0 -0
  155. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~gfcRcmRIr0h09d0jiZsA7nUeQv2XtapxuYEXZy1Z9um0tTJQvz-O5ef5f7zhLenLvjnDtDtlY_aY4Hvpce6e1Q== +0 -0
  156. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~hgOgiVCyv2R0W-f0qKw5xYPeUwj8_ccCM9vKH_7vAQcCO9t8BwR1APGRBv20AONmp-PYMXmtgsBlQkNBRBpdQA== +0 -0
  157. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~hrhCl-YRAAr8ByNB_LCgEBsVNHMp92gTIUknetpUHMjcXl4Hpn_uY-h6C45oga0ZALnfGCo6iKTmiPLa4Qvnpg== +0 -0
  158. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~n2yoR7JsyL4DSUwmjnpE4Iq9Qi_eeZrmpPU8cdehDFKfESK7nwxXxfrSMQbk0BQ2lgGPadoRcd1-qr1xVz97jA== +0 -0
  159. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~nMCcZm8WvPogyO_nuJ926Q3Q2dqVMN2LdjEL1Kq2wJ_RG-rH-e_6v41l1xZbCsQTa3XykQdEiXNc0HtAvT6IRA== +0 -0
  160. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~oc3C7xkUt-OWDL6rrsxs-seS4Fu1bqBWAAXCHalgShaGg9MUrOiRbHT2DcAnhyQFKx6x5FRbvjmYoQWrQiXJZA== +0 -0
  161. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~p-ihj7SEgkDXpMu9hvKE_wiX9cvtwyXrdIn964BfedXHKGpC6o7mMPxEyC0kRPVi_EZs_MRV5bAPEpl5h5we0g== +0 -0
  162. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~qlhO_D9oE8uSKH-mZqyRF9pp4Zv1Tv0dIYcqrH4hb1VWlIxcdxmg2j0M8496cQeFXC5bn_JMXdBlD-d6cnFF8w== +0 -0
  163. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~tjpiyIxJR_boTdUNrtFDuKIZoY84fI4lA1oMJbq9e2ZmYKIK5FeRN2O8cV_yMOYJGr4lbv03kTmT70mCjUc2_Q== +0 -0
  164. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~wULeoj18eEKJWAKx1uFQVwS48cUGFcYPRJQj1Ro5XNJsWCwppGSCdIPhwifD6Z2f_j3zfI2SmC2Gg81sBXXW7g== +0 -0
  165. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~zrEihMys4NVV5rx6FmuzEGO2TjloI3OiC7yzIhvqYoRo43ibb2F-Km6Jf4NX-ac62pOLBYZRcjQTvYMpn75_oA== +0 -0
  166. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-7Vi1RszY1XYnR2CCkEwIpKG8NwwA9zsZEz_WD7Dv6kKh4RC7N7ob8NIRVHGUJKp7eXxlpeI_gzD87Pcs_2u0g== +0 -0
  167. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-SKV2drO-SFlrlh-wrzECDMkUSr-aF1lV9h-5onOy94zSTsD-oI45s0-KpOK45L-kq3hRY7v9vm-xmh00_eheg== +0 -0
  168. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-_CU_vuaiFfObSeDFfmp7GuB20ThMSAL-P_RUMowiQLbdu-y0bU9upIm3q8g6XmXUG5hP6J1az0Ma5Hi_rhhRg== +0 -0
  169. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~03aPYP6VHJjZj5DlphGarj0xdw43qu09Onx5SReZoPvg9zh5uL212E-KWfGct9jf6JG0JFV2tdbBi7X_8bH9aw== +0 -0
  170. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~1Z82GPBBPc1VLvn4O7V5glb6lgyXteNlDREUzV_TPymM4ra4UkBMklzV90lEqoYRCDuRVzaQHaDYbmYp3-8CFw== +0 -0
  171. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~1mFDCboXpUu9pSHAiVGr1O_QgqEEtvJp_LUhickxLZo0Z5pj3fvadn1l2MzEOd4bFsVBZifUvcyPa7dzlMWF-A== +0 -0
  172. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~2_L9PUjv2JDKu1n8bDLb4XLB-yex6ZVjDDMwfuKAr7teDw-SKgLgkW6H-m_gjWChIVdB4vW6yvHP7XJxvXtRNA== +0 -0
  173. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== +0 -0
  174. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~4krT4ZMzDOu34msFUq0Xod142kw4pAeSWX4JSxlsjOI0Wanu3343qeespgFi61MTWq1DdH9XXspVKqGlGm_fyw== +0 -0
  175. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~5_aJsdP-e3dRTAUnH-y1U2plaCuUi1vyHriaZuNK0xFe8wGl9Qft6uLCX2Qt6CRBKJQluEe9o0uRWw1eb42FHQ== +0 -0
  176. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~8b0bSqV7eND54zvHvu1v2Htpm7yn-BOEFw5d3mITJrXWNykJ5BTR9WbrD80JEctNcT-rDqO2xfrQk1tFWeY6Sw== +0 -0
  177. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~9u8KAGpgtSm-mQ12Py8RZUbYbDlBhM3w1I2MQO53K2CSn6IePp7g65DBcdXTYMfG1bgoJ-6x30fjnGe-2UYsDQ== +0 -0
  178. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Bw7uMs4wqB9ahfEqGii2FkQ9pvZmG6HGe2hmbAT2wyM5hpn8Xh5dELysMcEz6hEsqmn6HdRdLOLZhC_fNaXzgA== +0 -0
  179. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~BwUq2xXQYuE8ya6HT6lfNsdtEjz5AKGf8GvLY6VBxQyIY1vgj_Gov-3NeM69OS66BQRDK0PG9H4Oyg0R48E4vg== +0 -0
  180. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~EkDVUR6dcnzxV_lYjkrJ5QGMVTCvb_upAoBF6DBu61sQkGvZN3fSRTsJ1XfJIZO-JUzdNoVA3D_CcvokL0gnQg== +0 -0
  181. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~FUkcLSJ8RAuPenM4HFG1R-sN5-cDBGcTxgR2jaVCna7xV0ZTyBHriB1Nn59mariNlJDiCoBtMUQEmauGxWtfBA== +0 -0
  182. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~FqsuZe4RVLOOVUYLTL-GTIohZ8TdSfxx7m2KJtLYFPGOdE4XorTX7Oc7kXbhghPRppXT3jW-slI37M34YNEvLQ== +0 -0
  183. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~G4F_NtyTj3i46fmKm0NorHAeq8tYWWYf6uv5yC1DwzdpWVoYbOPufmFNvdEbxZt4AMdV0gKx3HI46EAXNOQVFg== +0 -0
  184. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~GxetzGUNDgaBBXcTmLK6p9JBDX3I3QPshshbui1IaEWvJbQko-E36tCKwaJYHbleAWz9FqkAM_Tqx3YOmSVkVg== +0 -0
  185. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~H1Wjd5kKWDW4t3SDodxiHV72V8WT0xwPubw5cJTNLkPRLgaILFPh-dpy8EOUNgy1KzrDujFsm9EcTsbuqtMPLA== +0 -0
  186. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~JpI5MH4zCgebUHFpXVn4zjtsGtMNnO7BQZWfNARAB5UWa9gqz6YXHR3uLCJ_AvJ3lh53BUVkavsx9TY2FMmxbA== +0 -0
  187. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~JujNYkJtcux0Ni4QnR64zu4Wz_zYjyKvYaYZm5ypxTLPSzF3_jNE_NO4sdbDamF8wEqWoky1uf4ZE0JT3L607A== +0 -0
  188. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~KJSEA6DKnb2_FRPSqKZGh41eo-C8x448J9kEBrH012bUrZfOSDvrgmIrU0Vz7Ri3gaS9aKKmSaVMvXsHSlTJVA== +0 -0
  189. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~MStOwu3jBlJtcRnxrseVOuhI4kCj--ggFPG7sqrq5w1hjrI3bVyD-bm1Jwyx0noY3wT1rHDEvaGWnV2qsGjGwg== +0 -0
  190. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~McsJ8kFVf3IjhgXIRdw8Xx-EXgbV071bmlj2BBnk52xrWl3sEeiIyxwUsF7mIWvMRWfcFfu4VGHYyqfk2BeHXw== +0 -0
  191. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~NHt9fVe4kDdbxnglKcEwXaRK-WsYEOaD23Kbl8SJPRMYHr_Z6SJd_HmG3BROHHR_M6TgSmucONpDJdTj5tjuFw== +0 -0
  192. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Nfo2iwCPcfAcOBIVyoUAK0-PIfr5qYxIKZt-uaSaTBdrTNxAuJ1ItmeDPZ3VdJJmxD_c22No7x482bdd3_yYtw== +0 -0
  193. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~S2Qlu11xBhEd5aGSzWsnw1TR8u8PiOF93GO0j5bfNoAFCVzxKOwhRFoIXba2EpQnLQqFdIKyhWN3l70A4GPHmg== +0 -0
  194. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~W7a7M37RO9jgck2zeR0471Pm7e8K0Kqj5tXEouDjvqKZXSrWxMaWD28oqkKKYAiU4608R4S9mM11KyphljdMSw== +0 -0
  195. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~XUo1oyPCrlL7CA74wG-OzQ06VOWJYWvHGFHU7keZN1SKaIXjHX5qi_kBzjG_rBCi89-S8GVmCy7S3PHSjG8SbQ== +0 -0
  196. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Xh0VmDvFNMELHu08-vrs54pegVyUwwDRxx_nXkwyD0NjnYozyqcGAKAr_QWHmw6F8XyuWg51M9KGpJJIFzzGuw== +0 -0
  197. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Xve-wMBp_lxVUgD9qH5GwieGP9cAWtm0xULZvdGjBRUMvaevmpCB5gnbMBuIXAO6a1c9v6WUq0jNVX7ut5HvOw== +0 -0
  198. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~ZU1XkZFgnEE22CXEF-pOlcj5f10x-KM1Vw9d4IOLu-NiTZcz7koYPixhdrB1PJr8J-h9NpJmfqEastfxamA1jQ== +0 -0
  199. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~_YkNYEHTsbbtFILJpzH3HenH0t4ShI25dIMdve541CF5bl-jPF3X3F7tq-t5dvP0TEkATsOJdLQdBp1xv4Q-ag== +0 -0
  200. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~boy6mpn2jkwm60jjgQ0TG25UqRdN46LzmgTVCrpy6nBOgkLCGkGHcbceiwjU1itS_vj3-iQX0ZnrWOQrPyfHNA== +0 -0
  201. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~bwzpVZ9hAqGDHhXs2FRA82dfGfLmc7-m0uQhZDDfHHO7hQ17M_Np341BZX4WDLhYYS4cdUgaDodlNpdfpG3nXw== +0 -0
  202. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~cBxe-9PpAGFdAsYkmdN3lJVqEliLcRYlyoAov0aPZfJGwUr_cOm3XpjO7nmf_2eLf8UAx-rycjnJzw07xLrNCA== +0 -0
  203. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~dirWk6W4Pav1oyciuflfJlRu0iuxbYOmrpQapOJ0mV9C1SQ-jvDRv_7h753Cy18-SwULARUdWsyUy3yNNvxF7w== +0 -0
  204. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~ebwZVjSEHroc9jtIm4jd_h_YAqEBcOkAZ4HPNJT8pLCldjRcTq-obQLakxXOhfuoOBlYBoZLuO-Y0lskeZRYKw== +0 -0
  205. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~gfcRcmRIr0h09d0jiZsA7nUeQv2XtapxuYEXZy1Z9um0tTJQvz-O5ef5f7zhLenLvjnDtDtlY_aY4Hvpce6e1Q== +0 -0
  206. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~hgOgiVCyv2R0W-f0qKw5xYPeUwj8_ccCM9vKH_7vAQcCO9t8BwR1APGRBv20AONmp-PYMXmtgsBlQkNBRBpdQA== +0 -0
  207. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~hrhCl-YRAAr8ByNB_LCgEBsVNHMp92gTIUknetpUHMjcXl4Hpn_uY-h6C45oga0ZALnfGCo6iKTmiPLa4Qvnpg== +0 -0
  208. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~n2yoR7JsyL4DSUwmjnpE4Iq9Qi_eeZrmpPU8cdehDFKfESK7nwxXxfrSMQbk0BQ2lgGPadoRcd1-qr1xVz97jA== +0 -0
  209. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~nMCcZm8WvPogyO_nuJ926Q3Q2dqVMN2LdjEL1Kq2wJ_RG-rH-e_6v41l1xZbCsQTa3XykQdEiXNc0HtAvT6IRA== +0 -0
  210. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~oc3C7xkUt-OWDL6rrsxs-seS4Fu1bqBWAAXCHalgShaGg9MUrOiRbHT2DcAnhyQFKx6x5FRbvjmYoQWrQiXJZA== +0 -0
  211. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~p-ihj7SEgkDXpMu9hvKE_wiX9cvtwyXrdIn964BfedXHKGpC6o7mMPxEyC0kRPVi_EZs_MRV5bAPEpl5h5we0g== +0 -0
  212. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~qlhO_D9oE8uSKH-mZqyRF9pp4Zv1Tv0dIYcqrH4hb1VWlIxcdxmg2j0M8496cQeFXC5bn_JMXdBlD-d6cnFF8w== +0 -0
  213. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~tjpiyIxJR_boTdUNrtFDuKIZoY84fI4lA1oMJbq9e2ZmYKIK5FeRN2O8cV_yMOYJGr4lbv03kTmT70mCjUc2_Q== +0 -0
  214. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~wULeoj18eEKJWAKx1uFQVwS48cUGFcYPRJQj1Ro5XNJsWCwppGSCdIPhwifD6Z2f_j3zfI2SmC2Gg81sBXXW7g== +0 -0
  215. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~zrEihMys4NVV5rx6FmuzEGO2TjloI3OiC7yzIhvqYoRo43ibb2F-Km6Jf4NX-ac62pOLBYZRcjQTvYMpn75_oA== +0 -0
  216. package/Tests/Artifacts/LottieTests.xcresult/Info.plist +0 -29
  217. package/Tests/Samples/9squares_AlBoardman.json +0 -1
  218. package/Tests/Samples/Boat_Loader.json +0 -1
  219. package/Tests/Samples/HamburgerArrow.json +0 -1
  220. package/Tests/Samples/IconTransitions.json +0 -1
  221. package/Tests/Samples/Images/dog.png +0 -0
  222. package/Tests/Samples/Issues/issue_1403.json +0 -1
  223. package/Tests/Samples/Issues/issue_1407.json +0 -1
  224. package/Tests/Samples/Issues/issue_1488.json +0 -1
  225. package/Tests/Samples/Issues/issue_1505.json +0 -1
  226. package/Tests/Samples/Issues/issue_1628.json +0 -1
  227. package/Tests/Samples/Issues/pr_1536.json +0 -1
  228. package/Tests/Samples/Issues/pr_1563.json +0 -8439
  229. package/Tests/Samples/Issues/pr_1592.json +0 -5527
  230. package/Tests/Samples/Issues/pr_1599.json +0 -738
  231. package/Tests/Samples/Issues/pr_1604_1.json +0 -1
  232. package/Tests/Samples/Issues/pr_1604_2.json +0 -1
  233. package/Tests/Samples/LottieFiles/LICENSE.md +0 -14
  234. package/Tests/Samples/LottieFiles/bounce_strokes.json +0 -1
  235. package/Tests/Samples/LottieFiles/cactus.json +0 -1
  236. package/Tests/Samples/LottieFiles/dog_car_ride.json +0 -1
  237. package/Tests/Samples/LottieFiles/draft_icon.json +0 -1
  238. package/Tests/Samples/LottieFiles/gradient_1.json +0 -1
  239. package/Tests/Samples/LottieFiles/gradient_2.json +0 -1
  240. package/Tests/Samples/LottieFiles/gradient_pill.json +0 -1
  241. package/Tests/Samples/LottieFiles/gradient_shapes.json +0 -1
  242. package/Tests/Samples/LottieFiles/gradient_square.json +0 -1
  243. package/Tests/Samples/LottieFiles/growth.json +0 -1
  244. package/Tests/Samples/LottieFiles/infinity_loader.json +0 -1
  245. package/Tests/Samples/LottieFiles/loading_dots_1.json +0 -1
  246. package/Tests/Samples/LottieFiles/loading_dots_2.json +0 -1
  247. package/Tests/Samples/LottieFiles/loading_dots_3.json +0 -1
  248. package/Tests/Samples/LottieFiles/loading_gradient_strokes.json +0 -1
  249. package/Tests/Samples/LottieFiles/settings_slider.json +0 -1
  250. package/Tests/Samples/LottieFiles/shop.json +0 -1
  251. package/Tests/Samples/LottieFiles/step_loader.json +0 -1
  252. package/Tests/Samples/LottieLogo1.json +0 -1
  253. package/Tests/Samples/LottieLogo1_masked.json +0 -1
  254. package/Tests/Samples/LottieLogo2.json +0 -1
  255. package/Tests/Samples/MotionCorpse_Jrcanest.json +0 -1
  256. package/Tests/Samples/Nonanimating/BasicLayers.json +0 -1
  257. package/Tests/Samples/Nonanimating/DisableNodesTest.json +0 -1
  258. package/Tests/Samples/Nonanimating/FirstText.json +0 -1
  259. package/Tests/Samples/Nonanimating/GeometryTransformTest.json +0 -1
  260. package/Tests/Samples/Nonanimating/Text_AnimatedProperties.json +0 -1
  261. package/Tests/Samples/Nonanimating/Text_Glyph.json +0 -1
  262. package/Tests/Samples/Nonanimating/Text_NoAnimation.json +0 -1
  263. package/Tests/Samples/Nonanimating/Text_NoGlyph.json +0 -1
  264. package/Tests/Samples/Nonanimating/Zoom.json +0 -1
  265. package/Tests/Samples/Nonanimating/_dog.json +0 -1
  266. package/Tests/Samples/Nonanimating/base64Test.json +0 -1
  267. package/Tests/Samples/Nonanimating/blend_mode_test.json +0 -1
  268. package/Tests/Samples/Nonanimating/keypathTest.json +0 -1
  269. package/Tests/Samples/Nonanimating/verifyLineHeight.json +0 -1
  270. package/Tests/Samples/PinJump.json +0 -1
  271. package/Tests/Samples/Private/BrokenLottieFiles/growth_man.json +0 -874
  272. package/Tests/Samples/Private/BrokenLottieFiles/rocket.json +0 -1
  273. package/Tests/Samples/Private/China_EmptyState_Itinerary.json +0 -1
  274. package/Tests/Samples/Private/LoaderHourglass.json +0 -12070
  275. package/Tests/Samples/Private/README.md +0 -7
  276. package/Tests/Samples/Private/Urgency/alarm_animated.json +0 -1
  277. package/Tests/Samples/Private/Urgency/diamond_animated.json +0 -1
  278. package/Tests/Samples/Private/Urgency/eye_animated.json +0 -1
  279. package/Tests/Samples/Private/Urgency/light_bulb_animated.json +0 -1
  280. package/Tests/Samples/Private/Urgency/light_bulb_static.json +0 -1
  281. package/Tests/Samples/Private/Urgency/piggy_bank_static.json +0 -1
  282. package/Tests/Samples/Private/Urgency/price_tag_legacy.json +0 -1
  283. package/Tests/Samples/Private/Urgency/rausch_alarm.json +0 -1
  284. package/Tests/Samples/Private/Urgency/rausch_alert.json +0 -1
  285. package/Tests/Samples/Private/Urgency/rausch_clock.json +0 -1
  286. package/Tests/Samples/Private/Urgency/rausch_diamond.json +0 -1
  287. package/Tests/Samples/Private/Urgency/rausch_money.json +0 -1
  288. package/Tests/Samples/Private/Urgency/rausch_piggy_bank.json +0 -1
  289. package/Tests/Samples/Private/Urgency/rausch_tag.json +0 -1
  290. package/Tests/Samples/Private/Urgency/red_envelope_animated.json +0 -1
  291. package/Tests/Samples/Private/Urgency/tag_animated.json +0 -1
  292. package/Tests/Samples/Private/Urgency/trophy_animated.json +0 -1
  293. package/Tests/Samples/Private/Urgency/wings_key_animated.json +0 -1
  294. package/Tests/Samples/Private/_flexible.json +0 -1
  295. package/Tests/Samples/Private/aircover.json +0 -1
  296. package/Tests/Samples/Private/belo_spin_rausch.json +0 -1
  297. package/Tests/Samples/Private/celebration.json +0 -2821
  298. package/Tests/Samples/Private/checkbox.json +0 -1
  299. package/Tests/Samples/Private/checkbox_small.json +0 -1
  300. package/Tests/Samples/Private/getting_your_trip_ready.json +0 -3540
  301. package/Tests/Samples/Private/gradient_afternoon.json +0 -1
  302. package/Tests/Samples/Private/gradient_brand.json +0 -1
  303. package/Tests/Samples/Private/gradient_evening.json +0 -1
  304. package/Tests/Samples/Private/gradient_morning.json +0 -1
  305. package/Tests/Samples/Private/issue_1467.json +0 -1
  306. package/Tests/Samples/Private/loading_dots.json +0 -1
  307. package/Tests/Samples/Private/loading_dots_small.json +0 -1
  308. package/Tests/Samples/Private/payment_loader.json +0 -1
  309. package/Tests/Samples/Private/radio_button.json +0 -1
  310. package/Tests/Samples/Private/selfie_intro.json +0 -1
  311. package/Tests/Samples/Private/stepper_add.json +0 -1
  312. package/Tests/Samples/Private/stepper_subtract.json +0 -1
  313. package/Tests/Samples/Private/switch.json +0 -1
  314. package/Tests/Samples/Private/thumb.json +0 -1
  315. package/Tests/Samples/Private/toggle_no.json +0 -1
  316. package/Tests/Samples/Private/toggle_yes.json +0 -1
  317. package/Tests/Samples/Private/user_error_black_and_white.json +0 -1
  318. package/Tests/Samples/Private/user_error_cut_off.json +0 -1
  319. package/Tests/Samples/Switch.json +0 -1
  320. package/Tests/Samples/Switch_States.json +0 -1
  321. package/Tests/Samples/TwitterHeart.json +0 -1
  322. package/Tests/Samples/TwitterHeartButton.json +0 -1
  323. package/Tests/Samples/TypeFace/A.json +0 -1
  324. package/Tests/Samples/TypeFace/Apostrophe.json +0 -1
  325. package/Tests/Samples/TypeFace/B.json +0 -1
  326. package/Tests/Samples/TypeFace/BlinkingCursor.json +0 -1
  327. package/Tests/Samples/TypeFace/C.json +0 -1
  328. package/Tests/Samples/TypeFace/Colon.json +0 -1
  329. package/Tests/Samples/TypeFace/Comma.json +0 -1
  330. package/Tests/Samples/TypeFace/D.json +0 -1
  331. package/Tests/Samples/TypeFace/E.json +0 -1
  332. package/Tests/Samples/TypeFace/F.json +0 -1
  333. package/Tests/Samples/TypeFace/G.json +0 -1
  334. package/Tests/Samples/TypeFace/H.json +0 -1
  335. package/Tests/Samples/TypeFace/I.json +0 -1
  336. package/Tests/Samples/TypeFace/J.json +0 -1
  337. package/Tests/Samples/TypeFace/K.json +0 -1
  338. package/Tests/Samples/TypeFace/L.json +0 -1
  339. package/Tests/Samples/TypeFace/M.json +0 -1
  340. package/Tests/Samples/TypeFace/N.json +0 -1
  341. package/Tests/Samples/TypeFace/O.json +0 -1
  342. package/Tests/Samples/TypeFace/P.json +0 -1
  343. package/Tests/Samples/TypeFace/Q.json +0 -1
  344. package/Tests/Samples/TypeFace/R.json +0 -1
  345. package/Tests/Samples/TypeFace/S.json +0 -1
  346. package/Tests/Samples/TypeFace/T.json +0 -1
  347. package/Tests/Samples/TypeFace/U.json +0 -1
  348. package/Tests/Samples/TypeFace/V.json +0 -1
  349. package/Tests/Samples/TypeFace/W.json +0 -1
  350. package/Tests/Samples/TypeFace/X.json +0 -1
  351. package/Tests/Samples/TypeFace/Y.json +0 -1
  352. package/Tests/Samples/TypeFace/Z.json +0 -1
  353. package/Tests/Samples/Watermelon.json +0 -1
  354. package/Tests/Samples/setValueTest.json +0 -1
  355. package/Tests/Samples/timeremap.json +0 -1
  356. package/Tests/Samples/vcTransition1.json +0 -1
  357. package/Tests/Samples/vcTransition2.json +0 -1
  358. package/script/lint/airbnb.swiftformat +0 -68
  359. package/script/lint/swiftlint.yml +0 -38
  360. package/script/test-carthage/Carthage/Build/.lottie-ios.version +0 -19
  361. package/script/test-carthage/Carthage/Build/Lottie.xcframework/Info.plist +0 -46
  362. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/BCSymbolMaps/BF971162-BE99-3507-B5B3-11947DC6B176.bcsymbolmap +0 -14778
  363. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Headers/Lottie-Swift.h +0 -673
  364. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Info.plist +0 -0
  365. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Lottie +0 -0
  366. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios.swiftdoc +0 -0
  367. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios.swiftmodule +0 -0
  368. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftdoc +0 -0
  369. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftmodule +0 -0
  370. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/module.modulemap +0 -4
  371. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/dSYMs/Lottie.framework.dSYM/Contents/Info.plist +0 -20
  372. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/dSYMs/Lottie.framework.dSYM/Contents/Resources/DWARF/Lottie +0 -0
  373. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Headers/Lottie-Swift.h +0 -1352
  374. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Info.plist +0 -0
  375. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Lottie +0 -0
  376. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/arm64-apple-ios-simulator.swiftsourceinfo +0 -0
  377. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/arm64.swiftsourceinfo +0 -0
  378. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/x86_64-apple-ios-simulator.swiftsourceinfo +0 -0
  379. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/x86_64.swiftsourceinfo +0 -0
  380. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios-simulator.swiftdoc +0 -0
  381. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios-simulator.swiftmodule +0 -0
  382. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftdoc +0 -0
  383. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftmodule +0 -0
  384. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64-apple-ios-simulator.swiftdoc +0 -0
  385. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64-apple-ios-simulator.swiftmodule +0 -0
  386. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64.swiftdoc +0 -0
  387. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64.swiftmodule +0 -0
  388. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/module.modulemap +0 -4
  389. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/_CodeSignature/CodeResources +0 -256
  390. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/dSYMs/Lottie.framework.dSYM/Contents/Info.plist +0 -20
  391. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/dSYMs/Lottie.framework.dSYM/Contents/Resources/DWARF/Lottie +0 -0
  392. package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  393. package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +0 -37
  394. package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
@@ -82,7 +82,6 @@ extension Animation {
82
82
  animationCache: AnimationCacheProvider? = nil)
83
83
  -> Animation?
84
84
  {
85
-
86
85
  /// Check cache for animation
87
86
  if
88
87
  let animationCache = animationCache,
@@ -173,14 +172,14 @@ extension Animation {
173
172
  ///
174
173
  public static func loadedFrom(
175
174
  url: URL,
175
+ session: URLSession = .shared,
176
176
  closure: @escaping Animation.DownloadClosure,
177
177
  animationCache: AnimationCacheProvider?)
178
178
  {
179
-
180
179
  if let animationCache = animationCache, let animation = animationCache.animation(forKey: url.absoluteString) {
181
180
  closure(animation)
182
181
  } else {
183
- let task = URLSession.shared.dataTask(with: url) { data, _, error in
182
+ let task = session.dataTask(with: url) { data, _, error in
184
183
  guard error == nil, let jsonData = data else {
185
184
  DispatchQueue.main.async {
186
185
  closure(nil)
@@ -198,7 +197,6 @@ extension Animation {
198
197
  closure(nil)
199
198
  }
200
199
  }
201
-
202
200
  }
203
201
  task.resume()
204
202
  }
@@ -358,7 +358,6 @@ final public class AnimationView: AnimationViewBase {
358
358
  /// Animatable.
359
359
  public var viewportFrame: CGRect? = nil {
360
360
  didSet {
361
-
362
361
  // This is really ugly, but is needed to trigger a layout pass within an animation block.
363
362
  // Typically this happens automatically, when layout objects are UIView based.
364
363
  // The animation layer is a CALayer which will not implicitly grab the animation
@@ -466,7 +465,7 @@ final public class AnimationView: AnimationViewBase {
466
465
  }
467
466
 
468
467
  let context = AnimationContext(
469
- playFrom: fromFrame ?? currentProgress,
468
+ playFrom: fromFrame ?? currentFrame,
470
469
  playTo: toFrame,
471
470
  closure: completion)
472
471
  addNewAnimationForContext(context)
@@ -490,7 +489,6 @@ final public class AnimationView: AnimationViewBase {
490
489
  loopMode: LottieLoopMode? = nil,
491
490
  completion: LottieCompletionBlock? = nil)
492
491
  {
493
-
494
492
  guard let animation = animation, let markers = animation.markerMap, let to = markers[toMarker] else {
495
493
  return
496
494
  }
@@ -927,7 +925,11 @@ final public class AnimationView: AnimationViewBase {
927
925
 
928
926
  // MARK: Fileprivate
929
927
 
928
+ /// Context describing the animation that is currently playing in this `AnimationView`
929
+ /// - When non-nil, an animation is currently playing in this view. Otherwise,
930
+ /// the view is paused on a specific frame.
930
931
  fileprivate var animationContext: AnimationContext?
932
+
931
933
  fileprivate var _activeAnimationName: String = AnimationView.animationName
932
934
  fileprivate var animationID = 0
933
935
 
@@ -943,7 +945,6 @@ final public class AnimationView: AnimationViewBase {
943
945
  }
944
946
 
945
947
  fileprivate func makeAnimationLayer(usingEngine renderingEngine: RenderingEngineOption) {
946
-
947
948
  /// Remove current animation if any
948
949
  removeCurrentAnimation()
949
950
 
@@ -995,6 +996,7 @@ final public class AnimationView: AnimationViewBase {
995
996
  let coreAnimationLayer = try CoreAnimationLayer(
996
997
  animation: animation,
997
998
  imageProvider: imageProvider.cachedImageProvider,
999
+ textProvider: textProvider,
998
1000
  fontProvider: fontProvider,
999
1001
  compatibilityTrackerMode: .track,
1000
1002
  logger: logger)
@@ -1029,6 +1031,7 @@ final public class AnimationView: AnimationViewBase {
1029
1031
  let coreAnimationLayer = try CoreAnimationLayer(
1030
1032
  animation: animation,
1031
1033
  imageProvider: imageProvider.cachedImageProvider,
1034
+ textProvider: textProvider,
1032
1035
  fontProvider: fontProvider,
1033
1036
  compatibilityTrackerMode: .abort,
1034
1037
  logger: logger)
@@ -1131,12 +1134,18 @@ final public class AnimationView: AnimationViewBase {
1131
1134
  /// - This is not necessary with the Core Animation engine, and skipping
1132
1135
  /// this step lets us avoid building the animations twice (once paused
1133
1136
  /// and once again playing)
1137
+ /// - This method should only be called immediately before setting up another
1138
+ /// animation -- otherwise this AnimationView could be put in an inconsistent state.
1134
1139
  fileprivate func removeCurrentAnimationIfNecessary() {
1135
1140
  switch currentRenderingEngine {
1136
1141
  case .mainThread:
1137
1142
  removeCurrentAnimation()
1138
1143
  case .coreAnimation, nil:
1139
- break
1144
+ // We still need to remove the `animationContext`, since it should only be present
1145
+ // when an animation is actually playing. Without this calling `removeCurrentAnimationIfNecessary()`
1146
+ // and then setting the animation to a specific paused frame would put this
1147
+ // `AnimationView` in an inconsistent state.
1148
+ animationContext = nil
1140
1149
  }
1141
1150
  }
1142
1151
 
@@ -1203,10 +1212,19 @@ final public class AnimationView: AnimationViewBase {
1203
1212
 
1204
1213
  if let coreAnimationLayer = animationlayer as? CoreAnimationLayer {
1205
1214
  var animationContext = animationContext
1215
+
1216
+ // Core Animation doesn't natively support negative speed values,
1217
+ // so instead we can swap `playFrom` / `playTo`
1218
+ if animationSpeed < 0 {
1219
+ let temp = animationContext.playFrom
1220
+ animationContext.playFrom = animationContext.playTo
1221
+ animationContext.playTo = temp
1222
+ }
1223
+
1206
1224
  var timingConfiguration = CoreAnimationLayer.CAMediaTimingConfiguration(
1207
1225
  autoreverses: loopMode.caAnimationConfiguration.autoreverses,
1208
1226
  repeatCount: loopMode.caAnimationConfiguration.repeatCount,
1209
- speed: Float(animationSpeed))
1227
+ speed: abs(Float(animationSpeed)))
1210
1228
 
1211
1229
  // The animation should start playing from the `currentFrame`,
1212
1230
  // if `currentFrame` is included in the time range being played.
@@ -1227,7 +1245,11 @@ final public class AnimationView: AnimationViewBase {
1227
1245
  // the duration of the _first_ loop. Instead of setting `playFrom`, we just add a `timeOffset`
1228
1246
  // so the first loop begins at `currentTime` but all subsequent loops are the standard duration.
1229
1247
  default:
1230
- timingConfiguration.timeOffset = currentTime - animation.time(forFrame: animationContext.playFrom)
1248
+ if animationSpeed < 0 {
1249
+ timingConfiguration.timeOffset = animation.time(forFrame: animationContext.playFrom) - currentTime
1250
+ } else {
1251
+ timingConfiguration.timeOffset = currentTime - animation.time(forFrame: animationContext.playFrom)
1252
+ }
1231
1253
  }
1232
1254
  }
1233
1255
 
@@ -23,11 +23,12 @@ extension AnimationView {
23
23
  name: String,
24
24
  bundle: Bundle = Bundle.main,
25
25
  imageProvider: AnimationImageProvider? = nil,
26
- animationCache: AnimationCacheProvider? = LRUAnimationCache.sharedCache)
26
+ animationCache: AnimationCacheProvider? = LRUAnimationCache.sharedCache,
27
+ configuration: LottieConfiguration = .shared)
27
28
  {
28
29
  let animation = Animation.named(name, bundle: bundle, subdirectory: nil, animationCache: animationCache)
29
30
  let provider = imageProvider ?? BundleImageProvider(bundle: bundle, searchPath: nil)
30
- self.init(animation: animation, imageProvider: provider)
31
+ self.init(animation: animation, imageProvider: provider, configuration: configuration)
31
32
  }
32
33
 
33
34
  /// Loads a Lottie animation from a JSON file in a specific path on disk.
@@ -38,12 +39,13 @@ extension AnimationView {
38
39
  public convenience init(
39
40
  filePath: String,
40
41
  imageProvider: AnimationImageProvider? = nil,
41
- animationCache: AnimationCacheProvider? = LRUAnimationCache.sharedCache)
42
+ animationCache: AnimationCacheProvider? = LRUAnimationCache.sharedCache,
43
+ configuration: LottieConfiguration = .shared)
42
44
  {
43
45
  let animation = Animation.filepath(filePath, animationCache: animationCache)
44
46
  let provider = imageProvider ??
45
47
  FilepathImageProvider(filepath: URL(fileURLWithPath: filePath).deletingLastPathComponent().path)
46
- self.init(animation: animation, imageProvider: provider)
48
+ self.init(animation: animation, imageProvider: provider, configuration: configuration)
47
49
  }
48
50
 
49
51
  /// Loads a Lottie animation asynchronously from the URL
@@ -56,15 +58,14 @@ extension AnimationView {
56
58
  url: URL,
57
59
  imageProvider: AnimationImageProvider? = nil,
58
60
  closure: @escaping AnimationView.DownloadClosure,
59
- animationCache: AnimationCacheProvider? = LRUAnimationCache.sharedCache)
61
+ animationCache: AnimationCacheProvider? = LRUAnimationCache.sharedCache,
62
+ configuration: LottieConfiguration = .shared)
60
63
  {
61
-
62
64
  if let animationCache = animationCache, let animation = animationCache.animation(forKey: url.absoluteString) {
63
- self.init(animation: animation, imageProvider: imageProvider)
65
+ self.init(animation: animation, imageProvider: imageProvider, configuration: configuration)
64
66
  closure(nil)
65
67
  } else {
66
-
67
- self.init(animation: nil, imageProvider: imageProvider)
68
+ self.init(animation: nil, imageProvider: imageProvider, configuration: configuration)
68
69
 
69
70
  Animation.loadedFrom(url: url, closure: { animation in
70
71
  if let animation = animation {
@@ -87,11 +88,12 @@ extension AnimationView {
87
88
  asset name: String,
88
89
  bundle: Bundle = Bundle.main,
89
90
  imageProvider: AnimationImageProvider? = nil,
90
- animationCache: AnimationCacheProvider? = LRUAnimationCache.sharedCache)
91
+ animationCache: AnimationCacheProvider? = LRUAnimationCache.sharedCache,
92
+ configuration: LottieConfiguration = .shared)
91
93
  {
92
94
  let animation = Animation.asset(name, bundle: bundle, animationCache: animationCache)
93
95
  let provider = imageProvider ?? BundleImageProvider(bundle: bundle, searchPath: nil)
94
- self.init(animation: animation, imageProvider: provider)
96
+ self.init(animation: animation, imageProvider: provider, configuration: configuration)
95
97
  }
96
98
 
97
99
  // MARK: Public
@@ -94,13 +94,11 @@ public final class GradientValueProvider: ValueProvider {
94
94
  private var value: [Double] = []
95
95
 
96
96
  private func value(from colors: [Color], locations: [Double]) -> [Double] {
97
-
98
97
  var colorValues = [Double]()
99
98
  var alphaValues = [Double]()
100
99
  var shouldAddAlphaValues = false
101
100
 
102
101
  for i in 0..<colors.count {
103
-
104
102
  if colors[i].a < 1 { shouldAddAlphaValues = true }
105
103
 
106
104
  let location = locations.count > i
@@ -25,7 +25,7 @@ public final class DefaultFontProvider: AnimationFontProvider {
25
25
 
26
26
  // MARK: Lifecycle
27
27
 
28
- public init() {}
28
+ public init() { }
29
29
 
30
30
  // MARK: Public
31
31
 
@@ -10,8 +10,19 @@ public final class LottieLogger {
10
10
  // MARK: Lifecycle
11
11
 
12
12
  public init(
13
- assert: @escaping Assert = Swift.assert,
14
- assertionFailure: @escaping AssertionFailure = Swift.assertionFailure,
13
+ assert: @escaping Assert = { condition, message, file, line in
14
+ // If we default to `Swift.assert` directly with `assert: Assert = Swift.assert`,
15
+ // the call will unexpectedly not respect the -O flag and will crash in release
16
+ // https://github.com/apple/swift/issues/60249
17
+ Swift.assert(condition(), message(), file: file, line: line)
18
+ },
19
+ assertionFailure: @escaping AssertionFailure = { message, file, line in
20
+ // If we default to `Swift.assertionFailure` directly with
21
+ // `assertionFailure: AssertionFailure = Swift.assertionFailure`,
22
+ // the call will unexpectedly not respect the -O flag and will crash in release
23
+ // https://github.com/apple/swift/issues/60249
24
+ Swift.assertionFailure(message(), file: file, line: line)
25
+ },
15
26
  warn: @escaping Warn = { message, _, _ in
16
27
  #if DEBUG
17
28
  // swiftlint:disable:next no_direct_standard_out_logs
@@ -114,10 +125,12 @@ extension LottieLogger {
114
125
  LottieLogger(
115
126
  assert: { condition, message, _, _ in
116
127
  if !condition() {
128
+ // swiftlint:disable:next no_direct_standard_out_logs
117
129
  print(message())
118
130
  }
119
131
  },
120
132
  assertionFailure: { message, _, _ in
133
+ // swiftlint:disable:next no_direct_standard_out_logs
121
134
  print(message())
122
135
  })
123
136
  }
@@ -43,7 +43,7 @@ public final class DefaultTextProvider: AnimationTextProvider {
43
43
 
44
44
  // MARK: Lifecycle
45
45
 
46
- public init() {}
46
+ public init() { }
47
47
 
48
48
  // MARK: Public
49
49
 
@@ -18,20 +18,26 @@ open class AnimatedButton: AnimatedControl {
18
18
  configuration: LottieConfiguration = .shared)
19
19
  {
20
20
  super.init(animation: animation, configuration: configuration)
21
- accessibilityTraits = UIAccessibilityTraits.button
21
+ isAccessibilityElement = true
22
22
  }
23
23
 
24
24
  public override init() {
25
25
  super.init()
26
- accessibilityTraits = UIAccessibilityTraits.button
26
+ isAccessibilityElement = true
27
27
  }
28
28
 
29
29
  required public init?(coder aDecoder: NSCoder) {
30
30
  super.init(coder: aDecoder)
31
+ isAccessibilityElement = true
31
32
  }
32
33
 
33
34
  // MARK: Public
34
35
 
36
+ public override var accessibilityTraits: UIAccessibilityTraits {
37
+ set { super.accessibilityTraits = newValue }
38
+ get { super.accessibilityTraits.union(.button) }
39
+ }
40
+
35
41
  /// Sets the play range for the given UIControlEvent.
36
42
  public func setPlayRange(fromProgress: AnimationProgressTime, toProgress: AnimationProgressTime, event: UIControl.Event) {
37
43
  rangesForEvents[event.rawValue] = (from: fromProgress, to: toProgress)
@@ -70,9 +76,9 @@ open class AnimatedButton: AnimatedControl {
70
76
  }
71
77
  }
72
78
 
73
- // MARK: Fileprivate
79
+ // MARK: Private
74
80
 
75
- fileprivate var rangesForEvents: [UInt : (from: CGFloat, to: CGFloat)] =
81
+ private var rangesForEvents: [UInt : (from: CGFloat, to: CGFloat)] =
76
82
  [UIControl.Event.touchUpInside.rawValue : (from: 0, to: 1)]
77
83
  }
78
84
  #endif
@@ -100,9 +100,7 @@ open class AnimatedControl: UIControl {
100
100
  super.cancelTracking(with: event)
101
101
  }
102
102
 
103
- open func animationDidSet() {
104
-
105
- }
103
+ open func animationDidSet() { }
106
104
 
107
105
  // MARK: Public
108
106
 
@@ -158,9 +156,9 @@ open class AnimatedControl: UIControl {
158
156
  }
159
157
  }
160
158
 
161
- // MARK: Fileprivate
159
+ // MARK: Private
162
160
 
163
- fileprivate func commonInit() {
161
+ private func commonInit() {
164
162
  animationView.clipsToBounds = false
165
163
  clipsToBounds = true
166
164
  animationView.translatesAutoresizingMaskIntoConstraints = false
@@ -32,8 +32,8 @@ open class AnimatedSwitch: AnimatedControl {
32
32
  hapticGenerator = NullHapticGenerator()
33
33
  #endif
34
34
  super.init(animation: animation, configuration: configuration)
35
+ isAccessibilityElement = true
35
36
  updateOnState(isOn: _isOn, animated: false, shouldFireHaptics: false)
36
- accessibilityTraits = UIAccessibilityTraits.button
37
37
  }
38
38
 
39
39
  public override init() {
@@ -48,8 +48,8 @@ open class AnimatedSwitch: AnimatedControl {
48
48
  hapticGenerator = NullHapticGenerator()
49
49
  #endif
50
50
  super.init()
51
+ isAccessibilityElement = true
51
52
  updateOnState(isOn: _isOn, animated: false, shouldFireHaptics: false)
52
- accessibilityTraits = UIAccessibilityTraits.button
53
53
  }
54
54
 
55
55
  required public init?(coder aDecoder: NSCoder) {
@@ -64,7 +64,7 @@ open class AnimatedSwitch: AnimatedControl {
64
64
  hapticGenerator = NullHapticGenerator()
65
65
  #endif
66
66
  super.init(coder: aDecoder)
67
- accessibilityTraits = UIAccessibilityTraits.button
67
+ isAccessibilityElement = true
68
68
  }
69
69
 
70
70
  // MARK: Public
@@ -79,6 +79,11 @@ open class AnimatedSwitch: AnimatedControl {
79
79
  /// The cancel behavior for the switch. See CancelBehavior for options
80
80
  public var cancelBehavior: CancelBehavior = .reverse
81
81
 
82
+ public override var accessibilityTraits: UIAccessibilityTraits {
83
+ set { super.accessibilityTraits = newValue }
84
+ get { super.accessibilityTraits.union(.button) }
85
+ }
86
+
82
87
  /// The current state of the switch.
83
88
  public var isOn: Bool {
84
89
  set {
@@ -203,9 +208,7 @@ protocol ImpactGenerator {
203
208
  // MARK: - NullHapticGenerator
204
209
 
205
210
  class NullHapticGenerator: ImpactGenerator {
206
- func generateImpact() {
207
-
208
- }
211
+ func generateImpact() { }
209
212
  }
210
213
 
211
214
  #if os(iOS)
@@ -32,7 +32,6 @@ public class BundleImageProvider: AnimationImageProvider {
32
32
  // MARK: Public
33
33
 
34
34
  public func imageForAsset(asset: ImageAsset) -> CGImage? {
35
-
36
35
  if
37
36
  let data = Data(imageAsset: asset),
38
37
  let image = UIImage(data: data)
@@ -68,7 +67,7 @@ public class BundleImageProvider: AnimationImageProvider {
68
67
 
69
68
  if imagePath == nil {
70
69
  guard let image = UIImage(named: asset.name, in: bundle, compatibleWith: nil) else {
71
- LottieLogger.shared.assertionFailure("Could not find image \"\(asset.name)\" in bundle")
70
+ LottieLogger.shared.warn("Could not find image \"\(asset.name)\" in bundle")
72
71
  return nil
73
72
  }
74
73
  return image.cgImage
@@ -76,7 +75,7 @@ public class BundleImageProvider: AnimationImageProvider {
76
75
 
77
76
  guard let foundPath = imagePath, let image = UIImage(contentsOfFile: foundPath) else {
78
77
  /// No image found.
79
- LottieLogger.shared.assertionFailure("Could not find image \"\(asset.name)\" in bundle")
78
+ LottieLogger.shared.warn("Could not find image \"\(asset.name)\" in bundle")
80
79
  return nil
81
80
  }
82
81
  return image.cgImage
@@ -29,7 +29,6 @@ public class FilepathImageProvider: AnimationImageProvider {
29
29
  // MARK: Public
30
30
 
31
31
  public func imageForAsset(asset: ImageAsset) -> CGImage? {
32
-
33
32
  if
34
33
  asset.name.hasPrefix("data:"),
35
34
  let url = URL(string: asset.name),
@@ -49,7 +48,7 @@ public class FilepathImageProvider: AnimationImageProvider {
49
48
  return UIImage(contentsOfFile: pathWithDirectory)?.cgImage
50
49
  }
51
50
 
52
- LottieLogger.shared.assertionFailure("Could not find image \"\(asset.name)\" in bundle")
51
+ LottieLogger.shared.warn("Could not find image \"\(asset.name)\" in bundle")
53
52
  return nil
54
53
  }
55
54
 
@@ -29,7 +29,6 @@ public class BundleImageProvider: AnimationImageProvider {
29
29
  // MARK: Public
30
30
 
31
31
  public func imageForAsset(asset: ImageAsset) -> CGImage? {
32
-
33
32
  if
34
33
  let data = Data(imageAsset: asset),
35
34
  let image = NSImage(data: data)
@@ -65,7 +64,7 @@ public class BundleImageProvider: AnimationImageProvider {
65
64
 
66
65
  guard let foundPath = imagePath, let image = NSImage(contentsOfFile: foundPath) else {
67
66
  /// No image found.
68
- LottieLogger.shared.assertionFailure("Could not find image \"\(asset.name)\" in bundle")
67
+ LottieLogger.shared.warn("Could not find image \"\(asset.name)\" in bundle")
69
68
  return nil
70
69
  }
71
70
  return image.lottie_CGImage
@@ -28,7 +28,6 @@ public class FilepathImageProvider: AnimationImageProvider {
28
28
  // MARK: Public
29
29
 
30
30
  public func imageForAsset(asset: ImageAsset) -> CGImage? {
31
-
32
31
  if
33
32
  asset.name.hasPrefix("data:"),
34
33
  let url = URL(string: asset.name),
@@ -40,7 +39,6 @@ public class FilepathImageProvider: AnimationImageProvider {
40
39
 
41
40
  let directPath = filepath.appendingPathComponent(asset.name).path
42
41
  if FileManager.default.fileExists(atPath: directPath) {
43
-
44
42
  return NSImage(contentsOfFile: directPath)?.lottie_CGImage
45
43
  }
46
44
 
@@ -49,7 +47,7 @@ public class FilepathImageProvider: AnimationImageProvider {
49
47
  return NSImage(contentsOfFile: pathWithDirectory)?.lottie_CGImage
50
48
  }
51
49
 
52
- LottieLogger.shared.assertionFailure("Could not find image \"\(asset.name)\" in bundle")
50
+ LottieLogger.shared.warn("Could not find image \"\(asset.name)\" in bundle")
53
51
  return nil
54
52
  }
55
53
 
@@ -49,6 +49,10 @@ final class AnimationKeypathTests: XCTestCase {
49
49
  snapshotHierarchyKeypaths(
50
50
  animationName: "Switch",
51
51
  configuration: LottieConfiguration(renderingEngine: .coreAnimation))
52
+
53
+ snapshotHierarchyKeypaths(
54
+ animationName: "Issues/issue_1664",
55
+ configuration: LottieConfiguration(renderingEngine: .coreAnimation))
52
56
  }
53
57
 
54
58
  /// The Core Animation engine supports a subset of the keypaths supported by the Main Thread engine.
@@ -58,7 +62,12 @@ final class AnimationKeypathTests: XCTestCase {
58
62
  let coreAnimationKeypaths = hierarchyKeypaths(animationName: "Switch", configuration: .init(renderingEngine: .coreAnimation))
59
63
 
60
64
  for coreAnimationKeypath in coreAnimationKeypaths {
61
- XCTAssert(mainThreadKeypaths.contains(coreAnimationKeypath))
65
+ XCTAssert(
66
+ mainThreadKeypaths.contains(coreAnimationKeypath),
67
+ """
68
+ \(coreAnimationKeypath) from Core Animation rendering engine \
69
+ is not supported in Main Thread rendering engine
70
+ """)
62
71
  }
63
72
  }
64
73
 
@@ -19,6 +19,7 @@ final class AutomaticEngineTests: XCTestCase {
19
19
  let animationLayer = try XCTUnwrap(CoreAnimationLayer(
20
20
  animation: animation,
21
21
  imageProvider: BundleImageProvider(bundle: Bundle.main, searchPath: nil),
22
+ textProvider: DefaultTextProvider(),
22
23
  fontProvider: DefaultFontProvider(),
23
24
  compatibilityTrackerMode: .track,
24
25
  logger: .shared))
@@ -33,7 +33,8 @@ func XCTAssertNoDiff<T>(
33
33
  _ expected: @autoclosure () throws -> T,
34
34
  _ received: @autoclosure () throws -> T,
35
35
  file: StaticString = #filePath,
36
- line: UInt = #line) rethrows {
36
+ line: UInt = #line) rethrows
37
+ {
37
38
  let expected = try expected()
38
39
  let received = try received()
39
40
  let diff = diff(expected, received)
@@ -50,7 +50,7 @@ final class PerformanceTests: XCTestCase {
50
50
 
51
51
  // The automatic engine option should have the same performance as the core animation engine,
52
52
  // when rendering an animation supported by the CA engine.
53
- XCTAssertEqual(ratio, 1.0, accuracy: 0.2)
53
+ XCTAssertEqual(ratio, 1.0, accuracy: 0.5)
54
54
  }
55
55
 
56
56
  func testAnimationViewScrubbing_simpleAnimation() {
@@ -66,7 +66,7 @@ final class PerformanceTests: XCTestCase {
66
66
  func testParsing_simpleAnimation() throws {
67
67
  let data = try XCTUnwrap(Bundle.module.getAnimationData("loading_dots_1", subdirectory: "Samples/LottieFiles"))
68
68
  let ratio = try compareDeserializationPerformance(data: data, iterations: 2000)
69
- XCTAssertEqual(ratio, 2, accuracy: 0.55)
69
+ XCTAssertEqual(ratio, 2, accuracy: 0.65)
70
70
  }
71
71
 
72
72
  func testParsing_complexAnimation() throws {
@@ -106,41 +106,40 @@ final class PerformanceTests: XCTestCase {
106
106
  {
107
107
  let engineAPerformance = measurePerformance {
108
108
  for _ in 0..<iterations {
109
- // Each animation setup needs to be wrapped in its own `CATransaction`
110
- // in order for the layers to be deallocated immediately. Otherwise
111
- // the layers aren't deallocated until the end of the test run,
112
- // which causes memory usage to grow unbounded.
113
- CATransaction.begin()
114
- let animationView = setupAnimationView(with: animation, configuration: .init(renderingEngine: engineA))
115
- // Call `display()` on the layer to make sure any pending setup occurs immediately
116
- animationView.animationLayer!.display()
117
- CATransaction.commit()
109
+ setUpAndTearDownAnimationView(with: animation, configuration: .init(renderingEngine: engineA))
118
110
  }
119
111
  }
120
112
 
121
- print("\(engineA) engine took \(engineAPerformance) seconds")
113
+ LottieLogger.shared.info("\(engineA) engine took \(engineAPerformance) seconds")
122
114
 
123
115
  let engineBPerformance = measurePerformance {
124
116
  for _ in 0..<iterations {
125
- // Each animation setup needs to be wrapped in its own `CATransaction`
126
- // in order for the layers to be deallocated immediately. Otherwise
127
- // the layers aren't deallocated until the end of the test run,
128
- // which causes memory usage to grow unbounded.
129
- CATransaction.begin()
130
- let animationView = setupAnimationView(with: animation, configuration: .init(renderingEngine: engineB))
131
- // Call `display()` on the layer to make sure any pending setup occurs immediately
132
- animationView.animationLayer!.display()
133
- CATransaction.commit()
117
+ setUpAndTearDownAnimationView(with: animation, configuration: .init(renderingEngine: engineB))
134
118
  }
135
119
  }
136
120
 
137
- print("\(engineB) engine took \(engineBPerformance) seconds")
121
+ LottieLogger.shared.info("\(engineB) engine took \(engineBPerformance) seconds")
138
122
 
139
123
  let ratio = engineBPerformance / engineAPerformance
140
- print("\(engineB) engine took \(ratio)x as long as \(engineA) engine")
124
+ LottieLogger.shared.info("\(engineB) engine took \(ratio)x as long as \(engineA) engine")
141
125
  return ratio
142
126
  }
143
127
 
128
+ private func setUpAndTearDownAnimationView(with animation: Animation, configuration: LottieConfiguration) {
129
+ // Each animation setup needs to be wrapped in its own `CATransaction`
130
+ // in order for the layers to be deallocated immediately. Otherwise
131
+ // the layers aren't deallocated until the end of the test run,
132
+ // which causes memory usage to grow unbounded.
133
+ CATransaction.begin()
134
+ let animationView = setupAnimationView(with: animation, configuration: configuration)
135
+ // Call `display()` on the layer to make sure any pending setup occurs immediately
136
+ animationView.animationLayer!.display()
137
+ CATransaction.commit()
138
+
139
+ /// The view / layer is deallocated when the transaction is flushed
140
+ CATransaction.flush()
141
+ }
142
+
144
143
  /// Compares performance of scrubbing the given animation with both the Main Thread and Core Animation engine,
145
144
  /// and returns the ratio of how much slower the Core Animation is than the Main Thread engine
146
145
  private func compareEngineScrubbingPerformance(for animation: Animation, iterations: Int) -> Double {
@@ -156,7 +155,7 @@ final class PerformanceTests: XCTestCase {
156
155
  }
157
156
  }
158
157
 
159
- print("Main thread engine took \(mainThreadEnginePerformance) seconds")
158
+ LottieLogger.shared.info("Main thread engine took \(mainThreadEnginePerformance) seconds")
160
159
 
161
160
  let coreAnimationView = setupAnimationView(with: animation, configuration: .init(renderingEngine: .coreAnimation))
162
161
  let coreAnimationEnginePerformance = measurePerformance {
@@ -168,10 +167,10 @@ final class PerformanceTests: XCTestCase {
168
167
  }
169
168
  }
170
169
 
171
- print("Core Animation engine took \(coreAnimationEnginePerformance) seconds")
170
+ LottieLogger.shared.info("Core Animation engine took \(coreAnimationEnginePerformance) seconds")
172
171
 
173
172
  let ratio = coreAnimationEnginePerformance / mainThreadEnginePerformance
174
- print("Core Animation engine took \(ratio)x as long as the Main Thread engine")
173
+ LottieLogger.shared.info("Core Animation engine took \(ratio)x as long as the Main Thread engine")
175
174
  return ratio
176
175
  }
177
176
 
@@ -182,7 +181,7 @@ final class PerformanceTests: XCTestCase {
182
181
  }
183
182
  }
184
183
 
185
- print("Codable deserialization took \(codablePerformance) seconds")
184
+ LottieLogger.shared.info("Codable deserialization took \(codablePerformance) seconds")
186
185
 
187
186
  let dictPerformance = try measurePerformance {
188
187
  for _ in 0..<iterations {
@@ -190,9 +189,9 @@ final class PerformanceTests: XCTestCase {
190
189
  }
191
190
  }
192
191
 
193
- print("DictionaryBased deserialization took \(dictPerformance) seconds")
192
+ LottieLogger.shared.info("DictionaryBased deserialization took \(dictPerformance) seconds")
194
193
  let ratio = codablePerformance / dictPerformance
195
- print("Codable deserialization took \(ratio)x as long as DictionaryBased")
194
+ LottieLogger.shared.info("Codable deserialization took \(ratio)x as long as DictionaryBased")
196
195
  return ratio
197
196
  }
198
197