diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index bec29c505c..071b1c0112 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -807,7 +807,6 @@ 662C440B2A156DF7001F83E2 /* SecureValueRecovery2Impl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 662C440A2A156DF7001F83E2 /* SecureValueRecovery2Impl.swift */; }; 662C44172A1D21D7001F83E2 /* SecureValueRecovery2Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 662C44152A1D2101001F83E2 /* SecureValueRecovery2Tests.swift */; }; 663BA3182A4B8595004B9A43 /* SpoilerRenderState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 663BA3172A4B8595004B9A43 /* SpoilerRenderState.swift */; }; - 663BA31C2A4C9997004B9A43 /* safety-numbers.json in Resources */ = {isa = PBXBuildFile; fileRef = 663BA31B2A4C9997004B9A43 /* safety-numbers.json */; }; 663BA3202A4CF96B004B9A43 /* MessageBodyDisplayConfigurations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 663BA31F2A4CF96B004B9A43 /* MessageBodyDisplayConfigurations.swift */; }; 663D6A7C292319BC00CABC49 /* ConversationPickerFailedRecipientsSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 663D6A7B292319BC00CABC49 /* ConversationPickerFailedRecipientsSheet.swift */; }; 6640639E294D20A900997E0B /* OutgoingCallEventSyncMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6640639D294D20A900997E0B /* OutgoingCallEventSyncMessage.swift */; }; @@ -3398,7 +3397,6 @@ 662C440A2A156DF7001F83E2 /* SecureValueRecovery2Impl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureValueRecovery2Impl.swift; sourceTree = ""; }; 662C44152A1D2101001F83E2 /* SecureValueRecovery2Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureValueRecovery2Tests.swift; sourceTree = ""; }; 663BA3172A4B8595004B9A43 /* SpoilerRenderState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpoilerRenderState.swift; sourceTree = ""; }; - 663BA31B2A4C9997004B9A43 /* safety-numbers.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "safety-numbers.json"; sourceTree = ""; }; 663BA31F2A4CF96B004B9A43 /* MessageBodyDisplayConfigurations.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageBodyDisplayConfigurations.swift; sourceTree = ""; }; 663D6A7B292319BC00CABC49 /* ConversationPickerFailedRecipientsSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConversationPickerFailedRecipientsSheet.swift; sourceTree = ""; }; 6640639D294D20A900997E0B /* OutgoingCallEventSyncMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OutgoingCallEventSyncMessage.swift; sourceTree = ""; }; @@ -7720,7 +7718,6 @@ 880C0FF6233D3F7C00386FB8 /* playPauseButton.json */, 346EFC3825FFDC6900F493C7 /* restore-dark.json */, 346EFC3725FFDC6900F493C7 /* restore.json */, - 663BA31B2A4C9997004B9A43 /* safety-numbers.json */, 66586D3529005A1B00DDA9B9 /* story_viewer_onboarding_1.json */, 66586D3429005A1B00DDA9B9 /* story_viewer_onboarding_2.json */, 66586D3629005A1B00DDA9B9 /* story_viewer_onboarding_3.json */, @@ -10802,7 +10799,6 @@ 346EFC3C25FFDC6A00F493C7 /* restore-dark.json in Resources */, 346EFC3B25FFDC6A00F493C7 /* restore.json in Resources */, 34CF0788203E6B78005C4D61 /* ringback_tone_ansi.caf in Resources */, - 663BA31C2A4C9997004B9A43 /* safety-numbers.json in Resources */, 882F8DE6251AB23600AA4359 /* Settings.bundle in Resources */, 4C63CC00210A620B003AE45C /* SignalTSan.supp in Resources */, 4C6F527C20FFE8400097DEEE /* SignalUBSan.supp in Resources */, diff --git a/Signal/Images.xcassets/safety_number_transition.imageset/Contents.json b/Signal/Images.xcassets/safety_number_transition.imageset/Contents.json deleted file mode 100644 index 7ff6228d2f..0000000000 --- a/Signal/Images.xcassets/safety_number_transition.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "safety-numbers.svg", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Signal/Images.xcassets/safety_number_transition.imageset/safety-numbers.svg b/Signal/Images.xcassets/safety_number_transition.imageset/safety-numbers.svg deleted file mode 100644 index 75d875b29a..0000000000 --- a/Signal/Images.xcassets/safety_number_transition.imageset/safety-numbers.svg +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Signal/Lottie/safety-numbers.json b/Signal/Lottie/safety-numbers.json deleted file mode 100644 index 9e90568ab3..0000000000 --- a/Signal/Lottie/safety-numbers.json +++ /dev/null @@ -1 +0,0 @@ -{"v":"4.8.0","fr":60,"ip":0,"op":360,"w":364,"h":180,"ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":540,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":94,"s":[-108.322,-158,0],"to":[1.326,0.017,0],"ti":[-14.887,-0.011,0]},{"t":121,"s":[-19,-157.932,0],"h":1},{"t":269,"s":[-19,-157.932,0],"h":1},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":270,"s":[-19,-157.932,0],"to":[-14.887,-0.011,0],"ti":[-14.803,-0.189,0]},{"t":300,"s":[-108.322,-158,0]}],"ix":2},"a":{"a":0,"k":[89,-193,0],"ix":1},"s":{"a":0,"k":[100,-100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":94,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-91.767,-17.593],[-91.767,130.829],[-24.128,117.117],[-24.128,-31.305]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":102,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-73.845,-19.168],[-73.845,129.254],[-6.206,115.542],[-6.206,-32.88]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":106,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-54.839,-17.269],[-54.839,131.153],[12.801,117.44],[12.801,-30.982]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":109,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-39.98,-15.684],[-39.98,132.738],[27.659,119.026],[27.659,-29.396]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":113,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-21.367,-13.347],[-21.367,135.075],[46.272,121.363],[46.272,-27.059]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-13.829,-12.457],[-13.829,135.964],[53.81,122.252],[53.81,-26.17]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":116,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-10.423,-12.11],[-10.423,136.312],[57.217,122.6],[57.217,-25.822]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":121,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.719,-11.85],[-2.719,136.572],[64.92,122.86],[64.92,-25.562]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":271,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.719,-11.85],[-2.719,136.572],[64.92,122.86],[64.92,-25.562]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":276,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-10.957,-11.804],[-10.957,136.618],[56.682,122.905],[56.682,-25.516]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":277,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-13.423,-11.72],[-13.423,136.702],[54.217,122.99],[54.217,-25.432]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":280,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-22.51,-11.92],[-22.51,136.501],[45.129,122.789],[45.129,-25.633]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":284,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-37.444,-12.943],[-37.444,135.479],[30.195,121.767],[30.195,-26.655]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":288,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-53.473,-14.462],[-53.473,133.96],[14.166,120.248],[14.166,-28.174]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":293,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-74.597,-16.652],[-74.597,131.77],[-6.957,118.058],[-6.957,-30.364]],"c":true}]},{"t":300,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-91.767,-17.593],[-91.767,130.829],[-24.128,117.117],[-24.128,-31.305]],"c":true}]}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"ip":0,"op":1800,"st":0,"bm":0,"shapes":[{"ty":"gr","np":2,"cix":2,"bm":0,"ix":1,"hd":false,"it":[{"ty":"st","c":{"a":0,"k":[0.219607843137,0.337254901961,0.713725490196,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,"hd":false},{"ty":"fl","c":{"a":0,"k":[0.846262254902,0.564174816655,0.564174816655,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"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}}]},{"ty":"gr","np":10,"cix":2,"bm":0,"ix":2,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0.552],[-0.552,0],[0,0],[0,-0.552],[0.552,0],[0,0]],"o":[[0,-0.552],[0,0],[0.552,0],[0,0.552],[0,0],[-0.552,0]],"v":[[-15,-6],[-14,-7],[-8,-7],[-7,-6],[-8,-5],[-14,-5]],"c":true},"ix":2},"hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0.552],[-0.552,0],[0,0],[0,-0.552],[0.552,0],[0,0]],"o":[[0,-0.552],[0,0],[0.552,0],[0,0.552],[0,0],[-0.552,0]],"v":[[-4,-6],[-3,-7],[3,-7],[4,-6],[3,-5],[-3,-5]],"c":true},"ix":2},"hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.552],[-0.552,0],[0,0],[0,0.552],[0.552,0]],"o":[[-0.552,0],[0,0.552],[0,0],[0.552,0],[0,-0.552],[0,0]],"v":[[8,-7],[7,-6],[8,-5],[14,-5],[15,-6],[14,-7]],"c":true},"ix":2},"hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0.552],[-0.552,0],[0,0],[0,-0.552],[0.552,0],[0,0]],"o":[[0,-0.552],[0,0],[0.552,0],[0,0.552],[0,0],[-0.552,0]],"v":[[-4,0],[-3,-1],[3,-1],[4,0],[3,1],[-3,1]],"c":true},"ix":2},"hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.552],[-0.552,0],[0,0],[0,0.552],[0.552,0]],"o":[[-0.552,0],[0,0.552],[0,0],[0.552,0],[0,-0.552],[0,0]],"v":[[-14,-1],[-15,0],[-14,1],[-8,1],[-7,0],[-8,-1]],"c":true},"ix":2},"hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[0,0.552],[-0.552,0],[0,0],[0,-0.552],[0.552,0],[0,0]],"o":[[0,-0.552],[0,0],[0.552,0],[0,0.552],[0,0],[-0.552,0]],"v":[[7,0],[8,-1],[14,-1],[15,0],[14,1],[8,1]],"c":true},"ix":2},"hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.552],[-0.552,0],[0,0],[0,0.552],[0.552,0]],"o":[[-0.552,0],[0,0.552],[0,0],[0.552,0],[0,-0.552],[0,0]],"v":[[-3,5],[-4,6],[-3,7],[3,7],[4,6],[3,5]],"c":true},"ix":2},"hd":false},{"ind":7,"ty":"sh","ix":8,"ks":{"a":0,"k":{"i":[[0,0.552],[-0.552,0],[0,0],[0,-0.552],[0.552,0],[0,0]],"o":[[0,-0.552],[0,0],[0.552,0],[0,0.552],[0,0],[-0.552,0]],"v":[[-15,6],[-14,5],[-8,5],[-7,6],[-8,7],[-14,7]],"c":true},"ix":2},"hd":false},{"ind":8,"ty":"sh","ix":9,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.552],[-0.552,0],[0,0],[0,0.552],[0.552,0]],"o":[[-0.552,0],[0,0.552],[0,0],[0.552,0],[0,-0.552],[0,0]],"v":[[8,5],[7,6],[8,7],[14,7],[15,6],[14,5]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[28,60],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":3,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.345,0],[0,0],[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346]],"o":[[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346],[0,0],[-0.345,0],[0,0]],"v":[[-1.042,-0.417],[-0.417,-1.042],[0.417,-1.042],[1.042,-0.417],[1.042,0.417],[0.417,1.042],[-0.417,1.042],[-1.042,0.417]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[30.292,36.875],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":4,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.345],[0,0],[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0]],"o":[[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0],[0,0],[0,-0.345],[0,0]],"v":[[-0.417,-1.042],[-1.042,-0.417],[-1.042,0.417],[-0.417,1.042],[0.417,1.042],[1.042,0.417],[1.042,-0.417],[0.417,-1.042]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[34.875,32.292],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":5,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.345,0],[0,0],[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346]],"o":[[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346],[0,0],[-0.345,0],[0,0]],"v":[[-1.042,-0.417],[-0.417,-1.042],[0.417,-1.042],[1.042,-0.417],[1.042,0.417],[0.417,1.042],[-0.417,1.042],[-1.042,0.417]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[34.875,36.875],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":6,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.345,0],[0,0],[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346]],"o":[[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346],[0,0],[-0.345,0],[0,0]],"v":[[-1.042,-0.417],[-0.417,-1.042],[0.417,-1.042],[1.042,-0.417],[1.042,0.417],[0.417,1.042],[-0.417,1.042],[-1.042,0.417]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[32.583,34.583],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":7,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.345],[0,0],[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0]],"o":[[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0],[0,0],[0,-0.345],[0,0]],"v":[[-0.417,-1.042],[-1.042,-0.417],[-1.042,0.417],[-0.417,1.042],[0.417,1.042],[1.042,0.417],[1.042,-0.417],[0.417,-1.042]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[30.292,32.292],"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}}]},{"ty":"gr","np":3,"cix":2,"bm":0,"ix":8,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.238,-0.019],[0.253,-0.13],[0.189,-0.373],[0.021,-0.254],[0,-0.327],[0,0],[-0.019,-0.239],[-0.129,-0.254],[-0.373,-0.19],[-0.254,-0.021],[-0.327,0],[0,0],[-0.239,0.019],[-0.254,0.129],[-0.19,0.372],[-0.021,0.253],[0,0.327],[0,0],[0.019,0.238],[0.129,0.253],[0.372,0.189],[0.253,0.021],[0.327,0]],"o":[[-0.327,0],[-0.254,0.021],[-0.373,0.189],[-0.129,0.253],[-0.019,0.238],[0,0],[0,0.327],[0.021,0.253],[0.189,0.372],[0.253,0.129],[0.238,0.019],[0,0],[0.327,0],[0.253,-0.021],[0.372,-0.19],[0.129,-0.254],[0.019,-0.239],[0,0],[0,-0.327],[-0.021,-0.254],[-0.19,-0.373],[-0.254,-0.13],[-0.239,-0.019],[0,0]],"v":[[-1.152,-3.854],[-2.005,-3.835],[-2.773,-3.638],[-3.638,-2.773],[-3.835,-2.005],[-3.854,-1.152],[-3.854,1.152],[-3.835,2.006],[-3.638,2.774],[-2.773,3.639],[-2.005,3.835],[-1.152,3.854],[1.152,3.854],[2.006,3.835],[2.774,3.639],[3.639,2.774],[3.835,2.006],[3.854,1.152],[3.854,-1.152],[3.835,-2.005],[3.639,-2.773],[2.774,-3.638],[2.006,-3.835],[1.152,-3.854]],"c":true},"ix":2},"hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-0.098,0.05],[-0.164,0.013],[-0.362,0],[0,0],[-0.172,-0.014],[-0.014,-0.007],[-0.05,-0.098],[-0.013,-0.164],[0,-0.362],[0,0],[0.014,-0.172],[0.007,-0.014],[0.098,-0.05],[0.163,-0.013],[0.362,0],[0,0],[0.171,0.014],[0.014,0.007],[0.05,0.098],[0.013,0.163],[0,0.362],[0,0],[-0.014,0.171],[-0.007,0.013]],"o":[[0.014,-0.007],[0.171,-0.014],[0,0],[0.362,0],[0.163,0.013],[0.098,0.05],[0.007,0.013],[0.014,0.171],[0,0],[0,0.362],[-0.013,0.163],[-0.05,0.098],[-0.014,0.007],[-0.172,0.014],[0,0],[-0.362,0],[-0.164,-0.013],[-0.098,-0.05],[-0.007,-0.014],[-0.014,-0.172],[0,0],[0,-0.362],[0.013,-0.164],[0.05,-0.098]],"v":[[-2.111,-2.339],[-1.886,-2.381],[-1.125,-2.396],[1.125,-2.396],[1.887,-2.381],[2.112,-2.339],[2.339,-2.111],[2.381,-1.886],[2.396,-1.125],[2.396,1.125],[2.381,1.887],[2.339,2.112],[2.112,2.339],[1.887,2.381],[1.125,2.396],[-1.125,2.396],[-1.886,2.381],[-2.111,2.339],[-2.339,2.112],[-2.381,1.887],[-2.396,1.125],[-2.396,-1.125],[-2.381,-1.886],[-2.339,-2.111]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[32.583,25.417],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":9,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.345],[0,0],[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0]],"o":[[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0],[0,0],[0,-0.345],[0,0]],"v":[[-0.417,-1.042],[-1.042,-0.417],[-1.042,0.417],[-0.417,1.042],[0.417,1.042],[1.042,0.417],[1.042,-0.417],[0.417,-1.042]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[32.583,25.417],"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}}]},{"ty":"gr","np":3,"cix":2,"bm":0,"ix":10,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.327,0],[0,0],[-0.239,-0.019],[-0.254,-0.13],[-0.19,-0.373],[-0.021,-0.254],[0,-0.327],[0,0],[0.019,-0.239],[0.129,-0.254],[0.372,-0.19],[0.253,-0.021],[0.327,0],[0,0],[0.238,0.019],[0.253,0.129],[0.189,0.372],[0.021,0.253],[0,0.327],[0,0],[-0.019,0.238],[-0.129,0.253],[-0.373,0.189],[-0.254,0.021]],"o":[[0,0],[0.327,0],[0.253,0.021],[0.372,0.189],[0.129,0.253],[0.019,0.238],[0,0],[0,0.327],[-0.021,0.253],[-0.19,0.372],[-0.254,0.129],[-0.239,0.019],[0,0],[-0.327,0],[-0.254,-0.021],[-0.373,-0.19],[-0.129,-0.254],[-0.019,-0.239],[0,0],[0,-0.327],[0.021,-0.254],[0.189,-0.373],[0.253,-0.13],[0.238,-0.019]],"v":[[-1.152,-3.854],[1.152,-3.854],[2.006,-3.835],[2.774,-3.638],[3.639,-2.773],[3.835,-2.005],[3.854,-1.152],[3.854,1.152],[3.835,2.006],[3.639,2.774],[2.774,3.639],[2.006,3.835],[1.152,3.854],[-1.152,3.854],[-2.005,3.835],[-2.773,3.639],[-3.638,2.774],[-3.835,2.006],[-3.854,1.152],[-3.854,-1.152],[-3.835,-2.005],[-3.638,-2.773],[-2.773,-3.638],[-2.005,-3.835]],"c":true},"ix":2},"hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.171,-0.014],[0.014,-0.007],[0.05,-0.098],[0.013,-0.164],[0,-0.362],[0,0],[-0.014,-0.172],[-0.007,-0.014],[-0.098,-0.05],[-0.164,-0.013],[-0.362,0],[0,0],[-0.172,0.014],[-0.014,0.007],[-0.05,0.098],[-0.013,0.163],[0,0.362],[0,0],[0.014,0.171],[0.007,0.013],[0.098,0.05],[0.163,0.013],[0.362,0],[0,0]],"o":[[-0.164,0.013],[-0.098,0.05],[-0.007,0.013],[-0.014,0.171],[0,0],[0,0.362],[0.013,0.163],[0.05,0.098],[0.014,0.007],[0.171,0.014],[0,0],[0.362,0],[0.163,-0.013],[0.098,-0.05],[0.007,-0.014],[0.014,-0.172],[0,0],[0,-0.362],[-0.013,-0.164],[-0.05,-0.098],[-0.014,-0.007],[-0.172,-0.014],[0,0],[-0.362,0]],"v":[[-1.886,-2.381],[-2.111,-2.339],[-2.339,-2.111],[-2.381,-1.886],[-2.396,-1.125],[-2.396,1.125],[-2.381,1.887],[-2.339,2.112],[-2.111,2.339],[-1.886,2.381],[-1.125,2.396],[1.125,2.396],[1.887,2.381],[2.112,2.339],[2.339,2.112],[2.381,1.887],[2.396,1.125],[2.396,-1.125],[2.381,-1.886],[2.339,-2.111],[2.112,-2.339],[1.887,-2.381],[1.125,-2.396],[-1.125,-2.396]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[23.417,34.583],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":11,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.345],[0,0],[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0]],"o":[[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0],[0,0],[0,-0.345],[0,0]],"v":[[-0.417,-1.042],[-1.042,-0.417],[-1.042,0.417],[-0.417,1.042],[0.417,1.042],[1.042,0.417],[1.042,-0.417],[0.417,-1.042]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[23.417,34.583],"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}}]},{"ty":"gr","np":3,"cix":2,"bm":0,"ix":12,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.327,0],[0,0],[-0.239,-0.019],[-0.254,-0.13],[-0.19,-0.373],[-0.021,-0.254],[0,-0.327],[0,0],[0.019,-0.239],[0.129,-0.254],[0.372,-0.19],[0.253,-0.021],[0.327,0],[0,0],[0.238,0.019],[0.253,0.129],[0.189,0.372],[0.021,0.253],[0,0.327],[0,0],[-0.019,0.238],[-0.129,0.253],[-0.373,0.189],[-0.254,0.021]],"o":[[0,0],[0.327,0],[0.253,0.021],[0.372,0.189],[0.129,0.253],[0.019,0.238],[0,0],[0,0.327],[-0.021,0.253],[-0.19,0.372],[-0.254,0.129],[-0.239,0.019],[0,0],[-0.327,0],[-0.254,-0.021],[-0.373,-0.19],[-0.129,-0.254],[-0.019,-0.239],[0,0],[0,-0.327],[0.021,-0.254],[0.189,-0.373],[0.253,-0.13],[0.238,-0.019]],"v":[[-1.152,-3.854],[1.152,-3.854],[2.006,-3.835],[2.774,-3.638],[3.639,-2.773],[3.835,-2.005],[3.854,-1.152],[3.854,1.152],[3.835,2.006],[3.639,2.774],[2.774,3.639],[2.006,3.835],[1.152,3.854],[-1.152,3.854],[-2.005,3.835],[-2.773,3.639],[-3.638,2.774],[-3.835,2.006],[-3.854,1.152],[-3.854,-1.152],[-3.835,-2.005],[-3.638,-2.773],[-2.773,-3.638],[-2.005,-3.835]],"c":true},"ix":2},"hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.171,-0.014],[0.014,-0.007],[0.05,-0.098],[0.013,-0.164],[0,-0.362],[0,0],[-0.014,-0.172],[-0.007,-0.014],[-0.098,-0.05],[-0.164,-0.013],[-0.362,0],[0,0],[-0.172,0.014],[-0.014,0.007],[-0.05,0.098],[-0.013,0.163],[0,0.362],[0,0],[0.014,0.171],[0.007,0.013],[0.098,0.05],[0.163,0.013],[0.362,0],[0,0]],"o":[[-0.164,0.013],[-0.098,0.05],[-0.007,0.013],[-0.014,0.171],[0,0],[0,0.362],[0.013,0.163],[0.05,0.098],[0.014,0.007],[0.171,0.014],[0,0],[0.362,0],[0.163,-0.013],[0.098,-0.05],[0.007,-0.014],[0.014,-0.172],[0,0],[0,-0.362],[-0.013,-0.164],[-0.05,-0.098],[-0.014,-0.007],[-0.172,-0.014],[0,0],[-0.362,0]],"v":[[-1.886,-2.381],[-2.111,-2.339],[-2.339,-2.111],[-2.381,-1.886],[-2.396,-1.125],[-2.396,1.125],[-2.381,1.887],[-2.339,2.112],[-2.111,2.339],[-1.886,2.381],[-1.125,2.396],[1.125,2.396],[1.887,2.381],[2.112,2.339],[2.339,2.112],[2.381,1.887],[2.396,1.125],[2.396,-1.125],[2.381,-1.886],[2.339,-2.111],[2.112,-2.339],[1.887,-2.381],[1.125,-2.396],[-1.125,-2.396]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[23.417,25.417],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":13,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.345,0],[0,0],[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346]],"o":[[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346],[0,0],[-0.345,0],[0,0]],"v":[[-1.042,-0.417],[-0.417,-1.042],[0.417,-1.042],[1.042,-0.417],[1.042,0.417],[0.417,1.042],[-0.417,1.042],[-1.042,0.417]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[23.417,25.417],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":14,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.209,0],[0,0],[0,-2.209],[0,0],[2.209,0],[0,0],[0,2.209]],"o":[[0,-2.209],[0,0],[2.209,0],[0,0],[0,2.209],[0,0],[-2.209,0],[0,0]],"v":[[-16,-12],[-12,-16],[12,-16],[16,-12],[16,12],[12,16],[-12,16],[-16,12]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[28,30],"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}}]},{"ty":"gr","np":3,"cix":2,"bm":0,"ix":15,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-4.418,0],[0,0],[0,-4.418],[0,0],[4.418,0],[0,0],[0,4.418]],"o":[[0,-4.418],[0,0],[4.418,0],[0,0],[0,4.418],[0,0],[-4.418,0],[0,0]],"v":[[-28,-34.5],[-20,-42.5],[20,-42.5],[28,-34.5],[28,34.5],[20,42.5],[-20,42.5],[-28,34.5]],"c":true},"ix":2},"hd":false},{"ty":"st","c":{"a":0,"k":[0.219607843137,0.337254901961,0.713725490196,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,"hd":false},{"ty":"fl","c":{"a":0,"k":[0.313725490196,0.431372578939,0.803921628466,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[28,42.5],"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}}]},{"ty":"gr","np":0,"cix":2,"bm":0,"ix":16,"hd":false,"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}}]}]},{"ddd":0,"ind":2,"ty":4,"parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0.263},"t":94,"s":[-21.679,-157.854,0],"to":[-0.022,-0.08,0],"ti":[-10.823,6.249,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":121,"s":[53.242,-157.854,0],"to":[0,0,0],"ti":[-10.823,6.249,0]},{"i":{"x":0.833,"y":0.853},"o":{"x":0.333,"y":0},"t":270,"s":[53.242,-157.854,0],"to":[0,0,0],"ti":[0.022,0.08,0]},{"t":300,"s":[-21.679,-157.854,0]}],"ix":2},"a":{"a":0,"k":[93,-192,0],"ix":1},"s":{"a":0,"k":[100,-100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":95,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-7.859,-26.694],[-6.519,122.853],[60.183,128.308],[61.535,-22.587]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":98,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.277,-25.426],[2.576,123.978],[67.629,128.919],[68.98,-21.977]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":102,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[14.2,-24.958],[15.397,124.088],[76.264,127.722],[77.615,-23.173]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":106,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[30.023,-24.317],[31.043,124.112],[95.254,126.769],[96.605,-24.127]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":110,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[44.426,-23.814],[45.282,124.039],[112.613,125.785],[113.964,-25.111]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":113,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[53.66,-23.857],[54.392,123.564],[124.062,124.626],[125.413,-26.27]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":121,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[65.122,-24.738],[65.66,122.005],[139.004,121.993],[140.355,-28.902]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":270,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[65.122,-24.738],[65.66,122.005],[139.004,121.993],[140.355,-28.902]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":277,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[57.047,-22.432],[57.788,125.023],[129.446,126.4],[130.797,-24.495]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":279,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[54.042,-21.545],[54.861,126.179],[125.88,128.082],[127.231,-22.814]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":284,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[40.546,-20.866],[41.56,127.543],[110.958,130.78],[112.309,-20.116]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":288,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[28.048,-20.993],[29.21,127.929],[97.392,132.167],[98.743,-18.728]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":290,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[21.177,-21.574],[22.395,127.548],[90.102,132.177],[91.453,-18.719]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":295,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[5.905,-23.005],[7.245,126.541],[73.948,131.997],[75.299,-18.899]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":296,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.714,-24.128],[3.054,125.418],[69.757,130.874],[71.108,-20.022]],"c":true}]},{"t":299,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-6.169,-26.241],[-4.829,123.305],[61.874,128.761],[63.225,-22.134]],"c":true}]}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"ip":0,"op":1800,"st":0,"bm":0,"shapes":[{"ty":"gr","np":3,"cix":2,"bm":0,"ix":1,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[-78.338,-96.654]],"c":true},"ix":2},"hd":false},{"ty":"st","c":{"a":0,"k":[0.552941176471,0.537254901961,0.501960784314,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.5,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"hd":false},{"ty":"fl","c":{"a":0,"k":[0.846262254902,0.564174816655,0.564174816655,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[23.991,36.474],"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}}]},{"ty":"gr","np":10,"cix":2,"bm":0,"ix":2,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0.552],[-0.552,0],[0,0],[0,-0.552],[0.552,0],[0,0]],"o":[[0,-0.552],[0,0],[0.552,0],[0,0.552],[0,0],[-0.552,0]],"v":[[-15,-6],[-14,-7],[-8,-7],[-7,-6],[-8,-5],[-14,-5]],"c":true},"ix":2},"hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0.552],[-0.552,0],[0,0],[0,-0.552],[0.552,0],[0,0]],"o":[[0,-0.552],[0,0],[0.552,0],[0,0.552],[0,0],[-0.552,0]],"v":[[-4,-6],[-3,-7],[3,-7],[4,-6],[3,-5],[-3,-5]],"c":true},"ix":2},"hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.552],[-0.552,0],[0,0],[0,0.552],[0.552,0]],"o":[[-0.552,0],[0,0.552],[0,0],[0.552,0],[0,-0.552],[0,0]],"v":[[8,-7],[7,-6],[8,-5],[14,-5],[15,-6],[14,-7]],"c":true},"ix":2},"hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0.552],[-0.552,0],[0,0],[0,-0.552],[0.552,0],[0,0]],"o":[[0,-0.552],[0,0],[0.552,0],[0,0.552],[0,0],[-0.552,0]],"v":[[-4,0],[-3,-1],[3,-1],[4,0],[3,1],[-3,1]],"c":true},"ix":2},"hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.552],[-0.552,0],[0,0],[0,0.552],[0.552,0]],"o":[[-0.552,0],[0,0.552],[0,0],[0.552,0],[0,-0.552],[0,0]],"v":[[-14,-1],[-15,0],[-14,1],[-8,1],[-7,0],[-8,-1]],"c":true},"ix":2},"hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[0,0.552],[-0.552,0],[0,0],[0,-0.552],[0.552,0],[0,0]],"o":[[0,-0.552],[0,0],[0.552,0],[0,0.552],[0,0],[-0.552,0]],"v":[[7,0],[8,-1],[14,-1],[15,0],[14,1],[8,1]],"c":true},"ix":2},"hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.552],[-0.552,0],[0,0],[0,0.552],[0.552,0]],"o":[[-0.552,0],[0,0.552],[0,0],[0.552,0],[0,-0.552],[0,0]],"v":[[-3,5],[-4,6],[-3,7],[3,7],[4,6],[3,5]],"c":true},"ix":2},"hd":false},{"ind":7,"ty":"sh","ix":8,"ks":{"a":0,"k":{"i":[[0,0.552],[-0.552,0],[0,0],[0,-0.552],[0.552,0],[0,0]],"o":[[0,-0.552],[0,0],[0.552,0],[0,0.552],[0,0],[-0.552,0]],"v":[[-15,6],[-14,5],[-8,5],[-7,6],[-8,7],[-14,7]],"c":true},"ix":2},"hd":false},{"ind":8,"ty":"sh","ix":9,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.552],[-0.552,0],[0,0],[0,0.552],[0.552,0]],"o":[[-0.552,0],[0,0.552],[0,0],[0.552,0],[0,-0.552],[0,0]],"v":[[8,5],[7,6],[8,7],[14,7],[15,6],[14,5]],"c":true},"ix":2},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.552941176471,0.537254901961,0.501960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[28,60],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":3,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.345,0],[0,0],[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346]],"o":[[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346],[0,0],[-0.345,0],[0,0]],"v":[[-1.042,-0.417],[-0.417,-1.042],[0.417,-1.042],[1.042,-0.417],[1.042,0.417],[0.417,1.042],[-0.417,1.042],[-1.042,0.417]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[30.292,36.875],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":4,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.345],[0,0],[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0]],"o":[[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0],[0,0],[0,-0.345],[0,0]],"v":[[-0.417,-1.042],[-1.042,-0.417],[-1.042,0.417],[-0.417,1.042],[0.417,1.042],[1.042,0.417],[1.042,-0.417],[0.417,-1.042]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[34.875,32.292],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":5,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.345,0],[0,0],[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346]],"o":[[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346],[0,0],[-0.345,0],[0,0]],"v":[[-1.042,-0.417],[-0.417,-1.042],[0.417,-1.042],[1.042,-0.417],[1.042,0.417],[0.417,1.042],[-0.417,1.042],[-1.042,0.417]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[34.875,36.875],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":6,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.345,0],[0,0],[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346]],"o":[[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346],[0,0],[-0.345,0],[0,0]],"v":[[-1.042,-0.417],[-0.417,-1.042],[0.417,-1.042],[1.042,-0.417],[1.042,0.417],[0.417,1.042],[-0.417,1.042],[-1.042,0.417]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[32.583,34.583],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":7,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.345],[0,0],[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0]],"o":[[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0],[0,0],[0,-0.345],[0,0]],"v":[[-0.417,-1.042],[-1.042,-0.417],[-1.042,0.417],[-0.417,1.042],[0.417,1.042],[1.042,0.417],[1.042,-0.417],[0.417,-1.042]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[30.292,32.292],"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}}]},{"ty":"gr","np":3,"cix":2,"bm":0,"ix":8,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.238,-0.019],[0.253,-0.13],[0.189,-0.373],[0.021,-0.254],[0,-0.327],[0,0],[-0.019,-0.239],[-0.129,-0.254],[-0.373,-0.19],[-0.254,-0.021],[-0.327,0],[0,0],[-0.239,0.019],[-0.254,0.129],[-0.19,0.372],[-0.021,0.253],[0,0.327],[0,0],[0.019,0.238],[0.129,0.253],[0.372,0.189],[0.253,0.021],[0.327,0]],"o":[[-0.327,0],[-0.254,0.021],[-0.373,0.189],[-0.129,0.253],[-0.019,0.238],[0,0],[0,0.327],[0.021,0.253],[0.189,0.372],[0.253,0.129],[0.238,0.019],[0,0],[0.327,0],[0.253,-0.021],[0.372,-0.19],[0.129,-0.254],[0.019,-0.239],[0,0],[0,-0.327],[-0.021,-0.254],[-0.19,-0.373],[-0.254,-0.13],[-0.239,-0.019],[0,0]],"v":[[-1.152,-3.854],[-2.005,-3.835],[-2.773,-3.638],[-3.638,-2.773],[-3.835,-2.005],[-3.854,-1.152],[-3.854,1.152],[-3.835,2.006],[-3.638,2.774],[-2.773,3.639],[-2.005,3.835],[-1.152,3.854],[1.152,3.854],[2.006,3.835],[2.774,3.639],[3.639,2.774],[3.835,2.006],[3.854,1.152],[3.854,-1.152],[3.835,-2.005],[3.639,-2.773],[2.774,-3.638],[2.006,-3.835],[1.152,-3.854]],"c":true},"ix":2},"hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-0.098,0.05],[-0.164,0.013],[-0.362,0],[0,0],[-0.172,-0.014],[-0.014,-0.007],[-0.05,-0.098],[-0.013,-0.164],[0,-0.362],[0,0],[0.014,-0.172],[0.007,-0.014],[0.098,-0.05],[0.163,-0.013],[0.362,0],[0,0],[0.171,0.014],[0.014,0.007],[0.05,0.098],[0.013,0.163],[0,0.362],[0,0],[-0.014,0.171],[-0.007,0.013]],"o":[[0.014,-0.007],[0.171,-0.014],[0,0],[0.362,0],[0.163,0.013],[0.098,0.05],[0.007,0.013],[0.014,0.171],[0,0],[0,0.362],[-0.013,0.163],[-0.05,0.098],[-0.014,0.007],[-0.172,0.014],[0,0],[-0.362,0],[-0.164,-0.013],[-0.098,-0.05],[-0.007,-0.014],[-0.014,-0.172],[0,0],[0,-0.362],[0.013,-0.164],[0.05,-0.098]],"v":[[-2.111,-2.339],[-1.886,-2.381],[-1.125,-2.396],[1.125,-2.396],[1.887,-2.381],[2.112,-2.339],[2.339,-2.111],[2.381,-1.886],[2.396,-1.125],[2.396,1.125],[2.381,1.887],[2.339,2.112],[2.112,2.339],[1.887,2.381],[1.125,2.396],[-1.125,2.396],[-1.886,2.381],[-2.111,2.339],[-2.339,2.112],[-2.381,1.887],[-2.396,1.125],[-2.396,-1.125],[-2.381,-1.886],[-2.339,-2.111]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[32.583,25.417],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":9,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.345],[0,0],[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0]],"o":[[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0],[0,0],[0,-0.345],[0,0]],"v":[[-0.417,-1.042],[-1.042,-0.417],[-1.042,0.417],[-0.417,1.042],[0.417,1.042],[1.042,0.417],[1.042,-0.417],[0.417,-1.042]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[32.583,25.417],"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}}]},{"ty":"gr","np":3,"cix":2,"bm":0,"ix":10,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.327,0],[0,0],[-0.239,-0.019],[-0.254,-0.13],[-0.19,-0.373],[-0.021,-0.254],[0,-0.327],[0,0],[0.019,-0.239],[0.129,-0.254],[0.372,-0.19],[0.253,-0.021],[0.327,0],[0,0],[0.238,0.019],[0.253,0.129],[0.189,0.372],[0.021,0.253],[0,0.327],[0,0],[-0.019,0.238],[-0.129,0.253],[-0.373,0.189],[-0.254,0.021]],"o":[[0,0],[0.327,0],[0.253,0.021],[0.372,0.189],[0.129,0.253],[0.019,0.238],[0,0],[0,0.327],[-0.021,0.253],[-0.19,0.372],[-0.254,0.129],[-0.239,0.019],[0,0],[-0.327,0],[-0.254,-0.021],[-0.373,-0.19],[-0.129,-0.254],[-0.019,-0.239],[0,0],[0,-0.327],[0.021,-0.254],[0.189,-0.373],[0.253,-0.13],[0.238,-0.019]],"v":[[-1.152,-3.854],[1.152,-3.854],[2.006,-3.835],[2.774,-3.638],[3.639,-2.773],[3.835,-2.005],[3.854,-1.152],[3.854,1.152],[3.835,2.006],[3.639,2.774],[2.774,3.639],[2.006,3.835],[1.152,3.854],[-1.152,3.854],[-2.005,3.835],[-2.773,3.639],[-3.638,2.774],[-3.835,2.006],[-3.854,1.152],[-3.854,-1.152],[-3.835,-2.005],[-3.638,-2.773],[-2.773,-3.638],[-2.005,-3.835]],"c":true},"ix":2},"hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.171,-0.014],[0.014,-0.007],[0.05,-0.098],[0.013,-0.164],[0,-0.362],[0,0],[-0.014,-0.172],[-0.007,-0.014],[-0.098,-0.05],[-0.164,-0.013],[-0.362,0],[0,0],[-0.172,0.014],[-0.014,0.007],[-0.05,0.098],[-0.013,0.163],[0,0.362],[0,0],[0.014,0.171],[0.007,0.013],[0.098,0.05],[0.163,0.013],[0.362,0],[0,0]],"o":[[-0.164,0.013],[-0.098,0.05],[-0.007,0.013],[-0.014,0.171],[0,0],[0,0.362],[0.013,0.163],[0.05,0.098],[0.014,0.007],[0.171,0.014],[0,0],[0.362,0],[0.163,-0.013],[0.098,-0.05],[0.007,-0.014],[0.014,-0.172],[0,0],[0,-0.362],[-0.013,-0.164],[-0.05,-0.098],[-0.014,-0.007],[-0.172,-0.014],[0,0],[-0.362,0]],"v":[[-1.886,-2.381],[-2.111,-2.339],[-2.339,-2.111],[-2.381,-1.886],[-2.396,-1.125],[-2.396,1.125],[-2.381,1.887],[-2.339,2.112],[-2.111,2.339],[-1.886,2.381],[-1.125,2.396],[1.125,2.396],[1.887,2.381],[2.112,2.339],[2.339,2.112],[2.381,1.887],[2.396,1.125],[2.396,-1.125],[2.381,-1.886],[2.339,-2.111],[2.112,-2.339],[1.887,-2.381],[1.125,-2.396],[-1.125,-2.396]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[23.417,34.583],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":11,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.345],[0,0],[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0]],"o":[[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0],[0,0],[0,-0.345],[0,0]],"v":[[-0.417,-1.042],[-1.042,-0.417],[-1.042,0.417],[-0.417,1.042],[0.417,1.042],[1.042,0.417],[1.042,-0.417],[0.417,-1.042]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[23.417,34.583],"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}}]},{"ty":"gr","np":3,"cix":2,"bm":0,"ix":12,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.327,0],[0,0],[-0.239,-0.019],[-0.254,-0.13],[-0.19,-0.373],[-0.021,-0.254],[0,-0.327],[0,0],[0.019,-0.239],[0.129,-0.254],[0.372,-0.19],[0.253,-0.021],[0.327,0],[0,0],[0.238,0.019],[0.253,0.129],[0.189,0.372],[0.021,0.253],[0,0.327],[0,0],[-0.019,0.238],[-0.129,0.253],[-0.373,0.189],[-0.254,0.021]],"o":[[0,0],[0.327,0],[0.253,0.021],[0.372,0.189],[0.129,0.253],[0.019,0.238],[0,0],[0,0.327],[-0.021,0.253],[-0.19,0.372],[-0.254,0.129],[-0.239,0.019],[0,0],[-0.327,0],[-0.254,-0.021],[-0.373,-0.19],[-0.129,-0.254],[-0.019,-0.239],[0,0],[0,-0.327],[0.021,-0.254],[0.189,-0.373],[0.253,-0.13],[0.238,-0.019]],"v":[[-1.152,-3.854],[1.152,-3.854],[2.006,-3.835],[2.774,-3.638],[3.639,-2.773],[3.835,-2.005],[3.854,-1.152],[3.854,1.152],[3.835,2.006],[3.639,2.774],[2.774,3.639],[2.006,3.835],[1.152,3.854],[-1.152,3.854],[-2.005,3.835],[-2.773,3.639],[-3.638,2.774],[-3.835,2.006],[-3.854,1.152],[-3.854,-1.152],[-3.835,-2.005],[-3.638,-2.773],[-2.773,-3.638],[-2.005,-3.835]],"c":true},"ix":2},"hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.171,-0.014],[0.014,-0.007],[0.05,-0.098],[0.013,-0.164],[0,-0.362],[0,0],[-0.014,-0.172],[-0.007,-0.014],[-0.098,-0.05],[-0.164,-0.013],[-0.362,0],[0,0],[-0.172,0.014],[-0.014,0.007],[-0.05,0.098],[-0.013,0.163],[0,0.362],[0,0],[0.014,0.171],[0.007,0.013],[0.098,0.05],[0.163,0.013],[0.362,0],[0,0]],"o":[[-0.164,0.013],[-0.098,0.05],[-0.007,0.013],[-0.014,0.171],[0,0],[0,0.362],[0.013,0.163],[0.05,0.098],[0.014,0.007],[0.171,0.014],[0,0],[0.362,0],[0.163,-0.013],[0.098,-0.05],[0.007,-0.014],[0.014,-0.172],[0,0],[0,-0.362],[-0.013,-0.164],[-0.05,-0.098],[-0.014,-0.007],[-0.172,-0.014],[0,0],[-0.362,0]],"v":[[-1.886,-2.381],[-2.111,-2.339],[-2.339,-2.111],[-2.381,-1.886],[-2.396,-1.125],[-2.396,1.125],[-2.381,1.887],[-2.339,2.112],[-2.111,2.339],[-1.886,2.381],[-1.125,2.396],[1.125,2.396],[1.887,2.381],[2.112,2.339],[2.339,2.112],[2.381,1.887],[2.396,1.125],[2.396,-1.125],[2.381,-1.886],[2.339,-2.111],[2.112,-2.339],[1.887,-2.381],[1.125,-2.396],[-1.125,-2.396]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[23.417,25.417],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":13,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.345,0],[0,0],[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346]],"o":[[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346],[0,0],[-0.345,0],[0,0]],"v":[[-1.042,-0.417],[-0.417,-1.042],[0.417,-1.042],[1.042,-0.417],[1.042,0.417],[0.417,1.042],[-0.417,1.042],[-1.042,0.417]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[23.417,25.417],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":14,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.209,0],[0,0],[0,-2.209],[0,0],[2.209,0],[0,0],[0,2.209]],"o":[[0,-2.209],[0,0],[2.209,0],[0,0],[0,2.209],[0,0],[-2.209,0],[0,0]],"v":[[-16,-12],[-12,-16],[12,-16],[16,-12],[16,12],[12,16],[-12,16],[-16,12]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[28,30],"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}}]},{"ty":"gr","np":3,"cix":2,"bm":0,"ix":15,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-4.418,0],[0,0],[0,-4.418],[0,0],[4.418,0],[0,0],[0,4.418]],"o":[[0,-4.418],[0,0],[4.418,0],[0,0],[0,4.418],[0,0],[-4.418,0],[0,0]],"v":[[-28,-34.5],[-20,-42.5],[20,-42.5],[28,-34.5],[28,34.5],[20,42.5],[-20,42.5],[-28,34.5]],"c":true},"ix":2},"hd":false},{"ty":"st","c":{"a":0,"k":[0.552941176471,0.537254901961,0.501960784314,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.5,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568687289,0.917647118662,0.909803981407,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[28,42.5],"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}}]}]},{"ddd":0,"ind":3,"ty":4,"parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[85,0,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":1800,"st":0,"bm":0,"shapes":[{"ty":"gr","np":3,"cix":2,"bm":0,"ix":1,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-8.837],[0,0],[-8.837,0],[0,0],[0,8.837],[0,0],[8.837,0]],"o":[[-8.837,0],[0,0],[0,8.837],[0,0],[8.837,0],[0,0],[0,-8.837],[0,0]],"v":[[-26,-82],[-42,-66],[-42,66],[-26,82],[26,82],[42,66],[42,-66],[26,-82]],"c":true},"ix":2},"hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-6.627,0],[0,0],[0,-6.627],[0,0],[6.627,0],[0,0],[0,6.627]],"o":[[0,-6.627],[0,0],[6.627,0],[0,0],[0,6.627],[0,0],[-6.627,0],[0,0]],"v":[[-38,-66],[-26,-78],[26,-78],[38,-66],[38,66],[26,78],[-26,78],[-38,66]],"c":true},"ix":2},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.305882352941,0.337254901961,0.415686304429,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[42,82],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":2,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-1.657],[-1.657,0],[0,0],[0,1.657],[1.657,0]],"o":[[-1.657,0],[0,1.657],[0,0],[1.657,0],[0,-1.657],[0,0]],"v":[[-9,-3],[-12,0],[-9,3],[9,3],[12,0],[9,-3]],"c":true},"ix":2},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.305882352941,0.337254901961,0.415686304429,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[42,13],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":3,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-8.837,0],[0,0],[0,-8.837],[0,0],[8.837,0],[0,0],[0,8.837]],"o":[[0,-8.837],[0,0],[8.837,0],[0,0],[0,8.837],[0,0],[-8.837,0],[0,0]],"v":[[-42,-66],[-26,-82],[26,-82],[42,-66],[42,66],[26,82],[-26,82],[-42,66]],"c":true},"ix":2},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.941176530427,0.941176530427,0.941176530427,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[42,82],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":4,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-8.837,0],[0,0],[0,-8.837],[0,0],[8.837,0],[0,0],[0,8.837]],"o":[[0,-8.837],[0,0],[8.837,0],[0,0],[0,8.837],[0,0],[-8.837,0],[0,0]],"v":[[-42,-66],[-26,-82],[26,-82],[42,-66],[42,66],[26,82],[-26,82],[-42,66]],"c":true},"ix":2},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980451995,0.850980451995,0.850980451995,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[46,82],"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}}]}]},{"ddd":0,"ind":4,"ty":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.001],"y":[0]},"t":0,"s":[-70]},{"t":40,"s":[-75]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.001,"y":0},"t":0,"s":[465,74,0],"to":[-26.333,2.667,0],"ti":[26.333,-2.667,0]},{"t":40,"s":[307,90,0]}],"ix":2},"a":{"a":0,"k":[42,82,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":1800,"st":0,"bm":0,"shapes":[{"ty":"gr","np":2,"cix":2,"bm":0,"ix":1,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-8.837,0],[0,0],[0,-8.837],[0,0],[8.837,0],[0,0],[0,8.837]],"o":[[0,-8.837],[0,0],[8.837,0],[0,0],[0,8.837],[0,0],[-8.837,0],[0,0]],"v":[[-42,-66],[-26,-82],[26,-82],[42,-66],[42,66],[26,82],[-26,82],[-42,66]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[42,82],"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}}]}]},{"ddd":0,"ind":5,"ty":4,"parent":9,"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":[2,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":1800,"st":0,"bm":0,"shapes":[{"ty":"gr","np":3,"cix":2,"bm":0,"ix":1,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-8.837],[0,0],[-8.837,0],[0,0],[0,8.837],[0,0],[8.837,0]],"o":[[-8.837,0],[0,0],[0,8.837],[0,0],[8.837,0],[0,0],[0,-8.837],[0,0]],"v":[[-26,-82],[-42,-66],[-42,66],[-26,82],[26,82],[42,66],[42,-66],[26,-82]],"c":true},"ix":2},"hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-6.627,0],[0,0],[0,-6.627],[0,0],[6.627,0],[0,0],[0,6.627]],"o":[[0,-6.627],[0,0],[6.627,0],[0,0],[0,6.627],[0,0],[-6.627,0],[0,0]],"v":[[-38,-66],[-26,-78],[26,-78],[38,-66],[38,66],[26,78],[-26,78],[-38,66]],"c":true},"ix":2},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.305882352941,0.337254901961,0.415686304429,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[42,82],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":2,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-1.657],[-1.657,0],[0,0],[0,1.657],[1.657,0]],"o":[[-1.657,0],[0,1.657],[0,0],[1.657,0],[0,-1.657],[0,0]],"v":[[-9,-3],[-12,0],[-9,3],[9,3],[12,0],[9,-3]],"c":true},"ix":2},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.305882352941,0.337254901961,0.415686304429,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[42,13],"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}}]}]},{"ddd":0,"ind":6,"ty":4,"parent":9,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":90,"s":[120.5,82,0],"to":[-13.5,0,0],"ti":[13.5,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":120,"s":[39.5,82,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":269,"s":[39.5,82,0],"to":[2.466,0,0],"ti":[-9.606,0,0]},{"t":300,"s":[120.5,82,0]}],"ix":2},"a":{"a":0,"k":[28,42.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":90,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-82.35,-15.069],[-82.35,133.352],[-14.71,119.64],[-14.71,-28.782]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":102,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-53.561,-13.733],[-53.561,134.689],[14.079,120.977],[14.079,-27.445]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":118,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.754,-11.591],[-1.754,136.831],[65.886,123.118],[65.886,-25.304]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":269,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.754,-11.591],[-1.754,136.831],[65.886,123.118],[65.886,-25.304]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":276,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-11.868,-13.307],[-11.868,135.115],[55.771,121.403],[55.771,-27.019]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":279,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-20.961,-14.814],[-20.961,133.608],[46.678,119.895],[46.678,-28.527]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":284,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-39.604,-18.252],[-39.604,130.17],[28.035,116.457],[28.035,-31.964]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":291,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-65.469,-23.07],[-65.469,125.352],[2.171,111.64],[2.171,-36.782]],"c":true}]},{"t":300,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-82.372,-27.599],[-82.372,120.823],[-14.733,107.11],[-14.733,-41.312]],"c":true}]}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"ip":0,"op":1800,"st":0,"bm":0,"shapes":[{"ty":"gr","np":2,"cix":2,"bm":0,"ix":1,"hd":false,"it":[{"ty":"st","c":{"a":0,"k":[0.219607843137,0.337254901961,0.713725490196,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,"hd":false},{"ty":"fl","c":{"a":0,"k":[0.846262254902,0.564174816655,0.564174816655,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"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}}]},{"ty":"gr","np":10,"cix":2,"bm":0,"ix":2,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0.552],[-0.552,0],[0,0],[0,-0.552],[0.552,0],[0,0]],"o":[[0,-0.552],[0,0],[0.552,0],[0,0.552],[0,0],[-0.552,0]],"v":[[-15,-6],[-14,-7],[-8,-7],[-7,-6],[-8,-5],[-14,-5]],"c":true},"ix":2},"hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0.552],[-0.552,0],[0,0],[0,-0.552],[0.552,0],[0,0]],"o":[[0,-0.552],[0,0],[0.552,0],[0,0.552],[0,0],[-0.552,0]],"v":[[-4,-6],[-3,-7],[3,-7],[4,-6],[3,-5],[-3,-5]],"c":true},"ix":2},"hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.552],[-0.552,0],[0,0],[0,0.552],[0.552,0]],"o":[[-0.552,0],[0,0.552],[0,0],[0.552,0],[0,-0.552],[0,0]],"v":[[8,-7],[7,-6],[8,-5],[14,-5],[15,-6],[14,-7]],"c":true},"ix":2},"hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0.552],[-0.552,0],[0,0],[0,-0.552],[0.552,0],[0,0]],"o":[[0,-0.552],[0,0],[0.552,0],[0,0.552],[0,0],[-0.552,0]],"v":[[-4,0],[-3,-1],[3,-1],[4,0],[3,1],[-3,1]],"c":true},"ix":2},"hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.552],[-0.552,0],[0,0],[0,0.552],[0.552,0]],"o":[[-0.552,0],[0,0.552],[0,0],[0.552,0],[0,-0.552],[0,0]],"v":[[-14,-1],[-15,0],[-14,1],[-8,1],[-7,0],[-8,-1]],"c":true},"ix":2},"hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[0,0.552],[-0.552,0],[0,0],[0,-0.552],[0.552,0],[0,0]],"o":[[0,-0.552],[0,0],[0.552,0],[0,0.552],[0,0],[-0.552,0]],"v":[[7,0],[8,-1],[14,-1],[15,0],[14,1],[8,1]],"c":true},"ix":2},"hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.552],[-0.552,0],[0,0],[0,0.552],[0.552,0]],"o":[[-0.552,0],[0,0.552],[0,0],[0.552,0],[0,-0.552],[0,0]],"v":[[-3,5],[-4,6],[-3,7],[3,7],[4,6],[3,5]],"c":true},"ix":2},"hd":false},{"ind":7,"ty":"sh","ix":8,"ks":{"a":0,"k":{"i":[[0,0.552],[-0.552,0],[0,0],[0,-0.552],[0.552,0],[0,0]],"o":[[0,-0.552],[0,0],[0.552,0],[0,0.552],[0,0],[-0.552,0]],"v":[[-15,6],[-14,5],[-8,5],[-7,6],[-8,7],[-14,7]],"c":true},"ix":2},"hd":false},{"ind":8,"ty":"sh","ix":9,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.552],[-0.552,0],[0,0],[0,0.552],[0.552,0]],"o":[[-0.552,0],[0,0.552],[0,0],[0.552,0],[0,-0.552],[0,0]],"v":[[8,5],[7,6],[8,7],[14,7],[15,6],[14,5]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[28,60],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":3,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.345,0],[0,0],[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346]],"o":[[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346],[0,0],[-0.345,0],[0,0]],"v":[[-1.042,-0.417],[-0.417,-1.042],[0.417,-1.042],[1.042,-0.417],[1.042,0.417],[0.417,1.042],[-0.417,1.042],[-1.042,0.417]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[30.292,36.875],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":4,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.345],[0,0],[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0]],"o":[[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0],[0,0],[0,-0.345],[0,0]],"v":[[-0.417,-1.042],[-1.042,-0.417],[-1.042,0.417],[-0.417,1.042],[0.417,1.042],[1.042,0.417],[1.042,-0.417],[0.417,-1.042]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[34.875,32.292],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":5,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.345,0],[0,0],[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346]],"o":[[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346],[0,0],[-0.345,0],[0,0]],"v":[[-1.042,-0.417],[-0.417,-1.042],[0.417,-1.042],[1.042,-0.417],[1.042,0.417],[0.417,1.042],[-0.417,1.042],[-1.042,0.417]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[34.875,36.875],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":6,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.345,0],[0,0],[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346]],"o":[[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346],[0,0],[-0.345,0],[0,0]],"v":[[-1.042,-0.417],[-0.417,-1.042],[0.417,-1.042],[1.042,-0.417],[1.042,0.417],[0.417,1.042],[-0.417,1.042],[-1.042,0.417]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[32.583,34.583],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":7,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.345],[0,0],[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0]],"o":[[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0],[0,0],[0,-0.345],[0,0]],"v":[[-0.417,-1.042],[-1.042,-0.417],[-1.042,0.417],[-0.417,1.042],[0.417,1.042],[1.042,0.417],[1.042,-0.417],[0.417,-1.042]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[30.292,32.292],"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}}]},{"ty":"gr","np":3,"cix":2,"bm":0,"ix":8,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.238,-0.019],[0.253,-0.13],[0.189,-0.373],[0.021,-0.254],[0,-0.327],[0,0],[-0.019,-0.239],[-0.129,-0.254],[-0.373,-0.19],[-0.254,-0.021],[-0.327,0],[0,0],[-0.239,0.019],[-0.254,0.129],[-0.19,0.372],[-0.021,0.253],[0,0.327],[0,0],[0.019,0.238],[0.129,0.253],[0.372,0.189],[0.253,0.021],[0.327,0]],"o":[[-0.327,0],[-0.254,0.021],[-0.373,0.189],[-0.129,0.253],[-0.019,0.238],[0,0],[0,0.327],[0.021,0.253],[0.189,0.372],[0.253,0.129],[0.238,0.019],[0,0],[0.327,0],[0.253,-0.021],[0.372,-0.19],[0.129,-0.254],[0.019,-0.239],[0,0],[0,-0.327],[-0.021,-0.254],[-0.19,-0.373],[-0.254,-0.13],[-0.239,-0.019],[0,0]],"v":[[-1.152,-3.854],[-2.005,-3.835],[-2.773,-3.638],[-3.638,-2.773],[-3.835,-2.005],[-3.854,-1.152],[-3.854,1.152],[-3.835,2.006],[-3.638,2.774],[-2.773,3.639],[-2.005,3.835],[-1.152,3.854],[1.152,3.854],[2.006,3.835],[2.774,3.639],[3.639,2.774],[3.835,2.006],[3.854,1.152],[3.854,-1.152],[3.835,-2.005],[3.639,-2.773],[2.774,-3.638],[2.006,-3.835],[1.152,-3.854]],"c":true},"ix":2},"hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-0.098,0.05],[-0.164,0.013],[-0.362,0],[0,0],[-0.172,-0.014],[-0.014,-0.007],[-0.05,-0.098],[-0.013,-0.164],[0,-0.362],[0,0],[0.014,-0.172],[0.007,-0.014],[0.098,-0.05],[0.163,-0.013],[0.362,0],[0,0],[0.171,0.014],[0.014,0.007],[0.05,0.098],[0.013,0.163],[0,0.362],[0,0],[-0.014,0.171],[-0.007,0.013]],"o":[[0.014,-0.007],[0.171,-0.014],[0,0],[0.362,0],[0.163,0.013],[0.098,0.05],[0.007,0.013],[0.014,0.171],[0,0],[0,0.362],[-0.013,0.163],[-0.05,0.098],[-0.014,0.007],[-0.172,0.014],[0,0],[-0.362,0],[-0.164,-0.013],[-0.098,-0.05],[-0.007,-0.014],[-0.014,-0.172],[0,0],[0,-0.362],[0.013,-0.164],[0.05,-0.098]],"v":[[-2.111,-2.339],[-1.886,-2.381],[-1.125,-2.396],[1.125,-2.396],[1.887,-2.381],[2.112,-2.339],[2.339,-2.111],[2.381,-1.886],[2.396,-1.125],[2.396,1.125],[2.381,1.887],[2.339,2.112],[2.112,2.339],[1.887,2.381],[1.125,2.396],[-1.125,2.396],[-1.886,2.381],[-2.111,2.339],[-2.339,2.112],[-2.381,1.887],[-2.396,1.125],[-2.396,-1.125],[-2.381,-1.886],[-2.339,-2.111]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[32.583,25.417],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":9,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.345],[0,0],[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0]],"o":[[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0],[0,0],[0,-0.345],[0,0]],"v":[[-0.417,-1.042],[-1.042,-0.417],[-1.042,0.417],[-0.417,1.042],[0.417,1.042],[1.042,0.417],[1.042,-0.417],[0.417,-1.042]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[32.583,25.417],"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}}]},{"ty":"gr","np":3,"cix":2,"bm":0,"ix":10,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.327,0],[0,0],[-0.239,-0.019],[-0.254,-0.13],[-0.19,-0.373],[-0.021,-0.254],[0,-0.327],[0,0],[0.019,-0.239],[0.129,-0.254],[0.372,-0.19],[0.253,-0.021],[0.327,0],[0,0],[0.238,0.019],[0.253,0.129],[0.189,0.372],[0.021,0.253],[0,0.327],[0,0],[-0.019,0.238],[-0.129,0.253],[-0.373,0.189],[-0.254,0.021]],"o":[[0,0],[0.327,0],[0.253,0.021],[0.372,0.189],[0.129,0.253],[0.019,0.238],[0,0],[0,0.327],[-0.021,0.253],[-0.19,0.372],[-0.254,0.129],[-0.239,0.019],[0,0],[-0.327,0],[-0.254,-0.021],[-0.373,-0.19],[-0.129,-0.254],[-0.019,-0.239],[0,0],[0,-0.327],[0.021,-0.254],[0.189,-0.373],[0.253,-0.13],[0.238,-0.019]],"v":[[-1.152,-3.854],[1.152,-3.854],[2.006,-3.835],[2.774,-3.638],[3.639,-2.773],[3.835,-2.005],[3.854,-1.152],[3.854,1.152],[3.835,2.006],[3.639,2.774],[2.774,3.639],[2.006,3.835],[1.152,3.854],[-1.152,3.854],[-2.005,3.835],[-2.773,3.639],[-3.638,2.774],[-3.835,2.006],[-3.854,1.152],[-3.854,-1.152],[-3.835,-2.005],[-3.638,-2.773],[-2.773,-3.638],[-2.005,-3.835]],"c":true},"ix":2},"hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.171,-0.014],[0.014,-0.007],[0.05,-0.098],[0.013,-0.164],[0,-0.362],[0,0],[-0.014,-0.172],[-0.007,-0.014],[-0.098,-0.05],[-0.164,-0.013],[-0.362,0],[0,0],[-0.172,0.014],[-0.014,0.007],[-0.05,0.098],[-0.013,0.163],[0,0.362],[0,0],[0.014,0.171],[0.007,0.013],[0.098,0.05],[0.163,0.013],[0.362,0],[0,0]],"o":[[-0.164,0.013],[-0.098,0.05],[-0.007,0.013],[-0.014,0.171],[0,0],[0,0.362],[0.013,0.163],[0.05,0.098],[0.014,0.007],[0.171,0.014],[0,0],[0.362,0],[0.163,-0.013],[0.098,-0.05],[0.007,-0.014],[0.014,-0.172],[0,0],[0,-0.362],[-0.013,-0.164],[-0.05,-0.098],[-0.014,-0.007],[-0.172,-0.014],[0,0],[-0.362,0]],"v":[[-1.886,-2.381],[-2.111,-2.339],[-2.339,-2.111],[-2.381,-1.886],[-2.396,-1.125],[-2.396,1.125],[-2.381,1.887],[-2.339,2.112],[-2.111,2.339],[-1.886,2.381],[-1.125,2.396],[1.125,2.396],[1.887,2.381],[2.112,2.339],[2.339,2.112],[2.381,1.887],[2.396,1.125],[2.396,-1.125],[2.381,-1.886],[2.339,-2.111],[2.112,-2.339],[1.887,-2.381],[1.125,-2.396],[-1.125,-2.396]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[23.417,34.583],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":11,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.345],[0,0],[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0]],"o":[[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0],[0,0],[0,-0.345],[0,0]],"v":[[-0.417,-1.042],[-1.042,-0.417],[-1.042,0.417],[-0.417,1.042],[0.417,1.042],[1.042,0.417],[1.042,-0.417],[0.417,-1.042]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[23.417,34.583],"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}}]},{"ty":"gr","np":3,"cix":2,"bm":0,"ix":12,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.327,0],[0,0],[-0.239,-0.019],[-0.254,-0.13],[-0.19,-0.373],[-0.021,-0.254],[0,-0.327],[0,0],[0.019,-0.239],[0.129,-0.254],[0.372,-0.19],[0.253,-0.021],[0.327,0],[0,0],[0.238,0.019],[0.253,0.129],[0.189,0.372],[0.021,0.253],[0,0.327],[0,0],[-0.019,0.238],[-0.129,0.253],[-0.373,0.189],[-0.254,0.021]],"o":[[0,0],[0.327,0],[0.253,0.021],[0.372,0.189],[0.129,0.253],[0.019,0.238],[0,0],[0,0.327],[-0.021,0.253],[-0.19,0.372],[-0.254,0.129],[-0.239,0.019],[0,0],[-0.327,0],[-0.254,-0.021],[-0.373,-0.19],[-0.129,-0.254],[-0.019,-0.239],[0,0],[0,-0.327],[0.021,-0.254],[0.189,-0.373],[0.253,-0.13],[0.238,-0.019]],"v":[[-1.152,-3.854],[1.152,-3.854],[2.006,-3.835],[2.774,-3.638],[3.639,-2.773],[3.835,-2.005],[3.854,-1.152],[3.854,1.152],[3.835,2.006],[3.639,2.774],[2.774,3.639],[2.006,3.835],[1.152,3.854],[-1.152,3.854],[-2.005,3.835],[-2.773,3.639],[-3.638,2.774],[-3.835,2.006],[-3.854,1.152],[-3.854,-1.152],[-3.835,-2.005],[-3.638,-2.773],[-2.773,-3.638],[-2.005,-3.835]],"c":true},"ix":2},"hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.171,-0.014],[0.014,-0.007],[0.05,-0.098],[0.013,-0.164],[0,-0.362],[0,0],[-0.014,-0.172],[-0.007,-0.014],[-0.098,-0.05],[-0.164,-0.013],[-0.362,0],[0,0],[-0.172,0.014],[-0.014,0.007],[-0.05,0.098],[-0.013,0.163],[0,0.362],[0,0],[0.014,0.171],[0.007,0.013],[0.098,0.05],[0.163,0.013],[0.362,0],[0,0]],"o":[[-0.164,0.013],[-0.098,0.05],[-0.007,0.013],[-0.014,0.171],[0,0],[0,0.362],[0.013,0.163],[0.05,0.098],[0.014,0.007],[0.171,0.014],[0,0],[0.362,0],[0.163,-0.013],[0.098,-0.05],[0.007,-0.014],[0.014,-0.172],[0,0],[0,-0.362],[-0.013,-0.164],[-0.05,-0.098],[-0.014,-0.007],[-0.172,-0.014],[0,0],[-0.362,0]],"v":[[-1.886,-2.381],[-2.111,-2.339],[-2.339,-2.111],[-2.381,-1.886],[-2.396,-1.125],[-2.396,1.125],[-2.381,1.887],[-2.339,2.112],[-2.111,2.339],[-1.886,2.381],[-1.125,2.396],[1.125,2.396],[1.887,2.381],[2.112,2.339],[2.339,2.112],[2.381,1.887],[2.396,1.125],[2.396,-1.125],[2.381,-1.886],[2.339,-2.111],[2.112,-2.339],[1.887,-2.381],[1.125,-2.396],[-1.125,-2.396]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[23.417,25.417],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":13,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.345,0],[0,0],[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346]],"o":[[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346],[0,0],[-0.345,0],[0,0]],"v":[[-1.042,-0.417],[-0.417,-1.042],[0.417,-1.042],[1.042,-0.417],[1.042,0.417],[0.417,1.042],[-0.417,1.042],[-1.042,0.417]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[23.417,25.417],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":14,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.209,0],[0,0],[0,-2.209],[0,0],[2.209,0],[0,0],[0,2.209]],"o":[[0,-2.209],[0,0],[2.209,0],[0,0],[0,2.209],[0,0],[-2.209,0],[0,0]],"v":[[-16,-12],[-12,-16],[12,-16],[16,-12],[16,12],[12,16],[-12,16],[-16,12]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[28,30],"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}}]},{"ty":"gr","np":3,"cix":2,"bm":0,"ix":15,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-4.418,0],[0,0],[0,-4.418],[0,0],[4.418,0],[0,0],[0,4.418]],"o":[[0,-4.418],[0,0],[4.418,0],[0,0],[0,4.418],[0,0],[-4.418,0],[0,0]],"v":[[-28,-34.5],[-20,-42.5],[20,-42.5],[28,-34.5],[28,34.5],[20,42.5],[-20,42.5],[-28,34.5]],"c":true},"ix":2},"hd":false},{"ty":"st","c":{"a":0,"k":[0.219607843137,0.337254901961,0.713725490196,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,"hd":false},{"ty":"fl","c":{"a":0,"k":[0.313725490196,0.431372578939,0.803921628466,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[28,42.5],"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}}]},{"ty":"gr","np":0,"cix":2,"bm":0,"ix":16,"hd":false,"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}}]}]},{"ddd":0,"ind":7,"ty":4,"parent":9,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":94,"s":[39.5,82,0],"to":[-14,0,0],"ti":[14,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":121,"s":[-44.5,82,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":270,"s":[-44.5,82,0],"to":[14,0,0],"ti":[-14,0,0]},{"t":300,"s":[39.5,82,0]}],"ix":2},"a":{"a":0,"k":[28,42.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":95,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-9.308,-27.082],[-7.968,122.464],[58.735,127.92],[60.086,-22.975]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":99,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.956,-26.984],[-0.68,122.337],[63.405,126.977],[64.756,-23.919]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":102,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[8.163,-26.576],[9.36,122.47],[70.227,126.105],[71.578,-24.791]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":121,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[74.781,-22.15],[75.319,124.593],[148.663,124.582],[150.014,-26.314]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":273,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[76.471,-21.697],[77.009,125.046],[150.353,125.035],[151.704,-25.861]],"c":true}]},{"t":294,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.754,-25.594],[-2.414,123.953],[64.289,129.408],[65.64,-21.487]],"c":true}]}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"ip":0,"op":1800,"st":0,"bm":0,"shapes":[{"ty":"gr","np":3,"cix":2,"bm":0,"ix":1,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[-78.338,-96.654]],"c":true},"ix":2},"hd":false},{"ty":"st","c":{"a":0,"k":[0.552941176471,0.537254901961,0.501960784314,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.5,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"hd":false},{"ty":"fl","c":{"a":0,"k":[0.846262254902,0.564174816655,0.564174816655,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[23.991,36.474],"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}}]},{"ty":"gr","np":10,"cix":2,"bm":0,"ix":2,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0.552],[-0.552,0],[0,0],[0,-0.552],[0.552,0],[0,0]],"o":[[0,-0.552],[0,0],[0.552,0],[0,0.552],[0,0],[-0.552,0]],"v":[[-15,-6],[-14,-7],[-8,-7],[-7,-6],[-8,-5],[-14,-5]],"c":true},"ix":2},"hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0.552],[-0.552,0],[0,0],[0,-0.552],[0.552,0],[0,0]],"o":[[0,-0.552],[0,0],[0.552,0],[0,0.552],[0,0],[-0.552,0]],"v":[[-4,-6],[-3,-7],[3,-7],[4,-6],[3,-5],[-3,-5]],"c":true},"ix":2},"hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.552],[-0.552,0],[0,0],[0,0.552],[0.552,0]],"o":[[-0.552,0],[0,0.552],[0,0],[0.552,0],[0,-0.552],[0,0]],"v":[[8,-7],[7,-6],[8,-5],[14,-5],[15,-6],[14,-7]],"c":true},"ix":2},"hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0.552],[-0.552,0],[0,0],[0,-0.552],[0.552,0],[0,0]],"o":[[0,-0.552],[0,0],[0.552,0],[0,0.552],[0,0],[-0.552,0]],"v":[[-4,0],[-3,-1],[3,-1],[4,0],[3,1],[-3,1]],"c":true},"ix":2},"hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.552],[-0.552,0],[0,0],[0,0.552],[0.552,0]],"o":[[-0.552,0],[0,0.552],[0,0],[0.552,0],[0,-0.552],[0,0]],"v":[[-14,-1],[-15,0],[-14,1],[-8,1],[-7,0],[-8,-1]],"c":true},"ix":2},"hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[0,0.552],[-0.552,0],[0,0],[0,-0.552],[0.552,0],[0,0]],"o":[[0,-0.552],[0,0],[0.552,0],[0,0.552],[0,0],[-0.552,0]],"v":[[7,0],[8,-1],[14,-1],[15,0],[14,1],[8,1]],"c":true},"ix":2},"hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.552],[-0.552,0],[0,0],[0,0.552],[0.552,0]],"o":[[-0.552,0],[0,0.552],[0,0],[0.552,0],[0,-0.552],[0,0]],"v":[[-3,5],[-4,6],[-3,7],[3,7],[4,6],[3,5]],"c":true},"ix":2},"hd":false},{"ind":7,"ty":"sh","ix":8,"ks":{"a":0,"k":{"i":[[0,0.552],[-0.552,0],[0,0],[0,-0.552],[0.552,0],[0,0]],"o":[[0,-0.552],[0,0],[0.552,0],[0,0.552],[0,0],[-0.552,0]],"v":[[-15,6],[-14,5],[-8,5],[-7,6],[-8,7],[-14,7]],"c":true},"ix":2},"hd":false},{"ind":8,"ty":"sh","ix":9,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.552],[-0.552,0],[0,0],[0,0.552],[0.552,0]],"o":[[-0.552,0],[0,0.552],[0,0],[0.552,0],[0,-0.552],[0,0]],"v":[[8,5],[7,6],[8,7],[14,7],[15,6],[14,5]],"c":true},"ix":2},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.552941176471,0.537254901961,0.501960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[28,60],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":3,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.345,0],[0,0],[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346]],"o":[[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346],[0,0],[-0.345,0],[0,0]],"v":[[-1.042,-0.417],[-0.417,-1.042],[0.417,-1.042],[1.042,-0.417],[1.042,0.417],[0.417,1.042],[-0.417,1.042],[-1.042,0.417]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[30.292,36.875],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":4,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.345],[0,0],[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0]],"o":[[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0],[0,0],[0,-0.345],[0,0]],"v":[[-0.417,-1.042],[-1.042,-0.417],[-1.042,0.417],[-0.417,1.042],[0.417,1.042],[1.042,0.417],[1.042,-0.417],[0.417,-1.042]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[34.875,32.292],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":5,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.345,0],[0,0],[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346]],"o":[[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346],[0,0],[-0.345,0],[0,0]],"v":[[-1.042,-0.417],[-0.417,-1.042],[0.417,-1.042],[1.042,-0.417],[1.042,0.417],[0.417,1.042],[-0.417,1.042],[-1.042,0.417]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[34.875,36.875],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":6,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.345,0],[0,0],[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346]],"o":[[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346],[0,0],[-0.345,0],[0,0]],"v":[[-1.042,-0.417],[-0.417,-1.042],[0.417,-1.042],[1.042,-0.417],[1.042,0.417],[0.417,1.042],[-0.417,1.042],[-1.042,0.417]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[32.583,34.583],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":7,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.345],[0,0],[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0]],"o":[[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0],[0,0],[0,-0.345],[0,0]],"v":[[-0.417,-1.042],[-1.042,-0.417],[-1.042,0.417],[-0.417,1.042],[0.417,1.042],[1.042,0.417],[1.042,-0.417],[0.417,-1.042]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[30.292,32.292],"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}}]},{"ty":"gr","np":3,"cix":2,"bm":0,"ix":8,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.238,-0.019],[0.253,-0.13],[0.189,-0.373],[0.021,-0.254],[0,-0.327],[0,0],[-0.019,-0.239],[-0.129,-0.254],[-0.373,-0.19],[-0.254,-0.021],[-0.327,0],[0,0],[-0.239,0.019],[-0.254,0.129],[-0.19,0.372],[-0.021,0.253],[0,0.327],[0,0],[0.019,0.238],[0.129,0.253],[0.372,0.189],[0.253,0.021],[0.327,0]],"o":[[-0.327,0],[-0.254,0.021],[-0.373,0.189],[-0.129,0.253],[-0.019,0.238],[0,0],[0,0.327],[0.021,0.253],[0.189,0.372],[0.253,0.129],[0.238,0.019],[0,0],[0.327,0],[0.253,-0.021],[0.372,-0.19],[0.129,-0.254],[0.019,-0.239],[0,0],[0,-0.327],[-0.021,-0.254],[-0.19,-0.373],[-0.254,-0.13],[-0.239,-0.019],[0,0]],"v":[[-1.152,-3.854],[-2.005,-3.835],[-2.773,-3.638],[-3.638,-2.773],[-3.835,-2.005],[-3.854,-1.152],[-3.854,1.152],[-3.835,2.006],[-3.638,2.774],[-2.773,3.639],[-2.005,3.835],[-1.152,3.854],[1.152,3.854],[2.006,3.835],[2.774,3.639],[3.639,2.774],[3.835,2.006],[3.854,1.152],[3.854,-1.152],[3.835,-2.005],[3.639,-2.773],[2.774,-3.638],[2.006,-3.835],[1.152,-3.854]],"c":true},"ix":2},"hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-0.098,0.05],[-0.164,0.013],[-0.362,0],[0,0],[-0.172,-0.014],[-0.014,-0.007],[-0.05,-0.098],[-0.013,-0.164],[0,-0.362],[0,0],[0.014,-0.172],[0.007,-0.014],[0.098,-0.05],[0.163,-0.013],[0.362,0],[0,0],[0.171,0.014],[0.014,0.007],[0.05,0.098],[0.013,0.163],[0,0.362],[0,0],[-0.014,0.171],[-0.007,0.013]],"o":[[0.014,-0.007],[0.171,-0.014],[0,0],[0.362,0],[0.163,0.013],[0.098,0.05],[0.007,0.013],[0.014,0.171],[0,0],[0,0.362],[-0.013,0.163],[-0.05,0.098],[-0.014,0.007],[-0.172,0.014],[0,0],[-0.362,0],[-0.164,-0.013],[-0.098,-0.05],[-0.007,-0.014],[-0.014,-0.172],[0,0],[0,-0.362],[0.013,-0.164],[0.05,-0.098]],"v":[[-2.111,-2.339],[-1.886,-2.381],[-1.125,-2.396],[1.125,-2.396],[1.887,-2.381],[2.112,-2.339],[2.339,-2.111],[2.381,-1.886],[2.396,-1.125],[2.396,1.125],[2.381,1.887],[2.339,2.112],[2.112,2.339],[1.887,2.381],[1.125,2.396],[-1.125,2.396],[-1.886,2.381],[-2.111,2.339],[-2.339,2.112],[-2.381,1.887],[-2.396,1.125],[-2.396,-1.125],[-2.381,-1.886],[-2.339,-2.111]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[32.583,25.417],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":9,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.345],[0,0],[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0]],"o":[[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0],[0,0],[0,-0.345],[0,0]],"v":[[-0.417,-1.042],[-1.042,-0.417],[-1.042,0.417],[-0.417,1.042],[0.417,1.042],[1.042,0.417],[1.042,-0.417],[0.417,-1.042]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[32.583,25.417],"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}}]},{"ty":"gr","np":3,"cix":2,"bm":0,"ix":10,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.327,0],[0,0],[-0.239,-0.019],[-0.254,-0.13],[-0.19,-0.373],[-0.021,-0.254],[0,-0.327],[0,0],[0.019,-0.239],[0.129,-0.254],[0.372,-0.19],[0.253,-0.021],[0.327,0],[0,0],[0.238,0.019],[0.253,0.129],[0.189,0.372],[0.021,0.253],[0,0.327],[0,0],[-0.019,0.238],[-0.129,0.253],[-0.373,0.189],[-0.254,0.021]],"o":[[0,0],[0.327,0],[0.253,0.021],[0.372,0.189],[0.129,0.253],[0.019,0.238],[0,0],[0,0.327],[-0.021,0.253],[-0.19,0.372],[-0.254,0.129],[-0.239,0.019],[0,0],[-0.327,0],[-0.254,-0.021],[-0.373,-0.19],[-0.129,-0.254],[-0.019,-0.239],[0,0],[0,-0.327],[0.021,-0.254],[0.189,-0.373],[0.253,-0.13],[0.238,-0.019]],"v":[[-1.152,-3.854],[1.152,-3.854],[2.006,-3.835],[2.774,-3.638],[3.639,-2.773],[3.835,-2.005],[3.854,-1.152],[3.854,1.152],[3.835,2.006],[3.639,2.774],[2.774,3.639],[2.006,3.835],[1.152,3.854],[-1.152,3.854],[-2.005,3.835],[-2.773,3.639],[-3.638,2.774],[-3.835,2.006],[-3.854,1.152],[-3.854,-1.152],[-3.835,-2.005],[-3.638,-2.773],[-2.773,-3.638],[-2.005,-3.835]],"c":true},"ix":2},"hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.171,-0.014],[0.014,-0.007],[0.05,-0.098],[0.013,-0.164],[0,-0.362],[0,0],[-0.014,-0.172],[-0.007,-0.014],[-0.098,-0.05],[-0.164,-0.013],[-0.362,0],[0,0],[-0.172,0.014],[-0.014,0.007],[-0.05,0.098],[-0.013,0.163],[0,0.362],[0,0],[0.014,0.171],[0.007,0.013],[0.098,0.05],[0.163,0.013],[0.362,0],[0,0]],"o":[[-0.164,0.013],[-0.098,0.05],[-0.007,0.013],[-0.014,0.171],[0,0],[0,0.362],[0.013,0.163],[0.05,0.098],[0.014,0.007],[0.171,0.014],[0,0],[0.362,0],[0.163,-0.013],[0.098,-0.05],[0.007,-0.014],[0.014,-0.172],[0,0],[0,-0.362],[-0.013,-0.164],[-0.05,-0.098],[-0.014,-0.007],[-0.172,-0.014],[0,0],[-0.362,0]],"v":[[-1.886,-2.381],[-2.111,-2.339],[-2.339,-2.111],[-2.381,-1.886],[-2.396,-1.125],[-2.396,1.125],[-2.381,1.887],[-2.339,2.112],[-2.111,2.339],[-1.886,2.381],[-1.125,2.396],[1.125,2.396],[1.887,2.381],[2.112,2.339],[2.339,2.112],[2.381,1.887],[2.396,1.125],[2.396,-1.125],[2.381,-1.886],[2.339,-2.111],[2.112,-2.339],[1.887,-2.381],[1.125,-2.396],[-1.125,-2.396]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[23.417,34.583],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":11,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.345],[0,0],[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0]],"o":[[-0.345,0],[0,0],[0,0.346],[0,0],[0.346,0],[0,0],[0,-0.345],[0,0]],"v":[[-0.417,-1.042],[-1.042,-0.417],[-1.042,0.417],[-0.417,1.042],[0.417,1.042],[1.042,0.417],[1.042,-0.417],[0.417,-1.042]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[23.417,34.583],"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}}]},{"ty":"gr","np":3,"cix":2,"bm":0,"ix":12,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.327,0],[0,0],[-0.239,-0.019],[-0.254,-0.13],[-0.19,-0.373],[-0.021,-0.254],[0,-0.327],[0,0],[0.019,-0.239],[0.129,-0.254],[0.372,-0.19],[0.253,-0.021],[0.327,0],[0,0],[0.238,0.019],[0.253,0.129],[0.189,0.372],[0.021,0.253],[0,0.327],[0,0],[-0.019,0.238],[-0.129,0.253],[-0.373,0.189],[-0.254,0.021]],"o":[[0,0],[0.327,0],[0.253,0.021],[0.372,0.189],[0.129,0.253],[0.019,0.238],[0,0],[0,0.327],[-0.021,0.253],[-0.19,0.372],[-0.254,0.129],[-0.239,0.019],[0,0],[-0.327,0],[-0.254,-0.021],[-0.373,-0.19],[-0.129,-0.254],[-0.019,-0.239],[0,0],[0,-0.327],[0.021,-0.254],[0.189,-0.373],[0.253,-0.13],[0.238,-0.019]],"v":[[-1.152,-3.854],[1.152,-3.854],[2.006,-3.835],[2.774,-3.638],[3.639,-2.773],[3.835,-2.005],[3.854,-1.152],[3.854,1.152],[3.835,2.006],[3.639,2.774],[2.774,3.639],[2.006,3.835],[1.152,3.854],[-1.152,3.854],[-2.005,3.835],[-2.773,3.639],[-3.638,2.774],[-3.835,2.006],[-3.854,1.152],[-3.854,-1.152],[-3.835,-2.005],[-3.638,-2.773],[-2.773,-3.638],[-2.005,-3.835]],"c":true},"ix":2},"hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.171,-0.014],[0.014,-0.007],[0.05,-0.098],[0.013,-0.164],[0,-0.362],[0,0],[-0.014,-0.172],[-0.007,-0.014],[-0.098,-0.05],[-0.164,-0.013],[-0.362,0],[0,0],[-0.172,0.014],[-0.014,0.007],[-0.05,0.098],[-0.013,0.163],[0,0.362],[0,0],[0.014,0.171],[0.007,0.013],[0.098,0.05],[0.163,0.013],[0.362,0],[0,0]],"o":[[-0.164,0.013],[-0.098,0.05],[-0.007,0.013],[-0.014,0.171],[0,0],[0,0.362],[0.013,0.163],[0.05,0.098],[0.014,0.007],[0.171,0.014],[0,0],[0.362,0],[0.163,-0.013],[0.098,-0.05],[0.007,-0.014],[0.014,-0.172],[0,0],[0,-0.362],[-0.013,-0.164],[-0.05,-0.098],[-0.014,-0.007],[-0.172,-0.014],[0,0],[-0.362,0]],"v":[[-1.886,-2.381],[-2.111,-2.339],[-2.339,-2.111],[-2.381,-1.886],[-2.396,-1.125],[-2.396,1.125],[-2.381,1.887],[-2.339,2.112],[-2.111,2.339],[-1.886,2.381],[-1.125,2.396],[1.125,2.396],[1.887,2.381],[2.112,2.339],[2.339,2.112],[2.381,1.887],[2.396,1.125],[2.396,-1.125],[2.381,-1.886],[2.339,-2.111],[2.112,-2.339],[1.887,-2.381],[1.125,-2.396],[-1.125,-2.396]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[23.417,25.417],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":13,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.345,0],[0,0],[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346]],"o":[[0,-0.345],[0,0],[0.346,0],[0,0],[0,0.346],[0,0],[-0.345,0],[0,0]],"v":[[-1.042,-0.417],[-0.417,-1.042],[0.417,-1.042],[1.042,-0.417],[1.042,0.417],[0.417,1.042],[-0.417,1.042],[-1.042,0.417]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[23.417,25.417],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":14,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.209,0],[0,0],[0,-2.209],[0,0],[2.209,0],[0,0],[0,2.209]],"o":[[0,-2.209],[0,0],[2.209,0],[0,0],[0,2.209],[0,0],[-2.209,0],[0,0]],"v":[[-16,-12],[-12,-16],[12,-16],[16,-12],[16,12],[12,16],[-12,16],[-16,12]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[28,30],"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}}]},{"ty":"gr","np":3,"cix":2,"bm":0,"ix":15,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-4.418,0],[0,0],[0,-4.418],[0,0],[4.418,0],[0,0],[0,4.418]],"o":[[0,-4.418],[0,0],[4.418,0],[0,0],[0,4.418],[0,0],[-4.418,0],[0,0]],"v":[[-28,-34.5],[-20,-42.5],[20,-42.5],[28,-34.5],[28,34.5],[20,42.5],[-20,42.5],[-28,34.5]],"c":true},"ix":2},"hd":false},{"ty":"st","c":{"a":0,"k":[0.552941176471,0.537254901961,0.501960784314,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.5,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568687289,0.917647118662,0.909803981407,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[28,42.5],"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}}]}]},{"ddd":0,"ind":8,"ty":4,"parent":9,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,82,0],"ix":2},"a":{"a":0,"k":[44,82,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":1800,"st":0,"bm":0,"shapes":[{"ty":"gr","np":3,"cix":2,"bm":0,"ix":1,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-8.837],[0,0],[-8.837,0],[0,0],[0,8.837],[0,0],[8.837,0]],"o":[[-8.837,0],[0,0],[0,8.837],[0,0],[8.837,0],[0,0],[0,-8.837],[0,0]],"v":[[-26,-82],[-42,-66],[-42,66],[-26,82],[26,82],[42,66],[42,-66],[26,-82]],"c":true},"ix":2},"hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-6.627,0],[0,0],[0,-6.627],[0,0],[6.627,0],[0,0],[0,6.627]],"o":[[0,-6.627],[0,0],[6.627,0],[0,0],[0,6.627],[0,0],[-6.627,0],[0,0]],"v":[[-38,-66],[-26,-78],[26,-78],[38,-66],[38,66],[26,78],[-26,78],[-38,66]],"c":true},"ix":2},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.305882352941,0.337254901961,0.415686304429,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[42,82],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":2,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-1.657],[-1.657,0],[0,0],[0,1.657],[1.657,0]],"o":[[-1.657,0],[0,1.657],[0,0],[1.657,0],[0,-1.657],[0,0]],"v":[[-9,-3],[-12,0],[-9,3],[9,3],[12,0],[9,-3]],"c":true},"ix":2},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.305882352941,0.337254901961,0.415686304429,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[42,13],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":3,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-8.837,0],[0,0],[0,-8.837],[0,0],[8.837,0],[0,0],[0,8.837]],"o":[[0,-8.837],[0,0],[8.837,0],[0,0],[0,8.837],[0,0],[-8.837,0],[0,0]],"v":[[-42,-66],[-26,-82],[26,-82],[42,-66],[42,66],[26,82],[-26,82],[-42,66]],"c":true},"ix":2},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.941176530427,0.941176530427,0.941176530427,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[42,82],"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}}]},{"ty":"gr","np":2,"cix":2,"bm":0,"ix":4,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-8.837,0],[0,0],[0,-8.837],[0,0],[8.837,0],[0,0],[0,8.837]],"o":[[0,-8.837],[0,0],[8.837,0],[0,0],[0,8.837],[0,0],[-8.837,0],[0,0]],"v":[[-42,-66],[-26,-82],[26,-82],[42,-66],[42,66],[26,82],[-26,82],[-42,66]],"c":true},"ix":2},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980451995,0.850980451995,0.850980451995,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[46,82],"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}}]}]},{"ddd":0,"ind":9,"ty":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.001],"y":[0]},"t":0,"s":[70]},{"t":40,"s":[75]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.001,"y":0},"t":0,"s":[-97,74,0],"to":[26.333,2.667,0],"ti":[-26.333,-2.667,0]},{"t":40,"s":[61,90,0]}],"ix":2},"a":{"a":0,"k":[42,82,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":1800,"st":0,"bm":0,"shapes":[{"ty":"gr","np":2,"cix":2,"bm":0,"ix":1,"hd":false,"it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-8.837,0],[0,0],[0,-8.837],[0,0],[8.837,0],[0,0],[0,8.837]],"o":[[0,-8.837],[0,0],[8.837,0],[0,0],[0,8.837],[0,0],[-8.837,0],[0,0]],"v":[[-42,-66],[-26,-82],[26,-82],[42,-66],[42,66],[26,82],[-26,82],[-42,66]],"c":true},"ix":2},"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,"hd":false},{"ty":"tr","p":{"a":0,"k":[42,82],"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}}]}]}],"markers":[]} \ No newline at end of file diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController+CVComponentDelegate.swift b/Signal/src/ViewControllers/ConversationView/ConversationViewController+CVComponentDelegate.swift index cd557da590..b84a8a4bf7 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController+CVComponentDelegate.swift +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController+CVComponentDelegate.swift @@ -488,7 +488,7 @@ extension ConversationViewController: CVComponentDelegate { } } - FingerprintViewController.present(from: self, address: address) + FingerprintViewController.present(for: address.aci, from: self) } public func didTapUnverifiedIdentityChange(_ address: SignalServiceAddress) { diff --git a/Signal/src/ViewControllers/ThreadSettings/ConversationSettingsViewController.swift b/Signal/src/ViewControllers/ThreadSettings/ConversationSettingsViewController.swift index 5f34884a17..3a139d1843 100644 --- a/Signal/src/ViewControllers/ThreadSettings/ConversationSettingsViewController.swift +++ b/Signal/src/ViewControllers/ThreadSettings/ConversationSettingsViewController.swift @@ -405,8 +405,7 @@ class ConversationSettingsViewController: OWSTableViewController2, BadgeCollecti return } let contactAddress = contactThread.contactAddress - assert(contactAddress.isValid) - FingerprintViewController.present(from: self, address: contactAddress) + FingerprintViewController.present(for: contactAddress.aci, from: self) } func showColorAndWallpaperSettingsView() { diff --git a/Signal/src/ViewControllers/ThreadSettings/MemberActionSheet.swift b/Signal/src/ViewControllers/ThreadSettings/MemberActionSheet.swift index d35896b456..d3f0333763 100644 --- a/Signal/src/ViewControllers/ThreadSettings/MemberActionSheet.swift +++ b/Signal/src/ViewControllers/ThreadSettings/MemberActionSheet.swift @@ -241,7 +241,7 @@ class MemberActionSheet: OWSTableSheetViewController { actionBlock: { [weak self] in guard let self = self, let fromViewController = self.fromViewController else { return } self.dismiss(animated: true) { - FingerprintViewController.present(from: fromViewController, address: self.address) + FingerprintViewController.present(for: self.address.aci, from: fromViewController) } } )) diff --git a/Signal/translations/en.lproj/Localizable.strings b/Signal/translations/en.lproj/Localizable.strings index 0df0be7f90..46ca89d6dd 100644 --- a/Signal/translations/en.lproj/Localizable.strings +++ b/Signal/translations/en.lproj/Localizable.strings @@ -850,12 +850,6 @@ /* VoiceOver description of current camera zoom level. */ "CAMERA_VO_ZOOM_LEVEL" = "%@times"; -/* Message for alert explaining that a user cannot be verified. */ -"CANT_VERIFY_IDENTITY_ALERT_MESSAGE" = "This user can't be verified until you've exchanged messages with them."; - -/* Title for alert explaining that a user cannot be verified. */ -"CANT_VERIFY_IDENTITY_ALERT_TITLE" = "Error"; - /* Alert shown when the user needs to exchange messages to see the safety number. */ "CANT_VERIFY_IDENTITY_EXCHANGE_MESSAGES" = "A safety number will be created with this person after you exchange messages with them."; @@ -5572,21 +5566,6 @@ /* Snippet to share {{safety number}} with a friend. sent e.g. via SMS */ "SAFETY_NUMBER_SHARE_FORMAT" = "Our Signal Safety Number:\n%@"; -/* Header informing the user about the transition from phone number to user identifier based. */ -"SAFETY_NUMBER_TRANSITION_HEADER_ALERT" = "Safety numbers are being updated."; - -/* Button text for a sheet informing the user about the transition from phone number to user identifier based. */ -"SAFETY_NUMBER_TRANSITION_SHEET_HELP_TEXT" = "Need help?"; - -/* Informs the user about the transition from phone number to user identifier based. */ -"SAFETY_NUMBER_TRANSITION_SHEET_PARAGRAPH_1" = "Safety numbers are being updated over a transition period to enable upcoming privacy features in Signal."; - -/* Informs the user about the transition from phone number to user identifier based. */ -"SAFETY_NUMBER_TRANSITION_SHEET_PARAGRAPH_2" = "To verify safety numbers, match the color card with your contact’s device. If these don’t match, swipe and try the other pair of safety numbers. Only one pair needs to match."; - -/* Title for a sheet informing the user about the transition from phone number to user identifier based. */ -"SAFETY_NUMBER_TRANSITION_SHEET_TITLE" = "Changes to Safety Numbers"; - /* Action sheet heading */ "SAFETY_NUMBERS_ACTIONSHEET_TITLE" = "Your safety number with %@ has changed. You may wish to verify it."; @@ -7589,7 +7568,7 @@ "VERIFY_PRIVACY_MULTIPLE" = "Review Safety Numbers"; /* Instructions for verifying your safety number. Embeds {{contact's name}} */ -"VERIFY_SAFETY_NUMBER_INSTRUCTIONS" = "To verify end-to-end encryption with %@, match the color card above with their device and compare the numbers. If these don’t match, swipe and try the other pair of safety numbers. Only one pair needs to match."; +"VERIFY_SAFETY_NUMBER_INSTRUCTIONS" = "To verify end-to-end encryption with %1$@, compare the numbers above with their device. You can also scan the code on their device."; /* Toast alert text shown when tapping on a video that cannot be played. */ "VIDEO_BROKEN" = "This video can’t be played"; diff --git a/SignalServiceKit/src/Security/OWSFingerprint.swift b/SignalServiceKit/src/Security/OWSFingerprint.swift index a93fe88eab..b07e9d110f 100644 --- a/SignalServiceKit/src/Security/OWSFingerprint.swift +++ b/SignalServiceKit/src/Security/OWSFingerprint.swift @@ -7,20 +7,17 @@ import CommonCrypto import LibSignalClient public class OWSFingerprint { + public let myAci: Aci + public let theirAci: Aci - public enum Source { - case aci(myAci: Aci, theirAci: Aci) - case e164(myE164: E164, theirE164: E164) - } - - public let source: Source public let myAciIdentityKey: Data public let theirAciIdentityKey: Data - private let hashIterations: UInt32 private let myFingerprintData: Data private let theirFingerprintData: Data - private let theirName: String + + private let hashIterations: UInt32 + public let theirName: String /** * Formats numeric fingerprint, 3 lines in groups of 5 digits. @@ -34,13 +31,15 @@ public class OWSFingerprint { } public init( - source: Source, + myAci: Aci, + theirAci: Aci, myAciIdentityKey: Data, theirAciIdentityKey: Data, theirName: String, hashIterations: UInt32 = Constants.defaultHashIterations ) { - self.source = source + self.myAci = myAci + self.theirAci = theirAci let myAciIdentityKey = myAciIdentityKey.prependKeyType() self.myAciIdentityKey = myAciIdentityKey let theirAciIdentityKey = theirAciIdentityKey.prependKeyType() @@ -48,7 +47,7 @@ public class OWSFingerprint { self.hashIterations = hashIterations self.theirName = theirName - let (myStableSourceData, theirStableSourceData) = Self.stableData(for: source) + let (myStableSourceData, theirStableSourceData) = Self.stableData(myAci: myAci, theirAci: theirAci) self.myFingerprintData = Self.dataForStableAddress( myStableSourceData, publicKey: myAciIdentityKey, @@ -208,19 +207,8 @@ public class OWSFingerprint { // MARK: - Private helpers - private static func stableData(for source: Source) -> (my: Data, their: Data) { - switch source { - case let .aci(myAci, theirAci): - return (my: myAci.rawUUID.data, their: theirAci.rawUUID.data) - case let .e164(myE164, theirE164): - guard - let myData = myE164.stringValue.data(using: .utf8), - let theirData = theirE164.stringValue.data(using: .utf8) - else { - owsFail("Unable to serialize e164") - } - return (my: myData, their: theirData) - } + private static func stableData(myAci: Aci, theirAci: Aci) -> (my: Data, their: Data) { + return (my: myAci.rawUUID.data, their: theirAci.rawUUID.data) } /** @@ -296,17 +284,11 @@ public class OWSFingerprint { } private var scannableFingerprintVersion: UInt32 { - switch source { - case .e164: - return Constants.e164ScannableFormatVersion - case .aci: - return Constants.aciScannableFormatVersion - } + return Constants.aciScannableFormatVersion } public enum Constants { static let hashingVersion: UInt32 = 0 - static let e164ScannableFormatVersion: UInt32 = 1 static let aciScannableFormatVersion: UInt32 = 2 public static let defaultHashIterations: UInt32 = 5200 } diff --git a/SignalServiceKit/src/Security/OWSFingerprintBuilder.swift b/SignalServiceKit/src/Security/OWSFingerprintBuilder.swift index 50036794eb..084d8f4ee5 100644 --- a/SignalServiceKit/src/Security/OWSFingerprintBuilder.swift +++ b/SignalServiceKit/src/Security/OWSFingerprintBuilder.swift @@ -8,8 +8,8 @@ import LibSignalClient public class OWSFingerprintBuilder { public struct FingerprintResult { public let theirAci: Aci - public let fingerprints: [OWSFingerprint] - public let initialDisplayIndex: Int + public let theirRecipientIdentity: OWSRecipientIdentity + public let fingerprint: OWSFingerprint } private let contactsManager: ContactsManagerProtocol @@ -30,13 +30,12 @@ public class OWSFingerprintBuilder { /// identity key. You can use these to present a new identity key for /// verification. public func fingerprints( - theirAddress: SignalServiceAddress, + theirAci: Aci, theirRecipientIdentity: OWSRecipientIdentity, tx: SDSAnyReadTransaction ) -> FingerprintResult? { guard let localIdentifiers = tsAccountManager.localIdentifiers(tx: tx.asV2Read), - let myE164 = E164(localIdentifiers.phoneNumber), let myAciIdentityKey = identityManager.identityKeyPair(for: .aci, tx: tx.asV2Read)?.publicKey else { owsFailDebug("Missing local properties!") @@ -44,54 +43,21 @@ public class OWSFingerprintBuilder { } let myAci = localIdentifiers.aci - guard let theirAci = theirAddress.aci else { - Logger.warn("Missing their ACI!") - return nil - } let theirAciIdentityKey = theirRecipientIdentity.identityKey - let theirE164 = theirAddress.e164 - let theirName = contactsManager.displayName( - for: SignalServiceAddress(serviceId: theirAci, e164: theirE164), - transaction: tx - ) + let theirName = contactsManager.displayName(for: SignalServiceAddress(theirAci), transaction: tx) let aciFingerprint = OWSFingerprint( - source: .aci(myAci: myAci, theirAci: theirAci), + myAci: myAci, + theirAci: theirAci, myAciIdentityKey: myAciIdentityKey, theirAciIdentityKey: theirAciIdentityKey, theirName: theirName ) - let e164Fingerprint: OWSFingerprint? = theirE164.map { theirE164 in - return OWSFingerprint( - source: .e164(myE164: myE164, theirE164: theirE164), - myAciIdentityKey: myAciIdentityKey, - theirAciIdentityKey: theirAciIdentityKey, - theirName: theirName - ) - } - - if FeatureFlags.onlyAciSafetyNumbers { - return FingerprintResult( - theirAci: theirAci, - fingerprints: [aciFingerprint], - initialDisplayIndex: 0 - ) - } else if let e164Fingerprint { - // We have both, but prefer the ACI. - return FingerprintResult( - theirAci: theirAci, - fingerprints: [aciFingerprint, e164Fingerprint], - initialDisplayIndex: 0 - ) - } else { - // If we default to ACI safety number and don't have the e164, - // that's fine. Just show the ACI one. - return FingerprintResult( - theirAci: theirAci, - fingerprints: [aciFingerprint], - initialDisplayIndex: 0 - ) - } + return FingerprintResult( + theirAci: theirAci, + theirRecipientIdentity: theirRecipientIdentity, + fingerprint: aciFingerprint + ) } } diff --git a/SignalServiceKit/src/Util/FeatureFlags.swift b/SignalServiceKit/src/Util/FeatureFlags.swift index 491f557d6a..233e27d781 100644 --- a/SignalServiceKit/src/Util/FeatureFlags.swift +++ b/SignalServiceKit/src/Util/FeatureFlags.swift @@ -114,10 +114,6 @@ public class FeatureFlags: BaseFlags { } } - /// If true, _only_ aci safety numbers will be displayed, and e164 safety numbers will not - /// be displayed. - public static let onlyAciSafetyNumbers = false - public static let editMessageSend = true public static let doNotSendGroupChangeMessagesOnProfileKeyRotation = false diff --git a/SignalServiceKit/src/Util/RemoteConfigManager.swift b/SignalServiceKit/src/Util/RemoteConfigManager.swift index 597c133f33..1412c060fe 100644 --- a/SignalServiceKit/src/Util/RemoteConfigManager.swift +++ b/SignalServiceKit/src/Util/RemoteConfigManager.swift @@ -221,10 +221,6 @@ public class RemoteConfig: BaseFlags { return isEnabled(.enableAutoAPNSRotation, defaultValue: false) } - public static var defaultToAciSafetyNumber: Bool { - return isEnabled(.safetyNumberAci) - } - /// The minimum length for a valid nickname, in Unicode codepoints. public static var minNicknameLength: UInt32 { getUInt32Value(forFlag: .minNicknameLength, defaultValue: 3) @@ -582,9 +578,16 @@ private struct Flags { // Even if we don't fetch a fresh remote config, we may cross the time threshold // while the app is in memory, updating the value from false to true. // As such we also take fresh remote config values and swap them in at runtime. +#if false + // If there are time-gated flags, use this definition. enum SupportedTimeGatedFlags: String, FlagType { - case safetyNumberAci } +#else + // If there aren't any time-gated flags, use this definition. + enum SupportedTimeGatedFlags: FlagType { + var rawValue: String { fatalError() } + } +#endif } // MARK: - @@ -610,7 +613,6 @@ private extension FlagType { case "maxGroupCallRingSize": return "global.calling.maxGroupCallRingSize" case "minNicknameLength": return "global.nicknames.min" case "maxNicknameLength": return "global.nicknames.max" - case "safetyNumberAci": return "global.safetyNumberAci" case "cdsDisableCompatibilityMode": return "cds.disableCompatibilityMode" case "maxAttachmentDownloadSizeBytes": return "global.attachments.maxBytes" default: return Flags.prefix + rawValue diff --git a/SignalServiceKit/tests/Security/OWSFingerprintTest.swift b/SignalServiceKit/tests/Security/OWSFingerprintTest.swift index cf6ddee153..83e01ae23c 100644 --- a/SignalServiceKit/tests/Security/OWSFingerprintTest.swift +++ b/SignalServiceKit/tests/Security/OWSFingerprintTest.swift @@ -10,14 +10,15 @@ import XCTest final class OWSFingerprintTest: XCTestCase { func testDisplayableTextInsertsSpaces() { - let aliceE164 = E164("+19995550101")! - let bobE164 = E164("+18885550102")! + let aliceAci = Aci.constantForTesting("00000000-0000-4000-8000-0000000000a1") + let bobAci = Aci.constantForTesting("00000000-0000-4000-8000-0000000000b1") let aliceIdentityKey = ECKeyPair.generateKeyPair().publicKey let bobIdentityKey = ECKeyPair.generateKeyPair().publicKey let aliceToBobFingerprint = OWSFingerprint( - source: .e164(myE164: aliceE164, theirE164: bobE164), + myAci: aliceAci, + theirAci: bobAci, myAciIdentityKey: aliceIdentityKey, theirAciIdentityKey: bobIdentityKey, theirName: "Bob", @@ -41,70 +42,46 @@ final class OWSFingerprintTest: XCTestCase { } func testTextMatchesReciprocally() { - let sourceSets: [( - aliceToBob: OWSFingerprint.Source, - bobToAlice: OWSFingerprint.Source, - charlieToAlice: OWSFingerprint.Source - )] = [ - { - let aliceE164 = E164("+19995550101")! - let bobE164 = E164("+18885550102")! - let charlieE164 = E164("+17775550103")! - - return ( - .e164(myE164: aliceE164, theirE164: bobE164), - .e164(myE164: bobE164, theirE164: aliceE164), - .e164(myE164: charlieE164, theirE164: aliceE164) - ) - }(), - { - let aliceAci = Aci.randomForTesting() - let bobAci = Aci.randomForTesting() - let charlieAci = Aci.randomForTesting() - - return ( - .aci(myAci: aliceAci, theirAci: bobAci), - .aci(myAci: bobAci, theirAci: aliceAci), - .aci(myAci: charlieAci, theirAci: aliceAci) - ) - }() - ] + let aliceAci = Aci.randomForTesting() + let bobAci = Aci.randomForTesting() + let charlieAci = Aci.randomForTesting() let aliceIdentityKey = ECKeyPair.generateKeyPair().publicKey let bobIdentityKey = ECKeyPair.generateKeyPair().publicKey let charlieIdentityKey = ECKeyPair.generateKeyPair().publicKey - for (aliceToBob, bobToAlice, charlieToAlice) in sourceSets { - let aliceToBobFingerprint = OWSFingerprint( - source: aliceToBob, - myAciIdentityKey: aliceIdentityKey, - theirAciIdentityKey: bobIdentityKey, - theirName: "Bob", - hashIterations: 2 - ) - let bobToAliceFingerprint = OWSFingerprint( - source: bobToAlice, - myAciIdentityKey: bobIdentityKey, - theirAciIdentityKey: aliceIdentityKey, - theirName: "Alice", - hashIterations: 2 - ) - XCTAssertEqual( - aliceToBobFingerprint.displayableText, - bobToAliceFingerprint.displayableText - ) + let aliceToBobFingerprint = OWSFingerprint( + myAci: aliceAci, + theirAci: bobAci, + myAciIdentityKey: aliceIdentityKey, + theirAciIdentityKey: bobIdentityKey, + theirName: "Bob", + hashIterations: 2 + ) + let bobToAliceFingerprint = OWSFingerprint( + myAci: bobAci, + theirAci: aliceAci, + myAciIdentityKey: bobIdentityKey, + theirAciIdentityKey: aliceIdentityKey, + theirName: "Alice", + hashIterations: 2 + ) + XCTAssertEqual( + aliceToBobFingerprint.displayableText, + bobToAliceFingerprint.displayableText + ) - let charlieToAliceFingerprint = OWSFingerprint( - source: charlieToAlice, - myAciIdentityKey: charlieIdentityKey, - theirAciIdentityKey: aliceIdentityKey, - theirName: "Alice", - hashIterations: 2 - ) - XCTAssertNotEqual( - aliceToBobFingerprint.displayableText, - charlieToAliceFingerprint.displayableText - ) - } + let charlieToAliceFingerprint = OWSFingerprint( + myAci: charlieAci, + theirAci: aliceAci, + myAciIdentityKey: charlieIdentityKey, + theirAciIdentityKey: aliceIdentityKey, + theirName: "Alice", + hashIterations: 2 + ) + XCTAssertNotEqual( + aliceToBobFingerprint.displayableText, + charlieToAliceFingerprint.displayableText + ) } } diff --git a/SignalUI/ViewControllers/Safety Numbers/FingerprintScanViewController.swift b/SignalUI/ViewControllers/Safety Numbers/FingerprintScanViewController.swift index afb13e8cd5..ba4fb52e43 100644 --- a/SignalUI/ViewControllers/Safety Numbers/FingerprintScanViewController.swift +++ b/SignalUI/ViewControllers/Safety Numbers/FingerprintScanViewController.swift @@ -14,20 +14,20 @@ class FingerprintScanViewController: OWSViewController, OWSNavigationChildContro private let recipientIdentity: OWSRecipientIdentity private let contactName: String private let identityKey: Data - private let fingerprints: [OWSFingerprint] + private let fingerprint: OWSFingerprint private lazy var qrCodeScanViewController = QRCodeScanViewController(appearance: .masked()) init( recipientAci: Aci, recipientIdentity: OWSRecipientIdentity, - fingerprints: [OWSFingerprint] + fingerprint: OWSFingerprint ) { self.recipientAci = recipientAci self.recipientIdentity = recipientIdentity self.identityKey = recipientIdentity.identityKey - self.fingerprints = fingerprints + self.fingerprint = fingerprint self.contactName = Self.contactsManager.displayName(for: SignalServiceAddress(recipientAci)) super.init() @@ -117,26 +117,12 @@ class FingerprintScanViewController: OWSViewController, OWSNavigationChildContro ) } - // Check all of them, if any succeed its success. - var localizedErrorDescriptionToShow: String? - for (i, fingerprint) in fingerprints.enumerated() { - switch fingerprint.matchesLogicalFingerprintsData(combinedFingerprintData) { - case .match: - showSuccess() - return - case .noMatch(let localizedErrorDescription): - // Prefer no match errors to version erorrs, if we end - // up displaying an error. - localizedErrorDescriptionToShow = localizedErrorDescription - fallthrough - case - .weHaveOldVersion(let localizedErrorDescription), - .theyHaveOldVersion(let localizedErrorDescription): - if i == fingerprints.count - 1 { - // We reached the end, show the error for the last one. - showFailure(localizedErrorDescription: localizedErrorDescriptionToShow ?? localizedErrorDescription) - } - } + switch fingerprint.matchesLogicalFingerprintsData(combinedFingerprintData) { + case .match: + showSuccess() + case .noMatch(let localizedErrorDescription), .weHaveOldVersion(let localizedErrorDescription), .theyHaveOldVersion(let localizedErrorDescription): + // We reached the end, show the error for the last one. + showFailure(localizedErrorDescription: localizedErrorDescription) } } diff --git a/SignalUI/ViewControllers/Safety Numbers/FingerprintViewController.swift b/SignalUI/ViewControllers/Safety Numbers/FingerprintViewController.swift index 1b0cc9d7cb..6d5256017e 100644 --- a/SignalUI/ViewControllers/Safety Numbers/FingerprintViewController.swift +++ b/SignalUI/ViewControllers/Safety Numbers/FingerprintViewController.swift @@ -15,39 +15,30 @@ import UIKit public class FingerprintViewController: OWSViewController, OWSNavigationChildController { public class func present( - from viewController: UIViewController, - address theirAddress: SignalServiceAddress + for theirAci: Aci?, + from viewController: UIViewController ) { - owsAssertBeta(theirAddress.isValid) - - let identityManager = DependenciesBridge.shared.identityManager - guard let theirRecipientIdentity = databaseStorage.read(block: { tx in - identityManager.recipientIdentity(for: theirAddress, tx: tx.asV2Read) - }) else { - OWSActionSheets.showActionSheet( - title: OWSLocalizedString( - "CANT_VERIFY_IDENTITY_ALERT_TITLE", - comment: "Title for alert explaining that a user cannot be verified." - ), - message: OWSLocalizedString( - "CANT_VERIFY_IDENTITY_ALERT_MESSAGE", - comment: "Message for alert explaining that a user cannot be verified." - ) - ) - return - } - - guard let fingerprintResult = databaseStorage.read(block: { tx in + let fingerprintResult = databaseStorage.read { (tx) -> OWSFingerprintBuilder.FingerprintResult? in + guard let theirAci else { + return nil + } + let identityManager = DependenciesBridge.shared.identityManager + let theirAddress = SignalServiceAddress(theirAci) + guard let theirRecipientIdentity = identityManager.recipientIdentity(for: theirAddress, tx: tx.asV2Read) else { + return nil + } return OWSFingerprintBuilder( contactsManager: contactsManager, identityManager: identityManager, tsAccountManager: DependenciesBridge.shared.tsAccountManager ).fingerprints( - theirAddress: theirAddress, + theirAci: theirAci, theirRecipientIdentity: theirRecipientIdentity, tx: tx ) - }) else { + } + + guard let fingerprintResult else { let actionSheet = ActionSheetController(message: OWSLocalizedString( "CANT_VERIFY_IDENTITY_EXCHANGE_MESSAGES", comment: "Alert shown when the user needs to exchange messages to see the safety number." @@ -66,10 +57,9 @@ public class FingerprintViewController: OWSViewController, OWSNavigationChildCon } let fingerprintViewController = FingerprintViewController( - fingerprints: fingerprintResult.fingerprints, - initialDisplayIndex: fingerprintResult.initialDisplayIndex, + fingerprint: fingerprintResult.fingerprint, recipientAci: fingerprintResult.theirAci, - recipientIdentity: theirRecipientIdentity + recipientIdentity: fingerprintResult.theirRecipientIdentity ) let navigationController = OWSNavigationController(rootViewController: fingerprintViewController) viewController.present(navigationController, animated: true) @@ -89,26 +79,21 @@ public class FingerprintViewController: OWSViewController, OWSNavigationChildCon private let recipientAci: Aci private let recipientIdentity: OWSRecipientIdentity - private let contactName: String private let identityKey: Data - private let fingerprints: [OWSFingerprint] + private let fingerprint: OWSFingerprint private var isVerified = false - private var selectedIndex: Int public init( - fingerprints: [OWSFingerprint], - initialDisplayIndex: Int, + fingerprint: OWSFingerprint, recipientAci: Aci, recipientIdentity: OWSRecipientIdentity ) { self.recipientAci = recipientAci - self.contactName = Self.contactsManager.displayName(for: SignalServiceAddress(recipientAci)) // By capturing the identity key when we enter these views, we prevent the edge case // where the user verifies a key that we learned about while this view was open. self.recipientIdentity = recipientIdentity self.identityKey = recipientIdentity.identityKey - self.fingerprints = fingerprints - self.selectedIndex = initialDisplayIndex + self.fingerprint = fingerprint super.init() @@ -145,125 +130,18 @@ public class FingerprintViewController: OWSViewController, OWSNavigationChildCon configureUI() } - public override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - - // TODO: This doesn't seem to work, maybe because the views haven't been sized yet. When we build with Xcode 15, we can use `viewIsAppearing()`. - if #available(iOS 17, *) { owsFailDebug("Canary to fix this when we're building with Xcode 15!") } - fingerprintCarouselPageControl.currentPage = selectedIndex - scrollToSelectedIndex(animated: false) - } - - public override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - - if !DependenciesBridge.shared.db.read(block: self.hasShownTransitionSheet) { - // Its fine to not re-read the value in the write tx; stakes are low. - DependenciesBridge.shared.db.write(block: self.showTransitionSheet) - } - } - public override func themeDidChange() { super.themeDidChange() view.backgroundColor = Self.backgroundColor updateVerificationStateLabel() - setSafetyNumbersUpdateTextViewText() - setCarouselPageControlColors() setInstructionsText() setVerifyUnverifyButtonColors() } // MARK: UI - private lazy var safetyNumbersUpdateTextView: LinkingTextView = { - let textView = LinkingTextView() - textView.delegate = self - return textView - }() - - private func setSafetyNumbersUpdateTextViewText() { - // Link doesn't matter, we will override tap behavior. - let learnMoreString = CommonStrings.learnMore.styled(with: .link(URL(string: Constants.transitionLearnMoreUrl)!)) - safetyNumbersUpdateTextView.attributedText = NSAttributedString.composed(of: [ - OWSLocalizedString( - "SAFETY_NUMBER_TRANSITION_HEADER_ALERT", - comment: "Header informing the user about the transition from phone number to user identifier based." - ), - "\n", - learnMoreString - ]).styled( - with: .font(.dynamicTypeFootnote), - .color(Theme.secondaryTextAndIconColor) - ) - safetyNumbersUpdateTextView.linkTextAttributes = [ - .foregroundColor: Theme.primaryTextColor, - .underlineColor: UIColor.clear, - .underlineStyle: NSUnderlineStyle.single.rawValue - ] - } - - private lazy var safetyNumbersUpdateView: UIView = { - let stackView = UIStackView() - stackView.axis = .horizontal - stackView.distribution = .fill - stackView.alignment = .center - stackView.spacing = 16 - - let imageView = UIImageView(image: UIImage(named: "safety_number_transition")) - imageView.autoSetDimensions(to: .square(48)) - stackView.addArrangedSubview(imageView) - - stackView.addArrangedSubview(safetyNumbersUpdateTextView) - - return stackView - }() - - private lazy var fingerprintCards: [FingerprintCard] = { - return fingerprints.map { fingerprint in - return FingerprintCard(fingerprint: fingerprint, controller: self) - } - }() - - private lazy var fingerprintCarousel: UIScrollView = { - let scrollView = UIScrollView() - scrollView.isPagingEnabled = true - scrollView.isDirectionalLockEnabled = true - scrollView.alwaysBounceVertical = false - scrollView.alwaysBounceHorizontal = true - scrollView.showsVerticalScrollIndicator = false - scrollView.showsHorizontalScrollIndicator = false - - var xOffset: CGFloat = Constants.cardHInset - var previousView: UIView = scrollView - var nextEdge: ALEdge = .leading - for fingerprintCard in fingerprintCards { - scrollView.addSubview(fingerprintCard) - fingerprintCard.autoPinVerticalEdges(toEdgesOf: scrollView) - scrollView.autoPinHeight(toHeightOf: fingerprintCard, relation: .greaterThanOrEqual) - fingerprintCard.autoPinEdge(.leading, to: nextEdge, of: previousView, withOffset: xOffset) - previousView = fingerprintCard - xOffset = Constants.interCardSpacing - nextEdge = .trailing - } - previousView.autoPinEdge(.trailing, to: .trailing, of: scrollView, withOffset: -Constants.cardHInset) - - scrollView.delegate = self - - return scrollView - }() - - private lazy var fingerprintCarouselPageControl: UIPageControl = { - let control = UIPageControl() - control.numberOfPages = fingerprints.count - control.addTarget(self, action: #selector(didUpdatePageControl), for: .valueChanged) - return control - }() - - private func setCarouselPageControlColors() { - fingerprintCarouselPageControl.pageIndicatorTintColor = Theme.isDarkThemeEnabled ? .ows_gray65 : .ows_gray25 - fingerprintCarouselPageControl.currentPageIndicatorTintColor = Theme.primaryTextColor - } + private lazy var fingerprintCard = FingerprintCard(fingerprint: fingerprint, controller: self) private lazy var instructionsTextView: UITextView = { let textView = LinkingTextView() @@ -279,7 +157,7 @@ public class FingerprintViewController: OWSViewController, OWSNavigationChildCon // Link doesn't matter, we will override tap behavior. let learnMoreString = CommonStrings.learnMore.styled(with: .link(URL(string: Constants.learnMoreUrl)!)) instructionsTextView.attributedText = NSAttributedString.composed(of: [ - String(format: instructionsFormat, contactName), + String(format: instructionsFormat, fingerprint.theirName), " ", learnMoreString ]).styled( @@ -318,60 +196,34 @@ public class FingerprintViewController: OWSViewController, OWSNavigationChildCon } private func configureUI() { - let scrollView = UIScrollView() - scrollView.showsVerticalScrollIndicator = false - scrollView.showsHorizontalScrollIndicator = false - let containerView = UIView() view.addSubview(scrollView) + let containerView = UIView() scrollView.addSubview(containerView) scrollView.autoPinEdgesToSuperviewEdges(with: .zero, excludingEdge: .bottom) containerView.autoPinEdges(toEdgesOf: scrollView) containerView.autoPinWidth(toWidthOf: view) - containerView.addSubview(safetyNumbersUpdateView) - containerView.addSubview(fingerprintCarousel) - containerView.addSubview(fingerprintCarouselPageControl) + containerView.addSubview(fingerprintCard) containerView.addSubview(instructionsTextView) view.addSubview(verifyUnverifyButton) - safetyNumbersUpdateView.autoPinEdge(.leading, to: .leading, of: containerView, withOffset: .scaleFromIPhone5To7Plus(18, 24)) - safetyNumbersUpdateView.autoPinEdge(.trailing, to: .trailing, of: containerView, withOffset: -.scaleFromIPhone5To7Plus(18, 24)) - safetyNumbersUpdateView.autoPinEdge(toSuperviewSafeArea: .top, withInset: 12) - - fingerprintCarousel.autoPinHorizontalEdges(toEdgesOf: containerView) - - fingerprintCards.forEach { - $0.autoPinWidth(toWidthOf: containerView, offset: -.scaleFromIPhone5To7Plus(60, 105)) - } - - fingerprintCarouselPageControl.autoHCenterInSuperview() - fingerprintCarouselPageControl.autoPinEdge(.top, to: .bottom, of: fingerprintCarousel, withOffset: 8) + fingerprintCard.autoPinEdge(toSuperviewSafeArea: .top, withInset: 56) + fingerprintCard.autoPinWidth(toWidthOf: containerView, offset: -.scaleFromIPhone5To7Plus(60, 105)) + fingerprintCard.autoHCenterInSuperview() instructionsTextView.autoPinEdge(.leading, to: .leading, of: containerView, withOffset: .scaleFromIPhone5To7Plus(18, 28)) instructionsTextView.autoPinEdge(.trailing, to: .trailing, of: containerView, withOffset: -.scaleFromIPhone5To7Plus(18, 28)) - instructionsTextView.autoPinEdge(.bottom, to: .bottom, of: scrollView) + instructionsTextView.autoPinEdge(.bottom, to: .bottom, of: scrollView, withOffset: -8) verifyUnverifyButton.autoHCenterInSuperview() verifyUnverifyButton.autoPinEdge(.top, to: .bottom, of: scrollView, withOffset: .scaleFromIPhone5To7Plus(12, 24)) verifyUnverifyButton.autoPinEdge(toSuperviewSafeArea: .bottom, withInset: .scaleFromIPhone5To7Plus(16, 40)) - if fingerprints.count <= 1 { - safetyNumbersUpdateView.isHidden = true - fingerprintCarouselPageControl.isHidden = true - scrollView.isScrollEnabled = false - - fingerprintCarousel.autoPinEdge(toSuperviewSafeArea: .top, withInset: 56) - instructionsTextView.autoPinEdge(.top, to: .bottom, of: fingerprintCarousel, withOffset: 24) - } else { - fingerprintCarousel.autoPinEdge(.top, to: .bottom, of: safetyNumbersUpdateView, withOffset: 24) - instructionsTextView.autoPinEdge(.top, to: .bottom, of: fingerprintCarouselPageControl, withOffset: 16) - } + instructionsTextView.autoPinEdge(.top, to: .bottom, of: fingerprintCard, withOffset: 24) updateVerificationStateLabel() - setSafetyNumbersUpdateTextViewText() - setCarouselPageControlColors() setInstructionsText() setVerifyUnverifyButtonColors() } @@ -410,12 +262,7 @@ public class FingerprintViewController: OWSViewController, OWSNavigationChildCon layer.cornerRadius = Constants.cornerRadius - self.backgroundColor = { - switch fingerprint.source { - case .aci: return UIColor(rgbHex: 0x506ecd) - case .e164: return UIColor(rgbHex: 0xdeddda) - } - }() + self.backgroundColor = UIColor(rgbHex: 0x506ecd) addSubview(shareButton) addSubview(qrCodeView) @@ -450,16 +297,9 @@ public class FingerprintViewController: OWSViewController, OWSNavigationChildCon private lazy var shareButton: UIButton = { let button = UIButton() - let tintColor: UIColor - switch fingerprint.source { - case .aci: - tintColor = .white - case .e164: - tintColor = .black - } button.setTemplateImage( Theme.iconImage(.buttonShare).withRenderingMode(.alwaysTemplate), - tintColor: tintColor + tintColor: .white ) button.addTarget(self, action: #selector(didTapShare), for: .touchUpInside) return button @@ -500,12 +340,7 @@ public class FingerprintViewController: OWSViewController, OWSNavigationChildCon label.text = fingerprint.displayableText label.font = UIFont(name: "Menlo-Regular", size: 23) label.textAlignment = .center - switch fingerprint.source { - case .aci: - label.textColor = .white - case .e164: - label.textColor = Theme.lightThemeSecondaryTextAndIconColor - } + label.textColor = .white label.numberOfLines = 3 label.lineBreakMode = .byTruncatingTail label.adjustsFontSizeToFitWidth = true @@ -538,7 +373,6 @@ public class FingerprintViewController: OWSViewController, OWSNavigationChildCon // MARK: PillBoxView class PillBoxView: UIView { - override var bounds: CGRect { didSet { self.layer.cornerRadius = bounds.height / 2 @@ -546,180 +380,6 @@ public class FingerprintViewController: OWSViewController, OWSNavigationChildCon } } - // MARK: - Transition Sheet - - private lazy var kvStore: KeyValueStore = { - return DependenciesBridge.shared.keyValueStoreFactory.keyValueStore(collection: "MultiFingerprintVC") - }() - - private static let hasShownTransitionSheetKey = "hasShownTransitionSheetKey" - - private func hasShownTransitionSheet(_ tx: DBReadTransaction) -> Bool { - return self.kvStore.getBool(Self.hasShownTransitionSheetKey, defaultValue: false, transaction: tx) - } - - private func setHasShownTransitionSheet(_ tx: DBWriteTransaction) { - self.kvStore.setBool(true, key: Self.hasShownTransitionSheetKey, transaction: tx) - } - - private func showTransitionSheet(_ tx: DBWriteTransaction) { - self.setHasShownTransitionSheet(tx) - tx.addAsyncCompletion(on: DispatchQueue.main) { - let sheet = TransitionSheetViewController(parent: self) - self.present(sheet, animated: true) - } - } - - class TransitionSheetViewController: InteractiveSheetViewController { - let contentScrollView = UIScrollView() - let stackView = UIStackView() - public override var interactiveScrollViews: [UIScrollView] { [contentScrollView] } - public override var sheetBackgroundColor: UIColor { Theme.tableView2PresentedBackgroundColor } - - override var supportedInterfaceOrientations: UIInterfaceOrientationMask { - return .portrait - } - - private weak var parentVc: FingerprintViewController? - - init(parent: FingerprintViewController) { - self.parentVc = parent - super.init() - } - - override public func viewDidLoad() { - super.viewDidLoad() - - minimizedHeight = 600 - super.allowsExpansion = true - - contentView.addSubview(contentScrollView) - - stackView.axis = .vertical - stackView.layoutMargins = UIEdgeInsets(hMargin: 24, vMargin: 24) - stackView.spacing = 16 - stackView.isLayoutMarginsRelativeArrangement = true - contentScrollView.addSubview(stackView) - stackView.autoPinHeightToSuperview() - // Pin to the scroll view's viewport, not to its scrollable area - stackView.autoPinWidth(toWidthOf: contentScrollView) - - contentScrollView.autoPinEdgesToSuperviewEdges() - contentScrollView.alwaysBounceVertical = true - - buildContents() - } - - override public func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - - if !animationView.isAnimationQueued && !animationView.isAnimationPlaying { - animationView.play { [weak self] success in - guard success else { return } - self?.loopAnimation() - } - } - } - - override public func viewWillDisappear(_ animated: Bool) { - super.viewWillDisappear(animated) - - if animationView.isAnimationQueued || animationView.isAnimationPlaying { - animationView.stop() - } - } - - private func loopAnimation() { - animationView.play(fromFrame: 60, toFrame: 360, completion: { [weak self] success in - guard success else { return } - self?.loopAnimation() - }) - } - - private lazy var animationView: AnimationView = { - let animationView = AnimationView(name: "safety-numbers") - animationView.contentMode = .scaleAspectFit - animationView.isUserInteractionEnabled = false - animationView.backgroundColor = .white - animationView.layer.cornerRadius = 12 - animationView.layer.masksToBounds = true - return animationView - }() - - private func buildContents() { - let titleLabel = UILabel() - titleLabel.textAlignment = .center - titleLabel.font = UIFont.dynamicTypeTitle2.semibold() - titleLabel.text = OWSLocalizedString( - "SAFETY_NUMBER_TRANSITION_SHEET_TITLE", - comment: "Title for a sheet informing the user about the transition from phone number to user identifier based." - ) - titleLabel.numberOfLines = 0 - titleLabel.lineBreakMode = .byWordWrapping - stackView.addArrangedSubview(titleLabel) - - let paragraphs: [String] = [ - OWSLocalizedString( - "SAFETY_NUMBER_TRANSITION_SHEET_PARAGRAPH_1", - comment: "Informs the user about the transition from phone number to user identifier based." - ), - OWSLocalizedString( - "SAFETY_NUMBER_TRANSITION_SHEET_PARAGRAPH_2", - comment: "Informs the user about the transition from phone number to user identifier based." - ) - ] - var lastParagraphLabel: UILabel! - for paragraph in paragraphs { - let paragraphLabel = UILabel() - paragraphLabel.text = paragraph - paragraphLabel.textAlignment = .natural - paragraphLabel.font = .dynamicTypeSubheadlineClamped - paragraphLabel.numberOfLines = 0 - paragraphLabel.lineBreakMode = .byWordWrapping - paragraphLabel.textColor = Theme.secondaryTextAndIconColor - stackView.addArrangedSubview(paragraphLabel) - lastParagraphLabel = paragraphLabel - } - stackView.setCustomSpacing(20, after: lastParagraphLabel) - - stackView.addArrangedSubview(animationView) - stackView.setCustomSpacing(18, after: animationView) - animationView.autoMatch(.height, to: .width, of: animationView, withMultiplier: 172/346) - - let learnMoreTitle = OWSLocalizedString( - "SAFETY_NUMBER_TRANSITION_SHEET_HELP_TEXT", - comment: "Button text for a sheet informing the user about the transition from phone number to user identifier based." - ) - let learnMoreButton = UIButton(type: .system) - learnMoreButton.setTitle(learnMoreTitle, for: .normal) - learnMoreButton.titleLabel?.font = .dynamicTypeBody - learnMoreButton.setTitleColor(Theme.isDarkThemeEnabled ? .ows_accentBlueDark : .link, for: .normal) - learnMoreButton.addTarget(self, action: #selector(didTapLearnMore), for: .touchUpInside) - stackView.addArrangedSubview(learnMoreButton) - stackView.setCustomSpacing(24, after: learnMoreButton) - - let continueButton = OWSButton( - title: OWSLocalizedString( - "ALERT_ACTION_ACKNOWLEDGE", - comment: "generic button text to acknowledge that the corresponding text was read." - ) - ) { [weak self] in - self?.dismiss(animated: true) - } - continueButton.layer.cornerRadius = 16 - continueButton.backgroundColor = .ows_accentBlue - continueButton.dimsWhenHighlighted = true - continueButton.titleLabel?.font = UIFont.dynamicTypeBody.semibold() - continueButton.autoSetDimension(.height, toSize: 50, relation: .greaterThanOrEqual) - stackView.addArrangedSubview(continueButton) - } - - @objc - func didTapLearnMore() { - FingerprintViewController.showLearnMoreUrl(from: self) - } - } - // MARK: Actions @objc @@ -737,12 +397,6 @@ public class FingerprintViewController: OWSViewController, OWSNavigationChildCon viewController.present(safariVC, animated: true) } - @objc - private func didUpdatePageControl() { - self.selectedIndex = fingerprintCarouselPageControl.currentPage - scrollToSelectedIndex() - } - @objc private func didTapVerifyUnverify(_ gestureRecognizer: UITapGestureRecognizer) { guard gestureRecognizer.state == .recognized else { return } @@ -764,10 +418,6 @@ public class FingerprintViewController: OWSViewController, OWSNavigationChildCon } private func shareFingerprint(from fromView: UIView) { - let fingerprint = fingerprints[selectedIndex] - - Logger.debug("Sharing safety numbers") - let compareActivity = CompareSafetyNumbersActivity(delegate: self) let shareFormat = NSLocalizedString( @@ -802,21 +452,11 @@ public class FingerprintViewController: OWSViewController, OWSNavigationChildCon let viewController = FingerprintScanViewController( recipientAci: recipientAci, recipientIdentity: recipientIdentity, - fingerprints: self.fingerprints + fingerprint: self.fingerprint ) navigationController?.pushViewController(viewController, animated: true) } - private func scrollToSelectedIndex(animated: Bool = true) { - let xOffset: CGFloat - if selectedIndex == 0 { - xOffset = 0 - } else { - xOffset = (CGFloat(selectedIndex) * UIScreen.main.bounds.width) - (Constants.interCardSpacing + Constants.cardHInset) - } - fingerprintCarousel.setContentOffset(.init(x: xOffset, y: 0), animated: animated) - } - // MARK: Notifications private var identityStateChangeObserver: Any? @@ -830,10 +470,6 @@ public class FingerprintViewController: OWSViewController, OWSNavigationChildCon enum Constants { static let cardHInset: CGFloat = .scaleFromIPhone5To7Plus(30, 53) - static var interCardSpacing: CGFloat = cardHInset / 2 - - // Link doesn't matter, we will override tap behavior. - static let transitionLearnMoreUrl = "https://support.signal.org/" static let learnMoreUrl = "https://support.signal.org/learnMore" } } @@ -845,7 +481,7 @@ extension FingerprintViewController: CompareSafetyNumbersActivityDelegate { from: self, identityKey: identityKey, recipientAci: recipientAci, - contactName: contactName, + contactName: fingerprint.theirName, tag: logTag ) } @@ -864,24 +500,10 @@ extension FingerprintViewController: CompareSafetyNumbersActivityDelegate { } extension FingerprintViewController: UITextViewDelegate { - public func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool { - if URL.absoluteString == Constants.transitionLearnMoreUrl { - DependenciesBridge.shared.db.write { - self.showTransitionSheet($0) - } - } else if URL.absoluteString == Constants.learnMoreUrl { + if URL.absoluteString == Constants.learnMoreUrl { self.didTapLearnMore() } return false } } - -extension FingerprintViewController: UIScrollViewDelegate { - - public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { - let selectedIndex = Int(scrollView.contentOffset.x / (scrollView.frame.width - (Constants.cardHInset * 2))) - self.selectedIndex = selectedIndex - self.fingerprintCarouselPageControl.currentPage = selectedIndex - } -} diff --git a/SignalUI/ViewControllers/Safety Numbers/MultiFingerprintViewController.swift b/SignalUI/ViewControllers/Safety Numbers/MultiFingerprintViewController.swift deleted file mode 100644 index 5a3f46f247..0000000000 --- a/SignalUI/ViewControllers/Safety Numbers/MultiFingerprintViewController.swift +++ /dev/null @@ -1,799 +0,0 @@ -// -// Copyright 2023 Signal Messenger, LLC -// SPDX-License-Identifier: AGPL-3.0-only -// - -import Foundation - -import Lottie -import PureLayout -import SafariServices -import SignalMessaging -import SignalServiceKit -import UIKit - -public class MultiFingerprintViewController: OWSViewController, OWSNavigationChildController { - - public var preferredNavigationBarStyle: OWSNavigationBarStyle { - return .solid - } - - public var navbarBackgroundColorOverride: UIColor? { - return Self.backgroundColor - } - - public override var supportedInterfaceOrientations: UIInterfaceOrientationMask { - return .portrait - } - - private let recipientAddress: SignalServiceAddress - private let recipientIdentity: OWSRecipientIdentity - private let contactName: String - private let identityKey: IdentityKey - private let fingerprints: [OWSFingerprint] - private var selectedIndex: Int - - public init( - fingerprints: [OWSFingerprint], - defaultIndex: Int, - recipientAddress: SignalServiceAddress, - recipientIdentity: OWSRecipientIdentity - ) { - self.recipientAddress = recipientAddress - self.contactName = SSKEnvironment.shared.contactsManagerRef.displayName(for: recipientAddress) - // By capturing the identity key when we enter these views, we prevent the edge case - // where the user verifies a key that we learned about while this view was open. - self.recipientIdentity = recipientIdentity - self.identityKey = recipientIdentity.identityKey - self.fingerprints = fingerprints - self.selectedIndex = defaultIndex - - super.init() - - title = NSLocalizedString("PRIVACY_VERIFICATION_TITLE", comment: "Navbar title") - navigationItem.leftBarButtonItem = .init( - barButtonSystemItem: .done, - target: self, action: #selector(didTapDone), - accessibilityIdentifier: "FingerprintViewController.done" - ) - - identityStateChangeObserver = NotificationCenter.default.addObserver( - forName: .identityStateDidChange, - object: nil, - queue: .main) { [weak self] _ in - self?.identityStateDidChange() - } - } - - deinit { - if let identityStateChangeObserver { - NotificationCenter.default.removeObserver(identityStateChangeObserver) - } - } - - private static var backgroundColor: UIColor { - return Theme.isDarkThemeEnabled ? .ows_gray90 : .ows_gray02 - } - - public override func viewDidLoad() { - super.viewDidLoad() - - view.backgroundColor = Self.backgroundColor - - configureUI() - } - - public override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - - scrollToSelectedIndex(animated: false) - } - - public override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - - if !DependenciesBridge.shared.db.read(block: self.hasShownTransitionSheet) { - // Its fine to not re-read the value in the write tx; stakes are low. - DependenciesBridge.shared.db.write(block: self.showTransitionSheet) - } - } - - public override func themeDidChange() { - super.themeDidChange() - view.backgroundColor = Self.backgroundColor - - updateVerificationStateLabel() - setSafetyNumbersUpdateTextViewText() - setCarouselPageControlColors() - setInstructionsText() - setVerifyUnverifyButtonColors() - } - - // MARK: UI - - private lazy var safetyNumbersUpdateTextView: LinkingTextView = { - let textView = LinkingTextView() - textView.delegate = self - return textView - }() - - private func setSafetyNumbersUpdateTextViewText() { - // Link doesn't matter, we will override tap behavior. - let learnMoreString = CommonStrings.learnMore.styled(with: .link(URL(string: Constants.transitionLearnMoreUrl)!)) - safetyNumbersUpdateTextView.attributedText = NSAttributedString.composed(of: [ - OWSLocalizedString( - "SAFETY_NUMBER_TRANSITION_HEADER_ALERT", - comment: "Header informing the user about the transition from phone number to user identifier based." - ), - "\n", - learnMoreString - ]).styled( - with: .font(.dynamicTypeFootnote), - .color(Theme.secondaryTextAndIconColor) - ) - safetyNumbersUpdateTextView.linkTextAttributes = [ - .foregroundColor: Theme.primaryTextColor, - .underlineColor: UIColor.clear, - .underlineStyle: NSUnderlineStyle.single.rawValue - ] - } - - private lazy var safetyNumbersUpdateView: UIView = { - let stackView = UIStackView() - stackView.axis = .horizontal - stackView.distribution = .fill - stackView.alignment = .center - stackView.spacing = 16 - - let imageView = UIImageView(image: UIImage(named: "safety_number_transition")) - imageView.autoSetDimensions(to: .square(48)) - stackView.addArrangedSubview(imageView) - - stackView.addArrangedSubview(safetyNumbersUpdateTextView) - - return stackView - }() - - private lazy var fingerprintCards: [FingerprintCard] = { - return fingerprints.map { fingerprint in - return FingerprintCard(fingerprint: fingerprint, controller: self) - } - }() - - private lazy var fingerprintCarousel: UIScrollView = { - let scrollView = UIScrollView() - scrollView.isPagingEnabled = true - scrollView.isDirectionalLockEnabled = true - scrollView.alwaysBounceVertical = false - scrollView.alwaysBounceHorizontal = true - scrollView.showsVerticalScrollIndicator = false - scrollView.showsHorizontalScrollIndicator = false - - var xOffset: CGFloat = Constants.cardHInset - var previousView: UIView = scrollView - var nextEdge: ALEdge = .leading - for fingerprintCard in fingerprintCards { - scrollView.addSubview(fingerprintCard) - fingerprintCard.autoPinVerticalEdges(toEdgesOf: scrollView) - scrollView.autoPinHeight(toHeightOf: fingerprintCard, relation: .greaterThanOrEqual) - fingerprintCard.autoPinEdge(.leading, to: nextEdge, of: previousView, withOffset: xOffset) - previousView = fingerprintCard - xOffset = Constants.interCardSpacing - nextEdge = .trailing - } - previousView.autoPinEdge(.trailing, to: .trailing, of: scrollView, withOffset: -Constants.cardHInset) - - scrollView.delegate = self - - return scrollView - }() - - private lazy var fingerprintCarouselPageControl: UIPageControl = { - let control = UIPageControl() - control.numberOfPages = fingerprints.count - control.addTarget(self, action: #selector(didUpdatePageControl), for: .valueChanged) - return control - }() - - private func setCarouselPageControlColors() { - fingerprintCarouselPageControl.pageIndicatorTintColor = Theme.isDarkThemeEnabled ? .ows_gray65 : .ows_gray25 - fingerprintCarouselPageControl.currentPageIndicatorTintColor = Theme.primaryTextColor - } - - private lazy var instructionsTextView: UITextView = { - let textView = LinkingTextView() - textView.delegate = self - return textView - }() - - private func setInstructionsText() { - let instructionsFormat = OWSLocalizedString( - "VERIFY_SAFETY_NUMBER_INSTRUCTIONS", - comment: "Instructions for verifying your safety number. Embeds {{contact's name}}" - ) - // Link doesn't matter, we will override tap behavior. - let learnMoreString = CommonStrings.learnMore.styled(with: .link(URL(string: Constants.learnMoreUrl)!)) - instructionsTextView.attributedText = NSAttributedString.composed(of: [ - String(format: instructionsFormat, contactName), - " ", - learnMoreString - ]).styled( - with: .font(.dynamicTypeFootnote), - .color(Theme.secondaryTextAndIconColor), - .alignment(.center) - ) - instructionsTextView.linkTextAttributes = [ - .foregroundColor: Theme.primaryTextColor, - .underlineColor: UIColor.clear, - .underlineStyle: NSUnderlineStyle.single.rawValue - ] - } - - private lazy var verifyUnverifyButtonLabel = UILabel() - private lazy var verifyUnverifyPillbox = PillBoxView() - - private lazy var verifyUnverifyButton: UIView = { - verifyUnverifyPillbox.layer.masksToBounds = true - verifyUnverifyPillbox.accessibilityIdentifier = "FingerprintViewController.verifyUnverifyButton" - verifyUnverifyPillbox.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(didTapVerifyUnverify))) - - verifyUnverifyButtonLabel.font = .systemFont(ofSize: 13, weight: .bold) - verifyUnverifyButtonLabel.textAlignment = .center - verifyUnverifyButtonLabel.setContentCompressionResistancePriority(.defaultHigh, for: .vertical) - verifyUnverifyPillbox.addSubview(verifyUnverifyButtonLabel) - verifyUnverifyButtonLabel.autoPinWidthToSuperview(withMargin: 24) - verifyUnverifyButtonLabel.autoPinHeightToSuperview(withMargin: 12) - - return verifyUnverifyPillbox - }() - - private func setVerifyUnverifyButtonColors() { - verifyUnverifyButtonLabel.textColor = Theme.primaryTextColor - verifyUnverifyPillbox.backgroundColor = Theme.isDarkThemeEnabled ? .ows_gray80 : .white - } - - private func configureUI() { - - let scrollView = UIScrollView() - scrollView.showsVerticalScrollIndicator = false - scrollView.showsHorizontalScrollIndicator = false - let containerView = UIView() - view.addSubview(scrollView) - scrollView.addSubview(containerView) - - scrollView.autoPinEdgesToSuperviewEdges(with: .zero, excludingEdge: .bottom) - containerView.autoPinEdges(toEdgesOf: scrollView) - containerView.autoPinWidth(toWidthOf: view) - - containerView.addSubview(safetyNumbersUpdateView) - containerView.addSubview(fingerprintCarousel) - containerView.addSubview(fingerprintCarouselPageControl) - containerView.addSubview(instructionsTextView) - view.addSubview(verifyUnverifyButton) - - safetyNumbersUpdateView.autoPinEdge(.leading, to: .leading, of: containerView, withOffset: .scaleFromIPhone5To7Plus(18, 24)) - safetyNumbersUpdateView.autoPinEdge(.trailing, to: .trailing, of: containerView, withOffset: -.scaleFromIPhone5To7Plus(18, 24)) - safetyNumbersUpdateView.autoPinEdge(toSuperviewSafeArea: .top, withInset: 12) - - fingerprintCarousel.autoPinHorizontalEdges(toEdgesOf: containerView) - - fingerprintCards.forEach { - $0.autoPinWidth(toWidthOf: containerView, offset: -.scaleFromIPhone5To7Plus(60, 105)) - } - - fingerprintCarouselPageControl.autoHCenterInSuperview() - fingerprintCarouselPageControl.autoPinEdge(.top, to: .bottom, of: fingerprintCarousel, withOffset: 8) - - instructionsTextView.autoPinEdge(.leading, to: .leading, of: containerView, withOffset: .scaleFromIPhone5To7Plus(18, 28)) - instructionsTextView.autoPinEdge(.trailing, to: .trailing, of: containerView, withOffset: -.scaleFromIPhone5To7Plus(18, 28)) - instructionsTextView.autoPinEdge(.bottom, to: .bottom, of: scrollView) - - verifyUnverifyButton.autoHCenterInSuperview() - verifyUnverifyButton.autoPinEdge(.top, to: .bottom, of: scrollView, withOffset: .scaleFromIPhone5To7Plus(12, 24)) - verifyUnverifyButton.autoPinEdge(toSuperviewSafeArea: .bottom, withInset: .scaleFromIPhone5To7Plus(16, 40)) - - if fingerprints.count <= 1 { - safetyNumbersUpdateView.isHidden = true - fingerprintCarouselPageControl.isHidden = true - scrollView.isScrollEnabled = false - - fingerprintCarousel.autoPinEdge(toSuperviewSafeArea: .top, withInset: 56) - instructionsTextView.autoPinEdge(.top, to: .bottom, of: fingerprintCarousel, withOffset: 24) - } else { - fingerprintCarousel.autoPinEdge(.top, to: .bottom, of: safetyNumbersUpdateView, withOffset: 24) - instructionsTextView.autoPinEdge(.top, to: .bottom, of: fingerprintCarouselPageControl, withOffset: 16) - } - - updateVerificationStateLabel() - setSafetyNumbersUpdateTextViewText() - setCarouselPageControlColors() - setInstructionsText() - setVerifyUnverifyButtonColors() - } - - private func updateVerificationStateLabel() { - owsAssertBeta(recipientAddress.isValid) - - let isVerified = OWSIdentityManager.shared.verificationState(for: recipientAddress) == .verified - - if isVerified { - verifyUnverifyButtonLabel.text = NSLocalizedString( - "PRIVACY_UNVERIFY_BUTTON", - comment: "Button that lets user mark another user's identity as unverified." - ) - } else { - verifyUnverifyButtonLabel.text = OWSLocalizedString( - "PRIVACY_VERIFY_BUTTON", - comment: "Button that lets user mark another user's identity as verified." - ) - } - view.setNeedsLayout() - } - - // MARK: - Fingerprint Card - - class FingerprintCard: UIView { - - private let fingerprint: OWSFingerprint - private weak var controller: MultiFingerprintViewController? - - init(fingerprint: OWSFingerprint, controller: MultiFingerprintViewController) { - self.fingerprint = fingerprint - self.controller = controller - super.init(frame: .zero) - - layer.cornerRadius = Constants.cornerRadius - - self.backgroundColor = { - switch fingerprint.source { - case .aci: return UIColor(rgbHex: 0x506ecd) - case .e164: return UIColor(rgbHex: 0xdeddda) - } - }() - - addSubview(shareButton) - addSubview(qrCodeView) - addSubview(safetyNumberLabel) - - shareButton.autoPinEdge(.top, to: .top, of: self, withOffset: 16) - shareButton.autoPinEdge(.trailing, to: .trailing, of: self, withOffset: -16) - - qrCodeView.autoPinEdge(.top, to: .bottom, of: shareButton, withOffset: 8) - qrCodeView.autoPinEdge(.leading, to: .leading, of: self, withOffset: .scaleFromIPhone5To7Plus(44, 64)) - qrCodeView.autoPinEdge(.trailing, to: .trailing, of: self, withOffset: -.scaleFromIPhone5To7Plus(44, 64)) - - safetyNumberLabel.autoPinEdge(.top, to: .bottom, of: qrCodeView, withOffset: 30) - safetyNumberLabel.autoPinEdge(.leading, to: .leading, of: self, withOffset: .scaleFromIPhone5To7Plus(20, 35)) - safetyNumberLabel.autoPinEdge(.trailing, to: .trailing, of: self, withOffset: -.scaleFromIPhone5To7Plus(20, 35)) - safetyNumberLabel.autoPinEdge(.bottom, to: .bottom, of: self, withOffset: -.scaleFromIPhone5To7Plus(27, 47)) - } - - required init?(coder: NSCoder) { - fatalError() - } - - private lazy var shareButton: UIButton = { - let button = UIButton() - let tintColor: UIColor - switch fingerprint.source { - case .aci: - tintColor = .white - case .e164: - tintColor = .black - } - button.setTemplateImage( - Theme.iconImage(.buttonShare).withRenderingMode(.alwaysTemplate), - tintColor: tintColor - ) - button.addTarget(self, action: #selector(didTapShare), for: .touchUpInside) - return button - }() - - private lazy var qrCodeView: UIView = { - let containerView = UIView() - containerView.backgroundColor = .white - containerView.layer.cornerRadius = Constants.cornerRadius - containerView.layer.masksToBounds = true - - let fingerprintImageView = UIImageView() - fingerprintImageView.image = fingerprint.image - // Don't antialias QR Codes. - fingerprintImageView.layer.magnificationFilter = .nearest - fingerprintImageView.layer.minificationFilter = .nearest - fingerprintImageView.setCompressionResistanceLow() - containerView.addSubview(fingerprintImageView) - fingerprintImageView.autoPin(toAspectRatio: 1) - fingerprintImageView.autoPinEdgesToSuperviewEdges(with: UIEdgeInsets(margin: 20), excludingEdge: .bottom) - - let scanLabel = UILabel() - scanLabel.text = NSLocalizedString("PRIVACY_TAP_TO_SCAN", comment: "Button that shows the 'scan with camera' view.") - scanLabel.font = .systemFont(ofSize: .scaleFromIPhone5To7Plus(13, 15)) - scanLabel.textColor = Theme.lightThemeSecondaryTextAndIconColor - containerView.addSubview(scanLabel) - scanLabel.autoHCenterInSuperview() - scanLabel.autoPinEdge(.top, to: .bottom, of: fingerprintImageView, withOffset: 12) - scanLabel.autoPinEdge(.bottom, to: .bottom, of: containerView, withOffset: -14) - - containerView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(didTapToScan))) - - return containerView - }() - - private lazy var safetyNumberLabel: UILabel = { - let label = UILabel() - label.text = fingerprint.displayableText - label.font = UIFont(name: "Menlo-Regular", size: 23) - label.textAlignment = .center - switch fingerprint.source { - case .aci: - label.textColor = .white - case .e164: - label.textColor = Theme.lightThemeSecondaryTextAndIconColor - } - label.numberOfLines = 3 - label.lineBreakMode = .byTruncatingTail - label.adjustsFontSizeToFitWidth = true - label.isUserInteractionEnabled = true - label.accessibilityIdentifier = "FingerprintViewController.fingerprintLabel" - return label - }() - - @objc - func didTapToScan() { - controller?.didTapToScan() - } - - @objc - func didTapShare() { - controller?.shareFingerprint(from: shareButton) - } - - enum Constants { - static let cornerRadius: CGFloat = 18 - } - } - - // MARK: PillBoxView - - class PillBoxView: UIView { - - override var bounds: CGRect { - didSet { - self.layer.cornerRadius = bounds.height / 2 - } - } - } - - // MARK: - Transition Sheet - - private lazy var kvStore: KeyValueStore = { - return DependenciesBridge.shared.keyValueStoreFactory.keyValueStore(collection: "MultiFingerprintVC") - }() - - private static let hasShownTransitionSheetKey = "hasShownTransitionSheetKey" - - private func hasShownTransitionSheet(_ tx: DBReadTransaction) -> Bool { - return self.kvStore.getBool(Self.hasShownTransitionSheetKey, defaultValue: false, transaction: tx) - } - - private func setHasShownTransitionSheet(_ tx: DBWriteTransaction) { - self.kvStore.setBool(true, key: Self.hasShownTransitionSheetKey, transaction: tx) - } - - private func showTransitionSheet(_ tx: DBWriteTransaction) { - self.setHasShownTransitionSheet(tx) - tx.addAsyncCompletion(on: DispatchQueue.main) { - let sheet = TransitionSheetViewController(parent: self) - self.present(sheet, animated: true) - } - } - - class TransitionSheetViewController: InteractiveSheetViewController { - let contentScrollView = UIScrollView() - let stackView = UIStackView() - public override var interactiveScrollViews: [UIScrollView] { [contentScrollView] } - public override var sheetBackgroundColor: UIColor { Theme.tableView2PresentedBackgroundColor } - - private weak var parentVc: MultiFingerprintViewController? - - init(parent: MultiFingerprintViewController) { - self.parentVc = parent - super.init() - } - - override public func viewDidLoad() { - super.viewDidLoad() - - minimizedHeight = 600 - super.allowsExpansion = true - - contentView.addSubview(contentScrollView) - - stackView.axis = .vertical - stackView.layoutMargins = UIEdgeInsets(hMargin: 24, vMargin: 24) - stackView.spacing = 16 - stackView.isLayoutMarginsRelativeArrangement = true - contentScrollView.addSubview(stackView) - stackView.autoPinHeightToSuperview() - // Pin to the scroll view's viewport, not to its scrollable area - stackView.autoPinWidth(toWidthOf: contentScrollView) - - contentScrollView.autoPinEdgesToSuperviewEdges() - contentScrollView.alwaysBounceVertical = true - - buildContents() - } - - override public func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - - if !animationView.isAnimationQueued && !animationView.isAnimationPlaying { - animationView.play { [weak self] success in - guard success else { return } - self?.loopAnimation() - } - } - } - - override public func viewWillDisappear(_ animated: Bool) { - super.viewWillDisappear(animated) - - if animationView.isAnimationQueued || animationView.isAnimationPlaying { - animationView.stop() - } - } - - private func loopAnimation() { - animationView.play(fromFrame: 60, toFrame: 360, completion: { [weak self] success in - guard success else { return } - self?.loopAnimation() - }) - } - - private lazy var animationView: AnimationView = { - let animationView = AnimationView(name: "safety-numbers") - animationView.contentMode = .scaleAspectFit - animationView.isUserInteractionEnabled = false - animationView.backgroundColor = .white - animationView.layer.cornerRadius = 12 - animationView.layer.masksToBounds = true - return animationView - }() - - private func buildContents() { - let titleLabel = UILabel() - titleLabel.textAlignment = .center - titleLabel.font = UIFont.dynamicTypeTitle2.semibold() - titleLabel.text = OWSLocalizedString( - "SAFETY_NUMBER_TRANSITION_SHEET_TITLE", - comment: "Title for a sheet informing the user about the transition from phone number to user identifier based." - ) - titleLabel.numberOfLines = 0 - titleLabel.lineBreakMode = .byWordWrapping - stackView.addArrangedSubview(titleLabel) - - let paragraphs: [String] = [ - OWSLocalizedString( - "SAFETY_NUMBER_TRANSITION_SHEET_PARAGRAPH_1", - comment: "Informs the user about the transition from phone number to user identifier based." - ), - OWSLocalizedString( - "SAFETY_NUMBER_TRANSITION_SHEET_PARAGRAPH_2", - comment: "Informs the user about the transition from phone number to user identifier based." - ) - ] - var lastParagraphLabel: UILabel! - for paragraph in paragraphs { - let paragraphLabel = UILabel() - paragraphLabel.text = paragraph - paragraphLabel.textAlignment = .natural - paragraphLabel.font = .dynamicTypeSubheadlineClamped - paragraphLabel.numberOfLines = 0 - paragraphLabel.lineBreakMode = .byWordWrapping - paragraphLabel.textColor = Theme.secondaryTextAndIconColor - stackView.addArrangedSubview(paragraphLabel) - lastParagraphLabel = paragraphLabel - } - stackView.setCustomSpacing(20, after: lastParagraphLabel) - - stackView.addArrangedSubview(animationView) - stackView.setCustomSpacing(24, after: animationView) - animationView.autoPinWidth(toWidthOf: self.view, offset: -48) - animationView.autoMatch(.height, to: .width, of: animationView, withMultiplier: 172/346) - - let learnMoreLabel = UILabel() - learnMoreLabel.text = OWSLocalizedString( - "SAFETY_NUMBER_TRANSITION_SHEET_HELP_TEXT", - comment: "Button text for a sheet informing the user about the transition from phone number to user identifier based." - ) - learnMoreLabel.textAlignment = .center - learnMoreLabel.font = .dynamicTypeBody - learnMoreLabel.textColor = Theme.isDarkThemeEnabled ? .ows_accentBlueDark : .link - learnMoreLabel.isUserInteractionEnabled = true - learnMoreLabel.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(didTapLearnMore))) - stackView.addArrangedSubview(learnMoreLabel) - stackView.setCustomSpacing(30, after: learnMoreLabel) - - let continueButton = OWSButton( - title: OWSLocalizedString( - "ALERT_ACTION_ACKNOWLEDGE", - comment: "generic button text to acknowledge that the corresponding text was read." - ) - ) { [weak self] in - self?.dismiss(animated: true) - } - continueButton.layer.cornerRadius = 16 - continueButton.backgroundColor = .ows_accentBlue - continueButton.titleLabel?.font = UIFont.dynamicTypeBody.semibold() - continueButton.autoSetDimension(.height, toSize: 50, relation: .greaterThanOrEqual) - stackView.addArrangedSubview(continueButton) - } - - @objc - func didTapLearnMore() { - self.dismiss(animated: true) { [weak self] in - self?.parentVc?.didTapLearnMore() - } - } - } - - // MARK: Actions - - @objc - private func didTapDone() { - dismiss(animated: true) - } - - private func didTapLearnMore() { - let learnMoreUrl = URL(string: "https://support.signal.org/hc/articles/213134107")! - let safariVC = SFSafariViewController(url: learnMoreUrl) - present(safariVC, animated: true) - } - - @objc - private func didUpdatePageControl() { - self.selectedIndex = fingerprintCarouselPageControl.currentPage - scrollToSelectedIndex() - } - - @objc - private func didTapVerifyUnverify(_ gestureRecognizer: UITapGestureRecognizer) { - guard gestureRecognizer.state == .recognized else { return } - - databaseStorage.write { transaction in - let isVerified = OWSIdentityManager.shared.verificationState(for: recipientAddress, transaction: transaction) == .verified - let newVerificationState: OWSVerificationState = isVerified ? .default : .verified - OWSIdentityManager.shared.setVerificationState( - newVerificationState, - identityKey: identityKey, - address: recipientAddress, - isUserInitiatedChange: true, - transaction: transaction - ) - } - - dismiss(animated: true) - } - - private func shareFingerprint(from fromView: UIView) { - let fingerprint = fingerprints[selectedIndex] - - Logger.debug("Sharing safety numbers") - - let compareActivity = CompareSafetyNumbersActivity(delegate: self) - - let shareFormat = NSLocalizedString( - "SAFETY_NUMBER_SHARE_FORMAT", - comment: "Snippet to share {{safety number}} with a friend. sent e.g. via SMS" - ) - let shareString = String(format: shareFormat, fingerprint.displayableText) - - let activityController = UIActivityViewController( - activityItems: [ shareString ], - applicationActivities: [ compareActivity ] - ) - - if let popoverPresentationController = activityController.popoverPresentationController { - popoverPresentationController.sourceView = fromView - } - - // This value was extracted by inspecting `activityType` in the activityController.completionHandler - let iCloudActivityType = "com.apple.CloudDocsUI.AddToiCloudDrive" - activityController.excludedActivityTypes = [ - .postToFacebook, - .postToWeibo, - .airDrop, - .postToTwitter, - .init(rawValue: iCloudActivityType) // This isn't being excluded. RADAR https://openradar.appspot.com/27493621 - ] - - present(activityController, animated: true) - } - - fileprivate func didTapToScan() { - let viewController = FingerprintScanViewController( - recipientAddress: recipientAddress, - recipientIdentity: recipientIdentity, - fingerprints: .multiFingerprint(self.fingerprints, defaultIndex: self.selectedIndex) - ) - navigationController?.pushViewController(viewController, animated: true) - } - - private func scrollToSelectedIndex(animated: Bool = true) { - let xOffset: CGFloat - if selectedIndex == 0 { - xOffset = 0 - } else { - xOffset = (CGFloat(selectedIndex) * UIScreen.main.bounds.width) - (Constants.interCardSpacing + Constants.cardHInset) - } - fingerprintCarousel.setContentOffset(.init(x: xOffset, y: 0), animated: animated) - } - - // MARK: Notifications - - private var identityStateChangeObserver: Any? - - private func identityStateDidChange() { - AssertIsOnMainThread() - updateVerificationStateLabel() - } - - // MARK: - Constants - - enum Constants { - static let cardHInset: CGFloat = .scaleFromIPhone5To7Plus(30, 53) - static var interCardSpacing: CGFloat = cardHInset / 2 - - // Link doesn't matter, we will override tap behavior. - static let transitionLearnMoreUrl = "https://support.signal.org/" - static let learnMoreUrl = "https://support.signal.org/learnMore" - } -} - -extension MultiFingerprintViewController: CompareSafetyNumbersActivityDelegate { - - public func compareSafetyNumbersActivitySucceeded(activity: CompareSafetyNumbersActivity) { - FingerprintScanViewController.showVerificationSucceeded( - from: self, - identityKey: identityKey, - recipientAddress: recipientAddress, - contactName: contactName, - tag: logTag - ) - } - - public func compareSafetyNumbersActivity(_ activity: CompareSafetyNumbersActivity, failedWithError error: Error) { - let isUserError = (error as NSError).code == OWSErrorCode.userError.rawValue - - FingerprintScanViewController.showVerificationFailed( - from: self, - isUserError: isUserError, - localizedErrorDescription: error.userErrorDescription, - tag: logTag - ) - } - -} - -extension MultiFingerprintViewController: UITextViewDelegate { - - public func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool { - if URL.absoluteString == Constants.transitionLearnMoreUrl { - DependenciesBridge.shared.db.write { - self.showTransitionSheet($0) - } - } else if URL.absoluteString == Constants.learnMoreUrl { - self.didTapLearnMore() - } - return false - } -} - -extension MultiFingerprintViewController: UIScrollViewDelegate { - - public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { - let selectedIndex = Int(scrollView.contentOffset.x / (scrollView.frame.width - (Constants.cardHInset * 2))) - self.selectedIndex = selectedIndex - self.fingerprintCarouselPageControl.currentPage = selectedIndex - } -} diff --git a/SignalUI/ViewControllers/SafetyNumberConfirmationSheet.swift b/SignalUI/ViewControllers/SafetyNumberConfirmationSheet.swift index 17ead37669..f5c1c66df3 100644 --- a/SignalUI/ViewControllers/SafetyNumberConfirmationSheet.swift +++ b/SignalUI/ViewControllers/SafetyNumberConfirmationSheet.swift @@ -576,7 +576,7 @@ private class SafetyNumberCell: ContactTableViewCell { func configure(item: SafetyNumberConfirmationSheet.Item, theme: Theme.ActionSheet, viewController: UIViewController) { button.setPressedBlock { - FingerprintViewController.present(from: viewController, address: item.address) + FingerprintViewController.present(for: item.address.aci, from: viewController) } Self.databaseStorage.read { transaction in