From 0b953fecc07cb6a24454977a0aceba15001c45d3 Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Mon, 29 Apr 2024 18:09:40 -0400 Subject: [PATCH 01/34] chore: switch to arrow functions --- src/pages/Dashboard.tsx | 2 +- src/pages/Gateways.tsx | 2 +- src/pages/NotFound.tsx | 2 +- src/pages/Observers.tsx | 2 +- src/pages/Staking.tsx | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx index a2c69239..4ad41107 100644 --- a/src/pages/Dashboard.tsx +++ b/src/pages/Dashboard.tsx @@ -1,6 +1,6 @@ import Header from "@src/components/Header"; -function Dashboard() { +const Dashboard = () => { return (
diff --git a/src/pages/Gateways.tsx b/src/pages/Gateways.tsx index 50e86e61..0a8ff9e2 100644 --- a/src/pages/Gateways.tsx +++ b/src/pages/Gateways.tsx @@ -1,6 +1,6 @@ import Header from "@src/components/Header"; -function Gateways() { +const Gateways = () => { return (
diff --git a/src/pages/NotFound.tsx b/src/pages/NotFound.tsx index ee1b4d76..a9531723 100644 --- a/src/pages/NotFound.tsx +++ b/src/pages/NotFound.tsx @@ -1,4 +1,4 @@ -function NotFound() { +const NotFound = () => { return (

Page Not Found

diff --git a/src/pages/Observers.tsx b/src/pages/Observers.tsx index 483d0122..69f31209 100644 --- a/src/pages/Observers.tsx +++ b/src/pages/Observers.tsx @@ -1,6 +1,6 @@ import Header from "@src/components/Header"; -function Observers() { +const Observers = () => { return (
diff --git a/src/pages/Staking.tsx b/src/pages/Staking.tsx index eac28179..9fa249b2 100644 --- a/src/pages/Staking.tsx +++ b/src/pages/Staking.tsx @@ -1,6 +1,6 @@ import Header from '@src/components/Header'; -function Staking() { +const Staking = () => { return (
From 9b5dcfad9a2ac1363e62f7dbccb5e96d63c25618 Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Tue, 30 Apr 2024 13:36:00 -0400 Subject: [PATCH 02/34] chore: refactor out base modal component --- src/components/modals/BaseModal.tsx | 33 +++++++++++ src/components/modals/ConnectModal.tsx | 80 +++++++++++--------------- 2 files changed, 66 insertions(+), 47 deletions(-) create mode 100644 src/components/modals/BaseModal.tsx diff --git a/src/components/modals/BaseModal.tsx b/src/components/modals/BaseModal.tsx new file mode 100644 index 00000000..89eb6f43 --- /dev/null +++ b/src/components/modals/BaseModal.tsx @@ -0,0 +1,33 @@ +import { Dialog } from '@headlessui/react'; +import { CloseIcon } from '../icons'; +import { ReactElement } from 'react'; + +const BaseModal = ({ + open, + onClose, + children, +}: { + open: boolean; + onClose: () => void; + children: ReactElement; +}) => { + return ( + + + ); +}; + +export default BaseModal; diff --git a/src/components/modals/ConnectModal.tsx b/src/components/modals/ConnectModal.tsx index b6988778..64f5576c 100644 --- a/src/components/modals/ConnectModal.tsx +++ b/src/components/modals/ConnectModal.tsx @@ -1,10 +1,10 @@ -import { Dialog } from '@headlessui/react'; import { ArConnectWalletConnector } from '@src/services/wallets/ArConnectWalletConnector'; import { useGlobalState } from '@src/store'; import { ArweaveWalletConnector } from '@src/types'; import { useState } from 'react'; import Button from '../Button'; -import { ArConnectIcon, CloseIcon, ConnectIcon } from '../icons'; +import { ArConnectIcon, ConnectIcon } from '../icons'; +import BaseModal from './BaseModal'; const ConnectModal = ({ open, @@ -46,53 +46,39 @@ const ConnectModal = ({ }; return ( - - + ); }; From d2faef5506cf5e35152dd00ec73bad9c51056947 Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Tue, 30 Apr 2024 13:36:20 -0400 Subject: [PATCH 03/34] feat: implemented gateway initial banner --- src/components/Button.tsx | 3 +- src/components/icons/banner_right_chevron.svg | 18 +++++++ src/components/icons/index.ts | 8 +++- src/components/icons/pink_arrow.svg | 18 +++++++ src/components/icons/start_gateway_cubes.svg | 24 ++++++++++ src/index.css | 6 +++ src/pages/Gateways/Banner.tsx | 47 +++++++++++++++++++ .../{Gateways.tsx => Gateways/index.tsx} | 5 +- 8 files changed, 123 insertions(+), 6 deletions(-) create mode 100644 src/components/icons/banner_right_chevron.svg create mode 100644 src/components/icons/pink_arrow.svg create mode 100644 src/components/icons/start_gateway_cubes.svg create mode 100644 src/pages/Gateways/Banner.tsx rename src/pages/{Gateways.tsx => Gateways/index.tsx} (67%) diff --git a/src/components/Button.tsx b/src/components/Button.tsx index 92337c12..91037cbd 100644 --- a/src/components/Button.tsx +++ b/src/components/Button.tsx @@ -45,8 +45,7 @@ export const Button = ({ {icon} {text && (
{text}
diff --git a/src/components/icons/banner_right_chevron.svg b/src/components/icons/banner_right_chevron.svg new file mode 100644 index 00000000..49b92cb1 --- /dev/null +++ b/src/components/icons/banner_right_chevron.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/components/icons/index.ts b/src/components/icons/index.ts index 5a97ec60..9d1cf6e7 100644 --- a/src/components/icons/index.ts +++ b/src/components/icons/index.ts @@ -1,6 +1,7 @@ /// import ArConnectIcon from './arconnect.svg?react'; import ArioLogoIcon from './ario.svg?react'; +import BannerRightChevron from './banner_right_chevron.svg?react'; import BinocularsIcon from './binoculars.svg?react'; import CloseIcon from './close.svg?react'; import CloseDrawerIcon from './close_drawer.svg?react'; @@ -13,12 +14,15 @@ import GearIcon from './gear.svg?react'; import LinkArrowIcon from './link_arrow.svg?react'; import LogoutIcon from './logout.svg?react'; import OpenDrawerIcon from './open_drawer.svg?react'; +import PinkArrowIcon from './pink_arrow.svg?react'; import StakingIcon from './staking.svg?react'; +import StartGatewayCubes from './start_gateway_cubes.svg?react'; import WalletIcon from './wallet.svg?react'; export { ArConnectIcon, ArioLogoIcon, + BannerRightChevron, BinocularsIcon, CloseIcon, CloseDrawerIcon, @@ -28,9 +32,11 @@ export { DocsIcon, GatewaysIcon, GearIcon, - OpenDrawerIcon, LinkArrowIcon, LogoutIcon, + OpenDrawerIcon, + PinkArrowIcon, StakingIcon, + StartGatewayCubes, WalletIcon, }; diff --git a/src/components/icons/pink_arrow.svg b/src/components/icons/pink_arrow.svg new file mode 100644 index 00000000..7e078ef5 --- /dev/null +++ b/src/components/icons/pink_arrow.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/components/icons/start_gateway_cubes.svg b/src/components/icons/start_gateway_cubes.svg new file mode 100644 index 00000000..6a297264 --- /dev/null +++ b/src/components/icons/start_gateway_cubes.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/index.css b/src/index.css index b5c61c95..0215eb55 100644 --- a/src/index.css +++ b/src/index.css @@ -1,3 +1,9 @@ @tailwind base; @tailwind components; @tailwind utilities; + +@layer components { + .text-gradient { + @apply bg-gradient-to-r from-gradient-primary-start to-gradient-primary-end bg-clip-text text-transparent; + } +} \ No newline at end of file diff --git a/src/pages/Gateways/Banner.tsx b/src/pages/Gateways/Banner.tsx new file mode 100644 index 00000000..8e89c92c --- /dev/null +++ b/src/pages/Gateways/Banner.tsx @@ -0,0 +1,47 @@ +import { PinkArrowIcon, StartGatewayCubes } from '@src/components/icons'; +import ConnectModal from '@src/components/modals/ConnectModal'; +import { useGlobalState } from '@src/store'; +import { useState } from 'react'; + +const Banner = () => { + const walletAddress = useGlobalState((state) => state.walletAddress); + + const [loginOpen, setLoginOpen] = useState(false); + + return ( +
+ + setLoginOpen(false)} /> +
+ ); +}; + +export default Banner; diff --git a/src/pages/Gateways.tsx b/src/pages/Gateways/index.tsx similarity index 67% rename from src/pages/Gateways.tsx rename to src/pages/Gateways/index.tsx index 0a8ff9e2..1237f0db 100644 --- a/src/pages/Gateways.tsx +++ b/src/pages/Gateways/index.tsx @@ -1,12 +1,11 @@ import Header from "@src/components/Header"; +import Banner from "./Banner"; const Gateways = () => { return (
-
-

Gateways

-
+
); } From cffcff843d7cf541f164fcb0516d992f2265b816 Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Wed, 1 May 2024 09:50:06 -0400 Subject: [PATCH 04/34] fix: disable closing dialogs with escape key and outside dialog mouse presses --- src/components/modals/BaseModal.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/modals/BaseModal.tsx b/src/components/modals/BaseModal.tsx index 89eb6f43..ff2e9871 100644 --- a/src/components/modals/BaseModal.tsx +++ b/src/components/modals/BaseModal.tsx @@ -12,14 +12,14 @@ const BaseModal = ({ children: ReactElement; }) => { return ( - + {}} className="relative z-50"> ), @@ -146,7 +148,7 @@ const StartGatewayModal = ({
), From 175cc43abff057a2988c62c4ce12b4c2295780c5 Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Fri, 3 May 2024 16:06:48 -0400 Subject: [PATCH 10/34] feat: add creating ArIO writeable SDK and implement call to joinNetwork() --- package.json | 3 +- src/components/WalletProvider.tsx | 23 ++++++++++++ src/components/modals/StartGatewayModal.tsx | 37 +++++++++++++++++-- src/layout/AppRouterLayout.tsx | 4 +- .../wallets/ArConnectWalletConnector.ts | 10 ++--- src/store/index.ts | 6 +-- yarn.lock | 20 ++++++++-- 7 files changed, 84 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index 71849264..94514bd4 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "vis": "yarn vite-bundle-visualizer" }, "dependencies": { - "@ar.io/sdk": "^1.0.5-alpha.2", + "@ar.io/sdk": "^1.0.5", "@fontsource/rubik": "^5.0.19", "@headlessui/react": "^1.7.19", "@radix-ui/react-tooltip": "^1.0.7", @@ -30,6 +30,7 @@ "axios-retry": "^4.0.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-hot-toast": "^2.4.1", "react-router-dom": "^6.22.1", "tailwindcss-animate": "^1.0.7", "winston": "^3.11.0", diff --git a/src/components/WalletProvider.tsx b/src/components/WalletProvider.tsx index 0698038c..3046b77a 100644 --- a/src/components/WalletProvider.tsx +++ b/src/components/WalletProvider.tsx @@ -1,3 +1,5 @@ +import { ArIO } from '@ar.io/sdk/web'; +import { ARNS_REGISTRY_ADDRESS } from '@src/constants'; import { useEffectOnce } from '@src/hooks/useEffectOnce'; import { ArConnectWalletConnector } from '@src/services/wallets/ArConnectWalletConnector'; import { useGlobalState } from '@src/store'; @@ -15,10 +17,15 @@ const WalletProvider = ({ children }: { children: ReactElement }) => { const setWalletStateInitialized = useGlobalState( (state) => state.setWalletStateInitialized, ); + + const wallet = useGlobalState((state) => state.wallet); const updateWallet = useGlobalState((state) => state.updateWallet); const setBalances = useGlobalState((state) => state.setBalances); const arweave = useGlobalState((state) => state.arweave); const arIOReadSDK = useGlobalState((state) => state.arIOReadSDK); + const setArIOWriteableSDK = useGlobalState( + (state) => state.setArIOWriteableSDK, + ); useEffect(() => { window.addEventListener('arweaveWalletLoaded', updateIfConnected); @@ -56,6 +63,22 @@ const WalletProvider = ({ children }: { children: ReactElement }) => { } }, [walletAddress, blockHeight, arIOReadSDK, arweave, setBalances]); + useEffect(() => { + if (wallet) { + const signer = wallet.signer; + + if (signer) { + const writeable = ArIO.init({ + contractTxId: ARNS_REGISTRY_ADDRESS.toString(), + signer, + }); + setArIOWriteableSDK(writeable); + } + } else { + setArIOWriteableSDK(undefined); + } + }, [setArIOWriteableSDK, wallet]); + const updateIfConnected = async () => { const walletType = window.localStorage.getItem('walletType'); diff --git a/src/components/modals/StartGatewayModal.tsx b/src/components/modals/StartGatewayModal.tsx index 8a1b825a..a65e29fb 100644 --- a/src/components/modals/StartGatewayModal.tsx +++ b/src/components/modals/StartGatewayModal.tsx @@ -6,6 +6,7 @@ import Button, { ButtonType } from '../Button'; import FormRow, { RowType } from '../forms/FormRow'; import FormSwitch from '../forms/FormSwitch'; import BaseModal from './BaseModal'; +import toast from 'react-hot-toast'; const DEFAULT_FORM_STATE = { label: '', @@ -37,6 +38,7 @@ const StartGatewayModal = ({ onClose: () => void; }) => { const walletAddress = useGlobalState((state) => state.walletAddress); + const arioWriteableSDK = useGlobalState((state) => state.arIOWriteableSDK); const [formState, setFormState] = useState>(DEFAULT_FORM_STATE); @@ -190,9 +192,38 @@ const StartGatewayModal = ({ }); }; - const submitForm = () => { - if (isFormValid()) { - console.log('Form is valid'); + const submitForm = async () => { + if (isFormValid() && arioWriteableSDK) { + try { + + const { id:txID } = await arioWriteableSDK.joinNetwork({ + // GatewayConnectionSettings + protocol: 'https', + fqdn: formState.address, + port: 443, + + // GatewayMetadata + note: formState.note, + label: formState.label, + properties: propertiesIdEnabled ? formState.propertiesId : DEFAULT_FORM_STATE.propertiesId, + observerWallet: formState.observerWallet, + + // GatewayStakingSettings + allowDelegatedStaking: delegatedStakingEnabled, + delegateRewardShareRatio: delegatedStakingEnabled + ? parseFloat(formState.delegatedStakingShareRatio) + : 0, + minDelegatedStake: delegatedStakingEnabled + ? parseFloat(formState.delegatedStaking) + : 100, + autoStake: true, + + qty: parseFloat(formState.stake), + }); + console.log('txID', txID); + } catch (e) { + toast.error("${e}"); + } } }; diff --git a/src/layout/AppRouterLayout.tsx b/src/layout/AppRouterLayout.tsx index 98f9b49d..a8b92eda 100644 --- a/src/layout/AppRouterLayout.tsx +++ b/src/layout/AppRouterLayout.tsx @@ -1,7 +1,7 @@ import { Outlet } from 'react-router-dom'; -import Notifications from './Notifications'; import Sidebar from './Sidebar'; +import { Toaster } from 'react-hot-toast'; function AppRouterLayout() { return ( @@ -12,7 +12,7 @@ function AppRouterLayout() {
- +
); } diff --git a/src/services/wallets/ArConnectWalletConnector.ts b/src/services/wallets/ArConnectWalletConnector.ts index 77c50b48..d761a512 100644 --- a/src/services/wallets/ArConnectWalletConnector.ts +++ b/src/services/wallets/ArConnectWalletConnector.ts @@ -1,10 +1,8 @@ import { ArconnectError, WalletNotInstalledError } from '@src/utils/errors'; import { PermissionType } from 'arconnect'; -import { ApiConfig } from 'arweave/node/lib/api'; -// import { CustomSignature, SignatureType, Transaction } from 'warp-contracts'; +import { ApiConfig } from 'arweave/web/lib/api'; -// import { ARCONNECT_UNRESPONSIVE_ERROR } from '../../components/layout/Notifications/Notifications'; -import { ArconnectSigner } from '@ar.io/sdk'; +import { ArconnectSigner } from '@ar.io/sdk/web'; import { executeWithTimeout } from '@src/utils'; import { ArweaveTransactionID } from '@src/utils/ArweaveTransactionId'; import { ArweaveWalletConnector, WALLET_TYPES } from '../../types'; @@ -15,6 +13,7 @@ export const ARCONNECT_WALLET_PERMISSIONS: PermissionType[] = [ 'ACCESS_PUBLIC_KEY', 'SIGN_TRANSACTION', 'ACCESS_ARWEAVE_CONFIG', + 'SIGNATURE', ]; export const ARCONNECT_UNRESPONSIVE_ERROR = 'There was an issue initializing ArConnect. Please reload the page to initialize.'; @@ -25,7 +24,7 @@ export class ArConnectWalletConnector implements ArweaveWalletConnector { constructor() { this._wallet = window?.arweaveWallet; - // this.signer = new ArconnectSigner(this._wallet, ); + this.signer = new ArconnectSigner(this._wallet, null as any); // { // signer: async (transaction: Transaction) => { @@ -90,7 +89,6 @@ export class ArConnectWalletConnector implements ArweaveWalletConnector { console.error(err); throw new ArconnectError('User cancelled authentication.'); }); - // this.signer.signer.bind(this); } async disconnect(): Promise { diff --git a/src/store/index.ts b/src/store/index.ts index 28e9d23d..710c915a 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -36,7 +36,7 @@ export type GlobalStateActions = { walletAddress?: ArweaveTransactionID, wallet?: ArweaveWalletConnector, ) => void; - setArIOWriteableSDK: (arIOWriteableSDK: ArIOWritable) => void; + setArIOWriteableSDK: (arIOWriteableSDK?: ArIOWritable) => void; setBalances(ar: number, io: number): void; setWalletStateInitialized: (initialized: boolean) => void; reset: () => void; @@ -45,7 +45,7 @@ export type GlobalStateActions = { export const initialGlobalState: GlobalState = { theme: THEME_TYPES.DARK, arweave: Arweave.init({}), - arIOReadSDK: ArIO.init({ contractTxId: ARNS_REGISTRY_ADDRESS.toString()}), + arIOReadSDK: ArIO.init({ contractTxId: ARNS_REGISTRY_ADDRESS.toString() }), balances: { ar: 0, io: 0, @@ -78,7 +78,7 @@ export class GlobalStateActionBase implements GlobalStateActions { this.set({ walletAddress, wallet }); }; - setArIOWriteableSDK = (arIOWriteableSDK: ArIOWritable) => { + setArIOWriteableSDK = (arIOWriteableSDK?: ArIOWritable) => { this.set({ arIOWriteableSDK }); }; diff --git a/yarn.lock b/yarn.lock index d64c8a2e..3cd77864 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,10 +25,10 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@ar.io/sdk@^1.0.5-alpha.2": - version "1.0.5-alpha.2" - resolved "https://registry.yarnpkg.com/@ar.io/sdk/-/sdk-1.0.5-alpha.2.tgz#6c2540dc5395186800dc65dbe7605aeee6347599" - integrity sha512-8l3lMOy5OQqp3HSQChEXg0tQy09Mg2KvhvBgNnDSbYJZ5K3Ziu895MtNyJvDldtkohHQcH/jSz8kZTT6iXOLeQ== +"@ar.io/sdk@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@ar.io/sdk/-/sdk-1.0.5.tgz#3fc74936e7a1345c42e5f8ed6c46cfd3a5eb183f" + integrity sha512-oXIk5iQFIm0Qf0s2O4BXOxtvWQxvwTCBtTYXJokk+m4DsPxakAEMSLE3ko0JAUOU85fNCBGrSV4yqvsaeS3KQg== dependencies: arbundles "0.11.0" arweave "1.14.4" @@ -5735,6 +5735,11 @@ globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" +goober@^2.1.10: + version "2.1.14" + resolved "https://registry.yarnpkg.com/goober/-/goober-2.1.14.tgz#4a5c94fc34dc086a8e6035360ae1800005135acd" + integrity sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg== + gopd@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" @@ -8270,6 +8275,13 @@ react-dom@^18.2.0: loose-envify "^1.1.0" scheduler "^0.23.0" +react-hot-toast@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/react-hot-toast/-/react-hot-toast-2.4.1.tgz#df04295eda8a7b12c4f968e54a61c8d36f4c0994" + integrity sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ== + dependencies: + goober "^2.1.10" + react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" From 841eb6c048767a546c65db8346d663dd55c5766c Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Fri, 3 May 2024 16:36:00 -0400 Subject: [PATCH 11/34] fix: update label and note field validation to match contract requirements --- src/components/modals/StartGatewayModal.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/modals/StartGatewayModal.tsx b/src/components/modals/StartGatewayModal.tsx index a65e29fb..84244eac 100644 --- a/src/components/modals/StartGatewayModal.tsx +++ b/src/components/modals/StartGatewayModal.tsx @@ -64,7 +64,7 @@ const StartGatewayModal = ({ label: '*Label:', rowType: RowType.TOP, validateProperty: (v: string) => { - return v.trim() === '' ? 'Label is required' : undefined; + return v.trim().length > 0 && v.trim().length <= 64 ? 'Label is required and must be 1-64 characters in length.' : undefined; }, }, { @@ -174,7 +174,7 @@ const StartGatewayModal = ({ label: '*Note:', rowType: RowType.BOTTOM, validateProperty: (v: string) => { - return v.trim() === '' ? 'Note is required.' : undefined; + return v.trim().length > 0 && v.trim().length <= 256 ? 'Note is required and must be 1-256 characters in length.' : undefined; }, }, ]; From 7888fa0ea083695afe66473895ed8dcca4fa0a3e Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Fri, 3 May 2024 18:05:01 -0400 Subject: [PATCH 12/34] feat: implemented banner display for when gateway is found for user --- src/components/WalletProvider.tsx | 15 +++++ src/components/icons/gateway.svg | 9 +++ src/components/icons/gateway_hover.svg | 36 ++++++++++++ src/components/icons/index.ts | 4 ++ src/pages/Gateways/Banner.tsx | 81 ++++++++++++++++++++++++-- src/store/index.ts | 7 +++ 6 files changed, 148 insertions(+), 4 deletions(-) create mode 100644 src/components/icons/gateway.svg create mode 100644 src/components/icons/gateway_hover.svg diff --git a/src/components/WalletProvider.tsx b/src/components/WalletProvider.tsx index 3046b77a..e60a4abf 100644 --- a/src/components/WalletProvider.tsx +++ b/src/components/WalletProvider.tsx @@ -17,6 +17,7 @@ const WalletProvider = ({ children }: { children: ReactElement }) => { const setWalletStateInitialized = useGlobalState( (state) => state.setWalletStateInitialized, ); + const setGateway = useGlobalState((state) => state.setGateway); const wallet = useGlobalState((state) => state.wallet); const updateWallet = useGlobalState((state) => state.updateWallet); @@ -79,6 +80,20 @@ const WalletProvider = ({ children }: { children: ReactElement }) => { } }, [setArIOWriteableSDK, wallet]); + useEffect(() => { + if (walletAddress) { + const update = async () => { + const gateway = await arIOReadSDK.getGateway({ + address: walletAddress.toString(), + }); + setGateway(gateway); + }; + update(); + } else { + setGateway(undefined); + } + }, [arIOReadSDK, setGateway, walletAddress]); + const updateIfConnected = async () => { const walletType = window.localStorage.getItem('walletType'); diff --git a/src/components/icons/gateway.svg b/src/components/icons/gateway.svg new file mode 100644 index 00000000..03cf287f --- /dev/null +++ b/src/components/icons/gateway.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/components/icons/gateway_hover.svg b/src/components/icons/gateway_hover.svg new file mode 100644 index 00000000..9376f534 --- /dev/null +++ b/src/components/icons/gateway_hover.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/icons/index.ts b/src/components/icons/index.ts index 4421d7b0..d07aa423 100644 --- a/src/components/icons/index.ts +++ b/src/components/icons/index.ts @@ -11,6 +11,8 @@ import DashboardIcon from './dashboard.svg?react'; import DocsIcon from './docs.svg?react'; import FormErrorIcon from './form_error.svg?react'; import GatewaysIcon from './gateways.svg?react'; +import GatewayIcon from './gateway.svg?react'; +import GatewayHoverIcon from './gateway_hover.svg?react'; import GearIcon from './gear.svg?react'; import LinkArrowIcon from './link_arrow.svg?react'; import LogoutIcon from './logout.svg?react'; @@ -32,6 +34,8 @@ export { DashboardIcon, DocsIcon, FormErrorIcon, + GatewayIcon, + GatewayHoverIcon, GatewaysIcon, GearIcon, LinkArrowIcon, diff --git a/src/pages/Gateways/Banner.tsx b/src/pages/Gateways/Banner.tsx index c6405156..9a602130 100644 --- a/src/pages/Gateways/Banner.tsx +++ b/src/pages/Gateways/Banner.tsx @@ -1,16 +1,87 @@ -import { PinkArrowIcon, StartGatewayCubes } from '@src/components/icons'; +import { + BannerRightChevron, + GatewayHoverIcon, + GatewayIcon, + PinkArrowIcon, + StartGatewayCubes, +} from '@src/components/icons'; import ConnectModal from '@src/components/modals/ConnectModal'; import StartGatewayModal from '@src/components/modals/StartGatewayModal'; import { useGlobalState } from '@src/store'; +import { formatWalletAddress, mioToIo } from '@src/utils'; import { useState } from 'react'; +const InfoSection = (label: string, value: string) => { + return ( +
+
{label}
+
{value}
+
+ ); +}; + const Banner = () => { const walletAddress = useGlobalState((state) => state.walletAddress); + const gateway = useGlobalState((state) => state.gateway); const [loginOpen, setLoginOpen] = useState(false); const [startGatewayOpen, setStartGatewayOpen] = useState(false); - return ( + const gatewayInfoToDisplay = gateway + ? [ + ['Label', gateway.settings.label], + [ + 'Address', + `${gateway.settings.protocol}://${gateway.settings.fqdn}:${gateway.settings.port}`, + ], + ['Observer Wallet', formatWalletAddress(gateway.observerWallet)], + ['Joined', gateway.start], + ['Stake (IO)', mioToIo(gateway.operatorStake)], + ['Status', gateway.status], + ['Reward Ratio', gateway.settings.delegateRewardShareRatio], + ] + : []; + + return gateway ? ( +
+ + setLoginOpen(false)} /> + setStartGatewayOpen(false)} + /> +
+ ) : (
setLoginOpen(false)} /> - setStartGatewayOpen(false)} /> - + setStartGatewayOpen(false)} + />
); }; diff --git a/src/store/index.ts b/src/store/index.ts index 710c915a..3d58f293 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -3,6 +3,7 @@ import { ArIOReadable, ArIOWritable, EpochDistributionData, + Gateway, } from '@ar.io/sdk/web'; import { ARNS_REGISTRY_ADDRESS, THEME_TYPES } from '@src/constants'; import { ArweaveWalletConnector } from '@src/types'; @@ -21,6 +22,7 @@ export type GlobalState = { currentEpoch?: EpochDistributionData; walletAddress?: ArweaveTransactionID; wallet?: ArweaveWalletConnector; + gateway?: Gateway; balances: { ar: number; io: number; @@ -36,6 +38,7 @@ export type GlobalStateActions = { walletAddress?: ArweaveTransactionID, wallet?: ArweaveWalletConnector, ) => void; + setGateway: (gateway?: Gateway) => void; setArIOWriteableSDK: (arIOWriteableSDK?: ArIOWritable) => void; setBalances(ar: number, io: number): void; setWalletStateInitialized: (initialized: boolean) => void; @@ -78,6 +81,10 @@ export class GlobalStateActionBase implements GlobalStateActions { this.set({ walletAddress, wallet }); }; + setGateway = (gateway?: Gateway) => { + this.set({ gateway }); + }; + setArIOWriteableSDK = (arIOWriteableSDK?: ArIOWritable) => { this.set({ arIOWriteableSDK }); }; From 79b89ba1416da991a567e93572f9e00604169731 Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Mon, 6 May 2024 09:54:54 -0400 Subject: [PATCH 13/34] fix: text alignment formatting with gateway information labels --- src/pages/Gateways/Banner.tsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/pages/Gateways/Banner.tsx b/src/pages/Gateways/Banner.tsx index 9a602130..32e99e85 100644 --- a/src/pages/Gateways/Banner.tsx +++ b/src/pages/Gateways/Banner.tsx @@ -13,7 +13,7 @@ import { useState } from 'react'; const InfoSection = (label: string, value: string) => { return ( -
+
{label}
{value}
@@ -35,7 +35,7 @@ const Banner = () => { `${gateway.settings.protocol}://${gateway.settings.fqdn}:${gateway.settings.port}`, ], ['Observer Wallet', formatWalletAddress(gateway.observerWallet)], - ['Joined', gateway.start], + ['Joined at', gateway.start], ['Stake (IO)', mioToIo(gateway.operatorStake)], ['Status', gateway.status], ['Reward Ratio', gateway.settings.delegateRewardShareRatio], @@ -62,8 +62,8 @@ const Banner = () => {
- - + +
My Gateway
@@ -102,7 +102,6 @@ const Banner = () => {
- {/* */}
Start your own gateway
{' '} From 8b4b9b248742c31d3f7dab6a3bf6cfe8004d9e6f Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Mon, 6 May 2024 10:19:29 -0400 Subject: [PATCH 14/34] chore(nav): disable navigation options for unimplemented sections --- src/App.tsx | 16 ++++++++-------- src/layout/Sidebar.tsx | 37 +++++++++++++++++-------------------- 2 files changed, 25 insertions(+), 28 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 121f0eb5..d40b8202 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -15,10 +15,10 @@ import AppRouterLayout from './layout/AppRouterLayout'; import Loading from './pages/Loading'; import NotFound from './pages/NotFound'; -const Dashboard = React.lazy(() => import('./pages/Dashboard')); +// const Dashboard = React.lazy(() => import('./pages/Dashboard')); const Gateways = React.lazy(() => import('./pages/Gateways')); -const Staking = React.lazy(() => import('./pages/Staking')); -const Observers = React.lazy(() => import('./pages/Observers')); +// const Staking = React.lazy(() => import('./pages/Staking')); +// const Observers = React.lazy(() => import('./pages/Observers')); const sentryCreateBrowserRouter = wrapCreateBrowserRouter(createBrowserRouter); @@ -26,8 +26,8 @@ function App() { const router = sentryCreateBrowserRouter( createRoutesFromElements( } errorElement={}> - } /> - } /> + {/* }> @@ -35,7 +35,7 @@ function App() { } /> - , + , */} , - }> @@ -62,7 +62,7 @@ function App() { } /> - , + , */} } /> , ), diff --git a/src/layout/Sidebar.tsx b/src/layout/Sidebar.tsx index 444580b4..538e2109 100644 --- a/src/layout/Sidebar.tsx +++ b/src/layout/Sidebar.tsx @@ -2,25 +2,22 @@ import { ARIO_DOCS_URL, GATEWAY_CONTRACT_URL } from '@src/constants'; import { useEffect, useState } from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; +import Button from '@src/components/Button'; import { ArioLogoIcon, - BinocularsIcon, CloseDrawerIcon, ContractIcon, - DashboardIcon, DocsIcon, GatewaysIcon, LinkArrowIcon, OpenDrawerIcon, - StakingIcon, } from '../components/icons'; -import Button from '@src/components/Button'; const ROUTES_PRIMARY = [ - { title: 'Dashboard', icon: , path: '/dashboard' }, + // { title: 'Dashboard', icon: , path: '/dashboard' }, { title: 'Gateways', icon: , path: '/gateways' }, - { title: 'Staking', icon: , path: '/staking' }, - { title: 'Observers', icon: , path: '/observers' }, + // { title: 'Staking', icon: , path: '/staking' }, + // { title: 'Observers', icon: , path: '/observers' }, ]; const ROUTES_SECONDARY = [ @@ -74,19 +71,19 @@ const Sidebar = () => {

- {ROUTES_SECONDARY.map(({ title, icon, path }, index) => ( -

From a107bb539bdea0d569e87c817352913c460dd3ea Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Mon, 6 May 2024 11:56:36 -0400 Subject: [PATCH 15/34] fix(start-gateway): fix form validation and adjusted placeholder text for delegated staking --- src/components/modals/StartGatewayModal.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/modals/StartGatewayModal.tsx b/src/components/modals/StartGatewayModal.tsx index 84244eac..ed418ba0 100644 --- a/src/components/modals/StartGatewayModal.tsx +++ b/src/components/modals/StartGatewayModal.tsx @@ -64,7 +64,7 @@ const StartGatewayModal = ({ label: '*Label:', rowType: RowType.TOP, validateProperty: (v: string) => { - return v.trim().length > 0 && v.trim().length <= 64 ? 'Label is required and must be 1-64 characters in length.' : undefined; + return v.trim().length < 1 && v.trim().length > 64 ? 'Label is required and must be 1-64 characters in length.' : undefined; }, }, { @@ -135,7 +135,7 @@ const StartGatewayModal = ({ formPropertyName: 'delegatedStaking', label: 'Delegated Staking (IO):', enabled: delegatedStakingEnabled, - placeholder: 'Minimum 0.1 IO', + placeholder: delegatedStakingEnabled ? 'Minimum 0.1 IO' : "Delegated Staking Off", validateProperty: (v: string) => { if (!delegatedStakingEnabled) { return undefined; @@ -174,7 +174,7 @@ const StartGatewayModal = ({ label: '*Note:', rowType: RowType.BOTTOM, validateProperty: (v: string) => { - return v.trim().length > 0 && v.trim().length <= 256 ? 'Note is required and must be 1-256 characters in length.' : undefined; + return v.trim().length < 1 && v.trim().length > 256 ? 'Note is required and must be 1-256 characters in length.' : undefined; }, }, ]; @@ -221,8 +221,8 @@ const StartGatewayModal = ({ qty: parseFloat(formState.stake), }); console.log('txID', txID); - } catch (e) { - toast.error("${e}"); + } catch (e: any) { + toast.error(`${e}`); } } }; From c3094742f7d3a4e5e7459d59c9efe2a5c81a127a Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Mon, 6 May 2024 17:14:26 -0400 Subject: [PATCH 16/34] fix: formaat IO for operator stake using commas and max 1 fractional digit --- src/pages/Gateways/Banner.tsx | 4 ++-- src/utils/index.ts | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/pages/Gateways/Banner.tsx b/src/pages/Gateways/Banner.tsx index 32e99e85..247fed44 100644 --- a/src/pages/Gateways/Banner.tsx +++ b/src/pages/Gateways/Banner.tsx @@ -8,7 +8,7 @@ import { import ConnectModal from '@src/components/modals/ConnectModal'; import StartGatewayModal from '@src/components/modals/StartGatewayModal'; import { useGlobalState } from '@src/store'; -import { formatWalletAddress, mioToIo } from '@src/utils'; +import { formatWalletAddress, formatWithCommas, mioToIo } from '@src/utils'; import { useState } from 'react'; const InfoSection = (label: string, value: string) => { @@ -36,7 +36,7 @@ const Banner = () => { ], ['Observer Wallet', formatWalletAddress(gateway.observerWallet)], ['Joined at', gateway.start], - ['Stake (IO)', mioToIo(gateway.operatorStake)], + ['Stake (IO)', formatWithCommas(mioToIo(gateway.operatorStake))], ['Status', gateway.status], ['Reward Ratio', gateway.settings.delegateRewardShareRatio], ] diff --git a/src/utils/index.ts b/src/utils/index.ts index 26fe176f..8826ef8b 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,5 +1,7 @@ import { THEME_TYPES } from '../constants'; +const COMMA_NUMBER_FORMAT = new Intl.NumberFormat('en-US', { maximumFractionDigits: 1}); + // for tailwind css, need the change the root export const applyThemePreference = (theme: string) => { const { DARK, LIGHT } = THEME_TYPES; @@ -34,4 +36,9 @@ export const formatBalance = (ar: number) => { export function mioToIo(mio: number): number { return mio / 1_000_000; +} + +/** Format number with commas, with maximum one fraction digit */ +export function formatWithCommas(num:number) { + return COMMA_NUMBER_FORMAT.format(num); } \ No newline at end of file From 1cbb1a4b6ec449458bf7a31153aa7e41eac7cb6f Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Mon, 6 May 2024 19:43:33 -0400 Subject: [PATCH 17/34] fix: add blocking message modal to show message to user while awaiting wallet signing --- src/components/icons/index.ts | 2 + src/components/icons/toast_close.svg | 14 ++++++ src/components/modals/BaseModal.tsx | 14 +++--- .../modals/BlockingMessageModal.tsx | 24 ++++++++++ src/components/modals/StartGatewayModal.tsx | 44 ++++++++++++++++--- src/layout/AppRouterLayout.tsx | 8 ++-- tailwind.config.js | 4 +- 7 files changed, 94 insertions(+), 16 deletions(-) create mode 100644 src/components/icons/toast_close.svg create mode 100644 src/components/modals/BlockingMessageModal.tsx diff --git a/src/components/icons/index.ts b/src/components/icons/index.ts index d07aa423..5015ff05 100644 --- a/src/components/icons/index.ts +++ b/src/components/icons/index.ts @@ -20,6 +20,7 @@ import OpenDrawerIcon from './open_drawer.svg?react'; import PinkArrowIcon from './pink_arrow.svg?react'; import StakingIcon from './staking.svg?react'; import StartGatewayCubes from './start_gateway_cubes.svg?react'; +import ToastCloseIcon from './toast_close.svg?react'; import WalletIcon from './wallet.svg?react'; export { @@ -44,5 +45,6 @@ export { PinkArrowIcon, StakingIcon, StartGatewayCubes, + ToastCloseIcon, WalletIcon, }; diff --git a/src/components/icons/toast_close.svg b/src/components/icons/toast_close.svg new file mode 100644 index 00000000..15332ea8 --- /dev/null +++ b/src/components/icons/toast_close.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/components/modals/BaseModal.tsx b/src/components/modals/BaseModal.tsx index ff2e9871..ff58b865 100644 --- a/src/components/modals/BaseModal.tsx +++ b/src/components/modals/BaseModal.tsx @@ -1,18 +1,20 @@ import { Dialog } from '@headlessui/react'; -import { CloseIcon } from '../icons'; import { ReactElement } from 'react'; +import { CloseIcon } from '../icons'; const BaseModal = ({ open, onClose, children, + showCloseButton = true, }: { open: boolean; onClose: () => void; children: ReactElement; + showCloseButton?: boolean; }) => { return ( - {}} className="relative z-50"> + {}} className="relative z-10"> diff --git a/src/components/modals/BlockingMessageModal.tsx b/src/components/modals/BlockingMessageModal.tsx new file mode 100644 index 00000000..4cf54ecd --- /dev/null +++ b/src/components/modals/BlockingMessageModal.tsx @@ -0,0 +1,24 @@ +import BaseModal from './BaseModal'; + +const BlockingMessageModal = ({ + open, + onClose, + message, +}: { + open: boolean; + onClose: () => void; + message: string; +}) => { + return ( + +
+
+ {/* */} +
+
{message}
+
+
+ ); +}; + +export default BlockingMessageModal; diff --git a/src/components/modals/StartGatewayModal.tsx b/src/components/modals/StartGatewayModal.tsx index ed418ba0..cbc49826 100644 --- a/src/components/modals/StartGatewayModal.tsx +++ b/src/components/modals/StartGatewayModal.tsx @@ -2,11 +2,13 @@ import { ARWEAVE_TX_REGEX } from '@ar.io/sdk/web'; import { FQDN_REGEX } from '@src/constants'; import { useGlobalState } from '@src/store'; import { useEffect, useState } from 'react'; +import { toast } from 'react-hot-toast'; import Button, { ButtonType } from '../Button'; import FormRow, { RowType } from '../forms/FormRow'; import FormSwitch from '../forms/FormSwitch'; import BaseModal from './BaseModal'; -import toast from 'react-hot-toast'; +import BlockingMessageModal from './BlockingMessageModal'; +// import { ToastCloseIcon } from '../icons'; const DEFAULT_FORM_STATE = { label: '', @@ -49,6 +51,9 @@ const StartGatewayModal = ({ const [propertiesIdEnabled, setPropertiesIdEnabled] = useState(false); + const [showBlockingMessageModal, setShowBlockingMessageModal] = + useState(false); + useEffect(() => { setFormState((currentState) => { return { @@ -64,7 +69,9 @@ const StartGatewayModal = ({ label: '*Label:', rowType: RowType.TOP, validateProperty: (v: string) => { - return v.trim().length < 1 && v.trim().length > 64 ? 'Label is required and must be 1-64 characters in length.' : undefined; + return v.trim().length < 1 || v.trim().length > 64 + ? 'Label is required and must be 1-64 characters in length.' + : undefined; }, }, { @@ -135,7 +142,9 @@ const StartGatewayModal = ({ formPropertyName: 'delegatedStaking', label: 'Delegated Staking (IO):', enabled: delegatedStakingEnabled, - placeholder: delegatedStakingEnabled ? 'Minimum 0.1 IO' : "Delegated Staking Off", + placeholder: delegatedStakingEnabled + ? 'Minimum 0.1 IO' + : 'Delegated Staking Off', validateProperty: (v: string) => { if (!delegatedStakingEnabled) { return undefined; @@ -174,7 +183,9 @@ const StartGatewayModal = ({ label: '*Note:', rowType: RowType.BOTTOM, validateProperty: (v: string) => { - return v.trim().length < 1 && v.trim().length > 256 ? 'Note is required and must be 1-256 characters in length.' : undefined; + return v.trim().length < 1 || v.trim().length > 256 + ? 'Note is required and must be 1-256 characters in length.' + : undefined; }, }, ]; @@ -195,8 +206,8 @@ const StartGatewayModal = ({ const submitForm = async () => { if (isFormValid() && arioWriteableSDK) { try { - - const { id:txID } = await arioWriteableSDK.joinNetwork({ + setShowBlockingMessageModal(true); + const { id: txID } = await arioWriteableSDK.joinNetwork({ // GatewayConnectionSettings protocol: 'https', fqdn: formState.address, @@ -205,7 +216,9 @@ const StartGatewayModal = ({ // GatewayMetadata note: formState.note, label: formState.label, - properties: propertiesIdEnabled ? formState.propertiesId : DEFAULT_FORM_STATE.propertiesId, + properties: propertiesIdEnabled + ? formState.propertiesId + : DEFAULT_FORM_STATE.propertiesId, observerWallet: formState.observerWallet, // GatewayStakingSettings @@ -223,6 +236,8 @@ const StartGatewayModal = ({ console.log('txID', txID); } catch (e: any) { toast.error(`${e}`); + } finally { + setShowBlockingMessageModal(false); } } }; @@ -269,6 +284,16 @@ const StartGatewayModal = ({ + //
+ // ); + // }) + // } active={true} title="Cancel" text="Cancel" @@ -289,6 +314,11 @@ const StartGatewayModal = ({ />
+ setShowBlockingMessageModal(false)} + message="Sign the following data with your wallet to proceed." + >
); diff --git a/src/layout/AppRouterLayout.tsx b/src/layout/AppRouterLayout.tsx index a8b92eda..0e7c4a09 100644 --- a/src/layout/AppRouterLayout.tsx +++ b/src/layout/AppRouterLayout.tsx @@ -1,7 +1,6 @@ +import { Toaster } from 'react-hot-toast'; import { Outlet } from 'react-router-dom'; - import Sidebar from './Sidebar'; -import { Toaster } from 'react-hot-toast'; function AppRouterLayout() { return ( @@ -12,7 +11,10 @@ function AppRouterLayout() { - + ); } diff --git a/tailwind.config.js b/tailwind.config.js index 5a006a24..67bfe0d0 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -20,13 +20,15 @@ export default { transparent: 'transparent', 'gradient-primary-start': '#F7C3A1', 'gradient-primary-end': '#DF9BE8', + 'gradient-red-start': '#FFB4B4', + 'gradient-red-end': '#FF6C6C', 'btn-primary-base': '#0e0e0f', 'btn-primary-gradient-start': 'rgba(102, 102, 102, 0.06)', 'btn-primary-gradient-end': 'rgba(0, 0, 0 0.06)', 'btn-primary-outer-gradient-start': '#EEB3BFA3', 'btn-primary-outer-gradient-end': '#DF9BE808', divider: '#232329', - // these correspond to textHigh, textMid, textLow + // these correspond to textHigh, textMid, textLow high: '#CACAD6', mid: '#A3A3AD', low: '#7F7F87', From 3ff3652777b06e6fa9109c672ccc96e3b9759223 Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Tue, 7 May 2024 09:11:19 -0400 Subject: [PATCH 18/34] feat: add lottie ario spinner animation to blocking message dialog --- package.json | 1 + src/animations/ario-spinner.json | 1 + src/components/modals/BlockingMessageModal.tsx | 12 ++++++++++-- yarn.lock | 12 ++++++++++++ 4 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 src/animations/ario-spinner.json diff --git a/package.json b/package.json index 94514bd4..75f38e02 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "arweave": "^1.15.0", "axios": "^1.6.7", "axios-retry": "^4.0.0", + "lottie-react": "^2.4.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-hot-toast": "^2.4.1", diff --git a/src/animations/ario-spinner.json b/src/animations/ario-spinner.json new file mode 100644 index 00000000..0f4f0cc1 --- /dev/null +++ b/src/animations/ario-spinner.json @@ -0,0 +1 @@ +{"assets":[{"id":"Qe0HNtHmMoBZnWq8BH9Mt","layers":[{"ddd":0,"ind":3,"ty":4,"nm":"","ln":"egJ6b2M31YpjHtKmwPaKM3","sr":1,"ks":{"a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[50000,50000]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":157,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"bm":0,"it":[{"ty":"sh","hd":false,"ix":0,"ks":{"a":1,"k":[{"t":0,"s":[{"v":[[0,-140],[140,0],[0,140],[-140,0],[0,-140],[0,-140],[0,-140],[0,-140],[0,-140],[0,-140],[0,-140]],"i":[[0,0],[0,-77.32],[77.32,0],[0,77.32],[-77.32,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[77.32,0],[0,77.32],[-77.32,0],[0,-77.32],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":0,"s":[{"v":[[0,140],[0,140],[0,128.8],[0,128.8],[0,140],[0,140],[0,140],[0,140],[0,140],[0,140],[0,140]],"i":[[0,0],[0,-140],[0,0],[0,-128.8],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,-140],[0,0],[0,-128.8],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":1,"s":[{"v":[[-3.54,139.96],[-10.57,139.6],[-9.72,128.43],[-3.26,128.76],[-3.54,139.96],[-3.54,139.96],[-3.54,139.96],[-3.54,139.96],[-3.54,139.96],[-3.54,139.96],[-3.54,139.96]],"i":[[0,0],[2.34,0.18],[0,0],[-2.16,-0.05],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-2.35,-0.06],[0,0],[2.15,0.16],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":2,"s":[{"v":[[-8.33,139.75],[-24.91,137.77],[-22.92,126.74],[-7.66,128.57],[-8.33,139.75],[-8.33,139.75],[-8.33,139.75],[-8.33,139.75],[-8.33,139.75],[-8.33,139.75],[-8.33,139.75]],"i":[[0,0],[5.48,0.99],[0,0],[-5.12,-0.3],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-5.56,-0.33],[0,0],[5.05,0.91],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":3,"s":[{"v":[[-14.46,139.25],[-42.82,133.29],[-39.39,122.63],[-13.31,128.11],[-14.46,139.25],[-14.46,139.25],[-14.46,139.25],[-14.46,139.25],[-14.46,139.25],[-14.46,139.25],[-14.46,139.25]],"i":[[0,0],[9.22,2.96],[0,0],[-8.86,-0.92],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-9.63,-1],[0,0],[8.48,2.73],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":4,"s":[{"v":[[-22,138.26],[-63.8,124.62],[-58.7,114.65],[-20.24,127.2],[-22,138.26],[-22,138.26],[-22,138.26],[-22,138.26],[-22,138.26],[-22,138.26],[-22,138.26]],"i":[[0,0],[13.13,6.72],[0,0],[-13.4,-2.13],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-14.57,-2.32],[0,0],[12.08,6.18],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":5,"s":[{"v":[[-30.9,136.55],[-86.65,109.96],[-79.72,101.17],[-28.43,125.62],[-30.9,136.55],[-30.9,136.55],[-30.9,136.55],[-30.9,136.55],[-30.9,136.55],[-30.9,136.55],[-30.9,136.55]],"i":[[0,0],[16.37,12.9],[0,0],[-18.71,-4.23],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-20.33,-4.6],[0,0],[15.06,11.87],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":6,"s":[{"v":[[-41.07,133.84],[-109.09,87.75],[-100.36,80.73],[-37.79,123.13],[-41.07,133.84],[-41.07,133.84],[-41.07,133.84],[-41.07,133.84],[-41.07,133.84],[-41.07,133.84],[-41.07,133.84]],"i":[[0,0],[17.55,21.82],[0,0],[-24.63,-7.56],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-26.77,-8.22],[0,0],[16.15,20.08],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":7,"s":[{"v":[[-52.38,129.83],[-127.82,57.11],[-117.6,52.54],[-48.19,119.45],[-52.38,129.83],[-52.38,129.83],[-52.38,129.83],[-52.38,129.83],[-52.38,129.83],[-52.38,129.83],[-52.38,129.83]],"i":[[0,0],[14.79,33.09],[0,0],[-30.93,-12.48],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-33.61,-13.56],[0,0],[13.6,30.45],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":8,"s":[{"v":[[-64.51,124.25],[-138.74,18.75],[-127.64,17.25],[-59.35,114.31],[-64.51,124.25],[-64.51,124.25],[-64.51,124.25],[-64.51,124.25],[-64.51,124.25],[-64.51,124.25],[-64.51,124.25]],"i":[[0,0],[6.1,45.15],[0,0],[-37.2,-19.32],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-40.43,-20.99],[0,0],[5.61,41.54],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":9,"s":[{"v":[[-77.03,116.91],[-137.8,-24.7],[-126.78,-22.72],[-70.86,107.55],[-77.03,116.91],[-77.03,116.91],[-77.03,116.91],[-77.03,116.91],[-77.03,116.91],[-77.03,116.91],[-77.03,116.91]],"i":[[0,0],[-9.88,55.11],[0,0],[-43.01,-28.34],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-46.75,-30.8],[0,0],[-9.09,50.7],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":10,"s":[{"v":[[-89.47,107.68],[-122.24,-68.24],[-112.46,-62.78],[-82.31,99.07],[-89.47,107.68],[-89.47,107.68],[-89.47,107.68],[-89.47,107.68],[-89.47,107.68],[-89.47,107.68],[-89.47,107.68]],"i":[[0,0],[-32.87,58.88],[0,0],[-47.72,-39.65],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-51.87,-43.09],[0,0],[-30.24,54.17],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":11,"s":[{"v":[[-101.3,96.64],[-139.84,-6.59],[-91.76,-105.74],[-84.42,-97.28],[-128.66,-6.07],[-93.2,88.9],[-101.3,96.64],[-101.3,96.64],[-101.3,96.64],[-101.3,96.64],[-101.3,96.64]],"i":[[0,0],[-1.8,38.23],[-28.91,25.09],[0,0],[1.66,-35.17],[-24.31,-25.48],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-26.42,-27.69],[1.8,-38.23],[0,0],[-26.6,23.08],[-1.66,35.17],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":12,"s":[{"v":[[-112.01,83.98],[-134.39,-39.24],[-49.23,-131.06],[-45.29,-120.57],[-123.64,-36.1],[-103.05,77.26],[-112.01,83.98],[-112.01,83.98],[-112.01,83.98],[-112.01,83.98],[-112.01,83.98]],"i":[[0,0],[-12.35,42.3],[-41.26,15.5],[0,0],[11.36,-38.92],[-24.32,-32.44],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-26.44,-35.26],[12.35,-42.3],[0,0],[-37.96,14.26],[-11.36,38.92],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":13,"s":[{"v":[[-121.24,70],[-121.23,-70.03],[0.06,-140],[0.05,-128.8],[-111.53,-64.42],[-111.54,64.4],[-121.24,70],[-121.24,70],[-121.24,70],[-121.24,70],[-121.24,70]],"i":[[0,0],[-25.02,43.32],[-50.03,-0.02],[0,0],[23.02,-39.85],[-23.01,-39.86],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-25.01,-43.33],[25.02,-43.32],[0,0],[-46.03,-0.02],[-23.02,39.85],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":14,"s":[{"v":[[-128.71,55.08],[-101.28,-96.66],[49.02,-131.14],[45.1,-120.64],[-93.17,-88.93],[-118.41,50.68],[-128.71,55.08],[-128.71,55.08],[-128.71,55.08],[-128.71,55.08],[-128.71,55.08]],"i":[[0,0],[-38.69,40.53],[-52.49,-19.62],[0,0],[35.59,-37.29],[-20.28,-47.39],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-22.05,-51.51],[38.69,-40.53],[0,0],[-48.29,-18.05],[-35.59,37.29],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":15,"s":[{"v":[[-134.26,39.69],[-76.13,-117.49],[91.09,-106.31],[83.8,-97.81],[-70.04,-108.09],[-123.52,36.52],[-134.26,39.69],[-134.26,39.69],[-134.26,39.69],[-134.26,39.69],[-134.26,39.69]],"i":[[0,0],[-52.06,33.73],[-47.11,-40.36],[0,0],[47.9,-31.03],[-16.18,-54.73],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-17.59,-59.49],[52.06,-33.73],[0,0],[-43.34,-37.13],[-47.9,31.03],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":16,"s":[{"v":[[-137.9,24.17],[-47.6,-131.66],[121.47,-69.6],[111.75,-64.03],[-43.79,-121.13],[-126.87,22.23],[-137.9,24.17],[-137.9,24.17],[-137.9,24.17],[-137.9,24.17],[-137.9,24.17]],"i":[[0,0],[-63.95,23.12],[-33.81,-59],[0,0],[58.83,-21.27],[-10.8,-61.62],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-11.74,-66.98],[63.95,-23.12],[0,0],[-31.1,-54.28],[-58.83,21.27],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":17,"s":[{"v":[[-139.72,8.91],[-17.8,-138.86],[137.45,-26.61],[126.45,-24.48],[-16.37,-127.75],[-128.54,8.2],[-139.72,8.91],[-139.72,8.91],[-139.72,8.91],[-139.72,8.91],[-139.72,8.91]],"i":[[0,0],[-73.26,9.39],[-14.04,-72.51],[0,0],[67.4,-8.64],[-4.33,-67.81],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-4.7,-73.71],[73.26,-9.39],[0,0],[-12.92,-66.71],[-67.4,8.64],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":18,"s":[{"v":[[-139.88,-5.86],[-61.38,-125.83],[81.48,-113.85],[138.9,17.52],[127.79,16.12],[74.96,-104.74],[-56.47,-115.76],[-128.69,-5.39],[-139.88,-5.86],[-139.88,-5.86],[-139.88,-5.86]],"i":[[0,0],[-46.21,22.54],[-41.81,-29.92],[6.43,-51.01],[0,0],[38.46,27.53],[42.51,-20.74],[1.98,-47.26],[0,0],[0,0],[0,0]],"o":[[2.15,-51.37],[46.21,-22.54],[41.81,29.92],[0,0],[5.92,-46.93],[-38.46,-27.53],[-42.51,20.74],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":19,"s":[{"v":[[-138.58,-19.9],[-39.49,-134.32],[105.77,-91.73],[127.38,58.09],[117.19,53.44],[97.3,-84.39],[-36.33,-123.57],[-127.49,-18.3],[-138.58,-19.9],[-138.58,-19.9],[-138.58,-19.9]],"i":[[0,0],[-52.58,15.46],[-35.91,-41.4],[22.74,-49.86],[0,0],[33.03,38.09],[48.37,-14.22],[7.17,-49.91],[0,0],[0,0],[0,0]],"o":[[7.79,-54.25],[52.58,-15.46],[35.91,41.4],[0,0],[20.92,-45.88],[-33.03,-38.09],[-48.37,14.22],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":20,"s":[{"v":[[-136.04,-33.06],[-17.62,-138.89],[123.47,-65.99],[105.68,91.82],[97.23,84.47],[113.59,-60.71],[-16.21,-127.78],[-125.16,-30.42],[-136.04,-33.06],[-136.04,-33.06],[-136.04,-33.06]],"i":[[0,0],[-57.6,7.31],[-27.37,-51.2],[38.08,-43.83],[0,0],[25.18,47.11],[52.99,-6.72],[12.61,-51.9],[0,0],[0,0],[0,0]],"o":[[13.71,-56.42],[57.6,-7.31],[27.37,51.2],[0,0],[35.03,-40.32],[-25.18,-47.11],[-52.99,6.72],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":21,"s":[{"v":[[-132.48,-45.26],[3.51,-139.96],[134.58,-38.56],[77.09,116.86],[70.92,107.51],[123.82,-35.48],[3.23,-128.76],[-121.88,-41.64],[-132.48,-45.26],[-132.48,-45.26],[-132.48,-45.26]],"i":[[0,0],[-61.15,-1.53],[-16.85,-58.8],[51.06,-33.68],[0,0],[15.5,54.1],[56.26,1.41],[18.19,-53.26],[0,0],[0,0],[0,0]],"o":[[19.77,-57.89],[61.15,1.53],[16.85,58.8],[0,0],[46.98,-30.99],[-15.5,-54.1],[-56.26,-1.41],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":22,"s":[{"v":[[-128.1,-56.47],[23.48,-138.02],[139.57,-10.94],[44.7,132.67],[41.12,122.06],[128.41,-10.07],[21.6,-126.98],[-117.86,-51.96],[-128.1,-56.47],[-128.1,-56.47],[-128.1,-56.47]],"i":[[0,0],[-63.24,-10.76],[-5.01,-63.95],[60.79,-20.48],[0,0],[4.61,58.84],[58.18,9.9],[23.81,-54],[0,0],[0,0],[0,0]],"o":[[25.88,-58.7],[63.24,10.76],[5.01,63.95],[0,0],[55.93,-18.84],[-4.61,-58.84],[-58.18,-9.9],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":23,"s":[{"v":[[-123.08,-66.72],[41.94,-133.57],[139.13,15.62],[11.29,139.54],[10.38,128.38],[128,14.37],[38.59,-122.88],[-113.23,-61.38],[-123.08,-66.72],[-123.08,-66.72],[-123.08,-66.72]],"i":[[0,0],[-63.92,-20.07],[7.47,-66.58],[66.78,-5.4],[0,0],[-6.87,61.25],[58.8,18.46],[29.37,-54.19],[0,0],[0,0],[0,0]],"o":[[31.93,-58.9],[63.92,20.07],[-7.47,66.58],[0,0],[61.43,-4.97],[6.87,-61.25],[-58.8,-18.46],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":24,"s":[{"v":[[-117.6,-75.96],[58.63,-127.13],[134.12,40.14],[-20.84,138.44],[-19.17,127.37],[123.39,36.93],[53.94,-116.96],[-108.19,-69.89],[-117.6,-75.96],[-117.6,-75.96],[-117.6,-75.96]],"i":[[0,0],[-63.29,-29.19],[19.98,-66.77],[68.92,10.37],[0,0],[-18.38,61.43],[58.23,26.86],[34.79,-53.86],[0,0],[0,0],[0,0]],"o":[[37.82,-58.55],[63.29,29.19],[-19.98,66.77],[0,0],[63.41,9.54],[18.38,-61.43],[-58.23,-26.86],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":25,"s":[{"v":[[-111.79,-84.27],[73.53,-119.14],[125.45,62.15],[-50.23,130.68],[-46.21,120.22],[115.41,57.18],[67.65,-109.61],[-102.85,-77.53],[-111.79,-84.27],[-111.79,-84.27],[-111.79,-84.27]],"i":[[0,0],[-61.51,-37.96],[32.09,-64.77],[67.47,25.93],[0,0],[-29.52,59.59],[56.59,34.93],[40.03,-53.1],[0,0],[0,0],[0,0]],"o":[[43.51,-57.72],[61.51,37.96],[-32.09,64.77],[0,0],[62.07,23.86],[29.52,-59.59],[-56.59,-34.93],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":26,"s":[{"v":[[-105.79,-91.7],[86.59,-110.01],[113.98,81.29],[-75.81,117.7],[-69.74,108.28],[104.86,74.79],[79.67,-101.21],[-97.32,-84.36],[-105.79,-91.7],[-105.79,-91.7],[-105.79,-91.7]],"i":[[0,0],[-58.73,-46.23],[43.4,-60.85],[62.84,40.47],[0,0],[-39.93,55.99],[54.03,42.53],[45.04,-51.96],[0,0],[0,0],[0,0]],"o":[[48.96,-56.48],[58.73,46.23],[-43.4,60.85],[0,0],[57.81,37.23],[39.93,-55.99],[-54.03,-42.53],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":27,"s":[{"v":[[-99.67,-98.32],[97.88,-100.1],[100.53,97.44],[-97,100.96],[-89.24,92.88],[92.49,89.64],[90.05,-92.09],[-91.69,-90.45],[-99.67,-98.32],[-99.67,-98.32],[-99.67,-98.32]],"i":[[0,0],[-55.11,-53.89],[53.65,-55.35],[55.58,53.4],[0,0],[-49.35,50.92],[50.7,49.58],[49.8,-50.48],[0,0],[0,0],[0,0]],"o":[[54.13,-54.87],[55.11,53.89],[-53.65,55.35],[0,0],[51.14,49.13],[49.35,-50.92],[-50.7,-49.58],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":28,"s":[{"v":[[-93.51,-104.19],[63.86,-124.59],[139.18,15.09],[35.68,135.38],[-113.67,81.73],[-104.57,75.19],[32.83,124.55],[128.05,13.88],[58.75,-114.62],[-86.03,-95.85],[-93.51,-104.19]],"i":[[0,0],[-51.62,-26.46],[6.25,-57.67],[56.09,-14.78],[33.86,47.09],[0,0],[-51.6,13.6],[-5.75,53.05],[47.49,24.34],[39.71,-35.65],[0,0]],"o":[[43.17,-38.74],[51.62,26.46],[-6.25,57.67],[-56.09,14.78],[0,0],[31.15,43.33],[51.6,-13.6],[5.75,-53.05],[-47.49,-24.34],[0,0],[0,0]]}],"h":1},{"t":29,"s":[{"v":[[-87.42,-109.35],[74.27,-118.68],[136.57,30.81],[16.11,139.07],[-125.9,61.22],[-115.83,56.32],[14.82,127.94],[125.64,28.35],[68.32,-109.18],[-80.43,-100.6],[-87.42,-109.35]],"i":[[0,0],[-50.41,-31.54],[13.09,-58],[59.07,-6.84],[26,53.48],[0,0],[-54.34,6.3],[-12.04,53.36],[46.37,29.02],[42.73,-34.16],[0,0]],"o":[[46.45,-37.13],[50.41,31.54],[-13.09,58],[-59.07,6.84],[0,0],[23.92,49.2],[54.34,-6.3],[12.04,-53.36],[-46.37,-29.02],[0,0],[0,0]]}],"h":1},{"t":30,"s":[{"v":[[-81.44,-113.88],[83.56,-112.33],[132.48,45.26],[-2.63,139.98],[-134.09,40.24],[-123.36,37.02],[-2.42,128.78],[121.88,41.64],[76.88,-103.34],[-74.92,-104.77],[-81.44,-113.88]],"i":[[0,0],[-48.82,-36.32],[19.67,-57.58],[60.84,1.14],[17.49,58.28],[0,0],[-55.97,-1.05],[-18.1,52.97],[44.91,33.41],[45.53,-32.56],[0,0]],"o":[[49.49,-35.39],[48.82,36.32],[-19.67,57.58],[-60.84,-1.14],[0,0],[16.09,53.62],[55.97,1.05],[18.1,-52.97],[-44.91,-33.41],[0,0],[0,0]]}],"h":1},{"t":31,"s":[{"v":[[-75.59,-117.84],[91.82,-105.68],[127.24,58.39],[-20.25,138.53],[-138.63,19.53],[-127.54,17.97],[-18.63,127.45],[117.06,53.72],[84.47,-97.23],[-69.55,-108.41],[-75.59,-117.84]],"i":[[0,0],[-46.92,-40.76],[25.92,-56.49],[61.5,8.99],[8.67,61.55],[0,0],[-56.58,-8.27],[-23.85,51.97],[43.17,37.5],[48.13,-30.88],[0,0]],"o":[[52.32,-33.56],[46.92,40.76],[-25.92,56.49],[-61.5,-8.99],[0,0],[7.98,56.62],[56.58,8.27],[23.85,-51.97],[-43.17,-37.5],[0,0],[0,0]]}],"h":1},{"t":32,"s":[{"v":[[-69.92,-121.29],[99.11,-98.88],[121.14,70.19],[-36.5,135.16],[-140,-0.33],[-128.8,-0.31],[-33.58,124.35],[111.45,64.57],[91.18,-90.97],[-64.32,-111.59],[-69.92,-121.29]],"i":[[0,0],[-44.77,-44.87],[31.78,-54.85],[61.19,16.53],[-0.15,63.39],[0,0],[-56.3,-15.2],[-29.24,50.46],[41.19,41.28],[50.52,-29.12],[0,0]],"o":[[54.92,-31.65],[44.77,44.87],[-31.78,54.85],[-61.19,-16.53],[0,0],[-0.14,58.32],[56.3,15.2],[29.24,-50.46],[-41.19,-41.28],[0,0],[0,0]]}],"h":1},{"t":33,"s":[{"v":[[-64.43,-124.29],[105.5,-92.03],[114.39,80.71],[-51.32,130.25],[-138.7,-19.02],[-127.61,-17.5],[-47.22,119.83],[105.24,74.25],[97.06,-84.67],[-59.27,-114.35],[-64.43,-124.29]],"i":[[0,0],[-42.43,-48.64],[37.21,-52.74],[60.06,23.66],[-8.77,63.95],[0,0],[-55.25,-21.77],[-34.24,48.52],[39.04,44.75],[52.72,-27.33],[0,0]],"o":[[57.31,-29.71],[42.43,48.64],[-37.21,52.74],[-60.06,-23.66],[0,0],[-8.07,58.84],[55.25,21.77],[34.24,-48.52],[-39.04,-44.75],[0,0],[0,0]]}],"h":1},{"t":34,"s":[{"v":[[-59.19,-126.87],[111.05,-85.25],[107.27,89.97],[-64.62,124.2],[-135.24,-36.2],[-124.42,-33.31],[-59.45,114.26],[98.68,82.77],[102.17,-78.43],[-54.45,-116.72],[-59.19,-126.87]],"i":[[0,0],[-39.97,-52.07],[42.18,-50.29],[58.23,30.3],[-16.97,63.41],[0,0],[-53.57,-27.87],[-38.81,46.27],[36.77,47.9],[54.73,-25.53],[0,0]],"o":[[59.49,-27.75],[39.97,52.07],[-42.18,50.29],[-58.23,-30.3],[0,0],[-15.62,58.34],[53.57,27.87],[38.81,-46.27],[-36.77,-47.9],[0,0],[0,0]]}],"h":1},{"t":35,"s":[{"v":[[-54.16,-129.1],[115.87,-78.58],[99.91,98.07],[-76.42,117.3],[-130.08,-51.76],[-119.67,-47.62],[-70.31,107.92],[91.91,90.23],[106.6,-72.29],[-49.83,-118.77],[-54.16,-129.1]],"i":[[0,0],[-37.42,-55.17],[46.7,-47.57],[55.86,36.39],[-24.65,61.94],[0,0],[-51.39,-33.48],[-42.97,43.77],[34.43,50.76],[56.56,-23.73],[0,0]],"o":[[61.48,-25.79],[37.42,55.17],[-46.7,47.57],[-55.86,-36.39],[0,0],[-22.68,56.99],[51.39,33.48],[42.97,-43.77],[-34.43,-50.76],[0,0],[0,0]]}],"h":1},{"t":36,"s":[{"v":[[-49.4,-131],[120.01,-72.09],[92.44,105.14],[-86.85,109.8],[-123.6,-65.75],[-113.71,-60.49],[-79.91,101.02],[85.05,96.73],[110.41,-66.32],[-45.44,-120.52],[-49.4,-131]],"i":[[0,0],[-34.83,-57.98],[50.79,-44.66],[53.05,41.96],[-31.77,59.71],[0,0],[-48.8,-38.6],[-46.73,41.09],[32.04,53.34],[58.22,-21.95],[0,0]],"o":[[63.29,-23.86],[34.83,57.98],[-50.79,44.66],[-53.05,-41.96],[0,0],[-29.22,54.93],[48.8,38.6],[46.73,-41.09],[-32.04,-53.34],[0,0],[0,0]]}],"h":1},{"t":37,"s":[{"v":[[-44.86,-132.62],[123.58,-65.8],[84.98,111.26],[-95.99,101.91],[-116.14,-78.17],[-106.85,-71.92],[-88.31,93.76],[78.18,102.36],[113.69,-60.53],[-41.27,-122.01],[-44.86,-132.62]],"i":[[0,0],[-32.22,-60.51],[54.47,-41.61],[49.9,47],[-38.27,56.87],[0,0],[-45.91,-43.24],[-50.12,38.28],[29.64,55.67],[59.74,-20.21],[0,0]],"o":[[64.93,-21.97],[32.22,60.51],[-54.47,41.61],[-49.9,-47],[0,0],[-35.21,52.32],[45.91,43.24],[50.12,-38.28],[-29.64,-55.67],[0,0],[0,0]]}],"h":1},{"t":38,"s":[{"v":[[-40.58,-133.99],[126.6,-59.77],[77.67,116.48],[-103.84,93.9],[-108.1,-88.96],[-99.45,-81.85],[-95.53,86.39],[71.46,107.16],[116.47,-54.99],[-37.33,-123.27],[-40.58,-133.99]],"i":[[0,0],[-29.63,-62.76],[57.74,-38.5],[46.55,51.47],[-44.1,53.58],[0,0],[-42.82,-47.36],[-53.12,35.42],[27.26,57.73],[61.11,-18.51],[0,0]],"o":[[66.42,-20.12],[29.63,62.76],[-57.74,38.5],[-46.55,-51.47],[0,0],[-40.57,49.3],[42.82,47.36],[53.12,-35.42],[-27.26,-57.73],[0,0],[0,0]]}],"h":1},{"t":39,"s":[{"v":[[-36.54,-135.15],[129.16,-54.02],[70.57,120.91],[-110.57,85.88],[-99.69,-98.29],[-91.72,-90.43],[-101.72,79.01],[64.92,111.24],[118.82,-49.7],[-33.62,-124.34],[-36.54,-135.15]],"i":[[0,0],[-27.09,-64.76],[60.62,-35.38],[43.06,55.43],[-49.28,49.98],[0,0],[-39.61,-51],[-55.77,32.55],[24.92,59.58],[62.34,-16.86],[0,0]],"o":[[67.76,-18.32],[27.09,64.76],[-60.62,35.38],[-43.06,-55.43],[0,0],[-45.34,45.99],[39.61,51],[55.77,-32.55],[-24.92,-59.58],[0,0],[0,0]]}],"h":1},{"t":40,"s":[{"v":[[-32.75,-136.11],[131.31,-48.57],[63.7,124.67],[-116.29,77.95],[-91.11,-106.29],[-83.82,-97.79],[-106.99,71.71],[58.61,114.69],[120.8,-44.68],[-30.13,-125.23],[-32.75,-136.11]],"i":[[0,0],[-24.61,-66.53],[63.17,-32.28],[39.5,58.92],[-53.86,46.17],[0,0],[-36.34,-54.21],[-58.12,29.7],[22.64,61.21],[63.45,-15.27],[0,0]],"o":[[68.97,-16.6],[24.61,66.53],[-63.17,32.28],[-39.5,-58.92],[0,0],[-49.55,42.47],[36.34,54.21],[58.12,-29.7],[-22.64,-61.21],[0,0],[0,0]]}],"h":1},{"t":41,"s":[{"v":[[-29.2,-136.92],[133.1,-43.4],[57.13,127.81],[-121.12,70.22],[-82.53,-113.08],[-75.93,-104.04],[-111.43,64.6],[52.56,117.59],[122.45,-39.93],[-26.87,-125.97],[-29.2,-136.92]],"i":[[0,0],[-22.21,-68.11],[65.4,-29.23],[35.93,61.97],[-57.86,42.23],[0,0],[-33.05,-57.02],[-60.17,26.89],[20.43,62.66],[64.45,-13.75],[0,0]],"o":[[70.06,-14.94],[22.21,68.11],[-65.4,29.23],[-35.93,-61.97],[0,0],[-53.23,38.85],[33.05,57.02],[60.17,-26.89],[-20.43,-62.66],[0,0],[0,0]]}],"h":1},{"t":42,"s":[{"v":[[-25.9,-137.58],[134.58,-38.56],[50.89,130.42],[-125.13,62.78],[-74.13,-118.76],[-68.2,-109.26],[-115.12,57.76],[46.82,119.99],[123.82,-35.48],[-23.83,-126.58],[-25.9,-137.58]],"i":[[0,0],[-19.91,-69.49],[67.34,-26.28],[32.42,64.61],[-61.32,38.27],[0,0],[-29.82,-59.44],[-61.95,24.17],[18.32,63.93],[65.35,-12.3],[0,0]],"o":[[71.04,-13.37],[19.91,69.49],[-67.34,26.28],[-32.42,-64.61],[0,0],[-56.41,35.21],[29.82,59.44],[61.95,-24.17],[-18.32,-63.93],[0,0],[0,0]]}],"h":1},{"t":43,"s":[{"v":[[-22.82,-138.13],[135.8,-34.03],[45.02,132.56],[-128.44,55.71],[-66.02,-123.46],[-60.74,-113.58],[-118.16,51.25],[41.42,121.96],[124.94,-31.31],[-20.99,-127.08],[-22.82,-138.13]],"i":[[0,0],[-17.72,-70.7],[69.01,-23.44],[29,66.86],[-64.27,34.37],[0,0],[-26.68,-61.52],[-63.49,21.56],[16.3,65.04],[66.16,-10.93],[0,0]],"o":[[71.91,-11.88],[17.72,70.7],[-69.01,23.44],[-29,-66.86],[0,0],[-59.13,31.62],[26.68,61.52],[63.49,-21.56],[-16.3,-65.04],[0,0],[0,0]]}],"h":1},{"t":44,"s":[{"v":[[-19.97,-138.57],[136.78,-29.83],[39.55,134.3],[-131.12,49.06],[-58.31,-127.28],[-53.65,-117.09],[-120.63,45.13],[36.38,123.55],[125.84,-27.45],[-18.37,-127.48],[-19.97,-138.57]],"i":[[0,0],[-15.65,-71.75],[70.44,-20.74],[25.73,68.78],[-66.76,30.59],[0,0],[-23.67,-63.27],[-64.81,19.08],[14.4,66.01],[66.87,-9.64],[0,0]],"o":[[72.68,-10.47],[15.65,71.75],[-70.44,20.74],[-25.73,-68.78],[0,0],[-61.42,28.14],[23.67,63.27],[64.81,-19.08],[-14.4,-66.01],[0,0],[0,0]]}],"h":1},{"t":45,"s":[{"v":[[-17.35,-138.92],[137.58,-25.93],[34.41,135.7],[-133.31,42.76],[-50.95,-130.4],[-46.87,-119.97],[-122.64,39.34],[31.66,124.85],[126.57,-23.86],[-15.96,-127.81],[-17.35,-138.92]],"i":[[0,0],[-13.7,-72.67],[71.68,-18.18],[22.59,70.41],[-68.88,26.91],[0,0],[-20.78,-64.78],[-65.95,16.72],[12.6,66.86],[67.51,-8.43],[0,0]],"o":[[73.38,-9.17],[13.7,72.67],[-71.68,18.18],[-22.59,-70.41],[0,0],[-63.37,24.76],[20.78,64.78],[65.95,-16.72],[-12.6,-66.86],[0,0],[0,0]]}],"h":1},{"t":46,"s":[{"v":[[-14.93,-139.2],[138.21,-22.34],[29.68,136.82],[-135.04,36.94],[-44.1,-132.87],[-40.57,-122.24],[-124.23,33.99],[27.31,125.87],[127.15,-20.55],[-13.73,-128.07],[-14.93,-139.2]],"i":[[0,0],[-11.87,-73.46],[72.72,-15.78],[19.64,71.78],[-70.63,23.44],[0,0],[-18.07,-66.04],[-66.91,14.51],[10.92,67.59],[68.07,-7.3],[0,0]],"o":[[73.99,-7.93],[11.87,73.46],[-72.72,15.78],[-19.64,-71.78],[0,0],[-64.98,21.56],[18.07,66.04],[66.91,-14.51],[-10.92,-67.59],[0,0],[0,0]]}],"h":1},{"t":47,"s":[{"v":[[-12.71,-139.42],[138.7,-19.05],[25.34,137.69],[-136.39,31.59],[-37.77,-134.81],[-34.75,-124.03],[-125.48,29.06],[23.32,126.67],[127.6,-17.52],[-11.7,-128.27],[-12.71,-139.42]],"i":[[0,0],[-10.18,-74.14],[73.6,-13.55],[16.89,72.91],[-72.07,20.19],[0,0],[-15.54,-67.08],[-67.72,12.46],[9.37,68.21],[68.57,-6.25],[0,0]],"o":[[74.53,-6.8],[10.18,74.14],[-73.6,13.55],[-16.89,-72.91],[0,0],[-66.3,18.57],[15.54,67.08],[67.72,-12.46],[-9.37,-68.21],[0,0],[0,0]]}],"h":1},{"t":48,"s":[{"v":[[-10.72,-139.59],[139.08,-16.06],[21.37,138.36],[-137.44,26.66],[-31.91,-136.32],[-29.35,-125.41],[-126.44,24.53],[19.66,127.29],[127.95,-14.77],[-9.86,-128.42],[-10.72,-139.59]],"i":[[0,0],[-8.63,-74.74],[74.35,-11.49],[14.33,73.86],[-73.25,17.15],[0,0],[-13.18,-67.95],[-68.4,10.57],[7.94,68.76],[69.01,-5.3],[0,0]],"o":[[75.01,-5.76],[8.63,74.74],[-74.35,11.49],[-14.33,-73.86],[0,0],[-67.39,15.77],[13.18,67.95],[68.4,-10.57],[-7.94,-68.76],[0,0],[0,0]]}],"h":1},{"t":49,"s":[{"v":[[-8.89,-139.72],[139.37,-13.32],[17.73,138.87],[-138.24,22.13],[-26.5,-137.47],[-24.38,-126.47],[-127.18,20.36],[16.31,127.76],[128.22,-12.25],[-8.18,-128.54],[-8.89,-139.72]],"i":[[0,0],[-7.19,-75.25],[74.98,-9.57],[11.95,74.64],[-74.22,14.31],[0,0],[-10.99,-68.67],[-68.98,8.81],[6.61,69.23],[69.4,-4.42],[0,0]],"o":[[75.44,-4.8],[7.19,75.25],[-74.98,9.57],[-11.95,-74.64],[0,0],[-68.29,13.16],[10.99,68.67],[68.98,-8.81],[-6.61,-69.23],[0,0],[0,0]]}],"h":1},{"t":50,"s":[{"v":[[-7.25,-139.81],[139.58,-10.87],[14.49,139.25],[-138.83,18.09],[-21.68,-138.31],[-19.95,-127.25],[-127.72,16.64],[13.33,128.11],[128.41,-10],[-6.67,-128.63],[-7.25,-139.81]],"i":[[0,0],[-5.9,-75.68],[75.5,-7.86],[9.81,75.27],[-74.99,11.76],[0,0],[-9.02,-69.25],[-69.46,7.23],[5.42,69.62],[69.74,-3.62],[0,0]],"o":[[75.8,-3.93],[5.9,75.68],[-75.5,7.86],[-9.81,-75.27],[0,0],[-68.99,10.82],[9.02,69.25],[69.46,-7.23],[-5.42,-69.62],[0,0],[0,0]]}],"h":1},{"t":51,"s":[{"v":[[-5.81,-139.88],[139.73,-8.71],[11.61,139.52],[-139.25,14.5],[-17.38,-138.92],[-15.99,-127.8],[-128.11,13.34],[10.68,128.36],[128.55,-8.02],[-5.35,-128.69],[-5.81,-139.88]],"i":[[0,0],[-4.74,-76.04],[75.93,-6.32],[7.89,75.78],[-75.6,9.46],[0,0],[-7.26,-69.72],[-69.85,5.81],[4.36,69.96],[70.03,-2.91],[0,0]],"o":[[76.12,-3.16],[4.74,76.04],[-75.93,6.32],[-7.89,-75.78],[0,0],[-69.55,8.7],[7.26,69.72],[69.85,-5.81],[-4.36,-69.96],[0,0],[0,0]]}],"h":1},{"t":52,"s":[{"v":[[-4.54,-139.93],[139.83,-6.81],[9.07,139.71],[-139.54,11.33],[-13.58,-139.34],[-12.5,-128.19],[-128.38,10.42],[8.34,128.53],[128.65,-6.26],[-4.18,-128.73],[-4.54,-139.93]],"i":[[0,0],[-3.72,-76.35],[76.28,-4.95],[6.18,76.19],[-76.08,7.42],[0,0],[-5.69,-70.09],[-70.17,4.56],[3.42,70.24],[70.28,-2.28],[0,0]],"o":[[76.4,-2.48],[3.72,76.35],[-76.28,4.95],[-6.18,-76.19],[0,0],[-69.99,6.82],[5.69,70.09],[70.17,-4.56],[-3.42,-70.24],[0,0],[0,0]]}],"h":1},{"t":53,"s":[{"v":[[-3.44,-139.96],[139.9,-5.16],[6.87,139.83],[-139.74,8.59],[-10.3,-139.62],[-9.47,-128.45],[-128.56,7.9],[6.32,128.64],[128.71,-4.75],[-3.17,-128.76],[-3.44,-139.96]],"i":[[0,0],[-2.82,-76.6],[76.56,-3.76],[4.7,76.51],[-76.44,5.64],[0,0],[-4.32,-70.39],[-70.43,3.46],[2.6,70.47],[70.5,-1.74],[0,0]],"o":[[76.63,-1.89],[2.82,76.6],[-76.56,3.76],[-4.7,-76.51],[0,0],[-70.33,5.19],[4.32,70.39],[70.43,-3.46],[-2.6,-70.47],[0,0],[0,0]]}],"h":1},{"t":54,"s":[{"v":[[-2.49,-139.98],[139.95,-3.75],[5,139.91],[-139.86,6.25],[-7.5,-139.8],[-6.9,-128.61],[-128.67,5.75],[4.6,128.72],[128.75,-3.45],[-2.29,-128.78],[-2.49,-139.98]],"i":[[0,0],[-2.06,-76.8],[76.78,-2.74],[3.43,76.75],[-76.72,4.12],[0,0],[-3.16,-70.61],[-70.64,2.52],[1.89,70.66],[70.67,-1.26],[0,0]],"o":[[76.82,-1.37],[2.06,76.8],[-76.78,2.74],[-3.43,-76.75],[0,0],[-70.58,3.79],[3.16,70.61],[70.64,-2.52],[-1.89,-70.66],[0,0],[0,0]]}],"h":1},{"t":55,"s":[{"v":[[-1.71,-139.99],[139.98,-2.57],[3.43,139.96],[-139.93,4.28],[-5.14,-139.91],[-4.73,-128.71],[-128.74,3.94],[3.15,128.76],[128.78,-2.36],[-1.57,-128.79],[-1.71,-139.99]],"i":[[0,0],[-1.41,-76.97],[76.96,-1.88],[2.36,76.95],[-76.93,2.83],[0,0],[-2.17,-70.79],[-70.81,1.73],[1.3,70.81],[70.82,-0.87],[0,0]],"o":[[76.98,-0.94],[1.41,76.97],[-76.96,1.88],[-2.36,-76.95],[0,0],[-70.78,2.6],[2.17,70.79],[70.81,-1.73],[-1.3,-70.81],[0,0],[0,0]]}],"h":1},{"t":56,"s":[{"v":[[-1.08,-140],[139.99,-1.62],[2.17,139.98],[-139.97,2.72],[-3.27,-139.96],[-3.01,-128.76],[-128.78,2.51],[2,128.78],[128.79,-1.49],[-0.99,-128.8],[-1.08,-140]],"i":[[0,0],[-0.89,-77.1],[77.1,-1.2],[1.5,77.09],[-77.08,1.8],[0,0],[-1.38,-70.92],[-70.93,1.1],[0.82,70.93],[70.93,-0.54],[0,0]],"o":[[77.1,-0.59],[0.89,77.1],[-77.1,1.2],[-1.5,-77.09],[0,0],[-70.92,1.66],[1.38,70.92],[70.93,-1.1],[-0.82,-70.93],[0,0],[0,0]]}],"h":1},{"t":57,"s":[{"v":[[-0.61,-140],[140,-0.92],[1.23,139.99],[-139.99,1.53],[-1.84,-139.99],[-1.69,-128.79],[-128.79,1.41],[1.13,128.8],[128.8,-0.85],[-0.56,-128.8],[-0.61,-140]],"i":[[0,0],[-0.51,-77.2],[77.2,-0.68],[0.85,77.2],[-77.19,1.02],[0,0],[-0.78,-71.02],[-71.02,0.62],[0.47,71.02],[71.02,-0.31],[0,0]],"o":[[77.2,-0.34],[0.51,77.2],[-77.2,0.68],[-0.85,-77.2],[0,0],[-71.02,0.93],[0.78,71.02],[71.02,-0.62],[-0.47,-71.02],[0,0],[0,0]]}],"h":1},{"t":58,"s":[{"v":[[-0.27,-140],[140,-0.4],[0.53,140],[-140,0.67],[-0.8,-140],[-0.27,-140],[-0.27,-140],[-0.27,-140],[-0.27,-140],[-0.27,-140],[-0.27,-140]],"i":[[0,0],[-0.22,-77.27],[77.27,-0.29],[0.37,77.27],[-77.27,0.44],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[77.27,-0.15],[0.22,77.27],[-77.27,0.29],[-0.37,-77.27],[0,0],[-0.53,0],[-0.53,0],[-0.53,0],[-0.53,0],[-0.53,0],[-0.53,0]]}],"h":1},{"t":59,"s":[{"v":[[-0.07,-140],[140,-0.1],[0.12,140],[-140,0.14],[-0.16,-140],[-0.07,-140],[-0.07,-140],[-0.07,-140],[-0.07,-140],[-0.07,-140],[-0.07,-140]],"i":[[0,0],[-0.05,-77.31],[77.31,-0.07],[0.08,77.31],[-77.31,0.09],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[77.31,-0.04],[0.05,77.31],[-77.31,0.07],[-0.08,-77.31],[0,0],[-0.09,0],[-0.09,0],[-0.09,0],[-0.09,0],[-0.09,0],[-0.09,0]]}],"h":1},{"t":60,"s":[{"v":[[0,-140],[140,0],[0,140],[-140,0],[0,-140],[0,-140],[0,-140],[0,-140],[0,-140],[0,-140],[0,-140]],"i":[[0,0],[0,-77.32],[77.32,0],[0,77.32],[-77.32,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[77.32,0],[0,77.32],[-77.32,0],[0,-77.32],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":96,"s":[{"v":[[0,-140],[140,0],[0,140],[-140,0],[0,-140],[0,-140],[0,-140],[0,-140],[0,-140],[0,-140],[0,-140]],"i":[[0,0],[0,-77.32],[77.32,0],[0,77.32],[-77.32,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[77.32,0],[0,77.32],[-77.32,0],[0,-77.32],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":97,"s":[{"v":[[0.05,-140],[140,0.05],[-0.05,140],[-140,-0.05],[0.05,-140],[0.05,-140],[0.05,-140],[0.05,-140],[0.05,-140],[0.05,-140],[0.05,-140]],"i":[[0,0],[0.03,-77.32],[77.32,0.03],[-0.03,77.32],[-77.32,-0.03],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[77.32,0.03],[-0.03,77.32],[-77.32,-0.03],[0.03,-77.32],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":98,"s":[{"v":[[0.32,-140],[140,0.25],[-0.18,140],[-140,-0.12],[0.05,-140],[0.32,-140],[0.32,-140],[0.32,-140],[0.32,-140],[0.32,-140],[0.32,-140]],"i":[[0,0],[0.14,-77.29],[77.29,0.1],[-0.07,77.29],[-77.29,-0.03],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[77.29,0.18],[-0.14,77.29],[-77.29,-0.1],[0.07,-77.29],[0,0],[-0.27,0],[-0.27,0],[-0.27,0],[-0.27,0],[-0.27,0],[-0.27,0]]}],"h":1},{"t":99,"s":[{"v":[[1.1,-140],[140,0.88],[-0.66,140],[-140,-0.44],[0.22,-140],[1.1,-140],[1.1,-140],[1.1,-140],[1.1,-140],[1.1,-140],[1.1,-140]],"i":[[0,0],[0.48,-77.23],[77.23,0.36],[-0.24,77.23],[-77.23,-0.12],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[77.23,0.61],[-0.48,77.23],[-77.23,-0.36],[0.24,-77.23],[0,0],[-0.88,0],[-0.88,0],[-0.88,0],[-0.88,0],[-0.88,0],[-0.88,0]]}],"h":1},{"t":100,"s":[{"v":[[2.61,-139.98],[139.98,2.09],[-1.56,139.99],[-140,-1.03],[0.5,-140],[0.46,-128.8],[-128.8,-0.95],[-1.43,128.79],[128.79,1.92],[2.41,-128.78],[2.61,-139.98]],"i":[[0,0],[1.15,-77.11],[77.11,0.86],[-0.57,77.11],[-77.11,-0.28],[0,0],[0.52,-70.94],[-70.94,-0.79],[-1.06,70.94],[70.93,1.32],[0,0]],"o":[[77.1,1.44],[-1.15,77.11],[-77.11,-0.86],[0.57,-77.11],[0,0],[-70.94,-0.26],[-0.52,70.94],[70.94,0.79],[1.06,-70.94],[0,0],[0,0]]}],"h":1},{"t":101,"s":[{"v":[[5.08,-139.91],[139.94,4.07],[-3.06,139.97],[-139.99,-2.05],[1.04,-140],[0.95,-128.8],[-128.79,-1.88],[-2.81,128.77],[128.75,3.74],[4.67,-128.72],[5.08,-139.91]],"i":[[0,0],[2.24,-76.89],[76.91,1.68],[-1.13,76.92],[-76.92,-0.57],[0,0],[1.04,-70.76],[-70.75,-1.55],[-2.06,70.74],[70.72,2.57],[0,0]],"o":[[76.87,2.79],[-2.24,76.89],[-76.91,-1.68],[1.13,-76.92],[0,0],[-70.77,-0.52],[-1.04,70.76],[70.75,1.55],[2.06,-70.74],[0,0],[0,0]]}],"h":1},{"t":102,"s":[{"v":[[8.79,-139.72],[139.82,7.03],[-5.28,139.9],[-139.96,-3.52],[1.76,-139.99],[1.62,-128.79],[-128.76,-3.24],[-4.85,128.71],[128.64,6.47],[8.09,-128.55],[8.79,-139.72]],"i":[[0,0],[3.85,-76.54],[76.58,2.89],[-1.93,76.61],[-76.63,-0.96],[0,0],[1.77,-70.48],[-70.45,-2.66],[-3.54,70.41],[70.36,4.43],[0,0]],"o":[[76.48,4.81],[-3.85,76.54],[-76.58,-2.89],[1.93,-76.61],[0,0],[-70.5,-0.89],[-1.77,70.48],[70.45,2.66],[3.54,-70.41],[0,0],[0,0]]}],"h":1},{"t":103,"s":[{"v":[[13.95,-139.3],[139.55,11.17],[-8.39,139.75],[-139.89,-5.6],[2.8,-139.97],[2.58,-128.77],[-128.7,-5.15],[-7.71,128.57],[128.39,10.28],[12.84,-128.16],[13.95,-139.3]],"i":[[0,0],[6.08,-75.99],[76.09,4.57],[-3.05,76.17],[-76.22,-1.53],[0,0],[2.8,-70.08],[-70.01,-4.2],[-5.6,69.91],[69.78,6.99],[0,0]],"o":[[75.85,7.6],[-6.08,75.99],[-76.09,-4.57],[3.05,-76.17],[0,0],[-70.12,-1.41],[-2.8,70.08],[70.01,4.2],[5.6,-69.91],[0,0],[0,0]]}],"h":1},{"t":104,"s":[{"v":[[20.77,-138.45],[139.01,16.63],[-12.47,139.44],[-139.75,-8.3],[4.13,-139.94],[3.8,-128.74],[-128.57,-7.64],[-11.47,128.29],[127.89,15.3],[19.1,-127.38],[20.77,-138.45]],"i":[[0,0],[8.99,-75.16],[75.39,6.74],[-4.49,75.56],[-75.66,-2.23],[0,0],[4.13,-69.52],[-69.36,-6.2],[-8.27,69.14],[68.87,10.33],[0,0]],"o":[[74.86,11.23],[-8.99,75.16],[-75.39,-6.74],[4.49,-75.56],[0,0],[-69.61,-2.05],[-4.13,69.52],[69.36,6.2],[8.27,-69.14],[0,0],[0,0]]}],"h":1},{"t":105,"s":[{"v":[[29.47,-136.86],[137.99,23.64],[-17.76,138.87],[-139.5,-11.86],[5.94,-139.87],[5.46,-128.68],[-128.34,-10.91],[-16.34,127.76],[126.95,21.75],[27.11,-125.91],[29.47,-136.86]],"i":[[0,0],[12.66,-73.93],[74.4,9.52],[-6.36,74.74],[-74.94,-3.18],[0,0],[5.85,-68.76],[-68.45,-8.76],[-11.65,68.02],[67.46,14.52],[0,0]],"o":[[73.33,15.79],[-12.66,73.93],[-74.4,-9.52],[6.36,-74.74],[0,0],[-68.95,-2.93],[-5.85,68.76],[68.45,8.76],[11.65,-68.02],[0,0],[0,0]]}],"h":1},{"t":106,"s":[{"v":[[40.16,-134.12],[136.22,32.3],[-24.33,137.87],[-139.05,-16.29],[8.18,-139.76],[7.53,-128.58],[-127.93,-14.98],[-22.39,126.84],[125.32,29.72],[36.95,-123.39],[40.16,-134.12]],"i":[[0,0],[17.11,-72.16],[73.03,12.89],[-8.63,73.66],[-74.03,-4.33],[0,0],[7.94,-67.77],[-67.19,-11.86],[-15.74,66.39],[65.36,19.57],[0,0]],"o":[[71.04,21.27],[-17.11,72.16],[-73.03,-12.89],[8.63,-73.66],[0,0],[-68.11,-3.99],[-7.94,67.77],[67.19,11.86],[15.74,-66.39],[0,0],[0,0]]}],"h":1},{"t":107,"s":[{"v":[[52.85,-129.64],[133.34,42.66],[-32.22,136.24],[-138.33,-21.58],[10.82,-139.58],[9.95,-128.41],[-127.26,-19.86],[-29.64,125.34],[122.67,39.25],[48.62,-119.27],[52.85,-129.64]],"i":[[0,0],[22.28,-69.64],[71.16,16.83],[-11.27,72.24],[-72.9,-5.65],[0,0],[10.37,-66.47],[-65.46,-15.48],[-20.5,64.07],[62.29,25.4],[0,0]],"o":[[67.71,27.6],[-22.28,69.64],[-71.16,-16.83],[11.27,-72.24],[0,0],[-67.07,-5.2],[-10.37,66.47],[65.46,15.48],[20.5,-64.07],[0,0],[0,0]]}],"h":1},{"t":108,"s":[{"v":[[67.45,-122.68],[128.83,54.79],[-41.59,133.68],[-137.18,-27.96],[14.05,-139.29],[12.93,-128.15],[-126.21,-25.72],[-38.26,122.99],[118.53,50.41],[62.05,-112.87],[67.45,-122.68]],"i":[[0,0],[28.13,-66.15],[68.63,21.35],[-14.35,70.43],[-71.52,-7.21],[0,0],[13.21,-64.8],[-63.14,-19.64],[-25.88,60.85],[57.95,31.86],[0,0]],"o":[[62.99,34.63],[-28.13,66.15],[-68.63,-21.35],[14.35,-70.43],[0,0],[-65.79,-6.64],[-13.21,64.8],[63.14,19.64],[25.88,-60.85],[0,0],[0,0]]}],"h":1},{"t":109,"s":[{"v":[[83.51,-112.37],[122.1,68.5],[-52.37,129.84],[-135.45,-35.39],[17.83,-138.86],[16.4,-127.75],[-124.62,-32.56],[-48.18,119.45],[112.33,63.02],[76.83,-103.38],[83.51,-112.37]],"i":[[0,0],[34.46,-61.41],[65.31,26.34],[-17.8,68.13],[-69.84,-8.97],[0,0],[16.38,-62.68],[-60.08,-24.24],[-31.7,56.5],[52,38.64],[0,0]],"o":[[56.52,42],[-34.46,61.41],[-65.31,-26.34],[17.8,-68.13],[0,0],[-64.26,-8.25],[-16.38,62.68],[60.08,24.24],[31.7,-56.5],[0,0],[0,0]]}],"h":1},{"t":110,"s":[{"v":[[100.25,-97.73],[112.41,83.44],[-64.52,124.25],[-132.92,-43.95],[22.27,-138.22],[20.49,-127.16],[-122.29,-40.44],[-59.36,114.31],[103.42,76.77],[92.23,-89.91],[100.25,-97.73]],"i":[[0,0],[40.97,-55.19],[61,31.68],[-21.58,65.26],[-67.86,-10.93],[0,0],[19.85,-60.04],[-56.12,-29.14],[-37.69,50.77],[44.14,45.28],[0,0]],"o":[[47.98,49.22],[-40.97,55.19],[-61,-31.68],[21.58,-65.26],[0,0],[-62.43,-10.06],[-19.85,60.04],[56.12,29.14],[37.69,-50.77],[0,0],[0,0]]}],"h":1},{"t":111,"s":[{"v":[[116.41,-77.78],[98.99,98.99],[-77.78,116.41],[-129.34,-53.58],[27.31,-137.31],[25.13,-126.33],[-119,-49.29],[-71.56,107.09],[91.08,91.08],[107.09,-71.56],[116.41,-77.78]],"i":[[0,0],[47.23,-47.23],[55.53,37.11],[-25.56,61.71],[-65.51,-13.03],[0,0],[23.51,-56.77],[-51.09,-34.14],[-43.45,43.45],[34.14,51.09],[0,0]],"o":[[37.11,55.53],[-47.23,47.23],[-55.53,-37.11],[25.56,-61.71],[0,0],[-60.27,-11.99],[-23.51,56.77],[51.09,34.14],[43.45,-43.45],[0,0],[0,0]]}],"h":1},{"t":112,"s":[{"v":[[130.05,-51.83],[81.07,114.14],[-91.78,105.72],[-124.39,-64.23],[33.06,-136.04],[30.41,-125.16],[-114.44,-59.1],[-84.44,97.26],[74.58,105.01],[119.65,-47.69],[130.05,-51.83]],"i":[[0,0],[52.66,-37.4],[48.77,42.34],[-29.64,57.39],[-62.76,-15.25],[0,0],[27.26,-52.8],[-44.87,-38.96],[-48.45,34.41],[22,55.2],[0,0]],"o":[[23.91,60],[-52.66,37.4],[-48.77,-42.34],[29.64,-57.39],[0,0],[-57.74,-14.03],[-27.26,52.8],[44.87,38.96],[48.45,-34.41],[0,0],[0,0]]}],"h":1},{"t":113,"s":[{"v":[[138.6,-19.77],[58.06,127.39],[-105.85,91.63],[-117.76,-75.72],[39.43,-134.33],[36.28,-123.58],[-108.34,-69.66],[-97.38,84.3],[53.41,117.2],[127.51,-18.19],[138.6,-19.77]],"i":[[0,0],[56.52,-25.76],[40.65,46.96],[-33.59,52.25],[-59.6,-17.5],[0,0],[30.91,-48.07],[-37.4,-43.21],[-52,23.7],[8.07,56.57],[0,0]],"o":[[8.77,61.49],[-56.52,25.76],[-40.65,-46.96],[33.59,-52.25],[0,0],[-54.83,-16.1],[-30.91,48.07],[37.4,43.21],[52,-23.7],[0,0],[0,0]]}],"h":1},{"t":114,"s":[{"v":[[138.9,17.55],[29.68,136.82],[-119.14,73.52],[-108.98,-87.88],[46.59,-132.02],[42.87,-121.46],[-100.27,-80.85],[-109.61,67.64],[27.31,125.87],[127.78,16.14],[138.9,17.55]],"i":[[0,0],[58.01,-12.58],[31.17,50.51],[-37.26,46.21],[-55.97,-19.76],[0,0],[34.28,-42.51],[-28.68,-46.47],[-53.37,11.58],[-6.84,54.18],[0,0]],"o":[[-7.44,58.89],[-58.01,12.58],[-31.17,-50.51],[37.26,-46.21],[0,0],[-51.5,-18.17],[-34.28,42.51],[28.68,46.47],[53.37,-11.58],[0,0],[0,0]]}],"h":1},{"t":115,"s":[{"v":[[127.58,57.66],[-56.59,128.05],[-128.52,-55.51],[54.43,-128.98],[50.08,-118.67],[-118.24,-51.07],[-52.06,117.81],[117.37,53.04],[127.58,57.66],[127.58,57.66],[127.58,57.66]],"i":[[0,0],[70.3,31.07],[-30.48,70.56],[-70.81,-29.88],[0,0],[28.04,-64.92],[-64.68,-28.58],[-29.12,64.44],[0,0],[0,0],[0,0]],"o":[[-31.65,70.04],[-70.3,-31.07],[30.48,-70.56],[0,0],[-65.15,-27.49],[-28.04,64.92],[64.68,28.58],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":116,"s":[{"v":[[101.84,96.07],[-85.76,110.66],[-118.44,-74.64],[62.82,-125.11],[57.8,-115.1],[-108.97,-68.67],[-78.9,101.81],[93.69,88.38],[101.84,96.07],[101.84,96.07],[101.84,96.07]],"i":[[0,0],[56.97,44.15],[-38.42,60.97],[-64.41,-32.34],[0,0],[35.35,-56.1],[-52.41,-40.61],[-45.5,48.23],[0,0],[0,0],[0,0]],"o":[[-49.45,52.42],[-56.97,-44.15],[38.42,-60.97],[0,0],[-59.25,-29.75],[-35.35,56.1],[52.41,40.61],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":117,"s":[{"v":[[60.6,126.2],[-112.09,83.88],[-103.99,-93.73],[71.83,-120.17],[66.09,-110.55],[-95.67,-86.23],[-103.12,77.17],[55.75,116.11],[60.6,126.2],[60.6,126.2],[60.6,126.2]],"i":[[0,0],[40.07,53.54],[-44.77,49.67],[-57.4,-34.31],[0,0],[41.19,-45.7],[-36.86,-49.26],[-55.46,26.63],[0,0],[0,0],[0,0]],"o":[[-60.28,28.95],[-40.07,-53.54],[44.77,-49.67],[0,0],[-52.81,-31.57],[-41.19,45.7],[36.86,49.26],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":118,"s":[{"v":[[6.18,139.86],[-131.68,47.56],[-84.62,-111.53],[81.27,-114],[74.77,-104.88],[-77.85,-102.61],[-121.14,43.75],[5.69,128.67],[6.18,139.86],[6.18,139.86],[6.18,139.86]],"i":[[0,0],[20.81,57.61],[-48.8,37.02],[-49.88,-35.56],[0,0],[44.9,-34.06],[-19.14,-53.01],[-56.3,2.49],[0,0],[0,0],[0,0]],"o":[[-61.2,2.7],[-20.81,-57.61],[48.8,-37.02],[0,0],[-45.89,-32.72],[-44.9,34.06],[19.14,53.01],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":119,"s":[{"v":[[-54.21,129.08],[-139.96,3.16],[-59.97,-126.5],[91.04,-106.36],[83.76,-97.85],[-55.17,-116.38],[-128.77,2.9],[-49.87,118.75],[-54.21,129.08],[-54.21,129.08],[-54.21,129.08]],"i":[[0,0],[1.25,55.22],[-49.91,23.66],[-41.96,-35.92],[0,0],[45.91,-21.77],[-1.15,-50.8],[-46.85,-19.67],[0,0],[0,0],[0,0]],"o":[[-50.92,-21.38],[-1.25,-55.22],[49.91,-23.66],[0,0],[-38.6,-33.04],[-45.91,21.77],[1.15,50.8],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":120,"s":[{"v":[[-107.87,89.24],[-93.24,-104.43],[100.84,-97.11],[92.78,-89.34],[-85.78,-96.08],[-99.24,82.1],[-107.87,89.24],[-107.87,89.24],[-107.87,89.24],[-107.87,89.24],[-107.87,89.24]],"i":[[0,0],[-56.14,50.13],[-52.21,-54.22],[0,0],[51.65,-46.12],[-44.14,-53.35],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-47.98,-57.99],[56.14,-50.13],[0,0],[-48.03,-49.88],[-51.65,46.12],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":121,"s":[{"v":[[-138.05,23.3],[-56.38,-128.15],[110.45,-86.02],[101.62,-79.14],[-51.87,-117.9],[-127,21.44],[-138.05,23.3],[-138.05,23.3],[-138.05,23.3],[-138.05,23.3],[-138.05,23.3]],"i":[[0,0],[-58.69,25.82],[-39.4,-50.59],[0,0],[54,-23.76],[-9.82,-58.17],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-10.67,-63.23],[58.69,-25.82],[0,0],[-36.25,-46.54],[-54,23.76],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":122,"s":[{"v":[[-128.94,-54.54],[-10.38,-139.62],[119.46,-73],[109.9,-67.16],[-9.55,-128.45],[-118.62,-50.18],[-128.94,-54.54],[-128.94,-54.54],[-128.94,-54.54],[-128.94,-54.54],[-128.94,-54.54]],"i":[[0,0],[-52.34,3.89],[-27.37,-44.79],[0,0],[48.16,-3.58],[18.81,-44.47],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[20.45,-48.34],[52.34,-3.89],[0,0],[-25.18,-41.2],[-48.16,3.58],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":123,"s":[{"v":[[-74.09,-118.79],[40.53,-134],[127.51,-57.81],[117.31,-53.19],[37.29,-123.28],[-68.16,-109.29],[-74.09,-118.79],[-74.09,-118.79],[-74.09,-118.79],[-74.09,-118.79],[-74.09,-118.79]],"i":[[0,0],[-38.61,-11.68],[-16.66,-36.74],[0,0],[35.52,10.75],[31.49,-19.64],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[34.23,-21.35],[38.61,11.68],[0,0],[-15.33,-33.8],[-35.52,-10.75],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":124,"s":[{"v":[[14.32,-139.27],[134.02,-40.49],[123.3,-37.25],[13.17,-128.12],[14.32,-139.27],[14.32,-139.27],[14.32,-139.27],[14.32,-139.27],[14.32,-139.27],[14.32,-139.27],[14.32,-139.27]],"i":[[0,0],[-16.33,-54.05],[0,0],[51.68,5.31],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[56.17,5.77],[0,0],[-15.02,-49.73],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":125,"s":[{"v":[[101.52,-96.41],[138.39,-21.2],[127.32,-19.5],[93.4,-88.69],[101.52,-96.41],[101.52,-96.41],[101.52,-96.41],[101.52,-96.41],[101.52,-96.41],[101.52,-96.41],[101.52,-96.41]],"i":[[0,0],[-4.33,-28.24],[0,0],[18.1,19.06],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[19.68,20.72],[0,0],[-3.98,-25.99],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":126,"s":[{"v":[[140,0],[140,0],[128.8,0],[128.8,0],[140,0],[140,0],[140,0],[140,0],[140,0],[140,0],[140,0]],"i":[[0,0],[-140,0],[0,0],[-128.8,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-140,0],[0,0],[-128.8,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1}]}},{"ty":"sh","hd":false,"ix":1,"ks":{"a":1,"k":[{"t":0,"s":[{"v":[[0,-128.8],[-128.8,0],[0,128.8],[128.8,0],[0,-128.8],[0,-128.8],[0,-128.8],[0,-128.8],[0,-128.8],[0,-128.8],[0,-128.8]],"i":[[0,0],[0,-71.13],[-71.13,0],[0,71.13],[71.13,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-71.13,0],[0,71.13],[71.13,0],[0,-71.13],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":0,"s":[{"v":[[0,140],[0,140],[0,140],[0,140],[0,140],[0,140],[0,140],[0,140],[0,140],[0,140],[0,140]],"i":[[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]]}],"h":1},{"t":1,"s":[{"v":[[-3.54,139.96],[-3.54,139.96],[-3.54,139.96],[-3.54,139.96],[-3.54,139.96],[-3.54,139.96],[-3.54,139.96],[-3.54,139.96],[-3.54,139.96],[-3.54,139.96],[-3.54,139.96]],"i":[[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]]}],"h":1},{"t":2,"s":[{"v":[[-8.33,139.75],[-8.33,139.75],[-8.33,139.75],[-8.33,139.75],[-8.33,139.75],[-8.33,139.75],[-8.33,139.75],[-8.33,139.75],[-8.33,139.75],[-8.33,139.75],[-8.33,139.75]],"i":[[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]]}],"h":1},{"t":3,"s":[{"v":[[-14.46,139.25],[-14.46,139.25],[-14.46,139.25],[-14.46,139.25],[-14.46,139.25],[-14.46,139.25],[-14.46,139.25],[-14.46,139.25],[-14.46,139.25],[-14.46,139.25],[-14.46,139.25]],"i":[[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]]}],"h":1},{"t":4,"s":[{"v":[[-22,138.26],[-22,138.26],[-22,138.26],[-22,138.26],[-22,138.26],[-22,138.26],[-22,138.26],[-22,138.26],[-22,138.26],[-22,138.26],[-22,138.26]],"i":[[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]]}],"h":1},{"t":5,"s":[{"v":[[-30.9,136.55],[-30.9,136.55],[-30.9,136.55],[-30.9,136.55],[-30.9,136.55],[-30.9,136.55],[-30.9,136.55],[-30.9,136.55],[-30.9,136.55],[-30.9,136.55],[-30.9,136.55]],"i":[[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]]}],"h":1},{"t":6,"s":[{"v":[[-41.07,133.84],[-41.07,133.84],[-41.07,133.84],[-41.07,133.84],[-41.07,133.84],[-41.07,133.84],[-41.07,133.84],[-41.07,133.84],[-41.07,133.84],[-41.07,133.84],[-41.07,133.84]],"i":[[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]]}],"h":1},{"t":7,"s":[{"v":[[-52.38,129.83],[-52.38,129.83],[-52.38,129.83],[-52.38,129.83],[-52.38,129.83],[-52.38,129.83],[-52.38,129.83],[-52.38,129.83],[-52.38,129.83],[-52.38,129.83],[-52.38,129.83]],"i":[[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]]}],"h":1},{"t":8,"s":[{"v":[[-64.51,124.25],[-64.51,124.25],[-64.51,124.25],[-64.51,124.25],[-64.51,124.25],[-64.51,124.25],[-64.51,124.25],[-64.51,124.25],[-64.51,124.25],[-64.51,124.25],[-64.51,124.25]],"i":[[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]]}],"h":1},{"t":9,"s":[{"v":[[-77.03,116.91],[-77.03,116.91],[-77.03,116.91],[-77.03,116.91],[-77.03,116.91],[-77.03,116.91],[-77.03,116.91],[-77.03,116.91],[-77.03,116.91],[-77.03,116.91],[-77.03,116.91]],"i":[[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]]}],"h":1},{"t":10,"s":[{"v":[[-89.47,107.68],[-89.47,107.68],[-89.47,107.68],[-89.47,107.68],[-89.47,107.68],[-89.47,107.68],[-89.47,107.68],[-89.47,107.68],[-89.47,107.68],[-89.47,107.68],[-89.47,107.68]],"i":[[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]]}],"h":1},{"t":11,"s":[{"v":[[-101.3,96.64],[-101.3,96.64],[-101.3,96.64],[-101.3,96.64],[-101.3,96.64],[-101.3,96.64],[-101.3,96.64],[-101.3,96.64],[-101.3,96.64],[-101.3,96.64],[-101.3,96.64]],"i":[[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]]}],"h":1},{"t":12,"s":[{"v":[[-112.01,83.98],[-112.01,83.98],[-112.01,83.98],[-112.01,83.98],[-112.01,83.98],[-112.01,83.98],[-112.01,83.98],[-112.01,83.98],[-112.01,83.98],[-112.01,83.98],[-112.01,83.98]],"i":[[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]]}],"h":1},{"t":13,"s":[{"v":[[-121.24,70],[-121.24,70],[-121.24,70],[-121.24,70],[-121.24,70],[-121.24,70],[-121.24,70],[-121.24,70],[-121.24,70],[-121.24,70],[-121.24,70]],"i":[[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]]}],"h":1},{"t":14,"s":[{"v":[[-128.71,55.08],[-128.71,55.08],[-128.71,55.08],[-128.71,55.08],[-128.71,55.08],[-128.71,55.08],[-128.71,55.08],[-128.71,55.08],[-128.71,55.08],[-128.71,55.08],[-128.71,55.08]],"i":[[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]]}],"h":1},{"t":15,"s":[{"v":[[-134.26,39.69],[-134.26,39.69],[-134.26,39.69],[-134.26,39.69],[-134.26,39.69],[-134.26,39.69],[-134.26,39.69],[-134.26,39.69],[-134.26,39.69],[-134.26,39.69],[-134.26,39.69]],"i":[[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]]}],"h":1},{"t":16,"s":[{"v":[[-137.9,24.17],[-137.9,24.17],[-137.9,24.17],[-137.9,24.17],[-137.9,24.17],[-137.9,24.17],[-137.9,24.17],[-137.9,24.17],[-137.9,24.17],[-137.9,24.17],[-137.9,24.17]],"i":[[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]]}],"h":1},{"t":17,"s":[{"v":[[-139.72,8.91],[-139.72,8.91],[-139.72,8.91],[-139.72,8.91],[-139.72,8.91],[-139.72,8.91],[-139.72,8.91],[-139.72,8.91],[-139.72,8.91],[-139.72,8.91],[-139.72,8.91]],"i":[[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]]}],"h":1},{"t":18,"s":[{"v":[[-139.88,-5.86],[-139.88,-5.86],[-139.88,-5.86],[-139.88,-5.86],[-139.88,-5.86],[-139.88,-5.86],[-139.88,-5.86],[-139.88,-5.86],[-139.88,-5.86],[-139.88,-5.86],[-139.88,-5.86]],"i":[[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]]}],"h":1},{"t":19,"s":[{"v":[[-138.58,-19.9],[-138.58,-19.9],[-138.58,-19.9],[-138.58,-19.9],[-138.58,-19.9],[-138.58,-19.9],[-138.58,-19.9],[-138.58,-19.9],[-138.58,-19.9],[-138.58,-19.9],[-138.58,-19.9]],"i":[[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]]}],"h":1},{"t":20,"s":[{"v":[[-136.04,-33.06],[-136.04,-33.06],[-136.04,-33.06],[-136.04,-33.06],[-136.04,-33.06],[-136.04,-33.06],[-136.04,-33.06],[-136.04,-33.06],[-136.04,-33.06],[-136.04,-33.06],[-136.04,-33.06]],"i":[[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]]}],"h":1},{"t":21,"s":[{"v":[[-132.48,-45.26],[-132.48,-45.26],[-132.48,-45.26],[-132.48,-45.26],[-132.48,-45.26],[-132.48,-45.26],[-132.48,-45.26],[-132.48,-45.26],[-132.48,-45.26],[-132.48,-45.26],[-132.48,-45.26]],"i":[[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]]}],"h":1},{"t":22,"s":[{"v":[[-128.1,-56.47],[-128.1,-56.47],[-128.1,-56.47],[-128.1,-56.47],[-128.1,-56.47],[-128.1,-56.47],[-128.1,-56.47],[-128.1,-56.47],[-128.1,-56.47],[-128.1,-56.47],[-128.1,-56.47]],"i":[[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]]}],"h":1},{"t":23,"s":[{"v":[[-123.08,-66.72],[-123.08,-66.72],[-123.08,-66.72],[-123.08,-66.72],[-123.08,-66.72],[-123.08,-66.72],[-123.08,-66.72],[-123.08,-66.72],[-123.08,-66.72],[-123.08,-66.72],[-123.08,-66.72]],"i":[[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]]}],"h":1},{"t":24,"s":[{"v":[[-117.6,-75.96],[-117.6,-75.96],[-117.6,-75.96],[-117.6,-75.96],[-117.6,-75.96],[-117.6,-75.96],[-117.6,-75.96],[-117.6,-75.96],[-117.6,-75.96],[-117.6,-75.96],[-117.6,-75.96]],"i":[[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]]}],"h":1},{"t":25,"s":[{"v":[[-111.79,-84.27],[-111.79,-84.27],[-111.79,-84.27],[-111.79,-84.27],[-111.79,-84.27],[-111.79,-84.27],[-111.79,-84.27],[-111.79,-84.27],[-111.79,-84.27],[-111.79,-84.27],[-111.79,-84.27]],"i":[[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]]}],"h":1},{"t":26,"s":[{"v":[[-105.79,-91.7],[-105.79,-91.7],[-105.79,-91.7],[-105.79,-91.7],[-105.79,-91.7],[-105.79,-91.7],[-105.79,-91.7],[-105.79,-91.7],[-105.79,-91.7],[-105.79,-91.7],[-105.79,-91.7]],"i":[[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]]}],"h":1},{"t":27,"s":[{"v":[[-99.67,-98.32],[-99.67,-98.32],[-99.67,-98.32],[-99.67,-98.32],[-99.67,-98.32],[-99.67,-98.32],[-99.67,-98.32],[-99.67,-98.32],[-99.67,-98.32],[-99.67,-98.32],[-99.67,-98.32]],"i":[[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]]}],"h":1},{"t":28,"s":[{"v":[[-93.51,-104.19],[-93.51,-104.19],[-93.51,-104.19],[-93.51,-104.19],[-93.51,-104.19],[-93.51,-104.19],[-93.51,-104.19],[-93.51,-104.19],[-93.51,-104.19],[-93.51,-104.19],[-93.51,-104.19]],"i":[[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]]}],"h":1},{"t":29,"s":[{"v":[[-87.42,-109.35],[-87.42,-109.35],[-87.42,-109.35],[-87.42,-109.35],[-87.42,-109.35],[-87.42,-109.35],[-87.42,-109.35],[-87.42,-109.35],[-87.42,-109.35],[-87.42,-109.35],[-87.42,-109.35]],"i":[[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]]}],"h":1},{"t":30,"s":[{"v":[[-81.44,-113.88],[-81.44,-113.88],[-81.44,-113.88],[-81.44,-113.88],[-81.44,-113.88],[-81.44,-113.88],[-81.44,-113.88],[-81.44,-113.88],[-81.44,-113.88],[-81.44,-113.88],[-81.44,-113.88]],"i":[[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]]}],"h":1},{"t":31,"s":[{"v":[[-75.59,-117.84],[-75.59,-117.84],[-75.59,-117.84],[-75.59,-117.84],[-75.59,-117.84],[-75.59,-117.84],[-75.59,-117.84],[-75.59,-117.84],[-75.59,-117.84],[-75.59,-117.84],[-75.59,-117.84]],"i":[[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]]}],"h":1},{"t":32,"s":[{"v":[[-69.92,-121.29],[-69.92,-121.29],[-69.92,-121.29],[-69.92,-121.29],[-69.92,-121.29],[-69.92,-121.29],[-69.92,-121.29],[-69.92,-121.29],[-69.92,-121.29],[-69.92,-121.29],[-69.92,-121.29]],"i":[[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]]}],"h":1},{"t":33,"s":[{"v":[[-64.43,-124.29],[-64.43,-124.29],[-64.43,-124.29],[-64.43,-124.29],[-64.43,-124.29],[-64.43,-124.29],[-64.43,-124.29],[-64.43,-124.29],[-64.43,-124.29],[-64.43,-124.29],[-64.43,-124.29]],"i":[[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]]}],"h":1},{"t":34,"s":[{"v":[[-59.19,-126.87],[-59.19,-126.87],[-59.19,-126.87],[-59.19,-126.87],[-59.19,-126.87],[-59.19,-126.87],[-59.19,-126.87],[-59.19,-126.87],[-59.19,-126.87],[-59.19,-126.87],[-59.19,-126.87]],"i":[[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]]}],"h":1},{"t":35,"s":[{"v":[[-54.16,-129.1],[-54.16,-129.1],[-54.16,-129.1],[-54.16,-129.1],[-54.16,-129.1],[-54.16,-129.1],[-54.16,-129.1],[-54.16,-129.1],[-54.16,-129.1],[-54.16,-129.1],[-54.16,-129.1]],"i":[[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]]}],"h":1},{"t":36,"s":[{"v":[[-49.4,-131],[-49.4,-131],[-49.4,-131],[-49.4,-131],[-49.4,-131],[-49.4,-131],[-49.4,-131],[-49.4,-131],[-49.4,-131],[-49.4,-131],[-49.4,-131]],"i":[[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]]}],"h":1},{"t":37,"s":[{"v":[[-44.86,-132.62],[-44.86,-132.62],[-44.86,-132.62],[-44.86,-132.62],[-44.86,-132.62],[-44.86,-132.62],[-44.86,-132.62],[-44.86,-132.62],[-44.86,-132.62],[-44.86,-132.62],[-44.86,-132.62]],"i":[[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]]}],"h":1},{"t":38,"s":[{"v":[[-40.58,-133.99],[-40.58,-133.99],[-40.58,-133.99],[-40.58,-133.99],[-40.58,-133.99],[-40.58,-133.99],[-40.58,-133.99],[-40.58,-133.99],[-40.58,-133.99],[-40.58,-133.99],[-40.58,-133.99]],"i":[[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]]}],"h":1},{"t":39,"s":[{"v":[[-36.54,-135.15],[-36.54,-135.15],[-36.54,-135.15],[-36.54,-135.15],[-36.54,-135.15],[-36.54,-135.15],[-36.54,-135.15],[-36.54,-135.15],[-36.54,-135.15],[-36.54,-135.15],[-36.54,-135.15]],"i":[[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]]}],"h":1},{"t":40,"s":[{"v":[[-32.75,-136.11],[-32.75,-136.11],[-32.75,-136.11],[-32.75,-136.11],[-32.75,-136.11],[-32.75,-136.11],[-32.75,-136.11],[-32.75,-136.11],[-32.75,-136.11],[-32.75,-136.11],[-32.75,-136.11]],"i":[[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]]}],"h":1},{"t":41,"s":[{"v":[[-29.2,-136.92],[-29.2,-136.92],[-29.2,-136.92],[-29.2,-136.92],[-29.2,-136.92],[-29.2,-136.92],[-29.2,-136.92],[-29.2,-136.92],[-29.2,-136.92],[-29.2,-136.92],[-29.2,-136.92]],"i":[[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]]}],"h":1},{"t":42,"s":[{"v":[[-25.9,-137.58],[-25.9,-137.58],[-25.9,-137.58],[-25.9,-137.58],[-25.9,-137.58],[-25.9,-137.58],[-25.9,-137.58],[-25.9,-137.58],[-25.9,-137.58],[-25.9,-137.58],[-25.9,-137.58]],"i":[[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]]}],"h":1},{"t":43,"s":[{"v":[[-22.82,-138.13],[-22.82,-138.13],[-22.82,-138.13],[-22.82,-138.13],[-22.82,-138.13],[-22.82,-138.13],[-22.82,-138.13],[-22.82,-138.13],[-22.82,-138.13],[-22.82,-138.13],[-22.82,-138.13]],"i":[[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]]}],"h":1},{"t":44,"s":[{"v":[[-19.97,-138.57],[-19.97,-138.57],[-19.97,-138.57],[-19.97,-138.57],[-19.97,-138.57],[-19.97,-138.57],[-19.97,-138.57],[-19.97,-138.57],[-19.97,-138.57],[-19.97,-138.57],[-19.97,-138.57]],"i":[[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]]}],"h":1},{"t":45,"s":[{"v":[[-17.35,-138.92],[-17.35,-138.92],[-17.35,-138.92],[-17.35,-138.92],[-17.35,-138.92],[-17.35,-138.92],[-17.35,-138.92],[-17.35,-138.92],[-17.35,-138.92],[-17.35,-138.92],[-17.35,-138.92]],"i":[[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]]}],"h":1},{"t":46,"s":[{"v":[[-14.93,-139.2],[-14.93,-139.2],[-14.93,-139.2],[-14.93,-139.2],[-14.93,-139.2],[-14.93,-139.2],[-14.93,-139.2],[-14.93,-139.2],[-14.93,-139.2],[-14.93,-139.2],[-14.93,-139.2]],"i":[[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]]}],"h":1},{"t":47,"s":[{"v":[[-12.71,-139.42],[-12.71,-139.42],[-12.71,-139.42],[-12.71,-139.42],[-12.71,-139.42],[-12.71,-139.42],[-12.71,-139.42],[-12.71,-139.42],[-12.71,-139.42],[-12.71,-139.42],[-12.71,-139.42]],"i":[[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]]}],"h":1},{"t":48,"s":[{"v":[[-10.72,-139.59],[-10.72,-139.59],[-10.72,-139.59],[-10.72,-139.59],[-10.72,-139.59],[-10.72,-139.59],[-10.72,-139.59],[-10.72,-139.59],[-10.72,-139.59],[-10.72,-139.59],[-10.72,-139.59]],"i":[[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]]}],"h":1},{"t":49,"s":[{"v":[[-8.89,-139.72],[-8.89,-139.72],[-8.89,-139.72],[-8.89,-139.72],[-8.89,-139.72],[-8.89,-139.72],[-8.89,-139.72],[-8.89,-139.72],[-8.89,-139.72],[-8.89,-139.72],[-8.89,-139.72]],"i":[[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]]}],"h":1},{"t":50,"s":[{"v":[[-7.25,-139.81],[-7.25,-139.81],[-7.25,-139.81],[-7.25,-139.81],[-7.25,-139.81],[-7.25,-139.81],[-7.25,-139.81],[-7.25,-139.81],[-7.25,-139.81],[-7.25,-139.81],[-7.25,-139.81]],"i":[[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]]}],"h":1},{"t":51,"s":[{"v":[[-5.81,-139.88],[-5.81,-139.88],[-5.81,-139.88],[-5.81,-139.88],[-5.81,-139.88],[-5.81,-139.88],[-5.81,-139.88],[-5.81,-139.88],[-5.81,-139.88],[-5.81,-139.88],[-5.81,-139.88]],"i":[[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]]}],"h":1},{"t":52,"s":[{"v":[[-4.54,-139.93],[-4.54,-139.93],[-4.54,-139.93],[-4.54,-139.93],[-4.54,-139.93],[-4.54,-139.93],[-4.54,-139.93],[-4.54,-139.93],[-4.54,-139.93],[-4.54,-139.93],[-4.54,-139.93]],"i":[[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]]}],"h":1},{"t":53,"s":[{"v":[[-3.44,-139.96],[-3.44,-139.96],[-3.44,-139.96],[-3.44,-139.96],[-3.44,-139.96],[-3.44,-139.96],[-3.44,-139.96],[-3.44,-139.96],[-3.44,-139.96],[-3.44,-139.96],[-3.44,-139.96]],"i":[[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]]}],"h":1},{"t":54,"s":[{"v":[[-2.49,-139.98],[-2.49,-139.98],[-2.49,-139.98],[-2.49,-139.98],[-2.49,-139.98],[-2.49,-139.98],[-2.49,-139.98],[-2.49,-139.98],[-2.49,-139.98],[-2.49,-139.98],[-2.49,-139.98]],"i":[[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]]}],"h":1},{"t":55,"s":[{"v":[[-1.71,-139.99],[-1.71,-139.99],[-1.71,-139.99],[-1.71,-139.99],[-1.71,-139.99],[-1.71,-139.99],[-1.71,-139.99],[-1.71,-139.99],[-1.71,-139.99],[-1.71,-139.99],[-1.71,-139.99]],"i":[[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]]}],"h":1},{"t":56,"s":[{"v":[[-1.08,-140],[-1.08,-140],[-1.08,-140],[-1.08,-140],[-1.08,-140],[-1.08,-140],[-1.08,-140],[-1.08,-140],[-1.08,-140],[-1.08,-140],[-1.08,-140]],"i":[[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]]}],"h":1},{"t":57,"s":[{"v":[[-0.61,-140],[-0.61,-140],[-0.61,-140],[-0.61,-140],[-0.61,-140],[-0.61,-140],[-0.61,-140],[-0.61,-140],[-0.61,-140],[-0.61,-140],[-0.61,-140]],"i":[[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]]}],"h":1},{"t":58,"s":[{"v":[[-0.74,-128.8],[-128.8,0.61],[0.49,128.8],[128.8,-0.37],[-0.25,-128.8],[-0.74,-128.8],[-0.74,-128.8],[-0.74,-128.8],[-0.74,-128.8],[-0.74,-128.8],[-0.74,-128.8]],"i":[[0,0],[-0.34,-71.09],[-71.09,0.27],[0.2,71.09],[71.09,-0.14],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-71.09,0.41],[0.34,71.09],[71.09,-0.27],[-0.2,-71.09],[0,0],[0.49,0],[0.49,0],[0.49,0],[0.49,0],[0.49,0],[0.49,0]]}],"h":1},{"t":59,"s":[{"v":[[-0.15,-128.8],[-128.8,0.13],[0.11,128.8],[128.8,-0.09],[-0.07,-128.8],[-0.15,-128.8],[-0.15,-128.8],[-0.15,-128.8],[-0.15,-128.8],[-0.15,-128.8],[-0.15,-128.8]],"i":[[0,0],[-0.07,-71.13],[-71.13,0.06],[0.05,71.13],[71.13,-0.04],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-71.13,0.08],[0.07,71.13],[71.13,-0.06],[-0.05,-71.13],[0,0],[0.08,0],[0.08,0],[0.08,0],[0.08,0],[0.08,0],[0.08,0]]}],"h":1},{"t":60,"s":[{"v":[[0,-128.8],[-128.8,0],[0,128.8],[128.8,0],[0,-128.8],[0,-128.8],[0,-128.8],[0,-128.8],[0,-128.8],[0,-128.8],[0,-128.8]],"i":[[0,0],[0,-71.13],[-71.13,0],[0,71.13],[71.13,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-71.13,0],[0,71.13],[71.13,0],[0,-71.13],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":96,"s":[{"v":[[0,-128.8],[-128.8,0],[0,128.8],[128.8,0],[0,-128.8],[0,-128.8],[0,-128.8],[0,-128.8],[0,-128.8],[0,-128.8],[0,-128.8]],"i":[[0,0],[0,-71.13],[-71.13,0],[0,71.13],[71.13,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-71.13,0],[0,71.13],[71.13,0],[0,-71.13],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":97,"s":[{"v":[[0.04,-128.8],[-128.8,-0.04],[-0.04,128.8],[128.8,0.04],[0.04,-128.8],[0.04,-128.8],[0.04,-128.8],[0.04,-128.8],[0.04,-128.8],[0.04,-128.8],[0.04,-128.8]],"i":[[0,0],[0.02,-71.13],[-71.13,-0.02],[-0.02,71.13],[71.13,0.02],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-71.13,-0.02],[-0.02,71.13],[71.13,0.02],[0.02,-71.13],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}],"h":1},{"t":98,"s":[{"v":[[0.05,-128.8],[-128.8,-0.11],[-0.17,128.8],[128.8,0.23],[0.29,-128.8],[0.05,-128.8],[0.05,-128.8],[0.05,-128.8],[0.05,-128.8],[0.05,-128.8],[0.05,-128.8]],"i":[[0,0],[0.06,-71.11],[-71.11,-0.09],[-0.13,71.11],[71.11,0.16],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-71.11,-0.03],[-0.06,71.11],[71.11,0.09],[0.13,-71.11],[0,0],[0.25,0],[0.25,0],[0.25,0],[0.25,0],[0.25,0],[0.25,0]]}],"h":1},{"t":99,"s":[{"v":[[0.2,-128.8],[-128.8,-0.4],[-0.61,128.8],[128.8,0.81],[1.01,-128.8],[0.2,-128.8],[0.2,-128.8],[0.2,-128.8],[0.2,-128.8],[0.2,-128.8],[0.2,-128.8]],"i":[[0,0],[0.22,-71.05],[-71.05,-0.33],[-0.45,71.05],[71.05,0.56],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-71.05,-0.11],[-0.22,71.05],[71.05,0.33],[0.45,-71.05],[0,0],[0.81,0],[0.81,0],[0.81,0],[0.81,0],[0.81,0],[0.81,0]]}],"h":1},{"t":100,"s":[{"v":[[2.61,-139.98],[2.61,-139.98],[2.61,-139.98],[2.61,-139.98],[2.61,-139.98],[2.61,-139.98],[2.61,-139.98],[2.61,-139.98],[2.61,-139.98],[2.61,-139.98],[2.61,-139.98]],"i":[[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]]}],"h":1},{"t":101,"s":[{"v":[[5.08,-139.91],[5.08,-139.91],[5.08,-139.91],[5.08,-139.91],[5.08,-139.91],[5.08,-139.91],[5.08,-139.91],[5.08,-139.91],[5.08,-139.91],[5.08,-139.91],[5.08,-139.91]],"i":[[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]]}],"h":1},{"t":102,"s":[{"v":[[8.79,-139.72],[8.79,-139.72],[8.79,-139.72],[8.79,-139.72],[8.79,-139.72],[8.79,-139.72],[8.79,-139.72],[8.79,-139.72],[8.79,-139.72],[8.79,-139.72],[8.79,-139.72]],"i":[[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]]}],"h":1},{"t":103,"s":[{"v":[[13.95,-139.3],[13.95,-139.3],[13.95,-139.3],[13.95,-139.3],[13.95,-139.3],[13.95,-139.3],[13.95,-139.3],[13.95,-139.3],[13.95,-139.3],[13.95,-139.3],[13.95,-139.3]],"i":[[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]]}],"h":1},{"t":104,"s":[{"v":[[20.77,-138.45],[20.77,-138.45],[20.77,-138.45],[20.77,-138.45],[20.77,-138.45],[20.77,-138.45],[20.77,-138.45],[20.77,-138.45],[20.77,-138.45],[20.77,-138.45],[20.77,-138.45]],"i":[[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]]}],"h":1},{"t":105,"s":[{"v":[[29.47,-136.86],[29.47,-136.86],[29.47,-136.86],[29.47,-136.86],[29.47,-136.86],[29.47,-136.86],[29.47,-136.86],[29.47,-136.86],[29.47,-136.86],[29.47,-136.86],[29.47,-136.86]],"i":[[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]]}],"h":1},{"t":106,"s":[{"v":[[40.16,-134.12],[40.16,-134.12],[40.16,-134.12],[40.16,-134.12],[40.16,-134.12],[40.16,-134.12],[40.16,-134.12],[40.16,-134.12],[40.16,-134.12],[40.16,-134.12],[40.16,-134.12]],"i":[[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]]}],"h":1},{"t":107,"s":[{"v":[[52.85,-129.64],[52.85,-129.64],[52.85,-129.64],[52.85,-129.64],[52.85,-129.64],[52.85,-129.64],[52.85,-129.64],[52.85,-129.64],[52.85,-129.64],[52.85,-129.64],[52.85,-129.64]],"i":[[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]]}],"h":1},{"t":108,"s":[{"v":[[67.45,-122.68],[67.45,-122.68],[67.45,-122.68],[67.45,-122.68],[67.45,-122.68],[67.45,-122.68],[67.45,-122.68],[67.45,-122.68],[67.45,-122.68],[67.45,-122.68],[67.45,-122.68]],"i":[[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]]}],"h":1},{"t":109,"s":[{"v":[[83.51,-112.37],[83.51,-112.37],[83.51,-112.37],[83.51,-112.37],[83.51,-112.37],[83.51,-112.37],[83.51,-112.37],[83.51,-112.37],[83.51,-112.37],[83.51,-112.37],[83.51,-112.37]],"i":[[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]]}],"h":1},{"t":110,"s":[{"v":[[100.25,-97.73],[100.25,-97.73],[100.25,-97.73],[100.25,-97.73],[100.25,-97.73],[100.25,-97.73],[100.25,-97.73],[100.25,-97.73],[100.25,-97.73],[100.25,-97.73],[100.25,-97.73]],"i":[[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]]}],"h":1},{"t":111,"s":[{"v":[[116.41,-77.78],[116.41,-77.78],[116.41,-77.78],[116.41,-77.78],[116.41,-77.78],[116.41,-77.78],[116.41,-77.78],[116.41,-77.78],[116.41,-77.78],[116.41,-77.78],[116.41,-77.78]],"i":[[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]]}],"h":1},{"t":112,"s":[{"v":[[130.05,-51.83],[130.05,-51.83],[130.05,-51.83],[130.05,-51.83],[130.05,-51.83],[130.05,-51.83],[130.05,-51.83],[130.05,-51.83],[130.05,-51.83],[130.05,-51.83],[130.05,-51.83]],"i":[[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]]}],"h":1},{"t":113,"s":[{"v":[[138.6,-19.77],[138.6,-19.77],[138.6,-19.77],[138.6,-19.77],[138.6,-19.77],[138.6,-19.77],[138.6,-19.77],[138.6,-19.77],[138.6,-19.77],[138.6,-19.77],[138.6,-19.77]],"i":[[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]]}],"h":1},{"t":114,"s":[{"v":[[138.9,17.55],[138.9,17.55],[138.9,17.55],[138.9,17.55],[138.9,17.55],[138.9,17.55],[138.9,17.55],[138.9,17.55],[138.9,17.55],[138.9,17.55],[138.9,17.55]],"i":[[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]]}],"h":1},{"t":115,"s":[{"v":[[127.58,57.66],[127.58,57.66],[127.58,57.66],[127.58,57.66],[127.58,57.66],[127.58,57.66],[127.58,57.66],[127.58,57.66],[127.58,57.66],[127.58,57.66],[127.58,57.66]],"i":[[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]]}],"h":1},{"t":116,"s":[{"v":[[101.84,96.07],[101.84,96.07],[101.84,96.07],[101.84,96.07],[101.84,96.07],[101.84,96.07],[101.84,96.07],[101.84,96.07],[101.84,96.07],[101.84,96.07],[101.84,96.07]],"i":[[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]]}],"h":1},{"t":117,"s":[{"v":[[60.6,126.2],[60.6,126.2],[60.6,126.2],[60.6,126.2],[60.6,126.2],[60.6,126.2],[60.6,126.2],[60.6,126.2],[60.6,126.2],[60.6,126.2],[60.6,126.2]],"i":[[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]]}],"h":1},{"t":118,"s":[{"v":[[6.18,139.86],[6.18,139.86],[6.18,139.86],[6.18,139.86],[6.18,139.86],[6.18,139.86],[6.18,139.86],[6.18,139.86],[6.18,139.86],[6.18,139.86],[6.18,139.86]],"i":[[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]]}],"h":1},{"t":119,"s":[{"v":[[-54.21,129.08],[-54.21,129.08],[-54.21,129.08],[-54.21,129.08],[-54.21,129.08],[-54.21,129.08],[-54.21,129.08],[-54.21,129.08],[-54.21,129.08],[-54.21,129.08],[-54.21,129.08]],"i":[[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]]}],"h":1},{"t":120,"s":[{"v":[[-107.87,89.24],[-107.87,89.24],[-107.87,89.24],[-107.87,89.24],[-107.87,89.24],[-107.87,89.24],[-107.87,89.24],[-107.87,89.24],[-107.87,89.24],[-107.87,89.24],[-107.87,89.24]],"i":[[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]]}],"h":1},{"t":121,"s":[{"v":[[-138.05,23.3],[-138.05,23.3],[-138.05,23.3],[-138.05,23.3],[-138.05,23.3],[-138.05,23.3],[-138.05,23.3],[-138.05,23.3],[-138.05,23.3],[-138.05,23.3],[-138.05,23.3]],"i":[[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]]}],"h":1},{"t":122,"s":[{"v":[[-128.94,-54.54],[-128.94,-54.54],[-128.94,-54.54],[-128.94,-54.54],[-128.94,-54.54],[-128.94,-54.54],[-128.94,-54.54],[-128.94,-54.54],[-128.94,-54.54],[-128.94,-54.54],[-128.94,-54.54]],"i":[[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]]}],"h":1},{"t":123,"s":[{"v":[[-74.09,-118.79],[-74.09,-118.79],[-74.09,-118.79],[-74.09,-118.79],[-74.09,-118.79],[-74.09,-118.79],[-74.09,-118.79],[-74.09,-118.79],[-74.09,-118.79],[-74.09,-118.79],[-74.09,-118.79]],"i":[[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]]}],"h":1},{"t":124,"s":[{"v":[[14.32,-139.27],[14.32,-139.27],[14.32,-139.27],[14.32,-139.27],[14.32,-139.27],[14.32,-139.27],[14.32,-139.27],[14.32,-139.27],[14.32,-139.27],[14.32,-139.27],[14.32,-139.27]],"i":[[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]]}],"h":1},{"t":125,"s":[{"v":[[101.52,-96.41],[101.52,-96.41],[101.52,-96.41],[101.52,-96.41],[101.52,-96.41],[101.52,-96.41],[101.52,-96.41],[101.52,-96.41],[101.52,-96.41],[101.52,-96.41],[101.52,-96.41]],"i":[[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]]}],"h":1},{"t":126,"s":[{"v":[[140,0],[140,0],[140,0],[140,0],[140,0],[140,0],[140,0],[140,0],[140,0],[140,0],[140,0]],"i":[[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]]}],"h":1}]}},{"ty":"gf","hd":false,"bm":0,"e":{"a":0,"k":[140,0]},"g":{"p":3,"k":{"a":0,"k":[0,0.97,0.77,0.63,0.49,0.92,0.68,0.78,1,0.88,0.61,0.91,0,1,0.49,1,1,1]}},"t":1,"a":{"a":0,"k":0},"h":{"a":0,"k":0},"o":{"a":0,"k":100},"r":1,"s":{"a":0,"k":[-140,0]}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]}]},{"id":"hkNLTi0l45YuREyb8CHPb","layers":[]},{"id":"1GgzJloKZ5FArLgzY-xHu","layers":[{"ddd":0,"ind":8,"ty":4,"nm":"","ln":"LM8zQfJDxZS-UAa5GEA3z8","sr":1,"ks":{"a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[49909,49926.12]},"r":{"a":0,"k":0},"s":{"a":0,"k":[1155.5266666666666,1158.872988235294]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":157,"st":0,"bm":0,"shapes":[{"ty":"gr","nm":"surface1","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[3.81,0],[0,-3.83],[0,0],[-0.1,-0.11],[-0.15,0],[0,0],[-0.1,0.1],[0,0.15],[0,0],[-0.3,0],[0,0],[0,-0.31],[0,0],[-0.11,-0.11],[-0.14,0],[0,0],[-0.1,0.1],[0,0.15],[0,0],[-0.94,0.55],[-0.94,-0.55],[0,-1.09],[0,0],[-0.3,0],[0,0],[0,0.31]],"o":[[0,-3.83],[-3.81,0],[0,0],[0,0.15],[0.1,0.1],[0,0],[0.14,0],[0.11,-0.11],[0,0],[0,-0.31],[0,0],[0.3,0],[0,0],[0,0.15],[0.1,0.1],[0,0],[0.15,0],[0.11,-0.11],[0,0],[0,-1.09],[0.94,-0.55],[0.94,0.55],[0,0],[0,0.31],[0,0],[0.3,0],[0,0]],"v":[[15.21,7.28],[8.32,0.34],[1.27,7.28],[1.27,11.61],[1.43,12],[1.82,12.16],[2.61,12.16],[3,12],[3.16,11.61],[3.16,8.01],[3.71,7.46],[4.83,7.46],[5.38,8.01],[5.38,11.61],[5.54,12],[5.93,12.16],[6.71,12.16],[7.1,12],[7.26,11.61],[7.26,10.52],[8.78,7.87],[11.82,7.87],[13.34,10.52],[13.34,11.61],[13.89,12.16],[14.67,12.16],[15.22,11.61]]}}},{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.17,-0.1],[0.32,0.11],[0.04,0.02],[0,0.41],[-0.36,0.2],[-0.05,0.01],[-0.31,-0.3],[0,-0.3],[0.11,-0.17]],"o":[[-0.1,0.17],[-0.29,0.17],[-0.05,-0.01],[-0.36,-0.2],[0,-0.41],[0.04,-0.03],[0.41,-0.15],[0.22,0.21],[0,0.2],[0,0]],"v":[[5.24,5.8],[4.83,6.21],[3.87,6.29],[3.74,6.23],[3.15,5.23],[3.74,4.23],[3.88,4.18],[5.06,4.44],[5.4,5.23],[5.24,5.8]]}}},{"ty":"fl","c":{"a":0,"k":[0.99,0.99,0.99,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[3.81,0],[0,-3.83],[0,0],[-0.1,-0.11],[-0.15,0],[0,0],[-0.1,0.1],[0,0.15],[0,0],[-0.3,0],[0,0],[0,-0.31],[0,0],[-0.11,-0.11],[-0.14,0],[0,0],[-0.1,0.1],[0,0.15],[0,0],[-0.94,0.55],[-0.94,-0.55],[0,-1.09],[0,0],[-0.3,0],[0,0],[0,0.31]],"o":[[0,-3.83],[-3.81,0],[0,0],[0,0.15],[0.1,0.1],[0,0],[0.14,0],[0.11,-0.11],[0,0],[0,-0.31],[0,0],[0.3,0],[0,0],[0,0.15],[0.1,0.1],[0,0],[0.15,0],[0.11,-0.11],[0,0],[0,-1.09],[0.94,-0.55],[0.94,0.55],[0,0],[0,0.31],[0,0],[0.3,0],[0,0]],"v":[[14.6,7.28],[7.71,0.34],[0.66,7.28],[0.66,11.61],[0.82,12],[1.21,12.16],[2,12.16],[2.38,12],[2.55,11.61],[2.55,8.01],[3.09,7.46],[4.21,7.46],[4.77,8.01],[4.77,11.61],[4.93,12],[5.31,12.16],[6.1,12.16],[6.49,12],[6.65,11.61],[6.65,10.52],[8.17,7.87],[11.21,7.87],[12.73,10.52],[12.73,11.61],[13.28,12.16],[14.05,12.16],[14.61,11.61]]}}},{"ty":"sh","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.17,-0.1],[0.32,0.11],[0.04,0.02],[0,0.41],[-0.36,0.2],[-0.05,0.01],[-0.31,-0.3],[0,-0.3],[0.11,-0.17]],"o":[[-0.1,0.17],[-0.29,0.17],[-0.05,-0.01],[-0.36,-0.2],[0,-0.41],[0.04,-0.03],[0.41,-0.15],[0.22,0.21],[0,0.2],[0,0]],"v":[[4.63,5.8],[4.22,6.21],[3.26,6.29],[3.13,6.23],[2.54,5.23],[3.13,4.23],[3.27,4.18],[4.45,4.44],[4.79,5.23],[4.63,5.8]]}}},{"ty":"fl","c":{"a":0,"k":[0.86,0.86,0.86,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}]}]}]},{"id":"dyN8tSSNzvO2wX5_Dtjla","layers":[{"ddd":0,"ind":10,"ty":4,"nm":"","ln":"_GIj9ZeA7rwWCuRAnwK0b10","sr":1,"ks":{"a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[50000,50000]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":157,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"bm":0,"it":[{"ty":"rc","hd":false,"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[182,147.76]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0,0,0]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]}]},{"id":"cHVRDk8IVgVTI7H-xrQ5X","layers":[{"ddd":0,"ind":9,"ty":0,"nm":"","td":1,"ln":"precomp_ZtOb0OCgqiQQYswd_bYsZ9","sr":1,"ks":{"a":{"a":0,"k":[50000,50000]},"o":{"a":0,"k":100},"p":{"a":0,"k":[50000,50000]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"w":100000,"h":100000,"ip":0,"op":157,"st":0,"bm":0,"refId":"dyN8tSSNzvO2wX5_Dtjla"},{"ddd":0,"ind":7,"ty":0,"nm":"","tt":1,"ln":"precomp_5oZ83-FT3oshDyBMTbHvB7","sr":1,"ks":{"a":{"a":0,"k":[100000,100000]},"o":{"a":0,"k":100},"p":{"a":0,"k":[100000,100000]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"w":100000,"h":100000,"ip":0,"op":157,"st":0,"bm":0,"refId":"1GgzJloKZ5FArLgzY-xHu"}]},{"id":"XsSIV0z0ZSNYl1T_eIymc","layers":[]},{"id":"VuiL0lwCg13eB6LBe74VD","layers":[{"ddd":0,"ind":5,"ty":0,"nm":"","ln":"precomp_axBdqkXukWmZZtt1lLTYO5","sr":1,"ks":{"a":{"a":0,"k":[50000,50000]},"o":{"a":0,"k":100},"p":{"a":0,"k":[50000,50000]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"w":100000,"h":100000,"ip":0,"op":157,"st":0,"bm":0,"refId":"hkNLTi0l45YuREyb8CHPb"},{"ddd":0,"ind":6,"ty":0,"nm":"","ln":"precomp_5oZ83-FT3oshDyBMTbHvB6","sr":1,"ks":{"a":{"a":0,"k":[50000,50000]},"o":{"a":0,"k":100},"p":{"a":0,"k":[50000,50000]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"w":100000,"h":100000,"ip":0,"op":157,"st":0,"bm":0,"refId":"cHVRDk8IVgVTI7H-xrQ5X"},{"ddd":0,"ind":11,"ty":0,"nm":"","ln":"precomp_la5YlE_GV_4BPZbinraQb11","sr":1,"ks":{"a":{"a":0,"k":[50000,50000]},"o":{"a":0,"k":100},"p":{"a":0,"k":[50000,50000]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"w":100000,"h":100000,"ip":0,"op":157,"st":0,"bm":0,"refId":"XsSIV0z0ZSNYl1T_eIymc"}]},{"id":"-c2Xn1AzRrKvkPfONMGjS","layers":[]},{"id":"bFwLslNtClblskRaDTJ47","layers":[]},{"id":"VurtnAUi2i84HIyFiKf0R","layers":[{"ddd":0,"ind":2,"ty":0,"nm":"","ln":"precomp_19:2262","sr":1,"ks":{"a":{"a":0,"k":[50000,50000]},"o":{"a":0,"k":100},"p":{"a":0,"k":[50000,50000]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"w":100000,"h":100000,"ip":0,"op":157,"st":0,"bm":0,"refId":"Qe0HNtHmMoBZnWq8BH9Mt"},{"ddd":0,"ind":4,"ty":0,"nm":"","ln":"precomp_62:864","sr":1,"ks":{"a":{"a":0,"k":[50000,50000]},"o":{"a":0,"k":100},"p":{"a":0,"k":[49997,49986]},"r":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":0,"s":[-15],"i":{"x":0.25,"y":1},"o":{"x":0.25,"y":0.1}},{"t":45,"s":[0],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"h":1},{"t":0,"s":[0,0],"i":{"x":0.68,"y":1},"o":{"x":0.33,"y":1}},{"t":45,"s":[100,100],"h":1}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"w":100000,"h":100000,"ip":0,"op":157,"st":0,"bm":0,"refId":"VuiL0lwCg13eB6LBe74VD"},{"ddd":0,"ind":12,"ty":0,"nm":"","ln":"precomp_iOD4psOXBXQeK5pSsY_7E12","sr":1,"ks":{"a":{"a":0,"k":[50000,50000]},"o":{"a":0,"k":100},"p":{"a":0,"k":[50000,50000]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"w":100000,"h":100000,"ip":0,"op":157,"st":0,"bm":0,"refId":"-c2Xn1AzRrKvkPfONMGjS"},{"ddd":0,"ind":13,"ty":0,"nm":"","ln":"precomp_Z6TzdKXLEm4izCTbzf9_H13","sr":1,"ks":{"a":{"a":0,"k":[50000,50000]},"o":{"a":0,"k":100},"p":{"a":0,"k":[50000,50000]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"w":100000,"h":100000,"ip":0,"op":157,"st":0,"bm":0,"refId":"bFwLslNtClblskRaDTJ47"}]},{"id":"nVfSuOBGnEIT-28K-U4PB","layers":[]},{"id":"agFvKdbZlin7heACCH5oS","layers":[]},{"id":"6Th_lJJtxwVWXUGkxtS3J","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"","ln":"precomp_Zche5tnE1","sr":1,"ks":{"a":{"a":0,"k":[50000,50000]},"o":{"a":0,"k":100},"p":{"a":0,"k":[50000,50000]},"r":{"a":0,"k":0},"s":{"a":1,"k":[{"t":0,"s":[100,100],"h":1},{"t":102,"s":[100,100],"i":{"x":0.67,"y":0},"o":{"x":0.32,"y":0}},{"t":132,"s":[0,0],"h":1}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"w":100000,"h":100000,"ip":0,"op":157,"st":0,"bm":0,"refId":"VurtnAUi2i84HIyFiKf0R"},{"ddd":0,"ind":14,"ty":0,"nm":"","ln":"precomp_xSOdPSa5U7L0QXvotJz_N14","sr":1,"ks":{"a":{"a":0,"k":[50000,50000]},"o":{"a":0,"k":100},"p":{"a":0,"k":[50000,50000]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"w":100000,"h":100000,"ip":0,"op":157,"st":0,"bm":0,"refId":"nVfSuOBGnEIT-28K-U4PB"},{"ddd":0,"ind":15,"ty":0,"nm":"","ln":"precomp_EUwLytwoOE93GiW7MQYMh15","sr":1,"ks":{"a":{"a":0,"k":[50000,50000]},"o":{"a":0,"k":100},"p":{"a":0,"k":[50000,50000]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"w":100000,"h":100000,"ip":0,"op":157,"st":0,"bm":0,"refId":"agFvKdbZlin7heACCH5oS"}]}],"ddd":0,"fr":60,"h":400,"ip":0,"layers":[{"ddd":0,"ind":0,"ty":0,"nm":"","ln":"precomp_19:2220","sr":1,"ks":{"a":{"a":0,"k":[50000,50000]},"o":{"a":0,"k":100},"p":{"a":0,"k":[200,200]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"w":100000,"h":100000,"ip":0,"op":157,"st":0,"bm":0,"refId":"6Th_lJJtxwVWXUGkxtS3J"}],"meta":{"g":"https://jitter.video"},"nm":"Profile-New-Story-[remix]","op":156,"v":"5.7.4","w":400} \ No newline at end of file diff --git a/src/components/modals/BlockingMessageModal.tsx b/src/components/modals/BlockingMessageModal.tsx index 4cf54ecd..0dc79d23 100644 --- a/src/components/modals/BlockingMessageModal.tsx +++ b/src/components/modals/BlockingMessageModal.tsx @@ -1,3 +1,5 @@ +import Lottie from 'lottie-react'; +import arioLoading from '../../animations/ario-spinner.json'; import BaseModal from './BaseModal'; const BlockingMessageModal = ({ @@ -11,8 +13,14 @@ const BlockingMessageModal = ({ }) => { return ( -
-
+
+
+ {/* */}
{message}
diff --git a/yarn.lock b/yarn.lock index 3cd77864..fb66a23b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7246,6 +7246,18 @@ loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +lottie-react@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/lottie-react/-/lottie-react-2.4.0.tgz#f7249eee2b1deee70457a2d142194fdf2456e4bd" + integrity sha512-pDJGj+AQlnlyHvOHFK7vLdsDcvbuqvwPZdMlJ360wrzGFurXeKPr8SiRCjLf3LrNYKANQtSsh5dz9UYQHuqx4w== + dependencies: + lottie-web "^5.10.2" + +lottie-web@^5.10.2: + version "5.12.2" + resolved "https://registry.yarnpkg.com/lottie-web/-/lottie-web-5.12.2.tgz#579ca9fe6d3fd9e352571edd3c0be162492f68e5" + integrity sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg== + lower-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" From f748bbe604dde9b5d3480d407333878e6e708f3a Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Tue, 7 May 2024 13:34:54 -0400 Subject: [PATCH 19/34] feat(join network): added success dialog, recording of pending gateway info, and display of pending gateway information --- src/components/Button.tsx | 5 +- src/components/WalletProvider.tsx | 3 +- src/components/icons/index.ts | 2 + src/components/icons/success_check.svg | 18 ++++ src/components/modals/StartGatewayModal.tsx | 32 ++++++- src/components/modals/SuccessModal.tsx | 37 ++++++++ src/hooks/useGatewayInfo.ts | 93 +++++++++++++++++++ src/pages/Gateways/Banner.tsx | 42 ++++----- .../wallets/ArConnectWalletConnector.ts | 15 +-- src/store/persistent.ts | 2 + 10 files changed, 203 insertions(+), 46 deletions(-) create mode 100644 src/components/icons/success_check.svg create mode 100644 src/components/modals/SuccessModal.tsx create mode 100644 src/hooks/useGatewayInfo.ts create mode 100644 src/store/persistent.ts diff --git a/src/components/Button.tsx b/src/components/Button.tsx index 3f259a11..460774ed 100644 --- a/src/components/Button.tsx +++ b/src/components/Button.tsx @@ -76,10 +76,7 @@ export const Button = ({ {icon} {text && (
{text} {rightIcon}
diff --git a/src/components/WalletProvider.tsx b/src/components/WalletProvider.tsx index e60a4abf..43d415cb 100644 --- a/src/components/WalletProvider.tsx +++ b/src/components/WalletProvider.tsx @@ -3,6 +3,7 @@ import { ARNS_REGISTRY_ADDRESS } from '@src/constants'; import { useEffectOnce } from '@src/hooks/useEffectOnce'; import { ArConnectWalletConnector } from '@src/services/wallets/ArConnectWalletConnector'; import { useGlobalState } from '@src/store'; +import { KEY_WALLET_TYPE } from '@src/store/persistent'; import { WALLET_TYPES } from '@src/types'; import { mioToIo } from '@src/utils'; import { ArweaveTransactionID } from '@src/utils/ArweaveTransactionId'; @@ -95,7 +96,7 @@ const WalletProvider = ({ children }: { children: ReactElement }) => { }, [arIOReadSDK, setGateway, walletAddress]); const updateIfConnected = async () => { - const walletType = window.localStorage.getItem('walletType'); + const walletType = window.localStorage.getItem(KEY_WALLET_TYPE); try { if (walletType === WALLET_TYPES.ARCONNECT) { diff --git a/src/components/icons/index.ts b/src/components/icons/index.ts index 5015ff05..a85b8f90 100644 --- a/src/components/icons/index.ts +++ b/src/components/icons/index.ts @@ -20,6 +20,7 @@ import OpenDrawerIcon from './open_drawer.svg?react'; import PinkArrowIcon from './pink_arrow.svg?react'; import StakingIcon from './staking.svg?react'; import StartGatewayCubes from './start_gateway_cubes.svg?react'; +import SuccessCheck from './success_check.svg?react'; import ToastCloseIcon from './toast_close.svg?react'; import WalletIcon from './wallet.svg?react'; @@ -45,6 +46,7 @@ export { PinkArrowIcon, StakingIcon, StartGatewayCubes, + SuccessCheck, ToastCloseIcon, WalletIcon, }; diff --git a/src/components/icons/success_check.svg b/src/components/icons/success_check.svg new file mode 100644 index 00000000..26d44cc3 --- /dev/null +++ b/src/components/icons/success_check.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/components/modals/StartGatewayModal.tsx b/src/components/modals/StartGatewayModal.tsx index cbc49826..2afd3e0b 100644 --- a/src/components/modals/StartGatewayModal.tsx +++ b/src/components/modals/StartGatewayModal.tsx @@ -1,6 +1,7 @@ -import { ARWEAVE_TX_REGEX } from '@ar.io/sdk/web'; +import { ARWEAVE_TX_REGEX, JoinNetworkParams } from '@ar.io/sdk/web'; import { FQDN_REGEX } from '@src/constants'; import { useGlobalState } from '@src/store'; +import { KEY_PENDING_JOIN_NETWORK_PARAMS } from '@src/store/persistent'; import { useEffect, useState } from 'react'; import { toast } from 'react-hot-toast'; import Button, { ButtonType } from '../Button'; @@ -8,6 +9,7 @@ import FormRow, { RowType } from '../forms/FormRow'; import FormSwitch from '../forms/FormSwitch'; import BaseModal from './BaseModal'; import BlockingMessageModal from './BlockingMessageModal'; +import SuccessModal from './SuccessModal'; // import { ToastCloseIcon } from '../icons'; const DEFAULT_FORM_STATE = { @@ -53,6 +55,7 @@ const StartGatewayModal = ({ const [showBlockingMessageModal, setShowBlockingMessageModal] = useState(false); + const [showSuccessModal, setShowSuccessModal] = useState(false); useEffect(() => { setFormState((currentState) => { @@ -207,7 +210,7 @@ const StartGatewayModal = ({ if (isFormValid() && arioWriteableSDK) { try { setShowBlockingMessageModal(true); - const { id: txID } = await arioWriteableSDK.joinNetwork({ + const joinNetworkParams: JoinNetworkParams = { // GatewayConnectionSettings protocol: 'https', fqdn: formState.address, @@ -232,8 +235,18 @@ const StartGatewayModal = ({ autoStake: true, qty: parseFloat(formState.stake), - }); - console.log('txID', txID); + }; + + // UNCOMMENT AND COMMENT OUT JOIN NETWORK FOR DEV WORK + // const delay = (ms: number) => new Promise((res) => setTimeout(res, ms)); + // await delay(5000); + const { id: txID } = await arioWriteableSDK.joinNetwork(joinNetworkParams); + console.log('Join Network txID:', txID); + localStorage.setItem( + KEY_PENDING_JOIN_NETWORK_PARAMS, + JSON.stringify(joinNetworkParams), + ); + setShowSuccessModal(true); } catch (e: any) { toast.error(`${e}`); } finally { @@ -284,6 +297,7 @@ const StartGatewayModal = ({
); diff --git a/src/components/modals/SuccessModal.tsx b/src/components/modals/SuccessModal.tsx new file mode 100644 index 00000000..0f300647 --- /dev/null +++ b/src/components/modals/SuccessModal.tsx @@ -0,0 +1,37 @@ +import Button, { ButtonType } from '../Button'; +import { SuccessCheck } from '../icons'; +import BaseModal from './BaseModal'; + +const SuccessModal = ({ + open, + onClose, + title, + bodyText, +}: { + open: boolean; + onClose: () => void; + title: string; + bodyText: string; +}) => { + return ( + +
+
+ +
+
{title}
+
{bodyText}
+
+
+
+
+ ); +}; + +export default SuccessModal; diff --git a/src/hooks/useGatewayInfo.ts b/src/hooks/useGatewayInfo.ts new file mode 100644 index 00000000..f8624c52 --- /dev/null +++ b/src/hooks/useGatewayInfo.ts @@ -0,0 +1,93 @@ +import { JoinNetworkParams } from '@ar.io/sdk'; +import { useGlobalState } from '@src/store'; +import { KEY_PENDING_JOIN_NETWORK_PARAMS } from '@src/store/persistent'; +import { formatWalletAddress, formatWithCommas, mioToIo } from '@src/utils'; +import { useEffect } from 'react'; + +export enum GatewayStatus { + PENDING, + FOUND, + NOT_FOUND, +} + +export const useGatewayInfo = () => { + const gateway = useGlobalState((state) => state.gateway); + const pendingGateway = localStorage.getItem(KEY_PENDING_JOIN_NETWORK_PARAMS); + const walletAddress = useGlobalState((state) => state.walletAddress); + const arIOReadSDK = useGlobalState((state) => state.arIOReadSDK); + const setGateway = useGlobalState((state) => state.setGateway); + + let gatewayInfo: Array<[string, string | number]>; + + useEffect(() => { + if (!gateway && walletAddress && pendingGateway) { + const pollGateway = async () => { + const gateway = await arIOReadSDK.getGateway({ + address: walletAddress.toString(), + }); + setGateway(gateway); + }; + pollGateway(); + + // check every 15 seconds + const intervalId = setInterval(pollGateway, 15000); + + return () => clearInterval(intervalId); + } + }, [arIOReadSDK, gateway, pendingGateway, setGateway, walletAddress]); + + if (gateway) { + if (pendingGateway) { + localStorage.removeItem(KEY_PENDING_JOIN_NETWORK_PARAMS); + } + + gatewayInfo = [ + ['Label', gateway.settings.label], + [ + 'Address', + `${gateway.settings.protocol}://${gateway.settings.fqdn}:${gateway.settings.port}`, + ], + ['Observer Wallet', formatWalletAddress(gateway.observerWallet)], + ['Joined at', gateway.start], + ['Stake (IO)', formatWithCommas(mioToIo(gateway.operatorStake))], + ['Status', gateway.status], + ['Reward Ratio', gateway.settings.delegateRewardShareRatio], + ]; + } else if (pendingGateway) { + const pendingJoinNetworkParams: JoinNetworkParams = + JSON.parse(pendingGateway); + + const { + label, + protocol, + fqdn, + port, + observerWallet, + qty: operatorStake, + delegateRewardShareRatio, + } = pendingJoinNetworkParams; + + gatewayInfo = [ + ['Label', label], + ['Address', `${protocol}://${fqdn}:${port}`], + [ + 'Observer Wallet', + observerWallet ? formatWalletAddress(observerWallet) : '', + ], + ['Joined at', 'PENDING'], + ['Stake (IO)', formatWithCommas(mioToIo(operatorStake))], + ['Status', 'PENDING'], + ['Reward Ratio', delegateRewardShareRatio], + ]; + } else { + gatewayInfo = []; + } + + const gatewayStatus = gateway + ? GatewayStatus.FOUND + : pendingGateway + ? GatewayStatus.PENDING + : GatewayStatus.NOT_FOUND; + + return { gatewayInfo, gatewayStatus }; +}; diff --git a/src/pages/Gateways/Banner.tsx b/src/pages/Gateways/Banner.tsx index 247fed44..38e8cc33 100644 --- a/src/pages/Gateways/Banner.tsx +++ b/src/pages/Gateways/Banner.tsx @@ -7,48 +7,38 @@ import { } from '@src/components/icons'; import ConnectModal from '@src/components/modals/ConnectModal'; import StartGatewayModal from '@src/components/modals/StartGatewayModal'; +import { GatewayStatus, useGatewayInfo } from '@src/hooks/useGatewayInfo'; import { useGlobalState } from '@src/store'; -import { formatWalletAddress, formatWithCommas, mioToIo } from '@src/utils'; import { useState } from 'react'; -const InfoSection = (label: string, value: string) => { +const InfoSection = ({ label, value }: { label: string; value: string }) => { return (
{label}
-
{value}
+
{value}
); }; const Banner = () => { const walletAddress = useGlobalState((state) => state.walletAddress); - const gateway = useGlobalState((state) => state.gateway); const [loginOpen, setLoginOpen] = useState(false); const [startGatewayOpen, setStartGatewayOpen] = useState(false); - const gatewayInfoToDisplay = gateway - ? [ - ['Label', gateway.settings.label], - [ - 'Address', - `${gateway.settings.protocol}://${gateway.settings.fqdn}:${gateway.settings.port}`, - ], - ['Observer Wallet', formatWalletAddress(gateway.observerWallet)], - ['Joined at', gateway.start], - ['Stake (IO)', formatWithCommas(mioToIo(gateway.operatorStake))], - ['Status', gateway.status], - ['Reward Ratio', gateway.settings.delegateRewardShareRatio], - ] - : []; + const { gatewayInfo, gatewayStatus } = useGatewayInfo(); - return gateway ? ( -
+ return gatewayStatus !== GatewayStatus.NOT_FOUND ? ( +
diff --git a/src/services/wallets/ArConnectWalletConnector.ts b/src/services/wallets/ArConnectWalletConnector.ts index d761a512..3412e680 100644 --- a/src/services/wallets/ArConnectWalletConnector.ts +++ b/src/services/wallets/ArConnectWalletConnector.ts @@ -6,6 +6,7 @@ import { ArconnectSigner } from '@ar.io/sdk/web'; import { executeWithTimeout } from '@src/utils'; import { ArweaveTransactionID } from '@src/utils/ArweaveTransactionId'; import { ArweaveWalletConnector, WALLET_TYPES } from '../../types'; +import { KEY_WALLET_TYPE } from '@src/store/persistent'; export const ARCONNECT_WALLET_PERMISSIONS: PermissionType[] = [ 'ACCESS_ADDRESS', @@ -25,14 +26,6 @@ export class ArConnectWalletConnector implements ArweaveWalletConnector { constructor() { this._wallet = window?.arweaveWallet; this.signer = new ArconnectSigner(this._wallet, null as any); - - // { - // signer: async (transaction: Transaction) => { - // const signedTransaction = await this._wallet.sign(transaction); - // Object.assign(transaction, signedTransaction); - // }, - // // type: 'arweave' as SignatureType, - // }; } // The API has been shown to be unreliable, so we call each function with a timeout @@ -60,7 +53,7 @@ export class ArConnectWalletConnector implements ArweaveWalletConnector { return; } // confirm they have the extension installed - localStorage.setItem('walletType', WALLET_TYPES.ARCONNECT); + localStorage.setItem(KEY_WALLET_TYPE, WALLET_TYPES.ARCONNECT); const permissions = await this.safeArconnectApiExecutor( this._wallet?.getPermissions, ); @@ -85,14 +78,14 @@ export class ArConnectWalletConnector implements ArweaveWalletConnector { // TODO: add arweave configs here ) .catch((err) => { - localStorage.removeItem('walletType'); + localStorage.removeItem(KEY_WALLET_TYPE); console.error(err); throw new ArconnectError('User cancelled authentication.'); }); } async disconnect(): Promise { - localStorage.removeItem('walletType'); + localStorage.removeItem(KEY_WALLET_TYPE); return this.safeArconnectApiExecutor(this._wallet?.disconnect); } diff --git a/src/store/persistent.ts b/src/store/persistent.ts new file mode 100644 index 00000000..aec5866f --- /dev/null +++ b/src/store/persistent.ts @@ -0,0 +1,2 @@ +export const KEY_PENDING_JOIN_NETWORK_PARAMS = "pendingJoinNetworkParams"; +export const KEY_WALLET_TYPE = "walletType"; \ No newline at end of file From 03d34af1393072bda80af3a3f2d41896a1a9be29 Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Tue, 7 May 2024 14:50:31 -0400 Subject: [PATCH 20/34] fix: style error notifications using custom toast component --- src/components/WalletProvider.tsx | 5 +++-- src/components/modals/StartGatewayModal.tsx | 21 +++++---------------- src/utils/toast.tsx | 15 +++++++++++++++ 3 files changed, 23 insertions(+), 18 deletions(-) create mode 100644 src/utils/toast.tsx diff --git a/src/components/WalletProvider.tsx b/src/components/WalletProvider.tsx index 43d415cb..17a4f33a 100644 --- a/src/components/WalletProvider.tsx +++ b/src/components/WalletProvider.tsx @@ -7,6 +7,7 @@ import { KEY_WALLET_TYPE } from '@src/store/persistent'; import { WALLET_TYPES } from '@src/types'; import { mioToIo } from '@src/utils'; import { ArweaveTransactionID } from '@src/utils/ArweaveTransactionId'; +import { showErrorToast } from '@src/utils/toast'; import Ar from 'arweave/web/ar'; import { ReactElement, useEffect } from 'react'; @@ -57,7 +58,7 @@ const WalletProvider = ({ children }: { children: ReactElement }) => { setBalances(arBalance, ioBalance); } catch (error) { - // eventEmitter.emit('error', error); + showErrorToast(`${error}`); } }; @@ -106,7 +107,7 @@ const WalletProvider = ({ children }: { children: ReactElement }) => { updateWallet(address, connector); } } catch (error) { - // eventEmitter.emit('error', error); + showErrorToast(`${error}`); } finally { setWalletStateInitialized(true); } diff --git a/src/components/modals/StartGatewayModal.tsx b/src/components/modals/StartGatewayModal.tsx index 2afd3e0b..af23cf8b 100644 --- a/src/components/modals/StartGatewayModal.tsx +++ b/src/components/modals/StartGatewayModal.tsx @@ -2,15 +2,14 @@ import { ARWEAVE_TX_REGEX, JoinNetworkParams } from '@ar.io/sdk/web'; import { FQDN_REGEX } from '@src/constants'; import { useGlobalState } from '@src/store'; import { KEY_PENDING_JOIN_NETWORK_PARAMS } from '@src/store/persistent'; +import { showErrorToast } from '@src/utils/toast'; import { useEffect, useState } from 'react'; -import { toast } from 'react-hot-toast'; import Button, { ButtonType } from '../Button'; import FormRow, { RowType } from '../forms/FormRow'; import FormSwitch from '../forms/FormSwitch'; import BaseModal from './BaseModal'; import BlockingMessageModal from './BlockingMessageModal'; import SuccessModal from './SuccessModal'; -// import { ToastCloseIcon } from '../icons'; const DEFAULT_FORM_STATE = { label: '', @@ -237,10 +236,11 @@ const StartGatewayModal = ({ qty: parseFloat(formState.stake), }; - // UNCOMMENT AND COMMENT OUT JOIN NETWORK FOR DEV WORK + // UNCOMMENT AND COMMENT OUT JOIN NETWORK FOR DEV WORK // const delay = (ms: number) => new Promise((res) => setTimeout(res, ms)); // await delay(5000); - const { id: txID } = await arioWriteableSDK.joinNetwork(joinNetworkParams); + const { id: txID } = + await arioWriteableSDK.joinNetwork(joinNetworkParams); console.log('Join Network txID:', txID); localStorage.setItem( KEY_PENDING_JOIN_NETWORK_PARAMS, @@ -248,7 +248,7 @@ const StartGatewayModal = ({ ); setShowSuccessModal(true); } catch (e: any) { - toast.error(`${e}`); + showErrorToast(`${e}`); } finally { setShowBlockingMessageModal(false); } @@ -297,17 +297,6 @@ const StartGatewayModal = ({ - //
- // ); - // }) - // } active={true} title="Cancel" text="Cancel" diff --git a/src/utils/toast.tsx b/src/utils/toast.tsx new file mode 100644 index 00000000..98cae1ed --- /dev/null +++ b/src/utils/toast.tsx @@ -0,0 +1,15 @@ +import { ToastCloseIcon } from '@src/components/icons'; +import toast from 'react-hot-toast'; + +export const showErrorToast = (message: string) => { + toast.custom((t) => { + return ( +
+
{message}
+ +
+ ); + }); +}; From 6a0992032e4f0cab52cd543bd2bb10584973c89b Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Tue, 7 May 2024 16:38:44 -0400 Subject: [PATCH 21/34] chore: store pending data cache by wallet address to account for changing wallets --- src/components/modals/StartGatewayModal.tsx | 12 ++++--- src/hooks/useGatewayInfo.ts | 33 +++++++++++------- src/store/persistent.ts | 37 +++++++++++++++++++-- 3 files changed, 63 insertions(+), 19 deletions(-) diff --git a/src/components/modals/StartGatewayModal.tsx b/src/components/modals/StartGatewayModal.tsx index af23cf8b..bb753488 100644 --- a/src/components/modals/StartGatewayModal.tsx +++ b/src/components/modals/StartGatewayModal.tsx @@ -1,7 +1,7 @@ import { ARWEAVE_TX_REGEX, JoinNetworkParams } from '@ar.io/sdk/web'; import { FQDN_REGEX } from '@src/constants'; import { useGlobalState } from '@src/store'; -import { KEY_PENDING_JOIN_NETWORK_PARAMS } from '@src/store/persistent'; +import { updatePendingDataCache } from '@src/store/persistent'; import { showErrorToast } from '@src/utils/toast'; import { useEffect, useState } from 'react'; import Button, { ButtonType } from '../Button'; @@ -242,10 +242,12 @@ const StartGatewayModal = ({ const { id: txID } = await arioWriteableSDK.joinNetwork(joinNetworkParams); console.log('Join Network txID:', txID); - localStorage.setItem( - KEY_PENDING_JOIN_NETWORK_PARAMS, - JSON.stringify(joinNetworkParams), - ); + + if (walletAddress) { + updatePendingDataCache(walletAddress?.toString(), { + pendingJoinNetworkParams: joinNetworkParams, + }); + } setShowSuccessModal(true); } catch (e: any) { showErrorToast(`${e}`); diff --git a/src/hooks/useGatewayInfo.ts b/src/hooks/useGatewayInfo.ts index f8624c52..10cd196a 100644 --- a/src/hooks/useGatewayInfo.ts +++ b/src/hooks/useGatewayInfo.ts @@ -1,6 +1,8 @@ -import { JoinNetworkParams } from '@ar.io/sdk'; import { useGlobalState } from '@src/store'; -import { KEY_PENDING_JOIN_NETWORK_PARAMS } from '@src/store/persistent'; +import { + getPendingDataCache, + storePendingDataCache, +} from '@src/store/persistent'; import { formatWalletAddress, formatWithCommas, mioToIo } from '@src/utils'; import { useEffect } from 'react'; @@ -12,15 +14,17 @@ export enum GatewayStatus { export const useGatewayInfo = () => { const gateway = useGlobalState((state) => state.gateway); - const pendingGateway = localStorage.getItem(KEY_PENDING_JOIN_NETWORK_PARAMS); const walletAddress = useGlobalState((state) => state.walletAddress); + const pendingDataCache = getPendingDataCache(walletAddress?.toString()); + const pendingJoinNetworkParams = pendingDataCache.pendingJoinNetworkParams; + const arIOReadSDK = useGlobalState((state) => state.arIOReadSDK); const setGateway = useGlobalState((state) => state.setGateway); let gatewayInfo: Array<[string, string | number]>; useEffect(() => { - if (!gateway && walletAddress && pendingGateway) { + if (!gateway && walletAddress && pendingJoinNetworkParams) { const pollGateway = async () => { const gateway = await arIOReadSDK.getGateway({ address: walletAddress.toString(), @@ -34,11 +38,19 @@ export const useGatewayInfo = () => { return () => clearInterval(intervalId); } - }, [arIOReadSDK, gateway, pendingGateway, setGateway, walletAddress]); + }, [ + arIOReadSDK, + gateway, + pendingJoinNetworkParams, + setGateway, + walletAddress, + ]); if (gateway) { - if (pendingGateway) { - localStorage.removeItem(KEY_PENDING_JOIN_NETWORK_PARAMS); + if (pendingJoinNetworkParams && walletAddress) { + const updated = { ...pendingDataCache }; + delete updated.pendingJoinNetworkParams; + storePendingDataCache(walletAddress.toString(), updated); } gatewayInfo = [ @@ -53,10 +65,7 @@ export const useGatewayInfo = () => { ['Status', gateway.status], ['Reward Ratio', gateway.settings.delegateRewardShareRatio], ]; - } else if (pendingGateway) { - const pendingJoinNetworkParams: JoinNetworkParams = - JSON.parse(pendingGateway); - + } else if (pendingJoinNetworkParams) { const { label, protocol, @@ -85,7 +94,7 @@ export const useGatewayInfo = () => { const gatewayStatus = gateway ? GatewayStatus.FOUND - : pendingGateway + : pendingJoinNetworkParams ? GatewayStatus.PENDING : GatewayStatus.NOT_FOUND; diff --git a/src/store/persistent.ts b/src/store/persistent.ts index aec5866f..d12cdca0 100644 --- a/src/store/persistent.ts +++ b/src/store/persistent.ts @@ -1,2 +1,35 @@ -export const KEY_PENDING_JOIN_NETWORK_PARAMS = "pendingJoinNetworkParams"; -export const KEY_WALLET_TYPE = "walletType"; \ No newline at end of file +import { JoinNetworkParams } from '@ar.io/sdk/web'; + +// KEYS FOR LOCAL STORAGE +export const KEY_WALLET_TYPE = 'walletType'; + +// PENDING DATA CACHE +export interface PendingDataCache { + pendingJoinNetworkParams?: JoinNetworkParams; +} + +export const getPendingDataCache = ( + walletAddress: string | undefined, +): PendingDataCache => { + if (!walletAddress) return {}; + const pendingDataCache = localStorage.getItem(walletAddress); + return pendingDataCache ? JSON.parse(pendingDataCache) : {}; +}; + +export const storePendingDataCache = ( + walletAddress: string, + pendingDataCache: PendingDataCache, +) => { + localStorage.setItem(walletAddress, JSON.stringify(pendingDataCache)); +}; + +export const updatePendingDataCache = ( + walletAddress: string, + pendingDataCache: PendingDataCache, +) => { + const currentPendingDataCache = getPendingDataCache(walletAddress); + storePendingDataCache(walletAddress, { + ...currentPendingDataCache, + ...pendingDataCache, + }); +}; From eaff862c43d1226bdf5c1d1e2160f9009ab96d2f Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Tue, 7 May 2024 16:55:06 -0400 Subject: [PATCH 22/34] fix: initialize arweave instance using environment or default values --- src/constants.ts | 4 ++++ src/store/index.ts | 14 ++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/constants.ts b/src/constants.ts index 7c3a03de..18d13d55 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -9,6 +9,10 @@ export const ARNS_REGISTRY_ADDRESS = new ArweaveTransactionID( ); export const GATEWAY_CONTRACT_URL = `https://viewblock.io/arweave/contract/${ARNS_REGISTRY_ADDRESS.toString()}`; +export const DEFAULT_ARWEAVE_PROTOCOL = process.env.VITE_GATEWAY_PROTOCOL ?? 'https'; +export const DEFAULT_ARWEAVE_HOST = process.env.VITE_GATEWAY_HOST ?? 'ar-io.dev'; +export const DEFAULT_ARWEAVE_PORT = Number(process.env.VITE_GATEWAY_PORT) ?? 443; + export const THEME_TYPES = { LIGHT: 'light', DARK: 'dark', diff --git a/src/store/index.ts b/src/store/index.ts index 3d58f293..feee2116 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -5,7 +5,13 @@ import { EpochDistributionData, Gateway, } from '@ar.io/sdk/web'; -import { ARNS_REGISTRY_ADDRESS, THEME_TYPES } from '@src/constants'; +import { + ARNS_REGISTRY_ADDRESS, + DEFAULT_ARWEAVE_HOST, + DEFAULT_ARWEAVE_PORT, + DEFAULT_ARWEAVE_PROTOCOL, + THEME_TYPES, +} from '@src/constants'; import { ArweaveWalletConnector } from '@src/types'; import { ArweaveTransactionID } from '@src/utils/ArweaveTransactionId'; import Arweave from 'arweave/web'; @@ -47,7 +53,11 @@ export type GlobalStateActions = { export const initialGlobalState: GlobalState = { theme: THEME_TYPES.DARK, - arweave: Arweave.init({}), + arweave: Arweave.init({ + host: DEFAULT_ARWEAVE_HOST, + protocol: DEFAULT_ARWEAVE_PROTOCOL, + port: DEFAULT_ARWEAVE_PORT, + }), arIOReadSDK: ArIO.init({ contractTxId: ARNS_REGISTRY_ADDRESS.toString() }), balances: { ar: 0, From a3911b0baa7722825de0e286ed267a21e7900c49 Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Wed, 8 May 2024 10:55:32 -0400 Subject: [PATCH 23/34] chore: updated @ar.io/sdk to 1.0.6 --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 75f38e02..f2de03ce 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "vis": "yarn vite-bundle-visualizer" }, "dependencies": { - "@ar.io/sdk": "^1.0.5", + "@ar.io/sdk": "^1.0.6", "@fontsource/rubik": "^5.0.19", "@headlessui/react": "^1.7.19", "@radix-ui/react-tooltip": "^1.0.7", diff --git a/yarn.lock b/yarn.lock index fb66a23b..a759c6c9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,17 +25,17 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@ar.io/sdk@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@ar.io/sdk/-/sdk-1.0.5.tgz#3fc74936e7a1345c42e5f8ed6c46cfd3a5eb183f" - integrity sha512-oXIk5iQFIm0Qf0s2O4BXOxtvWQxvwTCBtTYXJokk+m4DsPxakAEMSLE3ko0JAUOU85fNCBGrSV4yqvsaeS3KQg== +"@ar.io/sdk@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@ar.io/sdk/-/sdk-1.0.6.tgz#2491803c717f692a729027f6d7d039a94eac4087" + integrity sha512-0UlfPDKrI9n3813BX7Wtpu1ZMmfXC2ArJJDMzdaHw9s0+2hdLsXTCCpQqNht5jGGd0iccurI1gINL0yo8WE3tA== dependencies: arbundles "0.11.0" arweave "1.14.4" axios "1.4.0" bunyan "^1.8.15" warp-arbundles "^1.0.4" - warp-contracts "1.4.39" + warp-contracts "1.4.43" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2": version "7.24.2" @@ -9722,10 +9722,10 @@ warp-arbundles@^1.0.4: buffer "^6.0.3" warp-isomorphic "^1.0.7" -warp-contracts@1.4.39: - version "1.4.39" - resolved "https://registry.yarnpkg.com/warp-contracts/-/warp-contracts-1.4.39.tgz#b56f4baa61b633c04d8abba65ee5dfca333ffea5" - integrity sha512-Dyk9wjhYceLRSq+U5Ba8h2mTbMPeB1hjdnDhYJP825E7gcc3jGc12GTLynSBqx5eJscOtpGG5Z5SQNxcTOP7/A== +warp-contracts@1.4.43: + version "1.4.43" + resolved "https://registry.yarnpkg.com/warp-contracts/-/warp-contracts-1.4.43.tgz#070023842f11501aa9e4787a267db213505ef3e1" + integrity sha512-72mbYH7opfPoreTOLIWqOqOw8chhvd3iR4cAztaz+JawV7enY3SnpVyAW+erlu+/OoEb2TX2Ap4xNeShdp/paw== dependencies: archiver "^5.3.0" arweave "1.14.4" From d694ee204ae810bfd998d4a48ad2b227dfedb94c Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Wed, 8 May 2024 13:11:28 -0400 Subject: [PATCH 24/34] chore: add vscode settings file with insertFinalNewline enabled --- .vscode/settings.json | 3 +++ src/components/forms/FormSwitch.tsx | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..d5d00188 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "files.insertFinalNewline": true +} diff --git a/src/components/forms/FormSwitch.tsx b/src/components/forms/FormSwitch.tsx index ce1b065c..9160dc68 100644 --- a/src/components/forms/FormSwitch.tsx +++ b/src/components/forms/FormSwitch.tsx @@ -28,4 +28,4 @@ const FormSwitch = ({ ); }; -export default FormSwitch; \ No newline at end of file +export default FormSwitch; From 6f70b7c3ee4aadb99e0ab82027fc998c404dc3a6 Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Wed, 8 May 2024 13:12:53 -0400 Subject: [PATCH 25/34] fix: typo Co-authored-by: Derek Sonnenberg --- src/components/modals/StartGatewayModal.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/modals/StartGatewayModal.tsx b/src/components/modals/StartGatewayModal.tsx index bb753488..b952ec5e 100644 --- a/src/components/modals/StartGatewayModal.tsx +++ b/src/components/modals/StartGatewayModal.tsx @@ -104,7 +104,7 @@ const StartGatewayModal = ({ placeholder: DEFAULT_FORM_STATE.propertiesId, validateProperty: (v: string) => { return v.trim() === '' || !ARWEAVE_TX_REGEX.test(v) - ? 'Preoperties ID is required and must be a valid domain name.' + ? 'Properties ID is required and must be a valid domain name.' : undefined; }, rightComponent: ( From c3789541a05567a9151e52874ec21bbb0bc5f728 Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Wed, 8 May 2024 13:18:50 -0400 Subject: [PATCH 26/34] chore: updated comment to further clarify --- src/components/modals/StartGatewayModal.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/modals/StartGatewayModal.tsx b/src/components/modals/StartGatewayModal.tsx index bb753488..e8de7318 100644 --- a/src/components/modals/StartGatewayModal.tsx +++ b/src/components/modals/StartGatewayModal.tsx @@ -194,7 +194,8 @@ const StartGatewayModal = ({ const isFormValid = () => { return formRowDefs.every((rowDef) => { - // compare against false as it could be undefined + // enabled value can be true, false, or undefined. We shortcircuit and accept the row + // as valid here only if the row definition is explicity set to false. if (rowDef.enabled == false) { return true; } From e1de0851d5e422473e24896b403769810e2e03f4 Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Wed, 8 May 2024 13:22:36 -0400 Subject: [PATCH 27/34] chore: remove unnecessary optional chaining operator --- src/components/modals/StartGatewayModal.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/modals/StartGatewayModal.tsx b/src/components/modals/StartGatewayModal.tsx index ae7aa8db..d8ad535c 100644 --- a/src/components/modals/StartGatewayModal.tsx +++ b/src/components/modals/StartGatewayModal.tsx @@ -245,7 +245,7 @@ const StartGatewayModal = ({ console.log('Join Network txID:', txID); if (walletAddress) { - updatePendingDataCache(walletAddress?.toString(), { + updatePendingDataCache(walletAddress.toString(), { pendingJoinNetworkParams: joinNetworkParams, }); } From 60b6e5ad80a5f18abf9d6b034081fe0e9af0f22f Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Wed, 8 May 2024 13:26:49 -0400 Subject: [PATCH 28/34] chore: removed dead code --- src/components/modals/BlockingMessageModal.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/modals/BlockingMessageModal.tsx b/src/components/modals/BlockingMessageModal.tsx index 0dc79d23..cbda80c3 100644 --- a/src/components/modals/BlockingMessageModal.tsx +++ b/src/components/modals/BlockingMessageModal.tsx @@ -21,7 +21,6 @@ const BlockingMessageModal = ({ width={24} height={24} /> - {/* */}
{message}
From f04239ba36f7ed57982f5438dc9e0520a2c50ef2 Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Wed, 8 May 2024 13:29:11 -0400 Subject: [PATCH 29/34] chore: introduce constant to clarify code --- src/hooks/useGatewayInfo.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/hooks/useGatewayInfo.ts b/src/hooks/useGatewayInfo.ts index 10cd196a..85ffd828 100644 --- a/src/hooks/useGatewayInfo.ts +++ b/src/hooks/useGatewayInfo.ts @@ -12,6 +12,8 @@ export enum GatewayStatus { NOT_FOUND, } +const GATEWAY_POLLING_INTERVAL_MS = 15_000 // 15 seconds + export const useGatewayInfo = () => { const gateway = useGlobalState((state) => state.gateway); const walletAddress = useGlobalState((state) => state.walletAddress); @@ -34,7 +36,7 @@ export const useGatewayInfo = () => { pollGateway(); // check every 15 seconds - const intervalId = setInterval(pollGateway, 15000); + const intervalId = setInterval(pollGateway, GATEWAY_POLLING_INTERVAL_MS); return () => clearInterval(intervalId); } From dc13f4fd259fc95c8878a7f2cfd589a2794260d3 Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Wed, 8 May 2024 13:52:05 -0400 Subject: [PATCH 30/34] chore: introduce constants to clarify code --- src/components/modals/StartGatewayModal.tsx | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/components/modals/StartGatewayModal.tsx b/src/components/modals/StartGatewayModal.tsx index d8ad535c..af9e6726 100644 --- a/src/components/modals/StartGatewayModal.tsx +++ b/src/components/modals/StartGatewayModal.tsx @@ -22,6 +22,11 @@ const DEFAULT_FORM_STATE = { note: '', }; +const DEFAULT_PROTOCOL = 'https'; +const DEFAULT_PORT = 443; +const DEFAULT_DELEGATED_STAKING_REWARD_SHARE_RATIO = 0; +const DEFAULT_DELEGATED_STAKING = 100; + interface FormRowDef { formPropertyName: string; label: string; @@ -139,7 +144,6 @@ const StartGatewayModal = ({ : undefined; }, }, - { formPropertyName: 'delegatedStaking', label: 'Delegated Staking (IO):', @@ -195,7 +199,7 @@ const StartGatewayModal = ({ const isFormValid = () => { return formRowDefs.every((rowDef) => { // enabled value can be true, false, or undefined. We shortcircuit and accept the row - // as valid here only if the row definition is explicity set to false. + // as valid here only if the row definition is explicity set to false. if (rowDef.enabled == false) { return true; } @@ -212,9 +216,9 @@ const StartGatewayModal = ({ setShowBlockingMessageModal(true); const joinNetworkParams: JoinNetworkParams = { // GatewayConnectionSettings - protocol: 'https', + protocol: DEFAULT_PROTOCOL, fqdn: formState.address, - port: 443, + port: DEFAULT_PORT, // GatewayMetadata note: formState.note, @@ -228,10 +232,10 @@ const StartGatewayModal = ({ allowDelegatedStaking: delegatedStakingEnabled, delegateRewardShareRatio: delegatedStakingEnabled ? parseFloat(formState.delegatedStakingShareRatio) - : 0, + : DEFAULT_DELEGATED_STAKING_REWARD_SHARE_RATIO, minDelegatedStake: delegatedStakingEnabled ? parseFloat(formState.delegatedStaking) - : 100, + : DEFAULT_DELEGATED_STAKING, autoStake: true, qty: parseFloat(formState.stake), From 4eefb912dec63babbe22139d9bfc839d0a51c908 Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Wed, 8 May 2024 13:57:26 -0400 Subject: [PATCH 31/34] chore: simplify repeated code --- src/components/forms/FormRow.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/forms/FormRow.tsx b/src/components/forms/FormRow.tsx index 30433872..0f9678c6 100644 --- a/src/components/forms/FormRow.tsx +++ b/src/components/forms/FormRow.tsx @@ -57,10 +57,10 @@ const FormRow = ({
From 39ecbf189d35a1af973c4d4c70231d8935665ad5 Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Wed, 8 May 2024 13:59:40 -0400 Subject: [PATCH 32/34] chore: clarify code using constant object map --- src/components/forms/FormRow.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/forms/FormRow.tsx b/src/components/forms/FormRow.tsx index 0f9678c6..77ff7e18 100644 --- a/src/components/forms/FormRow.tsx +++ b/src/components/forms/FormRow.tsx @@ -8,6 +8,13 @@ export enum RowType { SINGLE, } +const ROUND_STYLES = { + [RowType.TOP]: 'rounded-t-md', + [RowType.BOTTOM]: 'rounded-b-md', + [RowType.SINGLE]: 'rounded-md', + [RowType.MIDDLE]: '', +}; + const FormRow = ({ formPropertyName, formState, @@ -35,14 +42,7 @@ const FormRow = ({ rightComponent?: JSX.Element; validateProperty: (value: string) => string | undefined; }) => { - const roundStyle = - rowType === RowType.TOP - ? 'rounded-t-md' - : rowType === RowType.BOTTOM - ? 'rounded-b-md' - : rowType === RowType.SINGLE - ? 'rounded-md' - : ''; + const roundStyle = ROUND_STYLES[rowType]; const errorMessage = errorMessages[formPropertyName]; const hasError = enabled && errorMessage?.trim().length > 0; From b84aa43904dbb7369e772c87cfc33c4760fafd82 Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Thu, 9 May 2024 10:19:05 -0400 Subject: [PATCH 33/34] chore: add delay to utils --- src/components/modals/StartGatewayModal.tsx | 1 - src/utils/index.ts | 12 +++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/components/modals/StartGatewayModal.tsx b/src/components/modals/StartGatewayModal.tsx index af9e6726..3ab3bcd6 100644 --- a/src/components/modals/StartGatewayModal.tsx +++ b/src/components/modals/StartGatewayModal.tsx @@ -242,7 +242,6 @@ const StartGatewayModal = ({ }; // UNCOMMENT AND COMMENT OUT JOIN NETWORK FOR DEV WORK - // const delay = (ms: number) => new Promise((res) => setTimeout(res, ms)); // await delay(5000); const { id: txID } = await arioWriteableSDK.joinNetwork(joinNetworkParams); diff --git a/src/utils/index.ts b/src/utils/index.ts index 8826ef8b..fa5f4ee5 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,6 +1,8 @@ import { THEME_TYPES } from '../constants'; -const COMMA_NUMBER_FORMAT = new Intl.NumberFormat('en-US', { maximumFractionDigits: 1}); +const COMMA_NUMBER_FORMAT = new Intl.NumberFormat('en-US', { + maximumFractionDigits: 1, +}); // for tailwind css, need the change the root export const applyThemePreference = (theme: string) => { @@ -39,6 +41,10 @@ export function mioToIo(mio: number): number { } /** Format number with commas, with maximum one fraction digit */ -export function formatWithCommas(num:number) { +export function formatWithCommas(num: number) { return COMMA_NUMBER_FORMAT.format(num); -} \ No newline at end of file +} + +/** Utility for simulating delay times. Useful for development work and testing; + * do not use in production code. */ +export const delay = (ms: number) => new Promise((res) => setTimeout(res, ms)); From cdfe25fcdeeb0a1de09be03c79efc7b4fc3ec7ec Mon Sep 17 00:00:00 2001 From: Steven Yi Date: Thu, 9 May 2024 14:34:50 -0400 Subject: [PATCH 34/34] fix: validation error messages --- src/components/modals/StartGatewayModal.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/modals/StartGatewayModal.tsx b/src/components/modals/StartGatewayModal.tsx index 3ab3bcd6..d7b11fc8 100644 --- a/src/components/modals/StartGatewayModal.tsx +++ b/src/components/modals/StartGatewayModal.tsx @@ -98,7 +98,7 @@ const StartGatewayModal = ({ label: '*Observer Wallet:', validateProperty: (v: string) => { return v.trim() === '' || !ARWEAVE_TX_REGEX.test(v) - ? 'Observer Wallet is required and must be a valid domain name.' + ? 'Observer Wallet is required and must be a valid wallet address.' : undefined; }, }, @@ -109,7 +109,7 @@ const StartGatewayModal = ({ placeholder: DEFAULT_FORM_STATE.propertiesId, validateProperty: (v: string) => { return v.trim() === '' || !ARWEAVE_TX_REGEX.test(v) - ? 'Properties ID is required and must be a valid domain name.' + ? 'Properties ID is required and must be a valid Arweave transaction ID.' : undefined; }, rightComponent: (