From 0a851edba4494be5b5c93a683338cb7c28af4125 Mon Sep 17 00:00:00 2001 From: Pujan Date: Tue, 12 Sep 2023 14:25:01 +0530 Subject: [PATCH 001/583] about page animation changes --- assets/animations/Coin.json | 1 + src/components/LottieAnimations.js | 3 +- src/pages/settings/AboutPage/AboutPage.js | 134 +++++++++++----------- src/styles/colors.js | 1 + src/styles/styles.js | 3 + src/styles/themes/default.js | 1 + 6 files changed, 74 insertions(+), 69 deletions(-) create mode 100644 assets/animations/Coin.json diff --git a/assets/animations/Coin.json b/assets/animations/Coin.json new file mode 100644 index 000000000000..5f276f443a53 --- /dev/null +++ b/assets/animations/Coin.json @@ -0,0 +1 @@ +{"v":"5.9.6","fr":24,"ip":0,"op":45,"w":375,"h":375,"nm":"C","assets":[{"id":"comp_0","nm":"E","fr":24,"layers":[{"ind":2,"ty":3,"nm":"o","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[784.5,684.5,0],"to":[1.167,0,0],"ti":[-3,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":7,"s":[791.5,684.5,0],"to":[3,0,0],"ti":[1.167,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[802.5,684.5,0],"to":[-1.167,0,0],"ti":[1.833,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":15,"s":[784.5,684.5,0],"to":[-1.833,0,0],"ti":[-3,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":22,"s":[791.5,684.5,0],"to":[3,0,0],"ti":[1.167,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[802.5,684.5,0],"to":[-1.167,0,0],"ti":[1.833,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":30,"s":[784.5,684.5,0],"to":[-1.833,0,0],"ti":[-3,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":37,"s":[791.5,684.5,0],"to":[3,0,0],"ti":[-1.833,0,0]},{"t":44,"s":[802.5,684.5,0]}],"l":2},"a":{"a":0,"k":[50,49,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":15,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":22,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":30,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":37,"s":[100,100,100]},{"t":44,"s":[22,100,100]}],"l":2}},"ao":0,"ip":0,"op":45,"st":0},{"ind":3,"ty":3,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[801.5,684.5,0],"to":[-1.667,0,0],"ti":[2.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":7,"s":[791.5,684.5,0],"to":[-2.667,0,0],"ti":[-1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[785.5,684.5,0],"to":[1.667,0,0],"ti":[-1,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":15,"s":[801.5,684.5,0],"to":[1,0,0],"ti":[2.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":22,"s":[791.5,684.5,0],"to":[-2.667,0,0],"ti":[-1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[785.5,684.5,0],"to":[1.667,0,0],"ti":[-1,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":30,"s":[801.5,684.5,0],"to":[1,0,0],"ti":[2.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":37,"s":[791.5,684.5,0],"to":[-2.667,0,0],"ti":[1,0,0]},{"t":44,"s":[785.5,684.5,0]}],"l":2},"a":{"a":0,"k":[50,49,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":15,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":22,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":30,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":37,"s":[100,100,100]},{"t":44,"s":[22,100,100]}],"l":2}},"ao":0,"ip":0,"op":45,"st":0},{"ind":4,"ty":3,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[801.5,684.5,0],"to":[-1.667,0,0],"ti":[2.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":7,"s":[791.5,684.5,0],"to":[-2.667,0,0],"ti":[-1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[785.5,684.5,0],"to":[1.667,0,0],"ti":[-1,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":15,"s":[801.5,684.5,0],"to":[1,0,0],"ti":[2.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":22,"s":[791.5,684.5,0],"to":[-2.667,0,0],"ti":[-1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[785.5,684.5,0],"to":[1.667,0,0],"ti":[-1,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":30,"s":[801.5,684.5,0],"to":[1,0,0],"ti":[2.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":37,"s":[791.5,684.5,0],"to":[-2.667,0,0],"ti":[1,0,0]},{"t":44,"s":[785.5,684.5,0]}],"l":2},"a":{"a":0,"k":[50,49,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":15,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":22,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":30,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":37,"s":[100,100,100]},{"t":44,"s":[22,100,100]}],"l":2}},"ao":0,"ip":0,"op":45,"st":0},{"ind":5,"ty":3,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[801.5,684.5,0],"to":[-1.667,0,0],"ti":[2.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":7,"s":[791.5,684.5,0],"to":[-2.667,0,0],"ti":[-1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[785.5,684.5,0],"to":[1.667,0,0],"ti":[-1,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":15,"s":[801.5,684.5,0],"to":[1,0,0],"ti":[2.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":22,"s":[791.5,684.5,0],"to":[-2.667,0,0],"ti":[-1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[785.5,684.5,0],"to":[1.667,0,0],"ti":[-1,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":30,"s":[801.5,684.5,0],"to":[1,0,0],"ti":[2.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":37,"s":[791.5,684.5,0],"to":[-2.667,0,0],"ti":[1,0,0]},{"t":44,"s":[785.5,684.5,0]}],"l":2},"a":{"a":0,"k":[50,49,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":15,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":22,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":30,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":37,"s":[100,100,100]},{"t":44,"s":[22,100,100]}],"l":2}},"ao":0,"ip":0,"op":45,"st":0},{"ind":6,"ty":3,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[801.5,684.5,0],"to":[-1.667,0,0],"ti":[2.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":7,"s":[791.5,684.5,0],"to":[-2.667,0,0],"ti":[-1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[785.5,684.5,0],"to":[1.667,0,0],"ti":[-1,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":15,"s":[801.5,684.5,0],"to":[1,0,0],"ti":[2.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":22,"s":[791.5,684.5,0],"to":[-2.667,0,0],"ti":[-1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[785.5,684.5,0],"to":[1.667,0,0],"ti":[-1,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":30,"s":[801.5,684.5,0],"to":[1,0,0],"ti":[2.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":37,"s":[791.5,684.5,0],"to":[-2.667,0,0],"ti":[1,0,0]},{"t":44,"s":[785.5,684.5,0]}],"l":2},"a":{"a":0,"k":[50,49,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":15,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":22,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":30,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":37,"s":[100,100,100]},{"t":44,"s":[22,100,100]}],"l":2}},"ao":0,"ip":0,"op":45,"st":0},{"ind":7,"ty":3,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[781.5,684.5,0],"to":[1.667,0,0],"ti":[-3.5,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":7,"s":[791.5,684.5,0],"to":[3.5,0,0],"ti":[1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[802.5,684.5,0],"to":[-1.667,0,0],"ti":[1.833,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":15,"s":[781.5,684.5,0],"to":[-1.833,0,0],"ti":[-3.5,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":22,"s":[791.5,684.5,0],"to":[3.5,0,0],"ti":[1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[802.5,684.5,0],"to":[-1.667,0,0],"ti":[1.833,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":30,"s":[781.5,684.5,0],"to":[-1.833,0,0],"ti":[-3.5,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":37,"s":[791.5,684.5,0],"to":[3.5,0,0],"ti":[-1.833,0,0]},{"t":44,"s":[802.5,684.5,0]}],"l":2},"a":{"a":0,"k":[50,49,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":15,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":22,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":30,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":37,"s":[100,100,100]},{"t":44,"s":[22,100,100]}],"l":2}},"ao":0,"ip":0,"op":45,"st":0},{"ind":8,"ty":3,"nm":"s","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[809.5,684.5,0],"to":[-3,0,0],"ti":[0,0,0]},{"i":{"x":0.591,"y":0.558},"o":{"x":0.167,"y":0.167},"t":7,"s":[791.5,684.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.591,"y":0.591},"o":{"x":0.254,"y":0.254},"t":8,"s":[794.261,684.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.69,"y":1},"o":{"x":0.254,"y":0.05},"t":14,"s":[794.261,684.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":15,"s":[809.5,684.5,0],"to":[0,0,0],"ti":[2.54,0,0]},{"i":{"x":0.591,"y":0.705},"o":{"x":0.167,"y":0.167},"t":22,"s":[791.5,684.5,0],"to":[-2.54,0,0],"ti":[0,0,0]},{"i":{"x":0.591,"y":0.591},"o":{"x":0.254,"y":0.254},"t":23,"s":[794.261,684.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.69,"y":1},"o":{"x":0.254,"y":0.05},"t":29,"s":[794.261,684.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":30,"s":[809.5,684.5,0],"to":[0,0,0],"ti":[2.54,0,0]},{"i":{"x":0.591,"y":0.705},"o":{"x":0.167,"y":0.167},"t":37,"s":[791.5,684.5,0],"to":[-2.54,0,0],"ti":[0,0,0]},{"i":{"x":0.591,"y":0.591},"o":{"x":0.254,"y":0.254},"t":38,"s":[794.261,684.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":44,"s":[794.261,684.5,0]}],"l":2},"a":{"a":0,"k":[50,49,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[23,100,100]},{"i":{"x":[0.591,0.591,0.591],"y":[0.947,1,1]},"o":{"x":[0.249,0.249,0.249],"y":[0.024,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.591,0.591,0.591],"y":[1,1,1]},"o":{"x":[0.254,0.254,0.254],"y":[-19.503,0,0]},"t":8,"s":[1,1,100]},{"i":{"x":[0.69,0.69,0.69],"y":[1,1,1]},"o":{"x":[0.254,0.254,0.254],"y":[0,0,0]},"t":14,"s":[1,1,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":15,"s":[23,100,100]},{"i":{"x":[0.591,0.591,0.591],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":22,"s":[100,100,100]},{"i":{"x":[0.591,0.591,0.591],"y":[1,1,1]},"o":{"x":[0.254,0.254,0.254],"y":[-19.503,0,0]},"t":23,"s":[1,1,100]},{"i":{"x":[0.69,0.69,0.69],"y":[1,1,1]},"o":{"x":[0.254,0.254,0.254],"y":[0,0,0]},"t":29,"s":[1,1,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":30,"s":[23,100,100]},{"i":{"x":[0.591,0.591,0.591],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":37,"s":[100,100,100]},{"i":{"x":[0.591,0.591,0.591],"y":[1,1,1]},"o":{"x":[0.254,0.254,0.254],"y":[-19.503,0,0]},"t":38,"s":[1,1,100]},{"t":44,"s":[1,1,100]}],"l":2}},"ao":0,"ip":0,"op":45,"st":0},{"ind":9,"ty":3,"nm":"s","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[797.5,684.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[797.5,684.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":8,"s":[797.5,684.5,0],"to":[-3.833,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":14,"s":[774.5,684.5,0],"to":[0,0,0],"ti":[-3.833,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[797.5,684.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[797.5,684.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":23,"s":[797.5,684.5,0],"to":[-3.833,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":29,"s":[774.5,684.5,0],"to":[0,0,0],"ti":[-3.833,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[797.5,684.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[797.5,684.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":38,"s":[797.5,684.5,0],"to":[-3.833,0,0],"ti":[3.833,0,0]},{"t":44,"s":[774.5,684.5,0]}],"l":2},"a":{"a":0,"k":[50,49,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":7,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":8,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[23,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":15,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":22,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":23,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[23,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":30,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":37,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":38,"s":[100,100,100]},{"t":44,"s":[23,100,100]}],"l":2}},"ao":0,"ip":0,"op":45,"st":0},{"ind":10,"ty":3,"nm":"s","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[800.5,684.5,0],"to":[-1.25,0,0],"ti":[3.125,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[792.999,684.5,0],"to":[-3.125,0,0],"ti":[1.25,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[786.5,684.5,0],"to":[-2.5,0,0],"ti":[2.5,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[800.5,684.5,0],"to":[-1.25,0,0],"ti":[3.125,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[792.999,684.5,0],"to":[-3.125,0,0],"ti":[1.25,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[786.5,684.5,0],"to":[-2.5,0,0],"ti":[2.5,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[800.5,684.5,0],"to":[-1.25,0,0],"ti":[3.125,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[792.999,684.5,0],"to":[-3.125,0,0],"ti":[1.25,0,0]},{"t":44,"s":[786.5,684.5,0]}],"l":2},"a":{"a":0,"k":[50,49,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[60,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":7,"s":[1,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":14,"s":[66,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":15,"s":[60,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":22,"s":[1,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29,"s":[66,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":30,"s":[60,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":37,"s":[1,100,100]},{"t":44,"s":[66,100,100]}],"l":2}},"ao":0,"ip":0,"op":45,"st":0},{"ind":11,"ty":4,"nm":"o","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-71.88],[71.88,0],[0,71.88],[-71.88,0]],"o":[[0,71.88],[-71.88,0],[0,-71.88],[71.88,0]],"v":[[130.15,0],[0,130.15],[-130.15,0],[0,-130.15]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-89.87],[89.86,0],[0,89.86],[-89.87,0]],"o":[[0,89.86],[-89.87,0],[0,-89.87],[89.86,0]],"v":[[162.715,0.005],[0.005,162.715],[-162.715,0.005],[0.005,-162.715]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[792.199,686.286]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,71.88],[71.88,0],[0,-71.88],[-71.88,0]],"o":[[0,-71.88],[-71.88,0],[0,71.88],[71.88,0]],"v":[[130.395,-1.245],[0.245,-131.395],[-129.905,-1.245],[0.245,128.905]],"c":true}},"nm":"P"},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[-89.87,0],[0,-89.87],[89.86,0],[0,89.86]],"o":[[89.86,0],[0,89.86],[-89.87,0],[0,-89.87]],"v":[[0.005,-162.715],[162.715,0.005],[0.005,162.715],[-162.715,0.005]],"c":true}},"nm":"P"},{"ty":"mm","mm":1,"nm":"M"},{"ty":"fl","c":{"a":0,"k":[0.82,0.608,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[792.199,686.286]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":0,"op":45,"st":0},{"ind":12,"ty":4,"nm":"m","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.56,"y":0.384},"o":{"x":0.167,"y":0.167},"t":0,"s":[962.5,805.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.659,"y":0.408},"o":{"x":0.321,"y":0.295},"t":2,"s":[1005.921,808.071,0],"to":[0,0,0],"ti":[0,0,0]},{"t":3,"s":[1038.9,811.378,0]}],"l":2},"a":{"a":0,"k":[-2,266,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-26.336,-59.257],[1,-18],[36,-55],[0,0]],"o":[[0,0],[28,63],[-1,18],[-33.439,51.087],[0,0]],"v":[[-63.5,-32.5],[-171.5,-0.5],[-144.5,137.5],[-177.5,291.5],[-65.5,322.5]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2},"lc":1,"lj":1,"ml":4,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"S"}],"ip":0,"op":4,"st":0},{"ind":13,"ty":4,"nm":"i","parent":3,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-6.5,-6.63]],"o":[[-8.92,-7.63],[0,0]],"v":[[9.205,-1.655],[-2.705,9.285]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[737.099,759.977]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[8.35,-6.93]],"o":[[6.57,-7.4],[0,0]],"v":[[2.69,8.77],[-9.26,-1.84]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[852.074,759.612]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-6.38,5.91]],"o":[[-4.21,8.3],[0,0]],"v":[[-3.785,-8.035],[7.995,2.125]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[869.379,743.506]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-5.15,-9.03]],"o":[[-6.76,-6.92],[0,0]],"v":[[8.665,-1.765],[-3.515,8.685]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[870.189,627.466]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[5.02,6.5]],"o":[[7.43,5.19],[0,0]],"v":[[-7.705,3.25],[2.685,-8.44]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[853.379,610.762]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[4.73,8.76]],"o":[[6.59,8.94],[0,0]],"v":[[-9.48,-0.315],[4.75,-8.625]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[718.594,744.096]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-28.63,25.03]],"o":[[35.21,27.46],[0,0]],"v":[[-60.185,-13.29],[60.185,-14.17]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[794.579,782.552]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-33.12,19.71]],"o":[[30,20.35],[0,0]],"v":[[-48.255,-9.895],[48.255,-10.455]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[794.559,768.216]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[18.65,29.56]],"o":[[22.29,-33.18],[0,0]],"v":[[-11.145,49.66],[-10.075,-49.66]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[876.739,685.812]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[21.59,-22.38]],"o":[[30.57,39.25],[0,0]],"v":[[-14.57,-59.94],[-16,59.94]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[893.424,685.641]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[33,-13],[12,-24],[-20.98,-29.69],[-0.02,-0.03]],"o":[[-27.92,-20.15],[-25,10],[-15.98,32.97],[0.02,0.03],[0,0]],"v":[[85.95,-57.2],[-12.97,-71.35],[-69.97,-18.35],[-61,84.26],[-60.94,84.35]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[770.114,659.521]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-80.46,-52.29]],"o":[[-55.97,-86.78],[0,0]],"v":[[-33.18,86.875],[89.15,-34.585]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[756.524,648.596]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[757.404,632.742],[757.404,736.742]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[830.504,736.742],[830.504,715.512]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,715.511],[830.504,715.511]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,673.432],[822.204,673.432]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,695.522],[822.204,695.522]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[822.204,673.432],[822.204,695.521]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[830.504,632.742],[830.504,654.522]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,654.522],[830.504,654.522]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,695.522],[784.524,715.512]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,654.522],[784.524,673.432]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[830.504,736.742],[757.404,736.742]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[830.504,632.742],[757.404,632.742]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[36.55,30.77],[36.55,52],[-36.55,52],[-36.55,-52],[36.55,-52],[36.55,-30.22],[-9.43,-30.22],[-9.43,-11.31],[28.25,-11.31],[28.25,10.78],[-9.43,10.78],[-9.43,30.77]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[793.954,684.742]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[6.57,-7.4],[35.21,27.46],[-8.92,-7.63],[-33.12,19.71]],"o":[[8.35,-6.93],[-28.63,25.03],[-6.5,-6.63],[30,20.35],[0,0]],"v":[[48.2,-15.935],[60.15,-5.325],[-60.22,-4.445],[-48.31,-15.385],[48.2,-15.945]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[794.614,773.707]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-27.92,-20.15],[7.43,5.19],[-55.97,-86.78],[6.59,8.94],[-15.98,32.97],[-25,10]],"o":[[5.02,6.5],[-80.46,-52.29],[4.73,8.76],[-20.98,-29.69],[12,-24],[33,-13]],"v":[[91.835,-54.9],[81.445,-43.21],[-40.885,78.25],[-55.115,86.56],[-64.085,-16.05],[-7.085,-69.05]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[764.229,657.222]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-6.76,-6.92],[21.59,-22.38],[0,0],[-4.21,8.3],[18.65,29.56],[0,0]],"o":[[30.57,39.25],[0,0],[-6.38,5.91],[22.29,-33.18],[0,0],[-5.15,-9.03]],"v":[[-6.55,-59.46],[-7.98,60.42],[-8.03,60.47],[-19.81,50.31],[-18.74,-49.01],[-18.73,-49.01]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[885.404,685.161]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":0,"op":7,"st":7},{"ind":14,"ty":4,"nm":"m","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.686,"y":0.821},"o":{"x":0.339,"y":0.628},"t":12,"s":[567.9,804.293,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.436,"y":0.499},"t":13,"s":[606.246,809.717,0],"to":[0,0,0],"ti":[0,0,0]},{"t":14,"s":[625.5,811.5,0]}],"l":2},"a":{"a":0,"k":[-2,266,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.797,0.797,0.797],"y":[1,1,1]},"o":{"x":[0.431,0.431,0.431],"y":[0,0,0]},"t":12,"s":[-100,100,100]},{"t":14,"s":[-100,100,100]}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-26.336,-59.257],[1,-18],[36,-55],[0,0]],"o":[[0,0],[28,63],[-1,18],[-33.439,51.087],[0,0]],"v":[[-63.5,-32.5],[-171.5,-0.5],[-144.5,137.5],[-177.5,291.5],[-65.5,322.5]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2},"lc":1,"lj":1,"ml":4,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"S"}],"ip":11,"op":15,"st":0},{"ind":15,"ty":4,"nm":"i","parent":3,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-6.5,-6.63]],"o":[[-8.92,-7.63],[0,0]],"v":[[9.205,-1.655],[-2.705,9.285]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[737.099,759.977]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[8.35,-6.93]],"o":[[6.57,-7.4],[0,0]],"v":[[2.69,8.77],[-9.26,-1.84]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[852.074,759.612]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-6.38,5.91]],"o":[[-4.21,8.3],[0,0]],"v":[[-3.785,-8.035],[7.995,2.125]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[869.379,743.506]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-5.15,-9.03]],"o":[[-6.76,-6.92],[0,0]],"v":[[8.665,-1.765],[-3.515,8.685]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[870.189,627.466]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[5.02,6.5]],"o":[[7.43,5.19],[0,0]],"v":[[-7.705,3.25],[2.685,-8.44]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[853.379,610.762]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[4.73,8.76]],"o":[[6.59,8.94],[0,0]],"v":[[-9.48,-0.315],[4.75,-8.625]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[718.594,744.096]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-28.63,25.03]],"o":[[35.21,27.46],[0,0]],"v":[[-60.185,-13.29],[60.185,-14.17]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[794.579,782.552]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-33.12,19.71]],"o":[[30,20.35],[0,0]],"v":[[-48.255,-9.895],[48.255,-10.455]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[794.559,768.216]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[18.65,29.56]],"o":[[22.29,-33.18],[0,0]],"v":[[-11.145,49.66],[-10.075,-49.66]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[876.739,685.812]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[21.59,-22.38]],"o":[[30.57,39.25],[0,0]],"v":[[-14.57,-59.94],[-16,59.94]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[893.424,685.641]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[33,-13],[12,-24],[-20.98,-29.69],[-0.02,-0.03]],"o":[[-27.92,-20.15],[-25,10],[-15.98,32.97],[0.02,0.03],[0,0]],"v":[[85.95,-57.2],[-12.97,-71.35],[-69.97,-18.35],[-61,84.26],[-60.94,84.35]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[770.114,659.521]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-80.46,-52.29]],"o":[[-55.97,-86.78],[0,0]],"v":[[-33.18,86.875],[89.15,-34.585]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[756.524,648.596]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[757.404,632.742],[757.404,736.742]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[830.504,736.742],[830.504,715.512]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,715.511],[830.504,715.511]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,673.432],[822.204,673.432]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,695.522],[822.204,695.522]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[822.204,673.432],[822.204,695.521]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[830.504,632.742],[830.504,654.522]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,654.522],[830.504,654.522]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,695.522],[784.524,715.512]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,654.522],[784.524,673.432]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[830.504,736.742],[757.404,736.742]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[830.504,632.742],[757.404,632.742]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[36.55,30.77],[36.55,52],[-36.55,52],[-36.55,-52],[36.55,-52],[36.55,-30.22],[-9.43,-30.22],[-9.43,-11.31],[28.25,-11.31],[28.25,10.78],[-9.43,10.78],[-9.43,30.77]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[793.954,684.742]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[6.57,-7.4],[35.21,27.46],[-8.92,-7.63],[-33.12,19.71]],"o":[[8.35,-6.93],[-28.63,25.03],[-6.5,-6.63],[30,20.35],[0,0]],"v":[[48.2,-15.935],[60.15,-5.325],[-60.22,-4.445],[-48.31,-15.385],[48.2,-15.945]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[794.614,773.707]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-27.92,-20.15],[7.43,5.19],[-55.97,-86.78],[6.59,8.94],[-15.98,32.97],[-25,10]],"o":[[5.02,6.5],[-80.46,-52.29],[4.73,8.76],[-20.98,-29.69],[12,-24],[33,-13]],"v":[[91.835,-54.9],[81.445,-43.21],[-40.885,78.25],[-55.115,86.56],[-64.085,-16.05],[-7.085,-69.05]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[764.229,657.222]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-6.76,-6.92],[21.59,-22.38],[0,0],[-4.21,8.3],[18.65,29.56],[0,0]],"o":[[30.57,39.25],[0,0],[-6.38,5.91],[22.29,-33.18],[0,0],[-5.15,-9.03]],"v":[[-6.55,-59.46],[-7.98,60.42],[-8.03,60.47],[-19.81,50.31],[-18.74,-49.01],[-18.73,-49.01]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[885.404,685.161]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":6,"op":15,"st":0},{"ind":16,"ty":4,"nm":"m","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.568,"y":0.508},"o":{"x":0.167,"y":0.167},"t":15,"s":[962.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.638,"y":0.69},"o":{"x":0.284,"y":0.284},"t":16,"s":[984.064,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":18,"s":[1033.042,541.5,0]}],"l":2},"a":{"a":0,"k":[0,0,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.575,0.575,0.575],"y":[1,1,1]},"o":{"x":[0.185,0.185,0.185],"y":[0,0,0]},"t":15,"s":[100,100,100]},{"t":18,"s":[100,100,100]}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-26.336,-59.257],[1,-18],[36,-55],[0,0]],"o":[[0,0],[28,63],[-1,18],[-33.439,51.087],[0,0]],"v":[[-63.5,-32.5],[-171.5,-0.5],[-144.5,137.5],[-177.5,291.5],[-65.5,322.5]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2},"lc":1,"lj":1,"ml":4,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"S"}],"ip":15,"op":19,"st":0},{"ind":17,"ty":4,"nm":"i","parent":4,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[14.9,-0.54]],"o":[[0,0],[0,0]],"v":[[11.51,-6.635],[-11.51,6.635]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[747.544,701.067]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[20.59,-9.76]],"o":[[0,0],[0,0]],"v":[[9.475,-7.99],[-10.295,7.99]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[746.869,684.281]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[1.62,-2.98]],"o":[[0.27,8.12],[0,0]],"v":[[10.97,-9.345],[-11.24,9.345]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[745.924,667.216]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[14.36,-11.1]],"o":[[0,0],[0,0]],"v":[[18.42,3.65],[-18.42,5.55]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[745.244,637.152]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[13.55,-3.52]],"o":[[0,0],[0,0]],"v":[[10.565,5.01],[-10.565,-1.49]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[776.389,624.962]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[25.73,0.27]],"o":[[0,0],[0,0]],"v":[[18.42,9.07],[-18.42,-9.07]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[796.974,621.982]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[30.07,1.63]],"o":[[0,0],[0,0]],"v":[[18.15,12.595],[-18.15,-12.595]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[812.954,616.837]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-1.89,1.9]],"o":[[0,0],[0,0]],"v":[[-1.359,2.869],[1.359,-2.869]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[824.594,658.3]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0.55,1.62]],"o":[[0,0],[0,0]],"v":[[-0.005,3.586],[-0.275,-3.586]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[814.039,654.688]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[2.71,1.62]],"o":[[0,0],[0,0]],"v":[[1.651,3.601],[-1.651,-3.601]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[802.684,655.512]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[2.44,1.09]],"o":[[0,0],[0,0]],"v":[[2.44,3.25],[-2.44,-3.25]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[794.264,659.221]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0.768,-3.799],[10.37,0],[0,6.51],[-10.37,0],[-2.685,-2.878]],"o":[[3.52,2.02],[0,6.51],[-10.37,0],[0,-6.5],[4.2,0],[0,0]],"v":[[12.185,-9.292],[18.09,0],[-0.077,11.78],[-18.857,0],[-0.077,-11.78],[13.129,-8.362]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[811.051,670.461]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[4.956,2.427]],"o":[[0,0],[0,0]],"v":[[2.478,5.11],[-2.478,-5.11]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[815.356,692.572]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,-8.66],[-12.46,0],[-3.41,1.38],[-0.22,5.36],[0.03,0.45],[-7.28,-2.87]],"o":[[-2.552,0.272],[0,8.67],[4.55,0],[5.5,-2.22],[0.03,-0.42],[4.26,3.1],[0,0]],"v":[[-22.347,-13.273],[-33.56,-1.087],[-12.7,13.273],[-0.6,11.172],[8.7,-0.328],[8.7,-1.628],[33.56,9.722]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[809.133,699.309]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,-5.11],[0,0],[7.14,0.07],[4.87,0],[0,2.43],[-3.47,1.47],[-1.37,0],[0,0]],"o":[[10.86,4.33],[0,6.23],[0,0],[-5.33,-0.06],[-18.41,0],[0,-1.9],[0.98,-0.41],[6.23,0],[0,0]],"v":[[8.905,-10.035],[29.525,3.805],[18.685,9.225],[5.695,9.065],[-10.565,8.955],[-29.525,-0.795],[-24.895,-7.725],[-21.395,-8.385],[-13.815,-4.315]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[833.809,719.067]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-3.79,-0.28],[-0.95,-0.07],[-9.22,-0.39],[-6.11,1.6],[-1.073,-9.626]],"o":[[0,0],[0.35,0.03],[3.84,0.27],[13.32,0.56],[0,0],[0,0]],"v":[[-38.035,-3.938],[-32.075,-4.748],[-30.105,-4.598],[-8.695,-3.368],[25.885,-4.208],[38.035,5.028]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[815.239,690.52]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[-1.21,9.1],[0,0]],"v":[[4.46,-4.782],[-4.459,4.782]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[849.194,705.063]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-20.31,8.4]],"o":[[0,0],[0,0]],"v":[[-22.885,-4.47],[22.885,-3.93]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[815.799,745.221]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[4.06,0],[2.44,-3.25],[8.12,0.27],[1.9,-0.82],[-0.2,-0.41],[-18.49,-0.47],[-4.06,4.33]],"o":[[-3.52,-0.81],[-4.06,0],[0,0],[-8.13,-0.27],[0,0],[1.37,2.91],[11.37,0],[0,0]],"v":[[23.97,-5.415],[13.95,-10.555],[3.93,-4.335],[-7.17,-11.375],[-23.97,-4.055],[-23.68,-3.405],[2.85,11.645],[23.7,-0.535]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[815.254,744.266]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,-3.52],[-34.4,0],[0,7.04]],"o":[[0,0],[0,3.52],[20.31,0],[0,0]],"v":[[-26.675,-10.695],[-26.405,-2.845],[5.015,10.695],[29.385,0.675]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[790.609,770.137]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[19.5,0],[2.98,5.42]],"o":[[0,0],[0,0],[0,0],[0,0],[0,2.98],[-7.85,0],[0,0]],"v":[[19.365,-20.855],[19.365,-11.105],[19.365,-8.665],[19.365,-6.225],[19.365,0.545],[-0.135,20.855],[-19.365,13.815]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[820.129,749.957]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[5.41,-13.54],[0.27,-0.55],[0,0],[0,0],[0,0],[0,0],[-1.08,18.96],[-4.33,19.5],[-13.55,5.96],[-35.21,-5.96],[0,0],[0.54,-16.25],[4.33,-11.92],[13,10.57],[16.25,-21.13],[0,-14.63],[5.9,-2.25],[0,0]],"o":[[2.16,11.37],[-0.25,0.62],[-5.73,11.54],[5.42,-1.08],[-6.5,7.04],[8.12,0],[-31.42,3.25],[1.08,-18.96],[4.34,-19.5],[13.54,-5.96],[46.05,7.58],[0,0],[-0.54,16.25],[-3.25,-4.34],[-17.07,13],[-14.63,16.25],[0,10.51],[-2.31,0.88],[0,0]],"v":[[-33.585,40.21],[-24.105,79.75],[-24.885,81.51],[-41.715,90.58],[-35.215,77.04],[-49.835,79.75],[-40.625,66.21],[-58.505,9.87],[-69.885,-32.38],[-30.875,-56.22],[28.165,-87.09],[61.755,-43.76],[72.045,-25.88],[53.085,8.79],[49.025,-39.97],[-17.605,-28.59],[-20.045,21.79],[-36.435,40.02],[-40.355,41.29]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[788.039,677.521]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,-6.13],[0.01,-0.19],[6,0],[2.06,2.51],[0,0],[0,0],[-5.28,0]],"o":[[6.1,0.1],[0,0.19],[-0.3,5.92],[-3.5,0],[0,0],[0,0],[1.19,-4.9],[0,0]],"v":[[0.025,-11.205],[11.045,-0.005],[11.035,0.575],[-0.165,11.205],[-8.845,7.095],[-2.265,1.365],[-11.045,-2.655],[-0.165,-11.205]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[806.519,698.396]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.11,-3.76],[0,0],[4.78,0],[1.63,2],[0,0],[0,0],[-4.2,0],[-0.44,-0.06],[-0.01,0]],"o":[[0,0],[-0.24,4.72],[-2.79,0],[0,0],[0,0],[0.95,-3.92],[0.46,0],[0.01,0],[4.48,2.11]],"v":[[8.795,0.375],[8.795,0.465],[-0.125,8.935],[-7.035,5.655],[-1.795,1.095],[-8.795,-2.105],[-0.125,-8.935],[1.235,-8.835],[1.265,-8.825]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[820.939,669.846]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-4.47],[0.01,-0.12],[4.48,2.11]],"o":[[0,0.12],[-0.11,-3.76],[4.27,0.67]],"v":[[3.77,4.23],[3.76,4.6],[-3.77,-4.6]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[825.974,665.622]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-2.07,-0.84],[1.72,1.44]],"o":[[-2.38,-0.13],[2.09,0.83]],"v":[[3.14,1.245],[-3.14,-1.245]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[839.554,707.786]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-1.59],[0.13,-0.94],[4.88,0],[0.2,0.01],[0,0],[2.09,0.83],[0.43,0.53],[0,0],[0,0],[-5.08,0],[-1.64,-3.87]],"o":[[0,1.17],[-1.34,4.44],[-0.2,0],[0,0],[-2.07,-0.84],[-0.53,-0.43],[0,0],[0,0],[1.15,-4.73],[4.48,0],[0.37,1.2]],"v":[[10.505,-0.035],[10.305,3.135],[-0.025,10.795],[-0.635,10.775],[-0.655,10.775],[-6.935,8.285],[-8.375,6.835],[-2.045,1.315],[-10.505,-2.555],[-0.025,-10.795],[9.925,-4.205]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[843.349,698.257]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-1.49],[0.31,-0.99],[0,1.17],[0.37,1.2]],"o":[[0,1.09],[0.13,-0.94],[0,-1.59],[0.55,1.29]],"v":[[0.425,0.53],[-0.045,3.67],[0.155,0.5],[-0.425,-3.67]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[853.699,697.721]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.9,-2.25],[0,0],[5.41,-13.54],[0.27,-0.55],[0,0],[0,0],[0,0],[0,0],[-1.08,18.96],[-4.33,19.5],[-13.55,5.96],[-35.21,-5.96],[0,0],[0.54,-16.25],[4.33,-11.92],[13,10.57],[16.25,-21.13],[0,-14.63]],"o":[[0,0],[2.16,11.37],[-0.25,0.62],[-5.73,11.54],[5.42,-1.08],[-6.5,7.04],[8.12,0],[-31.42,3.25],[1.08,-18.96],[4.34,-19.5],[13.54,-5.96],[46.05,7.58],[0,0],[-0.54,16.25],[-3.25,-4.34],[-17.07,13],[-14.63,16.25],[0,10.51]],"v":[[-36.435,40.02],[-33.585,40.21],[-24.105,79.75],[-24.885,81.51],[-41.715,90.58],[-35.215,77.04],[-49.835,79.75],[-40.625,66.21],[-58.505,9.87],[-69.885,-32.38],[-30.875,-56.22],[28.165,-87.09],[61.755,-43.76],[72.045,-25.88],[53.085,8.79],[49.025,-39.97],[-17.605,-28.59],[-20.045,21.79]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[788.039,677.521]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[19.5,0],[20.31,0],[0,3.52],[0,0],[0,0],[-0.25,0.62],[2.16,11.37],[0,0],[0,10.51],[-14.63,16.25],[-17.07,13],[-3.25,-4.34],[13.32,0.56],[3.84,0.27],[0,0],[0,-8.66],[-12.46,0],[-3.41,1.38],[0,0],[0,-1.9],[-18.41,0],[-5.33,-0.06],[0,0],[0,0],[0,0],[4.06,0],[2.44,-3.25],[8.12,0.27],[1.9,-0.82],[-0.2,-0.41],[-18.49,-0.47],[-4.06,4.33],[0,0],[0,0]],"o":[[0,7.04],[-34.4,0],[0,-3.52],[0,0],[0.27,-0.55],[5.41,-13.54],[0,0],[5.9,-2.25],[0,-14.63],[16.25,-21.13],[13,10.57],[-6.11,1.6],[-9.22,-0.39],[0,0],[0,0],[0,8.67],[4.55,0],[0,0],[-3.47,1.47],[0,2.43],[4.87,0],[0,0],[0,0],[0,0],[-3.52,-0.81],[-4.06,0],[0,0],[-8.13,-0.27],[0,0],[1.37,2.91],[11.37,0],[0,0],[0,0],[0,2.98]],"v":[[19.16,66.495],[-5.21,76.515],[-36.63,62.975],[-36.9,55.125],[-37.68,54.715],[-36.9,52.955],[-46.38,13.415],[-49.23,13.225],[-32.84,-5.005],[-30.4,-55.385],[36.23,-66.765],[40.29,-18.005],[5.71,-17.165],[-15.7,-18.395],[-15.78,-17.465],[-25.26,-6.095],[-4.4,8.265],[7.7,6.165],[8.08,7.025],[3.45,13.955],[22.41,23.705],[38.67,23.815],[38.66,24.785],[38.66,34.535],[38.39,34.535],[28.37,29.395],[18.35,35.615],[7.25,28.575],[-9.55,35.895],[-9.26,36.545],[17.27,51.595],[38.12,39.415],[38.66,39.415],[38.66,46.185]],"c":true}},"nm":"P"},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[4.2,0],[0,-6.5],[-10.37,0],[0,6.51],[0.01,0.05],[0,0],[0,0.12],[4.27,0.67],[0.01,0]],"o":[[-10.37,0],[0,6.51],[10.37,0],[0,-0.05],[0,0],[0.01,-0.12],[0,-4.47],[-0.01,0],[-3.12,-1.46]],"v":[[10.14,-45.635],[-8.64,-33.855],[10.14,-22.075],[28.91,-33.855],[28.9,-34.005],[28.9,-34.095],[28.91,-34.465],[21.37,-43.295],[21.34,-43.305]],"c":true}},"nm":"P"},{"ty":"mm","mm":1,"nm":"M"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[800.834,704.317]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-8.13,-0.27],[0,0],[-4.06,0],[-3.52,-0.81],[0,0],[0,0]],"o":[[-20.31,8.4],[0,0],[-0.2,-0.41],[1.9,-0.82],[8.12,0.27],[2.44,-3.25],[4.06,0],[0,0],[0,0],[0,0]],"v":[[23.295,0.135],[-22.475,-0.405],[-23.815,-0.295],[-24.105,-0.945],[-7.305,-8.265],[3.795,-1.225],[13.815,-7.445],[23.835,-2.305],[24.105,-2.305],[24.105,0.135]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[815.389,741.156]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-20.31,8.4],[0,0],[0,0],[0,0],[11.37,0],[1.37,2.91]],"o":[[0,0],[0,0],[0,0],[0,0],[-4.06,4.33],[-18.49,-0.47],[0,0]],"v":[[-22.62,-7.58],[23.15,-7.04],[23.96,-7.04],[23.96,-4.6],[23.42,-4.6],[2.57,7.58],[-23.96,-7.47]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[815.534,748.331]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-0.22,5.36],[0.03,0.45],[-7.28,-2.87],[-2.38,-0.13],[0,0],[0,-5.11],[0,0],[7.14,0.07],[4.87,0],[0,2.43],[-3.47,1.47]],"o":[[5.5,-2.22],[0.03,-0.42],[4.26,3.1],[1.72,1.44],[0,0],[10.86,4.33],[0,6.23],[0,0],[-5.33,-0.06],[-18.41,0],[0,-1.9],[0,0]],"v":[[-25.275,-2.91],[-15.975,-14.41],[-15.975,-15.71],[2.605,-6.85],[8.885,-4.36],[8.905,-4.36],[29.525,9.48],[18.685,14.9],[5.695,14.74],[-10.565,14.63],[-29.525,4.88],[-24.895,-2.05]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[833.809,713.391]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[1.19,-4.9],[0,0],[0,0],[-3.5,0],[-0.3,5.92],[0,0],[5.5,-2.22],[4.55,0],[0,8.67],[0,0],[0,0],[-9.22,-0.39],[0,0]],"o":[[-5.28,0],[0,0],[0,0],[2.06,2.51],[6,0],[0,0],[-0.22,5.36],[-3.41,1.38],[-12.46,0],[0,-8.66],[0,0],[3.84,0.27],[0,0],[0,0]],"v":[[9.65,-12.06],[-1.23,-3.51],[7.55,0.51],[0.97,6.24],[9.65,10.35],[20.85,-0.28],[21.13,-0.27],[11.83,11.23],[-0.27,13.33],[-21.13,-1.03],[-11.65,-12.4],[-11.57,-13.33],[9.84,-12.1],[9.84,-12.06]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[796.704,699.252]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.952,-9.39],[0,0],[4.46,-0.653],[-0.53,-0.43],[4.26,3.1],[0.03,-0.42],[0,0],[0,0.19],[6.1,0.1],[0,0],[-6.11,1.6]],"o":[[0,0],[0.2,5.584],[0.43,0.53],[-7.28,-2.87],[0.03,0.45],[0,0],[0.01,-0.19],[0,-6.13],[0,0],[13.32,0.56],[0,0]],"v":[[23.075,-2.642],[23.455,1.938],[14.536,11.501],[4.525,7.399],[-12.365,-0.661],[-12.365,0.638],[-12.645,0.628],[-12.635,0.048],[-23.655,-11.151],[-23.655,-11.192],[10.925,-12.031]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[830.199,698.343]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-0.05],[10.37,0],[0,6.51],[-10.37,0],[-3.12,-1.46],[0.46,0],[0.95,-3.92],[0,0],[0,0],[-2.79,0],[-0.24,4.72]],"o":[[0,6.51],[-10.37,0],[0,-6.5],[4.2,0],[-0.44,-0.06],[-4.2,0],[0,0],[0,0],[1.63,2],[4.78,0],[0.01,0.05]],"v":[[18.775,0],[0.005,11.78],[-18.775,0],[0.005,-11.78],[11.205,-9.45],[9.845,-9.55],[1.175,-2.72],[8.175,0.48],[2.935,5.04],[9.845,8.32],[18.765,-0.15]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[810.969,670.462]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[12.396,3.289],[-3.289,12.396],[-12.396,-3.289],[3.288,-12.396]],"o":[[12.396,-3.289],[3.288,12.396],[-12.396,3.289],[-3.289,-12.396]],"v":[[-18.35,0],[0,-18.351],[18.351,0],[0,18.351]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[695.82,689.624]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-12.396,-3.289],[3.289,-12.396],[12.396,3.289],[-3.288,12.396]],"o":[[-12.396,3.289],[-3.288,-12.396],[12.396,-3.289],[3.289,12.396]],"v":[[18.351,0],[0,18.351],[-18.351,0],[0,-18.351]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[885.673,689.624]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":15,"op":23,"st":0},{"ind":18,"ty":4,"nm":"m","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.696,"y":0.733},"o":{"x":0.353,"y":0.301},"t":27,"s":[572.902,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.441,"y":0.517},"t":28,"s":[602.97,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[625.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":30,"s":[962.5,541.5,0]}],"l":2},"a":{"a":0,"k":[0,0,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.797,0.797,0.797],"y":[1,1,1]},"o":{"x":[0.431,0.431,0.431],"y":[0,0,0]},"t":27,"s":[-100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[-100,100,100]},{"t":30,"s":[100,100,100]}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-26.336,-59.257],[1,-18],[36,-55],[0,0]],"o":[[0,0],[28,63],[-1,18],[-33.439,51.087],[0,0]],"v":[[-63.5,-32.5],[-171.5,-0.5],[-144.5,137.5],[-177.5,291.5],[-65.5,322.5]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2},"lc":1,"lj":1,"ml":4,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"S"}],"ip":26,"op":30,"st":0},{"ind":19,"ty":4,"nm":"i","parent":4,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[14.9,-0.54]],"o":[[0,0],[0,0]],"v":[[11.51,-6.635],[-11.51,6.635]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[747.544,701.067]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[20.59,-9.76]],"o":[[0,0],[0,0]],"v":[[9.475,-7.99],[-10.295,7.99]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[746.869,684.281]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[1.62,-2.98]],"o":[[0.27,8.12],[0,0]],"v":[[10.97,-9.345],[-11.24,9.345]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[745.924,667.216]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[14.36,-11.1]],"o":[[0,0],[0,0]],"v":[[18.42,3.65],[-18.42,5.55]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[745.244,637.152]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[13.55,-3.52]],"o":[[0,0],[0,0]],"v":[[10.565,5.01],[-10.565,-1.49]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[776.389,624.962]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[25.73,0.27]],"o":[[0,0],[0,0]],"v":[[18.42,9.07],[-18.42,-9.07]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[796.974,621.982]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[30.07,1.63]],"o":[[0,0],[0,0]],"v":[[18.15,12.595],[-18.15,-12.595]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[812.954,616.837]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-1.89,1.9]],"o":[[0,0],[0,0]],"v":[[-1.359,2.869],[1.359,-2.869]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[824.594,658.3]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0.55,1.62]],"o":[[0,0],[0,0]],"v":[[-0.005,3.586],[-0.275,-3.586]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[814.039,654.688]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[2.71,1.62]],"o":[[0,0],[0,0]],"v":[[1.651,3.601],[-1.651,-3.601]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[802.684,655.512]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[2.44,1.09]],"o":[[0,0],[0,0]],"v":[[2.44,3.25],[-2.44,-3.25]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[794.264,659.221]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0.768,-3.799],[10.37,0],[0,6.51],[-10.37,0],[-2.685,-2.878]],"o":[[3.52,2.02],[0,6.51],[-10.37,0],[0,-6.5],[4.2,0],[0,0]],"v":[[12.185,-9.292],[18.09,0],[-0.077,11.78],[-18.857,0],[-0.077,-11.78],[13.129,-8.362]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[811.051,670.461]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[4.956,2.427]],"o":[[0,0],[0,0]],"v":[[2.478,5.11],[-2.478,-5.11]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[815.356,692.572]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,-8.66],[-12.46,0],[-3.41,1.38],[-0.22,5.36],[0.03,0.45],[-7.28,-2.87]],"o":[[-2.552,0.272],[0,8.67],[4.55,0],[5.5,-2.22],[0.03,-0.42],[4.26,3.1],[0,0]],"v":[[-22.347,-13.273],[-33.56,-1.087],[-12.7,13.273],[-0.6,11.172],[8.7,-0.328],[8.7,-1.628],[33.56,9.722]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[809.133,699.309]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,-5.11],[0,0],[7.14,0.07],[4.87,0],[0,2.43],[-3.47,1.47],[-1.37,0],[0,0]],"o":[[10.86,4.33],[0,6.23],[0,0],[-5.33,-0.06],[-18.41,0],[0,-1.9],[0.98,-0.41],[6.23,0],[0,0]],"v":[[8.905,-10.035],[29.525,3.805],[18.685,9.225],[5.695,9.065],[-10.565,8.955],[-29.525,-0.795],[-24.895,-7.725],[-21.395,-8.385],[-13.815,-4.315]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[833.809,719.067]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-3.79,-0.28],[-0.95,-0.07],[-9.22,-0.39],[-6.11,1.6],[-1.073,-9.626]],"o":[[0,0],[0.35,0.03],[3.84,0.27],[13.32,0.56],[0,0],[0,0]],"v":[[-38.035,-3.938],[-32.075,-4.748],[-30.105,-4.598],[-8.695,-3.368],[25.885,-4.208],[38.035,5.028]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[815.239,690.52]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[-1.21,9.1],[0,0]],"v":[[4.46,-4.782],[-4.459,4.782]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[849.194,705.063]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-20.31,8.4]],"o":[[0,0],[0,0]],"v":[[-22.885,-4.47],[22.885,-3.93]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[815.799,745.221]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[4.06,0],[2.44,-3.25],[8.12,0.27],[1.9,-0.82],[-0.2,-0.41],[-18.49,-0.47],[-4.06,4.33]],"o":[[-3.52,-0.81],[-4.06,0],[0,0],[-8.13,-0.27],[0,0],[1.37,2.91],[11.37,0],[0,0]],"v":[[23.97,-5.415],[13.95,-10.555],[3.93,-4.335],[-7.17,-11.375],[-23.97,-4.055],[-23.68,-3.405],[2.85,11.645],[23.7,-0.535]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[815.254,744.266]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,-3.52],[-34.4,0],[0,7.04]],"o":[[0,0],[0,3.52],[20.31,0],[0,0]],"v":[[-26.675,-10.695],[-26.405,-2.845],[5.015,10.695],[29.385,0.675]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[790.609,770.137]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[19.5,0],[2.98,5.42]],"o":[[0,0],[0,0],[0,0],[0,0],[0,2.98],[-7.85,0],[0,0]],"v":[[19.365,-20.855],[19.365,-11.105],[19.365,-8.665],[19.365,-6.225],[19.365,0.545],[-0.135,20.855],[-19.365,13.815]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[820.129,749.957]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[5.41,-13.54],[0.27,-0.55],[0,0],[0,0],[0,0],[0,0],[-1.08,18.96],[-4.33,19.5],[-13.55,5.96],[-35.21,-5.96],[0,0],[0.54,-16.25],[4.33,-11.92],[13,10.57],[16.25,-21.13],[0,-14.63],[5.9,-2.25],[0,0]],"o":[[2.16,11.37],[-0.25,0.62],[-5.73,11.54],[5.42,-1.08],[-6.5,7.04],[8.12,0],[-31.42,3.25],[1.08,-18.96],[4.34,-19.5],[13.54,-5.96],[46.05,7.58],[0,0],[-0.54,16.25],[-3.25,-4.34],[-17.07,13],[-14.63,16.25],[0,10.51],[-2.31,0.88],[0,0]],"v":[[-33.585,40.21],[-24.105,79.75],[-24.885,81.51],[-41.715,90.58],[-35.215,77.04],[-49.835,79.75],[-40.625,66.21],[-58.505,9.87],[-69.885,-32.38],[-30.875,-56.22],[28.165,-87.09],[61.755,-43.76],[72.045,-25.88],[53.085,8.79],[49.025,-39.97],[-17.605,-28.59],[-20.045,21.79],[-36.435,40.02],[-40.355,41.29]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[788.039,677.521]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,-6.13],[0.01,-0.19],[6,0],[2.06,2.51],[0,0],[0,0],[-5.28,0]],"o":[[6.1,0.1],[0,0.19],[-0.3,5.92],[-3.5,0],[0,0],[0,0],[1.19,-4.9],[0,0]],"v":[[0.025,-11.205],[11.045,-0.005],[11.035,0.575],[-0.165,11.205],[-8.845,7.095],[-2.265,1.365],[-11.045,-2.655],[-0.165,-11.205]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[806.519,698.396]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.11,-3.76],[0,0],[4.78,0],[1.63,2],[0,0],[0,0],[-4.2,0],[-0.44,-0.06],[-0.01,0]],"o":[[0,0],[-0.24,4.72],[-2.79,0],[0,0],[0,0],[0.95,-3.92],[0.46,0],[0.01,0],[4.48,2.11]],"v":[[8.795,0.375],[8.795,0.465],[-0.125,8.935],[-7.035,5.655],[-1.795,1.095],[-8.795,-2.105],[-0.125,-8.935],[1.235,-8.835],[1.265,-8.825]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[820.939,669.846]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-4.47],[0.01,-0.12],[4.48,2.11]],"o":[[0,0.12],[-0.11,-3.76],[4.27,0.67]],"v":[[3.77,4.23],[3.76,4.6],[-3.77,-4.6]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[825.974,665.622]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-2.07,-0.84],[1.72,1.44]],"o":[[-2.38,-0.13],[2.09,0.83]],"v":[[3.14,1.245],[-3.14,-1.245]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[839.554,707.786]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-1.59],[0.13,-0.94],[4.88,0],[0.2,0.01],[0,0],[2.09,0.83],[0.43,0.53],[0,0],[0,0],[-5.08,0],[-1.64,-3.87]],"o":[[0,1.17],[-1.34,4.44],[-0.2,0],[0,0],[-2.07,-0.84],[-0.53,-0.43],[0,0],[0,0],[1.15,-4.73],[4.48,0],[0.37,1.2]],"v":[[10.505,-0.035],[10.305,3.135],[-0.025,10.795],[-0.635,10.775],[-0.655,10.775],[-6.935,8.285],[-8.375,6.835],[-2.045,1.315],[-10.505,-2.555],[-0.025,-10.795],[9.925,-4.205]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[843.349,698.257]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-1.49],[0.31,-0.99],[0,1.17],[0.37,1.2]],"o":[[0,1.09],[0.13,-0.94],[0,-1.59],[0.55,1.29]],"v":[[0.425,0.53],[-0.045,3.67],[0.155,0.5],[-0.425,-3.67]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[853.699,697.721]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.9,-2.25],[0,0],[5.41,-13.54],[0.27,-0.55],[0,0],[0,0],[0,0],[0,0],[-1.08,18.96],[-4.33,19.5],[-13.55,5.96],[-35.21,-5.96],[0,0],[0.54,-16.25],[4.33,-11.92],[13,10.57],[16.25,-21.13],[0,-14.63]],"o":[[0,0],[2.16,11.37],[-0.25,0.62],[-5.73,11.54],[5.42,-1.08],[-6.5,7.04],[8.12,0],[-31.42,3.25],[1.08,-18.96],[4.34,-19.5],[13.54,-5.96],[46.05,7.58],[0,0],[-0.54,16.25],[-3.25,-4.34],[-17.07,13],[-14.63,16.25],[0,10.51]],"v":[[-36.435,40.02],[-33.585,40.21],[-24.105,79.75],[-24.885,81.51],[-41.715,90.58],[-35.215,77.04],[-49.835,79.75],[-40.625,66.21],[-58.505,9.87],[-69.885,-32.38],[-30.875,-56.22],[28.165,-87.09],[61.755,-43.76],[72.045,-25.88],[53.085,8.79],[49.025,-39.97],[-17.605,-28.59],[-20.045,21.79]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[788.039,677.521]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[19.5,0],[20.31,0],[0,3.52],[0,0],[0,0],[-0.25,0.62],[2.16,11.37],[0,0],[0,10.51],[-14.63,16.25],[-17.07,13],[-3.25,-4.34],[13.32,0.56],[3.84,0.27],[0,0],[0,-8.66],[-12.46,0],[-3.41,1.38],[0,0],[0,-1.9],[-18.41,0],[-5.33,-0.06],[0,0],[0,0],[0,0],[4.06,0],[2.44,-3.25],[8.12,0.27],[1.9,-0.82],[-0.2,-0.41],[-18.49,-0.47],[-4.06,4.33],[0,0],[0,0]],"o":[[0,7.04],[-34.4,0],[0,-3.52],[0,0],[0.27,-0.55],[5.41,-13.54],[0,0],[5.9,-2.25],[0,-14.63],[16.25,-21.13],[13,10.57],[-6.11,1.6],[-9.22,-0.39],[0,0],[0,0],[0,8.67],[4.55,0],[0,0],[-3.47,1.47],[0,2.43],[4.87,0],[0,0],[0,0],[0,0],[-3.52,-0.81],[-4.06,0],[0,0],[-8.13,-0.27],[0,0],[1.37,2.91],[11.37,0],[0,0],[0,0],[0,2.98]],"v":[[19.16,66.495],[-5.21,76.515],[-36.63,62.975],[-36.9,55.125],[-37.68,54.715],[-36.9,52.955],[-46.38,13.415],[-49.23,13.225],[-32.84,-5.005],[-30.4,-55.385],[36.23,-66.765],[40.29,-18.005],[5.71,-17.165],[-15.7,-18.395],[-15.78,-17.465],[-25.26,-6.095],[-4.4,8.265],[7.7,6.165],[8.08,7.025],[3.45,13.955],[22.41,23.705],[38.67,23.815],[38.66,24.785],[38.66,34.535],[38.39,34.535],[28.37,29.395],[18.35,35.615],[7.25,28.575],[-9.55,35.895],[-9.26,36.545],[17.27,51.595],[38.12,39.415],[38.66,39.415],[38.66,46.185]],"c":true}},"nm":"P"},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[4.2,0],[0,-6.5],[-10.37,0],[0,6.51],[0.01,0.05],[0,0],[0,0.12],[4.27,0.67],[0.01,0]],"o":[[-10.37,0],[0,6.51],[10.37,0],[0,-0.05],[0,0],[0.01,-0.12],[0,-4.47],[-0.01,0],[-3.12,-1.46]],"v":[[10.14,-45.635],[-8.64,-33.855],[10.14,-22.075],[28.91,-33.855],[28.9,-34.005],[28.9,-34.095],[28.91,-34.465],[21.37,-43.295],[21.34,-43.305]],"c":true}},"nm":"P"},{"ty":"mm","mm":1,"nm":"M"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[800.834,704.317]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-8.13,-0.27],[0,0],[-4.06,0],[-3.52,-0.81],[0,0],[0,0]],"o":[[-20.31,8.4],[0,0],[-0.2,-0.41],[1.9,-0.82],[8.12,0.27],[2.44,-3.25],[4.06,0],[0,0],[0,0],[0,0]],"v":[[23.295,0.135],[-22.475,-0.405],[-23.815,-0.295],[-24.105,-0.945],[-7.305,-8.265],[3.795,-1.225],[13.815,-7.445],[23.835,-2.305],[24.105,-2.305],[24.105,0.135]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[815.389,741.156]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-20.31,8.4],[0,0],[0,0],[0,0],[11.37,0],[1.37,2.91]],"o":[[0,0],[0,0],[0,0],[0,0],[-4.06,4.33],[-18.49,-0.47],[0,0]],"v":[[-22.62,-7.58],[23.15,-7.04],[23.96,-7.04],[23.96,-4.6],[23.42,-4.6],[2.57,7.58],[-23.96,-7.47]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[815.534,748.331]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-0.22,5.36],[0.03,0.45],[-7.28,-2.87],[-2.38,-0.13],[0,0],[0,-5.11],[0,0],[7.14,0.07],[4.87,0],[0,2.43],[-3.47,1.47]],"o":[[5.5,-2.22],[0.03,-0.42],[4.26,3.1],[1.72,1.44],[0,0],[10.86,4.33],[0,6.23],[0,0],[-5.33,-0.06],[-18.41,0],[0,-1.9],[0,0]],"v":[[-25.275,-2.91],[-15.975,-14.41],[-15.975,-15.71],[2.605,-6.85],[8.885,-4.36],[8.905,-4.36],[29.525,9.48],[18.685,14.9],[5.695,14.74],[-10.565,14.63],[-29.525,4.88],[-24.895,-2.05]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[833.809,713.391]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[1.19,-4.9],[0,0],[0,0],[-3.5,0],[-0.3,5.92],[0,0],[5.5,-2.22],[4.55,0],[0,8.67],[0,0],[0,0],[-9.22,-0.39],[0,0]],"o":[[-5.28,0],[0,0],[0,0],[2.06,2.51],[6,0],[0,0],[-0.22,5.36],[-3.41,1.38],[-12.46,0],[0,-8.66],[0,0],[3.84,0.27],[0,0],[0,0]],"v":[[9.65,-12.06],[-1.23,-3.51],[7.55,0.51],[0.97,6.24],[9.65,10.35],[20.85,-0.28],[21.13,-0.27],[11.83,11.23],[-0.27,13.33],[-21.13,-1.03],[-11.65,-12.4],[-11.57,-13.33],[9.84,-12.1],[9.84,-12.06]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[796.704,699.252]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.952,-9.39],[0,0],[4.46,-0.653],[-0.53,-0.43],[4.26,3.1],[0.03,-0.42],[0,0],[0,0.19],[6.1,0.1],[0,0],[-6.11,1.6]],"o":[[0,0],[0.2,5.584],[0.43,0.53],[-7.28,-2.87],[0.03,0.45],[0,0],[0.01,-0.19],[0,-6.13],[0,0],[13.32,0.56],[0,0]],"v":[[23.075,-2.642],[23.455,1.938],[14.536,11.501],[4.525,7.399],[-12.365,-0.661],[-12.365,0.638],[-12.645,0.628],[-12.635,0.048],[-23.655,-11.151],[-23.655,-11.192],[10.925,-12.031]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[830.199,698.343]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-0.05],[10.37,0],[0,6.51],[-10.37,0],[-3.12,-1.46],[0.46,0],[0.95,-3.92],[0,0],[0,0],[-2.79,0],[-0.24,4.72]],"o":[[0,6.51],[-10.37,0],[0,-6.5],[4.2,0],[-0.44,-0.06],[-4.2,0],[0,0],[0,0],[1.63,2],[4.78,0],[0.01,0.05]],"v":[[18.775,0],[0.005,11.78],[-18.775,0],[0.005,-11.78],[11.205,-9.45],[9.845,-9.55],[1.175,-2.72],[8.175,0.48],[2.935,5.04],[9.845,8.32],[18.765,-0.15]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[810.969,670.462]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[12.396,3.289],[-3.289,12.396],[-12.396,-3.289],[3.288,-12.396]],"o":[[12.396,-3.289],[3.288,12.396],[-12.396,3.289],[-3.289,-12.396]],"v":[[-18.35,0],[0,-18.351],[18.351,0],[0,18.351]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[695.82,689.624]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-12.396,-3.289],[3.289,-12.396],[12.396,3.289],[-3.288,12.396]],"o":[[-12.396,3.289],[-3.288,-12.396],[12.396,-3.289],[3.289,12.396]],"v":[[18.351,0],[0,18.351],[-18.351,0],[0,-18.351]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[885.673,689.624]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":22,"op":30,"st":0},{"ind":20,"ty":4,"nm":"m","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.622,"y":0.8},"o":{"x":0.167,"y":0.167},"t":30,"s":[962.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":35,"s":[1066.402,541.5,0]}],"l":2},"a":{"a":0,"k":[0,0,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.622,0.622,0.622],"y":[1,1,1]},"o":{"x":[0.169,0.169,0.169],"y":[0,0,0]},"t":30,"s":[100,100,100]},{"t":35,"s":[100,100,100]}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-26.336,-59.257],[1,-18],[36,-55],[0,0]],"o":[[0,0],[28,63],[-1,18],[-33.439,51.087],[0,0]],"v":[[-63.5,-32.5],[-171.5,-0.5],[-144.5,137.5],[-177.5,291.5],[-65.5,322.5]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2},"lc":1,"lj":1,"ml":4,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"S"}],"ip":30,"op":34,"st":0},{"ind":21,"ty":4,"nm":"i","parent":5,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-12.396,-3.289],[3.289,-12.396],[12.396,3.289],[-3.288,12.396]],"o":[[-12.396,3.289],[-3.288,-12.396],[12.396,-3.289],[3.289,12.396]],"v":[[18.351,0],[0,18.351],[-18.351,0],[0,-18.351]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[701.82,686.579]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-12.396,-3.289],[3.289,-12.396],[12.396,3.289],[-3.288,12.396]],"o":[[-12.396,3.289],[-3.288,-12.396],[12.396,-3.289],[3.289,12.396]],"v":[[18.351,0],[0,18.351],[-18.351,0],[0,-18.351]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[883.673,686.579]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[806.594,733.661],[806.594,720.391]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[783.044,733.661],[783.044,720.391]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[770.434,734.322],[783.044,734.322],[806.594,734.322],[816.554,734.322]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[793.654,719.721],[793.654,707.082]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[793.654,752.572],[793.654,745.271]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-4.38,5.04],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.76,-6.9],[-12.13,0],[0,0]],"o":[[6.02,-6.92],[0,0],[0,0],[0,0],[0,0],[0,0],[4.26,5.11],[0,0],[11.97,-0.03]],"v":[[23.4,2.85],[30.03,-12.28],[12.77,-12.28],[-0.17,-12.28],[-10.78,-12.28],[-30.03,-12.28],[-23.87,2.73],[-0.3,12.28],[-0.19,12.28]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[793.823,732.002]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[5.19,13.175],[-5.19,-13.175]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[814.834,693.347]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-4.54,13.1],[4.52,-13.05],[4.54,-13.1]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[772.194,693.192]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[771.094,628.812],[815.554,628.812]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[727.294,706.672],[767.654,706.672],[793.654,706.672],[820.024,706.672],[859.684,706.672]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-21.32,-6.2],[-6.31,0],[-4.55,1.64],[0,0]],"o":[[0,0],[4.35,1.27],[6.71,0],[19.33,-6.9],[0,0]],"v":[[-37.555,-12.685],[-16.235,11.795],[-0.335,13.825],[16.455,11.185],[37.555,-13.825]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[792.949,668.346]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[31.09,-30.92]],"o":[[-5.68,-7.01],[0,0]],"v":[[36.535,15.23],[-36.535,15.46]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[792.999,637.702]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[21.745,-42.355],[-1.275,-82.135],[-23.475,-42.715],[-37.405,-17.975],[-38.735,-15.615],[-67.305,35.125],[-93.775,82.135],[-0.215,82.135],[93.775,82.135],[66.565,35.105],[36.635,-16.615],[35.705,-18.225]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[793.869,671.136]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[7.13,0],[0,8.38],[-8.38,0],[-2.51,-4.93]],"o":[[0,0],[-1.63,6.63],[-8.38,0],[0,-8.38],[5.9,0],[0,0]],"v":[[3.885,1.57],[14.945,3.62],[0.225,15.17],[-14.945,0],[0.225,-15.17],[13.735,-6.87]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[792.289,660.091]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.63,6.63],[0,0],[0,0],[5.9,0],[0,-8.38],[-8.38,0]],"o":[[0,0],[0,0],[-2.51,-4.93],[-8.38,0],[0,8.38],[7.13,0]],"v":[[14.415,11.505],[3.355,9.455],[13.205,1.015],[-0.305,-7.285],[-15.475,7.885],[-0.305,23.055]],"c":true}},"nm":"P"},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[19.33,-6.9],[6.71,0],[4.35,1.27],[0,0],[0,0],[0,0],[-5.68,-7.01],[0,0]],"o":[[0,0],[-4.55,1.64],[-6.31,0],[-21.32,-6.2],[0,0],[0,0],[31.09,-30.92],[0,0],[0,0]],"v":[[37.685,2.315],[16.585,27.325],[-0.205,29.965],[-16.105,27.935],[-37.425,3.455],[-37.685,3.315],[-36.355,0.955],[36.715,0.725],[36.755,0.705]],"c":true}},"nm":"P"},{"ty":"mm","mm":1,"nm":"M"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[792.819,652.207]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-5.76,-6.9],[0,0],[0,0],[0,0]],"v":[[9.625,6.435],[9.625,7.095],[-2.985,7.095],[-3.465,7.505],[-9.625,-7.505],[9.625,-7.505],[9.625,-6.835]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[773.419,727.227]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[11.775,6.64],[11.775,7.3],[-11.775,7.3],[-11.775,6.64],[-11.775,-6.63],[-11.775,-7.3],[-1.165,-7.3],[11.775,-7.3],[11.775,-6.63]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[794.819,727.022]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[6.02,-6.92],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-8.63,-7.565],[8.63,-7.565],[2,7.565],[1.33,7.035],[-8.63,7.035],[-8.63,6.375],[-8.63,-6.895]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[815.224,727.286]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[22.61,19.875],[22.55,19.905],[-21.91,19.905],[-22.61,19.515],[-0.41,-19.905]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[793.004,608.906]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[31.09,-30.92],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-5.68,-7.01],[0,0],[0,0],[0,0],[0,0]],"v":[[22.595,-8.92],[36.555,15.21],[36.515,15.23],[-36.555,15.46],[-22.625,-9.28],[-21.925,-8.89],[22.535,-8.89]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[793.019,637.702]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-21.32,-6.2],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[25.075,-0.955],[16.015,25.195],[16.015,25.575],[-24.345,25.575],[-25.075,25.165],[3.495,-25.575],[3.755,-25.435]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[751.639,681.097]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.76,-6.9],[-12.13,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[4.26,5.11],[0,0],[0,0]],"v":[[46.78,15.505],[46.78,22.805],[46.78,23.505],[-46.78,23.505],[-20.31,-23.505],[-19.58,-23.095],[20.78,-23.095],[46.78,-23.095],[46.78,-22.685],[46.78,-10.045],[36.17,-10.045],[16.92,-10.045],[23.08,4.965],[46.65,14.515],[46.76,14.515]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[746.874,729.767]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[19.33,-6.9],[0,0]],"v":[[25.515,25.645],[24.765,26.075],[-14.895,26.075],[-14.895,25.925],[-25.275,-0.425],[-25.515,-1.065],[-4.415,-26.075]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[834.919,680.597]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-6.31,0],[-4.55,1.64],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[4.35,1.27],[6.71,0],[0,0],[0,0]],"v":[[26.185,13.42],[26.185,13.57],[-0.185,13.57],[-26.185,13.57],[-26.185,13.19],[-17.125,-12.96],[-1.225,-10.93],[15.565,-13.57],[15.805,-12.93]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[793.839,693.102]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.38,5.04],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[11.97,-0.03],[6.02,-6.92],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[19.795,-23.515],[47.005,23.515],[-46.985,23.515],[-46.985,22.815],[-46.985,15.515],[-47.005,14.525],[-23.415,5.095],[-16.785,-10.035],[-34.045,-10.035],[-46.985,-10.035],[-46.985,-22.675],[-46.985,-23.085],[-20.615,-23.085],[19.045,-23.085]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[840.639,729.757]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[11.97,-0.03],[0,0],[4.26,5.11],[0,0],[0,0],[0,0]],"o":[[0,0],[-4.38,5.04],[0,0],[-12.13,0],[0,0],[0,0],[0,0],[0,0]],"v":[[22.965,-4.98],[23.635,-4.45],[0.045,4.98],[-0.065,4.98],[-23.635,-4.57],[-23.155,-4.98],[-10.545,-4.98],[13.005,-4.98]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[793.589,739.302]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":30,"op":37,"st":0},{"ind":22,"ty":4,"nm":"m","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.426,"y":0.379},"t":41,"s":[548.543,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":44,"s":[625.5,541.5,0]}],"l":2},"a":{"a":0,"k":[0,0,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.815,0.815,0.815],"y":[1,1,1]},"o":{"x":[0.425,0.425,0.425],"y":[0,0,0]},"t":41,"s":[-100,100,100]},{"t":44,"s":[-100,100,100]}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-26.336,-59.257],[1,-18],[36,-55],[0,0]],"o":[[0,0],[28,63],[-1,18],[-33.439,51.087],[0,0]],"v":[[-63.5,-32.5],[-171.5,-0.5],[-144.5,137.5],[-177.5,291.5],[-65.5,322.5]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2},"lc":1,"lj":1,"ml":4,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"S"}],"ip":41,"op":45,"st":0},{"ind":23,"ty":4,"nm":"i","parent":5,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-12.396,-3.289],[3.289,-12.396],[12.396,3.289],[-3.288,12.396]],"o":[[-12.396,3.289],[-3.288,-12.396],[12.396,-3.289],[3.289,12.396]],"v":[[18.351,0],[0,18.351],[-18.351,0],[0,-18.351]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[701.82,686.579]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-12.396,-3.289],[3.289,-12.396],[12.396,3.289],[-3.288,12.396]],"o":[[-12.396,3.289],[-3.288,-12.396],[12.396,-3.289],[3.289,12.396]],"v":[[18.351,0],[0,18.351],[-18.351,0],[0,-18.351]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[883.673,686.579]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[806.594,733.661],[806.594,720.391]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[783.044,733.661],[783.044,720.391]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[770.434,734.322],[783.044,734.322],[806.594,734.322],[816.554,734.322]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[793.654,719.721],[793.654,707.082]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[793.654,752.572],[793.654,745.271]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-4.38,5.04],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.76,-6.9],[-12.13,0],[0,0]],"o":[[6.02,-6.92],[0,0],[0,0],[0,0],[0,0],[0,0],[4.26,5.11],[0,0],[11.97,-0.03]],"v":[[23.4,2.85],[30.03,-12.28],[12.77,-12.28],[-0.17,-12.28],[-10.78,-12.28],[-30.03,-12.28],[-23.87,2.73],[-0.3,12.28],[-0.19,12.28]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[793.823,732.002]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[5.19,13.175],[-5.19,-13.175]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[814.834,693.347]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-4.54,13.1],[4.52,-13.05],[4.54,-13.1]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[772.194,693.192]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[771.094,628.812],[815.554,628.812]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[727.294,706.672],[767.654,706.672],[793.654,706.672],[820.024,706.672],[859.684,706.672]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-21.32,-6.2],[-6.31,0],[-4.55,1.64],[0,0]],"o":[[0,0],[4.35,1.27],[6.71,0],[19.33,-6.9],[0,0]],"v":[[-37.555,-12.685],[-16.235,11.795],[-0.335,13.825],[16.455,11.185],[37.555,-13.825]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[792.949,668.346]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[31.09,-30.92]],"o":[[-5.68,-7.01],[0,0]],"v":[[36.535,15.23],[-36.535,15.46]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[792.999,637.702]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[21.745,-42.355],[-1.275,-82.135],[-23.475,-42.715],[-37.405,-17.975],[-38.735,-15.615],[-67.305,35.125],[-93.775,82.135],[-0.215,82.135],[93.775,82.135],[66.565,35.105],[36.635,-16.615],[35.705,-18.225]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[793.869,671.136]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[7.13,0],[0,8.38],[-8.38,0],[-2.51,-4.93]],"o":[[0,0],[-1.63,6.63],[-8.38,0],[0,-8.38],[5.9,0],[0,0]],"v":[[3.885,1.57],[14.945,3.62],[0.225,15.17],[-14.945,0],[0.225,-15.17],[13.735,-6.87]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[792.289,660.091]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.63,6.63],[0,0],[0,0],[5.9,0],[0,-8.38],[-8.38,0]],"o":[[0,0],[0,0],[-2.51,-4.93],[-8.38,0],[0,8.38],[7.13,0]],"v":[[14.415,11.505],[3.355,9.455],[13.205,1.015],[-0.305,-7.285],[-15.475,7.885],[-0.305,23.055]],"c":true}},"nm":"P"},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[19.33,-6.9],[6.71,0],[4.35,1.27],[0,0],[0,0],[0,0],[-5.68,-7.01],[0,0]],"o":[[0,0],[-4.55,1.64],[-6.31,0],[-21.32,-6.2],[0,0],[0,0],[31.09,-30.92],[0,0],[0,0]],"v":[[37.685,2.315],[16.585,27.325],[-0.205,29.965],[-16.105,27.935],[-37.425,3.455],[-37.685,3.315],[-36.355,0.955],[36.715,0.725],[36.755,0.705]],"c":true}},"nm":"P"},{"ty":"mm","mm":1,"nm":"M"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[792.819,652.207]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-5.76,-6.9],[0,0],[0,0],[0,0]],"v":[[9.625,6.435],[9.625,7.095],[-2.985,7.095],[-3.465,7.505],[-9.625,-7.505],[9.625,-7.505],[9.625,-6.835]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[773.419,727.227]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[11.775,6.64],[11.775,7.3],[-11.775,7.3],[-11.775,6.64],[-11.775,-6.63],[-11.775,-7.3],[-1.165,-7.3],[11.775,-7.3],[11.775,-6.63]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[794.819,727.022]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[6.02,-6.92],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-8.63,-7.565],[8.63,-7.565],[2,7.565],[1.33,7.035],[-8.63,7.035],[-8.63,6.375],[-8.63,-6.895]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[815.224,727.286]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[22.61,19.875],[22.55,19.905],[-21.91,19.905],[-22.61,19.515],[-0.41,-19.905]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[793.004,608.906]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[31.09,-30.92],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-5.68,-7.01],[0,0],[0,0],[0,0],[0,0]],"v":[[22.595,-8.92],[36.555,15.21],[36.515,15.23],[-36.555,15.46],[-22.625,-9.28],[-21.925,-8.89],[22.535,-8.89]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[793.019,637.702]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-21.32,-6.2],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[25.075,-0.955],[16.015,25.195],[16.015,25.575],[-24.345,25.575],[-25.075,25.165],[3.495,-25.575],[3.755,-25.435]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[751.639,681.097]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.76,-6.9],[-12.13,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[4.26,5.11],[0,0],[0,0]],"v":[[46.78,15.505],[46.78,22.805],[46.78,23.505],[-46.78,23.505],[-20.31,-23.505],[-19.58,-23.095],[20.78,-23.095],[46.78,-23.095],[46.78,-22.685],[46.78,-10.045],[36.17,-10.045],[16.92,-10.045],[23.08,4.965],[46.65,14.515],[46.76,14.515]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[746.874,729.767]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[19.33,-6.9],[0,0]],"v":[[25.515,25.645],[24.765,26.075],[-14.895,26.075],[-14.895,25.925],[-25.275,-0.425],[-25.515,-1.065],[-4.415,-26.075]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[834.919,680.597]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-6.31,0],[-4.55,1.64],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[4.35,1.27],[6.71,0],[0,0],[0,0]],"v":[[26.185,13.42],[26.185,13.57],[-0.185,13.57],[-26.185,13.57],[-26.185,13.19],[-17.125,-12.96],[-1.225,-10.93],[15.565,-13.57],[15.805,-12.93]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[793.839,693.102]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.38,5.04],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[11.97,-0.03],[6.02,-6.92],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[19.795,-23.515],[47.005,23.515],[-46.985,23.515],[-46.985,22.815],[-46.985,15.515],[-47.005,14.525],[-23.415,5.095],[-16.785,-10.035],[-34.045,-10.035],[-46.985,-10.035],[-46.985,-22.675],[-46.985,-23.085],[-20.615,-23.085],[19.045,-23.085]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[840.639,729.757]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[11.97,-0.03],[0,0],[4.26,5.11],[0,0],[0,0],[0,0]],"o":[[0,0],[-4.38,5.04],[0,0],[-12.13,0],[0,0],[0,0],[0,0],[0,0]],"v":[[22.965,-4.98],[23.635,-4.45],[0.045,4.98],[-0.065,4.98],[-23.635,-4.57],[-23.155,-4.98],[-10.545,-4.98],[13.005,-4.98]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[793.589,739.302]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":36,"op":45,"st":6},{"ind":24,"ty":4,"nm":"i","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-71.88],[71.88,0],[0,71.88],[-71.88,0]],"o":[[0,71.88],[-71.88,0],[0,-71.88],[71.88,0]],"v":[[130.15,0],[0,130.15],[-130.15,0],[0,-130.15]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-71.88,0],[0,-71.88],[71.88,0],[0,71.88]],"o":[[71.88,0],[0,71.88],[-71.88,0],[0,-71.88]],"v":[[0,-130.15],[130.15,0],[0,130.15],[-130.15,0]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":4,"op":9,"st":0},{"ind":25,"ty":4,"nm":"i","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-71.88],[71.88,0],[0,71.88],[-71.88,0]],"o":[[0,71.88],[-71.88,0],[0,-71.88],[71.88,0]],"v":[[130.15,0],[0,130.15],[-130.15,0],[0,-130.15]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-71.88,0],[0,-71.88],[71.88,0],[0,71.88]],"o":[[71.88,0],[0,71.88],[-71.88,0],[0,-71.88]],"v":[[0,-130.15],[130.15,0],[0,130.15],[-130.15,0]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":18,"op":25,"st":5},{"ind":26,"ty":4,"nm":"i","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-71.88],[71.88,0],[0,71.88],[-71.88,0]],"o":[[0,71.88],[-71.88,0],[0,-71.88],[71.88,0]],"v":[[130.15,0],[0,130.15],[-130.15,0],[0,-130.15]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-71.88,0],[0,-71.88],[71.88,0],[0,71.88]],"o":[[71.88,0],[0,71.88],[-71.88,0],[0,-71.88]],"v":[[0,-130.15],[130.15,0],[0,130.15],[-130.15,0]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":33,"op":40,"st":0},{"ind":27,"ty":4,"nm":"m","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.622,"y":0.8},"o":{"x":0.167,"y":0.167},"t":0,"s":[962.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.35,"y":0.002},"t":5,"s":[1066.402,541.5,0],"to":[0,0,0],"ti":[122.709,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[779.001,-1181.5,0],"to":[-123.126,0,0],"ti":[122.709,0,0]},{"i":{"x":0.65,"y":0.998},"o":{"x":0.167,"y":0.167},"t":8,"s":[779.001,-1181.5,0],"to":[-123.126,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.378,"y":0.2},"t":9,"s":[512.153,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[625.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.622,"y":0.8},"o":{"x":0.167,"y":0.167},"t":15,"s":[962.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.35,"y":0.002},"t":20,"s":[1066.402,541.5,0],"to":[0,0,0],"ti":[122.709,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[779.001,-1181.5,0],"to":[-123.126,0,0],"ti":[122.709,0,0]},{"i":{"x":0.65,"y":0.998},"o":{"x":0.167,"y":0.167},"t":23,"s":[779.001,-1181.5,0],"to":[-123.126,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.378,"y":0.2},"t":24,"s":[512.153,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[625.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.622,"y":0.8},"o":{"x":0.167,"y":0.167},"t":30,"s":[962.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.35,"y":0.002},"t":35,"s":[1066.402,541.5,0],"to":[0,0,0],"ti":[122.709,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[779.001,-1181.5,0],"to":[-123.126,0,0],"ti":[122.709,0,0]},{"i":{"x":0.65,"y":0.998},"o":{"x":0.167,"y":0.167},"t":38,"s":[779.001,-1181.5,0],"to":[-123.126,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.378,"y":0.2},"t":39,"s":[512.153,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":44,"s":[625.5,541.5,0]}],"l":2},"a":{"a":0,"k":[0,0,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.622,0.622,0.622],"y":[1,1,1]},"o":{"x":[0.169,0.169,0.169],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.35,0.35,0.35],"y":[0,0,0]},"t":5,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[0,0,100]},{"i":{"x":[0.65,0.65,0.65],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":8,"s":[0,0,100]},{"i":{"x":[0.831,0.831,0.831],"y":[1,1,1]},"o":{"x":[0.378,0.378,0.378],"y":[0,0,0]},"t":9,"s":[-100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[-100,100,100]},{"i":{"x":[0.622,0.622,0.622],"y":[1,1,1]},"o":{"x":[0.169,0.169,0.169],"y":[0,0,0]},"t":15,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.35,0.35,0.35],"y":[0,0,0]},"t":20,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":21,"s":[0,0,100]},{"i":{"x":[0.65,0.65,0.65],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":23,"s":[0,0,100]},{"i":{"x":[0.831,0.831,0.831],"y":[1,1,1]},"o":{"x":[0.378,0.378,0.378],"y":[0,0,0]},"t":24,"s":[-100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[-100,100,100]},{"i":{"x":[0.622,0.622,0.622],"y":[1,1,1]},"o":{"x":[0.169,0.169,0.169],"y":[0,0,0]},"t":30,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.35,0.35,0.35],"y":[0,0,0]},"t":35,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":36,"s":[0,0,100]},{"i":{"x":[0.65,0.65,0.65],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":38,"s":[0,0,100]},{"i":{"x":[0.831,0.831,0.831],"y":[1,1,1]},"o":{"x":[0.378,0.378,0.378],"y":[0,0,0]},"t":39,"s":[-100,100,100]},{"t":44,"s":[-100,100,100]}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-26.336,-59.257],[1,-18],[36,-55],[0,0]],"o":[[0,0],[28,63],[-1,18],[-33.439,51.087],[0,0]],"v":[[-63.5,-32.5],[-171.5,-0.5],[-144.5,137.5],[-177.5,291.5],[-65.5,322.5]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2},"lc":1,"lj":1,"ml":4,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"S"}],"ip":0,"op":45,"st":0},{"ind":28,"ty":4,"nm":"i","parent":6,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-71.88],[71.88,0],[0,71.88],[-71.88,0]],"o":[[0,71.88],[-71.88,0],[0,-71.88],[71.88,0]],"v":[[130.15,0],[0,130.15],[-130.15,0],[0,-130.15]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-71.88,0],[0,-71.88],[71.88,0],[0,71.88]],"o":[[71.88,0],[0,71.88],[-71.88,0],[0,-71.88]],"v":[[0,-130.15],[130.15,0],[0,130.15],[-130.15,0]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":0,"op":45,"st":0},{"ind":29,"ty":4,"nm":"m","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.622,"y":0.8},"o":{"x":0.167,"y":0.167},"t":0,"s":[962.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.35,"y":0.002},"t":5,"s":[1066.402,541.5,0],"to":[0,0,0],"ti":[122.709,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[779.001,-1181.5,0],"to":[-123.126,0,0],"ti":[122.709,0,0]},{"i":{"x":0.65,"y":0.998},"o":{"x":0.167,"y":0.167},"t":8,"s":[779.001,-1181.5,0],"to":[-123.126,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.378,"y":0.2},"t":9,"s":[512.153,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[625.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.622,"y":0.8},"o":{"x":0.167,"y":0.167},"t":15,"s":[962.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.35,"y":0.002},"t":20,"s":[1066.402,541.5,0],"to":[0,0,0],"ti":[122.709,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[779.001,-1181.5,0],"to":[-123.126,0,0],"ti":[122.709,0,0]},{"i":{"x":0.65,"y":0.998},"o":{"x":0.167,"y":0.167},"t":23,"s":[779.001,-1181.5,0],"to":[-123.126,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.378,"y":0.2},"t":24,"s":[512.153,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[625.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.622,"y":0.8},"o":{"x":0.167,"y":0.167},"t":30,"s":[962.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.35,"y":0.002},"t":35,"s":[1066.402,541.5,0],"to":[0,0,0],"ti":[122.709,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[779.001,-1181.5,0],"to":[-123.126,0,0],"ti":[122.709,0,0]},{"i":{"x":0.65,"y":0.998},"o":{"x":0.167,"y":0.167},"t":38,"s":[779.001,-1181.5,0],"to":[-123.126,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.378,"y":0.2},"t":39,"s":[512.153,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":44,"s":[625.5,541.5,0]}],"l":2},"a":{"a":0,"k":[0,0,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.622,0.622,0.622],"y":[1,1,1]},"o":{"x":[0.169,0.169,0.169],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.35,0.35,0.35],"y":[0,0,0]},"t":5,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[0,0,100]},{"i":{"x":[0.65,0.65,0.65],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":8,"s":[0,0,100]},{"i":{"x":[0.831,0.831,0.831],"y":[1,1,1]},"o":{"x":[0.378,0.378,0.378],"y":[0,0,0]},"t":9,"s":[-100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[-100,100,100]},{"i":{"x":[0.622,0.622,0.622],"y":[1,1,1]},"o":{"x":[0.169,0.169,0.169],"y":[0,0,0]},"t":15,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.35,0.35,0.35],"y":[0,0,0]},"t":20,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":21,"s":[0,0,100]},{"i":{"x":[0.65,0.65,0.65],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":23,"s":[0,0,100]},{"i":{"x":[0.831,0.831,0.831],"y":[1,1,1]},"o":{"x":[0.378,0.378,0.378],"y":[0,0,0]},"t":24,"s":[-100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[-100,100,100]},{"i":{"x":[0.622,0.622,0.622],"y":[1,1,1]},"o":{"x":[0.169,0.169,0.169],"y":[0,0,0]},"t":30,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.35,0.35,0.35],"y":[0,0,0]},"t":35,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":36,"s":[0,0,100]},{"i":{"x":[0.65,0.65,0.65],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":38,"s":[0,0,100]},{"i":{"x":[0.831,0.831,0.831],"y":[1,1,1]},"o":{"x":[0.378,0.378,0.378],"y":[0,0,0]},"t":39,"s":[-100,100,100]},{"t":44,"s":[-100,100,100]}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-26.336,-59.257],[1,-18],[36,-55],[0,0]],"o":[[0,0],[28,63],[-1,18],[-33.439,51.087],[0,0]],"v":[[-63.5,-32.5],[-171.5,-0.5],[-144.5,137.5],[-177.5,291.5],[-65.5,322.5]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2},"lc":1,"lj":1,"ml":4,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"S"}],"ip":0,"op":45,"st":0},{"ind":30,"ty":4,"nm":"i","parent":6,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-71.88],[71.88,0],[0,71.88],[-71.88,0]],"o":[[0,71.88],[-71.88,0],[0,-71.88],[71.88,0]],"v":[[130.15,0],[0,130.15],[-130.15,0],[0,-130.15]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-71.88,0],[0,-71.88],[71.88,0],[0,71.88]],"o":[[71.88,0],[0,71.88],[-71.88,0],[0,-71.88]],"v":[[0,-130.15],[130.15,0],[0,130.15],[-130.15,0]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":0,"op":45,"st":0},{"ind":31,"ty":4,"nm":"i","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-82.035],[82.035,0],[0,82.035],[-82.035,0]],"o":[[0,82.035],[-82.035,0],[0,-82.035],[82.035,0]],"v":[[148.537,0],[0,148.537],[-148.537,0],[0,-148.537]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[0,0.129,0.251,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[792.443,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-82.035,0],[0,-82.035],[82.035,0],[0,82.035]],"o":[[82.035,0],[0,82.035],[-82.035,0],[0,-82.035]],"v":[[0,-148.537],[148.537,0],[0,148.537],[-148.537,0]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0,0.129,0.251,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":0,"op":45,"st":0},{"ind":32,"ty":4,"nm":"s","parent":8,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-339.29,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[-100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[491.024,827.341],[491.034,827.341],[572.824,827.341]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[455.244,799.401],[572.824,799.401]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[437.134,777.062],[437.144,777.062],[572.824,777.062]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[421.444,747.612],[572.824,747.612]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[414.524,726.642],[572.824,726.642]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[486.814,548.082],[572.824,548.082]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[452.634,577.052],[572.824,577.052]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[434.964,599.802],[572.824,599.802]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[421.444,626.812],[572.824,626.812]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[414.524,650.121],[572.824,650.121]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[410.144,676.802],[572.824,676.802]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[410.144,700.901],[572.824,700.901]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[23.89,13.78]],"o":[[0,0],[-29.56,0],[0,0]],"v":[[40.895,10.83],[40.275,10.83],[-40.895,-10.83]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[531.929,838.172]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[10.53,10.89],[5.37,7.98]],"o":[[-13.21,-7.62],[-6.67,-6.89],[0,0]],"v":[[26.94,25.14],[-8.84,-2.8],[-26.94,-25.14]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[464.084,802.202]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[4.23,10.4],[1.84,7.2],[0.79,8.8],[0,4.92],[-0.19,3.14],[-2,8.71],[-2.98,7.52],[-5.38,8.51],[-6.5,7.11],[-12.82,7.94],[-31.38,0],[0,0]],"o":[[-6.19,-9.19],[-2.77,-6.77],[-2.13,-8.34],[-0.42,-4.81],[0,-3.19],[0.52,-9.19],[1.83,-8.03],[3.74,-9.48],[5.17,-8.19],[10.13,-11.08],[24.85,-15.39],[0,0],[0,0]],"v":[[-54.02,126.745],[-69.71,97.295],[-76.63,76.325],[-81.03,50.585],[-81.67,35.975],[-81.39,26.465],[-77.58,-0.415],[-70.35,-23.765],[-56.63,-50.795],[-39.08,-73.785],[-4.49,-102.475],[81.05,-126.745],[81.67,-126.745]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[491.154,650.317]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-31.38,0]],"o":[[0,0],[0,0],[0,0],[24.85,-15.39],[0,0]],"v":[[43.08,-12.255],[43.08,12.255],[-42.93,12.255],[-43.08,12.015],[42.46,-12.255]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[529.744,535.826]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-12.82,7.94],[0,0]],"o":[[0,0],[0,0],[0,0],[10.13,-11.08],[0,0],[0,0]],"v":[[60.375,-14.365],[60.375,14.605],[-59.815,14.605],[-60.375,14.085],[-25.785,-14.605],[-25.635,-14.365]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[512.449,562.447]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-6.5,7.11],[0,0]],"o":[[0,0],[0,0],[0,0],[5.17,-8.19],[0,0],[0,0]],"v":[[69.15,-11.115],[69.15,11.635],[-68.71,11.635],[-69.15,11.355],[-51.6,-11.635],[-51.04,-11.115]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[503.674,588.167]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-5.38,8.51],[0,0]],"o":[[0,0],[0,0],[0,0],[3.74,-9.48],[0,0],[0,0]],"v":[[76.01,-13.365],[76.01,13.645],[-75.37,13.645],[-76.01,13.385],[-62.29,-13.645],[-61.85,-13.365]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[496.814,613.167]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2.98,7.52],[0,0]],"o":[[0,0],[0,0],[0,0],[1.83,-8.03],[0,0],[0,0]],"v":[[79.625,-11.525],[79.625,11.785],[-78.675,11.785],[-79.625,11.565],[-72.395,-11.785],[-71.755,-11.525]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[493.199,638.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2,8.71],[0,0]],"o":[[0,0],[0,0],[0,0],[0.52,-9.19],[0,0],[0,0]],"v":[[81.53,-13.23],[81.53,13.45],[-81.15,13.45],[-81.53,13.43],[-77.72,-13.45],[-76.77,-13.23]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[491.294,663.352]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,4.92],[-0.19,3.14],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.42,-4.81],[0,-3.19],[0,0],[0,0]],"v":[[81.67,-12.04],[81.67,12.06],[-81.01,12.06],[-81.03,12.06],[-81.67,-2.55],[-81.39,-12.06],[-81.01,-12.04]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[491.154,688.842]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0.79,8.8],[0,0]],"o":[[0,0],[0,0],[-2.13,-8.34],[0,0],[0,0]],"v":[[81.35,-12.87],[81.35,12.87],[-76.95,12.87],[-81.35,-12.87],[-81.33,-12.87]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[491.474,713.771]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[1.84,7.2]],"o":[[0,0],[0,0],[-2.77,-6.77],[0,0]],"v":[[79.15,-10.485],[79.15,10.485],[-72.23,10.485],[-79.15,-10.485]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[493.674,737.127]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[4.23,10.4]],"o":[[0,0],[0,0],[0,0],[-6.19,-9.19],[0,0]],"v":[[75.69,-14.725],[75.69,14.725],[-59.99,14.725],[-60,14.725],[-75.69,-14.725]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[497.134,762.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[5.37,7.98]],"o":[[0,0],[0,0],[-6.67,-6.89],[0,0]],"v":[[67.84,-11.17],[67.84,11.17],[-49.74,11.17],[-67.84,-11.17]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[504.984,788.232]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[10.53,10.89]],"o":[[0,0],[0,0],[0,0],[-13.21,-7.62],[0,0]],"v":[[58.79,-13.97],[58.79,13.97],[-23,13.97],[-23.01,13.97],[-58.79,-13.97]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[514.034,813.371]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[23.89,13.78]],"o":[[0,0],[0,0],[-29.56,0],[0,0]],"v":[[40.895,-10.83],[40.895,10.83],[40.275,10.83],[-40.895,-10.83]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[531.929,838.172]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":0,"op":45,"st":0},{"ind":33,"ty":4,"nm":"s","parent":9,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[440.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[491.024,827.341],[491.034,827.341],[572.824,827.341]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[455.244,799.401],[572.824,799.401]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[437.134,777.062],[437.144,777.062],[572.824,777.062]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[421.444,747.612],[572.824,747.612]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[414.524,726.642],[572.824,726.642]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[486.814,548.082],[572.824,548.082]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[452.634,577.052],[572.824,577.052]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[434.964,599.802],[572.824,599.802]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[421.444,626.812],[572.824,626.812]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[414.524,650.121],[572.824,650.121]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[410.144,676.802],[572.824,676.802]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[410.144,700.901],[572.824,700.901]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[23.89,13.78]],"o":[[0,0],[-29.56,0],[0,0]],"v":[[40.895,10.83],[40.275,10.83],[-40.895,-10.83]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[531.929,838.172]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[10.53,10.89],[5.37,7.98]],"o":[[-13.21,-7.62],[-6.67,-6.89],[0,0]],"v":[[26.94,25.14],[-8.84,-2.8],[-26.94,-25.14]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[464.084,802.202]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[4.23,10.4],[1.84,7.2],[0.79,8.8],[0,4.92],[-0.19,3.14],[-2,8.71],[-2.98,7.52],[-5.38,8.51],[-6.5,7.11],[-12.82,7.94],[-31.38,0],[0,0]],"o":[[-6.19,-9.19],[-2.77,-6.77],[-2.13,-8.34],[-0.42,-4.81],[0,-3.19],[0.52,-9.19],[1.83,-8.03],[3.74,-9.48],[5.17,-8.19],[10.13,-11.08],[24.85,-15.39],[0,0],[0,0]],"v":[[-54.02,126.745],[-69.71,97.295],[-76.63,76.325],[-81.03,50.585],[-81.67,35.975],[-81.39,26.465],[-77.58,-0.415],[-70.35,-23.765],[-56.63,-50.795],[-39.08,-73.785],[-4.49,-102.475],[81.05,-126.745],[81.67,-126.745]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[491.154,650.317]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-31.38,0]],"o":[[0,0],[0,0],[0,0],[24.85,-15.39],[0,0]],"v":[[43.08,-12.255],[43.08,12.255],[-42.93,12.255],[-43.08,12.015],[42.46,-12.255]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[529.744,535.826]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-12.82,7.94],[0,0]],"o":[[0,0],[0,0],[0,0],[10.13,-11.08],[0,0],[0,0]],"v":[[60.375,-14.365],[60.375,14.605],[-59.815,14.605],[-60.375,14.085],[-25.785,-14.605],[-25.635,-14.365]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[512.449,562.447]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-6.5,7.11],[0,0]],"o":[[0,0],[0,0],[0,0],[5.17,-8.19],[0,0],[0,0]],"v":[[69.15,-11.115],[69.15,11.635],[-68.71,11.635],[-69.15,11.355],[-51.6,-11.635],[-51.04,-11.115]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[503.674,588.167]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-5.38,8.51],[0,0]],"o":[[0,0],[0,0],[0,0],[3.74,-9.48],[0,0],[0,0]],"v":[[76.01,-13.365],[76.01,13.645],[-75.37,13.645],[-76.01,13.385],[-62.29,-13.645],[-61.85,-13.365]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[496.814,613.167]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2.98,7.52],[0,0]],"o":[[0,0],[0,0],[0,0],[1.83,-8.03],[0,0],[0,0]],"v":[[79.625,-11.525],[79.625,11.785],[-78.675,11.785],[-79.625,11.565],[-72.395,-11.785],[-71.755,-11.525]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[493.199,638.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2,8.71],[0,0]],"o":[[0,0],[0,0],[0,0],[0.52,-9.19],[0,0],[0,0]],"v":[[81.53,-13.23],[81.53,13.45],[-81.15,13.45],[-81.53,13.43],[-77.72,-13.45],[-76.77,-13.23]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[491.294,663.352]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,4.92],[-0.19,3.14],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.42,-4.81],[0,-3.19],[0,0],[0,0]],"v":[[81.67,-12.04],[81.67,12.06],[-81.01,12.06],[-81.03,12.06],[-81.67,-2.55],[-81.39,-12.06],[-81.01,-12.04]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[491.154,688.842]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0.79,8.8],[0,0]],"o":[[0,0],[0,0],[-2.13,-8.34],[0,0],[0,0]],"v":[[81.35,-12.87],[81.35,12.87],[-76.95,12.87],[-81.35,-12.87],[-81.33,-12.87]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[491.474,713.771]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[1.84,7.2]],"o":[[0,0],[0,0],[-2.77,-6.77],[0,0]],"v":[[79.15,-10.485],[79.15,10.485],[-72.23,10.485],[-79.15,-10.485]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[493.674,737.127]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[4.23,10.4]],"o":[[0,0],[0,0],[0,0],[-6.19,-9.19],[0,0]],"v":[[75.69,-14.725],[75.69,14.725],[-59.99,14.725],[-60,14.725],[-75.69,-14.725]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[497.134,762.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[5.37,7.98]],"o":[[0,0],[0,0],[-6.67,-6.89],[0,0]],"v":[[67.84,-11.17],[67.84,11.17],[-49.74,11.17],[-67.84,-11.17]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[504.984,788.232]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[10.53,10.89]],"o":[[0,0],[0,0],[0,0],[-13.21,-7.62],[0,0]],"v":[[58.79,-13.97],[58.79,13.97],[-23,13.97],[-23.01,13.97],[-58.79,-13.97]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[514.034,813.371]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[23.89,13.78]],"o":[[0,0],[0,0],[-29.56,0],[0,0]],"v":[[40.895,-10.83],[40.895,10.83],[40.275,10.83],[-40.895,-10.83]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[531.929,838.172]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":0,"op":45,"st":0},{"ind":34,"ty":4,"nm":"s","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[421.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[569.914,827.341],[610.524,827.341],[610.564,827.341]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,799.401],[610.244,799.401]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,777.062],[610.444,777.062]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,747.612],[610.244,747.612]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,726.642],[610.364,726.642]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,700.901],[610.244,700.901]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,676.781],[610.244,676.781]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[569.914,650.121],[610.234,650.121],[610.244,650.121]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,626.812],[609.914,626.812]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,599.802],[609.914,599.802]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,577.052],[609.744,577.052]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,548.082],[609.744,548.082]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.27,-162.675],[-0.23,-138.205],[-0.18,-109.235],[-0.14,-86.485],[-0.1,-59.475],[-0.06,-36.165],[-0.02,-9.505],[0.02,14.615],[0.07,40.355],[0.1,61.325],[0.15,90.775],[0.19,113.115],[0.23,141.055],[0.27,162.675]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[610.294,686.286]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[610.564,848.961],[569.914,848.961]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[610.024,523.612],[569.914,523.612]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[569.914,523.612],[569.914,548.082],[569.914,577.052],[569.914,599.802],[569.914,626.812],[569.914,650.122],[569.914,676.781],[569.914,700.901],[569.914,726.641],[569.914,747.612],[569.914,777.062],[569.914,799.401],[569.914,827.342],[569.914,848.962],[569.914,849.002]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.035,-12.235],[20.075,12.235],[19.755,12.235],[-20.075,12.235],[-20.075,-12.235]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[589.989,535.847]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.05,-14.485],[20.1,14.485],[19.73,14.485],[-20.1,14.485],[-20.1,-14.485],[19.73,-14.485]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[590.014,562.567]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.08,-11.375],[20.12,11.375],[19.88,11.375],[-20.12,11.375],[-20.12,-11.375],[19.71,-11.375]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[590.034,588.427]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.1,-13.505],[20.14,13.505],[19.86,13.505],[-20.14,13.505],[-20.14,-13.505],[19.86,-13.505]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[590.054,613.307]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.12,-11.655],[20.16,11.655],[-20.16,11.655],[-20.16,-11.655],[19.84,-11.655]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[590.074,638.467]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.14,-13.33],[20.18,13.33],[20.15,13.33],[-20.18,13.33],[-20.18,-13.33]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[590.094,663.451]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.16,-12.06],[20.2,12.06],[20.13,12.06],[-20.2,12.06],[-20.2,-12.06],[20.13,-12.06]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[590.114,688.841]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.175,-12.87],[20.225,12.87],[-20.225,12.87],[-20.225,-12.87],[20.105,-12.87]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[590.139,713.771]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.21,-10.485],[20.24,10.485],[20.09,10.485],[-20.24,10.485],[-20.24,-10.485]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[590.154,737.127]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.215,-14.725],[20.265,14.725],[-20.265,14.725],[-20.265,-14.725],[20.065,-14.725]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[590.179,762.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.245,-11.17],[20.285,11.17],[20.045,11.17],[-20.285,11.17],[-20.285,-11.17]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[590.199,788.232]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.265,-13.97],[20.305,13.97],[-20.305,13.97],[-20.305,-13.97],[20.025,-13.97]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[590.219,813.371]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[20.285,-10.81],[20.325,10.81],[-20.325,10.81],[-20.325,-10.81]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[590.239,838.151]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":0,"op":45,"st":0}]}],"layers":[{"ind":1,"ty":0,"nm":"E","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[355.5,43.5,0],"l":2},"a":{"a":0,"k":[962.5,541.5,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"w":1925,"h":1083,"ip":0,"op":45,"st":0}],"markers":[]} \ No newline at end of file diff --git a/src/components/LottieAnimations.js b/src/components/LottieAnimations.js index 274d60306393..adb7d142c725 100644 --- a/src/components/LottieAnimations.js +++ b/src/components/LottieAnimations.js @@ -6,5 +6,6 @@ const ReviewingBankInfo = require('../../assets/animations/ReviewingBankInfo.jso const WorkspacePlanet = require('../../assets/animations/WorkspacePlanet.json'); const SaveTheWorld = require('../../assets/animations/SaveTheWorld.json'); const Safe = require('../../assets/animations/Safe.json'); +const Coin = require('../../assets/animations/Coin.json'); -export {ExpensifyLounge, Fireworks, Hands, PreferencesDJ, ReviewingBankInfo, SaveTheWorld, WorkspacePlanet, Safe}; +export {ExpensifyLounge, Fireworks, Hands, PreferencesDJ, ReviewingBankInfo, SaveTheWorld, WorkspacePlanet, Safe, Coin}; diff --git a/src/pages/settings/AboutPage/AboutPage.js b/src/pages/settings/AboutPage/AboutPage.js index 4af48b896fe0..7a8bcb3bcd50 100644 --- a/src/pages/settings/AboutPage/AboutPage.js +++ b/src/pages/settings/AboutPage/AboutPage.js @@ -2,7 +2,6 @@ import _ from 'underscore'; import React from 'react'; import {ScrollView, View} from 'react-native'; import DeviceInfo from 'react-native-device-info'; -import HeaderWithBackButton from '../../../components/HeaderWithBackButton'; import Navigation from '../../../libs/Navigation/Navigation'; import ROUTES from '../../../ROUTES'; import styles from '../../../styles/styles'; @@ -10,7 +9,6 @@ import Text from '../../../components/Text'; import TextLink from '../../../components/TextLink'; import CONST from '../../../CONST'; import * as Expensicons from '../../../components/Icon/Expensicons'; -import ScreenWrapper from '../../../components/ScreenWrapper'; import withLocalize, {withLocalizePropTypes} from '../../../components/withLocalize'; import withWindowDimensions, {windowDimensionsPropTypes} from '../../../components/withWindowDimensions'; import MenuItem from '../../../components/MenuItem'; @@ -23,6 +21,9 @@ import * as ReportActionContextMenu from '../../home/report/ContextMenu/ReportAc import {CONTEXT_MENU_TYPES} from '../../home/report/ContextMenu/ContextMenuActions'; import * as KeyboardShortcuts from '../../../libs/actions/KeyboardShortcuts'; import * as Environment from '../../../libs/Environment/Environment'; +import IllustratedHeaderPageLayout from '../../../components/IllustratedHeaderPageLayout'; +import themeColors from '../../../styles/themes/default'; +import * as LottieAnimations from '../../../components/LottieAnimations'; const propTypes = { ...withLocalizePropTypes, @@ -80,73 +81,70 @@ function AboutPage(props) { }, ]; + const overlayContent = () => ( + + + v{Environment.isInternalTestBuild() ? `${pkg.version} PR:${CONST.PULL_REQUEST_NUMBER}${getFlavor()}` : `${pkg.version}${getFlavor()}`} + + + ); + return ( - - {({safeAreaPaddingBottomStyle}) => ( - <> - Navigation.goBack(ROUTES.SETTINGS)} - /> - - - - - - - v{Environment.isInternalTestBuild() ? `${pkg.version} PR:${CONST.PULL_REQUEST_NUMBER}${getFlavor()}` : `${pkg.version}${getFlavor()}`} - - {props.translate('initialSettingsPage.aboutPage.description')} - - - {_.map(menuItems, (item) => ( - item.action()} - shouldBlockSelection={Boolean(item.link)} - onSecondaryInteraction={ - !_.isEmpty(item.link) ? (e) => ReportActionContextMenu.showContextMenu(CONTEXT_MENU_TYPES.LINK, e, item.link, popoverAnchor) : undefined - } - ref={(el) => (popoverAnchor = el)} - shouldShowRightIcon - /> - ))} - - - - {props.translate('initialSettingsPage.readTheTermsAndPrivacy.phrase1')}{' '} - - {props.translate('initialSettingsPage.readTheTermsAndPrivacy.phrase2')} - {' '} - {props.translate('initialSettingsPage.readTheTermsAndPrivacy.phrase3')}{' '} - - {props.translate('initialSettingsPage.readTheTermsAndPrivacy.phrase4')} - - . - - - - - )} - + Navigation.goBack(ROUTES.SETTINGS)} + illustration={LottieAnimations.Coin} + backgroundColor={themeColors.PAGE_BACKGROUND_COLORS[ROUTES.SETTINGS_ABOUT]} + overlayContent={overlayContent} + > + + + + {props.translate('initialSettingsPage.aboutPage.description')} + + {_.map(menuItems, (item) => ( + item.action()} + shouldBlockSelection={Boolean(item.link)} + onSecondaryInteraction={ + !_.isEmpty(item.link) ? (e) => ReportActionContextMenu.showContextMenu(CONTEXT_MENU_TYPES.LINK, e, item.link, popoverAnchor) : undefined + } + ref={(el) => (popoverAnchor = el)} + shouldShowRightIcon + /> + ))} + + + + {props.translate('initialSettingsPage.readTheTermsAndPrivacy.phrase1')}{' '} + + {props.translate('initialSettingsPage.readTheTermsAndPrivacy.phrase2')} + {' '} + {props.translate('initialSettingsPage.readTheTermsAndPrivacy.phrase3')}{' '} + + {props.translate('initialSettingsPage.readTheTermsAndPrivacy.phrase4')} + + . + + + + ); } diff --git a/src/styles/colors.js b/src/styles/colors.js index 2c70cb4a8a78..b2ffd943a337 100644 --- a/src/styles/colors.js +++ b/src/styles/colors.js @@ -55,6 +55,7 @@ export default { yellow200: '#FFED8F', yellow400: '#FED607', + yellow600: '#D18000', yellow700: '#722B03', yellow800: '#401102', diff --git a/src/styles/styles.js b/src/styles/styles.js index 1c1340600a51..32c300fc52b0 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -3923,6 +3923,9 @@ const styles = { height: 30, width: '100%', }, + versionTextColor: { + color: `${Colors.ivory}cc`, + } }; export default styles; diff --git a/src/styles/themes/default.js b/src/styles/themes/default.js index 5f69a7746cdc..a686a1b32fd7 100644 --- a/src/styles/themes/default.js +++ b/src/styles/themes/default.js @@ -88,6 +88,7 @@ darkTheme.PAGE_BACKGROUND_COLORS = { [SCREENS.SETTINGS.WORKSPACES]: colors.pink800, [ROUTES.I_KNOW_A_TEACHER]: colors.orange800, [ROUTES.SETTINGS_SECURITY]: colors.ice500, + [ROUTES.SETTINGS_ABOUT]: colors.yellow600, }; const oldTheme = { From 11dba93c4ecf1cdbc5414280af4aefa951d4968b Mon Sep 17 00:00:00 2001 From: Pujan Date: Tue, 12 Sep 2023 17:14:30 +0530 Subject: [PATCH 002/583] lint fix --- src/pages/settings/AboutPage/AboutPage.js | 5 +---- src/styles/styles.js | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/pages/settings/AboutPage/AboutPage.js b/src/pages/settings/AboutPage/AboutPage.js index 7a8bcb3bcd50..d4cf0ded944e 100644 --- a/src/pages/settings/AboutPage/AboutPage.js +++ b/src/pages/settings/AboutPage/AboutPage.js @@ -12,7 +12,6 @@ import * as Expensicons from '../../../components/Icon/Expensicons'; import withLocalize, {withLocalizePropTypes} from '../../../components/withLocalize'; import withWindowDimensions, {windowDimensionsPropTypes} from '../../../components/withWindowDimensions'; import MenuItem from '../../../components/MenuItem'; -import Logo from '../../../../assets/images/new-expensify.svg'; import pkg from '../../../../package.json'; import * as Report from '../../../libs/actions/Report'; import * as Link from '../../../libs/actions/Link'; @@ -113,9 +112,7 @@ function AboutPage(props) { iconRight={item.iconRight} onPress={() => item.action()} shouldBlockSelection={Boolean(item.link)} - onSecondaryInteraction={ - !_.isEmpty(item.link) ? (e) => ReportActionContextMenu.showContextMenu(CONTEXT_MENU_TYPES.LINK, e, item.link, popoverAnchor) : undefined - } + onSecondaryInteraction={!_.isEmpty(item.link) ? (e) => ReportActionContextMenu.showContextMenu(CONTEXT_MENU_TYPES.LINK, e, item.link, popoverAnchor) : undefined} ref={(el) => (popoverAnchor = el)} shouldShowRightIcon /> diff --git a/src/styles/styles.js b/src/styles/styles.js index 32c300fc52b0..0dbd2a1c7abe 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -3925,7 +3925,7 @@ const styles = { }, versionTextColor: { color: `${Colors.ivory}cc`, - } + }, }; export default styles; From f084d4e08be296b10bda79711fd73573a4dc1860 Mon Sep 17 00:00:00 2001 From: Pujan Date: Tue, 12 Sep 2023 17:48:56 +0530 Subject: [PATCH 003/583] added close button --- src/pages/settings/AboutPage/AboutPage.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/settings/AboutPage/AboutPage.js b/src/pages/settings/AboutPage/AboutPage.js index d4cf0ded944e..70d597423da7 100644 --- a/src/pages/settings/AboutPage/AboutPage.js +++ b/src/pages/settings/AboutPage/AboutPage.js @@ -96,6 +96,7 @@ function AboutPage(props) { title={props.translate('initialSettingsPage.about')} onBackButtonPress={() => Navigation.goBack(ROUTES.SETTINGS)} illustration={LottieAnimations.Coin} + shouldShowCloseButton backgroundColor={themeColors.PAGE_BACKGROUND_COLORS[ROUTES.SETTINGS_ABOUT]} overlayContent={overlayContent} > From 84a6779c907158f03cea37976a79af708e87838f Mon Sep 17 00:00:00 2001 From: Pujan Date: Wed, 20 Sep 2023 16:07:44 +0530 Subject: [PATCH 004/583] route to screen changes --- assets/animations/Coin.json | 2 +- src/SCREENS.ts | 1 + .../AppNavigator/ModalStackNavigators.js | 2 +- src/libs/Navigation/linkingConfig.js | 2 +- src/pages/settings/AboutPage/AboutPage.js | 88 +++++++++---------- src/styles/styles.js | 7 +- src/styles/themes/default.js | 2 +- 7 files changed, 52 insertions(+), 52 deletions(-) diff --git a/assets/animations/Coin.json b/assets/animations/Coin.json index 5f276f443a53..7151987a4959 100644 --- a/assets/animations/Coin.json +++ b/assets/animations/Coin.json @@ -1 +1 @@ -{"v":"5.9.6","fr":24,"ip":0,"op":45,"w":375,"h":375,"nm":"C","assets":[{"id":"comp_0","nm":"E","fr":24,"layers":[{"ind":2,"ty":3,"nm":"o","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[784.5,684.5,0],"to":[1.167,0,0],"ti":[-3,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":7,"s":[791.5,684.5,0],"to":[3,0,0],"ti":[1.167,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[802.5,684.5,0],"to":[-1.167,0,0],"ti":[1.833,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":15,"s":[784.5,684.5,0],"to":[-1.833,0,0],"ti":[-3,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":22,"s":[791.5,684.5,0],"to":[3,0,0],"ti":[1.167,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[802.5,684.5,0],"to":[-1.167,0,0],"ti":[1.833,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":30,"s":[784.5,684.5,0],"to":[-1.833,0,0],"ti":[-3,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":37,"s":[791.5,684.5,0],"to":[3,0,0],"ti":[-1.833,0,0]},{"t":44,"s":[802.5,684.5,0]}],"l":2},"a":{"a":0,"k":[50,49,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":15,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":22,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":30,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":37,"s":[100,100,100]},{"t":44,"s":[22,100,100]}],"l":2}},"ao":0,"ip":0,"op":45,"st":0},{"ind":3,"ty":3,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[801.5,684.5,0],"to":[-1.667,0,0],"ti":[2.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":7,"s":[791.5,684.5,0],"to":[-2.667,0,0],"ti":[-1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[785.5,684.5,0],"to":[1.667,0,0],"ti":[-1,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":15,"s":[801.5,684.5,0],"to":[1,0,0],"ti":[2.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":22,"s":[791.5,684.5,0],"to":[-2.667,0,0],"ti":[-1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[785.5,684.5,0],"to":[1.667,0,0],"ti":[-1,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":30,"s":[801.5,684.5,0],"to":[1,0,0],"ti":[2.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":37,"s":[791.5,684.5,0],"to":[-2.667,0,0],"ti":[1,0,0]},{"t":44,"s":[785.5,684.5,0]}],"l":2},"a":{"a":0,"k":[50,49,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":15,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":22,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":30,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":37,"s":[100,100,100]},{"t":44,"s":[22,100,100]}],"l":2}},"ao":0,"ip":0,"op":45,"st":0},{"ind":4,"ty":3,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[801.5,684.5,0],"to":[-1.667,0,0],"ti":[2.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":7,"s":[791.5,684.5,0],"to":[-2.667,0,0],"ti":[-1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[785.5,684.5,0],"to":[1.667,0,0],"ti":[-1,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":15,"s":[801.5,684.5,0],"to":[1,0,0],"ti":[2.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":22,"s":[791.5,684.5,0],"to":[-2.667,0,0],"ti":[-1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[785.5,684.5,0],"to":[1.667,0,0],"ti":[-1,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":30,"s":[801.5,684.5,0],"to":[1,0,0],"ti":[2.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":37,"s":[791.5,684.5,0],"to":[-2.667,0,0],"ti":[1,0,0]},{"t":44,"s":[785.5,684.5,0]}],"l":2},"a":{"a":0,"k":[50,49,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":15,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":22,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":30,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":37,"s":[100,100,100]},{"t":44,"s":[22,100,100]}],"l":2}},"ao":0,"ip":0,"op":45,"st":0},{"ind":5,"ty":3,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[801.5,684.5,0],"to":[-1.667,0,0],"ti":[2.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":7,"s":[791.5,684.5,0],"to":[-2.667,0,0],"ti":[-1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[785.5,684.5,0],"to":[1.667,0,0],"ti":[-1,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":15,"s":[801.5,684.5,0],"to":[1,0,0],"ti":[2.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":22,"s":[791.5,684.5,0],"to":[-2.667,0,0],"ti":[-1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[785.5,684.5,0],"to":[1.667,0,0],"ti":[-1,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":30,"s":[801.5,684.5,0],"to":[1,0,0],"ti":[2.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":37,"s":[791.5,684.5,0],"to":[-2.667,0,0],"ti":[1,0,0]},{"t":44,"s":[785.5,684.5,0]}],"l":2},"a":{"a":0,"k":[50,49,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":15,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":22,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":30,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":37,"s":[100,100,100]},{"t":44,"s":[22,100,100]}],"l":2}},"ao":0,"ip":0,"op":45,"st":0},{"ind":6,"ty":3,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[801.5,684.5,0],"to":[-1.667,0,0],"ti":[2.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":7,"s":[791.5,684.5,0],"to":[-2.667,0,0],"ti":[-1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[785.5,684.5,0],"to":[1.667,0,0],"ti":[-1,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":15,"s":[801.5,684.5,0],"to":[1,0,0],"ti":[2.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":22,"s":[791.5,684.5,0],"to":[-2.667,0,0],"ti":[-1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[785.5,684.5,0],"to":[1.667,0,0],"ti":[-1,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":30,"s":[801.5,684.5,0],"to":[1,0,0],"ti":[2.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":37,"s":[791.5,684.5,0],"to":[-2.667,0,0],"ti":[1,0,0]},{"t":44,"s":[785.5,684.5,0]}],"l":2},"a":{"a":0,"k":[50,49,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":15,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":22,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":30,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":37,"s":[100,100,100]},{"t":44,"s":[22,100,100]}],"l":2}},"ao":0,"ip":0,"op":45,"st":0},{"ind":7,"ty":3,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[781.5,684.5,0],"to":[1.667,0,0],"ti":[-3.5,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":7,"s":[791.5,684.5,0],"to":[3.5,0,0],"ti":[1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[802.5,684.5,0],"to":[-1.667,0,0],"ti":[1.833,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":15,"s":[781.5,684.5,0],"to":[-1.833,0,0],"ti":[-3.5,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":22,"s":[791.5,684.5,0],"to":[3.5,0,0],"ti":[1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[802.5,684.5,0],"to":[-1.667,0,0],"ti":[1.833,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":30,"s":[781.5,684.5,0],"to":[-1.833,0,0],"ti":[-3.5,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":37,"s":[791.5,684.5,0],"to":[3.5,0,0],"ti":[-1.833,0,0]},{"t":44,"s":[802.5,684.5,0]}],"l":2},"a":{"a":0,"k":[50,49,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":15,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":22,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":30,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":37,"s":[100,100,100]},{"t":44,"s":[22,100,100]}],"l":2}},"ao":0,"ip":0,"op":45,"st":0},{"ind":8,"ty":3,"nm":"s","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[809.5,684.5,0],"to":[-3,0,0],"ti":[0,0,0]},{"i":{"x":0.591,"y":0.558},"o":{"x":0.167,"y":0.167},"t":7,"s":[791.5,684.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.591,"y":0.591},"o":{"x":0.254,"y":0.254},"t":8,"s":[794.261,684.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.69,"y":1},"o":{"x":0.254,"y":0.05},"t":14,"s":[794.261,684.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":15,"s":[809.5,684.5,0],"to":[0,0,0],"ti":[2.54,0,0]},{"i":{"x":0.591,"y":0.705},"o":{"x":0.167,"y":0.167},"t":22,"s":[791.5,684.5,0],"to":[-2.54,0,0],"ti":[0,0,0]},{"i":{"x":0.591,"y":0.591},"o":{"x":0.254,"y":0.254},"t":23,"s":[794.261,684.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.69,"y":1},"o":{"x":0.254,"y":0.05},"t":29,"s":[794.261,684.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":30,"s":[809.5,684.5,0],"to":[0,0,0],"ti":[2.54,0,0]},{"i":{"x":0.591,"y":0.705},"o":{"x":0.167,"y":0.167},"t":37,"s":[791.5,684.5,0],"to":[-2.54,0,0],"ti":[0,0,0]},{"i":{"x":0.591,"y":0.591},"o":{"x":0.254,"y":0.254},"t":38,"s":[794.261,684.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":44,"s":[794.261,684.5,0]}],"l":2},"a":{"a":0,"k":[50,49,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[23,100,100]},{"i":{"x":[0.591,0.591,0.591],"y":[0.947,1,1]},"o":{"x":[0.249,0.249,0.249],"y":[0.024,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.591,0.591,0.591],"y":[1,1,1]},"o":{"x":[0.254,0.254,0.254],"y":[-19.503,0,0]},"t":8,"s":[1,1,100]},{"i":{"x":[0.69,0.69,0.69],"y":[1,1,1]},"o":{"x":[0.254,0.254,0.254],"y":[0,0,0]},"t":14,"s":[1,1,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":15,"s":[23,100,100]},{"i":{"x":[0.591,0.591,0.591],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":22,"s":[100,100,100]},{"i":{"x":[0.591,0.591,0.591],"y":[1,1,1]},"o":{"x":[0.254,0.254,0.254],"y":[-19.503,0,0]},"t":23,"s":[1,1,100]},{"i":{"x":[0.69,0.69,0.69],"y":[1,1,1]},"o":{"x":[0.254,0.254,0.254],"y":[0,0,0]},"t":29,"s":[1,1,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":30,"s":[23,100,100]},{"i":{"x":[0.591,0.591,0.591],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":37,"s":[100,100,100]},{"i":{"x":[0.591,0.591,0.591],"y":[1,1,1]},"o":{"x":[0.254,0.254,0.254],"y":[-19.503,0,0]},"t":38,"s":[1,1,100]},{"t":44,"s":[1,1,100]}],"l":2}},"ao":0,"ip":0,"op":45,"st":0},{"ind":9,"ty":3,"nm":"s","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[797.5,684.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[797.5,684.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":8,"s":[797.5,684.5,0],"to":[-3.833,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":14,"s":[774.5,684.5,0],"to":[0,0,0],"ti":[-3.833,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[797.5,684.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[797.5,684.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":23,"s":[797.5,684.5,0],"to":[-3.833,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":29,"s":[774.5,684.5,0],"to":[0,0,0],"ti":[-3.833,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[797.5,684.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[797.5,684.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":38,"s":[797.5,684.5,0],"to":[-3.833,0,0],"ti":[3.833,0,0]},{"t":44,"s":[774.5,684.5,0]}],"l":2},"a":{"a":0,"k":[50,49,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":7,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":8,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[23,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":15,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":22,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":23,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[23,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":30,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":37,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":38,"s":[100,100,100]},{"t":44,"s":[23,100,100]}],"l":2}},"ao":0,"ip":0,"op":45,"st":0},{"ind":10,"ty":3,"nm":"s","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[800.5,684.5,0],"to":[-1.25,0,0],"ti":[3.125,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[792.999,684.5,0],"to":[-3.125,0,0],"ti":[1.25,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[786.5,684.5,0],"to":[-2.5,0,0],"ti":[2.5,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[800.5,684.5,0],"to":[-1.25,0,0],"ti":[3.125,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[792.999,684.5,0],"to":[-3.125,0,0],"ti":[1.25,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[786.5,684.5,0],"to":[-2.5,0,0],"ti":[2.5,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[800.5,684.5,0],"to":[-1.25,0,0],"ti":[3.125,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[792.999,684.5,0],"to":[-3.125,0,0],"ti":[1.25,0,0]},{"t":44,"s":[786.5,684.5,0]}],"l":2},"a":{"a":0,"k":[50,49,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[60,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":7,"s":[1,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":14,"s":[66,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":15,"s":[60,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":22,"s":[1,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29,"s":[66,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":30,"s":[60,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":37,"s":[1,100,100]},{"t":44,"s":[66,100,100]}],"l":2}},"ao":0,"ip":0,"op":45,"st":0},{"ind":11,"ty":4,"nm":"o","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-71.88],[71.88,0],[0,71.88],[-71.88,0]],"o":[[0,71.88],[-71.88,0],[0,-71.88],[71.88,0]],"v":[[130.15,0],[0,130.15],[-130.15,0],[0,-130.15]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-89.87],[89.86,0],[0,89.86],[-89.87,0]],"o":[[0,89.86],[-89.87,0],[0,-89.87],[89.86,0]],"v":[[162.715,0.005],[0.005,162.715],[-162.715,0.005],[0.005,-162.715]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[792.199,686.286]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,71.88],[71.88,0],[0,-71.88],[-71.88,0]],"o":[[0,-71.88],[-71.88,0],[0,71.88],[71.88,0]],"v":[[130.395,-1.245],[0.245,-131.395],[-129.905,-1.245],[0.245,128.905]],"c":true}},"nm":"P"},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[-89.87,0],[0,-89.87],[89.86,0],[0,89.86]],"o":[[89.86,0],[0,89.86],[-89.87,0],[0,-89.87]],"v":[[0.005,-162.715],[162.715,0.005],[0.005,162.715],[-162.715,0.005]],"c":true}},"nm":"P"},{"ty":"mm","mm":1,"nm":"M"},{"ty":"fl","c":{"a":0,"k":[0.82,0.608,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[792.199,686.286]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":0,"op":45,"st":0},{"ind":12,"ty":4,"nm":"m","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.56,"y":0.384},"o":{"x":0.167,"y":0.167},"t":0,"s":[962.5,805.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.659,"y":0.408},"o":{"x":0.321,"y":0.295},"t":2,"s":[1005.921,808.071,0],"to":[0,0,0],"ti":[0,0,0]},{"t":3,"s":[1038.9,811.378,0]}],"l":2},"a":{"a":0,"k":[-2,266,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-26.336,-59.257],[1,-18],[36,-55],[0,0]],"o":[[0,0],[28,63],[-1,18],[-33.439,51.087],[0,0]],"v":[[-63.5,-32.5],[-171.5,-0.5],[-144.5,137.5],[-177.5,291.5],[-65.5,322.5]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2},"lc":1,"lj":1,"ml":4,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"S"}],"ip":0,"op":4,"st":0},{"ind":13,"ty":4,"nm":"i","parent":3,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-6.5,-6.63]],"o":[[-8.92,-7.63],[0,0]],"v":[[9.205,-1.655],[-2.705,9.285]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[737.099,759.977]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[8.35,-6.93]],"o":[[6.57,-7.4],[0,0]],"v":[[2.69,8.77],[-9.26,-1.84]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[852.074,759.612]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-6.38,5.91]],"o":[[-4.21,8.3],[0,0]],"v":[[-3.785,-8.035],[7.995,2.125]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[869.379,743.506]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-5.15,-9.03]],"o":[[-6.76,-6.92],[0,0]],"v":[[8.665,-1.765],[-3.515,8.685]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[870.189,627.466]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[5.02,6.5]],"o":[[7.43,5.19],[0,0]],"v":[[-7.705,3.25],[2.685,-8.44]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[853.379,610.762]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[4.73,8.76]],"o":[[6.59,8.94],[0,0]],"v":[[-9.48,-0.315],[4.75,-8.625]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[718.594,744.096]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-28.63,25.03]],"o":[[35.21,27.46],[0,0]],"v":[[-60.185,-13.29],[60.185,-14.17]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[794.579,782.552]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-33.12,19.71]],"o":[[30,20.35],[0,0]],"v":[[-48.255,-9.895],[48.255,-10.455]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[794.559,768.216]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[18.65,29.56]],"o":[[22.29,-33.18],[0,0]],"v":[[-11.145,49.66],[-10.075,-49.66]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[876.739,685.812]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[21.59,-22.38]],"o":[[30.57,39.25],[0,0]],"v":[[-14.57,-59.94],[-16,59.94]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[893.424,685.641]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[33,-13],[12,-24],[-20.98,-29.69],[-0.02,-0.03]],"o":[[-27.92,-20.15],[-25,10],[-15.98,32.97],[0.02,0.03],[0,0]],"v":[[85.95,-57.2],[-12.97,-71.35],[-69.97,-18.35],[-61,84.26],[-60.94,84.35]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[770.114,659.521]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-80.46,-52.29]],"o":[[-55.97,-86.78],[0,0]],"v":[[-33.18,86.875],[89.15,-34.585]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[756.524,648.596]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[757.404,632.742],[757.404,736.742]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[830.504,736.742],[830.504,715.512]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,715.511],[830.504,715.511]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,673.432],[822.204,673.432]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,695.522],[822.204,695.522]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[822.204,673.432],[822.204,695.521]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[830.504,632.742],[830.504,654.522]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,654.522],[830.504,654.522]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,695.522],[784.524,715.512]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,654.522],[784.524,673.432]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[830.504,736.742],[757.404,736.742]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[830.504,632.742],[757.404,632.742]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[36.55,30.77],[36.55,52],[-36.55,52],[-36.55,-52],[36.55,-52],[36.55,-30.22],[-9.43,-30.22],[-9.43,-11.31],[28.25,-11.31],[28.25,10.78],[-9.43,10.78],[-9.43,30.77]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[793.954,684.742]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[6.57,-7.4],[35.21,27.46],[-8.92,-7.63],[-33.12,19.71]],"o":[[8.35,-6.93],[-28.63,25.03],[-6.5,-6.63],[30,20.35],[0,0]],"v":[[48.2,-15.935],[60.15,-5.325],[-60.22,-4.445],[-48.31,-15.385],[48.2,-15.945]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[794.614,773.707]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-27.92,-20.15],[7.43,5.19],[-55.97,-86.78],[6.59,8.94],[-15.98,32.97],[-25,10]],"o":[[5.02,6.5],[-80.46,-52.29],[4.73,8.76],[-20.98,-29.69],[12,-24],[33,-13]],"v":[[91.835,-54.9],[81.445,-43.21],[-40.885,78.25],[-55.115,86.56],[-64.085,-16.05],[-7.085,-69.05]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[764.229,657.222]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-6.76,-6.92],[21.59,-22.38],[0,0],[-4.21,8.3],[18.65,29.56],[0,0]],"o":[[30.57,39.25],[0,0],[-6.38,5.91],[22.29,-33.18],[0,0],[-5.15,-9.03]],"v":[[-6.55,-59.46],[-7.98,60.42],[-8.03,60.47],[-19.81,50.31],[-18.74,-49.01],[-18.73,-49.01]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[885.404,685.161]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":0,"op":7,"st":7},{"ind":14,"ty":4,"nm":"m","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.686,"y":0.821},"o":{"x":0.339,"y":0.628},"t":12,"s":[567.9,804.293,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.436,"y":0.499},"t":13,"s":[606.246,809.717,0],"to":[0,0,0],"ti":[0,0,0]},{"t":14,"s":[625.5,811.5,0]}],"l":2},"a":{"a":0,"k":[-2,266,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.797,0.797,0.797],"y":[1,1,1]},"o":{"x":[0.431,0.431,0.431],"y":[0,0,0]},"t":12,"s":[-100,100,100]},{"t":14,"s":[-100,100,100]}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-26.336,-59.257],[1,-18],[36,-55],[0,0]],"o":[[0,0],[28,63],[-1,18],[-33.439,51.087],[0,0]],"v":[[-63.5,-32.5],[-171.5,-0.5],[-144.5,137.5],[-177.5,291.5],[-65.5,322.5]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2},"lc":1,"lj":1,"ml":4,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"S"}],"ip":11,"op":15,"st":0},{"ind":15,"ty":4,"nm":"i","parent":3,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-6.5,-6.63]],"o":[[-8.92,-7.63],[0,0]],"v":[[9.205,-1.655],[-2.705,9.285]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[737.099,759.977]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[8.35,-6.93]],"o":[[6.57,-7.4],[0,0]],"v":[[2.69,8.77],[-9.26,-1.84]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[852.074,759.612]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-6.38,5.91]],"o":[[-4.21,8.3],[0,0]],"v":[[-3.785,-8.035],[7.995,2.125]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[869.379,743.506]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-5.15,-9.03]],"o":[[-6.76,-6.92],[0,0]],"v":[[8.665,-1.765],[-3.515,8.685]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[870.189,627.466]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[5.02,6.5]],"o":[[7.43,5.19],[0,0]],"v":[[-7.705,3.25],[2.685,-8.44]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[853.379,610.762]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[4.73,8.76]],"o":[[6.59,8.94],[0,0]],"v":[[-9.48,-0.315],[4.75,-8.625]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[718.594,744.096]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-28.63,25.03]],"o":[[35.21,27.46],[0,0]],"v":[[-60.185,-13.29],[60.185,-14.17]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[794.579,782.552]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-33.12,19.71]],"o":[[30,20.35],[0,0]],"v":[[-48.255,-9.895],[48.255,-10.455]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[794.559,768.216]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[18.65,29.56]],"o":[[22.29,-33.18],[0,0]],"v":[[-11.145,49.66],[-10.075,-49.66]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[876.739,685.812]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[21.59,-22.38]],"o":[[30.57,39.25],[0,0]],"v":[[-14.57,-59.94],[-16,59.94]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[893.424,685.641]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[33,-13],[12,-24],[-20.98,-29.69],[-0.02,-0.03]],"o":[[-27.92,-20.15],[-25,10],[-15.98,32.97],[0.02,0.03],[0,0]],"v":[[85.95,-57.2],[-12.97,-71.35],[-69.97,-18.35],[-61,84.26],[-60.94,84.35]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[770.114,659.521]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-80.46,-52.29]],"o":[[-55.97,-86.78],[0,0]],"v":[[-33.18,86.875],[89.15,-34.585]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[756.524,648.596]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[757.404,632.742],[757.404,736.742]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[830.504,736.742],[830.504,715.512]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,715.511],[830.504,715.511]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,673.432],[822.204,673.432]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,695.522],[822.204,695.522]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[822.204,673.432],[822.204,695.521]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[830.504,632.742],[830.504,654.522]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,654.522],[830.504,654.522]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,695.522],[784.524,715.512]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,654.522],[784.524,673.432]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[830.504,736.742],[757.404,736.742]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[830.504,632.742],[757.404,632.742]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[36.55,30.77],[36.55,52],[-36.55,52],[-36.55,-52],[36.55,-52],[36.55,-30.22],[-9.43,-30.22],[-9.43,-11.31],[28.25,-11.31],[28.25,10.78],[-9.43,10.78],[-9.43,30.77]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[793.954,684.742]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[6.57,-7.4],[35.21,27.46],[-8.92,-7.63],[-33.12,19.71]],"o":[[8.35,-6.93],[-28.63,25.03],[-6.5,-6.63],[30,20.35],[0,0]],"v":[[48.2,-15.935],[60.15,-5.325],[-60.22,-4.445],[-48.31,-15.385],[48.2,-15.945]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[794.614,773.707]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-27.92,-20.15],[7.43,5.19],[-55.97,-86.78],[6.59,8.94],[-15.98,32.97],[-25,10]],"o":[[5.02,6.5],[-80.46,-52.29],[4.73,8.76],[-20.98,-29.69],[12,-24],[33,-13]],"v":[[91.835,-54.9],[81.445,-43.21],[-40.885,78.25],[-55.115,86.56],[-64.085,-16.05],[-7.085,-69.05]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[764.229,657.222]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-6.76,-6.92],[21.59,-22.38],[0,0],[-4.21,8.3],[18.65,29.56],[0,0]],"o":[[30.57,39.25],[0,0],[-6.38,5.91],[22.29,-33.18],[0,0],[-5.15,-9.03]],"v":[[-6.55,-59.46],[-7.98,60.42],[-8.03,60.47],[-19.81,50.31],[-18.74,-49.01],[-18.73,-49.01]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[885.404,685.161]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":6,"op":15,"st":0},{"ind":16,"ty":4,"nm":"m","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.568,"y":0.508},"o":{"x":0.167,"y":0.167},"t":15,"s":[962.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.638,"y":0.69},"o":{"x":0.284,"y":0.284},"t":16,"s":[984.064,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":18,"s":[1033.042,541.5,0]}],"l":2},"a":{"a":0,"k":[0,0,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.575,0.575,0.575],"y":[1,1,1]},"o":{"x":[0.185,0.185,0.185],"y":[0,0,0]},"t":15,"s":[100,100,100]},{"t":18,"s":[100,100,100]}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-26.336,-59.257],[1,-18],[36,-55],[0,0]],"o":[[0,0],[28,63],[-1,18],[-33.439,51.087],[0,0]],"v":[[-63.5,-32.5],[-171.5,-0.5],[-144.5,137.5],[-177.5,291.5],[-65.5,322.5]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2},"lc":1,"lj":1,"ml":4,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"S"}],"ip":15,"op":19,"st":0},{"ind":17,"ty":4,"nm":"i","parent":4,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[14.9,-0.54]],"o":[[0,0],[0,0]],"v":[[11.51,-6.635],[-11.51,6.635]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[747.544,701.067]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[20.59,-9.76]],"o":[[0,0],[0,0]],"v":[[9.475,-7.99],[-10.295,7.99]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[746.869,684.281]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[1.62,-2.98]],"o":[[0.27,8.12],[0,0]],"v":[[10.97,-9.345],[-11.24,9.345]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[745.924,667.216]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[14.36,-11.1]],"o":[[0,0],[0,0]],"v":[[18.42,3.65],[-18.42,5.55]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[745.244,637.152]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[13.55,-3.52]],"o":[[0,0],[0,0]],"v":[[10.565,5.01],[-10.565,-1.49]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[776.389,624.962]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[25.73,0.27]],"o":[[0,0],[0,0]],"v":[[18.42,9.07],[-18.42,-9.07]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[796.974,621.982]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[30.07,1.63]],"o":[[0,0],[0,0]],"v":[[18.15,12.595],[-18.15,-12.595]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[812.954,616.837]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-1.89,1.9]],"o":[[0,0],[0,0]],"v":[[-1.359,2.869],[1.359,-2.869]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[824.594,658.3]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0.55,1.62]],"o":[[0,0],[0,0]],"v":[[-0.005,3.586],[-0.275,-3.586]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[814.039,654.688]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[2.71,1.62]],"o":[[0,0],[0,0]],"v":[[1.651,3.601],[-1.651,-3.601]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[802.684,655.512]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[2.44,1.09]],"o":[[0,0],[0,0]],"v":[[2.44,3.25],[-2.44,-3.25]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[794.264,659.221]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0.768,-3.799],[10.37,0],[0,6.51],[-10.37,0],[-2.685,-2.878]],"o":[[3.52,2.02],[0,6.51],[-10.37,0],[0,-6.5],[4.2,0],[0,0]],"v":[[12.185,-9.292],[18.09,0],[-0.077,11.78],[-18.857,0],[-0.077,-11.78],[13.129,-8.362]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[811.051,670.461]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[4.956,2.427]],"o":[[0,0],[0,0]],"v":[[2.478,5.11],[-2.478,-5.11]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[815.356,692.572]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,-8.66],[-12.46,0],[-3.41,1.38],[-0.22,5.36],[0.03,0.45],[-7.28,-2.87]],"o":[[-2.552,0.272],[0,8.67],[4.55,0],[5.5,-2.22],[0.03,-0.42],[4.26,3.1],[0,0]],"v":[[-22.347,-13.273],[-33.56,-1.087],[-12.7,13.273],[-0.6,11.172],[8.7,-0.328],[8.7,-1.628],[33.56,9.722]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[809.133,699.309]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,-5.11],[0,0],[7.14,0.07],[4.87,0],[0,2.43],[-3.47,1.47],[-1.37,0],[0,0]],"o":[[10.86,4.33],[0,6.23],[0,0],[-5.33,-0.06],[-18.41,0],[0,-1.9],[0.98,-0.41],[6.23,0],[0,0]],"v":[[8.905,-10.035],[29.525,3.805],[18.685,9.225],[5.695,9.065],[-10.565,8.955],[-29.525,-0.795],[-24.895,-7.725],[-21.395,-8.385],[-13.815,-4.315]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[833.809,719.067]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-3.79,-0.28],[-0.95,-0.07],[-9.22,-0.39],[-6.11,1.6],[-1.073,-9.626]],"o":[[0,0],[0.35,0.03],[3.84,0.27],[13.32,0.56],[0,0],[0,0]],"v":[[-38.035,-3.938],[-32.075,-4.748],[-30.105,-4.598],[-8.695,-3.368],[25.885,-4.208],[38.035,5.028]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[815.239,690.52]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[-1.21,9.1],[0,0]],"v":[[4.46,-4.782],[-4.459,4.782]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[849.194,705.063]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-20.31,8.4]],"o":[[0,0],[0,0]],"v":[[-22.885,-4.47],[22.885,-3.93]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[815.799,745.221]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[4.06,0],[2.44,-3.25],[8.12,0.27],[1.9,-0.82],[-0.2,-0.41],[-18.49,-0.47],[-4.06,4.33]],"o":[[-3.52,-0.81],[-4.06,0],[0,0],[-8.13,-0.27],[0,0],[1.37,2.91],[11.37,0],[0,0]],"v":[[23.97,-5.415],[13.95,-10.555],[3.93,-4.335],[-7.17,-11.375],[-23.97,-4.055],[-23.68,-3.405],[2.85,11.645],[23.7,-0.535]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[815.254,744.266]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,-3.52],[-34.4,0],[0,7.04]],"o":[[0,0],[0,3.52],[20.31,0],[0,0]],"v":[[-26.675,-10.695],[-26.405,-2.845],[5.015,10.695],[29.385,0.675]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[790.609,770.137]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[19.5,0],[2.98,5.42]],"o":[[0,0],[0,0],[0,0],[0,0],[0,2.98],[-7.85,0],[0,0]],"v":[[19.365,-20.855],[19.365,-11.105],[19.365,-8.665],[19.365,-6.225],[19.365,0.545],[-0.135,20.855],[-19.365,13.815]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[820.129,749.957]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[5.41,-13.54],[0.27,-0.55],[0,0],[0,0],[0,0],[0,0],[-1.08,18.96],[-4.33,19.5],[-13.55,5.96],[-35.21,-5.96],[0,0],[0.54,-16.25],[4.33,-11.92],[13,10.57],[16.25,-21.13],[0,-14.63],[5.9,-2.25],[0,0]],"o":[[2.16,11.37],[-0.25,0.62],[-5.73,11.54],[5.42,-1.08],[-6.5,7.04],[8.12,0],[-31.42,3.25],[1.08,-18.96],[4.34,-19.5],[13.54,-5.96],[46.05,7.58],[0,0],[-0.54,16.25],[-3.25,-4.34],[-17.07,13],[-14.63,16.25],[0,10.51],[-2.31,0.88],[0,0]],"v":[[-33.585,40.21],[-24.105,79.75],[-24.885,81.51],[-41.715,90.58],[-35.215,77.04],[-49.835,79.75],[-40.625,66.21],[-58.505,9.87],[-69.885,-32.38],[-30.875,-56.22],[28.165,-87.09],[61.755,-43.76],[72.045,-25.88],[53.085,8.79],[49.025,-39.97],[-17.605,-28.59],[-20.045,21.79],[-36.435,40.02],[-40.355,41.29]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[788.039,677.521]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,-6.13],[0.01,-0.19],[6,0],[2.06,2.51],[0,0],[0,0],[-5.28,0]],"o":[[6.1,0.1],[0,0.19],[-0.3,5.92],[-3.5,0],[0,0],[0,0],[1.19,-4.9],[0,0]],"v":[[0.025,-11.205],[11.045,-0.005],[11.035,0.575],[-0.165,11.205],[-8.845,7.095],[-2.265,1.365],[-11.045,-2.655],[-0.165,-11.205]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[806.519,698.396]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.11,-3.76],[0,0],[4.78,0],[1.63,2],[0,0],[0,0],[-4.2,0],[-0.44,-0.06],[-0.01,0]],"o":[[0,0],[-0.24,4.72],[-2.79,0],[0,0],[0,0],[0.95,-3.92],[0.46,0],[0.01,0],[4.48,2.11]],"v":[[8.795,0.375],[8.795,0.465],[-0.125,8.935],[-7.035,5.655],[-1.795,1.095],[-8.795,-2.105],[-0.125,-8.935],[1.235,-8.835],[1.265,-8.825]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[820.939,669.846]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-4.47],[0.01,-0.12],[4.48,2.11]],"o":[[0,0.12],[-0.11,-3.76],[4.27,0.67]],"v":[[3.77,4.23],[3.76,4.6],[-3.77,-4.6]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[825.974,665.622]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-2.07,-0.84],[1.72,1.44]],"o":[[-2.38,-0.13],[2.09,0.83]],"v":[[3.14,1.245],[-3.14,-1.245]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[839.554,707.786]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-1.59],[0.13,-0.94],[4.88,0],[0.2,0.01],[0,0],[2.09,0.83],[0.43,0.53],[0,0],[0,0],[-5.08,0],[-1.64,-3.87]],"o":[[0,1.17],[-1.34,4.44],[-0.2,0],[0,0],[-2.07,-0.84],[-0.53,-0.43],[0,0],[0,0],[1.15,-4.73],[4.48,0],[0.37,1.2]],"v":[[10.505,-0.035],[10.305,3.135],[-0.025,10.795],[-0.635,10.775],[-0.655,10.775],[-6.935,8.285],[-8.375,6.835],[-2.045,1.315],[-10.505,-2.555],[-0.025,-10.795],[9.925,-4.205]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[843.349,698.257]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-1.49],[0.31,-0.99],[0,1.17],[0.37,1.2]],"o":[[0,1.09],[0.13,-0.94],[0,-1.59],[0.55,1.29]],"v":[[0.425,0.53],[-0.045,3.67],[0.155,0.5],[-0.425,-3.67]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[853.699,697.721]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.9,-2.25],[0,0],[5.41,-13.54],[0.27,-0.55],[0,0],[0,0],[0,0],[0,0],[-1.08,18.96],[-4.33,19.5],[-13.55,5.96],[-35.21,-5.96],[0,0],[0.54,-16.25],[4.33,-11.92],[13,10.57],[16.25,-21.13],[0,-14.63]],"o":[[0,0],[2.16,11.37],[-0.25,0.62],[-5.73,11.54],[5.42,-1.08],[-6.5,7.04],[8.12,0],[-31.42,3.25],[1.08,-18.96],[4.34,-19.5],[13.54,-5.96],[46.05,7.58],[0,0],[-0.54,16.25],[-3.25,-4.34],[-17.07,13],[-14.63,16.25],[0,10.51]],"v":[[-36.435,40.02],[-33.585,40.21],[-24.105,79.75],[-24.885,81.51],[-41.715,90.58],[-35.215,77.04],[-49.835,79.75],[-40.625,66.21],[-58.505,9.87],[-69.885,-32.38],[-30.875,-56.22],[28.165,-87.09],[61.755,-43.76],[72.045,-25.88],[53.085,8.79],[49.025,-39.97],[-17.605,-28.59],[-20.045,21.79]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[788.039,677.521]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[19.5,0],[20.31,0],[0,3.52],[0,0],[0,0],[-0.25,0.62],[2.16,11.37],[0,0],[0,10.51],[-14.63,16.25],[-17.07,13],[-3.25,-4.34],[13.32,0.56],[3.84,0.27],[0,0],[0,-8.66],[-12.46,0],[-3.41,1.38],[0,0],[0,-1.9],[-18.41,0],[-5.33,-0.06],[0,0],[0,0],[0,0],[4.06,0],[2.44,-3.25],[8.12,0.27],[1.9,-0.82],[-0.2,-0.41],[-18.49,-0.47],[-4.06,4.33],[0,0],[0,0]],"o":[[0,7.04],[-34.4,0],[0,-3.52],[0,0],[0.27,-0.55],[5.41,-13.54],[0,0],[5.9,-2.25],[0,-14.63],[16.25,-21.13],[13,10.57],[-6.11,1.6],[-9.22,-0.39],[0,0],[0,0],[0,8.67],[4.55,0],[0,0],[-3.47,1.47],[0,2.43],[4.87,0],[0,0],[0,0],[0,0],[-3.52,-0.81],[-4.06,0],[0,0],[-8.13,-0.27],[0,0],[1.37,2.91],[11.37,0],[0,0],[0,0],[0,2.98]],"v":[[19.16,66.495],[-5.21,76.515],[-36.63,62.975],[-36.9,55.125],[-37.68,54.715],[-36.9,52.955],[-46.38,13.415],[-49.23,13.225],[-32.84,-5.005],[-30.4,-55.385],[36.23,-66.765],[40.29,-18.005],[5.71,-17.165],[-15.7,-18.395],[-15.78,-17.465],[-25.26,-6.095],[-4.4,8.265],[7.7,6.165],[8.08,7.025],[3.45,13.955],[22.41,23.705],[38.67,23.815],[38.66,24.785],[38.66,34.535],[38.39,34.535],[28.37,29.395],[18.35,35.615],[7.25,28.575],[-9.55,35.895],[-9.26,36.545],[17.27,51.595],[38.12,39.415],[38.66,39.415],[38.66,46.185]],"c":true}},"nm":"P"},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[4.2,0],[0,-6.5],[-10.37,0],[0,6.51],[0.01,0.05],[0,0],[0,0.12],[4.27,0.67],[0.01,0]],"o":[[-10.37,0],[0,6.51],[10.37,0],[0,-0.05],[0,0],[0.01,-0.12],[0,-4.47],[-0.01,0],[-3.12,-1.46]],"v":[[10.14,-45.635],[-8.64,-33.855],[10.14,-22.075],[28.91,-33.855],[28.9,-34.005],[28.9,-34.095],[28.91,-34.465],[21.37,-43.295],[21.34,-43.305]],"c":true}},"nm":"P"},{"ty":"mm","mm":1,"nm":"M"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[800.834,704.317]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-8.13,-0.27],[0,0],[-4.06,0],[-3.52,-0.81],[0,0],[0,0]],"o":[[-20.31,8.4],[0,0],[-0.2,-0.41],[1.9,-0.82],[8.12,0.27],[2.44,-3.25],[4.06,0],[0,0],[0,0],[0,0]],"v":[[23.295,0.135],[-22.475,-0.405],[-23.815,-0.295],[-24.105,-0.945],[-7.305,-8.265],[3.795,-1.225],[13.815,-7.445],[23.835,-2.305],[24.105,-2.305],[24.105,0.135]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[815.389,741.156]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-20.31,8.4],[0,0],[0,0],[0,0],[11.37,0],[1.37,2.91]],"o":[[0,0],[0,0],[0,0],[0,0],[-4.06,4.33],[-18.49,-0.47],[0,0]],"v":[[-22.62,-7.58],[23.15,-7.04],[23.96,-7.04],[23.96,-4.6],[23.42,-4.6],[2.57,7.58],[-23.96,-7.47]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[815.534,748.331]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-0.22,5.36],[0.03,0.45],[-7.28,-2.87],[-2.38,-0.13],[0,0],[0,-5.11],[0,0],[7.14,0.07],[4.87,0],[0,2.43],[-3.47,1.47]],"o":[[5.5,-2.22],[0.03,-0.42],[4.26,3.1],[1.72,1.44],[0,0],[10.86,4.33],[0,6.23],[0,0],[-5.33,-0.06],[-18.41,0],[0,-1.9],[0,0]],"v":[[-25.275,-2.91],[-15.975,-14.41],[-15.975,-15.71],[2.605,-6.85],[8.885,-4.36],[8.905,-4.36],[29.525,9.48],[18.685,14.9],[5.695,14.74],[-10.565,14.63],[-29.525,4.88],[-24.895,-2.05]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[833.809,713.391]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[1.19,-4.9],[0,0],[0,0],[-3.5,0],[-0.3,5.92],[0,0],[5.5,-2.22],[4.55,0],[0,8.67],[0,0],[0,0],[-9.22,-0.39],[0,0]],"o":[[-5.28,0],[0,0],[0,0],[2.06,2.51],[6,0],[0,0],[-0.22,5.36],[-3.41,1.38],[-12.46,0],[0,-8.66],[0,0],[3.84,0.27],[0,0],[0,0]],"v":[[9.65,-12.06],[-1.23,-3.51],[7.55,0.51],[0.97,6.24],[9.65,10.35],[20.85,-0.28],[21.13,-0.27],[11.83,11.23],[-0.27,13.33],[-21.13,-1.03],[-11.65,-12.4],[-11.57,-13.33],[9.84,-12.1],[9.84,-12.06]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[796.704,699.252]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.952,-9.39],[0,0],[4.46,-0.653],[-0.53,-0.43],[4.26,3.1],[0.03,-0.42],[0,0],[0,0.19],[6.1,0.1],[0,0],[-6.11,1.6]],"o":[[0,0],[0.2,5.584],[0.43,0.53],[-7.28,-2.87],[0.03,0.45],[0,0],[0.01,-0.19],[0,-6.13],[0,0],[13.32,0.56],[0,0]],"v":[[23.075,-2.642],[23.455,1.938],[14.536,11.501],[4.525,7.399],[-12.365,-0.661],[-12.365,0.638],[-12.645,0.628],[-12.635,0.048],[-23.655,-11.151],[-23.655,-11.192],[10.925,-12.031]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[830.199,698.343]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-0.05],[10.37,0],[0,6.51],[-10.37,0],[-3.12,-1.46],[0.46,0],[0.95,-3.92],[0,0],[0,0],[-2.79,0],[-0.24,4.72]],"o":[[0,6.51],[-10.37,0],[0,-6.5],[4.2,0],[-0.44,-0.06],[-4.2,0],[0,0],[0,0],[1.63,2],[4.78,0],[0.01,0.05]],"v":[[18.775,0],[0.005,11.78],[-18.775,0],[0.005,-11.78],[11.205,-9.45],[9.845,-9.55],[1.175,-2.72],[8.175,0.48],[2.935,5.04],[9.845,8.32],[18.765,-0.15]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[810.969,670.462]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[12.396,3.289],[-3.289,12.396],[-12.396,-3.289],[3.288,-12.396]],"o":[[12.396,-3.289],[3.288,12.396],[-12.396,3.289],[-3.289,-12.396]],"v":[[-18.35,0],[0,-18.351],[18.351,0],[0,18.351]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[695.82,689.624]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-12.396,-3.289],[3.289,-12.396],[12.396,3.289],[-3.288,12.396]],"o":[[-12.396,3.289],[-3.288,-12.396],[12.396,-3.289],[3.289,12.396]],"v":[[18.351,0],[0,18.351],[-18.351,0],[0,-18.351]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[885.673,689.624]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":15,"op":23,"st":0},{"ind":18,"ty":4,"nm":"m","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.696,"y":0.733},"o":{"x":0.353,"y":0.301},"t":27,"s":[572.902,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.441,"y":0.517},"t":28,"s":[602.97,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[625.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":30,"s":[962.5,541.5,0]}],"l":2},"a":{"a":0,"k":[0,0,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.797,0.797,0.797],"y":[1,1,1]},"o":{"x":[0.431,0.431,0.431],"y":[0,0,0]},"t":27,"s":[-100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[-100,100,100]},{"t":30,"s":[100,100,100]}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-26.336,-59.257],[1,-18],[36,-55],[0,0]],"o":[[0,0],[28,63],[-1,18],[-33.439,51.087],[0,0]],"v":[[-63.5,-32.5],[-171.5,-0.5],[-144.5,137.5],[-177.5,291.5],[-65.5,322.5]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2},"lc":1,"lj":1,"ml":4,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"S"}],"ip":26,"op":30,"st":0},{"ind":19,"ty":4,"nm":"i","parent":4,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[14.9,-0.54]],"o":[[0,0],[0,0]],"v":[[11.51,-6.635],[-11.51,6.635]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[747.544,701.067]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[20.59,-9.76]],"o":[[0,0],[0,0]],"v":[[9.475,-7.99],[-10.295,7.99]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[746.869,684.281]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[1.62,-2.98]],"o":[[0.27,8.12],[0,0]],"v":[[10.97,-9.345],[-11.24,9.345]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[745.924,667.216]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[14.36,-11.1]],"o":[[0,0],[0,0]],"v":[[18.42,3.65],[-18.42,5.55]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[745.244,637.152]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[13.55,-3.52]],"o":[[0,0],[0,0]],"v":[[10.565,5.01],[-10.565,-1.49]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[776.389,624.962]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[25.73,0.27]],"o":[[0,0],[0,0]],"v":[[18.42,9.07],[-18.42,-9.07]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[796.974,621.982]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[30.07,1.63]],"o":[[0,0],[0,0]],"v":[[18.15,12.595],[-18.15,-12.595]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[812.954,616.837]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-1.89,1.9]],"o":[[0,0],[0,0]],"v":[[-1.359,2.869],[1.359,-2.869]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[824.594,658.3]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0.55,1.62]],"o":[[0,0],[0,0]],"v":[[-0.005,3.586],[-0.275,-3.586]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[814.039,654.688]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[2.71,1.62]],"o":[[0,0],[0,0]],"v":[[1.651,3.601],[-1.651,-3.601]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[802.684,655.512]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[2.44,1.09]],"o":[[0,0],[0,0]],"v":[[2.44,3.25],[-2.44,-3.25]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[794.264,659.221]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0.768,-3.799],[10.37,0],[0,6.51],[-10.37,0],[-2.685,-2.878]],"o":[[3.52,2.02],[0,6.51],[-10.37,0],[0,-6.5],[4.2,0],[0,0]],"v":[[12.185,-9.292],[18.09,0],[-0.077,11.78],[-18.857,0],[-0.077,-11.78],[13.129,-8.362]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[811.051,670.461]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[4.956,2.427]],"o":[[0,0],[0,0]],"v":[[2.478,5.11],[-2.478,-5.11]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[815.356,692.572]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,-8.66],[-12.46,0],[-3.41,1.38],[-0.22,5.36],[0.03,0.45],[-7.28,-2.87]],"o":[[-2.552,0.272],[0,8.67],[4.55,0],[5.5,-2.22],[0.03,-0.42],[4.26,3.1],[0,0]],"v":[[-22.347,-13.273],[-33.56,-1.087],[-12.7,13.273],[-0.6,11.172],[8.7,-0.328],[8.7,-1.628],[33.56,9.722]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[809.133,699.309]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,-5.11],[0,0],[7.14,0.07],[4.87,0],[0,2.43],[-3.47,1.47],[-1.37,0],[0,0]],"o":[[10.86,4.33],[0,6.23],[0,0],[-5.33,-0.06],[-18.41,0],[0,-1.9],[0.98,-0.41],[6.23,0],[0,0]],"v":[[8.905,-10.035],[29.525,3.805],[18.685,9.225],[5.695,9.065],[-10.565,8.955],[-29.525,-0.795],[-24.895,-7.725],[-21.395,-8.385],[-13.815,-4.315]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[833.809,719.067]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-3.79,-0.28],[-0.95,-0.07],[-9.22,-0.39],[-6.11,1.6],[-1.073,-9.626]],"o":[[0,0],[0.35,0.03],[3.84,0.27],[13.32,0.56],[0,0],[0,0]],"v":[[-38.035,-3.938],[-32.075,-4.748],[-30.105,-4.598],[-8.695,-3.368],[25.885,-4.208],[38.035,5.028]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[815.239,690.52]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[-1.21,9.1],[0,0]],"v":[[4.46,-4.782],[-4.459,4.782]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[849.194,705.063]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-20.31,8.4]],"o":[[0,0],[0,0]],"v":[[-22.885,-4.47],[22.885,-3.93]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[815.799,745.221]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[4.06,0],[2.44,-3.25],[8.12,0.27],[1.9,-0.82],[-0.2,-0.41],[-18.49,-0.47],[-4.06,4.33]],"o":[[-3.52,-0.81],[-4.06,0],[0,0],[-8.13,-0.27],[0,0],[1.37,2.91],[11.37,0],[0,0]],"v":[[23.97,-5.415],[13.95,-10.555],[3.93,-4.335],[-7.17,-11.375],[-23.97,-4.055],[-23.68,-3.405],[2.85,11.645],[23.7,-0.535]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[815.254,744.266]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,-3.52],[-34.4,0],[0,7.04]],"o":[[0,0],[0,3.52],[20.31,0],[0,0]],"v":[[-26.675,-10.695],[-26.405,-2.845],[5.015,10.695],[29.385,0.675]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[790.609,770.137]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[19.5,0],[2.98,5.42]],"o":[[0,0],[0,0],[0,0],[0,0],[0,2.98],[-7.85,0],[0,0]],"v":[[19.365,-20.855],[19.365,-11.105],[19.365,-8.665],[19.365,-6.225],[19.365,0.545],[-0.135,20.855],[-19.365,13.815]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[820.129,749.957]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[5.41,-13.54],[0.27,-0.55],[0,0],[0,0],[0,0],[0,0],[-1.08,18.96],[-4.33,19.5],[-13.55,5.96],[-35.21,-5.96],[0,0],[0.54,-16.25],[4.33,-11.92],[13,10.57],[16.25,-21.13],[0,-14.63],[5.9,-2.25],[0,0]],"o":[[2.16,11.37],[-0.25,0.62],[-5.73,11.54],[5.42,-1.08],[-6.5,7.04],[8.12,0],[-31.42,3.25],[1.08,-18.96],[4.34,-19.5],[13.54,-5.96],[46.05,7.58],[0,0],[-0.54,16.25],[-3.25,-4.34],[-17.07,13],[-14.63,16.25],[0,10.51],[-2.31,0.88],[0,0]],"v":[[-33.585,40.21],[-24.105,79.75],[-24.885,81.51],[-41.715,90.58],[-35.215,77.04],[-49.835,79.75],[-40.625,66.21],[-58.505,9.87],[-69.885,-32.38],[-30.875,-56.22],[28.165,-87.09],[61.755,-43.76],[72.045,-25.88],[53.085,8.79],[49.025,-39.97],[-17.605,-28.59],[-20.045,21.79],[-36.435,40.02],[-40.355,41.29]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[788.039,677.521]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,-6.13],[0.01,-0.19],[6,0],[2.06,2.51],[0,0],[0,0],[-5.28,0]],"o":[[6.1,0.1],[0,0.19],[-0.3,5.92],[-3.5,0],[0,0],[0,0],[1.19,-4.9],[0,0]],"v":[[0.025,-11.205],[11.045,-0.005],[11.035,0.575],[-0.165,11.205],[-8.845,7.095],[-2.265,1.365],[-11.045,-2.655],[-0.165,-11.205]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[806.519,698.396]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.11,-3.76],[0,0],[4.78,0],[1.63,2],[0,0],[0,0],[-4.2,0],[-0.44,-0.06],[-0.01,0]],"o":[[0,0],[-0.24,4.72],[-2.79,0],[0,0],[0,0],[0.95,-3.92],[0.46,0],[0.01,0],[4.48,2.11]],"v":[[8.795,0.375],[8.795,0.465],[-0.125,8.935],[-7.035,5.655],[-1.795,1.095],[-8.795,-2.105],[-0.125,-8.935],[1.235,-8.835],[1.265,-8.825]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[820.939,669.846]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-4.47],[0.01,-0.12],[4.48,2.11]],"o":[[0,0.12],[-0.11,-3.76],[4.27,0.67]],"v":[[3.77,4.23],[3.76,4.6],[-3.77,-4.6]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[825.974,665.622]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-2.07,-0.84],[1.72,1.44]],"o":[[-2.38,-0.13],[2.09,0.83]],"v":[[3.14,1.245],[-3.14,-1.245]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[839.554,707.786]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-1.59],[0.13,-0.94],[4.88,0],[0.2,0.01],[0,0],[2.09,0.83],[0.43,0.53],[0,0],[0,0],[-5.08,0],[-1.64,-3.87]],"o":[[0,1.17],[-1.34,4.44],[-0.2,0],[0,0],[-2.07,-0.84],[-0.53,-0.43],[0,0],[0,0],[1.15,-4.73],[4.48,0],[0.37,1.2]],"v":[[10.505,-0.035],[10.305,3.135],[-0.025,10.795],[-0.635,10.775],[-0.655,10.775],[-6.935,8.285],[-8.375,6.835],[-2.045,1.315],[-10.505,-2.555],[-0.025,-10.795],[9.925,-4.205]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[843.349,698.257]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-1.49],[0.31,-0.99],[0,1.17],[0.37,1.2]],"o":[[0,1.09],[0.13,-0.94],[0,-1.59],[0.55,1.29]],"v":[[0.425,0.53],[-0.045,3.67],[0.155,0.5],[-0.425,-3.67]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[853.699,697.721]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.9,-2.25],[0,0],[5.41,-13.54],[0.27,-0.55],[0,0],[0,0],[0,0],[0,0],[-1.08,18.96],[-4.33,19.5],[-13.55,5.96],[-35.21,-5.96],[0,0],[0.54,-16.25],[4.33,-11.92],[13,10.57],[16.25,-21.13],[0,-14.63]],"o":[[0,0],[2.16,11.37],[-0.25,0.62],[-5.73,11.54],[5.42,-1.08],[-6.5,7.04],[8.12,0],[-31.42,3.25],[1.08,-18.96],[4.34,-19.5],[13.54,-5.96],[46.05,7.58],[0,0],[-0.54,16.25],[-3.25,-4.34],[-17.07,13],[-14.63,16.25],[0,10.51]],"v":[[-36.435,40.02],[-33.585,40.21],[-24.105,79.75],[-24.885,81.51],[-41.715,90.58],[-35.215,77.04],[-49.835,79.75],[-40.625,66.21],[-58.505,9.87],[-69.885,-32.38],[-30.875,-56.22],[28.165,-87.09],[61.755,-43.76],[72.045,-25.88],[53.085,8.79],[49.025,-39.97],[-17.605,-28.59],[-20.045,21.79]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[788.039,677.521]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[19.5,0],[20.31,0],[0,3.52],[0,0],[0,0],[-0.25,0.62],[2.16,11.37],[0,0],[0,10.51],[-14.63,16.25],[-17.07,13],[-3.25,-4.34],[13.32,0.56],[3.84,0.27],[0,0],[0,-8.66],[-12.46,0],[-3.41,1.38],[0,0],[0,-1.9],[-18.41,0],[-5.33,-0.06],[0,0],[0,0],[0,0],[4.06,0],[2.44,-3.25],[8.12,0.27],[1.9,-0.82],[-0.2,-0.41],[-18.49,-0.47],[-4.06,4.33],[0,0],[0,0]],"o":[[0,7.04],[-34.4,0],[0,-3.52],[0,0],[0.27,-0.55],[5.41,-13.54],[0,0],[5.9,-2.25],[0,-14.63],[16.25,-21.13],[13,10.57],[-6.11,1.6],[-9.22,-0.39],[0,0],[0,0],[0,8.67],[4.55,0],[0,0],[-3.47,1.47],[0,2.43],[4.87,0],[0,0],[0,0],[0,0],[-3.52,-0.81],[-4.06,0],[0,0],[-8.13,-0.27],[0,0],[1.37,2.91],[11.37,0],[0,0],[0,0],[0,2.98]],"v":[[19.16,66.495],[-5.21,76.515],[-36.63,62.975],[-36.9,55.125],[-37.68,54.715],[-36.9,52.955],[-46.38,13.415],[-49.23,13.225],[-32.84,-5.005],[-30.4,-55.385],[36.23,-66.765],[40.29,-18.005],[5.71,-17.165],[-15.7,-18.395],[-15.78,-17.465],[-25.26,-6.095],[-4.4,8.265],[7.7,6.165],[8.08,7.025],[3.45,13.955],[22.41,23.705],[38.67,23.815],[38.66,24.785],[38.66,34.535],[38.39,34.535],[28.37,29.395],[18.35,35.615],[7.25,28.575],[-9.55,35.895],[-9.26,36.545],[17.27,51.595],[38.12,39.415],[38.66,39.415],[38.66,46.185]],"c":true}},"nm":"P"},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[4.2,0],[0,-6.5],[-10.37,0],[0,6.51],[0.01,0.05],[0,0],[0,0.12],[4.27,0.67],[0.01,0]],"o":[[-10.37,0],[0,6.51],[10.37,0],[0,-0.05],[0,0],[0.01,-0.12],[0,-4.47],[-0.01,0],[-3.12,-1.46]],"v":[[10.14,-45.635],[-8.64,-33.855],[10.14,-22.075],[28.91,-33.855],[28.9,-34.005],[28.9,-34.095],[28.91,-34.465],[21.37,-43.295],[21.34,-43.305]],"c":true}},"nm":"P"},{"ty":"mm","mm":1,"nm":"M"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[800.834,704.317]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-8.13,-0.27],[0,0],[-4.06,0],[-3.52,-0.81],[0,0],[0,0]],"o":[[-20.31,8.4],[0,0],[-0.2,-0.41],[1.9,-0.82],[8.12,0.27],[2.44,-3.25],[4.06,0],[0,0],[0,0],[0,0]],"v":[[23.295,0.135],[-22.475,-0.405],[-23.815,-0.295],[-24.105,-0.945],[-7.305,-8.265],[3.795,-1.225],[13.815,-7.445],[23.835,-2.305],[24.105,-2.305],[24.105,0.135]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[815.389,741.156]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-20.31,8.4],[0,0],[0,0],[0,0],[11.37,0],[1.37,2.91]],"o":[[0,0],[0,0],[0,0],[0,0],[-4.06,4.33],[-18.49,-0.47],[0,0]],"v":[[-22.62,-7.58],[23.15,-7.04],[23.96,-7.04],[23.96,-4.6],[23.42,-4.6],[2.57,7.58],[-23.96,-7.47]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[815.534,748.331]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-0.22,5.36],[0.03,0.45],[-7.28,-2.87],[-2.38,-0.13],[0,0],[0,-5.11],[0,0],[7.14,0.07],[4.87,0],[0,2.43],[-3.47,1.47]],"o":[[5.5,-2.22],[0.03,-0.42],[4.26,3.1],[1.72,1.44],[0,0],[10.86,4.33],[0,6.23],[0,0],[-5.33,-0.06],[-18.41,0],[0,-1.9],[0,0]],"v":[[-25.275,-2.91],[-15.975,-14.41],[-15.975,-15.71],[2.605,-6.85],[8.885,-4.36],[8.905,-4.36],[29.525,9.48],[18.685,14.9],[5.695,14.74],[-10.565,14.63],[-29.525,4.88],[-24.895,-2.05]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[833.809,713.391]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[1.19,-4.9],[0,0],[0,0],[-3.5,0],[-0.3,5.92],[0,0],[5.5,-2.22],[4.55,0],[0,8.67],[0,0],[0,0],[-9.22,-0.39],[0,0]],"o":[[-5.28,0],[0,0],[0,0],[2.06,2.51],[6,0],[0,0],[-0.22,5.36],[-3.41,1.38],[-12.46,0],[0,-8.66],[0,0],[3.84,0.27],[0,0],[0,0]],"v":[[9.65,-12.06],[-1.23,-3.51],[7.55,0.51],[0.97,6.24],[9.65,10.35],[20.85,-0.28],[21.13,-0.27],[11.83,11.23],[-0.27,13.33],[-21.13,-1.03],[-11.65,-12.4],[-11.57,-13.33],[9.84,-12.1],[9.84,-12.06]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[796.704,699.252]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.952,-9.39],[0,0],[4.46,-0.653],[-0.53,-0.43],[4.26,3.1],[0.03,-0.42],[0,0],[0,0.19],[6.1,0.1],[0,0],[-6.11,1.6]],"o":[[0,0],[0.2,5.584],[0.43,0.53],[-7.28,-2.87],[0.03,0.45],[0,0],[0.01,-0.19],[0,-6.13],[0,0],[13.32,0.56],[0,0]],"v":[[23.075,-2.642],[23.455,1.938],[14.536,11.501],[4.525,7.399],[-12.365,-0.661],[-12.365,0.638],[-12.645,0.628],[-12.635,0.048],[-23.655,-11.151],[-23.655,-11.192],[10.925,-12.031]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[830.199,698.343]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-0.05],[10.37,0],[0,6.51],[-10.37,0],[-3.12,-1.46],[0.46,0],[0.95,-3.92],[0,0],[0,0],[-2.79,0],[-0.24,4.72]],"o":[[0,6.51],[-10.37,0],[0,-6.5],[4.2,0],[-0.44,-0.06],[-4.2,0],[0,0],[0,0],[1.63,2],[4.78,0],[0.01,0.05]],"v":[[18.775,0],[0.005,11.78],[-18.775,0],[0.005,-11.78],[11.205,-9.45],[9.845,-9.55],[1.175,-2.72],[8.175,0.48],[2.935,5.04],[9.845,8.32],[18.765,-0.15]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[810.969,670.462]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[12.396,3.289],[-3.289,12.396],[-12.396,-3.289],[3.288,-12.396]],"o":[[12.396,-3.289],[3.288,12.396],[-12.396,3.289],[-3.289,-12.396]],"v":[[-18.35,0],[0,-18.351],[18.351,0],[0,18.351]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[695.82,689.624]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-12.396,-3.289],[3.289,-12.396],[12.396,3.289],[-3.288,12.396]],"o":[[-12.396,3.289],[-3.288,-12.396],[12.396,-3.289],[3.289,12.396]],"v":[[18.351,0],[0,18.351],[-18.351,0],[0,-18.351]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[885.673,689.624]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":22,"op":30,"st":0},{"ind":20,"ty":4,"nm":"m","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.622,"y":0.8},"o":{"x":0.167,"y":0.167},"t":30,"s":[962.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":35,"s":[1066.402,541.5,0]}],"l":2},"a":{"a":0,"k":[0,0,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.622,0.622,0.622],"y":[1,1,1]},"o":{"x":[0.169,0.169,0.169],"y":[0,0,0]},"t":30,"s":[100,100,100]},{"t":35,"s":[100,100,100]}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-26.336,-59.257],[1,-18],[36,-55],[0,0]],"o":[[0,0],[28,63],[-1,18],[-33.439,51.087],[0,0]],"v":[[-63.5,-32.5],[-171.5,-0.5],[-144.5,137.5],[-177.5,291.5],[-65.5,322.5]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2},"lc":1,"lj":1,"ml":4,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"S"}],"ip":30,"op":34,"st":0},{"ind":21,"ty":4,"nm":"i","parent":5,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-12.396,-3.289],[3.289,-12.396],[12.396,3.289],[-3.288,12.396]],"o":[[-12.396,3.289],[-3.288,-12.396],[12.396,-3.289],[3.289,12.396]],"v":[[18.351,0],[0,18.351],[-18.351,0],[0,-18.351]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[701.82,686.579]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-12.396,-3.289],[3.289,-12.396],[12.396,3.289],[-3.288,12.396]],"o":[[-12.396,3.289],[-3.288,-12.396],[12.396,-3.289],[3.289,12.396]],"v":[[18.351,0],[0,18.351],[-18.351,0],[0,-18.351]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[883.673,686.579]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[806.594,733.661],[806.594,720.391]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[783.044,733.661],[783.044,720.391]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[770.434,734.322],[783.044,734.322],[806.594,734.322],[816.554,734.322]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[793.654,719.721],[793.654,707.082]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[793.654,752.572],[793.654,745.271]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-4.38,5.04],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.76,-6.9],[-12.13,0],[0,0]],"o":[[6.02,-6.92],[0,0],[0,0],[0,0],[0,0],[0,0],[4.26,5.11],[0,0],[11.97,-0.03]],"v":[[23.4,2.85],[30.03,-12.28],[12.77,-12.28],[-0.17,-12.28],[-10.78,-12.28],[-30.03,-12.28],[-23.87,2.73],[-0.3,12.28],[-0.19,12.28]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[793.823,732.002]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[5.19,13.175],[-5.19,-13.175]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[814.834,693.347]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-4.54,13.1],[4.52,-13.05],[4.54,-13.1]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[772.194,693.192]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[771.094,628.812],[815.554,628.812]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[727.294,706.672],[767.654,706.672],[793.654,706.672],[820.024,706.672],[859.684,706.672]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-21.32,-6.2],[-6.31,0],[-4.55,1.64],[0,0]],"o":[[0,0],[4.35,1.27],[6.71,0],[19.33,-6.9],[0,0]],"v":[[-37.555,-12.685],[-16.235,11.795],[-0.335,13.825],[16.455,11.185],[37.555,-13.825]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[792.949,668.346]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[31.09,-30.92]],"o":[[-5.68,-7.01],[0,0]],"v":[[36.535,15.23],[-36.535,15.46]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[792.999,637.702]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[21.745,-42.355],[-1.275,-82.135],[-23.475,-42.715],[-37.405,-17.975],[-38.735,-15.615],[-67.305,35.125],[-93.775,82.135],[-0.215,82.135],[93.775,82.135],[66.565,35.105],[36.635,-16.615],[35.705,-18.225]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[793.869,671.136]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[7.13,0],[0,8.38],[-8.38,0],[-2.51,-4.93]],"o":[[0,0],[-1.63,6.63],[-8.38,0],[0,-8.38],[5.9,0],[0,0]],"v":[[3.885,1.57],[14.945,3.62],[0.225,15.17],[-14.945,0],[0.225,-15.17],[13.735,-6.87]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[792.289,660.091]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.63,6.63],[0,0],[0,0],[5.9,0],[0,-8.38],[-8.38,0]],"o":[[0,0],[0,0],[-2.51,-4.93],[-8.38,0],[0,8.38],[7.13,0]],"v":[[14.415,11.505],[3.355,9.455],[13.205,1.015],[-0.305,-7.285],[-15.475,7.885],[-0.305,23.055]],"c":true}},"nm":"P"},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[19.33,-6.9],[6.71,0],[4.35,1.27],[0,0],[0,0],[0,0],[-5.68,-7.01],[0,0]],"o":[[0,0],[-4.55,1.64],[-6.31,0],[-21.32,-6.2],[0,0],[0,0],[31.09,-30.92],[0,0],[0,0]],"v":[[37.685,2.315],[16.585,27.325],[-0.205,29.965],[-16.105,27.935],[-37.425,3.455],[-37.685,3.315],[-36.355,0.955],[36.715,0.725],[36.755,0.705]],"c":true}},"nm":"P"},{"ty":"mm","mm":1,"nm":"M"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[792.819,652.207]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-5.76,-6.9],[0,0],[0,0],[0,0]],"v":[[9.625,6.435],[9.625,7.095],[-2.985,7.095],[-3.465,7.505],[-9.625,-7.505],[9.625,-7.505],[9.625,-6.835]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[773.419,727.227]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[11.775,6.64],[11.775,7.3],[-11.775,7.3],[-11.775,6.64],[-11.775,-6.63],[-11.775,-7.3],[-1.165,-7.3],[11.775,-7.3],[11.775,-6.63]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[794.819,727.022]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[6.02,-6.92],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-8.63,-7.565],[8.63,-7.565],[2,7.565],[1.33,7.035],[-8.63,7.035],[-8.63,6.375],[-8.63,-6.895]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[815.224,727.286]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[22.61,19.875],[22.55,19.905],[-21.91,19.905],[-22.61,19.515],[-0.41,-19.905]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[793.004,608.906]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[31.09,-30.92],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-5.68,-7.01],[0,0],[0,0],[0,0],[0,0]],"v":[[22.595,-8.92],[36.555,15.21],[36.515,15.23],[-36.555,15.46],[-22.625,-9.28],[-21.925,-8.89],[22.535,-8.89]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[793.019,637.702]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-21.32,-6.2],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[25.075,-0.955],[16.015,25.195],[16.015,25.575],[-24.345,25.575],[-25.075,25.165],[3.495,-25.575],[3.755,-25.435]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[751.639,681.097]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.76,-6.9],[-12.13,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[4.26,5.11],[0,0],[0,0]],"v":[[46.78,15.505],[46.78,22.805],[46.78,23.505],[-46.78,23.505],[-20.31,-23.505],[-19.58,-23.095],[20.78,-23.095],[46.78,-23.095],[46.78,-22.685],[46.78,-10.045],[36.17,-10.045],[16.92,-10.045],[23.08,4.965],[46.65,14.515],[46.76,14.515]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[746.874,729.767]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[19.33,-6.9],[0,0]],"v":[[25.515,25.645],[24.765,26.075],[-14.895,26.075],[-14.895,25.925],[-25.275,-0.425],[-25.515,-1.065],[-4.415,-26.075]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[834.919,680.597]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-6.31,0],[-4.55,1.64],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[4.35,1.27],[6.71,0],[0,0],[0,0]],"v":[[26.185,13.42],[26.185,13.57],[-0.185,13.57],[-26.185,13.57],[-26.185,13.19],[-17.125,-12.96],[-1.225,-10.93],[15.565,-13.57],[15.805,-12.93]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[793.839,693.102]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.38,5.04],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[11.97,-0.03],[6.02,-6.92],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[19.795,-23.515],[47.005,23.515],[-46.985,23.515],[-46.985,22.815],[-46.985,15.515],[-47.005,14.525],[-23.415,5.095],[-16.785,-10.035],[-34.045,-10.035],[-46.985,-10.035],[-46.985,-22.675],[-46.985,-23.085],[-20.615,-23.085],[19.045,-23.085]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[840.639,729.757]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[11.97,-0.03],[0,0],[4.26,5.11],[0,0],[0,0],[0,0]],"o":[[0,0],[-4.38,5.04],[0,0],[-12.13,0],[0,0],[0,0],[0,0],[0,0]],"v":[[22.965,-4.98],[23.635,-4.45],[0.045,4.98],[-0.065,4.98],[-23.635,-4.57],[-23.155,-4.98],[-10.545,-4.98],[13.005,-4.98]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[793.589,739.302]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":30,"op":37,"st":0},{"ind":22,"ty":4,"nm":"m","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.426,"y":0.379},"t":41,"s":[548.543,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":44,"s":[625.5,541.5,0]}],"l":2},"a":{"a":0,"k":[0,0,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.815,0.815,0.815],"y":[1,1,1]},"o":{"x":[0.425,0.425,0.425],"y":[0,0,0]},"t":41,"s":[-100,100,100]},{"t":44,"s":[-100,100,100]}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-26.336,-59.257],[1,-18],[36,-55],[0,0]],"o":[[0,0],[28,63],[-1,18],[-33.439,51.087],[0,0]],"v":[[-63.5,-32.5],[-171.5,-0.5],[-144.5,137.5],[-177.5,291.5],[-65.5,322.5]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2},"lc":1,"lj":1,"ml":4,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"S"}],"ip":41,"op":45,"st":0},{"ind":23,"ty":4,"nm":"i","parent":5,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-12.396,-3.289],[3.289,-12.396],[12.396,3.289],[-3.288,12.396]],"o":[[-12.396,3.289],[-3.288,-12.396],[12.396,-3.289],[3.289,12.396]],"v":[[18.351,0],[0,18.351],[-18.351,0],[0,-18.351]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[701.82,686.579]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-12.396,-3.289],[3.289,-12.396],[12.396,3.289],[-3.288,12.396]],"o":[[-12.396,3.289],[-3.288,-12.396],[12.396,-3.289],[3.289,12.396]],"v":[[18.351,0],[0,18.351],[-18.351,0],[0,-18.351]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[883.673,686.579]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[806.594,733.661],[806.594,720.391]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[783.044,733.661],[783.044,720.391]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[770.434,734.322],[783.044,734.322],[806.594,734.322],[816.554,734.322]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[793.654,719.721],[793.654,707.082]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[793.654,752.572],[793.654,745.271]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-4.38,5.04],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.76,-6.9],[-12.13,0],[0,0]],"o":[[6.02,-6.92],[0,0],[0,0],[0,0],[0,0],[0,0],[4.26,5.11],[0,0],[11.97,-0.03]],"v":[[23.4,2.85],[30.03,-12.28],[12.77,-12.28],[-0.17,-12.28],[-10.78,-12.28],[-30.03,-12.28],[-23.87,2.73],[-0.3,12.28],[-0.19,12.28]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[793.823,732.002]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[5.19,13.175],[-5.19,-13.175]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[814.834,693.347]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-4.54,13.1],[4.52,-13.05],[4.54,-13.1]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[772.194,693.192]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[771.094,628.812],[815.554,628.812]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[727.294,706.672],[767.654,706.672],[793.654,706.672],[820.024,706.672],[859.684,706.672]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-21.32,-6.2],[-6.31,0],[-4.55,1.64],[0,0]],"o":[[0,0],[4.35,1.27],[6.71,0],[19.33,-6.9],[0,0]],"v":[[-37.555,-12.685],[-16.235,11.795],[-0.335,13.825],[16.455,11.185],[37.555,-13.825]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[792.949,668.346]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[31.09,-30.92]],"o":[[-5.68,-7.01],[0,0]],"v":[[36.535,15.23],[-36.535,15.46]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[792.999,637.702]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[21.745,-42.355],[-1.275,-82.135],[-23.475,-42.715],[-37.405,-17.975],[-38.735,-15.615],[-67.305,35.125],[-93.775,82.135],[-0.215,82.135],[93.775,82.135],[66.565,35.105],[36.635,-16.615],[35.705,-18.225]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[793.869,671.136]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[7.13,0],[0,8.38],[-8.38,0],[-2.51,-4.93]],"o":[[0,0],[-1.63,6.63],[-8.38,0],[0,-8.38],[5.9,0],[0,0]],"v":[[3.885,1.57],[14.945,3.62],[0.225,15.17],[-14.945,0],[0.225,-15.17],[13.735,-6.87]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[792.289,660.091]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.63,6.63],[0,0],[0,0],[5.9,0],[0,-8.38],[-8.38,0]],"o":[[0,0],[0,0],[-2.51,-4.93],[-8.38,0],[0,8.38],[7.13,0]],"v":[[14.415,11.505],[3.355,9.455],[13.205,1.015],[-0.305,-7.285],[-15.475,7.885],[-0.305,23.055]],"c":true}},"nm":"P"},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[19.33,-6.9],[6.71,0],[4.35,1.27],[0,0],[0,0],[0,0],[-5.68,-7.01],[0,0]],"o":[[0,0],[-4.55,1.64],[-6.31,0],[-21.32,-6.2],[0,0],[0,0],[31.09,-30.92],[0,0],[0,0]],"v":[[37.685,2.315],[16.585,27.325],[-0.205,29.965],[-16.105,27.935],[-37.425,3.455],[-37.685,3.315],[-36.355,0.955],[36.715,0.725],[36.755,0.705]],"c":true}},"nm":"P"},{"ty":"mm","mm":1,"nm":"M"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[792.819,652.207]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-5.76,-6.9],[0,0],[0,0],[0,0]],"v":[[9.625,6.435],[9.625,7.095],[-2.985,7.095],[-3.465,7.505],[-9.625,-7.505],[9.625,-7.505],[9.625,-6.835]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[773.419,727.227]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[11.775,6.64],[11.775,7.3],[-11.775,7.3],[-11.775,6.64],[-11.775,-6.63],[-11.775,-7.3],[-1.165,-7.3],[11.775,-7.3],[11.775,-6.63]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[794.819,727.022]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[6.02,-6.92],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-8.63,-7.565],[8.63,-7.565],[2,7.565],[1.33,7.035],[-8.63,7.035],[-8.63,6.375],[-8.63,-6.895]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[815.224,727.286]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[22.61,19.875],[22.55,19.905],[-21.91,19.905],[-22.61,19.515],[-0.41,-19.905]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[793.004,608.906]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[31.09,-30.92],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-5.68,-7.01],[0,0],[0,0],[0,0],[0,0]],"v":[[22.595,-8.92],[36.555,15.21],[36.515,15.23],[-36.555,15.46],[-22.625,-9.28],[-21.925,-8.89],[22.535,-8.89]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[793.019,637.702]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-21.32,-6.2],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[25.075,-0.955],[16.015,25.195],[16.015,25.575],[-24.345,25.575],[-25.075,25.165],[3.495,-25.575],[3.755,-25.435]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[751.639,681.097]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.76,-6.9],[-12.13,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[4.26,5.11],[0,0],[0,0]],"v":[[46.78,15.505],[46.78,22.805],[46.78,23.505],[-46.78,23.505],[-20.31,-23.505],[-19.58,-23.095],[20.78,-23.095],[46.78,-23.095],[46.78,-22.685],[46.78,-10.045],[36.17,-10.045],[16.92,-10.045],[23.08,4.965],[46.65,14.515],[46.76,14.515]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[746.874,729.767]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[19.33,-6.9],[0,0]],"v":[[25.515,25.645],[24.765,26.075],[-14.895,26.075],[-14.895,25.925],[-25.275,-0.425],[-25.515,-1.065],[-4.415,-26.075]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[834.919,680.597]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-6.31,0],[-4.55,1.64],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[4.35,1.27],[6.71,0],[0,0],[0,0]],"v":[[26.185,13.42],[26.185,13.57],[-0.185,13.57],[-26.185,13.57],[-26.185,13.19],[-17.125,-12.96],[-1.225,-10.93],[15.565,-13.57],[15.805,-12.93]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[793.839,693.102]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.38,5.04],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[11.97,-0.03],[6.02,-6.92],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[19.795,-23.515],[47.005,23.515],[-46.985,23.515],[-46.985,22.815],[-46.985,15.515],[-47.005,14.525],[-23.415,5.095],[-16.785,-10.035],[-34.045,-10.035],[-46.985,-10.035],[-46.985,-22.675],[-46.985,-23.085],[-20.615,-23.085],[19.045,-23.085]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[840.639,729.757]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[11.97,-0.03],[0,0],[4.26,5.11],[0,0],[0,0],[0,0]],"o":[[0,0],[-4.38,5.04],[0,0],[-12.13,0],[0,0],[0,0],[0,0],[0,0]],"v":[[22.965,-4.98],[23.635,-4.45],[0.045,4.98],[-0.065,4.98],[-23.635,-4.57],[-23.155,-4.98],[-10.545,-4.98],[13.005,-4.98]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[793.589,739.302]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":36,"op":45,"st":6},{"ind":24,"ty":4,"nm":"i","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-71.88],[71.88,0],[0,71.88],[-71.88,0]],"o":[[0,71.88],[-71.88,0],[0,-71.88],[71.88,0]],"v":[[130.15,0],[0,130.15],[-130.15,0],[0,-130.15]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-71.88,0],[0,-71.88],[71.88,0],[0,71.88]],"o":[[71.88,0],[0,71.88],[-71.88,0],[0,-71.88]],"v":[[0,-130.15],[130.15,0],[0,130.15],[-130.15,0]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":4,"op":9,"st":0},{"ind":25,"ty":4,"nm":"i","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-71.88],[71.88,0],[0,71.88],[-71.88,0]],"o":[[0,71.88],[-71.88,0],[0,-71.88],[71.88,0]],"v":[[130.15,0],[0,130.15],[-130.15,0],[0,-130.15]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-71.88,0],[0,-71.88],[71.88,0],[0,71.88]],"o":[[71.88,0],[0,71.88],[-71.88,0],[0,-71.88]],"v":[[0,-130.15],[130.15,0],[0,130.15],[-130.15,0]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":18,"op":25,"st":5},{"ind":26,"ty":4,"nm":"i","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-71.88],[71.88,0],[0,71.88],[-71.88,0]],"o":[[0,71.88],[-71.88,0],[0,-71.88],[71.88,0]],"v":[[130.15,0],[0,130.15],[-130.15,0],[0,-130.15]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-71.88,0],[0,-71.88],[71.88,0],[0,71.88]],"o":[[71.88,0],[0,71.88],[-71.88,0],[0,-71.88]],"v":[[0,-130.15],[130.15,0],[0,130.15],[-130.15,0]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":33,"op":40,"st":0},{"ind":27,"ty":4,"nm":"m","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.622,"y":0.8},"o":{"x":0.167,"y":0.167},"t":0,"s":[962.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.35,"y":0.002},"t":5,"s":[1066.402,541.5,0],"to":[0,0,0],"ti":[122.709,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[779.001,-1181.5,0],"to":[-123.126,0,0],"ti":[122.709,0,0]},{"i":{"x":0.65,"y":0.998},"o":{"x":0.167,"y":0.167},"t":8,"s":[779.001,-1181.5,0],"to":[-123.126,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.378,"y":0.2},"t":9,"s":[512.153,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[625.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.622,"y":0.8},"o":{"x":0.167,"y":0.167},"t":15,"s":[962.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.35,"y":0.002},"t":20,"s":[1066.402,541.5,0],"to":[0,0,0],"ti":[122.709,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[779.001,-1181.5,0],"to":[-123.126,0,0],"ti":[122.709,0,0]},{"i":{"x":0.65,"y":0.998},"o":{"x":0.167,"y":0.167},"t":23,"s":[779.001,-1181.5,0],"to":[-123.126,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.378,"y":0.2},"t":24,"s":[512.153,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[625.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.622,"y":0.8},"o":{"x":0.167,"y":0.167},"t":30,"s":[962.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.35,"y":0.002},"t":35,"s":[1066.402,541.5,0],"to":[0,0,0],"ti":[122.709,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[779.001,-1181.5,0],"to":[-123.126,0,0],"ti":[122.709,0,0]},{"i":{"x":0.65,"y":0.998},"o":{"x":0.167,"y":0.167},"t":38,"s":[779.001,-1181.5,0],"to":[-123.126,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.378,"y":0.2},"t":39,"s":[512.153,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":44,"s":[625.5,541.5,0]}],"l":2},"a":{"a":0,"k":[0,0,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.622,0.622,0.622],"y":[1,1,1]},"o":{"x":[0.169,0.169,0.169],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.35,0.35,0.35],"y":[0,0,0]},"t":5,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[0,0,100]},{"i":{"x":[0.65,0.65,0.65],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":8,"s":[0,0,100]},{"i":{"x":[0.831,0.831,0.831],"y":[1,1,1]},"o":{"x":[0.378,0.378,0.378],"y":[0,0,0]},"t":9,"s":[-100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[-100,100,100]},{"i":{"x":[0.622,0.622,0.622],"y":[1,1,1]},"o":{"x":[0.169,0.169,0.169],"y":[0,0,0]},"t":15,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.35,0.35,0.35],"y":[0,0,0]},"t":20,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":21,"s":[0,0,100]},{"i":{"x":[0.65,0.65,0.65],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":23,"s":[0,0,100]},{"i":{"x":[0.831,0.831,0.831],"y":[1,1,1]},"o":{"x":[0.378,0.378,0.378],"y":[0,0,0]},"t":24,"s":[-100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[-100,100,100]},{"i":{"x":[0.622,0.622,0.622],"y":[1,1,1]},"o":{"x":[0.169,0.169,0.169],"y":[0,0,0]},"t":30,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.35,0.35,0.35],"y":[0,0,0]},"t":35,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":36,"s":[0,0,100]},{"i":{"x":[0.65,0.65,0.65],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":38,"s":[0,0,100]},{"i":{"x":[0.831,0.831,0.831],"y":[1,1,1]},"o":{"x":[0.378,0.378,0.378],"y":[0,0,0]},"t":39,"s":[-100,100,100]},{"t":44,"s":[-100,100,100]}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-26.336,-59.257],[1,-18],[36,-55],[0,0]],"o":[[0,0],[28,63],[-1,18],[-33.439,51.087],[0,0]],"v":[[-63.5,-32.5],[-171.5,-0.5],[-144.5,137.5],[-177.5,291.5],[-65.5,322.5]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2},"lc":1,"lj":1,"ml":4,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"S"}],"ip":0,"op":45,"st":0},{"ind":28,"ty":4,"nm":"i","parent":6,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-71.88],[71.88,0],[0,71.88],[-71.88,0]],"o":[[0,71.88],[-71.88,0],[0,-71.88],[71.88,0]],"v":[[130.15,0],[0,130.15],[-130.15,0],[0,-130.15]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-71.88,0],[0,-71.88],[71.88,0],[0,71.88]],"o":[[71.88,0],[0,71.88],[-71.88,0],[0,-71.88]],"v":[[0,-130.15],[130.15,0],[0,130.15],[-130.15,0]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":0,"op":45,"st":0},{"ind":29,"ty":4,"nm":"m","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.622,"y":0.8},"o":{"x":0.167,"y":0.167},"t":0,"s":[962.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.35,"y":0.002},"t":5,"s":[1066.402,541.5,0],"to":[0,0,0],"ti":[122.709,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[779.001,-1181.5,0],"to":[-123.126,0,0],"ti":[122.709,0,0]},{"i":{"x":0.65,"y":0.998},"o":{"x":0.167,"y":0.167},"t":8,"s":[779.001,-1181.5,0],"to":[-123.126,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.378,"y":0.2},"t":9,"s":[512.153,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[625.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.622,"y":0.8},"o":{"x":0.167,"y":0.167},"t":15,"s":[962.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.35,"y":0.002},"t":20,"s":[1066.402,541.5,0],"to":[0,0,0],"ti":[122.709,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[779.001,-1181.5,0],"to":[-123.126,0,0],"ti":[122.709,0,0]},{"i":{"x":0.65,"y":0.998},"o":{"x":0.167,"y":0.167},"t":23,"s":[779.001,-1181.5,0],"to":[-123.126,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.378,"y":0.2},"t":24,"s":[512.153,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[625.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.622,"y":0.8},"o":{"x":0.167,"y":0.167},"t":30,"s":[962.5,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.35,"y":0.002},"t":35,"s":[1066.402,541.5,0],"to":[0,0,0],"ti":[122.709,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[779.001,-1181.5,0],"to":[-123.126,0,0],"ti":[122.709,0,0]},{"i":{"x":0.65,"y":0.998},"o":{"x":0.167,"y":0.167},"t":38,"s":[779.001,-1181.5,0],"to":[-123.126,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.378,"y":0.2},"t":39,"s":[512.153,541.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":44,"s":[625.5,541.5,0]}],"l":2},"a":{"a":0,"k":[0,0,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.622,0.622,0.622],"y":[1,1,1]},"o":{"x":[0.169,0.169,0.169],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.35,0.35,0.35],"y":[0,0,0]},"t":5,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[0,0,100]},{"i":{"x":[0.65,0.65,0.65],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":8,"s":[0,0,100]},{"i":{"x":[0.831,0.831,0.831],"y":[1,1,1]},"o":{"x":[0.378,0.378,0.378],"y":[0,0,0]},"t":9,"s":[-100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[-100,100,100]},{"i":{"x":[0.622,0.622,0.622],"y":[1,1,1]},"o":{"x":[0.169,0.169,0.169],"y":[0,0,0]},"t":15,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.35,0.35,0.35],"y":[0,0,0]},"t":20,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":21,"s":[0,0,100]},{"i":{"x":[0.65,0.65,0.65],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":23,"s":[0,0,100]},{"i":{"x":[0.831,0.831,0.831],"y":[1,1,1]},"o":{"x":[0.378,0.378,0.378],"y":[0,0,0]},"t":24,"s":[-100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[-100,100,100]},{"i":{"x":[0.622,0.622,0.622],"y":[1,1,1]},"o":{"x":[0.169,0.169,0.169],"y":[0,0,0]},"t":30,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.35,0.35,0.35],"y":[0,0,0]},"t":35,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":36,"s":[0,0,100]},{"i":{"x":[0.65,0.65,0.65],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":38,"s":[0,0,100]},{"i":{"x":[0.831,0.831,0.831],"y":[1,1,1]},"o":{"x":[0.378,0.378,0.378],"y":[0,0,0]},"t":39,"s":[-100,100,100]},{"t":44,"s":[-100,100,100]}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-26.336,-59.257],[1,-18],[36,-55],[0,0]],"o":[[0,0],[28,63],[-1,18],[-33.439,51.087],[0,0]],"v":[[-63.5,-32.5],[-171.5,-0.5],[-144.5,137.5],[-177.5,291.5],[-65.5,322.5]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2},"lc":1,"lj":1,"ml":4,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"S"}],"ip":0,"op":45,"st":0},{"ind":30,"ty":4,"nm":"i","parent":6,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-71.88],[71.88,0],[0,71.88],[-71.88,0]],"o":[[0,71.88],[-71.88,0],[0,-71.88],[71.88,0]],"v":[[130.15,0],[0,130.15],[-130.15,0],[0,-130.15]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-71.88,0],[0,-71.88],[71.88,0],[0,71.88]],"o":[[71.88,0],[0,71.88],[-71.88,0],[0,-71.88]],"v":[[0,-130.15],[130.15,0],[0,130.15],[-130.15,0]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":0,"op":45,"st":0},{"ind":31,"ty":4,"nm":"i","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-82.035],[82.035,0],[0,82.035],[-82.035,0]],"o":[[0,82.035],[-82.035,0],[0,-82.035],[82.035,0]],"v":[[148.537,0],[0,148.537],[-148.537,0],[0,-148.537]],"c":true}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"fl","c":{"a":0,"k":[0,0.129,0.251,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[792.443,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-82.035,0],[0,-82.035],[82.035,0],[0,82.035]],"o":[[82.035,0],[0,82.035],[-82.035,0],[0,-82.035]],"v":[[0,-148.537],[148.537,0],[0,148.537],[-148.537,0]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0,0.129,0.251,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":0,"op":45,"st":0},{"ind":32,"ty":4,"nm":"s","parent":8,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-339.29,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[-100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[491.024,827.341],[491.034,827.341],[572.824,827.341]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[455.244,799.401],[572.824,799.401]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[437.134,777.062],[437.144,777.062],[572.824,777.062]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[421.444,747.612],[572.824,747.612]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[414.524,726.642],[572.824,726.642]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[486.814,548.082],[572.824,548.082]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[452.634,577.052],[572.824,577.052]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[434.964,599.802],[572.824,599.802]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[421.444,626.812],[572.824,626.812]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[414.524,650.121],[572.824,650.121]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[410.144,676.802],[572.824,676.802]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[410.144,700.901],[572.824,700.901]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[23.89,13.78]],"o":[[0,0],[-29.56,0],[0,0]],"v":[[40.895,10.83],[40.275,10.83],[-40.895,-10.83]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[531.929,838.172]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[10.53,10.89],[5.37,7.98]],"o":[[-13.21,-7.62],[-6.67,-6.89],[0,0]],"v":[[26.94,25.14],[-8.84,-2.8],[-26.94,-25.14]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[464.084,802.202]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[4.23,10.4],[1.84,7.2],[0.79,8.8],[0,4.92],[-0.19,3.14],[-2,8.71],[-2.98,7.52],[-5.38,8.51],[-6.5,7.11],[-12.82,7.94],[-31.38,0],[0,0]],"o":[[-6.19,-9.19],[-2.77,-6.77],[-2.13,-8.34],[-0.42,-4.81],[0,-3.19],[0.52,-9.19],[1.83,-8.03],[3.74,-9.48],[5.17,-8.19],[10.13,-11.08],[24.85,-15.39],[0,0],[0,0]],"v":[[-54.02,126.745],[-69.71,97.295],[-76.63,76.325],[-81.03,50.585],[-81.67,35.975],[-81.39,26.465],[-77.58,-0.415],[-70.35,-23.765],[-56.63,-50.795],[-39.08,-73.785],[-4.49,-102.475],[81.05,-126.745],[81.67,-126.745]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[491.154,650.317]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-31.38,0]],"o":[[0,0],[0,0],[0,0],[24.85,-15.39],[0,0]],"v":[[43.08,-12.255],[43.08,12.255],[-42.93,12.255],[-43.08,12.015],[42.46,-12.255]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[529.744,535.826]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-12.82,7.94],[0,0]],"o":[[0,0],[0,0],[0,0],[10.13,-11.08],[0,0],[0,0]],"v":[[60.375,-14.365],[60.375,14.605],[-59.815,14.605],[-60.375,14.085],[-25.785,-14.605],[-25.635,-14.365]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[512.449,562.447]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-6.5,7.11],[0,0]],"o":[[0,0],[0,0],[0,0],[5.17,-8.19],[0,0],[0,0]],"v":[[69.15,-11.115],[69.15,11.635],[-68.71,11.635],[-69.15,11.355],[-51.6,-11.635],[-51.04,-11.115]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[503.674,588.167]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-5.38,8.51],[0,0]],"o":[[0,0],[0,0],[0,0],[3.74,-9.48],[0,0],[0,0]],"v":[[76.01,-13.365],[76.01,13.645],[-75.37,13.645],[-76.01,13.385],[-62.29,-13.645],[-61.85,-13.365]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[496.814,613.167]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2.98,7.52],[0,0]],"o":[[0,0],[0,0],[0,0],[1.83,-8.03],[0,0],[0,0]],"v":[[79.625,-11.525],[79.625,11.785],[-78.675,11.785],[-79.625,11.565],[-72.395,-11.785],[-71.755,-11.525]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[493.199,638.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2,8.71],[0,0]],"o":[[0,0],[0,0],[0,0],[0.52,-9.19],[0,0],[0,0]],"v":[[81.53,-13.23],[81.53,13.45],[-81.15,13.45],[-81.53,13.43],[-77.72,-13.45],[-76.77,-13.23]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[491.294,663.352]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,4.92],[-0.19,3.14],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.42,-4.81],[0,-3.19],[0,0],[0,0]],"v":[[81.67,-12.04],[81.67,12.06],[-81.01,12.06],[-81.03,12.06],[-81.67,-2.55],[-81.39,-12.06],[-81.01,-12.04]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[491.154,688.842]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0.79,8.8],[0,0]],"o":[[0,0],[0,0],[-2.13,-8.34],[0,0],[0,0]],"v":[[81.35,-12.87],[81.35,12.87],[-76.95,12.87],[-81.35,-12.87],[-81.33,-12.87]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[491.474,713.771]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[1.84,7.2]],"o":[[0,0],[0,0],[-2.77,-6.77],[0,0]],"v":[[79.15,-10.485],[79.15,10.485],[-72.23,10.485],[-79.15,-10.485]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[493.674,737.127]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[4.23,10.4]],"o":[[0,0],[0,0],[0,0],[-6.19,-9.19],[0,0]],"v":[[75.69,-14.725],[75.69,14.725],[-59.99,14.725],[-60,14.725],[-75.69,-14.725]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[497.134,762.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[5.37,7.98]],"o":[[0,0],[0,0],[-6.67,-6.89],[0,0]],"v":[[67.84,-11.17],[67.84,11.17],[-49.74,11.17],[-67.84,-11.17]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[504.984,788.232]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[10.53,10.89]],"o":[[0,0],[0,0],[0,0],[-13.21,-7.62],[0,0]],"v":[[58.79,-13.97],[58.79,13.97],[-23,13.97],[-23.01,13.97],[-58.79,-13.97]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[514.034,813.371]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[23.89,13.78]],"o":[[0,0],[0,0],[-29.56,0],[0,0]],"v":[[40.895,-10.83],[40.895,10.83],[40.275,10.83],[-40.895,-10.83]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[531.929,838.172]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":0,"op":45,"st":0},{"ind":33,"ty":4,"nm":"s","parent":9,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[440.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[491.024,827.341],[491.034,827.341],[572.824,827.341]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[455.244,799.401],[572.824,799.401]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[437.134,777.062],[437.144,777.062],[572.824,777.062]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[421.444,747.612],[572.824,747.612]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[414.524,726.642],[572.824,726.642]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[486.814,548.082],[572.824,548.082]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[452.634,577.052],[572.824,577.052]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[434.964,599.802],[572.824,599.802]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[421.444,626.812],[572.824,626.812]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[414.524,650.121],[572.824,650.121]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[410.144,676.802],[572.824,676.802]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[410.144,700.901],[572.824,700.901]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[23.89,13.78]],"o":[[0,0],[-29.56,0],[0,0]],"v":[[40.895,10.83],[40.275,10.83],[-40.895,-10.83]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[531.929,838.172]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[10.53,10.89],[5.37,7.98]],"o":[[-13.21,-7.62],[-6.67,-6.89],[0,0]],"v":[[26.94,25.14],[-8.84,-2.8],[-26.94,-25.14]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[464.084,802.202]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[4.23,10.4],[1.84,7.2],[0.79,8.8],[0,4.92],[-0.19,3.14],[-2,8.71],[-2.98,7.52],[-5.38,8.51],[-6.5,7.11],[-12.82,7.94],[-31.38,0],[0,0]],"o":[[-6.19,-9.19],[-2.77,-6.77],[-2.13,-8.34],[-0.42,-4.81],[0,-3.19],[0.52,-9.19],[1.83,-8.03],[3.74,-9.48],[5.17,-8.19],[10.13,-11.08],[24.85,-15.39],[0,0],[0,0]],"v":[[-54.02,126.745],[-69.71,97.295],[-76.63,76.325],[-81.03,50.585],[-81.67,35.975],[-81.39,26.465],[-77.58,-0.415],[-70.35,-23.765],[-56.63,-50.795],[-39.08,-73.785],[-4.49,-102.475],[81.05,-126.745],[81.67,-126.745]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[491.154,650.317]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-31.38,0]],"o":[[0,0],[0,0],[0,0],[24.85,-15.39],[0,0]],"v":[[43.08,-12.255],[43.08,12.255],[-42.93,12.255],[-43.08,12.015],[42.46,-12.255]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[529.744,535.826]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-12.82,7.94],[0,0]],"o":[[0,0],[0,0],[0,0],[10.13,-11.08],[0,0],[0,0]],"v":[[60.375,-14.365],[60.375,14.605],[-59.815,14.605],[-60.375,14.085],[-25.785,-14.605],[-25.635,-14.365]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[512.449,562.447]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-6.5,7.11],[0,0]],"o":[[0,0],[0,0],[0,0],[5.17,-8.19],[0,0],[0,0]],"v":[[69.15,-11.115],[69.15,11.635],[-68.71,11.635],[-69.15,11.355],[-51.6,-11.635],[-51.04,-11.115]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[503.674,588.167]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-5.38,8.51],[0,0]],"o":[[0,0],[0,0],[0,0],[3.74,-9.48],[0,0],[0,0]],"v":[[76.01,-13.365],[76.01,13.645],[-75.37,13.645],[-76.01,13.385],[-62.29,-13.645],[-61.85,-13.365]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[496.814,613.167]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2.98,7.52],[0,0]],"o":[[0,0],[0,0],[0,0],[1.83,-8.03],[0,0],[0,0]],"v":[[79.625,-11.525],[79.625,11.785],[-78.675,11.785],[-79.625,11.565],[-72.395,-11.785],[-71.755,-11.525]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[493.199,638.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2,8.71],[0,0]],"o":[[0,0],[0,0],[0,0],[0.52,-9.19],[0,0],[0,0]],"v":[[81.53,-13.23],[81.53,13.45],[-81.15,13.45],[-81.53,13.43],[-77.72,-13.45],[-76.77,-13.23]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[491.294,663.352]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,4.92],[-0.19,3.14],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.42,-4.81],[0,-3.19],[0,0],[0,0]],"v":[[81.67,-12.04],[81.67,12.06],[-81.01,12.06],[-81.03,12.06],[-81.67,-2.55],[-81.39,-12.06],[-81.01,-12.04]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[491.154,688.842]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0.79,8.8],[0,0]],"o":[[0,0],[0,0],[-2.13,-8.34],[0,0],[0,0]],"v":[[81.35,-12.87],[81.35,12.87],[-76.95,12.87],[-81.35,-12.87],[-81.33,-12.87]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[491.474,713.771]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[1.84,7.2]],"o":[[0,0],[0,0],[-2.77,-6.77],[0,0]],"v":[[79.15,-10.485],[79.15,10.485],[-72.23,10.485],[-79.15,-10.485]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[493.674,737.127]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[4.23,10.4]],"o":[[0,0],[0,0],[0,0],[-6.19,-9.19],[0,0]],"v":[[75.69,-14.725],[75.69,14.725],[-59.99,14.725],[-60,14.725],[-75.69,-14.725]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[497.134,762.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[5.37,7.98]],"o":[[0,0],[0,0],[-6.67,-6.89],[0,0]],"v":[[67.84,-11.17],[67.84,11.17],[-49.74,11.17],[-67.84,-11.17]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[504.984,788.232]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[10.53,10.89]],"o":[[0,0],[0,0],[0,0],[-13.21,-7.62],[0,0]],"v":[[58.79,-13.97],[58.79,13.97],[-23,13.97],[-23.01,13.97],[-58.79,-13.97]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[514.034,813.371]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[23.89,13.78]],"o":[[0,0],[0,0],[-29.56,0],[0,0]],"v":[[40.895,-10.83],[40.895,10.83],[40.275,10.83],[-40.895,-10.83]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[531.929,838.172]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":0,"op":45,"st":0},{"ind":34,"ty":4,"nm":"s","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[421.71,-94.255,0],"l":2},"a":{"a":0,"k":[962.21,541.245,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[569.914,827.341],[610.524,827.341],[610.564,827.341]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,799.401],[610.244,799.401]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,777.062],[610.444,777.062]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,747.612],[610.244,747.612]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,726.642],[610.364,726.642]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,700.901],[610.244,700.901]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,676.781],[610.244,676.781]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[569.914,650.121],[610.234,650.121],[610.244,650.121]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,626.812],[609.914,626.812]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,599.802],[609.914,599.802]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,577.052],[609.744,577.052]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,548.082],[609.744,548.082]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.27,-162.675],[-0.23,-138.205],[-0.18,-109.235],[-0.14,-86.485],[-0.1,-59.475],[-0.06,-36.165],[-0.02,-9.505],[0.02,14.615],[0.07,40.355],[0.1,61.325],[0.15,90.775],[0.19,113.115],[0.23,141.055],[0.27,162.675]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[610.294,686.286]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[610.564,848.961],[569.914,848.961]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[610.024,523.612],[569.914,523.612]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[569.914,523.612],[569.914,548.082],[569.914,577.052],[569.914,599.802],[569.914,626.812],[569.914,650.122],[569.914,676.781],[569.914,700.901],[569.914,726.641],[569.914,747.612],[569.914,777.062],[569.914,799.401],[569.914,827.342],[569.914,848.962],[569.914,849.002]],"c":false}},"nm":"P"},{"ty":"st","c":{"a":0,"k":[0.043,0.106,0.204,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"nm":"S"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.035,-12.235],[20.075,12.235],[19.755,12.235],[-20.075,12.235],[-20.075,-12.235]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[589.989,535.847]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.05,-14.485],[20.1,14.485],[19.73,14.485],[-20.1,14.485],[-20.1,-14.485],[19.73,-14.485]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[590.014,562.567]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.08,-11.375],[20.12,11.375],[19.88,11.375],[-20.12,11.375],[-20.12,-11.375],[19.71,-11.375]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[590.034,588.427]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.1,-13.505],[20.14,13.505],[19.86,13.505],[-20.14,13.505],[-20.14,-13.505],[19.86,-13.505]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[590.054,613.307]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.12,-11.655],[20.16,11.655],[-20.16,11.655],[-20.16,-11.655],[19.84,-11.655]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[590.074,638.467]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.14,-13.33],[20.18,13.33],[20.15,13.33],[-20.18,13.33],[-20.18,-13.33]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[590.094,663.451]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.16,-12.06],[20.2,12.06],[20.13,12.06],[-20.2,12.06],[-20.2,-12.06],[20.13,-12.06]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[590.114,688.841]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.175,-12.87],[20.225,12.87],[-20.225,12.87],[-20.225,-12.87],[20.105,-12.87]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[590.139,713.771]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.21,-10.485],[20.24,10.485],[20.09,10.485],[-20.24,10.485],[-20.24,-10.485]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[590.154,737.127]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.215,-14.725],[20.265,14.725],[-20.265,14.725],[-20.265,-14.725],[20.065,-14.725]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[590.179,762.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.245,-11.17],[20.285,11.17],[20.045,11.17],[-20.285,11.17],[-20.285,-11.17]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[590.199,788.232]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.265,-13.97],[20.305,13.97],[-20.305,13.97],[-20.305,-13.97],[20.025,-13.97]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.894,0.737,0.027,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[590.219,813.371]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[20.285,-10.81],[20.325,10.81],[-20.325,10.81],[-20.325,-10.81]],"c":true}},"nm":"P"},{"ty":"fl","c":{"a":0,"k":[0.82,0.502,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"F"},{"ty":"tr","p":{"a":0,"k":[590.239,838.151]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"T"}],"nm":"G"}],"ip":0,"op":45,"st":0}]}],"layers":[{"ind":1,"ty":0,"nm":"E","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[355.5,43.5,0],"l":2},"a":{"a":0,"k":[962.5,541.5,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"w":1925,"h":1083,"ip":0,"op":45,"st":0}],"markers":[]} \ No newline at end of file +{"v":"4.8.0","ip":0,"op":98,"fr":24,"w":375,"h":240,"nm":"C","assets":[{"id":"comp_0","layers":[{"ind":1,"ty":0,"nm":"E","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[355.5,43.5,0]},"a":{"a":0,"k":[962.5,541.5,0]},"s":{"a":0,"k":[100,100,100]}},"ip":0,"op":98,"st":0,"refId":"comp_1","h":1083,"w":1925}]},{"id":"comp_1","layers":[{"ind":1,"ty":0,"nm":"c","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[962.5,541.5,0]},"a":{"a":0,"k":[962.5,541.5,0]},"s":{"a":0,"k":[100,100,100]}},"ip":0,"op":98,"st":0,"refId":"comp_2","h":1083,"w":1925}]},{"id":"comp_2","layers":[{"ind":1,"ty":4,"nm":"s","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[1072.526,541.245,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[75,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[569.914,827.341],[610.524,827.341],[610.564,827.341]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,799.401],[610.244,799.401]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,777.062],[610.444,777.062]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,747.612],[610.244,747.612]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,726.642],[610.364,726.642]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,700.901],[610.244,700.901]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,676.781],[610.244,676.781]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[569.914,650.121],[610.234,650.121],[610.244,650.121]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,626.812],[609.914,626.812]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,599.802],[609.914,599.802]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,577.052],[609.744,577.052]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,548.082],[609.744,548.082]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.27,-162.675],[-0.23,-138.205],[-0.18,-109.235],[-0.14,-86.485],[-0.1,-59.475],[-0.06,-36.165],[-0.02,-9.505],[0.02,14.615],[0.07,40.355],[0.1,61.325],[0.15,90.775],[0.19,113.115],[0.23,141.055],[0.27,162.675]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[610.294,686.286]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[610.564,848.961],[569.914,848.961]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[610.024,523.612],[569.914,523.612]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[569.914,523.612],[569.914,548.082],[569.914,577.052],[569.914,599.802],[569.914,626.812],[569.914,650.122],[569.914,676.781],[569.914,700.901],[569.914,726.641],[569.914,747.612],[569.914,777.062],[569.914,799.401],[569.914,827.342],[569.914,848.962],[569.914,849.002]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.035,-12.235],[20.075,12.235],[19.755,12.235],[-20.075,12.235],[-20.075,-12.235]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[589.989,535.847]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.05,-14.485],[20.1,14.485],[19.73,14.485],[-20.1,14.485],[-20.1,-14.485],[19.73,-14.485]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.014,562.567]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.08,-11.375],[20.12,11.375],[19.88,11.375],[-20.12,11.375],[-20.12,-11.375],[19.71,-11.375]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.034,588.427]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.1,-13.505],[20.14,13.505],[19.86,13.505],[-20.14,13.505],[-20.14,-13.505],[19.86,-13.505]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.054,613.307]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.12,-11.655],[20.16,11.655],[-20.16,11.655],[-20.16,-11.655],[19.84,-11.655]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.074,638.467]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.14,-13.33],[20.18,13.33],[20.15,13.33],[-20.18,13.33],[-20.18,-13.33]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.094,663.451]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.16,-12.06],[20.2,12.06],[20.13,12.06],[-20.2,12.06],[-20.2,-12.06],[20.13,-12.06]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.114,688.841]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.175,-12.87],[20.225,12.87],[-20.225,12.87],[-20.225,-12.87],[20.105,-12.87]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.139,713.771]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.21,-10.485],[20.24,10.485],[20.09,10.485],[-20.24,10.485],[-20.24,-10.485]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.154,737.127]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.215,-14.725],[20.265,14.725],[-20.265,14.725],[-20.265,-14.725],[20.065,-14.725]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.179,762.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.245,-11.17],[20.285,11.17],[20.045,11.17],[-20.285,11.17],[-20.285,-11.17]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.199,788.232]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.265,-13.97],[20.305,13.97],[-20.305,13.97],[-20.305,-13.97],[20.025,-13.97]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.219,813.371]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[20.285,-10.81],[20.325,10.81],[-20.325,10.81],[-20.325,-10.81]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.239,838.151]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":96,"op":97,"st":65},{"ind":2,"ty":4,"nm":"s","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[1072.526,541.245,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[75,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[569.914,827.341],[610.524,827.341],[610.564,827.341]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,799.401],[610.244,799.401]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,777.062],[610.444,777.062]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,747.612],[610.244,747.612]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,726.642],[610.364,726.642]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,700.901],[610.244,700.901]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,676.781],[610.244,676.781]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[569.914,650.121],[610.234,650.121],[610.244,650.121]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,626.812],[609.914,626.812]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,599.802],[609.914,599.802]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,577.052],[609.744,577.052]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,548.082],[609.744,548.082]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.27,-162.675],[-0.23,-138.205],[-0.18,-109.235],[-0.14,-86.485],[-0.1,-59.475],[-0.06,-36.165],[-0.02,-9.505],[0.02,14.615],[0.07,40.355],[0.1,61.325],[0.15,90.775],[0.19,113.115],[0.23,141.055],[0.27,162.675]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[610.294,686.286]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[610.564,848.961],[569.914,848.961]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[610.024,523.612],[569.914,523.612]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[569.914,523.612],[569.914,548.082],[569.914,577.052],[569.914,599.802],[569.914,626.812],[569.914,650.122],[569.914,676.781],[569.914,700.901],[569.914,726.641],[569.914,747.612],[569.914,777.062],[569.914,799.401],[569.914,827.342],[569.914,848.962],[569.914,849.002]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.035,-12.235],[20.075,12.235],[19.755,12.235],[-20.075,12.235],[-20.075,-12.235]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[589.989,535.847]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.05,-14.485],[20.1,14.485],[19.73,14.485],[-20.1,14.485],[-20.1,-14.485],[19.73,-14.485]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.014,562.567]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.08,-11.375],[20.12,11.375],[19.88,11.375],[-20.12,11.375],[-20.12,-11.375],[19.71,-11.375]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.034,588.427]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.1,-13.505],[20.14,13.505],[19.86,13.505],[-20.14,13.505],[-20.14,-13.505],[19.86,-13.505]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.054,613.307]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.12,-11.655],[20.16,11.655],[-20.16,11.655],[-20.16,-11.655],[19.84,-11.655]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.074,638.467]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.14,-13.33],[20.18,13.33],[20.15,13.33],[-20.18,13.33],[-20.18,-13.33]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.094,663.451]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.16,-12.06],[20.2,12.06],[20.13,12.06],[-20.2,12.06],[-20.2,-12.06],[20.13,-12.06]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.114,688.841]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.175,-12.87],[20.225,12.87],[-20.225,12.87],[-20.225,-12.87],[20.105,-12.87]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.139,713.771]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.21,-10.485],[20.24,10.485],[20.09,10.485],[-20.24,10.485],[-20.24,-10.485]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.154,737.127]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.215,-14.725],[20.265,14.725],[-20.265,14.725],[-20.265,-14.725],[20.065,-14.725]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.179,762.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.245,-11.17],[20.285,11.17],[20.045,11.17],[-20.285,11.17],[-20.285,-11.17]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.199,788.232]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.265,-13.97],[20.305,13.97],[-20.305,13.97],[-20.305,-13.97],[20.025,-13.97]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.219,813.371]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[20.285,-10.81],[20.325,10.81],[-20.325,10.81],[-20.325,-10.81]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.239,838.151]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":64,"op":65,"st":33},{"ind":3,"ty":4,"nm":"s","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[1072.526,541.245,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[75,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[569.914,827.341],[610.524,827.341],[610.564,827.341]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,799.401],[610.244,799.401]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,777.062],[610.444,777.062]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,747.612],[610.244,747.612]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,726.642],[610.364,726.642]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,700.901],[610.244,700.901]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,676.781],[610.244,676.781]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[569.914,650.121],[610.234,650.121],[610.244,650.121]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,626.812],[609.914,626.812]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,599.802],[609.914,599.802]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,577.052],[609.744,577.052]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,548.082],[609.744,548.082]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.27,-162.675],[-0.23,-138.205],[-0.18,-109.235],[-0.14,-86.485],[-0.1,-59.475],[-0.06,-36.165],[-0.02,-9.505],[0.02,14.615],[0.07,40.355],[0.1,61.325],[0.15,90.775],[0.19,113.115],[0.23,141.055],[0.27,162.675]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[610.294,686.286]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[610.564,848.961],[569.914,848.961]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[610.024,523.612],[569.914,523.612]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[569.914,523.612],[569.914,548.082],[569.914,577.052],[569.914,599.802],[569.914,626.812],[569.914,650.122],[569.914,676.781],[569.914,700.901],[569.914,726.641],[569.914,747.612],[569.914,777.062],[569.914,799.401],[569.914,827.342],[569.914,848.962],[569.914,849.002]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.035,-12.235],[20.075,12.235],[19.755,12.235],[-20.075,12.235],[-20.075,-12.235]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[589.989,535.847]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.05,-14.485],[20.1,14.485],[19.73,14.485],[-20.1,14.485],[-20.1,-14.485],[19.73,-14.485]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.014,562.567]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.08,-11.375],[20.12,11.375],[19.88,11.375],[-20.12,11.375],[-20.12,-11.375],[19.71,-11.375]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.034,588.427]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.1,-13.505],[20.14,13.505],[19.86,13.505],[-20.14,13.505],[-20.14,-13.505],[19.86,-13.505]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.054,613.307]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.12,-11.655],[20.16,11.655],[-20.16,11.655],[-20.16,-11.655],[19.84,-11.655]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.074,638.467]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.14,-13.33],[20.18,13.33],[20.15,13.33],[-20.18,13.33],[-20.18,-13.33]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.094,663.451]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.16,-12.06],[20.2,12.06],[20.13,12.06],[-20.2,12.06],[-20.2,-12.06],[20.13,-12.06]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.114,688.841]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.175,-12.87],[20.225,12.87],[-20.225,12.87],[-20.225,-12.87],[20.105,-12.87]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.139,713.771]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.21,-10.485],[20.24,10.485],[20.09,10.485],[-20.24,10.485],[-20.24,-10.485]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.154,737.127]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.215,-14.725],[20.265,14.725],[-20.265,14.725],[-20.265,-14.725],[20.065,-14.725]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.179,762.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.245,-11.17],[20.285,11.17],[20.045,11.17],[-20.285,11.17],[-20.285,-11.17]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.199,788.232]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.265,-13.97],[20.305,13.97],[-20.305,13.97],[-20.305,-13.97],[20.025,-13.97]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.219,813.371]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[20.285,-10.81],[20.325,10.81],[-20.325,10.81],[-20.325,-10.81]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.239,838.151]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":31,"op":32,"st":0},{"ind":4,"ty":0,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[962.5,541.5,0]},"a":{"a":0,"k":[962.5,541.5,0]},"s":{"a":0,"k":[100,100,100]}},"ip":-4,"op":1,"st":-4,"refId":"comp_3","h":1083,"w":1925},{"ind":5,"ty":0,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[962.5,541.5,0]},"a":{"a":0,"k":[962.5,541.5,0]},"s":{"a":0,"k":[100,100,100]}},"ip":94,"op":99,"st":94,"refId":"comp_3","h":1083,"w":1925},{"ind":6,"ty":0,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[962.5,541.5,0]},"a":{"a":0,"k":[962.5,541.5,0]},"s":{"a":0,"k":[100,100,100]}},"ip":62,"op":67,"st":62,"refId":"comp_3","h":1083,"w":1925},{"ind":7,"ty":0,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[962.5,541.5,0]},"a":{"a":0,"k":[962.5,541.5,0]},"s":{"a":0,"k":[100,100,100]}},"ip":29,"op":34,"st":29,"refId":"comp_3","h":1083,"w":1925},{"ind":8,"ty":0,"nm":"c","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[962.5,541.5,0]},"a":{"a":0,"k":[962.5,541.5,0]},"s":{"a":0,"k":[100,100,100]}},"ip":0,"op":31,"st":0,"refId":"comp_4","h":1083,"w":1925},{"ind":9,"ty":0,"nm":"c","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[962.5,541.5,0]},"a":{"a":0,"k":[962.5,541.5,0]},"s":{"a":0,"k":[100,100,100]}},"ip":32,"op":64,"st":0,"refId":"comp_4","h":1083,"w":1925},{"ind":10,"ty":0,"nm":"c","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[962.5,541.5,0]},"a":{"a":0,"k":[962.5,541.5,0]},"s":{"a":0,"k":[100,100,100]}},"ip":65,"op":96,"st":0,"refId":"comp_4","h":1083,"w":1925},{"ind":11,"ty":0,"nm":"c","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[962.5,541.5,0]},"a":{"a":0,"k":[962.5,541.5,0]},"s":{"a":0,"k":[100,100,100]}},"ip":97,"op":98,"st":0,"refId":"comp_4","h":1083,"w":1925}]},{"id":"comp_3","layers":[{"ind":1,"ty":3,"nm":"o","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[802,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":1,"s":[802,684,0],"ti":[3,0,0],"to":[-3,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[784,684,0],"ti":[0,0,0],"to":[0,0,0]},{"t":4,"s":[784,684,0]}],"a":1},"a":{"a":0,"k":[50,49,0]},"s":{"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":1,"s":[7,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":3,"s":[7,100,100]},{"t":4,"s":[22,100,100]}],"a":1}},"ip":0,"op":5,"st":-29},{"ind":2,"ty":3,"nm":"s","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[794.261,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[794.261,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[809,684,0],"ti":[0,0,0],"to":[0,0,0]},{"t":4,"s":[809,684,0]}],"a":1},"a":{"a":0,"k":[50,49,0]},"s":{"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":0,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":1,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":3,"s":[7,100,100]},{"t":4,"s":[23,100,100]}],"a":1}},"ip":0,"op":5,"st":-29},{"ind":3,"ty":3,"nm":"s","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[774,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[774,684,0],"ti":[-3.833,0,0],"to":[3.833,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[797,684,0],"ti":[0,0,0],"to":[0,0,0]},{"t":4,"s":[797,684,0]}],"a":1},"a":{"a":0,"k":[50,49,0]},"s":{"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[23,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":1,"s":[7,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":3,"s":[1,1,100]},{"t":4,"s":[1,1,100]}],"a":1}},"ip":0,"op":5,"st":-29},{"ind":4,"ty":3,"nm":"s","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.908},"o":{"x":0.167,"y":0.092},"t":0,"s":[786,684,0],"ti":[1.25,0,0],"to":[-2,0,0]},{"i":{"x":0.833,"y":0.853},"o":{"x":0.167,"y":0.147},"t":1,"s":[788,684,0],"ti":[2,0,0],"to":[-2,0,0]},{"i":{"x":0.833,"y":0.887},"o":{"x":0.167,"y":0.113},"t":3,"s":[797,684,0],"ti":[2,0,0],"to":[-1.25,0,0]},{"t":4,"s":[800,684,0]}],"a":1},"a":{"a":0,"k":[50,49,0]},"s":{"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[66,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":1,"s":[75,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":3,"s":[70,100,100]},{"t":4,"s":[60,100,100]}],"a":1}},"ip":0,"op":5,"st":-29},{"ind":5,"ty":4,"nm":"S","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[221,-94,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"E","bm":0,"it":[{"ty":"el","nm":"E","d":1,"p":{"a":0,"k":[0,0]},"s":{"a":0,"k":[297,297]}},{"ty":"st","nm":"S","bm":0,"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":0},"c":{"a":0,"k":[1,1,1,1]}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.607843160629,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-170,145]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":0,"op":2,"st":-29,"parent":1},{"ind":6,"ty":4,"nm":"o","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,-71.88],[71.88,0],[0,71.88],[-71.88,0]],"o":[[0,71.88],[-71.88,0],[0,-71.88],[71.88,0]],"v":[[130.15,0],[0,130.15],[-130.15,0],[0,-130.15]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,-89.87],[89.86,0],[0,89.86],[-89.87,0]],"o":[[0,89.86],[-89.87,0],[0,-89.87],[89.86,0]],"v":[[162.715,0.005],[0.005,162.715],[-162.715,0.005],[0.005,-162.715]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.199,686.286]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,71.88],[71.88,0],[0,-71.88],[-71.88,0]],"o":[[0,-71.88],[-71.88,0],[0,71.88],[71.88,0]],"v":[[130.395,-1.245],[0.245,-131.395],[-129.905,-1.245],[0.245,128.905]],"c":true},"a":0}},{"ty":"sh","nm":"P","ind":1,"ks":{"k":{"i":[[-89.87,0],[0,-89.87],[89.86,0],[0,89.86]],"o":[[89.86,0],[0,89.86],[-89.87,0],[0,-89.87]],"v":[[0.005,-162.715],[162.715,0.005],[0.005,162.715],[-162.715,0.005]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.607843160629,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.199,686.286]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":0,"op":2,"st":-29,"parent":1},{"ind":7,"ty":4,"nm":"s","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-339.29,-94.255,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[-100,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[491.024,827.341],[491.034,827.341],[572.824,827.341]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[455.244,799.401],[572.824,799.401]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[437.134,777.062],[437.144,777.062],[572.824,777.062]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[421.444,747.612],[572.824,747.612]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[414.524,726.642],[572.824,726.642]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[486.814,548.082],[572.824,548.082]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[452.634,577.052],[572.824,577.052]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[434.964,599.802],[572.824,599.802]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[421.444,626.812],[572.824,626.812]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[414.524,650.121],[572.824,650.121]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[410.144,676.802],[572.824,676.802]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[410.144,700.901],[572.824,700.901]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[23.89,13.78]],"o":[[0,0],[-29.56,0],[0,0]],"v":[[40.895,10.83],[40.275,10.83],[-40.895,-10.83]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[531.929,838.172]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[10.53,10.89],[5.37,7.98]],"o":[[-13.21,-7.62],[-6.67,-6.89],[0,0]],"v":[[26.94,25.14],[-8.84,-2.8],[-26.94,-25.14]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[464.084,802.202]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[4.23,10.4],[1.84,7.2],[0.79,8.8],[0,4.92],[-0.19,3.14],[-2,8.71],[-2.98,7.52],[-5.38,8.51],[-6.5,7.11],[-12.82,7.94],[-31.38,0],[0,0]],"o":[[-6.19,-9.19],[-2.77,-6.77],[-2.13,-8.34],[-0.42,-4.81],[0,-3.19],[0.52,-9.19],[1.83,-8.03],[3.74,-9.48],[5.17,-8.19],[10.13,-11.08],[24.85,-15.39],[0,0],[0,0]],"v":[[-54.02,126.745],[-69.71,97.295],[-76.63,76.325],[-81.03,50.585],[-81.67,35.975],[-81.39,26.465],[-77.58,-0.415],[-70.35,-23.765],[-56.63,-50.795],[-39.08,-73.785],[-4.49,-102.475],[81.05,-126.745],[81.67,-126.745]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[491.154,650.317]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-31.38,0]],"o":[[0,0],[0,0],[0,0],[24.85,-15.39],[0,0]],"v":[[43.08,-12.255],[43.08,12.255],[-42.93,12.255],[-43.08,12.015],[42.46,-12.255]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[529.744,535.826]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-12.82,7.94],[0,0]],"o":[[0,0],[0,0],[0,0],[10.13,-11.08],[0,0],[0,0]],"v":[[60.375,-14.365],[60.375,14.605],[-59.815,14.605],[-60.375,14.085],[-25.785,-14.605],[-25.635,-14.365]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[512.449,562.447]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-6.5,7.11],[0,0]],"o":[[0,0],[0,0],[0,0],[5.17,-8.19],[0,0],[0,0]],"v":[[69.15,-11.115],[69.15,11.635],[-68.71,11.635],[-69.15,11.355],[-51.6,-11.635],[-51.04,-11.115]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[503.674,588.167]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-5.38,8.51],[0,0]],"o":[[0,0],[0,0],[0,0],[3.74,-9.48],[0,0],[0,0]],"v":[[76.01,-13.365],[76.01,13.645],[-75.37,13.645],[-76.01,13.385],[-62.29,-13.645],[-61.85,-13.365]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[496.814,613.167]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2.98,7.52],[0,0]],"o":[[0,0],[0,0],[0,0],[1.83,-8.03],[0,0],[0,0]],"v":[[79.625,-11.525],[79.625,11.785],[-78.675,11.785],[-79.625,11.565],[-72.395,-11.785],[-71.755,-11.525]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[493.199,638.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2,8.71],[0,0]],"o":[[0,0],[0,0],[0,0],[0.52,-9.19],[0,0],[0,0]],"v":[[81.53,-13.23],[81.53,13.45],[-81.15,13.45],[-81.53,13.43],[-77.72,-13.45],[-76.77,-13.23]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[491.294,663.352]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,4.92],[-0.19,3.14],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.42,-4.81],[0,-3.19],[0,0],[0,0]],"v":[[81.67,-12.04],[81.67,12.06],[-81.01,12.06],[-81.03,12.06],[-81.67,-2.55],[-81.39,-12.06],[-81.01,-12.04]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[491.154,688.842]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0.79,8.8],[0,0]],"o":[[0,0],[0,0],[-2.13,-8.34],[0,0],[0,0]],"v":[[81.35,-12.87],[81.35,12.87],[-76.95,12.87],[-81.35,-12.87],[-81.33,-12.87]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[491.474,713.771]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[1.84,7.2]],"o":[[0,0],[0,0],[-2.77,-6.77],[0,0]],"v":[[79.15,-10.485],[79.15,10.485],[-72.23,10.485],[-79.15,-10.485]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[493.674,737.127]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[4.23,10.4]],"o":[[0,0],[0,0],[0,0],[-6.19,-9.19],[0,0]],"v":[[75.69,-14.725],[75.69,14.725],[-59.99,14.725],[-60,14.725],[-75.69,-14.725]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[497.134,762.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[5.37,7.98]],"o":[[0,0],[0,0],[-6.67,-6.89],[0,0]],"v":[[67.84,-11.17],[67.84,11.17],[-49.74,11.17],[-67.84,-11.17]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[504.984,788.232]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[10.53,10.89]],"o":[[0,0],[0,0],[0,0],[-13.21,-7.62],[0,0]],"v":[[58.79,-13.97],[58.79,13.97],[-23,13.97],[-23.01,13.97],[-58.79,-13.97]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[514.034,813.371]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[23.89,13.78]],"o":[[0,0],[0,0],[-29.56,0],[0,0]],"v":[[40.895,-10.83],[40.895,10.83],[40.275,10.83],[-40.895,-10.83]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[531.929,838.172]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":0,"op":2,"st":-29,"parent":2},{"ind":8,"ty":4,"nm":"s","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[440.71,-94.255,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[491.024,827.341],[491.034,827.341],[572.824,827.341]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[455.244,799.401],[572.824,799.401]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[437.134,777.062],[437.144,777.062],[572.824,777.062]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[421.444,747.612],[572.824,747.612]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[414.524,726.642],[572.824,726.642]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[486.814,548.082],[572.824,548.082]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[452.634,577.052],[572.824,577.052]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[434.964,599.802],[572.824,599.802]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[421.444,626.812],[572.824,626.812]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[414.524,650.121],[572.824,650.121]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[410.144,676.802],[572.824,676.802]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[410.144,700.901],[572.824,700.901]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[23.89,13.78]],"o":[[0,0],[-29.56,0],[0,0]],"v":[[40.895,10.83],[40.275,10.83],[-40.895,-10.83]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[531.929,838.172]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[10.53,10.89],[5.37,7.98]],"o":[[-13.21,-7.62],[-6.67,-6.89],[0,0]],"v":[[26.94,25.14],[-8.84,-2.8],[-26.94,-25.14]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[464.084,802.202]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[4.23,10.4],[1.84,7.2],[0.79,8.8],[0,4.92],[-0.19,3.14],[-2,8.71],[-2.98,7.52],[-5.38,8.51],[-6.5,7.11],[-12.82,7.94],[-31.38,0],[0,0]],"o":[[-6.19,-9.19],[-2.77,-6.77],[-2.13,-8.34],[-0.42,-4.81],[0,-3.19],[0.52,-9.19],[1.83,-8.03],[3.74,-9.48],[5.17,-8.19],[10.13,-11.08],[24.85,-15.39],[0,0],[0,0]],"v":[[-54.02,126.745],[-69.71,97.295],[-76.63,76.325],[-81.03,50.585],[-81.67,35.975],[-81.39,26.465],[-77.58,-0.415],[-70.35,-23.765],[-56.63,-50.795],[-39.08,-73.785],[-4.49,-102.475],[81.05,-126.745],[81.67,-126.745]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[491.154,650.317]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-31.38,0]],"o":[[0,0],[0,0],[0,0],[24.85,-15.39],[0,0]],"v":[[43.08,-12.255],[43.08,12.255],[-42.93,12.255],[-43.08,12.015],[42.46,-12.255]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[529.744,535.826]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-12.82,7.94],[0,0]],"o":[[0,0],[0,0],[0,0],[10.13,-11.08],[0,0],[0,0]],"v":[[60.375,-14.365],[60.375,14.605],[-59.815,14.605],[-60.375,14.085],[-25.785,-14.605],[-25.635,-14.365]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[512.449,562.447]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-6.5,7.11],[0,0]],"o":[[0,0],[0,0],[0,0],[5.17,-8.19],[0,0],[0,0]],"v":[[69.15,-11.115],[69.15,11.635],[-68.71,11.635],[-69.15,11.355],[-51.6,-11.635],[-51.04,-11.115]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[503.674,588.167]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-5.38,8.51],[0,0]],"o":[[0,0],[0,0],[0,0],[3.74,-9.48],[0,0],[0,0]],"v":[[76.01,-13.365],[76.01,13.645],[-75.37,13.645],[-76.01,13.385],[-62.29,-13.645],[-61.85,-13.365]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[496.814,613.167]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2.98,7.52],[0,0]],"o":[[0,0],[0,0],[0,0],[1.83,-8.03],[0,0],[0,0]],"v":[[79.625,-11.525],[79.625,11.785],[-78.675,11.785],[-79.625,11.565],[-72.395,-11.785],[-71.755,-11.525]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[493.199,638.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2,8.71],[0,0]],"o":[[0,0],[0,0],[0,0],[0.52,-9.19],[0,0],[0,0]],"v":[[81.53,-13.23],[81.53,13.45],[-81.15,13.45],[-81.53,13.43],[-77.72,-13.45],[-76.77,-13.23]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[491.294,663.352]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,4.92],[-0.19,3.14],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.42,-4.81],[0,-3.19],[0,0],[0,0]],"v":[[81.67,-12.04],[81.67,12.06],[-81.01,12.06],[-81.03,12.06],[-81.67,-2.55],[-81.39,-12.06],[-81.01,-12.04]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[491.154,688.842]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0.79,8.8],[0,0]],"o":[[0,0],[0,0],[-2.13,-8.34],[0,0],[0,0]],"v":[[81.35,-12.87],[81.35,12.87],[-76.95,12.87],[-81.35,-12.87],[-81.33,-12.87]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[491.474,713.771]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[1.84,7.2]],"o":[[0,0],[0,0],[-2.77,-6.77],[0,0]],"v":[[79.15,-10.485],[79.15,10.485],[-72.23,10.485],[-79.15,-10.485]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[493.674,737.127]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[4.23,10.4]],"o":[[0,0],[0,0],[0,0],[-6.19,-9.19],[0,0]],"v":[[75.69,-14.725],[75.69,14.725],[-59.99,14.725],[-60,14.725],[-75.69,-14.725]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[497.134,762.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[5.37,7.98]],"o":[[0,0],[0,0],[-6.67,-6.89],[0,0]],"v":[[67.84,-11.17],[67.84,11.17],[-49.74,11.17],[-67.84,-11.17]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[504.984,788.232]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[10.53,10.89]],"o":[[0,0],[0,0],[0,0],[-13.21,-7.62],[0,0]],"v":[[58.79,-13.97],[58.79,13.97],[-23,13.97],[-23.01,13.97],[-58.79,-13.97]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[514.034,813.371]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[23.89,13.78]],"o":[[0,0],[0,0],[-29.56,0],[0,0]],"v":[[40.895,-10.83],[40.895,10.83],[40.275,10.83],[-40.895,-10.83]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[531.929,838.172]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":0,"op":2,"st":-29,"parent":3},{"ind":9,"ty":4,"nm":"S","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[221,-94,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"E","bm":0,"it":[{"ty":"el","nm":"E","d":1,"p":{"a":0,"k":[0,0]},"s":{"a":0,"k":[297,297]}},{"ty":"st","nm":"S","bm":0,"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":0},"c":{"a":0,"k":[1,1,1,1]}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.607843160629,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-170,145]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":3,"op":5,"st":-29,"parent":1},{"ind":10,"ty":4,"nm":"o","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,-71.88],[71.88,0],[0,71.88],[-71.88,0]],"o":[[0,71.88],[-71.88,0],[0,-71.88],[71.88,0]],"v":[[130.15,0],[0,130.15],[-130.15,0],[0,-130.15]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,-89.87],[89.86,0],[0,89.86],[-89.87,0]],"o":[[0,89.86],[-89.87,0],[0,-89.87],[89.86,0]],"v":[[162.715,0.005],[0.005,162.715],[-162.715,0.005],[0.005,-162.715]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.199,686.286]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,71.88],[71.88,0],[0,-71.88],[-71.88,0]],"o":[[0,-71.88],[-71.88,0],[0,71.88],[71.88,0]],"v":[[130.395,-1.245],[0.245,-131.395],[-129.905,-1.245],[0.245,128.905]],"c":true},"a":0}},{"ty":"sh","nm":"P","ind":1,"ks":{"k":{"i":[[-89.87,0],[0,-89.87],[89.86,0],[0,89.86]],"o":[[89.86,0],[0,89.86],[-89.87,0],[0,-89.87]],"v":[[0.005,-162.715],[162.715,0.005],[0.005,162.715],[-162.715,0.005]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.607843160629,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.199,686.286]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":3,"op":5,"st":-29,"parent":1},{"ind":11,"ty":4,"nm":"s","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-339.29,-94.255,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[-100,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[491.024,827.341],[491.034,827.341],[572.824,827.341]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[455.244,799.401],[572.824,799.401]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[437.134,777.062],[437.144,777.062],[572.824,777.062]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[421.444,747.612],[572.824,747.612]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[414.524,726.642],[572.824,726.642]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[486.814,548.082],[572.824,548.082]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[452.634,577.052],[572.824,577.052]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[434.964,599.802],[572.824,599.802]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[421.444,626.812],[572.824,626.812]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[414.524,650.121],[572.824,650.121]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[410.144,676.802],[572.824,676.802]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[410.144,700.901],[572.824,700.901]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[23.89,13.78]],"o":[[0,0],[-29.56,0],[0,0]],"v":[[40.895,10.83],[40.275,10.83],[-40.895,-10.83]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[531.929,838.172]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[10.53,10.89],[5.37,7.98]],"o":[[-13.21,-7.62],[-6.67,-6.89],[0,0]],"v":[[26.94,25.14],[-8.84,-2.8],[-26.94,-25.14]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[464.084,802.202]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[4.23,10.4],[1.84,7.2],[0.79,8.8],[0,4.92],[-0.19,3.14],[-2,8.71],[-2.98,7.52],[-5.38,8.51],[-6.5,7.11],[-12.82,7.94],[-31.38,0],[0,0]],"o":[[-6.19,-9.19],[-2.77,-6.77],[-2.13,-8.34],[-0.42,-4.81],[0,-3.19],[0.52,-9.19],[1.83,-8.03],[3.74,-9.48],[5.17,-8.19],[10.13,-11.08],[24.85,-15.39],[0,0],[0,0]],"v":[[-54.02,126.745],[-69.71,97.295],[-76.63,76.325],[-81.03,50.585],[-81.67,35.975],[-81.39,26.465],[-77.58,-0.415],[-70.35,-23.765],[-56.63,-50.795],[-39.08,-73.785],[-4.49,-102.475],[81.05,-126.745],[81.67,-126.745]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[491.154,650.317]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-31.38,0]],"o":[[0,0],[0,0],[0,0],[24.85,-15.39],[0,0]],"v":[[43.08,-12.255],[43.08,12.255],[-42.93,12.255],[-43.08,12.015],[42.46,-12.255]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[529.744,535.826]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-12.82,7.94],[0,0]],"o":[[0,0],[0,0],[0,0],[10.13,-11.08],[0,0],[0,0]],"v":[[60.375,-14.365],[60.375,14.605],[-59.815,14.605],[-60.375,14.085],[-25.785,-14.605],[-25.635,-14.365]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[512.449,562.447]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-6.5,7.11],[0,0]],"o":[[0,0],[0,0],[0,0],[5.17,-8.19],[0,0],[0,0]],"v":[[69.15,-11.115],[69.15,11.635],[-68.71,11.635],[-69.15,11.355],[-51.6,-11.635],[-51.04,-11.115]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[503.674,588.167]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-5.38,8.51],[0,0]],"o":[[0,0],[0,0],[0,0],[3.74,-9.48],[0,0],[0,0]],"v":[[76.01,-13.365],[76.01,13.645],[-75.37,13.645],[-76.01,13.385],[-62.29,-13.645],[-61.85,-13.365]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[496.814,613.167]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2.98,7.52],[0,0]],"o":[[0,0],[0,0],[0,0],[1.83,-8.03],[0,0],[0,0]],"v":[[79.625,-11.525],[79.625,11.785],[-78.675,11.785],[-79.625,11.565],[-72.395,-11.785],[-71.755,-11.525]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[493.199,638.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2,8.71],[0,0]],"o":[[0,0],[0,0],[0,0],[0.52,-9.19],[0,0],[0,0]],"v":[[81.53,-13.23],[81.53,13.45],[-81.15,13.45],[-81.53,13.43],[-77.72,-13.45],[-76.77,-13.23]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[491.294,663.352]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,4.92],[-0.19,3.14],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.42,-4.81],[0,-3.19],[0,0],[0,0]],"v":[[81.67,-12.04],[81.67,12.06],[-81.01,12.06],[-81.03,12.06],[-81.67,-2.55],[-81.39,-12.06],[-81.01,-12.04]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[491.154,688.842]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0.79,8.8],[0,0]],"o":[[0,0],[0,0],[-2.13,-8.34],[0,0],[0,0]],"v":[[81.35,-12.87],[81.35,12.87],[-76.95,12.87],[-81.35,-12.87],[-81.33,-12.87]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[491.474,713.771]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[1.84,7.2]],"o":[[0,0],[0,0],[-2.77,-6.77],[0,0]],"v":[[79.15,-10.485],[79.15,10.485],[-72.23,10.485],[-79.15,-10.485]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[493.674,737.127]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[4.23,10.4]],"o":[[0,0],[0,0],[0,0],[-6.19,-9.19],[0,0]],"v":[[75.69,-14.725],[75.69,14.725],[-59.99,14.725],[-60,14.725],[-75.69,-14.725]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[497.134,762.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[5.37,7.98]],"o":[[0,0],[0,0],[-6.67,-6.89],[0,0]],"v":[[67.84,-11.17],[67.84,11.17],[-49.74,11.17],[-67.84,-11.17]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[504.984,788.232]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[10.53,10.89]],"o":[[0,0],[0,0],[0,0],[-13.21,-7.62],[0,0]],"v":[[58.79,-13.97],[58.79,13.97],[-23,13.97],[-23.01,13.97],[-58.79,-13.97]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[514.034,813.371]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[23.89,13.78]],"o":[[0,0],[0,0],[-29.56,0],[0,0]],"v":[[40.895,-10.83],[40.895,10.83],[40.275,10.83],[-40.895,-10.83]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[531.929,838.172]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":3,"op":5,"st":-29,"parent":2},{"ind":12,"ty":4,"nm":"s","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[440.71,-94.255,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[491.024,827.341],[491.034,827.341],[572.824,827.341]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[455.244,799.401],[572.824,799.401]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[437.134,777.062],[437.144,777.062],[572.824,777.062]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[421.444,747.612],[572.824,747.612]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[414.524,726.642],[572.824,726.642]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[486.814,548.082],[572.824,548.082]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[452.634,577.052],[572.824,577.052]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[434.964,599.802],[572.824,599.802]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[421.444,626.812],[572.824,626.812]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[414.524,650.121],[572.824,650.121]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[410.144,676.802],[572.824,676.802]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[410.144,700.901],[572.824,700.901]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[23.89,13.78]],"o":[[0,0],[-29.56,0],[0,0]],"v":[[40.895,10.83],[40.275,10.83],[-40.895,-10.83]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[531.929,838.172]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[10.53,10.89],[5.37,7.98]],"o":[[-13.21,-7.62],[-6.67,-6.89],[0,0]],"v":[[26.94,25.14],[-8.84,-2.8],[-26.94,-25.14]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[464.084,802.202]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[4.23,10.4],[1.84,7.2],[0.79,8.8],[0,4.92],[-0.19,3.14],[-2,8.71],[-2.98,7.52],[-5.38,8.51],[-6.5,7.11],[-12.82,7.94],[-31.38,0],[0,0]],"o":[[-6.19,-9.19],[-2.77,-6.77],[-2.13,-8.34],[-0.42,-4.81],[0,-3.19],[0.52,-9.19],[1.83,-8.03],[3.74,-9.48],[5.17,-8.19],[10.13,-11.08],[24.85,-15.39],[0,0],[0,0]],"v":[[-54.02,126.745],[-69.71,97.295],[-76.63,76.325],[-81.03,50.585],[-81.67,35.975],[-81.39,26.465],[-77.58,-0.415],[-70.35,-23.765],[-56.63,-50.795],[-39.08,-73.785],[-4.49,-102.475],[81.05,-126.745],[81.67,-126.745]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[491.154,650.317]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-31.38,0]],"o":[[0,0],[0,0],[0,0],[24.85,-15.39],[0,0]],"v":[[43.08,-12.255],[43.08,12.255],[-42.93,12.255],[-43.08,12.015],[42.46,-12.255]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[529.744,535.826]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-12.82,7.94],[0,0]],"o":[[0,0],[0,0],[0,0],[10.13,-11.08],[0,0],[0,0]],"v":[[60.375,-14.365],[60.375,14.605],[-59.815,14.605],[-60.375,14.085],[-25.785,-14.605],[-25.635,-14.365]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[512.449,562.447]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-6.5,7.11],[0,0]],"o":[[0,0],[0,0],[0,0],[5.17,-8.19],[0,0],[0,0]],"v":[[69.15,-11.115],[69.15,11.635],[-68.71,11.635],[-69.15,11.355],[-51.6,-11.635],[-51.04,-11.115]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[503.674,588.167]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-5.38,8.51],[0,0]],"o":[[0,0],[0,0],[0,0],[3.74,-9.48],[0,0],[0,0]],"v":[[76.01,-13.365],[76.01,13.645],[-75.37,13.645],[-76.01,13.385],[-62.29,-13.645],[-61.85,-13.365]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[496.814,613.167]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2.98,7.52],[0,0]],"o":[[0,0],[0,0],[0,0],[1.83,-8.03],[0,0],[0,0]],"v":[[79.625,-11.525],[79.625,11.785],[-78.675,11.785],[-79.625,11.565],[-72.395,-11.785],[-71.755,-11.525]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[493.199,638.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2,8.71],[0,0]],"o":[[0,0],[0,0],[0,0],[0.52,-9.19],[0,0],[0,0]],"v":[[81.53,-13.23],[81.53,13.45],[-81.15,13.45],[-81.53,13.43],[-77.72,-13.45],[-76.77,-13.23]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[491.294,663.352]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,4.92],[-0.19,3.14],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.42,-4.81],[0,-3.19],[0,0],[0,0]],"v":[[81.67,-12.04],[81.67,12.06],[-81.01,12.06],[-81.03,12.06],[-81.67,-2.55],[-81.39,-12.06],[-81.01,-12.04]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[491.154,688.842]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0.79,8.8],[0,0]],"o":[[0,0],[0,0],[-2.13,-8.34],[0,0],[0,0]],"v":[[81.35,-12.87],[81.35,12.87],[-76.95,12.87],[-81.35,-12.87],[-81.33,-12.87]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[491.474,713.771]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[1.84,7.2]],"o":[[0,0],[0,0],[-2.77,-6.77],[0,0]],"v":[[79.15,-10.485],[79.15,10.485],[-72.23,10.485],[-79.15,-10.485]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[493.674,737.127]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[4.23,10.4]],"o":[[0,0],[0,0],[0,0],[-6.19,-9.19],[0,0]],"v":[[75.69,-14.725],[75.69,14.725],[-59.99,14.725],[-60,14.725],[-75.69,-14.725]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[497.134,762.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[5.37,7.98]],"o":[[0,0],[0,0],[-6.67,-6.89],[0,0]],"v":[[67.84,-11.17],[67.84,11.17],[-49.74,11.17],[-67.84,-11.17]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[504.984,788.232]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[10.53,10.89]],"o":[[0,0],[0,0],[0,0],[-13.21,-7.62],[0,0]],"v":[[58.79,-13.97],[58.79,13.97],[-23,13.97],[-23.01,13.97],[-58.79,-13.97]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[514.034,813.371]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[23.89,13.78]],"o":[[0,0],[0,0],[-29.56,0],[0,0]],"v":[[40.895,-10.83],[40.895,10.83],[40.275,10.83],[-40.895,-10.83]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[531.929,838.172]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":3,"op":5,"st":-29,"parent":3},{"ind":13,"ty":4,"nm":"s","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[421.71,-94.255,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[569.914,827.341],[610.524,827.341],[610.564,827.341]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,799.401],[610.244,799.401]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,777.062],[610.444,777.062]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,747.612],[610.244,747.612]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,726.642],[610.364,726.642]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,700.901],[610.244,700.901]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,676.781],[610.244,676.781]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[569.914,650.121],[610.234,650.121],[610.244,650.121]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,626.812],[609.914,626.812]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,599.802],[609.914,599.802]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,577.052],[609.744,577.052]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,548.082],[609.744,548.082]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.27,-162.675],[-0.23,-138.205],[-0.18,-109.235],[-0.14,-86.485],[-0.1,-59.475],[-0.06,-36.165],[-0.02,-9.505],[0.02,14.615],[0.07,40.355],[0.1,61.325],[0.15,90.775],[0.19,113.115],[0.23,141.055],[0.27,162.675]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[610.294,686.286]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[610.564,848.961],[569.914,848.961]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[610.024,523.612],[569.914,523.612]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[569.914,523.612],[569.914,548.082],[569.914,577.052],[569.914,599.802],[569.914,626.812],[569.914,650.122],[569.914,676.781],[569.914,700.901],[569.914,726.641],[569.914,747.612],[569.914,777.062],[569.914,799.401],[569.914,827.342],[569.914,848.962],[569.914,849.002]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.035,-12.235],[20.075,12.235],[19.755,12.235],[-20.075,12.235],[-20.075,-12.235]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[589.989,535.847]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.05,-14.485],[20.1,14.485],[19.73,14.485],[-20.1,14.485],[-20.1,-14.485],[19.73,-14.485]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.014,562.567]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.08,-11.375],[20.12,11.375],[19.88,11.375],[-20.12,11.375],[-20.12,-11.375],[19.71,-11.375]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.034,588.427]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.1,-13.505],[20.14,13.505],[19.86,13.505],[-20.14,13.505],[-20.14,-13.505],[19.86,-13.505]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.054,613.307]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.12,-11.655],[20.16,11.655],[-20.16,11.655],[-20.16,-11.655],[19.84,-11.655]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.074,638.467]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.14,-13.33],[20.18,13.33],[20.15,13.33],[-20.18,13.33],[-20.18,-13.33]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.094,663.451]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.16,-12.06],[20.2,12.06],[20.13,12.06],[-20.2,12.06],[-20.2,-12.06],[20.13,-12.06]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.114,688.841]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.175,-12.87],[20.225,12.87],[-20.225,12.87],[-20.225,-12.87],[20.105,-12.87]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.139,713.771]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.21,-10.485],[20.24,10.485],[20.09,10.485],[-20.24,10.485],[-20.24,-10.485]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.154,737.127]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.215,-14.725],[20.265,14.725],[-20.265,14.725],[-20.265,-14.725],[20.065,-14.725]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.179,762.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.245,-11.17],[20.285,11.17],[20.045,11.17],[-20.285,11.17],[-20.285,-11.17]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.199,788.232]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.265,-13.97],[20.305,13.97],[-20.305,13.97],[-20.305,-13.97],[20.025,-13.97]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.219,813.371]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[20.285,-10.81],[20.325,10.81],[-20.325,10.81],[-20.325,-10.81]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.239,838.151]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":0,"op":5,"st":-29,"parent":4}]},{"id":"comp_4","layers":[{"ind":1,"ty":3,"nm":"o","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[784,684,0],"ti":[-3,0,0],"to":[1.167,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":14,"s":[791,684,0],"ti":[-1.833,0,0],"to":[3,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.333},"t":29,"s":[802,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":30,"s":[802,684,0],"ti":[3,0,0],"to":[-3,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":32,"s":[784,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":33,"s":[784,684,0],"ti":[-3,0,0],"to":[1.167,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":47,"s":[791,684,0],"ti":[-1.833,0,0],"to":[3,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.333},"t":62,"s":[802,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":63,"s":[802,684,0],"ti":[3,0,0],"to":[-3,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":65,"s":[784,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":66,"s":[784,684,0],"ti":[-3,0,0],"to":[1.167,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":80,"s":[791,684,0],"ti":[-1.833,0,0],"to":[3,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":94,"s":[802,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":95,"s":[802,684,0],"ti":[3,0,0],"to":[-3,0,0]},{"t":97,"s":[784,684,0]}],"a":1},"a":{"a":0,"k":[50,49,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":30,"s":[7,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":32,"s":[7,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":33,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":47,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":62,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":63,"s":[7,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":65,"s":[7,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":66,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":80,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":94,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":95,"s":[7,100,100]},{"t":97,"s":[7,100,100]}],"a":1}},"ip":0,"op":98,"st":0},{"ind":2,"ty":3,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":0,"s":[801,684,0],"ti":[2.667,0,0],"to":[-1.667,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[791,684,0],"ti":[-1.667,0,0],"to":[-2.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[785,684,0],"ti":[-1,0,0],"to":[1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":33,"s":[801,684,0],"ti":[2.667,0,0],"to":[1,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":47,"s":[791,684,0],"ti":[-1.667,0,0],"to":[-2.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[785,684,0],"ti":[-1,0,0],"to":[1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":66,"s":[801,684,0],"ti":[2.667,0,0],"to":[1,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[791,684,0],"ti":[1,0,0],"to":[-2.667,0,0]},{"t":94,"s":[785,684,0]}],"a":1},"a":{"a":0,"k":[50,49,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":33,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":47,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":62,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":66,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":80,"s":[100,100,100]},{"t":94,"s":[22,100,100]}],"a":1}},"ip":0,"op":98,"st":0},{"ind":3,"ty":3,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":0,"s":[801,684,0],"ti":[2.667,0,0],"to":[-1.667,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[791,684,0],"ti":[-1.667,0,0],"to":[-2.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[785,684,0],"ti":[-1,0,0],"to":[1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":33,"s":[801,684,0],"ti":[2.667,0,0],"to":[1,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":47,"s":[791,684,0],"ti":[-1.667,0,0],"to":[-2.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[785,684,0],"ti":[-1,0,0],"to":[1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":66,"s":[801,684,0],"ti":[2.667,0,0],"to":[1,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[791,684,0],"ti":[1,0,0],"to":[-2.667,0,0]},{"t":94,"s":[785,684,0]}],"a":1},"a":{"a":0,"k":[50,49,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":33,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":47,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":62,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":66,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":80,"s":[100,100,100]},{"t":94,"s":[22,100,100]}],"a":1}},"ip":0,"op":98,"st":0},{"ind":4,"ty":3,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":0,"s":[801,684,0],"ti":[2.667,0,0],"to":[-1.667,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[791,684,0],"ti":[-1.667,0,0],"to":[-2.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[785,684,0],"ti":[-1,0,0],"to":[1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":33,"s":[801,684,0],"ti":[2.667,0,0],"to":[1,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":47,"s":[791,684,0],"ti":[-1.667,0,0],"to":[-2.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[785,684,0],"ti":[-1,0,0],"to":[1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":66,"s":[801,684,0],"ti":[2.667,0,0],"to":[1,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[791,684,0],"ti":[1,0,0],"to":[-2.667,0,0]},{"t":94,"s":[785,684,0]}],"a":1},"a":{"a":0,"k":[50,49,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":33,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":47,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":62,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":66,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":80,"s":[100,100,100]},{"t":94,"s":[22,100,100]}],"a":1}},"ip":0,"op":98,"st":0},{"ind":5,"ty":3,"nm":"s","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":0,"s":[809,684,0],"ti":[0,0,0],"to":[-3,0,0]},{"i":{"x":0.591,"y":0.115},"o":{"x":0.167,"y":0.167},"t":14,"s":[791,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.591,"y":0.591},"o":{"x":0.254,"y":0.254},"t":16,"s":[794.261,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.254,"y":0.254},"t":29,"s":[794.261,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[794.261,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.69,"y":0.69},"o":{"x":0.167,"y":0.167},"t":32,"s":[809,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":33,"s":[809,684,0],"ti":[2.54,0,0],"to":[0,0,0]},{"i":{"x":0.591,"y":0.606},"o":{"x":0.167,"y":0.111},"t":47,"s":[791,684,0],"ti":[0,0,0],"to":[-2.54,0,0]},{"i":{"x":0.591,"y":0.591},"o":{"x":0.254,"y":0.254},"t":49,"s":[794.261,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.254,"y":0.254},"t":62,"s":[794.261,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[794.261,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.69,"y":0.69},"o":{"x":0.167,"y":0.167},"t":65,"s":[809,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":66,"s":[809,684,0],"ti":[2.54,0,0],"to":[0,0,0]},{"i":{"x":0.591,"y":0.606},"o":{"x":0.167,"y":0.111},"t":80,"s":[791,684,0],"ti":[0,0,0],"to":[-2.54,0,0]},{"i":{"x":0.591,"y":0.591},"o":{"x":0.254,"y":0.254},"t":82,"s":[794.261,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":94,"s":[794.261,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":95,"s":[794.261,684,0],"ti":[0,0,0],"to":[0,0,0]},{"t":97,"s":[809,684,0]}],"a":1},"a":{"a":0,"k":[50,49,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[23,100,100]},{"i":{"x":[0.591,0.591,0.591],"y":[0.894,1,1]},"o":{"x":[0.249,0.249,0.249],"y":[0.048,0,0]},"t":14,"s":[100,100,100]},{"i":{"x":[0.591,0.591,0.591],"y":[1,1,1]},"o":{"x":[0.254,0.254,0.254],"y":[0,0,0]},"t":16,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.254,0.254,0.254],"y":[0,0,0]},"t":29,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":30,"s":[1,1,100]},{"i":{"x":[0.69,0.69,0.69],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":32,"s":[7,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":33,"s":[23,100,100]},{"i":{"x":[0.591,0.591,0.591],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":47,"s":[100,100,100]},{"i":{"x":[0.591,0.591,0.591],"y":[1,1,1]},"o":{"x":[0.254,0.254,0.254],"y":[0,0,0]},"t":49,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.254,0.254,0.254],"y":[0,0,0]},"t":62,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":63,"s":[1,1,100]},{"i":{"x":[0.69,0.69,0.69],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":65,"s":[7,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":66,"s":[23,100,100]},{"i":{"x":[0.591,0.591,0.591],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":80,"s":[100,100,100]},{"i":{"x":[0.591,0.591,0.591],"y":[1,1,1]},"o":{"x":[0.254,0.254,0.254],"y":[0,0,0]},"t":82,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":94,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":95,"s":[1,1,100]},{"t":97,"s":[7,100,100]}],"a":1}},"ip":0,"op":98,"st":0},{"ind":6,"ty":3,"nm":"s","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[797,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[797,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":16,"s":[797,684,0],"ti":[3.833,0,0],"to":[-3.833,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.333},"t":29,"s":[774,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[774,684,0],"ti":[-3.833,0,0],"to":[3.833,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[797,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[797,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":47,"s":[797,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":49,"s":[797,684,0],"ti":[3.833,0,0],"to":[-3.833,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.333},"t":62,"s":[774,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[774,684,0],"ti":[-3.833,0,0],"to":[3.833,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":65,"s":[797,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":66,"s":[797,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80,"s":[797,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":82,"s":[797,684,0],"ti":[3.833,0,0],"to":[-3.833,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":94,"s":[774,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":95,"s":[774,684,0],"ti":[-3.833,0,0],"to":[3.833,0,0]},{"t":97,"s":[797,684,0]}],"a":1},"a":{"a":0,"k":[50,49,0]},"s":{"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":0,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":14,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":16,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[23,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":30,"s":[7,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":32,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":33,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":47,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":49,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":62,"s":[23,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":63,"s":[7,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":65,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":66,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":80,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":82,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":94,"s":[23,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":95,"s":[7,100,100]},{"t":97,"s":[1,1,100]}],"a":1}},"ip":0,"op":98,"st":0},{"ind":7,"ty":3,"nm":"s","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":0,"s":[800,684,0],"ti":[3.125,0,0],"to":[-1.25,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":14,"s":[792.999,684,0],"ti":[1.25,0,0],"to":[-3.125,0,0]},{"i":{"x":0.833,"y":0.908},"o":{"x":0.167,"y":0.092},"t":29,"s":[786,684,0],"ti":[1.25,0,0],"to":[-2,0,0]},{"i":{"x":0.833,"y":0.853},"o":{"x":0.167,"y":0.147},"t":30,"s":[788,684,0],"ti":[2,0,0],"to":[-2,0,0]},{"i":{"x":0.833,"y":0.887},"o":{"x":0.167,"y":0.113},"t":32,"s":[797,684,0],"ti":[2,0,0],"to":[-1.25,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":33,"s":[800,684,0],"ti":[3.125,0,0],"to":[-1.25,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":47,"s":[792.999,684,0],"ti":[1.25,0,0],"to":[-3.125,0,0]},{"i":{"x":0.833,"y":0.908},"o":{"x":0.167,"y":0.092},"t":62,"s":[786,684,0],"ti":[1.25,0,0],"to":[-2,0,0]},{"i":{"x":0.833,"y":0.853},"o":{"x":0.167,"y":0.147},"t":63,"s":[788,684,0],"ti":[2,0,0],"to":[-2,0,0]},{"i":{"x":0.833,"y":0.887},"o":{"x":0.167,"y":0.113},"t":65,"s":[797,684,0],"ti":[2,0,0],"to":[-1.25,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":66,"s":[800,684,0],"ti":[3.125,0,0],"to":[-1.25,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":80,"s":[792.999,684,0],"ti":[1.25,0,0],"to":[-3.125,0,0]},{"i":{"x":0.833,"y":0.908},"o":{"x":0.167,"y":0.092},"t":94,"s":[786,684,0],"ti":[1.25,0,0],"to":[-2,0,0]},{"i":{"x":0.833,"y":0.853},"o":{"x":0.167,"y":0.147},"t":95,"s":[788,684,0],"ti":[2,0,0],"to":[-2,0,0]},{"t":97,"s":[797,684,0]}],"a":1},"a":{"a":0,"k":[50,49,0]},"s":{"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[60,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":14,"s":[1,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":29,"s":[66,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":30,"s":[75,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":32,"s":[70,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":33,"s":[60,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":47,"s":[1,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":62,"s":[66,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":63,"s":[75,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":65,"s":[70,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":66,"s":[60,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":80,"s":[1,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":94,"s":[66,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":95,"s":[75,100,100]},{"t":97,"s":[70,100,100]}],"a":1}},"ip":0,"op":98,"st":0},{"ind":8,"ty":0,"nm":"o","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[962.5,541.5,0]},"a":{"a":0,"k":[962.5,541.5,0]},"s":{"a":0,"k":[100,100,100]}},"ip":95,"op":98,"st":0,"refId":"comp_5","h":1083,"w":1925},{"ind":9,"ty":0,"nm":"o","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[962.5,541.5,0]},"a":{"a":0,"k":[962.5,541.5,0]},"s":{"a":0,"k":[100,100,100]}},"ip":63,"op":66,"st":0,"refId":"comp_5","h":1083,"w":1925},{"ind":10,"ty":0,"nm":"o","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[962.5,541.5,0]},"a":{"a":0,"k":[962.5,541.5,0]},"s":{"a":0,"k":[100,100,100]}},"ip":30,"op":33,"st":0,"refId":"comp_5","h":1083,"w":1925},{"ind":11,"ty":4,"nm":"o","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,-71.88],[71.88,0],[0,71.88],[-71.88,0]],"o":[[0,71.88],[-71.88,0],[0,-71.88],[71.88,0]],"v":[[130.15,0],[0,130.15],[-130.15,0],[0,-130.15]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,-89.87],[89.86,0],[0,89.86],[-89.87,0]],"o":[[0,89.86],[-89.87,0],[0,-89.87],[89.86,0]],"v":[[162.715,0.005],[0.005,162.715],[-162.715,0.005],[0.005,-162.715]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.199,686.286]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,71.88],[71.88,0],[0,-71.88],[-71.88,0]],"o":[[0,-71.88],[-71.88,0],[0,71.88],[71.88,0]],"v":[[130.395,-1.245],[0.245,-131.395],[-129.905,-1.245],[0.245,128.905]],"c":true},"a":0}},{"ty":"sh","nm":"P","ind":1,"ks":{"k":{"i":[[-89.87,0],[0,-89.87],[89.86,0],[0,89.86]],"o":[[89.86,0],[0,89.86],[-89.87,0],[0,-89.87]],"v":[[0.005,-162.715],[162.715,0.005],[0.005,162.715],[-162.715,0.005]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.607843160629,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.199,686.286]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":0,"op":98,"st":0,"parent":1},{"ind":12,"ty":4,"nm":"m","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"k":[{"i":{"x":0.56,"y":0.385},"o":{"x":0.167,"y":0.167},"t":0,"s":[962,805,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.659,"y":0.411},"o":{"x":0.321,"y":0.294},"t":2,"s":[1005.921,808.071,0],"ti":[0,0,0],"to":[0,0,0]},{"t":3,"s":[1038,811.378,0]}],"a":1},"a":{"a":0,"k":[-2,266,0]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"S","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-26.336,-59.257],[1,-18],[36,-55],[0,0]],"o":[[0,0],[28,63],[-1,18],[-33.439,51.087],[0,0]],"v":[[-63.5,-32.5],[-171.5,-0.5],[-144.5,137.5],[-177.5,291.5],[-65.5,322.5]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[1,1,1,1]}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":0,"op":8,"st":0,"td":1},{"ind":13,"ty":4,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-6.5,-6.63]],"o":[[-8.92,-7.63],[0,0]],"v":[[9.205,-1.655],[-2.705,9.285]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[737.099,759.977]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[8.35,-6.93]],"o":[[6.57,-7.4],[0,0]],"v":[[2.69,8.77],[-9.26,-1.84]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[852.074,759.612]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-6.38,5.91]],"o":[[-4.21,8.3],[0,0]],"v":[[-3.785,-8.035],[7.995,2.125]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[869.379,743.506]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-5.15,-9.03]],"o":[[-6.76,-6.92],[0,0]],"v":[[8.665,-1.765],[-3.515,8.685]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[870.189,627.466]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[5.02,6.5]],"o":[[7.43,5.19],[0,0]],"v":[[-7.705,3.25],[2.685,-8.44]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[853.379,610.762]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[4.73,8.76]],"o":[[6.59,8.94],[0,0]],"v":[[-9.48,-0.315],[4.75,-8.625]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[718.594,744.096]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-28.63,25.03]],"o":[[35.21,27.46],[0,0]],"v":[[-60.185,-13.29],[60.185,-14.17]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[794.579,782.552]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-33.12,19.71]],"o":[[30,20.35],[0,0]],"v":[[-48.255,-9.895],[48.255,-10.455]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[794.559,768.216]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[18.65,29.56]],"o":[[22.29,-33.18],[0,0]],"v":[[-11.145,49.66],[-10.075,-49.66]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[876.739,685.812]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[21.59,-22.38]],"o":[[30.57,39.25],[0,0]],"v":[[-14.57,-59.94],[-16,59.94]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[893.424,685.641]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[33,-13],[12,-24],[-20.98,-29.69],[-0.02,-0.03]],"o":[[-27.92,-20.15],[-25,10],[-15.98,32.97],[0.02,0.03],[0,0]],"v":[[85.95,-57.2],[-12.97,-71.35],[-69.97,-18.35],[-61,84.26],[-60.94,84.35]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[770.114,659.521]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-80.46,-52.29]],"o":[[-55.97,-86.78],[0,0]],"v":[[-33.18,86.875],[89.15,-34.585]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[756.524,648.596]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[757.404,632.742],[757.404,736.742]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[830.504,736.742],[830.504,715.512]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,715.511],[830.504,715.511]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,673.432],[822.204,673.432]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,695.522],[822.204,695.522]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[822.204,673.432],[822.204,695.521]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[830.504,632.742],[830.504,654.522]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,654.522],[830.504,654.522]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,695.522],[784.524,715.512]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,654.522],[784.524,673.432]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[830.504,736.742],[757.404,736.742]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[830.504,632.742],[757.404,632.742]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[36.55,30.77],[36.55,52],[-36.55,52],[-36.55,-52],[36.55,-52],[36.55,-30.22],[-9.43,-30.22],[-9.43,-11.31],[28.25,-11.31],[28.25,10.78],[-9.43,10.78],[-9.43,30.77]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[793.954,684.742]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[6.57,-7.4],[35.21,27.46],[-8.92,-7.63],[-33.12,19.71]],"o":[[8.35,-6.93],[-28.63,25.03],[-6.5,-6.63],[30,20.35],[0,0]],"v":[[48.2,-15.935],[60.15,-5.325],[-60.22,-4.445],[-48.31,-15.385],[48.2,-15.945]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[794.614,773.707]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-27.92,-20.15],[7.43,5.19],[-55.97,-86.78],[6.59,8.94],[-15.98,32.97],[-25,10]],"o":[[5.02,6.5],[-80.46,-52.29],[4.73,8.76],[-20.98,-29.69],[12,-24],[33,-13]],"v":[[91.835,-54.9],[81.445,-43.21],[-40.885,78.25],[-55.115,86.56],[-64.085,-16.05],[-7.085,-69.05]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[764.229,657.222]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-6.76,-6.92],[21.59,-22.38],[0,0],[-4.21,8.3],[18.65,29.56],[0,0]],"o":[[30.57,39.25],[0,0],[-6.38,5.91],[22.29,-33.18],[0,0],[-5.15,-9.03]],"v":[[-6.55,-59.46],[-7.98,60.42],[-8.03,60.47],[-19.81,50.31],[-18.74,-49.01],[-18.73,-49.01]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[885.404,685.161]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":0,"op":14,"st":7,"parent":2,"tt":2},{"ind":14,"ty":4,"nm":"m","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"k":[{"i":{"x":0.686,"y":0.823},"o":{"x":0.339,"y":0.622},"t":12,"s":[567,804.293,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.436,"y":0.497},"t":13,"s":[606.246,809.717,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.96,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[625,811,0],"ti":[0,0,0],"to":[0,0,0]},{"t":27,"s":[610,811,0]}],"a":1},"a":{"a":0,"k":[-2,266,0]},"s":{"k":[{"i":{"x":[0.797,0.797,0.797],"y":[1,1,1]},"o":{"x":[0.431,0.431,0.431],"y":[0,0,0]},"t":12,"s":[-100,100,100]},{"t":14,"s":[-100,100,100]}],"a":1}},"shapes":[{"ty":"gr","nm":"S","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-26.336,-59.257],[1,-18],[36,-55],[0,0]],"o":[[0,0],[28,63],[-1,18],[-33.439,51.087],[0,0]],"v":[[-63.5,-32.5],[-171.5,-0.5],[-144.5,137.5],[-177.5,291.5],[-65.5,322.5]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[1,1,1,1]}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":27,"op":30,"st":0,"td":1},{"ind":15,"ty":4,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-6.5,-6.63]],"o":[[-8.92,-7.63],[0,0]],"v":[[9.205,-1.655],[-2.705,9.285]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[737.099,759.977]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[8.35,-6.93]],"o":[[6.57,-7.4],[0,0]],"v":[[2.69,8.77],[-9.26,-1.84]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[852.074,759.612]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-6.38,5.91]],"o":[[-4.21,8.3],[0,0]],"v":[[-3.785,-8.035],[7.995,2.125]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[869.379,743.506]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-5.15,-9.03]],"o":[[-6.76,-6.92],[0,0]],"v":[[8.665,-1.765],[-3.515,8.685]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[870.189,627.466]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[5.02,6.5]],"o":[[7.43,5.19],[0,0]],"v":[[-7.705,3.25],[2.685,-8.44]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[853.379,610.762]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[4.73,8.76]],"o":[[6.59,8.94],[0,0]],"v":[[-9.48,-0.315],[4.75,-8.625]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[718.594,744.096]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-28.63,25.03]],"o":[[35.21,27.46],[0,0]],"v":[[-60.185,-13.29],[60.185,-14.17]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[794.579,782.552]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-33.12,19.71]],"o":[[30,20.35],[0,0]],"v":[[-48.255,-9.895],[48.255,-10.455]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[794.559,768.216]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[18.65,29.56]],"o":[[22.29,-33.18],[0,0]],"v":[[-11.145,49.66],[-10.075,-49.66]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[876.739,685.812]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[21.59,-22.38]],"o":[[30.57,39.25],[0,0]],"v":[[-14.57,-59.94],[-16,59.94]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[893.424,685.641]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[33,-13],[12,-24],[-20.98,-29.69],[-0.02,-0.03]],"o":[[-27.92,-20.15],[-25,10],[-15.98,32.97],[0.02,0.03],[0,0]],"v":[[85.95,-57.2],[-12.97,-71.35],[-69.97,-18.35],[-61,84.26],[-60.94,84.35]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[770.114,659.521]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-80.46,-52.29]],"o":[[-55.97,-86.78],[0,0]],"v":[[-33.18,86.875],[89.15,-34.585]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[756.524,648.596]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[757.404,632.742],[757.404,736.742]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[830.504,736.742],[830.504,715.512]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,715.511],[830.504,715.511]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,673.432],[822.204,673.432]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,695.522],[822.204,695.522]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[822.204,673.432],[822.204,695.521]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[830.504,632.742],[830.504,654.522]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,654.522],[830.504,654.522]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,695.522],[784.524,715.512]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[784.524,654.522],[784.524,673.432]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[830.504,736.742],[757.404,736.742]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[830.504,632.742],[757.404,632.742]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[36.55,30.77],[36.55,52],[-36.55,52],[-36.55,-52],[36.55,-52],[36.55,-30.22],[-9.43,-30.22],[-9.43,-11.31],[28.25,-11.31],[28.25,10.78],[-9.43,10.78],[-9.43,30.77]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[793.954,684.742]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[6.57,-7.4],[35.21,27.46],[-8.92,-7.63],[-33.12,19.71]],"o":[[8.35,-6.93],[-28.63,25.03],[-6.5,-6.63],[30,20.35],[0,0]],"v":[[48.2,-15.935],[60.15,-5.325],[-60.22,-4.445],[-48.31,-15.385],[48.2,-15.945]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[794.614,773.707]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-27.92,-20.15],[7.43,5.19],[-55.97,-86.78],[6.59,8.94],[-15.98,32.97],[-25,10]],"o":[[5.02,6.5],[-80.46,-52.29],[4.73,8.76],[-20.98,-29.69],[12,-24],[33,-13]],"v":[[91.835,-54.9],[81.445,-43.21],[-40.885,78.25],[-55.115,86.56],[-64.085,-16.05],[-7.085,-69.05]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[764.229,657.222]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-6.76,-6.92],[21.59,-22.38],[0,0],[-4.21,8.3],[18.65,29.56],[0,0]],"o":[[30.57,39.25],[0,0],[-6.38,5.91],[22.29,-33.18],[0,0],[-5.15,-9.03]],"v":[[-6.55,-59.46],[-7.98,60.42],[-8.03,60.47],[-19.81,50.31],[-18.74,-49.01],[-18.73,-49.01]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[885.404,685.161]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":12,"op":30,"st":0,"parent":2,"tt":2},{"ind":16,"ty":4,"nm":"m","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"k":[{"i":{"x":0.568,"y":0.508},"o":{"x":0.167,"y":0.167},"t":18,"s":[962,541,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.638,"y":0.69},"o":{"x":0.284,"y":0.284},"t":19,"s":[984.064,541,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.721,"y":1},"o":{"x":0.279,"y":0},"t":21,"s":[1033.042,541,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.638,"y":0.241},"o":{"x":0.332,"y":0.694},"t":33,"s":[963.042,541,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.638,"y":0.34},"o":{"x":0.332,"y":0.604},"t":35,"s":[983.042,541,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.638,"y":0.545},"o":{"x":0.332,"y":0.417},"t":37,"s":[1006.042,541,0],"ti":[0,0,0],"to":[0,0,0]},{"t":40,"s":[1056.042,541,0]}],"a":1},"a":{"a":0,"k":[0,0,0]},"s":{"k":[{"i":{"x":[0.575,0.575,0.575],"y":[1,1,1]},"o":{"x":[0.185,0.185,0.185],"y":[0,0,0]},"t":18,"s":[100,100,100]},{"t":21,"s":[100,100,100]}],"a":1}},"shapes":[{"ty":"gr","nm":"S","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-26.336,-59.257],[1,-18],[36,-55],[0,0]],"o":[[0,0],[28,63],[-1,18],[-33.439,51.087],[0,0]],"v":[[-63.5,-32.5],[-171.5,-0.5],[-144.5,137.5],[-177.5,291.5],[-65.5,322.5]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[1,1,1,1]}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":33,"op":41,"st":3,"td":1},{"ind":17,"ty":4,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[14.9,-0.54]],"o":[[0,0],[0,0]],"v":[[11.51,-6.635],[-11.51,6.635]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[747.544,701.067]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[20.59,-9.76]],"o":[[0,0],[0,0]],"v":[[9.475,-7.99],[-10.295,7.99]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[746.869,684.281]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[1.62,-2.98]],"o":[[0.27,8.12],[0,0]],"v":[[10.97,-9.345],[-11.24,9.345]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[745.924,667.216]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[14.36,-11.1]],"o":[[0,0],[0,0]],"v":[[18.42,3.65],[-18.42,5.55]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[745.244,637.152]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[13.55,-3.52]],"o":[[0,0],[0,0]],"v":[[10.565,5.01],[-10.565,-1.49]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[776.389,624.962]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[25.73,0.27]],"o":[[0,0],[0,0]],"v":[[18.42,9.07],[-18.42,-9.07]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[796.974,621.982]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[30.07,1.63]],"o":[[0,0],[0,0]],"v":[[18.15,12.595],[-18.15,-12.595]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[812.954,616.837]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-1.89,1.9]],"o":[[0,0],[0,0]],"v":[[-1.359,2.869],[1.359,-2.869]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[824.594,658.3]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0.55,1.62]],"o":[[0,0],[0,0]],"v":[[-0.005,3.586],[-0.275,-3.586]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[814.039,654.688]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[2.71,1.62]],"o":[[0,0],[0,0]],"v":[[1.651,3.601],[-1.651,-3.601]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[802.684,655.512]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[2.44,1.09]],"o":[[0,0],[0,0]],"v":[[2.44,3.25],[-2.44,-3.25]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[794.264,659.221]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0.768,-3.799],[10.37,0],[0,6.51],[-10.37,0],[-2.685,-2.878]],"o":[[3.52,2.02],[0,6.51],[-10.37,0],[0,-6.5],[4.2,0],[0,0]],"v":[[12.185,-9.292],[18.09,0],[-0.077,11.78],[-18.857,0],[-0.077,-11.78],[13.129,-8.362]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[811.051,670.461]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[4.956,2.427]],"o":[[0,0],[0,0]],"v":[[2.478,5.11],[-2.478,-5.11]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[815.356,692.572]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,-8.66],[-12.46,0],[-3.41,1.38],[-0.22,5.36],[0.03,0.45],[-7.28,-2.87]],"o":[[-2.552,0.272],[0,8.67],[4.55,0],[5.5,-2.22],[0.03,-0.42],[4.26,3.1],[0,0]],"v":[[-22.347,-13.273],[-33.56,-1.087],[-12.7,13.273],[-0.6,11.172],[8.7,-0.328],[8.7,-1.628],[33.56,9.722]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[809.133,699.309]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,-5.11],[0,0],[7.14,0.07],[4.87,0],[0,2.43],[-3.47,1.47],[-1.37,0],[0,0]],"o":[[10.86,4.33],[0,6.23],[0,0],[-5.33,-0.06],[-18.41,0],[0,-1.9],[0.98,-0.41],[6.23,0],[0,0]],"v":[[8.905,-10.035],[29.525,3.805],[18.685,9.225],[5.695,9.065],[-10.565,8.955],[-29.525,-0.795],[-24.895,-7.725],[-21.395,-8.385],[-13.815,-4.315]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[833.809,719.067]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-3.79,-0.28],[-0.95,-0.07],[-9.22,-0.39],[-6.11,1.6],[-1.073,-9.626]],"o":[[0,0],[0.35,0.03],[3.84,0.27],[13.32,0.56],[0,0],[0,0]],"v":[[-38.035,-3.938],[-32.075,-4.748],[-30.105,-4.598],[-8.695,-3.368],[25.885,-4.208],[38.035,5.028]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[815.239,690.52]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[-1.21,9.1],[0,0]],"v":[[4.46,-4.782],[-4.459,4.782]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[849.194,705.063]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-20.31,8.4]],"o":[[0,0],[0,0]],"v":[[-22.885,-4.47],[22.885,-3.93]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[815.799,745.221]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[4.06,0],[2.44,-3.25],[8.12,0.27],[1.9,-0.82],[-0.2,-0.41],[-18.49,-0.47],[-4.06,4.33]],"o":[[-3.52,-0.81],[-4.06,0],[0,0],[-8.13,-0.27],[0,0],[1.37,2.91],[11.37,0],[0,0]],"v":[[23.97,-5.415],[13.95,-10.555],[3.93,-4.335],[-7.17,-11.375],[-23.97,-4.055],[-23.68,-3.405],[2.85,11.645],[23.7,-0.535]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[815.254,744.266]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,-3.52],[-34.4,0],[0,7.04]],"o":[[0,0],[0,3.52],[20.31,0],[0,0]],"v":[[-26.675,-10.695],[-26.405,-2.845],[5.015,10.695],[29.385,0.675]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[790.609,770.137]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[19.5,0],[2.98,5.42]],"o":[[0,0],[0,0],[0,0],[0,0],[0,2.98],[-7.85,0],[0,0]],"v":[[19.365,-20.855],[19.365,-11.105],[19.365,-8.665],[19.365,-6.225],[19.365,0.545],[-0.135,20.855],[-19.365,13.815]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[820.129,749.957]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[5.41,-13.54],[0.27,-0.55],[0,0],[0,0],[0,0],[0,0],[-1.08,18.96],[-4.33,19.5],[-13.55,5.96],[-35.21,-5.96],[0,0],[0.54,-16.25],[4.33,-11.92],[13,10.57],[16.25,-21.13],[0,-14.63],[5.9,-2.25],[0,0]],"o":[[2.16,11.37],[-0.25,0.62],[-5.73,11.54],[5.42,-1.08],[-6.5,7.04],[8.12,0],[-31.42,3.25],[1.08,-18.96],[4.34,-19.5],[13.54,-5.96],[46.05,7.58],[0,0],[-0.54,16.25],[-3.25,-4.34],[-17.07,13],[-14.63,16.25],[0,10.51],[-2.31,0.88],[0,0]],"v":[[-33.585,40.21],[-24.105,79.75],[-24.885,81.51],[-41.715,90.58],[-35.215,77.04],[-49.835,79.75],[-40.625,66.21],[-58.505,9.87],[-69.885,-32.38],[-30.875,-56.22],[28.165,-87.09],[61.755,-43.76],[72.045,-25.88],[53.085,8.79],[49.025,-39.97],[-17.605,-28.59],[-20.045,21.79],[-36.435,40.02],[-40.355,41.29]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[788.039,677.521]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,-6.13],[0.01,-0.19],[6,0],[2.06,2.51],[0,0],[0,0],[-5.28,0]],"o":[[6.1,0.1],[0,0.19],[-0.3,5.92],[-3.5,0],[0,0],[0,0],[1.19,-4.9],[0,0]],"v":[[0.025,-11.205],[11.045,-0.005],[11.035,0.575],[-0.165,11.205],[-8.845,7.095],[-2.265,1.365],[-11.045,-2.655],[-0.165,-11.205]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[806.519,698.396]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-0.11,-3.76],[0,0],[4.78,0],[1.63,2],[0,0],[0,0],[-4.2,0],[-0.44,-0.06],[-0.01,0]],"o":[[0,0],[-0.24,4.72],[-2.79,0],[0,0],[0,0],[0.95,-3.92],[0.46,0],[0.01,0],[4.48,2.11]],"v":[[8.795,0.375],[8.795,0.465],[-0.125,8.935],[-7.035,5.655],[-1.795,1.095],[-8.795,-2.105],[-0.125,-8.935],[1.235,-8.835],[1.265,-8.825]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[820.939,669.846]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,-4.47],[0.01,-0.12],[4.48,2.11]],"o":[[0,0.12],[-0.11,-3.76],[4.27,0.67]],"v":[[3.77,4.23],[3.76,4.6],[-3.77,-4.6]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[825.974,665.622]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-2.07,-0.84],[1.72,1.44]],"o":[[-2.38,-0.13],[2.09,0.83]],"v":[[3.14,1.245],[-3.14,-1.245]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[839.554,707.786]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,-1.59],[0.13,-0.94],[4.88,0],[0.2,0.01],[0,0],[2.09,0.83],[0.43,0.53],[0,0],[0,0],[-5.08,0],[-1.64,-3.87]],"o":[[0,1.17],[-1.34,4.44],[-0.2,0],[0,0],[-2.07,-0.84],[-0.53,-0.43],[0,0],[0,0],[1.15,-4.73],[4.48,0],[0.37,1.2]],"v":[[10.505,-0.035],[10.305,3.135],[-0.025,10.795],[-0.635,10.775],[-0.655,10.775],[-6.935,8.285],[-8.375,6.835],[-2.045,1.315],[-10.505,-2.555],[-0.025,-10.795],[9.925,-4.205]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[843.349,698.257]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,-1.49],[0.31,-0.99],[0,1.17],[0.37,1.2]],"o":[[0,1.09],[0.13,-0.94],[0,-1.59],[0.55,1.29]],"v":[[0.425,0.53],[-0.045,3.67],[0.155,0.5],[-0.425,-3.67]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[853.699,697.721]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[5.9,-2.25],[0,0],[5.41,-13.54],[0.27,-0.55],[0,0],[0,0],[0,0],[0,0],[-1.08,18.96],[-4.33,19.5],[-13.55,5.96],[-35.21,-5.96],[0,0],[0.54,-16.25],[4.33,-11.92],[13,10.57],[16.25,-21.13],[0,-14.63]],"o":[[0,0],[2.16,11.37],[-0.25,0.62],[-5.73,11.54],[5.42,-1.08],[-6.5,7.04],[8.12,0],[-31.42,3.25],[1.08,-18.96],[4.34,-19.5],[13.54,-5.96],[46.05,7.58],[0,0],[-0.54,16.25],[-3.25,-4.34],[-17.07,13],[-14.63,16.25],[0,10.51]],"v":[[-36.435,40.02],[-33.585,40.21],[-24.105,79.75],[-24.885,81.51],[-41.715,90.58],[-35.215,77.04],[-49.835,79.75],[-40.625,66.21],[-58.505,9.87],[-69.885,-32.38],[-30.875,-56.22],[28.165,-87.09],[61.755,-43.76],[72.045,-25.88],[53.085,8.79],[49.025,-39.97],[-17.605,-28.59],[-20.045,21.79]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[788.039,677.521]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[19.5,0],[20.31,0],[0,3.52],[0,0],[0,0],[-0.25,0.62],[2.16,11.37],[0,0],[0,10.51],[-14.63,16.25],[-17.07,13],[-3.25,-4.34],[13.32,0.56],[3.84,0.27],[0,0],[0,-8.66],[-12.46,0],[-3.41,1.38],[0,0],[0,-1.9],[-18.41,0],[-5.33,-0.06],[0,0],[0,0],[0,0],[4.06,0],[2.44,-3.25],[8.12,0.27],[1.9,-0.82],[-0.2,-0.41],[-18.49,-0.47],[-4.06,4.33],[0,0],[0,0]],"o":[[0,7.04],[-34.4,0],[0,-3.52],[0,0],[0.27,-0.55],[5.41,-13.54],[0,0],[5.9,-2.25],[0,-14.63],[16.25,-21.13],[13,10.57],[-6.11,1.6],[-9.22,-0.39],[0,0],[0,0],[0,8.67],[4.55,0],[0,0],[-3.47,1.47],[0,2.43],[4.87,0],[0,0],[0,0],[0,0],[-3.52,-0.81],[-4.06,0],[0,0],[-8.13,-0.27],[0,0],[1.37,2.91],[11.37,0],[0,0],[0,0],[0,2.98]],"v":[[19.16,66.495],[-5.21,76.515],[-36.63,62.975],[-36.9,55.125],[-37.68,54.715],[-36.9,52.955],[-46.38,13.415],[-49.23,13.225],[-32.84,-5.005],[-30.4,-55.385],[36.23,-66.765],[40.29,-18.005],[5.71,-17.165],[-15.7,-18.395],[-15.78,-17.465],[-25.26,-6.095],[-4.4,8.265],[7.7,6.165],[8.08,7.025],[3.45,13.955],[22.41,23.705],[38.67,23.815],[38.66,24.785],[38.66,34.535],[38.39,34.535],[28.37,29.395],[18.35,35.615],[7.25,28.575],[-9.55,35.895],[-9.26,36.545],[17.27,51.595],[38.12,39.415],[38.66,39.415],[38.66,46.185]],"c":true},"a":0}},{"ty":"sh","nm":"P","ind":1,"ks":{"k":{"i":[[4.2,0],[0,-6.5],[-10.37,0],[0,6.51],[0.01,0.05],[0,0],[0,0.12],[4.27,0.67],[0.01,0]],"o":[[-10.37,0],[0,6.51],[10.37,0],[0,-0.05],[0,0],[0.01,-0.12],[0,-4.47],[-0.01,0],[-3.12,-1.46]],"v":[[10.14,-45.635],[-8.64,-33.855],[10.14,-22.075],[28.91,-33.855],[28.9,-34.005],[28.9,-34.095],[28.91,-34.465],[21.37,-43.295],[21.34,-43.305]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[800.834,704.317]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-8.13,-0.27],[0,0],[-4.06,0],[-3.52,-0.81],[0,0],[0,0]],"o":[[-20.31,8.4],[0,0],[-0.2,-0.41],[1.9,-0.82],[8.12,0.27],[2.44,-3.25],[4.06,0],[0,0],[0,0],[0,0]],"v":[[23.295,0.135],[-22.475,-0.405],[-23.815,-0.295],[-24.105,-0.945],[-7.305,-8.265],[3.795,-1.225],[13.815,-7.445],[23.835,-2.305],[24.105,-2.305],[24.105,0.135]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[815.389,741.156]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-20.31,8.4],[0,0],[0,0],[0,0],[11.37,0],[1.37,2.91]],"o":[[0,0],[0,0],[0,0],[0,0],[-4.06,4.33],[-18.49,-0.47],[0,0]],"v":[[-22.62,-7.58],[23.15,-7.04],[23.96,-7.04],[23.96,-4.6],[23.42,-4.6],[2.57,7.58],[-23.96,-7.47]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[815.534,748.331]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-0.22,5.36],[0.03,0.45],[-7.28,-2.87],[-2.38,-0.13],[0,0],[0,-5.11],[0,0],[7.14,0.07],[4.87,0],[0,2.43],[-3.47,1.47]],"o":[[5.5,-2.22],[0.03,-0.42],[4.26,3.1],[1.72,1.44],[0,0],[10.86,4.33],[0,6.23],[0,0],[-5.33,-0.06],[-18.41,0],[0,-1.9],[0,0]],"v":[[-25.275,-2.91],[-15.975,-14.41],[-15.975,-15.71],[2.605,-6.85],[8.885,-4.36],[8.905,-4.36],[29.525,9.48],[18.685,14.9],[5.695,14.74],[-10.565,14.63],[-29.525,4.88],[-24.895,-2.05]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[833.809,713.391]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[1.19,-4.9],[0,0],[0,0],[-3.5,0],[-0.3,5.92],[0,0],[5.5,-2.22],[4.55,0],[0,8.67],[0,0],[0,0],[-9.22,-0.39],[0,0]],"o":[[-5.28,0],[0,0],[0,0],[2.06,2.51],[6,0],[0,0],[-0.22,5.36],[-3.41,1.38],[-12.46,0],[0,-8.66],[0,0],[3.84,0.27],[0,0],[0,0]],"v":[[9.65,-12.06],[-1.23,-3.51],[7.55,0.51],[0.97,6.24],[9.65,10.35],[20.85,-0.28],[21.13,-0.27],[11.83,11.23],[-0.27,13.33],[-21.13,-1.03],[-11.65,-12.4],[-11.57,-13.33],[9.84,-12.1],[9.84,-12.06]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[796.704,699.252]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-0.952,-9.39],[0,0],[4.46,-0.653],[-0.53,-0.43],[4.26,3.1],[0.03,-0.42],[0,0],[0,0.19],[6.1,0.1],[0,0],[-6.11,1.6]],"o":[[0,0],[0.2,5.584],[0.43,0.53],[-7.28,-2.87],[0.03,0.45],[0,0],[0.01,-0.19],[0,-6.13],[0,0],[13.32,0.56],[0,0]],"v":[[23.075,-2.642],[23.455,1.938],[14.536,11.501],[4.525,7.399],[-12.365,-0.661],[-12.365,0.638],[-12.645,0.628],[-12.635,0.048],[-23.655,-11.151],[-23.655,-11.192],[10.925,-12.031]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[830.199,698.343]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,-0.05],[10.37,0],[0,6.51],[-10.37,0],[-3.12,-1.46],[0.46,0],[0.95,-3.92],[0,0],[0,0],[-2.79,0],[-0.24,4.72]],"o":[[0,6.51],[-10.37,0],[0,-6.5],[4.2,0],[-0.44,-0.06],[-4.2,0],[0,0],[0,0],[1.63,2],[4.78,0],[0.01,0.05]],"v":[[18.775,0],[0.005,11.78],[-18.775,0],[0.005,-11.78],[11.205,-9.45],[9.845,-9.55],[1.175,-2.72],[8.175,0.48],[2.935,5.04],[9.845,8.32],[18.765,-0.15]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[810.969,670.462]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[12.396,3.289],[-3.289,12.396],[-12.396,-3.289],[3.288,-12.396]],"o":[[12.396,-3.289],[3.288,12.396],[-12.396,3.289],[-3.289,-12.396]],"v":[[-18.35,0],[0,-18.351],[18.351,0],[0,18.351]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[695.82,689.624]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-12.396,-3.289],[3.289,-12.396],[12.396,3.289],[-3.288,12.396]],"o":[[-12.396,3.289],[-3.288,-12.396],[12.396,-3.289],[3.289,12.396]],"v":[[18.351,0],[0,18.351],[-18.351,0],[0,-18.351]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[885.673,689.624]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":33,"op":49,"st":3,"parent":3,"tt":2},{"ind":18,"ty":4,"nm":"m","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"k":[{"i":{"x":0.696,"y":0.733},"o":{"x":0.353,"y":0.301},"t":30,"s":[572.902,541,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.441,"y":0.517},"t":31,"s":[602.97,541,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":32,"s":[625,541,0],"ti":[0,0,0],"to":[0,0,0]},{"t":33,"s":[962,541,0]}],"a":1},"a":{"a":0,"k":[0,0,0]},"s":{"k":[{"i":{"x":[0.797,0.797,0.797],"y":[1,1,1]},"o":{"x":[0.431,0.431,0.431],"y":[0,0,0]},"t":30,"s":[-100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":32,"s":[-100,100,100]},{"t":33,"s":[100,100,100]}],"a":1}},"shapes":[{"ty":"gr","nm":"S","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-26.336,-59.257],[1,-18],[36,-55],[0,0]],"o":[[0,0],[28,63],[-1,18],[-33.439,51.087],[0,0]],"v":[[-63.5,-32.5],[-171.5,-0.5],[-144.5,137.5],[-177.5,291.5],[-65.5,322.5]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[1,1,1,1]}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":61,"op":63,"st":3,"td":1},{"ind":19,"ty":4,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[14.9,-0.54]],"o":[[0,0],[0,0]],"v":[[11.51,-6.635],[-11.51,6.635]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[747.544,701.067]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[20.59,-9.76]],"o":[[0,0],[0,0]],"v":[[9.475,-7.99],[-10.295,7.99]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[746.869,684.281]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[1.62,-2.98]],"o":[[0.27,8.12],[0,0]],"v":[[10.97,-9.345],[-11.24,9.345]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[745.924,667.216]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[14.36,-11.1]],"o":[[0,0],[0,0]],"v":[[18.42,3.65],[-18.42,5.55]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[745.244,637.152]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[13.55,-3.52]],"o":[[0,0],[0,0]],"v":[[10.565,5.01],[-10.565,-1.49]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[776.389,624.962]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[25.73,0.27]],"o":[[0,0],[0,0]],"v":[[18.42,9.07],[-18.42,-9.07]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[796.974,621.982]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[30.07,1.63]],"o":[[0,0],[0,0]],"v":[[18.15,12.595],[-18.15,-12.595]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[812.954,616.837]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-1.89,1.9]],"o":[[0,0],[0,0]],"v":[[-1.359,2.869],[1.359,-2.869]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[824.594,658.3]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0.55,1.62]],"o":[[0,0],[0,0]],"v":[[-0.005,3.586],[-0.275,-3.586]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[814.039,654.688]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[2.71,1.62]],"o":[[0,0],[0,0]],"v":[[1.651,3.601],[-1.651,-3.601]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[802.684,655.512]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[2.44,1.09]],"o":[[0,0],[0,0]],"v":[[2.44,3.25],[-2.44,-3.25]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[794.264,659.221]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0.768,-3.799],[10.37,0],[0,6.51],[-10.37,0],[-2.685,-2.878]],"o":[[3.52,2.02],[0,6.51],[-10.37,0],[0,-6.5],[4.2,0],[0,0]],"v":[[12.185,-9.292],[18.09,0],[-0.077,11.78],[-18.857,0],[-0.077,-11.78],[13.129,-8.362]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[811.051,670.461]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[4.956,2.427]],"o":[[0,0],[0,0]],"v":[[2.478,5.11],[-2.478,-5.11]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[815.356,692.572]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,-8.66],[-12.46,0],[-3.41,1.38],[-0.22,5.36],[0.03,0.45],[-7.28,-2.87]],"o":[[-2.552,0.272],[0,8.67],[4.55,0],[5.5,-2.22],[0.03,-0.42],[4.26,3.1],[0,0]],"v":[[-22.347,-13.273],[-33.56,-1.087],[-12.7,13.273],[-0.6,11.172],[8.7,-0.328],[8.7,-1.628],[33.56,9.722]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[809.133,699.309]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,-5.11],[0,0],[7.14,0.07],[4.87,0],[0,2.43],[-3.47,1.47],[-1.37,0],[0,0]],"o":[[10.86,4.33],[0,6.23],[0,0],[-5.33,-0.06],[-18.41,0],[0,-1.9],[0.98,-0.41],[6.23,0],[0,0]],"v":[[8.905,-10.035],[29.525,3.805],[18.685,9.225],[5.695,9.065],[-10.565,8.955],[-29.525,-0.795],[-24.895,-7.725],[-21.395,-8.385],[-13.815,-4.315]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[833.809,719.067]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-3.79,-0.28],[-0.95,-0.07],[-9.22,-0.39],[-6.11,1.6],[-1.073,-9.626]],"o":[[0,0],[0.35,0.03],[3.84,0.27],[13.32,0.56],[0,0],[0,0]],"v":[[-38.035,-3.938],[-32.075,-4.748],[-30.105,-4.598],[-8.695,-3.368],[25.885,-4.208],[38.035,5.028]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[815.239,690.52]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[-1.21,9.1],[0,0]],"v":[[4.46,-4.782],[-4.459,4.782]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[849.194,705.063]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-20.31,8.4]],"o":[[0,0],[0,0]],"v":[[-22.885,-4.47],[22.885,-3.93]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[815.799,745.221]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[4.06,0],[2.44,-3.25],[8.12,0.27],[1.9,-0.82],[-0.2,-0.41],[-18.49,-0.47],[-4.06,4.33]],"o":[[-3.52,-0.81],[-4.06,0],[0,0],[-8.13,-0.27],[0,0],[1.37,2.91],[11.37,0],[0,0]],"v":[[23.97,-5.415],[13.95,-10.555],[3.93,-4.335],[-7.17,-11.375],[-23.97,-4.055],[-23.68,-3.405],[2.85,11.645],[23.7,-0.535]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[815.254,744.266]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,-3.52],[-34.4,0],[0,7.04]],"o":[[0,0],[0,3.52],[20.31,0],[0,0]],"v":[[-26.675,-10.695],[-26.405,-2.845],[5.015,10.695],[29.385,0.675]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[790.609,770.137]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[19.5,0],[2.98,5.42]],"o":[[0,0],[0,0],[0,0],[0,0],[0,2.98],[-7.85,0],[0,0]],"v":[[19.365,-20.855],[19.365,-11.105],[19.365,-8.665],[19.365,-6.225],[19.365,0.545],[-0.135,20.855],[-19.365,13.815]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[820.129,749.957]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[5.41,-13.54],[0.27,-0.55],[0,0],[0,0],[0,0],[0,0],[-1.08,18.96],[-4.33,19.5],[-13.55,5.96],[-35.21,-5.96],[0,0],[0.54,-16.25],[4.33,-11.92],[13,10.57],[16.25,-21.13],[0,-14.63],[5.9,-2.25],[0,0]],"o":[[2.16,11.37],[-0.25,0.62],[-5.73,11.54],[5.42,-1.08],[-6.5,7.04],[8.12,0],[-31.42,3.25],[1.08,-18.96],[4.34,-19.5],[13.54,-5.96],[46.05,7.58],[0,0],[-0.54,16.25],[-3.25,-4.34],[-17.07,13],[-14.63,16.25],[0,10.51],[-2.31,0.88],[0,0]],"v":[[-33.585,40.21],[-24.105,79.75],[-24.885,81.51],[-41.715,90.58],[-35.215,77.04],[-49.835,79.75],[-40.625,66.21],[-58.505,9.87],[-69.885,-32.38],[-30.875,-56.22],[28.165,-87.09],[61.755,-43.76],[72.045,-25.88],[53.085,8.79],[49.025,-39.97],[-17.605,-28.59],[-20.045,21.79],[-36.435,40.02],[-40.355,41.29]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[788.039,677.521]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,-6.13],[0.01,-0.19],[6,0],[2.06,2.51],[0,0],[0,0],[-5.28,0]],"o":[[6.1,0.1],[0,0.19],[-0.3,5.92],[-3.5,0],[0,0],[0,0],[1.19,-4.9],[0,0]],"v":[[0.025,-11.205],[11.045,-0.005],[11.035,0.575],[-0.165,11.205],[-8.845,7.095],[-2.265,1.365],[-11.045,-2.655],[-0.165,-11.205]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[806.519,698.396]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-0.11,-3.76],[0,0],[4.78,0],[1.63,2],[0,0],[0,0],[-4.2,0],[-0.44,-0.06],[-0.01,0]],"o":[[0,0],[-0.24,4.72],[-2.79,0],[0,0],[0,0],[0.95,-3.92],[0.46,0],[0.01,0],[4.48,2.11]],"v":[[8.795,0.375],[8.795,0.465],[-0.125,8.935],[-7.035,5.655],[-1.795,1.095],[-8.795,-2.105],[-0.125,-8.935],[1.235,-8.835],[1.265,-8.825]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[820.939,669.846]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,-4.47],[0.01,-0.12],[4.48,2.11]],"o":[[0,0.12],[-0.11,-3.76],[4.27,0.67]],"v":[[3.77,4.23],[3.76,4.6],[-3.77,-4.6]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[825.974,665.622]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-2.07,-0.84],[1.72,1.44]],"o":[[-2.38,-0.13],[2.09,0.83]],"v":[[3.14,1.245],[-3.14,-1.245]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[839.554,707.786]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,-1.59],[0.13,-0.94],[4.88,0],[0.2,0.01],[0,0],[2.09,0.83],[0.43,0.53],[0,0],[0,0],[-5.08,0],[-1.64,-3.87]],"o":[[0,1.17],[-1.34,4.44],[-0.2,0],[0,0],[-2.07,-0.84],[-0.53,-0.43],[0,0],[0,0],[1.15,-4.73],[4.48,0],[0.37,1.2]],"v":[[10.505,-0.035],[10.305,3.135],[-0.025,10.795],[-0.635,10.775],[-0.655,10.775],[-6.935,8.285],[-8.375,6.835],[-2.045,1.315],[-10.505,-2.555],[-0.025,-10.795],[9.925,-4.205]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[843.349,698.257]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,-1.49],[0.31,-0.99],[0,1.17],[0.37,1.2]],"o":[[0,1.09],[0.13,-0.94],[0,-1.59],[0.55,1.29]],"v":[[0.425,0.53],[-0.045,3.67],[0.155,0.5],[-0.425,-3.67]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[853.699,697.721]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[5.9,-2.25],[0,0],[5.41,-13.54],[0.27,-0.55],[0,0],[0,0],[0,0],[0,0],[-1.08,18.96],[-4.33,19.5],[-13.55,5.96],[-35.21,-5.96],[0,0],[0.54,-16.25],[4.33,-11.92],[13,10.57],[16.25,-21.13],[0,-14.63]],"o":[[0,0],[2.16,11.37],[-0.25,0.62],[-5.73,11.54],[5.42,-1.08],[-6.5,7.04],[8.12,0],[-31.42,3.25],[1.08,-18.96],[4.34,-19.5],[13.54,-5.96],[46.05,7.58],[0,0],[-0.54,16.25],[-3.25,-4.34],[-17.07,13],[-14.63,16.25],[0,10.51]],"v":[[-36.435,40.02],[-33.585,40.21],[-24.105,79.75],[-24.885,81.51],[-41.715,90.58],[-35.215,77.04],[-49.835,79.75],[-40.625,66.21],[-58.505,9.87],[-69.885,-32.38],[-30.875,-56.22],[28.165,-87.09],[61.755,-43.76],[72.045,-25.88],[53.085,8.79],[49.025,-39.97],[-17.605,-28.59],[-20.045,21.79]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[788.039,677.521]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[19.5,0],[20.31,0],[0,3.52],[0,0],[0,0],[-0.25,0.62],[2.16,11.37],[0,0],[0,10.51],[-14.63,16.25],[-17.07,13],[-3.25,-4.34],[13.32,0.56],[3.84,0.27],[0,0],[0,-8.66],[-12.46,0],[-3.41,1.38],[0,0],[0,-1.9],[-18.41,0],[-5.33,-0.06],[0,0],[0,0],[0,0],[4.06,0],[2.44,-3.25],[8.12,0.27],[1.9,-0.82],[-0.2,-0.41],[-18.49,-0.47],[-4.06,4.33],[0,0],[0,0]],"o":[[0,7.04],[-34.4,0],[0,-3.52],[0,0],[0.27,-0.55],[5.41,-13.54],[0,0],[5.9,-2.25],[0,-14.63],[16.25,-21.13],[13,10.57],[-6.11,1.6],[-9.22,-0.39],[0,0],[0,0],[0,8.67],[4.55,0],[0,0],[-3.47,1.47],[0,2.43],[4.87,0],[0,0],[0,0],[0,0],[-3.52,-0.81],[-4.06,0],[0,0],[-8.13,-0.27],[0,0],[1.37,2.91],[11.37,0],[0,0],[0,0],[0,2.98]],"v":[[19.16,66.495],[-5.21,76.515],[-36.63,62.975],[-36.9,55.125],[-37.68,54.715],[-36.9,52.955],[-46.38,13.415],[-49.23,13.225],[-32.84,-5.005],[-30.4,-55.385],[36.23,-66.765],[40.29,-18.005],[5.71,-17.165],[-15.7,-18.395],[-15.78,-17.465],[-25.26,-6.095],[-4.4,8.265],[7.7,6.165],[8.08,7.025],[3.45,13.955],[22.41,23.705],[38.67,23.815],[38.66,24.785],[38.66,34.535],[38.39,34.535],[28.37,29.395],[18.35,35.615],[7.25,28.575],[-9.55,35.895],[-9.26,36.545],[17.27,51.595],[38.12,39.415],[38.66,39.415],[38.66,46.185]],"c":true},"a":0}},{"ty":"sh","nm":"P","ind":1,"ks":{"k":{"i":[[4.2,0],[0,-6.5],[-10.37,0],[0,6.51],[0.01,0.05],[0,0],[0,0.12],[4.27,0.67],[0.01,0]],"o":[[-10.37,0],[0,6.51],[10.37,0],[0,-0.05],[0,0],[0.01,-0.12],[0,-4.47],[-0.01,0],[-3.12,-1.46]],"v":[[10.14,-45.635],[-8.64,-33.855],[10.14,-22.075],[28.91,-33.855],[28.9,-34.005],[28.9,-34.095],[28.91,-34.465],[21.37,-43.295],[21.34,-43.305]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[800.834,704.317]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-8.13,-0.27],[0,0],[-4.06,0],[-3.52,-0.81],[0,0],[0,0]],"o":[[-20.31,8.4],[0,0],[-0.2,-0.41],[1.9,-0.82],[8.12,0.27],[2.44,-3.25],[4.06,0],[0,0],[0,0],[0,0]],"v":[[23.295,0.135],[-22.475,-0.405],[-23.815,-0.295],[-24.105,-0.945],[-7.305,-8.265],[3.795,-1.225],[13.815,-7.445],[23.835,-2.305],[24.105,-2.305],[24.105,0.135]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[815.389,741.156]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-20.31,8.4],[0,0],[0,0],[0,0],[11.37,0],[1.37,2.91]],"o":[[0,0],[0,0],[0,0],[0,0],[-4.06,4.33],[-18.49,-0.47],[0,0]],"v":[[-22.62,-7.58],[23.15,-7.04],[23.96,-7.04],[23.96,-4.6],[23.42,-4.6],[2.57,7.58],[-23.96,-7.47]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[815.534,748.331]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-0.22,5.36],[0.03,0.45],[-7.28,-2.87],[-2.38,-0.13],[0,0],[0,-5.11],[0,0],[7.14,0.07],[4.87,0],[0,2.43],[-3.47,1.47]],"o":[[5.5,-2.22],[0.03,-0.42],[4.26,3.1],[1.72,1.44],[0,0],[10.86,4.33],[0,6.23],[0,0],[-5.33,-0.06],[-18.41,0],[0,-1.9],[0,0]],"v":[[-25.275,-2.91],[-15.975,-14.41],[-15.975,-15.71],[2.605,-6.85],[8.885,-4.36],[8.905,-4.36],[29.525,9.48],[18.685,14.9],[5.695,14.74],[-10.565,14.63],[-29.525,4.88],[-24.895,-2.05]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[833.809,713.391]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[1.19,-4.9],[0,0],[0,0],[-3.5,0],[-0.3,5.92],[0,0],[5.5,-2.22],[4.55,0],[0,8.67],[0,0],[0,0],[-9.22,-0.39],[0,0]],"o":[[-5.28,0],[0,0],[0,0],[2.06,2.51],[6,0],[0,0],[-0.22,5.36],[-3.41,1.38],[-12.46,0],[0,-8.66],[0,0],[3.84,0.27],[0,0],[0,0]],"v":[[9.65,-12.06],[-1.23,-3.51],[7.55,0.51],[0.97,6.24],[9.65,10.35],[20.85,-0.28],[21.13,-0.27],[11.83,11.23],[-0.27,13.33],[-21.13,-1.03],[-11.65,-12.4],[-11.57,-13.33],[9.84,-12.1],[9.84,-12.06]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[796.704,699.252]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-0.952,-9.39],[0,0],[4.46,-0.653],[-0.53,-0.43],[4.26,3.1],[0.03,-0.42],[0,0],[0,0.19],[6.1,0.1],[0,0],[-6.11,1.6]],"o":[[0,0],[0.2,5.584],[0.43,0.53],[-7.28,-2.87],[0.03,0.45],[0,0],[0.01,-0.19],[0,-6.13],[0,0],[13.32,0.56],[0,0]],"v":[[23.075,-2.642],[23.455,1.938],[14.536,11.501],[4.525,7.399],[-12.365,-0.661],[-12.365,0.638],[-12.645,0.628],[-12.635,0.048],[-23.655,-11.151],[-23.655,-11.192],[10.925,-12.031]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[830.199,698.343]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,-0.05],[10.37,0],[0,6.51],[-10.37,0],[-3.12,-1.46],[0.46,0],[0.95,-3.92],[0,0],[0,0],[-2.79,0],[-0.24,4.72]],"o":[[0,6.51],[-10.37,0],[0,-6.5],[4.2,0],[-0.44,-0.06],[-4.2,0],[0,0],[0,0],[1.63,2],[4.78,0],[0.01,0.05]],"v":[[18.775,0],[0.005,11.78],[-18.775,0],[0.005,-11.78],[11.205,-9.45],[9.845,-9.55],[1.175,-2.72],[8.175,0.48],[2.935,5.04],[9.845,8.32],[18.765,-0.15]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[810.969,670.462]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[12.396,3.289],[-3.289,12.396],[-12.396,-3.289],[3.288,-12.396]],"o":[[12.396,-3.289],[3.288,12.396],[-12.396,3.289],[-3.289,-12.396]],"v":[[-18.35,0],[0,-18.351],[18.351,0],[0,18.351]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[695.82,689.624]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-12.396,-3.289],[3.289,-12.396],[12.396,3.289],[-3.288,12.396]],"o":[[-12.396,3.289],[-3.288,-12.396],[12.396,-3.289],[3.289,12.396]],"v":[[18.351,0],[0,18.351],[-18.351,0],[0,-18.351]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[885.673,689.624]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":47,"op":63,"st":3,"parent":3,"tt":2},{"ind":20,"ty":4,"nm":"m","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"k":[{"i":{"x":0.622,"y":0.8},"o":{"x":0.167,"y":0.167},"t":36,"s":[962,541,0],"ti":[0,0,0],"to":[0,0,0]},{"t":41,"s":[1066.402,541,0]}],"a":1},"a":{"a":0,"k":[0,0,0]},"s":{"k":[{"i":{"x":[0.622,0.622,0.622],"y":[1,1,1]},"o":{"x":[0.169,0.169,0.169],"y":[0,0,0]},"t":36,"s":[100,100,100]},{"t":41,"s":[100,100,100]}],"a":1}},"shapes":[{"ty":"gr","nm":"S","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-26.336,-59.257],[1,-18],[36,-55],[0,0]],"o":[[0,0],[28,63],[-1,18],[-33.439,51.087],[0,0]],"v":[[-63.5,-32.5],[-171.5,-0.5],[-144.5,137.5],[-177.5,291.5],[-65.5,322.5]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[1,1,1,1]}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":66,"op":74,"st":6,"td":1},{"ind":21,"ty":4,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-12.396,-3.289],[3.289,-12.396],[12.396,3.289],[-3.288,12.396]],"o":[[-12.396,3.289],[-3.288,-12.396],[12.396,-3.289],[3.289,12.396]],"v":[[18.351,0],[0,18.351],[-18.351,0],[0,-18.351]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[701.82,686.579]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-12.396,-3.289],[3.289,-12.396],[12.396,3.289],[-3.288,12.396]],"o":[[-12.396,3.289],[-3.288,-12.396],[12.396,-3.289],[3.289,12.396]],"v":[[18.351,0],[0,18.351],[-18.351,0],[0,-18.351]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[883.673,686.579]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[806.594,733.661],[806.594,720.391]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[783.044,733.661],[783.044,720.391]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[770.434,734.322],[783.044,734.322],[806.594,734.322],[816.554,734.322]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[793.654,719.721],[793.654,707.082]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[793.654,752.572],[793.654,745.271]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-4.38,5.04],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.76,-6.9],[-12.13,0],[0,0]],"o":[[6.02,-6.92],[0,0],[0,0],[0,0],[0,0],[0,0],[4.26,5.11],[0,0],[11.97,-0.03]],"v":[[23.4,2.85],[30.03,-12.28],[12.77,-12.28],[-0.17,-12.28],[-10.78,-12.28],[-30.03,-12.28],[-23.87,2.73],[-0.3,12.28],[-0.19,12.28]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[793.823,732.002]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[5.19,13.175],[-5.19,-13.175]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[814.834,693.347]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-4.54,13.1],[4.52,-13.05],[4.54,-13.1]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[772.194,693.192]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[771.094,628.812],[815.554,628.812]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[727.294,706.672],[767.654,706.672],[793.654,706.672],[820.024,706.672],[859.684,706.672]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-21.32,-6.2],[-6.31,0],[-4.55,1.64],[0,0]],"o":[[0,0],[4.35,1.27],[6.71,0],[19.33,-6.9],[0,0]],"v":[[-37.555,-12.685],[-16.235,11.795],[-0.335,13.825],[16.455,11.185],[37.555,-13.825]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.949,668.346]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[31.09,-30.92]],"o":[[-5.68,-7.01],[0,0]],"v":[[36.535,15.23],[-36.535,15.46]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.999,637.702]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[21.745,-42.355],[-1.275,-82.135],[-23.475,-42.715],[-37.405,-17.975],[-38.735,-15.615],[-67.305,35.125],[-93.775,82.135],[-0.215,82.135],[93.775,82.135],[66.565,35.105],[36.635,-16.615],[35.705,-18.225]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[793.869,671.136]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[7.13,0],[0,8.38],[-8.38,0],[-2.51,-4.93]],"o":[[0,0],[-1.63,6.63],[-8.38,0],[0,-8.38],[5.9,0],[0,0]],"v":[[3.885,1.57],[14.945,3.62],[0.225,15.17],[-14.945,0],[0.225,-15.17],[13.735,-6.87]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.289,660.091]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-1.63,6.63],[0,0],[0,0],[5.9,0],[0,-8.38],[-8.38,0]],"o":[[0,0],[0,0],[-2.51,-4.93],[-8.38,0],[0,8.38],[7.13,0]],"v":[[14.415,11.505],[3.355,9.455],[13.205,1.015],[-0.305,-7.285],[-15.475,7.885],[-0.305,23.055]],"c":true},"a":0}},{"ty":"sh","nm":"P","ind":1,"ks":{"k":{"i":[[0,0],[19.33,-6.9],[6.71,0],[4.35,1.27],[0,0],[0,0],[0,0],[-5.68,-7.01],[0,0]],"o":[[0,0],[-4.55,1.64],[-6.31,0],[-21.32,-6.2],[0,0],[0,0],[31.09,-30.92],[0,0],[0,0]],"v":[[37.685,2.315],[16.585,27.325],[-0.205,29.965],[-16.105,27.935],[-37.425,3.455],[-37.685,3.315],[-36.355,0.955],[36.715,0.725],[36.755,0.705]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.819,652.207]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-5.76,-6.9],[0,0],[0,0],[0,0]],"v":[[9.625,6.435],[9.625,7.095],[-2.985,7.095],[-3.465,7.505],[-9.625,-7.505],[9.625,-7.505],[9.625,-6.835]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[773.419,727.227]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[11.775,6.64],[11.775,7.3],[-11.775,7.3],[-11.775,6.64],[-11.775,-6.63],[-11.775,-7.3],[-1.165,-7.3],[11.775,-7.3],[11.775,-6.63]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[794.819,727.022]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[6.02,-6.92],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-8.63,-7.565],[8.63,-7.565],[2,7.565],[1.33,7.035],[-8.63,7.035],[-8.63,6.375],[-8.63,-6.895]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[815.224,727.286]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[22.61,19.875],[22.55,19.905],[-21.91,19.905],[-22.61,19.515],[-0.41,-19.905]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[793.004,608.906]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[31.09,-30.92],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-5.68,-7.01],[0,0],[0,0],[0,0],[0,0]],"v":[[22.595,-8.92],[36.555,15.21],[36.515,15.23],[-36.555,15.46],[-22.625,-9.28],[-21.925,-8.89],[22.535,-8.89]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[793.019,637.702]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-21.32,-6.2],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[25.075,-0.955],[16.015,25.195],[16.015,25.575],[-24.345,25.575],[-25.075,25.165],[3.495,-25.575],[3.755,-25.435]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[751.639,681.097]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.76,-6.9],[-12.13,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[4.26,5.11],[0,0],[0,0]],"v":[[46.78,15.505],[46.78,22.805],[46.78,23.505],[-46.78,23.505],[-20.31,-23.505],[-19.58,-23.095],[20.78,-23.095],[46.78,-23.095],[46.78,-22.685],[46.78,-10.045],[36.17,-10.045],[16.92,-10.045],[23.08,4.965],[46.65,14.515],[46.76,14.515]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[746.874,729.767]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[19.33,-6.9],[0,0]],"v":[[25.515,25.645],[24.765,26.075],[-14.895,26.075],[-14.895,25.925],[-25.275,-0.425],[-25.515,-1.065],[-4.415,-26.075]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[834.919,680.597]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-6.31,0],[-4.55,1.64],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[4.35,1.27],[6.71,0],[0,0],[0,0]],"v":[[26.185,13.42],[26.185,13.57],[-0.185,13.57],[-26.185,13.57],[-26.185,13.19],[-17.125,-12.96],[-1.225,-10.93],[15.565,-13.57],[15.805,-12.93]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[793.839,693.102]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.38,5.04],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[11.97,-0.03],[6.02,-6.92],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[19.795,-23.515],[47.005,23.515],[-46.985,23.515],[-46.985,22.815],[-46.985,15.515],[-47.005,14.525],[-23.415,5.095],[-16.785,-10.035],[-34.045,-10.035],[-46.985,-10.035],[-46.985,-22.675],[-46.985,-23.085],[-20.615,-23.085],[19.045,-23.085]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[840.639,729.757]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[11.97,-0.03],[0,0],[4.26,5.11],[0,0],[0,0],[0,0]],"o":[[0,0],[-4.38,5.04],[0,0],[-12.13,0],[0,0],[0,0],[0,0],[0,0]],"v":[[22.965,-4.98],[23.635,-4.45],[0.045,4.98],[-0.065,4.98],[-23.635,-4.57],[-23.155,-4.98],[-10.545,-4.98],[13.005,-4.98]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[793.589,739.302]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":66,"op":80,"st":6,"parent":4,"tt":2},{"ind":22,"ty":4,"nm":"m","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.426,"y":0.379},"t":47,"s":[548.543,541,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.99,"y":1},"o":{"x":0.333,"y":0},"t":50,"s":[625,541,0],"ti":[0,0,0],"to":[0,0,0]},{"t":93,"s":[615,541,0]}],"a":1},"a":{"a":0,"k":[0,0,0]},"s":{"k":[{"i":{"x":[0.815,0.815,0.815],"y":[1,1,1]},"o":{"x":[0.425,0.425,0.425],"y":[0,0,0]},"t":47,"s":[-100,100,100]},{"t":50,"s":[-100,100,100]}],"a":1}},"shapes":[{"ty":"gr","nm":"S","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-26.336,-59.257],[1,-18],[36,-55],[0,0]],"o":[[0,0],[28,63],[-1,18],[-33.439,51.087],[0,0]],"v":[[-63.5,-32.5],[-171.5,-0.5],[-144.5,137.5],[-177.5,291.5],[-65.5,322.5]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[1,1,1,1]}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":93,"op":95,"st":6,"td":1},{"ind":23,"ty":4,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-12.396,-3.289],[3.289,-12.396],[12.396,3.289],[-3.288,12.396]],"o":[[-12.396,3.289],[-3.288,-12.396],[12.396,-3.289],[3.289,12.396]],"v":[[18.351,0],[0,18.351],[-18.351,0],[0,-18.351]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[701.82,686.579]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-12.396,-3.289],[3.289,-12.396],[12.396,3.289],[-3.288,12.396]],"o":[[-12.396,3.289],[-3.288,-12.396],[12.396,-3.289],[3.289,12.396]],"v":[[18.351,0],[0,18.351],[-18.351,0],[0,-18.351]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[883.673,686.579]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[806.594,733.661],[806.594,720.391]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[783.044,733.661],[783.044,720.391]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[770.434,734.322],[783.044,734.322],[806.594,734.322],[816.554,734.322]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[793.654,719.721],[793.654,707.082]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[793.654,752.572],[793.654,745.271]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-4.38,5.04],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.76,-6.9],[-12.13,0],[0,0]],"o":[[6.02,-6.92],[0,0],[0,0],[0,0],[0,0],[0,0],[4.26,5.11],[0,0],[11.97,-0.03]],"v":[[23.4,2.85],[30.03,-12.28],[12.77,-12.28],[-0.17,-12.28],[-10.78,-12.28],[-30.03,-12.28],[-23.87,2.73],[-0.3,12.28],[-0.19,12.28]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[793.823,732.002]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[5.19,13.175],[-5.19,-13.175]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[814.834,693.347]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-4.54,13.1],[4.52,-13.05],[4.54,-13.1]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[772.194,693.192]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[771.094,628.812],[815.554,628.812]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[727.294,706.672],[767.654,706.672],[793.654,706.672],[820.024,706.672],[859.684,706.672]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-21.32,-6.2],[-6.31,0],[-4.55,1.64],[0,0]],"o":[[0,0],[4.35,1.27],[6.71,0],[19.33,-6.9],[0,0]],"v":[[-37.555,-12.685],[-16.235,11.795],[-0.335,13.825],[16.455,11.185],[37.555,-13.825]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.949,668.346]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[31.09,-30.92]],"o":[[-5.68,-7.01],[0,0]],"v":[[36.535,15.23],[-36.535,15.46]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.999,637.702]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[21.745,-42.355],[-1.275,-82.135],[-23.475,-42.715],[-37.405,-17.975],[-38.735,-15.615],[-67.305,35.125],[-93.775,82.135],[-0.215,82.135],[93.775,82.135],[66.565,35.105],[36.635,-16.615],[35.705,-18.225]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[793.869,671.136]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[7.13,0],[0,8.38],[-8.38,0],[-2.51,-4.93]],"o":[[0,0],[-1.63,6.63],[-8.38,0],[0,-8.38],[5.9,0],[0,0]],"v":[[3.885,1.57],[14.945,3.62],[0.225,15.17],[-14.945,0],[0.225,-15.17],[13.735,-6.87]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.289,660.091]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-1.63,6.63],[0,0],[0,0],[5.9,0],[0,-8.38],[-8.38,0]],"o":[[0,0],[0,0],[-2.51,-4.93],[-8.38,0],[0,8.38],[7.13,0]],"v":[[14.415,11.505],[3.355,9.455],[13.205,1.015],[-0.305,-7.285],[-15.475,7.885],[-0.305,23.055]],"c":true},"a":0}},{"ty":"sh","nm":"P","ind":1,"ks":{"k":{"i":[[0,0],[19.33,-6.9],[6.71,0],[4.35,1.27],[0,0],[0,0],[0,0],[-5.68,-7.01],[0,0]],"o":[[0,0],[-4.55,1.64],[-6.31,0],[-21.32,-6.2],[0,0],[0,0],[31.09,-30.92],[0,0],[0,0]],"v":[[37.685,2.315],[16.585,27.325],[-0.205,29.965],[-16.105,27.935],[-37.425,3.455],[-37.685,3.315],[-36.355,0.955],[36.715,0.725],[36.755,0.705]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.819,652.207]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-5.76,-6.9],[0,0],[0,0],[0,0]],"v":[[9.625,6.435],[9.625,7.095],[-2.985,7.095],[-3.465,7.505],[-9.625,-7.505],[9.625,-7.505],[9.625,-6.835]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[773.419,727.227]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[11.775,6.64],[11.775,7.3],[-11.775,7.3],[-11.775,6.64],[-11.775,-6.63],[-11.775,-7.3],[-1.165,-7.3],[11.775,-7.3],[11.775,-6.63]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[794.819,727.022]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[6.02,-6.92],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-8.63,-7.565],[8.63,-7.565],[2,7.565],[1.33,7.035],[-8.63,7.035],[-8.63,6.375],[-8.63,-6.895]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[815.224,727.286]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[22.61,19.875],[22.55,19.905],[-21.91,19.905],[-22.61,19.515],[-0.41,-19.905]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[793.004,608.906]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[31.09,-30.92],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-5.68,-7.01],[0,0],[0,0],[0,0],[0,0]],"v":[[22.595,-8.92],[36.555,15.21],[36.515,15.23],[-36.555,15.46],[-22.625,-9.28],[-21.925,-8.89],[22.535,-8.89]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[793.019,637.702]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-21.32,-6.2],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[25.075,-0.955],[16.015,25.195],[16.015,25.575],[-24.345,25.575],[-25.075,25.165],[3.495,-25.575],[3.755,-25.435]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[751.639,681.097]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.76,-6.9],[-12.13,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[4.26,5.11],[0,0],[0,0]],"v":[[46.78,15.505],[46.78,22.805],[46.78,23.505],[-46.78,23.505],[-20.31,-23.505],[-19.58,-23.095],[20.78,-23.095],[46.78,-23.095],[46.78,-22.685],[46.78,-10.045],[36.17,-10.045],[16.92,-10.045],[23.08,4.965],[46.65,14.515],[46.76,14.515]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[746.874,729.767]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[19.33,-6.9],[0,0]],"v":[[25.515,25.645],[24.765,26.075],[-14.895,26.075],[-14.895,25.925],[-25.275,-0.425],[-25.515,-1.065],[-4.415,-26.075]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[834.919,680.597]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-6.31,0],[-4.55,1.64],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[4.35,1.27],[6.71,0],[0,0],[0,0]],"v":[[26.185,13.42],[26.185,13.57],[-0.185,13.57],[-26.185,13.57],[-26.185,13.19],[-17.125,-12.96],[-1.225,-10.93],[15.565,-13.57],[15.805,-12.93]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[793.839,693.102]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.38,5.04],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[11.97,-0.03],[6.02,-6.92],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[19.795,-23.515],[47.005,23.515],[-46.985,23.515],[-46.985,22.815],[-46.985,15.515],[-47.005,14.525],[-23.415,5.095],[-16.785,-10.035],[-34.045,-10.035],[-46.985,-10.035],[-46.985,-22.675],[-46.985,-23.085],[-20.615,-23.085],[19.045,-23.085]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[840.639,729.757]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[11.97,-0.03],[0,0],[4.26,5.11],[0,0],[0,0],[0,0]],"o":[[0,0],[-4.38,5.04],[0,0],[-12.13,0],[0,0],[0,0],[0,0],[0,0]],"v":[[22.965,-4.98],[23.635,-4.45],[0.045,4.98],[-0.065,4.98],[-23.635,-4.57],[-23.155,-4.98],[-10.545,-4.98],[13.005,-4.98]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[793.589,739.302]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":78,"op":95,"st":12,"parent":4,"tt":2},{"ind":24,"ty":0,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[962.5,541.5,0]},"a":{"a":0,"k":[962.5,541.5,0]},"s":{"a":0,"k":[100,100,100]}},"ip":66,"op":81,"st":66,"refId":"comp_6","h":1083,"w":1925},{"ind":25,"ty":0,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[962.5,541.5,0]},"a":{"a":0,"k":[962.5,541.5,0]},"s":{"a":0,"k":[100,100,100]}},"ip":80,"op":95,"st":65,"refId":"comp_6","h":1083,"w":1925},{"ind":26,"ty":0,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[962.5,541.5,0]},"a":{"a":0,"k":[962.5,541.5,0]},"s":{"a":0,"k":[100,100,100]}},"ip":33,"op":63,"st":33,"refId":"comp_6","h":1083,"w":1925},{"ind":27,"ty":0,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[962.5,541.5,0]},"a":{"a":0,"k":[962.5,541.5,0]},"s":{"a":0,"k":[100,100,100]}},"ip":0,"op":30,"st":0,"refId":"comp_6","h":1083,"w":1925},{"ind":28,"ty":4,"nm":"s","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-339.29,-94.255,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[-100,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[491.024,827.341],[491.034,827.341],[572.824,827.341]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[455.244,799.401],[572.824,799.401]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[437.134,777.062],[437.144,777.062],[572.824,777.062]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[421.444,747.612],[572.824,747.612]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[414.524,726.642],[572.824,726.642]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[486.814,548.082],[572.824,548.082]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[452.634,577.052],[572.824,577.052]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[434.964,599.802],[572.824,599.802]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[421.444,626.812],[572.824,626.812]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[414.524,650.121],[572.824,650.121]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[410.144,676.802],[572.824,676.802]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[410.144,700.901],[572.824,700.901]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[23.89,13.78]],"o":[[0,0],[-29.56,0],[0,0]],"v":[[40.895,10.83],[40.275,10.83],[-40.895,-10.83]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[531.929,838.172]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[10.53,10.89],[5.37,7.98]],"o":[[-13.21,-7.62],[-6.67,-6.89],[0,0]],"v":[[26.94,25.14],[-8.84,-2.8],[-26.94,-25.14]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[464.084,802.202]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[4.23,10.4],[1.84,7.2],[0.79,8.8],[0,4.92],[-0.19,3.14],[-2,8.71],[-2.98,7.52],[-5.38,8.51],[-6.5,7.11],[-12.82,7.94],[-31.38,0],[0,0]],"o":[[-6.19,-9.19],[-2.77,-6.77],[-2.13,-8.34],[-0.42,-4.81],[0,-3.19],[0.52,-9.19],[1.83,-8.03],[3.74,-9.48],[5.17,-8.19],[10.13,-11.08],[24.85,-15.39],[0,0],[0,0]],"v":[[-54.02,126.745],[-69.71,97.295],[-76.63,76.325],[-81.03,50.585],[-81.67,35.975],[-81.39,26.465],[-77.58,-0.415],[-70.35,-23.765],[-56.63,-50.795],[-39.08,-73.785],[-4.49,-102.475],[81.05,-126.745],[81.67,-126.745]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[491.154,650.317]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-31.38,0]],"o":[[0,0],[0,0],[0,0],[24.85,-15.39],[0,0]],"v":[[43.08,-12.255],[43.08,12.255],[-42.93,12.255],[-43.08,12.015],[42.46,-12.255]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[529.744,535.826]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-12.82,7.94],[0,0]],"o":[[0,0],[0,0],[0,0],[10.13,-11.08],[0,0],[0,0]],"v":[[60.375,-14.365],[60.375,14.605],[-59.815,14.605],[-60.375,14.085],[-25.785,-14.605],[-25.635,-14.365]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[512.449,562.447]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-6.5,7.11],[0,0]],"o":[[0,0],[0,0],[0,0],[5.17,-8.19],[0,0],[0,0]],"v":[[69.15,-11.115],[69.15,11.635],[-68.71,11.635],[-69.15,11.355],[-51.6,-11.635],[-51.04,-11.115]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[503.674,588.167]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-5.38,8.51],[0,0]],"o":[[0,0],[0,0],[0,0],[3.74,-9.48],[0,0],[0,0]],"v":[[76.01,-13.365],[76.01,13.645],[-75.37,13.645],[-76.01,13.385],[-62.29,-13.645],[-61.85,-13.365]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[496.814,613.167]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2.98,7.52],[0,0]],"o":[[0,0],[0,0],[0,0],[1.83,-8.03],[0,0],[0,0]],"v":[[79.625,-11.525],[79.625,11.785],[-78.675,11.785],[-79.625,11.565],[-72.395,-11.785],[-71.755,-11.525]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[493.199,638.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2,8.71],[0,0]],"o":[[0,0],[0,0],[0,0],[0.52,-9.19],[0,0],[0,0]],"v":[[81.53,-13.23],[81.53,13.45],[-81.15,13.45],[-81.53,13.43],[-77.72,-13.45],[-76.77,-13.23]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[491.294,663.352]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,4.92],[-0.19,3.14],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.42,-4.81],[0,-3.19],[0,0],[0,0]],"v":[[81.67,-12.04],[81.67,12.06],[-81.01,12.06],[-81.03,12.06],[-81.67,-2.55],[-81.39,-12.06],[-81.01,-12.04]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[491.154,688.842]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0.79,8.8],[0,0]],"o":[[0,0],[0,0],[-2.13,-8.34],[0,0],[0,0]],"v":[[81.35,-12.87],[81.35,12.87],[-76.95,12.87],[-81.35,-12.87],[-81.33,-12.87]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[491.474,713.771]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[1.84,7.2]],"o":[[0,0],[0,0],[-2.77,-6.77],[0,0]],"v":[[79.15,-10.485],[79.15,10.485],[-72.23,10.485],[-79.15,-10.485]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[493.674,737.127]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[4.23,10.4]],"o":[[0,0],[0,0],[0,0],[-6.19,-9.19],[0,0]],"v":[[75.69,-14.725],[75.69,14.725],[-59.99,14.725],[-60,14.725],[-75.69,-14.725]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[497.134,762.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[5.37,7.98]],"o":[[0,0],[0,0],[-6.67,-6.89],[0,0]],"v":[[67.84,-11.17],[67.84,11.17],[-49.74,11.17],[-67.84,-11.17]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[504.984,788.232]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[10.53,10.89]],"o":[[0,0],[0,0],[0,0],[-13.21,-7.62],[0,0]],"v":[[58.79,-13.97],[58.79,13.97],[-23,13.97],[-23.01,13.97],[-58.79,-13.97]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[514.034,813.371]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[23.89,13.78]],"o":[[0,0],[0,0],[-29.56,0],[0,0]],"v":[[40.895,-10.83],[40.895,10.83],[40.275,10.83],[-40.895,-10.83]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[531.929,838.172]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":0,"op":98,"st":0,"parent":5},{"ind":29,"ty":4,"nm":"s","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[440.71,-94.255,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[491.024,827.341],[491.034,827.341],[572.824,827.341]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[455.244,799.401],[572.824,799.401]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[437.134,777.062],[437.144,777.062],[572.824,777.062]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[421.444,747.612],[572.824,747.612]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[414.524,726.642],[572.824,726.642]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[486.814,548.082],[572.824,548.082]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[452.634,577.052],[572.824,577.052]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[434.964,599.802],[572.824,599.802]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[421.444,626.812],[572.824,626.812]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[414.524,650.121],[572.824,650.121]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[410.144,676.802],[572.824,676.802]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[410.144,700.901],[572.824,700.901]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[23.89,13.78]],"o":[[0,0],[-29.56,0],[0,0]],"v":[[40.895,10.83],[40.275,10.83],[-40.895,-10.83]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[531.929,838.172]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[10.53,10.89],[5.37,7.98]],"o":[[-13.21,-7.62],[-6.67,-6.89],[0,0]],"v":[[26.94,25.14],[-8.84,-2.8],[-26.94,-25.14]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[464.084,802.202]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[4.23,10.4],[1.84,7.2],[0.79,8.8],[0,4.92],[-0.19,3.14],[-2,8.71],[-2.98,7.52],[-5.38,8.51],[-6.5,7.11],[-12.82,7.94],[-31.38,0],[0,0]],"o":[[-6.19,-9.19],[-2.77,-6.77],[-2.13,-8.34],[-0.42,-4.81],[0,-3.19],[0.52,-9.19],[1.83,-8.03],[3.74,-9.48],[5.17,-8.19],[10.13,-11.08],[24.85,-15.39],[0,0],[0,0]],"v":[[-54.02,126.745],[-69.71,97.295],[-76.63,76.325],[-81.03,50.585],[-81.67,35.975],[-81.39,26.465],[-77.58,-0.415],[-70.35,-23.765],[-56.63,-50.795],[-39.08,-73.785],[-4.49,-102.475],[81.05,-126.745],[81.67,-126.745]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[491.154,650.317]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-31.38,0]],"o":[[0,0],[0,0],[0,0],[24.85,-15.39],[0,0]],"v":[[43.08,-12.255],[43.08,12.255],[-42.93,12.255],[-43.08,12.015],[42.46,-12.255]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[529.744,535.826]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-12.82,7.94],[0,0]],"o":[[0,0],[0,0],[0,0],[10.13,-11.08],[0,0],[0,0]],"v":[[60.375,-14.365],[60.375,14.605],[-59.815,14.605],[-60.375,14.085],[-25.785,-14.605],[-25.635,-14.365]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[512.449,562.447]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-6.5,7.11],[0,0]],"o":[[0,0],[0,0],[0,0],[5.17,-8.19],[0,0],[0,0]],"v":[[69.15,-11.115],[69.15,11.635],[-68.71,11.635],[-69.15,11.355],[-51.6,-11.635],[-51.04,-11.115]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[503.674,588.167]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-5.38,8.51],[0,0]],"o":[[0,0],[0,0],[0,0],[3.74,-9.48],[0,0],[0,0]],"v":[[76.01,-13.365],[76.01,13.645],[-75.37,13.645],[-76.01,13.385],[-62.29,-13.645],[-61.85,-13.365]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[496.814,613.167]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2.98,7.52],[0,0]],"o":[[0,0],[0,0],[0,0],[1.83,-8.03],[0,0],[0,0]],"v":[[79.625,-11.525],[79.625,11.785],[-78.675,11.785],[-79.625,11.565],[-72.395,-11.785],[-71.755,-11.525]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[493.199,638.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2,8.71],[0,0]],"o":[[0,0],[0,0],[0,0],[0.52,-9.19],[0,0],[0,0]],"v":[[81.53,-13.23],[81.53,13.45],[-81.15,13.45],[-81.53,13.43],[-77.72,-13.45],[-76.77,-13.23]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[491.294,663.352]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,4.92],[-0.19,3.14],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.42,-4.81],[0,-3.19],[0,0],[0,0]],"v":[[81.67,-12.04],[81.67,12.06],[-81.01,12.06],[-81.03,12.06],[-81.67,-2.55],[-81.39,-12.06],[-81.01,-12.04]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[491.154,688.842]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0.79,8.8],[0,0]],"o":[[0,0],[0,0],[-2.13,-8.34],[0,0],[0,0]],"v":[[81.35,-12.87],[81.35,12.87],[-76.95,12.87],[-81.35,-12.87],[-81.33,-12.87]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[491.474,713.771]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[1.84,7.2]],"o":[[0,0],[0,0],[-2.77,-6.77],[0,0]],"v":[[79.15,-10.485],[79.15,10.485],[-72.23,10.485],[-79.15,-10.485]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[493.674,737.127]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[4.23,10.4]],"o":[[0,0],[0,0],[0,0],[-6.19,-9.19],[0,0]],"v":[[75.69,-14.725],[75.69,14.725],[-59.99,14.725],[-60,14.725],[-75.69,-14.725]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[497.134,762.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[5.37,7.98]],"o":[[0,0],[0,0],[-6.67,-6.89],[0,0]],"v":[[67.84,-11.17],[67.84,11.17],[-49.74,11.17],[-67.84,-11.17]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[504.984,788.232]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[10.53,10.89]],"o":[[0,0],[0,0],[0,0],[-13.21,-7.62],[0,0]],"v":[[58.79,-13.97],[58.79,13.97],[-23,13.97],[-23.01,13.97],[-58.79,-13.97]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[514.034,813.371]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[23.89,13.78]],"o":[[0,0],[0,0],[-29.56,0],[0,0]],"v":[[40.895,-10.83],[40.895,10.83],[40.275,10.83],[-40.895,-10.83]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[531.929,838.172]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":0,"op":98,"st":0,"parent":6},{"ind":30,"ty":4,"nm":"s","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[421.71,-94.255,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[569.914,827.341],[610.524,827.341],[610.564,827.341]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,799.401],[610.244,799.401]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,777.062],[610.444,777.062]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,747.612],[610.244,747.612]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,726.642],[610.364,726.642]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,700.901],[610.244,700.901]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,676.781],[610.244,676.781]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[569.914,650.121],[610.234,650.121],[610.244,650.121]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,626.812],[609.914,626.812]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,599.802],[609.914,599.802]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,577.052],[609.744,577.052]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[569.914,548.082],[609.744,548.082]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.27,-162.675],[-0.23,-138.205],[-0.18,-109.235],[-0.14,-86.485],[-0.1,-59.475],[-0.06,-36.165],[-0.02,-9.505],[0.02,14.615],[0.07,40.355],[0.1,61.325],[0.15,90.775],[0.19,113.115],[0.23,141.055],[0.27,162.675]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[610.294,686.286]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[610.564,848.961],[569.914,848.961]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[610.024,523.612],[569.914,523.612]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[569.914,523.612],[569.914,548.082],[569.914,577.052],[569.914,599.802],[569.914,626.812],[569.914,650.122],[569.914,676.781],[569.914,700.901],[569.914,726.641],[569.914,747.612],[569.914,777.062],[569.914,799.401],[569.914,827.342],[569.914,848.962],[569.914,849.002]],"c":false},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.035,-12.235],[20.075,12.235],[19.755,12.235],[-20.075,12.235],[-20.075,-12.235]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[589.989,535.847]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.05,-14.485],[20.1,14.485],[19.73,14.485],[-20.1,14.485],[-20.1,-14.485],[19.73,-14.485]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.014,562.567]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.08,-11.375],[20.12,11.375],[19.88,11.375],[-20.12,11.375],[-20.12,-11.375],[19.71,-11.375]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.034,588.427]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.1,-13.505],[20.14,13.505],[19.86,13.505],[-20.14,13.505],[-20.14,-13.505],[19.86,-13.505]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.054,613.307]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.12,-11.655],[20.16,11.655],[-20.16,11.655],[-20.16,-11.655],[19.84,-11.655]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.074,638.467]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.14,-13.33],[20.18,13.33],[20.15,13.33],[-20.18,13.33],[-20.18,-13.33]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.094,663.451]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.16,-12.06],[20.2,12.06],[20.13,12.06],[-20.2,12.06],[-20.2,-12.06],[20.13,-12.06]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.114,688.841]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.175,-12.87],[20.225,12.87],[-20.225,12.87],[-20.225,-12.87],[20.105,-12.87]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.139,713.771]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.21,-10.485],[20.24,10.485],[20.09,10.485],[-20.24,10.485],[-20.24,-10.485]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.154,737.127]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.215,-14.725],[20.265,14.725],[-20.265,14.725],[-20.265,-14.725],[20.065,-14.725]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.179,762.337]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.245,-11.17],[20.285,11.17],[20.045,11.17],[-20.285,11.17],[-20.285,-11.17]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.199,788.232]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.265,-13.97],[20.305,13.97],[-20.305,13.97],[-20.305,-13.97],[20.025,-13.97]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.219,813.371]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[20.285,-10.81],[20.325,10.81],[-20.325,10.81],[-20.325,-10.81]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.501960813999,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[590.239,838.151]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":0,"op":98,"st":0,"parent":7}]},{"id":"comp_5","layers":[{"ind":1,"ty":3,"nm":"o","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[784,684,0],"ti":[-3,0,0],"to":[1.167,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":14,"s":[791,684,0],"ti":[-1.833,0,0],"to":[3,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.333},"t":29,"s":[802,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":30,"s":[802,684,0],"ti":[3,0,0],"to":[-3,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":32,"s":[784,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":33,"s":[784,684,0],"ti":[-3,0,0],"to":[1.167,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":47,"s":[791,684,0],"ti":[-1.833,0,0],"to":[3,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.333},"t":62,"s":[802,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":63,"s":[802,684,0],"ti":[3,0,0],"to":[-3,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":65,"s":[784,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":66,"s":[784,684,0],"ti":[-3,0,0],"to":[1.167,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":80,"s":[791,684,0],"ti":[-1.833,0,0],"to":[3,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":94,"s":[802,684,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":95,"s":[802,684,0],"ti":[3,0,0],"to":[-3,0,0]},{"t":97,"s":[784,684,0]}],"a":1},"a":{"a":0,"k":[50,49,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":30,"s":[7,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":32,"s":[7,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":33,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":47,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":62,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":63,"s":[7,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":65,"s":[7,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":66,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":80,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":94,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":95,"s":[7,100,100]},{"t":97,"s":[7,100,100]}],"a":1}},"ip":0,"op":99,"st":0},{"ind":2,"ty":4,"nm":"S","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[218.62,-94,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"E","bm":0,"it":[{"ty":"el","nm":"E","d":1,"p":{"a":0,"k":[0,0]},"s":{"a":0,"k":[297,297]}},{"ty":"st","nm":"S","bm":0,"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":0},"c":{"a":0,"k":[1,1,1,1]}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.819607913494,0.607843160629,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-170,145]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":0,"op":99,"st":-29,"parent":1}]},{"id":"comp_6","layers":[{"ind":1,"ty":3,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"k":[{"i":{"x":0.568,"y":1},"o":{"x":0.167,"y":0},"t":0,"s":[801,684,0],"ti":[0.36,0,0],"to":[-0.228,0,0]},{"i":{"x":0.638,"y":0.751},"o":{"x":0.284,"y":0.181},"t":1,"s":[796.609,684,0],"ti":[0.695,0,0],"to":[-0.515,0,0]},{"i":{"x":0.698,"y":1},"o":{"x":0.287,"y":0},"t":3,"s":[798.768,684,0],"ti":[1.78,0,0],"to":[-2.372,0,0]},{"i":{"x":0.698,"y":1},"o":{"x":0.3,"y":0},"t":14,"s":[791,684,0],"ti":[1.35,0,0],"to":[-1.253,0,0]},{"i":{"x":0.734,"y":0.902},"o":{"x":0.374,"y":0.143},"t":25,"s":[787.13,684,0],"ti":[0.324,0,0],"to":[-0.77,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.424,"y":0},"t":28,"s":[791.402,684,0],"ti":[-0.437,0,0],"to":[-0.317,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[785,684,0],"ti":[-1,0,0],"to":[1.667,0,0]},{"i":{"x":0.568,"y":1},"o":{"x":0.167,"y":0},"t":33,"s":[801,684,0],"ti":[0.666,0,0],"to":[0.247,0,0]},{"i":{"x":0.638,"y":0.845},"o":{"x":0.284,"y":0.113},"t":34,"s":[794.759,684,0],"ti":[0.744,0,0],"to":[-0.476,0,0]},{"i":{"x":0.698,"y":1},"o":{"x":0.287,"y":0},"t":36,"s":[798.888,684,0],"ti":[1.537,0,0],"to":[-2.43,0,0]},{"i":{"x":0.717,"y":1},"o":{"x":0.303,"y":0},"t":47,"s":[791,684,0],"ti":[1.383,0,0],"to":[-1.447,0,0]},{"i":{"x":0.715,"y":0.898},"o":{"x":0.361,"y":0.139},"t":59,"s":[786.536,684,0],"ti":[0.235,0,0],"to":[-0.506,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.432,"y":0},"t":61,"s":[789.39,684,0],"ti":[-0.432,0,0],"to":[-0.306,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[785,684,0],"ti":[-1,0,0],"to":[1.667,0,0]},{"i":{"x":0.575,"y":0.734},"o":{"x":0.167,"y":0.119},"t":66,"s":[796,684,0],"ti":[1.785,0,0],"to":[0.423,0,0]},{"i":{"x":0.698,"y":1},"o":{"x":0.287,"y":0},"t":69,"s":[798.888,684,0],"ti":[1.537,0,0],"to":[-2.43,0,0]},{"i":{"x":0.713,"y":1},"o":{"x":0.302,"y":0},"t":80,"s":[791,684,0],"ti":[1.161,0,0],"to":[-1.664,0,0]},{"i":{"x":0.716,"y":0.926},"o":{"x":0.362,"y":0.103},"t":91,"s":[787.14,684,0],"ti":[0.311,0,0],"to":[-0.42,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.432,"y":0},"t":93,"s":[791.038,684,0],"ti":[-0.432,0,0],"to":[-0.207,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":94,"s":[780,684,0],"ti":[-1,0,0],"to":[1.667,0,0]},{"i":{"x":0.575,"y":0.734},"o":{"x":0.167,"y":0.119},"t":98,"s":[796,684,0],"ti":[1.785,0,0],"to":[0.423,0,0]},{"i":{"x":0.698,"y":1},"o":{"x":0.287,"y":0},"t":101,"s":[798.888,684,0],"ti":[1.537,0,0],"to":[-2.43,0,0]},{"t":112,"s":[791,684,0]}],"a":1},"a":{"a":0,"k":[50,49,0]},"s":{"k":[{"i":{"x":[0.61,0.61,0.61],"y":[0.387,1,1]},"o":{"x":[0.273,0.273,0.273],"y":[0.338,0,0]},"t":0,"s":[22,100,100]},{"i":{"x":[0.622,0.622,0.622],"y":[0.663,1,1]},"o":{"x":[0.283,0.283,0.283],"y":[0.239,0,0]},"t":1,"s":[26,100,100]},{"i":{"x":[0.698,0.698,0.698],"y":[1,1,1]},"o":{"x":[0.287,0.287,0.287],"y":[0.418,0,0]},"t":3,"s":[43.302,100,100]},{"i":{"x":[0.698,0.698,0.698],"y":[0.551,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":14,"s":[100,100,100]},{"i":{"x":[0.73,0.73,0.73],"y":[0.785,1,1]},"o":{"x":[0.387,0.387,0.387],"y":[0.325,0,0]},"t":25,"s":[48.77,100,100]},{"i":{"x":[0.724,0.724,0.724],"y":[0.299,1,1]},"o":{"x":[0.387,0.387,0.387],"y":[1.244,0,0]},"t":28,"s":[24.045,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[22,100,100]},{"i":{"x":[0.61,0.61,0.61],"y":[0.215,1,1]},"o":{"x":[0.273,0.273,0.273],"y":[0.433,0,0]},"t":33,"s":[22,100,100]},{"i":{"x":[0.622,0.622,0.622],"y":[0.682,1,1]},"o":{"x":[0.283,0.283,0.283],"y":[0.226,0,0]},"t":34,"s":[25.515,100,100]},{"i":{"x":[0.698,0.698,0.698],"y":[1,1,1]},"o":{"x":[0.287,0.287,0.287],"y":[0.418,0,0]},"t":36,"s":[43.302,100,100]},{"i":{"x":[0.717,0.717,0.717],"y":[0.592,1,1]},"o":{"x":[0.303,0.303,0.303],"y":[0,0,0]},"t":47,"s":[100,100,100]},{"i":{"x":[0.716,0.716,0.716],"y":[0.79,1,1]},"o":{"x":[0.377,0.377,0.377],"y":[0.297,0,0]},"t":59,"s":[41.803,100,100]},{"i":{"x":[0.724,0.724,0.724],"y":[0.299,1,1]},"o":{"x":[0.387,0.387,0.387],"y":[1.244,0,0]},"t":61,"s":[24.045,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":62,"s":[22,100,100]},{"i":{"x":[0.575,0.575,0.575],"y":[0.607,1,1]},"o":{"x":[0.223,0.223,0.223],"y":[0.154,0,0]},"t":66,"s":[19,100,100]},{"i":{"x":[0.698,0.698,0.698],"y":[1,1,1]},"o":{"x":[0.287,0.287,0.287],"y":[0.418,0,0]},"t":69,"s":[43.302,100,100]},{"i":{"x":[0.713,0.713,0.713],"y":[0.582,1,1]},"o":{"x":[0.302,0.302,0.302],"y":[0,0,0]},"t":80,"s":[100,100,100]},{"i":{"x":[0.717,0.717,0.717],"y":[0.774,1,1]},"o":{"x":[0.378,0.378,0.378],"y":[0.318,0,0]},"t":91,"s":[43.302,100,100]},{"i":{"x":[0.724,0.724,0.724],"y":[1,1,1]},"o":{"x":[0.39,0.39,0.39],"y":[0.785,0,0]},"t":93,"s":[25.515,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":94,"s":[22,100,100]},{"i":{"x":[0.575,0.575,0.575],"y":[0.607,1,1]},"o":{"x":[0.223,0.223,0.223],"y":[0.154,0,0]},"t":98,"s":[19,100,100]},{"i":{"x":[0.698,0.698,0.698],"y":[1,1,1]},"o":{"x":[0.287,0.287,0.287],"y":[0.418,0,0]},"t":101,"s":[43.302,100,100]},{"t":112,"s":[100,100,100]}],"a":1}},"ip":0,"op":99,"st":0},{"ind":2,"ty":3,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[781,684,0],"ti":[-3,0,0],"to":[1.667,0,0]},{"i":{"x":0.833,"y":0.839},"o":{"x":0.333,"y":0},"t":14,"s":[791,684,0],"ti":[1.667,0,0],"to":[3,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[802,684,0],"ti":[1.833,0,0],"to":[-1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.159},"t":33,"s":[781,684,0],"ti":[-3,0,0],"to":[-1.833,0,0]},{"i":{"x":0.833,"y":0.839},"o":{"x":0.333,"y":0},"t":47,"s":[791,684,0],"ti":[1.667,0,0],"to":[3,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[802,684,0],"ti":[1.833,0,0],"to":[-1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.159},"t":66,"s":[781,684,0],"ti":[-2.667,0,0],"to":[-1.833,0,0]},{"i":{"x":0.833,"y":0.85},"o":{"x":0.333,"y":0},"t":80,"s":[791,684,0],"ti":[1.667,0,0],"to":[2.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":94,"s":[797,684,0],"ti":[1,0,0],"to":[-1.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.165},"t":98,"s":[781,684,0],"ti":[-1.667,0,0],"to":[-1,0,0]},{"t":112,"s":[791,684,0]}],"a":1},"a":{"a":0,"k":[50,49,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":33,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":47,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":62,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":66,"s":[22,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":80,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":94,"s":[22,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":98,"s":[22,100,100]},{"t":112,"s":[100,100,100]}],"a":1}},"ip":0,"op":99,"st":0},{"ind":3,"ty":4,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,-71.88],[71.88,0],[0,71.88],[-71.88,0]],"o":[[0,71.88],[-71.88,0],[0,-71.88],[71.88,0]],"v":[[130.15,0],[0,130.15],[-130.15,0],[0,-130.15]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-71.88,0],[0,-71.88],[71.88,0],[0,71.88]],"o":[[71.88,0],[0,71.88],[-71.88,0],[0,-71.88]],"v":[[0,-130.15],[130.15,0],[0,130.15],[-130.15,0]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":8,"op":19,"st":0,"parent":1},{"ind":4,"ty":4,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,-71.88],[71.88,0],[0,71.88],[-71.88,0]],"o":[[0,71.88],[-71.88,0],[0,-71.88],[71.88,0]],"v":[[130.15,0],[0,130.15],[-130.15,0],[0,-130.15]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-71.88,0],[0,-71.88],[71.88,0],[0,71.88]],"o":[[71.88,0],[0,71.88],[-71.88,0],[0,-71.88]],"v":[[0,-130.15],[130.15,0],[0,130.15],[-130.15,0]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":39,"op":62,"st":8,"parent":1},{"ind":5,"ty":4,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,-71.88],[71.88,0],[0,71.88],[-71.88,0]],"o":[[0,71.88],[-71.88,0],[0,-71.88],[71.88,0]],"v":[[130.15,0],[0,130.15],[-130.15,0],[0,-130.15]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-71.88,0],[0,-71.88],[71.88,0],[0,71.88]],"o":[[71.88,0],[0,71.88],[-71.88,0],[0,-71.88]],"v":[[0,-130.15],[130.15,0],[0,130.15],[-130.15,0]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":66,"op":94,"st":6,"parent":1},{"ind":6,"ty":4,"nm":"m","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"k":[{"i":{"x":0.622,"y":0.8},"o":{"x":0.167,"y":0.167},"t":0,"s":[962,541,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.35,"y":0},"t":5,"s":[1066.402,541,0],"ti":[122.709,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":6,"s":[779.001,-1181,0],"ti":[122.709,0,0],"to":[-123.126,0,0]},{"i":{"x":0.65,"y":1},"o":{"x":0.167,"y":0},"t":8,"s":[779.001,-1181,0],"ti":[0,0,0],"to":[-123.126,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.378,"y":0.2},"t":9,"s":[512.153,541,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[625,541,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.622,"y":0.8},"o":{"x":0.167,"y":0.167},"t":15,"s":[962,541,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.35,"y":0},"t":20,"s":[1066.402,541,0],"ti":[122.709,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":21,"s":[779.001,-1181,0],"ti":[122.709,0,0],"to":[-123.126,0,0]},{"i":{"x":0.65,"y":1},"o":{"x":0.167,"y":0},"t":23,"s":[779.001,-1181,0],"ti":[0,0,0],"to":[-123.126,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.378,"y":0.2},"t":24,"s":[512.153,541,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[625,541,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.622,"y":0.8},"o":{"x":0.167,"y":0.167},"t":30,"s":[962,541,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.35,"y":0},"t":35,"s":[1066.402,541,0],"ti":[122.709,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":36,"s":[779.001,-1181,0],"ti":[122.709,0,0],"to":[-123.126,0,0]},{"i":{"x":0.65,"y":1},"o":{"x":0.167,"y":0},"t":38,"s":[779.001,-1181,0],"ti":[0,0,0],"to":[-123.126,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.378,"y":0.2},"t":39,"s":[512.153,541,0],"ti":[0,0,0],"to":[0,0,0]},{"t":44,"s":[625,541,0]}],"a":1},"a":{"a":0,"k":[0,0,0]},"s":{"k":[{"i":{"x":[0.622,0.622,0.622],"y":[1,1,1]},"o":{"x":[0.169,0.169,0.169],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.35,0.35,0.35],"y":[0,0,0]},"t":5,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":6,"s":[0,0,100]},{"i":{"x":[0.65,0.65,0.65],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":8,"s":[0,0,100]},{"i":{"x":[0.831,0.831,0.831],"y":[1,1,1]},"o":{"x":[0.378,0.378,0.378],"y":[0,0,0]},"t":9,"s":[-100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[-100,100,100]},{"i":{"x":[0.622,0.622,0.622],"y":[1,1,1]},"o":{"x":[0.169,0.169,0.169],"y":[0,0,0]},"t":15,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.35,0.35,0.35],"y":[0,0,0]},"t":20,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":21,"s":[0,0,100]},{"i":{"x":[0.65,0.65,0.65],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":23,"s":[0,0,100]},{"i":{"x":[0.831,0.831,0.831],"y":[1,1,1]},"o":{"x":[0.378,0.378,0.378],"y":[0,0,0]},"t":24,"s":[-100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[-100,100,100]},{"i":{"x":[0.622,0.622,0.622],"y":[1,1,1]},"o":{"x":[0.169,0.169,0.169],"y":[0,0,0]},"t":30,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.35,0.35,0.35],"y":[0,0,0]},"t":35,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":36,"s":[0,0,100]},{"i":{"x":[0.65,0.65,0.65],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":38,"s":[0,0,100]},{"i":{"x":[0.831,0.831,0.831],"y":[1,1,1]},"o":{"x":[0.378,0.378,0.378],"y":[0,0,0]},"t":39,"s":[-100,100,100]},{"t":44,"s":[-100,100,100]}],"a":1}},"shapes":[{"ty":"gr","nm":"S","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-26.336,-59.257],[1,-18],[36,-55],[0,0]],"o":[[0,0],[28,63],[-1,18],[-33.439,51.087],[0,0]],"v":[[-63.5,-32.5],[-171.5,-0.5],[-144.5,137.5],[-177.5,291.5],[-65.5,322.5]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[1,1,1,1]}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":0,"op":99,"st":0,"td":1},{"ind":7,"ty":4,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,-71.88],[71.88,0],[0,71.88],[-71.88,0]],"o":[[0,71.88],[-71.88,0],[0,-71.88],[71.88,0]],"v":[[130.15,0],[0,130.15],[-130.15,0],[0,-130.15]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-71.88,0],[0,-71.88],[71.88,0],[0,71.88]],"o":[[71.88,0],[0,71.88],[-71.88,0],[0,-71.88]],"v":[[0,-130.15],[130.15,0],[0,130.15],[-130.15,0]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":0,"op":99,"st":0,"parent":1,"tt":2},{"ind":8,"ty":4,"nm":"m","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"k":[{"i":{"x":0.622,"y":0.8},"o":{"x":0.167,"y":0.167},"t":0,"s":[962,541,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.35,"y":0},"t":5,"s":[1066.402,541,0],"ti":[122.709,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":6,"s":[779.001,-1181,0],"ti":[122.709,0,0],"to":[-123.126,0,0]},{"i":{"x":0.65,"y":1},"o":{"x":0.167,"y":0},"t":8,"s":[779.001,-1181,0],"ti":[0,0,0],"to":[-123.126,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.378,"y":0.2},"t":9,"s":[512.153,541,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[625,541,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.622,"y":0.8},"o":{"x":0.167,"y":0.167},"t":15,"s":[962,541,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.35,"y":0},"t":20,"s":[1066.402,541,0],"ti":[122.709,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":21,"s":[779.001,-1181,0],"ti":[122.709,0,0],"to":[-123.126,0,0]},{"i":{"x":0.65,"y":1},"o":{"x":0.167,"y":0},"t":23,"s":[779.001,-1181,0],"ti":[0,0,0],"to":[-123.126,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.378,"y":0.2},"t":24,"s":[512.153,541,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[625,541,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.622,"y":0.8},"o":{"x":0.167,"y":0.167},"t":30,"s":[962,541,0],"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.35,"y":0},"t":35,"s":[1066.402,541,0],"ti":[122.709,0,0],"to":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":36,"s":[779.001,-1181,0],"ti":[122.709,0,0],"to":[-123.126,0,0]},{"i":{"x":0.65,"y":1},"o":{"x":0.167,"y":0},"t":38,"s":[779.001,-1181,0],"ti":[0,0,0],"to":[-123.126,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.378,"y":0.2},"t":39,"s":[512.153,541,0],"ti":[0,0,0],"to":[0,0,0]},{"t":44,"s":[625,541,0]}],"a":1},"a":{"a":0,"k":[0,0,0]},"s":{"k":[{"i":{"x":[0.622,0.622,0.622],"y":[1,1,1]},"o":{"x":[0.169,0.169,0.169],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.35,0.35,0.35],"y":[0,0,0]},"t":5,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":6,"s":[0,0,100]},{"i":{"x":[0.65,0.65,0.65],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":8,"s":[0,0,100]},{"i":{"x":[0.831,0.831,0.831],"y":[1,1,1]},"o":{"x":[0.378,0.378,0.378],"y":[0,0,0]},"t":9,"s":[-100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[-100,100,100]},{"i":{"x":[0.622,0.622,0.622],"y":[1,1,1]},"o":{"x":[0.169,0.169,0.169],"y":[0,0,0]},"t":15,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.35,0.35,0.35],"y":[0,0,0]},"t":20,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":21,"s":[0,0,100]},{"i":{"x":[0.65,0.65,0.65],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":23,"s":[0,0,100]},{"i":{"x":[0.831,0.831,0.831],"y":[1,1,1]},"o":{"x":[0.378,0.378,0.378],"y":[0,0,0]},"t":24,"s":[-100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[-100,100,100]},{"i":{"x":[0.622,0.622,0.622],"y":[1,1,1]},"o":{"x":[0.169,0.169,0.169],"y":[0,0,0]},"t":30,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.35,0.35,0.35],"y":[0,0,0]},"t":35,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":36,"s":[0,0,100]},{"i":{"x":[0.65,0.65,0.65],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":38,"s":[0,0,100]},{"i":{"x":[0.831,0.831,0.831],"y":[1,1,1]},"o":{"x":[0.378,0.378,0.378],"y":[0,0,0]},"t":39,"s":[-100,100,100]},{"t":44,"s":[-100,100,100]}],"a":1}},"shapes":[{"ty":"gr","nm":"S","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,0],[-26.336,-59.257],[1,-18],[36,-55],[0,0]],"o":[[0,0],[28,63],[-1,18],[-33.439,51.087],[0,0]],"v":[[-63.5,-32.5],[-171.5,-0.5],[-144.5,137.5],[-177.5,291.5],[-65.5,322.5]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[1,1,1,1]}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":0,"op":99,"st":0,"td":1},{"ind":9,"ty":4,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,-71.88],[71.88,0],[0,71.88],[-71.88,0]],"o":[[0,71.88],[-71.88,0],[0,-71.88],[71.88,0]],"v":[[130.15,0],[0,130.15],[-130.15,0],[0,-130.15]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-71.88,0],[0,-71.88],[71.88,0],[0,71.88]],"o":[[71.88,0],[0,71.88],[-71.88,0],[0,-71.88]],"v":[[0,-130.15],[130.15,0],[0,130.15],[-130.15,0]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0.894117712975,0.737254917622,0.027450982481,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":0,"op":99,"st":0,"parent":1,"tt":2},{"ind":10,"ty":4,"nm":"i","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[220.71,-94.255,0]},"a":{"a":0,"k":[962.21,541.245,0]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[0,-82.035],[82.035,0],[0,82.035],[-82.035,0]],"o":[[0,82.035],[-82.035,0],[0,-82.035],[82.035,0]],"v":[[148.537,0],[0,148.537],[-148.537,0],[0,-148.537]],"c":true},"a":0}},{"ty":"st","nm":"S","bm":0,"lc":2,"lj":2,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.043137256056,0.105882361531,0.203921586275,1]}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0,0.129411771894,0.250980407,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.443,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","nm":"G","bm":0,"it":[{"ty":"sh","nm":"P","ind":0,"ks":{"k":{"i":[[-82.035,0],[0,-82.035],[82.035,0],[0,82.035]],"o":[[82.035,0],[0,82.035],[-82.035,0],[0,-82.035]],"v":[[0,-148.537],[148.537,0],[0,148.537],[-148.537,0]],"c":true},"a":0}},{"ty":"fl","nm":"F","bm":0,"c":{"a":0,"k":[0,0.129411771894,0.250980407,1]},"o":{"a":0,"k":100},"r":1},{"ty":"tr","o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[792.444,685.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"nm":"T","sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}],"ip":0,"op":99,"st":0,"parent":2}]}],"layers":[{"ind":1,"ty":0,"nm":"C","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[187.5,120,0]},"a":{"a":0,"k":[187.5,187.5,0]},"s":{"a":0,"k":[45,45,100]}},"ip":0,"op":98,"st":0,"refId":"comp_0","h":375,"w":375}],"markers":[]} \ No newline at end of file diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 47935e117e99..73434e9c60c9 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -14,6 +14,7 @@ export default { SETTINGS: { PREFERENCES: 'Settings_Preferences', WORKSPACES: 'Settings_Workspaces', + ABOUT: 'Settings_About', }, SIGN_IN_WITH_APPLE_DESKTOP: 'AppleSignInDesktop', SIGN_IN_WITH_GOOGLE_DESKTOP: 'GoogleSignInDesktop', diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators.js b/src/libs/Navigation/AppNavigator/ModalStackNavigators.js index 392781a777db..da3fcd044cb2 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators.js +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators.js @@ -513,7 +513,7 @@ const SettingsModalStackNavigator = createModalStackNavigator([ const SettingsAboutPage = require('../../../pages/settings/AboutPage/AboutPage').default; return SettingsAboutPage; }, - name: 'Settings_About', + name: SCREENS.SETTINGS.ABOUT, }, { getComponent: () => { diff --git a/src/libs/Navigation/linkingConfig.js b/src/libs/Navigation/linkingConfig.js index 11d21d6d005c..e14dc1e6d048 100644 --- a/src/libs/Navigation/linkingConfig.js +++ b/src/libs/Navigation/linkingConfig.js @@ -113,7 +113,7 @@ export default { path: ROUTES.SETTINGS_TIMEZONE_SELECT, exact: true, }, - Settings_About: { + [SCREENS.SETTINGS.ABOUT]: { path: ROUTES.SETTINGS_ABOUT, exact: true, }, diff --git a/src/pages/settings/AboutPage/AboutPage.js b/src/pages/settings/AboutPage/AboutPage.js index 70d597423da7..e789abe2ba82 100644 --- a/src/pages/settings/AboutPage/AboutPage.js +++ b/src/pages/settings/AboutPage/AboutPage.js @@ -1,6 +1,6 @@ import _ from 'underscore'; import React from 'react'; -import {ScrollView, View} from 'react-native'; +import {View} from 'react-native'; import DeviceInfo from 'react-native-device-info'; import Navigation from '../../../libs/Navigation/Navigation'; import ROUTES from '../../../ROUTES'; @@ -23,6 +23,7 @@ import * as Environment from '../../../libs/Environment/Environment'; import IllustratedHeaderPageLayout from '../../../components/IllustratedHeaderPageLayout'; import themeColors from '../../../styles/themes/default'; import * as LottieAnimations from '../../../components/LottieAnimations'; +import SCREENS from '../../../SCREENS'; const propTypes = { ...withLocalizePropTypes, @@ -81,10 +82,10 @@ function AboutPage(props) { ]; const overlayContent = () => ( - + v{Environment.isInternalTestBuild() ? `${pkg.version} PR:${CONST.PULL_REQUEST_NUMBER}${getFlavor()}` : `${pkg.version}${getFlavor()}`} @@ -96,52 +97,49 @@ function AboutPage(props) { title={props.translate('initialSettingsPage.about')} onBackButtonPress={() => Navigation.goBack(ROUTES.SETTINGS)} illustration={LottieAnimations.Coin} - shouldShowCloseButton - backgroundColor={themeColors.PAGE_BACKGROUND_COLORS[ROUTES.SETTINGS_ABOUT]} + backgroundColor={themeColors.PAGE_BACKGROUND_COLORS[SCREENS.SETTINGS.ABOUT]} overlayContent={overlayContent} > - - - - {props.translate('initialSettingsPage.aboutPage.description')} - - {_.map(menuItems, (item) => ( - item.action()} - shouldBlockSelection={Boolean(item.link)} - onSecondaryInteraction={!_.isEmpty(item.link) ? (e) => ReportActionContextMenu.showContextMenu(CONTEXT_MENU_TYPES.LINK, e, item.link, popoverAnchor) : undefined} - ref={(el) => (popoverAnchor = el)} - shouldShowRightIcon - /> - ))} + + + {props.translate('initialSettingsPage.aboutPage.description')} - - ( + item.action()} + shouldBlockSelection={Boolean(item.link)} + onSecondaryInteraction={!_.isEmpty(item.link) ? (e) => ReportActionContextMenu.showContextMenu(CONTEXT_MENU_TYPES.LINK, e, item.link, popoverAnchor) : undefined} + ref={(el) => (popoverAnchor = el)} + shouldShowRightIcon + /> + ))} + + + + {props.translate('initialSettingsPage.readTheTermsAndPrivacy.phrase1')}{' '} + - {props.translate('initialSettingsPage.readTheTermsAndPrivacy.phrase1')}{' '} - - {props.translate('initialSettingsPage.readTheTermsAndPrivacy.phrase2')} - {' '} - {props.translate('initialSettingsPage.readTheTermsAndPrivacy.phrase3')}{' '} - - {props.translate('initialSettingsPage.readTheTermsAndPrivacy.phrase4')} - - . - - - + {props.translate('initialSettingsPage.readTheTermsAndPrivacy.phrase2')} + {' '} + {props.translate('initialSettingsPage.readTheTermsAndPrivacy.phrase3')}{' '} + + {props.translate('initialSettingsPage.readTheTermsAndPrivacy.phrase4')} + + . + + ); } diff --git a/src/styles/styles.js b/src/styles/styles.js index 05cc2c963d5c..c4a3544ec9f4 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -410,6 +410,10 @@ const styles = (theme) => ({ color: theme.link, }, + textIvoryLight: { + color: theme.iconColorfulBackground, + }, + textUppercase: { textTransform: 'uppercase', }, @@ -3986,9 +3990,6 @@ const styles = (theme) => ({ height: 30, width: '100%', }, - versionTextColor: { - color: `${Colors.ivory}cc`, - }, }); // For now we need to export the styles function that takes the theme as an argument diff --git a/src/styles/themes/default.js b/src/styles/themes/default.js index ab786d727986..a0926ddff02d 100644 --- a/src/styles/themes/default.js +++ b/src/styles/themes/default.js @@ -91,7 +91,7 @@ darkTheme.PAGE_BACKGROUND_COLORS = { [ROUTES.SETTINGS_STATUS]: colors.green700, [ROUTES.I_KNOW_A_TEACHER]: colors.tangerine800, [ROUTES.SETTINGS_SECURITY]: colors.ice500, - [ROUTES.SETTINGS_ABOUT]: colors.yellow600, + [SCREENS.SETTINGS.ABOUT]: colors.yellow600, }; export default darkTheme; From 259219e8ff188a43009219c715a66ab2be0cd159 Mon Sep 17 00:00:00 2001 From: Pujan Date: Wed, 20 Sep 2023 16:13:13 +0530 Subject: [PATCH 005/583] minor change --- src/pages/settings/AboutPage/AboutPage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/settings/AboutPage/AboutPage.js b/src/pages/settings/AboutPage/AboutPage.js index e789abe2ba82..14ed1fbcd80d 100644 --- a/src/pages/settings/AboutPage/AboutPage.js +++ b/src/pages/settings/AboutPage/AboutPage.js @@ -82,7 +82,7 @@ function AboutPage(props) { ]; const overlayContent = () => ( - + Date: Wed, 20 Sep 2023 19:36:15 +0530 Subject: [PATCH 006/583] added header text --- src/pages/settings/AboutPage/AboutPage.js | 33 +++++++++++------------ 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/src/pages/settings/AboutPage/AboutPage.js b/src/pages/settings/AboutPage/AboutPage.js index 14ed1fbcd80d..0ef2a67f1a1c 100644 --- a/src/pages/settings/AboutPage/AboutPage.js +++ b/src/pages/settings/AboutPage/AboutPage.js @@ -100,24 +100,23 @@ function AboutPage(props) { backgroundColor={themeColors.PAGE_BACKGROUND_COLORS[SCREENS.SETTINGS.ABOUT]} overlayContent={overlayContent} > - - - {props.translate('initialSettingsPage.aboutPage.description')} - - {_.map(menuItems, (item) => ( - item.action()} - shouldBlockSelection={Boolean(item.link)} - onSecondaryInteraction={!_.isEmpty(item.link) ? (e) => ReportActionContextMenu.showContextMenu(CONTEXT_MENU_TYPES.LINK, e, item.link, popoverAnchor) : undefined} - ref={(el) => (popoverAnchor = el)} - shouldShowRightIcon - /> - ))} + + {props.translate('footer.aboutExpensify')} + {props.translate('initialSettingsPage.aboutPage.description')} + {_.map(menuItems, (item) => ( + item.action()} + shouldBlockSelection={Boolean(item.link)} + onSecondaryInteraction={!_.isEmpty(item.link) ? (e) => ReportActionContextMenu.showContextMenu(CONTEXT_MENU_TYPES.LINK, e, item.link, popoverAnchor) : undefined} + ref={(el) => (popoverAnchor = el)} + shouldShowRightIcon + /> + ))} Date: Wed, 27 Sep 2023 10:53:59 +0200 Subject: [PATCH 007/583] ref: started migrating Task lib to TS --- src/libs/actions/{Task.js => Task.ts} | 65 ++++++++++++--------------- src/types/onyx/Report.ts | 2 + 2 files changed, 31 insertions(+), 36 deletions(-) rename src/libs/actions/{Task.js => Task.ts} (93%) diff --git a/src/libs/actions/Task.js b/src/libs/actions/Task.ts similarity index 93% rename from src/libs/actions/Task.js rename to src/libs/actions/Task.ts index 963bfebb7eb2..b5c813e14521 100644 --- a/src/libs/actions/Task.js +++ b/src/libs/actions/Task.ts @@ -14,21 +14,22 @@ import * as ReportActionsUtils from '../ReportActionsUtils'; import * as Expensicons from '../../components/Icon/Expensicons'; import * as LocalePhoneNumber from '../LocalePhoneNumber'; import * as Localize from '../Localize'; +import {PersonalDetails, Report, Task} from '../../types/onyx'; -let currentUserEmail; -let currentUserAccountID; +let currentUserEmail: string; +let currentUserAccountID: number; Onyx.connect({ key: ONYXKEYS.SESSION, - callback: (val) => { - currentUserEmail = lodashGet(val, 'email', ''); - currentUserAccountID = lodashGet(val, 'accountID', 0); + callback: (value) => { + currentUserEmail = value?.email ?? ''; + currentUserAccountID = value?.accountID ?? 0; }, }); -let allPersonalDetails; +let allPersonalDetails: Record | null; Onyx.connect({ key: ONYXKEYS.PERSONAL_DETAILS_LIST, - callback: (val) => (allPersonalDetails = val), + callback: (value) => (allPersonalDetails = value), }); /** @@ -52,16 +53,16 @@ function clearOutTaskInfo() { * 3. The chat report between you and the assignee * 3a. The CreatedReportAction for the assignee chat report * 3b. The TaskReportAction on the assignee chat report - * - * @param {String} parentReportID - * @param {String} title - * @param {String} description - * @param {String} assigneeEmail - * @param {Number} assigneeAccountID - * @param {Object} assigneeChatReport - The chat report between you and the assignee - * @param {String} policyID - the policyID of the parent report */ -function createTaskAndNavigate(parentReportID, title, description, assigneeEmail, assigneeAccountID = 0, assigneeChatReport = null, policyID = CONST.POLICY.OWNER_EMAIL_FAKE) { +function createTaskAndNavigate( + parentReportID: string, + title: string, + description: string, + assigneeEmail: string, + assigneeAccountID = 0, + assigneeChatReport: Report | null = null, + policyID = CONST.POLICY.OWNER_EMAIL_FAKE, +) { const optimisticTaskReport = ReportUtils.buildOptimisticTaskReport(currentUserAccountID, assigneeAccountID, parentReportID, title, description, policyID); const assigneeChatReportID = assigneeChatReport ? assigneeChatReport.reportID : 0; @@ -203,12 +204,8 @@ function createTaskAndNavigate(parentReportID, title, description, assigneeEmail assignee: assigneeEmail, assigneeAccountID, assigneeChatReportID, - assigneeChatReportActionID: - assigneeChatReportOnyxData && assigneeChatReportOnyxData.optimisticAssigneeAddComment - ? assigneeChatReportOnyxData.optimisticAssigneeAddComment.reportAction.reportActionID - : 0, - assigneeChatCreatedReportActionID: - assigneeChatReportOnyxData && assigneeChatReportOnyxData.optimisticChatCreatedReportAction ? assigneeChatReportOnyxData.optimisticChatCreatedReportAction.reportActionID : 0, + assigneeChatReportActionID: assigneeChatReportOnyxData?.optimisticAssigneeAddComment.reportAction.reportActionID ?? 0, + assigneeChatCreatedReportActionID: assigneeChatReportOnyxData?.optimisticChatCreatedReportAction.reportActionID ?? 0, }, {optimisticData, successData, failureData}, ); @@ -305,7 +302,7 @@ function completeTask(taskReport, taskTitle) { * @param {Object} taskReport task report * @param {String} taskTitle Title of the task */ -function reopenTask(taskReport, taskTitle) { +function reopenTask(taskReport: Report, taskTitle: string) { const taskReportID = taskReport.reportID; const message = `reopened task: ${taskTitle}`; const reopenedTaskReportAction = ReportUtils.buildOptimisticTaskReportAction(taskReportID, CONST.REPORT.ACTIONS.TYPE.TASKREOPENED, message); @@ -393,15 +390,15 @@ function reopenTask(taskReport, taskTitle) { * @param {Object} editedTask * @param {Object} assigneeChatReport - The chat report between you and the assignee */ -function editTaskAndNavigate(report, ownerAccountID, {title, description, assignee = '', assigneeAccountID = 0}, assigneeChatReport = null) { +function editTaskAndNavigate(report: Report, ownerAccountID: number, {title, description, assignee = '', assigneeAccountID = 0}: Task, assigneeChatReport: Report | null = null) { // Create the EditedReportAction on the task const editTaskReportAction = ReportUtils.buildOptimisticEditedTaskReportAction(currentUserEmail); // Sometimes title or description is undefined, so we need to check for that, and we provide it to multiple functions - const reportName = (title || report.reportName).trim(); + const reportName = (title ?? report?.reportName).trim(); // Description can be unset, so we default to an empty string if so - const reportDescription = (!_.isUndefined(description) ? description : lodashGet(report, 'description', '')).trim(); + const reportDescription = (description ?? report.description ?? '').trim(); let assigneeChatReportOnyxData; const assigneeChatReportID = assigneeChatReport ? assigneeChatReport.reportID : 0; @@ -418,8 +415,8 @@ function editTaskAndNavigate(report, ownerAccountID, {title, description, assign value: { reportName, description: reportDescription, - managerID: assigneeAccountID || report.managerID, - managerEmail: assignee || report.managerEmail, + managerID: assigneeAccountID ?? report.managerID, + managerEmail: assignee ?? report.managerEmail, pendingFields: { ...(title && {reportName: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE}), ...(description && {description: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE}), @@ -487,12 +484,8 @@ function editTaskAndNavigate(report, ownerAccountID, {title, description, assign assigneeAccountID: assigneeAccountID || report.managerID, editedTaskReportActionID: editTaskReportAction.reportActionID, assigneeChatReportID, - assigneeChatReportActionID: - assigneeChatReportOnyxData && assigneeChatReportOnyxData.optimisticAssigneeAddComment - ? assigneeChatReportOnyxData.optimisticAssigneeAddComment.reportAction.reportActionID - : 0, - assigneeChatCreatedReportActionID: - assigneeChatReportOnyxData && assigneeChatReportOnyxData.optimisticChatCreatedReportAction ? assigneeChatReportOnyxData.optimisticChatCreatedReportAction.reportActionID : 0, + assigneeChatReportActionID: assigneeChatReportOnyxData.optimisticAssigneeAddComment.reportAction.reportActionID ?? 0, + assigneeChatCreatedReportActionID: assigneeChatReportOnyxData.optimisticChatCreatedReportAction.reportActionID ?? 0, }, {optimisticData, successData, failureData}, ); @@ -500,10 +493,10 @@ function editTaskAndNavigate(report, ownerAccountID, {title, description, assign Navigation.dismissModal(report.reportID); } -function editTaskAssigneeAndNavigate(report, ownerAccountID, assigneeEmail, assigneeAccountID = 0, assigneeChatReport = null) { +function editTaskAssigneeAndNavigate(report: Report, ownerAccountID: number, assigneeEmail: string, assigneeAccountID = 0, assigneeChatReport: Report | null = null) { // Create the EditedReportAction on the task const editTaskReportAction = ReportUtils.buildOptimisticEditedTaskReportAction(currentUserEmail); - const reportName = report.reportName.trim(); + const reportName = report.reportName?.trim(); let assigneeChatReportOnyxData; const assigneeChatReportID = assigneeChatReport ? assigneeChatReport.reportID : 0; diff --git a/src/types/onyx/Report.ts b/src/types/onyx/Report.ts index 88caa683305d..2e944c156a64 100644 --- a/src/types/onyx/Report.ts +++ b/src/types/onyx/Report.ts @@ -83,6 +83,8 @@ type Report = { participantAccountIDs?: number[]; total?: number; currency?: string; + description?: string; + managerEmail?: string; }; export default Report; From 87998bf588a4fa826f06767b898f022111a5806d Mon Sep 17 00:00:00 2001 From: Jakub Butkiewicz Date: Wed, 27 Sep 2023 13:20:31 +0200 Subject: [PATCH 008/583] ref: move all methods to TS --- src/libs/actions/Task.ts | 155 +++++++++++++-------------------------- src/types/onyx/Report.ts | 1 + 2 files changed, 51 insertions(+), 105 deletions(-) diff --git a/src/libs/actions/Task.ts b/src/libs/actions/Task.ts index b5c813e14521..adc7c41f4cfe 100644 --- a/src/libs/actions/Task.ts +++ b/src/libs/actions/Task.ts @@ -1,6 +1,4 @@ import Onyx from 'react-native-onyx'; -import lodashGet from 'lodash/get'; -import _ from 'underscore'; import ONYXKEYS from '../../ONYXKEYS'; import * as API from '../API'; import * as ReportUtils from '../ReportUtils'; @@ -215,10 +213,8 @@ function createTaskAndNavigate( /** * Complete a task - * @param {Object} taskReport task report - * @param {String} taskTitle Title of the task */ -function completeTask(taskReport, taskTitle) { +function completeTask(taskReport: Report, taskTitle: string) { const taskReportID = taskReport.reportID; const message = `completed task: ${taskTitle}`; const completedTaskReportAction = ReportUtils.buildOptimisticTaskReportAction(taskReportID, CONST.REPORT.ACTIONS.TYPE.TASKCOMPLETED, message); @@ -251,6 +247,7 @@ function completeTask(taskReport, taskTitle) { }, }, ]; + const failureData = [ { onyxMethod: Onyx.METHOD.MERGE, @@ -274,7 +271,7 @@ function completeTask(taskReport, taskTitle) { // Multiple report actions can link to the same child. Both share destination (task parent) and assignee report link to the same report action. // We need to find and update the other parent report action (in assignee report). More info https://github.com/Expensify/App/issues/23920#issuecomment-1663092717 const assigneeReportAction = ReportUtils.getTaskParentReportActionIDInAssigneeReport(taskReport); - if (!_.isEmpty(assigneeReportAction)) { + if (Object.keys(assigneeReportAction).length > 0) { const optimisticDataForClonedParentReportAction = ReportUtils.getOptimisticDataForParentReportAction( taskReportID, completedTaskReportAction.created, @@ -282,7 +279,7 @@ function completeTask(taskReport, taskTitle) { assigneeReportAction.reportID, assigneeReportAction.reportActionID, ); - if (!_.isEmpty(optimisticDataForClonedParentReportAction)) { + if (Object.keys(optimisticDataForClonedParentReportAction).length > 0) { optimisticData.push(optimisticDataForClonedParentReportAction); } } @@ -299,8 +296,6 @@ function completeTask(taskReport, taskTitle) { /** * Reopen a closed task - * @param {Object} taskReport task report - * @param {String} taskTitle Title of the task */ function reopenTask(taskReport: Report, taskTitle: string) { const taskReportID = taskReport.reportID; @@ -361,7 +356,7 @@ function reopenTask(taskReport: Report, taskTitle: string) { // Multiple report actions can link to the same child. Both share destination (task parent) and assignee report link to the same report action. // We need to find and update the other parent report action (in assignee report). More info https://github.com/Expensify/App/issues/23920#issuecomment-1663092717 const assigneeReportAction = ReportUtils.getTaskParentReportActionIDInAssigneeReport(taskReport); - if (!_.isEmpty(assigneeReportAction)) { + if (Object.keys(assigneeReportAction).length > 0 && taskReportID) { const optimisticDataForClonedParentReportAction = ReportUtils.getOptimisticDataForParentReportAction( taskReportID, reopenedTaskReportAction.created, @@ -369,7 +364,7 @@ function reopenTask(taskReport: Report, taskTitle: string) { assigneeReportAction.reportID, assigneeReportAction.reportActionID, ); - if (!_.isEmpty(optimisticDataForClonedParentReportAction)) { + if (Object.keys(optimisticDataForClonedParentReportAction).length > 0) { optimisticData.push(optimisticDataForClonedParentReportAction); } } @@ -384,12 +379,6 @@ function reopenTask(taskReport: Report, taskTitle: string) { ); } -/** - * @param {object} report - * @param {Number} ownerAccountID - * @param {Object} editedTask - * @param {Object} assigneeChatReport - The chat report between you and the assignee - */ function editTaskAndNavigate(report: Report, ownerAccountID: number, {title, description, assignee = '', assigneeAccountID = 0}: Task, assigneeChatReport: Report | null = null) { // Create the EditedReportAction on the task const editTaskReportAction = ReportUtils.buildOptimisticEditedTaskReportAction(currentUserEmail); @@ -458,7 +447,7 @@ function editTaskAndNavigate(report: Report, ownerAccountID: number, {title, des // If we make a change to the assignee, we want to add a comment to the assignee's chat // Check if the assignee actually changed - if (assigneeAccountID && assigneeAccountID !== report.managerID && assigneeAccountID !== ownerAccountID && assigneeChatReport) { + if (assigneeAccountID && assigneeAccountID !== report.managerID && assigneeAccountID !== ownerAccountID && assigneeChatReport && report.reportID) { assigneeChatReportOnyxData = ReportUtils.getTaskAssigneeChatOnyxData( currentUserAccountID, assignee, @@ -480,12 +469,12 @@ function editTaskAndNavigate(report: Report, ownerAccountID: number, {title, des taskReportID: report.reportID, title: reportName, description: reportDescription, - assignee: assignee || report.managerEmail, - assigneeAccountID: assigneeAccountID || report.managerID, + assignee: assignee ?? report.managerEmail, + assigneeAccountID: assigneeAccountID ?? report.managerID, editedTaskReportActionID: editTaskReportAction.reportActionID, assigneeChatReportID, - assigneeChatReportActionID: assigneeChatReportOnyxData.optimisticAssigneeAddComment.reportAction.reportActionID ?? 0, - assigneeChatCreatedReportActionID: assigneeChatReportOnyxData.optimisticChatCreatedReportAction.reportActionID ?? 0, + assigneeChatReportActionID: assigneeChatReportOnyxData?.optimisticAssigneeAddComment.reportAction.reportActionID ?? 0, + assigneeChatCreatedReportActionID: assigneeChatReportOnyxData?.optimisticChatCreatedReportAction.reportActionID ?? 0, }, {optimisticData, successData, failureData}, ); @@ -512,8 +501,8 @@ function editTaskAssigneeAndNavigate(report: Report, ownerAccountID: number, ass key: `${ONYXKEYS.COLLECTION.REPORT}${report.reportID}`, value: { reportName, - managerID: assigneeAccountID || report.managerID, - managerEmail: assigneeEmail || report.managerEmail, + managerID: assigneeAccountID ?? report.managerID, + managerEmail: assigneeEmail ?? report.managerEmail, }, }, ]; @@ -533,7 +522,7 @@ function editTaskAssigneeAndNavigate(report: Report, ownerAccountID: number, ass // If we make a change to the assignee, we want to add a comment to the assignee's chat // Check if the assignee actually changed - if (assigneeAccountID && assigneeAccountID !== report.managerID && assigneeAccountID !== ownerAccountID && assigneeChatReport) { + if (assigneeAccountID && assigneeAccountID !== report.managerID && assigneeAccountID !== ownerAccountID && assigneeChatReport && report.reportID) { assigneeChatReportOnyxData = ReportUtils.getTaskAssigneeChatOnyxData( currentUserAccountID, assigneeEmail, @@ -553,16 +542,12 @@ function editTaskAssigneeAndNavigate(report: Report, ownerAccountID: number, ass 'EditTaskAssignee', { taskReportID: report.reportID, - assignee: assigneeEmail || report.managerEmail, - assigneeAccountID: assigneeAccountID || report.managerID, + assignee: assigneeEmail ?? report.managerEmail, + assigneeAccountID: assigneeAccountID ?? report.managerID, editedTaskReportActionID: editTaskReportAction.reportActionID, assigneeChatReportID, - assigneeChatReportActionID: - assigneeChatReportOnyxData && assigneeChatReportOnyxData.optimisticAssigneeAddComment - ? assigneeChatReportOnyxData.optimisticAssigneeAddComment.reportAction.reportActionID - : 0, - assigneeChatCreatedReportActionID: - assigneeChatReportOnyxData && assigneeChatReportOnyxData.optimisticChatCreatedReportAction ? assigneeChatReportOnyxData.optimisticChatCreatedReportAction.reportActionID : 0, + assigneeChatReportActionID: assigneeChatReportOnyxData?.optimisticAssigneeAddComment.reportAction.reportActionID ?? 0, + assigneeChatCreatedReportActionID: assigneeChatReportOnyxData?.optimisticChatCreatedReportAction.reportActionID ?? 0, }, {optimisticData, successData, failureData}, ); @@ -575,49 +560,43 @@ function editTaskAssigneeAndNavigate(report: Report, ownerAccountID: number, ass * * @param {Object} report */ -function setTaskReport(report) { +function setTaskReport(report: Report) { Onyx.merge(ONYXKEYS.TASK, {report}); } /** * Sets the title and description values for the task - * @param {string} title - * @param {string} description */ -function setDetailsValue(title, description) { +function setDetailsValue(title: string, description: string) { // This is only needed for creation of a new task and so it should only be stored locally Onyx.merge(ONYXKEYS.TASK, {title: title.trim(), description: description.trim()}); } /** * Sets the title value for the task - * @param {string} title */ -function setTitleValue(title) { +function setTitleValue(title: string) { Onyx.merge(ONYXKEYS.TASK, {title: title.trim()}); } /** * Sets the description value for the task - * @param {string} description */ -function setDescriptionValue(description) { +function setDescriptionValue(description: string) { Onyx.merge(ONYXKEYS.TASK, {description: description.trim()}); } /** * Sets the shareDestination value for the task - * @param {string} shareDestination */ -function setShareDestinationValue(shareDestination) { +function setShareDestinationValue(shareDestination: string) { // This is only needed for creation of a new task and so it should only be stored locally Onyx.merge(ONYXKEYS.TASK, {shareDestination}); } /* Sets the assigneeChatReport details for the task - * @param {Object} chatReport */ -function setAssigneeChatReport(chatReport) { +function setAssigneeChatReport(chatReport: Report) { Onyx.merge(ONYXKEYS.TASK, {assigneeChatReport: chatReport}); } @@ -625,14 +604,9 @@ function setAssigneeChatReport(chatReport) { * Sets the assignee value for the task and checks for an existing chat with the assignee * If there is no existing chat, it creates an optimistic chat report * It also sets the shareDestination as that chat report if a share destination isn't already set - * @param {string} assigneeEmail - * @param {Number} assigneeAccountID - * @param {string} shareDestination - * @param {boolean} isCurrentUser */ - -function setAssigneeValue(assigneeEmail, assigneeAccountID, shareDestination, isCurrentUser = false) { - let chatReport; +function setAssigneeValue(assigneeEmail: string, assigneeAccountID: number, shareDestination: string, isCurrentUser = false) { + let chatReport: Report | undefined; if (!isCurrentUser) { chatReport = ReportUtils.getChatByParticipants([assigneeAccountID]); @@ -644,14 +618,16 @@ function setAssigneeValue(assigneeEmail, assigneeAccountID, shareDestination, is // However, the DM doesn't exist yet - and will be created optimistically once the task is created // We don't want to show the new DM yet, because if you select an assignee and then change the assignee, the previous DM will still be shown // So here, we create it optimistically to share it with the assignee, but we have to hide it until the task is created - chatReport.isHidden = true; + if (chatReport) { + chatReport.isHidden = true; + } Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${chatReport.reportID}`, chatReport); // If this is an optimistic report, we likely don't have their personal details yet so we set it here optimistically as well const optimisticPersonalDetailsListAction = { accountID: assigneeAccountID, - avatar: lodashGet(allPersonalDetails, [assigneeAccountID, 'avatar'], UserUtils.getDefaultAvatarURL(assigneeAccountID)), - displayName: lodashGet(allPersonalDetails, [assigneeAccountID, 'displayName'], assigneeEmail), + avatar: allPersonalDetails?.[assigneeAccountID]?.avatar ?? UserUtils.getDefaultAvatarURL(assigneeAccountID), + displayName: allPersonalDetails?.[assigneeAccountID]?.displayName ?? assigneeEmail, login: assigneeEmail, }; Onyx.merge(ONYXKEYS.PERSONAL_DETAILS_LIST, {[assigneeAccountID]: optimisticPersonalDetailsListAction}); @@ -662,7 +638,7 @@ function setAssigneeValue(assigneeEmail, assigneeAccountID, shareDestination, is // If there is no share destination set, automatically set it to the assignee chat report // This allows for a much quicker process when creating a new task and is likely the desired share destination most times if (!shareDestination) { - setShareDestinationValue(chatReport.reportID); + setShareDestinationValue(chatReport?.reportID ?? ''); } } @@ -677,31 +653,25 @@ function setAssigneeValue(assigneeEmail, assigneeAccountID, shareDestination, is /** * Sets the parentReportID value for the task - * @param {string} parentReportID */ -function setParentReportID(parentReportID) { +function setParentReportID(parentReportID: string) { // This is only needed for creation of a new task and so it should only be stored locally Onyx.merge(ONYXKEYS.TASK, {parentReportID}); } /** * Clears out the task info from the store and navigates to the NewTaskDetails page - * @param {string} reportID */ -function clearOutTaskInfoAndNavigate(reportID) { +function clearOutTaskInfoAndNavigate(reportID: string) { clearOutTaskInfo(); setParentReportID(reportID); - Navigation.navigate(ROUTES.NEW_TASK_DETAILS); + Navigation.navigate(ROUTES.NEW_TASK_DETAILS, ''); } /** * Get the assignee data - * - * @param {Number} assigneeAccountID - * @param {Object} personalDetails - * @returns {Object} */ -function getAssignee(assigneeAccountID, personalDetails) { +function getAssignee(assigneeAccountID: number, personalDetails: Record) { const details = personalDetails[assigneeAccountID]; if (!details) { return { @@ -719,18 +689,15 @@ function getAssignee(assigneeAccountID, personalDetails) { /** * Get the share destination data - * @param {Object} reportID - * @param {Object} reports - * @param {Object} personalDetails - * @returns {Object} * */ -function getShareDestination(reportID, reports, personalDetails) { - const report = lodashGet(reports, `report_${reportID}`, {}); +function getShareDestination(reportID: string, reports: Record, personalDetails: Record) { + const report = reports[`report_${reportID}`] ?? {}; let subtitle = ''; if (ReportUtils.isChatReport(report) && ReportUtils.isDM(report) && ReportUtils.hasSingleParticipant(report)) { - const participantAccountID = lodashGet(report, 'participantAccountIDs[0]'); - const displayName = lodashGet(personalDetails, [participantAccountID, 'displayName']); - const login = lodashGet(personalDetails, [participantAccountID, 'login']); + const participantAccountID = report.participantAccountIDs?.[0]; + + const displayName = personalDetails[participantAccountID ?? 0]?.displayName ?? ''; + const login = personalDetails[participantAccountID ?? 0]?.login ?? ''; subtitle = LocalePhoneNumber.formatPhoneNumber(login || displayName); } else { subtitle = ReportUtils.getChatRoomSubtitle(report); @@ -744,12 +711,8 @@ function getShareDestination(reportID, reports, personalDetails) { /** * Cancels a task by setting the report state to SUBMITTED and status to CLOSED - * @param {string} taskReportID - * @param {string} taskTitle - * @param {number} originalStateNum - * @param {number} originalStatusNum */ -function cancelTask(taskReportID, taskTitle, originalStateNum, originalStatusNum) { +function cancelTask(taskReportID: string, taskTitle: string, originalStateNum: number, originalStatusNum: number) { const message = `deleted task: ${taskTitle}`; const optimisticCancelReportAction = ReportUtils.buildOptimisticTaskReportAction(taskReportID, CONST.REPORT.ACTIONS.TYPE.TASKCANCELLED, message); const optimisticReportActionID = optimisticCancelReportAction.reportActionID; @@ -853,11 +816,8 @@ function dismissModalAndClearOutTaskInfo() { /** * Returns Task assignee accountID - * - * @param {Object} taskReport - * @returns {Number|null} */ -function getTaskAssigneeAccountID(taskReport) { +function getTaskAssigneeAccountID(taskReport: Report): number | null { if (!taskReport) { return null; } @@ -867,26 +827,20 @@ function getTaskAssigneeAccountID(taskReport) { } const reportAction = ReportActionsUtils.getParentReportAction(taskReport); - return lodashGet(reportAction, 'childManagerAccountID'); + return reportAction.childManagerAccountID; } /** * Returns Task owner accountID - * - * @param {Object} taskReport - * @returns {Number|null} */ -function getTaskOwnerAccountID(taskReport) { - return lodashGet(taskReport, 'ownerAccountID', null); +function getTaskOwnerAccountID(taskReport: Report): number | null { + return taskReport.ownerAccountID ?? null; } /** * Check if you're allowed to modify the task - anyone that has write access to the report can modify the task - * @param {Object} taskReport - * @param {Number} sessionAccountID - * @returns {Boolean} */ -function canModifyTask(taskReport, sessionAccountID) { +function canModifyTask(taskReport: Report, sessionAccountID: number): boolean { if (sessionAccountID === getTaskOwnerAccountID(taskReport) || sessionAccountID === getTaskAssigneeAccountID(taskReport)) { return true; } @@ -898,23 +852,14 @@ function canModifyTask(taskReport, sessionAccountID) { return ReportUtils.isAllowedToComment(parentReport); } -/** - * @param {String} reportID - */ -function clearEditTaskErrors(reportID) { +function clearEditTaskErrors(reportID: string) { Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, { pendingFields: null, errorFields: null, }); } -/** - * @param {string} actionName - * @param {string} reportID - * @param {boolean} isCreateTaskAction - * @returns {string} - */ -function getTaskReportActionMessage(actionName, reportID, isCreateTaskAction) { +function getTaskReportActionMessage(actionName: string, reportID: string, isCreateTaskAction: boolean): string { const report = ReportUtils.getReport(reportID); if (isCreateTaskAction) { return `Created a task: ${report.reportName}`; diff --git a/src/types/onyx/Report.ts b/src/types/onyx/Report.ts index 2e944c156a64..ccb33f60531e 100644 --- a/src/types/onyx/Report.ts +++ b/src/types/onyx/Report.ts @@ -85,6 +85,7 @@ type Report = { currency?: string; description?: string; managerEmail?: string; + isHidden?: boolean; }; export default Report; From a917e0644a85e5593624dc9a052b5155c9dcc93e Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Thu, 16 Nov 2023 09:32:54 -0500 Subject: [PATCH 009/583] adds violations functions to report utils and implements --- .../ReportActionItem/ReportPreview.js | 2 +- src/libs/ReportUtils.js | 78 +++++++++++++++++++ src/libs/SidebarUtils.ts | 2 +- 3 files changed, 80 insertions(+), 2 deletions(-) diff --git a/src/components/ReportActionItem/ReportPreview.js b/src/components/ReportActionItem/ReportPreview.js index 45fe7d42e299..38fc7b008095 100644 --- a/src/components/ReportActionItem/ReportPreview.js +++ b/src/components/ReportActionItem/ReportPreview.js @@ -125,7 +125,7 @@ function ReportPreview(props) { const hasReceipts = transactionsWithReceipts.length > 0; const hasOnlyDistanceRequests = ReportUtils.hasOnlyDistanceRequestTransactions(props.iouReportID); const isScanning = hasReceipts && ReportUtils.areAllRequestsBeingSmartScanned(props.iouReportID, props.action); - const hasErrors = hasReceipts && ReportUtils.hasMissingSmartscanFields(props.iouReportID); + const hasErrors = (hasReceipts && ReportUtils.hasMissingSmartscanFields(props.iouReportID)) || ReportUtils.reportHasViolations(props.iouReportID); const lastThreeTransactionsWithReceipts = transactionsWithReceipts.slice(-3); const lastThreeReceipts = _.map(lastThreeTransactionsWithReceipts, (transaction) => ReceiptUtils.getThumbnailAndImageURIs(transaction)); const hasNonReimbursableTransactions = ReportUtils.hasNonReimbursableTransactions(props.iouReportID); diff --git a/src/libs/ReportUtils.js b/src/libs/ReportUtils.js index 973ed1f0dfd1..12808ef747a5 100644 --- a/src/libs/ReportUtils.js +++ b/src/libs/ReportUtils.js @@ -12,6 +12,7 @@ import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import * as IOU from './actions/IOU'; +import * as CollectionUtils from './CollectionUtils'; import * as CurrencyUtils from './CurrencyUtils'; import DateUtils from './DateUtils'; import isReportMessageAttachment from './isReportMessageAttachment'; @@ -81,6 +82,19 @@ Onyx.connect({ callback: (val) => (loginList = val), }); +const transactionViolations = {}; +Onyx.connect({ + key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, + callback: (violations, key) => { + if (!key || !violations) { + return; + } + + const transactionID = CollectionUtils.extractCollectionItemID(key); + transactionViolations[transactionID] = violations; + }, +}); + function getChatType(report) { return report ? report.chatType : ''; } @@ -3294,6 +3308,63 @@ function shouldHideReport(report, currentReportId) { return parentReport.reportID !== report.reportID && !isChildReportHasComment; } +/** + * @param {String} transactionID + * @returns {Boolean} + */ + +function transactionHasViolation(transactionID) { + const violations = lodashGet(transactionViolations, transactionID, []); + return _.some(violations, (violation) => violation.type === 'violation'); +} + +/** + * + * @param {Object} report + * @returns {Boolean} + */ + +function transactionThreadHasViolations(report) { + if (!Permissions.canUseViolations()) { + return false; + } + // eslint-disable-next-line es/no-nullish-coalescing-operators + if (!report.parentReportActionID ?? 0) { + return false; + } + + const reportActions = ReportActionsUtils.getAllReportActions(report.reportID); + + const parentReportAction = lodashGet(reportActions, `${report.parentReportID}.${report.parentReportActionID}`); + if (!parentReportAction) { + return false; + } + // eslint-disable-next-line es/no-nullish-coalescing-operators + const transactionID = parentReportAction.originalMessage.IOUTransactionID ?? 0; + if (!transactionID) { + return false; + } + // eslint-disable-next-line es/no-nullish-coalescing-operators + const reportID = parentReportAction.originalMessage.IOUReportID ?? 0; + if (!reportID) { + return false; + } + if (!isCurrentUserSubmitter(reportID)) { + return false; + } + return transactionHasViolation(transactionID); +} + +/** + * @param {String} reportID + * @returns {Boolean} + */ + +function reportHasViolations(reportID) { + const transactions = TransactionUtils.getAllReportTransactions(reportID); + return _.some(transactions, (transaction) => transactionHasViolation(transaction.transactionID)); +} + /** * Takes several pieces of data from Onyx and evaluates if a report should be shown in the option list (either when searching * for reports or the reports shown in the LHN). @@ -3369,6 +3440,11 @@ function shouldReportBeInOptionList(report, currentReportId, isInGSDMode, betas, return true; } + // Always show IOU reports with violations + if (isExpenseRequest(report) && transactionThreadHasViolations(report)) { + return true; + } + // All unread chats (even archived ones) in GSD mode will be shown. This is because GSD mode is specifically for focusing the user on the most relevant chats, primarily, the unread ones if (isInGSDMode) { return isUnread(report); @@ -4358,4 +4434,6 @@ export { getReimbursementQueuedActionMessage, getPersonalDetailsForAccountID, getRoom, + transactionThreadHasViolations, + reportHasViolations, }; diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 58c4a124335d..2940a6286a32 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -361,7 +361,7 @@ function getOptionData( result.shouldShowSubscript = ReportUtils.shouldReportShowSubscript(report); result.pendingAction = report.pendingFields ? report.pendingFields.addWorkspaceRoom || report.pendingFields.createChat : null; result.allReportErrors = OptionsListUtils.getAllReportErrors(report, reportActions) as OnyxCommon.Errors; - result.brickRoadIndicator = Object.keys(result.allReportErrors ?? {}).length !== 0 ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : ''; + result.brickRoadIndicator = Object.keys(result.allReportErrors ?? {}).length !== 0 || ReportUtils.transactionThreadHasViolations(report) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : ''; result.ownerAccountID = report.ownerAccountID; result.managerID = report.managerID; result.reportID = report.reportID; From 3756ef9c53ee0ba0fb0a93d8a4f8a8c5f89750b7 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Thu, 16 Nov 2023 11:03:03 -0500 Subject: [PATCH 010/583] Small fix in ReportUtils --- src/libs/ReportUtils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/ReportUtils.js b/src/libs/ReportUtils.js index 12808ef747a5..6fe0ff8ad7ea 100644 --- a/src/libs/ReportUtils.js +++ b/src/libs/ReportUtils.js @@ -3329,7 +3329,7 @@ function transactionThreadHasViolations(report) { return false; } // eslint-disable-next-line es/no-nullish-coalescing-operators - if (!report.parentReportActionID ?? 0) { + if (!report.parentReportActionID) { return false; } From 3cc2e0f6bcc8e9ffbf16127831ea4fc8faebae0d Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Thu, 16 Nov 2023 15:15:20 -0500 Subject: [PATCH 011/583] Fix Onyx Connection for reportActions --- src/libs/ReportUtils.js | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/libs/ReportUtils.js b/src/libs/ReportUtils.js index 6fe0ff8ad7ea..e90f2eb955d4 100644 --- a/src/libs/ReportUtils.js +++ b/src/libs/ReportUtils.js @@ -95,6 +95,19 @@ Onyx.connect({ }, }); +const reportActions = {}; +Onyx.connect({ + key: ONYXKEYS.COLLECTION.REPORT_ACTIONS, + callback: (actions, key) => { + if (!key || !actions) { + return; + } + + const reportID = CollectionUtils.extractCollectionItemID(key); + reportActions[reportID] = actions; + }, +}); + function getChatType(report) { return report ? report.chatType : ''; } @@ -3303,8 +3316,8 @@ function canAccessReport(report, policies, betas, allReportActions) { */ function shouldHideReport(report, currentReportId) { const parentReport = getParentReport(getReport(currentReportId)); - const reportActions = ReportActionsUtils.getAllReportActions(report.reportID); - const isChildReportHasComment = _.some(reportActions, (reportAction) => (reportAction.childVisibleActionCount || 0) > 0); + const allReportActions = ReportActionsUtils.getAllReportActions(report.reportID); + const isChildReportHasComment = _.some(allReportActions, (reportAction) => (reportAction.childVisibleActionCount || 0) > 0); return parentReport.reportID !== report.reportID && !isChildReportHasComment; } @@ -3333,8 +3346,6 @@ function transactionThreadHasViolations(report) { return false; } - const reportActions = ReportActionsUtils.getAllReportActions(report.reportID); - const parentReportAction = lodashGet(reportActions, `${report.parentReportID}.${report.parentReportActionID}`); if (!parentReportAction) { return false; From a98b3a12290754acc7610c3e84083a9ac9f515a6 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Tue, 21 Nov 2023 12:17:38 -0500 Subject: [PATCH 012/583] Fix Permissions import --- src/libs/ReportUtils.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libs/ReportUtils.js b/src/libs/ReportUtils.js index cc7e841de251..78f636a7ad74 100644 --- a/src/libs/ReportUtils.js +++ b/src/libs/ReportUtils.js @@ -8,6 +8,8 @@ import Onyx from 'react-native-onyx'; import _ from 'underscore'; import * as Expensicons from '@components/Icon/Expensicons'; import * as defaultWorkspaceAvatars from '@components/Icon/WorkspaceDefaultAvatars'; +// eslint-disable-next-line @dword-design/import-alias/prefer-alias +import Permissions from '@libs/Permissions'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; @@ -20,7 +22,6 @@ import * as Localize from './Localize'; import linkingConfig from './Navigation/linkingConfig'; import Navigation from './Navigation/Navigation'; import * as NumberUtils from './NumberUtils'; -import Permissions from './Permissions'; import * as PolicyUtils from './PolicyUtils'; import * as ReportActionsUtils from './ReportActionsUtils'; import * as TransactionUtils from './TransactionUtils'; From f7dc7311cba335f50fc44fa36616a9e082f121c1 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 22 Nov 2023 09:50:25 -0500 Subject: [PATCH 013/583] Correctly pass down betas --- src/components/LHNOptionsList/LHNOptionsList.js | 11 ++++++++++- src/components/LHNOptionsList/OptionRowLHNData.js | 2 +- src/libs/ReportUtils.js | 10 +++++----- src/libs/SidebarUtils.ts | 4 +++- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/components/LHNOptionsList/LHNOptionsList.js b/src/components/LHNOptionsList/LHNOptionsList.js index 0d300c5e2179..605ad761240a 100644 --- a/src/components/LHNOptionsList/LHNOptionsList.js +++ b/src/components/LHNOptionsList/LHNOptionsList.js @@ -64,6 +64,9 @@ const propTypes = { transactions: PropTypes.objectOf(transactionPropTypes), /** List of draft comments */ draftComments: PropTypes.objectOf(PropTypes.string), + + /** The list of betas the user has access to */ + betas: PropTypes.arrayOf(PropTypes.string), ...withCurrentReportIDPropTypes, }; @@ -77,6 +80,7 @@ const defaultProps = { personalDetails: {}, transactions: {}, draftComments: {}, + betas: {}, ...withCurrentReportIDDefaultProps, }; @@ -97,6 +101,7 @@ function LHNOptionsList({ transactions, draftComments, currentReportID, + betas, }) { const styles = useThemeStyles(); /** @@ -134,10 +139,11 @@ function LHNOptionsList({ onSelectRow={onSelectRow} preferredLocale={preferredLocale} comment={itemComment} + betas={betas} /> ); }, - [currentReportID, draftComments, onSelectRow, optionMode, personalDetails, policy, preferredLocale, reportActions, reports, shouldDisableFocusOptions, transactions], + [currentReportID, draftComments, onSelectRow, optionMode, personalDetails, policy, preferredLocale, reportActions, reports, shouldDisableFocusOptions, transactions, betas], ); return ( @@ -186,5 +192,8 @@ export default compose( draftComments: { key: ONYXKEYS.COLLECTION.REPORT_DRAFT_COMMENT, }, + betas: { + key: ONYXKEYS.BETAS, + }, }), )(LHNOptionsList); diff --git a/src/components/LHNOptionsList/OptionRowLHNData.js b/src/components/LHNOptionsList/OptionRowLHNData.js index e11bfc3cab98..f3b0e78b0df0 100644 --- a/src/components/LHNOptionsList/OptionRowLHNData.js +++ b/src/components/LHNOptionsList/OptionRowLHNData.js @@ -87,7 +87,7 @@ function OptionRowLHNData({ const optionItem = useMemo(() => { // Note: ideally we'd have this as a dependent selector in onyx! - const item = SidebarUtils.getOptionData(fullReport, reportActions, personalDetails, preferredLocale, policy, parentReportAction); + const item = SidebarUtils.getOptionData(fullReport, reportActions, personalDetails, preferredLocale, policy, parentReportAction, propsToForward.betas); if (deepEqual(item, optionItemRef.current)) { return optionItemRef.current; } diff --git a/src/libs/ReportUtils.js b/src/libs/ReportUtils.js index 78f636a7ad74..bac1b45440c3 100644 --- a/src/libs/ReportUtils.js +++ b/src/libs/ReportUtils.js @@ -8,8 +8,6 @@ import Onyx from 'react-native-onyx'; import _ from 'underscore'; import * as Expensicons from '@components/Icon/Expensicons'; import * as defaultWorkspaceAvatars from '@components/Icon/WorkspaceDefaultAvatars'; -// eslint-disable-next-line @dword-design/import-alias/prefer-alias -import Permissions from '@libs/Permissions'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; @@ -22,6 +20,7 @@ import * as Localize from './Localize'; import linkingConfig from './Navigation/linkingConfig'; import Navigation from './Navigation/Navigation'; import * as NumberUtils from './NumberUtils'; +import Permissions from './Permissions'; import * as PolicyUtils from './PolicyUtils'; import * as ReportActionsUtils from './ReportActionsUtils'; import * as TransactionUtils from './TransactionUtils'; @@ -3361,14 +3360,15 @@ function transactionHasViolation(transactionID) { /** * * @param {Object} report + * @param {Array | null} betas * @returns {Boolean} */ -function transactionThreadHasViolations(report) { - if (!Permissions.canUseViolations()) { +function transactionThreadHasViolations(report, betas) { + if (!Permissions.canUseViolations(betas)) { return false; } - // eslint-disable-next-line es/no-nullish-coalescing-operators + if (!report.parentReportActionID) { return false; } diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 2940a6286a32..510ca2347a14 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -299,6 +299,7 @@ function getOptionData( preferredLocale: ValueOf, policy: Policy, parentReportAction: ReportAction, + betas: Beta[], ): OptionData | undefined { // When a user signs out, Onyx is cleared. Due to the lazy rendering with a virtual list, it's possible for // this method to be called after the Onyx data has been cleared out. In that case, it's fine to do @@ -361,7 +362,8 @@ function getOptionData( result.shouldShowSubscript = ReportUtils.shouldReportShowSubscript(report); result.pendingAction = report.pendingFields ? report.pendingFields.addWorkspaceRoom || report.pendingFields.createChat : null; result.allReportErrors = OptionsListUtils.getAllReportErrors(report, reportActions) as OnyxCommon.Errors; - result.brickRoadIndicator = Object.keys(result.allReportErrors ?? {}).length !== 0 || ReportUtils.transactionThreadHasViolations(report) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : ''; + result.brickRoadIndicator = + Object.keys(result.allReportErrors ?? {}).length !== 0 || ReportUtils.transactionThreadHasViolations(report, betas) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : ''; result.ownerAccountID = report.ownerAccountID; result.managerID = report.managerID; result.reportID = report.reportID; From 93ea5b7de9f4b9ef3409e1250549590ae1eabc29 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 22 Nov 2023 13:38:37 -0500 Subject: [PATCH 014/583] Update tests --- src/libs/__mocks__/Permissions.ts | 1 + tests/unit/SidebarFilterTest.js | 11 ++++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/libs/__mocks__/Permissions.ts b/src/libs/__mocks__/Permissions.ts index e95d13f52803..23939d037f9a 100644 --- a/src/libs/__mocks__/Permissions.ts +++ b/src/libs/__mocks__/Permissions.ts @@ -13,4 +13,5 @@ export default { canUseDefaultRooms: (betas: Beta[]) => betas.includes(CONST.BETAS.DEFAULT_ROOMS), canUsePolicyRooms: (betas: Beta[]) => betas.includes(CONST.BETAS.POLICY_ROOMS), canUseCustomStatus: (betas: Beta[]) => betas.includes(CONST.BETAS.CUSTOM_STATUS), + canUseViolations: (betas: Beta[]) => betas.includes(CONST.BETAS.VIOLATIONS), }; diff --git a/tests/unit/SidebarFilterTest.js b/tests/unit/SidebarFilterTest.js index 23a958e3aa9d..f4a4a64a3907 100644 --- a/tests/unit/SidebarFilterTest.js +++ b/tests/unit/SidebarFilterTest.js @@ -111,6 +111,7 @@ describe('Sidebar', () => { // When Onyx is updated to contain that report .then(() => Onyx.multiSet({ + [ONYXKEYS.BETAS]: [CONST.BETAS.VIOLATIONS], [`${ONYXKEYS.COLLECTION.REPORT}${report.reportID}`]: report, [ONYXKEYS.PERSONAL_DETAILS_LIST]: LHNTestUtils.fakePersonalDetails, [ONYXKEYS.IS_LOADING_REPORT_DATA]: false, @@ -141,7 +142,7 @@ describe('Sidebar', () => { // When Onyx is updated to contain that data and the sidebar re-renders .then(() => Onyx.multiSet({ - [ONYXKEYS.BETAS]: [], + [ONYXKEYS.BETAS]: [CONST.BETAS.VIOLATIONS], [ONYXKEYS.PERSONAL_DETAILS_LIST]: LHNTestUtils.fakePersonalDetails, [ONYXKEYS.IS_LOADING_REPORT_DATA]: false, [`${ONYXKEYS.COLLECTION.REPORT}${report.reportID}`]: report, @@ -194,7 +195,7 @@ describe('Sidebar', () => { // When Onyx is updated to contain that data and the sidebar re-renders .then(() => Onyx.multiSet({ - [ONYXKEYS.BETAS]: [], + [ONYXKEYS.BETAS]: [CONST.BETAS.VIOLATIONS], [ONYXKEYS.PERSONAL_DETAILS_LIST]: LHNTestUtils.fakePersonalDetails, [ONYXKEYS.IS_LOADING_REPORT_DATA]: false, [`${ONYXKEYS.COLLECTION.REPORT}${report1.reportID}`]: report1, @@ -246,7 +247,7 @@ describe('Sidebar', () => { // When Onyx is updated to contain that data and the sidebar re-renders .then(() => Onyx.multiSet({ - [ONYXKEYS.BETAS]: [], + [ONYXKEYS.BETAS]: [CONST.BETAS.VIOLATIONS], [ONYXKEYS.PERSONAL_DETAILS_LIST]: LHNTestUtils.fakePersonalDetails, [ONYXKEYS.IS_LOADING_REPORT_DATA]: false, [`${ONYXKEYS.COLLECTION.REPORT}${report.reportID}`]: report, @@ -379,6 +380,7 @@ describe('Sidebar', () => { // When Onyx is updated to contain that data and the sidebar re-renders .then(() => Onyx.multiSet({ + [ONYXKEYS.BETAS]: [CONST.BETAS.VIOLATIONS], [ONYXKEYS.NVP_PRIORITY_MODE]: CONST.PRIORITY_MODE.GSD, [ONYXKEYS.PERSONAL_DETAILS_LIST]: LHNTestUtils.fakePersonalDetails, [ONYXKEYS.IS_LOADING_REPORT_DATA]: false, @@ -445,11 +447,14 @@ describe('Sidebar', () => { }; LHNTestUtils.getDefaultRenderedSidebarLinks(draftReport.reportID); + const betas = [CONST.BETAS.VIOLATIONS]; + return ( waitForBatchedUpdates() // When Onyx is updated to contain that data and the sidebar re-renders .then(() => Onyx.multiSet({ + [ONYXKEYS.BETAS]: betas, [ONYXKEYS.NVP_PRIORITY_MODE]: CONST.PRIORITY_MODE.GSD, [ONYXKEYS.PERSONAL_DETAILS_LIST]: LHNTestUtils.fakePersonalDetails, [ONYXKEYS.IS_LOADING_REPORT_DATA]: false, From 1f9d6458b700bb00e5e1fb68fcda8171ee2b7643 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Mon, 27 Nov 2023 13:19:05 -0500 Subject: [PATCH 015/583] Fixing some beta props --- src/components/LHNOptionsList/OptionRowLHNData.js | 5 +++-- src/libs/ReportUtils.js | 4 ++-- tests/unit/SidebarFilterTest.js | 4 +--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/components/LHNOptionsList/OptionRowLHNData.js b/src/components/LHNOptionsList/OptionRowLHNData.js index f3b0e78b0df0..765c4998adce 100644 --- a/src/components/LHNOptionsList/OptionRowLHNData.js +++ b/src/components/LHNOptionsList/OptionRowLHNData.js @@ -73,6 +73,7 @@ function OptionRowLHNData({ receiptTransactions, parentReportAction, transaction, + betas, ...propsToForward }) { const reportID = propsToForward.reportID; @@ -87,7 +88,7 @@ function OptionRowLHNData({ const optionItem = useMemo(() => { // Note: ideally we'd have this as a dependent selector in onyx! - const item = SidebarUtils.getOptionData(fullReport, reportActions, personalDetails, preferredLocale, policy, parentReportAction, propsToForward.betas); + const item = SidebarUtils.getOptionData(fullReport, reportActions, personalDetails, preferredLocale, policy, parentReportAction, betas); if (deepEqual(item, optionItemRef.current)) { return optionItemRef.current; } @@ -96,7 +97,7 @@ function OptionRowLHNData({ // Listen parentReportAction to update title of thread report when parentReportAction changed // Listen to transaction to update title of transaction report when transaction changed // eslint-disable-next-line react-hooks/exhaustive-deps - }, [fullReport, linkedTransaction, reportActions, personalDetails, preferredLocale, policy, parentReportAction, transaction]); + }, [fullReport, linkedTransaction, reportActions, personalDetails, preferredLocale, policy, parentReportAction, transaction, betas]); useEffect(() => { if (!optionItem || optionItem.hasDraftComment || !comment || comment.length <= 0 || isFocused) { diff --git a/src/libs/ReportUtils.js b/src/libs/ReportUtils.js index 32588d9d6f97..e9362bc8afcc 100644 --- a/src/libs/ReportUtils.js +++ b/src/libs/ReportUtils.js @@ -8,6 +8,8 @@ import Onyx from 'react-native-onyx'; import _ from 'underscore'; import * as Expensicons from '@components/Icon/Expensicons'; import * as defaultWorkspaceAvatars from '@components/Icon/WorkspaceDefaultAvatars'; +// eslint-disable-next-line @dword-design/import-alias/prefer-alias +import Permissions from '@libs/Permissions'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; @@ -20,7 +22,6 @@ import * as Localize from './Localize'; import linkingConfig from './Navigation/linkingConfig'; import Navigation from './Navigation/Navigation'; import * as NumberUtils from './NumberUtils'; -import Permissions from './Permissions'; import * as PolicyUtils from './PolicyUtils'; import * as ReportActionsUtils from './ReportActionsUtils'; import * as TransactionUtils from './TransactionUtils'; @@ -3399,7 +3400,6 @@ function transactionThreadHasViolations(report, betas) { if (!Permissions.canUseViolations(betas)) { return false; } - if (!report.parentReportActionID) { return false; } diff --git a/tests/unit/SidebarFilterTest.js b/tests/unit/SidebarFilterTest.js index f4a4a64a3907..f54b2a6f5c95 100644 --- a/tests/unit/SidebarFilterTest.js +++ b/tests/unit/SidebarFilterTest.js @@ -447,14 +447,12 @@ describe('Sidebar', () => { }; LHNTestUtils.getDefaultRenderedSidebarLinks(draftReport.reportID); - const betas = [CONST.BETAS.VIOLATIONS]; - return ( waitForBatchedUpdates() // When Onyx is updated to contain that data and the sidebar re-renders .then(() => Onyx.multiSet({ - [ONYXKEYS.BETAS]: betas, + [ONYXKEYS.BETAS]: [CONST.BETAS.VIOLATIONS], [ONYXKEYS.NVP_PRIORITY_MODE]: CONST.PRIORITY_MODE.GSD, [ONYXKEYS.PERSONAL_DETAILS_LIST]: LHNTestUtils.fakePersonalDetails, [ONYXKEYS.IS_LOADING_REPORT_DATA]: false, From 6d47be552a2266c9c57c7768716790a7675e095a Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Mon, 27 Nov 2023 16:34:41 -0500 Subject: [PATCH 016/583] Started TS conversion --- src/ONYXKEYS.ts | 3 +++ src/libs/ReportUtils.ts | 7 ++--- src/types/onyx/TransactionViolation.ts | 36 ++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 src/types/onyx/TransactionViolation.ts diff --git a/src/ONYXKEYS.ts b/src/ONYXKEYS.ts index 5576eb64736d..cf98433da76d 100755 --- a/src/ONYXKEYS.ts +++ b/src/ONYXKEYS.ts @@ -266,6 +266,9 @@ const ONYXKEYS = { SECURITY_GROUP: 'securityGroup_', TRANSACTION: 'transactions_', + // Transaction Violations + TRANSACTION_VIOLATIONS: 'transactionViolations_', + // Holds temporary transactions used during the creation and edit flow TRANSACTION_DRAFT: 'transactionsDraft_', SPLIT_TRANSACTION_DRAFT: 'splitTransactionDraft_', diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 8beeff76c5da..7cd21e19ab0f 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -21,6 +21,7 @@ import {Errors, Icon, PendingAction} from '@src/types/onyx/OnyxCommon'; import {ChangeLog, IOUMessage, OriginalMessageActionName} from '@src/types/onyx/OriginalMessage'; import {Message, ReportActions} from '@src/types/onyx/ReportAction'; import {Receipt, WaypointCollection} from '@src/types/onyx/Transaction'; +import {TransactionViolation, TransactionViolations} from '@src/types/onyx/TransactionViolation'; import DeepValueOf from '@src/types/utils/DeepValueOf'; import {EmptyObject, isEmptyObject, isNotEmptyObject} from '@src/types/utils/EmptyObject'; import * as CollectionUtils from './CollectionUtils'; @@ -402,10 +403,10 @@ Onyx.connect({ callback: (value) => (loginList = value), }); -const transactionViolations = {}; +const transactionViolations: OnyxCollection = {}; Onyx.connect({ key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, - callback: (violations, key) => { + callback: (violations: OnyxCollection, key) => { if (!key || !violations) { return; } @@ -415,7 +416,7 @@ Onyx.connect({ }, }); -const reportActions = {}; +const reportActions: OnyxCollection = {}; Onyx.connect({ key: ONYXKEYS.COLLECTION.REPORT_ACTIONS, callback: (actions, key) => { diff --git a/src/types/onyx/TransactionViolation.ts b/src/types/onyx/TransactionViolation.ts new file mode 100644 index 000000000000..fa7f212aa794 --- /dev/null +++ b/src/types/onyx/TransactionViolation.ts @@ -0,0 +1,36 @@ +/** + * @module TransactionViolation + * @description Transaction Violation + */ + +/** + * Names of the various Transaction Violation types + */ +type ViolationName = + | 'perDayLimit' + | 'maxAge' + | 'overLimit' + | 'overLimitAttendee' + | 'overCategoryLimit' + | 'receiptRequired' + | 'missingCategory' + | 'categoryOutOfPolicy' + | 'missingTag' + | 'tagOutOfPolicy' + | 'missingComment' + | 'taxRequired' + | 'taxOutOfPolicy' + | 'billableExpense'; + +type ViolationType = string; + +type TransactionViolation = { + type: ViolationType; + name: ViolationName; + userMessage: string; + data?: Record; +}; + +type TransactionViolations = Record; + +export type {TransactionViolation, TransactionViolations, ViolationName, ViolationType}; From c03786570e7b93cfbee9a0220deecc2f1c6a9ac4 Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Tue, 28 Nov 2023 16:07:32 +0100 Subject: [PATCH 017/583] Rename Policy file --- src/libs/actions/{Policy.js => Policy.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/libs/actions/{Policy.js => Policy.ts} (100%) diff --git a/src/libs/actions/Policy.js b/src/libs/actions/Policy.ts similarity index 100% rename from src/libs/actions/Policy.js rename to src/libs/actions/Policy.ts From 58498036860ed27e1e2848dc6213ade02d5d7777 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Tue, 28 Nov 2023 21:35:03 -0500 Subject: [PATCH 018/583] Fixed up the Onyx Types for Violations & I think I got the functions working --- src/ONYXKEYS.ts | 1 + src/libs/ReportUtils.ts | 72 ++++++++++++-------------- src/types/onyx/OriginalMessage.ts | 2 +- src/types/onyx/TransactionViolation.ts | 57 +++++++++++++------- src/types/onyx/index.ts | 2 + 5 files changed, 75 insertions(+), 59 deletions(-) diff --git a/src/ONYXKEYS.ts b/src/ONYXKEYS.ts index cf98433da76d..62067a864ed5 100755 --- a/src/ONYXKEYS.ts +++ b/src/ONYXKEYS.ts @@ -451,6 +451,7 @@ type OnyxValues = { [ONYXKEYS.COLLECTION.TRANSACTION]: OnyxTypes.Transaction; [ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_TAGS]: OnyxTypes.RecentlyUsedTags; [ONYXKEYS.COLLECTION.SELECTED_TAB]: string; + [ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS]: OnyxTypes.TransactionViolation[]; // Forms [ONYXKEYS.FORMS.ADD_DEBIT_CARD_FORM]: OnyxTypes.AddDebitCardForm; diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 7cd21e19ab0f..af57a2969b5b 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -16,12 +16,11 @@ import CONST from '@src/CONST'; import {TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; -import {Beta, Login, PersonalDetails, Policy, PolicyTags, Report, ReportAction, Transaction} from '@src/types/onyx'; +import {Beta, Login, PersonalDetails, Policy, PolicyTags, Report, ReportAction, Transaction, TransactionViolation} from '@src/types/onyx'; import {Errors, Icon, PendingAction} from '@src/types/onyx/OnyxCommon'; -import {ChangeLog, IOUMessage, OriginalMessageActionName} from '@src/types/onyx/OriginalMessage'; +import OriginalMessage, {ChangeLog, IOUMessage, OriginalMessageActionName, OriginalMessageIOU} from '@src/types/onyx/OriginalMessage'; import {Message, ReportActions} from '@src/types/onyx/ReportAction'; import {Receipt, WaypointCollection} from '@src/types/onyx/Transaction'; -import {TransactionViolation, TransactionViolations} from '@src/types/onyx/TransactionViolation'; import DeepValueOf from '@src/types/utils/DeepValueOf'; import {EmptyObject, isEmptyObject, isNotEmptyObject} from '@src/types/utils/EmptyObject'; import * as CollectionUtils from './CollectionUtils'; @@ -403,11 +402,16 @@ Onyx.connect({ callback: (value) => (loginList = value), }); -const transactionViolations: OnyxCollection = {}; +const transactionViolations: OnyxCollection = {}; Onyx.connect({ key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, - callback: (violations: OnyxCollection, key) => { - if (!key || !violations) { + callback: (violations, key) => { + if (!key) { + return; + } + + if (!violations) { + delete transactionViolations[key]; return; } @@ -3396,43 +3400,36 @@ function shouldHideReport(report: OnyxEntry, currentReportId: string): b return parentReport?.reportID !== report?.reportID && !isChildReportHasComment; } -/** - * @param {String} transactionID - * @returns {Boolean} - */ - -function transactionHasViolation(transactionID) { - const violations = lodashGet(transactionViolations, transactionID, []); - return _.some(violations, (violation) => violation.type === 'violation'); +function transactionHasViolation(transactionID: string): boolean { + const violations = transactionViolations ? transactionViolations?.[transactionID] : []; + if (!violations) { + return false; + } + return violations.some((violation: TransactionViolation) => violation.type === 'violation'); } -/** - * - * @param {Object} report - * @param {Array | null} betas - * @returns {Boolean} - */ +function isOriginalMessageIOU(message: OriginalMessage): message is OriginalMessageIOU { + return (message as OriginalMessageIOU).actionName === CONST.REPORT.ACTIONS.TYPE.IOU; +} -function transactionThreadHasViolations(report, betas) { - if (!Permissions.canUseViolations(betas)) { +function transactionThreadHasViolations(report: Report, betas: Beta[]): boolean { + if (!Permissions.canUseViolations(betas) || !reportActions) { return false; } if (!report.parentReportActionID) { return false; } - - const parentReportAction = lodashGet(reportActions, `${report.parentReportID}.${report.parentReportActionID}`); + const parentReportAction = reportActions[`${report.parentReportID}`]?.[`${report.parentReportActionID}`]; if (!parentReportAction) { return false; } - // eslint-disable-next-line es/no-nullish-coalescing-operators - const transactionID = parentReportAction.originalMessage.IOUTransactionID ?? 0; - if (!transactionID) { - return false; - } - // eslint-disable-next-line es/no-nullish-coalescing-operators - const reportID = parentReportAction.originalMessage.IOUReportID ?? 0; - if (!reportID) { + const transactionID = isOriginalMessageIOU(parentReportAction?.originalMessage as OriginalMessage) + ? (parentReportAction.originalMessage as OriginalMessageIOU).originalMessage.IOUTransactionID + : ''; + const reportID = isOriginalMessageIOU(parentReportAction?.originalMessage as OriginalMessage) + ? (parentReportAction.originalMessage as OriginalMessageIOU).originalMessage.IOUReportID + : ''; + if (!transactionID || !reportID) { return false; } if (!isCurrentUserSubmitter(reportID)) { @@ -3441,14 +3438,9 @@ function transactionThreadHasViolations(report, betas) { return transactionHasViolation(transactionID); } -/** - * @param {String} reportID - * @returns {Boolean} - */ - -function reportHasViolations(reportID) { +function reportHasViolations(reportID: string): boolean { const transactions = TransactionUtils.getAllReportTransactions(reportID); - return _.some(transactions, (transaction) => transactionHasViolation(transaction.transactionID)); + return transactions.some((transaction) => transactionHasViolation(transaction.transactionID)); } /** @@ -3524,7 +3516,7 @@ function shouldReportBeInOptionList( } // Always show IOU reports with violations - if (isExpenseRequest(report) && transactionThreadHasViolations(report)) { + if (isExpenseRequest(report) && transactionThreadHasViolations(report, betas)) { return true; } diff --git a/src/types/onyx/OriginalMessage.ts b/src/types/onyx/OriginalMessage.ts index c5d9c27d34a1..6e12a7d286e7 100644 --- a/src/types/onyx/OriginalMessage.ts +++ b/src/types/onyx/OriginalMessage.ts @@ -223,4 +223,4 @@ type OriginalMessage = | OriginalMessageMoved; export default OriginalMessage; -export type {ChronosOOOEvent, Decision, Reaction, ActionName, IOUMessage, Closed, OriginalMessageActionName, ChangeLog}; +export type {ChronosOOOEvent, Decision, Reaction, ActionName, IOUMessage, Closed, OriginalMessageActionName, OriginalMessageIOU, ChangeLog}; diff --git a/src/types/onyx/TransactionViolation.ts b/src/types/onyx/TransactionViolation.ts index fa7f212aa794..02db3921c573 100644 --- a/src/types/onyx/TransactionViolation.ts +++ b/src/types/onyx/TransactionViolation.ts @@ -2,25 +2,36 @@ * @module TransactionViolation * @description Transaction Violation */ +import PropTypes from 'prop-types'; /** - * Names of the various Transaction Violation types + * Names of the various Transaction Violation types. + * Defined as an array so it can be used in `PropTypes.oneOf` */ -type ViolationName = - | 'perDayLimit' - | 'maxAge' - | 'overLimit' - | 'overLimitAttendee' - | 'overCategoryLimit' - | 'receiptRequired' - | 'missingCategory' - | 'categoryOutOfPolicy' - | 'missingTag' - | 'tagOutOfPolicy' - | 'missingComment' - | 'taxRequired' - | 'taxOutOfPolicy' - | 'billableExpense'; +const violationNames = [ + 'perDayLimit', + 'maxAge', + 'overLimit', + 'overLimitAttendee', + 'overCategoryLimit', + 'receiptRequired', + 'missingCategory', + 'categoryOutOfPolicy', + 'missingTag', + 'tagOutOfPolicy', + 'missingComment', + 'taxRequired', + 'taxOutOfPolicy', + 'billableExpense', +] as const; + +/** + * Names of the various Transaction Violation types. + * + * The list is first defined as an array so it can be used in `PropTypes.oneOf`, and + * converted to a union type here for use in typescript. + */ +type ViolationName = (typeof violationNames)[number]; type ViolationType = string; @@ -31,6 +42,16 @@ type TransactionViolation = { data?: Record; }; -type TransactionViolations = Record; +const transactionViolationPropType = PropTypes.shape({ + type: PropTypes.string.isRequired, + name: PropTypes.oneOf(violationNames).isRequired, + userMessage: PropTypes.string.isRequired, + data: PropTypes.objectOf(PropTypes.string), +}); + +const transactionViolationsPropTypes = PropTypes.arrayOf(transactionViolationPropType); + +export default TransactionViolation; +export {transactionViolationPropType, transactionViolationsPropTypes}; -export type {TransactionViolation, TransactionViolations, ViolationName, ViolationType}; +export type {ViolationName, ViolationType}; diff --git a/src/types/onyx/index.ts b/src/types/onyx/index.ts index e7b9c7661c79..ad1e1c17d6ca 100644 --- a/src/types/onyx/index.ts +++ b/src/types/onyx/index.ts @@ -42,6 +42,7 @@ import SecurityGroup from './SecurityGroup'; import Session from './Session'; import Task from './Task'; import Transaction from './Transaction'; +import TransactionViolation from './TransactionViolation'; import User from './User'; import UserLocation from './UserLocation'; import UserWallet from './UserWallet'; @@ -103,6 +104,7 @@ export type { Session, Task, Transaction, + TransactionViolation, User, UserWallet, WalletAdditionalDetails, From f7fa4bf321fd2851d37e5c35a26c5a6149b637bf Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 29 Nov 2023 09:30:35 -0500 Subject: [PATCH 019/583] Finally got the tests up and working correctly --- src/components/LHNOptionsList/LHNOptionsList.js | 3 ++- tests/unit/SidebarFilterTest.js | 6 ------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/components/LHNOptionsList/LHNOptionsList.js b/src/components/LHNOptionsList/LHNOptionsList.js index 605ad761240a..4a2d13d716c4 100644 --- a/src/components/LHNOptionsList/LHNOptionsList.js +++ b/src/components/LHNOptionsList/LHNOptionsList.js @@ -80,7 +80,7 @@ const defaultProps = { personalDetails: {}, transactions: {}, draftComments: {}, - betas: {}, + betas: [], ...withCurrentReportIDDefaultProps, }; @@ -194,6 +194,7 @@ export default compose( }, betas: { key: ONYXKEYS.BETAS, + initialValue: [], }, }), )(LHNOptionsList); diff --git a/tests/unit/SidebarFilterTest.js b/tests/unit/SidebarFilterTest.js index f54b2a6f5c95..362990e113ad 100644 --- a/tests/unit/SidebarFilterTest.js +++ b/tests/unit/SidebarFilterTest.js @@ -111,7 +111,6 @@ describe('Sidebar', () => { // When Onyx is updated to contain that report .then(() => Onyx.multiSet({ - [ONYXKEYS.BETAS]: [CONST.BETAS.VIOLATIONS], [`${ONYXKEYS.COLLECTION.REPORT}${report.reportID}`]: report, [ONYXKEYS.PERSONAL_DETAILS_LIST]: LHNTestUtils.fakePersonalDetails, [ONYXKEYS.IS_LOADING_REPORT_DATA]: false, @@ -142,7 +141,6 @@ describe('Sidebar', () => { // When Onyx is updated to contain that data and the sidebar re-renders .then(() => Onyx.multiSet({ - [ONYXKEYS.BETAS]: [CONST.BETAS.VIOLATIONS], [ONYXKEYS.PERSONAL_DETAILS_LIST]: LHNTestUtils.fakePersonalDetails, [ONYXKEYS.IS_LOADING_REPORT_DATA]: false, [`${ONYXKEYS.COLLECTION.REPORT}${report.reportID}`]: report, @@ -195,7 +193,6 @@ describe('Sidebar', () => { // When Onyx is updated to contain that data and the sidebar re-renders .then(() => Onyx.multiSet({ - [ONYXKEYS.BETAS]: [CONST.BETAS.VIOLATIONS], [ONYXKEYS.PERSONAL_DETAILS_LIST]: LHNTestUtils.fakePersonalDetails, [ONYXKEYS.IS_LOADING_REPORT_DATA]: false, [`${ONYXKEYS.COLLECTION.REPORT}${report1.reportID}`]: report1, @@ -247,7 +244,6 @@ describe('Sidebar', () => { // When Onyx is updated to contain that data and the sidebar re-renders .then(() => Onyx.multiSet({ - [ONYXKEYS.BETAS]: [CONST.BETAS.VIOLATIONS], [ONYXKEYS.PERSONAL_DETAILS_LIST]: LHNTestUtils.fakePersonalDetails, [ONYXKEYS.IS_LOADING_REPORT_DATA]: false, [`${ONYXKEYS.COLLECTION.REPORT}${report.reportID}`]: report, @@ -380,7 +376,6 @@ describe('Sidebar', () => { // When Onyx is updated to contain that data and the sidebar re-renders .then(() => Onyx.multiSet({ - [ONYXKEYS.BETAS]: [CONST.BETAS.VIOLATIONS], [ONYXKEYS.NVP_PRIORITY_MODE]: CONST.PRIORITY_MODE.GSD, [ONYXKEYS.PERSONAL_DETAILS_LIST]: LHNTestUtils.fakePersonalDetails, [ONYXKEYS.IS_LOADING_REPORT_DATA]: false, @@ -452,7 +447,6 @@ describe('Sidebar', () => { // When Onyx is updated to contain that data and the sidebar re-renders .then(() => Onyx.multiSet({ - [ONYXKEYS.BETAS]: [CONST.BETAS.VIOLATIONS], [ONYXKEYS.NVP_PRIORITY_MODE]: CONST.PRIORITY_MODE.GSD, [ONYXKEYS.PERSONAL_DETAILS_LIST]: LHNTestUtils.fakePersonalDetails, [ONYXKEYS.IS_LOADING_REPORT_DATA]: false, From 02fa71460eaddce5f1c10d543c4702005da7963d Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 29 Nov 2023 10:31:23 -0500 Subject: [PATCH 020/583] Fixed types and property checks for violations --- src/libs/ReportUtils.ts | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index af57a2969b5b..d06a8baa2dae 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3401,17 +3401,13 @@ function shouldHideReport(report: OnyxEntry, currentReportId: string): b } function transactionHasViolation(transactionID: string): boolean { - const violations = transactionViolations ? transactionViolations?.[transactionID] : []; + const violations = transactionViolations ? transactionViolations[transactionID]?.values : []; if (!violations) { return false; } return violations.some((violation: TransactionViolation) => violation.type === 'violation'); } -function isOriginalMessageIOU(message: OriginalMessage): message is OriginalMessageIOU { - return (message as OriginalMessageIOU).actionName === CONST.REPORT.ACTIONS.TYPE.IOU; -} - function transactionThreadHasViolations(report: Report, betas: Beta[]): boolean { if (!Permissions.canUseViolations(betas) || !reportActions) { return false; @@ -3423,12 +3419,11 @@ function transactionThreadHasViolations(report: Report, betas: Beta[]): boolean if (!parentReportAction) { return false; } - const transactionID = isOriginalMessageIOU(parentReportAction?.originalMessage as OriginalMessage) - ? (parentReportAction.originalMessage as OriginalMessageIOU).originalMessage.IOUTransactionID - : ''; - const reportID = isOriginalMessageIOU(parentReportAction?.originalMessage as OriginalMessage) - ? (parentReportAction.originalMessage as OriginalMessageIOU).originalMessage.IOUReportID - : ''; + if (parentReportAction.actionName !== CONST.REPORT.ACTIONS.TYPE.IOU) { + return false; + } + const transactionID = parentReportAction?.originalMessage?.IOUTransactionID; + const reportID = parentReportAction?.originalMessage?.IOUReportID; if (!transactionID || !reportID) { return false; } From ddaf7b98934418ac7e9bb1db33aaad9401020b01 Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Thu, 30 Nov 2023 14:29:53 +0100 Subject: [PATCH 021/583] TS migration --- src/libs/PersonalDetailsUtils.js | 8 +- src/libs/ReportUtils.ts | 2 +- src/libs/actions/Policy.ts | 626 ++++++++++---------- src/pages/workspace/WorkspaceMembersPage.js | 2 + src/types/onyx/Policy.ts | 56 +- src/types/onyx/Report.ts | 7 +- 6 files changed, 369 insertions(+), 332 deletions(-) diff --git a/src/libs/PersonalDetailsUtils.js b/src/libs/PersonalDetailsUtils.js index 560480dcec9d..ec7efa7ffa28 100644 --- a/src/libs/PersonalDetailsUtils.js +++ b/src/libs/PersonalDetailsUtils.js @@ -79,7 +79,7 @@ function getAccountIDsByLogins(logins) { /** * Given a list of accountIDs, find the associated personal detail and return related logins. * - * @param {Array} accountIDs Array of user accountIDs + * @param {Array} accountIDs Array of user accountIDs * @returns {Array} - Array of logins according to passed accountIDs */ function getLoginsByAccountIDs(accountIDs) { @@ -101,7 +101,11 @@ function getLoginsByAccountIDs(accountIDs) { * * @param {Array} logins Array of user logins * @param {Array} accountIDs Array of user accountIDs - * @returns {Object} - Object with optimisticData, successData and failureData (object of personal details objects) + * @typedef {Object} OnyxData + * @property {Array} optimisticData + * @property {Array} successData + * @property {Array} failureData + * @returns {OnyxData} - Object with optimisticData, successData and failureData (object of personal details objects) */ function getNewPersonalDetailsOnyxData(logins, accountIDs) { const optimisticData = {}; diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index d93661778b83..66207bcd741c 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -4383,4 +4383,4 @@ export { canEditWriteCapability, }; -export type {OptionData}; +export type {OptionData, OptimisticClosedReportAction}; diff --git a/src/libs/actions/Policy.ts b/src/libs/actions/Policy.ts index bcc371b3a609..200eb00f4822 100644 --- a/src/libs/actions/Policy.ts +++ b/src/libs/actions/Policy.ts @@ -1,11 +1,10 @@ import {PUBLIC_DOMAINS} from 'expensify-common/lib/CONST'; import Str from 'expensify-common/lib/str'; import {escapeRegExp} from 'lodash'; -import filter from 'lodash/filter'; -import lodashGet from 'lodash/get'; +import lodashClone from 'lodash/clone'; import lodashUnion from 'lodash/union'; -import Onyx from 'react-native-onyx'; -import _ from 'underscore'; +import Onyx, {OnyxCollection, OnyxUpdate} from 'react-native-onyx'; +import {OnyxEntry} from 'react-native-onyx/lib/types'; import * as API from '@libs/API'; import DateUtils from '@libs/DateUtils'; import * as ErrorUtils from '@libs/ErrorUtils'; @@ -15,11 +14,16 @@ import * as OptionsListUtils from '@libs/OptionsListUtils'; import * as PersonalDetailsUtils from '@libs/PersonalDetailsUtils'; import * as ReportActionsUtils from '@libs/ReportActionsUtils'; import * as ReportUtils from '@libs/ReportUtils'; +import {OptimisticClosedReportAction} from '@libs/ReportUtils'; import * as TransactionUtils from '@libs/TransactionUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; +import {Network, PersonalDetails, Policy, PolicyMember, RecentlyUsedCategories, ReimbursementAccount, Report, ReportAction, Transaction} from '@src/types/onyx'; +import {Errors} from '@src/types/onyx/OnyxCommon'; +import {CustomUnit, NewCustomUnit} from '@src/types/onyx/Policy'; +import {isNotEmptyObject} from '@src/types/utils/EmptyObject'; -const allPolicies = {}; +const allPolicies: OnyxCollection = {}; Onyx.connect({ key: ONYXKEYS.COLLECTION.POLICY, callback: (val, key) => { @@ -34,7 +38,11 @@ Onyx.connect({ const policyReports = ReportUtils.getAllPolicyReports(policyID); const cleanUpMergeQueries = {}; const cleanUpSetQueries = {}; - _.each(policyReports, ({reportID}) => { + policyReports.forEach((policyReport) => { + if (!policyReport) { + return; + } + const {reportID} = policyReport; cleanUpMergeQueries[`${ONYXKEYS.COLLECTION.REPORT}${reportID}`] = {hasDraft: false}; cleanUpSetQueries[`${ONYXKEYS.COLLECTION.REPORT_DRAFT_COMMENT}${reportID}`] = null; cleanUpSetQueries[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS_DRAFTS}${reportID}`] = null; @@ -49,14 +57,19 @@ Onyx.connect({ }, }); -let allPolicyMembers; +let allPolicyMembers: OnyxCollection; Onyx.connect({ key: ONYXKEYS.COLLECTION.POLICY_MEMBERS, waitForCollectionCallback: true, - callback: (val) => (allPolicyMembers = val), + // callback: (val) => (allPolicyMembers = val), + callback: (val) => { + // console.log('POLICYMEMBERS', val); + // console.log('TYPEPOLICYMEMBERS', typeof Object.keys(val)[0]); + allPolicyMembers = val; + }, }); -let lastAccessedWorkspacePolicyID = null; +let lastAccessedWorkspacePolicyID: OnyxEntry = null; Onyx.connect({ key: ONYXKEYS.LAST_ACCESSED_WORKSPACE_POLICY_ID, callback: (value) => (lastAccessedWorkspacePolicyID = value), @@ -67,67 +80,63 @@ let sessionAccountID = 0; Onyx.connect({ key: ONYXKEYS.SESSION, callback: (val) => { - sessionEmail = lodashGet(val, 'email', ''); - sessionAccountID = lodashGet(val, 'accountID', 0); + sessionEmail = val?.email ?? ''; + sessionAccountID = val?.accountID ?? 0; }, }); -let allPersonalDetails; +let allPersonalDetails: OnyxEntry>; Onyx.connect({ key: ONYXKEYS.PERSONAL_DETAILS_LIST, callback: (val) => (allPersonalDetails = val), }); -let reimbursementAccount; +let reimbursementAccount: OnyxEntry; Onyx.connect({ key: ONYXKEYS.REIMBURSEMENT_ACCOUNT, callback: (val) => (reimbursementAccount = val), }); -let allRecentlyUsedCategories = {}; +let allRecentlyUsedCategories: OnyxCollection = {}; Onyx.connect({ key: ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_CATEGORIES, waitForCollectionCallback: true, callback: (val) => (allRecentlyUsedCategories = val), }); -let networkStatus = {}; +let networkStatus: OnyxEntry = {}; Onyx.connect({ key: ONYXKEYS.NETWORK, - waitForCollectionCallback: true, callback: (val) => (networkStatus = val), }); /** * Stores in Onyx the policy ID of the last workspace that was accessed by the user - * @param {String|null} policyID */ -function updateLastAccessedWorkspace(policyID) { +function updateLastAccessedWorkspace(policyID: OnyxEntry) { Onyx.set(ONYXKEYS.LAST_ACCESSED_WORKSPACE_POLICY_ID, policyID); } /** * Check if the user has any active free policies (aka workspaces) - * - * @param {Array} policies - * @returns {Boolean} + */ -function hasActiveFreePolicy(policies) { - const adminFreePolicies = _.filter(policies, (policy) => policy && policy.type === CONST.POLICY.TYPE.FREE && policy.role === CONST.POLICY.ROLE.ADMIN); +function hasActiveFreePolicy(policies: Array> | Record>): boolean { + const adminFreePolicies = Object.values(policies).filter((policy) => policy && policy.type === CONST.POLICY.TYPE.FREE && policy.role === CONST.POLICY.ROLE.ADMIN); if (adminFreePolicies.length === 0) { return false; } - if (_.some(adminFreePolicies, (policy) => !policy.pendingAction)) { + if (adminFreePolicies.some((policy) => !policy?.pendingAction)) { return true; } - if (_.some(adminFreePolicies, (policy) => policy.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD)) { + if (adminFreePolicies.some((policy) => policy?.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD)) { return true; } - if (_.some(adminFreePolicies, (policy) => policy.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE)) { + if (adminFreePolicies.some((policy) => policy?.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE)) { return false; } @@ -138,14 +147,14 @@ function hasActiveFreePolicy(policies) { /** * Delete the workspace - * - * @param {String} policyID - * @param {Array} reports - * @param {String} policyName */ -function deleteWorkspace(policyID, reports, policyName) { - const filteredPolicies = filter(allPolicies, (policy) => policy.id !== policyID); - const optimisticData = [ +function deleteWorkspace(policyID: string, reports: Report[], policyName: string) { + if (!allPolicies) { + return; + } + + const filteredPolicies = Object.values(allPolicies).filter((policy) => policy?.id !== policyID); + const optimisticData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, @@ -154,32 +163,32 @@ function deleteWorkspace(policyID, reports, policyName) { errors: null, }, }, - ..._.map(reports, ({reportID}) => ({ + ...reports.map(({reportID}) => ({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`, value: { stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, statusNum: CONST.REPORT.STATUS.CLOSED, hasDraft: false, - oldPolicyName: allPolicies[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`].name, + oldPolicyName: allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]?.name, }, })), - ..._.map(reports, ({reportID}) => ({ + ...reports.map(({reportID}) => ({ onyxMethod: Onyx.METHOD.SET, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS_DRAFTS}${reportID}`, value: null, })), // Add closed actions to all chat reports linked to this policy - ..._.map(reports, ({reportID, ownerAccountID}) => { + ...reports.map(({reportID, ownerAccountID}) => { // Announce & admin chats have FAKE owners, but workspace chats w/ users do have owners. - let emailClosingReport = CONST.POLICY.OWNER_EMAIL_FAKE; - if (ownerAccountID !== CONST.POLICY.OWNER_ACCOUNT_ID_FAKE) { - emailClosingReport = lodashGet(allPersonalDetails, [ownerAccountID, 'login'], ''); + let emailClosingReport: string = CONST.POLICY.OWNER_EMAIL_FAKE; + if (!!ownerAccountID && ownerAccountID !== CONST.POLICY.OWNER_ACCOUNT_ID_FAKE) { + emailClosingReport = allPersonalDetails?.[ownerAccountID]?.login ?? ''; } const optimisticClosedReportAction = ReportUtils.buildOptimisticClosedReportAction(emailClosingReport, policyName, CONST.REPORT.ARCHIVE_REASON.POLICY_DELETED); - const optimisticReportActions = {}; + const optimisticReportActions: Record = {}; optimisticReportActions[optimisticClosedReportAction.reportActionID] = optimisticClosedReportAction; return { onyxMethod: Onyx.METHOD.MERGE, @@ -202,8 +211,8 @@ function deleteWorkspace(policyID, reports, policyName) { ]; // Restore the old report stateNum and statusNum - const failureData = [ - ..._.map(reports, ({reportID, stateNum, statusNum, hasDraft, oldPolicyName}) => ({ + const failureData: OnyxUpdate[] = [ + ...reports.map(({reportID, stateNum, statusNum, hasDraft, oldPolicyName}) => ({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`, value: { @@ -217,14 +226,14 @@ function deleteWorkspace(policyID, reports, policyName) { onyxMethod: Onyx.METHOD.MERGE, key: ONYXKEYS.REIMBURSEMENT_ACCOUNT, value: { - errors: lodashGet(reimbursementAccount, 'errors', null), + errors: reimbursementAccount?.errors ?? null, }, }, ]; // We don't need success data since the push notification will update // the onyxData for all connected clients. - const successData = []; + const successData: OnyxUpdate[] = []; API.write('DeleteWorkspace', {policyID}, {optimisticData, successData, failureData}); // Reset the lastAccessedWorkspacePolicyID @@ -235,84 +244,87 @@ function deleteWorkspace(policyID, reports, policyName) { /** * Is the user an admin of a free policy (aka workspace)? - * - * @param {Record} [policies] - * @returns {Boolean} */ -function isAdminOfFreePolicy(policies) { - return _.some(policies, (policy) => policy && policy.type === CONST.POLICY.TYPE.FREE && policy.role === CONST.POLICY.ROLE.ADMIN); +function isAdminOfFreePolicy(policies: Record): boolean { + return Object.values(policies).some((policy) => policy && policy.type === CONST.POLICY.TYPE.FREE && policy.role === CONST.POLICY.ROLE.ADMIN); } +type AnnounceRoomMembers = { + onyxOptimisticData: OnyxUpdate[]; + onyxFailureData: OnyxUpdate[]; +}; + /** - * Build optimistic data for adding members to the announce room - * @param {String} policyID - * @param {Array} accountIDs - * @returns {Object} + * Build optimistic data for adding members to the announcement room */ -function buildAnnounceRoomMembersOnyxData(policyID, accountIDs) { +function buildAnnounceRoomMembersOnyxData(policyID: string, accountIDs: number[]) { const announceReport = ReportUtils.getRoom(CONST.REPORT.CHAT_TYPE.POLICY_ANNOUNCE, policyID); - const announceRoomMembers = { + const announceRoomMembers: AnnounceRoomMembers = { onyxOptimisticData: [], onyxFailureData: [], }; - announceRoomMembers.onyxOptimisticData.push({ - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${announceReport.reportID}`, - value: { - participantAccountIDs: [...announceReport.participantAccountIDs, ...accountIDs], - }, - }); + if (announceReport?.participantAccountIDs) { + announceRoomMembers.onyxOptimisticData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${announceReport?.reportID}`, + value: { + participantAccountIDs: [...announceReport.participantAccountIDs, ...accountIDs], + }, + }); + } announceRoomMembers.onyxFailureData.push({ onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${announceReport.reportID}`, + key: `${ONYXKEYS.COLLECTION.REPORT}${announceReport?.reportID}`, value: { - participantAccountIDs: announceReport.participantAccountIDs, + participantAccountIDs: announceReport?.participantAccountIDs, }, }); return announceRoomMembers; } +type OptimisticAnnounceRoomMembers = { + onyxOptimisticData: OnyxUpdate[]; + onyxFailureData: OnyxUpdate[]; +}; + /** - * Build optimistic data for removing users from the announce room - * @param {String} policyID - * @param {Array} accountIDs - * @returns {Object} + * Build optimistic data for removing users from the announcement room */ -function removeOptimisticAnnounceRoomMembers(policyID, accountIDs) { +function removeOptimisticAnnounceRoomMembers(policyID: string, accountIDs: string[]) { const announceReport = ReportUtils.getRoom(CONST.REPORT.CHAT_TYPE.POLICY_ANNOUNCE, policyID); - const announceRoomMembers = { + const announceRoomMembers: OptimisticAnnounceRoomMembers = { onyxOptimisticData: [], onyxFailureData: [], }; - const remainUsers = _.difference(announceReport.participantAccountIDs, accountIDs); - announceRoomMembers.onyxOptimisticData.push({ - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${announceReport.reportID}`, - value: { - participantAccountIDs: [...remainUsers], - }, - }); + if (announceReport?.participantAccountIDs) { + const remainUsers = announceReport.participantAccountIDs.filter((e) => !accountIDs.includes(e)); + announceRoomMembers.onyxOptimisticData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${announceReport.reportID}`, + value: { + participantAccountIDs: [...remainUsers], + }, + }); + + announceRoomMembers.onyxFailureData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${announceReport.reportID}`, + value: { + participantAccountIDs: announceReport.participantAccountIDs, + }, + }); + } - announceRoomMembers.onyxFailureData.push({ - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${announceReport.reportID}`, - value: { - participantAccountIDs: announceReport.participantAccountIDs, - }, - }); return announceRoomMembers; } /** * Remove the passed members from the policy employeeList - * - * @param {Array} accountIDs - * @param {String} policyID */ -function removeMembers(accountIDs, policyID) { +function removeMembers(accountIDs: string[], policyID: string) { // In case user selects only themselves (admin), their email will be filtered out and the members // array passed will be empty, prevent the function from proceeding in that case as there is no one to remove if (accountIDs.length === 0) { @@ -322,21 +334,28 @@ function removeMembers(accountIDs, policyID) { const membersListKey = `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`; const policy = ReportUtils.getPolicy(policyID); const workspaceChats = ReportUtils.getWorkspaceChats(policyID, accountIDs); - const optimisticClosedReportActions = _.map(workspaceChats, () => - ReportUtils.buildOptimisticClosedReportAction(sessionEmail, policy.name, CONST.REPORT.ARCHIVE_REASON.REMOVED_FROM_POLICY), - ); + const optimisticClosedReportActions = workspaceChats.map(() => ReportUtils.buildOptimisticClosedReportAction(sessionEmail, policy.name, CONST.REPORT.ARCHIVE_REASON.REMOVED_FROM_POLICY)); const announceRoomMembers = removeOptimisticAnnounceRoomMembers(policyID, accountIDs); + const optimisticMembersState: Record = {}; + const successMembersState: Record = {}; + const failureMembersState: Record = {}; + accountIDs.forEach((accountID) => { + optimisticMembersState[accountID] = {pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE}; + successMembersState[accountID] = null; + failureMembersState[accountID] = {errors: ErrorUtils.getMicroSecondOnyxError('workspace.people.error.genericRemove')}; + }); + const optimisticData = [ { onyxMethod: Onyx.METHOD.MERGE, key: membersListKey, - value: _.object(accountIDs, Array(accountIDs.length).fill({pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE})), + value: optimisticMembersState, }, - ..._.map(workspaceChats, (report) => ({ + ...workspaceChats.map((report) => ({ onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${report.reportID}`, + key: `${ONYXKEYS.COLLECTION.REPORT}${report?.reportID}`, value: { statusNum: CONST.REPORT.STATUS.CLOSED, stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, @@ -344,9 +363,9 @@ function removeMembers(accountIDs, policyID) { hasDraft: false, }, })), - ..._.map(optimisticClosedReportActions, (reportAction, index) => ({ + ...optimisticClosedReportActions.map((reportAction, index) => ({ onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${workspaceChats[index].reportID}`, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${workspaceChats?.[index]?.reportID}`, value: {[reportAction.reportActionID]: reportAction}, })), ...announceRoomMembers.onyxOptimisticData, @@ -354,15 +373,20 @@ function removeMembers(accountIDs, policyID) { // If the policy has primaryLoginsInvited, then it displays informative messages on the members page about which primary logins were added by secondary logins. // If we delete all these logins then we should clear the informative messages since they are no longer relevant. - if (!_.isEmpty(policy.primaryLoginsInvited)) { + if (isNotEmptyObject(policy?.primaryLoginsInvited ?? {})) { // Take the current policy members and remove them optimistically - const policyMemberAccountIDs = _.map(allPolicyMembers[`${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`], (value, key) => Number(key)); - const remainingMemberAccountIDs = _.difference(policyMemberAccountIDs, accountIDs); - const remainingLogins = PersonalDetailsUtils.getLoginsByAccountIDs(remainingMemberAccountIDs); - const invitedPrimaryToSecondaryLogins = _.invert(policy.primaryLoginsInvited); + // console.log('POLICYMEMBERS', allPolicyMembers); + const policyMemberAccountIDs = Object.keys(allPolicyMembers?.[`${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`] ?? {}); + const remainingMemberAccountIDs = policyMemberAccountIDs.filter((e) => !accountIDs.includes(e)); + const remainingLogins: string[] = PersonalDetailsUtils.getLoginsByAccountIDs(remainingMemberAccountIDs); + const invitedPrimaryToSecondaryLogins: Record = {}; + + if (policy.primaryLoginsInvited) { + Object.keys(policy.primaryLoginsInvited).forEach((key) => (invitedPrimaryToSecondaryLogins[policy.primaryLoginsInvited?.[key] ?? ''] = key)); + } // Then, if no remaining members exist that were invited by a secondary login, clear the informative messages - if (!_.some(remainingLogins, (remainingLogin) => Boolean(invitedPrimaryToSecondaryLogins[remainingLogin]))) { + if (!remainingLogins.some((remainingLogin) => Boolean(invitedPrimaryToSecondaryLogins[remainingLogin]))) { optimisticData.push({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, @@ -377,16 +401,18 @@ function removeMembers(accountIDs, policyID) { { onyxMethod: Onyx.METHOD.MERGE, key: membersListKey, - value: _.object(accountIDs, Array(accountIDs.length).fill(null)), + value: successMembersState, }, ]; + + const filteredWorkspaceChats = workspaceChats.filter((e) => e !== null) as Report[]; const failureData = [ { onyxMethod: Onyx.METHOD.MERGE, key: membersListKey, - value: _.object(accountIDs, Array(accountIDs.length).fill({errors: ErrorUtils.getMicroSecondOnyxError('workspace.people.error.genericRemove')})), + value: failureMembersState, }, - ..._.map(workspaceChats, ({reportID, stateNum, statusNum, hasDraft, oldPolicyName = null}) => ({ + ...filteredWorkspaceChats.map(({reportID, stateNum, statusNum, hasDraft, oldPolicyName = null}) => ({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`, value: { @@ -396,9 +422,9 @@ function removeMembers(accountIDs, policyID) { oldPolicyName, }, })), - ..._.map(optimisticClosedReportActions, (reportAction, index) => ({ + ...optimisticClosedReportActions.map((reportAction, index) => ({ onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${workspaceChats[index].reportID}`, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${workspaceChats?.[index]?.reportID}`, value: {[reportAction.reportActionID]: null}, })), ...announceRoomMembers.onyxFailureData, @@ -406,30 +432,41 @@ function removeMembers(accountIDs, policyID) { API.write( 'DeleteMembersFromWorkspace', { - emailList: _.map(accountIDs, (accountID) => allPersonalDetails[accountID].login).join(','), + emailList: accountIDs.map((accountID) => allPersonalDetails?.[accountID].login).join(','), policyID, }, {optimisticData, successData, failureData}, ); } +type WorkspaceMembersChats = { + onyxSuccessData: OnyxUpdate[]; + onyxOptimisticData: OnyxUpdate[]; + onyxFailureData: OnyxUpdate[]; + reportCreationData: Record< + string, + { + reportID: string; + reportActionID?: string; + } + >; +}; + /** * Optimistically create a chat for each member of the workspace, creates both optimistic and success data for onyx. * - * @param {String} policyID - * @param {Object} invitedEmailsToAccountIDs - * @param {Boolean} hasOutstandingChildRequest - * @returns {Object} - object with onyxSuccessData, onyxOptimisticData, and optimisticReportIDs (map login to reportID) + * @returns - object with onyxSuccessData, onyxOptimisticData, and optimisticReportIDs (map login to reportID) */ -function createPolicyExpenseChats(policyID, invitedEmailsToAccountIDs, hasOutstandingChildRequest = false) { - const workspaceMembersChats = { +function createPolicyExpenseChats(policyID: string, invitedEmailsToAccountIDs: Record, hasOutstandingChildRequest = false) { + const workspaceMembersChats: WorkspaceMembersChats = { onyxSuccessData: [], onyxOptimisticData: [], onyxFailureData: [], reportCreationData: {}, }; - _.each(invitedEmailsToAccountIDs, (accountID, email) => { + Object.keys(invitedEmailsToAccountIDs).forEach((email) => { + const accountID = invitedEmailsToAccountIDs[email]; const cleanAccountID = Number(accountID); const login = OptionsListUtils.addSMSDomainIfPhoneNumber(email); @@ -473,7 +510,7 @@ function createPolicyExpenseChats(policyID, invitedEmailsToAccountIDs, hasOutsta workspaceMembersChats.onyxOptimisticData.push({ onyxMethod: Onyx.METHOD.SET, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${optimisticReport.reportID}`, - value: {[optimisticCreatedAction.reportActionID]: optimisticCreatedAction}, + value: {[optimisticCreatedAction.reportActionID]: optimisticCreatedAction as ReportAction}, }); workspaceMembersChats.onyxSuccessData.push({ @@ -508,15 +545,10 @@ function createPolicyExpenseChats(policyID, invitedEmailsToAccountIDs, hasOutsta /** * Adds members to the specified workspace/policyID - * - * @param {Object} invitedEmailsToAccountIDs - * @param {String} welcomeNote - * @param {String} policyID */ -function addMembersToWorkspace(invitedEmailsToAccountIDs, welcomeNote, policyID) { - const membersListKey = `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`; - const logins = _.map(_.keys(invitedEmailsToAccountIDs), (memberLogin) => OptionsListUtils.addSMSDomainIfPhoneNumber(memberLogin)); - const accountIDs = _.values(invitedEmailsToAccountIDs); +function addMembersToWorkspace(invitedEmailsToAccountIDs: Record, welcomeNote: string, policyID: string) { + const logins = Object.keys(invitedEmailsToAccountIDs).map((memberLogin) => OptionsListUtils.addSMSDomainIfPhoneNumber(memberLogin)); + const accountIDs = Object.values(invitedEmailsToAccountIDs); const newPersonalDetailsOnyxData = PersonalDetailsUtils.getNewPersonalDetailsOnyxData(logins, accountIDs); const announceRoomMembers = buildAnnounceRoomMembersOnyxData(policyID, accountIDs); @@ -524,76 +556,80 @@ function addMembersToWorkspace(invitedEmailsToAccountIDs, welcomeNote, policyID) // create onyx data for policy expense chats for each new member const membersChats = createPolicyExpenseChats(policyID, invitedEmailsToAccountIDs); - const optimisticData = [ + const optimisticMembersState: Record = {}; + const failureMembersState: Record = {}; + accountIDs.forEach((accountID) => { + optimisticMembersState[accountID] = {pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD}; + failureMembersState[accountID] = { + errors: ErrorUtils.getMicroSecondOnyxError('workspace.people.error.genericAdd'), + }; + }); + + const optimisticData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, - key: membersListKey, + key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, // Convert to object with each key containing {pendingAction: ‘add’} - value: _.object(accountIDs, Array(accountIDs.length).fill({pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD})), + value: optimisticMembersState, }, - ...newPersonalDetailsOnyxData.optimisticData, + ...(newPersonalDetailsOnyxData.optimisticData as OnyxUpdate[]), ...membersChats.onyxOptimisticData, ...announceRoomMembers.onyxOptimisticData, ]; - const successData = [ + const successData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, - key: membersListKey, + key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, // Convert to object with each key clearing pendingAction, when it is an existing account. // Remove the object, when it is a newly created account. - value: _.reduce( - accountIDs, - (accountIDsWithClearedPendingAction, accountID) => { - let value = null; - const accountAlreadyExists = !_.isEmpty(allPersonalDetails[accountID]); + value: accountIDs.reduce((accountIDsWithClearedPendingAction, accountID) => { + let value = null; + const accountAlreadyExists = isNotEmptyObject(allPersonalDetails?.[accountID]); - if (accountAlreadyExists) { - value = {pendingAction: null, errors: null}; - } + if (accountAlreadyExists) { + value = {pendingAction: null, errors: null}; + } - // eslint-disable-next-line no-param-reassign - accountIDsWithClearedPendingAction[accountID] = value; - - return accountIDsWithClearedPendingAction; - }, - {}, - ), + return {...accountIDsWithClearedPendingAction, [accountID]: value}; + }, {}), }, - ...newPersonalDetailsOnyxData.successData, + ...(newPersonalDetailsOnyxData.successData as OnyxUpdate[]), ...membersChats.onyxSuccessData, ]; - const failureData = [ + const failureData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, - key: membersListKey, + key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, // Convert to object with each key containing the error. We don’t // need to remove the members since that is handled by onClose of OfflineWithFeedback. - value: _.object( - accountIDs, - Array(accountIDs.length).fill({ - errors: ErrorUtils.getMicroSecondOnyxError('workspace.people.error.genericAdd'), - }), - ), + value: failureMembersState, }, - ...newPersonalDetailsOnyxData.failureData, + ...(newPersonalDetailsOnyxData.failureData as OnyxUpdate[]), ...membersChats.onyxFailureData, ...announceRoomMembers.onyxFailureData, ]; - const params = { - employees: JSON.stringify(_.map(logins, (login) => ({email: login}))), + type AddMembersToWorkspaceParams = { + employees: string; + welcomeNote: string; + policyID: string; + reportCreationData?: string; + }; + + const params: AddMembersToWorkspaceParams = { + employees: JSON.stringify(logins.map((login) => ({email: login}))), // Do not escape HTML special chars for welcomeNote as this will be handled in the backend. // See https://github.com/Expensify/App/issues/20081 for more details. welcomeNote, policyID, }; - if (!_.isEmpty(membersChats.reportCreationData)) { + if (isNotEmptyObject(membersChats.reportCreationData)) { params.reportCreationData = JSON.stringify(membersChats.reportCreationData); } API.write('AddMembersToWorkspace', params, {optimisticData, successData, failureData}); @@ -601,12 +637,9 @@ function addMembersToWorkspace(invitedEmailsToAccountIDs, welcomeNote, policyID) /** * Updates a workspace avatar image - * - * @param {String} policyID - * @param {File|Object} file */ -function updateWorkspaceAvatar(policyID, file) { - const optimisticData = [ +function updateWorkspaceAvatar(policyID: string, file: File) { + const optimisticData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, @@ -622,7 +655,7 @@ function updateWorkspaceAvatar(policyID, file) { }, }, ]; - const successData = [ + const successData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, @@ -633,12 +666,12 @@ function updateWorkspaceAvatar(policyID, file) { }, }, ]; - const failureData = [ + const failureData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, value: { - avatar: allPolicies[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`].avatar, + avatar: allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]?.avatar, pendingFields: { avatar: null, }, @@ -651,10 +684,9 @@ function updateWorkspaceAvatar(policyID, file) { /** * Deletes the avatar image for the workspace - * @param {String} policyID */ -function deleteWorkspaceAvatar(policyID) { - const optimisticData = [ +function deleteWorkspaceAvatar(policyID: string) { + const optimisticData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, @@ -669,7 +701,7 @@ function deleteWorkspaceAvatar(policyID) { }, }, ]; - const successData = [ + const successData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, @@ -680,7 +712,7 @@ function deleteWorkspaceAvatar(policyID) { }, }, ]; - const failureData = [ + const failureData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, @@ -699,9 +731,8 @@ function deleteWorkspaceAvatar(policyID) { /** * Clear error and pending fields for the workspace avatar - * @param {String} policyID */ -function clearAvatarErrors(policyID) { +function clearAvatarErrors(policyID: string) { Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, { errorFields: { avatar: null, @@ -715,22 +746,28 @@ function clearAvatarErrors(policyID) { /** * Optimistically update the general settings. Set the general settings as pending until the response succeeds. * If the response fails set a general error message. Clear the error message when updating. - * - * @param {String} policyID - * @param {String} name - * @param {String} currency */ -function updateGeneralSettings(policyID, name, currency) { - const policy = allPolicies[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]; - const distanceUnit = _.find(_.values(policy.customUnits), (unit) => unit.name === CONST.CUSTOM_UNITS.NAME_DISTANCE); - const distanceRate = _.find(_.values(distanceUnit ? distanceUnit.rates : {}), (rate) => rate.name === CONST.CUSTOM_UNITS.DEFAULT_RATE); - const optimisticData = [ +function updateGeneralSettings(policyID: string, name: string, currency: string) { + const policy = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]; + + if (!policy) { + return; + } + + const distanceUnit = Object.values(policy?.customUnits ?? {}).find((unit) => unit.name === CONST.CUSTOM_UNITS.NAME_DISTANCE); + const distanceRate = Object.values(distanceUnit ? distanceUnit.rates : {}).find((rate) => rate.name === CONST.CUSTOM_UNITS.DEFAULT_RATE); + + if (!distanceUnit?.customUnitID || !distanceRate?.customUnitRateID) { + return; + } + + const optimisticData: OnyxUpdate[] = [ { // We use SET because it's faster than merge and avoids a race condition when setting the currency and navigating the user to the Bank account page in confirmCurrencyChangeAndHideModal onyxMethod: Onyx.METHOD.SET, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, value: { - ...allPolicies[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`], + ...((allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`] ?? {}) as Policy), pendingFields: { generalSettings: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, @@ -742,13 +779,13 @@ function updateGeneralSettings(policyID, name, currency) { }, name, outputCurrency: currency, - ...(distanceUnit + ...((distanceUnit ? { customUnits: { [distanceUnit.customUnitID]: { ...distanceUnit, rates: { - [distanceRate.customUnitRateID]: { + [distanceRate?.customUnitRateID]: { ...distanceRate, currency, }, @@ -756,11 +793,11 @@ function updateGeneralSettings(policyID, name, currency) { }, }, } - : {}), + : {}) as Record), }, }, ]; - const successData = [ + const successData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, @@ -771,7 +808,7 @@ function updateGeneralSettings(policyID, name, currency) { }, }, ]; - const failureData = [ + const failureData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, @@ -805,9 +842,9 @@ function updateGeneralSettings(policyID, name, currency) { } /** - * @param {String} policyID The id of the workspace / policy + * @param policyID The id of the workspace / policy */ -function clearWorkspaceGeneralSettingsErrors(policyID) { +function clearWorkspaceGeneralSettingsErrors(policyID: string) { Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, { errorFields: { generalSettings: null, @@ -815,12 +852,8 @@ function clearWorkspaceGeneralSettingsErrors(policyID) { }); } -/** - * @param {String} policyID - * @param {Object} errors - */ -function setWorkspaceErrors(policyID, errors) { - if (!allPolicies[policyID]) { +function setWorkspaceErrors(policyID: string, errors: Errors) { + if (!allPolicies?.[policyID]) { return; } @@ -828,12 +861,7 @@ function setWorkspaceErrors(policyID, errors) { Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {errors}); } -/** - * @param {String} policyID - * @param {String} customUnitID - * @param {String} customUnitRateID - */ -function clearCustomUnitErrors(policyID, customUnitID, customUnitRateID) { +function clearCustomUnitErrors(policyID: string, customUnitID: string, customUnitRateID: string) { Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, { customUnits: { [customUnitID]: { @@ -850,25 +878,21 @@ function clearCustomUnitErrors(policyID, customUnitID, customUnitRateID) { }); } -/** - * @param {String} policyID - */ -function hideWorkspaceAlertMessage(policyID) { - if (!allPolicies[policyID]) { +function hideWorkspaceAlertMessage(policyID: string) { + if (!allPolicies?.[policyID]) { return; } Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {alertMessage: ''}); } -/** - * @param {String} policyID - * @param {Object} currentCustomUnit - * @param {Object} newCustomUnit - * @param {Number} lastModified - */ -function updateWorkspaceCustomUnitAndRate(policyID, currentCustomUnit, newCustomUnit, lastModified) { - const optimisticData = [ +function updateWorkspaceCustomUnitAndRate(policyID: string, currentCustomUnit: CustomUnit, newCustomUnit: NewCustomUnit, lastModified: number) { + // console.log('CUSTOMRATES', newCustomUnit, currentCustomUnit); + if (!currentCustomUnit.customUnitID || !newCustomUnit?.customUnitID || !newCustomUnit.rates?.customUnitRateID || !currentCustomUnit.rates?.customUnitRateID) { + return; + } + + const optimisticData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, @@ -890,7 +914,7 @@ function updateWorkspaceCustomUnitAndRate(policyID, currentCustomUnit, newCustom }, ]; - const successData = [ + const successData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, @@ -910,7 +934,7 @@ function updateWorkspaceCustomUnitAndRate(policyID, currentCustomUnit, newCustom }, ]; - const failureData = [ + const failureData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, @@ -930,13 +954,13 @@ function updateWorkspaceCustomUnitAndRate(policyID, currentCustomUnit, newCustom }, ]; - const newCustomUnitParam = _.clone(newCustomUnit); - newCustomUnitParam.rates = _.omit(newCustomUnitParam.rates, ['pendingAction', 'errors']); + const newCustomUnitParam = lodashClone(newCustomUnit); + newCustomUnitParam.rates = {...newCustomUnitParam.rates, pendingAction: undefined, errors: undefined}; API.write( 'UpdateWorkspaceCustomUnitAndRate', { policyID, - ...(!networkStatus.isOffline && {lastModified}), + ...(!networkStatus?.isOffline && {lastModified}), customUnit: JSON.stringify(newCustomUnitParam), customUnitRate: JSON.stringify(newCustomUnitParam.rates), }, @@ -946,11 +970,8 @@ function updateWorkspaceCustomUnitAndRate(policyID, currentCustomUnit, newCustom /** * Removes an error after trying to delete a member - * - * @param {String} policyID - * @param {Number} accountID */ -function clearDeleteMemberError(policyID, accountID) { +function clearDeleteMemberError(policyID: string, accountID: number) { Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, { [accountID]: { pendingAction: null, @@ -961,11 +982,8 @@ function clearDeleteMemberError(policyID, accountID) { /** * Removes an error after trying to add a member - * - * @param {String} policyID - * @param {Number} accountID */ -function clearAddMemberError(policyID, accountID) { +function clearAddMemberError(policyID: string, accountID: number) { Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, { [accountID]: null, }); @@ -976,10 +994,8 @@ function clearAddMemberError(policyID, accountID) { /** * Removes an error after trying to delete a workspace - * - * @param {String} policyID */ -function clearDeleteWorkspaceError(policyID) { +function clearDeleteWorkspaceError(policyID: string) { Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, { pendingAction: null, errors: null, @@ -988,19 +1004,16 @@ function clearDeleteWorkspaceError(policyID) { /** * Removes the workspace after failure to create. - * - * @param {String} policyID */ -function removeWorkspace(policyID) { +function removeWorkspace(policyID: string) { Onyx.set(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, null); } /** * Generate a policy name based on an email and policy list. - * @param {String} [email] the email to base the workspace name on. If not passed, will use the logged in user's email instead - * @returns {String} + * @param [email] the email to base the workspace name on. If not passed, will use the logged-in user's email instead */ -function generateDefaultWorkspaceName(email = '') { +function generateDefaultWorkspaceName(email = ''): string { const emailParts = email ? email.split('@') : sessionEmail.split('@'); let defaultWorkspaceName = ''; if (!emailParts || emailParts.length !== 2) { @@ -1009,7 +1022,7 @@ function generateDefaultWorkspaceName(email = '') { const username = emailParts[0]; const domain = emailParts[1]; - if (_.includes(PUBLIC_DOMAINS, domain.toLowerCase())) { + if (PUBLIC_DOMAINS.includes(domain.toLowerCase() as (typeof PUBLIC_DOMAINS)[number])) { defaultWorkspaceName = `${Str.UCFirst(username)}'s Workspace`; } else { defaultWorkspaceName = `${Str.UCFirst(domain.split('.')[0])}'s Workspace`; @@ -1019,43 +1032,37 @@ function generateDefaultWorkspaceName(email = '') { defaultWorkspaceName = 'My Group Workspace'; } - if (allPolicies.length === 0) { + if (!isNotEmptyObject(allPolicies ?? {})) { return defaultWorkspaceName; } // find default named workspaces and increment the last number const numberRegEx = new RegExp(`${escapeRegExp(defaultWorkspaceName)} ?(\\d*)`, 'i'); - const lastWorkspaceNumber = _.chain(allPolicies) - .filter((policy) => policy.name && numberRegEx.test(policy.name)) - .map((policy) => parseInt(numberRegEx.exec(policy.name)[1] || 1, 10)) // parse the number at the end - .max() - .value(); + const parsedWorkspaceNumbers = Object.values(allPolicies ?? {}) + .filter((policy) => policy?.name && numberRegEx.test(policy.name)) + .map((policy) => parseInt(numberRegEx.exec(policy?.name ?? '')?.[1] ?? '1', 10)); // parse the number at the end + const lastWorkspaceNumber = Math.max(...parsedWorkspaceNumbers); return lastWorkspaceNumber !== -Infinity ? `${defaultWorkspaceName} ${lastWorkspaceNumber + 1}` : defaultWorkspaceName; } /** * Returns a client generated 16 character hexadecimal value for the policyID - * @returns {String} */ -function generatePolicyID() { +function generatePolicyID(): string { return NumberUtils.generateHexadecimalValue(16); } /** * Returns a client generated 13 character hexadecimal value for a custom unit ID - * @returns {String} */ -function generateCustomUnitID() { +function generateCustomUnitID(): string { return NumberUtils.generateHexadecimalValue(13); } -/** - * @returns {Object} - */ function buildOptimisticCustomUnits() { const customUnitID = generateCustomUnitID(); const customUnitRateID = generateCustomUnitID(); - const customUnits = { + const customUnits: Record = { [customUnitID]: { customUnitID, name: CONST.CUSTOM_UNITS.NAME_DISTANCE, @@ -1082,16 +1089,16 @@ function buildOptimisticCustomUnits() { /** * Optimistically creates a Policy Draft for a new workspace * - * @param {String} [policyOwnerEmail] Optional, the email of the account to make the owner of the policy - * @param {String} [policyName] Optional, custom policy name we will use for created workspace - * @param {String} [policyID] Optional, custom policy id we will use for created workspace - * @param {Boolean} [makeMeAdmin] Optional, leave the calling account as an admin on the policy + * @param [policyOwnerEmail] Optional, the email of the account to make the owner of the policy + * @param [policyName] Optional, custom policy name we will use for created workspace + * @param [policyID] Optional, custom policy id we will use for created workspace + * @param [makeMeAdmin] Optional, leave the calling account as an admin on the policy */ function createDraftInitialWorkspace(policyOwnerEmail = '', policyName = '', policyID = generatePolicyID(), makeMeAdmin = false) { const workspaceName = policyName || generateDefaultWorkspaceName(policyOwnerEmail); const {customUnits} = buildOptimisticCustomUnits(); - const optimisticData = [ + const optimisticData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.SET, key: `${ONYXKEYS.COLLECTION.POLICY_DRAFTS}${policyID}`, @@ -1102,7 +1109,7 @@ function createDraftInitialWorkspace(policyOwnerEmail = '', policyName = '', pol role: CONST.POLICY.ROLE.ADMIN, owner: sessionEmail, isPolicyExpenseChatEnabled: true, - outputCurrency: lodashGet(allPersonalDetails, [sessionAccountID, 'localCurrencyCode'], CONST.CURRENCY.USD), + outputCurrency: allPersonalDetails?.[sessionAccountID]?.localCurrencyCode ?? CONST.CURRENCY.USD, pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, customUnits, makeMeAdmin, @@ -1126,13 +1133,12 @@ function createDraftInitialWorkspace(policyOwnerEmail = '', policyName = '', pol /** * Optimistically creates a new workspace and default workspace chats * - * @param {String} [policyOwnerEmail] Optional, the email of the account to make the owner of the policy - * @param {Boolean} [makeMeAdmin] Optional, leave the calling account as an admin on the policy - * @param {String} [policyName] Optional, custom policy name we will use for created workspace - * @param {String} [policyID] Optional, custom policy id we will use for created workspace - * @returns {String} + * @param [policyOwnerEmail] Optional, the email of the account to make the owner of the policy + * @param [makeMeAdmin] Optional, leave the calling account as an admin on the policy + * @param [policyName] Optional, custom policy name we will use for created workspace + * @param [policyID] Optional, custom policy id we will use for created workspace */ -function createWorkspace(policyOwnerEmail = '', makeMeAdmin = false, policyName = '', policyID = generatePolicyID()) { +function createWorkspace(policyOwnerEmail = '', makeMeAdmin = false, policyName = '', policyID = generatePolicyID()): string { const workspaceName = policyName || generateDefaultWorkspaceName(policyOwnerEmail); const {customUnits, customUnitID, customUnitRateID} = buildOptimisticCustomUnits(); @@ -1181,7 +1187,7 @@ function createWorkspace(policyOwnerEmail = '', makeMeAdmin = false, policyName role: CONST.POLICY.ROLE.ADMIN, owner: sessionEmail, isPolicyExpenseChatEnabled: true, - outputCurrency: lodashGet(allPersonalDetails, [sessionAccountID, 'localCurrencyCode'], CONST.CURRENCY.USD), + outputCurrency: allPersonalDetails?.[sessionAccountID]?.localCurrencyCode ?? CONST.CURRENCY.USD, pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, customUnits, }, @@ -1272,7 +1278,7 @@ function createWorkspace(policyOwnerEmail = '', makeMeAdmin = false, policyName onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${announceChatReportID}`, value: { - [_.keys(announceChatData)[0]]: { + [Object.keys(announceChatData)[0]]: { pendingAction: null, }, }, @@ -1291,7 +1297,7 @@ function createWorkspace(policyOwnerEmail = '', makeMeAdmin = false, policyName onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${adminsChatReportID}`, value: { - [_.keys(adminsChatData)[0]]: { + [Object.keys(adminsChatData)[0]]: { pendingAction: null, }, }, @@ -1310,7 +1316,7 @@ function createWorkspace(policyOwnerEmail = '', makeMeAdmin = false, policyName onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseChatReportID}`, value: { - [_.keys(expenseChatData)[0]]: { + [Object.keys(expenseChatData)[0]]: { pendingAction: null, }, }, @@ -1359,11 +1365,7 @@ function createWorkspace(policyOwnerEmail = '', makeMeAdmin = false, policyName return adminsChatReportID; } -/** - * - * @param {string} policyID - */ -function openWorkspaceReimburseView(policyID) { +function openWorkspaceReimburseView(policyID: string) { if (!policyID) { Log.warn('openWorkspaceReimburseView invalid params', {policyID}); return; @@ -1392,7 +1394,7 @@ function openWorkspaceReimburseView(policyID) { API.read('OpenWorkspaceReimburseView', {policyID}, onyxData); } -function openWorkspaceMembersPage(policyID, clientMemberEmails) { +function openWorkspaceMembersPage(policyID: string, clientMemberEmails: string[]) { if (!policyID || !clientMemberEmails) { Log.warn('openWorkspaceMembersPage invalid params', {policyID, clientMemberEmails}); return; @@ -1404,7 +1406,7 @@ function openWorkspaceMembersPage(policyID, clientMemberEmails) { }); } -function openWorkspaceInvitePage(policyID, clientMemberEmails) { +function openWorkspaceInvitePage(policyID: string, clientMemberEmails: string[]) { if (!policyID || !clientMemberEmails) { Log.warn('openWorkspaceInvitePage invalid params', {policyID, clientMemberEmails}); return; @@ -1416,57 +1418,36 @@ function openWorkspaceInvitePage(policyID, clientMemberEmails) { }); } -/** - * @param {String} policyID - */ -function openDraftWorkspaceRequest(policyID) { +function openDraftWorkspaceRequest(policyID: string) { API.read('OpenDraftWorkspaceRequest', {policyID}); } -/** - * @param {String} policyID - * @param {Object} invitedEmailsToAccountIDs - */ -function setWorkspaceInviteMembersDraft(policyID, invitedEmailsToAccountIDs) { +function setWorkspaceInviteMembersDraft(policyID: string, invitedEmailsToAccountIDs: Record) { Onyx.set(`${ONYXKEYS.COLLECTION.WORKSPACE_INVITE_MEMBERS_DRAFT}${policyID}`, invitedEmailsToAccountIDs); } -/** - * @param {String} policyID - * @param {String} message - */ -function setWorkspaceInviteMessageDraft(policyID, message) { +function setWorkspaceInviteMessageDraft(policyID: string, message: string) { Onyx.set(`${ONYXKEYS.COLLECTION.WORKSPACE_INVITE_MESSAGE_DRAFT}${policyID}`, message); } -/** - * @param {String} policyID - */ -function clearErrors(policyID) { +function clearErrors(policyID: string) { setWorkspaceErrors(policyID, {}); hideWorkspaceAlertMessage(policyID); } /** * Dismiss the informative messages about which policy members were added with primary logins when invited with their secondary login. - * - * @param {String} policyID */ -function dismissAddedWithPrimaryLoginMessages(policyID) { +function dismissAddedWithPrimaryLoginMessages(policyID: string) { Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {primaryLoginsInvited: null}); } -/** - * @param {String} policyID - * @param {String} category - * @returns {Object} - */ -function buildOptimisticPolicyRecentlyUsedCategories(policyID, category) { +function buildOptimisticPolicyRecentlyUsedCategories(policyID: string, category: string) { if (!policyID || !category) { return []; } - const policyRecentlyUsedCategories = lodashGet(allRecentlyUsedCategories, `${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_CATEGORIES}${policyID}`, []); + const policyRecentlyUsedCategories = allRecentlyUsedCategories?.[`${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_CATEGORIES}${policyID}`] ?? []; return lodashUnion([category], policyRecentlyUsedCategories); } @@ -1476,10 +1457,9 @@ function buildOptimisticPolicyRecentlyUsedCategories(policyID, category) { * we create a Collect type workspace when the person taking the action becomes an owner and an admin, while we * add a new member to the workspace as an employee and convert the IOU report passed as a param into an expense report. * - * @param {Object} iouReport - * @returns {String} policyID of the workspace we have created + * @returns policyID of the workspace we have created */ -function createWorkspaceFromIOUPayment(iouReport) { +function createWorkspaceFromIOUPayment(iouReport: Report): string | undefined { // This flow only works for IOU reports if (!ReportUtils.isIOUReport(iouReport)) { return; @@ -1509,6 +1489,10 @@ function createWorkspaceFromIOUPayment(iouReport) { expenseCreatedReportActionID: workspaceChatCreatedReportActionID, } = ReportUtils.buildOptimisticWorkspaceChats(policyID, workspaceName); + if (!employeeAccountID || !employeeEmail) { + return; + } + // Create the workspace chat for the employee whose IOU is being paid const employeeWorkspaceChat = createPolicyExpenseChats(policyID, {[employeeEmail]: employeeAccountID}, true); const newWorkspace = { @@ -1527,7 +1511,7 @@ function createWorkspaceFromIOUPayment(iouReport) { customUnits, }; - const optimisticData = [ + const optimisticData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, @@ -1560,7 +1544,7 @@ function createWorkspaceFromIOUPayment(iouReport) { { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${announceChatReportID}`, - value: announceReportActionData, + value: announceReportActionData as Record, }, { onyxMethod: Onyx.METHOD.MERGE, @@ -1575,7 +1559,7 @@ function createWorkspaceFromIOUPayment(iouReport) { { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${adminsChatReportID}`, - value: adminsReportActionData, + value: adminsReportActionData as Record, }, { onyxMethod: Onyx.METHOD.MERGE, @@ -1590,7 +1574,7 @@ function createWorkspaceFromIOUPayment(iouReport) { { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${workspaceChatReportID}`, - value: workspaceChatReportActionData, + value: workspaceChatReportActionData as Record, }, { onyxMethod: Onyx.METHOD.MERGE, @@ -1605,7 +1589,7 @@ function createWorkspaceFromIOUPayment(iouReport) { ...employeeWorkspaceChat.onyxOptimisticData, ]; - const successData = [ + const successData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, @@ -1625,7 +1609,7 @@ function createWorkspaceFromIOUPayment(iouReport) { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${announceChatReportID}`, value: { - [_.keys(announceChatData)[0]]: { + [Object.keys(announceChatData)[0]]: { pendingAction: null, }, }, @@ -1644,7 +1628,7 @@ function createWorkspaceFromIOUPayment(iouReport) { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${adminsChatReportID}`, value: { - [_.keys(adminsChatData)[0]]: { + [Object.keys(adminsChatData)[0]]: { pendingAction: null, }, }, @@ -1663,7 +1647,7 @@ function createWorkspaceFromIOUPayment(iouReport) { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${workspaceChatReportID}`, value: { - [_.keys(workspaceChatData)[0]]: { + [Object.keys(workspaceChatData)[0]]: { pendingAction: null, }, }, @@ -1671,7 +1655,7 @@ function createWorkspaceFromIOUPayment(iouReport) { ...employeeWorkspaceChat.onyxSuccessData, ]; - const failureData = [ + const failureData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, @@ -1732,7 +1716,7 @@ function createWorkspaceFromIOUPayment(iouReport) { policyID, policyName: workspaceName, type: CONST.REPORT.TYPE.EXPENSE, - total: -iouReport.total, + total: -(iouReport?.total ?? 0), }; optimisticData.push({ onyxMethod: Onyx.METHOD.MERGE, @@ -1749,9 +1733,9 @@ function createWorkspaceFromIOUPayment(iouReport) { const reportTransactions = TransactionUtils.getAllReportTransactions(iouReportID); // For performance reasons, we are going to compose a merge collection data for transactions - const transactionsOptimisticData = {}; - const transactionFailureData = {}; - _.each(reportTransactions, (transaction) => { + const transactionsOptimisticData: Record = {}; + const transactionFailureData: Record = {}; + reportTransactions.forEach((transaction) => { transactionsOptimisticData[`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction.transactionID}`] = { ...transaction, amount: -transaction.amount, diff --git a/src/pages/workspace/WorkspaceMembersPage.js b/src/pages/workspace/WorkspaceMembersPage.js index 09b613350705..4c9bc5ca3a9b 100644 --- a/src/pages/workspace/WorkspaceMembersPage.js +++ b/src/pages/workspace/WorkspaceMembersPage.js @@ -85,6 +85,8 @@ function WorkspaceMembersPage(props) { const isOfflineAndNoMemberDataAvailable = _.isEmpty(props.policyMembers) && props.network.isOffline; const prevPersonalDetails = usePrevious(props.personalDetails); + console.log('POLICY', props.policy); + /** * Get filtered personalDetails list with current policyMembers * @param {Object} policyMembers diff --git a/src/types/onyx/Policy.ts b/src/types/onyx/Policy.ts index e6e3240d1b23..8c24e5d98dca 100644 --- a/src/types/onyx/Policy.ts +++ b/src/types/onyx/Policy.ts @@ -2,6 +2,39 @@ import {ValueOf} from 'type-fest'; import CONST from '@src/CONST'; import * as OnyxCommon from './OnyxCommon'; +type Unit = 'mi' | 'km'; + +type Rate = { + name: string; + rate: number; + currency?: string; + customUnitRateID?: string; + errors?: OnyxCommon.Errors; + pendingAction?: string; +}; + +type NewCustomUnit = { + name: string; + customUnitID?: string; + attributes: { + unit: Unit; + }; + rates: Rate; + pendingAction?: string; + errors?: OnyxCommon.Errors; +}; + +type CustomUnit = { + name: string; + customUnitID?: string; + attributes: { + unit: Unit; + }; + rates: Record; + pendingAction?: string; + errors?: OnyxCommon.Errors; +}; + type Policy = { /** The ID of the policy */ id: string; @@ -19,7 +52,7 @@ type Policy = { owner: string; /** The accountID of the policy owner */ - ownerAccountID: number; + ownerAccountID?: number; /** The output currency for the policy */ outputCurrency: string; @@ -34,7 +67,7 @@ type Policy = { pendingAction?: OnyxCommon.PendingAction; /** A list of errors keyed by microtime */ - errors: OnyxCommon.Errors; + errors?: OnyxCommon.Errors; /** Whether this policy was loaded from a policy summary, or loaded completely with all of its values */ isFromFullPolicy?: boolean; @@ -43,22 +76,33 @@ type Policy = { lastModified?: string; /** The custom units data for this policy */ - customUnits?: Record; + customUnits?: Record; /** Whether chat rooms can be created and used on this policy. Enabled manually by CQ/JS snippet. Always true for free policies. */ - areChatRoomsEnabled: boolean; + areChatRoomsEnabled?: boolean; /** Whether policy expense chats can be created and used on this policy. Enabled manually by CQ/JS snippet. Always true for free policies. */ isPolicyExpenseChatEnabled: boolean; /** Whether the scheduled submit is enabled */ - autoReporting: boolean; + autoReporting?: boolean; /** The scheduled submit frequency set up on the this policy */ - autoReportingFrequency: ValueOf; + autoReportingFrequency?: ValueOf; /** The employee list of the policy */ employeeList?: []; + + makeMeAdmin?: boolean; + + pendingFields?: Record; + + originalFileName?: string; + + alertMessage?: string; + + primaryLoginsInvited?: Record; }; export default Policy; +export type {CustomUnit, NewCustomUnit}; diff --git a/src/types/onyx/Report.ts b/src/types/onyx/Report.ts index 81a92c4bf603..0dea4c635a28 100644 --- a/src/types/onyx/Report.ts +++ b/src/types/onyx/Report.ts @@ -108,8 +108,9 @@ type Report = { lastMessageHtml?: string; welcomeMessage?: string; lastActorAccountID?: number; - ownerAccountID?: number; - participantAccountIDs?: number[]; + ownerAccountID?: string; + ownerEmail?: string; + participantAccountIDs?: string[]; total?: number; currency?: string; parentReportActionIDs?: number[]; @@ -130,6 +131,8 @@ type Report = { /** Pending fields for the report */ pendingFields?: Record; + pendingAction?: string; + /** The ID of the preexisting report (it is possible that we optimistically created a Report for which a report already exists) */ preexistingReportID?: string; From 63ab54424aa8be7377a1f6e8c8ad0fc093659a5a Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Thu, 30 Nov 2023 10:36:15 -0500 Subject: [PATCH 022/583] Added some doc comments and also fixed the violation type --- src/ONYXKEYS.ts | 2 +- src/libs/ReportUtils.ts | 24 ++++++-- src/types/onyx/TransactionViolation.ts | 84 ++++++++++++-------------- src/types/onyx/index.ts | 3 +- 4 files changed, 61 insertions(+), 52 deletions(-) diff --git a/src/ONYXKEYS.ts b/src/ONYXKEYS.ts index 62067a864ed5..fc6d2927a1b1 100755 --- a/src/ONYXKEYS.ts +++ b/src/ONYXKEYS.ts @@ -451,7 +451,7 @@ type OnyxValues = { [ONYXKEYS.COLLECTION.TRANSACTION]: OnyxTypes.Transaction; [ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_TAGS]: OnyxTypes.RecentlyUsedTags; [ONYXKEYS.COLLECTION.SELECTED_TAB]: string; - [ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS]: OnyxTypes.TransactionViolation[]; + [ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS]: OnyxTypes.TransactionViolations; // Forms [ONYXKEYS.FORMS.ADD_DEBIT_CARD_FORM]: OnyxTypes.AddDebitCardForm; diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index d06a8baa2dae..e250d8ad83ff 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -16,9 +16,9 @@ import CONST from '@src/CONST'; import {TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; -import {Beta, Login, PersonalDetails, Policy, PolicyTags, Report, ReportAction, Transaction, TransactionViolation} from '@src/types/onyx'; +import {Beta, Login, PersonalDetails, Policy, PolicyTags, Report, ReportAction, Transaction, TransactionViolation, TransactionViolations} from '@src/types/onyx'; import {Errors, Icon, PendingAction} from '@src/types/onyx/OnyxCommon'; -import OriginalMessage, {ChangeLog, IOUMessage, OriginalMessageActionName, OriginalMessageIOU} from '@src/types/onyx/OriginalMessage'; +import {ChangeLog, IOUMessage, OriginalMessageActionName} from '@src/types/onyx/OriginalMessage'; import {Message, ReportActions} from '@src/types/onyx/ReportAction'; import {Receipt, WaypointCollection} from '@src/types/onyx/Transaction'; import DeepValueOf from '@src/types/utils/DeepValueOf'; @@ -402,7 +402,7 @@ Onyx.connect({ callback: (value) => (loginList = value), }); -const transactionViolations: OnyxCollection = {}; +const transactionViolations: OnyxCollection = {}; Onyx.connect({ key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, callback: (violations, key) => { @@ -3400,14 +3400,24 @@ function shouldHideReport(report: OnyxEntry, currentReportId: string): b return parentReport?.reportID !== report?.reportID && !isChildReportHasComment; } +/** + * + * Check if there are any violations belonging to the transaction in the transactionsViolations Onyx object + * then checks that the violation is of the proper type + */ function transactionHasViolation(transactionID: string): boolean { - const violations = transactionViolations ? transactionViolations[transactionID]?.values : []; + const violations = transactionViolations ? transactionViolations[transactionID]?.value : []; if (!violations) { return false; } return violations.some((violation: TransactionViolation) => violation.type === 'violation'); } +/** + * Checks to see if a report's parentAction is a money request that contains a violation + * This only pertains to report's that a user submitted and if it is open or processing + */ + function transactionThreadHasViolations(report: Report, betas: Beta[]): boolean { if (!Permissions.canUseViolations(betas) || !reportActions) { return false; @@ -3430,9 +3440,15 @@ function transactionThreadHasViolations(report: Report, betas: Beta[]): boolean if (!isCurrentUserSubmitter(reportID)) { return false; } + if (report?.stateNum !== CONST.REPORT.STATE_NUM.OPEN && report?.stateNum !== CONST.REPORT.STATE_NUM.PROCESSING) { + return false; + } return transactionHasViolation(transactionID); } +/** + * Checks to see if a report contains a violation + */ function reportHasViolations(reportID: string): boolean { const transactions = TransactionUtils.getAllReportTransactions(reportID); return transactions.some((transaction) => transactionHasViolation(transaction.transactionID)); diff --git a/src/types/onyx/TransactionViolation.ts b/src/types/onyx/TransactionViolation.ts index 02db3921c573..1bb1f179f601 100644 --- a/src/types/onyx/TransactionViolation.ts +++ b/src/types/onyx/TransactionViolation.ts @@ -1,57 +1,49 @@ /** - * @module TransactionViolation - * @description Transaction Violation + * Names of transaction violations */ -import PropTypes from 'prop-types'; -/** - * Names of the various Transaction Violation types. - * Defined as an array so it can be used in `PropTypes.oneOf` - */ -const violationNames = [ - 'perDayLimit', - 'maxAge', - 'overLimit', - 'overLimitAttendee', - 'overCategoryLimit', - 'receiptRequired', - 'missingCategory', - 'categoryOutOfPolicy', - 'missingTag', - 'tagOutOfPolicy', - 'missingComment', - 'taxRequired', - 'taxOutOfPolicy', - 'billableExpense', -] as const; - -/** - * Names of the various Transaction Violation types. - * - * The list is first defined as an array so it can be used in `PropTypes.oneOf`, and - * converted to a union type here for use in typescript. - */ -type ViolationName = (typeof violationNames)[number]; - -type ViolationType = string; +type ViolationName = + | 'allTagLevelsRequired' + | 'autoReportedRejectedExpense' + | 'billableExpense' + | 'cashExpenseWithNoReceipt' + | 'categoryOutOfPolicy' + | 'conversionSurcharge' + | 'customUnitOutOfPolicy' + | 'duplicatedTransaction' + | 'fieldRequired' + | 'futureDate' + | 'invoiceMarkup' + | 'maxAge' + | 'missingCategory' + | 'missingComment' + | 'missingTag' + | 'modifiedAmount' + | 'modifiedDate' + | 'nonExpensiworksExpense' + | 'overAutoApprovalLimit' + | 'overCategoryLimit' + | 'overLimit' + | 'overLimitAttendee' + | 'perDayLimit' + | 'receiptNotSmartScanned' + | 'receiptRequired' + | 'rter' + | 'smartscanFailed' + | 'someTagLevelsRequired' + | 'tagOutOfPolicy' + | 'taxAmountChanged' + | 'taxOutOfPolicy' + | 'taxRateChanged' + | 'taxRequired'; type TransactionViolation = { - type: ViolationType; + type: string; name: ViolationName; userMessage: string; data?: Record; }; -const transactionViolationPropType = PropTypes.shape({ - type: PropTypes.string.isRequired, - name: PropTypes.oneOf(violationNames).isRequired, - userMessage: PropTypes.string.isRequired, - data: PropTypes.objectOf(PropTypes.string), -}); - -const transactionViolationsPropTypes = PropTypes.arrayOf(transactionViolationPropType); - -export default TransactionViolation; -export {transactionViolationPropType, transactionViolationsPropTypes}; +type TransactionViolations = Record; -export type {ViolationName, ViolationType}; +export type {TransactionViolation, TransactionViolations, ViolationName}; diff --git a/src/types/onyx/index.ts b/src/types/onyx/index.ts index ad1e1c17d6ca..9e81f2025255 100644 --- a/src/types/onyx/index.ts +++ b/src/types/onyx/index.ts @@ -42,7 +42,7 @@ import SecurityGroup from './SecurityGroup'; import Session from './Session'; import Task from './Task'; import Transaction from './Transaction'; -import TransactionViolation from './TransactionViolation'; +import {TransactionViolation, TransactionViolations} from './TransactionViolation'; import User from './User'; import UserLocation from './UserLocation'; import UserWallet from './UserWallet'; @@ -105,6 +105,7 @@ export type { Task, Transaction, TransactionViolation, + TransactionViolations, User, UserWallet, WalletAdditionalDetails, From c69c1df69a7f79a306af37339e07b248dda663ad Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Thu, 30 Nov 2023 11:13:28 -0500 Subject: [PATCH 023/583] Fixed perf test --- tests/perf-test/SidebarUtils.perf-test.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/perf-test/SidebarUtils.perf-test.ts b/tests/perf-test/SidebarUtils.perf-test.ts index 7f9957232cfb..fb3cac24053a 100644 --- a/tests/perf-test/SidebarUtils.perf-test.ts +++ b/tests/perf-test/SidebarUtils.perf-test.ts @@ -3,7 +3,7 @@ import {measureFunction} from 'reassure'; import SidebarUtils from '@libs/SidebarUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import {PersonalDetails} from '@src/types/onyx'; +import {Beta, PersonalDetails} from '@src/types/onyx'; import Policy from '@src/types/onyx/Policy'; import Report from '@src/types/onyx/Report'; import ReportAction, {ReportActions} from '@src/types/onyx/ReportAction'; @@ -51,13 +51,14 @@ test('getOptionData on 5k reports', async () => { const preferredLocale = 'en'; const policy = createRandomPolicy(1); const parentReportAction = createRandomReportAction(1); + const betas: Beta[] = []; Onyx.multiSet({ ...mockedResponseMap, }); await waitForBatchedUpdates(); - await measureFunction(() => SidebarUtils.getOptionData(report, reportActions, personalDetails, preferredLocale, policy, parentReportAction), {runs}); + await measureFunction(() => SidebarUtils.getOptionData(report, reportActions, personalDetails, preferredLocale, policy, parentReportAction, betas), {runs}); }); test('getOrderedReportIDs on 5k reports', async () => { From 5e122efec4221d246d3c9ba87f34bd666454aa07 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Thu, 30 Nov 2023 13:07:34 -0500 Subject: [PATCH 024/583] Removed unnecessary export --- src/types/onyx/OriginalMessage.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types/onyx/OriginalMessage.ts b/src/types/onyx/OriginalMessage.ts index 6c86a6b1be69..0dc532ebeded 100644 --- a/src/types/onyx/OriginalMessage.ts +++ b/src/types/onyx/OriginalMessage.ts @@ -225,4 +225,4 @@ type OriginalMessage = | OriginalMessageMoved; export default OriginalMessage; -export type {ChronosOOOEvent, Decision, Reaction, ActionName, IOUMessage, Closed, OriginalMessageActionName, OriginalMessageIOU, ChangeLog}; +export type {ChronosOOOEvent, Decision, Reaction, ActionName, IOUMessage, Closed, OriginalMessageActionName, ChangeLog}; From e53902e3f60cd1f191e85ef85d8c7175d2fc54c0 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Thu, 30 Nov 2023 13:09:29 -0500 Subject: [PATCH 025/583] Restore betas in test --- tests/unit/SidebarFilterTest.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/unit/SidebarFilterTest.js b/tests/unit/SidebarFilterTest.js index 362990e113ad..23a958e3aa9d 100644 --- a/tests/unit/SidebarFilterTest.js +++ b/tests/unit/SidebarFilterTest.js @@ -141,6 +141,7 @@ describe('Sidebar', () => { // When Onyx is updated to contain that data and the sidebar re-renders .then(() => Onyx.multiSet({ + [ONYXKEYS.BETAS]: [], [ONYXKEYS.PERSONAL_DETAILS_LIST]: LHNTestUtils.fakePersonalDetails, [ONYXKEYS.IS_LOADING_REPORT_DATA]: false, [`${ONYXKEYS.COLLECTION.REPORT}${report.reportID}`]: report, @@ -193,6 +194,7 @@ describe('Sidebar', () => { // When Onyx is updated to contain that data and the sidebar re-renders .then(() => Onyx.multiSet({ + [ONYXKEYS.BETAS]: [], [ONYXKEYS.PERSONAL_DETAILS_LIST]: LHNTestUtils.fakePersonalDetails, [ONYXKEYS.IS_LOADING_REPORT_DATA]: false, [`${ONYXKEYS.COLLECTION.REPORT}${report1.reportID}`]: report1, @@ -244,6 +246,7 @@ describe('Sidebar', () => { // When Onyx is updated to contain that data and the sidebar re-renders .then(() => Onyx.multiSet({ + [ONYXKEYS.BETAS]: [], [ONYXKEYS.PERSONAL_DETAILS_LIST]: LHNTestUtils.fakePersonalDetails, [ONYXKEYS.IS_LOADING_REPORT_DATA]: false, [`${ONYXKEYS.COLLECTION.REPORT}${report.reportID}`]: report, From c49b03f103b401ddddf3b04b9912f152f84d7426 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Thu, 30 Nov 2023 13:25:11 -0500 Subject: [PATCH 026/583] Switch to destructuring --- src/libs/ReportUtils.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 1412cfa73067..809a47195a36 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3448,18 +3448,17 @@ function transactionThreadHasViolations(report: Report, betas: Beta[]): boolean if (parentReportAction.actionName !== CONST.REPORT.ACTIONS.TYPE.IOU) { return false; } - const transactionID = parentReportAction?.originalMessage?.IOUTransactionID; - const reportID = parentReportAction?.originalMessage?.IOUReportID; - if (!transactionID || !reportID) { + const {IOUTransactionID, IOUReportID} = parentReportAction?.originalMessage; + if (!IOUTransactionID || !IOUReportID) { return false; } - if (!isCurrentUserSubmitter(reportID)) { + if (!isCurrentUserSubmitter(IOUReportID)) { return false; } if (report?.stateNum !== CONST.REPORT.STATE_NUM.OPEN && report?.stateNum !== CONST.REPORT.STATE_NUM.PROCESSING) { return false; } - return transactionHasViolation(transactionID); + return transactionHasViolation(IOUTransactionID); } /** From a28efcac58ad7dfd35c24585b3df85187529e786 Mon Sep 17 00:00:00 2001 From: Jakub Butkiewicz Date: Fri, 1 Dec 2023 16:29:28 +0100 Subject: [PATCH 027/583] fix: types in Task lib --- src/libs/ReportActionsUtils.ts | 2 +- src/libs/ReportUtils.ts | 8 +- src/libs/actions/Task.ts | 305 +++++++++++++++++++-------------- src/types/onyx/Task.ts | 3 + 4 files changed, 185 insertions(+), 133 deletions(-) diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index bd475a57954e..0138982c6256 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -122,7 +122,7 @@ function isThreadParentMessage(reportAction: OnyxEntry, reportID: * * @deprecated Use Onyx.connect() or withOnyx() instead */ -function getParentReportAction(report: OnyxEntry, allReportActionsParam?: OnyxCollection): ReportAction | Record { +function getParentReportAction(report: OnyxEntry | EmptyObject, allReportActionsParam?: OnyxCollection): ReportAction | Record { if (!report?.parentReportID || !report.parentReportActionID) { return {}; } diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 599963b6a9aa..6b3fcf8a3314 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -187,7 +187,7 @@ type OptimisticClosedReportAction = Pick< type OptimisticCreatedReportAction = Pick< ReportAction, - 'actionName' | 'actorAccountID' | 'automatic' | 'avatar' | 'created' | 'message' | 'person' | 'reportActionID' | 'shouldShow' | 'pendingAction' + 'actionName' | 'actorAccountID' | 'automatic' | 'avatar' | 'created' | 'message' | 'person' | 'reportActionID' | 'shouldShow' | 'pendingAction' | 'originalMessage' >; type OptimisticChatReport = Pick< @@ -270,6 +270,7 @@ type OptimisticTaskReport = Pick< | 'stateNum' | 'statusNum' | 'notificationPreference' + | 'parentReportActionID' >; type TransactionDetails = @@ -841,7 +842,7 @@ function isArchivedRoom(report: OnyxEntry | EmptyObject): boolean { /** * Checks if the current user is allowed to comment on the given report. */ -function isAllowedToComment(report: Report): boolean { +function isAllowedToComment(report: OnyxEntry | EmptyObject): boolean { // Default to allowing all users to post const capability = report?.writeCapability ?? CONST.REPORT.WRITE_CAPABILITIES.ALL; @@ -2150,7 +2151,7 @@ function getModifiedExpenseOriginalMessage(oldTransaction: OnyxEntry): OnyxEntry | EmptyObject { +function getParentReport(report: OnyxEntry | EmptyObject): OnyxEntry | EmptyObject { if (!report?.parentReportID) { return {}; } @@ -3078,6 +3079,7 @@ function buildOptimisticCreatedReportAction(emailCreatingAction: string, created actionName: CONST.REPORT.ACTIONS.TYPE.CREATED, pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, actorAccountID: currentUserAccountID, + originalMessage: undefined, message: [ { type: CONST.REPORT.MESSAGE.TYPE.TEXT, diff --git a/src/libs/actions/Task.ts b/src/libs/actions/Task.ts index 03f4b30d56f6..50f6434e4666 100644 --- a/src/libs/actions/Task.ts +++ b/src/libs/actions/Task.ts @@ -1,4 +1,4 @@ -import Onyx from 'react-native-onyx'; +import Onyx, {OnyxEntry, OnyxUpdate} from 'react-native-onyx'; import * as Expensicons from '@components/Icon/Expensicons'; import * as API from '@libs/API'; import DateUtils from '@libs/DateUtils'; @@ -13,10 +13,16 @@ import * as UserUtils from '@libs/UserUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; -import {PersonalDetails, Report, Task} from '@src/types/onyx'; +import * as OnyxTypes from '@src/types/onyx'; +import {Icon} from '@src/types/onyx/OnyxCommon'; +import * as Report from './Report'; + +type OptimisticReport = Pick; +type Assignee = {icons: Icon[]; displayName: string; subtitle: string}; + +let currentUserEmail: string | undefined; +let currentUserAccountID: number | undefined; -let currentUserEmail: string; -let currentUserAccountID: number; Onyx.connect({ key: ONYXKEYS.SESSION, callback: (value) => { @@ -25,7 +31,7 @@ Onyx.connect({ }, }); -let allPersonalDetails: Record | null; +let allPersonalDetails: Record | null; Onyx.connect({ key: ONYXKEYS.PERSONAL_DETAILS_LIST, callback: (value) => (allPersonalDetails = value), @@ -59,22 +65,22 @@ function createTaskAndNavigate( description: string, assigneeEmail: string, assigneeAccountID = 0, - assigneeChatReport: Report | null = null, + assigneeChatReport: OnyxTypes.Report | null = null, policyID = CONST.POLICY.OWNER_EMAIL_FAKE, ) { - const optimisticTaskReport = ReportUtils.buildOptimisticTaskReport(currentUserAccountID, assigneeAccountID, parentReportID, title, description, policyID); + const optimisticTaskReport = ReportUtils.buildOptimisticTaskReport(currentUserAccountID ?? 0, assigneeAccountID, parentReportID, title, description, policyID); - const assigneeChatReportID = assigneeChatReport ? assigneeChatReport.reportID : 0; + const assigneeChatReportID = assigneeChatReport ? assigneeChatReport.reportID : ''; const taskReportID = optimisticTaskReport.reportID; let assigneeChatReportOnyxData; // Parent ReportAction indicating that a task has been created - const optimisticTaskCreatedAction = ReportUtils.buildOptimisticCreatedReportAction(currentUserEmail); + const optimisticTaskCreatedAction = ReportUtils.buildOptimisticCreatedReportAction(currentUserEmail ?? ''); const optimisticAddCommentReport = ReportUtils.buildOptimisticTaskCommentReportAction(taskReportID, title, assigneeAccountID, `task for ${title}`, parentReportID); optimisticTaskReport.parentReportActionID = optimisticAddCommentReport.reportAction.reportActionID; const currentTime = DateUtils.getDBTime(); - const lastCommentText = ReportUtils.formatReportLastMessageText(optimisticAddCommentReport.reportAction.message[0].text); + const lastCommentText = ReportUtils.formatReportLastMessageText(optimisticAddCommentReport?.reportAction?.message?.[0].text ?? ''); const optimisticParentReport = { lastVisibleActionCreated: currentTime, lastMessageText: lastCommentText, @@ -86,7 +92,7 @@ function createTaskAndNavigate( // We're only setting onyx data for the task report here because it's possible for the parent report to not exist yet (if you're assigning a task to someone you haven't chatted with before) // So we don't want to set the parent report data until we've successfully created that chat report // FOR TASK REPORT - const optimisticData = [ + const optimisticData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.SET, key: `${ONYXKEYS.COLLECTION.REPORT}${optimisticTaskReport.reportID}`, @@ -104,12 +110,12 @@ function createTaskAndNavigate( { onyxMethod: Onyx.METHOD.SET, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${optimisticTaskReport.reportID}`, - value: {[optimisticTaskCreatedAction.reportActionID]: optimisticTaskCreatedAction}, + value: {[optimisticTaskCreatedAction.reportActionID ?? '']: optimisticTaskCreatedAction}, }, ]; // FOR TASK REPORT - const successData = [ + const successData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${optimisticTaskReport.reportID}`, @@ -131,7 +137,7 @@ function createTaskAndNavigate( ]; // FOR TASK REPORT - const failureData = [ + const failureData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${optimisticTaskReport.reportID}`, @@ -150,7 +156,7 @@ function createTaskAndNavigate( if (assigneeChatReport) { assigneeChatReportOnyxData = ReportUtils.getTaskAssigneeChatOnyxData( - currentUserAccountID, + currentUserAccountID ?? 0, assigneeAccountID, taskReportID, assigneeChatReportID, @@ -158,6 +164,7 @@ function createTaskAndNavigate( title, assigneeChatReport, ); + optimisticData.push(...assigneeChatReportOnyxData.optimisticData); successData.push(...assigneeChatReportOnyxData.successData); failureData.push(...assigneeChatReportOnyxData.failureData); @@ -174,7 +181,7 @@ function createTaskAndNavigate( { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReportID}`, - value: {[optimisticAddCommentReport.reportAction.reportActionID]: optimisticAddCommentReport.reportAction}, + value: {[optimisticAddCommentReport.reportAction.reportActionID ?? '']: optimisticAddCommentReport.reportAction}, }, ); @@ -182,7 +189,7 @@ function createTaskAndNavigate( successData.push({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReportID}`, - value: {[optimisticAddCommentReport.reportAction.reportActionID]: {pendingAction: null}}, + value: {[optimisticAddCommentReport.reportAction.reportActionID ?? '']: {pendingAction: null}}, }); // FOR PARENT REPORT (SHARE DESTINATION) @@ -190,7 +197,7 @@ function createTaskAndNavigate( onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReportID}`, value: { - [optimisticAddCommentReport.reportAction.reportActionID]: { + [optimisticAddCommentReport.reportAction.reportActionID ?? '']: { errors: ErrorUtils.getMicroSecondOnyxError('task.genericCreateTaskFailureMessage'), }, }, @@ -198,23 +205,34 @@ function createTaskAndNavigate( clearOutTaskInfo(); - API.write( - 'CreateTask', - { - parentReportActionID: optimisticAddCommentReport.reportAction.reportActionID, - parentReportID, - taskReportID: optimisticTaskReport.reportID, - createdTaskReportActionID: optimisticTaskCreatedAction.reportActionID, - title: optimisticTaskReport.reportName, - description: optimisticTaskReport.description, - assignee: assigneeEmail, - assigneeAccountID, - assigneeChatReportID, - assigneeChatReportActionID: assigneeChatReportOnyxData?.optimisticAssigneeAddComment.reportAction.reportActionID ?? 0, - assigneeChatCreatedReportActionID: assigneeChatReportOnyxData?.optimisticChatCreatedReportAction.reportActionID ?? 0, - }, - {optimisticData, successData, failureData}, - ); + type CreateTaskParameters = { + parentReportActionID?: string; + parentReportID?: string; + taskReportID?: string; + createdTaskReportActionID?: string; + title?: string; + description?: string; + assignee?: string; + assigneeAccountID?: number; + assigneeChatReportID?: string; + assigneeChatReportActionID?: string; + assigneeChatCreatedReportActionID?: string; + }; + const parameters: CreateTaskParameters = { + parentReportActionID: optimisticAddCommentReport.reportAction.reportActionID, + parentReportID, + taskReportID: optimisticTaskReport.reportID, + createdTaskReportActionID: optimisticTaskCreatedAction.reportActionID, + title: optimisticTaskReport.reportName, + description: optimisticTaskReport.description, + assignee: assigneeEmail, + assigneeAccountID, + assigneeChatReportID, + assigneeChatReportActionID: assigneeChatReportOnyxData?.optimisticAssigneeAddComment?.reportAction.reportActionID ?? '', + assigneeChatCreatedReportActionID: assigneeChatReportOnyxData?.optimisticChatCreatedReportAction?.reportActionID ?? '', + }; + + API.write('CreateTask', parameters, {optimisticData, successData, failureData}); Navigation.dismissModal(parentReportID); } @@ -222,12 +240,12 @@ function createTaskAndNavigate( /** * Complete a task */ -function completeTask(taskReport: Report) { +function completeTask(taskReport: OnyxTypes.Report) { const taskReportID = taskReport.reportID; const message = `marked as complete`; const completedTaskReportAction = ReportUtils.buildOptimisticTaskReportAction(taskReportID, CONST.REPORT.ACTIONS.TYPE.TASKCOMPLETED, message); - const optimisticData = [ + const optimisticData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${taskReportID}`, @@ -244,7 +262,7 @@ function completeTask(taskReport: Report) { }, ]; - const successData = [ + const successData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${taskReportID}`, @@ -256,7 +274,7 @@ function completeTask(taskReport: Report) { }, ]; - const failureData = [ + const failureData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${taskReportID}`, @@ -276,25 +294,28 @@ function completeTask(taskReport: Report) { }, ]; - API.write( - 'CompleteTask', - { - taskReportID, - completedTaskReportActionID: completedTaskReportAction.reportActionID, - }, - {optimisticData, successData, failureData}, - ); + type CompleteTaskParameters = { + taskReportID?: string; + completedTaskReportActionID?: string; + }; + + const parameters: CompleteTaskParameters = { + taskReportID, + completedTaskReportActionID: completedTaskReportAction.reportActionID, + }; + + API.write('CompleteTask', parameters, {optimisticData, successData, failureData}); } /** * Reopen a closed task */ -function reopenTask(taskReport: Report) { +function reopenTask(taskReport: OnyxTypes.Report) { const taskReportID = taskReport.reportID; const message = `marked as incomplete`; const reopenedTaskReportAction = ReportUtils.buildOptimisticTaskReportAction(taskReportID, CONST.REPORT.ACTIONS.TYPE.TASKREOPENED, message); - const optimisticData = [ + const optimisticData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${taskReportID}`, @@ -314,7 +335,7 @@ function reopenTask(taskReport: Report) { }, ]; - const successData = [ + const successData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${taskReportID}`, @@ -325,7 +346,7 @@ function reopenTask(taskReport: Report) { }, }, ]; - const failureData = [ + const failureData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${taskReportID}`, @@ -345,21 +366,20 @@ function reopenTask(taskReport: Report) { }, ]; - API.write( - 'ReopenTask', - { - taskReportID, - reopenedTaskReportActionID: reopenedTaskReportAction.reportActionID, - }, - {optimisticData, successData, failureData}, - ); + type ReopenTaskParameters = { + taskReportID?: string; + reopenedTaskReportActionID?: string; + }; + + const parameters: ReopenTaskParameters = { + taskReportID, + reopenedTaskReportActionID: reopenedTaskReportAction.reportActionID, + }; + + API.write('ReopenTask', parameters, {optimisticData, successData, failureData}); } -/** - * @param {object} report - * @param {Object} editedTask - */ -function editTask(report: Report, {title, description}: Task) { +function editTask(report: OnyxTypes.Report, {title, description}: OnyxTypes.Task) { // Create the EditedReportAction on the task const editTaskReportAction = ReportUtils.buildOptimisticEditedTaskReportAction(currentUserEmail); @@ -369,7 +389,7 @@ function editTask(report: Report, {title, description}: Task) { // Description can be unset, so we default to an empty string if so const reportDescription = (description ?? report.description ?? '').trim(); - const optimisticData = [ + const optimisticData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.reportID}`, @@ -388,7 +408,8 @@ function editTask(report: Report, {title, description}: Task) { }, }, ]; - const successData = [ + + const successData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${report.reportID}`, @@ -400,7 +421,8 @@ function editTask(report: Report, {title, description}: Task) { }, }, ]; - const failureData = [ + + const failureData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.reportID}`, @@ -416,37 +438,42 @@ function editTask(report: Report, {title, description}: Task) { }, ]; - API.write( - 'EditTask', - { - taskReportID: report.reportID, - title: reportName, - description: reportDescription, - editedTaskReportActionID: editTaskReportAction.reportActionID, - }, - {optimisticData, successData, failureData}, - ); + type EditTaskParameters = { + taskReportID?: string; + title?: string; + description?: string; + editedTaskReportActionID?: string; + }; + + const parameters: EditTaskParameters = { + taskReportID: report.reportID, + title: reportName, + description: reportDescription, + editedTaskReportActionID: editTaskReportAction.reportActionID, + }; + + API.write('EditTask', parameters, {optimisticData, successData, failureData}); } -function editTaskAssignee(report: Report, ownerAccountID: number, assigneeEmail: string, assigneeAccountID = 0, assigneeChatReport: Report | null = null) { +function editTaskAssignee(report: OnyxTypes.Report, ownerAccountID: number, assigneeEmail: string, assigneeAccountID = 0, assigneeChatReport: OnyxTypes.Report | null = null) { // Create the EditedReportAction on the task - const editTaskReportAction = ReportUtils.buildOptimisticEditedTaskReportAction(currentUserEmail); + const editTaskReportAction = ReportUtils.buildOptimisticEditedTaskReportAction(currentUserEmail ?? string); const reportName = report.reportName?.trim(); let assigneeChatReportOnyxData; - const assigneeChatReportID = assigneeChatReport ? assigneeChatReport.reportID : 0; - const optimisticReport = { + const assigneeChatReportID = assigneeChatReport ? assigneeChatReport.reportID : ''; + const optimisticReport: OptimisticReport = { reportName, managerID: assigneeAccountID || report.managerID, pendingFields: { ...(assigneeAccountID && {managerID: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE}), }, - notificationPreference: [assigneeAccountID, ownerAccountID].includes(currentUserAccountID) + notificationPreference: [assigneeAccountID, ownerAccountID].includes(currentUserAccountID ?? 0) ? CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS : CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN, }; - const optimisticData = [ + const optimisticData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.reportID}`, @@ -458,14 +485,16 @@ function editTaskAssignee(report: Report, ownerAccountID: number, assigneeEmail: value: optimisticReport, }, ]; - const successData = [ + + const successData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${report.reportID}`, value: {pendingFields: {...(assigneeAccountID && {managerID: null})}}, }, ]; - const failureData = [ + + const failureData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.reportID}`, @@ -481,45 +510,51 @@ function editTaskAssignee(report: Report, ownerAccountID: number, assigneeEmail: // If we make a change to the assignee, we want to add a comment to the assignee's chat // Check if the assignee actually changed if (assigneeAccountID && assigneeAccountID !== report.managerID && assigneeAccountID !== ownerAccountID && assigneeChatReport) { - const participants = lodashGet(report, 'participantAccountIDs', []); + const participants = report?.participantAccountIDs ?? []; if (!participants.includes(assigneeAccountID)) { optimisticReport.participantAccountIDs = [...participants, assigneeAccountID]; } assigneeChatReportOnyxData = ReportUtils.getTaskAssigneeChatOnyxData( - currentUserAccountID, + currentUserAccountID ?? 0, assigneeAccountID, report.reportID, - assigneeChatReportID, - report.parentReportID, - reportName, + assigneeChatReportID ?? '', + report.parentReportID ?? '', + reportName ?? '', assigneeChatReport, ); + optimisticData.push(...assigneeChatReportOnyxData.optimisticData); successData.push(...assigneeChatReportOnyxData.successData); failureData.push(...assigneeChatReportOnyxData.failureData); } - API.write( - 'EditTaskAssignee', - { - taskReportID: report.reportID, - assignee: assigneeEmail, - editedTaskReportActionID: editTaskReportAction.reportActionID, - assigneeChatReportID, - assigneeChatReportActionID: assigneeChatReportOnyxData?.optimisticAssigneeAddComment.reportAction.reportActionID ?? 0, - assigneeChatCreatedReportActionID: assigneeChatReportOnyxData?.optimisticChatCreatedReportAction.reportActionID ?? 0, - }, - {optimisticData, successData, failureData}, - ); + type EditTaskAssigneeParameters = { + taskReportID?: string; + assignee?: string; + editedTaskReportActionID?: string; + assigneeChatReportID?: string; + assigneeChatReportActionID?: string; + assigneeChatCreatedReportActionID?: string; + }; + + const parameters: EditTaskAssigneeParameters = { + taskReportID: report.reportID, + assignee: assigneeEmail, + editedTaskReportActionID: editTaskReportAction.reportActionID, + assigneeChatReportID, + assigneeChatReportActionID: assigneeChatReportOnyxData?.optimisticAssigneeAddComment?.reportAction.reportActionID ?? '', + assigneeChatCreatedReportActionID: assigneeChatReportOnyxData?.optimisticChatCreatedReportAction?.reportActionID ?? '', + }; + + API.write('EditTaskAssignee', parameters, {optimisticData, successData, failureData}); } /** * Sets the report info for the task being viewed - * - * @param {Object} report */ -function setTaskReport(report: Report) { +function setTaskReport(report: OnyxTypes.Report) { Onyx.merge(ONYXKEYS.TASK, {report}); } @@ -555,7 +590,7 @@ function setShareDestinationValue(shareDestination: string) { /* Sets the assigneeChatReport details for the task */ -function setAssigneeChatReport(chatReport: Report) { +function setAssigneeChatReport(chatReport: OnyxTypes.Report) { Onyx.merge(ONYXKEYS.TASK, {assigneeChatReport: chatReport}); } @@ -564,8 +599,8 @@ function setAssigneeChatReport(chatReport: Report) { * If there is no existing chat, it creates an optimistic chat report * It also sets the shareDestination as that chat report if a share destination isn't already set */ -function setAssigneeValue(assigneeEmail: string, assigneeAccountID: number, shareDestination: string, isCurrentUser = false) { - let chatReport: Report | undefined; +function setAssigneeValue(assigneeEmail: string, assigneeAccountID: number, shareDestination: string, isCurrentUser = false): OnyxEntry | undefined { + let chatReport: OnyxEntry | undefined; if (!isCurrentUser) { chatReport = ReportUtils.getChatByParticipants([assigneeAccountID]); @@ -632,8 +667,9 @@ function clearOutTaskInfoAndNavigate(reportID: string) { /** * Get the assignee data */ -function getAssignee(assigneeAccountID: number, personalDetails: Record) { +function getAssignee(assigneeAccountID: number, personalDetails: Record): Assignee { const details = personalDetails[assigneeAccountID]; + if (!details) { return { icons: [], @@ -641,20 +677,21 @@ function getAssignee(assigneeAccountID: number, personalDetails: Record, personalDetails: Record) { +function getShareDestination(reportID: string, reports: Record, personalDetails: Record) { const report = reports[`report_${reportID}`] ?? {}; - const participantAccountIDs = lodashGet(report, 'participantAccountIDs'); + const participantAccountIDs = report.participantAccountIDs ?? []; const isMultipleParticipant = participantAccountIDs?.length > 1; const displayNamesWithTooltips = ReportUtils.getDisplayNamesWithTooltips(OptionsListUtils.getPersonalDetailsForAccountIDs(participantAccountIDs, personalDetails), isMultipleParticipant); @@ -707,7 +744,7 @@ function cancelTask(taskReportID: string, taskTitle: string, originalStateNum: n }, }; - const optimisticData = [ + const optimisticData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${taskReportID}`, @@ -721,10 +758,10 @@ function cancelTask(taskReportID: string, taskTitle: string, originalStateNum: n }, { onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${parentReport.reportID}`, + key: `${ONYXKEYS.COLLECTION.REPORT}${parentReport?.reportID}`, value: { - lastMessageText: ReportActionsUtils.getLastVisibleMessage(parentReport.reportID, optimisticReportActions).lastMessageText, - lastVisibleActionCreated: lodashGet(ReportActionsUtils.getLastVisibleAction(parentReport.reportID, optimisticReportActions), 'created'), + lastMessageText: ReportActionsUtils.getLastVisibleMessage(parentReport?.reportID, optimisticReportActions).lastMessageText, + lastVisibleActionCreated: ReportActionsUtils.getLastVisibleAction(parentReport?.reportID, optimisticReportActions) ?? 'created', }, }, { @@ -736,12 +773,12 @@ function cancelTask(taskReportID: string, taskTitle: string, originalStateNum: n }, { onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReport.reportID}`, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReport?.reportID}`, value: optimisticReportActions, }, ]; - const successData = [ + const successData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${taskReportID}`, @@ -753,7 +790,7 @@ function cancelTask(taskReportID: string, taskTitle: string, originalStateNum: n }, { onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReport.reportID}`, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReport?.reportID}`, value: { [parentReportAction.reportActionID]: { pendingAction: null, @@ -762,7 +799,7 @@ function cancelTask(taskReportID: string, taskTitle: string, originalStateNum: n }, ]; - const failureData = [ + const failureData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${taskReportID}`, @@ -780,7 +817,7 @@ function cancelTask(taskReportID: string, taskTitle: string, originalStateNum: n }, { onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReport.reportID}`, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReport?.reportID}`, value: { [parentReportAction.reportActionID]: { pendingAction: null, @@ -789,7 +826,17 @@ function cancelTask(taskReportID: string, taskTitle: string, originalStateNum: n }, ]; - API.write('CancelTask', {cancelledTaskReportActionID: optimisticReportActionID, taskReportID}, {optimisticData, successData, failureData}); + type CancelTaskParameters = { + cancelledTaskReportActionID?: string; + taskReportID?: string; + }; + + const parameters: CancelTaskParameters = { + cancelledTaskReportActionID: optimisticReportActionID, + taskReportID, + }; + + API.write('CancelTask', parameters, {optimisticData, successData, failureData}); } /** @@ -803,7 +850,7 @@ function dismissModalAndClearOutTaskInfo() { /** * Returns Task assignee accountID */ -function getTaskAssigneeAccountID(taskReport: Report): number | null { +function getTaskAssigneeAccountID(taskReport: OnyxTypes.Report): number | null | undefined { if (!taskReport) { return null; } @@ -819,14 +866,14 @@ function getTaskAssigneeAccountID(taskReport: Report): number | null { /** * Returns Task owner accountID */ -function getTaskOwnerAccountID(taskReport: Report): number | null { +function getTaskOwnerAccountID(taskReport: OnyxTypes.Report): number | null { return taskReport.ownerAccountID ?? null; } /** * Check if you're allowed to modify the task - anyone that has write access to the report can modify the task */ -function canModifyTask(taskReport: Report, sessionAccountID: number): boolean { +function canModifyTask(taskReport: OnyxTypes.Report, sessionAccountID: number): boolean { if (ReportUtils.isCanceledTaskReport(taskReport)) { return false; } @@ -846,9 +893,9 @@ function clearTaskErrors(reportID: string) { const report = ReportUtils.getReport(reportID); // Delete the task preview in the parent report - if (lodashGet(report, 'pendingFields.createChat') === CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD) { + if (report?.pendingFields?.createChat === CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD) { Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.parentReportID}`, { - [report.parentReportActionID]: null, + [report.parentReportActionID ?? 0]: null, }); Report.navigateToConciergeChatAndDeleteReport(reportID); @@ -864,7 +911,7 @@ function clearTaskErrors(reportID: string) { function getTaskReportActionMessage(actionName: string, reportID: string, isCreateTaskAction: boolean): string { const report = ReportUtils.getReport(reportID); if (isCreateTaskAction) { - return `task for ${report.reportName}`; + return `task for ${report?.reportName}`; } let taskStatusText = ''; switch (actionName) { diff --git a/src/types/onyx/Task.ts b/src/types/onyx/Task.ts index 9d5c83ee4a40..8a399ee4652f 100644 --- a/src/types/onyx/Task.ts +++ b/src/types/onyx/Task.ts @@ -22,6 +22,9 @@ type Task = { /** Report id only when a task was created from a report */ parentReportID?: string; + + /** Chat report with assignee of task */ + assigneeChatReport?: Report; }; export default Task; From 684098594e8572af384c1a87f43e0890f8227874 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Mon, 4 Dec 2023 15:08:50 +0700 Subject: [PATCH 028/583] prevent enter key subscribe --- .../MoneyRequestConfirmationList.js | 2 +- .../OptionsSelector/BaseOptionsSelector.js | 39 ++++++++++++++++++- .../Pressable/GenericPressable/index.tsx | 2 +- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/components/MoneyRequestConfirmationList.js b/src/components/MoneyRequestConfirmationList.js index 1b4967a9c54c..1c22c2452da8 100755 --- a/src/components/MoneyRequestConfirmationList.js +++ b/src/components/MoneyRequestConfirmationList.js @@ -520,7 +520,7 @@ function MoneyRequestConfirmationList(props) { /> ) : ( confirm(value)} options={splitOrRequestOptions} diff --git a/src/components/OptionsSelector/BaseOptionsSelector.js b/src/components/OptionsSelector/BaseOptionsSelector.js index 9c8b76515fe8..48683e4e5dbe 100755 --- a/src/components/OptionsSelector/BaseOptionsSelector.js +++ b/src/components/OptionsSelector/BaseOptionsSelector.js @@ -80,11 +80,15 @@ class BaseOptionsSelector extends Component { this.incrementPage = this.incrementPage.bind(this); this.sliceSections = this.sliceSections.bind(this); this.calculateAllVisibleOptionsCount = this.calculateAllVisibleOptionsCount.bind(this); + this.handleFocusIn = this.handleFocusIn.bind(this); + this.handleFocusOut = this.handleFocusOut.bind(this); this.relatedTarget = null; const allOptions = this.flattenSections(); const sections = this.sliceSections(); const focusedIndex = this.getInitiallyFocusedIndex(allOptions); + const platform = getPlatform(); + const isNative = platform === CONST.PLATFORM.IOS || platform === CONST.PLATFORM.ANDROID; this.state = { sections, @@ -94,11 +98,13 @@ class BaseOptionsSelector extends Component { shouldShowReferralModal: false, errorMessage: '', paginationPage: 1, + disableEnterShortCut: isNative ? false : this.handleFocusIn(), }; } componentDidMount() { this.subscribeToKeyboardShortcut(); + this.subscribeActiveElement(); if (this.props.isFocused && this.props.autoFocus && this.textInput) { this.focusTimeout = setTimeout(() => { @@ -118,6 +124,11 @@ class BaseOptionsSelector extends Component { } } + if (prevState.disableEnterShortCut !== this.state.disableEnterShortCut) { + this.unSubscribeFromKeyboardShortcut(); + this.subscribeToKeyboardShortcut(); + } + // Screen coming back into focus, for example // when doing Cmd+Shift+K, then Cmd+K, then Cmd+Shift+K. // Only applies to platforms that support keyboard shortcuts @@ -181,6 +192,7 @@ class BaseOptionsSelector extends Component { } this.unSubscribeFromKeyboardShortcut(); + this.unSubscribeActiveElement(); } /** @@ -256,11 +268,36 @@ class BaseOptionsSelector extends Component { this.setState((prevState) => ({shouldShowReferralModal: !prevState.shouldShowReferralModal})); } + handleFocusIn() { + const activeElement = document.activeElement; + console.log(activeElement.role); + this.setState({ + disableEnterShortCut: activeElement && [CONST.ACCESSIBILITY_ROLE.BUTTON, CONST.ACCESSIBILITY_ROLE.CHECKBOX].includes(activeElement.role) + + }) + } + + handleFocusOut() { + this.setState({ + disableEnterShortCut: false + }) + } + + subscribeActiveElement() { + document.addEventListener('focusin', this.handleFocusIn); + document.addEventListener('focusout', this.handleFocusOut); + } + + unSubscribeActiveElement() { + document.removeEventListener('focusin', this.handleFocusIn); + document.removeEventListener('focusout', this.handleFocusOut); + } + subscribeToKeyboardShortcut() { const enterConfig = CONST.KEYBOARD_SHORTCUTS.ENTER; this.unsubscribeEnter = KeyboardShortcut.subscribe( enterConfig.shortcutKey, - this.selectFocusedOption, + !this.state.disableEnterShortCut ? this.selectFocusedOption: undefined, enterConfig.descriptionKey, enterConfig.modifiers, true, diff --git a/src/components/Pressable/GenericPressable/index.tsx b/src/components/Pressable/GenericPressable/index.tsx index e050e23c8e9a..94275bc234c5 100644 --- a/src/components/Pressable/GenericPressable/index.tsx +++ b/src/components/Pressable/GenericPressable/index.tsx @@ -14,7 +14,7 @@ function WebGenericPressable({focusable = true, ...props}: PressableProps, ref: // change native accessibility props to web accessibility props focusable={focusable} tabIndex={props.tabIndex ?? (!accessible || !focusable) ? -1 : 0} - role={props.accessibilityRole as Role} + role={(props.accessibilityRole || props.role) as Role} id={props.nativeID} aria-label={props.accessibilityLabel} aria-labelledby={props.accessibilityLabelledBy} From 31109b8f84f61cd0e1a81ac97e408016a847d2a2 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Mon, 4 Dec 2023 16:16:31 +0700 Subject: [PATCH 029/583] check checkbox only --- src/components/MoneyRequestConfirmationList.js | 2 +- src/components/OptionsSelector/BaseOptionsSelector.js | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/components/MoneyRequestConfirmationList.js b/src/components/MoneyRequestConfirmationList.js index 1c22c2452da8..1b4967a9c54c 100755 --- a/src/components/MoneyRequestConfirmationList.js +++ b/src/components/MoneyRequestConfirmationList.js @@ -520,7 +520,7 @@ function MoneyRequestConfirmationList(props) { /> ) : ( confirm(value)} options={splitOrRequestOptions} diff --git a/src/components/OptionsSelector/BaseOptionsSelector.js b/src/components/OptionsSelector/BaseOptionsSelector.js index 48683e4e5dbe..b4ba98b5b39f 100755 --- a/src/components/OptionsSelector/BaseOptionsSelector.js +++ b/src/components/OptionsSelector/BaseOptionsSelector.js @@ -270,9 +270,8 @@ class BaseOptionsSelector extends Component { handleFocusIn() { const activeElement = document.activeElement; - console.log(activeElement.role); this.setState({ - disableEnterShortCut: activeElement && [CONST.ACCESSIBILITY_ROLE.BUTTON, CONST.ACCESSIBILITY_ROLE.CHECKBOX].includes(activeElement.role) + disableEnterShortCut: activeElement && [CONST.ACCESSIBILITY_ROLE.CHECKBOX].includes(activeElement.role) }) } From 8a1a642c709947430c2b427b4a34a3c4e47f849a Mon Sep 17 00:00:00 2001 From: Jakub Butkiewicz Date: Mon, 4 Dec 2023 14:37:55 +0100 Subject: [PATCH 030/583] fix: added assertions, fix types --- src/libs/actions/Task.ts | 58 ++++++++++++++++++---------------- src/types/onyx/Report.ts | 1 + src/types/onyx/ReportAction.ts | 46 +++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 28 deletions(-) diff --git a/src/libs/actions/Task.ts b/src/libs/actions/Task.ts index 50f6434e4666..50348fc08573 100644 --- a/src/libs/actions/Task.ts +++ b/src/libs/actions/Task.ts @@ -110,7 +110,7 @@ function createTaskAndNavigate( { onyxMethod: Onyx.METHOD.SET, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${optimisticTaskReport.reportID}`, - value: {[optimisticTaskCreatedAction.reportActionID ?? '']: optimisticTaskCreatedAction}, + value: {[optimisticTaskCreatedAction.reportActionID ?? '']: optimisticTaskCreatedAction as OnyxTypes.ReportAction}, }, ]; @@ -258,7 +258,7 @@ function completeTask(taskReport: OnyxTypes.Report) { { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${taskReportID}`, - value: {[completedTaskReportAction.reportActionID]: completedTaskReportAction}, + value: {[completedTaskReportAction.reportActionID]: completedTaskReportAction as OnyxTypes.ReportAction}, }, ]; @@ -331,7 +331,7 @@ function reopenTask(taskReport: OnyxTypes.Report) { { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${taskReportID}`, - value: {[reopenedTaskReportAction.reportActionID]: reopenedTaskReportAction}, + value: {[reopenedTaskReportAction.reportActionID]: reopenedTaskReportAction as OnyxTypes.ReportAction}, }, ]; @@ -381,7 +381,7 @@ function reopenTask(taskReport: OnyxTypes.Report) { function editTask(report: OnyxTypes.Report, {title, description}: OnyxTypes.Task) { // Create the EditedReportAction on the task - const editTaskReportAction = ReportUtils.buildOptimisticEditedTaskReportAction(currentUserEmail); + const editTaskReportAction = ReportUtils.buildOptimisticEditedTaskReportAction(currentUserEmail ?? ''); // Sometimes title or description is undefined, so we need to check for that, and we provide it to multiple functions const reportName = (title ?? report?.reportName).trim(); @@ -393,7 +393,7 @@ function editTask(report: OnyxTypes.Report, {title, description}: OnyxTypes.Task { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.reportID}`, - value: {[editTaskReportAction.reportActionID]: editTaskReportAction}, + value: {[editTaskReportAction.reportActionID]: editTaskReportAction as OnyxTypes.ReportAction}, }, { onyxMethod: Onyx.METHOD.MERGE, @@ -457,7 +457,7 @@ function editTask(report: OnyxTypes.Report, {title, description}: OnyxTypes.Task function editTaskAssignee(report: OnyxTypes.Report, ownerAccountID: number, assigneeEmail: string, assigneeAccountID = 0, assigneeChatReport: OnyxTypes.Report | null = null) { // Create the EditedReportAction on the task - const editTaskReportAction = ReportUtils.buildOptimisticEditedTaskReportAction(currentUserEmail ?? string); + const editTaskReportAction = ReportUtils.buildOptimisticEditedTaskReportAction(currentUserEmail ?? ''); const reportName = report.reportName?.trim(); let assigneeChatReportOnyxData; @@ -477,7 +477,7 @@ function editTaskAssignee(report: OnyxTypes.Report, ownerAccountID: number, assi { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.reportID}`, - value: {[editTaskReportAction.reportActionID]: editTaskReportAction}, + value: {[editTaskReportAction.reportActionID]: editTaskReportAction as OnyxTypes.ReportAction}, }, { onyxMethod: Onyx.METHOD.MERGE, @@ -724,24 +724,24 @@ function cancelTask(taskReportID: string, taskTitle: string, originalStateNum: n const taskReport = ReportUtils.getReport(taskReportID); const parentReportAction = ReportActionsUtils.getParentReportAction(taskReport); const parentReport = ReportUtils.getParentReport(taskReport); - + const optimisticReportAction = { + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, + previousMessage: parentReportAction.message, + message: [ + { + translationKey: '', + type: 'COMMENT', + html: '', + text: '', + isEdited: true, + isDeletedParentAction: true, + }, + ], + errors: undefined, + linkMetaData: [], + }; const optimisticReportActions = { - [parentReportAction.reportActionID]: { - pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, - previousMessage: parentReportAction.message, - message: [ - { - translationKey: '', - type: 'COMMENT', - html: '', - text: '', - isEdited: true, - isDeletedParentAction: true, - }, - ], - errors: null, - linkMetaData: [], - }, + [parentReportAction.reportActionID]: optimisticReportAction, }; const optimisticData: OnyxUpdate[] = [ @@ -760,15 +760,17 @@ function cancelTask(taskReportID: string, taskTitle: string, originalStateNum: n onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${parentReport?.reportID}`, value: { - lastMessageText: ReportActionsUtils.getLastVisibleMessage(parentReport?.reportID, optimisticReportActions).lastMessageText, - lastVisibleActionCreated: ReportActionsUtils.getLastVisibleAction(parentReport?.reportID, optimisticReportActions) ?? 'created', + lastMessageText: ReportActionsUtils.getLastVisibleMessage(parentReport?.reportID ?? '', optimisticReportActions as unknown as OnyxTypes.ReportActions).lastMessageText ?? '', + lastVisibleActionCreated: + ReportActionsUtils.getLastVisibleAction(parentReport?.reportID ?? '', optimisticReportActions as unknown as OnyxTypes.ReportActions)?.childLastVisibleActionCreated ?? + 'created', }, }, { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${taskReportID}`, value: { - [optimisticReportActionID]: optimisticCancelReportAction, + [optimisticReportActionID]: optimisticCancelReportAction as OnyxTypes.ReportAction, }, }, { @@ -806,7 +808,7 @@ function cancelTask(taskReportID: string, taskTitle: string, originalStateNum: n value: { stateNum: originalStateNum, statusNum: originalStatusNum, - }, + } as OnyxTypes.Report, }, { onyxMethod: Onyx.METHOD.MERGE, diff --git a/src/types/onyx/Report.ts b/src/types/onyx/Report.ts index 138b2dc79ba1..0498afe916bc 100644 --- a/src/types/onyx/Report.ts +++ b/src/types/onyx/Report.ts @@ -147,6 +147,7 @@ type Report = { participantsList?: Array>; text?: string; privateNotes?: Record; + updateReportInLHN?: boolean; }; export default Report; diff --git a/src/types/onyx/ReportAction.ts b/src/types/onyx/ReportAction.ts index 64e1eb0b7c88..7bf6090adaf0 100644 --- a/src/types/onyx/ReportAction.ts +++ b/src/types/onyx/ReportAction.ts @@ -5,6 +5,48 @@ import * as OnyxCommon from './OnyxCommon'; import OriginalMessage, {Decision, Reaction} from './OriginalMessage'; import {Receipt} from './Transaction'; +type Image = { + /** The height of the image. */ + height?: number; + + /** The width of the image. */ + width?: number; + + /** The URL of the image. */ + url?: string; +}; + +type Logo = { + /** The height of the logo. */ + height?: number; + + /** The width of the logo. */ + width?: number; + + /** The URL of the logo. */ + url?: string; +}; + +type LinkMetaData = { + /** The URL of the link. */ + url?: string; + + /** A description of the link. */ + description?: string; + + /** The title of the link. */ + title?: string; + + /** The publisher of the link. */ + publisher?: string; + + /** The image associated with the link. */ + image: Image; + + /** The provider logo associated with the link. */ + logo: Logo; +}; + type Message = { /** The type of the action item fragment. Used to render a corresponding component */ type: string; @@ -79,6 +121,9 @@ type ReportActionBase = { /** report action message */ message?: Message[]; + /** report action previous message */ + previousMessage?: Message[]; + /** Whether we have received a response back from the server */ isLoading?: boolean; @@ -138,6 +183,7 @@ type ReportActionBase = { isAttachment?: boolean; childRecentReceiptTransactionIDs?: Record; reportID?: string; + linkMetaData?: LinkMetaData[]; }; type ReportAction = ReportActionBase & OriginalMessage; From 721729f57e2d53094576179b6dd51741ba8401b7 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Tue, 5 Dec 2023 10:58:04 +0700 Subject: [PATCH 031/583] fix lint --- src/components/OptionsSelector/BaseOptionsSelector.js | 11 +++++------ src/components/Pressable/GenericPressable/index.tsx | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/components/OptionsSelector/BaseOptionsSelector.js b/src/components/OptionsSelector/BaseOptionsSelector.js index b4ba98b5b39f..b3e338b601ab 100755 --- a/src/components/OptionsSelector/BaseOptionsSelector.js +++ b/src/components/OptionsSelector/BaseOptionsSelector.js @@ -271,15 +271,14 @@ class BaseOptionsSelector extends Component { handleFocusIn() { const activeElement = document.activeElement; this.setState({ - disableEnterShortCut: activeElement && [CONST.ACCESSIBILITY_ROLE.CHECKBOX].includes(activeElement.role) - - }) + disableEnterShortCut: activeElement && [CONST.ACCESSIBILITY_ROLE.CHECKBOX].includes(activeElement.role), + }); } handleFocusOut() { this.setState({ - disableEnterShortCut: false - }) + disableEnterShortCut: false, + }); } subscribeActiveElement() { @@ -296,7 +295,7 @@ class BaseOptionsSelector extends Component { const enterConfig = CONST.KEYBOARD_SHORTCUTS.ENTER; this.unsubscribeEnter = KeyboardShortcut.subscribe( enterConfig.shortcutKey, - !this.state.disableEnterShortCut ? this.selectFocusedOption: undefined, + !this.state.disableEnterShortCut ? this.selectFocusedOption : undefined, enterConfig.descriptionKey, enterConfig.modifiers, true, diff --git a/src/components/Pressable/GenericPressable/index.tsx b/src/components/Pressable/GenericPressable/index.tsx index 94275bc234c5..90bad15756fb 100644 --- a/src/components/Pressable/GenericPressable/index.tsx +++ b/src/components/Pressable/GenericPressable/index.tsx @@ -14,7 +14,7 @@ function WebGenericPressable({focusable = true, ...props}: PressableProps, ref: // change native accessibility props to web accessibility props focusable={focusable} tabIndex={props.tabIndex ?? (!accessible || !focusable) ? -1 : 0} - role={(props.accessibilityRole || props.role) as Role} + role={(props.accessibilityRole ?? props.role) as Role} id={props.nativeID} aria-label={props.accessibilityLabel} aria-labelledby={props.accessibilityLabelledBy} From 375eabbea4231cc09d418bc9e1b797a5b069295d Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Tue, 5 Dec 2023 10:47:27 -0500 Subject: [PATCH 032/583] Update src/libs/ReportUtils.ts Co-authored-by: Carlos Alvarez --- src/libs/ReportUtils.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 1412cfa73067..ad5ed0e46b20 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3417,8 +3417,7 @@ function shouldHideReport(report: OnyxEntry, currentReportId: string): b } /** - * - * Check if there are any violations belonging to the transaction in the transactionsViolations Onyx object + * Checks if there are any violations belonging to the transaction in the transactionsViolations Onyx object * then checks that the violation is of the proper type */ function transactionHasViolation(transactionID: string): boolean { From b6c24db81675e801039333344d093f7d7e12adc2 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Tue, 5 Dec 2023 10:47:37 -0500 Subject: [PATCH 033/583] Update src/libs/ReportUtils.ts Co-authored-by: Carlos Alvarez --- src/libs/ReportUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index ad5ed0e46b20..0b6b95442cf4 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3430,7 +3430,7 @@ function transactionHasViolation(transactionID: string): boolean { /** * Checks to see if a report's parentAction is a money request that contains a violation - * This only pertains to report's that a user submitted and if it is open or processing + * This only applies to report submitter and for reports in the open and processing states */ function transactionThreadHasViolations(report: Report, betas: Beta[]): boolean { From ccd3eb33afc33ae4d8e98293eb75f043ca502ac4 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Tue, 5 Dec 2023 15:47:39 -0500 Subject: [PATCH 034/583] remove unneeded changes --- src/libs/ReportUtils.ts | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index b46cdfeabd34..c8ecb8576812 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -11,8 +11,6 @@ import {SvgProps} from 'react-native-svg'; import {ValueOf} from 'type-fest'; import * as Expensicons from '@components/Icon/Expensicons'; import * as defaultWorkspaceAvatars from '@components/Icon/WorkspaceDefaultAvatars'; -// eslint-disable-next-line @dword-design/import-alias/prefer-alias -import Permissions from '@libs/Permissions'; import CONST from '@src/CONST'; import {ParentNavigationSummaryParams, TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -33,6 +31,7 @@ import * as Localize from './Localize'; import linkingConfig from './Navigation/linkingConfig'; import Navigation from './Navigation/Navigation'; import * as NumberUtils from './NumberUtils'; +import Permissions from './Permissions'; import * as PolicyUtils from './PolicyUtils'; import * as ReportActionsUtils from './ReportActionsUtils'; import {LastVisibleMessage} from './ReportActionsUtils'; @@ -411,12 +410,7 @@ const transactionViolations: OnyxCollection = {}; Onyx.connect({ key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, callback: (violations, key) => { - if (!key) { - return; - } - - if (!violations) { - delete transactionViolations[key]; + if (!key || !violations) { return; } From 1d2cfa2caa60b595bc6d54a97a78595d6edeb225 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Tue, 5 Dec 2023 16:13:20 -0500 Subject: [PATCH 035/583] Remove duplicate TRANSACTION_VIOLATIONS constant --- src/ONYXKEYS.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ONYXKEYS.ts b/src/ONYXKEYS.ts index 82b6838cc75a..fc6d2927a1b1 100755 --- a/src/ONYXKEYS.ts +++ b/src/ONYXKEYS.ts @@ -265,7 +265,6 @@ const ONYXKEYS = { REPORT_USER_IS_LEAVING_ROOM: 'reportUserIsLeavingRoom_', SECURITY_GROUP: 'securityGroup_', TRANSACTION: 'transactions_', - TRANSACTION_VIOLATIONS: 'transactionViolations_', // Transaction Violations TRANSACTION_VIOLATIONS: 'transactionViolations_', From a5ea5d1d9a65def57aa44da5c9481bfbe758676d Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Wed, 6 Dec 2023 13:42:39 +0100 Subject: [PATCH 036/583] TS migration of Policy.js --- src/libs/actions/Policy.ts | 12 ++++-------- src/types/onyx/Report.ts | 4 ++-- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/libs/actions/Policy.ts b/src/libs/actions/Policy.ts index 200eb00f4822..c235cae98bee 100644 --- a/src/libs/actions/Policy.ts +++ b/src/libs/actions/Policy.ts @@ -61,10 +61,7 @@ let allPolicyMembers: OnyxCollection; Onyx.connect({ key: ONYXKEYS.COLLECTION.POLICY_MEMBERS, waitForCollectionCallback: true, - // callback: (val) => (allPolicyMembers = val), callback: (val) => { - // console.log('POLICYMEMBERS', val); - // console.log('TYPEPOLICYMEMBERS', typeof Object.keys(val)[0]); allPolicyMembers = val; }, }); @@ -119,7 +116,6 @@ function updateLastAccessedWorkspace(policyID: OnyxEntry) { /** * Check if the user has any active free policies (aka workspaces) - */ function hasActiveFreePolicy(policies: Array> | Record>): boolean { const adminFreePolicies = Object.values(policies).filter((policy) => policy && policy.type === CONST.POLICY.TYPE.FREE && policy.role === CONST.POLICY.ROLE.ADMIN); @@ -292,7 +288,7 @@ type OptimisticAnnounceRoomMembers = { /** * Build optimistic data for removing users from the announcement room */ -function removeOptimisticAnnounceRoomMembers(policyID: string, accountIDs: string[]) { +function removeOptimisticAnnounceRoomMembers(policyID: string, accountIDs: number[]) { const announceReport = ReportUtils.getRoom(CONST.REPORT.CHAT_TYPE.POLICY_ANNOUNCE, policyID); const announceRoomMembers: OptimisticAnnounceRoomMembers = { onyxOptimisticData: [], @@ -324,7 +320,7 @@ function removeOptimisticAnnounceRoomMembers(policyID: string, accountIDs: strin /** * Remove the passed members from the policy employeeList */ -function removeMembers(accountIDs: string[], policyID: string) { +function removeMembers(accountIDs: number[], policyID: string) { // In case user selects only themselves (admin), their email will be filtered out and the members // array passed will be empty, prevent the function from proceeding in that case as there is no one to remove if (accountIDs.length === 0) { @@ -377,7 +373,7 @@ function removeMembers(accountIDs: string[], policyID: string) { // Take the current policy members and remove them optimistically // console.log('POLICYMEMBERS', allPolicyMembers); const policyMemberAccountIDs = Object.keys(allPolicyMembers?.[`${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`] ?? {}); - const remainingMemberAccountIDs = policyMemberAccountIDs.filter((e) => !accountIDs.includes(e)); + const remainingMemberAccountIDs = policyMemberAccountIDs.filter((e) => !accountIDs.includes(Number(e))); const remainingLogins: string[] = PersonalDetailsUtils.getLoginsByAccountIDs(remainingMemberAccountIDs); const invitedPrimaryToSecondaryLogins: Record = {}; @@ -1804,7 +1800,7 @@ function createWorkspaceFromIOUPayment(iouReport: Report): string | undefined { }); // Create the MOVED report action and add it to the DM chat which indicates to the user where the report has been moved - const movedReportAction = ReportUtils.buildOptimisticMovedReportAction(oldPersonalPolicyID, policyID, memberData.workspaceChatReportID, iouReportID, workspaceName); + const movedReportAction = ReportUtils.buildOptimisticMovedReportAction(oldPersonalPolicyID ?? '', policyID, memberData.workspaceChatReportID, iouReportID, workspaceName); optimisticData.push({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${oldChatReportID}`, diff --git a/src/types/onyx/Report.ts b/src/types/onyx/Report.ts index 28f772bd1ef0..d49bf2169022 100644 --- a/src/types/onyx/Report.ts +++ b/src/types/onyx/Report.ts @@ -108,9 +108,9 @@ type Report = { lastMessageHtml?: string; welcomeMessage?: string; lastActorAccountID?: number; - ownerAccountID?: string; + ownerAccountID?: number; ownerEmail?: string; - participantAccountIDs?: string[]; + participantAccountIDs?: number[]; total?: number; currency?: string; parentReportActionIDs?: number[]; From bcd1ee862bf896246fb5165ec4ffe0c6fb6dbb45 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 6 Dec 2023 10:49:28 -0500 Subject: [PATCH 037/583] Update src/ONYXKEYS.ts Co-authored-by: Carlos Alvarez --- src/ONYXKEYS.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/ONYXKEYS.ts b/src/ONYXKEYS.ts index fc6d2927a1b1..5f85b29cb281 100755 --- a/src/ONYXKEYS.ts +++ b/src/ONYXKEYS.ts @@ -265,8 +265,6 @@ const ONYXKEYS = { REPORT_USER_IS_LEAVING_ROOM: 'reportUserIsLeavingRoom_', SECURITY_GROUP: 'securityGroup_', TRANSACTION: 'transactions_', - - // Transaction Violations TRANSACTION_VIOLATIONS: 'transactionViolations_', // Holds temporary transactions used during the creation and edit flow From 3d3964a50024ec016c15dfbcb9790118936e6243 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Thu, 7 Dec 2023 13:21:42 +0700 Subject: [PATCH 038/583] fix focus for element --- .../OptionsSelector/BaseOptionsSelector.js | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/components/OptionsSelector/BaseOptionsSelector.js b/src/components/OptionsSelector/BaseOptionsSelector.js index 4b323187cc1b..ffe044b49a7d 100755 --- a/src/components/OptionsSelector/BaseOptionsSelector.js +++ b/src/components/OptionsSelector/BaseOptionsSelector.js @@ -83,6 +83,7 @@ class BaseOptionsSelector extends Component { this.handleFocusIn = this.handleFocusIn.bind(this); this.handleFocusOut = this.handleFocusOut.bind(this); this.relatedTarget = null; + this.accessibilityRoles = _.values(CONST.ACCESSIBILITY_ROLE); const allOptions = this.flattenSections(); const sections = this.sliceSections(); @@ -125,8 +126,11 @@ class BaseOptionsSelector extends Component { } if (prevState.disableEnterShortCut !== this.state.disableEnterShortCut) { - this.unSubscribeFromKeyboardShortcut(); - this.subscribeToKeyboardShortcut(); + if (this.state.disableEnterShortCut) { + this.unSubscribeFromKeyboardShortcut(); + } else { + this.subscribeToKeyboardShortcut(); + } } // Screen coming back into focus, for example @@ -271,7 +275,7 @@ class BaseOptionsSelector extends Component { handleFocusIn() { const activeElement = document.activeElement; this.setState({ - disableEnterShortCut: activeElement && [CONST.ACCESSIBILITY_ROLE.CHECKBOX].includes(activeElement.role), + disableEnterShortCut: activeElement && this.accessibilityRoles.includes(activeElement.role) && activeElement.role !== CONST.ACCESSIBILITY_ROLE.TEXT, }); } @@ -282,11 +286,17 @@ class BaseOptionsSelector extends Component { } subscribeActiveElement() { + if (![CONST.PLATFORM.DESKTOP, CONST.PLATFORM.WEB].includes(getPlatform())) { + return; + } document.addEventListener('focusin', this.handleFocusIn); document.addEventListener('focusout', this.handleFocusOut); } unSubscribeActiveElement() { + if (![CONST.PLATFORM.DESKTOP, CONST.PLATFORM.WEB].includes(getPlatform())) { + return; + } document.removeEventListener('focusin', this.handleFocusIn); document.removeEventListener('focusout', this.handleFocusOut); } @@ -295,7 +305,7 @@ class BaseOptionsSelector extends Component { const enterConfig = CONST.KEYBOARD_SHORTCUTS.ENTER; this.unsubscribeEnter = KeyboardShortcut.subscribe( enterConfig.shortcutKey, - !this.state.disableEnterShortCut ? this.selectFocusedOption : undefined, + this.selectFocusedOption, enterConfig.descriptionKey, enterConfig.modifiers, true, From cae1e0d75c77a8bcb3f0a5c261e92ed231940614 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Thu, 7 Dec 2023 15:13:59 -0500 Subject: [PATCH 039/583] Working on removing the onyx connect and using withOnyx --- .../LHNOptionsList/LHNOptionsList.js | 47 +++++++++--- .../LHNOptionsList/OptionRowLHNData.js | 7 +- .../ReportActionItem/ReportPreview.js | 24 ++++++- src/libs/OptionsListUtils.js | 4 +- src/libs/ReportUtils.ts | 71 ++++++++++--------- src/libs/SidebarUtils.ts | 12 ++-- 6 files changed, 112 insertions(+), 53 deletions(-) diff --git a/src/components/LHNOptionsList/LHNOptionsList.js b/src/components/LHNOptionsList/LHNOptionsList.js index 54830f5319f0..ab8101bddf45 100644 --- a/src/components/LHNOptionsList/LHNOptionsList.js +++ b/src/components/LHNOptionsList/LHNOptionsList.js @@ -8,6 +8,7 @@ import _ from 'underscore'; import participantPropTypes from '@components/participantPropTypes'; import transactionPropTypes from '@components/transactionPropTypes'; import withCurrentReportID, {withCurrentReportIDDefaultProps, withCurrentReportIDPropTypes} from '@components/withCurrentReportID'; +import usePermissions from '@hooks/usePermissions'; import compose from '@libs/compose'; import * as OptionsListUtils from '@libs/OptionsListUtils'; import * as ReportUtils from '@libs/ReportUtils'; @@ -66,8 +67,21 @@ const propTypes = { /** List of draft comments */ draftComments: PropTypes.objectOf(PropTypes.string), - /** The list of betas the user has access to */ - betas: PropTypes.arrayOf(PropTypes.string), + /** The list of transaction violations */ + transactionViolations: PropTypes.shape({ + violations: PropTypes.arrayOf( + PropTypes.shape({ + /** The transaction ID */ + transactionID: PropTypes.number, + + /** The transaction violation type */ + type: PropTypes.string, + + /** The transaction violation message */ + message: PropTypes.string, + }), + ), + }), ...withCurrentReportIDPropTypes, }; @@ -81,7 +95,7 @@ const defaultProps = { personalDetails: {}, transactions: {}, draftComments: {}, - betas: [], + transactionViolations: {}, ...withCurrentReportIDDefaultProps, }; @@ -102,9 +116,10 @@ function LHNOptionsList({ transactions, draftComments, currentReportID, - betas, + transactionViolations, }) { const styles = useThemeStyles(); + const {canUseViolations} = usePermissions(); /** * Function which renders a row in the list * @@ -142,11 +157,26 @@ function LHNOptionsList({ onSelectRow={onSelectRow} preferredLocale={preferredLocale} comment={itemComment} - betas={betas} + transactionViolations={transactionViolations} + canUseViolations={canUseViolations} /> ); }, - [currentReportID, draftComments, onSelectRow, optionMode, personalDetails, policy, preferredLocale, reportActions, reports, shouldDisableFocusOptions, transactions, betas], + [ + currentReportID, + draftComments, + onSelectRow, + optionMode, + personalDetails, + policy, + preferredLocale, + reportActions, + reports, + shouldDisableFocusOptions, + transactions, + transactionViolations, + canUseViolations, + ], ); return ( @@ -195,9 +225,8 @@ export default compose( draftComments: { key: ONYXKEYS.COLLECTION.REPORT_DRAFT_COMMENT, }, - betas: { - key: ONYXKEYS.BETAS, - initialValue: [], + transactionViolations: { + key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATION, }, }), )(LHNOptionsList); diff --git a/src/components/LHNOptionsList/OptionRowLHNData.js b/src/components/LHNOptionsList/OptionRowLHNData.js index 765c4998adce..975299bb8800 100644 --- a/src/components/LHNOptionsList/OptionRowLHNData.js +++ b/src/components/LHNOptionsList/OptionRowLHNData.js @@ -73,7 +73,8 @@ function OptionRowLHNData({ receiptTransactions, parentReportAction, transaction, - betas, + transactionViolations, + canUseViolations, ...propsToForward }) { const reportID = propsToForward.reportID; @@ -88,7 +89,7 @@ function OptionRowLHNData({ const optionItem = useMemo(() => { // Note: ideally we'd have this as a dependent selector in onyx! - const item = SidebarUtils.getOptionData(fullReport, reportActions, personalDetails, preferredLocale, policy, parentReportAction, betas); + const item = SidebarUtils.getOptionData(fullReport, reportActions, personalDetails, preferredLocale, policy, parentReportAction, transactionViolations, canUseViolations); if (deepEqual(item, optionItemRef.current)) { return optionItemRef.current; } @@ -97,7 +98,7 @@ function OptionRowLHNData({ // Listen parentReportAction to update title of thread report when parentReportAction changed // Listen to transaction to update title of transaction report when transaction changed // eslint-disable-next-line react-hooks/exhaustive-deps - }, [fullReport, linkedTransaction, reportActions, personalDetails, preferredLocale, policy, parentReportAction, transaction, betas]); + }, [fullReport, linkedTransaction, reportActions, personalDetails, preferredLocale, policy, parentReportAction, transaction, transactionViolations, canUseViolations]); useEffect(() => { if (!optionItem || optionItem.hasDraftComment || !comment || comment.length <= 0 || isFocused) { diff --git a/src/components/ReportActionItem/ReportPreview.js b/src/components/ReportActionItem/ReportPreview.js index 7f2b50534a2d..d6fdf099cbaa 100644 --- a/src/components/ReportActionItem/ReportPreview.js +++ b/src/components/ReportActionItem/ReportPreview.js @@ -91,6 +91,22 @@ const propTypes = { /** Whether a message is a whisper */ isWhisper: PropTypes.bool, + /** All of the transaction violations */ + transactionViolations: PropTypes.shape({ + violations: PropTypes.arrayOf( + PropTypes.shape({ + /** The transaction ID */ + transactionID: PropTypes.number, + + /** The transaction violation type */ + type: PropTypes.string, + + /** The transaction violation message */ + message: PropTypes.string, + }), + ), + }), + ...withLocalizePropTypes, }; @@ -104,6 +120,9 @@ const defaultProps = { accountID: null, }, isWhisper: false, + transactionViolations: { + violations: [], + }, }; function ReportPreview(props) { @@ -127,7 +146,7 @@ function ReportPreview(props) { const hasReceipts = transactionsWithReceipts.length > 0; const hasOnlyDistanceRequests = ReportUtils.hasOnlyDistanceRequestTransactions(props.iouReportID); const isScanning = hasReceipts && ReportUtils.areAllRequestsBeingSmartScanned(props.iouReportID, props.action); - const hasErrors = (hasReceipts && ReportUtils.hasMissingSmartscanFields(props.iouReportID)) || ReportUtils.reportHasViolations(props.iouReportID); + const hasErrors = (hasReceipts && ReportUtils.hasMissingSmartscanFields(props.iouReportID)) || ReportUtils.reportHasViolations(props.iouReportID, props.transactionViolations); const lastThreeTransactionsWithReceipts = transactionsWithReceipts.slice(-3); const lastThreeReceipts = _.map(lastThreeTransactionsWithReceipts, (transaction) => ReceiptUtils.getThumbnailAndImageURIs(transaction)); const hasNonReimbursableTransactions = ReportUtils.hasNonReimbursableTransactions(props.iouReportID); @@ -300,5 +319,8 @@ export default compose( session: { key: ONYXKEYS.SESSION, }, + transactionViolations: { + key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, + }, }), )(ReportPreview); diff --git a/src/libs/OptionsListUtils.js b/src/libs/OptionsListUtils.js index 4678ce395f76..43fdb14850a5 100644 --- a/src/libs/OptionsListUtils.js +++ b/src/libs/OptionsListUtils.js @@ -1127,7 +1127,9 @@ function getOptions( const searchValue = parsedPhoneNumber.possible ? parsedPhoneNumber.number.e164 : searchInputValue.toLowerCase(); // Filter out all the reports that shouldn't be displayed - const filteredReports = _.filter(reports, (report) => ReportUtils.shouldReportBeInOptionList(report, Navigation.getTopmostReportId(), false, betas, policies)); + const filteredReports = _.filter(reports, (report) => + ReportUtils.shouldReportBeInOptionList(report, Navigation.getTopmostReportId(), false, betas, policies, reportActions, false, transactionViolations), + ); // Sorting the reports works like this: // - Order everything by the last message timestamp (descending) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index c8ecb8576812..6b143b26418a 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -22,7 +22,7 @@ import {Message, ReportActions} from '@src/types/onyx/ReportAction'; import {Receipt, WaypointCollection} from '@src/types/onyx/Transaction'; import DeepValueOf from '@src/types/utils/DeepValueOf'; import {EmptyObject, isEmptyObject, isNotEmptyObject} from '@src/types/utils/EmptyObject'; -import * as CollectionUtils from './CollectionUtils'; +// import * as CollectionUtils from './CollectionUtils'; import * as CurrencyUtils from './CurrencyUtils'; import DateUtils from './DateUtils'; import isReportMessageAttachment from './isReportMessageAttachment'; @@ -406,31 +406,31 @@ Onyx.connect({ callback: (value) => (loginList = value), }); -const transactionViolations: OnyxCollection = {}; -Onyx.connect({ - key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, - callback: (violations, key) => { - if (!key || !violations) { - return; - } - - const transactionID = CollectionUtils.extractCollectionItemID(key); - transactionViolations[transactionID] = violations; - }, -}); - -const reportActions: OnyxCollection = {}; -Onyx.connect({ - key: ONYXKEYS.COLLECTION.REPORT_ACTIONS, - callback: (actions, key) => { - if (!key || !actions) { - return; - } - - const reportID = CollectionUtils.extractCollectionItemID(key); - reportActions[reportID] = actions; - }, -}); +// const transactionViolations: OnyxCollection = {}; +// Onyx.connect({ +// key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, +// callback: (violations, key) => { +// if (!key || !violations) { +// return; +// } + +// const transactionID = CollectionUtils.extractCollectionItemID(key); +// transactionViolations[transactionID] = violations; +// }, +// }); + +// const reportActions: OnyxCollection = {}; +// Onyx.connect({ +// key: ONYXKEYS.COLLECTION.REPORT_ACTIONS, +// callback: (actions, key) => { +// if (!key || !actions) { +// return; +// } + +// const reportID = CollectionUtils.extractCollectionItemID(key); +// reportActions[reportID] = actions; +// }, +// }); let allPolicyTags: Record = {}; @@ -3435,8 +3435,8 @@ function shouldHideReport(report: OnyxEntry, currentReportId: string): b * Checks if there are any violations belonging to the transaction in the transactionsViolations Onyx object * then checks that the violation is of the proper type */ -function transactionHasViolation(transactionID: string): boolean { - const violations = transactionViolations ? transactionViolations[transactionID]?.value : []; +function transactionHasViolation(transactionID: string, transactionViolations?: TransactionViolations): boolean { + const violations = transactionViolations ? transactionViolations[transactionID] : []; if (!violations) { return false; } @@ -3448,14 +3448,14 @@ function transactionHasViolation(transactionID: string): boolean { * This only applies to report submitter and for reports in the open and processing states */ -function transactionThreadHasViolations(report: Report, betas: Beta[]): boolean { - if (!Permissions.canUseViolations(betas) || !reportActions) { +function transactionThreadHasViolations(report: Report, canUseViolations: boolean, transactionViolations?: TransactionViolations, reportActions?: ReportActions | null): boolean { + if (!canUseViolations || !reportActions) { return false; } if (!report.parentReportActionID) { return false; } - const parentReportAction = reportActions[`${report.parentReportID}`]?.[`${report.parentReportActionID}`]; + const parentReportAction = reportActions[`${report.parentReportActionID}`]; if (!parentReportAction) { return false; } @@ -3472,15 +3472,15 @@ function transactionThreadHasViolations(report: Report, betas: Beta[]): boolean if (report?.stateNum !== CONST.REPORT.STATE_NUM.OPEN && report?.stateNum !== CONST.REPORT.STATE_NUM.PROCESSING) { return false; } - return transactionHasViolation(IOUTransactionID); + return transactionHasViolation(IOUTransactionID, transactionViolations); } /** * Checks to see if a report contains a violation */ -function reportHasViolations(reportID: string): boolean { +function reportHasViolations(reportID: string, transactionViolations: TransactionViolations): boolean { const transactions = TransactionUtils.getAllReportTransactions(reportID); - return transactions.some((transaction) => transactionHasViolation(transaction.transactionID)); + return transactions.some((transaction) => transactionHasViolation(transaction.transactionID, transactionViolations)); } /** @@ -3498,6 +3498,7 @@ function shouldReportBeInOptionList( policies: OnyxCollection, allReportActions?: OnyxCollection, excludeEmptyChats = false, + transactionViolations?: TransactionViolations, ) { const isInDefaultMode = !isInGSDMode; // Exclude reports that have no data because there wouldn't be anything to show in the option item. @@ -3558,7 +3559,7 @@ function shouldReportBeInOptionList( } // Always show IOU reports with violations - if (isExpenseRequest(report) && transactionThreadHasViolations(report, betas)) { + if (isExpenseRequest(report) && transactionThreadHasViolations(report, betas.includes(CONST.BETAS.VIOLATIONS), transactionViolations, allReportActions?.[report.reportID])) { return true; } diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 0c99aca64148..dce959a73872 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -4,7 +4,7 @@ import Onyx, {OnyxCollection} from 'react-native-onyx'; import {ValueOf} from 'type-fest'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import {PersonalDetails} from '@src/types/onyx'; +import {PersonalDetails, TransactionViolations} from '@src/types/onyx'; import Beta from '@src/types/onyx/Beta'; import * as OnyxCommon from '@src/types/onyx/OnyxCommon'; import Policy from '@src/types/onyx/Policy'; @@ -118,6 +118,7 @@ function getOrderedReportIDs( policies: Record, priorityMode: ValueOf, allReportActions: OnyxCollection, + transactionViolations: TransactionViolations, ): string[] { // Generate a unique cache key based on the function arguments const cachedReportsKey = JSON.stringify( @@ -150,7 +151,7 @@ function getOrderedReportIDs( const allReportsDictValues = Object.values(allReports); // Filter out all the reports that shouldn't be displayed const reportsToDisplay = allReportsDictValues.filter((report) => - ReportUtils.shouldReportBeInOptionList(report, currentReportId ?? '', isInGSDMode, betas, policies, allReportActions, true), + ReportUtils.shouldReportBeInOptionList(report, currentReportId ?? '', isInGSDMode, betas, policies, allReportActions, true, transactionViolations), ); if (reportsToDisplay.length === 0) { @@ -237,7 +238,8 @@ function getOptionData( preferredLocale: ValueOf, policy: Policy, parentReportAction: ReportAction, - betas: Beta[], + transactionViolations: TransactionViolations, + canUseViolations: boolean, ): ReportUtils.OptionData | undefined { // When a user signs out, Onyx is cleared. Due to the lazy rendering with a virtual list, it's possible for // this method to be called after the Onyx data has been cleared out. In that case, it's fine to do @@ -291,7 +293,9 @@ function getOptionData( result.pendingAction = report.pendingFields ? report.pendingFields.addWorkspaceRoom || report.pendingFields.createChat : null; result.allReportErrors = OptionsListUtils.getAllReportErrors(report, reportActions) as OnyxCommon.Errors; result.brickRoadIndicator = - Object.keys(result.allReportErrors ?? {}).length !== 0 || ReportUtils.transactionThreadHasViolations(report, betas) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : ''; + Object.keys(result.allReportErrors ?? {}).length !== 0 || ReportUtils.transactionThreadHasViolations(report, canUseViolations, transactionViolations, reportActions) + ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR + : ''; result.ownerAccountID = report.ownerAccountID; result.managerID = report.managerID; result.reportID = report.reportID; From b076d3548415feb75d027d257af24d8fc6bd10d4 Mon Sep 17 00:00:00 2001 From: keisyrzk Date: Mon, 11 Dec 2023 12:14:59 +0100 Subject: [PATCH 040/583] member on delete offline --- src/components/SelectionList/BaseListItem.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/SelectionList/BaseListItem.js b/src/components/SelectionList/BaseListItem.js index c2e468359f3f..818f9a2770a3 100644 --- a/src/components/SelectionList/BaseListItem.js +++ b/src/components/SelectionList/BaseListItem.js @@ -91,6 +91,7 @@ function BaseListItem({ isFocused ? styles.sidebarLinkActiveText : styles.sidebarLinkText, isUserItem || item.isSelected ? styles.sidebarLinkTextBold : null, styles.pre, + item.pendingAction === 'delete' ? styles.offlineFeedback.deleted : null, ]} alternateTextStyles={[styles.optionAlternateText, styles.textLabelSupporting, isFocused ? styles.sidebarLinkActiveText : styles.sidebarLinkText, styles.pre]} isDisabled={isDisabled} From 681bb5ea7fbccc9f751085e7376f62a6a47129f9 Mon Sep 17 00:00:00 2001 From: keisyrzk Date: Mon, 11 Dec 2023 12:24:34 +0100 Subject: [PATCH 041/583] update alternateTextStyles --- src/components/SelectionList/BaseListItem.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/SelectionList/BaseListItem.js b/src/components/SelectionList/BaseListItem.js index 818f9a2770a3..06c8f9f638a1 100644 --- a/src/components/SelectionList/BaseListItem.js +++ b/src/components/SelectionList/BaseListItem.js @@ -93,7 +93,13 @@ function BaseListItem({ styles.pre, item.pendingAction === 'delete' ? styles.offlineFeedback.deleted : null, ]} - alternateTextStyles={[styles.optionAlternateText, styles.textLabelSupporting, isFocused ? styles.sidebarLinkActiveText : styles.sidebarLinkText, styles.pre]} + alternateTextStyles={[ + styles.optionAlternateText, + styles.textLabelSupporting, + isFocused ? styles.sidebarLinkActiveText : styles.sidebarLinkText, + styles.pre, + item.pendingAction === 'delete' ? styles.offlineFeedback.deleted : null, + ]} isDisabled={isDisabled} onSelectRow={onSelectRow} showTooltip={showTooltip} From 32f95b62675a9e868a6ab01ea653657d3a53a5e9 Mon Sep 17 00:00:00 2001 From: Blazej Kustra Date: Mon, 11 Dec 2023 16:17:06 +0100 Subject: [PATCH 042/583] [TS migration] Migrate 'VideoChatButtonAndMenu' component to TypeScript --- src/components/Popover/types.ts | 15 +++---- src/components/PopoverProvider/index.tsx | 39 +++++++++------- src/components/PopoverProvider/types.ts | 13 +++--- ...Menu.js => BaseVideoChatButtonAndMenu.tsx} | 44 ++++++++----------- .../{index.android.js => index.android.tsx} | 7 ++- .../{index.js => index.tsx} | 7 ++- .../VideoChatButtonAndMenu/types.ts | 9 ++++ .../videoChatButtonAndMenuPropTypes.js | 16 ------- 8 files changed, 71 insertions(+), 79 deletions(-) rename src/components/VideoChatButtonAndMenu/{BaseVideoChatButtonAndMenu.js => BaseVideoChatButtonAndMenu.tsx} (75%) rename src/components/VideoChatButtonAndMenu/{index.android.js => index.android.tsx} (76%) rename src/components/VideoChatButtonAndMenu/{index.js => index.tsx} (68%) create mode 100644 src/components/VideoChatButtonAndMenu/types.ts delete mode 100644 src/components/VideoChatButtonAndMenu/videoChatButtonAndMenuPropTypes.js diff --git a/src/components/Popover/types.ts b/src/components/Popover/types.ts index 7f7e2829770c..103ab0404081 100644 --- a/src/components/Popover/types.ts +++ b/src/components/Popover/types.ts @@ -1,8 +1,8 @@ +import {ReactNode, RefObject} from 'react'; +import {View} from 'react-native'; import BaseModalProps, {PopoverAnchorPosition} from '@components/Modal/types'; import {WindowDimensionsProps} from '@components/withWindowDimensions/types'; -type AnchorAlignment = {horizontal: string; vertical: string}; - type PopoverDimensions = { width: number; height: number; @@ -12,14 +12,11 @@ type PopoverProps = BaseModalProps & { /** The anchor position of the popover */ anchorPosition?: PopoverAnchorPosition; - /** The anchor alignment of the popover */ - anchorAlignment: AnchorAlignment; - /** The anchor ref of the popover */ - anchorRef: React.RefObject; + anchorRef: RefObject; /** Whether disable the animations */ - disableAnimation: boolean; + disableAnimation?: boolean; /** Whether we don't want to show overlay */ withoutOverlay: boolean; @@ -28,13 +25,13 @@ type PopoverProps = BaseModalProps & { popoverDimensions?: PopoverDimensions; /** The ref of the popover */ - withoutOverlayRef?: React.RefObject; + withoutOverlayRef?: RefObject; /** Whether we want to show the popover on the right side of the screen */ fromSidebarMediumScreen?: boolean; /** The popover children */ - children: React.ReactNode; + children: ReactNode; }; type PopoverWithWindowDimensionsProps = PopoverProps & WindowDimensionsProps; diff --git a/src/components/PopoverProvider/index.tsx b/src/components/PopoverProvider/index.tsx index 06345ebdbc1c..1be7c7a95bc1 100644 --- a/src/components/PopoverProvider/index.tsx +++ b/src/components/PopoverProvider/index.tsx @@ -1,18 +1,26 @@ -import React from 'react'; +import React, {createContext, RefObject, useCallback, useEffect, useMemo, useRef, useState} from 'react'; +import {View} from 'react-native'; import {AnchorRef, PopoverContextProps, PopoverContextValue} from './types'; -const PopoverContext = React.createContext({ +const PopoverContext = createContext({ onOpen: () => {}, popover: {}, close: () => {}, isOpen: false, }); +function elementContains(ref: RefObject | undefined, target: EventTarget | null) { + if (ref?.current && 'contains' in ref?.current && ref?.current?.contains(target as Node)) { + return true; + } + return false; +} + function PopoverContextProvider(props: PopoverContextProps) { - const [isOpen, setIsOpen] = React.useState(false); - const activePopoverRef = React.useRef(null); + const [isOpen, setIsOpen] = useState(false); + const activePopoverRef = useRef(null); - const closePopover = React.useCallback((anchorRef?: React.RefObject) => { + const closePopover = useCallback((anchorRef?: RefObject) => { if (!activePopoverRef.current || (anchorRef && anchorRef !== activePopoverRef.current.anchorRef)) { return; } @@ -25,10 +33,9 @@ function PopoverContextProvider(props: PopoverContextProps) { setIsOpen(false); }, []); - React.useEffect(() => { + useEffect(() => { const listener = (e: Event) => { - // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - if (activePopoverRef.current?.ref?.current?.contains(e.target as Node) || activePopoverRef.current?.anchorRef?.current?.contains(e.target as Node)) { + if (elementContains(activePopoverRef.current?.ref, e.target) || elementContains(activePopoverRef.current?.anchorRef, e.target)) { return; } const ref = activePopoverRef.current?.anchorRef; @@ -40,9 +47,9 @@ function PopoverContextProvider(props: PopoverContextProps) { }; }, [closePopover]); - React.useEffect(() => { + useEffect(() => { const listener = (e: Event) => { - if (activePopoverRef.current?.ref?.current?.contains(e.target as Node)) { + if (elementContains(activePopoverRef.current?.ref, e.target)) { return; } closePopover(); @@ -53,7 +60,7 @@ function PopoverContextProvider(props: PopoverContextProps) { }; }, [closePopover]); - React.useEffect(() => { + useEffect(() => { const listener = (e: KeyboardEvent) => { if (e.key !== 'Escape') { return; @@ -66,7 +73,7 @@ function PopoverContextProvider(props: PopoverContextProps) { }; }, [closePopover]); - React.useEffect(() => { + useEffect(() => { const listener = () => { if (document.hasFocus()) { return; @@ -79,9 +86,9 @@ function PopoverContextProvider(props: PopoverContextProps) { }; }, [closePopover]); - React.useEffect(() => { + useEffect(() => { const listener = (e: Event) => { - if (activePopoverRef.current?.ref?.current?.contains(e.target as Node)) { + if (elementContains(activePopoverRef.current?.ref, e.target)) { return; } @@ -93,7 +100,7 @@ function PopoverContextProvider(props: PopoverContextProps) { }; }, [closePopover]); - const onOpen = React.useCallback( + const onOpen = useCallback( (popoverParams: AnchorRef) => { if (activePopoverRef.current && activePopoverRef.current.ref !== popoverParams?.ref) { closePopover(activePopoverRef.current.anchorRef); @@ -107,7 +114,7 @@ function PopoverContextProvider(props: PopoverContextProps) { [closePopover], ); - const contextValue = React.useMemo( + const contextValue = useMemo( () => ({ onOpen, close: closePopover, diff --git a/src/components/PopoverProvider/types.ts b/src/components/PopoverProvider/types.ts index ffd0087cd5ff..dc0208e10dd7 100644 --- a/src/components/PopoverProvider/types.ts +++ b/src/components/PopoverProvider/types.ts @@ -1,18 +1,21 @@ +import {ReactNode, RefObject} from 'react'; +import {View} from 'react-native'; + type PopoverContextProps = { - children: React.ReactNode; + children: ReactNode; }; type PopoverContextValue = { onOpen?: (popoverParams: AnchorRef) => void; popover?: AnchorRef | Record | null; - close: (anchorRef?: React.RefObject) => void; + close: (anchorRef?: RefObject) => void; isOpen: boolean; }; type AnchorRef = { - ref: React.RefObject; - close: (anchorRef?: React.RefObject) => void; - anchorRef: React.RefObject; + ref: RefObject; + close: (anchorRef?: RefObject) => void; + anchorRef: RefObject; onOpenCallback?: () => void; onCloseCallback?: () => void; }; diff --git a/src/components/VideoChatButtonAndMenu/BaseVideoChatButtonAndMenu.js b/src/components/VideoChatButtonAndMenu/BaseVideoChatButtonAndMenu.tsx similarity index 75% rename from src/components/VideoChatButtonAndMenu/BaseVideoChatButtonAndMenu.js rename to src/components/VideoChatButtonAndMenu/BaseVideoChatButtonAndMenu.tsx index 4d5affafc407..14dbcb9a118b 100755 --- a/src/components/VideoChatButtonAndMenu/BaseVideoChatButtonAndMenu.js +++ b/src/components/VideoChatButtonAndMenu/BaseVideoChatButtonAndMenu.tsx @@ -1,7 +1,5 @@ -import PropTypes from 'prop-types'; import React, {useCallback, useEffect, useRef, useState} from 'react'; import {Dimensions, View} from 'react-native'; -import _ from 'underscore'; import GoogleMeetIcon from '@assets/images/google-meet.svg'; import ZoomIcon from '@assets/images/zoom-icon.svg'; import Icon from '@components/Icon'; @@ -10,37 +8,34 @@ import MenuItem from '@components/MenuItem'; import Popover from '@components/Popover'; import PressableWithoutFeedback from '@components/Pressable/PressableWithoutFeedback'; import Tooltip from '@components/Tooltip/PopoverAnchorTooltip'; -import withLocalize, {withLocalizePropTypes} from '@components/withLocalize'; -import withWindowDimensions, {windowDimensionsPropTypes} from '@components/withWindowDimensions'; -import compose from '@libs/compose'; +import useLocalize from '@hooks/useLocalize'; +import useWindowDimensions from '@hooks/useWindowDimensions'; import useTheme from '@styles/themes/useTheme'; import useThemeStyles from '@styles/useThemeStyles'; import * as Link from '@userActions/Link'; import * as Session from '@userActions/Session'; import CONST from '@src/CONST'; -import {defaultProps, propTypes as videoChatButtonAndMenuPropTypes} from './videoChatButtonAndMenuPropTypes'; +import VideoChatButtonAndMenuProps from './types'; -const propTypes = { +type BaseVideoChatButtonAndMenuProps = VideoChatButtonAndMenuProps & { /** Link to open when user wants to create a new google meet meeting */ - googleMeetURL: PropTypes.string.isRequired, - - ...videoChatButtonAndMenuPropTypes, - ...withLocalizePropTypes, - ...windowDimensionsPropTypes, + googleMeetURL: string; }; -function BaseVideoChatButtonAndMenu(props) { +function BaseVideoChatButtonAndMenu(props: BaseVideoChatButtonAndMenuProps) { const theme = useTheme(); const styles = useThemeStyles(); + const {translate} = useLocalize(); + const {isSmallScreenWidth} = useWindowDimensions(); const [isVideoChatMenuActive, setIsVideoChatMenuActive] = useState(false); const [videoChatIconPosition, setVideoChatIconPosition] = useState({x: 0, y: 0}); - const videoChatIconWrapperRef = useRef(null); - const videoChatButtonRef = useRef(null); + const videoChatIconWrapperRef = useRef(null); + const videoChatButtonRef = useRef(null); const menuItemData = [ { icon: ZoomIcon, - text: props.translate('videoChatButtonAndMenu.zoom'), + text: translate('videoChatButtonAndMenu.zoom'), onPress: () => { setIsVideoChatMenuActive(false); Link.openExternalLink(CONST.NEW_ZOOM_MEETING_URL); @@ -48,7 +43,7 @@ function BaseVideoChatButtonAndMenu(props) { }, { icon: GoogleMeetIcon, - text: props.translate('videoChatButtonAndMenu.googleMeet'), + text: translate('videoChatButtonAndMenu.googleMeet'), onPress: () => { setIsVideoChatMenuActive(false); Link.openExternalLink(props.googleMeetURL); @@ -87,12 +82,12 @@ function BaseVideoChatButtonAndMenu(props) { ref={videoChatIconWrapperRef} onLayout={measureVideoChatIconPosition} > - + { // Drop focus to avoid blue focus ring. - videoChatButtonRef.current.blur(); + videoChatButtonRef.current?.blur(); // If this is the Concierge chat, we'll open the modal for requesting a setup call instead if (props.isConcierge && props.guideCalendarLink) { @@ -102,7 +97,7 @@ function BaseVideoChatButtonAndMenu(props) { setIsVideoChatMenuActive((previousVal) => !previousVal); })} style={styles.touchableButtonImage} - accessibilityLabel={props.translate('videoChatButtonAndMenu.tooltip')} + accessibilityLabel={translate('videoChatButtonAndMenu.tooltip')} role={CONST.ACCESSIBILITY_ROLE.BUTTON} > - - {_.map(menuItemData, ({icon, text, onPress}) => ( + + {menuItemData.map(({icon, text, onPress}) => ( Date: Mon, 11 Dec 2023 18:19:39 +0100 Subject: [PATCH 043/583] [TS migration] Migrate 'ShowContextMenuContext.js' component to TypeScript --- ...MenuContext.js => ShowContextMenuContext.tsx} | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) rename src/components/{ShowContextMenuContext.js => ShowContextMenuContext.tsx} (67%) diff --git a/src/components/ShowContextMenuContext.js b/src/components/ShowContextMenuContext.tsx similarity index 67% rename from src/components/ShowContextMenuContext.js rename to src/components/ShowContextMenuContext.tsx index 6248478e5fea..b2c1835d59e7 100644 --- a/src/components/ShowContextMenuContext.js +++ b/src/components/ShowContextMenuContext.tsx @@ -3,6 +3,7 @@ import * as DeviceCapabilities from '@libs/DeviceCapabilities'; import * as ReportUtils from '@libs/ReportUtils'; import * as ContextMenuActions from '@pages/home/report/ContextMenu/ContextMenuActions'; import * as ReportActionContextMenu from '@pages/home/report/ContextMenu/ReportActionContextMenu'; +import ReportAction from '@src/types/onyx/ReportAction'; const ShowContextMenuContext = React.createContext({ anchor: null, @@ -16,17 +17,18 @@ ShowContextMenuContext.displayName = 'ShowContextMenuContext'; /** * Show the report action context menu. * - * @param {Object} event - Press event object - * @param {Element} anchor - Context menu anchor - * @param {String} reportID - Active Report ID - * @param {Object} action - ReportAction for ContextMenu - * @param {Function} checkIfContextMenuActive Callback to update context menu active state - * @param {Boolean} [isArchivedRoom=false] - Is the report an archived room + * @param event - Press event object + * @param anchor - Context menu anchor + * @param reportID - Active Report ID + * @param action - ReportAction for ContextMenu + * @param checkIfContextMenuActive Callback to update context menu active state + * @param isArchivedRoom - Is the report an archived room */ -function showContextMenuForReport(event, anchor, reportID, action, checkIfContextMenuActive, isArchivedRoom = false) { +function showContextMenuForReport(event: Event, anchor: HTMLElement, reportID: string, action: ReportAction, checkIfContextMenuActive: () => void, isArchivedRoom = false) { if (!DeviceCapabilities.canUseTouchScreen()) { return; } + ReportActionContextMenu.showContextMenu( ContextMenuActions.CONTEXT_MENU_TYPES.REPORT_ACTION, event, From 90b7138e07a082816778408d16e99d645e029481 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Mon, 11 Dec 2023 16:13:00 -0500 Subject: [PATCH 044/583] Starting so swap in the transactionViolations --- src/pages/home/report/ReportActionItem.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/home/report/ReportActionItem.js b/src/pages/home/report/ReportActionItem.js index 92bb370155c9..f743d75cb590 100644 --- a/src/pages/home/report/ReportActionItem.js +++ b/src/pages/home/report/ReportActionItem.js @@ -342,6 +342,7 @@ function ReportActionItem(props) { contextMenuAnchor={popoverAnchorRef} checkIfContextMenuActive={toggleContextMenuFromActiveReportAction} isWhisper={isWhisper} + transactionViolations={props.transactionViolations} /> ); } else if ( From 35de23f38d48365b681a8d7aef348c7c3cc135b5 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Tue, 12 Dec 2023 09:35:19 -0500 Subject: [PATCH 045/583] Fixed tests and created new hook mock --- src/components/LHNOptionsList/LHNOptionsList.js | 2 +- src/hooks/__mocks__/usePermissions.ts | 11 +++++++++++ src/libs/OptionsListUtils.js | 1 + tests/perf-test/SidebarUtils.perf-test.ts | 9 +++++---- tests/unit/SidebarFilterTest.js | 1 + tests/unit/SidebarOrderTest.js | 1 + tests/unit/SidebarTest.js | 1 + 7 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 src/hooks/__mocks__/usePermissions.ts diff --git a/src/components/LHNOptionsList/LHNOptionsList.js b/src/components/LHNOptionsList/LHNOptionsList.js index ab8101bddf45..d2dc958d811f 100644 --- a/src/components/LHNOptionsList/LHNOptionsList.js +++ b/src/components/LHNOptionsList/LHNOptionsList.js @@ -226,7 +226,7 @@ export default compose( key: ONYXKEYS.COLLECTION.REPORT_DRAFT_COMMENT, }, transactionViolations: { - key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATION, + key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, }, }), )(LHNOptionsList); diff --git a/src/hooks/__mocks__/usePermissions.ts b/src/hooks/__mocks__/usePermissions.ts new file mode 100644 index 000000000000..4af004095712 --- /dev/null +++ b/src/hooks/__mocks__/usePermissions.ts @@ -0,0 +1,11 @@ +import UsePermissions from '@hooks/usePermissions'; + +/** + * + * @returns {UsePermissions} A mock of the usePermissions hook. + */ + +const usePermissions = (): typeof UsePermissions => () => ({ + canUseViolations: true, +}); +export default usePermissions; diff --git a/src/libs/OptionsListUtils.js b/src/libs/OptionsListUtils.js index 43fdb14850a5..b431505fa9d6 100644 --- a/src/libs/OptionsListUtils.js +++ b/src/libs/OptionsListUtils.js @@ -1081,6 +1081,7 @@ function getOptions( recentlyUsedTags = [], canInviteUser = true, includeSelectedOptions = false, + transactionViolations = {}, }, ) { if (includeCategories) { diff --git a/tests/perf-test/SidebarUtils.perf-test.ts b/tests/perf-test/SidebarUtils.perf-test.ts index fb3cac24053a..4424a66d3936 100644 --- a/tests/perf-test/SidebarUtils.perf-test.ts +++ b/tests/perf-test/SidebarUtils.perf-test.ts @@ -3,7 +3,7 @@ import {measureFunction} from 'reassure'; import SidebarUtils from '@libs/SidebarUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import {Beta, PersonalDetails} from '@src/types/onyx'; +import {PersonalDetails, TransactionViolations} from '@src/types/onyx'; import Policy from '@src/types/onyx/Policy'; import Report from '@src/types/onyx/Report'; import ReportAction, {ReportActions} from '@src/types/onyx/ReportAction'; @@ -51,20 +51,21 @@ test('getOptionData on 5k reports', async () => { const preferredLocale = 'en'; const policy = createRandomPolicy(1); const parentReportAction = createRandomReportAction(1); - const betas: Beta[] = []; + const transactionViolations = {} as TransactionViolations; Onyx.multiSet({ ...mockedResponseMap, }); await waitForBatchedUpdates(); - await measureFunction(() => SidebarUtils.getOptionData(report, reportActions, personalDetails, preferredLocale, policy, parentReportAction, betas), {runs}); + await measureFunction(() => SidebarUtils.getOptionData(report, reportActions, personalDetails, preferredLocale, policy, parentReportAction, transactionViolations, false), {runs}); }); test('getOrderedReportIDs on 5k reports', async () => { const currentReportId = '1'; const allReports = getMockedReports(); const betas = [CONST.BETAS.DEFAULT_ROOMS, CONST.BETAS.POLICY_ROOMS]; + const transactionViolations = {} as TransactionViolations; const policies = createCollection( (item) => `${ONYXKEYS.COLLECTION.POLICY}${item.id}`, @@ -94,5 +95,5 @@ test('getOrderedReportIDs on 5k reports', async () => { }); await waitForBatchedUpdates(); - await measureFunction(() => SidebarUtils.getOrderedReportIDs(currentReportId, allReports, betas, policies, CONST.PRIORITY_MODE.DEFAULT, allReportActions), {runs}); + await measureFunction(() => SidebarUtils.getOrderedReportIDs(currentReportId, allReports, betas, policies, CONST.PRIORITY_MODE.DEFAULT, allReportActions, transactionViolations), {runs}); }); diff --git a/tests/unit/SidebarFilterTest.js b/tests/unit/SidebarFilterTest.js index 23a958e3aa9d..4ecddfb8fd9e 100644 --- a/tests/unit/SidebarFilterTest.js +++ b/tests/unit/SidebarFilterTest.js @@ -10,6 +10,7 @@ import wrapOnyxWithWaitForBatchedUpdates from '../utils/wrapOnyxWithWaitForBatch // Be sure to include the mocked permissions library or else the beta tests won't work jest.mock('../../src/libs/Permissions'); +jest.mock('../../src/hooks/usePermissions.ts'); const ONYXKEYS = { PERSONAL_DETAILS_LIST: 'personalDetailsList', diff --git a/tests/unit/SidebarOrderTest.js b/tests/unit/SidebarOrderTest.js index 6eef3e40bf1c..d9ab881a442e 100644 --- a/tests/unit/SidebarOrderTest.js +++ b/tests/unit/SidebarOrderTest.js @@ -11,6 +11,7 @@ import wrapOnyxWithWaitForBatchedUpdates from '../utils/wrapOnyxWithWaitForBatch // Be sure to include the mocked Permissions and Expensicons libraries or else the beta tests won't work jest.mock('../../src/libs/Permissions'); +jest.mock('../../src/hooks/usePermissions.ts'); jest.mock('../../src/components/Icon/Expensicons'); const ONYXKEYS = { diff --git a/tests/unit/SidebarTest.js b/tests/unit/SidebarTest.js index 4bd0795aa3b9..70c7a33a8dc6 100644 --- a/tests/unit/SidebarTest.js +++ b/tests/unit/SidebarTest.js @@ -9,6 +9,7 @@ import wrapOnyxWithWaitForBatchedUpdates from '../utils/wrapOnyxWithWaitForBatch // Be sure to include the mocked Permissions and Expensicons libraries or else the beta tests won't work jest.mock('../../src/libs/Permissions'); +jest.mock('../../src/hooks/usePermissions.ts'); jest.mock('../../src/components/Icon/Expensicons'); const ONYXKEYS = { From bbfd1fa60a61af863c91e23472c17e26056f3151 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Tue, 12 Dec 2023 11:36:13 -0500 Subject: [PATCH 046/583] Switched to just passing down parentReportAction --- src/libs/ReportUtils.ts | 17 +++++++---------- src/libs/SidebarUtils.ts | 2 +- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 6b143b26418a..ecb7041771f6 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3448,15 +3448,9 @@ function transactionHasViolation(transactionID: string, transactionViolations?: * This only applies to report submitter and for reports in the open and processing states */ -function transactionThreadHasViolations(report: Report, canUseViolations: boolean, transactionViolations?: TransactionViolations, reportActions?: ReportActions | null): boolean { - if (!canUseViolations || !reportActions) { - return false; - } - if (!report.parentReportActionID) { - return false; - } - const parentReportAction = reportActions[`${report.parentReportActionID}`]; - if (!parentReportAction) { +function transactionThreadHasViolations(report: Report, canUseViolations: boolean, transactionViolations?: TransactionViolations, parentReportAction?: ReportAction | null): boolean { + console.log('Parent Report Action : ', parentReportAction); + if (!canUseViolations || !parentReportAction) { return false; } if (parentReportAction.actionName !== CONST.REPORT.ACTIONS.TYPE.IOU) { @@ -3559,7 +3553,10 @@ function shouldReportBeInOptionList( } // Always show IOU reports with violations - if (isExpenseRequest(report) && transactionThreadHasViolations(report, betas.includes(CONST.BETAS.VIOLATIONS), transactionViolations, allReportActions?.[report.reportID])) { + if ( + isExpenseRequest(report) && + transactionThreadHasViolations(report, betas.includes(CONST.BETAS.VIOLATIONS), transactionViolations, allReportActions?.[`${report.parentReportActionID}`]) + ) { return true; } diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index dce959a73872..15c6e4a4c235 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -293,7 +293,7 @@ function getOptionData( result.pendingAction = report.pendingFields ? report.pendingFields.addWorkspaceRoom || report.pendingFields.createChat : null; result.allReportErrors = OptionsListUtils.getAllReportErrors(report, reportActions) as OnyxCommon.Errors; result.brickRoadIndicator = - Object.keys(result.allReportErrors ?? {}).length !== 0 || ReportUtils.transactionThreadHasViolations(report, canUseViolations, transactionViolations, reportActions) + Object.keys(result.allReportErrors ?? {}).length !== 0 || ReportUtils.transactionThreadHasViolations(report, canUseViolations, transactionViolations, parentReportAction) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : ''; result.ownerAccountID = report.ownerAccountID; From 2c52edf9bfe2777b3b6a0be3762a044259b622d8 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Tue, 12 Dec 2023 15:53:04 -0500 Subject: [PATCH 047/583] Move the report actions selector to the SidebarUtils file --- src/libs/ReportUtils.ts | 12 +++-- src/libs/SidebarUtils.ts | 52 ++++++++++++++++++++-- src/pages/home/sidebar/SidebarLinksData.js | 48 +++++++++++--------- tests/perf-test/SidebarUtils.perf-test.ts | 4 +- 4 files changed, 85 insertions(+), 31 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 3d105cc548fa..30a805d1b9c8 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3504,7 +3504,7 @@ function shouldHideReport(report: OnyxEntry, currentReportId: string): b * then checks that the violation is of the proper type */ function transactionHasViolation(transactionID: string, transactionViolations?: TransactionViolations): boolean { - const violations = transactionViolations ? transactionViolations[transactionID] : []; + const violations: TransactionViolation[] = transactionViolations ? transactionViolations[transactionID] || [] : []; if (!violations) { return false; } @@ -3517,8 +3517,7 @@ function transactionHasViolation(transactionID: string, transactionViolations?: */ function transactionThreadHasViolations(report: Report, canUseViolations: boolean, transactionViolations?: TransactionViolations, parentReportAction?: ReportAction | null): boolean { - console.log('Parent Report Action : ', parentReportAction); - if (!canUseViolations || !parentReportAction) { + if (!parentReportAction) { return false; } if (parentReportAction.actionName !== CONST.REPORT.ACTIONS.TYPE.IOU) { @@ -3623,7 +3622,12 @@ function shouldReportBeInOptionList( // Always show IOU reports with violations if ( isExpenseRequest(report) && - transactionThreadHasViolations(report, betas.includes(CONST.BETAS.VIOLATIONS), transactionViolations, allReportActions?.[`${report.parentReportActionID}`]) + transactionThreadHasViolations( + report, + betas.includes(CONST.BETAS.VIOLATIONS), + transactionViolations, + allReportActions?.[`${report.parentReportID}`]?.[`${report.parentReportActionID}`], + ) ) { return true; } diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 2a09758b26d5..8db53e46882b 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -8,7 +8,7 @@ import {PersonalDetails, TransactionViolations} from '@src/types/onyx'; import Beta from '@src/types/onyx/Beta'; import * as OnyxCommon from '@src/types/onyx/OnyxCommon'; import Policy from '@src/types/onyx/Policy'; -import Report from '@src/types/onyx/Report'; +import Report, {Message} from '@src/types/onyx/Report'; import ReportAction, {ReportActions} from '@src/types/onyx/ReportAction'; import * as CollectionUtils from './CollectionUtils'; import * as LocalePhoneNumber from './LocalePhoneNumber'; @@ -108,6 +108,51 @@ function setWithLimit(map: Map, key: TKey, value: TV // Variable to verify if ONYX actions are loaded let hasInitialReportActions = false; +// Originally we were passing down the reportActions as the type OnyxCollection but +// it was used as a Record in the cachedReportsKey. This was causing a type error +// for the ReportUtils.shouldReportBeInOptionList function. To fix this, we are now passing down the reportActions +// as a Record and then converting it to a Record in the +// reportActionsSelector function. +// This function was originally in the parent component as an Onyx selector, but it was moved here to prevent +// to simplify the logic and prevent the need to pass down the reportActions as an array. + +type MappedReportAction = { + id: string; + errors: OnyxCommon.Errors; + message: Message[]; +}; + +type MappedReportActions = Record; + +const reportActionsSelector = (reportActions?: MappedReportActions): Record | undefined => { + if (!reportActions) { + return undefined; + } + + return Object.values(reportActions).reduce((acc, reportAction) => { + const modifiedAction: MappedReportAction = { + id: reportAction.id, + errors: reportAction.errors || [], + message: [ + { + moderationDecision: { + decision: reportAction.message?.[0]?.moderationDecision?.decision, + }, + }, + ], + }; + + // If the key already exists, append to the array, otherwise create a new array + if (acc[reportAction.id]) { + acc[reportAction.id].push(modifiedAction); + } else { + acc[reportAction.id] = [modifiedAction]; + } + + return acc; + }, {} as Record); +}; + /** * @returns An array of reportIDs sorted in the proper order */ @@ -117,13 +162,14 @@ function getOrderedReportIDs( betas: Beta[], policies: Record, priorityMode: ValueOf, - allReportActions: OnyxCollection, + allReportActions: OnyxCollection, transactionViolations: TransactionViolations, ): string[] { + const mappedReportActions = reportActionsSelector(allReportActions as unknown as MappedReportActions); // Generate a unique cache key based on the function arguments const cachedReportsKey = JSON.stringify( // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - [currentReportId, allReports, betas, policies, priorityMode, allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${currentReportId}`]?.length || 1], + [currentReportId, allReports, betas, policies, priorityMode, mappedReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${currentReportId}`]?.length || 1], (key, value: unknown) => { /** * Exclude 'participantAccountIDs', 'participants' and 'lastMessageText' not to overwhelm a cached key value with huge data, diff --git a/src/pages/home/sidebar/SidebarLinksData.js b/src/pages/home/sidebar/SidebarLinksData.js index 97f119bbd2e8..856af9fd5223 100644 --- a/src/pages/home/sidebar/SidebarLinksData.js +++ b/src/pages/home/sidebar/SidebarLinksData.js @@ -1,5 +1,4 @@ import {deepEqual} from 'fast-equals'; -import lodashGet from 'lodash/get'; import PropTypes from 'prop-types'; import React, {useCallback, useMemo, useRef} from 'react'; import {View} from 'react-native'; @@ -55,6 +54,22 @@ const propTypes = { /** The policies which the user has access to */ // eslint-disable-next-line react/forbid-prop-types policies: PropTypes.object, + + /** All of the transaction violations */ + transactionViolations: PropTypes.shape({ + violations: PropTypes.arrayOf( + PropTypes.shape({ + /** The transaction ID */ + transactionID: PropTypes.number, + + /** The transaction violation type */ + type: PropTypes.string, + + /** The transaction violation message */ + message: PropTypes.string, + }), + ), + }), }; const defaultProps = { @@ -64,16 +79,17 @@ const defaultProps = { priorityMode: CONST.PRIORITY_MODE.DEFAULT, betas: [], policies: {}, + transactionViolations: {}, }; -function SidebarLinksData({isFocused, allReportActions, betas, chatReports, currentReportID, insets, isLoadingApp, onLinkClick, policies, priorityMode, network}) { +function SidebarLinksData({isFocused, allReportActions, betas, chatReports, currentReportID, insets, isLoadingApp, onLinkClick, policies, priorityMode, network, transactionViolations}) { const styles = useThemeStyles(); const {translate} = useLocalize(); const reportIDsRef = useRef(null); const isLoading = isLoadingApp; const optionListItems = useMemo(() => { - const reportIDs = SidebarUtils.getOrderedReportIDs(null, chatReports, betas, policies, priorityMode, allReportActions); + const reportIDs = SidebarUtils.getOrderedReportIDs(null, chatReports, betas, policies, priorityMode, allReportActions, transactionViolations); if (deepEqual(reportIDsRef.current, reportIDs)) { return reportIDsRef.current; @@ -85,7 +101,7 @@ function SidebarLinksData({isFocused, allReportActions, betas, chatReports, curr reportIDsRef.current = reportIDs; } return reportIDsRef.current || []; - }, [allReportActions, betas, chatReports, policies, priorityMode, isLoading, network.isOffline]); + }, [allReportActions, betas, chatReports, policies, priorityMode, isLoading, network.isOffline, transactionViolations]); // We need to make sure the current report is in the list of reports, but we do not want // to have to re-generate the list every time the currentReportID changes. To do that @@ -94,10 +110,10 @@ function SidebarLinksData({isFocused, allReportActions, betas, chatReports, curr // case we re-generate the list a 2nd time with the current report included. const optionListItemsWithCurrentReport = useMemo(() => { if (currentReportID && !_.contains(optionListItems, currentReportID)) { - return SidebarUtils.getOrderedReportIDs(currentReportID, chatReports, betas, policies, priorityMode, allReportActions); + return SidebarUtils.getOrderedReportIDs(currentReportID, chatReports, betas, policies, priorityMode, allReportActions, transactionViolations); } return optionListItems; - }, [currentReportID, optionListItems, chatReports, betas, policies, priorityMode, allReportActions]); + }, [currentReportID, optionListItems, chatReports, betas, policies, priorityMode, allReportActions, transactionViolations]); const currentReportIDRef = useRef(currentReportID); currentReportIDRef.current = currentReportID; @@ -170,21 +186,6 @@ const chatReportSelector = (report) => parentReportID: report.parentReportID, }; -/** - * @param {Object} [reportActions] - * @returns {Object|undefined} - */ -const reportActionsSelector = (reportActions) => - reportActions && - _.map(reportActions, (reportAction) => ({ - errors: lodashGet(reportAction, 'errors', []), - message: [ - { - moderationDecision: {decision: lodashGet(reportAction, 'message[0].moderationDecision.decision')}, - }, - ], - })); - /** * @param {Object} [policy] * @returns {Object|undefined} @@ -219,7 +220,6 @@ export default compose( }, allReportActions: { key: ONYXKEYS.COLLECTION.REPORT_ACTIONS, - selector: reportActionsSelector, initialValue: {}, }, policies: { @@ -227,5 +227,9 @@ export default compose( selector: policySelector, initialValue: {}, }, + transactionViolations: { + key: ONYXKEYS.TRANSACTION_VIOLATIONS, + initialValue: {}, + }, }), )(SidebarLinksData); diff --git a/tests/perf-test/SidebarUtils.perf-test.ts b/tests/perf-test/SidebarUtils.perf-test.ts index 11e90b83ebc5..b627d54edc5d 100644 --- a/tests/perf-test/SidebarUtils.perf-test.ts +++ b/tests/perf-test/SidebarUtils.perf-test.ts @@ -6,7 +6,7 @@ import ONYXKEYS from '@src/ONYXKEYS'; import {PersonalDetails, TransactionViolations} from '@src/types/onyx'; import Policy from '@src/types/onyx/Policy'; import Report from '@src/types/onyx/Report'; -import ReportAction from '@src/types/onyx/ReportAction'; +import ReportAction, {ReportActions} from '@src/types/onyx/ReportAction'; import createCollection from '../utils/collections/createCollection'; import createPersonalDetails from '../utils/collections/personalDetails'; import createRandomPolicy from '../utils/collections/policies'; @@ -88,7 +88,7 @@ test('[SidebarUtils] getOrderedReportIDs on 5k reports', async () => { }, ], ]), - ) as unknown as OnyxCollection; + ) as unknown as OnyxCollection; Onyx.multiSet({ ...mockedResponseMap, From 73971f074a22e97379e36d6faba327a4089264a4 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Tue, 12 Dec 2023 20:08:31 -0500 Subject: [PATCH 048/583] Correct type import --- src/libs/SidebarUtils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 8db53e46882b..5001725dfbb5 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -8,8 +8,8 @@ import {PersonalDetails, TransactionViolations} from '@src/types/onyx'; import Beta from '@src/types/onyx/Beta'; import * as OnyxCommon from '@src/types/onyx/OnyxCommon'; import Policy from '@src/types/onyx/Policy'; -import Report, {Message} from '@src/types/onyx/Report'; -import ReportAction, {ReportActions} from '@src/types/onyx/ReportAction'; +import Report from '@src/types/onyx/Report'; +import ReportAction, {Message, ReportActions} from '@src/types/onyx/ReportAction'; import * as CollectionUtils from './CollectionUtils'; import * as LocalePhoneNumber from './LocalePhoneNumber'; import * as Localize from './Localize'; From 1234b8890d0220ab59d16ca585e5df1a1091cbba Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Tue, 12 Dec 2023 20:19:38 -0500 Subject: [PATCH 049/583] Another type correction --- src/libs/SidebarUtils.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 5001725dfbb5..acf58424c003 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -135,9 +135,9 @@ const reportActionsSelector = (reportActions?: MappedReportActions): Record Date: Tue, 12 Dec 2023 20:54:54 -0500 Subject: [PATCH 050/583] Final fix for the test of the report actions --- src/libs/SidebarUtils.ts | 51 ++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index acf58424c003..8db1ca430626 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -117,40 +117,45 @@ let hasInitialReportActions = false; // to simplify the logic and prevent the need to pass down the reportActions as an array. type MappedReportAction = { - id: string; + reportActionID: string; errors: OnyxCommon.Errors; message: Message[]; }; type MappedReportActions = Record; -const reportActionsSelector = (reportActions?: MappedReportActions): Record | undefined => { - if (!reportActions) { +const reportActionsSelector = (reportActionsCollection?: Record): Record | undefined => { + if (!reportActionsCollection) { return undefined; } - return Object.values(reportActions).reduce((acc, reportAction) => { - const modifiedAction: MappedReportAction = { - id: reportAction.id, - errors: reportAction.errors || [], - message: [ - { - moderationDecision: reportAction.message?.[0]?.moderationDecision, - type: reportAction.message?.[0]?.type, - text: reportAction.message?.[0]?.text, - }, - ], - }; - - // If the key already exists, append to the array, otherwise create a new array - if (acc[reportAction.id]) { - acc[reportAction.id].push(modifiedAction); - } else { - acc[reportAction.id] = [modifiedAction]; + return Object.values(reportActionsCollection).reduce>((acc, reportActions) => { + if (!reportActions) { + return acc; } + Object.entries(reportActions).forEach(([reportActionID, reportAction]) => { + const modifiedAction: MappedReportAction = { + reportActionID, + errors: reportAction.errors || [], + message: [ + { + moderationDecision: reportAction.message?.[0]?.moderationDecision, + type: reportAction.message?.[0]?.type, + text: reportAction.message?.[0]?.text, + }, + ], + }; + + // If the key already exists, append to the array, otherwise create a new array + if (acc[reportActionID]) { + acc[reportActionID].push(modifiedAction); + } else { + acc[reportActionID] = [modifiedAction]; + } + }); return acc; - }, {} as Record); + }, {}); }; /** @@ -165,7 +170,7 @@ function getOrderedReportIDs( allReportActions: OnyxCollection, transactionViolations: TransactionViolations, ): string[] { - const mappedReportActions = reportActionsSelector(allReportActions as unknown as MappedReportActions); + const mappedReportActions = allReportActions ? reportActionsSelector(allReportActions as unknown as Record) : {}; // Generate a unique cache key based on the function arguments const cachedReportsKey = JSON.stringify( // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing From 4366d642a53131a693f15963aa6804caf0062526 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Tue, 12 Dec 2023 22:15:21 -0500 Subject: [PATCH 051/583] Update Comments --- src/libs/ReportUtils.ts | 26 -------------------------- src/libs/SidebarUtils.ts | 2 +- 2 files changed, 1 insertion(+), 27 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index cca13ecbc1c2..cc933e62b244 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -416,32 +416,6 @@ Onyx.connect({ callback: (value) => (loginList = value), }); -// const transactionViolations: OnyxCollection = {}; -// Onyx.connect({ -// key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, -// callback: (violations, key) => { -// if (!key || !violations) { -// return; -// } - -// const transactionID = CollectionUtils.extractCollectionItemID(key); -// transactionViolations[transactionID] = violations; -// }, -// }); - -// const reportActions: OnyxCollection = {}; -// Onyx.connect({ -// key: ONYXKEYS.COLLECTION.REPORT_ACTIONS, -// callback: (actions, key) => { -// if (!key || !actions) { -// return; -// } - -// const reportID = CollectionUtils.extractCollectionItemID(key); -// reportActions[reportID] = actions; -// }, -// }); - let allPolicyTags: Record = {}; Onyx.connect({ diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 8db1ca430626..d550d899e078 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -113,7 +113,7 @@ let hasInitialReportActions = false; // for the ReportUtils.shouldReportBeInOptionList function. To fix this, we are now passing down the reportActions // as a Record and then converting it to a Record in the // reportActionsSelector function. -// This function was originally in the parent component as an Onyx selector, but it was moved here to prevent +// This function was originally in the parent component as an Onyx selector, but it was moved here // to simplify the logic and prevent the need to pass down the reportActions as an array. type MappedReportAction = { From 57168006f2a429f21c2f016f0ec51054d98a3971 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Tue, 12 Dec 2023 22:29:03 -0500 Subject: [PATCH 052/583] A few fixes --- src/components/LHNOptionsList/LHNOptionsList.js | 9 +++++++++ src/components/ReportActionItem/ReportPreview.js | 9 +++++++++ src/pages/home/sidebar/SidebarLinksData.js | 9 +++++++++ tests/perf-test/ReportUtils.perf-test.ts | 2 +- tests/perf-test/SidebarLinks.perf-test.js | 1 + 5 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/components/LHNOptionsList/LHNOptionsList.js b/src/components/LHNOptionsList/LHNOptionsList.js index d2dc958d811f..6d02c26d1753 100644 --- a/src/components/LHNOptionsList/LHNOptionsList.js +++ b/src/components/LHNOptionsList/LHNOptionsList.js @@ -79,6 +79,15 @@ const propTypes = { /** The transaction violation message */ message: PropTypes.string, + + /** The transaction violation data */ + data: PropTypes.shape({ + /** The transaction violation data field */ + field: PropTypes.string, + + /** The transaction violation data value */ + value: PropTypes.string, + }), }), ), }), diff --git a/src/components/ReportActionItem/ReportPreview.js b/src/components/ReportActionItem/ReportPreview.js index ab6fa5173a16..e88100ff7567 100644 --- a/src/components/ReportActionItem/ReportPreview.js +++ b/src/components/ReportActionItem/ReportPreview.js @@ -112,6 +112,15 @@ const propTypes = { /** The transaction violation message */ message: PropTypes.string, + + /** The transaction violation data */ + data: PropTypes.shape({ + /** The transaction violation data field */ + field: PropTypes.string, + + /** The transaction violation data value */ + value: PropTypes.string, + }), }), ), }), diff --git a/src/pages/home/sidebar/SidebarLinksData.js b/src/pages/home/sidebar/SidebarLinksData.js index 856af9fd5223..a5788a91794a 100644 --- a/src/pages/home/sidebar/SidebarLinksData.js +++ b/src/pages/home/sidebar/SidebarLinksData.js @@ -67,6 +67,15 @@ const propTypes = { /** The transaction violation message */ message: PropTypes.string, + + /** The transaction violation data */ + data: PropTypes.shape({ + /** The transaction violation data field */ + field: PropTypes.string, + + /** The transaction violation data value */ + value: PropTypes.string, + }), }), ), }), diff --git a/tests/perf-test/ReportUtils.perf-test.ts b/tests/perf-test/ReportUtils.perf-test.ts index ab6ee72a0082..03c79095b6a7 100644 --- a/tests/perf-test/ReportUtils.perf-test.ts +++ b/tests/perf-test/ReportUtils.perf-test.ts @@ -183,7 +183,7 @@ test('[ReportUtils] shouldReportBeInOptionList on 1k participant', async () => { const policies = getMockedPolicies(); await waitForBatchedUpdates(); - await measureFunction(() => ReportUtils.shouldReportBeInOptionList(report, currentReportId, isInGSDMode, betas, policies), {runs}); + await measureFunction(() => ReportUtils.shouldReportBeInOptionList(report, currentReportId, isInGSDMode, betas, policies, {}), {runs}); }); test('[ReportUtils] getWorkspaceIcon on 5k policies', async () => { diff --git a/tests/perf-test/SidebarLinks.perf-test.js b/tests/perf-test/SidebarLinks.perf-test.js index c6e6c024c597..0b05a14fa067 100644 --- a/tests/perf-test/SidebarLinks.perf-test.js +++ b/tests/perf-test/SidebarLinks.perf-test.js @@ -10,6 +10,7 @@ import waitForBatchedUpdates from '../utils/waitForBatchedUpdates'; import wrapOnyxWithWaitForBatchedUpdates from '../utils/wrapOnyxWithWaitForBatchedUpdates'; jest.mock('../../src/libs/Permissions'); +jest.mock('../../src/hooks/usePermissions.ts'); jest.mock('../../src/libs/Navigation/Navigation'); jest.mock('../../src/components/Icon/Expensicons'); From ecb7dfe2bf90b07f454f9990cfe8250b36cb41c4 Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Wed, 13 Dec 2023 13:36:07 +0100 Subject: [PATCH 053/583] Add changes to ReportUtils & merge main --- assets/emojis/common.ts | 2 +- src/libs/ReportUtils.ts | 124 +++++++++++++----------------- src/libs/actions/Policy.ts | 66 ++++++++-------- src/types/onyx/OriginalMessage.ts | 11 ++- src/types/onyx/PersonalDetails.ts | 4 +- src/types/onyx/Report.ts | 22 ++++-- src/types/onyx/ReportAction.ts | 52 ++++++++++++- src/types/onyx/index.ts | 3 +- 8 files changed, 166 insertions(+), 118 deletions(-) diff --git a/assets/emojis/common.ts b/assets/emojis/common.ts index cbefb21cf2d6..8d2fded0a4a1 100644 --- a/assets/emojis/common.ts +++ b/assets/emojis/common.ts @@ -91,7 +91,7 @@ const emojis: PickerEmojis = [ code: '😊', }, { - name: 'innocent', + name: ':innocent:', code: '😇', }, { diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 3e55a97cd294..c53b50122faf 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -6,7 +6,6 @@ import lodashEscape from 'lodash/escape'; import lodashFindLastIndex from 'lodash/findLastIndex'; import lodashIntersection from 'lodash/intersection'; import lodashIsEqual from 'lodash/isEqual'; -import React from 'react'; import Onyx, {OnyxCollection, OnyxEntry, OnyxUpdate} from 'react-native-onyx'; import {SvgProps} from 'react-native-svg'; import {ValueOf} from 'type-fest'; @@ -16,10 +15,11 @@ import CONST from '@src/CONST'; import {ParentNavigationSummaryParams, TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; -import {Beta, Login, PersonalDetails, Policy, PolicyTags, Report, ReportAction, Session, Transaction} from '@src/types/onyx'; +import {Beta, Login, PersonalDetails, PersonalDetailsList, Policy, PolicyTags, Report, ReportAction, Session, Transaction} from '@src/types/onyx'; import {Errors, Icon, PendingAction} from '@src/types/onyx/OnyxCommon'; -import {ChangeLog, IOUMessage, OriginalMessageActionName} from '@src/types/onyx/OriginalMessage'; -import {Message, ReportActions} from '@src/types/onyx/ReportAction'; +import {ChangeLog, IOUMessage, OriginalMessageActionName, OriginalMessageCreated} from '@src/types/onyx/OriginalMessage'; +import {NotificationPreference} from '@src/types/onyx/Report'; +import {Message, ReportActionBase, ReportActions} from '@src/types/onyx/ReportAction'; import {Receipt, WaypointCollection} from '@src/types/onyx/Transaction'; import DeepValueOf from '@src/types/utils/DeepValueOf'; import {EmptyObject, isEmptyObject, isNotEmptyObject} from '@src/types/utils/EmptyObject'; @@ -187,10 +187,8 @@ type OptimisticClosedReportAction = Pick< 'actionName' | 'actorAccountID' | 'automatic' | 'avatar' | 'created' | 'message' | 'originalMessage' | 'pendingAction' | 'person' | 'reportActionID' | 'shouldShow' >; -type OptimisticCreatedReportAction = Pick< - ReportAction, - 'actionName' | 'actorAccountID' | 'automatic' | 'avatar' | 'created' | 'message' | 'person' | 'reportActionID' | 'shouldShow' | 'pendingAction' ->; +type OptimisticCreatedReportAction = OriginalMessageCreated & + Pick; type OptimisticChatReport = Pick< Report, @@ -277,20 +275,20 @@ type OptimisticTaskReport = Pick< type TransactionDetails = | { - created: string; - amount: number; - currency: string; - merchant: string; - waypoints?: WaypointCollection; - comment: string; - category: string; - billable: boolean; - tag: string; - mccGroup?: ValueOf; - cardID: number; - originalAmount: number; - originalCurrency: string; - } + created: string; + amount: number; + currency: string; + merchant: string; + waypoints?: WaypointCollection; + comment: string; + category: string; + billable: boolean; + tag: string; + mccGroup?: ValueOf; + cardID: number; + originalAmount: number; + originalCurrency: string; +} | undefined; type OptimisticIOUReport = Pick< @@ -1409,7 +1407,7 @@ function getDisplayNameForParticipant(accountID?: number, shouldUseShortForm = f } function getDisplayNamesWithTooltips( - personalDetailsList: PersonalDetails[] | Record, + personalDetailsList: PersonalDetails[] | PersonalDetailsList, isMultipleParticipantReport: boolean, shouldFallbackToHidden = true, ): DisplayNameWithTooltips { @@ -1423,7 +1421,7 @@ function getDisplayNamesWithTooltips( const avatar = UserUtils.getDefaultAvatar(accountID); let pronouns = user.pronouns; - if (pronouns && pronouns.startsWith(CONST.PRONOUNS.PREFIX)) { + if (pronouns?.startsWith(CONST.PRONOUNS.PREFIX)) { const pronounTranslationKey = pronouns.replace(CONST.PRONOUNS.PREFIX, ''); pronouns = Localize.translateLocal(`pronouns.${pronounTranslationKey}` as TranslationPaths); } @@ -1547,9 +1545,9 @@ function isUnreadWithMention(report: OnyxEntry | OptionData): boolean { /** * Determines if the option requires action from the current user. This can happen when it: - - is unread and the user was mentioned in one of the unread comments - - is for an outstanding task waiting on the user - - has an outstanding child money request that is waiting for an action from the current user (e.g. pay, approve, add bank account) + - is unread and the user was mentioned in one of the unread comments + - is for an outstanding task waiting on the user + - has an outstanding child money request that is waiting for an action from the current user (e.g. pay, approve, add bank account) * * @param option (report or optionItem) * @param parentReportAction (the report action the current report is a thread of) @@ -1828,12 +1826,12 @@ function canEditReportAction(reportAction: OnyxEntry): boolean { return Boolean( reportAction?.actorAccountID === currentUserAccountID && - isCommentOrIOU && - canEditMoneyRequest(reportAction) && // Returns true for non-IOU actions - !isReportMessageAttachment(reportAction?.message?.[0] ?? {type: '', text: ''}) && - !ReportActionsUtils.isDeletedAction(reportAction) && - !ReportActionsUtils.isCreatedTaskReportAction(reportAction) && - reportAction?.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, + isCommentOrIOU && + canEditMoneyRequest(reportAction) && // Returns true for non-IOU actions + !isReportMessageAttachment(reportAction?.message?.[0] ?? {type: '', text: ''}) && + !ReportActionsUtils.isDeletedAction(reportAction) && + !ReportActionsUtils.isCreatedTaskReportAction(reportAction) && + reportAction?.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, ); } @@ -2376,7 +2374,7 @@ function getParsedComment(text: string): string { return text.length <= CONST.MAX_MARKUP_LENGTH ? parser.replace(text) : lodashEscape(text); } -function buildOptimisticAddCommentReportAction(text?: string, file?: File & {source: string; uri: string}): OptimisticReportAction { +function buildOptimisticAddCommentReportAction(text?: string, file?: File): OptimisticReportAction { const parser = new ExpensiMark(); const commentText = getParsedComment(text ?? ''); const isAttachment = !text && file !== undefined; @@ -2994,9 +2992,9 @@ function updateReportPreview( childMoneyRequestCount: (reportPreviewAction?.childMoneyRequestCount ?? 0) + (isPayRequest ? 0 : 1), childRecentReceiptTransactionIDs: hasReceipt ? { - ...(transaction && {[transaction.transactionID]: transaction?.created}), - ...previousTransactions, - } + ...(transaction && {[transaction.transactionID]: transaction?.created}), + ...previousTransactions, + } : recentReceiptTransactions, // As soon as we add a transaction without a receipt to the report, it will have ready money requests, // so we remove the whisper @@ -3052,7 +3050,7 @@ function buildOptimisticChatReport( oldPolicyName = '', visibility: ValueOf | undefined = undefined, writeCapability: ValueOf | undefined = undefined, - notificationPreference: string | number = CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS, + notificationPreference: NotificationPreference = CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS, parentReportActionID = '', parentReportID = '', welcomeMessage = '', @@ -3578,12 +3576,12 @@ function canFlagReportAction(reportAction: OnyxEntry, reportID: st return Boolean( !isCurrentUserAction && - reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.ADDCOMMENT && - !ReportActionsUtils.isDeletedAction(reportAction) && - !ReportActionsUtils.isCreatedTaskReportAction(reportAction) && - isNotEmptyObject(report) && - report && - isAllowedToComment(report), + reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.ADDCOMMENT && + !ReportActionsUtils.isDeletedAction(reportAction) && + !ReportActionsUtils.isCreatedTaskReportAction(reportAction) && + isNotEmptyObject(report) && + report && + isAllowedToComment(report), ); } @@ -4227,12 +4225,12 @@ function getChannelLogMemberMessage(reportAction: OnyxEntry): stri function isGroupChat(report: OnyxEntry): boolean { return Boolean( report && - !isChatThread(report) && - !isTaskReport(report) && - !isMoneyRequestReport(report) && - !isArchivedRoom(report) && - !Object.values(CONST.REPORT.CHAT_TYPE).some((chatType) => chatType === getChatType(report)) && - (report.participantAccountIDs?.length ?? 0) > 2, + !isChatThread(report) && + !isTaskReport(report) && + !isMoneyRequestReport(report) && + !isArchivedRoom(report) && + !Object.values(CONST.REPORT.CHAT_TYPE).some((chatType) => chatType === getChatType(report)) && + (report.participantAccountIDs?.length ?? 0) > 2, ); } @@ -4252,33 +4250,16 @@ function shouldDisableWelcomeMessage(report: OnyxEntry, policy: OnyxEntr return isMoneyRequestReport(report) || isArchivedRoom(report) || !isChatRoom(report) || isChatThread(report) || !PolicyUtils.isPolicyAdmin(policy); } -function shouldAutoFocusOnKeyPress(event: KeyboardEvent): boolean { - if (event.key.length > 1) { - return false; - } - - // If a key is pressed in combination with Meta, Control or Alt do not focus - if (event.ctrlKey || event.metaKey) { - return false; - } - - if (event.code === 'Space') { - return false; - } - - return true; -} - /** * Navigates to the appropriate screen based on the presence of a private note for the current user. */ function navigateToPrivateNotes(report: Report, session: Session) { - if (isEmpty(report) || isEmpty(session)) { + if (isEmpty(report) || isEmpty(session) || !session.accountID) { return; } - const currentUserPrivateNote = report.privateNotes?.[String(session.accountID)]?.note ?? ''; + const currentUserPrivateNote = report.privateNotes?.[session.accountID]?.note ?? ''; if (isEmpty(currentUserPrivateNote)) { - Navigation.navigate(ROUTES.PRIVATE_NOTES_EDIT.getRoute(report.reportID, String(session.accountID))); + Navigation.navigate(ROUTES.PRIVATE_NOTES_EDIT.getRoute(report.reportID, session.accountID)); return; } Navigation.navigate(ROUTES.PRIVATE_NOTES_LIST.getRoute(report.reportID)); @@ -4451,7 +4432,6 @@ export { shouldDisableWelcomeMessage, navigateToPrivateNotes, canEditWriteCapability, - shouldAutoFocusOnKeyPress, }; -export type {OptionData, OptimisticClosedReportAction}; +export type {OptionData, OptimisticChatReport, OptimisticClosedReportAction}; diff --git a/src/libs/actions/Policy.ts b/src/libs/actions/Policy.ts index 14ca1b169e78..5cf0c57b3882 100644 --- a/src/libs/actions/Policy.ts +++ b/src/libs/actions/Policy.ts @@ -14,7 +14,6 @@ import * as OptionsListUtils from '@libs/OptionsListUtils'; import * as PersonalDetailsUtils from '@libs/PersonalDetailsUtils'; import * as ReportActionsUtils from '@libs/ReportActionsUtils'; import * as ReportUtils from '@libs/ReportUtils'; -import {OptimisticClosedReportAction} from '@libs/ReportUtils'; import * as TransactionUtils from '@libs/TransactionUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -181,7 +180,7 @@ function deleteWorkspace(policyID: string, reports: Report[], policyName: string return; } - const filteredPolicies = Object.values(allPolicies).filter((policy) => policy?.id !== policyID); + const filteredPolicies = Object.values(allPolicies).filter((policy): policy is Policy => policy?.id !== policyID); const optimisticData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, @@ -191,22 +190,22 @@ function deleteWorkspace(policyID: string, reports: Report[], policyName: string errors: null, }, }, - ...reports.map(({reportID}) => ({ + ...reports.map(({reportID}) => ({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`, - value: { + value: ({ stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, statusNum: CONST.REPORT.STATUS.CLOSED, hasDraft: false, - oldPolicyName: allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]?.name, - }, + oldPolicyName: allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]?.name ?? '', + }), })), - ...reports.map(({reportID}) => ({ + ...(reports.map(({reportID}) => ({ onyxMethod: Onyx.METHOD.SET, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS_DRAFTS}${reportID}`, value: null, - })), + }))), // Add closed actions to all chat reports linked to this policy ...reports.map(({reportID, ownerAccountID}) => { @@ -215,8 +214,8 @@ function deleteWorkspace(policyID: string, reports: Report[], policyName: string if (!!ownerAccountID && ownerAccountID !== CONST.POLICY.OWNER_ACCOUNT_ID_FAKE) { emailClosingReport = allPersonalDetails?.[ownerAccountID]?.login ?? ''; } - const optimisticClosedReportAction = ReportUtils.buildOptimisticClosedReportAction(emailClosingReport, policyName, CONST.REPORT.ARCHIVE_REASON.POLICY_DELETED); - const optimisticReportActions: Record = {}; + const optimisticClosedReportAction: ReportAction = ReportUtils.buildOptimisticClosedReportAction(emailClosingReport, policyName, CONST.REPORT.ARCHIVE_REASON.POLICY_DELETED); + const optimisticReportActions: Record = {}; optimisticReportActions[optimisticClosedReportAction.reportActionID] = optimisticClosedReportAction; return { onyxMethod: Onyx.METHOD.MERGE, @@ -226,7 +225,7 @@ function deleteWorkspace(policyID: string, reports: Report[], policyName: string }), ...(!hasActiveFreePolicy(filteredPolicies) - ? [ + ? ([ { onyxMethod: Onyx.METHOD.MERGE, key: ONYXKEYS.REIMBURSEMENT_ACCOUNT, @@ -234,8 +233,8 @@ function deleteWorkspace(policyID: string, reports: Report[], policyName: string errors: null, }, }, - ] - : []), + ]) + : ([])), ]; // Restore the old report stateNum and statusNum @@ -433,7 +432,7 @@ function removeMembers(accountIDs: number[], policyID: string) { }, ]; - const filteredWorkspaceChats = workspaceChats.filter((e) => e !== null) as Report[]; + const filteredWorkspaceChats = workspaceChats.filter((e): e is Report => e !== null); const failureData = [ { onyxMethod: Onyx.METHOD.MERGE, @@ -538,7 +537,7 @@ function createPolicyExpenseChats(policyID: string, invitedEmailsToAccountIDs: R workspaceMembersChats.onyxOptimisticData.push({ onyxMethod: Onyx.METHOD.SET, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${optimisticReport.reportID}`, - value: {[optimisticCreatedAction.reportActionID]: optimisticCreatedAction as ReportAction}, + value: {[optimisticCreatedAction.reportActionID]: optimisticCreatedAction}, }); workspaceMembersChats.onyxSuccessData.push({ @@ -795,7 +794,7 @@ function updateGeneralSettings(policyID: string, name: string, currency: string) onyxMethod: Onyx.METHOD.SET, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, value: { - ...((allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`] ?? {}) as Policy), + ...((allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`] ?? {} as Policy)), pendingFields: { generalSettings: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, @@ -821,7 +820,7 @@ function updateGeneralSettings(policyID: string, name: string, currency: string) }, }, } - : {}) as Record), + : {})), }, }, ]; @@ -971,7 +970,7 @@ function updateWorkspaceCustomUnitAndRate(policyID: string, currentCustomUnit: C [currentCustomUnit.customUnitID]: { customUnitID: currentCustomUnit.customUnitID, rates: { - [currentCustomUnit.rates.customUnitRateID]: { + [newCustomUnit.rates.customUnitRateID]: { ...currentCustomUnit.rates, errors: ErrorUtils.getMicroSecondOnyxError('workspace.reimburse.updateCustomUnitError'), }, @@ -1592,7 +1591,7 @@ function createWorkspaceFromIOUPayment(iouReport: Report): string | undefined { { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${announceChatReportID}`, - value: announceReportActionData as Record, + value: announceReportActionData, }, { onyxMethod: Onyx.METHOD.MERGE, @@ -1607,7 +1606,7 @@ function createWorkspaceFromIOUPayment(iouReport: Report): string | undefined { { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${adminsChatReportID}`, - value: adminsReportActionData as Record, + value: adminsReportActionData, }, { onyxMethod: Onyx.METHOD.MERGE, @@ -1622,7 +1621,7 @@ function createWorkspaceFromIOUPayment(iouReport: Report): string | undefined { { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${workspaceChatReportID}`, - value: workspaceChatReportActionData as Record, + value: workspaceChatReportActionData, }, { onyxMethod: Onyx.METHOD.MERGE, @@ -1833,18 +1832,21 @@ function createWorkspaceFromIOUPayment(iouReport: Report): string | undefined { }, }); - // Update the created timestamp of the report preview action to be after the workspace chat created timestamp. - optimisticData.push({ - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${memberData.workspaceChatReportID}`, - value: { - [reportPreview.reportActionID]: { - ...reportPreview, - message: ReportUtils.getReportPreviewMessage(expenseReport, {}, false, false, newWorkspace), - created: DateUtils.getDBTime(), + if (reportPreview?.reportActionID) { + // Update the created timestamp of the report preview action to be after the workspace chat created timestamp. + optimisticData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${memberData.workspaceChatReportID}`, + value: { + [reportPreview.reportActionID]: ({ + ...reportPreview, + message: ReportUtils.getReportPreviewMessage(expenseReport, {}, false, false, newWorkspace), + created: DateUtils.getDBTime(), + }), }, - }, - }); + }); + } + failureData.push({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${memberData.workspaceChatReportID}`, diff --git a/src/types/onyx/OriginalMessage.ts b/src/types/onyx/OriginalMessage.ts index f76fbd5ffd7d..fc7f8eb8ba31 100644 --- a/src/types/onyx/OriginalMessage.ts +++ b/src/types/onyx/OriginalMessage.ts @@ -45,6 +45,7 @@ type IOUMessage = { /** Only exists when we are sending money */ IOUDetails?: IOUDetails; }; + type OriginalMessageIOU = { actionName: typeof CONST.REPORT.ACTIONS.TYPE.IOU; originalMessage: IOUMessage; @@ -69,7 +70,7 @@ type DecisionName = ValueOf< >; type Decision = { decision: DecisionName; - timestamp: string; + timestamp?: string; }; type User = { @@ -105,6 +106,7 @@ type OriginalMessageAddComment = { reactions?: Reaction[]; }; }; + type OriginalMessageSubmitted = { actionName: typeof CONST.REPORT.ACTIONS.TYPE.SUBMITTED; originalMessage: unknown; @@ -117,7 +119,7 @@ type OriginalMessageClosed = { type OriginalMessageCreated = { actionName: typeof CONST.REPORT.ACTIONS.TYPE.CREATED; - originalMessage: unknown; + originalMessage?: unknown; }; type OriginalMessageRenamed = { @@ -183,7 +185,8 @@ type OriginalMessagePolicyTask = { | typeof CONST.REPORT.ACTIONS.TYPE.TASKEDITED | typeof CONST.REPORT.ACTIONS.TYPE.TASKCANCELLED | typeof CONST.REPORT.ACTIONS.TYPE.TASKCOMPLETED - | typeof CONST.REPORT.ACTIONS.TYPE.TASKREOPENED; + | typeof CONST.REPORT.ACTIONS.TYPE.TASKREOPENED + | typeof CONST.REPORT.ACTIONS.TYPE.MODIFIEDEXPENSE; originalMessage: unknown; }; @@ -231,4 +234,4 @@ type OriginalMessage = | OriginalMessageMoved; export default OriginalMessage; -export type {ChronosOOOEvent, Decision, Reaction, ActionName, IOUMessage, Closed, OriginalMessageActionName, ChangeLog}; +export type {ChronosOOOEvent, Decision, Reaction, ActionName, IOUMessage, Closed, OriginalMessageActionName, ChangeLog, OriginalMessageIOU, OriginalMessageCreated}; diff --git a/src/types/onyx/PersonalDetails.ts b/src/types/onyx/PersonalDetails.ts index af559eafd0a1..8f824272230e 100644 --- a/src/types/onyx/PersonalDetails.ts +++ b/src/types/onyx/PersonalDetails.ts @@ -76,6 +76,8 @@ type PersonalDetails = { payPalMeAddress?: string; }; +type PersonalDetailsList = Record; + export default PersonalDetails; -export type {Timezone, SelectedTimezone}; +export type {Timezone, SelectedTimezone, PersonalDetailsList}; diff --git a/src/types/onyx/Report.ts b/src/types/onyx/Report.ts index 41a2a4d4effd..95086aeda0a1 100644 --- a/src/types/onyx/Report.ts +++ b/src/types/onyx/Report.ts @@ -3,6 +3,16 @@ import CONST from '@src/CONST'; import * as OnyxCommon from './OnyxCommon'; import PersonalDetails from './PersonalDetails'; +type NotificationPreference = ValueOf; + +type WriteCapability = ValueOf; + +type Note = { + note: string; + errors?: OnyxCommon.Errors; + pendingAction?: OnyxCommon.PendingAction; +}; + type Report = { /** The specific type of chat */ chatType?: ValueOf; @@ -47,7 +57,7 @@ type Report = { lastMentionedTime?: string | null; /** The current user's notification preference for this report */ - notificationPreference?: string | number; + notificationPreference?: NotificationPreference; /** The policy name to use */ policyName?: string | null; @@ -89,7 +99,7 @@ type Report = { statusNum?: ValueOf; /** Which user role is capable of posting messages on the report */ - writeCapability?: ValueOf; + writeCapability?: WriteCapability; /** The report type */ type?: string; @@ -136,8 +146,7 @@ type Report = { /** Pending fields for the report */ pendingFields?: Record; - - pendingAction?: string; + pendingAction?: OnyxCommon.PendingAction; /** The ID of the preexisting report (it is possible that we optimistically created a Report for which a report already exists) */ preexistingReportID?: string; @@ -148,7 +157,10 @@ type Report = { isChatRoom?: boolean; participantsList?: Array>; text?: string; - privateNotes?: Record; + privateNotes?: Record; + isLoadingPrivateNotes?: boolean; }; export default Report; + +export type {NotificationPreference, WriteCapability}; diff --git a/src/types/onyx/ReportAction.ts b/src/types/onyx/ReportAction.ts index 64e1eb0b7c88..b193d5e720ec 100644 --- a/src/types/onyx/ReportAction.ts +++ b/src/types/onyx/ReportAction.ts @@ -1,8 +1,10 @@ import {ValueOf} from 'type-fest'; import {AvatarSource} from '@libs/UserUtils'; import CONST from '@src/CONST'; +import {EmptyObject} from '@src/types/utils/EmptyObject'; import * as OnyxCommon from './OnyxCommon'; import OriginalMessage, {Decision, Reaction} from './OriginalMessage'; +import {NotificationPreference} from './Report'; import {Receipt} from './Transaction'; type Message = { @@ -52,6 +54,37 @@ type Message = { taskReportID?: string; }; +type ImageMetadata = { + /** The height of the image. */ + height?: number; + + /** The width of the image. */ + width?: number; + + /** The URL of the image. */ + url?: string; +}; + +type LinkMetadata = { + /** The URL of the link. */ + url?: string; + + /** A description of the link. */ + description?: string; + + /** The title of the link. */ + title?: string; + + /** The publisher of the link. */ + publisher?: string; + + /** The image associated with the link. */ + image?: ImageMetadata; + + /** The provider logo associated with the link. */ + logo?: ImageMetadata; +}; + type Person = { type?: string; style?: string; @@ -79,6 +112,9 @@ type ReportActionBase = { /** report action message */ message?: Message[]; + /** report action message */ + previousMessage?: Message[]; + /** Whether we have received a response back from the server */ isLoading?: boolean; @@ -121,7 +157,7 @@ type ReportActionBase = { isFirstItem?: boolean; /** Informations about attachments of report action */ - attachmentInfo?: (File & {source: string; uri: string}) | Record; + attachmentInfo?: File | EmptyObject; /** Receipt tied to report action */ receipt?: Receipt; @@ -129,15 +165,27 @@ type ReportActionBase = { /** ISO-formatted datetime */ lastModified?: string; + /** Is this action pending? */ pendingAction?: OnyxCommon.PendingAction; delegateAccountID?: string; /** Server side errors keyed by microtime */ errors?: OnyxCommon.Errors; + /** Whether the report action is attachment */ isAttachment?: boolean; + + /** Recent receipt transaction IDs keyed by reportID */ childRecentReceiptTransactionIDs?: Record; + + /** ReportID of the report action */ reportID?: string; + + /** Metadata of the link */ + linkMetadata?: LinkMetadata[]; + + /** The current user's notification preference for this report's child */ + childReportNotificationPreference?: NotificationPreference; }; type ReportAction = ReportActionBase & OriginalMessage; @@ -145,4 +193,4 @@ type ReportAction = ReportActionBase & OriginalMessage; type ReportActions = Record; export default ReportAction; -export type {Message, ReportActions}; +export type {ReportActions, ReportActionBase, Message}; diff --git a/src/types/onyx/index.ts b/src/types/onyx/index.ts index 8329b56dc4b8..42bd4500d8ad 100644 --- a/src/types/onyx/index.ts +++ b/src/types/onyx/index.ts @@ -19,7 +19,7 @@ import Modal from './Modal'; import Network from './Network'; import {OnyxUpdateEvent, OnyxUpdatesFromServer} from './OnyxUpdatesFromServer'; import PersonalBankAccount from './PersonalBankAccount'; -import PersonalDetails from './PersonalDetails'; +import PersonalDetails, {PersonalDetailsList} from './PersonalDetails'; import PlaidData from './PlaidData'; import Policy from './Policy'; import PolicyCategory, {PolicyCategories} from './PolicyCategory'; @@ -80,6 +80,7 @@ export type { OnyxUpdatesFromServer, PersonalBankAccount, PersonalDetails, + PersonalDetailsList, PlaidData, Policy, PolicyCategory, From adf19333272d0158099c63d05ae584eccc70ec97 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 13 Dec 2023 09:15:04 -0500 Subject: [PATCH 054/583] Fixed some prop types and also added a beta guard --- .../ReportActionItem/ReportPreview.js | 6 +++- src/libs/ReportUtils.ts | 32 ++++++++++--------- src/libs/SidebarUtils.ts | 2 +- src/pages/home/sidebar/SidebarLinksData.js | 18 +++-------- 4 files changed, 27 insertions(+), 31 deletions(-) diff --git a/src/components/ReportActionItem/ReportPreview.js b/src/components/ReportActionItem/ReportPreview.js index e88100ff7567..005f244cb6b1 100644 --- a/src/components/ReportActionItem/ReportPreview.js +++ b/src/components/ReportActionItem/ReportPreview.js @@ -19,6 +19,7 @@ import ControlSelection from '@libs/ControlSelection'; import * as CurrencyUtils from '@libs/CurrencyUtils'; import * as DeviceCapabilities from '@libs/DeviceCapabilities'; import Navigation from '@libs/Navigation/Navigation'; +import {usePermissions} from '@libs/Permissions'; import * as ReceiptUtils from '@libs/ReceiptUtils'; import * as ReportActionUtils from '@libs/ReportActionsUtils'; import * as ReportUtils from '@libs/ReportUtils'; @@ -149,6 +150,8 @@ function ReportPreview(props) { const styles = useThemeStyles(); const {translate} = useLocalize(); + const {canUseViolations} = usePermissions(); + const managerID = props.iouReport.managerID || 0; const isCurrentUserManager = managerID === lodashGet(props.session, 'accountID'); const {totalDisplaySpend, reimbursableSpend} = ReportUtils.getMoneyRequestSpendBreakdown(props.iouReport); @@ -167,7 +170,8 @@ function ReportPreview(props) { const hasReceipts = transactionsWithReceipts.length > 0; const hasOnlyDistanceRequests = ReportUtils.hasOnlyDistanceRequestTransactions(props.iouReportID); const isScanning = hasReceipts && ReportUtils.areAllRequestsBeingSmartScanned(props.iouReportID, props.action); - const hasErrors = (hasReceipts && ReportUtils.hasMissingSmartscanFields(props.iouReportID)) || ReportUtils.reportHasViolations(props.iouReportID, props.transactionViolations); + const hasErrors = + (hasReceipts && ReportUtils.hasMissingSmartscanFields(props.iouReportID)) || (canUseViolations && ReportUtils.reportHasViolations(props.iouReportID, props.transactionViolations)); const lastThreeTransactionsWithReceipts = transactionsWithReceipts.slice(-3); const lastThreeReceipts = _.map(lastThreeTransactionsWithReceipts, (transaction) => ReceiptUtils.getThumbnailAndImageURIs(transaction)); const hasNonReimbursableTransactions = ReportUtils.hasNonReimbursableTransactions(props.iouReportID); diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index cc933e62b244..08e2cd44dc67 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3468,8 +3468,8 @@ function canAccessReport(report: OnyxEntry, policies: OnyxCollection, currentReportId: string): boolean { const currentReport = getReport(currentReportId); const parentReport = getParentReport(isNotEmptyObject(currentReport) ? currentReport : null); - const allReportActions = ReportActionsUtils.getAllReportActions(report?.reportID ?? ''); - const isChildReportHasComment = Object.values(allReportActions ?? {})?.some((reportAction) => (reportAction?.childVisibleActionCount ?? 0) > 0); + const reportActions = ReportActionsUtils.getAllReportActions(report?.reportID ?? ''); + const isChildReportHasComment = Object.values(reportActions ?? {})?.some((reportAction) => (reportAction?.childVisibleActionCount ?? 0) > 0); return parentReport?.reportID !== report?.reportID && !isChildReportHasComment; } @@ -3490,14 +3490,24 @@ function transactionHasViolation(transactionID: string, transactionViolations?: * This only applies to report submitter and for reports in the open and processing states */ -function transactionThreadHasViolations(report: Report, canUseViolations: boolean, transactionViolations?: TransactionViolations, parentReportAction?: ReportAction | null): boolean { - if (!parentReportAction) { +function transactionThreadHasViolations( + report: Report, + canUseViolations: boolean, + transactionViolations?: TransactionViolations, + reportActions?: OnyxCollection | null, + parentReportAction?: ReportAction | null, +): boolean { + if (!canUseViolations || !reportActions) { + return false; + } + const resolvedParentReportAction = parentReportAction ?? reportActions?.[`${report.parentReportID}`]?.[`${report.parentReportActionID}`]; + if (!resolvedParentReportAction) { return false; } - if (parentReportAction.actionName !== CONST.REPORT.ACTIONS.TYPE.IOU) { + if (resolvedParentReportAction.actionName !== CONST.REPORT.ACTIONS.TYPE.IOU) { return false; } - const {IOUTransactionID, IOUReportID} = parentReportAction?.originalMessage; + const {IOUTransactionID, IOUReportID} = resolvedParentReportAction?.originalMessage; if (!IOUTransactionID || !IOUReportID) { return false; } @@ -3594,15 +3604,7 @@ function shouldReportBeInOptionList( } // Always show IOU reports with violations - if ( - isExpenseRequest(report) && - transactionThreadHasViolations( - report, - betas.includes(CONST.BETAS.VIOLATIONS), - transactionViolations, - allReportActions?.[`${report.parentReportID}`]?.[`${report.parentReportActionID}`], - ) - ) { + if (isExpenseRequest(report) && transactionThreadHasViolations(report, betas.includes(CONST.BETAS.VIOLATIONS), transactionViolations, allReportActions)) { return true; } diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index d550d899e078..3968f2f95547 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -343,7 +343,7 @@ function getOptionData( result.pendingAction = report.pendingFields ? report.pendingFields.addWorkspaceRoom || report.pendingFields.createChat : undefined; result.allReportErrors = OptionsListUtils.getAllReportErrors(report, reportActions) as OnyxCommon.Errors; result.brickRoadIndicator = - Object.keys(result.allReportErrors ?? {}).length !== 0 || ReportUtils.transactionThreadHasViolations(report, canUseViolations, transactionViolations, parentReportAction) + Object.keys(result.allReportErrors ?? {}).length !== 0 || ReportUtils.transactionThreadHasViolations(report, canUseViolations, transactionViolations, null, parentReportAction) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : ''; result.ownerAccountID = report.ownerAccountID; diff --git a/src/pages/home/sidebar/SidebarLinksData.js b/src/pages/home/sidebar/SidebarLinksData.js index a5788a91794a..cdf3140f174f 100644 --- a/src/pages/home/sidebar/SidebarLinksData.js +++ b/src/pages/home/sidebar/SidebarLinksData.js @@ -11,6 +11,7 @@ import withNavigationFocus from '@components/withNavigationFocus'; import useLocalize from '@hooks/useLocalize'; import compose from '@libs/compose'; import SidebarUtils from '@libs/SidebarUtils'; +import reportActionPropTypes from '@pages/home/report/reportActionPropTypes'; import reportPropTypes from '@pages/reportPropTypes'; import useThemeStyles from '@styles/useThemeStyles'; import CONST from '@src/CONST'; @@ -25,20 +26,9 @@ const propTypes = { chatReports: PropTypes.objectOf(reportPropTypes), /** All report actions for all reports */ - allReportActions: PropTypes.objectOf( - PropTypes.arrayOf( - PropTypes.shape({ - error: PropTypes.string, - message: PropTypes.arrayOf( - PropTypes.shape({ - moderationDecision: PropTypes.shape({ - decision: PropTypes.string, - }), - }), - ), - }), - ), - ), + + /** Object of report actions for this report */ + allReportActions: PropTypes.objectOf(PropTypes.shape(reportActionPropTypes)), /** Whether the reports are loading. When false it means they are ready to be used. */ isLoadingApp: PropTypes.bool, From da8f3769f3775ffa443f0880823de155f91d1dd9 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 13 Dec 2023 09:55:59 -0500 Subject: [PATCH 055/583] Added usePermissions mock to ReportPreview --- tests/perf-test/ReportScreen.perf-test.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/perf-test/ReportScreen.perf-test.js b/tests/perf-test/ReportScreen.perf-test.js index 96514112cd05..8a5b35cb2f3a 100644 --- a/tests/perf-test/ReportScreen.perf-test.js +++ b/tests/perf-test/ReportScreen.perf-test.js @@ -56,6 +56,7 @@ jest.mock('../../src/hooks/useEnvironment', () => jest.mock('../../src/libs/Permissions', () => ({ canUseLinkPreviews: jest.fn(() => true), })); +jest.mock('../../src/hooks/usePermissions.ts'); jest.mock('../../src/libs/Navigation/Navigation'); From cda1aeeac983b13514baf4221c6157a0f8361ed5 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 13 Dec 2023 12:22:50 -0500 Subject: [PATCH 056/583] Trying this out --- src/libs/SidebarUtils.ts | 63 +++++++++------------------------------- 1 file changed, 13 insertions(+), 50 deletions(-) diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 3968f2f95547..5e41b48eab5b 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -108,55 +108,12 @@ function setWithLimit(map: Map, key: TKey, value: TV // Variable to verify if ONYX actions are loaded let hasInitialReportActions = false; -// Originally we were passing down the reportActions as the type OnyxCollection but -// it was used as a Record in the cachedReportsKey. This was causing a type error -// for the ReportUtils.shouldReportBeInOptionList function. To fix this, we are now passing down the reportActions -// as a Record and then converting it to a Record in the -// reportActionsSelector function. -// This function was originally in the parent component as an Onyx selector, but it was moved here -// to simplify the logic and prevent the need to pass down the reportActions as an array. - -type MappedReportAction = { - reportActionID: string; - errors: OnyxCommon.Errors; - message: Message[]; -}; - -type MappedReportActions = Record; - -const reportActionsSelector = (reportActionsCollection?: Record): Record | undefined => { - if (!reportActionsCollection) { - return undefined; +type ReportActionsCount = Record< + string, + { + reportActionsCount: number; } - - return Object.values(reportActionsCollection).reduce>((acc, reportActions) => { - if (!reportActions) { - return acc; - } - Object.entries(reportActions).forEach(([reportActionID, reportAction]) => { - const modifiedAction: MappedReportAction = { - reportActionID, - errors: reportAction.errors || [], - message: [ - { - moderationDecision: reportAction.message?.[0]?.moderationDecision, - type: reportAction.message?.[0]?.type, - text: reportAction.message?.[0]?.text, - }, - ], - }; - - // If the key already exists, append to the array, otherwise create a new array - if (acc[reportActionID]) { - acc[reportActionID].push(modifiedAction); - } else { - acc[reportActionID] = [modifiedAction]; - } - }); - - return acc; - }, {}); -}; +>; /** * @returns An array of reportIDs sorted in the proper order @@ -170,11 +127,17 @@ function getOrderedReportIDs( allReportActions: OnyxCollection, transactionViolations: TransactionViolations, ): string[] { - const mappedReportActions = allReportActions ? reportActionsSelector(allReportActions as unknown as Record) : {}; + const reportActionsCount: ReportActionsCount | null = + allReportActions && + Object.keys(allReportActions).reduce((acc, reportID) => { + acc[reportID] = {reportActionsCount: Object.keys(allReportActions[reportID] as Record).length}; + return acc; + }, {}); + // Generate a unique cache key based on the function arguments const cachedReportsKey = JSON.stringify( // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - [currentReportId, allReports, betas, policies, priorityMode, mappedReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${currentReportId}`]?.length || 1], + [currentReportId, allReports, betas, policies, priorityMode, reportActionsCount?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${currentReportId}`]?.reportActionsCount || 1], (key, value: unknown) => { /** * Exclude 'participantAccountIDs', 'participants' and 'lastMessageText' not to overwhelm a cached key value with huge data, From cd6586a74297aab87b969e4a834566d3bd03e088 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 13 Dec 2023 12:22:50 -0500 Subject: [PATCH 057/583] Trying this out --- src/libs/SidebarUtils.ts | 63 +++++------------------ tests/perf-test/ReportScreen.perf-test.js | 1 + 2 files changed, 14 insertions(+), 50 deletions(-) diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 3968f2f95547..5e41b48eab5b 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -108,55 +108,12 @@ function setWithLimit(map: Map, key: TKey, value: TV // Variable to verify if ONYX actions are loaded let hasInitialReportActions = false; -// Originally we were passing down the reportActions as the type OnyxCollection but -// it was used as a Record in the cachedReportsKey. This was causing a type error -// for the ReportUtils.shouldReportBeInOptionList function. To fix this, we are now passing down the reportActions -// as a Record and then converting it to a Record in the -// reportActionsSelector function. -// This function was originally in the parent component as an Onyx selector, but it was moved here -// to simplify the logic and prevent the need to pass down the reportActions as an array. - -type MappedReportAction = { - reportActionID: string; - errors: OnyxCommon.Errors; - message: Message[]; -}; - -type MappedReportActions = Record; - -const reportActionsSelector = (reportActionsCollection?: Record): Record | undefined => { - if (!reportActionsCollection) { - return undefined; +type ReportActionsCount = Record< + string, + { + reportActionsCount: number; } - - return Object.values(reportActionsCollection).reduce>((acc, reportActions) => { - if (!reportActions) { - return acc; - } - Object.entries(reportActions).forEach(([reportActionID, reportAction]) => { - const modifiedAction: MappedReportAction = { - reportActionID, - errors: reportAction.errors || [], - message: [ - { - moderationDecision: reportAction.message?.[0]?.moderationDecision, - type: reportAction.message?.[0]?.type, - text: reportAction.message?.[0]?.text, - }, - ], - }; - - // If the key already exists, append to the array, otherwise create a new array - if (acc[reportActionID]) { - acc[reportActionID].push(modifiedAction); - } else { - acc[reportActionID] = [modifiedAction]; - } - }); - - return acc; - }, {}); -}; +>; /** * @returns An array of reportIDs sorted in the proper order @@ -170,11 +127,17 @@ function getOrderedReportIDs( allReportActions: OnyxCollection, transactionViolations: TransactionViolations, ): string[] { - const mappedReportActions = allReportActions ? reportActionsSelector(allReportActions as unknown as Record) : {}; + const reportActionsCount: ReportActionsCount | null = + allReportActions && + Object.keys(allReportActions).reduce((acc, reportID) => { + acc[reportID] = {reportActionsCount: Object.keys(allReportActions[reportID] as Record).length}; + return acc; + }, {}); + // Generate a unique cache key based on the function arguments const cachedReportsKey = JSON.stringify( // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - [currentReportId, allReports, betas, policies, priorityMode, mappedReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${currentReportId}`]?.length || 1], + [currentReportId, allReports, betas, policies, priorityMode, reportActionsCount?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${currentReportId}`]?.reportActionsCount || 1], (key, value: unknown) => { /** * Exclude 'participantAccountIDs', 'participants' and 'lastMessageText' not to overwhelm a cached key value with huge data, diff --git a/tests/perf-test/ReportScreen.perf-test.js b/tests/perf-test/ReportScreen.perf-test.js index 8a5b35cb2f3a..830c23a613d7 100644 --- a/tests/perf-test/ReportScreen.perf-test.js +++ b/tests/perf-test/ReportScreen.perf-test.js @@ -55,6 +55,7 @@ jest.mock('../../src/hooks/useEnvironment', () => jest.mock('../../src/libs/Permissions', () => ({ canUseLinkPreviews: jest.fn(() => true), + canUseViolations: jest.fn(() => false), })); jest.mock('../../src/hooks/usePermissions.ts'); From ae0648c0b4a0565aecb7e8958859d4e1231f87e5 Mon Sep 17 00:00:00 2001 From: Pedro Guerreiro Date: Wed, 13 Dec 2023 18:37:06 +0000 Subject: [PATCH 058/583] refactor(typescript): migrate conciergepage --- .../{ConciergePage.js => ConciergePage.tsx} | 27 ++++++------------- 1 file changed, 8 insertions(+), 19 deletions(-) rename src/pages/{ConciergePage.js => ConciergePage.tsx} (67%) diff --git a/src/pages/ConciergePage.js b/src/pages/ConciergePage.tsx similarity index 67% rename from src/pages/ConciergePage.js rename to src/pages/ConciergePage.tsx index 841ce524b2cb..ffb82f689620 100644 --- a/src/pages/ConciergePage.js +++ b/src/pages/ConciergePage.tsx @@ -1,36 +1,28 @@ import {useFocusEffect} from '@react-navigation/native'; -import PropTypes from 'prop-types'; import React from 'react'; -import {withOnyx} from 'react-native-onyx'; -import _ from 'underscore'; +import {OnyxEntry, withOnyx} from 'react-native-onyx'; import FullScreenLoadingIndicator from '@components/FullscreenLoadingIndicator'; import Navigation from '@libs/Navigation/Navigation'; import * as Report from '@userActions/Report'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; +import {Session} from '@src/types/onyx'; -const propTypes = { +type ConciergePageOnyxProps = { /** Session info for the currently logged in user. */ - session: PropTypes.shape({ - /** Currently logged in user authToken */ - authToken: PropTypes.string, - }), + session: OnyxEntry; }; -const defaultProps = { - session: { - authToken: null, - }, -}; +type ConciergePageProps = ConciergePageOnyxProps; /* * This is a "utility page", that does this: * - If the user is authenticated, find their concierge chat and re-route to it * - Else re-route to the login page */ -function ConciergePage(props) { +function ConciergePage({session}: ConciergePageProps) { useFocusEffect(() => { - if (_.has(props.session, 'authToken')) { + if (session?.authToken) { // Pop the concierge loading page before opening the concierge report. Navigation.isNavigationReady().then(() => { Navigation.goBack(ROUTES.HOME); @@ -43,12 +35,9 @@ function ConciergePage(props) { return ; } - -ConciergePage.propTypes = propTypes; -ConciergePage.defaultProps = defaultProps; ConciergePage.displayName = 'ConciergePage'; -export default withOnyx({ +export default withOnyx({ session: { key: ONYXKEYS.SESSION, }, From 6478b9402536dfd73688d681ca02228300df4e74 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 13 Dec 2023 13:59:01 -0500 Subject: [PATCH 059/583] fix for perf test --- src/components/ReportActionItem/ReportPreview.js | 2 +- tests/perf-test/ReportScreen.perf-test.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/ReportActionItem/ReportPreview.js b/src/components/ReportActionItem/ReportPreview.js index 005f244cb6b1..be1973751a91 100644 --- a/src/components/ReportActionItem/ReportPreview.js +++ b/src/components/ReportActionItem/ReportPreview.js @@ -14,12 +14,12 @@ import {showContextMenuForReport} from '@components/ShowContextMenuContext'; import Text from '@components/Text'; import withLocalize, {withLocalizePropTypes} from '@components/withLocalize'; import useLocalize from '@hooks/useLocalize'; +import {usePermissions} from '@hooks/usePermissions'; import compose from '@libs/compose'; import ControlSelection from '@libs/ControlSelection'; import * as CurrencyUtils from '@libs/CurrencyUtils'; import * as DeviceCapabilities from '@libs/DeviceCapabilities'; import Navigation from '@libs/Navigation/Navigation'; -import {usePermissions} from '@libs/Permissions'; import * as ReceiptUtils from '@libs/ReceiptUtils'; import * as ReportActionUtils from '@libs/ReportActionsUtils'; import * as ReportUtils from '@libs/ReportUtils'; diff --git a/tests/perf-test/ReportScreen.perf-test.js b/tests/perf-test/ReportScreen.perf-test.js index 830c23a613d7..8a5b35cb2f3a 100644 --- a/tests/perf-test/ReportScreen.perf-test.js +++ b/tests/perf-test/ReportScreen.perf-test.js @@ -55,7 +55,6 @@ jest.mock('../../src/hooks/useEnvironment', () => jest.mock('../../src/libs/Permissions', () => ({ canUseLinkPreviews: jest.fn(() => true), - canUseViolations: jest.fn(() => false), })); jest.mock('../../src/hooks/usePermissions.ts'); From 1736c2107ca865dc107effcd9ea1118bd4648075 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 13 Dec 2023 14:03:17 -0500 Subject: [PATCH 060/583] Remove unused type --- src/libs/SidebarUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 5e41b48eab5b..2faf6c4b4170 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -9,7 +9,7 @@ import Beta from '@src/types/onyx/Beta'; import * as OnyxCommon from '@src/types/onyx/OnyxCommon'; import Policy from '@src/types/onyx/Policy'; import Report from '@src/types/onyx/Report'; -import ReportAction, {Message, ReportActions} from '@src/types/onyx/ReportAction'; +import ReportAction, {ReportActions} from '@src/types/onyx/ReportAction'; import * as CollectionUtils from './CollectionUtils'; import * as LocalePhoneNumber from './LocalePhoneNumber'; import * as Localize from './Localize'; From 16a0a9adf7e614b731a92c6fc775067c49aa1e70 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 13 Dec 2023 14:52:33 -0500 Subject: [PATCH 061/583] Fixing some issues with tests --- src/libs/SidebarUtils.ts | 6 ++++-- tests/perf-test/ReportScreen.perf-test.js | 6 +++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 2faf6c4b4170..049652fbb254 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -129,8 +129,10 @@ function getOrderedReportIDs( ): string[] { const reportActionsCount: ReportActionsCount | null = allReportActions && - Object.keys(allReportActions).reduce((acc, reportID) => { - acc[reportID] = {reportActionsCount: Object.keys(allReportActions[reportID] as Record).length}; + Object.entries(allReportActions).reduce((acc, [reportID, reportActions]) => { + if (reportActions) { + acc[reportID] = {reportActionsCount: Object.keys(reportActions as Record).length}; + } return acc; }, {}); diff --git a/tests/perf-test/ReportScreen.perf-test.js b/tests/perf-test/ReportScreen.perf-test.js index 8a5b35cb2f3a..f5badad99ad3 100644 --- a/tests/perf-test/ReportScreen.perf-test.js +++ b/tests/perf-test/ReportScreen.perf-test.js @@ -56,7 +56,11 @@ jest.mock('../../src/hooks/useEnvironment', () => jest.mock('../../src/libs/Permissions', () => ({ canUseLinkPreviews: jest.fn(() => true), })); -jest.mock('../../src/hooks/usePermissions.ts'); +jest.mock('../../src/hooks/usePermissions.ts', () => + jest.fn(() => ({ + canUseViolations: true, + })), +); jest.mock('../../src/libs/Navigation/Navigation'); From feb359689af7fbd0791e792bcd2d7f113ffbf005 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 13 Dec 2023 15:22:42 -0500 Subject: [PATCH 062/583] Was accidentally importing named instead of default --- src/components/ReportActionItem/ReportPreview.js | 2 +- tests/perf-test/ReportScreen.perf-test.js | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/components/ReportActionItem/ReportPreview.js b/src/components/ReportActionItem/ReportPreview.js index be1973751a91..2a5f3e07de16 100644 --- a/src/components/ReportActionItem/ReportPreview.js +++ b/src/components/ReportActionItem/ReportPreview.js @@ -14,7 +14,7 @@ import {showContextMenuForReport} from '@components/ShowContextMenuContext'; import Text from '@components/Text'; import withLocalize, {withLocalizePropTypes} from '@components/withLocalize'; import useLocalize from '@hooks/useLocalize'; -import {usePermissions} from '@hooks/usePermissions'; +import usePermissions from '@hooks/usePermissions'; import compose from '@libs/compose'; import ControlSelection from '@libs/ControlSelection'; import * as CurrencyUtils from '@libs/CurrencyUtils'; diff --git a/tests/perf-test/ReportScreen.perf-test.js b/tests/perf-test/ReportScreen.perf-test.js index f5badad99ad3..8a5b35cb2f3a 100644 --- a/tests/perf-test/ReportScreen.perf-test.js +++ b/tests/perf-test/ReportScreen.perf-test.js @@ -56,11 +56,7 @@ jest.mock('../../src/hooks/useEnvironment', () => jest.mock('../../src/libs/Permissions', () => ({ canUseLinkPreviews: jest.fn(() => true), })); -jest.mock('../../src/hooks/usePermissions.ts', () => - jest.fn(() => ({ - canUseViolations: true, - })), -); +jest.mock('../../src/hooks/usePermissions.ts'); jest.mock('../../src/libs/Navigation/Navigation'); From 69b767b8c998af1e1a099dfa487be1b29e4e5bba Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 13 Dec 2023 21:08:45 -0500 Subject: [PATCH 063/583] Update src/libs/ReportUtils.ts Co-authored-by: Carlos Alvarez --- src/libs/ReportUtils.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 08e2cd44dc67..3df5e24a4a1d 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3473,10 +3473,6 @@ function shouldHideReport(report: OnyxEntry, currentReportId: string): b return parentReport?.reportID !== report?.reportID && !isChildReportHasComment; } -/** - * Checks if there are any violations belonging to the transaction in the transactionsViolations Onyx object - * then checks that the violation is of the proper type - */ function transactionHasViolation(transactionID: string, transactionViolations?: TransactionViolations): boolean { const violations: TransactionViolation[] = transactionViolations ? transactionViolations[transactionID] || [] : []; if (!violations) { From 9535a2bbf7585a1ed334700a057d85d1d04545fb Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 13 Dec 2023 21:09:00 -0500 Subject: [PATCH 064/583] Update src/components/ReportActionItem/ReportPreview.js Co-authored-by: Carlos Alvarez --- src/components/ReportActionItem/ReportPreview.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/ReportActionItem/ReportPreview.js b/src/components/ReportActionItem/ReportPreview.js index 053fce6cfcd1..df012ca2f6cd 100644 --- a/src/components/ReportActionItem/ReportPreview.js +++ b/src/components/ReportActionItem/ReportPreview.js @@ -149,9 +149,7 @@ function ReportPreview(props) { const theme = useTheme(); const styles = useThemeStyles(); const {translate} = useLocalize(); - const {canUseViolations} = usePermissions(); - const managerID = props.iouReport.managerID || 0; const isCurrentUserManager = managerID === lodashGet(props.session, 'accountID'); const {totalDisplaySpend, reimbursableSpend} = ReportUtils.getMoneyRequestSpendBreakdown(props.iouReport); From 99d3c0d8e7d941e44ddf1715e99b4b9a406c6c09 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 13 Dec 2023 21:09:10 -0500 Subject: [PATCH 065/583] Update src/hooks/__mocks__/usePermissions.ts Co-authored-by: Carlos Alvarez --- src/hooks/__mocks__/usePermissions.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/hooks/__mocks__/usePermissions.ts b/src/hooks/__mocks__/usePermissions.ts index 4af004095712..89a871e3c991 100644 --- a/src/hooks/__mocks__/usePermissions.ts +++ b/src/hooks/__mocks__/usePermissions.ts @@ -1,10 +1,8 @@ import UsePermissions from '@hooks/usePermissions'; /** - * * @returns {UsePermissions} A mock of the usePermissions hook. */ - const usePermissions = (): typeof UsePermissions => () => ({ canUseViolations: true, }); From 07209109f074649a167b12a9c82b1399cc31f2f2 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 13 Dec 2023 21:38:57 -0500 Subject: [PATCH 066/583] Remove unused import --- src/libs/ReportUtils.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 3df5e24a4a1d..3ac9db07057b 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -37,7 +37,6 @@ import {Message, ReportActionBase, ReportActions} from '@src/types/onyx/ReportAc import {Receipt, WaypointCollection} from '@src/types/onyx/Transaction'; import DeepValueOf from '@src/types/utils/DeepValueOf'; import {EmptyObject, isEmptyObject, isNotEmptyObject} from '@src/types/utils/EmptyObject'; -// import * as CollectionUtils from './CollectionUtils'; import * as CurrencyUtils from './CurrencyUtils'; import DateUtils from './DateUtils'; import isReportMessageAttachment from './isReportMessageAttachment'; From 7faf50bcbef2a3ae13f4c8a11f2088d272104e0e Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 13 Dec 2023 21:48:14 -0500 Subject: [PATCH 067/583] Fix transactionHasViolation function and ReportActionsCount type --- src/libs/ReportUtils.ts | 6 +++--- src/libs/SidebarUtils.ts | 11 +++-------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 3ac9db07057b..1a90a0d8aae0 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3472,8 +3472,8 @@ function shouldHideReport(report: OnyxEntry, currentReportId: string): b return parentReport?.reportID !== report?.reportID && !isChildReportHasComment; } -function transactionHasViolation(transactionID: string, transactionViolations?: TransactionViolations): boolean { - const violations: TransactionViolation[] = transactionViolations ? transactionViolations[transactionID] || [] : []; +function transactionHasViolation(transactionID: string, transactionViolations: TransactionViolations): boolean { + const violations: TransactionViolation[] = transactionViolations[transactionID]; if (!violations) { return false; } @@ -3488,7 +3488,7 @@ function transactionHasViolation(transactionID: string, transactionViolations?: function transactionThreadHasViolations( report: Report, canUseViolations: boolean, - transactionViolations?: TransactionViolations, + transactionViolations: TransactionViolations, reportActions?: OnyxCollection | null, parentReportAction?: ReportAction | null, ): boolean { diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 049652fbb254..78b9a3eae23a 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -108,12 +108,7 @@ function setWithLimit(map: Map, key: TKey, value: TV // Variable to verify if ONYX actions are loaded let hasInitialReportActions = false; -type ReportActionsCount = Record< - string, - { - reportActionsCount: number; - } ->; +type ReportActionsCount = Record; /** * @returns An array of reportIDs sorted in the proper order @@ -131,7 +126,7 @@ function getOrderedReportIDs( allReportActions && Object.entries(allReportActions).reduce((acc, [reportID, reportActions]) => { if (reportActions) { - acc[reportID] = {reportActionsCount: Object.keys(reportActions as Record).length}; + acc[reportID] = Object.keys(reportActions as Record).length; } return acc; }, {}); @@ -139,7 +134,7 @@ function getOrderedReportIDs( // Generate a unique cache key based on the function arguments const cachedReportsKey = JSON.stringify( // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - [currentReportId, allReports, betas, policies, priorityMode, reportActionsCount?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${currentReportId}`]?.reportActionsCount || 1], + [currentReportId, allReports, betas, policies, priorityMode, reportActionsCount?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${currentReportId}`] || 1], (key, value: unknown) => { /** * Exclude 'participantAccountIDs', 'participants' and 'lastMessageText' not to overwhelm a cached key value with huge data, From bf401afca2acaade3fff7c9b34ac7622dcc732b2 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 13 Dec 2023 21:49:35 -0500 Subject: [PATCH 068/583] Remove unnecessary code in shouldHideReport function --- src/libs/ReportUtils.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 1a90a0d8aae0..daacc3fc1f41 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3474,9 +3474,6 @@ function shouldHideReport(report: OnyxEntry, currentReportId: string): b function transactionHasViolation(transactionID: string, transactionViolations: TransactionViolations): boolean { const violations: TransactionViolation[] = transactionViolations[transactionID]; - if (!violations) { - return false; - } return violations.some((violation: TransactionViolation) => violation.type === 'violation'); } From f0a360b40f066e0a996b4027ba84cbf9a44e08ee Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 13 Dec 2023 21:50:22 -0500 Subject: [PATCH 069/583] Remove unnecessary comment in ReportUtils.ts --- src/libs/ReportUtils.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index daacc3fc1f41..16ff2da4fc24 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3479,7 +3479,6 @@ function transactionHasViolation(transactionID: string, transactionViolations: T /** * Checks to see if a report's parentAction is a money request that contains a violation - * This only applies to report submitter and for reports in the open and processing states */ function transactionThreadHasViolations( From 4088e8f5651d54e260659ea396caa8c7d9b1c85a Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 13 Dec 2023 22:02:43 -0500 Subject: [PATCH 070/583] Fix betas check to be outside of the function --- src/libs/ReportUtils.ts | 5 ++--- src/libs/SidebarUtils.ts | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 16ff2da4fc24..ea33ee3123b2 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3483,12 +3483,11 @@ function transactionHasViolation(transactionID: string, transactionViolations: T function transactionThreadHasViolations( report: Report, - canUseViolations: boolean, transactionViolations: TransactionViolations, reportActions?: OnyxCollection | null, parentReportAction?: ReportAction | null, ): boolean { - if (!canUseViolations || !reportActions) { + if (!reportActions) { return false; } const resolvedParentReportAction = parentReportAction ?? reportActions?.[`${report.parentReportID}`]?.[`${report.parentReportActionID}`]; @@ -3595,7 +3594,7 @@ function shouldReportBeInOptionList( } // Always show IOU reports with violations - if (isExpenseRequest(report) && transactionThreadHasViolations(report, betas.includes(CONST.BETAS.VIOLATIONS), transactionViolations, allReportActions)) { + if (isExpenseRequest(report) && betas.includes(CONST.BETAS.VIOLATIONS) && transactionThreadHasViolations(report, transactionViolations, allReportActions)) { return true; } diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 78b9a3eae23a..ab7a822a01ea 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -303,7 +303,7 @@ function getOptionData( result.pendingAction = report.pendingFields ? report.pendingFields.addWorkspaceRoom || report.pendingFields.createChat : undefined; result.allReportErrors = OptionsListUtils.getAllReportErrors(report, reportActions) as OnyxCommon.Errors; result.brickRoadIndicator = - Object.keys(result.allReportErrors ?? {}).length !== 0 || ReportUtils.transactionThreadHasViolations(report, canUseViolations, transactionViolations, null, parentReportAction) + Object.keys(result.allReportErrors ?? {}).length !== 0 || (canUseViolations && ReportUtils.transactionThreadHasViolations(report, transactionViolations, null, parentReportAction)) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : ''; result.ownerAccountID = report.ownerAccountID; From 766d37e1068b98c46290925ae5febf126338d177 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 13 Dec 2023 22:10:53 -0500 Subject: [PATCH 071/583] Add comment about using usePermissions hook mock for beta tests --- tests/unit/SidebarFilterTest.js | 2 +- tests/unit/SidebarOrderTest.js | 2 +- tests/unit/SidebarTest.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/unit/SidebarFilterTest.js b/tests/unit/SidebarFilterTest.js index 326ae6f76be2..8c16ada8154e 100644 --- a/tests/unit/SidebarFilterTest.js +++ b/tests/unit/SidebarFilterTest.js @@ -8,7 +8,7 @@ import * as LHNTestUtils from '../utils/LHNTestUtils'; import waitForBatchedUpdates from '../utils/waitForBatchedUpdates'; import wrapOnyxWithWaitForBatchedUpdates from '../utils/wrapOnyxWithWaitForBatchedUpdates'; -// Be sure to include the mocked permissions library or else the beta tests won't work +// Be sure to include the mocked permissions library as well as the usePermissions hook or else the beta tests won't work jest.mock('../../src/libs/Permissions'); jest.mock('../../src/hooks/usePermissions.ts'); diff --git a/tests/unit/SidebarOrderTest.js b/tests/unit/SidebarOrderTest.js index 55dcb7dd6258..b27fe9721e04 100644 --- a/tests/unit/SidebarOrderTest.js +++ b/tests/unit/SidebarOrderTest.js @@ -9,7 +9,7 @@ import * as LHNTestUtils from '../utils/LHNTestUtils'; import waitForBatchedUpdates from '../utils/waitForBatchedUpdates'; import wrapOnyxWithWaitForBatchedUpdates from '../utils/wrapOnyxWithWaitForBatchedUpdates'; -// Be sure to include the mocked Permissions and Expensicons libraries or else the beta tests won't work +// Be sure to include the mocked Permissions and Expensicons libraries as well as the usePermissions hook or else the beta tests won't work jest.mock('../../src/libs/Permissions'); jest.mock('../../src/hooks/usePermissions.ts'); jest.mock('../../src/components/Icon/Expensicons'); diff --git a/tests/unit/SidebarTest.js b/tests/unit/SidebarTest.js index 94ac50a6207e..78de26a4edef 100644 --- a/tests/unit/SidebarTest.js +++ b/tests/unit/SidebarTest.js @@ -7,7 +7,7 @@ import * as LHNTestUtils from '../utils/LHNTestUtils'; import waitForBatchedUpdates from '../utils/waitForBatchedUpdates'; import wrapOnyxWithWaitForBatchedUpdates from '../utils/wrapOnyxWithWaitForBatchedUpdates'; -// Be sure to include the mocked Permissions and Expensicons libraries or else the beta tests won't work +// Be sure to include the mocked Permissions and Expensicons libraries as well as the usePermissions hook or else the beta tests won't work jest.mock('../../src/libs/Permissions'); jest.mock('../../src/hooks/usePermissions.ts'); jest.mock('../../src/components/Icon/Expensicons'); From 561a4d4a2db715765a9f3815a15c5c63676f1513 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 13 Dec 2023 22:21:42 -0500 Subject: [PATCH 072/583] Add default value for transactionViolations --- src/libs/ReportUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index ea33ee3123b2..46ae84718b14 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3594,7 +3594,7 @@ function shouldReportBeInOptionList( } // Always show IOU reports with violations - if (isExpenseRequest(report) && betas.includes(CONST.BETAS.VIOLATIONS) && transactionThreadHasViolations(report, transactionViolations, allReportActions)) { + if (isExpenseRequest(report) && betas.includes(CONST.BETAS.VIOLATIONS) && transactionThreadHasViolations(report, transactionViolations || {}, allReportActions)) { return true; } From abad008fe26bfb90e5ebf0fd193241e1a72c6771 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 13 Dec 2023 22:25:41 -0500 Subject: [PATCH 073/583] Make linter happy --- src/hooks/__mocks__/usePermissions.ts | 6 ++---- src/libs/ReportUtils.ts | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/hooks/__mocks__/usePermissions.ts b/src/hooks/__mocks__/usePermissions.ts index 89a871e3c991..a12b1f52d8ab 100644 --- a/src/hooks/__mocks__/usePermissions.ts +++ b/src/hooks/__mocks__/usePermissions.ts @@ -1,9 +1,7 @@ -import UsePermissions from '@hooks/usePermissions'; - /** - * @returns {UsePermissions} A mock of the usePermissions hook. + * @returns A mock of the usePermissions hook. */ -const usePermissions = (): typeof UsePermissions => () => ({ +const usePermissions = () => ({ canUseViolations: true, }); export default usePermissions; diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 46ae84718b14..5e6e208d7632 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3594,7 +3594,7 @@ function shouldReportBeInOptionList( } // Always show IOU reports with violations - if (isExpenseRequest(report) && betas.includes(CONST.BETAS.VIOLATIONS) && transactionThreadHasViolations(report, transactionViolations || {}, allReportActions)) { + if (isExpenseRequest(report) && betas.includes(CONST.BETAS.VIOLATIONS) && transactionThreadHasViolations(report, transactionViolations ?? {}, allReportActions)) { return true; } From 563ca7b62e094c805460198becbb16d8c7f5b9a9 Mon Sep 17 00:00:00 2001 From: Daniel Edwards Date: Wed, 13 Dec 2023 22:40:30 -0500 Subject: [PATCH 074/583] Refactor getOrderedReportIDs function to improve readability --- src/libs/SidebarUtils.ts | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index ab7a822a01ea..3f6b58020b27 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -108,8 +108,6 @@ function setWithLimit(map: Map, key: TKey, value: TV // Variable to verify if ONYX actions are loaded let hasInitialReportActions = false; -type ReportActionsCount = Record; - /** * @returns An array of reportIDs sorted in the proper order */ @@ -122,19 +120,19 @@ function getOrderedReportIDs( allReportActions: OnyxCollection, transactionViolations: TransactionViolations, ): string[] { - const reportActionsCount: ReportActionsCount | null = - allReportActions && - Object.entries(allReportActions).reduce((acc, [reportID, reportActions]) => { - if (reportActions) { - acc[reportID] = Object.keys(reportActions as Record).length; - } - return acc; - }, {}); + const countActions = (actions: ReportActions | null): number => (actions ? Object.keys(actions).length : 0); + + const getReportActionCount = (reportIDKey: string): number | null => { + if (!allReportActions?.[reportIDKey]) { + return null; + } + return countActions(allReportActions[reportIDKey]); + }; // Generate a unique cache key based on the function arguments const cachedReportsKey = JSON.stringify( // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - [currentReportId, allReports, betas, policies, priorityMode, reportActionsCount?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${currentReportId}`] || 1], + [currentReportId, allReports, betas, policies, priorityMode, getReportActionCount(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${currentReportId}`) || 1], (key, value: unknown) => { /** * Exclude 'participantAccountIDs', 'participants' and 'lastMessageText' not to overwhelm a cached key value with huge data, From d24c8f1b6c82de2cf89cc3657cc3aef9a290f7c7 Mon Sep 17 00:00:00 2001 From: Pedro Guerreiro Date: Thu, 14 Dec 2023 13:16:33 +0000 Subject: [PATCH 075/583] refactor(typescript): migrate loginwithshortlivedauthtoken --- src/libs/Navigation/types.ts | 5 +- ...s => LogInWithShortLivedAuthTokenPage.tsx} | 61 ++++++------------- 2 files changed, 23 insertions(+), 43 deletions(-) rename src/pages/{LogInWithShortLivedAuthTokenPage.js => LogInWithShortLivedAuthTokenPage.tsx} (64%) diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 94a07ddc6b73..1a7f017cf4d8 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -3,6 +3,7 @@ import {CommonActions, NavigationContainerRefWithCurrent, NavigationHelpers, Nav import {ValueOf} from 'type-fest'; import CONST from '@src/CONST'; import NAVIGATORS from '@src/NAVIGATORS'; +import type {Route as Routes} from '@src/ROUTES'; import SCREENS from '@src/SCREENS'; type NavigationRef = NavigationContainerRefWithCurrent; @@ -366,8 +367,10 @@ type PublicScreensParamList = { [SCREENS.TRANSITION_BETWEEN_APPS]: { shouldForceLogin: string; email: string; + error: string; shortLivedAuthToken: string; - exitTo: string; + shortLivedToken: string; + exitTo: Routes; }; [SCREENS.VALIDATE_LOGIN]: { accountID: string; diff --git a/src/pages/LogInWithShortLivedAuthTokenPage.js b/src/pages/LogInWithShortLivedAuthTokenPage.tsx similarity index 64% rename from src/pages/LogInWithShortLivedAuthTokenPage.js rename to src/pages/LogInWithShortLivedAuthTokenPage.tsx index 16d0c3909d62..c262b4d14658 100644 --- a/src/pages/LogInWithShortLivedAuthTokenPage.js +++ b/src/pages/LogInWithShortLivedAuthTokenPage.tsx @@ -1,8 +1,7 @@ -import lodashGet from 'lodash/get'; -import PropTypes from 'prop-types'; +import {StackScreenProps} from '@react-navigation/stack'; import React, {useEffect} from 'react'; import {View} from 'react-native'; -import {withOnyx} from 'react-native-onyx'; +import {OnyxEntry, withOnyx} from 'react-native-onyx'; import FullScreenLoadingIndicator from '@components/FullscreenLoadingIndicator'; import Icon from '@components/Icon'; import * as Expensicons from '@components/Icon/Expensicons'; @@ -11,64 +10,44 @@ import Text from '@components/Text'; import TextLink from '@components/TextLink'; import useLocalize from '@hooks/useLocalize'; import Navigation from '@libs/Navigation/Navigation'; +import {PublicScreensParamList} from '@libs/Navigation/types'; import useTheme from '@styles/themes/useTheme'; import useThemeStyles from '@styles/useThemeStyles'; import * as Session from '@userActions/Session'; import ONYXKEYS from '@src/ONYXKEYS'; +import SCREENS from '@src/SCREENS'; +import {Account} from '@src/types/onyx'; -const propTypes = { - /** The parameters needed to authenticate with a short-lived token are in the URL */ - route: PropTypes.shape({ - /** Each parameter passed via the URL */ - params: PropTypes.shape({ - /** Short-lived authToken to sign in a user */ - shortLivedAuthToken: PropTypes.string, - - /** Short-lived authToken to sign in as a user, if they are coming from the old mobile app */ - shortLivedToken: PropTypes.string, - - /** The email of the transitioning user */ - email: PropTypes.string, - }), - }).isRequired, - +type LogInWithShortLivedAuthTokenPageOnyxProps = { /** The details about the account that the user is signing in with */ - account: PropTypes.shape({ - /** Whether a sign is loading */ - isLoading: PropTypes.bool, - }), + account: OnyxEntry; }; -const defaultProps = { - account: { - isLoading: false, - }, -}; +type LogInWithShortLivedAuthTokenPageProps = LogInWithShortLivedAuthTokenPageOnyxProps & StackScreenProps; -function LogInWithShortLivedAuthTokenPage(props) { +function LogInWithShortLivedAuthTokenPage({route, account}: LogInWithShortLivedAuthTokenPageProps) { const theme = useTheme(); const styles = useThemeStyles(); const {translate} = useLocalize(); + const { + params: {email, shortLivedAuthToken, shortLivedToken, exitTo, error}, + } = route; useEffect(() => { - const email = lodashGet(props, 'route.params.email', ''); - // We have to check for both shortLivedAuthToken and shortLivedToken, as the old mobile app uses shortLivedToken, and is not being actively updated. - const shortLivedAuthToken = lodashGet(props, 'route.params.shortLivedAuthToken', '') || lodashGet(props, 'route.params.shortLivedToken', ''); + const token = shortLivedAuthToken || shortLivedToken; // Try to authenticate using the shortLivedToken if we're not already trying to load the accounts - if (shortLivedAuthToken && !props.account.isLoading) { - Session.signInWithShortLivedAuthToken(email, shortLivedAuthToken); + if (token && !account?.isLoading) { + Session.signInWithShortLivedAuthToken(email, token); return; } // If an error is returned as part of the route, ensure we set it in the onyxData for the account - const error = lodashGet(props, 'route.params.error', ''); if (error) { Session.setAccountError(error); } - const exitTo = lodashGet(props, 'route.params.exitTo', ''); if (exitTo) { Navigation.isNavigationReady().then(() => { Navigation.navigate(exitTo); @@ -76,9 +55,9 @@ function LogInWithShortLivedAuthTokenPage(props) { } // The only dependencies of the effect are based on props.route // eslint-disable-next-line react-hooks/exhaustive-deps - }, [props.route]); + }, [route]); - if (props.account.isLoading) { + if (account?.isLoading) { return ; } @@ -94,7 +73,7 @@ function LogInWithShortLivedAuthTokenPage(props) { {translate('deeplinkWrapper.launching')} - + {translate('deeplinkWrapper.expired')}{' '} { @@ -119,10 +98,8 @@ function LogInWithShortLivedAuthTokenPage(props) { ); } -LogInWithShortLivedAuthTokenPage.propTypes = propTypes; -LogInWithShortLivedAuthTokenPage.defaultProps = defaultProps; LogInWithShortLivedAuthTokenPage.displayName = 'LogInWithShortLivedAuthTokenPage'; -export default withOnyx({ +export default withOnyx({ account: {key: ONYXKEYS.ACCOUNT}, })(LogInWithShortLivedAuthTokenPage); From 7052b2212499ff4c689207fd482c0c09fac044f3 Mon Sep 17 00:00:00 2001 From: Pedro Guerreiro Date: Thu, 14 Dec 2023 15:00:00 +0000 Subject: [PATCH 076/583] refactor(typescript): apply pull request feedback --- src/libs/Navigation/types.ts | 11 +++++------ src/pages/LogInWithShortLivedAuthTokenPage.tsx | 10 +++++----- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 1a7f017cf4d8..84e838cad4ed 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -365,12 +365,11 @@ type RightModalNavigatorParamList = { type PublicScreensParamList = { [SCREENS.HOME]: undefined; [SCREENS.TRANSITION_BETWEEN_APPS]: { - shouldForceLogin: string; - email: string; - error: string; - shortLivedAuthToken: string; - shortLivedToken: string; - exitTo: Routes; + email?: string; + error?: string; + shortLivedAuthToken?: string; + shortLivedToken?: string; + exitTo?: Routes; }; [SCREENS.VALIDATE_LOGIN]: { accountID: string; diff --git a/src/pages/LogInWithShortLivedAuthTokenPage.tsx b/src/pages/LogInWithShortLivedAuthTokenPage.tsx index c262b4d14658..bee93f9db915 100644 --- a/src/pages/LogInWithShortLivedAuthTokenPage.tsx +++ b/src/pages/LogInWithShortLivedAuthTokenPage.tsx @@ -10,13 +10,13 @@ import Text from '@components/Text'; import TextLink from '@components/TextLink'; import useLocalize from '@hooks/useLocalize'; import Navigation from '@libs/Navigation/Navigation'; -import {PublicScreensParamList} from '@libs/Navigation/types'; +import type {PublicScreensParamList} from '@libs/Navigation/types'; import useTheme from '@styles/themes/useTheme'; import useThemeStyles from '@styles/useThemeStyles'; import * as Session from '@userActions/Session'; import ONYXKEYS from '@src/ONYXKEYS'; import SCREENS from '@src/SCREENS'; -import {Account} from '@src/types/onyx'; +import type {Account} from '@src/types/onyx'; type LogInWithShortLivedAuthTokenPageOnyxProps = { /** The details about the account that the user is signing in with */ @@ -35,10 +35,10 @@ function LogInWithShortLivedAuthTokenPage({route, account}: LogInWithShortLivedA useEffect(() => { // We have to check for both shortLivedAuthToken and shortLivedToken, as the old mobile app uses shortLivedToken, and is not being actively updated. - const token = shortLivedAuthToken || shortLivedToken; + const token = shortLivedAuthToken ?? shortLivedToken; // Try to authenticate using the shortLivedToken if we're not already trying to load the accounts - if (token && !account?.isLoading) { + if (email && token && !account?.isLoading) { Session.signInWithShortLivedAuthToken(email, token); return; } @@ -73,7 +73,7 @@ function LogInWithShortLivedAuthTokenPage({route, account}: LogInWithShortLivedA {translate('deeplinkWrapper.launching')} - + {translate('deeplinkWrapper.expired')}{' '} { From 356a876806cebd308ede65c69cc00ffcdf6f763e Mon Sep 17 00:00:00 2001 From: Pedro Guerreiro Date: Thu, 14 Dec 2023 15:11:02 +0000 Subject: [PATCH 077/583] refactor(typescript): add missing screen params types --- src/pages/ConciergePage.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/pages/ConciergePage.tsx b/src/pages/ConciergePage.tsx index ffb82f689620..d440e6a83705 100644 --- a/src/pages/ConciergePage.tsx +++ b/src/pages/ConciergePage.tsx @@ -1,11 +1,14 @@ import {useFocusEffect} from '@react-navigation/native'; +import type {StackScreenProps} from '@react-navigation/stack'; import React from 'react'; import {OnyxEntry, withOnyx} from 'react-native-onyx'; import FullScreenLoadingIndicator from '@components/FullscreenLoadingIndicator'; import Navigation from '@libs/Navigation/Navigation'; +import type {AuthScreensParamList} from '@libs/Navigation/types'; import * as Report from '@userActions/Report'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; +import SCREENS from '@src/SCREENS'; import {Session} from '@src/types/onyx'; type ConciergePageOnyxProps = { @@ -13,7 +16,7 @@ type ConciergePageOnyxProps = { session: OnyxEntry; }; -type ConciergePageProps = ConciergePageOnyxProps; +type ConciergePageProps = ConciergePageOnyxProps & StackScreenProps; /* * This is a "utility page", that does this: From 2e5c39bdba1e5fa7212ab63c0b49c4bdaea3bdf8 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Thu, 14 Dec 2023 13:30:06 -0500 Subject: [PATCH 078/583] feat(Violations): implement types from money-request-preview branch --- src/CONST.ts | 38 ++++++++++++- src/libs/{ => Violations}/ViolationsUtils.ts | 0 src/libs/Violations/propTypes.ts | 32 +++++++++++ src/types/onyx/PolicyCategory.ts | 4 +- src/types/onyx/PolicyTag.ts | 3 +- src/types/onyx/TransactionViolation.ts | 60 ++++++++------------ src/types/onyx/index.ts | 4 +- tests/unit/ViolationUtilsTest.js | 2 +- 8 files changed, 99 insertions(+), 44 deletions(-) rename src/libs/{ => Violations}/ViolationsUtils.ts (100%) create mode 100644 src/libs/Violations/propTypes.ts diff --git a/src/CONST.ts b/src/CONST.ts index c0e3d64b5eee..4830b1f1dead 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -3018,12 +3018,48 @@ const CONST = { }, /** - * Constants for maxToRenderPerBatch parameter that is used for FlatList or SectionList. This controls the amount of items rendered per batch, which is the next chunk of items rendered on every scroll. + * Constants for maxToRenderPerBatch parameter that is used for FlatList or SectionList. This controls the amount + * of items rendered per batch, which is the next chunk of items rendered on every scroll. */ MAX_TO_RENDER_PER_BATCH: { DEFAULT: 5, CAROUSEL: 3, }, + VIOLATIONS: { + ALL_TAG_LEVELS_REQUIRED: 'allTagLevelsRequired', + AUTO_REPORTED_REJECTED_EXPENSE: 'autoReportedRejectedExpense', + BILLABLE_EXPENSE: 'billableExpense', + CASH_EXPENSE_WITH_NO_RECEIPT: 'cashExpenseWithNoReceipt', + CATEGORY_OUT_OF_POLICY: 'categoryOutOfPolicy', + CONVERSION_SURCHARGE: 'conversionSurcharge', + CUSTOM_UNIT_OUT_OF_POLICY: 'customUnitOutOfPolicy', + DUPLICATED_TRANSACTION: 'duplicatedTransaction', + FIELD_REQUIRED: 'fieldRequired', + FUTURE_DATE: 'futureDate', + INVOICE_MARKUP: 'invoiceMarkup', + MAX_AGE: 'maxAge', + MISSING_CATEGORY: 'missingCategory', + MISSING_COMMENT: 'missingComment', + MISSING_TAG: 'missingTag', + MODIFIED_AMOUNT: 'modifiedAmount', + MODIFIED_DATE: 'modifiedDate', + NON_EXPENSIWORKS_EXPENSE: 'nonExpensiworksExpense', + OVER_AUTO_APPROVAL_LIMIT: 'overAutoApprovalLimit', + OVER_CATEGORY_LIMIT: 'overCategoryLimit', + OVER_LIMIT: 'overLimit', + OVER_LIMIT_ATTENDEE: 'overLimitAttendee', + PER_DAY_LIMIT: 'perDayLimit', + RECEIPT_NOT_SMART_SCANNED: 'receiptNotSmartScanned', + RECEIPT_REQUIRED: 'receiptRequired', + RTER: 'rter', + SMARTSCAN_FAILED: 'smartscanFailed', + SOME_TAG_LEVELS_REQUIRED: 'someTagLevelsRequired', + TAG_OUT_OF_POLICY: 'tagOutOfPolicy', + TAX_AMOUNT_CHANGED: 'taxAmountChanged', + TAX_OUT_OF_POLICY: 'taxOutOfPolicy', + TAX_RATE_CHANGED: 'taxRateChanged', + TAX_REQUIRED: 'taxRequired', + }, } as const; export default CONST; diff --git a/src/libs/ViolationsUtils.ts b/src/libs/Violations/ViolationsUtils.ts similarity index 100% rename from src/libs/ViolationsUtils.ts rename to src/libs/Violations/ViolationsUtils.ts diff --git a/src/libs/Violations/propTypes.ts b/src/libs/Violations/propTypes.ts new file mode 100644 index 000000000000..e32d9ddd6a2c --- /dev/null +++ b/src/libs/Violations/propTypes.ts @@ -0,0 +1,32 @@ +import PropTypes from 'prop-types'; +import CONST from '@src/CONST'; + +const violationNames = Object.values(CONST.VIOLATIONS); + +const transactionViolationPropType = PropTypes.shape({ + type: PropTypes.string.isRequired, + name: PropTypes.oneOf(violationNames).isRequired, + data: PropTypes.shape({ + rejectedBy: PropTypes.string, + rejectReason: PropTypes.string, + amount: PropTypes.string, + surcharge: PropTypes.number, + invoiceMarkup: PropTypes.number, + maxAge: PropTypes.number, + tagName: PropTypes.string, + formattedLimitAmount: PropTypes.string, + categoryLimit: PropTypes.string, + limit: PropTypes.string, + category: PropTypes.string, + brokenBankConnection: PropTypes.bool, + isAdmin: PropTypes.bool, + email: PropTypes.string, + isTransactionOlderThan7Days: PropTypes.bool, + member: PropTypes.string, + taxName: PropTypes.string, + }), +}); + +const transactionViolationsPropType = PropTypes.arrayOf(transactionViolationPropType); + +export {transactionViolationsPropType, transactionViolationPropType}; diff --git a/src/types/onyx/PolicyCategory.ts b/src/types/onyx/PolicyCategory.ts index b6dfb7bbab9a..03d5877bc5b5 100644 --- a/src/types/onyx/PolicyCategory.ts +++ b/src/types/onyx/PolicyCategory.ts @@ -20,5 +20,5 @@ type PolicyCategory = { }; type PolicyCategories = Record; -export default PolicyCategory; -export type {PolicyCategories}; + +export type {PolicyCategory, PolicyCategories}; diff --git a/src/types/onyx/PolicyTag.ts b/src/types/onyx/PolicyTag.ts index 7807dcc00433..58a21dcf4df5 100644 --- a/src/types/onyx/PolicyTag.ts +++ b/src/types/onyx/PolicyTag.ts @@ -12,5 +12,4 @@ type PolicyTag = { type PolicyTags = Record; -export default PolicyTag; -export type {PolicyTags}; +export type {PolicyTag, PolicyTags}; diff --git a/src/types/onyx/TransactionViolation.ts b/src/types/onyx/TransactionViolation.ts index bd8f3059caea..1d02de12a52a 100644 --- a/src/types/onyx/TransactionViolation.ts +++ b/src/types/onyx/TransactionViolation.ts @@ -1,46 +1,34 @@ +import CONST from '@src/CONST'; + /** - * Names of transaction violations + * Names of violations. + * Derived from `CONST.VIOLATIONS` to maintain a single source of truth. */ -type ViolationName = - | 'allTagLevelsRequired' - | 'autoReportedRejectedExpense' - | 'billableExpense' - | 'cashExpenseWithNoReceipt' - | 'categoryOutOfPolicy' - | 'conversionSurcharge' - | 'customUnitOutOfPolicy' - | 'duplicatedTransaction' - | 'fieldRequired' - | 'futureDate' - | 'invoiceMarkup' - | 'maxAge' - | 'missingCategory' - | 'missingComment' - | 'missingTag' - | 'modifiedAmount' - | 'modifiedDate' - | 'nonExpensiworksExpense' - | 'overAutoApprovalLimit' - | 'overCategoryLimit' - | 'overLimit' - | 'overLimitAttendee' - | 'perDayLimit' - | 'receiptNotSmartScanned' - | 'receiptRequired' - | 'rter' - | 'smartscanFailed' - | 'someTagLevelsRequired' - | 'tagOutOfPolicy' - | 'taxAmountChanged' - | 'taxOutOfPolicy' - | 'taxRateChanged' - | 'taxRequired'; +type ViolationName = (typeof CONST.VIOLATIONS)[keyof typeof CONST.VIOLATIONS]; type TransactionViolation = { type: string; name: ViolationName; userMessage: string; - data?: Record; + data?: { + rejectedBy?: string; + rejectReason?: string; + amount?: string; + surcharge?: number; + invoiceMarkup?: number; + maxAge?: number; + tagName?: string; + formattedLimitAmount?: string; + categoryLimit?: string; + limit?: string; + category?: string; + brokenBankConnection?: boolean; + isAdmin?: boolean; + email?: string; + isTransactionOlderThan7Days?: boolean; + member?: string; + taxName?: string; + }; }; type TransactionViolations = Record; diff --git a/src/types/onyx/index.ts b/src/types/onyx/index.ts index b52a9c919c39..23e2eb1f3bcd 100644 --- a/src/types/onyx/index.ts +++ b/src/types/onyx/index.ts @@ -23,9 +23,9 @@ import PersonalBankAccount from './PersonalBankAccount'; import PersonalDetails, {PersonalDetailsList} from './PersonalDetails'; import PlaidData from './PlaidData'; import Policy from './Policy'; -import PolicyCategory, {PolicyCategories} from './PolicyCategory'; +import {PolicyCategories, PolicyCategory} from './PolicyCategory'; import PolicyMember, {PolicyMembers} from './PolicyMember'; -import PolicyTag, {PolicyTags} from './PolicyTag'; +import {PolicyTag, PolicyTags} from './PolicyTag'; import PrivatePersonalDetails from './PrivatePersonalDetails'; import RecentlyUsedCategories from './RecentlyUsedCategories'; import RecentlyUsedTags from './RecentlyUsedTags'; diff --git a/tests/unit/ViolationUtilsTest.js b/tests/unit/ViolationUtilsTest.js index cc84c547da2e..f0b53443831e 100644 --- a/tests/unit/ViolationUtilsTest.js +++ b/tests/unit/ViolationUtilsTest.js @@ -1,6 +1,6 @@ import {beforeEach} from '@jest/globals'; import Onyx from 'react-native-onyx'; -import ViolationsUtils from '@libs/ViolationsUtils'; +import ViolationsUtils from '@libs/Violations/ViolationsUtils'; import ONYXKEYS from '@src/ONYXKEYS'; const categoryOutOfPolicyViolation = { From 30a77c92d3d05272f193ba856df513e53189f99c Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Thu, 14 Dec 2023 13:31:20 -0500 Subject: [PATCH 079/583] feat(Violations): replace transactionViolationsProp with imported prop from libs/Violations --- .../LHNOptionsList/LHNOptionsList.js | 25 ++----------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/src/components/LHNOptionsList/LHNOptionsList.js b/src/components/LHNOptionsList/LHNOptionsList.js index 87bff1667c3f..ab6da0afa1c8 100644 --- a/src/components/LHNOptionsList/LHNOptionsList.js +++ b/src/components/LHNOptionsList/LHNOptionsList.js @@ -13,6 +13,7 @@ import useThemeStyles from '@hooks/useThemeStyles'; import compose from '@libs/compose'; import * as OptionsListUtils from '@libs/OptionsListUtils'; import * as ReportUtils from '@libs/ReportUtils'; +import {transactionViolationsPropType} from '@libs/Violations/propTypes'; import reportActionPropTypes from '@pages/home/report/reportActionPropTypes'; import reportPropTypes from '@pages/reportPropTypes'; import stylePropTypes from '@styles/stylePropTypes'; @@ -68,29 +69,7 @@ const propTypes = { draftComments: PropTypes.objectOf(PropTypes.string), /** The list of transaction violations */ - transactionViolations: PropTypes.shape({ - violations: PropTypes.arrayOf( - PropTypes.shape({ - /** The transaction ID */ - transactionID: PropTypes.number, - - /** The transaction violation type */ - type: PropTypes.string, - - /** The transaction violation message */ - message: PropTypes.string, - - /** The transaction violation data */ - data: PropTypes.shape({ - /** The transaction violation data field */ - field: PropTypes.string, - - /** The transaction violation data value */ - value: PropTypes.string, - }), - }), - ), - }), + transactionViolations: transactionViolationsPropType, ...withCurrentReportIDPropTypes, }; From f34a723a5c345ca95d6cff4f3ed512dac73b94ed Mon Sep 17 00:00:00 2001 From: Jakub Butkiewicz Date: Thu, 14 Dec 2023 20:03:26 +0100 Subject: [PATCH 080/583] fix: linter --- src/types/onyx/ReportAction.ts | 42 ---------------------------------- 1 file changed, 42 deletions(-) diff --git a/src/types/onyx/ReportAction.ts b/src/types/onyx/ReportAction.ts index 5131e2290d95..8e56aaa67345 100644 --- a/src/types/onyx/ReportAction.ts +++ b/src/types/onyx/ReportAction.ts @@ -7,48 +7,6 @@ import OriginalMessage, {Decision, Reaction} from './OriginalMessage'; import {NotificationPreference} from './Report'; import {Receipt} from './Transaction'; -type Image = { - /** The height of the image. */ - height?: number; - - /** The width of the image. */ - width?: number; - - /** The URL of the image. */ - url?: string; -}; - -type Logo = { - /** The height of the logo. */ - height?: number; - - /** The width of the logo. */ - width?: number; - - /** The URL of the logo. */ - url?: string; -}; - -type LinkMetaData = { - /** The URL of the link. */ - url?: string; - - /** A description of the link. */ - description?: string; - - /** The title of the link. */ - title?: string; - - /** The publisher of the link. */ - publisher?: string; - - /** The image associated with the link. */ - image: Image; - - /** The provider logo associated with the link. */ - logo: Logo; -}; - type Message = { /** The type of the action item fragment. Used to render a corresponding component */ type: string; From 2e3d3e751274fee7da86998745b5432963d9735a Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Thu, 14 Dec 2023 14:19:37 -0500 Subject: [PATCH 081/583] feat(Violations): make reportActions mandatory and remove parentReportAction --- src/libs/ReportUtils.ts | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 96bd16f03e9e..164feac59b8c 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3485,17 +3485,11 @@ function transactionHasViolation(transactionID: string, transactionViolations: T /** * Checks to see if a report's parentAction is a money request that contains a violation */ - -function transactionThreadHasViolations( - report: Report, - transactionViolations: TransactionViolations, - reportActions?: OnyxCollection | null, - parentReportAction?: ReportAction | null, -): boolean { +function transactionThreadHasViolations(report: Report, transactionViolations: TransactionViolations, reportActions: OnyxCollection | null = {}): boolean { if (!reportActions) { return false; } - const resolvedParentReportAction = parentReportAction ?? reportActions?.[`${report.parentReportID}`]?.[`${report.parentReportActionID}`]; + const resolvedParentReportAction = reportActions[`${report.parentReportID}`]?.[`${report.parentReportActionID}`]; if (!resolvedParentReportAction) { return false; } From 9503748199f93349acd0a3c70dfd059345b89666 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Thu, 14 Dec 2023 14:19:48 -0500 Subject: [PATCH 082/583] feat(Violations): remove whitespace --- src/libs/ReportUtils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 164feac59b8c..357404e8283c 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3483,7 +3483,7 @@ function transactionHasViolation(transactionID: string, transactionViolations: T } /** - * Checks to see if a report's parentAction is a money request that contains a violation + * Checks to see if a report's parentAction is a money request that contains a violation */ function transactionThreadHasViolations(report: Report, transactionViolations: TransactionViolations, reportActions: OnyxCollection | null = {}): boolean { if (!reportActions) { @@ -3510,7 +3510,7 @@ function transactionThreadHasViolations(report: Report, transactionViolations: T } /** - * Checks to see if a report contains a violation + * Checks to see if a report contains a violation */ function reportHasViolations(reportID: string, transactionViolations: TransactionViolations): boolean { const transactions = TransactionUtils.getAllReportTransactions(reportID); From 2871cd833d1c5d5c2c8c906e446f8b50e2702d7c Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Thu, 14 Dec 2023 15:10:21 -0500 Subject: [PATCH 083/583] feat(Violations): simplify --- src/libs/SidebarUtils.ts | 37 ++++++++++++------------------------- 1 file changed, 12 insertions(+), 25 deletions(-) diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 3f6b58020b27..6a5089d4de55 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -120,30 +120,17 @@ function getOrderedReportIDs( allReportActions: OnyxCollection, transactionViolations: TransactionViolations, ): string[] { - const countActions = (actions: ReportActions | null): number => (actions ? Object.keys(actions).length : 0); - - const getReportActionCount = (reportIDKey: string): number | null => { - if (!allReportActions?.[reportIDKey]) { - return null; - } - return countActions(allReportActions[reportIDKey]); - }; + const reportIDKey = `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${currentReportId}`; + const reportActionCount = allReportActions?.[reportIDKey]?.length ?? 1; // Generate a unique cache key based on the function arguments const cachedReportsKey = JSON.stringify( - // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - [currentReportId, allReports, betas, policies, priorityMode, getReportActionCount(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${currentReportId}`) || 1], - (key, value: unknown) => { - /** - * Exclude 'participantAccountIDs', 'participants' and 'lastMessageText' not to overwhelm a cached key value with huge data, - * which we don't need to store in a cacheKey - */ - if (key === 'participantAccountIDs' || key === 'participants' || key === 'lastMessageText') { - return undefined; - } - - return value; - }, + [currentReportId, allReports, betas, policies, priorityMode, reportActionCount], + /** + * Exclude 'participantAccountIDs', 'participants' and 'lastMessageText' keys from the stringified + * objects to keep the size of the resulting key manageable. + */ + (key, value: unknown) => (['participantAccountIDs', 'participants', 'lastMessageText'].includes(key) ? undefined : value), ); // Check if the result is already in the cache @@ -286,8 +273,11 @@ function getOptionData( isWaitingOnBankAccount: false, isAllowedToComment: true, }; + const participantPersonalDetailList: PersonalDetails[] = Object.values(OptionsListUtils.getPersonalDetailsForAccountIDs(report.participantAccountIDs ?? [], personalDetails)); const personalDetail = participantPersonalDetailList[0] ?? {}; + const hasErrors = Object.keys(result.allReportErrors ?? {}).length !== 0; + const hasViolations = canUseViolations && ReportUtils.transactionThreadHasViolations(report, transactionViolations, null); result.isThread = ReportUtils.isChatThread(report); result.isChatRoom = ReportUtils.isChatRoom(report); @@ -300,10 +290,7 @@ function getOptionData( result.shouldShowSubscript = ReportUtils.shouldReportShowSubscript(report); result.pendingAction = report.pendingFields ? report.pendingFields.addWorkspaceRoom || report.pendingFields.createChat : undefined; result.allReportErrors = OptionsListUtils.getAllReportErrors(report, reportActions) as OnyxCommon.Errors; - result.brickRoadIndicator = - Object.keys(result.allReportErrors ?? {}).length !== 0 || (canUseViolations && ReportUtils.transactionThreadHasViolations(report, transactionViolations, null, parentReportAction)) - ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR - : ''; + result.brickRoadIndicator = hasErrors || hasViolations ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : ''; result.ownerAccountID = report.ownerAccountID; result.managerID = report.managerID; result.reportID = report.reportID; From 5dd7d01072bfacc86b1d898c599b0d204dd6ec8f Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Thu, 14 Dec 2023 15:10:33 -0500 Subject: [PATCH 084/583] feat(Violations): update comment --- tests/unit/SidebarFilterTest.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/unit/SidebarFilterTest.js b/tests/unit/SidebarFilterTest.js index 8c16ada8154e..7ae49e2eab9e 100644 --- a/tests/unit/SidebarFilterTest.js +++ b/tests/unit/SidebarFilterTest.js @@ -8,7 +8,8 @@ import * as LHNTestUtils from '../utils/LHNTestUtils'; import waitForBatchedUpdates from '../utils/waitForBatchedUpdates'; import wrapOnyxWithWaitForBatchedUpdates from '../utils/wrapOnyxWithWaitForBatchedUpdates'; -// Be sure to include the mocked permissions library as well as the usePermissions hook or else the beta tests won't work +// Be sure to include the mocked permissions library, as some components that are rendered +// during the test depend on its methods. jest.mock('../../src/libs/Permissions'); jest.mock('../../src/hooks/usePermissions.ts'); From d169a435d8048fcbbeece60fb74ba08cc6ea54e2 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Thu, 14 Dec 2023 15:17:06 -0500 Subject: [PATCH 085/583] feat(Violations): simplify feat(Violations): simplify feat(Violations): simplify feat(Violations): simplify feat(Violations): simplify feat(Violations): simplify feat(Violations): simplify feat(Violations): simplify --- src/libs/ReportUtils.ts | 65 +++++++++++------------------------------ 1 file changed, 17 insertions(+), 48 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 357404e8283c..d4fd2cc80960 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -483,9 +483,7 @@ function getPolicyName(report: OnyxEntry | undefined | EmptyObject, retu // Public rooms send back the policy name with the reportSummary, // since they can also be accessed by people who aren't in the workspace // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - const policyName = finalPolicy?.name || report?.policyName || report?.oldPolicyName || noPolicyFound; - - return policyName; + return finalPolicy?.name || report?.policyName || report?.oldPolicyName || noPolicyFound; } /** @@ -536,11 +534,7 @@ function isCanceledTaskReport(report: OnyxEntry | EmptyObject = {}, pare return true; } - if (isNotEmptyObject(report) && report?.isDeletedParentAction) { - return true; - } - - return false; + return Boolean(isNotEmptyObject(report) && report?.isDeletedParentAction); } /** @@ -1176,8 +1170,7 @@ function getReportRecipientAccountIDs(report: OnyxEntry, currentLoginAcc } const reportParticipants = finalParticipantAccountIDs?.filter((accountID) => accountID !== currentLoginAccountID) ?? []; - const participantsWithoutExpensifyAccountIDs = reportParticipants.filter((participant) => !CONST.EXPENSIFY_ACCOUNT_IDS.includes(participant ?? 0)); - return participantsWithoutExpensifyAccountIDs; + return reportParticipants.filter((participant) => !CONST.EXPENSIFY_ACCOUNT_IDS.includes(participant ?? 0)); } /** @@ -1281,13 +1274,12 @@ function getWorkspaceIcon(report: OnyxEntry, policy: OnyxEntry = ? allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`]?.avatar : getDefaultWorkspaceAvatar(workspaceName); - const workspaceIcon: Icon = { + return { source: policyExpenseChatAvatarSource ?? '', type: CONST.ICON_TYPE_WORKSPACE, name: workspaceName, id: -1, - }; - return workspaceIcon; + } as Icon; } /** @@ -1625,12 +1617,8 @@ function requiresAttentionFromCurrentUser(optionOrReport: OnyxEntry | Op return true; } - // Has a child report that is awaiting action (e.g. approve, pay, add bank account) from current user - if (optionOrReport.hasOutstandingChildRequest) { - return true; - } - - return false; + // has a child report that is awaiting action (e.g. approve, pay, add bank account) from current user + return Boolean(optionOrReport.hasOutstandingChildRequest); } /** @@ -3460,11 +3448,7 @@ function canAccessReport(report: OnyxEntry, policies: OnyxCollection { const sortedNewParticipantList = newParticipantList.sort(); @@ -3719,7 +3704,8 @@ function shouldShowFlagComment(reportAction: OnyxEntry, report: On } /** - * @param sortedAndFilteredReportActions - reportActions for the report, sorted newest to oldest, and filtered for only those that should be visible + * @param sortedAndFilteredReportActions - reportActions for the report, sorted newest to oldest, and filtered for only + * those that should be visible */ function getNewMarkerReportActionID(report: OnyxEntry, sortedAndFilteredReportActions: ReportAction[]): string { if (!isUnread(report)) { @@ -3988,19 +3974,7 @@ function shouldReportShowSubscript(report: OnyxEntry): boolean { return true; } - if (isExpenseRequest(report)) { - return true; - } - - if (isWorkspaceTaskReport(report)) { - return true; - } - - if (isWorkspaceThread(report)) { - return true; - } - - return false; + return isExpenseRequest(report) || isWorkspaceTaskReport(report) || isWorkspaceThread(report); } /** @@ -4236,8 +4210,8 @@ function getParticipantsIDs(report: OnyxEntry): number[] { // Build participants list for IOU/expense reports if (isMoneyRequestReport(report)) { const onlyTruthyValues = [report.managerID, report.ownerAccountID, ...participants].filter(Boolean) as number[]; - const onlyUnique = [...new Set([...onlyTruthyValues])]; - return onlyUnique; + // return only unique values + return [...new Set([...onlyTruthyValues])]; } return participants; } @@ -4327,8 +4301,7 @@ function shouldUseFullTitleToDisplay(report: OnyxEntry): boolean { } function getRoom(type: ValueOf, policyID: string): OnyxEntry | undefined { - const room = Object.values(allReports ?? {}).find((report) => report?.policyID === policyID && report?.chatType === type && !isThread(report)); - return room; + return Object.values(allReports ?? {}).find((report) => report?.policyID === policyID && report?.chatType === type && !isThread(report)); } /** @@ -4364,11 +4337,7 @@ function shouldAutoFocusOnKeyPress(event: KeyboardEvent): boolean { return false; } - if (event.code === 'Space') { - return false; - } - - return true; + return event.code !== 'Space'; } /** From aa7822e75831f25cc1cd9d6ac0c9365edfcba90a Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Thu, 14 Dec 2023 16:05:32 -0500 Subject: [PATCH 086/583] feat(Violations): fix type of transactionViolations propType --- src/components/LHNOptionsList/LHNOptionsList.js | 3 ++- src/components/LHNOptionsList/OptionRowLHNData.js | 4 ++++ src/libs/Violations/propTypes.ts | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/components/LHNOptionsList/LHNOptionsList.js b/src/components/LHNOptionsList/LHNOptionsList.js index ab6da0afa1c8..8b2384c4dec8 100644 --- a/src/components/LHNOptionsList/LHNOptionsList.js +++ b/src/components/LHNOptionsList/LHNOptionsList.js @@ -65,6 +65,7 @@ const propTypes = { /** The transaction from the parent report action */ transactions: PropTypes.objectOf(transactionPropTypes), + /** List of draft comments */ draftComments: PropTypes.objectOf(PropTypes.string), @@ -214,7 +215,7 @@ export default compose( key: ONYXKEYS.COLLECTION.REPORT_DRAFT_COMMENT, }, transactionViolations: { - key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, + key: ({currentReportId}) => `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${currentReportId}`, }, }), )(LHNOptionsList); diff --git a/src/components/LHNOptionsList/OptionRowLHNData.js b/src/components/LHNOptionsList/OptionRowLHNData.js index 975299bb8800..82ec30cafe77 100644 --- a/src/components/LHNOptionsList/OptionRowLHNData.js +++ b/src/components/LHNOptionsList/OptionRowLHNData.js @@ -7,6 +7,7 @@ import transactionPropTypes from '@components/transactionPropTypes'; import * as ReportActionsUtils from '@libs/ReportActionsUtils'; import SidebarUtils from '@libs/SidebarUtils'; import * as TransactionUtils from '@libs/TransactionUtils'; +import {transactionViolationsPropType} from '@libs/Violations/propTypes'; import reportActionPropTypes from '@pages/home/report/reportActionPropTypes'; import * as Report from '@userActions/Report'; import CONST from '@src/CONST'; @@ -42,6 +43,9 @@ const propTypes = { /** The transaction from the parent report action */ transaction: transactionPropTypes, + /** Any violations associated with the report */ + transactionViolations: transactionViolationsPropType, + ...basePropTypes, }; diff --git a/src/libs/Violations/propTypes.ts b/src/libs/Violations/propTypes.ts index e32d9ddd6a2c..f0b84cf7d3b1 100644 --- a/src/libs/Violations/propTypes.ts +++ b/src/libs/Violations/propTypes.ts @@ -27,6 +27,6 @@ const transactionViolationPropType = PropTypes.shape({ }), }); -const transactionViolationsPropType = PropTypes.arrayOf(transactionViolationPropType); +const transactionViolationsPropType = PropTypes.objectOf(transactionViolationPropType); export {transactionViolationsPropType, transactionViolationPropType}; From d86616def9715f7511617cb97c40daf722109897 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Fri, 15 Dec 2023 10:37:35 -0500 Subject: [PATCH 087/583] feat(Violations): revert simplifications --- src/libs/ReportUtils.ts | 59 ++++++++++++++++++++++++++++++++--------- 1 file changed, 46 insertions(+), 13 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index d4fd2cc80960..177718c2c36c 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -483,7 +483,9 @@ function getPolicyName(report: OnyxEntry | undefined | EmptyObject, retu // Public rooms send back the policy name with the reportSummary, // since they can also be accessed by people who aren't in the workspace // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - return finalPolicy?.name || report?.policyName || report?.oldPolicyName || noPolicyFound; + const policyName = finalPolicy?.name || report?.policyName || report?.oldPolicyName || noPolicyFound; + + return policyName; } /** @@ -534,7 +536,11 @@ function isCanceledTaskReport(report: OnyxEntry | EmptyObject = {}, pare return true; } - return Boolean(isNotEmptyObject(report) && report?.isDeletedParentAction); + if (isNotEmptyObject(report) && report?.isDeletedParentAction) { + return true; + } + + return false; } /** @@ -1170,7 +1176,8 @@ function getReportRecipientAccountIDs(report: OnyxEntry, currentLoginAcc } const reportParticipants = finalParticipantAccountIDs?.filter((accountID) => accountID !== currentLoginAccountID) ?? []; - return reportParticipants.filter((participant) => !CONST.EXPENSIFY_ACCOUNT_IDS.includes(participant ?? 0)); + const participantsWithoutExpensifyAccountIDs = reportParticipants.filter((participant) => !CONST.EXPENSIFY_ACCOUNT_IDS.includes(participant ?? 0)); + return participantsWithoutExpensifyAccountIDs; } /** @@ -1274,12 +1281,13 @@ function getWorkspaceIcon(report: OnyxEntry, policy: OnyxEntry = ? allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`]?.avatar : getDefaultWorkspaceAvatar(workspaceName); - return { + const workspaceIcon: Icon = { source: policyExpenseChatAvatarSource ?? '', type: CONST.ICON_TYPE_WORKSPACE, name: workspaceName, id: -1, - } as Icon; + }; + return workspaceIcon; } /** @@ -1617,8 +1625,12 @@ function requiresAttentionFromCurrentUser(optionOrReport: OnyxEntry | Op return true; } - // has a child report that is awaiting action (e.g. approve, pay, add bank account) from current user - return Boolean(optionOrReport.hasOutstandingChildRequest); + // Has a child report that is awaiting action (e.g. approve, pay, add bank account) from current user + if (optionOrReport.hasOutstandingChildRequest) { + return true; + } + + return false; } /** @@ -3448,7 +3460,11 @@ function canAccessReport(report: OnyxEntry, policies: OnyxCollection): boolean { return true; } - return isExpenseRequest(report) || isWorkspaceTaskReport(report) || isWorkspaceThread(report); + if (isExpenseRequest(report)) { + return true; + } + + if (isWorkspaceTaskReport(report)) { + return true; + } + + if (isWorkspaceThread(report)) { + return true; + } + + return false; } /** @@ -4210,8 +4238,8 @@ function getParticipantsIDs(report: OnyxEntry): number[] { // Build participants list for IOU/expense reports if (isMoneyRequestReport(report)) { const onlyTruthyValues = [report.managerID, report.ownerAccountID, ...participants].filter(Boolean) as number[]; - // return only unique values - return [...new Set([...onlyTruthyValues])]; + const onlyUnique = [...new Set([...onlyTruthyValues])]; + return onlyUnique; } return participants; } @@ -4301,7 +4329,8 @@ function shouldUseFullTitleToDisplay(report: OnyxEntry): boolean { } function getRoom(type: ValueOf, policyID: string): OnyxEntry | undefined { - return Object.values(allReports ?? {}).find((report) => report?.policyID === policyID && report?.chatType === type && !isThread(report)); + const room = Object.values(allReports ?? {}).find((report) => report?.policyID === policyID && report?.chatType === type && !isThread(report)); + return room; } /** @@ -4337,7 +4366,11 @@ function shouldAutoFocusOnKeyPress(event: KeyboardEvent): boolean { return false; } - return event.code !== 'Space'; + if (event.code === 'Space') { + return false; + } + + return true; } /** From ccb12ccdc8e7883de6a14fe76b5ce50f667bbe52 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Fri, 15 Dec 2023 10:48:28 -0500 Subject: [PATCH 088/583] feat(Violations): add second withOnyx --- src/components/LHNOptionsList/LHNOptionsList.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/LHNOptionsList/LHNOptionsList.js b/src/components/LHNOptionsList/LHNOptionsList.js index 8b2384c4dec8..2999cd9ebda5 100644 --- a/src/components/LHNOptionsList/LHNOptionsList.js +++ b/src/components/LHNOptionsList/LHNOptionsList.js @@ -1,5 +1,6 @@ import {FlashList} from '@shopify/flash-list'; import lodashGet from 'lodash/get'; +import lodashMap from 'lodash/map'; import PropTypes from 'prop-types'; import React, {useCallback} from 'react'; import {View} from 'react-native'; @@ -214,8 +215,10 @@ export default compose( draftComments: { key: ONYXKEYS.COLLECTION.REPORT_DRAFT_COMMENT, }, + }), + withOnyx({ transactionViolations: { - key: ({currentReportId}) => `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${currentReportId}`, + key: ({transactions}) => lodashMap(transactions, (t) => `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${t.transactionID}`), }, }), )(LHNOptionsList); From e3d4ae85c83554a7e493806c2acbd7fbe8ee0aff Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Fri, 15 Dec 2023 16:29:42 -0500 Subject: [PATCH 089/583] feat(Violations): get transactions directly --- src/components/LHNOptionsList/LHNOptionsList.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/components/LHNOptionsList/LHNOptionsList.js b/src/components/LHNOptionsList/LHNOptionsList.js index 2999cd9ebda5..1dfb70f65847 100644 --- a/src/components/LHNOptionsList/LHNOptionsList.js +++ b/src/components/LHNOptionsList/LHNOptionsList.js @@ -1,6 +1,5 @@ import {FlashList} from '@shopify/flash-list'; import lodashGet from 'lodash/get'; -import lodashMap from 'lodash/map'; import PropTypes from 'prop-types'; import React, {useCallback} from 'react'; import {View} from 'react-native'; @@ -215,10 +214,8 @@ export default compose( draftComments: { key: ONYXKEYS.COLLECTION.REPORT_DRAFT_COMMENT, }, - }), - withOnyx({ transactionViolations: { - key: ({transactions}) => lodashMap(transactions, (t) => `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${t.transactionID}`), + key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, }, }), )(LHNOptionsList); From d30c159559c5e628ae39e37821a8d0c4b1f95d42 Mon Sep 17 00:00:00 2001 From: keisyrzk Date: Mon, 18 Dec 2023 08:22:58 +0100 Subject: [PATCH 090/583] change fix place from BaseListItem --- src/components/SelectionList/BaseListItem.js | 2 -- src/components/SelectionList/UserListItem.js | 8 +++++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/SelectionList/BaseListItem.js b/src/components/SelectionList/BaseListItem.js index 06c8f9f638a1..450a14b63dc5 100644 --- a/src/components/SelectionList/BaseListItem.js +++ b/src/components/SelectionList/BaseListItem.js @@ -91,14 +91,12 @@ function BaseListItem({ isFocused ? styles.sidebarLinkActiveText : styles.sidebarLinkText, isUserItem || item.isSelected ? styles.sidebarLinkTextBold : null, styles.pre, - item.pendingAction === 'delete' ? styles.offlineFeedback.deleted : null, ]} alternateTextStyles={[ styles.optionAlternateText, styles.textLabelSupporting, isFocused ? styles.sidebarLinkActiveText : styles.sidebarLinkText, styles.pre, - item.pendingAction === 'delete' ? styles.offlineFeedback.deleted : null, ]} isDisabled={isDisabled} onSelectRow={onSelectRow} diff --git a/src/components/SelectionList/UserListItem.js b/src/components/SelectionList/UserListItem.js index 0b4b6b52e0ac..80d8b5b98657 100644 --- a/src/components/SelectionList/UserListItem.js +++ b/src/components/SelectionList/UserListItem.js @@ -6,9 +6,11 @@ import Text from '@components/Text'; import Tooltip from '@components/Tooltip'; import useThemeStyles from '@styles/useThemeStyles'; import {userListItemPropTypes} from './selectionListPropTypes'; +import useStyleUtils from '@styles/useStyleUtils'; -function UserListItem({item, textStyles, alternateTextStyles, showTooltip}) { +function UserListItem({item, textStyles, alternateTextStyles, showTooltip, style}) { const styles = useThemeStyles(); + const StyleUtils = useStyleUtils(); return ( <> {Boolean(item.icons) && ( @@ -24,7 +26,7 @@ function UserListItem({item, textStyles, alternateTextStyles, showTooltip}) { text={item.text} > {item.text} @@ -36,7 +38,7 @@ function UserListItem({item, textStyles, alternateTextStyles, showTooltip}) { text={item.alternateText} > {item.alternateText} From 9526c1be2cf91f4d37904b07d61e1baca0d79379 Mon Sep 17 00:00:00 2001 From: Jakub Butkiewicz Date: Mon, 18 Dec 2023 13:37:54 +0100 Subject: [PATCH 091/583] fix: app crash --- src/libs/actions/Task.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/actions/Task.ts b/src/libs/actions/Task.ts index 9f2f01e04623..f4a01fa7cf3c 100644 --- a/src/libs/actions/Task.ts +++ b/src/libs/actions/Task.ts @@ -871,7 +871,7 @@ function getTaskAssigneeAccountID(taskReport: OnyxTypes.Report): number | null | * Returns Task owner accountID */ function getTaskOwnerAccountID(taskReport: OnyxTypes.Report): number | null { - return taskReport.ownerAccountID ?? null; + return taskReport?.ownerAccountID ?? null; } /** From fb473d0f2c7628a0dcc5b6fbeca8a5be59bbf856 Mon Sep 17 00:00:00 2001 From: Pedro Guerreiro Date: Mon, 18 Dec 2023 17:31:09 +0000 Subject: [PATCH 092/583] refactor: apply pull request feedback --- src/pages/ConciergePage.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/ConciergePage.tsx b/src/pages/ConciergePage.tsx index d440e6a83705..5f4b5ad375f7 100644 --- a/src/pages/ConciergePage.tsx +++ b/src/pages/ConciergePage.tsx @@ -9,7 +9,7 @@ import * as Report from '@userActions/Report'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import SCREENS from '@src/SCREENS'; -import {Session} from '@src/types/onyx'; +import type {Session} from '@src/types/onyx'; type ConciergePageOnyxProps = { /** Session info for the currently logged in user. */ @@ -38,6 +38,7 @@ function ConciergePage({session}: ConciergePageProps) { return ; } + ConciergePage.displayName = 'ConciergePage'; export default withOnyx({ From 7a8e43e3f1bf0be2e2a1b4827b573d42e02b26ce Mon Sep 17 00:00:00 2001 From: Pedro Guerreiro Date: Mon, 18 Dec 2023 18:18:48 +0000 Subject: [PATCH 093/583] refactor: apply pull request feedback --- src/pages/LogInWithShortLivedAuthTokenPage.tsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/pages/LogInWithShortLivedAuthTokenPage.tsx b/src/pages/LogInWithShortLivedAuthTokenPage.tsx index 2bf59bd76af7..5e95f31d1d6c 100644 --- a/src/pages/LogInWithShortLivedAuthTokenPage.tsx +++ b/src/pages/LogInWithShortLivedAuthTokenPage.tsx @@ -29,16 +29,14 @@ function LogInWithShortLivedAuthTokenPage({route, account}: LogInWithShortLivedA const theme = useTheme(); const styles = useThemeStyles(); const {translate} = useLocalize(); - const { - params: {email, shortLivedAuthToken, shortLivedToken, exitTo, error}, - } = route; + const {email = '', shortLivedAuthToken = '', shortLivedToken = '', exitTo, error} = route?.params ?? {}; useEffect(() => { // We have to check for both shortLivedAuthToken and shortLivedToken, as the old mobile app uses shortLivedToken, and is not being actively updated. - const token = shortLivedAuthToken ?? shortLivedToken; + const token = shortLivedAuthToken || shortLivedToken; // Try to authenticate using the shortLivedToken if we're not already trying to load the accounts - if (email && token && !account?.isLoading) { + if (token && !account?.isLoading) { Session.signInWithShortLivedAuthToken(email, token); return; } From d4678532df22c35f90852c51dc4289cb15fdfa70 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Mon, 18 Dec 2023 20:47:38 -0500 Subject: [PATCH 094/583] feat(Violations): fix propsTypes --- src/libs/ReportUtils.ts | 6 ++++-- src/libs/Violations/propTypes.ts | 2 +- src/pages/home/ReportScreen.js | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 0eda7f18a5ac..61e8845c95d0 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3477,9 +3477,11 @@ function shouldHideReport(report: OnyxEntry, currentReportId: string): b return parentReport?.reportID !== report?.reportID && !isChildReportHasComment; } +/** + * Checks if any violations for the provided transaction are of type 'violation' + */ function transactionHasViolation(transactionID: string, transactionViolations: TransactionViolations): boolean { - const violations: TransactionViolation[] = transactionViolations[transactionID]; - return violations.some((violation: TransactionViolation) => violation.type === 'violation'); + return transactionViolations[transactionID]?.some((violation: TransactionViolation) => violation.type === 'violation'); } /** diff --git a/src/libs/Violations/propTypes.ts b/src/libs/Violations/propTypes.ts index f0b84cf7d3b1..4b5e84405cba 100644 --- a/src/libs/Violations/propTypes.ts +++ b/src/libs/Violations/propTypes.ts @@ -27,6 +27,6 @@ const transactionViolationPropType = PropTypes.shape({ }), }); -const transactionViolationsPropType = PropTypes.objectOf(transactionViolationPropType); +const transactionViolationsPropType = PropTypes.objectOf(PropTypes.arrayOf(transactionViolationPropType)); export {transactionViolationsPropType, transactionViolationPropType}; diff --git a/src/pages/home/ReportScreen.js b/src/pages/home/ReportScreen.js index 161b8aa8889d..c3154d600672 100644 --- a/src/pages/home/ReportScreen.js +++ b/src/pages/home/ReportScreen.js @@ -66,7 +66,7 @@ const propTypes = { reportMetadata: reportMetadataPropTypes, /** Array of report actions for this report */ - reportActions: PropTypes.arrayOf(PropTypes.shape(reportActionPropTypes)), + reportActions: PropTypes.objectOf(PropTypes.shape(reportActionPropTypes)), /** Whether the composer is full size */ isComposerFullSize: PropTypes.bool, @@ -103,7 +103,7 @@ const propTypes = { const defaultProps = { isSidebarLoaded: false, - reportActions: [], + reportActions: {}, report: {}, reportMetadata: { isLoadingInitialReportActions: true, From 04a75d7167942430c222d878b0dd6d1626bc6a2c Mon Sep 17 00:00:00 2001 From: keisyrzk Date: Tue, 19 Dec 2023 14:36:32 +0100 Subject: [PATCH 095/583] lint and prettier --- src/components/SelectionList/BaseListItem.js | 7 +------ src/components/SelectionList/UserListItem.js | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/components/SelectionList/BaseListItem.js b/src/components/SelectionList/BaseListItem.js index aab18468687d..ac679f32d103 100644 --- a/src/components/SelectionList/BaseListItem.js +++ b/src/components/SelectionList/BaseListItem.js @@ -92,12 +92,7 @@ function BaseListItem({ isUserItem || item.isSelected ? styles.sidebarLinkTextBold : null, styles.pre, ]} - alternateTextStyles={[ - styles.optionAlternateText, - styles.textLabelSupporting, - isFocused ? styles.sidebarLinkActiveText : styles.sidebarLinkText, - styles.pre, - ]} + alternateTextStyles={[styles.optionAlternateText, styles.textLabelSupporting, isFocused ? styles.sidebarLinkActiveText : styles.sidebarLinkText, styles.pre]} isDisabled={isDisabled} onSelectRow={onSelectRow} showTooltip={showTooltip} diff --git a/src/components/SelectionList/UserListItem.js b/src/components/SelectionList/UserListItem.js index 1d6e14ced6ac..151ffaa90e94 100644 --- a/src/components/SelectionList/UserListItem.js +++ b/src/components/SelectionList/UserListItem.js @@ -5,8 +5,8 @@ import SubscriptAvatar from '@components/SubscriptAvatar'; import Text from '@components/Text'; import Tooltip from '@components/Tooltip'; import useThemeStyles from '@hooks/useThemeStyles'; -import {userListItemPropTypes} from './selectionListPropTypes'; import useStyleUtils from '@styles/useStyleUtils'; +import {userListItemPropTypes} from './selectionListPropTypes'; function UserListItem({item, textStyles, alternateTextStyles, showTooltip, style}) { const styles = useThemeStyles(); From 9d9df1aafabff7c2fc1fa109ca25edf289968351 Mon Sep 17 00:00:00 2001 From: keisyrzk Date: Tue, 19 Dec 2023 14:41:27 +0100 Subject: [PATCH 096/583] useStyleUtils hook --- src/components/SelectionList/UserListItem.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/SelectionList/UserListItem.js b/src/components/SelectionList/UserListItem.js index 151ffaa90e94..b88e010561ae 100644 --- a/src/components/SelectionList/UserListItem.js +++ b/src/components/SelectionList/UserListItem.js @@ -5,7 +5,7 @@ import SubscriptAvatar from '@components/SubscriptAvatar'; import Text from '@components/Text'; import Tooltip from '@components/Tooltip'; import useThemeStyles from '@hooks/useThemeStyles'; -import useStyleUtils from '@styles/useStyleUtils'; +import useStyleUtils from '@hooks/useStyleUtils'; import {userListItemPropTypes} from './selectionListPropTypes'; function UserListItem({item, textStyles, alternateTextStyles, showTooltip, style}) { From 056c4ba11675ca257e9dc1e4b75dfc649d70d4dc Mon Sep 17 00:00:00 2001 From: Jakub Butkiewicz Date: Tue, 19 Dec 2023 14:51:56 +0100 Subject: [PATCH 097/583] fix: type --- src/libs/actions/Task.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/actions/Task.ts b/src/libs/actions/Task.ts index 4dcabf6ef25c..dc3b6181c2f5 100644 --- a/src/libs/actions/Task.ts +++ b/src/libs/actions/Task.ts @@ -32,7 +32,7 @@ Onyx.connect({ }, }); -let allPersonalDetails: Record | null; +let allPersonalDetails: OnyxEntry; Onyx.connect({ key: ONYXKEYS.PERSONAL_DETAILS_LIST, callback: (value) => (allPersonalDetails = value), From 69054e2a19b0f102fa4552b72659b594262a5a09 Mon Sep 17 00:00:00 2001 From: Jakub Butkiewicz Date: Tue, 19 Dec 2023 15:02:11 +0100 Subject: [PATCH 098/583] fix: added few return types --- src/libs/ReportUtils.ts | 2 +- src/libs/actions/Task.ts | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 7480d8163204..29cdc95707af 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -4494,4 +4494,4 @@ export { shouldAutoFocusOnKeyPress, }; -export type {OptionData, OptimisticChatReport}; +export type {OptionData, OptimisticChatReport, DisplayNameWithTooltips}; diff --git a/src/libs/actions/Task.ts b/src/libs/actions/Task.ts index dc3b6181c2f5..ef4eec9271bb 100644 --- a/src/libs/actions/Task.ts +++ b/src/libs/actions/Task.ts @@ -20,6 +20,13 @@ import * as Report from './Report'; type OptimisticReport = Pick; type Assignee = {icons: Icon[]; displayName: string; subtitle: string}; +type ShareDestination = { + icons: Icon[]; + displayName: string; + subtitle: string; + displayNamesWithTooltips: ReportUtils.DisplayNameWithTooltips; + shouldUseFullTitleToDisplay: boolean; +}; let currentUserEmail: string | undefined; let currentUserAccountID: number | undefined; @@ -219,6 +226,7 @@ function createTaskAndNavigate( assigneeChatReportActionID?: string; assigneeChatCreatedReportActionID?: string; }; + const parameters: CreateTaskParameters = { parentReportActionID: optimisticAddCommentReport.reportAction.reportActionID, parentReportID, @@ -689,7 +697,7 @@ function getAssignee(assigneeAccountID: number, personalDetails: Record, personalDetails: Record) { +function getShareDestination(reportID: string, reports: Record, personalDetails: Record): ShareDestination { const report = reports[`report_${reportID}`] ?? {}; const participantAccountIDs = report.participantAccountIDs ?? []; From 6557b808f9a4a26ecf9eb314076fecb5929e2eff Mon Sep 17 00:00:00 2001 From: Jakub Butkiewicz Date: Tue, 19 Dec 2023 15:26:35 +0100 Subject: [PATCH 099/583] fix: types --- src/components/TaskHeaderActionButton.tsx | 2 +- src/libs/actions/Task.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/TaskHeaderActionButton.tsx b/src/components/TaskHeaderActionButton.tsx index b1a32b356ae1..1ce17ded4256 100644 --- a/src/components/TaskHeaderActionButton.tsx +++ b/src/components/TaskHeaderActionButton.tsx @@ -31,7 +31,7 @@ function TaskHeaderActionButton({report, session, policy}: TaskHeaderActionButto )} + {lodashGet(props, 'action.actionName', '') === CONST.REPORT.ACTIONS.TYPE.MENTIONWHISPER && !lodashGet(props, 'action.originalMessage.resolution', null) && ( + Report.resolveMentionWhisper(props.report.reportID, props.action.reportActionID, CONST.REPORT.RESOLUTIONS.INVITE), + isPrimary: true, + }, + { + text: props.translate('actionableWhisperItems.nothing'), + key: 'nothing', + onPress: () => Report.resolveMentionWhisper(props.report.reportID, props.action.reportActionID, CONST.REPORT.RESOLUTIONS.NOTHING), + }, + ]} + /> + )} ) : ( ; type OriginalMessageApproved = { actionName: typeof CONST.REPORT.ACTIONS.TYPE.APPROVED; @@ -109,6 +110,17 @@ type OriginalMessageAddComment = { }; }; +type OriginalMessageActionableWhisper = { + actionName: typeof CONST.REPORT.ACTIONS.TYPE.MENTIONWHISPER; + originalMessage: { + inviteeAccountIDs: number[]; + inviteeEmails: string; + lastModified: string; + reportID: number; + whisperedTo?: number[]; + }; +}; + type OriginalMessageSubmitted = { actionName: typeof CONST.REPORT.ACTIONS.TYPE.SUBMITTED; originalMessage: unknown; @@ -239,6 +251,7 @@ type OriginalMessage = | OriginalMessageApproved | OriginalMessageIOU | OriginalMessageAddComment + | OriginalMessageActionableWhisper | OriginalMessageSubmitted | OriginalMessageClosed | OriginalMessageCreated From 1ee0a4de857227bd88c9ebc2b32ae20f2d5edf58 Mon Sep 17 00:00:00 2001 From: Ishpaul Singh Date: Thu, 28 Dec 2023 02:21:05 +0530 Subject: [PATCH 138/583] lint error fix --- src/libs/Permissions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/Permissions.ts b/src/libs/Permissions.ts index 239d790581ba..9cde613ebb5a 100644 --- a/src/libs/Permissions.ts +++ b/src/libs/Permissions.ts @@ -3,7 +3,7 @@ import CONST from '@src/CONST'; import Beta from '@src/types/onyx/Beta'; function canUseAllBetas(betas: OnyxEntry): boolean { - return true; + return !!betas?.includes(CONST.BETAS.ALL); } function canUseChronos(betas: OnyxEntry): boolean { From d0f440af63c1cd08d20d8269e6a5654673d3f38d Mon Sep 17 00:00:00 2001 From: Weslley Alves Date: Wed, 27 Dec 2023 22:35:08 -0300 Subject: [PATCH 139/583] Fix oldCreated date format when the created date was changed --- src/libs/ModifiedExpenseMessage.ts | 38 ++++++++++++++---------- tests/unit/ModifiedExpenseMessageTest.ts | 37 +++++++++++++++++++++++ 2 files changed, 59 insertions(+), 16 deletions(-) diff --git a/src/libs/ModifiedExpenseMessage.ts b/src/libs/ModifiedExpenseMessage.ts index c3d9b0a85339..73271ba1c508 100644 --- a/src/libs/ModifiedExpenseMessage.ts +++ b/src/libs/ModifiedExpenseMessage.ts @@ -1,9 +1,9 @@ -import {format} from 'date-fns'; import Onyx from 'react-native-onyx'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import {PolicyTags, ReportAction} from '@src/types/onyx'; import * as CurrencyUtils from './CurrencyUtils'; +import DateUtils from './DateUtils'; import * as Localize from './Localize'; import * as PolicyUtils from './PolicyUtils'; import * as ReportUtils from './ReportUtils'; @@ -87,6 +87,26 @@ function getForDistanceRequest(newDistance: string, oldDistance: string, newAmou }); } +/** + * Build message fragment for the created property when this value was changed + * @param setFragments + * @param removalFragments + * @param changeFragments + * @param [reportActionOriginalMessage] + */ +function buildMessageFragmentForCreated(setFragments: string[], removalFragments: string[], changeFragments: string[], reportActionOriginalMessage?: ExpenseOriginalMessage) { + const {created, oldCreated} = reportActionOriginalMessage ?? {}; + + if (!oldCreated || !created) { + return; + } + + // Take only the YYYY-MM-DD value as the original date includes timestamp + const formattedOldCreated = DateUtils.formatWithUTCTimeZone(oldCreated, CONST.DATE.FNS_FORMAT_STRING); + + buildMessageFragmentForValue(created, formattedOldCreated, Localize.translateLocal('common.date'), false, setFragments, removalFragments, changeFragments); +} + /** * Get the report action message when expense has been modified. * @@ -143,21 +163,7 @@ function getForReportAction(reportAction: ReportAction): string { ); } - const hasModifiedCreated = reportActionOriginalMessage && 'oldCreated' in reportActionOriginalMessage && 'created' in reportActionOriginalMessage; - if (hasModifiedCreated) { - // Take only the YYYY-MM-DD value as the original date includes timestamp - let formattedOldCreated: Date | string = new Date(reportActionOriginalMessage?.oldCreated ? reportActionOriginalMessage.oldCreated : 0); - formattedOldCreated = format(formattedOldCreated, CONST.DATE.FNS_FORMAT_STRING); - buildMessageFragmentForValue( - reportActionOriginalMessage?.created ?? '', - formattedOldCreated, - Localize.translateLocal('common.date'), - false, - setFragments, - removalFragments, - changeFragments, - ); - } + buildMessageFragmentForCreated(setFragments, removalFragments, changeFragments, reportActionOriginalMessage); if (hasModifiedMerchant) { buildMessageFragmentForValue( diff --git a/tests/unit/ModifiedExpenseMessageTest.ts b/tests/unit/ModifiedExpenseMessageTest.ts index 02990aa5c751..aedc02cc628b 100644 --- a/tests/unit/ModifiedExpenseMessageTest.ts +++ b/tests/unit/ModifiedExpenseMessageTest.ts @@ -275,5 +275,42 @@ describe('ModifiedExpenseMessage', () => { expect(result).toEqual(expectedResult); }); }); + + describe('when the created date is changed', () => { + const reportAction = { + ...createRandomReportAction(1), + actionName: CONST.REPORT.ACTIONS.TYPE.MODIFIEDEXPENSE, + originalMessage: { + created: '2023-12-27', + oldCreated: '2023-12-26', + }, + }; + + it('returns the correct text message', () => { + const expectedResult = 'changed the date to 2023-12-27 (previously 2023-12-26).'; + + const result = ModifiedExpenseMessage.getForReportAction(reportAction); + + expect(result).toEqual(expectedResult); + }); + }); + + describe('when the created date was not changed', () => { + const reportAction = { + ...createRandomReportAction(1), + actionName: CONST.REPORT.ACTIONS.TYPE.MODIFIEDEXPENSE, + originalMessage: { + created: '2023-12-27', + }, + }; + + it('returns the correct text message', () => { + const expectedResult = 'changed the request'; + + const result = ModifiedExpenseMessage.getForReportAction(reportAction); + + expect(result).toEqual(expectedResult); + }); + }); }); }); From 3ac64a71be13f7392bad5cd76f87250a82562b49 Mon Sep 17 00:00:00 2001 From: Weslley Alves Date: Wed, 27 Dec 2023 23:59:02 -0300 Subject: [PATCH 140/583] Remove JSDoc comments that are redundant with TypeScript --- src/libs/ModifiedExpenseMessage.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/libs/ModifiedExpenseMessage.ts b/src/libs/ModifiedExpenseMessage.ts index 73271ba1c508..3951a208925e 100644 --- a/src/libs/ModifiedExpenseMessage.ts +++ b/src/libs/ModifiedExpenseMessage.ts @@ -89,10 +89,6 @@ function getForDistanceRequest(newDistance: string, oldDistance: string, newAmou /** * Build message fragment for the created property when this value was changed - * @param setFragments - * @param removalFragments - * @param changeFragments - * @param [reportActionOriginalMessage] */ function buildMessageFragmentForCreated(setFragments: string[], removalFragments: string[], changeFragments: string[], reportActionOriginalMessage?: ExpenseOriginalMessage) { const {created, oldCreated} = reportActionOriginalMessage ?? {}; From 35ff0a926031fea3d4c209683477a6a621fd4284 Mon Sep 17 00:00:00 2001 From: Abhas Kumar Date: Thu, 28 Dec 2023 08:58:52 +0530 Subject: [PATCH 141/583] resolve conflict from main --- src/components/MoneyReportHeader.tsx | 28 ++-------------------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/src/components/MoneyReportHeader.tsx b/src/components/MoneyReportHeader.tsx index 347f5d1e9696..9751771c308f 100644 --- a/src/components/MoneyReportHeader.tsx +++ b/src/components/MoneyReportHeader.tsx @@ -1,10 +1,4 @@ -<<<<<<< HEAD:src/components/MoneyReportHeader.tsx -import React, {useCallback, useMemo, useState} from 'react'; -======= -import lodashGet from 'lodash/get'; -import PropTypes from 'prop-types'; import React, {useMemo} from 'react'; ->>>>>>> main:src/components/MoneyReportHeader.js import {View} from 'react-native'; import {OnyxEntry, withOnyx} from 'react-native-onyx'; import _ from 'underscore'; @@ -51,24 +45,10 @@ type MoneyReportHeaderProps = MoneyReportHeaderOnyxProps & { personalDetails: PersonalDetails }; -<<<<<<< HEAD:src/components/MoneyReportHeader.tsx function MoneyReportHeader({session, personalDetails, policy, chatReport, nextStep, report: moneyRequestReport}: MoneyReportHeaderProps) { - const {windowWidth, isSmallScreenWidth} = useWindowDimensions(); -======= -const defaultProps = { - chatReport: {}, - nextStep: {}, - session: { - email: null, - }, - policy: {}, -}; - -function MoneyReportHeader({session, personalDetails, policy, chatReport, nextStep, report: moneyRequestReport, isSmallScreenWidth}) { ->>>>>>> main:src/components/MoneyReportHeader.js const styles = useThemeStyles(); const {translate} = useLocalize(); - const {windowWidth} = useWindowDimensions(); + const {windowWidth, isSmallScreenWidth} = useWindowDimensions(); const reimbursableTotal = ReportUtils.getMoneyRequestReimbursableTotal(moneyRequestReport); const isApproved = ReportUtils.isReportApproved(moneyRequestReport); const isSettled = ReportUtils.isSettled(moneyRequestReport.reportID); @@ -98,11 +78,7 @@ function MoneyReportHeader({session, personalDetails, policy, chatReport, nextSt const shouldShowAnyButton = shouldShowSettlementButton || shouldShowApproveButton || shouldShowSubmitButton || shouldShowNextStep; const bankAccountRoute = ReportUtils.getBankAccountRoute(chatReport); const formattedAmount = CurrencyUtils.convertToDisplayString(reimbursableTotal, moneyRequestReport.currency); -<<<<<<< HEAD:src/components/MoneyReportHeader.tsx - const isMoreContentShown = shouldShowNextSteps ?? (shouldShowAnyButton && isSmallScreenWidth); -======= - const isMoreContentShown = shouldShowNextStep || (shouldShowAnyButton && isSmallScreenWidth); ->>>>>>> main:src/components/MoneyReportHeader.js + const isMoreContentShown = shouldShowNextStep ?? (shouldShowAnyButton && isSmallScreenWidth); const threeDotsMenuItems = [HeaderUtils.getPinMenuItem(moneyRequestReport)]; if (!ReportUtils.isArchivedRoom(chatReport)) { From 90f79630f4de3b6d7b1f126bb5544b3059f844f7 Mon Sep 17 00:00:00 2001 From: Abhas Kumar Date: Thu, 28 Dec 2023 09:55:09 +0530 Subject: [PATCH 142/583] add ts-expect-error with issue nos --- src/components/MoneyReportHeader.tsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/components/MoneyReportHeader.tsx b/src/components/MoneyReportHeader.tsx index 9751771c308f..97d49cb42842 100644 --- a/src/components/MoneyReportHeader.tsx +++ b/src/components/MoneyReportHeader.tsx @@ -18,6 +18,7 @@ import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type {PersonalDetails, Policy, Report, ReportNextStep, Session} from '@src/types/onyx'; +import DeepValueOf from '@src/types/utils/DeepValueOf'; import Button from './Button'; import HeaderWithBackButton from './HeaderWithBackButton'; import MoneyReportHeaderStatusBar from './MoneyReportHeaderStatusBar'; @@ -100,10 +101,12 @@ function MoneyReportHeader({session, personalDetails, policy, chatReport, nextSt return ( + {/* @ts-expect-error TODO:#25120 types should be defined for component */} IOU.payMoneyRequest(paymentType, chatReport, moneyRequestReport)} + // @ts-expect-error : TODO #24926 : type of currency should be handled in file IOU.js + onPress={(paymentType: DeepValueOf) => IOU.payMoneyRequest(paymentType, chatReport, moneyRequestReport)} enablePaymentsRoute={ROUTES.ENABLE_PAYMENTS} addBankAccountRoute={bankAccountRoute} shouldHidePaymentOptions={!shouldShowPayButton} @@ -148,11 +153,13 @@ function MoneyReportHeader({session, personalDetails, policy, chatReport, nextSt {shouldShowSettlementButton && isSmallScreenWidth && ( IOU.payMoneyRequest(paymentType, chatReport, moneyRequestReport)} + // @ts-expect-error : TODO #24926 : type of currency should be handled in file IOU.js + onPress={(paymentType: DeepValueOf) => IOU.payMoneyRequest(paymentType, chatReport, moneyRequestReport)} enablePaymentsRoute={ROUTES.ENABLE_PAYMENTS} addBankAccountRoute={bankAccountRoute} shouldHidePaymentOptions={!shouldShowPayButton} From fcf887354891f4ec88a7a97a10d7ed8725316792 Mon Sep 17 00:00:00 2001 From: Abhas Kumar Date: Thu, 28 Dec 2023 10:22:15 +0530 Subject: [PATCH 143/583] remove underscore --- src/components/MoneyReportHeader.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/components/MoneyReportHeader.tsx b/src/components/MoneyReportHeader.tsx index 97d49cb42842..3ed30a757b33 100644 --- a/src/components/MoneyReportHeader.tsx +++ b/src/components/MoneyReportHeader.tsx @@ -1,7 +1,6 @@ import React, {useMemo} from 'react'; import {View} from 'react-native'; import {OnyxEntry, withOnyx} from 'react-native-onyx'; -import _ from 'underscore'; import GoogleMeetIcon from '@assets/images/google-meet.svg'; import ZoomIcon from '@assets/images/zoom-icon.svg'; import useLocalize from '@hooks/useLocalize'; @@ -55,7 +54,7 @@ function MoneyReportHeader({session, personalDetails, policy, chatReport, nextSt const isSettled = ReportUtils.isSettled(moneyRequestReport.reportID); const policyType = policy?.type; const isPolicyAdmin = policyType !== CONST.POLICY.TYPE.PERSONAL && policy?.role === CONST.POLICY.ROLE.ADMIN; - const isGroupPolicy = _.contains([CONST.POLICY.TYPE.CORPORATE, CONST.POLICY.TYPE.TEAM], policyType); + const isGroupPolicy = [CONST.POLICY.TYPE.CORPORATE, CONST.POLICY.TYPE.TEAM].some(type => type === policyType); const isManager = ReportUtils.isMoneyRequestReport(moneyRequestReport) && session?.accountID === moneyRequestReport.managerID; const isPayer = isGroupPolicy ? // In a group policy, the admin approver can pay the report directly by skipping the approval step @@ -75,7 +74,7 @@ function MoneyReportHeader({session, personalDetails, policy, chatReport, nextSt const shouldShowSettlementButton = shouldShowPayButton || shouldShowApproveButton; const shouldShowSubmitButton = isDraft && reimbursableTotal !== 0; const isFromPaidPolicy = policyType === CONST.POLICY.TYPE.TEAM || policyType === CONST.POLICY.TYPE.CORPORATE; - const shouldShowNextStep = isFromPaidPolicy && nextStep && !_.isEmpty(nextStep.message); + const shouldShowNextStep = isFromPaidPolicy && !!nextStep?.message?.length const shouldShowAnyButton = shouldShowSettlementButton || shouldShowApproveButton || shouldShowSubmitButton || shouldShowNextStep; const bankAccountRoute = ReportUtils.getBankAccountRoute(chatReport); const formattedAmount = CurrencyUtils.convertToDisplayString(reimbursableTotal, moneyRequestReport.currency); From b87391939485e4e16c234fc069be2a5a2e41a59c Mon Sep 17 00:00:00 2001 From: Abhas Kumar Date: Thu, 28 Dec 2023 10:28:24 +0530 Subject: [PATCH 144/583] write prettier changes --- src/components/MoneyReportHeader.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/MoneyReportHeader.tsx b/src/components/MoneyReportHeader.tsx index 3ed30a757b33..b471470a24d5 100644 --- a/src/components/MoneyReportHeader.tsx +++ b/src/components/MoneyReportHeader.tsx @@ -32,7 +32,7 @@ type MoneyReportHeaderOnyxProps = { /** UserSession info for the currently logged in user. */ session: OnyxEntry; -} +}; type MoneyReportHeaderProps = MoneyReportHeaderOnyxProps & { /** The report currently being looked at */ @@ -42,7 +42,7 @@ type MoneyReportHeaderProps = MoneyReportHeaderOnyxProps & { policy: Policy; /** Personal details so we can get the ones for the report participants */ - personalDetails: PersonalDetails + personalDetails: PersonalDetails; }; function MoneyReportHeader({session, personalDetails, policy, chatReport, nextStep, report: moneyRequestReport}: MoneyReportHeaderProps) { @@ -54,7 +54,7 @@ function MoneyReportHeader({session, personalDetails, policy, chatReport, nextSt const isSettled = ReportUtils.isSettled(moneyRequestReport.reportID); const policyType = policy?.type; const isPolicyAdmin = policyType !== CONST.POLICY.TYPE.PERSONAL && policy?.role === CONST.POLICY.ROLE.ADMIN; - const isGroupPolicy = [CONST.POLICY.TYPE.CORPORATE, CONST.POLICY.TYPE.TEAM].some(type => type === policyType); + const isGroupPolicy = [CONST.POLICY.TYPE.CORPORATE, CONST.POLICY.TYPE.TEAM].some((type) => type === policyType); const isManager = ReportUtils.isMoneyRequestReport(moneyRequestReport) && session?.accountID === moneyRequestReport.managerID; const isPayer = isGroupPolicy ? // In a group policy, the admin approver can pay the report directly by skipping the approval step @@ -74,7 +74,7 @@ function MoneyReportHeader({session, personalDetails, policy, chatReport, nextSt const shouldShowSettlementButton = shouldShowPayButton || shouldShowApproveButton; const shouldShowSubmitButton = isDraft && reimbursableTotal !== 0; const isFromPaidPolicy = policyType === CONST.POLICY.TYPE.TEAM || policyType === CONST.POLICY.TYPE.CORPORATE; - const shouldShowNextStep = isFromPaidPolicy && !!nextStep?.message?.length + const shouldShowNextStep = isFromPaidPolicy && !!nextStep?.message?.length; const shouldShowAnyButton = shouldShowSettlementButton || shouldShowApproveButton || shouldShowSubmitButton || shouldShowNextStep; const bankAccountRoute = ReportUtils.getBankAccountRoute(chatReport); const formattedAmount = CurrencyUtils.convertToDisplayString(reimbursableTotal, moneyRequestReport.currency); @@ -200,4 +200,4 @@ export default withOnyx({ session: { key: ONYXKEYS.SESSION, }, -})(MoneyReportHeader); \ No newline at end of file +})(MoneyReportHeader); From 663e4a82cbd4967290af3f1306d9f4a0fdc026ae Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Thu, 28 Dec 2023 13:15:50 +0800 Subject: [PATCH 145/583] clear anchor ref when the modal hide --- src/components/EmojiPicker/EmojiPicker.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/EmojiPicker/EmojiPicker.js b/src/components/EmojiPicker/EmojiPicker.js index 532eb61a99a9..96bb18cdae04 100644 --- a/src/components/EmojiPicker/EmojiPicker.js +++ b/src/components/EmojiPicker/EmojiPicker.js @@ -86,7 +86,6 @@ const EmojiPicker = forwardRef((props, ref) => { if (isNavigating) { onModalHide.current = () => {}; } - emojiPopoverAnchorRef.current = null; setIsEmojiPickerVisible(false); }; @@ -162,7 +161,10 @@ const EmojiPicker = forwardRef((props, ref) => { isVisible={isEmojiPickerVisible} onClose={hideEmojiPicker} onModalShow={focusEmojiSearchInput} - onModalHide={onModalHide.current} + onModalHide={() => { + onModalHide.current(); + emojiPopoverAnchorRef.current = null; + }} hideModalContentWhileAnimating shouldSetModalVisibility={false} animationInTiming={1} From a7934868a1bcda4489de5296cfbdd0c522d3453d Mon Sep 17 00:00:00 2001 From: cdOut <88325488+cdOut@users.noreply.github.com> Date: Thu, 28 Dec 2023 07:53:35 +0100 Subject: [PATCH 146/583] add remaining typescript typing to the policy lib --- src/libs/ReportUtils.ts | 70 +++++------ src/libs/actions/Policy.ts | 129 ++++++++++++-------- src/pages/workspace/WorkspaceMembersPage.js | 2 - 3 files changed, 111 insertions(+), 90 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index c53b50122faf..129947c09065 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -275,20 +275,20 @@ type OptimisticTaskReport = Pick< type TransactionDetails = | { - created: string; - amount: number; - currency: string; - merchant: string; - waypoints?: WaypointCollection; - comment: string; - category: string; - billable: boolean; - tag: string; - mccGroup?: ValueOf; - cardID: number; - originalAmount: number; - originalCurrency: string; -} + created: string; + amount: number; + currency: string; + merchant: string; + waypoints?: WaypointCollection; + comment: string; + category: string; + billable: boolean; + tag: string; + mccGroup?: ValueOf; + cardID: number; + originalAmount: number; + originalCurrency: string; + } | undefined; type OptimisticIOUReport = Pick< @@ -1826,12 +1826,12 @@ function canEditReportAction(reportAction: OnyxEntry): boolean { return Boolean( reportAction?.actorAccountID === currentUserAccountID && - isCommentOrIOU && - canEditMoneyRequest(reportAction) && // Returns true for non-IOU actions - !isReportMessageAttachment(reportAction?.message?.[0] ?? {type: '', text: ''}) && - !ReportActionsUtils.isDeletedAction(reportAction) && - !ReportActionsUtils.isCreatedTaskReportAction(reportAction) && - reportAction?.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, + isCommentOrIOU && + canEditMoneyRequest(reportAction) && // Returns true for non-IOU actions + !isReportMessageAttachment(reportAction?.message?.[0] ?? {type: '', text: ''}) && + !ReportActionsUtils.isDeletedAction(reportAction) && + !ReportActionsUtils.isCreatedTaskReportAction(reportAction) && + reportAction?.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, ); } @@ -2992,9 +2992,9 @@ function updateReportPreview( childMoneyRequestCount: (reportPreviewAction?.childMoneyRequestCount ?? 0) + (isPayRequest ? 0 : 1), childRecentReceiptTransactionIDs: hasReceipt ? { - ...(transaction && {[transaction.transactionID]: transaction?.created}), - ...previousTransactions, - } + ...(transaction && {[transaction.transactionID]: transaction?.created}), + ...previousTransactions, + } : recentReceiptTransactions, // As soon as we add a transaction without a receipt to the report, it will have ready money requests, // so we remove the whisper @@ -3576,12 +3576,12 @@ function canFlagReportAction(reportAction: OnyxEntry, reportID: st return Boolean( !isCurrentUserAction && - reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.ADDCOMMENT && - !ReportActionsUtils.isDeletedAction(reportAction) && - !ReportActionsUtils.isCreatedTaskReportAction(reportAction) && - isNotEmptyObject(report) && - report && - isAllowedToComment(report), + reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.ADDCOMMENT && + !ReportActionsUtils.isDeletedAction(reportAction) && + !ReportActionsUtils.isCreatedTaskReportAction(reportAction) && + isNotEmptyObject(report) && + report && + isAllowedToComment(report), ); } @@ -4225,12 +4225,12 @@ function getChannelLogMemberMessage(reportAction: OnyxEntry): stri function isGroupChat(report: OnyxEntry): boolean { return Boolean( report && - !isChatThread(report) && - !isTaskReport(report) && - !isMoneyRequestReport(report) && - !isArchivedRoom(report) && - !Object.values(CONST.REPORT.CHAT_TYPE).some((chatType) => chatType === getChatType(report)) && - (report.participantAccountIDs?.length ?? 0) > 2, + !isChatThread(report) && + !isTaskReport(report) && + !isMoneyRequestReport(report) && + !isArchivedRoom(report) && + !Object.values(CONST.REPORT.CHAT_TYPE).some((chatType) => chatType === getChatType(report)) && + (report.participantAccountIDs?.length ?? 0) > 2, ); } diff --git a/src/libs/actions/Policy.ts b/src/libs/actions/Policy.ts index 5cf0c57b3882..ee0340f6e9fa 100644 --- a/src/libs/actions/Policy.ts +++ b/src/libs/actions/Policy.ts @@ -17,18 +17,7 @@ import * as ReportUtils from '@libs/ReportUtils'; import * as TransactionUtils from '@libs/TransactionUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import { - Network, - PersonalDetails, - Policy, - PolicyMember, PolicyTags, - RecentlyUsedCategories, - RecentlyUsedTags, - ReimbursementAccount, - Report, - ReportAction, - Transaction -} from '@src/types/onyx'; +import {Network, PersonalDetails, Policy, PolicyMember, PolicyTags, RecentlyUsedCategories, RecentlyUsedTags, ReimbursementAccount, Report, ReportAction, Transaction} from '@src/types/onyx'; import {Errors} from '@src/types/onyx/OnyxCommon'; import {CustomUnit, NewCustomUnit} from '@src/types/onyx/Policy'; import {isNotEmptyObject} from '@src/types/utils/EmptyObject'; @@ -46,8 +35,8 @@ Onyx.connect({ // More info: https://github.com/Expensify/App/issues/14260 const policyID = key.replace(ONYXKEYS.COLLECTION.POLICY, ''); const policyReports = ReportUtils.getAllPolicyReports(policyID); - const cleanUpMergeQueries = {}; - const cleanUpSetQueries = {}; + const cleanUpMergeQueries: OnyxCollection> = {}; + const cleanUpSetQueries: OnyxCollection> = {}; policyReports.forEach((policyReport) => { if (!policyReport) { return; @@ -58,7 +47,7 @@ Onyx.connect({ cleanUpSetQueries[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS_DRAFTS}${reportID}`] = null; }); Onyx.mergeCollection(ONYXKEYS.COLLECTION.REPORT, cleanUpMergeQueries); - Onyx.multiSet(cleanUpSetQueries); + Onyx.multiSet(cleanUpSetQueries as Partial<{string: null}>); delete allPolicies[key]; return; } @@ -190,33 +179,33 @@ function deleteWorkspace(policyID: string, reports: Report[], policyName: string errors: null, }, }, - ...reports.map(({reportID}) => ({ + ...reports.map(({reportID}) => ({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`, - value: ({ + value: { stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, statusNum: CONST.REPORT.STATUS.CLOSED, hasDraft: false, oldPolicyName: allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]?.name ?? '', - }), + }, })), - ...(reports.map(({reportID}) => ({ + ...reports.map(({reportID}) => ({ onyxMethod: Onyx.METHOD.SET, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS_DRAFTS}${reportID}`, value: null, - }))), + })), // Add closed actions to all chat reports linked to this policy - ...reports.map(({reportID, ownerAccountID}) => { + ...reports.map(({reportID, ownerAccountID}) => { // Announce & admin chats have FAKE owners, but workspace chats w/ users do have owners. let emailClosingReport: string = CONST.POLICY.OWNER_EMAIL_FAKE; if (!!ownerAccountID && ownerAccountID !== CONST.POLICY.OWNER_ACCOUNT_ID_FAKE) { emailClosingReport = allPersonalDetails?.[ownerAccountID]?.login ?? ''; } - const optimisticClosedReportAction: ReportAction = ReportUtils.buildOptimisticClosedReportAction(emailClosingReport, policyName, CONST.REPORT.ARCHIVE_REASON.POLICY_DELETED); + const optimisticClosedReportAction = ReportUtils.buildOptimisticClosedReportAction(emailClosingReport, policyName, CONST.REPORT.ARCHIVE_REASON.POLICY_DELETED); const optimisticReportActions: Record = {}; - optimisticReportActions[optimisticClosedReportAction.reportActionID] = optimisticClosedReportAction; + optimisticReportActions[optimisticClosedReportAction.reportActionID] = optimisticClosedReportAction as ReportAction; return { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, @@ -225,7 +214,7 @@ function deleteWorkspace(policyID: string, reports: Report[], policyName: string }), ...(!hasActiveFreePolicy(filteredPolicies) - ? ([ + ? [ { onyxMethod: Onyx.METHOD.MERGE, key: ONYXKEYS.REIMBURSEMENT_ACCOUNT, @@ -233,8 +222,8 @@ function deleteWorkspace(policyID: string, reports: Report[], policyName: string errors: null, }, }, - ]) - : ([])), + ] + : []), ]; // Restore the old report stateNum and statusNum @@ -358,7 +347,6 @@ function removeMembers(accountIDs: number[], policyID: string) { return; } - const membersListKey = `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`; const policy = ReportUtils.getPolicy(policyID); const workspaceChats = ReportUtils.getWorkspaceChats(policyID, accountIDs); const optimisticClosedReportActions = workspaceChats.map(() => ReportUtils.buildOptimisticClosedReportAction(sessionEmail, policy.name, CONST.REPORT.ARCHIVE_REASON.REMOVED_FROM_POLICY)); @@ -374,13 +362,13 @@ function removeMembers(accountIDs: number[], policyID: string) { failureMembersState[accountID] = {errors: ErrorUtils.getMicroSecondOnyxError('workspace.people.error.genericRemove')}; }); - const optimisticData = [ + const optimisticData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, - key: membersListKey, + key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, value: optimisticMembersState, }, - ...workspaceChats.map((report) => ({ + ...workspaceChats.map((report) => ({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${report?.reportID}`, value: { @@ -390,10 +378,10 @@ function removeMembers(accountIDs: number[], policyID: string) { hasDraft: false, }, })), - ...optimisticClosedReportActions.map((reportAction, index) => ({ + ...optimisticClosedReportActions.map((reportAction, index) => ({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${workspaceChats?.[index]?.reportID}`, - value: {[reportAction.reportActionID]: reportAction}, + value: {[reportAction.reportActionID]: reportAction as ReportAction}, })), ...announceRoomMembers.onyxOptimisticData, ]; @@ -424,22 +412,22 @@ function removeMembers(accountIDs: number[], policyID: string) { } } - const successData = [ + const successData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, - key: membersListKey, + key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, value: successMembersState, }, ]; const filteredWorkspaceChats = workspaceChats.filter((e): e is Report => e !== null); - const failureData = [ + const failureData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, - key: membersListKey, + key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, value: failureMembersState, }, - ...filteredWorkspaceChats.map(({reportID, stateNum, statusNum, hasDraft, oldPolicyName = null}) => ({ + ...filteredWorkspaceChats.map(({reportID, stateNum, statusNum, hasDraft, oldPolicyName = null}) => ({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`, value: { @@ -449,7 +437,7 @@ function removeMembers(accountIDs: number[], policyID: string) { oldPolicyName, }, })), - ...optimisticClosedReportActions.map((reportAction, index) => ({ + ...optimisticClosedReportActions.map((reportAction, index) => ({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${workspaceChats?.[index]?.reportID}`, value: {[reportAction.reportActionID]: null}, @@ -794,7 +782,7 @@ function updateGeneralSettings(policyID: string, name: string, currency: string) onyxMethod: Onyx.METHOD.SET, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, value: { - ...((allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`] ?? {} as Policy)), + ...(allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`] ?? ({} as Policy)), pendingFields: { generalSettings: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, @@ -806,7 +794,7 @@ function updateGeneralSettings(policyID: string, name: string, currency: string) }, name, outputCurrency: currency, - ...((distanceUnit + ...(distanceUnit ? { customUnits: { [distanceUnit.customUnitID]: { @@ -820,7 +808,7 @@ function updateGeneralSettings(policyID: string, name: string, currency: string) }, }, } - : {})), + : {}), }, }, ]; @@ -1626,12 +1614,19 @@ function createWorkspaceFromIOUPayment(iouReport: Report): string | undefined { { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY_DRAFTS}${policyID}`, - value: null, + value: { + pendingFields: { + addWorkspaceRoom: null, + }, + pendingAction: null, + }, }, { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS_DRAFTS}${policyID}`, - value: null, + value: { + pendingAction: null, + }, }, ...employeeWorkspaceChat.onyxOptimisticData, ]; @@ -1706,37 +1701,60 @@ function createWorkspaceFromIOUPayment(iouReport: Report): string | undefined { { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, - value: null, + value: { + pendingAction: null, + }, }, { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${announceChatReportID}`, - value: null, + value: { + pendingFields: { + addWorkspaceRoom: null, + }, + pendingAction: null, + }, }, { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${announceChatReportID}`, - value: null, + value: { + pendingAction: null, + }, }, { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${adminsChatReportID}`, - value: null, + value: { + pendingFields: { + addWorkspaceRoom: null, + }, + pendingAction: null, + }, }, { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${adminsChatReportID}`, - value: null, + value: { + pendingAction: null, + }, }, { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${workspaceChatReportID}`, - value: null, + value: { + pendingFields: { + addWorkspaceRoom: null, + }, + pendingAction: null, + }, }, { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${workspaceChatReportID}`, - value: null, + value: { + pendingAction: null, + }, }, ]; @@ -1838,11 +1856,16 @@ function createWorkspaceFromIOUPayment(iouReport: Report): string | undefined { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${memberData.workspaceChatReportID}`, value: { - [reportPreview.reportActionID]: ({ + [reportPreview.reportActionID]: { ...reportPreview, - message: ReportUtils.getReportPreviewMessage(expenseReport, {}, false, false, newWorkspace), + message: [ + { + type: CONST.REPORT.MESSAGE.TYPE.TEXT, + text: ReportUtils.getReportPreviewMessage(expenseReport, {}, false, false, newWorkspace), + }, + ], created: DateUtils.getDBTime(), - }), + }, }, }); } diff --git a/src/pages/workspace/WorkspaceMembersPage.js b/src/pages/workspace/WorkspaceMembersPage.js index 4c9bc5ca3a9b..09b613350705 100644 --- a/src/pages/workspace/WorkspaceMembersPage.js +++ b/src/pages/workspace/WorkspaceMembersPage.js @@ -85,8 +85,6 @@ function WorkspaceMembersPage(props) { const isOfflineAndNoMemberDataAvailable = _.isEmpty(props.policyMembers) && props.network.isOffline; const prevPersonalDetails = usePrevious(props.personalDetails); - console.log('POLICY', props.policy); - /** * Get filtered personalDetails list with current policyMembers * @param {Object} policyMembers From 9a9f8e2a8bf2dcff03cb169f8ef791e8d1b81f58 Mon Sep 17 00:00:00 2001 From: tienifr Date: Thu, 28 Dec 2023 16:31:14 +0700 Subject: [PATCH 147/583] show personal bank account option in wallet page --- src/pages/settings/Wallet/WalletPage/WalletPage.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/settings/Wallet/WalletPage/WalletPage.js b/src/pages/settings/Wallet/WalletPage/WalletPage.js index e0577930b73d..87c802ba98ea 100644 --- a/src/pages/settings/Wallet/WalletPage/WalletPage.js +++ b/src/pages/settings/Wallet/WalletPage/WalletPage.js @@ -542,6 +542,7 @@ function WalletPage({bankAccountList, cardList, fundList, isLoadingPaymentMethod }} onItemSelected={(method) => addPaymentMethodTypePressed(method)} anchorRef={addPaymentMethodAnchorRef} + shouldShowPersonalBankAccountOption /> ); From cd8c36caa0a48cde013436e83552295e632f0474 Mon Sep 17 00:00:00 2001 From: Alberto Date: Thu, 28 Dec 2023 11:23:24 +0100 Subject: [PATCH 148/583] unrevert --- src/CONST.ts | 3 + src/components/MoneyReportHeader.js | 28 +++++++- src/languages/en.ts | 5 ++ src/languages/es.ts | 5 ++ src/languages/types.ts | 3 + src/libs/OptionsListUtils.js | 2 +- src/libs/ReportUtils.ts | 48 ++++++++++++- src/libs/actions/IOU.js | 103 ++++++++++++++++++++++++++++ 8 files changed, 192 insertions(+), 5 deletions(-) diff --git a/src/CONST.ts b/src/CONST.ts index 34720adf8a21..9ed1b91a5903 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -595,6 +595,9 @@ const CONST = { }, }, }, + CANCEL_PAYMENT_REASONS: { + ADMIN: 'CANCEL_REASON_ADMIN', + }, ARCHIVE_REASON: { DEFAULT: 'default', ACCOUNT_CLOSED: 'accountClosed', diff --git a/src/components/MoneyReportHeader.js b/src/components/MoneyReportHeader.js index a559e876af18..535c1194229e 100644 --- a/src/components/MoneyReportHeader.js +++ b/src/components/MoneyReportHeader.js @@ -1,6 +1,6 @@ import lodashGet from 'lodash/get'; import PropTypes from 'prop-types'; -import React, {useMemo} from 'react'; +import React, {useCallback, useMemo, useState} from 'react'; import {View} from 'react-native'; import {withOnyx} from 'react-native-onyx'; import _ from 'underscore'; @@ -24,7 +24,9 @@ import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import Button from './Button'; +import ConfirmModal from './ConfirmModal'; import HeaderWithBackButton from './HeaderWithBackButton'; +import * as Expensicons from './Icon/Expensicons'; import MoneyReportHeaderStatusBar from './MoneyReportHeaderStatusBar'; import participantPropTypes from './participantPropTypes'; import SettlementButton from './SettlementButton'; @@ -89,6 +91,13 @@ function MoneyReportHeader({session, personalDetails, policy, chatReport, nextSt isPolicyAdmin && (isApproved || isManager) : isPolicyAdmin || (ReportUtils.isMoneyRequestReport(moneyRequestReport) && isManager); const isDraft = ReportUtils.isDraftExpenseReport(moneyRequestReport); + const [isConfirmModalVisible, setIsConfirmModalVisible] = useState(false); + + const cancelPayment = useCallback(() => { + IOU.cancelPayment(moneyRequestReport, chatReport); + setIsConfirmModalVisible(false); + }, [moneyRequestReport, chatReport]); + const shouldShowPayButton = useMemo( () => isPayer && !isDraft && !isSettled && !moneyRequestReport.isWaitingOnBankAccount && reimbursableTotal !== 0 && !ReportUtils.isArchivedRoom(chatReport), [isPayer, isDraft, isSettled, moneyRequestReport, reimbursableTotal, chatReport], @@ -109,6 +118,13 @@ function MoneyReportHeader({session, personalDetails, policy, chatReport, nextSt const isMoreContentShown = shouldShowNextStep || (shouldShowAnyButton && isSmallScreenWidth); const threeDotsMenuItems = [HeaderUtils.getPinMenuItem(moneyRequestReport)]; + if (isPayer && isSettled) { + threeDotsMenuItems.push({ + icon: Expensicons.Trashcan, + text: 'Cancel payment', + onSelected: () => setIsConfirmModalVisible(true), + }); + } if (!ReportUtils.isArchivedRoom(chatReport)) { threeDotsMenuItems.push({ icon: ZoomIcon, @@ -206,6 +222,16 @@ function MoneyReportHeader({session, personalDetails, policy, chatReport, nextSt )} + setIsConfirmModalVisible(false)} + prompt={translate('iou.cancelPaymentConfirmation')} + confirmText={translate('iou.cancelPayment')} + cancelText={translate('common.dismiss')} + danger + /> ); } diff --git a/src/languages/en.ts b/src/languages/en.ts index 3cdb7cf2bf98..2fd453e4ba48 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -2,6 +2,7 @@ import {CONST as COMMON_CONST} from 'expensify-common/lib/CONST'; import CONST from '@src/CONST'; import type { AddressLineParams, + AdminCanceledRequestParams, AlreadySignedInParams, AmountEachParams, ApprovedAmountParams, @@ -96,6 +97,7 @@ type AllCountries = Record; export default { common: { cancel: 'Cancel', + dismiss: 'Dismiss', yes: 'Yes', no: 'No', ok: 'OK', @@ -549,6 +551,8 @@ export default { requestMoney: 'Request money', sendMoney: 'Send money', pay: 'Pay', + cancelPayment: 'Cancel payment', + cancelPaymentConfirmation: 'Are you sure that you want to cancel this payment?', viewDetails: 'View details', pending: 'Pending', canceled: 'Canceled', @@ -585,6 +589,7 @@ export default { payerSettled: ({amount}: PayerSettledParams) => `paid ${amount}`, approvedAmount: ({amount}: ApprovedAmountParams) => `approved ${amount}`, waitingOnBankAccount: ({submitterDisplayName}: WaitingOnBankAccountParams) => `started settling up, payment is held until ${submitterDisplayName} adds a bank account`, + adminCanceledRequest: ({amount}: AdminCanceledRequestParams) => `The ${amount} payment has been cancelled by the admin.`, canceledRequest: ({amount, submitterDisplayName}: CanceledRequestParams) => `Canceled the ${amount} payment, because ${submitterDisplayName} did not enable their Expensify Wallet within 30 days`, settledAfterAddedBankAccount: ({submitterDisplayName, amount}: SettledAfterAddedBankAccountParams) => diff --git a/src/languages/es.ts b/src/languages/es.ts index d11211ca9325..8c21e9ccf6f5 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -1,6 +1,7 @@ import CONST from '@src/CONST'; import type { AddressLineParams, + AdminCanceledRequestParams, AlreadySignedInParams, AmountEachParams, ApprovedAmountParams, @@ -86,6 +87,7 @@ import type { export default { common: { cancel: 'Cancelar', + dismiss: 'Descartar', yes: 'Sí', no: 'No', ok: 'OK', @@ -542,6 +544,8 @@ export default { requestMoney: 'Pedir dinero', sendMoney: 'Enviar dinero', pay: 'Pagar', + cancelPayment: 'Cancelar el pago', + cancelPaymentConfirmation: '¿Estás seguro de que quieres cancelar este pago?', viewDetails: 'Ver detalles', pending: 'Pendiente', canceled: 'Canceló', @@ -578,6 +582,7 @@ export default { payerSettled: ({amount}: PayerSettledParams) => `pagó ${amount}`, approvedAmount: ({amount}: ApprovedAmountParams) => `aprobó ${amount}`, waitingOnBankAccount: ({submitterDisplayName}: WaitingOnBankAccountParams) => `inicio el pago, pero no se procesará hasta que ${submitterDisplayName} añada una cuenta bancaria`, + adminCanceledRequest: ({amount}: AdminCanceledRequestParams) => `El pago de ${amount} ha sido cancelado por el administrador.`, canceledRequest: ({amount, submitterDisplayName}: CanceledRequestParams) => `Canceló el pago ${amount}, porque ${submitterDisplayName} no habilitó su billetera Expensify en un plazo de 30 días.`, settledAfterAddedBankAccount: ({submitterDisplayName, amount}: SettledAfterAddedBankAccountParams) => diff --git a/src/languages/types.ts b/src/languages/types.ts index 8e72c700a9cc..1a4b833b4122 100644 --- a/src/languages/types.ts +++ b/src/languages/types.ts @@ -131,6 +131,8 @@ type WaitingOnBankAccountParams = {submitterDisplayName: string}; type CanceledRequestParams = {amount: string; submitterDisplayName: string}; +type AdminCanceledRequestParams = {amount: string}; + type SettledAfterAddedBankAccountParams = {submitterDisplayName: string; amount: string}; type PaidElsewhereWithAmountParams = {payer: string; amount: string}; @@ -293,6 +295,7 @@ export type { PayerSettledParams, WaitingOnBankAccountParams, CanceledRequestParams, + AdminCanceledRequestParams, SettledAfterAddedBankAccountParams, PaidElsewhereWithAmountParams, PaidWithExpensifyWithAmountParams, diff --git a/src/libs/OptionsListUtils.js b/src/libs/OptionsListUtils.js index 6e84ef4dca27..1c2899f14c94 100644 --- a/src/libs/OptionsListUtils.js +++ b/src/libs/OptionsListUtils.js @@ -402,7 +402,7 @@ function getLastMessageTextForReport(report) { } else if (ReportActionUtils.isReimbursementQueuedAction(lastReportAction)) { lastMessageTextFromReport = ReportUtils.getReimbursementQueuedActionMessage(lastReportAction, report); } else if (ReportActionUtils.isReimbursementDeQueuedAction(lastReportAction)) { - lastMessageTextFromReport = ReportUtils.getReimbursementDeQueuedActionMessage(report); + lastMessageTextFromReport = ReportUtils.getReimbursementDeQueuedActionMessage(lastReportAction, report); } else if (ReportActionUtils.isDeletedParentAction(lastReportAction) && ReportUtils.isChatReport(report)) { lastMessageTextFromReport = ReportUtils.getDeletedParentActionMessageForChatReport(lastReportAction); } else if (ReportUtils.isReportMessageAttachment({text: report.lastMessageText, html: report.lastMessageHtml, translationKey: report.lastMessageTranslationKey})) { diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 81bbf1df6273..331fc03990bb 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -15,7 +15,7 @@ import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import {Beta, Login, PersonalDetails, PersonalDetailsList, Policy, Report, ReportAction, Session, Transaction} from '@src/types/onyx'; import {Errors, Icon, PendingAction} from '@src/types/onyx/OnyxCommon'; -import {IOUMessage, OriginalMessageActionName, OriginalMessageCreated} from '@src/types/onyx/OriginalMessage'; +import {IOUMessage, OriginalMessageActionName, OriginalMessageCreated, ReimbursementDeQueuedMessage} from '@src/types/onyx/OriginalMessage'; import {NotificationPreference} from '@src/types/onyx/Report'; import {Message, ReportActionBase, ReportActions} from '@src/types/onyx/ReportAction'; import {Receipt, WaypointCollection} from '@src/types/onyx/Transaction'; @@ -176,6 +176,11 @@ type OptimisticSubmittedReportAction = Pick< 'actionName' | 'actorAccountID' | 'automatic' | 'avatar' | 'isAttachment' | 'originalMessage' | 'message' | 'person' | 'reportActionID' | 'shouldShow' | 'created' | 'pendingAction' >; +type OptimisticCancelPaymentReportAction = Pick< + ReportAction, + 'actionName' | 'actorAccountID' | 'message' | 'originalMessage' | 'person' | 'reportActionID' | 'shouldShow' | 'created' | 'pendingAction' + >; + type OptimisticEditedTaskReportAction = Pick< ReportAction, 'reportActionID' | 'actionName' | 'pendingAction' | 'actorAccountID' | 'automatic' | 'avatar' | 'created' | 'shouldShow' | 'message' | 'person' @@ -1535,9 +1540,13 @@ function getReimbursementQueuedActionMessage(reportAction: OnyxEntry): string { +function getReimbursementDeQueuedActionMessage(reportAction: OnyxEntry, report: OnyxEntry): string { + const amount = CurrencyUtils.convertToDisplayString(Math.abs(report?.total ?? 0), report?.currency); + const originalMessage = reportAction?.originalMessage as ReimbursementDeQueuedMessage | undefined; + if (originalMessage?.cancellationReason === CONST.REPORT.CANCEL_PAYMENT_REASONS.ADMIN) { + return Localize.translateLocal('iou.adminCanceledRequest', {amount}); + } const submitterDisplayName = getDisplayNameForParticipant(report?.ownerAccountID, true) ?? ''; - const amount = CurrencyUtils.convertToDisplayString(report?.total ?? 0, report?.currency); return Localize.translateLocal('iou.canceledRequest', {submitterDisplayName, amount}); } @@ -2787,6 +2796,38 @@ function buildOptimisticSubmittedReportAction(amount: number, currency: string, }; } +/** + * Builds an optimistic REIMBURSEMENTDEQUEUED report action with a randomly generated reportActionID. + * + */ +function buildOptimisticCancelPaymentReportAction(): OptimisticCancelPaymentReportAction { + return { + actionName: CONST.REPORT.ACTIONS.TYPE.REIMBURSEMENTDEQUEUED, + actorAccountID: currentUserAccountID, + message: [ + { + cancellationReason: CONST.REPORT.CANCEL_PAYMENT_REASONS.ADMIN, + type: CONST.REPORT.MESSAGE.TYPE.COMMENT, + text: '', + }, + ], + originalMessage: { + cancellationReason: CONST.REPORT.CANCEL_PAYMENT_REASONS.ADMIN, + }, + person: [ + { + style: 'strong', + text: currentUserPersonalDetails?.displayName ?? currentUserEmail, + type: 'TEXT', + }, + ], + reportActionID: NumberUtils.rand64(), + shouldShow: true, + created: DateUtils.getDBTime(), + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + }; +} + /** * Builds an optimistic report preview action with a randomly generated reportActionID. * @@ -4271,6 +4312,7 @@ export { buildOptimisticIOUReportAction, buildOptimisticReportPreview, buildOptimisticModifiedExpenseReportAction, + buildOptimisticCancelPaymentReportAction, updateReportPreview, buildOptimisticTaskReportAction, buildOptimisticAddCommentReportAction, diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index d43fefca20bc..add8bded5e25 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -3114,6 +3114,108 @@ function submitReport(expenseReport) { ); } +/** + * @param {Object} expenseReport + * @param {Object} chatReport + */ +function cancelPayment(expenseReport, chatReport) { + const optimisticReportAction = ReportUtils.buildOptimisticCancelPaymentReportAction(); + const policy = ReportUtils.getPolicy(chatReport.policyID); + const isFree = policy && policy.type === CONST.POLICY.TYPE.FREE; + const optimisticData = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport.reportID}`, + value: { + [optimisticReportAction.reportActionID]: { + ...optimisticReportAction, + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + }, + }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${expenseReport.reportID}`, + value: { + ...expenseReport, + lastMessageText: lodashGet(optimisticReportAction, 'message.0.text', ''), + lastMessageHtml: lodashGet(optimisticReportAction, 'message.0.html', ''), + state: isFree ? CONST.REPORT.STATE.SUBMITTED : CONST.REPORT.STATE.OPEN, + stateNum: isFree ? CONST.REPORT.STATE_NUM.PROCESSING : CONST.REPORT.STATE.OPEN, + statusNum: isFree ? CONST.REPORT.STATUS.SUBMITTED : CONST.REPORT.STATE.OPEN, + }, + }, + ...(chatReport.reportID + ? [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${chatReport.reportID}`, + value: { + ...chatReport, + hasOutstandingIOU: true, + hasOutstandingChildRequest: true, + iouReportID: expenseReport.reportID, + }, + }, + ] + : []), + ]; + + const successData = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport.reportID}`, + value: { + [optimisticReportAction.reportActionID]: { + pendingAction: null, + }, + }, + }, + ]; + + const failureData = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport.reportID}`, + value: { + [expenseReport.reportActionID]: { + errors: ErrorUtils.getMicroSecondOnyxError('iou.error.other'), + }, + }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${expenseReport.reportID}`, + value: { + statusNum: CONST.REPORT.STATUS.REIMBURSED, + }, + }, + ...(chatReport.reportID + ? [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${chatReport.reportID}`, + value: { + hasOutstandingIOU: false, + hasOutstandingChildRequest: false, + iouReportID: 0, + }, + }, + ] + : []), + ]; + + API.write( + 'CancelPayment', + { + reportID: expenseReport.reportID, + managerAccountID: expenseReport.managerID, + reportActionID: optimisticReportAction.reportActionID, + }, + {optimisticData, successData, failureData}, + ); +} + /** * @param {String} paymentType * @param {Object} chatReport @@ -3431,4 +3533,5 @@ export { detachReceipt, getIOUReportID, editMoneyRequest, + cancelPayment, }; From 05f0e3db60f3a7851eefbbd6131d27f8dc9a5f2b Mon Sep 17 00:00:00 2001 From: Alberto Date: Thu, 28 Dec 2023 11:28:42 +0100 Subject: [PATCH 149/583] a couple extra files --- src/pages/home/report/ReportActionItem.js | 5 +---- src/types/onyx/OriginalMessage.ts | 6 ++++++ src/types/onyx/ReportAction.ts | 6 +++++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/pages/home/report/ReportActionItem.js b/src/pages/home/report/ReportActionItem.js index 57627d819197..763c6610fb14 100644 --- a/src/pages/home/report/ReportActionItem.js +++ b/src/pages/home/report/ReportActionItem.js @@ -422,10 +422,7 @@ function ReportActionItem(props) { ); } else if (props.action.actionName === CONST.REPORT.ACTIONS.TYPE.REIMBURSEMENTDEQUEUED) { - const submitterDisplayName = PersonalDetailsUtils.getDisplayNameOrDefault(lodashGet(personalDetails, [props.report.ownerAccountID, 'displayName'])); - const amount = CurrencyUtils.convertToDisplayString(props.report.total, props.report.currency); - - children = ; + children = ; } else if (props.action.actionName === CONST.REPORT.ACTIONS.TYPE.MODIFIEDEXPENSE) { children = ; } else { diff --git a/src/types/onyx/OriginalMessage.ts b/src/types/onyx/OriginalMessage.ts index 767f724dd571..5ed696a9019b 100644 --- a/src/types/onyx/OriginalMessage.ts +++ b/src/types/onyx/OriginalMessage.ts @@ -43,10 +43,15 @@ type IOUMessage = { participantAccountIDs?: number[]; type: ValueOf; paymentType?: DeepValueOf; + cancellationReason?: string; /** Only exists when we are sending money */ IOUDetails?: IOUDetails; }; +type ReimbursementDeQueuedMessage = { + cancellationReason: string; +}; + type OriginalMessageIOU = { actionName: typeof CONST.REPORT.ACTIONS.TYPE.IOU; originalMessage: IOUMessage; @@ -260,6 +265,7 @@ export type { Reaction, ActionName, IOUMessage, + ReimbursementDeQueuedMessage, Closed, OriginalMessageActionName, ChangeLog, diff --git a/src/types/onyx/ReportAction.ts b/src/types/onyx/ReportAction.ts index a881b63fbb95..02adc8ae0b95 100644 --- a/src/types/onyx/ReportAction.ts +++ b/src/types/onyx/ReportAction.ts @@ -51,9 +51,13 @@ type Message = { translationKey?: string; /** ID of a task report */ - taskReportID?: string; + taskReportID?: string + + /** Reason pf payment cancellation */ + cancellationReason?: string; }; + type ImageMetadata = { /** The height of the image. */ height?: number; From 47426208214aff0536fc61aa49824a8b188fbc50 Mon Sep 17 00:00:00 2001 From: Alberto Date: Thu, 28 Dec 2023 11:58:40 +0100 Subject: [PATCH 150/583] only allow in expense reports --- src/components/MoneyReportHeader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MoneyReportHeader.js b/src/components/MoneyReportHeader.js index 535c1194229e..ce749a027704 100644 --- a/src/components/MoneyReportHeader.js +++ b/src/components/MoneyReportHeader.js @@ -118,7 +118,7 @@ function MoneyReportHeader({session, personalDetails, policy, chatReport, nextSt const isMoreContentShown = shouldShowNextStep || (shouldShowAnyButton && isSmallScreenWidth); const threeDotsMenuItems = [HeaderUtils.getPinMenuItem(moneyRequestReport)]; - if (isPayer && isSettled) { + if (isPayer && isSettled && ReportUtils.isExpenseReport(moneyRequestReport)) { threeDotsMenuItems.push({ icon: Expensicons.Trashcan, text: 'Cancel payment', From 7938b48578af86a45708cce82d95fc7d9c8c6a9d Mon Sep 17 00:00:00 2001 From: Abhas Kumar Date: Thu, 28 Dec 2023 17:40:29 +0530 Subject: [PATCH 151/583] remove nullish coalescing to replace || --- src/components/MoneyReportHeader.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MoneyReportHeader.tsx b/src/components/MoneyReportHeader.tsx index b471470a24d5..666700aa18df 100644 --- a/src/components/MoneyReportHeader.tsx +++ b/src/components/MoneyReportHeader.tsx @@ -78,7 +78,7 @@ function MoneyReportHeader({session, personalDetails, policy, chatReport, nextSt const shouldShowAnyButton = shouldShowSettlementButton || shouldShowApproveButton || shouldShowSubmitButton || shouldShowNextStep; const bankAccountRoute = ReportUtils.getBankAccountRoute(chatReport); const formattedAmount = CurrencyUtils.convertToDisplayString(reimbursableTotal, moneyRequestReport.currency); - const isMoreContentShown = shouldShowNextStep ?? (shouldShowAnyButton && isSmallScreenWidth); + const isMoreContentShown = shouldShowNextStep || (shouldShowAnyButton && isSmallScreenWidth); const threeDotsMenuItems = [HeaderUtils.getPinMenuItem(moneyRequestReport)]; if (!ReportUtils.isArchivedRoom(chatReport)) { From d267f1b5387979594fc0f9a057f551eed7d73b16 Mon Sep 17 00:00:00 2001 From: Abhas Kumar Date: Thu, 28 Dec 2023 20:13:47 +0530 Subject: [PATCH 152/583] improve ts-expect-error comments --- src/components/MoneyReportHeader.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/MoneyReportHeader.tsx b/src/components/MoneyReportHeader.tsx index 666700aa18df..1cf526ca8cf4 100644 --- a/src/components/MoneyReportHeader.tsx +++ b/src/components/MoneyReportHeader.tsx @@ -100,12 +100,12 @@ function MoneyReportHeader({session, personalDetails, policy, chatReport, nextSt return ( - {/* @ts-expect-error TODO:#25120 types should be defined for component */} + {/* @ts-expect-error TODO: Remove this once HeaderWithBackButton (https://github.com/Expensify/App/issues/25120) is migrated to TypeScript. */} ) => IOU.payMoneyRequest(paymentType, chatReport, moneyRequestReport)} enablePaymentsRoute={ROUTES.ENABLE_PAYMENTS} addBankAccountRoute={bankAccountRoute} @@ -152,12 +152,12 @@ function MoneyReportHeader({session, personalDetails, policy, chatReport, nextSt {shouldShowSettlementButton && isSmallScreenWidth && ( ) => IOU.payMoneyRequest(paymentType, chatReport, moneyRequestReport)} enablePaymentsRoute={ROUTES.ENABLE_PAYMENTS} addBankAccountRoute={bankAccountRoute} From 007def15e9a6172e54b264dbe0963d42eb607d6e Mon Sep 17 00:00:00 2001 From: Abhas Kumar Date: Thu, 28 Dec 2023 20:17:14 +0530 Subject: [PATCH 153/583] define and use PaymentType --- src/components/MoneyReportHeader.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/MoneyReportHeader.tsx b/src/components/MoneyReportHeader.tsx index 1cf526ca8cf4..9b323f33c907 100644 --- a/src/components/MoneyReportHeader.tsx +++ b/src/components/MoneyReportHeader.tsx @@ -23,6 +23,8 @@ import HeaderWithBackButton from './HeaderWithBackButton'; import MoneyReportHeaderStatusBar from './MoneyReportHeaderStatusBar'; import SettlementButton from './SettlementButton'; +type PaymentType = DeepValueOf; + type MoneyReportHeaderOnyxProps = { /** The chat report this report is linked to */ chatReport: OnyxEntry; @@ -126,7 +128,7 @@ function MoneyReportHeader({session, personalDetails, policy, chatReport, nextSt chatReportID={chatReport?.reportID} iouReport={moneyRequestReport} // @ts-expect-error TODO: Remove this once IOU (https://github.com/Expensify/App/issues/24926) is migrated to TypeScript. - onPress={(paymentType: DeepValueOf) => IOU.payMoneyRequest(paymentType, chatReport, moneyRequestReport)} + onPress={(paymentType: PaymentType) => IOU.payMoneyRequest(paymentType, chatReport, moneyRequestReport)} enablePaymentsRoute={ROUTES.ENABLE_PAYMENTS} addBankAccountRoute={bankAccountRoute} shouldHidePaymentOptions={!shouldShowPayButton} @@ -158,7 +160,7 @@ function MoneyReportHeader({session, personalDetails, policy, chatReport, nextSt chatReportID={moneyRequestReport.chatReportID} iouReport={moneyRequestReport} // @ts-expect-error TODO: Remove this once IOU (https://github.com/Expensify/App/issues/24926) is migrated to TypeScript. - onPress={(paymentType: DeepValueOf) => IOU.payMoneyRequest(paymentType, chatReport, moneyRequestReport)} + onPress={(paymentType: PaymentType) => IOU.payMoneyRequest(paymentType, chatReport, moneyRequestReport)} enablePaymentsRoute={ROUTES.ENABLE_PAYMENTS} addBankAccountRoute={bankAccountRoute} shouldHidePaymentOptions={!shouldShowPayButton} From 3fac3e942916ca7c601e6f0548ca22ca4333da76 Mon Sep 17 00:00:00 2001 From: Abhas Kumar Date: Thu, 28 Dec 2023 20:21:46 +0530 Subject: [PATCH 154/583] keep Session and import all types as OnyxTypes --- src/components/MoneyReportHeader.tsx | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/components/MoneyReportHeader.tsx b/src/components/MoneyReportHeader.tsx index 9b323f33c907..5a0a310207f0 100644 --- a/src/components/MoneyReportHeader.tsx +++ b/src/components/MoneyReportHeader.tsx @@ -12,11 +12,11 @@ import Navigation from '@libs/Navigation/Navigation'; import * as ReportUtils from '@libs/ReportUtils'; import * as IOU from '@userActions/IOU'; import * as Link from '@userActions/Link'; -import * as UserSession from '@userActions/Session'; +import * as Session from '@userActions/Session'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; -import type {PersonalDetails, Policy, Report, ReportNextStep, Session} from '@src/types/onyx'; +import * as OnyxTypes from '@src/types/onyx'; import DeepValueOf from '@src/types/utils/DeepValueOf'; import Button from './Button'; import HeaderWithBackButton from './HeaderWithBackButton'; @@ -27,24 +27,24 @@ type PaymentType = DeepValueOf; type MoneyReportHeaderOnyxProps = { /** The chat report this report is linked to */ - chatReport: OnyxEntry; + chatReport: OnyxEntry; /** The next step for the report */ - nextStep: OnyxEntry; + nextStep: OnyxEntry; - /** UserSession info for the currently logged in user. */ - session: OnyxEntry; + /** Session info for the currently logged in user. */ + session: OnyxEntry; }; type MoneyReportHeaderProps = MoneyReportHeaderOnyxProps & { /** The report currently being looked at */ - report: Report; + report: OnyxTypes.Report; /** The policy tied to the money request report */ - policy: Policy; + policy: OnyxTypes.Policy; /** Personal details so we can get the ones for the report participants */ - personalDetails: PersonalDetails; + personalDetails: OnyxTypes.PersonalDetailsList; }; function MoneyReportHeader({session, personalDetails, policy, chatReport, nextStep, report: moneyRequestReport}: MoneyReportHeaderProps) { @@ -87,14 +87,14 @@ function MoneyReportHeader({session, personalDetails, policy, chatReport, nextSt threeDotsMenuItems.push({ icon: ZoomIcon, text: translate('videoChatButtonAndMenu.zoom'), - onSelected: UserSession.checkIfActionIsAllowed(() => { + onSelected: Session.checkIfActionIsAllowed(() => { Link.openExternalLink(CONST.NEW_ZOOM_MEETING_URL); }), }); threeDotsMenuItems.push({ icon: GoogleMeetIcon, text: translate('videoChatButtonAndMenu.googleMeet'), - onSelected: UserSession.checkIfActionIsAllowed(() => { + onSelected: Session.checkIfActionIsAllowed(() => { Link.openExternalLink(CONST.NEW_GOOGLE_MEET_MEETING_URL); }), }); From 7b67f02ec496bce8075bb50f5bf703fc5daa12ac Mon Sep 17 00:00:00 2001 From: Blazej Kustra Date: Thu, 28 Dec 2023 17:23:47 +0100 Subject: [PATCH 155/583] Change ContextMenu extenstions --- .../BaseReportActionContextMenu.js | 204 ----------------- .../BaseReportActionContextMenu.tsx | 208 ++++++++++++++++++ ...tMenuActions.js => ContextMenuActions.tsx} | 9 - .../{index.native.js => index.native.tsx} | 0 .../{index.js => index.tsx} | 0 ....js => PopoverReportActionContextMenu.tsx} | 0 ...extMenu.js => ReportActionContextMenu.tsx} | 0 ...enericReportActionContextMenuPropTypes.ts} | 0 src/pages/home/report/ContextMenu/types.ts | 33 +++ 9 files changed, 241 insertions(+), 213 deletions(-) delete mode 100755 src/pages/home/report/ContextMenu/BaseReportActionContextMenu.js create mode 100755 src/pages/home/report/ContextMenu/BaseReportActionContextMenu.tsx rename src/pages/home/report/ContextMenu/{ContextMenuActions.js => ContextMenuActions.tsx} (99%) rename src/pages/home/report/ContextMenu/MiniReportActionContextMenu/{index.native.js => index.native.tsx} (100%) rename src/pages/home/report/ContextMenu/MiniReportActionContextMenu/{index.js => index.tsx} (100%) rename src/pages/home/report/ContextMenu/{PopoverReportActionContextMenu.js => PopoverReportActionContextMenu.tsx} (100%) rename src/pages/home/report/ContextMenu/{ReportActionContextMenu.js => ReportActionContextMenu.tsx} (100%) rename src/pages/home/report/ContextMenu/{genericReportActionContextMenuPropTypes.js => genericReportActionContextMenuPropTypes.ts} (100%) create mode 100644 src/pages/home/report/ContextMenu/types.ts diff --git a/src/pages/home/report/ContextMenu/BaseReportActionContextMenu.js b/src/pages/home/report/ContextMenu/BaseReportActionContextMenu.js deleted file mode 100755 index 33adfa4b35f9..000000000000 --- a/src/pages/home/report/ContextMenu/BaseReportActionContextMenu.js +++ /dev/null @@ -1,204 +0,0 @@ -import lodashGet from 'lodash/get'; -import PropTypes from 'prop-types'; -import React, {memo, useMemo, useRef, useState} from 'react'; -import {InteractionManager, View} from 'react-native'; -import {withOnyx} from 'react-native-onyx'; -import _ from 'underscore'; -import ContextMenuItem from '@components/ContextMenuItem'; -import {withBetas} from '@components/OnyxProvider'; -import withLocalize, {withLocalizePropTypes} from '@components/withLocalize'; -import withWindowDimensions, {windowDimensionsPropTypes} from '@components/withWindowDimensions'; -import useArrowKeyFocusManager from '@hooks/useArrowKeyFocusManager'; -import useKeyboardShortcut from '@hooks/useKeyboardShortcut'; -import useNetwork from '@hooks/useNetwork'; -import compose from '@libs/compose'; -import useStyleUtils from '@styles/useStyleUtils'; -import * as Session from '@userActions/Session'; -import CONST from '@src/CONST'; -import ONYXKEYS from '@src/ONYXKEYS'; -import ContextMenuActions, {CONTEXT_MENU_TYPES} from './ContextMenuActions'; -import {defaultProps as GenericReportActionContextMenuDefaultProps, propTypes as genericReportActionContextMenuPropTypes} from './genericReportActionContextMenuPropTypes'; -import {hideContextMenu} from './ReportActionContextMenu'; - -const propTypes = { - /** String representing the context menu type [LINK, REPORT_ACTION] which controls context menu choices */ - type: PropTypes.string, - - /** Target node which is the target of ContentMenu */ - anchor: PropTypes.oneOfType([PropTypes.node, PropTypes.object]), - - /** Flag to check if the chat participant is Chronos */ - isChronosReport: PropTypes.bool, - - /** Whether the provided report is an archived room */ - isArchivedRoom: PropTypes.bool, - - contentRef: PropTypes.oneOfType([PropTypes.node, PropTypes.object, PropTypes.func]), - - ...genericReportActionContextMenuPropTypes, - ...withLocalizePropTypes, - ...windowDimensionsPropTypes, -}; - -const defaultProps = { - type: CONTEXT_MENU_TYPES.REPORT_ACTION, - anchor: null, - contentRef: null, - isChronosReport: false, - isArchivedRoom: false, - ...GenericReportActionContextMenuDefaultProps, -}; -function BaseReportActionContextMenu(props) { - const StyleUtils = useStyleUtils(); - const menuItemRefs = useRef({}); - const [shouldKeepOpen, setShouldKeepOpen] = useState(false); - const wrapperStyle = StyleUtils.getReportActionContextMenuStyles(props.isMini, props.isSmallScreenWidth); - const {isOffline} = useNetwork(); - - const reportAction = useMemo(() => { - if (_.isEmpty(props.reportActions) || props.reportActionID === '0') { - return {}; - } - return props.reportActions[props.reportActionID] || {}; - }, [props.reportActions, props.reportActionID]); - - const shouldShowFilter = (contextAction) => - contextAction.shouldShow( - props.type, - reportAction, - props.isArchivedRoom, - props.betas, - props.anchor, - props.isChronosReport, - props.reportID, - props.isPinnedChat, - props.isUnreadChat, - isOffline, - ); - - const shouldEnableArrowNavigation = !props.isMini && (props.isVisible || shouldKeepOpen); - const filteredContextMenuActions = _.filter(ContextMenuActions, shouldShowFilter); - - // Context menu actions that are not rendered as menu items are excluded from arrow navigation - const nonMenuItemActionIndexes = _.map(filteredContextMenuActions, (contextAction, index) => (_.isFunction(contextAction.renderContent) ? index : undefined)); - const disabledIndexes = _.filter(nonMenuItemActionIndexes, (index) => !_.isUndefined(index)); - - const [focusedIndex, setFocusedIndex] = useArrowKeyFocusManager({ - initialFocusedIndex: -1, - disabledIndexes, - maxIndex: filteredContextMenuActions.length - 1, - isActive: shouldEnableArrowNavigation, - }); - - /** - * Checks if user is anonymous. If true and the action doesn't accept for anonymous user, hides the context menu and - * shows the sign in modal. Else, executes the callback. - * - * @param {Function} callback - * @param {Boolean} isAnonymousAction - */ - const interceptAnonymousUser = (callback, isAnonymousAction = false) => { - if (Session.isAnonymousUser() && !isAnonymousAction) { - hideContextMenu(false); - - InteractionManager.runAfterInteractions(() => { - Session.signOutAndRedirectToSignIn(); - }); - } else { - callback(); - } - }; - - useKeyboardShortcut( - CONST.KEYBOARD_SHORTCUTS.ENTER, - (event) => { - if (!menuItemRefs.current[focusedIndex]) { - return; - } - - // Ensures the event does not cause side-effects beyond the context menu, e.g. when an outside element is focused - if (event) { - event.stopPropagation(); - } - - menuItemRefs.current[focusedIndex].triggerPressAndUpdateSuccess(); - setFocusedIndex(-1); - }, - {isActive: shouldEnableArrowNavigation}, - ); - - return ( - (props.isVisible || shouldKeepOpen) && ( - - {_.map(filteredContextMenuActions, (contextAction, index) => { - const closePopup = !props.isMini; - const payload = { - reportAction, - reportID: props.reportID, - draftMessage: props.draftMessage, - selection: props.selection, - close: () => setShouldKeepOpen(false), - openContextMenu: () => setShouldKeepOpen(true), - interceptAnonymousUser, - }; - - if (contextAction.renderContent) { - // make sure that renderContent isn't mixed with unsupported props - if (__DEV__ && (contextAction.text != null || contextAction.icon != null)) { - throw new Error('Dev error: renderContent() and text/icon cannot be used together.'); - } - - return contextAction.renderContent(closePopup, payload); - } - - return ( - { - menuItemRefs.current[index] = ref; - }} - icon={contextAction.icon} - text={props.translate(contextAction.textTranslateKey, {action: reportAction})} - successIcon={contextAction.successIcon} - successText={contextAction.successTextTranslateKey ? props.translate(contextAction.successTextTranslateKey) : undefined} - isMini={props.isMini} - key={contextAction.textTranslateKey} - onPress={() => interceptAnonymousUser(() => contextAction.onPress(closePopup, payload), contextAction.isAnonymousAction)} - description={contextAction.getDescription(props.selection, props.isSmallScreenWidth)} - isAnonymousAction={contextAction.isAnonymousAction} - isFocused={focusedIndex === index} - /> - ); - })} - - ) - ); -} - -BaseReportActionContextMenu.propTypes = propTypes; -BaseReportActionContextMenu.defaultProps = defaultProps; - -export default compose( - withLocalize, - withBetas(), - withWindowDimensions, - withOnyx({ - reportActions: { - key: ({originalReportID}) => `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${originalReportID}`, - canEvict: false, - }, - }), -)( - memo(BaseReportActionContextMenu, (prevProps, nextProps) => { - const prevReportAction = lodashGet(prevProps.reportActions, prevProps.reportActionID, ''); - const nextReportAction = lodashGet(nextProps.reportActions, nextProps.reportActionID, ''); - - // We only want to re-render when the report action that is attached to is changed - if (prevReportAction !== nextReportAction) { - return false; - } - return _.isEqual(_.omit(prevProps, 'reportActions'), _.omit(nextProps, 'reportActions')); - }), -); diff --git a/src/pages/home/report/ContextMenu/BaseReportActionContextMenu.tsx b/src/pages/home/report/ContextMenu/BaseReportActionContextMenu.tsx new file mode 100755 index 000000000000..3639c9349549 --- /dev/null +++ b/src/pages/home/report/ContextMenu/BaseReportActionContextMenu.tsx @@ -0,0 +1,208 @@ +import lodashIsEqual from 'lodash/isEqual'; +import React, {memo, useMemo, useRef, useState} from 'react'; +import {InteractionManager, View} from 'react-native'; +import {OnyxEntry, withOnyx} from 'react-native-onyx'; +import {ValueOf} from 'type-fest'; +import ContextMenuItem from '@components/ContextMenuItem'; +import useArrowKeyFocusManager from '@hooks/useArrowKeyFocusManager'; +import useKeyboardShortcut from '@hooks/useKeyboardShortcut'; +import useLocalize from '@hooks/useLocalize'; +import useNetwork from '@hooks/useNetwork'; +import useWindowDimensions from '@hooks/useWindowDimensions'; +import useStyleUtils from '@styles/useStyleUtils'; +import * as Session from '@userActions/Session'; +import CONST from '@src/CONST'; +import ONYXKEYS from '@src/ONYXKEYS'; +import {Beta, ReportActions} from '@src/types/onyx'; +import ContextMenuActions from './ContextMenuActions'; +import {hideContextMenu} from './ReportActionContextMenu'; +import {CONTEXT_MENU_TYPES, GenericReportActionContextMenuProps} from './types'; + +type BaseReportActionContextMenuOnyxProps = { + /** Beta features list */ + betas: OnyxEntry; + + /** All of the actions of the report */ + reportActions: OnyxEntry; +}; + +type BaseReportActionContextMenuProps = GenericReportActionContextMenuProps & + BaseReportActionContextMenuOnyxProps & { + /** String representing the context menu type [LINK, REPORT_ACTION] which controls context menu choices */ + type?: ValueOf; + + /** Target node which is the target of ContentMenu */ + anchor: any; + + /** Flag to check if the chat participant is Chronos */ + isChronosReport: boolean; + + /** Whether the provided report is an archived room */ + isArchivedRoom: boolean; + + /** Flag to check if the chat is pinned in the LHN. Used for the Pin/Unpin action */ + isPinnedChat?: boolean; + + /** Flag to check if the chat is unread in the LHN. Used for the Mark as Read/Unread action */ + isUnreadChat?: boolean; + + /** Content Ref */ + contentRef: any; + }; + +function BaseReportActionContextMenu({ + type = CONTEXT_MENU_TYPES.REPORT_ACTION, + anchor = null, + contentRef = null, + isChronosReport = false, + isArchivedRoom = false, + isMini = false, + isVisible = false, + isPinnedChat = false, + isUnreadChat = false, + selection = '', + draftMessage = '', + reportActionID, + reportID, + betas, + reportActions, +}: BaseReportActionContextMenuProps) { + const StyleUtils = useStyleUtils(); + const {translate} = useLocalize(); + const {isSmallScreenWidth} = useWindowDimensions(); + const menuItemRefs = useRef void}>>({}); + const [shouldKeepOpen, setShouldKeepOpen] = useState(false); + const wrapperStyle = StyleUtils.getReportActionContextMenuStyles(isMini, isSmallScreenWidth); + const {isOffline} = useNetwork(); + + const reportAction = useMemo(() => { + if (_.isEmpty(reportActions) || reportActionID === '0') { + return {}; + } + return reportActions[reportActionID] || {}; + }, [reportActions, reportActionID]); + + const shouldEnableArrowNavigation = !isMini && (isVisible || shouldKeepOpen); + const filteredContextMenuActions = ContextMenuActions.filter((contextAction) => + contextAction.shouldShow(type, reportAction, isArchivedRoom, betas, anchor, isChronosReport, reportID, isPinnedChat, isUnreadChat, isOffline), + ); + + // Context menu actions that are not rendered as menu items are excluded from arrow navigation + const nonMenuItemActionIndexes = filteredContextMenuActions.map((contextAction, index) => (typeof contextAction.renderContent === 'function' ? index : undefined)); + const disabledIndexes = nonMenuItemActionIndexes.filter((index): index is number => index !== undefined); + + const [focusedIndex, setFocusedIndex] = useArrowKeyFocusManager({ + initialFocusedIndex: -1, + disabledIndexes, + maxIndex: filteredContextMenuActions.length - 1, + isActive: shouldEnableArrowNavigation, + }); + + /** + * Checks if user is anonymous. If true and the action doesn't accept for anonymous user, hides the context menu and + * shows the sign in modal. Else, executes the callback. + */ + const interceptAnonymousUser = (callback: () => void, isAnonymousAction = false) => { + if (Session.isAnonymousUser() && !isAnonymousAction) { + hideContextMenu(false); + + InteractionManager.runAfterInteractions(() => { + Session.signOutAndRedirectToSignIn(); + }); + } else { + callback(); + } + }; + + useKeyboardShortcut( + CONST.KEYBOARD_SHORTCUTS.ENTER, + (event) => { + if (!menuItemRefs.current[focusedIndex]) { + return; + } + + // Ensures the event does not cause side-effects beyond the context menu, e.g. when an outside element is focused + if (event) { + event.stopPropagation(); + } + + menuItemRefs.current[focusedIndex].triggerPressAndUpdateSuccess(); + setFocusedIndex(-1); + }, + {isActive: shouldEnableArrowNavigation}, + ); + + return ( + (isVisible || shouldKeepOpen) && ( + + {filteredContextMenuActions.map((contextAction, index) => { + const closePopup = !isMini; + const payload = { + reportAction, + reportID, + draftMessage, + selection, + close: () => setShouldKeepOpen(false), + openContextMenu: () => setShouldKeepOpen(true), + interceptAnonymousUser, + }; + + if (contextAction.renderContent) { + // make sure that renderContent isn't mixed with unsupported props + if (__DEV__ && (contextAction.text != null || contextAction.icon != null)) { + throw new Error('Dev error: renderContent() and text/icon cannot be used together.'); + } + + return contextAction.renderContent(closePopup, payload); + } + + return ( + { + menuItemRefs.current[index] = ref; + }} + icon={contextAction.icon} + text={translate(contextAction.textTranslateKey, {action: reportAction})} + successIcon={contextAction.successIcon} + successText={contextAction.successTextTranslateKey ? translate(contextAction.successTextTranslateKey) : undefined} + isMini={isMini} + key={contextAction.textTranslateKey} + onPress={() => interceptAnonymousUser(() => contextAction.onPress(closePopup, payload), contextAction.isAnonymousAction)} + description={contextAction.getDescription(selection, isSmallScreenWidth)} + isAnonymousAction={contextAction.isAnonymousAction} + isFocused={focusedIndex === index} + /> + ); + })} + + ) + ); +} + +export default withOnyx({ + betas: { + key: ONYXKEYS.BETAS, + }, + reportActions: { + key: ({originalReportID}) => `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${originalReportID}`, + canEvict: false, + }, +})( + memo(BaseReportActionContextMenu, (prevProps, nextProps) => { + const {reportActions: prevReportActions, ...prevPropsWithoutReportActions} = prevProps; + const {reportActions: nextReportActions, ...nextPropsWithoutReportActions} = nextProps; + + const prevReportAction = prevReportActions?.[prevProps.reportActionID] ?? ''; + const nextReportAction = nextReportActions?.[nextProps.reportActionID] ?? ''; + + // We only want to re-render when the report action that is attached to is changed + if (prevReportAction !== nextReportAction) { + return false; + } + + return lodashIsEqual(prevPropsWithoutReportActions, nextPropsWithoutReportActions); + }), +); diff --git a/src/pages/home/report/ContextMenu/ContextMenuActions.js b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx similarity index 99% rename from src/pages/home/report/ContextMenu/ContextMenuActions.js rename to src/pages/home/report/ContextMenu/ContextMenuActions.tsx index 2d9faa574ebb..dbd63516c525 100644 --- a/src/pages/home/report/ContextMenu/ContextMenuActions.js +++ b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx @@ -34,13 +34,6 @@ function getActionText(reportAction) { return lodashGet(message, 'html', ''); } -const CONTEXT_MENU_TYPES = { - LINK: 'LINK', - REPORT_ACTION: 'REPORT_ACTION', - EMAIL: 'EMAIL', - REPORT: 'REPORT', -}; - // A list of all the context actions in this menu. export default [ { @@ -468,5 +461,3 @@ export default [ getDescription: () => {}, }, ]; - -export {CONTEXT_MENU_TYPES}; diff --git a/src/pages/home/report/ContextMenu/MiniReportActionContextMenu/index.native.js b/src/pages/home/report/ContextMenu/MiniReportActionContextMenu/index.native.tsx similarity index 100% rename from src/pages/home/report/ContextMenu/MiniReportActionContextMenu/index.native.js rename to src/pages/home/report/ContextMenu/MiniReportActionContextMenu/index.native.tsx diff --git a/src/pages/home/report/ContextMenu/MiniReportActionContextMenu/index.js b/src/pages/home/report/ContextMenu/MiniReportActionContextMenu/index.tsx similarity index 100% rename from src/pages/home/report/ContextMenu/MiniReportActionContextMenu/index.js rename to src/pages/home/report/ContextMenu/MiniReportActionContextMenu/index.tsx diff --git a/src/pages/home/report/ContextMenu/PopoverReportActionContextMenu.js b/src/pages/home/report/ContextMenu/PopoverReportActionContextMenu.tsx similarity index 100% rename from src/pages/home/report/ContextMenu/PopoverReportActionContextMenu.js rename to src/pages/home/report/ContextMenu/PopoverReportActionContextMenu.tsx diff --git a/src/pages/home/report/ContextMenu/ReportActionContextMenu.js b/src/pages/home/report/ContextMenu/ReportActionContextMenu.tsx similarity index 100% rename from src/pages/home/report/ContextMenu/ReportActionContextMenu.js rename to src/pages/home/report/ContextMenu/ReportActionContextMenu.tsx diff --git a/src/pages/home/report/ContextMenu/genericReportActionContextMenuPropTypes.js b/src/pages/home/report/ContextMenu/genericReportActionContextMenuPropTypes.ts similarity index 100% rename from src/pages/home/report/ContextMenu/genericReportActionContextMenuPropTypes.js rename to src/pages/home/report/ContextMenu/genericReportActionContextMenuPropTypes.ts diff --git a/src/pages/home/report/ContextMenu/types.ts b/src/pages/home/report/ContextMenu/types.ts new file mode 100644 index 000000000000..051e7635bc80 --- /dev/null +++ b/src/pages/home/report/ContextMenu/types.ts @@ -0,0 +1,33 @@ +const CONTEXT_MENU_TYPES = { + LINK: 'LINK', + REPORT_ACTION: 'REPORT_ACTION', + EMAIL: 'EMAIL', + REPORT: 'REPORT', +} as const; + +type GenericReportActionContextMenuProps = { + /** The ID of the report this report action is attached to. */ + reportID: string; + + /** The ID of the report action this context menu is attached to. */ + reportActionID: string; + + /** The ID of the original report from which the given reportAction is first created. */ + originalReportID: string; + + /** If true, this component will be a small, row-oriented menu that displays icons but not text. + If false, this component will be a larger, column-oriented menu that displays icons alongside text in each row. */ + isMini?: boolean; + + /** Controls the visibility of this component. */ + isVisible?: boolean; + + /** The copy selection. */ + selection?: string; + + /** Draft message - if this is set the comment is in 'edit' mode */ + draftMessage?: string; +}; + +export {CONTEXT_MENU_TYPES}; +export type {GenericReportActionContextMenuProps}; From 44abb622fb39576c25a3bf12fd3ef0beb5c18777 Mon Sep 17 00:00:00 2001 From: Blazej Kustra Date: Thu, 28 Dec 2023 17:43:43 +0100 Subject: [PATCH 156/583] Migrate MiniReportActionContextMenu --- .../BaseReportActionContextMenu.tsx | 59 +++++--- .../index.native.tsx | 5 +- .../MiniReportActionContextMenu/index.tsx | 30 +--- .../MiniReportActionContextMenu/types.ts | 8 + .../ContextMenu/ReportActionContextMenu.tsx | 138 ------------------ ...genericReportActionContextMenuPropTypes.ts | 34 ----- src/pages/home/report/ContextMenu/types.ts | 8 - 7 files changed, 58 insertions(+), 224 deletions(-) create mode 100644 src/pages/home/report/ContextMenu/MiniReportActionContextMenu/types.ts delete mode 100644 src/pages/home/report/ContextMenu/ReportActionContextMenu.tsx delete mode 100644 src/pages/home/report/ContextMenu/genericReportActionContextMenuPropTypes.ts diff --git a/src/pages/home/report/ContextMenu/BaseReportActionContextMenu.tsx b/src/pages/home/report/ContextMenu/BaseReportActionContextMenu.tsx index 20012c15ef30..08d1e7a0c28a 100755 --- a/src/pages/home/report/ContextMenu/BaseReportActionContextMenu.tsx +++ b/src/pages/home/report/ContextMenu/BaseReportActionContextMenu.tsx @@ -16,7 +16,6 @@ import ONYXKEYS from '@src/ONYXKEYS'; import {Beta, ReportActions} from '@src/types/onyx'; import ContextMenuActions from './ContextMenuActions'; import {hideContextMenu} from './ReportActionContextMenu'; -import {GenericReportActionContextMenuProps} from './types'; type BaseReportActionContextMenuOnyxProps = { /** Beta features list */ @@ -26,29 +25,51 @@ type BaseReportActionContextMenuOnyxProps = { reportActions: OnyxEntry; }; -type BaseReportActionContextMenuProps = GenericReportActionContextMenuProps & - BaseReportActionContextMenuOnyxProps & { - /** String representing the context menu type [LINK, REPORT_ACTION] which controls context menu choices */ - type?: ValueOf; +type BaseReportActionContextMenuProps = BaseReportActionContextMenuOnyxProps & { + /** The ID of the report this report action is attached to. */ + reportID: string; - /** Target node which is the target of ContentMenu */ - anchor: any; + /** The ID of the report action this context menu is attached to. */ + reportActionID: string; - /** Flag to check if the chat participant is Chronos */ - isChronosReport: boolean; + /** The ID of the original report from which the given reportAction is first created. */ + // eslint-disable-next-line react/no-unused-prop-types + originalReportID: string; - /** Whether the provided report is an archived room */ - isArchivedRoom: boolean; + /** If true, this component will be a small, row-oriented menu that displays icons but not text. + If false, this component will be a larger, column-oriented menu that displays icons alongside text in each row. */ + isMini?: boolean; - /** Flag to check if the chat is pinned in the LHN. Used for the Pin/Unpin action */ - isPinnedChat?: boolean; + /** Controls the visibility of this component. */ + isVisible?: boolean; - /** Flag to check if the chat is unread in the LHN. Used for the Mark as Read/Unread action */ - isUnreadChat?: boolean; + /** The copy selection. */ + selection?: string; - /** Content Ref */ - contentRef: any; - }; + /** Draft message - if this is set the comment is in 'edit' mode */ + draftMessage?: string; + + /** String representing the context menu type [LINK, REPORT_ACTION] which controls context menu choices */ + type?: ValueOf; + + /** Target node which is the target of ContentMenu */ + anchor: any; + + /** Flag to check if the chat participant is Chronos */ + isChronosReport: boolean; + + /** Whether the provided report is an archived room */ + isArchivedRoom: boolean; + + /** Flag to check if the chat is pinned in the LHN. Used for the Pin/Unpin action */ + isPinnedChat?: boolean; + + /** Flag to check if the chat is unread in the LHN. Used for the Mark as Read/Unread action */ + isUnreadChat?: boolean; + + /** Content Ref */ + contentRef: any; +}; function BaseReportActionContextMenu({ type = CONST.CONTEXT_MENU_TYPES.REPORT_ACTION, @@ -206,3 +227,5 @@ export default withOnyx null; +import MiniReportActionContextMenuProps from './types'; + +// eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-unused-vars +export default (props: MiniReportActionContextMenuProps) => null; diff --git a/src/pages/home/report/ContextMenu/MiniReportActionContextMenu/index.tsx b/src/pages/home/report/ContextMenu/MiniReportActionContextMenu/index.tsx index d858206cdfc3..fbc6b90a3424 100644 --- a/src/pages/home/report/ContextMenu/MiniReportActionContextMenu/index.tsx +++ b/src/pages/home/report/ContextMenu/MiniReportActionContextMenu/index.tsx @@ -1,47 +1,27 @@ -import PropTypes from 'prop-types'; import React from 'react'; import {View} from 'react-native'; -import _ from 'underscore'; import useStyleUtils from '@hooks/useStyleUtils'; import BaseReportActionContextMenu from '@pages/home/report/ContextMenu/BaseReportActionContextMenu'; -import { - defaultProps as GenericReportActionContextMenuDefaultProps, - propTypes as genericReportActionContextMenuPropTypes, -} from '@pages/home/report/ContextMenu/genericReportActionContextMenuPropTypes'; import CONST from '@src/CONST'; +import MiniReportActionContextMenuProps from './types'; -const propTypes = { - ..._.omit(genericReportActionContextMenuPropTypes, ['isMini']), - - /** Should the reportAction this menu is attached to have the appearance of being - * grouped with the previous reportAction? */ - displayAsGroup: PropTypes.bool, -}; - -const defaultProps = { - ..._.omit(GenericReportActionContextMenuDefaultProps, ['isMini']), - displayAsGroup: false, -}; - -function MiniReportActionContextMenu(props) { +function MiniReportActionContextMenu({displayAsGroup = false, ...rest}: MiniReportActionContextMenuProps) { const StyleUtils = useStyleUtils(); return ( ); } -MiniReportActionContextMenu.propTypes = propTypes; -MiniReportActionContextMenu.defaultProps = defaultProps; MiniReportActionContextMenu.displayName = 'MiniReportActionContextMenu'; export default MiniReportActionContextMenu; diff --git a/src/pages/home/report/ContextMenu/MiniReportActionContextMenu/types.ts b/src/pages/home/report/ContextMenu/MiniReportActionContextMenu/types.ts new file mode 100644 index 000000000000..d28d70180819 --- /dev/null +++ b/src/pages/home/report/ContextMenu/MiniReportActionContextMenu/types.ts @@ -0,0 +1,8 @@ +import {BaseReportActionContextMenuProps} from '@pages/home/report/ContextMenu/BaseReportActionContextMenu'; + +type MiniReportActionContextMenuProps = BaseReportActionContextMenuProps & { + /** Should the reportAction this menu is attached to have the appearance of being grouped with the previous reportAction? */ + displayAsGroup?: boolean; +}; + +export default MiniReportActionContextMenuProps; diff --git a/src/pages/home/report/ContextMenu/ReportActionContextMenu.tsx b/src/pages/home/report/ContextMenu/ReportActionContextMenu.tsx deleted file mode 100644 index 9467ff19b2f5..000000000000 --- a/src/pages/home/report/ContextMenu/ReportActionContextMenu.tsx +++ /dev/null @@ -1,138 +0,0 @@ -import React from 'react'; - -const contextMenuRef = React.createRef(); - -/** - * Hide the ReportActionContextMenu modal popover. - * Hides the popover menu with an optional delay - * @param {Boolean} shouldDelay - whether the menu should close after a delay - * @param {Function} [onHideCallback=() => {}] - Callback to be called after Context Menu is completely hidden - */ -function hideContextMenu(shouldDelay, onHideCallback = () => {}) { - if (!contextMenuRef.current) { - return; - } - if (!shouldDelay) { - contextMenuRef.current.hideContextMenu(onHideCallback); - - return; - } - - // Save the active instanceID for which hide action was called. - // If menu is being closed with a delay, check that whether the same instance exists or a new was created. - // If instance is not same, cancel the hide action - const instanceID = contextMenuRef.current.instanceID; - setTimeout(() => { - if (contextMenuRef.current.instanceID !== instanceID) { - return; - } - - contextMenuRef.current.hideContextMenu(onHideCallback); - }, 800); -} - -/** - * Show the ReportActionContextMenu modal popover. - * - * @param {string} type - the context menu type to display [EMAIL, LINK, REPORT_ACTION, REPORT] - * @param {Object} [event] - A press event. - * @param {String} [selection] - Copied content. - * @param {Element} contextMenuAnchor - popoverAnchor - * @param {String} reportID - Active Report Id - * @param {String} reportActionID - ReportActionID for ContextMenu - * @param {String} originalReportID - The currrent Report Id of the reportAction - * @param {String} draftMessage - ReportAction Draftmessage - * @param {Function} [onShow=() => {}] - Run a callback when Menu is shown - * @param {Function} [onHide=() => {}] - Run a callback when Menu is hidden - * @param {Boolean} isArchivedRoom - Whether the provided report is an archived room - * @param {Boolean} isChronosReport - Flag to check if the chat participant is Chronos - * @param {Boolean} isPinnedChat - Flag to check if the chat is pinned in the LHN. Used for the Pin/Unpin action - * @param {Boolean} isUnreadChat - Flag to check if the chat has unread messages in the LHN. Used for the Mark as Read/Unread action - */ -function showContextMenu( - type, - event, - selection, - contextMenuAnchor, - reportID = '0', - reportActionID = '0', - originalReportID = '0', - draftMessage = '', - onShow = () => {}, - onHide = () => {}, - isArchivedRoom = false, - isChronosReport = false, - isPinnedChat = false, - isUnreadChat = false, -) { - if (!contextMenuRef.current) { - return; - } - // If there is an already open context menu, close it first before opening - // a new one. - if (contextMenuRef.current.instanceID) { - hideContextMenu(); - contextMenuRef.current.runAndResetOnPopoverHide(); - } - - contextMenuRef.current.showContextMenu( - type, - event, - selection, - contextMenuAnchor, - reportID, - reportActionID, - originalReportID, - draftMessage, - onShow, - onHide, - isArchivedRoom, - isChronosReport, - isPinnedChat, - isUnreadChat, - ); -} - -function hideDeleteModal() { - if (!contextMenuRef.current) { - return; - } - contextMenuRef.current.hideDeleteModal(); -} - -/** - * Opens the Confirm delete action modal - * @param {String} reportID - * @param {Object} reportAction - * @param {Boolean} [shouldSetModalVisibility] - * @param {Function} [onConfirm] - * @param {Function} [onCancel] - */ -function showDeleteModal(reportID, reportAction, shouldSetModalVisibility, onConfirm, onCancel) { - if (!contextMenuRef.current) { - return; - } - contextMenuRef.current.showDeleteModal(reportID, reportAction, shouldSetModalVisibility, onConfirm, onCancel); -} - -/** - * Whether Context Menu is active for the Report Action. - * - * @param {Number|String} actionID - * @return {Boolean} - */ -function isActiveReportAction(actionID) { - if (!contextMenuRef.current) { - return; - } - return contextMenuRef.current.isActiveReportAction(actionID); -} - -function clearActiveReportAction() { - if (!contextMenuRef.current) { - return; - } - return contextMenuRef.current.clearActiveReportAction(); -} - -export {contextMenuRef, showContextMenu, hideContextMenu, isActiveReportAction, clearActiveReportAction, showDeleteModal, hideDeleteModal}; diff --git a/src/pages/home/report/ContextMenu/genericReportActionContextMenuPropTypes.ts b/src/pages/home/report/ContextMenu/genericReportActionContextMenuPropTypes.ts deleted file mode 100644 index 3d8667e44e62..000000000000 --- a/src/pages/home/report/ContextMenu/genericReportActionContextMenuPropTypes.ts +++ /dev/null @@ -1,34 +0,0 @@ -import PropTypes from 'prop-types'; - -const propTypes = { - /** The ID of the report this report action is attached to. */ - reportID: PropTypes.string.isRequired, - - /** The ID of the report action this context menu is attached to. */ - reportActionID: PropTypes.string.isRequired, - - /** The ID of the original report from which the given reportAction is first created. */ - originalReportID: PropTypes.string.isRequired, - - /** If true, this component will be a small, row-oriented menu that displays icons but not text. - If false, this component will be a larger, column-oriented menu that displays icons alongside text in each row. */ - isMini: PropTypes.bool, - - /** Controls the visibility of this component. */ - isVisible: PropTypes.bool, - - /** The copy selection. */ - selection: PropTypes.string, - - /** Draft message - if this is set the comment is in 'edit' mode */ - draftMessage: PropTypes.string, -}; - -const defaultProps = { - isMini: false, - isVisible: false, - selection: '', - draftMessage: '', -}; - -export {propTypes, defaultProps}; diff --git a/src/pages/home/report/ContextMenu/types.ts b/src/pages/home/report/ContextMenu/types.ts index 051e7635bc80..76af0d1e3f13 100644 --- a/src/pages/home/report/ContextMenu/types.ts +++ b/src/pages/home/report/ContextMenu/types.ts @@ -1,10 +1,3 @@ -const CONTEXT_MENU_TYPES = { - LINK: 'LINK', - REPORT_ACTION: 'REPORT_ACTION', - EMAIL: 'EMAIL', - REPORT: 'REPORT', -} as const; - type GenericReportActionContextMenuProps = { /** The ID of the report this report action is attached to. */ reportID: string; @@ -29,5 +22,4 @@ type GenericReportActionContextMenuProps = { draftMessage?: string; }; -export {CONTEXT_MENU_TYPES}; export type {GenericReportActionContextMenuProps}; From 84e77cd4ffb0b18ecc4ddf17c9d4798a3b8f14b1 Mon Sep 17 00:00:00 2001 From: Blazej Kustra Date: Fri, 29 Dec 2023 14:31:52 +0100 Subject: [PATCH 157/583] Migrate ContextMenuActions --- .../report/ContextMenu/ContextMenuActions.tsx | 132 +++++++++++------- 1 file changed, 83 insertions(+), 49 deletions(-) diff --git a/src/pages/home/report/ContextMenu/ContextMenuActions.tsx b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx index 2f00f81e0fa5..ab28e741e6bc 100644 --- a/src/pages/home/report/ContextMenu/ContextMenuActions.tsx +++ b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx @@ -1,7 +1,7 @@ import ExpensiMark from 'expensify-common/lib/ExpensiMark'; -import lodashGet from 'lodash/get'; import React from 'react'; -import _ from 'underscore'; +import {OnyxEntry} from 'react-native-onyx'; +import {Emoji} from '@assets/emojis/types'; import * as Expensicons from '@components/Icon/Expensicons'; import MiniQuickEmojiReactions from '@components/Reactions/MiniQuickEmojiReactions'; import QuickEmojiReactions from '@components/Reactions/QuickEmojiReactions'; @@ -22,24 +22,20 @@ import * as TaskUtils from '@libs/TaskUtils'; import * as Download from '@userActions/Download'; import * as Report from '@userActions/Report'; import CONST from '@src/CONST'; +import {TranslationPaths} from '@src/languages/types'; import ROUTES from '@src/ROUTES'; +import {Beta, ReportAction, ReportActionReactions} from '@src/types/onyx'; +import IconAsset from '@src/types/utils/IconAsset'; import {clearActiveReportAction, hideContextMenu, showDeleteModal} from './ReportActionContextMenu'; -/** - * Gets the HTML version of the message in an action. - * @param reportAction - * @return - */ -function getActionText(reportAction) { - const message = _.last(lodashGet(reportAction, 'message', null)); - return lodashGet(message, 'html', ''); +/** Gets the HTML version of the message in an action */ +function getActionText(reportAction: OnyxEntry) { + const message = reportAction?.message?.at(-1) ?? null; + return message?.html ?? ''; } -/** - * Sets the HTML string to Clipboard. - * @param content - */ -function setClipboardMessage(content) { +/** Sets the HTML string to Clipboard */ +function setClipboardMessage(content: string) { const parser = new ExpensiMark(); if (!Clipboard.canSetHtml()) { Clipboard.setString(parser.htmlToMarkdown(content)); @@ -49,16 +45,56 @@ function setClipboardMessage(content) { } } +type ShouldShow = ( + type: string, + reportAction: ReportAction, + isArchivedRoom: boolean, + betas: Beta[], + menuTarget: HTMLElement, + isChronosReport: boolean, + reportID: string, + isPinnedChat: boolean, + isUnreadChat: boolean, + anchor: string, +) => boolean; + +type Payload = { + reportAction: ReportAction; + reportID: string; + draftMessage: string; + selection: string; + close: () => void; + openContextMenu: () => void; + interceptAnonymousUser: (callback: () => void, isAnonymousAction?: boolean) => void; +}; + +type OnPress = (closePopover: boolean, payload: Payload, selection: string | undefined, reportID: string, draftMessage: string) => void; + +type RenderContent = (closePopover: boolean, payload: Payload) => React.ReactElement; + +type GetDescription = (selection?: string) => string | void; + +type ContextMenuAction = { + isAnonymousAction: boolean; + shouldShow: ShouldShow; + textTranslateKey?: TranslationPaths; + successTextTranslateKey?: TranslationPaths; + icon?: IconAsset; + successIcon?: IconAsset; + renderContent?: RenderContent; + onPress?: OnPress; + getDescription?: GetDescription; +}; + // A list of all the context actions in this menu. -export default [ +const ContextMenuActions: ContextMenuAction[] = [ { isAnonymousAction: false, - shouldKeepOpen: true, - shouldShow: (type, reportAction) => type === CONST.CONTEXT_MENU_TYPES.REPORT_ACTION && _.has(reportAction, 'message') && !ReportActionsUtils.isMessageDeleted(reportAction), + shouldShow: (type, reportAction) => type === CONST.CONTEXT_MENU_TYPES.REPORT_ACTION && 'message' in reportAction && !ReportActionsUtils.isMessageDeleted(reportAction), renderContent: (closePopover, {reportID, reportAction, close: closeManually, openContextMenu}) => { const isMini = !closePopover; - const closeContextMenu = (onHideCallback) => { + const closeContextMenu = (onHideCallback?: () => void) => { if (isMini) { closeManually(); if (onHideCallback) { @@ -69,7 +105,7 @@ export default [ } }; - const toggleEmojiAndCloseMenu = (emoji, existingReactions) => { + const toggleEmojiAndCloseMenu = (emoji: Emoji, existingReactions: ReportActionReactions | undefined) => { Report.toggleEmojiReaction(reportID, reportAction, emoji, existingReactions); closeContextMenu(); }; @@ -78,6 +114,7 @@ export default [ return ( @@ -106,12 +144,13 @@ export default [ successIcon: Expensicons.Download, shouldShow: (type, reportAction, isArchivedRoom, betas, anchor, isChronosReport, reportID, isPinnedChat, isUnreadChat, isOffline) => { const isAttachment = ReportActionsUtils.isReportActionAttachment(reportAction); - const messageHtml = lodashGet(reportAction, ['message', 0, 'html']); - return isAttachment && messageHtml !== CONST.ATTACHMENT_UPLOADING_MESSAGE_HTML && reportAction.reportActionID && !ReportActionsUtils.isMessageDeleted(reportAction) && !isOffline; + const messageHtml = getActionText; + return ( + isAttachment && messageHtml !== CONST.ATTACHMENT_UPLOADING_MESSAGE_HTML && !!reportAction.reportActionID && !ReportActionsUtils.isMessageDeleted(reportAction) && !isOffline + ); }, onPress: (closePopover, {reportAction}) => { - const message = _.last(lodashGet(reportAction, 'message', [{}])); - const html = lodashGet(message, 'html', ''); + const html = getActionText(reportAction); const attachmentDetails = getAttachmentDetails(html); const {originalFileName, sourceURL} = attachmentDetails; const sourceURLWithAuth = addEncryptedAuthTokenToURL(sourceURL); @@ -128,8 +167,6 @@ export default [ isAnonymousAction: false, textTranslateKey: 'reportActionContextMenu.replyInThread', icon: Expensicons.ChatBubble, - successTextTranslateKey: '', - successIcon: null, shouldShow: (type, reportAction, isArchivedRoom, betas, anchor, isChronosReport, reportID) => { if (type !== CONST.CONTEXT_MENU_TYPES.REPORT_ACTION) { return false; @@ -150,12 +187,12 @@ export default [ if (closePopover) { hideContextMenu(false, () => { ReportActionComposeFocusManager.focus(); - Report.navigateToAndOpenChildReport(lodashGet(reportAction, 'childReportID', '0'), reportAction, reportID); + Report.navigateToAndOpenChildReport(reportAction?.childReportID ?? '0', reportAction, reportID); }); return; } - Report.navigateToAndOpenChildReport(lodashGet(reportAction, 'childReportID', '0'), reportAction, reportID); + Report.navigateToAndOpenChildReport(reportAction?.childReportID ?? '0', reportAction, reportID); }, getDescription: () => {}, }, @@ -163,10 +200,8 @@ export default [ isAnonymousAction: false, textTranslateKey: 'reportActionContextMenu.subscribeToThread', icon: Expensicons.Bell, - successTextTranslateKey: '', - successIcon: null, shouldShow: (type, reportAction, isArchivedRoom, betas, anchor, isChronosReport, reportID) => { - let childReportNotificationPreference = lodashGet(reportAction, 'childReportNotificationPreference', ''); + let childReportNotificationPreference = reportAction?.childReportNotificationPreference ?? ''; if (!childReportNotificationPreference) { const isActionCreator = ReportUtils.isActionCreator(reportAction); childReportNotificationPreference = isActionCreator ? CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS : CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN; @@ -179,7 +214,7 @@ export default [ return !subscribed && !isWhisperAction && (isCommentAction || isReportPreviewAction || isIOUAction); }, onPress: (closePopover, {reportAction, reportID}) => { - let childReportNotificationPreference = lodashGet(reportAction, 'childReportNotificationPreference', ''); + let childReportNotificationPreference = reportAction?.childReportNotificationPreference ?? ''; if (!childReportNotificationPreference) { const isActionCreator = ReportUtils.isActionCreator(reportAction); childReportNotificationPreference = isActionCreator ? CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS : CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN; @@ -187,13 +222,13 @@ export default [ if (closePopover) { hideContextMenu(false, () => { ReportActionComposeFocusManager.focus(); - Report.toggleSubscribeToChildReport(lodashGet(reportAction, 'childReportID', '0'), reportAction, reportID, childReportNotificationPreference); + Report.toggleSubscribeToChildReport(reportAction?.childReportID ?? '0', reportAction, reportID, childReportNotificationPreference); }); return; } ReportActionComposeFocusManager.focus(); - Report.toggleSubscribeToChildReport(lodashGet(reportAction, 'childReportID', '0'), reportAction, reportID, childReportNotificationPreference); + Report.toggleSubscribeToChildReport(reportAction?.childReportID ?? '0', reportAction, reportID, childReportNotificationPreference); }, getDescription: () => {}, }, @@ -201,10 +236,8 @@ export default [ isAnonymousAction: false, textTranslateKey: 'reportActionContextMenu.unsubscribeFromThread', icon: Expensicons.BellSlash, - successTextTranslateKey: '', - successIcon: null, shouldShow: (type, reportAction, isArchivedRoom, betas, anchor, isChronosReport, reportID) => { - let childReportNotificationPreference = lodashGet(reportAction, 'childReportNotificationPreference', ''); + let childReportNotificationPreference = reportAction?.childReportNotificationPreference ?? ''; if (!childReportNotificationPreference) { const isActionCreator = ReportUtils.isActionCreator(reportAction); childReportNotificationPreference = isActionCreator ? CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS : CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN; @@ -219,7 +252,7 @@ export default [ return subscribed && (isCommentAction || isReportPreviewAction || isIOUAction); }, onPress: (closePopover, {reportAction, reportID}) => { - let childReportNotificationPreference = lodashGet(reportAction, 'childReportNotificationPreference', ''); + let childReportNotificationPreference = reportAction?.childReportNotificationPreference ?? ''; if (!childReportNotificationPreference) { const isActionCreator = ReportUtils.isActionCreator(reportAction); childReportNotificationPreference = isActionCreator ? CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS : CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN; @@ -227,13 +260,13 @@ export default [ if (closePopover) { hideContextMenu(false, () => { ReportActionComposeFocusManager.focus(); - Report.toggleSubscribeToChildReport(lodashGet(reportAction, 'childReportID', '0'), reportAction, reportID, childReportNotificationPreference); + Report.toggleSubscribeToChildReport(reportAction?.childReportID ?? '0', reportAction, reportID, childReportNotificationPreference); }); return; } ReportActionComposeFocusManager.focus(); - Report.toggleSubscribeToChildReport(lodashGet(reportAction, 'childReportID', '0'), reportAction, reportID, childReportNotificationPreference); + Report.toggleSubscribeToChildReport(reportAction?.childReportID ?? '0', reportAction, reportID, childReportNotificationPreference); }, getDescription: () => {}, }, @@ -278,8 +311,7 @@ export default [ onPress: (closePopover, {reportAction, selection}) => { const isTaskAction = ReportActionsUtils.isTaskAction(reportAction); const isReportPreviewAction = ReportActionsUtils.isReportPreviewAction(reportAction); - const message = _.last(lodashGet(reportAction, 'message', [{}])); - const messageHtml = isTaskAction ? TaskUtils.getTaskReportActionMessage(reportAction.actionName) : lodashGet(message, 'html', ''); + const messageHtml = isTaskAction ? TaskUtils.getTaskReportActionMessage(reportAction.actionName) : getActionText(reportAction); const isAttachment = ReportActionsUtils.isReportActionAttachment(reportAction); if (!isAttachment) { @@ -298,11 +330,11 @@ export default [ const taskPreviewMessage = TaskUtils.getTaskCreatedMessage(reportAction); Clipboard.setString(taskPreviewMessage); } else if (ReportActionsUtils.isMemberChangeAction(reportAction)) { - const logMessage = ReportActionsUtils.getMemberChangeMessageFragment(reportAction).html; + const logMessage = ReportActionsUtils.getMemberChangeMessageFragment(reportAction).html ?? ''; setClipboardMessage(logMessage); } else if (ReportActionsUtils.isSubmittedExpenseAction(reportAction)) { - const submittedMessage = _.reduce(reportAction.message, (acc, curr) => `${acc}${curr.text}`, ''); - Clipboard.setString(submittedMessage); + const submittedMessage = reportAction?.message?.reduce((acc, curr) => `${acc}${curr.text}`, ''); + Clipboard.setString(submittedMessage ?? ''); } else if (content) { setClipboardMessage(content); } @@ -325,12 +357,12 @@ export default [ const isAttachment = ReportActionsUtils.isReportActionAttachment(reportAction); // Only hide the copylink menu item when context menu is opened over img element. - const isAttachmentTarget = lodashGet(menuTarget, 'tagName') === 'IMG' && isAttachment; + const isAttachmentTarget = menuTarget?.tagName === 'IMG' && isAttachment; return Permissions.canUseCommentLinking(betas) && type === CONST.CONTEXT_MENU_TYPES.REPORT_ACTION && !isAttachmentTarget && !ReportActionsUtils.isMessageDeleted(reportAction); }, onPress: (closePopover, {reportAction, reportID}) => { Environment.getEnvironmentURL().then((environmentURL) => { - const reportActionID = lodashGet(reportAction, 'reportActionID'); + const reportActionID = reportAction?.reportActionID; Clipboard.setString(`${environmentURL}/r/${reportID}/${reportActionID}`); }); hideContextMenu(true, ReportActionComposeFocusManager.focus); @@ -378,7 +410,7 @@ export default [ onPress: (closePopover, {reportID, reportAction, draftMessage}) => { if (ReportActionsUtils.isMoneyRequestAction(reportAction)) { hideContextMenu(false); - const childReportID = lodashGet(reportAction, 'childReportID', 0); + const childReportID = reportAction?.childReportID ?? 0; if (!childReportID) { const thread = ReportUtils.buildTransactionThread(reportAction, reportID); const userLogins = PersonalDetailsUtils.getLoginsByAccountIDs(thread.participantAccountIDs); @@ -390,7 +422,7 @@ export default [ Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(childReportID)); return; } - const editAction = () => Report.saveReportActionDraft(reportID, reportAction, _.isEmpty(draftMessage) ? getActionText(reportAction) : ''); + const editAction = () => Report.saveReportActionDraft(reportID, reportAction, !draftMessage ? getActionText(reportAction) : ''); if (closePopover) { // Hide popover, then call editAction @@ -474,3 +506,5 @@ export default [ getDescription: () => {}, }, ]; + +export default ContextMenuActions; From d36fb5bbb1269d90d795f6113833dd888690b82c Mon Sep 17 00:00:00 2001 From: Blazej Kustra Date: Fri, 29 Dec 2023 15:12:05 +0100 Subject: [PATCH 158/583] Fix ContextMenuActions type errors --- .../report/ContextMenu/ContextMenuActions.tsx | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/pages/home/report/ContextMenu/ContextMenuActions.tsx b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx index ab28e741e6bc..e0dbd6e94159 100644 --- a/src/pages/home/report/ContextMenu/ContextMenuActions.tsx +++ b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx @@ -144,19 +144,18 @@ const ContextMenuActions: ContextMenuAction[] = [ successIcon: Expensicons.Download, shouldShow: (type, reportAction, isArchivedRoom, betas, anchor, isChronosReport, reportID, isPinnedChat, isUnreadChat, isOffline) => { const isAttachment = ReportActionsUtils.isReportActionAttachment(reportAction); - const messageHtml = getActionText; + const messageHtml = reportAction?.message?.at(0)?.html; return ( isAttachment && messageHtml !== CONST.ATTACHMENT_UPLOADING_MESSAGE_HTML && !!reportAction.reportActionID && !ReportActionsUtils.isMessageDeleted(reportAction) && !isOffline ); }, onPress: (closePopover, {reportAction}) => { const html = getActionText(reportAction); - const attachmentDetails = getAttachmentDetails(html); - const {originalFileName, sourceURL} = attachmentDetails; - const sourceURLWithAuth = addEncryptedAuthTokenToURL(sourceURL); - const sourceID = (sourceURL.match(CONST.REGEX.ATTACHMENT_ID) || [])[1]; + const {originalFileName, sourceURL} = getAttachmentDetails(html); + const sourceURLWithAuth = addEncryptedAuthTokenToURL(sourceURL ?? ''); + const sourceID = (sourceURL?.match(CONST.REGEX.ATTACHMENT_ID) ?? [])[1]; Download.setDownload(sourceID, true); - fileDownload(sourceURLWithAuth, originalFileName).then(() => Download.setDownload(sourceID, false)); + fileDownload(sourceURLWithAuth, originalFileName ?? '').then(() => Download.setDownload(sourceID, false)); if (closePopover) { hideContextMenu(true, ReportActionComposeFocusManager.focus); } @@ -214,7 +213,7 @@ const ContextMenuActions: ContextMenuAction[] = [ return !subscribed && !isWhisperAction && (isCommentAction || isReportPreviewAction || isIOUAction); }, onPress: (closePopover, {reportAction, reportID}) => { - let childReportNotificationPreference = reportAction?.childReportNotificationPreference ?? ''; + let childReportNotificationPreference = reportAction?.childReportNotificationPreference; if (!childReportNotificationPreference) { const isActionCreator = ReportUtils.isActionCreator(reportAction); childReportNotificationPreference = isActionCreator ? CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS : CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN; @@ -237,7 +236,7 @@ const ContextMenuActions: ContextMenuAction[] = [ textTranslateKey: 'reportActionContextMenu.unsubscribeFromThread', icon: Expensicons.BellSlash, shouldShow: (type, reportAction, isArchivedRoom, betas, anchor, isChronosReport, reportID) => { - let childReportNotificationPreference = reportAction?.childReportNotificationPreference ?? ''; + let childReportNotificationPreference = reportAction?.childReportNotificationPreference; if (!childReportNotificationPreference) { const isActionCreator = ReportUtils.isActionCreator(reportAction); childReportNotificationPreference = isActionCreator ? CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS : CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN; @@ -252,7 +251,7 @@ const ContextMenuActions: ContextMenuAction[] = [ return subscribed && (isCommentAction || isReportPreviewAction || isIOUAction); }, onPress: (closePopover, {reportAction, reportID}) => { - let childReportNotificationPreference = reportAction?.childReportNotificationPreference ?? ''; + let childReportNotificationPreference = reportAction?.childReportNotificationPreference; if (!childReportNotificationPreference) { const isActionCreator = ReportUtils.isActionCreator(reportAction); childReportNotificationPreference = isActionCreator ? CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS : CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN; @@ -294,7 +293,7 @@ const ContextMenuActions: ContextMenuAction[] = [ Clipboard.setString(EmailUtils.trimMailTo(selection)); hideContextMenu(true, ReportActionComposeFocusManager.focus); }, - getDescription: (selection) => EmailUtils.prefixMailSeparatorsWithBreakOpportunities(EmailUtils.trimMailTo(selection)), + getDescription: (selection) => EmailUtils.prefixMailSeparatorsWithBreakOpportunities(EmailUtils.trimMailTo(selection ?? '')), }, { isAnonymousAction: true, @@ -413,7 +412,7 @@ const ContextMenuActions: ContextMenuAction[] = [ const childReportID = reportAction?.childReportID ?? 0; if (!childReportID) { const thread = ReportUtils.buildTransactionThread(reportAction, reportID); - const userLogins = PersonalDetailsUtils.getLoginsByAccountIDs(thread.participantAccountIDs); + const userLogins = PersonalDetailsUtils.getLoginsByAccountIDs(thread.participantAccountIDs ?? []); Report.openReport(thread.reportID, userLogins, thread, reportAction.reportActionID); Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(thread.reportID)); return; @@ -493,7 +492,6 @@ const ContextMenuActions: ContextMenuAction[] = [ ReportUtils.canFlagReportAction(reportAction, reportID) && !isArchivedRoom && !isChronosReport && - !ReportUtils.isConciergeChatReport(reportID) && reportAction.actorAccountID !== CONST.ACCOUNT_ID.CONCIERGE, onPress: (closePopover, {reportID, reportAction}) => { if (closePopover) { From e395228009d7589dea28a288d5eb825805ff331d Mon Sep 17 00:00:00 2001 From: Blazej Kustra Date: Fri, 29 Dec 2023 21:28:03 +0100 Subject: [PATCH 159/583] Improve ContextMenu types --- src/libs/actions/IOU.js | 2 +- .../BaseReportActionContextMenu.tsx | 24 ++--- .../report/ContextMenu/ContextMenuActions.tsx | 62 +++++------ .../PopoverReportActionContextMenu.tsx | 101 ++++++++++-------- .../ContextMenu/ReportActionContextMenu.ts | 1 + 5 files changed, 102 insertions(+), 88 deletions(-) diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index d43fefca20bc..0cb3a3277b55 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -2277,7 +2277,7 @@ function updateMoneyRequestAmountAndCurrency(transactionID, transactionThreadRep } /** - * @param {String} transactionID + * @param {String | undefined} transactionID * @param {Object} reportAction - the money request reportAction we are deleting * @param {Boolean} isSingleTransactionView */ diff --git a/src/pages/home/report/ContextMenu/BaseReportActionContextMenu.tsx b/src/pages/home/report/ContextMenu/BaseReportActionContextMenu.tsx index 08d1e7a0c28a..96fc5ba1c944 100755 --- a/src/pages/home/report/ContextMenu/BaseReportActionContextMenu.tsx +++ b/src/pages/home/report/ContextMenu/BaseReportActionContextMenu.tsx @@ -1,8 +1,7 @@ import lodashIsEqual from 'lodash/isEqual'; -import React, {memo, useMemo, useRef, useState} from 'react'; +import React, {memo, RefObject, useMemo, useRef, useState} from 'react'; import {InteractionManager, View} from 'react-native'; import {OnyxEntry, withOnyx} from 'react-native-onyx'; -import {ValueOf} from 'type-fest'; import ContextMenuItem from '@components/ContextMenuItem'; import useArrowKeyFocusManager from '@hooks/useArrowKeyFocusManager'; import useKeyboardShortcut from '@hooks/useKeyboardShortcut'; @@ -13,9 +12,10 @@ import useWindowDimensions from '@hooks/useWindowDimensions'; import * as Session from '@userActions/Session'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import {Beta, ReportActions} from '@src/types/onyx'; +import {Beta, ReportAction, ReportActions} from '@src/types/onyx'; +import {isEmptyObject} from '@src/types/utils/EmptyObject'; import ContextMenuActions from './ContextMenuActions'; -import {hideContextMenu} from './ReportActionContextMenu'; +import {ContextMenuType, hideContextMenu} from './ReportActionContextMenu'; type BaseReportActionContextMenuOnyxProps = { /** Beta features list */ @@ -50,10 +50,10 @@ type BaseReportActionContextMenuProps = BaseReportActionContextMenuOnyxProps & { draftMessage?: string; /** String representing the context menu type [LINK, REPORT_ACTION] which controls context menu choices */ - type?: ValueOf; + type?: ContextMenuType; /** Target node which is the target of ContentMenu */ - anchor: any; + anchor: HTMLElement; /** Flag to check if the chat participant is Chronos */ isChronosReport: boolean; @@ -68,7 +68,7 @@ type BaseReportActionContextMenuProps = BaseReportActionContextMenuOnyxProps & { isUnreadChat?: boolean; /** Content Ref */ - contentRef: any; + contentRef?: RefObject; }; function BaseReportActionContextMenu({ @@ -96,16 +96,16 @@ function BaseReportActionContextMenu({ const wrapperStyle = StyleUtils.getReportActionContextMenuStyles(isMini, isSmallScreenWidth); const {isOffline} = useNetwork(); - const reportAction = useMemo(() => { - if (_.isEmpty(reportActions) || reportActionID === '0') { - return {}; + const reportAction: OnyxEntry = useMemo(() => { + if (isEmptyObject(reportActions) || reportActionID === '0') { + return null; } - return reportActions[reportActionID] || {}; + return reportActions[reportActionID] ?? null; }, [reportActions, reportActionID]); const shouldEnableArrowNavigation = !isMini && (isVisible || shouldKeepOpen); const filteredContextMenuActions = ContextMenuActions.filter((contextAction) => - contextAction.shouldShow(type, reportAction, isArchivedRoom, betas, anchor, isChronosReport, reportID, isPinnedChat, isUnreadChat, isOffline), + contextAction.shouldShow(type, reportAction, isArchivedRoom, betas, anchor, isChronosReport, reportID, isPinnedChat, isUnreadChat, !!isOffline), ); // Context menu actions that are not rendered as menu items are excluded from arrow navigation diff --git a/src/pages/home/report/ContextMenu/ContextMenuActions.tsx b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx index e0dbd6e94159..eecf5a975684 100644 --- a/src/pages/home/report/ContextMenu/ContextMenuActions.tsx +++ b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx @@ -47,15 +47,15 @@ function setClipboardMessage(content: string) { type ShouldShow = ( type: string, - reportAction: ReportAction, + reportAction: OnyxEntry, isArchivedRoom: boolean, - betas: Beta[], + betas: OnyxEntry, menuTarget: HTMLElement, isChronosReport: boolean, reportID: string, isPinnedChat: boolean, isUnreadChat: boolean, - anchor: string, + isOffline: boolean, ) => boolean; type Payload = { @@ -90,7 +90,8 @@ type ContextMenuAction = { const ContextMenuActions: ContextMenuAction[] = [ { isAnonymousAction: false, - shouldShow: (type, reportAction) => type === CONST.CONTEXT_MENU_TYPES.REPORT_ACTION && 'message' in reportAction && !ReportActionsUtils.isMessageDeleted(reportAction), + shouldShow: (type, reportAction) => + type === CONST.CONTEXT_MENU_TYPES.REPORT_ACTION && !!reportAction && 'message' in reportAction && !ReportActionsUtils.isMessageDeleted(reportAction), renderContent: (closePopover, {reportID, reportAction, close: closeManually, openContextMenu}) => { const isMini = !closePopover; @@ -118,7 +119,7 @@ const ContextMenuActions: ContextMenuAction[] = [ onEmojiSelected={toggleEmojiAndCloseMenu} onPressOpenPicker={openContextMenu} onEmojiPickerClosed={closeContextMenu} - reportActionID={reportAction.reportActionID} + reportActionID={reportAction?.reportActionID} reportAction={reportAction} /> ); @@ -130,7 +131,7 @@ const ContextMenuActions: ContextMenuAction[] = [ closeContextMenu={closeContextMenu} onEmojiSelected={toggleEmojiAndCloseMenu} // @ts-expect-error TODO: Remove this once Reactions (https://github.com/Expensify/App/issues/25153) is migrated to TypeScript. - reportActionID={reportAction.reportActionID} + reportActionID={reportAction?.reportActionID} reportAction={reportAction} /> ); @@ -142,11 +143,11 @@ const ContextMenuActions: ContextMenuAction[] = [ icon: Expensicons.Download, successTextTranslateKey: 'common.download', successIcon: Expensicons.Download, - shouldShow: (type, reportAction, isArchivedRoom, betas, anchor, isChronosReport, reportID, isPinnedChat, isUnreadChat, isOffline) => { + shouldShow: (type, reportAction, isArchivedRoom, betas, menuTarget, isChronosReport, reportID, isPinnedChat, isUnreadChat, isOffline) => { const isAttachment = ReportActionsUtils.isReportActionAttachment(reportAction); const messageHtml = reportAction?.message?.at(0)?.html; return ( - isAttachment && messageHtml !== CONST.ATTACHMENT_UPLOADING_MESSAGE_HTML && !!reportAction.reportActionID && !ReportActionsUtils.isMessageDeleted(reportAction) && !isOffline + isAttachment && messageHtml !== CONST.ATTACHMENT_UPLOADING_MESSAGE_HTML && !!reportAction?.reportActionID && !ReportActionsUtils.isMessageDeleted(reportAction) && !isOffline ); }, onPress: (closePopover, {reportAction}) => { @@ -166,13 +167,13 @@ const ContextMenuActions: ContextMenuAction[] = [ isAnonymousAction: false, textTranslateKey: 'reportActionContextMenu.replyInThread', icon: Expensicons.ChatBubble, - shouldShow: (type, reportAction, isArchivedRoom, betas, anchor, isChronosReport, reportID) => { + shouldShow: (type, reportAction, isArchivedRoom, betas, menuTarget, isChronosReport, reportID) => { if (type !== CONST.CONTEXT_MENU_TYPES.REPORT_ACTION) { return false; } - const isCommentAction = reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.ADDCOMMENT; - const isReportPreviewAction = reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.REPORTPREVIEW; - const isIOUAction = reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.IOU && !ReportActionsUtils.isSplitBillAction(reportAction); + const isCommentAction = reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.ADDCOMMENT; + const isReportPreviewAction = reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.REPORTPREVIEW; + const isIOUAction = reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.IOU && !ReportActionsUtils.isSplitBillAction(reportAction); const isModifiedExpenseAction = ReportActionsUtils.isModifiedExpenseAction(reportAction); const isTaskAction = ReportActionsUtils.isTaskAction(reportAction); const isWhisperAction = ReportActionsUtils.isWhisperAction(reportAction); @@ -199,16 +200,16 @@ const ContextMenuActions: ContextMenuAction[] = [ isAnonymousAction: false, textTranslateKey: 'reportActionContextMenu.subscribeToThread', icon: Expensicons.Bell, - shouldShow: (type, reportAction, isArchivedRoom, betas, anchor, isChronosReport, reportID) => { + shouldShow: (type, reportAction, isArchivedRoom, betas, menuTarget, isChronosReport, reportID) => { let childReportNotificationPreference = reportAction?.childReportNotificationPreference ?? ''; if (!childReportNotificationPreference) { const isActionCreator = ReportUtils.isActionCreator(reportAction); childReportNotificationPreference = isActionCreator ? CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS : CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN; } const subscribed = childReportNotificationPreference !== 'hidden'; - const isCommentAction = reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.ADDCOMMENT && !ReportUtils.isThreadFirstChat(reportAction, reportID); - const isReportPreviewAction = reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.REPORTPREVIEW; - const isIOUAction = reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.IOU && !ReportActionsUtils.isSplitBillAction(reportAction); + const isCommentAction = reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.ADDCOMMENT && !ReportUtils.isThreadFirstChat(reportAction, reportID); + const isReportPreviewAction = reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.REPORTPREVIEW; + const isIOUAction = reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.IOU && !ReportActionsUtils.isSplitBillAction(reportAction); const isWhisperAction = ReportActionsUtils.isWhisperAction(reportAction); return !subscribed && !isWhisperAction && (isCommentAction || isReportPreviewAction || isIOUAction); }, @@ -235,7 +236,7 @@ const ContextMenuActions: ContextMenuAction[] = [ isAnonymousAction: false, textTranslateKey: 'reportActionContextMenu.unsubscribeFromThread', icon: Expensicons.BellSlash, - shouldShow: (type, reportAction, isArchivedRoom, betas, anchor, isChronosReport, reportID) => { + shouldShow: (type, reportAction, isArchivedRoom, betas, menuTarget, isChronosReport, reportID) => { let childReportNotificationPreference = reportAction?.childReportNotificationPreference; if (!childReportNotificationPreference) { const isActionCreator = ReportUtils.isActionCreator(reportAction); @@ -245,9 +246,9 @@ const ContextMenuActions: ContextMenuAction[] = [ if (type !== CONST.CONTEXT_MENU_TYPES.REPORT_ACTION) { return false; } - const isCommentAction = reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.ADDCOMMENT && !ReportUtils.isThreadFirstChat(reportAction, reportID); - const isReportPreviewAction = reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.REPORTPREVIEW; - const isIOUAction = reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.IOU && !ReportActionsUtils.isSplitBillAction(reportAction); + const isCommentAction = reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.ADDCOMMENT && !ReportUtils.isThreadFirstChat(reportAction, reportID); + const isReportPreviewAction = reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.REPORTPREVIEW; + const isIOUAction = reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.IOU && !ReportActionsUtils.isSplitBillAction(reportAction); return subscribed && (isCommentAction || isReportPreviewAction || isIOUAction); }, onPress: (closePopover, {reportAction, reportID}) => { @@ -310,7 +311,7 @@ const ContextMenuActions: ContextMenuAction[] = [ onPress: (closePopover, {reportAction, selection}) => { const isTaskAction = ReportActionsUtils.isTaskAction(reportAction); const isReportPreviewAction = ReportActionsUtils.isReportPreviewAction(reportAction); - const messageHtml = isTaskAction ? TaskUtils.getTaskReportActionMessage(reportAction.actionName) : getActionText(reportAction); + const messageHtml = isTaskAction ? TaskUtils.getTaskReportActionMessage(reportAction?.actionName) : getActionText(reportAction); const isAttachment = ReportActionsUtils.isReportActionAttachment(reportAction); if (!isAttachment) { @@ -374,10 +375,10 @@ const ContextMenuActions: ContextMenuAction[] = [ textTranslateKey: 'reportActionContextMenu.markAsUnread', icon: Expensicons.Mail, successIcon: Expensicons.Checkmark, - shouldShow: (type, reportAction, isArchivedRoom, betas, anchor, isChronosReport, reportID, isPinnedChat, isUnreadChat) => + shouldShow: (type, reportAction, isArchivedRoom, betas, menuTarget, isChronosReport, reportID, isPinnedChat, isUnreadChat) => type === CONST.CONTEXT_MENU_TYPES.REPORT_ACTION || (type === CONST.CONTEXT_MENU_TYPES.REPORT && !isUnreadChat), onPress: (closePopover, {reportAction, reportID}) => { - Report.markCommentAsUnread(reportID, reportAction.created); + Report.markCommentAsUnread(reportID, reportAction?.created); if (closePopover) { hideContextMenu(true, ReportActionComposeFocusManager.focus); } @@ -390,7 +391,8 @@ const ContextMenuActions: ContextMenuAction[] = [ textTranslateKey: 'reportActionContextMenu.markAsRead', icon: Expensicons.Mail, successIcon: Expensicons.Checkmark, - shouldShow: (type, reportAction, isArchivedRoom, betas, anchor, isChronosReport, reportID, isPinnedChat, isUnreadChat) => type === CONST.CONTEXT_MENU_TYPES.REPORT && isUnreadChat, + shouldShow: (type, reportAction, isArchivedRoom, betas, menuTarget, isChronosReport, reportID, isPinnedChat, isUnreadChat) => + type === CONST.CONTEXT_MENU_TYPES.REPORT && isUnreadChat, onPress: (closePopover, {reportID}) => { Report.readNewestAction(reportID); if (closePopover) { @@ -413,7 +415,7 @@ const ContextMenuActions: ContextMenuAction[] = [ if (!childReportID) { const thread = ReportUtils.buildTransactionThread(reportAction, reportID); const userLogins = PersonalDetailsUtils.getLoginsByAccountIDs(thread.participantAccountIDs ?? []); - Report.openReport(thread.reportID, userLogins, thread, reportAction.reportActionID); + Report.openReport(thread.reportID, userLogins, thread, reportAction?.reportActionID); Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(thread.reportID)); return; } @@ -461,7 +463,7 @@ const ContextMenuActions: ContextMenuAction[] = [ isAnonymousAction: false, textTranslateKey: 'common.pin', icon: Expensicons.Pin, - shouldShow: (type, reportAction, isArchivedRoom, betas, anchor, isChronosReport, reportID, isPinnedChat) => type === CONST.CONTEXT_MENU_TYPES.REPORT && !isPinnedChat, + shouldShow: (type, reportAction, isArchivedRoom, betas, menuTarget, isChronosReport, reportID, isPinnedChat) => type === CONST.CONTEXT_MENU_TYPES.REPORT && !isPinnedChat, onPress: (closePopover, {reportID}) => { Report.togglePinnedState(reportID, false); if (closePopover) { @@ -474,7 +476,7 @@ const ContextMenuActions: ContextMenuAction[] = [ isAnonymousAction: false, textTranslateKey: 'common.unPin', icon: Expensicons.Pin, - shouldShow: (type, reportAction, isArchivedRoom, betas, anchor, isChronosReport, reportID, isPinnedChat) => type === CONST.CONTEXT_MENU_TYPES.REPORT && isPinnedChat, + shouldShow: (type, reportAction, isArchivedRoom, betas, menuTarget, isChronosReport, reportID, isPinnedChat) => type === CONST.CONTEXT_MENU_TYPES.REPORT && isPinnedChat, onPress: (closePopover, {reportID}) => { Report.togglePinnedState(reportID, true); if (closePopover) { @@ -492,14 +494,14 @@ const ContextMenuActions: ContextMenuAction[] = [ ReportUtils.canFlagReportAction(reportAction, reportID) && !isArchivedRoom && !isChronosReport && - reportAction.actorAccountID !== CONST.ACCOUNT_ID.CONCIERGE, + reportAction?.actorAccountID !== CONST.ACCOUNT_ID.CONCIERGE, onPress: (closePopover, {reportID, reportAction}) => { if (closePopover) { - hideContextMenu(false, () => Navigation.navigate(ROUTES.FLAG_COMMENT.getRoute(reportID, reportAction.reportActionID))); + hideContextMenu(false, () => Navigation.navigate(ROUTES.FLAG_COMMENT.getRoute(reportID, reportAction?.reportActionID))); return; } - Navigation.navigate(ROUTES.FLAG_COMMENT.getRoute(reportID, reportAction.reportActionID)); + Navigation.navigate(ROUTES.FLAG_COMMENT.getRoute(reportID, reportAction?.reportActionID)); }, getDescription: () => {}, }, diff --git a/src/pages/home/report/ContextMenu/PopoverReportActionContextMenu.tsx b/src/pages/home/report/ContextMenu/PopoverReportActionContextMenu.tsx index 7f60b9d9b4d5..5533fe48aefc 100644 --- a/src/pages/home/report/ContextMenu/PopoverReportActionContextMenu.tsx +++ b/src/pages/home/report/ContextMenu/PopoverReportActionContextMenu.tsx @@ -1,19 +1,34 @@ -import React, {forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState} from 'react'; -import {Dimensions} from 'react-native'; -import _ from 'underscore'; +import React, {ForwardedRef, forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState} from 'react'; +import {Dimensions, EmitterSubscription} from 'react-native'; +import {OnyxEntry} from 'react-native-onyx'; import ConfirmModal from '@components/ConfirmModal'; import PopoverWithMeasuredContent from '@components/PopoverWithMeasuredContent'; import useLocalize from '@hooks/useLocalize'; import * as ReportActionsUtils from '@libs/ReportActionsUtils'; import * as IOU from '@userActions/IOU'; import * as Report from '@userActions/Report'; +import CONST from '@src/CONST'; +import {ReportAction} from '@src/types/onyx'; import BaseReportActionContextMenu from './BaseReportActionContextMenu'; - -function PopoverReportActionContextMenu(_props, ref) { +import {ContextMenuType} from './ReportActionContextMenu'; + +type PopoverReportActionContextMenuRef = { + showContextMenu: () => void; + hideContextMenu: () => void; + showDeleteModal: () => void; + hideDeleteModal: () => void; + isActiveReportAction: () => void; + instanceID: () => void; + runAndResetOnPopoverHide: () => void; + clearActiveReportAction: () => void; + contentRef: () => void; +}; + +function PopoverReportActionContextMenu(_props: never, ref: ForwardedRef) { const {translate} = useLocalize(); const reportIDRef = useRef('0'); - const typeRef = useRef(undefined); - const reportActionRef = useRef({}); + const typeRef = useRef(undefined); + const reportActionRef = useRef>(null); const reportActionIDRef = useRef('0'); const originalReportIDRef = useRef('0'); const selectionRef = useRef(''); @@ -43,7 +58,7 @@ function PopoverReportActionContextMenu(_props, ref) { const contentRef = useRef(null); const anchorRef = useRef(null); - const dimensionsEventListener = useRef(null); + const dimensionsEventListener = useRef(null); const contextMenuAnchorRef = useRef(null); const contextMenuTargetNode = useRef(null); @@ -87,8 +102,8 @@ function PopoverReportActionContextMenu(_props, ref) { } popoverAnchorPosition.current = { - horizontal: cursorRelativePosition.horizontal + x, - vertical: cursorRelativePosition.vertical + y, + horizontal: cursorRelativePosition.current.horizontal + x, + vertical: cursorRelativePosition.current.vertical + y, }; }); }, [isPopoverVisible, getContextMenuMeasuredLocation]); @@ -104,36 +119,31 @@ function PopoverReportActionContextMenu(_props, ref) { }; }, [measureContextMenuAnchorPosition]); - /** - * Whether Context Menu is active for the Report Action. - * - * @param {Number|String} actionID - * @return {Boolean} - */ - const isActiveReportAction = (actionID) => Boolean(actionID) && (reportActionIDRef.current === actionID || reportActionRef.current.reportActionID === actionID); + /** Whether Context Menu is active for the Report Action. */ + const isActiveReportAction = (actionID: string): boolean => !!actionID && (reportActionIDRef.current === actionID || reportActionRef.current.reportActionID === actionID); const clearActiveReportAction = () => { reportActionIDRef.current = '0'; - reportActionRef.current = {}; + reportActionRef.current = null; }; /** * Show the ReportActionContextMenu modal popover. * - * @param {string} type - context menu type [EMAIL, LINK, REPORT_ACTION] - * @param {Object} [event] - A press event. - * @param {String} [selection] - Copied content. - * @param {Element} contextMenuAnchor - popoverAnchor - * @param {String} reportID - Active Report Id - * @param {Object} reportActionID - ReportAction for ContextMenu - * @param {String} originalReportID - The currrent Report Id of the reportAction - * @param {String} draftMessage - ReportAction Draftmessage - * @param {Function} [onShow] - Run a callback when Menu is shown - * @param {Function} [onHide] - Run a callback when Menu is hidden - * @param {Boolean} isArchivedRoom - Whether the provided report is an archived room - * @param {Boolean} isChronosReport - Flag to check if the chat participant is Chronos - * @param {Boolean} isPinnedChat - Flag to check if the chat is pinned in the LHN. Used for the Pin/Unpin action - * @param {Boolean} isUnreadChat - Flag to check if the chat is unread in the LHN. Used for the Mark as Read/Unread action + * @param type - context menu type [EMAIL, LINK, REPORT_ACTION] + * @param [event] - A press event. + * @param [selection] - Copied content. + * @param contextMenuAnchor - popoverAnchor + * @param reportID - Active Report Id + * @param reportActionID - ReportAction for ContextMenu + * @param originalReportID - The currrent Report Id of the reportAction + * @param draftMessage - ReportAction Draftmessage + * @param [onShow] - Run a callback when Menu is shown + * @param [onHide] - Run a callback when Menu is hidden + * @param isArchivedRoom - Whether the provided report is an archived room + * @param isChronosReport - Flag to check if the chat participant is Chronos + * @param isPinnedChat - Flag to check if the chat is pinned in the LHN. Used for the Pin/Unpin action + * @param isUnreadChat - Flag to check if the chat is unread in the LHN. Used for the Mark as Read/Unread action */ const showContextMenu = ( type, @@ -196,8 +206,8 @@ function PopoverReportActionContextMenu(_props, ref) { /** * Run the callback and return a noop function to reset it - * @param {Function} callback - * @returns {Function} + * @param callback + * @returns */ const runAndResetCallback = (callback) => { callback(); @@ -218,10 +228,10 @@ function PopoverReportActionContextMenu(_props, ref) { /** * Hide the ReportActionContextMenu modal popover. - * @param {Function} onHideActionCallback Callback to be called after popover is completely hidden + * @param onHideActionCallback Callback to be called after popover is completely hidden */ const hideContextMenu = (onHideActionCallback) => { - if (_.isFunction(onHideActionCallback)) { + if (onHideActionCallback === 'function') { onPopoverHideActionCallback.current = onHideActionCallback; } @@ -232,10 +242,11 @@ function PopoverReportActionContextMenu(_props, ref) { const confirmDeleteAndHideModal = useCallback(() => { callbackWhenDeleteModalHide.current = () => (onComfirmDeleteModal.current = runAndResetCallback(onComfirmDeleteModal.current)); - if (ReportActionsUtils.isMoneyRequestAction(reportActionRef.current)) { - IOU.deleteMoneyRequest(reportActionRef.current.originalMessage.IOUTransactionID, reportActionRef.current); - } else { - Report.deleteReportComment(reportIDRef.current, reportActionRef.current); + const reportAction = reportActionRef.current; + if (ReportActionsUtils.isMoneyRequestAction(reportAction) && reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.IOU) { + IOU.deleteMoneyRequest(reportAction?.originalMessage?.IOUTransactionID, reportAction); + } else if (reportAction) { + Report.deleteReportComment(reportIDRef.current, reportAction); } setIsDeleteCommentConfirmModalVisible(false); }, []); @@ -252,11 +263,11 @@ function PopoverReportActionContextMenu(_props, ref) { /** * Opens the Confirm delete action modal - * @param {String} reportID - * @param {Object} reportAction - * @param {Boolean} [shouldSetModalVisibility] - * @param {Function} [onConfirm] - * @param {Function} [onCancel] + * @param reportID + * @param reportAction + * @param [shouldSetModalVisibility] + * @param [onConfirm] + * @param [onCancel] */ const showDeleteModal = (reportID, reportAction, shouldSetModalVisibility = true, onConfirm = () => {}, onCancel = () => {}) => { onCancelDeleteModal.current = onCancel; diff --git a/src/pages/home/report/ContextMenu/ReportActionContextMenu.ts b/src/pages/home/report/ContextMenu/ReportActionContextMenu.ts index b269bc276b55..7ba4a1e04283 100644 --- a/src/pages/home/report/ContextMenu/ReportActionContextMenu.ts +++ b/src/pages/home/report/ContextMenu/ReportActionContextMenu.ts @@ -173,3 +173,4 @@ function clearActiveReportAction() { } export {contextMenuRef, showContextMenu, hideContextMenu, isActiveReportAction, clearActiveReportAction, showDeleteModal, hideDeleteModal}; +export type {ContextMenuType}; From c5847a4530fa139e939c64aae09d537f7649bd61 Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Sat, 30 Dec 2023 14:34:08 +0800 Subject: [PATCH 160/583] clear anchor ref only when we hide the picker --- src/components/EmojiPicker/EmojiPicker.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/components/EmojiPicker/EmojiPicker.js b/src/components/EmojiPicker/EmojiPicker.js index 96bb18cdae04..468bc9f914e5 100644 --- a/src/components/EmojiPicker/EmojiPicker.js +++ b/src/components/EmojiPicker/EmojiPicker.js @@ -86,6 +86,11 @@ const EmojiPicker = forwardRef((props, ref) => { if (isNavigating) { onModalHide.current = () => {}; } + const currOnModalHide = onModalHide.current; + onModalHide.current = () => { + currOnModalHide(); + emojiPopoverAnchorRef.current = null; + } setIsEmojiPickerVisible(false); }; @@ -161,10 +166,7 @@ const EmojiPicker = forwardRef((props, ref) => { isVisible={isEmojiPickerVisible} onClose={hideEmojiPicker} onModalShow={focusEmojiSearchInput} - onModalHide={() => { - onModalHide.current(); - emojiPopoverAnchorRef.current = null; - }} + onModalHide={onModalHide.current} hideModalContentWhileAnimating shouldSetModalVisibility={false} animationInTiming={1} From f3fef89750210ed0d9821a5df148c0e57d1c60a3 Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Sat, 30 Dec 2023 14:38:41 +0800 Subject: [PATCH 161/583] lint --- src/components/EmojiPicker/EmojiPicker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/EmojiPicker/EmojiPicker.js b/src/components/EmojiPicker/EmojiPicker.js index 468bc9f914e5..71270fe26c2e 100644 --- a/src/components/EmojiPicker/EmojiPicker.js +++ b/src/components/EmojiPicker/EmojiPicker.js @@ -90,7 +90,7 @@ const EmojiPicker = forwardRef((props, ref) => { onModalHide.current = () => { currOnModalHide(); emojiPopoverAnchorRef.current = null; - } + }; setIsEmojiPickerVisible(false); }; From 54e7f76d9f5ede5acb255813a67e1c3f3f857fde Mon Sep 17 00:00:00 2001 From: Vit Horacek Date: Sun, 31 Dec 2023 15:49:13 +0100 Subject: [PATCH 162/583] Clean up the states and statuses in the app --- src/CONST.ts | 9 +--- .../ReportActionItem/TaskPreview.js | 4 +- src/libs/ReportUtils.ts | 31 ++++++------- src/libs/actions/IOU.js | 13 +++--- src/libs/actions/Policy.js | 10 ++--- src/libs/actions/Report.ts | 4 +- src/libs/actions/Task.js | 12 ++--- src/libs/actions/Welcome.ts | 2 +- src/pages/home/HeaderView.js | 2 +- src/pages/home/ReportScreen.js | 6 +-- tests/actions/IOUTest.js | 20 ++++----- tests/unit/ReportUtilsTest.js | 38 ++++++++-------- tests/unit/SidebarFilterTest.js | 28 ++++++------ tests/unit/SidebarOrderTest.js | 44 +++++++++---------- tests/unit/SidebarTest.js | 8 ++-- tests/utils/LHNTestUtils.js | 4 +- 16 files changed, 109 insertions(+), 126 deletions(-) diff --git a/src/CONST.ts b/src/CONST.ts index abba27b0c33b..15cb361eb5db 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -626,18 +626,13 @@ const CONST = { ANNOUNCE: '#announce', ADMINS: '#admins', }, - STATE: { - OPEN: 'OPEN', - SUBMITTED: 'SUBMITTED', - PROCESSING: 'PROCESSING', - }, STATE_NUM: { OPEN: 0, PROCESSING: 1, - SUBMITTED: 2, + APPROVED: 2, BILLING: 3, }, - STATUS: { + STATUS_NUM: { OPEN: 0, SUBMITTED: 1, CLOSED: 2, diff --git a/src/components/ReportActionItem/TaskPreview.js b/src/components/ReportActionItem/TaskPreview.js index a7728045f407..578b41c713bc 100644 --- a/src/components/ReportActionItem/TaskPreview.js +++ b/src/components/ReportActionItem/TaskPreview.js @@ -90,8 +90,8 @@ function TaskPreview(props) { // Only the direct parent reportAction will contain details about the taskReport // Other linked reportActions will only contain the taskReportID and we will grab the details from there const isTaskCompleted = !_.isEmpty(props.taskReport) - ? props.taskReport.stateNum === CONST.REPORT.STATE_NUM.SUBMITTED && props.taskReport.statusNum === CONST.REPORT.STATUS.APPROVED - : props.action.childStateNum === CONST.REPORT.STATE_NUM.SUBMITTED && props.action.childStatusNum === CONST.REPORT.STATUS.APPROVED; + ? props.taskReport.stateNum === CONST.REPORT.STATE_NUM.APPROVED && props.taskReport.statusNum === CONST.REPORT.STATUS_NUM.APPROVED + : props.action.childStateNum === CONST.REPORT.STATE_NUM.APPROVED && props.action.childStatusNum === CONST.REPORT.STATUS_NUM.APPROVED; const taskTitle = _.escape(TaskUtils.getTaskTitle(props.taskReportID, props.action.childReportName)); const taskAssigneeAccountID = Task.getTaskAssigneeAccountID(props.taskReport) || props.action.childManagerAccountID; const assigneeLogin = lodashGet(personalDetails, [taskAssigneeAccountID, 'login'], ''); diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 24d0050997f7..99a3ec6d796a 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -529,14 +529,14 @@ function isCanceledTaskReport(report: OnyxEntry | EmptyObject = {}, pare * @param parentReportAction - The parent report action of the report (Used to check if the task has been canceled) */ function isOpenTaskReport(report: OnyxEntry, parentReportAction: OnyxEntry | EmptyObject = {}): boolean { - return isTaskReport(report) && !isCanceledTaskReport(report, parentReportAction) && report?.stateNum === CONST.REPORT.STATE_NUM.OPEN && report?.statusNum === CONST.REPORT.STATUS.OPEN; + return isTaskReport(report) && !isCanceledTaskReport(report, parentReportAction) && report?.stateNum === CONST.REPORT.STATE_NUM.OPEN && report?.statusNum === CONST.REPORT.STATUS_NUM.OPEN; } /** * Checks if a report is a completed task report. */ function isCompletedTaskReport(report: OnyxEntry): boolean { - return isTaskReport(report) && report?.stateNum === CONST.REPORT.STATE_NUM.SUBMITTED && report?.statusNum === CONST.REPORT.STATUS.APPROVED; + return isTaskReport(report) && report?.stateNum === CONST.REPORT.STATE_NUM.APPROVED && report?.statusNum === CONST.REPORT.STATUS_NUM.APPROVED; } /** @@ -550,14 +550,14 @@ function isReportManager(report: OnyxEntry): boolean { * Checks if the supplied report has been approved */ function isReportApproved(report: OnyxEntry | EmptyObject): boolean { - return report?.stateNum === CONST.REPORT.STATE_NUM.SUBMITTED && report?.statusNum === CONST.REPORT.STATUS.APPROVED; + return report?.stateNum === CONST.REPORT.STATE_NUM.APPROVED && report?.statusNum === CONST.REPORT.STATUS_NUM.APPROVED; } /** * Checks if the supplied report is an expense report in Open state and status. */ function isDraftExpenseReport(report: OnyxEntry): boolean { - return isExpenseReport(report) && report?.stateNum === CONST.REPORT.STATE_NUM.OPEN && report?.statusNum === CONST.REPORT.STATUS.OPEN; + return isExpenseReport(report) && report?.stateNum === CONST.REPORT.STATE_NUM.OPEN && report?.statusNum === CONST.REPORT.STATUS_NUM.OPEN; } /** @@ -588,11 +588,11 @@ function isSettled(reportID: string | undefined): boolean { // In case the payment is scheduled and we are waiting for the payee to set up their wallet, // consider the report as paid as well. - if (report.isWaitingOnBankAccount && report.statusNum === CONST.REPORT.STATUS.APPROVED) { + if (report.isWaitingOnBankAccount && report.statusNum === CONST.REPORT.STATUS_NUM.APPROVED) { return true; } - return report?.statusNum === CONST.REPORT.STATUS.REIMBURSED; + return report?.statusNum === CONST.REPORT.STATUS_NUM.REIMBURSED; } /** @@ -767,7 +767,7 @@ function isConciergeChatReport(report: OnyxEntry): boolean { * Returns true if report is still being processed */ function isProcessingReport(report: OnyxEntry): boolean { - return report?.stateNum === CONST.REPORT.STATE_NUM.PROCESSING && report?.statusNum === CONST.REPORT.STATUS.SUBMITTED; + return report?.stateNum === CONST.REPORT.STATE_NUM.SUBMITTED && report?.statusNum === CONST.REPORT.STATUS_NUM.SUBMITTED; } /** @@ -873,7 +873,7 @@ function findLastAccessedReport( * Whether the provided report is an archived room */ function isArchivedRoom(report: OnyxEntry | EmptyObject): boolean { - return report?.statusNum === CONST.REPORT.STATUS.CLOSED && report?.stateNum === CONST.REPORT.STATE_NUM.SUBMITTED; + return report?.statusNum === CONST.REPORT.STATUS_NUM.CLOSED && report?.stateNum === CONST.REPORT.STATE_NUM.APPROVED; } /** @@ -2469,7 +2469,7 @@ function buildOptimisticTaskCommentReportAction(taskReportID: string, taskTitle: reportAction.reportAction.childType = CONST.REPORT.TYPE.TASK; reportAction.reportAction.childReportName = taskTitle; reportAction.reportAction.childManagerAccountID = taskAssigneeAccountID; - reportAction.reportAction.childStatusNum = CONST.REPORT.STATUS.OPEN; + reportAction.reportAction.childStatusNum = CONST.REPORT.STATUS_NUM.OPEN; reportAction.reportAction.childStateNum = CONST.REPORT.STATE_NUM.OPEN; return reportAction; @@ -2499,9 +2499,8 @@ function buildOptimisticIOUReport(payeeAccountID: number, payerAccountID: number ownerAccountID: payeeAccountID, participantAccountIDs: [payeeAccountID, payerAccountID], reportID: generateReportID(), - state: CONST.REPORT.STATE.SUBMITTED, - stateNum: isSendingMoney ? CONST.REPORT.STATE_NUM.SUBMITTED : CONST.REPORT.STATE_NUM.PROCESSING, - statusNum: isSendingMoney ? CONST.REPORT.STATUS.REIMBURSED : CONST.REPORT.STATE_NUM.PROCESSING, + stateNum: isSendingMoney ? CONST.REPORT.STATE_NUM.APPROVED : CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: isSendingMoney ? CONST.REPORT.STATUS_NUM.REIMBURSED : CONST.REPORT.STATE_NUM.SUBMITTED, total, // We don't translate reportName because the server response is always in English @@ -2534,9 +2533,8 @@ function buildOptimisticExpenseReport(chatReportID: string, policyID: string, pa const isFree = policy?.type === CONST.POLICY.TYPE.FREE; // Define the state and status of the report based on whether the policy is free or paid - const state = isFree ? CONST.REPORT.STATE.SUBMITTED : CONST.REPORT.STATE.OPEN; - const stateNum = isFree ? CONST.REPORT.STATE_NUM.PROCESSING : CONST.REPORT.STATE_NUM.OPEN; - const statusNum = isFree ? CONST.REPORT.STATUS.SUBMITTED : CONST.REPORT.STATUS.OPEN; + const stateNum = isFree ? CONST.REPORT.STATE_NUM.SUBMITTED : CONST.REPORT.STATE_NUM.OPEN; + const statusNum = isFree ? CONST.REPORT.STATUS_NUM.SUBMITTED : CONST.REPORT.STATUS_NUM.OPEN; return { reportID: generateReportID(), @@ -2548,7 +2546,6 @@ function buildOptimisticExpenseReport(chatReportID: string, policyID: string, pa // We don't translate reportName because the server response is always in English reportName: `${policyName} owes ${formattedTotal}`, - state, stateNum, statusNum, total: storedTotal, @@ -3248,7 +3245,7 @@ function buildOptimisticTaskReport( parentReportID, policyID, stateNum: CONST.REPORT.STATE_NUM.OPEN, - statusNum: CONST.REPORT.STATUS.OPEN, + statusNum: CONST.REPORT.STATUS_NUM.OPEN, notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS, lastVisibleActionCreated: DateUtils.getDBTime(), }; diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index ecae885392b9..2c1d6486ca67 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -2827,7 +2827,7 @@ function getPayMoneyRequestParams(chatReport, iouReport, recipient, paymentMetho lastMessageText: optimisticIOUReportAction.message[0].text, lastMessageHtml: optimisticIOUReportAction.message[0].html, hasOutstandingChildRequest: false, - statusNum: CONST.REPORT.STATUS.REIMBURSED, + statusNum: CONST.REPORT.STATUS_NUM.REIMBURSED, }, }, { @@ -2965,8 +2965,8 @@ function approveMoneyRequest(expenseReport) { ...expenseReport, lastMessageText: optimisticApprovedReportAction.message[0].text, lastMessageHtml: optimisticApprovedReportAction.message[0].html, - stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, - statusNum: CONST.REPORT.STATUS.APPROVED, + stateNum: CONST.REPORT.STATE_NUM.APPROVED, + statusNum: CONST.REPORT.STATUS_NUM.APPROVED, }, }; const optimisticData = [optimisticIOUReportData, optimisticReportActionsData]; @@ -3038,9 +3038,8 @@ function submitReport(expenseReport) { ...expenseReport, lastMessageText: lodashGet(optimisticSubmittedReportAction, 'message.0.text', ''), lastMessageHtml: lodashGet(optimisticSubmittedReportAction, 'message.0.html', ''), - state: CONST.REPORT.STATE.SUBMITTED, - stateNum: CONST.REPORT.STATE_NUM.PROCESSING, - statusNum: CONST.REPORT.STATUS.SUBMITTED, + stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.SUBMITTED, }, }, ...(parentReport.reportID @@ -3084,7 +3083,7 @@ function submitReport(expenseReport) { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${expenseReport.reportID}`, value: { - statusNum: CONST.REPORT.STATUS.OPEN, + statusNum: CONST.REPORT.STATUS_NUM.OPEN, stateNum: CONST.REPORT.STATE_NUM.OPEN, }, }, diff --git a/src/libs/actions/Policy.js b/src/libs/actions/Policy.js index f33e6637e2de..2aa583016957 100644 --- a/src/libs/actions/Policy.js +++ b/src/libs/actions/Policy.js @@ -172,8 +172,8 @@ function deleteWorkspace(policyID, reports, policyName) { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`, value: { - stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, - statusNum: CONST.REPORT.STATUS.CLOSED, + stateNum: CONST.REPORT.STATE_NUM.APPROVED, + statusNum: CONST.REPORT.STATUS_NUM.CLOSED, hasDraft: false, oldPolicyName: allPolicies[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`].name, }, @@ -352,8 +352,8 @@ function removeMembers(accountIDs, policyID) { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${report.reportID}`, value: { - statusNum: CONST.REPORT.STATUS.CLOSED, - stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.CLOSED, + stateNum: CONST.REPORT.STATE_NUM.APPROVED, oldPolicyName: policy.name, hasDraft: false, }, @@ -459,7 +459,7 @@ function createPolicyExpenseChats(policyID, invitedEmailsToAccountIDs, hasOutsta key: `${ONYXKEYS.COLLECTION.REPORT}${oldChat.reportID}`, value: { stateNum: CONST.REPORT.STATE_NUM.OPEN, - statusNum: CONST.REPORT.STATUS.OPEN, + statusNum: CONST.REPORT.STATUS_NUM.OPEN, }, }); return; diff --git a/src/libs/actions/Report.ts b/src/libs/actions/Report.ts index 06c0316a40b5..701a68ec060a 100644 --- a/src/libs/actions/Report.ts +++ b/src/libs/actions/Report.ts @@ -2079,8 +2079,8 @@ function leaveRoom(reportID: string, isWorkspaceMemberLeavingWorkspaceRoom = fal } : { reportID: null, - stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, - statusNum: CONST.REPORT.STATUS.CLOSED, + stateNum: CONST.REPORT.STATE_NUM.APPROVED, + statusNum: CONST.REPORT.STATUS_NUM.CLOSED, notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN, }, }, diff --git a/src/libs/actions/Task.js b/src/libs/actions/Task.js index 0fe6a528cda1..d6f1c920bbd0 100644 --- a/src/libs/actions/Task.js +++ b/src/libs/actions/Task.js @@ -238,8 +238,8 @@ function completeTask(taskReport) { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${taskReportID}`, value: { - stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, - statusNum: CONST.REPORT.STATUS.APPROVED, + stateNum: CONST.REPORT.STATE_NUM.APPROVED, + statusNum: CONST.REPORT.STATUS_NUM.APPROVED, }, }, @@ -267,7 +267,7 @@ function completeTask(taskReport) { key: `${ONYXKEYS.COLLECTION.REPORT}${taskReportID}`, value: { stateNum: CONST.REPORT.STATE_NUM.OPEN, - statusNum: CONST.REPORT.STATUS.OPEN, + statusNum: CONST.REPORT.STATUS_NUM.OPEN, }, }, { @@ -306,7 +306,7 @@ function reopenTask(taskReport) { key: `${ONYXKEYS.COLLECTION.REPORT}${taskReportID}`, value: { stateNum: CONST.REPORT.STATE_NUM.OPEN, - statusNum: CONST.REPORT.STATUS.OPEN, + statusNum: CONST.REPORT.STATUS_NUM.OPEN, lastVisibleActionCreated: reopenedTaskReportAction.created, lastMessageText: message, lastActorAccountID: reopenedTaskReportAction.actorAccountID, @@ -336,8 +336,8 @@ function reopenTask(taskReport) { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${taskReportID}`, value: { - stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, - statusNum: CONST.REPORT.STATUS.APPROVED, + stateNum: CONST.REPORT.STATE_NUM.APPROVED, + statusNum: CONST.REPORT.STATUS_NUM.APPROVED, }, }, { diff --git a/src/libs/actions/Welcome.ts b/src/libs/actions/Welcome.ts index 02109804efb9..fdf68b72fc3f 100644 --- a/src/libs/actions/Welcome.ts +++ b/src/libs/actions/Welcome.ts @@ -131,7 +131,7 @@ function show({routes, showCreateMenu = () => {}, showPopoverMenu = () => false} const workspaceChatReport = Object.values(allReports ?? {}).find((report) => { if (report) { - return ReportUtils.isPolicyExpenseChat(report) && report.ownerAccountID === currentUserAccountID && report.statusNum !== CONST.REPORT.STATUS.CLOSED; + return ReportUtils.isPolicyExpenseChat(report) && report.ownerAccountID === currentUserAccountID && report.statusNum !== CONST.REPORT.STATUS_NUM.CLOSED; } return false; }); diff --git a/src/pages/home/HeaderView.js b/src/pages/home/HeaderView.js index d3ec573b5886..4d77fb90622f 100644 --- a/src/pages/home/HeaderView.js +++ b/src/pages/home/HeaderView.js @@ -132,7 +132,7 @@ function HeaderView(props) { } // Task is not closed - if (props.report.stateNum !== CONST.REPORT.STATE_NUM.SUBMITTED && props.report.statusNum !== CONST.REPORT.STATUS.CLOSED && canModifyTask) { + if (props.report.stateNum !== CONST.REPORT.STATE_NUM.APPROVED && props.report.statusNum !== CONST.REPORT.STATUS_NUM.CLOSED && canModifyTask) { threeDotMenuItems.push({ icon: Expensicons.Trashcan, text: translate('common.cancel'), diff --git a/src/pages/home/ReportScreen.js b/src/pages/home/ReportScreen.js index 8e177e0c2e64..38ee1e81fc77 100644 --- a/src/pages/home/ReportScreen.js +++ b/src/pages/home/ReportScreen.js @@ -186,7 +186,7 @@ function ReportScreen({ // There are no reportActions at all to display and we are still in the process of loading the next set of actions. const isLoadingInitialReportActions = _.isEmpty(filteredReportActions) && reportMetadata.isLoadingInitialReportActions; - const isOptimisticDelete = lodashGet(report, 'statusNum') === CONST.REPORT.STATUS.CLOSED; + const isOptimisticDelete = lodashGet(report, 'statusNum') === CONST.REPORT.STATUS_NUM.CLOSED; const shouldHideReport = !ReportUtils.canAccessReport(report, policies, betas); @@ -358,8 +358,8 @@ function ReportScreen({ (prevOnyxReportID && prevOnyxReportID === routeReportID && !onyxReportID && - prevReport.statusNum === CONST.REPORT.STATUS.OPEN && - (report.statusNum === CONST.REPORT.STATUS.CLOSED || (!report.statusNum && !prevReport.parentReportID && prevReport.chatType === CONST.REPORT.CHAT_TYPE.POLICY_ROOM))) || + prevReport.statusNum === CONST.REPORT.STATUS_NUM.OPEN && + (report.statusNum === CONST.REPORT.STATUS_NUM.CLOSED || (!report.statusNum && !prevReport.parentReportID && prevReport.chatType === CONST.REPORT.CHAT_TYPE.POLICY_ROOM))) || ((ReportUtils.isMoneyRequest(prevReport) || ReportUtils.isMoneyRequestReport(prevReport)) && _.isEmpty(report)) ) { Navigation.dismissModal(); diff --git a/tests/actions/IOUTest.js b/tests/actions/IOUTest.js index 4d9ce42a08ce..492726b1865a 100644 --- a/tests/actions/IOUTest.js +++ b/tests/actions/IOUTest.js @@ -1237,9 +1237,8 @@ describe('actions/IOU', () => { expect(chatReport.pendingFields).toBeFalsy(); expect(iouReport.pendingFields).toBeFalsy(); - // expect(iouReport.status).toBe(CONST.REPORT.STATUS.SUBMITTED); - // expect(iouReport.stateNum).toBe(CONST.REPORT.STATE_NUM.SUBMITTED); - // expect(iouReport.state).toBe(CONST.REPORT.STATE.SUBMITTED); + // expect(iouReport.status).toBe(CONST.REPORT.STATUS_NUM.SUBMITTED); + // expect(iouReport.stateNum).toBe(CONST.REPORT.STATE_NUM.APPROVED); resolve(); }, @@ -1306,9 +1305,8 @@ describe('actions/IOU', () => { expect(chatReport.iouReportID).toBeFalsy(); - // expect(iouReport.status).toBe(CONST.REPORT.STATUS.REIMBURSED); - // expect(iouReport.state).toBe(CONST.REPORT.STATE.MANUALREIMBURSED); - // expect(iouReport.stateNum).toBe(CONST.REPORT.STATE_NUM.SUBMITTED); + // expect(iouReport.status).toBe(CONST.REPORT.STATUS_NUM.REIMBURSED); + // expect(iouReport.stateNum).toBe(CONST.REPORT.STATE_NUM.APPROVED); resolve(); }, @@ -1356,9 +1354,8 @@ describe('actions/IOU', () => { expect(chatReport.iouReportID).toBeFalsy(); - // expect(iouReport.status).toBe(CONST.REPORT.STATUS.REIMBURSED); - // expect(iouReport.state).toBe(CONST.REPORT.STATE.MANUALREIMBURSED); - // expect(iouReport.stateNum).toBe(CONST.REPORT.STATE_NUM.SUBMITTED); + // expect(iouReport.status).toBe(CONST.REPORT.STATUS_NUM.REIMBURSED); + // expect(iouReport.stateNum).toBe(CONST.REPORT.STATE_NUM.APPROVED); resolve(); }, @@ -1770,9 +1767,8 @@ describe('actions/IOU', () => { expect.objectContaining({ lastMessageHtml: `paid $${amount / 100}.00 with Expensify`, lastMessageText: `paid $${amount / 100}.00 with Expensify`, - state: CONST.REPORT.STATE.SUBMITTED, - statusNum: CONST.REPORT.STATUS.REIMBURSED, - stateNum: CONST.REPORT.STATE_NUM.PROCESSING, + statusNum: CONST.REPORT.STATUS_NUM.REIMBURSED, + stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, }), ); expect(updatedChatReport).toEqual( diff --git a/tests/unit/ReportUtilsTest.js b/tests/unit/ReportUtilsTest.js index d700aa4724f1..c9e8053e3146 100644 --- a/tests/unit/ReportUtilsTest.js +++ b/tests/unit/ReportUtilsTest.js @@ -149,8 +149,8 @@ describe('ReportUtils', () => { test('Archived', () => { const archivedAdminsRoom = { ...baseAdminsRoom, - statusNum: CONST.REPORT.STATUS.CLOSED, - stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.CLOSED, + stateNum: CONST.REPORT.STATE_NUM.APPROVED, }; expect(ReportUtils.getReportName(archivedAdminsRoom)).toBe('#admins (archived)'); @@ -172,8 +172,8 @@ describe('ReportUtils', () => { test('Archived', () => { const archivedPolicyRoom = { ...baseUserCreatedRoom, - statusNum: CONST.REPORT.STATUS.CLOSED, - stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.CLOSED, + stateNum: CONST.REPORT.STATE_NUM.APPROVED, }; expect(ReportUtils.getReportName(archivedPolicyRoom)).toBe('#VikingsChat (archived)'); @@ -213,8 +213,8 @@ describe('ReportUtils', () => { ownerAccountID: 1, policyID: policy.policyID, oldPolicyName: policy.name, - statusNum: CONST.REPORT.STATUS.CLOSED, - stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.CLOSED, + stateNum: CONST.REPORT.STATE_NUM.APPROVED, }; test('as member', () => { @@ -307,7 +307,7 @@ describe('ReportUtils', () => { managerID: currentUserAccountID, isUnreadWithMention: false, stateNum: CONST.REPORT.STATE_NUM.OPEN, - statusNum: CONST.REPORT.STATUS.OPEN, + statusNum: CONST.REPORT.STATUS_NUM.OPEN, }; expect(ReportUtils.requiresAttentionFromCurrentUser(report)).toBe(true); }); @@ -368,7 +368,7 @@ describe('ReportUtils', () => { const report = { ...LHNTestUtils.getFakeReport(), type: CONST.REPORT.TYPE.IOU, - statusNum: CONST.REPORT.STATUS.REIMBURSED, + statusNum: CONST.REPORT.STATUS_NUM.REIMBURSED, }; const moneyRequestOptions = ReportUtils.getMoneyRequestOptions(report, {}, [currentUserAccountID]); expect(moneyRequestOptions.length).toBe(0); @@ -378,8 +378,8 @@ describe('ReportUtils', () => { const report = { ...LHNTestUtils.getFakeReport(), type: CONST.REPORT.TYPE.EXPENSE, - stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, - statusNum: CONST.REPORT.STATUS.APPROVED, + stateNum: CONST.REPORT.STATE_NUM.APPROVED, + statusNum: CONST.REPORT.STATUS_NUM.APPROVED, }; const moneyRequestOptions = ReportUtils.getMoneyRequestOptions(report, {}, [currentUserAccountID]); expect(moneyRequestOptions.length).toBe(0); @@ -389,7 +389,7 @@ describe('ReportUtils', () => { const report = { ...LHNTestUtils.getFakeReport(), type: CONST.REPORT.TYPE.EXPENSE, - statusNum: CONST.REPORT.STATUS.REIMBURSED, + statusNum: CONST.REPORT.STATUS_NUM.REIMBURSED, }; const moneyRequestOptions = ReportUtils.getMoneyRequestOptions(report, {}, [currentUserAccountID]); expect(moneyRequestOptions.length).toBe(0); @@ -419,8 +419,8 @@ describe('ReportUtils', () => { const report = { ...LHNTestUtils.getFakeReport(), type: CONST.REPORT.TYPE.EXPENSE, - stateNum: CONST.REPORT.STATE_NUM.PROCESSING, - statusNum: CONST.REPORT.STATUS.SUBMITTED, + stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.SUBMITTED, parentReportID: '101', }; const paidPolicy = { @@ -508,7 +508,7 @@ describe('ReportUtils', () => { ...LHNTestUtils.getFakeReport(), type: CONST.REPORT.TYPE.EXPENSE, stateNum: CONST.REPORT.STATE_NUM.OPEN, - statusNum: CONST.REPORT.STATUS.OPEN, + statusNum: CONST.REPORT.STATUS_NUM.OPEN, parentReportID: '103', }; const paidPolicy = { @@ -523,9 +523,8 @@ describe('ReportUtils', () => { const report = { ...LHNTestUtils.getFakeReport(), type: CONST.REPORT.TYPE.IOU, - state: CONST.REPORT.STATE.SUBMITTED, - stateNum: CONST.REPORT.STATE_NUM.PROCESSING, - statusNum: CONST.REPORT.STATUS.SUBMITTED, + stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.SUBMITTED, }; const moneyRequestOptions = ReportUtils.getMoneyRequestOptions(report, {}, [currentUserAccountID, participantsAccountIDs[0]]); expect(moneyRequestOptions.length).toBe(1); @@ -536,9 +535,8 @@ describe('ReportUtils', () => { const report = { ...LHNTestUtils.getFakeReport(), type: CONST.REPORT.TYPE.IOU, - state: CONST.REPORT.STATE.SUBMITTED, - stateNum: CONST.REPORT.STATE_NUM.PROCESSING, - statusNum: CONST.REPORT.STATUS.SUBMITTED, + stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.SUBMITTED, }; const moneyRequestOptions = ReportUtils.getMoneyRequestOptions(report, {}, [currentUserAccountID, participantsAccountIDs[0]]); expect(moneyRequestOptions.length).toBe(1); diff --git a/tests/unit/SidebarFilterTest.js b/tests/unit/SidebarFilterTest.js index dd2985ea34a8..35d91e291666 100644 --- a/tests/unit/SidebarFilterTest.js +++ b/tests/unit/SidebarFilterTest.js @@ -471,20 +471,20 @@ describe('Sidebar', () => { // Given an archived chat report, an archived default policy room, and an archived user created policy room const archivedReport = { ...LHNTestUtils.getFakeReport([1, 2]), - statusNum: CONST.REPORT.STATUS.CLOSED, - stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.CLOSED, + stateNum: CONST.REPORT.STATE_NUM.APPROVED, }; const archivedPolicyRoomReport = { ...LHNTestUtils.getFakeReport([1, 2]), chatType: CONST.REPORT.CHAT_TYPE.POLICY_ANNOUNCE, - statusNum: CONST.REPORT.STATUS.CLOSED, - stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.CLOSED, + stateNum: CONST.REPORT.STATE_NUM.APPROVED, }; const archivedUserCreatedPolicyRoomReport = { ...LHNTestUtils.getFakeReport([1, 2]), chatType: CONST.REPORT.CHAT_TYPE.POLICY_ROOM, - statusNum: CONST.REPORT.STATUS.CLOSED, - stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.CLOSED, + stateNum: CONST.REPORT.STATE_NUM.APPROVED, }; LHNTestUtils.getDefaultRenderedSidebarLinks(); @@ -695,8 +695,8 @@ describe('Sidebar', () => { const report = { ...LHNTestUtils.getFakeReport(), lastVisibleActionCreated: '2022-11-22 03:48:27.267', - statusNum: CONST.REPORT.STATUS.CLOSED, - stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.CLOSED, + stateNum: CONST.REPORT.STATE_NUM.APPROVED, }; // Given the user is in all betas @@ -746,8 +746,8 @@ describe('Sidebar', () => { // Given an archived report that has all comments read const report = { ...LHNTestUtils.getFakeReport(), - statusNum: CONST.REPORT.STATUS.CLOSED, - stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.CLOSED, + stateNum: CONST.REPORT.STATE_NUM.APPROVED, }; // Given the user is in all betas @@ -795,8 +795,8 @@ describe('Sidebar', () => { const report = { ...LHNTestUtils.getFakeReport(), isPinned: false, - statusNum: CONST.REPORT.STATUS.CLOSED, - stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.CLOSED, + stateNum: CONST.REPORT.STATE_NUM.APPROVED, }; // Given the user is in all betas @@ -840,8 +840,8 @@ describe('Sidebar', () => { // Given an archived report that is not the active report const report = { ...LHNTestUtils.getFakeReport(), - statusNum: CONST.REPORT.STATUS.CLOSED, - stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.CLOSED, + stateNum: CONST.REPORT.STATE_NUM.APPROVED, }; // Given the user is in all betas diff --git a/tests/unit/SidebarOrderTest.js b/tests/unit/SidebarOrderTest.js index 44d6dd57de91..a6b0f4dba60d 100644 --- a/tests/unit/SidebarOrderTest.js +++ b/tests/unit/SidebarOrderTest.js @@ -255,7 +255,7 @@ describe('Sidebar', () => { reportName: taskReportName, managerID: 2, stateNum: CONST.REPORT.STATE_NUM.OPEN, - statusNum: CONST.REPORT.STATUS.OPEN, + statusNum: CONST.REPORT.STATUS_NUM.OPEN, }; // Each report has at least one ADDCOMMENT action so should be rendered in the LNH @@ -313,8 +313,8 @@ describe('Sidebar', () => { total: 10000, currency: 'USD', chatReportID: report3.reportID, - stateNum: CONST.REPORT.STATE_NUM.PROCESSING, - statusNum: CONST.REPORT.STATUS.SUBMITTED, + stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.SUBMITTED, }; report3.iouReportID = iouReport.reportID; @@ -374,9 +374,8 @@ describe('Sidebar', () => { policyName: 'Workspace', total: -10000, currency: 'USD', - state: CONST.REPORT.STATE.SUBMITTED, - stateNum: CONST.REPORT.STATE_NUM.PROCESSING, - statusNum: CONST.REPORT.STATUS.SUBMITTED, + stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.SUBMITTED, chatReportID: report3.reportID, parentReportID: report3.reportID, }; @@ -575,9 +574,8 @@ describe('Sidebar', () => { total: 10000, currency: 'USD', chatReportID: report3.reportID, - state: CONST.REPORT.STATE.SUBMITTED, - stateNum: CONST.REPORT.STATE_NUM.PROCESSING, - statusNum: CONST.REPORT.STATUS.SUBMITTED, + stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.SUBMITTED, }; report3.iouReportID = iouReport.reportID; const currentReportId = report2.reportID; @@ -740,8 +738,8 @@ describe('Sidebar', () => { const report1 = { ...LHNTestUtils.getFakeReport([1, 2]), chatType: CONST.REPORT.CHAT_TYPE.POLICY_ROOM, - statusNum: CONST.REPORT.STATUS.CLOSED, - stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.CLOSED, + stateNum: CONST.REPORT.STATE_NUM.APPROVED, }; const report2 = LHNTestUtils.getFakeReport([3, 4]); const report3 = LHNTestUtils.getFakeReport([5, 6]); @@ -837,8 +835,8 @@ describe('Sidebar', () => { const report1 = { ...LHNTestUtils.getFakeReport([1, 2], 3, true), chatType: CONST.REPORT.CHAT_TYPE.POLICY_ROOM, - statusNum: CONST.REPORT.STATUS.CLOSED, - stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.CLOSED, + stateNum: CONST.REPORT.STATE_NUM.APPROVED, }; const report2 = LHNTestUtils.getFakeReport([3, 4], 2, true); const report3 = LHNTestUtils.getFakeReport([5, 6], 1, true); @@ -914,8 +912,8 @@ describe('Sidebar', () => { total: 10000, currency: 'USD', chatReportID: report3.reportID, - stateNum: CONST.REPORT.STATE_NUM.PROCESSING, - statusNum: CONST.REPORT.STATUS.SUBMITTED, + stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.SUBMITTED, }; const iouReport2 = { ...LHNTestUtils.getFakeReport([9, 10]), @@ -926,8 +924,8 @@ describe('Sidebar', () => { total: 10000, currency: 'USD', chatReportID: report3.reportID, - stateNum: CONST.REPORT.STATE_NUM.PROCESSING, - statusNum: CONST.REPORT.STATUS.SUBMITTED, + stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.SUBMITTED, }; const iouReport3 = { ...LHNTestUtils.getFakeReport([11, 12]), @@ -938,8 +936,8 @@ describe('Sidebar', () => { total: 100000, currency: 'USD', chatReportID: report3.reportID, - stateNum: CONST.REPORT.STATE_NUM.PROCESSING, - statusNum: CONST.REPORT.STATUS.SUBMITTED, + stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.SUBMITTED, }; const iouReport4 = { ...LHNTestUtils.getFakeReport([11, 12]), @@ -950,8 +948,8 @@ describe('Sidebar', () => { total: 10000, currency: 'USD', chatReportID: report3.reportID, - stateNum: CONST.REPORT.STATE_NUM.PROCESSING, - statusNum: CONST.REPORT.STATUS.SUBMITTED, + stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.SUBMITTED, }; const iouReport5 = { ...LHNTestUtils.getFakeReport([11, 12]), @@ -962,8 +960,8 @@ describe('Sidebar', () => { total: 10000, currency: 'USD', chatReportID: report3.reportID, - stateNum: CONST.REPORT.STATE_NUM.PROCESSING, - statusNum: CONST.REPORT.STATUS.SUBMITTED, + stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.SUBMITTED, }; report1.iouReportID = iouReport1.reportID; diff --git a/tests/unit/SidebarTest.js b/tests/unit/SidebarTest.js index 106b2c3b69a9..09d3905fe86a 100644 --- a/tests/unit/SidebarTest.js +++ b/tests/unit/SidebarTest.js @@ -51,8 +51,8 @@ describe('Sidebar', () => { const report = { ...LHNTestUtils.getFakeReport(['email1@test.com', 'email2@test.com'], 3, true), chatType: CONST.REPORT.CHAT_TYPE.POLICY_ROOM, - statusNum: CONST.REPORT.STATUS.CLOSED, - stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.CLOSED, + stateNum: CONST.REPORT.STATE_NUM.APPROVED, }; // Given the user is in all betas @@ -86,8 +86,8 @@ describe('Sidebar', () => { ...LHNTestUtils.getFakeReport(['email1@test.com', 'email2@test.com'], 3, true), policyName: 'Vikings Policy', chatType: CONST.REPORT.CHAT_TYPE.POLICY_ROOM, - statusNum: CONST.REPORT.STATUS.CLOSED, - stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.CLOSED, + stateNum: CONST.REPORT.STATE_NUM.APPROVED, }; const action = { ...LHNTestUtils.getFakeReportAction('email1@test.com', 3, true), diff --git a/tests/utils/LHNTestUtils.js b/tests/utils/LHNTestUtils.js index a80feae730c6..0507a671358a 100644 --- a/tests/utils/LHNTestUtils.js +++ b/tests/utils/LHNTestUtils.js @@ -209,8 +209,8 @@ function getAdvancedFakeReport(isArchived, isUserCreatedPolicyRoom, hasAddWorksp ...getFakeReport([1, 2], 0, isUnread), type: CONST.REPORT.TYPE.CHAT, chatType: isUserCreatedPolicyRoom ? CONST.REPORT.CHAT_TYPE.POLICY_ROOM : CONST.REPORT.CHAT_TYPE.POLICY_ADMINS, - statusNum: isArchived ? CONST.REPORT.STATUS.CLOSED : 0, - stateNum: isArchived ? CONST.REPORT.STATE_NUM.SUBMITTED : 0, + statusNum: isArchived ? CONST.REPORT.STATUS_NUM.CLOSED : 0, + stateNum: isArchived ? CONST.REPORT.STATE_NUM.APPROVED : 0, errorFields: hasAddWorkspaceError ? {addWorkspaceRoom: 'blah'} : null, isPinned, hasDraft, From b93661414bdaa7f0bb24da494a75b0c4777c1b56 Mon Sep 17 00:00:00 2001 From: Vit Horacek Date: Sun, 31 Dec 2023 15:57:34 +0100 Subject: [PATCH 163/583] remove the state from the Report type --- src/types/onyx/Report.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/types/onyx/Report.ts b/src/types/onyx/Report.ts index b274025908f5..9db1de108885 100644 --- a/src/types/onyx/Report.ts +++ b/src/types/onyx/Report.ts @@ -83,9 +83,6 @@ type Report = { /** ID of the chat report */ chatReportID?: string; - /** The state of the report */ - state?: ValueOf; - /** The state that the report is currently in */ stateNum?: ValueOf; From 3877497f806050a569941170a219cc299ac79eb7 Mon Sep 17 00:00:00 2001 From: Vit Horacek Date: Sun, 31 Dec 2023 16:09:25 +0100 Subject: [PATCH 164/583] Prettier --- src/libs/ReportUtils.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 99a3ec6d796a..40101feb6d40 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -529,7 +529,9 @@ function isCanceledTaskReport(report: OnyxEntry | EmptyObject = {}, pare * @param parentReportAction - The parent report action of the report (Used to check if the task has been canceled) */ function isOpenTaskReport(report: OnyxEntry, parentReportAction: OnyxEntry | EmptyObject = {}): boolean { - return isTaskReport(report) && !isCanceledTaskReport(report, parentReportAction) && report?.stateNum === CONST.REPORT.STATE_NUM.OPEN && report?.statusNum === CONST.REPORT.STATUS_NUM.OPEN; + return ( + isTaskReport(report) && !isCanceledTaskReport(report, parentReportAction) && report?.stateNum === CONST.REPORT.STATE_NUM.OPEN && report?.statusNum === CONST.REPORT.STATUS_NUM.OPEN + ); } /** From a5d07180966c77bdd0d2e5d3e358d8a6911161c0 Mon Sep 17 00:00:00 2001 From: Vit Horacek Date: Sun, 31 Dec 2023 16:20:52 +0100 Subject: [PATCH 165/583] Fix the statenum const --- src/CONST.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CONST.ts b/src/CONST.ts index 15cb361eb5db..62e79ec62400 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -628,7 +628,7 @@ const CONST = { }, STATE_NUM: { OPEN: 0, - PROCESSING: 1, + SUBMITTED: 1, APPROVED: 2, BILLING: 3, }, From 02d8deb0c84212f158c95194067b7bd23cc5f52b Mon Sep 17 00:00:00 2001 From: Vit Horacek Date: Sun, 31 Dec 2023 16:29:07 +0100 Subject: [PATCH 166/583] Fix type issues --- src/libs/E2E/apiMocks/openApp.ts | 4 ++-- src/libs/ReportUtils.ts | 4 +--- src/types/onyx/Report.ts | 2 +- src/types/onyx/ReportAction.ts | 2 +- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/libs/E2E/apiMocks/openApp.ts b/src/libs/E2E/apiMocks/openApp.ts index 42d13716407d..4c12a95a1db4 100644 --- a/src/libs/E2E/apiMocks/openApp.ts +++ b/src/libs/E2E/apiMocks/openApp.ts @@ -2043,10 +2043,10 @@ const openApp = (): Response => ({ managerID: 16, currency: 'USD', chatReportID: '98817646', - state: 'SUBMITTED', cachedTotal: '($1,473.11)', total: 147311, stateNum: 1, + statusNum: 1, }, report_4249286573496381: { reportID: '4249286573496381', @@ -2054,10 +2054,10 @@ const openApp = (): Response => ({ managerID: 21, currency: 'USD', chatReportID: '4867098979334014', - state: 'SUBMITTED', cachedTotal: '($212.78)', total: 21278, stateNum: 1, + statusNum: 1, }, }, }, diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 40101feb6d40..5c5fe45fc811 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -109,7 +109,6 @@ type OptimisticExpenseReport = Pick< | 'ownerAccountID' | 'currency' | 'reportName' - | 'state' | 'stateNum' | 'statusNum' | 'total' @@ -300,13 +299,12 @@ type OptimisticIOUReport = Pick< | 'ownerAccountID' | 'participantAccountIDs' | 'reportID' - | 'state' | 'stateNum' + | 'statusNum' | 'total' | 'reportName' | 'notificationPreference' | 'parentReportID' - | 'statusNum' | 'lastVisibleActionCreated' >; type DisplayNameWithTooltips = Array>; diff --git a/src/types/onyx/Report.ts b/src/types/onyx/Report.ts index 9db1de108885..607c303f1abb 100644 --- a/src/types/onyx/Report.ts +++ b/src/types/onyx/Report.ts @@ -87,7 +87,7 @@ type Report = { stateNum?: ValueOf; /** The status of the current report */ - statusNum?: ValueOf; + statusNum?: ValueOf; /** Which user role is capable of posting messages on the report */ writeCapability?: WriteCapability; diff --git a/src/types/onyx/ReportAction.ts b/src/types/onyx/ReportAction.ts index a881b63fbb95..df4248b90d09 100644 --- a/src/types/onyx/ReportAction.ts +++ b/src/types/onyx/ReportAction.ts @@ -148,7 +148,7 @@ type ReportActionBase = { childManagerAccountID?: number; /** The status of the child report */ - childStatusNum?: ValueOf; + childStatusNum?: ValueOf; /** Report action child status name */ childStateNum?: ValueOf; From 0b7592d8efb3242816eb5aebba4120dc22e9a131 Mon Sep 17 00:00:00 2001 From: Sibtain Ali Date: Tue, 2 Jan 2024 11:55:17 +0500 Subject: [PATCH 167/583] fix: lint issues --- src/CONST.ts | 2 + .../ReportActionItem/MoneyReportView.tsx | 61 +++++++++++-------- src/libs/ReportUtils.ts | 2 +- src/pages/home/report/ReportActionItem.js | 2 +- 4 files changed, 38 insertions(+), 29 deletions(-) diff --git a/src/CONST.ts b/src/CONST.ts index abba27b0c33b..e0479869987b 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -1427,6 +1427,8 @@ const CONST = { INVISIBLE_CHARACTERS_GROUPS: /[\p{C}\p{Z}]/gu, OTHER_INVISIBLE_CHARACTERS: /[\u3164]/g, + + REPORT_FIELD_TITLE: /{report:([a-zA-Z]+)}/g, }, PRONOUNS: { diff --git a/src/components/ReportActionItem/MoneyReportView.tsx b/src/components/ReportActionItem/MoneyReportView.tsx index 2ffbda4d347b..9ad9e73244f3 100644 --- a/src/components/ReportActionItem/MoneyReportView.tsx +++ b/src/components/ReportActionItem/MoneyReportView.tsx @@ -1,12 +1,13 @@ -import React, { useMemo } from 'react'; +import React, {useMemo} from 'react'; import {StyleProp, TextStyle, View} from 'react-native'; import Icon from '@components/Icon'; import * as Expensicons from '@components/Icon/Expensicons'; -import SpacerView from '@components/SpacerView'; -import OfflineWithFeedback from '@components/OfflineWithFeedback'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; +import OfflineWithFeedback from '@components/OfflineWithFeedback'; +import SpacerView from '@components/SpacerView'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; +import usePermissions from '@hooks/usePermissions'; import useStyleUtils from '@hooks/useStyleUtils'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; @@ -16,7 +17,6 @@ import * as ReportUtils from '@libs/ReportUtils'; import AnimatedEmptyStateBackground from '@pages/home/report/AnimatedEmptyStateBackground'; import variables from '@styles/variables'; import type {PolicyReportField, Report} from '@src/types/onyx'; -import usePermissions from '@hooks/usePermissions'; type MoneyReportViewProps = { /** The report currently being looked at */ @@ -52,34 +52,41 @@ function MoneyReportView({report, policyReportFields, shouldShowHorizontalRule}: StyleUtils.getColorStyle(theme.textSupporting), ]; - const sortedPolicyReportFields = useMemo(() => policyReportFields.sort(({orderWeight: firstOrderWeight}, {orderWeight: secondOrderWeight}) => firstOrderWeight - secondOrderWeight), [policyReportFields]); + const sortedPolicyReportFields = useMemo( + () => policyReportFields.sort(({orderWeight: firstOrderWeight}, {orderWeight: secondOrderWeight}) => firstOrderWeight - secondOrderWeight), + [policyReportFields], + ); return ( - {canUseReportFields && sortedPolicyReportFields.map((reportField) => { - const title = ReportUtils.getReportFieldTitle(report, reportField); - return ( - - {}} - shouldShowRightIcon - disabled={false} - wrapperStyle={[styles.pv2, styles.taskDescriptionMenuItem]} - shouldGreyOutWhenDisabled={false} - numberOfLinesTitle={0} - interactive - shouldStackHorizontally={false} - onSecondaryInteraction={() => {}} - hoverAndPressStyle={false} - titleWithTooltips={[]} - /> - - ); - })} + {canUseReportFields && + sortedPolicyReportFields.map((reportField) => { + const title = ReportUtils.getReportFieldTitle(report, reportField); + return ( + + {}} + shouldShowRightIcon + disabled={false} + wrapperStyle={[styles.pv2, styles.taskDescriptionMenuItem]} + shouldGreyOutWhenDisabled={false} + numberOfLinesTitle={0} + interactive + shouldStackHorizontally={false} + onSecondaryInteraction={() => {}} + hoverAndPressStyle={false} + titleWithTooltips={[]} + /> + + ); + })} , reportField: PolicyRepor return value; } - return value.replaceAll(/{report:([a-zA-Z]+)}/g, (match, property) => { + return value.replaceAll(CONST.REGEX.REPORT_FIELD_TITLE, (match, property) => { if (report && property in report) { return report[property as keyof Report]?.toString() ?? match; } diff --git a/src/pages/home/report/ReportActionItem.js b/src/pages/home/report/ReportActionItem.js index 4e806faa1b47..a16ba6132ebc 100644 --- a/src/pages/home/report/ReportActionItem.js +++ b/src/pages/home/report/ReportActionItem.js @@ -761,7 +761,7 @@ export default compose( initialValue: {}, }, policyReportFields: { - key: ({report}) => report && 'policyID' in report ? `${ONYXKEYS.COLLECTION.POLICY_REPORT_FIELDS}${report.policyID}` : undefined, + key: ({report}) => (report && 'policyID' in report ? `${ONYXKEYS.COLLECTION.POLICY_REPORT_FIELDS}${report.policyID}` : undefined), initialValue: [], }, emojiReactions: { From dfc4437ced35ece42469ea96b87bf60522f69ec3 Mon Sep 17 00:00:00 2001 From: Ishpaul Singh Date: Tue, 2 Jan 2024 12:35:22 +0530 Subject: [PATCH 168/583] clean up --- src/CONST.ts | 3 +-- ...nItemButttons.tsx => ActionItemButtons.tsx} | 8 ++++---- src/languages/en.ts | 2 +- src/languages/es.ts | 7 +++---- src/libs/actions/Report.ts | 8 ++++---- src/pages/home/report/ReportActionItem.js | 18 +++++++++--------- src/types/onyx/OriginalMessage.ts | 6 +++--- 7 files changed, 25 insertions(+), 27 deletions(-) rename src/components/ReportActionItem/{ActionItemButttons.tsx => ActionItemButtons.tsx} (80%) diff --git a/src/CONST.ts b/src/CONST.ts index 13792d01449a..dd0f607ac08c 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -523,7 +523,7 @@ const CONST = { TASKCOMPLETED: 'TASKCOMPLETED', TASKEDITED: 'TASKEDITED', TASKREOPENED: 'TASKREOPENED', - MENTIONWHISPER: 'ACTIONABLEMENTIONWHISPER', + ACTIONABLEMENTIONWHISPER: 'ACTIONABLEMENTIONWHISPER', POLICYCHANGELOG: { ADD_APPROVER_RULE: 'POLICYCHANGELOG_ADD_APPROVER_RULE', ADD_BUDGET: 'POLICYCHANGELOG_ADD_BUDGET', @@ -599,7 +599,6 @@ const CONST = { RESOLUTIONS: { INVITE: 'invited', NOTHING: 'nothing', - UNRESOLVED: 'unresolved', }, ARCHIVE_REASON: { DEFAULT: 'default', diff --git a/src/components/ReportActionItem/ActionItemButttons.tsx b/src/components/ReportActionItem/ActionItemButtons.tsx similarity index 80% rename from src/components/ReportActionItem/ActionItemButttons.tsx rename to src/components/ReportActionItem/ActionItemButtons.tsx index 77f018d11698..0dd4c75b9771 100644 --- a/src/components/ReportActionItem/ActionItemButttons.tsx +++ b/src/components/ReportActionItem/ActionItemButtons.tsx @@ -10,11 +10,11 @@ type ActionItem = { text: string; }; -type ActionItemButttonsProps = { +type ActionItemButtonsProps = { items: ActionItem[]; }; -function ActionItemButttons(props: ActionItemButttonsProps) { +function ActionItemButtons(props: ActionItemButtonsProps) { const styles = useThemeStyles(); return ( @@ -33,6 +33,6 @@ function ActionItemButttons(props: ActionItemButttonsProps) { ); } -ActionItemButttons.displayName = 'ActionItemButtton'; +ActionItemButtons.displayName = 'ActionItemButtton'; -export default ActionItemButttons; +export default ActionItemButtons; diff --git a/src/languages/en.ts b/src/languages/en.ts index e357feb8e3b2..56c9608f2f46 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -1931,7 +1931,7 @@ export default { levelTwoResult: 'Message hidden from channel, plus anonymous warning and message is reported for review.', levelThreeResult: 'Message removed from channel plus anonymous warning and message is reported for review.', }, - actionableWhisperItems: { + actionableMentionWhisperOptions: { invite: 'Invite them', nothing: 'Do nothing', }, diff --git a/src/languages/es.ts b/src/languages/es.ts index 5cba65d03f09..73fef57d811a 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -2395,10 +2395,9 @@ export default { copy: 'Copiar', copied: '¡Copiado!', }, - actionableWhisperItems: { - // Todo: ask for translation - invite: 'Invite them', - nothing: 'Do nothing', + actionableMentionWhisperOptions: { + invite: 'Invitar', + nothing: 'No hacer nada', }, moderation: { flagDescription: 'Todos los mensajes marcados se enviarán a un moderador para su revisión.', diff --git a/src/libs/actions/Report.ts b/src/libs/actions/Report.ts index e7795d750e19..4c6bbe88d36c 100644 --- a/src/libs/actions/Report.ts +++ b/src/libs/actions/Report.ts @@ -2522,7 +2522,7 @@ function clearNewRoomFormError() { }); } -function resolveMentionWhisper(reportId: string, reportActionID: string, resolution: ValueOf) { +function resolveActionableMentionWhisper(reportId: string, reportActionID: string, resolution: ValueOf) { const optimisticData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, @@ -2551,12 +2551,12 @@ function resolveMentionWhisper(reportId: string, reportActionID: string, resolut }, ]; - type ResolveMentionWhisperParameters = { + type ResolveActionableMentionWhisperParams = { reportActionID: string; resolution: ValueOf; }; - const parameters: ResolveMentionWhisperParameters = { + const parameters: ResolveActionableMentionWhisperParams = { reportActionID, resolution, }; @@ -2625,5 +2625,5 @@ export { savePrivateNotesDraft, getDraftPrivateNote, clearNewRoomFormError, - resolveMentionWhisper, + resolveActionableMentionWhisper, }; diff --git a/src/pages/home/report/ReportActionItem.js b/src/pages/home/report/ReportActionItem.js index 35736d007a04..b86f259695c5 100644 --- a/src/pages/home/report/ReportActionItem.js +++ b/src/pages/home/report/ReportActionItem.js @@ -17,7 +17,7 @@ import PressableWithSecondaryInteraction from '@components/PressableWithSecondar import EmojiReactionsPropTypes from '@components/Reactions/EmojiReactionsPropTypes'; import ReportActionItemEmojiReactions from '@components/Reactions/ReportActionItemEmojiReactions'; import RenderHTML from '@components/RenderHTML'; -import ActionItemButttons from '@components/ReportActionItem/ActionItemButttons'; +import ActionItemButtons from '@components/ReportActionItem/ActionItemButtons'; import ChronosOOOListActions from '@components/ReportActionItem/ChronosOOOListActions'; import MoneyReportView from '@components/ReportActionItem/MoneyReportView'; import MoneyRequestAction from '@components/ReportActionItem/MoneyRequestAction'; @@ -468,19 +468,19 @@ function ReportActionItem(props) { )} - {lodashGet(props, 'action.actionName', '') === CONST.REPORT.ACTIONS.TYPE.MENTIONWHISPER && !lodashGet(props, 'action.originalMessage.resolution', null) && ( - Report.resolveMentionWhisper(props.report.reportID, props.action.reportActionID, CONST.REPORT.RESOLUTIONS.INVITE), + text: props.translate('actionableMentionWhisperOptions.invite'), + key: `${props.action.reportActionID}-actionableMentionWhisper-${CONST.REPORT.RESOLUTIONS.INVITE}`, + onPress: () => Report.resolveActionableMentionWhisper(props.report.reportID, props.action.reportActionID, CONST.REPORT.RESOLUTIONS.INVITE), isPrimary: true, }, { - text: props.translate('actionableWhisperItems.nothing'), - key: 'nothing', - onPress: () => Report.resolveMentionWhisper(props.report.reportID, props.action.reportActionID, CONST.REPORT.RESOLUTIONS.NOTHING), + text: props.translate('actionableMentionWhisperOptions.nothing'), + key: `${props.action.reportActionID}-actionableMentionWhisper-${CONST.REPORT.RESOLUTIONS.NOTHING}`, + onPress: () => Report.resolveActionableMentionWhisper(props.report.reportID, props.action.reportActionID, CONST.REPORT.RESOLUTIONS.NOTHING), }, ]} /> diff --git a/src/types/onyx/OriginalMessage.ts b/src/types/onyx/OriginalMessage.ts index 8ee10ea88fd8..1f565f5ae251 100644 --- a/src/types/onyx/OriginalMessage.ts +++ b/src/types/onyx/OriginalMessage.ts @@ -110,8 +110,8 @@ type OriginalMessageAddComment = { }; }; -type OriginalMessageActionableWhisper = { - actionName: typeof CONST.REPORT.ACTIONS.TYPE.MENTIONWHISPER; +type OriginalMessageActionableMentionWhisper = { + actionName: typeof CONST.REPORT.ACTIONS.TYPE.ACTIONABLEMENTIONWHISPER; originalMessage: { inviteeAccountIDs: number[]; inviteeEmails: string; @@ -251,7 +251,7 @@ type OriginalMessage = | OriginalMessageApproved | OriginalMessageIOU | OriginalMessageAddComment - | OriginalMessageActionableWhisper + | OriginalMessageActionableMentionWhisper | OriginalMessageSubmitted | OriginalMessageClosed | OriginalMessageCreated From 241b0fb7d5ada60794dcfffaeda5fac8f0f60582 Mon Sep 17 00:00:00 2001 From: Ishpaul Singh Date: Tue, 2 Jan 2024 12:40:57 +0530 Subject: [PATCH 169/583] lint fix --- src/libs/actions/Report.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libs/actions/Report.ts b/src/libs/actions/Report.ts index 4c6bbe88d36c..14f5261b54c4 100644 --- a/src/libs/actions/Report.ts +++ b/src/libs/actions/Report.ts @@ -2560,6 +2560,7 @@ function resolveActionableMentionWhisper(reportId: string, reportActionID: strin reportActionID, resolution, }; + API.write('ResolveActionableMentionWhisper', parameters, {optimisticData, failureData}); } From 8366b87a2cd6a717bca23f1ea9db38dcaa07783a Mon Sep 17 00:00:00 2001 From: Ishpaul Singh Date: Tue, 2 Jan 2024 12:46:33 +0530 Subject: [PATCH 170/583] prettier diffs --- src/pages/home/report/ReportActionItem.js | 35 ++++++++++++----------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/pages/home/report/ReportActionItem.js b/src/pages/home/report/ReportActionItem.js index b86f259695c5..21ce6c33a3a5 100644 --- a/src/pages/home/report/ReportActionItem.js +++ b/src/pages/home/report/ReportActionItem.js @@ -468,23 +468,24 @@ function ReportActionItem(props) { )} - {lodashGet(props, 'action.actionName', '') === CONST.REPORT.ACTIONS.TYPE.ACTIONABLEMENTIONWHISPER && !lodashGet(props, 'action.originalMessage.resolution', null) && ( - Report.resolveActionableMentionWhisper(props.report.reportID, props.action.reportActionID, CONST.REPORT.RESOLUTIONS.INVITE), - isPrimary: true, - }, - { - text: props.translate('actionableMentionWhisperOptions.nothing'), - key: `${props.action.reportActionID}-actionableMentionWhisper-${CONST.REPORT.RESOLUTIONS.NOTHING}`, - onPress: () => Report.resolveActionableMentionWhisper(props.report.reportID, props.action.reportActionID, CONST.REPORT.RESOLUTIONS.NOTHING), - }, - ]} - /> - )} + {lodashGet(props, 'action.actionName', '') === CONST.REPORT.ACTIONS.TYPE.ACTIONABLEMENTIONWHISPER && + !lodashGet(props, 'action.originalMessage.resolution', null) && ( + Report.resolveActionableMentionWhisper(props.report.reportID, props.action.reportActionID, CONST.REPORT.RESOLUTIONS.INVITE), + isPrimary: true, + }, + { + text: props.translate('actionableMentionWhisperOptions.nothing'), + key: `${props.action.reportActionID}-actionableMentionWhisper-${CONST.REPORT.RESOLUTIONS.NOTHING}`, + onPress: () => Report.resolveActionableMentionWhisper(props.report.reportID, props.action.reportActionID, CONST.REPORT.RESOLUTIONS.NOTHING), + }, + ]} + /> + )} ) : ( Date: Tue, 2 Jan 2024 11:26:38 +0100 Subject: [PATCH 171/583] add reportID to original message --- src/libs/ReportUtils.ts | 3 ++- src/libs/actions/IOU.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 331fc03990bb..3f735e130c2d 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -2800,13 +2800,14 @@ function buildOptimisticSubmittedReportAction(amount: number, currency: string, * Builds an optimistic REIMBURSEMENTDEQUEUED report action with a randomly generated reportActionID. * */ -function buildOptimisticCancelPaymentReportAction(): OptimisticCancelPaymentReportAction { +function buildOptimisticCancelPaymentReportAction(expenseReportID: string): OptimisticCancelPaymentReportAction { return { actionName: CONST.REPORT.ACTIONS.TYPE.REIMBURSEMENTDEQUEUED, actorAccountID: currentUserAccountID, message: [ { cancellationReason: CONST.REPORT.CANCEL_PAYMENT_REASONS.ADMIN, + expenseReportID, type: CONST.REPORT.MESSAGE.TYPE.COMMENT, text: '', }, diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index add8bded5e25..337c69764ecf 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -3119,7 +3119,7 @@ function submitReport(expenseReport) { * @param {Object} chatReport */ function cancelPayment(expenseReport, chatReport) { - const optimisticReportAction = ReportUtils.buildOptimisticCancelPaymentReportAction(); + const optimisticReportAction = ReportUtils.buildOptimisticCancelPaymentReportAction(expenseReport.reportID); const policy = ReportUtils.getPolicy(chatReport.policyID); const isFree = policy && policy.type === CONST.POLICY.TYPE.FREE; const optimisticData = [ From c7518ab4c8f6942c6b8cc88fa0214745dc3191b2 Mon Sep 17 00:00:00 2001 From: Alberto Date: Tue, 2 Jan 2024 11:40:42 +0100 Subject: [PATCH 172/583] copy correct message --- src/libs/ReportUtils.ts | 1 + src/pages/home/report/ContextMenu/ContextMenuActions.js | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 3f735e130c2d..d3c4a7d0a01d 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -2814,6 +2814,7 @@ function buildOptimisticCancelPaymentReportAction(expenseReportID: string): Opti ], originalMessage: { cancellationReason: CONST.REPORT.CANCEL_PAYMENT_REASONS.ADMIN, + expenseReportID, }, person: [ { diff --git a/src/pages/home/report/ContextMenu/ContextMenuActions.js b/src/pages/home/report/ContextMenu/ContextMenuActions.js index f1a46785a59a..dec687e06688 100644 --- a/src/pages/home/report/ContextMenu/ContextMenuActions.js +++ b/src/pages/home/report/ContextMenu/ContextMenuActions.js @@ -291,7 +291,13 @@ export default [ } else if (ReportActionsUtils.isModifiedExpenseAction(reportAction)) { const modifyExpenseMessage = ModifiedExpenseMessage.getForReportAction(reportAction); Clipboard.setString(modifyExpenseMessage); - } else if (ReportActionsUtils.isMoneyRequestAction(reportAction)) { + }else if (ReportActionUtils.isReimbursementDeQueuedAction(reportAction)) { + const {expenseReportID} = reportAction.originalMessage; + const expenseReport = ReportUtils.getReport(expenseReportID); + console.log(reportAction); + const displayMessage = ReportUtils.getReimbursementDeQueuedActionMessage(reportAction, expenseReport); + Clipboard.setString(displayMessage); + }else if (ReportActionsUtils.isMoneyRequestAction(reportAction)) { const displayMessage = ReportUtils.getIOUReportActionDisplayMessage(reportAction); Clipboard.setString(displayMessage); } else if (ReportActionsUtils.isCreatedTaskReportAction(reportAction)) { From 7a119c9155eca1d83ab5e4b1844f1e9b7a9eb910 Mon Sep 17 00:00:00 2001 From: Alberto Date: Tue, 2 Jan 2024 11:42:58 +0100 Subject: [PATCH 173/583] typo --- src/pages/home/report/ContextMenu/ContextMenuActions.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/pages/home/report/ContextMenu/ContextMenuActions.js b/src/pages/home/report/ContextMenu/ContextMenuActions.js index dec687e06688..c465035b2a25 100644 --- a/src/pages/home/report/ContextMenu/ContextMenuActions.js +++ b/src/pages/home/report/ContextMenu/ContextMenuActions.js @@ -291,10 +291,9 @@ export default [ } else if (ReportActionsUtils.isModifiedExpenseAction(reportAction)) { const modifyExpenseMessage = ModifiedExpenseMessage.getForReportAction(reportAction); Clipboard.setString(modifyExpenseMessage); - }else if (ReportActionUtils.isReimbursementDeQueuedAction(reportAction)) { + }else if (ReportActionsUtils.isReimbursementDeQueuedAction(reportAction)) { const {expenseReportID} = reportAction.originalMessage; const expenseReport = ReportUtils.getReport(expenseReportID); - console.log(reportAction); const displayMessage = ReportUtils.getReimbursementDeQueuedActionMessage(reportAction, expenseReport); Clipboard.setString(displayMessage); }else if (ReportActionsUtils.isMoneyRequestAction(reportAction)) { From 1097bc162b74897bf2418319df6df306b6dbeee3 Mon Sep 17 00:00:00 2001 From: cdOut <88325488+cdOut@users.noreply.github.com> Date: Tue, 2 Jan 2024 11:59:22 +0100 Subject: [PATCH 174/583] add review suggested changes --- assets/emojis/common.ts | 2 +- src/libs/actions/Policy.ts | 595 +++++++++++++++++++++---------------- 2 files changed, 348 insertions(+), 249 deletions(-) diff --git a/assets/emojis/common.ts b/assets/emojis/common.ts index 8d2fded0a4a1..cbefb21cf2d6 100644 --- a/assets/emojis/common.ts +++ b/assets/emojis/common.ts @@ -91,7 +91,7 @@ const emojis: PickerEmojis = [ code: '😊', }, { - name: ':innocent:', + name: 'innocent', code: '😇', }, { diff --git a/src/libs/actions/Policy.ts b/src/libs/actions/Policy.ts index d8e1806d801d..8da49639ad9f 100644 --- a/src/libs/actions/Policy.ts +++ b/src/libs/actions/Policy.ts @@ -257,7 +257,14 @@ function deleteWorkspace(policyID: string, reports: Report[], policyName: string // We don't need success data since the push notification will update // the onyxData for all connected clients. const successData: OnyxUpdate[] = []; - API.write('DeleteWorkspace', {policyID}, {optimisticData, successData, failureData}); + + type DeleteWorkspaceParams = { + policyID: string; + }; + + const params: DeleteWorkspaceParams = {policyID}; + + API.write('DeleteWorkspace', params, {optimisticData, successData, failureData}); // Reset the lastAccessedWorkspacePolicyID if (policyID === lastAccessedWorkspacePolicyID) { @@ -354,6 +361,7 @@ function removeMembers(accountIDs: number[], policyID: string) { return; } + const membersListKey = `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}` as const; const policy = ReportUtils.getPolicy(policyID); const workspaceChats = ReportUtils.getWorkspaceChats(policyID, accountIDs); const optimisticClosedReportActions = workspaceChats.map(() => ReportUtils.buildOptimisticClosedReportAction(sessionEmail, policy.name, CONST.REPORT.ARCHIVE_REASON.REMOVED_FROM_POLICY)); @@ -372,7 +380,7 @@ function removeMembers(accountIDs: number[], policyID: string) { const optimisticData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, + key: membersListKey, value: optimisticMembersState, }, ...workspaceChats.map((report) => ({ @@ -397,7 +405,6 @@ function removeMembers(accountIDs: number[], policyID: string) { // If we delete all these logins then we should clear the informative messages since they are no longer relevant. if (isNotEmptyObject(policy?.primaryLoginsInvited ?? {})) { // Take the current policy members and remove them optimistically - // console.log('POLICYMEMBERS', allPolicyMembers); const policyMemberAccountIDs = Object.keys(allPolicyMembers?.[`${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`] ?? {}).map((accountID) => parseInt(accountID)); const remainingMemberAccountIDs = policyMemberAccountIDs.filter((e) => !accountIDs.includes(Number(e))); const remainingLogins: string[] = PersonalDetailsUtils.getLoginsByAccountIDs(remainingMemberAccountIDs); @@ -411,7 +418,7 @@ function removeMembers(accountIDs: number[], policyID: string) { if (!remainingLogins.some((remainingLogin) => Boolean(invitedPrimaryToSecondaryLogins[remainingLogin]))) { optimisticData.push({ onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + key: membersListKey, value: { primaryLoginsInvited: null, }, @@ -422,7 +429,7 @@ function removeMembers(accountIDs: number[], policyID: string) { const successData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, + key: membersListKey, value: successMembersState, }, ]; @@ -431,7 +438,7 @@ function removeMembers(accountIDs: number[], policyID: string) { const failureData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, + key: membersListKey, value: failureMembersState, }, ...filteredWorkspaceChats.map(({reportID, stateNum, statusNum, hasDraft, oldPolicyName = null}) => ({ @@ -451,14 +458,18 @@ function removeMembers(accountIDs: number[], policyID: string) { })), ...announceRoomMembers.onyxFailureData, ]; - API.write( - 'DeleteMembersFromWorkspace', - { - emailList: accountIDs.map((accountID) => allPersonalDetails?.[accountID]?.login).join(','), - policyID, - }, - {optimisticData, successData, failureData}, - ); + + type DeleteMembersFromWorkspaceParams = { + emailList: string; + policyID: string; + }; + + const params: DeleteMembersFromWorkspaceParams = { + emailList: accountIDs.map((accountID) => allPersonalDetails?.[accountID]?.login).join(','), + policyID, + }; + + API.write('DeleteMembersFromWorkspace', params, {optimisticData, successData, failureData}); } type WorkspaceMembersChats = { @@ -569,6 +580,7 @@ function createPolicyExpenseChats(policyID: string, invitedEmailsToAccountIDs: R * Adds members to the specified workspace/policyID */ function addMembersToWorkspace(invitedEmailsToAccountIDs: Record, welcomeNote: string, policyID: string) { + const membersListKey = `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}` as const; const logins = Object.keys(invitedEmailsToAccountIDs).map((memberLogin) => OptionsListUtils.addSMSDomainIfPhoneNumber(memberLogin)); const accountIDs = Object.values(invitedEmailsToAccountIDs); const newPersonalDetailsOnyxData = PersonalDetailsUtils.getNewPersonalDetailsOnyxData(logins, accountIDs); @@ -590,7 +602,7 @@ function addMembersToWorkspace(invitedEmailsToAccountIDs: Record const optimisticData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, + key: membersListKey, // Convert to object with each key containing {pendingAction: ‘add’} value: optimisticMembersState, @@ -603,7 +615,7 @@ function addMembersToWorkspace(invitedEmailsToAccountIDs: Record const successData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, + key: membersListKey, // Convert to object with each key clearing pendingAction, when it is an existing account. // Remove the object, when it is a newly created account. @@ -625,7 +637,7 @@ function addMembersToWorkspace(invitedEmailsToAccountIDs: Record const failureData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, + key: membersListKey, // Convert to object with each key containing the error. We don’t // need to remove the members since that is handled by onClose of OfflineWithFeedback. @@ -701,7 +713,17 @@ function updateWorkspaceAvatar(policyID: string, file: File) { }, ]; - API.write('UpdateWorkspaceAvatar', {policyID, file}, {optimisticData, successData, failureData}); + type UpdateWorkspaceAvatarParams = { + policyID: string; + file: File; + }; + + const params: UpdateWorkspaceAvatarParams = { + policyID, + file, + }; + + API.write('UpdateWorkspaceAvatar', params, {optimisticData, successData, failureData}); } /** @@ -748,7 +770,14 @@ function deleteWorkspaceAvatar(policyID: string) { }, }, ]; - API.write('DeleteWorkspaceAvatar', {policyID}, {optimisticData, successData, failureData}); + + type DeleteWorkspaceAvatarParams = { + policyID: string; + }; + + const params: DeleteWorkspaceAvatarParams = {policyID}; + + API.write('DeleteWorkspaceAvatar', params, {optimisticData, successData, failureData}); } /** @@ -789,7 +818,7 @@ function updateGeneralSettings(policyID: string, name: string, currency: string) onyxMethod: Onyx.METHOD.SET, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, value: { - ...(allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`] ?? ({} as Policy)), + ...policy, pendingFields: { generalSettings: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, @@ -852,15 +881,23 @@ function updateGeneralSettings(policyID: string, name: string, currency: string) }, ]; - API.write( - 'UpdateWorkspaceGeneralSettings', - {policyID, workspaceName: name, currency}, - { - optimisticData, - successData, - failureData, - }, - ); + type UpdateWorkspaceGeneralSettingsParams = { + policyID: string; + workspaceName: string; + currency: string; + }; + + const params: UpdateWorkspaceGeneralSettingsParams = { + policyID, + workspaceName: name, + currency, + }; + + API.write('UpdateWorkspaceGeneralSettings', params, { + optimisticData, + successData, + failureData, + }); } /** @@ -909,7 +946,6 @@ function hideWorkspaceAlertMessage(policyID: string) { } function updateWorkspaceCustomUnitAndRate(policyID: string, currentCustomUnit: CustomUnit, newCustomUnit: NewCustomUnit, lastModified: number) { - // console.log('CUSTOMRATES', newCustomUnit, currentCustomUnit); if (!currentCustomUnit.customUnitID || !newCustomUnit?.customUnitID || !newCustomUnit.rates?.customUnitRateID || !currentCustomUnit.rates?.customUnitRateID) { return; } @@ -978,16 +1014,22 @@ function updateWorkspaceCustomUnitAndRate(policyID: string, currentCustomUnit: C const newCustomUnitParam = lodashClone(newCustomUnit); newCustomUnitParam.rates = {...newCustomUnitParam.rates, pendingAction: undefined, errors: undefined}; - API.write( - 'UpdateWorkspaceCustomUnitAndRate', - { - policyID, - lastModified, - customUnit: JSON.stringify(newCustomUnitParam), - customUnitRate: JSON.stringify(newCustomUnitParam.rates), - }, - {optimisticData, successData, failureData}, - ); + + type UpdateWorkspaceCustomUnitAndRate = { + policyID: string; + lastModified: number; + customUnit: string; + customUnitRate: string; + }; + + const params: UpdateWorkspaceCustomUnitAndRate = { + policyID, + lastModified, + customUnit: JSON.stringify(newCustomUnitParam), + customUnitRate: JSON.stringify(newCustomUnitParam.rates), + }; + + API.write('UpdateWorkspaceCustomUnitAndRate', params, {optimisticData, successData, failureData}); } /** @@ -1044,7 +1086,7 @@ function generateDefaultWorkspaceName(email = ''): string { const username = emailParts[0]; const domain = emailParts[1]; - if (PUBLIC_DOMAINS.includes(domain.toLowerCase() as (typeof PUBLIC_DOMAINS)[number])) { + if ((PUBLIC_DOMAINS as readonly string[]).includes(domain.toLowerCase())) { defaultWorkspaceName = `${Str.UCFirst(username)}'s Workspace`; } else { defaultWorkspaceName = `${Str.UCFirst(domain.split('.')[0])}'s Workspace`; @@ -1184,209 +1226,223 @@ function createWorkspace(policyOwnerEmail = '', makeMeAdmin = false, policyName expenseCreatedReportActionID, } = ReportUtils.buildOptimisticWorkspaceChats(policyID, workspaceName); - API.write( - 'CreateWorkspace', - { - policyID, - announceChatReportID, - adminsChatReportID, - expenseChatReportID, - ownerEmail: policyOwnerEmail, - makeMeAdmin, - policyName: workspaceName, - type: CONST.POLICY.TYPE.FREE, - announceCreatedReportActionID, - adminsCreatedReportActionID, - expenseCreatedReportActionID, - customUnitID, - customUnitRateID, - }, - { - optimisticData: [ - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, - value: { - id: policyID, - type: CONST.POLICY.TYPE.FREE, - name: workspaceName, + type CreateWorkspaceParams = { + policyID: string; + announceChatReportID: string; + adminsChatReportID: string; + expenseChatReportID: string; + ownerEmail: string; + makeMeAdmin: boolean; + policyName: string; + type: string; + announceCreatedReportActionID: string; + adminsCreatedReportActionID: string; + expenseCreatedReportActionID: string; + customUnitID: string; + customUnitRateID: string; + }; + + const params: CreateWorkspaceParams = { + policyID, + announceChatReportID, + adminsChatReportID, + expenseChatReportID, + ownerEmail: policyOwnerEmail, + makeMeAdmin, + policyName: workspaceName, + type: CONST.POLICY.TYPE.FREE, + announceCreatedReportActionID, + adminsCreatedReportActionID, + expenseCreatedReportActionID, + customUnitID, + customUnitRateID, + }; + + API.write('CreateWorkspace', params, { + optimisticData: [ + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: { + id: policyID, + type: CONST.POLICY.TYPE.FREE, + name: workspaceName, + role: CONST.POLICY.ROLE.ADMIN, + owner: sessionEmail, + isPolicyExpenseChatEnabled: true, + outputCurrency, + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + customUnits, + }, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, + value: { + [sessionAccountID]: { role: CONST.POLICY.ROLE.ADMIN, - owner: sessionEmail, - isPolicyExpenseChatEnabled: true, - outputCurrency, - pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, - customUnits, + errors: {}, }, }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, - value: { - [sessionAccountID]: { - role: CONST.POLICY.ROLE.ADMIN, - errors: {}, - }, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT}${announceChatReportID}`, + value: { + pendingFields: { + addWorkspaceRoom: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, }, + ...announceChatData, }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT}${announceChatReportID}`, - value: { - pendingFields: { - addWorkspaceRoom: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, - }, - ...announceChatData, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${announceChatReportID}`, + value: announceReportActionData, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT}${adminsChatReportID}`, + value: { + pendingFields: { + addWorkspaceRoom: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, }, + ...adminsChatData, }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${announceChatReportID}`, - value: announceReportActionData, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT}${adminsChatReportID}`, - value: { - pendingFields: { - addWorkspaceRoom: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, - }, - ...adminsChatData, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${adminsChatReportID}`, + value: adminsReportActionData, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT}${expenseChatReportID}`, + value: { + pendingFields: { + addWorkspaceRoom: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, }, + ...expenseChatData, }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${adminsChatReportID}`, - value: adminsReportActionData, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT}${expenseChatReportID}`, - value: { - pendingFields: { - addWorkspaceRoom: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, - }, - ...expenseChatData, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseChatReportID}`, + value: expenseReportActionData, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.POLICY_DRAFTS}${policyID}`, + value: null, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS_DRAFTS}${policyID}`, + value: null, + }, + ], + successData: [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: {pendingAction: null}, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${announceChatReportID}`, + value: { + pendingFields: { + addWorkspaceRoom: null, }, + pendingAction: null, }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseChatReportID}`, - value: expenseReportActionData, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.POLICY_DRAFTS}${policyID}`, - value: null, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS_DRAFTS}${policyID}`, - value: null, - }, - ], - successData: [ - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, - value: {pendingAction: null}, - }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${announceChatReportID}`, - value: { - pendingFields: { - addWorkspaceRoom: null, - }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${announceChatReportID}`, + value: { + [Object.keys(announceChatData)[0]]: { pendingAction: null, }, }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${announceChatReportID}`, - value: { - [Object.keys(announceChatData)[0]]: { - pendingAction: null, - }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${adminsChatReportID}`, + value: { + pendingFields: { + addWorkspaceRoom: null, }, + pendingAction: null, }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${adminsChatReportID}`, - value: { - pendingFields: { - addWorkspaceRoom: null, - }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${adminsChatReportID}`, + value: { + [Object.keys(adminsChatData)[0]]: { pendingAction: null, }, }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${adminsChatReportID}`, - value: { - [Object.keys(adminsChatData)[0]]: { - pendingAction: null, - }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${expenseChatReportID}`, + value: { + pendingFields: { + addWorkspaceRoom: null, }, + pendingAction: null, }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${expenseChatReportID}`, - value: { - pendingFields: { - addWorkspaceRoom: null, - }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseChatReportID}`, + value: { + [Object.keys(expenseChatData)[0]]: { pendingAction: null, }, }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseChatReportID}`, - value: { - [Object.keys(expenseChatData)[0]]: { - pendingAction: null, - }, - }, - }, - ], - failureData: [ - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, - value: null, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT}${announceChatReportID}`, - value: null, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${announceChatReportID}`, - value: null, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT}${adminsChatReportID}`, - value: null, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${adminsChatReportID}`, - value: null, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT}${expenseChatReportID}`, - value: null, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseChatReportID}`, - value: null, - }, - ], - }, - ); + }, + ], + failureData: [ + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, + value: null, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT}${announceChatReportID}`, + value: null, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${announceChatReportID}`, + value: null, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT}${adminsChatReportID}`, + value: null, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${adminsChatReportID}`, + value: null, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT}${expenseChatReportID}`, + value: null, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseChatReportID}`, + value: null, + }, + ], + }); return adminsChatReportID; } @@ -1417,7 +1473,13 @@ function openWorkspaceReimburseView(policyID: string) { ], }; - API.read('OpenWorkspaceReimburseView', {policyID}, onyxData); + type OpenWorkspaceReimburseViewParams = { + policyID: string; + }; + + const params: OpenWorkspaceReimburseViewParams = {policyID}; + + API.read('OpenWorkspaceReimburseView', params, onyxData); } function openWorkspaceMembersPage(policyID: string, clientMemberEmails: string[]) { @@ -1426,10 +1488,17 @@ function openWorkspaceMembersPage(policyID: string, clientMemberEmails: string[] return; } - API.read('OpenWorkspaceMembersPage', { + type OpenWorkspaceMembersPageParams = { + policyID: string; + clientMemberEmails: string; + }; + + const params: OpenWorkspaceMembersPageParams = { policyID, clientMemberEmails: JSON.stringify(clientMemberEmails), - }); + }; + + API.read('OpenWorkspaceMembersPage', params); } function openWorkspaceInvitePage(policyID: string, clientMemberEmails: string[]) { @@ -1438,14 +1507,27 @@ function openWorkspaceInvitePage(policyID: string, clientMemberEmails: string[]) return; } - API.read('OpenWorkspaceInvitePage', { + type OpenWorkspaceInvitePageParams = { + policyID: string; + clientMemberEmails: string; + }; + + const params: OpenWorkspaceInvitePageParams = { policyID, clientMemberEmails: JSON.stringify(clientMemberEmails), - }); + }; + + API.read('OpenWorkspaceInvitePage', params); } function openDraftWorkspaceRequest(policyID: string) { - API.read('OpenDraftWorkspaceRequest', {policyID}); + type OpenDraftWorkspaceRequestParams = { + policyID: string; + }; + + const params: OpenDraftWorkspaceRequestParams = {policyID}; + + API.read('OpenDraftWorkspaceRequest', params); } function setWorkspaceInviteMembersDraft(policyID: string, invitedEmailsToAccountIDs: Record) { @@ -1906,28 +1988,45 @@ function createWorkspaceFromIOUPayment(iouReport: Report): string | undefined { value: {[movedReportAction.reportActionID]: null}, }); - API.write( - 'CreateWorkspaceFromIOUPayment', - { - policyID, - announceChatReportID, - adminsChatReportID, - expenseChatReportID: workspaceChatReportID, - ownerEmail: '', - makeMeAdmin: false, - policyName: workspaceName, - type: CONST.POLICY.TYPE.TEAM, - announceCreatedReportActionID, - adminsCreatedReportActionID, - expenseCreatedReportActionID: workspaceChatCreatedReportActionID, - customUnitID, - customUnitRateID, - iouReportID, - memberData: JSON.stringify(memberData), - reportActionID: movedReportAction.reportActionID, - }, - {optimisticData, successData, failureData}, - ); + type CreateWorkspaceFromIOUPayment = { + policyID: string; + announceChatReportID: string; + adminsChatReportID: string; + expenseChatReportID: string; + ownerEmail: string; + makeMeAdmin: boolean; + policyName: string; + type: string; + announceCreatedReportActionID: string; + adminsCreatedReportActionID: string; + expenseCreatedReportActionID: string; + customUnitID: string; + customUnitRateID: string; + iouReportID: string; + memberData: string; + reportActionID: string; + }; + + const params: CreateWorkspaceFromIOUPayment = { + policyID, + announceChatReportID, + adminsChatReportID, + expenseChatReportID: workspaceChatReportID, + ownerEmail: '', + makeMeAdmin: false, + policyName: workspaceName, + type: CONST.POLICY.TYPE.TEAM, + announceCreatedReportActionID, + adminsCreatedReportActionID, + expenseCreatedReportActionID: workspaceChatCreatedReportActionID, + customUnitID, + customUnitRateID, + iouReportID, + memberData: JSON.stringify(memberData), + reportActionID: movedReportAction.reportActionID, + }; + + API.write('CreateWorkspaceFromIOUPayment', params, {optimisticData, successData, failureData}); return policyID; } From 8aa11a4f95ba71c69b134c8e6529f75fd7eab294 Mon Sep 17 00:00:00 2001 From: Alberto Date: Tue, 2 Jan 2024 12:13:55 +0100 Subject: [PATCH 175/583] Correctly copy owes message --- src/libs/ReportUtils.ts | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index d3c4a7d0a01d..c956928c5ac7 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -4112,17 +4112,22 @@ function getIOUReportActionDisplayMessage(reportAction: OnyxEntry) const formattedAmount = CurrencyUtils.convertToDisplayString(amount, currency) ?? ''; const payerName = isExpenseReport(iouReport) ? getPolicyName(iouReport) : getDisplayNameForParticipant(iouReport?.managerID, true); - switch (originalMessage.paymentType) { - case CONST.IOU.PAYMENT_TYPE.ELSEWHERE: - translationKey = 'iou.paidElsewhereWithAmount'; - break; - case CONST.IOU.PAYMENT_TYPE.EXPENSIFY: - case CONST.IOU.PAYMENT_TYPE.VBBA: - translationKey = 'iou.paidWithExpensifyWithAmount'; - break; - default: - translationKey = 'iou.payerPaidAmount'; - break; + // If the payment was cancelled, show the "Owes" message + if (!isSettled(IOUReportID)) { + translationKey = 'iou.payerOwesAmount'; + } else { + switch (originalMessage.paymentType) { + case CONST.IOU.PAYMENT_TYPE.ELSEWHERE: + translationKey = 'iou.paidElsewhereWithAmount'; + break; + case CONST.IOU.PAYMENT_TYPE.EXPENSIFY: + case CONST.IOU.PAYMENT_TYPE.VBBA: + translationKey = 'iou.paidWithExpensifyWithAmount'; + break; + default: + translationKey = 'iou.payerPaidAmount'; + break; + } } return Localize.translateLocal(translationKey, {amount: formattedAmount, payer: payerName ?? ''}); } From 274a58acde359ba362385d785ad358d6f2231d78 Mon Sep 17 00:00:00 2001 From: Alberto Date: Tue, 2 Jan 2024 12:49:52 +0100 Subject: [PATCH 176/583] pass chat report --- src/libs/actions/IOU.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index 337c69764ecf..9188fe56920f 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -3208,7 +3208,8 @@ function cancelPayment(expenseReport, chatReport) { API.write( 'CancelPayment', { - reportID: expenseReport.reportID, + iouReportID: expenseReport.reportID, + chatReportID: chatReport.reportID, managerAccountID: expenseReport.managerID, reportActionID: optimisticReportAction.reportActionID, }, From 94c5a61707ee11b393376f75aae9e75a18e45411 Mon Sep 17 00:00:00 2001 From: Ishpaul Singh Date: Tue, 2 Jan 2024 19:13:20 +0530 Subject: [PATCH 177/583] added requested changes --- src/CONST.ts | 2 +- ...mButtons.tsx => ActionableItemButtons.tsx} | 21 +++++---- src/libs/ReportActionsUtils.ts | 22 +++++++++ src/libs/actions/Report.ts | 4 +- src/pages/home/report/ReportActionItem.js | 46 +++++++++++-------- src/types/onyx/OriginalMessage.ts | 1 + 6 files changed, 65 insertions(+), 31 deletions(-) rename src/components/ReportActionItem/{ActionItemButtons.tsx => ActionableItemButtons.tsx} (53%) diff --git a/src/CONST.ts b/src/CONST.ts index 8110d63f2cdf..bc3c3c84a41d 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -597,7 +597,7 @@ const CONST = { }, THREAD_DISABLED: ['CREATED'], }, - RESOLUTIONS: { + ACTIONABLE_MENTION_WHISPER_RESOLUTION: { INVITE: 'invited', NOTHING: 'nothing', }, diff --git a/src/components/ReportActionItem/ActionItemButtons.tsx b/src/components/ReportActionItem/ActionableItemButtons.tsx similarity index 53% rename from src/components/ReportActionItem/ActionItemButtons.tsx rename to src/components/ReportActionItem/ActionableItemButtons.tsx index 0dd4c75b9771..8b4775ee34ce 100644 --- a/src/components/ReportActionItem/ActionItemButtons.tsx +++ b/src/components/ReportActionItem/ActionableItemButtons.tsx @@ -1,20 +1,22 @@ import React from 'react'; import {View} from 'react-native'; import Button from '@components/Button'; +import withLocalize, {WithLocalizeProps} from '@components/withLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; +import {TranslationPaths} from '@src/languages/types'; -type ActionItem = { - isPrimary: boolean; +type ActionableItem = { + isPrimary?: boolean; key: string; onPress: () => void; - text: string; + text: TranslationPaths; }; -type ActionItemButtonsProps = { - items: ActionItem[]; +type ActionableItemButtonsProps = WithLocalizeProps & { + items: ActionableItem[]; }; -function ActionItemButtons(props: ActionItemButtonsProps) { +function ActionableItemButtons(props: ActionableItemButtonsProps) { const styles = useThemeStyles(); return ( @@ -24,7 +26,7 @@ function ActionItemButtons(props: ActionItemButtonsProps) { key={item.key} style={[styles.mt2]} onPress={item.onPress} - text={item.text} + text={props.translate(item.text)} small success={item.isPrimary} /> @@ -33,6 +35,7 @@ function ActionItemButtons(props: ActionItemButtonsProps) { ); } -ActionItemButtons.displayName = 'ActionItemButtton'; +ActionableItemButtons.displayName = 'ActionableItemButtton'; -export default ActionItemButtons; +export default withLocalize(ActionableItemButtons); +export type {ActionableItem}; diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index 4847eee2c8c6..a3bf5bea1e7c 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -3,12 +3,14 @@ import lodashFindLast from 'lodash/findLast'; import Onyx, {OnyxCollection, OnyxEntry, OnyxUpdate} from 'react-native-onyx'; import OnyxUtils from 'react-native-onyx/lib/utils'; import {ValueOf} from 'type-fest'; +import {ActionableItem} from '@components/ReportActionItem/ActionableItemButtons'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import {ActionName, ChangeLog} from '@src/types/onyx/OriginalMessage'; import Report from '@src/types/onyx/Report'; import ReportAction, {Message, ReportActions} from '@src/types/onyx/ReportAction'; import {EmptyObject, isEmptyObject} from '@src/types/utils/EmptyObject'; +import {resolveActionableMentionWhisper} from './actions/Report'; import * as CollectionUtils from './CollectionUtils'; import * as Environment from './Environment/Environment'; import isReportMessageAttachment from './isReportMessageAttachment'; @@ -776,6 +778,25 @@ function hasRequestFromCurrentAccount(reportID: string, currentAccountID: number return reportActions.some((action) => action.actionName === CONST.REPORT.ACTIONS.TYPE.IOU && action.actorAccountID === currentAccountID); } +function getActionableItemButtons(reportAction: ReportAction, reportID: string): ActionableItem[] { + if (!(reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.ACTIONABLEMENTIONWHISPER && !reportAction.originalMessage?.resolution)) { + return []; + } + return [ + { + text: 'actionableMentionWhisperOptions.invite', + key: `${reportAction.reportActionID}-actionableMentionWhisper-${CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.INVITE}`, + onPress: () => resolveActionableMentionWhisper(reportID, reportAction.reportActionID, CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.INVITE), + isPrimary: true, + }, + { + text: 'actionableMentionWhisperOptions.nothing', + key: `${reportAction.reportActionID}-actionableMentionWhisper-${CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.NOTHING}`, + onPress: () => resolveActionableMentionWhisper(reportID, reportAction.reportActionID, CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.NOTHING), + }, + ]; +} + export { extractLinksFromMessageHtml, getAllReportActions, @@ -823,6 +844,7 @@ export { getMemberChangeMessageFragment, getMemberChangeMessagePlainText, isReimbursementDeQueuedAction, + getActionableItemButtons, }; export type {LastVisibleMessage}; diff --git a/src/libs/actions/Report.ts b/src/libs/actions/Report.ts index 329211d17f52..ae6da06f61b2 100644 --- a/src/libs/actions/Report.ts +++ b/src/libs/actions/Report.ts @@ -2546,7 +2546,7 @@ function clearNewRoomFormError() { }); } -function resolveActionableMentionWhisper(reportId: string, reportActionID: string, resolution: ValueOf) { +function resolveActionableMentionWhisper(reportId: string, reportActionID: string, resolution: ValueOf) { const optimisticData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, @@ -2577,7 +2577,7 @@ function resolveActionableMentionWhisper(reportId: string, reportActionID: strin type ResolveActionableMentionWhisperParams = { reportActionID: string; - resolution: ValueOf; + resolution: ValueOf; }; const parameters: ResolveActionableMentionWhisperParams = { diff --git a/src/pages/home/report/ReportActionItem.js b/src/pages/home/report/ReportActionItem.js index 2c7e65ff9119..bc1016f9a434 100644 --- a/src/pages/home/report/ReportActionItem.js +++ b/src/pages/home/report/ReportActionItem.js @@ -17,7 +17,7 @@ import PressableWithSecondaryInteraction from '@components/PressableWithSecondar import EmojiReactionsPropTypes from '@components/Reactions/EmojiReactionsPropTypes'; import ReportActionItemEmojiReactions from '@components/Reactions/ReportActionItemEmojiReactions'; import RenderHTML from '@components/RenderHTML'; -import ActionItemButtons from '@components/ReportActionItem/ActionItemButtons'; +import ActionableItemButtons from '@components/ReportActionItem/ActionableItemButtons'; import ChronosOOOListActions from '@components/ReportActionItem/ChronosOOOListActions'; import MoneyReportView from '@components/ReportActionItem/MoneyReportView'; import MoneyRequestAction from '@components/ReportActionItem/MoneyRequestAction'; @@ -302,6 +302,25 @@ function ReportActionItem(props) { [props.report, props.action, toggleContextMenuFromActiveReportAction], ); + const actionableItemButtons = useMemo(() => { + if (!(props.action.actionName === CONST.REPORT.ACTIONS.TYPE.ACTIONABLEMENTIONWHISPER && !lodashGet(props.action, 'originalMessage.resolution', null))) { + return []; + } + return [ + { + text: 'actionableMentionWhisperOptions.invite', + key: `${props.action.reportActionID}-actionableMentionWhisper-${CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.INVITE}`, + onPress: () => Report.resolveActionableMentionWhisper(props.report.reportID, props.action.reportActionID, CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.INVITE), + isPrimary: true, + }, + { + text: 'actionableMentionWhisperOptions.nothing', + key: `${props.action.reportActionID}-actionableMentionWhisper-${CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.NOTHING}`, + onPress: () => Report.resolveActionableMentionWhisper(props.report.reportID, props.action.reportActionID, CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.NOTHING), + } + ] + }, [props.action, props.report]); + /** * Get the content of ReportActionItem * @param {Boolean} hovered whether the ReportActionItem is hovered @@ -462,24 +481,13 @@ function ReportActionItem(props) { )} - {lodashGet(props, 'action.actionName', '') === CONST.REPORT.ACTIONS.TYPE.ACTIONABLEMENTIONWHISPER && - !lodashGet(props, 'action.originalMessage.resolution', null) && ( - Report.resolveActionableMentionWhisper(props.report.reportID, props.action.reportActionID, CONST.REPORT.RESOLUTIONS.INVITE), - isPrimary: true, - }, - { - text: props.translate('actionableMentionWhisperOptions.nothing'), - key: `${props.action.reportActionID}-actionableMentionWhisper-${CONST.REPORT.RESOLUTIONS.NOTHING}`, - onPress: () => Report.resolveActionableMentionWhisper(props.report.reportID, props.action.reportActionID, CONST.REPORT.RESOLUTIONS.NOTHING), - }, - ]} - /> - )} + {/** + These are the actionable buttons that appear at the bottom of a Concierge message + for example: Invite a user mentioned but not a member of the room + https://github.com/Expensify/App/issues/32741 + */} + {actionableItemButtons.length > 0 + && } ) : ( | null; whisperedTo?: number[]; }; }; From 0c931c33a70fad1b935ff3c24821eb2df8bd4a74 Mon Sep 17 00:00:00 2001 From: Ishpaul Singh Date: Tue, 2 Jan 2024 19:23:04 +0530 Subject: [PATCH 178/583] clean up --- src/libs/ReportActionsUtils.ts | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index a3bf5bea1e7c..dafb16018016 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -778,25 +778,6 @@ function hasRequestFromCurrentAccount(reportID: string, currentAccountID: number return reportActions.some((action) => action.actionName === CONST.REPORT.ACTIONS.TYPE.IOU && action.actorAccountID === currentAccountID); } -function getActionableItemButtons(reportAction: ReportAction, reportID: string): ActionableItem[] { - if (!(reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.ACTIONABLEMENTIONWHISPER && !reportAction.originalMessage?.resolution)) { - return []; - } - return [ - { - text: 'actionableMentionWhisperOptions.invite', - key: `${reportAction.reportActionID}-actionableMentionWhisper-${CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.INVITE}`, - onPress: () => resolveActionableMentionWhisper(reportID, reportAction.reportActionID, CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.INVITE), - isPrimary: true, - }, - { - text: 'actionableMentionWhisperOptions.nothing', - key: `${reportAction.reportActionID}-actionableMentionWhisper-${CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.NOTHING}`, - onPress: () => resolveActionableMentionWhisper(reportID, reportAction.reportActionID, CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.NOTHING), - }, - ]; -} - export { extractLinksFromMessageHtml, getAllReportActions, @@ -844,7 +825,6 @@ export { getMemberChangeMessageFragment, getMemberChangeMessagePlainText, isReimbursementDeQueuedAction, - getActionableItemButtons, }; export type {LastVisibleMessage}; From 8bfe553c31efa94bb288029de0b443f42cc5d634 Mon Sep 17 00:00:00 2001 From: Ishpaul Singh Date: Tue, 2 Jan 2024 19:26:31 +0530 Subject: [PATCH 179/583] lint fix remove unused imports --- src/libs/ReportActionsUtils.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index dafb16018016..4847eee2c8c6 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -3,14 +3,12 @@ import lodashFindLast from 'lodash/findLast'; import Onyx, {OnyxCollection, OnyxEntry, OnyxUpdate} from 'react-native-onyx'; import OnyxUtils from 'react-native-onyx/lib/utils'; import {ValueOf} from 'type-fest'; -import {ActionableItem} from '@components/ReportActionItem/ActionableItemButtons'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import {ActionName, ChangeLog} from '@src/types/onyx/OriginalMessage'; import Report from '@src/types/onyx/Report'; import ReportAction, {Message, ReportActions} from '@src/types/onyx/ReportAction'; import {EmptyObject, isEmptyObject} from '@src/types/utils/EmptyObject'; -import {resolveActionableMentionWhisper} from './actions/Report'; import * as CollectionUtils from './CollectionUtils'; import * as Environment from './Environment/Environment'; import isReportMessageAttachment from './isReportMessageAttachment'; From 017b4fab7adae001d6cfeb5e1df22a4a122a01ce Mon Sep 17 00:00:00 2001 From: Ishpaul Singh Date: Tue, 2 Jan 2024 19:55:09 +0530 Subject: [PATCH 180/583] prettier diffs --- src/pages/home/report/ReportActionItem.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/pages/home/report/ReportActionItem.js b/src/pages/home/report/ReportActionItem.js index bc1016f9a434..33e2134a5a80 100644 --- a/src/pages/home/report/ReportActionItem.js +++ b/src/pages/home/report/ReportActionItem.js @@ -317,8 +317,8 @@ function ReportActionItem(props) { text: 'actionableMentionWhisperOptions.nothing', key: `${props.action.reportActionID}-actionableMentionWhisper-${CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.NOTHING}`, onPress: () => Report.resolveActionableMentionWhisper(props.report.reportID, props.action.reportActionID, CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.NOTHING), - } - ] + }, + ]; }, [props.action, props.report]); /** @@ -486,8 +486,7 @@ function ReportActionItem(props) { for example: Invite a user mentioned but not a member of the room https://github.com/Expensify/App/issues/32741 */} - {actionableItemButtons.length > 0 - && } + {actionableItemButtons.length > 0 && } ) : ( Date: Tue, 2 Jan 2024 16:30:30 +0100 Subject: [PATCH 181/583] Fix MenuItem types --- src/components/MenuItem.tsx | 245 +++++++++--------- .../BaseVideoChatButtonAndMenu.tsx | 5 +- 2 files changed, 121 insertions(+), 129 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index db150d55f0d2..2b192aba2f2e 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -33,20 +33,6 @@ import RenderHTML from './RenderHTML'; import SelectCircle from './SelectCircle'; import Text from './Text'; -type ResponsiveProps = { - /** Function to fire when component is pressed */ - onPress: (event: GestureResponderEvent | KeyboardEvent) => void; - - interactive?: true; -}; - -type UnresponsiveProps = { - onPress?: undefined; - - /** Whether the menu item should be interactive at all */ - interactive: false; -}; - type IconProps = { /** Flag to choose between avatar image or an icon */ iconType: typeof CONST.ICON_TYPE_ICON; @@ -56,7 +42,7 @@ type IconProps = { }; type AvatarProps = { - iconType: typeof CONST.ICON_TYPE_AVATAR | typeof CONST.ICON_TYPE_WORKSPACE; + iconType?: typeof CONST.ICON_TYPE_AVATAR | typeof CONST.ICON_TYPE_WORKSPACE; icon: AvatarSource; }; @@ -67,170 +53,175 @@ type NoIcon = { icon?: undefined; }; -type MenuItemProps = (ResponsiveProps | UnresponsiveProps) & - (IconProps | AvatarProps | NoIcon) & { - /** Text to be shown as badge near the right end. */ - badgeText?: string; +type MenuItemProps = (IconProps | AvatarProps | NoIcon) & { + /** Function to fire when component is pressed */ + onPress?: (event: GestureResponderEvent | KeyboardEvent) => void; - /** Used to apply offline styles to child text components */ - style?: ViewStyle; + /** Whether the menu item should be interactive at all */ + interactive?: boolean; - /** Any additional styles to apply */ - wrapperStyle?: StyleProp; + /** Text to be shown as badge near the right end. */ + badgeText?: string; - /** Any additional styles to apply on the outer element */ - containerStyle?: StyleProp; + /** Used to apply offline styles to child text components */ + style?: StyleProp; - /** Used to apply styles specifically to the title */ - titleStyle?: ViewStyle; + /** Any additional styles to apply */ + wrapperStyle?: StyleProp; - /** Any adjustments to style when menu item is hovered or pressed */ - hoverAndPressStyle: StyleProp>; + /** Any additional styles to apply on the outer element */ + containerStyle?: StyleProp; - /** Additional styles to style the description text below the title */ - descriptionTextStyle?: StyleProp; + /** Used to apply styles specifically to the title */ + titleStyle?: ViewStyle; - /** The fill color to pass into the icon. */ - iconFill?: string; + /** Any adjustments to style when menu item is hovered or pressed */ + hoverAndPressStyle?: StyleProp>; - /** Secondary icon to display on the left side of component, right of the icon */ - secondaryIcon?: IconAsset; + /** Additional styles to style the description text below the title */ + descriptionTextStyle?: StyleProp; - /** The fill color to pass into the secondary icon. */ - secondaryIconFill?: string; + /** The fill color to pass into the icon. */ + iconFill?: string; - /** Icon Width */ - iconWidth?: number; + /** Secondary icon to display on the left side of component, right of the icon */ + secondaryIcon?: IconAsset; - /** Icon Height */ - iconHeight?: number; + /** The fill color to pass into the secondary icon. */ + secondaryIconFill?: string; - /** Any additional styles to pass to the icon container. */ - iconStyles?: StyleProp; + /** Icon Width */ + iconWidth?: number; - /** A fallback avatar icon to display when there is an error on loading avatar from remote URL. */ - fallbackIcon?: IconAsset; + /** Icon Height */ + iconHeight?: number; - /** An icon to display under the main item */ - furtherDetailsIcon?: IconAsset; + /** Any additional styles to pass to the icon container. */ + iconStyles?: StyleProp; - /** Boolean whether to display the title right icon */ - shouldShowTitleIcon?: boolean; + /** A fallback avatar icon to display when there is an error on loading avatar from remote URL. */ + fallbackIcon?: IconAsset; - /** Icon to display at right side of title */ - titleIcon?: IconAsset; + /** An icon to display under the main item */ + furtherDetailsIcon?: IconAsset; - /** Boolean whether to display the right icon */ - shouldShowRightIcon?: boolean; + /** Boolean whether to display the title right icon */ + shouldShowTitleIcon?: boolean; - /** Overrides the icon for shouldShowRightIcon */ - iconRight?: IconAsset; + /** Icon to display at right side of title */ + titleIcon?: IconAsset; - /** Should render component on the right */ - shouldShowRightComponent?: boolean; + /** Boolean whether to display the right icon */ + shouldShowRightIcon?: boolean; - /** Component to be displayed on the right */ - rightComponent?: ReactNode; + /** Overrides the icon for shouldShowRightIcon */ + iconRight?: IconAsset; - /** A description text to show under the title */ - description?: string; + /** Should render component on the right */ + shouldShowRightComponent?: boolean; - /** Should the description be shown above the title (instead of the other way around) */ - shouldShowDescriptionOnTop?: boolean; + /** Component to be displayed on the right */ + rightComponent?: ReactNode; - /** Error to display below the title */ - error?: string; + /** A description text to show under the title */ + description?: string; - /** Error to display at the bottom of the component */ - errorText?: string; + /** Should the description be shown above the title (instead of the other way around) */ + shouldShowDescriptionOnTop?: boolean; - /** A boolean flag that gives the icon a green fill if true */ - success?: boolean; + /** Error to display below the title */ + error?: string; - /** Whether item is focused or active */ - focused?: boolean; + /** Error to display at the bottom of the component */ + errorText?: string; - /** Should we disable this menu item? */ - disabled?: boolean; + /** A boolean flag that gives the icon a green fill if true */ + success?: boolean; - /** Text that appears above the title */ - label?: string; + /** Whether item is focused or active */ + focused?: boolean; - /** Label to be displayed on the right */ - rightLabel?: string; + /** Should we disable this menu item? */ + disabled?: boolean; - /** Text to display for the item */ - title?: string; + /** Text that appears above the title */ + label?: string; - /** A right-aligned subtitle for this menu option */ - subtitle?: string | number; + /** Label to be displayed on the right */ + rightLabel?: string; - /** Should the title show with normal font weight (not bold) */ - shouldShowBasicTitle?: boolean; + /** Text to display for the item */ + title?: string; - /** Should we make this selectable with a checkbox */ - shouldShowSelectedState?: boolean; + /** A right-aligned subtitle for this menu option */ + subtitle?: string | number; - /** Whether this item is selected */ - isSelected?: boolean; + /** Should the title show with normal font weight (not bold) */ + shouldShowBasicTitle?: boolean; - /** Prop to identify if we should load avatars vertically instead of diagonally */ - shouldStackHorizontally: boolean; + /** Should we make this selectable with a checkbox */ + shouldShowSelectedState?: boolean; - /** Prop to represent the size of the avatar images to be shown */ - avatarSize?: (typeof CONST.AVATAR_SIZE)[keyof typeof CONST.AVATAR_SIZE]; + /** Whether this item is selected */ + isSelected?: boolean; - /** Avatars to show on the right of the menu item */ - floatRightAvatars?: IconType[]; + /** Prop to identify if we should load avatars vertically instead of diagonally */ + shouldStackHorizontally?: boolean; - /** Prop to represent the size of the float right avatar images to be shown */ - floatRightAvatarSize?: ValueOf; + /** Prop to represent the size of the avatar images to be shown */ + avatarSize?: (typeof CONST.AVATAR_SIZE)[keyof typeof CONST.AVATAR_SIZE]; - /** Affects avatar size */ - viewMode?: ValueOf; + /** Avatars to show on the right of the menu item */ + floatRightAvatars?: IconType[]; - /** Used to truncate the text with an ellipsis after computing the text layout */ - numberOfLinesTitle?: number; + /** Prop to represent the size of the float right avatar images to be shown */ + floatRightAvatarSize?: ValueOf; - /** Whether we should use small avatar subscript sizing the for menu item */ - isSmallAvatarSubscriptMenu?: boolean; + /** Affects avatar size */ + viewMode?: ValueOf; - /** The type of brick road indicator to show. */ - brickRoadIndicator?: ValueOf; + /** Used to truncate the text with an ellipsis after computing the text layout */ + numberOfLinesTitle?: number; - /** Should render the content in HTML format */ - shouldRenderAsHTML?: boolean; + /** Whether we should use small avatar subscript sizing the for menu item */ + isSmallAvatarSubscriptMenu?: boolean; - /** Should we grey out the menu item when it is disabled? */ - shouldGreyOutWhenDisabled?: boolean; + /** The type of brick road indicator to show. */ + brickRoadIndicator?: ValueOf; - /** The action accept for anonymous user or not */ - isAnonymousAction?: boolean; + /** Should render the content in HTML format */ + shouldRenderAsHTML?: boolean; - /** Flag to indicate whether or not text selection should be disabled from long-pressing the menu item. */ - shouldBlockSelection?: boolean; + /** Should we grey out the menu item when it is disabled? */ + shouldGreyOutWhenDisabled?: boolean; - /** Whether should render title as HTML or as Text */ - shouldParseTitle?: false; + /** The action accept for anonymous user or not */ + isAnonymousAction?: boolean; - /** Should check anonymous user in onPress function */ - shouldCheckActionAllowedOnPress?: boolean; + /** Flag to indicate whether or not text selection should be disabled from long-pressing the menu item. */ + shouldBlockSelection?: boolean; - /** Text to display under the main item */ - furtherDetails?: string; + /** Whether should render title as HTML or as Text */ + shouldParseTitle?: false; - /** The function that should be called when this component is LongPressed or right-clicked. */ - onSecondaryInteraction: () => void; + /** Should check anonymous user in onPress function */ + shouldCheckActionAllowedOnPress?: boolean; - /** Array of objects that map display names to their corresponding tooltip */ - titleWithTooltips: DisplayNameWithTooltip[]; + /** Text to display under the main item */ + furtherDetails?: string; - /** Icon should be displayed in its own color */ - displayInDefaultIconColor?: boolean; + /** The function that should be called when this component is LongPressed or right-clicked. */ + onSecondaryInteraction?: () => void; - /** Determines how the icon should be resized to fit its container */ - contentFit?: ImageContentFit; - }; + /** Array of objects that map display names to their corresponding tooltip */ + titleWithTooltips?: DisplayNameWithTooltip[]; + + /** Icon should be displayed in its own color */ + displayInDefaultIconColor?: boolean; + + /** Determines how the icon should be resized to fit its container */ + contentFit?: ImageContentFit; +}; function MenuItem( { @@ -298,7 +289,7 @@ function MenuItem( const theme = useTheme(); const styles = useThemeStyles(); const StyleUtils = useStyleUtils(); - const combinedStyle = StyleUtils.combineStyles(style ?? {}, styles.popoverMenuItem); + const combinedStyle = [style, styles.popoverMenuItem]; const {isSmallScreenWidth} = useWindowDimensions(); const [html, setHtml] = useState(''); const titleRef = useRef(''); diff --git a/src/components/VideoChatButtonAndMenu/BaseVideoChatButtonAndMenu.tsx b/src/components/VideoChatButtonAndMenu/BaseVideoChatButtonAndMenu.tsx index 906f9530af9f..c180fa670efc 100755 --- a/src/components/VideoChatButtonAndMenu/BaseVideoChatButtonAndMenu.tsx +++ b/src/components/VideoChatButtonAndMenu/BaseVideoChatButtonAndMenu.tsx @@ -29,8 +29,8 @@ function BaseVideoChatButtonAndMenu(props: BaseVideoChatButtonAndMenuProps) { const {isSmallScreenWidth} = useWindowDimensions(); const [isVideoChatMenuActive, setIsVideoChatMenuActive] = useState(false); const [videoChatIconPosition, setVideoChatIconPosition] = useState({x: 0, y: 0}); - const videoChatIconWrapperRef = useRef(null); - const videoChatButtonRef = useRef(null); + const videoChatIconWrapperRef = useRef(null); + const videoChatButtonRef = useRef(null); const menuItemData = [ { @@ -124,6 +124,7 @@ function BaseVideoChatButtonAndMenu(props: BaseVideoChatButtonAndMenuProps) { wrapperStyle={styles.mr3} key={text} icon={icon} + iconType={CONST.ICON_TYPE_ICON} title={text} onPress={onPress} /> From 1f37bbb704996031cca0af640e52d27962c97fee Mon Sep 17 00:00:00 2001 From: Jakub Butkiewicz Date: Tue, 2 Jan 2024 16:31:04 +0100 Subject: [PATCH 182/583] fix: resolve conflicts and fix type issues --- src/libs/ReportUtils.ts | 32 +++++++++++++++++++++++++++++--- src/libs/actions/Report.ts | 16 +++++++++------- src/libs/actions/Task.ts | 2 +- src/types/onyx/Report.ts | 2 +- 4 files changed, 40 insertions(+), 12 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 5a48bf38c556..554b0ca0f505 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -88,9 +88,35 @@ type ReportAndWorkspaceName = { workspaceName?: string; }; +type OptimisticAddCommentReportAction = Pick< + ReportAction, + | 'reportActionID' + | 'actionName' + | 'actorAccountID' + | 'person' + | 'automatic' + | 'avatar' + | 'created' + | 'message' + | 'isFirstItem' + | 'isAttachment' + | 'attachmentInfo' + | 'pendingAction' + | 'shouldShow' + | 'originalMessage' + | 'childReportID' + | 'parentReportID' + | 'childType' + | 'childReportName' + | 'childManagerAccountID' + | 'childStatusNum' + | 'childStateNum' + | 'errors' +>; + type OptimisticReportAction = { commentText: string; - reportAction: {reportActionID: string} & Partial; + reportAction: OptimisticAddCommentReportAction; }; type UpdateOptimisticParentReportAction = { @@ -4048,7 +4074,7 @@ function getTaskAssigneeChatOnyxData( { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${assigneeChatReportID}`, - value: {[optimisticAssigneeAddComment.reportAction.reportActionID ?? '']: optimisticAssigneeAddComment.reportAction}, + value: {[optimisticAssigneeAddComment.reportAction.reportActionID ?? '']: optimisticAssigneeAddComment.reportAction as ReportAction}, }, { onyxMethod: Onyx.METHOD.MERGE, @@ -4435,4 +4461,4 @@ export { shouldDisableThread, }; -export type {ExpenseOriginalMessage, OptionData, OptimisticChatReport, DisplayNameWithTooltips, OptimisticTaskReportAction}; +export type {ExpenseOriginalMessage, OptionData, OptimisticChatReport, DisplayNameWithTooltips, OptimisticTaskReportAction, OptimisticAddCommentReportAction}; diff --git a/src/libs/actions/Report.ts b/src/libs/actions/Report.ts index ef24b64ce7c7..03335f8dc7c2 100644 --- a/src/libs/actions/Report.ts +++ b/src/libs/actions/Report.ts @@ -22,6 +22,7 @@ import * as PersonalDetailsUtils from '@libs/PersonalDetailsUtils'; import * as Pusher from '@libs/Pusher/pusher'; import * as ReportActionsUtils from '@libs/ReportActionsUtils'; import * as ReportUtils from '@libs/ReportUtils'; +import {OptimisticAddCommentReportAction} from '@libs/ReportUtils'; import shouldSkipDeepLinkNavigation from '@libs/shouldSkipDeepLinkNavigation'; import * as UserUtils from '@libs/UserUtils'; import Visibility from '@libs/Visibility'; @@ -281,8 +282,8 @@ function notifyNewAction(reportID: string, accountID?: number, reportActionID?: */ function addActions(reportID: string, text = '', file?: File) { let reportCommentText = ''; - let reportCommentAction: Partial | undefined; - let attachmentAction: Partial | undefined; + let reportCommentAction: OptimisticAddCommentReportAction | undefined; + let attachmentAction: OptimisticAddCommentReportAction | undefined; let commandName = 'AddComment'; if (text) { @@ -321,7 +322,7 @@ function addActions(reportID: string, text = '', file?: File) { } // Optimistically add the new actions to the store before waiting to save them to the server - const optimisticReportActions: OnyxCollection> = {}; + const optimisticReportActions: OnyxCollection = {}; if (text && reportCommentAction?.reportActionID) { optimisticReportActions[reportCommentAction.reportActionID] = reportCommentAction; } @@ -355,7 +356,7 @@ function addActions(reportID: string, text = '', file?: File) { { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, - value: optimisticReportActions, + value: optimisticReportActions as ReportActions, }, ]; @@ -391,11 +392,12 @@ function addActions(reportID: string, text = '', file?: File) { }; } - const failureReportActions: OnyxCollection> = {}; + const failureReportActions: Record = {}; Object.entries(optimisticReportActions).forEach(([actionKey, action]) => { failureReportActions[actionKey] = { - ...action, + // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style + ...(action as OptimisticAddCommentReportAction), errors: ErrorUtils.getMicroSecondOnyxError('report.genericAddCommentFailureMessage'), }; }); @@ -409,7 +411,7 @@ function addActions(reportID: string, text = '', file?: File) { { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, - value: failureReportActions, + value: failureReportActions as ReportActions, }, ]; diff --git a/src/libs/actions/Task.ts b/src/libs/actions/Task.ts index 815a5a4ba3a1..4e82beb3a2ac 100644 --- a/src/libs/actions/Task.ts +++ b/src/libs/actions/Task.ts @@ -193,7 +193,7 @@ function createTaskAndNavigate( { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReportID}`, - value: {[optimisticAddCommentReport.reportAction.reportActionID]: optimisticAddCommentReport.reportAction}, + value: {[optimisticAddCommentReport.reportAction.reportActionID]: optimisticAddCommentReport.reportAction as OnyxTypes.ReportAction}, }, ); diff --git a/src/types/onyx/Report.ts b/src/types/onyx/Report.ts index 4501bf64a571..624a8bbe4d9a 100644 --- a/src/types/onyx/Report.ts +++ b/src/types/onyx/Report.ts @@ -154,7 +154,7 @@ type Report = { nonReimbursableTotal?: number; isHidden?: boolean; isChatRoom?: boolean; - participantsList?: Array>; + participantsList?: PersonalDetails[]; text?: string; updateReportInLHN?: boolean; privateNotes?: Record; From d0c910e7ddce28a923aa400694f800013e1a5cbd Mon Sep 17 00:00:00 2001 From: Pavlo Tsimura Date: Tue, 2 Jan 2024 16:36:04 +0100 Subject: [PATCH 183/583] Use report.lastMessageText as the all-case fallback for getLastMessageTextForReport --- src/libs/OptionsListUtils.js | 10 +++++----- src/libs/PersonalDetailsUtils.ts | 32 ++++++++++++++++++++++++++++++++ src/libs/SidebarUtils.ts | 2 +- 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/libs/OptionsListUtils.js b/src/libs/OptionsListUtils.js index 0d5162399fcb..1e8429810671 100644 --- a/src/libs/OptionsListUtils.js +++ b/src/libs/OptionsListUtils.js @@ -379,9 +379,10 @@ function getAllReportErrors(report, reportActions) { /** * Get the last message text from the report directly or from other sources for special cases. * @param {Object} report + * @param {Object[]} personalDetails - list of personal details of the report participants * @returns {String} */ -function getLastMessageTextForReport(report) { +function getLastMessageTextForReport(report, personalDetails) { const lastReportAction = _.find(allSortedReportActions[report.reportID], (reportAction) => ReportActionUtils.shouldReportActionBeVisibleAsLastAction(reportAction)); let lastMessageTextFromReport = ''; const lastActionName = lodashGet(lastReportAction, 'actionName', ''); @@ -418,10 +419,9 @@ function getLastMessageTextForReport(report) { lastMessageTextFromReport = lodashGet(lastReportAction, 'message[0].text', ''); } else if (ReportActionUtils.isCreatedTaskReportAction(lastReportAction)) { lastMessageTextFromReport = TaskUtils.getTaskCreatedMessage(lastReportAction); - } else { - lastMessageTextFromReport = report ? report.lastMessageText || '' : ''; } - return lastMessageTextFromReport; + + return lastMessageTextFromReport || PersonalDetailsUtils.replaceLoginsWithDisplayNames(lodashGet(report, 'lastMessageText', ''), personalDetails); } /** @@ -509,7 +509,7 @@ function createOption(accountIDs, personalDetails, report, reportActions = {}, { hasMultipleParticipants = personalDetailList.length > 1 || result.isChatRoom || result.isPolicyExpenseChat; subtitle = ReportUtils.getChatRoomSubtitle(report); - const lastMessageTextFromReport = getLastMessageTextForReport(report); + const lastMessageTextFromReport = getLastMessageTextForReport(report, personalDetailList); const lastActorDetails = personalDetailMap[report.lastActorAccountID] || null; const lastActorDisplayName = hasMultipleParticipants && lastActorDetails && lastActorDetails.accountID !== currentUserAccountID ? lastActorDetails.firstName || lastActorDetails.displayName : ''; diff --git a/src/libs/PersonalDetailsUtils.ts b/src/libs/PersonalDetailsUtils.ts index a5a033797c7b..00007b5e04d2 100644 --- a/src/libs/PersonalDetailsUtils.ts +++ b/src/libs/PersonalDetailsUtils.ts @@ -6,13 +6,28 @@ import * as LocalePhoneNumber from './LocalePhoneNumber'; import * as Localize from './Localize'; import * as UserUtils from './UserUtils'; +let currentUserAccountID: number | undefined; +Onyx.connect({ + key: ONYXKEYS.SESSION, + callback: (value) => { + // When signed out, val is undefined + if (!value) { + return; + } + + currentUserAccountID = value.accountID; + }, +}); + let personalDetails: Array = []; let allPersonalDetails: OnyxEntry = {}; +let currentUserPersonalDetails: OnyxEntry; Onyx.connect({ key: ONYXKEYS.PERSONAL_DETAILS_LIST, callback: (val) => { personalDetails = Object.values(val ?? {}); allPersonalDetails = val; + currentUserPersonalDetails = val?.[currentUserAccountID ?? -1] ?? null; }, }); @@ -27,6 +42,22 @@ function getDisplayNameOrDefault(displayName?: string, defaultValue = ''): strin return displayName || defaultValue || Localize.translateLocal('common.hidden'); } +function replaceLoginsWithDisplayNames(text: string, details: PersonalDetails[], includeCurrentAccount = true): string { + const result = details.reduce((replacedText, detail) => { + if (!detail.login) { + return replacedText; + } + + return replacedText.replaceAll(detail.login, getDisplayNameOrDefault(detail?.displayName)); + }, text); + + if (!includeCurrentAccount || !currentUserPersonalDetails) { + return result; + } + + return result.replaceAll(currentUserPersonalDetails.login ?? '', getDisplayNameOrDefault(currentUserPersonalDetails?.displayName)); +} + /** * Given a list of account IDs (as number) it will return an array of personal details objects. * @param accountIDs - Array of accountIDs @@ -212,4 +243,5 @@ export { getFormattedStreet, getStreetLines, getEffectiveDisplayName, + replaceLoginsWithDisplayNames, }; diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index c4fad1a86906..cf90f87ab5e3 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -319,7 +319,7 @@ function getOptionData( // We only create tooltips for the first 10 users or so since some reports have hundreds of users, causing performance to degrade. const displayNamesWithTooltips = ReportUtils.getDisplayNamesWithTooltips((participantPersonalDetailList || []).slice(0, 10), hasMultipleParticipants); - const lastMessageTextFromReport = OptionsListUtils.getLastMessageTextForReport(report); + const lastMessageTextFromReport = OptionsListUtils.getLastMessageTextForReport(report, displayNamesWithTooltips); // If the last actor's details are not currently saved in Onyx Collection, // then try to get that from the last report action if that action is valid From 0ab996ceb60081b96f464c3597c10cfe79693d72 Mon Sep 17 00:00:00 2001 From: Blazej Kustra Date: Tue, 2 Jan 2024 17:22:05 +0100 Subject: [PATCH 184/583] Fix ref types --- src/components/Modal/types.ts | 4 +- src/components/Popover/types.ts | 42 ++++++++++--------- src/components/PopoverProvider/types.ts | 8 ++-- .../PopoverWithoutOverlay/index.tsx | 3 +- src/components/PopoverWithoutOverlay/types.ts | 4 +- 5 files changed, 33 insertions(+), 28 deletions(-) diff --git a/src/components/Modal/types.ts b/src/components/Modal/types.ts index 461a5935eda9..af6d90268521 100644 --- a/src/components/Modal/types.ts +++ b/src/components/Modal/types.ts @@ -1,4 +1,4 @@ -import {ViewStyle} from 'react-native'; +import {View, ViewStyle} from 'react-native'; import {ModalProps} from 'react-native-modal'; import {ValueOf} from 'type-fest'; import {WindowDimensionsProps} from '@components/withWindowDimensions/types'; @@ -23,7 +23,7 @@ type BaseModalProps = WindowDimensionsProps & shouldSetModalVisibility?: boolean; /** Callback method fired when the user requests to close the modal */ - onClose: (ref?: React.RefObject) => void; + onClose: (ref?: React.RefObject) => void; /** State that determines whether to display the modal or not */ isVisible: boolean; diff --git a/src/components/Popover/types.ts b/src/components/Popover/types.ts index 103ab0404081..f58f282c599d 100644 --- a/src/components/Popover/types.ts +++ b/src/components/Popover/types.ts @@ -1,38 +1,42 @@ -import {ReactNode, RefObject} from 'react'; +import {RefObject} from 'react'; import {View} from 'react-native'; import BaseModalProps, {PopoverAnchorPosition} from '@components/Modal/types'; import {WindowDimensionsProps} from '@components/withWindowDimensions/types'; +import ChildrenProps from '@src/types/utils/ChildrenProps'; + +type AnchorAlignment = {horizontal: string; vertical: string}; type PopoverDimensions = { width: number; height: number; }; -type PopoverProps = BaseModalProps & { - /** The anchor position of the popover */ - anchorPosition?: PopoverAnchorPosition; +type PopoverProps = BaseModalProps & + ChildrenProps & { + /** The anchor position of the popover */ + anchorPosition?: PopoverAnchorPosition; - /** The anchor ref of the popover */ - anchorRef: RefObject; + /** The anchor alignment of the popover */ + anchorAlignment?: AnchorAlignment; - /** Whether disable the animations */ - disableAnimation?: boolean; + /** The anchor ref of the popover */ + anchorRef: RefObject; - /** Whether we don't want to show overlay */ - withoutOverlay: boolean; + /** Whether disable the animations */ + disableAnimation?: boolean; - /** The dimensions of the popover */ - popoverDimensions?: PopoverDimensions; + /** Whether we don't want to show overlay */ + withoutOverlay: boolean; - /** The ref of the popover */ - withoutOverlayRef?: RefObject; + /** The dimensions of the popover */ + popoverDimensions?: PopoverDimensions; - /** Whether we want to show the popover on the right side of the screen */ - fromSidebarMediumScreen?: boolean; + /** The ref of the popover */ + withoutOverlayRef?: RefObject; - /** The popover children */ - children: ReactNode; -}; + /** Whether we want to show the popover on the right side of the screen */ + fromSidebarMediumScreen?: boolean; + }; type PopoverWithWindowDimensionsProps = PopoverProps & WindowDimensionsProps; diff --git a/src/components/PopoverProvider/types.ts b/src/components/PopoverProvider/types.ts index dc0208e10dd7..a638ed982196 100644 --- a/src/components/PopoverProvider/types.ts +++ b/src/components/PopoverProvider/types.ts @@ -8,14 +8,14 @@ type PopoverContextProps = { type PopoverContextValue = { onOpen?: (popoverParams: AnchorRef) => void; popover?: AnchorRef | Record | null; - close: (anchorRef?: RefObject) => void; + close: (anchorRef?: RefObject) => void; isOpen: boolean; }; type AnchorRef = { - ref: RefObject; - close: (anchorRef?: RefObject) => void; - anchorRef: RefObject; + ref: RefObject; + close: (anchorRef?: RefObject) => void; + anchorRef: RefObject; onOpenCallback?: () => void; onCloseCallback?: () => void; }; diff --git a/src/components/PopoverWithoutOverlay/index.tsx b/src/components/PopoverWithoutOverlay/index.tsx index f83949bcbe9d..0d4ef7d2e912 100644 --- a/src/components/PopoverWithoutOverlay/index.tsx +++ b/src/components/PopoverWithoutOverlay/index.tsx @@ -7,6 +7,7 @@ import useStyleUtils from '@hooks/useStyleUtils'; import useThemeStyles from '@hooks/useThemeStyles'; import useWindowDimensions from '@hooks/useWindowDimensions'; import * as Modal from '@userActions/Modal'; +import viewRef from '@src/types/utils/viewRef'; import PopoverWithoutOverlayProps from './types'; function PopoverWithoutOverlay( @@ -118,7 +119,7 @@ function PopoverWithoutOverlay( return ( ; + anchorRef: React.RefObject; /** A react-native-animatable animation timing for the modal display animation */ animationInTiming?: number; @@ -22,7 +22,7 @@ type PopoverWithoutOverlayProps = ChildrenProps & disableAnimation?: boolean; /** The ref of the popover */ - withoutOverlayRef: React.RefObject; + withoutOverlayRef: React.RefObject; }; export default PopoverWithoutOverlayProps; From a2508343aa10ec039299fbccf7aeab2c62014122 Mon Sep 17 00:00:00 2001 From: Jakub Butkiewicz Date: Tue, 2 Jan 2024 17:41:12 +0100 Subject: [PATCH 185/583] ref: migrate ReportAttachments page to Typescript --- ...rtAttachments.js => ReportAttachments.tsx} | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) rename src/pages/home/report/{ReportAttachments.js => ReportAttachments.tsx} (55%) diff --git a/src/pages/home/report/ReportAttachments.js b/src/pages/home/report/ReportAttachments.tsx similarity index 55% rename from src/pages/home/report/ReportAttachments.js rename to src/pages/home/report/ReportAttachments.tsx index 8ecbb036a756..1558cc8a13c4 100644 --- a/src/pages/home/report/ReportAttachments.js +++ b/src/pages/home/report/ReportAttachments.tsx @@ -1,43 +1,45 @@ -import PropTypes from 'prop-types'; +import {StackScreenProps} from '@react-navigation/stack'; import React, {useCallback} from 'react'; -import _ from 'underscore'; import AttachmentModal from '@components/AttachmentModal'; import ComposerFocusManager from '@libs/ComposerFocusManager'; import Navigation from '@libs/Navigation/Navigation'; +import {AuthScreensParamList} from '@libs/Navigation/types'; import * as ReportUtils from '@libs/ReportUtils'; import ROUTES from '@src/ROUTES'; +import SCREENS from '@src/SCREENS'; -const propTypes = { - /** Navigation route context info provided by react navigation */ - route: PropTypes.shape({ - /** Route specific parameters used on this screen */ - params: PropTypes.shape({ - /** The report ID which the attachment is associated with */ - reportID: PropTypes.string.isRequired, - /** The uri encoded source of the attachment */ - source: PropTypes.string.isRequired, - }).isRequired, - }).isRequired, +type Attachment = { + file: { + name: string; + }; + hasBeenFlagged: boolean; + isAuthTokenRequired: boolean; + isReceipt: boolean; + reportActionID: string; + source: string; }; -function ReportAttachments(props) { - const reportID = _.get(props, ['route', 'params', 'reportID']); +type ReportAttachmentsProps = StackScreenProps; + +function ReportAttachments({route}: ReportAttachmentsProps) { + const reportID = route.params?.reportID; const report = ReportUtils.getReport(reportID); // In native the imported images sources are of type number. Ref: https://reactnative.dev/docs/image#imagesource - const decodedSource = decodeURI(_.get(props, ['route', 'params', 'source'])); + const decodedSource = decodeURI(route.params.source); const source = Number(decodedSource) || decodedSource; const onCarouselAttachmentChange = useCallback( - (attachment) => { - const route = ROUTES.REPORT_ATTACHMENTS.getRoute(reportID, attachment.source); - Navigation.navigate(route); + (attachment: Attachment) => { + const routeToNavigate = ROUTES.REPORT_ATTACHMENTS.getRoute(reportID, attachment.source); + Navigation.navigate(routeToNavigate); }, [reportID], ); return ( Date: Tue, 2 Jan 2024 17:41:53 +0100 Subject: [PATCH 186/583] Fix typecheck and lint --- src/libs/DistanceRequestUtils.ts | 4 ++-- src/libs/PolicyUtils.ts | 6 +++--- src/libs/actions/Policy.ts | 23 +++++------------------ 3 files changed, 10 insertions(+), 23 deletions(-) diff --git a/src/libs/DistanceRequestUtils.ts b/src/libs/DistanceRequestUtils.ts index 477bfb4b61f9..95fee9b4d442 100644 --- a/src/libs/DistanceRequestUtils.ts +++ b/src/libs/DistanceRequestUtils.ts @@ -6,8 +6,8 @@ import * as CurrencyUtils from './CurrencyUtils'; import * as PolicyUtils from './PolicyUtils'; type DefaultMileageRate = { - rate: number; - currency: string; + rate?: number; + currency?: string; unit: Unit; }; diff --git a/src/libs/PolicyUtils.ts b/src/libs/PolicyUtils.ts index bc7ddb14b53e..d3d6e9cc4cf6 100644 --- a/src/libs/PolicyUtils.ts +++ b/src/libs/PolicyUtils.ts @@ -12,10 +12,10 @@ type UnitRate = {rate: number}; * Filter out the active policies, which will exclude policies with pending deletion * These are policies that we can use to create reports with in NewDot. */ -function getActivePolicies(policies: OnyxCollection): Policy[] | undefined { - return Object.values(policies ?? {}).filter( +function getActivePolicies(policies: OnyxCollection): Policy[] { + return Object.values(policies ?? {}).filter( (policy): policy is Policy => - policy !== null && policy && (policy.isPolicyExpenseChatEnabled || policy.areChatRoomsEnabled) && policy.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, + policy !== null && !!policy && (!!policy.isPolicyExpenseChatEnabled || !!policy.areChatRoomsEnabled) && policy.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, ); } diff --git a/src/libs/actions/Policy.ts b/src/libs/actions/Policy.ts index 8da49639ad9f..ee40ebadb4e1 100644 --- a/src/libs/actions/Policy.ts +++ b/src/libs/actions/Policy.ts @@ -17,19 +17,7 @@ import * as ReportUtils from '@libs/ReportUtils'; import * as TransactionUtils from '@libs/TransactionUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import { - PersonalDetails, - PersonalDetailsList, - Policy, - PolicyMember, - PolicyTags, - RecentlyUsedCategories, - RecentlyUsedTags, - ReimbursementAccount, - Report, - ReportAction, - Transaction, -} from '@src/types/onyx'; +import {PersonalDetailsList, Policy, PolicyMember, PolicyTags, RecentlyUsedCategories, RecentlyUsedTags, ReimbursementAccount, Report, ReportAction, Transaction} from '@src/types/onyx'; import {Errors} from '@src/types/onyx/OnyxCommon'; import {CustomUnit, NewCustomUnit} from '@src/types/onyx/Policy'; import {isNotEmptyObject} from '@src/types/utils/EmptyObject'; @@ -47,8 +35,7 @@ Onyx.connect({ // More info: https://github.com/Expensify/App/issues/14260 const policyID = key.replace(ONYXKEYS.COLLECTION.POLICY, ''); const policyReports = ReportUtils.getAllPolicyReports(policyID); - type cleanUpMergeKey = `${typeof ONYXKEYS.COLLECTION.REPORT}${string}`; - const cleanUpMergeQueries: Record>> = {}; + const cleanUpMergeQueries: Record<`${typeof ONYXKEYS.COLLECTION.REPORT}${string}`, NullishDeep>> = {}; const cleanUpSetQueries: OnyxCollection> = {}; policyReports.forEach((policyReport) => { if (!policyReport) { @@ -275,8 +262,8 @@ function deleteWorkspace(policyID: string, reports: Report[], policyName: string /** * Is the user an admin of a free policy (aka workspace)? */ -function isAdminOfFreePolicy(policies: Record): boolean { - return Object.values(policies).some((policy) => policy && policy.type === CONST.POLICY.TYPE.FREE && policy.role === CONST.POLICY.ROLE.ADMIN); +function isAdminOfFreePolicy(policies?: Record>): boolean { + return Object.values(policies ?? {}).some((policy) => policy && policy.type === CONST.POLICY.TYPE.FREE && policy.role === CONST.POLICY.ROLE.ADMIN); } type AnnounceRoomMembers = { @@ -405,7 +392,7 @@ function removeMembers(accountIDs: number[], policyID: string) { // If we delete all these logins then we should clear the informative messages since they are no longer relevant. if (isNotEmptyObject(policy?.primaryLoginsInvited ?? {})) { // Take the current policy members and remove them optimistically - const policyMemberAccountIDs = Object.keys(allPolicyMembers?.[`${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`] ?? {}).map((accountID) => parseInt(accountID)); + const policyMemberAccountIDs = Object.keys(allPolicyMembers?.[`${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`] ?? {}).map((accountID) => parseInt(accountID, 10)); const remainingMemberAccountIDs = policyMemberAccountIDs.filter((e) => !accountIDs.includes(Number(e))); const remainingLogins: string[] = PersonalDetailsUtils.getLoginsByAccountIDs(remainingMemberAccountIDs); const invitedPrimaryToSecondaryLogins: Record = {}; From 18a8891b937cbea0e1dc4bf13e6afaf8f6cda301 Mon Sep 17 00:00:00 2001 From: Blazej Kustra Date: Tue, 2 Jan 2024 18:15:32 +0100 Subject: [PATCH 187/583] Final Policy adjustements --- src/libs/PersonalDetailsUtils.ts | 54 ++- src/libs/actions/Policy.ts | 543 ++++++++++++++++--------------- 2 files changed, 305 insertions(+), 292 deletions(-) diff --git a/src/libs/PersonalDetailsUtils.ts b/src/libs/PersonalDetailsUtils.ts index a5a033797c7b..b0616b1a723a 100644 --- a/src/libs/PersonalDetailsUtils.ts +++ b/src/libs/PersonalDetailsUtils.ts @@ -1,7 +1,8 @@ -import Onyx, {OnyxEntry} from 'react-native-onyx'; +import Onyx, {OnyxEntry, OnyxUpdate} from 'react-native-onyx'; import ONYXKEYS from '@src/ONYXKEYS'; import * as OnyxTypes from '@src/types/onyx'; import {PersonalDetails, PersonalDetailsList} from '@src/types/onyx'; +import {OnyxData} from '@src/types/onyx/Request'; import * as LocalePhoneNumber from './LocalePhoneNumber'; import * as Localize from './Localize'; import * as UserUtils from './UserUtils'; @@ -95,16 +96,15 @@ function getLoginsByAccountIDs(accountIDs: number[]): string[] { * @param accountIDs Array of user accountIDs * @returns Object with optimisticData, successData and failureData (object of personal details objects) */ -function getNewPersonalDetailsOnyxData(logins: string[], accountIDs: number[]) { - const optimisticData: PersonalDetailsList = {}; - const successData: PersonalDetailsList = {}; - const failureData: PersonalDetailsList = {}; +function getNewPersonalDetailsOnyxData(logins: string[], accountIDs: number[]): Required { + const personalDetailsNew: PersonalDetailsList = {}; + const personalDetailsCleanup: PersonalDetailsList = {}; logins.forEach((login, index) => { const accountID = accountIDs[index]; if (allPersonalDetails && Object.keys(allPersonalDetails?.[accountID] ?? {}).length === 0) { - optimisticData[accountID] = { + personalDetailsNew[accountID] = { login, accountID, avatar: UserUtils.getDefaultAvatarURL(accountID), @@ -115,32 +115,30 @@ function getNewPersonalDetailsOnyxData(logins: string[], accountIDs: number[]) { * Cleanup the optimistic user to ensure it does not permanently persist. * This is done to prevent duplicate entries (upon success) since the BE will return other personal details with the correct account IDs. */ - successData[accountID] = null; + personalDetailsCleanup[accountID] = null; } }); + const optimisticData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: ONYXKEYS.PERSONAL_DETAILS_LIST, + value: personalDetailsNew, + }, + ]; + + const successData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: ONYXKEYS.PERSONAL_DETAILS_LIST, + value: personalDetailsCleanup, + }, + ]; + return { - optimisticData: [ - { - onyxMethod: Onyx.METHOD.MERGE, - key: ONYXKEYS.PERSONAL_DETAILS_LIST, - value: optimisticData, - }, - ], - successData: [ - { - onyxMethod: Onyx.METHOD.MERGE, - key: ONYXKEYS.PERSONAL_DETAILS_LIST, - value: successData, - }, - ], - failureData: [ - { - onyxMethod: Onyx.METHOD.MERGE, - key: ONYXKEYS.PERSONAL_DETAILS_LIST, - value: failureData, - }, - ], + optimisticData, + successData, + failureData: [], }; } diff --git a/src/libs/actions/Policy.ts b/src/libs/actions/Policy.ts index ee40ebadb4e1..e74d4a5f7119 100644 --- a/src/libs/actions/Policy.ts +++ b/src/libs/actions/Policy.ts @@ -35,8 +35,8 @@ Onyx.connect({ // More info: https://github.com/Expensify/App/issues/14260 const policyID = key.replace(ONYXKEYS.COLLECTION.POLICY, ''); const policyReports = ReportUtils.getAllPolicyReports(policyID); - const cleanUpMergeQueries: Record<`${typeof ONYXKEYS.COLLECTION.REPORT}${string}`, NullishDeep>> = {}; - const cleanUpSetQueries: OnyxCollection> = {}; + const cleanUpMergeQueries: Record<`${typeof ONYXKEYS.COLLECTION.REPORT}${string}`, NullishDeep> = {}; + const cleanUpSetQueries: Record<`${typeof ONYXKEYS.COLLECTION.REPORT_DRAFT_COMMENT}${string}` | `${typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS_DRAFTS}${string}`, null> = {}; policyReports.forEach((policyReport) => { if (!policyReport) { return; @@ -47,7 +47,7 @@ Onyx.connect({ cleanUpSetQueries[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS_DRAFTS}${reportID}`] = null; }); Onyx.mergeCollection(ONYXKEYS.COLLECTION.REPORT, cleanUpMergeQueries); - Onyx.multiSet(cleanUpSetQueries as Partial<{string: null}>); + Onyx.multiSet(cleanUpSetQueries); delete allPolicies[key]; return; } @@ -173,40 +173,6 @@ function deleteWorkspace(policyID: string, reports: Report[], policyName: string errors: null, }, }, - ...reports.map(({reportID}) => ({ - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`, - value: { - stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, - statusNum: CONST.REPORT.STATUS.CLOSED, - hasDraft: false, - oldPolicyName: allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]?.name ?? '', - }, - })), - - ...reports.map(({reportID}) => ({ - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS_DRAFTS}${reportID}`, - value: null, - })), - - // Add closed actions to all chat reports linked to this policy - ...reports.map(({reportID, ownerAccountID}) => { - // Announce & admin chats have FAKE owners, but workspace chats w/ users do have owners. - let emailClosingReport: string = CONST.POLICY.OWNER_EMAIL_FAKE; - if (!!ownerAccountID && ownerAccountID !== CONST.POLICY.OWNER_ACCOUNT_ID_FAKE) { - emailClosingReport = allPersonalDetails?.[ownerAccountID]?.login ?? ''; - } - const optimisticClosedReportAction = ReportUtils.buildOptimisticClosedReportAction(emailClosingReport, policyName, CONST.REPORT.ARCHIVE_REASON.POLICY_DELETED); - const optimisticReportActions: Record = {}; - optimisticReportActions[optimisticClosedReportAction.reportActionID] = optimisticClosedReportAction as ReportAction; - return { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, - value: optimisticReportActions, - }; - }), - ...(!hasActiveFreePolicy(filteredPolicies) ? [ { @@ -220,18 +186,42 @@ function deleteWorkspace(policyID: string, reports: Report[], policyName: string : []), ]; - // Restore the old report stateNum and statusNum - const failureData: OnyxUpdate[] = [ - ...reports.map(({reportID, stateNum, statusNum, hasDraft, oldPolicyName}) => ({ + reports.forEach(({reportID, ownerAccountID}) => { + optimisticData.push({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`, value: { - stateNum, - statusNum, - hasDraft, - oldPolicyName, + stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS.CLOSED, + hasDraft: false, + oldPolicyName: allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]?.name ?? '', }, - })), + }); + + optimisticData.push({ + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS_DRAFTS}${reportID}`, + value: null, + }); + + // Add closed actions to all chat reports linked to this policy + // Announce & admin chats have FAKE owners, but workspace chats w/ users do have owners. + let emailClosingReport: string = CONST.POLICY.OWNER_EMAIL_FAKE; + if (!!ownerAccountID && ownerAccountID !== CONST.POLICY.OWNER_ACCOUNT_ID_FAKE) { + emailClosingReport = allPersonalDetails?.[ownerAccountID]?.login ?? ''; + } + const optimisticClosedReportAction = ReportUtils.buildOptimisticClosedReportAction(emailClosingReport, policyName, CONST.REPORT.ARCHIVE_REASON.POLICY_DELETED); + const optimisticReportActions: Record = {}; + optimisticReportActions[optimisticClosedReportAction.reportActionID] = optimisticClosedReportAction as ReportAction; + optimisticData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, + value: optimisticReportActions, + }); + }); + + // Restore the old report stateNum and statusNum + const failureData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: ONYXKEYS.REIMBURSEMENT_ACCOUNT, @@ -241,6 +231,19 @@ function deleteWorkspace(policyID: string, reports: Report[], policyName: string }, ]; + reports.forEach(({reportID, stateNum, statusNum, hasDraft, oldPolicyName}) => { + failureData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`, + value: { + stateNum, + statusNum, + hasDraft, + oldPolicyName, + }, + }); + }); + // We don't need success data since the push notification will update // the onyxData for all connected clients. const successData: OnyxUpdate[] = []; @@ -370,7 +373,11 @@ function removeMembers(accountIDs: number[], policyID: string) { key: membersListKey, value: optimisticMembersState, }, - ...workspaceChats.map((report) => ({ + ...announceRoomMembers.onyxOptimisticData, + ]; + + workspaceChats.forEach((report) => { + optimisticData.push({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${report?.reportID}`, value: { @@ -379,14 +386,15 @@ function removeMembers(accountIDs: number[], policyID: string) { oldPolicyName: policy.name, hasDraft: false, }, - })), - ...optimisticClosedReportActions.map((reportAction, index) => ({ + }); + }); + optimisticClosedReportActions.forEach((reportAction, index) => { + optimisticData.push({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${workspaceChats?.[index]?.reportID}`, value: {[reportAction.reportActionID]: reportAction as ReportAction}, - })), - ...announceRoomMembers.onyxOptimisticData, - ]; + }); + }); // If the policy has primaryLoginsInvited, then it displays informative messages on the members page about which primary logins were added by secondary logins. // If we delete all these logins then we should clear the informative messages since they are no longer relevant. @@ -428,7 +436,11 @@ function removeMembers(accountIDs: number[], policyID: string) { key: membersListKey, value: failureMembersState, }, - ...filteredWorkspaceChats.map(({reportID, stateNum, statusNum, hasDraft, oldPolicyName = null}) => ({ + ...announceRoomMembers.onyxFailureData, + ]; + + filteredWorkspaceChats.forEach(({reportID, stateNum, statusNum, hasDraft, oldPolicyName = null}) => { + failureData.push({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`, value: { @@ -437,14 +449,15 @@ function removeMembers(accountIDs: number[], policyID: string) { hasDraft, oldPolicyName, }, - })), - ...optimisticClosedReportActions.map((reportAction, index) => ({ + }); + }); + optimisticClosedReportActions.forEach((reportAction, index) => { + failureData.push({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${workspaceChats?.[index]?.reportID}`, value: {[reportAction.reportActionID]: null}, - })), - ...announceRoomMembers.onyxFailureData, - ]; + }); + }); type DeleteMembersFromWorkspaceParams = { emailList: string; @@ -594,7 +607,7 @@ function addMembersToWorkspace(invitedEmailsToAccountIDs: Record // Convert to object with each key containing {pendingAction: ‘add’} value: optimisticMembersState, }, - ...(newPersonalDetailsOnyxData.optimisticData as OnyxUpdate[]), + ...newPersonalDetailsOnyxData.optimisticData, ...membersChats.onyxOptimisticData, ...announceRoomMembers.onyxOptimisticData, ]; @@ -617,7 +630,7 @@ function addMembersToWorkspace(invitedEmailsToAccountIDs: Record return {...accountIDsWithClearedPendingAction, [accountID]: value}; }, {}), }, - ...(newPersonalDetailsOnyxData.successData as OnyxUpdate[]), + ...newPersonalDetailsOnyxData.successData, ...membersChats.onyxSuccessData, ]; @@ -630,7 +643,7 @@ function addMembersToWorkspace(invitedEmailsToAccountIDs: Record // need to remove the members since that is handled by onClose of OfflineWithFeedback. value: failureMembersState, }, - ...(newPersonalDetailsOnyxData.failureData as OnyxUpdate[]), + ...newPersonalDetailsOnyxData.failureData, ...membersChats.onyxFailureData, ...announceRoomMembers.onyxFailureData, ]; @@ -1213,6 +1226,192 @@ function createWorkspace(policyOwnerEmail = '', makeMeAdmin = false, policyName expenseCreatedReportActionID, } = ReportUtils.buildOptimisticWorkspaceChats(policyID, workspaceName); + const optimisticData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: { + id: policyID, + type: CONST.POLICY.TYPE.FREE, + name: workspaceName, + role: CONST.POLICY.ROLE.ADMIN, + owner: sessionEmail, + isPolicyExpenseChatEnabled: true, + outputCurrency, + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + customUnits, + }, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, + value: { + [sessionAccountID]: { + role: CONST.POLICY.ROLE.ADMIN, + errors: {}, + }, + }, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT}${announceChatReportID}`, + value: { + pendingFields: { + addWorkspaceRoom: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + }, + ...announceChatData, + }, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${announceChatReportID}`, + value: announceReportActionData, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT}${adminsChatReportID}`, + value: { + pendingFields: { + addWorkspaceRoom: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + }, + ...adminsChatData, + }, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${adminsChatReportID}`, + value: adminsReportActionData, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT}${expenseChatReportID}`, + value: { + pendingFields: { + addWorkspaceRoom: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + }, + ...expenseChatData, + }, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseChatReportID}`, + value: expenseReportActionData, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.POLICY_DRAFTS}${policyID}`, + value: null, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS_DRAFTS}${policyID}`, + value: null, + }, + ]; + + const successData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: {pendingAction: null}, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${announceChatReportID}`, + value: { + pendingFields: { + addWorkspaceRoom: null, + }, + pendingAction: null, + }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${announceChatReportID}`, + value: { + [Object.keys(announceChatData)[0]]: { + pendingAction: null, + }, + }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${adminsChatReportID}`, + value: { + pendingFields: { + addWorkspaceRoom: null, + }, + pendingAction: null, + }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${adminsChatReportID}`, + value: { + [Object.keys(adminsChatData)[0]]: { + pendingAction: null, + }, + }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${expenseChatReportID}`, + value: { + pendingFields: { + addWorkspaceRoom: null, + }, + pendingAction: null, + }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseChatReportID}`, + value: { + [Object.keys(expenseChatData)[0]]: { + pendingAction: null, + }, + }, + }, + ]; + + const failureData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, + value: null, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT}${announceChatReportID}`, + value: null, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${announceChatReportID}`, + value: null, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT}${adminsChatReportID}`, + value: null, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${adminsChatReportID}`, + value: null, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT}${expenseChatReportID}`, + value: null, + }, + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseChatReportID}`, + value: null, + }, + ]; + type CreateWorkspaceParams = { policyID: string; announceChatReportID: string; @@ -1245,191 +1444,7 @@ function createWorkspace(policyOwnerEmail = '', makeMeAdmin = false, policyName customUnitRateID, }; - API.write('CreateWorkspace', params, { - optimisticData: [ - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, - value: { - id: policyID, - type: CONST.POLICY.TYPE.FREE, - name: workspaceName, - role: CONST.POLICY.ROLE.ADMIN, - owner: sessionEmail, - isPolicyExpenseChatEnabled: true, - outputCurrency, - pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, - customUnits, - }, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, - value: { - [sessionAccountID]: { - role: CONST.POLICY.ROLE.ADMIN, - errors: {}, - }, - }, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT}${announceChatReportID}`, - value: { - pendingFields: { - addWorkspaceRoom: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, - }, - ...announceChatData, - }, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${announceChatReportID}`, - value: announceReportActionData, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT}${adminsChatReportID}`, - value: { - pendingFields: { - addWorkspaceRoom: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, - }, - ...adminsChatData, - }, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${adminsChatReportID}`, - value: adminsReportActionData, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT}${expenseChatReportID}`, - value: { - pendingFields: { - addWorkspaceRoom: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, - }, - ...expenseChatData, - }, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseChatReportID}`, - value: expenseReportActionData, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.POLICY_DRAFTS}${policyID}`, - value: null, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS_DRAFTS}${policyID}`, - value: null, - }, - ], - successData: [ - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, - value: {pendingAction: null}, - }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${announceChatReportID}`, - value: { - pendingFields: { - addWorkspaceRoom: null, - }, - pendingAction: null, - }, - }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${announceChatReportID}`, - value: { - [Object.keys(announceChatData)[0]]: { - pendingAction: null, - }, - }, - }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${adminsChatReportID}`, - value: { - pendingFields: { - addWorkspaceRoom: null, - }, - pendingAction: null, - }, - }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${adminsChatReportID}`, - value: { - [Object.keys(adminsChatData)[0]]: { - pendingAction: null, - }, - }, - }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${expenseChatReportID}`, - value: { - pendingFields: { - addWorkspaceRoom: null, - }, - pendingAction: null, - }, - }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseChatReportID}`, - value: { - [Object.keys(expenseChatData)[0]]: { - pendingAction: null, - }, - }, - }, - ], - failureData: [ - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, - value: null, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT}${announceChatReportID}`, - value: null, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${announceChatReportID}`, - value: null, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT}${adminsChatReportID}`, - value: null, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${adminsChatReportID}`, - value: null, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT}${expenseChatReportID}`, - value: null, - }, - { - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseChatReportID}`, - value: null, - }, - ], - }); + API.write('CreateWorkspace', params, {optimisticData, successData, failureData}); return adminsChatReportID; } @@ -1439,26 +1454,26 @@ function openWorkspaceReimburseView(policyID: string) { Log.warn('openWorkspaceReimburseView invalid params', {policyID}); return; } - const onyxData = { - successData: [ - { - onyxMethod: Onyx.METHOD.MERGE, - key: ONYXKEYS.REIMBURSEMENT_ACCOUNT, - value: { - isLoading: false, - }, + + const successData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: ONYXKEYS.REIMBURSEMENT_ACCOUNT, + value: { + isLoading: false, }, - ], - failureData: [ - { - onyxMethod: Onyx.METHOD.MERGE, - key: ONYXKEYS.REIMBURSEMENT_ACCOUNT, - value: { - isLoading: false, - }, + }, + ]; + + const failureData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: ONYXKEYS.REIMBURSEMENT_ACCOUNT, + value: { + isLoading: false, }, - ], - }; + }, + ]; type OpenWorkspaceReimburseViewParams = { policyID: string; @@ -1466,7 +1481,7 @@ function openWorkspaceReimburseView(policyID: string) { const params: OpenWorkspaceReimburseViewParams = {policyID}; - API.read('OpenWorkspaceReimburseView', params, onyxData); + API.read('OpenWorkspaceReimburseView', params, {successData, failureData}); } function openWorkspaceMembersPage(policyID: string, clientMemberEmails: string[]) { From 55648a3170097b485ac570d58bae0317f44836bc Mon Sep 17 00:00:00 2001 From: Blazej Kustra Date: Tue, 2 Jan 2024 18:34:21 +0100 Subject: [PATCH 188/583] Add missing return types and change Record to stricter types --- src/libs/actions/Policy.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/libs/actions/Policy.ts b/src/libs/actions/Policy.ts index e74d4a5f7119..7e88c419abe7 100644 --- a/src/libs/actions/Policy.ts +++ b/src/libs/actions/Policy.ts @@ -277,7 +277,7 @@ type AnnounceRoomMembers = { /** * Build optimistic data for adding members to the announcement room */ -function buildAnnounceRoomMembersOnyxData(policyID: string, accountIDs: number[]) { +function buildAnnounceRoomMembersOnyxData(policyID: string, accountIDs: number[]): AnnounceRoomMembers { const announceReport = ReportUtils.getRoom(CONST.REPORT.CHAT_TYPE.POLICY_ANNOUNCE, policyID); const announceRoomMembers: AnnounceRoomMembers = { onyxOptimisticData: [], @@ -312,7 +312,7 @@ type OptimisticAnnounceRoomMembers = { /** * Build optimistic data for removing users from the announcement room */ -function removeOptimisticAnnounceRoomMembers(policyID: string, accountIDs: number[]) { +function removeOptimisticAnnounceRoomMembers(policyID: string, accountIDs: number[]): OptimisticAnnounceRoomMembers { const announceReport = ReportUtils.getRoom(CONST.REPORT.CHAT_TYPE.POLICY_ANNOUNCE, policyID); const announceRoomMembers: OptimisticAnnounceRoomMembers = { onyxOptimisticData: [], @@ -358,9 +358,9 @@ function removeMembers(accountIDs: number[], policyID: string) { const announceRoomMembers = removeOptimisticAnnounceRoomMembers(policyID, accountIDs); - const optimisticMembersState: Record> = {}; - const successMembersState: Record | null> = {}; - const failureMembersState: Record> = {}; + const optimisticMembersState: OnyxCollection = {}; + const successMembersState: OnyxCollection = {}; + const failureMembersState: OnyxCollection = {}; accountIDs.forEach((accountID) => { optimisticMembersState[accountID] = {pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE}; successMembersState[accountID] = null; @@ -490,7 +490,7 @@ type WorkspaceMembersChats = { * * @returns - object with onyxSuccessData, onyxOptimisticData, and optimisticReportIDs (map login to reportID) */ -function createPolicyExpenseChats(policyID: string, invitedEmailsToAccountIDs: Record, hasOutstandingChildRequest = false) { +function createPolicyExpenseChats(policyID: string, invitedEmailsToAccountIDs: Record, hasOutstandingChildRequest = false): WorkspaceMembersChats { const workspaceMembersChats: WorkspaceMembersChats = { onyxSuccessData: [], onyxOptimisticData: [], @@ -590,8 +590,8 @@ function addMembersToWorkspace(invitedEmailsToAccountIDs: Record // create onyx data for policy expense chats for each new member const membersChats = createPolicyExpenseChats(policyID, invitedEmailsToAccountIDs); - const optimisticMembersState: Record> = {}; - const failureMembersState: Record> = {}; + const optimisticMembersState: OnyxCollection = {}; + const failureMembersState: OnyxCollection = {}; accountIDs.forEach((accountID) => { optimisticMembersState[accountID] = {pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD}; failureMembersState[accountID] = { From fa42c080c80c86ce040653aff55b5b86409717b9 Mon Sep 17 00:00:00 2001 From: Blazej Kustra Date: Tue, 2 Jan 2024 18:37:38 +0100 Subject: [PATCH 189/583] Make isHarvestingEnabled optional --- src/types/onyx/Policy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types/onyx/Policy.ts b/src/types/onyx/Policy.ts index ac9386775eb2..80660fec4517 100644 --- a/src/types/onyx/Policy.ts +++ b/src/types/onyx/Policy.ts @@ -91,7 +91,7 @@ type Policy = { autoReportingFrequency?: ValueOf; /** Whether the scheduled submit is enabled */ - isHarvestingEnabled: boolean; + isHarvestingEnabled?: boolean; /** The accountID of manager who the employee submits their expenses to on paid policies */ submitsTo?: number; From 7ae56a326cd6f29ce32a84c2bbbec0ca554c8c59 Mon Sep 17 00:00:00 2001 From: Blazej Kustra Date: Tue, 2 Jan 2024 19:51:57 +0100 Subject: [PATCH 190/583] Fix almost all type errors --- src/components/Modal/index.android.tsx | 3 +- src/components/Modal/index.ios.tsx | 3 +- src/components/Modal/index.tsx | 4 +- src/components/Modal/types.ts | 74 +++++++------- src/components/Popover/types.ts | 2 +- .../PopoverWithoutOverlay/index.tsx | 2 +- src/components/ShowContextMenuContext.tsx | 10 +- src/libs/ReportUtils.ts | 6 +- .../BaseReportActionContextMenu.tsx | 23 ++--- .../report/ContextMenu/ContextMenuActions.tsx | 17 ++-- .../PopoverReportActionContextMenu.tsx | 96 ++++++++----------- .../ContextMenu/ReportActionContextMenu.ts | 2 +- 12 files changed, 118 insertions(+), 124 deletions(-) diff --git a/src/components/Modal/index.android.tsx b/src/components/Modal/index.android.tsx index 2343cb4c70a9..eb5582e3c2e8 100644 --- a/src/components/Modal/index.android.tsx +++ b/src/components/Modal/index.android.tsx @@ -1,6 +1,5 @@ import React from 'react'; import {AppState} from 'react-native'; -import withWindowDimensions from '@components/withWindowDimensions'; import ComposerFocusManager from '@libs/ComposerFocusManager'; import BaseModal from './BaseModal'; import BaseModalProps from './types'; @@ -28,4 +27,4 @@ function Modal({useNativeDriver = true, ...rest}: BaseModalProps) { } Modal.displayName = 'Modal'; -export default withWindowDimensions(Modal); +export default Modal; diff --git a/src/components/Modal/index.ios.tsx b/src/components/Modal/index.ios.tsx index f780775ec216..6be171a5de16 100644 --- a/src/components/Modal/index.ios.tsx +++ b/src/components/Modal/index.ios.tsx @@ -1,5 +1,4 @@ import React from 'react'; -import withWindowDimensions from '@components/withWindowDimensions'; import BaseModal from './BaseModal'; import BaseModalProps from './types'; @@ -15,4 +14,4 @@ function Modal({children, ...rest}: BaseModalProps) { } Modal.displayName = 'Modal'; -export default withWindowDimensions(Modal); +export default Modal; diff --git a/src/components/Modal/index.tsx b/src/components/Modal/index.tsx index 4269420dcd7f..8c55f37d4888 100644 --- a/src/components/Modal/index.tsx +++ b/src/components/Modal/index.tsx @@ -1,5 +1,4 @@ import React, {useState} from 'react'; -import withWindowDimensions from '@components/withWindowDimensions'; import useStyleUtils from '@hooks/useStyleUtils'; import useTheme from '@hooks/useTheme'; import StatusBar from '@libs/StatusBar'; @@ -11,6 +10,7 @@ function Modal({fullscreen = true, onModalHide = () => {}, type, onModalShow = ( const theme = useTheme(); const StyleUtils = useStyleUtils(); const [previousStatusBarColor, setPreviousStatusBarColor] = useState(); + const setStatusBarColor = (color = theme.appBG) => { if (!fullscreen) { @@ -55,4 +55,4 @@ function Modal({fullscreen = true, onModalHide = () => {}, type, onModalShow = ( } Modal.displayName = 'Modal'; -export default withWindowDimensions(Modal); +export default Modal; diff --git a/src/components/Modal/types.ts b/src/components/Modal/types.ts index 461a5935eda9..ccc5db2e7792 100644 --- a/src/components/Modal/types.ts +++ b/src/components/Modal/types.ts @@ -1,7 +1,6 @@ import {ViewStyle} from 'react-native'; import {ModalProps} from 'react-native-modal'; import {ValueOf} from 'type-fest'; -import {WindowDimensionsProps} from '@components/withWindowDimensions/types'; import CONST from '@src/CONST'; type PopoverAnchorPosition = { @@ -11,57 +10,56 @@ type PopoverAnchorPosition = { left?: number; }; -type BaseModalProps = WindowDimensionsProps & - Partial & { - /** Decides whether the modal should cover fullscreen. FullScreen modal has backdrop */ - fullscreen?: boolean; +type BaseModalProps = Partial & { + /** Decides whether the modal should cover fullscreen. FullScreen modal has backdrop */ + fullscreen?: boolean; - /** Should we close modal on outside click */ - shouldCloseOnOutsideClick?: boolean; + /** Should we close modal on outside click */ + shouldCloseOnOutsideClick?: boolean; - /** Should we announce the Modal visibility changes? */ - shouldSetModalVisibility?: boolean; + /** Should we announce the Modal visibility changes? */ + shouldSetModalVisibility?: boolean; - /** Callback method fired when the user requests to close the modal */ - onClose: (ref?: React.RefObject) => void; + /** Callback method fired when the user requests to close the modal */ + onClose: () => void; - /** State that determines whether to display the modal or not */ - isVisible: boolean; + /** State that determines whether to display the modal or not */ + isVisible: boolean; - /** Callback method fired when the user requests to submit the modal content. */ - onSubmit?: () => void; + /** Callback method fired when the user requests to submit the modal content. */ + onSubmit?: () => void; - /** Callback method fired when the modal is hidden */ - onModalHide?: () => void; + /** Callback method fired when the modal is hidden */ + onModalHide?: () => void; - /** Callback method fired when the modal is shown */ - onModalShow?: () => void; + /** Callback method fired when the modal is shown */ + onModalShow?: () => void; - /** Style of modal to display */ - type?: ValueOf; + /** Style of modal to display */ + type?: ValueOf; - /** The anchor position of a popover modal. Has no effect on other modal types. */ - popoverAnchorPosition?: PopoverAnchorPosition; + /** The anchor position of a popover modal. Has no effect on other modal types. */ + popoverAnchorPosition?: PopoverAnchorPosition; - outerStyle?: ViewStyle; + outerStyle?: ViewStyle; - /** Whether the modal should go under the system statusbar */ - statusBarTranslucent?: boolean; + /** Whether the modal should go under the system statusbar */ + statusBarTranslucent?: boolean; - /** Whether the modal should avoid the keyboard */ - avoidKeyboard?: boolean; + /** Whether the modal should avoid the keyboard */ + avoidKeyboard?: boolean; - /** Modal container styles */ - innerContainerStyle?: ViewStyle; + /** Modal container styles */ + innerContainerStyle?: ViewStyle; - /** - * Whether the modal should hide its content while animating. On iOS, set to true - * if `useNativeDriver` is also true, to avoid flashes in the UI. - * - * See: https://github.com/react-native-modal/react-native-modal/pull/116 - * */ - hideModalContentWhileAnimating?: boolean; - }; + /** + * Whether the modal should hide its content while animating. On iOS, set to true + * if `useNativeDriver` is also true, to avoid flashes in the UI. + * + * See: https://github.com/react-native-modal/react-native-modal/pull/116 + * */ + hideModalContentWhileAnimating?: boolean; +}; export default BaseModalProps; export type {PopoverAnchorPosition}; diff --git a/src/components/Popover/types.ts b/src/components/Popover/types.ts index 7f7e2829770c..6a8ae8423d2c 100644 --- a/src/components/Popover/types.ts +++ b/src/components/Popover/types.ts @@ -13,7 +13,7 @@ type PopoverProps = BaseModalProps & { anchorPosition?: PopoverAnchorPosition; /** The anchor alignment of the popover */ - anchorAlignment: AnchorAlignment; + anchorAlignment?: AnchorAlignment; /** The anchor ref of the popover */ anchorRef: React.RefObject; diff --git a/src/components/PopoverWithoutOverlay/index.tsx b/src/components/PopoverWithoutOverlay/index.tsx index f83949bcbe9d..dd43c5d332aa 100644 --- a/src/components/PopoverWithoutOverlay/index.tsx +++ b/src/components/PopoverWithoutOverlay/index.tsx @@ -51,7 +51,7 @@ function PopoverWithoutOverlay( close: onClose, anchorRef, }); - removeOnClose = Modal.setCloseModal(() => onClose(anchorRef)); + removeOnClose = Modal.setCloseModal(() => onClose()); } else { onModalHide(); close(anchorRef); diff --git a/src/components/ShowContextMenuContext.tsx b/src/components/ShowContextMenuContext.tsx index bbc7abf64e5b..c152289115c8 100644 --- a/src/components/ShowContextMenuContext.tsx +++ b/src/components/ShowContextMenuContext.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import {GestureResponderEvent, Text as RNText} from 'react-native'; import * as DeviceCapabilities from '@libs/DeviceCapabilities'; import * as ReportUtils from '@libs/ReportUtils'; import * as ReportActionContextMenu from '@pages/home/report/ContextMenu/ReportActionContextMenu'; @@ -24,7 +25,14 @@ ShowContextMenuContext.displayName = 'ShowContextMenuContext'; * @param checkIfContextMenuActive Callback to update context menu active state * @param isArchivedRoom - Is the report an archived room */ -function showContextMenuForReport(event: Event, anchor: HTMLElement, reportID: string, action: ReportAction, checkIfContextMenuActive: () => void, isArchivedRoom = false) { +function showContextMenuForReport( + event: GestureResponderEvent | MouseEvent, + anchor: RNText | null, + reportID: string, + action: ReportAction, + checkIfContextMenuActive: () => void, + isArchivedRoom = false, +) { if (!DeviceCapabilities.canUseTouchScreen()) { return; } diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 0c1911401432..f67918931200 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -4247,7 +4247,7 @@ function navigateToPrivateNotes(report: Report, session: Session) { * - The action is a whisper action and it's neither a report preview nor IOU action * - The action is the thread's first chat */ -function shouldDisableThread(reportAction: ReportAction, reportID: string) { +function shouldDisableThread(reportAction: OnyxEntry, reportID: string) { const isSplitBillAction = ReportActionsUtils.isSplitBillAction(reportAction); const isDeletedAction = ReportActionsUtils.isDeletedAction(reportAction); const isReportPreviewAction = ReportActionsUtils.isReportPreviewAction(reportAction); @@ -4255,9 +4255,9 @@ function shouldDisableThread(reportAction: ReportAction, reportID: string) { const isWhisperAction = ReportActionsUtils.isWhisperAction(reportAction); return ( - CONST.REPORT.ACTIONS.THREAD_DISABLED.some((action: string) => action === reportAction.actionName) || + CONST.REPORT.ACTIONS.THREAD_DISABLED.some((action: string) => action === reportAction?.actionName) || isSplitBillAction || - (isDeletedAction && !reportAction.childVisibleActionCount) || + (isDeletedAction && !reportAction?.childVisibleActionCount) || (isWhisperAction && !isReportPreviewAction && !isIOUAction) || isThreadFirstChat(reportAction, reportID) ); diff --git a/src/pages/home/report/ContextMenu/BaseReportActionContextMenu.tsx b/src/pages/home/report/ContextMenu/BaseReportActionContextMenu.tsx index 96fc5ba1c944..e1e409d24afc 100755 --- a/src/pages/home/report/ContextMenu/BaseReportActionContextMenu.tsx +++ b/src/pages/home/report/ContextMenu/BaseReportActionContextMenu.tsx @@ -1,5 +1,5 @@ import lodashIsEqual from 'lodash/isEqual'; -import React, {memo, RefObject, useMemo, useRef, useState} from 'react'; +import React, {memo, MutableRefObject, RefObject, useMemo, useRef, useState} from 'react'; import {InteractionManager, View} from 'react-native'; import {OnyxEntry, withOnyx} from 'react-native-onyx'; import ContextMenuItem from '@components/ContextMenuItem'; @@ -14,7 +14,7 @@ import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import {Beta, ReportAction, ReportActions} from '@src/types/onyx'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; -import ContextMenuActions from './ContextMenuActions'; +import ContextMenuActions, {ContextMenuActionPayload} from './ContextMenuActions'; import {ContextMenuType, hideContextMenu} from './ReportActionContextMenu'; type BaseReportActionContextMenuOnyxProps = { @@ -53,7 +53,7 @@ type BaseReportActionContextMenuProps = BaseReportActionContextMenuOnyxProps & { type?: ContextMenuType; /** Target node which is the target of ContentMenu */ - anchor: HTMLElement; + anchor: MutableRefObject; /** Flag to check if the chat participant is Chronos */ isChronosReport: boolean; @@ -73,8 +73,8 @@ type BaseReportActionContextMenuProps = BaseReportActionContextMenuOnyxProps & { function BaseReportActionContextMenu({ type = CONST.CONTEXT_MENU_TYPES.REPORT_ACTION, - anchor = null, - contentRef = null, + anchor, + contentRef, isChronosReport = false, isArchivedRoom = false, isMini = false, @@ -161,8 +161,8 @@ function BaseReportActionContextMenu({ > {filteredContextMenuActions.map((contextAction, index) => { const closePopup = !isMini; - const payload = { - reportAction, + const payload: ContextMenuActionPayload = { + reportAction: reportAction as ReportAction, reportID, draftMessage, selection, @@ -173,7 +173,7 @@ function BaseReportActionContextMenu({ if (contextAction.renderContent) { // make sure that renderContent isn't mixed with unsupported props - if (__DEV__ && (contextAction.text != null || contextAction.icon != null)) { + if (__DEV__ && contextAction.icon != null) { throw new Error('Dev error: renderContent() and text/icon cannot be used together.'); } @@ -185,14 +185,15 @@ function BaseReportActionContextMenu({ ref={(ref) => { menuItemRefs.current[index] = ref; }} + // @ts-expect-error TODO: Remove this once ContextMenuItem (https://github.com/Expensify/App/issues/25056) is migrated to TypeScript. icon={contextAction.icon} - text={translate(contextAction.textTranslateKey, {action: reportAction})} + text={contextAction.textTranslateKey ? translate(contextAction.textTranslateKey, {action: reportAction} as never) : undefined} successIcon={contextAction.successIcon} successText={contextAction.successTextTranslateKey ? translate(contextAction.successTextTranslateKey) : undefined} isMini={isMini} key={contextAction.textTranslateKey} - onPress={() => interceptAnonymousUser(() => contextAction.onPress(closePopup, payload), contextAction.isAnonymousAction)} - description={contextAction.getDescription(selection, isSmallScreenWidth)} + onPress={() => interceptAnonymousUser(() => contextAction.onPress?.(closePopup, payload), contextAction.isAnonymousAction)} + description={contextAction.getDescription?.(selection)} isAnonymousAction={contextAction.isAnonymousAction} isFocused={focusedIndex === index} /> diff --git a/src/pages/home/report/ContextMenu/ContextMenuActions.tsx b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx index 00ccbc4e64ab..4cd407471649 100644 --- a/src/pages/home/report/ContextMenu/ContextMenuActions.tsx +++ b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx @@ -1,5 +1,5 @@ import ExpensiMark from 'expensify-common/lib/ExpensiMark'; -import React from 'react'; +import React, {MutableRefObject} from 'react'; import {OnyxEntry} from 'react-native-onyx'; import {Emoji} from '@assets/emojis/types'; import * as Expensicons from '@components/Icon/Expensicons'; @@ -50,7 +50,7 @@ type ShouldShow = ( reportAction: OnyxEntry, isArchivedRoom: boolean, betas: OnyxEntry, - menuTarget: HTMLElement, + menuTarget: MutableRefObject, isChronosReport: boolean, reportID: string, isPinnedChat: boolean, @@ -58,7 +58,7 @@ type ShouldShow = ( isOffline: boolean, ) => boolean; -type Payload = { +type ContextMenuActionPayload = { reportAction: ReportAction; reportID: string; draftMessage: string; @@ -68,9 +68,9 @@ type Payload = { interceptAnonymousUser: (callback: () => void, isAnonymousAction?: boolean) => void; }; -type OnPress = (closePopover: boolean, payload: Payload, selection: string | undefined, reportID: string, draftMessage: string) => void; +type OnPress = (closePopover: boolean, payload: ContextMenuActionPayload, selection?: string, reportID?: string, draftMessage?: string) => void; -type RenderContent = (closePopover: boolean, payload: Payload) => React.ReactElement; +type RenderContent = (closePopover: boolean, payload: ContextMenuActionPayload) => React.ReactElement; type GetDescription = (selection?: string) => string | void; @@ -90,7 +90,7 @@ type ContextMenuAction = { const ContextMenuActions: ContextMenuAction[] = [ { isAnonymousAction: false, - shouldShow: (type, reportAction) => + shouldShow: (type, reportAction): reportAction is ReportAction => type === CONST.CONTEXT_MENU_TYPES.REPORT_ACTION && !!reportAction && 'message' in reportAction && !ReportActionsUtils.isMessageDeleted(reportAction), renderContent: (closePopover, {reportID, reportAction, close: closeManually, openContextMenu}) => { const isMini = !closePopover; @@ -143,7 +143,7 @@ const ContextMenuActions: ContextMenuAction[] = [ icon: Expensicons.Download, successTextTranslateKey: 'common.download', successIcon: Expensicons.Download, - shouldShow: (type, reportAction, isArchivedRoom, betas, menuTarget, isChronosReport, reportID, isPinnedChat, isUnreadChat, isOffline) => { + shouldShow: (type, reportAction, isArchivedRoom, betas, menuTarget, isChronosReport, reportID, isPinnedChat, isUnreadChat, isOffline): reportAction is ReportAction => { const isAttachment = ReportActionsUtils.isReportActionAttachment(reportAction); const messageHtml = reportAction?.message?.at(0)?.html; return ( @@ -347,7 +347,7 @@ const ContextMenuActions: ContextMenuAction[] = [ const isAttachment = ReportActionsUtils.isReportActionAttachment(reportAction); // Only hide the copylink menu item when context menu is opened over img element. - const isAttachmentTarget = menuTarget?.tagName === 'IMG' && isAttachment; + const isAttachmentTarget = menuTarget.current?.tagName === 'IMG' && isAttachment; return Permissions.canUseCommentLinking(betas) && type === CONST.CONTEXT_MENU_TYPES.REPORT_ACTION && !isAttachmentTarget && !ReportActionsUtils.isMessageDeleted(reportAction); }, onPress: (closePopover, {reportAction, reportID}) => { @@ -504,3 +504,4 @@ const ContextMenuActions: ContextMenuAction[] = [ ]; export default ContextMenuActions; +export type {ContextMenuActionPayload}; diff --git a/src/pages/home/report/ContextMenu/PopoverReportActionContextMenu.tsx b/src/pages/home/report/ContextMenu/PopoverReportActionContextMenu.tsx index 39e7c66ddb0c..86a7cf7937f3 100644 --- a/src/pages/home/report/ContextMenu/PopoverReportActionContextMenu.tsx +++ b/src/pages/home/report/ContextMenu/PopoverReportActionContextMenu.tsx @@ -1,5 +1,5 @@ -import React, {ForwardedRef, forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState} from 'react'; -import {Dimensions, EmitterSubscription} from 'react-native'; +import React, {ForwardedRef, forwardRef, RefObject, useCallback, useEffect, useImperativeHandle, useRef, useState} from 'react'; +import {Dimensions, EmitterSubscription, NativeTouchEvent, View} from 'react-native'; import {OnyxEntry} from 'react-native-onyx'; import ConfirmModal from '@components/ConfirmModal'; import PopoverWithMeasuredContent from '@components/PopoverWithMeasuredContent'; @@ -10,20 +10,30 @@ import * as Report from '@userActions/Report'; import CONST from '@src/CONST'; import {ReportAction} from '@src/types/onyx'; import BaseReportActionContextMenu from './BaseReportActionContextMenu'; -import {ContextMenuType} from './ReportActionContextMenu'; +import {ContextMenuType, ShowContextMenu} from './ReportActionContextMenu'; + +type HideContextMenu = (onHideActionCallback?: () => void) => void; + +type ShowDeleteModal = (reportID: string, reportAction: ReportAction, shouldSetModalVisibility?: boolean, onConfirm?: () => void, onCancel?: () => void) => void; + +type IsActiveReportAction = (actionID: string) => boolean; type PopoverReportActionContextMenuRef = { - showContextMenu: () => void; - hideContextMenu: () => void; - showDeleteModal: () => void; + showContextMenu: ShowContextMenu; + hideContextMenu: HideContextMenu; + showDeleteModal: ShowDeleteModal; hideDeleteModal: () => void; - isActiveReportAction: () => void; - instanceID: () => void; + isActiveReportAction: IsActiveReportAction; + instanceID: string; runAndResetOnPopoverHide: () => void; clearActiveReportAction: () => void; - contentRef: () => void; + contentRef: RefObject; }; +type ContextMenuAnchorCallback = (x: number, y: number) => void; +type ContextMenuAnchor = {measureInWindow: (callback: ContextMenuAnchorCallback) => void}; + +// eslint-disable-next-line @typescript-eslint/naming-convention function PopoverReportActionContextMenu(_props: never, ref: ForwardedRef) { const {translate} = useLocalize(); const reportIDRef = useRef('0'); @@ -32,7 +42,7 @@ function PopoverReportActionContextMenu(_props: never, ref: ForwardedRef(undefined); const cursorRelativePosition = useRef({ horizontal: 0, @@ -56,11 +66,11 @@ function PopoverReportActionContextMenu(_props: never, ref: ForwardedRef(null); + const anchorRef = useRef(null); const dimensionsEventListener = useRef(null); - const contextMenuAnchorRef = useRef(null); - const contextMenuTargetNode = useRef(null); + const contextMenuAnchorRef = useRef(null); + const contextMenuTargetNode = useRef(null); const onPopoverShow = useRef(() => {}); const onPopoverHide = useRef(() => {}); @@ -70,16 +80,11 @@ function PopoverReportActionContextMenu(_props: never, ref: ForwardedRef {}); const callbackWhenDeleteModalHide = useRef(() => {}); - /** - * Get the Context menu anchor position - * We calculate the achor coordinates from measureInWindow async method - * - * @returns {Promise} - */ + /** Get the Context menu anchor position. We calculate the anchor coordinates from measureInWindow async method */ const getContextMenuMeasuredLocation = useCallback( () => - new Promise((resolve) => { - if (contextMenuAnchorRef.current && _.isFunction(contextMenuAnchorRef.current.measureInWindow)) { + new Promise<{x: number; y: number}>((resolve) => { + if (contextMenuAnchorRef.current && typeof contextMenuAnchorRef.current.measureInWindow === 'function') { contextMenuAnchorRef.current.measureInWindow((x, y) => resolve({x, y})); } else { resolve({x: 0, y: 0}); @@ -88,9 +93,7 @@ function PopoverReportActionContextMenu(_props: never, ref: ForwardedRef { if (!isPopoverVisible) { return; @@ -120,7 +123,7 @@ function PopoverReportActionContextMenu(_props: never, ref: ForwardedRef !!actionID && (reportActionIDRef.current === actionID || reportActionRef.current.reportActionID === actionID); + const isActiveReportAction: IsActiveReportAction = (actionID) => !!actionID && (reportActionIDRef.current === actionID || reportActionRef.current?.reportActionID === actionID); const clearActiveReportAction = () => { reportActionIDRef.current = '0'; @@ -145,7 +148,7 @@ function PopoverReportActionContextMenu(_props: never, ref: ForwardedRef { - const nativeEvent = event.nativeEvent || {}; + const nativeEvent = 'nativeEvent' in event ? event.nativeEvent : ({pageX: 0, pageY: 0} as NativeTouchEvent); contextMenuAnchorRef.current = contextMenuAnchor; contextMenuTargetNode.current = nativeEvent.target; @@ -181,9 +184,9 @@ function PopoverReportActionContextMenu(_props: never, ref: ForwardedRef { onPopoverShow.current(); @@ -204,19 +205,13 @@ function PopoverReportActionContextMenu(_props: never, ref: ForwardedRef {}; }; - /** - * Run the callback and return a noop function to reset it - * @param callback - * @returns - */ - const runAndResetCallback = (callback) => { + /** Run the callback and return a noop function to reset it */ + const runAndResetCallback = (callback: () => void) => { callback(); return () => {}; }; - /** - * After Popover hides, call the registered onPopoverHide & onPopoverHideActionCallback callback and reset it - */ + /** After Popover hides, call the registered onPopoverHide & onPopoverHideActionCallback callback and reset it */ const runAndResetOnPopoverHide = () => { reportIDRef.current = '0'; reportActionIDRef.current = '0'; @@ -230,8 +225,8 @@ function PopoverReportActionContextMenu(_props: never, ref: ForwardedRef